diff --git a/404.html b/404.html index 055a07e5..420f272f 100644 --- a/404.html +++ b/404.html @@ -6,10 +6,10 @@ 404 | Memoh Documentation - + - + @@ -17,7 +17,7 @@
- + \ No newline at end of file diff --git a/about.html b/about.html index 5cdbf99e..8e1ee00c 100644 --- a/about.html +++ b/about.html @@ -6,21 +6,21 @@ About Memoh | Memoh Documentation - + - + - - - + + + -
Skip to content

About Memoh

What is Memoh?

Memoh is a multi-member, structured long-memory, containerized AI agent system platform. You can create your own AI bots and chat with them via Telegram, Discord, Lark (Feishu), QQ, Matrix, WeCom, WeChat, Email, or Web. Every bot has an independent container and memory system, allowing it to edit files, execute commands, and access the network within its own container — like having its own computer and brain.

Key Features

Multi-Bot Management

Create multiple bots. Humans and bots, or bots with each other, can chat privately, in groups, or collaborate. Build bot teams, or set up accounts for family members to manage daily tasks with bots.

Multi-User & Identity Recognition

Bots can distinguish individual users in group chats, remember each person's context separately, and send direct messages to specific users. Cross-platform identity binding unifies the same person across Telegram, Discord, Lark, and Web.

Containerized Isolation

Each bot runs in its own isolated container (powered by Containerd) with a separate filesystem and network. Bots can freely read/write files and execute commands within their containers without interfering with each other. Supports container snapshots for save/restore, data export/import, and versioning.

Memory Engineering

A deeply engineered memory layer:

  • Automatically extracts key facts from each conversation turn and stores them as structured memories
  • Hybrid retrieval: semantic search (via Qdrant vector database) + keyword retrieval (BM25)
  • Loads the last 24 hours of conversation context by default
  • Automatic memory compaction and rebuild capabilities
  • Multi-language auto-detection

Multi-Platform Support

Unified channel adapter architecture for connecting to multiple messaging platforms:

  • Telegram — Full support with streaming, Markdown, attachments, and replies
  • Discord — Full support
  • Lark (Feishu) — Full support
  • QQ — Full support
  • Matrix — Decentralized messaging protocol support
  • WeCom (WeWork) — Enterprise messaging integration
  • WeChat — Personal messaging via the WeChat AI bot platform
  • Email — Inbound webhook + outbound providers (Mailgun, generic SMTP, Gmail OAuth)
  • Web — Built-in web chat interface with streaming

Agent Capabilities

Bots come with a rich set of built-in tools:

  • Web Search — Configurable search providers (Brave, Bing, Google, Tavily, SearXNG, DuckDuckGo, and more) for real-time information
  • Web Fetch — Retrieve and parse web page content
  • Browser Automation — Use Playwright-powered browser tools for navigation, clicking, form filling, screenshots, PDF export, and rendered page inspection
  • Subagents — Create specialized subagents with independent context, assign skills, and delegate complex tasks in parallel
  • Skills — Define bot personality via IDENTITY.md, SOUL.md, and modular skill files that bots can enable/disable at runtime
  • Container Operations — Read/write files, edit code, and execute commands inside the container
  • Memory Management — Search and manage memories
  • Messaging — Send messages and reactions to specific users or channels
  • Email — Compose and send emails through configured email providers
  • Text-to-Speech — Synthesize spoken audio from text using configurable TTS providers
  • MCP Federation — Access external tools and resources via federated MCP connections
  • Session History — Access and manage conversation session history

Sessions

Each bot maintains sessions — independent conversation threads that preserve context. Sessions come in four types:

  • Chat — Standard user conversations
  • Heartbeat — Periodic autonomous activity sessions
  • Schedule — Cron-triggered task execution sessions
  • Subagent — Delegated task sessions for sub-agents

Users can start a new session at any time using the /new slash command in any channel, which resets the conversation context.

Slash Commands

Bots support a comprehensive set of slash commands that can be used directly in any channel:

  • /help — Show available commands
  • /new — Start a new conversation session
  • /schedule — Manage scheduled tasks
  • /settings — View and update bot settings
  • /model — Switch chat or heartbeat models
  • /usage — View token usage statistics
  • And more — see Slash Commands for the full reference.

Multi-LLM Provider Support

Flexibly switch between a wide range of LLM providers via four client types:

  • OpenAI Responses API, OpenAI Chat Completions API (including compatible services)
  • Anthropic Messages API, Google Generative AI API

Per-bot model assignment for chat, memory, and embedding. Providers support OAuth authentication and automatic model import.

MCP Protocol Support

Full MCP (Model Context Protocol) support via HTTP, SSE, and Stdio to connect external tool services. Built-in tools for container operations, memory search, web search, scheduling, messaging, and more. Each bot can have its own independent MCP connections with OAuth authentication support.

Scheduled Tasks

Configure scheduled tasks using cron expressions to automatically run commands at specified times. Supports max execution count limits and manual triggers.

Memory Compaction

Automatic memory compaction reduces redundancy in the bot's memory pool over time. Configurable compaction ratios and decay windows keep the most relevant memories while optimizing storage and retrieval quality.

Graphical Configuration

Modern web UI (Vue 3 + Tailwind CSS) with real-time streaming chat, tool call visualization, container filesystem browser, and visual configuration for bots, channels, providers, models, MCP, skills, and all other settings. Dark/light theme, i18n. No coding required to set up your own AI bot.

Installation

To get Memoh running:

  • Docker — Recommended. One-click or manual setup with Docker Compose. Includes all services (PostgreSQL, Qdrant, Containerd, server, web) — no extra dependencies on the host.

Published under AGPLv3

- +
Skip to content

About Memoh

What is Memoh?

Memoh is a multi-member, structured long-memory, containerized AI agent system platform. You can create your own AI bots and chat with them via Telegram, Discord, Lark (Feishu), QQ, Matrix, WeCom, WeChat, Email, or Web. Every bot has an independent container and memory system, allowing it to edit files, execute commands, and access the network within its own container — like having its own computer and brain.

Key Features

Multi-Bot Management

Create multiple bots. Humans and bots, or bots with each other, can chat privately, in groups, or collaborate. Build bot teams, or set up accounts for family members to manage daily tasks with bots.

Multi-User & Identity Recognition

Bots can distinguish individual users in group chats, remember each person's context separately, and send direct messages to specific users. Cross-platform identity binding unifies the same person across Telegram, Discord, Lark, and Web.

Containerized Isolation

Each bot runs in its own isolated container (powered by Containerd) with a separate filesystem and network. Bots can freely read/write files and execute commands within their containers without interfering with each other. Supports container snapshots for save/restore, data export/import, and versioning.

Memory Engineering

A deeply engineered memory layer:

  • Automatically extracts key facts from each conversation turn and stores them as structured memories
  • Hybrid retrieval: semantic search (via Qdrant vector database) + keyword retrieval (BM25)
  • Loads the last 24 hours of conversation context by default
  • Automatic memory compaction and rebuild capabilities
  • Multi-language auto-detection

Multi-Platform Support

Unified channel adapter architecture for connecting to multiple messaging platforms:

  • Telegram — Full support with streaming, Markdown, attachments, and replies
  • Discord — Full support
  • Lark (Feishu) — Full support
  • QQ — Full support
  • Matrix — Decentralized messaging protocol support
  • WeCom (WeWork) — Enterprise messaging integration
  • WeChat — Personal messaging via the WeChat AI bot platform
  • Email — Inbound webhook + outbound providers (Mailgun, generic SMTP, Gmail OAuth)
  • Web — Built-in web chat interface with streaming

Agent Capabilities

Bots come with a rich set of built-in tools:

  • Web Search — Configurable search providers (Brave, Bing, Google, Tavily, SearXNG, DuckDuckGo, and more) for real-time information
  • Web Fetch — Retrieve and parse web page content
  • Browser Automation — Use Playwright-powered browser tools for navigation, clicking, form filling, screenshots, PDF export, and rendered page inspection
  • Subagents — Create specialized subagents with independent context, assign skills, and delegate complex tasks in parallel
  • Skills — Define bot personality via IDENTITY.md, SOUL.md, and modular skill files that bots can enable/disable at runtime
  • Container Operations — Read/write files, edit code, and execute commands inside the container
  • Memory Management — Search and manage memories
  • Messaging — Send messages and reactions to specific users or channels
  • Email — Compose and send emails through configured email providers
  • Text-to-Speech — Synthesize spoken audio from text using configurable TTS providers
  • MCP Federation — Access external tools and resources via federated MCP connections
  • Session History — Access and manage conversation session history

Sessions

Each bot maintains sessions — independent conversation threads that preserve context. Sessions come in four types:

  • Chat — Standard user conversations
  • Heartbeat — Periodic autonomous activity sessions
  • Schedule — Cron-triggered task execution sessions
  • Subagent — Delegated task sessions for sub-agents

Users can start a new session at any time using the /new slash command in any channel, which resets the conversation context.

Slash Commands

Bots support a comprehensive set of slash commands that can be used directly in any channel:

  • /help — Show available commands
  • /new — Start a new conversation session
  • /schedule — Manage scheduled tasks
  • /settings — View and update bot settings
  • /model — Switch chat or heartbeat models
  • /usage — View token usage statistics
  • And more — see Slash Commands for the full reference.

Multi-LLM Provider Support

Flexibly switch between a wide range of LLM providers via four client types:

  • OpenAI Responses API, OpenAI Chat Completions API (including compatible services)
  • Anthropic Messages API, Google Generative AI API

Per-bot model assignment for chat, memory, and embedding. Providers support OAuth authentication and automatic model import.

MCP Protocol Support

Full MCP (Model Context Protocol) support via HTTP, SSE, and Stdio to connect external tool services. Built-in tools for container operations, memory search, web search, scheduling, messaging, and more. Each bot can have its own independent MCP connections with OAuth authentication support.

Scheduled Tasks

Configure scheduled tasks using cron expressions to automatically run commands at specified times. Supports max execution count limits and manual triggers.

Memory Compaction

Automatic memory compaction reduces redundancy in the bot's memory pool over time. Configurable compaction ratios and decay windows keep the most relevant memories while optimizing storage and retrieval quality.

Graphical Configuration

Modern web UI (Vue 3 + Tailwind CSS) with real-time streaming chat, tool call visualization, container filesystem browser, and visual configuration for bots, channels, providers, models, MCP, skills, and all other settings. Dark/light theme, i18n. No coding required to set up your own AI bot.

Installation

To get Memoh running:

  • Docker — Recommended. One-click or manual setup with Docker Compose. Includes all services (PostgreSQL, Qdrant, Containerd, server, web) — no extra dependencies on the host.

Published under AGPLv3

+ \ No newline at end of file diff --git a/assets/about.md.BHHsAOtF.js b/assets/about.md.B8mz5B7D.js similarity index 98% rename from assets/about.md.BHHsAOtF.js rename to assets/about.md.B8mz5B7D.js index 289441f5..dd53d5f7 100644 --- a/assets/about.md.BHHsAOtF.js +++ b/assets/about.md.B8mz5B7D.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,ag as i}from"./chunks/framework.CvgP6Fyv.js";const u=JSON.parse('{"title":"About Memoh","description":"","frontmatter":{},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1774787421000}'),n={name:"about.md"};function r(s,e,l,c,d,m){return a(),o("div",null,[...e[0]||(e[0]=[i('

About Memoh

What is Memoh?

Memoh is a multi-member, structured long-memory, containerized AI agent system platform. You can create your own AI bots and chat with them via Telegram, Discord, Lark (Feishu), QQ, Matrix, WeCom, WeChat, Email, or Web. Every bot has an independent container and memory system, allowing it to edit files, execute commands, and access the network within its own container — like having its own computer and brain.

Key Features

Multi-Bot Management

Create multiple bots. Humans and bots, or bots with each other, can chat privately, in groups, or collaborate. Build bot teams, or set up accounts for family members to manage daily tasks with bots.

Multi-User & Identity Recognition

Bots can distinguish individual users in group chats, remember each person's context separately, and send direct messages to specific users. Cross-platform identity binding unifies the same person across Telegram, Discord, Lark, and Web.

Containerized Isolation

Each bot runs in its own isolated container (powered by Containerd) with a separate filesystem and network. Bots can freely read/write files and execute commands within their containers without interfering with each other. Supports container snapshots for save/restore, data export/import, and versioning.

Memory Engineering

A deeply engineered memory layer:

Multi-Platform Support

Unified channel adapter architecture for connecting to multiple messaging platforms:

Agent Capabilities

Bots come with a rich set of built-in tools:

Sessions

Each bot maintains sessions — independent conversation threads that preserve context. Sessions come in four types:

Users can start a new session at any time using the /new slash command in any channel, which resets the conversation context.

Slash Commands

Bots support a comprehensive set of slash commands that can be used directly in any channel:

Multi-LLM Provider Support

Flexibly switch between a wide range of LLM providers via four client types:

Per-bot model assignment for chat, memory, and embedding. Providers support OAuth authentication and automatic model import.

MCP Protocol Support

Full MCP (Model Context Protocol) support via HTTP, SSE, and Stdio to connect external tool services. Built-in tools for container operations, memory search, web search, scheduling, messaging, and more. Each bot can have its own independent MCP connections with OAuth authentication support.

Scheduled Tasks

Configure scheduled tasks using cron expressions to automatically run commands at specified times. Supports max execution count limits and manual triggers.

Memory Compaction

Automatic memory compaction reduces redundancy in the bot's memory pool over time. Configurable compaction ratios and decay windows keep the most relevant memories while optimizing storage and retrieval quality.

Graphical Configuration

Modern web UI (Vue 3 + Tailwind CSS) with real-time streaming chat, tool call visualization, container filesystem browser, and visual configuration for bots, channels, providers, models, MCP, skills, and all other settings. Dark/light theme, i18n. No coding required to set up your own AI bot.

Installation

To get Memoh running:

',41)])])}const p=t(n,[["render",r]]);export{u as __pageData,p as default}; +import{_ as t,o as a,c as o,ag as i}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"About Memoh","description":"","frontmatter":{},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1774787421000}'),n={name:"about.md"};function r(s,e,l,c,d,m){return a(),o("div",null,[...e[0]||(e[0]=[i('

About Memoh

What is Memoh?

Memoh is a multi-member, structured long-memory, containerized AI agent system platform. You can create your own AI bots and chat with them via Telegram, Discord, Lark (Feishu), QQ, Matrix, WeCom, WeChat, Email, or Web. Every bot has an independent container and memory system, allowing it to edit files, execute commands, and access the network within its own container — like having its own computer and brain.

Key Features

Multi-Bot Management

Create multiple bots. Humans and bots, or bots with each other, can chat privately, in groups, or collaborate. Build bot teams, or set up accounts for family members to manage daily tasks with bots.

Multi-User & Identity Recognition

Bots can distinguish individual users in group chats, remember each person's context separately, and send direct messages to specific users. Cross-platform identity binding unifies the same person across Telegram, Discord, Lark, and Web.

Containerized Isolation

Each bot runs in its own isolated container (powered by Containerd) with a separate filesystem and network. Bots can freely read/write files and execute commands within their containers without interfering with each other. Supports container snapshots for save/restore, data export/import, and versioning.

Memory Engineering

A deeply engineered memory layer:

Multi-Platform Support

Unified channel adapter architecture for connecting to multiple messaging platforms:

Agent Capabilities

Bots come with a rich set of built-in tools:

Sessions

Each bot maintains sessions — independent conversation threads that preserve context. Sessions come in four types:

Users can start a new session at any time using the /new slash command in any channel, which resets the conversation context.

Slash Commands

Bots support a comprehensive set of slash commands that can be used directly in any channel:

Multi-LLM Provider Support

Flexibly switch between a wide range of LLM providers via four client types:

Per-bot model assignment for chat, memory, and embedding. Providers support OAuth authentication and automatic model import.

MCP Protocol Support

Full MCP (Model Context Protocol) support via HTTP, SSE, and Stdio to connect external tool services. Built-in tools for container operations, memory search, web search, scheduling, messaging, and more. Each bot can have its own independent MCP connections with OAuth authentication support.

Scheduled Tasks

Configure scheduled tasks using cron expressions to automatically run commands at specified times. Supports max execution count limits and manual triggers.

Memory Compaction

Automatic memory compaction reduces redundancy in the bot's memory pool over time. Configurable compaction ratios and decay windows keep the most relevant memories while optimizing storage and retrieval quality.

Graphical Configuration

Modern web UI (Vue 3 + Tailwind CSS) with real-time streaming chat, tool call visualization, container filesystem browser, and visual configuration for bots, channels, providers, models, MCP, skills, and all other settings. Dark/light theme, i18n. No coding required to set up your own AI bot.

Installation

To get Memoh running:

',41)])])}const p=t(n,[["render",r]]);export{u as __pageData,p as default}; diff --git a/assets/about.md.BHHsAOtF.lean.js b/assets/about.md.B8mz5B7D.lean.js similarity index 68% rename from assets/about.md.BHHsAOtF.lean.js rename to assets/about.md.B8mz5B7D.lean.js index b0981f8c..1e39e5dd 100644 --- a/assets/about.md.BHHsAOtF.lean.js +++ b/assets/about.md.B8mz5B7D.lean.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,ag as i}from"./chunks/framework.CvgP6Fyv.js";const u=JSON.parse('{"title":"About Memoh","description":"","frontmatter":{},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1774787421000}'),n={name:"about.md"};function r(s,e,l,c,d,m){return a(),o("div",null,[...e[0]||(e[0]=[i("",41)])])}const p=t(n,[["render",r]]);export{u as __pageData,p as default}; +import{_ as t,o as a,c as o,ag as i}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"About Memoh","description":"","frontmatter":{},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1774787421000}'),n={name:"about.md"};function r(s,e,l,c,d,m){return a(),o("div",null,[...e[0]||(e[0]=[i("",41)])])}const p=t(n,[["render",r]]);export{u as __pageData,p as default}; diff --git a/assets/app.iFBgJZ5o.js b/assets/app.BlT6MCnF.js similarity index 90% rename from assets/app.iFBgJZ5o.js rename to assets/app.BlT6MCnF.js index ec582283..82bd3203 100644 --- a/assets/app.iFBgJZ5o.js +++ b/assets/app.BlT6MCnF.js @@ -1 +1 @@ -import{t as p}from"./chunks/theme.CrSynxcK.js";import{R as s,a2 as i,a3 as u,a4 as c,a5 as l,a6 as f,a7 as d,a8 as m,a9 as h,aa as g,ab as A,d as v,u as y,v as C,s as P,ac as b,ad as w,ae as R,af as E}from"./chunks/framework.CvgP6Fyv.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{P(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&b(),w(),R(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(S)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp}; +import{t as p}from"./chunks/theme.BY8ac8ik.js";import{R as s,a2 as i,a3 as u,a4 as c,a5 as l,a6 as f,a7 as d,a8 as m,a9 as h,aa as g,ab as A,d as v,u as y,v as C,s as P,ac as b,ad as w,ae as R,af as E}from"./chunks/framework.DXGyWiRo.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{P(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&b(),w(),R(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(S)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp}; diff --git a/assets/blogs_2026-02-16.md.BRb_uymM.js b/assets/blogs_2026-02-16.md.D7X_K9ac.js similarity index 98% rename from assets/blogs_2026-02-16.md.BRb_uymM.js rename to assets/blogs_2026-02-16.md.D7X_K9ac.js index ca668bb9..7f1210bb 100644 --- a/assets/blogs_2026-02-16.md.BRb_uymM.js +++ b/assets/blogs_2026-02-16.md.D7X_K9ac.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.CvgP6Fyv.js";const r="/blogs/2026-02-16/01-multi-bots.png",i="/blogs/2026-02-16/02-containerized.png",s="/blogs/2026-02-16/03-memory-engineering.png",y=JSON.parse('{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","description":"","frontmatter":{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","author":"Team Memoh"},"headers":[],"relativePath":"blogs/2026-02-16.md","filePath":"blogs/2026-02-16.md","lastUpdated":1771238980000}'),l={name:"blogs/2026-02-16.md"};function h(c,e,d,u,m,p){return a(),o("div",null,[...e[0]||(e[0]=[n('

Introduction to Memoh - The Case for an Always-On, Containerized Home Agent

Overview

We enter 2026 with a familiar tension: models get smarter every quarter, but the “agent experience” still breaks on context, latency, privacy, and real-world workflows. Over the past year, we kept circling three questions:

Memoh is our attempt to turn those questions into something buildable—not a manifesto, but a system that can survive contact with reality.

Story Time

Time travels fast. Somewhere between “I’ll remember this” and “wait, why did we decide that?”, a year disappears.

That’s the annoying part of building: most progress doesn’t feel like progress while it’s happening. It’s just a stream of small choices, half-finished threads, late-night fixes, and the occasional moment that actually clicks. The kind of moment where you sit back and think: okay—this is real.

Around the same time, I noticed something else: the internet started to feel smoother—and worse.

Text got cleaner, longer, more polite, more… empty. You could smell when something was generated: low information density, too many metaphors, too much agreement, not enough stakes.

I caught myself doing it too.

So I started forcing a constraint: say it plainly. Keep the density. Don’t inflate. Don’t hide behind style. If something mattered, anchor it to a real moment, a real trade-off, a real cost paid.

Because the thing LLMs can’t give you is not “intelligence.” It’s weight. The feeling that a human actually stood somewhere in time and wrote from that position.

That’s when I realized what I wanted wasn’t “an AI that can talk.” I wanted an AI that can live with you—quietly, continuously, accumulating context without turning your life into content sludge.

Phones were our first instinct—it's personal, powerful, always there. But mobile OS is closed: without OEM privileges you can build an app, not ambient infrastructure.

So we looked for the always-on node every home already has: the router (conceptually). Then the economics clash—router-class hardware can’t carry memory, RAG, tools, and multi-user agents. The device evolves: more RAM/storage, a screen, mic/speaker, tiny battery for take out, portable form.

Eventually it stops being a router. It becomes a new category: a home agent base layer.

What

Memoh is a containerized home/studio AI base layer: cloud-grade model capability paired with local-first memory (knowledge base, RAG/search, conversation history) that stays under your control.

Why

Long-context models raise the ceiling for agents—but they also make “fully local” expensive and “fully cloud” uncomfortable. People don’t want to re-brief AI every day, and they don’t want their durable context trapped in someone else’s feed. Containerization makes Memoh portable, reproducible, and safe to run as always-on infrastructure—so continuity becomes cheap, private, and dependable.

How

We run Memoh as a containerized stack: isolated services for storage (files/DB/vector index), retrieval, tool/runtime execution, and the control plane. Inference calls cloud APIs when you need frontier capability; durable memory and indexing stay local. The device acts as an always-on node (router-like, not a router) serving multiple users with strict boundaries: sharing is explicit, private context remains private, and everything is deployable/upgradable as versioned containers.

Features

Compare to OpenClaw

We share a core belief: both Memoh and OpenClaw treat the agent as more than a chatbox—we give the LLM a playground: a real environment where it can remember, use tools, and iterate.

Where Memoh differs:

Conclusion

Memoh is built for one thing: always-on continuity—an AI that stays online, and a memory that stays yours.

We keep frontier inference in the cloud, keep durable context local, and run everything as a containerized, always-on stack. If you want an agent that feels less like an app and more like home infrastructure, that’s the bet Memoh is making.

Furthermore, we will continue to operate and permanently open-source Memoh, making it a product with long impact.

',33)])])}const f=t(l,[["render",h]]);export{y as __pageData,f as default}; +import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const r="/blogs/2026-02-16/01-multi-bots.png",i="/blogs/2026-02-16/02-containerized.png",s="/blogs/2026-02-16/03-memory-engineering.png",y=JSON.parse('{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","description":"","frontmatter":{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","author":"Team Memoh"},"headers":[],"relativePath":"blogs/2026-02-16.md","filePath":"blogs/2026-02-16.md","lastUpdated":1771238980000}'),l={name:"blogs/2026-02-16.md"};function h(c,e,d,u,m,p){return a(),o("div",null,[...e[0]||(e[0]=[n('

Introduction to Memoh - The Case for an Always-On, Containerized Home Agent

Overview

We enter 2026 with a familiar tension: models get smarter every quarter, but the “agent experience” still breaks on context, latency, privacy, and real-world workflows. Over the past year, we kept circling three questions:

Memoh is our attempt to turn those questions into something buildable—not a manifesto, but a system that can survive contact with reality.

Story Time

Time travels fast. Somewhere between “I’ll remember this” and “wait, why did we decide that?”, a year disappears.

That’s the annoying part of building: most progress doesn’t feel like progress while it’s happening. It’s just a stream of small choices, half-finished threads, late-night fixes, and the occasional moment that actually clicks. The kind of moment where you sit back and think: okay—this is real.

Around the same time, I noticed something else: the internet started to feel smoother—and worse.

Text got cleaner, longer, more polite, more… empty. You could smell when something was generated: low information density, too many metaphors, too much agreement, not enough stakes.

I caught myself doing it too.

So I started forcing a constraint: say it plainly. Keep the density. Don’t inflate. Don’t hide behind style. If something mattered, anchor it to a real moment, a real trade-off, a real cost paid.

Because the thing LLMs can’t give you is not “intelligence.” It’s weight. The feeling that a human actually stood somewhere in time and wrote from that position.

That’s when I realized what I wanted wasn’t “an AI that can talk.” I wanted an AI that can live with you—quietly, continuously, accumulating context without turning your life into content sludge.

Phones were our first instinct—it's personal, powerful, always there. But mobile OS is closed: without OEM privileges you can build an app, not ambient infrastructure.

So we looked for the always-on node every home already has: the router (conceptually). Then the economics clash—router-class hardware can’t carry memory, RAG, tools, and multi-user agents. The device evolves: more RAM/storage, a screen, mic/speaker, tiny battery for take out, portable form.

Eventually it stops being a router. It becomes a new category: a home agent base layer.

What

Memoh is a containerized home/studio AI base layer: cloud-grade model capability paired with local-first memory (knowledge base, RAG/search, conversation history) that stays under your control.

Why

Long-context models raise the ceiling for agents—but they also make “fully local” expensive and “fully cloud” uncomfortable. People don’t want to re-brief AI every day, and they don’t want their durable context trapped in someone else’s feed. Containerization makes Memoh portable, reproducible, and safe to run as always-on infrastructure—so continuity becomes cheap, private, and dependable.

How

We run Memoh as a containerized stack: isolated services for storage (files/DB/vector index), retrieval, tool/runtime execution, and the control plane. Inference calls cloud APIs when you need frontier capability; durable memory and indexing stay local. The device acts as an always-on node (router-like, not a router) serving multiple users with strict boundaries: sharing is explicit, private context remains private, and everything is deployable/upgradable as versioned containers.

Features

Compare to OpenClaw

We share a core belief: both Memoh and OpenClaw treat the agent as more than a chatbox—we give the LLM a playground: a real environment where it can remember, use tools, and iterate.

Where Memoh differs:

Conclusion

Memoh is built for one thing: always-on continuity—an AI that stays online, and a memory that stays yours.

We keep frontier inference in the cloud, keep durable context local, and run everything as a containerized, always-on stack. If you want an agent that feels less like an app and more like home infrastructure, that’s the bet Memoh is making.

Furthermore, we will continue to operate and permanently open-source Memoh, making it a product with long impact.

',33)])])}const f=t(l,[["render",h]]);export{y as __pageData,f as default}; diff --git a/assets/blogs_2026-02-16.md.BRb_uymM.lean.js b/assets/blogs_2026-02-16.md.D7X_K9ac.lean.js similarity index 82% rename from assets/blogs_2026-02-16.md.BRb_uymM.lean.js rename to assets/blogs_2026-02-16.md.D7X_K9ac.lean.js index 78c93bad..7de584c8 100644 --- a/assets/blogs_2026-02-16.md.BRb_uymM.lean.js +++ b/assets/blogs_2026-02-16.md.D7X_K9ac.lean.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.CvgP6Fyv.js";const r="/blogs/2026-02-16/01-multi-bots.png",i="/blogs/2026-02-16/02-containerized.png",s="/blogs/2026-02-16/03-memory-engineering.png",y=JSON.parse('{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","description":"","frontmatter":{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","author":"Team Memoh"},"headers":[],"relativePath":"blogs/2026-02-16.md","filePath":"blogs/2026-02-16.md","lastUpdated":1771238980000}'),l={name:"blogs/2026-02-16.md"};function h(c,e,d,u,m,p){return a(),o("div",null,[...e[0]||(e[0]=[n("",33)])])}const f=t(l,[["render",h]]);export{y as __pageData,f as default}; +import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const r="/blogs/2026-02-16/01-multi-bots.png",i="/blogs/2026-02-16/02-containerized.png",s="/blogs/2026-02-16/03-memory-engineering.png",y=JSON.parse('{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","description":"","frontmatter":{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","author":"Team Memoh"},"headers":[],"relativePath":"blogs/2026-02-16.md","filePath":"blogs/2026-02-16.md","lastUpdated":1771238980000}'),l={name:"blogs/2026-02-16.md"};function h(c,e,d,u,m,p){return a(),o("div",null,[...e[0]||(e[0]=[n("",33)])])}const f=t(l,[["render",h]]);export{y as __pageData,f as default}; diff --git a/assets/blogs_index.md.CWwgVf03.js b/assets/blogs_index.md.CzVqJnkf.js similarity index 82% rename from assets/blogs_index.md.CWwgVf03.js rename to assets/blogs_index.md.CzVqJnkf.js index be7eea87..c1f717cd 100644 --- a/assets/blogs_index.md.CWwgVf03.js +++ b/assets/blogs_index.md.CzVqJnkf.js @@ -1 +1 @@ -import{_ as a,o,c as s,j as e,a as l}from"./chunks/framework.CvgP6Fyv.js";const g=JSON.parse('{"title":"Blogs","description":"","frontmatter":{},"headers":[],"relativePath":"blogs/index.md","filePath":"blogs/index.md","lastUpdated":1771238299000}'),n={name:"blogs/index.md"};function r(i,t,d,c,p,m){return o(),s("div",null,[...t[0]||(t[0]=[e("h1",{id:"blogs",tabindex:"-1"},[l("Blogs "),e("a",{class:"header-anchor",href:"#blogs","aria-label":'Permalink to "Blogs"'},"​")],-1),e("p",null,"This section contains the latest blogs about Memoh.",-1),e("ul",null,[e("li",null,[e("a",{href:"/blogs/2026-02-16.html"},"Introduction (Feb 2026)")])],-1)])])}const h=a(n,[["render",r]]);export{g as __pageData,h as default}; +import{_ as a,o,c as s,j as e,a as l}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Blogs","description":"","frontmatter":{},"headers":[],"relativePath":"blogs/index.md","filePath":"blogs/index.md","lastUpdated":1771238299000}'),n={name:"blogs/index.md"};function r(i,t,d,c,p,m){return o(),s("div",null,[...t[0]||(t[0]=[e("h1",{id:"blogs",tabindex:"-1"},[l("Blogs "),e("a",{class:"header-anchor",href:"#blogs","aria-label":'Permalink to "Blogs"'},"​")],-1),e("p",null,"This section contains the latest blogs about Memoh.",-1),e("ul",null,[e("li",null,[e("a",{href:"/blogs/2026-02-16.html"},"Introduction (Feb 2026)")])],-1)])])}const h=a(n,[["render",r]]);export{g as __pageData,h as default}; diff --git a/assets/blogs_index.md.CWwgVf03.lean.js b/assets/blogs_index.md.CzVqJnkf.lean.js similarity index 82% rename from assets/blogs_index.md.CWwgVf03.lean.js rename to assets/blogs_index.md.CzVqJnkf.lean.js index be7eea87..c1f717cd 100644 --- a/assets/blogs_index.md.CWwgVf03.lean.js +++ b/assets/blogs_index.md.CzVqJnkf.lean.js @@ -1 +1 @@ -import{_ as a,o,c as s,j as e,a as l}from"./chunks/framework.CvgP6Fyv.js";const g=JSON.parse('{"title":"Blogs","description":"","frontmatter":{},"headers":[],"relativePath":"blogs/index.md","filePath":"blogs/index.md","lastUpdated":1771238299000}'),n={name:"blogs/index.md"};function r(i,t,d,c,p,m){return o(),s("div",null,[...t[0]||(t[0]=[e("h1",{id:"blogs",tabindex:"-1"},[l("Blogs "),e("a",{class:"header-anchor",href:"#blogs","aria-label":'Permalink to "Blogs"'},"​")],-1),e("p",null,"This section contains the latest blogs about Memoh.",-1),e("ul",null,[e("li",null,[e("a",{href:"/blogs/2026-02-16.html"},"Introduction (Feb 2026)")])],-1)])])}const h=a(n,[["render",r]]);export{g as __pageData,h as default}; +import{_ as a,o,c as s,j as e,a as l}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Blogs","description":"","frontmatter":{},"headers":[],"relativePath":"blogs/index.md","filePath":"blogs/index.md","lastUpdated":1771238299000}'),n={name:"blogs/index.md"};function r(i,t,d,c,p,m){return o(),s("div",null,[...t[0]||(t[0]=[e("h1",{id:"blogs",tabindex:"-1"},[l("Blogs "),e("a",{class:"header-anchor",href:"#blogs","aria-label":'Permalink to "Blogs"'},"​")],-1),e("p",null,"This section contains the latest blogs about Memoh.",-1),e("ul",null,[e("li",null,[e("a",{href:"/blogs/2026-02-16.html"},"Introduction (Feb 2026)")])],-1)])])}const h=a(n,[["render",r]]);export{g as __pageData,h as default}; diff --git a/assets/channels_discord.md.BmZ6CspE.js b/assets/channels_discord.md.CgnXVcxj.js similarity index 98% rename from assets/channels_discord.md.BmZ6CspE.js rename to assets/channels_discord.md.CgnXVcxj.js index 4e59234a..6c809cb9 100644 --- a/assets/channels_discord.md.BmZ6CspE.js +++ b/assets/channels_discord.md.CgnXVcxj.js @@ -1 +1 @@ -import{_ as t,o,c as r,ag as a}from"./chunks/framework.CvgP6Fyv.js";const g=JSON.parse('{"title":"Discord Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/discord.md","filePath":"channels/discord.md","lastUpdated":1774787421000}'),n={name:"channels/discord.md"};function i(s,e,l,c,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a('

Discord Channel Configuration

Connecting your Memoh Bot to Discord allows it to join servers and interact with community members.

Step 1: Create a Discord Application

  1. Go to the Discord Developer Portal.
  2. Click New Application and give it a name.
  3. In the left sidebar, go to Bot.
  4. Click Reset Token to generate a Bot Token. Copy this token and store it securely.

Step 2: Configure Bot Settings

  1. Scroll down to the Privileged Gateway Intents section.
  2. Enable Message Content Intent, Server Members Intent and Presence Intent.
  3. Save changes.

Step 3: Invite the Bot to Your Server

  1. Go to OAuth2 > URL Generator.
  2. Select scopes: bot, applications.commands.
  3. Select permissions: Send Messages, Read Message History, Embed Links, Attach Files.
  4. Copy the generated URL and open it in your browser.
  5. Select the server you want to add the bot to and authorize it.

Official Guide: Discord Developer Portal - Bots

Step 4: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select Discord.
  3. Paste your Bot Token.
  4. Click Save and Enable.

Features Supported

',13)])])}const u=t(n,[["render",i]]);export{g as __pageData,u as default}; +import{_ as t,o,c as r,ag as a}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Discord Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/discord.md","filePath":"channels/discord.md","lastUpdated":1774787421000}'),n={name:"channels/discord.md"};function i(s,e,l,c,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a('

Discord Channel Configuration

Connecting your Memoh Bot to Discord allows it to join servers and interact with community members.

Step 1: Create a Discord Application

  1. Go to the Discord Developer Portal.
  2. Click New Application and give it a name.
  3. In the left sidebar, go to Bot.
  4. Click Reset Token to generate a Bot Token. Copy this token and store it securely.

Step 2: Configure Bot Settings

  1. Scroll down to the Privileged Gateway Intents section.
  2. Enable Message Content Intent, Server Members Intent and Presence Intent.
  3. Save changes.

Step 3: Invite the Bot to Your Server

  1. Go to OAuth2 > URL Generator.
  2. Select scopes: bot, applications.commands.
  3. Select permissions: Send Messages, Read Message History, Embed Links, Attach Files.
  4. Copy the generated URL and open it in your browser.
  5. Select the server you want to add the bot to and authorize it.

Official Guide: Discord Developer Portal - Bots

Step 4: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select Discord.
  3. Paste your Bot Token.
  4. Click Save and Enable.

Features Supported

',13)])])}const u=t(n,[["render",i]]);export{g as __pageData,u as default}; diff --git a/assets/channels_discord.md.BmZ6CspE.lean.js b/assets/channels_discord.md.CgnXVcxj.lean.js similarity index 85% rename from assets/channels_discord.md.BmZ6CspE.lean.js rename to assets/channels_discord.md.CgnXVcxj.lean.js index 8cdc29fb..9d0b1ece 100644 --- a/assets/channels_discord.md.BmZ6CspE.lean.js +++ b/assets/channels_discord.md.CgnXVcxj.lean.js @@ -1 +1 @@ -import{_ as t,o,c as r,ag as a}from"./chunks/framework.CvgP6Fyv.js";const g=JSON.parse('{"title":"Discord Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/discord.md","filePath":"channels/discord.md","lastUpdated":1774787421000}'),n={name:"channels/discord.md"};function i(s,e,l,c,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a("",13)])])}const u=t(n,[["render",i]]);export{g as __pageData,u as default}; +import{_ as t,o,c as r,ag as a}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Discord Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/discord.md","filePath":"channels/discord.md","lastUpdated":1774787421000}'),n={name:"channels/discord.md"};function i(s,e,l,c,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a("",13)])])}const u=t(n,[["render",i]]);export{g as __pageData,u as default}; diff --git a/assets/channels_feishu.md.wMudSRYw.js b/assets/channels_feishu.md.7xzXC8PR.js similarity index 96% rename from assets/channels_feishu.md.wMudSRYw.js rename to assets/channels_feishu.md.7xzXC8PR.js index 7563b098..229628f1 100644 --- a/assets/channels_feishu.md.wMudSRYw.js +++ b/assets/channels_feishu.md.7xzXC8PR.js @@ -1 +1 @@ -import{_ as o,o as t,c as i,ag as a}from"./chunks/framework.CvgP6Fyv.js";const c=JSON.parse('{"title":"Feishu (Lark) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/feishu.md","filePath":"channels/feishu.md","lastUpdated":1774787421000}'),n={name:"channels/feishu.md"};function s(r,e,l,p,h,g){return t(),i("div",null,[...e[0]||(e[0]=[a('

Feishu (Lark) Channel Configuration

Memoh supports integrating with Feishu (Lark) via the Open Platform. This allows your enterprise bots to interact with users in groups or private chats.

Step 1: Create a Feishu App

  1. Go to the Feishu Open Platform and log in.
  2. Click Create Custom App.
  3. Enter a name and description, then click Create.
  4. In the left sidebar, go to App Settings > Credentials & Basic Info.
  5. Copy your App ID and App Secret.

Step 2: Enable Bot Capability

  1. In the Feishu Developer Console, go to Capabilities > Bot.
  2. Click Enable Bot.

Step 3: Configure Permissions

  1. Go to Capabilities > Permissions.
  2. Search for and enable the following permissions (at minimum):
  3. Click Apply for Permissions if required by your organization.

Step 4: Configure Events (Webhook Mode)

  1. In Memoh, go to your Bot's Platforms tab and add a Feishu channel.
  2. Choose Inbound Mode: webhook.
  3. Fill in your App ID and App Secret.
  4. Click Save. Memoh will generate a Webhook Callback URL.
  5. Copy this URL.
  6. In the Feishu Console, go to App Settings > Event Subscriptions.
  7. Paste the URL into the Verification URL field and save.
  8. Add events like Receive Message (im.message.receive_v1).

Official Guide: Feishu Custom Bot Guide

Step 5: Publish Your App

  1. In the Feishu Console, go to App Release > Version Management & Release.
  2. Click Create a Version, fill in the details, and submit for approval.
  3. Once approved and published, the bot is ready to use.
',13)])])}const d=o(n,[["render",s]]);export{c as __pageData,d as default}; +import{_ as o,o as t,c as i,ag as a}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"Feishu (Lark) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/feishu.md","filePath":"channels/feishu.md","lastUpdated":1774787421000}'),n={name:"channels/feishu.md"};function s(r,e,l,p,h,g){return t(),i("div",null,[...e[0]||(e[0]=[a('

Feishu (Lark) Channel Configuration

Memoh supports integrating with Feishu (Lark) via the Open Platform. This allows your enterprise bots to interact with users in groups or private chats.

Step 1: Create a Feishu App

  1. Go to the Feishu Open Platform and log in.
  2. Click Create Custom App.
  3. Enter a name and description, then click Create.
  4. In the left sidebar, go to App Settings > Credentials & Basic Info.
  5. Copy your App ID and App Secret.

Step 2: Enable Bot Capability

  1. In the Feishu Developer Console, go to Capabilities > Bot.
  2. Click Enable Bot.

Step 3: Configure Permissions

  1. Go to Capabilities > Permissions.
  2. Search for and enable the following permissions (at minimum):
  3. Click Apply for Permissions if required by your organization.

Step 4: Configure Events (Webhook Mode)

  1. In Memoh, go to your Bot's Platforms tab and add a Feishu channel.
  2. Choose Inbound Mode: webhook.
  3. Fill in your App ID and App Secret.
  4. Click Save. Memoh will generate a Webhook Callback URL.
  5. Copy this URL.
  6. In the Feishu Console, go to App Settings > Event Subscriptions.
  7. Paste the URL into the Verification URL field and save.
  8. Add events like Receive Message (im.message.receive_v1).

Official Guide: Feishu Custom Bot Guide

Step 5: Publish Your App

  1. In the Feishu Console, go to App Release > Version Management & Release.
  2. Click Create a Version, fill in the details, and submit for approval.
  3. Once approved and published, the bot is ready to use.
',13)])])}const d=o(n,[["render",s]]);export{c as __pageData,d as default}; diff --git a/assets/channels_feishu.md.wMudSRYw.lean.js b/assets/channels_feishu.md.7xzXC8PR.lean.js similarity index 72% rename from assets/channels_feishu.md.wMudSRYw.lean.js rename to assets/channels_feishu.md.7xzXC8PR.lean.js index fb8fa8d0..2e406813 100644 --- a/assets/channels_feishu.md.wMudSRYw.lean.js +++ b/assets/channels_feishu.md.7xzXC8PR.lean.js @@ -1 +1 @@ -import{_ as o,o as t,c as i,ag as a}from"./chunks/framework.CvgP6Fyv.js";const c=JSON.parse('{"title":"Feishu (Lark) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/feishu.md","filePath":"channels/feishu.md","lastUpdated":1774787421000}'),n={name:"channels/feishu.md"};function s(r,e,l,p,h,g){return t(),i("div",null,[...e[0]||(e[0]=[a("",13)])])}const d=o(n,[["render",s]]);export{c as __pageData,d as default}; +import{_ as o,o as t,c as i,ag as a}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"Feishu (Lark) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/feishu.md","filePath":"channels/feishu.md","lastUpdated":1774787421000}'),n={name:"channels/feishu.md"};function s(r,e,l,p,h,g){return t(),i("div",null,[...e[0]||(e[0]=[a("",13)])])}const d=o(n,[["render",s]]);export{c as __pageData,d as default}; diff --git a/assets/channels_index.md.CHGqSCNe.js b/assets/channels_index.md.CV834U5I.js similarity index 95% rename from assets/channels_index.md.CHGqSCNe.js rename to assets/channels_index.md.CV834U5I.js index 378d9889..2c0e8836 100644 --- a/assets/channels_index.md.CHGqSCNe.js +++ b/assets/channels_index.md.CV834U5I.js @@ -1 +1 @@ -import{_ as t,o as r,c as a,ag as o}from"./chunks/framework.CvgP6Fyv.js";const m=JSON.parse('{"title":"Channels Overview","description":"","frontmatter":{},"headers":[],"relativePath":"channels/index.md","filePath":"channels/index.md","lastUpdated":1774787421000}'),n={name:"channels/index.md"};function s(i,e,l,h,g,c){return r(),a("div",null,[...e[0]||(e[0]=[o('

Channels Overview

Channels are the gateways that connect your Memoh Bots to the outside world. By configuring channels, you can interact with your bots via your favorite messaging platforms.

Memoh currently supports the following channels:

General Setup Flow

  1. Create an external app/bot: Register your bot on the target platform (e.g., via BotFather on Telegram).
  2. Obtain credentials: Fetch API tokens, App IDs, or secrets.
  3. Configure in Memoh: Add the channel to your Bot's Platforms tab and paste the credentials.
  4. Enable: Activate the channel to start receiving and sending messages.

Choose a channel from the sidebar to see detailed configuration guides for each platform.

',7)])])}const p=t(n,[["render",s]]);export{m as __pageData,p as default}; +import{_ as t,o as r,c as a,ag as o}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Channels Overview","description":"","frontmatter":{},"headers":[],"relativePath":"channels/index.md","filePath":"channels/index.md","lastUpdated":1774787421000}'),n={name:"channels/index.md"};function s(i,e,l,h,g,c){return r(),a("div",null,[...e[0]||(e[0]=[o('

Channels Overview

Channels are the gateways that connect your Memoh Bots to the outside world. By configuring channels, you can interact with your bots via your favorite messaging platforms.

Memoh currently supports the following channels:

General Setup Flow

  1. Create an external app/bot: Register your bot on the target platform (e.g., via BotFather on Telegram).
  2. Obtain credentials: Fetch API tokens, App IDs, or secrets.
  3. Configure in Memoh: Add the channel to your Bot's Platforms tab and paste the credentials.
  4. Enable: Activate the channel to start receiving and sending messages.

Choose a channel from the sidebar to see detailed configuration guides for each platform.

',7)])])}const p=t(n,[["render",s]]);export{m as __pageData,p as default}; diff --git a/assets/channels_index.md.CHGqSCNe.lean.js b/assets/channels_index.md.CV834U5I.lean.js similarity index 70% rename from assets/channels_index.md.CHGqSCNe.lean.js rename to assets/channels_index.md.CV834U5I.lean.js index f04ef649..5139fda5 100644 --- a/assets/channels_index.md.CHGqSCNe.lean.js +++ b/assets/channels_index.md.CV834U5I.lean.js @@ -1 +1 @@ -import{_ as t,o as r,c as a,ag as o}from"./chunks/framework.CvgP6Fyv.js";const m=JSON.parse('{"title":"Channels Overview","description":"","frontmatter":{},"headers":[],"relativePath":"channels/index.md","filePath":"channels/index.md","lastUpdated":1774787421000}'),n={name:"channels/index.md"};function s(i,e,l,h,g,c){return r(),a("div",null,[...e[0]||(e[0]=[o("",7)])])}const p=t(n,[["render",s]]);export{m as __pageData,p as default}; +import{_ as t,o as r,c as a,ag as o}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Channels Overview","description":"","frontmatter":{},"headers":[],"relativePath":"channels/index.md","filePath":"channels/index.md","lastUpdated":1774787421000}'),n={name:"channels/index.md"};function s(i,e,l,h,g,c){return r(),a("div",null,[...e[0]||(e[0]=[o("",7)])])}const p=t(n,[["render",s]]);export{m as __pageData,p as default}; diff --git a/assets/channels_matrix.md.BX6Zz3t1.js b/assets/channels_matrix.md.C5lym8OS.js similarity index 98% rename from assets/channels_matrix.md.BX6Zz3t1.js rename to assets/channels_matrix.md.C5lym8OS.js index 03c457c3..8acb8127 100644 --- a/assets/channels_matrix.md.BX6Zz3t1.js +++ b/assets/channels_matrix.md.C5lym8OS.js @@ -1,4 +1,4 @@ -import{_ as e,o as a,c as i,ag as s}from"./chunks/framework.CvgP6Fyv.js";const u=JSON.parse('{"title":"Matrix Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/matrix.md","filePath":"channels/matrix.md","lastUpdated":1774790782000}'),o={name:"channels/matrix.md"};function n(r,t,l,h,d,c){return a(),i("div",null,[...t[0]||(t[0]=[s(`

Matrix Channel Configuration

Connecting your Memoh Bot to Matrix allows it to communicate via the decentralized Matrix messaging protocol. Your bot can join rooms, respond to direct messages, and participate in group conversations on any Matrix homeserver.

Step 1: Create a Matrix Bot Account

  1. Register a new account on your Matrix homeserver (e.g., via Element or any Matrix client).
  2. Note the User ID (e.g., @mybot:matrix.org).
  3. Obtain an Access Token for the account. You can do this by:
bash
curl -X POST "https://<homeserver>/_matrix/client/v3/login" \\
+import{_ as e,o as a,c as i,ag as s}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Matrix Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/matrix.md","filePath":"channels/matrix.md","lastUpdated":1774790782000}'),o={name:"channels/matrix.md"};function n(r,t,l,h,d,c){return a(),i("div",null,[...t[0]||(t[0]=[s(`

Matrix Channel Configuration

Connecting your Memoh Bot to Matrix allows it to communicate via the decentralized Matrix messaging protocol. Your bot can join rooms, respond to direct messages, and participate in group conversations on any Matrix homeserver.

Step 1: Create a Matrix Bot Account

  1. Register a new account on your Matrix homeserver (e.g., via Element or any Matrix client).
  2. Note the User ID (e.g., @mybot:matrix.org).
  3. Obtain an Access Token for the account. You can do this by:
  • Option A: Using the Matrix Client Login API
bash
curl -X POST "https://<homeserver>/_matrix/client/v3/login" \\
   -H "Content-Type: application/json" \\
   -d '{
     "type": "m.login.password",
diff --git a/assets/channels_matrix.md.BX6Zz3t1.lean.js b/assets/channels_matrix.md.C5lym8OS.lean.js
similarity index 71%
rename from assets/channels_matrix.md.BX6Zz3t1.lean.js
rename to assets/channels_matrix.md.C5lym8OS.lean.js
index cf70ede1..fcce6681 100644
--- a/assets/channels_matrix.md.BX6Zz3t1.lean.js
+++ b/assets/channels_matrix.md.C5lym8OS.lean.js
@@ -1 +1 @@
-import{_ as e,o as a,c as i,ag as s}from"./chunks/framework.CvgP6Fyv.js";const u=JSON.parse('{"title":"Matrix Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/matrix.md","filePath":"channels/matrix.md","lastUpdated":1774790782000}'),o={name:"channels/matrix.md"};function n(r,t,l,h,d,c){return a(),i("div",null,[...t[0]||(t[0]=[s("",18)])])}const g=e(o,[["render",n]]);export{u as __pageData,g as default};
+import{_ as e,o as a,c as i,ag as s}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Matrix Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/matrix.md","filePath":"channels/matrix.md","lastUpdated":1774790782000}'),o={name:"channels/matrix.md"};function n(r,t,l,h,d,c){return a(),i("div",null,[...t[0]||(t[0]=[s("",18)])])}const g=e(o,[["render",n]]);export{u as __pageData,g as default};
diff --git a/assets/channels_qq.md.BLP-WgO8.js b/assets/channels_qq.md.BiHC52Zm.js
similarity index 98%
rename from assets/channels_qq.md.BLP-WgO8.js
rename to assets/channels_qq.md.BiHC52Zm.js
index 8de78d55..f9bae9da 100644
--- a/assets/channels_qq.md.BLP-WgO8.js
+++ b/assets/channels_qq.md.BiHC52Zm.js
@@ -1 +1 @@
-import{_ as e,o,c as a,ag as n}from"./chunks/framework.CvgP6Fyv.js";const u=JSON.parse('{"title":"QQ Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/qq.md","filePath":"channels/qq.md","lastUpdated":1774787421000}'),r={name:"channels/qq.md"};function i(l,t,s,c,g,p){return o(),a("div",null,[...t[0]||(t[0]=[n('

QQ Channel Configuration

Connecting your Memoh Bot to QQ allows it to interact with users through QQ's official Bot platform.

Step 1: Create a QQ Bot

  1. Go to the QQ Bot Open Platform and log in with your QQ account.
  2. Click Create Bot (创建机器人) - no approval required. Each account can create up to 5 bots.
  3. Copy the AppID and AppSecret displayed on the page.

Important: AppSecret is only shown once. Save it securely - viewing it again will force a reset.

Step 2: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select QQ.
  3. Paste your AppID and AppSecret.
  4. Configure optional settings:
    • Markdown Support: Enable Markdown formatting (default: enabled).
    • Enable Input Hint: Show typing indicators (default: enabled).
  5. Click Save and Enable.

Step 3: Bind Your Identity (Optional)

Binding your QQ identity to your Memoh account enables cross-platform identity recognition — the bot will know who you are regardless of which channel you use.

  1. In Memoh Web UI, go to Profile > Bind Code.
  2. Select QQ and click Generate.
  3. Copy the code and send it to your bot in a QQ direct message.

Features Supported

  • Message Content: Full support for text messages.
  • Markdown: Rich formatting with bold, italic, code blocks, and links.
  • Attachments: Support for images and files.
  • Typing Indicators: Visual feedback while generating responses.
  • Target Types: C2C (direct message), group, and channel.

Official Resources

',14)])])}const h=e(r,[["render",i]]);export{u as __pageData,h as default}; +import{_ as e,o,c as a,ag as n}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"QQ Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/qq.md","filePath":"channels/qq.md","lastUpdated":1774787421000}'),r={name:"channels/qq.md"};function i(l,t,s,c,g,p){return o(),a("div",null,[...t[0]||(t[0]=[n('

QQ Channel Configuration

Connecting your Memoh Bot to QQ allows it to interact with users through QQ's official Bot platform.

Step 1: Create a QQ Bot

  1. Go to the QQ Bot Open Platform and log in with your QQ account.
  2. Click Create Bot (创建机器人) - no approval required. Each account can create up to 5 bots.
  3. Copy the AppID and AppSecret displayed on the page.

Important: AppSecret is only shown once. Save it securely - viewing it again will force a reset.

Step 2: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select QQ.
  3. Paste your AppID and AppSecret.
  4. Configure optional settings:
    • Markdown Support: Enable Markdown formatting (default: enabled).
    • Enable Input Hint: Show typing indicators (default: enabled).
  5. Click Save and Enable.

Step 3: Bind Your Identity (Optional)

Binding your QQ identity to your Memoh account enables cross-platform identity recognition — the bot will know who you are regardless of which channel you use.

  1. In Memoh Web UI, go to Profile > Bind Code.
  2. Select QQ and click Generate.
  3. Copy the code and send it to your bot in a QQ direct message.

Features Supported

  • Message Content: Full support for text messages.
  • Markdown: Rich formatting with bold, italic, code blocks, and links.
  • Attachments: Support for images and files.
  • Typing Indicators: Visual feedback while generating responses.
  • Target Types: C2C (direct message), group, and channel.

Official Resources

',14)])])}const h=e(r,[["render",i]]);export{u as __pageData,h as default}; diff --git a/assets/channels_qq.md.BLP-WgO8.lean.js b/assets/channels_qq.md.BiHC52Zm.lean.js similarity index 85% rename from assets/channels_qq.md.BLP-WgO8.lean.js rename to assets/channels_qq.md.BiHC52Zm.lean.js index 0422a99d..5f2147e4 100644 --- a/assets/channels_qq.md.BLP-WgO8.lean.js +++ b/assets/channels_qq.md.BiHC52Zm.lean.js @@ -1 +1 @@ -import{_ as e,o,c as a,ag as n}from"./chunks/framework.CvgP6Fyv.js";const u=JSON.parse('{"title":"QQ Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/qq.md","filePath":"channels/qq.md","lastUpdated":1774787421000}'),r={name:"channels/qq.md"};function i(l,t,s,c,g,p){return o(),a("div",null,[...t[0]||(t[0]=[n("",14)])])}const h=e(r,[["render",i]]);export{u as __pageData,h as default}; +import{_ as e,o,c as a,ag as n}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"QQ Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/qq.md","filePath":"channels/qq.md","lastUpdated":1774787421000}'),r={name:"channels/qq.md"};function i(l,t,s,c,g,p){return o(),a("div",null,[...t[0]||(t[0]=[n("",14)])])}const h=e(r,[["render",i]]);export{u as __pageData,h as default}; diff --git a/assets/channels_telegram.md.Cr9xyz5r.js b/assets/channels_telegram.md.WGR_O6_O.js similarity index 98% rename from assets/channels_telegram.md.Cr9xyz5r.js rename to assets/channels_telegram.md.WGR_O6_O.js index 298b9a2a..703e9e70 100644 --- a/assets/channels_telegram.md.Cr9xyz5r.js +++ b/assets/channels_telegram.md.WGR_O6_O.js @@ -1 +1 @@ -import{_ as t,o,c as a,ag as n}from"./chunks/framework.CvgP6Fyv.js";const u=JSON.parse('{"title":"Telegram Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/telegram.md","filePath":"channels/telegram.md","lastUpdated":1774787421000}'),r={name:"channels/telegram.md"};function l(i,e,s,g,d,h){return o(),a("div",null,[...e[0]||(e[0]=[n('

Telegram Channel Configuration

This guide walks you through connecting your Memoh Bot to Telegram. Telegram is one of the most supported platforms in Memoh, featuring streaming responses, Markdown formatting, and attachment support.

Step 1: Create a Telegram Bot

You need to create a bot on Telegram to get an API token.

  1. Open Telegram and search for the official @BotFather bot.
  2. Send the /newbot command.
  3. Follow the prompts:
    • Name: Choose a display name for your bot (e.g., My Memoh Bot).
    • Username: Choose a unique username ending in bot (e.g., my_memoh_bot).
  4. BotFather will provide you with an API Token (e.g., 123456789:ABCdefGHIjklMNOpqrsTUVwxyz). Keep this token secret.

Official Guide: Telegram Bot Tutorial

Step 2: Configure Memoh

  1. Go to your Bot's Detail Page in the Memoh Web UI.
  2. Select the Platforms tab.
  3. Click Add Channel and select Telegram.
  4. Paste your API Token into the credentials field.
  5. Click Save and Enable.

Step 3: Bind Your Identity (Optional)

Binding your Telegram identity to your Memoh account enables cross-platform identity recognition — the bot will know who you are regardless of which channel you use.

  1. In Memoh Web UI, go to Profile > Bind Code.
  2. Select Telegram and click Generate.
  3. Copy the code.
  4. Open a chat with your new bot on Telegram and send the bind code.
  5. The bot should respond that your identity is successfully linked.

Features Supported

  • Streaming: Responses appear as the bot "thinks."
  • Markdown: Support for bold, italic, code blocks, and links.
  • Attachments: Send images or files to the bot; the bot can also send files back.
  • Replies: The bot understands context from message replies.
',13)])])}const m=t(r,[["render",l]]);export{u as __pageData,m as default}; +import{_ as t,o,c as a,ag as n}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Telegram Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/telegram.md","filePath":"channels/telegram.md","lastUpdated":1774787421000}'),r={name:"channels/telegram.md"};function l(i,e,s,g,d,h){return o(),a("div",null,[...e[0]||(e[0]=[n('

Telegram Channel Configuration

This guide walks you through connecting your Memoh Bot to Telegram. Telegram is one of the most supported platforms in Memoh, featuring streaming responses, Markdown formatting, and attachment support.

Step 1: Create a Telegram Bot

You need to create a bot on Telegram to get an API token.

  1. Open Telegram and search for the official @BotFather bot.
  2. Send the /newbot command.
  3. Follow the prompts:
    • Name: Choose a display name for your bot (e.g., My Memoh Bot).
    • Username: Choose a unique username ending in bot (e.g., my_memoh_bot).
  4. BotFather will provide you with an API Token (e.g., 123456789:ABCdefGHIjklMNOpqrsTUVwxyz). Keep this token secret.

Official Guide: Telegram Bot Tutorial

Step 2: Configure Memoh

  1. Go to your Bot's Detail Page in the Memoh Web UI.
  2. Select the Platforms tab.
  3. Click Add Channel and select Telegram.
  4. Paste your API Token into the credentials field.
  5. Click Save and Enable.

Step 3: Bind Your Identity (Optional)

Binding your Telegram identity to your Memoh account enables cross-platform identity recognition — the bot will know who you are regardless of which channel you use.

  1. In Memoh Web UI, go to Profile > Bind Code.
  2. Select Telegram and click Generate.
  3. Copy the code.
  4. Open a chat with your new bot on Telegram and send the bind code.
  5. The bot should respond that your identity is successfully linked.

Features Supported

  • Streaming: Responses appear as the bot "thinks."
  • Markdown: Support for bold, italic, code blocks, and links.
  • Attachments: Send images or files to the bot; the bot can also send files back.
  • Replies: The bot understands context from message replies.
',13)])])}const m=t(r,[["render",l]]);export{u as __pageData,m as default}; diff --git a/assets/channels_telegram.md.Cr9xyz5r.lean.js b/assets/channels_telegram.md.WGR_O6_O.lean.js similarity index 85% rename from assets/channels_telegram.md.Cr9xyz5r.lean.js rename to assets/channels_telegram.md.WGR_O6_O.lean.js index 3c58884a..fd9d75a0 100644 --- a/assets/channels_telegram.md.Cr9xyz5r.lean.js +++ b/assets/channels_telegram.md.WGR_O6_O.lean.js @@ -1 +1 @@ -import{_ as t,o,c as a,ag as n}from"./chunks/framework.CvgP6Fyv.js";const u=JSON.parse('{"title":"Telegram Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/telegram.md","filePath":"channels/telegram.md","lastUpdated":1774787421000}'),r={name:"channels/telegram.md"};function l(i,e,s,g,d,h){return o(),a("div",null,[...e[0]||(e[0]=[n("",13)])])}const m=t(r,[["render",l]]);export{u as __pageData,m as default}; +import{_ as t,o,c as a,ag as n}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Telegram Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/telegram.md","filePath":"channels/telegram.md","lastUpdated":1774787421000}'),r={name:"channels/telegram.md"};function l(i,e,s,g,d,h){return o(),a("div",null,[...e[0]||(e[0]=[n("",13)])])}const m=t(r,[["render",l]]);export{u as __pageData,m as default}; diff --git a/assets/channels_wecom.md.BeiCLtex.js b/assets/channels_wecom.md.D7yBtNrz.js similarity index 98% rename from assets/channels_wecom.md.BeiCLtex.js rename to assets/channels_wecom.md.D7yBtNrz.js index 207443b6..fc51ae93 100644 --- a/assets/channels_wecom.md.BeiCLtex.js +++ b/assets/channels_wecom.md.D7yBtNrz.js @@ -1 +1 @@ -import{_ as t,o,c as a,ag as r}from"./chunks/framework.CvgP6Fyv.js";const m=JSON.parse('{"title":"WeCom (WeWork) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/wecom.md","filePath":"channels/wecom.md","lastUpdated":1774787421000}'),n={name:"channels/wecom.md"};function i(s,e,l,c,d,h){return o(),a("div",null,[...e[0]||(e[0]=[r('

WeCom (WeWork) Channel Configuration

Connecting your Memoh Bot to WeCom (企业微信) allows it to interact with users within your organization's WeCom workspace.

Step 1: Create a WeCom Bot

  1. Log in to the WeCom Admin Console.
  2. Navigate to App Management > Custom Apps or Bot Management.
  3. Create a new bot application.
  4. Note the Bot ID and Secret credentials.

Step 2: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select WeCom.
  3. Fill in the required fields:
FieldRequiredDescription
Bot IDYesThe WeCom bot identifier.
SecretYesThe bot's authentication credential.
WebSocket URLNoCustom WebSocket endpoint (uses default if empty).
  1. Click Save and Enable.

Step 3: Start Chatting

Once the channel is enabled, the bot will connect to WeCom via WebSocket and begin receiving messages. Users in your WeCom workspace can send messages to the bot directly or in group chats.

Features Supported

  • Message Content: Full support for text messages.
  • Direct Messages: Private conversations with individual users.
  • Group Chats: Participate in group conversations.
  • Streaming: Responses are streamed in real-time.

Official Resources

',14)])])}const u=t(n,[["render",i]]);export{m as __pageData,u as default}; +import{_ as t,o,c as a,ag as r}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"WeCom (WeWork) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/wecom.md","filePath":"channels/wecom.md","lastUpdated":1774787421000}'),n={name:"channels/wecom.md"};function i(s,e,l,c,d,h){return o(),a("div",null,[...e[0]||(e[0]=[r('

WeCom (WeWork) Channel Configuration

Connecting your Memoh Bot to WeCom (企业微信) allows it to interact with users within your organization's WeCom workspace.

Step 1: Create a WeCom Bot

  1. Log in to the WeCom Admin Console.
  2. Navigate to App Management > Custom Apps or Bot Management.
  3. Create a new bot application.
  4. Note the Bot ID and Secret credentials.

Step 2: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select WeCom.
  3. Fill in the required fields:
FieldRequiredDescription
Bot IDYesThe WeCom bot identifier.
SecretYesThe bot's authentication credential.
WebSocket URLNoCustom WebSocket endpoint (uses default if empty).
  1. Click Save and Enable.

Step 3: Start Chatting

Once the channel is enabled, the bot will connect to WeCom via WebSocket and begin receiving messages. Users in your WeCom workspace can send messages to the bot directly or in group chats.

Features Supported

  • Message Content: Full support for text messages.
  • Direct Messages: Private conversations with individual users.
  • Group Chats: Participate in group conversations.
  • Streaming: Responses are streamed in real-time.

Official Resources

',14)])])}const u=t(n,[["render",i]]);export{m as __pageData,u as default}; diff --git a/assets/channels_wecom.md.BeiCLtex.lean.js b/assets/channels_wecom.md.D7yBtNrz.lean.js similarity index 85% rename from assets/channels_wecom.md.BeiCLtex.lean.js rename to assets/channels_wecom.md.D7yBtNrz.lean.js index 040ecd51..dae39036 100644 --- a/assets/channels_wecom.md.BeiCLtex.lean.js +++ b/assets/channels_wecom.md.D7yBtNrz.lean.js @@ -1 +1 @@ -import{_ as t,o,c as a,ag as r}from"./chunks/framework.CvgP6Fyv.js";const m=JSON.parse('{"title":"WeCom (WeWork) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/wecom.md","filePath":"channels/wecom.md","lastUpdated":1774787421000}'),n={name:"channels/wecom.md"};function i(s,e,l,c,d,h){return o(),a("div",null,[...e[0]||(e[0]=[r("",14)])])}const u=t(n,[["render",i]]);export{m as __pageData,u as default}; +import{_ as t,o,c as a,ag as r}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"WeCom (WeWork) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/wecom.md","filePath":"channels/wecom.md","lastUpdated":1774787421000}'),n={name:"channels/wecom.md"};function i(s,e,l,c,d,h){return o(),a("div",null,[...e[0]||(e[0]=[r("",14)])])}const u=t(n,[["render",i]]);export{m as __pageData,u as default}; diff --git a/assets/channels_weixin.md.DWY_N0Mw.js b/assets/channels_weixin.md.Ckccg7Ew.js similarity index 95% rename from assets/channels_weixin.md.DWY_N0Mw.js rename to assets/channels_weixin.md.Ckccg7Ew.js index fd852292..8055ca90 100644 --- a/assets/channels_weixin.md.DWY_N0Mw.js +++ b/assets/channels_weixin.md.Ckccg7Ew.js @@ -1 +1 @@ -import{_ as t,o as a,c as n,ag as o}from"./chunks/framework.CvgP6Fyv.js";const g=JSON.parse('{"title":"WeChat Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/weixin.md","filePath":"channels/weixin.md","lastUpdated":1774787421000}'),i={name:"channels/weixin.md"};function r(s,e,l,h,d,c){return a(),n("div",null,[...e[0]||(e[0]=[o('

WeChat Channel Configuration

Connecting your Memoh Bot to WeChat allows it to interact with users directly via WeChat personal messaging. Setup is simple — just scan a QR code.

Step 1: Add WeChat Channel in Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select WeChat.

Step 2: Scan the QR Code

  1. Click Start QR Login. Memoh will fetch a QR code from the WeChat platform.
  2. Open WeChat on your phone and scan the displayed QR code.
  3. Confirm the login on your phone when prompted.
  4. Once confirmed, Memoh automatically saves the credentials — no manual token or API key entry is needed.

The QR code has a limited validity window. If it expires before you scan, click Start QR Login again to get a fresh one.

Step 3: Start Chatting

After the QR login succeeds, the channel is automatically enabled. Users can now send messages to the bot directly in WeChat.

Optional Settings

FieldDescription
Enable TypingShow typing indicators while generating responses.

Features Supported

  • Message Content: Full support for text messages.
  • Direct Messages: Private conversations with individual users.
  • Attachments: Support for images and media.
  • Typing Indicators: Visual feedback while generating responses (when enabled).
',13)])])}const u=t(i,[["render",r]]);export{g as __pageData,u as default}; +import{_ as t,o as a,c as n,ag as o}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"WeChat Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/weixin.md","filePath":"channels/weixin.md","lastUpdated":1774787421000}'),i={name:"channels/weixin.md"};function r(s,e,l,h,d,c){return a(),n("div",null,[...e[0]||(e[0]=[o('

WeChat Channel Configuration

Connecting your Memoh Bot to WeChat allows it to interact with users directly via WeChat personal messaging. Setup is simple — just scan a QR code.

Step 1: Add WeChat Channel in Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select WeChat.

Step 2: Scan the QR Code

  1. Click Start QR Login. Memoh will fetch a QR code from the WeChat platform.
  2. Open WeChat on your phone and scan the displayed QR code.
  3. Confirm the login on your phone when prompted.
  4. Once confirmed, Memoh automatically saves the credentials — no manual token or API key entry is needed.

The QR code has a limited validity window. If it expires before you scan, click Start QR Login again to get a fresh one.

Step 3: Start Chatting

After the QR login succeeds, the channel is automatically enabled. Users can now send messages to the bot directly in WeChat.

Optional Settings

FieldDescription
Enable TypingShow typing indicators while generating responses.

Features Supported

  • Message Content: Full support for text messages.
  • Direct Messages: Private conversations with individual users.
  • Attachments: Support for images and media.
  • Typing Indicators: Visual feedback while generating responses (when enabled).
',13)])])}const u=t(i,[["render",r]]);export{g as __pageData,u as default}; diff --git a/assets/channels_weixin.md.DWY_N0Mw.lean.js b/assets/channels_weixin.md.Ckccg7Ew.lean.js similarity index 71% rename from assets/channels_weixin.md.DWY_N0Mw.lean.js rename to assets/channels_weixin.md.Ckccg7Ew.lean.js index b72fdff4..7f017c7d 100644 --- a/assets/channels_weixin.md.DWY_N0Mw.lean.js +++ b/assets/channels_weixin.md.Ckccg7Ew.lean.js @@ -1 +1 @@ -import{_ as t,o as a,c as n,ag as o}from"./chunks/framework.CvgP6Fyv.js";const g=JSON.parse('{"title":"WeChat Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/weixin.md","filePath":"channels/weixin.md","lastUpdated":1774787421000}'),i={name:"channels/weixin.md"};function r(s,e,l,h,d,c){return a(),n("div",null,[...e[0]||(e[0]=[o("",13)])])}const u=t(i,[["render",r]]);export{g as __pageData,u as default}; +import{_ as t,o as a,c as n,ag as o}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"WeChat Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/weixin.md","filePath":"channels/weixin.md","lastUpdated":1774787421000}'),i={name:"channels/weixin.md"};function r(s,e,l,h,d,c){return a(),n("div",null,[...e[0]||(e[0]=[o("",13)])])}const u=t(i,[["render",r]]);export{g as __pageData,u as default}; diff --git a/assets/chunks/@localSearchIndexroot.Az8cqTXO.js b/assets/chunks/@localSearchIndexroot.Az8cqTXO.js deleted file mode 100644 index 9a8fa76c..00000000 --- a/assets/chunks/@localSearchIndexroot.Az8cqTXO.js +++ /dev/null @@ -1 +0,0 @@ -const e='{"documentCount":291,"nextId":291,"documentIds":{"0":"/about.html#about-memoh","1":"/about.html#what-is-memoh","2":"/about.html#key-features","3":"/about.html#multi-bot-management","4":"/about.html#multi-user-identity-recognition","5":"/about.html#containerized-isolation","6":"/about.html#memory-engineering","7":"/about.html#multi-platform-support","8":"/about.html#agent-capabilities","9":"/about.html#sessions","10":"/about.html#slash-commands","11":"/about.html#multi-llm-provider-support","12":"/about.html#mcp-protocol-support","13":"/about.html#scheduled-tasks","14":"/about.html#memory-compaction","15":"/about.html#graphical-configuration","16":"/about.html#installation","17":"/blogs/2026-02-16.html#introduction-to-memoh-the-case-for-an-always-on-containerized-home-agent","18":"/blogs/2026-02-16.html#overview","19":"/blogs/2026-02-16.html#story-time","20":"/blogs/2026-02-16.html#what","21":"/blogs/2026-02-16.html#why","22":"/blogs/2026-02-16.html#how","23":"/blogs/2026-02-16.html#features","24":"/blogs/2026-02-16.html#compare-to-openclaw","25":"/blogs/2026-02-16.html#conclusion","26":"/blogs/#blogs","27":"/channels/discord.html#discord-channel-configuration","28":"/channels/discord.html#step-1-create-a-discord-application","29":"/channels/discord.html#step-2-configure-bot-settings","30":"/channels/discord.html#step-3-invite-the-bot-to-your-server","31":"/channels/discord.html#step-4-configure-memoh","32":"/channels/discord.html#features-supported","33":"/channels/feishu.html#feishu-lark-channel-configuration","34":"/channels/feishu.html#step-1-create-a-feishu-app","35":"/channels/feishu.html#step-2-enable-bot-capability","36":"/channels/feishu.html#step-3-configure-permissions","37":"/channels/feishu.html#step-4-configure-events-webhook-mode","38":"/channels/feishu.html#step-5-publish-your-app","39":"/channels/#channels-overview","40":"/channels/#general-setup-flow","41":"/channels/matrix.html#matrix-channel-configuration","42":"/channels/matrix.html#step-1-create-a-matrix-bot-account","43":"/channels/matrix.html#step-2-configure-memoh","44":"/channels/matrix.html#step-3-invite-the-bot","45":"/channels/matrix.html#features-supported","46":"/channels/matrix.html#official-resources","47":"/channels/qq.html#qq-channel-configuration","48":"/channels/qq.html#step-1-create-a-qq-bot","49":"/channels/qq.html#step-2-configure-memoh","50":"/channels/qq.html#step-3-bind-your-identity-optional","51":"/channels/qq.html#features-supported","52":"/channels/qq.html#official-resources","53":"/channels/telegram.html#telegram-channel-configuration","54":"/channels/telegram.html#step-1-create-a-telegram-bot","55":"/channels/telegram.html#step-2-configure-memoh","56":"/channels/telegram.html#step-3-bind-your-identity-optional","57":"/channels/telegram.html#features-supported","58":"/channels/wecom.html#wecom-wework-channel-configuration","59":"/channels/wecom.html#step-1-create-a-wecom-bot","60":"/channels/wecom.html#step-2-configure-memoh","61":"/channels/wecom.html#step-3-start-chatting","62":"/channels/wecom.html#features-supported","63":"/channels/wecom.html#official-resources","64":"/channels/weixin.html#wechat-channel-configuration","65":"/channels/weixin.html#step-1-add-wechat-channel-in-memoh","66":"/channels/weixin.html#step-2-scan-the-qr-code","67":"/channels/weixin.html#step-3-start-chatting","68":"/channels/weixin.html#optional-settings","69":"/channels/weixin.html#features-supported","70":"/getting-started/access.html#bot-access-control","71":"/getting-started/access.html#concepts","72":"/getting-started/access.html#default-effect","73":"/getting-started/access.html#subject-types","74":"/getting-started/access.html#rule-effects","75":"/getting-started/access.html#priority-based-evaluation","76":"/getting-started/access.html#managing-access","77":"/getting-started/access.html#adding-rules","78":"/getting-started/access.html#reordering-rules","79":"/getting-started/access.html#source-scope","80":"/getting-started/access.html#examples","81":"/getting-started/access.html#open-bot-anyone-can-chat","82":"/getting-started/access.html#private-bot-with-selected-users","83":"/getting-started/access.html#open-bot-with-blocked-users","84":"/getting-started/access.html#platform-specific-access","85":"/getting-started/access.html#channel-scoped-access","86":"/getting-started/bot.html#bot-management","87":"/getting-started/bot.html#creating-a-bot","88":"/getting-started/bot.html#bot-detail-page","89":"/getting-started/bot.html#tab-overview","90":"/getting-started/bot.html#configuring-the-bot-s-core-settings","91":"/getting-started/bot.html#general-tab-reference","92":"/getting-started/bot.html#terminal-tab","93":"/getting-started/bot.html#deleting-a-bot","94":"/getting-started/browser.html#browser-contexts","95":"/getting-started/browser.html#concept-browser-gateway","96":"/getting-started/browser.html#creating-a-browser-context","97":"/getting-started/browser.html#configuring-a-browser-context","98":"/getting-started/browser.html#managing-contexts","99":"/getting-started/browser.html#assigning-a-browser-context-to-a-bot","100":"/getting-started/browser.html#bot-interaction","101":"/getting-started/browser.html#browser-core-selection","102":"/getting-started/browser.html#next-steps","103":"/getting-started/channels.html#bot-channels","104":"/getting-started/channels.html#concept-unified-communication","105":"/getting-started/channels.html#supported-channels","106":"/getting-started/channels.html#platform-guides","107":"/getting-started/channels.html#configuration-flow","108":"/getting-started/channels.html#_1-adding-a-channel","109":"/getting-started/channels.html#_2-common-fields","110":"/getting-started/channels.html#_3-special-case-feishu-webhook","111":"/getting-started/channels.html#_4-special-case-wechat-qr-code","112":"/getting-started/channels.html#operations","113":"/getting-started/compaction.html#memory-compaction","114":"/getting-started/compaction.html#concept-why-compact","115":"/getting-started/compaction.html#configuration","116":"/getting-started/compaction.html#manual-compaction","117":"/getting-started/compaction.html#compaction-logs","118":"/getting-started/compaction.html#managing-logs","119":"/getting-started/compaction.html#relationship-to-memory","120":"/getting-started/compaction.html#next-steps","121":"/getting-started/container.html#bot-container-management","122":"/getting-started/container.html#concept-the-isolated-workspace","123":"/getting-started/container.html#operations","124":"/getting-started/container.html#lifecycle-actions","125":"/getting-started/container.html#container-information","126":"/getting-started/container.html#snapshots","127":"/getting-started/container.html#creating-a-snapshot","128":"/getting-started/container.html#restoring-a-snapshot","129":"/getting-started/container.html#managing-snapshots","130":"/getting-started/container.html#data-export-and-import","131":"/getting-started/container.html#export","132":"/getting-started/container.html#import","133":"/getting-started/container.html#restore","134":"/getting-started/container.html#container-versioning","135":"/getting-started/email.html#email-providers-and-bindings","136":"/getting-started/email.html#concept-email-as-a-bot-channel","137":"/getting-started/email.html#email-provider","138":"/getting-started/email.html#creating-a-provider","139":"/getting-started/email.html#bot-email-bindings","140":"/getting-started/email.html#adding-a-binding","141":"/getting-started/email.html#outbox-and-history","142":"/getting-started/email.html#bot-interaction","143":"/getting-started/files.html#bot-files-management","144":"/getting-started/files.html#operations","145":"/getting-started/files.html#browsing-and-navigation","146":"/getting-started/files.html#managing-files","147":"/getting-started/files.html#viewing-and-editing","148":"/getting-started/files.html#text-files","149":"/getting-started/files.html#images","150":"/getting-started/files.html#bot-interaction-with-files","151":"/getting-started/heartbeat.html#bot-heartbeat","152":"/getting-started/heartbeat.html#concept-scheduled-autonomy","153":"/getting-started/heartbeat.html#configuration","154":"/getting-started/heartbeat.html#logs-and-monitoring","155":"/getting-started/heartbeat.html#managing-logs","156":"/getting-started/heartbeat.html#bot-interaction","157":"/getting-started/mcp.html#mcp-connections","158":"/getting-started/mcp.html#concept-extending-bot-capabilities","159":"/getting-started/mcp.html#connection-types","160":"/getting-started/mcp.html#_1-stdio-local-process","161":"/getting-started/mcp.html#_2-remote-http-sse","162":"/getting-started/mcp.html#oauth-authentication","163":"/getting-started/mcp.html#operations","164":"/getting-started/mcp.html#tool-discovery","165":"/getting-started/mcp.html#bot-interaction","166":"/getting-started/memory.html#bot-memory-management","167":"/getting-started/memory.html#prerequisites","168":"/getting-started/memory.html#concept-memory-retrieval","169":"/getting-started/memory.html#operations","170":"/getting-started/memory.html#_1-creating-memories","171":"/getting-started/memory.html#_2-searching-and-managing","172":"/getting-started/memory.html#memory-compression-compact","173":"/getting-started/memory.html#rebuild","174":"/getting-started/memory.html#status","175":"/getting-started/memory.html#usage-statistics","176":"/getting-started/memory.html#bot-interaction","177":"/getting-started/provider-and-model.html#llm-provider-and-model","178":"/getting-started/provider-and-model.html#llm-provider","179":"/getting-started/provider-and-model.html#creating-a-provider","180":"/getting-started/provider-and-model.html#oauth-authentication","181":"/getting-started/provider-and-model.html#import-models","182":"/getting-started/provider-and-model.html#managing-providers","183":"/getting-started/provider-and-model.html#model","184":"/getting-started/provider-and-model.html#adding-a-model","185":"/getting-started/provider-and-model.html#managing-models","186":"/getting-started/provider-and-model.html#next-steps","187":"/getting-started/schedule.html#scheduled-tasks","188":"/getting-started/schedule.html#concept-cron-based-automation","189":"/getting-started/schedule.html#schedule-fields","190":"/getting-started/schedule.html#cron-pattern-reference","191":"/getting-started/schedule.html#viewing-schedules","192":"/getting-started/schedule.html#creating-schedules","193":"/getting-started/schedule.html#via-the-bot-conversational","194":"/getting-started/schedule.html#via-the-api","195":"/getting-started/schedule.html#execution-flow","196":"/getting-started/schedule.html#schedule-vs-heartbeat","197":"/getting-started/search-provider.html#search-providers","198":"/getting-started/search-provider.html#concept-real-time-knowledge","199":"/getting-started/search-provider.html#supported-search-engines","200":"/getting-started/search-provider.html#configuration-flow","201":"/getting-started/search-provider.html#_1-adding-a-search-provider","202":"/getting-started/search-provider.html#_2-managing-providers","203":"/getting-started/search-provider.html#assigning-a-search-provider-to-a-bot","204":"/getting-started/search-provider.html#bot-interaction","205":"/getting-started/sessions.html#sessions","206":"/getting-started/sessions.html#concept-conversation-isolation","207":"/getting-started/sessions.html#session-types","208":"/getting-started/sessions.html#starting-a-new-session-with-new","209":"/getting-started/sessions.html#in-external-channels-telegram-discord-feishu-etc","210":"/getting-started/sessions.html#in-the-web-ui","211":"/getting-started/sessions.html#managing-sessions","212":"/getting-started/sessions.html#viewing-sessions","213":"/getting-started/sessions.html#renaming-sessions","214":"/getting-started/sessions.html#deleting-sessions","215":"/getting-started/sessions.html#how-sessions-relate-to-other-features","216":"/getting-started/skills.html#bot-skills","217":"/getting-started/skills.html#concept-skills-as-markdown","218":"/getting-started/skills.html#example-skill-structure","219":"/getting-started/skills.html#managing-skills","220":"/getting-started/skills.html#adding-a-skill","221":"/getting-started/skills.html#editing-and-deleting","222":"/getting-started/skills.html#how-bots-use-skills","223":"/getting-started/slash-commands.html#slash-commands","224":"/getting-started/slash-commands.html#quick-reference","225":"/getting-started/slash-commands.html#command-format","226":"/getting-started/slash-commands.html#permissions","227":"/getting-started/slash-commands.html#global-commands","228":"/getting-started/slash-commands.html#help","229":"/getting-started/slash-commands.html#new","230":"/getting-started/slash-commands.html#schedule-—-manage-scheduled-tasks","231":"/getting-started/slash-commands.html#mcp-—-manage-mcp-connections","232":"/getting-started/slash-commands.html#settings-—-view-and-update-bot-settings","233":"/getting-started/slash-commands.html#model-—-manage-bot-models","234":"/getting-started/slash-commands.html#memory-—-manage-memory-provider","235":"/getting-started/slash-commands.html#search-—-manage-search-provider","236":"/getting-started/slash-commands.html#browser-—-manage-browser-context","237":"/getting-started/slash-commands.html#usage-—-view-token-usage","238":"/getting-started/slash-commands.html#email-—-view-email-configuration","239":"/getting-started/slash-commands.html#heartbeat-—-view-heartbeat-logs","240":"/getting-started/slash-commands.html#skill-—-view-bot-skills","241":"/getting-started/slash-commands.html#fs-—-browse-container-filesystem","242":"/getting-started/slash-commands.html#mention-prefixed-commands","243":"/#memoh-documentation","244":"/#documentation","245":"/installation/docker.html#docker-installation","246":"/installation/docker.html#service-architecture","247":"/installation/docker.html#sparse-service","248":"/installation/docker.html#prerequisites","249":"/installation/docker.html#one-click-install-recommended","250":"/installation/docker.html#manual-install","251":"/installation/docker.html#china-mainland-mirror","252":"/installation/docker.html#access-points","253":"/installation/docker.html#configuration-reference","254":"/installation/docker.html#common-commands","255":"/installation/docker.html#environment-variables","256":"/memory-providers/mem0.html#mem0-memory-provider","257":"/memory-providers/mem0.html#creating-a-mem0-provider","258":"/memory-providers/mem0.html#configuring-a-mem0-provider","259":"/memory-providers/mem0.html#assigning-a-mem0-provider-to-a-bot","260":"/memory-providers/mem0.html#usage","261":"/memory-providers/openviking.html#openviking-memory-provider","262":"/memory-providers/openviking.html#creating-an-openviking-provider","263":"/memory-providers/openviking.html#configuring-an-openviking-provider","264":"/memory-providers/openviking.html#assigning-an-openviking-provider-to-a-bot","265":"/memory-providers/openviking.html#usage","266":"/memory-providers/#memory-providers","267":"/memory-providers/#available-providers","268":"/memory-providers/#basic-flow","269":"/memory-providers/#next-steps","270":"/memory-providers/builtin.html#built-in-memory-provider","271":"/memory-providers/builtin.html#memory-modes","272":"/memory-providers/builtin.html#how-sparse-mode-works","273":"/memory-providers/builtin.html#creating-a-built-in-provider","274":"/memory-providers/builtin.html#configuring-a-built-in-provider","275":"/memory-providers/builtin.html#managing-providers","276":"/memory-providers/builtin.html#infrastructure-requirements","277":"/memory-providers/builtin.html#off-mode","278":"/memory-providers/builtin.html#sparse-mode","279":"/memory-providers/builtin.html#dense-mode","280":"/memory-providers/builtin.html#assigning-a-memory-provider-to-a-bot","281":"/memory-providers/builtin.html#using-memory-after-setup","282":"/tts-providers/edge.html#edge-tts","283":"/tts-providers/edge.html#creating-an-edge-tts-provider","284":"/tts-providers/edge.html#configuring-the-model","285":"/tts-providers/edge.html#assigning-to-a-bot","286":"/tts-providers/edge.html#testing","287":"/tts-providers/#tts-providers","288":"/tts-providers/#basic-flow","289":"/tts-providers/#available-providers","290":"/tts-providers/#next-steps"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[2,1,1],"1":[4,2,58],"2":[2,2,1],"3":[3,4,29],"4":[5,4,33],"5":[2,4,42],"6":[2,4,48],"7":[3,4,55],"8":[2,4,132],"9":[1,4,50],"10":[2,4,51],"11":[4,4,42],"12":[3,4,40],"13":[2,4,22],"14":[2,4,27],"15":[2,4,47],"16":[1,2,28],"17":[12,1,1],"18":[1,12,74],"19":[2,12,215],"20":[1,12,29],"21":[1,12,54],"22":[1,12,65],"23":[1,12,104],"24":[3,12,83],"25":[1,12,62],"26":[1,1,12],"27":[3,1,16],"28":[6,3,28],"29":[5,3,19],"30":[8,3,42],"31":[4,3,23],"32":[2,3,25],"33":[4,1,24],"34":[6,4,34],"35":[5,4,13],"36":[4,4,31],"37":[7,4,56],"38":[5,4,30],"39":[2,1,88],"40":[3,2,54],"41":[3,1,31],"42":[7,3,74],"43":[4,3,67],"44":[5,3,31],"45":[2,3,49],"46":[2,3,6],"47":[3,1,16],"48":[6,3,46],"49":[4,3,37],"50":[7,3,44],"51":[2,3,36],"52":[2,3,6],"53":[3,1,28],"54":[6,3,55],"55":[4,3,30],"56":[7,3,53],"57":[2,3,35],"58":[4,1,17],"59":[6,4,26],"60":[4,4,44],"61":[4,4,27],"62":[2,4,26],"63":[2,4,6],"64":[3,1,24],"65":[7,3,19],"66":[6,3,55],"67":[4,3,20],"68":[2,3,11],"69":[2,3,29],"70":[3,1,35],"71":[1,3,1],"72":[2,4,46],"73":[2,4,54],"74":[2,4,19],"75":[3,4,56],"76":[2,3,12],"77":[2,4,60],"78":[2,4,26],"79":[2,4,49],"80":[1,3,1],"81":[6,4,19],"82":[5,4,26],"83":[5,4,27],"84":[3,4,31],"85":[3,4,27],"86":[2,1,34],"87":[3,2,32],"88":[3,2,22],"89":[2,4,95],"90":[6,2,82],"91":[3,2,116],"92":[2,2,25],"93":[3,2,44],"94":[2,1,45],"95":[3,2,45],"96":[4,2,27],"97":[4,2,81],"98":[2,5,15],"99":[6,2,33],"100":[2,2,55],"101":[3,2,47],"102":[2,2,27],"103":[2,1,18],"104":[3,2,30],"105":[2,2,14],"106":[2,3,27],"107":[2,2,1],"108":[4,4,24],"109":[3,4,33],"110":[5,4,32],"111":[6,4,21],"112":[1,2,20],"113":[2,1,38],"114":[4,2,58],"115":[1,2,48],"116":[2,2,52],"117":[2,2,42],"118":[2,3,12],"119":[3,2,59],"120":[2,2,13],"121":[3,1,35],"122":[4,3,30],"123":[1,3,16],"124":[2,4,52],"125":[2,3,46],"126":[1,3,32],"127":[3,4,18],"128":[3,4,17],"129":[2,4,23],"130":[4,3,16],"131":[1,7,21],"132":[1,7,21],"133":[1,7,29],"134":[2,3,37],"135":[4,1,18],"136":[6,4,28],"137":[2,4,13],"138":[3,5,38],"139":[3,4,15],"140":[3,5,41],"141":[3,4,34],"142":[2,4,45],"143":[3,1,24],"144":[1,3,17],"145":[3,4,31],"146":[2,4,42],"147":[3,3,17],"148":[2,6,39],"149":[1,6,20],"150":[4,3,36],"151":[2,1,24],"152":[3,2,38],"153":[1,2,41],"154":[3,2,46],"155":[2,5,29],"156":[2,2,36],"157":[2,1,21],"158":[4,2,25],"159":[2,2,11],"160":[5,4,54],"161":[5,4,36],"162":[2,2,56],"163":[1,2,53],"164":[2,2,51],"165":[2,2,32],"166":[3,1,22],"167":[1,3,42],"168":[3,3,46],"169":[1,3,14],"170":[3,4,25],"171":[4,4,25],"172":[4,3,57],"173":[1,3,49],"174":[1,3,40],"175":[2,3,28],"176":[2,3,48],"177":[4,1,16],"178":[2,4,27],"179":[3,4,46],"180":[2,4,38],"181":[2,4,36],"182":[2,4,33],"183":[1,4,31],"184":[3,4,88],"185":[2,4,16],"186":[2,4,16],"187":[2,1,33],"188":[4,2,37],"189":[2,2,77],"190":[3,2,67],"191":[2,2,31],"192":[2,2,8],"193":[5,4,46],"194":[3,4,42],"195":[2,2,48],"196":[3,2,52],"197":[2,1,23],"198":[4,2,28],"199":[3,2,53],"200":[2,2,1],"201":[5,4,44],"202":[3,4,21],"203":[6,2,22],"204":[2,2,35],"205":[1,1,36],"206":[3,1,43],"207":[2,1,71],"208":[6,1,19],"209":[8,7,55],"210":[4,7,38],"211":[2,1,1],"212":[2,2,34],"213":[2,2,15],"214":[2,2,15],"215":[6,1,63],"216":[2,1,23],"217":[4,2,27],"218":[3,5,37],"219":[2,2,15],"220":[3,3,22],"221":[3,3,23],"222":[4,2,35],"223":[2,1,46],"224":[2,2,45],"225":[2,2,41],"226":[1,2,33],"227":[2,2,1],"228":[2,3,11],"229":[2,3,14],"230":[5,2,31],"231":[5,2,14],"232":[7,2,46],"233":[5,2,20],"234":[5,2,13],"235":[5,2,13],"236":[5,2,13],"237":[5,2,25],"238":[5,2,10],"239":[5,2,15],"240":[5,2,9],"241":[5,2,28],"242":[3,2,24],"243":[2,1,51],"244":[1,2,36],"245":[2,1,45],"246":[2,2,62],"247":[2,4,143],"248":[1,2,5],"249":[5,2,112],"250":[2,2,97],"251":[3,4,48],"252":[2,2,37],"253":[2,2,94],"254":[2,2,33],"255":[2,2,58],"256":[3,1,28],"257":[4,3,25],"258":[4,3,44],"259":[6,3,24],"260":[1,3,28],"261":[3,1,26],"262":[4,3,25],"263":[4,3,36],"264":[7,3,24],"265":[1,3,28],"266":[2,1,33],"267":[2,2,44],"268":[2,2,31],"269":[2,2,28],"270":[4,1,44],"271":[2,4,38],"272":[4,5,58],"273":[5,4,25],"274":[5,4,46],"275":[2,6,15],"276":[2,4,1],"277":[2,6,15],"278":[2,6,44],"279":[2,6,30],"280":[6,4,37],"281":[4,4,38],"282":[2,1,26],"283":[5,2,25],"284":[3,2,58],"285":[4,2,24],"286":[1,2,26],"287":[2,1,64],"288":[2,2,48],"289":[2,2,21],"290":[2,2,12]},"averageFieldLength":[3.0171821305841933,3.0859106529209623,35.98281786941583],"storedFields":{"0":{"title":"About Memoh","titles":[]},"1":{"title":"What is Memoh?","titles":["About Memoh"]},"2":{"title":"Key Features","titles":["About Memoh"]},"3":{"title":"Multi-Bot Management","titles":["About Memoh","Key Features"]},"4":{"title":"Multi-User & Identity Recognition","titles":["About Memoh","Key Features"]},"5":{"title":"Containerized Isolation","titles":["About Memoh","Key Features"]},"6":{"title":"Memory Engineering","titles":["About Memoh","Key Features"]},"7":{"title":"Multi-Platform Support","titles":["About Memoh","Key Features"]},"8":{"title":"Agent Capabilities","titles":["About Memoh","Key Features"]},"9":{"title":"Sessions","titles":["About Memoh","Key Features"]},"10":{"title":"Slash Commands","titles":["About Memoh","Key Features"]},"11":{"title":"Multi-LLM Provider Support","titles":["About Memoh","Key Features"]},"12":{"title":"MCP Protocol Support","titles":["About Memoh","Key Features"]},"13":{"title":"Scheduled Tasks","titles":["About Memoh","Key Features"]},"14":{"title":"Memory Compaction","titles":["About Memoh","Key Features"]},"15":{"title":"Graphical Configuration","titles":["About Memoh","Key Features"]},"16":{"title":"Installation","titles":["About Memoh"]},"17":{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","titles":[]},"18":{"title":"Overview","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"19":{"title":"Story Time","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"20":{"title":"What","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"21":{"title":"Why","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"22":{"title":"How","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"23":{"title":"Features","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"24":{"title":"Compare to OpenClaw","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"25":{"title":"Conclusion","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"26":{"title":"Blogs","titles":[]},"27":{"title":"Discord Channel Configuration","titles":[]},"28":{"title":"Step 1: Create a Discord Application","titles":["Discord Channel Configuration"]},"29":{"title":"Step 2: Configure Bot Settings","titles":["Discord Channel Configuration"]},"30":{"title":"Step 3: Invite the Bot to Your Server","titles":["Discord Channel Configuration"]},"31":{"title":"Step 4: Configure Memoh","titles":["Discord Channel Configuration"]},"32":{"title":"Features Supported","titles":["Discord Channel Configuration"]},"33":{"title":"Feishu (Lark) Channel Configuration","titles":[]},"34":{"title":"Step 1: Create a Feishu App","titles":["Feishu (Lark) Channel Configuration"]},"35":{"title":"Step 2: Enable Bot Capability","titles":["Feishu (Lark) Channel Configuration"]},"36":{"title":"Step 3: Configure Permissions","titles":["Feishu (Lark) Channel Configuration"]},"37":{"title":"Step 4: Configure Events (Webhook Mode)","titles":["Feishu (Lark) Channel Configuration"]},"38":{"title":"Step 5: Publish Your App","titles":["Feishu (Lark) Channel Configuration"]},"39":{"title":"Channels Overview","titles":[]},"40":{"title":"General Setup Flow","titles":["Channels Overview"]},"41":{"title":"Matrix Channel Configuration","titles":[]},"42":{"title":"Step 1: Create a Matrix Bot Account","titles":["Matrix Channel Configuration"]},"43":{"title":"Step 2: Configure Memoh","titles":["Matrix Channel Configuration"]},"44":{"title":"Step 3: Invite the Bot","titles":["Matrix Channel Configuration"]},"45":{"title":"Features Supported","titles":["Matrix Channel Configuration"]},"46":{"title":"Official Resources","titles":["Matrix Channel Configuration"]},"47":{"title":"QQ Channel Configuration","titles":[]},"48":{"title":"Step 1: Create a QQ Bot","titles":["QQ Channel Configuration"]},"49":{"title":"Step 2: Configure Memoh","titles":["QQ Channel Configuration"]},"50":{"title":"Step 3: Bind Your Identity (Optional)","titles":["QQ Channel Configuration"]},"51":{"title":"Features Supported","titles":["QQ Channel Configuration"]},"52":{"title":"Official Resources","titles":["QQ Channel Configuration"]},"53":{"title":"Telegram Channel Configuration","titles":[]},"54":{"title":"Step 1: Create a Telegram Bot","titles":["Telegram Channel Configuration"]},"55":{"title":"Step 2: Configure Memoh","titles":["Telegram Channel Configuration"]},"56":{"title":"Step 3: Bind Your Identity (Optional)","titles":["Telegram Channel Configuration"]},"57":{"title":"Features Supported","titles":["Telegram Channel Configuration"]},"58":{"title":"WeCom (WeWork) Channel Configuration","titles":[]},"59":{"title":"Step 1: Create a WeCom Bot","titles":["WeCom (WeWork) Channel Configuration"]},"60":{"title":"Step 2: Configure Memoh","titles":["WeCom (WeWork) Channel Configuration"]},"61":{"title":"Step 3: Start Chatting","titles":["WeCom (WeWork) Channel Configuration"]},"62":{"title":"Features Supported","titles":["WeCom (WeWork) Channel Configuration"]},"63":{"title":"Official Resources","titles":["WeCom (WeWork) Channel Configuration"]},"64":{"title":"WeChat Channel Configuration","titles":[]},"65":{"title":"Step 1: Add WeChat Channel in Memoh","titles":["WeChat Channel Configuration"]},"66":{"title":"Step 2: Scan the QR Code","titles":["WeChat Channel Configuration"]},"67":{"title":"Step 3: Start Chatting","titles":["WeChat Channel Configuration"]},"68":{"title":"Optional Settings","titles":["WeChat Channel Configuration"]},"69":{"title":"Features Supported","titles":["WeChat Channel Configuration"]},"70":{"title":"Bot Access Control","titles":[]},"71":{"title":"Concepts","titles":["Bot Access Control"]},"72":{"title":"Default Effect","titles":["Bot Access Control","Concepts"]},"73":{"title":"Subject Types","titles":["Bot Access Control","Concepts"]},"74":{"title":"Rule Effects","titles":["Bot Access Control","Concepts"]},"75":{"title":"Priority-Based Evaluation","titles":["Bot Access Control","Concepts"]},"76":{"title":"Managing Access","titles":["Bot Access Control"]},"77":{"title":"Adding Rules","titles":["Bot Access Control","Managing Access"]},"78":{"title":"Reordering Rules","titles":["Bot Access Control","Managing Access"]},"79":{"title":"Source Scope","titles":["Bot Access Control","Managing Access"]},"80":{"title":"Examples","titles":["Bot Access Control"]},"81":{"title":"Open Bot (Anyone Can Chat)","titles":["Bot Access Control","Examples"]},"82":{"title":"Private Bot with Selected Users","titles":["Bot Access Control","Examples"]},"83":{"title":"Open Bot with Blocked Users","titles":["Bot Access Control","Examples"]},"84":{"title":"Platform-Specific Access","titles":["Bot Access Control","Examples"]},"85":{"title":"Channel-Scoped Access","titles":["Bot Access Control","Examples"]},"86":{"title":"Bot Management","titles":[]},"87":{"title":"Creating a Bot","titles":["Bot Management"]},"88":{"title":"Bot Detail Page","titles":["Bot Management"]},"89":{"title":"Tab Overview","titles":["Bot Management","Bot Detail Page"]},"90":{"title":"Configuring the Bot\'s Core Settings","titles":["Bot Management"]},"91":{"title":"General Tab Reference","titles":["Bot Management"]},"92":{"title":"Terminal Tab","titles":["Bot Management"]},"93":{"title":"Deleting a Bot","titles":["Bot Management"]},"94":{"title":"Browser Contexts","titles":[]},"95":{"title":"Concept: Browser Gateway","titles":["Browser Contexts"]},"96":{"title":"Creating a Browser Context","titles":["Browser Contexts"]},"97":{"title":"Configuring a Browser Context","titles":["Browser Contexts"]},"98":{"title":"Managing Contexts","titles":["Browser Contexts","Configuring a Browser Context"]},"99":{"title":"Assigning a Browser Context to a Bot","titles":["Browser Contexts"]},"100":{"title":"Bot Interaction","titles":["Browser Contexts"]},"101":{"title":"Browser Core Selection","titles":["Browser Contexts"]},"102":{"title":"Next Steps","titles":["Browser Contexts"]},"103":{"title":"Bot Channels","titles":[]},"104":{"title":"Concept: Unified Communication","titles":["Bot Channels"]},"105":{"title":"Supported Channels","titles":["Bot Channels"]},"106":{"title":"Platform Guides","titles":["Bot Channels","Supported Channels"]},"107":{"title":"Configuration Flow","titles":["Bot Channels"]},"108":{"title":"1. Adding a Channel","titles":["Bot Channels","Configuration Flow"]},"109":{"title":"2. Common Fields","titles":["Bot Channels","Configuration Flow"]},"110":{"title":"3. Special Case: Feishu Webhook","titles":["Bot Channels","Configuration Flow"]},"111":{"title":"4. Special Case: WeChat QR Code","titles":["Bot Channels","Configuration Flow"]},"112":{"title":"Operations","titles":["Bot Channels"]},"113":{"title":"Memory Compaction","titles":[]},"114":{"title":"Concept: Why Compact?","titles":["Memory Compaction"]},"115":{"title":"Configuration","titles":["Memory Compaction"]},"116":{"title":"Manual Compaction","titles":["Memory Compaction"]},"117":{"title":"Compaction Logs","titles":["Memory Compaction"]},"118":{"title":"Managing Logs","titles":["Memory Compaction","Compaction Logs"]},"119":{"title":"Relationship to Memory","titles":["Memory Compaction"]},"120":{"title":"Next Steps","titles":["Memory Compaction"]},"121":{"title":"Bot Container Management","titles":[]},"122":{"title":"Concept: The Isolated Workspace","titles":["Bot Container Management"]},"123":{"title":"Operations","titles":["Bot Container Management"]},"124":{"title":"Lifecycle Actions","titles":["Bot Container Management","Operations"]},"125":{"title":"Container Information","titles":["Bot Container Management"]},"126":{"title":"Snapshots","titles":["Bot Container Management"]},"127":{"title":"Creating a Snapshot","titles":["Bot Container Management","Snapshots"]},"128":{"title":"Restoring a Snapshot","titles":["Bot Container Management","Snapshots"]},"129":{"title":"Managing Snapshots","titles":["Bot Container Management","Snapshots"]},"130":{"title":"Data Export and Import","titles":["Bot Container Management"]},"131":{"title":"Export","titles":["Bot Container Management","Data Export and Import"]},"132":{"title":"Import","titles":["Bot Container Management","Data Export and Import"]},"133":{"title":"Restore","titles":["Bot Container Management","Data Export and Import"]},"134":{"title":"Container Versioning","titles":["Bot Container Management"]},"135":{"title":"Email Providers and Bindings","titles":[]},"136":{"title":"Concept: Email as a Bot Channel","titles":["Email Providers and Bindings"]},"137":{"title":"Email Provider","titles":["Email Providers and Bindings"]},"138":{"title":"Creating a Provider","titles":["Email Providers and Bindings","Email Provider"]},"139":{"title":"Bot Email Bindings","titles":["Email Providers and Bindings"]},"140":{"title":"Adding a Binding","titles":["Email Providers and Bindings","Bot Email Bindings"]},"141":{"title":"Outbox and History","titles":["Email Providers and Bindings"]},"142":{"title":"Bot Interaction","titles":["Email Providers and Bindings"]},"143":{"title":"Bot Files Management","titles":[]},"144":{"title":"Operations","titles":["Bot Files Management"]},"145":{"title":"Browsing and Navigation","titles":["Bot Files Management","Operations"]},"146":{"title":"Managing Files","titles":["Bot Files Management","Operations"]},"147":{"title":"Viewing and Editing","titles":["Bot Files Management"]},"148":{"title":"Text Files","titles":["Bot Files Management","Viewing and Editing"]},"149":{"title":"Images","titles":["Bot Files Management","Viewing and Editing"]},"150":{"title":"Bot Interaction with Files","titles":["Bot Files Management"]},"151":{"title":"Bot Heartbeat","titles":[]},"152":{"title":"Concept: Scheduled Autonomy","titles":["Bot Heartbeat"]},"153":{"title":"Configuration","titles":["Bot Heartbeat"]},"154":{"title":"Logs and Monitoring","titles":["Bot Heartbeat"]},"155":{"title":"Managing Logs","titles":["Bot Heartbeat","Logs and Monitoring"]},"156":{"title":"Bot Interaction","titles":["Bot Heartbeat"]},"157":{"title":"MCP Connections","titles":[]},"158":{"title":"Concept: Extending Bot Capabilities","titles":["MCP Connections"]},"159":{"title":"Connection Types","titles":["MCP Connections"]},"160":{"title":"1. Stdio (Local Process)","titles":["MCP Connections","Connection Types"]},"161":{"title":"2. Remote (HTTP/SSE)","titles":["MCP Connections","Connection Types"]},"162":{"title":"OAuth Authentication","titles":["MCP Connections"]},"163":{"title":"Operations","titles":["MCP Connections"]},"164":{"title":"Tool Discovery","titles":["MCP Connections"]},"165":{"title":"Bot Interaction","titles":["MCP Connections"]},"166":{"title":"Bot Memory Management","titles":[]},"167":{"title":"Prerequisites","titles":["Bot Memory Management"]},"168":{"title":"Concept: Memory Retrieval","titles":["Bot Memory Management"]},"169":{"title":"Operations","titles":["Bot Memory Management"]},"170":{"title":"1. Creating Memories","titles":["Bot Memory Management","Operations"]},"171":{"title":"2. Searching and Managing","titles":["Bot Memory Management","Operations"]},"172":{"title":"Memory Compression (Compact)","titles":["Bot Memory Management"]},"173":{"title":"Rebuild","titles":["Bot Memory Management"]},"174":{"title":"Status","titles":["Bot Memory Management"]},"175":{"title":"Usage Statistics","titles":["Bot Memory Management"]},"176":{"title":"Bot Interaction","titles":["Bot Memory Management"]},"177":{"title":"LLM Provider and Model","titles":[]},"178":{"title":"LLM Provider","titles":["LLM Provider and Model"]},"179":{"title":"Creating a Provider","titles":["LLM Provider and Model","LLM Provider"]},"180":{"title":"OAuth Authentication","titles":["LLM Provider and Model","LLM Provider"]},"181":{"title":"Import Models","titles":["LLM Provider and Model","LLM Provider"]},"182":{"title":"Managing Providers","titles":["LLM Provider and Model","LLM Provider"]},"183":{"title":"Model","titles":["LLM Provider and Model"]},"184":{"title":"Adding a Model","titles":["LLM Provider and Model","Model"]},"185":{"title":"Managing Models","titles":["LLM Provider and Model","Model"]},"186":{"title":"Next Steps","titles":["LLM Provider and Model"]},"187":{"title":"Scheduled Tasks","titles":[]},"188":{"title":"Concept: Cron-Based Automation","titles":["Scheduled Tasks"]},"189":{"title":"Schedule Fields","titles":["Scheduled Tasks"]},"190":{"title":"Cron Pattern Reference","titles":["Scheduled Tasks"]},"191":{"title":"Viewing Schedules","titles":["Scheduled Tasks"]},"192":{"title":"Creating Schedules","titles":["Scheduled Tasks"]},"193":{"title":"Via the Bot (Conversational)","titles":["Scheduled Tasks","Creating Schedules"]},"194":{"title":"Via the API","titles":["Scheduled Tasks","Creating Schedules"]},"195":{"title":"Execution Flow","titles":["Scheduled Tasks"]},"196":{"title":"Schedule vs. Heartbeat","titles":["Scheduled Tasks"]},"197":{"title":"Search Providers","titles":[]},"198":{"title":"Concept: Real-Time Knowledge","titles":["Search Providers"]},"199":{"title":"Supported Search Engines","titles":["Search Providers"]},"200":{"title":"Configuration Flow","titles":["Search Providers"]},"201":{"title":"1. Adding a Search Provider","titles":["Search Providers","Configuration Flow"]},"202":{"title":"2. Managing Providers","titles":["Search Providers","Configuration Flow"]},"203":{"title":"Assigning a Search Provider to a Bot","titles":["Search Providers"]},"204":{"title":"Bot Interaction","titles":["Search Providers"]},"205":{"title":"Sessions","titles":[]},"206":{"title":"Concept: Conversation Isolation","titles":["Sessions"]},"207":{"title":"Session Types","titles":["Sessions"]},"208":{"title":"Starting a New Session with /new","titles":["Sessions"]},"209":{"title":"In External Channels (Telegram, Discord, Feishu, etc.)","titles":["Sessions","Starting a New Session with /new"]},"210":{"title":"In the Web UI","titles":["Sessions","Starting a New Session with /new"]},"211":{"title":"Managing Sessions","titles":["Sessions"]},"212":{"title":"Viewing Sessions","titles":["Sessions","Managing Sessions"]},"213":{"title":"Renaming Sessions","titles":["Sessions","Managing Sessions"]},"214":{"title":"Deleting Sessions","titles":["Sessions","Managing Sessions"]},"215":{"title":"How Sessions Relate to Other Features","titles":["Sessions"]},"216":{"title":"Bot Skills","titles":[]},"217":{"title":"Concept: Skills as Markdown","titles":["Bot Skills"]},"218":{"title":"Example Skill Structure","titles":["Bot Skills","Concept: Skills as Markdown"]},"219":{"title":"Managing Skills","titles":["Bot Skills"]},"220":{"title":"Adding a Skill","titles":["Bot Skills","Managing Skills"]},"221":{"title":"Editing and Deleting","titles":["Bot Skills","Managing Skills"]},"222":{"title":"How Bots Use Skills","titles":["Bot Skills"]},"223":{"title":"Slash Commands","titles":[]},"224":{"title":"Quick Reference","titles":["Slash Commands"]},"225":{"title":"Command Format","titles":["Slash Commands"]},"226":{"title":"Permissions","titles":["Slash Commands"]},"227":{"title":"Global Commands","titles":["Slash Commands"]},"228":{"title":"/help","titles":["Slash Commands","Global Commands"]},"229":{"title":"/new","titles":["Slash Commands","Global Commands"]},"230":{"title":"/schedule — Manage Scheduled Tasks","titles":["Slash Commands"]},"231":{"title":"/mcp — Manage MCP Connections","titles":["Slash Commands"]},"232":{"title":"/settings — View and Update Bot Settings","titles":["Slash Commands"]},"233":{"title":"/model — Manage Bot Models","titles":["Slash Commands"]},"234":{"title":"/memory — Manage Memory Provider","titles":["Slash Commands"]},"235":{"title":"/search — Manage Search Provider","titles":["Slash Commands"]},"236":{"title":"/browser — Manage Browser Context","titles":["Slash Commands"]},"237":{"title":"/usage — View Token Usage","titles":["Slash Commands"]},"238":{"title":"/email — View Email Configuration","titles":["Slash Commands"]},"239":{"title":"/heartbeat — View Heartbeat Logs","titles":["Slash Commands"]},"240":{"title":"/skill — View Bot Skills","titles":["Slash Commands"]},"241":{"title":"/fs — Browse Container Filesystem","titles":["Slash Commands"]},"242":{"title":"Mention-Prefixed Commands","titles":["Slash Commands"]},"243":{"title":"Memoh Documentation","titles":[]},"244":{"title":"Documentation","titles":["Memoh Documentation"]},"245":{"title":"Docker Installation","titles":[]},"246":{"title":"Service Architecture","titles":["Docker Installation"]},"247":{"title":"Sparse Service","titles":["Docker Installation","Service Architecture"]},"248":{"title":"Prerequisites","titles":["Docker Installation"]},"249":{"title":"One-Click Install (Recommended)","titles":["Docker Installation"]},"250":{"title":"Manual Install","titles":["Docker Installation"]},"251":{"title":"China Mainland Mirror","titles":["Docker Installation","Manual Install"]},"252":{"title":"Access Points","titles":["Docker Installation"]},"253":{"title":"Configuration Reference","titles":["Docker Installation"]},"254":{"title":"Common Commands","titles":["Docker Installation"]},"255":{"title":"Environment Variables","titles":["Docker Installation"]},"256":{"title":"Mem0 Memory Provider","titles":[]},"257":{"title":"Creating a Mem0 Provider","titles":["Mem0 Memory Provider"]},"258":{"title":"Configuring a Mem0 Provider","titles":["Mem0 Memory Provider"]},"259":{"title":"Assigning a Mem0 Provider to a Bot","titles":["Mem0 Memory Provider"]},"260":{"title":"Usage","titles":["Mem0 Memory Provider"]},"261":{"title":"OpenViking Memory Provider","titles":[]},"262":{"title":"Creating an OpenViking Provider","titles":["OpenViking Memory Provider"]},"263":{"title":"Configuring an OpenViking Provider","titles":["OpenViking Memory Provider"]},"264":{"title":"Assigning an OpenViking Provider to a Bot","titles":["OpenViking Memory Provider"]},"265":{"title":"Usage","titles":["OpenViking Memory Provider"]},"266":{"title":"Memory Providers","titles":[]},"267":{"title":"Available Providers","titles":["Memory Providers"]},"268":{"title":"Basic Flow","titles":["Memory Providers"]},"269":{"title":"Next Steps","titles":["Memory Providers"]},"270":{"title":"Built-in Memory Provider","titles":[]},"271":{"title":"Memory Modes","titles":["Built-in Memory Provider"]},"272":{"title":"How Sparse Mode Works","titles":["Built-in Memory Provider","Memory Modes"]},"273":{"title":"Creating a Built-in Provider","titles":["Built-in Memory Provider"]},"274":{"title":"Configuring a Built-in Provider","titles":["Built-in Memory Provider"]},"275":{"title":"Managing Providers","titles":["Built-in Memory Provider","Configuring a Built-in Provider"]},"276":{"title":"Infrastructure Requirements","titles":["Built-in Memory Provider"]},"277":{"title":"Off Mode","titles":["Built-in Memory Provider","Infrastructure Requirements"]},"278":{"title":"Sparse Mode","titles":["Built-in Memory Provider","Infrastructure Requirements"]},"279":{"title":"Dense Mode","titles":["Built-in Memory Provider","Infrastructure Requirements"]},"280":{"title":"Assigning a Memory Provider to a Bot","titles":["Built-in Memory Provider"]},"281":{"title":"Using Memory After Setup","titles":["Built-in Memory Provider"]},"282":{"title":"Edge TTS","titles":[]},"283":{"title":"Creating an Edge TTS Provider","titles":["Edge TTS"]},"284":{"title":"Configuring the Model","titles":["Edge TTS"]},"285":{"title":"Assigning to a Bot","titles":["Edge TTS"]},"286":{"title":"Testing","titles":["Edge TTS"]},"287":{"title":"TTS Providers","titles":[]},"288":{"title":"Basic Flow","titles":["TTS Providers"]},"289":{"title":"Available Providers","titles":["TTS Providers"]},"290":{"title":"Next Steps","titles":["TTS Providers"]}},"dirtCount":0,"index":[["=",{"2":{"251":1,"278":2,"279":1}}],["~",{"2":{"249":2}}],["|",{"2":{"249":6}}],["ˈmemoʊ",{"2":{"243":1}}],["7",{"2":{"237":1}}],["`run",{"2":{"218":1}}],["`edit",{"2":{"218":1}}],["6334",{"2":{"278":1,"279":1}}],["6",{"2":{"190":1,"249":3,"255":1}}],["│",{"2":{"190":15}}],["┌─────────────",{"2":{"190":5}}],["96kbitrate",{"2":{"284":1}}],["9",{"2":{"189":2,"190":2,"225":1,"230":1}}],["8088",{"2":{"263":1}}],["8083",{"2":{"252":1}}],["8080",{"2":{"252":1,"253":1}}],["8082",{"2":{"252":1}}],["8085",{"2":{"247":1,"278":1}}],["8",{"2":{"116":1,"172":1,"190":3,"193":1,"194":1}}],["00",{"2":{"189":1,"190":3}}],["0",{"2":{"116":3,"172":3,"189":1,"190":9,"194":1,"225":1,"230":1,"249":3,"255":1,"284":5}}],["zh",{"2":{"97":1,"232":1}}],["zone",{"2":{"89":1,"93":1}}],["→",{"2":{"75":2,"79":3}}],["企业微信",{"2":{"58":1}}],["创建机器人",{"2":{"48":1}}],["x26",{"2":{"254":2}}],["x3c",{"2":{"42":3}}],["x",{"2":{"42":1}}],["50+",{"2":{"282":1,"284":1,"289":1}}],["59",{"2":{"190":1}}],["5",{"0":{"38":1},"2":{"48":1,"116":1,"172":1,"284":1}}],["48kbitrate",{"2":{"284":1}}],["4o",{"2":{"183":1,"184":1,"233":2}}],["4",{"0":{"31":1,"37":1,"111":1}}],["16bit",{"2":{"284":1}}],["100",{"2":{"284":1}}],["10",{"2":{"239":1}}],["12",{"2":{"190":1}}],["123456789",{"2":{"54":1}}],["1536",{"2":{"184":1}}],["1",{"0":{"28":1,"34":1,"42":1,"48":1,"54":1,"59":1,"65":1,"108":1,"160":1,"170":1,"201":1},"2":{"190":4,"252":1,"284":1}}],["jwt",{"2":{"249":2,"250":1,"253":1}}],["jina",{"2":{"199":1}}],["jpg",{"2":{"149":1}}],["js",{"2":{"148":1}}],["json",{"2":{"42":1,"163":3,"194":1,"253":1}}],["join",{"2":{"27":1,"41":1,"43":2,"44":2,"45":1}}],["jobs",{"2":{"24":1}}],["just",{"2":{"19":1,"64":1,"142":1}}],["known",{"2":{"126":1}}],["know",{"2":{"50":1,"56":1}}],["knowledge",{"0":{"198":1},"2":{"20":1,"102":1,"176":1,"197":1}}],["kinds",{"2":{"73":1,"207":1}}],["kind",{"2":{"19":1}}],["kept",{"2":{"18":1}}],["keeping",{"2":{"113":1}}],["keep",{"2":{"14":1,"19":1,"25":2,"42":1,"54":1,"155":1}}],["keys",{"2":{"109":1,"176":1}}],["keyword",{"2":{"6":1,"247":1,"272":1}}],["key",{"0":{"2":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"6":1,"66":1,"138":1,"160":1,"179":1,"180":1,"182":1,"201":1,"244":1,"247":1,"253":1,"258":2,"263":2,"267":1,"272":1,"282":1,"289":1}}],["yml",{"2":{"250":1,"251":2}}],["yaml",{"2":{"217":1,"218":1,"222":1}}],["yandex",{"2":{"199":1}}],["y",{"2":{"160":1,"249":1}}],["yet",{"2":{"90":1,"102":1}}],["yes",{"2":{"43":3,"60":2,"184":5,"258":1,"263":1}}],["year",{"2":{"18":1,"19":1}}],["yourself",{"2":{"256":1}}],["yours",{"2":{"25":1}}],["your",{"0":{"30":1,"38":1,"50":1,"56":1},"2":{"1":1,"15":1,"19":1,"20":1,"23":1,"27":1,"30":1,"31":2,"33":1,"34":1,"36":1,"37":2,"39":3,"40":2,"41":2,"42":2,"43":2,"44":1,"47":1,"48":1,"49":2,"50":3,"53":1,"54":1,"55":2,"56":4,"58":2,"60":1,"61":1,"64":1,"65":1,"66":2,"70":1,"85":1,"90":1,"91":1,"99":1,"103":2,"105":1,"110":1,"123":1,"131":1,"132":1,"135":1,"136":1,"137":1,"139":1,"146":2,"150":1,"151":1,"157":1,"167":2,"169":1,"179":1,"186":1,"197":1,"198":1,"199":2,"201":1,"203":1,"206":1,"219":1,"243":1,"245":1,"249":1,"250":1,"254":1,"256":1,"259":1,"264":1,"280":1}}],["you",{"2":{"1":1,"19":5,"22":1,"25":1,"30":1,"39":1,"42":1,"50":2,"53":1,"54":2,"56":2,"66":1,"70":1,"79":1,"88":2,"90":1,"98":1,"99":1,"102":1,"103":1,"104":1,"116":1,"126":1,"133":1,"140":1,"143":1,"147":1,"151":2,"157":1,"162":2,"164":2,"173":3,"177":1,"186":2,"187":1,"190":1,"193":1,"194":1,"197":1,"201":1,"203":1,"206":2,"209":4,"210":1,"214":1,"215":1,"218":2,"222":1,"242":1,"245":1,"247":2,"250":1,"251":1,"259":1,"264":1,"275":1,"280":1,"281":1,"287":1}}],["256",{"2":{"284":1}}],["256+",{"2":{"282":1,"289":1}}],["2000",{"2":{"241":1}}],["20",{"2":{"190":1}}],["2026",{"2":{"18":1,"26":1}}],["23",{"2":{"190":1}}],["2",{"0":{"29":1,"35":1,"43":1,"49":1,"55":1,"60":1,"66":1,"109":1,"161":1,"171":1,"202":1},"2":{"252":1,"284":1}}],["24khz",{"2":{"284":3}}],["24",{"2":{"6":1,"23":1}}],["32",{"2":{"250":1}}],["31",{"2":{"190":1}}],["30",{"2":{"43":1,"153":1,"190":2,"232":1}}],["3",{"0":{"30":1,"36":1,"44":1,"50":1,"56":1,"61":1,"67":1,"110":1},"2":{"15":1,"116":1,"172":1,"183":1,"246":1,"284":1}}],["null",{"2":{"194":1}}],["number",{"2":{"116":1,"125":1,"172":1,"175":1,"189":2}}],["npx",{"2":{"160":1}}],["night",{"2":{"19":1}}],["navigating",{"2":{"95":1}}],["navigation",{"0":{"145":1},"2":{"8":1,"97":1,"100":1,"145":1}}],["navigate",{"2":{"59":1,"87":1,"90":1,"93":1,"96":1,"99":1,"116":1,"138":1,"179":1,"191":1,"201":1,"203":1,"257":1,"259":1,"262":1,"264":1,"273":1,"280":1,"283":1,"288":1}}],["named",{"2":{"287":1}}],["namespace",{"2":{"253":1}}],["names",{"2":{"164":1}}],["name",{"2":{"28":1,"34":1,"54":2,"87":2,"96":2,"97":2,"127":1,"163":1,"179":2,"182":1,"184":2,"189":2,"191":1,"194":1,"201":2,"212":1,"218":1,"220":1,"230":6,"231":2,"233":4,"234":1,"235":1,"236":1,"257":2,"262":2,"273":2,"274":1}}],["natural",{"2":{"18":1,"189":1,"193":1,"196":1}}],["none",{"2":{"271":1}}],["normally",{"2":{"242":1}}],["noise",{"2":{"113":1,"114":1}}],["now",{"2":{"67":1,"186":1,"285":1,"288":1}}],["node",{"2":{"19":1,"22":1}}],["notifications",{"2":{"152":1}}],["noticed",{"2":{"19":1}}],["notes",{"2":{"199":1}}],["note",{"2":{"42":1,"59":1}}],["not",{"2":{"18":1,"19":3,"22":1,"79":1,"90":1,"102":1,"167":1,"245":1,"250":1,"254":1,"280":1}}],["no",{"2":{"15":1,"16":1,"23":1,"43":2,"48":1,"60":1,"66":1,"72":1,"75":1,"81":1,"91":1,"98":1,"114":1,"171":1,"184":2,"209":1,"214":1,"247":1,"249":1,"250":1,"258":3,"263":1,"271":1,"272":1,"275":1,"277":1,"280":1,"282":1,"289":1}}],["neural",{"2":{"246":1,"247":3,"267":1,"271":1,"272":1,"278":1}}],["nerdctl",{"2":{"245":1}}],["next",{"0":{"102":1,"120":1,"186":1,"269":1,"290":1},"2":{"129":1,"185":2,"221":1}}],["needing",{"2":{"247":1}}],["needed",{"2":{"66":1,"81":1,"119":1,"171":1}}],["need",{"2":{"22":1,"54":1,"177":1,"201":1,"214":1,"245":1,"247":1,"261":1}}],["news",{"2":{"189":2,"230":3}}],["newbot",{"2":{"54":1}}],["new",{"0":{"208":2,"229":1},"1":{"209":2,"210":2},"2":{"9":2,"10":2,"19":1,"28":1,"42":1,"56":1,"59":1,"78":1,"114":1,"145":1,"170":1,"206":1,"208":1,"209":3,"210":1,"224":2,"229":1,"242":1}}],["network",{"2":{"1":1,"5":1,"23":1,"24":1,"161":1,"243":1}}],["github",{"2":{"249":1,"250":1}}],["git",{"2":{"248":1,"250":1,"255":1}}],["giving",{"2":{"206":1}}],["give",{"2":{"19":1,"24":1,"28":1,"94":1}}],["gpt",{"2":{"183":1,"184":1,"233":2}}],["gather",{"2":{"100":1}}],["gateways",{"2":{"39":1}}],["gateway",{"0":{"95":1},"2":{"29":1,"94":1,"95":1,"246":1,"252":1,"253":2}}],["global",{"0":{"227":1},"1":{"228":1,"229":1},"2":{"73":1,"199":1}}],["g",{"2":{"40":1,"42":2,"43":2,"54":3,"73":2,"116":1,"138":1,"145":1,"148":1,"149":1,"160":2,"161":1,"173":1,"179":2,"184":3,"189":3,"195":1,"201":2,"225":2,"232":1,"249":1,"255":1,"263":1,"287":2,"288":1}}],["guides",{"0":{"106":1},"2":{"40":1,"106":1,"244":1}}],["guide",{"2":{"30":1,"37":2,"53":1,"54":1,"244":1}}],["gt",{"2":{"30":1,"34":1,"35":1,"36":1,"37":1,"38":1,"50":1,"56":1,"59":1,"230":8,"231":2,"233":4,"234":1,"235":1,"236":1,"241":1}}],["going",{"2":{"223":1}}],["good",{"2":{"126":1,"247":1,"271":1}}],["google",{"2":{"8":1,"11":1,"184":1,"198":1,"199":1}}],["go",{"2":{"28":2,"30":1,"31":1,"34":2,"35":1,"36":1,"37":2,"38":1,"43":1,"48":1,"49":1,"50":1,"55":1,"56":1,"60":1,"65":1,"90":1,"99":1,"203":1,"259":1,"264":1,"280":1}}],["got",{"2":{"19":1}}],["getting",{"2":{"244":1}}],["gets",{"2":{"24":1}}],["get",{"2":{"16":1,"18":1,"54":1,"66":1,"230":2,"231":2,"232":2}}],["general",{"0":{"40":1,"91":1},"2":{"72":1,"81":1,"89":1,"90":1,"91":1,"93":1,"99":1,"115":1,"167":1,"196":1,"203":1,"259":1,"264":1,"266":1,"268":1,"280":1,"285":1,"288":1}}],["generating",{"2":{"51":1,"68":1,"69":1,"91":1}}],["generative",{"2":{"11":1,"184":1}}],["generator",{"2":{"30":1}}],["generate",{"2":{"28":1,"37":1,"50":1,"56":1,"110":1,"114":1,"249":1,"250":1}}],["generated",{"2":{"19":1,"30":1,"45":1,"212":1,"249":1}}],["generic",{"2":{"7":1,"136":1,"138":1,"196":1}}],["grounded",{"2":{"204":1}}],["grouped",{"2":{"206":1}}],["group",{"2":{"4":1,"36":1,"41":1,"45":1,"51":1,"61":1,"62":2,"77":2,"79":2,"225":1,"242":1,"250":1,"254":1}}],["groups",{"2":{"3":1,"23":1,"33":1}}],["grow",{"2":{"113":1}}],["granting",{"2":{"162":1}}],["grants",{"2":{"74":1}}],["gracefully",{"2":{"124":1}}],["grained",{"2":{"79":1}}],["grade",{"2":{"20":1}}],["graphical",{"0":{"15":1},"2":{"23":1}}],["gmail",{"2":{"7":1,"39":1}}],["+100",{"2":{"284":1}}],["+",{"2":{"6":1,"7":1,"15":1,"24":1,"247":1,"271":2,"284":1}}],["qr",{"0":{"66":1,"111":1},"2":{"64":1,"66":5,"67":1,"111":2}}],["queries",{"2":{"247":1}}],["query",{"2":{"181":1}}],["question",{"2":{"204":1}}],["questions",{"2":{"18":2}}],["quotes",{"2":{"225":1}}],["quot",{"2":{"57":2,"122":2,"142":2,"152":2,"156":4,"179":2,"189":4,"193":2,"196":2,"201":2,"216":4,"222":2,"225":4}}],["quickly",{"2":{"109":1,"145":1,"155":1,"163":2,"174":1,"247":1}}],["quick",{"0":{"224":1},"2":{"39":1}}],["quietly",{"2":{"19":1}}],["quarter",{"2":{"18":1}}],["quality",{"2":{"14":1,"114":1,"247":1,"271":2,"272":1}}],["qdrant",{"2":{"6":1,"16":1,"246":3,"247":2,"250":2,"251":1,"253":2,"271":3,"274":2,"278":4,"279":5}}],["qq",{"0":{"47":1,"48":1},"1":{"48":1,"49":1,"50":1,"51":1,"52":1},"2":{"1":1,"7":1,"39":1,"47":2,"48":2,"49":1,"50":3,"52":2,"89":1,"106":1,"243":1,"244":1}}],["voice",{"2":{"284":3,"286":1,"287":2,"288":1}}],["voices",{"2":{"282":1,"284":1,"289":1}}],["volume",{"2":{"138":1}}],["v0",{"2":{"249":1,"255":1}}],["v2",{"2":{"248":1}}],["vs",{"0":{"196":1}}],["v3",{"2":{"42":1}}],["v1",{"2":{"37":1,"179":1,"247":1,"272":1,"278":1}}],["var",{"2":{"250":1}}],["variable",{"2":{"249":1,"255":1}}],["variables",{"0":{"255":1},"2":{"160":1,"249":1}}],["various",{"2":{"23":1,"86":1,"103":1,"197":1}}],["valid",{"2":{"101":1}}],["validity",{"2":{"66":1}}],["values",{"2":{"101":1,"116":1,"225":1,"232":1}}],["value",{"2":{"18":1,"160":1,"190":1}}],["vue",{"2":{"15":1,"246":1}}],["video",{"2":{"184":1}}],["visual",{"2":{"15":1,"51":1,"69":1,"149":1}}],["visualization",{"2":{"15":1}}],["viewport",{"2":{"91":1,"94":1,"97":4}}],["viewing",{"0":{"147":1,"191":1,"212":1},"1":{"148":1,"149":1},"2":{"48":1,"226":1}}],["view",{"0":{"232":1,"237":1,"238":1,"239":1,"240":1},"2":{"10":2,"129":1,"155":1,"162":1,"164":1,"215":1,"224":5,"254":1}}],["via",{"0":{"193":1,"194":1},"2":{"1":1,"6":1,"7":1,"8":2,"11":1,"12":1,"32":1,"33":1,"39":4,"40":1,"41":1,"42":1,"61":1,"64":1,"79":1,"85":1,"86":1,"122":1,"124":1,"142":2,"160":1,"243":1,"245":1,"246":1,"267":1,"269":1}}],["verify",{"2":{"174":1,"182":1}}],["verification",{"2":{"37":1}}],["version=v0",{"2":{"249":2}}],["versions",{"2":{"134":1,"249":1,"255":1}}],["version",{"2":{"38":2,"134":5,"249":2,"255":1}}],["versioned",{"2":{"22":1}}],["versioning",{"0":{"134":1},"2":{"5":1,"126":1}}],["vectors",{"2":{"168":1,"247":1,"267":1,"271":1,"272":1}}],["vector",{"2":{"6":1,"22":1,"173":1,"175":1,"184":2,"246":1,"247":1,"250":1,"253":1,"271":1,"274":1,"278":1}}],["right",{"2":{"182":1,"202":1}}],["rich",{"2":{"8":1,"39":1,"51":1}}],["rule",{"0":{"74":1},"2":{"72":2,"74":1,"75":6,"77":2,"84":1,"85":1,"91":1,"188":1}}],["rules",{"0":{"77":1,"78":1},"2":{"70":1,"73":2,"75":2,"78":2,"79":1,"81":1,"82":1,"83":1,"89":1}}],["running",{"2":{"16":1,"92":1,"124":1,"125":2,"249":1,"250":1}}],["run",{"2":{"13":1,"21":1,"22":1,"23":1,"25":1,"160":1,"243":1,"245":1,"249":1}}],["runtime",{"2":{"8":1,"22":1,"90":1,"91":1,"125":1,"134":1,"168":1,"247":1,"280":1}}],["runs",{"2":{"5":1,"23":1,"115":1,"117":1,"189":1,"193":1,"215":1,"243":1,"245":1,"247":2,"272":1,"278":1}}],["root",{"2":{"179":1}}],["room",{"2":{"44":1}}],["rooms",{"2":{"41":1,"43":1,"45":2}}],["routed",{"2":{"260":1,"265":1}}],["route",{"2":{"209":1}}],["router",{"2":{"19":3,"22":2}}],["routine",{"2":{"156":1,"187":1,"196":1}}],["routing",{"2":{"109":1}}],["roadmap",{"2":{"45":1}}],["rand",{"2":{"250":1}}],["range",{"2":{"11":1,"284":1}}],["ratio",{"2":{"97":1,"116":2,"172":2}}],["ratios",{"2":{"14":1}}],["raise",{"2":{"21":1}}],["ram",{"2":{"19":1}}],["rag",{"2":{"19":1,"20":1}}],["rewriting",{"2":{"222":1}}],["retained",{"2":{"172":1}}],["retrieves",{"2":{"176":1,"266":1}}],["retrieved",{"2":{"23":1,"168":1,"274":1,"277":1}}],["retrieve",{"2":{"8":1,"146":1}}],["retrieval",{"0":{"168":1},"2":{"6":2,"14":1,"22":1,"114":1,"119":1,"168":1,"246":1,"247":3,"256":1,"270":2,"271":1,"272":1}}],["requiring",{"2":{"247":1}}],["requirements",{"0":{"276":1},"1":{"277":1,"278":1,"279":1},"2":{"270":1,"271":1}}],["require",{"2":{"162":1}}],["requires",{"2":{"77":1,"79":1,"92":1,"162":1,"204":1,"249":1,"267":1,"272":1,"278":1,"279":1,"282":1}}],["required",{"2":{"15":1,"23":1,"36":1,"43":2,"48":1,"60":2,"108":1,"138":1,"184":1,"250":1,"258":1,"263":1,"277":1,"289":1}}],["requested",{"2":{"165":1}}],["revoke",{"2":{"162":1}}],["redirected",{"2":{"162":1}}],["reducing",{"2":{"113":1,"114":1,"119":1}}],["reduces",{"2":{"14":1}}],["redundant",{"2":{"113":1,"114":1,"119":1,"172":1}}],["redundancy",{"2":{"14":1}}],["renaming",{"0":{"213":1}}],["rename",{"2":{"146":2,"210":1,"213":1}}],["rendered",{"2":{"8":1,"95":1}}],["referencing",{"2":{"209":1}}],["reference",{"0":{"91":1,"190":1,"224":1,"253":1},"2":{"10":1}}],["refresh",{"2":{"118":1,"145":1,"155":1,"164":1,"191":1}}],["relate",{"0":{"215":1}}],["relationships",{"2":{"129":1}}],["relationship",{"0":{"119":1}}],["reload",{"2":{"118":1,"145":1,"191":1}}],["relying",{"2":{"100":1}}],["relevance",{"2":{"114":1}}],["relevant",{"2":{"14":1,"113":1,"164":1,"166":1,"168":1}}],["release",{"2":{"38":2,"249":2,"255":1}}],["reusable",{"2":{"95":1}}],["reordering",{"0":{"78":1},"2":{"78":1}}],["regardless",{"2":{"50":1,"56":1,"73":1}}],["registry",{"2":{"251":2,"253":2}}],["registration",{"2":{"39":1}}],["register",{"2":{"40":1,"42":1,"193":1}}],["recent",{"2":{"239":1}}],["receiving",{"2":{"40":1,"61":1}}],["receives",{"2":{"156":1,"195":1}}],["receive",{"2":{"36":1,"37":2,"45":1,"135":1}}],["recurring",{"2":{"152":1,"187":1,"196":1}}],["recursive",{"2":{"146":1}}],["recipient",{"2":{"141":1}}],["recreating",{"2":{"133":1}}],["records",{"2":{"118":1,"155":1,"207":1}}],["recommended",{"0":{"249":1},"2":{"16":1,"199":1,"244":1,"245":1,"250":1}}],["recognition",{"0":{"4":1},"2":{"50":1,"56":1}}],["removing",{"2":{"109":1,"114":1}}],["removes",{"2":{"119":1,"214":1}}],["removed",{"2":{"117":1}}],["remove",{"2":{"93":1,"98":1,"112":1,"118":1,"124":1,"129":1,"146":1,"155":1,"162":1,"171":1,"185":1,"214":1,"221":1,"275":1}}],["remote",{"0":{"161":1},"2":{"89":1,"161":2}}],["remains",{"2":{"22":1}}],["remembers",{"2":{"90":1}}],["remember",{"2":{"4":1,"19":1,"24":1,"150":1,"166":1}}],["repository",{"2":{"249":1}}],["report",{"2":{"225":1}}],["reports",{"2":{"142":1,"187":1}}],["represented",{"2":{"217":1}}],["represents",{"2":{"178":1}}],["reproducible",{"2":{"21":1}}],["replies",{"2":{"7":1,"57":2}}],["re",{"2":{"21":1,"173":2}}],["resource",{"2":{"225":2}}],["resources",{"0":{"46":1,"52":1,"63":1},"2":{"8":1,"90":1,"124":1,"165":1}}],["research",{"2":{"199":1}}],["resetting",{"2":{"208":1,"229":1}}],["reset",{"2":{"28":1,"48":1,"128":1}}],["resets",{"2":{"9":1,"133":1,"206":1}}],["result",{"2":{"117":1,"154":1,"194":1}}],["results",{"2":{"100":1,"114":1,"188":1,"195":1,"204":2,"215":1,"247":1}}],["rest",{"2":{"194":1}}],["restoring",{"0":{"128":1}}],["restore",{"0":{"133":1},"2":{"5":1,"126":1,"128":1,"133":1}}],["restrict",{"2":{"77":1,"79":1,"116":1}}],["response",{"2":{"154":1,"204":1}}],["responses",{"2":{"11":1,"45":1,"51":1,"53":1,"57":1,"62":1,"68":1,"69":1,"91":1,"184":1}}],["respond",{"2":{"41":1,"56":1,"142":1}}],["reach",{"2":{"223":1}}],["reached",{"2":{"195":1}}],["reachable",{"2":{"174":1,"182":1}}],["reactions",{"2":{"8":1}}],["reasoning",{"2":{"89":1,"91":4,"165":1,"184":2,"232":2}}],["realized",{"2":{"19":1}}],["reality",{"2":{"18":1}}],["real",{"0":{"198":1},"2":{"8":1,"15":1,"18":2,"19":4,"24":1,"62":1,"100":1,"124":1,"125":1,"173":1,"197":1,"204":1}}],["reads",{"2":{"119":1}}],["reading",{"2":{"95":1}}],["ready",{"2":{"38":1,"39":1}}],["read",{"2":{"5":1,"8":1,"30":1,"140":1,"148":1,"150":1,"195":1,"207":1,"226":1,"241":3,"282":1,"283":1,"284":1,"287":1,"289":1}}],["rebuild",{"0":{"173":1},"2":{"6":1,"101":1,"173":3,"270":1,"281":1}}],["uuid",{"2":{"232":2}}],["utc",{"2":{"97":1,"190":1,"253":1}}],["url",{"2":{"30":2,"37":4,"43":2,"60":1,"87":1,"110":2,"161":1,"178":1,"179":2,"182":1,"201":1,"252":1,"253":2,"258":2,"263":1,"278":2,"279":1}}],["uncomment",{"2":{"251":1}}],["uncomfortable",{"2":{"21":1}}],["unread",{"2":{"193":1,"194":2}}],["unlike",{"2":{"272":1}}],["unlimited",{"2":{"189":1,"196":1}}],["unless",{"2":{"72":1}}],["unique",{"2":{"54":1,"125":1,"176":1}}],["unified",{"0":{"104":1},"2":{"7":1}}],["unifies",{"2":{"4":1}}],["underlying",{"2":{"247":1}}],["understanding",{"2":{"134":1}}],["understands",{"2":{"57":1}}],["under",{"2":{"20":1,"72":1,"287":1}}],["ui",{"0":{"210":1},"2":{"15":1,"31":1,"43":1,"49":1,"50":1,"55":1,"56":1,"60":1,"65":1,"97":1,"147":1,"210":1,"212":1,"245":1,"246":1,"252":1}}],["us",{"2":{"97":1,"284":1}}],["usage",{"0":{"175":1,"237":2,"260":1,"265":1},"2":{"10":2,"175":1,"224":2,"228":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":5,"238":1,"239":1,"240":1,"241":1}}],["using",{"0":{"281":1},"2":{"8":1,"9":1,"13":1,"42":1,"86":1,"103":1,"110":1,"111":1,"124":1,"167":1,"187":1,"188":1,"194":1,"195":1,"247":2,"249":1,"268":1,"277":1,"285":1}}],["useful",{"2":{"73":2,"126":1,"133":1,"152":1,"173":1,"187":1,"209":1}}],["uses",{"2":{"60":1,"70":1,"90":1,"119":1,"190":2,"206":1,"207":1,"247":1,"266":1,"272":1,"282":1,"289":1}}],["used",{"2":{"10":1,"90":1,"91":5,"115":1,"125":1,"153":1,"176":1,"184":1,"261":1,"274":1}}],["use",{"0":{"222":1},"2":{"8":1,"23":1,"24":1,"38":1,"50":1,"56":1,"73":1,"90":2,"91":1,"94":2,"95":1,"98":1,"99":1,"100":1,"114":1,"129":1,"142":1,"146":1,"150":1,"156":1,"163":1,"164":2,"165":1,"168":1,"174":1,"177":1,"180":1,"182":2,"196":2,"198":1,"202":1,"216":1,"218":2,"225":1,"247":2,"249":4,"251":1,"255":2,"260":1,"265":1,"271":1,"275":1,"280":1,"286":1}}],["username",{"2":{"54":2,"138":1,"253":1}}],["username>",{"2":{"42":1}}],["users",{"0":{"82":1,"83":1},"2":{"4":2,"8":1,"9":1,"22":1,"33":1,"45":1,"47":1,"58":1,"61":1,"62":1,"64":1,"67":1,"69":1,"70":1,"73":2,"84":1,"87":1,"90":1,"207":1,"226":1,"251":1}}],["user",{"0":{"4":1},"2":{"9":1,"19":1,"24":1,"42":3,"43":2,"44":1,"73":1,"79":1,"85":1,"97":2,"142":1,"165":1,"168":1,"204":1,"205":1,"207":1,"212":1,"218":1,"250":1,"253":1,"254":1}}],["upload",{"2":{"146":1}}],["upgradable",{"2":{"22":1}}],["updated",{"2":{"134":1,"173":1}}],["updates",{"2":{"119":1}}],["update",{"0":{"232":1},"2":{"10":1,"97":1,"98":1,"112":2,"146":1,"182":1,"202":1,"224":1,"230":2,"232":4,"254":1,"275":1}}],["up",{"2":{"3":1,"15":1,"23":1,"48":1,"90":1,"152":1,"175":1,"247":1,"250":2,"251":1,"254":2,"278":1,"279":1,"290":1}}],["dynamic",{"2":{"108":1}}],["dropdown",{"2":{"99":1,"203":1,"259":1,"264":1,"280":1,"285":1}}],["dropped",{"2":{"78":1}}],["drag",{"2":{"78":1}}],["d",{"2":{"42":1,"247":1,"250":2,"251":1,"254":2,"278":1,"279":1}}],["dm",{"2":{"39":1}}],["db",{"2":{"22":1,"250":3}}],["duration",{"2":{"117":1,"154":1}}],["durable",{"2":{"21":1,"22":1,"25":1}}],["during",{"2":{"101":1,"114":1,"115":1,"124":1,"154":1,"156":2,"164":1,"176":1,"198":1,"215":1,"222":1,"247":1,"270":1}}],["duckduckgo",{"2":{"8":1,"199":1}}],["domain",{"2":{"138":1}}],["documented",{"2":{"218":1}}],["document",{"2":{"217":1,"247":1}}],["documentation",{"0":{"243":1,"244":1},"1":{"244":1},"2":{"52":1,"63":1}}],["docker",{"0":{"245":1},"1":{"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1},"2":{"16":2,"101":1,"125":1,"244":1,"245":2,"246":1,"247":1,"248":2,"249":6,"250":5,"251":5,"254":6,"255":2,"278":1}}],["do",{"2":{"42":1,"245":1}}],["downloaded",{"2":{"247":1}}],["download",{"2":{"146":1}}],["downloadable",{"2":{"131":1}}],["down",{"2":{"29":1,"124":1,"237":1,"254":1}}],["don",{"2":{"19":2,"21":2,"223":1,"247":1}}],["doing",{"2":{"19":1}}],["doesn",{"2":{"19":1,"124":1}}],["does",{"2":{"18":1,"142":1,"189":1,"247":1}}],["debug",{"2":{"253":1}}],["delivered",{"2":{"195":1}}],["deliver",{"2":{"188":1}}],["delivery",{"2":{"138":1,"141":1}}],["delete",{"2":{"93":1,"98":1,"112":1,"124":1,"129":1,"140":1,"146":1,"163":2,"171":1,"182":2,"185":1,"202":2,"210":1,"221":1,"230":2,"231":2,"275":1,"281":1}}],["deleting",{"0":{"93":1,"214":1,"221":1},"2":{"163":1,"214":1}}],["delegates",{"2":{"207":1}}],["delegated",{"2":{"9":1,"215":1}}],["delegate",{"2":{"8":1}}],["designed",{"2":{"199":1}}],["desired",{"2":{"128":1}}],["descriptions",{"2":{"164":1}}],["description",{"2":{"34":1,"43":1,"60":1,"68":1,"73":1,"89":1,"91":1,"97":1,"109":1,"115":1,"153":1,"160":1,"161":1,"184":1,"189":2,"194":1,"207":1,"218":1,"220":1,"224":1,"246":1,"253":1,"255":1,"258":1,"263":1,"274":1,"284":1,"289":1}}],["deep",{"2":{"91":1}}],["deeply",{"2":{"6":1}}],["dense",{"0":{"279":1},"2":{"168":1,"246":1,"247":1,"267":1,"271":2,"272":1,"274":3}}],["density",{"2":{"19":2}}],["denied",{"2":{"72":1,"83":1,"84":1}}],["deny",{"2":{"70":1,"72":2,"73":1,"74":1,"75":1,"77":1,"82":1,"83":1,"84":1,"91":1,"232":1}}],["dedicated",{"2":{"39":1,"121":1,"143":1,"261":1}}],["determine",{"2":{"172":1}}],["determined",{"2":{"101":1}}],["determines",{"2":{"75":1}}],["detection",{"2":{"6":1}}],["detail",{"0":{"88":1},"1":{"89":1},"2":{"55":1,"88":1,"90":1,"93":1,"105":1,"115":1,"116":1,"117":1,"123":1,"139":1,"143":1,"153":1,"159":1,"169":1,"191":1,"219":1}}],["detailed",{"2":{"40":1,"106":1,"154":1,"244":1}}],["details",{"2":{"38":1,"164":1,"172":1,"229":1,"247":1}}],["developer",{"2":{"28":1,"30":1,"35":1}}],["device",{"2":{"19":1,"22":1,"24":1,"97":2}}],["deployable",{"2":{"22":1}}],["depending",{"2":{"168":1,"201":1}}],["dependable",{"2":{"21":1}}],["dependencies",{"2":{"16":1}}],["decide",{"2":{"19":1}}],["decay",{"2":{"14":1,"116":1,"172":1}}],["decentralized",{"2":{"7":1,"39":1,"41":1}}],["definitions",{"2":{"253":1}}],["defined",{"2":{"212":1}}],["defines",{"2":{"189":1}}],["define",{"2":{"8":1,"70":1,"89":1,"90":1,"91":2,"216":1,"266":1}}],["defaults",{"2":{"184":1,"249":2,"258":1,"274":1}}],["default",{"0":{"72":1},"2":{"6":1,"23":1,"24":1,"43":2,"49":2,"60":1,"72":2,"75":1,"81":2,"82":1,"83":1,"84":1,"91":2,"97":1,"101":1,"153":1,"184":1,"190":1,"207":1,"225":1,"232":1,"250":1,"252":1,"253":2,"255":1,"267":1,"269":1,"274":1,"283":1,"284":4,"288":1}}],["date",{"2":{"175":1}}],["database",{"2":{"6":1,"23":1,"89":1,"246":2,"250":1,"253":2,"278":1}}],["data",{"0":{"130":1},"1":{"131":1,"132":1,"133":1},"2":{"5":1,"89":1,"93":2,"125":2,"130":1,"131":2,"132":1,"133":1,"152":1,"158":1,"160":1,"187":1,"249":3,"253":1}}],["danger",{"2":{"89":1,"93":1}}],["days",{"2":{"116":2,"172":2,"237":1}}],["day",{"2":{"21":1,"190":5,"193":1,"260":2,"265":2,"281":2}}],["dark",{"2":{"15":1}}],["daily",{"2":{"3":1,"189":1,"193":1,"194":1,"225":2}}],["dialog",{"2":{"220":1}}],["digest",{"2":{"193":1,"194":1}}],["dimensions",{"2":{"184":1}}],["different",{"2":{"104":1,"115":1,"153":1,"207":1,"209":1,"270":1}}],["differ",{"2":{"91":1}}],["differs",{"2":{"24":1}}],["did",{"2":{"19":1,"215":1}}],["directories",{"2":{"145":1,"146":1}}],["directory",{"2":{"133":1,"144":1,"145":1,"160":1,"249":2,"253":1}}],["directly",{"2":{"10":1,"61":1,"64":1,"67":1,"92":1,"110":1,"143":1,"149":1,"171":1,"207":1,"251":1}}],["direct",{"2":{"4":1,"39":1,"41":1,"44":1,"45":1,"50":1,"51":1,"62":1,"69":1}}],["discovers",{"2":{"164":1}}],["discovery",{"0":{"164":1}}],["discover",{"2":{"162":1,"165":1,"181":1}}],["discord",{"0":{"27":1,"28":1,"209":1},"1":{"28":1,"29":1,"30":1,"31":1,"32":1},"2":{"1":1,"4":1,"7":1,"27":1,"28":1,"30":1,"31":1,"32":1,"39":1,"73":2,"79":1,"89":1,"104":1,"106":1,"223":1,"243":1,"244":1}}],["discarding",{"2":{"114":1}}],["displays",{"2":{"125":1,"175":1,"228":1}}],["display",{"2":{"54":1,"87":1,"96":1,"97":1,"179":1,"184":1,"189":1,"257":1,"262":1,"273":1}}],["displayed",{"2":{"48":1,"66":1,"241":1}}],["disappears",{"2":{"19":1}}],["disabled",{"2":{"109":1,"195":1}}],["disable",{"2":{"8":1,"109":1,"112":1,"163":1,"230":3}}],["distinguishes",{"2":{"183":1}}],["distinguish",{"2":{"4":1}}],["ps",{"2":{"254":1}}],["p",{"2":{"230":1}}],["pm",{"2":{"190":1}}],["png",{"2":{"149":1}}],["python",{"2":{"247":1}}],["python3",{"2":{"160":1}}],["py",{"2":{"148":1}}],["pitch",{"2":{"284":2,"286":1,"287":1,"288":1}}],["pipeline",{"2":{"270":1}}],["pins",{"2":{"255":1}}],["pin",{"2":{"249":1}}],["pixel",{"2":{"97":1}}],["pixels",{"2":{"97":2}}],["picture",{"2":{"87":1}}],["plus",{"2":{"82":1}}],["plan",{"2":{"247":1}}],["plane",{"2":{"22":1}}],["placed",{"2":{"75":1}}],["playback",{"2":{"284":1}}],["playground",{"2":{"24":1}}],["playwright",{"2":{"8":1,"95":1,"246":1}}],["plainly",{"2":{"19":1}}],["platforms",{"2":{"7":1,"23":1,"31":1,"37":1,"39":1,"40":1,"43":1,"49":1,"53":1,"55":1,"60":1,"65":1,"86":1,"89":1,"103":1,"105":1}}],["platform",{"0":{"7":1,"84":1,"106":1},"2":{"1":1,"4":1,"7":1,"33":1,"34":1,"39":1,"40":2,"47":1,"48":1,"50":1,"52":1,"56":1,"63":1,"66":1,"73":2,"77":1,"106":1,"108":1,"109":2,"256":1}}],["phone",{"2":{"66":2}}],["phones",{"2":{"19":1}}],["photo",{"2":{"45":1}}],["public",{"2":{"282":1,"289":1}}],["published",{"2":{"38":1}}],["publish",{"0":{"38":1}}],["purpose",{"2":{"196":1}}],["purposes",{"2":{"130":1}}],["pulled",{"2":{"252":1}}],["pulls",{"2":{"249":1}}],["pull",{"2":{"124":1,"254":1}}],["push",{"2":{"24":1}}],["pencil",{"2":{"221":1}}],["people",{"2":{"21":1}}],["performance",{"2":{"199":1}}],["performing",{"2":{"187":1}}],["perform",{"2":{"86":1,"100":1,"124":1,"150":1,"151":1,"156":1,"165":1,"223":1}}],["persistence",{"2":{"125":1}}],["persistent",{"2":{"86":1,"93":1}}],["persist",{"2":{"78":1}}],["personalized",{"2":{"166":1}}],["personality",{"2":{"8":1,"86":1,"89":1,"216":1,"217":1}}],["personal",{"2":{"7":1,"18":1,"19":1,"39":2,"64":1}}],["person",{"2":{"4":2}}],["permission",{"2":{"74":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1}}],["permissions",{"0":{"36":1,"226":1},"2":{"30":1,"36":3,"140":1,"142":1}}],["permanently",{"2":{"25":1,"93":1,"112":1,"214":1}}],["per",{"2":{"11":1,"206":1}}],["periodically",{"2":{"115":1}}],["periodic",{"2":{"9":1,"91":1,"151":1,"152":1,"187":1,"196":2,"207":1}}],["points",{"0":{"252":1}}],["popup",{"2":{"180":1}}],["port",{"2":{"138":1,"247":1,"253":3}}],["portal",{"2":{"28":1,"30":1,"39":1,"150":1}}],["portable",{"2":{"19":1,"21":1}}],["polling",{"2":{"43":1}}],["polite",{"2":{"19":1}}],["powerful",{"2":{"19":1,"135":1,"199":1}}],["powered",{"2":{"5":1,"8":1,"95":1,"199":1}}],["postgres",{"2":{"246":1,"249":2,"250":4,"253":1,"255":2}}],["postgresql",{"2":{"16":1,"245":1,"246":1,"253":1,"255":1}}],["post",{"2":{"42":1,"194":1}}],["position",{"2":{"19":1}}],["pool",{"2":{"14":1,"113":1,"172":1}}],["pdfs",{"2":{"95":1}}],["pdf",{"2":{"8":1,"100":1}}],["pattern",{"0":{"190":1},"2":{"189":1,"190":2,"191":1,"194":1,"225":1,"230":2}}],["path",{"2":{"145":1,"241":2,"253":1,"255":1}}],["paths",{"2":{"125":2,"253":1}}],["packaged",{"2":{"131":1}}],["package",{"2":{"122":1}}],["password=your",{"2":{"250":2}}],["password>",{"2":{"42":1}}],["password",{"2":{"42":2,"138":1,"249":2,"250":7,"253":2,"255":3}}],["paste",{"2":{"31":1,"37":1,"40":1,"49":1,"55":1,"110":1}}],["past",{"2":{"18":1}}],["pairs",{"2":{"160":1}}],["paired",{"2":{"20":1}}],["paid",{"2":{"19":1}}],["parent",{"2":{"129":1,"145":1}}],["parameters",{"2":{"91":1,"116":1,"201":1,"225":1}}],["parallel",{"2":{"8":1}}],["participate",{"2":{"41":1,"45":1,"62":1}}],["part",{"2":{"19":1,"115":1}}],["parsed",{"2":{"217":1}}],["parse",{"2":{"8":1}}],["pages",{"2":{"94":1}}],["page",{"0":{"88":1},"1":{"89":1},"2":{"8":2,"48":1,"55":1,"87":1,"88":1,"90":1,"93":1,"94":1,"95":1,"96":2,"99":1,"100":1,"105":1,"115":1,"116":1,"117":1,"123":1,"137":1,"138":1,"139":1,"143":1,"153":1,"159":1,"162":1,"169":1,"179":1,"184":1,"191":1,"199":1,"201":1,"203":1,"219":1,"257":1,"259":1,"262":1,"264":1,"268":1,"273":1,"280":1,"283":1,"286":1,"287":1,"288":1}}],["practices",{"2":{"218":1}}],["practice",{"2":{"95":1}}],["pre",{"2":{"247":1}}],["prefix",{"2":{"242":1,"254":1}}],["prefixed",{"0":{"242":1},"2":{"223":1}}],["previous",{"2":{"206":1,"209":1}}],["preview",{"2":{"149":2,"286":1}}],["precise",{"2":{"196":1}}],["precedence",{"2":{"75":1}}],["prerequisites",{"0":{"167":1,"248":1}}],["present",{"2":{"278":1,"279":1}}],["presence",{"2":{"29":1}}],["preserved",{"2":{"209":1}}],["preserves",{"2":{"119":1}}],["preserve",{"2":{"9":1}}],["primarily",{"2":{"192":1}}],["primary",{"2":{"91":1}}],["priority",{"0":{"75":1},"2":{"75":2,"78":1}}],["prioritized",{"2":{"70":1}}],["privileged",{"2":{"29":1}}],["privileges",{"2":{"19":1}}],["private",{"0":{"82":1},"2":{"21":1,"22":2,"33":1,"45":1,"62":1,"69":1,"77":1,"122":1}}],["privately",{"2":{"3":1,"23":1}}],["privacy",{"2":{"18":1,"24":1,"199":2}}],["project",{"2":{"258":2,"272":1}}],["proceed",{"2":{"186":1}}],["process",{"0":{"160":1},"2":{"113":1,"119":2,"140":1,"154":1,"160":1,"165":1,"173":2,"204":1,"242":1,"245":1,"246":1}}],["probe",{"2":{"164":1}}],["problematic",{"2":{"83":1}}],["programmatically",{"2":{"194":1}}],["programming",{"2":{"148":1}}],["progress",{"2":{"19":2,"124":1}}],["providing",{"2":{"135":1,"166":1}}],["provided",{"2":{"109":1,"111":1,"165":1,"170":1}}],["provides",{"2":{"92":1,"95":1,"117":1,"121":1,"141":1,"144":1,"154":1,"158":1,"210":1,"247":2,"261":1,"272":1}}],["provide",{"2":{"54":1,"127":1,"140":1,"156":1,"176":1,"204":2}}],["provider",{"0":{"11":1,"137":1,"138":1,"177":1,"178":1,"179":1,"201":1,"203":1,"234":1,"235":1,"256":1,"257":1,"258":1,"259":1,"261":1,"262":1,"263":1,"264":1,"270":1,"273":1,"274":1,"280":1,"283":1},"1":{"138":1,"178":1,"179":2,"180":2,"181":2,"182":2,"183":1,"184":1,"185":1,"186":1,"257":1,"258":1,"259":1,"260":1,"262":1,"263":1,"264":1,"265":1,"271":1,"272":1,"273":1,"274":1,"275":2,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1},"2":{"23":1,"90":5,"91":3,"102":1,"119":3,"136":2,"137":1,"138":3,"140":1,"162":1,"167":5,"168":2,"173":1,"174":2,"176":3,"177":1,"178":1,"179":2,"180":4,"181":3,"182":4,"183":1,"184":2,"198":1,"199":1,"201":2,"202":3,"203":2,"204":1,"224":2,"233":2,"247":2,"253":1,"256":1,"257":3,"258":1,"259":2,"261":1,"262":3,"263":1,"264":2,"266":3,"267":2,"268":5,"269":4,"270":2,"273":3,"274":1,"275":2,"279":1,"280":4,"281":1,"283":2,"287":3,"288":2,"289":1,"290":1}}],["providers",{"0":{"135":1,"182":1,"197":1,"202":1,"266":1,"267":1,"275":1,"287":1,"289":1},"1":{"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"267":1,"268":1,"269":1,"288":1,"289":1,"290":1},"2":{"7":1,"8":3,"11":2,"15":1,"39":2,"89":1,"90":1,"120":1,"157":1,"167":1,"176":1,"179":1,"180":1,"184":1,"199":1,"238":2,"257":1,"262":1,"267":1,"268":1,"273":1,"283":1,"287":1,"288":1}}],["prompt",{"2":{"156":1,"196":1,"222":1,"249":1}}],["prompted",{"2":{"66":1}}],["prompts",{"2":{"54":1,"101":1,"152":1,"249":1}}],["profiles",{"2":{"278":1}}],["profile",{"2":{"50":1,"56":1,"87":1,"90":1,"95":1,"101":1,"246":2,"247":5,"250":3,"251":2,"271":2,"278":2,"279":1}}],["product",{"2":{"25":1}}],["protocol",{"0":{"12":1},"2":{"7":1,"12":1,"39":1,"41":1,"157":1,"184":1}}],["hub",{"2":{"104":1,"251":1}}],["human",{"2":{"19":1}}],["humans",{"2":{"3":1,"23":1}}],["html",{"2":{"100":1}}],["https",{"2":{"42":1,"43":1,"97":2,"179":1,"249":6,"250":1,"258":1}}],["http",{"0":{"161":1},"2":{"12":1,"161":2,"252":3,"253":1,"263":1,"278":2,"279":1}}],["h",{"2":{"42":1}}],["highly",{"2":{"199":1}}],["highlighting",{"2":{"148":1}}],["high",{"2":{"91":1,"138":1,"232":1}}],["higher",{"2":{"78":1,"114":1}}],["highest",{"2":{"75":1,"271":1}}],["hierarchy",{"2":{"79":1}}],["hint",{"2":{"49":1}}],["hide",{"2":{"19":1}}],["history",{"0":{"141":1},"2":{"8":2,"20":1,"30":1,"134":1,"155":1,"170":1,"205":1,"206":1,"209":1,"214":1}}],["hour",{"2":{"190":1}}],["hours",{"2":{"6":1,"23":1}}],["how",{"0":{"22":1,"215":1,"222":1,"272":1},"2":{"90":1,"91":1,"106":1,"109":1,"117":1,"153":1,"154":1,"172":1,"216":1,"266":1,"274":1,"286":1}}],["homeserver>",{"2":{"42":1}}],["homeserver",{"2":{"39":1,"41":1,"42":1,"43":2}}],["home",{"0":{"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"19":2,"20":1,"24":1,"25":1,"241":2}}],["hosted",{"2":{"178":1,"199":1,"261":1,"267":2,"269":2}}],["host",{"2":{"16":1,"121":1,"125":1,"138":1,"245":1,"253":3}}],["here",{"2":{"253":1}}],["height",{"2":{"97":2}}],["headers",{"2":{"161":2}}],["headless",{"2":{"94":1}}],["health",{"2":{"89":1}}],["heartbeat",{"0":{"151":1,"196":1,"239":2},"1":{"152":1,"153":1,"154":1,"155":1,"156":1},"2":{"9":1,"10":1,"89":3,"91":5,"151":1,"152":1,"153":5,"154":4,"155":1,"156":3,"196":2,"207":2,"210":1,"215":3,"224":2,"232":5,"233":3,"237":1,"239":3}}],["held",{"2":{"24":1}}],["helps",{"2":{"134":1,"172":1,"213":1,"222":1}}],["help",{"0":{"228":1},"2":{"10":1,"224":1,"226":1,"242":1}}],["hybrid",{"2":{"6":1,"24":1}}],["handles",{"2":{"142":1,"251":1,"256":1}}],["half",{"2":{"19":1}}],["happening",{"2":{"19":1}}],["hardware",{"2":{"18":1,"19":1}}],["have",{"2":{"12":1,"24":1,"90":1,"102":1,"124":1,"158":1,"167":1,"173":1,"186":1,"225":1,"226":1,"287":1}}],["having",{"2":{"1":1,"23":1}}],["has",{"2":{"1":1,"19":1,"66":1,"72":1,"74":1,"77":1,"133":1,"143":1,"167":1,"173":1,"189":1,"193":1,"209":1}}],["blocked",{"0":{"83":1}}],["block",{"2":{"79":1}}],["blocks",{"2":{"51":1,"57":1,"74":1}}],["blogs",{"0":{"26":1},"2":{"26":1}}],["b",{"2":{"42":1}}],["batch",{"2":{"163":1}}],["battery",{"2":{"19":1}}],["bashsudo",{"2":{"250":2,"251":1}}],["bashgit",{"2":{"250":1}}],["bashdocker",{"2":{"247":1,"254":1,"278":1,"279":1}}],["bashbrowser",{"2":{"101":1}}],["bashcurl",{"2":{"42":1,"249":5}}],["basic",{"0":{"268":1,"288":1},"2":{"34":1,"87":1,"220":1}}],["base64",{"2":{"250":1}}],["based",{"0":{"75":1,"188":1},"2":{"89":2,"108":1,"142":1,"162":1,"168":1,"180":1,"246":1,"267":2,"271":1,"277":1}}],["base",{"2":{"19":1,"20":2,"43":1,"125":1,"178":1,"179":1,"201":1,"253":1,"258":2,"263":1,"278":2,"279":1}}],["backup",{"2":{"130":1,"163":1}}],["background",{"2":{"125":1}}],["backend",{"2":{"90":1,"91":1,"120":1,"167":1,"174":1,"176":1,"260":1,"261":1,"265":1,"266":1,"270":1}}],["back",{"2":{"19":1,"57":1,"119":1,"146":1,"162":1}}],["box",{"2":{"247":1}}],["bocha",{"2":{"199":1}}],["bound",{"2":{"188":1}}],["boundaries",{"2":{"22":1,"24":1}}],["boundary",{"2":{"18":1}}],["bold",{"2":{"51":1,"57":1}}],["botname",{"2":{"242":2}}],["bottom",{"2":{"75":2,"90":1,"93":1,"179":1}}],["botfather",{"2":{"40":1,"54":2}}],["both",{"2":{"24":1,"101":1,"196":1,"278":1}}],["bot",{"0":{"3":1,"29":1,"30":1,"35":1,"42":1,"44":1,"48":1,"54":1,"59":1,"70":1,"81":1,"82":1,"83":1,"86":1,"87":1,"88":1,"90":1,"93":1,"99":1,"100":1,"103":1,"121":1,"136":1,"139":1,"142":1,"143":1,"150":1,"151":1,"156":1,"158":1,"165":1,"166":1,"176":1,"193":1,"203":1,"204":1,"216":1,"232":1,"233":1,"240":1,"259":1,"264":1,"280":1,"285":1},"1":{"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"87":1,"88":1,"89":2,"90":1,"91":1,"92":1,"93":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"140":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"152":1,"153":1,"154":1,"155":1,"156":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1},"2":{"1":1,"3":1,"5":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"14":1,"15":1,"23":3,"24":1,"27":1,"28":2,"30":2,"31":2,"35":2,"37":2,"38":1,"39":2,"40":3,"41":2,"42":1,"43":3,"44":2,"47":2,"48":2,"49":1,"50":2,"52":2,"53":1,"54":7,"55":1,"56":3,"57":4,"58":1,"59":3,"60":4,"61":2,"63":1,"64":1,"65":1,"67":1,"70":2,"72":4,"74":2,"75":1,"76":1,"77":1,"82":2,"83":1,"84":1,"85":1,"86":1,"87":2,"88":1,"89":4,"90":5,"91":3,"92":1,"93":4,"94":4,"99":2,"100":2,"102":2,"103":1,"104":1,"105":2,"109":1,"111":1,"113":2,"115":2,"116":2,"117":1,"119":2,"121":2,"122":2,"123":2,"124":1,"125":1,"126":2,"134":1,"135":1,"136":2,"139":2,"140":5,"141":1,"142":2,"143":2,"145":1,"146":2,"147":1,"148":1,"150":2,"151":1,"152":1,"153":1,"154":2,"156":3,"157":1,"158":1,"159":1,"160":1,"164":1,"165":1,"167":3,"168":1,"169":2,"170":1,"174":1,"175":1,"176":3,"186":1,"187":1,"188":2,"191":2,"193":3,"194":1,"197":1,"198":1,"203":1,"204":2,"205":2,"206":4,"207":6,"209":3,"212":1,"215":2,"216":2,"217":1,"219":2,"221":1,"222":2,"224":3,"226":2,"241":1,"242":1,"243":1,"246":1,"256":1,"259":1,"260":2,"264":1,"265":2,"266":2,"268":2,"269":1,"280":2,"281":3,"285":2,"286":1,"287":3,"288":2}}],["bots",{"0":{"222":1},"2":{"1":1,"3":4,"4":1,"5":1,"8":2,"10":1,"15":1,"23":6,"30":1,"33":1,"39":3,"45":1,"48":1,"86":1,"87":1,"95":2,"99":1,"106":1,"121":1,"158":1,"166":1,"194":1,"203":1,"223":1,"243":1,"244":1,"259":1,"261":1,"264":1,"280":1,"287":1}}],["business",{"2":{"39":1}}],["buttons",{"2":{"95":1}}],["button",{"2":{"87":1,"129":1,"162":1,"163":1,"164":1,"179":1,"182":1,"202":1,"210":1,"286":1,"288":1}}],["but",{"2":{"18":2,"19":1,"21":1,"79":2,"209":1}}],["builtin",{"2":{"273":1}}],["built",{"0":{"270":1,"273":1,"274":1},"1":{"271":1,"272":1,"273":1,"274":1,"275":2,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1},"2":{"7":1,"8":1,"12":1,"24":1,"25":1,"39":1,"90":1,"91":1,"100":1,"102":1,"148":1,"167":1,"247":2,"267":1,"269":1,"270":2,"286":1,"288":1}}],["buildkit",{"2":{"245":1}}],["building",{"2":{"19":1}}],["buildable",{"2":{"18":1}}],["build",{"2":{"3":1,"19":1,"24":1,"101":3,"247":1,"249":1}}],["best",{"2":{"218":1}}],["below",{"2":{"246":1}}],["belongs",{"2":{"183":1}}],["belief",{"2":{"24":1}}],["behave",{"2":{"216":1}}],["behaviors",{"2":{"222":1}}],["behavior",{"2":{"91":3,"94":1,"97":1,"253":1}}],["behind",{"2":{"19":1}}],["before",{"2":{"66":1,"77":1,"167":1,"174":1,"223":1,"250":1,"286":1}}],["begin",{"2":{"61":1}}],["better",{"2":{"114":1,"247":1,"272":1}}],["bet",{"2":{"25":1}}],["between",{"2":{"11":1,"19":1,"109":1,"145":1,"161":1,"183":1,"205":1,"209":1,"210":1}}],["become",{"2":{"114":1,"133":1,"172":1,"173":1,"209":1}}],["becomes",{"2":{"19":1,"21":1,"119":1,"198":1,"266":1}}],["because",{"2":{"19":1}}],["being",{"2":{"19":1,"247":1}}],["be",{"2":{"10":1,"23":1,"24":1,"78":1,"92":1,"93":1,"115":1,"140":1,"153":1,"195":1,"204":1,"223":1,"249":1,"261":1,"278":1,"279":1}}],["broken",{"2":{"237":1}}],["browsing",{"0":{"145":1},"2":{"91":1,"144":1}}],["browse",{"0":{"241":1},"2":{"89":1,"197":1,"224":1}}],["browser",{"0":{"94":1,"95":1,"96":1,"97":1,"99":1,"101":1,"236":2},"1":{"95":1,"96":1,"97":1,"98":2,"99":1,"100":1,"101":1,"102":1},"2":{"8":2,"15":1,"30":1,"90":5,"91":2,"94":6,"95":4,"96":4,"97":5,"99":3,"100":4,"101":6,"224":2,"236":2,"246":3,"247":1,"249":2,"250":3,"251":1,"252":1,"253":2,"255":5}}],["breadcrumb",{"2":{"145":1}}],["breaks",{"2":{"18":1}}],["bridges",{"2":{"104":1}}],["brief",{"2":{"21":1,"189":1}}],["brave",{"2":{"8":1,"198":1,"199":1,"201":1}}],["brain",{"2":{"1":1}}],["bind",{"0":{"50":1,"56":1},"2":{"50":1,"56":2,"266":1}}],["bindings",{"0":{"135":1,"139":1},"1":{"136":1,"137":1,"138":1,"139":1,"140":2,"141":1,"142":1},"2":{"89":1,"238":2}}],["binding",{"0":{"140":1},"2":{"4":1,"50":1,"56":1,"136":1,"140":1}}],["bing",{"2":{"8":1,"198":1,"199":1}}],["bm25",{"2":{"6":1,"247":1}}],["bypasses",{"2":{"75":1}}],["by",{"2":{"5":1,"6":1,"23":2,"24":1,"36":1,"39":1,"42":1,"72":1,"81":1,"95":1,"101":1,"106":1,"109":1,"114":1,"141":1,"145":1,"155":1,"163":1,"164":1,"165":3,"171":1,"176":1,"181":1,"184":1,"190":1,"207":1,"210":3,"213":1,"215":1,"237":4,"244":1,"250":1}}],["f",{"2":{"251":2,"254":1}}],["fssl",{"2":{"249":6}}],["fs",{"0":{"241":1},"2":{"224":1,"241":5}}],["flask",{"2":{"247":1}}],["flexible",{"2":{"196":1}}],["flexibly",{"2":{"11":1}}],["flow",{"0":{"40":1,"107":1,"195":1,"200":1,"268":1,"288":1},"1":{"108":1,"109":1,"110":1,"111":1,"201":1,"202":1},"2":{"111":1,"162":1,"180":1}}],["furthermore",{"2":{"25":1}}],["fully",{"2":{"21":2,"157":1,"267":1}}],["full",{"2":{"7":4,"10":1,"12":1,"32":1,"45":1,"51":1,"62":1,"69":1,"162":1}}],["fixed",{"2":{"196":1}}],["fixes",{"2":{"19":1}}],["five",{"2":{"190":1}}],["fired",{"2":{"189":1}}],["fires",{"2":{"188":1,"195":1,"207":1}}],["firefox",{"2":{"97":1,"101":3,"255":1}}],["first",{"2":{"19":1,"20":1,"24":2,"75":2,"78":1,"90":1,"177":1,"190":1,"252":1}}],["finds",{"2":{"168":1}}],["find",{"2":{"99":1,"128":1,"155":1,"163":1,"203":1,"259":1,"264":1,"280":1,"285":1}}],["fine",{"2":{"79":1}}],["finished",{"2":{"19":1}}],["fields",{"0":{"109":1,"189":1},"2":{"43":1,"60":1,"79":1,"90":1,"108":1,"138":1,"179":1,"184":1,"190":1,"257":1,"262":1,"273":1}}],["field",{"2":{"37":1,"43":1,"55":1,"60":1,"68":1,"91":1,"96":1,"97":1,"109":1,"115":1,"153":1,"160":1,"161":1,"167":1,"184":1,"189":1,"190":1,"258":1,"263":1,"274":1,"284":1}}],["filter",{"2":{"155":1,"171":1,"210":1}}],["file`",{"2":{"218":1}}],["fileviewer",{"2":{"147":1}}],["filemanager",{"2":{"144":1}}],["file",{"2":{"89":1,"124":1,"132":1,"144":1,"145":1,"146":2,"148":2,"149":2,"163":2,"168":1,"184":1,"195":1,"241":1,"250":1,"253":1,"255":1,"267":1,"271":1,"277":1}}],["filesystem",{"0":{"241":1},"2":{"5":1,"15":1,"89":1,"121":1,"131":1,"132":1,"133":1,"143":2,"148":1,"152":1,"160":1,"224":1}}],["files",{"0":{"143":1,"146":1,"148":1,"150":1},"1":{"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1},"2":{"1":1,"5":1,"8":2,"22":1,"23":1,"24":1,"30":1,"32":1,"45":1,"51":1,"57":2,"89":2,"93":1,"122":1,"143":1,"145":1,"146":2,"147":1,"150":2,"217":1,"243":1}}],["fill",{"2":{"37":1,"38":1,"43":1,"60":1,"87":1,"94":1,"96":1,"100":1,"108":1,"138":1,"163":1,"179":1,"201":1,"220":1,"257":1,"262":1,"273":1}}],["filling",{"2":{"8":1,"95":1}}],["focus",{"2":{"205":1}}],["focused",{"2":{"39":1,"119":1,"199":1}}],["folders",{"2":{"146":1}}],["folder",{"2":{"145":1,"146":1}}],["follow",{"2":{"54":1,"180":1,"218":1,"225":1}}],["following",{"2":{"36":1,"39":1,"96":1,"179":1,"184":1,"201":1,"257":1,"262":1,"267":1,"273":1,"278":1}}],["four",{"2":{"9":1,"11":1,"207":1}}],["force",{"2":{"48":1}}],["forcing",{"2":{"19":1}}],["forward",{"2":{"24":1}}],["format",{"0":{"225":1},"2":{"253":1,"284":2,"286":1,"287":1,"288":1}}],["formats",{"2":{"148":1}}],["formatting",{"2":{"49":1,"51":1,"53":1}}],["formatted",{"2":{"45":1}}],["forms",{"2":{"94":1,"95":1}}],["form",{"2":{"8":1,"18":1,"19":1,"79":1,"90":1,"180":1,"182":2,"202":2}}],["for",{"0":{"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"3":1,"5":1,"7":1,"8":2,"9":1,"10":1,"11":1,"12":1,"15":1,"19":2,"21":1,"22":1,"23":1,"25":1,"32":1,"36":2,"38":1,"39":6,"40":1,"42":1,"45":2,"51":2,"54":2,"57":1,"62":1,"69":2,"73":3,"75":1,"79":1,"82":1,"83":1,"85":1,"87":1,"89":2,"90":3,"91":5,"93":1,"95":2,"96":1,"100":1,"101":2,"104":1,"106":2,"111":1,"125":2,"126":1,"127":1,"130":1,"135":1,"138":2,"142":1,"146":1,"151":1,"152":1,"158":1,"160":2,"161":1,"162":1,"163":1,"172":2,"174":1,"175":1,"179":2,"183":2,"184":3,"187":1,"189":3,"191":1,"196":2,"197":1,"199":2,"201":2,"212":1,"215":1,"225":1,"229":1,"237":1,"244":1,"246":3,"247":3,"249":3,"251":1,"255":1,"257":1,"258":3,"260":1,"261":1,"262":1,"263":1,"265":1,"266":1,"273":1,"274":1,"281":1,"282":1}}],["friendly",{"2":{"184":1,"201":1}}],["free",{"2":{"282":1,"289":1}}],["freely",{"2":{"5":1,"23":1}}],["fresh",{"2":{"66":1,"133":1,"206":1,"208":1,"210":1}}],["frontend",{"2":{"253":1}}],["frontmatter",{"2":{"217":1,"221":1,"222":1}}],["frontier",{"2":{"22":1,"25":1}}],["from",{"2":{"6":1,"8":1,"19":1,"40":1,"42":1,"57":1,"66":1,"70":1,"74":1,"75":1,"77":1,"84":1,"87":1,"91":1,"96":1,"97":1,"105":1,"108":1,"115":2,"116":1,"119":1,"123":1,"132":1,"136":1,"137":1,"138":1,"139":1,"143":1,"146":2,"153":2,"159":1,"163":1,"164":1,"167":1,"169":1,"170":2,"173":2,"179":1,"180":1,"181":2,"182":1,"184":1,"199":1,"201":1,"202":1,"205":1,"209":1,"215":1,"219":1,"221":1,"247":1,"249":2,"258":1,"263":1,"268":2,"270":1,"272":1,"274":1,"281":2,"287":2,"288":1}}],["fail",{"2":{"250":1}}],["failed",{"2":{"117":1,"154":1}}],["false",{"2":{"232":2,"255":1}}],["favorite",{"2":{"39":1,"103":1}}],["faster",{"2":{"24":1,"119":1}}],["fast",{"2":{"19":1,"247":1}}],["factor",{"2":{"18":1,"97":1}}],["facts",{"2":{"6":1}}],["familiar",{"2":{"18":1,"144":1}}],["family",{"2":{"3":1}}],["fewer",{"2":{"114":1}}],["featuring",{"2":{"53":1}}],["feature",{"2":{"39":1,"151":1,"172":1,"173":1,"196":1}}],["features",{"0":{"2":1,"23":1,"32":1,"45":1,"51":1,"57":1,"62":1,"69":1,"215":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"45":1,"196":1,"244":1}}],["feb",{"2":{"26":1}}],["feedback",{"2":{"51":1,"69":1,"124":1}}],["feed",{"2":{"21":1}}],["feels",{"2":{"25":1}}],["feeling",{"2":{"19":1}}],["feel",{"2":{"18":1,"19":2}}],["federated",{"2":{"8":1}}],["federation",{"2":{"8":1}}],["fetch",{"2":{"8":1,"40":1,"66":1,"181":1,"247":1,"249":1}}],["feishu",{"0":{"33":1,"34":1,"110":1,"209":1},"1":{"34":1,"35":1,"36":1,"37":1,"38":1},"2":{"1":1,"7":1,"23":1,"33":1,"34":1,"35":1,"37":3,"38":1,"39":1,"89":1,"106":1,"110":3,"223":1,"243":1,"244":1}}],["icon",{"2":{"185":2,"212":1,"221":2}}],["ignore",{"2":{"97":1}}],["irreversible",{"2":{"93":1}}],["idf",{"2":{"247":1}}],["identities",{"2":{"70":1,"83":1}}],["identity",{"0":{"4":1,"50":1,"56":1},"2":{"4":1,"8":1,"50":2,"56":3,"73":2,"77":2,"82":1,"85":1,"241":1}}],["identifier",{"2":{"42":1,"60":1,"125":1,"146":1,"184":1}}],["ids",{"2":{"40":1}}],["id",{"2":{"34":1,"37":1,"42":2,"43":2,"44":1,"59":1,"60":1,"77":4,"79":4,"97":1,"125":1,"163":1,"171":1,"184":2,"194":1,"232":2,"258":4,"284":1}}],["image",{"2":{"101":1,"124":2,"125":2,"149":1,"184":1,"247":1,"249":3,"253":1,"255":4}}],["images",{"0":{"149":1},"2":{"32":1,"51":1,"57":1,"69":1,"252":1,"254":1}}],["immediately",{"2":{"112":1}}],["immediate",{"2":{"39":1}}],["im",{"2":{"36":2,"37":1}}],["impact",{"2":{"25":1}}],["imported",{"2":{"283":1,"288":1}}],["importance",{"2":{"247":1,"272":1}}],["important",{"2":{"42":1,"48":1,"90":1,"119":1,"250":1}}],["importing",{"2":{"130":1}}],["import",{"0":{"130":1,"132":1,"181":1},"1":{"131":1,"132":1,"133":1},"2":{"5":1,"11":1,"89":1,"132":1,"163":2,"181":4}}],["if",{"2":{"19":1,"25":1,"32":1,"36":1,"44":1,"60":1,"66":1,"75":1,"90":1,"91":1,"102":1,"110":1,"111":1,"124":1,"140":3,"180":1,"184":1,"195":1,"247":1,"250":1,"254":1,"280":1}}],["i",{"2":{"19":7}}],["i18n",{"2":{"15":1}}],["injected",{"2":{"222":1}}],["initiated",{"2":{"207":1}}],["initialize",{"2":{"124":1,"252":1}}],["inquiries",{"2":{"142":1}}],["inbox",{"2":{"140":1}}],["inbound",{"2":{"7":1,"37":1,"110":1}}],["invocation",{"2":{"215":1}}],["involves",{"2":{"136":1}}],["invoked",{"2":{"99":1}}],["invalid",{"2":{"97":1}}],["invited",{"2":{"43":1}}],["invites",{"2":{"43":1,"44":1}}],["invite",{"0":{"30":1,"44":1},"2":{"44":1}}],["incremented",{"2":{"195":1}}],["inconsistent",{"2":{"173":1}}],["incoming",{"2":{"72":1,"73":1,"140":1,"142":1}}],["included",{"2":{"267":1}}],["include",{"2":{"95":1,"101":1,"165":1,"255":1}}],["includes",{"2":{"16":1,"134":1,"168":1,"245":1}}],["including",{"2":{"11":1,"93":1,"191":1}}],["input",{"2":{"49":1,"160":1,"184":1}}],["info",{"2":{"34":1,"87":1,"253":1}}],["information",{"0":{"125":1},"2":{"8":1,"19":1,"36":1,"100":1,"113":1,"114":1,"134":1,"166":1,"172":1,"175":1,"197":1,"204":1}}],["inference",{"2":{"22":1,"24":1,"25":1}}],["infrastructure",{"0":{"276":1},"1":{"277":1,"278":1,"279":1},"2":{"19":1,"21":1,"24":1,"25":1,"256":1,"270":1,"277":1}}],["inflate",{"2":{"19":1}}],["into",{"2":{"18":1,"19":1,"37":1,"55":1,"110":1,"131":1,"132":1,"146":1,"170":1,"193":1,"206":1,"217":1,"222":1,"247":1,"272":1,"287":1}}],["introduction",{"0":{"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"26":1}}],["integer",{"2":{"232":1}}],["integrated",{"2":{"144":1,"147":1}}],["integrating",{"2":{"33":1}}],["integration",{"2":{"7":1,"32":1,"39":4}}],["intent",{"2":{"29":3}}],["intents",{"2":{"29":1}}],["intelligence",{"2":{"19":1}}],["intercepted",{"2":{"223":1}}],["internal",{"2":{"184":1}}],["internet",{"2":{"19":1}}],["intervention",{"2":{"187":1}}],["intervene",{"2":{"150":1}}],["interval",{"2":{"91":1,"152":1,"153":1,"196":1,"232":2}}],["interactions",{"2":{"166":1}}],["interaction",{"0":{"100":1,"142":1,"150":1,"156":1,"165":1,"176":1,"204":1}}],["interactive",{"2":{"89":1,"92":1}}],["interact",{"2":{"27":1,"33":1,"39":1,"47":1,"58":1,"64":1,"70":1,"100":1,"103":1,"147":1}}],["interference",{"2":{"205":1}}],["interfering",{"2":{"5":1}}],["interface",{"2":{"7":1,"23":1,"39":1,"155":1}}],["inspect",{"2":{"94":1,"100":1}}],["inspection",{"2":{"8":1}}],["instruction",{"2":{"189":1,"196":1}}],["instantly",{"2":{"223":1}}],["instances",{"2":{"287":1}}],["instance",{"2":{"124":1,"125":1,"183":1,"268":1}}],["install",{"0":{"249":1,"250":1},"1":{"251":1},"2":{"101":1,"122":1,"245":1,"249":3,"251":1,"255":1}}],["installation",{"0":{"16":1,"245":1},"1":{"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1},"2":{"244":2}}],["instead",{"2":{"100":1,"180":1,"256":1}}],["instinct",{"2":{"19":1}}],["inside",{"2":{"8":1,"92":1,"143":1,"160":1,"245":1,"247":1}}],["indices",{"2":{"247":1,"272":1}}],["indicator",{"2":{"174":1}}],["indicators",{"2":{"49":1,"51":1,"68":1,"69":1}}],["individual",{"2":{"4":1,"45":1,"62":1,"69":1,"73":1,"120":1}}],["indexed",{"2":{"274":1}}],["indexes",{"2":{"173":1}}],["indexing",{"2":{"22":1,"24":1,"168":1,"256":1,"277":1}}],["index",{"2":{"22":1,"173":1,"175":2,"271":1}}],["independently",{"2":{"206":1}}],["independent",{"2":{"1":1,"8":1,"9":1,"12":1,"86":1,"158":1,"205":1,"207":1,"215":1}}],["in",{"0":{"65":1,"209":1,"210":1,"270":1,"273":1,"274":1},"1":{"271":1,"272":1,"273":1,"274":1,"275":2,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1},"2":{"3":1,"4":1,"5":1,"7":1,"8":2,"9":2,"10":1,"12":1,"14":1,"19":1,"21":1,"23":3,"24":1,"25":1,"28":1,"30":1,"31":1,"33":1,"34":2,"35":1,"37":3,"38":2,"39":1,"40":1,"41":1,"43":3,"45":1,"48":1,"49":1,"50":2,"53":1,"54":1,"55":1,"56":1,"59":1,"60":2,"61":2,"62":2,"65":1,"67":1,"72":1,"75":1,"79":2,"81":1,"87":2,"90":1,"91":2,"93":1,"95":1,"96":2,"97":3,"100":1,"102":1,"105":1,"108":1,"110":1,"115":1,"116":1,"117":1,"121":1,"123":1,"125":1,"127":1,"128":1,"137":1,"138":1,"139":1,"142":2,"143":1,"148":2,"149":1,"150":1,"153":2,"159":1,"163":1,"165":1,"167":2,"168":1,"169":1,"170":1,"171":1,"173":2,"176":1,"179":1,"180":2,"182":1,"184":1,"185":1,"190":1,"192":1,"193":1,"199":1,"201":1,"202":2,"207":1,"212":1,"215":1,"219":1,"220":2,"223":1,"226":1,"241":1,"242":1,"243":1,"245":1,"246":1,"247":3,"250":1,"251":2,"252":1,"254":1,"255":2,"257":1,"262":1,"266":1,"267":1,"268":1,"269":1,"270":3,"272":1,"273":1,"274":1,"278":1,"279":2,"280":1,"286":1,"287":2,"288":1}}],["italic",{"2":{"51":1,"57":1}}],["iterate",{"2":{"24":1}}],["itself",{"2":{"150":1,"176":1,"193":1}}],["its",{"2":{"1":2,"5":1,"12":1,"23":1,"76":1,"86":1,"88":2,"90":1,"91":2,"93":1,"97":1,"98":1,"109":1,"121":1,"140":1,"142":1,"143":2,"146":1,"150":2,"152":1,"156":2,"158":1,"164":1,"165":1,"176":1,"182":1,"188":1,"195":1,"202":1,"204":1,"205":1,"206":1,"214":1,"215":1,"221":1,"243":1,"256":1,"258":1,"260":1,"263":1,"265":1,"266":1,"267":1,"274":1,"275":1,"280":1,"284":1}}],["it",{"2":{"1":1,"19":9,"24":2,"25":1,"27":1,"28":2,"30":2,"41":1,"47":1,"48":2,"50":1,"58":1,"64":1,"66":1,"97":1,"103":1,"104":1,"110":1,"122":1,"124":1,"125":1,"126":1,"129":1,"142":2,"148":1,"151":2,"156":1,"178":1,"185":1,"188":2,"189":1,"190":2,"197":1,"198":1,"213":1,"216":1,"247":4,"250":1,"258":1,"261":1,"263":1,"270":1,"272":1,"274":1,"282":1}}],["issues",{"2":{"174":1}}],["issue",{"2":{"117":1,"154":1,"174":1}}],["isolated",{"0":{"122":1},"2":{"5":1,"22":1,"23":1,"24":1,"86":1,"121":1,"143":1,"243":1}}],["isolation",{"0":{"5":1,"206":1},"2":{"121":1}}],["is",{"0":{"1":1},"2":{"1":1,"18":1,"19":3,"20":1,"22":2,"23":2,"25":2,"38":1,"44":1,"48":1,"53":1,"56":1,"61":1,"64":1,"66":1,"67":1,"75":2,"79":1,"81":1,"86":1,"90":1,"93":1,"94":1,"95":1,"97":1,"100":1,"111":1,"113":1,"119":1,"124":1,"126":1,"127":1,"131":1,"133":1,"150":1,"152":2,"153":1,"162":1,"164":1,"165":1,"172":1,"173":1,"174":3,"175":1,"182":1,"183":1,"187":1,"188":1,"189":1,"190":1,"195":3,"198":1,"205":1,"207":1,"209":2,"215":1,"217":1,"241":1,"243":1,"244":1,"245":1,"247":1,"250":2,"253":1,"254":1,"256":1,"261":1,"269":1,"270":1,"280":1,"281":1,"282":1,"283":2,"287":1,"288":1}}],["especially",{"2":{"209":1}}],["error",{"2":{"154":1,"174":1}}],["errors",{"2":{"97":1,"155":1}}],["efficient",{"2":{"247":1}}],["effort",{"2":{"91":2,"232":1}}],["effects",{"0":{"74":1}}],["effect",{"0":{"72":1},"2":{"72":2,"74":1,"75":1,"77":1,"81":1,"82":1,"83":1,"84":1,"91":1,"232":1}}],["etc",{"0":{"209":1},"2":{"44":1,"117":1,"223":1,"247":1}}],["elements",{"2":{"94":1}}],["element",{"2":{"42":1,"44":1,"46":1}}],["else",{"2":{"19":1,"21":1}}],["e",{"2":{"40":1,"42":2,"43":2,"54":3,"73":2,"116":1,"138":1,"145":1,"148":1,"149":1,"160":2,"161":1,"173":1,"179":2,"184":3,"189":3,"195":1,"201":2,"225":2,"232":1,"249":1,"255":1,"263":1,"287":2,"288":1}}],["edge",{"0":{"282":1,"283":1},"1":{"283":1,"284":1,"285":1,"286":1},"2":{"24":1,"282":2,"283":2,"284":1,"285":2,"287":2,"288":1,"289":2,"290":1}}],["editor",{"2":{"144":1,"148":1,"220":1}}],["editing",{"0":{"147":1,"221":1},"1":{"148":1,"149":1},"2":{"124":1,"270":1}}],["edit",{"2":{"1":1,"8":1,"23":1,"89":1,"98":1,"148":1,"171":1,"182":1,"185":2,"202":1,"221":1,"243":1,"250":1,"275":1,"281":1}}],["easily",{"2":{"222":1}}],["easy",{"2":{"23":1}}],["each",{"2":{"3":1,"4":1,"5":2,"6":1,"9":1,"12":1,"23":3,"24":1,"40":1,"48":1,"72":1,"74":1,"79":1,"82":1,"106":1,"114":1,"158":1,"176":1,"181":1,"196":1,"205":1,"206":1,"212":1,"215":2,"243":1,"270":1}}],["evaluate",{"2":{"115":1,"119":1}}],["evaluated",{"2":{"75":1,"78":1,"190":1}}],["evaluation",{"0":{"75":1}}],["even",{"2":{"151":1}}],["event",{"2":{"37":1,"110":1}}],["events",{"0":{"37":1},"2":{"37":1,"161":1}}],["eventually",{"2":{"19":1}}],["everyone",{"2":{"77":1,"81":1,"83":1}}],["everything",{"2":{"22":1,"25":1,"245":1}}],["every",{"2":{"1":1,"18":1,"19":1,"21":1,"23":1,"73":1,"121":1,"143":1,"154":1,"190":5,"193":1,"194":1}}],["evolves",{"2":{"19":1}}],["economics",{"2":{"19":1}}],["emmamultilingualneural",{"2":{"284":1}}],["embedded",{"2":{"245":1,"246":1}}],["embeddings",{"2":{"168":1,"271":1}}],["embedding",{"2":{"11":1,"91":1,"176":1,"183":2,"184":2,"247":4,"267":1,"271":2,"272":1,"274":2,"279":1}}],["embed",{"2":{"30":1,"184":1}}],["empty",{"2":{"19":1,"60":1,"189":1,"258":1}}],["emails",{"2":{"8":1,"135":1,"140":2,"141":1,"142":1,"193":1,"194":2}}],["email",{"0":{"135":1,"136":1,"137":1,"139":1,"238":2},"1":{"136":1,"137":1,"138":2,"139":1,"140":2,"141":1,"142":1},"2":{"1":1,"7":1,"8":2,"39":2,"89":2,"136":5,"137":2,"138":3,"139":2,"140":3,"141":5,"142":3,"224":2,"238":3,"243":1,"253":1}}],["encodes",{"2":{"247":1}}],["encoding",{"2":{"246":1,"247":3,"253":1,"272":1,"278":1}}],["encountered",{"2":{"117":1,"154":1}}],["env",{"2":{"160":1,"250":1}}],["environment",{"0":{"255":1},"2":{"24":1,"91":1,"94":1,"121":1,"123":1,"126":1,"134":1,"160":1,"249":2}}],["ensure",{"2":{"127":1}}],["ensures",{"2":{"121":1}}],["enabling",{"2":{"104":1,"111":1,"151":1,"197":1}}],["enables",{"2":{"50":1,"56":1,"97":1,"218":1}}],["enabled",{"2":{"43":1,"44":1,"49":2,"61":1,"67":1,"69":1,"91":3,"115":2,"140":3,"153":1,"189":1,"191":1,"194":1,"232":3,"246":1}}],["enable",{"0":{"35":1},"2":{"8":1,"29":1,"31":1,"35":1,"36":1,"40":1,"43":1,"49":3,"55":1,"60":1,"68":1,"91":1,"109":1,"112":2,"163":1,"184":1,"230":2,"247":3,"278":1}}],["en",{"2":{"97":1,"232":2,"284":1}}],["engines",{"0":{"199":1},"2":{"197":1,"199":2,"255":1}}],["engine",{"2":{"90":1,"91":1,"97":1,"201":2}}],["engineered",{"2":{"6":1}}],["engineering",{"0":{"6":1},"2":{"23":1}}],["entries",{"2":{"113":1,"114":3,"119":1,"155":1,"171":1,"175":1,"269":1}}],["entry",{"2":{"66":1,"212":1}}],["entire",{"2":{"70":1,"73":1,"77":1,"79":1,"88":1,"222":1}}],["enter",{"2":{"18":1,"34":1,"170":1}}],["enterprise",{"2":{"7":1,"33":1,"39":2}}],["endpoint",{"2":{"60":1,"161":1,"263":1}}],["ending",{"2":{"54":1}}],["enough",{"2":{"19":1}}],["exa",{"2":{"199":1}}],["exact",{"2":{"184":1}}],["examples",{"0":{"80":1},"1":{"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"190":1,"230":1,"241":1}}],["example",{"0":{"218":1},"2":{"79":1,"172":1,"225":1,"232":1,"233":1}}],["exchanged",{"2":{"162":1}}],["except",{"2":{"83":1}}],["exist",{"2":{"124":1}}],["existing",{"2":{"119":1,"129":1,"171":1,"210":1}}],["expiration",{"2":{"253":1}}],["expires",{"2":{"66":1}}],["explanation",{"2":{"189":1}}],["explicitly",{"2":{"72":2}}],["explicit",{"2":{"22":1,"24":1}}],["exposed",{"2":{"164":1,"165":1}}],["exporting",{"2":{"130":1}}],["export",{"0":{"130":1,"131":1},"1":{"131":1,"132":1,"133":1},"2":{"5":1,"8":1,"89":1,"100":1,"131":1,"163":2}}],["expression",{"2":{"189":1,"193":1,"196":1}}],["expressions",{"2":{"13":1,"23":1,"187":1}}],["express",{"2":{"114":1}}],["expensive",{"2":{"21":1}}],["experienced",{"2":{"24":1}}],["experience",{"2":{"18":1,"144":1}}],["executable",{"2":{"160":1}}],["executing",{"2":{"124":1}}],["executions",{"2":{"189":1}}],["execution",{"0":{"195":1},"2":{"9":1,"13":1,"22":1,"89":2,"154":1,"191":1,"196":1,"207":1,"239":1}}],["executes",{"2":{"160":1,"188":1,"195":1}}],["execute",{"2":{"1":1,"5":1,"8":1,"23":1,"92":1,"121":1,"122":1,"152":1,"153":1,"223":1,"226":1}}],["extending",{"0":{"158":1}}],["external",{"0":{"209":1},"2":{"8":1,"12":1,"40":1,"73":1,"157":1,"158":1,"168":1,"187":1,"197":1,"247":1,"272":1}}],["extraction",{"2":{"260":1,"265":1,"266":1,"270":1}}],["extracted",{"2":{"132":1,"215":1}}],["extract",{"2":{"42":1,"170":1,"281":1}}],["extracts",{"2":{"6":1}}],["extra",{"2":{"16":1}}],["ok",{"2":{"154":1}}],["okay",{"2":{"19":1}}],["old",{"2":{"118":1,"155":1,"209":1}}],["older",{"2":{"116":1,"155":1,"172":1}}],["observe",{"2":{"100":1}}],["obtain",{"2":{"40":1,"42":1}}],["o1",{"2":{"91":1,"184":1}}],["oem",{"2":{"19":1}}],["os",{"2":{"19":1}}],["occasional",{"2":{"19":1}}],["output",{"2":{"160":1,"226":1,"284":1}}],["outgoing",{"2":{"140":1,"142":1}}],["outdated",{"2":{"113":1,"114":1}}],["outbox",{"0":{"141":1},"2":{"89":1,"141":1,"142":1,"238":2}}],["outbound",{"2":{"7":1}}],["outcome",{"2":{"75":1}}],["outside",{"2":{"39":1}}],["out",{"2":{"19":1,"247":1}}],["our",{"2":{"18":1,"19":1}}],["only",{"2":{"48":1,"72":1,"77":1,"79":2,"82":1,"84":1,"85":1,"100":1,"172":1,"207":2,"226":4,"247":1,"250":1,"271":1,"272":1,"274":1,"277":1}}],["online",{"2":{"25":1}}],["once",{"2":{"38":1,"48":1,"61":1,"66":1,"88":1,"94":1,"163":1,"164":1,"165":1,"180":1,"198":1,"260":1,"265":1,"281":1}}],["on",{"0":{"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"16":1,"18":2,"19":1,"21":1,"22":1,"25":2,"40":2,"41":1,"42":1,"48":1,"54":1,"56":1,"66":2,"73":1,"88":1,"100":1,"104":1,"106":1,"108":1,"115":1,"142":1,"146":1,"153":1,"162":1,"164":1,"168":1,"172":1,"182":1,"184":1,"189":1,"201":1,"202":1,"205":1,"210":1,"213":1,"215":1,"245":1,"247":2,"250":1,"254":1,"286":1}}],["one",{"0":{"249":1},"2":{"16":1,"25":1,"53":1,"66":1,"95":1,"167":1,"177":2,"181":2,"206":1,"215":1,"266":1,"268":1,"270":1}}],["opus",{"2":{"284":1}}],["opt",{"2":{"160":1}}],["optimize",{"2":{"172":1}}],["optimized",{"2":{"119":1}}],["optimizes",{"2":{"113":1}}],["optimizing",{"2":{"14":1}}],["options",{"2":{"232":2,"284":2}}],["optionally",{"2":{"77":1,"91":1,"116":1,"172":1}}],["optional",{"0":{"50":1,"56":1,"68":1},"2":{"49":1,"79":1,"97":4,"189":1,"196":1,"246":1,"253":1}}],["option",{"2":{"42":2,"232":1}}],["operational",{"2":{"174":1}}],["operation",{"2":{"133":1}}],["operations",{"0":{"112":1,"123":1,"144":1,"163":1,"169":1},"1":{"124":1,"145":1,"146":1,"170":1,"171":1},"2":{"8":1,"12":1,"124":1,"150":1,"260":2,"265":2,"281":1}}],["operates",{"2":{"121":1,"270":1}}],["operate",{"2":{"25":1}}],["openssl",{"2":{"250":1}}],["opensearch",{"2":{"247":2,"272":2,"278":1}}],["opening",{"2":{"215":1}}],["openviking",{"0":{"261":1,"262":1,"263":1,"264":1},"1":{"262":1,"263":1,"264":1,"265":1},"2":{"167":1,"261":1,"262":1,"263":2,"264":1,"265":2,"267":1,"269":1}}],["open",{"0":{"81":1,"83":1},"2":{"25":1,"30":1,"33":1,"34":1,"44":1,"48":1,"52":1,"54":1,"56":1,"63":1,"66":1,"76":1,"92":1,"94":1,"99":1,"148":1,"162":1,"167":1,"220":1,"259":1,"264":1,"268":2,"280":1,"285":1,"288":1}}],["openclaw",{"0":{"24":1},"2":{"24":1}}],["openai",{"2":{"11":2,"91":1,"178":1,"179":2,"180":1,"184":3,"233":2,"247":1}}],["overlay",{"2":{"251":1}}],["overlap",{"2":{"114":1}}],["overview",{"0":{"18":1,"39":1,"89":1},"1":{"40":1},"2":{"89":1}}],["over",{"2":{"14":1,"18":1,"113":1,"114":1,"134":1,"161":1,"172":1,"284":1}}],["oauth2",{"2":{"30":1}}],["oauth",{"0":{"162":1,"180":1},"2":{"7":1,"11":1,"12":1,"39":1,"89":1,"162":6,"180":4}}],["often",{"2":{"91":1,"153":1}}],["official",{"0":{"46":1,"52":1,"63":1},"2":{"30":1,"37":1,"47":1,"54":2,"249":1}}],["off",{"0":{"277":1},"2":{"19":1,"115":1,"153":1,"173":1,"267":1,"271":1,"274":1}}],["of",{"2":{"6":1,"8":1,"10":1,"11":1,"18":2,"19":3,"23":1,"43":1,"45":1,"50":1,"53":1,"56":1,"73":2,"83":1,"90":1,"91":1,"100":1,"114":3,"115":1,"116":1,"117":2,"119":1,"123":1,"125":1,"126":1,"129":1,"134":2,"141":2,"154":2,"156":2,"158":1,"160":2,"161":2,"167":1,"172":1,"174":1,"175":1,"179":2,"180":1,"189":3,"190":3,"193":1,"206":1,"207":2,"215":2,"216":1,"228":1,"246":1,"247":2,"253":1,"256":1,"268":1,"270":1,"272":1}}],["others",{"2":{"215":1,"246":1}}],["other",{"0":{"215":1},"2":{"3":1,"5":1,"15":1,"23":1,"84":1,"121":1,"174":1,"196":1,"199":1,"201":1,"205":1,"207":1}}],["orchestrated",{"2":{"245":1}}],["oriented",{"2":{"196":1}}],["ordering",{"2":{"75":1}}],["order",{"2":{"75":1,"78":1}}],["organized",{"2":{"287":1}}],["organize",{"2":{"213":1}}],["organization",{"2":{"36":1,"58":1,"258":2}}],["org",{"2":{"42":1,"43":2}}],["or",{"2":{"1":1,"3":3,"8":1,"10":1,"16":1,"23":2,"33":1,"39":1,"40":1,"42":1,"44":1,"45":1,"57":1,"59":1,"61":1,"66":1,"70":2,"72":1,"75":1,"77":2,"91":1,"95":2,"97":3,"100":2,"101":1,"109":2,"113":1,"114":2,"115":1,"117":1,"119":2,"121":2,"124":1,"125":1,"127":1,"130":1,"133":1,"136":1,"142":1,"146":2,"150":1,"152":1,"153":1,"154":2,"155":1,"156":1,"161":1,"163":3,"167":1,"168":1,"171":1,"172":1,"174":1,"176":1,"178":1,"182":1,"183":1,"184":1,"187":1,"198":1,"205":1,"210":1,"212":1,"221":1,"222":1,"232":5,"237":2,"239":1,"240":1,"243":1,"245":1,"249":1,"250":3,"261":1,"267":1,"269":1,"272":1,"274":1,"281":1}}],["owner",{"2":{"72":1,"75":1,"82":1,"176":1,"226":4,"230":5,"231":1,"232":1,"233":2,"234":1,"235":1,"236":1}}],["own",{"2":{"1":3,"5":1,"12":1,"15":1,"23":3,"86":1,"91":1,"121":1,"140":1,"143":1,"150":1,"158":1,"199":1,"205":1,"206":1,"243":2,"267":1}}],["lt",{"2":{"230":8,"231":2,"233":4,"234":1,"235":1,"236":1,"241":1}}],["leave",{"2":{"189":1}}],["leaving",{"2":{"147":1}}],["least",{"2":{"177":2}}],["lead",{"2":{"114":1}}],["lets",{"2":{"79":1,"100":1}}],["level",{"2":{"73":2,"79":1,"91":1,"190":1,"253":1}}],["left",{"2":{"28":1,"34":1}}],["less",{"2":{"25":1}}],["ll",{"2":{"19":1}}],["llms",{"2":{"19":1}}],["llm",{"0":{"11":1,"177":1,"178":1},"1":{"178":1,"179":2,"180":2,"181":2,"182":2,"183":1,"184":1,"185":1,"186":1},"2":{"11":1,"24":1,"90":1,"91":3,"115":1,"153":1,"177":1,"178":1,"223":1}}],["linux",{"2":{"254":1}}],["line",{"2":{"141":1,"160":1,"251":1}}],["link",{"2":{"111":1,"136":1}}],["linked",{"2":{"56":1}}],["links",{"2":{"30":1,"51":1,"57":1,"95":1,"244":1}}],["listen",{"2":{"253":1}}],["listed",{"2":{"82":1}}],["listing",{"2":{"226":1}}],["lists",{"2":{"164":1,"212":1,"272":1}}],["list",{"2":{"70":1,"83":1,"108":1,"118":1,"128":1,"129":1,"145":1,"160":1,"164":1,"171":1,"180":1,"181":1,"182":1,"184":2,"185":1,"191":2,"207":1,"225":1,"228":1,"230":3,"231":2,"233":3,"234":2,"235":2,"236":2,"240":2,"241":4,"247":1,"258":1,"263":1,"274":1}}],["limit",{"2":{"189":1,"196":1}}],["limited",{"2":{"66":1}}],["limits",{"2":{"13":1}}],["lifecycle",{"0":{"124":1},"2":{"88":1,"89":1,"123":1,"134":1}}],["life",{"2":{"19":1}}],["live",{"2":{"19":1}}],["lightweight",{"2":{"247":1,"271":1}}],["lighter",{"2":{"24":1,"247":1}}],["light",{"2":{"15":1}}],["like",{"2":{"1":1,"19":1,"22":1,"23":1,"25":2,"37":1,"91":1,"95":1,"100":1,"124":1,"136":1,"178":1,"180":1,"183":1,"198":1}}],["lookup",{"2":{"247":1}}],["looked",{"2":{"19":1}}],["losing",{"2":{"206":1}}],["lose",{"2":{"114":1}}],["lost",{"2":{"93":1}}],["logging",{"2":{"253":1}}],["logs",{"0":{"117":1,"118":1,"154":1,"155":1,"239":1},"1":{"118":1,"155":1},"2":{"89":3,"118":1,"155":1,"156":1,"224":1,"239":3,"254":2}}],["login",{"2":{"42":3,"66":3,"67":1,"252":1}}],["log",{"2":{"34":1,"48":1,"59":1,"118":1,"134":1,"141":1,"154":1,"155":1,"253":1}}],["load",{"2":{"155":2}}],["loaded",{"2":{"23":1}}],["loads",{"2":{"6":1}}],["localhost",{"2":{"252":3}}],["locally",{"2":{"247":1,"272":1,"278":1}}],["locale",{"2":{"91":1,"94":1,"97":2}}],["local",{"0":{"160":1},"2":{"20":1,"21":1,"22":1,"24":1,"25":1,"131":1,"132":1,"146":2,"160":1}}],["lower",{"2":{"116":1}}],["lowest",{"2":{"75":1}}],["low",{"2":{"19":1,"91":1,"232":1}}],["longer",{"2":{"19":1,"98":1,"114":1,"171":1,"209":1,"214":1,"275":1}}],["long",{"2":{"1":1,"18":1,"21":1,"25":1,"43":1,"102":1,"117":1,"154":1,"166":1,"176":1,"209":1,"243":1,"266":1}}],["launch",{"2":{"124":1}}],["large",{"2":{"113":1}}],["lark",{"0":{"33":1},"1":{"34":1,"35":1,"36":1,"37":1,"38":1},"2":{"1":1,"4":1,"7":1,"23":1,"33":1,"39":1,"106":1,"243":1}}],["later",{"2":{"126":1}}],["latest",{"2":{"26":1,"145":1,"155":1,"249":1,"254":1,"255":2}}],["late",{"2":{"19":1}}],["latency",{"2":{"18":1}}],["languages",{"2":{"148":1,"247":1,"272":1,"282":1,"284":1,"289":1}}],["language",{"2":{"6":1,"91":2,"189":1,"193":1,"196":1,"232":3,"247":1,"284":1}}],["last",{"2":{"6":1,"23":1,"212":2,"237":1}}],["layers",{"2":{"287":1}}],["layer",{"2":{"6":1,"19":1,"20":1}}],["two",{"2":{"136":1,"192":1}}],["tutorial",{"2":{"54":1}}],["turning",{"2":{"19":1}}],["turn",{"2":{"6":1,"18":1,"23":1,"114":1}}],["typical",{"2":{"95":1}}],["typing",{"2":{"49":1,"51":1,"68":2,"69":1}}],["type",{"2":{"42":3,"73":1,"77":3,"79":2,"84":2,"138":1,"160":1,"161":1,"163":1,"168":1,"184":2,"207":2,"210":1,"212":2,"237":1,"257":1,"262":1,"273":1,"283":1,"287":1,"288":1}}],["types",{"0":{"73":1,"159":1,"207":1},"1":{"160":1,"161":1},"2":{"9":1,"11":1,"51":1,"70":1,"207":2,"268":1}}],["title",{"2":{"212":1,"213":1}}],["timing",{"2":{"196":1}}],["timezone",{"2":{"94":1,"97":2,"190":2,"253":2}}],["timeout",{"2":{"43":2,"253":1}}],["timestamp",{"2":{"141":1}}],["timestamps",{"2":{"129":1}}],["times",{"2":{"13":1,"23":1,"189":1}}],["time",{"0":{"19":1,"198":1},"2":{"8":1,"9":1,"14":1,"15":1,"19":3,"62":1,"101":1,"113":1,"117":1,"124":1,"125":1,"134":1,"154":1,"172":2,"173":1,"181":1,"197":1,"204":1}}],["tiny",{"2":{"19":1}}],["t",{"2":{"19":6,"21":2,"124":1,"151":1,"223":1,"247":1}}],["truncated",{"2":{"241":1}}],["true",{"2":{"194":1,"232":3,"255":1}}],["tree",{"2":{"144":1}}],["treat",{"2":{"24":1}}],["troubleshooting",{"2":{"142":1,"174":1}}],["traits",{"2":{"217":1}}],["trail",{"2":{"117":1}}],["trash",{"2":{"185":1,"221":1}}],["translate",{"2":{"193":1}}],["transport",{"2":{"161":1}}],["transfer",{"2":{"146":1}}],["track",{"2":{"215":1}}],["tracked",{"2":{"142":1}}],["tracks",{"2":{"134":1}}],["traditional",{"2":{"138":1}}],["trade",{"2":{"19":1}}],["trapped",{"2":{"21":1}}],["travels",{"2":{"19":1}}],["triggering",{"2":{"187":1}}],["trigger",{"2":{"82":1,"116":1,"142":1,"152":1,"153":1,"196":1,"215":1}}],["triggers",{"2":{"13":1,"91":1,"189":1,"195":1,"207":1}}],["triggered",{"2":{"9":1,"117":1,"154":1,"188":1,"207":1,"215":1}}],["tts",{"0":{"282":1,"283":1,"287":1},"1":{"283":1,"284":1,"285":1,"286":1,"288":1,"289":1,"290":1},"2":{"8":1,"282":1,"283":1,"285":3,"287":7,"288":2,"289":1,"290":1}}],["thousands",{"2":{"114":1}}],["those",{"2":{"18":1}}],["than",{"2":{"24":1,"116":1,"172":1,"247":2,"272":1}}],["that",{"2":{"8":1,"9":1,"10":1,"18":1,"19":8,"20":1,"25":4,"39":1,"56":1,"72":1,"85":1,"86":1,"89":1,"91":1,"99":1,"104":1,"113":1,"114":2,"150":1,"152":1,"154":1,"156":1,"162":1,"171":1,"174":1,"176":1,"183":1,"186":1,"189":1,"193":1,"198":1,"223":1,"226":1,"247":1,"256":1,"261":2,"266":1,"268":1,"280":1}}],["thing",{"2":{"19":1,"25":1}}],["thinking",{"2":{"91":1,"196":1}}],["thinks",{"2":{"57":1}}],["think",{"2":{"19":1,"152":1}}],["this",{"2":{"19":2,"26":1,"28":1,"33":1,"37":1,"42":2,"53":1,"54":1,"72":1,"73":1,"75":1,"91":1,"93":2,"96":1,"100":1,"110":2,"114":1,"115":1,"119":1,"121":1,"126":1,"128":1,"133":1,"134":1,"143":1,"152":1,"153":1,"160":1,"161":1,"173":1,"174":1,"175":1,"179":1,"181":1,"187":1,"189":1,"191":1,"193":1,"206":1,"207":1,"208":1,"209":2,"213":1,"250":1,"251":1,"252":1,"257":1,"262":1,"273":1}}],["thread",{"2":{"77":3,"79":3,"205":1}}],["threads",{"2":{"9":1,"19":1}}],["three",{"2":{"18":1,"73":1,"267":1,"269":1,"270":1,"287":1}}],["through",{"2":{"8":1,"23":2,"39":1,"47":1,"53":1,"88":1,"94":1,"168":1,"223":1,"256":1,"260":1,"265":1}}],["these",{"2":{"90":2,"114":1,"150":1,"164":1,"165":1,"215":1,"217":1,"226":1}}],["they",{"2":{"21":2,"45":1,"215":1,"216":1,"223":2}}],["then",{"2":{"19":1,"34":1,"188":1,"250":1,"287":1}}],["there",{"2":{"19":1,"174":1}}],["their",{"2":{"5":1,"21":1,"23":2,"78":1,"129":1,"164":1,"191":1,"228":1}}],["the",{"0":{"17":1,"30":1,"44":1,"66":1,"90":1,"122":1,"193":1,"194":1,"210":1,"284":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"1":1,"4":1,"6":1,"7":1,"8":1,"9":2,"10":1,"14":2,"16":1,"18":4,"19":12,"21":1,"22":2,"23":3,"24":3,"25":2,"26":1,"28":2,"29":1,"30":3,"31":1,"33":1,"34":2,"35":1,"36":1,"37":3,"38":3,"39":5,"40":5,"41":1,"42":4,"43":5,"44":2,"45":1,"48":3,"49":1,"50":2,"53":1,"54":3,"55":3,"56":4,"57":4,"59":2,"60":4,"61":3,"65":1,"66":5,"67":3,"70":1,"72":3,"73":1,"74":4,"75":5,"77":4,"78":2,"81":1,"82":2,"83":3,"84":1,"85":3,"87":6,"89":3,"90":11,"91":15,"92":4,"93":5,"94":3,"95":1,"96":4,"97":3,"99":5,"100":4,"101":3,"105":2,"108":5,"109":2,"111":3,"112":3,"113":3,"114":1,"115":5,"116":5,"117":5,"118":1,"119":9,"120":1,"121":2,"122":3,"123":3,"124":6,"125":6,"126":3,"127":2,"128":4,"129":1,"130":1,"131":2,"132":2,"133":4,"134":3,"137":2,"138":4,"139":2,"140":7,"141":7,"142":3,"143":2,"144":1,"145":4,"146":3,"147":3,"148":4,"149":1,"150":3,"151":1,"152":2,"153":9,"154":6,"155":2,"156":4,"157":1,"159":2,"160":3,"161":3,"162":8,"163":3,"164":7,"165":6,"167":5,"168":4,"169":2,"170":2,"171":1,"172":3,"173":6,"174":7,"175":3,"176":6,"178":1,"179":9,"180":7,"181":2,"182":6,"184":9,"185":3,"188":2,"189":10,"190":3,"191":4,"193":4,"194":2,"195":9,"197":1,"199":2,"201":5,"202":5,"203":4,"204":3,"205":1,"206":3,"207":7,"208":2,"209":5,"210":2,"212":6,"215":4,"216":2,"217":1,"218":2,"219":2,"220":2,"221":3,"222":5,"223":2,"225":3,"226":2,"229":1,"237":1,"239":1,"242":3,"243":1,"245":4,"246":1,"247":11,"249":8,"250":1,"251":3,"253":2,"254":1,"255":3,"256":1,"257":2,"258":1,"259":4,"260":2,"262":2,"263":1,"264":4,"265":2,"266":1,"267":3,"268":5,"269":1,"270":3,"272":4,"273":2,"274":1,"278":3,"279":2,"280":5,"281":3,"283":4,"284":1,"285":3,"286":3,"287":3,"288":7,"290":1}}],["theme",{"2":{"15":1}}],["them",{"2":{"1":1,"6":1,"90":1,"146":1,"163":2,"168":1,"210":1,"243":1}}],["tag",{"2":{"249":1,"255":3}}],["target",{"2":{"40":1,"51":1,"73":1}}],["tabs",{"2":{"88":1,"92":1}}],["tab",{"0":{"89":1,"91":1,"92":1},"2":{"31":1,"37":1,"40":1,"43":1,"49":1,"55":1,"60":1,"65":1,"70":1,"72":1,"76":1,"81":1,"89":1,"90":1,"91":1,"92":1,"93":1,"99":1,"100":1,"105":1,"115":1,"116":2,"117":1,"123":1,"125":1,"130":1,"139":1,"141":1,"143":1,"150":1,"153":1,"154":1,"159":1,"167":2,"169":1,"173":1,"174":1,"175":1,"191":1,"203":1,"219":1,"259":1,"264":1,"266":1,"268":2,"280":1,"281":1,"285":1,"288":1}}],["takes",{"2":{"88":1}}],["take",{"2":{"19":1,"75":1,"252":1}}],["talks",{"2":{"90":1}}],["talk",{"2":{"19":1}}],["tailwind",{"2":{"15":1}}],["task",{"2":{"9":2,"135":1,"153":1,"154":1,"187":1,"189":3,"196":1,"205":1,"207":2,"215":1}}],["tasks",{"0":{"13":1,"187":1,"230":1},"1":{"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1},"2":{"3":1,"8":1,"10":1,"13":1,"23":2,"86":1,"89":1,"91":1,"125":2,"151":1,"156":1,"165":1,"187":1,"196":1,"209":1,"215":1,"224":1}}],["tavily",{"2":{"8":1,"199":1}}],["template",{"2":{"220":1,"249":1}}],["tech",{"2":{"189":1,"230":1}}],["test",{"2":{"182":2,"286":1,"288":2}}],["testing",{"0":{"286":1},"2":{"126":1}}],["term",{"2":{"102":1,"166":1,"176":1,"247":1,"266":1}}],["terminal",{"0":{"92":1},"2":{"89":2,"92":2}}],["team",{"2":{"24":1}}],["teams",{"2":{"3":1}}],["tension",{"2":{"18":1}}],["textarea",{"2":{"170":1}}],["text",{"0":{"148":1},"2":{"8":2,"19":1,"32":1,"45":2,"51":1,"62":1,"69":1,"148":1,"171":1,"183":1,"184":1,"223":1,"247":1,"253":1,"272":1,"287":2}}],["telegram",{"0":{"53":1,"54":1,"209":1},"1":{"54":1,"55":1,"56":1,"57":1},"2":{"1":1,"4":1,"7":1,"23":1,"39":1,"40":1,"53":2,"54":3,"55":1,"56":3,"73":2,"79":1,"84":2,"85":2,"89":1,"104":1,"106":1,"189":1,"194":1,"223":1,"243":1,"244":1}}],["today",{"2":{"189":1,"230":1}}],["toml",{"2":{"148":1,"249":1,"250":4,"251":2,"252":1,"253":1,"255":2,"278":2,"279":2}}],["total",{"2":{"119":1,"175":1,"189":1}}],["toggle",{"2":{"91":2,"112":1,"115":1,"153":1,"163":1,"249":1}}],["topics",{"2":{"209":1}}],["topic",{"2":{"205":1,"213":1}}],["top",{"2":{"75":2,"78":1,"83":1,"189":1,"190":1,"230":1}}],["took",{"2":{"117":1,"154":1}}],["too",{"2":{"19":3,"209":1}}],["toolbar",{"2":{"144":1}}],["tool",{"0":{"164":1},"2":{"12":1,"15":1,"22":1,"157":1,"164":1,"193":1,"198":1,"218":1}}],["tools",{"2":{"8":3,"12":1,"19":1,"24":1,"86":1,"94":1,"99":1,"100":1,"124":1,"150":1,"152":1,"156":1,"158":1,"164":4,"165":2,"188":1,"195":1,"216":1,"217":1,"218":1,"222":1}}],["tokens",{"2":{"40":1,"109":1,"223":1}}],["token",{"0":{"237":1},"2":{"10":1,"28":3,"31":1,"42":3,"43":2,"54":3,"55":1,"66":1,"162":3,"179":1,"180":1,"224":1,"237":1,"247":1,"253":1,"272":1}}],["to",{"0":{"17":1,"24":1,"30":1,"99":1,"119":1,"203":1,"215":1,"259":1,"264":1,"280":1,"285":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"1":1,"3":1,"4":1,"7":1,"8":2,"12":1,"13":1,"15":1,"16":1,"18":1,"19":2,"21":2,"23":3,"24":1,"25":1,"27":2,"28":3,"29":1,"30":3,"31":1,"32":1,"33":1,"34":2,"35":1,"36":1,"37":2,"38":2,"39":1,"40":3,"41":3,"43":1,"44":1,"45":1,"47":2,"48":2,"49":1,"50":3,"53":1,"54":2,"55":1,"56":2,"57":1,"58":2,"59":2,"60":1,"61":2,"64":2,"65":1,"66":1,"67":1,"70":2,"74":1,"75":2,"76":1,"77":3,"78":3,"79":2,"81":1,"82":1,"83":1,"84":2,"85":1,"87":1,"88":1,"89":1,"90":2,"91":2,"92":2,"93":3,"94":3,"96":1,"97":1,"99":2,"101":1,"102":1,"103":2,"104":1,"106":1,"110":2,"111":1,"114":1,"115":1,"116":2,"119":3,"120":2,"121":1,"124":2,"126":1,"128":1,"129":2,"131":1,"133":2,"134":1,"135":1,"136":3,"138":1,"140":1,"141":1,"142":3,"145":1,"146":3,"147":1,"148":3,"149":1,"150":2,"151":2,"152":1,"153":1,"154":1,"155":1,"157":2,"158":1,"160":1,"161":1,"162":2,"163":2,"164":2,"165":1,"166":1,"170":1,"172":2,"173":3,"174":1,"175":1,"176":1,"177":2,"178":1,"179":1,"181":3,"182":2,"183":1,"184":1,"185":3,"186":1,"187":1,"188":3,"189":2,"191":2,"193":2,"194":1,"195":1,"197":3,"198":1,"199":1,"201":2,"203":2,"204":2,"205":1,"206":1,"207":2,"209":3,"210":1,"213":1,"215":1,"218":1,"221":3,"222":1,"223":1,"226":1,"241":1,"243":1,"244":1,"245":2,"247":4,"249":1,"250":1,"254":1,"255":5,"256":1,"257":1,"258":1,"259":2,"260":1,"262":1,"264":2,"265":1,"266":1,"272":1,"273":1,"274":1,"280":2,"281":2,"283":1,"284":2,"286":2,"287":1,"288":2,"290":1}}],["wrote",{"2":{"19":1}}],["writes",{"2":{"119":1}}],["write",{"2":{"5":1,"8":1,"140":1,"150":1,"218":1}}],["ways",{"2":{"192":1}}],["way",{"2":{"142":1,"158":1,"245":1}}],["warning",{"2":{"93":1}}],["walks",{"2":{"53":1}}],["want",{"2":{"21":2,"25":1,"30":1,"133":1,"173":1,"209":2}}],["wanted",{"2":{"19":2}}],["wasn",{"2":{"19":1}}],["was",{"2":{"19":1,"117":2,"141":1,"154":1,"212":1}}],["wait",{"2":{"19":1}}],["work",{"2":{"207":1,"215":1}}],["working",{"2":{"160":1,"174":1}}],["works",{"0":{"272":1},"2":{"119":1,"208":1,"247":1,"270":1}}],["workspace",{"0":{"122":1},"2":{"58":1,"61":1,"150":1,"249":2,"251":1,"253":1,"258":2}}],["workspaces",{"2":{"39":1}}],["workflows",{"2":{"18":1,"39":1,"270":1}}],["worse",{"2":{"19":1}}],["world",{"2":{"18":1,"39":1}}],["width",{"2":{"97":2}}],["wide",{"2":{"11":1}}],["window",{"2":{"66":1,"172":1,"180":1,"205":1}}],["windows",{"2":{"14":1}}],["will",{"2":{"25":1,"37":1,"44":1,"48":1,"50":1,"54":1,"56":1,"61":1,"66":1,"75":1,"87":1,"93":1,"110":1,"128":1,"162":1,"164":1,"165":1,"167":1,"180":1,"181":1,"193":1,"204":2,"209":1,"220":1,"242":1,"249":1,"250":1,"260":1,"265":1,"280":1}}],["without",{"2":{"5":1,"19":2,"109":1,"121":1,"133":1,"147":1,"163":1,"167":1,"187":1,"205":1,"206":1,"209":1,"222":1,"223":1,"247":2,"250":1,"271":1}}],["within",{"2":{"1":1,"5":1,"23":1,"58":1,"77":1,"121":1,"122":1,"145":1,"217":1}}],["with",{"0":{"82":1,"83":1,"150":1,"208":1},"1":{"209":1,"210":1},"2":{"1":1,"3":2,"5":2,"7":2,"8":2,"12":1,"15":1,"16":1,"18":2,"19":1,"20":1,"22":1,"23":3,"25":1,"27":1,"32":1,"33":2,"39":2,"42":1,"45":1,"47":1,"48":1,"51":1,"54":1,"56":1,"58":1,"62":1,"64":1,"69":1,"70":1,"72":1,"74":2,"83":1,"84":2,"85":1,"86":1,"89":1,"90":1,"97":1,"100":1,"101":1,"102":1,"103":1,"111":1,"119":1,"129":1,"134":1,"140":1,"144":1,"146":1,"147":1,"151":1,"164":1,"173":1,"174":1,"180":1,"190":2,"195":1,"206":1,"207":1,"217":1,"220":1,"223":1,"225":1,"226":1,"242":1,"243":2,"245":1,"246":1,"247":1,"249":2,"250":2,"254":1,"267":2,"269":1,"270":3,"272":2,"278":1,"281":1,"288":1,"290":1}}],["whose",{"2":{"75":1}}],["who",{"2":{"50":1,"56":1,"70":1,"89":1,"226":1,"251":1}}],["whether",{"2":{"117":1,"125":1,"141":1,"154":1,"175":1,"189":1}}],["when",{"2":{"19":2,"22":1,"43":1,"66":1,"69":1,"72":1,"77":1,"91":1,"99":1,"100":1,"115":1,"117":1,"133":1,"134":1,"151":1,"154":1,"164":1,"168":1,"173":1,"188":1,"189":2,"195":1,"204":1,"206":1,"207":4,"209":1,"212":1,"215":1,"241":1,"247":1,"249":1,"251":1,"258":1,"283":1}}],["where",{"2":{"18":1,"19":1,"24":2,"88":1,"210":1}}],["why",{"0":{"21":1,"114":1},"2":{"19":1,"247":1}}],["while",{"2":{"14":1,"19":1,"51":1,"68":1,"69":1,"113":1,"119":1,"247":1,"252":1}}],["which",{"2":{"9":1,"50":1,"56":1,"119":1,"181":1,"188":1,"272":1}}],["whatever",{"2":{"119":1}}],["what",{"0":{"1":1,"20":1},"2":{"18":2,"19":1,"117":1,"189":1,"215":1,"216":1,"244":1,"247":1}}],["week",{"2":{"190":1}}],["weeks",{"2":{"114":1}}],["were",{"2":{"19":1,"134":1}}],["weighted",{"2":{"247":1}}],["weights",{"2":{"247":2,"272":1}}],["weight",{"2":{"19":1}}],["we",{"2":{"18":2,"19":2,"22":1,"24":2,"25":2}}],["wework",{"0":{"58":1},"1":{"59":1,"60":1,"61":1,"62":1,"63":1},"2":{"7":1,"39":1,"106":1}}],["webm",{"2":{"284":1}}],["webp",{"2":{"149":1}}],["websites",{"2":{"95":1,"100":1}}],["websocket",{"2":{"60":2,"61":1}}],["webhook",{"0":{"37":1,"110":1},"2":{"7":1,"37":2,"110":2}}],["web",{"0":{"210":1},"2":{"1":1,"4":1,"7":2,"8":3,"12":1,"15":1,"16":1,"31":1,"39":1,"43":1,"46":1,"49":1,"50":1,"55":1,"56":1,"60":1,"65":1,"89":1,"90":1,"91":2,"147":1,"195":1,"197":1,"199":1,"210":1,"212":1,"223":1,"243":1,"245":1,"246":3,"252":1,"253":2}}],["wechat",{"0":{"64":1,"65":1,"111":1},"1":{"65":1,"66":1,"67":1,"68":1,"69":1},"2":{"1":1,"7":2,"39":2,"64":2,"65":1,"66":2,"67":1,"89":1,"106":1,"111":2,"243":1,"244":1}}],["wecom",{"0":{"58":1,"59":1},"1":{"59":1,"60":1,"61":1,"62":1,"63":1},"2":{"1":1,"7":1,"39":2,"58":2,"59":1,"60":2,"61":2,"63":2,"89":1,"106":1,"243":1,"244":1}}],["cp",{"2":{"250":1}}],["cd",{"2":{"250":1}}],["c",{"2":{"230":1}}],["cwd",{"2":{"160":1}}],["cycle",{"2":{"115":1}}],["certain",{"2":{"172":1}}],["certificates",{"2":{"97":1}}],["ceiling",{"2":{"21":1}}],["cni",{"2":{"253":1}}],["cn",{"2":{"97":1,"249":2,"251":3,"255":1}}],["c2c",{"2":{"51":1}}],["curl",{"2":{"249":1}}],["current",{"2":{"100":1,"126":1,"134":1,"145":1,"162":1,"174":1,"189":1,"195":1,"229":1}}],["currently",{"2":{"39":1,"125":1,"189":1,"212":1,"290":1}}],["custom",{"2":{"34":1,"37":1,"59":1,"60":1,"97":1,"161":1,"196":1}}],["cleaning",{"2":{"152":1}}],["clean",{"2":{"133":1,"155":1,"209":1,"218":1}}],["cleaner",{"2":{"19":1}}],["clear",{"2":{"118":1,"155":1}}],["clone",{"2":{"249":1,"250":1}}],["closer",{"2":{"78":1}}],["closed",{"2":{"19":1}}],["cloud",{"2":{"20":1,"21":1,"22":1,"24":1,"25":1,"256":1}}],["class",{"2":{"19":1}}],["clash",{"2":{"19":1}}],["clicks",{"2":{"19":1}}],["click",{"0":{"249":1},"2":{"16":1,"28":2,"31":2,"34":2,"35":1,"36":1,"37":1,"38":1,"43":2,"48":1,"49":2,"50":1,"55":2,"56":1,"60":2,"65":1,"66":2,"77":2,"78":1,"87":2,"90":1,"93":1,"94":1,"96":2,"99":1,"100":1,"108":1,"116":2,"127":1,"128":1,"131":1,"132":1,"138":2,"140":2,"146":1,"148":2,"149":1,"162":2,"163":1,"164":1,"167":1,"173":1,"179":2,"180":1,"181":2,"182":1,"184":2,"185":2,"191":1,"201":1,"203":1,"210":1,"213":1,"220":2,"221":2,"257":2,"259":1,"262":2,"264":1,"273":2,"280":1,"283":2,"284":1,"285":1,"288":3}}],["clicking",{"2":{"8":1,"88":1,"95":1,"210":1}}],["client",{"2":{"11":1,"42":4,"44":1,"46":1,"184":1}}],["china",{"0":{"251":1},"2":{"249":1,"251":2,"255":1}}],["chromium",{"2":{"97":1,"101":3,"255":1}}],["checking",{"2":{"187":1}}],["checks",{"2":{"89":1,"152":1}}],["checked",{"2":{"75":1}}],["check",{"2":{"45":1,"140":1,"162":1,"196":1,"215":1,"249":1}}],["cheap",{"2":{"21":1}}],["choose",{"2":{"37":1,"40":1,"54":2,"77":1,"138":1,"161":1,"163":1}}],["choices",{"2":{"19":1}}],["characters",{"2":{"241":1}}],["changed",{"2":{"173":1}}],["change",{"2":{"78":1,"108":1,"190":1,"209":1,"250":1,"252":1}}],["changes",{"2":{"29":1,"126":1,"134":1,"145":1,"148":1}}],["channels",{"0":{"39":1,"103":1,"105":1,"209":1},"1":{"40":1,"104":1,"105":1,"106":2,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1},"2":{"8":1,"15":1,"39":3,"84":1,"86":1,"89":1,"103":1,"104":1,"208":1,"244":2}}],["channel",{"0":{"27":1,"33":1,"41":1,"47":1,"53":1,"58":1,"64":1,"65":1,"85":1,"108":1,"136":1},"1":{"28":1,"29":1,"30":1,"31":1,"32":1,"34":1,"35":1,"36":1,"37":1,"38":1,"42":1,"43":1,"44":1,"45":1,"46":1,"48":1,"49":1,"50":1,"51":1,"52":1,"54":1,"55":1,"56":1,"57":1,"59":1,"60":1,"61":1,"62":1,"63":1,"65":1,"66":1,"67":1,"68":1,"69":1},"2":{"7":1,"9":1,"10":1,"23":1,"31":1,"37":1,"40":3,"43":1,"49":1,"50":1,"51":1,"55":1,"56":1,"60":1,"61":1,"65":1,"67":1,"70":2,"73":4,"77":6,"79":2,"82":1,"83":1,"84":1,"85":4,"89":1,"108":2,"109":1,"111":1,"112":3,"135":1,"188":1,"189":1,"195":1,"223":1}}],["chatting",{"0":{"61":1,"67":1},"2":{"74":1,"151":1,"207":1}}],["chatbox",{"2":{"24":1}}],["chats",{"2":{"4":1,"33":1,"61":1,"62":1,"87":1,"242":1}}],["chat",{"0":{"81":1},"2":{"1":1,"3":1,"7":1,"9":1,"10":1,"11":2,"15":1,"23":2,"32":1,"36":2,"39":1,"56":1,"72":2,"74":1,"77":1,"79":1,"83":1,"84":1,"85":1,"86":1,"89":1,"90":1,"91":3,"103":1,"104":1,"114":1,"115":1,"142":1,"153":1,"176":1,"183":1,"184":3,"206":1,"207":2,"208":1,"209":1,"210":2,"226":1,"232":1,"237":1,"241":1,"243":1,"270":1}}],["circling",{"2":{"18":1}}],["css",{"2":{"15":1}}],["categorize",{"2":{"222":1}}],["category",{"2":{"19":1}}],["capturing",{"2":{"95":1}}],["captured",{"2":{"128":1}}],["capture",{"2":{"94":1,"126":1}}],["capability",{"0":{"35":1},"2":{"18":1,"20":1,"22":1,"199":1}}],["capabilities",{"0":{"8":1,"158":1},"2":{"6":1,"35":1,"36":1,"89":1,"91":2,"139":1,"184":1,"216":1,"218":1,"222":1,"270":1}}],["card",{"2":{"88":1,"221":1}}],["carry",{"2":{"19":1}}],["caught",{"2":{"19":1}}],["cases",{"2":{"95":1}}],["case",{"0":{"17":1,"110":1,"111":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"196":1,"271":1}}],["called",{"2":{"193":1}}],["callback",{"2":{"37":1,"110":1}}],["calls",{"2":{"22":1,"189":2,"194":1,"195":2,"196":1}}],["call",{"2":{"15":1,"204":1}}],["cannot",{"2":{"251":1}}],["can",{"0":{"81":1},"2":{"1":1,"3":1,"4":1,"5":1,"8":1,"9":1,"10":1,"12":1,"18":1,"19":5,"23":3,"24":2,"39":1,"41":1,"42":2,"45":1,"48":1,"57":1,"61":1,"67":1,"70":2,"72":2,"73":1,"78":1,"82":1,"83":1,"84":1,"85":1,"86":1,"88":1,"89":1,"91":2,"94":2,"99":1,"100":1,"101":1,"104":1,"113":1,"114":1,"115":1,"116":1,"122":1,"140":6,"142":1,"143":1,"150":1,"153":1,"156":1,"158":1,"162":1,"164":2,"172":1,"173":1,"181":1,"186":1,"188":1,"190":1,"193":1,"194":1,"195":1,"198":1,"204":1,"210":1,"215":1,"216":1,"218":1,"223":1,"226":1,"242":1,"249":1,"261":1,"266":1,"281":1,"285":1,"287":2,"288":1}}],["creation",{"2":{"124":1,"129":1,"270":1}}],["creating",{"0":{"87":1,"96":1,"127":1,"138":1,"170":1,"179":1,"192":1,"257":1,"262":1,"273":1,"283":1},"1":{"193":1,"194":1},"2":{"90":1,"97":1,"125":1,"258":1,"263":1,"274":1}}],["creates",{"2":{"208":1}}],["created",{"2":{"88":1,"90":1,"99":1,"140":1,"145":1,"192":1,"203":1,"207":4,"215":2,"259":1,"264":1,"280":1,"283":1}}],["create",{"0":{"28":1,"34":1,"42":1,"48":1,"54":1,"59":1},"2":{"1":1,"3":1,"8":1,"23":1,"34":2,"38":1,"40":1,"48":2,"54":1,"59":1,"79":1,"87":2,"89":2,"96":1,"106":1,"124":1,"127":1,"138":1,"140":1,"145":1,"167":1,"179":1,"184":1,"186":1,"193":2,"194":1,"209":1,"210":1,"225":2,"230":3,"243":1,"250":1,"257":1,"262":1,"268":1,"273":1,"281":1,"283":1,"287":1,"288":1}}],["credential",{"2":{"60":1}}],["credentials",{"2":{"34":1,"40":2,"55":1,"59":1,"66":1,"108":1,"109":1,"178":1,"201":1,"249":1,"253":1}}],["cron",{"0":{"188":1,"190":1},"2":{"9":1,"13":1,"23":1,"89":1,"187":1,"188":1,"189":1,"190":1,"191":1,"193":1,"195":1,"196":1,"207":1,"215":1}}],["cross",{"2":{"4":1,"50":1,"56":1}}],["cohere",{"2":{"247":1}}],["collection",{"2":{"152":1,"274":2}}],["collaborate",{"2":{"3":1,"23":1}}],["corresponding",{"2":{"215":1}}],["corrupted",{"2":{"133":1}}],["cores=chromium",{"2":{"101":1}}],["cores",{"2":{"101":4,"249":1,"255":1}}],["core",{"0":{"90":1,"101":1},"2":{"24":1,"89":1,"90":1,"91":1,"97":1,"101":1,"246":3,"249":1,"250":1}}],["copy",{"2":{"28":1,"30":1,"34":1,"37":1,"48":1,"50":1,"56":1,"110":1}}],["costs",{"2":{"247":1,"271":1}}],["cost",{"2":{"19":1,"272":1}}],["could",{"2":{"19":1}}],["counter",{"2":{"195":1}}],["counts",{"2":{"191":1}}],["count",{"2":{"13":1,"119":1}}],["coding",{"2":{"15":1,"23":1,"218":1}}],["coder",{"2":{"218":3}}],["code",{"0":{"66":1,"111":1},"2":{"8":1,"50":2,"51":1,"56":3,"57":1,"64":1,"66":3,"111":2,"121":1,"218":1,"232":1}}],["conf",{"2":{"250":1}}],["config",{"2":{"77":1,"85":1,"163":1,"190":1,"249":1,"250":3,"251":1,"252":1,"253":2,"255":3,"278":1,"279":1}}],["configuring",{"0":{"90":1,"97":1,"258":1,"263":1,"274":1,"284":1},"1":{"98":1,"275":1},"2":{"39":1,"90":1}}],["configurations",{"2":{"89":1,"134":1,"163":1}}],["configuration",{"0":{"15":1,"27":1,"33":1,"41":1,"47":1,"53":1,"58":1,"64":1,"107":1,"115":1,"153":1,"200":1,"238":1,"253":1},"1":{"28":1,"29":1,"30":1,"31":1,"32":1,"34":1,"35":1,"36":1,"37":1,"38":1,"42":1,"43":1,"44":1,"45":1,"46":1,"48":1,"49":1,"50":1,"51":1,"52":1,"54":1,"55":1,"56":1,"57":1,"59":1,"60":1,"61":1,"62":1,"63":1,"65":1,"66":1,"67":1,"68":1,"69":1,"108":1,"109":1,"110":1,"111":1,"201":1,"202":1},"2":{"15":1,"40":1,"89":1,"91":1,"95":1,"98":1,"106":7,"108":1,"109":1,"110":1,"112":2,"126":1,"148":1,"162":1,"163":1,"167":1,"174":1,"202":1,"224":1,"249":1,"255":1,"280":1,"286":1}}],["configurable",{"2":{"8":2,"14":1,"86":1,"287":1}}],["configure",{"0":{"29":1,"31":1,"36":1,"37":1,"43":1,"49":1,"55":1,"60":1},"2":{"13":1,"23":1,"40":1,"49":1,"72":1,"76":1,"90":1,"104":1,"105":1,"106":1,"109":1,"115":1,"116":1,"120":1,"136":1,"139":1,"153":1,"159":1,"177":1,"184":1,"186":1,"199":1,"244":1,"258":1,"263":1,"268":1,"274":1,"284":1,"288":1}}],["configured",{"2":{"8":1,"32":1,"39":1,"100":1,"102":1,"119":1,"124":1,"167":1,"176":1,"186":1,"190":1,"198":1,"279":1,"285":1}}],["confirmed",{"2":{"66":1}}],["confirm",{"2":{"66":1,"93":1}}],["confidence",{"2":{"24":1}}],["convert",{"2":{"272":1}}],["converts",{"2":{"247":1}}],["converse",{"2":{"142":1}}],["conversational",{"0":{"193":1}}],["conversations",{"2":{"9":1,"41":1,"45":1,"62":2,"69":1,"79":1,"90":1,"164":1,"166":1,"205":1,"207":1,"213":1,"270":1,"281":1,"287":1}}],["conversation",{"0":{"206":1},"2":{"6":2,"8":1,"9":2,"10":1,"20":1,"23":1,"77":4,"79":3,"114":1,"170":2,"183":1,"184":1,"198":1,"205":1,"206":1,"208":1,"209":1,"222":1,"224":1,"229":1}}],["consists",{"2":{"246":1}}],["consume",{"2":{"223":1}}],["consolidates",{"2":{"113":1}}],["console",{"2":{"35":1,"37":1,"38":1,"59":1}}],["constraint",{"2":{"19":1}}],["concept",{"0":{"95":1,"104":1,"114":1,"122":1,"136":1,"152":1,"158":1,"168":1,"188":1,"198":1,"206":1,"217":1},"1":{"218":1}}],["concepts",{"0":{"71":1},"1":{"72":1,"73":1,"74":1,"75":1}}],["conceptually",{"2":{"19":1}}],["conclusion",{"0":{"25":1}}],["connected",{"2":{"174":1,"188":1,"195":1}}],["connects",{"2":{"161":1,"256":1}}],["connect",{"2":{"12":1,"39":2,"61":1,"103":1,"157":1,"180":1,"197":1,"199":1}}],["connectivity",{"2":{"174":1}}],["connection",{"0":{"159":1},"1":{"160":1,"161":1},"2":{"89":1,"136":1,"160":1,"161":1,"162":2,"163":3,"164":2,"165":1,"178":1,"182":1,"198":1,"253":2}}],["connections",{"0":{"157":1,"231":1},"1":{"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1},"2":{"8":1,"12":1,"105":1,"137":1,"158":1,"159":1,"163":3,"224":1}}],["connecting",{"2":{"7":1,"27":1,"41":1,"47":1,"53":1,"58":1,"64":1,"111":1,"136":1}}],["continue",{"2":{"25":1,"102":1,"281":1,"290":1}}],["continuity",{"2":{"21":1,"25":1}}],["continuously",{"2":{"19":1}}],["controls",{"2":{"176":1,"253":1,"274":1}}],["controlling",{"2":{"73":1}}],["control",{"0":{"70":1},"1":{"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"20":1,"22":1,"70":2,"73":1,"76":1,"89":1,"91":1}}],["contain",{"2":{"113":1}}],["contains",{"2":{"26":1,"91":1,"207":3}}],["containerization",{"2":{"21":1}}],["containerized",{"0":{"5":1,"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"1":1,"20":1,"22":1,"23":1,"24":1,"25":1,"243":1}}],["containers",{"2":{"5":1,"22":1,"23":1,"245":1}}],["containerd",{"2":{"5":1,"16":1,"125":1,"245":2,"246":1,"253":2}}],["container",{"0":{"121":1,"125":1,"134":1,"241":1},"1":{"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1},"2":{"1":2,"5":2,"8":2,"12":1,"15":1,"23":1,"24":1,"86":1,"89":5,"92":3,"93":1,"121":1,"122":1,"123":1,"124":5,"125":4,"126":1,"127":1,"128":1,"130":2,"131":1,"132":1,"133":2,"134":4,"143":1,"146":2,"160":1,"217":1,"221":1,"224":1,"243":1,"247":3,"253":1,"272":1}}],["contact",{"2":{"18":1}}],["contents",{"2":{"132":1}}],["content",{"2":{"8":1,"19":1,"29":1,"32":1,"42":1,"45":1,"51":1,"62":1,"69":1,"94":1,"95":1,"119":1,"148":1,"170":1,"171":1,"210":1,"220":1,"221":1,"241":1}}],["contextually",{"2":{"166":1}}],["contexts",{"0":{"94":1,"98":1},"1":{"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1},"2":{"90":1,"96":3}}],["context",{"0":{"96":1,"97":1,"99":1,"236":1},"1":{"98":1},"2":{"4":1,"6":1,"8":1,"9":2,"12":1,"18":2,"19":1,"21":2,"22":1,"23":1,"25":1,"57":1,"77":1,"90":1,"91":1,"94":2,"95":1,"96":2,"97":1,"98":2,"99":3,"100":1,"157":2,"165":1,"168":1,"188":1,"195":1,"205":1,"206":2,"207":1,"208":1,"209":1,"215":1,"224":1,"229":1}}],["combined",{"2":{"249":1}}],["combining",{"2":{"114":1}}],["com",{"2":{"179":1,"250":1}}],["common",{"0":{"109":1,"254":1},"2":{"148":1,"190":1}}],["communication",{"0":{"104":1},"2":{"91":1,"135":1}}],["communicates",{"2":{"160":1}}],["communicate",{"2":{"41":1}}],["community",{"2":{"27":1,"39":1}}],["command`",{"2":{"218":1}}],["command",{"0":{"225":1},"2":{"9":1,"54":1,"160":3,"188":1,"189":1,"194":1,"195":2,"196":1,"207":1,"208":1,"224":1,"225":2,"230":3,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1}}],["commands",{"0":{"10":1,"223":1,"227":1,"242":1,"254":1},"1":{"224":1,"225":1,"226":1,"227":1,"228":2,"229":2,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1},"2":{"1":1,"5":1,"8":1,"10":3,"13":1,"23":2,"24":1,"30":1,"32":2,"92":1,"121":1,"215":1,"223":3,"224":1,"225":2,"226":4,"228":1,"242":1,"243":1}}],["comes",{"2":{"77":1,"86":1}}],["come",{"2":{"8":1,"9":1}}],["component",{"2":{"144":1}}],["compose",{"2":{"8":1,"16":1,"101":1,"140":1,"245":1,"246":1,"247":1,"248":1,"249":2,"250":3,"251":4,"254":6,"278":2,"279":1}}],["compression",{"0":{"172":1},"2":{"116":1,"172":1}}],["comprehensive",{"2":{"10":1,"199":1,"204":1}}],["compacted",{"2":{"117":1}}],["compact",{"0":{"114":1,"172":1},"2":{"89":1,"116":1,"172":2,"247":1,"272":1,"281":1}}],["compaction",{"0":{"14":1,"113":1,"116":1,"117":1},"1":{"114":1,"115":1,"116":1,"117":1,"118":2,"119":1,"120":1},"2":{"6":1,"14":2,"89":3,"91":4,"113":1,"114":1,"115":6,"116":5,"117":5,"118":1,"119":4,"172":2,"270":1}}],["compared",{"2":{"181":1}}],["compare",{"0":{"24":1}}],["compatible",{"2":{"11":1,"178":1}}],["complement",{"2":{"196":1}}],["completed",{"2":{"117":1,"154":1}}],["completions",{"2":{"11":1,"184":1}}],["complex",{"2":{"8":1,"86":1,"126":1}}],["computer",{"2":{"1":1,"23":1,"122":1,"146":1}}],["sslmode",{"2":{"253":1}}],["sse",{"0":{"161":1},"2":{"12":1,"124":1,"161":1}}],["swap",{"2":{"222":1}}],["switching",{"2":{"173":1,"209":1}}],["switch",{"2":{"10":1,"11":1,"112":1,"210":1}}],["snapshotter",{"2":{"253":1}}],["snapshot",{"0":{"127":1,"128":1},"2":{"127":2,"128":1,"129":1}}],["snapshots",{"0":{"126":1,"129":1},"1":{"127":1,"128":1,"129":1},"2":{"5":1,"89":1,"126":1,"129":1}}],["silently",{"2":{"249":1}}],["silent",{"2":{"249":1}}],["significantly",{"2":{"247":1,"272":1}}],["single",{"2":{"104":1}}],["size",{"2":{"94":1,"184":1}}],["simultaneously",{"2":{"92":1,"104":1}}],["simple",{"2":{"23":1,"64":1}}],["sidebar",{"2":{"28":1,"34":1,"40":1,"87":1,"96":1,"97":1,"137":1,"138":1,"179":2,"199":1,"201":1,"202":1,"210":1,"212":1,"268":1,"288":1}}],["sites",{"2":{"97":1}}],["sit",{"2":{"18":1,"19":1}}],["shipped",{"2":{"270":1}}],["sh",{"2":{"249":12}}],["shut",{"2":{"124":1}}],["shanghai",{"2":{"97":1}}],["shared",{"2":{"215":1}}],["share",{"2":{"24":1}}],["sharing",{"2":{"22":1,"24":1,"130":1,"163":1}}],["shell",{"2":{"92":1}}],["should",{"2":{"56":1,"90":2,"94":1,"153":1,"156":1,"216":1}}],["shows",{"2":{"174":1,"191":1,"212":1,"237":1,"239":1}}],["showing",{"2":{"141":1}}],["shown",{"2":{"48":1,"97":1,"124":1}}],["show",{"2":{"10":1,"49":1,"68":1,"215":1,"224":1}}],["slow",{"2":{"249":1}}],["sludge",{"2":{"19":1}}],["slash",{"0":{"10":1,"223":1},"1":{"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1},"2":{"9":1,"10":2,"32":1,"208":1,"223":2,"242":1}}],["socket",{"2":{"253":1}}],["sogou",{"2":{"199":1}}],["software",{"2":{"122":1}}],["sound",{"2":{"286":1}}],["sources",{"2":{"158":1}}],["source",{"0":{"79":1},"2":{"25":1,"77":1,"79":1,"85":1}}],["soul",{"2":{"8":1}}],["so",{"2":{"19":2,"21":1,"223":1,"247":2,"287":1}}],["some",{"2":{"162":1,"180":1,"225":1,"246":1}}],["someone",{"2":{"21":1}}],["somewhere",{"2":{"19":2}}],["something",{"2":{"18":1,"19":3}}],["smell",{"2":{"19":1}}],["smoother",{"2":{"19":1}}],["small",{"2":{"19":1,"183":1}}],["smarter",{"2":{"18":1}}],["smtp",{"2":{"7":1,"39":1,"136":1,"138":1}}],["scoping",{"2":{"258":2}}],["scoped",{"0":{"85":1},"2":{"206":1}}],["scope",{"0":{"79":1},"2":{"77":1,"79":2,"85":1}}],["scopes",{"2":{"30":1}}],["scale",{"2":{"97":1}}],["scan",{"0":{"66":1},"2":{"64":1,"66":2,"111":1}}],["scratch",{"2":{"173":1}}],["scripts",{"2":{"122":1}}],["script",{"2":{"101":1,"249":2,"251":1}}],["scroll",{"2":{"29":1,"93":1,"100":1}}],["screenshot",{"2":{"100":1}}],["screenshots",{"2":{"8":1,"94":1,"95":1}}],["screen",{"2":{"19":1}}],["scheduling",{"2":{"12":1}}],["schedules",{"0":{"191":1,"192":1},"1":{"193":1,"194":1},"2":{"191":1,"192":1,"194":1}}],["scheduled",{"0":{"13":1,"152":1,"187":1,"230":1},"1":{"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1},"2":{"10":1,"13":1,"23":1,"89":1,"152":1,"187":1,"207":1,"215":1,"224":1}}],["schedule",{"0":{"189":1,"196":1,"230":1},"2":{"9":1,"10":1,"23":1,"89":1,"151":1,"188":2,"189":3,"191":1,"193":4,"194":1,"195":4,"196":2,"207":1,"210":1,"215":1,"224":1,"225":2,"230":10,"237":1}}],["spaces",{"2":{"225":1}}],["sparse",{"0":{"247":1,"272":1,"278":1},"2":{"168":1,"173":1,"246":4,"247":9,"249":1,"250":2,"253":2,"267":2,"271":4,"272":5,"274":2,"278":5}}],["split",{"2":{"24":1}}],["spoken",{"2":{"8":1,"287":1}}],["speed",{"2":{"284":2,"286":1,"287":1,"288":1}}],["speech",{"2":{"8":1,"282":1,"285":1,"287":2,"288":1}}],["speaker",{"2":{"19":1}}],["specify",{"2":{"172":1,"201":1}}],["specified",{"2":{"13":1,"23":1,"116":1}}],["specifically",{"2":{"199":1}}],["specification",{"2":{"46":1}}],["specific",{"0":{"84":1},"2":{"4":1,"8":1,"70":1,"73":1,"77":5,"79":2,"85":2,"101":1,"136":1,"163":1,"170":1,"176":1,"183":1,"188":1,"196":1,"198":1,"201":1,"205":1,"249":1,"287":1}}],["special",{"0":{"110":1,"111":1},"2":{"156":1}}],["specialized",{"2":{"8":1,"86":1,"88":1}}],["synthesis",{"2":{"282":1,"286":1,"288":1}}],["synthesized",{"2":{"204":1}}],["synthesize",{"2":{"8":1,"285":1,"287":2,"288":1}}],["syntax",{"2":{"148":1,"190":1}}],["sync",{"2":{"43":1}}],["system",{"2":{"1":2,"18":1,"70":1,"75":1,"121":1,"156":1,"166":1,"174":1,"207":1,"222":2,"243":2,"267":1,"287":1}}],["skill",{"0":{"218":1,"220":1,"240":1},"2":{"8":1,"89":1,"217":1,"218":2,"219":1,"220":1,"221":2,"224":1,"240":2}}],["skills",{"0":{"216":1,"217":1,"219":1,"222":1,"240":1},"1":{"217":1,"218":2,"219":1,"220":2,"221":2,"222":1},"2":{"8":2,"15":1,"23":1,"89":1,"150":1,"152":1,"156":1,"188":1,"216":1,"219":1,"222":3,"224":1}}],["sudo",{"2":{"249":6,"250":1,"254":1}}],["sun=0",{"2":{"190":1}}],["summarize",{"2":{"189":1,"194":2,"230":1}}],["summary",{"2":{"117":1,"154":1,"189":1,"193":1,"225":1,"237":2,"253":1}}],["sure",{"2":{"167":1}}],["survive",{"2":{"18":1}}],["such",{"2":{"91":1,"94":1,"97":2,"100":1,"176":1}}],["succeeds",{"2":{"67":1}}],["successfully",{"2":{"56":1,"117":1,"141":1,"154":1}}],["sustainable",{"2":{"24":1}}],["subsequent",{"2":{"209":1}}],["subscriptions",{"2":{"37":1}}],["subject",{"0":{"73":1},"2":{"73":1,"74":2,"75":1,"77":1,"84":1,"141":2}}],["subjects",{"2":{"72":1,"73":1,"75":1,"82":1,"83":1}}],["submitting",{"2":{"95":1}}],["submit",{"2":{"38":1}}],["sub",{"2":{"9":1,"225":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1}}],["subagent",{"2":{"9":1,"207":3,"210":1,"215":2}}],["subagents",{"2":{"8":2}}],["supported",{"0":{"32":1,"45":1,"51":1,"57":1,"62":1,"69":1,"105":1,"199":1},"1":{"106":1},"2":{"53":1,"184":1,"199":1,"268":1}}],["support",{"0":{"7":1,"11":1,"12":1},"2":{"7":5,"10":1,"11":1,"12":2,"24":1,"32":1,"39":2,"45":1,"49":1,"51":2,"53":1,"57":1,"62":1,"69":2,"146":1,"180":1,"223":1}}],["supports",{"2":{"5":1,"13":1,"23":1,"33":1,"39":1,"91":1,"130":1,"148":1,"157":1,"162":1,"180":1,"184":2,"247":1,"267":2,"270":1,"272":1,"282":1,"287":1}}],["steps",{"0":{"102":1,"120":1,"186":1,"269":1,"290":1},"2":{"136":1,"184":1}}],["step",{"0":{"28":1,"29":1,"30":1,"31":1,"34":1,"35":1,"36":1,"37":1,"38":1,"42":1,"43":1,"44":1,"48":1,"49":1,"50":1,"54":1,"55":1,"56":1,"59":1,"60":1,"61":1,"65":1,"66":1,"67":1},"2":{"90":1,"106":2,"244":2}}],["studio",{"2":{"20":1,"24":1}}],["stopped",{"2":{"125":1,"127":1}}],["stop",{"2":{"89":1,"124":1,"254":1}}],["stops",{"2":{"19":1}}],["stood",{"2":{"19":1}}],["store",{"2":{"28":1,"113":1,"122":1,"281":1}}],["stored",{"2":{"23":2,"162":2,"168":1,"175":1,"217":1,"258":1,"263":1,"277":1}}],["stores",{"2":{"6":1,"94":1,"178":1,"266":1}}],["story",{"0":{"19":1}}],["storage",{"2":{"14":1,"19":1,"22":1,"175":1,"256":1}}],["style",{"2":{"19":1,"97":1}}],["still",{"2":{"18":1}}],["stdio",{"0":{"160":1},"2":{"12":1,"89":1}}],["stable",{"2":{"127":1}}],["stale",{"2":{"114":1,"119":1}}],["state",{"2":{"122":1,"126":1,"127":1,"128":1,"133":1}}],["status",{"0":{"174":1},"2":{"112":1,"117":1,"125":1,"141":1,"152":1,"154":1,"155":1,"162":2,"173":1,"174":2,"175":1,"191":1,"254":1}}],["static",{"2":{"100":1}}],["statistics",{"0":{"175":1},"2":{"10":1,"224":1}}],["stay",{"2":{"22":1}}],["stays",{"2":{"20":1,"25":2}}],["stack",{"2":{"22":1,"25":1,"245":1,"246":1}}],["stakes",{"2":{"19":1}}],["startup",{"2":{"252":2}}],["starts",{"2":{"229":1,"247":1}}],["starting",{"0":{"208":1},"1":{"209":1,"210":1},"2":{"206":1,"250":1}}],["started",{"2":{"19":2,"244":1,"246":1}}],["start",{"0":{"61":1,"67":1},"2":{"9":1,"10":1,"40":1,"44":1,"66":2,"89":1,"116":1,"124":1,"133":1,"173":1,"209":1,"224":1,"249":1,"250":2,"254":1}}],["standardized",{"2":{"158":1}}],["standard",{"2":{"9":1,"90":1,"160":1,"163":1,"190":1,"207":1,"270":1}}],["structure",{"0":{"218":1}}],["structured",{"2":{"1":1,"6":1,"142":1,"166":1,"243":1}}],["strip",{"2":{"242":1}}],["string",{"2":{"97":1}}],["strict",{"2":{"22":1}}],["streamed",{"2":{"45":1,"62":1}}],["stream",{"2":{"19":1}}],["streaming",{"2":{"7":2,"15":1,"39":1,"45":1,"53":1,"57":1,"62":1}}],["saas",{"2":{"256":1,"261":1,"267":2,"269":2}}],["saving",{"2":{"99":1,"126":1}}],["saves",{"2":{"66":1,"181":1}}],["save",{"2":{"5":1,"29":1,"31":1,"37":2,"43":1,"48":1,"49":1,"55":1,"60":1,"77":1,"78":1,"90":1,"99":1,"112":2,"124":1,"131":1,"148":2,"167":1,"203":1,"220":1,"259":1,"264":1,"280":1,"285":1,"288":1}}],["safely",{"2":{"126":1}}],["safe",{"2":{"21":1}}],["say",{"2":{"19":1}}],["same",{"2":{"4":1,"19":1,"114":1}}],["serper",{"2":{"199":1}}],["service",{"0":{"246":1,"247":1},"1":{"247":1},"2":{"136":1,"137":1,"178":1,"179":1,"195":1,"246":2,"247":1,"249":1,"252":1,"253":1,"261":1,"271":1,"278":1,"287":1}}],["services",{"2":{"11":1,"12":1,"16":1,"22":1,"104":1,"157":1,"246":1,"249":1,"250":1,"252":1}}],["serving",{"2":{"22":1}}],["servers",{"2":{"27":1,"39":1,"138":1,"162":1}}],["server",{"0":{"30":1},"2":{"16":1,"29":1,"30":1,"136":1,"160":1,"161":3,"162":1,"164":2,"165":2,"190":1,"245":1,"246":2,"253":4}}],["self",{"2":{"178":1,"199":1,"261":1,"267":2,"269":2}}],["selection",{"0":{"101":1},"2":{"101":1,"249":1}}],["selected",{"0":{"82":1},"2":{"91":1,"108":1,"212":1,"249":1,"280":1,"286":1}}],["select",{"2":{"30":3,"31":1,"43":1,"49":1,"50":1,"55":2,"56":1,"60":1,"65":1,"77":3,"90":3,"97":1,"98":1,"99":1,"100":1,"108":1,"132":1,"140":1,"146":1,"163":1,"167":1,"170":1,"180":1,"181":2,"182":1,"184":1,"191":1,"202":1,"203":2,"257":1,"258":1,"259":1,"262":1,"263":1,"264":1,"273":1,"274":1,"275":1,"280":1,"283":1,"285":1,"287":1,"288":2}}],["sent",{"2":{"141":3,"161":1,"189":1,"223":1}}],["sends",{"2":{"168":1,"188":1,"193":1}}],["sender",{"2":{"73":1,"75":1}}],["sending",{"2":{"40":1,"152":1,"187":1}}],["send",{"2":{"4":1,"8":2,"30":1,"36":1,"45":1,"50":1,"54":1,"56":1,"57":2,"61":1,"67":1,"110":1,"135":1,"140":1,"142":1,"189":1,"194":1,"195":1,"209":1,"225":1}}],["security",{"2":{"121":1}}],["securely",{"2":{"28":1,"48":1,"162":1}}],["seconds",{"2":{"43":1}}],["secrets",{"2":{"40":1,"109":1}}],["secret",{"2":{"34":1,"37":1,"42":1,"54":1,"59":1,"60":1,"249":2,"250":1,"253":1,"258":1,"263":1}}],["sections",{"2":{"253":1,"278":1}}],["section",{"2":{"26":1,"29":1,"164":1,"184":1,"253":1,"279":1}}],["seen",{"2":{"77":1}}],["see",{"2":{"10":1,"40":1,"87":1,"102":1,"106":1,"120":2,"145":1,"149":1,"172":1,"176":1,"215":1,"229":1,"246":1,"247":1,"260":1,"265":1}}],["sessions",{"0":{"9":1,"205":1,"211":1,"212":1,"213":1,"214":1,"215":1},"1":{"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":2,"213":2,"214":2,"215":1},"2":{"9":5,"122":1,"206":2,"207":1,"210":4,"212":1,"214":1,"215":4,"229":1}}],["session",{"0":{"207":1,"208":1},"1":{"209":1,"210":1},"2":{"8":2,"9":1,"10":1,"205":2,"206":3,"207":3,"208":1,"209":3,"210":3,"212":4,"213":1,"214":1,"215":2,"224":1,"229":1,"237":1}}],["searxng",{"2":{"8":1,"199":1,"201":1}}],["searching",{"0":{"171":1}}],["searches",{"2":{"90":1,"176":1}}],["search",{"0":{"197":1,"199":1,"201":1,"203":1,"235":2},"1":{"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1},"2":{"6":1,"8":3,"12":2,"20":1,"23":1,"36":1,"54":1,"77":1,"89":1,"90":4,"91":2,"100":1,"114":1,"163":1,"171":1,"183":1,"184":1,"195":1,"197":1,"198":2,"199":6,"201":4,"203":1,"204":3,"210":1,"224":2,"235":2,"246":1,"247":2,"260":1,"265":1,"266":1,"267":1,"271":2,"272":1,"274":1,"281":1}}],["semantic",{"2":{"6":1,"23":1,"119":1,"247":1,"267":1,"270":1,"271":1}}],["separate",{"2":{"5":1,"207":1}}],["separately",{"2":{"4":1}}],["setup",{"0":{"40":1,"281":1},"2":{"16":1,"39":1,"64":1,"101":1,"102":1,"244":1,"271":1}}],["settings",{"0":{"29":1,"68":1,"90":1,"232":2},"2":{"10":2,"15":1,"23":1,"34":1,"37":1,"49":1,"89":1,"90":1,"97":1,"173":1,"176":1,"180":1,"182":1,"201":1,"202":1,"224":2,"226":1,"232":4,"249":1,"258":1,"263":1,"268":1,"274":1,"275":1,"279":1,"280":1,"284":1,"287":2}}],["set",{"2":{"3":1,"8":1,"10":1,"15":1,"23":1,"77":1,"81":1,"82":1,"83":1,"84":2,"85":1,"90":1,"91":1,"119":1,"140":1,"152":1,"158":1,"172":1,"195":1,"206":1,"219":1,"225":1,"233":6,"234":2,"235":2,"236":2,"250":1,"251":1,"255":1,"290":1}}],["s",{"0":{"90":1},"2":{"4":1,"14":1,"18":1,"19":6,"21":1,"25":1,"31":1,"32":1,"37":1,"40":1,"43":3,"44":1,"47":1,"49":1,"55":1,"58":1,"60":2,"65":1,"70":1,"72":1,"76":1,"87":1,"89":2,"90":1,"91":2,"92":1,"101":1,"102":1,"105":1,"110":1,"112":2,"113":1,"115":1,"116":1,"119":1,"122":1,"123":1,"125":2,"126":2,"131":1,"132":1,"133":1,"134":1,"139":1,"140":1,"141":2,"146":2,"147":1,"148":2,"150":1,"154":1,"156":1,"160":1,"162":2,"166":1,"167":1,"168":1,"169":1,"170":2,"173":1,"181":1,"189":1,"190":1,"204":1,"206":1,"207":4,"209":1,"217":1,"219":1,"221":1,"222":1,"230":1,"249":2,"268":2,"270":1,"281":1,"282":1,"285":1,"288":2,"289":1}}],["mp3",{"2":{"284":2}}],["m",{"2":{"42":2}}],["my",{"2":{"54":2,"193":1,"194":1,"201":1}}],["mybot",{"2":{"42":1,"43":1}}],["myself",{"2":{"19":1}}],["mirrors",{"2":{"255":1}}],["mirror=true",{"2":{"249":2,"251":1}}],["mirror",{"0":{"251":1},"2":{"249":1,"251":1,"253":1,"255":1}}],["midnight",{"2":{"190":2}}],["migration",{"2":{"130":1}}],["mini",{"2":{"233":1}}],["minimum",{"2":{"36":1,"250":1}}],["minute",{"2":{"190":1}}],["minutes",{"2":{"91":1,"153":2,"190":1,"196":1,"232":1,"252":1}}],["microsoft",{"2":{"282":1,"289":1}}],["mic",{"2":{"19":1}}],["must",{"2":{"124":1,"250":1,"255":1,"278":1,"279":1}}],["much",{"2":{"19":1,"172":1}}],["multilingual",{"2":{"247":2,"272":1,"278":1}}],["multiple",{"2":{"3":1,"7":1,"22":1,"23":1,"92":1,"104":1,"122":1,"163":2,"166":1,"204":1,"246":1,"247":1,"272":1}}],["multi",{"0":{"3":1,"4":1,"7":1,"11":1},"2":{"1":1,"6":1,"19":1,"23":1,"24":1,"243":1}}],["mcpservers",{"2":{"163":1}}],["mcp",{"0":{"12":1,"157":1,"231":2},"1":{"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1},"2":{"8":2,"12":2,"15":1,"23":1,"32":1,"89":2,"150":1,"156":1,"157":1,"158":2,"159":2,"161":2,"162":2,"164":1,"165":3,"224":2,"231":3}}],["mounts",{"2":{"250":1}}],["morning",{"2":{"189":1,"194":1,"230":2}}],["more",{"2":{"8":1,"10":1,"12":1,"19":3,"23":2,"24":1,"25":1,"45":1,"95":1,"104":1,"116":1,"119":1,"155":1,"172":1,"247":1}}],["move",{"2":{"145":1}}],["mono",{"2":{"284":3}}],["monday",{"2":{"190":1}}],["month",{"2":{"190":3}}],["months",{"2":{"114":1}}],["monitor",{"2":{"150":1,"173":1}}],["monitoring",{"0":{"154":1},"1":{"155":1},"2":{"142":1}}],["monaco",{"2":{"148":1,"220":1}}],["mobile",{"2":{"19":1,"91":1,"94":1,"97":2}}],["moment",{"2":{"19":3}}],["most",{"2":{"14":1,"19":1,"53":1,"90":1,"113":1,"168":1,"239":1}}],["modalities",{"2":{"184":1}}],["modify",{"2":{"122":1,"148":1,"171":1,"221":1,"226":1}}],["modes",{"0":{"271":1},"1":{"272":1},"2":{"246":1,"247":1,"267":1,"269":1,"270":1}}],["mode",{"0":{"37":1,"272":1,"277":1,"278":1,"279":1},"2":{"37":1,"110":1,"168":1,"173":1,"176":1,"247":1,"271":1,"272":2,"274":2}}],["modern",{"2":{"15":1}}],["modelcontextprotocol",{"2":{"160":1}}],["models",{"0":{"181":1,"185":1,"233":1},"2":{"10":1,"15":1,"18":1,"21":1,"89":1,"91":1,"181":4,"183":2,"184":1,"186":1,"224":1,"244":1,"247":1,"287":1}}],["model",{"0":{"177":1,"183":1,"184":1,"233":1,"284":1},"1":{"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":2,"185":2,"186":1},"2":{"10":1,"11":2,"12":1,"20":1,"23":1,"90":2,"91":5,"100":1,"115":2,"119":1,"153":2,"157":1,"176":1,"177":1,"181":1,"183":1,"184":5,"185":2,"224":1,"225":1,"232":4,"233":8,"237":3,"247":5,"271":1,"272":2,"274":2,"278":1,"279":1,"283":1,"284":1,"285":2,"286":1,"287":3,"288":3}}],["modular",{"2":{"8":1,"222":1}}],["md",{"2":{"8":2,"148":1,"241":1}}],["mention",{"0":{"242":1},"2":{"242":2}}],["me",{"2":{"193":1,"225":1}}],["meaning",{"2":{"190":1}}],["mean",{"2":{"116":1}}],["means",{"2":{"75":1}}],["merges",{"2":{"119":1}}],["merged",{"2":{"117":1}}],["merge",{"2":{"115":1}}],["merging",{"2":{"114":1}}],["medium",{"2":{"91":1,"232":1}}],["media",{"2":{"45":1,"69":1}}],["metaphors",{"2":{"19":1}}],["message",{"2":{"29":1,"30":1,"32":1,"36":1,"37":2,"44":1,"45":1,"50":1,"51":2,"57":1,"62":1,"69":1,"72":1,"73":1,"77":1,"168":1,"195":1,"205":1,"209":1,"214":1}}],["messages",{"2":{"4":1,"8":1,"11":1,"30":1,"36":1,"39":1,"40":1,"41":1,"45":2,"51":1,"61":2,"62":2,"67":1,"69":2,"84":1,"109":1,"110":1,"170":1,"184":1,"206":1,"209":1}}],["messaging",{"2":{"7":4,"8":1,"12":1,"39":4,"41":1,"64":1,"86":1,"103":1,"104":1}}],["mem0",{"0":{"256":1,"257":1,"258":1,"259":1},"1":{"257":1,"258":1,"259":1,"260":1},"2":{"167":1,"256":3,"257":1,"258":3,"259":1,"260":2,"267":2,"269":2}}],["memories",{"0":{"170":1},"2":{"6":1,"8":1,"14":1,"89":1,"113":1,"114":4,"115":1,"116":1,"117":1,"119":3,"120":1,"168":2,"169":1,"171":2,"172":2,"173":2,"175":1,"176":2,"215":1,"268":1,"274":1,"277":1,"281":4}}],["memory",{"0":{"6":1,"14":1,"113":1,"119":1,"166":1,"168":1,"172":1,"234":2,"256":1,"261":1,"266":1,"270":1,"271":1,"280":1,"281":1},"1":{"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"257":1,"258":1,"259":1,"260":1,"262":1,"263":1,"264":1,"265":1,"267":1,"268":1,"269":1,"271":1,"272":2,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1},"2":{"1":2,"6":2,"8":1,"11":1,"12":1,"14":2,"19":1,"20":1,"22":1,"23":3,"24":1,"25":1,"86":1,"89":3,"90":3,"91":5,"93":1,"102":3,"113":3,"114":1,"115":2,"116":2,"119":3,"120":3,"156":1,"166":1,"167":6,"168":1,"169":1,"170":3,"171":1,"172":2,"173":2,"174":5,"175":2,"176":4,"183":1,"215":1,"224":2,"234":2,"243":2,"246":2,"247":5,"256":2,"257":2,"259":1,"260":4,"261":3,"262":2,"264":1,"265":4,"266":5,"267":4,"268":3,"269":6,"270":8,"273":2,"274":2,"280":2,"281":5}}],["memohai",{"2":{"250":1}}],["memoh123",{"2":{"249":1,"255":1}}],["memoh",{"0":{"0":1,"1":1,"17":1,"31":1,"43":1,"49":1,"55":1,"60":1,"65":1,"243":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"244":1},"2":{"1":1,"16":1,"18":1,"20":1,"21":1,"22":1,"24":2,"25":3,"26":1,"27":1,"31":1,"33":1,"37":2,"39":2,"40":1,"41":1,"43":1,"47":1,"49":1,"50":2,"53":2,"54":2,"55":1,"56":2,"58":1,"60":1,"64":1,"65":1,"66":2,"70":1,"94":1,"101":1,"104":1,"109":1,"110":2,"121":1,"134":1,"135":1,"143":1,"157":1,"160":1,"162":3,"164":1,"166":1,"168":1,"177":1,"181":2,"183":1,"190":1,"197":1,"207":1,"216":1,"223":1,"243":1,"244":2,"245":1,"246":1,"249":10,"250":2,"251":1,"255":2,"266":1,"267":2,"270":2,"287":1}}],["members",{"2":{"3":1,"27":1,"29":1}}],["member",{"2":{"1":1,"73":1,"243":1}}],["macos",{"2":{"250":1}}],["machine",{"2":{"131":1,"132":1,"146":1}}],["masked",{"2":{"247":1}}],["marked",{"2":{"226":2}}],["markdown",{"0":{"217":1},"1":{"218":1},"2":{"7":1,"45":1,"49":2,"51":1,"53":1,"57":1,"89":1,"217":1}}],["may",{"2":{"114":1,"168":1,"201":1,"252":1}}],["mapped",{"2":{"109":1}}],["making",{"2":{"25":2}}],["make",{"2":{"21":1,"167":1}}],["makes",{"2":{"18":1,"21":1,"176":1}}],["matters",{"2":{"75":1}}],["mattered",{"2":{"19":1}}],["match",{"2":{"250":1,"255":1}}],["matching",{"2":{"75":2}}],["matches",{"2":{"72":1,"73":1,"75":2,"91":1}}],["matrix",{"0":{"41":1,"42":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1},"2":{"1":1,"7":1,"39":2,"41":3,"42":5,"43":5,"44":1,"45":1,"46":1,"89":1,"104":1,"106":1,"243":1,"244":1}}],["managing",{"0":{"76":1,"98":1,"118":1,"129":1,"146":1,"155":1,"171":1,"182":1,"185":1,"202":1,"211":1,"219":1,"275":1},"1":{"77":1,"78":1,"79":1,"212":1,"213":1,"214":1,"220":1,"221":1},"2":{"256":1}}],["managed",{"2":{"207":1}}],["manages",{"2":{"206":1,"266":1}}],["managers",{"2":{"122":1}}],["manager",{"2":{"89":1,"149":1}}],["manage",{"0":{"230":1,"231":1,"233":1,"234":1,"235":1,"236":1},"2":{"3":1,"8":2,"10":1,"88":1,"96":1,"102":1,"120":1,"123":1,"134":1,"137":1,"140":1,"143":1,"150":1,"169":1,"219":1,"222":1,"224":6,"268":1,"269":1,"281":1}}],["management",{"0":{"3":1,"86":1,"121":1,"143":1,"166":1},"1":{"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1},"2":{"8":1,"23":1,"38":1,"59":2,"89":1,"100":1,"102":1,"120":1,"135":1,"260":2,"265":2,"269":1,"281":1}}],["many",{"2":{"19":1,"114":1,"124":1}}],["manifesto",{"2":{"18":1}}],["manually",{"2":{"101":1,"116":1,"150":1,"164":1,"170":1,"181":1,"281":1}}],["manual",{"0":{"116":1,"250":1},"1":{"251":1},"2":{"13":1,"16":1,"66":1,"180":1,"187":1,"270":1}}],["max",{"2":{"13":1,"189":1,"194":1,"195":1,"196":1}}],["mail",{"2":{"142":1}}],["mailgun",{"2":{"7":1,"39":1,"136":1,"138":1}}],["mainland",{"0":{"251":1},"2":{"249":1,"251":1,"255":1}}],["maintain",{"2":{"122":1,"206":1}}],["maintains",{"2":{"9":1,"205":1}}],["maintenance",{"2":{"115":1,"187":1}}],["main",{"2":{"91":1,"153":1,"245":1,"246":1}}],["affecting",{"2":{"121":1}}],["after",{"0":{"281":1},"2":{"67":1,"78":1,"90":1,"97":1,"99":1,"102":1,"111":1,"119":1,"162":1,"252":1,"258":1,"263":1,"269":1,"274":1}}],["avatar",{"2":{"87":1}}],["available",{"0":{"267":1,"289":1},"2":{"10":1,"101":1,"164":1,"181":2,"188":1,"215":1,"224":1,"226":1,"228":1,"253":1,"284":1,"290":1}}],["able",{"2":{"243":1}}],["above",{"2":{"75":1}}],["about",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1},"2":{"26":1,"125":1,"244":1}}],["abcdefghijklmnopqrstuvwxyz",{"2":{"54":1}}],["adjustment",{"2":{"284":1}}],["advanced",{"2":{"218":1}}],["admin123",{"2":{"249":1,"252":1}}],["administrative",{"2":{"223":1}}],["admins",{"2":{"72":1,"82":1}}],["admin",{"2":{"59":1,"75":1,"249":3,"250":2,"252":1,"253":2}}],["additional",{"2":{"201":1,"225":1,"277":1}}],["adding",{"0":{"77":1,"108":1,"140":1,"184":1,"201":1,"220":1},"2":{"181":1}}],["address",{"2":{"136":1,"140":1,"141":1,"253":2}}],["addresses",{"2":{"114":1}}],["add",{"0":{"65":1},"2":{"30":1,"31":1,"37":2,"40":1,"43":1,"49":1,"55":1,"60":1,"65":1,"77":1,"82":1,"83":1,"84":1,"85":1,"96":1,"108":1,"138":1,"140":1,"163":3,"179":1,"184":1,"201":1,"220":1,"251":1,"257":1,"262":1,"273":1,"283":1,"288":1}}],["adapter",{"2":{"7":1}}],["a2a",{"2":{"24":1}}],["am",{"2":{"189":1,"190":2,"193":1}}],["ambient",{"2":{"19":1}}],["amp",{"0":{"4":1},"2":{"34":1,"38":1}}],["apps",{"2":{"59":1}}],["appsecret",{"2":{"48":2,"49":1}}],["appear",{"2":{"57":1,"207":1}}],["appid",{"2":{"48":1,"49":1}}],["approved",{"2":{"38":1}}],["approval",{"2":{"38":1,"48":1}}],["applied",{"2":{"75":2}}],["applies",{"2":{"72":1,"77":2}}],["applications",{"2":{"30":1,"103":1}}],["application",{"0":{"28":1},"2":{"28":1,"42":1,"59":1}}],["apply",{"2":{"36":1,"148":1}}],["app",{"0":{"34":1,"38":1},"2":{"19":1,"25":1,"34":4,"37":3,"38":1,"40":2,"59":1,"110":1,"250":1}}],["apis",{"2":{"22":1}}],["api",{"0":{"194":1},"2":{"11":4,"40":1,"42":1,"54":2,"55":1,"66":1,"109":1,"138":1,"168":1,"176":1,"178":1,"179":3,"180":1,"181":1,"182":1,"184":1,"194":2,"198":1,"201":2,"247":3,"252":1,"253":1,"256":1,"258":4,"260":1,"261":1,"263":3,"265":1,"267":3,"269":1,"271":1,"272":2,"282":2,"289":2}}],["aggregator",{"2":{"199":1}}],["aggressive",{"2":{"116":1}}],["again",{"2":{"48":1,"66":1}}],["agreement",{"2":{"19":1}}],["agent2agent",{"2":{"24":1}}],["agents",{"2":{"9":1,"18":1,"19":1,"21":1}}],["agent",{"0":{"8":1,"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"1":1,"18":1,"19":1,"24":1,"25":1,"86":1,"97":2,"188":1,"189":1,"195":2,"223":1,"243":1,"245":1,"246":1}}],["archive",{"2":{"131":2,"132":2}}],["architecture",{"0":{"246":1},"1":{"247":1},"2":{"7":1}}],["arguments",{"2":{"160":2,"225":2}}],["argument",{"2":{"101":1}}],["aren",{"2":{"151":1}}],["are",{"2":{"39":1,"45":2,"50":1,"56":1,"62":1,"75":2,"78":1,"84":1,"99":1,"101":1,"108":1,"109":1,"114":1,"119":1,"132":1,"142":1,"162":1,"168":1,"171":1,"176":1,"192":1,"206":2,"207":2,"209":1,"215":3,"216":1,"217":1,"222":1,"223":1,"226":3,"246":2,"252":1,"260":1,"265":1,"274":1,"277":1}}],["around",{"2":{"19":1}}],["aloud",{"2":{"282":1,"283":1,"284":1,"287":1,"289":1}}],["along",{"2":{"195":1}}],["alternative",{"2":{"261":1}}],["alerts",{"2":{"155":1}}],["alert",{"2":{"154":1}}],["also",{"2":{"21":1,"57":1,"116":1,"141":1,"150":1,"162":1,"164":1,"194":1,"250":1,"255":1}}],["already",{"2":{"19":1,"167":1,"189":1}}],["always",{"0":{"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"18":1,"19":2,"21":1,"22":1,"25":2,"75":1,"218":1,"246":1}}],["allowed",{"2":{"72":1,"75":1,"81":1}}],["allow",{"2":{"70":1,"72":2,"73":1,"74":1,"75":1,"77":1,"79":1,"81":1,"82":1,"83":1,"84":1,"85":1,"91":1,"126":1,"187":1,"222":1,"232":1}}],["allows",{"2":{"27":1,"33":1,"41":1,"47":1,"58":1,"64":1,"97":1,"110":1,"121":1,"135":1,"147":1,"151":1,"166":1,"197":1}}],["allowing",{"2":{"1":1,"103":1,"142":1,"157":1,"205":1}}],["all",{"2":{"15":1,"16":1,"70":1,"73":3,"77":1,"91":1,"93":2,"117":1,"119":1,"141":1,"164":1,"173":2,"191":1,"208":1,"209":1,"212":1,"215":2,"224":1,"226":1,"228":1,"230":2,"231":2,"232":1,"233":1,"234":1,"235":1,"236":1,"237":2,"238":3,"239":1,"240":1,"241":2,"245":1,"249":2,"253":1}}],["auditing",{"2":{"134":1}}],["audit",{"2":{"117":1,"141":1,"154":1}}],["audio",{"2":{"8":1,"184":1,"284":3,"287":1}}],["auth",{"2":{"250":1,"253":1}}],["authorization",{"2":{"162":1,"180":1}}],["authorized",{"2":{"82":1,"180":1}}],["authorize",{"2":{"30":1,"162":1}}],["authentication",{"0":{"162":1,"180":1},"2":{"11":1,"12":1,"60":1,"161":1,"162":2,"178":1,"179":1,"180":1,"258":1,"263":1}}],["autonomy",{"0":{"152":1}}],["autonomous",{"2":{"9":1,"91":1,"151":1,"156":1,"196":1,"207":1,"215":1}}],["automate",{"2":{"187":1}}],["automated",{"2":{"113":1}}],["automation",{"0":{"188":1},"2":{"8":1,"90":2,"91":1,"95":1,"196":1,"246":1,"250":1}}],["automatic",{"2":{"6":1,"11":1,"14":1,"91":1,"115":1,"152":1,"270":1}}],["automatically",{"2":{"6":1,"13":1,"43":1,"44":1,"66":1,"67":1,"162":1,"164":2,"165":1,"176":1,"181":1,"193":1,"195":1,"204":1,"207":1,"251":1,"283":1}}],["auto",{"2":{"6":1,"43":1,"44":1,"212":1,"249":1,"288":1}}],["attachment",{"2":{"39":1,"45":1,"53":1}}],["attachments",{"2":{"7":1,"32":1,"51":1,"57":1,"69":1}}],["attach",{"2":{"30":1}}],["attempt",{"2":{"18":1}}],["at",{"2":{"8":1,"9":1,"13":1,"23":1,"36":1,"73":1,"83":1,"90":1,"93":1,"101":1,"141":1,"152":1,"163":1,"177":2,"179":1,"189":1,"190":4,"193":1,"247":1,"250":1}}],["ask",{"2":{"193":1}}],["asia",{"2":{"97":1}}],["assist",{"2":{"218":1}}],["assigning",{"0":{"99":1,"203":1,"259":1,"264":1,"280":1,"285":1},"2":{"286":1}}],["assigned",{"2":{"91":1,"94":1,"119":1,"156":1,"168":1,"176":1,"204":1,"260":1,"265":1,"269":1,"281":1}}],["assignment",{"2":{"11":1,"287":1}}],["assign",{"2":{"8":1,"268":1}}],["associated",{"2":{"93":1,"140":1}}],["as",{"0":{"136":1,"217":1},"1":{"218":1},"2":{"6":1,"21":1,"22":3,"23":1,"24":2,"25":1,"42":1,"45":1,"57":1,"91":1,"94":1,"97":2,"100":1,"104":1,"113":1,"115":1,"119":1,"122":1,"125":1,"142":1,"176":1,"207":1,"209":1,"217":1,"218":1,"222":1,"226":1,"258":1,"260":1,"261":1,"263":1,"265":1,"283":1}}],["acl",{"2":{"70":1,"72":2,"73":1,"75":1,"81":1,"82":1,"83":1,"84":1,"89":1,"91":2,"232":1}}],["actual",{"2":{"268":1,"281":1}}],["actually",{"2":{"18":1,"19":2}}],["actions",{"0":{"124":1},"2":{"100":1,"142":1,"151":1,"187":1,"223":1}}],["action",{"2":{"93":2,"100":1,"146":1,"154":1,"225":3}}],["activities",{"2":{"156":1}}],["activity",{"2":{"9":1,"91":1,"196":1,"207":2,"212":1,"215":1}}],["active",{"2":{"112":1,"125":1,"134":1,"163":1,"164":1,"165":1,"167":1,"189":1,"209":1,"212":1}}],["activate",{"2":{"40":1,"112":1}}],["act",{"2":{"42":1}}],["acts",{"2":{"22":1,"95":1,"104":1,"122":1}}],["across",{"2":{"4":1,"122":1,"166":1,"208":1,"215":1,"282":1,"284":1,"289":1}}],["accurate",{"2":{"114":1,"204":1}}],["accumulate",{"2":{"114":1,"172":1}}],["accumulates",{"2":{"113":1}}],["accumulating",{"2":{"19":1}}],["accept",{"2":{"44":1}}],["access",{"0":{"70":1,"76":1,"84":1,"85":1,"252":1},"1":{"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":2,"78":2,"79":2,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"1":1,"8":2,"23":1,"32":1,"36":1,"39":1,"42":2,"43":2,"45":1,"70":2,"73":2,"76":2,"79":1,"89":2,"91":1,"92":1,"94":1,"158":1,"162":1,"193":1,"226":1,"243":1,"251":1}}],["account",{"0":{"42":1},"2":{"42":3,"43":1,"48":2,"50":1,"56":1,"253":1}}],["accounts",{"2":{"3":1}}],["answer",{"2":{"204":1}}],["another",{"2":{"135":1}}],["anchor",{"2":{"19":1}}],["annoying",{"2":{"19":1}}],["anthropic",{"2":{"11":1,"178":1,"184":1}}],["anyone",{"0":{"81":1},"2":{"42":1,"72":1}}],["any",{"2":{"9":2,"10":1,"39":1,"41":1,"42":1,"156":1,"187":1,"188":1,"195":1,"223":1}}],["an",{"0":{"17":1,"262":1,"263":1,"264":1,"283":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"1":1,"19":3,"22":1,"24":2,"25":3,"40":1,"42":1,"54":2,"70":1,"72":1,"73":2,"74":1,"75":1,"77":1,"79":1,"84":1,"85":1,"86":1,"113":1,"117":2,"132":1,"136":1,"141":2,"149":1,"154":1,"164":1,"165":1,"167":1,"168":1,"174":1,"178":2,"205":1,"243":1,"247":2,"261":1,"267":1,"272":1,"279":1}}],["and",{"0":{"130":1,"135":1,"141":1,"145":1,"147":1,"154":1,"171":1,"177":1,"221":1,"232":1},"1":{"131":1,"132":1,"133":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"148":1,"149":1,"155":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1},"2":{"1":4,"3":1,"4":2,"5":3,"6":2,"7":1,"8":11,"10":2,"11":2,"12":2,"13":1,"14":2,"15":2,"18":1,"19":6,"21":4,"22":3,"23":7,"24":6,"25":4,"27":1,"28":2,"29":1,"30":2,"31":2,"32":1,"34":3,"36":2,"37":3,"38":2,"39":2,"40":2,"41":1,"43":2,"44":1,"45":2,"48":2,"49":3,"50":2,"51":3,"53":1,"54":1,"55":2,"56":2,"57":1,"59":1,"60":2,"61":1,"65":1,"66":1,"69":1,"72":1,"77":1,"78":1,"82":1,"86":2,"89":7,"90":2,"91":3,"93":3,"94":2,"95":3,"97":1,"98":1,"99":1,"100":1,"104":1,"106":1,"108":2,"109":1,"110":1,"112":2,"113":2,"115":1,"119":1,"121":1,"122":1,"124":1,"125":1,"126":1,"128":1,"129":1,"130":1,"134":1,"135":2,"140":2,"142":1,"144":1,"146":1,"148":2,"150":2,"152":1,"157":1,"158":1,"160":1,"162":1,"163":2,"164":1,"165":1,"166":1,"168":3,"172":1,"174":1,"176":1,"177":1,"178":1,"181":2,"182":1,"183":1,"186":1,"188":1,"189":1,"190":2,"191":1,"193":2,"194":1,"195":1,"196":1,"197":1,"199":1,"202":1,"203":2,"204":1,"205":2,"207":1,"209":1,"216":2,"217":2,"218":3,"220":1,"222":1,"223":1,"224":1,"228":1,"242":1,"243":1,"244":3,"245":2,"246":3,"249":4,"250":1,"251":1,"252":1,"253":5,"256":1,"258":1,"259":1,"260":1,"263":1,"264":1,"265":1,"266":3,"267":1,"268":1,"270":4,"272":1,"274":2,"275":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"286":1,"287":1,"288":3}}],["ai",{"2":{"1":2,"7":1,"11":1,"15":1,"18":1,"19":2,"20":1,"21":1,"23":1,"25":1,"39":2,"86":1,"178":1,"183":1,"184":1,"199":1,"223":1,"243":2,"245":1,"246":1,"258":1}}],["a",{"0":{"28":1,"34":1,"42":1,"48":1,"54":1,"59":1,"87":1,"93":1,"96":1,"97":1,"99":2,"108":1,"127":1,"128":1,"136":1,"138":1,"140":1,"179":1,"184":1,"201":1,"203":2,"208":1,"220":1,"257":1,"258":1,"259":2,"264":1,"273":1,"274":1,"280":2,"285":1},"1":{"98":1,"209":1,"210":1,"275":1},"2":{"1":1,"5":1,"6":1,"8":1,"9":1,"10":2,"11":1,"18":3,"19":11,"20":1,"22":2,"23":1,"24":4,"25":3,"28":2,"34":1,"37":2,"38":1,"40":1,"42":3,"44":2,"48":1,"50":1,"54":3,"56":1,"59":1,"64":1,"66":3,"72":2,"73":3,"75":1,"76":1,"77":7,"79":6,"85":1,"86":1,"87":1,"88":1,"90":1,"93":1,"94":6,"95":2,"96":1,"97":1,"98":2,"100":1,"102":1,"104":2,"109":1,"110":1,"111":1,"112":1,"113":1,"116":1,"117":1,"121":1,"124":1,"126":1,"127":2,"129":2,"131":1,"133":1,"134":1,"136":5,"142":1,"144":2,"145":1,"146":2,"148":1,"149":1,"152":3,"154":2,"156":3,"158":1,"160":2,"161":1,"162":1,"163":3,"164":1,"167":3,"168":2,"170":1,"172":2,"178":2,"179":1,"180":2,"181":2,"182":1,"183":3,"184":2,"185":2,"186":1,"188":5,"189":3,"193":5,"195":1,"198":4,"201":1,"202":1,"204":3,"205":4,"206":4,"207":6,"208":1,"209":3,"210":2,"213":1,"214":1,"215":2,"216":1,"217":2,"218":1,"220":2,"221":2,"224":1,"225":2,"228":1,"229":1,"242":1,"243":1,"247":3,"249":1,"253":1,"256":1,"257":1,"258":2,"261":3,"262":1,"263":2,"266":3,"268":2,"273":1,"274":1,"275":2,"281":1,"285":1,"286":1,"287":4,"288":2}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/@localSearchIndexroot.r9JNz3Ex.js b/assets/chunks/@localSearchIndexroot.r9JNz3Ex.js new file mode 100644 index 00000000..20ad8840 --- /dev/null +++ b/assets/chunks/@localSearchIndexroot.r9JNz3Ex.js @@ -0,0 +1 @@ +const e='{"documentCount":291,"nextId":291,"documentIds":{"0":"/about.html#about-memoh","1":"/about.html#what-is-memoh","2":"/about.html#key-features","3":"/about.html#multi-bot-management","4":"/about.html#multi-user-identity-recognition","5":"/about.html#containerized-isolation","6":"/about.html#memory-engineering","7":"/about.html#multi-platform-support","8":"/about.html#agent-capabilities","9":"/about.html#sessions","10":"/about.html#slash-commands","11":"/about.html#multi-llm-provider-support","12":"/about.html#mcp-protocol-support","13":"/about.html#scheduled-tasks","14":"/about.html#memory-compaction","15":"/about.html#graphical-configuration","16":"/about.html#installation","17":"/blogs/2026-02-16.html#introduction-to-memoh-the-case-for-an-always-on-containerized-home-agent","18":"/blogs/2026-02-16.html#overview","19":"/blogs/2026-02-16.html#story-time","20":"/blogs/2026-02-16.html#what","21":"/blogs/2026-02-16.html#why","22":"/blogs/2026-02-16.html#how","23":"/blogs/2026-02-16.html#features","24":"/blogs/2026-02-16.html#compare-to-openclaw","25":"/blogs/2026-02-16.html#conclusion","26":"/blogs/#blogs","27":"/channels/discord.html#discord-channel-configuration","28":"/channels/discord.html#step-1-create-a-discord-application","29":"/channels/discord.html#step-2-configure-bot-settings","30":"/channels/discord.html#step-3-invite-the-bot-to-your-server","31":"/channels/discord.html#step-4-configure-memoh","32":"/channels/discord.html#features-supported","33":"/channels/feishu.html#feishu-lark-channel-configuration","34":"/channels/feishu.html#step-1-create-a-feishu-app","35":"/channels/feishu.html#step-2-enable-bot-capability","36":"/channels/feishu.html#step-3-configure-permissions","37":"/channels/feishu.html#step-4-configure-events-webhook-mode","38":"/channels/feishu.html#step-5-publish-your-app","39":"/channels/#channels-overview","40":"/channels/#general-setup-flow","41":"/channels/matrix.html#matrix-channel-configuration","42":"/channels/matrix.html#step-1-create-a-matrix-bot-account","43":"/channels/matrix.html#step-2-configure-memoh","44":"/channels/matrix.html#step-3-invite-the-bot","45":"/channels/matrix.html#features-supported","46":"/channels/matrix.html#official-resources","47":"/channels/qq.html#qq-channel-configuration","48":"/channels/qq.html#step-1-create-a-qq-bot","49":"/channels/qq.html#step-2-configure-memoh","50":"/channels/qq.html#step-3-bind-your-identity-optional","51":"/channels/qq.html#features-supported","52":"/channels/qq.html#official-resources","53":"/channels/wecom.html#wecom-wework-channel-configuration","54":"/channels/wecom.html#step-1-create-a-wecom-bot","55":"/channels/wecom.html#step-2-configure-memoh","56":"/channels/wecom.html#step-3-start-chatting","57":"/channels/wecom.html#features-supported","58":"/channels/wecom.html#official-resources","59":"/channels/telegram.html#telegram-channel-configuration","60":"/channels/telegram.html#step-1-create-a-telegram-bot","61":"/channels/telegram.html#step-2-configure-memoh","62":"/channels/telegram.html#step-3-bind-your-identity-optional","63":"/channels/telegram.html#features-supported","64":"/channels/weixin.html#wechat-channel-configuration","65":"/channels/weixin.html#step-1-add-wechat-channel-in-memoh","66":"/channels/weixin.html#step-2-scan-the-qr-code","67":"/channels/weixin.html#step-3-start-chatting","68":"/channels/weixin.html#optional-settings","69":"/channels/weixin.html#features-supported","70":"/getting-started/access.html#bot-access-control","71":"/getting-started/access.html#concepts","72":"/getting-started/access.html#default-effect","73":"/getting-started/access.html#subject-types","74":"/getting-started/access.html#rule-effects","75":"/getting-started/access.html#priority-based-evaluation","76":"/getting-started/access.html#managing-access","77":"/getting-started/access.html#adding-rules","78":"/getting-started/access.html#reordering-rules","79":"/getting-started/access.html#source-scope","80":"/getting-started/access.html#examples","81":"/getting-started/access.html#open-bot-anyone-can-chat","82":"/getting-started/access.html#private-bot-with-selected-users","83":"/getting-started/access.html#open-bot-with-blocked-users","84":"/getting-started/access.html#platform-specific-access","85":"/getting-started/access.html#channel-scoped-access","86":"/getting-started/bot.html#bot-management","87":"/getting-started/bot.html#creating-a-bot","88":"/getting-started/bot.html#bot-detail-page","89":"/getting-started/bot.html#tab-overview","90":"/getting-started/bot.html#configuring-the-bot-s-core-settings","91":"/getting-started/bot.html#general-tab-reference","92":"/getting-started/bot.html#terminal-tab","93":"/getting-started/bot.html#deleting-a-bot","94":"/getting-started/browser.html#browser-contexts","95":"/getting-started/browser.html#concept-browser-gateway","96":"/getting-started/browser.html#creating-a-browser-context","97":"/getting-started/browser.html#configuring-a-browser-context","98":"/getting-started/browser.html#managing-contexts","99":"/getting-started/browser.html#assigning-a-browser-context-to-a-bot","100":"/getting-started/browser.html#bot-interaction","101":"/getting-started/browser.html#browser-core-selection","102":"/getting-started/browser.html#next-steps","103":"/getting-started/channels.html#bot-channels","104":"/getting-started/channels.html#concept-unified-communication","105":"/getting-started/channels.html#supported-channels","106":"/getting-started/channels.html#platform-guides","107":"/getting-started/channels.html#configuration-flow","108":"/getting-started/channels.html#_1-adding-a-channel","109":"/getting-started/channels.html#_2-common-fields","110":"/getting-started/channels.html#_3-special-case-feishu-webhook","111":"/getting-started/channels.html#_4-special-case-wechat-qr-code","112":"/getting-started/channels.html#operations","113":"/getting-started/container.html#bot-container-management","114":"/getting-started/container.html#concept-the-isolated-workspace","115":"/getting-started/container.html#operations","116":"/getting-started/container.html#lifecycle-actions","117":"/getting-started/container.html#container-information","118":"/getting-started/container.html#snapshots","119":"/getting-started/container.html#creating-a-snapshot","120":"/getting-started/container.html#restoring-a-snapshot","121":"/getting-started/container.html#managing-snapshots","122":"/getting-started/container.html#data-export-and-import","123":"/getting-started/container.html#export","124":"/getting-started/container.html#import","125":"/getting-started/container.html#restore","126":"/getting-started/container.html#container-versioning","127":"/getting-started/compaction.html#memory-compaction","128":"/getting-started/compaction.html#concept-why-compact","129":"/getting-started/compaction.html#configuration","130":"/getting-started/compaction.html#manual-compaction","131":"/getting-started/compaction.html#compaction-logs","132":"/getting-started/compaction.html#managing-logs","133":"/getting-started/compaction.html#relationship-to-memory","134":"/getting-started/compaction.html#next-steps","135":"/getting-started/email.html#email-providers-and-bindings","136":"/getting-started/email.html#concept-email-as-a-bot-channel","137":"/getting-started/email.html#email-provider","138":"/getting-started/email.html#creating-a-provider","139":"/getting-started/email.html#bot-email-bindings","140":"/getting-started/email.html#adding-a-binding","141":"/getting-started/email.html#outbox-and-history","142":"/getting-started/email.html#bot-interaction","143":"/getting-started/files.html#bot-files-management","144":"/getting-started/files.html#operations","145":"/getting-started/files.html#browsing-and-navigation","146":"/getting-started/files.html#managing-files","147":"/getting-started/files.html#viewing-and-editing","148":"/getting-started/files.html#text-files","149":"/getting-started/files.html#images","150":"/getting-started/files.html#bot-interaction-with-files","151":"/getting-started/heartbeat.html#bot-heartbeat","152":"/getting-started/heartbeat.html#concept-scheduled-autonomy","153":"/getting-started/heartbeat.html#configuration","154":"/getting-started/heartbeat.html#logs-and-monitoring","155":"/getting-started/heartbeat.html#managing-logs","156":"/getting-started/heartbeat.html#bot-interaction","157":"/getting-started/mcp.html#mcp-connections","158":"/getting-started/mcp.html#concept-extending-bot-capabilities","159":"/getting-started/mcp.html#connection-types","160":"/getting-started/mcp.html#_1-stdio-local-process","161":"/getting-started/mcp.html#_2-remote-http-sse","162":"/getting-started/mcp.html#oauth-authentication","163":"/getting-started/mcp.html#operations","164":"/getting-started/mcp.html#tool-discovery","165":"/getting-started/mcp.html#bot-interaction","166":"/getting-started/provider-and-model.html#llm-provider-and-model","167":"/getting-started/provider-and-model.html#llm-provider","168":"/getting-started/provider-and-model.html#creating-a-provider","169":"/getting-started/provider-and-model.html#oauth-authentication","170":"/getting-started/provider-and-model.html#import-models","171":"/getting-started/provider-and-model.html#managing-providers","172":"/getting-started/provider-and-model.html#model","173":"/getting-started/provider-and-model.html#adding-a-model","174":"/getting-started/provider-and-model.html#managing-models","175":"/getting-started/provider-and-model.html#next-steps","176":"/getting-started/memory.html#bot-memory-management","177":"/getting-started/memory.html#prerequisites","178":"/getting-started/memory.html#concept-memory-retrieval","179":"/getting-started/memory.html#operations","180":"/getting-started/memory.html#_1-creating-memories","181":"/getting-started/memory.html#_2-searching-and-managing","182":"/getting-started/memory.html#memory-compression-compact","183":"/getting-started/memory.html#rebuild","184":"/getting-started/memory.html#status","185":"/getting-started/memory.html#usage-statistics","186":"/getting-started/memory.html#bot-interaction","187":"/getting-started/schedule.html#scheduled-tasks","188":"/getting-started/schedule.html#concept-cron-based-automation","189":"/getting-started/schedule.html#schedule-fields","190":"/getting-started/schedule.html#cron-pattern-reference","191":"/getting-started/schedule.html#viewing-schedules","192":"/getting-started/schedule.html#creating-schedules","193":"/getting-started/schedule.html#via-the-bot-conversational","194":"/getting-started/schedule.html#via-the-api","195":"/getting-started/schedule.html#execution-flow","196":"/getting-started/schedule.html#schedule-vs-heartbeat","197":"/getting-started/search-provider.html#search-providers","198":"/getting-started/search-provider.html#concept-real-time-knowledge","199":"/getting-started/search-provider.html#supported-search-engines","200":"/getting-started/search-provider.html#configuration-flow","201":"/getting-started/search-provider.html#_1-adding-a-search-provider","202":"/getting-started/search-provider.html#_2-managing-providers","203":"/getting-started/search-provider.html#assigning-a-search-provider-to-a-bot","204":"/getting-started/search-provider.html#bot-interaction","205":"/getting-started/sessions.html#sessions","206":"/getting-started/sessions.html#concept-conversation-isolation","207":"/getting-started/sessions.html#session-types","208":"/getting-started/sessions.html#starting-a-new-session-with-new","209":"/getting-started/sessions.html#in-external-channels-telegram-discord-feishu-etc","210":"/getting-started/sessions.html#in-the-web-ui","211":"/getting-started/sessions.html#managing-sessions","212":"/getting-started/sessions.html#viewing-sessions","213":"/getting-started/sessions.html#renaming-sessions","214":"/getting-started/sessions.html#deleting-sessions","215":"/getting-started/sessions.html#how-sessions-relate-to-other-features","216":"/getting-started/skills.html#bot-skills","217":"/getting-started/skills.html#concept-skills-as-markdown","218":"/getting-started/skills.html#example-skill-structure","219":"/getting-started/skills.html#managing-skills","220":"/getting-started/skills.html#adding-a-skill","221":"/getting-started/skills.html#editing-and-deleting","222":"/getting-started/skills.html#how-bots-use-skills","223":"/getting-started/slash-commands.html#slash-commands","224":"/getting-started/slash-commands.html#quick-reference","225":"/getting-started/slash-commands.html#command-format","226":"/getting-started/slash-commands.html#permissions","227":"/getting-started/slash-commands.html#global-commands","228":"/getting-started/slash-commands.html#help","229":"/getting-started/slash-commands.html#new","230":"/getting-started/slash-commands.html#schedule-—-manage-scheduled-tasks","231":"/getting-started/slash-commands.html#mcp-—-manage-mcp-connections","232":"/getting-started/slash-commands.html#settings-—-view-and-update-bot-settings","233":"/getting-started/slash-commands.html#model-—-manage-bot-models","234":"/getting-started/slash-commands.html#memory-—-manage-memory-provider","235":"/getting-started/slash-commands.html#search-—-manage-search-provider","236":"/getting-started/slash-commands.html#browser-—-manage-browser-context","237":"/getting-started/slash-commands.html#usage-—-view-token-usage","238":"/getting-started/slash-commands.html#email-—-view-email-configuration","239":"/getting-started/slash-commands.html#heartbeat-—-view-heartbeat-logs","240":"/getting-started/slash-commands.html#skill-—-view-bot-skills","241":"/getting-started/slash-commands.html#fs-—-browse-container-filesystem","242":"/getting-started/slash-commands.html#mention-prefixed-commands","243":"/#memoh-documentation","244":"/#documentation","245":"/installation/docker.html#docker-installation","246":"/installation/docker.html#service-architecture","247":"/installation/docker.html#sparse-service","248":"/installation/docker.html#prerequisites","249":"/installation/docker.html#one-click-install-recommended","250":"/installation/docker.html#manual-install","251":"/installation/docker.html#china-mainland-mirror","252":"/installation/docker.html#access-points","253":"/installation/docker.html#configuration-reference","254":"/installation/docker.html#common-commands","255":"/installation/docker.html#environment-variables","256":"/memory-providers/#memory-providers","257":"/memory-providers/#available-providers","258":"/memory-providers/#basic-flow","259":"/memory-providers/#next-steps","260":"/memory-providers/builtin.html#built-in-memory-provider","261":"/memory-providers/builtin.html#memory-modes","262":"/memory-providers/builtin.html#how-sparse-mode-works","263":"/memory-providers/builtin.html#creating-a-built-in-provider","264":"/memory-providers/builtin.html#configuring-a-built-in-provider","265":"/memory-providers/builtin.html#managing-providers","266":"/memory-providers/builtin.html#infrastructure-requirements","267":"/memory-providers/builtin.html#off-mode","268":"/memory-providers/builtin.html#sparse-mode","269":"/memory-providers/builtin.html#dense-mode","270":"/memory-providers/builtin.html#assigning-a-memory-provider-to-a-bot","271":"/memory-providers/builtin.html#using-memory-after-setup","272":"/memory-providers/openviking.html#openviking-memory-provider","273":"/memory-providers/openviking.html#creating-an-openviking-provider","274":"/memory-providers/openviking.html#configuring-an-openviking-provider","275":"/memory-providers/openviking.html#assigning-an-openviking-provider-to-a-bot","276":"/memory-providers/openviking.html#usage","277":"/tts-providers/edge.html#edge-tts","278":"/tts-providers/edge.html#creating-an-edge-tts-provider","279":"/tts-providers/edge.html#configuring-the-model","280":"/tts-providers/edge.html#assigning-to-a-bot","281":"/tts-providers/edge.html#testing","282":"/memory-providers/mem0.html#mem0-memory-provider","283":"/memory-providers/mem0.html#creating-a-mem0-provider","284":"/memory-providers/mem0.html#configuring-a-mem0-provider","285":"/memory-providers/mem0.html#assigning-a-mem0-provider-to-a-bot","286":"/memory-providers/mem0.html#usage","287":"/tts-providers/#tts-providers","288":"/tts-providers/#basic-flow","289":"/tts-providers/#available-providers","290":"/tts-providers/#next-steps"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[2,1,1],"1":[4,2,58],"2":[2,2,1],"3":[3,4,29],"4":[5,4,33],"5":[2,4,42],"6":[2,4,48],"7":[3,4,55],"8":[2,4,132],"9":[1,4,50],"10":[2,4,51],"11":[4,4,42],"12":[3,4,40],"13":[2,4,22],"14":[2,4,27],"15":[2,4,47],"16":[1,2,28],"17":[12,1,1],"18":[1,12,74],"19":[2,12,215],"20":[1,12,29],"21":[1,12,54],"22":[1,12,65],"23":[1,12,104],"24":[3,12,83],"25":[1,12,62],"26":[1,1,12],"27":[3,1,16],"28":[6,3,28],"29":[5,3,19],"30":[8,3,42],"31":[4,3,23],"32":[2,3,25],"33":[4,1,24],"34":[6,4,34],"35":[5,4,13],"36":[4,4,31],"37":[7,4,56],"38":[5,4,30],"39":[2,1,88],"40":[3,2,54],"41":[3,1,31],"42":[7,3,74],"43":[4,3,67],"44":[5,3,31],"45":[2,3,49],"46":[2,3,6],"47":[3,1,16],"48":[6,3,46],"49":[4,3,37],"50":[7,3,44],"51":[2,3,36],"52":[2,3,6],"53":[4,1,17],"54":[6,4,26],"55":[4,4,44],"56":[4,4,27],"57":[2,4,26],"58":[2,4,6],"59":[3,1,28],"60":[6,3,55],"61":[4,3,30],"62":[7,3,53],"63":[2,3,35],"64":[3,1,24],"65":[7,3,19],"66":[6,3,55],"67":[4,3,20],"68":[2,3,11],"69":[2,3,29],"70":[3,1,35],"71":[1,3,1],"72":[2,4,46],"73":[2,4,54],"74":[2,4,19],"75":[3,4,56],"76":[2,3,12],"77":[2,4,60],"78":[2,4,26],"79":[2,4,49],"80":[1,3,1],"81":[6,4,19],"82":[5,4,26],"83":[5,4,27],"84":[3,4,31],"85":[3,4,27],"86":[2,1,34],"87":[3,2,32],"88":[3,2,22],"89":[2,4,95],"90":[6,2,82],"91":[3,2,116],"92":[2,2,25],"93":[3,2,44],"94":[2,1,45],"95":[3,2,45],"96":[4,2,27],"97":[4,2,81],"98":[2,5,15],"99":[6,2,33],"100":[2,2,55],"101":[3,2,47],"102":[2,2,27],"103":[2,1,18],"104":[3,2,30],"105":[2,2,14],"106":[2,3,27],"107":[2,2,1],"108":[4,4,24],"109":[3,4,33],"110":[5,4,32],"111":[6,4,21],"112":[1,2,20],"113":[3,1,35],"114":[4,3,30],"115":[1,3,16],"116":[2,4,52],"117":[2,3,46],"118":[1,3,32],"119":[3,4,18],"120":[3,4,17],"121":[2,4,23],"122":[4,3,16],"123":[1,7,21],"124":[1,7,21],"125":[1,7,29],"126":[2,3,37],"127":[2,1,38],"128":[4,2,58],"129":[1,2,48],"130":[2,2,52],"131":[2,2,42],"132":[2,3,12],"133":[3,2,59],"134":[2,2,13],"135":[4,1,18],"136":[6,4,28],"137":[2,4,13],"138":[3,5,38],"139":[3,4,15],"140":[3,5,41],"141":[3,4,34],"142":[2,4,45],"143":[3,1,24],"144":[1,3,17],"145":[3,4,31],"146":[2,4,42],"147":[3,3,17],"148":[2,6,39],"149":[1,6,20],"150":[4,3,36],"151":[2,1,24],"152":[3,2,38],"153":[1,2,41],"154":[3,2,46],"155":[2,5,29],"156":[2,2,36],"157":[2,1,21],"158":[4,2,25],"159":[2,2,11],"160":[5,4,54],"161":[5,4,36],"162":[2,2,56],"163":[1,2,53],"164":[2,2,51],"165":[2,2,32],"166":[4,1,16],"167":[2,4,27],"168":[3,4,46],"169":[2,4,38],"170":[2,4,36],"171":[2,4,33],"172":[1,4,31],"173":[3,4,88],"174":[2,4,16],"175":[2,4,16],"176":[3,1,22],"177":[1,3,42],"178":[3,3,46],"179":[1,3,14],"180":[3,4,25],"181":[4,4,25],"182":[4,3,57],"183":[1,3,49],"184":[1,3,40],"185":[2,3,28],"186":[2,3,48],"187":[2,1,33],"188":[4,2,37],"189":[2,2,77],"190":[3,2,67],"191":[2,2,31],"192":[2,2,8],"193":[5,4,46],"194":[3,4,42],"195":[2,2,48],"196":[3,2,52],"197":[2,1,23],"198":[4,2,28],"199":[3,2,53],"200":[2,2,1],"201":[5,4,44],"202":[3,4,21],"203":[6,2,22],"204":[2,2,35],"205":[1,1,36],"206":[3,1,43],"207":[2,1,71],"208":[6,1,19],"209":[8,7,55],"210":[4,7,38],"211":[2,1,1],"212":[2,2,34],"213":[2,2,15],"214":[2,2,15],"215":[6,1,63],"216":[2,1,23],"217":[4,2,27],"218":[3,5,37],"219":[2,2,15],"220":[3,3,22],"221":[3,3,23],"222":[4,2,35],"223":[2,1,46],"224":[2,2,45],"225":[2,2,41],"226":[1,2,33],"227":[2,2,1],"228":[2,3,11],"229":[2,3,14],"230":[5,2,31],"231":[5,2,14],"232":[7,2,46],"233":[5,2,20],"234":[5,2,13],"235":[5,2,13],"236":[5,2,13],"237":[5,2,25],"238":[5,2,10],"239":[5,2,15],"240":[5,2,9],"241":[5,2,28],"242":[3,2,24],"243":[2,1,51],"244":[1,2,36],"245":[2,1,45],"246":[2,2,62],"247":[2,4,143],"248":[1,2,5],"249":[5,2,112],"250":[2,2,97],"251":[3,4,48],"252":[2,2,37],"253":[2,2,94],"254":[2,2,33],"255":[2,2,58],"256":[2,1,33],"257":[2,2,44],"258":[2,2,31],"259":[2,2,28],"260":[4,1,44],"261":[2,4,38],"262":[4,5,58],"263":[5,4,25],"264":[5,4,46],"265":[2,6,15],"266":[2,4,1],"267":[2,6,15],"268":[2,6,44],"269":[2,6,30],"270":[6,4,37],"271":[4,4,38],"272":[3,1,26],"273":[4,3,25],"274":[4,3,36],"275":[7,3,24],"276":[1,3,28],"277":[2,1,26],"278":[5,2,25],"279":[3,2,58],"280":[4,2,24],"281":[1,2,26],"282":[3,1,28],"283":[4,3,25],"284":[4,3,44],"285":[6,3,24],"286":[1,3,28],"287":[2,1,64],"288":[2,2,48],"289":[2,2,21],"290":[2,2,12]},"averageFieldLength":[3.0171821305841933,3.0859106529209623,35.982817869415804],"storedFields":{"0":{"title":"About Memoh","titles":[]},"1":{"title":"What is Memoh?","titles":["About Memoh"]},"2":{"title":"Key Features","titles":["About Memoh"]},"3":{"title":"Multi-Bot Management","titles":["About Memoh","Key Features"]},"4":{"title":"Multi-User & Identity Recognition","titles":["About Memoh","Key Features"]},"5":{"title":"Containerized Isolation","titles":["About Memoh","Key Features"]},"6":{"title":"Memory Engineering","titles":["About Memoh","Key Features"]},"7":{"title":"Multi-Platform Support","titles":["About Memoh","Key Features"]},"8":{"title":"Agent Capabilities","titles":["About Memoh","Key Features"]},"9":{"title":"Sessions","titles":["About Memoh","Key Features"]},"10":{"title":"Slash Commands","titles":["About Memoh","Key Features"]},"11":{"title":"Multi-LLM Provider Support","titles":["About Memoh","Key Features"]},"12":{"title":"MCP Protocol Support","titles":["About Memoh","Key Features"]},"13":{"title":"Scheduled Tasks","titles":["About Memoh","Key Features"]},"14":{"title":"Memory Compaction","titles":["About Memoh","Key Features"]},"15":{"title":"Graphical Configuration","titles":["About Memoh","Key Features"]},"16":{"title":"Installation","titles":["About Memoh"]},"17":{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","titles":[]},"18":{"title":"Overview","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"19":{"title":"Story Time","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"20":{"title":"What","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"21":{"title":"Why","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"22":{"title":"How","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"23":{"title":"Features","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"24":{"title":"Compare to OpenClaw","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"25":{"title":"Conclusion","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"26":{"title":"Blogs","titles":[]},"27":{"title":"Discord Channel Configuration","titles":[]},"28":{"title":"Step 1: Create a Discord Application","titles":["Discord Channel Configuration"]},"29":{"title":"Step 2: Configure Bot Settings","titles":["Discord Channel Configuration"]},"30":{"title":"Step 3: Invite the Bot to Your Server","titles":["Discord Channel Configuration"]},"31":{"title":"Step 4: Configure Memoh","titles":["Discord Channel Configuration"]},"32":{"title":"Features Supported","titles":["Discord Channel Configuration"]},"33":{"title":"Feishu (Lark) Channel Configuration","titles":[]},"34":{"title":"Step 1: Create a Feishu App","titles":["Feishu (Lark) Channel Configuration"]},"35":{"title":"Step 2: Enable Bot Capability","titles":["Feishu (Lark) Channel Configuration"]},"36":{"title":"Step 3: Configure Permissions","titles":["Feishu (Lark) Channel Configuration"]},"37":{"title":"Step 4: Configure Events (Webhook Mode)","titles":["Feishu (Lark) Channel Configuration"]},"38":{"title":"Step 5: Publish Your App","titles":["Feishu (Lark) Channel Configuration"]},"39":{"title":"Channels Overview","titles":[]},"40":{"title":"General Setup Flow","titles":["Channels Overview"]},"41":{"title":"Matrix Channel Configuration","titles":[]},"42":{"title":"Step 1: Create a Matrix Bot Account","titles":["Matrix Channel Configuration"]},"43":{"title":"Step 2: Configure Memoh","titles":["Matrix Channel Configuration"]},"44":{"title":"Step 3: Invite the Bot","titles":["Matrix Channel Configuration"]},"45":{"title":"Features Supported","titles":["Matrix Channel Configuration"]},"46":{"title":"Official Resources","titles":["Matrix Channel Configuration"]},"47":{"title":"QQ Channel Configuration","titles":[]},"48":{"title":"Step 1: Create a QQ Bot","titles":["QQ Channel Configuration"]},"49":{"title":"Step 2: Configure Memoh","titles":["QQ Channel Configuration"]},"50":{"title":"Step 3: Bind Your Identity (Optional)","titles":["QQ Channel Configuration"]},"51":{"title":"Features Supported","titles":["QQ Channel Configuration"]},"52":{"title":"Official Resources","titles":["QQ Channel Configuration"]},"53":{"title":"WeCom (WeWork) Channel Configuration","titles":[]},"54":{"title":"Step 1: Create a WeCom Bot","titles":["WeCom (WeWork) Channel Configuration"]},"55":{"title":"Step 2: Configure Memoh","titles":["WeCom (WeWork) Channel Configuration"]},"56":{"title":"Step 3: Start Chatting","titles":["WeCom (WeWork) Channel Configuration"]},"57":{"title":"Features Supported","titles":["WeCom (WeWork) Channel Configuration"]},"58":{"title":"Official Resources","titles":["WeCom (WeWork) Channel Configuration"]},"59":{"title":"Telegram Channel Configuration","titles":[]},"60":{"title":"Step 1: Create a Telegram Bot","titles":["Telegram Channel Configuration"]},"61":{"title":"Step 2: Configure Memoh","titles":["Telegram Channel Configuration"]},"62":{"title":"Step 3: Bind Your Identity (Optional)","titles":["Telegram Channel Configuration"]},"63":{"title":"Features Supported","titles":["Telegram Channel Configuration"]},"64":{"title":"WeChat Channel Configuration","titles":[]},"65":{"title":"Step 1: Add WeChat Channel in Memoh","titles":["WeChat Channel Configuration"]},"66":{"title":"Step 2: Scan the QR Code","titles":["WeChat Channel Configuration"]},"67":{"title":"Step 3: Start Chatting","titles":["WeChat Channel Configuration"]},"68":{"title":"Optional Settings","titles":["WeChat Channel Configuration"]},"69":{"title":"Features Supported","titles":["WeChat Channel Configuration"]},"70":{"title":"Bot Access Control","titles":[]},"71":{"title":"Concepts","titles":["Bot Access Control"]},"72":{"title":"Default Effect","titles":["Bot Access Control","Concepts"]},"73":{"title":"Subject Types","titles":["Bot Access Control","Concepts"]},"74":{"title":"Rule Effects","titles":["Bot Access Control","Concepts"]},"75":{"title":"Priority-Based Evaluation","titles":["Bot Access Control","Concepts"]},"76":{"title":"Managing Access","titles":["Bot Access Control"]},"77":{"title":"Adding Rules","titles":["Bot Access Control","Managing Access"]},"78":{"title":"Reordering Rules","titles":["Bot Access Control","Managing Access"]},"79":{"title":"Source Scope","titles":["Bot Access Control","Managing Access"]},"80":{"title":"Examples","titles":["Bot Access Control"]},"81":{"title":"Open Bot (Anyone Can Chat)","titles":["Bot Access Control","Examples"]},"82":{"title":"Private Bot with Selected Users","titles":["Bot Access Control","Examples"]},"83":{"title":"Open Bot with Blocked Users","titles":["Bot Access Control","Examples"]},"84":{"title":"Platform-Specific Access","titles":["Bot Access Control","Examples"]},"85":{"title":"Channel-Scoped Access","titles":["Bot Access Control","Examples"]},"86":{"title":"Bot Management","titles":[]},"87":{"title":"Creating a Bot","titles":["Bot Management"]},"88":{"title":"Bot Detail Page","titles":["Bot Management"]},"89":{"title":"Tab Overview","titles":["Bot Management","Bot Detail Page"]},"90":{"title":"Configuring the Bot\'s Core Settings","titles":["Bot Management"]},"91":{"title":"General Tab Reference","titles":["Bot Management"]},"92":{"title":"Terminal Tab","titles":["Bot Management"]},"93":{"title":"Deleting a Bot","titles":["Bot Management"]},"94":{"title":"Browser Contexts","titles":[]},"95":{"title":"Concept: Browser Gateway","titles":["Browser Contexts"]},"96":{"title":"Creating a Browser Context","titles":["Browser Contexts"]},"97":{"title":"Configuring a Browser Context","titles":["Browser Contexts"]},"98":{"title":"Managing Contexts","titles":["Browser Contexts","Configuring a Browser Context"]},"99":{"title":"Assigning a Browser Context to a Bot","titles":["Browser Contexts"]},"100":{"title":"Bot Interaction","titles":["Browser Contexts"]},"101":{"title":"Browser Core Selection","titles":["Browser Contexts"]},"102":{"title":"Next Steps","titles":["Browser Contexts"]},"103":{"title":"Bot Channels","titles":[]},"104":{"title":"Concept: Unified Communication","titles":["Bot Channels"]},"105":{"title":"Supported Channels","titles":["Bot Channels"]},"106":{"title":"Platform Guides","titles":["Bot Channels","Supported Channels"]},"107":{"title":"Configuration Flow","titles":["Bot Channels"]},"108":{"title":"1. Adding a Channel","titles":["Bot Channels","Configuration Flow"]},"109":{"title":"2. Common Fields","titles":["Bot Channels","Configuration Flow"]},"110":{"title":"3. Special Case: Feishu Webhook","titles":["Bot Channels","Configuration Flow"]},"111":{"title":"4. Special Case: WeChat QR Code","titles":["Bot Channels","Configuration Flow"]},"112":{"title":"Operations","titles":["Bot Channels"]},"113":{"title":"Bot Container Management","titles":[]},"114":{"title":"Concept: The Isolated Workspace","titles":["Bot Container Management"]},"115":{"title":"Operations","titles":["Bot Container Management"]},"116":{"title":"Lifecycle Actions","titles":["Bot Container Management","Operations"]},"117":{"title":"Container Information","titles":["Bot Container Management"]},"118":{"title":"Snapshots","titles":["Bot Container Management"]},"119":{"title":"Creating a Snapshot","titles":["Bot Container Management","Snapshots"]},"120":{"title":"Restoring a Snapshot","titles":["Bot Container Management","Snapshots"]},"121":{"title":"Managing Snapshots","titles":["Bot Container Management","Snapshots"]},"122":{"title":"Data Export and Import","titles":["Bot Container Management"]},"123":{"title":"Export","titles":["Bot Container Management","Data Export and Import"]},"124":{"title":"Import","titles":["Bot Container Management","Data Export and Import"]},"125":{"title":"Restore","titles":["Bot Container Management","Data Export and Import"]},"126":{"title":"Container Versioning","titles":["Bot Container Management"]},"127":{"title":"Memory Compaction","titles":[]},"128":{"title":"Concept: Why Compact?","titles":["Memory Compaction"]},"129":{"title":"Configuration","titles":["Memory Compaction"]},"130":{"title":"Manual Compaction","titles":["Memory Compaction"]},"131":{"title":"Compaction Logs","titles":["Memory Compaction"]},"132":{"title":"Managing Logs","titles":["Memory Compaction","Compaction Logs"]},"133":{"title":"Relationship to Memory","titles":["Memory Compaction"]},"134":{"title":"Next Steps","titles":["Memory Compaction"]},"135":{"title":"Email Providers and Bindings","titles":[]},"136":{"title":"Concept: Email as a Bot Channel","titles":["Email Providers and Bindings"]},"137":{"title":"Email Provider","titles":["Email Providers and Bindings"]},"138":{"title":"Creating a Provider","titles":["Email Providers and Bindings","Email Provider"]},"139":{"title":"Bot Email Bindings","titles":["Email Providers and Bindings"]},"140":{"title":"Adding a Binding","titles":["Email Providers and Bindings","Bot Email Bindings"]},"141":{"title":"Outbox and History","titles":["Email Providers and Bindings"]},"142":{"title":"Bot Interaction","titles":["Email Providers and Bindings"]},"143":{"title":"Bot Files Management","titles":[]},"144":{"title":"Operations","titles":["Bot Files Management"]},"145":{"title":"Browsing and Navigation","titles":["Bot Files Management","Operations"]},"146":{"title":"Managing Files","titles":["Bot Files Management","Operations"]},"147":{"title":"Viewing and Editing","titles":["Bot Files Management"]},"148":{"title":"Text Files","titles":["Bot Files Management","Viewing and Editing"]},"149":{"title":"Images","titles":["Bot Files Management","Viewing and Editing"]},"150":{"title":"Bot Interaction with Files","titles":["Bot Files Management"]},"151":{"title":"Bot Heartbeat","titles":[]},"152":{"title":"Concept: Scheduled Autonomy","titles":["Bot Heartbeat"]},"153":{"title":"Configuration","titles":["Bot Heartbeat"]},"154":{"title":"Logs and Monitoring","titles":["Bot Heartbeat"]},"155":{"title":"Managing Logs","titles":["Bot Heartbeat","Logs and Monitoring"]},"156":{"title":"Bot Interaction","titles":["Bot Heartbeat"]},"157":{"title":"MCP Connections","titles":[]},"158":{"title":"Concept: Extending Bot Capabilities","titles":["MCP Connections"]},"159":{"title":"Connection Types","titles":["MCP Connections"]},"160":{"title":"1. Stdio (Local Process)","titles":["MCP Connections","Connection Types"]},"161":{"title":"2. Remote (HTTP/SSE)","titles":["MCP Connections","Connection Types"]},"162":{"title":"OAuth Authentication","titles":["MCP Connections"]},"163":{"title":"Operations","titles":["MCP Connections"]},"164":{"title":"Tool Discovery","titles":["MCP Connections"]},"165":{"title":"Bot Interaction","titles":["MCP Connections"]},"166":{"title":"LLM Provider and Model","titles":[]},"167":{"title":"LLM Provider","titles":["LLM Provider and Model"]},"168":{"title":"Creating a Provider","titles":["LLM Provider and Model","LLM Provider"]},"169":{"title":"OAuth Authentication","titles":["LLM Provider and Model","LLM Provider"]},"170":{"title":"Import Models","titles":["LLM Provider and Model","LLM Provider"]},"171":{"title":"Managing Providers","titles":["LLM Provider and Model","LLM Provider"]},"172":{"title":"Model","titles":["LLM Provider and Model"]},"173":{"title":"Adding a Model","titles":["LLM Provider and Model","Model"]},"174":{"title":"Managing Models","titles":["LLM Provider and Model","Model"]},"175":{"title":"Next Steps","titles":["LLM Provider and Model"]},"176":{"title":"Bot Memory Management","titles":[]},"177":{"title":"Prerequisites","titles":["Bot Memory Management"]},"178":{"title":"Concept: Memory Retrieval","titles":["Bot Memory Management"]},"179":{"title":"Operations","titles":["Bot Memory Management"]},"180":{"title":"1. Creating Memories","titles":["Bot Memory Management","Operations"]},"181":{"title":"2. Searching and Managing","titles":["Bot Memory Management","Operations"]},"182":{"title":"Memory Compression (Compact)","titles":["Bot Memory Management"]},"183":{"title":"Rebuild","titles":["Bot Memory Management"]},"184":{"title":"Status","titles":["Bot Memory Management"]},"185":{"title":"Usage Statistics","titles":["Bot Memory Management"]},"186":{"title":"Bot Interaction","titles":["Bot Memory Management"]},"187":{"title":"Scheduled Tasks","titles":[]},"188":{"title":"Concept: Cron-Based Automation","titles":["Scheduled Tasks"]},"189":{"title":"Schedule Fields","titles":["Scheduled Tasks"]},"190":{"title":"Cron Pattern Reference","titles":["Scheduled Tasks"]},"191":{"title":"Viewing Schedules","titles":["Scheduled Tasks"]},"192":{"title":"Creating Schedules","titles":["Scheduled Tasks"]},"193":{"title":"Via the Bot (Conversational)","titles":["Scheduled Tasks","Creating Schedules"]},"194":{"title":"Via the API","titles":["Scheduled Tasks","Creating Schedules"]},"195":{"title":"Execution Flow","titles":["Scheduled Tasks"]},"196":{"title":"Schedule vs. Heartbeat","titles":["Scheduled Tasks"]},"197":{"title":"Search Providers","titles":[]},"198":{"title":"Concept: Real-Time Knowledge","titles":["Search Providers"]},"199":{"title":"Supported Search Engines","titles":["Search Providers"]},"200":{"title":"Configuration Flow","titles":["Search Providers"]},"201":{"title":"1. Adding a Search Provider","titles":["Search Providers","Configuration Flow"]},"202":{"title":"2. Managing Providers","titles":["Search Providers","Configuration Flow"]},"203":{"title":"Assigning a Search Provider to a Bot","titles":["Search Providers"]},"204":{"title":"Bot Interaction","titles":["Search Providers"]},"205":{"title":"Sessions","titles":[]},"206":{"title":"Concept: Conversation Isolation","titles":["Sessions"]},"207":{"title":"Session Types","titles":["Sessions"]},"208":{"title":"Starting a New Session with /new","titles":["Sessions"]},"209":{"title":"In External Channels (Telegram, Discord, Feishu, etc.)","titles":["Sessions","Starting a New Session with /new"]},"210":{"title":"In the Web UI","titles":["Sessions","Starting a New Session with /new"]},"211":{"title":"Managing Sessions","titles":["Sessions"]},"212":{"title":"Viewing Sessions","titles":["Sessions","Managing Sessions"]},"213":{"title":"Renaming Sessions","titles":["Sessions","Managing Sessions"]},"214":{"title":"Deleting Sessions","titles":["Sessions","Managing Sessions"]},"215":{"title":"How Sessions Relate to Other Features","titles":["Sessions"]},"216":{"title":"Bot Skills","titles":[]},"217":{"title":"Concept: Skills as Markdown","titles":["Bot Skills"]},"218":{"title":"Example Skill Structure","titles":["Bot Skills","Concept: Skills as Markdown"]},"219":{"title":"Managing Skills","titles":["Bot Skills"]},"220":{"title":"Adding a Skill","titles":["Bot Skills","Managing Skills"]},"221":{"title":"Editing and Deleting","titles":["Bot Skills","Managing Skills"]},"222":{"title":"How Bots Use Skills","titles":["Bot Skills"]},"223":{"title":"Slash Commands","titles":[]},"224":{"title":"Quick Reference","titles":["Slash Commands"]},"225":{"title":"Command Format","titles":["Slash Commands"]},"226":{"title":"Permissions","titles":["Slash Commands"]},"227":{"title":"Global Commands","titles":["Slash Commands"]},"228":{"title":"/help","titles":["Slash Commands","Global Commands"]},"229":{"title":"/new","titles":["Slash Commands","Global Commands"]},"230":{"title":"/schedule — Manage Scheduled Tasks","titles":["Slash Commands"]},"231":{"title":"/mcp — Manage MCP Connections","titles":["Slash Commands"]},"232":{"title":"/settings — View and Update Bot Settings","titles":["Slash Commands"]},"233":{"title":"/model — Manage Bot Models","titles":["Slash Commands"]},"234":{"title":"/memory — Manage Memory Provider","titles":["Slash Commands"]},"235":{"title":"/search — Manage Search Provider","titles":["Slash Commands"]},"236":{"title":"/browser — Manage Browser Context","titles":["Slash Commands"]},"237":{"title":"/usage — View Token Usage","titles":["Slash Commands"]},"238":{"title":"/email — View Email Configuration","titles":["Slash Commands"]},"239":{"title":"/heartbeat — View Heartbeat Logs","titles":["Slash Commands"]},"240":{"title":"/skill — View Bot Skills","titles":["Slash Commands"]},"241":{"title":"/fs — Browse Container Filesystem","titles":["Slash Commands"]},"242":{"title":"Mention-Prefixed Commands","titles":["Slash Commands"]},"243":{"title":"Memoh Documentation","titles":[]},"244":{"title":"Documentation","titles":["Memoh Documentation"]},"245":{"title":"Docker Installation","titles":[]},"246":{"title":"Service Architecture","titles":["Docker Installation"]},"247":{"title":"Sparse Service","titles":["Docker Installation","Service Architecture"]},"248":{"title":"Prerequisites","titles":["Docker Installation"]},"249":{"title":"One-Click Install (Recommended)","titles":["Docker Installation"]},"250":{"title":"Manual Install","titles":["Docker Installation"]},"251":{"title":"China Mainland Mirror","titles":["Docker Installation","Manual Install"]},"252":{"title":"Access Points","titles":["Docker Installation"]},"253":{"title":"Configuration Reference","titles":["Docker Installation"]},"254":{"title":"Common Commands","titles":["Docker Installation"]},"255":{"title":"Environment Variables","titles":["Docker Installation"]},"256":{"title":"Memory Providers","titles":[]},"257":{"title":"Available Providers","titles":["Memory Providers"]},"258":{"title":"Basic Flow","titles":["Memory Providers"]},"259":{"title":"Next Steps","titles":["Memory Providers"]},"260":{"title":"Built-in Memory Provider","titles":[]},"261":{"title":"Memory Modes","titles":["Built-in Memory Provider"]},"262":{"title":"How Sparse Mode Works","titles":["Built-in Memory Provider","Memory Modes"]},"263":{"title":"Creating a Built-in Provider","titles":["Built-in Memory Provider"]},"264":{"title":"Configuring a Built-in Provider","titles":["Built-in Memory Provider"]},"265":{"title":"Managing Providers","titles":["Built-in Memory Provider","Configuring a Built-in Provider"]},"266":{"title":"Infrastructure Requirements","titles":["Built-in Memory Provider"]},"267":{"title":"Off Mode","titles":["Built-in Memory Provider","Infrastructure Requirements"]},"268":{"title":"Sparse Mode","titles":["Built-in Memory Provider","Infrastructure Requirements"]},"269":{"title":"Dense Mode","titles":["Built-in Memory Provider","Infrastructure Requirements"]},"270":{"title":"Assigning a Memory Provider to a Bot","titles":["Built-in Memory Provider"]},"271":{"title":"Using Memory After Setup","titles":["Built-in Memory Provider"]},"272":{"title":"OpenViking Memory Provider","titles":[]},"273":{"title":"Creating an OpenViking Provider","titles":["OpenViking Memory Provider"]},"274":{"title":"Configuring an OpenViking Provider","titles":["OpenViking Memory Provider"]},"275":{"title":"Assigning an OpenViking Provider to a Bot","titles":["OpenViking Memory Provider"]},"276":{"title":"Usage","titles":["OpenViking Memory Provider"]},"277":{"title":"Edge TTS","titles":[]},"278":{"title":"Creating an Edge TTS Provider","titles":["Edge TTS"]},"279":{"title":"Configuring the Model","titles":["Edge TTS"]},"280":{"title":"Assigning to a Bot","titles":["Edge TTS"]},"281":{"title":"Testing","titles":["Edge TTS"]},"282":{"title":"Mem0 Memory Provider","titles":[]},"283":{"title":"Creating a Mem0 Provider","titles":["Mem0 Memory Provider"]},"284":{"title":"Configuring a Mem0 Provider","titles":["Mem0 Memory Provider"]},"285":{"title":"Assigning a Mem0 Provider to a Bot","titles":["Mem0 Memory Provider"]},"286":{"title":"Usage","titles":["Mem0 Memory Provider"]},"287":{"title":"TTS Providers","titles":[]},"288":{"title":"Basic Flow","titles":["TTS Providers"]},"289":{"title":"Available Providers","titles":["TTS Providers"]},"290":{"title":"Next Steps","titles":["TTS Providers"]}},"dirtCount":0,"index":[["=",{"2":{"251":1,"268":2,"269":1}}],["~",{"2":{"249":2}}],["|",{"2":{"249":6}}],["ˈmemoʊ",{"2":{"243":1}}],["7",{"2":{"237":1}}],["`run",{"2":{"218":1}}],["`edit",{"2":{"218":1}}],["6334",{"2":{"268":1,"269":1}}],["6",{"2":{"190":1,"249":3,"255":1}}],["│",{"2":{"190":15}}],["┌─────────────",{"2":{"190":5}}],["96kbitrate",{"2":{"279":1}}],["9",{"2":{"189":2,"190":2,"225":1,"230":1}}],["8088",{"2":{"274":1}}],["8083",{"2":{"252":1}}],["8080",{"2":{"252":1,"253":1}}],["8082",{"2":{"252":1}}],["8085",{"2":{"247":1,"268":1}}],["8",{"2":{"130":1,"182":1,"190":3,"193":1,"194":1}}],["00",{"2":{"189":1,"190":3}}],["0",{"2":{"130":3,"182":3,"189":1,"190":9,"194":1,"225":1,"230":1,"249":3,"255":1,"279":5}}],["zh",{"2":{"97":1,"232":1}}],["zone",{"2":{"89":1,"93":1}}],["→",{"2":{"75":2,"79":3}}],["企业微信",{"2":{"53":1}}],["创建机器人",{"2":{"48":1}}],["x26",{"2":{"254":2}}],["x3c",{"2":{"42":3}}],["x",{"2":{"42":1}}],["50+",{"2":{"277":1,"279":1,"289":1}}],["59",{"2":{"190":1}}],["5",{"0":{"38":1},"2":{"48":1,"130":1,"182":1,"279":1}}],["48kbitrate",{"2":{"279":1}}],["4o",{"2":{"172":1,"173":1,"233":2}}],["4",{"0":{"31":1,"37":1,"111":1}}],["16bit",{"2":{"279":1}}],["100",{"2":{"279":1}}],["10",{"2":{"239":1}}],["12",{"2":{"190":1}}],["123456789",{"2":{"60":1}}],["1536",{"2":{"173":1}}],["1",{"0":{"28":1,"34":1,"42":1,"48":1,"54":1,"60":1,"65":1,"108":1,"160":1,"180":1,"201":1},"2":{"190":4,"252":1,"279":1}}],["jwt",{"2":{"249":2,"250":1,"253":1}}],["jina",{"2":{"199":1}}],["jpg",{"2":{"149":1}}],["js",{"2":{"148":1}}],["json",{"2":{"42":1,"163":3,"194":1,"253":1}}],["join",{"2":{"27":1,"41":1,"43":2,"44":2,"45":1}}],["jobs",{"2":{"24":1}}],["just",{"2":{"19":1,"64":1,"142":1}}],["known",{"2":{"118":1}}],["know",{"2":{"50":1,"62":1}}],["knowledge",{"0":{"198":1},"2":{"20":1,"102":1,"186":1,"197":1}}],["kinds",{"2":{"73":1,"207":1}}],["kind",{"2":{"19":1}}],["kept",{"2":{"18":1}}],["keeping",{"2":{"127":1}}],["keep",{"2":{"14":1,"19":1,"25":2,"42":1,"60":1,"155":1}}],["keys",{"2":{"109":1,"186":1}}],["keyword",{"2":{"6":1,"247":1,"262":1}}],["key",{"0":{"2":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"6":1,"66":1,"138":1,"160":1,"168":1,"169":1,"171":1,"201":1,"244":1,"247":1,"253":1,"257":1,"262":1,"274":2,"277":1,"284":2,"289":1}}],["yml",{"2":{"250":1,"251":2}}],["yaml",{"2":{"217":1,"218":1,"222":1}}],["yandex",{"2":{"199":1}}],["y",{"2":{"160":1,"249":1}}],["yet",{"2":{"90":1,"102":1}}],["yes",{"2":{"43":3,"55":2,"173":5,"274":1,"284":1}}],["year",{"2":{"18":1,"19":1}}],["yourself",{"2":{"282":1}}],["yours",{"2":{"25":1}}],["your",{"0":{"30":1,"38":1,"50":1,"62":1},"2":{"1":1,"15":1,"19":1,"20":1,"23":1,"27":1,"30":1,"31":2,"33":1,"34":1,"36":1,"37":2,"39":3,"40":2,"41":2,"42":2,"43":2,"44":1,"47":1,"48":1,"49":2,"50":3,"53":2,"55":1,"56":1,"59":1,"60":1,"61":2,"62":4,"64":1,"65":1,"66":2,"70":1,"85":1,"90":1,"91":1,"99":1,"103":2,"105":1,"110":1,"115":1,"123":1,"124":1,"135":1,"136":1,"137":1,"139":1,"146":2,"150":1,"151":1,"157":1,"168":1,"175":1,"177":2,"179":1,"197":1,"198":1,"199":2,"201":1,"203":1,"206":1,"219":1,"243":1,"245":1,"249":1,"250":1,"254":1,"270":1,"275":1,"282":1,"285":1}}],["you",{"2":{"1":1,"19":5,"22":1,"25":1,"30":1,"39":1,"42":1,"50":2,"59":1,"60":2,"62":2,"66":1,"70":1,"79":1,"88":2,"90":1,"98":1,"99":1,"102":1,"103":1,"104":1,"118":1,"125":1,"130":1,"140":1,"143":1,"147":1,"151":2,"157":1,"162":2,"164":2,"166":1,"175":2,"183":3,"187":1,"190":1,"193":1,"194":1,"197":1,"201":1,"203":1,"206":2,"209":4,"210":1,"214":1,"215":1,"218":2,"222":1,"242":1,"245":1,"247":2,"250":1,"251":1,"265":1,"270":1,"271":1,"275":1,"285":1,"287":1}}],["256",{"2":{"279":1}}],["256+",{"2":{"277":1,"289":1}}],["2000",{"2":{"241":1}}],["20",{"2":{"190":1}}],["2026",{"2":{"18":1,"26":1}}],["23",{"2":{"190":1}}],["2",{"0":{"29":1,"35":1,"43":1,"49":1,"55":1,"61":1,"66":1,"109":1,"161":1,"181":1,"202":1},"2":{"252":1,"279":1}}],["24khz",{"2":{"279":3}}],["24",{"2":{"6":1,"23":1}}],["32",{"2":{"250":1}}],["31",{"2":{"190":1}}],["30",{"2":{"43":1,"153":1,"190":2,"232":1}}],["3",{"0":{"30":1,"36":1,"44":1,"50":1,"56":1,"62":1,"67":1,"110":1},"2":{"15":1,"130":1,"172":1,"182":1,"246":1,"279":1}}],["null",{"2":{"194":1}}],["number",{"2":{"117":1,"130":1,"182":1,"185":1,"189":2}}],["npx",{"2":{"160":1}}],["night",{"2":{"19":1}}],["navigating",{"2":{"95":1}}],["navigation",{"0":{"145":1},"2":{"8":1,"97":1,"100":1,"145":1}}],["navigate",{"2":{"54":1,"87":1,"90":1,"93":1,"96":1,"99":1,"130":1,"138":1,"168":1,"191":1,"201":1,"203":1,"263":1,"270":1,"273":1,"275":1,"278":1,"283":1,"285":1,"288":1}}],["named",{"2":{"287":1}}],["namespace",{"2":{"253":1}}],["names",{"2":{"164":1}}],["name",{"2":{"28":1,"34":1,"60":2,"87":2,"96":2,"97":2,"119":1,"163":1,"168":2,"171":1,"173":2,"189":2,"191":1,"194":1,"201":2,"212":1,"218":1,"220":1,"230":6,"231":2,"233":4,"234":1,"235":1,"236":1,"263":2,"264":1,"273":2,"283":2}}],["natural",{"2":{"18":1,"189":1,"193":1,"196":1}}],["none",{"2":{"261":1}}],["normally",{"2":{"242":1}}],["noise",{"2":{"127":1,"128":1}}],["now",{"2":{"67":1,"175":1,"280":1,"288":1}}],["node",{"2":{"19":1,"22":1}}],["notifications",{"2":{"152":1}}],["noticed",{"2":{"19":1}}],["notes",{"2":{"199":1}}],["note",{"2":{"42":1,"54":1}}],["not",{"2":{"18":1,"19":3,"22":1,"79":1,"90":1,"102":1,"177":1,"245":1,"250":1,"254":1,"270":1}}],["no",{"2":{"15":1,"16":1,"23":1,"43":2,"48":1,"55":1,"66":1,"72":1,"75":1,"81":1,"91":1,"98":1,"128":1,"173":2,"181":1,"209":1,"214":1,"247":1,"249":1,"250":1,"261":1,"262":1,"265":1,"267":1,"270":1,"274":1,"277":1,"284":3,"289":1}}],["neural",{"2":{"246":1,"247":3,"257":1,"261":1,"262":1,"268":1}}],["nerdctl",{"2":{"245":1}}],["next",{"0":{"102":1,"134":1,"175":1,"259":1,"290":1},"2":{"121":1,"174":2,"221":1}}],["needing",{"2":{"247":1}}],["needed",{"2":{"66":1,"81":1,"133":1,"181":1}}],["need",{"2":{"22":1,"60":1,"166":1,"201":1,"214":1,"245":1,"247":1,"272":1}}],["news",{"2":{"189":2,"230":3}}],["newbot",{"2":{"60":1}}],["new",{"0":{"208":2,"229":1},"1":{"209":2,"210":2},"2":{"9":2,"10":2,"19":1,"28":1,"42":1,"54":1,"62":1,"78":1,"128":1,"145":1,"180":1,"206":1,"208":1,"209":3,"210":1,"224":2,"229":1,"242":1}}],["network",{"2":{"1":1,"5":1,"23":1,"24":1,"161":1,"243":1}}],["github",{"2":{"249":1,"250":1}}],["git",{"2":{"248":1,"250":1,"255":1}}],["giving",{"2":{"206":1}}],["give",{"2":{"19":1,"24":1,"28":1,"94":1}}],["gpt",{"2":{"172":1,"173":1,"233":2}}],["gather",{"2":{"100":1}}],["gateways",{"2":{"39":1}}],["gateway",{"0":{"95":1},"2":{"29":1,"94":1,"95":1,"246":1,"252":1,"253":2}}],["global",{"0":{"227":1},"1":{"228":1,"229":1},"2":{"73":1,"199":1}}],["g",{"2":{"40":1,"42":2,"43":2,"60":3,"73":2,"130":1,"138":1,"145":1,"148":1,"149":1,"160":2,"161":1,"168":2,"173":3,"183":1,"189":3,"195":1,"201":2,"225":2,"232":1,"249":1,"255":1,"274":1,"287":2,"288":1}}],["guides",{"0":{"106":1},"2":{"40":1,"106":1,"244":1}}],["guide",{"2":{"30":1,"37":2,"59":1,"60":1,"244":1}}],["gt",{"2":{"30":1,"34":1,"35":1,"36":1,"37":1,"38":1,"50":1,"54":1,"62":1,"230":8,"231":2,"233":4,"234":1,"235":1,"236":1,"241":1}}],["going",{"2":{"223":1}}],["good",{"2":{"118":1,"247":1,"261":1}}],["google",{"2":{"8":1,"11":1,"173":1,"198":1,"199":1}}],["go",{"2":{"28":2,"30":1,"31":1,"34":2,"35":1,"36":1,"37":2,"38":1,"43":1,"48":1,"49":1,"50":1,"55":1,"61":1,"62":1,"65":1,"90":1,"99":1,"203":1,"270":1,"275":1,"285":1}}],["got",{"2":{"19":1}}],["getting",{"2":{"244":1}}],["gets",{"2":{"24":1}}],["get",{"2":{"16":1,"18":1,"60":1,"66":1,"230":2,"231":2,"232":2}}],["general",{"0":{"40":1,"91":1},"2":{"72":1,"81":1,"89":1,"90":1,"91":1,"93":1,"99":1,"129":1,"177":1,"196":1,"203":1,"256":1,"258":1,"270":1,"275":1,"280":1,"285":1,"288":1}}],["generating",{"2":{"51":1,"68":1,"69":1,"91":1}}],["generative",{"2":{"11":1,"173":1}}],["generator",{"2":{"30":1}}],["generate",{"2":{"28":1,"37":1,"50":1,"62":1,"110":1,"128":1,"249":1,"250":1}}],["generated",{"2":{"19":1,"30":1,"45":1,"212":1,"249":1}}],["generic",{"2":{"7":1,"136":1,"138":1,"196":1}}],["grounded",{"2":{"204":1}}],["grouped",{"2":{"206":1}}],["group",{"2":{"4":1,"36":1,"41":1,"45":1,"51":1,"56":1,"57":2,"77":2,"79":2,"225":1,"242":1,"250":1,"254":1}}],["groups",{"2":{"3":1,"23":1,"33":1}}],["grow",{"2":{"127":1}}],["granting",{"2":{"162":1}}],["grants",{"2":{"74":1}}],["gracefully",{"2":{"116":1}}],["grained",{"2":{"79":1}}],["grade",{"2":{"20":1}}],["graphical",{"0":{"15":1},"2":{"23":1}}],["gmail",{"2":{"7":1,"39":1}}],["+100",{"2":{"279":1}}],["+",{"2":{"6":1,"7":1,"15":1,"24":1,"247":1,"261":2,"279":1}}],["qr",{"0":{"66":1,"111":1},"2":{"64":1,"66":5,"67":1,"111":2}}],["queries",{"2":{"247":1}}],["query",{"2":{"170":1}}],["question",{"2":{"204":1}}],["questions",{"2":{"18":2}}],["quotes",{"2":{"225":1}}],["quot",{"2":{"63":2,"114":2,"142":2,"152":2,"156":4,"168":2,"189":4,"193":2,"196":2,"201":2,"216":4,"222":2,"225":4}}],["quickly",{"2":{"109":1,"145":1,"155":1,"163":2,"184":1,"247":1}}],["quick",{"0":{"224":1},"2":{"39":1}}],["quietly",{"2":{"19":1}}],["quarter",{"2":{"18":1}}],["quality",{"2":{"14":1,"128":1,"247":1,"261":2,"262":1}}],["qdrant",{"2":{"6":1,"16":1,"246":3,"247":2,"250":2,"251":1,"253":2,"261":3,"264":2,"268":4,"269":5}}],["qq",{"0":{"47":1,"48":1},"1":{"48":1,"49":1,"50":1,"51":1,"52":1},"2":{"1":1,"7":1,"39":1,"47":2,"48":2,"49":1,"50":3,"52":2,"89":1,"106":1,"243":1,"244":1}}],["voice",{"2":{"279":3,"281":1,"287":2,"288":1}}],["voices",{"2":{"277":1,"279":1,"289":1}}],["volume",{"2":{"138":1}}],["v0",{"2":{"249":1,"255":1}}],["v2",{"2":{"248":1}}],["vs",{"0":{"196":1}}],["v3",{"2":{"42":1}}],["v1",{"2":{"37":1,"168":1,"247":1,"262":1,"268":1}}],["var",{"2":{"250":1}}],["variable",{"2":{"249":1,"255":1}}],["variables",{"0":{"255":1},"2":{"160":1,"249":1}}],["various",{"2":{"23":1,"86":1,"103":1,"197":1}}],["valid",{"2":{"101":1}}],["validity",{"2":{"66":1}}],["values",{"2":{"101":1,"130":1,"225":1,"232":1}}],["value",{"2":{"18":1,"160":1,"190":1}}],["vue",{"2":{"15":1,"246":1}}],["video",{"2":{"173":1}}],["visual",{"2":{"15":1,"51":1,"69":1,"149":1}}],["visualization",{"2":{"15":1}}],["viewport",{"2":{"91":1,"94":1,"97":4}}],["viewing",{"0":{"147":1,"191":1,"212":1},"1":{"148":1,"149":1},"2":{"48":1,"226":1}}],["view",{"0":{"232":1,"237":1,"238":1,"239":1,"240":1},"2":{"10":2,"121":1,"155":1,"162":1,"164":1,"215":1,"224":5,"254":1}}],["via",{"0":{"193":1,"194":1},"2":{"1":1,"6":1,"7":1,"8":2,"11":1,"12":1,"32":1,"33":1,"39":4,"40":1,"41":1,"42":1,"56":1,"64":1,"79":1,"85":1,"86":1,"114":1,"116":1,"142":2,"160":1,"243":1,"245":1,"246":1,"257":1,"259":1}}],["verify",{"2":{"171":1,"184":1}}],["verification",{"2":{"37":1}}],["version=v0",{"2":{"249":2}}],["versions",{"2":{"126":1,"249":1,"255":1}}],["version",{"2":{"38":2,"126":5,"249":2,"255":1}}],["versioned",{"2":{"22":1}}],["versioning",{"0":{"126":1},"2":{"5":1,"118":1}}],["vectors",{"2":{"178":1,"247":1,"257":1,"261":1,"262":1}}],["vector",{"2":{"6":1,"22":1,"173":2,"183":1,"185":1,"246":1,"247":1,"250":1,"253":1,"261":1,"264":1,"268":1}}],["right",{"2":{"171":1,"202":1}}],["rich",{"2":{"8":1,"39":1,"51":1}}],["rule",{"0":{"74":1},"2":{"72":2,"74":1,"75":6,"77":2,"84":1,"85":1,"91":1,"188":1}}],["rules",{"0":{"77":1,"78":1},"2":{"70":1,"73":2,"75":2,"78":2,"79":1,"81":1,"82":1,"83":1,"89":1}}],["running",{"2":{"16":1,"92":1,"116":1,"117":2,"249":1,"250":1}}],["run",{"2":{"13":1,"21":1,"22":1,"23":1,"25":1,"160":1,"243":1,"245":1,"249":1}}],["runtime",{"2":{"8":1,"22":1,"90":1,"91":1,"117":1,"126":1,"178":1,"247":1,"270":1}}],["runs",{"2":{"5":1,"23":1,"129":1,"131":1,"189":1,"193":1,"215":1,"243":1,"245":1,"247":2,"262":1,"268":1}}],["root",{"2":{"168":1}}],["room",{"2":{"44":1}}],["rooms",{"2":{"41":1,"43":1,"45":2}}],["routed",{"2":{"276":1,"286":1}}],["route",{"2":{"209":1}}],["router",{"2":{"19":3,"22":2}}],["routine",{"2":{"156":1,"187":1,"196":1}}],["routing",{"2":{"109":1}}],["roadmap",{"2":{"45":1}}],["rand",{"2":{"250":1}}],["range",{"2":{"11":1,"279":1}}],["ratio",{"2":{"97":1,"130":2,"182":2}}],["ratios",{"2":{"14":1}}],["raise",{"2":{"21":1}}],["ram",{"2":{"19":1}}],["rag",{"2":{"19":1,"20":1}}],["rewriting",{"2":{"222":1}}],["retained",{"2":{"182":1}}],["retrieves",{"2":{"186":1,"256":1}}],["retrieved",{"2":{"23":1,"178":1,"264":1,"267":1}}],["retrieve",{"2":{"8":1,"146":1}}],["retrieval",{"0":{"178":1},"2":{"6":2,"14":1,"22":1,"128":1,"133":1,"178":1,"246":1,"247":3,"260":2,"261":1,"262":1,"282":1}}],["requiring",{"2":{"247":1}}],["requirements",{"0":{"266":1},"1":{"267":1,"268":1,"269":1},"2":{"260":1,"261":1}}],["require",{"2":{"162":1}}],["requires",{"2":{"77":1,"79":1,"92":1,"162":1,"204":1,"249":1,"257":1,"262":1,"268":1,"269":1,"277":1}}],["required",{"2":{"15":1,"23":1,"36":1,"43":2,"48":1,"55":2,"108":1,"138":1,"173":1,"250":1,"267":1,"274":1,"284":1,"289":1}}],["requested",{"2":{"165":1}}],["revoke",{"2":{"162":1}}],["redirected",{"2":{"162":1}}],["reducing",{"2":{"127":1,"128":1,"133":1}}],["reduces",{"2":{"14":1}}],["redundant",{"2":{"127":1,"128":1,"133":1,"182":1}}],["redundancy",{"2":{"14":1}}],["renaming",{"0":{"213":1}}],["rename",{"2":{"146":2,"210":1,"213":1}}],["rendered",{"2":{"8":1,"95":1}}],["referencing",{"2":{"209":1}}],["reference",{"0":{"91":1,"190":1,"224":1,"253":1},"2":{"10":1}}],["refresh",{"2":{"132":1,"145":1,"155":1,"164":1,"191":1}}],["relate",{"0":{"215":1}}],["relationship",{"0":{"133":1}}],["relationships",{"2":{"121":1}}],["reload",{"2":{"132":1,"145":1,"191":1}}],["relying",{"2":{"100":1}}],["relevance",{"2":{"128":1}}],["relevant",{"2":{"14":1,"127":1,"164":1,"176":1,"178":1}}],["release",{"2":{"38":2,"249":2,"255":1}}],["reusable",{"2":{"95":1}}],["reordering",{"0":{"78":1},"2":{"78":1}}],["regardless",{"2":{"50":1,"62":1,"73":1}}],["registry",{"2":{"251":2,"253":2}}],["registration",{"2":{"39":1}}],["register",{"2":{"40":1,"42":1,"193":1}}],["recent",{"2":{"239":1}}],["receiving",{"2":{"40":1,"56":1}}],["receives",{"2":{"156":1,"195":1}}],["receive",{"2":{"36":1,"37":2,"45":1,"135":1}}],["recurring",{"2":{"152":1,"187":1,"196":1}}],["recursive",{"2":{"146":1}}],["recipient",{"2":{"141":1}}],["recreating",{"2":{"125":1}}],["records",{"2":{"132":1,"155":1,"207":1}}],["recommended",{"0":{"249":1},"2":{"16":1,"199":1,"244":1,"245":1,"250":1}}],["recognition",{"0":{"4":1},"2":{"50":1,"62":1}}],["removing",{"2":{"109":1,"128":1}}],["removes",{"2":{"133":1,"214":1}}],["removed",{"2":{"131":1}}],["remove",{"2":{"93":1,"98":1,"112":1,"116":1,"121":1,"132":1,"146":1,"155":1,"162":1,"174":1,"181":1,"214":1,"221":1,"265":1}}],["remote",{"0":{"161":1},"2":{"89":1,"161":2}}],["remains",{"2":{"22":1}}],["remembers",{"2":{"90":1}}],["remember",{"2":{"4":1,"19":1,"24":1,"150":1,"176":1}}],["repository",{"2":{"249":1}}],["report",{"2":{"225":1}}],["reports",{"2":{"142":1,"187":1}}],["represented",{"2":{"217":1}}],["represents",{"2":{"167":1}}],["reproducible",{"2":{"21":1}}],["replies",{"2":{"7":1,"63":2}}],["re",{"2":{"21":1,"183":2}}],["resource",{"2":{"225":2}}],["resources",{"0":{"46":1,"52":1,"58":1},"2":{"8":1,"90":1,"116":1,"165":1}}],["research",{"2":{"199":1}}],["resetting",{"2":{"208":1,"229":1}}],["reset",{"2":{"28":1,"48":1,"120":1}}],["resets",{"2":{"9":1,"125":1,"206":1}}],["result",{"2":{"131":1,"154":1,"194":1}}],["results",{"2":{"100":1,"128":1,"188":1,"195":1,"204":2,"215":1,"247":1}}],["rest",{"2":{"194":1}}],["restoring",{"0":{"120":1}}],["restore",{"0":{"125":1},"2":{"5":1,"118":1,"120":1,"125":1}}],["restrict",{"2":{"77":1,"79":1,"130":1}}],["response",{"2":{"154":1,"204":1}}],["responses",{"2":{"11":1,"45":1,"51":1,"57":1,"59":1,"63":1,"68":1,"69":1,"91":1,"173":1}}],["respond",{"2":{"41":1,"62":1,"142":1}}],["reach",{"2":{"223":1}}],["reached",{"2":{"195":1}}],["reachable",{"2":{"171":1,"184":1}}],["reactions",{"2":{"8":1}}],["reasoning",{"2":{"89":1,"91":4,"165":1,"173":2,"232":2}}],["realized",{"2":{"19":1}}],["reality",{"2":{"18":1}}],["real",{"0":{"198":1},"2":{"8":1,"15":1,"18":2,"19":4,"24":1,"57":1,"100":1,"116":1,"117":1,"183":1,"197":1,"204":1}}],["reads",{"2":{"133":1}}],["reading",{"2":{"95":1}}],["ready",{"2":{"38":1,"39":1}}],["read",{"2":{"5":1,"8":1,"30":1,"140":1,"148":1,"150":1,"195":1,"207":1,"226":1,"241":3,"277":1,"278":1,"279":1,"287":1,"289":1}}],["rebuild",{"0":{"183":1},"2":{"6":1,"101":1,"183":3,"260":1,"271":1}}],["uuid",{"2":{"232":2}}],["utc",{"2":{"97":1,"190":1,"253":1}}],["url",{"2":{"30":2,"37":4,"43":2,"55":1,"87":1,"110":2,"161":1,"167":1,"168":2,"171":1,"201":1,"252":1,"253":2,"268":2,"269":1,"274":1,"284":2}}],["uncomment",{"2":{"251":1}}],["uncomfortable",{"2":{"21":1}}],["unread",{"2":{"193":1,"194":2}}],["unlike",{"2":{"262":1}}],["unlimited",{"2":{"189":1,"196":1}}],["unless",{"2":{"72":1}}],["unique",{"2":{"60":1,"117":1,"186":1}}],["unified",{"0":{"104":1},"2":{"7":1}}],["unifies",{"2":{"4":1}}],["underlying",{"2":{"247":1}}],["understanding",{"2":{"126":1}}],["understands",{"2":{"63":1}}],["under",{"2":{"20":1,"72":1,"287":1}}],["ui",{"0":{"210":1},"2":{"15":1,"31":1,"43":1,"49":1,"50":1,"55":1,"61":1,"62":1,"65":1,"97":1,"147":1,"210":1,"212":1,"245":1,"246":1,"252":1}}],["us",{"2":{"97":1,"279":1}}],["usage",{"0":{"185":1,"237":2,"276":1,"286":1},"2":{"10":2,"185":1,"224":2,"228":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":5,"238":1,"239":1,"240":1,"241":1}}],["using",{"0":{"271":1},"2":{"8":1,"9":1,"13":1,"42":1,"86":1,"103":1,"110":1,"111":1,"116":1,"177":1,"187":1,"188":1,"194":1,"195":1,"247":2,"249":1,"258":1,"267":1,"280":1}}],["useful",{"2":{"73":2,"118":1,"125":1,"152":1,"183":1,"187":1,"209":1}}],["uses",{"2":{"55":1,"70":1,"90":1,"133":1,"190":2,"206":1,"207":1,"247":1,"256":1,"262":1,"277":1,"289":1}}],["used",{"2":{"10":1,"90":1,"91":5,"117":1,"129":1,"153":1,"173":1,"186":1,"264":1,"272":1}}],["use",{"0":{"222":1},"2":{"8":1,"23":1,"24":1,"38":1,"50":1,"62":1,"73":1,"90":2,"91":1,"94":2,"95":1,"98":1,"99":1,"100":1,"121":1,"128":1,"142":1,"146":1,"150":1,"156":1,"163":1,"164":2,"165":1,"166":1,"169":1,"171":2,"178":1,"184":1,"196":2,"198":1,"202":1,"216":1,"218":2,"225":1,"247":2,"249":4,"251":1,"255":2,"261":1,"265":1,"270":1,"276":1,"281":1,"286":1}}],["username",{"2":{"60":2,"138":1,"253":1}}],["username>",{"2":{"42":1}}],["users",{"0":{"82":1,"83":1},"2":{"4":2,"8":1,"9":1,"22":1,"33":1,"45":1,"47":1,"53":1,"56":1,"57":1,"64":1,"67":1,"69":1,"70":1,"73":2,"84":1,"87":1,"90":1,"207":1,"226":1,"251":1}}],["user",{"0":{"4":1},"2":{"9":1,"19":1,"24":1,"42":3,"43":2,"44":1,"73":1,"79":1,"85":1,"97":2,"142":1,"165":1,"178":1,"204":1,"205":1,"207":1,"212":1,"218":1,"250":1,"253":1,"254":1}}],["upload",{"2":{"146":1}}],["upgradable",{"2":{"22":1}}],["updates",{"2":{"133":1}}],["updated",{"2":{"126":1,"183":1}}],["update",{"0":{"232":1},"2":{"10":1,"97":1,"98":1,"112":2,"146":1,"171":1,"202":1,"224":1,"230":2,"232":4,"254":1,"265":1}}],["up",{"2":{"3":1,"15":1,"23":1,"48":1,"90":1,"152":1,"185":1,"247":1,"250":2,"251":1,"254":2,"268":1,"269":1,"290":1}}],["dynamic",{"2":{"108":1}}],["dropdown",{"2":{"99":1,"203":1,"270":1,"275":1,"280":1,"285":1}}],["dropped",{"2":{"78":1}}],["drag",{"2":{"78":1}}],["d",{"2":{"42":1,"247":1,"250":2,"251":1,"254":2,"268":1,"269":1}}],["dm",{"2":{"39":1}}],["db",{"2":{"22":1,"250":3}}],["duration",{"2":{"131":1,"154":1}}],["durable",{"2":{"21":1,"22":1,"25":1}}],["during",{"2":{"101":1,"116":1,"128":1,"129":1,"154":1,"156":2,"164":1,"186":1,"198":1,"215":1,"222":1,"247":1,"260":1}}],["duckduckgo",{"2":{"8":1,"199":1}}],["domain",{"2":{"138":1}}],["documented",{"2":{"218":1}}],["document",{"2":{"217":1,"247":1}}],["documentation",{"0":{"243":1,"244":1},"1":{"244":1},"2":{"52":1,"58":1}}],["docker",{"0":{"245":1},"1":{"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1},"2":{"16":2,"101":1,"117":1,"244":1,"245":2,"246":1,"247":1,"248":2,"249":6,"250":5,"251":5,"254":6,"255":2,"268":1}}],["do",{"2":{"42":1,"245":1}}],["downloaded",{"2":{"247":1}}],["download",{"2":{"146":1}}],["downloadable",{"2":{"123":1}}],["down",{"2":{"29":1,"116":1,"237":1,"254":1}}],["don",{"2":{"19":2,"21":2,"223":1,"247":1}}],["doing",{"2":{"19":1}}],["doesn",{"2":{"19":1,"116":1}}],["does",{"2":{"18":1,"142":1,"189":1,"247":1}}],["debug",{"2":{"253":1}}],["delivered",{"2":{"195":1}}],["deliver",{"2":{"188":1}}],["delivery",{"2":{"138":1,"141":1}}],["delete",{"2":{"93":1,"98":1,"112":1,"116":1,"121":1,"140":1,"146":1,"163":2,"171":2,"174":1,"181":1,"202":2,"210":1,"221":1,"230":2,"231":2,"265":1,"271":1}}],["deleting",{"0":{"93":1,"214":1,"221":1},"2":{"163":1,"214":1}}],["delegates",{"2":{"207":1}}],["delegated",{"2":{"9":1,"215":1}}],["delegate",{"2":{"8":1}}],["designed",{"2":{"199":1}}],["desired",{"2":{"120":1}}],["descriptions",{"2":{"164":1}}],["description",{"2":{"34":1,"43":1,"55":1,"68":1,"73":1,"89":1,"91":1,"97":1,"109":1,"129":1,"153":1,"160":1,"161":1,"173":1,"189":2,"194":1,"207":1,"218":1,"220":1,"224":1,"246":1,"253":1,"255":1,"264":1,"274":1,"279":1,"284":1,"289":1}}],["deep",{"2":{"91":1}}],["deeply",{"2":{"6":1}}],["dense",{"0":{"269":1},"2":{"178":1,"246":1,"247":1,"257":1,"261":2,"262":1,"264":3}}],["density",{"2":{"19":2}}],["denied",{"2":{"72":1,"83":1,"84":1}}],["deny",{"2":{"70":1,"72":2,"73":1,"74":1,"75":1,"77":1,"82":1,"83":1,"84":1,"91":1,"232":1}}],["dedicated",{"2":{"39":1,"113":1,"143":1,"272":1}}],["determine",{"2":{"182":1}}],["determined",{"2":{"101":1}}],["determines",{"2":{"75":1}}],["detection",{"2":{"6":1}}],["detail",{"0":{"88":1},"1":{"89":1},"2":{"61":1,"88":1,"90":1,"93":1,"105":1,"115":1,"129":1,"130":1,"131":1,"139":1,"143":1,"153":1,"159":1,"179":1,"191":1,"219":1}}],["detailed",{"2":{"40":1,"106":1,"154":1,"244":1}}],["details",{"2":{"38":1,"164":1,"182":1,"229":1,"247":1}}],["developer",{"2":{"28":1,"30":1,"35":1}}],["device",{"2":{"19":1,"22":1,"24":1,"97":2}}],["deployable",{"2":{"22":1}}],["depending",{"2":{"178":1,"201":1}}],["dependable",{"2":{"21":1}}],["dependencies",{"2":{"16":1}}],["decide",{"2":{"19":1}}],["decay",{"2":{"14":1,"130":1,"182":1}}],["decentralized",{"2":{"7":1,"39":1,"41":1}}],["definitions",{"2":{"253":1}}],["defined",{"2":{"212":1}}],["defines",{"2":{"189":1}}],["define",{"2":{"8":1,"70":1,"89":1,"90":1,"91":2,"216":1,"256":1}}],["defaults",{"2":{"173":1,"249":2,"264":1,"284":1}}],["default",{"0":{"72":1},"2":{"6":1,"23":1,"24":1,"43":2,"49":2,"55":1,"72":2,"75":1,"81":2,"82":1,"83":1,"84":1,"91":2,"97":1,"101":1,"153":1,"173":1,"190":1,"207":1,"225":1,"232":1,"250":1,"252":1,"253":2,"255":1,"257":1,"259":1,"264":1,"278":1,"279":4,"288":1}}],["date",{"2":{"185":1}}],["database",{"2":{"6":1,"23":1,"89":1,"246":2,"250":1,"253":2,"268":1}}],["data",{"0":{"122":1},"1":{"123":1,"124":1,"125":1},"2":{"5":1,"89":1,"93":2,"117":2,"122":1,"123":2,"124":1,"125":1,"152":1,"158":1,"160":1,"187":1,"249":3,"253":1}}],["danger",{"2":{"89":1,"93":1}}],["days",{"2":{"130":2,"182":2,"237":1}}],["day",{"2":{"21":1,"190":5,"193":1,"271":2,"276":2,"286":2}}],["dark",{"2":{"15":1}}],["daily",{"2":{"3":1,"189":1,"193":1,"194":1,"225":2}}],["dialog",{"2":{"220":1}}],["digest",{"2":{"193":1,"194":1}}],["dimensions",{"2":{"173":1}}],["different",{"2":{"104":1,"129":1,"153":1,"207":1,"209":1,"260":1}}],["differ",{"2":{"91":1}}],["differs",{"2":{"24":1}}],["did",{"2":{"19":1,"215":1}}],["directories",{"2":{"145":1,"146":1}}],["directory",{"2":{"125":1,"144":1,"145":1,"160":1,"249":2,"253":1}}],["directly",{"2":{"10":1,"56":1,"64":1,"67":1,"92":1,"110":1,"143":1,"149":1,"181":1,"207":1,"251":1}}],["direct",{"2":{"4":1,"39":1,"41":1,"44":1,"45":1,"50":1,"51":1,"57":1,"69":1}}],["discovers",{"2":{"164":1}}],["discovery",{"0":{"164":1}}],["discover",{"2":{"162":1,"165":1,"170":1}}],["discord",{"0":{"27":1,"28":1,"209":1},"1":{"28":1,"29":1,"30":1,"31":1,"32":1},"2":{"1":1,"4":1,"7":1,"27":1,"28":1,"30":1,"31":1,"32":1,"39":1,"73":2,"79":1,"89":1,"104":1,"106":1,"223":1,"243":1,"244":1}}],["discarding",{"2":{"128":1}}],["displays",{"2":{"117":1,"185":1,"228":1}}],["display",{"2":{"60":1,"87":1,"96":1,"97":1,"168":1,"173":1,"189":1,"263":1,"273":1,"283":1}}],["displayed",{"2":{"48":1,"66":1,"241":1}}],["disappears",{"2":{"19":1}}],["disabled",{"2":{"109":1,"195":1}}],["disable",{"2":{"8":1,"109":1,"112":1,"163":1,"230":3}}],["distinguishes",{"2":{"172":1}}],["distinguish",{"2":{"4":1}}],["ps",{"2":{"254":1}}],["p",{"2":{"230":1}}],["pm",{"2":{"190":1}}],["png",{"2":{"149":1}}],["python",{"2":{"247":1}}],["python3",{"2":{"160":1}}],["py",{"2":{"148":1}}],["pitch",{"2":{"279":2,"281":1,"287":1,"288":1}}],["pipeline",{"2":{"260":1}}],["pins",{"2":{"255":1}}],["pin",{"2":{"249":1}}],["pixel",{"2":{"97":1}}],["pixels",{"2":{"97":2}}],["picture",{"2":{"87":1}}],["plus",{"2":{"82":1}}],["plan",{"2":{"247":1}}],["plane",{"2":{"22":1}}],["placed",{"2":{"75":1}}],["playback",{"2":{"279":1}}],["playground",{"2":{"24":1}}],["playwright",{"2":{"8":1,"95":1,"246":1}}],["plainly",{"2":{"19":1}}],["platforms",{"2":{"7":1,"23":1,"31":1,"37":1,"39":1,"40":1,"43":1,"49":1,"55":1,"59":1,"61":1,"65":1,"86":1,"89":1,"103":1,"105":1}}],["platform",{"0":{"7":1,"84":1,"106":1},"2":{"1":1,"4":1,"7":1,"33":1,"34":1,"39":1,"40":2,"47":1,"48":1,"50":1,"52":1,"58":1,"62":1,"66":1,"73":2,"77":1,"106":1,"108":1,"109":2,"282":1}}],["phone",{"2":{"66":2}}],["phones",{"2":{"19":1}}],["photo",{"2":{"45":1}}],["public",{"2":{"277":1,"289":1}}],["published",{"2":{"38":1}}],["publish",{"0":{"38":1}}],["purpose",{"2":{"196":1}}],["purposes",{"2":{"122":1}}],["pulled",{"2":{"252":1}}],["pulls",{"2":{"249":1}}],["pull",{"2":{"116":1,"254":1}}],["push",{"2":{"24":1}}],["pencil",{"2":{"221":1}}],["people",{"2":{"21":1}}],["performance",{"2":{"199":1}}],["performing",{"2":{"187":1}}],["perform",{"2":{"86":1,"100":1,"116":1,"150":1,"151":1,"156":1,"165":1,"223":1}}],["persistence",{"2":{"117":1}}],["persistent",{"2":{"86":1,"93":1}}],["persist",{"2":{"78":1}}],["personalized",{"2":{"176":1}}],["personality",{"2":{"8":1,"86":1,"89":1,"216":1,"217":1}}],["personal",{"2":{"7":1,"18":1,"19":1,"39":2,"64":1}}],["person",{"2":{"4":2}}],["permission",{"2":{"74":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1}}],["permissions",{"0":{"36":1,"226":1},"2":{"30":1,"36":3,"140":1,"142":1}}],["permanently",{"2":{"25":1,"93":1,"112":1,"214":1}}],["per",{"2":{"11":1,"206":1}}],["periodically",{"2":{"129":1}}],["periodic",{"2":{"9":1,"91":1,"151":1,"152":1,"187":1,"196":2,"207":1}}],["points",{"0":{"252":1}}],["popup",{"2":{"169":1}}],["port",{"2":{"138":1,"247":1,"253":3}}],["portal",{"2":{"28":1,"30":1,"39":1,"150":1}}],["portable",{"2":{"19":1,"21":1}}],["polling",{"2":{"43":1}}],["polite",{"2":{"19":1}}],["powerful",{"2":{"19":1,"135":1,"199":1}}],["powered",{"2":{"5":1,"8":1,"95":1,"199":1}}],["postgres",{"2":{"246":1,"249":2,"250":4,"253":1,"255":2}}],["postgresql",{"2":{"16":1,"245":1,"246":1,"253":1,"255":1}}],["post",{"2":{"42":1,"194":1}}],["position",{"2":{"19":1}}],["pool",{"2":{"14":1,"127":1,"182":1}}],["pdfs",{"2":{"95":1}}],["pdf",{"2":{"8":1,"100":1}}],["pattern",{"0":{"190":1},"2":{"189":1,"190":2,"191":1,"194":1,"225":1,"230":2}}],["path",{"2":{"145":1,"241":2,"253":1,"255":1}}],["paths",{"2":{"117":2,"253":1}}],["packaged",{"2":{"123":1}}],["package",{"2":{"114":1}}],["password=your",{"2":{"250":2}}],["password>",{"2":{"42":1}}],["password",{"2":{"42":2,"138":1,"249":2,"250":7,"253":2,"255":3}}],["paste",{"2":{"31":1,"37":1,"40":1,"49":1,"61":1,"110":1}}],["past",{"2":{"18":1}}],["pairs",{"2":{"160":1}}],["paired",{"2":{"20":1}}],["paid",{"2":{"19":1}}],["parent",{"2":{"121":1,"145":1}}],["parameters",{"2":{"91":1,"130":1,"201":1,"225":1}}],["parallel",{"2":{"8":1}}],["participate",{"2":{"41":1,"45":1,"57":1}}],["part",{"2":{"19":1,"129":1}}],["parsed",{"2":{"217":1}}],["parse",{"2":{"8":1}}],["pages",{"2":{"94":1}}],["page",{"0":{"88":1},"1":{"89":1},"2":{"8":2,"48":1,"61":1,"87":1,"88":1,"90":1,"93":1,"94":1,"95":1,"96":2,"99":1,"100":1,"105":1,"115":1,"129":1,"130":1,"131":1,"137":1,"138":1,"139":1,"143":1,"153":1,"159":1,"162":1,"168":1,"173":1,"179":1,"191":1,"199":1,"201":1,"203":1,"219":1,"258":1,"263":1,"270":1,"273":1,"275":1,"278":1,"281":1,"283":1,"285":1,"287":1,"288":1}}],["practices",{"2":{"218":1}}],["practice",{"2":{"95":1}}],["pre",{"2":{"247":1}}],["prefix",{"2":{"242":1,"254":1}}],["prefixed",{"0":{"242":1},"2":{"223":1}}],["previous",{"2":{"206":1,"209":1}}],["preview",{"2":{"149":2,"281":1}}],["precise",{"2":{"196":1}}],["precedence",{"2":{"75":1}}],["prerequisites",{"0":{"177":1,"248":1}}],["present",{"2":{"268":1,"269":1}}],["presence",{"2":{"29":1}}],["preserved",{"2":{"209":1}}],["preserves",{"2":{"133":1}}],["preserve",{"2":{"9":1}}],["primarily",{"2":{"192":1}}],["primary",{"2":{"91":1}}],["priority",{"0":{"75":1},"2":{"75":2,"78":1}}],["prioritized",{"2":{"70":1}}],["privileged",{"2":{"29":1}}],["privileges",{"2":{"19":1}}],["private",{"0":{"82":1},"2":{"21":1,"22":2,"33":1,"45":1,"57":1,"69":1,"77":1,"114":1}}],["privately",{"2":{"3":1,"23":1}}],["privacy",{"2":{"18":1,"24":1,"199":2}}],["project",{"2":{"262":1,"284":2}}],["proceed",{"2":{"175":1}}],["process",{"0":{"160":1},"2":{"127":1,"133":2,"140":1,"154":1,"160":1,"165":1,"183":2,"204":1,"242":1,"245":1,"246":1}}],["probe",{"2":{"164":1}}],["problematic",{"2":{"83":1}}],["programmatically",{"2":{"194":1}}],["programming",{"2":{"148":1}}],["progress",{"2":{"19":2,"116":1}}],["providing",{"2":{"135":1,"176":1}}],["provided",{"2":{"109":1,"111":1,"165":1,"180":1}}],["provides",{"2":{"92":1,"95":1,"113":1,"131":1,"141":1,"144":1,"154":1,"158":1,"210":1,"247":2,"262":1,"272":1}}],["provide",{"2":{"60":1,"119":1,"140":1,"156":1,"186":1,"204":2}}],["provider",{"0":{"11":1,"137":1,"138":1,"166":1,"167":1,"168":1,"201":1,"203":1,"234":1,"235":1,"260":1,"263":1,"264":1,"270":1,"272":1,"273":1,"274":1,"275":1,"278":1,"282":1,"283":1,"284":1,"285":1},"1":{"138":1,"167":1,"168":2,"169":2,"170":2,"171":2,"172":1,"173":1,"174":1,"175":1,"261":1,"262":1,"263":1,"264":1,"265":2,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"273":1,"274":1,"275":1,"276":1,"283":1,"284":1,"285":1,"286":1},"2":{"23":1,"90":5,"91":3,"102":1,"133":3,"136":2,"137":1,"138":3,"140":1,"162":1,"166":1,"167":1,"168":2,"169":4,"170":3,"171":4,"172":1,"173":2,"177":5,"178":2,"183":1,"184":2,"186":3,"198":1,"199":1,"201":2,"202":3,"203":2,"204":1,"224":2,"233":2,"247":2,"253":1,"256":3,"257":2,"258":5,"259":4,"260":2,"263":3,"264":1,"265":2,"269":1,"270":4,"271":1,"272":1,"273":3,"274":1,"275":2,"278":2,"282":1,"283":3,"284":1,"285":2,"287":3,"288":2,"289":1,"290":1}}],["providers",{"0":{"135":1,"171":1,"197":1,"202":1,"256":1,"257":1,"265":1,"287":1,"289":1},"1":{"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"257":1,"258":1,"259":1,"288":1,"289":1,"290":1},"2":{"7":1,"8":3,"11":2,"15":1,"39":2,"89":1,"90":1,"134":1,"157":1,"168":1,"169":1,"173":1,"177":1,"186":1,"199":1,"238":2,"257":1,"258":1,"263":1,"273":1,"278":1,"283":1,"287":1,"288":1}}],["prompt",{"2":{"156":1,"196":1,"222":1,"249":1}}],["prompted",{"2":{"66":1}}],["prompts",{"2":{"60":1,"101":1,"152":1,"249":1}}],["profiles",{"2":{"268":1}}],["profile",{"2":{"50":1,"62":1,"87":1,"90":1,"95":1,"101":1,"246":2,"247":5,"250":3,"251":2,"261":2,"268":2,"269":1}}],["product",{"2":{"25":1}}],["protocol",{"0":{"12":1},"2":{"7":1,"12":1,"39":1,"41":1,"157":1,"173":1}}],["hub",{"2":{"104":1,"251":1}}],["human",{"2":{"19":1}}],["humans",{"2":{"3":1,"23":1}}],["html",{"2":{"100":1}}],["https",{"2":{"42":1,"43":1,"97":2,"168":1,"249":6,"250":1,"284":1}}],["http",{"0":{"161":1},"2":{"12":1,"161":2,"252":3,"253":1,"268":2,"269":1,"274":1}}],["h",{"2":{"42":1}}],["highly",{"2":{"199":1}}],["highlighting",{"2":{"148":1}}],["high",{"2":{"91":1,"138":1,"232":1}}],["higher",{"2":{"78":1,"128":1}}],["highest",{"2":{"75":1,"261":1}}],["hierarchy",{"2":{"79":1}}],["hint",{"2":{"49":1}}],["hide",{"2":{"19":1}}],["history",{"0":{"141":1},"2":{"8":2,"20":1,"30":1,"126":1,"155":1,"180":1,"205":1,"206":1,"209":1,"214":1}}],["hour",{"2":{"190":1}}],["hours",{"2":{"6":1,"23":1}}],["how",{"0":{"22":1,"215":1,"222":1,"262":1},"2":{"90":1,"91":1,"106":1,"109":1,"131":1,"153":1,"154":1,"182":1,"216":1,"256":1,"264":1,"281":1}}],["homeserver>",{"2":{"42":1}}],["homeserver",{"2":{"39":1,"41":1,"42":1,"43":2}}],["home",{"0":{"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"19":2,"20":1,"24":1,"25":1,"241":2}}],["hosted",{"2":{"167":1,"199":1,"257":2,"259":2,"272":1}}],["host",{"2":{"16":1,"113":1,"117":1,"138":1,"245":1,"253":3}}],["here",{"2":{"253":1}}],["height",{"2":{"97":2}}],["headers",{"2":{"161":2}}],["headless",{"2":{"94":1}}],["health",{"2":{"89":1}}],["heartbeat",{"0":{"151":1,"196":1,"239":2},"1":{"152":1,"153":1,"154":1,"155":1,"156":1},"2":{"9":1,"10":1,"89":3,"91":5,"151":1,"152":1,"153":5,"154":4,"155":1,"156":3,"196":2,"207":2,"210":1,"215":3,"224":2,"232":5,"233":3,"237":1,"239":3}}],["held",{"2":{"24":1}}],["helps",{"2":{"126":1,"182":1,"213":1,"222":1}}],["help",{"0":{"228":1},"2":{"10":1,"224":1,"226":1,"242":1}}],["hybrid",{"2":{"6":1,"24":1}}],["handles",{"2":{"142":1,"251":1,"282":1}}],["half",{"2":{"19":1}}],["happening",{"2":{"19":1}}],["hardware",{"2":{"18":1,"19":1}}],["have",{"2":{"12":1,"24":1,"90":1,"102":1,"116":1,"158":1,"175":1,"177":1,"183":1,"225":1,"226":1,"287":1}}],["having",{"2":{"1":1,"23":1}}],["has",{"2":{"1":1,"19":1,"66":1,"72":1,"74":1,"77":1,"125":1,"143":1,"177":1,"183":1,"189":1,"193":1,"209":1}}],["blocked",{"0":{"83":1}}],["block",{"2":{"79":1}}],["blocks",{"2":{"51":1,"63":1,"74":1}}],["blogs",{"0":{"26":1},"2":{"26":1}}],["b",{"2":{"42":1}}],["batch",{"2":{"163":1}}],["battery",{"2":{"19":1}}],["bashsudo",{"2":{"250":2,"251":1}}],["bashgit",{"2":{"250":1}}],["bashdocker",{"2":{"247":1,"254":1,"268":1,"269":1}}],["bashbrowser",{"2":{"101":1}}],["bashcurl",{"2":{"42":1,"249":5}}],["basic",{"0":{"258":1,"288":1},"2":{"34":1,"87":1,"220":1}}],["base64",{"2":{"250":1}}],["based",{"0":{"75":1,"188":1},"2":{"89":2,"108":1,"142":1,"162":1,"169":1,"178":1,"246":1,"257":2,"261":1,"267":1}}],["base",{"2":{"19":1,"20":2,"43":1,"117":1,"167":1,"168":1,"201":1,"253":1,"268":2,"269":1,"274":1,"284":2}}],["backup",{"2":{"122":1,"163":1}}],["background",{"2":{"117":1}}],["backend",{"2":{"90":1,"91":1,"134":1,"177":1,"184":1,"186":1,"256":1,"260":1,"272":1,"276":1,"286":1}}],["back",{"2":{"19":1,"63":1,"133":1,"146":1,"162":1}}],["box",{"2":{"247":1}}],["bocha",{"2":{"199":1}}],["bound",{"2":{"188":1}}],["boundaries",{"2":{"22":1,"24":1}}],["boundary",{"2":{"18":1}}],["bold",{"2":{"51":1,"63":1}}],["botname",{"2":{"242":2}}],["bottom",{"2":{"75":2,"90":1,"93":1,"168":1}}],["botfather",{"2":{"40":1,"60":2}}],["both",{"2":{"24":1,"101":1,"196":1,"268":1}}],["bot",{"0":{"3":1,"29":1,"30":1,"35":1,"42":1,"44":1,"48":1,"54":1,"60":1,"70":1,"81":1,"82":1,"83":1,"86":1,"87":1,"88":1,"90":1,"93":1,"99":1,"100":1,"103":1,"113":1,"136":1,"139":1,"142":1,"143":1,"150":1,"151":1,"156":1,"158":1,"165":1,"176":1,"186":1,"193":1,"203":1,"204":1,"216":1,"232":1,"233":1,"240":1,"270":1,"275":1,"280":1,"285":1},"1":{"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"87":1,"88":1,"89":2,"90":1,"91":1,"92":1,"93":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"140":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"152":1,"153":1,"154":1,"155":1,"156":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1},"2":{"1":1,"3":1,"5":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"14":1,"15":1,"23":3,"24":1,"27":1,"28":2,"30":2,"31":2,"35":2,"37":2,"38":1,"39":2,"40":3,"41":2,"42":1,"43":3,"44":2,"47":2,"48":2,"49":1,"50":2,"52":2,"53":1,"54":3,"55":4,"56":2,"58":1,"59":1,"60":7,"61":1,"62":3,"63":4,"64":1,"65":1,"67":1,"70":2,"72":4,"74":2,"75":1,"76":1,"77":1,"82":2,"83":1,"84":1,"85":1,"86":1,"87":2,"88":1,"89":4,"90":5,"91":3,"92":1,"93":4,"94":4,"99":2,"100":2,"102":2,"103":1,"104":1,"105":2,"109":1,"111":1,"113":2,"114":2,"115":2,"116":1,"117":1,"118":2,"126":1,"127":2,"129":2,"130":2,"131":1,"133":2,"135":1,"136":2,"139":2,"140":5,"141":1,"142":2,"143":2,"145":1,"146":2,"147":1,"148":1,"150":2,"151":1,"152":1,"153":1,"154":2,"156":3,"157":1,"158":1,"159":1,"160":1,"164":1,"165":1,"175":1,"177":3,"178":1,"179":2,"180":1,"184":1,"185":1,"186":3,"187":1,"188":2,"191":2,"193":3,"194":1,"197":1,"198":1,"203":1,"204":2,"205":2,"206":4,"207":6,"209":3,"212":1,"215":2,"216":2,"217":1,"219":2,"221":1,"222":2,"224":3,"226":2,"241":1,"242":1,"243":1,"246":1,"256":2,"258":2,"259":1,"270":2,"271":3,"275":1,"276":2,"280":2,"281":1,"282":1,"285":1,"286":2,"287":3,"288":2}}],["bots",{"0":{"222":1},"2":{"1":1,"3":4,"4":1,"5":1,"8":2,"10":1,"15":1,"23":6,"30":1,"33":1,"39":3,"45":1,"48":1,"86":1,"87":1,"95":2,"99":1,"106":1,"113":1,"158":1,"176":1,"194":1,"203":1,"223":1,"243":1,"244":1,"270":1,"272":1,"275":1,"285":1,"287":1}}],["business",{"2":{"39":1}}],["buttons",{"2":{"95":1}}],["button",{"2":{"87":1,"121":1,"162":1,"163":1,"164":1,"168":1,"171":1,"202":1,"210":1,"281":1,"288":1}}],["but",{"2":{"18":2,"19":1,"21":1,"79":2,"209":1}}],["builtin",{"2":{"263":1}}],["built",{"0":{"260":1,"263":1,"264":1},"1":{"261":1,"262":1,"263":1,"264":1,"265":2,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1},"2":{"7":1,"8":1,"12":1,"24":1,"25":1,"39":1,"90":1,"91":1,"100":1,"102":1,"148":1,"177":1,"247":2,"257":1,"259":1,"260":2,"281":1,"288":1}}],["buildkit",{"2":{"245":1}}],["building",{"2":{"19":1}}],["buildable",{"2":{"18":1}}],["build",{"2":{"3":1,"19":1,"24":1,"101":3,"247":1,"249":1}}],["best",{"2":{"218":1}}],["below",{"2":{"246":1}}],["belongs",{"2":{"172":1}}],["belief",{"2":{"24":1}}],["behave",{"2":{"216":1}}],["behaviors",{"2":{"222":1}}],["behavior",{"2":{"91":3,"94":1,"97":1,"253":1}}],["behind",{"2":{"19":1}}],["before",{"2":{"66":1,"77":1,"177":1,"184":1,"223":1,"250":1,"281":1}}],["begin",{"2":{"56":1}}],["better",{"2":{"128":1,"247":1,"262":1}}],["bet",{"2":{"25":1}}],["between",{"2":{"11":1,"19":1,"109":1,"145":1,"161":1,"172":1,"205":1,"209":1,"210":1}}],["become",{"2":{"125":1,"128":1,"182":1,"183":1,"209":1}}],["becomes",{"2":{"19":1,"21":1,"133":1,"198":1,"256":1}}],["because",{"2":{"19":1}}],["being",{"2":{"19":1,"247":1}}],["be",{"2":{"10":1,"23":1,"24":1,"78":1,"92":1,"93":1,"129":1,"140":1,"153":1,"195":1,"204":1,"223":1,"249":1,"268":1,"269":1,"272":1}}],["broken",{"2":{"237":1}}],["browsing",{"0":{"145":1},"2":{"91":1,"144":1}}],["browse",{"0":{"241":1},"2":{"89":1,"197":1,"224":1}}],["browser",{"0":{"94":1,"95":1,"96":1,"97":1,"99":1,"101":1,"236":2},"1":{"95":1,"96":1,"97":1,"98":2,"99":1,"100":1,"101":1,"102":1},"2":{"8":2,"15":1,"30":1,"90":5,"91":2,"94":6,"95":4,"96":4,"97":5,"99":3,"100":4,"101":6,"224":2,"236":2,"246":3,"247":1,"249":2,"250":3,"251":1,"252":1,"253":2,"255":5}}],["breadcrumb",{"2":{"145":1}}],["breaks",{"2":{"18":1}}],["bridges",{"2":{"104":1}}],["brief",{"2":{"21":1,"189":1}}],["brave",{"2":{"8":1,"198":1,"199":1,"201":1}}],["brain",{"2":{"1":1}}],["bind",{"0":{"50":1,"62":1},"2":{"50":1,"62":2,"256":1}}],["bindings",{"0":{"135":1,"139":1},"1":{"136":1,"137":1,"138":1,"139":1,"140":2,"141":1,"142":1},"2":{"89":1,"238":2}}],["binding",{"0":{"140":1},"2":{"4":1,"50":1,"62":1,"136":1,"140":1}}],["bing",{"2":{"8":1,"198":1,"199":1}}],["bm25",{"2":{"6":1,"247":1}}],["bypasses",{"2":{"75":1}}],["by",{"2":{"5":1,"6":1,"23":2,"24":1,"36":1,"39":1,"42":1,"72":1,"81":1,"95":1,"101":1,"106":1,"109":1,"128":1,"141":1,"145":1,"155":1,"163":1,"164":1,"165":3,"170":1,"173":1,"181":1,"186":1,"190":1,"207":1,"210":3,"213":1,"215":1,"237":4,"244":1,"250":1}}],["f",{"2":{"251":2,"254":1}}],["fssl",{"2":{"249":6}}],["fs",{"0":{"241":1},"2":{"224":1,"241":5}}],["flask",{"2":{"247":1}}],["flexible",{"2":{"196":1}}],["flexibly",{"2":{"11":1}}],["flow",{"0":{"40":1,"107":1,"195":1,"200":1,"258":1,"288":1},"1":{"108":1,"109":1,"110":1,"111":1,"201":1,"202":1},"2":{"111":1,"162":1,"169":1}}],["furthermore",{"2":{"25":1}}],["fully",{"2":{"21":2,"157":1,"257":1}}],["full",{"2":{"7":4,"10":1,"12":1,"32":1,"45":1,"51":1,"57":1,"69":1,"162":1}}],["fixed",{"2":{"196":1}}],["fixes",{"2":{"19":1}}],["five",{"2":{"190":1}}],["fired",{"2":{"189":1}}],["fires",{"2":{"188":1,"195":1,"207":1}}],["firefox",{"2":{"97":1,"101":3,"255":1}}],["first",{"2":{"19":1,"20":1,"24":2,"75":2,"78":1,"90":1,"166":1,"190":1,"252":1}}],["finds",{"2":{"178":1}}],["find",{"2":{"99":1,"120":1,"155":1,"163":1,"203":1,"270":1,"275":1,"280":1,"285":1}}],["fine",{"2":{"79":1}}],["finished",{"2":{"19":1}}],["fields",{"0":{"109":1,"189":1},"2":{"43":1,"55":1,"79":1,"90":1,"108":1,"138":1,"168":1,"173":1,"190":1,"263":1,"273":1,"283":1}}],["field",{"2":{"37":1,"43":1,"55":1,"61":1,"68":1,"91":1,"96":1,"97":1,"109":1,"129":1,"153":1,"160":1,"161":1,"173":1,"177":1,"189":1,"190":1,"264":1,"274":1,"279":1,"284":1}}],["filter",{"2":{"155":1,"181":1,"210":1}}],["file`",{"2":{"218":1}}],["fileviewer",{"2":{"147":1}}],["filemanager",{"2":{"144":1}}],["file",{"2":{"89":1,"116":1,"124":1,"144":1,"145":1,"146":2,"148":2,"149":2,"163":2,"173":1,"178":1,"195":1,"241":1,"250":1,"253":1,"255":1,"257":1,"261":1,"267":1}}],["filesystem",{"0":{"241":1},"2":{"5":1,"15":1,"89":1,"113":1,"123":1,"124":1,"125":1,"143":2,"148":1,"152":1,"160":1,"224":1}}],["files",{"0":{"143":1,"146":1,"148":1,"150":1},"1":{"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1},"2":{"1":1,"5":1,"8":2,"22":1,"23":1,"24":1,"30":1,"32":1,"45":1,"51":1,"63":2,"89":2,"93":1,"114":1,"143":1,"145":1,"146":2,"147":1,"150":2,"217":1,"243":1}}],["fill",{"2":{"37":1,"38":1,"43":1,"55":1,"87":1,"94":1,"96":1,"100":1,"108":1,"138":1,"163":1,"168":1,"201":1,"220":1,"263":1,"273":1,"283":1}}],["filling",{"2":{"8":1,"95":1}}],["focus",{"2":{"205":1}}],["focused",{"2":{"39":1,"133":1,"199":1}}],["folders",{"2":{"146":1}}],["folder",{"2":{"145":1,"146":1}}],["follow",{"2":{"60":1,"169":1,"218":1,"225":1}}],["following",{"2":{"36":1,"39":1,"96":1,"168":1,"173":1,"201":1,"257":1,"263":1,"268":1,"273":1,"283":1}}],["four",{"2":{"9":1,"11":1,"207":1}}],["force",{"2":{"48":1}}],["forcing",{"2":{"19":1}}],["forward",{"2":{"24":1}}],["format",{"0":{"225":1},"2":{"253":1,"279":2,"281":1,"287":1,"288":1}}],["formats",{"2":{"148":1}}],["formatting",{"2":{"49":1,"51":1,"59":1}}],["formatted",{"2":{"45":1}}],["forms",{"2":{"94":1,"95":1}}],["form",{"2":{"8":1,"18":1,"19":1,"79":1,"90":1,"169":1,"171":2,"202":2}}],["for",{"0":{"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"3":1,"5":1,"7":1,"8":2,"9":1,"10":1,"11":1,"12":1,"15":1,"19":2,"21":1,"22":1,"23":1,"25":1,"32":1,"36":2,"38":1,"39":6,"40":1,"42":1,"45":2,"51":2,"57":1,"60":2,"63":1,"69":2,"73":3,"75":1,"79":1,"82":1,"83":1,"85":1,"87":1,"89":2,"90":3,"91":5,"93":1,"95":2,"96":1,"100":1,"101":2,"104":1,"106":2,"111":1,"117":2,"118":1,"119":1,"122":1,"135":1,"138":2,"142":1,"146":1,"151":1,"152":1,"158":1,"160":2,"161":1,"162":1,"163":1,"168":2,"172":2,"173":3,"182":2,"184":1,"185":1,"187":1,"189":3,"191":1,"196":2,"197":1,"199":2,"201":2,"212":1,"215":1,"225":1,"229":1,"237":1,"244":1,"246":3,"247":3,"249":3,"251":1,"255":1,"256":1,"263":1,"264":1,"271":1,"272":1,"273":1,"274":1,"276":1,"277":1,"283":1,"284":3,"286":1}}],["friendly",{"2":{"173":1,"201":1}}],["free",{"2":{"277":1,"289":1}}],["freely",{"2":{"5":1,"23":1}}],["fresh",{"2":{"66":1,"125":1,"206":1,"208":1,"210":1}}],["frontend",{"2":{"253":1}}],["frontmatter",{"2":{"217":1,"221":1,"222":1}}],["frontier",{"2":{"22":1,"25":1}}],["from",{"2":{"6":1,"8":1,"19":1,"40":1,"42":1,"63":1,"66":1,"70":1,"74":1,"75":1,"77":1,"84":1,"87":1,"91":1,"96":1,"97":1,"105":1,"108":1,"115":1,"124":1,"129":2,"130":1,"133":1,"136":1,"137":1,"138":1,"139":1,"143":1,"146":2,"153":2,"159":1,"163":1,"164":1,"168":1,"169":1,"170":2,"171":1,"173":1,"177":1,"179":1,"180":2,"183":2,"199":1,"201":1,"202":1,"205":1,"209":1,"215":1,"219":1,"221":1,"247":1,"249":2,"258":2,"260":1,"262":1,"264":1,"271":2,"274":1,"284":1,"287":2,"288":1}}],["fail",{"2":{"250":1}}],["failed",{"2":{"131":1,"154":1}}],["false",{"2":{"232":2,"255":1}}],["favorite",{"2":{"39":1,"103":1}}],["faster",{"2":{"24":1,"133":1}}],["fast",{"2":{"19":1,"247":1}}],["factor",{"2":{"18":1,"97":1}}],["facts",{"2":{"6":1}}],["familiar",{"2":{"18":1,"144":1}}],["family",{"2":{"3":1}}],["fewer",{"2":{"128":1}}],["featuring",{"2":{"59":1}}],["feature",{"2":{"39":1,"151":1,"182":1,"183":1,"196":1}}],["features",{"0":{"2":1,"23":1,"32":1,"45":1,"51":1,"57":1,"63":1,"69":1,"215":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"45":1,"196":1,"244":1}}],["feb",{"2":{"26":1}}],["feedback",{"2":{"51":1,"69":1,"116":1}}],["feed",{"2":{"21":1}}],["feels",{"2":{"25":1}}],["feeling",{"2":{"19":1}}],["feel",{"2":{"18":1,"19":2}}],["federated",{"2":{"8":1}}],["federation",{"2":{"8":1}}],["fetch",{"2":{"8":1,"40":1,"66":1,"170":1,"247":1,"249":1}}],["feishu",{"0":{"33":1,"34":1,"110":1,"209":1},"1":{"34":1,"35":1,"36":1,"37":1,"38":1},"2":{"1":1,"7":1,"23":1,"33":1,"34":1,"35":1,"37":3,"38":1,"39":1,"89":1,"106":1,"110":3,"223":1,"243":1,"244":1}}],["icon",{"2":{"174":2,"212":1,"221":2}}],["ignore",{"2":{"97":1}}],["irreversible",{"2":{"93":1}}],["idf",{"2":{"247":1}}],["identities",{"2":{"70":1,"83":1}}],["identity",{"0":{"4":1,"50":1,"62":1},"2":{"4":1,"8":1,"50":2,"62":3,"73":2,"77":2,"82":1,"85":1,"241":1}}],["identifier",{"2":{"42":1,"55":1,"117":1,"146":1,"173":1}}],["ids",{"2":{"40":1}}],["id",{"2":{"34":1,"37":1,"42":2,"43":2,"44":1,"54":1,"55":1,"77":4,"79":4,"97":1,"117":1,"163":1,"173":2,"181":1,"194":1,"232":2,"279":1,"284":4}}],["image",{"2":{"101":1,"116":2,"117":2,"149":1,"173":1,"247":1,"249":3,"253":1,"255":4}}],["images",{"0":{"149":1},"2":{"32":1,"51":1,"63":1,"69":1,"252":1,"254":1}}],["immediately",{"2":{"112":1}}],["immediate",{"2":{"39":1}}],["im",{"2":{"36":2,"37":1}}],["impact",{"2":{"25":1}}],["imported",{"2":{"278":1,"288":1}}],["importance",{"2":{"247":1,"262":1}}],["important",{"2":{"42":1,"48":1,"90":1,"133":1,"250":1}}],["importing",{"2":{"122":1}}],["import",{"0":{"122":1,"124":1,"170":1},"1":{"123":1,"124":1,"125":1},"2":{"5":1,"11":1,"89":1,"124":1,"163":2,"170":4}}],["if",{"2":{"19":1,"25":1,"32":1,"36":1,"44":1,"55":1,"66":1,"75":1,"90":1,"91":1,"102":1,"110":1,"111":1,"116":1,"140":3,"169":1,"173":1,"195":1,"247":1,"250":1,"254":1,"270":1}}],["i",{"2":{"19":7}}],["i18n",{"2":{"15":1}}],["injected",{"2":{"222":1}}],["initiated",{"2":{"207":1}}],["initialize",{"2":{"116":1,"252":1}}],["inquiries",{"2":{"142":1}}],["inbox",{"2":{"140":1}}],["inbound",{"2":{"7":1,"37":1,"110":1}}],["invocation",{"2":{"215":1}}],["involves",{"2":{"136":1}}],["invoked",{"2":{"99":1}}],["invalid",{"2":{"97":1}}],["invited",{"2":{"43":1}}],["invites",{"2":{"43":1,"44":1}}],["invite",{"0":{"30":1,"44":1},"2":{"44":1}}],["incremented",{"2":{"195":1}}],["inconsistent",{"2":{"183":1}}],["incoming",{"2":{"72":1,"73":1,"140":1,"142":1}}],["included",{"2":{"257":1}}],["include",{"2":{"95":1,"101":1,"165":1,"255":1}}],["includes",{"2":{"16":1,"126":1,"178":1,"245":1}}],["including",{"2":{"11":1,"93":1,"191":1}}],["input",{"2":{"49":1,"160":1,"173":1}}],["info",{"2":{"34":1,"87":1,"253":1}}],["information",{"0":{"117":1},"2":{"8":1,"19":1,"36":1,"100":1,"126":1,"127":1,"128":1,"176":1,"182":1,"185":1,"197":1,"204":1}}],["inference",{"2":{"22":1,"24":1,"25":1}}],["infrastructure",{"0":{"266":1},"1":{"267":1,"268":1,"269":1},"2":{"19":1,"21":1,"24":1,"25":1,"260":1,"267":1,"282":1}}],["inflate",{"2":{"19":1}}],["into",{"2":{"18":1,"19":1,"37":1,"61":1,"110":1,"123":1,"124":1,"146":1,"180":1,"193":1,"206":1,"217":1,"222":1,"247":1,"262":1,"287":1}}],["introduction",{"0":{"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"26":1}}],["integer",{"2":{"232":1}}],["integrated",{"2":{"144":1,"147":1}}],["integrating",{"2":{"33":1}}],["integration",{"2":{"7":1,"32":1,"39":4}}],["intent",{"2":{"29":3}}],["intents",{"2":{"29":1}}],["intelligence",{"2":{"19":1}}],["intercepted",{"2":{"223":1}}],["internal",{"2":{"173":1}}],["internet",{"2":{"19":1}}],["intervention",{"2":{"187":1}}],["intervene",{"2":{"150":1}}],["interval",{"2":{"91":1,"152":1,"153":1,"196":1,"232":2}}],["interactions",{"2":{"176":1}}],["interaction",{"0":{"100":1,"142":1,"150":1,"156":1,"165":1,"186":1,"204":1}}],["interactive",{"2":{"89":1,"92":1}}],["interact",{"2":{"27":1,"33":1,"39":1,"47":1,"53":1,"64":1,"70":1,"100":1,"103":1,"147":1}}],["interference",{"2":{"205":1}}],["interfering",{"2":{"5":1}}],["interface",{"2":{"7":1,"23":1,"39":1,"155":1}}],["inspect",{"2":{"94":1,"100":1}}],["inspection",{"2":{"8":1}}],["instruction",{"2":{"189":1,"196":1}}],["instantly",{"2":{"223":1}}],["instances",{"2":{"287":1}}],["instance",{"2":{"116":1,"117":1,"172":1,"258":1}}],["install",{"0":{"249":1,"250":1},"1":{"251":1},"2":{"101":1,"114":1,"245":1,"249":3,"251":1,"255":1}}],["installation",{"0":{"16":1,"245":1},"1":{"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1},"2":{"244":2}}],["instead",{"2":{"100":1,"169":1,"282":1}}],["instinct",{"2":{"19":1}}],["inside",{"2":{"8":1,"92":1,"143":1,"160":1,"245":1,"247":1}}],["indices",{"2":{"247":1,"262":1}}],["indicator",{"2":{"184":1}}],["indicators",{"2":{"49":1,"51":1,"68":1,"69":1}}],["individual",{"2":{"4":1,"45":1,"57":1,"69":1,"73":1,"134":1}}],["indexed",{"2":{"264":1}}],["indexes",{"2":{"183":1}}],["indexing",{"2":{"22":1,"24":1,"178":1,"267":1,"282":1}}],["index",{"2":{"22":1,"183":1,"185":2,"261":1}}],["independently",{"2":{"206":1}}],["independent",{"2":{"1":1,"8":1,"9":1,"12":1,"86":1,"158":1,"205":1,"207":1,"215":1}}],["in",{"0":{"65":1,"209":1,"210":1,"260":1,"263":1,"264":1},"1":{"261":1,"262":1,"263":1,"264":1,"265":2,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1},"2":{"3":1,"4":1,"5":1,"7":1,"8":2,"9":2,"10":1,"12":1,"14":1,"19":1,"21":1,"23":3,"24":1,"25":1,"28":1,"30":1,"31":1,"33":1,"34":2,"35":1,"37":3,"38":2,"39":1,"40":1,"41":1,"43":3,"45":1,"48":1,"49":1,"50":2,"54":1,"55":2,"56":2,"57":2,"59":1,"60":1,"61":1,"62":1,"65":1,"67":1,"72":1,"75":1,"79":2,"81":1,"87":2,"90":1,"91":2,"93":1,"95":1,"96":2,"97":3,"100":1,"102":1,"105":1,"108":1,"110":1,"113":1,"115":1,"117":1,"119":1,"120":1,"129":1,"130":1,"131":1,"137":1,"138":1,"139":1,"142":2,"143":1,"148":2,"149":1,"150":1,"153":2,"159":1,"163":1,"165":1,"168":1,"169":2,"171":1,"173":1,"174":1,"177":2,"178":1,"179":1,"180":1,"181":1,"183":2,"186":1,"190":1,"192":1,"193":1,"199":1,"201":1,"202":2,"207":1,"212":1,"215":1,"219":1,"220":2,"223":1,"226":1,"241":1,"242":1,"243":1,"245":1,"246":1,"247":3,"250":1,"251":2,"252":1,"254":1,"255":2,"256":1,"257":1,"258":1,"259":1,"260":3,"262":1,"263":1,"264":1,"268":1,"269":2,"270":1,"273":1,"281":1,"283":1,"287":2,"288":1}}],["italic",{"2":{"51":1,"63":1}}],["iterate",{"2":{"24":1}}],["itself",{"2":{"150":1,"186":1,"193":1}}],["its",{"2":{"1":2,"5":1,"12":1,"23":1,"76":1,"86":1,"88":2,"90":1,"91":2,"93":1,"97":1,"98":1,"109":1,"113":1,"140":1,"142":1,"143":2,"146":1,"150":2,"152":1,"156":2,"158":1,"164":1,"165":1,"171":1,"186":1,"188":1,"195":1,"202":1,"204":1,"205":1,"206":1,"214":1,"215":1,"221":1,"243":1,"256":1,"257":1,"264":1,"265":1,"270":1,"274":1,"276":1,"279":1,"282":1,"284":1,"286":1}}],["it",{"2":{"1":1,"19":9,"24":2,"25":1,"27":1,"28":2,"30":2,"41":1,"47":1,"48":2,"50":1,"53":1,"64":1,"66":1,"97":1,"103":1,"104":1,"110":1,"114":1,"116":1,"117":1,"118":1,"121":1,"142":2,"148":1,"151":2,"156":1,"167":1,"174":1,"188":2,"189":1,"190":2,"197":1,"198":1,"213":1,"216":1,"247":4,"250":1,"260":1,"262":1,"264":1,"272":1,"274":1,"277":1,"284":1}}],["issues",{"2":{"184":1}}],["issue",{"2":{"131":1,"154":1,"184":1}}],["isolated",{"0":{"114":1},"2":{"5":1,"22":1,"23":1,"24":1,"86":1,"113":1,"143":1,"243":1}}],["isolation",{"0":{"5":1,"206":1},"2":{"113":1}}],["is",{"0":{"1":1},"2":{"1":1,"18":1,"19":3,"20":1,"22":2,"23":2,"25":2,"38":1,"44":1,"48":1,"56":1,"59":1,"62":1,"64":1,"66":1,"67":1,"75":2,"79":1,"81":1,"86":1,"90":1,"93":1,"94":1,"95":1,"97":1,"100":1,"111":1,"116":1,"118":1,"119":1,"123":1,"125":1,"127":1,"133":1,"150":1,"152":2,"153":1,"162":1,"164":1,"165":1,"171":1,"172":1,"182":1,"183":1,"184":3,"185":1,"187":1,"188":1,"189":1,"190":1,"195":3,"198":1,"205":1,"207":1,"209":2,"215":1,"217":1,"241":1,"243":1,"244":1,"245":1,"247":1,"250":2,"253":1,"254":1,"259":1,"260":1,"270":1,"271":1,"272":1,"277":1,"278":2,"282":1,"287":1,"288":1}}],["especially",{"2":{"209":1}}],["error",{"2":{"154":1,"184":1}}],["errors",{"2":{"97":1,"155":1}}],["efficient",{"2":{"247":1}}],["effort",{"2":{"91":2,"232":1}}],["effects",{"0":{"74":1}}],["effect",{"0":{"72":1},"2":{"72":2,"74":1,"75":1,"77":1,"81":1,"82":1,"83":1,"84":1,"91":1,"232":1}}],["etc",{"0":{"209":1},"2":{"44":1,"131":1,"223":1,"247":1}}],["elements",{"2":{"94":1}}],["element",{"2":{"42":1,"44":1,"46":1}}],["else",{"2":{"19":1,"21":1}}],["e",{"2":{"40":1,"42":2,"43":2,"60":3,"73":2,"130":1,"138":1,"145":1,"148":1,"149":1,"160":2,"161":1,"168":2,"173":3,"183":1,"189":3,"195":1,"201":2,"225":2,"232":1,"249":1,"255":1,"274":1,"287":2,"288":1}}],["edge",{"0":{"277":1,"278":1},"1":{"278":1,"279":1,"280":1,"281":1},"2":{"24":1,"277":2,"278":2,"279":1,"280":2,"287":2,"288":1,"289":2,"290":1}}],["editor",{"2":{"144":1,"148":1,"220":1}}],["editing",{"0":{"147":1,"221":1},"1":{"148":1,"149":1},"2":{"116":1,"260":1}}],["edit",{"2":{"1":1,"8":1,"23":1,"89":1,"98":1,"148":1,"171":1,"174":2,"181":1,"202":1,"221":1,"243":1,"250":1,"265":1,"271":1}}],["easily",{"2":{"222":1}}],["easy",{"2":{"23":1}}],["each",{"2":{"3":1,"4":1,"5":2,"6":1,"9":1,"12":1,"23":3,"24":1,"40":1,"48":1,"72":1,"74":1,"79":1,"82":1,"106":1,"128":1,"158":1,"170":1,"186":1,"196":1,"205":1,"206":1,"212":1,"215":2,"243":1,"260":1}}],["evaluate",{"2":{"129":1,"133":1}}],["evaluated",{"2":{"75":1,"78":1,"190":1}}],["evaluation",{"0":{"75":1}}],["even",{"2":{"151":1}}],["event",{"2":{"37":1,"110":1}}],["events",{"0":{"37":1},"2":{"37":1,"161":1}}],["eventually",{"2":{"19":1}}],["everyone",{"2":{"77":1,"81":1,"83":1}}],["everything",{"2":{"22":1,"25":1,"245":1}}],["every",{"2":{"1":1,"18":1,"19":1,"21":1,"23":1,"73":1,"113":1,"143":1,"154":1,"190":5,"193":1,"194":1}}],["evolves",{"2":{"19":1}}],["economics",{"2":{"19":1}}],["emmamultilingualneural",{"2":{"279":1}}],["embedded",{"2":{"245":1,"246":1}}],["embeddings",{"2":{"178":1,"261":1}}],["embedding",{"2":{"11":1,"91":1,"172":2,"173":2,"186":1,"247":4,"257":1,"261":2,"262":1,"264":2,"269":1}}],["embed",{"2":{"30":1,"173":1}}],["empty",{"2":{"19":1,"55":1,"189":1,"284":1}}],["emails",{"2":{"8":1,"135":1,"140":2,"141":1,"142":1,"193":1,"194":2}}],["email",{"0":{"135":1,"136":1,"137":1,"139":1,"238":2},"1":{"136":1,"137":1,"138":2,"139":1,"140":2,"141":1,"142":1},"2":{"1":1,"7":1,"8":2,"39":2,"89":2,"136":5,"137":2,"138":3,"139":2,"140":3,"141":5,"142":3,"224":2,"238":3,"243":1,"253":1}}],["encodes",{"2":{"247":1}}],["encoding",{"2":{"246":1,"247":3,"253":1,"262":1,"268":1}}],["encountered",{"2":{"131":1,"154":1}}],["env",{"2":{"160":1,"250":1}}],["environment",{"0":{"255":1},"2":{"24":1,"91":1,"94":1,"113":1,"115":1,"118":1,"126":1,"160":1,"249":2}}],["ensure",{"2":{"119":1}}],["ensures",{"2":{"113":1}}],["enabling",{"2":{"104":1,"111":1,"151":1,"197":1}}],["enables",{"2":{"50":1,"62":1,"97":1,"218":1}}],["enabled",{"2":{"43":1,"44":1,"49":2,"56":1,"67":1,"69":1,"91":3,"129":2,"140":3,"153":1,"189":1,"191":1,"194":1,"232":3,"246":1}}],["enable",{"0":{"35":1},"2":{"8":1,"29":1,"31":1,"35":1,"36":1,"40":1,"43":1,"49":3,"55":1,"61":1,"68":1,"91":1,"109":1,"112":2,"163":1,"173":1,"230":2,"247":3,"268":1}}],["en",{"2":{"97":1,"232":2,"279":1}}],["engines",{"0":{"199":1},"2":{"197":1,"199":2,"255":1}}],["engine",{"2":{"90":1,"91":1,"97":1,"201":2}}],["engineered",{"2":{"6":1}}],["engineering",{"0":{"6":1},"2":{"23":1}}],["entries",{"2":{"127":1,"128":3,"133":1,"155":1,"181":1,"185":1,"259":1}}],["entry",{"2":{"66":1,"212":1}}],["entire",{"2":{"70":1,"73":1,"77":1,"79":1,"88":1,"222":1}}],["enter",{"2":{"18":1,"34":1,"180":1}}],["enterprise",{"2":{"7":1,"33":1,"39":2}}],["ending",{"2":{"60":1}}],["endpoint",{"2":{"55":1,"161":1,"274":1}}],["enough",{"2":{"19":1}}],["exa",{"2":{"199":1}}],["exact",{"2":{"173":1}}],["examples",{"0":{"80":1},"1":{"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"190":1,"230":1,"241":1}}],["example",{"0":{"218":1},"2":{"79":1,"182":1,"225":1,"232":1,"233":1}}],["exchanged",{"2":{"162":1}}],["except",{"2":{"83":1}}],["existing",{"2":{"121":1,"133":1,"181":1,"210":1}}],["exist",{"2":{"116":1}}],["expiration",{"2":{"253":1}}],["expires",{"2":{"66":1}}],["explanation",{"2":{"189":1}}],["explicitly",{"2":{"72":2}}],["explicit",{"2":{"22":1,"24":1}}],["exposed",{"2":{"164":1,"165":1}}],["exporting",{"2":{"122":1}}],["export",{"0":{"122":1,"123":1},"1":{"123":1,"124":1,"125":1},"2":{"5":1,"8":1,"89":1,"100":1,"123":1,"163":2}}],["expression",{"2":{"189":1,"193":1,"196":1}}],["expressions",{"2":{"13":1,"23":1,"187":1}}],["express",{"2":{"128":1}}],["expensive",{"2":{"21":1}}],["experienced",{"2":{"24":1}}],["experience",{"2":{"18":1,"144":1}}],["executable",{"2":{"160":1}}],["executing",{"2":{"116":1}}],["executions",{"2":{"189":1}}],["execution",{"0":{"195":1},"2":{"9":1,"13":1,"22":1,"89":2,"154":1,"191":1,"196":1,"207":1,"239":1}}],["executes",{"2":{"160":1,"188":1,"195":1}}],["execute",{"2":{"1":1,"5":1,"8":1,"23":1,"92":1,"113":1,"114":1,"152":1,"153":1,"223":1,"226":1}}],["extending",{"0":{"158":1}}],["external",{"0":{"209":1},"2":{"8":1,"12":1,"40":1,"73":1,"157":1,"158":1,"178":1,"187":1,"197":1,"247":1,"262":1}}],["extraction",{"2":{"256":1,"260":1,"276":1,"286":1}}],["extracted",{"2":{"124":1,"215":1}}],["extract",{"2":{"42":1,"180":1,"271":1}}],["extracts",{"2":{"6":1}}],["extra",{"2":{"16":1}}],["ok",{"2":{"154":1}}],["okay",{"2":{"19":1}}],["old",{"2":{"132":1,"155":1,"209":1}}],["older",{"2":{"130":1,"155":1,"182":1}}],["observe",{"2":{"100":1}}],["obtain",{"2":{"40":1,"42":1}}],["o1",{"2":{"91":1,"173":1}}],["oem",{"2":{"19":1}}],["os",{"2":{"19":1}}],["occasional",{"2":{"19":1}}],["output",{"2":{"160":1,"226":1,"279":1}}],["outgoing",{"2":{"140":1,"142":1}}],["outdated",{"2":{"127":1,"128":1}}],["outbox",{"0":{"141":1},"2":{"89":1,"141":1,"142":1,"238":2}}],["outbound",{"2":{"7":1}}],["outcome",{"2":{"75":1}}],["outside",{"2":{"39":1}}],["out",{"2":{"19":1,"247":1}}],["our",{"2":{"18":1,"19":1}}],["only",{"2":{"48":1,"72":1,"77":1,"79":2,"82":1,"84":1,"85":1,"100":1,"182":1,"207":2,"226":4,"247":1,"250":1,"261":1,"262":1,"264":1,"267":1}}],["online",{"2":{"25":1}}],["once",{"2":{"38":1,"48":1,"56":1,"66":1,"88":1,"94":1,"163":1,"164":1,"165":1,"169":1,"198":1,"271":1,"276":1,"286":1}}],["on",{"0":{"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"16":1,"18":2,"19":1,"21":1,"22":1,"25":2,"40":2,"41":1,"42":1,"48":1,"60":1,"62":1,"66":2,"73":1,"88":1,"100":1,"104":1,"106":1,"108":1,"129":1,"142":1,"146":1,"153":1,"162":1,"164":1,"171":1,"173":1,"178":1,"182":1,"189":1,"201":1,"202":1,"205":1,"210":1,"213":1,"215":1,"245":1,"247":2,"250":1,"254":1,"281":1}}],["one",{"0":{"249":1},"2":{"16":1,"25":1,"59":1,"66":1,"95":1,"166":2,"170":2,"177":1,"206":1,"215":1,"256":1,"258":1,"260":1}}],["opus",{"2":{"279":1}}],["opt",{"2":{"160":1}}],["optimize",{"2":{"182":1}}],["optimized",{"2":{"133":1}}],["optimizes",{"2":{"127":1}}],["optimizing",{"2":{"14":1}}],["options",{"2":{"232":2,"279":2}}],["optionally",{"2":{"77":1,"91":1,"130":1,"182":1}}],["optional",{"0":{"50":1,"62":1,"68":1},"2":{"49":1,"79":1,"97":4,"189":1,"196":1,"246":1,"253":1}}],["option",{"2":{"42":2,"232":1}}],["operational",{"2":{"184":1}}],["operation",{"2":{"125":1}}],["operations",{"0":{"112":1,"115":1,"144":1,"163":1,"179":1},"1":{"116":1,"145":1,"146":1,"180":1,"181":1},"2":{"8":1,"12":1,"116":1,"150":1,"271":1,"276":2,"286":2}}],["operates",{"2":{"113":1,"260":1}}],["operate",{"2":{"25":1}}],["openssl",{"2":{"250":1}}],["opensearch",{"2":{"247":2,"262":2,"268":1}}],["opening",{"2":{"215":1}}],["openviking",{"0":{"272":1,"273":1,"274":1,"275":1},"1":{"273":1,"274":1,"275":1,"276":1},"2":{"177":1,"257":1,"259":1,"272":1,"273":1,"274":2,"275":1,"276":2}}],["open",{"0":{"81":1,"83":1},"2":{"25":1,"30":1,"33":1,"34":1,"44":1,"48":1,"52":1,"58":1,"60":1,"62":1,"66":1,"76":1,"92":1,"94":1,"99":1,"148":1,"162":1,"177":1,"220":1,"258":2,"270":1,"275":1,"280":1,"285":1,"288":1}}],["openclaw",{"0":{"24":1},"2":{"24":1}}],["openai",{"2":{"11":2,"91":1,"167":1,"168":2,"169":1,"173":3,"233":2,"247":1}}],["overlay",{"2":{"251":1}}],["overlap",{"2":{"128":1}}],["overview",{"0":{"18":1,"39":1,"89":1},"1":{"40":1},"2":{"89":1}}],["over",{"2":{"14":1,"18":1,"126":1,"127":1,"128":1,"161":1,"182":1,"279":1}}],["oauth2",{"2":{"30":1}}],["oauth",{"0":{"162":1,"169":1},"2":{"7":1,"11":1,"12":1,"39":1,"89":1,"162":6,"169":4}}],["often",{"2":{"91":1,"153":1}}],["official",{"0":{"46":1,"52":1,"58":1},"2":{"30":1,"37":1,"47":1,"60":2,"249":1}}],["off",{"0":{"267":1},"2":{"19":1,"129":1,"153":1,"183":1,"257":1,"261":1,"264":1}}],["of",{"2":{"6":1,"8":1,"10":1,"11":1,"18":2,"19":3,"23":1,"43":1,"45":1,"50":1,"59":1,"62":1,"73":2,"83":1,"90":1,"91":1,"100":1,"115":1,"117":1,"118":1,"121":1,"126":2,"128":3,"129":1,"130":1,"131":2,"133":1,"141":2,"154":2,"156":2,"158":1,"160":2,"161":2,"168":2,"169":1,"177":1,"182":1,"184":1,"185":1,"189":3,"190":3,"193":1,"206":1,"207":2,"215":2,"216":1,"228":1,"246":1,"247":2,"253":1,"258":1,"260":1,"262":1,"282":1}}],["others",{"2":{"215":1,"246":1}}],["other",{"0":{"215":1},"2":{"3":1,"5":1,"15":1,"23":1,"84":1,"113":1,"184":1,"196":1,"199":1,"201":1,"205":1,"207":1}}],["orchestrated",{"2":{"245":1}}],["oriented",{"2":{"196":1}}],["ordering",{"2":{"75":1}}],["order",{"2":{"75":1,"78":1}}],["organized",{"2":{"287":1}}],["organize",{"2":{"213":1}}],["organization",{"2":{"36":1,"53":1,"284":2}}],["org",{"2":{"42":1,"43":2}}],["or",{"2":{"1":1,"3":3,"8":1,"10":1,"16":1,"23":2,"33":1,"39":1,"40":1,"42":1,"44":1,"45":1,"54":1,"56":1,"63":1,"66":1,"70":2,"72":1,"75":1,"77":2,"91":1,"95":2,"97":3,"100":2,"101":1,"109":2,"113":2,"116":1,"117":1,"119":1,"122":1,"125":1,"127":1,"128":2,"129":1,"131":1,"133":2,"136":1,"142":1,"146":2,"150":1,"152":1,"153":1,"154":2,"155":1,"156":1,"161":1,"163":3,"167":1,"171":1,"172":1,"173":1,"177":1,"178":1,"181":1,"182":1,"184":1,"186":1,"187":1,"198":1,"205":1,"210":1,"212":1,"221":1,"222":1,"232":5,"237":2,"239":1,"240":1,"243":1,"245":1,"249":1,"250":3,"257":1,"259":1,"262":1,"264":1,"271":1,"272":1}}],["owner",{"2":{"72":1,"75":1,"82":1,"186":1,"226":4,"230":5,"231":1,"232":1,"233":2,"234":1,"235":1,"236":1}}],["own",{"2":{"1":3,"5":1,"12":1,"15":1,"23":3,"86":1,"91":1,"113":1,"140":1,"143":1,"150":1,"158":1,"199":1,"205":1,"206":1,"243":2,"257":1}}],["lt",{"2":{"230":8,"231":2,"233":4,"234":1,"235":1,"236":1,"241":1}}],["leave",{"2":{"189":1}}],["leaving",{"2":{"147":1}}],["least",{"2":{"166":2}}],["lead",{"2":{"128":1}}],["lets",{"2":{"79":1,"100":1}}],["level",{"2":{"73":2,"79":1,"91":1,"190":1,"253":1}}],["left",{"2":{"28":1,"34":1}}],["less",{"2":{"25":1}}],["ll",{"2":{"19":1}}],["llms",{"2":{"19":1}}],["llm",{"0":{"11":1,"166":1,"167":1},"1":{"167":1,"168":2,"169":2,"170":2,"171":2,"172":1,"173":1,"174":1,"175":1},"2":{"11":1,"24":1,"90":1,"91":3,"129":1,"153":1,"166":1,"167":1,"223":1}}],["linux",{"2":{"254":1}}],["line",{"2":{"141":1,"160":1,"251":1}}],["link",{"2":{"111":1,"136":1}}],["linked",{"2":{"62":1}}],["links",{"2":{"30":1,"51":1,"63":1,"95":1,"244":1}}],["listen",{"2":{"253":1}}],["listed",{"2":{"82":1}}],["listing",{"2":{"226":1}}],["lists",{"2":{"164":1,"212":1,"262":1}}],["list",{"2":{"70":1,"83":1,"108":1,"120":1,"121":1,"132":1,"145":1,"160":1,"164":1,"169":1,"170":1,"171":1,"173":2,"174":1,"181":1,"191":2,"207":1,"225":1,"228":1,"230":3,"231":2,"233":3,"234":2,"235":2,"236":2,"240":2,"241":4,"247":1,"264":1,"274":1,"284":1}}],["limit",{"2":{"189":1,"196":1}}],["limited",{"2":{"66":1}}],["limits",{"2":{"13":1}}],["lifecycle",{"0":{"116":1},"2":{"88":1,"89":1,"115":1,"126":1}}],["life",{"2":{"19":1}}],["live",{"2":{"19":1}}],["lightweight",{"2":{"247":1,"261":1}}],["lighter",{"2":{"24":1,"247":1}}],["light",{"2":{"15":1}}],["like",{"2":{"1":1,"19":1,"22":1,"23":1,"25":2,"37":1,"91":1,"95":1,"100":1,"116":1,"136":1,"167":1,"169":1,"172":1,"198":1}}],["lookup",{"2":{"247":1}}],["looked",{"2":{"19":1}}],["losing",{"2":{"206":1}}],["lose",{"2":{"128":1}}],["lost",{"2":{"93":1}}],["logging",{"2":{"253":1}}],["logs",{"0":{"131":1,"132":1,"154":1,"155":1,"239":1},"1":{"132":1,"155":1},"2":{"89":3,"132":1,"155":1,"156":1,"224":1,"239":3,"254":2}}],["login",{"2":{"42":3,"66":3,"67":1,"252":1}}],["log",{"2":{"34":1,"48":1,"54":1,"126":1,"132":1,"141":1,"154":1,"155":1,"253":1}}],["load",{"2":{"155":2}}],["loaded",{"2":{"23":1}}],["loads",{"2":{"6":1}}],["localhost",{"2":{"252":3}}],["locally",{"2":{"247":1,"262":1,"268":1}}],["locale",{"2":{"91":1,"94":1,"97":2}}],["local",{"0":{"160":1},"2":{"20":1,"21":1,"22":1,"24":1,"25":1,"123":1,"124":1,"146":2,"160":1}}],["lower",{"2":{"130":1}}],["lowest",{"2":{"75":1}}],["low",{"2":{"19":1,"91":1,"232":1}}],["longer",{"2":{"19":1,"98":1,"128":1,"181":1,"209":1,"214":1,"265":1}}],["long",{"2":{"1":1,"18":1,"21":1,"25":1,"43":1,"102":1,"131":1,"154":1,"176":1,"186":1,"209":1,"243":1,"256":1}}],["large",{"2":{"127":1}}],["lark",{"0":{"33":1},"1":{"34":1,"35":1,"36":1,"37":1,"38":1},"2":{"1":1,"4":1,"7":1,"23":1,"33":1,"39":1,"106":1,"243":1}}],["launch",{"2":{"116":1}}],["later",{"2":{"118":1}}],["latest",{"2":{"26":1,"145":1,"155":1,"249":1,"254":1,"255":2}}],["late",{"2":{"19":1}}],["latency",{"2":{"18":1}}],["languages",{"2":{"148":1,"247":1,"262":1,"277":1,"279":1,"289":1}}],["language",{"2":{"6":1,"91":2,"189":1,"193":1,"196":1,"232":3,"247":1,"279":1}}],["last",{"2":{"6":1,"23":1,"212":2,"237":1}}],["layers",{"2":{"287":1}}],["layer",{"2":{"6":1,"19":1,"20":1}}],["two",{"2":{"136":1,"192":1}}],["tutorial",{"2":{"60":1}}],["turning",{"2":{"19":1}}],["turn",{"2":{"6":1,"18":1,"23":1,"128":1}}],["typical",{"2":{"95":1}}],["typing",{"2":{"49":1,"51":1,"68":2,"69":1}}],["type",{"2":{"42":3,"73":1,"77":3,"79":2,"84":2,"138":1,"160":1,"161":1,"163":1,"173":2,"178":1,"207":2,"210":1,"212":2,"237":1,"263":1,"273":1,"278":1,"283":1,"287":1,"288":1}}],["types",{"0":{"73":1,"159":1,"207":1},"1":{"160":1,"161":1},"2":{"9":1,"11":1,"51":1,"70":1,"207":2,"258":1}}],["title",{"2":{"212":1,"213":1}}],["timing",{"2":{"196":1}}],["timezone",{"2":{"94":1,"97":2,"190":2,"253":2}}],["timeout",{"2":{"43":2,"253":1}}],["timestamp",{"2":{"141":1}}],["timestamps",{"2":{"121":1}}],["times",{"2":{"13":1,"23":1,"189":1}}],["time",{"0":{"19":1,"198":1},"2":{"8":1,"9":1,"14":1,"15":1,"19":3,"57":1,"101":1,"116":1,"117":1,"126":1,"127":1,"131":1,"154":1,"170":1,"182":2,"183":1,"197":1,"204":1}}],["tiny",{"2":{"19":1}}],["t",{"2":{"19":6,"21":2,"116":1,"151":1,"223":1,"247":1}}],["truncated",{"2":{"241":1}}],["true",{"2":{"194":1,"232":3,"255":1}}],["tree",{"2":{"144":1}}],["treat",{"2":{"24":1}}],["troubleshooting",{"2":{"142":1,"184":1}}],["traits",{"2":{"217":1}}],["trail",{"2":{"131":1}}],["trash",{"2":{"174":1,"221":1}}],["translate",{"2":{"193":1}}],["transport",{"2":{"161":1}}],["transfer",{"2":{"146":1}}],["track",{"2":{"215":1}}],["tracked",{"2":{"142":1}}],["tracks",{"2":{"126":1}}],["traditional",{"2":{"138":1}}],["trade",{"2":{"19":1}}],["trapped",{"2":{"21":1}}],["travels",{"2":{"19":1}}],["triggering",{"2":{"187":1}}],["trigger",{"2":{"82":1,"130":1,"142":1,"152":1,"153":1,"196":1,"215":1}}],["triggers",{"2":{"13":1,"91":1,"189":1,"195":1,"207":1}}],["triggered",{"2":{"9":1,"131":1,"154":1,"188":1,"207":1,"215":1}}],["tts",{"0":{"277":1,"278":1,"287":1},"1":{"278":1,"279":1,"280":1,"281":1,"288":1,"289":1,"290":1},"2":{"8":1,"277":1,"278":1,"280":3,"287":7,"288":2,"289":1,"290":1}}],["thousands",{"2":{"128":1}}],["those",{"2":{"18":1}}],["than",{"2":{"24":1,"130":1,"182":1,"247":2,"262":1}}],["that",{"2":{"8":1,"9":1,"10":1,"18":1,"19":8,"20":1,"25":4,"39":1,"62":1,"72":1,"85":1,"86":1,"89":1,"91":1,"99":1,"104":1,"127":1,"128":2,"150":1,"152":1,"154":1,"156":1,"162":1,"172":1,"175":1,"181":1,"184":1,"186":1,"189":1,"193":1,"198":1,"223":1,"226":1,"247":1,"256":1,"258":1,"270":1,"272":2,"282":1}}],["thing",{"2":{"19":1,"25":1}}],["thinking",{"2":{"91":1,"196":1}}],["thinks",{"2":{"63":1}}],["think",{"2":{"19":1,"152":1}}],["this",{"2":{"19":2,"26":1,"28":1,"33":1,"37":1,"42":2,"59":1,"60":1,"72":1,"73":1,"75":1,"91":1,"93":2,"96":1,"100":1,"110":2,"113":1,"118":1,"120":1,"125":1,"126":1,"128":1,"129":1,"133":1,"143":1,"152":1,"153":1,"160":1,"161":1,"168":1,"170":1,"183":1,"184":1,"185":1,"187":1,"189":1,"191":1,"193":1,"206":1,"207":1,"208":1,"209":2,"213":1,"250":1,"251":1,"252":1,"263":1,"273":1,"283":1}}],["thread",{"2":{"77":3,"79":3,"205":1}}],["threads",{"2":{"9":1,"19":1}}],["three",{"2":{"18":1,"73":1,"257":1,"259":1,"260":1,"287":1}}],["through",{"2":{"8":1,"23":2,"39":1,"47":1,"59":1,"88":1,"94":1,"178":1,"223":1,"276":1,"282":1,"286":1}}],["these",{"2":{"90":2,"128":1,"150":1,"164":1,"165":1,"215":1,"217":1,"226":1}}],["they",{"2":{"21":2,"45":1,"215":1,"216":1,"223":2}}],["then",{"2":{"19":1,"34":1,"188":1,"250":1,"287":1}}],["there",{"2":{"19":1,"184":1}}],["their",{"2":{"5":1,"21":1,"23":2,"78":1,"121":1,"164":1,"191":1,"228":1}}],["the",{"0":{"17":1,"30":1,"44":1,"66":1,"90":1,"114":1,"193":1,"194":1,"210":1,"279":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"1":1,"4":1,"6":1,"7":1,"8":1,"9":2,"10":1,"14":2,"16":1,"18":4,"19":12,"21":1,"22":2,"23":3,"24":3,"25":2,"26":1,"28":2,"29":1,"30":3,"31":1,"33":1,"34":2,"35":1,"36":1,"37":3,"38":3,"39":5,"40":5,"41":1,"42":4,"43":5,"44":2,"45":1,"48":3,"49":1,"50":2,"54":2,"55":4,"56":3,"59":1,"60":3,"61":3,"62":4,"63":4,"65":1,"66":5,"67":3,"70":1,"72":3,"73":1,"74":4,"75":5,"77":4,"78":2,"81":1,"82":2,"83":3,"84":1,"85":3,"87":6,"89":3,"90":11,"91":15,"92":4,"93":5,"94":3,"95":1,"96":4,"97":3,"99":5,"100":4,"101":3,"105":2,"108":5,"109":2,"111":3,"112":3,"113":2,"114":3,"115":3,"116":6,"117":6,"118":3,"119":2,"120":4,"121":1,"122":1,"123":2,"124":2,"125":4,"126":3,"127":3,"128":1,"129":5,"130":5,"131":5,"132":1,"133":9,"134":1,"137":2,"138":4,"139":2,"140":7,"141":7,"142":3,"143":2,"144":1,"145":4,"146":3,"147":3,"148":4,"149":1,"150":3,"151":1,"152":2,"153":9,"154":6,"155":2,"156":4,"157":1,"159":2,"160":3,"161":3,"162":8,"163":3,"164":7,"165":6,"167":1,"168":9,"169":7,"170":2,"171":6,"173":9,"174":3,"177":5,"178":4,"179":2,"180":2,"181":1,"182":3,"183":6,"184":7,"185":3,"186":6,"188":2,"189":10,"190":3,"191":4,"193":4,"194":2,"195":9,"197":1,"199":2,"201":5,"202":5,"203":4,"204":3,"205":1,"206":3,"207":7,"208":2,"209":5,"210":2,"212":6,"215":4,"216":2,"217":1,"218":2,"219":2,"220":2,"221":3,"222":5,"223":2,"225":3,"226":2,"229":1,"237":1,"239":1,"242":3,"243":1,"245":4,"246":1,"247":11,"249":8,"250":1,"251":3,"253":2,"254":1,"255":3,"256":1,"257":3,"258":5,"259":1,"260":3,"262":4,"263":2,"264":1,"268":3,"269":2,"270":5,"271":3,"273":2,"274":1,"275":4,"276":2,"278":4,"279":1,"280":3,"281":3,"282":1,"283":2,"284":1,"285":4,"286":2,"287":3,"288":7,"290":1}}],["theme",{"2":{"15":1}}],["them",{"2":{"1":1,"6":1,"90":1,"146":1,"163":2,"178":1,"210":1,"243":1}}],["tag",{"2":{"249":1,"255":3}}],["target",{"2":{"40":1,"51":1,"73":1}}],["tabs",{"2":{"88":1,"92":1}}],["tab",{"0":{"89":1,"91":1,"92":1},"2":{"31":1,"37":1,"40":1,"43":1,"49":1,"55":1,"61":1,"65":1,"70":1,"72":1,"76":1,"81":1,"89":1,"90":1,"91":1,"92":1,"93":1,"99":1,"100":1,"105":1,"115":1,"117":1,"122":1,"129":1,"130":2,"131":1,"139":1,"141":1,"143":1,"150":1,"153":1,"154":1,"159":1,"177":2,"179":1,"183":1,"184":1,"185":1,"191":1,"203":1,"219":1,"256":1,"258":2,"270":1,"271":1,"275":1,"280":1,"285":1,"288":1}}],["takes",{"2":{"88":1}}],["take",{"2":{"19":1,"75":1,"252":1}}],["talks",{"2":{"90":1}}],["talk",{"2":{"19":1}}],["tailwind",{"2":{"15":1}}],["task",{"2":{"9":2,"135":1,"153":1,"154":1,"187":1,"189":3,"196":1,"205":1,"207":2,"215":1}}],["tasks",{"0":{"13":1,"187":1,"230":1},"1":{"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1},"2":{"3":1,"8":1,"10":1,"13":1,"23":2,"86":1,"89":1,"91":1,"117":2,"151":1,"156":1,"165":1,"187":1,"196":1,"209":1,"215":1,"224":1}}],["tavily",{"2":{"8":1,"199":1}}],["template",{"2":{"220":1,"249":1}}],["tech",{"2":{"189":1,"230":1}}],["test",{"2":{"171":2,"281":1,"288":2}}],["testing",{"0":{"281":1},"2":{"118":1}}],["term",{"2":{"102":1,"176":1,"186":1,"247":1,"256":1}}],["terminal",{"0":{"92":1},"2":{"89":2,"92":2}}],["team",{"2":{"24":1}}],["teams",{"2":{"3":1}}],["tension",{"2":{"18":1}}],["textarea",{"2":{"180":1}}],["text",{"0":{"148":1},"2":{"8":2,"19":1,"32":1,"45":2,"51":1,"57":1,"69":1,"148":1,"172":1,"173":1,"181":1,"223":1,"247":1,"253":1,"262":1,"287":2}}],["telegram",{"0":{"59":1,"60":1,"209":1},"1":{"60":1,"61":1,"62":1,"63":1},"2":{"1":1,"4":1,"7":1,"23":1,"39":1,"40":1,"59":2,"60":3,"61":1,"62":3,"73":2,"79":1,"84":2,"85":2,"89":1,"104":1,"106":1,"189":1,"194":1,"223":1,"243":1,"244":1}}],["today",{"2":{"189":1,"230":1}}],["toml",{"2":{"148":1,"249":1,"250":4,"251":2,"252":1,"253":1,"255":2,"268":2,"269":2}}],["total",{"2":{"133":1,"185":1,"189":1}}],["toggle",{"2":{"91":2,"112":1,"129":1,"153":1,"163":1,"249":1}}],["topics",{"2":{"209":1}}],["topic",{"2":{"205":1,"213":1}}],["top",{"2":{"75":2,"78":1,"83":1,"189":1,"190":1,"230":1}}],["took",{"2":{"131":1,"154":1}}],["too",{"2":{"19":3,"209":1}}],["toolbar",{"2":{"144":1}}],["tool",{"0":{"164":1},"2":{"12":1,"15":1,"22":1,"157":1,"164":1,"193":1,"198":1,"218":1}}],["tools",{"2":{"8":3,"12":1,"19":1,"24":1,"86":1,"94":1,"99":1,"100":1,"116":1,"150":1,"152":1,"156":1,"158":1,"164":4,"165":2,"188":1,"195":1,"216":1,"217":1,"218":1,"222":1}}],["tokens",{"2":{"40":1,"109":1,"223":1}}],["token",{"0":{"237":1},"2":{"10":1,"28":3,"31":1,"42":3,"43":2,"60":3,"61":1,"66":1,"162":3,"168":1,"169":1,"224":1,"237":1,"247":1,"253":1,"262":1}}],["to",{"0":{"17":1,"24":1,"30":1,"99":1,"133":1,"203":1,"215":1,"270":1,"275":1,"280":1,"285":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"1":1,"3":1,"4":1,"7":1,"8":2,"12":1,"13":1,"15":1,"16":1,"18":1,"19":2,"21":2,"23":3,"24":1,"25":1,"27":2,"28":3,"29":1,"30":3,"31":1,"32":1,"33":1,"34":2,"35":1,"36":1,"37":2,"38":2,"39":1,"40":3,"41":3,"43":1,"44":1,"45":1,"47":2,"48":2,"49":1,"50":3,"53":2,"54":2,"55":1,"56":2,"59":1,"60":2,"61":1,"62":2,"63":1,"64":2,"65":1,"66":1,"67":1,"70":2,"74":1,"75":2,"76":1,"77":3,"78":3,"79":2,"81":1,"82":1,"83":1,"84":2,"85":1,"87":1,"88":1,"89":1,"90":2,"91":2,"92":2,"93":3,"94":3,"96":1,"97":1,"99":2,"101":1,"102":1,"103":2,"104":1,"106":1,"110":2,"111":1,"113":1,"116":2,"118":1,"120":1,"121":2,"123":1,"125":2,"126":1,"128":1,"129":1,"130":2,"133":3,"134":2,"135":1,"136":3,"138":1,"140":1,"141":1,"142":3,"145":1,"146":3,"147":1,"148":3,"149":1,"150":2,"151":2,"152":1,"153":1,"154":1,"155":1,"157":2,"158":1,"160":1,"161":1,"162":2,"163":2,"164":2,"165":1,"166":2,"167":1,"168":1,"170":3,"171":2,"172":1,"173":1,"174":3,"175":1,"176":1,"180":1,"182":2,"183":3,"184":1,"185":1,"186":1,"187":1,"188":3,"189":2,"191":2,"193":2,"194":1,"195":1,"197":3,"198":1,"199":1,"201":2,"203":2,"204":2,"205":1,"206":1,"207":2,"209":3,"210":1,"213":1,"215":1,"218":1,"221":3,"222":1,"223":1,"226":1,"241":1,"243":1,"244":1,"245":2,"247":4,"249":1,"250":1,"254":1,"255":5,"256":1,"262":1,"263":1,"264":1,"270":2,"271":2,"273":1,"275":2,"276":1,"278":1,"279":2,"281":2,"282":1,"283":1,"284":1,"285":2,"286":1,"287":1,"288":2,"290":1}}],["wrote",{"2":{"19":1}}],["writes",{"2":{"133":1}}],["write",{"2":{"5":1,"8":1,"140":1,"150":1,"218":1}}],["ways",{"2":{"192":1}}],["way",{"2":{"142":1,"158":1,"245":1}}],["warning",{"2":{"93":1}}],["walks",{"2":{"59":1}}],["want",{"2":{"21":2,"25":1,"30":1,"125":1,"183":1,"209":2}}],["wanted",{"2":{"19":2}}],["wasn",{"2":{"19":1}}],["was",{"2":{"19":1,"131":2,"141":1,"154":1,"212":1}}],["wait",{"2":{"19":1}}],["work",{"2":{"207":1,"215":1}}],["working",{"2":{"160":1,"184":1}}],["works",{"0":{"262":1},"2":{"133":1,"208":1,"247":1,"260":1}}],["workspace",{"0":{"114":1},"2":{"53":1,"56":1,"150":1,"249":2,"251":1,"253":1,"284":2}}],["workspaces",{"2":{"39":1}}],["workflows",{"2":{"18":1,"39":1,"260":1}}],["worse",{"2":{"19":1}}],["world",{"2":{"18":1,"39":1}}],["width",{"2":{"97":2}}],["wide",{"2":{"11":1}}],["window",{"2":{"66":1,"169":1,"182":1,"205":1}}],["windows",{"2":{"14":1}}],["will",{"2":{"25":1,"37":1,"44":1,"48":1,"50":1,"56":1,"60":1,"62":1,"66":1,"75":1,"87":1,"93":1,"110":1,"120":1,"162":1,"164":1,"165":1,"169":1,"170":1,"177":1,"193":1,"204":2,"209":1,"220":1,"242":1,"249":1,"250":1,"270":1,"276":1,"286":1}}],["without",{"2":{"5":1,"19":2,"109":1,"113":1,"125":1,"147":1,"163":1,"177":1,"187":1,"205":1,"206":1,"209":1,"222":1,"223":1,"247":2,"250":1,"261":1}}],["within",{"2":{"1":1,"5":1,"23":1,"53":1,"77":1,"113":1,"114":1,"145":1,"217":1}}],["with",{"0":{"82":1,"83":1,"150":1,"208":1},"1":{"209":1,"210":1},"2":{"1":1,"3":2,"5":2,"7":2,"8":2,"12":1,"15":1,"16":1,"18":2,"19":1,"20":1,"22":1,"23":3,"25":1,"27":1,"32":1,"33":2,"39":2,"42":1,"45":1,"47":1,"48":1,"51":1,"53":1,"57":1,"60":1,"62":1,"64":1,"69":1,"70":1,"72":1,"74":2,"83":1,"84":2,"85":1,"86":1,"89":1,"90":1,"97":1,"100":1,"101":1,"102":1,"103":1,"111":1,"121":1,"126":1,"133":1,"140":1,"144":1,"146":1,"147":1,"151":1,"164":1,"169":1,"183":1,"184":1,"190":2,"195":1,"206":1,"207":1,"217":1,"220":1,"223":1,"225":1,"226":1,"242":1,"243":2,"245":1,"246":1,"247":1,"249":2,"250":2,"254":1,"257":2,"259":1,"260":3,"262":2,"268":1,"271":1,"288":1,"290":1}}],["whose",{"2":{"75":1}}],["who",{"2":{"50":1,"62":1,"70":1,"89":1,"226":1,"251":1}}],["whether",{"2":{"117":1,"131":1,"141":1,"154":1,"185":1,"189":1}}],["when",{"2":{"19":2,"22":1,"43":1,"66":1,"69":1,"72":1,"77":1,"91":1,"99":1,"100":1,"125":1,"126":1,"129":1,"131":1,"151":1,"154":1,"164":1,"178":1,"183":1,"188":1,"189":2,"195":1,"204":1,"206":1,"207":4,"209":1,"212":1,"215":1,"241":1,"247":1,"249":1,"251":1,"278":1,"284":1}}],["where",{"2":{"18":1,"19":1,"24":2,"88":1,"210":1}}],["why",{"0":{"21":1,"128":1},"2":{"19":1,"247":1}}],["while",{"2":{"14":1,"19":1,"51":1,"68":1,"69":1,"127":1,"133":1,"247":1,"252":1}}],["which",{"2":{"9":1,"50":1,"62":1,"133":1,"170":1,"188":1,"262":1}}],["whatever",{"2":{"133":1}}],["what",{"0":{"1":1,"20":1},"2":{"18":2,"19":1,"131":1,"189":1,"215":1,"216":1,"244":1,"247":1}}],["week",{"2":{"190":1}}],["weeks",{"2":{"128":1}}],["were",{"2":{"19":1,"126":1}}],["weighted",{"2":{"247":1}}],["weights",{"2":{"247":2,"262":1}}],["weight",{"2":{"19":1}}],["we",{"2":{"18":2,"19":2,"22":1,"24":2,"25":2}}],["wework",{"0":{"53":1},"1":{"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"7":1,"39":1,"106":1}}],["webm",{"2":{"279":1}}],["webp",{"2":{"149":1}}],["websites",{"2":{"95":1,"100":1}}],["websocket",{"2":{"55":2,"56":1}}],["webhook",{"0":{"37":1,"110":1},"2":{"7":1,"37":2,"110":2}}],["web",{"0":{"210":1},"2":{"1":1,"4":1,"7":2,"8":3,"12":1,"15":1,"16":1,"31":1,"39":1,"43":1,"46":1,"49":1,"50":1,"55":1,"61":1,"62":1,"65":1,"89":1,"90":1,"91":2,"147":1,"195":1,"197":1,"199":1,"210":1,"212":1,"223":1,"243":1,"245":1,"246":3,"252":1,"253":2}}],["wechat",{"0":{"64":1,"65":1,"111":1},"1":{"65":1,"66":1,"67":1,"68":1,"69":1},"2":{"1":1,"7":2,"39":2,"64":2,"65":1,"66":2,"67":1,"89":1,"106":1,"111":2,"243":1,"244":1}}],["wecom",{"0":{"53":1,"54":1},"1":{"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"1":1,"7":1,"39":2,"53":2,"54":1,"55":2,"56":2,"58":2,"89":1,"106":1,"243":1,"244":1}}],["cp",{"2":{"250":1}}],["cd",{"2":{"250":1}}],["c",{"2":{"230":1}}],["cwd",{"2":{"160":1}}],["cycle",{"2":{"129":1}}],["certain",{"2":{"182":1}}],["certificates",{"2":{"97":1}}],["ceiling",{"2":{"21":1}}],["cni",{"2":{"253":1}}],["cn",{"2":{"97":1,"249":2,"251":3,"255":1}}],["c2c",{"2":{"51":1}}],["curl",{"2":{"249":1}}],["current",{"2":{"100":1,"118":1,"126":1,"145":1,"162":1,"184":1,"189":1,"195":1,"229":1}}],["currently",{"2":{"39":1,"117":1,"189":1,"212":1,"290":1}}],["custom",{"2":{"34":1,"37":1,"54":1,"55":1,"97":1,"161":1,"196":1}}],["clear",{"2":{"132":1,"155":1}}],["cleaning",{"2":{"152":1}}],["clean",{"2":{"125":1,"155":1,"209":1,"218":1}}],["cleaner",{"2":{"19":1}}],["clone",{"2":{"249":1,"250":1}}],["closer",{"2":{"78":1}}],["closed",{"2":{"19":1}}],["cloud",{"2":{"20":1,"21":1,"22":1,"24":1,"25":1,"282":1}}],["class",{"2":{"19":1}}],["clash",{"2":{"19":1}}],["clicks",{"2":{"19":1}}],["click",{"0":{"249":1},"2":{"16":1,"28":2,"31":2,"34":2,"35":1,"36":1,"37":1,"38":1,"43":2,"48":1,"49":2,"50":1,"55":2,"61":2,"62":1,"65":1,"66":2,"77":2,"78":1,"87":2,"90":1,"93":1,"94":1,"96":2,"99":1,"100":1,"108":1,"119":1,"120":1,"123":1,"124":1,"130":2,"138":2,"140":2,"146":1,"148":2,"149":1,"162":2,"163":1,"164":1,"168":2,"169":1,"170":2,"171":1,"173":2,"174":2,"177":1,"183":1,"191":1,"201":1,"203":1,"210":1,"213":1,"220":2,"221":2,"263":2,"270":1,"273":2,"275":1,"278":2,"279":1,"280":1,"283":2,"285":1,"288":3}}],["clicking",{"2":{"8":1,"88":1,"95":1,"210":1}}],["client",{"2":{"11":1,"42":4,"44":1,"46":1,"173":1}}],["china",{"0":{"251":1},"2":{"249":1,"251":2,"255":1}}],["chromium",{"2":{"97":1,"101":3,"255":1}}],["checking",{"2":{"187":1}}],["checks",{"2":{"89":1,"152":1}}],["checked",{"2":{"75":1}}],["check",{"2":{"45":1,"140":1,"162":1,"196":1,"215":1,"249":1}}],["cheap",{"2":{"21":1}}],["choose",{"2":{"37":1,"40":1,"60":2,"77":1,"138":1,"161":1,"163":1}}],["choices",{"2":{"19":1}}],["characters",{"2":{"241":1}}],["changed",{"2":{"183":1}}],["change",{"2":{"78":1,"108":1,"190":1,"209":1,"250":1,"252":1}}],["changes",{"2":{"29":1,"118":1,"126":1,"145":1,"148":1}}],["channels",{"0":{"39":1,"103":1,"105":1,"209":1},"1":{"40":1,"104":1,"105":1,"106":2,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1},"2":{"8":1,"15":1,"39":3,"84":1,"86":1,"89":1,"103":1,"104":1,"208":1,"244":2}}],["channel",{"0":{"27":1,"33":1,"41":1,"47":1,"53":1,"59":1,"64":1,"65":1,"85":1,"108":1,"136":1},"1":{"28":1,"29":1,"30":1,"31":1,"32":1,"34":1,"35":1,"36":1,"37":1,"38":1,"42":1,"43":1,"44":1,"45":1,"46":1,"48":1,"49":1,"50":1,"51":1,"52":1,"54":1,"55":1,"56":1,"57":1,"58":1,"60":1,"61":1,"62":1,"63":1,"65":1,"66":1,"67":1,"68":1,"69":1},"2":{"7":1,"9":1,"10":1,"23":1,"31":1,"37":1,"40":3,"43":1,"49":1,"50":1,"51":1,"55":1,"56":1,"61":1,"62":1,"65":1,"67":1,"70":2,"73":4,"77":6,"79":2,"82":1,"83":1,"84":1,"85":4,"89":1,"108":2,"109":1,"111":1,"112":3,"135":1,"188":1,"189":1,"195":1,"223":1}}],["chatting",{"0":{"56":1,"67":1},"2":{"74":1,"151":1,"207":1}}],["chatbox",{"2":{"24":1}}],["chats",{"2":{"4":1,"33":1,"56":1,"57":1,"87":1,"242":1}}],["chat",{"0":{"81":1},"2":{"1":1,"3":1,"7":1,"9":1,"10":1,"11":2,"15":1,"23":2,"32":1,"36":2,"39":1,"62":1,"72":2,"74":1,"77":1,"79":1,"83":1,"84":1,"85":1,"86":1,"89":1,"90":1,"91":3,"103":1,"104":1,"128":1,"129":1,"142":1,"153":1,"172":1,"173":3,"186":1,"206":1,"207":2,"208":1,"209":1,"210":2,"226":1,"232":1,"237":1,"241":1,"243":1,"260":1}}],["circling",{"2":{"18":1}}],["css",{"2":{"15":1}}],["categorize",{"2":{"222":1}}],["category",{"2":{"19":1}}],["capturing",{"2":{"95":1}}],["captured",{"2":{"120":1}}],["capture",{"2":{"94":1,"118":1}}],["capability",{"0":{"35":1},"2":{"18":1,"20":1,"22":1,"199":1}}],["capabilities",{"0":{"8":1,"158":1},"2":{"6":1,"35":1,"36":1,"89":1,"91":2,"139":1,"173":1,"216":1,"218":1,"222":1,"260":1}}],["card",{"2":{"88":1,"221":1}}],["carry",{"2":{"19":1}}],["caught",{"2":{"19":1}}],["cases",{"2":{"95":1}}],["case",{"0":{"17":1,"110":1,"111":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"196":1,"261":1}}],["called",{"2":{"193":1}}],["callback",{"2":{"37":1,"110":1}}],["calls",{"2":{"22":1,"189":2,"194":1,"195":2,"196":1}}],["call",{"2":{"15":1,"204":1}}],["cannot",{"2":{"251":1}}],["can",{"0":{"81":1},"2":{"1":1,"3":1,"4":1,"5":1,"8":1,"9":1,"10":1,"12":1,"18":1,"19":5,"23":3,"24":2,"39":1,"41":1,"42":2,"45":1,"48":1,"56":1,"63":1,"67":1,"70":2,"72":2,"73":1,"78":1,"82":1,"83":1,"84":1,"85":1,"86":1,"88":1,"89":1,"91":2,"94":2,"99":1,"100":1,"101":1,"104":1,"114":1,"127":1,"128":1,"129":1,"130":1,"140":6,"142":1,"143":1,"150":1,"153":1,"156":1,"158":1,"162":1,"164":2,"170":1,"175":1,"182":1,"183":1,"188":1,"190":1,"193":1,"194":1,"195":1,"198":1,"204":1,"210":1,"215":1,"216":1,"218":1,"223":1,"226":1,"242":1,"249":1,"256":1,"271":1,"272":1,"280":1,"287":2,"288":1}}],["creation",{"2":{"116":1,"121":1,"260":1}}],["creating",{"0":{"87":1,"96":1,"119":1,"138":1,"168":1,"180":1,"192":1,"263":1,"273":1,"278":1,"283":1},"1":{"193":1,"194":1},"2":{"90":1,"97":1,"117":1,"264":1,"274":1,"284":1}}],["creates",{"2":{"208":1}}],["created",{"2":{"88":1,"90":1,"99":1,"140":1,"145":1,"192":1,"203":1,"207":4,"215":2,"270":1,"275":1,"278":1,"285":1}}],["create",{"0":{"28":1,"34":1,"42":1,"48":1,"54":1,"60":1},"2":{"1":1,"3":1,"8":1,"23":1,"34":2,"38":1,"40":1,"48":2,"54":1,"60":1,"79":1,"87":2,"89":2,"96":1,"106":1,"116":1,"119":1,"138":1,"140":1,"145":1,"168":1,"173":1,"175":1,"177":1,"193":2,"194":1,"209":1,"210":1,"225":2,"230":3,"243":1,"250":1,"258":1,"263":1,"271":1,"273":1,"278":1,"283":1,"287":1,"288":1}}],["credential",{"2":{"55":1}}],["credentials",{"2":{"34":1,"40":2,"54":1,"61":1,"66":1,"108":1,"109":1,"167":1,"201":1,"249":1,"253":1}}],["cron",{"0":{"188":1,"190":1},"2":{"9":1,"13":1,"23":1,"89":1,"187":1,"188":1,"189":1,"190":1,"191":1,"193":1,"195":1,"196":1,"207":1,"215":1}}],["cross",{"2":{"4":1,"50":1,"62":1}}],["cohere",{"2":{"247":1}}],["collection",{"2":{"152":1,"264":2}}],["collaborate",{"2":{"3":1,"23":1}}],["corresponding",{"2":{"215":1}}],["corrupted",{"2":{"125":1}}],["cores=chromium",{"2":{"101":1}}],["cores",{"2":{"101":4,"249":1,"255":1}}],["core",{"0":{"90":1,"101":1},"2":{"24":1,"89":1,"90":1,"91":1,"97":1,"101":1,"246":3,"249":1,"250":1}}],["copy",{"2":{"28":1,"30":1,"34":1,"37":1,"48":1,"50":1,"62":1,"110":1}}],["costs",{"2":{"247":1,"261":1}}],["cost",{"2":{"19":1,"262":1}}],["could",{"2":{"19":1}}],["counter",{"2":{"195":1}}],["counts",{"2":{"191":1}}],["count",{"2":{"13":1,"133":1}}],["coding",{"2":{"15":1,"23":1,"218":1}}],["coder",{"2":{"218":3}}],["code",{"0":{"66":1,"111":1},"2":{"8":1,"50":2,"51":1,"62":3,"63":1,"64":1,"66":3,"111":2,"113":1,"218":1,"232":1}}],["conf",{"2":{"250":1}}],["config",{"2":{"77":1,"85":1,"163":1,"190":1,"249":1,"250":3,"251":1,"252":1,"253":2,"255":3,"268":1,"269":1}}],["configuring",{"0":{"90":1,"97":1,"264":1,"274":1,"279":1,"284":1},"1":{"98":1,"265":1},"2":{"39":1,"90":1}}],["configurations",{"2":{"89":1,"126":1,"163":1}}],["configuration",{"0":{"15":1,"27":1,"33":1,"41":1,"47":1,"53":1,"59":1,"64":1,"107":1,"129":1,"153":1,"200":1,"238":1,"253":1},"1":{"28":1,"29":1,"30":1,"31":1,"32":1,"34":1,"35":1,"36":1,"37":1,"38":1,"42":1,"43":1,"44":1,"45":1,"46":1,"48":1,"49":1,"50":1,"51":1,"52":1,"54":1,"55":1,"56":1,"57":1,"58":1,"60":1,"61":1,"62":1,"63":1,"65":1,"66":1,"67":1,"68":1,"69":1,"108":1,"109":1,"110":1,"111":1,"201":1,"202":1},"2":{"15":1,"40":1,"89":1,"91":1,"95":1,"98":1,"106":7,"108":1,"109":1,"110":1,"112":2,"118":1,"148":1,"162":1,"163":1,"177":1,"184":1,"202":1,"224":1,"249":1,"255":1,"270":1,"281":1}}],["configurable",{"2":{"8":2,"14":1,"86":1,"287":1}}],["configure",{"0":{"29":1,"31":1,"36":1,"37":1,"43":1,"49":1,"55":1,"61":1},"2":{"13":1,"23":1,"40":1,"49":1,"72":1,"76":1,"90":1,"104":1,"105":1,"106":1,"109":1,"129":1,"130":1,"134":1,"136":1,"139":1,"153":1,"159":1,"166":1,"173":1,"175":1,"199":1,"244":1,"258":1,"264":1,"274":1,"279":1,"284":1,"288":1}}],["configured",{"2":{"8":1,"32":1,"39":1,"100":1,"102":1,"116":1,"133":1,"175":1,"177":1,"186":1,"190":1,"198":1,"269":1,"280":1}}],["confirmed",{"2":{"66":1}}],["confirm",{"2":{"66":1,"93":1}}],["confidence",{"2":{"24":1}}],["convert",{"2":{"262":1}}],["converts",{"2":{"247":1}}],["converse",{"2":{"142":1}}],["conversational",{"0":{"193":1}}],["conversations",{"2":{"9":1,"41":1,"45":1,"57":2,"69":1,"79":1,"90":1,"164":1,"176":1,"205":1,"207":1,"213":1,"260":1,"271":1,"287":1}}],["conversation",{"0":{"206":1},"2":{"6":2,"8":1,"9":2,"10":1,"20":1,"23":1,"77":4,"79":3,"128":1,"172":1,"173":1,"180":2,"198":1,"205":1,"206":1,"208":1,"209":1,"222":1,"224":1,"229":1}}],["consists",{"2":{"246":1}}],["consume",{"2":{"223":1}}],["consolidates",{"2":{"127":1}}],["console",{"2":{"35":1,"37":1,"38":1,"54":1}}],["constraint",{"2":{"19":1}}],["concept",{"0":{"95":1,"104":1,"114":1,"128":1,"136":1,"152":1,"158":1,"178":1,"188":1,"198":1,"206":1,"217":1},"1":{"218":1}}],["concepts",{"0":{"71":1},"1":{"72":1,"73":1,"74":1,"75":1}}],["conceptually",{"2":{"19":1}}],["conclusion",{"0":{"25":1}}],["connected",{"2":{"184":1,"188":1,"195":1}}],["connects",{"2":{"161":1,"282":1}}],["connect",{"2":{"12":1,"39":2,"56":1,"103":1,"157":1,"169":1,"197":1,"199":1}}],["connectivity",{"2":{"184":1}}],["connection",{"0":{"159":1},"1":{"160":1,"161":1},"2":{"89":1,"136":1,"160":1,"161":1,"162":2,"163":3,"164":2,"165":1,"167":1,"171":1,"198":1,"253":2}}],["connections",{"0":{"157":1,"231":1},"1":{"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1},"2":{"8":1,"12":1,"105":1,"137":1,"158":1,"159":1,"163":3,"224":1}}],["connecting",{"2":{"7":1,"27":1,"41":1,"47":1,"53":1,"59":1,"64":1,"111":1,"136":1}}],["continue",{"2":{"25":1,"102":1,"271":1,"290":1}}],["continuity",{"2":{"21":1,"25":1}}],["continuously",{"2":{"19":1}}],["controls",{"2":{"186":1,"253":1,"264":1}}],["controlling",{"2":{"73":1}}],["control",{"0":{"70":1},"1":{"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"20":1,"22":1,"70":2,"73":1,"76":1,"89":1,"91":1}}],["contain",{"2":{"127":1}}],["contains",{"2":{"26":1,"91":1,"207":3}}],["containerization",{"2":{"21":1}}],["containerized",{"0":{"5":1,"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"1":1,"20":1,"22":1,"23":1,"24":1,"25":1,"243":1}}],["containers",{"2":{"5":1,"22":1,"23":1,"245":1}}],["containerd",{"2":{"5":1,"16":1,"117":1,"245":2,"246":1,"253":2}}],["container",{"0":{"113":1,"117":1,"126":1,"241":1},"1":{"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1},"2":{"1":2,"5":2,"8":2,"12":1,"15":1,"23":1,"24":1,"86":1,"89":5,"92":3,"93":1,"113":1,"114":1,"115":1,"116":5,"117":4,"118":1,"119":1,"120":1,"122":2,"123":1,"124":1,"125":2,"126":4,"143":1,"146":2,"160":1,"217":1,"221":1,"224":1,"243":1,"247":3,"253":1,"262":1}}],["contact",{"2":{"18":1}}],["contents",{"2":{"124":1}}],["content",{"2":{"8":1,"19":1,"29":1,"32":1,"42":1,"45":1,"51":1,"57":1,"69":1,"94":1,"95":1,"133":1,"148":1,"180":1,"181":1,"210":1,"220":1,"221":1,"241":1}}],["contextually",{"2":{"176":1}}],["contexts",{"0":{"94":1,"98":1},"1":{"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1},"2":{"90":1,"96":3}}],["context",{"0":{"96":1,"97":1,"99":1,"236":1},"1":{"98":1},"2":{"4":1,"6":1,"8":1,"9":2,"12":1,"18":2,"19":1,"21":2,"22":1,"23":1,"25":1,"63":1,"77":1,"90":1,"91":1,"94":2,"95":1,"96":2,"97":1,"98":2,"99":3,"100":1,"157":2,"165":1,"178":1,"188":1,"195":1,"205":1,"206":2,"207":1,"208":1,"209":1,"215":1,"224":1,"229":1}}],["combined",{"2":{"249":1}}],["combining",{"2":{"128":1}}],["com",{"2":{"168":1,"250":1}}],["common",{"0":{"109":1,"254":1},"2":{"148":1,"190":1}}],["communication",{"0":{"104":1},"2":{"91":1,"135":1}}],["communicates",{"2":{"160":1}}],["communicate",{"2":{"41":1}}],["community",{"2":{"27":1,"39":1}}],["command`",{"2":{"218":1}}],["command",{"0":{"225":1},"2":{"9":1,"60":1,"160":3,"188":1,"189":1,"194":1,"195":2,"196":1,"207":1,"208":1,"224":1,"225":2,"230":3,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1}}],["commands",{"0":{"10":1,"223":1,"227":1,"242":1,"254":1},"1":{"224":1,"225":1,"226":1,"227":1,"228":2,"229":2,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1},"2":{"1":1,"5":1,"8":1,"10":3,"13":1,"23":2,"24":1,"30":1,"32":2,"92":1,"113":1,"215":1,"223":3,"224":1,"225":2,"226":4,"228":1,"242":1,"243":1}}],["comes",{"2":{"77":1,"86":1}}],["come",{"2":{"8":1,"9":1}}],["component",{"2":{"144":1}}],["compose",{"2":{"8":1,"16":1,"101":1,"140":1,"245":1,"246":1,"247":1,"248":1,"249":2,"250":3,"251":4,"254":6,"268":2,"269":1}}],["compression",{"0":{"182":1},"2":{"130":1,"182":1}}],["comprehensive",{"2":{"10":1,"199":1,"204":1}}],["compacted",{"2":{"131":1}}],["compact",{"0":{"128":1,"182":1},"2":{"89":1,"130":1,"182":2,"247":1,"262":1,"271":1}}],["compaction",{"0":{"14":1,"127":1,"130":1,"131":1},"1":{"128":1,"129":1,"130":1,"131":1,"132":2,"133":1,"134":1},"2":{"6":1,"14":2,"89":3,"91":4,"127":1,"128":1,"129":6,"130":5,"131":5,"132":1,"133":4,"182":2,"260":1}}],["compared",{"2":{"170":1}}],["compare",{"0":{"24":1}}],["compatible",{"2":{"11":1,"167":1}}],["complement",{"2":{"196":1}}],["completed",{"2":{"131":1,"154":1}}],["completions",{"2":{"11":1,"173":1}}],["complex",{"2":{"8":1,"86":1,"118":1}}],["computer",{"2":{"1":1,"23":1,"114":1,"146":1}}],["sslmode",{"2":{"253":1}}],["sse",{"0":{"161":1},"2":{"12":1,"116":1,"161":1}}],["swap",{"2":{"222":1}}],["switching",{"2":{"183":1,"209":1}}],["switch",{"2":{"10":1,"11":1,"112":1,"210":1}}],["snapshotter",{"2":{"253":1}}],["snapshot",{"0":{"119":1,"120":1},"2":{"119":2,"120":1,"121":1}}],["snapshots",{"0":{"118":1,"121":1},"1":{"119":1,"120":1,"121":1},"2":{"5":1,"89":1,"118":1,"121":1}}],["silently",{"2":{"249":1}}],["silent",{"2":{"249":1}}],["significantly",{"2":{"247":1,"262":1}}],["single",{"2":{"104":1}}],["size",{"2":{"94":1,"173":1}}],["simultaneously",{"2":{"92":1,"104":1}}],["simple",{"2":{"23":1,"64":1}}],["sidebar",{"2":{"28":1,"34":1,"40":1,"87":1,"96":1,"97":1,"137":1,"138":1,"168":2,"199":1,"201":1,"202":1,"210":1,"212":1,"258":1,"288":1}}],["sites",{"2":{"97":1}}],["sit",{"2":{"18":1,"19":1}}],["shipped",{"2":{"260":1}}],["sh",{"2":{"249":12}}],["shut",{"2":{"116":1}}],["shanghai",{"2":{"97":1}}],["shared",{"2":{"215":1}}],["share",{"2":{"24":1}}],["sharing",{"2":{"22":1,"24":1,"122":1,"163":1}}],["shell",{"2":{"92":1}}],["should",{"2":{"62":1,"90":2,"94":1,"153":1,"156":1,"216":1}}],["shows",{"2":{"184":1,"191":1,"212":1,"237":1,"239":1}}],["showing",{"2":{"141":1}}],["shown",{"2":{"48":1,"97":1,"116":1}}],["show",{"2":{"10":1,"49":1,"68":1,"215":1,"224":1}}],["slow",{"2":{"249":1}}],["sludge",{"2":{"19":1}}],["slash",{"0":{"10":1,"223":1},"1":{"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1},"2":{"9":1,"10":2,"32":1,"208":1,"223":2,"242":1}}],["socket",{"2":{"253":1}}],["sogou",{"2":{"199":1}}],["software",{"2":{"114":1}}],["sound",{"2":{"281":1}}],["sources",{"2":{"158":1}}],["source",{"0":{"79":1},"2":{"25":1,"77":1,"79":1,"85":1}}],["soul",{"2":{"8":1}}],["so",{"2":{"19":2,"21":1,"223":1,"247":2,"287":1}}],["some",{"2":{"162":1,"169":1,"225":1,"246":1}}],["someone",{"2":{"21":1}}],["somewhere",{"2":{"19":2}}],["something",{"2":{"18":1,"19":3}}],["smell",{"2":{"19":1}}],["smoother",{"2":{"19":1}}],["small",{"2":{"19":1,"172":1}}],["smarter",{"2":{"18":1}}],["smtp",{"2":{"7":1,"39":1,"136":1,"138":1}}],["scoping",{"2":{"284":2}}],["scoped",{"0":{"85":1},"2":{"206":1}}],["scope",{"0":{"79":1},"2":{"77":1,"79":2,"85":1}}],["scopes",{"2":{"30":1}}],["scale",{"2":{"97":1}}],["scan",{"0":{"66":1},"2":{"64":1,"66":2,"111":1}}],["scratch",{"2":{"183":1}}],["scripts",{"2":{"114":1}}],["script",{"2":{"101":1,"249":2,"251":1}}],["scroll",{"2":{"29":1,"93":1,"100":1}}],["screenshot",{"2":{"100":1}}],["screenshots",{"2":{"8":1,"94":1,"95":1}}],["screen",{"2":{"19":1}}],["scheduling",{"2":{"12":1}}],["schedules",{"0":{"191":1,"192":1},"1":{"193":1,"194":1},"2":{"191":1,"192":1,"194":1}}],["scheduled",{"0":{"13":1,"152":1,"187":1,"230":1},"1":{"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1},"2":{"10":1,"13":1,"23":1,"89":1,"152":1,"187":1,"207":1,"215":1,"224":1}}],["schedule",{"0":{"189":1,"196":1,"230":1},"2":{"9":1,"10":1,"23":1,"89":1,"151":1,"188":2,"189":3,"191":1,"193":4,"194":1,"195":4,"196":2,"207":1,"210":1,"215":1,"224":1,"225":2,"230":10,"237":1}}],["spaces",{"2":{"225":1}}],["sparse",{"0":{"247":1,"262":1,"268":1},"2":{"178":1,"183":1,"246":4,"247":9,"249":1,"250":2,"253":2,"257":2,"261":4,"262":5,"264":2,"268":5}}],["split",{"2":{"24":1}}],["spoken",{"2":{"8":1,"287":1}}],["speed",{"2":{"279":2,"281":1,"287":1,"288":1}}],["speech",{"2":{"8":1,"277":1,"280":1,"287":2,"288":1}}],["speaker",{"2":{"19":1}}],["specify",{"2":{"182":1,"201":1}}],["specified",{"2":{"13":1,"23":1,"130":1}}],["specifically",{"2":{"199":1}}],["specification",{"2":{"46":1}}],["specific",{"0":{"84":1},"2":{"4":1,"8":1,"70":1,"73":1,"77":5,"79":2,"85":2,"101":1,"136":1,"163":1,"172":1,"180":1,"186":1,"188":1,"196":1,"198":1,"201":1,"205":1,"249":1,"287":1}}],["special",{"0":{"110":1,"111":1},"2":{"156":1}}],["specialized",{"2":{"8":1,"86":1,"88":1}}],["synthesis",{"2":{"277":1,"281":1,"288":1}}],["synthesized",{"2":{"204":1}}],["synthesize",{"2":{"8":1,"280":1,"287":2,"288":1}}],["syntax",{"2":{"148":1,"190":1}}],["sync",{"2":{"43":1}}],["system",{"2":{"1":2,"18":1,"70":1,"75":1,"113":1,"156":1,"176":1,"184":1,"207":1,"222":2,"243":2,"257":1,"287":1}}],["skill",{"0":{"218":1,"220":1,"240":1},"2":{"8":1,"89":1,"217":1,"218":2,"219":1,"220":1,"221":2,"224":1,"240":2}}],["skills",{"0":{"216":1,"217":1,"219":1,"222":1,"240":1},"1":{"217":1,"218":2,"219":1,"220":2,"221":2,"222":1},"2":{"8":2,"15":1,"23":1,"89":1,"150":1,"152":1,"156":1,"188":1,"216":1,"219":1,"222":3,"224":1}}],["sudo",{"2":{"249":6,"250":1,"254":1}}],["sun=0",{"2":{"190":1}}],["summarize",{"2":{"189":1,"194":2,"230":1}}],["summary",{"2":{"131":1,"154":1,"189":1,"193":1,"225":1,"237":2,"253":1}}],["sure",{"2":{"177":1}}],["survive",{"2":{"18":1}}],["such",{"2":{"91":1,"94":1,"97":2,"100":1,"186":1}}],["succeeds",{"2":{"67":1}}],["successfully",{"2":{"62":1,"131":1,"141":1,"154":1}}],["sustainable",{"2":{"24":1}}],["subsequent",{"2":{"209":1}}],["subscriptions",{"2":{"37":1}}],["subject",{"0":{"73":1},"2":{"73":1,"74":2,"75":1,"77":1,"84":1,"141":2}}],["subjects",{"2":{"72":1,"73":1,"75":1,"82":1,"83":1}}],["submitting",{"2":{"95":1}}],["submit",{"2":{"38":1}}],["sub",{"2":{"9":1,"225":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1}}],["subagent",{"2":{"9":1,"207":3,"210":1,"215":2}}],["subagents",{"2":{"8":2}}],["supported",{"0":{"32":1,"45":1,"51":1,"57":1,"63":1,"69":1,"105":1,"199":1},"1":{"106":1},"2":{"59":1,"173":1,"199":1,"258":1}}],["support",{"0":{"7":1,"11":1,"12":1},"2":{"7":5,"10":1,"11":1,"12":2,"24":1,"32":1,"39":2,"45":1,"49":1,"51":2,"57":1,"59":1,"63":1,"69":2,"146":1,"169":1,"223":1}}],["supports",{"2":{"5":1,"13":1,"23":1,"33":1,"39":1,"91":1,"122":1,"148":1,"157":1,"162":1,"169":1,"173":2,"247":1,"257":2,"260":1,"262":1,"277":1,"287":1}}],["steps",{"0":{"102":1,"134":1,"175":1,"259":1,"290":1},"2":{"136":1,"173":1}}],["step",{"0":{"28":1,"29":1,"30":1,"31":1,"34":1,"35":1,"36":1,"37":1,"38":1,"42":1,"43":1,"44":1,"48":1,"49":1,"50":1,"54":1,"55":1,"56":1,"60":1,"61":1,"62":1,"65":1,"66":1,"67":1},"2":{"90":1,"106":2,"244":2}}],["studio",{"2":{"20":1,"24":1}}],["stopped",{"2":{"117":1,"119":1}}],["stop",{"2":{"89":1,"116":1,"254":1}}],["stops",{"2":{"19":1}}],["stood",{"2":{"19":1}}],["store",{"2":{"28":1,"114":1,"127":1,"271":1}}],["stored",{"2":{"23":2,"162":2,"178":1,"185":1,"217":1,"267":1,"274":1,"284":1}}],["stores",{"2":{"6":1,"94":1,"167":1,"256":1}}],["story",{"0":{"19":1}}],["storage",{"2":{"14":1,"19":1,"22":1,"185":1,"282":1}}],["style",{"2":{"19":1,"97":1}}],["still",{"2":{"18":1}}],["stdio",{"0":{"160":1},"2":{"12":1,"89":1}}],["stale",{"2":{"128":1,"133":1}}],["stable",{"2":{"119":1}}],["state",{"2":{"114":1,"118":1,"119":1,"120":1,"125":1}}],["status",{"0":{"184":1},"2":{"112":1,"117":1,"131":1,"141":1,"152":1,"154":1,"155":1,"162":2,"183":1,"184":2,"185":1,"191":1,"254":1}}],["static",{"2":{"100":1}}],["statistics",{"0":{"185":1},"2":{"10":1,"224":1}}],["stay",{"2":{"22":1}}],["stays",{"2":{"20":1,"25":2}}],["stack",{"2":{"22":1,"25":1,"245":1,"246":1}}],["stakes",{"2":{"19":1}}],["startup",{"2":{"252":2}}],["starts",{"2":{"229":1,"247":1}}],["starting",{"0":{"208":1},"1":{"209":1,"210":1},"2":{"206":1,"250":1}}],["started",{"2":{"19":2,"244":1,"246":1}}],["start",{"0":{"56":1,"67":1},"2":{"9":1,"10":1,"40":1,"44":1,"66":2,"89":1,"116":1,"125":1,"130":1,"183":1,"209":1,"224":1,"249":1,"250":2,"254":1}}],["standardized",{"2":{"158":1}}],["standard",{"2":{"9":1,"90":1,"160":1,"163":1,"190":1,"207":1,"260":1}}],["structure",{"0":{"218":1}}],["structured",{"2":{"1":1,"6":1,"142":1,"176":1,"243":1}}],["strip",{"2":{"242":1}}],["string",{"2":{"97":1}}],["strict",{"2":{"22":1}}],["streamed",{"2":{"45":1,"57":1}}],["stream",{"2":{"19":1}}],["streaming",{"2":{"7":2,"15":1,"39":1,"45":1,"57":1,"59":1,"63":1}}],["saas",{"2":{"257":2,"259":2,"272":1,"282":1}}],["saving",{"2":{"99":1,"118":1}}],["saves",{"2":{"66":1,"170":1}}],["save",{"2":{"5":1,"29":1,"31":1,"37":2,"43":1,"48":1,"49":1,"55":1,"61":1,"77":1,"78":1,"90":1,"99":1,"112":2,"116":1,"123":1,"148":2,"177":1,"203":1,"220":1,"270":1,"275":1,"280":1,"285":1,"288":1}}],["safely",{"2":{"118":1}}],["safe",{"2":{"21":1}}],["say",{"2":{"19":1}}],["same",{"2":{"4":1,"19":1,"128":1}}],["serper",{"2":{"199":1}}],["service",{"0":{"246":1,"247":1},"1":{"247":1},"2":{"136":1,"137":1,"167":1,"168":1,"195":1,"246":2,"247":1,"249":1,"252":1,"253":1,"261":1,"268":1,"272":1,"287":1}}],["services",{"2":{"11":1,"12":1,"16":1,"22":1,"104":1,"157":1,"246":1,"249":1,"250":1,"252":1}}],["serving",{"2":{"22":1}}],["servers",{"2":{"27":1,"39":1,"138":1,"162":1}}],["server",{"0":{"30":1},"2":{"16":1,"29":1,"30":1,"136":1,"160":1,"161":3,"162":1,"164":2,"165":2,"190":1,"245":1,"246":2,"253":4}}],["self",{"2":{"167":1,"199":1,"257":2,"259":2,"272":1}}],["selection",{"0":{"101":1},"2":{"101":1,"249":1}}],["selected",{"0":{"82":1},"2":{"91":1,"108":1,"212":1,"249":1,"270":1,"281":1}}],["select",{"2":{"30":3,"31":1,"43":1,"49":1,"50":1,"55":1,"61":2,"62":1,"65":1,"77":3,"90":3,"97":1,"98":1,"99":1,"100":1,"108":1,"124":1,"140":1,"146":1,"163":1,"169":1,"170":2,"171":1,"173":1,"177":1,"180":1,"191":1,"202":1,"203":2,"263":1,"264":1,"265":1,"270":1,"273":1,"274":1,"275":1,"278":1,"280":1,"283":1,"284":1,"285":1,"287":1,"288":2}}],["sent",{"2":{"141":3,"161":1,"189":1,"223":1}}],["sends",{"2":{"178":1,"188":1,"193":1}}],["sender",{"2":{"73":1,"75":1}}],["sending",{"2":{"40":1,"152":1,"187":1}}],["send",{"2":{"4":1,"8":2,"30":1,"36":1,"45":1,"50":1,"56":1,"60":1,"62":1,"63":2,"67":1,"110":1,"135":1,"140":1,"142":1,"189":1,"194":1,"195":1,"209":1,"225":1}}],["security",{"2":{"113":1}}],["securely",{"2":{"28":1,"48":1,"162":1}}],["seconds",{"2":{"43":1}}],["secrets",{"2":{"40":1,"109":1}}],["secret",{"2":{"34":1,"37":1,"42":1,"54":1,"55":1,"60":1,"249":2,"250":1,"253":1,"274":1,"284":1}}],["sections",{"2":{"253":1,"268":1}}],["section",{"2":{"26":1,"29":1,"164":1,"173":1,"253":1,"269":1}}],["seen",{"2":{"77":1}}],["see",{"2":{"10":1,"40":1,"87":1,"102":1,"106":1,"134":2,"145":1,"149":1,"182":1,"186":1,"215":1,"229":1,"246":1,"247":1,"276":1,"286":1}}],["sessions",{"0":{"9":1,"205":1,"211":1,"212":1,"213":1,"214":1,"215":1},"1":{"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":2,"213":2,"214":2,"215":1},"2":{"9":5,"114":1,"206":2,"207":1,"210":4,"212":1,"214":1,"215":4,"229":1}}],["session",{"0":{"207":1,"208":1},"1":{"209":1,"210":1},"2":{"8":2,"9":1,"10":1,"205":2,"206":3,"207":3,"208":1,"209":3,"210":3,"212":4,"213":1,"214":1,"215":2,"224":1,"229":1,"237":1}}],["searxng",{"2":{"8":1,"199":1,"201":1}}],["searching",{"0":{"181":1}}],["searches",{"2":{"90":1,"186":1}}],["search",{"0":{"197":1,"199":1,"201":1,"203":1,"235":2},"1":{"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1},"2":{"6":1,"8":3,"12":2,"20":1,"23":1,"36":1,"60":1,"77":1,"89":1,"90":4,"91":2,"100":1,"128":1,"163":1,"172":1,"173":1,"181":1,"195":1,"197":1,"198":2,"199":6,"201":4,"203":1,"204":3,"210":1,"224":2,"235":2,"246":1,"247":2,"256":1,"257":1,"261":2,"262":1,"264":1,"271":1,"276":1,"286":1}}],["semantic",{"2":{"6":1,"23":1,"133":1,"247":1,"257":1,"260":1,"261":1}}],["separate",{"2":{"5":1,"207":1}}],["separately",{"2":{"4":1}}],["setup",{"0":{"40":1,"271":1},"2":{"16":1,"39":1,"64":1,"101":1,"102":1,"244":1,"261":1}}],["settings",{"0":{"29":1,"68":1,"90":1,"232":2},"2":{"10":2,"15":1,"23":1,"34":1,"37":1,"49":1,"89":1,"90":1,"97":1,"169":1,"171":1,"183":1,"186":1,"201":1,"202":1,"224":2,"226":1,"232":4,"249":1,"258":1,"264":1,"265":1,"269":1,"270":1,"274":1,"279":1,"284":1,"287":2}}],["set",{"2":{"3":1,"8":1,"10":1,"15":1,"23":1,"77":1,"81":1,"82":1,"83":1,"84":2,"85":1,"90":1,"91":1,"133":1,"140":1,"152":1,"158":1,"182":1,"195":1,"206":1,"219":1,"225":1,"233":6,"234":2,"235":2,"236":2,"250":1,"251":1,"255":1,"290":1}}],["s",{"0":{"90":1},"2":{"4":1,"14":1,"18":1,"19":6,"21":1,"25":1,"31":1,"32":1,"37":1,"40":1,"43":3,"44":1,"47":1,"49":1,"53":1,"55":2,"61":1,"65":1,"70":1,"72":1,"76":1,"87":1,"89":2,"90":1,"91":2,"92":1,"101":1,"102":1,"105":1,"110":1,"112":2,"114":1,"115":1,"117":2,"118":2,"123":1,"124":1,"125":1,"126":1,"127":1,"129":1,"130":1,"133":1,"139":1,"140":1,"141":2,"146":2,"147":1,"148":2,"150":1,"154":1,"156":1,"160":1,"162":2,"170":1,"176":1,"177":1,"178":1,"179":1,"180":2,"183":1,"189":1,"190":1,"204":1,"206":1,"207":4,"209":1,"217":1,"219":1,"221":1,"222":1,"230":1,"249":2,"258":2,"260":1,"271":1,"277":1,"280":1,"288":2,"289":1}}],["mp3",{"2":{"279":2}}],["m",{"2":{"42":2}}],["my",{"2":{"60":2,"193":1,"194":1,"201":1}}],["mybot",{"2":{"42":1,"43":1}}],["myself",{"2":{"19":1}}],["mirrors",{"2":{"255":1}}],["mirror=true",{"2":{"249":2,"251":1}}],["mirror",{"0":{"251":1},"2":{"249":1,"251":1,"253":1,"255":1}}],["midnight",{"2":{"190":2}}],["migration",{"2":{"122":1}}],["mini",{"2":{"233":1}}],["minimum",{"2":{"36":1,"250":1}}],["minute",{"2":{"190":1}}],["minutes",{"2":{"91":1,"153":2,"190":1,"196":1,"232":1,"252":1}}],["microsoft",{"2":{"277":1,"289":1}}],["mic",{"2":{"19":1}}],["must",{"2":{"116":1,"250":1,"255":1,"268":1,"269":1}}],["much",{"2":{"19":1,"182":1}}],["multilingual",{"2":{"247":2,"262":1,"268":1}}],["multiple",{"2":{"3":1,"7":1,"22":1,"23":1,"92":1,"104":1,"114":1,"163":2,"176":1,"204":1,"246":1,"247":1,"262":1}}],["multi",{"0":{"3":1,"4":1,"7":1,"11":1},"2":{"1":1,"6":1,"19":1,"23":1,"24":1,"243":1}}],["mcpservers",{"2":{"163":1}}],["mcp",{"0":{"12":1,"157":1,"231":2},"1":{"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1},"2":{"8":2,"12":2,"15":1,"23":1,"32":1,"89":2,"150":1,"156":1,"157":1,"158":2,"159":2,"161":2,"162":2,"164":1,"165":3,"224":2,"231":3}}],["mounts",{"2":{"250":1}}],["morning",{"2":{"189":1,"194":1,"230":2}}],["more",{"2":{"8":1,"10":1,"12":1,"19":3,"23":2,"24":1,"25":1,"45":1,"95":1,"104":1,"130":1,"133":1,"155":1,"182":1,"247":1}}],["move",{"2":{"145":1}}],["mono",{"2":{"279":3}}],["monday",{"2":{"190":1}}],["month",{"2":{"190":3}}],["months",{"2":{"128":1}}],["monitor",{"2":{"150":1,"183":1}}],["monitoring",{"0":{"154":1},"1":{"155":1},"2":{"142":1}}],["monaco",{"2":{"148":1,"220":1}}],["mobile",{"2":{"19":1,"91":1,"94":1,"97":2}}],["moment",{"2":{"19":3}}],["most",{"2":{"14":1,"19":1,"59":1,"90":1,"127":1,"178":1,"239":1}}],["modalities",{"2":{"173":1}}],["modify",{"2":{"114":1,"148":1,"181":1,"221":1,"226":1}}],["modes",{"0":{"261":1},"1":{"262":1},"2":{"246":1,"247":1,"257":1,"259":1,"260":1}}],["mode",{"0":{"37":1,"262":1,"267":1,"268":1,"269":1},"2":{"37":1,"110":1,"178":1,"183":1,"186":1,"247":1,"261":1,"262":2,"264":2}}],["modern",{"2":{"15":1}}],["modelcontextprotocol",{"2":{"160":1}}],["models",{"0":{"170":1,"174":1,"233":1},"2":{"10":1,"15":1,"18":1,"21":1,"89":1,"91":1,"170":4,"172":2,"173":1,"175":1,"224":1,"244":1,"247":1,"287":1}}],["model",{"0":{"166":1,"172":1,"173":1,"233":1,"279":1},"1":{"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":2,"174":2,"175":1},"2":{"10":1,"11":2,"12":1,"20":1,"23":1,"90":2,"91":5,"100":1,"129":2,"133":1,"153":2,"157":1,"166":1,"170":1,"172":1,"173":5,"174":2,"186":1,"224":1,"225":1,"232":4,"233":8,"237":3,"247":5,"261":1,"262":2,"264":2,"268":1,"269":1,"278":1,"279":1,"280":2,"281":1,"287":3,"288":3}}],["modular",{"2":{"8":1,"222":1}}],["md",{"2":{"8":2,"148":1,"241":1}}],["mention",{"0":{"242":1},"2":{"242":2}}],["me",{"2":{"193":1,"225":1}}],["meaning",{"2":{"190":1}}],["mean",{"2":{"130":1}}],["means",{"2":{"75":1}}],["merges",{"2":{"133":1}}],["merged",{"2":{"131":1}}],["merge",{"2":{"129":1}}],["merging",{"2":{"128":1}}],["medium",{"2":{"91":1,"232":1}}],["media",{"2":{"45":1,"69":1}}],["metaphors",{"2":{"19":1}}],["message",{"2":{"29":1,"30":1,"32":1,"36":1,"37":2,"44":1,"45":1,"50":1,"51":2,"57":1,"63":1,"69":1,"72":1,"73":1,"77":1,"178":1,"195":1,"205":1,"209":1,"214":1}}],["messages",{"2":{"4":1,"8":1,"11":1,"30":1,"36":1,"39":1,"40":1,"41":1,"45":2,"51":1,"56":2,"57":2,"67":1,"69":2,"84":1,"109":1,"110":1,"173":1,"180":1,"206":1,"209":1}}],["messaging",{"2":{"7":4,"8":1,"12":1,"39":4,"41":1,"64":1,"86":1,"103":1,"104":1}}],["mem0",{"0":{"282":1,"283":1,"284":1,"285":1},"1":{"283":1,"284":1,"285":1,"286":1},"2":{"177":1,"257":2,"259":2,"282":3,"283":1,"284":3,"285":1,"286":2}}],["memories",{"0":{"180":1},"2":{"6":1,"8":1,"14":1,"89":1,"127":1,"128":4,"129":1,"130":1,"131":1,"133":3,"134":1,"178":2,"179":1,"181":2,"182":2,"183":2,"185":1,"186":2,"215":1,"258":1,"264":1,"267":1,"271":4}}],["memory",{"0":{"6":1,"14":1,"127":1,"133":1,"176":1,"178":1,"182":1,"234":2,"256":1,"260":1,"261":1,"270":1,"271":1,"272":1,"282":1},"1":{"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"257":1,"258":1,"259":1,"261":1,"262":2,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"273":1,"274":1,"275":1,"276":1,"283":1,"284":1,"285":1,"286":1},"2":{"1":2,"6":2,"8":1,"11":1,"12":1,"14":2,"19":1,"20":1,"22":1,"23":3,"24":1,"25":1,"86":1,"89":3,"90":3,"91":5,"93":1,"102":3,"127":3,"128":1,"129":2,"130":2,"133":3,"134":3,"156":1,"172":1,"176":1,"177":6,"178":1,"179":1,"180":3,"181":1,"182":2,"183":2,"184":5,"185":2,"186":4,"215":1,"224":2,"234":2,"243":2,"246":2,"247":5,"256":5,"257":4,"258":3,"259":6,"260":8,"263":2,"264":2,"270":2,"271":5,"272":3,"273":2,"275":1,"276":4,"282":2,"283":2,"285":1,"286":4}}],["memohai",{"2":{"250":1}}],["memoh123",{"2":{"249":1,"255":1}}],["memoh",{"0":{"0":1,"1":1,"17":1,"31":1,"43":1,"49":1,"55":1,"61":1,"65":1,"243":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"244":1},"2":{"1":1,"16":1,"18":1,"20":1,"21":1,"22":1,"24":2,"25":3,"26":1,"27":1,"31":1,"33":1,"37":2,"39":2,"40":1,"41":1,"43":1,"47":1,"49":1,"50":2,"53":1,"55":1,"59":2,"60":2,"61":1,"62":2,"64":1,"65":1,"66":2,"70":1,"94":1,"101":1,"104":1,"109":1,"110":2,"113":1,"126":1,"135":1,"143":1,"157":1,"160":1,"162":3,"164":1,"166":1,"170":2,"172":1,"176":1,"178":1,"190":1,"197":1,"207":1,"216":1,"223":1,"243":1,"244":2,"245":1,"246":1,"249":10,"250":2,"251":1,"255":2,"256":1,"257":2,"260":2,"287":1}}],["members",{"2":{"3":1,"27":1,"29":1}}],["member",{"2":{"1":1,"73":1,"243":1}}],["macos",{"2":{"250":1}}],["machine",{"2":{"123":1,"124":1,"146":1}}],["masked",{"2":{"247":1}}],["marked",{"2":{"226":2}}],["markdown",{"0":{"217":1},"1":{"218":1},"2":{"7":1,"45":1,"49":2,"51":1,"59":1,"63":1,"89":1,"217":1}}],["may",{"2":{"128":1,"178":1,"201":1,"252":1}}],["mapped",{"2":{"109":1}}],["making",{"2":{"25":2}}],["make",{"2":{"21":1,"177":1}}],["makes",{"2":{"18":1,"21":1,"186":1}}],["matters",{"2":{"75":1}}],["mattered",{"2":{"19":1}}],["match",{"2":{"250":1,"255":1}}],["matching",{"2":{"75":2}}],["matches",{"2":{"72":1,"73":1,"75":2,"91":1}}],["matrix",{"0":{"41":1,"42":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1},"2":{"1":1,"7":1,"39":2,"41":3,"42":5,"43":5,"44":1,"45":1,"46":1,"89":1,"104":1,"106":1,"243":1,"244":1}}],["managing",{"0":{"76":1,"98":1,"121":1,"132":1,"146":1,"155":1,"171":1,"174":1,"181":1,"202":1,"211":1,"219":1,"265":1},"1":{"77":1,"78":1,"79":1,"212":1,"213":1,"214":1,"220":1,"221":1},"2":{"282":1}}],["managed",{"2":{"207":1}}],["manages",{"2":{"206":1,"256":1}}],["managers",{"2":{"114":1}}],["manager",{"2":{"89":1,"149":1}}],["manage",{"0":{"230":1,"231":1,"233":1,"234":1,"235":1,"236":1},"2":{"3":1,"8":2,"10":1,"88":1,"96":1,"102":1,"115":1,"126":1,"134":1,"137":1,"140":1,"143":1,"150":1,"179":1,"219":1,"222":1,"224":6,"258":1,"259":1,"271":1}}],["management",{"0":{"3":1,"86":1,"113":1,"143":1,"176":1},"1":{"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1},"2":{"8":1,"23":1,"38":1,"54":2,"89":1,"100":1,"102":1,"134":1,"135":1,"259":1,"271":1,"276":2,"286":2}}],["many",{"2":{"19":1,"116":1,"128":1}}],["manifesto",{"2":{"18":1}}],["manually",{"2":{"101":1,"130":1,"150":1,"164":1,"170":1,"180":1,"271":1}}],["manual",{"0":{"130":1,"250":1},"1":{"251":1},"2":{"13":1,"16":1,"66":1,"169":1,"187":1,"260":1}}],["max",{"2":{"13":1,"189":1,"194":1,"195":1,"196":1}}],["mail",{"2":{"142":1}}],["mailgun",{"2":{"7":1,"39":1,"136":1,"138":1}}],["mainland",{"0":{"251":1},"2":{"249":1,"251":1,"255":1}}],["maintenance",{"2":{"129":1,"187":1}}],["maintain",{"2":{"114":1,"206":1}}],["maintains",{"2":{"9":1,"205":1}}],["main",{"2":{"91":1,"153":1,"245":1,"246":1}}],["affecting",{"2":{"113":1}}],["after",{"0":{"271":1},"2":{"67":1,"78":1,"90":1,"97":1,"99":1,"102":1,"111":1,"133":1,"162":1,"252":1,"259":1,"264":1,"274":1,"284":1}}],["avatar",{"2":{"87":1}}],["available",{"0":{"257":1,"289":1},"2":{"10":1,"101":1,"164":1,"170":2,"188":1,"215":1,"224":1,"226":1,"228":1,"253":1,"279":1,"290":1}}],["able",{"2":{"243":1}}],["above",{"2":{"75":1}}],["about",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1},"2":{"26":1,"117":1,"244":1}}],["abcdefghijklmnopqrstuvwxyz",{"2":{"60":1}}],["adjustment",{"2":{"279":1}}],["advanced",{"2":{"218":1}}],["admin123",{"2":{"249":1,"252":1}}],["administrative",{"2":{"223":1}}],["admins",{"2":{"72":1,"82":1}}],["admin",{"2":{"54":1,"75":1,"249":3,"250":2,"252":1,"253":2}}],["additional",{"2":{"201":1,"225":1,"267":1}}],["adding",{"0":{"77":1,"108":1,"140":1,"173":1,"201":1,"220":1},"2":{"170":1}}],["address",{"2":{"136":1,"140":1,"141":1,"253":2}}],["addresses",{"2":{"128":1}}],["add",{"0":{"65":1},"2":{"30":1,"31":1,"37":2,"40":1,"43":1,"49":1,"55":1,"61":1,"65":1,"77":1,"82":1,"83":1,"84":1,"85":1,"96":1,"108":1,"138":1,"140":1,"163":3,"168":1,"173":1,"201":1,"220":1,"251":1,"263":1,"273":1,"278":1,"283":1,"288":1}}],["adapter",{"2":{"7":1}}],["a2a",{"2":{"24":1}}],["am",{"2":{"189":1,"190":2,"193":1}}],["ambient",{"2":{"19":1}}],["amp",{"0":{"4":1},"2":{"34":1,"38":1}}],["appear",{"2":{"63":1,"207":1}}],["apps",{"2":{"54":1}}],["appsecret",{"2":{"48":2,"49":1}}],["appid",{"2":{"48":1,"49":1}}],["approved",{"2":{"38":1}}],["approval",{"2":{"38":1,"48":1}}],["applied",{"2":{"75":2}}],["applies",{"2":{"72":1,"77":2}}],["applications",{"2":{"30":1,"103":1}}],["application",{"0":{"28":1},"2":{"28":1,"42":1,"54":1}}],["apply",{"2":{"36":1,"148":1}}],["app",{"0":{"34":1,"38":1},"2":{"19":1,"25":1,"34":4,"37":3,"38":1,"40":2,"54":1,"110":1,"250":1}}],["apis",{"2":{"22":1}}],["api",{"0":{"194":1},"2":{"11":4,"40":1,"42":1,"60":2,"61":1,"66":1,"109":1,"138":1,"167":1,"168":3,"169":1,"170":1,"171":1,"173":1,"178":1,"186":1,"194":2,"198":1,"201":2,"247":3,"252":1,"253":1,"257":3,"259":1,"261":1,"262":2,"272":1,"274":3,"276":1,"277":2,"282":1,"284":4,"286":1,"289":2}}],["aggregator",{"2":{"199":1}}],["aggressive",{"2":{"130":1}}],["again",{"2":{"48":1,"66":1}}],["agreement",{"2":{"19":1}}],["agent2agent",{"2":{"24":1}}],["agents",{"2":{"9":1,"18":1,"19":1,"21":1}}],["agent",{"0":{"8":1,"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"1":1,"18":1,"19":1,"24":1,"25":1,"86":1,"97":2,"188":1,"189":1,"195":2,"223":1,"243":1,"245":1,"246":1}}],["archive",{"2":{"123":2,"124":2}}],["architecture",{"0":{"246":1},"1":{"247":1},"2":{"7":1}}],["arguments",{"2":{"160":2,"225":2}}],["argument",{"2":{"101":1}}],["aren",{"2":{"151":1}}],["are",{"2":{"39":1,"45":2,"50":1,"57":1,"62":1,"75":2,"78":1,"84":1,"99":1,"101":1,"108":1,"109":1,"124":1,"128":1,"133":1,"142":1,"162":1,"178":1,"181":1,"186":1,"192":1,"206":2,"207":2,"209":1,"215":3,"216":1,"217":1,"222":1,"223":1,"226":3,"246":2,"252":1,"264":1,"267":1,"276":1,"286":1}}],["around",{"2":{"19":1}}],["aloud",{"2":{"277":1,"278":1,"279":1,"287":1,"289":1}}],["along",{"2":{"195":1}}],["alternative",{"2":{"272":1}}],["alerts",{"2":{"155":1}}],["alert",{"2":{"154":1}}],["also",{"2":{"21":1,"63":1,"130":1,"141":1,"150":1,"162":1,"164":1,"194":1,"250":1,"255":1}}],["already",{"2":{"19":1,"177":1,"189":1}}],["always",{"0":{"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"18":1,"19":2,"21":1,"22":1,"25":2,"75":1,"218":1,"246":1}}],["allowed",{"2":{"72":1,"75":1,"81":1}}],["allow",{"2":{"70":1,"72":2,"73":1,"74":1,"75":1,"77":1,"79":1,"81":1,"82":1,"83":1,"84":1,"85":1,"91":1,"118":1,"187":1,"222":1,"232":1}}],["allows",{"2":{"27":1,"33":1,"41":1,"47":1,"53":1,"64":1,"97":1,"110":1,"113":1,"135":1,"147":1,"151":1,"176":1,"197":1}}],["allowing",{"2":{"1":1,"103":1,"142":1,"157":1,"205":1}}],["all",{"2":{"15":1,"16":1,"70":1,"73":3,"77":1,"91":1,"93":2,"131":1,"133":1,"141":1,"164":1,"183":2,"191":1,"208":1,"209":1,"212":1,"215":2,"224":1,"226":1,"228":1,"230":2,"231":2,"232":1,"233":1,"234":1,"235":1,"236":1,"237":2,"238":3,"239":1,"240":1,"241":2,"245":1,"249":2,"253":1}}],["audit",{"2":{"131":1,"141":1,"154":1}}],["auditing",{"2":{"126":1}}],["audio",{"2":{"8":1,"173":1,"279":3,"287":1}}],["auth",{"2":{"250":1,"253":1}}],["authorization",{"2":{"162":1,"169":1}}],["authorized",{"2":{"82":1,"169":1}}],["authorize",{"2":{"30":1,"162":1}}],["authentication",{"0":{"162":1,"169":1},"2":{"11":1,"12":1,"55":1,"161":1,"162":2,"167":1,"168":1,"169":1,"274":1,"284":1}}],["autonomy",{"0":{"152":1}}],["autonomous",{"2":{"9":1,"91":1,"151":1,"156":1,"196":1,"207":1,"215":1}}],["automate",{"2":{"187":1}}],["automated",{"2":{"127":1}}],["automation",{"0":{"188":1},"2":{"8":1,"90":2,"91":1,"95":1,"196":1,"246":1,"250":1}}],["automatic",{"2":{"6":1,"11":1,"14":1,"91":1,"129":1,"152":1,"260":1}}],["automatically",{"2":{"6":1,"13":1,"43":1,"44":1,"66":1,"67":1,"162":1,"164":2,"165":1,"170":1,"186":1,"193":1,"195":1,"204":1,"207":1,"251":1,"278":1}}],["auto",{"2":{"6":1,"43":1,"44":1,"212":1,"249":1,"288":1}}],["attachment",{"2":{"39":1,"45":1,"59":1}}],["attachments",{"2":{"7":1,"32":1,"51":1,"63":1,"69":1}}],["attach",{"2":{"30":1}}],["attempt",{"2":{"18":1}}],["at",{"2":{"8":1,"9":1,"13":1,"23":1,"36":1,"73":1,"83":1,"90":1,"93":1,"101":1,"141":1,"152":1,"163":1,"166":2,"168":1,"189":1,"190":4,"193":1,"247":1,"250":1}}],["ask",{"2":{"193":1}}],["asia",{"2":{"97":1}}],["assist",{"2":{"218":1}}],["assigning",{"0":{"99":1,"203":1,"270":1,"275":1,"280":1,"285":1},"2":{"281":1}}],["assigned",{"2":{"91":1,"94":1,"133":1,"156":1,"178":1,"186":1,"204":1,"259":1,"271":1,"276":1,"286":1}}],["assignment",{"2":{"11":1,"287":1}}],["assign",{"2":{"8":1,"258":1}}],["associated",{"2":{"93":1,"140":1}}],["as",{"0":{"136":1,"217":1},"1":{"218":1},"2":{"6":1,"21":1,"22":3,"23":1,"24":2,"25":1,"42":1,"45":1,"63":1,"91":1,"94":1,"97":2,"100":1,"104":1,"114":1,"117":1,"127":1,"129":1,"133":1,"142":1,"186":1,"207":1,"209":1,"217":1,"218":1,"222":1,"226":1,"272":1,"274":1,"276":1,"278":1,"284":1,"286":1}}],["acl",{"2":{"70":1,"72":2,"73":1,"75":1,"81":1,"82":1,"83":1,"84":1,"89":1,"91":2,"232":1}}],["actual",{"2":{"258":1,"271":1}}],["actually",{"2":{"18":1,"19":2}}],["actions",{"0":{"116":1},"2":{"100":1,"142":1,"151":1,"187":1,"223":1}}],["action",{"2":{"93":2,"100":1,"146":1,"154":1,"225":3}}],["activities",{"2":{"156":1}}],["activity",{"2":{"9":1,"91":1,"196":1,"207":2,"212":1,"215":1}}],["active",{"2":{"112":1,"117":1,"126":1,"163":1,"164":1,"165":1,"177":1,"189":1,"209":1,"212":1}}],["activate",{"2":{"40":1,"112":1}}],["act",{"2":{"42":1}}],["acts",{"2":{"22":1,"95":1,"104":1,"114":1}}],["across",{"2":{"4":1,"114":1,"176":1,"208":1,"215":1,"277":1,"279":1,"289":1}}],["accurate",{"2":{"128":1,"204":1}}],["accumulate",{"2":{"128":1,"182":1}}],["accumulates",{"2":{"127":1}}],["accumulating",{"2":{"19":1}}],["accept",{"2":{"44":1}}],["access",{"0":{"70":1,"76":1,"84":1,"85":1,"252":1},"1":{"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":2,"78":2,"79":2,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"1":1,"8":2,"23":1,"32":1,"36":1,"39":1,"42":2,"43":2,"45":1,"70":2,"73":2,"76":2,"79":1,"89":2,"91":1,"92":1,"94":1,"158":1,"162":1,"193":1,"226":1,"243":1,"251":1}}],["account",{"0":{"42":1},"2":{"42":3,"43":1,"48":2,"50":1,"62":1,"253":1}}],["accounts",{"2":{"3":1}}],["answer",{"2":{"204":1}}],["another",{"2":{"135":1}}],["anchor",{"2":{"19":1}}],["annoying",{"2":{"19":1}}],["anthropic",{"2":{"11":1,"167":1,"173":1}}],["anyone",{"0":{"81":1},"2":{"42":1,"72":1}}],["any",{"2":{"9":2,"10":1,"39":1,"41":1,"42":1,"156":1,"187":1,"188":1,"195":1,"223":1}}],["an",{"0":{"17":1,"273":1,"274":1,"275":1,"278":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"1":1,"19":3,"22":1,"24":2,"25":3,"40":1,"42":1,"60":2,"70":1,"72":1,"73":2,"74":1,"75":1,"77":1,"79":1,"84":1,"85":1,"86":1,"124":1,"127":1,"131":2,"136":1,"141":2,"149":1,"154":1,"164":1,"165":1,"167":2,"177":1,"178":1,"184":1,"205":1,"243":1,"247":2,"257":1,"262":1,"269":1,"272":1}}],["and",{"0":{"122":1,"135":1,"141":1,"145":1,"147":1,"154":1,"166":1,"181":1,"221":1,"232":1},"1":{"123":1,"124":1,"125":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"148":1,"149":1,"155":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1},"2":{"1":4,"3":1,"4":2,"5":3,"6":2,"7":1,"8":11,"10":2,"11":2,"12":2,"13":1,"14":2,"15":2,"18":1,"19":6,"21":4,"22":3,"23":7,"24":6,"25":4,"27":1,"28":2,"29":1,"30":2,"31":2,"32":1,"34":3,"36":2,"37":3,"38":2,"39":2,"40":2,"41":1,"43":2,"44":1,"45":2,"48":2,"49":3,"50":2,"51":3,"54":1,"55":2,"56":1,"59":1,"60":1,"61":2,"62":2,"63":1,"65":1,"66":1,"69":1,"72":1,"77":1,"78":1,"82":1,"86":2,"89":7,"90":2,"91":3,"93":3,"94":2,"95":3,"97":1,"98":1,"99":1,"100":1,"104":1,"106":1,"108":2,"109":1,"110":1,"112":2,"113":1,"114":1,"116":1,"117":1,"118":1,"120":1,"121":1,"122":1,"126":1,"127":2,"129":1,"133":1,"135":2,"140":2,"142":1,"144":1,"146":1,"148":2,"150":2,"152":1,"157":1,"158":1,"160":1,"162":1,"163":2,"164":1,"165":1,"166":1,"167":1,"170":2,"171":1,"172":1,"175":1,"176":1,"178":3,"182":1,"184":1,"186":1,"188":1,"189":1,"190":2,"191":1,"193":2,"194":1,"195":1,"196":1,"197":1,"199":1,"202":1,"203":2,"204":1,"205":2,"207":1,"209":1,"216":2,"217":2,"218":3,"220":1,"222":1,"223":1,"224":1,"228":1,"242":1,"243":1,"244":3,"245":2,"246":3,"249":4,"250":1,"251":1,"252":1,"253":5,"256":3,"257":1,"258":1,"260":4,"262":1,"264":2,"265":1,"267":1,"268":1,"269":1,"270":1,"271":1,"274":1,"275":1,"276":1,"277":1,"281":1,"282":1,"284":1,"285":1,"286":1,"287":1,"288":3}}],["ai",{"2":{"1":2,"7":1,"11":1,"15":1,"18":1,"19":2,"20":1,"21":1,"23":1,"25":1,"39":2,"86":1,"167":1,"172":1,"173":1,"199":1,"223":1,"243":2,"245":1,"246":1,"284":1}}],["a",{"0":{"28":1,"34":1,"42":1,"48":1,"54":1,"60":1,"87":1,"93":1,"96":1,"97":1,"99":2,"108":1,"119":1,"120":1,"136":1,"138":1,"140":1,"168":1,"173":1,"201":1,"203":2,"208":1,"220":1,"263":1,"264":1,"270":2,"275":1,"280":1,"283":1,"284":1,"285":2},"1":{"98":1,"209":1,"210":1,"265":1},"2":{"1":1,"5":1,"6":1,"8":1,"9":1,"10":2,"11":1,"18":3,"19":11,"20":1,"22":2,"23":1,"24":4,"25":3,"28":2,"34":1,"37":2,"38":1,"40":1,"42":3,"44":2,"48":1,"50":1,"54":1,"60":3,"62":1,"64":1,"66":3,"72":2,"73":3,"75":1,"76":1,"77":7,"79":6,"85":1,"86":1,"87":1,"88":1,"90":1,"93":1,"94":6,"95":2,"96":1,"97":1,"98":2,"100":1,"102":1,"104":2,"109":1,"110":1,"111":1,"112":1,"113":1,"116":1,"118":1,"119":2,"121":2,"123":1,"125":1,"126":1,"127":1,"130":1,"131":1,"136":5,"142":1,"144":2,"145":1,"146":2,"148":1,"149":1,"152":3,"154":2,"156":3,"158":1,"160":2,"161":1,"162":1,"163":3,"164":1,"167":2,"168":1,"169":2,"170":2,"171":1,"172":3,"173":2,"174":2,"175":1,"177":3,"178":2,"180":1,"182":2,"188":5,"189":3,"193":5,"195":1,"198":4,"201":1,"202":1,"204":3,"205":4,"206":4,"207":6,"208":1,"209":3,"210":2,"213":1,"214":1,"215":2,"216":1,"217":2,"218":1,"220":2,"221":2,"224":1,"225":2,"228":1,"229":1,"242":1,"243":1,"247":3,"249":1,"253":1,"256":3,"258":2,"263":1,"264":1,"265":2,"271":1,"272":3,"273":1,"274":2,"280":1,"281":1,"282":1,"283":1,"284":2,"287":4,"288":2}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/VPLocalSearchBox.Bu0XnV3q.js b/assets/chunks/VPLocalSearchBox.D8eiblz9.js similarity index 99% rename from assets/chunks/VPLocalSearchBox.Bu0XnV3q.js rename to assets/chunks/VPLocalSearchBox.D8eiblz9.js index 244c8e7c..fbcf83ca 100644 --- a/assets/chunks/VPLocalSearchBox.Bu0XnV3q.js +++ b/assets/chunks/VPLocalSearchBox.D8eiblz9.js @@ -1,4 +1,4 @@ -var At=Object.defineProperty;var Ct=(a,e,t)=>e in a?At(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Me=(a,e,t)=>Ct(a,typeof e!="symbol"?e+"":e,t);import{V as nt,q as Be,ah as Mt,h as be,ai as rt,aj as Lt,ak as Dt,al as Pt,G as ce,d as zt,am as it,p as he,an as Vt,ao as jt,s as $t,ap as Bt,v as Le,P as ve,O as _e,aq as Wt,ar as Kt,W as Jt,R as qt,$ as Ut,o as q,b as Ht,j as T,a0 as Gt,k as P,as as Qt,at as Yt,au as Zt,c as Q,n as st,e as xe,B as at,F as ot,a as pe,t as me,av as Xt,aw as lt,ax as en,a5 as tn,aa as nn,ay as rn,_ as sn}from"./framework.CvgP6Fyv.js";import{u as an,c as on}from"./theme.CrSynxcK.js";const ln={root:()=>nt(()=>import("./@localSearchIndexroot.Az8cqTXO.js"),[]),zh:()=>nt(()=>import("./@localSearchIndexzh.dDuBvO1t.js"),[])};/*! +var At=Object.defineProperty;var Ct=(a,e,t)=>e in a?At(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Me=(a,e,t)=>Ct(a,typeof e!="symbol"?e+"":e,t);import{V as nt,q as Be,ah as Mt,h as be,ai as rt,aj as Lt,ak as Dt,al as Pt,G as ce,d as zt,am as it,p as he,an as Vt,ao as jt,s as $t,ap as Bt,v as Le,P as ve,O as _e,aq as Wt,ar as Kt,W as Jt,R as qt,$ as Ut,o as q,b as Ht,j as T,a0 as Gt,k as P,as as Qt,at as Yt,au as Zt,c as Q,n as st,e as xe,B as at,F as ot,a as pe,t as me,av as Xt,aw as lt,ax as en,a5 as tn,aa as nn,ay as rn,_ as sn}from"./framework.DXGyWiRo.js";import{u as an,c as on}from"./theme.BY8ac8ik.js";const ln={root:()=>nt(()=>import("./@localSearchIndexroot.r9JNz3Ex.js"),[]),zh:()=>nt(()=>import("./@localSearchIndexzh.dDuBvO1t.js"),[])};/*! * tabbable 6.4.0 * @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE */var bt=["input:not([inert]):not([inert] *)","select:not([inert]):not([inert] *)","textarea:not([inert]):not([inert] *)","a[href]:not([inert]):not([inert] *)","button:not([inert]):not([inert] *)","[tabindex]:not(slot):not([inert]):not([inert] *)","audio[controls]:not([inert]):not([inert] *)","video[controls]:not([inert]):not([inert] *)",'[contenteditable]:not([contenteditable="false"]):not([inert]):not([inert] *)',"details>summary:first-of-type:not([inert]):not([inert] *)","details:not([inert]):not([inert] *)"],ke=bt.join(","),yt=typeof Element>"u",ae=yt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Ne=!yt&&Element.prototype.getRootNode?function(a){var e;return a==null||(e=a.getRootNode)===null||e===void 0?void 0:e.call(a)}:function(a){return a==null?void 0:a.ownerDocument},Fe=function(e,t){var n;t===void 0&&(t=!0);var r=e==null||(n=e.getAttribute)===null||n===void 0?void 0:n.call(e,"inert"),s=r===""||r==="true",i=s||t&&e&&(typeof e.closest=="function"?e.closest("[inert]"):Fe(e.parentNode));return i},cn=function(e){var t,n=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return n===""||n==="true"},wt=function(e,t,n){if(Fe(e))return[];var r=Array.prototype.slice.apply(e.querySelectorAll(ke));return t&&ae.call(e,ke)&&r.unshift(e),r=r.filter(n),r},Re=function(e,t,n){for(var r=[],s=Array.from(e);s.length;){var i=s.shift();if(!Fe(i,!1))if(i.tagName==="SLOT"){var o=i.assignedElements(),l=o.length?o:i.children,c=Re(l,!0,n);n.flatten?r.push.apply(r,c):r.push({scopeParent:i,candidates:c})}else{var h=ae.call(i,ke);h&&n.filter(i)&&(t||!e.includes(i))&&r.push(i);var m=i.shadowRoot||typeof n.getShadowRoot=="function"&&n.getShadowRoot(i),p=!Fe(m,!1)&&(!n.shadowRootFilter||n.shadowRootFilter(i));if(m&&p){var b=Re(m===!0?i.children:m.children,!0,n);n.flatten?r.push.apply(r,b):r.push({scopeParent:i,candidates:b})}else s.unshift.apply(s,i.children)}}return r},St=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},se=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||cn(e))&&!St(e)?0:e.tabIndex},un=function(e,t){var n=se(e);return n<0&&t&&!St(e)?0:n},dn=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},_t=function(e){return e.tagName==="INPUT"},fn=function(e){return _t(e)&&e.type==="hidden"},hn=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(n){return n.tagName==="SUMMARY"});return t},vn=function(e,t){for(var n=0;nsummary:first-of-type"),o=i?e.parentElement:e;if(ae.call(o,"details:not([open]) *"))return!0;if(!n||n==="full"||n==="full-native"||n==="legacy-full"){if(typeof r=="function"){for(var l=e;e;){var c=e.parentElement,h=Ne(e);if(c&&!c.shadowRoot&&r(c)===!0)return ct(e);e.assignedSlot?e=e.assignedSlot:!c&&h!==e.ownerDocument?e=h.host:e=c}e=l}if(bn(e))return!e.getClientRects().length;if(n!=="legacy-full")return!0}else if(n==="non-zero-area")return ct(e);return!1},wn=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var n=0;n=0)},xt=function(e){var t=[],n=[];return e.forEach(function(r,s){var i=!!r.scopeParent,o=i?r.scopeParent:r,l=un(o,i),c=i?xt(r.candidates):o;l===0?i?t.push.apply(t,c):t.push(o):n.push({documentOrder:s,tabIndex:l,item:r,isScope:i,content:c})}),n.sort(dn).reduce(function(r,s){return s.isScope?r.push.apply(r,s.content):r.push(s.content),r},[]).concat(t)},_n=function(e,t){t=t||{};var n;return t.getShadowRoot?n=Re([e],t.includeContainer,{filter:We.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:Sn}):n=wt(e,t.includeContainer,We.bind(null,t)),xt(n)},xn=function(e,t){t=t||{};var n;return t.getShadowRoot?n=Re([e],t.includeContainer,{filter:Oe.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):n=wt(e,t.includeContainer,Oe.bind(null,t)),n},oe=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ae.call(e,ke)===!1?!1:We(t,e)},Tn=bt.concat("iframe:not([inert]):not([inert] *)").join(","),De=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ae.call(e,Tn)===!1?!1:Oe(t,e)};/*! @@ -6,4 +6,4 @@ var At=Object.defineProperty;var Ct=(a,e,t)=>e in a?At(a,e,{enumerable:!0,config * @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE */function Ke(a,e){(e==null||e>a.length)&&(e=a.length);for(var t=0,n=Array(e);t=a.length?{done:!0}:{done:!1,value:a[n++]}},e:function(l){throw l},f:r}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var s,i=!0,o=!1;return{s:function(){t=t.call(a)},n:function(){var l=t.next();return i=l.done,l},e:function(l){o=!0,s=l},f:function(){try{i||t.return==null||t.return()}finally{if(o)throw s}}}}function In(a,e,t){return(e=On(e))in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function kn(a){if(typeof Symbol<"u"&&a[Symbol.iterator]!=null||a["@@iterator"]!=null)return Array.from(a)}function Nn(){throw new TypeError(`Invalid attempt to spread non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function dt(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter(function(r){return Object.getOwnPropertyDescriptor(a,r).enumerable})),t.push.apply(t,n)}return t}function ft(a){for(var e=1;e0?e[e.length-1]:null},activateTrap:function(e,t){var n=U.getActiveTrap(e);t!==n&&U.pauseTrap(e);var r=e.indexOf(t);r===-1||e.splice(r,1),e.push(t)},deactivateTrap:function(e,t){var n=e.indexOf(t);n!==-1&&e.splice(n,1),U.unpauseTrap(e)},pauseTrap:function(e){var t=U.getActiveTrap(e);t==null||t._setPausedState(!0)},unpauseTrap:function(e){var t=U.getActiveTrap(e);t&&!t._isManuallyPaused()&&t._setPausedState(!1)}},An=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},Cn=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},ye=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Mn=function(e){return ye(e)&&!e.shiftKey},Ln=function(e){return ye(e)&&e.shiftKey},ht=function(e){return setTimeout(e,0)},ge=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r1&&arguments[1]!==void 0?arguments[1]:{},g=f.hasFallback,E=g===void 0?!1:g,x=f.params,I=x===void 0?[]:x,S=s[u];if(typeof S=="function"&&(S=S.apply(void 0,Fn(I))),S===!0&&(S=void 0),!S){if(S===void 0||S===!1)return S;throw new Error("`".concat(u,"` was specified but was not a node, or did not return a node"))}var v=S;if(typeof S=="string"){try{v=n.querySelector(S)}catch(d){throw new Error("`".concat(u,'` appears to be an invalid selector; error="').concat(d.message,'"'))}if(!v&&!E)throw new Error("`".concat(u,"` as selector refers to no known node"))}return v},m=function(){var u=h("initialFocus",{hasFallback:!0});if(u===!1)return!1;if(u===void 0||u&&!De(u,s.tabbableOptions))if(c(n.activeElement)>=0)u=n.activeElement;else{var f=i.tabbableGroups[0],g=f&&f.firstTabbableNode;u=g||h("fallbackFocus")}else u===null&&(u=h("fallbackFocus"));if(!u)throw new Error("Your focus-trap needs to have at least one focusable element");return u},p=function(){if(i.containerGroups=i.containers.map(function(u){var f=_n(u,s.tabbableOptions),g=xn(u,s.tabbableOptions),E=f.length>0?f[0]:void 0,x=f.length>0?f[f.length-1]:void 0,I=g.find(function(d){return oe(d)}),S=g.slice().reverse().find(function(d){return oe(d)}),v=!!f.find(function(d){return se(d)>0});return{container:u,tabbableNodes:f,focusableNodes:g,posTabIndexesFound:v,firstTabbableNode:E,lastTabbableNode:x,firstDomTabbableNode:I,lastDomTabbableNode:S,nextTabbableNode:function(_){var R=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,A=f.indexOf(_);return A<0?R?g.slice(g.indexOf(_)+1).find(function(C){return oe(C)}):g.slice(0,g.indexOf(_)).reverse().find(function(C){return oe(C)}):f[A+(R?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(u){return u.tabbableNodes.length>0}),i.tabbableGroups.length<=0&&!h("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(i.containerGroups.find(function(u){return u.posTabIndexesFound})&&i.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},b=function(u){var f=u.activeElement;if(f)return f.shadowRoot&&f.shadowRoot.activeElement!==null?b(f.shadowRoot):f},w=function(u){if(u!==!1&&u!==b(document)){if(!u||!u.focus){w(m());return}u.focus({preventScroll:!!s.preventScroll}),i.mostRecentlyFocusedNode=u,An(u)&&u.select()}},k=function(u){var f=h("setReturnFocus",{params:[u]});return f||(f===!1?!1:u)},y=function(u){var f=u.target,g=u.event,E=u.isBackward,x=E===void 0?!1:E;f=f||Te(g),p();var I=null;if(i.tabbableGroups.length>0){var S=c(f,g),v=S>=0?i.containerGroups[S]:void 0;if(S<0)x?I=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:I=i.tabbableGroups[0].firstTabbableNode;else if(x){var d=i.tabbableGroups.findIndex(function(F){var V=F.firstTabbableNode;return f===V});if(d<0&&(v.container===f||De(f,s.tabbableOptions)&&!oe(f,s.tabbableOptions)&&!v.nextTabbableNode(f,!1))&&(d=S),d>=0){var _=d===0?i.tabbableGroups.length-1:d-1,R=i.tabbableGroups[_];I=se(f)>=0?R.lastTabbableNode:R.lastDomTabbableNode}else ye(g)||(I=v.nextTabbableNode(f,!1))}else{var A=i.tabbableGroups.findIndex(function(F){var V=F.lastTabbableNode;return f===V});if(A<0&&(v.container===f||De(f,s.tabbableOptions)&&!oe(f,s.tabbableOptions)&&!v.nextTabbableNode(f))&&(A=S),A>=0){var C=A===i.tabbableGroups.length-1?0:A+1,D=i.tabbableGroups[C];I=se(f)>=0?D.firstTabbableNode:D.firstDomTabbableNode}else ye(g)||(I=v.nextTabbableNode(f))}}else I=h("fallbackFocus");return I},O=function(u){var f=Te(u);if(!(c(f,u)>=0)){if(ge(s.clickOutsideDeactivates,u)){o.deactivate({returnFocus:s.returnFocusOnDeactivate});return}ge(s.allowOutsideClick,u)||u.preventDefault()}},L=function(u){var f=Te(u),g=c(f,u)>=0;if(g||f instanceof Document)g&&(i.mostRecentlyFocusedNode=f);else{u.stopImmediatePropagation();var E,x=!0;if(i.mostRecentlyFocusedNode)if(se(i.mostRecentlyFocusedNode)>0){var I=c(i.mostRecentlyFocusedNode),S=i.containerGroups[I].tabbableNodes;if(S.length>0){var v=S.findIndex(function(d){return d===i.mostRecentlyFocusedNode});v>=0&&(s.isKeyForward(i.recentNavEvent)?v+1=0&&(E=S[v-1],x=!1))}}else i.containerGroups.some(function(d){return d.tabbableNodes.some(function(_){return se(_)>0})})||(x=!1);else x=!1;x&&(E=y({target:i.mostRecentlyFocusedNode,isBackward:s.isKeyBackward(i.recentNavEvent)})),w(E||i.mostRecentlyFocusedNode||m())}i.recentNavEvent=void 0},K=function(u){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=u;var g=y({event:u,isBackward:f});g&&(ye(u)&&u.preventDefault(),w(g))},H=function(u){(s.isKeyForward(u)||s.isKeyBackward(u))&&K(u,s.isKeyBackward(u))},W=function(u){Cn(u)&&ge(s.escapeDeactivates,u)!==!1&&(u.preventDefault(),o.deactivate())},j=function(u){var f=Te(u);c(f,u)>=0||ge(s.clickOutsideDeactivates,u)||ge(s.allowOutsideClick,u)||(u.preventDefault(),u.stopImmediatePropagation())},$=function(){if(i.active)return U.activateTrap(r,o),i.delayInitialFocusTimer=s.delayInitialFocus?ht(function(){w(m())}):w(m()),n.addEventListener("focusin",L,!0),n.addEventListener("mousedown",O,{capture:!0,passive:!1}),n.addEventListener("touchstart",O,{capture:!0,passive:!1}),n.addEventListener("click",j,{capture:!0,passive:!1}),n.addEventListener("keydown",H,{capture:!0,passive:!1}),n.addEventListener("keydown",W),o},Ce=function(u){i.active&&!i.paused&&o._setSubtreeIsolation(!1),i.adjacentElements.clear(),i.alreadySilent.clear();var f=new Set,g=new Set,E=ut(u),x;try{for(E.s();!(x=E.n()).done;){var I=x.value;f.add(I);for(var S=typeof ShadowRoot<"u"&&I.getRootNode()instanceof ShadowRoot,v=I;v;){f.add(v);var d=v.parentElement,_=[];d?_=d.children:!d&&S&&(_=v.getRootNode().children,d=v.getRootNode().host,S=typeof ShadowRoot<"u"&&d.getRootNode()instanceof ShadowRoot);var R=ut(_),A;try{for(R.s();!(A=R.n()).done;){var C=A.value;g.add(C)}}catch(D){R.e(D)}finally{R.f()}v=d}}}catch(D){E.e(D)}finally{E.f()}f.forEach(function(D){g.delete(D)}),i.adjacentElements=g},M=function(){if(i.active)return n.removeEventListener("focusin",L,!0),n.removeEventListener("mousedown",O,!0),n.removeEventListener("touchstart",O,!0),n.removeEventListener("click",j,!0),n.removeEventListener("keydown",H,!0),n.removeEventListener("keydown",W),o},Z=function(u){var f=u.some(function(g){var E=Array.from(g.removedNodes);return E.some(function(x){return x===i.mostRecentlyFocusedNode})});f&&w(m())},X=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(Z):void 0,ee=function(){X&&(X.disconnect(),i.active&&!i.paused&&i.containers.map(function(u){X.observe(u,{subtree:!0,childList:!0})}))};return o={get active(){return i.active},get paused(){return i.paused},activate:function(u){if(i.active)return this;var f=l(u,"onActivate"),g=l(u,"onPostActivate"),E=l(u,"checkCanFocusTrap"),x=U.getActiveTrap(r),I=!1;if(x&&!x.paused){var S;(S=x._setSubtreeIsolation)===null||S===void 0||S.call(x,!1),I=!0}try{E||p(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=b(n),f==null||f();var v=function(){E&&p(),$(),ee(),s.isolateSubtrees&&o._setSubtreeIsolation(!0),g==null||g()};if(E)return E(i.containers.concat()).then(v,v),this;v()}catch(_){if(x===U.getActiveTrap(r)&&I){var d;(d=x._setSubtreeIsolation)===null||d===void 0||d.call(x,!0)}throw _}return this},deactivate:function(u){if(!i.active)return this;var f=ft({onDeactivate:s.onDeactivate,onPostDeactivate:s.onPostDeactivate,checkCanReturnFocus:s.checkCanReturnFocus},u);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,i.paused||o._setSubtreeIsolation(!1),i.alreadySilent.clear(),M(),i.active=!1,i.paused=!1,ee(),U.deactivateTrap(r,o);var g=l(f,"onDeactivate"),E=l(f,"onPostDeactivate"),x=l(f,"checkCanReturnFocus"),I=l(f,"returnFocus","returnFocusOnDeactivate");g==null||g();var S=function(){ht(function(){I&&w(k(i.nodeFocusedBeforeActivation)),E==null||E()})};return I&&x?(x(k(i.nodeFocusedBeforeActivation)).then(S,S),this):(S(),this)},pause:function(u){return i.active?(i.manuallyPaused=!0,this._setPausedState(!0,u)):this},unpause:function(u){return i.active?(i.manuallyPaused=!1,r[r.length-1]!==this?this:this._setPausedState(!1,u)):this},updateContainerElements:function(u){var f=[].concat(u).filter(Boolean);return i.containers=f.map(function(g){return typeof g=="string"?n.querySelector(g):g}),s.isolateSubtrees&&Ce(i.containers),i.active&&(p(),s.isolateSubtrees&&!i.paused&&o._setSubtreeIsolation(!0)),ee(),this}},Object.defineProperties(o,{_isManuallyPaused:{value:function(){return i.manuallyPaused}},_setPausedState:{value:function(u,f){if(i.paused===u)return this;if(i.paused=u,u){var g=l(f,"onPause"),E=l(f,"onPostPause");g==null||g(),M(),ee(),o._setSubtreeIsolation(!1),E==null||E()}else{var x=l(f,"onUnpause"),I=l(f,"onPostUnpause");x==null||x(),o._setSubtreeIsolation(!0),p(),$(),ee(),I==null||I()}return this}},_setSubtreeIsolation:{value:function(u){s.isolateSubtrees&&i.adjacentElements.forEach(function(f){var g;if(u)switch(s.isolateSubtrees){case"aria-hidden":(f.ariaHidden==="true"||((g=f.getAttribute("aria-hidden"))===null||g===void 0?void 0:g.toLowerCase())==="true")&&i.alreadySilent.add(f),f.setAttribute("aria-hidden","true");break;default:(f.inert||f.hasAttribute("inert"))&&i.alreadySilent.add(f),f.setAttribute("inert",!0);break}else if(!i.alreadySilent.has(f))switch(s.isolateSubtrees){case"aria-hidden":f.removeAttribute("aria-hidden");break;default:f.removeAttribute("inert");break}})}}}),o.updateContainerElements(e),o};function zn(a,e={}){let t;const{immediate:n,...r}=e,s=ce(!1),i=ce(!1),o=p=>t&&t.activate(p),l=p=>t&&t.deactivate(p),c=()=>{t&&(t.pause(),i.value=!0)},h=()=>{t&&(t.unpause(),i.value=!1)},m=be(()=>{const p=rt(a);return Lt(p).map(b=>{const w=rt(b);return typeof w=="string"?w:Dt(w)}).filter(Pt)});return Be(m,p=>{p.length&&(t=Pn(p,{...r,onActivate(){s.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){s.value=!1,e.onDeactivate&&e.onDeactivate()}}),n&&o())},{flush:"post"}),Mt(()=>l()),{hasFocus:s,isPaused:i,activate:o,deactivate:l,pause:c,unpause:h}}class ue{constructor(e,t=!0,n=[],r=5e3){this.ctx=e,this.iframes=t,this.exclude=n,this.iframesTimeout=r}static matches(e,t){const n=typeof t=="string"?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){let s=!1;return n.every(i=>r.call(e,i)?(s=!0,!1):!0),s}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(n=>{const r=t.filter(s=>s.contains(n)).length>0;t.indexOf(n)===-1&&!r&&t.push(n)}),t}getIframeContents(e,t,n=()=>{}){let r;try{const s=e.contentWindow;if(r=s.document,!s||!r)throw new Error("iframe inaccessible")}catch{n()}r&&t(r)}isIframeBlank(e){const t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}observeIframeLoad(e,t,n){let r=!1,s=null;const i=()=>{if(!r){r=!0,clearTimeout(s);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,n))}catch{n()}}};e.addEventListener("load",i),s=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,n){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch{n()}}waitForIframes(e,t){let n=0;this.forEachIframe(e,()=>!0,r=>{n++,this.waitForIframes(r.querySelector("html"),()=>{--n||t()})},r=>{r||t()})}forEachIframe(e,t,n,r=()=>{}){let s=e.querySelectorAll("iframe"),i=s.length,o=0;s=Array.prototype.slice.call(s);const l=()=>{--i<=0&&r(o)};i||l(),s.forEach(c=>{ue.matches(c,this.exclude)?l():this.onIframeReady(c,h=>{t(c)&&(o++,n(h)),l()},l)})}createIterator(e,t,n){return document.createNodeIterator(e,t,n,!1)}createInstanceOnIframe(e){return new ue(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,n){const r=e.compareDocumentPosition(n),s=Node.DOCUMENT_POSITION_PRECEDING;if(r&s)if(t!==null){const i=t.compareDocumentPosition(n),o=Node.DOCUMENT_POSITION_FOLLOWING;if(i&o)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let n;return t===null?n=e.nextNode():n=e.nextNode()&&e.nextNode(),{prevNode:t,node:n}}checkIframeFilter(e,t,n,r){let s=!1,i=!1;return r.forEach((o,l)=>{o.val===n&&(s=l,i=o.handled)}),this.compareNodeIframe(e,t,n)?(s===!1&&!i?r.push({val:n,handled:!0}):s!==!1&&!i&&(r[s].handled=!0),!0):(s===!1&&r.push({val:n,handled:!1}),!1)}handleOpenIframes(e,t,n,r){e.forEach(s=>{s.handled||this.getIframeContents(s.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,n,r)})})}iterateThroughNodes(e,t,n,r,s){const i=this.createIterator(t,e,r);let o=[],l=[],c,h,m=()=>({prevNode:h,node:c}=this.getIteratorNode(i),c);for(;m();)this.iframes&&this.forEachIframe(t,p=>this.checkIframeFilter(c,h,p,o),p=>{this.createInstanceOnIframe(p).forEachNode(e,b=>l.push(b),r)}),l.push(c);l.forEach(p=>{n(p)}),this.iframes&&this.handleOpenIframes(o,e,n,r),s()}forEachNode(e,t,n,r=()=>{}){const s=this.getContexts();let i=s.length;i||r(),s.forEach(o=>{const l=()=>{this.iterateThroughNodes(e,o,t,n,()=>{--i<=0&&r()})};this.iframes?this.waitForIframes(o,l):l()})}}let Vn=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new ue(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const n=this.opt.log;this.opt.debug&&typeof n=="object"&&typeof n[t]=="function"&&n[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let s in t)if(t.hasOwnProperty(s)){const i=t[s],o=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(s):this.escapeStr(s),l=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);o!==""&&l!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(o)}|${this.escapeStr(l)})`,`gm${n}`),r+`(${this.processSynomyms(o)}|${this.processSynomyms(l)})`+r))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,n,r)=>{let s=r.charAt(n+1);return/[(|)\\]/.test(s)||s===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let r=[];return e.split("").forEach(s=>{n.every(i=>{if(i.indexOf(s)!==-1){if(r.indexOf(i)>-1)return!1;e=e.replace(new RegExp(`[${i}]`,`gm${t}`),`[${i}]`),r.push(i)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let n=this.opt.accuracy,r=typeof n=="string"?n:n.value,s=typeof n=="string"?[]:n.limiters,i="";switch(s.forEach(o=>{i+=`|${this.escapeStr(o)}`}),r){case"partially":default:return`()(${e})`;case"complementary":return i="\\s"+(i||this.escapeStr(t)),`()([^${i}]*${e}[^${i}]*)`;case"exactly":return`(^|\\s${i})(${e})(?=$|\\s${i})`}}getSeparatedKeywords(e){let t=[];return e.forEach(n=>{this.opt.separateWordSearch?n.split(" ").forEach(r=>{r.trim()&&t.indexOf(r)===-1&&t.push(r)}):n.trim()&&t.indexOf(n)===-1&&t.push(n)}),{keywords:t.sort((n,r)=>r.length-n.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let n=0;return e.sort((r,s)=>r.start-s.start).forEach(r=>{let{start:s,end:i,valid:o}=this.callNoMatchOnInvalidRanges(r,n);o&&(r.start=s,r.length=i-s,t.push(r),n=i)}),t}callNoMatchOnInvalidRanges(e,t){let n,r,s=!1;return e&&typeof e.start<"u"?(n=parseInt(e.start,10),r=n+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?s=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:n,end:r,valid:s}}checkWhitespaceRanges(e,t,n){let r,s=!0,i=n.length,o=t-i,l=parseInt(e.start,10)-o;return l=l>i?i:l,r=l+parseInt(e.length,10),r>i&&(r=i,this.log(`End range automatically set to the max value of ${i}`)),l<0||r-l<0||l>i||r>i?(s=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):n.substring(l,r).replace(/\s+/g,"")===""&&(s=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:l,end:r,valid:s}}getTextNodes(e){let t="",n=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,r=>{n.push({start:t.length,end:(t+=r.textContent).length,node:r})},r=>this.matchesExclude(r.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:n})})}matchesExclude(e){return ue.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,n){const r=this.opt.element?this.opt.element:"mark",s=e.splitText(t),i=s.splitText(n-t);let o=document.createElement(r);return o.setAttribute("data-markjs","true"),this.opt.className&&o.setAttribute("class",this.opt.className),o.textContent=s.textContent,s.parentNode.replaceChild(o,s),i}wrapRangeInMappedTextNode(e,t,n,r,s){e.nodes.every((i,o)=>{const l=e.nodes[o+1];if(typeof l>"u"||l.start>t){if(!r(i.node))return!1;const c=t-i.start,h=(n>i.end?i.end:n)-i.start,m=e.value.substr(0,i.start),p=e.value.substr(h+i.start);if(i.node=this.wrapRangeInTextNode(i.node,c,h),e.value=m+p,e.nodes.forEach((b,w)=>{w>=o&&(e.nodes[w].start>0&&w!==o&&(e.nodes[w].start-=h),e.nodes[w].end-=h)}),n-=h,s(i.node.previousSibling,i.start),n>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,n,r,s){const i=t===0?0:t+1;this.getTextNodes(o=>{o.nodes.forEach(l=>{l=l.node;let c;for(;(c=e.exec(l.textContent))!==null&&c[i]!=="";){if(!n(c[i],l))continue;let h=c.index;if(i!==0)for(let m=1;m{let l;for(;(l=e.exec(o.value))!==null&&l[i]!=="";){let c=l.index;if(i!==0)for(let m=1;mn(l[i],m),(m,p)=>{e.lastIndex=p,r(m)})}s()})}wrapRangeFromIndex(e,t,n,r){this.getTextNodes(s=>{const i=s.value.length;e.forEach((o,l)=>{let{start:c,end:h,valid:m}=this.checkWhitespaceRanges(o,i,s.value);m&&this.wrapRangeInMappedTextNode(s,c,h,p=>t(p,o,s.value.substring(c,h),l),p=>{n(p,o)})}),r()})}unwrapMatches(e){const t=e.parentNode;let n=document.createDocumentFragment();for(;e.firstChild;)n.appendChild(e.removeChild(e.firstChild));t.replaceChild(n,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let n=0,r="wrapMatches";const s=i=>{n++,this.opt.each(i)};this.opt.acrossElements&&(r="wrapMatchesAcrossElements"),this[r](e,this.opt.ignoreGroups,(i,o)=>this.opt.filter(o,i,n),s,()=>{n===0&&this.opt.noMatch(e),this.opt.done(n)})}mark(e,t){this.opt=t;let n=0,r="wrapMatches";const{keywords:s,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),o=this.opt.caseSensitive?"":"i",l=c=>{let h=new RegExp(this.createRegExp(c),`gm${o}`),m=0;this.log(`Searching with expression "${h}"`),this[r](h,1,(p,b)=>this.opt.filter(b,c,n,m),p=>{m++,n++,this.opt.each(p)},()=>{m===0&&this.opt.noMatch(c),s[i-1]===c?this.opt.done(n):l(s[s.indexOf(c)+1])})};this.opt.acrossElements&&(r="wrapMatchesAcrossElements"),i===0?this.opt.done(n):l(s[0])}markRanges(e,t){this.opt=t;let n=0,r=this.checkRanges(e);r&&r.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(r)),this.wrapRangeFromIndex(r,(s,i,o,l)=>this.opt.filter(s,i,o,l),(s,i)=>{n++,this.opt.each(s,i)},()=>{this.opt.done(n)})):this.opt.done(n)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,n=>{this.unwrapMatches(n)},n=>{const r=ue.matches(n,t),s=this.matchesExclude(n);return!r||s?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function jn(a){const e=new Vn(a);return this.mark=(t,n)=>(e.mark(t,n),this),this.markRegExp=(t,n)=>(e.markRegExp(t,n),this),this.markRanges=(t,n)=>(e.markRanges(t,n),this),this.unmark=t=>(e.unmark(t),this),this}const $n="ENTRIES",Et="KEYS",It="VALUES",z="";class Pe{constructor(e,t){const n=e._tree,r=Array.from(n.keys());this.set=e,this._type=t,this._path=r.length>0?[{node:n,keys:r}]:[]}next(){const e=this.dive();return this.backtrack(),e}dive(){if(this._path.length===0)return{done:!0,value:void 0};const{node:e,keys:t}=le(this._path);if(le(t)===z)return{done:!1,value:this.result()};const n=e.get(le(t));return this._path.push({node:n,keys:Array.from(n.keys())}),this.dive()}backtrack(){if(this._path.length===0)return;const e=le(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}key(){return this.set._prefix+this._path.map(({keys:e})=>le(e)).filter(e=>e!==z).join("")}value(){return le(this._path).node.get(z)}result(){switch(this._type){case It:return this.value();case Et:return this.key();default:return[this.key(),this.value()]}}[Symbol.iterator](){return this}}const le=a=>a[a.length-1],Bn=(a,e,t)=>{const n=new Map;if(e===void 0)return n;const r=e.length+1,s=r+t,i=new Uint8Array(s*r).fill(t+1);for(let o=0;o{const l=s*i;e:for(const c of a.keys())if(c===z){const h=r[l-1];h<=t&&n.set(o,[a.get(c),h])}else{let h=s;for(let m=0;mt)continue e}kt(a.get(c),e,t,n,r,h,i,o+c)}};class Y{constructor(e=new Map,t=""){this._size=void 0,this._tree=e,this._prefix=t}atPrefix(e){if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");const[t,n]=Ae(this._tree,e.slice(this._prefix.length));if(t===void 0){const[r,s]=He(n);for(const i of r.keys())if(i!==z&&i.startsWith(s)){const o=new Map;return o.set(i.slice(s.length),r.get(i)),new Y(o,e)}}return new Y(t,e)}clear(){this._size=void 0,this._tree.clear()}delete(e){return this._size=void 0,Wn(this._tree,e)}entries(){return new Pe(this,$n)}forEach(e){for(const[t,n]of this)e(t,n,this)}fuzzyGet(e,t){return Bn(this._tree,e,t)}get(e){const t=Je(this._tree,e);return t!==void 0?t.get(z):void 0}has(e){const t=Je(this._tree,e);return t!==void 0&&t.has(z)}keys(){return new Pe(this,Et)}set(e,t){if(typeof e!="string")throw new Error("key must be a string");return this._size=void 0,ze(this._tree,e).set(z,t),this}get size(){if(this._size)return this._size;this._size=0;const e=this.entries();for(;!e.next().done;)this._size+=1;return this._size}update(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const n=ze(this._tree,e);return n.set(z,t(n.get(z))),this}fetch(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const n=ze(this._tree,e);let r=n.get(z);return r===void 0&&n.set(z,r=t()),r}values(){return new Pe(this,It)}[Symbol.iterator](){return this.entries()}static from(e){const t=new Y;for(const[n,r]of e)t.set(n,r);return t}static fromObject(e){return Y.from(Object.entries(e))}}const Ae=(a,e,t=[])=>{if(e.length===0||a==null)return[a,t];for(const n of a.keys())if(n!==z&&e.startsWith(n))return t.push([a,n]),Ae(a.get(n),e.slice(n.length),t);return t.push([a,e]),Ae(void 0,"",t)},Je=(a,e)=>{if(e.length===0||a==null)return a;for(const t of a.keys())if(t!==z&&e.startsWith(t))return Je(a.get(t),e.slice(t.length))},ze=(a,e)=>{const t=e.length;e:for(let n=0;a&&n{const[t,n]=Ae(a,e);if(t!==void 0){if(t.delete(z),t.size===0)Nt(n);else if(t.size===1){const[r,s]=t.entries().next().value;Ft(n,r,s)}}},Nt=a=>{if(a.length===0)return;const[e,t]=He(a);if(e.delete(t),e.size===0)Nt(a.slice(0,-1));else if(e.size===1){const[n,r]=e.entries().next().value;n!==z&&Ft(a.slice(0,-1),n,r)}},Ft=(a,e,t)=>{if(a.length===0)return;const[n,r]=He(a);n.set(r+e,t),n.delete(r)},He=a=>a[a.length-1],Ge="or",Rt="and",Kn="and_not";class de{constructor(e){if((e==null?void 0:e.fields)==null)throw new Error('MiniSearch: option "fields" must be provided');const t=e.autoVacuum==null||e.autoVacuum===!0?$e:e.autoVacuum;this._options={...je,...e,autoVacuum:t,searchOptions:{...vt,...e.searchOptions||{}},autoSuggestOptions:{...Gn,...e.autoSuggestOptions||{}}},this._index=new Y,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldIds={},this._fieldLength=new Map,this._avgFieldLength=[],this._nextId=0,this._storedFields=new Map,this._dirtCount=0,this._currentVacuum=null,this._enqueuedVacuum=null,this._enqueuedVacuumConditions=Ue,this.addFields(this._options.fields)}add(e){const{extractField:t,stringifyField:n,tokenize:r,processTerm:s,fields:i,idField:o}=this._options,l=t(e,o);if(l==null)throw new Error(`MiniSearch: document does not have ID field "${o}"`);if(this._idToShortId.has(l))throw new Error(`MiniSearch: duplicate ID ${l}`);const c=this.addDocumentId(l);this.saveStoredFields(c,e);for(const h of i){const m=t(e,h);if(m==null)continue;const p=r(n(m,h),h),b=this._fieldIds[h],w=new Set(p).size;this.addFieldLength(c,b,this._documentCount-1,w);for(const k of p){const y=s(k,h);if(Array.isArray(y))for(const O of y)this.addTerm(b,c,O);else y&&this.addTerm(b,c,y)}}}addAll(e){for(const t of e)this.add(t)}addAllAsync(e,t={}){const{chunkSize:n=10}=t,r={chunk:[],promise:Promise.resolve()},{chunk:s,promise:i}=e.reduce(({chunk:o,promise:l},c,h)=>(o.push(c),(h+1)%n===0?{chunk:[],promise:l.then(()=>new Promise(m=>setTimeout(m,0))).then(()=>this.addAll(o))}:{chunk:o,promise:l}),r);return i.then(()=>this.addAll(s))}remove(e){const{tokenize:t,processTerm:n,extractField:r,stringifyField:s,fields:i,idField:o}=this._options,l=r(e,o);if(l==null)throw new Error(`MiniSearch: document does not have ID field "${o}"`);const c=this._idToShortId.get(l);if(c==null)throw new Error(`MiniSearch: cannot remove document with ID ${l}: it is not in the index`);for(const h of i){const m=r(e,h);if(m==null)continue;const p=t(s(m,h),h),b=this._fieldIds[h],w=new Set(p).size;this.removeFieldLength(c,b,this._documentCount,w);for(const k of p){const y=n(k,h);if(Array.isArray(y))for(const O of y)this.removeTerm(b,c,O);else y&&this.removeTerm(b,c,y)}}this._storedFields.delete(c),this._documentIds.delete(c),this._idToShortId.delete(l),this._fieldLength.delete(c),this._documentCount-=1}removeAll(e){if(e)for(const t of e)this.remove(t);else{if(arguments.length>0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new Y,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}}discard(e){const t=this._idToShortId.get(e);if(t==null)throw new Error(`MiniSearch: cannot discard document with ID ${e}: it is not in the index`);this._idToShortId.delete(e),this._documentIds.delete(t),this._storedFields.delete(t),(this._fieldLength.get(t)||[]).forEach((n,r)=>{this.removeFieldLength(t,r,this._documentCount,n)}),this._fieldLength.delete(t),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()}maybeAutoVacuum(){if(this._options.autoVacuum===!1)return;const{minDirtFactor:e,minDirtCount:t,batchSize:n,batchWait:r}=this._options.autoVacuum;this.conditionalVacuum({batchSize:n,batchWait:r},{minDirtCount:t,minDirtFactor:e})}discardAll(e){const t=this._options.autoVacuum;try{this._options.autoVacuum=!1;for(const n of e)this.discard(n)}finally{this._options.autoVacuum=t}this.maybeAutoVacuum()}replace(e){const{idField:t,extractField:n}=this._options,r=n(e,t);this.discard(r),this.add(e)}vacuum(e={}){return this.conditionalVacuum(e)}conditionalVacuum(e,t){return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(()=>{const n=this._enqueuedVacuumConditions;return this._enqueuedVacuumConditions=Ue,this.performVacuuming(e,n)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)}async performVacuuming(e,t){const n=this._dirtCount;if(this.vacuumConditionsMet(t)){const r=e.batchSize||qe.batchSize,s=e.batchWait||qe.batchWait;let i=1;for(const[o,l]of this._index){for(const[c,h]of l)for(const[m]of h)this._documentIds.has(m)||(h.size<=1?l.delete(c):h.delete(m));this._index.get(o).size===0&&this._index.delete(o),i%r===0&&await new Promise(c=>setTimeout(c,s)),i+=1}this._dirtCount-=n}await null,this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null}vacuumConditionsMet(e){if(e==null)return!0;let{minDirtCount:t,minDirtFactor:n}=e;return t=t||$e.minDirtCount,n=n||$e.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=n}get isVacuuming(){return this._currentVacuum!=null}get dirtCount(){return this._dirtCount}get dirtFactor(){return this._dirtCount/(1+this._documentCount+this._dirtCount)}has(e){return this._idToShortId.has(e)}getStoredFields(e){const t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)}search(e,t={}){const{searchOptions:n}=this._options,r={...n,...t},s=this.executeQuery(e,t),i=[];for(const[o,{score:l,terms:c,match:h}]of s){const m=c.length||1,p={id:this._documentIds.get(o),score:l*m,terms:Object.keys(h),queryTerms:c,match:h};Object.assign(p,this._storedFields.get(o)),(r.filter==null||r.filter(p))&&i.push(p)}return e===de.wildcard&&r.boostDocument==null||i.sort(mt),i}autoSuggest(e,t={}){t={...this._options.autoSuggestOptions,...t};const n=new Map;for(const{score:s,terms:i}of this.search(e,t)){const o=i.join(" "),l=n.get(o);l!=null?(l.score+=s,l.count+=1):n.set(o,{score:s,terms:i,count:1})}const r=[];for(const[s,{score:i,terms:o,count:l}]of n)r.push({suggestion:s,terms:o,score:i/l});return r.sort(mt),r}get documentCount(){return this._documentCount}get termCount(){return this._index.size}static loadJSON(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)}static async loadJSONAsync(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJSAsync(JSON.parse(e),t)}static getDefault(e){if(je.hasOwnProperty(e))return Ve(je,e);throw new Error(`MiniSearch: unknown option "${e}"`)}static loadJS(e,t){const{index:n,documentIds:r,fieldLength:s,storedFields:i,serializationVersion:o}=e,l=this.instantiateMiniSearch(e,t);l._documentIds=Ee(r),l._fieldLength=Ee(s),l._storedFields=Ee(i);for(const[c,h]of l._documentIds)l._idToShortId.set(h,c);for(const[c,h]of n){const m=new Map;for(const p of Object.keys(h)){let b=h[p];o===1&&(b=b.ds),m.set(parseInt(p,10),Ee(b))}l._index.set(c,m)}return l}static async loadJSAsync(e,t){const{index:n,documentIds:r,fieldLength:s,storedFields:i,serializationVersion:o}=e,l=this.instantiateMiniSearch(e,t);l._documentIds=await Ie(r),l._fieldLength=await Ie(s),l._storedFields=await Ie(i);for(const[h,m]of l._documentIds)l._idToShortId.set(m,h);let c=0;for(const[h,m]of n){const p=new Map;for(const b of Object.keys(m)){let w=m[b];o===1&&(w=w.ds),p.set(parseInt(b,10),await Ie(w))}++c%1e3===0&&await Ot(0),l._index.set(h,p)}return l}static instantiateMiniSearch(e,t){const{documentCount:n,nextId:r,fieldIds:s,averageFieldLength:i,dirtCount:o,serializationVersion:l}=e;if(l!==1&&l!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");const c=new de(t);return c._documentCount=n,c._nextId=r,c._idToShortId=new Map,c._fieldIds=s,c._avgFieldLength=i,c._dirtCount=o||0,c._index=new Y,c}executeQuery(e,t={}){if(e===de.wildcard)return this.executeWildcardQuery(t);if(typeof e!="string"){const p={...t,...e,queries:void 0},b=e.queries.map(w=>this.executeQuery(w,p));return this.combineResults(b,p.combineWith)}const{tokenize:n,processTerm:r,searchOptions:s}=this._options,i={tokenize:n,processTerm:r,...s,...t},{tokenize:o,processTerm:l}=i,m=o(e).flatMap(p=>l(p)).filter(p=>!!p).map(Hn(i)).map(p=>this.executeQuerySpec(p,i));return this.combineResults(m,i.combineWith)}executeQuerySpec(e,t){const n={...this._options.searchOptions,...t},r=(n.fields||this._options.fields).reduce((k,y)=>({...k,[y]:Ve(n.boost,y)||1}),{}),{boostDocument:s,weights:i,maxFuzzy:o,bm25:l}=n,{fuzzy:c,prefix:h}={...vt.weights,...i},m=this._index.get(e.term),p=this.termResults(e.term,e.term,1,e.termBoost,m,r,s,l);let b,w;if(e.prefix&&(b=this._index.atPrefix(e.term)),e.fuzzy){const k=e.fuzzy===!0?.2:e.fuzzy,y=k<1?Math.min(o,Math.round(e.term.length*k)):k;y&&(w=this._index.fuzzyGet(e.term,y))}if(b)for(const[k,y]of b){const O=k.length-e.term.length;if(!O)continue;w==null||w.delete(k);const L=h*k.length/(k.length+.3*O);this.termResults(e.term,k,L,e.termBoost,y,r,s,l,p)}if(w)for(const k of w.keys()){const[y,O]=w.get(k);if(!O)continue;const L=c*k.length/(k.length+O);this.termResults(e.term,k,L,e.termBoost,y,r,s,l,p)}return p}executeWildcardQuery(e){const t=new Map,n={...this._options.searchOptions,...e};for(const[r,s]of this._documentIds){const i=n.boostDocument?n.boostDocument(s,"",this._storedFields.get(r)):1;t.set(r,{score:i,terms:[],match:{}})}return t}combineResults(e,t=Ge){if(e.length===0)return new Map;const n=t.toLowerCase(),r=Jn[n];if(!r)throw new Error(`Invalid combination operator: ${t}`);return e.reduce(r)||new Map}toJSON(){const e=[];for(const[t,n]of this._index){const r={};for(const[s,i]of n)r[s]=Object.fromEntries(i);e.push([t,r])}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:e,serializationVersion:2}}termResults(e,t,n,r,s,i,o,l,c=new Map){if(s==null)return c;for(const h of Object.keys(i)){const m=i[h],p=this._fieldIds[h],b=s.get(p);if(b==null)continue;let w=b.size;const k=this._avgFieldLength[p];for(const y of b.keys()){if(!this._documentIds.has(y)){this.removeTerm(p,y,t),w-=1;continue}const O=o?o(this._documentIds.get(y),t,this._storedFields.get(y)):1;if(!O)continue;const L=b.get(y),K=this._fieldLength.get(y)[p],H=Un(L,w,this._documentCount,K,k,l),W=n*r*m*O*H,j=c.get(y);if(j){j.score+=W,Qn(j.terms,e);const $=Ve(j.match,t);$?$.push(h):j.match[t]=[h]}else c.set(y,{score:W,terms:[e],match:{[t]:[h]}})}}return c}addTerm(e,t,n){const r=this._index.fetch(n,gt);let s=r.get(e);if(s==null)s=new Map,s.set(t,1),r.set(e,s);else{const i=s.get(t);s.set(t,(i||0)+1)}}removeTerm(e,t,n){if(!this._index.has(n)){this.warnDocumentChanged(t,e,n);return}const r=this._index.fetch(n,gt),s=r.get(e);s==null||s.get(t)==null?this.warnDocumentChanged(t,e,n):s.get(t)<=1?s.size<=1?r.delete(e):s.delete(t):s.set(t,s.get(t)-1),this._index.get(n).size===0&&this._index.delete(n)}warnDocumentChanged(e,t,n){for(const r of Object.keys(this._fieldIds))if(this._fieldIds[r]===t){this._options.logger("warn",`MiniSearch: document with ID ${this._documentIds.get(e)} has changed before removal: term "${n}" was not present in field "${r}". Removing a document after it has changed can corrupt the index!`,"version_conflict");return}}addDocumentId(e){const t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t}addFields(e){for(let t=0;tObject.prototype.hasOwnProperty.call(a,e)?a[e]:void 0,Jn={[Ge]:(a,e)=>{for(const t of e.keys()){const n=a.get(t);if(n==null)a.set(t,e.get(t));else{const{score:r,terms:s,match:i}=e.get(t);n.score=n.score+r,n.match=Object.assign(n.match,i),pt(n.terms,s)}}return a},[Rt]:(a,e)=>{const t=new Map;for(const n of e.keys()){const r=a.get(n);if(r==null)continue;const{score:s,terms:i,match:o}=e.get(n);pt(r.terms,i),t.set(n,{score:r.score+s,terms:r.terms,match:Object.assign(r.match,o)})}return t},[Kn]:(a,e)=>{for(const t of e.keys())a.delete(t);return a}},qn={k:1.2,b:.7,d:.5},Un=(a,e,t,n,r,s)=>{const{k:i,b:o,d:l}=s;return Math.log(1+(t-e+.5)/(e+.5))*(l+a*(i+1)/(a+i*(1-o+o*n/r)))},Hn=a=>(e,t,n)=>{const r=typeof a.fuzzy=="function"?a.fuzzy(e,t,n):a.fuzzy||!1,s=typeof a.prefix=="function"?a.prefix(e,t,n):a.prefix===!0,i=typeof a.boostTerm=="function"?a.boostTerm(e,t,n):1;return{term:e,fuzzy:r,prefix:s,termBoost:i}},je={idField:"id",extractField:(a,e)=>a[e],stringifyField:(a,e)=>a.toString(),tokenize:a=>a.split(Yn),processTerm:a=>a.toLowerCase(),fields:void 0,searchOptions:void 0,storeFields:[],logger:(a,e)=>{typeof(console==null?void 0:console[a])=="function"&&console[a](e)},autoVacuum:!0},vt={combineWith:Ge,prefix:!1,fuzzy:!1,maxFuzzy:6,boost:{},weights:{fuzzy:.45,prefix:.375},bm25:qn},Gn={combineWith:Rt,prefix:(a,e,t)=>e===t.length-1},qe={batchSize:1e3,batchWait:10},Ue={minDirtFactor:.1,minDirtCount:20},$e={...qe,...Ue},Qn=(a,e)=>{a.includes(e)||a.push(e)},pt=(a,e)=>{for(const t of e)a.includes(t)||a.push(t)},mt=({score:a},{score:e})=>e-a,gt=()=>new Map,Ee=a=>{const e=new Map;for(const t of Object.keys(a))e.set(parseInt(t,10),a[t]);return e},Ie=async a=>{const e=new Map;let t=0;for(const n of Object.keys(a))e.set(parseInt(n,10),a[n]),++t%1e3===0&&await Ot(0);return e},Ot=a=>new Promise(e=>setTimeout(e,a)),Yn=/[\n\r\p{Z}\p{P}]+/u;class Zn{constructor(e=10){Me(this,"max");Me(this,"cache");this.max=e,this.cache=new Map}get(e){let t=this.cache.get(e);return t!==void 0&&(this.cache.delete(e),this.cache.set(e,t)),t}set(e,t){this.cache.has(e)?this.cache.delete(e):this.cache.size===this.max&&this.cache.delete(this.first()),this.cache.set(e,t)}first(){return this.cache.keys().next().value}clear(){this.cache.clear()}}const Xn=["aria-owns"],er={class:"shell"},tr=["title"],nr={class:"search-actions before"},rr=["title"],ir=["aria-activedescendant","aria-controls","placeholder"],sr={class:"search-actions"},ar=["title"],or=["disabled","title"],lr=["id","role","aria-labelledby"],cr=["id","aria-selected"],ur=["href","aria-label","onMouseenter","onFocusin","data-index"],dr={class:"titles"},fr=["innerHTML"],hr={class:"title main"},vr=["innerHTML"],pr={key:0,class:"excerpt-wrapper"},mr={key:0,class:"excerpt",inert:""},gr=["innerHTML"],br={key:0,class:"no-results"},yr={class:"search-keyboard-shortcuts"},wr=["aria-label"],Sr=["aria-label"],_r=["aria-label"],xr=["aria-label"],Tr=zt({__name:"VPLocalSearchBox",emits:["close"],setup(a,{emit:e}){var I,S;const t=e,n=ce(),r=ce(),s=ce(ln),i=an(),{activate:o}=zn(n,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:l,theme:c}=i,h=it(async()=>{var v,d,_,R,A,C,D,F,V;return lt(de.loadJSON((_=await((d=(v=s.value)[l.value])==null?void 0:d.call(v)))==null?void 0:_.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((R=c.value.search)==null?void 0:R.provider)==="local"&&((C=(A=c.value.search.options)==null?void 0:A.miniSearch)==null?void 0:C.searchOptions)},...((D=c.value.search)==null?void 0:D.provider)==="local"&&((V=(F=c.value.search.options)==null?void 0:F.miniSearch)==null?void 0:V.options)}))}),p=be(()=>{var v,d;return((v=c.value.search)==null?void 0:v.provider)==="local"&&((d=c.value.search.options)==null?void 0:d.disableQueryPersistence)===!0}).value?he(""):Vt("vitepress:local-search-filter",""),b=jt("vitepress:local-search-detailed-list",((I=c.value.search)==null?void 0:I.provider)==="local"&&((S=c.value.search.options)==null?void 0:S.detailedView)===!0),w=be(()=>{var v,d,_;return((v=c.value.search)==null?void 0:v.provider)==="local"&&(((d=c.value.search.options)==null?void 0:d.disableDetailedView)===!0||((_=c.value.search.options)==null?void 0:_.detailedView)===!1)}),k=be(()=>{var d,_,R,A,C,D,F;const v=((d=c.value.search)==null?void 0:d.options)??c.value.algolia;return((C=(A=(R=(_=v==null?void 0:v.locales)==null?void 0:_[l.value])==null?void 0:R.translations)==null?void 0:A.button)==null?void 0:C.buttonText)||((F=(D=v==null?void 0:v.translations)==null?void 0:D.button)==null?void 0:F.buttonText)||"Search"});$t(()=>{w.value&&(b.value=!1)});const y=ce([]),O=he(!1);Be(p,()=>{O.value=!1});const L=it(async()=>{if(r.value)return lt(new jn(r.value))},null),K=new Zn(16);Bt(()=>[h.value,p.value,b.value],async([v,d,_],R,A)=>{var te,we,Qe,Ye;(R==null?void 0:R[0])!==v&&K.clear();let C=!1;if(A(()=>{C=!0}),!v)return;y.value=v.search(d).slice(0,16),O.value=!0;const D=_?await Promise.all(y.value.map(B=>H(B.id))):[];if(C)return;for(const{id:B,mod:ne}of D){const re=B.slice(0,B.indexOf("#"));let G=K.get(re);if(G)continue;G=new Map,K.set(re,G);const J=ne.default??ne;if(J!=null&&J.render||J!=null&&J.setup){const ie=en(J);ie.config.warnHandler=()=>{},ie.provide(tn,i),Object.defineProperties(ie.config.globalProperties,{$frontmatter:{get(){return i.frontmatter.value}},$params:{get(){return i.page.value.params}}});const Ze=document.createElement("div");ie.mount(Ze),Ze.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(fe=>{var tt;const Se=(tt=fe.querySelector("a"))==null?void 0:tt.getAttribute("href"),Xe=(Se==null?void 0:Se.startsWith("#"))&&Se.slice(1);if(!Xe)return;let et="";for(;(fe=fe.nextElementSibling)&&!/^h[1-6]$/i.test(fe.tagName);)et+=fe.outerHTML;G.set(Xe,et)}),ie.unmount()}if(C)return}const F=new Set;if(y.value=y.value.map(B=>{const[ne,re]=B.id.split("#"),G=K.get(ne),J=(G==null?void 0:G.get(re))??"";for(const ie in B.match)F.add(ie);return{...B,text:J}}),await ve(),C)return;await new Promise(B=>{var ne;(ne=L.value)==null||ne.unmark({done:()=>{var re;(re=L.value)==null||re.markRegExp(E(F),{done:B})}})});const V=((te=n.value)==null?void 0:te.querySelectorAll(".result .excerpt"))??[];for(const B of V)(we=B.querySelector('mark[data-markjs="true"]'))==null||we.scrollIntoView({block:"center"});(Ye=(Qe=r.value)==null?void 0:Qe.firstElementChild)==null||Ye.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function H(v){const d=nn(v.slice(0,v.indexOf("#")));try{if(!d)throw new Error(`Cannot find file for id: ${v}`);return{id:v,mod:await import(d)}}catch(_){return console.error(_),{id:v,mod:{}}}}const W=he(),j=be(()=>{var v;return((v=p.value)==null?void 0:v.length)<=0});function $(v=!0){var d,_;(d=W.value)==null||d.focus(),v&&((_=W.value)==null||_.select())}Le(()=>{$()});function Ce(v){v.pointerType==="mouse"&&$()}const M=he(-1),Z=he(!0);Be(y,v=>{M.value=v.length?0:-1,X()});function X(){ve(()=>{const v=document.querySelector(".result.selected");v==null||v.scrollIntoView({block:"nearest"})})}_e("ArrowUp",v=>{v.preventDefault(),M.value--,M.value<0&&(M.value=y.value.length-1),Z.value=!0,X()}),_e("ArrowDown",v=>{v.preventDefault(),M.value++,M.value>=y.value.length&&(M.value=0),Z.value=!0,X()});const ee=Wt();_e("Enter",v=>{if(v.isComposing||v.target instanceof HTMLButtonElement&&v.target.type!=="submit")return;const d=y.value[M.value];if(v.target instanceof HTMLInputElement&&!d){v.preventDefault();return}d&&(ee.go(d.id),t("close"))}),_e("Escape",()=>{t("close")});const u=on({modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}});Le(()=>{window.history.pushState(null,"",null)}),Kt("popstate",v=>{v.preventDefault(),t("close")});const f=Jt(qt?document.body:null);Le(()=>{ve(()=>{f.value=!0,ve().then(()=>o())})}),Ut(()=>{f.value=!1});function g(){p.value="",ve().then(()=>$(!1))}function E(v){return new RegExp([...v].sort((d,_)=>_.length-d.length).map(d=>`(${rn(d)})`).join("|"),"gi")}function x(v){var R;if(!Z.value)return;const d=(R=v.target)==null?void 0:R.closest(".result"),_=Number.parseInt(d==null?void 0:d.dataset.index);_>=0&&_!==M.value&&(M.value=_),Z.value=!1}return(v,d)=>{var _,R,A,C,D;return q(),Ht(Xt,{to:"body"},[T("div",{ref_key:"el",ref:n,role:"button","aria-owns":(_=y.value)!=null&&_.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[T("div",{class:"backdrop",onClick:d[0]||(d[0]=F=>v.$emit("close"))}),T("div",er,[T("form",{class:"search-bar",onPointerup:d[4]||(d[4]=F=>Ce(F)),onSubmit:d[5]||(d[5]=Gt(()=>{},["prevent"]))},[T("label",{title:k.value,id:"localsearch-label",for:"localsearch-input"},[...d[7]||(d[7]=[T("span",{"aria-hidden":"true",class:"vpi-search search-icon local-search-icon"},null,-1)])],8,tr),T("div",nr,[T("button",{class:"back-button",title:P(u)("modal.backButtonTitle"),onClick:d[1]||(d[1]=F=>v.$emit("close"))},[...d[8]||(d[8]=[T("span",{class:"vpi-arrow-left local-search-icon"},null,-1)])],8,rr)]),Qt(T("input",{ref_key:"searchInput",ref:W,"onUpdate:modelValue":d[2]||(d[2]=F=>Zt(p)?p.value=F:null),"aria-activedescendant":M.value>-1?"localsearch-item-"+M.value:void 0,"aria-autocomplete":"both","aria-controls":(R=y.value)!=null&&R.length?"localsearch-list":void 0,"aria-labelledby":"localsearch-label",autocapitalize:"off",autocomplete:"off",autocorrect:"off",class:"search-input",id:"localsearch-input",enterkeyhint:"go",maxlength:"64",placeholder:k.value,spellcheck:"false",type:"search"},null,8,ir),[[Yt,P(p)]]),T("div",sr,[w.value?xe("",!0):(q(),Q("button",{key:0,class:st(["toggle-layout-button",{"detailed-list":P(b)}]),type:"button",title:P(u)("modal.displayDetails"),onClick:d[3]||(d[3]=F=>M.value>-1&&(b.value=!P(b)))},[...d[9]||(d[9]=[T("span",{class:"vpi-layout-list local-search-icon"},null,-1)])],10,ar)),T("button",{class:"clear-button",type:"reset",disabled:j.value,title:P(u)("modal.resetButtonTitle"),onClick:g},[...d[10]||(d[10]=[T("span",{class:"vpi-delete local-search-icon"},null,-1)])],8,or)])],32),T("ul",{ref_key:"resultsEl",ref:r,id:(A=y.value)!=null&&A.length?"localsearch-list":void 0,role:(C=y.value)!=null&&C.length?"listbox":void 0,"aria-labelledby":(D=y.value)!=null&&D.length?"localsearch-label":void 0,class:"results",onMousemove:x},[(q(!0),Q(ot,null,at(y.value,(F,V)=>(q(),Q("li",{key:F.id,id:"localsearch-item-"+V,"aria-selected":M.value===V?"true":"false",role:"option"},[T("a",{href:F.id,class:st(["result",{selected:M.value===V}]),"aria-label":[...F.titles,F.title].join(" > "),onMouseenter:te=>!Z.value&&(M.value=V),onFocusin:te=>M.value=V,onClick:d[6]||(d[6]=te=>v.$emit("close")),"data-index":V},[T("div",null,[T("div",dr,[d[12]||(d[12]=T("span",{class:"title-icon"},"#",-1)),(q(!0),Q(ot,null,at(F.titles,(te,we)=>(q(),Q("span",{key:we,class:"title"},[T("span",{class:"text",innerHTML:te},null,8,fr),d[11]||(d[11]=T("span",{class:"vpi-chevron-right local-search-icon"},null,-1))]))),128)),T("span",hr,[T("span",{class:"text",innerHTML:F.title},null,8,vr)])]),P(b)?(q(),Q("div",pr,[F.text?(q(),Q("div",mr,[T("div",{class:"vp-doc",innerHTML:F.text},null,8,gr)])):xe("",!0),d[13]||(d[13]=T("div",{class:"excerpt-gradient-bottom"},null,-1)),d[14]||(d[14]=T("div",{class:"excerpt-gradient-top"},null,-1))])):xe("",!0)])],42,ur)],8,cr))),128)),P(p)&&!y.value.length&&O.value?(q(),Q("li",br,[pe(me(P(u)("modal.noResultsText"))+' "',1),T("strong",null,me(P(p)),1),d[15]||(d[15]=pe('" ',-1))])):xe("",!0)],40,lr),T("div",yr,[T("span",null,[T("kbd",{"aria-label":P(u)("modal.footer.navigateUpKeyAriaLabel")},[...d[16]||(d[16]=[T("span",{class:"vpi-arrow-up navigate-icon"},null,-1)])],8,wr),T("kbd",{"aria-label":P(u)("modal.footer.navigateDownKeyAriaLabel")},[...d[17]||(d[17]=[T("span",{class:"vpi-arrow-down navigate-icon"},null,-1)])],8,Sr),pe(" "+me(P(u)("modal.footer.navigateText")),1)]),T("span",null,[T("kbd",{"aria-label":P(u)("modal.footer.selectKeyAriaLabel")},[...d[18]||(d[18]=[T("span",{class:"vpi-corner-down-left navigate-icon"},null,-1)])],8,_r),pe(" "+me(P(u)("modal.footer.selectText")),1)]),T("span",null,[T("kbd",{"aria-label":P(u)("modal.footer.closeKeyAriaLabel")},"esc",8,xr),pe(" "+me(P(u)("modal.footer.closeText")),1)])])])],8,Xn)])}}}),Rr=sn(Tr,[["__scopeId","data-v-a980c974"]]);export{Rr as default}; +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function dt(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter(function(r){return Object.getOwnPropertyDescriptor(a,r).enumerable})),t.push.apply(t,n)}return t}function ft(a){for(var e=1;e0?e[e.length-1]:null},activateTrap:function(e,t){var n=U.getActiveTrap(e);t!==n&&U.pauseTrap(e);var r=e.indexOf(t);r===-1||e.splice(r,1),e.push(t)},deactivateTrap:function(e,t){var n=e.indexOf(t);n!==-1&&e.splice(n,1),U.unpauseTrap(e)},pauseTrap:function(e){var t=U.getActiveTrap(e);t==null||t._setPausedState(!0)},unpauseTrap:function(e){var t=U.getActiveTrap(e);t&&!t._isManuallyPaused()&&t._setPausedState(!1)}},An=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},Cn=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},ye=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Mn=function(e){return ye(e)&&!e.shiftKey},Ln=function(e){return ye(e)&&e.shiftKey},ht=function(e){return setTimeout(e,0)},ge=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r1&&arguments[1]!==void 0?arguments[1]:{},g=f.hasFallback,E=g===void 0?!1:g,x=f.params,I=x===void 0?[]:x,S=s[u];if(typeof S=="function"&&(S=S.apply(void 0,Fn(I))),S===!0&&(S=void 0),!S){if(S===void 0||S===!1)return S;throw new Error("`".concat(u,"` was specified but was not a node, or did not return a node"))}var v=S;if(typeof S=="string"){try{v=n.querySelector(S)}catch(d){throw new Error("`".concat(u,'` appears to be an invalid selector; error="').concat(d.message,'"'))}if(!v&&!E)throw new Error("`".concat(u,"` as selector refers to no known node"))}return v},m=function(){var u=h("initialFocus",{hasFallback:!0});if(u===!1)return!1;if(u===void 0||u&&!De(u,s.tabbableOptions))if(c(n.activeElement)>=0)u=n.activeElement;else{var f=i.tabbableGroups[0],g=f&&f.firstTabbableNode;u=g||h("fallbackFocus")}else u===null&&(u=h("fallbackFocus"));if(!u)throw new Error("Your focus-trap needs to have at least one focusable element");return u},p=function(){if(i.containerGroups=i.containers.map(function(u){var f=_n(u,s.tabbableOptions),g=xn(u,s.tabbableOptions),E=f.length>0?f[0]:void 0,x=f.length>0?f[f.length-1]:void 0,I=g.find(function(d){return oe(d)}),S=g.slice().reverse().find(function(d){return oe(d)}),v=!!f.find(function(d){return se(d)>0});return{container:u,tabbableNodes:f,focusableNodes:g,posTabIndexesFound:v,firstTabbableNode:E,lastTabbableNode:x,firstDomTabbableNode:I,lastDomTabbableNode:S,nextTabbableNode:function(_){var R=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,A=f.indexOf(_);return A<0?R?g.slice(g.indexOf(_)+1).find(function(C){return oe(C)}):g.slice(0,g.indexOf(_)).reverse().find(function(C){return oe(C)}):f[A+(R?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(u){return u.tabbableNodes.length>0}),i.tabbableGroups.length<=0&&!h("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(i.containerGroups.find(function(u){return u.posTabIndexesFound})&&i.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},b=function(u){var f=u.activeElement;if(f)return f.shadowRoot&&f.shadowRoot.activeElement!==null?b(f.shadowRoot):f},w=function(u){if(u!==!1&&u!==b(document)){if(!u||!u.focus){w(m());return}u.focus({preventScroll:!!s.preventScroll}),i.mostRecentlyFocusedNode=u,An(u)&&u.select()}},k=function(u){var f=h("setReturnFocus",{params:[u]});return f||(f===!1?!1:u)},y=function(u){var f=u.target,g=u.event,E=u.isBackward,x=E===void 0?!1:E;f=f||Te(g),p();var I=null;if(i.tabbableGroups.length>0){var S=c(f,g),v=S>=0?i.containerGroups[S]:void 0;if(S<0)x?I=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:I=i.tabbableGroups[0].firstTabbableNode;else if(x){var d=i.tabbableGroups.findIndex(function(F){var V=F.firstTabbableNode;return f===V});if(d<0&&(v.container===f||De(f,s.tabbableOptions)&&!oe(f,s.tabbableOptions)&&!v.nextTabbableNode(f,!1))&&(d=S),d>=0){var _=d===0?i.tabbableGroups.length-1:d-1,R=i.tabbableGroups[_];I=se(f)>=0?R.lastTabbableNode:R.lastDomTabbableNode}else ye(g)||(I=v.nextTabbableNode(f,!1))}else{var A=i.tabbableGroups.findIndex(function(F){var V=F.lastTabbableNode;return f===V});if(A<0&&(v.container===f||De(f,s.tabbableOptions)&&!oe(f,s.tabbableOptions)&&!v.nextTabbableNode(f))&&(A=S),A>=0){var C=A===i.tabbableGroups.length-1?0:A+1,D=i.tabbableGroups[C];I=se(f)>=0?D.firstTabbableNode:D.firstDomTabbableNode}else ye(g)||(I=v.nextTabbableNode(f))}}else I=h("fallbackFocus");return I},O=function(u){var f=Te(u);if(!(c(f,u)>=0)){if(ge(s.clickOutsideDeactivates,u)){o.deactivate({returnFocus:s.returnFocusOnDeactivate});return}ge(s.allowOutsideClick,u)||u.preventDefault()}},L=function(u){var f=Te(u),g=c(f,u)>=0;if(g||f instanceof Document)g&&(i.mostRecentlyFocusedNode=f);else{u.stopImmediatePropagation();var E,x=!0;if(i.mostRecentlyFocusedNode)if(se(i.mostRecentlyFocusedNode)>0){var I=c(i.mostRecentlyFocusedNode),S=i.containerGroups[I].tabbableNodes;if(S.length>0){var v=S.findIndex(function(d){return d===i.mostRecentlyFocusedNode});v>=0&&(s.isKeyForward(i.recentNavEvent)?v+1=0&&(E=S[v-1],x=!1))}}else i.containerGroups.some(function(d){return d.tabbableNodes.some(function(_){return se(_)>0})})||(x=!1);else x=!1;x&&(E=y({target:i.mostRecentlyFocusedNode,isBackward:s.isKeyBackward(i.recentNavEvent)})),w(E||i.mostRecentlyFocusedNode||m())}i.recentNavEvent=void 0},K=function(u){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=u;var g=y({event:u,isBackward:f});g&&(ye(u)&&u.preventDefault(),w(g))},H=function(u){(s.isKeyForward(u)||s.isKeyBackward(u))&&K(u,s.isKeyBackward(u))},W=function(u){Cn(u)&&ge(s.escapeDeactivates,u)!==!1&&(u.preventDefault(),o.deactivate())},j=function(u){var f=Te(u);c(f,u)>=0||ge(s.clickOutsideDeactivates,u)||ge(s.allowOutsideClick,u)||(u.preventDefault(),u.stopImmediatePropagation())},$=function(){if(i.active)return U.activateTrap(r,o),i.delayInitialFocusTimer=s.delayInitialFocus?ht(function(){w(m())}):w(m()),n.addEventListener("focusin",L,!0),n.addEventListener("mousedown",O,{capture:!0,passive:!1}),n.addEventListener("touchstart",O,{capture:!0,passive:!1}),n.addEventListener("click",j,{capture:!0,passive:!1}),n.addEventListener("keydown",H,{capture:!0,passive:!1}),n.addEventListener("keydown",W),o},Ce=function(u){i.active&&!i.paused&&o._setSubtreeIsolation(!1),i.adjacentElements.clear(),i.alreadySilent.clear();var f=new Set,g=new Set,E=ut(u),x;try{for(E.s();!(x=E.n()).done;){var I=x.value;f.add(I);for(var S=typeof ShadowRoot<"u"&&I.getRootNode()instanceof ShadowRoot,v=I;v;){f.add(v);var d=v.parentElement,_=[];d?_=d.children:!d&&S&&(_=v.getRootNode().children,d=v.getRootNode().host,S=typeof ShadowRoot<"u"&&d.getRootNode()instanceof ShadowRoot);var R=ut(_),A;try{for(R.s();!(A=R.n()).done;){var C=A.value;g.add(C)}}catch(D){R.e(D)}finally{R.f()}v=d}}}catch(D){E.e(D)}finally{E.f()}f.forEach(function(D){g.delete(D)}),i.adjacentElements=g},M=function(){if(i.active)return n.removeEventListener("focusin",L,!0),n.removeEventListener("mousedown",O,!0),n.removeEventListener("touchstart",O,!0),n.removeEventListener("click",j,!0),n.removeEventListener("keydown",H,!0),n.removeEventListener("keydown",W),o},Z=function(u){var f=u.some(function(g){var E=Array.from(g.removedNodes);return E.some(function(x){return x===i.mostRecentlyFocusedNode})});f&&w(m())},X=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(Z):void 0,ee=function(){X&&(X.disconnect(),i.active&&!i.paused&&i.containers.map(function(u){X.observe(u,{subtree:!0,childList:!0})}))};return o={get active(){return i.active},get paused(){return i.paused},activate:function(u){if(i.active)return this;var f=l(u,"onActivate"),g=l(u,"onPostActivate"),E=l(u,"checkCanFocusTrap"),x=U.getActiveTrap(r),I=!1;if(x&&!x.paused){var S;(S=x._setSubtreeIsolation)===null||S===void 0||S.call(x,!1),I=!0}try{E||p(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=b(n),f==null||f();var v=function(){E&&p(),$(),ee(),s.isolateSubtrees&&o._setSubtreeIsolation(!0),g==null||g()};if(E)return E(i.containers.concat()).then(v,v),this;v()}catch(_){if(x===U.getActiveTrap(r)&&I){var d;(d=x._setSubtreeIsolation)===null||d===void 0||d.call(x,!0)}throw _}return this},deactivate:function(u){if(!i.active)return this;var f=ft({onDeactivate:s.onDeactivate,onPostDeactivate:s.onPostDeactivate,checkCanReturnFocus:s.checkCanReturnFocus},u);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,i.paused||o._setSubtreeIsolation(!1),i.alreadySilent.clear(),M(),i.active=!1,i.paused=!1,ee(),U.deactivateTrap(r,o);var g=l(f,"onDeactivate"),E=l(f,"onPostDeactivate"),x=l(f,"checkCanReturnFocus"),I=l(f,"returnFocus","returnFocusOnDeactivate");g==null||g();var S=function(){ht(function(){I&&w(k(i.nodeFocusedBeforeActivation)),E==null||E()})};return I&&x?(x(k(i.nodeFocusedBeforeActivation)).then(S,S),this):(S(),this)},pause:function(u){return i.active?(i.manuallyPaused=!0,this._setPausedState(!0,u)):this},unpause:function(u){return i.active?(i.manuallyPaused=!1,r[r.length-1]!==this?this:this._setPausedState(!1,u)):this},updateContainerElements:function(u){var f=[].concat(u).filter(Boolean);return i.containers=f.map(function(g){return typeof g=="string"?n.querySelector(g):g}),s.isolateSubtrees&&Ce(i.containers),i.active&&(p(),s.isolateSubtrees&&!i.paused&&o._setSubtreeIsolation(!0)),ee(),this}},Object.defineProperties(o,{_isManuallyPaused:{value:function(){return i.manuallyPaused}},_setPausedState:{value:function(u,f){if(i.paused===u)return this;if(i.paused=u,u){var g=l(f,"onPause"),E=l(f,"onPostPause");g==null||g(),M(),ee(),o._setSubtreeIsolation(!1),E==null||E()}else{var x=l(f,"onUnpause"),I=l(f,"onPostUnpause");x==null||x(),o._setSubtreeIsolation(!0),p(),$(),ee(),I==null||I()}return this}},_setSubtreeIsolation:{value:function(u){s.isolateSubtrees&&i.adjacentElements.forEach(function(f){var g;if(u)switch(s.isolateSubtrees){case"aria-hidden":(f.ariaHidden==="true"||((g=f.getAttribute("aria-hidden"))===null||g===void 0?void 0:g.toLowerCase())==="true")&&i.alreadySilent.add(f),f.setAttribute("aria-hidden","true");break;default:(f.inert||f.hasAttribute("inert"))&&i.alreadySilent.add(f),f.setAttribute("inert",!0);break}else if(!i.alreadySilent.has(f))switch(s.isolateSubtrees){case"aria-hidden":f.removeAttribute("aria-hidden");break;default:f.removeAttribute("inert");break}})}}}),o.updateContainerElements(e),o};function zn(a,e={}){let t;const{immediate:n,...r}=e,s=ce(!1),i=ce(!1),o=p=>t&&t.activate(p),l=p=>t&&t.deactivate(p),c=()=>{t&&(t.pause(),i.value=!0)},h=()=>{t&&(t.unpause(),i.value=!1)},m=be(()=>{const p=rt(a);return Lt(p).map(b=>{const w=rt(b);return typeof w=="string"?w:Dt(w)}).filter(Pt)});return Be(m,p=>{p.length&&(t=Pn(p,{...r,onActivate(){s.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){s.value=!1,e.onDeactivate&&e.onDeactivate()}}),n&&o())},{flush:"post"}),Mt(()=>l()),{hasFocus:s,isPaused:i,activate:o,deactivate:l,pause:c,unpause:h}}class ue{constructor(e,t=!0,n=[],r=5e3){this.ctx=e,this.iframes=t,this.exclude=n,this.iframesTimeout=r}static matches(e,t){const n=typeof t=="string"?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){let s=!1;return n.every(i=>r.call(e,i)?(s=!0,!1):!0),s}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(n=>{const r=t.filter(s=>s.contains(n)).length>0;t.indexOf(n)===-1&&!r&&t.push(n)}),t}getIframeContents(e,t,n=()=>{}){let r;try{const s=e.contentWindow;if(r=s.document,!s||!r)throw new Error("iframe inaccessible")}catch{n()}r&&t(r)}isIframeBlank(e){const t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}observeIframeLoad(e,t,n){let r=!1,s=null;const i=()=>{if(!r){r=!0,clearTimeout(s);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,n))}catch{n()}}};e.addEventListener("load",i),s=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,n){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch{n()}}waitForIframes(e,t){let n=0;this.forEachIframe(e,()=>!0,r=>{n++,this.waitForIframes(r.querySelector("html"),()=>{--n||t()})},r=>{r||t()})}forEachIframe(e,t,n,r=()=>{}){let s=e.querySelectorAll("iframe"),i=s.length,o=0;s=Array.prototype.slice.call(s);const l=()=>{--i<=0&&r(o)};i||l(),s.forEach(c=>{ue.matches(c,this.exclude)?l():this.onIframeReady(c,h=>{t(c)&&(o++,n(h)),l()},l)})}createIterator(e,t,n){return document.createNodeIterator(e,t,n,!1)}createInstanceOnIframe(e){return new ue(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,n){const r=e.compareDocumentPosition(n),s=Node.DOCUMENT_POSITION_PRECEDING;if(r&s)if(t!==null){const i=t.compareDocumentPosition(n),o=Node.DOCUMENT_POSITION_FOLLOWING;if(i&o)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let n;return t===null?n=e.nextNode():n=e.nextNode()&&e.nextNode(),{prevNode:t,node:n}}checkIframeFilter(e,t,n,r){let s=!1,i=!1;return r.forEach((o,l)=>{o.val===n&&(s=l,i=o.handled)}),this.compareNodeIframe(e,t,n)?(s===!1&&!i?r.push({val:n,handled:!0}):s!==!1&&!i&&(r[s].handled=!0),!0):(s===!1&&r.push({val:n,handled:!1}),!1)}handleOpenIframes(e,t,n,r){e.forEach(s=>{s.handled||this.getIframeContents(s.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,n,r)})})}iterateThroughNodes(e,t,n,r,s){const i=this.createIterator(t,e,r);let o=[],l=[],c,h,m=()=>({prevNode:h,node:c}=this.getIteratorNode(i),c);for(;m();)this.iframes&&this.forEachIframe(t,p=>this.checkIframeFilter(c,h,p,o),p=>{this.createInstanceOnIframe(p).forEachNode(e,b=>l.push(b),r)}),l.push(c);l.forEach(p=>{n(p)}),this.iframes&&this.handleOpenIframes(o,e,n,r),s()}forEachNode(e,t,n,r=()=>{}){const s=this.getContexts();let i=s.length;i||r(),s.forEach(o=>{const l=()=>{this.iterateThroughNodes(e,o,t,n,()=>{--i<=0&&r()})};this.iframes?this.waitForIframes(o,l):l()})}}let Vn=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new ue(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const n=this.opt.log;this.opt.debug&&typeof n=="object"&&typeof n[t]=="function"&&n[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let s in t)if(t.hasOwnProperty(s)){const i=t[s],o=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(s):this.escapeStr(s),l=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);o!==""&&l!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(o)}|${this.escapeStr(l)})`,`gm${n}`),r+`(${this.processSynomyms(o)}|${this.processSynomyms(l)})`+r))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,n,r)=>{let s=r.charAt(n+1);return/[(|)\\]/.test(s)||s===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let r=[];return e.split("").forEach(s=>{n.every(i=>{if(i.indexOf(s)!==-1){if(r.indexOf(i)>-1)return!1;e=e.replace(new RegExp(`[${i}]`,`gm${t}`),`[${i}]`),r.push(i)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let n=this.opt.accuracy,r=typeof n=="string"?n:n.value,s=typeof n=="string"?[]:n.limiters,i="";switch(s.forEach(o=>{i+=`|${this.escapeStr(o)}`}),r){case"partially":default:return`()(${e})`;case"complementary":return i="\\s"+(i||this.escapeStr(t)),`()([^${i}]*${e}[^${i}]*)`;case"exactly":return`(^|\\s${i})(${e})(?=$|\\s${i})`}}getSeparatedKeywords(e){let t=[];return e.forEach(n=>{this.opt.separateWordSearch?n.split(" ").forEach(r=>{r.trim()&&t.indexOf(r)===-1&&t.push(r)}):n.trim()&&t.indexOf(n)===-1&&t.push(n)}),{keywords:t.sort((n,r)=>r.length-n.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let n=0;return e.sort((r,s)=>r.start-s.start).forEach(r=>{let{start:s,end:i,valid:o}=this.callNoMatchOnInvalidRanges(r,n);o&&(r.start=s,r.length=i-s,t.push(r),n=i)}),t}callNoMatchOnInvalidRanges(e,t){let n,r,s=!1;return e&&typeof e.start<"u"?(n=parseInt(e.start,10),r=n+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?s=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:n,end:r,valid:s}}checkWhitespaceRanges(e,t,n){let r,s=!0,i=n.length,o=t-i,l=parseInt(e.start,10)-o;return l=l>i?i:l,r=l+parseInt(e.length,10),r>i&&(r=i,this.log(`End range automatically set to the max value of ${i}`)),l<0||r-l<0||l>i||r>i?(s=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):n.substring(l,r).replace(/\s+/g,"")===""&&(s=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:l,end:r,valid:s}}getTextNodes(e){let t="",n=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,r=>{n.push({start:t.length,end:(t+=r.textContent).length,node:r})},r=>this.matchesExclude(r.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:n})})}matchesExclude(e){return ue.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,n){const r=this.opt.element?this.opt.element:"mark",s=e.splitText(t),i=s.splitText(n-t);let o=document.createElement(r);return o.setAttribute("data-markjs","true"),this.opt.className&&o.setAttribute("class",this.opt.className),o.textContent=s.textContent,s.parentNode.replaceChild(o,s),i}wrapRangeInMappedTextNode(e,t,n,r,s){e.nodes.every((i,o)=>{const l=e.nodes[o+1];if(typeof l>"u"||l.start>t){if(!r(i.node))return!1;const c=t-i.start,h=(n>i.end?i.end:n)-i.start,m=e.value.substr(0,i.start),p=e.value.substr(h+i.start);if(i.node=this.wrapRangeInTextNode(i.node,c,h),e.value=m+p,e.nodes.forEach((b,w)=>{w>=o&&(e.nodes[w].start>0&&w!==o&&(e.nodes[w].start-=h),e.nodes[w].end-=h)}),n-=h,s(i.node.previousSibling,i.start),n>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,n,r,s){const i=t===0?0:t+1;this.getTextNodes(o=>{o.nodes.forEach(l=>{l=l.node;let c;for(;(c=e.exec(l.textContent))!==null&&c[i]!=="";){if(!n(c[i],l))continue;let h=c.index;if(i!==0)for(let m=1;m{let l;for(;(l=e.exec(o.value))!==null&&l[i]!=="";){let c=l.index;if(i!==0)for(let m=1;mn(l[i],m),(m,p)=>{e.lastIndex=p,r(m)})}s()})}wrapRangeFromIndex(e,t,n,r){this.getTextNodes(s=>{const i=s.value.length;e.forEach((o,l)=>{let{start:c,end:h,valid:m}=this.checkWhitespaceRanges(o,i,s.value);m&&this.wrapRangeInMappedTextNode(s,c,h,p=>t(p,o,s.value.substring(c,h),l),p=>{n(p,o)})}),r()})}unwrapMatches(e){const t=e.parentNode;let n=document.createDocumentFragment();for(;e.firstChild;)n.appendChild(e.removeChild(e.firstChild));t.replaceChild(n,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let n=0,r="wrapMatches";const s=i=>{n++,this.opt.each(i)};this.opt.acrossElements&&(r="wrapMatchesAcrossElements"),this[r](e,this.opt.ignoreGroups,(i,o)=>this.opt.filter(o,i,n),s,()=>{n===0&&this.opt.noMatch(e),this.opt.done(n)})}mark(e,t){this.opt=t;let n=0,r="wrapMatches";const{keywords:s,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),o=this.opt.caseSensitive?"":"i",l=c=>{let h=new RegExp(this.createRegExp(c),`gm${o}`),m=0;this.log(`Searching with expression "${h}"`),this[r](h,1,(p,b)=>this.opt.filter(b,c,n,m),p=>{m++,n++,this.opt.each(p)},()=>{m===0&&this.opt.noMatch(c),s[i-1]===c?this.opt.done(n):l(s[s.indexOf(c)+1])})};this.opt.acrossElements&&(r="wrapMatchesAcrossElements"),i===0?this.opt.done(n):l(s[0])}markRanges(e,t){this.opt=t;let n=0,r=this.checkRanges(e);r&&r.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(r)),this.wrapRangeFromIndex(r,(s,i,o,l)=>this.opt.filter(s,i,o,l),(s,i)=>{n++,this.opt.each(s,i)},()=>{this.opt.done(n)})):this.opt.done(n)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,n=>{this.unwrapMatches(n)},n=>{const r=ue.matches(n,t),s=this.matchesExclude(n);return!r||s?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function jn(a){const e=new Vn(a);return this.mark=(t,n)=>(e.mark(t,n),this),this.markRegExp=(t,n)=>(e.markRegExp(t,n),this),this.markRanges=(t,n)=>(e.markRanges(t,n),this),this.unmark=t=>(e.unmark(t),this),this}const $n="ENTRIES",Et="KEYS",It="VALUES",z="";class Pe{constructor(e,t){const n=e._tree,r=Array.from(n.keys());this.set=e,this._type=t,this._path=r.length>0?[{node:n,keys:r}]:[]}next(){const e=this.dive();return this.backtrack(),e}dive(){if(this._path.length===0)return{done:!0,value:void 0};const{node:e,keys:t}=le(this._path);if(le(t)===z)return{done:!1,value:this.result()};const n=e.get(le(t));return this._path.push({node:n,keys:Array.from(n.keys())}),this.dive()}backtrack(){if(this._path.length===0)return;const e=le(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}key(){return this.set._prefix+this._path.map(({keys:e})=>le(e)).filter(e=>e!==z).join("")}value(){return le(this._path).node.get(z)}result(){switch(this._type){case It:return this.value();case Et:return this.key();default:return[this.key(),this.value()]}}[Symbol.iterator](){return this}}const le=a=>a[a.length-1],Bn=(a,e,t)=>{const n=new Map;if(e===void 0)return n;const r=e.length+1,s=r+t,i=new Uint8Array(s*r).fill(t+1);for(let o=0;o{const l=s*i;e:for(const c of a.keys())if(c===z){const h=r[l-1];h<=t&&n.set(o,[a.get(c),h])}else{let h=s;for(let m=0;mt)continue e}kt(a.get(c),e,t,n,r,h,i,o+c)}};class Y{constructor(e=new Map,t=""){this._size=void 0,this._tree=e,this._prefix=t}atPrefix(e){if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");const[t,n]=Ae(this._tree,e.slice(this._prefix.length));if(t===void 0){const[r,s]=He(n);for(const i of r.keys())if(i!==z&&i.startsWith(s)){const o=new Map;return o.set(i.slice(s.length),r.get(i)),new Y(o,e)}}return new Y(t,e)}clear(){this._size=void 0,this._tree.clear()}delete(e){return this._size=void 0,Wn(this._tree,e)}entries(){return new Pe(this,$n)}forEach(e){for(const[t,n]of this)e(t,n,this)}fuzzyGet(e,t){return Bn(this._tree,e,t)}get(e){const t=Je(this._tree,e);return t!==void 0?t.get(z):void 0}has(e){const t=Je(this._tree,e);return t!==void 0&&t.has(z)}keys(){return new Pe(this,Et)}set(e,t){if(typeof e!="string")throw new Error("key must be a string");return this._size=void 0,ze(this._tree,e).set(z,t),this}get size(){if(this._size)return this._size;this._size=0;const e=this.entries();for(;!e.next().done;)this._size+=1;return this._size}update(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const n=ze(this._tree,e);return n.set(z,t(n.get(z))),this}fetch(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const n=ze(this._tree,e);let r=n.get(z);return r===void 0&&n.set(z,r=t()),r}values(){return new Pe(this,It)}[Symbol.iterator](){return this.entries()}static from(e){const t=new Y;for(const[n,r]of e)t.set(n,r);return t}static fromObject(e){return Y.from(Object.entries(e))}}const Ae=(a,e,t=[])=>{if(e.length===0||a==null)return[a,t];for(const n of a.keys())if(n!==z&&e.startsWith(n))return t.push([a,n]),Ae(a.get(n),e.slice(n.length),t);return t.push([a,e]),Ae(void 0,"",t)},Je=(a,e)=>{if(e.length===0||a==null)return a;for(const t of a.keys())if(t!==z&&e.startsWith(t))return Je(a.get(t),e.slice(t.length))},ze=(a,e)=>{const t=e.length;e:for(let n=0;a&&n{const[t,n]=Ae(a,e);if(t!==void 0){if(t.delete(z),t.size===0)Nt(n);else if(t.size===1){const[r,s]=t.entries().next().value;Ft(n,r,s)}}},Nt=a=>{if(a.length===0)return;const[e,t]=He(a);if(e.delete(t),e.size===0)Nt(a.slice(0,-1));else if(e.size===1){const[n,r]=e.entries().next().value;n!==z&&Ft(a.slice(0,-1),n,r)}},Ft=(a,e,t)=>{if(a.length===0)return;const[n,r]=He(a);n.set(r+e,t),n.delete(r)},He=a=>a[a.length-1],Ge="or",Rt="and",Kn="and_not";class de{constructor(e){if((e==null?void 0:e.fields)==null)throw new Error('MiniSearch: option "fields" must be provided');const t=e.autoVacuum==null||e.autoVacuum===!0?$e:e.autoVacuum;this._options={...je,...e,autoVacuum:t,searchOptions:{...vt,...e.searchOptions||{}},autoSuggestOptions:{...Gn,...e.autoSuggestOptions||{}}},this._index=new Y,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldIds={},this._fieldLength=new Map,this._avgFieldLength=[],this._nextId=0,this._storedFields=new Map,this._dirtCount=0,this._currentVacuum=null,this._enqueuedVacuum=null,this._enqueuedVacuumConditions=Ue,this.addFields(this._options.fields)}add(e){const{extractField:t,stringifyField:n,tokenize:r,processTerm:s,fields:i,idField:o}=this._options,l=t(e,o);if(l==null)throw new Error(`MiniSearch: document does not have ID field "${o}"`);if(this._idToShortId.has(l))throw new Error(`MiniSearch: duplicate ID ${l}`);const c=this.addDocumentId(l);this.saveStoredFields(c,e);for(const h of i){const m=t(e,h);if(m==null)continue;const p=r(n(m,h),h),b=this._fieldIds[h],w=new Set(p).size;this.addFieldLength(c,b,this._documentCount-1,w);for(const k of p){const y=s(k,h);if(Array.isArray(y))for(const O of y)this.addTerm(b,c,O);else y&&this.addTerm(b,c,y)}}}addAll(e){for(const t of e)this.add(t)}addAllAsync(e,t={}){const{chunkSize:n=10}=t,r={chunk:[],promise:Promise.resolve()},{chunk:s,promise:i}=e.reduce(({chunk:o,promise:l},c,h)=>(o.push(c),(h+1)%n===0?{chunk:[],promise:l.then(()=>new Promise(m=>setTimeout(m,0))).then(()=>this.addAll(o))}:{chunk:o,promise:l}),r);return i.then(()=>this.addAll(s))}remove(e){const{tokenize:t,processTerm:n,extractField:r,stringifyField:s,fields:i,idField:o}=this._options,l=r(e,o);if(l==null)throw new Error(`MiniSearch: document does not have ID field "${o}"`);const c=this._idToShortId.get(l);if(c==null)throw new Error(`MiniSearch: cannot remove document with ID ${l}: it is not in the index`);for(const h of i){const m=r(e,h);if(m==null)continue;const p=t(s(m,h),h),b=this._fieldIds[h],w=new Set(p).size;this.removeFieldLength(c,b,this._documentCount,w);for(const k of p){const y=n(k,h);if(Array.isArray(y))for(const O of y)this.removeTerm(b,c,O);else y&&this.removeTerm(b,c,y)}}this._storedFields.delete(c),this._documentIds.delete(c),this._idToShortId.delete(l),this._fieldLength.delete(c),this._documentCount-=1}removeAll(e){if(e)for(const t of e)this.remove(t);else{if(arguments.length>0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new Y,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}}discard(e){const t=this._idToShortId.get(e);if(t==null)throw new Error(`MiniSearch: cannot discard document with ID ${e}: it is not in the index`);this._idToShortId.delete(e),this._documentIds.delete(t),this._storedFields.delete(t),(this._fieldLength.get(t)||[]).forEach((n,r)=>{this.removeFieldLength(t,r,this._documentCount,n)}),this._fieldLength.delete(t),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()}maybeAutoVacuum(){if(this._options.autoVacuum===!1)return;const{minDirtFactor:e,minDirtCount:t,batchSize:n,batchWait:r}=this._options.autoVacuum;this.conditionalVacuum({batchSize:n,batchWait:r},{minDirtCount:t,minDirtFactor:e})}discardAll(e){const t=this._options.autoVacuum;try{this._options.autoVacuum=!1;for(const n of e)this.discard(n)}finally{this._options.autoVacuum=t}this.maybeAutoVacuum()}replace(e){const{idField:t,extractField:n}=this._options,r=n(e,t);this.discard(r),this.add(e)}vacuum(e={}){return this.conditionalVacuum(e)}conditionalVacuum(e,t){return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(()=>{const n=this._enqueuedVacuumConditions;return this._enqueuedVacuumConditions=Ue,this.performVacuuming(e,n)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)}async performVacuuming(e,t){const n=this._dirtCount;if(this.vacuumConditionsMet(t)){const r=e.batchSize||qe.batchSize,s=e.batchWait||qe.batchWait;let i=1;for(const[o,l]of this._index){for(const[c,h]of l)for(const[m]of h)this._documentIds.has(m)||(h.size<=1?l.delete(c):h.delete(m));this._index.get(o).size===0&&this._index.delete(o),i%r===0&&await new Promise(c=>setTimeout(c,s)),i+=1}this._dirtCount-=n}await null,this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null}vacuumConditionsMet(e){if(e==null)return!0;let{minDirtCount:t,minDirtFactor:n}=e;return t=t||$e.minDirtCount,n=n||$e.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=n}get isVacuuming(){return this._currentVacuum!=null}get dirtCount(){return this._dirtCount}get dirtFactor(){return this._dirtCount/(1+this._documentCount+this._dirtCount)}has(e){return this._idToShortId.has(e)}getStoredFields(e){const t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)}search(e,t={}){const{searchOptions:n}=this._options,r={...n,...t},s=this.executeQuery(e,t),i=[];for(const[o,{score:l,terms:c,match:h}]of s){const m=c.length||1,p={id:this._documentIds.get(o),score:l*m,terms:Object.keys(h),queryTerms:c,match:h};Object.assign(p,this._storedFields.get(o)),(r.filter==null||r.filter(p))&&i.push(p)}return e===de.wildcard&&r.boostDocument==null||i.sort(mt),i}autoSuggest(e,t={}){t={...this._options.autoSuggestOptions,...t};const n=new Map;for(const{score:s,terms:i}of this.search(e,t)){const o=i.join(" "),l=n.get(o);l!=null?(l.score+=s,l.count+=1):n.set(o,{score:s,terms:i,count:1})}const r=[];for(const[s,{score:i,terms:o,count:l}]of n)r.push({suggestion:s,terms:o,score:i/l});return r.sort(mt),r}get documentCount(){return this._documentCount}get termCount(){return this._index.size}static loadJSON(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)}static async loadJSONAsync(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJSAsync(JSON.parse(e),t)}static getDefault(e){if(je.hasOwnProperty(e))return Ve(je,e);throw new Error(`MiniSearch: unknown option "${e}"`)}static loadJS(e,t){const{index:n,documentIds:r,fieldLength:s,storedFields:i,serializationVersion:o}=e,l=this.instantiateMiniSearch(e,t);l._documentIds=Ee(r),l._fieldLength=Ee(s),l._storedFields=Ee(i);for(const[c,h]of l._documentIds)l._idToShortId.set(h,c);for(const[c,h]of n){const m=new Map;for(const p of Object.keys(h)){let b=h[p];o===1&&(b=b.ds),m.set(parseInt(p,10),Ee(b))}l._index.set(c,m)}return l}static async loadJSAsync(e,t){const{index:n,documentIds:r,fieldLength:s,storedFields:i,serializationVersion:o}=e,l=this.instantiateMiniSearch(e,t);l._documentIds=await Ie(r),l._fieldLength=await Ie(s),l._storedFields=await Ie(i);for(const[h,m]of l._documentIds)l._idToShortId.set(m,h);let c=0;for(const[h,m]of n){const p=new Map;for(const b of Object.keys(m)){let w=m[b];o===1&&(w=w.ds),p.set(parseInt(b,10),await Ie(w))}++c%1e3===0&&await Ot(0),l._index.set(h,p)}return l}static instantiateMiniSearch(e,t){const{documentCount:n,nextId:r,fieldIds:s,averageFieldLength:i,dirtCount:o,serializationVersion:l}=e;if(l!==1&&l!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");const c=new de(t);return c._documentCount=n,c._nextId=r,c._idToShortId=new Map,c._fieldIds=s,c._avgFieldLength=i,c._dirtCount=o||0,c._index=new Y,c}executeQuery(e,t={}){if(e===de.wildcard)return this.executeWildcardQuery(t);if(typeof e!="string"){const p={...t,...e,queries:void 0},b=e.queries.map(w=>this.executeQuery(w,p));return this.combineResults(b,p.combineWith)}const{tokenize:n,processTerm:r,searchOptions:s}=this._options,i={tokenize:n,processTerm:r,...s,...t},{tokenize:o,processTerm:l}=i,m=o(e).flatMap(p=>l(p)).filter(p=>!!p).map(Hn(i)).map(p=>this.executeQuerySpec(p,i));return this.combineResults(m,i.combineWith)}executeQuerySpec(e,t){const n={...this._options.searchOptions,...t},r=(n.fields||this._options.fields).reduce((k,y)=>({...k,[y]:Ve(n.boost,y)||1}),{}),{boostDocument:s,weights:i,maxFuzzy:o,bm25:l}=n,{fuzzy:c,prefix:h}={...vt.weights,...i},m=this._index.get(e.term),p=this.termResults(e.term,e.term,1,e.termBoost,m,r,s,l);let b,w;if(e.prefix&&(b=this._index.atPrefix(e.term)),e.fuzzy){const k=e.fuzzy===!0?.2:e.fuzzy,y=k<1?Math.min(o,Math.round(e.term.length*k)):k;y&&(w=this._index.fuzzyGet(e.term,y))}if(b)for(const[k,y]of b){const O=k.length-e.term.length;if(!O)continue;w==null||w.delete(k);const L=h*k.length/(k.length+.3*O);this.termResults(e.term,k,L,e.termBoost,y,r,s,l,p)}if(w)for(const k of w.keys()){const[y,O]=w.get(k);if(!O)continue;const L=c*k.length/(k.length+O);this.termResults(e.term,k,L,e.termBoost,y,r,s,l,p)}return p}executeWildcardQuery(e){const t=new Map,n={...this._options.searchOptions,...e};for(const[r,s]of this._documentIds){const i=n.boostDocument?n.boostDocument(s,"",this._storedFields.get(r)):1;t.set(r,{score:i,terms:[],match:{}})}return t}combineResults(e,t=Ge){if(e.length===0)return new Map;const n=t.toLowerCase(),r=Jn[n];if(!r)throw new Error(`Invalid combination operator: ${t}`);return e.reduce(r)||new Map}toJSON(){const e=[];for(const[t,n]of this._index){const r={};for(const[s,i]of n)r[s]=Object.fromEntries(i);e.push([t,r])}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:e,serializationVersion:2}}termResults(e,t,n,r,s,i,o,l,c=new Map){if(s==null)return c;for(const h of Object.keys(i)){const m=i[h],p=this._fieldIds[h],b=s.get(p);if(b==null)continue;let w=b.size;const k=this._avgFieldLength[p];for(const y of b.keys()){if(!this._documentIds.has(y)){this.removeTerm(p,y,t),w-=1;continue}const O=o?o(this._documentIds.get(y),t,this._storedFields.get(y)):1;if(!O)continue;const L=b.get(y),K=this._fieldLength.get(y)[p],H=Un(L,w,this._documentCount,K,k,l),W=n*r*m*O*H,j=c.get(y);if(j){j.score+=W,Qn(j.terms,e);const $=Ve(j.match,t);$?$.push(h):j.match[t]=[h]}else c.set(y,{score:W,terms:[e],match:{[t]:[h]}})}}return c}addTerm(e,t,n){const r=this._index.fetch(n,gt);let s=r.get(e);if(s==null)s=new Map,s.set(t,1),r.set(e,s);else{const i=s.get(t);s.set(t,(i||0)+1)}}removeTerm(e,t,n){if(!this._index.has(n)){this.warnDocumentChanged(t,e,n);return}const r=this._index.fetch(n,gt),s=r.get(e);s==null||s.get(t)==null?this.warnDocumentChanged(t,e,n):s.get(t)<=1?s.size<=1?r.delete(e):s.delete(t):s.set(t,s.get(t)-1),this._index.get(n).size===0&&this._index.delete(n)}warnDocumentChanged(e,t,n){for(const r of Object.keys(this._fieldIds))if(this._fieldIds[r]===t){this._options.logger("warn",`MiniSearch: document with ID ${this._documentIds.get(e)} has changed before removal: term "${n}" was not present in field "${r}". Removing a document after it has changed can corrupt the index!`,"version_conflict");return}}addDocumentId(e){const t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t}addFields(e){for(let t=0;tObject.prototype.hasOwnProperty.call(a,e)?a[e]:void 0,Jn={[Ge]:(a,e)=>{for(const t of e.keys()){const n=a.get(t);if(n==null)a.set(t,e.get(t));else{const{score:r,terms:s,match:i}=e.get(t);n.score=n.score+r,n.match=Object.assign(n.match,i),pt(n.terms,s)}}return a},[Rt]:(a,e)=>{const t=new Map;for(const n of e.keys()){const r=a.get(n);if(r==null)continue;const{score:s,terms:i,match:o}=e.get(n);pt(r.terms,i),t.set(n,{score:r.score+s,terms:r.terms,match:Object.assign(r.match,o)})}return t},[Kn]:(a,e)=>{for(const t of e.keys())a.delete(t);return a}},qn={k:1.2,b:.7,d:.5},Un=(a,e,t,n,r,s)=>{const{k:i,b:o,d:l}=s;return Math.log(1+(t-e+.5)/(e+.5))*(l+a*(i+1)/(a+i*(1-o+o*n/r)))},Hn=a=>(e,t,n)=>{const r=typeof a.fuzzy=="function"?a.fuzzy(e,t,n):a.fuzzy||!1,s=typeof a.prefix=="function"?a.prefix(e,t,n):a.prefix===!0,i=typeof a.boostTerm=="function"?a.boostTerm(e,t,n):1;return{term:e,fuzzy:r,prefix:s,termBoost:i}},je={idField:"id",extractField:(a,e)=>a[e],stringifyField:(a,e)=>a.toString(),tokenize:a=>a.split(Yn),processTerm:a=>a.toLowerCase(),fields:void 0,searchOptions:void 0,storeFields:[],logger:(a,e)=>{typeof(console==null?void 0:console[a])=="function"&&console[a](e)},autoVacuum:!0},vt={combineWith:Ge,prefix:!1,fuzzy:!1,maxFuzzy:6,boost:{},weights:{fuzzy:.45,prefix:.375},bm25:qn},Gn={combineWith:Rt,prefix:(a,e,t)=>e===t.length-1},qe={batchSize:1e3,batchWait:10},Ue={minDirtFactor:.1,minDirtCount:20},$e={...qe,...Ue},Qn=(a,e)=>{a.includes(e)||a.push(e)},pt=(a,e)=>{for(const t of e)a.includes(t)||a.push(t)},mt=({score:a},{score:e})=>e-a,gt=()=>new Map,Ee=a=>{const e=new Map;for(const t of Object.keys(a))e.set(parseInt(t,10),a[t]);return e},Ie=async a=>{const e=new Map;let t=0;for(const n of Object.keys(a))e.set(parseInt(n,10),a[n]),++t%1e3===0&&await Ot(0);return e},Ot=a=>new Promise(e=>setTimeout(e,a)),Yn=/[\n\r\p{Z}\p{P}]+/u;class Zn{constructor(e=10){Me(this,"max");Me(this,"cache");this.max=e,this.cache=new Map}get(e){let t=this.cache.get(e);return t!==void 0&&(this.cache.delete(e),this.cache.set(e,t)),t}set(e,t){this.cache.has(e)?this.cache.delete(e):this.cache.size===this.max&&this.cache.delete(this.first()),this.cache.set(e,t)}first(){return this.cache.keys().next().value}clear(){this.cache.clear()}}const Xn=["aria-owns"],er={class:"shell"},tr=["title"],nr={class:"search-actions before"},rr=["title"],ir=["aria-activedescendant","aria-controls","placeholder"],sr={class:"search-actions"},ar=["title"],or=["disabled","title"],lr=["id","role","aria-labelledby"],cr=["id","aria-selected"],ur=["href","aria-label","onMouseenter","onFocusin","data-index"],dr={class:"titles"},fr=["innerHTML"],hr={class:"title main"},vr=["innerHTML"],pr={key:0,class:"excerpt-wrapper"},mr={key:0,class:"excerpt",inert:""},gr=["innerHTML"],br={key:0,class:"no-results"},yr={class:"search-keyboard-shortcuts"},wr=["aria-label"],Sr=["aria-label"],_r=["aria-label"],xr=["aria-label"],Tr=zt({__name:"VPLocalSearchBox",emits:["close"],setup(a,{emit:e}){var I,S;const t=e,n=ce(),r=ce(),s=ce(ln),i=an(),{activate:o}=zn(n,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:l,theme:c}=i,h=it(async()=>{var v,d,_,R,A,C,D,F,V;return lt(de.loadJSON((_=await((d=(v=s.value)[l.value])==null?void 0:d.call(v)))==null?void 0:_.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((R=c.value.search)==null?void 0:R.provider)==="local"&&((C=(A=c.value.search.options)==null?void 0:A.miniSearch)==null?void 0:C.searchOptions)},...((D=c.value.search)==null?void 0:D.provider)==="local"&&((V=(F=c.value.search.options)==null?void 0:F.miniSearch)==null?void 0:V.options)}))}),p=be(()=>{var v,d;return((v=c.value.search)==null?void 0:v.provider)==="local"&&((d=c.value.search.options)==null?void 0:d.disableQueryPersistence)===!0}).value?he(""):Vt("vitepress:local-search-filter",""),b=jt("vitepress:local-search-detailed-list",((I=c.value.search)==null?void 0:I.provider)==="local"&&((S=c.value.search.options)==null?void 0:S.detailedView)===!0),w=be(()=>{var v,d,_;return((v=c.value.search)==null?void 0:v.provider)==="local"&&(((d=c.value.search.options)==null?void 0:d.disableDetailedView)===!0||((_=c.value.search.options)==null?void 0:_.detailedView)===!1)}),k=be(()=>{var d,_,R,A,C,D,F;const v=((d=c.value.search)==null?void 0:d.options)??c.value.algolia;return((C=(A=(R=(_=v==null?void 0:v.locales)==null?void 0:_[l.value])==null?void 0:R.translations)==null?void 0:A.button)==null?void 0:C.buttonText)||((F=(D=v==null?void 0:v.translations)==null?void 0:D.button)==null?void 0:F.buttonText)||"Search"});$t(()=>{w.value&&(b.value=!1)});const y=ce([]),O=he(!1);Be(p,()=>{O.value=!1});const L=it(async()=>{if(r.value)return lt(new jn(r.value))},null),K=new Zn(16);Bt(()=>[h.value,p.value,b.value],async([v,d,_],R,A)=>{var te,we,Qe,Ye;(R==null?void 0:R[0])!==v&&K.clear();let C=!1;if(A(()=>{C=!0}),!v)return;y.value=v.search(d).slice(0,16),O.value=!0;const D=_?await Promise.all(y.value.map(B=>H(B.id))):[];if(C)return;for(const{id:B,mod:ne}of D){const re=B.slice(0,B.indexOf("#"));let G=K.get(re);if(G)continue;G=new Map,K.set(re,G);const J=ne.default??ne;if(J!=null&&J.render||J!=null&&J.setup){const ie=en(J);ie.config.warnHandler=()=>{},ie.provide(tn,i),Object.defineProperties(ie.config.globalProperties,{$frontmatter:{get(){return i.frontmatter.value}},$params:{get(){return i.page.value.params}}});const Ze=document.createElement("div");ie.mount(Ze),Ze.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(fe=>{var tt;const Se=(tt=fe.querySelector("a"))==null?void 0:tt.getAttribute("href"),Xe=(Se==null?void 0:Se.startsWith("#"))&&Se.slice(1);if(!Xe)return;let et="";for(;(fe=fe.nextElementSibling)&&!/^h[1-6]$/i.test(fe.tagName);)et+=fe.outerHTML;G.set(Xe,et)}),ie.unmount()}if(C)return}const F=new Set;if(y.value=y.value.map(B=>{const[ne,re]=B.id.split("#"),G=K.get(ne),J=(G==null?void 0:G.get(re))??"";for(const ie in B.match)F.add(ie);return{...B,text:J}}),await ve(),C)return;await new Promise(B=>{var ne;(ne=L.value)==null||ne.unmark({done:()=>{var re;(re=L.value)==null||re.markRegExp(E(F),{done:B})}})});const V=((te=n.value)==null?void 0:te.querySelectorAll(".result .excerpt"))??[];for(const B of V)(we=B.querySelector('mark[data-markjs="true"]'))==null||we.scrollIntoView({block:"center"});(Ye=(Qe=r.value)==null?void 0:Qe.firstElementChild)==null||Ye.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function H(v){const d=nn(v.slice(0,v.indexOf("#")));try{if(!d)throw new Error(`Cannot find file for id: ${v}`);return{id:v,mod:await import(d)}}catch(_){return console.error(_),{id:v,mod:{}}}}const W=he(),j=be(()=>{var v;return((v=p.value)==null?void 0:v.length)<=0});function $(v=!0){var d,_;(d=W.value)==null||d.focus(),v&&((_=W.value)==null||_.select())}Le(()=>{$()});function Ce(v){v.pointerType==="mouse"&&$()}const M=he(-1),Z=he(!0);Be(y,v=>{M.value=v.length?0:-1,X()});function X(){ve(()=>{const v=document.querySelector(".result.selected");v==null||v.scrollIntoView({block:"nearest"})})}_e("ArrowUp",v=>{v.preventDefault(),M.value--,M.value<0&&(M.value=y.value.length-1),Z.value=!0,X()}),_e("ArrowDown",v=>{v.preventDefault(),M.value++,M.value>=y.value.length&&(M.value=0),Z.value=!0,X()});const ee=Wt();_e("Enter",v=>{if(v.isComposing||v.target instanceof HTMLButtonElement&&v.target.type!=="submit")return;const d=y.value[M.value];if(v.target instanceof HTMLInputElement&&!d){v.preventDefault();return}d&&(ee.go(d.id),t("close"))}),_e("Escape",()=>{t("close")});const u=on({modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}});Le(()=>{window.history.pushState(null,"",null)}),Kt("popstate",v=>{v.preventDefault(),t("close")});const f=Jt(qt?document.body:null);Le(()=>{ve(()=>{f.value=!0,ve().then(()=>o())})}),Ut(()=>{f.value=!1});function g(){p.value="",ve().then(()=>$(!1))}function E(v){return new RegExp([...v].sort((d,_)=>_.length-d.length).map(d=>`(${rn(d)})`).join("|"),"gi")}function x(v){var R;if(!Z.value)return;const d=(R=v.target)==null?void 0:R.closest(".result"),_=Number.parseInt(d==null?void 0:d.dataset.index);_>=0&&_!==M.value&&(M.value=_),Z.value=!1}return(v,d)=>{var _,R,A,C,D;return q(),Ht(Xt,{to:"body"},[T("div",{ref_key:"el",ref:n,role:"button","aria-owns":(_=y.value)!=null&&_.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[T("div",{class:"backdrop",onClick:d[0]||(d[0]=F=>v.$emit("close"))}),T("div",er,[T("form",{class:"search-bar",onPointerup:d[4]||(d[4]=F=>Ce(F)),onSubmit:d[5]||(d[5]=Gt(()=>{},["prevent"]))},[T("label",{title:k.value,id:"localsearch-label",for:"localsearch-input"},[...d[7]||(d[7]=[T("span",{"aria-hidden":"true",class:"vpi-search search-icon local-search-icon"},null,-1)])],8,tr),T("div",nr,[T("button",{class:"back-button",title:P(u)("modal.backButtonTitle"),onClick:d[1]||(d[1]=F=>v.$emit("close"))},[...d[8]||(d[8]=[T("span",{class:"vpi-arrow-left local-search-icon"},null,-1)])],8,rr)]),Qt(T("input",{ref_key:"searchInput",ref:W,"onUpdate:modelValue":d[2]||(d[2]=F=>Zt(p)?p.value=F:null),"aria-activedescendant":M.value>-1?"localsearch-item-"+M.value:void 0,"aria-autocomplete":"both","aria-controls":(R=y.value)!=null&&R.length?"localsearch-list":void 0,"aria-labelledby":"localsearch-label",autocapitalize:"off",autocomplete:"off",autocorrect:"off",class:"search-input",id:"localsearch-input",enterkeyhint:"go",maxlength:"64",placeholder:k.value,spellcheck:"false",type:"search"},null,8,ir),[[Yt,P(p)]]),T("div",sr,[w.value?xe("",!0):(q(),Q("button",{key:0,class:st(["toggle-layout-button",{"detailed-list":P(b)}]),type:"button",title:P(u)("modal.displayDetails"),onClick:d[3]||(d[3]=F=>M.value>-1&&(b.value=!P(b)))},[...d[9]||(d[9]=[T("span",{class:"vpi-layout-list local-search-icon"},null,-1)])],10,ar)),T("button",{class:"clear-button",type:"reset",disabled:j.value,title:P(u)("modal.resetButtonTitle"),onClick:g},[...d[10]||(d[10]=[T("span",{class:"vpi-delete local-search-icon"},null,-1)])],8,or)])],32),T("ul",{ref_key:"resultsEl",ref:r,id:(A=y.value)!=null&&A.length?"localsearch-list":void 0,role:(C=y.value)!=null&&C.length?"listbox":void 0,"aria-labelledby":(D=y.value)!=null&&D.length?"localsearch-label":void 0,class:"results",onMousemove:x},[(q(!0),Q(ot,null,at(y.value,(F,V)=>(q(),Q("li",{key:F.id,id:"localsearch-item-"+V,"aria-selected":M.value===V?"true":"false",role:"option"},[T("a",{href:F.id,class:st(["result",{selected:M.value===V}]),"aria-label":[...F.titles,F.title].join(" > "),onMouseenter:te=>!Z.value&&(M.value=V),onFocusin:te=>M.value=V,onClick:d[6]||(d[6]=te=>v.$emit("close")),"data-index":V},[T("div",null,[T("div",dr,[d[12]||(d[12]=T("span",{class:"title-icon"},"#",-1)),(q(!0),Q(ot,null,at(F.titles,(te,we)=>(q(),Q("span",{key:we,class:"title"},[T("span",{class:"text",innerHTML:te},null,8,fr),d[11]||(d[11]=T("span",{class:"vpi-chevron-right local-search-icon"},null,-1))]))),128)),T("span",hr,[T("span",{class:"text",innerHTML:F.title},null,8,vr)])]),P(b)?(q(),Q("div",pr,[F.text?(q(),Q("div",mr,[T("div",{class:"vp-doc",innerHTML:F.text},null,8,gr)])):xe("",!0),d[13]||(d[13]=T("div",{class:"excerpt-gradient-bottom"},null,-1)),d[14]||(d[14]=T("div",{class:"excerpt-gradient-top"},null,-1))])):xe("",!0)])],42,ur)],8,cr))),128)),P(p)&&!y.value.length&&O.value?(q(),Q("li",br,[pe(me(P(u)("modal.noResultsText"))+' "',1),T("strong",null,me(P(p)),1),d[15]||(d[15]=pe('" ',-1))])):xe("",!0)],40,lr),T("div",yr,[T("span",null,[T("kbd",{"aria-label":P(u)("modal.footer.navigateUpKeyAriaLabel")},[...d[16]||(d[16]=[T("span",{class:"vpi-arrow-up navigate-icon"},null,-1)])],8,wr),T("kbd",{"aria-label":P(u)("modal.footer.navigateDownKeyAriaLabel")},[...d[17]||(d[17]=[T("span",{class:"vpi-arrow-down navigate-icon"},null,-1)])],8,Sr),pe(" "+me(P(u)("modal.footer.navigateText")),1)]),T("span",null,[T("kbd",{"aria-label":P(u)("modal.footer.selectKeyAriaLabel")},[...d[18]||(d[18]=[T("span",{class:"vpi-corner-down-left navigate-icon"},null,-1)])],8,_r),pe(" "+me(P(u)("modal.footer.selectText")),1)]),T("span",null,[T("kbd",{"aria-label":P(u)("modal.footer.closeKeyAriaLabel")},"esc",8,xr),pe(" "+me(P(u)("modal.footer.closeText")),1)])])])],8,Xn)])}}}),Rr=sn(Tr,[["__scopeId","data-v-95bc29ae"]]);export{Rr as default}; diff --git a/assets/chunks/framework.CvgP6Fyv.js b/assets/chunks/framework.CvgP6Fyv.js deleted file mode 100644 index 00c2a914..00000000 --- a/assets/chunks/framework.CvgP6Fyv.js +++ /dev/null @@ -1,19 +0,0 @@ -/** -* @vue/shared v3.5.31 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function Ks(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const ne={},Lt=[],Xe=()=>{},vi=()=>!1,cn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Un=e=>e.startsWith("onUpdate:"),he=Object.assign,qs=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},ll=Object.prototype.hasOwnProperty,Z=(e,t)=>ll.call(e,t),K=Array.isArray,It=e=>an(e)==="[object Map]",_i=e=>an(e)==="[object Set]",_r=e=>an(e)==="[object Date]",q=e=>typeof e=="function",le=e=>typeof e=="string",Oe=e=>typeof e=="symbol",Q=e=>e!==null&&typeof e=="object",bi=e=>(Q(e)||q(e))&&q(e.then)&&q(e.catch),wi=Object.prototype.toString,an=e=>wi.call(e),cl=e=>an(e).slice(8,-1),Si=e=>an(e)==="[object Object]",Bn=e=>le(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,vt=Ks(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Kn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},al=/-\w/g,Ee=Kn(e=>e.replace(al,t=>t.slice(1).toUpperCase())),ul=/\B([A-Z])/g,ft=Kn(e=>e.replace(ul,"-$1").toLowerCase()),qn=Kn(e=>e.charAt(0).toUpperCase()+e.slice(1)),An=Kn(e=>e?`on${qn(e)}`:""),Ge=(e,t)=>!Object.is(e,t),Rn=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},Gs=e=>{const t=parseFloat(e);return isNaN(t)?e:t},fl=e=>{const t=le(e)?Number(e):NaN;return isNaN(t)?e:t};let br;const Gn=()=>br||(br=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Xs(e){if(K(e)){const t={};for(let n=0;n{if(n){const s=n.split(hl);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Ys(e){let t="";if(le(e))t=e;else if(K(e))for(let n=0;n!!(e&&e.__v_isRef===!0),_l=e=>le(e)?e:e==null?"":K(e)||Q(e)&&(e.toString===wi||!q(e.toString))?xi(e)?_l(e.value):JSON.stringify(e,Ci,2):String(e),Ci=(e,t)=>xi(t)?Ci(e,t.value):It(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[cs(s,i)+" =>"]=r,n),{})}:_i(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>cs(n))}:Oe(t)?cs(t):Q(t)&&!K(t)&&!Si(t)?String(t):t,cs=(e,t="")=>{var n;return Oe(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** -* @vue/reactivity v3.5.31 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let ve;class bl{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=ve,!t&&ve&&(this.index=(ve.scopes||(ve.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(ve=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(Gt){let t=Gt;for(Gt=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;qt;){let t=qt;for(qt=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function Pi(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Li(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),Zs(s),Sl(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function Os(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ii(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ii(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Zt)||(e.globalVersion=Zt,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Os(e))))return;e.flags|=2;const t=e.dep,n=re,s=He;re=e,He=!0;try{Pi(e);const r=e.fn(e._value);(t.version===0||Ge(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{re=n,He=s,Li(e),e.flags&=-3}}function Zs(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)Zs(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Sl(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let He=!0;const Ni=[];function tt(){Ni.push(He),He=!1}function nt(){const e=Ni.pop();He=e===void 0?!0:e}function wr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=re;re=void 0;try{t()}finally{re=n}}}let Zt=0;class Tl{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Xn{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!re||!He||re===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==re)n=this.activeLink=new Tl(re,this),re.deps?(n.prevDep=re.depsTail,re.depsTail.nextDep=n,re.depsTail=n):re.deps=re.depsTail=n,Fi(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=re.depsTail,n.nextDep=void 0,re.depsTail.nextDep=n,re.depsTail=n,re.deps===n&&(re.deps=s)}return n}trigger(t){this.version++,Zt++,this.notify(t)}notify(t){zs();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Qs()}}}function Fi(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Fi(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Nn=new WeakMap,_t=Symbol(""),Ps=Symbol(""),en=Symbol("");function be(e,t,n){if(He&&re){let s=Nn.get(e);s||Nn.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new Xn),r.map=s,r.key=n),r.track()}}function Ze(e,t,n,s,r,i){const o=Nn.get(e);if(!o){Zt++;return}const l=c=>{c&&c.trigger()};if(zs(),t==="clear")o.forEach(l);else{const c=K(e),u=c&&Bn(n);if(c&&n==="length"){const a=Number(s);o.forEach((d,m)=>{(m==="length"||m===en||!Oe(m)&&m>=a)&&l(d)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),u&&l(o.get(en)),t){case"add":c?u&&l(o.get("length")):(l(o.get(_t)),It(e)&&l(o.get(Ps)));break;case"delete":c||(l(o.get(_t)),It(e)&&l(o.get(Ps)));break;case"set":It(e)&&l(o.get(_t));break}}Qs()}function El(e,t){const n=Nn.get(e);return n&&n.get(t)}function At(e){const t=z(e);return t===e?t:(be(t,"iterate",en),Me(e)?t:t.map($e))}function Yn(e){return be(e=z(e),"iterate",en),e}function qe(e,t){return st(e)?Dt(ct(e)?$e(t):t):$e(t)}const xl={__proto__:null,[Symbol.iterator](){return us(this,Symbol.iterator,e=>qe(this,e))},concat(...e){return At(this).concat(...e.map(t=>K(t)?At(t):t))},entries(){return us(this,"entries",e=>(e[1]=qe(this,e[1]),e))},every(e,t){return Ye(this,"every",e,t,void 0,arguments)},filter(e,t){return Ye(this,"filter",e,t,n=>n.map(s=>qe(this,s)),arguments)},find(e,t){return Ye(this,"find",e,t,n=>qe(this,n),arguments)},findIndex(e,t){return Ye(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Ye(this,"findLast",e,t,n=>qe(this,n),arguments)},findLastIndex(e,t){return Ye(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Ye(this,"forEach",e,t,void 0,arguments)},includes(...e){return fs(this,"includes",e)},indexOf(...e){return fs(this,"indexOf",e)},join(e){return At(this).join(e)},lastIndexOf(...e){return fs(this,"lastIndexOf",e)},map(e,t){return Ye(this,"map",e,t,void 0,arguments)},pop(){return Wt(this,"pop")},push(...e){return Wt(this,"push",e)},reduce(e,...t){return Sr(this,"reduce",e,t)},reduceRight(e,...t){return Sr(this,"reduceRight",e,t)},shift(){return Wt(this,"shift")},some(e,t){return Ye(this,"some",e,t,void 0,arguments)},splice(...e){return Wt(this,"splice",e)},toReversed(){return At(this).toReversed()},toSorted(e){return At(this).toSorted(e)},toSpliced(...e){return At(this).toSpliced(...e)},unshift(...e){return Wt(this,"unshift",e)},values(){return us(this,"values",e=>qe(this,e))}};function us(e,t,n){const s=Yn(e),r=s[t]();return s!==e&&!Me(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.done||(i.value=n(i.value)),i}),r}const Cl=Array.prototype;function Ye(e,t,n,s,r,i){const o=Yn(e),l=o!==e&&!Me(e),c=o[t];if(c!==Cl[t]){const d=c.apply(e,i);return l?$e(d):d}let u=n;o!==e&&(l?u=function(d,m){return n.call(this,qe(e,d),m,e)}:n.length>2&&(u=function(d,m){return n.call(this,d,m,e)}));const a=c.call(o,u,s);return l&&r?r(a):a}function Sr(e,t,n,s){const r=Yn(e),i=r!==e&&!Me(e);let o=n,l=!1;r!==e&&(i?(l=s.length===0,o=function(u,a,d){return l&&(l=!1,u=qe(e,u)),n.call(this,u,qe(e,a),d,e)}):n.length>3&&(o=function(u,a,d){return n.call(this,u,a,d,e)}));const c=r[t](o,...s);return l?qe(e,c):c}function fs(e,t,n){const s=z(e);be(s,"iterate",en);const r=s[t](...n);return(r===-1||r===!1)&&Jn(n[0])?(n[0]=z(n[0]),s[t](...n)):r}function Wt(e,t,n=[]){tt(),zs();const s=z(e)[t].apply(e,n);return Qs(),nt(),s}const Al=Ks("__proto__,__v_isRef,__isVue"),Hi=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Oe));function Rl(e){Oe(e)||(e=String(e));const t=z(this);return be(t,"has",e),t.hasOwnProperty(e)}class Di{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?$l:ki:i?Vi:ji).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=K(t);if(!r){let c;if(o&&(c=xl[n]))return c;if(n==="hasOwnProperty")return Rl}const l=Reflect.get(t,n,ae(t)?t:s);if((Oe(n)?Hi.has(n):Al(n))||(r||be(t,"get",n),i))return l;if(ae(l)){const c=o&&Bn(n)?l:l.value;return r&&Q(c)?tn(c):c}return Q(l)?r?tn(l):Ht(l):l}}class $i extends Di{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];const o=K(t)&&Bn(n);if(!this._isShallow){const u=st(i);if(!Me(s)&&!st(s)&&(i=z(i),s=z(s)),!o&&ae(i)&&!ae(s))return u||(i.value=s),!0}const l=o?Number(n)e,mn=e=>Reflect.getPrototypeOf(e);function Il(e,t,n){return function(...s){const r=this.__v_raw,i=z(r),o=It(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,u=r[e](...s),a=n?Ls:t?Dt:$e;return!t&&be(i,"iterate",c?Ps:_t),he(Object.create(u),{next(){const{value:d,done:m}=u.next();return m?{value:d,done:m}:{value:l?[a(d[0]),a(d[1])]:a(d),done:m}}})}}function yn(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Nl(e,t){const n={get(r){const i=this.__v_raw,o=z(i),l=z(r);e||(Ge(r,l)&&be(o,"get",r),be(o,"get",l));const{has:c}=mn(o),u=t?Ls:e?Dt:$e;if(c.call(o,r))return u(i.get(r));if(c.call(o,l))return u(i.get(l));i!==o&&i.get(r)},get size(){const r=this.__v_raw;return!e&&be(z(r),"iterate",_t),r.size},has(r){const i=this.__v_raw,o=z(i),l=z(r);return e||(Ge(r,l)&&be(o,"has",r),be(o,"has",l)),r===l?i.has(r):i.has(r)||i.has(l)},forEach(r,i){const o=this,l=o.__v_raw,c=z(l),u=t?Ls:e?Dt:$e;return!e&&be(c,"iterate",_t),l.forEach((a,d)=>r.call(i,u(a),u(d),o))}};return he(n,e?{add:yn("add"),set:yn("set"),delete:yn("delete"),clear:yn("clear")}:{add(r){const i=z(this),o=mn(i),l=z(r),c=!t&&!Me(r)&&!st(r)?l:r;return o.has.call(i,c)||Ge(r,c)&&o.has.call(i,r)||Ge(l,c)&&o.has.call(i,l)||(i.add(c),Ze(i,"add",c,c)),this},set(r,i){!t&&!Me(i)&&!st(i)&&(i=z(i));const o=z(this),{has:l,get:c}=mn(o);let u=l.call(o,r);u||(r=z(r),u=l.call(o,r));const a=c.call(o,r);return o.set(r,i),u?Ge(i,a)&&Ze(o,"set",r,i):Ze(o,"add",r,i),this},delete(r){const i=z(this),{has:o,get:l}=mn(i);let c=o.call(i,r);c||(r=z(r),c=o.call(i,r)),l&&l.call(i,r);const u=i.delete(r);return c&&Ze(i,"delete",r,void 0),u},clear(){const r=z(this),i=r.size!==0,o=r.clear();return i&&Ze(r,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=Il(r,e,t)}),n}function er(e,t){const n=Nl(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(Z(n,r)&&r in s?n:s,r,i)}const Fl={get:er(!1,!1)},Hl={get:er(!1,!0)},Dl={get:er(!0,!1)};const ji=new WeakMap,Vi=new WeakMap,ki=new WeakMap,$l=new WeakMap;function jl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Vl(e){return e.__v_skip||!Object.isExtensible(e)?0:jl(cl(e))}function Ht(e){return st(e)?e:tr(e,!1,Ol,Fl,ji)}function kl(e){return tr(e,!1,Ll,Hl,Vi)}function tn(e){return tr(e,!0,Pl,Dl,ki)}function tr(e,t,n,s,r){if(!Q(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=Vl(e);if(i===0)return e;const o=r.get(e);if(o)return o;const l=new Proxy(e,i===2?s:n);return r.set(e,l),l}function ct(e){return st(e)?ct(e.__v_raw):!!(e&&e.__v_isReactive)}function st(e){return!!(e&&e.__v_isReadonly)}function Me(e){return!!(e&&e.__v_isShallow)}function Jn(e){return e?!!e.__v_raw:!1}function z(e){const t=e&&e.__v_raw;return t?z(t):e}function Mn(e){return!Z(e,"__v_skip")&&Object.isExtensible(e)&&Ti(e,"__v_skip",!0),e}const $e=e=>Q(e)?Ht(e):e,Dt=e=>Q(e)?tn(e):e;function ae(e){return e?e.__v_isRef===!0:!1}function De(e){return Wi(e,!1)}function xe(e){return Wi(e,!0)}function Wi(e,t){return ae(e)?e:new Wl(e,t)}class Wl{constructor(t,n){this.dep=new Xn,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:z(t),this._value=n?t:$e(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Me(t)||st(t);t=s?t:z(t),Ge(t,n)&&(this._rawValue=t,this._value=s?t:$e(t),this.dep.trigger())}}function zn(e){return ae(e)?e.value:e}function ce(e){return q(e)?e():zn(e)}const Ul={get:(e,t,n)=>t==="__v_raw"?e:zn(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return ae(r)&&!ae(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Ui(e){return ct(e)?e:new Proxy(e,Ul)}class Bl{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new Xn,{get:s,set:r}=t(n.track.bind(n),n.trigger.bind(n));this._get=s,this._set=r}get value(){return this._value=this._get()}set value(t){this._set(t)}}function Kl(e){return new Bl(e)}class ql{constructor(t,n,s){this._object=t,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0,this._key=Oe(n)?n:String(n),this._raw=z(t);let r=!0,i=t;if(!K(t)||Oe(this._key)||!Bn(this._key))do r=!Jn(i)||Me(i);while(r&&(i=i.__v_raw));this._shallow=r}get value(){let t=this._object[this._key];return this._shallow&&(t=zn(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&ae(this._raw[this._key])){const n=this._object[this._key];if(ae(n)){n.value=t;return}}this._object[this._key]=t}get dep(){return El(this._raw,this._key)}}class Gl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function Xl(e,t,n){return ae(e)?e:q(e)?new Gl(e):Q(e)&&arguments.length>1?Yl(e,t,n):De(e)}function Yl(e,t,n){return new ql(e,t,n)}class Jl{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Xn(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Zt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&re!==this)return Oi(this,!0),!0}get value(){const t=this.dep.track();return Ii(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function zl(e,t,n=!1){let s,r;return q(e)?s=e:(s=e.get,r=e.set),new Jl(s,r,n)}const vn={},Fn=new WeakMap;let mt;function Ql(e,t=!1,n=mt){if(n){let s=Fn.get(n);s||Fn.set(n,s=[]),s.push(e)}}function Zl(e,t,n=ne){const{immediate:s,deep:r,once:i,scheduler:o,augmentJob:l,call:c}=n,u=g=>r?g:Me(g)||r===!1||r===0?et(g,1):et(g);let a,d,m,_,b=!1,y=!1;if(ae(e)?(d=()=>e.value,b=Me(e)):ct(e)?(d=()=>u(e),b=!0):K(e)?(y=!0,b=e.some(g=>ct(g)||Me(g)),d=()=>e.map(g=>{if(ae(g))return g.value;if(ct(g))return u(g);if(q(g))return c?c(g,2):g()})):q(e)?t?d=c?()=>c(e,2):e:d=()=>{if(m){tt();try{m()}finally{nt()}}const g=mt;mt=a;try{return c?c(e,3,[_]):e(_)}finally{mt=g}}:d=Xe,t&&r){const g=d,A=r===!0?1/0:r;d=()=>et(g(),A)}const D=Ai(),P=()=>{a.stop(),D&&D.active&&qs(D.effects,a)};if(i&&t){const g=t;t=(...A)=>{g(...A),P()}}let I=y?new Array(e.length).fill(vn):vn;const p=g=>{if(!(!(a.flags&1)||!a.dirty&&!g))if(t){const A=a.run();if(r||b||(y?A.some((j,M)=>Ge(j,I[M])):Ge(A,I))){m&&m();const j=mt;mt=a;try{const M=[A,I===vn?void 0:y&&I[0]===vn?[]:I,_];I=A,c?c(t,3,M):t(...M)}finally{mt=j}}}else a.run()};return l&&l(p),a=new Ri(d),a.scheduler=o?()=>o(p,!1):p,_=g=>Ql(g,!1,a),m=a.onStop=()=>{const g=Fn.get(a);if(g){if(c)c(g,4);else for(const A of g)A();Fn.delete(a)}},t?s?p(!0):I=a.run():o?o(p.bind(null,!0),!0):a.run(),P.pause=a.pause.bind(a),P.resume=a.resume.bind(a),P.stop=P,P}function et(e,t=1/0,n){if(t<=0||!Q(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,ae(e))et(e.value,t,n);else if(K(e))for(let s=0;s{et(s,t,n)});else if(Si(e)){for(const s in e)et(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&et(e[s],t,n)}return e}/** -* @vue/runtime-core v3.5.31 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function un(e,t,n,s){try{return s?e(...s):e()}catch(r){fn(r,t,n)}}function je(e,t,n,s){if(q(e)){const r=un(e,t,n,s);return r&&bi(r)&&r.catch(i=>{fn(i,t,n)}),r}if(K(e)){const r=[];for(let i=0;i>>1,r=Se[s],i=nn(r);i=nn(n)?Se.push(e):Se.splice(tc(t),0,e),e.flags|=1,Ki()}}function Ki(){Hn||(Hn=Bi.then(qi))}function nc(e){K(e)?Nt.push(...e):lt&&e.id===-1?lt.splice(Mt+1,0,e):e.flags&1||(Nt.push(e),e.flags|=1),Ki()}function Tr(e,t,n=Ue+1){for(;nnn(n)-nn(s));if(Nt.length=0,lt){lt.push(...t);return}for(lt=t,Mt=0;Mte.id==null?e.flags&2?-1:1/0:e.id;function qi(e){try{for(Ue=0;Ue{s._d&&kn(-1);const i=$n(t);let o;try{o=e(...r)}finally{$n(i),s._d&&kn(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function Uu(e,t){if(me===null)return e;const n=ss(me),s=e.dirs||(e.dirs=[]);for(let r=0;r1)return n&&q(t)?t.call(s&&s.proxy):t}}function Xi(){return!!(xt()||St)}const ic=Symbol.for("v-scx"),oc=()=>bt(ic);function sr(e,t){return Zn(e,null,t)}function Bu(e,t){return Zn(e,null,{flush:"post"})}function Ne(e,t,n){return Zn(e,t,n)}function Zn(e,t,n=ne){const{immediate:s,deep:r,flush:i,once:o}=n,l=he({},n),c=t&&s||!t&&i!=="post";let u;if($t){if(i==="sync"){const _=oc();u=_.__watcherHandles||(_.__watcherHandles=[])}else if(!c){const _=()=>{};return _.stop=Xe,_.resume=Xe,_.pause=Xe,_}}const a=ge;l.call=(_,b,y)=>je(_,a,b,y);let d=!1;i==="post"?l.scheduler=_=>{ye(_,a&&a.suspense)}:i!=="sync"&&(d=!0,l.scheduler=(_,b)=>{b?_():nr(_)}),l.augmentJob=_=>{t&&(_.flags|=4),d&&(_.flags|=2,a&&(_.id=a.uid,_.i=a))};const m=Zl(e,t,l);return $t&&(u?u.push(m):c&&m()),m}function lc(e,t,n){const s=this.proxy,r=le(e)?e.includes(".")?Yi(s,e):()=>s[e]:e.bind(s,s);let i;q(t)?i=t:(i=t.handler,n=t);const o=hn(this),l=Zn(r,i.bind(s),n);return o(),l}function Yi(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;re.__isTeleport,Xt=e=>e&&(e.disabled||e.disabled===""),cc=e=>e&&(e.defer||e.defer===""),Er=e=>typeof SVGElement<"u"&&e instanceof SVGElement,xr=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Is=(e,t)=>{const n=e&&e.to;return le(n)?t?t(n):null:n},Qi={name:"Teleport",__isTeleport:!0,process(e,t,n,s,r,i,o,l,c,u){const{mc:a,pc:d,pbc:m,o:{insert:_,querySelector:b,createText:y,createComment:D}}=u,P=Xt(t.props);let{shapeFlag:I,children:p,dynamicChildren:g}=t;if(e==null){const A=t.el=y(""),j=t.anchor=y("");_(A,n,s),_(j,n,s);const M=(T,O)=>{I&16&&a(p,T,O,r,i,o,l,c)},k=()=>{const T=t.target=Is(t.props,b),O=Ns(T,t,y,_);T&&(o!=="svg"&&Er(T)?o="svg":o!=="mathml"&&xr(T)&&(o="mathml"),r&&r.isCE&&(r.ce._teleportTargets||(r.ce._teleportTargets=new Set)).add(T),P||(M(T,O),On(t,!1)))};P&&(M(n,j),On(t,!0)),cc(t.props)||i&&i.pendingBranch?(t.el.__isMounted=!1,ye(()=>{t.el.__isMounted===!1&&(k(),delete t.el.__isMounted)},i)):k()}else{t.el=e.el,t.targetStart=e.targetStart;const A=t.anchor=e.anchor,j=t.target=e.target,M=t.targetAnchor=e.targetAnchor;if(e.el.__isMounted===!1){ye(()=>{Qi.process(e,t,n,s,r,i,o,l,c,u)},i);return}const k=Xt(e.props),T=k?n:j,O=k?A:M;if(o==="svg"||Er(j)?o="svg":(o==="mathml"||xr(j))&&(o="mathml"),g?(m(e.dynamicChildren,g,T,r,i,o,l),cr(e,t,!0)):c||d(e,t,T,O,r,i,o,l,!1),P)k?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):_n(t,n,A,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const R=t.target=Is(t.props,b);R&&_n(t,R,null,u,0)}else k&&_n(t,j,M,u,1);On(t,P)}},remove(e,t,n,{um:s,o:{remove:r}},i){const{shapeFlag:o,children:l,anchor:c,targetStart:u,targetAnchor:a,target:d,props:m}=e;if(d&&(r(u),r(a)),i&&r(c),o&16){const _=i||!Xt(m);for(let b=0;b{e.isMounted=!0}),io(()=>{e.isUnmounting=!0}),e}const Pe=[Function,Array],Zi={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Pe,onEnter:Pe,onAfterEnter:Pe,onEnterCancelled:Pe,onBeforeLeave:Pe,onLeave:Pe,onAfterLeave:Pe,onLeaveCancelled:Pe,onBeforeAppear:Pe,onAppear:Pe,onAfterAppear:Pe,onAppearCancelled:Pe},eo=e=>{const t=e.subTree;return t.component?eo(t.component):t},fc={name:"BaseTransition",props:Zi,setup(e,{slots:t}){const n=xt(),s=uc();return()=>{const r=t.default&&so(t.default(),!0);if(!r||!r.length)return;const i=to(r),o=z(e),{mode:l}=o;if(s.isLeaving)return ds(i);const c=Cr(i);if(!c)return ds(i);let u=Fs(c,o,s,n,d=>u=d);c.type!==pe&&sn(c,u);let a=n.subTree&&Cr(n.subTree);if(a&&a.type!==pe&&!yt(a,c)&&eo(n).type!==pe){let d=Fs(a,o,s,n);if(sn(a,d),l==="out-in"&&c.type!==pe)return s.isLeaving=!0,d.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete d.afterLeave,a=void 0},ds(i);l==="in-out"&&c.type!==pe?d.delayLeave=(m,_,b)=>{const y=no(s,a);y[String(a.key)]=a,m[Ke]=()=>{_(),m[Ke]=void 0,delete u.delayedLeave,a=void 0},u.delayedLeave=()=>{b(),delete u.delayedLeave,a=void 0}}:a=void 0}else a&&(a=void 0);return i}}};function to(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==pe){t=n;break}}return t}const dc=fc;function no(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Fs(e,t,n,s,r){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:c,onEnter:u,onAfterEnter:a,onEnterCancelled:d,onBeforeLeave:m,onLeave:_,onAfterLeave:b,onLeaveCancelled:y,onBeforeAppear:D,onAppear:P,onAfterAppear:I,onAppearCancelled:p}=t,g=String(e.key),A=no(n,e),j=(T,O)=>{T&&je(T,s,9,O)},M=(T,O)=>{const R=O[1];j(T,O),K(T)?T.every(w=>w.length<=1)&&R():T.length<=1&&R()},k={mode:o,persisted:l,beforeEnter(T){let O=c;if(!n.isMounted)if(i)O=D||c;else return;T[Ke]&&T[Ke](!0);const R=A[g];R&&yt(e,R)&&R.el[Ke]&&R.el[Ke](),j(O,[T])},enter(T){if(A[g]===e)return;let O=u,R=a,w=d;if(!n.isMounted)if(i)O=P||u,R=I||a,w=p||d;else return;let H=!1;T[Ut]=oe=>{H||(H=!0,oe?j(w,[T]):j(R,[T]),k.delayedLeave&&k.delayedLeave(),T[Ut]=void 0)};const Y=T[Ut].bind(null,!1);O?M(O,[T,Y]):Y()},leave(T,O){const R=String(e.key);if(T[Ut]&&T[Ut](!0),n.isUnmounting)return O();j(m,[T]);let w=!1;T[Ke]=Y=>{w||(w=!0,O(),Y?j(y,[T]):j(b,[T]),T[Ke]=void 0,A[R]===e&&delete A[R])};const H=T[Ke].bind(null,!1);A[R]=e,_?M(_,[T,H]):H()},clone(T){const O=Fs(T,t,n,s,r);return r&&r(O),O}};return k}function ds(e){if(dn(e))return e=at(e),e.children=null,e}function Cr(e){if(!dn(e))return zi(e.type)&&e.children?to(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&q(n.default))return n.default()}}function sn(e,t){e.shapeFlag&6&&e.component?(e.transition=t,sn(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function so(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;iFt(y,t&&(K(t)?t[D]:t),n,s,r));return}if(wt(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&Ft(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?ss(s.component):s.el,o=r?null:i,{i:l,r:c}=e,u=t&&t.r,a=l.refs===ne?l.refs={}:l.refs,d=l.setupState,m=z(d),_=d===ne?vi:y=>Ar(a,y)?!1:Z(m,y),b=(y,D)=>!(D&&Ar(a,D));if(u!=null&&u!==c){if(Rr(t),le(u))a[u]=null,_(u)&&(d[u]=null);else if(ae(u)){const y=t;b(u,y.k)&&(u.value=null),y.k&&(a[y.k]=null)}}if(q(c))un(c,l,12,[o,a]);else{const y=le(c),D=ae(c);if(y||D){const P=()=>{if(e.f){const I=y?_(c)?d[c]:a[c]:b()||!e.k?c.value:a[e.k];if(r)K(I)&&qs(I,i);else if(K(I))I.includes(i)||I.push(i);else if(y)a[c]=[i],_(c)&&(d[c]=a[c]);else{const p=[i];b(c,e.k)&&(c.value=p),e.k&&(a[e.k]=p)}}else y?(a[c]=o,_(c)&&(d[c]=o)):D&&(b(c,e.k)&&(c.value=o),e.k&&(a[e.k]=o))};if(o){const I=()=>{P(),jn.delete(e)};I.id=-1,jn.set(e,I),ye(I,n)}else Rr(e),P()}}}function Rr(e){const t=jn.get(e);t&&(t.flags|=8,jn.delete(e))}let Mr=!1;const Rt=()=>{Mr||(console.error("Hydration completed but contains mismatches."),Mr=!0)},hc=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",pc=e=>e.namespaceURI.includes("MathML"),bn=e=>{if(e.nodeType===1){if(hc(e))return"svg";if(pc(e))return"mathml"}},Pt=e=>e.nodeType===8;function gc(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:u}}=e,a=(p,g)=>{if(!g.hasChildNodes()){n(null,p,g),Dn(),g._vnode=p;return}d(g.firstChild,p,null,null,null),Dn(),g._vnode=p},d=(p,g,A,j,M,k=!1)=>{k=k||!!g.dynamicChildren;const T=Pt(p)&&p.data==="[",O=()=>y(p,g,A,j,M,T),{type:R,ref:w,shapeFlag:H,patchFlag:Y}=g;let oe=p.nodeType;g.el=p,Y===-2&&(k=!1,g.dynamicChildren=null);let U=null;switch(R){case Tt:oe!==3?g.children===""?(c(g.el=r(""),o(p),p),U=p):U=O():(p.data!==g.children&&(Rt(),p.data=g.children),U=i(p));break;case pe:I(p)?(U=i(p),P(g.el=p.content.firstChild,p,A)):oe!==8||T?U=O():U=i(p);break;case Jt:if(T&&(p=i(p),oe=p.nodeType),oe===1||oe===3){U=p;const X=!g.children.length;for(let V=0;V{k=k||!!g.dynamicChildren;const{type:T,props:O,patchFlag:R,shapeFlag:w,dirs:H,transition:Y}=g,oe=T==="input"||T==="option";if(oe||R!==-1){H&&Be(g,null,A,"created");let U=!1;if(I(p)){U=Co(null,Y)&&A&&A.vnode.props&&A.vnode.props.appear;const V=p.content.firstChild;if(U){const ee=V.getAttribute("class");ee&&(V.$cls=ee),Y.beforeEnter(V)}P(V,p,A),g.el=p=V}if(w&16&&!(O&&(O.innerHTML||O.textContent))){let V=_(p.firstChild,g,p,A,j,M,k);for(;V;){wn(p,1)||Rt();const ee=V;V=V.nextSibling,l(ee)}}else if(w&8){let V=g.children;V[0]===` -`&&(p.tagName==="PRE"||p.tagName==="TEXTAREA")&&(V=V.slice(1));const{textContent:ee}=p;ee!==V&&ee!==V.replace(/\r\n|\r/g,` -`)&&(wn(p,0)||Rt(),p.textContent=g.children)}if(O){if(oe||!k||R&48){const V=p.tagName.includes("-");for(const ee in O)(oe&&(ee.endsWith("value")||ee==="indeterminate")||cn(ee)&&!vt(ee)||ee[0]==="."||V&&!vt(ee))&&s(p,ee,null,O[ee],void 0,A)}else if(O.onClick)s(p,"onClick",null,O.onClick,void 0,A);else if(R&4&&ct(O.style))for(const V in O.style)O.style[V]}let X;(X=O&&O.onVnodeBeforeMount)&&Le(X,A,g),H&&Be(g,null,A,"beforeMount"),((X=O&&O.onVnodeMounted)||H||U)&&Oo(()=>{X&&Le(X,A,g),U&&Y.enter(p),H&&Be(g,null,A,"mounted")},j)}return p.nextSibling},_=(p,g,A,j,M,k,T)=>{T=T||!!g.dynamicChildren;const O=g.children,R=O.length;for(let w=0;w{const{slotScopeIds:T}=g;T&&(M=M?M.concat(T):T);const O=o(p),R=_(i(p),g,O,A,j,M,k);return R&&Pt(R)&&R.data==="]"?i(g.anchor=R):(Rt(),c(g.anchor=u("]"),O,R),R)},y=(p,g,A,j,M,k)=>{if(wn(p.parentElement,1)||Rt(),g.el=null,k){const R=D(p);for(;;){const w=i(p);if(w&&w!==R)l(w);else break}}const T=i(p),O=o(p);return l(p),n(null,g,O,T,A,j,bn(O),M),A&&(A.vnode.el=g.el,mo(A,g.el)),T},D=(p,g="[",A="]")=>{let j=0;for(;p;)if(p=i(p),p&&Pt(p)&&(p.data===g&&j++,p.data===A)){if(j===0)return i(p);j--}return p},P=(p,g,A)=>{const j=g.parentNode;j&&j.replaceChild(p,g);let M=A;for(;M;)M.vnode.el===g&&(M.vnode.el=M.subTree.el=p),M=M.parent},I=p=>p.nodeType===1&&p.tagName==="TEMPLATE";return[a,d]}const Or="data-allow-mismatch",mc={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function wn(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(Or);)e=e.parentElement;const n=e&&e.getAttribute(Or);if(n==null)return!1;if(n==="")return!0;{const s=n.split(",");return t===0&&s.includes("children")?!0:s.includes(mc[t])}}Gn().requestIdleCallback;Gn().cancelIdleCallback;function yc(e,t){if(Pt(e)&&e.data==="["){let n=1,s=e.nextSibling;for(;s;){if(s.nodeType===1){if(t(s)===!1)break}else if(Pt(s))if(s.data==="]"){if(--n===0)break}else s.data==="["&&n++;s=s.nextSibling}}else t(e)}const wt=e=>!!e.type.__asyncLoader;function qu(e){q(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:r=200,hydrate:i,timeout:o,suspensible:l=!0,onError:c}=e;let u=null,a,d=0;const m=()=>(d++,u=null,_()),_=()=>{let b;return u||(b=u=t().catch(y=>{if(y=y instanceof Error?y:new Error(String(y)),c)return new Promise((D,P)=>{c(y,()=>D(m()),()=>P(y),d+1)});throw y}).then(y=>b!==u&&u?u:(y&&(y.__esModule||y[Symbol.toStringTag]==="Module")&&(y=y.default),a=y,y)))};return rr({name:"AsyncComponentWrapper",__asyncLoader:_,__asyncHydrate(b,y,D){let P=!1;(y.bu||(y.bu=[])).push(()=>P=!0);const I=()=>{P||D()},p=i?()=>{const g=i(I,A=>yc(b,A));g&&(y.bum||(y.bum=[])).push(g)}:I;a?p():_().then(()=>!y.isUnmounted&&p())},get __asyncResolved(){return a},setup(){const b=ge;if(ir(b),a)return()=>Sn(a,b);const y=p=>{u=null,fn(p,b,13,!s)};if(l&&b.suspense||$t)return _().then(p=>()=>Sn(p,b)).catch(p=>(y(p),()=>s?fe(s,{error:p}):null));const D=De(!1),P=De(),I=De(!!r);return r&&setTimeout(()=>{I.value=!1},r),o!=null&&setTimeout(()=>{if(!D.value&&!P.value){const p=new Error(`Async component timed out after ${o}ms.`);y(p),P.value=p}},o),_().then(()=>{D.value=!0,b.parent&&dn(b.parent.vnode)&&b.parent.update()}).catch(p=>{y(p),P.value=p}),()=>{if(D.value&&a)return Sn(a,b);if(P.value&&s)return fe(s,{error:P.value});if(n&&!I.value)return Sn(n,b)}}})}function Sn(e,t){const{ref:n,props:s,children:r,ce:i}=t.vnode,o=fe(e,s,r);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const dn=e=>e.type.__isKeepAlive;function vc(e,t){ro(e,"a",t)}function _c(e,t){ro(e,"da",t)}function ro(e,t,n=ge){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(es(t,s,n),n){let r=n.parent;for(;r&&r.parent;)dn(r.parent.vnode)&&bc(s,t,n,r),r=r.parent}}function bc(e,t,n,s){const r=es(t,e,s,!0);ts(()=>{qs(s[t],r)},n)}function es(e,t,n=ge,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{tt();const l=hn(n),c=je(t,n,e,o);return l(),nt(),c});return s?r.unshift(i):r.push(i),i}}const it=e=>(t,n=ge)=>{(!$t||e==="sp")&&es(e,(...s)=>t(...s),n)},wc=it("bm"),jt=it("m"),Sc=it("bu"),Tc=it("u"),io=it("bum"),ts=it("um"),Ec=it("sp"),xc=it("rtg"),Cc=it("rtc");function Ac(e,t=ge){es("ec",e,t)}const oo="components";function Gu(e,t){return co(oo,e,!0,t)||e}const lo=Symbol.for("v-ndc");function Xu(e){return le(e)?co(oo,e,!1)||e:e||lo}function co(e,t,n=!0,s=!1){const r=me||ge;if(r){const i=r.type;{const l=ca(i,!1);if(l&&(l===t||l===Ee(t)||l===qn(Ee(t))))return i}const o=Pr(r[e]||i[e],t)||Pr(r.appContext[e],t);return!o&&s?i:o}}function Pr(e,t){return e&&(e[t]||e[Ee(t)]||e[qn(Ee(t))])}function Yu(e,t,n,s){let r;const i=n,o=K(e);if(o||le(e)){const l=o&&ct(e);let c=!1,u=!1;l&&(c=!Me(e),u=st(e),e=Yn(e)),r=new Array(e.length);for(let a=0,d=e.length;at(l,c,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let c=0,u=l.length;c0;return t!=="default"&&(n.name=t),Vs(),ks(Te,null,[fe("slot",n,s&&s())],u?-2:64)}let i=e[t];i&&i._c&&(i._d=!1),Vs();const o=i&&ao(i(n)),l=n.key||o&&o.key,c=ks(Te,{key:(l&&!Oe(l)?l:`_${t}`)+(!o&&s?"_fb":"")},o||(s?s():[]),o&&e._===1?64:-2);return!r&&c.scopeId&&(c.slotScopeIds=[c.scopeId+"-s"]),i&&i._c&&(i._d=!0),c}function ao(e){return e.some(t=>on(t)?!(t.type===pe||t.type===Te&&!ao(t.children)):!0)?e:null}function zu(e,t){const n={};for(const s in e)n[/[A-Z]/.test(s)?`on:${s}`:An(s)]=e[s];return n}const Hs=e=>e?Fo(e)?ss(e):Hs(e.parent):null,Yt=he(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Hs(e.parent),$root:e=>Hs(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>fo(e),$forceUpdate:e=>e.f||(e.f=()=>{nr(e.update)}),$nextTick:e=>e.n||(e.n=Qn.bind(e.proxy)),$watch:e=>lc.bind(e)}),hs=(e,t)=>e!==ne&&!e.__isScriptSetup&&Z(e,t),Rc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;if(t[0]!=="$"){const m=o[t];if(m!==void 0)switch(m){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(hs(s,t))return o[t]=1,s[t];if(r!==ne&&Z(r,t))return o[t]=2,r[t];if(Z(i,t))return o[t]=3,i[t];if(n!==ne&&Z(n,t))return o[t]=4,n[t];Ds&&(o[t]=0)}}const u=Yt[t];let a,d;if(u)return t==="$attrs"&&be(e.attrs,"get",""),u(e);if((a=l.__cssModules)&&(a=a[t]))return a;if(n!==ne&&Z(n,t))return o[t]=4,n[t];if(d=c.config.globalProperties,Z(d,t))return d[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return hs(r,t)?(r[t]=n,!0):s!==ne&&Z(s,t)?(s[t]=n,!0):Z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,props:i,type:o}},l){let c;return!!(n[l]||e!==ne&&l[0]!=="$"&&Z(e,l)||hs(t,l)||Z(i,l)||Z(s,l)||Z(Yt,l)||Z(r.config.globalProperties,l)||(c=o.__cssModules)&&c[l])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Qu(){return Mc().slots}function Mc(e){const t=xt();return t.setupContext||(t.setupContext=Do(t))}function Lr(e){return K(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Ds=!0;function Oc(e){const t=fo(e),n=e.proxy,s=e.ctx;Ds=!1,t.beforeCreate&&Ir(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:u,created:a,beforeMount:d,mounted:m,beforeUpdate:_,updated:b,activated:y,deactivated:D,beforeDestroy:P,beforeUnmount:I,destroyed:p,unmounted:g,render:A,renderTracked:j,renderTriggered:M,errorCaptured:k,serverPrefetch:T,expose:O,inheritAttrs:R,components:w,directives:H,filters:Y}=t;if(u&&Pc(u,s,null),o)for(const X in o){const V=o[X];q(V)&&(s[X]=V.bind(n))}if(r){const X=r.call(n,n);Q(X)&&(e.data=Ht(X))}if(Ds=!0,i)for(const X in i){const V=i[X],ee=q(V)?V.bind(n,n):q(V.get)?V.get.bind(n,n):Xe,pn=!q(V)&&q(V.set)?V.set.bind(n):Xe,dt=ie({get:ee,set:pn});Object.defineProperty(s,X,{enumerable:!0,configurable:!0,get:()=>dt.value,set:ke=>dt.value=ke})}if(l)for(const X in l)uo(l[X],s,n,X);if(c){const X=q(c)?c.call(n):c;Reflect.ownKeys(X).forEach(V=>{rc(V,X[V])})}a&&Ir(a,e,"c");function U(X,V){K(V)?V.forEach(ee=>X(ee.bind(n))):V&&X(V.bind(n))}if(U(wc,d),U(jt,m),U(Sc,_),U(Tc,b),U(vc,y),U(_c,D),U(Ac,k),U(Cc,j),U(xc,M),U(io,I),U(ts,g),U(Ec,T),K(O))if(O.length){const X=e.exposed||(e.exposed={});O.forEach(V=>{Object.defineProperty(X,V,{get:()=>n[V],set:ee=>n[V]=ee,enumerable:!0})})}else e.exposed||(e.exposed={});A&&e.render===Xe&&(e.render=A),R!=null&&(e.inheritAttrs=R),w&&(e.components=w),H&&(e.directives=H),T&&ir(e)}function Pc(e,t,n=Xe){K(e)&&(e=$s(e));for(const s in e){const r=e[s];let i;Q(r)?"default"in r?i=bt(r.from||s,r.default,!0):i=bt(r.from||s):i=bt(r),ae(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function Ir(e,t,n){je(K(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function uo(e,t,n,s){let r=s.includes(".")?Yi(n,s):()=>n[s];if(le(e)){const i=t[e];q(i)&&Ne(r,i)}else if(q(e))Ne(r,e.bind(n));else if(Q(e))if(K(e))e.forEach(i=>uo(i,t,n,s));else{const i=q(e.handler)?e.handler.bind(n):t[e.handler];q(i)&&Ne(r,i,e)}}function fo(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(u=>Vn(c,u,o,!0)),Vn(c,t,o)),Q(t)&&i.set(t,c),c}function Vn(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&Vn(e,i,n,!0),r&&r.forEach(o=>Vn(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=Lc[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Lc={data:Nr,props:Fr,emits:Fr,methods:Kt,computed:Kt,beforeCreate:we,created:we,beforeMount:we,mounted:we,beforeUpdate:we,updated:we,beforeDestroy:we,beforeUnmount:we,destroyed:we,unmounted:we,activated:we,deactivated:we,errorCaptured:we,serverPrefetch:we,components:Kt,directives:Kt,watch:Nc,provide:Nr,inject:Ic};function Nr(e,t){return t?e?function(){return he(q(e)?e.call(this,this):e,q(t)?t.call(this,this):t)}:t:e}function Ic(e,t){return Kt($s(e),$s(t))}function $s(e){if(K(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ee(t)}Modifiers`]||e[`${ft(t)}Modifiers`];function $c(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||ne;let r=n;const i=t.startsWith("update:"),o=i&&Dc(s,t.slice(7));o&&(o.trim&&(r=n.map(a=>le(a)?a.trim():a)),o.number&&(r=n.map(Gs)));let l,c=s[l=An(t)]||s[l=An(Ee(t))];!c&&i&&(c=s[l=An(ft(t))]),c&&je(c,e,6,r);const u=s[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,je(u,e,6,r)}}const jc=new WeakMap;function po(e,t,n=!1){const s=n?jc:t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!q(e)){const c=u=>{const a=po(u,t,!0);a&&(l=!0,he(o,a))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(Q(e)&&s.set(e,null),null):(K(i)?i.forEach(c=>o[c]=null):he(o,i),Q(e)&&s.set(e,o),o)}function ns(e,t){return!e||!cn(t)?!1:(t=t.slice(2).replace(/Once$/,""),Z(e,t[0].toLowerCase()+t.slice(1))||Z(e,ft(t))||Z(e,t))}function ps(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:c,render:u,renderCache:a,props:d,data:m,setupState:_,ctx:b,inheritAttrs:y}=e,D=$n(e);let P,I;try{if(n.shapeFlag&4){const g=r||s,A=g;P=Ie(u.call(A,g,a,d,_,m,b)),I=l}else{const g=t;P=Ie(g.length>1?g(d,{attrs:l,slots:o,emit:c}):g(d,null)),I=t.props?l:Vc(l)}}catch(g){zt.length=0,fn(g,e,1),P=fe(pe)}let p=P;if(I&&y!==!1){const g=Object.keys(I),{shapeFlag:A}=p;g.length&&A&7&&(i&&g.some(Un)&&(I=kc(I,i)),p=at(p,I,!1,!0))}return n.dirs&&(p=at(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&sn(p,n.transition),P=p,$n(D),P}const Vc=e=>{let t;for(const n in e)(n==="class"||n==="style"||cn(n))&&((t||(t={}))[n]=e[n]);return t},kc=(e,t)=>{const n={};for(const s in e)(!Un(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Wc(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,u=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?Hr(s,o,u):!!o;if(c&8){const a=t.dynamicProps;for(let d=0;dObject.create(yo),_o=e=>Object.getPrototypeOf(e)===yo;function Uc(e,t,n,s=!1){const r={},i=vo();e.propsDefaults=Object.create(null),bo(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:kl(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Bc(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=z(r),[c]=e.propsOptions;let u=!1;if((s||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let d=0;d{c=!0;const[m,_]=wo(d,t,!0);he(o,m),_&&l.push(..._)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!i&&!c)return Q(e)&&s.set(e,Lt),Lt;if(K(i))for(let a=0;ae==="_"||e==="_ctx"||e==="$stable",lr=e=>K(e)?e.map(Ie):[Ie(e)],qc=(e,t,n)=>{if(t._n)return t;const s=sc((...r)=>lr(t(...r)),n);return s._c=!1,s},So=(e,t,n)=>{const s=e._ctx;for(const r in e){if(or(r))continue;const i=e[r];if(q(i))t[r]=qc(r,i,s);else if(i!=null){const o=lr(i);t[r]=()=>o}}},To=(e,t)=>{const n=lr(t);e.slots.default=()=>n},Eo=(e,t,n)=>{for(const s in t)(n||!or(s))&&(e[s]=t[s])},Gc=(e,t,n)=>{const s=e.slots=vo();if(e.vnode.shapeFlag&32){const r=t._;r?(Eo(s,t,n),n&&Ti(s,"_",r,!0)):So(t,s)}else t&&To(e,t)},Xc=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=ne;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:Eo(r,t,n):(i=!t.$stable,So(t,r)),o=t}else t&&(To(e,t),o={default:1});if(i)for(const l in r)!or(l)&&o[l]==null&&delete r[l]},ye=Oo;function Yc(e){return xo(e)}function Jc(e){return xo(e,gc)}function xo(e,t){const n=Gn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:u,setElementText:a,parentNode:d,nextSibling:m,setScopeId:_=Xe,insertStaticContent:b}=e,y=(f,h,v,C=null,S=null,E=null,F=void 0,N=null,L=!!h.dynamicChildren)=>{if(f===h)return;f&&!yt(f,h)&&(C=gn(f),ke(f,S,E,!0),f=null),h.patchFlag===-2&&(L=!1,h.dynamicChildren=null);const{type:x,ref:B,shapeFlag:$}=h;switch(x){case Tt:D(f,h,v,C);break;case pe:P(f,h,v,C);break;case Jt:f==null&&I(h,v,C,F);break;case Te:w(f,h,v,C,S,E,F,N,L);break;default:$&1?A(f,h,v,C,S,E,F,N,L):$&6?H(f,h,v,C,S,E,F,N,L):($&64||$&128)&&x.process(f,h,v,C,S,E,F,N,L,Ct)}B!=null&&S?Ft(B,f&&f.ref,E,h||f,!h):B==null&&f&&f.ref!=null&&Ft(f.ref,null,E,f,!0)},D=(f,h,v,C)=>{if(f==null)s(h.el=l(h.children),v,C);else{const S=h.el=f.el;h.children!==f.children&&u(S,h.children)}},P=(f,h,v,C)=>{f==null?s(h.el=c(h.children||""),v,C):h.el=f.el},I=(f,h,v,C)=>{[f.el,f.anchor]=b(f.children,h,v,C,f.el,f.anchor)},p=({el:f,anchor:h},v,C)=>{let S;for(;f&&f!==h;)S=m(f),s(f,v,C),f=S;s(h,v,C)},g=({el:f,anchor:h})=>{let v;for(;f&&f!==h;)v=m(f),r(f),f=v;r(h)},A=(f,h,v,C,S,E,F,N,L)=>{if(h.type==="svg"?F="svg":h.type==="math"&&(F="mathml"),f==null)j(h,v,C,S,E,F,N,L);else{const x=f.el&&f.el._isVueCE?f.el:null;try{x&&x._beginPatch(),T(f,h,S,E,F,N,L)}finally{x&&x._endPatch()}}},j=(f,h,v,C,S,E,F,N)=>{let L,x;const{props:B,shapeFlag:$,transition:W,dirs:G}=f;if(L=f.el=o(f.type,E,B&&B.is,B),$&8?a(L,f.children):$&16&&k(f.children,L,null,C,S,gs(f,E),F,N),G&&Be(f,null,C,"created"),M(L,f,f.scopeId,F,C),B){for(const te in B)te!=="value"&&!vt(te)&&i(L,te,null,B[te],E,C);"value"in B&&i(L,"value",null,B.value,E),(x=B.onVnodeBeforeMount)&&Le(x,C,f)}G&&Be(f,null,C,"beforeMount");const J=Co(S,W);J&&W.beforeEnter(L),s(L,h,v),((x=B&&B.onVnodeMounted)||J||G)&&ye(()=>{try{x&&Le(x,C,f),J&&W.enter(L),G&&Be(f,null,C,"mounted")}finally{}},S)},M=(f,h,v,C,S)=>{if(v&&_(f,v),C)for(let E=0;E{for(let x=L;x{const N=h.el=f.el;let{patchFlag:L,dynamicChildren:x,dirs:B}=h;L|=f.patchFlag&16;const $=f.props||ne,W=h.props||ne;let G;if(v&&ht(v,!1),(G=W.onVnodeBeforeUpdate)&&Le(G,v,h,f),B&&Be(h,f,v,"beforeUpdate"),v&&ht(v,!0),($.innerHTML&&W.innerHTML==null||$.textContent&&W.textContent==null)&&a(N,""),x?O(f.dynamicChildren,x,N,v,C,gs(h,S),E):F||V(f,h,N,null,v,C,gs(h,S),E,!1),L>0){if(L&16)R(N,$,W,v,S);else if(L&2&&$.class!==W.class&&i(N,"class",null,W.class,S),L&4&&i(N,"style",$.style,W.style,S),L&8){const J=h.dynamicProps;for(let te=0;te{G&&Le(G,v,h,f),B&&Be(h,f,v,"updated")},C)},O=(f,h,v,C,S,E,F)=>{for(let N=0;N{if(h!==v){if(h!==ne)for(const E in h)!vt(E)&&!(E in v)&&i(f,E,h[E],null,S,C);for(const E in v){if(vt(E))continue;const F=v[E],N=h[E];F!==N&&E!=="value"&&i(f,E,N,F,S,C)}"value"in v&&i(f,"value",h.value,v.value,S)}},w=(f,h,v,C,S,E,F,N,L)=>{const x=h.el=f?f.el:l(""),B=h.anchor=f?f.anchor:l("");let{patchFlag:$,dynamicChildren:W,slotScopeIds:G}=h;G&&(N=N?N.concat(G):G),f==null?(s(x,v,C),s(B,v,C),k(h.children||[],v,B,S,E,F,N,L)):$>0&&$&64&&W&&f.dynamicChildren&&f.dynamicChildren.length===W.length?(O(f.dynamicChildren,W,v,S,E,F,N),(h.key!=null||S&&h===S.subTree)&&cr(f,h,!0)):V(f,h,v,B,S,E,F,N,L)},H=(f,h,v,C,S,E,F,N,L)=>{h.slotScopeIds=N,f==null?h.shapeFlag&512?S.ctx.activate(h,v,C,F,L):Y(h,v,C,S,E,F,L):oe(f,h,L)},Y=(f,h,v,C,S,E,F)=>{const N=f.component=ra(f,C,S);if(dn(f)&&(N.ctx.renderer=Ct),ia(N,!1,F),N.asyncDep){if(S&&S.registerDep(N,U,F),!f.el){const L=N.subTree=fe(pe);P(null,L,h,v),f.placeholder=L.el}}else U(N,f,h,v,S,E,F)},oe=(f,h,v)=>{const C=h.component=f.component;if(Wc(f,h,v))if(C.asyncDep&&!C.asyncResolved){X(C,h,v);return}else C.next=h,C.update();else h.el=f.el,C.vnode=h},U=(f,h,v,C,S,E,F)=>{const N=()=>{if(f.isMounted){let{next:$,bu:W,u:G,parent:J,vnode:te}=f;{const Ce=Ao(f);if(Ce){$&&($.el=te.el,X(f,$,F)),Ce.asyncDep.then(()=>{ye(()=>{f.isUnmounted||x()},S)});return}}let se=$,ue;ht(f,!1),$?($.el=te.el,X(f,$,F)):$=te,W&&Rn(W),(ue=$.props&&$.props.onVnodeBeforeUpdate)&&Le(ue,J,$,te),ht(f,!0);const de=ps(f),Fe=f.subTree;f.subTree=de,y(Fe,de,d(Fe.el),gn(Fe),f,S,E),$.el=de.el,se===null&&mo(f,de.el),G&&ye(G,S),(ue=$.props&&$.props.onVnodeUpdated)&&ye(()=>Le(ue,J,$,te),S)}else{let $;const{el:W,props:G}=h,{bm:J,m:te,parent:se,root:ue,type:de}=f,Fe=wt(h);if(ht(f,!1),J&&Rn(J),!Fe&&($=G&&G.onVnodeBeforeMount)&&Le($,se,h),ht(f,!0),W&&ls){const Ce=()=>{f.subTree=ps(f),ls(W,f.subTree,f,S,null)};Fe&&de.__asyncHydrate?de.__asyncHydrate(W,f,Ce):Ce()}else{ue.ce&&ue.ce._hasShadowRoot()&&ue.ce._injectChildStyle(de,f.parent?f.parent.type:void 0);const Ce=f.subTree=ps(f);y(null,Ce,v,C,f,S,E),h.el=Ce.el}if(te&&ye(te,S),!Fe&&($=G&&G.onVnodeMounted)){const Ce=h;ye(()=>Le($,se,Ce),S)}(h.shapeFlag&256||se&&wt(se.vnode)&&se.vnode.shapeFlag&256)&&f.a&&ye(f.a,S),f.isMounted=!0,h=v=C=null}};f.scope.on();const L=f.effect=new Ri(N);f.scope.off();const x=f.update=L.run.bind(L),B=f.job=L.runIfDirty.bind(L);B.i=f,B.id=f.uid,L.scheduler=()=>nr(B),ht(f,!0),x()},X=(f,h,v)=>{h.component=f;const C=f.vnode.props;f.vnode=h,f.next=null,Bc(f,h.props,C,v),Xc(f,h.children,v),tt(),Tr(f),nt()},V=(f,h,v,C,S,E,F,N,L=!1)=>{const x=f&&f.children,B=f?f.shapeFlag:0,$=h.children,{patchFlag:W,shapeFlag:G}=h;if(W>0){if(W&128){pn(x,$,v,C,S,E,F,N,L);return}else if(W&256){ee(x,$,v,C,S,E,F,N,L);return}}G&8?(B&16&&Vt(x,S,E),$!==x&&a(v,$)):B&16?G&16?pn(x,$,v,C,S,E,F,N,L):Vt(x,S,E,!0):(B&8&&a(v,""),G&16&&k($,v,C,S,E,F,N,L))},ee=(f,h,v,C,S,E,F,N,L)=>{f=f||Lt,h=h||Lt;const x=f.length,B=h.length,$=Math.min(x,B);let W;for(W=0;W<$;W++){const G=h[W]=L?Qe(h[W]):Ie(h[W]);y(f[W],G,v,null,S,E,F,N,L)}x>B?Vt(f,S,E,!0,!1,$):k(h,v,C,S,E,F,N,L,$)},pn=(f,h,v,C,S,E,F,N,L)=>{let x=0;const B=h.length;let $=f.length-1,W=B-1;for(;x<=$&&x<=W;){const G=f[x],J=h[x]=L?Qe(h[x]):Ie(h[x]);if(yt(G,J))y(G,J,v,null,S,E,F,N,L);else break;x++}for(;x<=$&&x<=W;){const G=f[$],J=h[W]=L?Qe(h[W]):Ie(h[W]);if(yt(G,J))y(G,J,v,null,S,E,F,N,L);else break;$--,W--}if(x>$){if(x<=W){const G=W+1,J=GW)for(;x<=$;)ke(f[x],S,E,!0),x++;else{const G=x,J=x,te=new Map;for(x=J;x<=W;x++){const Ae=h[x]=L?Qe(h[x]):Ie(h[x]);Ae.key!=null&&te.set(Ae.key,x)}let se,ue=0;const de=W-J+1;let Fe=!1,Ce=0;const kt=new Array(de);for(x=0;x=de){ke(Ae,S,E,!0);continue}let We;if(Ae.key!=null)We=te.get(Ae.key);else for(se=J;se<=W;se++)if(kt[se-J]===0&&yt(Ae,h[se])){We=se;break}We===void 0?ke(Ae,S,E,!0):(kt[We-J]=x+1,We>=Ce?Ce=We:Fe=!0,y(Ae,h[We],v,null,S,E,F,N,L),ue++)}const mr=Fe?zc(kt):Lt;for(se=mr.length-1,x=de-1;x>=0;x--){const Ae=J+x,We=h[Ae],yr=h[Ae+1],vr=Ae+1{const{el:E,type:F,transition:N,children:L,shapeFlag:x}=f;if(x&6){dt(f.component.subTree,h,v,C);return}if(x&128){f.suspense.move(h,v,C);return}if(x&64){F.move(f,h,v,Ct);return}if(F===Te){s(E,h,v);for(let $=0;$N.enter(E),S);else{const{leave:$,delayLeave:W,afterLeave:G}=N,J=()=>{f.ctx.isUnmounted?r(E):s(E,h,v)},te=()=>{E._isLeaving&&E[Ke](!0),$(E,()=>{J(),G&&G()})};W?W(E,J,te):te()}else s(E,h,v)},ke=(f,h,v,C=!1,S=!1)=>{const{type:E,props:F,ref:N,children:L,dynamicChildren:x,shapeFlag:B,patchFlag:$,dirs:W,cacheIndex:G,memo:J}=f;if($===-2&&(S=!1),N!=null&&(tt(),Ft(N,null,v,f,!0),nt()),G!=null&&(h.renderCache[G]=void 0),B&256){h.ctx.deactivate(f);return}const te=B&1&&W,se=!wt(f);let ue;if(se&&(ue=F&&F.onVnodeBeforeUnmount)&&Le(ue,h,f),B&6)ol(f.component,v,C);else{if(B&128){f.suspense.unmount(v,C);return}te&&Be(f,null,h,"beforeUnmount"),B&64?f.type.remove(f,h,v,Ct,C):x&&!x.hasOnce&&(E!==Te||$>0&&$&64)?Vt(x,h,v,!1,!0):(E===Te&&$&384||!S&&B&16)&&Vt(L,h,v),C&&pr(f)}const de=J!=null&&G==null;(se&&(ue=F&&F.onVnodeUnmounted)||te||de)&&ye(()=>{ue&&Le(ue,h,f),te&&Be(f,null,h,"unmounted"),de&&(f.el=null)},v)},pr=f=>{const{type:h,el:v,anchor:C,transition:S}=f;if(h===Te){il(v,C);return}if(h===Jt){g(f);return}const E=()=>{r(v),S&&!S.persisted&&S.afterLeave&&S.afterLeave()};if(f.shapeFlag&1&&S&&!S.persisted){const{leave:F,delayLeave:N}=S,L=()=>F(v,E);N?N(f.el,E,L):L()}else E()},il=(f,h)=>{let v;for(;f!==h;)v=m(f),r(f),f=v;r(h)},ol=(f,h,v)=>{const{bum:C,scope:S,job:E,subTree:F,um:N,m:L,a:x}=f;$r(L),$r(x),C&&Rn(C),S.stop(),E&&(E.flags|=8,ke(F,f,h,v)),N&&ye(N,h),ye(()=>{f.isUnmounted=!0},h)},Vt=(f,h,v,C=!1,S=!1,E=0)=>{for(let F=E;F{if(f.shapeFlag&6)return gn(f.component.subTree);if(f.shapeFlag&128)return f.suspense.next();const h=m(f.anchor||f.el),v=h&&h[Ji];return v?m(v):h};let is=!1;const gr=(f,h,v)=>{let C;f==null?h._vnode&&(ke(h._vnode,null,null,!0),C=h._vnode.component):y(h._vnode||null,f,h,null,null,null,v),h._vnode=f,is||(is=!0,Tr(C),Dn(),is=!1)},Ct={p:y,um:ke,m:dt,r:pr,mt:Y,mc:k,pc:V,pbc:O,n:gn,o:e};let os,ls;return t&&([os,ls]=t(Ct)),{render:gr,hydrate:os,createApp:Hc(gr,os)}}function gs({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function ht({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Co(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function cr(e,t,n=!1){const s=e.children,r=t.children;if(K(s)&&K(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function Ao(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Ao(t)}function $r(e){if(e)for(let t=0;te.__isSuspense;function Oo(e,t){t&&t.pendingBranch?K(e)?t.effects.push(...e):t.effects.push(e):nc(e)}const Te=Symbol.for("v-fgt"),Tt=Symbol.for("v-txt"),pe=Symbol.for("v-cmt"),Jt=Symbol.for("v-stc"),zt=[];let Re=null;function Vs(e=!1){zt.push(Re=e?null:[])}function Qc(){zt.pop(),Re=zt[zt.length-1]||null}let rn=1;function kn(e,t=!1){rn+=e,e<0&&Re&&t&&(Re.hasOnce=!0)}function Po(e){return e.dynamicChildren=rn>0?Re||Lt:null,Qc(),rn>0&&Re&&Re.push(e),e}function Zu(e,t,n,s,r,i){return Po(Io(e,t,n,s,r,i,!0))}function ks(e,t,n,s,r){return Po(fe(e,t,n,s,r,!0))}function on(e){return e?e.__v_isVNode===!0:!1}function yt(e,t){return e.type===t.type&&e.key===t.key}const Lo=({key:e})=>e??null,Pn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?le(e)||ae(e)||q(e)?{i:me,r:e,k:t,f:!!n}:e:null);function Io(e,t=null,n=null,s=0,r=null,i=e===Te?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Lo(t),ref:t&&Pn(t),scopeId:Gi,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:me};return l?(ar(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=le(n)?8:16),rn>0&&!o&&Re&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Re.push(c),c}const fe=Zc;function Zc(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===lo)&&(e=pe),on(e)){const l=at(e,t,!0);return n&&ar(l,n),rn>0&&!i&&Re&&(l.shapeFlag&6?Re[Re.indexOf(e)]=l:Re.push(l)),l.patchFlag=-2,l}if(aa(e)&&(e=e.__vccOpts),t){t=ea(t);let{class:l,style:c}=t;l&&!le(l)&&(t.class=Ys(l)),Q(c)&&(Jn(c)&&!K(c)&&(c=he({},c)),t.style=Xs(c))}const o=le(e)?1:Mo(e)?128:zi(e)?64:Q(e)?4:q(e)?2:0;return Io(e,t,n,s,r,o,i,!0)}function ea(e){return e?Jn(e)||_o(e)?he({},e):e:null}function at(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:c}=e,u=t?ta(r||{},t):r,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&Lo(u),ref:t&&t.ref?n&&i?K(i)?i.concat(Pn(t)):[i,Pn(t)]:Pn(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Te?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&at(e.ssContent),ssFallback:e.ssFallback&&at(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&s&&sn(a,c.clone(a)),a}function No(e=" ",t=0){return fe(Tt,null,e,t)}function ef(e,t){const n=fe(Jt,null,e);return n.staticCount=t,n}function tf(e="",t=!1){return t?(Vs(),ks(pe,null,e)):fe(pe,null,e)}function Ie(e){return e==null||typeof e=="boolean"?fe(pe):K(e)?fe(Te,null,e.slice()):on(e)?Qe(e):fe(Tt,null,String(e))}function Qe(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:at(e)}function ar(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(K(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),ar(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!_o(t)?t._ctx=me:r===3&&me&&(me.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else q(t)?(t={default:t,_ctx:me},n=32):(t=String(t),s&64?(n=16,t=[No(t)]):n=8);e.children=t,e.shapeFlag|=n}function ta(...e){const t={};for(let n=0;nge||me;let Wn,Ws;{const e=Gn(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};Wn=t("__VUE_INSTANCE_SETTERS__",n=>ge=n),Ws=t("__VUE_SSR_SETTERS__",n=>$t=n)}const hn=e=>{const t=ge;return Wn(e),e.scope.on(),()=>{e.scope.off(),Wn(t)}},jr=()=>{ge&&ge.scope.off(),Wn(null)};function Fo(e){return e.vnode.shapeFlag&4}let $t=!1;function ia(e,t=!1,n=!1){t&&Ws(t);const{props:s,children:r}=e.vnode,i=Fo(e);Uc(e,s,i,t),Gc(e,r,n||t);const o=i?oa(e,t):void 0;return t&&Ws(!1),o}function oa(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Rc);const{setup:s}=n;if(s){tt();const r=e.setupContext=s.length>1?Do(e):null,i=hn(e),o=un(s,e,0,[e.props,r]),l=bi(o);if(nt(),i(),(l||e.sp)&&!wt(e)&&ir(e),l){if(o.then(jr,jr),t)return o.then(c=>{Vr(e,c)}).catch(c=>{fn(c,e,0)});e.asyncDep=o}else Vr(e,o)}else Ho(e)}function Vr(e,t,n){q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Q(t)&&(e.setupState=Ui(t)),Ho(e)}function Ho(e,t,n){const s=e.type;e.render||(e.render=s.render||Xe);{const r=hn(e);tt();try{Oc(e)}finally{nt(),r()}}}const la={get(e,t){return be(e,"get",""),e[t]}};function Do(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,la),slots:e.slots,emit:e.emit,expose:t}}function ss(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Ui(Mn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Yt)return Yt[n](e)},has(t,n){return n in t||n in Yt}})):e.proxy}function ca(e,t=!0){return q(e)?e.displayName||e.name:e.name||t&&e.__name}function aa(e){return q(e)&&"__vccOpts"in e}const ie=(e,t)=>zl(e,t,$t);function Us(e,t,n){try{kn(-1);const s=arguments.length;return s===2?Q(t)&&!K(t)?on(t)?fe(e,null,[t]):fe(e,t):fe(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&on(n)&&(n=[n]),fe(e,t,n))}finally{kn(1)}}const ua="3.5.31";/** -* @vue/runtime-dom v3.5.31 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let Bs;const kr=typeof window<"u"&&window.trustedTypes;if(kr)try{Bs=kr.createPolicy("vue",{createHTML:e=>e})}catch{}const $o=Bs?e=>Bs.createHTML(e):e=>e,fa="http://www.w3.org/2000/svg",da="http://www.w3.org/1998/Math/MathML",ze=typeof document<"u"?document:null,Wr=ze&&ze.createElement("template"),ha={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?ze.createElementNS(fa,e):t==="mathml"?ze.createElementNS(da,e):n?ze.createElement(e,{is:n}):ze.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>ze.createTextNode(e),createComment:e=>ze.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ze.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{Wr.innerHTML=$o(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=Wr.content;if(s==="svg"||s==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},ot="transition",Bt="animation",ln=Symbol("_vtc"),jo={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},pa=he({},Zi,jo),ga=e=>(e.displayName="Transition",e.props=pa,e),nf=ga((e,{slots:t})=>Us(dc,ma(e),t)),pt=(e,t=[])=>{K(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ur=e=>e?K(e)?e.some(t=>t.length>1):e.length>1:!1;function ma(e){const t={};for(const w in e)w in jo||(t[w]=e[w]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:u=o,appearToClass:a=l,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:m=`${n}-leave-active`,leaveToClass:_=`${n}-leave-to`}=e,b=ya(r),y=b&&b[0],D=b&&b[1],{onBeforeEnter:P,onEnter:I,onEnterCancelled:p,onLeave:g,onLeaveCancelled:A,onBeforeAppear:j=P,onAppear:M=I,onAppearCancelled:k=p}=t,T=(w,H,Y,oe)=>{w._enterCancelled=oe,gt(w,H?a:l),gt(w,H?u:o),Y&&Y()},O=(w,H)=>{w._isLeaving=!1,gt(w,d),gt(w,_),gt(w,m),H&&H()},R=w=>(H,Y)=>{const oe=w?M:I,U=()=>T(H,w,Y);pt(oe,[H,U]),Br(()=>{gt(H,w?c:i),Je(H,w?a:l),Ur(oe)||Kr(H,s,y,U)})};return he(t,{onBeforeEnter(w){pt(P,[w]),Je(w,i),Je(w,o)},onBeforeAppear(w){pt(j,[w]),Je(w,c),Je(w,u)},onEnter:R(!1),onAppear:R(!0),onLeave(w,H){w._isLeaving=!0;const Y=()=>O(w,H);Je(w,d),w._enterCancelled?(Je(w,m),Xr(w)):(Xr(w),Je(w,m)),Br(()=>{w._isLeaving&&(gt(w,d),Je(w,_),Ur(g)||Kr(w,s,D,Y))}),pt(g,[w,Y])},onEnterCancelled(w){T(w,!1,void 0,!0),pt(p,[w])},onAppearCancelled(w){T(w,!0,void 0,!0),pt(k,[w])},onLeaveCancelled(w){O(w),pt(A,[w])}})}function ya(e){if(e==null)return null;if(Q(e))return[ms(e.enter),ms(e.leave)];{const t=ms(e);return[t,t]}}function ms(e){return fl(e)}function Je(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[ln]||(e[ln]=new Set)).add(t)}function gt(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[ln];n&&(n.delete(t),n.size||(e[ln]=void 0))}function Br(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let va=0;function Kr(e,t,n,s){const r=e._endId=++va,i=()=>{r===e._endId&&s()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=_a(e,t);if(!o)return s();const u=o+"end";let a=0;const d=()=>{e.removeEventListener(u,m),i()},m=_=>{_.target===e&&++a>=c&&d()};setTimeout(()=>{a(n[b]||"").split(", "),r=s(`${ot}Delay`),i=s(`${ot}Duration`),o=qr(r,i),l=s(`${Bt}Delay`),c=s(`${Bt}Duration`),u=qr(l,c);let a=null,d=0,m=0;t===ot?o>0&&(a=ot,d=o,m=i.length):t===Bt?u>0&&(a=Bt,d=u,m=c.length):(d=Math.max(o,u),a=d>0?o>u?ot:Bt:null,m=a?a===ot?i.length:c.length:0);const _=a===ot&&/\b(?:transform|all)(?:,|$)/.test(s(`${ot}Property`).toString());return{type:a,timeout:d,propCount:m,hasTransform:_}}function qr(e,t){for(;e.lengthGr(n)+Gr(e[s])))}function Gr(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Xr(e){return(e?e.ownerDocument:document).body.offsetHeight}function ba(e,t,n){const s=e[ln];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Yr=Symbol("_vod"),wa=Symbol("_vsh"),Sa=Symbol(""),Ta=/(?:^|;)\s*display\s*:/;function Ea(e,t,n){const s=e.style,r=le(n);let i=!1;if(n&&!r){if(t)if(le(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&Ln(s,l,"")}else for(const o in t)n[o]==null&&Ln(s,o,"");for(const o in n)o==="display"&&(i=!0),Ln(s,o,n[o])}else if(r){if(t!==n){const o=s[Sa];o&&(n+=";"+o),s.cssText=n,i=Ta.test(n)}}else t&&e.removeAttribute("style");Yr in e&&(e[Yr]=i?s.display:"",e[wa]&&(s.display="none"))}const Jr=/\s*!important$/;function Ln(e,t,n){if(K(n))n.forEach(s=>Ln(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=xa(e,t);Jr.test(n)?e.setProperty(ft(s),n.replace(Jr,""),"important"):e[s]=n}}const zr=["Webkit","Moz","ms"],ys={};function xa(e,t){const n=ys[t];if(n)return n;let s=Ee(t);if(s!=="filter"&&s in e)return ys[t]=s;s=qn(s);for(let r=0;rvs||(Ma.then(()=>vs=0),vs=Date.now());function Pa(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;je(La(s,n.value),t,5,[s])};return n.value=e,n.attached=Oa(),n}function La(e,t){if(K(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const si=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Ia=(e,t,n,s,r,i)=>{const o=r==="svg";t==="class"?ba(e,s,o):t==="style"?Ea(e,n,s):cn(t)?Un(t)||Aa(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Na(e,t,s,o))?(ei(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Zr(e,t,s,o,i,t!=="value")):e._isVueCE&&(Fa(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!le(s)))?ei(e,Ee(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Zr(e,t,s,o))};function Na(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&si(t)&&q(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return si(t)&&le(n)?!1:t in e}function Fa(e,t){const n=e._def.props;if(!n)return!1;const s=Ee(t);return Array.isArray(n)?n.some(r=>Ee(r)===s):Object.keys(n).some(r=>Ee(r)===s)}const ri=e=>{const t=e.props["onUpdate:modelValue"]||!1;return K(t)?n=>Rn(t,n):t};function Ha(e){e.target.composing=!0}function ii(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const _s=Symbol("_assign");function oi(e,t,n){return t&&(e=e.trim()),n&&(e=Gs(e)),e}const sf={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e[_s]=ri(r);const i=s||r.props&&r.props.type==="number";Ot(e,t?"change":"input",o=>{o.target.composing||e[_s](oi(e.value,n,i))}),(n||i)&&Ot(e,"change",()=>{e.value=oi(e.value,n,i)}),t||(Ot(e,"compositionstart",Ha),Ot(e,"compositionend",ii),Ot(e,"change",ii))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:r,number:i}},o){if(e[_s]=ri(o),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?Gs(e.value):e.value,c=t??"";if(l===c)return;const u=e.getRootNode();(u instanceof Document||u instanceof ShadowRoot)&&u.activeElement===e&&e.type!=="range"&&(s&&t===n||r&&e.value.trim()===c)||(e.value=c)}},Da=["ctrl","shift","alt","meta"],$a={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Da.some(n=>e[`${n}Key`]&&!t.includes(n))},rf=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(r,...i)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=r=>{if(!("key"in r))return;const i=ft(r.key);if(t.some(o=>o===i||ja[o]===i))return e(r)})},Vo=he({patchProp:Ia},ha);let Qt,li=!1;function Va(){return Qt||(Qt=Yc(Vo))}function ka(){return Qt=li?Qt:Jc(Vo),li=!0,Qt}const lf=(...e)=>{const t=Va().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Wo(s);if(!r)return;const i=t._component;!q(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const o=n(r,!1,ko(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t},cf=(...e)=>{const t=ka().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Wo(s);if(r)return n(r,!0,ko(r))},t};function ko(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Wo(e){return le(e)?document.querySelector(e):e}const Wa=window.__VP_SITE_DATA__;function Uo(e){return Ai()?(wl(e),!0):!1}const bs=new WeakMap,Ua=(...e)=>{var t;const n=e[0],s=(t=xt())==null?void 0:t.proxy;if(s==null&&!Xi())throw new Error("injectLocal must be called in setup");return s&&bs.has(s)&&n in bs.get(s)?bs.get(s)[n]:bt(...e)},Bo=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const af=e=>e!=null,Ba=Object.prototype.toString,Ka=e=>Ba.call(e)==="[object Object]",ut=()=>{},ci=qa();function qa(){var e,t;return Bo&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function ur(e,t){function n(...s){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,s),{fn:t,thisArg:this,args:s})).then(r).catch(i)})}return n}const Ko=e=>e();function qo(e,t={}){let n,s,r=ut;const i=c=>{clearTimeout(c),r(),r=ut};let o;return c=>{const u=ce(e),a=ce(t.maxWait);return n&&i(n),u<=0||a!==void 0&&a<=0?(s&&(i(s),s=null),Promise.resolve(c())):new Promise((d,m)=>{r=t.rejectOnCancel?m:d,o=c,a&&!s&&(s=setTimeout(()=>{n&&i(n),s=null,d(o())},a)),n=setTimeout(()=>{s&&i(s),s=null,d(c())},u)})}}function Ga(...e){let t=0,n,s=!0,r=ut,i,o,l,c,u;!ae(e[0])&&typeof e[0]=="object"?{delay:o,trailing:l=!0,leading:c=!0,rejectOnCancel:u=!1}=e[0]:[o,l=!0,c=!0,u=!1]=e;const a=()=>{n&&(clearTimeout(n),n=void 0,r(),r=ut)};return m=>{const _=ce(o),b=Date.now()-t,y=()=>i=m();return a(),_<=0?(t=Date.now(),y()):(b>_&&(c||!s)?(t=Date.now(),y()):l&&(i=new Promise((D,P)=>{r=u?P:D,n=setTimeout(()=>{t=Date.now(),s=!0,D(y()),a()},Math.max(0,_-b))})),!c&&!n&&(n=setTimeout(()=>s=!0,_)),s=!1,i)}}function Xa(e=Ko,t={}){const{initialState:n="active"}=t,s=fr(n==="active");function r(){s.value=!1}function i(){s.value=!0}return{isActive:tn(s),pause:r,resume:i,eventFilter:(...l)=>{s.value&&e(...l)}}}function ai(e){return e.endsWith("rem")?Number.parseFloat(e)*16:Number.parseFloat(e)}function Ya(e){return xt()}function ws(e){return Array.isArray(e)?e:[e]}function fr(...e){if(e.length!==1)return Xl(...e);const t=e[0];return typeof t=="function"?tn(Kl(()=>({get:t,set:ut}))):De(t)}function Ja(e,t=200,n={}){return ur(qo(t,n),e)}function za(e,t=200,n=!1,s=!0,r=!1){return ur(Ga(t,n,s,r),e)}function Go(e,t,n={}){const{eventFilter:s=Ko,...r}=n;return Ne(e,ur(s,t),r)}function Qa(e,t,n={}){const{eventFilter:s,initialState:r="active",...i}=n,{eventFilter:o,pause:l,resume:c,isActive:u}=Xa(s,{initialState:r});return{stop:Go(e,t,{...i,eventFilter:o}),pause:l,resume:c,isActive:u}}function rs(e,t=!0,n){Ya()?jt(e,n):t?e():Qn(e)}function uf(e,t,n={}){const{debounce:s=0,maxWait:r=void 0,...i}=n;return Go(e,t,{...i,eventFilter:qo(s,{maxWait:r})})}function Za(e,t,n){return Ne(e,t,{...n,immediate:!0})}function ff(e,t,n){let s;ae(n)?s={evaluating:n}:s={};const{lazy:r=!1,evaluating:i=void 0,shallow:o=!0,onError:l=ut}=s,c=xe(!r),u=o?xe(t):De(t);let a=0;return sr(async d=>{if(!c.value)return;a++;const m=a;let _=!1;i&&Promise.resolve().then(()=>{i.value=!0});try{const b=await e(y=>{d(()=>{i&&(i.value=!1),_||y()})});m===a&&(u.value=b)}catch(b){l(b)}finally{i&&m===a&&(i.value=!1),_=!0}}),r?ie(()=>(c.value=!0,u.value)):u}const Ve=Bo?window:void 0;function dr(e){var t;const n=ce(e);return(t=n==null?void 0:n.$el)!=null?t:n}function rt(...e){const t=[],n=()=>{t.forEach(l=>l()),t.length=0},s=(l,c,u,a)=>(l.addEventListener(c,u,a),()=>l.removeEventListener(c,u,a)),r=ie(()=>{const l=ws(ce(e[0])).filter(c=>c!=null);return l.every(c=>typeof c!="string")?l:void 0}),i=Za(()=>{var l,c;return[(c=(l=r.value)==null?void 0:l.map(u=>dr(u)))!=null?c:[Ve].filter(u=>u!=null),ws(ce(r.value?e[1]:e[0])),ws(zn(r.value?e[2]:e[1])),ce(r.value?e[3]:e[2])]},([l,c,u,a])=>{if(n(),!(l!=null&&l.length)||!(c!=null&&c.length)||!(u!=null&&u.length))return;const d=Ka(a)?{...a}:a;t.push(...l.flatMap(m=>c.flatMap(_=>u.map(b=>s(m,_,b,d)))))},{flush:"post"}),o=()=>{i(),n()};return Uo(n),o}function eu(){const e=xe(!1),t=xt();return t&&jt(()=>{e.value=!0},t),e}function tu(e){const t=eu();return ie(()=>(t.value,!!e()))}function nu(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function df(...e){let t,n,s={};e.length===3?(t=e[0],n=e[1],s=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],s=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:r=Ve,eventName:i="keydown",passive:o=!1,dedupe:l=!1}=s,c=nu(t);return rt(r,i,a=>{a.repeat&&ce(l)||c(a)&&n(a)},o)}const su=Symbol("vueuse-ssr-width");function ru(){const e=Xi()?Ua(su,null):null;return typeof e=="number"?e:void 0}function Xo(e,t={}){const{window:n=Ve,ssrWidth:s=ru()}=t,r=tu(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function"),i=xe(typeof s=="number"),o=xe(),l=xe(!1),c=u=>{l.value=u.matches};return sr(()=>{if(i.value){i.value=!r.value;const u=ce(e).split(",");l.value=u.some(a=>{const d=a.includes("not all"),m=a.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),_=a.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/);let b=!!(m||_);return m&&b&&(b=s>=ai(m[1])),_&&b&&(b=s<=ai(_[1])),d?!b:b});return}r.value&&(o.value=n.matchMedia(ce(e)),l.value=o.value.matches)}),rt(o,"change",c,{passive:!0}),ie(()=>l.value)}const Tn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},En="__vueuse_ssr_handlers__",iu=ou();function ou(){return En in Tn||(Tn[En]=Tn[En]||{}),Tn[En]}function Yo(e,t){return iu[e]||t}function Jo(e){return Xo("(prefers-color-scheme: dark)",e)}function lu(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const cu={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},ui="vueuse-storage";function hr(e,t,n,s={}){var r;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:u=!1,shallow:a,window:d=Ve,eventFilter:m,onError:_=R=>{console.error(R)},initOnMounted:b}=s,y=(a?xe:De)(typeof t=="function"?t():t),D=ie(()=>ce(e));if(!n)try{n=Yo("getDefaultStorage",()=>{var R;return(R=Ve)==null?void 0:R.localStorage})()}catch(R){_(R)}if(!n)return y;const P=ce(t),I=lu(P),p=(r=s.serializer)!=null?r:cu[I],{pause:g,resume:A}=Qa(y,()=>M(y.value),{flush:i,deep:o,eventFilter:m});Ne(D,()=>T(),{flush:i}),d&&l&&rs(()=>{n instanceof Storage?rt(d,"storage",T,{passive:!0}):rt(d,ui,O),b&&T()}),b||T();function j(R,w){if(d){const H={key:D.value,oldValue:R,newValue:w,storageArea:n};d.dispatchEvent(n instanceof Storage?new StorageEvent("storage",H):new CustomEvent(ui,{detail:H}))}}function M(R){try{const w=n.getItem(D.value);if(R==null)j(w,null),n.removeItem(D.value);else{const H=p.write(R);w!==H&&(n.setItem(D.value,H),j(w,H))}}catch(w){_(w)}}function k(R){const w=R?R.newValue:n.getItem(D.value);if(w==null)return c&&P!=null&&n.setItem(D.value,p.write(P)),P;if(!R&&u){const H=p.read(w);return typeof u=="function"?u(H,P):I==="object"&&!Array.isArray(H)?{...P,...H}:H}else return typeof w!="string"?w:p.read(w)}function T(R){if(!(R&&R.storageArea!==n)){if(R&&R.key==null){y.value=P;return}if(!(R&&R.key!==D.value)){g();try{(R==null?void 0:R.newValue)!==p.write(y.value)&&(y.value=k(R))}catch(w){_(w)}finally{R?Qn(A):A()}}}}function O(R){T(R.detail)}return y}const au="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function uu(e={}){const{selector:t="html",attribute:n="class",initialValue:s="auto",window:r=Ve,storage:i,storageKey:o="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:u,disableTransition:a=!0}=e,d={auto:"",light:"light",dark:"dark",...e.modes||{}},m=Jo({window:r}),_=ie(()=>m.value?"dark":"light"),b=c||(o==null?fr(s):hr(o,s,i,{window:r,listenToStorageChanges:l})),y=ie(()=>b.value==="auto"?_.value:b.value),D=Yo("updateHTMLAttrs",(g,A,j)=>{const M=typeof g=="string"?r==null?void 0:r.document.querySelector(g):dr(g);if(!M)return;const k=new Set,T=new Set;let O=null;if(A==="class"){const w=j.split(/\s/g);Object.values(d).flatMap(H=>(H||"").split(/\s/g)).filter(Boolean).forEach(H=>{w.includes(H)?k.add(H):T.add(H)})}else O={key:A,value:j};if(k.size===0&&T.size===0&&O===null)return;let R;a&&(R=r.document.createElement("style"),R.appendChild(document.createTextNode(au)),r.document.head.appendChild(R));for(const w of k)M.classList.add(w);for(const w of T)M.classList.remove(w);O&&M.setAttribute(O.key,O.value),a&&(r.getComputedStyle(R).opacity,document.head.removeChild(R))});function P(g){var A;D(t,n,(A=d[g])!=null?A:g)}function I(g){e.onChanged?e.onChanged(g,P):P(g)}Ne(y,I,{flush:"post",immediate:!0}),rs(()=>I(y.value));const p=ie({get(){return u?b.value:y.value},set(g){b.value=g}});return Object.assign(p,{store:b,system:_,state:y})}function fu(e={}){const{valueDark:t="dark",valueLight:n=""}=e,s=uu({...e,onChanged:(o,l)=>{var c;e.onChanged?(c=e.onChanged)==null||c.call(e,o==="dark",l,o):l(o)},modes:{dark:t,light:n}}),r=ie(()=>s.system.value);return ie({get(){return s.value==="dark"},set(o){const l=o?"dark":"light";r.value===l?s.value="auto":s.value=l}})}function Ss(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}const fi=1;function du(e,t={}){const{throttle:n=0,idle:s=200,onStop:r=ut,onScroll:i=ut,offset:o={left:0,right:0,top:0,bottom:0},eventListenerOptions:l={capture:!1,passive:!0},behavior:c="auto",window:u=Ve,onError:a=M=>{console.error(M)}}=t,d=xe(0),m=xe(0),_=ie({get(){return d.value},set(M){y(M,void 0)}}),b=ie({get(){return m.value},set(M){y(void 0,M)}});function y(M,k){var T,O,R,w;if(!u)return;const H=ce(e);if(!H)return;(R=H instanceof Document?u.document.body:H)==null||R.scrollTo({top:(T=ce(k))!=null?T:b.value,left:(O=ce(M))!=null?O:_.value,behavior:ce(c)});const Y=((w=H==null?void 0:H.document)==null?void 0:w.documentElement)||(H==null?void 0:H.documentElement)||H;_!=null&&(d.value=Y.scrollLeft),b!=null&&(m.value=Y.scrollTop)}const D=xe(!1),P=Ht({left:!0,right:!1,top:!0,bottom:!1}),I=Ht({left:!1,right:!1,top:!1,bottom:!1}),p=M=>{D.value&&(D.value=!1,I.left=!1,I.right=!1,I.top=!1,I.bottom=!1,r(M))},g=Ja(p,n+s),A=M=>{var k;if(!u)return;const T=((k=M==null?void 0:M.document)==null?void 0:k.documentElement)||(M==null?void 0:M.documentElement)||dr(M),{display:O,flexDirection:R,direction:w}=getComputedStyle(T),H=w==="rtl"?-1:1,Y=T.scrollLeft;I.left=Yd.value;const oe=Math.abs(Y*H)<=(o.left||0),U=Math.abs(Y*H)+T.clientWidth>=T.scrollWidth-(o.right||0)-fi;O==="flex"&&R==="row-reverse"?(P.left=U,P.right=oe):(P.left=oe,P.right=U),d.value=Y;let X=T.scrollTop;M===u.document&&!X&&(X=u.document.body.scrollTop),I.top=Xm.value;const V=Math.abs(X)<=(o.top||0),ee=Math.abs(X)+T.clientHeight>=T.scrollHeight-(o.bottom||0)-fi;O==="flex"&&R==="column-reverse"?(P.top=ee,P.bottom=V):(P.top=V,P.bottom=ee),m.value=X},j=M=>{var k;if(!u)return;const T=(k=M.target.documentElement)!=null?k:M.target;A(T),D.value=!0,g(M),i(M)};return rt(e,"scroll",n?za(j,n,!0,!1):j,l),rs(()=>{try{const M=ce(e);if(!M)return;A(M)}catch(M){a(M)}}),rt(e,"scrollend",p,l),{x:_,y:b,isScrolling:D,arrivedState:P,directions:I,measure(){const M=ce(e);u&&M&&A(M)}}}function hf(e,t,n={}){const{window:s=Ve}=n;return hr(e,t,s==null?void 0:s.localStorage,n)}function zo(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const Ts=new WeakMap;function pf(e,t=!1){const n=xe(t);let s=null,r="";Ne(fr(e),l=>{const c=Ss(ce(l));if(c){const u=c;if(Ts.get(u)||Ts.set(u,u.style.overflow),u.style.overflow!=="hidden"&&(r=u.style.overflow),u.style.overflow==="hidden")return n.value=!0;if(n.value)return u.style.overflow="hidden"}},{immediate:!0});const i=()=>{const l=Ss(ce(e));!l||n.value||(ci&&(s=rt(l,"touchmove",c=>{hu(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},o=()=>{const l=Ss(ce(e));!l||!n.value||(ci&&(s==null||s()),l.style.overflow=r,Ts.delete(l),n.value=!1)};return Uo(o),ie({get(){return n.value},set(l){l?i():o()}})}function gf(e,t,n={}){const{window:s=Ve}=n;return hr(e,t,s==null?void 0:s.sessionStorage,n)}function mf(e={}){const{window:t=Ve,...n}=e;return du(t,n)}function yf(e={}){const{window:t=Ve,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:s=Number.POSITIVE_INFINITY,listenOrientation:r=!0,includeScrollbar:i=!0,type:o="inner"}=e,l=xe(n),c=xe(s),u=()=>{if(t)if(o==="outer")l.value=t.outerWidth,c.value=t.outerHeight;else if(o==="visual"&&t.visualViewport){const{width:d,height:m,scale:_}=t.visualViewport;l.value=Math.round(d*_),c.value=Math.round(m*_)}else i?(l.value=t.innerWidth,c.value=t.innerHeight):(l.value=t.document.documentElement.clientWidth,c.value=t.document.documentElement.clientHeight)};u(),rs(u);const a={passive:!0};if(rt("resize",u,a),t&&o==="visual"&&t.visualViewport&&rt(t.visualViewport,"resize",u,a),r){const d=Xo("(orientation: portrait)");Ne(d,()=>u())}return{width:l,height:c}}const Es={};var xs={};const Qo=/^(?:[a-z]+:|\/\/)/i,pu="vitepress-theme-appearance",gu=/#.*$/,mu=/[?#].*$/,yu=/(?:(^|\/)index)?\.(?:md|html)$/,_e=typeof document<"u",Zo={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function vu(e,t,n=!1){if(t===void 0)return!1;if(e=di(`/${e}`),n)return new RegExp(t).test(e);if(di(t)!==e)return!1;const s=t.match(gu);return s?(_e?location.hash:"")===s[0]:!0}function di(e){return decodeURI(e).replace(mu,"").replace(yu,"$1")}function _u(e){return Qo.test(e)}function bu(e,t){return Object.keys((e==null?void 0:e.locales)||{}).find(n=>n!=="root"&&!_u(n)&&vu(t,`/${n}/`,!0))||"root"}function wu(e,t){var s,r,i,o,l,c,u;const n=bu(e,t);return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:tl(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(u=e.locales[n])==null?void 0:u.themeConfig}})}function el(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=Su(e.title,s);return n===r.slice(3)?n:`${n}${r}`}function Su(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Tu(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([i,o])=>i===n&&o[r[0]]===r[1])}function tl(e,t){return[...e.filter(n=>!Tu(t,n)),...t]}const Eu=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,xu=/^[a-z]:/i;function hi(e){const t=xu.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Eu,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const Cs=new Set;function Cu(e){if(Cs.size===0){const n=typeof process=="object"&&(xs==null?void 0:xs.VITE_EXTRA_EXTENSIONS)||(Es==null?void 0:Es.VITE_EXTRA_EXTENSIONS)||"";("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(n&&typeof n=="string"?","+n:"")).split(",").forEach(s=>Cs.add(s))}const t=e.split(".").pop();return t==null||!Cs.has(t.toLowerCase())}function vf(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const Au=Symbol(),Et=xe(Wa);function _f(e){const t=ie(()=>wu(Et.value,e.data.relativePath)),n=t.value.appearance,s=n==="force-dark"?De(!0):n==="force-auto"?Jo():n?fu({storageKey:pu,initialValue:()=>n==="dark"?"dark":"auto",...typeof n=="object"?n:{}}):De(!1),r=De(_e?location.hash:"");return _e&&window.addEventListener("hashchange",()=>{r.value=location.hash}),Ne(()=>e.data,()=>{r.value=_e?location.hash:""}),{site:t,theme:ie(()=>t.value.themeConfig),page:ie(()=>e.data),frontmatter:ie(()=>e.data.frontmatter),params:ie(()=>e.data.params),lang:ie(()=>t.value.lang),dir:ie(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:ie(()=>t.value.localeIndex||"root"),title:ie(()=>el(t.value,e.data)),description:ie(()=>e.data.description||t.value.description),isDark:s,hash:ie(()=>r.value)}}function Ru(){const e=bt(Au);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Mu(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function pi(e){return Qo.test(e)||!e.startsWith("/")?e:Mu(Et.value.base,e)}function Ou(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),_e){const n="/";t=hi(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];if(s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),!s)return null;t=`${n}assets/${t}.${s}.js`}else t=`./${hi(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let In=[];function bf(e){In.push(e),ts(()=>{In=In.filter(t=>t!==e)})}function Pu(){let e=Et.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=gi(e,n);else if(Array.isArray(e))for(const s of e){const r=gi(s,n);if(r){t=r;break}}return t}function gi(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}const Lu=Symbol(),nl="http://a.com",Iu=()=>({path:"/",component:null,data:Zo});function wf(e,t){const n=Ht(Iu()),s={route:n,go:r};async function r(l=_e?location.href:"/"){var c,u;l=As(l),await((c=s.onBeforeRouteChange)==null?void 0:c.call(s,l))!==!1&&(_e&&l!==As(location.href)&&(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",l)),await o(l),await((u=s.onAfterRouteChange??s.onAfterRouteChanged)==null?void 0:u(l)))}let i=null;async function o(l,c=0,u=!1){var m,_;if(await((m=s.onBeforePageLoad)==null?void 0:m.call(s,l))===!1)return;const a=new URL(l,nl),d=i=a.pathname;try{let b=await e(d);if(!b)throw new Error(`Page not found: ${d}`);if(i===d){i=null;const{default:y,__pageData:D}=b;if(!y)throw new Error(`Invalid route component: ${y}`);await((_=s.onAfterPageLoad)==null?void 0:_.call(s,l)),n.path=_e?d:pi(d),n.component=Mn(y),n.data=Mn(D),_e&&Qn(()=>{let P=Et.value.base+D.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!Et.value.cleanUrls&&!P.endsWith("/")&&(P+=".html"),P!==a.pathname&&(a.pathname=P,l=P+a.search+a.hash,history.replaceState({},"",l)),a.hash&&!c){let I=null;try{I=document.getElementById(decodeURIComponent(a.hash).slice(1))}catch(p){console.warn(p)}if(I){mi(I,a.hash);return}}window.scrollTo(0,c)})}}catch(b){if(!/fetch|Page not found/.test(b.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(b),!u)try{const y=await fetch(Et.value.base+"hashmap.json");window.__VP_HASH_MAP__=await y.json(),await o(l,c,!0);return}catch{}if(i===d){i=null,n.path=_e?d:pi(d),n.component=t?Mn(t):null;const y=_e?d.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").replace(/^\//,""):"404.md";n.data={...Zo,relativePath:y}}}}return _e&&(history.state===null&&history.replaceState({},""),window.addEventListener("click",l=>{if(l.defaultPrevented||!(l.target instanceof Element)||l.target.closest("button")||l.button!==0||l.ctrlKey||l.shiftKey||l.altKey||l.metaKey)return;const c=l.target.closest("a");if(!c||c.closest(".vp-raw")||c.hasAttribute("download")||c.hasAttribute("target"))return;const u=c.getAttribute("href")??(c instanceof SVGAElement?c.getAttribute("xlink:href"):null);if(u==null)return;const{href:a,origin:d,pathname:m,hash:_,search:b}=new URL(u,c.baseURI),y=new URL(location.href);d===y.origin&&Cu(m)&&(l.preventDefault(),m===y.pathname&&b===y.search?(_!==y.hash&&(history.pushState({},"",a),window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:y.href,newURL:a}))),_?mi(c,_,c.classList.contains("header-anchor")):window.scrollTo(0,0)):r(a))},{capture:!0}),window.addEventListener("popstate",async l=>{var u;if(l.state===null)return;const c=As(location.href);await o(c,l.state&&l.state.scrollPosition||0),await((u=s.onAfterRouteChange??s.onAfterRouteChanged)==null?void 0:u(c))}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function Nu(){const e=bt(Lu);if(!e)throw new Error("useRouter() is called without provider.");return e}function sl(){return Nu().route}function mi(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(r){console.warn(r)}if(s){let r=function(){!n||Math.abs(o-window.scrollY)>window.innerHeight?window.scrollTo(0,o):window.scrollTo({left:0,top:o,behavior:"smooth"})};const i=parseInt(window.getComputedStyle(s).paddingTop,10),o=window.scrollY+s.getBoundingClientRect().top-Pu()+i;requestAnimationFrame(r)}}function As(e){const t=new URL(e,nl);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),Et.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const xn=()=>In.forEach(e=>e()),Sf=rr({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=sl(),{frontmatter:n,site:s}=Ru();return Ne(n,xn,{deep:!0,flush:"post"}),()=>Us(e.as,s.value.contentProps??{style:{position:"relative"}},[t.component?Us(t.component,{onVnodeMounted:xn,onVnodeUpdated:xn,onVnodeUnmounted:xn}):"404 Page Not Found"])}}),Tf=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},Fu="modulepreload",Hu=function(e){return"/"+e},yi={},Ef=function(t,n,s){let r=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),l=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));r=Promise.allSettled(n.map(c=>{if(c=Hu(c),c in yi)return;yi[c]=!0;const u=c.endsWith(".css"),a=u?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${a}`))return;const d=document.createElement("link");if(d.rel=u?"stylesheet":Fu,u||(d.as="script"),d.crossOrigin="",d.href=c,l&&d.setAttribute("nonce",l),document.head.appendChild(d),u)return new Promise((m,_)=>{d.addEventListener("load",m),d.addEventListener("error",()=>_(new Error(`Unable to preload CSS for ${c}`)))})}))}function i(o){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=o,window.dispatchEvent(l),!l.defaultPrevented)throw o}return r.then(o=>{for(const l of o||[])l.status==="rejected"&&i(l.reason);return t().catch(i)})},xf=rr({setup(e,{slots:t}){const n=De(!1);return jt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Cf(){_e&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const s=(n=t.parentElement)==null?void 0:n.parentElement;if(!s)return;const r=Array.from(s.querySelectorAll("input")).indexOf(t);if(r<0)return;const i=s.querySelector(".blocks");if(!i)return;const o=Array.from(i.children).find(u=>u.classList.contains("active"));if(!o)return;const l=i.children[r];if(!l||o===l)return;o.classList.remove("active"),l.classList.add("active");const c=s==null?void 0:s.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function Af(){if(_e){const e=new WeakMap;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className),l=[".vp-copy-ignore",".diff.remove"],c=i.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(a=>a.remove());let u=c.textContent||"";o&&(u=u.replace(/^ *(\$|>) /gm,"").trim()),Du(u).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const a=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,a)})}})}}async function Du(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function Rf(e,t){let n=!0,s=[];const r=i=>{if(n){n=!1,i.forEach(l=>{const c=Rs(l);for(const u of document.head.children)if(u.isEqualNode(c)){s.push(u);return}});return}const o=i.map(Rs);s.forEach((l,c)=>{const u=o.findIndex(a=>a==null?void 0:a.isEqualNode(l??null));u!==-1?delete o[u]:(l==null||l.remove(),delete s[c])}),o.forEach(l=>l&&document.head.appendChild(l)),s=[...s,...o].filter(Boolean)};sr(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[],u=el(o,i);u!==document.title&&(document.title=u);const a=l||o.description;let d=document.querySelector("meta[name=description]");d?d.getAttribute("content")!==a&&d.setAttribute("content",a):Rs(["meta",{name:"description",content:a}]),r(tl(o.head,ju(c)))})}function Rs([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),e==="script"&&t.async==null&&(s.async=!1),s}function $u(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function ju(e){return e.filter(t=>!$u(t))}const Ms=new Set,rl=()=>document.createElement("link"),Vu=e=>{const t=rl();t.rel="prefetch",t.href=e,document.head.appendChild(t)},ku=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let Cn;const Wu=_e&&(Cn=rl())&&Cn.relList&&Cn.relList.supports&&Cn.relList.supports("prefetch")?Vu:ku;function Mf(){if(!_e||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!Ms.has(c)){Ms.add(c);const u=Ou(c);u&&Wu(u)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{hostname:o,pathname:l}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||i.target!=="_blank"&&o===location.hostname&&(l!==location.pathname?n.observe(i):Ms.add(l))})})};jt(s);const r=sl();Ne(()=>r.path,s),ts(()=>{n&&n.disconnect()})}export{io as $,Pu as A,Yu as B,Gu as C,bf as D,fe as E,Te as F,xe as G,Xu as H,Qo as I,sl as J,ta as K,bt as L,yf as M,Xs as N,df as O,Qn as P,mf as Q,_e as R,tn as S,nf as T,qu as U,Ef as V,pf as W,rc as X,zu as Y,of as Z,Tf as _,No as a,rf as a0,Qu as a1,Rf as a2,Lu as a3,_f as a4,Au as a5,Sf as a6,xf as a7,Et as a8,wf as a9,Ou as aa,cf as ab,Mf as ac,Af as ad,Cf as ae,Us as af,ef as ag,Uo as ah,ce as ai,ws as aj,dr as ak,af as al,ff as am,gf as an,hf as ao,uf as ap,Nu as aq,rt as ar,Uu as as,sf as at,ae as au,Ku as av,Mn as aw,lf as ax,vf as ay,ks as b,Zu as c,rr as d,tf as e,Cu as f,pi as g,ie as h,_u as i,Io as j,zn as k,vu as l,Xo as m,Ys as n,Vs as o,De as p,Ne as q,Ju as r,sr as s,_l as t,Ru as u,jt as v,sc as w,ts as x,Bu as y,Tc as z}; diff --git a/assets/chunks/framework.DXGyWiRo.js b/assets/chunks/framework.DXGyWiRo.js new file mode 100644 index 00000000..8f899fda --- /dev/null +++ b/assets/chunks/framework.DXGyWiRo.js @@ -0,0 +1,19 @@ +/** +* @vue/shared v3.5.32 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function qs(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const ne={},Nt=[],Xe=()=>{},_i=()=>!1,un=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Bn=e=>e.startsWith("onUpdate:"),he=Object.assign,Gs=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},ll=Object.prototype.hasOwnProperty,Z=(e,t)=>ll.call(e,t),K=Array.isArray,Ft=e=>fn(e)==="[object Map]",bi=e=>fn(e)==="[object Set]",br=e=>fn(e)==="[object Date]",q=e=>typeof e=="function",le=e=>typeof e=="string",Oe=e=>typeof e=="symbol",Q=e=>e!==null&&typeof e=="object",wi=e=>(Q(e)||q(e))&&q(e.then)&&q(e.catch),Si=Object.prototype.toString,fn=e=>Si.call(e),cl=e=>fn(e).slice(8,-1),Ti=e=>fn(e)==="[object Object]",Kn=e=>le(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,bt=qs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),qn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},al=/-\w/g,Ee=qn(e=>e.replace(al,t=>t.slice(1).toUpperCase())),ul=/\B([A-Z])/g,ft=qn(e=>e.replace(ul,"-$1").toLowerCase()),Gn=qn(e=>e.charAt(0).toUpperCase()+e.slice(1)),Mn=qn(e=>e?`on${Gn(e)}`:""),Ge=(e,t)=>!Object.is(e,t),On=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},Xs=e=>{const t=parseFloat(e);return isNaN(t)?e:t},fl=e=>{const t=le(e)?Number(e):NaN;return isNaN(t)?e:t};let wr;const Xn=()=>wr||(wr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ys(e){if(K(e)){const t={};for(let n=0;n{if(n){const s=n.split(hl);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Js(e){let t="";if(le(e))t=e;else if(K(e))for(let n=0;n!!(e&&e.__v_isRef===!0),_l=e=>le(e)?e:e==null?"":K(e)||Q(e)&&(e.toString===Si||!q(e.toString))?Ci(e)?_l(e.value):JSON.stringify(e,Ai,2):String(e),Ai=(e,t)=>Ci(t)?Ai(e,t.value):Ft(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[as(s,i)+" =>"]=r,n),{})}:bi(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>as(n))}:Oe(t)?as(t):Q(t)&&!K(t)&&!Ti(t)?String(t):t,as=(e,t="")=>{var n;return Oe(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.5.32 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let ye;class bl{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=ye,!t&&ye&&(this.index=(ye.scopes||(ye.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(ye=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(Jt){let t=Jt;for(Jt=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Yt;){let t=Yt;for(Yt=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function Li(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Ii(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),er(s),Sl(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function Ps(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ni(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ni(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===tn)||(e.globalVersion=tn,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Ps(e))))return;e.flags|=2;const t=e.dep,n=re,s=He;re=e,He=!0;try{Li(e);const r=e.fn(e._value);(t.version===0||Ge(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{re=n,He=s,Ii(e),e.flags&=-3}}function er(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)er(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Sl(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let He=!0;const Fi=[];function tt(){Fi.push(He),He=!1}function nt(){const e=Fi.pop();He=e===void 0?!0:e}function Sr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=re;re=void 0;try{t()}finally{re=n}}}let tn=0;class Tl{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Yn{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!re||!He||re===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==re)n=this.activeLink=new Tl(re,this),re.deps?(n.prevDep=re.depsTail,re.depsTail.nextDep=n,re.depsTail=n):re.deps=re.depsTail=n,Hi(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=re.depsTail,n.nextDep=void 0,re.depsTail.nextDep=n,re.depsTail=n,re.deps===n&&(re.deps=s)}return n}trigger(t){this.version++,tn++,this.notify(t)}notify(t){Qs();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Zs()}}}function Hi(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Hi(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Fn=new WeakMap,wt=Symbol(""),Ls=Symbol(""),nn=Symbol("");function _e(e,t,n){if(He&&re){let s=Fn.get(e);s||Fn.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new Yn),r.map=s,r.key=n),r.track()}}function Ze(e,t,n,s,r,i){const o=Fn.get(e);if(!o){tn++;return}const l=c=>{c&&c.trigger()};if(Qs(),t==="clear")o.forEach(l);else{const c=K(e),u=c&&Kn(n);if(c&&n==="length"){const a=Number(s);o.forEach((d,m)=>{(m==="length"||m===nn||!Oe(m)&&m>=a)&&l(d)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),u&&l(o.get(nn)),t){case"add":c?u&&l(o.get("length")):(l(o.get(wt)),Ft(e)&&l(o.get(Ls)));break;case"delete":c||(l(o.get(wt)),Ft(e)&&l(o.get(Ls)));break;case"set":Ft(e)&&l(o.get(wt));break}}Zs()}function El(e,t){const n=Fn.get(e);return n&&n.get(t)}function Mt(e){const t=z(e);return t===e?t:(_e(t,"iterate",nn),Me(e)?t:t.map($e))}function Jn(e){return _e(e=z(e),"iterate",nn),e}function qe(e,t){return st(e)?jt(ct(e)?$e(t):t):$e(t)}const xl={__proto__:null,[Symbol.iterator](){return fs(this,Symbol.iterator,e=>qe(this,e))},concat(...e){return Mt(this).concat(...e.map(t=>K(t)?Mt(t):t))},entries(){return fs(this,"entries",e=>(e[1]=qe(this,e[1]),e))},every(e,t){return Ye(this,"every",e,t,void 0,arguments)},filter(e,t){return Ye(this,"filter",e,t,n=>n.map(s=>qe(this,s)),arguments)},find(e,t){return Ye(this,"find",e,t,n=>qe(this,n),arguments)},findIndex(e,t){return Ye(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Ye(this,"findLast",e,t,n=>qe(this,n),arguments)},findLastIndex(e,t){return Ye(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Ye(this,"forEach",e,t,void 0,arguments)},includes(...e){return ds(this,"includes",e)},indexOf(...e){return ds(this,"indexOf",e)},join(e){return Mt(this).join(e)},lastIndexOf(...e){return ds(this,"lastIndexOf",e)},map(e,t){return Ye(this,"map",e,t,void 0,arguments)},pop(){return Bt(this,"pop")},push(...e){return Bt(this,"push",e)},reduce(e,...t){return Tr(this,"reduce",e,t)},reduceRight(e,...t){return Tr(this,"reduceRight",e,t)},shift(){return Bt(this,"shift")},some(e,t){return Ye(this,"some",e,t,void 0,arguments)},splice(...e){return Bt(this,"splice",e)},toReversed(){return Mt(this).toReversed()},toSorted(e){return Mt(this).toSorted(e)},toSpliced(...e){return Mt(this).toSpliced(...e)},unshift(...e){return Bt(this,"unshift",e)},values(){return fs(this,"values",e=>qe(this,e))}};function fs(e,t,n){const s=Jn(e),r=s[t]();return s!==e&&!Me(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.done||(i.value=n(i.value)),i}),r}const Cl=Array.prototype;function Ye(e,t,n,s,r,i){const o=Jn(e),l=o!==e&&!Me(e),c=o[t];if(c!==Cl[t]){const d=c.apply(e,i);return l?$e(d):d}let u=n;o!==e&&(l?u=function(d,m){return n.call(this,qe(e,d),m,e)}:n.length>2&&(u=function(d,m){return n.call(this,d,m,e)}));const a=c.call(o,u,s);return l&&r?r(a):a}function Tr(e,t,n,s){const r=Jn(e),i=r!==e&&!Me(e);let o=n,l=!1;r!==e&&(i?(l=s.length===0,o=function(u,a,d){return l&&(l=!1,u=qe(e,u)),n.call(this,u,qe(e,a),d,e)}):n.length>3&&(o=function(u,a,d){return n.call(this,u,a,d,e)}));const c=r[t](o,...s);return l?qe(e,c):c}function ds(e,t,n){const s=z(e);_e(s,"iterate",nn);const r=s[t](...n);return(r===-1||r===!1)&&zn(n[0])?(n[0]=z(n[0]),s[t](...n)):r}function Bt(e,t,n=[]){tt(),Qs();const s=z(e)[t].apply(e,n);return Zs(),nt(),s}const Al=qs("__proto__,__v_isRef,__isVue"),Di=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Oe));function Rl(e){Oe(e)||(e=String(e));const t=z(this);return _e(t,"has",e),t.hasOwnProperty(e)}class $i{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?$l:Wi:i?ki:Vi).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=K(t);if(!r){let c;if(o&&(c=xl[n]))return c;if(n==="hasOwnProperty")return Rl}const l=Reflect.get(t,n,ae(t)?t:s);if((Oe(n)?Di.has(n):Al(n))||(r||_e(t,"get",n),i))return l;if(ae(l)){const c=o&&Kn(n)?l:l.value;return r&&Q(c)?sn(c):c}return Q(l)?r?sn(l):$t(l):l}}class ji extends $i{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];const o=K(t)&&Kn(n);if(!this._isShallow){const u=st(i);if(!Me(s)&&!st(s)&&(i=z(i),s=z(s)),!o&&ae(i)&&!ae(s))return u||(i.value=s),!0}const l=o?Number(n)e,vn=e=>Reflect.getPrototypeOf(e);function Il(e,t,n){return function(...s){const r=this.__v_raw,i=z(r),o=Ft(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,u=r[e](...s),a=n?Is:t?jt:$e;return!t&&_e(i,"iterate",c?Ls:wt),he(Object.create(u),{next(){const{value:d,done:m}=u.next();return m?{value:d,done:m}:{value:l?[a(d[0]),a(d[1])]:a(d),done:m}}})}}function _n(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Nl(e,t){const n={get(r){const i=this.__v_raw,o=z(i),l=z(r);e||(Ge(r,l)&&_e(o,"get",r),_e(o,"get",l));const{has:c}=vn(o),u=t?Is:e?jt:$e;if(c.call(o,r))return u(i.get(r));if(c.call(o,l))return u(i.get(l));i!==o&&i.get(r)},get size(){const r=this.__v_raw;return!e&&_e(z(r),"iterate",wt),r.size},has(r){const i=this.__v_raw,o=z(i),l=z(r);return e||(Ge(r,l)&&_e(o,"has",r),_e(o,"has",l)),r===l?i.has(r):i.has(r)||i.has(l)},forEach(r,i){const o=this,l=o.__v_raw,c=z(l),u=t?Is:e?jt:$e;return!e&&_e(c,"iterate",wt),l.forEach((a,d)=>r.call(i,u(a),u(d),o))}};return he(n,e?{add:_n("add"),set:_n("set"),delete:_n("delete"),clear:_n("clear")}:{add(r){const i=z(this),o=vn(i),l=z(r),c=!t&&!Me(r)&&!st(r)?l:r;return o.has.call(i,c)||Ge(r,c)&&o.has.call(i,r)||Ge(l,c)&&o.has.call(i,l)||(i.add(c),Ze(i,"add",c,c)),this},set(r,i){!t&&!Me(i)&&!st(i)&&(i=z(i));const o=z(this),{has:l,get:c}=vn(o);let u=l.call(o,r);u||(r=z(r),u=l.call(o,r));const a=c.call(o,r);return o.set(r,i),u?Ge(i,a)&&Ze(o,"set",r,i):Ze(o,"add",r,i),this},delete(r){const i=z(this),{has:o,get:l}=vn(i);let c=o.call(i,r);c||(r=z(r),c=o.call(i,r)),l&&l.call(i,r);const u=i.delete(r);return c&&Ze(i,"delete",r,void 0),u},clear(){const r=z(this),i=r.size!==0,o=r.clear();return i&&Ze(r,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=Il(r,e,t)}),n}function tr(e,t){const n=Nl(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(Z(n,r)&&r in s?n:s,r,i)}const Fl={get:tr(!1,!1)},Hl={get:tr(!1,!0)},Dl={get:tr(!0,!1)};const Vi=new WeakMap,ki=new WeakMap,Wi=new WeakMap,$l=new WeakMap;function jl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Vl(e){return e.__v_skip||!Object.isExtensible(e)?0:jl(cl(e))}function $t(e){return st(e)?e:nr(e,!1,Ol,Fl,Vi)}function kl(e){return nr(e,!1,Ll,Hl,ki)}function sn(e){return nr(e,!0,Pl,Dl,Wi)}function nr(e,t,n,s,r){if(!Q(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=Vl(e);if(i===0)return e;const o=r.get(e);if(o)return o;const l=new Proxy(e,i===2?s:n);return r.set(e,l),l}function ct(e){return st(e)?ct(e.__v_raw):!!(e&&e.__v_isReactive)}function st(e){return!!(e&&e.__v_isReadonly)}function Me(e){return!!(e&&e.__v_isShallow)}function zn(e){return e?!!e.__v_raw:!1}function z(e){const t=e&&e.__v_raw;return t?z(t):e}function Pn(e){return!Z(e,"__v_skip")&&Object.isExtensible(e)&&Ei(e,"__v_skip",!0),e}const $e=e=>Q(e)?$t(e):e,jt=e=>Q(e)?sn(e):e;function ae(e){return e?e.__v_isRef===!0:!1}function De(e){return Ui(e,!1)}function xe(e){return Ui(e,!0)}function Ui(e,t){return ae(e)?e:new Wl(e,t)}class Wl{constructor(t,n){this.dep=new Yn,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:z(t),this._value=n?t:$e(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Me(t)||st(t);t=s?t:z(t),Ge(t,n)&&(this._rawValue=t,this._value=s?t:$e(t),this.dep.trigger())}}function Qn(e){return ae(e)?e.value:e}function ce(e){return q(e)?e():Qn(e)}const Ul={get:(e,t,n)=>t==="__v_raw"?e:Qn(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return ae(r)&&!ae(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Bi(e){return ct(e)?e:new Proxy(e,Ul)}class Bl{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new Yn,{get:s,set:r}=t(n.track.bind(n),n.trigger.bind(n));this._get=s,this._set=r}get value(){return this._value=this._get()}set value(t){this._set(t)}}function Kl(e){return new Bl(e)}class ql{constructor(t,n,s){this._object=t,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0,this._key=Oe(n)?n:String(n),this._raw=z(t);let r=!0,i=t;if(!K(t)||Oe(this._key)||!Kn(this._key))do r=!zn(i)||Me(i);while(r&&(i=i.__v_raw));this._shallow=r}get value(){let t=this._object[this._key];return this._shallow&&(t=Qn(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&ae(this._raw[this._key])){const n=this._object[this._key];if(ae(n)){n.value=t;return}}this._object[this._key]=t}get dep(){return El(this._raw,this._key)}}class Gl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function Xl(e,t,n){return ae(e)?e:q(e)?new Gl(e):Q(e)&&arguments.length>1?Yl(e,t,n):De(e)}function Yl(e,t,n){return new ql(e,t,n)}class Jl{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Yn(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=tn-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&re!==this)return Pi(this,!0),!0}get value(){const t=this.dep.track();return Ni(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function zl(e,t,n=!1){let s,r;return q(e)?s=e:(s=e.get,r=e.set),new Jl(s,r,n)}const bn={},Hn=new WeakMap;let yt;function Ql(e,t=!1,n=yt){if(n){let s=Hn.get(n);s||Hn.set(n,s=[]),s.push(e)}}function Zl(e,t,n=ne){const{immediate:s,deep:r,once:i,scheduler:o,augmentJob:l,call:c}=n,u=g=>r?g:Me(g)||r===!1||r===0?et(g,1):et(g);let a,d,m,_,b=!1,y=!1;if(ae(e)?(d=()=>e.value,b=Me(e)):ct(e)?(d=()=>u(e),b=!0):K(e)?(y=!0,b=e.some(g=>ct(g)||Me(g)),d=()=>e.map(g=>{if(ae(g))return g.value;if(ct(g))return u(g);if(q(g))return c?c(g,2):g()})):q(e)?t?d=c?()=>c(e,2):e:d=()=>{if(m){tt();try{m()}finally{nt()}}const g=yt;yt=a;try{return c?c(e,3,[_]):e(_)}finally{yt=g}}:d=Xe,t&&r){const g=d,M=r===!0?1/0:r;d=()=>et(g(),M)}const $=Ri(),P=()=>{a.stop(),$&&$.active&&Gs($.effects,a)};if(i&&t){const g=t;t=(...M)=>{g(...M),P()}}let L=y?new Array(e.length).fill(bn):bn;const p=g=>{if(!(!(a.flags&1)||!a.dirty&&!g))if(t){const M=a.run();if(r||b||(y?M.some((F,C)=>Ge(F,L[C])):Ge(M,L))){m&&m();const F=yt;yt=a;try{const C=[M,L===bn?void 0:y&&L[0]===bn?[]:L,_];L=M,c?c(t,3,C):t(...C)}finally{yt=F}}}else a.run()};return l&&l(p),a=new Mi(d),a.scheduler=o?()=>o(p,!1):p,_=g=>Ql(g,!1,a),m=a.onStop=()=>{const g=Hn.get(a);if(g){if(c)c(g,4);else for(const M of g)M();Hn.delete(a)}},t?s?p(!0):L=a.run():o?o(p.bind(null,!0),!0):a.run(),P.pause=a.pause.bind(a),P.resume=a.resume.bind(a),P.stop=P,P}function et(e,t=1/0,n){if(t<=0||!Q(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,ae(e))et(e.value,t,n);else if(K(e))for(let s=0;s{et(s,t,n)});else if(Ti(e)){for(const s in e)et(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&et(e[s],t,n)}return e}/** +* @vue/runtime-core v3.5.32 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function dn(e,t,n,s){try{return s?e(...s):e()}catch(r){hn(r,t,n)}}function je(e,t,n,s){if(q(e)){const r=dn(e,t,n,s);return r&&wi(r)&&r.catch(i=>{hn(i,t,n)}),r}if(K(e)){const r=[];for(let i=0;i>>1,r=Se[s],i=rn(r);i=rn(n)?Se.push(e):Se.splice(tc(t),0,e),e.flags|=1,qi()}}function qi(){Dn||(Dn=Ki.then(Gi))}function nc(e){K(e)?Ht.push(...e):lt&&e.id===-1?lt.splice(Pt+1,0,e):e.flags&1||(Ht.push(e),e.flags|=1),qi()}function Er(e,t,n=Ue+1){for(;nrn(n)-rn(s));if(Ht.length=0,lt){lt.push(...t);return}for(lt=t,Pt=0;Pte.id==null?e.flags&2?-1:1/0:e.id;function Gi(e){try{for(Ue=0;Ue{s._d&&Wn(-1);const i=jn(t);let o;try{o=e(...r)}finally{jn(i),s._d&&Wn(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function Bu(e,t){if(me===null)return e;const n=rs(me),s=e.dirs||(e.dirs=[]);for(let r=0;r1)return n&&q(t)?t.call(s&&s.proxy):t}}function Yi(){return!!(At()||Et)}const ic=Symbol.for("v-scx"),oc=()=>St(ic);function rr(e,t){return es(e,null,t)}function Ku(e,t){return es(e,null,{flush:"post"})}function Ne(e,t,n){return es(e,t,n)}function es(e,t,n=ne){const{immediate:s,deep:r,flush:i,once:o}=n,l=he({},n),c=t&&s||!t&&i!=="post";let u;if(Vt){if(i==="sync"){const _=oc();u=_.__watcherHandles||(_.__watcherHandles=[])}else if(!c){const _=()=>{};return _.stop=Xe,_.resume=Xe,_.pause=Xe,_}}const a=ge;l.call=(_,b,y)=>je(_,a,b,y);let d=!1;i==="post"?l.scheduler=_=>{we(_,a&&a.suspense)}:i!=="sync"&&(d=!0,l.scheduler=(_,b)=>{b?_():sr(_)}),l.augmentJob=_=>{t&&(_.flags|=4),d&&(_.flags|=2,a&&(_.id=a.uid,_.i=a))};const m=Zl(e,t,l);return Vt&&(u?u.push(m):c&&m()),m}function lc(e,t,n){const s=this.proxy,r=le(e)?e.includes(".")?Ji(s,e):()=>s[e]:e.bind(s,s);let i;q(t)?i=t:(i=t.handler,n=t);const o=gn(this),l=es(r,i.bind(s),n);return o(),l}function Ji(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;re.__isTeleport,vt=e=>e&&(e.disabled||e.disabled===""),cc=e=>e&&(e.defer||e.defer===""),xr=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Cr=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Ns=(e,t)=>{const n=e&&e.to;return le(n)?t?t(n):null:n},ac={name:"Teleport",__isTeleport:!0,process(e,t,n,s,r,i,o,l,c,u){const{mc:a,pc:d,pbc:m,o:{insert:_,querySelector:b,createText:y,createComment:$}}=u,P=vt(t.props);let{dynamicChildren:L}=t;const p=(F,C,V)=>{F.shapeFlag&16&&a(F.children,C,V,r,i,o,l,c)},g=(F=t)=>{const C=vt(F.props),V=F.target=Ns(F.props,b),A=Fs(V,F,y,_);V&&(o!=="svg"&&xr(V)?o="svg":o!=="mathml"&&Cr(V)&&(o="mathml"),r&&r.isCE&&(r.ce._teleportTargets||(r.ce._teleportTargets=new Set)).add(V),C||(p(F,V,A),Gt(F,!1)))},M=F=>{const C=()=>{ht.get(F)===C&&(ht.delete(F),vt(F.props)&&(p(F,n,F.anchor),Gt(F,!0)),g(F))};ht.set(F,C),we(C,i)};if(e==null){const F=t.el=y(""),C=t.anchor=y("");if(_(F,n,s),_(C,n,s),cc(t.props)||i&&i.pendingBranch){M(t);return}P&&(p(t,n,C),Gt(t,!0)),g()}else{t.el=e.el;const F=t.anchor=e.anchor,C=ht.get(e);if(C){C.flags|=8,ht.delete(e),M(t);return}t.targetStart=e.targetStart;const V=t.target=e.target,A=t.targetAnchor=e.targetAnchor,O=vt(e.props),R=O?n:V,w=O?F:A;if(o==="svg"||xr(V)?o="svg":(o==="mathml"||Cr(V))&&(o="mathml"),L?(m(e.dynamicChildren,L,R,r,i,o,l),ar(e,t,!0)):c||d(e,t,R,w,r,i,o,l,!1),P)O?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):wn(t,n,F,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const H=t.target=Ns(t.props,b);H&&wn(t,H,null,u,0)}else O&&wn(t,V,A,u,1);Gt(t,P)}},remove(e,t,n,{um:s,o:{remove:r}},i){const{shapeFlag:o,children:l,anchor:c,targetStart:u,targetAnchor:a,target:d,props:m}=e;let _=i||!vt(m);const b=ht.get(e);if(b&&(b.flags|=8,ht.delete(e),_=!1),d&&(r(u),r(a)),i&&r(c),o&16)for(let y=0;y{e.isMounted=!0}),io(()=>{e.isUnmounting=!0}),e}const Pe=[Function,Array],Zi={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Pe,onEnter:Pe,onAfterEnter:Pe,onEnterCancelled:Pe,onBeforeLeave:Pe,onLeave:Pe,onAfterLeave:Pe,onLeaveCancelled:Pe,onBeforeAppear:Pe,onAppear:Pe,onAfterAppear:Pe,onAppearCancelled:Pe},eo=e=>{const t=e.subTree;return t.component?eo(t.component):t},dc={name:"BaseTransition",props:Zi,setup(e,{slots:t}){const n=At(),s=fc();return()=>{const r=t.default&&so(t.default(),!0);if(!r||!r.length)return;const i=to(r),o=z(e),{mode:l}=o;if(s.isLeaving)return hs(i);const c=Ar(i);if(!c)return hs(i);let u=Hs(c,o,s,n,d=>u=d);c.type!==pe&&on(c,u);let a=n.subTree&&Ar(n.subTree);if(a&&a.type!==pe&&!_t(a,c)&&eo(n).type!==pe){let d=Hs(a,o,s,n);if(on(a,d),l==="out-in"&&c.type!==pe)return s.isLeaving=!0,d.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete d.afterLeave,a=void 0},hs(i);l==="in-out"&&c.type!==pe?d.delayLeave=(m,_,b)=>{const y=no(s,a);y[String(a.key)]=a,m[Ke]=()=>{_(),m[Ke]=void 0,delete u.delayedLeave,a=void 0},u.delayedLeave=()=>{b(),delete u.delayedLeave,a=void 0}}:a=void 0}else a&&(a=void 0);return i}}};function to(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==pe){t=n;break}}return t}const hc=dc;function no(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Hs(e,t,n,s,r){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:c,onEnter:u,onAfterEnter:a,onEnterCancelled:d,onBeforeLeave:m,onLeave:_,onAfterLeave:b,onLeaveCancelled:y,onBeforeAppear:$,onAppear:P,onAfterAppear:L,onAppearCancelled:p}=t,g=String(e.key),M=no(n,e),F=(A,O)=>{A&&je(A,s,9,O)},C=(A,O)=>{const R=O[1];F(A,O),K(A)?A.every(w=>w.length<=1)&&R():A.length<=1&&R()},V={mode:o,persisted:l,beforeEnter(A){let O=c;if(!n.isMounted)if(i)O=$||c;else return;A[Ke]&&A[Ke](!0);const R=M[g];R&&_t(e,R)&&R.el[Ke]&&R.el[Ke](),F(O,[A])},enter(A){if(M[g]===e)return;let O=u,R=a,w=d;if(!n.isMounted)if(i)O=P||u,R=L||a,w=p||d;else return;let H=!1;A[Kt]=oe=>{H||(H=!0,oe?F(w,[A]):F(R,[A]),V.delayedLeave&&V.delayedLeave(),A[Kt]=void 0)};const Y=A[Kt].bind(null,!1);O?C(O,[A,Y]):Y()},leave(A,O){const R=String(e.key);if(A[Kt]&&A[Kt](!0),n.isUnmounting)return O();F(m,[A]);let w=!1;A[Ke]=Y=>{w||(w=!0,O(),Y?F(y,[A]):F(b,[A]),A[Ke]=void 0,M[R]===e&&delete M[R])};const H=A[Ke].bind(null,!1);M[R]=e,_?C(_,[A,H]):H()},clone(A){const O=Hs(A,t,n,s,r);return r&&r(O),O}};return V}function hs(e){if(pn(e))return e=at(e),e.children=null,e}function Ar(e){if(!pn(e))return Qi(e.type)&&e.children?to(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&q(n.default))return n.default()}}function on(e,t){e.shapeFlag&6&&e.component?(e.transition=t,on(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function so(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;iDt(y,t&&(K(t)?t[$]:t),n,s,r));return}if(Tt(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&Dt(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?rs(s.component):s.el,o=r?null:i,{i:l,r:c}=e,u=t&&t.r,a=l.refs===ne?l.refs={}:l.refs,d=l.setupState,m=z(d),_=d===ne?_i:y=>Rr(a,y)?!1:Z(m,y),b=(y,$)=>!($&&Rr(a,$));if(u!=null&&u!==c){if(Mr(t),le(u))a[u]=null,_(u)&&(d[u]=null);else if(ae(u)){const y=t;b(u,y.k)&&(u.value=null),y.k&&(a[y.k]=null)}}if(q(c))dn(c,l,12,[o,a]);else{const y=le(c),$=ae(c);if(y||$){const P=()=>{if(e.f){const L=y?_(c)?d[c]:a[c]:b()||!e.k?c.value:a[e.k];if(r)K(L)&&Gs(L,i);else if(K(L))L.includes(i)||L.push(i);else if(y)a[c]=[i],_(c)&&(d[c]=a[c]);else{const p=[i];b(c,e.k)&&(c.value=p),e.k&&(a[e.k]=p)}}else y?(a[c]=o,_(c)&&(d[c]=o)):$&&(b(c,e.k)&&(c.value=o),e.k&&(a[e.k]=o))};if(o){const L=()=>{P(),Vn.delete(e)};L.id=-1,Vn.set(e,L),we(L,n)}else Mr(e),P()}}}function Mr(e){const t=Vn.get(e);t&&(t.flags|=8,Vn.delete(e))}let Or=!1;const Ot=()=>{Or||(console.error("Hydration completed but contains mismatches."),Or=!0)},pc=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",gc=e=>e.namespaceURI.includes("MathML"),Sn=e=>{if(e.nodeType===1){if(pc(e))return"svg";if(gc(e))return"mathml"}},It=e=>e.nodeType===8;function mc(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:u}}=e,a=(p,g)=>{if(!g.hasChildNodes()){n(null,p,g),$n(),g._vnode=p;return}d(g.firstChild,p,null,null,null),$n(),g._vnode=p},d=(p,g,M,F,C,V=!1)=>{V=V||!!g.dynamicChildren;const A=It(p)&&p.data==="[",O=()=>y(p,g,M,F,C,A),{type:R,ref:w,shapeFlag:H,patchFlag:Y}=g;let oe=p.nodeType;g.el=p,Y===-2&&(V=!1,g.dynamicChildren=null);let U=null;switch(R){case xt:oe!==3?g.children===""?(c(g.el=r(""),o(p),p),U=p):U=O():(p.data!==g.children&&(Ot(),p.data=g.children),U=i(p));break;case pe:L(p)?(U=i(p),P(g.el=p.content.firstChild,p,M)):oe!==8||A?U=O():U=i(p);break;case Qt:if(A&&(p=i(p),oe=p.nodeType),oe===1||oe===3){U=p;const X=!g.children.length;for(let k=0;k{V=V||!!g.dynamicChildren;const{type:A,props:O,patchFlag:R,shapeFlag:w,dirs:H,transition:Y}=g,oe=A==="input"||A==="option";if(oe||R!==-1){H&&Be(g,null,M,"created");let U=!1;if(L(p)){U=Co(null,Y)&&M&&M.vnode.props&&M.vnode.props.appear;const k=p.content.firstChild;if(U){const ee=k.getAttribute("class");ee&&(k.$cls=ee),Y.beforeEnter(k)}P(k,p,M),g.el=p=k}if(w&16&&!(O&&(O.innerHTML||O.textContent))){let k=_(p.firstChild,g,p,M,F,C,V);for(;k;){Tn(p,1)||Ot();const ee=k;k=k.nextSibling,l(ee)}}else if(w&8){let k=g.children;k[0]===` +`&&(p.tagName==="PRE"||p.tagName==="TEXTAREA")&&(k=k.slice(1));const{textContent:ee}=p;ee!==k&&ee!==k.replace(/\r\n|\r/g,` +`)&&(Tn(p,0)||Ot(),p.textContent=g.children)}if(O){if(oe||!V||R&48){const k=p.tagName.includes("-");for(const ee in O)(oe&&(ee.endsWith("value")||ee==="indeterminate")||un(ee)&&!bt(ee)||ee[0]==="."||k&&!bt(ee))&&s(p,ee,null,O[ee],void 0,M)}else if(O.onClick)s(p,"onClick",null,O.onClick,void 0,M);else if(R&4&&ct(O.style))for(const k in O.style)O.style[k]}let X;(X=O&&O.onVnodeBeforeMount)&&Le(X,M,g),H&&Be(g,null,M,"beforeMount"),((X=O&&O.onVnodeMounted)||H||U)&&Oo(()=>{X&&Le(X,M,g),U&&Y.enter(p),H&&Be(g,null,M,"mounted")},F)}return p.nextSibling},_=(p,g,M,F,C,V,A)=>{A=A||!!g.dynamicChildren;const O=g.children,R=O.length;for(let w=0;w{const{slotScopeIds:A}=g;A&&(C=C?C.concat(A):A);const O=o(p),R=_(i(p),g,O,M,F,C,V);return R&&It(R)&&R.data==="]"?i(g.anchor=R):(Ot(),c(g.anchor=u("]"),O,R),R)},y=(p,g,M,F,C,V)=>{if(Tn(p.parentElement,1)||Ot(),g.el=null,V){const R=$(p);for(;;){const w=i(p);if(w&&w!==R)l(w);else break}}const A=i(p),O=o(p);return l(p),n(null,g,O,A,M,F,Sn(O),C),M&&(M.vnode.el=g.el,mo(M,g.el)),A},$=(p,g="[",M="]")=>{let F=0;for(;p;)if(p=i(p),p&&It(p)&&(p.data===g&&F++,p.data===M)){if(F===0)return i(p);F--}return p},P=(p,g,M)=>{const F=g.parentNode;F&&F.replaceChild(p,g);let C=M;for(;C;)C.vnode.el===g&&(C.vnode.el=C.subTree.el=p),C=C.parent},L=p=>p.nodeType===1&&p.tagName==="TEMPLATE";return[a,d]}const Pr="data-allow-mismatch",yc={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function Tn(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(Pr);)e=e.parentElement;const n=e&&e.getAttribute(Pr);if(n==null)return!1;if(n==="")return!0;{const s=n.split(",");return t===0&&s.includes("children")?!0:s.includes(yc[t])}}Xn().requestIdleCallback;Xn().cancelIdleCallback;function vc(e,t){if(It(e)&&e.data==="["){let n=1,s=e.nextSibling;for(;s;){if(s.nodeType===1){if(t(s)===!1)break}else if(It(s))if(s.data==="]"){if(--n===0)break}else s.data==="["&&n++;s=s.nextSibling}}else t(e)}const Tt=e=>!!e.type.__asyncLoader;function Gu(e){q(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:r=200,hydrate:i,timeout:o,suspensible:l=!0,onError:c}=e;let u=null,a,d=0;const m=()=>(d++,u=null,_()),_=()=>{let b;return u||(b=u=t().catch(y=>{if(y=y instanceof Error?y:new Error(String(y)),c)return new Promise(($,P)=>{c(y,()=>$(m()),()=>P(y),d+1)});throw y}).then(y=>b!==u&&u?u:(y&&(y.__esModule||y[Symbol.toStringTag]==="Module")&&(y=y.default),a=y,y)))};return ir({name:"AsyncComponentWrapper",__asyncLoader:_,__asyncHydrate(b,y,$){let P=!1;(y.bu||(y.bu=[])).push(()=>P=!0);const L=()=>{P||$()},p=i?()=>{const g=i(L,M=>vc(b,M));g&&(y.bum||(y.bum=[])).push(g)}:L;a?p():_().then(()=>!y.isUnmounted&&p())},get __asyncResolved(){return a},setup(){const b=ge;if(or(b),a)return()=>En(a,b);const y=p=>{u=null,hn(p,b,13,!s)};if(l&&b.suspense||Vt)return _().then(p=>()=>En(p,b)).catch(p=>(y(p),()=>s?fe(s,{error:p}):null));const $=De(!1),P=De(),L=De(!!r);return r&&setTimeout(()=>{L.value=!1},r),o!=null&&setTimeout(()=>{if(!$.value&&!P.value){const p=new Error(`Async component timed out after ${o}ms.`);y(p),P.value=p}},o),_().then(()=>{$.value=!0,b.parent&&pn(b.parent.vnode)&&b.parent.update()}).catch(p=>{y(p),P.value=p}),()=>{if($.value&&a)return En(a,b);if(P.value&&s)return fe(s,{error:P.value});if(n&&!L.value)return En(n,b)}}})}function En(e,t){const{ref:n,props:s,children:r,ce:i}=t.vnode,o=fe(e,s,r);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const pn=e=>e.type.__isKeepAlive;function _c(e,t){ro(e,"a",t)}function bc(e,t){ro(e,"da",t)}function ro(e,t,n=ge){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(ts(t,s,n),n){let r=n.parent;for(;r&&r.parent;)pn(r.parent.vnode)&&wc(s,t,n,r),r=r.parent}}function wc(e,t,n,s){const r=ts(t,e,s,!0);ns(()=>{Gs(s[t],r)},n)}function ts(e,t,n=ge,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{tt();const l=gn(n),c=je(t,n,e,o);return l(),nt(),c});return s?r.unshift(i):r.push(i),i}}const it=e=>(t,n=ge)=>{(!Vt||e==="sp")&&ts(e,(...s)=>t(...s),n)},Sc=it("bm"),kt=it("m"),Tc=it("bu"),Ec=it("u"),io=it("bum"),ns=it("um"),xc=it("sp"),Cc=it("rtg"),Ac=it("rtc");function Rc(e,t=ge){ts("ec",e,t)}const oo="components";function Xu(e,t){return co(oo,e,!0,t)||e}const lo=Symbol.for("v-ndc");function Yu(e){return le(e)?co(oo,e,!1)||e:e||lo}function co(e,t,n=!0,s=!1){const r=me||ge;if(r){const i=r.type;{const l=aa(i,!1);if(l&&(l===t||l===Ee(t)||l===Gn(Ee(t))))return i}const o=Lr(r[e]||i[e],t)||Lr(r.appContext[e],t);return!o&&s?i:o}}function Lr(e,t){return e&&(e[t]||e[Ee(t)]||e[Gn(Ee(t))])}function Ju(e,t,n,s){let r;const i=n,o=K(e);if(o||le(e)){const l=o&&ct(e);let c=!1,u=!1;l&&(c=!Me(e),u=st(e),e=Jn(e)),r=new Array(e.length);for(let a=0,d=e.length;at(l,c,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let c=0,u=l.length;c0;return t!=="default"&&(n.name=t),ks(),Ws(Te,null,[fe("slot",n,s&&s())],u?-2:64)}let i=e[t];i&&i._c&&(i._d=!1),ks();const o=i&&ao(i(n)),l=n.key||o&&o.key,c=Ws(Te,{key:(l&&!Oe(l)?l:`_${t}`)+(!o&&s?"_fb":"")},o||(s?s():[]),o&&e._===1?64:-2);return!r&&c.scopeId&&(c.slotScopeIds=[c.scopeId+"-s"]),i&&i._c&&(i._d=!0),c}function ao(e){return e.some(t=>cn(t)?!(t.type===pe||t.type===Te&&!ao(t.children)):!0)?e:null}function Qu(e,t){const n={};for(const s in e)n[/[A-Z]/.test(s)?`on:${s}`:Mn(s)]=e[s];return n}const Ds=e=>e?Fo(e)?rs(e):Ds(e.parent):null,zt=he(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Ds(e.parent),$root:e=>Ds(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>fo(e),$forceUpdate:e=>e.f||(e.f=()=>{sr(e.update)}),$nextTick:e=>e.n||(e.n=Zn.bind(e.proxy)),$watch:e=>lc.bind(e)}),ps=(e,t)=>e!==ne&&!e.__isScriptSetup&&Z(e,t),Mc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;if(t[0]!=="$"){const m=o[t];if(m!==void 0)switch(m){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(ps(s,t))return o[t]=1,s[t];if(r!==ne&&Z(r,t))return o[t]=2,r[t];if(Z(i,t))return o[t]=3,i[t];if(n!==ne&&Z(n,t))return o[t]=4,n[t];$s&&(o[t]=0)}}const u=zt[t];let a,d;if(u)return t==="$attrs"&&_e(e.attrs,"get",""),u(e);if((a=l.__cssModules)&&(a=a[t]))return a;if(n!==ne&&Z(n,t))return o[t]=4,n[t];if(d=c.config.globalProperties,Z(d,t))return d[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return ps(r,t)?(r[t]=n,!0):s!==ne&&Z(s,t)?(s[t]=n,!0):Z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,props:i,type:o}},l){let c;return!!(n[l]||e!==ne&&l[0]!=="$"&&Z(e,l)||ps(t,l)||Z(i,l)||Z(s,l)||Z(zt,l)||Z(r.config.globalProperties,l)||(c=o.__cssModules)&&c[l])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Zu(){return Oc().slots}function Oc(e){const t=At();return t.setupContext||(t.setupContext=Do(t))}function Ir(e){return K(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let $s=!0;function Pc(e){const t=fo(e),n=e.proxy,s=e.ctx;$s=!1,t.beforeCreate&&Nr(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:u,created:a,beforeMount:d,mounted:m,beforeUpdate:_,updated:b,activated:y,deactivated:$,beforeDestroy:P,beforeUnmount:L,destroyed:p,unmounted:g,render:M,renderTracked:F,renderTriggered:C,errorCaptured:V,serverPrefetch:A,expose:O,inheritAttrs:R,components:w,directives:H,filters:Y}=t;if(u&&Lc(u,s,null),o)for(const X in o){const k=o[X];q(k)&&(s[X]=k.bind(n))}if(r){const X=r.call(n,n);Q(X)&&(e.data=$t(X))}if($s=!0,i)for(const X in i){const k=i[X],ee=q(k)?k.bind(n,n):q(k.get)?k.get.bind(n,n):Xe,mn=!q(k)&&q(k.set)?k.set.bind(n):Xe,dt=ie({get:ee,set:mn});Object.defineProperty(s,X,{enumerable:!0,configurable:!0,get:()=>dt.value,set:ke=>dt.value=ke})}if(l)for(const X in l)uo(l[X],s,n,X);if(c){const X=q(c)?c.call(n):c;Reflect.ownKeys(X).forEach(k=>{rc(k,X[k])})}a&&Nr(a,e,"c");function U(X,k){K(k)?k.forEach(ee=>X(ee.bind(n))):k&&X(k.bind(n))}if(U(Sc,d),U(kt,m),U(Tc,_),U(Ec,b),U(_c,y),U(bc,$),U(Rc,V),U(Ac,F),U(Cc,C),U(io,L),U(ns,g),U(xc,A),K(O))if(O.length){const X=e.exposed||(e.exposed={});O.forEach(k=>{Object.defineProperty(X,k,{get:()=>n[k],set:ee=>n[k]=ee,enumerable:!0})})}else e.exposed||(e.exposed={});M&&e.render===Xe&&(e.render=M),R!=null&&(e.inheritAttrs=R),w&&(e.components=w),H&&(e.directives=H),A&&or(e)}function Lc(e,t,n=Xe){K(e)&&(e=js(e));for(const s in e){const r=e[s];let i;Q(r)?"default"in r?i=St(r.from||s,r.default,!0):i=St(r.from||s):i=St(r),ae(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function Nr(e,t,n){je(K(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function uo(e,t,n,s){let r=s.includes(".")?Ji(n,s):()=>n[s];if(le(e)){const i=t[e];q(i)&&Ne(r,i)}else if(q(e))Ne(r,e.bind(n));else if(Q(e))if(K(e))e.forEach(i=>uo(i,t,n,s));else{const i=q(e.handler)?e.handler.bind(n):t[e.handler];q(i)&&Ne(r,i,e)}}function fo(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(u=>kn(c,u,o,!0)),kn(c,t,o)),Q(t)&&i.set(t,c),c}function kn(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&kn(e,i,n,!0),r&&r.forEach(o=>kn(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=Ic[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Ic={data:Fr,props:Hr,emits:Hr,methods:Xt,computed:Xt,beforeCreate:be,created:be,beforeMount:be,mounted:be,beforeUpdate:be,updated:be,beforeDestroy:be,beforeUnmount:be,destroyed:be,unmounted:be,activated:be,deactivated:be,errorCaptured:be,serverPrefetch:be,components:Xt,directives:Xt,watch:Fc,provide:Fr,inject:Nc};function Fr(e,t){return t?e?function(){return he(q(e)?e.call(this,this):e,q(t)?t.call(this,this):t)}:t:e}function Nc(e,t){return Xt(js(e),js(t))}function js(e){if(K(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ee(t)}Modifiers`]||e[`${ft(t)}Modifiers`];function jc(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||ne;let r=n;const i=t.startsWith("update:"),o=i&&$c(s,t.slice(7));o&&(o.trim&&(r=n.map(a=>le(a)?a.trim():a)),o.number&&(r=n.map(Xs)));let l,c=s[l=Mn(t)]||s[l=Mn(Ee(t))];!c&&i&&(c=s[l=Mn(ft(t))]),c&&je(c,e,6,r);const u=s[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,je(u,e,6,r)}}const Vc=new WeakMap;function po(e,t,n=!1){const s=n?Vc:t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!q(e)){const c=u=>{const a=po(u,t,!0);a&&(l=!0,he(o,a))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(Q(e)&&s.set(e,null),null):(K(i)?i.forEach(c=>o[c]=null):he(o,i),Q(e)&&s.set(e,o),o)}function ss(e,t){return!e||!un(t)?!1:(t=t.slice(2).replace(/Once$/,""),Z(e,t[0].toLowerCase()+t.slice(1))||Z(e,ft(t))||Z(e,t))}function gs(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:c,render:u,renderCache:a,props:d,data:m,setupState:_,ctx:b,inheritAttrs:y}=e,$=jn(e);let P,L;try{if(n.shapeFlag&4){const g=r||s,M=g;P=Ie(u.call(M,g,a,d,_,m,b)),L=l}else{const g=t;P=Ie(g.length>1?g(d,{attrs:l,slots:o,emit:c}):g(d,null)),L=t.props?l:kc(l)}}catch(g){Zt.length=0,hn(g,e,1),P=fe(pe)}let p=P;if(L&&y!==!1){const g=Object.keys(L),{shapeFlag:M}=p;g.length&&M&7&&(i&&g.some(Bn)&&(L=Wc(L,i)),p=at(p,L,!1,!0))}return n.dirs&&(p=at(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&on(p,n.transition),P=p,jn($),P}const kc=e=>{let t;for(const n in e)(n==="class"||n==="style"||un(n))&&((t||(t={}))[n]=e[n]);return t},Wc=(e,t)=>{const n={};for(const s in e)(!Bn(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Uc(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,u=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?Dr(s,o,u):!!o;if(c&8){const a=t.dynamicProps;for(let d=0;dObject.create(yo),_o=e=>Object.getPrototypeOf(e)===yo;function Bc(e,t,n,s=!1){const r={},i=vo();e.propsDefaults=Object.create(null),bo(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:kl(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Kc(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=z(r),[c]=e.propsOptions;let u=!1;if((s||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let d=0;d{c=!0;const[m,_]=wo(d,t,!0);he(o,m),_&&l.push(..._)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!i&&!c)return Q(e)&&s.set(e,Nt),Nt;if(K(i))for(let a=0;ae==="_"||e==="_ctx"||e==="$stable",cr=e=>K(e)?e.map(Ie):[Ie(e)],Gc=(e,t,n)=>{if(t._n)return t;const s=sc((...r)=>cr(t(...r)),n);return s._c=!1,s},So=(e,t,n)=>{const s=e._ctx;for(const r in e){if(lr(r))continue;const i=e[r];if(q(i))t[r]=Gc(r,i,s);else if(i!=null){const o=cr(i);t[r]=()=>o}}},To=(e,t)=>{const n=cr(t);e.slots.default=()=>n},Eo=(e,t,n)=>{for(const s in t)(n||!lr(s))&&(e[s]=t[s])},Xc=(e,t,n)=>{const s=e.slots=vo();if(e.vnode.shapeFlag&32){const r=t._;r?(Eo(s,t,n),n&&Ei(s,"_",r,!0)):So(t,s)}else t&&To(e,t)},Yc=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=ne;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:Eo(r,t,n):(i=!t.$stable,So(t,r)),o=t}else t&&(To(e,t),o={default:1});if(i)for(const l in r)!lr(l)&&o[l]==null&&delete r[l]},we=Oo;function Jc(e){return xo(e)}function zc(e){return xo(e,mc)}function xo(e,t){const n=Xn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:u,setElementText:a,parentNode:d,nextSibling:m,setScopeId:_=Xe,insertStaticContent:b}=e,y=(f,h,v,x=null,S=null,T=null,D=void 0,N=null,I=!!h.dynamicChildren)=>{if(f===h)return;f&&!_t(f,h)&&(x=yn(f),ke(f,S,T,!0),f=null),h.patchFlag===-2&&(I=!1,h.dynamicChildren=null);const{type:E,ref:B,shapeFlag:j}=h;switch(E){case xt:$(f,h,v,x);break;case pe:P(f,h,v,x);break;case Qt:f==null&&L(h,v,x,D);break;case Te:w(f,h,v,x,S,T,D,N,I);break;default:j&1?M(f,h,v,x,S,T,D,N,I):j&6?H(f,h,v,x,S,T,D,N,I):(j&64||j&128)&&E.process(f,h,v,x,S,T,D,N,I,Rt)}B!=null&&S?Dt(B,f&&f.ref,T,h||f,!h):B==null&&f&&f.ref!=null&&Dt(f.ref,null,T,f,!0)},$=(f,h,v,x)=>{if(f==null)s(h.el=l(h.children),v,x);else{const S=h.el=f.el;h.children!==f.children&&u(S,h.children)}},P=(f,h,v,x)=>{f==null?s(h.el=c(h.children||""),v,x):h.el=f.el},L=(f,h,v,x)=>{[f.el,f.anchor]=b(f.children,h,v,x,f.el,f.anchor)},p=({el:f,anchor:h},v,x)=>{let S;for(;f&&f!==h;)S=m(f),s(f,v,x),f=S;s(h,v,x)},g=({el:f,anchor:h})=>{let v;for(;f&&f!==h;)v=m(f),r(f),f=v;r(h)},M=(f,h,v,x,S,T,D,N,I)=>{if(h.type==="svg"?D="svg":h.type==="math"&&(D="mathml"),f==null)F(h,v,x,S,T,D,N,I);else{const E=f.el&&f.el._isVueCE?f.el:null;try{E&&E._beginPatch(),A(f,h,S,T,D,N,I)}finally{E&&E._endPatch()}}},F=(f,h,v,x,S,T,D,N)=>{let I,E;const{props:B,shapeFlag:j,transition:W,dirs:G}=f;if(I=f.el=o(f.type,T,B&&B.is,B),j&8?a(I,f.children):j&16&&V(f.children,I,null,x,S,ms(f,T),D,N),G&&Be(f,null,x,"created"),C(I,f,f.scopeId,D,x),B){for(const te in B)te!=="value"&&!bt(te)&&i(I,te,null,B[te],T,x);"value"in B&&i(I,"value",null,B.value,T),(E=B.onVnodeBeforeMount)&&Le(E,x,f)}G&&Be(f,null,x,"beforeMount");const J=Co(S,W);J&&W.beforeEnter(I),s(I,h,v),((E=B&&B.onVnodeMounted)||J||G)&&we(()=>{try{E&&Le(E,x,f),J&&W.enter(I),G&&Be(f,null,x,"mounted")}finally{}},S)},C=(f,h,v,x,S)=>{if(v&&_(f,v),x)for(let T=0;T{for(let E=I;E{const N=h.el=f.el;let{patchFlag:I,dynamicChildren:E,dirs:B}=h;I|=f.patchFlag&16;const j=f.props||ne,W=h.props||ne;let G;if(v&&pt(v,!1),(G=W.onVnodeBeforeUpdate)&&Le(G,v,h,f),B&&Be(h,f,v,"beforeUpdate"),v&&pt(v,!0),(j.innerHTML&&W.innerHTML==null||j.textContent&&W.textContent==null)&&a(N,""),E?O(f.dynamicChildren,E,N,v,x,ms(h,S),T):D||k(f,h,N,null,v,x,ms(h,S),T,!1),I>0){if(I&16)R(N,j,W,v,S);else if(I&2&&j.class!==W.class&&i(N,"class",null,W.class,S),I&4&&i(N,"style",j.style,W.style,S),I&8){const J=h.dynamicProps;for(let te=0;te{G&&Le(G,v,h,f),B&&Be(h,f,v,"updated")},x)},O=(f,h,v,x,S,T,D)=>{for(let N=0;N{if(h!==v){if(h!==ne)for(const T in h)!bt(T)&&!(T in v)&&i(f,T,h[T],null,S,x);for(const T in v){if(bt(T))continue;const D=v[T],N=h[T];D!==N&&T!=="value"&&i(f,T,N,D,S,x)}"value"in v&&i(f,"value",h.value,v.value,S)}},w=(f,h,v,x,S,T,D,N,I)=>{const E=h.el=f?f.el:l(""),B=h.anchor=f?f.anchor:l("");let{patchFlag:j,dynamicChildren:W,slotScopeIds:G}=h;G&&(N=N?N.concat(G):G),f==null?(s(E,v,x),s(B,v,x),V(h.children||[],v,B,S,T,D,N,I)):j>0&&j&64&&W&&f.dynamicChildren&&f.dynamicChildren.length===W.length?(O(f.dynamicChildren,W,v,S,T,D,N),(h.key!=null||S&&h===S.subTree)&&ar(f,h,!0)):k(f,h,v,B,S,T,D,N,I)},H=(f,h,v,x,S,T,D,N,I)=>{h.slotScopeIds=N,f==null?h.shapeFlag&512?S.ctx.activate(h,v,x,D,I):Y(h,v,x,S,T,D,I):oe(f,h,I)},Y=(f,h,v,x,S,T,D)=>{const N=f.component=ia(f,x,S);if(pn(f)&&(N.ctx.renderer=Rt),oa(N,!1,D),N.asyncDep){if(S&&S.registerDep(N,U,D),!f.el){const I=N.subTree=fe(pe);P(null,I,h,v),f.placeholder=I.el}}else U(N,f,h,v,S,T,D)},oe=(f,h,v)=>{const x=h.component=f.component;if(Uc(f,h,v))if(x.asyncDep&&!x.asyncResolved){X(x,h,v);return}else x.next=h,x.update();else h.el=f.el,x.vnode=h},U=(f,h,v,x,S,T,D)=>{const N=()=>{if(f.isMounted){let{next:j,bu:W,u:G,parent:J,vnode:te}=f;{const Ce=Ao(f);if(Ce){j&&(j.el=te.el,X(f,j,D)),Ce.asyncDep.then(()=>{we(()=>{f.isUnmounted||E()},S)});return}}let se=j,ue;pt(f,!1),j?(j.el=te.el,X(f,j,D)):j=te,W&&On(W),(ue=j.props&&j.props.onVnodeBeforeUpdate)&&Le(ue,J,j,te),pt(f,!0);const de=gs(f),Fe=f.subTree;f.subTree=de,y(Fe,de,d(Fe.el),yn(Fe),f,S,T),j.el=de.el,se===null&&mo(f,de.el),G&&we(G,S),(ue=j.props&&j.props.onVnodeUpdated)&&we(()=>Le(ue,J,j,te),S)}else{let j;const{el:W,props:G}=h,{bm:J,m:te,parent:se,root:ue,type:de}=f,Fe=Tt(h);if(pt(f,!1),J&&On(J),!Fe&&(j=G&&G.onVnodeBeforeMount)&&Le(j,se,h),pt(f,!0),W&&cs){const Ce=()=>{f.subTree=gs(f),cs(W,f.subTree,f,S,null)};Fe&&de.__asyncHydrate?de.__asyncHydrate(W,f,Ce):Ce()}else{ue.ce&&ue.ce._hasShadowRoot()&&ue.ce._injectChildStyle(de,f.parent?f.parent.type:void 0);const Ce=f.subTree=gs(f);y(null,Ce,v,x,f,S,T),h.el=Ce.el}if(te&&we(te,S),!Fe&&(j=G&&G.onVnodeMounted)){const Ce=h;we(()=>Le(j,se,Ce),S)}(h.shapeFlag&256||se&&Tt(se.vnode)&&se.vnode.shapeFlag&256)&&f.a&&we(f.a,S),f.isMounted=!0,h=v=x=null}};f.scope.on();const I=f.effect=new Mi(N);f.scope.off();const E=f.update=I.run.bind(I),B=f.job=I.runIfDirty.bind(I);B.i=f,B.id=f.uid,I.scheduler=()=>sr(B),pt(f,!0),E()},X=(f,h,v)=>{h.component=f;const x=f.vnode.props;f.vnode=h,f.next=null,Kc(f,h.props,x,v),Yc(f,h.children,v),tt(),Er(f),nt()},k=(f,h,v,x,S,T,D,N,I=!1)=>{const E=f&&f.children,B=f?f.shapeFlag:0,j=h.children,{patchFlag:W,shapeFlag:G}=h;if(W>0){if(W&128){mn(E,j,v,x,S,T,D,N,I);return}else if(W&256){ee(E,j,v,x,S,T,D,N,I);return}}G&8?(B&16&&Wt(E,S,T),j!==E&&a(v,j)):B&16?G&16?mn(E,j,v,x,S,T,D,N,I):Wt(E,S,T,!0):(B&8&&a(v,""),G&16&&V(j,v,x,S,T,D,N,I))},ee=(f,h,v,x,S,T,D,N,I)=>{f=f||Nt,h=h||Nt;const E=f.length,B=h.length,j=Math.min(E,B);let W;for(W=0;WB?Wt(f,S,T,!0,!1,j):V(h,v,x,S,T,D,N,I,j)},mn=(f,h,v,x,S,T,D,N,I)=>{let E=0;const B=h.length;let j=f.length-1,W=B-1;for(;E<=j&&E<=W;){const G=f[E],J=h[E]=I?Qe(h[E]):Ie(h[E]);if(_t(G,J))y(G,J,v,null,S,T,D,N,I);else break;E++}for(;E<=j&&E<=W;){const G=f[j],J=h[W]=I?Qe(h[W]):Ie(h[W]);if(_t(G,J))y(G,J,v,null,S,T,D,N,I);else break;j--,W--}if(E>j){if(E<=W){const G=W+1,J=GW)for(;E<=j;)ke(f[E],S,T,!0),E++;else{const G=E,J=E,te=new Map;for(E=J;E<=W;E++){const Ae=h[E]=I?Qe(h[E]):Ie(h[E]);Ae.key!=null&&te.set(Ae.key,E)}let se,ue=0;const de=W-J+1;let Fe=!1,Ce=0;const Ut=new Array(de);for(E=0;E=de){ke(Ae,S,T,!0);continue}let We;if(Ae.key!=null)We=te.get(Ae.key);else for(se=J;se<=W;se++)if(Ut[se-J]===0&&_t(Ae,h[se])){We=se;break}We===void 0?ke(Ae,S,T,!0):(Ut[We-J]=E+1,We>=Ce?Ce=We:Fe=!0,y(Ae,h[We],v,null,S,T,D,N,I),ue++)}const yr=Fe?Qc(Ut):Nt;for(se=yr.length-1,E=de-1;E>=0;E--){const Ae=J+E,We=h[Ae],vr=h[Ae+1],_r=Ae+1{const{el:T,type:D,transition:N,children:I,shapeFlag:E}=f;if(E&6){dt(f.component.subTree,h,v,x);return}if(E&128){f.suspense.move(h,v,x);return}if(E&64){D.move(f,h,v,Rt);return}if(D===Te){s(T,h,v);for(let j=0;jN.enter(T),S);else{const{leave:j,delayLeave:W,afterLeave:G}=N,J=()=>{f.ctx.isUnmounted?r(T):s(T,h,v)},te=()=>{T._isLeaving&&T[Ke](!0),j(T,()=>{J(),G&&G()})};W?W(T,J,te):te()}else s(T,h,v)},ke=(f,h,v,x=!1,S=!1)=>{const{type:T,props:D,ref:N,children:I,dynamicChildren:E,shapeFlag:B,patchFlag:j,dirs:W,cacheIndex:G,memo:J}=f;if(j===-2&&(S=!1),N!=null&&(tt(),Dt(N,null,v,f,!0),nt()),G!=null&&(h.renderCache[G]=void 0),B&256){h.ctx.deactivate(f);return}const te=B&1&&W,se=!Tt(f);let ue;if(se&&(ue=D&&D.onVnodeBeforeUnmount)&&Le(ue,h,f),B&6)ol(f.component,v,x);else{if(B&128){f.suspense.unmount(v,x);return}te&&Be(f,null,h,"beforeUnmount"),B&64?f.type.remove(f,h,v,Rt,x):E&&!E.hasOnce&&(T!==Te||j>0&&j&64)?Wt(E,h,v,!1,!0):(T===Te&&j&384||!S&&B&16)&&Wt(I,h,v),x&&gr(f)}const de=J!=null&&G==null;(se&&(ue=D&&D.onVnodeUnmounted)||te||de)&&we(()=>{ue&&Le(ue,h,f),te&&Be(f,null,h,"unmounted"),de&&(f.el=null)},v)},gr=f=>{const{type:h,el:v,anchor:x,transition:S}=f;if(h===Te){il(v,x);return}if(h===Qt){g(f);return}const T=()=>{r(v),S&&!S.persisted&&S.afterLeave&&S.afterLeave()};if(f.shapeFlag&1&&S&&!S.persisted){const{leave:D,delayLeave:N}=S,I=()=>D(v,T);N?N(f.el,T,I):I()}else T()},il=(f,h)=>{let v;for(;f!==h;)v=m(f),r(f),f=v;r(h)},ol=(f,h,v)=>{const{bum:x,scope:S,job:T,subTree:D,um:N,m:I,a:E}=f;jr(I),jr(E),x&&On(x),S.stop(),T&&(T.flags|=8,ke(D,f,h,v)),N&&we(N,h),we(()=>{f.isUnmounted=!0},h)},Wt=(f,h,v,x=!1,S=!1,T=0)=>{for(let D=T;D{if(f.shapeFlag&6)return yn(f.component.subTree);if(f.shapeFlag&128)return f.suspense.next();const h=m(f.anchor||f.el),v=h&&h[zi];return v?m(v):h};let os=!1;const mr=(f,h,v)=>{let x;f==null?h._vnode&&(ke(h._vnode,null,null,!0),x=h._vnode.component):y(h._vnode||null,f,h,null,null,null,v),h._vnode=f,os||(os=!0,Er(x),$n(),os=!1)},Rt={p:y,um:ke,m:dt,r:gr,mt:Y,mc:V,pc:k,pbc:O,n:yn,o:e};let ls,cs;return t&&([ls,cs]=t(Rt)),{render:mr,hydrate:ls,createApp:Dc(mr,ls)}}function ms({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function pt({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Co(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function ar(e,t,n=!1){const s=e.children,r=t.children;if(K(s)&&K(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function Ao(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Ao(t)}function jr(e){if(e)for(let t=0;te.__isSuspense;function Oo(e,t){t&&t.pendingBranch?K(e)?t.effects.push(...e):t.effects.push(e):nc(e)}const Te=Symbol.for("v-fgt"),xt=Symbol.for("v-txt"),pe=Symbol.for("v-cmt"),Qt=Symbol.for("v-stc"),Zt=[];let Re=null;function ks(e=!1){Zt.push(Re=e?null:[])}function Zc(){Zt.pop(),Re=Zt[Zt.length-1]||null}let ln=1;function Wn(e,t=!1){ln+=e,e<0&&Re&&t&&(Re.hasOnce=!0)}function Po(e){return e.dynamicChildren=ln>0?Re||Nt:null,Zc(),ln>0&&Re&&Re.push(e),e}function ef(e,t,n,s,r,i){return Po(Io(e,t,n,s,r,i,!0))}function Ws(e,t,n,s,r){return Po(fe(e,t,n,s,r,!0))}function cn(e){return e?e.__v_isVNode===!0:!1}function _t(e,t){return e.type===t.type&&e.key===t.key}const Lo=({key:e})=>e??null,Ln=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?le(e)||ae(e)||q(e)?{i:me,r:e,k:t,f:!!n}:e:null);function Io(e,t=null,n=null,s=0,r=null,i=e===Te?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Lo(t),ref:t&&Ln(t),scopeId:Xi,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:me};return l?(ur(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=le(n)?8:16),ln>0&&!o&&Re&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Re.push(c),c}const fe=ea;function ea(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===lo)&&(e=pe),cn(e)){const l=at(e,t,!0);return n&&ur(l,n),ln>0&&!i&&Re&&(l.shapeFlag&6?Re[Re.indexOf(e)]=l:Re.push(l)),l.patchFlag=-2,l}if(ua(e)&&(e=e.__vccOpts),t){t=ta(t);let{class:l,style:c}=t;l&&!le(l)&&(t.class=Js(l)),Q(c)&&(zn(c)&&!K(c)&&(c=he({},c)),t.style=Ys(c))}const o=le(e)?1:Mo(e)?128:Qi(e)?64:Q(e)?4:q(e)?2:0;return Io(e,t,n,s,r,o,i,!0)}function ta(e){return e?zn(e)||_o(e)?he({},e):e:null}function at(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:c}=e,u=t?na(r||{},t):r,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&Lo(u),ref:t&&t.ref?n&&i?K(i)?i.concat(Ln(t)):[i,Ln(t)]:Ln(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Te?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&at(e.ssContent),ssFallback:e.ssFallback&&at(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&s&&on(a,c.clone(a)),a}function No(e=" ",t=0){return fe(xt,null,e,t)}function tf(e,t){const n=fe(Qt,null,e);return n.staticCount=t,n}function nf(e="",t=!1){return t?(ks(),Ws(pe,null,e)):fe(pe,null,e)}function Ie(e){return e==null||typeof e=="boolean"?fe(pe):K(e)?fe(Te,null,e.slice()):cn(e)?Qe(e):fe(xt,null,String(e))}function Qe(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:at(e)}function ur(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(K(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),ur(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!_o(t)?t._ctx=me:r===3&&me&&(me.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else q(t)?(t={default:t,_ctx:me},n=32):(t=String(t),s&64?(n=16,t=[No(t)]):n=8);e.children=t,e.shapeFlag|=n}function na(...e){const t={};for(let n=0;nge||me;let Un,Us;{const e=Xn(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};Un=t("__VUE_INSTANCE_SETTERS__",n=>ge=n),Us=t("__VUE_SSR_SETTERS__",n=>Vt=n)}const gn=e=>{const t=ge;return Un(e),e.scope.on(),()=>{e.scope.off(),Un(t)}},Vr=()=>{ge&&ge.scope.off(),Un(null)};function Fo(e){return e.vnode.shapeFlag&4}let Vt=!1;function oa(e,t=!1,n=!1){t&&Us(t);const{props:s,children:r}=e.vnode,i=Fo(e);Bc(e,s,i,t),Xc(e,r,n||t);const o=i?la(e,t):void 0;return t&&Us(!1),o}function la(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Mc);const{setup:s}=n;if(s){tt();const r=e.setupContext=s.length>1?Do(e):null,i=gn(e),o=dn(s,e,0,[e.props,r]),l=wi(o);if(nt(),i(),(l||e.sp)&&!Tt(e)&&or(e),l){if(o.then(Vr,Vr),t)return o.then(c=>{kr(e,c)}).catch(c=>{hn(c,e,0)});e.asyncDep=o}else kr(e,o)}else Ho(e)}function kr(e,t,n){q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Q(t)&&(e.setupState=Bi(t)),Ho(e)}function Ho(e,t,n){const s=e.type;e.render||(e.render=s.render||Xe);{const r=gn(e);tt();try{Pc(e)}finally{nt(),r()}}}const ca={get(e,t){return _e(e,"get",""),e[t]}};function Do(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,ca),slots:e.slots,emit:e.emit,expose:t}}function rs(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Bi(Pn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in zt)return zt[n](e)},has(t,n){return n in t||n in zt}})):e.proxy}function aa(e,t=!0){return q(e)?e.displayName||e.name:e.name||t&&e.__name}function ua(e){return q(e)&&"__vccOpts"in e}const ie=(e,t)=>zl(e,t,Vt);function Bs(e,t,n){try{Wn(-1);const s=arguments.length;return s===2?Q(t)&&!K(t)?cn(t)?fe(e,null,[t]):fe(e,t):fe(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&cn(n)&&(n=[n]),fe(e,t,n))}finally{Wn(1)}}const fa="3.5.32";/** +* @vue/runtime-dom v3.5.32 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Ks;const Wr=typeof window<"u"&&window.trustedTypes;if(Wr)try{Ks=Wr.createPolicy("vue",{createHTML:e=>e})}catch{}const $o=Ks?e=>Ks.createHTML(e):e=>e,da="http://www.w3.org/2000/svg",ha="http://www.w3.org/1998/Math/MathML",ze=typeof document<"u"?document:null,Ur=ze&&ze.createElement("template"),pa={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?ze.createElementNS(da,e):t==="mathml"?ze.createElementNS(ha,e):n?ze.createElement(e,{is:n}):ze.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>ze.createTextNode(e),createComment:e=>ze.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ze.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{Ur.innerHTML=$o(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=Ur.content;if(s==="svg"||s==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},ot="transition",qt="animation",an=Symbol("_vtc"),jo={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},ga=he({},Zi,jo),ma=e=>(e.displayName="Transition",e.props=ga,e),sf=ma((e,{slots:t})=>Bs(hc,ya(e),t)),gt=(e,t=[])=>{K(e)?e.forEach(n=>n(...t)):e&&e(...t)},Br=e=>e?K(e)?e.some(t=>t.length>1):e.length>1:!1;function ya(e){const t={};for(const w in e)w in jo||(t[w]=e[w]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:u=o,appearToClass:a=l,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:m=`${n}-leave-active`,leaveToClass:_=`${n}-leave-to`}=e,b=va(r),y=b&&b[0],$=b&&b[1],{onBeforeEnter:P,onEnter:L,onEnterCancelled:p,onLeave:g,onLeaveCancelled:M,onBeforeAppear:F=P,onAppear:C=L,onAppearCancelled:V=p}=t,A=(w,H,Y,oe)=>{w._enterCancelled=oe,mt(w,H?a:l),mt(w,H?u:o),Y&&Y()},O=(w,H)=>{w._isLeaving=!1,mt(w,d),mt(w,_),mt(w,m),H&&H()},R=w=>(H,Y)=>{const oe=w?C:L,U=()=>A(H,w,Y);gt(oe,[H,U]),Kr(()=>{mt(H,w?c:i),Je(H,w?a:l),Br(oe)||qr(H,s,y,U)})};return he(t,{onBeforeEnter(w){gt(P,[w]),Je(w,i),Je(w,o)},onBeforeAppear(w){gt(F,[w]),Je(w,c),Je(w,u)},onEnter:R(!1),onAppear:R(!0),onLeave(w,H){w._isLeaving=!0;const Y=()=>O(w,H);Je(w,d),w._enterCancelled?(Je(w,m),Yr(w)):(Yr(w),Je(w,m)),Kr(()=>{w._isLeaving&&(mt(w,d),Je(w,_),Br(g)||qr(w,s,$,Y))}),gt(g,[w,Y])},onEnterCancelled(w){A(w,!1,void 0,!0),gt(p,[w])},onAppearCancelled(w){A(w,!0,void 0,!0),gt(V,[w])},onLeaveCancelled(w){O(w),gt(M,[w])}})}function va(e){if(e==null)return null;if(Q(e))return[ys(e.enter),ys(e.leave)];{const t=ys(e);return[t,t]}}function ys(e){return fl(e)}function Je(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[an]||(e[an]=new Set)).add(t)}function mt(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[an];n&&(n.delete(t),n.size||(e[an]=void 0))}function Kr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let _a=0;function qr(e,t,n,s){const r=e._endId=++_a,i=()=>{r===e._endId&&s()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=ba(e,t);if(!o)return s();const u=o+"end";let a=0;const d=()=>{e.removeEventListener(u,m),i()},m=_=>{_.target===e&&++a>=c&&d()};setTimeout(()=>{a(n[b]||"").split(", "),r=s(`${ot}Delay`),i=s(`${ot}Duration`),o=Gr(r,i),l=s(`${qt}Delay`),c=s(`${qt}Duration`),u=Gr(l,c);let a=null,d=0,m=0;t===ot?o>0&&(a=ot,d=o,m=i.length):t===qt?u>0&&(a=qt,d=u,m=c.length):(d=Math.max(o,u),a=d>0?o>u?ot:qt:null,m=a?a===ot?i.length:c.length:0);const _=a===ot&&/\b(?:transform|all)(?:,|$)/.test(s(`${ot}Property`).toString());return{type:a,timeout:d,propCount:m,hasTransform:_}}function Gr(e,t){for(;e.lengthXr(n)+Xr(e[s])))}function Xr(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Yr(e){return(e?e.ownerDocument:document).body.offsetHeight}function wa(e,t,n){const s=e[an];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Jr=Symbol("_vod"),Sa=Symbol("_vsh"),Ta=Symbol(""),Ea=/(?:^|;)\s*display\s*:/;function xa(e,t,n){const s=e.style,r=le(n);let i=!1;if(n&&!r){if(t)if(le(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&In(s,l,"")}else for(const o in t)n[o]==null&&In(s,o,"");for(const o in n)o==="display"&&(i=!0),In(s,o,n[o])}else if(r){if(t!==n){const o=s[Ta];o&&(n+=";"+o),s.cssText=n,i=Ea.test(n)}}else t&&e.removeAttribute("style");Jr in e&&(e[Jr]=i?s.display:"",e[Sa]&&(s.display="none"))}const zr=/\s*!important$/;function In(e,t,n){if(K(n))n.forEach(s=>In(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Ca(e,t);zr.test(n)?e.setProperty(ft(s),n.replace(zr,""),"important"):e[s]=n}}const Qr=["Webkit","Moz","ms"],vs={};function Ca(e,t){const n=vs[t];if(n)return n;let s=Ee(t);if(s!=="filter"&&s in e)return vs[t]=s;s=Gn(s);for(let r=0;r_s||(Oa.then(()=>_s=0),_s=Date.now());function La(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;je(Ia(s,n.value),t,5,[s])};return n.value=e,n.attached=Pa(),n}function Ia(e,t){if(K(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const ri=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Na=(e,t,n,s,r,i)=>{const o=r==="svg";t==="class"?wa(e,s,o):t==="style"?xa(e,n,s):un(t)?Bn(t)||Ra(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Fa(e,t,s,o))?(ti(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&ei(e,t,s,o,i,t!=="value")):e._isVueCE&&(Ha(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!le(s)))?ti(e,Ee(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),ei(e,t,s,o))};function Fa(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&ri(t)&&q(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return ri(t)&&le(n)?!1:t in e}function Ha(e,t){const n=e._def.props;if(!n)return!1;const s=Ee(t);return Array.isArray(n)?n.some(r=>Ee(r)===s):Object.keys(n).some(r=>Ee(r)===s)}const ii=e=>{const t=e.props["onUpdate:modelValue"]||!1;return K(t)?n=>On(t,n):t};function Da(e){e.target.composing=!0}function oi(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const bs=Symbol("_assign");function li(e,t,n){return t&&(e=e.trim()),n&&(e=Xs(e)),e}const rf={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e[bs]=ii(r);const i=s||r.props&&r.props.type==="number";Lt(e,t?"change":"input",o=>{o.target.composing||e[bs](li(e.value,n,i))}),(n||i)&&Lt(e,"change",()=>{e.value=li(e.value,n,i)}),t||(Lt(e,"compositionstart",Da),Lt(e,"compositionend",oi),Lt(e,"change",oi))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:r,number:i}},o){if(e[bs]=ii(o),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?Xs(e.value):e.value,c=t??"";if(l===c)return;const u=e.getRootNode();(u instanceof Document||u instanceof ShadowRoot)&&u.activeElement===e&&e.type!=="range"&&(s&&t===n||r&&e.value.trim()===c)||(e.value=c)}},$a=["ctrl","shift","alt","meta"],ja={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>$a.some(n=>e[`${n}Key`]&&!t.includes(n))},of=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(r,...i)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=r=>{if(!("key"in r))return;const i=ft(r.key);if(t.some(o=>o===i||Va[o]===i))return e(r)})},Vo=he({patchProp:Na},pa);let en,ci=!1;function ka(){return en||(en=Jc(Vo))}function Wa(){return en=ci?en:zc(Vo),ci=!0,en}const cf=(...e)=>{const t=ka().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Wo(s);if(!r)return;const i=t._component;!q(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const o=n(r,!1,ko(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t},af=(...e)=>{const t=Wa().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Wo(s);if(r)return n(r,!0,ko(r))},t};function ko(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Wo(e){return le(e)?document.querySelector(e):e}const Ua=window.__VP_SITE_DATA__;function Uo(e){return Ri()?(wl(e),!0):!1}const ws=new WeakMap,Ba=(...e)=>{var t;const n=e[0],s=(t=At())==null?void 0:t.proxy;if(s==null&&!Yi())throw new Error("injectLocal must be called in setup");return s&&ws.has(s)&&n in ws.get(s)?ws.get(s)[n]:St(...e)},Bo=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const uf=e=>e!=null,Ka=Object.prototype.toString,qa=e=>Ka.call(e)==="[object Object]",ut=()=>{},ai=Ga();function Ga(){var e,t;return Bo&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function fr(e,t){function n(...s){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,s),{fn:t,thisArg:this,args:s})).then(r).catch(i)})}return n}const Ko=e=>e();function qo(e,t={}){let n,s,r=ut;const i=c=>{clearTimeout(c),r(),r=ut};let o;return c=>{const u=ce(e),a=ce(t.maxWait);return n&&i(n),u<=0||a!==void 0&&a<=0?(s&&(i(s),s=null),Promise.resolve(c())):new Promise((d,m)=>{r=t.rejectOnCancel?m:d,o=c,a&&!s&&(s=setTimeout(()=>{n&&i(n),s=null,d(o())},a)),n=setTimeout(()=>{s&&i(s),s=null,d(c())},u)})}}function Xa(...e){let t=0,n,s=!0,r=ut,i,o,l,c,u;!ae(e[0])&&typeof e[0]=="object"?{delay:o,trailing:l=!0,leading:c=!0,rejectOnCancel:u=!1}=e[0]:[o,l=!0,c=!0,u=!1]=e;const a=()=>{n&&(clearTimeout(n),n=void 0,r(),r=ut)};return m=>{const _=ce(o),b=Date.now()-t,y=()=>i=m();return a(),_<=0?(t=Date.now(),y()):(b>_&&(c||!s)?(t=Date.now(),y()):l&&(i=new Promise(($,P)=>{r=u?P:$,n=setTimeout(()=>{t=Date.now(),s=!0,$(y()),a()},Math.max(0,_-b))})),!c&&!n&&(n=setTimeout(()=>s=!0,_)),s=!1,i)}}function Ya(e=Ko,t={}){const{initialState:n="active"}=t,s=dr(n==="active");function r(){s.value=!1}function i(){s.value=!0}return{isActive:sn(s),pause:r,resume:i,eventFilter:(...l)=>{s.value&&e(...l)}}}function ui(e){return e.endsWith("rem")?Number.parseFloat(e)*16:Number.parseFloat(e)}function Ja(e){return At()}function Ss(e){return Array.isArray(e)?e:[e]}function dr(...e){if(e.length!==1)return Xl(...e);const t=e[0];return typeof t=="function"?sn(Kl(()=>({get:t,set:ut}))):De(t)}function za(e,t=200,n={}){return fr(qo(t,n),e)}function Qa(e,t=200,n=!1,s=!0,r=!1){return fr(Xa(t,n,s,r),e)}function Go(e,t,n={}){const{eventFilter:s=Ko,...r}=n;return Ne(e,fr(s,t),r)}function Za(e,t,n={}){const{eventFilter:s,initialState:r="active",...i}=n,{eventFilter:o,pause:l,resume:c,isActive:u}=Ya(s,{initialState:r});return{stop:Go(e,t,{...i,eventFilter:o}),pause:l,resume:c,isActive:u}}function is(e,t=!0,n){Ja()?kt(e,n):t?e():Zn(e)}function ff(e,t,n={}){const{debounce:s=0,maxWait:r=void 0,...i}=n;return Go(e,t,{...i,eventFilter:qo(s,{maxWait:r})})}function eu(e,t,n){return Ne(e,t,{...n,immediate:!0})}function df(e,t,n){let s;ae(n)?s={evaluating:n}:s={};const{lazy:r=!1,evaluating:i=void 0,shallow:o=!0,onError:l=ut}=s,c=xe(!r),u=o?xe(t):De(t);let a=0;return rr(async d=>{if(!c.value)return;a++;const m=a;let _=!1;i&&Promise.resolve().then(()=>{i.value=!0});try{const b=await e(y=>{d(()=>{i&&(i.value=!1),_||y()})});m===a&&(u.value=b)}catch(b){l(b)}finally{i&&m===a&&(i.value=!1),_=!0}}),r?ie(()=>(c.value=!0,u.value)):u}const Ve=Bo?window:void 0;function hr(e){var t;const n=ce(e);return(t=n==null?void 0:n.$el)!=null?t:n}function rt(...e){const t=[],n=()=>{t.forEach(l=>l()),t.length=0},s=(l,c,u,a)=>(l.addEventListener(c,u,a),()=>l.removeEventListener(c,u,a)),r=ie(()=>{const l=Ss(ce(e[0])).filter(c=>c!=null);return l.every(c=>typeof c!="string")?l:void 0}),i=eu(()=>{var l,c;return[(c=(l=r.value)==null?void 0:l.map(u=>hr(u)))!=null?c:[Ve].filter(u=>u!=null),Ss(ce(r.value?e[1]:e[0])),Ss(Qn(r.value?e[2]:e[1])),ce(r.value?e[3]:e[2])]},([l,c,u,a])=>{if(n(),!(l!=null&&l.length)||!(c!=null&&c.length)||!(u!=null&&u.length))return;const d=qa(a)?{...a}:a;t.push(...l.flatMap(m=>c.flatMap(_=>u.map(b=>s(m,_,b,d)))))},{flush:"post"}),o=()=>{i(),n()};return Uo(n),o}function tu(){const e=xe(!1),t=At();return t&&kt(()=>{e.value=!0},t),e}function nu(e){const t=tu();return ie(()=>(t.value,!!e()))}function su(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function hf(...e){let t,n,s={};e.length===3?(t=e[0],n=e[1],s=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],s=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:r=Ve,eventName:i="keydown",passive:o=!1,dedupe:l=!1}=s,c=su(t);return rt(r,i,a=>{a.repeat&&ce(l)||c(a)&&n(a)},o)}const ru=Symbol("vueuse-ssr-width");function iu(){const e=Yi()?Ba(ru,null):null;return typeof e=="number"?e:void 0}function Xo(e,t={}){const{window:n=Ve,ssrWidth:s=iu()}=t,r=nu(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function"),i=xe(typeof s=="number"),o=xe(),l=xe(!1),c=u=>{l.value=u.matches};return rr(()=>{if(i.value){i.value=!r.value;const u=ce(e).split(",");l.value=u.some(a=>{const d=a.includes("not all"),m=a.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),_=a.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/);let b=!!(m||_);return m&&b&&(b=s>=ui(m[1])),_&&b&&(b=s<=ui(_[1])),d?!b:b});return}r.value&&(o.value=n.matchMedia(ce(e)),l.value=o.value.matches)}),rt(o,"change",c,{passive:!0}),ie(()=>l.value)}const xn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Cn="__vueuse_ssr_handlers__",ou=lu();function lu(){return Cn in xn||(xn[Cn]=xn[Cn]||{}),xn[Cn]}function Yo(e,t){return ou[e]||t}function Jo(e){return Xo("(prefers-color-scheme: dark)",e)}function cu(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const au={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},fi="vueuse-storage";function pr(e,t,n,s={}){var r;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:u=!1,shallow:a,window:d=Ve,eventFilter:m,onError:_=R=>{console.error(R)},initOnMounted:b}=s,y=(a?xe:De)(typeof t=="function"?t():t),$=ie(()=>ce(e));if(!n)try{n=Yo("getDefaultStorage",()=>{var R;return(R=Ve)==null?void 0:R.localStorage})()}catch(R){_(R)}if(!n)return y;const P=ce(t),L=cu(P),p=(r=s.serializer)!=null?r:au[L],{pause:g,resume:M}=Za(y,()=>C(y.value),{flush:i,deep:o,eventFilter:m});Ne($,()=>A(),{flush:i}),d&&l&&is(()=>{n instanceof Storage?rt(d,"storage",A,{passive:!0}):rt(d,fi,O),b&&A()}),b||A();function F(R,w){if(d){const H={key:$.value,oldValue:R,newValue:w,storageArea:n};d.dispatchEvent(n instanceof Storage?new StorageEvent("storage",H):new CustomEvent(fi,{detail:H}))}}function C(R){try{const w=n.getItem($.value);if(R==null)F(w,null),n.removeItem($.value);else{const H=p.write(R);w!==H&&(n.setItem($.value,H),F(w,H))}}catch(w){_(w)}}function V(R){const w=R?R.newValue:n.getItem($.value);if(w==null)return c&&P!=null&&n.setItem($.value,p.write(P)),P;if(!R&&u){const H=p.read(w);return typeof u=="function"?u(H,P):L==="object"&&!Array.isArray(H)?{...P,...H}:H}else return typeof w!="string"?w:p.read(w)}function A(R){if(!(R&&R.storageArea!==n)){if(R&&R.key==null){y.value=P;return}if(!(R&&R.key!==$.value)){g();try{(R==null?void 0:R.newValue)!==p.write(y.value)&&(y.value=V(R))}catch(w){_(w)}finally{R?Zn(M):M()}}}}function O(R){A(R.detail)}return y}const uu="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function fu(e={}){const{selector:t="html",attribute:n="class",initialValue:s="auto",window:r=Ve,storage:i,storageKey:o="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:u,disableTransition:a=!0}=e,d={auto:"",light:"light",dark:"dark",...e.modes||{}},m=Jo({window:r}),_=ie(()=>m.value?"dark":"light"),b=c||(o==null?dr(s):pr(o,s,i,{window:r,listenToStorageChanges:l})),y=ie(()=>b.value==="auto"?_.value:b.value),$=Yo("updateHTMLAttrs",(g,M,F)=>{const C=typeof g=="string"?r==null?void 0:r.document.querySelector(g):hr(g);if(!C)return;const V=new Set,A=new Set;let O=null;if(M==="class"){const w=F.split(/\s/g);Object.values(d).flatMap(H=>(H||"").split(/\s/g)).filter(Boolean).forEach(H=>{w.includes(H)?V.add(H):A.add(H)})}else O={key:M,value:F};if(V.size===0&&A.size===0&&O===null)return;let R;a&&(R=r.document.createElement("style"),R.appendChild(document.createTextNode(uu)),r.document.head.appendChild(R));for(const w of V)C.classList.add(w);for(const w of A)C.classList.remove(w);O&&C.setAttribute(O.key,O.value),a&&(r.getComputedStyle(R).opacity,document.head.removeChild(R))});function P(g){var M;$(t,n,(M=d[g])!=null?M:g)}function L(g){e.onChanged?e.onChanged(g,P):P(g)}Ne(y,L,{flush:"post",immediate:!0}),is(()=>L(y.value));const p=ie({get(){return u?b.value:y.value},set(g){b.value=g}});return Object.assign(p,{store:b,system:_,state:y})}function du(e={}){const{valueDark:t="dark",valueLight:n=""}=e,s=fu({...e,onChanged:(o,l)=>{var c;e.onChanged?(c=e.onChanged)==null||c.call(e,o==="dark",l,o):l(o)},modes:{dark:t,light:n}}),r=ie(()=>s.system.value);return ie({get(){return s.value==="dark"},set(o){const l=o?"dark":"light";r.value===l?s.value="auto":s.value=l}})}function Ts(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}const di=1;function hu(e,t={}){const{throttle:n=0,idle:s=200,onStop:r=ut,onScroll:i=ut,offset:o={left:0,right:0,top:0,bottom:0},eventListenerOptions:l={capture:!1,passive:!0},behavior:c="auto",window:u=Ve,onError:a=C=>{console.error(C)}}=t,d=xe(0),m=xe(0),_=ie({get(){return d.value},set(C){y(C,void 0)}}),b=ie({get(){return m.value},set(C){y(void 0,C)}});function y(C,V){var A,O,R,w;if(!u)return;const H=ce(e);if(!H)return;(R=H instanceof Document?u.document.body:H)==null||R.scrollTo({top:(A=ce(V))!=null?A:b.value,left:(O=ce(C))!=null?O:_.value,behavior:ce(c)});const Y=((w=H==null?void 0:H.document)==null?void 0:w.documentElement)||(H==null?void 0:H.documentElement)||H;_!=null&&(d.value=Y.scrollLeft),b!=null&&(m.value=Y.scrollTop)}const $=xe(!1),P=$t({left:!0,right:!1,top:!0,bottom:!1}),L=$t({left:!1,right:!1,top:!1,bottom:!1}),p=C=>{$.value&&($.value=!1,L.left=!1,L.right=!1,L.top=!1,L.bottom=!1,r(C))},g=za(p,n+s),M=C=>{var V;if(!u)return;const A=((V=C==null?void 0:C.document)==null?void 0:V.documentElement)||(C==null?void 0:C.documentElement)||hr(C),{display:O,flexDirection:R,direction:w}=getComputedStyle(A),H=w==="rtl"?-1:1,Y=A.scrollLeft;L.left=Yd.value;const oe=Math.abs(Y*H)<=(o.left||0),U=Math.abs(Y*H)+A.clientWidth>=A.scrollWidth-(o.right||0)-di;O==="flex"&&R==="row-reverse"?(P.left=U,P.right=oe):(P.left=oe,P.right=U),d.value=Y;let X=A.scrollTop;C===u.document&&!X&&(X=u.document.body.scrollTop),L.top=Xm.value;const k=Math.abs(X)<=(o.top||0),ee=Math.abs(X)+A.clientHeight>=A.scrollHeight-(o.bottom||0)-di;O==="flex"&&R==="column-reverse"?(P.top=ee,P.bottom=k):(P.top=k,P.bottom=ee),m.value=X},F=C=>{var V;if(!u)return;const A=(V=C.target.documentElement)!=null?V:C.target;M(A),$.value=!0,g(C),i(C)};return rt(e,"scroll",n?Qa(F,n,!0,!1):F,l),is(()=>{try{const C=ce(e);if(!C)return;M(C)}catch(C){a(C)}}),rt(e,"scrollend",p,l),{x:_,y:b,isScrolling:$,arrivedState:P,directions:L,measure(){const C=ce(e);u&&C&&M(C)}}}function pf(e,t,n={}){const{window:s=Ve}=n;return pr(e,t,s==null?void 0:s.localStorage,n)}function zo(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const Es=new WeakMap;function gf(e,t=!1){const n=xe(t);let s=null,r="";Ne(dr(e),l=>{const c=Ts(ce(l));if(c){const u=c;if(Es.get(u)||Es.set(u,u.style.overflow),u.style.overflow!=="hidden"&&(r=u.style.overflow),u.style.overflow==="hidden")return n.value=!0;if(n.value)return u.style.overflow="hidden"}},{immediate:!0});const i=()=>{const l=Ts(ce(e));!l||n.value||(ai&&(s=rt(l,"touchmove",c=>{pu(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},o=()=>{const l=Ts(ce(e));!l||!n.value||(ai&&(s==null||s()),l.style.overflow=r,Es.delete(l),n.value=!1)};return Uo(o),ie({get(){return n.value},set(l){l?i():o()}})}function mf(e,t,n={}){const{window:s=Ve}=n;return pr(e,t,s==null?void 0:s.sessionStorage,n)}function yf(e={}){const{window:t=Ve,...n}=e;return hu(t,n)}function vf(e={}){const{window:t=Ve,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:s=Number.POSITIVE_INFINITY,listenOrientation:r=!0,includeScrollbar:i=!0,type:o="inner"}=e,l=xe(n),c=xe(s),u=()=>{if(t)if(o==="outer")l.value=t.outerWidth,c.value=t.outerHeight;else if(o==="visual"&&t.visualViewport){const{width:d,height:m,scale:_}=t.visualViewport;l.value=Math.round(d*_),c.value=Math.round(m*_)}else i?(l.value=t.innerWidth,c.value=t.innerHeight):(l.value=t.document.documentElement.clientWidth,c.value=t.document.documentElement.clientHeight)};u(),is(u);const a={passive:!0};if(rt("resize",u,a),t&&o==="visual"&&t.visualViewport&&rt(t.visualViewport,"resize",u,a),r){const d=Xo("(orientation: portrait)");Ne(d,()=>u())}return{width:l,height:c}}const xs={};var Cs={};const Qo=/^(?:[a-z]+:|\/\/)/i,gu="vitepress-theme-appearance",mu=/#.*$/,yu=/[?#].*$/,vu=/(?:(^|\/)index)?\.(?:md|html)$/,ve=typeof document<"u",Zo={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function _u(e,t,n=!1){if(t===void 0)return!1;if(e=hi(`/${e}`),n)return new RegExp(t).test(e);if(hi(t)!==e)return!1;const s=t.match(mu);return s?(ve?location.hash:"")===s[0]:!0}function hi(e){return decodeURI(e).replace(yu,"").replace(vu,"$1")}function bu(e){return Qo.test(e)}function wu(e,t){return Object.keys((e==null?void 0:e.locales)||{}).find(n=>n!=="root"&&!bu(n)&&_u(t,`/${n}/`,!0))||"root"}function Su(e,t){var s,r,i,o,l,c,u;const n=wu(e,t);return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:tl(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(u=e.locales[n])==null?void 0:u.themeConfig}})}function el(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=Tu(e.title,s);return n===r.slice(3)?n:`${n}${r}`}function Tu(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Eu(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([i,o])=>i===n&&o[r[0]]===r[1])}function tl(e,t){return[...e.filter(n=>!Eu(t,n)),...t]}const xu=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,Cu=/^[a-z]:/i;function pi(e){const t=Cu.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(xu,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const As=new Set;function Au(e){if(As.size===0){const n=typeof process=="object"&&(Cs==null?void 0:Cs.VITE_EXTRA_EXTENSIONS)||(xs==null?void 0:xs.VITE_EXTRA_EXTENSIONS)||"";("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(n&&typeof n=="string"?","+n:"")).split(",").forEach(s=>As.add(s))}const t=e.split(".").pop();return t==null||!As.has(t.toLowerCase())}function _f(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const Ru=Symbol(),Ct=xe(Ua);function bf(e){const t=ie(()=>Su(Ct.value,e.data.relativePath)),n=t.value.appearance,s=n==="force-dark"?De(!0):n==="force-auto"?Jo():n?du({storageKey:gu,initialValue:()=>n==="dark"?"dark":"auto",...typeof n=="object"?n:{}}):De(!1),r=De(ve?location.hash:"");return ve&&window.addEventListener("hashchange",()=>{r.value=location.hash}),Ne(()=>e.data,()=>{r.value=ve?location.hash:""}),{site:t,theme:ie(()=>t.value.themeConfig),page:ie(()=>e.data),frontmatter:ie(()=>e.data.frontmatter),params:ie(()=>e.data.params),lang:ie(()=>t.value.lang),dir:ie(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:ie(()=>t.value.localeIndex||"root"),title:ie(()=>el(t.value,e.data)),description:ie(()=>e.data.description||t.value.description),isDark:s,hash:ie(()=>r.value)}}function Mu(){const e=St(Ru);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Ou(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function gi(e){return Qo.test(e)||!e.startsWith("/")?e:Ou(Ct.value.base,e)}function Pu(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),ve){const n="/";t=pi(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];if(s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),!s)return null;t=`${n}assets/${t}.${s}.js`}else t=`./${pi(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let Nn=[];function wf(e){Nn.push(e),ns(()=>{Nn=Nn.filter(t=>t!==e)})}function Lu(){let e=Ct.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=mi(e,n);else if(Array.isArray(e))for(const s of e){const r=mi(s,n);if(r){t=r;break}}return t}function mi(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}const Iu=Symbol(),nl="http://a.com",Nu=()=>({path:"/",component:null,data:Zo});function Sf(e,t){const n=$t(Nu()),s={route:n,go:r};async function r(l=ve?location.href:"/"){var c,u;l=Rs(l),await((c=s.onBeforeRouteChange)==null?void 0:c.call(s,l))!==!1&&(ve&&l!==Rs(location.href)&&(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",l)),await o(l),await((u=s.onAfterRouteChange??s.onAfterRouteChanged)==null?void 0:u(l)))}let i=null;async function o(l,c=0,u=!1){var m,_;if(await((m=s.onBeforePageLoad)==null?void 0:m.call(s,l))===!1)return;const a=new URL(l,nl),d=i=a.pathname;try{let b=await e(d);if(!b)throw new Error(`Page not found: ${d}`);if(i===d){i=null;const{default:y,__pageData:$}=b;if(!y)throw new Error(`Invalid route component: ${y}`);await((_=s.onAfterPageLoad)==null?void 0:_.call(s,l)),n.path=ve?d:gi(d),n.component=Pn(y),n.data=Pn($),ve&&Zn(()=>{let P=Ct.value.base+$.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!Ct.value.cleanUrls&&!P.endsWith("/")&&(P+=".html"),P!==a.pathname&&(a.pathname=P,l=P+a.search+a.hash,history.replaceState({},"",l)),a.hash&&!c){let L=null;try{L=document.getElementById(decodeURIComponent(a.hash).slice(1))}catch(p){console.warn(p)}if(L){yi(L,a.hash);return}}window.scrollTo(0,c)})}}catch(b){if(!/fetch|Page not found/.test(b.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(b),!u)try{const y=await fetch(Ct.value.base+"hashmap.json");window.__VP_HASH_MAP__=await y.json(),await o(l,c,!0);return}catch{}if(i===d){i=null,n.path=ve?d:gi(d),n.component=t?Pn(t):null;const y=ve?d.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").replace(/^\//,""):"404.md";n.data={...Zo,relativePath:y}}}}return ve&&(history.state===null&&history.replaceState({},""),window.addEventListener("click",l=>{if(l.defaultPrevented||!(l.target instanceof Element)||l.target.closest("button")||l.button!==0||l.ctrlKey||l.shiftKey||l.altKey||l.metaKey)return;const c=l.target.closest("a");if(!c||c.closest(".vp-raw")||c.hasAttribute("download")||c.hasAttribute("target"))return;const u=c.getAttribute("href")??(c instanceof SVGAElement?c.getAttribute("xlink:href"):null);if(u==null)return;const{href:a,origin:d,pathname:m,hash:_,search:b}=new URL(u,c.baseURI),y=new URL(location.href);d===y.origin&&Au(m)&&(l.preventDefault(),m===y.pathname&&b===y.search?(_!==y.hash&&(history.pushState({},"",a),window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:y.href,newURL:a}))),_?yi(c,_,c.classList.contains("header-anchor")):window.scrollTo(0,0)):r(a))},{capture:!0}),window.addEventListener("popstate",async l=>{var u;if(l.state===null)return;const c=Rs(location.href);await o(c,l.state&&l.state.scrollPosition||0),await((u=s.onAfterRouteChange??s.onAfterRouteChanged)==null?void 0:u(c))}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function Fu(){const e=St(Iu);if(!e)throw new Error("useRouter() is called without provider.");return e}function sl(){return Fu().route}function yi(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(r){console.warn(r)}if(s){let r=function(){!n||Math.abs(o-window.scrollY)>window.innerHeight?window.scrollTo(0,o):window.scrollTo({left:0,top:o,behavior:"smooth"})};const i=parseInt(window.getComputedStyle(s).paddingTop,10),o=window.scrollY+s.getBoundingClientRect().top-Lu()+i;requestAnimationFrame(r)}}function Rs(e){const t=new URL(e,nl);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),Ct.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const An=()=>Nn.forEach(e=>e()),Tf=ir({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=sl(),{frontmatter:n,site:s}=Mu();return Ne(n,An,{deep:!0,flush:"post"}),()=>Bs(e.as,s.value.contentProps??{style:{position:"relative"}},[t.component?Bs(t.component,{onVnodeMounted:An,onVnodeUpdated:An,onVnodeUnmounted:An}):"404 Page Not Found"])}}),Ef=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},Hu="modulepreload",Du=function(e){return"/"+e},vi={},xf=function(t,n,s){let r=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),l=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));r=Promise.allSettled(n.map(c=>{if(c=Du(c),c in vi)return;vi[c]=!0;const u=c.endsWith(".css"),a=u?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${a}`))return;const d=document.createElement("link");if(d.rel=u?"stylesheet":Hu,u||(d.as="script"),d.crossOrigin="",d.href=c,l&&d.setAttribute("nonce",l),document.head.appendChild(d),u)return new Promise((m,_)=>{d.addEventListener("load",m),d.addEventListener("error",()=>_(new Error(`Unable to preload CSS for ${c}`)))})}))}function i(o){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=o,window.dispatchEvent(l),!l.defaultPrevented)throw o}return r.then(o=>{for(const l of o||[])l.status==="rejected"&&i(l.reason);return t().catch(i)})},Cf=ir({setup(e,{slots:t}){const n=De(!1);return kt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Af(){ve&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const s=(n=t.parentElement)==null?void 0:n.parentElement;if(!s)return;const r=Array.from(s.querySelectorAll("input")).indexOf(t);if(r<0)return;const i=s.querySelector(".blocks");if(!i)return;const o=Array.from(i.children).find(u=>u.classList.contains("active"));if(!o)return;const l=i.children[r];if(!l||o===l)return;o.classList.remove("active"),l.classList.add("active");const c=s==null?void 0:s.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function Rf(){if(ve){const e=new WeakMap;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className),l=[".vp-copy-ignore",".diff.remove"],c=i.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(a=>a.remove());let u=c.textContent||"";o&&(u=u.replace(/^ *(\$|>) /gm,"").trim()),$u(u).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const a=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,a)})}})}}async function $u(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function Mf(e,t){let n=!0,s=[];const r=i=>{if(n){n=!1,i.forEach(l=>{const c=Ms(l);for(const u of document.head.children)if(u.isEqualNode(c)){s.push(u);return}});return}const o=i.map(Ms);s.forEach((l,c)=>{const u=o.findIndex(a=>a==null?void 0:a.isEqualNode(l??null));u!==-1?delete o[u]:(l==null||l.remove(),delete s[c])}),o.forEach(l=>l&&document.head.appendChild(l)),s=[...s,...o].filter(Boolean)};rr(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[],u=el(o,i);u!==document.title&&(document.title=u);const a=l||o.description;let d=document.querySelector("meta[name=description]");d?d.getAttribute("content")!==a&&d.setAttribute("content",a):Ms(["meta",{name:"description",content:a}]),r(tl(o.head,Vu(c)))})}function Ms([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),e==="script"&&t.async==null&&(s.async=!1),s}function ju(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Vu(e){return e.filter(t=>!ju(t))}const Os=new Set,rl=()=>document.createElement("link"),ku=e=>{const t=rl();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Wu=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let Rn;const Uu=ve&&(Rn=rl())&&Rn.relList&&Rn.relList.supports&&Rn.relList.supports("prefetch")?ku:Wu;function Of(){if(!ve||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!Os.has(c)){Os.add(c);const u=Pu(c);u&&Uu(u)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{hostname:o,pathname:l}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||i.target!=="_blank"&&o===location.hostname&&(l!==location.pathname?n.observe(i):Os.add(l))})})};kt(s);const r=sl();Ne(()=>r.path,s),ns(()=>{n&&n.disconnect()})}export{io as $,Lu as A,Ju as B,Xu as C,wf as D,fe as E,Te as F,xe as G,Yu as H,Qo as I,sl as J,na as K,St as L,vf as M,Ys as N,hf as O,Zn as P,yf as Q,ve as R,sn as S,sf as T,Gu as U,xf as V,gf as W,rc as X,Qu as Y,lf as Z,Ef as _,No as a,of as a0,Zu as a1,Mf as a2,Iu as a3,bf as a4,Ru as a5,Tf as a6,Cf as a7,Ct as a8,Sf as a9,Pu as aa,af as ab,Of as ac,Rf as ad,Af as ae,Bs as af,tf as ag,Uo as ah,ce as ai,Ss as aj,hr as ak,uf as al,df as am,mf as an,pf as ao,ff as ap,Fu as aq,rt as ar,Bu as as,rf as at,ae as au,qu as av,Pn as aw,cf as ax,_f as ay,Ws as b,ef as c,ir as d,nf as e,Au as f,gi as g,ie as h,bu as i,Io as j,Qn as k,_u as l,Xo as m,Js as n,ks as o,De as p,Ne as q,zu as r,rr as s,_l as t,Mu as u,kt as v,sc as w,ns as x,Ku as y,Ec as z}; diff --git a/assets/chunks/theme.CrSynxcK.js b/assets/chunks/theme.BY8ac8ik.js similarity index 93% rename from assets/chunks/theme.CrSynxcK.js rename to assets/chunks/theme.BY8ac8ik.js index bf394b44..57e7c213 100644 --- a/assets/chunks/theme.CrSynxcK.js +++ b/assets/chunks/theme.BY8ac8ik.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.Bu0XnV3q.js","assets/chunks/framework.CvgP6Fyv.js"])))=>i.map(i=>d[i]); -import{d as p,c as u,r as c,n as N,o as s,a as j,t as M,b as _,w as h,T as ue,e as m,_ as g,u as Ce,i as He,f as Be,g as de,h as y,j as d,k as i,l as z,m as se,p as S,q as F,s as X,v as U,x as ve,y as fe,z as Ee,A as Fe,F as x,B as A,C as W,D as Y,E as k,G as $e,H as B,I as ye,J as Q,K as G,L as Z,M as De,N as Pe,O as ie,P as Le,Q as Ve,R as ee,S as Oe,U as Ge,V as Ue,W as Se,X as Te,Y as je,Z as ze,$ as We,a0 as Ke,a1 as qe}from"./framework.CvgP6Fyv.js";const Re=p({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(e){return(t,n)=>(s(),u("span",{class:N(["VPBadge",e.type])},[c(t.$slots,"default",{},()=>[j(M(e.text),1)])],2))}}),Je={key:0,class:"VPBackdrop"},Xe=p({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(s(),_(ue,{name:"fade"},{default:h(()=>[e.show?(s(),u("div",Je)):m("",!0)]),_:1}))}}),Ye=g(Xe,[["__scopeId","data-v-c2c837da"]]),L=Ce;function Qe(e,t){let n,a=!1;return()=>{n&&clearTimeout(n),a?n=setTimeout(e,t):(e(),(a=!0)&&setTimeout(()=>a=!1,t))}}function re(e){return e.startsWith("/")?e:`/${e}`}function he(e){const{pathname:t,search:n,hash:a,protocol:o}=new URL(e,"http://a.com");if(He(e)||e.startsWith("#")||!o.startsWith("http")||!Be(t))return e;const{site:r}=L(),l=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${n}${a}`);return de(l)}function q({correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:a,theme:o,hash:r}=L(),l=y(()=>{var f,$;return{label:(f=t.value.locales[n.value])==null?void 0:f.label,link:(($=t.value.locales[n.value])==null?void 0:$.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:y(()=>Object.entries(t.value.locales).flatMap(([f,$])=>l.value.label===$.label?[]:{text:$.label,link:Ze($.link||(f==="root"?"/":`/${f}/`),o.value.i18nRouting!==!1&&e,a.value.relativePath.slice(l.value.link.length-1),!t.value.cleanUrls)+r.value})),currentLang:l}}function Ze(e,t,n,a){return t?e.replace(/\/$/,"")+re(n.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,a?".html":"")):e}const et={class:"NotFound"},tt={class:"code"},nt={class:"title"},at={class:"quote"},ot={class:"action"},st=["href","aria-label"],it=p({__name:"NotFound",setup(e){const{theme:t}=L(),{currentLang:n}=q();return(a,o)=>{var r,l,v,f,$;return s(),u("div",et,[d("p",tt,M(((r=i(t).notFound)==null?void 0:r.code)??"404"),1),d("h1",nt,M(((l=i(t).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),o[0]||(o[0]=d("div",{class:"divider"},null,-1)),d("blockquote",at,M(((v=i(t).notFound)==null?void 0:v.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),d("div",ot,[d("a",{class:"link",href:i(de)(i(n).link),"aria-label":((f=i(t).notFound)==null?void 0:f.linkLabel)??"go to home"},M((($=i(t).notFound)==null?void 0:$.linkText)??"Take me home"),9,st)])])}}}),rt=g(it,[["__scopeId","data-v-001acec4"]]);function Ne(e,t){if(Array.isArray(e))return R(e);if(e==null)return[];t=re(t);const n=Object.keys(e).sort((o,r)=>r.split("/").length-o.split("/").length).find(o=>t.startsWith(re(o))),a=n?e[n]:[];return Array.isArray(a)?R(a):R(a.items,a.base)}function lt(e){const t=[];let n=0;for(const a in e){const o=e[a];if(o.items){n=t.push(o);continue}t[n]||t.push({items:[]}),t[n].items.push(o)}return t}function ct(e){const t=[];function n(a){for(const o of a)o.text&&o.link&&t.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&n(o.items)}return n(e),t}function le(e,t){return Array.isArray(t)?t.some(n=>le(e,n)):z(e,t.link)?!0:t.items?le(e,t.items):!1}function R(e,t){return[...e].map(n=>{const a={...n},o=a.base||t;return o&&a.link&&(a.link=o+a.link),a.items&&(a.items=R(a.items,o)),a})}function D(){const{frontmatter:e,page:t,theme:n}=L(),a=se("(min-width: 960px)"),o=S(!1),r=y(()=>{const w=n.value.sidebar,C=t.value.relativePath;return w?Ne(w,C):[]}),l=S(r.value);F(r,(w,C)=>{JSON.stringify(w)!==JSON.stringify(C)&&(l.value=r.value)});const v=y(()=>e.value.sidebar!==!1&&l.value.length>0&&e.value.layout!=="home"),f=y(()=>$?e.value.aside==null?n.value.aside==="left":e.value.aside==="left":!1),$=y(()=>e.value.layout==="home"?!1:e.value.aside!=null?!!e.value.aside:n.value.aside!==!1),V=y(()=>v.value&&a.value),b=y(()=>v.value?lt(l.value):[]);function P(){o.value=!0}function T(){o.value=!1}function I(){o.value?T():P()}return{isOpen:o,sidebar:l,sidebarGroups:b,hasSidebar:v,hasAside:$,leftAside:f,isSidebarEnabled:V,open:P,close:T,toggle:I}}function ut(e,t){let n;X(()=>{n=e.value?document.activeElement:void 0}),U(()=>{window.addEventListener("keyup",a)}),ve(()=>{window.removeEventListener("keyup",a)});function a(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function dt(e){const{page:t,hash:n}=L(),a=S(!1),o=y(()=>e.value.collapsed!=null),r=y(()=>!!e.value.link),l=S(!1),v=()=>{l.value=z(t.value.relativePath,e.value.link)};F([t,e,n],v),U(v);const f=y(()=>l.value?!0:e.value.items?le(t.value.relativePath,e.value.items):!1),$=y(()=>!!(e.value.items&&e.value.items.length));X(()=>{a.value=!!(o.value&&e.value.collapsed)}),fe(()=>{(l.value||f.value)&&(a.value=!1)});function V(){o.value&&(a.value=!a.value)}return{collapsed:a,collapsible:o,isLink:r,isActiveLink:l,hasActiveLink:f,hasChildren:$,toggle:V}}function vt(){const{hasSidebar:e}=D(),t=se("(min-width: 960px)"),n=se("(min-width: 1280px)");return{isAsideEnabled:y(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const ft=/\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/,ce=[];function Me(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function me(e){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const a=Number(n.tagName[1]);return{element:n,title:ht(n),link:"#"+n.id,level:a}});return mt(t,e)}function ht(e){let t="";for(const n of e.childNodes)if(n.nodeType===1){if(ft.test(n.className))continue;t+=n.textContent}else n.nodeType===3&&(t+=n.textContent);return t.trim()}function mt(e,t){if(t===!1)return[];const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[a,o]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;return _t(e,a,o)}function pt(e,t){const{isAsideEnabled:n}=vt(),a=Qe(r,100);let o=null;U(()=>{requestAnimationFrame(r),window.addEventListener("scroll",a)}),Ee(()=>{l(location.hash)}),ve(()=>{window.removeEventListener("scroll",a)});function r(){if(!n.value)return;const v=window.scrollY,f=window.innerHeight,$=document.body.offsetHeight,V=Math.abs(v+f-$)<1,b=ce.map(({element:T,link:I})=>({link:I,top:kt(T)})).filter(({top:T})=>!Number.isNaN(T)).sort((T,I)=>T.top-I.top);if(!b.length){l(null);return}if(v<1){l(null);return}if(V){l(b[b.length-1].link);return}let P=null;for(const{link:T,top:I}of b){if(I>v+Fe()+4)break;P=T}l(P)}function l(v){o&&o.classList.remove("active"),v==null?o=null:o=e.value.querySelector(`a[href="${decodeURIComponent(v)}"]`);const f=o;f?(f.classList.add("active"),t.value.style.top=f.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function kt(e){let t=0;for(;e!==document.body;){if(e===null)return NaN;t+=e.offsetTop,e=e.offsetParent}return t}function _t(e,t,n){ce.length=0;const a=[],o=[];return e.forEach(r=>{const l={...r,children:[]};let v=o[o.length-1];for(;v&&v.level>=l.level;)o.pop(),v=o[o.length-1];if(l.element.classList.contains("ignore-header")||v&&"shouldIgnore"in v){o.push({level:l.level,shouldIgnore:!0});return}l.level>n||l.level{const o=W("VPDocOutlineItem",!0);return s(),u("ul",{class:N(["VPDocOutlineItem",e.root?"root":"nested"])},[(s(!0),u(x,null,A(e.headers,({children:r,link:l,title:v})=>(s(),u("li",null,[d("a",{class:"outline-link",href:l,onClick:t,title:v},M(v),9,bt),r!=null&&r.length?(s(),_(o,{key:0,headers:r},null,8,["headers"])):m("",!0)]))),256))],2)}}}),xe=g(gt,[["__scopeId","data-v-b4af7dc9"]]),$t={class:"content"},yt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},Pt=p({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=L(),a=$e([]);Y(()=>{a.value=me(t.value.outline??n.value.outline)});const o=S(),r=S();return pt(o,r),(l,v)=>(s(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:N(["VPDocAsideOutline",{"has-outline":a.value.length>0}]),ref_key:"container",ref:o},[d("div",$t,[d("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),d("div",yt,M(i(Me)(i(n))),1),k(xe,{headers:a.value,root:!0},null,8,["headers"])])],2))}}),Lt=g(Pt,[["__scopeId","data-v-b67a6837"]]),Vt={class:"VPDocAsideCarbonAds"},St=p({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(e){const t=()=>null;return(n,a)=>(s(),u("div",Vt,[k(i(t),{"carbon-ads":e.carbonAds},null,8,["carbon-ads"])]))}}),Tt={class:"VPDocAside"},Nt=p({__name:"VPDocAside",setup(e){const{theme:t}=L();return(n,a)=>(s(),u("div",Tt,[c(n.$slots,"aside-top",{},void 0,!0),c(n.$slots,"aside-outline-before",{},void 0,!0),k(Lt),c(n.$slots,"aside-outline-after",{},void 0,!0),a[0]||(a[0]=d("div",{class:"spacer"},null,-1)),c(n.$slots,"aside-ads-before",{},void 0,!0),i(t).carbonAds?(s(),_(St,{key:0,"carbon-ads":i(t).carbonAds},null,8,["carbon-ads"])):m("",!0),c(n.$slots,"aside-ads-after",{},void 0,!0),c(n.$slots,"aside-bottom",{},void 0,!0)]))}}),Mt=g(Nt,[["__scopeId","data-v-f268a203"]]);function xt(){const{theme:e,page:t}=L();return y(()=>{const{text:n="Edit this page",pattern:a=""}=e.value.editLink||{};let o;return typeof a=="function"?o=a(t.value):o=a.replace(/:path/g,t.value.filePath),{url:o,text:n}})}function It(){const{page:e,theme:t,frontmatter:n}=L();return y(()=>{var $,V,b,P,T,I,w,C;const a=Ne(t.value.sidebar,e.value.relativePath),o=ct(a),r=wt(o,H=>H.link.replace(/[?#].*$/,"")),l=r.findIndex(H=>z(e.value.relativePath,H.link)),v=(($=t.value.docFooter)==null?void 0:$.prev)===!1&&!n.value.prev||n.value.prev===!1,f=((V=t.value.docFooter)==null?void 0:V.next)===!1&&!n.value.next||n.value.next===!1;return{prev:v?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((b=r[l-1])==null?void 0:b.docFooterText)??((P=r[l-1])==null?void 0:P.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((T=r[l-1])==null?void 0:T.link)},next:f?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((I=r[l+1])==null?void 0:I.docFooterText)??((w=r[l+1])==null?void 0:w.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((C=r[l+1])==null?void 0:C.link)}}})}function wt(e,t){const n=new Set;return e.filter(a=>{const o=t(a);return n.has(o)?!1:n.add(o)})}const E=p({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(e){const t=e,n=y(()=>t.tag??(t.href?"a":"span")),a=y(()=>t.href&&ye.test(t.href)||t.target==="_blank");return(o,r)=>(s(),_(B(n.value),{class:N(["VPLink",{link:e.href,"vp-external-link-icon":a.value,"no-icon":e.noIcon}]),href:e.href?i(he)(e.href):void 0,target:e.target??(a.value?"_blank":void 0),rel:e.rel??(a.value?"noreferrer":void 0)},{default:h(()=>[c(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),At={class:"VPLastUpdated"},Ct=["datetime"],Ht=p({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n,lang:a}=L(),o=y(()=>new Date(n.value.lastUpdated)),r=y(()=>o.value.toISOString()),l=S("");return U(()=>{X(()=>{var v,f,$;l.value=new Intl.DateTimeFormat((f=(v=t.value.lastUpdated)==null?void 0:v.formatOptions)!=null&&f.forceLocale?a.value:void 0,(($=t.value.lastUpdated)==null?void 0:$.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(o.value)})}),(v,f)=>{var $;return s(),u("p",At,[j(M((($=i(t).lastUpdated)==null?void 0:$.text)||i(t).lastUpdatedText||"Last updated")+": ",1),d("time",{datetime:r.value},M(l.value),9,Ct)])}}}),Bt=g(Ht,[["__scopeId","data-v-5d56f43a"]]),Et={key:0,class:"VPDocFooter"},Ft={key:0,class:"edit-info"},Dt={key:0,class:"edit-link"},Ot={key:1,class:"last-updated"},Gt={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Ut={class:"pager"},jt=["innerHTML"],zt=["innerHTML"],Wt={class:"pager"},Kt=["innerHTML"],qt=["innerHTML"],Rt=p({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:a}=L(),o=xt(),r=It(),l=y(()=>t.value.editLink&&a.value.editLink!==!1),v=y(()=>n.value.lastUpdated),f=y(()=>l.value||v.value||r.value.prev||r.value.next);return($,V)=>{var b,P,T,I;return f.value?(s(),u("footer",Et,[c($.$slots,"doc-footer-before",{},void 0,!0),l.value||v.value?(s(),u("div",Ft,[l.value?(s(),u("div",Dt,[k(E,{class:"edit-link-button",href:i(o).url,"no-icon":!0},{default:h(()=>[V[0]||(V[0]=d("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),j(" "+M(i(o).text),1)]),_:1},8,["href"])])):m("",!0),v.value?(s(),u("div",Ot,[k(Bt)])):m("",!0)])):m("",!0),(b=i(r).prev)!=null&&b.link||(P=i(r).next)!=null&&P.link?(s(),u("nav",Gt,[V[1]||(V[1]=d("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),d("div",Ut,[(T=i(r).prev)!=null&&T.link?(s(),_(E,{key:0,class:"pager-link prev",href:i(r).prev.link},{default:h(()=>{var w;return[d("span",{class:"desc",innerHTML:((w=i(t).docFooter)==null?void 0:w.prev)||"Previous page"},null,8,jt),d("span",{class:"title",innerHTML:i(r).prev.text},null,8,zt)]}),_:1},8,["href"])):m("",!0)]),d("div",Wt,[(I=i(r).next)!=null&&I.link?(s(),_(E,{key:0,class:"pager-link next",href:i(r).next.link},{default:h(()=>{var w;return[d("span",{class:"desc",innerHTML:((w=i(t).docFooter)==null?void 0:w.next)||"Next page"},null,8,Kt),d("span",{class:"title",innerHTML:i(r).next.text},null,8,qt)]}),_:1},8,["href"])):m("",!0)])])):m("",!0)])):m("",!0)}}}),Jt=g(Rt,[["__scopeId","data-v-d067bba9"]]),Xt={class:"container"},Yt={class:"aside-container"},Qt={class:"aside-content"},Zt={class:"content"},en={class:"content-container"},tn={class:"main"},nn=p({__name:"VPDoc",setup(e){const{theme:t}=L(),n=Q(),{hasSidebar:a,hasAside:o,leftAside:r}=D(),l=y(()=>n.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(v,f)=>{const $=W("Content");return s(),u("div",{class:N(["VPDoc",{"has-sidebar":i(a),"has-aside":i(o)}])},[c(v.$slots,"doc-top",{},void 0,!0),d("div",Xt,[i(o)?(s(),u("div",{key:0,class:N(["aside",{"left-aside":i(r)}])},[f[0]||(f[0]=d("div",{class:"aside-curtain"},null,-1)),d("div",Yt,[d("div",Qt,[k(Mt,null,{"aside-top":h(()=>[c(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[c(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[c(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):m("",!0),d("div",Zt,[d("div",en,[c(v.$slots,"doc-before",{},void 0,!0),d("main",tn,[k($,{class:N(["vp-doc",[l.value,i(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),k(Jt,null,{"doc-footer-before":h(()=>[c(v.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(v.$slots,"doc-after",{},void 0,!0)])])]),c(v.$slots,"doc-bottom",{},void 0,!0)],2)}}}),an=g(nn,[["__scopeId","data-v-db8bf443"]]),on=p({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(e){const t=e,n=y(()=>t.href&&ye.test(t.href)),a=y(()=>t.tag||(t.href?"a":"button"));return(o,r)=>(s(),_(B(a.value),{class:N(["VPButton",[e.size,e.theme]]),href:e.href?i(he)(e.href):void 0,target:t.target??(n.value?"_blank":void 0),rel:t.rel??(n.value?"noreferrer":void 0)},{default:h(()=>[j(M(e.text),1)]),_:1},8,["class","href","target","rel"]))}}),sn=g(on,[["__scopeId","data-v-ae5e782c"]]),rn=["src","alt"],ln=p({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(e){return(t,n)=>{const a=W("VPImage",!0);return e.image?(s(),u(x,{key:0},[typeof e.image=="string"||"src"in e.image?(s(),u("img",G({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:i(de)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,rn)):(s(),u(x,{key:1},[k(a,G({class:"dark",image:e.image.dark,alt:e.image.alt},t.$attrs),null,16,["image","alt"]),k(a,G({class:"light",image:e.image.light,alt:e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):m("",!0)}}}),J=g(ln,[["__scopeId","data-v-352814ec"]]),cn={class:"container"},un={class:"main"},dn={class:"heading"},vn=["innerHTML"],fn=["innerHTML"],hn=["innerHTML"],mn={key:0,class:"actions"},pn={key:0,class:"image"},kn={class:"image-container"},_n=p({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(e){const t=Z("hero-image-slot-exists");return(n,a)=>(s(),u("div",{class:N(["VPHero",{"has-image":e.image||i(t)}])},[d("div",cn,[d("div",un,[c(n.$slots,"home-hero-info-before",{},void 0,!0),c(n.$slots,"home-hero-info",{},()=>[d("h1",dn,[e.name?(s(),u("span",{key:0,innerHTML:e.name,class:"name clip"},null,8,vn)):m("",!0),e.text?(s(),u("span",{key:1,innerHTML:e.text,class:"text"},null,8,fn)):m("",!0)]),e.tagline?(s(),u("p",{key:0,innerHTML:e.tagline,class:"tagline"},null,8,hn)):m("",!0)],!0),c(n.$slots,"home-hero-info-after",{},void 0,!0),e.actions?(s(),u("div",mn,[(s(!0),u(x,null,A(e.actions,o=>(s(),u("div",{key:o.link,class:"action"},[k(sn,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link,target:o.target,rel:o.rel},null,8,["theme","text","href","target","rel"])]))),128))])):m("",!0),c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),e.image||i(t)?(s(),u("div",pn,[d("div",kn,[a[0]||(a[0]=d("div",{class:"image-bg"},null,-1)),c(n.$slots,"home-hero-image",{},()=>[e.image?(s(),_(J,{key:0,class:"image-src",image:e.image},null,8,["image"])):m("",!0)],!0)])])):m("",!0)])],2))}}),bn=g(_n,[["__scopeId","data-v-b5497f95"]]),gn=p({__name:"VPHomeHero",setup(e){const{frontmatter:t}=L();return(n,a)=>i(t).hero?(s(),_(bn,{key:0,class:"VPHomeHero",name:i(t).hero.name,text:i(t).hero.text,tagline:i(t).hero.tagline,image:i(t).hero.image,actions:i(t).hero.actions},{"home-hero-info-before":h(()=>[c(n.$slots,"home-hero-info-before")]),"home-hero-info":h(()=>[c(n.$slots,"home-hero-info")]),"home-hero-info-after":h(()=>[c(n.$slots,"home-hero-info-after")]),"home-hero-actions-after":h(()=>[c(n.$slots,"home-hero-actions-after")]),"home-hero-image":h(()=>[c(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):m("",!0)}}),$n={class:"box"},yn={key:0,class:"icon"},Pn=["innerHTML"],Ln=["innerHTML"],Vn=["innerHTML"],Sn={key:4,class:"link-text"},Tn={class:"link-text-value"},Nn=p({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(e){return(t,n)=>(s(),_(E,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:h(()=>[d("article",$n,[typeof e.icon=="object"&&e.icon.wrap?(s(),u("div",yn,[k(J,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(s(),_(J,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(s(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Pn)):m("",!0),d("h2",{class:"title",innerHTML:e.title},null,8,Ln),e.details?(s(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,Vn)):m("",!0),e.linkText?(s(),u("div",Sn,[d("p",Tn,[j(M(e.linkText)+" ",1),n[0]||(n[0]=d("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):m("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Mn=g(Nn,[["__scopeId","data-v-b8f43207"]]),xn={key:0,class:"VPFeatures"},In={class:"container"},wn={class:"items"},An=p({__name:"VPFeatures",props:{features:{}},setup(e){const t=e,n=y(()=>{const a=t.features.length;if(a){if(a===2)return"grid-2";if(a===3)return"grid-3";if(a%3===0)return"grid-6";if(a>3)return"grid-4"}else return});return(a,o)=>e.features?(s(),u("div",xn,[d("div",In,[d("div",wn,[(s(!0),u(x,null,A(e.features,r=>(s(),u("div",{key:r.title,class:N(["item",[n.value]])},[k(Mn,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):m("",!0)}}),Cn=g(An,[["__scopeId","data-v-eca49b69"]]),Hn=p({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=L();return(n,a)=>i(t).features?(s(),_(Cn,{key:0,class:"VPHomeFeatures",features:i(t).features},null,8,["features"])):m("",!0)}}),Bn=p({__name:"VPHomeContent",setup(e){const{width:t}=De({initialWidth:0,includeScrollbar:!1});return(n,a)=>(s(),u("div",{class:"vp-doc container",style:Pe(i(t)?{"--vp-offset":`calc(50% - ${i(t)/2}px)`}:{})},[c(n.$slots,"default",{},void 0,!0)],4))}}),En=g(Bn,[["__scopeId","data-v-1d82f6d4"]]),Fn=p({__name:"VPHome",setup(e){const{frontmatter:t,theme:n}=L();return(a,o)=>{const r=W("Content");return s(),u("div",{class:N(["VPHome",{"external-link-icon-enabled":i(n).externalLinkIcon}])},[c(a.$slots,"home-hero-before",{},void 0,!0),k(gn,null,{"home-hero-info-before":h(()=>[c(a.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(a.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(a.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(a.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(a.$slots,"home-hero-after",{},void 0,!0),c(a.$slots,"home-features-before",{},void 0,!0),k(Hn),c(a.$slots,"home-features-after",{},void 0,!0),i(t).markdownStyles!==!1?(s(),_(En,{key:0},{default:h(()=>[k(r)]),_:1})):(s(),_(r,{key:1}))],2)}}}),Dn=g(Fn,[["__scopeId","data-v-cdfe9868"]]),On={},Gn={class:"VPPage"};function Un(e,t){const n=W("Content");return s(),u("div",Gn,[c(e.$slots,"page-top"),k(n),c(e.$slots,"page-bottom")])}const jn=g(On,[["render",Un]]),zn=p({__name:"VPContent",setup(e){const{page:t,frontmatter:n}=L(),{hasSidebar:a}=D();return(o,r)=>(s(),u("div",{class:N(["VPContent",{"has-sidebar":i(a),"is-home":i(n).layout==="home"}]),id:"VPContent"},[i(t).isNotFound?c(o.$slots,"not-found",{key:0},()=>[k(rt)],!0):i(n).layout==="page"?(s(),_(jn,{key:1},{"page-top":h(()=>[c(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[c(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(n).layout==="home"?(s(),_(Dn,{key:2},{"home-hero-before":h(()=>[c(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":h(()=>[c(o.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(o.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(o.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[c(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[c(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[c(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(n).layout&&i(n).layout!=="doc"?(s(),_(B(i(n).layout),{key:3})):(s(),_(an,{key:4},{"doc-top":h(()=>[c(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[c(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":h(()=>[c(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[c(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[c(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":h(()=>[c(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":h(()=>[c(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":h(()=>[c(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),Wn=g(zn,[["__scopeId","data-v-6a539cd2"]]),Kn={class:"container"},qn=["innerHTML"],Rn=["innerHTML"],Jn=p({__name:"VPFooter",setup(e){const{theme:t,frontmatter:n}=L(),{hasSidebar:a}=D();return(o,r)=>i(t).footer&&i(n).footer!==!1?(s(),u("footer",{key:0,class:N(["VPFooter",{"has-sidebar":i(a)}])},[d("div",Kn,[i(t).footer.message?(s(),u("p",{key:0,class:"message",innerHTML:i(t).footer.message},null,8,qn)):m("",!0),i(t).footer.copyright?(s(),u("p",{key:1,class:"copyright",innerHTML:i(t).footer.copyright},null,8,Rn)):m("",!0)])],2)):m("",!0)}}),Xn=g(Jn,[["__scopeId","data-v-a4a6e223"]]);function Yn(){const{theme:e,frontmatter:t}=L(),n=$e([]),a=y(()=>n.value.length>0);return Y(()=>{n.value=me(t.value.outline??e.value.outline)}),{headers:n,hasLocalNav:a}}const Qn={class:"menu-text"},Zn={class:"header"},ea={class:"outline"},ta=p({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(e){const t=e,{theme:n}=L(),a=S(!1),o=S(0),r=S(),l=S();function v(b){var P;(P=r.value)!=null&&P.contains(b.target)||(a.value=!1)}F(a,b=>{if(b){document.addEventListener("click",v);return}document.removeEventListener("click",v)}),ie("Escape",()=>{a.value=!1}),Y(()=>{a.value=!1});function f(){a.value=!a.value,o.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function $(b){b.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Le(()=>{a.value=!1}))}function V(){a.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,P)=>(s(),u("div",{class:"VPLocalNavOutlineDropdown",style:Pe({"--vp-vh":o.value+"px"}),ref_key:"main",ref:r},[e.headers.length>0?(s(),u("button",{key:0,onClick:f,class:N({open:a.value})},[d("span",Qn,M(i(Me)(i(n))),1),P[0]||(P[0]=d("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(s(),u("button",{key:1,onClick:V},M(i(n).returnToTopLabel||"Return to top"),1)),k(ue,{name:"flyout"},{default:h(()=>[a.value?(s(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:$},[d("div",Zn,[d("a",{class:"top-link",href:"#",onClick:V},M(i(n).returnToTopLabel||"Return to top"),1)]),d("div",ea,[k(xe,{headers:e.headers},null,8,["headers"])])],512)):m("",!0)]),_:1})],4))}}),na=g(ta,[["__scopeId","data-v-d5f98606"]]),aa={class:"container"},oa=["aria-expanded"],sa={class:"menu-text"},ia=p({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t,frontmatter:n}=L(),{hasSidebar:a}=D(),{headers:o}=Yn(),{y:r}=Ve(),l=S(0);U(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Y(()=>{o.value=me(n.value.outline??t.value.outline)});const v=y(()=>o.value.length===0),f=y(()=>v.value&&!a.value),$=y(()=>({VPLocalNav:!0,"has-sidebar":a.value,empty:v.value,fixed:f.value}));return(V,b)=>i(n).layout!=="home"&&(!f.value||i(r)>=l.value)?(s(),u("div",{key:0,class:N($.value)},[d("div",aa,[i(a)?(s(),u("button",{key:0,class:"menu","aria-expanded":e.open,"aria-controls":"VPSidebarNav",onClick:b[0]||(b[0]=P=>V.$emit("open-menu"))},[b[1]||(b[1]=d("span",{class:"vpi-align-left menu-icon"},null,-1)),d("span",sa,M(i(t).sidebarMenuLabel||"Menu"),1)],8,oa)):m("",!0),k(na,{headers:i(o),navHeight:l.value},null,8,["headers","navHeight"])])],2)):m("",!0)}}),ra=g(ia,[["__scopeId","data-v-20ac656e"]]);function la(){const e=S(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function a(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const r=Q();return F(()=>r.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:a}}const ca={},ua={class:"VPSwitch",type:"button",role:"switch"},da={class:"check"},va={key:0,class:"icon"};function fa(e,t){return s(),u("button",ua,[d("span",da,[e.$slots.default?(s(),u("span",va,[c(e.$slots,"default",{},void 0,!0)])):m("",!0)])])}const ha=g(ca,[["render",fa],["__scopeId","data-v-6d4c42ba"]]),ma=p({__name:"VPSwitchAppearance",setup(e){const{isDark:t,theme:n}=L(),a=Z("toggle-appearance",()=>{t.value=!t.value}),o=S("");return fe(()=>{o.value=t.value?n.value.lightModeSwitchTitle||"Switch to light theme":n.value.darkModeSwitchTitle||"Switch to dark theme"}),(r,l)=>(s(),_(ha,{title:o.value,class:"VPSwitchAppearance","aria-checked":i(t),onClick:i(a)},{default:h(()=>[...l[0]||(l[0]=[d("span",{class:"vpi-sun sun"},null,-1),d("span",{class:"vpi-moon moon"},null,-1)])]),_:1},8,["title","aria-checked","onClick"]))}}),pe=g(ma,[["__scopeId","data-v-6dee01f2"]]),pa={key:0,class:"VPNavBarAppearance"},ka=p({__name:"VPNavBarAppearance",setup(e){const{site:t}=L();return(n,a)=>i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",pa,[k(pe)])):m("",!0)}}),_a=g(ka,[["__scopeId","data-v-94cd6187"]]),ke=S();let Ie=!1,oe=0;function ba(e){const t=S(!1);if(ee){!Ie&&ga(),oe++;const n=F(ke,a=>{var o,r,l;a===e.el.value||(o=e.el.value)!=null&&o.contains(a)?(t.value=!0,(r=e.onFocus)==null||r.call(e)):(t.value=!1,(l=e.onBlur)==null||l.call(e))});ve(()=>{n(),oe--,oe||$a()})}return Oe(t)}function ga(){document.addEventListener("focusin",we),Ie=!0,ke.value=document.activeElement}function $a(){document.removeEventListener("focusin",we)}function we(){ke.value=document.activeElement}const ya={class:"VPMenuLink"},Pa=["innerHTML"],La=p({__name:"VPMenuLink",props:{item:{}},setup(e){const{page:t}=L();return(n,a)=>(s(),u("div",ya,[k(E,{class:N({active:i(z)(i(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,Pa)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),te=g(La,[["__scopeId","data-v-f20f02ed"]]),Va={class:"VPMenuGroup"},Sa={key:0,class:"title"},Ta=p({__name:"VPMenuGroup",props:{text:{},items:{}},setup(e){return(t,n)=>(s(),u("div",Va,[e.text?(s(),u("p",Sa,M(e.text),1)):m("",!0),(s(!0),u(x,null,A(e.items,a=>(s(),u(x,null,["link"in a?(s(),_(te,{key:0,item:a},null,8,["item"])):m("",!0)],64))),256))]))}}),Na=g(Ta,[["__scopeId","data-v-82f892e4"]]),Ma={class:"VPMenu"},xa={key:0,class:"items"},Ia=p({__name:"VPMenu",props:{items:{}},setup(e){return(t,n)=>(s(),u("div",Ma,[e.items?(s(),u("div",xa,[(s(!0),u(x,null,A(e.items,a=>(s(),u(x,{key:JSON.stringify(a)},["link"in a?(s(),_(te,{key:0,item:a},null,8,["item"])):"component"in a?(s(),_(B(a.component),G({key:1,ref_for:!0},a.props),null,16)):(s(),_(Na,{key:2,text:a.text,items:a.items},null,8,["text","items"]))],64))),128))])):m("",!0),c(t.$slots,"default",{},void 0,!0)]))}}),wa=g(Ia,[["__scopeId","data-v-e75fc4a8"]]),Aa=["aria-expanded","aria-label"],Ca={key:0,class:"text"},Ha=["innerHTML"],Ba={key:1,class:"vpi-more-horizontal icon"},Ea={class:"menu"},Fa=p({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(e){const t=S(!1),n=S();ba({el:n,onBlur:a});function a(){t.value=!1}return(o,r)=>(s(),u("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:r[1]||(r[1]=l=>t.value=!0),onMouseleave:r[2]||(r[2]=l=>t.value=!1)},[d("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:r[0]||(r[0]=l=>t.value=!t.value)},[e.button||e.icon?(s(),u("span",Ca,[e.icon?(s(),u("span",{key:0,class:N([e.icon,"option-icon"])},null,2)):m("",!0),e.button?(s(),u("span",{key:1,innerHTML:e.button},null,8,Ha)):m("",!0),r[3]||(r[3]=d("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(s(),u("span",Ba))],8,Aa),d("div",Ea,[k(wa,{items:e.items},{default:h(()=>[c(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),_e=g(Fa,[["__scopeId","data-v-93f94330"]]),Da=["href","aria-label","innerHTML"],Oa=p({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(e){const t=e,n=S();U(async()=>{var r;await Le();const o=(r=n.value)==null?void 0:r.children[0];o instanceof HTMLElement&&o.className.startsWith("vpi-social-")&&(getComputedStyle(o).maskImage||getComputedStyle(o).webkitMaskImage)==="none"&&o.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${t.icon}.svg')`)});const a=y(()=>typeof t.icon=="object"?t.icon.svg:``);return(o,r)=>(s(),u("a",{ref_key:"el",ref:n,class:"VPSocialLink no-icon",href:e.link,"aria-label":e.ariaLabel??(typeof e.icon=="string"?e.icon:""),target:"_blank",rel:"noopener",innerHTML:a.value},null,8,Da))}}),Ga=g(Oa,[["__scopeId","data-v-a094361f"]]),Ua={class:"VPSocialLinks"},ja=p({__name:"VPSocialLinks",props:{links:{}},setup(e){return(t,n)=>(s(),u("div",Ua,[(s(!0),u(x,null,A(e.links,({link:a,icon:o,ariaLabel:r})=>(s(),_(Ga,{key:a,icon:o,link:a,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}}),be=g(ja,[["__scopeId","data-v-bbf2a784"]]),za={key:0,class:"group translations"},Wa={class:"trans-title"},Ka={key:1,class:"group"},qa={class:"item appearance"},Ra={class:"label"},Ja={class:"appearance-action"},Xa={key:2,class:"group"},Ya={class:"item social-links"},Qa=p({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=L(),{localeLinks:a,currentLang:o}=q({correspondingLink:!0}),r=y(()=>a.value.length&&o.value.label||t.value.appearance||n.value.socialLinks);return(l,v)=>r.value?(s(),_(_e,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:h(()=>[i(a).length&&i(o).label?(s(),u("div",za,[d("p",Wa,M(i(o).label),1),(s(!0),u(x,null,A(i(a),f=>(s(),_(te,{key:f.link,item:f},null,8,["item"]))),128))])):m("",!0),i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",Ka,[d("div",qa,[d("p",Ra,M(i(n).darkModeSwitchLabel||"Appearance"),1),d("div",Ja,[k(pe)])])])):m("",!0),i(n).socialLinks?(s(),u("div",Xa,[d("div",Ya,[k(be,{class:"social-links-list",links:i(n).socialLinks},null,8,["links"])])])):m("",!0)]),_:1})):m("",!0)}}),Za=g(Qa,[["__scopeId","data-v-7a542967"]]),eo=["aria-expanded"],to=p({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(s(),u("button",{type:"button",class:N(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=a=>t.$emit("click"))},[...n[1]||(n[1]=[d("span",{class:"container"},[d("span",{class:"top"}),d("span",{class:"middle"}),d("span",{class:"bottom"})],-1)])],10,eo))}}),no=g(to,[["__scopeId","data-v-7aa6377b"]]),ao=["innerHTML"],oo=p({__name:"VPNavBarMenuLink",props:{item:{}},setup(e){const{page:t}=L();return(n,a)=>(s(),_(E,{class:N({VPNavBarMenuLink:!0,active:i(z)(i(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,tabindex:"0"},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,ao)]),_:1},8,["class","href","target","rel","no-icon"]))}}),so=g(oo,[["__scopeId","data-v-e7ad9d5b"]]),io=p({__name:"VPNavBarMenuGroup",props:{item:{}},setup(e){const t=e,{page:n}=L(),a=r=>"component"in r?!1:"link"in r?z(n.value.relativePath,r.link,!!t.item.activeMatch):r.items.some(a),o=y(()=>a(t.item));return(r,l)=>(s(),_(_e,{class:N({VPNavBarMenuGroup:!0,active:i(z)(i(n).relativePath,e.item.activeMatch,!!e.item.activeMatch)||o.value}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),ro={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},lo=p({__name:"VPNavBarMenu",setup(e){const{theme:t}=L();return(n,a)=>i(t).nav?(s(),u("nav",ro,[a[0]||(a[0]=d("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(s(!0),u(x,null,A(i(t).nav,o=>(s(),u(x,{key:JSON.stringify(o)},["link"in o?(s(),_(so,{key:0,item:o},null,8,["item"])):"component"in o?(s(),_(B(o.component),G({key:1,ref_for:!0},o.props),null,16)):(s(),_(io,{key:2,item:o},null,8,["item"]))],64))),128))])):m("",!0)}}),co=g(lo,[["__scopeId","data-v-dd886324"]]);function uo(e){const{localeIndex:t,theme:n}=L();function a(o){var I,w,C;const r=o.split("."),l=(I=n.value.search)==null?void 0:I.options,v=l&&typeof l=="object",f=v&&((C=(w=l.locales)==null?void 0:w[t.value])==null?void 0:C.translations)||null,$=v&&l.translations||null;let V=f,b=$,P=e;const T=r.pop();for(const H of r){let O=null;const K=P==null?void 0:P[H];K&&(O=P=K);const ne=b==null?void 0:b[H];ne&&(O=b=ne);const ae=V==null?void 0:V[H];ae&&(O=V=ae),K||(P=O),ne||(b=O),ae||(V=O)}return(V==null?void 0:V[T])??(b==null?void 0:b[T])??(P==null?void 0:P[T])??""}return a}const vo=["aria-label"],fo={class:"DocSearch-Button-Container"},ho={class:"DocSearch-Button-Placeholder"},ge=p({__name:"VPNavBarSearchButton",setup(e){const n=uo({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(a,o)=>(s(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":i(n)("button.buttonAriaLabel")},[d("span",fo,[o[0]||(o[0]=d("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),d("span",ho,M(i(n)("button.buttonText")),1)]),o[1]||(o[1]=d("span",{class:"DocSearch-Button-Keys"},[d("kbd",{class:"DocSearch-Button-Key"}),d("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,vo))}}),mo={class:"VPNavBarSearch"},po={id:"local-search"},ko={key:1,id:"docsearch"},_o=p({__name:"VPNavBarSearch",setup(e){const t=Ge(()=>Ue(()=>import("./VPLocalSearchBox.Bu0XnV3q.js"),__vite__mapDeps([0,1]))),n=()=>null,{theme:a}=L(),o=S(!1),r=S(!1);U(()=>{});function l(){o.value||(o.value=!0,setTimeout(v,16))}function v(){const b=new Event("keydown");b.key="k",b.metaKey=!0,window.dispatchEvent(b),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||v()},16)}function f(b){const P=b.target,T=P.tagName;return P.isContentEditable||T==="INPUT"||T==="SELECT"||T==="TEXTAREA"}const $=S(!1);ie("k",b=>{(b.ctrlKey||b.metaKey)&&(b.preventDefault(),$.value=!0)}),ie("/",b=>{f(b)||(b.preventDefault(),$.value=!0)});const V="local";return(b,P)=>{var T;return s(),u("div",mo,[i(V)==="local"?(s(),u(x,{key:0},[$.value?(s(),_(i(t),{key:0,onClose:P[0]||(P[0]=I=>$.value=!1)})):m("",!0),d("div",po,[k(ge,{onClick:P[1]||(P[1]=I=>$.value=!0)})])],64)):i(V)==="algolia"?(s(),u(x,{key:1},[o.value?(s(),_(i(n),{key:0,algolia:((T=i(a).search)==null?void 0:T.options)??i(a).algolia,onVnodeBeforeMount:P[2]||(P[2]=I=>r.value=!0)},null,8,["algolia"])):m("",!0),r.value?m("",!0):(s(),u("div",ko,[k(ge,{onClick:l})]))],64)):m("",!0)])}}}),bo=p({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=L();return(n,a)=>i(t).socialLinks?(s(),_(be,{key:0,class:"VPNavBarSocialLinks",links:i(t).socialLinks},null,8,["links"])):m("",!0)}}),go=g(bo,[["__scopeId","data-v-cd484525"]]),$o=["href","rel","target"],yo=["innerHTML"],Po={key:2},Lo=p({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=L(),{hasSidebar:a}=D(),{currentLang:o}=q(),r=y(()=>{var f;return typeof n.value.logoLink=="string"?n.value.logoLink:(f=n.value.logoLink)==null?void 0:f.link}),l=y(()=>{var f;return typeof n.value.logoLink=="string"||(f=n.value.logoLink)==null?void 0:f.rel}),v=y(()=>{var f;return typeof n.value.logoLink=="string"||(f=n.value.logoLink)==null?void 0:f.target});return(f,$)=>(s(),u("div",{class:N(["VPNavBarTitle",{"has-sidebar":i(a)}])},[d("a",{class:"title",href:r.value??i(he)(i(o).link),rel:l.value,target:v.value},[c(f.$slots,"nav-bar-title-before",{},void 0,!0),i(n).logo?(s(),_(J,{key:0,class:"logo",image:i(n).logo},null,8,["image"])):m("",!0),i(n).siteTitle?(s(),u("span",{key:1,innerHTML:i(n).siteTitle},null,8,yo)):i(n).siteTitle===void 0?(s(),u("span",Po,M(i(t).title),1)):m("",!0),c(f.$slots,"nav-bar-title-after",{},void 0,!0)],8,$o)],2))}}),Vo=g(Lo,[["__scopeId","data-v-18435660"]]),So={class:"items"},To={class:"title"},No=p({__name:"VPNavBarTranslations",setup(e){const{theme:t}=L(),{localeLinks:n,currentLang:a}=q({correspondingLink:!0});return(o,r)=>i(n).length&&i(a).label?(s(),_(_e,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:i(t).langMenuLabel||"Change language"},{default:h(()=>[d("div",So,[d("p",To,M(i(a).label),1),(s(!0),u(x,null,A(i(n),l=>(s(),_(te,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):m("",!0)}}),Mo=g(No,[["__scopeId","data-v-916d5f13"]]),xo={class:"wrapper"},Io={class:"container"},wo={class:"title"},Ao={class:"content"},Co={class:"content-body"},Ho=p({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const t=e,{y:n}=Ve(),{hasSidebar:a}=D(),{frontmatter:o}=L(),r=S({});return fe(()=>{r.value={"has-sidebar":a.value,home:o.value.layout==="home",top:n.value===0,"screen-open":t.isScreenOpen}}),(l,v)=>(s(),u("div",{class:N(["VPNavBar",r.value])},[d("div",xo,[d("div",Io,[d("div",wo,[k(Vo,null,{"nav-bar-title-before":h(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),d("div",Ao,[d("div",Co,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),k(_o,{class:"search"}),k(co,{class:"menu"}),k(Mo,{class:"translations"}),k(_a,{class:"appearance"}),k(go,{class:"social-links"}),k(Za,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),k(no,{class:"hamburger",active:e.isScreenOpen,onClick:v[0]||(v[0]=f=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),v[1]||(v[1]=d("div",{class:"divider"},[d("div",{class:"divider-line"})],-1))],2))}}),Bo=g(Ho,[["__scopeId","data-v-c354117b"]]),Eo={key:0,class:"VPNavScreenAppearance"},Fo={class:"text"},Do=p({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=L();return(a,o)=>i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",Eo,[d("p",Fo,M(i(n).darkModeSwitchLabel||"Appearance"),1),k(pe)])):m("",!0)}}),Oo=g(Do,[["__scopeId","data-v-8765e0f6"]]),Go=["innerHTML"],Uo=p({__name:"VPNavScreenMenuLink",props:{item:{}},setup(e){const t=Z("close-screen");return(n,a)=>(s(),_(E,{class:"VPNavScreenMenuLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:i(t)},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,Go)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),jo=g(Uo,[["__scopeId","data-v-fb28826b"]]),zo=["innerHTML"],Wo=p({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(e){const t=Z("close-screen");return(n,a)=>(s(),_(E,{class:"VPNavScreenMenuGroupLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:i(t)},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,zo)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Ae=g(Wo,[["__scopeId","data-v-2758655b"]]),Ko={class:"VPNavScreenMenuGroupSection"},qo={key:0,class:"title"},Ro=p({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(e){return(t,n)=>(s(),u("div",Ko,[e.text?(s(),u("p",qo,M(e.text),1)):m("",!0),(s(!0),u(x,null,A(e.items,a=>(s(),_(Ae,{key:a.text,item:a},null,8,["item"]))),128))]))}}),Jo=g(Ro,[["__scopeId","data-v-78bb0dac"]]),Xo=["aria-controls","aria-expanded"],Yo=["innerHTML"],Qo=["id"],Zo={key:0,class:"item"},es={key:1,class:"item"},ts={key:2,class:"group"},ns=p({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(e){const t=e,n=S(!1),a=y(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){n.value=!n.value}return(r,l)=>(s(),u("div",{class:N(["VPNavScreenMenuGroup",{open:n.value}])},[d("button",{class:"button","aria-controls":a.value,"aria-expanded":n.value,onClick:o},[d("span",{class:"button-text",innerHTML:e.text},null,8,Yo),l[0]||(l[0]=d("span",{class:"vpi-plus button-icon"},null,-1))],8,Xo),d("div",{id:a.value,class:"items"},[(s(!0),u(x,null,A(e.items,v=>(s(),u(x,{key:JSON.stringify(v)},["link"in v?(s(),u("div",Zo,[k(Ae,{item:v},null,8,["item"])])):"component"in v?(s(),u("div",es,[(s(),_(B(v.component),G({ref_for:!0},v.props,{"screen-menu":""}),null,16))])):(s(),u("div",ts,[k(Jo,{text:v.text,items:v.items},null,8,["text","items"])]))],64))),128))],8,Qo)],2))}}),as=g(ns,[["__scopeId","data-v-079fee36"]]),os={key:0,class:"VPNavScreenMenu"},ss=p({__name:"VPNavScreenMenu",setup(e){const{theme:t}=L();return(n,a)=>i(t).nav?(s(),u("nav",os,[(s(!0),u(x,null,A(i(t).nav,o=>(s(),u(x,{key:JSON.stringify(o)},["link"in o?(s(),_(jo,{key:0,item:o},null,8,["item"])):"component"in o?(s(),_(B(o.component),G({key:1,ref_for:!0},o.props,{"screen-menu":""}),null,16)):(s(),_(as,{key:2,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):m("",!0)}}),is=p({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=L();return(n,a)=>i(t).socialLinks?(s(),_(be,{key:0,class:"VPNavScreenSocialLinks",links:i(t).socialLinks},null,8,["links"])):m("",!0)}}),rs={class:"list"},ls=p({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=q({correspondingLink:!0}),a=S(!1);function o(){a.value=!a.value}return(r,l)=>i(t).length&&i(n).label?(s(),u("div",{key:0,class:N(["VPNavScreenTranslations",{open:a.value}])},[d("button",{class:"title",onClick:o},[l[0]||(l[0]=d("span",{class:"vpi-languages icon lang"},null,-1)),j(" "+M(i(n).label)+" ",1),l[1]||(l[1]=d("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),d("ul",rs,[(s(!0),u(x,null,A(i(t),v=>(s(),u("li",{key:v.link,class:"item"},[k(E,{class:"link",href:v.link},{default:h(()=>[j(M(v.text),1)]),_:2},1032,["href"])]))),128))])],2)):m("",!0)}}),cs=g(ls,[["__scopeId","data-v-fb935b75"]]),us={class:"container"},ds=p({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=S(null),n=Se(ee?document.body:null);return(a,o)=>(s(),_(ue,{name:"fade",onEnter:o[0]||(o[0]=r=>n.value=!0),onAfterLeave:o[1]||(o[1]=r=>n.value=!1)},{default:h(()=>[e.open?(s(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[d("div",us,[c(a.$slots,"nav-screen-content-before",{},void 0,!0),k(ss,{class:"menu"}),k(cs,{class:"translations"}),k(Oo,{class:"appearance"}),k(is,{class:"social-links"}),c(a.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):m("",!0)]),_:3}))}}),vs=g(ds,[["__scopeId","data-v-f28ff3d6"]]),fs={key:0,class:"VPNav"},hs=p({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:a}=la(),{frontmatter:o}=L(),r=y(()=>o.value.navbar!==!1);return Te("close-screen",n),X(()=>{ee&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(l,v)=>r.value?(s(),u("header",fs,[k(Bo,{"is-screen-open":i(t),onToggleScreen:i(a)},{"nav-bar-title-before":h(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),k(vs,{open:i(t)},{"nav-screen-content-before":h(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):m("",!0)}}),ms=g(hs,[["__scopeId","data-v-5deba549"]]),ps=["role","tabindex"],ks={key:1,class:"items"},_s=p({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(e){const t=e,{collapsed:n,collapsible:a,isLink:o,isActiveLink:r,hasActiveLink:l,hasChildren:v,toggle:f}=dt(y(()=>t.item)),$=y(()=>v.value?"section":"div"),V=y(()=>o.value?"a":"div"),b=y(()=>v.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),P=y(()=>o.value?void 0:"button"),T=y(()=>[[`level-${t.depth}`],{collapsible:a.value},{collapsed:n.value},{"is-link":o.value},{"is-active":r.value},{"has-active":l.value}]);function I(C){"key"in C&&C.key!=="Enter"||!t.item.link&&f()}function w(){t.item.link&&f()}return(C,H)=>{const O=W("VPSidebarItem",!0);return s(),_(B($.value),{class:N(["VPSidebarItem",T.value])},{default:h(()=>[e.item.text?(s(),u("div",G({key:0,class:"item",role:P.value},je(e.item.items?{click:I,keydown:I}:{},!0),{tabindex:e.item.items&&0}),[H[1]||(H[1]=d("div",{class:"indicator"},null,-1)),e.item.link?(s(),_(E,{key:0,tag:V.value,class:"link",href:e.item.link,rel:e.item.rel,target:e.item.target},{default:h(()=>[(s(),_(B(b.value),{class:"text",innerHTML:e.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(s(),_(B(b.value),{key:1,class:"text",innerHTML:e.item.text},null,8,["innerHTML"])),e.item.collapsed!=null&&e.item.items&&e.item.items.length?(s(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:w,onKeydown:ze(w,["enter"]),tabindex:"0"},[...H[0]||(H[0]=[d("span",{class:"vpi-chevron-right caret-icon"},null,-1)])],32)):m("",!0)],16,ps)):m("",!0),e.item.items&&e.item.items.length?(s(),u("div",ks,[e.depth<5?(s(!0),u(x,{key:0},A(e.item.items,K=>(s(),_(O,{key:K.text,item:K,depth:e.depth+1},null,8,["item","depth"]))),128)):m("",!0)])):m("",!0)]),_:1},8,["class"])}}}),bs=g(_s,[["__scopeId","data-v-904fc2f6"]]),gs=p({__name:"VPSidebarGroup",props:{items:{}},setup(e){const t=S(!0);let n=null;return U(()=>{n=setTimeout(()=>{n=null,t.value=!1},300)}),We(()=>{n!=null&&(clearTimeout(n),n=null)}),(a,o)=>(s(!0),u(x,null,A(e.items,r=>(s(),u("div",{key:r.text,class:N(["group",{"no-transition":t.value}])},[k(bs,{item:r,depth:0},null,8,["item"])],2))),128))}}),$s=g(gs,[["__scopeId","data-v-93f78773"]]),ys={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Ps=p({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const{sidebarGroups:t,hasSidebar:n}=D(),a=e,o=S(null),r=Se(ee?document.body:null);F([a,o],()=>{var v;a.open?(r.value=!0,(v=o.value)==null||v.focus()):r.value=!1},{immediate:!0,flush:"post"});const l=S(0);return F(t,()=>{l.value+=1},{deep:!0}),(v,f)=>i(n)?(s(),u("aside",{key:0,class:N(["VPSidebar",{open:e.open}]),ref_key:"navEl",ref:o,onClick:f[0]||(f[0]=Ke(()=>{},["stop"]))},[f[2]||(f[2]=d("div",{class:"curtain"},null,-1)),d("nav",ys,[f[1]||(f[1]=d("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),c(v.$slots,"sidebar-nav-before",{},void 0,!0),(s(),_($s,{items:i(t),key:l.value},null,8,["items"])),c(v.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):m("",!0)}}),Ls=g(Ps,[["__scopeId","data-v-feb7a153"]]),Vs=p({__name:"VPSkipLink",setup(e){const{theme:t}=L(),n=Q(),a=S();F(()=>n.path,()=>a.value.focus());function o({target:r}){const l=document.getElementById(decodeURIComponent(r.hash).slice(1));if(l){const v=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",v)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",v),l.focus(),window.scrollTo(0,0)}}return(r,l)=>(s(),u(x,null,[d("span",{ref_key:"backToTop",ref:a,tabindex:"-1"},null,512),d("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o},M(i(t).skipToContentLabel||"Skip to content"),1)],64))}}),Ss=g(Vs,[["__scopeId","data-v-30be8b8e"]]),Ts=p({__name:"Layout",setup(e){const{isOpen:t,open:n,close:a}=D(),o=Q();F(()=>o.path,a),ut(t,a);const{frontmatter:r}=L(),l=qe(),v=y(()=>!!l["home-hero-image"]);return Te("hero-image-slot-exists",v),(f,$)=>{const V=W("Content");return i(r).layout!==!1?(s(),u("div",{key:0,class:N(["Layout",i(r).pageClass])},[c(f.$slots,"layout-top",{},void 0,!0),k(Ss),k(Ye,{class:"backdrop",show:i(t),onClick:i(a)},null,8,["show","onClick"]),k(ms,null,{"nav-bar-title-before":h(()=>[c(f.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(f.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[c(f.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[c(f.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":h(()=>[c(f.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[c(f.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),k(ra,{open:i(t),onOpenMenu:i(n)},null,8,["open","onOpenMenu"]),k(Ls,{open:i(t)},{"sidebar-nav-before":h(()=>[c(f.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":h(()=>[c(f.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),k(Wn,null,{"page-top":h(()=>[c(f.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[c(f.$slots,"page-bottom",{},void 0,!0)]),"not-found":h(()=>[c(f.$slots,"not-found",{},void 0,!0)]),"home-hero-before":h(()=>[c(f.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":h(()=>[c(f.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(f.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(f.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(f.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(f.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[c(f.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[c(f.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[c(f.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":h(()=>[c(f.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[c(f.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[c(f.$slots,"doc-after",{},void 0,!0)]),"doc-top":h(()=>[c(f.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[c(f.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":h(()=>[c(f.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[c(f.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[c(f.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(f.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(f.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(f.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),k(Xn),c(f.$slots,"layout-bottom",{},void 0,!0)],2)):(s(),_(V,{key:1}))}}}),Ns=g(Ts,[["__scopeId","data-v-a7fd87cd"]]),xs={Layout:Ns,enhanceApp:({app:e})=>{e.component("Badge",Re)}};export{uo as c,xs as t,L as u}; +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.D8eiblz9.js","assets/chunks/framework.DXGyWiRo.js"])))=>i.map(i=>d[i]); +import{d as p,c as u,r as c,n as N,o as s,a as j,t as M,b as _,w as h,T as ue,e as m,_ as g,u as Ce,i as He,f as Be,g as de,h as y,j as d,k as i,l as z,m as se,p as S,q as F,s as X,v as U,x as ve,y as fe,z as Ee,A as Fe,F as x,B as A,C as W,D as Y,E as k,G as $e,H as B,I as ye,J as Q,K as G,L as Z,M as De,N as Pe,O as ie,P as Le,Q as Ve,R as ee,S as Oe,U as Ge,V as Ue,W as Se,X as Te,Y as je,Z as ze,$ as We,a0 as Ke,a1 as qe}from"./framework.DXGyWiRo.js";const Re=p({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(e){return(t,n)=>(s(),u("span",{class:N(["VPBadge",e.type])},[c(t.$slots,"default",{},()=>[j(M(e.text),1)])],2))}}),Je={key:0,class:"VPBackdrop"},Xe=p({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(s(),_(ue,{name:"fade"},{default:h(()=>[e.show?(s(),u("div",Je)):m("",!0)]),_:1}))}}),Ye=g(Xe,[["__scopeId","data-v-3febd95c"]]),L=Ce;function Qe(e,t){let n,a=!1;return()=>{n&&clearTimeout(n),a?n=setTimeout(e,t):(e(),(a=!0)&&setTimeout(()=>a=!1,t))}}function re(e){return e.startsWith("/")?e:`/${e}`}function he(e){const{pathname:t,search:n,hash:a,protocol:o}=new URL(e,"http://a.com");if(He(e)||e.startsWith("#")||!o.startsWith("http")||!Be(t))return e;const{site:r}=L(),l=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${n}${a}`);return de(l)}function q({correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:a,theme:o,hash:r}=L(),l=y(()=>{var f,$;return{label:(f=t.value.locales[n.value])==null?void 0:f.label,link:(($=t.value.locales[n.value])==null?void 0:$.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:y(()=>Object.entries(t.value.locales).flatMap(([f,$])=>l.value.label===$.label?[]:{text:$.label,link:Ze($.link||(f==="root"?"/":`/${f}/`),o.value.i18nRouting!==!1&&e,a.value.relativePath.slice(l.value.link.length-1),!t.value.cleanUrls)+r.value})),currentLang:l}}function Ze(e,t,n,a){return t?e.replace(/\/$/,"")+re(n.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,a?".html":"")):e}const et={class:"NotFound"},tt={class:"code"},nt={class:"title"},at={class:"quote"},ot={class:"action"},st=["href","aria-label"],it=p({__name:"NotFound",setup(e){const{theme:t}=L(),{currentLang:n}=q();return(a,o)=>{var r,l,v,f,$;return s(),u("div",et,[d("p",tt,M(((r=i(t).notFound)==null?void 0:r.code)??"404"),1),d("h1",nt,M(((l=i(t).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),o[0]||(o[0]=d("div",{class:"divider"},null,-1)),d("blockquote",at,M(((v=i(t).notFound)==null?void 0:v.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),d("div",ot,[d("a",{class:"link",href:i(de)(i(n).link),"aria-label":((f=i(t).notFound)==null?void 0:f.linkLabel)??"go to home"},M((($=i(t).notFound)==null?void 0:$.linkText)??"Take me home"),9,st)])])}}}),rt=g(it,[["__scopeId","data-v-769096ce"]]);function Ne(e,t){if(Array.isArray(e))return R(e);if(e==null)return[];t=re(t);const n=Object.keys(e).sort((o,r)=>r.split("/").length-o.split("/").length).find(o=>t.startsWith(re(o))),a=n?e[n]:[];return Array.isArray(a)?R(a):R(a.items,a.base)}function lt(e){const t=[];let n=0;for(const a in e){const o=e[a];if(o.items){n=t.push(o);continue}t[n]||t.push({items:[]}),t[n].items.push(o)}return t}function ct(e){const t=[];function n(a){for(const o of a)o.text&&o.link&&t.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&n(o.items)}return n(e),t}function le(e,t){return Array.isArray(t)?t.some(n=>le(e,n)):z(e,t.link)?!0:t.items?le(e,t.items):!1}function R(e,t){return[...e].map(n=>{const a={...n},o=a.base||t;return o&&a.link&&(a.link=o+a.link),a.items&&(a.items=R(a.items,o)),a})}function D(){const{frontmatter:e,page:t,theme:n}=L(),a=se("(min-width: 960px)"),o=S(!1),r=y(()=>{const w=n.value.sidebar,C=t.value.relativePath;return w?Ne(w,C):[]}),l=S(r.value);F(r,(w,C)=>{JSON.stringify(w)!==JSON.stringify(C)&&(l.value=r.value)});const v=y(()=>e.value.sidebar!==!1&&l.value.length>0&&e.value.layout!=="home"),f=y(()=>$?e.value.aside==null?n.value.aside==="left":e.value.aside==="left":!1),$=y(()=>e.value.layout==="home"?!1:e.value.aside!=null?!!e.value.aside:n.value.aside!==!1),V=y(()=>v.value&&a.value),b=y(()=>v.value?lt(l.value):[]);function P(){o.value=!0}function T(){o.value=!1}function I(){o.value?T():P()}return{isOpen:o,sidebar:l,sidebarGroups:b,hasSidebar:v,hasAside:$,leftAside:f,isSidebarEnabled:V,open:P,close:T,toggle:I}}function ut(e,t){let n;X(()=>{n=e.value?document.activeElement:void 0}),U(()=>{window.addEventListener("keyup",a)}),ve(()=>{window.removeEventListener("keyup",a)});function a(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function dt(e){const{page:t,hash:n}=L(),a=S(!1),o=y(()=>e.value.collapsed!=null),r=y(()=>!!e.value.link),l=S(!1),v=()=>{l.value=z(t.value.relativePath,e.value.link)};F([t,e,n],v),U(v);const f=y(()=>l.value?!0:e.value.items?le(t.value.relativePath,e.value.items):!1),$=y(()=>!!(e.value.items&&e.value.items.length));X(()=>{a.value=!!(o.value&&e.value.collapsed)}),fe(()=>{(l.value||f.value)&&(a.value=!1)});function V(){o.value&&(a.value=!a.value)}return{collapsed:a,collapsible:o,isLink:r,isActiveLink:l,hasActiveLink:f,hasChildren:$,toggle:V}}function vt(){const{hasSidebar:e}=D(),t=se("(min-width: 960px)"),n=se("(min-width: 1280px)");return{isAsideEnabled:y(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const ft=/\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/,ce=[];function Me(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function me(e){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const a=Number(n.tagName[1]);return{element:n,title:ht(n),link:"#"+n.id,level:a}});return mt(t,e)}function ht(e){let t="";for(const n of e.childNodes)if(n.nodeType===1){if(ft.test(n.className))continue;t+=n.textContent}else n.nodeType===3&&(t+=n.textContent);return t.trim()}function mt(e,t){if(t===!1)return[];const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[a,o]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;return _t(e,a,o)}function pt(e,t){const{isAsideEnabled:n}=vt(),a=Qe(r,100);let o=null;U(()=>{requestAnimationFrame(r),window.addEventListener("scroll",a)}),Ee(()=>{l(location.hash)}),ve(()=>{window.removeEventListener("scroll",a)});function r(){if(!n.value)return;const v=window.scrollY,f=window.innerHeight,$=document.body.offsetHeight,V=Math.abs(v+f-$)<1,b=ce.map(({element:T,link:I})=>({link:I,top:kt(T)})).filter(({top:T})=>!Number.isNaN(T)).sort((T,I)=>T.top-I.top);if(!b.length){l(null);return}if(v<1){l(null);return}if(V){l(b[b.length-1].link);return}let P=null;for(const{link:T,top:I}of b){if(I>v+Fe()+4)break;P=T}l(P)}function l(v){o&&o.classList.remove("active"),v==null?o=null:o=e.value.querySelector(`a[href="${decodeURIComponent(v)}"]`);const f=o;f?(f.classList.add("active"),t.value.style.top=f.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function kt(e){let t=0;for(;e!==document.body;){if(e===null)return NaN;t+=e.offsetTop,e=e.offsetParent}return t}function _t(e,t,n){ce.length=0;const a=[],o=[];return e.forEach(r=>{const l={...r,children:[]};let v=o[o.length-1];for(;v&&v.level>=l.level;)o.pop(),v=o[o.length-1];if(l.element.classList.contains("ignore-header")||v&&"shouldIgnore"in v){o.push({level:l.level,shouldIgnore:!0});return}l.level>n||l.level{const o=W("VPDocOutlineItem",!0);return s(),u("ul",{class:N(["VPDocOutlineItem",e.root?"root":"nested"])},[(s(!0),u(x,null,A(e.headers,({children:r,link:l,title:v})=>(s(),u("li",null,[d("a",{class:"outline-link",href:l,onClick:t,title:v},M(v),9,bt),r!=null&&r.length?(s(),_(o,{key:0,headers:r},null,8,["headers"])):m("",!0)]))),256))],2)}}}),xe=g(gt,[["__scopeId","data-v-3d2c5cd8"]]),$t={class:"content"},yt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},Pt=p({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=L(),a=$e([]);Y(()=>{a.value=me(t.value.outline??n.value.outline)});const o=S(),r=S();return pt(o,r),(l,v)=>(s(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:N(["VPDocAsideOutline",{"has-outline":a.value.length>0}]),ref_key:"container",ref:o},[d("div",$t,[d("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),d("div",yt,M(i(Me)(i(n))),1),k(xe,{headers:a.value,root:!0},null,8,["headers"])])],2))}}),Lt=g(Pt,[["__scopeId","data-v-9a976623"]]),Vt={class:"VPDocAsideCarbonAds"},St=p({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(e){const t=()=>null;return(n,a)=>(s(),u("div",Vt,[k(i(t),{"carbon-ads":e.carbonAds},null,8,["carbon-ads"])]))}}),Tt={class:"VPDocAside"},Nt=p({__name:"VPDocAside",setup(e){const{theme:t}=L();return(n,a)=>(s(),u("div",Tt,[c(n.$slots,"aside-top",{},void 0,!0),c(n.$slots,"aside-outline-before",{},void 0,!0),k(Lt),c(n.$slots,"aside-outline-after",{},void 0,!0),a[0]||(a[0]=d("div",{class:"spacer"},null,-1)),c(n.$slots,"aside-ads-before",{},void 0,!0),i(t).carbonAds?(s(),_(St,{key:0,"carbon-ads":i(t).carbonAds},null,8,["carbon-ads"])):m("",!0),c(n.$slots,"aside-ads-after",{},void 0,!0),c(n.$slots,"aside-bottom",{},void 0,!0)]))}}),Mt=g(Nt,[["__scopeId","data-v-0508e845"]]);function xt(){const{theme:e,page:t}=L();return y(()=>{const{text:n="Edit this page",pattern:a=""}=e.value.editLink||{};let o;return typeof a=="function"?o=a(t.value):o=a.replace(/:path/g,t.value.filePath),{url:o,text:n}})}function It(){const{page:e,theme:t,frontmatter:n}=L();return y(()=>{var $,V,b,P,T,I,w,C;const a=Ne(t.value.sidebar,e.value.relativePath),o=ct(a),r=wt(o,H=>H.link.replace(/[?#].*$/,"")),l=r.findIndex(H=>z(e.value.relativePath,H.link)),v=(($=t.value.docFooter)==null?void 0:$.prev)===!1&&!n.value.prev||n.value.prev===!1,f=((V=t.value.docFooter)==null?void 0:V.next)===!1&&!n.value.next||n.value.next===!1;return{prev:v?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((b=r[l-1])==null?void 0:b.docFooterText)??((P=r[l-1])==null?void 0:P.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((T=r[l-1])==null?void 0:T.link)},next:f?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((I=r[l+1])==null?void 0:I.docFooterText)??((w=r[l+1])==null?void 0:w.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((C=r[l+1])==null?void 0:C.link)}}})}function wt(e,t){const n=new Set;return e.filter(a=>{const o=t(a);return n.has(o)?!1:n.add(o)})}const E=p({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(e){const t=e,n=y(()=>t.tag??(t.href?"a":"span")),a=y(()=>t.href&&ye.test(t.href)||t.target==="_blank");return(o,r)=>(s(),_(B(n.value),{class:N(["VPLink",{link:e.href,"vp-external-link-icon":a.value,"no-icon":e.noIcon}]),href:e.href?i(he)(e.href):void 0,target:e.target??(a.value?"_blank":void 0),rel:e.rel??(a.value?"noreferrer":void 0)},{default:h(()=>[c(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),At={class:"VPLastUpdated"},Ct=["datetime"],Ht=p({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n,lang:a}=L(),o=y(()=>new Date(n.value.lastUpdated)),r=y(()=>o.value.toISOString()),l=S("");return U(()=>{X(()=>{var v,f,$;l.value=new Intl.DateTimeFormat((f=(v=t.value.lastUpdated)==null?void 0:v.formatOptions)!=null&&f.forceLocale?a.value:void 0,(($=t.value.lastUpdated)==null?void 0:$.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(o.value)})}),(v,f)=>{var $;return s(),u("p",At,[j(M((($=i(t).lastUpdated)==null?void 0:$.text)||i(t).lastUpdatedText||"Last updated")+": ",1),d("time",{datetime:r.value},M(l.value),9,Ct)])}}}),Bt=g(Ht,[["__scopeId","data-v-2d5eec31"]]),Et={key:0,class:"VPDocFooter"},Ft={key:0,class:"edit-info"},Dt={key:0,class:"edit-link"},Ot={key:1,class:"last-updated"},Gt={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Ut={class:"pager"},jt=["innerHTML"],zt=["innerHTML"],Wt={class:"pager"},Kt=["innerHTML"],qt=["innerHTML"],Rt=p({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:a}=L(),o=xt(),r=It(),l=y(()=>t.value.editLink&&a.value.editLink!==!1),v=y(()=>n.value.lastUpdated),f=y(()=>l.value||v.value||r.value.prev||r.value.next);return($,V)=>{var b,P,T,I;return f.value?(s(),u("footer",Et,[c($.$slots,"doc-footer-before",{},void 0,!0),l.value||v.value?(s(),u("div",Ft,[l.value?(s(),u("div",Dt,[k(E,{class:"edit-link-button",href:i(o).url,"no-icon":!0},{default:h(()=>[V[0]||(V[0]=d("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),j(" "+M(i(o).text),1)]),_:1},8,["href"])])):m("",!0),v.value?(s(),u("div",Ot,[k(Bt)])):m("",!0)])):m("",!0),(b=i(r).prev)!=null&&b.link||(P=i(r).next)!=null&&P.link?(s(),u("nav",Gt,[V[1]||(V[1]=d("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),d("div",Ut,[(T=i(r).prev)!=null&&T.link?(s(),_(E,{key:0,class:"pager-link prev",href:i(r).prev.link},{default:h(()=>{var w;return[d("span",{class:"desc",innerHTML:((w=i(t).docFooter)==null?void 0:w.prev)||"Previous page"},null,8,jt),d("span",{class:"title",innerHTML:i(r).prev.text},null,8,zt)]}),_:1},8,["href"])):m("",!0)]),d("div",Wt,[(I=i(r).next)!=null&&I.link?(s(),_(E,{key:0,class:"pager-link next",href:i(r).next.link},{default:h(()=>{var w;return[d("span",{class:"desc",innerHTML:((w=i(t).docFooter)==null?void 0:w.next)||"Next page"},null,8,Kt),d("span",{class:"title",innerHTML:i(r).next.text},null,8,qt)]}),_:1},8,["href"])):m("",!0)])])):m("",!0)])):m("",!0)}}}),Jt=g(Rt,[["__scopeId","data-v-d25f151f"]]),Xt={class:"container"},Yt={class:"aside-container"},Qt={class:"aside-content"},Zt={class:"content"},en={class:"content-container"},tn={class:"main"},nn=p({__name:"VPDoc",setup(e){const{theme:t}=L(),n=Q(),{hasSidebar:a,hasAside:o,leftAside:r}=D(),l=y(()=>n.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(v,f)=>{const $=W("Content");return s(),u("div",{class:N(["VPDoc",{"has-sidebar":i(a),"has-aside":i(o)}])},[c(v.$slots,"doc-top",{},void 0,!0),d("div",Xt,[i(o)?(s(),u("div",{key:0,class:N(["aside",{"left-aside":i(r)}])},[f[0]||(f[0]=d("div",{class:"aside-curtain"},null,-1)),d("div",Yt,[d("div",Qt,[k(Mt,null,{"aside-top":h(()=>[c(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[c(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[c(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):m("",!0),d("div",Zt,[d("div",en,[c(v.$slots,"doc-before",{},void 0,!0),d("main",tn,[k($,{class:N(["vp-doc",[l.value,i(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),k(Jt,null,{"doc-footer-before":h(()=>[c(v.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(v.$slots,"doc-after",{},void 0,!0)])])]),c(v.$slots,"doc-bottom",{},void 0,!0)],2)}}}),an=g(nn,[["__scopeId","data-v-660c348c"]]),on=p({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(e){const t=e,n=y(()=>t.href&&ye.test(t.href)),a=y(()=>t.tag||(t.href?"a":"button"));return(o,r)=>(s(),_(B(a.value),{class:N(["VPButton",[e.size,e.theme]]),href:e.href?i(he)(e.href):void 0,target:t.target??(n.value?"_blank":void 0),rel:t.rel??(n.value?"noreferrer":void 0)},{default:h(()=>[j(M(e.text),1)]),_:1},8,["class","href","target","rel"]))}}),sn=g(on,[["__scopeId","data-v-c957d30d"]]),rn=["src","alt"],ln=p({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(e){return(t,n)=>{const a=W("VPImage",!0);return e.image?(s(),u(x,{key:0},[typeof e.image=="string"||"src"in e.image?(s(),u("img",G({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:i(de)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,rn)):(s(),u(x,{key:1},[k(a,G({class:"dark",image:e.image.dark,alt:e.image.alt},t.$attrs),null,16,["image","alt"]),k(a,G({class:"light",image:e.image.light,alt:e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):m("",!0)}}}),J=g(ln,[["__scopeId","data-v-c69324aa"]]),cn={class:"container"},un={class:"main"},dn={class:"heading"},vn=["innerHTML"],fn=["innerHTML"],hn=["innerHTML"],mn={key:0,class:"actions"},pn={key:0,class:"image"},kn={class:"image-container"},_n=p({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(e){const t=Z("hero-image-slot-exists");return(n,a)=>(s(),u("div",{class:N(["VPHero",{"has-image":e.image||i(t)}])},[d("div",cn,[d("div",un,[c(n.$slots,"home-hero-info-before",{},void 0,!0),c(n.$slots,"home-hero-info",{},()=>[d("h1",dn,[e.name?(s(),u("span",{key:0,innerHTML:e.name,class:"name clip"},null,8,vn)):m("",!0),e.text?(s(),u("span",{key:1,innerHTML:e.text,class:"text"},null,8,fn)):m("",!0)]),e.tagline?(s(),u("p",{key:0,innerHTML:e.tagline,class:"tagline"},null,8,hn)):m("",!0)],!0),c(n.$slots,"home-hero-info-after",{},void 0,!0),e.actions?(s(),u("div",mn,[(s(!0),u(x,null,A(e.actions,o=>(s(),u("div",{key:o.link,class:"action"},[k(sn,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link,target:o.target,rel:o.rel},null,8,["theme","text","href","target","rel"])]))),128))])):m("",!0),c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),e.image||i(t)?(s(),u("div",pn,[d("div",kn,[a[0]||(a[0]=d("div",{class:"image-bg"},null,-1)),c(n.$slots,"home-hero-image",{},()=>[e.image?(s(),_(J,{key:0,class:"image-src",image:e.image},null,8,["image"])):m("",!0)],!0)])])):m("",!0)])],2))}}),bn=g(_n,[["__scopeId","data-v-5ac44a4a"]]),gn=p({__name:"VPHomeHero",setup(e){const{frontmatter:t}=L();return(n,a)=>i(t).hero?(s(),_(bn,{key:0,class:"VPHomeHero",name:i(t).hero.name,text:i(t).hero.text,tagline:i(t).hero.tagline,image:i(t).hero.image,actions:i(t).hero.actions},{"home-hero-info-before":h(()=>[c(n.$slots,"home-hero-info-before")]),"home-hero-info":h(()=>[c(n.$slots,"home-hero-info")]),"home-hero-info-after":h(()=>[c(n.$slots,"home-hero-info-after")]),"home-hero-actions-after":h(()=>[c(n.$slots,"home-hero-actions-after")]),"home-hero-image":h(()=>[c(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):m("",!0)}}),$n={class:"box"},yn={key:0,class:"icon"},Pn=["innerHTML"],Ln=["innerHTML"],Vn=["innerHTML"],Sn={key:4,class:"link-text"},Tn={class:"link-text-value"},Nn=p({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(e){return(t,n)=>(s(),_(E,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:h(()=>[d("article",$n,[typeof e.icon=="object"&&e.icon.wrap?(s(),u("div",yn,[k(J,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(s(),_(J,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(s(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Pn)):m("",!0),d("h2",{class:"title",innerHTML:e.title},null,8,Ln),e.details?(s(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,Vn)):m("",!0),e.linkText?(s(),u("div",Sn,[d("p",Tn,[j(M(e.linkText)+" ",1),n[0]||(n[0]=d("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):m("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Mn=g(Nn,[["__scopeId","data-v-d72d51ca"]]),xn={key:0,class:"VPFeatures"},In={class:"container"},wn={class:"items"},An=p({__name:"VPFeatures",props:{features:{}},setup(e){const t=e,n=y(()=>{const a=t.features.length;if(a){if(a===2)return"grid-2";if(a===3)return"grid-3";if(a%3===0)return"grid-6";if(a>3)return"grid-4"}else return});return(a,o)=>e.features?(s(),u("div",xn,[d("div",In,[d("div",wn,[(s(!0),u(x,null,A(e.features,r=>(s(),u("div",{key:r.title,class:N(["item",[n.value]])},[k(Mn,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):m("",!0)}}),Cn=g(An,[["__scopeId","data-v-12e08f5e"]]),Hn=p({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=L();return(n,a)=>i(t).features?(s(),_(Cn,{key:0,class:"VPHomeFeatures",features:i(t).features},null,8,["features"])):m("",!0)}}),Bn=p({__name:"VPHomeContent",setup(e){const{width:t}=De({initialWidth:0,includeScrollbar:!1});return(n,a)=>(s(),u("div",{class:"vp-doc container",style:Pe(i(t)?{"--vp-offset":`calc(50% - ${i(t)/2}px)`}:{})},[c(n.$slots,"default",{},void 0,!0)],4))}}),En=g(Bn,[["__scopeId","data-v-bcc25c44"]]),Fn=p({__name:"VPHome",setup(e){const{frontmatter:t,theme:n}=L();return(a,o)=>{const r=W("Content");return s(),u("div",{class:N(["VPHome",{"external-link-icon-enabled":i(n).externalLinkIcon}])},[c(a.$slots,"home-hero-before",{},void 0,!0),k(gn,null,{"home-hero-info-before":h(()=>[c(a.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(a.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(a.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(a.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(a.$slots,"home-hero-after",{},void 0,!0),c(a.$slots,"home-features-before",{},void 0,!0),k(Hn),c(a.$slots,"home-features-after",{},void 0,!0),i(t).markdownStyles!==!1?(s(),_(En,{key:0},{default:h(()=>[k(r)]),_:1})):(s(),_(r,{key:1}))],2)}}}),Dn=g(Fn,[["__scopeId","data-v-855f107a"]]),On={},Gn={class:"VPPage"};function Un(e,t){const n=W("Content");return s(),u("div",Gn,[c(e.$slots,"page-top"),k(n),c(e.$slots,"page-bottom")])}const jn=g(On,[["render",Un]]),zn=p({__name:"VPContent",setup(e){const{page:t,frontmatter:n}=L(),{hasSidebar:a}=D();return(o,r)=>(s(),u("div",{class:N(["VPContent",{"has-sidebar":i(a),"is-home":i(n).layout==="home"}]),id:"VPContent"},[i(t).isNotFound?c(o.$slots,"not-found",{key:0},()=>[k(rt)],!0):i(n).layout==="page"?(s(),_(jn,{key:1},{"page-top":h(()=>[c(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[c(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(n).layout==="home"?(s(),_(Dn,{key:2},{"home-hero-before":h(()=>[c(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":h(()=>[c(o.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(o.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(o.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[c(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[c(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[c(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(n).layout&&i(n).layout!=="doc"?(s(),_(B(i(n).layout),{key:3})):(s(),_(an,{key:4},{"doc-top":h(()=>[c(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[c(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":h(()=>[c(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[c(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[c(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":h(()=>[c(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":h(()=>[c(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":h(()=>[c(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),Wn=g(zn,[["__scopeId","data-v-9f0d4acb"]]),Kn={class:"container"},qn=["innerHTML"],Rn=["innerHTML"],Jn=p({__name:"VPFooter",setup(e){const{theme:t,frontmatter:n}=L(),{hasSidebar:a}=D();return(o,r)=>i(t).footer&&i(n).footer!==!1?(s(),u("footer",{key:0,class:N(["VPFooter",{"has-sidebar":i(a)}])},[d("div",Kn,[i(t).footer.message?(s(),u("p",{key:0,class:"message",innerHTML:i(t).footer.message},null,8,qn)):m("",!0),i(t).footer.copyright?(s(),u("p",{key:1,class:"copyright",innerHTML:i(t).footer.copyright},null,8,Rn)):m("",!0)])],2)):m("",!0)}}),Xn=g(Jn,[["__scopeId","data-v-6d4fdf1e"]]);function Yn(){const{theme:e,frontmatter:t}=L(),n=$e([]),a=y(()=>n.value.length>0);return Y(()=>{n.value=me(t.value.outline??e.value.outline)}),{headers:n,hasLocalNav:a}}const Qn={class:"menu-text"},Zn={class:"header"},ea={class:"outline"},ta=p({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(e){const t=e,{theme:n}=L(),a=S(!1),o=S(0),r=S(),l=S();function v(b){var P;(P=r.value)!=null&&P.contains(b.target)||(a.value=!1)}F(a,b=>{if(b){document.addEventListener("click",v);return}document.removeEventListener("click",v)}),ie("Escape",()=>{a.value=!1}),Y(()=>{a.value=!1});function f(){a.value=!a.value,o.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function $(b){b.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Le(()=>{a.value=!1}))}function V(){a.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,P)=>(s(),u("div",{class:"VPLocalNavOutlineDropdown",style:Pe({"--vp-vh":o.value+"px"}),ref_key:"main",ref:r},[e.headers.length>0?(s(),u("button",{key:0,onClick:f,class:N({open:a.value})},[d("span",Qn,M(i(Me)(i(n))),1),P[0]||(P[0]=d("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(s(),u("button",{key:1,onClick:V},M(i(n).returnToTopLabel||"Return to top"),1)),k(ue,{name:"flyout"},{default:h(()=>[a.value?(s(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:$},[d("div",Zn,[d("a",{class:"top-link",href:"#",onClick:V},M(i(n).returnToTopLabel||"Return to top"),1)]),d("div",ea,[k(xe,{headers:e.headers},null,8,["headers"])])],512)):m("",!0)]),_:1})],4))}}),na=g(ta,[["__scopeId","data-v-3ca9f49e"]]),aa={class:"container"},oa=["aria-expanded"],sa={class:"menu-text"},ia=p({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t,frontmatter:n}=L(),{hasSidebar:a}=D(),{headers:o}=Yn(),{y:r}=Ve(),l=S(0);U(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Y(()=>{o.value=me(n.value.outline??t.value.outline)});const v=y(()=>o.value.length===0),f=y(()=>v.value&&!a.value),$=y(()=>({VPLocalNav:!0,"has-sidebar":a.value,empty:v.value,fixed:f.value}));return(V,b)=>i(n).layout!=="home"&&(!f.value||i(r)>=l.value)?(s(),u("div",{key:0,class:N($.value)},[d("div",aa,[i(a)?(s(),u("button",{key:0,class:"menu","aria-expanded":e.open,"aria-controls":"VPSidebarNav",onClick:b[0]||(b[0]=P=>V.$emit("open-menu"))},[b[1]||(b[1]=d("span",{class:"vpi-align-left menu-icon"},null,-1)),d("span",sa,M(i(t).sidebarMenuLabel||"Menu"),1)],8,oa)):m("",!0),k(na,{headers:i(o),navHeight:l.value},null,8,["headers","navHeight"])])],2)):m("",!0)}}),ra=g(ia,[["__scopeId","data-v-f39a3298"]]);function la(){const e=S(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function a(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const r=Q();return F(()=>r.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:a}}const ca={},ua={class:"VPSwitch",type:"button",role:"switch"},da={class:"check"},va={key:0,class:"icon"};function fa(e,t){return s(),u("button",ua,[d("span",da,[e.$slots.default?(s(),u("span",va,[c(e.$slots,"default",{},void 0,!0)])):m("",!0)])])}const ha=g(ca,[["render",fa],["__scopeId","data-v-10be344e"]]),ma=p({__name:"VPSwitchAppearance",setup(e){const{isDark:t,theme:n}=L(),a=Z("toggle-appearance",()=>{t.value=!t.value}),o=S("");return fe(()=>{o.value=t.value?n.value.lightModeSwitchTitle||"Switch to light theme":n.value.darkModeSwitchTitle||"Switch to dark theme"}),(r,l)=>(s(),_(ha,{title:o.value,class:"VPSwitchAppearance","aria-checked":i(t),onClick:i(a)},{default:h(()=>[...l[0]||(l[0]=[d("span",{class:"vpi-sun sun"},null,-1),d("span",{class:"vpi-moon moon"},null,-1)])]),_:1},8,["title","aria-checked","onClick"]))}}),pe=g(ma,[["__scopeId","data-v-64116ff8"]]),pa={key:0,class:"VPNavBarAppearance"},ka=p({__name:"VPNavBarAppearance",setup(e){const{site:t}=L();return(n,a)=>i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",pa,[k(pe)])):m("",!0)}}),_a=g(ka,[["__scopeId","data-v-3c27bf39"]]),ke=S();let Ie=!1,oe=0;function ba(e){const t=S(!1);if(ee){!Ie&&ga(),oe++;const n=F(ke,a=>{var o,r,l;a===e.el.value||(o=e.el.value)!=null&&o.contains(a)?(t.value=!0,(r=e.onFocus)==null||r.call(e)):(t.value=!1,(l=e.onBlur)==null||l.call(e))});ve(()=>{n(),oe--,oe||$a()})}return Oe(t)}function ga(){document.addEventListener("focusin",we),Ie=!0,ke.value=document.activeElement}function $a(){document.removeEventListener("focusin",we)}function we(){ke.value=document.activeElement}const ya={class:"VPMenuLink"},Pa=["innerHTML"],La=p({__name:"VPMenuLink",props:{item:{}},setup(e){const{page:t}=L();return(n,a)=>(s(),u("div",ya,[k(E,{class:N({active:i(z)(i(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,Pa)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),te=g(La,[["__scopeId","data-v-f59d973b"]]),Va={class:"VPMenuGroup"},Sa={key:0,class:"title"},Ta=p({__name:"VPMenuGroup",props:{text:{},items:{}},setup(e){return(t,n)=>(s(),u("div",Va,[e.text?(s(),u("p",Sa,M(e.text),1)):m("",!0),(s(!0),u(x,null,A(e.items,a=>(s(),u(x,null,["link"in a?(s(),_(te,{key:0,item:a},null,8,["item"])):m("",!0)],64))),256))]))}}),Na=g(Ta,[["__scopeId","data-v-caeadd89"]]),Ma={class:"VPMenu"},xa={key:0,class:"items"},Ia=p({__name:"VPMenu",props:{items:{}},setup(e){return(t,n)=>(s(),u("div",Ma,[e.items?(s(),u("div",xa,[(s(!0),u(x,null,A(e.items,a=>(s(),u(x,{key:JSON.stringify(a)},["link"in a?(s(),_(te,{key:0,item:a},null,8,["item"])):"component"in a?(s(),_(B(a.component),G({key:1,ref_for:!0},a.props),null,16)):(s(),_(Na,{key:2,text:a.text,items:a.items},null,8,["text","items"]))],64))),128))])):m("",!0),c(t.$slots,"default",{},void 0,!0)]))}}),wa=g(Ia,[["__scopeId","data-v-cd155cfc"]]),Aa=["aria-expanded","aria-label"],Ca={key:0,class:"text"},Ha=["innerHTML"],Ba={key:1,class:"vpi-more-horizontal icon"},Ea={class:"menu"},Fa=p({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(e){const t=S(!1),n=S();ba({el:n,onBlur:a});function a(){t.value=!1}return(o,r)=>(s(),u("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:r[1]||(r[1]=l=>t.value=!0),onMouseleave:r[2]||(r[2]=l=>t.value=!1)},[d("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:r[0]||(r[0]=l=>t.value=!t.value)},[e.button||e.icon?(s(),u("span",Ca,[e.icon?(s(),u("span",{key:0,class:N([e.icon,"option-icon"])},null,2)):m("",!0),e.button?(s(),u("span",{key:1,innerHTML:e.button},null,8,Ha)):m("",!0),r[3]||(r[3]=d("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(s(),u("span",Ba))],8,Aa),d("div",Ea,[k(wa,{items:e.items},{default:h(()=>[c(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),_e=g(Fa,[["__scopeId","data-v-437eb093"]]),Da=["href","aria-label","innerHTML"],Oa=p({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(e){const t=e,n=S();U(async()=>{var r;await Le();const o=(r=n.value)==null?void 0:r.children[0];o instanceof HTMLElement&&o.className.startsWith("vpi-social-")&&(getComputedStyle(o).maskImage||getComputedStyle(o).webkitMaskImage)==="none"&&o.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${t.icon}.svg')`)});const a=y(()=>typeof t.icon=="object"?t.icon.svg:``);return(o,r)=>(s(),u("a",{ref_key:"el",ref:n,class:"VPSocialLink no-icon",href:e.link,"aria-label":e.ariaLabel??(typeof e.icon=="string"?e.icon:""),target:"_blank",rel:"noopener",innerHTML:a.value},null,8,Da))}}),Ga=g(Oa,[["__scopeId","data-v-4956e2a1"]]),Ua={class:"VPSocialLinks"},ja=p({__name:"VPSocialLinks",props:{links:{}},setup(e){return(t,n)=>(s(),u("div",Ua,[(s(!0),u(x,null,A(e.links,({link:a,icon:o,ariaLabel:r})=>(s(),_(Ga,{key:a,icon:o,link:a,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}}),be=g(ja,[["__scopeId","data-v-0148638c"]]),za={key:0,class:"group translations"},Wa={class:"trans-title"},Ka={key:1,class:"group"},qa={class:"item appearance"},Ra={class:"label"},Ja={class:"appearance-action"},Xa={key:2,class:"group"},Ya={class:"item social-links"},Qa=p({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=L(),{localeLinks:a,currentLang:o}=q({correspondingLink:!0}),r=y(()=>a.value.length&&o.value.label||t.value.appearance||n.value.socialLinks);return(l,v)=>r.value?(s(),_(_e,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:h(()=>[i(a).length&&i(o).label?(s(),u("div",za,[d("p",Wa,M(i(o).label),1),(s(!0),u(x,null,A(i(a),f=>(s(),_(te,{key:f.link,item:f},null,8,["item"]))),128))])):m("",!0),i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",Ka,[d("div",qa,[d("p",Ra,M(i(n).darkModeSwitchLabel||"Appearance"),1),d("div",Ja,[k(pe)])])])):m("",!0),i(n).socialLinks?(s(),u("div",Xa,[d("div",Ya,[k(be,{class:"social-links-list",links:i(n).socialLinks},null,8,["links"])])])):m("",!0)]),_:1})):m("",!0)}}),Za=g(Qa,[["__scopeId","data-v-86f141c1"]]),eo=["aria-expanded"],to=p({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(s(),u("button",{type:"button",class:N(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=a=>t.$emit("click"))},[...n[1]||(n[1]=[d("span",{class:"container"},[d("span",{class:"top"}),d("span",{class:"middle"}),d("span",{class:"bottom"})],-1)])],10,eo))}}),no=g(to,[["__scopeId","data-v-33023aa6"]]),ao=["innerHTML"],oo=p({__name:"VPNavBarMenuLink",props:{item:{}},setup(e){const{page:t}=L();return(n,a)=>(s(),_(E,{class:N({VPNavBarMenuLink:!0,active:i(z)(i(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,tabindex:"0"},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,ao)]),_:1},8,["class","href","target","rel","no-icon"]))}}),so=g(oo,[["__scopeId","data-v-dcff3482"]]),io=p({__name:"VPNavBarMenuGroup",props:{item:{}},setup(e){const t=e,{page:n}=L(),a=r=>"component"in r?!1:"link"in r?z(n.value.relativePath,r.link,!!t.item.activeMatch):r.items.some(a),o=y(()=>a(t.item));return(r,l)=>(s(),_(_e,{class:N({VPNavBarMenuGroup:!0,active:i(z)(i(n).relativePath,e.item.activeMatch,!!e.item.activeMatch)||o.value}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),ro={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},lo=p({__name:"VPNavBarMenu",setup(e){const{theme:t}=L();return(n,a)=>i(t).nav?(s(),u("nav",ro,[a[0]||(a[0]=d("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(s(!0),u(x,null,A(i(t).nav,o=>(s(),u(x,{key:JSON.stringify(o)},["link"in o?(s(),_(so,{key:0,item:o},null,8,["item"])):"component"in o?(s(),_(B(o.component),G({key:1,ref_for:!0},o.props),null,16)):(s(),_(io,{key:2,item:o},null,8,["item"]))],64))),128))])):m("",!0)}}),co=g(lo,[["__scopeId","data-v-eb72f9f7"]]);function uo(e){const{localeIndex:t,theme:n}=L();function a(o){var I,w,C;const r=o.split("."),l=(I=n.value.search)==null?void 0:I.options,v=l&&typeof l=="object",f=v&&((C=(w=l.locales)==null?void 0:w[t.value])==null?void 0:C.translations)||null,$=v&&l.translations||null;let V=f,b=$,P=e;const T=r.pop();for(const H of r){let O=null;const K=P==null?void 0:P[H];K&&(O=P=K);const ne=b==null?void 0:b[H];ne&&(O=b=ne);const ae=V==null?void 0:V[H];ae&&(O=V=ae),K||(P=O),ne||(b=O),ae||(V=O)}return(V==null?void 0:V[T])??(b==null?void 0:b[T])??(P==null?void 0:P[T])??""}return a}const vo=["aria-label"],fo={class:"DocSearch-Button-Container"},ho={class:"DocSearch-Button-Placeholder"},ge=p({__name:"VPNavBarSearchButton",setup(e){const n=uo({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(a,o)=>(s(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":i(n)("button.buttonAriaLabel")},[d("span",fo,[o[0]||(o[0]=d("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),d("span",ho,M(i(n)("button.buttonText")),1)]),o[1]||(o[1]=d("span",{class:"DocSearch-Button-Keys"},[d("kbd",{class:"DocSearch-Button-Key"}),d("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,vo))}}),mo={class:"VPNavBarSearch"},po={id:"local-search"},ko={key:1,id:"docsearch"},_o=p({__name:"VPNavBarSearch",setup(e){const t=Ge(()=>Ue(()=>import("./VPLocalSearchBox.D8eiblz9.js"),__vite__mapDeps([0,1]))),n=()=>null,{theme:a}=L(),o=S(!1),r=S(!1);U(()=>{});function l(){o.value||(o.value=!0,setTimeout(v,16))}function v(){const b=new Event("keydown");b.key="k",b.metaKey=!0,window.dispatchEvent(b),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||v()},16)}function f(b){const P=b.target,T=P.tagName;return P.isContentEditable||T==="INPUT"||T==="SELECT"||T==="TEXTAREA"}const $=S(!1);ie("k",b=>{(b.ctrlKey||b.metaKey)&&(b.preventDefault(),$.value=!0)}),ie("/",b=>{f(b)||(b.preventDefault(),$.value=!0)});const V="local";return(b,P)=>{var T;return s(),u("div",mo,[i(V)==="local"?(s(),u(x,{key:0},[$.value?(s(),_(i(t),{key:0,onClose:P[0]||(P[0]=I=>$.value=!1)})):m("",!0),d("div",po,[k(ge,{onClick:P[1]||(P[1]=I=>$.value=!0)})])],64)):i(V)==="algolia"?(s(),u(x,{key:1},[o.value?(s(),_(i(n),{key:0,algolia:((T=i(a).search)==null?void 0:T.options)??i(a).algolia,onVnodeBeforeMount:P[2]||(P[2]=I=>r.value=!0)},null,8,["algolia"])):m("",!0),r.value?m("",!0):(s(),u("div",ko,[k(ge,{onClick:l})]))],64)):m("",!0)])}}}),bo=p({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=L();return(n,a)=>i(t).socialLinks?(s(),_(be,{key:0,class:"VPNavBarSocialLinks",links:i(t).socialLinks},null,8,["links"])):m("",!0)}}),go=g(bo,[["__scopeId","data-v-b674b0d9"]]),$o=["href","rel","target"],yo=["innerHTML"],Po={key:2},Lo=p({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=L(),{hasSidebar:a}=D(),{currentLang:o}=q(),r=y(()=>{var f;return typeof n.value.logoLink=="string"?n.value.logoLink:(f=n.value.logoLink)==null?void 0:f.link}),l=y(()=>{var f;return typeof n.value.logoLink=="string"||(f=n.value.logoLink)==null?void 0:f.rel}),v=y(()=>{var f;return typeof n.value.logoLink=="string"||(f=n.value.logoLink)==null?void 0:f.target});return(f,$)=>(s(),u("div",{class:N(["VPNavBarTitle",{"has-sidebar":i(a)}])},[d("a",{class:"title",href:r.value??i(he)(i(o).link),rel:l.value,target:v.value},[c(f.$slots,"nav-bar-title-before",{},void 0,!0),i(n).logo?(s(),_(J,{key:0,class:"logo",image:i(n).logo},null,8,["image"])):m("",!0),i(n).siteTitle?(s(),u("span",{key:1,innerHTML:i(n).siteTitle},null,8,yo)):i(n).siteTitle===void 0?(s(),u("span",Po,M(i(t).title),1)):m("",!0),c(f.$slots,"nav-bar-title-after",{},void 0,!0)],8,$o)],2))}}),Vo=g(Lo,[["__scopeId","data-v-77b887c2"]]),So={class:"items"},To={class:"title"},No=p({__name:"VPNavBarTranslations",setup(e){const{theme:t}=L(),{localeLinks:n,currentLang:a}=q({correspondingLink:!0});return(o,r)=>i(n).length&&i(a).label?(s(),_(_e,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:i(t).langMenuLabel||"Change language"},{default:h(()=>[d("div",So,[d("p",To,M(i(a).label),1),(s(!0),u(x,null,A(i(n),l=>(s(),_(te,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):m("",!0)}}),Mo=g(No,[["__scopeId","data-v-d3f6c3ed"]]),xo={class:"wrapper"},Io={class:"container"},wo={class:"title"},Ao={class:"content"},Co={class:"content-body"},Ho=p({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const t=e,{y:n}=Ve(),{hasSidebar:a}=D(),{frontmatter:o}=L(),r=S({});return fe(()=>{r.value={"has-sidebar":a.value,home:o.value.layout==="home",top:n.value===0,"screen-open":t.isScreenOpen}}),(l,v)=>(s(),u("div",{class:N(["VPNavBar",r.value])},[d("div",xo,[d("div",Io,[d("div",wo,[k(Vo,null,{"nav-bar-title-before":h(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),d("div",Ao,[d("div",Co,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),k(_o,{class:"search"}),k(co,{class:"menu"}),k(Mo,{class:"translations"}),k(_a,{class:"appearance"}),k(go,{class:"social-links"}),k(Za,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),k(no,{class:"hamburger",active:e.isScreenOpen,onClick:v[0]||(v[0]=f=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),v[1]||(v[1]=d("div",{class:"divider"},[d("div",{class:"divider-line"})],-1))],2))}}),Bo=g(Ho,[["__scopeId","data-v-59b07c45"]]),Eo={key:0,class:"VPNavScreenAppearance"},Fo={class:"text"},Do=p({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=L();return(a,o)=>i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",Eo,[d("p",Fo,M(i(n).darkModeSwitchLabel||"Appearance"),1),k(pe)])):m("",!0)}}),Oo=g(Do,[["__scopeId","data-v-77e37dd8"]]),Go=["innerHTML"],Uo=p({__name:"VPNavScreenMenuLink",props:{item:{}},setup(e){const t=Z("close-screen");return(n,a)=>(s(),_(E,{class:"VPNavScreenMenuLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:i(t)},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,Go)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),jo=g(Uo,[["__scopeId","data-v-6680c343"]]),zo=["innerHTML"],Wo=p({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(e){const t=Z("close-screen");return(n,a)=>(s(),_(E,{class:"VPNavScreenMenuGroupLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:i(t)},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,zo)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Ae=g(Wo,[["__scopeId","data-v-bcef7725"]]),Ko={class:"VPNavScreenMenuGroupSection"},qo={key:0,class:"title"},Ro=p({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(e){return(t,n)=>(s(),u("div",Ko,[e.text?(s(),u("p",qo,M(e.text),1)):m("",!0),(s(!0),u(x,null,A(e.items,a=>(s(),_(Ae,{key:a.text,item:a},null,8,["item"]))),128))]))}}),Jo=g(Ro,[["__scopeId","data-v-f6adf3a2"]]),Xo=["aria-controls","aria-expanded"],Yo=["innerHTML"],Qo=["id"],Zo={key:0,class:"item"},es={key:1,class:"item"},ts={key:2,class:"group"},ns=p({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(e){const t=e,n=S(!1),a=y(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){n.value=!n.value}return(r,l)=>(s(),u("div",{class:N(["VPNavScreenMenuGroup",{open:n.value}])},[d("button",{class:"button","aria-controls":a.value,"aria-expanded":n.value,onClick:o},[d("span",{class:"button-text",innerHTML:e.text},null,8,Yo),l[0]||(l[0]=d("span",{class:"vpi-plus button-icon"},null,-1))],8,Xo),d("div",{id:a.value,class:"items"},[(s(!0),u(x,null,A(e.items,v=>(s(),u(x,{key:JSON.stringify(v)},["link"in v?(s(),u("div",Zo,[k(Ae,{item:v},null,8,["item"])])):"component"in v?(s(),u("div",es,[(s(),_(B(v.component),G({ref_for:!0},v.props,{"screen-menu":""}),null,16))])):(s(),u("div",ts,[k(Jo,{text:v.text,items:v.items},null,8,["text","items"])]))],64))),128))],8,Qo)],2))}}),as=g(ns,[["__scopeId","data-v-2989dfaf"]]),os={key:0,class:"VPNavScreenMenu"},ss=p({__name:"VPNavScreenMenu",setup(e){const{theme:t}=L();return(n,a)=>i(t).nav?(s(),u("nav",os,[(s(!0),u(x,null,A(i(t).nav,o=>(s(),u(x,{key:JSON.stringify(o)},["link"in o?(s(),_(jo,{key:0,item:o},null,8,["item"])):"component"in o?(s(),_(B(o.component),G({key:1,ref_for:!0},o.props,{"screen-menu":""}),null,16)):(s(),_(as,{key:2,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):m("",!0)}}),is=p({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=L();return(n,a)=>i(t).socialLinks?(s(),_(be,{key:0,class:"VPNavScreenSocialLinks",links:i(t).socialLinks},null,8,["links"])):m("",!0)}}),rs={class:"list"},ls=p({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=q({correspondingLink:!0}),a=S(!1);function o(){a.value=!a.value}return(r,l)=>i(t).length&&i(n).label?(s(),u("div",{key:0,class:N(["VPNavScreenTranslations",{open:a.value}])},[d("button",{class:"title",onClick:o},[l[0]||(l[0]=d("span",{class:"vpi-languages icon lang"},null,-1)),j(" "+M(i(n).label)+" ",1),l[1]||(l[1]=d("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),d("ul",rs,[(s(!0),u(x,null,A(i(t),v=>(s(),u("li",{key:v.link,class:"item"},[k(E,{class:"link",href:v.link},{default:h(()=>[j(M(v.text),1)]),_:2},1032,["href"])]))),128))])],2)):m("",!0)}}),cs=g(ls,[["__scopeId","data-v-4742671a"]]),us={class:"container"},ds=p({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=S(null),n=Se(ee?document.body:null);return(a,o)=>(s(),_(ue,{name:"fade",onEnter:o[0]||(o[0]=r=>n.value=!0),onAfterLeave:o[1]||(o[1]=r=>n.value=!1)},{default:h(()=>[e.open?(s(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[d("div",us,[c(a.$slots,"nav-screen-content-before",{},void 0,!0),k(ss,{class:"menu"}),k(cs,{class:"translations"}),k(Oo,{class:"appearance"}),k(is,{class:"social-links"}),c(a.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):m("",!0)]),_:3}))}}),vs=g(ds,[["__scopeId","data-v-e824f21d"]]),fs={key:0,class:"VPNav"},hs=p({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:a}=la(),{frontmatter:o}=L(),r=y(()=>o.value.navbar!==!1);return Te("close-screen",n),X(()=>{ee&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(l,v)=>r.value?(s(),u("header",fs,[k(Bo,{"is-screen-open":i(t),onToggleScreen:i(a)},{"nav-bar-title-before":h(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),k(vs,{open:i(t)},{"nav-screen-content-before":h(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):m("",!0)}}),ms=g(hs,[["__scopeId","data-v-ae3b4e71"]]),ps=["role","tabindex"],ks={key:1,class:"items"},_s=p({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(e){const t=e,{collapsed:n,collapsible:a,isLink:o,isActiveLink:r,hasActiveLink:l,hasChildren:v,toggle:f}=dt(y(()=>t.item)),$=y(()=>v.value?"section":"div"),V=y(()=>o.value?"a":"div"),b=y(()=>v.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),P=y(()=>o.value?void 0:"button"),T=y(()=>[[`level-${t.depth}`],{collapsible:a.value},{collapsed:n.value},{"is-link":o.value},{"is-active":r.value},{"has-active":l.value}]);function I(C){"key"in C&&C.key!=="Enter"||!t.item.link&&f()}function w(){t.item.link&&f()}return(C,H)=>{const O=W("VPSidebarItem",!0);return s(),_(B($.value),{class:N(["VPSidebarItem",T.value])},{default:h(()=>[e.item.text?(s(),u("div",G({key:0,class:"item",role:P.value},je(e.item.items?{click:I,keydown:I}:{},!0),{tabindex:e.item.items&&0}),[H[1]||(H[1]=d("div",{class:"indicator"},null,-1)),e.item.link?(s(),_(E,{key:0,tag:V.value,class:"link",href:e.item.link,rel:e.item.rel,target:e.item.target},{default:h(()=>[(s(),_(B(b.value),{class:"text",innerHTML:e.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(s(),_(B(b.value),{key:1,class:"text",innerHTML:e.item.text},null,8,["innerHTML"])),e.item.collapsed!=null&&e.item.items&&e.item.items.length?(s(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:w,onKeydown:ze(w,["enter"]),tabindex:"0"},[...H[0]||(H[0]=[d("span",{class:"vpi-chevron-right caret-icon"},null,-1)])],32)):m("",!0)],16,ps)):m("",!0),e.item.items&&e.item.items.length?(s(),u("div",ks,[e.depth<5?(s(!0),u(x,{key:0},A(e.item.items,K=>(s(),_(O,{key:K.text,item:K,depth:e.depth+1},null,8,["item","depth"]))),128)):m("",!0)])):m("",!0)]),_:1},8,["class"])}}}),bs=g(_s,[["__scopeId","data-v-51c3a27f"]]),gs=p({__name:"VPSidebarGroup",props:{items:{}},setup(e){const t=S(!0);let n=null;return U(()=>{n=setTimeout(()=>{n=null,t.value=!1},300)}),We(()=>{n!=null&&(clearTimeout(n),n=null)}),(a,o)=>(s(!0),u(x,null,A(e.items,r=>(s(),u("div",{key:r.text,class:N(["group",{"no-transition":t.value}])},[k(bs,{item:r,depth:0},null,8,["item"])],2))),128))}}),$s=g(gs,[["__scopeId","data-v-bb61ce6c"]]),ys={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Ps=p({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const{sidebarGroups:t,hasSidebar:n}=D(),a=e,o=S(null),r=Se(ee?document.body:null);F([a,o],()=>{var v;a.open?(r.value=!0,(v=o.value)==null||v.focus()):r.value=!1},{immediate:!0,flush:"post"});const l=S(0);return F(t,()=>{l.value+=1},{deep:!0}),(v,f)=>i(n)?(s(),u("aside",{key:0,class:N(["VPSidebar",{open:e.open}]),ref_key:"navEl",ref:o,onClick:f[0]||(f[0]=Ke(()=>{},["stop"]))},[f[2]||(f[2]=d("div",{class:"curtain"},null,-1)),d("nav",ys,[f[1]||(f[1]=d("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),c(v.$slots,"sidebar-nav-before",{},void 0,!0),(s(),_($s,{items:i(t),key:l.value},null,8,["items"])),c(v.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):m("",!0)}}),Ls=g(Ps,[["__scopeId","data-v-450ac41d"]]),Vs=p({__name:"VPSkipLink",setup(e){const{theme:t}=L(),n=Q(),a=S();F(()=>n.path,()=>a.value.focus());function o({target:r}){const l=document.getElementById(decodeURIComponent(r.hash).slice(1));if(l){const v=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",v)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",v),l.focus(),window.scrollTo(0,0)}}return(r,l)=>(s(),u(x,null,[d("span",{ref_key:"backToTop",ref:a,tabindex:"-1"},null,512),d("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o},M(i(t).skipToContentLabel||"Skip to content"),1)],64))}}),Ss=g(Vs,[["__scopeId","data-v-20ff5aae"]]),Ts=p({__name:"Layout",setup(e){const{isOpen:t,open:n,close:a}=D(),o=Q();F(()=>o.path,a),ut(t,a);const{frontmatter:r}=L(),l=qe(),v=y(()=>!!l["home-hero-image"]);return Te("hero-image-slot-exists",v),(f,$)=>{const V=W("Content");return i(r).layout!==!1?(s(),u("div",{key:0,class:N(["Layout",i(r).pageClass])},[c(f.$slots,"layout-top",{},void 0,!0),k(Ss),k(Ye,{class:"backdrop",show:i(t),onClick:i(a)},null,8,["show","onClick"]),k(ms,null,{"nav-bar-title-before":h(()=>[c(f.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(f.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[c(f.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[c(f.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":h(()=>[c(f.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[c(f.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),k(ra,{open:i(t),onOpenMenu:i(n)},null,8,["open","onOpenMenu"]),k(Ls,{open:i(t)},{"sidebar-nav-before":h(()=>[c(f.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":h(()=>[c(f.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),k(Wn,null,{"page-top":h(()=>[c(f.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[c(f.$slots,"page-bottom",{},void 0,!0)]),"not-found":h(()=>[c(f.$slots,"not-found",{},void 0,!0)]),"home-hero-before":h(()=>[c(f.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":h(()=>[c(f.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(f.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(f.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(f.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(f.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[c(f.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[c(f.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[c(f.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":h(()=>[c(f.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[c(f.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[c(f.$slots,"doc-after",{},void 0,!0)]),"doc-top":h(()=>[c(f.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[c(f.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":h(()=>[c(f.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[c(f.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[c(f.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(f.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(f.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(f.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),k(Xn),c(f.$slots,"layout-bottom",{},void 0,!0)],2)):(s(),_(V,{key:1}))}}}),Ns=g(Ts,[["__scopeId","data-v-c2d1c289"]]),xs={Layout:Ns,enhanceApp:({app:e})=>{e.component("Badge",Re)}};export{uo as c,xs as t,L as u}; diff --git a/assets/getting-started_access.md.CLfgJOzW.js b/assets/getting-started_access.md.Co5O-s2T.js similarity index 99% rename from assets/getting-started_access.md.CLfgJOzW.js rename to assets/getting-started_access.md.Co5O-s2T.js index 9ce47238..401a82a6 100644 --- a/assets/getting-started_access.md.CLfgJOzW.js +++ b/assets/getting-started_access.md.Co5O-s2T.js @@ -1 +1 @@ -import{_ as t,o,c as a,ag as r}from"./chunks/framework.CvgP6Fyv.js";const g=JSON.parse('{"title":"Bot Access Control","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/access.md","filePath":"getting-started/access.md","lastUpdated":1774787421000}'),s={name:"getting-started/access.md"};function n(l,e,i,c,d,h){return o(),a("div",null,[...e[0]||(e[0]=[r('

Bot Access Control

Memoh uses an ACL (Access Control List) system to control who can interact with your bot. You can define prioritized rules to allow or deny specific users, channel identities, or entire channel types — all from the bot's Access tab.


Concepts

Default Effect

Each bot has a default effect (allow or deny) that applies when no ACL rule matches an incoming message. Configure this in the bot's General tab under ACL Default Effect.

  • Allow: Anyone can chat with the bot unless explicitly denied by a rule.
  • Deny: Only the bot owner, admins, and explicitly allowed subjects can chat.

Subject Types

ACL rules can target three kinds of subjects:

SubjectDescription
AllMatches every incoming message regardless of sender. Use this for global allow/deny rules.
Channel IdentityA specific identity on an external channel (e.g., a Telegram user, a Discord member). Useful for controlling access at the individual level.
Channel TypeAn entire channel platform (e.g., all Telegram users, all Discord users). Useful for platform-level access control.

Rule Effects

Each rule has an effect:

  • Allow — Grants the subject permission to chat with the bot.
  • Deny — Blocks the subject from chatting with the bot.

Priority-Based Evaluation

Rules are evaluated in priority order (top to bottom). The first matching rule determines the outcome:

  1. Bot owner or system admin → Always allowed (bypasses ACL).
  2. Rules are checked from highest priority (top) to lowest (bottom).
  3. The first rule whose subject matches the sender is applied.
  4. If no rule matches → the default effect is applied.

This means rule ordering matters. A deny rule placed above an allow rule will take precedence for matching subjects.


Managing Access

Open a bot's Access tab to configure its access control.

Adding Rules

  1. Click Add Rule.
  2. Select a subject type:
    • All: Applies to everyone.
    • Channel Identity: Search and select a specific channel identity the bot has seen before.
    • Channel Type: Select an entire channel platform.
  3. Choose the effect: allow or deny.
  4. Optionally set source scope to restrict the rule to a specific context:
    • Channel: Only applies when the message comes from a specific channel config.
    • Conversation Type: private, group, or thread.
    • Conversation ID: A specific chat/group ID.
    • Thread ID: A specific thread within a conversation (requires Conversation ID).
  5. Click Save.

Reordering Rules

Rules can be drag-and-dropped to change their priority. Higher rules (closer to the top) are evaluated first. After reordering, click Save to persist the new order.

Source Scope

Source scope lets you create fine-grained rules. For example:

  • Allow a user to chat only via Telegram, but not Discord.
  • Block an entire channel type only in group conversations.
  • Restrict access to a specific thread in a specific group.

Scope fields form a hierarchy: Channel → Conversation Type → Conversation ID → Thread ID. Each level is optional, but a Thread ID requires a Conversation ID.


Examples

Open Bot (Anyone Can Chat)

  1. Set ACL Default Effect to allow in the General tab.
  2. No rules needed — everyone is allowed by default.

Private Bot with Selected Users

  1. Set ACL Default Effect to deny.
  2. Add allow rules for each authorized channel identity.
  3. Only listed subjects (plus the bot owner and admins) can trigger the bot.

Open Bot with Blocked Users

  1. Set ACL Default Effect to allow.
  2. Add deny rules for problematic channel identities at the top of the list.
  3. Everyone except denied subjects can chat with the bot.

Platform-Specific Access

  1. Set ACL Default Effect to deny.
  2. Add an allow rule with subject type Channel Type set to telegram.
  3. Only Telegram users can chat with the bot — messages from other channels are denied.

Channel-Scoped Access

  1. Add an allow rule for a specific channel identity.
  2. Set the Source Scope channel to your Telegram channel config.
  3. The user can only chat with the bot via that specific Telegram channel.
',40)])])}const p=t(s,[["render",n]]);export{g as __pageData,p as default}; +import{_ as t,o,c as a,ag as r}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Bot Access Control","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/access.md","filePath":"getting-started/access.md","lastUpdated":1774787421000}'),s={name:"getting-started/access.md"};function n(l,e,i,c,d,h){return o(),a("div",null,[...e[0]||(e[0]=[r('

Bot Access Control

Memoh uses an ACL (Access Control List) system to control who can interact with your bot. You can define prioritized rules to allow or deny specific users, channel identities, or entire channel types — all from the bot's Access tab.


Concepts

Default Effect

Each bot has a default effect (allow or deny) that applies when no ACL rule matches an incoming message. Configure this in the bot's General tab under ACL Default Effect.

  • Allow: Anyone can chat with the bot unless explicitly denied by a rule.
  • Deny: Only the bot owner, admins, and explicitly allowed subjects can chat.

Subject Types

ACL rules can target three kinds of subjects:

SubjectDescription
AllMatches every incoming message regardless of sender. Use this for global allow/deny rules.
Channel IdentityA specific identity on an external channel (e.g., a Telegram user, a Discord member). Useful for controlling access at the individual level.
Channel TypeAn entire channel platform (e.g., all Telegram users, all Discord users). Useful for platform-level access control.

Rule Effects

Each rule has an effect:

  • Allow — Grants the subject permission to chat with the bot.
  • Deny — Blocks the subject from chatting with the bot.

Priority-Based Evaluation

Rules are evaluated in priority order (top to bottom). The first matching rule determines the outcome:

  1. Bot owner or system admin → Always allowed (bypasses ACL).
  2. Rules are checked from highest priority (top) to lowest (bottom).
  3. The first rule whose subject matches the sender is applied.
  4. If no rule matches → the default effect is applied.

This means rule ordering matters. A deny rule placed above an allow rule will take precedence for matching subjects.


Managing Access

Open a bot's Access tab to configure its access control.

Adding Rules

  1. Click Add Rule.
  2. Select a subject type:
    • All: Applies to everyone.
    • Channel Identity: Search and select a specific channel identity the bot has seen before.
    • Channel Type: Select an entire channel platform.
  3. Choose the effect: allow or deny.
  4. Optionally set source scope to restrict the rule to a specific context:
    • Channel: Only applies when the message comes from a specific channel config.
    • Conversation Type: private, group, or thread.
    • Conversation ID: A specific chat/group ID.
    • Thread ID: A specific thread within a conversation (requires Conversation ID).
  5. Click Save.

Reordering Rules

Rules can be drag-and-dropped to change their priority. Higher rules (closer to the top) are evaluated first. After reordering, click Save to persist the new order.

Source Scope

Source scope lets you create fine-grained rules. For example:

  • Allow a user to chat only via Telegram, but not Discord.
  • Block an entire channel type only in group conversations.
  • Restrict access to a specific thread in a specific group.

Scope fields form a hierarchy: Channel → Conversation Type → Conversation ID → Thread ID. Each level is optional, but a Thread ID requires a Conversation ID.


Examples

Open Bot (Anyone Can Chat)

  1. Set ACL Default Effect to allow in the General tab.
  2. No rules needed — everyone is allowed by default.

Private Bot with Selected Users

  1. Set ACL Default Effect to deny.
  2. Add allow rules for each authorized channel identity.
  3. Only listed subjects (plus the bot owner and admins) can trigger the bot.

Open Bot with Blocked Users

  1. Set ACL Default Effect to allow.
  2. Add deny rules for problematic channel identities at the top of the list.
  3. Everyone except denied subjects can chat with the bot.

Platform-Specific Access

  1. Set ACL Default Effect to deny.
  2. Add an allow rule with subject type Channel Type set to telegram.
  3. Only Telegram users can chat with the bot — messages from other channels are denied.

Channel-Scoped Access

  1. Add an allow rule for a specific channel identity.
  2. Set the Source Scope channel to your Telegram channel config.
  3. The user can only chat with the bot via that specific Telegram channel.
',40)])])}const p=t(s,[["render",n]]);export{g as __pageData,p as default}; diff --git a/assets/getting-started_access.md.CLfgJOzW.lean.js b/assets/getting-started_access.md.Co5O-s2T.lean.js similarity index 86% rename from assets/getting-started_access.md.CLfgJOzW.lean.js rename to assets/getting-started_access.md.Co5O-s2T.lean.js index 65800ef6..7a93a5c4 100644 --- a/assets/getting-started_access.md.CLfgJOzW.lean.js +++ b/assets/getting-started_access.md.Co5O-s2T.lean.js @@ -1 +1 @@ -import{_ as t,o,c as a,ag as r}from"./chunks/framework.CvgP6Fyv.js";const g=JSON.parse('{"title":"Bot Access Control","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/access.md","filePath":"getting-started/access.md","lastUpdated":1774787421000}'),s={name:"getting-started/access.md"};function n(l,e,i,c,d,h){return o(),a("div",null,[...e[0]||(e[0]=[r("",40)])])}const p=t(s,[["render",n]]);export{g as __pageData,p as default}; +import{_ as t,o,c as a,ag as r}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Bot Access Control","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/access.md","filePath":"getting-started/access.md","lastUpdated":1774787421000}'),s={name:"getting-started/access.md"};function n(l,e,i,c,d,h){return o(),a("div",null,[...e[0]||(e[0]=[r("",40)])])}const p=t(s,[["render",n]]);export{g as __pageData,p as default}; diff --git a/assets/getting-started_bot.md.28IQBvMi.js b/assets/getting-started_bot.md.CULM4cGX.js similarity index 98% rename from assets/getting-started_bot.md.28IQBvMi.js rename to assets/getting-started_bot.md.CULM4cGX.js index a74d4f05..21c808cc 100644 --- a/assets/getting-started_bot.md.28IQBvMi.js +++ b/assets/getting-started_bot.md.CULM4cGX.js @@ -1 +1 @@ -import{_ as e,o as r,c as o,ag as a}from"./chunks/framework.CvgP6Fyv.js";const m=JSON.parse('{"title":"Bot Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/bot.md","filePath":"getting-started/bot.md","lastUpdated":1774787421000}'),n={name:"getting-started/bot.md"};function i(s,t,d,l,g,c){return r(),o("div",null,[...t[0]||(t[0]=[a('

Bot Management

A Bot is an independent AI agent that comes with its own isolated container, persistent memory, and configurable personality. Bots can chat via various messaging platforms (Channels) and perform complex tasks using specialized tools.

Creating a Bot

  1. Navigate to the Bots page from the sidebar.
  2. Click the Create Bot button.
  3. Fill in the basic info:
    • Display Name: The name users will see in chats.
    • Avatar: A URL for the bot's profile picture.
  4. Click Create.

Bot Detail Page

Once created, clicking on a bot card takes you to its Detail Page, where you can manage its entire lifecycle through specialized tabs.

Tab Overview

TabDescription
OverviewHealth checks for container, database, channels, and memory.
GeneralCore settings: models, providers, reasoning, heartbeat, compaction, and danger zone.
ContainerContainer lifecycle (create/start/stop), snapshots, data export/import.
MemoryBrowse, search, create, edit, and compact memories.
PlatformsChannel configurations (Telegram, Discord, Feishu, QQ, Matrix, WeCom, WeChat, Web).
AccessACL rules — control who can chat with the bot.
EmailEmail bindings and outbox.
TerminalInteractive terminal access to the bot's container.
FilesFile manager for the bot's container filesystem.
MCPMCP connection management (Stdio, Remote, OAuth).
HeartbeatHeartbeat configuration and execution logs.
CompactionMemory compaction logs.
ScheduleCron-based scheduled tasks and execution logs.
SkillsMarkdown-based skill files that define bot personality and capabilities.

Configuring the Bot's Core Settings

After creating a bot, the most important step is configuring its runtime settings. These define how the bot talks, remembers, searches, and uses browser automation.

  1. Navigate to your bot's Detail Page.
  2. Go to the General tab.
  3. Configure the core fields:
    • Chat Model: Used for standard conversations with users.
    • Memory Provider: Select the memory backend the bot should use.
    • Search Provider: Select the search engine provider for web search.
    • Browser Context: Select the browser profile the bot should use for browser automation.
  4. Click Save at the bottom of the form.

If you have not created these resources yet, set them up first:


General Tab Reference

The General tab contains all the core parameters that define your bot's behavior and runtime configuration.

FieldDescription
Chat ModelThe main LLM used for generating chat responses.
Memory ProviderThe memory backend assigned to the bot. The built-in provider can optionally define its own memory and embedding models.
Search ProviderThe search engine used for web browsing capabilities.
Browser ContextThe browser environment used for web automation, such as viewport, locale, and mobile behavior.
LanguageThe bot's primary communication language.
Reasoning EnabledIf the selected model supports reasoning (like OpenAI o1), enable this to use its deep thinking capabilities.
Reasoning EffortSet the level of reasoning effort (low, medium, high).
Heartbeat EnabledToggle periodic autonomous activity.
Heartbeat IntervalHow often (in minutes) the heartbeat triggers.
Heartbeat ModelThe LLM used for heartbeat tasks (can differ from the chat model).
Compaction EnabledToggle automatic memory compaction.
Compaction ModelThe LLM used for memory compaction.
ACL Default EffectDefault access control behavior (allow or deny) when no ACL rule matches.

Terminal Tab

The Terminal tab provides interactive shell access to the bot's container:

  • Open multiple terminal tabs simultaneously.
  • Execute commands directly inside the container.
  • Requires the container to be running.

Deleting a Bot

To permanently remove a bot and all its associated data (including container files and memory):

  1. Navigate to the General tab in the Bot Detail page.
  2. Scroll to the Danger Zone at the bottom.
  3. Click Delete Bot and confirm the action.

Warning: This action is irreversible. All persistent data for this bot will be lost.

',28)])])}const b=e(n,[["render",i]]);export{m as __pageData,b as default}; +import{_ as e,o as r,c as o,ag as a}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Bot Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/bot.md","filePath":"getting-started/bot.md","lastUpdated":1774787421000}'),n={name:"getting-started/bot.md"};function i(s,t,d,l,g,c){return r(),o("div",null,[...t[0]||(t[0]=[a('

Bot Management

A Bot is an independent AI agent that comes with its own isolated container, persistent memory, and configurable personality. Bots can chat via various messaging platforms (Channels) and perform complex tasks using specialized tools.

Creating a Bot

  1. Navigate to the Bots page from the sidebar.
  2. Click the Create Bot button.
  3. Fill in the basic info:
    • Display Name: The name users will see in chats.
    • Avatar: A URL for the bot's profile picture.
  4. Click Create.

Bot Detail Page

Once created, clicking on a bot card takes you to its Detail Page, where you can manage its entire lifecycle through specialized tabs.

Tab Overview

TabDescription
OverviewHealth checks for container, database, channels, and memory.
GeneralCore settings: models, providers, reasoning, heartbeat, compaction, and danger zone.
ContainerContainer lifecycle (create/start/stop), snapshots, data export/import.
MemoryBrowse, search, create, edit, and compact memories.
PlatformsChannel configurations (Telegram, Discord, Feishu, QQ, Matrix, WeCom, WeChat, Web).
AccessACL rules — control who can chat with the bot.
EmailEmail bindings and outbox.
TerminalInteractive terminal access to the bot's container.
FilesFile manager for the bot's container filesystem.
MCPMCP connection management (Stdio, Remote, OAuth).
HeartbeatHeartbeat configuration and execution logs.
CompactionMemory compaction logs.
ScheduleCron-based scheduled tasks and execution logs.
SkillsMarkdown-based skill files that define bot personality and capabilities.

Configuring the Bot's Core Settings

After creating a bot, the most important step is configuring its runtime settings. These define how the bot talks, remembers, searches, and uses browser automation.

  1. Navigate to your bot's Detail Page.
  2. Go to the General tab.
  3. Configure the core fields:
    • Chat Model: Used for standard conversations with users.
    • Memory Provider: Select the memory backend the bot should use.
    • Search Provider: Select the search engine provider for web search.
    • Browser Context: Select the browser profile the bot should use for browser automation.
  4. Click Save at the bottom of the form.

If you have not created these resources yet, set them up first:


General Tab Reference

The General tab contains all the core parameters that define your bot's behavior and runtime configuration.

FieldDescription
Chat ModelThe main LLM used for generating chat responses.
Memory ProviderThe memory backend assigned to the bot. The built-in provider can optionally define its own memory and embedding models.
Search ProviderThe search engine used for web browsing capabilities.
Browser ContextThe browser environment used for web automation, such as viewport, locale, and mobile behavior.
LanguageThe bot's primary communication language.
Reasoning EnabledIf the selected model supports reasoning (like OpenAI o1), enable this to use its deep thinking capabilities.
Reasoning EffortSet the level of reasoning effort (low, medium, high).
Heartbeat EnabledToggle periodic autonomous activity.
Heartbeat IntervalHow often (in minutes) the heartbeat triggers.
Heartbeat ModelThe LLM used for heartbeat tasks (can differ from the chat model).
Compaction EnabledToggle automatic memory compaction.
Compaction ModelThe LLM used for memory compaction.
ACL Default EffectDefault access control behavior (allow or deny) when no ACL rule matches.

Terminal Tab

The Terminal tab provides interactive shell access to the bot's container:

  • Open multiple terminal tabs simultaneously.
  • Execute commands directly inside the container.
  • Requires the container to be running.

Deleting a Bot

To permanently remove a bot and all its associated data (including container files and memory):

  1. Navigate to the General tab in the Bot Detail page.
  2. Scroll to the Danger Zone at the bottom.
  3. Click Delete Bot and confirm the action.

Warning: This action is irreversible. All persistent data for this bot will be lost.

',28)])])}const b=e(n,[["render",i]]);export{m as __pageData,b as default}; diff --git a/assets/getting-started_bot.md.28IQBvMi.lean.js b/assets/getting-started_bot.md.CULM4cGX.lean.js similarity index 71% rename from assets/getting-started_bot.md.28IQBvMi.lean.js rename to assets/getting-started_bot.md.CULM4cGX.lean.js index 410ebbf1..b77eb334 100644 --- a/assets/getting-started_bot.md.28IQBvMi.lean.js +++ b/assets/getting-started_bot.md.CULM4cGX.lean.js @@ -1 +1 @@ -import{_ as e,o as r,c as o,ag as a}from"./chunks/framework.CvgP6Fyv.js";const m=JSON.parse('{"title":"Bot Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/bot.md","filePath":"getting-started/bot.md","lastUpdated":1774787421000}'),n={name:"getting-started/bot.md"};function i(s,t,d,l,g,c){return r(),o("div",null,[...t[0]||(t[0]=[a("",28)])])}const b=e(n,[["render",i]]);export{m as __pageData,b as default}; +import{_ as e,o as r,c as o,ag as a}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Bot Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/bot.md","filePath":"getting-started/bot.md","lastUpdated":1774787421000}'),n={name:"getting-started/bot.md"};function i(s,t,d,l,g,c){return r(),o("div",null,[...t[0]||(t[0]=[a("",28)])])}const b=e(n,[["render",i]]);export{m as __pageData,b as default}; diff --git a/assets/getting-started_browser.md.DHWZP7Sw.js b/assets/getting-started_browser.md.Cjpk7h3a.js similarity index 99% rename from assets/getting-started_browser.md.DHWZP7Sw.js rename to assets/getting-started_browser.md.Cjpk7h3a.js index f47efebf..e55eaeb6 100644 --- a/assets/getting-started_browser.md.DHWZP7Sw.js +++ b/assets/getting-started_browser.md.Cjpk7h3a.js @@ -1 +1 @@ -import{_ as e,o,c as r,ag as a}from"./chunks/framework.CvgP6Fyv.js";const p=JSON.parse('{"title":"Browser Contexts","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/browser.md","filePath":"getting-started/browser.md","lastUpdated":1774787421000}'),s={name:"getting-started/browser.md"};function i(n,t,l,d,c,h){return o(),r("div",null,[...t[0]||(t[0]=[a('

Browser Contexts

Memoh can give a bot access to a headless browser through the Browser Gateway. A Browser Context stores the browser environment a bot should use, such as viewport size, locale, timezone, and mobile behavior.

Once a browser context is assigned to a bot, the bot can use browser tools to open pages, click elements, fill forms, capture screenshots, and inspect page content.


Concept: Browser Gateway

The Browser Gateway is powered by Playwright and provides browser automation for bots. In practice, a browser context acts like a reusable browser profile configuration for one or more bots.

Typical use cases include:

  • Navigating websites
  • Clicking buttons and links
  • Filling and submitting forms
  • Reading rendered page content
  • Capturing screenshots or PDFs

Creating a Browser Context

Manage contexts from the Browser Contexts page in the sidebar.

  1. Navigate to the Browser Contexts page.
  2. Click Add Browser Context.
  3. Fill in the following field:
    • Name: A display name for this browser context.
  4. Click Create.

Configuring a Browser Context

After creating a context, select it from the sidebar and update its settings.

FieldDescription
NameThe display name shown in the UI.
CoreBrowser engine: chromium (default) or firefox.
Viewport WidthBrowser viewport width in pixels.
Viewport HeightBrowser viewport height in pixels.
User AgentOptional custom browser user agent string.
Device Scale FactorOptional device pixel ratio.
LocaleOptional locale such as en-US or zh-CN.
Timezone IDOptional timezone such as UTC or Asia/Shanghai.
Is MobileEnables mobile-style browser behavior.
Ignore HTTPS ErrorsAllows navigation to sites with invalid HTTPS certificates.

Managing Contexts

  • Edit: Select a context and update its configuration.
  • Delete: Remove a context you no longer use.

Assigning a Browser Context to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Browser Context dropdown.
  4. Select the context you created.
  5. Click Save.

After saving, the bot can use that browser context when browser tools are invoked.


Bot Interaction

When a browser context is configured, the bot can use built-in browser tools such as:

  • browser_action: perform actions like navigation, click, fill, select, scroll, tab management, screenshot, or PDF export
  • browser_observe: inspect the current page and gather information for the model

This lets the bot interact with real websites instead of relying only on static HTML or search results.


Browser Core Selection

Memoh's browser image can include Chromium, Firefox, or both. The available cores are determined at build time by the BROWSER_CORES build argument.

The install script prompts for browser core selection during setup. To rebuild manually with specific cores:

bash
BROWSER_CORES=chromium docker compose --profile browser build browser

Valid values for BROWSER_CORES: chromium, firefox, chromium,firefox (default).


Next Steps

',36)])])}const b=e(s,[["render",i]]);export{p as __pageData,b as default}; +import{_ as e,o,c as r,ag as a}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Browser Contexts","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/browser.md","filePath":"getting-started/browser.md","lastUpdated":1774787421000}'),s={name:"getting-started/browser.md"};function i(n,t,l,d,c,h){return o(),r("div",null,[...t[0]||(t[0]=[a('

Browser Contexts

Memoh can give a bot access to a headless browser through the Browser Gateway. A Browser Context stores the browser environment a bot should use, such as viewport size, locale, timezone, and mobile behavior.

Once a browser context is assigned to a bot, the bot can use browser tools to open pages, click elements, fill forms, capture screenshots, and inspect page content.


Concept: Browser Gateway

The Browser Gateway is powered by Playwright and provides browser automation for bots. In practice, a browser context acts like a reusable browser profile configuration for one or more bots.

Typical use cases include:

  • Navigating websites
  • Clicking buttons and links
  • Filling and submitting forms
  • Reading rendered page content
  • Capturing screenshots or PDFs

Creating a Browser Context

Manage contexts from the Browser Contexts page in the sidebar.

  1. Navigate to the Browser Contexts page.
  2. Click Add Browser Context.
  3. Fill in the following field:
    • Name: A display name for this browser context.
  4. Click Create.

Configuring a Browser Context

After creating a context, select it from the sidebar and update its settings.

FieldDescription
NameThe display name shown in the UI.
CoreBrowser engine: chromium (default) or firefox.
Viewport WidthBrowser viewport width in pixels.
Viewport HeightBrowser viewport height in pixels.
User AgentOptional custom browser user agent string.
Device Scale FactorOptional device pixel ratio.
LocaleOptional locale such as en-US or zh-CN.
Timezone IDOptional timezone such as UTC or Asia/Shanghai.
Is MobileEnables mobile-style browser behavior.
Ignore HTTPS ErrorsAllows navigation to sites with invalid HTTPS certificates.

Managing Contexts

  • Edit: Select a context and update its configuration.
  • Delete: Remove a context you no longer use.

Assigning a Browser Context to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Browser Context dropdown.
  4. Select the context you created.
  5. Click Save.

After saving, the bot can use that browser context when browser tools are invoked.


Bot Interaction

When a browser context is configured, the bot can use built-in browser tools such as:

  • browser_action: perform actions like navigation, click, fill, select, scroll, tab management, screenshot, or PDF export
  • browser_observe: inspect the current page and gather information for the model

This lets the bot interact with real websites instead of relying only on static HTML or search results.


Browser Core Selection

Memoh's browser image can include Chromium, Firefox, or both. The available cores are determined at build time by the BROWSER_CORES build argument.

The install script prompts for browser core selection during setup. To rebuild manually with specific cores:

bash
BROWSER_CORES=chromium docker compose --profile browser build browser

Valid values for BROWSER_CORES: chromium, firefox, chromium,firefox (default).


Next Steps

',36)])])}const b=e(s,[["render",i]]);export{p as __pageData,b as default}; diff --git a/assets/getting-started_browser.md.DHWZP7Sw.lean.js b/assets/getting-started_browser.md.Cjpk7h3a.lean.js similarity index 86% rename from assets/getting-started_browser.md.DHWZP7Sw.lean.js rename to assets/getting-started_browser.md.Cjpk7h3a.lean.js index ce0756d6..a3e135ad 100644 --- a/assets/getting-started_browser.md.DHWZP7Sw.lean.js +++ b/assets/getting-started_browser.md.Cjpk7h3a.lean.js @@ -1 +1 @@ -import{_ as e,o,c as r,ag as a}from"./chunks/framework.CvgP6Fyv.js";const p=JSON.parse('{"title":"Browser Contexts","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/browser.md","filePath":"getting-started/browser.md","lastUpdated":1774787421000}'),s={name:"getting-started/browser.md"};function i(n,t,l,d,c,h){return o(),r("div",null,[...t[0]||(t[0]=[a("",36)])])}const b=e(s,[["render",i]]);export{p as __pageData,b as default}; +import{_ as e,o,c as r,ag as a}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Browser Contexts","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/browser.md","filePath":"getting-started/browser.md","lastUpdated":1774787421000}'),s={name:"getting-started/browser.md"};function i(n,t,l,d,c,h){return o(),r("div",null,[...t[0]||(t[0]=[a("",36)])])}const b=e(s,[["render",i]]);export{p as __pageData,b as default}; diff --git a/assets/getting-started_channels.md.m6gk9QUJ.js b/assets/getting-started_channels.md.DP2fW_sw.js similarity index 97% rename from assets/getting-started_channels.md.m6gk9QUJ.js rename to assets/getting-started_channels.md.DP2fW_sw.js index 6af0b703..516572a6 100644 --- a/assets/getting-started_channels.md.m6gk9QUJ.js +++ b/assets/getting-started_channels.md.DP2fW_sw.js @@ -1 +1 @@ -import{_ as a,o as t,c as n,ag as o}from"./chunks/framework.CvgP6Fyv.js";const u=JSON.parse('{"title":"Bot Channels","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/channels.md","filePath":"getting-started/channels.md","lastUpdated":1774787421000}'),i={name:"getting-started/channels.md"};function r(l,e,s,h,d,c){return t(),n("div",null,[...e[0]||(e[0]=[o('

Bot Channels

Channels connect your Bot to various messaging platforms, allowing you to interact with it using your favorite chat applications.

Concept: Unified Communication

Memoh acts as a hub that bridges different messaging services. You can configure multiple channels for a single bot, enabling it to chat on Telegram, Discord, Matrix, and more simultaneously.


Supported Channels

Configure your bot's connections from the Platforms tab in the Bot Detail page.

Platform Guides

For detailed step-by-step guides on how to create and configure bots for each platform, see:


Configuration Flow

1. Adding a Channel

  1. Click Add Channel.
  2. Select the platform from the list.
  3. Fill in the required credentials and configuration. The fields are dynamic and change based on the selected channel.

2. Common Fields

FieldDescription
CredentialsAPI tokens, secrets, or bot keys provided by the platform.
DisabledQuickly enable or disable a channel without removing its configuration.
RoutingConfigure how messages are mapped between the platform and Memoh.

3. Special Case: Feishu Webhook

If using Feishu in webhook inbound mode:

  1. Memoh will generate a Webhook Callback URL.
  2. Copy this URL and paste it into your Feishu App's event configuration.
  3. This allows Feishu to send messages directly to Memoh.

4. Special Case: WeChat QR Code

If using WeChat:

  1. After enabling the channel, a QR code flow is provided for connecting.
  2. Scan the QR code with WeChat to link the bot.

Operations

  • Save: Update the configuration.
  • Save and Enable: Update and immediately activate the channel.
  • Enable/Disable Toggle: Switch the channel's active status.
  • Delete: Permanently remove a channel's configuration.
',25)])])}const f=a(i,[["render",r]]);export{u as __pageData,f as default}; +import{_ as a,o as t,c as n,ag as o}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Bot Channels","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/channels.md","filePath":"getting-started/channels.md","lastUpdated":1774787421000}'),i={name:"getting-started/channels.md"};function r(l,e,s,h,d,c){return t(),n("div",null,[...e[0]||(e[0]=[o('

Bot Channels

Channels connect your Bot to various messaging platforms, allowing you to interact with it using your favorite chat applications.

Concept: Unified Communication

Memoh acts as a hub that bridges different messaging services. You can configure multiple channels for a single bot, enabling it to chat on Telegram, Discord, Matrix, and more simultaneously.


Supported Channels

Configure your bot's connections from the Platforms tab in the Bot Detail page.

Platform Guides

For detailed step-by-step guides on how to create and configure bots for each platform, see:


Configuration Flow

1. Adding a Channel

  1. Click Add Channel.
  2. Select the platform from the list.
  3. Fill in the required credentials and configuration. The fields are dynamic and change based on the selected channel.

2. Common Fields

FieldDescription
CredentialsAPI tokens, secrets, or bot keys provided by the platform.
DisabledQuickly enable or disable a channel without removing its configuration.
RoutingConfigure how messages are mapped between the platform and Memoh.

3. Special Case: Feishu Webhook

If using Feishu in webhook inbound mode:

  1. Memoh will generate a Webhook Callback URL.
  2. Copy this URL and paste it into your Feishu App's event configuration.
  3. This allows Feishu to send messages directly to Memoh.

4. Special Case: WeChat QR Code

If using WeChat:

  1. After enabling the channel, a QR code flow is provided for connecting.
  2. Scan the QR code with WeChat to link the bot.

Operations

  • Save: Update the configuration.
  • Save and Enable: Update and immediately activate the channel.
  • Enable/Disable Toggle: Switch the channel's active status.
  • Delete: Permanently remove a channel's configuration.
',25)])])}const f=a(i,[["render",r]]);export{u as __pageData,f as default}; diff --git a/assets/getting-started_channels.md.m6gk9QUJ.lean.js b/assets/getting-started_channels.md.DP2fW_sw.lean.js similarity index 72% rename from assets/getting-started_channels.md.m6gk9QUJ.lean.js rename to assets/getting-started_channels.md.DP2fW_sw.lean.js index f9764249..b14e39d1 100644 --- a/assets/getting-started_channels.md.m6gk9QUJ.lean.js +++ b/assets/getting-started_channels.md.DP2fW_sw.lean.js @@ -1 +1 @@ -import{_ as a,o as t,c as n,ag as o}from"./chunks/framework.CvgP6Fyv.js";const u=JSON.parse('{"title":"Bot Channels","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/channels.md","filePath":"getting-started/channels.md","lastUpdated":1774787421000}'),i={name:"getting-started/channels.md"};function r(l,e,s,h,d,c){return t(),n("div",null,[...e[0]||(e[0]=[o("",25)])])}const f=a(i,[["render",r]]);export{u as __pageData,f as default}; +import{_ as a,o as t,c as n,ag as o}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Bot Channels","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/channels.md","filePath":"getting-started/channels.md","lastUpdated":1774787421000}'),i={name:"getting-started/channels.md"};function r(l,e,s,h,d,c){return t(),n("div",null,[...e[0]||(e[0]=[o("",25)])])}const f=a(i,[["render",r]]);export{u as __pageData,f as default}; diff --git a/assets/getting-started_compaction.md.DpvpBFKV.js b/assets/getting-started_compaction.md.CQe9KC6f.js similarity index 97% rename from assets/getting-started_compaction.md.DpvpBFKV.js rename to assets/getting-started_compaction.md.CQe9KC6f.js index fff1e131..79ff14f0 100644 --- a/assets/getting-started_compaction.md.DpvpBFKV.js +++ b/assets/getting-started_compaction.md.CQe9KC6f.js @@ -1 +1 @@ -import{_ as o,o as t,c as a,ag as r}from"./chunks/framework.CvgP6Fyv.js";const g=JSON.parse('{"title":"Memory Compaction","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/compaction.md","filePath":"getting-started/compaction.md","lastUpdated":1774787421000}'),i={name:"getting-started/compaction.md"};function n(s,e,l,m,c,d){return t(),a("div",null,[...e[0]||(e[0]=[r('

Memory Compaction

As a bot accumulates memories over time, the memory pool can grow large and contain redundant or outdated entries. Memory Compaction is an automated process that consolidates and optimizes the bot's memory store, keeping the most relevant information while reducing noise.


Concept: Why Compact?

Each conversation turn can generate new memory entries. Over weeks or months of use, thousands of memories accumulate. Many of these may overlap, become stale, or lose relevance. Compaction addresses this by:

  • Merging redundant memories — Combining entries that express the same information.
  • Removing outdated entries — Discarding memories that are no longer accurate.
  • Reducing retrieval noise — Fewer, higher-quality memories lead to better search results during chat.

Configuration

Configure compaction from the General tab in the Bot Detail page.

FieldDescription
Compaction EnabledToggle automatic memory compaction on or off.
Compaction ModelThe LLM used to evaluate and merge memories during compaction. This can be different from the chat model.

When enabled, compaction runs periodically as part of the bot's memory maintenance cycle.


Manual Compaction

You can also trigger compaction manually from the bot's Memory tab:

  1. Navigate to the Memory tab in the Bot Detail page.
  2. Click Compact.
  3. Configure the compaction parameters:
    • Ratio — The compression ratio (e.g., 0.8, 0.5, 0.3). Lower values mean more aggressive compaction.
    • Decay Days — Optionally restrict compaction to memories older than a specified number of days.
  4. Click Start Compaction.

Compaction Logs

The Compaction tab in the Bot Detail page provides an audit trail of all compaction runs:

  • Status — Whether the compaction completed successfully, encountered an issue, or failed.
  • Time — When the compaction was triggered.
  • Duration — How long the compaction took.
  • Result — A summary of what was compacted (memories merged, removed, etc.).

Managing Logs

  • Refresh — Reload the log list.
  • Clear Logs — Remove old compaction records.

Relationship to Memory

Compaction works with whatever Memory Provider is assigned to the bot. The compaction process:

  1. Reads all existing memories from the provider.
  2. Uses the configured Compaction Model to evaluate which memories are redundant or stale.
  3. Merges, updates, or removes entries as needed.
  4. Writes the optimized memory set back to the provider.

This process preserves the semantic content of important memories while reducing the total count. After compaction, the bot's memory retrieval becomes faster and more focused.


Next Steps

',29)])])}const p=o(i,[["render",n]]);export{g as __pageData,p as default}; +import{_ as o,o as t,c as a,ag as r}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Memory Compaction","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/compaction.md","filePath":"getting-started/compaction.md","lastUpdated":1774787421000}'),i={name:"getting-started/compaction.md"};function n(s,e,l,m,c,d){return t(),a("div",null,[...e[0]||(e[0]=[r('

Memory Compaction

As a bot accumulates memories over time, the memory pool can grow large and contain redundant or outdated entries. Memory Compaction is an automated process that consolidates and optimizes the bot's memory store, keeping the most relevant information while reducing noise.


Concept: Why Compact?

Each conversation turn can generate new memory entries. Over weeks or months of use, thousands of memories accumulate. Many of these may overlap, become stale, or lose relevance. Compaction addresses this by:

  • Merging redundant memories — Combining entries that express the same information.
  • Removing outdated entries — Discarding memories that are no longer accurate.
  • Reducing retrieval noise — Fewer, higher-quality memories lead to better search results during chat.

Configuration

Configure compaction from the General tab in the Bot Detail page.

FieldDescription
Compaction EnabledToggle automatic memory compaction on or off.
Compaction ModelThe LLM used to evaluate and merge memories during compaction. This can be different from the chat model.

When enabled, compaction runs periodically as part of the bot's memory maintenance cycle.


Manual Compaction

You can also trigger compaction manually from the bot's Memory tab:

  1. Navigate to the Memory tab in the Bot Detail page.
  2. Click Compact.
  3. Configure the compaction parameters:
    • Ratio — The compression ratio (e.g., 0.8, 0.5, 0.3). Lower values mean more aggressive compaction.
    • Decay Days — Optionally restrict compaction to memories older than a specified number of days.
  4. Click Start Compaction.

Compaction Logs

The Compaction tab in the Bot Detail page provides an audit trail of all compaction runs:

  • Status — Whether the compaction completed successfully, encountered an issue, or failed.
  • Time — When the compaction was triggered.
  • Duration — How long the compaction took.
  • Result — A summary of what was compacted (memories merged, removed, etc.).

Managing Logs

  • Refresh — Reload the log list.
  • Clear Logs — Remove old compaction records.

Relationship to Memory

Compaction works with whatever Memory Provider is assigned to the bot. The compaction process:

  1. Reads all existing memories from the provider.
  2. Uses the configured Compaction Model to evaluate which memories are redundant or stale.
  3. Merges, updates, or removes entries as needed.
  4. Writes the optimized memory set back to the provider.

This process preserves the semantic content of important memories while reducing the total count. After compaction, the bot's memory retrieval becomes faster and more focused.


Next Steps

',29)])])}const p=o(i,[["render",n]]);export{g as __pageData,p as default}; diff --git a/assets/getting-started_compaction.md.DpvpBFKV.lean.js b/assets/getting-started_compaction.md.CQe9KC6f.lean.js similarity index 73% rename from assets/getting-started_compaction.md.DpvpBFKV.lean.js rename to assets/getting-started_compaction.md.CQe9KC6f.lean.js index ad3a362a..a964d6f7 100644 --- a/assets/getting-started_compaction.md.DpvpBFKV.lean.js +++ b/assets/getting-started_compaction.md.CQe9KC6f.lean.js @@ -1 +1 @@ -import{_ as o,o as t,c as a,ag as r}from"./chunks/framework.CvgP6Fyv.js";const g=JSON.parse('{"title":"Memory Compaction","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/compaction.md","filePath":"getting-started/compaction.md","lastUpdated":1774787421000}'),i={name:"getting-started/compaction.md"};function n(s,e,l,m,c,d){return t(),a("div",null,[...e[0]||(e[0]=[r("",29)])])}const p=o(i,[["render",n]]);export{g as __pageData,p as default}; +import{_ as o,o as t,c as a,ag as r}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Memory Compaction","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/compaction.md","filePath":"getting-started/compaction.md","lastUpdated":1774787421000}'),i={name:"getting-started/compaction.md"};function n(s,e,l,m,c,d){return t(),a("div",null,[...e[0]||(e[0]=[r("",29)])])}const p=o(i,[["render",n]]);export{g as __pageData,p as default}; diff --git a/assets/getting-started_container.md.Cn3JBXGq.js b/assets/getting-started_container.md.00DekezL.js similarity index 98% rename from assets/getting-started_container.md.Cn3JBXGq.js rename to assets/getting-started_container.md.00DekezL.js index dde74a96..7fe83816 100644 --- a/assets/getting-started_container.md.Cn3JBXGq.js +++ b/assets/getting-started_container.md.00DekezL.js @@ -1 +1 @@ -import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.CvgP6Fyv.js";const g=JSON.parse('{"title":"Bot Container Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/container.md","filePath":"getting-started/container.md","lastUpdated":1774787421000}'),i={name:"getting-started/container.md"};function r(s,t,l,h,c,d){return a(),n("div",null,[...t[0]||(t[0]=[o('

Bot Container Management

Every Bot in Memoh operates within its own isolated container environment. This isolation ensures security, provides a dedicated filesystem, and allows the bot to execute code or commands without affecting other bots or the host system.

Concept: The Isolated Workspace

The container acts as the bot's private "computer." Within it, the bot can:

  • Store and modify files
  • Install software via package managers
  • Execute scripts
  • Maintain state across multiple sessions

Operations

Manage the lifecycle of your bot's environment from the Container tab in the Bot Detail page.

Lifecycle Actions

  • Create: Initialize the container if it doesn't exist (using the configured image). Progress is shown via real-time SSE feedback during image pull and creation.
  • Start: Launch the container. The bot must have a running container to perform many operations like file editing or executing tools.
  • Stop: Gracefully shut down the container to save resources.
  • Delete: Remove the container instance.

Container Information

The Container tab displays real-time data about the bot's runtime:

  • Container ID: Unique identifier for the instance.
  • Status: Whether it's currently running, stopped, or creating.
  • Image: The Docker/Containerd image used as the base.
  • Paths: Host and container paths for data persistence.
  • Tasks: Number of active background tasks running in the container.

Snapshots

Snapshots allow you to capture the current state of the bot's container and restore it later. This is useful for:

  • Saving a known good configuration
  • Versioning the bot's environment
  • Testing complex changes safely

Creating a Snapshot

  1. Ensure the container is stopped or in a stable state.
  2. Click Create Snapshot.
  3. Provide a name for the snapshot.

Restoring a Snapshot

  • Find the desired snapshot in the list and click Restore. This will reset the container to the captured state.

Managing Snapshots

  • View a list of existing snapshots with their creation timestamps and parent relationships.
  • Use the Delete button next to a snapshot to remove it.

Data Export and Import

The Container tab supports exporting and importing container data for backup, migration, or sharing purposes.

Export

  1. Click Export Data.
  2. The container's filesystem data is packaged into a downloadable archive.
  3. Save the archive to your local machine.

Import

  1. Click Import Data.
  2. Select an archive file from your local machine.
  3. The archive contents are extracted into the container's filesystem.

Restore

The Restore operation resets the container's data directory to a clean state. This is useful when the filesystem has become corrupted or you want to start fresh without recreating the container.


Container Versioning

Memoh tracks container versions to manage the lifecycle of the bot's runtime environment. Version information includes:

  • Current Version: The active container version.
  • Version History: A log of container version changes over time.

This helps with auditing and understanding when container configurations were updated.

',38)])])}const u=e(i,[["render",r]]);export{g as __pageData,u as default}; +import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Bot Container Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/container.md","filePath":"getting-started/container.md","lastUpdated":1774787421000}'),i={name:"getting-started/container.md"};function r(s,t,l,h,c,d){return a(),n("div",null,[...t[0]||(t[0]=[o('

Bot Container Management

Every Bot in Memoh operates within its own isolated container environment. This isolation ensures security, provides a dedicated filesystem, and allows the bot to execute code or commands without affecting other bots or the host system.

Concept: The Isolated Workspace

The container acts as the bot's private "computer." Within it, the bot can:

  • Store and modify files
  • Install software via package managers
  • Execute scripts
  • Maintain state across multiple sessions

Operations

Manage the lifecycle of your bot's environment from the Container tab in the Bot Detail page.

Lifecycle Actions

  • Create: Initialize the container if it doesn't exist (using the configured image). Progress is shown via real-time SSE feedback during image pull and creation.
  • Start: Launch the container. The bot must have a running container to perform many operations like file editing or executing tools.
  • Stop: Gracefully shut down the container to save resources.
  • Delete: Remove the container instance.

Container Information

The Container tab displays real-time data about the bot's runtime:

  • Container ID: Unique identifier for the instance.
  • Status: Whether it's currently running, stopped, or creating.
  • Image: The Docker/Containerd image used as the base.
  • Paths: Host and container paths for data persistence.
  • Tasks: Number of active background tasks running in the container.

Snapshots

Snapshots allow you to capture the current state of the bot's container and restore it later. This is useful for:

  • Saving a known good configuration
  • Versioning the bot's environment
  • Testing complex changes safely

Creating a Snapshot

  1. Ensure the container is stopped or in a stable state.
  2. Click Create Snapshot.
  3. Provide a name for the snapshot.

Restoring a Snapshot

  • Find the desired snapshot in the list and click Restore. This will reset the container to the captured state.

Managing Snapshots

  • View a list of existing snapshots with their creation timestamps and parent relationships.
  • Use the Delete button next to a snapshot to remove it.

Data Export and Import

The Container tab supports exporting and importing container data for backup, migration, or sharing purposes.

Export

  1. Click Export Data.
  2. The container's filesystem data is packaged into a downloadable archive.
  3. Save the archive to your local machine.

Import

  1. Click Import Data.
  2. Select an archive file from your local machine.
  3. The archive contents are extracted into the container's filesystem.

Restore

The Restore operation resets the container's data directory to a clean state. This is useful when the filesystem has become corrupted or you want to start fresh without recreating the container.


Container Versioning

Memoh tracks container versions to manage the lifecycle of the bot's runtime environment. Version information includes:

  • Current Version: The active container version.
  • Version History: A log of container version changes over time.

This helps with auditing and understanding when container configurations were updated.

',38)])])}const u=e(i,[["render",r]]);export{g as __pageData,u as default}; diff --git a/assets/getting-started_container.md.Cn3JBXGq.lean.js b/assets/getting-started_container.md.00DekezL.lean.js similarity index 73% rename from assets/getting-started_container.md.Cn3JBXGq.lean.js rename to assets/getting-started_container.md.00DekezL.lean.js index 0c98133e..0d075b6d 100644 --- a/assets/getting-started_container.md.Cn3JBXGq.lean.js +++ b/assets/getting-started_container.md.00DekezL.lean.js @@ -1 +1 @@ -import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.CvgP6Fyv.js";const g=JSON.parse('{"title":"Bot Container Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/container.md","filePath":"getting-started/container.md","lastUpdated":1774787421000}'),i={name:"getting-started/container.md"};function r(s,t,l,h,c,d){return a(),n("div",null,[...t[0]||(t[0]=[o("",38)])])}const u=e(i,[["render",r]]);export{g as __pageData,u as default}; +import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Bot Container Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/container.md","filePath":"getting-started/container.md","lastUpdated":1774787421000}'),i={name:"getting-started/container.md"};function r(s,t,l,h,c,d){return a(),n("div",null,[...t[0]||(t[0]=[o("",38)])])}const u=e(i,[["render",r]]);export{g as __pageData,u as default}; diff --git a/assets/getting-started_email.md.C6AeFWWD.js b/assets/getting-started_email.md.DLrAWkek.js similarity index 97% rename from assets/getting-started_email.md.C6AeFWWD.js rename to assets/getting-started_email.md.DLrAWkek.js index d086bce4..cf408f36 100644 --- a/assets/getting-started_email.md.C6AeFWWD.js +++ b/assets/getting-started_email.md.DLrAWkek.js @@ -1 +1 @@ -import{_ as i,o as a,c as o,ag as t}from"./chunks/framework.CvgP6Fyv.js";const m=JSON.parse('{"title":"Email Providers and Bindings","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/email.md","filePath":"getting-started/email.md","lastUpdated":1772359263000}'),n={name:"getting-started/email.md"};function r(l,e,s,d,g,c){return a(),o("div",null,[...e[0]||(e[0]=[t('

Email Providers and Bindings

Memoh allows your Bot to send and receive emails, providing another powerful channel for communication and task management.

Concept: Email as a Bot Channel

Connecting email to your Bot involves two steps:

  1. Email Provider: Configure a connection to an email service (like Mailgun or a generic SMTP server).
  2. Email Binding: Link a specific email address from a provider to a Bot.

Email Provider

Manage your email service connections from the Email Provider page in the sidebar.

Creating a Provider

  1. Navigate to the Email Provider page from the sidebar.
  2. Click Add Email Provider.
  3. Choose the provider type:
    • Mailgun: For high-volume delivery.
    • Generic SMTP: For traditional email servers.
  4. Fill in the required fields (e.g., domain, api_key, host, port, username, password).
  5. Click Create.

Bot Email Bindings

Configure your bot's email capabilities from the Email tab in the Bot Detail page.

Adding a Binding

  1. Click Add Binding.
  2. Select the Email Provider you created.
  3. Provide the Email Address to be associated with the bot.
  4. Set the bot's permissions:
    • Can Read: If enabled, the bot can check and process incoming emails.
    • Can Write: If enabled, the bot can compose and send outgoing emails.
    • Can Delete: If enabled, the bot can manage its own email inbox.
  5. Click Create.

Outbox and History

The Email tab also provides an Outbox showing an audit log of all emails sent by the bot:

  • To: The recipient's email address.
  • Subject: The email's subject line.
  • Status: Whether the email was sent successfully.
  • Sent At: The timestamp of the email delivery.

Bot Interaction

  • The bot can use its email permissions to send reports, respond to user inquiries, or trigger actions based on incoming mail.
  • Outgoing emails are tracked in the outbox for monitoring and troubleshooting.
  • The bot handles email in a structured way, allowing it to "converse" via email just as it does via chat.
',22)])])}const u=i(n,[["render",r]]);export{m as __pageData,u as default}; +import{_ as i,o as a,c as o,ag as t}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Email Providers and Bindings","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/email.md","filePath":"getting-started/email.md","lastUpdated":1772359263000}'),n={name:"getting-started/email.md"};function r(l,e,s,d,g,c){return a(),o("div",null,[...e[0]||(e[0]=[t('

Email Providers and Bindings

Memoh allows your Bot to send and receive emails, providing another powerful channel for communication and task management.

Concept: Email as a Bot Channel

Connecting email to your Bot involves two steps:

  1. Email Provider: Configure a connection to an email service (like Mailgun or a generic SMTP server).
  2. Email Binding: Link a specific email address from a provider to a Bot.

Email Provider

Manage your email service connections from the Email Provider page in the sidebar.

Creating a Provider

  1. Navigate to the Email Provider page from the sidebar.
  2. Click Add Email Provider.
  3. Choose the provider type:
    • Mailgun: For high-volume delivery.
    • Generic SMTP: For traditional email servers.
  4. Fill in the required fields (e.g., domain, api_key, host, port, username, password).
  5. Click Create.

Bot Email Bindings

Configure your bot's email capabilities from the Email tab in the Bot Detail page.

Adding a Binding

  1. Click Add Binding.
  2. Select the Email Provider you created.
  3. Provide the Email Address to be associated with the bot.
  4. Set the bot's permissions:
    • Can Read: If enabled, the bot can check and process incoming emails.
    • Can Write: If enabled, the bot can compose and send outgoing emails.
    • Can Delete: If enabled, the bot can manage its own email inbox.
  5. Click Create.

Outbox and History

The Email tab also provides an Outbox showing an audit log of all emails sent by the bot:

  • To: The recipient's email address.
  • Subject: The email's subject line.
  • Status: Whether the email was sent successfully.
  • Sent At: The timestamp of the email delivery.

Bot Interaction

  • The bot can use its email permissions to send reports, respond to user inquiries, or trigger actions based on incoming mail.
  • Outgoing emails are tracked in the outbox for monitoring and troubleshooting.
  • The bot handles email in a structured way, allowing it to "converse" via email just as it does via chat.
',22)])])}const u=i(n,[["render",r]]);export{m as __pageData,u as default}; diff --git a/assets/getting-started_email.md.C6AeFWWD.lean.js b/assets/getting-started_email.md.DLrAWkek.lean.js similarity index 72% rename from assets/getting-started_email.md.C6AeFWWD.lean.js rename to assets/getting-started_email.md.DLrAWkek.lean.js index 39d69959..46dc61ec 100644 --- a/assets/getting-started_email.md.C6AeFWWD.lean.js +++ b/assets/getting-started_email.md.DLrAWkek.lean.js @@ -1 +1 @@ -import{_ as i,o as a,c as o,ag as t}from"./chunks/framework.CvgP6Fyv.js";const m=JSON.parse('{"title":"Email Providers and Bindings","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/email.md","filePath":"getting-started/email.md","lastUpdated":1772359263000}'),n={name:"getting-started/email.md"};function r(l,e,s,d,g,c){return a(),o("div",null,[...e[0]||(e[0]=[t("",22)])])}const u=i(n,[["render",r]]);export{m as __pageData,u as default}; +import{_ as i,o as a,c as o,ag as t}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Email Providers and Bindings","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/email.md","filePath":"getting-started/email.md","lastUpdated":1772359263000}'),n={name:"getting-started/email.md"};function r(l,e,s,d,g,c){return a(),o("div",null,[...e[0]||(e[0]=[t("",22)])])}const u=i(n,[["render",r]]);export{m as __pageData,u as default}; diff --git a/assets/getting-started_files.md.BEvIR4S9.js b/assets/getting-started_files.md.CbhHSLX5.js similarity index 96% rename from assets/getting-started_files.md.BEvIR4S9.js rename to assets/getting-started_files.md.CbhHSLX5.js index dddd4c62..6661cb59 100644 --- a/assets/getting-started_files.md.BEvIR4S9.js +++ b/assets/getting-started_files.md.CbhHSLX5.js @@ -1 +1 @@ -import{_ as t,o as i,c as a,ag as o}from"./chunks/framework.CvgP6Fyv.js";const m=JSON.parse('{"title":"Bot Files Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/files.md","filePath":"getting-started/files.md","lastUpdated":1772359263000}'),n={name:"getting-started/files.md"};function r(s,e,l,g,d,h){return i(),a("div",null,[...e[0]||(e[0]=[o('

Bot Files Management

Every Memoh Bot has its own dedicated filesystem inside its isolated container. You can manage this filesystem directly from the Files tab in the Bot Detail page.


Operations

The FileManager component provides a familiar file-browsing experience with a toolbar, directory tree, and integrated editor.

Browsing and Navigation

  • Breadcrumb Navigation: Quickly move between parent directories.
  • Refresh: Reload the file list to see the latest changes (e.g., files created by the bot).
  • New Folder: Create a directory within the current path.

Managing Files

  • Upload: Select files from your local computer to transfer them into the bot's container.
  • Rename: Click on a file or folder and use the rename action to update its identifier.
  • Delete: Remove files or folders (with recursive support for directories).
  • Download: Retrieve a file from the bot's container back to your local machine.

Viewing and Editing

The integrated FileViewer allows you to interact with the bot's files without leaving the web UI.

Text Files

  • Read/Edit: Click a text file (e.g., .md, .js, .py, .toml) to open it in the built-in Monaco Editor.
  • Syntax Highlighting: Supports common programming languages and configuration formats.
  • Save: Modify the file's content and click Save to apply the changes to the bot's filesystem.

Images

  • Preview: Click an image file (e.g., .png, .jpg, .webp) to see a visual preview directly in the file manager.

Bot Interaction with Files

Remember that the bot itself can also perform these operations:

  • Use its Skills or MCP tools to read, write, and manage its own files.
  • The Files tab is your portal to monitor and manually intervene in the bot's workspace.
',20)])])}const f=t(n,[["render",r]]);export{m as __pageData,f as default}; +import{_ as t,o as i,c as a,ag as o}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Bot Files Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/files.md","filePath":"getting-started/files.md","lastUpdated":1772359263000}'),n={name:"getting-started/files.md"};function r(s,e,l,g,d,h){return i(),a("div",null,[...e[0]||(e[0]=[o('

Bot Files Management

Every Memoh Bot has its own dedicated filesystem inside its isolated container. You can manage this filesystem directly from the Files tab in the Bot Detail page.


Operations

The FileManager component provides a familiar file-browsing experience with a toolbar, directory tree, and integrated editor.

Browsing and Navigation

  • Breadcrumb Navigation: Quickly move between parent directories.
  • Refresh: Reload the file list to see the latest changes (e.g., files created by the bot).
  • New Folder: Create a directory within the current path.

Managing Files

  • Upload: Select files from your local computer to transfer them into the bot's container.
  • Rename: Click on a file or folder and use the rename action to update its identifier.
  • Delete: Remove files or folders (with recursive support for directories).
  • Download: Retrieve a file from the bot's container back to your local machine.

Viewing and Editing

The integrated FileViewer allows you to interact with the bot's files without leaving the web UI.

Text Files

  • Read/Edit: Click a text file (e.g., .md, .js, .py, .toml) to open it in the built-in Monaco Editor.
  • Syntax Highlighting: Supports common programming languages and configuration formats.
  • Save: Modify the file's content and click Save to apply the changes to the bot's filesystem.

Images

  • Preview: Click an image file (e.g., .png, .jpg, .webp) to see a visual preview directly in the file manager.

Bot Interaction with Files

Remember that the bot itself can also perform these operations:

  • Use its Skills or MCP tools to read, write, and manage its own files.
  • The Files tab is your portal to monitor and manually intervene in the bot's workspace.
',20)])])}const f=t(n,[["render",r]]);export{m as __pageData,f as default}; diff --git a/assets/getting-started_files.md.BEvIR4S9.lean.js b/assets/getting-started_files.md.CbhHSLX5.lean.js similarity index 72% rename from assets/getting-started_files.md.BEvIR4S9.lean.js rename to assets/getting-started_files.md.CbhHSLX5.lean.js index f338ce2a..95b5962c 100644 --- a/assets/getting-started_files.md.BEvIR4S9.lean.js +++ b/assets/getting-started_files.md.CbhHSLX5.lean.js @@ -1 +1 @@ -import{_ as t,o as i,c as a,ag as o}from"./chunks/framework.CvgP6Fyv.js";const m=JSON.parse('{"title":"Bot Files Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/files.md","filePath":"getting-started/files.md","lastUpdated":1772359263000}'),n={name:"getting-started/files.md"};function r(s,e,l,g,d,h){return i(),a("div",null,[...e[0]||(e[0]=[o("",20)])])}const f=t(n,[["render",r]]);export{m as __pageData,f as default}; +import{_ as t,o as i,c as a,ag as o}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Bot Files Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/files.md","filePath":"getting-started/files.md","lastUpdated":1772359263000}'),n={name:"getting-started/files.md"};function r(s,e,l,g,d,h){return i(),a("div",null,[...e[0]||(e[0]=[o("",20)])])}const f=t(n,[["render",r]]);export{m as __pageData,f as default}; diff --git a/assets/getting-started_heartbeat.md.ByhyU7bB.js b/assets/getting-started_heartbeat.md.lBwT6Ivl.js similarity index 98% rename from assets/getting-started_heartbeat.md.ByhyU7bB.js rename to assets/getting-started_heartbeat.md.lBwT6Ivl.js index 5077ee52..168f7184 100644 --- a/assets/getting-started_heartbeat.md.ByhyU7bB.js +++ b/assets/getting-started_heartbeat.md.lBwT6Ivl.js @@ -1 +1 @@ -import{_ as e,o,c as a,ag as r}from"./chunks/framework.CvgP6Fyv.js";const c=JSON.parse('{"title":"Bot Heartbeat","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/heartbeat.md","filePath":"getting-started/heartbeat.md","lastUpdated":1772359263000}'),n={name:"getting-started/heartbeat.md"};function i(s,t,l,h,d,g){return o(),a("div",null,[...t[0]||(t[0]=[r('

Bot Heartbeat

The Heartbeat feature allows you to schedule periodic tasks for your Bot, enabling it to perform autonomous actions even when you aren't chatting with it.

Concept: Scheduled Autonomy

A Heartbeat is a recurring trigger that prompts the bot to "think" and execute its skills or tools at a set interval. This is useful for:

  • Periodic status checks
  • Automatic data collection
  • Cleaning up the filesystem
  • Sending scheduled notifications

Configuration

Configure the heartbeat from the Heartbeat tab in the Bot Detail page.

FieldDescription
EnabledToggle the heartbeat on or off.
IntervalHow often (in minutes) the heartbeat should trigger. The default is 30 minutes.
ModelThe LLM used to execute the heartbeat task. This can be different from the main chat model.

Logs and Monitoring

The Heartbeat tab provides a detailed audit log of every execution:

  • Status: Whether the heartbeat completed successfully (ok), encountered an issue (alert), or failed (error).
  • Time: When the heartbeat was triggered.
  • Duration: How long the bot took to process the task.
  • Result: A summary of the bot's action or response during that heartbeat.

Managing Logs

  • Filter by Status: Quickly find errors or alerts.
  • Refresh: Load the latest log entries.
  • Clear Logs: Remove old heartbeat records to keep the interface clean.
  • Load More: View older history.

Bot Interaction

  • During a heartbeat, the bot receives a special system prompt that it should perform its "routine" tasks.
  • The bot can use any of its assigned Skills or MCP tools during a heartbeat.
  • Heartbeat logs provide the "memory" of the bot's autonomous activities.
',18)])])}const b=e(n,[["render",i]]);export{c as __pageData,b as default}; +import{_ as e,o,c as a,ag as r}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"Bot Heartbeat","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/heartbeat.md","filePath":"getting-started/heartbeat.md","lastUpdated":1772359263000}'),n={name:"getting-started/heartbeat.md"};function i(s,t,l,h,d,g){return o(),a("div",null,[...t[0]||(t[0]=[r('

Bot Heartbeat

The Heartbeat feature allows you to schedule periodic tasks for your Bot, enabling it to perform autonomous actions even when you aren't chatting with it.

Concept: Scheduled Autonomy

A Heartbeat is a recurring trigger that prompts the bot to "think" and execute its skills or tools at a set interval. This is useful for:

  • Periodic status checks
  • Automatic data collection
  • Cleaning up the filesystem
  • Sending scheduled notifications

Configuration

Configure the heartbeat from the Heartbeat tab in the Bot Detail page.

FieldDescription
EnabledToggle the heartbeat on or off.
IntervalHow often (in minutes) the heartbeat should trigger. The default is 30 minutes.
ModelThe LLM used to execute the heartbeat task. This can be different from the main chat model.

Logs and Monitoring

The Heartbeat tab provides a detailed audit log of every execution:

  • Status: Whether the heartbeat completed successfully (ok), encountered an issue (alert), or failed (error).
  • Time: When the heartbeat was triggered.
  • Duration: How long the bot took to process the task.
  • Result: A summary of the bot's action or response during that heartbeat.

Managing Logs

  • Filter by Status: Quickly find errors or alerts.
  • Refresh: Load the latest log entries.
  • Clear Logs: Remove old heartbeat records to keep the interface clean.
  • Load More: View older history.

Bot Interaction

  • During a heartbeat, the bot receives a special system prompt that it should perform its "routine" tasks.
  • The bot can use any of its assigned Skills or MCP tools during a heartbeat.
  • Heartbeat logs provide the "memory" of the bot's autonomous activities.
',18)])])}const b=e(n,[["render",i]]);export{c as __pageData,b as default}; diff --git a/assets/getting-started_heartbeat.md.ByhyU7bB.lean.js b/assets/getting-started_heartbeat.md.lBwT6Ivl.lean.js similarity index 86% rename from assets/getting-started_heartbeat.md.ByhyU7bB.lean.js rename to assets/getting-started_heartbeat.md.lBwT6Ivl.lean.js index b886d2cc..c3bcc35b 100644 --- a/assets/getting-started_heartbeat.md.ByhyU7bB.lean.js +++ b/assets/getting-started_heartbeat.md.lBwT6Ivl.lean.js @@ -1 +1 @@ -import{_ as e,o,c as a,ag as r}from"./chunks/framework.CvgP6Fyv.js";const c=JSON.parse('{"title":"Bot Heartbeat","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/heartbeat.md","filePath":"getting-started/heartbeat.md","lastUpdated":1772359263000}'),n={name:"getting-started/heartbeat.md"};function i(s,t,l,h,d,g){return o(),a("div",null,[...t[0]||(t[0]=[r("",18)])])}const b=e(n,[["render",i]]);export{c as __pageData,b as default}; +import{_ as e,o,c as a,ag as r}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"Bot Heartbeat","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/heartbeat.md","filePath":"getting-started/heartbeat.md","lastUpdated":1772359263000}'),n={name:"getting-started/heartbeat.md"};function i(s,t,l,h,d,g){return o(),a("div",null,[...t[0]||(t[0]=[r("",18)])])}const b=e(n,[["render",i]]);export{c as __pageData,b as default}; diff --git a/assets/getting-started_mcp.md.Cc4x0Hwa.js b/assets/getting-started_mcp.md.CfWEkmuE.js similarity index 98% rename from assets/getting-started_mcp.md.Cc4x0Hwa.js rename to assets/getting-started_mcp.md.CfWEkmuE.js index 947ea8ee..175b2672 100644 --- a/assets/getting-started_mcp.md.Cc4x0Hwa.js +++ b/assets/getting-started_mcp.md.CfWEkmuE.js @@ -1 +1 @@ -import{_ as e,o,c as n,ag as r}from"./chunks/framework.CvgP6Fyv.js";const p=JSON.parse('{"title":"MCP Connections","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/mcp.md","filePath":"getting-started/mcp.md","lastUpdated":1774787421000}'),a={name:"getting-started/mcp.md"};function i(s,t,c,l,d,h){return o(),n("div",null,[...t[0]||(t[0]=[r('

MCP Connections

Memoh fully supports the Model Context Protocol (MCP), allowing you to connect your Bot to external tool services and context providers.

Concept: Extending Bot Capabilities

MCP provides a standardized way for bots to access external data sources and tools. Each Bot can have its own independent set of MCP connections.


Connection Types

Configure MCP connections from the MCP tab in the Bot Detail page.

1. Stdio (Local Process)

This type of connection executes a local command inside the bot's container and communicates via standard input/output.

FieldDescription
CommandThe executable to run (e.g., npx, python3).
ArgumentsA list of command-line arguments (e.g., -y, @modelcontextprotocol/server-filesystem, /opt/memoh/data).
EnvKey-value pairs for environment variables.
CWDWorking directory for the process.

2. Remote (HTTP/SSE)

This type of connection connects to a remote MCP server over the network.

FieldDescription
URLThe endpoint of the remote MCP server.
HeadersCustom HTTP headers (e.g., for authentication).
TransportChoose between http or sse (Server-Sent Events).

OAuth Authentication

Some MCP servers require OAuth-based authentication. Memoh supports the full MCP OAuth flow:

  1. Click the OAuth button on a connection that requires authentication.
  2. Memoh will discover the server's OAuth configuration automatically.
  3. Click Authorize to open the provider's authorization page.
  4. After granting access, you are redirected back to Memoh.
  5. The token is exchanged and stored securely for the connection.

You can also:

  • Check status — View the current OAuth token status.
  • Revoke — Remove the stored OAuth token.

Operations

  • Add Connection: Click Add, choose the type, and fill in the configuration.
  • Import JSON: Use the Import button to quickly add multiple connections from a standard mcpServers JSON config file.
  • Export: Export connection configurations to a JSON file for backup or sharing.
  • Toggle Active: Enable or disable specific connections without deleting them.
  • Search: Quickly find a connection by name or ID.
  • Batch Delete: Select multiple connections and delete them at once.

Tool Discovery

Once an MCP connection is active, Memoh automatically discovers the tools exposed by the server. You can:

  1. Click on a connection to view its details.
  2. The Tools section lists all available tools with their names and descriptions.
  3. The bot will use these tools automatically during conversations when relevant.

You can also use the Probe button to manually refresh the tool list from the server.


Bot Interaction

Once an MCP connection is active, the bot will automatically:

  • Discover the tools and resources exposed by the MCP server.
  • Use these tools to perform tasks requested by the user.
  • Include the context provided by the MCP server in its reasoning process.
',31)])])}const g=e(a,[["render",i]]);export{p as __pageData,g as default}; +import{_ as e,o,c as n,ag as r}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"MCP Connections","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/mcp.md","filePath":"getting-started/mcp.md","lastUpdated":1774787421000}'),a={name:"getting-started/mcp.md"};function i(s,t,c,l,d,h){return o(),n("div",null,[...t[0]||(t[0]=[r('

MCP Connections

Memoh fully supports the Model Context Protocol (MCP), allowing you to connect your Bot to external tool services and context providers.

Concept: Extending Bot Capabilities

MCP provides a standardized way for bots to access external data sources and tools. Each Bot can have its own independent set of MCP connections.


Connection Types

Configure MCP connections from the MCP tab in the Bot Detail page.

1. Stdio (Local Process)

This type of connection executes a local command inside the bot's container and communicates via standard input/output.

FieldDescription
CommandThe executable to run (e.g., npx, python3).
ArgumentsA list of command-line arguments (e.g., -y, @modelcontextprotocol/server-filesystem, /opt/memoh/data).
EnvKey-value pairs for environment variables.
CWDWorking directory for the process.

2. Remote (HTTP/SSE)

This type of connection connects to a remote MCP server over the network.

FieldDescription
URLThe endpoint of the remote MCP server.
HeadersCustom HTTP headers (e.g., for authentication).
TransportChoose between http or sse (Server-Sent Events).

OAuth Authentication

Some MCP servers require OAuth-based authentication. Memoh supports the full MCP OAuth flow:

  1. Click the OAuth button on a connection that requires authentication.
  2. Memoh will discover the server's OAuth configuration automatically.
  3. Click Authorize to open the provider's authorization page.
  4. After granting access, you are redirected back to Memoh.
  5. The token is exchanged and stored securely for the connection.

You can also:

  • Check status — View the current OAuth token status.
  • Revoke — Remove the stored OAuth token.

Operations

  • Add Connection: Click Add, choose the type, and fill in the configuration.
  • Import JSON: Use the Import button to quickly add multiple connections from a standard mcpServers JSON config file.
  • Export: Export connection configurations to a JSON file for backup or sharing.
  • Toggle Active: Enable or disable specific connections without deleting them.
  • Search: Quickly find a connection by name or ID.
  • Batch Delete: Select multiple connections and delete them at once.

Tool Discovery

Once an MCP connection is active, Memoh automatically discovers the tools exposed by the server. You can:

  1. Click on a connection to view its details.
  2. The Tools section lists all available tools with their names and descriptions.
  3. The bot will use these tools automatically during conversations when relevant.

You can also use the Probe button to manually refresh the tool list from the server.


Bot Interaction

Once an MCP connection is active, the bot will automatically:

  • Discover the tools and resources exposed by the MCP server.
  • Use these tools to perform tasks requested by the user.
  • Include the context provided by the MCP server in its reasoning process.
',31)])])}const g=e(a,[["render",i]]);export{p as __pageData,g as default}; diff --git a/assets/getting-started_mcp.md.Cc4x0Hwa.lean.js b/assets/getting-started_mcp.md.CfWEkmuE.lean.js similarity index 85% rename from assets/getting-started_mcp.md.Cc4x0Hwa.lean.js rename to assets/getting-started_mcp.md.CfWEkmuE.lean.js index d78d6f7a..8ebb7afa 100644 --- a/assets/getting-started_mcp.md.Cc4x0Hwa.lean.js +++ b/assets/getting-started_mcp.md.CfWEkmuE.lean.js @@ -1 +1 @@ -import{_ as e,o,c as n,ag as r}from"./chunks/framework.CvgP6Fyv.js";const p=JSON.parse('{"title":"MCP Connections","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/mcp.md","filePath":"getting-started/mcp.md","lastUpdated":1774787421000}'),a={name:"getting-started/mcp.md"};function i(s,t,c,l,d,h){return o(),n("div",null,[...t[0]||(t[0]=[r("",31)])])}const g=e(a,[["render",i]]);export{p as __pageData,g as default}; +import{_ as e,o,c as n,ag as r}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"MCP Connections","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/mcp.md","filePath":"getting-started/mcp.md","lastUpdated":1774787421000}'),a={name:"getting-started/mcp.md"};function i(s,t,c,l,d,h){return o(),n("div",null,[...t[0]||(t[0]=[r("",31)])])}const g=e(a,[["render",i]]);export{p as __pageData,g as default}; diff --git a/assets/getting-started_memory.md.DGTYEufG.js b/assets/getting-started_memory.md.DfffnmM0.js similarity index 98% rename from assets/getting-started_memory.md.DGTYEufG.js rename to assets/getting-started_memory.md.DfffnmM0.js index 61c5b59e..d6e785dc 100644 --- a/assets/getting-started_memory.md.DGTYEufG.js +++ b/assets/getting-started_memory.md.DfffnmM0.js @@ -1 +1 @@ -import{_ as t,o,c as r,ag as a}from"./chunks/framework.CvgP6Fyv.js";const g=JSON.parse('{"title":"Bot Memory Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/memory.md","filePath":"getting-started/memory.md","lastUpdated":1774787421000}'),i={name:"getting-started/memory.md"};function n(s,e,m,l,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a('

Bot Memory Management

Memoh's structured long-term memory system allows bots to remember information across multiple conversations, providing contextually relevant and personalized interactions.

Prerequisites

Before using the Memory tab, make sure your bot already has a Memory Provider configured.

  1. Create a provider from one of the Memory Providers (Built-in, Mem0, or OpenViking).
  2. Open your bot's General tab.
  3. Select the provider in the Memory Provider field.
  4. Click Save.

Without a memory provider, the bot will not have an active memory backend configuration.


Concept: Memory Retrieval

Memories are stored and retrieved through the assigned memory provider. Depending on the provider type and mode, retrieval may use file-based indexing, sparse vectors, dense embeddings, or an external API. When a user sends a message, Memoh finds the most relevant memories and includes them in the bot's runtime context.


Operations

Manage your bot's memories from the Memory tab in the Bot Detail page.

1. Creating Memories

  • New Memory: Manually enter a memory's content in the provided textarea.
  • From Conversation: Select specific messages from the bot's conversation history to extract into memory.

2. Searching and Managing

  • Search: Filter memories by ID or text content.
  • Edit: Modify existing memory entries directly in the list.
  • Delete: Remove memories that are no longer needed.

Memory Compression (Compact)

Over time, memories can accumulate and become redundant. The Compact feature helps optimize the memory pool.

  • Ratio: Set the compression ratio (for example 0.8, 0.5, or 0.3) to determine how much information is retained.
  • Decay Days: Optionally specify a time window to compact only memories older than a certain number of days.

For more details on compaction, see Memory Compaction.


Rebuild

The Rebuild feature re-indexes all memories from scratch. This is useful when:

  • You have changed the memory provider's mode (e.g., switching from off to sparse).
  • The vector index has become inconsistent.
  • You want to re-process all memories with updated settings.

Click Rebuild in the Memory tab to start the process. You can monitor the rebuild status in real-time.


Status

The Memory tab shows the current status of the memory provider for this bot:

  • Connected — The memory backend is reachable and operational.
  • Error — There is an issue with the memory provider configuration or connectivity.

Use the status indicator to quickly verify that the memory system is working before troubleshooting other issues.


Usage Statistics

The Memory tab displays storage usage information:

  • Total Memories — The number of memory entries stored for this bot.
  • Index Status — Whether the vector index is up-to-date.

Bot Interaction

  • The bot automatically searches and retrieves memories during chat.
  • The assigned Memory Provider controls the memory backend used by the bot.
  • Provider-specific settings (such as memory mode, embedding model, or API keys) are configured in the provider itself — see Memory Providers.
  • Memories provide the long-term knowledge that makes each bot unique to its owner.
',38)])])}const u=t(i,[["render",n]]);export{g as __pageData,u as default}; +import{_ as t,o,c as r,ag as a}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Bot Memory Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/memory.md","filePath":"getting-started/memory.md","lastUpdated":1774787421000}'),i={name:"getting-started/memory.md"};function n(s,e,m,l,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a('

Bot Memory Management

Memoh's structured long-term memory system allows bots to remember information across multiple conversations, providing contextually relevant and personalized interactions.

Prerequisites

Before using the Memory tab, make sure your bot already has a Memory Provider configured.

  1. Create a provider from one of the Memory Providers (Built-in, Mem0, or OpenViking).
  2. Open your bot's General tab.
  3. Select the provider in the Memory Provider field.
  4. Click Save.

Without a memory provider, the bot will not have an active memory backend configuration.


Concept: Memory Retrieval

Memories are stored and retrieved through the assigned memory provider. Depending on the provider type and mode, retrieval may use file-based indexing, sparse vectors, dense embeddings, or an external API. When a user sends a message, Memoh finds the most relevant memories and includes them in the bot's runtime context.


Operations

Manage your bot's memories from the Memory tab in the Bot Detail page.

1. Creating Memories

  • New Memory: Manually enter a memory's content in the provided textarea.
  • From Conversation: Select specific messages from the bot's conversation history to extract into memory.

2. Searching and Managing

  • Search: Filter memories by ID or text content.
  • Edit: Modify existing memory entries directly in the list.
  • Delete: Remove memories that are no longer needed.

Memory Compression (Compact)

Over time, memories can accumulate and become redundant. The Compact feature helps optimize the memory pool.

  • Ratio: Set the compression ratio (for example 0.8, 0.5, or 0.3) to determine how much information is retained.
  • Decay Days: Optionally specify a time window to compact only memories older than a certain number of days.

For more details on compaction, see Memory Compaction.


Rebuild

The Rebuild feature re-indexes all memories from scratch. This is useful when:

  • You have changed the memory provider's mode (e.g., switching from off to sparse).
  • The vector index has become inconsistent.
  • You want to re-process all memories with updated settings.

Click Rebuild in the Memory tab to start the process. You can monitor the rebuild status in real-time.


Status

The Memory tab shows the current status of the memory provider for this bot:

  • Connected — The memory backend is reachable and operational.
  • Error — There is an issue with the memory provider configuration or connectivity.

Use the status indicator to quickly verify that the memory system is working before troubleshooting other issues.


Usage Statistics

The Memory tab displays storage usage information:

  • Total Memories — The number of memory entries stored for this bot.
  • Index Status — Whether the vector index is up-to-date.

Bot Interaction

  • The bot automatically searches and retrieves memories during chat.
  • The assigned Memory Provider controls the memory backend used by the bot.
  • Provider-specific settings (such as memory mode, embedding model, or API keys) are configured in the provider itself — see Memory Providers.
  • Memories provide the long-term knowledge that makes each bot unique to its owner.
',38)])])}const u=t(i,[["render",n]]);export{g as __pageData,u as default}; diff --git a/assets/getting-started_memory.md.DGTYEufG.lean.js b/assets/getting-started_memory.md.DfffnmM0.lean.js similarity index 86% rename from assets/getting-started_memory.md.DGTYEufG.lean.js rename to assets/getting-started_memory.md.DfffnmM0.lean.js index 90943ad3..195ab32a 100644 --- a/assets/getting-started_memory.md.DGTYEufG.lean.js +++ b/assets/getting-started_memory.md.DfffnmM0.lean.js @@ -1 +1 @@ -import{_ as t,o,c as r,ag as a}from"./chunks/framework.CvgP6Fyv.js";const g=JSON.parse('{"title":"Bot Memory Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/memory.md","filePath":"getting-started/memory.md","lastUpdated":1774787421000}'),i={name:"getting-started/memory.md"};function n(s,e,m,l,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a("",38)])])}const u=t(i,[["render",n]]);export{g as __pageData,u as default}; +import{_ as t,o,c as r,ag as a}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Bot Memory Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/memory.md","filePath":"getting-started/memory.md","lastUpdated":1774787421000}'),i={name:"getting-started/memory.md"};function n(s,e,m,l,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a("",38)])])}const u=t(i,[["render",n]]);export{g as __pageData,u as default}; diff --git a/assets/getting-started_provider-and-model.md.BT7Reh8O.js b/assets/getting-started_provider-and-model.md.MB4KgxWX.js similarity index 98% rename from assets/getting-started_provider-and-model.md.BT7Reh8O.js rename to assets/getting-started_provider-and-model.md.MB4KgxWX.js index e7401ca2..f13a4fd6 100644 --- a/assets/getting-started_provider-and-model.md.BT7Reh8O.js +++ b/assets/getting-started_provider-and-model.md.MB4KgxWX.js @@ -1 +1 @@ -import{_ as t,o,c as r,ag as i}from"./chunks/framework.CvgP6Fyv.js";const p=JSON.parse('{"title":"LLM Provider and Model","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/provider-and-model.md","filePath":"getting-started/provider-and-model.md","lastUpdated":1774787421000}'),a={name:"getting-started/provider-and-model.md"};function d(n,e,l,s,h,c){return o(),r("div",null,[...e[0]||(e[0]=[i('

LLM Provider and Model

To use Memoh, you first need to configure at least one LLM Provider and at least one Model.

LLM Provider

An LLM Provider represents a connection to an AI service (like OpenAI, Anthropic, or a self-hosted compatible API). It stores the base URL and authentication credentials.

Creating a Provider

  1. Navigate to the Providers page from the sidebar.
  2. Click the Add Provider button at the bottom of the sidebar.
  3. Fill in the following fields:
    • Name: A display name for this provider (e.g., "OpenAI").
    • Base URL: The root URL of the API (e.g., https://api.openai.com/v1).
    • API Key: Your authentication token for the service.
  4. Click Create.

OAuth Authentication

Some providers (like OpenAI) support OAuth-based authentication. If a provider supports OAuth:

  1. Select the provider from the list.
  2. Click Connect with OAuth in the provider settings form.
  3. Follow the authorization flow in the popup window.
  4. Once authorized, the provider will use the OAuth token instead of a manual API key.

Import Models

Memoh can automatically discover and import available models from a provider:

  1. Select a provider from the list.
  2. Click Import Models.
  3. Memoh will query the provider's API to fetch available models.
  4. Select which models to import and click Import.

This saves time compared to manually adding each model one by one.

Managing Providers

  • Edit: Select a provider from the list and use the form on the right to update its name, URL, or API key.
  • Test: Click Test Connection to verify the provider is reachable.
  • Delete: Use the Delete Provider button in the provider settings form.

Model

A Model is a specific AI instance (like gpt-4o or text-embedding-3-small) that belongs to a Provider. Memoh distinguishes between Chat models (for conversation) and Embedding models (for memory search).

Adding a Model

  1. Select a Provider from the list on the Providers page.
  2. Click Add Model in the model list section.
  3. Configure the following fields:
FieldRequiredDescription
TypeYeschat for conversation, embedding for vector search.
Model IDYesThe exact identifier used by the provider (e.g., gpt-4o).
NameNoA friendly display name (defaults to Model ID).
Client TypeYes (Chat)The API protocol: openai-responses, openai-completions, anthropic-messages, or google-generative-ai.
Input ModalitiesYes (Chat)Capabilities supported: text (default), image, audio, video, file.
Supports ReasoningNoEnable if the model supports internal reasoning steps (e.g., OpenAI o1).
DimensionsYes (Embed)The vector size for embedding models (e.g., 1536).
  1. Click Create.

Managing Models

  • Edit: Click the edit icon next to a model in the list.
  • Delete: Click the trash icon next to a model to remove it.

Next Steps

Now that you have configured your models, you can proceed to Create and Configure a Bot.

',27)])])}const m=t(a,[["render",d]]);export{p as __pageData,m as default}; +import{_ as t,o,c as r,ag as i}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"LLM Provider and Model","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/provider-and-model.md","filePath":"getting-started/provider-and-model.md","lastUpdated":1774787421000}'),a={name:"getting-started/provider-and-model.md"};function d(n,e,l,s,h,c){return o(),r("div",null,[...e[0]||(e[0]=[i('

LLM Provider and Model

To use Memoh, you first need to configure at least one LLM Provider and at least one Model.

LLM Provider

An LLM Provider represents a connection to an AI service (like OpenAI, Anthropic, or a self-hosted compatible API). It stores the base URL and authentication credentials.

Creating a Provider

  1. Navigate to the Providers page from the sidebar.
  2. Click the Add Provider button at the bottom of the sidebar.
  3. Fill in the following fields:
    • Name: A display name for this provider (e.g., "OpenAI").
    • Base URL: The root URL of the API (e.g., https://api.openai.com/v1).
    • API Key: Your authentication token for the service.
  4. Click Create.

OAuth Authentication

Some providers (like OpenAI) support OAuth-based authentication. If a provider supports OAuth:

  1. Select the provider from the list.
  2. Click Connect with OAuth in the provider settings form.
  3. Follow the authorization flow in the popup window.
  4. Once authorized, the provider will use the OAuth token instead of a manual API key.

Import Models

Memoh can automatically discover and import available models from a provider:

  1. Select a provider from the list.
  2. Click Import Models.
  3. Memoh will query the provider's API to fetch available models.
  4. Select which models to import and click Import.

This saves time compared to manually adding each model one by one.

Managing Providers

  • Edit: Select a provider from the list and use the form on the right to update its name, URL, or API key.
  • Test: Click Test Connection to verify the provider is reachable.
  • Delete: Use the Delete Provider button in the provider settings form.

Model

A Model is a specific AI instance (like gpt-4o or text-embedding-3-small) that belongs to a Provider. Memoh distinguishes between Chat models (for conversation) and Embedding models (for memory search).

Adding a Model

  1. Select a Provider from the list on the Providers page.
  2. Click Add Model in the model list section.
  3. Configure the following fields:
FieldRequiredDescription
TypeYeschat for conversation, embedding for vector search.
Model IDYesThe exact identifier used by the provider (e.g., gpt-4o).
NameNoA friendly display name (defaults to Model ID).
Client TypeYes (Chat)The API protocol: openai-responses, openai-completions, anthropic-messages, or google-generative-ai.
Input ModalitiesYes (Chat)Capabilities supported: text (default), image, audio, video, file.
Supports ReasoningNoEnable if the model supports internal reasoning steps (e.g., OpenAI o1).
DimensionsYes (Embed)The vector size for embedding models (e.g., 1536).
  1. Click Create.

Managing Models

  • Edit: Click the edit icon next to a model in the list.
  • Delete: Click the trash icon next to a model to remove it.

Next Steps

Now that you have configured your models, you can proceed to Create and Configure a Bot.

',27)])])}const m=t(a,[["render",d]]);export{p as __pageData,m as default}; diff --git a/assets/getting-started_provider-and-model.md.BT7Reh8O.lean.js b/assets/getting-started_provider-and-model.md.MB4KgxWX.lean.js similarity index 87% rename from assets/getting-started_provider-and-model.md.BT7Reh8O.lean.js rename to assets/getting-started_provider-and-model.md.MB4KgxWX.lean.js index 49a15972..b7825c53 100644 --- a/assets/getting-started_provider-and-model.md.BT7Reh8O.lean.js +++ b/assets/getting-started_provider-and-model.md.MB4KgxWX.lean.js @@ -1 +1 @@ -import{_ as t,o,c as r,ag as i}from"./chunks/framework.CvgP6Fyv.js";const p=JSON.parse('{"title":"LLM Provider and Model","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/provider-and-model.md","filePath":"getting-started/provider-and-model.md","lastUpdated":1774787421000}'),a={name:"getting-started/provider-and-model.md"};function d(n,e,l,s,h,c){return o(),r("div",null,[...e[0]||(e[0]=[i("",27)])])}const m=t(a,[["render",d]]);export{p as __pageData,m as default}; +import{_ as t,o,c as r,ag as i}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"LLM Provider and Model","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/provider-and-model.md","filePath":"getting-started/provider-and-model.md","lastUpdated":1774787421000}'),a={name:"getting-started/provider-and-model.md"};function d(n,e,l,s,h,c){return o(),r("div",null,[...e[0]||(e[0]=[i("",27)])])}const m=t(a,[["render",d]]);export{p as __pageData,m as default}; diff --git a/assets/getting-started_schedule.md.tVJ8UgNc.js b/assets/getting-started_schedule.md.7R1TStAB.js similarity index 98% rename from assets/getting-started_schedule.md.tVJ8UgNc.js rename to assets/getting-started_schedule.md.7R1TStAB.js index 2df9a8d0..2bc0c0e5 100644 --- a/assets/getting-started_schedule.md.tVJ8UgNc.js +++ b/assets/getting-started_schedule.md.7R1TStAB.js @@ -1,4 +1,4 @@ -import{_ as t,o as a,c as s,ag as n}from"./chunks/framework.CvgP6Fyv.js";const p=JSON.parse('{"title":"Scheduled Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/schedule.md","filePath":"getting-started/schedule.md","lastUpdated":1774459922000}'),i={name:"getting-started/schedule.md"};function o(r,e,d,l,h,c){return a(),s("div",null,[...e[0]||(e[0]=[n(`

Scheduled Tasks

Scheduled Tasks allow you to automate recurring bot actions using cron expressions. This is useful for sending periodic reports, checking external data, performing maintenance, or triggering any routine task without manual intervention.

Concept: Cron-Based Automation

A Schedule is a cron-triggered rule bound to a specific bot. When a schedule fires, it sends a command to the agent, which executes it using its available tools, skills, and context. The bot can then deliver results to any connected channel.


Schedule Fields

FieldDescription
NameA display name for the task (e.g., "Morning News Summary").
DescriptionA brief explanation of what the task does.
PatternA cron expression that defines when the task runs (e.g., 0 9 * * * for daily at 9:00 AM).
CommandThe natural-language instruction sent to the agent when the schedule triggers (e.g., "Summarize today's top tech news and send it to the Telegram channel").
EnabledWhether the schedule is currently active.
Max CallsOptional limit on the total number of executions. Leave empty for unlimited.
Current CallsThe number of times this schedule has already fired.

Cron Pattern Reference

The pattern field uses standard cron syntax with five fields. It is evaluated in the server's configured timezone. By default, Memoh uses UTC, and you can change it with the top-level timezone config value.

┌───────────── minute (0–59)
+import{_ as t,o as a,c as s,ag as n}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Scheduled Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/schedule.md","filePath":"getting-started/schedule.md","lastUpdated":1774459922000}'),i={name:"getting-started/schedule.md"};function o(r,e,d,l,h,c){return a(),s("div",null,[...e[0]||(e[0]=[n(`

Scheduled Tasks

Scheduled Tasks allow you to automate recurring bot actions using cron expressions. This is useful for sending periodic reports, checking external data, performing maintenance, or triggering any routine task without manual intervention.

Concept: Cron-Based Automation

A Schedule is a cron-triggered rule bound to a specific bot. When a schedule fires, it sends a command to the agent, which executes it using its available tools, skills, and context. The bot can then deliver results to any connected channel.


Schedule Fields

FieldDescription
NameA display name for the task (e.g., "Morning News Summary").
DescriptionA brief explanation of what the task does.
PatternA cron expression that defines when the task runs (e.g., 0 9 * * * for daily at 9:00 AM).
CommandThe natural-language instruction sent to the agent when the schedule triggers (e.g., "Summarize today's top tech news and send it to the Telegram channel").
EnabledWhether the schedule is currently active.
Max CallsOptional limit on the total number of executions. Leave empty for unlimited.
Current CallsThe number of times this schedule has already fired.

Cron Pattern Reference

The pattern field uses standard cron syntax with five fields. It is evaluated in the server's configured timezone. By default, Memoh uses UTC, and you can change it with the top-level timezone config value.

┌───────────── minute (0–59)
 │ ┌───────────── hour (0–23)
 │ │ ┌───────────── day of month (1–31)
 │ │ │ ┌───────────── month (1–12)
diff --git a/assets/getting-started_schedule.md.tVJ8UgNc.lean.js b/assets/getting-started_schedule.md.7R1TStAB.lean.js
similarity index 72%
rename from assets/getting-started_schedule.md.tVJ8UgNc.lean.js
rename to assets/getting-started_schedule.md.7R1TStAB.lean.js
index 32b99a9f..308919fb 100644
--- a/assets/getting-started_schedule.md.tVJ8UgNc.lean.js
+++ b/assets/getting-started_schedule.md.7R1TStAB.lean.js
@@ -1 +1 @@
-import{_ as t,o as a,c as s,ag as n}from"./chunks/framework.CvgP6Fyv.js";const p=JSON.parse('{"title":"Scheduled Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/schedule.md","filePath":"getting-started/schedule.md","lastUpdated":1774459922000}'),i={name:"getting-started/schedule.md"};function o(r,e,d,l,h,c){return a(),s("div",null,[...e[0]||(e[0]=[n("",35)])])}const g=t(i,[["render",o]]);export{p as __pageData,g as default};
+import{_ as t,o as a,c as s,ag as n}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Scheduled Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/schedule.md","filePath":"getting-started/schedule.md","lastUpdated":1774459922000}'),i={name:"getting-started/schedule.md"};function o(r,e,d,l,h,c){return a(),s("div",null,[...e[0]||(e[0]=[n("",35)])])}const g=t(i,[["render",o]]);export{p as __pageData,g as default};
diff --git a/assets/getting-started_search-provider.md.CvBWWZPP.js b/assets/getting-started_search-provider.md.DDV1py8V.js
similarity index 97%
rename from assets/getting-started_search-provider.md.CvBWWZPP.js
rename to assets/getting-started_search-provider.md.DDV1py8V.js
index 017fbd1a..d5865245 100644
--- a/assets/getting-started_search-provider.md.CvBWWZPP.js
+++ b/assets/getting-started_search-provider.md.DDV1py8V.js
@@ -1 +1 @@
-import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.CvgP6Fyv.js";const u=JSON.parse('{"title":"Search Providers","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/search-provider.md","filePath":"getting-started/search-provider.md","lastUpdated":1774787421000}'),i={name:"getting-started/search-provider.md"};function n(s,e,d,l,c,h){return t(),o("div",null,[...e[0]||(e[0]=[a('

Search Providers

Memoh allows you to connect your Bot to various search engines, enabling it to browse the web for real-time information and external knowledge.

Concept: Real-Time Knowledge

A Search Provider is a connection to a specific search API (like Brave, Google, or Bing). Once configured, it becomes a tool that your Bot can use during conversation.


Supported Search Engines

Configure your search engines from the Search Provider page in the sidebar.

Supported EnginesNotes
BraveHighly recommended for privacy and performance.
BingPowerful global search capability.
GoogleComprehensive web search.
TavilyDesigned specifically for AI-powered research.
SearxNGConnect to your own self-hosted search aggregator.
DuckDuckGoPrivacy-focused search.
Other ProvidersSogou, Serper, Jina, Exa, Bocha, Yandex.

Configuration Flow

1. Adding a Search Provider

  1. Navigate to the Search Provider page from the sidebar.
  2. Click Add Search Provider.
  3. Fill in the following:
    • Name: A friendly name (e.g., "My Brave Search").
    • API Key: Your credentials for the specific search engine API.
    • Other Parameters: Depending on the engine, you may need to specify additional settings (e.g., base_url for SearxNG).

2. Managing Providers

  • Edit: Select a provider from the sidebar and update its configuration in the form on the right.
  • Delete: Use the Delete Provider button in the provider settings form.

Assigning a Search Provider to a Bot

  1. Navigate to the Bots page and select your bot.
  2. Go to the General tab.
  3. Find the Search Provider dropdown and select the provider you created.
  4. Click Save.

Bot Interaction

  • When a user's question requires real-time information, the bot will automatically call its assigned Search Provider.
  • The bot will process the search results to provide a grounded and accurate response.
  • Multiple search results can be synthesized to provide a comprehensive answer.
',20)])])}const p=r(i,[["render",n]]);export{u as __pageData,p as default}; +import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Search Providers","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/search-provider.md","filePath":"getting-started/search-provider.md","lastUpdated":1774787421000}'),i={name:"getting-started/search-provider.md"};function n(s,e,d,l,c,h){return t(),o("div",null,[...e[0]||(e[0]=[a('

Search Providers

Memoh allows you to connect your Bot to various search engines, enabling it to browse the web for real-time information and external knowledge.

Concept: Real-Time Knowledge

A Search Provider is a connection to a specific search API (like Brave, Google, or Bing). Once configured, it becomes a tool that your Bot can use during conversation.


Supported Search Engines

Configure your search engines from the Search Provider page in the sidebar.

Supported EnginesNotes
BraveHighly recommended for privacy and performance.
BingPowerful global search capability.
GoogleComprehensive web search.
TavilyDesigned specifically for AI-powered research.
SearxNGConnect to your own self-hosted search aggregator.
DuckDuckGoPrivacy-focused search.
Other ProvidersSogou, Serper, Jina, Exa, Bocha, Yandex.

Configuration Flow

1. Adding a Search Provider

  1. Navigate to the Search Provider page from the sidebar.
  2. Click Add Search Provider.
  3. Fill in the following:
    • Name: A friendly name (e.g., "My Brave Search").
    • API Key: Your credentials for the specific search engine API.
    • Other Parameters: Depending on the engine, you may need to specify additional settings (e.g., base_url for SearxNG).

2. Managing Providers

  • Edit: Select a provider from the sidebar and update its configuration in the form on the right.
  • Delete: Use the Delete Provider button in the provider settings form.

Assigning a Search Provider to a Bot

  1. Navigate to the Bots page and select your bot.
  2. Go to the General tab.
  3. Find the Search Provider dropdown and select the provider you created.
  4. Click Save.

Bot Interaction

  • When a user's question requires real-time information, the bot will automatically call its assigned Search Provider.
  • The bot will process the search results to provide a grounded and accurate response.
  • Multiple search results can be synthesized to provide a comprehensive answer.
',20)])])}const p=r(i,[["render",n]]);export{u as __pageData,p as default}; diff --git a/assets/getting-started_search-provider.md.CvBWWZPP.lean.js b/assets/getting-started_search-provider.md.DDV1py8V.lean.js similarity index 73% rename from assets/getting-started_search-provider.md.CvBWWZPP.lean.js rename to assets/getting-started_search-provider.md.DDV1py8V.lean.js index 6d48e138..22870fba 100644 --- a/assets/getting-started_search-provider.md.CvBWWZPP.lean.js +++ b/assets/getting-started_search-provider.md.DDV1py8V.lean.js @@ -1 +1 @@ -import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.CvgP6Fyv.js";const u=JSON.parse('{"title":"Search Providers","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/search-provider.md","filePath":"getting-started/search-provider.md","lastUpdated":1774787421000}'),i={name:"getting-started/search-provider.md"};function n(s,e,d,l,c,h){return t(),o("div",null,[...e[0]||(e[0]=[a("",20)])])}const p=r(i,[["render",n]]);export{u as __pageData,p as default}; +import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Search Providers","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/search-provider.md","filePath":"getting-started/search-provider.md","lastUpdated":1774787421000}'),i={name:"getting-started/search-provider.md"};function n(s,e,d,l,c,h){return t(),o("div",null,[...e[0]||(e[0]=[a("",20)])])}const p=r(i,[["render",n]]);export{u as __pageData,p as default}; diff --git a/assets/getting-started_sessions.md.DCv4I7U5.js b/assets/getting-started_sessions.md.CaVKbfb5.js similarity index 98% rename from assets/getting-started_sessions.md.DCv4I7U5.js rename to assets/getting-started_sessions.md.CaVKbfb5.js index 61bfdf0a..6fe2ce65 100644 --- a/assets/getting-started_sessions.md.DCv4I7U5.js +++ b/assets/getting-started_sessions.md.CaVKbfb5.js @@ -1 +1 @@ -import{_ as s,o as t,c as n,ag as o}from"./chunks/framework.CvgP6Fyv.js";const u=JSON.parse('{"title":"Sessions","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/sessions.md","filePath":"getting-started/sessions.md","lastUpdated":1774787421000}'),a={name:"getting-started/sessions.md"};function i(r,e,h,l,d,c){return t(),n("div",null,[...e[0]||(e[0]=[o('

Sessions

A Session is an independent conversation thread between a user and a bot. Each session maintains its own context window and message history, allowing the bot to focus on a specific topic or task without interference from other conversations.


Concept: Conversation Isolation

When you chat with a bot, your messages are grouped into a session. The bot uses the session's history to maintain context. Starting a new session resets this context, giving you a fresh conversation without losing the previous one.

Sessions are scoped per bot — each bot manages its own set of sessions independently.


Session Types

Memoh uses four session types to separate different kinds of bot activity:

TypeDescription
ChatStandard user-initiated conversations. This is the default session type when chatting with a bot.
HeartbeatAutomatically created when a bot's heartbeat triggers. Contains the bot's periodic autonomous activity.
ScheduleCreated when a scheduled task fires. Contains the bot's execution of a cron-triggered command.
SubagentCreated when the bot delegates a task to a subagent. Contains the subagent's independent work context.

Only Chat sessions are directly created by users. The other types are system-managed and appear as read-only records in the session list.


Starting a New Session with /new

The /new slash command creates a fresh chat session, resetting the conversation context. This works across all channels:

In External Channels (Telegram, Discord, Feishu, etc.)

Send /new as a message to the bot. The bot will:

  1. Create a new chat session.
  2. Route all subsequent messages from you to this new session.
  3. The previous session's history is preserved but no longer active.

This is especially useful when:

  • You want to change topics without the bot referencing old context.
  • The conversation has become too long and you want a clean start.
  • You are switching between different tasks.

In the Web UI

The Web UI provides a session sidebar where you can:

  • Click the New Session button to create a fresh chat session.
  • Switch between existing sessions by clicking on them.
  • Search sessions by content.
  • Filter sessions by type (chat, heartbeat, schedule, subagent).
  • Rename or delete sessions.

Managing Sessions

Viewing Sessions

In the Web UI, the session sidebar lists all sessions for the currently selected bot. Each entry shows:

  • Title — The session name (auto-generated or user-defined).
  • Type — The session type icon.
  • Last Activity — When the session was last active.

Renaming Sessions

Click on a session title to rename it. This helps organize conversations by topic.

Deleting Sessions

Remove sessions you no longer need. Deleting a session removes its message history permanently.


How Sessions Relate to Other Features

  • Heartbeat sessions are created on each heartbeat trigger. You can view what the bot did during its autonomous activity by opening the corresponding heartbeat session.
  • Schedule sessions are created when a scheduled task runs. Check these to see the results of cron-triggered commands.
  • Subagent sessions track delegated tasks. They show the independent work context of each subagent invocation.
  • Memory is shared across all sessions for a bot — memories extracted from one session are available in all others.
',34)])])}const b=s(a,[["render",i]]);export{u as __pageData,b as default}; +import{_ as s,o as t,c as n,ag as o}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Sessions","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/sessions.md","filePath":"getting-started/sessions.md","lastUpdated":1774787421000}'),a={name:"getting-started/sessions.md"};function i(r,e,h,l,d,c){return t(),n("div",null,[...e[0]||(e[0]=[o('

Sessions

A Session is an independent conversation thread between a user and a bot. Each session maintains its own context window and message history, allowing the bot to focus on a specific topic or task without interference from other conversations.


Concept: Conversation Isolation

When you chat with a bot, your messages are grouped into a session. The bot uses the session's history to maintain context. Starting a new session resets this context, giving you a fresh conversation without losing the previous one.

Sessions are scoped per bot — each bot manages its own set of sessions independently.


Session Types

Memoh uses four session types to separate different kinds of bot activity:

TypeDescription
ChatStandard user-initiated conversations. This is the default session type when chatting with a bot.
HeartbeatAutomatically created when a bot's heartbeat triggers. Contains the bot's periodic autonomous activity.
ScheduleCreated when a scheduled task fires. Contains the bot's execution of a cron-triggered command.
SubagentCreated when the bot delegates a task to a subagent. Contains the subagent's independent work context.

Only Chat sessions are directly created by users. The other types are system-managed and appear as read-only records in the session list.


Starting a New Session with /new

The /new slash command creates a fresh chat session, resetting the conversation context. This works across all channels:

In External Channels (Telegram, Discord, Feishu, etc.)

Send /new as a message to the bot. The bot will:

  1. Create a new chat session.
  2. Route all subsequent messages from you to this new session.
  3. The previous session's history is preserved but no longer active.

This is especially useful when:

  • You want to change topics without the bot referencing old context.
  • The conversation has become too long and you want a clean start.
  • You are switching between different tasks.

In the Web UI

The Web UI provides a session sidebar where you can:

  • Click the New Session button to create a fresh chat session.
  • Switch between existing sessions by clicking on them.
  • Search sessions by content.
  • Filter sessions by type (chat, heartbeat, schedule, subagent).
  • Rename or delete sessions.

Managing Sessions

Viewing Sessions

In the Web UI, the session sidebar lists all sessions for the currently selected bot. Each entry shows:

  • Title — The session name (auto-generated or user-defined).
  • Type — The session type icon.
  • Last Activity — When the session was last active.

Renaming Sessions

Click on a session title to rename it. This helps organize conversations by topic.

Deleting Sessions

Remove sessions you no longer need. Deleting a session removes its message history permanently.


How Sessions Relate to Other Features

  • Heartbeat sessions are created on each heartbeat trigger. You can view what the bot did during its autonomous activity by opening the corresponding heartbeat session.
  • Schedule sessions are created when a scheduled task runs. Check these to see the results of cron-triggered commands.
  • Subagent sessions track delegated tasks. They show the independent work context of each subagent invocation.
  • Memory is shared across all sessions for a bot — memories extracted from one session are available in all others.
',34)])])}const b=s(a,[["render",i]]);export{u as __pageData,b as default}; diff --git a/assets/getting-started_sessions.md.DCv4I7U5.lean.js b/assets/getting-started_sessions.md.CaVKbfb5.lean.js similarity index 72% rename from assets/getting-started_sessions.md.DCv4I7U5.lean.js rename to assets/getting-started_sessions.md.CaVKbfb5.lean.js index 590c0acc..75e40fd4 100644 --- a/assets/getting-started_sessions.md.DCv4I7U5.lean.js +++ b/assets/getting-started_sessions.md.CaVKbfb5.lean.js @@ -1 +1 @@ -import{_ as s,o as t,c as n,ag as o}from"./chunks/framework.CvgP6Fyv.js";const u=JSON.parse('{"title":"Sessions","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/sessions.md","filePath":"getting-started/sessions.md","lastUpdated":1774787421000}'),a={name:"getting-started/sessions.md"};function i(r,e,h,l,d,c){return t(),n("div",null,[...e[0]||(e[0]=[o("",34)])])}const b=s(a,[["render",i]]);export{u as __pageData,b as default}; +import{_ as s,o as t,c as n,ag as o}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Sessions","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/sessions.md","filePath":"getting-started/sessions.md","lastUpdated":1774787421000}'),a={name:"getting-started/sessions.md"};function i(r,e,h,l,d,c){return t(),n("div",null,[...e[0]||(e[0]=[o("",34)])])}const b=s(a,[["render",i]]);export{u as __pageData,b as default}; diff --git a/assets/getting-started_skills.md.BMbCYp3W.js b/assets/getting-started_skills.md.E3JgIlwr.js similarity index 97% rename from assets/getting-started_skills.md.BMbCYp3W.js rename to assets/getting-started_skills.md.E3JgIlwr.js index dacfcaa4..2409efba 100644 --- a/assets/getting-started_skills.md.BMbCYp3W.js +++ b/assets/getting-started_skills.md.E3JgIlwr.js @@ -1,4 +1,4 @@ -import{_ as s,o as i,c as t,ag as e}from"./chunks/framework.CvgP6Fyv.js";const c=JSON.parse('{"title":"Bot Skills","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/skills.md","filePath":"getting-started/skills.md","lastUpdated":1772359263000}'),l={name:"getting-started/skills.md"};function n(o,a,r,d,h,k){return i(),t("div",null,[...a[0]||(a[0]=[e(`

Bot Skills

Skills are the "personality" and "capabilities" of a Memoh Bot. They define how the bot should behave and what tools it can use.

Concept: Skills as Markdown

A Skill is represented as a Markdown document with YAML frontmatter. These files are stored within the bot's container and parsed into tools and personality traits.

Example Skill Structure

yaml
---
+import{_ as s,o as i,c as t,ag as e}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"Bot Skills","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/skills.md","filePath":"getting-started/skills.md","lastUpdated":1772359263000}'),l={name:"getting-started/skills.md"};function n(o,a,r,d,h,k){return i(),t("div",null,[...a[0]||(a[0]=[e(`

Bot Skills

Skills are the "personality" and "capabilities" of a Memoh Bot. They define how the bot should behave and what tools it can use.

Concept: Skills as Markdown

A Skill is represented as a Markdown document with YAML frontmatter. These files are stored within the bot's container and parsed into tools and personality traits.

Example Skill Structure

yaml
---
 name: coder-skill
 description: Enables advanced coding capabilities and tool use.
 ---
diff --git a/assets/getting-started_skills.md.BMbCYp3W.lean.js b/assets/getting-started_skills.md.E3JgIlwr.lean.js
similarity index 71%
rename from assets/getting-started_skills.md.BMbCYp3W.lean.js
rename to assets/getting-started_skills.md.E3JgIlwr.lean.js
index b38addd0..8e2b99aa 100644
--- a/assets/getting-started_skills.md.BMbCYp3W.lean.js
+++ b/assets/getting-started_skills.md.E3JgIlwr.lean.js
@@ -1 +1 @@
-import{_ as s,o as i,c as t,ag as e}from"./chunks/framework.CvgP6Fyv.js";const c=JSON.parse('{"title":"Bot Skills","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/skills.md","filePath":"getting-started/skills.md","lastUpdated":1772359263000}'),l={name:"getting-started/skills.md"};function n(o,a,r,d,h,k){return i(),t("div",null,[...a[0]||(a[0]=[e("",16)])])}const g=s(l,[["render",n]]);export{c as __pageData,g as default};
+import{_ as s,o as i,c as t,ag as e}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"Bot Skills","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/skills.md","filePath":"getting-started/skills.md","lastUpdated":1772359263000}'),l={name:"getting-started/skills.md"};function n(o,a,r,d,h,k){return i(),t("div",null,[...a[0]||(a[0]=[e("",16)])])}const g=s(l,[["render",n]]);export{c as __pageData,g as default};
diff --git a/assets/getting-started_slash-commands.md.BsVHX_1A.js b/assets/getting-started_slash-commands.md.CBeh4epy.js
similarity index 99%
rename from assets/getting-started_slash-commands.md.BsVHX_1A.js
rename to assets/getting-started_slash-commands.md.CBeh4epy.js
index f3700bdf..a4807ccd 100644
--- a/assets/getting-started_slash-commands.md.BsVHX_1A.js
+++ b/assets/getting-started_slash-commands.md.CBeh4epy.js
@@ -1 +1 @@
-import{_ as t,o as d,c as a,ag as o}from"./chunks/framework.CvgP6Fyv.js";const p=JSON.parse('{"title":"Slash Commands","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/slash-commands.md","filePath":"getting-started/slash-commands.md","lastUpdated":1774787421000}'),s={name:"getting-started/slash-commands.md"};function r(n,e,c,l,i,h){return d(),a("div",null,[...e[0]||(e[0]=[o('

Slash Commands

Memoh bots support slash commands — text commands prefixed with / that can be sent in any channel (Telegram, Discord, Feishu, Web, etc.) to perform administrative actions without going through the AI agent.

Slash commands are intercepted before they reach the LLM, so they execute instantly and don't consume tokens.


Quick Reference

CommandDescription
/helpShow all available commands
/newStart a new conversation session
/scheduleManage scheduled tasks
/mcpManage MCP connections
/settingsView and update bot settings
/modelManage bot models
/memoryManage memory provider
/searchManage search provider
/browserManage browser context
/usageView token usage statistics
/emailView email configuration
/heartbeatView heartbeat logs
/skillView bot skills
/fsBrowse container filesystem

Command Format

Commands follow the pattern:

/resource [action] [arguments...]
  • resource — The command group (e.g., schedule, model).
  • action — The sub-command (e.g., list, set, create). Some commands have a default action.
  • arguments — Additional parameters. Use quotes for values with spaces.

Example: /schedule create daily-report "0 9 * * *" "Send me a daily summary"


Permissions

Commands that modify bot settings are marked as owner-only. Only the bot owner can execute these commands. Read-only commands (listing, viewing) are available to all users who have chat access.

Owner-only commands are marked with [owner] in the /help output.


Global Commands

/help

Displays a list of all available commands and their usage.

/new

Starts a new conversation session, resetting the current context. See Sessions for details.


/schedule — Manage Scheduled Tasks

Sub-commandUsagePermission
list/schedule listAll
get/schedule get <name>All
create/schedule create <name> <pattern> <command>Owner
update/schedule update <name> [--pattern P] [--command C]Owner
delete/schedule delete <name>Owner
enable/schedule enable <name>Owner
disable/schedule disable <name>Owner

Examples:

/schedule list\n/schedule create morning-news "0 9 * * *" "Summarize today's top tech news"\n/schedule disable morning-news

/mcp — Manage MCP Connections

Sub-commandUsagePermission
list/mcp listAll
get/mcp get <name>All
delete/mcp delete <name>Owner

/settings — View and Update Bot Settings

Sub-commandUsagePermission
get/settings or /settings getAll
update/settings update [options]Owner

Update options:

OptionValues
--languageLanguage code (e.g., en, zh)
--acl_default_effectallow or deny
--reasoning_enabledtrue or false
--reasoning_effortlow, medium, or high
--heartbeat_enabledtrue or false
--heartbeat_intervalMinutes (integer)
--chat_model_idModel UUID
--heartbeat_model_idModel UUID

Example:

/settings update --language en --heartbeat_enabled true --heartbeat_interval 30

/model — Manage Bot Models

Sub-commandUsagePermission
list/model listAll
set/model set <provider_name> <model_name>Owner
set-heartbeat/model set-heartbeat <provider_name> <model_name>Owner

Example:

/model list\n/model set OpenAI gpt-4o\n/model set-heartbeat OpenAI gpt-4o-mini

/memory — Manage Memory Provider

Sub-commandUsagePermission
list/memory listAll
set/memory set <name>Owner

/search — Manage Search Provider

Sub-commandUsagePermission
list/search listAll
set/search set <name>Owner

/browser — Manage Browser Context

Sub-commandUsagePermission
list/browser listAll
set/browser set <name>Owner

/usage — View Token Usage

Sub-commandUsagePermission
summary/usage or /usage summaryAll
by-model/usage by-modelAll

Shows token usage for the last 7 days, broken down by session type (chat, heartbeat, schedule) or by model.


/email — View Email Configuration

Sub-commandUsagePermission
providers/email providersAll
bindings/email bindingsAll
outbox/email outboxAll

/heartbeat — View Heartbeat Logs

Sub-commandUsagePermission
logs/heartbeat or /heartbeat logsAll

Shows the 10 most recent heartbeat execution logs.


/skill — View Bot Skills

Sub-commandUsagePermission
list/skill or /skill listAll

/fs — Browse Container Filesystem

Sub-commandUsagePermission
list/fs list [path]All
read/fs read <path>All

Examples:

/fs list /\n/fs list /home\n/fs read /home/bot/IDENTITY.md

File content is truncated to 2000 characters when displayed in chat.


Mention-Prefixed Commands

In group chats, you can prefix commands with a mention:

@BotName /help\n@BotName /new

The bot will strip the mention and process the slash command normally.

',76)])])}const b=t(s,[["render",r]]);export{p as __pageData,b as default}; +import{_ as t,o as d,c as a,ag as o}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Slash Commands","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/slash-commands.md","filePath":"getting-started/slash-commands.md","lastUpdated":1774787421000}'),s={name:"getting-started/slash-commands.md"};function r(n,e,c,l,i,h){return d(),a("div",null,[...e[0]||(e[0]=[o('

Slash Commands

Memoh bots support slash commands — text commands prefixed with / that can be sent in any channel (Telegram, Discord, Feishu, Web, etc.) to perform administrative actions without going through the AI agent.

Slash commands are intercepted before they reach the LLM, so they execute instantly and don't consume tokens.


Quick Reference

CommandDescription
/helpShow all available commands
/newStart a new conversation session
/scheduleManage scheduled tasks
/mcpManage MCP connections
/settingsView and update bot settings
/modelManage bot models
/memoryManage memory provider
/searchManage search provider
/browserManage browser context
/usageView token usage statistics
/emailView email configuration
/heartbeatView heartbeat logs
/skillView bot skills
/fsBrowse container filesystem

Command Format

Commands follow the pattern:

/resource [action] [arguments...]
  • resource — The command group (e.g., schedule, model).
  • action — The sub-command (e.g., list, set, create). Some commands have a default action.
  • arguments — Additional parameters. Use quotes for values with spaces.

Example: /schedule create daily-report "0 9 * * *" "Send me a daily summary"


Permissions

Commands that modify bot settings are marked as owner-only. Only the bot owner can execute these commands. Read-only commands (listing, viewing) are available to all users who have chat access.

Owner-only commands are marked with [owner] in the /help output.


Global Commands

/help

Displays a list of all available commands and their usage.

/new

Starts a new conversation session, resetting the current context. See Sessions for details.


/schedule — Manage Scheduled Tasks

Sub-commandUsagePermission
list/schedule listAll
get/schedule get <name>All
create/schedule create <name> <pattern> <command>Owner
update/schedule update <name> [--pattern P] [--command C]Owner
delete/schedule delete <name>Owner
enable/schedule enable <name>Owner
disable/schedule disable <name>Owner

Examples:

/schedule list\n/schedule create morning-news "0 9 * * *" "Summarize today's top tech news"\n/schedule disable morning-news

/mcp — Manage MCP Connections

Sub-commandUsagePermission
list/mcp listAll
get/mcp get <name>All
delete/mcp delete <name>Owner

/settings — View and Update Bot Settings

Sub-commandUsagePermission
get/settings or /settings getAll
update/settings update [options]Owner

Update options:

OptionValues
--languageLanguage code (e.g., en, zh)
--acl_default_effectallow or deny
--reasoning_enabledtrue or false
--reasoning_effortlow, medium, or high
--heartbeat_enabledtrue or false
--heartbeat_intervalMinutes (integer)
--chat_model_idModel UUID
--heartbeat_model_idModel UUID

Example:

/settings update --language en --heartbeat_enabled true --heartbeat_interval 30

/model — Manage Bot Models

Sub-commandUsagePermission
list/model listAll
set/model set <provider_name> <model_name>Owner
set-heartbeat/model set-heartbeat <provider_name> <model_name>Owner

Example:

/model list\n/model set OpenAI gpt-4o\n/model set-heartbeat OpenAI gpt-4o-mini

/memory — Manage Memory Provider

Sub-commandUsagePermission
list/memory listAll
set/memory set <name>Owner

/search — Manage Search Provider

Sub-commandUsagePermission
list/search listAll
set/search set <name>Owner

/browser — Manage Browser Context

Sub-commandUsagePermission
list/browser listAll
set/browser set <name>Owner

/usage — View Token Usage

Sub-commandUsagePermission
summary/usage or /usage summaryAll
by-model/usage by-modelAll

Shows token usage for the last 7 days, broken down by session type (chat, heartbeat, schedule) or by model.


/email — View Email Configuration

Sub-commandUsagePermission
providers/email providersAll
bindings/email bindingsAll
outbox/email outboxAll

/heartbeat — View Heartbeat Logs

Sub-commandUsagePermission
logs/heartbeat or /heartbeat logsAll

Shows the 10 most recent heartbeat execution logs.


/skill — View Bot Skills

Sub-commandUsagePermission
list/skill or /skill listAll

/fs — Browse Container Filesystem

Sub-commandUsagePermission
list/fs list [path]All
read/fs read <path>All

Examples:

/fs list /\n/fs list /home\n/fs read /home/bot/IDENTITY.md

File content is truncated to 2000 characters when displayed in chat.


Mention-Prefixed Commands

In group chats, you can prefix commands with a mention:

@BotName /help\n@BotName /new

The bot will strip the mention and process the slash command normally.

',76)])])}const b=t(s,[["render",r]]);export{p as __pageData,b as default}; diff --git a/assets/getting-started_slash-commands.md.BsVHX_1A.lean.js b/assets/getting-started_slash-commands.md.CBeh4epy.lean.js similarity index 73% rename from assets/getting-started_slash-commands.md.BsVHX_1A.lean.js rename to assets/getting-started_slash-commands.md.CBeh4epy.lean.js index d178ac39..03ea919b 100644 --- a/assets/getting-started_slash-commands.md.BsVHX_1A.lean.js +++ b/assets/getting-started_slash-commands.md.CBeh4epy.lean.js @@ -1 +1 @@ -import{_ as t,o as d,c as a,ag as o}from"./chunks/framework.CvgP6Fyv.js";const p=JSON.parse('{"title":"Slash Commands","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/slash-commands.md","filePath":"getting-started/slash-commands.md","lastUpdated":1774787421000}'),s={name:"getting-started/slash-commands.md"};function r(n,e,c,l,i,h){return d(),a("div",null,[...e[0]||(e[0]=[o("",76)])])}const b=t(s,[["render",r]]);export{p as __pageData,b as default}; +import{_ as t,o as d,c as a,ag as o}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Slash Commands","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/slash-commands.md","filePath":"getting-started/slash-commands.md","lastUpdated":1774787421000}'),s={name:"getting-started/slash-commands.md"};function r(n,e,c,l,i,h){return d(),a("div",null,[...e[0]||(e[0]=[o("",76)])])}const b=t(s,[["render",r]]);export{p as __pageData,b as default}; diff --git a/assets/index.md.DJ2zSR3k.js b/assets/index.md.MTTbinuf.js similarity index 92% rename from assets/index.md.DJ2zSR3k.js rename to assets/index.md.MTTbinuf.js index d081996e..f76025db 100644 --- a/assets/index.md.DJ2zSR3k.js +++ b/assets/index.md.MTTbinuf.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.CvgP6Fyv.js";const u=JSON.parse('{"title":"Memoh Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1774787421000}'),i={name:"index.md"};function r(s,e,m,l,d,c){return a(),o("div",null,[...e[0]||(e[0]=[n('

Memoh Documentation

Memoh(/ˈmemoʊ/) is a multi-member, structured long-memory, containerized AI agent system. Create your own AI bots, chat with them via Telegram, Discord, Lark (Feishu), QQ, Matrix, WeCom, WeChat, Email, or Web. Each bot runs in an isolated container with its own memory system — able to edit files, run commands, and access the network.

Documentation

  • About Memoh — What Memoh is, key features, and installation links.
  • Installation — Docker setup (recommended).
  • Getting Started — Step-by-step guide to configure models, bots, and channels.
  • Channels — Detailed guides for Telegram, Feishu, Discord, QQ, Matrix, WeCom, and WeChat.
',4)])])}const _=t(i,[["render",r]]);export{u as __pageData,_ as default}; +import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Memoh Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1774787421000}'),i={name:"index.md"};function r(s,e,m,l,d,c){return a(),o("div",null,[...e[0]||(e[0]=[n('

Memoh Documentation

Memoh(/ˈmemoʊ/) is a multi-member, structured long-memory, containerized AI agent system. Create your own AI bots, chat with them via Telegram, Discord, Lark (Feishu), QQ, Matrix, WeCom, WeChat, Email, or Web. Each bot runs in an isolated container with its own memory system — able to edit files, run commands, and access the network.

Documentation

  • About Memoh — What Memoh is, key features, and installation links.
  • Installation — Docker setup (recommended).
  • Getting Started — Step-by-step guide to configure models, bots, and channels.
  • Channels — Detailed guides for Telegram, Feishu, Discord, QQ, Matrix, WeCom, and WeChat.
',4)])])}const _=t(i,[["render",r]]);export{u as __pageData,_ as default}; diff --git a/assets/index.md.DJ2zSR3k.lean.js b/assets/index.md.MTTbinuf.lean.js similarity index 69% rename from assets/index.md.DJ2zSR3k.lean.js rename to assets/index.md.MTTbinuf.lean.js index 02c22996..d0f05186 100644 --- a/assets/index.md.DJ2zSR3k.lean.js +++ b/assets/index.md.MTTbinuf.lean.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.CvgP6Fyv.js";const u=JSON.parse('{"title":"Memoh Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1774787421000}'),i={name:"index.md"};function r(s,e,m,l,d,c){return a(),o("div",null,[...e[0]||(e[0]=[n("",4)])])}const _=t(i,[["render",r]]);export{u as __pageData,_ as default}; +import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Memoh Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1774787421000}'),i={name:"index.md"};function r(s,e,m,l,d,c){return a(),o("div",null,[...e[0]||(e[0]=[n("",4)])])}const _=t(i,[["render",r]]);export{u as __pageData,_ as default}; diff --git a/assets/installation_docker.md.EGlSgJeL.js b/assets/installation_docker.md.DxE7r3rU.js similarity index 99% rename from assets/installation_docker.md.EGlSgJeL.js rename to assets/installation_docker.md.DxE7r3rU.js index 759de4b9..be1b090b 100644 --- a/assets/installation_docker.md.EGlSgJeL.js +++ b/assets/installation_docker.md.DxE7r3rU.js @@ -1,4 +1,4 @@ -import{_ as e,o as i,c as t,ag as a}from"./chunks/framework.CvgP6Fyv.js";const k=JSON.parse('{"title":"Docker Installation","description":"","frontmatter":{},"headers":[],"relativePath":"installation/docker.md","filePath":"installation/docker.md","lastUpdated":1774787421000}'),n={name:"installation/docker.md"};function o(r,s,d,l,h,p){return i(),t("div",null,[...s[0]||(s[0]=[a(`

Docker Installation

Docker is the recommended way to run Memoh. The stack includes PostgreSQL, the main server (with embedded Containerd and in-process AI agent), and the web UI — all orchestrated via Docker Compose. You do not need to install containerd, nerdctl, or buildkit on your host; everything runs inside containers.

Service Architecture

The Docker Compose stack consists of multiple services. Some are always started, others are optional and enabled via --profile:

ServiceProfileDescription
server(core)Main Memoh server with embedded Containerd and in-process AI agent
web(core)Web UI (Vue 3)
postgres(core)PostgreSQL database
qdrantqdrantQdrant vector database for memory search (sparse and dense modes)
browserbrowserPlaywright-based browser gateway for bot web automation
sparsesparseNeural sparse encoding service for memory retrieval (see below)

Sparse Service

The sparse container provides neural sparse vector encoding for memory retrieval. It runs a lightweight Python (Flask) service on port 8085 that uses the opensearch-neural-sparse-encoding-multilingual-v1 model from OpenSearch.

What it does:

  • Converts document text into sparse vectors (a compact list of token indices + importance weights) using a masked language model
  • Encodes queries using IDF-weighted term lookup for fast, efficient retrieval
  • Works with Qdrant to enable semantic memory search without requiring an external embedding API

Why use it:

  • No embedding API costs — The model runs locally inside the container, so you don't need an OpenAI/Cohere/etc. embedding API key
  • Multilingual — The underlying model supports multiple languages out of the box
  • Good retrieval quality — Neural sparse encoding provides significantly better results than keyword-only search (BM25), while being lighter than dense embedding models

When to enable it:

Enable the sparse profile (--profile sparse) if you plan to use the built-in memory provider in sparse mode. The model is pre-downloaded during the Docker image build, so the container starts quickly without needing to fetch weights at runtime.

bash
docker compose --profile qdrant --profile sparse --profile browser up -d

For more details on memory modes, see Built-in Memory Provider.

Prerequisites

Run the official install script (requires Docker and Docker Compose):

bash
curl -fsSL https://memoh.sh | sudo sh

The script will:

  1. Check for Docker and Docker Compose
  2. Prompt for configuration (workspace, data directory, admin credentials, JWT secret, Postgres password, sparse service toggle, browser core selection)
  3. Fetch the latest release tag from GitHub and clone the repository
  4. Generate config.toml from the Docker template with your settings
  5. Pin Docker image versions to the release
  6. Build the browser image with selected cores and start all services

Silent install (use all defaults, no prompts):

bash
curl -fsSL https://memoh.sh | sudo sh -s -- -y

Defaults when running silently:

  • Workspace: ~/memoh
  • Data directory: ~/memoh/data
  • Admin: admin / admin123
  • JWT secret: auto-generated
  • Postgres password: memoh123

Install a specific version:

bash
curl -fsSL https://memoh.sh | sudo sh -s -- --version v0.6.0

Or using the environment variable:

bash
curl -fsSL https://memoh.sh | sudo MEMOH_VERSION=v0.6.0 sh

Use China mainland mirror (for slow image pulls):

bash
curl -fsSL https://memoh.sh | sudo USE_CN_MIRROR=true sh

Environment variables can be combined, e.g. curl -fsSL https://memoh.sh | sudo MEMOH_VERSION=v0.6.0 USE_CN_MIRROR=true sh

Manual Install

bash
git clone https://github.com/memohai/Memoh.git
+import{_ as e,o as i,c as t,ag as a}from"./chunks/framework.DXGyWiRo.js";const k=JSON.parse('{"title":"Docker Installation","description":"","frontmatter":{},"headers":[],"relativePath":"installation/docker.md","filePath":"installation/docker.md","lastUpdated":1774787421000}'),n={name:"installation/docker.md"};function o(r,s,d,l,h,p){return i(),t("div",null,[...s[0]||(s[0]=[a(`

Docker Installation

Docker is the recommended way to run Memoh. The stack includes PostgreSQL, the main server (with embedded Containerd and in-process AI agent), and the web UI — all orchestrated via Docker Compose. You do not need to install containerd, nerdctl, or buildkit on your host; everything runs inside containers.

Service Architecture

The Docker Compose stack consists of multiple services. Some are always started, others are optional and enabled via --profile:

ServiceProfileDescription
server(core)Main Memoh server with embedded Containerd and in-process AI agent
web(core)Web UI (Vue 3)
postgres(core)PostgreSQL database
qdrantqdrantQdrant vector database for memory search (sparse and dense modes)
browserbrowserPlaywright-based browser gateway for bot web automation
sparsesparseNeural sparse encoding service for memory retrieval (see below)

Sparse Service

The sparse container provides neural sparse vector encoding for memory retrieval. It runs a lightweight Python (Flask) service on port 8085 that uses the opensearch-neural-sparse-encoding-multilingual-v1 model from OpenSearch.

What it does:

  • Converts document text into sparse vectors (a compact list of token indices + importance weights) using a masked language model
  • Encodes queries using IDF-weighted term lookup for fast, efficient retrieval
  • Works with Qdrant to enable semantic memory search without requiring an external embedding API

Why use it:

  • No embedding API costs — The model runs locally inside the container, so you don't need an OpenAI/Cohere/etc. embedding API key
  • Multilingual — The underlying model supports multiple languages out of the box
  • Good retrieval quality — Neural sparse encoding provides significantly better results than keyword-only search (BM25), while being lighter than dense embedding models

When to enable it:

Enable the sparse profile (--profile sparse) if you plan to use the built-in memory provider in sparse mode. The model is pre-downloaded during the Docker image build, so the container starts quickly without needing to fetch weights at runtime.

bash
docker compose --profile qdrant --profile sparse --profile browser up -d

For more details on memory modes, see Built-in Memory Provider.

Prerequisites

Run the official install script (requires Docker and Docker Compose):

bash
curl -fsSL https://memoh.sh | sudo sh

The script will:

  1. Check for Docker and Docker Compose
  2. Prompt for configuration (workspace, data directory, admin credentials, JWT secret, Postgres password, sparse service toggle, browser core selection)
  3. Fetch the latest release tag from GitHub and clone the repository
  4. Generate config.toml from the Docker template with your settings
  5. Pin Docker image versions to the release
  6. Build the browser image with selected cores and start all services

Silent install (use all defaults, no prompts):

bash
curl -fsSL https://memoh.sh | sudo sh -s -- -y

Defaults when running silently:

  • Workspace: ~/memoh
  • Data directory: ~/memoh/data
  • Admin: admin / admin123
  • JWT secret: auto-generated
  • Postgres password: memoh123

Install a specific version:

bash
curl -fsSL https://memoh.sh | sudo sh -s -- --version v0.6.0

Or using the environment variable:

bash
curl -fsSL https://memoh.sh | sudo MEMOH_VERSION=v0.6.0 sh

Use China mainland mirror (for slow image pulls):

bash
curl -fsSL https://memoh.sh | sudo USE_CN_MIRROR=true sh

Environment variables can be combined, e.g. curl -fsSL https://memoh.sh | sudo MEMOH_VERSION=v0.6.0 USE_CN_MIRROR=true sh

Manual Install

bash
git clone https://github.com/memohai/Memoh.git
 cd Memoh
 cp conf/app.docker.toml config.toml

Edit config.toml — at minimum change:

  • admin.password — Admin password
  • auth.jwt_secret — Generate with openssl rand -base64 32
  • postgres.password — Database password (also set POSTGRES_PASSWORD env var to match)

Then start (recommended — with Qdrant, Browser, and Sparse):

bash
sudo POSTGRES_PASSWORD=your-db-password docker compose --profile qdrant --profile browser --profile sparse up -d

Or start core services only (no vector DB or browser automation):

bash
sudo POSTGRES_PASSWORD=your-db-password docker compose up -d

On macOS or if your user is in the docker group, sudo is not required.

Important: docker-compose.yml mounts ./config.toml by default. You must create this file before starting — running without it will fail.

China Mainland Mirror

For users in mainland China who cannot access Docker Hub directly, uncomment the registry line in config.toml:

toml
[workspace]
 registry = "memoh.cn"

And add the China mirror compose overlay:

bash
sudo docker compose -f docker-compose.yml -f docker/docker-compose.cn.yml \\
diff --git a/assets/installation_docker.md.EGlSgJeL.lean.js b/assets/installation_docker.md.DxE7r3rU.lean.js
similarity index 71%
rename from assets/installation_docker.md.EGlSgJeL.lean.js
rename to assets/installation_docker.md.DxE7r3rU.lean.js
index f17ed0c6..ec1379f2 100644
--- a/assets/installation_docker.md.EGlSgJeL.lean.js
+++ b/assets/installation_docker.md.DxE7r3rU.lean.js
@@ -1 +1 @@
-import{_ as e,o as i,c as t,ag as a}from"./chunks/framework.CvgP6Fyv.js";const k=JSON.parse('{"title":"Docker Installation","description":"","frontmatter":{},"headers":[],"relativePath":"installation/docker.md","filePath":"installation/docker.md","lastUpdated":1774787421000}'),n={name:"installation/docker.md"};function o(r,s,d,l,h,p){return i(),t("div",null,[...s[0]||(s[0]=[a("",62)])])}const g=e(n,[["render",o]]);export{k as __pageData,g as default};
+import{_ as e,o as i,c as t,ag as a}from"./chunks/framework.DXGyWiRo.js";const k=JSON.parse('{"title":"Docker Installation","description":"","frontmatter":{},"headers":[],"relativePath":"installation/docker.md","filePath":"installation/docker.md","lastUpdated":1774787421000}'),n={name:"installation/docker.md"};function o(r,s,d,l,h,p){return i(),t("div",null,[...s[0]||(s[0]=[a("",62)])])}const g=e(n,[["render",o]]);export{k as __pageData,g as default};
diff --git a/assets/memory-providers_builtin.md.BhfdM6jZ.js b/assets/memory-providers_builtin.md.DlYtNI3G.js
similarity index 98%
rename from assets/memory-providers_builtin.md.BhfdM6jZ.js
rename to assets/memory-providers_builtin.md.DlYtNI3G.js
index cf169119..21df6f44 100644
--- a/assets/memory-providers_builtin.md.BhfdM6jZ.js
+++ b/assets/memory-providers_builtin.md.DlYtNI3G.js
@@ -1,4 +1,4 @@
-import{_ as t,o as i,c as a,ag as s}from"./chunks/framework.CvgP6Fyv.js";const g=JSON.parse('{"title":"Built-in Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/builtin.md","filePath":"memory-providers/builtin.md","lastUpdated":1774787421000}'),r={name:"memory-providers/builtin.md"};function o(n,e,d,l,h,p){return i(),a("div",null,[...e[0]||(e[0]=[s(`

Built-in Memory Provider

The built-in memory provider is the standard memory backend shipped with Memoh. It works with Memoh's memory pipeline and supports:

  • Automatic memory extraction from conversations
  • Semantic memory retrieval during chat
  • Manual memory creation and editing
  • Memory compaction and rebuild workflows

The built-in provider operates in one of three memory modes, each with different infrastructure requirements and retrieval capabilities.


Memory Modes

ModeIndexRequirementsUse Case
OffFile-based onlyNoneLightweight setup, no vector search
SparseNeural sparse vectorsSparse service + Qdrant (--profile sparse)Good retrieval quality without embedding API costs
DenseDense embeddingsEmbedding model + Qdrant (--profile qdrant)Highest-quality semantic search

How Sparse Mode Works

Sparse mode uses the opensearch-neural-sparse-encoding-multilingual-v1 model (from the OpenSearch project) to convert text into sparse vectors — compact lists of token indices with importance weights. Unlike dense mode, which requires an external embedding API, the sparse model runs locally in the sparse container with no API key or cost. It supports multiple languages and provides significantly better retrieval quality than keyword-only search.


Creating a Built-in Provider

  1. Navigate to the Memory Providers page.
  2. Click Add Memory Provider.
  3. Fill in the following fields:
    • Name: A display name for this provider.
    • Provider Type: Select builtin.
  4. Click Create.

Configuring a Built-in Provider

After creating a provider, select it from the list and configure its settings.

FieldDescription
Memory Modeoff (default), sparse, or dense. Controls how memories are indexed and retrieved.
Embedding ModelEmbedding model for dense vector search. Only used in dense mode.
Qdrant CollectionQdrant collection name. Defaults to memory_sparse.

Managing Providers

  • Edit: Select a provider and update its settings.
  • Delete: Remove a provider you no longer use.

Infrastructure Requirements

Off Mode

No additional infrastructure required. Memories are stored and retrieved using file-based indexing only.

Sparse Mode

Requires the sparse service (runs the opensearch-neural-sparse-encoding-multilingual-v1 model locally) and Qdrant vector database. Enable both with Docker Compose profiles:

bash
docker compose --profile qdrant --profile sparse up -d

The following sections must be present in config.toml:

toml
[qdrant]
+import{_ as t,o as i,c as a,ag as s}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Built-in Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/builtin.md","filePath":"memory-providers/builtin.md","lastUpdated":1774787421000}'),r={name:"memory-providers/builtin.md"};function o(n,e,d,l,h,p){return i(),a("div",null,[...e[0]||(e[0]=[s(`

Built-in Memory Provider

The built-in memory provider is the standard memory backend shipped with Memoh. It works with Memoh's memory pipeline and supports:

  • Automatic memory extraction from conversations
  • Semantic memory retrieval during chat
  • Manual memory creation and editing
  • Memory compaction and rebuild workflows

The built-in provider operates in one of three memory modes, each with different infrastructure requirements and retrieval capabilities.


Memory Modes

ModeIndexRequirementsUse Case
OffFile-based onlyNoneLightweight setup, no vector search
SparseNeural sparse vectorsSparse service + Qdrant (--profile sparse)Good retrieval quality without embedding API costs
DenseDense embeddingsEmbedding model + Qdrant (--profile qdrant)Highest-quality semantic search

How Sparse Mode Works

Sparse mode uses the opensearch-neural-sparse-encoding-multilingual-v1 model (from the OpenSearch project) to convert text into sparse vectors — compact lists of token indices with importance weights. Unlike dense mode, which requires an external embedding API, the sparse model runs locally in the sparse container with no API key or cost. It supports multiple languages and provides significantly better retrieval quality than keyword-only search.


Creating a Built-in Provider

  1. Navigate to the Memory Providers page.
  2. Click Add Memory Provider.
  3. Fill in the following fields:
    • Name: A display name for this provider.
    • Provider Type: Select builtin.
  4. Click Create.

Configuring a Built-in Provider

After creating a provider, select it from the list and configure its settings.

FieldDescription
Memory Modeoff (default), sparse, or dense. Controls how memories are indexed and retrieved.
Embedding ModelEmbedding model for dense vector search. Only used in dense mode.
Qdrant CollectionQdrant collection name. Defaults to memory_sparse.

Managing Providers

  • Edit: Select a provider and update its settings.
  • Delete: Remove a provider you no longer use.

Infrastructure Requirements

Off Mode

No additional infrastructure required. Memories are stored and retrieved using file-based indexing only.

Sparse Mode

Requires the sparse service (runs the opensearch-neural-sparse-encoding-multilingual-v1 model locally) and Qdrant vector database. Enable both with Docker Compose profiles:

bash
docker compose --profile qdrant --profile sparse up -d

The following sections must be present in config.toml:

toml
[qdrant]
 base_url = "http://qdrant:6334"
 
 [sparse]
diff --git a/assets/memory-providers_builtin.md.BhfdM6jZ.lean.js b/assets/memory-providers_builtin.md.DlYtNI3G.lean.js
similarity index 73%
rename from assets/memory-providers_builtin.md.BhfdM6jZ.lean.js
rename to assets/memory-providers_builtin.md.DlYtNI3G.lean.js
index 1fd87541..8bcda741 100644
--- a/assets/memory-providers_builtin.md.BhfdM6jZ.lean.js
+++ b/assets/memory-providers_builtin.md.DlYtNI3G.lean.js
@@ -1 +1 @@
-import{_ as t,o as i,c as a,ag as s}from"./chunks/framework.CvgP6Fyv.js";const g=JSON.parse('{"title":"Built-in Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/builtin.md","filePath":"memory-providers/builtin.md","lastUpdated":1774787421000}'),r={name:"memory-providers/builtin.md"};function o(n,e,d,l,h,p){return i(),a("div",null,[...e[0]||(e[0]=[s("",41)])])}const m=t(r,[["render",o]]);export{g as __pageData,m as default};
+import{_ as t,o as i,c as a,ag as s}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Built-in Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/builtin.md","filePath":"memory-providers/builtin.md","lastUpdated":1774787421000}'),r={name:"memory-providers/builtin.md"};function o(n,e,d,l,h,p){return i(),a("div",null,[...e[0]||(e[0]=[s("",41)])])}const m=t(r,[["render",o]]);export{g as __pageData,m as default};
diff --git a/assets/memory-providers_index.md.Cl5wC9-w.js b/assets/memory-providers_index.md.D5MvHNPW.js
similarity index 97%
rename from assets/memory-providers_index.md.Cl5wC9-w.js
rename to assets/memory-providers_index.md.D5MvHNPW.js
index dec6fdf5..0c73c0ea 100644
--- a/assets/memory-providers_index.md.Cl5wC9-w.js
+++ b/assets/memory-providers_index.md.D5MvHNPW.js
@@ -1 +1 @@
-import{_ as r,o,c as a,ag as i}from"./chunks/framework.CvgP6Fyv.js";const v=JSON.parse('{"title":"Memory Providers","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/index.md","filePath":"memory-providers/index.md","lastUpdated":1774787421000}'),t={name:"memory-providers/index.md"};function s(m,e,n,l,d,h){return o(),a("div",null,[...e[0]||(e[0]=[i('

Memory Providers

Memoh uses a Memory Provider to define how a bot stores, retrieves, and manages long-term memory. A bot can bind one memory provider in its General tab, and that provider becomes the backend for memory extraction and memory search.

Available Providers

Memoh supports the following memory providers:

  • Built-in: The default memory system included with Memoh. Supports three modes — off (file-based), sparse (neural sparse vectors), and dense (embedding-based semantic search). Fully self-hosted.
  • Mem0: SaaS memory provider via the Mem0 API. Requires an API key.
  • OpenViking: Self-hosted or SaaS memory provider with its own API.

Basic Flow

  1. Open the Memory Providers page from the sidebar.
  2. Create a provider instance using one of the supported provider types.
  3. Configure the provider settings.
  4. Open a bot's General tab and assign that provider in Memory Provider.
  5. Manage actual memories from the bot's Memory tab.

Next Steps

',11)])])}const f=r(t,[["render",s]]);export{v as __pageData,f as default}; +import{_ as r,o,c as a,ag as i}from"./chunks/framework.DXGyWiRo.js";const v=JSON.parse('{"title":"Memory Providers","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/index.md","filePath":"memory-providers/index.md","lastUpdated":1774787421000}'),t={name:"memory-providers/index.md"};function s(m,e,n,l,d,h){return o(),a("div",null,[...e[0]||(e[0]=[i('

Memory Providers

Memoh uses a Memory Provider to define how a bot stores, retrieves, and manages long-term memory. A bot can bind one memory provider in its General tab, and that provider becomes the backend for memory extraction and memory search.

Available Providers

Memoh supports the following memory providers:

  • Built-in: The default memory system included with Memoh. Supports three modes — off (file-based), sparse (neural sparse vectors), and dense (embedding-based semantic search). Fully self-hosted.
  • Mem0: SaaS memory provider via the Mem0 API. Requires an API key.
  • OpenViking: Self-hosted or SaaS memory provider with its own API.

Basic Flow

  1. Open the Memory Providers page from the sidebar.
  2. Create a provider instance using one of the supported provider types.
  3. Configure the provider settings.
  4. Open a bot's General tab and assign that provider in Memory Provider.
  5. Manage actual memories from the bot's Memory tab.

Next Steps

',11)])])}const f=r(t,[["render",s]]);export{v as __pageData,f as default}; diff --git a/assets/memory-providers_index.md.Cl5wC9-w.lean.js b/assets/memory-providers_index.md.D5MvHNPW.lean.js similarity index 85% rename from assets/memory-providers_index.md.Cl5wC9-w.lean.js rename to assets/memory-providers_index.md.D5MvHNPW.lean.js index df0b316a..e814efa5 100644 --- a/assets/memory-providers_index.md.Cl5wC9-w.lean.js +++ b/assets/memory-providers_index.md.D5MvHNPW.lean.js @@ -1 +1 @@ -import{_ as r,o,c as a,ag as i}from"./chunks/framework.CvgP6Fyv.js";const v=JSON.parse('{"title":"Memory Providers","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/index.md","filePath":"memory-providers/index.md","lastUpdated":1774787421000}'),t={name:"memory-providers/index.md"};function s(m,e,n,l,d,h){return o(),a("div",null,[...e[0]||(e[0]=[i("",11)])])}const f=r(t,[["render",s]]);export{v as __pageData,f as default}; +import{_ as r,o,c as a,ag as i}from"./chunks/framework.DXGyWiRo.js";const v=JSON.parse('{"title":"Memory Providers","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/index.md","filePath":"memory-providers/index.md","lastUpdated":1774787421000}'),t={name:"memory-providers/index.md"};function s(m,e,n,l,d,h){return o(),a("div",null,[...e[0]||(e[0]=[i("",11)])])}const f=r(t,[["render",s]]);export{v as __pageData,f as default}; diff --git a/assets/memory-providers_mem0.md.C-l_lmek.js b/assets/memory-providers_mem0.md.C5B6D9ME.js similarity index 96% rename from assets/memory-providers_mem0.md.C-l_lmek.js rename to assets/memory-providers_mem0.md.C5B6D9ME.js index dbc4194e..3619be1c 100644 --- a/assets/memory-providers_mem0.md.C-l_lmek.js +++ b/assets/memory-providers_mem0.md.C5B6D9ME.js @@ -1 +1 @@ -import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.CvgP6Fyv.js";const c=JSON.parse('{"title":"Mem0 Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/mem0.md","filePath":"memory-providers/mem0.md","lastUpdated":1774787421000}'),i={name:"memory-providers/mem0.md"};function n(d,e,s,m,l,g){return t(),o("div",null,[...e[0]||(e[0]=[a('

Mem0 Memory Provider

Mem0 is a SaaS memory provider that connects your bot to the Mem0 platform. Instead of managing memory infrastructure yourself, Mem0 handles storage, retrieval, and indexing through its cloud API.


Creating a Mem0 Provider

  1. Navigate to the Memory Providers page.
  2. Click Add Memory Provider.
  3. Fill in the following fields:
    • Name: A display name for this provider.
    • Provider Type: Select mem0.
  4. Click Create.

Configuring a Mem0 Provider

After creating a provider, select it from the list and configure its settings.

FieldRequiredDescription
Base URLNoMem0 API base URL. Defaults to https://api.mem0.ai when empty.
API KeyYesAPI key for Mem0 authentication (stored as a secret).
Organization IDNoOrganization ID for workspace scoping.
Project IDNoProject ID for workspace scoping.

Assigning a Mem0 Provider to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Memory Provider dropdown.
  4. Select the Mem0 provider you created.
  5. Click Save.

Usage

Once assigned, the bot will use Mem0 as its memory backend. Memory extraction, search, and management operations are routed through the Mem0 API.

For day-to-day memory operations, see Bot Memory Management.

',16)])])}const p=r(i,[["render",n]]);export{c as __pageData,p as default}; +import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"Mem0 Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/mem0.md","filePath":"memory-providers/mem0.md","lastUpdated":1774787421000}'),i={name:"memory-providers/mem0.md"};function n(d,e,s,m,l,g){return t(),o("div",null,[...e[0]||(e[0]=[a('

Mem0 Memory Provider

Mem0 is a SaaS memory provider that connects your bot to the Mem0 platform. Instead of managing memory infrastructure yourself, Mem0 handles storage, retrieval, and indexing through its cloud API.


Creating a Mem0 Provider

  1. Navigate to the Memory Providers page.
  2. Click Add Memory Provider.
  3. Fill in the following fields:
    • Name: A display name for this provider.
    • Provider Type: Select mem0.
  4. Click Create.

Configuring a Mem0 Provider

After creating a provider, select it from the list and configure its settings.

FieldRequiredDescription
Base URLNoMem0 API base URL. Defaults to https://api.mem0.ai when empty.
API KeyYesAPI key for Mem0 authentication (stored as a secret).
Organization IDNoOrganization ID for workspace scoping.
Project IDNoProject ID for workspace scoping.

Assigning a Mem0 Provider to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Memory Provider dropdown.
  4. Select the Mem0 provider you created.
  5. Click Save.

Usage

Once assigned, the bot will use Mem0 as its memory backend. Memory extraction, search, and management operations are routed through the Mem0 API.

For day-to-day memory operations, see Bot Memory Management.

',16)])])}const p=r(i,[["render",n]]);export{c as __pageData,p as default}; diff --git a/assets/memory-providers_mem0.md.C-l_lmek.lean.js b/assets/memory-providers_mem0.md.C5B6D9ME.lean.js similarity index 72% rename from assets/memory-providers_mem0.md.C-l_lmek.lean.js rename to assets/memory-providers_mem0.md.C5B6D9ME.lean.js index faa0557a..a5559a1c 100644 --- a/assets/memory-providers_mem0.md.C-l_lmek.lean.js +++ b/assets/memory-providers_mem0.md.C5B6D9ME.lean.js @@ -1 +1 @@ -import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.CvgP6Fyv.js";const c=JSON.parse('{"title":"Mem0 Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/mem0.md","filePath":"memory-providers/mem0.md","lastUpdated":1774787421000}'),i={name:"memory-providers/mem0.md"};function n(d,e,s,m,l,g){return t(),o("div",null,[...e[0]||(e[0]=[a("",16)])])}const p=r(i,[["render",n]]);export{c as __pageData,p as default}; +import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"Mem0 Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/mem0.md","filePath":"memory-providers/mem0.md","lastUpdated":1774787421000}'),i={name:"memory-providers/mem0.md"};function n(d,e,s,m,l,g){return t(),o("div",null,[...e[0]||(e[0]=[a("",16)])])}const p=r(i,[["render",n]]);export{c as __pageData,p as default}; diff --git a/assets/memory-providers_openviking.md.BVdpnQhh.js b/assets/memory-providers_openviking.md.N-8WyFZa.js similarity index 95% rename from assets/memory-providers_openviking.md.BVdpnQhh.js rename to assets/memory-providers_openviking.md.N-8WyFZa.js index aa3179e2..f82926d5 100644 --- a/assets/memory-providers_openviking.md.BVdpnQhh.js +++ b/assets/memory-providers_openviking.md.N-8WyFZa.js @@ -1 +1 @@ -import{_ as i,o as r,c as o,ag as t}from"./chunks/framework.CvgP6Fyv.js";const c=JSON.parse('{"title":"OpenViking Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/openviking.md","filePath":"memory-providers/openviking.md","lastUpdated":1774787421000}'),n={name:"memory-providers/openviking.md"};function a(d,e,s,g,l,p){return r(),o("div",null,[...e[0]||(e[0]=[t('

OpenViking Memory Provider

OpenViking is a memory provider that can be self-hosted or used as a SaaS service. It provides an alternative memory backend for bots that need a dedicated memory API.


Creating an OpenViking Provider

  1. Navigate to the Memory Providers page.
  2. Click Add Memory Provider.
  3. Fill in the following fields:
    • Name: A display name for this provider.
    • Provider Type: Select openviking.
  4. Click Create.

Configuring an OpenViking Provider

After creating a provider, select it from the list and configure its settings.

FieldRequiredDescription
Base URLYesOpenViking API endpoint (e.g. http://openviking:8088).
API KeyNoAPI key for authentication (stored as a secret).

Assigning an OpenViking Provider to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Memory Provider dropdown.
  4. Select the OpenViking provider you created.
  5. Click Save.

Usage

Once assigned, the bot will use OpenViking as its memory backend. Memory extraction, search, and management operations are routed through the OpenViking API.

For day-to-day memory operations, see Bot Memory Management.

',16)])])}const m=i(n,[["render",a]]);export{c as __pageData,m as default}; +import{_ as i,o as r,c as o,ag as t}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"OpenViking Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/openviking.md","filePath":"memory-providers/openviking.md","lastUpdated":1774787421000}'),n={name:"memory-providers/openviking.md"};function a(d,e,s,g,l,p){return r(),o("div",null,[...e[0]||(e[0]=[t('

OpenViking Memory Provider

OpenViking is a memory provider that can be self-hosted or used as a SaaS service. It provides an alternative memory backend for bots that need a dedicated memory API.


Creating an OpenViking Provider

  1. Navigate to the Memory Providers page.
  2. Click Add Memory Provider.
  3. Fill in the following fields:
    • Name: A display name for this provider.
    • Provider Type: Select openviking.
  4. Click Create.

Configuring an OpenViking Provider

After creating a provider, select it from the list and configure its settings.

FieldRequiredDescription
Base URLYesOpenViking API endpoint (e.g. http://openviking:8088).
API KeyNoAPI key for authentication (stored as a secret).

Assigning an OpenViking Provider to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Memory Provider dropdown.
  4. Select the OpenViking provider you created.
  5. Click Save.

Usage

Once assigned, the bot will use OpenViking as its memory backend. Memory extraction, search, and management operations are routed through the OpenViking API.

For day-to-day memory operations, see Bot Memory Management.

',16)])])}const m=i(n,[["render",a]]);export{c as __pageData,m as default}; diff --git a/assets/memory-providers_openviking.md.BVdpnQhh.lean.js b/assets/memory-providers_openviking.md.N-8WyFZa.lean.js similarity index 73% rename from assets/memory-providers_openviking.md.BVdpnQhh.lean.js rename to assets/memory-providers_openviking.md.N-8WyFZa.lean.js index 1689cc84..038b9ea7 100644 --- a/assets/memory-providers_openviking.md.BVdpnQhh.lean.js +++ b/assets/memory-providers_openviking.md.N-8WyFZa.lean.js @@ -1 +1 @@ -import{_ as i,o as r,c as o,ag as t}from"./chunks/framework.CvgP6Fyv.js";const c=JSON.parse('{"title":"OpenViking Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/openviking.md","filePath":"memory-providers/openviking.md","lastUpdated":1774787421000}'),n={name:"memory-providers/openviking.md"};function a(d,e,s,g,l,p){return r(),o("div",null,[...e[0]||(e[0]=[t("",16)])])}const m=i(n,[["render",a]]);export{c as __pageData,m as default}; +import{_ as i,o as r,c as o,ag as t}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"OpenViking Memory Provider","description":"","frontmatter":{},"headers":[],"relativePath":"memory-providers/openviking.md","filePath":"memory-providers/openviking.md","lastUpdated":1774787421000}'),n={name:"memory-providers/openviking.md"};function a(d,e,s,g,l,p){return r(),o("div",null,[...e[0]||(e[0]=[t("",16)])])}const m=i(n,[["render",a]]);export{c as __pageData,m as default}; diff --git a/assets/style.B5ESegsT.css b/assets/style.CwwbjNX7.css similarity index 68% rename from assets/style.B5ESegsT.css rename to assets/style.CwwbjNX7.css index 9d659eb6..380b5ae6 100644 --- a/assets/style.B5ESegsT.css +++ b/assets/style.CwwbjNX7.css @@ -1 +1 @@ -@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic-ext.r48I6akx.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: #3c3c43;--vp-c-text-2: #67676c;--vp-c-text-3: #929295}.dark{--vp-c-text-1: #dfdfd6;--vp-c-text-2: #98989f;--vp-c-text-3: #6a6a71}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:lang(es),:lang(pt){--vp-code-copy-copied-text-content: "Copiado"}:lang(fa){--vp-code-copy-copied-text-content: "کپی شد"}:lang(ko){--vp-code-copy-copied-text-content: "복사됨"}:lang(ru){--vp-code-copy-copied-text-content: "Скопировано"}:lang(zh){--vp-code-copy-copied-text-content: "已复制"}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code,.vp-doc h4>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;-webkit-user-select:none;user-select:none;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(:is(.no-icon,svg a,:has(img,svg))):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(:is(.no-icon,svg a,:has(img,svg))):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin:0 0 4px!important;text-align:center;letter-spacing:1px!important;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-c2c837da]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-c2c837da],.VPBackdrop.fade-leave-to[data-v-c2c837da]{opacity:0}.VPBackdrop.fade-leave-active[data-v-c2c837da]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-c2c837da]{display:none}}.NotFound[data-v-001acec4]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-001acec4]{padding:96px 32px 168px}}.code[data-v-001acec4]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-001acec4]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-001acec4]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-001acec4]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-001acec4]{padding-top:20px}.link[data-v-001acec4]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-001acec4]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-b4af7dc9]{position:relative;z-index:1}.nested[data-v-b4af7dc9]{padding-right:16px;padding-left:16px}.outline-link[data-v-b4af7dc9]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-b4af7dc9]:hover,.outline-link.active[data-v-b4af7dc9]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-b4af7dc9]{padding-left:13px}.VPDocAsideOutline[data-v-b67a6837]{display:none}.VPDocAsideOutline.has-outline[data-v-b67a6837]{display:block}.content[data-v-b67a6837]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-b67a6837]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-b67a6837]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-f268a203]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-f268a203]{flex-grow:1}.VPDocAside[data-v-f268a203] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-f268a203] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-f268a203] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-5d56f43a]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-5d56f43a]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-d067bba9]{margin-top:64px}.edit-info[data-v-d067bba9]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-d067bba9]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-d067bba9]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-d067bba9]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-d067bba9]{margin-right:8px}.prev-next[data-v-d067bba9]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-d067bba9]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-d067bba9]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-d067bba9]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-d067bba9]{margin-left:auto;text-align:right}.desc[data-v-d067bba9]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-d067bba9]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-db8bf443]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-db8bf443]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-db8bf443]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-db8bf443]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-db8bf443]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-db8bf443]{display:flex;justify-content:center}.VPDoc .aside[data-v-db8bf443]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-db8bf443]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-db8bf443]{max-width:1104px}}.container[data-v-db8bf443]{margin:0 auto;width:100%}.aside[data-v-db8bf443]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-db8bf443]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-db8bf443]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-db8bf443]::-webkit-scrollbar{display:none}.aside-curtain[data-v-db8bf443]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-db8bf443]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-db8bf443]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-db8bf443]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-db8bf443]{order:1;margin:0;min-width:640px}}.content-container[data-v-db8bf443]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-db8bf443]{max-width:688px}.VPButton[data-v-ae5e782c]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-ae5e782c]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-ae5e782c]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-ae5e782c]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-ae5e782c]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-ae5e782c]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-ae5e782c]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-ae5e782c]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-ae5e782c]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-ae5e782c]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-ae5e782c]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-ae5e782c]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-ae5e782c]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-352814ec]{display:none}.dark .VPImage.light[data-v-352814ec]{display:none}.VPHero[data-v-b5497f95]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-b5497f95]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-b5497f95]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-b5497f95]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-b5497f95]{flex-direction:row}}.main[data-v-b5497f95]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-b5497f95]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-b5497f95]{text-align:left}}@media (min-width: 960px){.main[data-v-b5497f95]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-b5497f95]{max-width:592px}}.heading[data-v-b5497f95]{display:flex;flex-direction:column}.name[data-v-b5497f95],.text[data-v-b5497f95]{width:fit-content;max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-b5497f95],.VPHero.has-image .text[data-v-b5497f95]{margin:0 auto}.name[data-v-b5497f95]{color:var(--vp-home-hero-name-color)}.clip[data-v-b5497f95]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-b5497f95],.text[data-v-b5497f95]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-b5497f95],.text[data-v-b5497f95]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-b5497f95],.VPHero.has-image .text[data-v-b5497f95]{margin:0}}.tagline[data-v-b5497f95]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-b5497f95]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-b5497f95]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-b5497f95]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-b5497f95]{margin:0}}.actions[data-v-b5497f95]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-b5497f95]{justify-content:center}@media (min-width: 640px){.actions[data-v-b5497f95]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-b5497f95]{justify-content:flex-start}}.action[data-v-b5497f95]{flex-shrink:0;padding:6px}.image[data-v-b5497f95]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-b5497f95]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-b5497f95]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-b5497f95]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-b5497f95]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-b5497f95]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-b5497f95]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-b5497f95]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-b5497f95]{width:320px;height:320px}}[data-v-b5497f95] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-b5497f95] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-b5497f95] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-b8f43207]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-b8f43207]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-b8f43207]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-b8f43207]>.VPImage{margin-bottom:20px}.icon[data-v-b8f43207]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-b8f43207]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-b8f43207]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-b8f43207]{padding-top:8px}.link-text-value[data-v-b8f43207]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-b8f43207]{margin-left:6px}.VPFeatures[data-v-eca49b69]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-eca49b69]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-eca49b69]{padding:0 64px}}.container[data-v-eca49b69]{margin:0 auto;max-width:1152px}.items[data-v-eca49b69]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-eca49b69]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-eca49b69],.item.grid-4[data-v-eca49b69],.item.grid-6[data-v-eca49b69]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-eca49b69],.item.grid-4[data-v-eca49b69]{width:50%}.item.grid-3[data-v-eca49b69],.item.grid-6[data-v-eca49b69]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-eca49b69]{width:25%}}.container[data-v-1d82f6d4]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-1d82f6d4]{padding:0 48px}}@media (min-width: 960px){.container[data-v-1d82f6d4]{width:100%;padding:0 64px}}.vp-doc[data-v-1d82f6d4] .VPHomeSponsors,.vp-doc[data-v-1d82f6d4] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-1d82f6d4] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-1d82f6d4] .VPHomeSponsors a,.vp-doc[data-v-1d82f6d4] .VPTeamPage a{text-decoration:none}.VPHome[data-v-cdfe9868]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-cdfe9868]{margin-bottom:128px}}.VPContent[data-v-6a539cd2]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-6a539cd2]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-6a539cd2]{margin:0}@media (min-width: 960px){.VPContent[data-v-6a539cd2]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-6a539cd2]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-6a539cd2]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-a4a6e223]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-a4a6e223]{display:none}.VPFooter[data-v-a4a6e223] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-a4a6e223] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-a4a6e223]{padding:32px}}.container[data-v-a4a6e223]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-a4a6e223],.copyright[data-v-a4a6e223]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-d5f98606]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-d5f98606]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-d5f98606]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-d5f98606]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-d5f98606]{color:var(--vp-c-text-1)}.icon[data-v-d5f98606]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-d5f98606]{font-size:14px}.icon[data-v-d5f98606]{font-size:16px}}.open>.icon[data-v-d5f98606]{transform:rotate(90deg)}.items[data-v-d5f98606]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-d5f98606]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-d5f98606]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-d5f98606]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-d5f98606]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-d5f98606]{transition:all .2s ease-out}.flyout-leave-active[data-v-d5f98606]{transition:all .15s ease-in}.flyout-enter-from[data-v-d5f98606],.flyout-leave-to[data-v-d5f98606]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-20ac656e]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-20ac656e]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-20ac656e]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-20ac656e]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-20ac656e]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-20ac656e]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-20ac656e]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-20ac656e]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-20ac656e]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-20ac656e]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-20ac656e]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-20ac656e]{display:none}}.menu-icon[data-v-20ac656e]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-20ac656e]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-20ac656e]{padding:12px 32px 11px}}.VPSwitch[data-v-6d4c42ba]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-6d4c42ba]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-6d4c42ba]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-6d4c42ba]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-6d4c42ba] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-6d4c42ba] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-6dee01f2]{opacity:1}.moon[data-v-6dee01f2],.dark .sun[data-v-6dee01f2]{opacity:0}.dark .moon[data-v-6dee01f2]{opacity:1}.dark .VPSwitchAppearance[data-v-6dee01f2] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-94cd6187]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-94cd6187]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-f20f02ed]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-f20f02ed]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-f20f02ed]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-f20f02ed]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-82f892e4]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-82f892e4]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-82f892e4]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-82f892e4]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-e75fc4a8]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-e75fc4a8] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-e75fc4a8] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-e75fc4a8] .group:last-child{padding-bottom:0}.VPMenu[data-v-e75fc4a8] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-e75fc4a8] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-e75fc4a8] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-e75fc4a8] .action{padding-left:24px}.VPFlyout[data-v-93f94330]{position:relative}.VPFlyout[data-v-93f94330]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-93f94330]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-93f94330]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-93f94330]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-93f94330]{color:var(--vp-c-brand-2)}.button[aria-expanded=false]+.menu[data-v-93f94330]{opacity:0;visibility:hidden;transform:translateY(0)}.VPFlyout:hover .menu[data-v-93f94330],.button[aria-expanded=true]+.menu[data-v-93f94330]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-93f94330]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-93f94330]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-93f94330]{margin-right:0;font-size:16px}.text-icon[data-v-93f94330]{margin-left:4px;font-size:14px}.icon[data-v-93f94330]{font-size:20px;transition:fill .25s}.menu[data-v-93f94330]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-a094361f]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-a094361f]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-a094361f]>svg,.VPSocialLink[data-v-a094361f]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-bbf2a784]{display:flex;justify-content:center}.VPNavBarExtra[data-v-7a542967]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-7a542967]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-7a542967]{display:none}}.trans-title[data-v-7a542967]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-7a542967],.item.social-links[data-v-7a542967]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-7a542967]{min-width:176px}.appearance-action[data-v-7a542967]{margin-right:-2px}.social-links-list[data-v-7a542967]{margin:-4px -8px}.VPNavBarHamburger[data-v-7aa6377b]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-7aa6377b]{display:none}}.container[data-v-7aa6377b]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-7aa6377b]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-7aa6377b]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-7aa6377b]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-7aa6377b]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-7aa6377b]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-7aa6377b]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-7aa6377b],.VPNavBarHamburger.active:hover .middle[data-v-7aa6377b],.VPNavBarHamburger.active:hover .bottom[data-v-7aa6377b]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-7aa6377b],.middle[data-v-7aa6377b],.bottom[data-v-7aa6377b]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-7aa6377b]{top:0;left:0;transform:translate(0)}.middle[data-v-7aa6377b]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-7aa6377b]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-e7ad9d5b]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-e7ad9d5b],.VPNavBarMenuLink[data-v-e7ad9d5b]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-dd886324]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-dd886324]{display:flex}}/*! @docsearch/css 3.8.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 #0304094d;--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button-Key--pressed{transform:none;box-shadow:none}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-cd484525]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-cd484525]{display:flex;align-items:center}}.title[data-v-18435660]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-18435660]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-18435660]{border-bottom-color:var(--vp-c-divider)}}[data-v-18435660] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-916d5f13]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-916d5f13]{display:flex;align-items:center}}.title[data-v-916d5f13]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-c354117b]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-c354117b]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-c354117b]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-c354117b]:not(.home){background-color:transparent}.VPNavBar[data-v-c354117b]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-c354117b]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-c354117b]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-c354117b]{padding:0}}.container[data-v-c354117b]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-c354117b],.container>.content[data-v-c354117b]{pointer-events:none}.container[data-v-c354117b] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-c354117b]{max-width:100%}}.title[data-v-c354117b]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-c354117b]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-c354117b]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-c354117b]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-c354117b]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-c354117b]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-c354117b]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.home.top) .content-body[data-v-c354117b]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-c354117b]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-c354117b]{column-gap:.5rem}}.menu+.translations[data-v-c354117b]:before,.menu+.appearance[data-v-c354117b]:before,.menu+.social-links[data-v-c354117b]:before,.translations+.appearance[data-v-c354117b]:before,.appearance+.social-links[data-v-c354117b]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-c354117b]:before,.translations+.appearance[data-v-c354117b]:before{margin-right:16px}.appearance+.social-links[data-v-c354117b]:before{margin-left:16px}.social-links[data-v-c354117b]{margin-right:-8px}.divider[data-v-c354117b]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-c354117b]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-c354117b]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-c354117b]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-c354117b]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-c354117b]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-c354117b]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-8765e0f6]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-8765e0f6]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-fb28826b]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-fb28826b]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-2758655b]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-2758655b]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-78bb0dac]{display:block}.title[data-v-78bb0dac]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-079fee36]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-079fee36]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-079fee36]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-079fee36]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-079fee36]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-079fee36]{transform:rotate(45deg)}.button[data-v-079fee36]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-079fee36]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-079fee36]{transition:transform .25s}.group[data-v-079fee36]:first-child{padding-top:0}.group+.group[data-v-079fee36],.group+.item[data-v-079fee36]{padding-top:4px}.VPNavScreenTranslations[data-v-fb935b75]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-fb935b75]{height:auto}.title[data-v-fb935b75]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-fb935b75]{font-size:16px}.icon.lang[data-v-fb935b75]{margin-right:8px}.icon.chevron[data-v-fb935b75]{margin-left:4px}.list[data-v-fb935b75]{padding:4px 0 0 24px}.link[data-v-fb935b75]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-f28ff3d6]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-f28ff3d6],.VPNavScreen.fade-leave-active[data-v-f28ff3d6]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-f28ff3d6],.VPNavScreen.fade-leave-active .container[data-v-f28ff3d6]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-f28ff3d6],.VPNavScreen.fade-leave-to[data-v-f28ff3d6]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-f28ff3d6],.VPNavScreen.fade-leave-to .container[data-v-f28ff3d6]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-f28ff3d6]{display:none}}.container[data-v-f28ff3d6]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-f28ff3d6],.menu+.appearance[data-v-f28ff3d6],.translations+.appearance[data-v-f28ff3d6]{margin-top:24px}.menu+.social-links[data-v-f28ff3d6]{margin-top:16px}.appearance+.social-links[data-v-f28ff3d6]{margin-top:16px}.VPNav[data-v-5deba549]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-5deba549]{position:fixed}}.VPSidebarItem.level-0[data-v-904fc2f6]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-904fc2f6]{padding-bottom:10px}.item[data-v-904fc2f6]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-904fc2f6]{cursor:pointer}.indicator[data-v-904fc2f6]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-904fc2f6],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-904fc2f6],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-904fc2f6],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-904fc2f6]{background-color:var(--vp-c-brand-1)}.link[data-v-904fc2f6]{display:flex;align-items:center;flex-grow:1}.text[data-v-904fc2f6]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-904fc2f6]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-904fc2f6],.VPSidebarItem.level-2 .text[data-v-904fc2f6],.VPSidebarItem.level-3 .text[data-v-904fc2f6],.VPSidebarItem.level-4 .text[data-v-904fc2f6],.VPSidebarItem.level-5 .text[data-v-904fc2f6]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-904fc2f6],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-904fc2f6],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-904fc2f6],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-904fc2f6],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-904fc2f6],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-904fc2f6]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-904fc2f6],.VPSidebarItem.level-1.has-active>.item>.text[data-v-904fc2f6],.VPSidebarItem.level-2.has-active>.item>.text[data-v-904fc2f6],.VPSidebarItem.level-3.has-active>.item>.text[data-v-904fc2f6],.VPSidebarItem.level-4.has-active>.item>.text[data-v-904fc2f6],.VPSidebarItem.level-5.has-active>.item>.text[data-v-904fc2f6],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-904fc2f6],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-904fc2f6],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-904fc2f6],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-904fc2f6],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-904fc2f6],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-904fc2f6]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-904fc2f6],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-904fc2f6],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-904fc2f6],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-904fc2f6],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-904fc2f6],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-904fc2f6]{color:var(--vp-c-brand-1)}.caret[data-v-904fc2f6]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-904fc2f6]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-904fc2f6]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-904fc2f6]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-904fc2f6]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-904fc2f6],.VPSidebarItem.level-2 .items[data-v-904fc2f6],.VPSidebarItem.level-3 .items[data-v-904fc2f6],.VPSidebarItem.level-4 .items[data-v-904fc2f6],.VPSidebarItem.level-5 .items[data-v-904fc2f6]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-904fc2f6]{display:none}.no-transition[data-v-93f78773] .caret-icon{transition:none}.group+.group[data-v-93f78773]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-93f78773]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-feb7a153]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-feb7a153]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-feb7a153]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-feb7a153]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-feb7a153]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-feb7a153]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-feb7a153]{outline:0}.VPSkipLink[data-v-30be8b8e]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-30be8b8e]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-30be8b8e]{top:14px;left:16px}}.Layout[data-v-a7fd87cd]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-b516c01d]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-b516c01d]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-b516c01d]{margin:128px 0}}.VPHomeSponsors[data-v-b516c01d]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-b516c01d]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-b516c01d]{padding:0 64px}}.container[data-v-b516c01d]{margin:0 auto;max-width:1152px}.love[data-v-b516c01d]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-b516c01d]{display:inline-block}.message[data-v-b516c01d]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-b516c01d]{padding-top:32px}.action[data-v-b516c01d]{padding-top:40px;text-align:center}.VPTeamMembersItem[data-v-ce671d94]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-ce671d94]{padding:32px}.VPTeamMembersItem.small .data[data-v-ce671d94]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-ce671d94]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-ce671d94]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-ce671d94]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-ce671d94]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-ce671d94]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-ce671d94]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-ce671d94]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-ce671d94]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-ce671d94]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-ce671d94]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-ce671d94]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-ce671d94]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-ce671d94]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-ce671d94]{text-align:center}.avatar[data-v-ce671d94]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-ce671d94]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-ce671d94]{margin:0;font-weight:600}.affiliation[data-v-ce671d94]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-ce671d94]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-ce671d94]:hover{color:var(--vp-c-brand-1)}.desc[data-v-ce671d94]{margin:0 auto}.desc[data-v-ce671d94] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-ce671d94]{display:flex;justify-content:center;height:56px}.sp-link[data-v-ce671d94]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-ce671d94]:hover,.sp .sp-link.link[data-v-ce671d94]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-ce671d94]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-d34b8cd3]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-d34b8cd3]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-d34b8cd3]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-d34b8cd3]{max-width:876px}.VPTeamMembers.medium .container[data-v-d34b8cd3]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-d34b8cd3]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-d34b8cd3]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-d34b8cd3]{max-width:760px}.container[data-v-d34b8cd3]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.VPTeamPage[data-v-b4a49520]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-b4a49520]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-b4a49520-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-b4a49520-s],.VPTeamMembers+.VPTeamPageSection[data-v-b4a49520-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-b4a49520-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-b4a49520-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-b4a49520-s],.VPTeamMembers+.VPTeamPageSection[data-v-b4a49520-s]{margin-top:96px}}.VPTeamMembers[data-v-b4a49520-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-b4a49520-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-b4a49520-s]{padding:0 64px}}.VPTeamPageSection[data-v-6addfdc8]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-6addfdc8]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-6addfdc8]{padding:0 64px}}.title[data-v-6addfdc8]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-6addfdc8]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-6addfdc8]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-6addfdc8]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-6addfdc8]{padding-top:40px}.VPTeamPageTitle[data-v-857abe82]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-857abe82]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-857abe82]{padding:80px 64px 48px}}.title[data-v-857abe82]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-857abe82]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-857abe82]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-857abe82]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPLocalSearchBox[data-v-a980c974]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-a980c974]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-a980c974]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 767px){.shell[data-v-a980c974]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-a980c974]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 767px){.search-bar[data-v-a980c974]{padding:0 8px}}.search-bar[data-v-a980c974]:focus-within{border-color:var(--vp-c-brand-1)}.local-search-icon[data-v-a980c974]{display:block;font-size:18px}.navigate-icon[data-v-a980c974]{display:block;font-size:14px}.search-icon[data-v-a980c974]{margin:8px}@media (max-width: 767px){.search-icon[data-v-a980c974]{display:none}}.search-input[data-v-a980c974]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-a980c974]{padding:6px 4px}}.search-actions[data-v-a980c974]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-a980c974]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-a980c974]{display:none}}.search-actions button[data-v-a980c974]{padding:8px}.search-actions button[data-v-a980c974]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-a980c974]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-a980c974]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-a980c974]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-a980c974]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-a980c974]{display:none}}.search-keyboard-shortcuts kbd[data-v-a980c974]{background:#8080801a;border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-a980c974]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-a980c974]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-a980c974]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-a980c974]{margin:8px}}.titles[data-v-a980c974]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-a980c974]{display:flex;align-items:center;gap:4px}.title.main[data-v-a980c974]{font-weight:500}.title-icon[data-v-a980c974]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-a980c974]{opacity:.5}.result.selected[data-v-a980c974]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-a980c974]{position:relative}.excerpt[data-v-a980c974]{opacity:50%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;margin-top:4px}.result.selected .excerpt[data-v-a980c974]{opacity:1}.excerpt[data-v-a980c974] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-a980c974] mark,.excerpt[data-v-a980c974] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-a980c974] .vp-code-group .tabs{display:none}.excerpt[data-v-a980c974] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-a980c974]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-a980c974]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-a980c974],.result.selected .title-icon[data-v-a980c974]{color:var(--vp-c-brand-1)!important}.no-results[data-v-a980c974]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-a980c974]{flex:none} +@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic-ext.r48I6akx.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: #3c3c43;--vp-c-text-2: #67676c;--vp-c-text-3: #929295}.dark{--vp-c-text-1: #dfdfd6;--vp-c-text-2: #98989f;--vp-c-text-3: #6a6a71}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:lang(es),:lang(pt){--vp-code-copy-copied-text-content: "Copiado"}:lang(fa){--vp-code-copy-copied-text-content: "کپی شد"}:lang(ko){--vp-code-copy-copied-text-content: "복사됨"}:lang(ru){--vp-code-copy-copied-text-content: "Скопировано"}:lang(zh){--vp-code-copy-copied-text-content: "已复制"}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code,.vp-doc h4>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;-webkit-user-select:none;user-select:none;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(:is(.no-icon,svg a,:has(img,svg))):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(:is(.no-icon,svg a,:has(img,svg))):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin:0 0 4px!important;text-align:center;letter-spacing:1px!important;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-3febd95c]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-3febd95c],.VPBackdrop.fade-leave-to[data-v-3febd95c]{opacity:0}.VPBackdrop.fade-leave-active[data-v-3febd95c]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-3febd95c]{display:none}}.NotFound[data-v-769096ce]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-769096ce]{padding:96px 32px 168px}}.code[data-v-769096ce]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-769096ce]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-769096ce]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-769096ce]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-769096ce]{padding-top:20px}.link[data-v-769096ce]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-769096ce]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-3d2c5cd8]{position:relative;z-index:1}.nested[data-v-3d2c5cd8]{padding-right:16px;padding-left:16px}.outline-link[data-v-3d2c5cd8]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-3d2c5cd8]:hover,.outline-link.active[data-v-3d2c5cd8]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-3d2c5cd8]{padding-left:13px}.VPDocAsideOutline[data-v-9a976623]{display:none}.VPDocAsideOutline.has-outline[data-v-9a976623]{display:block}.content[data-v-9a976623]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-9a976623]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-9a976623]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-0508e845]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-0508e845]{flex-grow:1}.VPDocAside[data-v-0508e845] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-0508e845] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-0508e845] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-2d5eec31]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-2d5eec31]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-d25f151f]{margin-top:64px}.edit-info[data-v-d25f151f]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-d25f151f]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-d25f151f]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-d25f151f]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-d25f151f]{margin-right:8px}.prev-next[data-v-d25f151f]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-d25f151f]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-d25f151f]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-d25f151f]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-d25f151f]{margin-left:auto;text-align:right}.desc[data-v-d25f151f]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-d25f151f]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-660c348c]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-660c348c]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-660c348c]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-660c348c]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-660c348c]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-660c348c]{display:flex;justify-content:center}.VPDoc .aside[data-v-660c348c]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-660c348c]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-660c348c]{max-width:1104px}}.container[data-v-660c348c]{margin:0 auto;width:100%}.aside[data-v-660c348c]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-660c348c]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-660c348c]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-660c348c]::-webkit-scrollbar{display:none}.aside-curtain[data-v-660c348c]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-660c348c]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-660c348c]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-660c348c]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-660c348c]{order:1;margin:0;min-width:640px}}.content-container[data-v-660c348c]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-660c348c]{max-width:688px}.VPButton[data-v-c957d30d]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-c957d30d]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-c957d30d]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-c957d30d]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-c957d30d]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-c957d30d]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-c957d30d]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-c957d30d]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-c957d30d]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-c957d30d]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-c957d30d]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-c957d30d]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-c957d30d]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-c69324aa]{display:none}.dark .VPImage.light[data-v-c69324aa]{display:none}.VPHero[data-v-5ac44a4a]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-5ac44a4a]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-5ac44a4a]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-5ac44a4a]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-5ac44a4a]{flex-direction:row}}.main[data-v-5ac44a4a]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-5ac44a4a]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-5ac44a4a]{text-align:left}}@media (min-width: 960px){.main[data-v-5ac44a4a]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-5ac44a4a]{max-width:592px}}.heading[data-v-5ac44a4a]{display:flex;flex-direction:column}.name[data-v-5ac44a4a],.text[data-v-5ac44a4a]{width:fit-content;max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-5ac44a4a],.VPHero.has-image .text[data-v-5ac44a4a]{margin:0 auto}.name[data-v-5ac44a4a]{color:var(--vp-home-hero-name-color)}.clip[data-v-5ac44a4a]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-5ac44a4a],.text[data-v-5ac44a4a]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-5ac44a4a],.text[data-v-5ac44a4a]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-5ac44a4a],.VPHero.has-image .text[data-v-5ac44a4a]{margin:0}}.tagline[data-v-5ac44a4a]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-5ac44a4a]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-5ac44a4a]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-5ac44a4a]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-5ac44a4a]{margin:0}}.actions[data-v-5ac44a4a]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-5ac44a4a]{justify-content:center}@media (min-width: 640px){.actions[data-v-5ac44a4a]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-5ac44a4a]{justify-content:flex-start}}.action[data-v-5ac44a4a]{flex-shrink:0;padding:6px}.image[data-v-5ac44a4a]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-5ac44a4a]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-5ac44a4a]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-5ac44a4a]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-5ac44a4a]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-5ac44a4a]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-5ac44a4a]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-5ac44a4a]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-5ac44a4a]{width:320px;height:320px}}[data-v-5ac44a4a] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-5ac44a4a] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-5ac44a4a] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-d72d51ca]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-d72d51ca]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-d72d51ca]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-d72d51ca]>.VPImage{margin-bottom:20px}.icon[data-v-d72d51ca]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-d72d51ca]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-d72d51ca]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-d72d51ca]{padding-top:8px}.link-text-value[data-v-d72d51ca]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-d72d51ca]{margin-left:6px}.VPFeatures[data-v-12e08f5e]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-12e08f5e]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-12e08f5e]{padding:0 64px}}.container[data-v-12e08f5e]{margin:0 auto;max-width:1152px}.items[data-v-12e08f5e]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-12e08f5e]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-12e08f5e],.item.grid-4[data-v-12e08f5e],.item.grid-6[data-v-12e08f5e]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-12e08f5e],.item.grid-4[data-v-12e08f5e]{width:50%}.item.grid-3[data-v-12e08f5e],.item.grid-6[data-v-12e08f5e]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-12e08f5e]{width:25%}}.container[data-v-bcc25c44]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-bcc25c44]{padding:0 48px}}@media (min-width: 960px){.container[data-v-bcc25c44]{width:100%;padding:0 64px}}.vp-doc[data-v-bcc25c44] .VPHomeSponsors,.vp-doc[data-v-bcc25c44] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-bcc25c44] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-bcc25c44] .VPHomeSponsors a,.vp-doc[data-v-bcc25c44] .VPTeamPage a{text-decoration:none}.VPHome[data-v-855f107a]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-855f107a]{margin-bottom:128px}}.VPContent[data-v-9f0d4acb]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-9f0d4acb]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-9f0d4acb]{margin:0}@media (min-width: 960px){.VPContent[data-v-9f0d4acb]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-9f0d4acb]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-9f0d4acb]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-6d4fdf1e]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-6d4fdf1e]{display:none}.VPFooter[data-v-6d4fdf1e] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-6d4fdf1e] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-6d4fdf1e]{padding:32px}}.container[data-v-6d4fdf1e]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-6d4fdf1e],.copyright[data-v-6d4fdf1e]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-3ca9f49e]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-3ca9f49e]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-3ca9f49e]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-3ca9f49e]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-3ca9f49e]{color:var(--vp-c-text-1)}.icon[data-v-3ca9f49e]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-3ca9f49e]{font-size:14px}.icon[data-v-3ca9f49e]{font-size:16px}}.open>.icon[data-v-3ca9f49e]{transform:rotate(90deg)}.items[data-v-3ca9f49e]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-3ca9f49e]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-3ca9f49e]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-3ca9f49e]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-3ca9f49e]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-3ca9f49e]{transition:all .2s ease-out}.flyout-leave-active[data-v-3ca9f49e]{transition:all .15s ease-in}.flyout-enter-from[data-v-3ca9f49e],.flyout-leave-to[data-v-3ca9f49e]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-f39a3298]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-f39a3298]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-f39a3298]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-f39a3298]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-f39a3298]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-f39a3298]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-f39a3298]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-f39a3298]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-f39a3298]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-f39a3298]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-f39a3298]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-f39a3298]{display:none}}.menu-icon[data-v-f39a3298]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-f39a3298]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-f39a3298]{padding:12px 32px 11px}}.VPSwitch[data-v-10be344e]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-10be344e]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-10be344e]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-10be344e]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-10be344e] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-10be344e] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-64116ff8]{opacity:1}.moon[data-v-64116ff8],.dark .sun[data-v-64116ff8]{opacity:0}.dark .moon[data-v-64116ff8]{opacity:1}.dark .VPSwitchAppearance[data-v-64116ff8] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-3c27bf39]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-3c27bf39]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-f59d973b]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-f59d973b]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-f59d973b]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-f59d973b]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-caeadd89]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-caeadd89]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-caeadd89]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-caeadd89]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-cd155cfc]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-cd155cfc] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-cd155cfc] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-cd155cfc] .group:last-child{padding-bottom:0}.VPMenu[data-v-cd155cfc] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-cd155cfc] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-cd155cfc] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-cd155cfc] .action{padding-left:24px}.VPFlyout[data-v-437eb093]{position:relative}.VPFlyout[data-v-437eb093]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-437eb093]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-437eb093]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-437eb093]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-437eb093]{color:var(--vp-c-brand-2)}.button[aria-expanded=false]+.menu[data-v-437eb093]{opacity:0;visibility:hidden;transform:translateY(0)}.VPFlyout:hover .menu[data-v-437eb093],.button[aria-expanded=true]+.menu[data-v-437eb093]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-437eb093]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-437eb093]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-437eb093]{margin-right:0;font-size:16px}.text-icon[data-v-437eb093]{margin-left:4px;font-size:14px}.icon[data-v-437eb093]{font-size:20px;transition:fill .25s}.menu[data-v-437eb093]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-4956e2a1]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-4956e2a1]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-4956e2a1]>svg,.VPSocialLink[data-v-4956e2a1]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-0148638c]{display:flex;justify-content:center}.VPNavBarExtra[data-v-86f141c1]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-86f141c1]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-86f141c1]{display:none}}.trans-title[data-v-86f141c1]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-86f141c1],.item.social-links[data-v-86f141c1]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-86f141c1]{min-width:176px}.appearance-action[data-v-86f141c1]{margin-right:-2px}.social-links-list[data-v-86f141c1]{margin:-4px -8px}.VPNavBarHamburger[data-v-33023aa6]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-33023aa6]{display:none}}.container[data-v-33023aa6]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-33023aa6]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-33023aa6]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-33023aa6]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-33023aa6]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-33023aa6]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-33023aa6]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-33023aa6],.VPNavBarHamburger.active:hover .middle[data-v-33023aa6],.VPNavBarHamburger.active:hover .bottom[data-v-33023aa6]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-33023aa6],.middle[data-v-33023aa6],.bottom[data-v-33023aa6]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-33023aa6]{top:0;left:0;transform:translate(0)}.middle[data-v-33023aa6]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-33023aa6]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-dcff3482]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-dcff3482],.VPNavBarMenuLink[data-v-dcff3482]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-eb72f9f7]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-eb72f9f7]{display:flex}}/*! @docsearch/css 3.8.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 #0304094d;--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button-Key--pressed{transform:none;box-shadow:none}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-b674b0d9]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-b674b0d9]{display:flex;align-items:center}}.title[data-v-77b887c2]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-77b887c2]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-77b887c2]{border-bottom-color:var(--vp-c-divider)}}[data-v-77b887c2] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-d3f6c3ed]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-d3f6c3ed]{display:flex;align-items:center}}.title[data-v-d3f6c3ed]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-59b07c45]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-59b07c45]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-59b07c45]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-59b07c45]:not(.home){background-color:transparent}.VPNavBar[data-v-59b07c45]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-59b07c45]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-59b07c45]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-59b07c45]{padding:0}}.container[data-v-59b07c45]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-59b07c45],.container>.content[data-v-59b07c45]{pointer-events:none}.container[data-v-59b07c45] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-59b07c45]{max-width:100%}}.title[data-v-59b07c45]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-59b07c45]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-59b07c45]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-59b07c45]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-59b07c45]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-59b07c45]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-59b07c45]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.home.top) .content-body[data-v-59b07c45]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-59b07c45]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-59b07c45]{column-gap:.5rem}}.menu+.translations[data-v-59b07c45]:before,.menu+.appearance[data-v-59b07c45]:before,.menu+.social-links[data-v-59b07c45]:before,.translations+.appearance[data-v-59b07c45]:before,.appearance+.social-links[data-v-59b07c45]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-59b07c45]:before,.translations+.appearance[data-v-59b07c45]:before{margin-right:16px}.appearance+.social-links[data-v-59b07c45]:before{margin-left:16px}.social-links[data-v-59b07c45]{margin-right:-8px}.divider[data-v-59b07c45]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-59b07c45]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-59b07c45]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-59b07c45]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-59b07c45]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-59b07c45]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-59b07c45]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-77e37dd8]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-77e37dd8]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-6680c343]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-6680c343]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-bcef7725]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-bcef7725]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-f6adf3a2]{display:block}.title[data-v-f6adf3a2]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-2989dfaf]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-2989dfaf]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-2989dfaf]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-2989dfaf]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-2989dfaf]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-2989dfaf]{transform:rotate(45deg)}.button[data-v-2989dfaf]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-2989dfaf]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-2989dfaf]{transition:transform .25s}.group[data-v-2989dfaf]:first-child{padding-top:0}.group+.group[data-v-2989dfaf],.group+.item[data-v-2989dfaf]{padding-top:4px}.VPNavScreenTranslations[data-v-4742671a]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-4742671a]{height:auto}.title[data-v-4742671a]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-4742671a]{font-size:16px}.icon.lang[data-v-4742671a]{margin-right:8px}.icon.chevron[data-v-4742671a]{margin-left:4px}.list[data-v-4742671a]{padding:4px 0 0 24px}.link[data-v-4742671a]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-e824f21d]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-e824f21d],.VPNavScreen.fade-leave-active[data-v-e824f21d]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-e824f21d],.VPNavScreen.fade-leave-active .container[data-v-e824f21d]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-e824f21d],.VPNavScreen.fade-leave-to[data-v-e824f21d]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-e824f21d],.VPNavScreen.fade-leave-to .container[data-v-e824f21d]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-e824f21d]{display:none}}.container[data-v-e824f21d]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-e824f21d],.menu+.appearance[data-v-e824f21d],.translations+.appearance[data-v-e824f21d]{margin-top:24px}.menu+.social-links[data-v-e824f21d]{margin-top:16px}.appearance+.social-links[data-v-e824f21d]{margin-top:16px}.VPNav[data-v-ae3b4e71]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-ae3b4e71]{position:fixed}}.VPSidebarItem.level-0[data-v-51c3a27f]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-51c3a27f]{padding-bottom:10px}.item[data-v-51c3a27f]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-51c3a27f]{cursor:pointer}.indicator[data-v-51c3a27f]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-51c3a27f],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-51c3a27f],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-51c3a27f],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-51c3a27f]{background-color:var(--vp-c-brand-1)}.link[data-v-51c3a27f]{display:flex;align-items:center;flex-grow:1}.text[data-v-51c3a27f]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-51c3a27f]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-51c3a27f],.VPSidebarItem.level-2 .text[data-v-51c3a27f],.VPSidebarItem.level-3 .text[data-v-51c3a27f],.VPSidebarItem.level-4 .text[data-v-51c3a27f],.VPSidebarItem.level-5 .text[data-v-51c3a27f]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-51c3a27f],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-51c3a27f],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-51c3a27f],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-51c3a27f],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-51c3a27f],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-51c3a27f]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-51c3a27f],.VPSidebarItem.level-1.has-active>.item>.text[data-v-51c3a27f],.VPSidebarItem.level-2.has-active>.item>.text[data-v-51c3a27f],.VPSidebarItem.level-3.has-active>.item>.text[data-v-51c3a27f],.VPSidebarItem.level-4.has-active>.item>.text[data-v-51c3a27f],.VPSidebarItem.level-5.has-active>.item>.text[data-v-51c3a27f],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-51c3a27f],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-51c3a27f],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-51c3a27f],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-51c3a27f],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-51c3a27f],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-51c3a27f]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-51c3a27f],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-51c3a27f],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-51c3a27f],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-51c3a27f],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-51c3a27f],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-51c3a27f]{color:var(--vp-c-brand-1)}.caret[data-v-51c3a27f]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-51c3a27f]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-51c3a27f]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-51c3a27f]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-51c3a27f]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-51c3a27f],.VPSidebarItem.level-2 .items[data-v-51c3a27f],.VPSidebarItem.level-3 .items[data-v-51c3a27f],.VPSidebarItem.level-4 .items[data-v-51c3a27f],.VPSidebarItem.level-5 .items[data-v-51c3a27f]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-51c3a27f]{display:none}.no-transition[data-v-bb61ce6c] .caret-icon{transition:none}.group+.group[data-v-bb61ce6c]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-bb61ce6c]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-450ac41d]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-450ac41d]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-450ac41d]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-450ac41d]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-450ac41d]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-450ac41d]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-450ac41d]{outline:0}.VPSkipLink[data-v-20ff5aae]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-20ff5aae]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-20ff5aae]{top:14px;left:16px}}.Layout[data-v-c2d1c289]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-fc21e3d1]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-fc21e3d1]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-fc21e3d1]{margin:128px 0}}.VPHomeSponsors[data-v-fc21e3d1]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-fc21e3d1]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-fc21e3d1]{padding:0 64px}}.container[data-v-fc21e3d1]{margin:0 auto;max-width:1152px}.love[data-v-fc21e3d1]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-fc21e3d1]{display:inline-block}.message[data-v-fc21e3d1]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-fc21e3d1]{padding-top:32px}.action[data-v-fc21e3d1]{padding-top:40px;text-align:center}.VPTeamMembersItem[data-v-77945920]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-77945920]{padding:32px}.VPTeamMembersItem.small .data[data-v-77945920]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-77945920]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-77945920]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-77945920]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-77945920]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-77945920]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-77945920]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-77945920]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-77945920]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-77945920]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-77945920]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-77945920]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-77945920]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-77945920]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-77945920]{text-align:center}.avatar[data-v-77945920]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-77945920]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-77945920]{margin:0;font-weight:600}.affiliation[data-v-77945920]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-77945920]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-77945920]:hover{color:var(--vp-c-brand-1)}.desc[data-v-77945920]{margin:0 auto}.desc[data-v-77945920] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-77945920]{display:flex;justify-content:center;height:56px}.sp-link[data-v-77945920]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-77945920]:hover,.sp .sp-link.link[data-v-77945920]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-77945920]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-6bcb1115]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-6bcb1115]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-6bcb1115]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-6bcb1115]{max-width:876px}.VPTeamMembers.medium .container[data-v-6bcb1115]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-6bcb1115]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-6bcb1115]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-6bcb1115]{max-width:760px}.container[data-v-6bcb1115]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.VPTeamPage[data-v-cf022c99]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-cf022c99]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-cf022c99-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-cf022c99-s],.VPTeamMembers+.VPTeamPageSection[data-v-cf022c99-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-cf022c99-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-cf022c99-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-cf022c99-s],.VPTeamMembers+.VPTeamPageSection[data-v-cf022c99-s]{margin-top:96px}}.VPTeamMembers[data-v-cf022c99-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-cf022c99-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-cf022c99-s]{padding:0 64px}}.VPTeamPageSection[data-v-850c3d73]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-850c3d73]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-850c3d73]{padding:0 64px}}.title[data-v-850c3d73]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-850c3d73]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-850c3d73]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-850c3d73]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-850c3d73]{padding-top:40px}.VPTeamPageTitle[data-v-e8d35152]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-e8d35152]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-e8d35152]{padding:80px 64px 48px}}.title[data-v-e8d35152]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-e8d35152]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-e8d35152]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-e8d35152]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPLocalSearchBox[data-v-95bc29ae]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-95bc29ae]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-95bc29ae]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 767px){.shell[data-v-95bc29ae]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-95bc29ae]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 767px){.search-bar[data-v-95bc29ae]{padding:0 8px}}.search-bar[data-v-95bc29ae]:focus-within{border-color:var(--vp-c-brand-1)}.local-search-icon[data-v-95bc29ae]{display:block;font-size:18px}.navigate-icon[data-v-95bc29ae]{display:block;font-size:14px}.search-icon[data-v-95bc29ae]{margin:8px}@media (max-width: 767px){.search-icon[data-v-95bc29ae]{display:none}}.search-input[data-v-95bc29ae]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-95bc29ae]{padding:6px 4px}}.search-actions[data-v-95bc29ae]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-95bc29ae]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-95bc29ae]{display:none}}.search-actions button[data-v-95bc29ae]{padding:8px}.search-actions button[data-v-95bc29ae]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-95bc29ae]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-95bc29ae]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-95bc29ae]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-95bc29ae]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-95bc29ae]{display:none}}.search-keyboard-shortcuts kbd[data-v-95bc29ae]{background:#8080801a;border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-95bc29ae]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-95bc29ae]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-95bc29ae]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-95bc29ae]{margin:8px}}.titles[data-v-95bc29ae]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-95bc29ae]{display:flex;align-items:center;gap:4px}.title.main[data-v-95bc29ae]{font-weight:500}.title-icon[data-v-95bc29ae]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-95bc29ae]{opacity:.5}.result.selected[data-v-95bc29ae]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-95bc29ae]{position:relative}.excerpt[data-v-95bc29ae]{opacity:50%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;margin-top:4px}.result.selected .excerpt[data-v-95bc29ae]{opacity:1}.excerpt[data-v-95bc29ae] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-95bc29ae] mark,.excerpt[data-v-95bc29ae] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-95bc29ae] .vp-code-group .tabs{display:none}.excerpt[data-v-95bc29ae] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-95bc29ae]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-95bc29ae]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-95bc29ae],.result.selected .title-icon[data-v-95bc29ae]{color:var(--vp-c-brand-1)!important}.no-results[data-v-95bc29ae]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-95bc29ae]{flex:none} diff --git a/assets/tts-providers_edge.md.DyIkCTE0.js b/assets/tts-providers_edge.md.DPjdtaQf.js similarity index 97% rename from assets/tts-providers_edge.md.DyIkCTE0.js rename to assets/tts-providers_edge.md.DPjdtaQf.js index 00522e25..8a984ed1 100644 --- a/assets/tts-providers_edge.md.DyIkCTE0.js +++ b/assets/tts-providers_edge.md.DPjdtaQf.js @@ -1 +1 @@ -import{_ as t,o,c as a,ag as d}from"./chunks/framework.CvgP6Fyv.js";const p=JSON.parse('{"title":"Edge TTS","description":"","frontmatter":{},"headers":[],"relativePath":"tts-providers/edge.md","filePath":"tts-providers/edge.md","lastUpdated":1774787421000}'),r={name:"tts-providers/edge.md"};function i(n,e,s,l,c,g){return o(),a("div",null,[...e[0]||(e[0]=[d('

Edge TTS

Edge TTS uses Microsoft Edge's public read-aloud API for speech synthesis. It is free, requires no API key, and supports 256+ voices across 50+ languages.


Creating an Edge TTS Provider

  1. Navigate to the TTS Providers page.
  2. Click Add.
  3. Select edge as the provider type.
  4. Click Create.

The default model edge-read-aloud is automatically imported when the provider is created.


Configuring the Model

Click the edge-read-aloud model to configure its settings.

FieldDescription
VoiceLanguage + voice ID. Default: en-US-EmmaMultilingualNeural. Over 256 voices available across 50+ languages.
FormatAudio output format. Options: audio-24khz-48kbitrate-mono-mp3 (default), audio-24khz-96kbitrate-mono-mp3, webm-24khz-16bit-mono-opus.
SpeedPlayback speed. Options: 0.5, 1.0 (default), 2.0, 3.0.
PitchVoice pitch adjustment. Range: -100 to +100, default 0.

Assigning to a Bot

  1. Open a bot's General tab.
  2. Find the TTS Model dropdown.
  3. Select the configured Edge TTS model.
  4. Click Save.

The bot can now synthesize speech using Edge TTS.


Testing

Use the built-in synthesis test button on the model configuration page to preview how the selected voice, format, speed, and pitch sound before assigning to a bot.

',17)])])}const u=t(r,[["render",i]]);export{p as __pageData,u as default}; +import{_ as t,o,c as a,ag as d}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Edge TTS","description":"","frontmatter":{},"headers":[],"relativePath":"tts-providers/edge.md","filePath":"tts-providers/edge.md","lastUpdated":1774787421000}'),r={name:"tts-providers/edge.md"};function i(n,e,s,l,c,g){return o(),a("div",null,[...e[0]||(e[0]=[d('

Edge TTS

Edge TTS uses Microsoft Edge's public read-aloud API for speech synthesis. It is free, requires no API key, and supports 256+ voices across 50+ languages.


Creating an Edge TTS Provider

  1. Navigate to the TTS Providers page.
  2. Click Add.
  3. Select edge as the provider type.
  4. Click Create.

The default model edge-read-aloud is automatically imported when the provider is created.


Configuring the Model

Click the edge-read-aloud model to configure its settings.

FieldDescription
VoiceLanguage + voice ID. Default: en-US-EmmaMultilingualNeural. Over 256 voices available across 50+ languages.
FormatAudio output format. Options: audio-24khz-48kbitrate-mono-mp3 (default), audio-24khz-96kbitrate-mono-mp3, webm-24khz-16bit-mono-opus.
SpeedPlayback speed. Options: 0.5, 1.0 (default), 2.0, 3.0.
PitchVoice pitch adjustment. Range: -100 to +100, default 0.

Assigning to a Bot

  1. Open a bot's General tab.
  2. Find the TTS Model dropdown.
  3. Select the configured Edge TTS model.
  4. Click Save.

The bot can now synthesize speech using Edge TTS.


Testing

Use the built-in synthesis test button on the model configuration page to preview how the selected voice, format, speed, and pitch sound before assigning to a bot.

',17)])])}const u=t(r,[["render",i]]);export{p as __pageData,u as default}; diff --git a/assets/tts-providers_edge.md.DyIkCTE0.lean.js b/assets/tts-providers_edge.md.DPjdtaQf.lean.js similarity index 85% rename from assets/tts-providers_edge.md.DyIkCTE0.lean.js rename to assets/tts-providers_edge.md.DPjdtaQf.lean.js index 90b9a882..167e3789 100644 --- a/assets/tts-providers_edge.md.DyIkCTE0.lean.js +++ b/assets/tts-providers_edge.md.DPjdtaQf.lean.js @@ -1 +1 @@ -import{_ as t,o,c as a,ag as d}from"./chunks/framework.CvgP6Fyv.js";const p=JSON.parse('{"title":"Edge TTS","description":"","frontmatter":{},"headers":[],"relativePath":"tts-providers/edge.md","filePath":"tts-providers/edge.md","lastUpdated":1774787421000}'),r={name:"tts-providers/edge.md"};function i(n,e,s,l,c,g){return o(),a("div",null,[...e[0]||(e[0]=[d("",17)])])}const u=t(r,[["render",i]]);export{p as __pageData,u as default}; +import{_ as t,o,c as a,ag as d}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Edge TTS","description":"","frontmatter":{},"headers":[],"relativePath":"tts-providers/edge.md","filePath":"tts-providers/edge.md","lastUpdated":1774787421000}'),r={name:"tts-providers/edge.md"};function i(n,e,s,l,c,g){return o(),a("div",null,[...e[0]||(e[0]=[d("",17)])])}const u=t(r,[["render",i]]);export{p as __pageData,u as default}; diff --git a/assets/tts-providers_index.md.MiCAla7_.js b/assets/tts-providers_index.md.Cgc87EeS.js similarity index 95% rename from assets/tts-providers_index.md.MiCAla7_.js rename to assets/tts-providers_index.md.Cgc87EeS.js index 2ee2d204..72f6b51b 100644 --- a/assets/tts-providers_index.md.MiCAla7_.js +++ b/assets/tts-providers_index.md.Cgc87EeS.js @@ -1 +1 @@ -import{_ as t,o as r,c as o,ag as a}from"./chunks/framework.CvgP6Fyv.js";const g=JSON.parse('{"title":"TTS Providers","description":"","frontmatter":{},"headers":[],"relativePath":"tts-providers/index.md","filePath":"tts-providers/index.md","lastUpdated":1774787421000}'),i={name:"tts-providers/index.md"};function s(d,e,l,n,c,h){return r(),o("div",null,[...e[0]||(e[0]=[a('

TTS Providers

Memoh supports Text-to-Speech (TTS) so bots can synthesize spoken audio from text. The TTS system is organized into three layers:

  • TTS Provider: A service type (e.g. Edge TTS). You create named provider instances from the TTS Providers page.
  • TTS Model: A specific voice/model under a provider (e.g. edge-read-aloud). Models have configurable voice, format, speed, and pitch settings.
  • Bot Assignment: In Bot Settings, select a TTS Model. The bot can then synthesize speech in conversations.

Basic Flow

  1. Navigate to the TTS Providers page from the sidebar.
  2. Click Add and select a provider type (e.g. edge).
  3. Click Create — the provider's default model is auto-imported.
  4. Click the model to configure voice, format, speed, and pitch.
  5. Test synthesis with the built-in test button.
  6. Open a bot's General tab and select the TTS Model.
  7. Save — the bot can now synthesize speech.

Available Providers

ProviderDescription
Edge TTSFree, uses Microsoft Edge's public read-aloud API. 256+ voices across 50+ languages. No API key required.

Next Steps

  • To set up the currently available provider, continue with Edge TTS.
',12)])])}const v=t(i,[["render",s]]);export{g as __pageData,v as default}; +import{_ as t,o as r,c as o,ag as a}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"TTS Providers","description":"","frontmatter":{},"headers":[],"relativePath":"tts-providers/index.md","filePath":"tts-providers/index.md","lastUpdated":1774787421000}'),i={name:"tts-providers/index.md"};function s(d,e,l,n,c,h){return r(),o("div",null,[...e[0]||(e[0]=[a('

TTS Providers

Memoh supports Text-to-Speech (TTS) so bots can synthesize spoken audio from text. The TTS system is organized into three layers:

  • TTS Provider: A service type (e.g. Edge TTS). You create named provider instances from the TTS Providers page.
  • TTS Model: A specific voice/model under a provider (e.g. edge-read-aloud). Models have configurable voice, format, speed, and pitch settings.
  • Bot Assignment: In Bot Settings, select a TTS Model. The bot can then synthesize speech in conversations.

Basic Flow

  1. Navigate to the TTS Providers page from the sidebar.
  2. Click Add and select a provider type (e.g. edge).
  3. Click Create — the provider's default model is auto-imported.
  4. Click the model to configure voice, format, speed, and pitch.
  5. Test synthesis with the built-in test button.
  6. Open a bot's General tab and select the TTS Model.
  7. Save — the bot can now synthesize speech.

Available Providers

ProviderDescription
Edge TTSFree, uses Microsoft Edge's public read-aloud API. 256+ voices across 50+ languages. No API key required.

Next Steps

  • To set up the currently available provider, continue with Edge TTS.
',12)])])}const v=t(i,[["render",s]]);export{g as __pageData,v as default}; diff --git a/assets/tts-providers_index.md.MiCAla7_.lean.js b/assets/tts-providers_index.md.Cgc87EeS.lean.js similarity index 71% rename from assets/tts-providers_index.md.MiCAla7_.lean.js rename to assets/tts-providers_index.md.Cgc87EeS.lean.js index 33e1d6b4..936e7a01 100644 --- a/assets/tts-providers_index.md.MiCAla7_.lean.js +++ b/assets/tts-providers_index.md.Cgc87EeS.lean.js @@ -1 +1 @@ -import{_ as t,o as r,c as o,ag as a}from"./chunks/framework.CvgP6Fyv.js";const g=JSON.parse('{"title":"TTS Providers","description":"","frontmatter":{},"headers":[],"relativePath":"tts-providers/index.md","filePath":"tts-providers/index.md","lastUpdated":1774787421000}'),i={name:"tts-providers/index.md"};function s(d,e,l,n,c,h){return r(),o("div",null,[...e[0]||(e[0]=[a("",12)])])}const v=t(i,[["render",s]]);export{g as __pageData,v as default}; +import{_ as t,o as r,c as o,ag as a}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"TTS Providers","description":"","frontmatter":{},"headers":[],"relativePath":"tts-providers/index.md","filePath":"tts-providers/index.md","lastUpdated":1774787421000}'),i={name:"tts-providers/index.md"};function s(d,e,l,n,c,h){return r(),o("div",null,[...e[0]||(e[0]=[a("",12)])])}const v=t(i,[["render",s]]);export{g as __pageData,v as default}; diff --git a/assets/zh_concepts_identity-and-binding.md.CwSe42kA.js b/assets/zh_concepts_identity-and-binding.md.6tGYa9d_.js similarity index 96% rename from assets/zh_concepts_identity-and-binding.md.CwSe42kA.js rename to assets/zh_concepts_identity-and-binding.md.6tGYa9d_.js index d495735c..291465b7 100644 --- a/assets/zh_concepts_identity-and-binding.md.CwSe42kA.js +++ b/assets/zh_concepts_identity-and-binding.md.6tGYa9d_.js @@ -1 +1 @@ -import{_ as o,o as e,c as a,ag as i}from"./chunks/framework.CvgP6Fyv.js";const u=JSON.parse('{"title":"账号模型与绑定","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/identity-and-binding.md","filePath":"zh/concepts/identity-and-binding.md","lastUpdated":1770887583000}'),l={name:"zh/concepts/identity-and-binding.md"};function n(r,t,d,s,c,h){return e(),a("div",null,[...t[0]||(t[0]=[i('

账号模型与绑定

账号模型

Memoh 将平台账号与系统账号视为两类不同实体:

  • 平台账号(ChannelIdentity 是用户在外部接入平台上的账号(例如飞书账号),不是 Memoh 内部账号。
  • 系统账号(User 是 Memoh 系统内账号。

平台账号在初始阶段可以不绑定系统账号。
bind 的职责是完成这两类账号的关联。

接入平台与 Bot

  • 接入平台(channel 是入站消息来源。
  • Bot 是系统内的授权与资源边界。

Bot 由系统账号管理,入站消息由平台账号产生。

为什么账号绑定是账号作用域

账号绑定的目标是建立账号归属关系,而不是直接发放 bot 资源权限:

  • 它只负责平台账号与系统账号的绑定;
  • 不把账号绑定与成员管理语义耦合在一起;
  • 让 bot 访问控制保持独立、可演进。

账号绑定流程(当前共识)

  1. 用户以自己的系统账号申请 bind code;
  2. 平台账号在支持的接入平台会话中发送 code;
  3. 系统校验 code,完成平台账号到系统账号的绑定;
  4. bot 成员与授权由独立流程处理。

Bot 类型语义

  • Public bot:支持成员协作语义。
  • Personal bot:语义上应为单 owner,不应依赖成员机制。

注:本文档记录的是产品语义与共识方向。
部分运行时细节仍可能处于收敛阶段。

',16)])])}const p=o(l,[["render",n]]);export{u as __pageData,p as default}; +import{_ as o,o as e,c as a,ag as i}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"账号模型与绑定","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/identity-and-binding.md","filePath":"zh/concepts/identity-and-binding.md","lastUpdated":1770887583000}'),l={name:"zh/concepts/identity-and-binding.md"};function n(r,t,d,s,c,h){return e(),a("div",null,[...t[0]||(t[0]=[i('

账号模型与绑定

账号模型

Memoh 将平台账号与系统账号视为两类不同实体:

  • 平台账号(ChannelIdentity 是用户在外部接入平台上的账号(例如飞书账号),不是 Memoh 内部账号。
  • 系统账号(User 是 Memoh 系统内账号。

平台账号在初始阶段可以不绑定系统账号。
bind 的职责是完成这两类账号的关联。

接入平台与 Bot

  • 接入平台(channel 是入站消息来源。
  • Bot 是系统内的授权与资源边界。

Bot 由系统账号管理,入站消息由平台账号产生。

为什么账号绑定是账号作用域

账号绑定的目标是建立账号归属关系,而不是直接发放 bot 资源权限:

  • 它只负责平台账号与系统账号的绑定;
  • 不把账号绑定与成员管理语义耦合在一起;
  • 让 bot 访问控制保持独立、可演进。

账号绑定流程(当前共识)

  1. 用户以自己的系统账号申请 bind code;
  2. 平台账号在支持的接入平台会话中发送 code;
  3. 系统校验 code,完成平台账号到系统账号的绑定;
  4. bot 成员与授权由独立流程处理。

Bot 类型语义

  • Public bot:支持成员协作语义。
  • Personal bot:语义上应为单 owner,不应依赖成员机制。

注:本文档记录的是产品语义与共识方向。
部分运行时细节仍可能处于收敛阶段。

',16)])])}const p=o(l,[["render",n]]);export{u as __pageData,p as default}; diff --git a/assets/zh_concepts_identity-and-binding.md.CwSe42kA.lean.js b/assets/zh_concepts_identity-and-binding.md.6tGYa9d_.lean.js similarity index 74% rename from assets/zh_concepts_identity-and-binding.md.CwSe42kA.lean.js rename to assets/zh_concepts_identity-and-binding.md.6tGYa9d_.lean.js index 50b27317..02018d94 100644 --- a/assets/zh_concepts_identity-and-binding.md.CwSe42kA.lean.js +++ b/assets/zh_concepts_identity-and-binding.md.6tGYa9d_.lean.js @@ -1 +1 @@ -import{_ as o,o as e,c as a,ag as i}from"./chunks/framework.CvgP6Fyv.js";const u=JSON.parse('{"title":"账号模型与绑定","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/identity-and-binding.md","filePath":"zh/concepts/identity-and-binding.md","lastUpdated":1770887583000}'),l={name:"zh/concepts/identity-and-binding.md"};function n(r,t,d,s,c,h){return e(),a("div",null,[...t[0]||(t[0]=[i("",16)])])}const p=o(l,[["render",n]]);export{u as __pageData,p as default}; +import{_ as o,o as e,c as a,ag as i}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"账号模型与绑定","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/identity-and-binding.md","filePath":"zh/concepts/identity-and-binding.md","lastUpdated":1770887583000}'),l={name:"zh/concepts/identity-and-binding.md"};function n(r,t,d,s,c,h){return e(),a("div",null,[...t[0]||(t[0]=[i("",16)])])}const p=o(l,[["render",n]]);export{u as __pageData,p as default}; diff --git a/assets/zh_concepts_index.md.B_keRB_w.js b/assets/zh_concepts_index.md._zNPjKkD.js similarity index 93% rename from assets/zh_concepts_index.md.B_keRB_w.js rename to assets/zh_concepts_index.md._zNPjKkD.js index d45f81ff..ac130966 100644 --- a/assets/zh_concepts_index.md.B_keRB_w.js +++ b/assets/zh_concepts_index.md._zNPjKkD.js @@ -1 +1 @@ -import{_ as a,o as t,c as o,ag as n}from"./chunks/framework.CvgP6Fyv.js";const _=JSON.parse('{"title":"核心概念","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/index.md","filePath":"zh/concepts/index.md","lastUpdated":1770887583000}'),r={name:"zh/concepts/index.md"};function i(l,e,d,s,c,h){return t(),o("div",null,[...e[0]||(e[0]=[n('

核心概念

本章节用于定义 Memoh 的核心账号与访问概念。

概念图

  • 系统账号(User:Memoh 系统内账号。
  • 平台账号(ChannelIdentity:用户在外部接入平台上的账号,不是 Memoh 系统内账号(例如用户的飞书账号)。
  • Bot:由系统账号管理的资源与访问边界。
  • 账号绑定(bind:把平台账号关联到系统账号的过程。

为什么重要

Memoh 需要同时处理外部接入平台消息与系统内权限控制。
因此我们明确区分平台账号与系统账号,并将 bot 授权与账号绑定解耦。

术语说明:文档中的“平台账号”统一指用户在对应平台上的真实账号(如飞书账号),不指本项目内部账号。

本章内容

',9)])])}const m=a(r,[["render",i]]);export{_ as __pageData,m as default}; +import{_ as a,o as t,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const _=JSON.parse('{"title":"核心概念","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/index.md","filePath":"zh/concepts/index.md","lastUpdated":1770887583000}'),r={name:"zh/concepts/index.md"};function i(l,e,d,s,c,h){return t(),o("div",null,[...e[0]||(e[0]=[n('

核心概念

本章节用于定义 Memoh 的核心账号与访问概念。

概念图

  • 系统账号(User:Memoh 系统内账号。
  • 平台账号(ChannelIdentity:用户在外部接入平台上的账号,不是 Memoh 系统内账号(例如用户的飞书账号)。
  • Bot:由系统账号管理的资源与访问边界。
  • 账号绑定(bind:把平台账号关联到系统账号的过程。

为什么重要

Memoh 需要同时处理外部接入平台消息与系统内权限控制。
因此我们明确区分平台账号与系统账号,并将 bot 授权与账号绑定解耦。

术语说明:文档中的“平台账号”统一指用户在对应平台上的真实账号(如飞书账号),不指本项目内部账号。

本章内容

',9)])])}const m=a(r,[["render",i]]);export{_ as __pageData,m as default}; diff --git a/assets/zh_concepts_index.md.B_keRB_w.lean.js b/assets/zh_concepts_index.md._zNPjKkD.lean.js similarity index 71% rename from assets/zh_concepts_index.md.B_keRB_w.lean.js rename to assets/zh_concepts_index.md._zNPjKkD.lean.js index fe5927fc..8ceea582 100644 --- a/assets/zh_concepts_index.md.B_keRB_w.lean.js +++ b/assets/zh_concepts_index.md._zNPjKkD.lean.js @@ -1 +1 @@ -import{_ as a,o as t,c as o,ag as n}from"./chunks/framework.CvgP6Fyv.js";const _=JSON.parse('{"title":"核心概念","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/index.md","filePath":"zh/concepts/index.md","lastUpdated":1770887583000}'),r={name:"zh/concepts/index.md"};function i(l,e,d,s,c,h){return t(),o("div",null,[...e[0]||(e[0]=[n("",9)])])}const m=a(r,[["render",i]]);export{_ as __pageData,m as default}; +import{_ as a,o as t,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const _=JSON.parse('{"title":"核心概念","description":"","frontmatter":{},"headers":[],"relativePath":"zh/concepts/index.md","filePath":"zh/concepts/index.md","lastUpdated":1770887583000}'),r={name:"zh/concepts/index.md"};function i(l,e,d,s,c,h){return t(),o("div",null,[...e[0]||(e[0]=[n("",9)])])}const m=a(r,[["render",i]]);export{_ as __pageData,m as default}; diff --git a/assets/zh_index.md.Clg9MYGD.js b/assets/zh_index.md.Db4hJx1C.js similarity index 92% rename from assets/zh_index.md.Clg9MYGD.js rename to assets/zh_index.md.Db4hJx1C.js index c0ab549f..61b48635 100644 --- a/assets/zh_index.md.Clg9MYGD.js +++ b/assets/zh_index.md.Db4hJx1C.js @@ -1 +1 @@ -import{_ as a,o as t,c as l,ag as i}from"./chunks/framework.CvgP6Fyv.js";const _=JSON.parse('{"title":"Memoh 文档","description":"","frontmatter":{},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md","lastUpdated":1770887583000}'),o={name:"zh/index.md"};function r(h,e,n,d,s,m){return t(),l("div",null,[...e[0]||(e[0]=[i('

Memoh 文档

Memoh 是一个多成员、长记忆、容器化的 AI Agent 系统。

文档章节

面向文档贡献者

当前维护范围

当前文档先聚焦账号语义与访问控制:

  • 区分系统账号与平台账号
  • 解释为什么账号绑定是账号作用域
  • 说明账号绑定与 bot 访问控制之间的关系

说明:“平台账号”指用户在外部平台上的真实账号(例如飞书账号),不是 Memoh 系统账号。

',10)])])}const p=a(o,[["render",r]]);export{_ as __pageData,p as default}; +import{_ as a,o as t,c as l,ag as i}from"./chunks/framework.DXGyWiRo.js";const _=JSON.parse('{"title":"Memoh 文档","description":"","frontmatter":{},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md","lastUpdated":1770887583000}'),o={name:"zh/index.md"};function r(h,e,n,d,s,m){return t(),l("div",null,[...e[0]||(e[0]=[i('

Memoh 文档

Memoh 是一个多成员、长记忆、容器化的 AI Agent 系统。

文档章节

面向文档贡献者

当前维护范围

当前文档先聚焦账号语义与访问控制:

  • 区分系统账号与平台账号
  • 解释为什么账号绑定是账号作用域
  • 说明账号绑定与 bot 访问控制之间的关系

说明:“平台账号”指用户在外部平台上的真实账号(例如飞书账号),不是 Memoh 系统账号。

',10)])])}const p=a(o,[["render",r]]);export{_ as __pageData,p as default}; diff --git a/assets/zh_index.md.Clg9MYGD.lean.js b/assets/zh_index.md.Db4hJx1C.lean.js similarity index 69% rename from assets/zh_index.md.Clg9MYGD.lean.js rename to assets/zh_index.md.Db4hJx1C.lean.js index e69202e0..586b303d 100644 --- a/assets/zh_index.md.Clg9MYGD.lean.js +++ b/assets/zh_index.md.Db4hJx1C.lean.js @@ -1 +1 @@ -import{_ as a,o as t,c as l,ag as i}from"./chunks/framework.CvgP6Fyv.js";const _=JSON.parse('{"title":"Memoh 文档","description":"","frontmatter":{},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md","lastUpdated":1770887583000}'),o={name:"zh/index.md"};function r(h,e,n,d,s,m){return t(),l("div",null,[...e[0]||(e[0]=[i("",10)])])}const p=a(o,[["render",r]]);export{_ as __pageData,p as default}; +import{_ as a,o as t,c as l,ag as i}from"./chunks/framework.DXGyWiRo.js";const _=JSON.parse('{"title":"Memoh 文档","description":"","frontmatter":{},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md","lastUpdated":1770887583000}'),o={name:"zh/index.md"};function r(h,e,n,d,s,m){return t(),l("div",null,[...e[0]||(e[0]=[i("",10)])])}const p=a(o,[["render",r]]);export{_ as __pageData,p as default}; diff --git a/assets/zh_style_terminology.md.BGrDT8pF.js b/assets/zh_style_terminology.md.CzqhSoQX.js similarity index 96% rename from assets/zh_style_terminology.md.BGrDT8pF.js rename to assets/zh_style_terminology.md.CzqhSoQX.js index 87e770e0..00b24a8f 100644 --- a/assets/zh_style_terminology.md.BGrDT8pF.js +++ b/assets/zh_style_terminology.md.CzqhSoQX.js @@ -1 +1 @@ -import{_ as e,o as l,c as t,ag as a}from"./chunks/framework.CvgP6Fyv.js";const u=JSON.parse('{"title":"术语规范","description":"","frontmatter":{},"headers":[],"relativePath":"zh/style/terminology.md","filePath":"zh/style/terminology.md","lastUpdated":1770887583000}'),i={name:"zh/style/terminology.md"};function r(n,o,s,d,c,h){return l(),t("div",null,[...o[0]||(o[0]=[a('

术语规范

适用对象:文档编写者与维护者。 本页用于统一写作语义,不是面向最终用户的功能说明。

规范术语

  • 系统账号(User:Memoh 系统内账号。
  • 平台账号(ChannelIdentity:用户在外部接入平台上的账号,不是 Memoh 内账号。
  • 接入平台(channel:承载入站消息的外部平台。
  • 账号绑定(bind:把平台账号关联到系统账号的过程。
  • 绑定码(Bind Code):用于账号绑定的一次性代码。
  • Bot:由系统账号管理的资源与授权边界。

推荐写法

  • 面向产品语义时,优先写 “平台账号”,不要直接写 actor。
  • 描述业务行为时,优先写 “接入平台”,不要直接写 channel。
  • 首次出现保留技术别名,后续可只用中文术语:
    • 平台账号(ChannelIdentity
    • 系统账号(User
    • 账号绑定(bind

禁用或不推荐写法

  • 在概念文档中直接使用 actor(除非明确引用代码符号)。
  • 使用含糊表述如 “平台用户”(未区分系统账号与平台账号)。
  • 写出“平台账号是 Memoh 内部账号”这类错误语义。

示例

  • 正确:“平台账号是用户在飞书上的账号,不是 Memoh 系统账号。”
  • 正确:“账号绑定用于把平台账号关联到系统账号。”
  • 错误:“Actor 是 Memoh 里的用户。”

自检清单

  • 是否明确区分了系统账号与平台账号?
  • 叙述中是否将 channel 表述为接入平台?
  • 是否仅在首处保留技术别名?
',12)])])}const m=e(i,[["render",r]]);export{u as __pageData,m as default}; +import{_ as e,o as l,c as t,ag as a}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"术语规范","description":"","frontmatter":{},"headers":[],"relativePath":"zh/style/terminology.md","filePath":"zh/style/terminology.md","lastUpdated":1770887583000}'),i={name:"zh/style/terminology.md"};function r(n,o,s,d,c,h){return l(),t("div",null,[...o[0]||(o[0]=[a('

术语规范

适用对象:文档编写者与维护者。 本页用于统一写作语义,不是面向最终用户的功能说明。

规范术语

  • 系统账号(User:Memoh 系统内账号。
  • 平台账号(ChannelIdentity:用户在外部接入平台上的账号,不是 Memoh 内账号。
  • 接入平台(channel:承载入站消息的外部平台。
  • 账号绑定(bind:把平台账号关联到系统账号的过程。
  • 绑定码(Bind Code):用于账号绑定的一次性代码。
  • Bot:由系统账号管理的资源与授权边界。

推荐写法

  • 面向产品语义时,优先写 “平台账号”,不要直接写 actor。
  • 描述业务行为时,优先写 “接入平台”,不要直接写 channel。
  • 首次出现保留技术别名,后续可只用中文术语:
    • 平台账号(ChannelIdentity
    • 系统账号(User
    • 账号绑定(bind

禁用或不推荐写法

  • 在概念文档中直接使用 actor(除非明确引用代码符号)。
  • 使用含糊表述如 “平台用户”(未区分系统账号与平台账号)。
  • 写出“平台账号是 Memoh 内部账号”这类错误语义。

示例

  • 正确:“平台账号是用户在飞书上的账号,不是 Memoh 系统账号。”
  • 正确:“账号绑定用于把平台账号关联到系统账号。”
  • 错误:“Actor 是 Memoh 里的用户。”

自检清单

  • 是否明确区分了系统账号与平台账号?
  • 叙述中是否将 channel 表述为接入平台?
  • 是否仅在首处保留技术别名?
',12)])])}const m=e(i,[["render",r]]);export{u as __pageData,m as default}; diff --git a/assets/zh_style_terminology.md.BGrDT8pF.lean.js b/assets/zh_style_terminology.md.CzqhSoQX.lean.js similarity index 71% rename from assets/zh_style_terminology.md.BGrDT8pF.lean.js rename to assets/zh_style_terminology.md.CzqhSoQX.lean.js index 1cdd72e2..91f9812c 100644 --- a/assets/zh_style_terminology.md.BGrDT8pF.lean.js +++ b/assets/zh_style_terminology.md.CzqhSoQX.lean.js @@ -1 +1 @@ -import{_ as e,o as l,c as t,ag as a}from"./chunks/framework.CvgP6Fyv.js";const u=JSON.parse('{"title":"术语规范","description":"","frontmatter":{},"headers":[],"relativePath":"zh/style/terminology.md","filePath":"zh/style/terminology.md","lastUpdated":1770887583000}'),i={name:"zh/style/terminology.md"};function r(n,o,s,d,c,h){return l(),t("div",null,[...o[0]||(o[0]=[a("",12)])])}const m=e(i,[["render",r]]);export{u as __pageData,m as default}; +import{_ as e,o as l,c as t,ag as a}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"术语规范","description":"","frontmatter":{},"headers":[],"relativePath":"zh/style/terminology.md","filePath":"zh/style/terminology.md","lastUpdated":1770887583000}'),i={name:"zh/style/terminology.md"};function r(n,o,s,d,c,h){return l(),t("div",null,[...o[0]||(o[0]=[a("",12)])])}const m=e(i,[["render",r]]);export{u as __pageData,m as default}; diff --git a/blogs/2026-02-16.html b/blogs/2026-02-16.html index 8784032e..c4a4465e 100644 --- a/blogs/2026-02-16.html +++ b/blogs/2026-02-16.html @@ -6,21 +6,21 @@ Introduction to Memoh - The Case for an Always-On, Containerized Home Agent | Memoh Documentation - + - + - - - + + + -
Skip to content

Introduction to Memoh - The Case for an Always-On, Containerized Home Agent

Overview

We enter 2026 with a familiar tension: models get smarter every quarter, but the “agent experience” still breaks on context, latency, privacy, and real-world workflows. Over the past year, we kept circling three questions:

  • Where does the capability boundary of agents actually sit?
  • What’s the real value of long context?
  • What hardware form factor makes “always-on, personal AI” feel natural?

Memoh is our attempt to turn those questions into something buildable—not a manifesto, but a system that can survive contact with reality.

Story Time

Time travels fast. Somewhere between “I’ll remember this” and “wait, why did we decide that?”, a year disappears.

That’s the annoying part of building: most progress doesn’t feel like progress while it’s happening. It’s just a stream of small choices, half-finished threads, late-night fixes, and the occasional moment that actually clicks. The kind of moment where you sit back and think: okay—this is real.

Around the same time, I noticed something else: the internet started to feel smoother—and worse.

Text got cleaner, longer, more polite, more… empty. You could smell when something was generated: low information density, too many metaphors, too much agreement, not enough stakes.

I caught myself doing it too.

So I started forcing a constraint: say it plainly. Keep the density. Don’t inflate. Don’t hide behind style. If something mattered, anchor it to a real moment, a real trade-off, a real cost paid.

Because the thing LLMs can’t give you is not “intelligence.” It’s weight. The feeling that a human actually stood somewhere in time and wrote from that position.

That’s when I realized what I wanted wasn’t “an AI that can talk.” I wanted an AI that can live with you—quietly, continuously, accumulating context without turning your life into content sludge.

Phones were our first instinct—it's personal, powerful, always there. But mobile OS is closed: without OEM privileges you can build an app, not ambient infrastructure.

So we looked for the always-on node every home already has: the router (conceptually). Then the economics clash—router-class hardware can’t carry memory, RAG, tools, and multi-user agents. The device evolves: more RAM/storage, a screen, mic/speaker, tiny battery for take out, portable form.

Eventually it stops being a router. It becomes a new category: a home agent base layer.

What

Memoh is a containerized home/studio AI base layer: cloud-grade model capability paired with local-first memory (knowledge base, RAG/search, conversation history) that stays under your control.

Why

Long-context models raise the ceiling for agents—but they also make “fully local” expensive and “fully cloud” uncomfortable. People don’t want to re-brief AI every day, and they don’t want their durable context trapped in someone else’s feed. Containerization makes Memoh portable, reproducible, and safe to run as always-on infrastructure—so continuity becomes cheap, private, and dependable.

How

We run Memoh as a containerized stack: isolated services for storage (files/DB/vector index), retrieval, tool/runtime execution, and the control plane. Inference calls cloud APIs when you need frontier capability; durable memory and indexing stay local. The device acts as an always-on node (router-like, not a router) serving multiple users with strict boundaries: sharing is explicit, private context remains private, and everything is deployable/upgradable as versioned containers.

Features

  • Multi-bot Management: Create multiple bots; humans and bots, or bots with each other, can chat privately, in groups, or collaborate.

    Multi-bot Management

  • Containerized: Each bot runs in its own isolated container. Bots can freely execute commands, edit files, and access the network within their containers—like having their own computer.

    Containerized

  • Memory Engineering: Every chat is stored in the database, with the last 24 hours of context loaded by default. Each conversation turn is stored as memory and can be retrieved by bots through semantic search.

    Memory Engineering

  • Various Platforms: Supports Telegram, Lark (Feishu), and more.

  • Simple and Easy to Use: Configure bots and settings for Provider, Model, Memory, Channel, MCP, and Skills through a graphical interface—no coding required to set up your own AI bot.

  • Scheduled Tasks: Schedule tasks with cron expressions to run commands at specified times.

  • More...

Compare to OpenClaw

We share a core belief: both Memoh and OpenClaw treat the agent as more than a chatbox—we give the LLM a playground: a real environment where it can remember, use tools, and iterate.

Where Memoh differs:

  • Lighter and Faster: built as home/studio infrastructure, can be held in the edge device
  • Containerized by default: each bot gets an isolated container (files/commands/network/jobs)
  • Hybrid split: cloud inference, local-first memory + indexing
  • Multi-user first: explicit sharing and privacy boundaries, support a2a (Agent2Agent)
  • Sustainable: have an experienced team and confidence to push forward and build it

Conclusion

Memoh is built for one thing: always-on continuity—an AI that stays online, and a memory that stays yours.

We keep frontier inference in the cloud, keep durable context local, and run everything as a containerized, always-on stack. If you want an agent that feels less like an app and more like home infrastructure, that’s the bet Memoh is making.

Furthermore, we will continue to operate and permanently open-source Memoh, making it a product with long impact.

Published under AGPLv3

- +
Skip to content

Introduction to Memoh - The Case for an Always-On, Containerized Home Agent

Overview

We enter 2026 with a familiar tension: models get smarter every quarter, but the “agent experience” still breaks on context, latency, privacy, and real-world workflows. Over the past year, we kept circling three questions:

  • Where does the capability boundary of agents actually sit?
  • What’s the real value of long context?
  • What hardware form factor makes “always-on, personal AI” feel natural?

Memoh is our attempt to turn those questions into something buildable—not a manifesto, but a system that can survive contact with reality.

Story Time

Time travels fast. Somewhere between “I’ll remember this” and “wait, why did we decide that?”, a year disappears.

That’s the annoying part of building: most progress doesn’t feel like progress while it’s happening. It’s just a stream of small choices, half-finished threads, late-night fixes, and the occasional moment that actually clicks. The kind of moment where you sit back and think: okay—this is real.

Around the same time, I noticed something else: the internet started to feel smoother—and worse.

Text got cleaner, longer, more polite, more… empty. You could smell when something was generated: low information density, too many metaphors, too much agreement, not enough stakes.

I caught myself doing it too.

So I started forcing a constraint: say it plainly. Keep the density. Don’t inflate. Don’t hide behind style. If something mattered, anchor it to a real moment, a real trade-off, a real cost paid.

Because the thing LLMs can’t give you is not “intelligence.” It’s weight. The feeling that a human actually stood somewhere in time and wrote from that position.

That’s when I realized what I wanted wasn’t “an AI that can talk.” I wanted an AI that can live with you—quietly, continuously, accumulating context without turning your life into content sludge.

Phones were our first instinct—it's personal, powerful, always there. But mobile OS is closed: without OEM privileges you can build an app, not ambient infrastructure.

So we looked for the always-on node every home already has: the router (conceptually). Then the economics clash—router-class hardware can’t carry memory, RAG, tools, and multi-user agents. The device evolves: more RAM/storage, a screen, mic/speaker, tiny battery for take out, portable form.

Eventually it stops being a router. It becomes a new category: a home agent base layer.

What

Memoh is a containerized home/studio AI base layer: cloud-grade model capability paired with local-first memory (knowledge base, RAG/search, conversation history) that stays under your control.

Why

Long-context models raise the ceiling for agents—but they also make “fully local” expensive and “fully cloud” uncomfortable. People don’t want to re-brief AI every day, and they don’t want their durable context trapped in someone else’s feed. Containerization makes Memoh portable, reproducible, and safe to run as always-on infrastructure—so continuity becomes cheap, private, and dependable.

How

We run Memoh as a containerized stack: isolated services for storage (files/DB/vector index), retrieval, tool/runtime execution, and the control plane. Inference calls cloud APIs when you need frontier capability; durable memory and indexing stay local. The device acts as an always-on node (router-like, not a router) serving multiple users with strict boundaries: sharing is explicit, private context remains private, and everything is deployable/upgradable as versioned containers.

Features

  • Multi-bot Management: Create multiple bots; humans and bots, or bots with each other, can chat privately, in groups, or collaborate.

    Multi-bot Management

  • Containerized: Each bot runs in its own isolated container. Bots can freely execute commands, edit files, and access the network within their containers—like having their own computer.

    Containerized

  • Memory Engineering: Every chat is stored in the database, with the last 24 hours of context loaded by default. Each conversation turn is stored as memory and can be retrieved by bots through semantic search.

    Memory Engineering

  • Various Platforms: Supports Telegram, Lark (Feishu), and more.

  • Simple and Easy to Use: Configure bots and settings for Provider, Model, Memory, Channel, MCP, and Skills through a graphical interface—no coding required to set up your own AI bot.

  • Scheduled Tasks: Schedule tasks with cron expressions to run commands at specified times.

  • More...

Compare to OpenClaw

We share a core belief: both Memoh and OpenClaw treat the agent as more than a chatbox—we give the LLM a playground: a real environment where it can remember, use tools, and iterate.

Where Memoh differs:

  • Lighter and Faster: built as home/studio infrastructure, can be held in the edge device
  • Containerized by default: each bot gets an isolated container (files/commands/network/jobs)
  • Hybrid split: cloud inference, local-first memory + indexing
  • Multi-user first: explicit sharing and privacy boundaries, support a2a (Agent2Agent)
  • Sustainable: have an experienced team and confidence to push forward and build it

Conclusion

Memoh is built for one thing: always-on continuity—an AI that stays online, and a memory that stays yours.

We keep frontier inference in the cloud, keep durable context local, and run everything as a containerized, always-on stack. If you want an agent that feels less like an app and more like home infrastructure, that’s the bet Memoh is making.

Furthermore, we will continue to operate and permanently open-source Memoh, making it a product with long impact.

Published under AGPLv3

+ \ No newline at end of file diff --git a/blogs/index.html b/blogs/index.html index 9fefc47d..d14d3ded 100644 --- a/blogs/index.html +++ b/blogs/index.html @@ -6,21 +6,21 @@ Blogs | Memoh Documentation - + - + - - - + + + -
Skip to content

Blogs

This section contains the latest blogs about Memoh.

Published under AGPLv3

- +
Skip to content

Blogs

This section contains the latest blogs about Memoh.

Published under AGPLv3

+ \ No newline at end of file diff --git a/channels/discord.html b/channels/discord.html index ae17d831..64a51a81 100644 --- a/channels/discord.html +++ b/channels/discord.html @@ -6,21 +6,21 @@ Discord Channel Configuration | Memoh Documentation - + - + - - - + + + -
Skip to content

Discord Channel Configuration

Connecting your Memoh Bot to Discord allows it to join servers and interact with community members.

Step 1: Create a Discord Application

  1. Go to the Discord Developer Portal.
  2. Click New Application and give it a name.
  3. In the left sidebar, go to Bot.
  4. Click Reset Token to generate a Bot Token. Copy this token and store it securely.

Step 2: Configure Bot Settings

  1. Scroll down to the Privileged Gateway Intents section.
  2. Enable Message Content Intent, Server Members Intent and Presence Intent.
  3. Save changes.

Step 3: Invite the Bot to Your Server

  1. Go to OAuth2 > URL Generator.
  2. Select scopes: bot, applications.commands.
  3. Select permissions: Send Messages, Read Message History, Embed Links, Attach Files.
  4. Copy the generated URL and open it in your browser.
  5. Select the server you want to add the bot to and authorize it.

Official Guide: Discord Developer Portal - Bots

Step 4: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select Discord.
  3. Paste your Bot Token.
  4. Click Save and Enable.

Features Supported

  • Message Content: Full access to chat text.
  • Attachments: Support for images and files.
  • Commands: Integration with Discord's slash commands (if configured via MCP).

Published under AGPLv3

- +
Skip to content

Discord Channel Configuration

Connecting your Memoh Bot to Discord allows it to join servers and interact with community members.

Step 1: Create a Discord Application

  1. Go to the Discord Developer Portal.
  2. Click New Application and give it a name.
  3. In the left sidebar, go to Bot.
  4. Click Reset Token to generate a Bot Token. Copy this token and store it securely.

Step 2: Configure Bot Settings

  1. Scroll down to the Privileged Gateway Intents section.
  2. Enable Message Content Intent, Server Members Intent and Presence Intent.
  3. Save changes.

Step 3: Invite the Bot to Your Server

  1. Go to OAuth2 > URL Generator.
  2. Select scopes: bot, applications.commands.
  3. Select permissions: Send Messages, Read Message History, Embed Links, Attach Files.
  4. Copy the generated URL and open it in your browser.
  5. Select the server you want to add the bot to and authorize it.

Official Guide: Discord Developer Portal - Bots

Step 4: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select Discord.
  3. Paste your Bot Token.
  4. Click Save and Enable.

Features Supported

  • Message Content: Full access to chat text.
  • Attachments: Support for images and files.
  • Commands: Integration with Discord's slash commands (if configured via MCP).

Published under AGPLv3

+ \ No newline at end of file diff --git a/channels/feishu.html b/channels/feishu.html index e0a3d313..465b8fec 100644 --- a/channels/feishu.html +++ b/channels/feishu.html @@ -6,21 +6,21 @@ Feishu (Lark) Channel Configuration | Memoh Documentation - + - + - - - + + + -
Skip to content

Feishu (Lark) Channel Configuration

Memoh supports integrating with Feishu (Lark) via the Open Platform. This allows your enterprise bots to interact with users in groups or private chats.

Step 1: Create a Feishu App

  1. Go to the Feishu Open Platform and log in.
  2. Click Create Custom App.
  3. Enter a name and description, then click Create.
  4. In the left sidebar, go to App Settings > Credentials & Basic Info.
  5. Copy your App ID and App Secret.

Step 2: Enable Bot Capability

  1. In the Feishu Developer Console, go to Capabilities > Bot.
  2. Click Enable Bot.

Step 3: Configure Permissions

  1. Go to Capabilities > Permissions.
  2. Search for and enable the following permissions (at minimum):
    • im:message (Receive and send messages)
    • im:chat (Access group chat information)
  3. Click Apply for Permissions if required by your organization.

Step 4: Configure Events (Webhook Mode)

  1. In Memoh, go to your Bot's Platforms tab and add a Feishu channel.
  2. Choose Inbound Mode: webhook.
  3. Fill in your App ID and App Secret.
  4. Click Save. Memoh will generate a Webhook Callback URL.
  5. Copy this URL.
  6. In the Feishu Console, go to App Settings > Event Subscriptions.
  7. Paste the URL into the Verification URL field and save.
  8. Add events like Receive Message (im.message.receive_v1).

Official Guide: Feishu Custom Bot Guide

Step 5: Publish Your App

  1. In the Feishu Console, go to App Release > Version Management & Release.
  2. Click Create a Version, fill in the details, and submit for approval.
  3. Once approved and published, the bot is ready to use.

Published under AGPLv3

- +
Skip to content

Feishu (Lark) Channel Configuration

Memoh supports integrating with Feishu (Lark) via the Open Platform. This allows your enterprise bots to interact with users in groups or private chats.

Step 1: Create a Feishu App

  1. Go to the Feishu Open Platform and log in.
  2. Click Create Custom App.
  3. Enter a name and description, then click Create.
  4. In the left sidebar, go to App Settings > Credentials & Basic Info.
  5. Copy your App ID and App Secret.

Step 2: Enable Bot Capability

  1. In the Feishu Developer Console, go to Capabilities > Bot.
  2. Click Enable Bot.

Step 3: Configure Permissions

  1. Go to Capabilities > Permissions.
  2. Search for and enable the following permissions (at minimum):
    • im:message (Receive and send messages)
    • im:chat (Access group chat information)
  3. Click Apply for Permissions if required by your organization.

Step 4: Configure Events (Webhook Mode)

  1. In Memoh, go to your Bot's Platforms tab and add a Feishu channel.
  2. Choose Inbound Mode: webhook.
  3. Fill in your App ID and App Secret.
  4. Click Save. Memoh will generate a Webhook Callback URL.
  5. Copy this URL.
  6. In the Feishu Console, go to App Settings > Event Subscriptions.
  7. Paste the URL into the Verification URL field and save.
  8. Add events like Receive Message (im.message.receive_v1).

Official Guide: Feishu Custom Bot Guide

Step 5: Publish Your App

  1. In the Feishu Console, go to App Release > Version Management & Release.
  2. Click Create a Version, fill in the details, and submit for approval.
  3. Once approved and published, the bot is ready to use.

Published under AGPLv3

+ \ No newline at end of file diff --git a/channels/index.html b/channels/index.html index 2ff7ce81..af16f6b5 100644 --- a/channels/index.html +++ b/channels/index.html @@ -6,21 +6,21 @@ Channels Overview | Memoh Documentation - + - + - - - + + + -
Skip to content

Channels Overview

Channels are the gateways that connect your Memoh Bots to the outside world. By configuring channels, you can interact with your bots via your favorite messaging platforms.

Memoh currently supports the following channels:

  • Telegram: Feature-rich integration with streaming and attachment support.
  • Feishu (Lark): Enterprise-ready integration for business workflows.
  • Discord: Community-focused integration for servers and direct messages.
  • QQ: Quick setup for personal DM bots via the dedicated AI bot registration portal.
  • Matrix: Decentralized messaging protocol support for any Matrix homeserver.
  • WeCom (WeWork): Enterprise messaging integration for WeCom workspaces.
  • WeChat: Personal messaging via the WeChat AI bot platform.
  • Email: Connect via SMTP providers, Mailgun, or Gmail OAuth (configured through Email Providers).
  • Web: Built-in chat interface for immediate access.

General Setup Flow

  1. Create an external app/bot: Register your bot on the target platform (e.g., via BotFather on Telegram).
  2. Obtain credentials: Fetch API tokens, App IDs, or secrets.
  3. Configure in Memoh: Add the channel to your Bot's Platforms tab and paste the credentials.
  4. Enable: Activate the channel to start receiving and sending messages.

Choose a channel from the sidebar to see detailed configuration guides for each platform.

Published under AGPLv3

- +
Skip to content

Channels Overview

Channels are the gateways that connect your Memoh Bots to the outside world. By configuring channels, you can interact with your bots via your favorite messaging platforms.

Memoh currently supports the following channels:

  • Telegram: Feature-rich integration with streaming and attachment support.
  • Feishu (Lark): Enterprise-ready integration for business workflows.
  • Discord: Community-focused integration for servers and direct messages.
  • QQ: Quick setup for personal DM bots via the dedicated AI bot registration portal.
  • Matrix: Decentralized messaging protocol support for any Matrix homeserver.
  • WeCom (WeWork): Enterprise messaging integration for WeCom workspaces.
  • WeChat: Personal messaging via the WeChat AI bot platform.
  • Email: Connect via SMTP providers, Mailgun, or Gmail OAuth (configured through Email Providers).
  • Web: Built-in chat interface for immediate access.

General Setup Flow

  1. Create an external app/bot: Register your bot on the target platform (e.g., via BotFather on Telegram).
  2. Obtain credentials: Fetch API tokens, App IDs, or secrets.
  3. Configure in Memoh: Add the channel to your Bot's Platforms tab and paste the credentials.
  4. Enable: Activate the channel to start receiving and sending messages.

Choose a channel from the sidebar to see detailed configuration guides for each platform.

Published under AGPLv3

+ \ No newline at end of file diff --git a/channels/matrix.html b/channels/matrix.html index 80db010f..e5f8680a 100644 --- a/channels/matrix.html +++ b/channels/matrix.html @@ -6,20 +6,20 @@ Matrix Channel Configuration | Memoh Documentation - + - + - - - + + + -
Skip to content

Matrix Channel Configuration

Connecting your Memoh Bot to Matrix allows it to communicate via the decentralized Matrix messaging protocol. Your bot can join rooms, respond to direct messages, and participate in group conversations on any Matrix homeserver.

Step 1: Create a Matrix Bot Account

  1. Register a new account on your Matrix homeserver (e.g., via Element or any Matrix client).
  2. Note the User ID (e.g., @mybot:matrix.org).
  3. Obtain an Access Token for the account. You can do this by:
  • Option A: Using the Matrix Client Login API
bash
curl -X POST "https://<homeserver>/_matrix/client/v3/login" \
+    
Skip to content

Matrix Channel Configuration

Connecting your Memoh Bot to Matrix allows it to communicate via the decentralized Matrix messaging protocol. Your bot can join rooms, respond to direct messages, and participate in group conversations on any Matrix homeserver.

Step 1: Create a Matrix Bot Account

  1. Register a new account on your Matrix homeserver (e.g., via Element or any Matrix client).
  2. Note the User ID (e.g., @mybot:matrix.org).
  3. Obtain an Access Token for the account. You can do this by:
  • Option A: Using the Matrix Client Login API
bash
curl -X POST "https://<homeserver>/_matrix/client/v3/login" \
   -H "Content-Type: application/json" \
   -d '{
     "type": "m.login.password",
@@ -28,8 +28,8 @@
       "user": "<username>"
     },
     "password": "<password>"
-  }'
  • Option B: Extract from a client

Important: Keep the access token secret. Anyone with this token can act as your bot account.

Step 2: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select Matrix.
  3. Fill in the required fields:
FieldRequiredDescription
Homeserver URLYesThe base URL of your Matrix homeserver (e.g., https://matrix.org).
Access TokenYesThe bot account's access token.
User IDYesThe bot's Matrix user ID (e.g., @mybot:matrix.org).
Sync TimeoutNoLong-polling timeout in seconds (default: 30).
Auto Join InvitesNoAutomatically join rooms when invited (default: enabled).
  1. Click Save and Enable.

Step 3: Invite the Bot

  1. Open your Matrix client (Element, etc.).
  2. Invite the bot's user ID to a room, or start a direct message.
  3. If Auto Join Invites is enabled, the bot will automatically accept and join.

Features Supported

  • Message Content: Full access to text messages.
  • Rooms: Join and participate in group rooms.
  • Direct Messages: Private conversations with individual users.
  • Streaming: Responses are streamed as they are generated.
  • Markdown: Support for formatted text.
  • Media/Attachment: Bots can receive and send files or photo.
  • Check the roadmap for more features of Matrix.

Official Resources

Published under AGPLv3

- + }'
  • Option B: Extract from a client

Important: Keep the access token secret. Anyone with this token can act as your bot account.

Step 2: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select Matrix.
  3. Fill in the required fields:
FieldRequiredDescription
Homeserver URLYesThe base URL of your Matrix homeserver (e.g., https://matrix.org).
Access TokenYesThe bot account's access token.
User IDYesThe bot's Matrix user ID (e.g., @mybot:matrix.org).
Sync TimeoutNoLong-polling timeout in seconds (default: 30).
Auto Join InvitesNoAutomatically join rooms when invited (default: enabled).
  1. Click Save and Enable.

Step 3: Invite the Bot

  1. Open your Matrix client (Element, etc.).
  2. Invite the bot's user ID to a room, or start a direct message.
  3. If Auto Join Invites is enabled, the bot will automatically accept and join.

Features Supported

  • Message Content: Full access to text messages.
  • Rooms: Join and participate in group rooms.
  • Direct Messages: Private conversations with individual users.
  • Streaming: Responses are streamed as they are generated.
  • Markdown: Support for formatted text.
  • Media/Attachment: Bots can receive and send files or photo.
  • Check the roadmap for more features of Matrix.

Official Resources

Published under AGPLv3

+ \ No newline at end of file diff --git a/channels/qq.html b/channels/qq.html index e48e0026..4cddb55f 100644 --- a/channels/qq.html +++ b/channels/qq.html @@ -6,21 +6,21 @@ QQ Channel Configuration | Memoh Documentation - + - + - - - + + + -
Skip to content

QQ Channel Configuration

Connecting your Memoh Bot to QQ allows it to interact with users through QQ's official Bot platform.

Step 1: Create a QQ Bot

  1. Go to the QQ Bot Open Platform and log in with your QQ account.
  2. Click Create Bot (创建机器人) - no approval required. Each account can create up to 5 bots.
  3. Copy the AppID and AppSecret displayed on the page.

Important: AppSecret is only shown once. Save it securely - viewing it again will force a reset.

Step 2: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select QQ.
  3. Paste your AppID and AppSecret.
  4. Configure optional settings:
    • Markdown Support: Enable Markdown formatting (default: enabled).
    • Enable Input Hint: Show typing indicators (default: enabled).
  5. Click Save and Enable.

Step 3: Bind Your Identity (Optional)

Binding your QQ identity to your Memoh account enables cross-platform identity recognition — the bot will know who you are regardless of which channel you use.

  1. In Memoh Web UI, go to Profile > Bind Code.
  2. Select QQ and click Generate.
  3. Copy the code and send it to your bot in a QQ direct message.

Features Supported

  • Message Content: Full support for text messages.
  • Markdown: Rich formatting with bold, italic, code blocks, and links.
  • Attachments: Support for images and files.
  • Typing Indicators: Visual feedback while generating responses.
  • Target Types: C2C (direct message), group, and channel.

Official Resources

Published under AGPLv3

- +
Skip to content

QQ Channel Configuration

Connecting your Memoh Bot to QQ allows it to interact with users through QQ's official Bot platform.

Step 1: Create a QQ Bot

  1. Go to the QQ Bot Open Platform and log in with your QQ account.
  2. Click Create Bot (创建机器人) - no approval required. Each account can create up to 5 bots.
  3. Copy the AppID and AppSecret displayed on the page.

Important: AppSecret is only shown once. Save it securely - viewing it again will force a reset.

Step 2: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select QQ.
  3. Paste your AppID and AppSecret.
  4. Configure optional settings:
    • Markdown Support: Enable Markdown formatting (default: enabled).
    • Enable Input Hint: Show typing indicators (default: enabled).
  5. Click Save and Enable.

Step 3: Bind Your Identity (Optional)

Binding your QQ identity to your Memoh account enables cross-platform identity recognition — the bot will know who you are regardless of which channel you use.

  1. In Memoh Web UI, go to Profile > Bind Code.
  2. Select QQ and click Generate.
  3. Copy the code and send it to your bot in a QQ direct message.

Features Supported

  • Message Content: Full support for text messages.
  • Markdown: Rich formatting with bold, italic, code blocks, and links.
  • Attachments: Support for images and files.
  • Typing Indicators: Visual feedback while generating responses.
  • Target Types: C2C (direct message), group, and channel.

Official Resources

Published under AGPLv3

+ \ No newline at end of file diff --git a/channels/telegram.html b/channels/telegram.html index e7e49a82..57b47e63 100644 --- a/channels/telegram.html +++ b/channels/telegram.html @@ -6,21 +6,21 @@ Telegram Channel Configuration | Memoh Documentation - + - + - - - + + + -
Skip to content

Telegram Channel Configuration

This guide walks you through connecting your Memoh Bot to Telegram. Telegram is one of the most supported platforms in Memoh, featuring streaming responses, Markdown formatting, and attachment support.

Step 1: Create a Telegram Bot

You need to create a bot on Telegram to get an API token.

  1. Open Telegram and search for the official @BotFather bot.
  2. Send the /newbot command.
  3. Follow the prompts:
    • Name: Choose a display name for your bot (e.g., My Memoh Bot).
    • Username: Choose a unique username ending in bot (e.g., my_memoh_bot).
  4. BotFather will provide you with an API Token (e.g., 123456789:ABCdefGHIjklMNOpqrsTUVwxyz). Keep this token secret.

Official Guide: Telegram Bot Tutorial

Step 2: Configure Memoh

  1. Go to your Bot's Detail Page in the Memoh Web UI.
  2. Select the Platforms tab.
  3. Click Add Channel and select Telegram.
  4. Paste your API Token into the credentials field.
  5. Click Save and Enable.

Step 3: Bind Your Identity (Optional)

Binding your Telegram identity to your Memoh account enables cross-platform identity recognition — the bot will know who you are regardless of which channel you use.

  1. In Memoh Web UI, go to Profile > Bind Code.
  2. Select Telegram and click Generate.
  3. Copy the code.
  4. Open a chat with your new bot on Telegram and send the bind code.
  5. The bot should respond that your identity is successfully linked.

Features Supported

  • Streaming: Responses appear as the bot "thinks."
  • Markdown: Support for bold, italic, code blocks, and links.
  • Attachments: Send images or files to the bot; the bot can also send files back.
  • Replies: The bot understands context from message replies.

Published under AGPLv3

- +
Skip to content

Telegram Channel Configuration

This guide walks you through connecting your Memoh Bot to Telegram. Telegram is one of the most supported platforms in Memoh, featuring streaming responses, Markdown formatting, and attachment support.

Step 1: Create a Telegram Bot

You need to create a bot on Telegram to get an API token.

  1. Open Telegram and search for the official @BotFather bot.
  2. Send the /newbot command.
  3. Follow the prompts:
    • Name: Choose a display name for your bot (e.g., My Memoh Bot).
    • Username: Choose a unique username ending in bot (e.g., my_memoh_bot).
  4. BotFather will provide you with an API Token (e.g., 123456789:ABCdefGHIjklMNOpqrsTUVwxyz). Keep this token secret.

Official Guide: Telegram Bot Tutorial

Step 2: Configure Memoh

  1. Go to your Bot's Detail Page in the Memoh Web UI.
  2. Select the Platforms tab.
  3. Click Add Channel and select Telegram.
  4. Paste your API Token into the credentials field.
  5. Click Save and Enable.

Step 3: Bind Your Identity (Optional)

Binding your Telegram identity to your Memoh account enables cross-platform identity recognition — the bot will know who you are regardless of which channel you use.

  1. In Memoh Web UI, go to Profile > Bind Code.
  2. Select Telegram and click Generate.
  3. Copy the code.
  4. Open a chat with your new bot on Telegram and send the bind code.
  5. The bot should respond that your identity is successfully linked.

Features Supported

  • Streaming: Responses appear as the bot "thinks."
  • Markdown: Support for bold, italic, code blocks, and links.
  • Attachments: Send images or files to the bot; the bot can also send files back.
  • Replies: The bot understands context from message replies.

Published under AGPLv3

+ \ No newline at end of file diff --git a/channels/wecom.html b/channels/wecom.html index a32d2bb4..1f126565 100644 --- a/channels/wecom.html +++ b/channels/wecom.html @@ -6,21 +6,21 @@ WeCom (WeWork) Channel Configuration | Memoh Documentation - + - + - - - + + + -
Skip to content

WeCom (WeWork) Channel Configuration

Connecting your Memoh Bot to WeCom (企业微信) allows it to interact with users within your organization's WeCom workspace.

Step 1: Create a WeCom Bot

  1. Log in to the WeCom Admin Console.
  2. Navigate to App Management > Custom Apps or Bot Management.
  3. Create a new bot application.
  4. Note the Bot ID and Secret credentials.

Step 2: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select WeCom.
  3. Fill in the required fields:
FieldRequiredDescription
Bot IDYesThe WeCom bot identifier.
SecretYesThe bot's authentication credential.
WebSocket URLNoCustom WebSocket endpoint (uses default if empty).
  1. Click Save and Enable.

Step 3: Start Chatting

Once the channel is enabled, the bot will connect to WeCom via WebSocket and begin receiving messages. Users in your WeCom workspace can send messages to the bot directly or in group chats.

Features Supported

  • Message Content: Full support for text messages.
  • Direct Messages: Private conversations with individual users.
  • Group Chats: Participate in group conversations.
  • Streaming: Responses are streamed in real-time.

Official Resources

Published under AGPLv3

- +
Skip to content

WeCom (WeWork) Channel Configuration

Connecting your Memoh Bot to WeCom (企业微信) allows it to interact with users within your organization's WeCom workspace.

Step 1: Create a WeCom Bot

  1. Log in to the WeCom Admin Console.
  2. Navigate to App Management > Custom Apps or Bot Management.
  3. Create a new bot application.
  4. Note the Bot ID and Secret credentials.

Step 2: Configure Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select WeCom.
  3. Fill in the required fields:
FieldRequiredDescription
Bot IDYesThe WeCom bot identifier.
SecretYesThe bot's authentication credential.
WebSocket URLNoCustom WebSocket endpoint (uses default if empty).
  1. Click Save and Enable.

Step 3: Start Chatting

Once the channel is enabled, the bot will connect to WeCom via WebSocket and begin receiving messages. Users in your WeCom workspace can send messages to the bot directly or in group chats.

Features Supported

  • Message Content: Full support for text messages.
  • Direct Messages: Private conversations with individual users.
  • Group Chats: Participate in group conversations.
  • Streaming: Responses are streamed in real-time.

Official Resources

Published under AGPLv3

+ \ No newline at end of file diff --git a/channels/weixin.html b/channels/weixin.html index 107384ca..b1f449de 100644 --- a/channels/weixin.html +++ b/channels/weixin.html @@ -6,21 +6,21 @@ WeChat Channel Configuration | Memoh Documentation - + - + - - - + + + -
Skip to content

WeChat Channel Configuration

Connecting your Memoh Bot to WeChat allows it to interact with users directly via WeChat personal messaging. Setup is simple — just scan a QR code.

Step 1: Add WeChat Channel in Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select WeChat.

Step 2: Scan the QR Code

  1. Click Start QR Login. Memoh will fetch a QR code from the WeChat platform.
  2. Open WeChat on your phone and scan the displayed QR code.
  3. Confirm the login on your phone when prompted.
  4. Once confirmed, Memoh automatically saves the credentials — no manual token or API key entry is needed.

The QR code has a limited validity window. If it expires before you scan, click Start QR Login again to get a fresh one.

Step 3: Start Chatting

After the QR login succeeds, the channel is automatically enabled. Users can now send messages to the bot directly in WeChat.

Optional Settings

FieldDescription
Enable TypingShow typing indicators while generating responses.

Features Supported

  • Message Content: Full support for text messages.
  • Direct Messages: Private conversations with individual users.
  • Attachments: Support for images and media.
  • Typing Indicators: Visual feedback while generating responses (when enabled).

Published under AGPLv3

- +
Skip to content

WeChat Channel Configuration

Connecting your Memoh Bot to WeChat allows it to interact with users directly via WeChat personal messaging. Setup is simple — just scan a QR code.

Step 1: Add WeChat Channel in Memoh

  1. Go to your Bot's Platforms tab in the Memoh Web UI.
  2. Click Add Channel and select WeChat.

Step 2: Scan the QR Code

  1. Click Start QR Login. Memoh will fetch a QR code from the WeChat platform.
  2. Open WeChat on your phone and scan the displayed QR code.
  3. Confirm the login on your phone when prompted.
  4. Once confirmed, Memoh automatically saves the credentials — no manual token or API key entry is needed.

The QR code has a limited validity window. If it expires before you scan, click Start QR Login again to get a fresh one.

Step 3: Start Chatting

After the QR login succeeds, the channel is automatically enabled. Users can now send messages to the bot directly in WeChat.

Optional Settings

FieldDescription
Enable TypingShow typing indicators while generating responses.

Features Supported

  • Message Content: Full support for text messages.
  • Direct Messages: Private conversations with individual users.
  • Attachments: Support for images and media.
  • Typing Indicators: Visual feedback while generating responses (when enabled).

Published under AGPLv3

+ \ No newline at end of file diff --git a/getting-started/access.html b/getting-started/access.html index ff0ebad1..8bffbbc1 100644 --- a/getting-started/access.html +++ b/getting-started/access.html @@ -6,21 +6,21 @@ Bot Access Control | Memoh Documentation - + - + - - - + + + -
Skip to content

Bot Access Control

Memoh uses an ACL (Access Control List) system to control who can interact with your bot. You can define prioritized rules to allow or deny specific users, channel identities, or entire channel types — all from the bot's Access tab.


Concepts

Default Effect

Each bot has a default effect (allow or deny) that applies when no ACL rule matches an incoming message. Configure this in the bot's General tab under ACL Default Effect.

  • Allow: Anyone can chat with the bot unless explicitly denied by a rule.
  • Deny: Only the bot owner, admins, and explicitly allowed subjects can chat.

Subject Types

ACL rules can target three kinds of subjects:

SubjectDescription
AllMatches every incoming message regardless of sender. Use this for global allow/deny rules.
Channel IdentityA specific identity on an external channel (e.g., a Telegram user, a Discord member). Useful for controlling access at the individual level.
Channel TypeAn entire channel platform (e.g., all Telegram users, all Discord users). Useful for platform-level access control.

Rule Effects

Each rule has an effect:

  • Allow — Grants the subject permission to chat with the bot.
  • Deny — Blocks the subject from chatting with the bot.

Priority-Based Evaluation

Rules are evaluated in priority order (top to bottom). The first matching rule determines the outcome:

  1. Bot owner or system admin → Always allowed (bypasses ACL).
  2. Rules are checked from highest priority (top) to lowest (bottom).
  3. The first rule whose subject matches the sender is applied.
  4. If no rule matches → the default effect is applied.

This means rule ordering matters. A deny rule placed above an allow rule will take precedence for matching subjects.


Managing Access

Open a bot's Access tab to configure its access control.

Adding Rules

  1. Click Add Rule.
  2. Select a subject type:
    • All: Applies to everyone.
    • Channel Identity: Search and select a specific channel identity the bot has seen before.
    • Channel Type: Select an entire channel platform.
  3. Choose the effect: allow or deny.
  4. Optionally set source scope to restrict the rule to a specific context:
    • Channel: Only applies when the message comes from a specific channel config.
    • Conversation Type: private, group, or thread.
    • Conversation ID: A specific chat/group ID.
    • Thread ID: A specific thread within a conversation (requires Conversation ID).
  5. Click Save.

Reordering Rules

Rules can be drag-and-dropped to change their priority. Higher rules (closer to the top) are evaluated first. After reordering, click Save to persist the new order.

Source Scope

Source scope lets you create fine-grained rules. For example:

  • Allow a user to chat only via Telegram, but not Discord.
  • Block an entire channel type only in group conversations.
  • Restrict access to a specific thread in a specific group.

Scope fields form a hierarchy: Channel → Conversation Type → Conversation ID → Thread ID. Each level is optional, but a Thread ID requires a Conversation ID.


Examples

Open Bot (Anyone Can Chat)

  1. Set ACL Default Effect to allow in the General tab.
  2. No rules needed — everyone is allowed by default.

Private Bot with Selected Users

  1. Set ACL Default Effect to deny.
  2. Add allow rules for each authorized channel identity.
  3. Only listed subjects (plus the bot owner and admins) can trigger the bot.

Open Bot with Blocked Users

  1. Set ACL Default Effect to allow.
  2. Add deny rules for problematic channel identities at the top of the list.
  3. Everyone except denied subjects can chat with the bot.

Platform-Specific Access

  1. Set ACL Default Effect to deny.
  2. Add an allow rule with subject type Channel Type set to telegram.
  3. Only Telegram users can chat with the bot — messages from other channels are denied.

Channel-Scoped Access

  1. Add an allow rule for a specific channel identity.
  2. Set the Source Scope channel to your Telegram channel config.
  3. The user can only chat with the bot via that specific Telegram channel.

Published under AGPLv3

- +
Skip to content

Bot Access Control

Memoh uses an ACL (Access Control List) system to control who can interact with your bot. You can define prioritized rules to allow or deny specific users, channel identities, or entire channel types — all from the bot's Access tab.


Concepts

Default Effect

Each bot has a default effect (allow or deny) that applies when no ACL rule matches an incoming message. Configure this in the bot's General tab under ACL Default Effect.

  • Allow: Anyone can chat with the bot unless explicitly denied by a rule.
  • Deny: Only the bot owner, admins, and explicitly allowed subjects can chat.

Subject Types

ACL rules can target three kinds of subjects:

SubjectDescription
AllMatches every incoming message regardless of sender. Use this for global allow/deny rules.
Channel IdentityA specific identity on an external channel (e.g., a Telegram user, a Discord member). Useful for controlling access at the individual level.
Channel TypeAn entire channel platform (e.g., all Telegram users, all Discord users). Useful for platform-level access control.

Rule Effects

Each rule has an effect:

  • Allow — Grants the subject permission to chat with the bot.
  • Deny — Blocks the subject from chatting with the bot.

Priority-Based Evaluation

Rules are evaluated in priority order (top to bottom). The first matching rule determines the outcome:

  1. Bot owner or system admin → Always allowed (bypasses ACL).
  2. Rules are checked from highest priority (top) to lowest (bottom).
  3. The first rule whose subject matches the sender is applied.
  4. If no rule matches → the default effect is applied.

This means rule ordering matters. A deny rule placed above an allow rule will take precedence for matching subjects.


Managing Access

Open a bot's Access tab to configure its access control.

Adding Rules

  1. Click Add Rule.
  2. Select a subject type:
    • All: Applies to everyone.
    • Channel Identity: Search and select a specific channel identity the bot has seen before.
    • Channel Type: Select an entire channel platform.
  3. Choose the effect: allow or deny.
  4. Optionally set source scope to restrict the rule to a specific context:
    • Channel: Only applies when the message comes from a specific channel config.
    • Conversation Type: private, group, or thread.
    • Conversation ID: A specific chat/group ID.
    • Thread ID: A specific thread within a conversation (requires Conversation ID).
  5. Click Save.

Reordering Rules

Rules can be drag-and-dropped to change their priority. Higher rules (closer to the top) are evaluated first. After reordering, click Save to persist the new order.

Source Scope

Source scope lets you create fine-grained rules. For example:

  • Allow a user to chat only via Telegram, but not Discord.
  • Block an entire channel type only in group conversations.
  • Restrict access to a specific thread in a specific group.

Scope fields form a hierarchy: Channel → Conversation Type → Conversation ID → Thread ID. Each level is optional, but a Thread ID requires a Conversation ID.


Examples

Open Bot (Anyone Can Chat)

  1. Set ACL Default Effect to allow in the General tab.
  2. No rules needed — everyone is allowed by default.

Private Bot with Selected Users

  1. Set ACL Default Effect to deny.
  2. Add allow rules for each authorized channel identity.
  3. Only listed subjects (plus the bot owner and admins) can trigger the bot.

Open Bot with Blocked Users

  1. Set ACL Default Effect to allow.
  2. Add deny rules for problematic channel identities at the top of the list.
  3. Everyone except denied subjects can chat with the bot.

Platform-Specific Access

  1. Set ACL Default Effect to deny.
  2. Add an allow rule with subject type Channel Type set to telegram.
  3. Only Telegram users can chat with the bot — messages from other channels are denied.

Channel-Scoped Access

  1. Add an allow rule for a specific channel identity.
  2. Set the Source Scope channel to your Telegram channel config.
  3. The user can only chat with the bot via that specific Telegram channel.

Published under AGPLv3

+ \ No newline at end of file diff --git a/getting-started/bot.html b/getting-started/bot.html index b289cd1f..488a406b 100644 --- a/getting-started/bot.html +++ b/getting-started/bot.html @@ -6,21 +6,21 @@ Bot Management | Memoh Documentation - + - + - - - + + + -
Skip to content

Bot Management

A Bot is an independent AI agent that comes with its own isolated container, persistent memory, and configurable personality. Bots can chat via various messaging platforms (Channels) and perform complex tasks using specialized tools.

Creating a Bot

  1. Navigate to the Bots page from the sidebar.
  2. Click the Create Bot button.
  3. Fill in the basic info:
    • Display Name: The name users will see in chats.
    • Avatar: A URL for the bot's profile picture.
  4. Click Create.

Bot Detail Page

Once created, clicking on a bot card takes you to its Detail Page, where you can manage its entire lifecycle through specialized tabs.

Tab Overview

TabDescription
OverviewHealth checks for container, database, channels, and memory.
GeneralCore settings: models, providers, reasoning, heartbeat, compaction, and danger zone.
ContainerContainer lifecycle (create/start/stop), snapshots, data export/import.
MemoryBrowse, search, create, edit, and compact memories.
PlatformsChannel configurations (Telegram, Discord, Feishu, QQ, Matrix, WeCom, WeChat, Web).
AccessACL rules — control who can chat with the bot.
EmailEmail bindings and outbox.
TerminalInteractive terminal access to the bot's container.
FilesFile manager for the bot's container filesystem.
MCPMCP connection management (Stdio, Remote, OAuth).
HeartbeatHeartbeat configuration and execution logs.
CompactionMemory compaction logs.
ScheduleCron-based scheduled tasks and execution logs.
SkillsMarkdown-based skill files that define bot personality and capabilities.

Configuring the Bot's Core Settings

After creating a bot, the most important step is configuring its runtime settings. These define how the bot talks, remembers, searches, and uses browser automation.

  1. Navigate to your bot's Detail Page.
  2. Go to the General tab.
  3. Configure the core fields:
    • Chat Model: Used for standard conversations with users.
    • Memory Provider: Select the memory backend the bot should use.
    • Search Provider: Select the search engine provider for web search.
    • Browser Context: Select the browser profile the bot should use for browser automation.
  4. Click Save at the bottom of the form.

If you have not created these resources yet, set them up first:


General Tab Reference

The General tab contains all the core parameters that define your bot's behavior and runtime configuration.

FieldDescription
Chat ModelThe main LLM used for generating chat responses.
Memory ProviderThe memory backend assigned to the bot. The built-in provider can optionally define its own memory and embedding models.
Search ProviderThe search engine used for web browsing capabilities.
Browser ContextThe browser environment used for web automation, such as viewport, locale, and mobile behavior.
LanguageThe bot's primary communication language.
Reasoning EnabledIf the selected model supports reasoning (like OpenAI o1), enable this to use its deep thinking capabilities.
Reasoning EffortSet the level of reasoning effort (low, medium, high).
Heartbeat EnabledToggle periodic autonomous activity.
Heartbeat IntervalHow often (in minutes) the heartbeat triggers.
Heartbeat ModelThe LLM used for heartbeat tasks (can differ from the chat model).
Compaction EnabledToggle automatic memory compaction.
Compaction ModelThe LLM used for memory compaction.
ACL Default EffectDefault access control behavior (allow or deny) when no ACL rule matches.

Terminal Tab

The Terminal tab provides interactive shell access to the bot's container:

  • Open multiple terminal tabs simultaneously.
  • Execute commands directly inside the container.
  • Requires the container to be running.

Deleting a Bot

To permanently remove a bot and all its associated data (including container files and memory):

  1. Navigate to the General tab in the Bot Detail page.
  2. Scroll to the Danger Zone at the bottom.
  3. Click Delete Bot and confirm the action.

Warning: This action is irreversible. All persistent data for this bot will be lost.

Published under AGPLv3

- +
Skip to content

Bot Management

A Bot is an independent AI agent that comes with its own isolated container, persistent memory, and configurable personality. Bots can chat via various messaging platforms (Channels) and perform complex tasks using specialized tools.

Creating a Bot

  1. Navigate to the Bots page from the sidebar.
  2. Click the Create Bot button.
  3. Fill in the basic info:
    • Display Name: The name users will see in chats.
    • Avatar: A URL for the bot's profile picture.
  4. Click Create.

Bot Detail Page

Once created, clicking on a bot card takes you to its Detail Page, where you can manage its entire lifecycle through specialized tabs.

Tab Overview

TabDescription
OverviewHealth checks for container, database, channels, and memory.
GeneralCore settings: models, providers, reasoning, heartbeat, compaction, and danger zone.
ContainerContainer lifecycle (create/start/stop), snapshots, data export/import.
MemoryBrowse, search, create, edit, and compact memories.
PlatformsChannel configurations (Telegram, Discord, Feishu, QQ, Matrix, WeCom, WeChat, Web).
AccessACL rules — control who can chat with the bot.
EmailEmail bindings and outbox.
TerminalInteractive terminal access to the bot's container.
FilesFile manager for the bot's container filesystem.
MCPMCP connection management (Stdio, Remote, OAuth).
HeartbeatHeartbeat configuration and execution logs.
CompactionMemory compaction logs.
ScheduleCron-based scheduled tasks and execution logs.
SkillsMarkdown-based skill files that define bot personality and capabilities.

Configuring the Bot's Core Settings

After creating a bot, the most important step is configuring its runtime settings. These define how the bot talks, remembers, searches, and uses browser automation.

  1. Navigate to your bot's Detail Page.
  2. Go to the General tab.
  3. Configure the core fields:
    • Chat Model: Used for standard conversations with users.
    • Memory Provider: Select the memory backend the bot should use.
    • Search Provider: Select the search engine provider for web search.
    • Browser Context: Select the browser profile the bot should use for browser automation.
  4. Click Save at the bottom of the form.

If you have not created these resources yet, set them up first:


General Tab Reference

The General tab contains all the core parameters that define your bot's behavior and runtime configuration.

FieldDescription
Chat ModelThe main LLM used for generating chat responses.
Memory ProviderThe memory backend assigned to the bot. The built-in provider can optionally define its own memory and embedding models.
Search ProviderThe search engine used for web browsing capabilities.
Browser ContextThe browser environment used for web automation, such as viewport, locale, and mobile behavior.
LanguageThe bot's primary communication language.
Reasoning EnabledIf the selected model supports reasoning (like OpenAI o1), enable this to use its deep thinking capabilities.
Reasoning EffortSet the level of reasoning effort (low, medium, high).
Heartbeat EnabledToggle periodic autonomous activity.
Heartbeat IntervalHow often (in minutes) the heartbeat triggers.
Heartbeat ModelThe LLM used for heartbeat tasks (can differ from the chat model).
Compaction EnabledToggle automatic memory compaction.
Compaction ModelThe LLM used for memory compaction.
ACL Default EffectDefault access control behavior (allow or deny) when no ACL rule matches.

Terminal Tab

The Terminal tab provides interactive shell access to the bot's container:

  • Open multiple terminal tabs simultaneously.
  • Execute commands directly inside the container.
  • Requires the container to be running.

Deleting a Bot

To permanently remove a bot and all its associated data (including container files and memory):

  1. Navigate to the General tab in the Bot Detail page.
  2. Scroll to the Danger Zone at the bottom.
  3. Click Delete Bot and confirm the action.

Warning: This action is irreversible. All persistent data for this bot will be lost.

Published under AGPLv3

+ \ No newline at end of file diff --git a/getting-started/browser.html b/getting-started/browser.html index bfa36b75..2bff4385 100644 --- a/getting-started/browser.html +++ b/getting-started/browser.html @@ -6,21 +6,21 @@ Browser Contexts | Memoh Documentation - + - + - - - + + + -
Skip to content

Browser Contexts

Memoh can give a bot access to a headless browser through the Browser Gateway. A Browser Context stores the browser environment a bot should use, such as viewport size, locale, timezone, and mobile behavior.

Once a browser context is assigned to a bot, the bot can use browser tools to open pages, click elements, fill forms, capture screenshots, and inspect page content.


Concept: Browser Gateway

The Browser Gateway is powered by Playwright and provides browser automation for bots. In practice, a browser context acts like a reusable browser profile configuration for one or more bots.

Typical use cases include:

  • Navigating websites
  • Clicking buttons and links
  • Filling and submitting forms
  • Reading rendered page content
  • Capturing screenshots or PDFs

Creating a Browser Context

Manage contexts from the Browser Contexts page in the sidebar.

  1. Navigate to the Browser Contexts page.
  2. Click Add Browser Context.
  3. Fill in the following field:
    • Name: A display name for this browser context.
  4. Click Create.

Configuring a Browser Context

After creating a context, select it from the sidebar and update its settings.

FieldDescription
NameThe display name shown in the UI.
CoreBrowser engine: chromium (default) or firefox.
Viewport WidthBrowser viewport width in pixels.
Viewport HeightBrowser viewport height in pixels.
User AgentOptional custom browser user agent string.
Device Scale FactorOptional device pixel ratio.
LocaleOptional locale such as en-US or zh-CN.
Timezone IDOptional timezone such as UTC or Asia/Shanghai.
Is MobileEnables mobile-style browser behavior.
Ignore HTTPS ErrorsAllows navigation to sites with invalid HTTPS certificates.

Managing Contexts

  • Edit: Select a context and update its configuration.
  • Delete: Remove a context you no longer use.

Assigning a Browser Context to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Browser Context dropdown.
  4. Select the context you created.
  5. Click Save.

After saving, the bot can use that browser context when browser tools are invoked.


Bot Interaction

When a browser context is configured, the bot can use built-in browser tools such as:

  • browser_action: perform actions like navigation, click, fill, select, scroll, tab management, screenshot, or PDF export
  • browser_observe: inspect the current page and gather information for the model

This lets the bot interact with real websites instead of relying only on static HTML or search results.


Browser Core Selection

Memoh's browser image can include Chromium, Firefox, or both. The available cores are determined at build time by the BROWSER_CORES build argument.

The install script prompts for browser core selection during setup. To rebuild manually with specific cores:

bash
BROWSER_CORES=chromium docker compose --profile browser build browser

Valid values for BROWSER_CORES: chromium, firefox, chromium,firefox (default).


Next Steps

Published under AGPLv3

- +
Skip to content

Browser Contexts

Memoh can give a bot access to a headless browser through the Browser Gateway. A Browser Context stores the browser environment a bot should use, such as viewport size, locale, timezone, and mobile behavior.

Once a browser context is assigned to a bot, the bot can use browser tools to open pages, click elements, fill forms, capture screenshots, and inspect page content.


Concept: Browser Gateway

The Browser Gateway is powered by Playwright and provides browser automation for bots. In practice, a browser context acts like a reusable browser profile configuration for one or more bots.

Typical use cases include:

  • Navigating websites
  • Clicking buttons and links
  • Filling and submitting forms
  • Reading rendered page content
  • Capturing screenshots or PDFs

Creating a Browser Context

Manage contexts from the Browser Contexts page in the sidebar.

  1. Navigate to the Browser Contexts page.
  2. Click Add Browser Context.
  3. Fill in the following field:
    • Name: A display name for this browser context.
  4. Click Create.

Configuring a Browser Context

After creating a context, select it from the sidebar and update its settings.

FieldDescription
NameThe display name shown in the UI.
CoreBrowser engine: chromium (default) or firefox.
Viewport WidthBrowser viewport width in pixels.
Viewport HeightBrowser viewport height in pixels.
User AgentOptional custom browser user agent string.
Device Scale FactorOptional device pixel ratio.
LocaleOptional locale such as en-US or zh-CN.
Timezone IDOptional timezone such as UTC or Asia/Shanghai.
Is MobileEnables mobile-style browser behavior.
Ignore HTTPS ErrorsAllows navigation to sites with invalid HTTPS certificates.

Managing Contexts

  • Edit: Select a context and update its configuration.
  • Delete: Remove a context you no longer use.

Assigning a Browser Context to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Browser Context dropdown.
  4. Select the context you created.
  5. Click Save.

After saving, the bot can use that browser context when browser tools are invoked.


Bot Interaction

When a browser context is configured, the bot can use built-in browser tools such as:

  • browser_action: perform actions like navigation, click, fill, select, scroll, tab management, screenshot, or PDF export
  • browser_observe: inspect the current page and gather information for the model

This lets the bot interact with real websites instead of relying only on static HTML or search results.


Browser Core Selection

Memoh's browser image can include Chromium, Firefox, or both. The available cores are determined at build time by the BROWSER_CORES build argument.

The install script prompts for browser core selection during setup. To rebuild manually with specific cores:

bash
BROWSER_CORES=chromium docker compose --profile browser build browser

Valid values for BROWSER_CORES: chromium, firefox, chromium,firefox (default).


Next Steps

Published under AGPLv3

+ \ No newline at end of file diff --git a/getting-started/channels.html b/getting-started/channels.html index f00f8fe7..f5bac4d3 100644 --- a/getting-started/channels.html +++ b/getting-started/channels.html @@ -6,21 +6,21 @@ Bot Channels | Memoh Documentation - + - + - - - + + + -
Skip to content

Bot Channels

Channels connect your Bot to various messaging platforms, allowing you to interact with it using your favorite chat applications.

Concept: Unified Communication

Memoh acts as a hub that bridges different messaging services. You can configure multiple channels for a single bot, enabling it to chat on Telegram, Discord, Matrix, and more simultaneously.


Supported Channels

Configure your bot's connections from the Platforms tab in the Bot Detail page.

Platform Guides

For detailed step-by-step guides on how to create and configure bots for each platform, see:


Configuration Flow

1. Adding a Channel

  1. Click Add Channel.
  2. Select the platform from the list.
  3. Fill in the required credentials and configuration. The fields are dynamic and change based on the selected channel.

2. Common Fields

FieldDescription
CredentialsAPI tokens, secrets, or bot keys provided by the platform.
DisabledQuickly enable or disable a channel without removing its configuration.
RoutingConfigure how messages are mapped between the platform and Memoh.

3. Special Case: Feishu Webhook

If using Feishu in webhook inbound mode:

  1. Memoh will generate a Webhook Callback URL.
  2. Copy this URL and paste it into your Feishu App's event configuration.
  3. This allows Feishu to send messages directly to Memoh.

4. Special Case: WeChat QR Code

If using WeChat:

  1. After enabling the channel, a QR code flow is provided for connecting.
  2. Scan the QR code with WeChat to link the bot.

Operations

  • Save: Update the configuration.
  • Save and Enable: Update and immediately activate the channel.
  • Enable/Disable Toggle: Switch the channel's active status.
  • Delete: Permanently remove a channel's configuration.

Published under AGPLv3

- +
Skip to content

Bot Channels

Channels connect your Bot to various messaging platforms, allowing you to interact with it using your favorite chat applications.

Concept: Unified Communication

Memoh acts as a hub that bridges different messaging services. You can configure multiple channels for a single bot, enabling it to chat on Telegram, Discord, Matrix, and more simultaneously.


Supported Channels

Configure your bot's connections from the Platforms tab in the Bot Detail page.

Platform Guides

For detailed step-by-step guides on how to create and configure bots for each platform, see:


Configuration Flow

1. Adding a Channel

  1. Click Add Channel.
  2. Select the platform from the list.
  3. Fill in the required credentials and configuration. The fields are dynamic and change based on the selected channel.

2. Common Fields

FieldDescription
CredentialsAPI tokens, secrets, or bot keys provided by the platform.
DisabledQuickly enable or disable a channel without removing its configuration.
RoutingConfigure how messages are mapped between the platform and Memoh.

3. Special Case: Feishu Webhook

If using Feishu in webhook inbound mode:

  1. Memoh will generate a Webhook Callback URL.
  2. Copy this URL and paste it into your Feishu App's event configuration.
  3. This allows Feishu to send messages directly to Memoh.

4. Special Case: WeChat QR Code

If using WeChat:

  1. After enabling the channel, a QR code flow is provided for connecting.
  2. Scan the QR code with WeChat to link the bot.

Operations

  • Save: Update the configuration.
  • Save and Enable: Update and immediately activate the channel.
  • Enable/Disable Toggle: Switch the channel's active status.
  • Delete: Permanently remove a channel's configuration.

Published under AGPLv3

+ \ No newline at end of file diff --git a/getting-started/compaction.html b/getting-started/compaction.html index 04a749c1..17c7dfb1 100644 --- a/getting-started/compaction.html +++ b/getting-started/compaction.html @@ -6,21 +6,21 @@ Memory Compaction | Memoh Documentation - + - + - - - + + + -
Skip to content

Memory Compaction

As a bot accumulates memories over time, the memory pool can grow large and contain redundant or outdated entries. Memory Compaction is an automated process that consolidates and optimizes the bot's memory store, keeping the most relevant information while reducing noise.


Concept: Why Compact?

Each conversation turn can generate new memory entries. Over weeks or months of use, thousands of memories accumulate. Many of these may overlap, become stale, or lose relevance. Compaction addresses this by:

  • Merging redundant memories — Combining entries that express the same information.
  • Removing outdated entries — Discarding memories that are no longer accurate.
  • Reducing retrieval noise — Fewer, higher-quality memories lead to better search results during chat.

Configuration

Configure compaction from the General tab in the Bot Detail page.

FieldDescription
Compaction EnabledToggle automatic memory compaction on or off.
Compaction ModelThe LLM used to evaluate and merge memories during compaction. This can be different from the chat model.

When enabled, compaction runs periodically as part of the bot's memory maintenance cycle.


Manual Compaction

You can also trigger compaction manually from the bot's Memory tab:

  1. Navigate to the Memory tab in the Bot Detail page.
  2. Click Compact.
  3. Configure the compaction parameters:
    • Ratio — The compression ratio (e.g., 0.8, 0.5, 0.3). Lower values mean more aggressive compaction.
    • Decay Days — Optionally restrict compaction to memories older than a specified number of days.
  4. Click Start Compaction.

Compaction Logs

The Compaction tab in the Bot Detail page provides an audit trail of all compaction runs:

  • Status — Whether the compaction completed successfully, encountered an issue, or failed.
  • Time — When the compaction was triggered.
  • Duration — How long the compaction took.
  • Result — A summary of what was compacted (memories merged, removed, etc.).

Managing Logs

  • Refresh — Reload the log list.
  • Clear Logs — Remove old compaction records.

Relationship to Memory

Compaction works with whatever Memory Provider is assigned to the bot. The compaction process:

  1. Reads all existing memories from the provider.
  2. Uses the configured Compaction Model to evaluate which memories are redundant or stale.
  3. Merges, updates, or removes entries as needed.
  4. Writes the optimized memory set back to the provider.

This process preserves the semantic content of important memories while reducing the total count. After compaction, the bot's memory retrieval becomes faster and more focused.


Next Steps

Published under AGPLv3

- +
Skip to content

Memory Compaction

As a bot accumulates memories over time, the memory pool can grow large and contain redundant or outdated entries. Memory Compaction is an automated process that consolidates and optimizes the bot's memory store, keeping the most relevant information while reducing noise.


Concept: Why Compact?

Each conversation turn can generate new memory entries. Over weeks or months of use, thousands of memories accumulate. Many of these may overlap, become stale, or lose relevance. Compaction addresses this by:

  • Merging redundant memories — Combining entries that express the same information.
  • Removing outdated entries — Discarding memories that are no longer accurate.
  • Reducing retrieval noise — Fewer, higher-quality memories lead to better search results during chat.

Configuration

Configure compaction from the General tab in the Bot Detail page.

FieldDescription
Compaction EnabledToggle automatic memory compaction on or off.
Compaction ModelThe LLM used to evaluate and merge memories during compaction. This can be different from the chat model.

When enabled, compaction runs periodically as part of the bot's memory maintenance cycle.


Manual Compaction

You can also trigger compaction manually from the bot's Memory tab:

  1. Navigate to the Memory tab in the Bot Detail page.
  2. Click Compact.
  3. Configure the compaction parameters:
    • Ratio — The compression ratio (e.g., 0.8, 0.5, 0.3). Lower values mean more aggressive compaction.
    • Decay Days — Optionally restrict compaction to memories older than a specified number of days.
  4. Click Start Compaction.

Compaction Logs

The Compaction tab in the Bot Detail page provides an audit trail of all compaction runs:

  • Status — Whether the compaction completed successfully, encountered an issue, or failed.
  • Time — When the compaction was triggered.
  • Duration — How long the compaction took.
  • Result — A summary of what was compacted (memories merged, removed, etc.).

Managing Logs

  • Refresh — Reload the log list.
  • Clear Logs — Remove old compaction records.

Relationship to Memory

Compaction works with whatever Memory Provider is assigned to the bot. The compaction process:

  1. Reads all existing memories from the provider.
  2. Uses the configured Compaction Model to evaluate which memories are redundant or stale.
  3. Merges, updates, or removes entries as needed.
  4. Writes the optimized memory set back to the provider.

This process preserves the semantic content of important memories while reducing the total count. After compaction, the bot's memory retrieval becomes faster and more focused.


Next Steps

Published under AGPLv3

+ \ No newline at end of file diff --git a/getting-started/container.html b/getting-started/container.html index 5bb65f5d..c31db82c 100644 --- a/getting-started/container.html +++ b/getting-started/container.html @@ -6,21 +6,21 @@ Bot Container Management | Memoh Documentation - + - + - - - + + + -
Skip to content

Bot Container Management

Every Bot in Memoh operates within its own isolated container environment. This isolation ensures security, provides a dedicated filesystem, and allows the bot to execute code or commands without affecting other bots or the host system.

Concept: The Isolated Workspace

The container acts as the bot's private "computer." Within it, the bot can:

  • Store and modify files
  • Install software via package managers
  • Execute scripts
  • Maintain state across multiple sessions

Operations

Manage the lifecycle of your bot's environment from the Container tab in the Bot Detail page.

Lifecycle Actions

  • Create: Initialize the container if it doesn't exist (using the configured image). Progress is shown via real-time SSE feedback during image pull and creation.
  • Start: Launch the container. The bot must have a running container to perform many operations like file editing or executing tools.
  • Stop: Gracefully shut down the container to save resources.
  • Delete: Remove the container instance.

Container Information

The Container tab displays real-time data about the bot's runtime:

  • Container ID: Unique identifier for the instance.
  • Status: Whether it's currently running, stopped, or creating.
  • Image: The Docker/Containerd image used as the base.
  • Paths: Host and container paths for data persistence.
  • Tasks: Number of active background tasks running in the container.

Snapshots

Snapshots allow you to capture the current state of the bot's container and restore it later. This is useful for:

  • Saving a known good configuration
  • Versioning the bot's environment
  • Testing complex changes safely

Creating a Snapshot

  1. Ensure the container is stopped or in a stable state.
  2. Click Create Snapshot.
  3. Provide a name for the snapshot.

Restoring a Snapshot

  • Find the desired snapshot in the list and click Restore. This will reset the container to the captured state.

Managing Snapshots

  • View a list of existing snapshots with their creation timestamps and parent relationships.
  • Use the Delete button next to a snapshot to remove it.

Data Export and Import

The Container tab supports exporting and importing container data for backup, migration, or sharing purposes.

Export

  1. Click Export Data.
  2. The container's filesystem data is packaged into a downloadable archive.
  3. Save the archive to your local machine.

Import

  1. Click Import Data.
  2. Select an archive file from your local machine.
  3. The archive contents are extracted into the container's filesystem.

Restore

The Restore operation resets the container's data directory to a clean state. This is useful when the filesystem has become corrupted or you want to start fresh without recreating the container.


Container Versioning

Memoh tracks container versions to manage the lifecycle of the bot's runtime environment. Version information includes:

  • Current Version: The active container version.
  • Version History: A log of container version changes over time.

This helps with auditing and understanding when container configurations were updated.

Published under AGPLv3

- +
Skip to content

Bot Container Management

Every Bot in Memoh operates within its own isolated container environment. This isolation ensures security, provides a dedicated filesystem, and allows the bot to execute code or commands without affecting other bots or the host system.

Concept: The Isolated Workspace

The container acts as the bot's private "computer." Within it, the bot can:

  • Store and modify files
  • Install software via package managers
  • Execute scripts
  • Maintain state across multiple sessions

Operations

Manage the lifecycle of your bot's environment from the Container tab in the Bot Detail page.

Lifecycle Actions

  • Create: Initialize the container if it doesn't exist (using the configured image). Progress is shown via real-time SSE feedback during image pull and creation.
  • Start: Launch the container. The bot must have a running container to perform many operations like file editing or executing tools.
  • Stop: Gracefully shut down the container to save resources.
  • Delete: Remove the container instance.

Container Information

The Container tab displays real-time data about the bot's runtime:

  • Container ID: Unique identifier for the instance.
  • Status: Whether it's currently running, stopped, or creating.
  • Image: The Docker/Containerd image used as the base.
  • Paths: Host and container paths for data persistence.
  • Tasks: Number of active background tasks running in the container.

Snapshots

Snapshots allow you to capture the current state of the bot's container and restore it later. This is useful for:

  • Saving a known good configuration
  • Versioning the bot's environment
  • Testing complex changes safely

Creating a Snapshot

  1. Ensure the container is stopped or in a stable state.
  2. Click Create Snapshot.
  3. Provide a name for the snapshot.

Restoring a Snapshot

  • Find the desired snapshot in the list and click Restore. This will reset the container to the captured state.

Managing Snapshots

  • View a list of existing snapshots with their creation timestamps and parent relationships.
  • Use the Delete button next to a snapshot to remove it.

Data Export and Import

The Container tab supports exporting and importing container data for backup, migration, or sharing purposes.

Export

  1. Click Export Data.
  2. The container's filesystem data is packaged into a downloadable archive.
  3. Save the archive to your local machine.

Import

  1. Click Import Data.
  2. Select an archive file from your local machine.
  3. The archive contents are extracted into the container's filesystem.

Restore

The Restore operation resets the container's data directory to a clean state. This is useful when the filesystem has become corrupted or you want to start fresh without recreating the container.


Container Versioning

Memoh tracks container versions to manage the lifecycle of the bot's runtime environment. Version information includes:

  • Current Version: The active container version.
  • Version History: A log of container version changes over time.

This helps with auditing and understanding when container configurations were updated.

Published under AGPLv3

+ \ No newline at end of file diff --git a/getting-started/email.html b/getting-started/email.html index 79b33793..cf809c54 100644 --- a/getting-started/email.html +++ b/getting-started/email.html @@ -6,21 +6,21 @@ Email Providers and Bindings | Memoh Documentation - + - + - - - + + + -
Skip to content

Email Providers and Bindings

Memoh allows your Bot to send and receive emails, providing another powerful channel for communication and task management.

Concept: Email as a Bot Channel

Connecting email to your Bot involves two steps:

  1. Email Provider: Configure a connection to an email service (like Mailgun or a generic SMTP server).
  2. Email Binding: Link a specific email address from a provider to a Bot.

Email Provider

Manage your email service connections from the Email Provider page in the sidebar.

Creating a Provider

  1. Navigate to the Email Provider page from the sidebar.
  2. Click Add Email Provider.
  3. Choose the provider type:
    • Mailgun: For high-volume delivery.
    • Generic SMTP: For traditional email servers.
  4. Fill in the required fields (e.g., domain, api_key, host, port, username, password).
  5. Click Create.

Bot Email Bindings

Configure your bot's email capabilities from the Email tab in the Bot Detail page.

Adding a Binding

  1. Click Add Binding.
  2. Select the Email Provider you created.
  3. Provide the Email Address to be associated with the bot.
  4. Set the bot's permissions:
    • Can Read: If enabled, the bot can check and process incoming emails.
    • Can Write: If enabled, the bot can compose and send outgoing emails.
    • Can Delete: If enabled, the bot can manage its own email inbox.
  5. Click Create.

Outbox and History

The Email tab also provides an Outbox showing an audit log of all emails sent by the bot:

  • To: The recipient's email address.
  • Subject: The email's subject line.
  • Status: Whether the email was sent successfully.
  • Sent At: The timestamp of the email delivery.

Bot Interaction

  • The bot can use its email permissions to send reports, respond to user inquiries, or trigger actions based on incoming mail.
  • Outgoing emails are tracked in the outbox for monitoring and troubleshooting.
  • The bot handles email in a structured way, allowing it to "converse" via email just as it does via chat.

Published under AGPLv3

- +
Skip to content

Email Providers and Bindings

Memoh allows your Bot to send and receive emails, providing another powerful channel for communication and task management.

Concept: Email as a Bot Channel

Connecting email to your Bot involves two steps:

  1. Email Provider: Configure a connection to an email service (like Mailgun or a generic SMTP server).
  2. Email Binding: Link a specific email address from a provider to a Bot.

Email Provider

Manage your email service connections from the Email Provider page in the sidebar.

Creating a Provider

  1. Navigate to the Email Provider page from the sidebar.
  2. Click Add Email Provider.
  3. Choose the provider type:
    • Mailgun: For high-volume delivery.
    • Generic SMTP: For traditional email servers.
  4. Fill in the required fields (e.g., domain, api_key, host, port, username, password).
  5. Click Create.

Bot Email Bindings

Configure your bot's email capabilities from the Email tab in the Bot Detail page.

Adding a Binding

  1. Click Add Binding.
  2. Select the Email Provider you created.
  3. Provide the Email Address to be associated with the bot.
  4. Set the bot's permissions:
    • Can Read: If enabled, the bot can check and process incoming emails.
    • Can Write: If enabled, the bot can compose and send outgoing emails.
    • Can Delete: If enabled, the bot can manage its own email inbox.
  5. Click Create.

Outbox and History

The Email tab also provides an Outbox showing an audit log of all emails sent by the bot:

  • To: The recipient's email address.
  • Subject: The email's subject line.
  • Status: Whether the email was sent successfully.
  • Sent At: The timestamp of the email delivery.

Bot Interaction

  • The bot can use its email permissions to send reports, respond to user inquiries, or trigger actions based on incoming mail.
  • Outgoing emails are tracked in the outbox for monitoring and troubleshooting.
  • The bot handles email in a structured way, allowing it to "converse" via email just as it does via chat.

Published under AGPLv3

+ \ No newline at end of file diff --git a/getting-started/files.html b/getting-started/files.html index 7ff81273..a129945c 100644 --- a/getting-started/files.html +++ b/getting-started/files.html @@ -6,21 +6,21 @@ Bot Files Management | Memoh Documentation - + - + - - - + + + -
Skip to content

Bot Files Management

Every Memoh Bot has its own dedicated filesystem inside its isolated container. You can manage this filesystem directly from the Files tab in the Bot Detail page.


Operations

The FileManager component provides a familiar file-browsing experience with a toolbar, directory tree, and integrated editor.

Browsing and Navigation

  • Breadcrumb Navigation: Quickly move between parent directories.
  • Refresh: Reload the file list to see the latest changes (e.g., files created by the bot).
  • New Folder: Create a directory within the current path.

Managing Files

  • Upload: Select files from your local computer to transfer them into the bot's container.
  • Rename: Click on a file or folder and use the rename action to update its identifier.
  • Delete: Remove files or folders (with recursive support for directories).
  • Download: Retrieve a file from the bot's container back to your local machine.

Viewing and Editing

The integrated FileViewer allows you to interact with the bot's files without leaving the web UI.

Text Files

  • Read/Edit: Click a text file (e.g., .md, .js, .py, .toml) to open it in the built-in Monaco Editor.
  • Syntax Highlighting: Supports common programming languages and configuration formats.
  • Save: Modify the file's content and click Save to apply the changes to the bot's filesystem.

Images

  • Preview: Click an image file (e.g., .png, .jpg, .webp) to see a visual preview directly in the file manager.

Bot Interaction with Files

Remember that the bot itself can also perform these operations:

  • Use its Skills or MCP tools to read, write, and manage its own files.
  • The Files tab is your portal to monitor and manually intervene in the bot's workspace.

Published under AGPLv3

- +
Skip to content

Bot Files Management

Every Memoh Bot has its own dedicated filesystem inside its isolated container. You can manage this filesystem directly from the Files tab in the Bot Detail page.


Operations

The FileManager component provides a familiar file-browsing experience with a toolbar, directory tree, and integrated editor.

Browsing and Navigation

  • Breadcrumb Navigation: Quickly move between parent directories.
  • Refresh: Reload the file list to see the latest changes (e.g., files created by the bot).
  • New Folder: Create a directory within the current path.

Managing Files

  • Upload: Select files from your local computer to transfer them into the bot's container.
  • Rename: Click on a file or folder and use the rename action to update its identifier.
  • Delete: Remove files or folders (with recursive support for directories).
  • Download: Retrieve a file from the bot's container back to your local machine.

Viewing and Editing

The integrated FileViewer allows you to interact with the bot's files without leaving the web UI.

Text Files

  • Read/Edit: Click a text file (e.g., .md, .js, .py, .toml) to open it in the built-in Monaco Editor.
  • Syntax Highlighting: Supports common programming languages and configuration formats.
  • Save: Modify the file's content and click Save to apply the changes to the bot's filesystem.

Images

  • Preview: Click an image file (e.g., .png, .jpg, .webp) to see a visual preview directly in the file manager.

Bot Interaction with Files

Remember that the bot itself can also perform these operations:

  • Use its Skills or MCP tools to read, write, and manage its own files.
  • The Files tab is your portal to monitor and manually intervene in the bot's workspace.

Published under AGPLv3

+ \ No newline at end of file diff --git a/getting-started/heartbeat.html b/getting-started/heartbeat.html index daa6285e..8c1d7220 100644 --- a/getting-started/heartbeat.html +++ b/getting-started/heartbeat.html @@ -6,21 +6,21 @@ Bot Heartbeat | Memoh Documentation - + - + - - - + + + -
Skip to content

Bot Heartbeat

The Heartbeat feature allows you to schedule periodic tasks for your Bot, enabling it to perform autonomous actions even when you aren't chatting with it.

Concept: Scheduled Autonomy

A Heartbeat is a recurring trigger that prompts the bot to "think" and execute its skills or tools at a set interval. This is useful for:

  • Periodic status checks
  • Automatic data collection
  • Cleaning up the filesystem
  • Sending scheduled notifications

Configuration

Configure the heartbeat from the Heartbeat tab in the Bot Detail page.

FieldDescription
EnabledToggle the heartbeat on or off.
IntervalHow often (in minutes) the heartbeat should trigger. The default is 30 minutes.
ModelThe LLM used to execute the heartbeat task. This can be different from the main chat model.

Logs and Monitoring

The Heartbeat tab provides a detailed audit log of every execution:

  • Status: Whether the heartbeat completed successfully (ok), encountered an issue (alert), or failed (error).
  • Time: When the heartbeat was triggered.
  • Duration: How long the bot took to process the task.
  • Result: A summary of the bot's action or response during that heartbeat.

Managing Logs

  • Filter by Status: Quickly find errors or alerts.
  • Refresh: Load the latest log entries.
  • Clear Logs: Remove old heartbeat records to keep the interface clean.
  • Load More: View older history.

Bot Interaction

  • During a heartbeat, the bot receives a special system prompt that it should perform its "routine" tasks.
  • The bot can use any of its assigned Skills or MCP tools during a heartbeat.
  • Heartbeat logs provide the "memory" of the bot's autonomous activities.

Published under AGPLv3

- +
Skip to content

Bot Heartbeat

The Heartbeat feature allows you to schedule periodic tasks for your Bot, enabling it to perform autonomous actions even when you aren't chatting with it.

Concept: Scheduled Autonomy

A Heartbeat is a recurring trigger that prompts the bot to "think" and execute its skills or tools at a set interval. This is useful for:

  • Periodic status checks
  • Automatic data collection
  • Cleaning up the filesystem
  • Sending scheduled notifications

Configuration

Configure the heartbeat from the Heartbeat tab in the Bot Detail page.

FieldDescription
EnabledToggle the heartbeat on or off.
IntervalHow often (in minutes) the heartbeat should trigger. The default is 30 minutes.
ModelThe LLM used to execute the heartbeat task. This can be different from the main chat model.

Logs and Monitoring

The Heartbeat tab provides a detailed audit log of every execution:

  • Status: Whether the heartbeat completed successfully (ok), encountered an issue (alert), or failed (error).
  • Time: When the heartbeat was triggered.
  • Duration: How long the bot took to process the task.
  • Result: A summary of the bot's action or response during that heartbeat.

Managing Logs

  • Filter by Status: Quickly find errors or alerts.
  • Refresh: Load the latest log entries.
  • Clear Logs: Remove old heartbeat records to keep the interface clean.
  • Load More: View older history.

Bot Interaction

  • During a heartbeat, the bot receives a special system prompt that it should perform its "routine" tasks.
  • The bot can use any of its assigned Skills or MCP tools during a heartbeat.
  • Heartbeat logs provide the "memory" of the bot's autonomous activities.

Published under AGPLv3

+ \ No newline at end of file diff --git a/getting-started/mcp.html b/getting-started/mcp.html index 59eb24c1..fdb9f56d 100644 --- a/getting-started/mcp.html +++ b/getting-started/mcp.html @@ -6,21 +6,21 @@ MCP Connections | Memoh Documentation - + - + - - - + + + -
Skip to content

MCP Connections

Memoh fully supports the Model Context Protocol (MCP), allowing you to connect your Bot to external tool services and context providers.

Concept: Extending Bot Capabilities

MCP provides a standardized way for bots to access external data sources and tools. Each Bot can have its own independent set of MCP connections.


Connection Types

Configure MCP connections from the MCP tab in the Bot Detail page.

1. Stdio (Local Process)

This type of connection executes a local command inside the bot's container and communicates via standard input/output.

FieldDescription
CommandThe executable to run (e.g., npx, python3).
ArgumentsA list of command-line arguments (e.g., -y, @modelcontextprotocol/server-filesystem, /opt/memoh/data).
EnvKey-value pairs for environment variables.
CWDWorking directory for the process.

2. Remote (HTTP/SSE)

This type of connection connects to a remote MCP server over the network.

FieldDescription
URLThe endpoint of the remote MCP server.
HeadersCustom HTTP headers (e.g., for authentication).
TransportChoose between http or sse (Server-Sent Events).

OAuth Authentication

Some MCP servers require OAuth-based authentication. Memoh supports the full MCP OAuth flow:

  1. Click the OAuth button on a connection that requires authentication.
  2. Memoh will discover the server's OAuth configuration automatically.
  3. Click Authorize to open the provider's authorization page.
  4. After granting access, you are redirected back to Memoh.
  5. The token is exchanged and stored securely for the connection.

You can also:

  • Check status — View the current OAuth token status.
  • Revoke — Remove the stored OAuth token.

Operations

  • Add Connection: Click Add, choose the type, and fill in the configuration.
  • Import JSON: Use the Import button to quickly add multiple connections from a standard mcpServers JSON config file.
  • Export: Export connection configurations to a JSON file for backup or sharing.
  • Toggle Active: Enable or disable specific connections without deleting them.
  • Search: Quickly find a connection by name or ID.
  • Batch Delete: Select multiple connections and delete them at once.

Tool Discovery

Once an MCP connection is active, Memoh automatically discovers the tools exposed by the server. You can:

  1. Click on a connection to view its details.
  2. The Tools section lists all available tools with their names and descriptions.
  3. The bot will use these tools automatically during conversations when relevant.

You can also use the Probe button to manually refresh the tool list from the server.


Bot Interaction

Once an MCP connection is active, the bot will automatically:

  • Discover the tools and resources exposed by the MCP server.
  • Use these tools to perform tasks requested by the user.
  • Include the context provided by the MCP server in its reasoning process.

Published under AGPLv3

- +
Skip to content

MCP Connections

Memoh fully supports the Model Context Protocol (MCP), allowing you to connect your Bot to external tool services and context providers.

Concept: Extending Bot Capabilities

MCP provides a standardized way for bots to access external data sources and tools. Each Bot can have its own independent set of MCP connections.


Connection Types

Configure MCP connections from the MCP tab in the Bot Detail page.

1. Stdio (Local Process)

This type of connection executes a local command inside the bot's container and communicates via standard input/output.

FieldDescription
CommandThe executable to run (e.g., npx, python3).
ArgumentsA list of command-line arguments (e.g., -y, @modelcontextprotocol/server-filesystem, /opt/memoh/data).
EnvKey-value pairs for environment variables.
CWDWorking directory for the process.

2. Remote (HTTP/SSE)

This type of connection connects to a remote MCP server over the network.

FieldDescription
URLThe endpoint of the remote MCP server.
HeadersCustom HTTP headers (e.g., for authentication).
TransportChoose between http or sse (Server-Sent Events).

OAuth Authentication

Some MCP servers require OAuth-based authentication. Memoh supports the full MCP OAuth flow:

  1. Click the OAuth button on a connection that requires authentication.
  2. Memoh will discover the server's OAuth configuration automatically.
  3. Click Authorize to open the provider's authorization page.
  4. After granting access, you are redirected back to Memoh.
  5. The token is exchanged and stored securely for the connection.

You can also:

  • Check status — View the current OAuth token status.
  • Revoke — Remove the stored OAuth token.

Operations

  • Add Connection: Click Add, choose the type, and fill in the configuration.
  • Import JSON: Use the Import button to quickly add multiple connections from a standard mcpServers JSON config file.
  • Export: Export connection configurations to a JSON file for backup or sharing.
  • Toggle Active: Enable or disable specific connections without deleting them.
  • Search: Quickly find a connection by name or ID.
  • Batch Delete: Select multiple connections and delete them at once.

Tool Discovery

Once an MCP connection is active, Memoh automatically discovers the tools exposed by the server. You can:

  1. Click on a connection to view its details.
  2. The Tools section lists all available tools with their names and descriptions.
  3. The bot will use these tools automatically during conversations when relevant.

You can also use the Probe button to manually refresh the tool list from the server.


Bot Interaction

Once an MCP connection is active, the bot will automatically:

  • Discover the tools and resources exposed by the MCP server.
  • Use these tools to perform tasks requested by the user.
  • Include the context provided by the MCP server in its reasoning process.

Published under AGPLv3

+ \ No newline at end of file diff --git a/getting-started/memory.html b/getting-started/memory.html index 0c67351f..3396fd10 100644 --- a/getting-started/memory.html +++ b/getting-started/memory.html @@ -6,21 +6,21 @@ Bot Memory Management | Memoh Documentation - + - + - - - + + + -
Skip to content

Bot Memory Management

Memoh's structured long-term memory system allows bots to remember information across multiple conversations, providing contextually relevant and personalized interactions.

Prerequisites

Before using the Memory tab, make sure your bot already has a Memory Provider configured.

  1. Create a provider from one of the Memory Providers (Built-in, Mem0, or OpenViking).
  2. Open your bot's General tab.
  3. Select the provider in the Memory Provider field.
  4. Click Save.

Without a memory provider, the bot will not have an active memory backend configuration.


Concept: Memory Retrieval

Memories are stored and retrieved through the assigned memory provider. Depending on the provider type and mode, retrieval may use file-based indexing, sparse vectors, dense embeddings, or an external API. When a user sends a message, Memoh finds the most relevant memories and includes them in the bot's runtime context.


Operations

Manage your bot's memories from the Memory tab in the Bot Detail page.

1. Creating Memories

  • New Memory: Manually enter a memory's content in the provided textarea.
  • From Conversation: Select specific messages from the bot's conversation history to extract into memory.

2. Searching and Managing

  • Search: Filter memories by ID or text content.
  • Edit: Modify existing memory entries directly in the list.
  • Delete: Remove memories that are no longer needed.

Memory Compression (Compact)

Over time, memories can accumulate and become redundant. The Compact feature helps optimize the memory pool.

  • Ratio: Set the compression ratio (for example 0.8, 0.5, or 0.3) to determine how much information is retained.
  • Decay Days: Optionally specify a time window to compact only memories older than a certain number of days.

For more details on compaction, see Memory Compaction.


Rebuild

The Rebuild feature re-indexes all memories from scratch. This is useful when:

  • You have changed the memory provider's mode (e.g., switching from off to sparse).
  • The vector index has become inconsistent.
  • You want to re-process all memories with updated settings.

Click Rebuild in the Memory tab to start the process. You can monitor the rebuild status in real-time.


Status

The Memory tab shows the current status of the memory provider for this bot:

  • Connected — The memory backend is reachable and operational.
  • Error — There is an issue with the memory provider configuration or connectivity.

Use the status indicator to quickly verify that the memory system is working before troubleshooting other issues.


Usage Statistics

The Memory tab displays storage usage information:

  • Total Memories — The number of memory entries stored for this bot.
  • Index Status — Whether the vector index is up-to-date.

Bot Interaction

  • The bot automatically searches and retrieves memories during chat.
  • The assigned Memory Provider controls the memory backend used by the bot.
  • Provider-specific settings (such as memory mode, embedding model, or API keys) are configured in the provider itself — see Memory Providers.
  • Memories provide the long-term knowledge that makes each bot unique to its owner.

Published under AGPLv3

- +
Skip to content

Bot Memory Management

Memoh's structured long-term memory system allows bots to remember information across multiple conversations, providing contextually relevant and personalized interactions.

Prerequisites

Before using the Memory tab, make sure your bot already has a Memory Provider configured.

  1. Create a provider from one of the Memory Providers (Built-in, Mem0, or OpenViking).
  2. Open your bot's General tab.
  3. Select the provider in the Memory Provider field.
  4. Click Save.

Without a memory provider, the bot will not have an active memory backend configuration.


Concept: Memory Retrieval

Memories are stored and retrieved through the assigned memory provider. Depending on the provider type and mode, retrieval may use file-based indexing, sparse vectors, dense embeddings, or an external API. When a user sends a message, Memoh finds the most relevant memories and includes them in the bot's runtime context.


Operations

Manage your bot's memories from the Memory tab in the Bot Detail page.

1. Creating Memories

  • New Memory: Manually enter a memory's content in the provided textarea.
  • From Conversation: Select specific messages from the bot's conversation history to extract into memory.

2. Searching and Managing

  • Search: Filter memories by ID or text content.
  • Edit: Modify existing memory entries directly in the list.
  • Delete: Remove memories that are no longer needed.

Memory Compression (Compact)

Over time, memories can accumulate and become redundant. The Compact feature helps optimize the memory pool.

  • Ratio: Set the compression ratio (for example 0.8, 0.5, or 0.3) to determine how much information is retained.
  • Decay Days: Optionally specify a time window to compact only memories older than a certain number of days.

For more details on compaction, see Memory Compaction.


Rebuild

The Rebuild feature re-indexes all memories from scratch. This is useful when:

  • You have changed the memory provider's mode (e.g., switching from off to sparse).
  • The vector index has become inconsistent.
  • You want to re-process all memories with updated settings.

Click Rebuild in the Memory tab to start the process. You can monitor the rebuild status in real-time.


Status

The Memory tab shows the current status of the memory provider for this bot:

  • Connected — The memory backend is reachable and operational.
  • Error — There is an issue with the memory provider configuration or connectivity.

Use the status indicator to quickly verify that the memory system is working before troubleshooting other issues.


Usage Statistics

The Memory tab displays storage usage information:

  • Total Memories — The number of memory entries stored for this bot.
  • Index Status — Whether the vector index is up-to-date.

Bot Interaction

  • The bot automatically searches and retrieves memories during chat.
  • The assigned Memory Provider controls the memory backend used by the bot.
  • Provider-specific settings (such as memory mode, embedding model, or API keys) are configured in the provider itself — see Memory Providers.
  • Memories provide the long-term knowledge that makes each bot unique to its owner.

Published under AGPLv3

+ \ No newline at end of file diff --git a/getting-started/provider-and-model.html b/getting-started/provider-and-model.html index d7b9dba0..e4bf5749 100644 --- a/getting-started/provider-and-model.html +++ b/getting-started/provider-and-model.html @@ -6,21 +6,21 @@ LLM Provider and Model | Memoh Documentation - + - + - - - + + + -
Skip to content

LLM Provider and Model

To use Memoh, you first need to configure at least one LLM Provider and at least one Model.

LLM Provider

An LLM Provider represents a connection to an AI service (like OpenAI, Anthropic, or a self-hosted compatible API). It stores the base URL and authentication credentials.

Creating a Provider

  1. Navigate to the Providers page from the sidebar.
  2. Click the Add Provider button at the bottom of the sidebar.
  3. Fill in the following fields:
    • Name: A display name for this provider (e.g., "OpenAI").
    • Base URL: The root URL of the API (e.g., https://api.openai.com/v1).
    • API Key: Your authentication token for the service.
  4. Click Create.

OAuth Authentication

Some providers (like OpenAI) support OAuth-based authentication. If a provider supports OAuth:

  1. Select the provider from the list.
  2. Click Connect with OAuth in the provider settings form.
  3. Follow the authorization flow in the popup window.
  4. Once authorized, the provider will use the OAuth token instead of a manual API key.

Import Models

Memoh can automatically discover and import available models from a provider:

  1. Select a provider from the list.
  2. Click Import Models.
  3. Memoh will query the provider's API to fetch available models.
  4. Select which models to import and click Import.

This saves time compared to manually adding each model one by one.

Managing Providers

  • Edit: Select a provider from the list and use the form on the right to update its name, URL, or API key.
  • Test: Click Test Connection to verify the provider is reachable.
  • Delete: Use the Delete Provider button in the provider settings form.

Model

A Model is a specific AI instance (like gpt-4o or text-embedding-3-small) that belongs to a Provider. Memoh distinguishes between Chat models (for conversation) and Embedding models (for memory search).

Adding a Model

  1. Select a Provider from the list on the Providers page.
  2. Click Add Model in the model list section.
  3. Configure the following fields:
FieldRequiredDescription
TypeYeschat for conversation, embedding for vector search.
Model IDYesThe exact identifier used by the provider (e.g., gpt-4o).
NameNoA friendly display name (defaults to Model ID).
Client TypeYes (Chat)The API protocol: openai-responses, openai-completions, anthropic-messages, or google-generative-ai.
Input ModalitiesYes (Chat)Capabilities supported: text (default), image, audio, video, file.
Supports ReasoningNoEnable if the model supports internal reasoning steps (e.g., OpenAI o1).
DimensionsYes (Embed)The vector size for embedding models (e.g., 1536).
  1. Click Create.

Managing Models

  • Edit: Click the edit icon next to a model in the list.
  • Delete: Click the trash icon next to a model to remove it.

Next Steps

Now that you have configured your models, you can proceed to Create and Configure a Bot.

Published under AGPLv3

- +
Skip to content

LLM Provider and Model

To use Memoh, you first need to configure at least one LLM Provider and at least one Model.

LLM Provider

An LLM Provider represents a connection to an AI service (like OpenAI, Anthropic, or a self-hosted compatible API). It stores the base URL and authentication credentials.

Creating a Provider

  1. Navigate to the Providers page from the sidebar.
  2. Click the Add Provider button at the bottom of the sidebar.
  3. Fill in the following fields:
    • Name: A display name for this provider (e.g., "OpenAI").
    • Base URL: The root URL of the API (e.g., https://api.openai.com/v1).
    • API Key: Your authentication token for the service.
  4. Click Create.

OAuth Authentication

Some providers (like OpenAI) support OAuth-based authentication. If a provider supports OAuth:

  1. Select the provider from the list.
  2. Click Connect with OAuth in the provider settings form.
  3. Follow the authorization flow in the popup window.
  4. Once authorized, the provider will use the OAuth token instead of a manual API key.

Import Models

Memoh can automatically discover and import available models from a provider:

  1. Select a provider from the list.
  2. Click Import Models.
  3. Memoh will query the provider's API to fetch available models.
  4. Select which models to import and click Import.

This saves time compared to manually adding each model one by one.

Managing Providers

  • Edit: Select a provider from the list and use the form on the right to update its name, URL, or API key.
  • Test: Click Test Connection to verify the provider is reachable.
  • Delete: Use the Delete Provider button in the provider settings form.

Model

A Model is a specific AI instance (like gpt-4o or text-embedding-3-small) that belongs to a Provider. Memoh distinguishes between Chat models (for conversation) and Embedding models (for memory search).

Adding a Model

  1. Select a Provider from the list on the Providers page.
  2. Click Add Model in the model list section.
  3. Configure the following fields:
FieldRequiredDescription
TypeYeschat for conversation, embedding for vector search.
Model IDYesThe exact identifier used by the provider (e.g., gpt-4o).
NameNoA friendly display name (defaults to Model ID).
Client TypeYes (Chat)The API protocol: openai-responses, openai-completions, anthropic-messages, or google-generative-ai.
Input ModalitiesYes (Chat)Capabilities supported: text (default), image, audio, video, file.
Supports ReasoningNoEnable if the model supports internal reasoning steps (e.g., OpenAI o1).
DimensionsYes (Embed)The vector size for embedding models (e.g., 1536).
  1. Click Create.

Managing Models

  • Edit: Click the edit icon next to a model in the list.
  • Delete: Click the trash icon next to a model to remove it.

Next Steps

Now that you have configured your models, you can proceed to Create and Configure a Bot.

Published under AGPLv3

+ \ No newline at end of file diff --git a/getting-started/schedule.html b/getting-started/schedule.html index a60af7cc..eaec603e 100644 --- a/getting-started/schedule.html +++ b/getting-started/schedule.html @@ -6,20 +6,20 @@ Scheduled Tasks | Memoh Documentation - + - + - - - + + + -
Skip to content

Scheduled Tasks

Scheduled Tasks allow you to automate recurring bot actions using cron expressions. This is useful for sending periodic reports, checking external data, performing maintenance, or triggering any routine task without manual intervention.

Concept: Cron-Based Automation

A Schedule is a cron-triggered rule bound to a specific bot. When a schedule fires, it sends a command to the agent, which executes it using its available tools, skills, and context. The bot can then deliver results to any connected channel.


Schedule Fields

FieldDescription
NameA display name for the task (e.g., "Morning News Summary").
DescriptionA brief explanation of what the task does.
PatternA cron expression that defines when the task runs (e.g., 0 9 * * * for daily at 9:00 AM).
CommandThe natural-language instruction sent to the agent when the schedule triggers (e.g., "Summarize today's top tech news and send it to the Telegram channel").
EnabledWhether the schedule is currently active.
Max CallsOptional limit on the total number of executions. Leave empty for unlimited.
Current CallsThe number of times this schedule has already fired.

Cron Pattern Reference

The pattern field uses standard cron syntax with five fields. It is evaluated in the server's configured timezone. By default, Memoh uses UTC, and you can change it with the top-level timezone config value.

┌───────────── minute (0–59)
+    
Skip to content

Scheduled Tasks

Scheduled Tasks allow you to automate recurring bot actions using cron expressions. This is useful for sending periodic reports, checking external data, performing maintenance, or triggering any routine task without manual intervention.

Concept: Cron-Based Automation

A Schedule is a cron-triggered rule bound to a specific bot. When a schedule fires, it sends a command to the agent, which executes it using its available tools, skills, and context. The bot can then deliver results to any connected channel.


Schedule Fields

FieldDescription
NameA display name for the task (e.g., "Morning News Summary").
DescriptionA brief explanation of what the task does.
PatternA cron expression that defines when the task runs (e.g., 0 9 * * * for daily at 9:00 AM).
CommandThe natural-language instruction sent to the agent when the schedule triggers (e.g., "Summarize today's top tech news and send it to the Telegram channel").
EnabledWhether the schedule is currently active.
Max CallsOptional limit on the total number of executions. Leave empty for unlimited.
Current CallsThe number of times this schedule has already fired.

Cron Pattern Reference

The pattern field uses standard cron syntax with five fields. It is evaluated in the server's configured timezone. By default, Memoh uses UTC, and you can change it with the top-level timezone config value.

┌───────────── minute (0–59)
 │ ┌───────────── hour (0–23)
 │ │ ┌───────────── day of month (1–31)
 │ │ │ ┌───────────── month (1–12)
@@ -32,8 +32,8 @@
   "command": "Summarize my unread emails and send the result to Telegram.",
   "enabled": true,
   "max_calls": null
-}

Execution Flow

When a schedule fires:

  1. The cron service triggers the schedule.
  2. The current_calls counter is incremented.
  3. If max_calls is set and reached, the schedule is automatically disabled.
  4. The agent receives the command along with the schedule context.
  5. The agent executes the command using its tools (e.g., web search, file read, send message).
  6. Results can be delivered to any connected channel.

Schedule vs. Heartbeat

FeatureScheduleHeartbeat
TriggerCron expression (flexible timing)Fixed interval (minutes)
CommandCustom natural-language instructionGeneric "routine check" prompt
Max CallsOptional execution limitUnlimited
Use CaseSpecific recurring tasksPeriodic autonomous thinking

Both features complement each other: use Heartbeat for general-purpose periodic activity and Schedule for precise, task-oriented automation.

Published under AGPLv3

- +}

Execution Flow

When a schedule fires:

  1. The cron service triggers the schedule.
  2. The current_calls counter is incremented.
  3. If max_calls is set and reached, the schedule is automatically disabled.
  4. The agent receives the command along with the schedule context.
  5. The agent executes the command using its tools (e.g., web search, file read, send message).
  6. Results can be delivered to any connected channel.

Schedule vs. Heartbeat

FeatureScheduleHeartbeat
TriggerCron expression (flexible timing)Fixed interval (minutes)
CommandCustom natural-language instructionGeneric "routine check" prompt
Max CallsOptional execution limitUnlimited
Use CaseSpecific recurring tasksPeriodic autonomous thinking

Both features complement each other: use Heartbeat for general-purpose periodic activity and Schedule for precise, task-oriented automation.

Published under AGPLv3

+ \ No newline at end of file diff --git a/getting-started/search-provider.html b/getting-started/search-provider.html index 2a0e10a0..cfe4a2fa 100644 --- a/getting-started/search-provider.html +++ b/getting-started/search-provider.html @@ -6,21 +6,21 @@ Search Providers | Memoh Documentation - + - + - - - + + + -
Skip to content

Search Providers

Memoh allows you to connect your Bot to various search engines, enabling it to browse the web for real-time information and external knowledge.

Concept: Real-Time Knowledge

A Search Provider is a connection to a specific search API (like Brave, Google, or Bing). Once configured, it becomes a tool that your Bot can use during conversation.


Supported Search Engines

Configure your search engines from the Search Provider page in the sidebar.

Supported EnginesNotes
BraveHighly recommended for privacy and performance.
BingPowerful global search capability.
GoogleComprehensive web search.
TavilyDesigned specifically for AI-powered research.
SearxNGConnect to your own self-hosted search aggregator.
DuckDuckGoPrivacy-focused search.
Other ProvidersSogou, Serper, Jina, Exa, Bocha, Yandex.

Configuration Flow

1. Adding a Search Provider

  1. Navigate to the Search Provider page from the sidebar.
  2. Click Add Search Provider.
  3. Fill in the following:
    • Name: A friendly name (e.g., "My Brave Search").
    • API Key: Your credentials for the specific search engine API.
    • Other Parameters: Depending on the engine, you may need to specify additional settings (e.g., base_url for SearxNG).

2. Managing Providers

  • Edit: Select a provider from the sidebar and update its configuration in the form on the right.
  • Delete: Use the Delete Provider button in the provider settings form.

Assigning a Search Provider to a Bot

  1. Navigate to the Bots page and select your bot.
  2. Go to the General tab.
  3. Find the Search Provider dropdown and select the provider you created.
  4. Click Save.

Bot Interaction

  • When a user's question requires real-time information, the bot will automatically call its assigned Search Provider.
  • The bot will process the search results to provide a grounded and accurate response.
  • Multiple search results can be synthesized to provide a comprehensive answer.

Published under AGPLv3

- +
Skip to content

Search Providers

Memoh allows you to connect your Bot to various search engines, enabling it to browse the web for real-time information and external knowledge.

Concept: Real-Time Knowledge

A Search Provider is a connection to a specific search API (like Brave, Google, or Bing). Once configured, it becomes a tool that your Bot can use during conversation.


Supported Search Engines

Configure your search engines from the Search Provider page in the sidebar.

Supported EnginesNotes
BraveHighly recommended for privacy and performance.
BingPowerful global search capability.
GoogleComprehensive web search.
TavilyDesigned specifically for AI-powered research.
SearxNGConnect to your own self-hosted search aggregator.
DuckDuckGoPrivacy-focused search.
Other ProvidersSogou, Serper, Jina, Exa, Bocha, Yandex.

Configuration Flow

1. Adding a Search Provider

  1. Navigate to the Search Provider page from the sidebar.
  2. Click Add Search Provider.
  3. Fill in the following:
    • Name: A friendly name (e.g., "My Brave Search").
    • API Key: Your credentials for the specific search engine API.
    • Other Parameters: Depending on the engine, you may need to specify additional settings (e.g., base_url for SearxNG).

2. Managing Providers

  • Edit: Select a provider from the sidebar and update its configuration in the form on the right.
  • Delete: Use the Delete Provider button in the provider settings form.

Assigning a Search Provider to a Bot

  1. Navigate to the Bots page and select your bot.
  2. Go to the General tab.
  3. Find the Search Provider dropdown and select the provider you created.
  4. Click Save.

Bot Interaction

  • When a user's question requires real-time information, the bot will automatically call its assigned Search Provider.
  • The bot will process the search results to provide a grounded and accurate response.
  • Multiple search results can be synthesized to provide a comprehensive answer.

Published under AGPLv3

+ \ No newline at end of file diff --git a/getting-started/sessions.html b/getting-started/sessions.html index d98ed18c..de85f934 100644 --- a/getting-started/sessions.html +++ b/getting-started/sessions.html @@ -6,21 +6,21 @@ Sessions | Memoh Documentation - + - + - - - + + + -
Skip to content

Sessions

A Session is an independent conversation thread between a user and a bot. Each session maintains its own context window and message history, allowing the bot to focus on a specific topic or task without interference from other conversations.


Concept: Conversation Isolation

When you chat with a bot, your messages are grouped into a session. The bot uses the session's history to maintain context. Starting a new session resets this context, giving you a fresh conversation without losing the previous one.

Sessions are scoped per bot — each bot manages its own set of sessions independently.


Session Types

Memoh uses four session types to separate different kinds of bot activity:

TypeDescription
ChatStandard user-initiated conversations. This is the default session type when chatting with a bot.
HeartbeatAutomatically created when a bot's heartbeat triggers. Contains the bot's periodic autonomous activity.
ScheduleCreated when a scheduled task fires. Contains the bot's execution of a cron-triggered command.
SubagentCreated when the bot delegates a task to a subagent. Contains the subagent's independent work context.

Only Chat sessions are directly created by users. The other types are system-managed and appear as read-only records in the session list.


Starting a New Session with /new

The /new slash command creates a fresh chat session, resetting the conversation context. This works across all channels:

In External Channels (Telegram, Discord, Feishu, etc.)

Send /new as a message to the bot. The bot will:

  1. Create a new chat session.
  2. Route all subsequent messages from you to this new session.
  3. The previous session's history is preserved but no longer active.

This is especially useful when:

  • You want to change topics without the bot referencing old context.
  • The conversation has become too long and you want a clean start.
  • You are switching between different tasks.

In the Web UI

The Web UI provides a session sidebar where you can:

  • Click the New Session button to create a fresh chat session.
  • Switch between existing sessions by clicking on them.
  • Search sessions by content.
  • Filter sessions by type (chat, heartbeat, schedule, subagent).
  • Rename or delete sessions.

Managing Sessions

Viewing Sessions

In the Web UI, the session sidebar lists all sessions for the currently selected bot. Each entry shows:

  • Title — The session name (auto-generated or user-defined).
  • Type — The session type icon.
  • Last Activity — When the session was last active.

Renaming Sessions

Click on a session title to rename it. This helps organize conversations by topic.

Deleting Sessions

Remove sessions you no longer need. Deleting a session removes its message history permanently.


How Sessions Relate to Other Features

  • Heartbeat sessions are created on each heartbeat trigger. You can view what the bot did during its autonomous activity by opening the corresponding heartbeat session.
  • Schedule sessions are created when a scheduled task runs. Check these to see the results of cron-triggered commands.
  • Subagent sessions track delegated tasks. They show the independent work context of each subagent invocation.
  • Memory is shared across all sessions for a bot — memories extracted from one session are available in all others.

Published under AGPLv3

- +
Skip to content

Sessions

A Session is an independent conversation thread between a user and a bot. Each session maintains its own context window and message history, allowing the bot to focus on a specific topic or task without interference from other conversations.


Concept: Conversation Isolation

When you chat with a bot, your messages are grouped into a session. The bot uses the session's history to maintain context. Starting a new session resets this context, giving you a fresh conversation without losing the previous one.

Sessions are scoped per bot — each bot manages its own set of sessions independently.


Session Types

Memoh uses four session types to separate different kinds of bot activity:

TypeDescription
ChatStandard user-initiated conversations. This is the default session type when chatting with a bot.
HeartbeatAutomatically created when a bot's heartbeat triggers. Contains the bot's periodic autonomous activity.
ScheduleCreated when a scheduled task fires. Contains the bot's execution of a cron-triggered command.
SubagentCreated when the bot delegates a task to a subagent. Contains the subagent's independent work context.

Only Chat sessions are directly created by users. The other types are system-managed and appear as read-only records in the session list.


Starting a New Session with /new

The /new slash command creates a fresh chat session, resetting the conversation context. This works across all channels:

In External Channels (Telegram, Discord, Feishu, etc.)

Send /new as a message to the bot. The bot will:

  1. Create a new chat session.
  2. Route all subsequent messages from you to this new session.
  3. The previous session's history is preserved but no longer active.

This is especially useful when:

  • You want to change topics without the bot referencing old context.
  • The conversation has become too long and you want a clean start.
  • You are switching between different tasks.

In the Web UI

The Web UI provides a session sidebar where you can:

  • Click the New Session button to create a fresh chat session.
  • Switch between existing sessions by clicking on them.
  • Search sessions by content.
  • Filter sessions by type (chat, heartbeat, schedule, subagent).
  • Rename or delete sessions.

Managing Sessions

Viewing Sessions

In the Web UI, the session sidebar lists all sessions for the currently selected bot. Each entry shows:

  • Title — The session name (auto-generated or user-defined).
  • Type — The session type icon.
  • Last Activity — When the session was last active.

Renaming Sessions

Click on a session title to rename it. This helps organize conversations by topic.

Deleting Sessions

Remove sessions you no longer need. Deleting a session removes its message history permanently.


How Sessions Relate to Other Features

  • Heartbeat sessions are created on each heartbeat trigger. You can view what the bot did during its autonomous activity by opening the corresponding heartbeat session.
  • Schedule sessions are created when a scheduled task runs. Check these to see the results of cron-triggered commands.
  • Subagent sessions track delegated tasks. They show the independent work context of each subagent invocation.
  • Memory is shared across all sessions for a bot — memories extracted from one session are available in all others.

Published under AGPLv3

+ \ No newline at end of file diff --git a/getting-started/skills.html b/getting-started/skills.html index 1da8cdbd..ca628854 100644 --- a/getting-started/skills.html +++ b/getting-started/skills.html @@ -6,28 +6,28 @@ Bot Skills | Memoh Documentation - + - + - - - + + + -
Skip to content

Bot Skills

Skills are the "personality" and "capabilities" of a Memoh Bot. They define how the bot should behave and what tools it can use.

Concept: Skills as Markdown

A Skill is represented as a Markdown document with YAML frontmatter. These files are stored within the bot's container and parsed into tools and personality traits.

Example Skill Structure

yaml
---
+    
Skip to content

Bot Skills

Skills are the "personality" and "capabilities" of a Memoh Bot. They define how the bot should behave and what tools it can use.

Concept: Skills as Markdown

A Skill is represented as a Markdown document with YAML frontmatter. These files are stored within the bot's container and parsed into tools and personality traits.

Example Skill Structure

yaml
---
 name: coder-skill
 description: Enables advanced coding capabilities and tool use.
 ---
 
 # Coder Skill
 As a coder, you always follow best practices and write clean, documented code. 
-You can use the `edit_file` and `run_command` tools to assist the user.

Managing Skills

Manage your bot's skill set from the Skills tab in the Bot Detail page.

Adding a Skill

  1. Click Add Skill.
  2. A dialog with a basic template will open in the Monaco Editor.
  3. Fill in the name, description, and content.
  4. Click Save.

Editing and Deleting

  • Edit: Click the pencil icon next to a skill card to modify its content or frontmatter.
  • Delete: Click the trash icon to remove a skill from the bot's container.

How Bots Use Skills

  • Skills are injected into the bot's system prompt during conversation.
  • The YAML frontmatter helps the system categorize and manage the skills as tools.
  • Modular skills allow you to easily "swap" behaviors or capabilities without rewriting the entire bot.

Published under AGPLv3

- +You can use the `edit_file` and `run_command` tools to assist the user.

Managing Skills

Manage your bot's skill set from the Skills tab in the Bot Detail page.

Adding a Skill

  1. Click Add Skill.
  2. A dialog with a basic template will open in the Monaco Editor.
  3. Fill in the name, description, and content.
  4. Click Save.

Editing and Deleting

  • Edit: Click the pencil icon next to a skill card to modify its content or frontmatter.
  • Delete: Click the trash icon to remove a skill from the bot's container.

How Bots Use Skills

  • Skills are injected into the bot's system prompt during conversation.
  • The YAML frontmatter helps the system categorize and manage the skills as tools.
  • Modular skills allow you to easily "swap" behaviors or capabilities without rewriting the entire bot.

Published under AGPLv3

+ \ No newline at end of file diff --git a/getting-started/slash-commands.html b/getting-started/slash-commands.html index 20793e84..f5ba6229 100644 --- a/getting-started/slash-commands.html +++ b/getting-started/slash-commands.html @@ -6,28 +6,28 @@ Slash Commands | Memoh Documentation - + - + - - - + + + -
Skip to content

Slash Commands

Memoh bots support slash commands — text commands prefixed with / that can be sent in any channel (Telegram, Discord, Feishu, Web, etc.) to perform administrative actions without going through the AI agent.

Slash commands are intercepted before they reach the LLM, so they execute instantly and don't consume tokens.


Quick Reference

CommandDescription
/helpShow all available commands
/newStart a new conversation session
/scheduleManage scheduled tasks
/mcpManage MCP connections
/settingsView and update bot settings
/modelManage bot models
/memoryManage memory provider
/searchManage search provider
/browserManage browser context
/usageView token usage statistics
/emailView email configuration
/heartbeatView heartbeat logs
/skillView bot skills
/fsBrowse container filesystem

Command Format

Commands follow the pattern:

/resource [action] [arguments...]
  • resource — The command group (e.g., schedule, model).
  • action — The sub-command (e.g., list, set, create). Some commands have a default action.
  • arguments — Additional parameters. Use quotes for values with spaces.

Example: /schedule create daily-report "0 9 * * *" "Send me a daily summary"


Permissions

Commands that modify bot settings are marked as owner-only. Only the bot owner can execute these commands. Read-only commands (listing, viewing) are available to all users who have chat access.

Owner-only commands are marked with [owner] in the /help output.


Global Commands

/help

Displays a list of all available commands and their usage.

/new

Starts a new conversation session, resetting the current context. See Sessions for details.


/schedule — Manage Scheduled Tasks

Sub-commandUsagePermission
list/schedule listAll
get/schedule get <name>All
create/schedule create <name> <pattern> <command>Owner
update/schedule update <name> [--pattern P] [--command C]Owner
delete/schedule delete <name>Owner
enable/schedule enable <name>Owner
disable/schedule disable <name>Owner

Examples:

/schedule list
+    
Skip to content

Slash Commands

Memoh bots support slash commands — text commands prefixed with / that can be sent in any channel (Telegram, Discord, Feishu, Web, etc.) to perform administrative actions without going through the AI agent.

Slash commands are intercepted before they reach the LLM, so they execute instantly and don't consume tokens.


Quick Reference

CommandDescription
/helpShow all available commands
/newStart a new conversation session
/scheduleManage scheduled tasks
/mcpManage MCP connections
/settingsView and update bot settings
/modelManage bot models
/memoryManage memory provider
/searchManage search provider
/browserManage browser context
/usageView token usage statistics
/emailView email configuration
/heartbeatView heartbeat logs
/skillView bot skills
/fsBrowse container filesystem

Command Format

Commands follow the pattern:

/resource [action] [arguments...]
  • resource — The command group (e.g., schedule, model).
  • action — The sub-command (e.g., list, set, create). Some commands have a default action.
  • arguments — Additional parameters. Use quotes for values with spaces.

Example: /schedule create daily-report "0 9 * * *" "Send me a daily summary"


Permissions

Commands that modify bot settings are marked as owner-only. Only the bot owner can execute these commands. Read-only commands (listing, viewing) are available to all users who have chat access.

Owner-only commands are marked with [owner] in the /help output.


Global Commands

/help

Displays a list of all available commands and their usage.

/new

Starts a new conversation session, resetting the current context. See Sessions for details.


/schedule — Manage Scheduled Tasks

Sub-commandUsagePermission
list/schedule listAll
get/schedule get <name>All
create/schedule create <name> <pattern> <command>Owner
update/schedule update <name> [--pattern P] [--command C]Owner
delete/schedule delete <name>Owner
enable/schedule enable <name>Owner
disable/schedule disable <name>Owner

Examples:

/schedule list
 /schedule create morning-news "0 9 * * *" "Summarize today's top tech news"
 /schedule disable morning-news

/mcp — Manage MCP Connections

Sub-commandUsagePermission
list/mcp listAll
get/mcp get <name>All
delete/mcp delete <name>Owner

/settings — View and Update Bot Settings

Sub-commandUsagePermission
get/settings or /settings getAll
update/settings update [options]Owner

Update options:

OptionValues
--languageLanguage code (e.g., en, zh)
--acl_default_effectallow or deny
--reasoning_enabledtrue or false
--reasoning_effortlow, medium, or high
--heartbeat_enabledtrue or false
--heartbeat_intervalMinutes (integer)
--chat_model_idModel UUID
--heartbeat_model_idModel UUID

Example:

/settings update --language en --heartbeat_enabled true --heartbeat_interval 30

/model — Manage Bot Models

Sub-commandUsagePermission
list/model listAll
set/model set <provider_name> <model_name>Owner
set-heartbeat/model set-heartbeat <provider_name> <model_name>Owner

Example:

/model list
 /model set OpenAI gpt-4o
 /model set-heartbeat OpenAI gpt-4o-mini

/memory — Manage Memory Provider

Sub-commandUsagePermission
list/memory listAll
set/memory set <name>Owner

/search — Manage Search Provider

Sub-commandUsagePermission
list/search listAll
set/search set <name>Owner

/browser — Manage Browser Context

Sub-commandUsagePermission
list/browser listAll
set/browser set <name>Owner

/usage — View Token Usage

Sub-commandUsagePermission
summary/usage or /usage summaryAll
by-model/usage by-modelAll

Shows token usage for the last 7 days, broken down by session type (chat, heartbeat, schedule) or by model.


/email — View Email Configuration

Sub-commandUsagePermission
providers/email providersAll
bindings/email bindingsAll
outbox/email outboxAll

/heartbeat — View Heartbeat Logs

Sub-commandUsagePermission
logs/heartbeat or /heartbeat logsAll

Shows the 10 most recent heartbeat execution logs.


/skill — View Bot Skills

Sub-commandUsagePermission
list/skill or /skill listAll

/fs — Browse Container Filesystem

Sub-commandUsagePermission
list/fs list [path]All
read/fs read <path>All

Examples:

/fs list /
 /fs list /home
 /fs read /home/bot/IDENTITY.md

File content is truncated to 2000 characters when displayed in chat.


Mention-Prefixed Commands

In group chats, you can prefix commands with a mention:

@BotName /help
-@BotName /new

The bot will strip the mention and process the slash command normally.

Published under AGPLv3

- +@BotName /new

The bot will strip the mention and process the slash command normally.

Published under AGPLv3

+ \ No newline at end of file diff --git a/hashmap.json b/hashmap.json index 01941cda..b8beaf80 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"about.md":"BHHsAOtF","blogs_2026-02-16.md":"BRb_uymM","blogs_index.md":"CWwgVf03","channels_discord.md":"BmZ6CspE","channels_feishu.md":"wMudSRYw","channels_index.md":"CHGqSCNe","channels_matrix.md":"BX6Zz3t1","channels_qq.md":"BLP-WgO8","channels_telegram.md":"Cr9xyz5r","channels_wecom.md":"BeiCLtex","channels_weixin.md":"DWY_N0Mw","getting-started_access.md":"CLfgJOzW","getting-started_bot.md":"28IQBvMi","getting-started_browser.md":"DHWZP7Sw","getting-started_channels.md":"m6gk9QUJ","getting-started_compaction.md":"DpvpBFKV","getting-started_container.md":"Cn3JBXGq","getting-started_email.md":"C6AeFWWD","getting-started_files.md":"BEvIR4S9","getting-started_heartbeat.md":"ByhyU7bB","getting-started_mcp.md":"Cc4x0Hwa","getting-started_memory.md":"DGTYEufG","getting-started_provider-and-model.md":"BT7Reh8O","getting-started_schedule.md":"tVJ8UgNc","getting-started_search-provider.md":"CvBWWZPP","getting-started_sessions.md":"DCv4I7U5","getting-started_skills.md":"BMbCYp3W","getting-started_slash-commands.md":"BsVHX_1A","index.md":"DJ2zSR3k","installation_docker.md":"EGlSgJeL","memory-providers_builtin.md":"BhfdM6jZ","memory-providers_index.md":"Cl5wC9-w","memory-providers_mem0.md":"C-l_lmek","memory-providers_openviking.md":"BVdpnQhh","tts-providers_edge.md":"DyIkCTE0","tts-providers_index.md":"MiCAla7_","zh_concepts_identity-and-binding.md":"CwSe42kA","zh_concepts_index.md":"B_keRB_w","zh_index.md":"Clg9MYGD","zh_style_terminology.md":"BGrDT8pF"} +{"about.md":"B8mz5B7D","blogs_2026-02-16.md":"D7X_K9ac","blogs_index.md":"CzVqJnkf","channels_discord.md":"CgnXVcxj","channels_feishu.md":"7xzXC8PR","channels_index.md":"CV834U5I","channels_matrix.md":"C5lym8OS","channels_qq.md":"BiHC52Zm","channels_telegram.md":"WGR_O6_O","channels_wecom.md":"D7yBtNrz","channels_weixin.md":"Ckccg7Ew","getting-started_access.md":"Co5O-s2T","getting-started_bot.md":"CULM4cGX","getting-started_browser.md":"Cjpk7h3a","getting-started_channels.md":"DP2fW_sw","getting-started_compaction.md":"CQe9KC6f","getting-started_container.md":"00DekezL","getting-started_email.md":"DLrAWkek","getting-started_files.md":"CbhHSLX5","getting-started_heartbeat.md":"lBwT6Ivl","getting-started_mcp.md":"CfWEkmuE","getting-started_memory.md":"DfffnmM0","getting-started_provider-and-model.md":"MB4KgxWX","getting-started_schedule.md":"7R1TStAB","getting-started_search-provider.md":"DDV1py8V","getting-started_sessions.md":"CaVKbfb5","getting-started_skills.md":"E3JgIlwr","getting-started_slash-commands.md":"CBeh4epy","index.md":"MTTbinuf","installation_docker.md":"DxE7r3rU","memory-providers_builtin.md":"DlYtNI3G","memory-providers_index.md":"D5MvHNPW","memory-providers_mem0.md":"C5B6D9ME","memory-providers_openviking.md":"N-8WyFZa","tts-providers_edge.md":"DPjdtaQf","tts-providers_index.md":"Cgc87EeS","zh_concepts_identity-and-binding.md":"6tGYa9d_","zh_concepts_index.md":"_zNPjKkD","zh_index.md":"Db4hJx1C","zh_style_terminology.md":"CzqhSoQX"} diff --git a/index.html b/index.html index de83f34e..0e8c233f 100644 --- a/index.html +++ b/index.html @@ -6,21 +6,21 @@ Memoh Documentation - + - + - - - + + + -
Skip to content

Memoh Documentation

Memoh(/ˈmemoʊ/) is a multi-member, structured long-memory, containerized AI agent system. Create your own AI bots, chat with them via Telegram, Discord, Lark (Feishu), QQ, Matrix, WeCom, WeChat, Email, or Web. Each bot runs in an isolated container with its own memory system — able to edit files, run commands, and access the network.

Documentation

  • About Memoh — What Memoh is, key features, and installation links.
  • Installation — Docker setup (recommended).
  • Getting Started — Step-by-step guide to configure models, bots, and channels.
  • Channels — Detailed guides for Telegram, Feishu, Discord, QQ, Matrix, WeCom, and WeChat.

Published under AGPLv3

- +
Skip to content

Memoh Documentation

Memoh(/ˈmemoʊ/) is a multi-member, structured long-memory, containerized AI agent system. Create your own AI bots, chat with them via Telegram, Discord, Lark (Feishu), QQ, Matrix, WeCom, WeChat, Email, or Web. Each bot runs in an isolated container with its own memory system — able to edit files, run commands, and access the network.

Documentation

  • About Memoh — What Memoh is, key features, and installation links.
  • Installation — Docker setup (recommended).
  • Getting Started — Step-by-step guide to configure models, bots, and channels.
  • Channels — Detailed guides for Telegram, Feishu, Discord, QQ, Matrix, WeCom, and WeChat.

Published under AGPLv3

+ \ No newline at end of file diff --git a/installation/docker.html b/installation/docker.html index 5c638391..73eb470a 100644 --- a/installation/docker.html +++ b/installation/docker.html @@ -6,20 +6,20 @@ Docker Installation | Memoh Documentation - + - + - - - + + + -
Skip to content

Docker Installation

Docker is the recommended way to run Memoh. The stack includes PostgreSQL, the main server (with embedded Containerd and in-process AI agent), and the web UI — all orchestrated via Docker Compose. You do not need to install containerd, nerdctl, or buildkit on your host; everything runs inside containers.

Service Architecture

The Docker Compose stack consists of multiple services. Some are always started, others are optional and enabled via --profile:

ServiceProfileDescription
server(core)Main Memoh server with embedded Containerd and in-process AI agent
web(core)Web UI (Vue 3)
postgres(core)PostgreSQL database
qdrantqdrantQdrant vector database for memory search (sparse and dense modes)
browserbrowserPlaywright-based browser gateway for bot web automation
sparsesparseNeural sparse encoding service for memory retrieval (see below)

Sparse Service

The sparse container provides neural sparse vector encoding for memory retrieval. It runs a lightweight Python (Flask) service on port 8085 that uses the opensearch-neural-sparse-encoding-multilingual-v1 model from OpenSearch.

What it does:

  • Converts document text into sparse vectors (a compact list of token indices + importance weights) using a masked language model
  • Encodes queries using IDF-weighted term lookup for fast, efficient retrieval
  • Works with Qdrant to enable semantic memory search without requiring an external embedding API

Why use it:

  • No embedding API costs — The model runs locally inside the container, so you don't need an OpenAI/Cohere/etc. embedding API key
  • Multilingual — The underlying model supports multiple languages out of the box
  • Good retrieval quality — Neural sparse encoding provides significantly better results than keyword-only search (BM25), while being lighter than dense embedding models

When to enable it:

Enable the sparse profile (--profile sparse) if you plan to use the built-in memory provider in sparse mode. The model is pre-downloaded during the Docker image build, so the container starts quickly without needing to fetch weights at runtime.

bash
docker compose --profile qdrant --profile sparse --profile browser up -d

For more details on memory modes, see Built-in Memory Provider.

Prerequisites

Run the official install script (requires Docker and Docker Compose):

bash
curl -fsSL https://memoh.sh | sudo sh

The script will:

  1. Check for Docker and Docker Compose
  2. Prompt for configuration (workspace, data directory, admin credentials, JWT secret, Postgres password, sparse service toggle, browser core selection)
  3. Fetch the latest release tag from GitHub and clone the repository
  4. Generate config.toml from the Docker template with your settings
  5. Pin Docker image versions to the release
  6. Build the browser image with selected cores and start all services

Silent install (use all defaults, no prompts):

bash
curl -fsSL https://memoh.sh | sudo sh -s -- -y

Defaults when running silently:

  • Workspace: ~/memoh
  • Data directory: ~/memoh/data
  • Admin: admin / admin123
  • JWT secret: auto-generated
  • Postgres password: memoh123

Install a specific version:

bash
curl -fsSL https://memoh.sh | sudo sh -s -- --version v0.6.0

Or using the environment variable:

bash
curl -fsSL https://memoh.sh | sudo MEMOH_VERSION=v0.6.0 sh

Use China mainland mirror (for slow image pulls):

bash
curl -fsSL https://memoh.sh | sudo USE_CN_MIRROR=true sh

Environment variables can be combined, e.g. curl -fsSL https://memoh.sh | sudo MEMOH_VERSION=v0.6.0 USE_CN_MIRROR=true sh

Manual Install

bash
git clone https://github.com/memohai/Memoh.git
+    
Skip to content

Docker Installation

Docker is the recommended way to run Memoh. The stack includes PostgreSQL, the main server (with embedded Containerd and in-process AI agent), and the web UI — all orchestrated via Docker Compose. You do not need to install containerd, nerdctl, or buildkit on your host; everything runs inside containers.

Service Architecture

The Docker Compose stack consists of multiple services. Some are always started, others are optional and enabled via --profile:

ServiceProfileDescription
server(core)Main Memoh server with embedded Containerd and in-process AI agent
web(core)Web UI (Vue 3)
postgres(core)PostgreSQL database
qdrantqdrantQdrant vector database for memory search (sparse and dense modes)
browserbrowserPlaywright-based browser gateway for bot web automation
sparsesparseNeural sparse encoding service for memory retrieval (see below)

Sparse Service

The sparse container provides neural sparse vector encoding for memory retrieval. It runs a lightweight Python (Flask) service on port 8085 that uses the opensearch-neural-sparse-encoding-multilingual-v1 model from OpenSearch.

What it does:

  • Converts document text into sparse vectors (a compact list of token indices + importance weights) using a masked language model
  • Encodes queries using IDF-weighted term lookup for fast, efficient retrieval
  • Works with Qdrant to enable semantic memory search without requiring an external embedding API

Why use it:

  • No embedding API costs — The model runs locally inside the container, so you don't need an OpenAI/Cohere/etc. embedding API key
  • Multilingual — The underlying model supports multiple languages out of the box
  • Good retrieval quality — Neural sparse encoding provides significantly better results than keyword-only search (BM25), while being lighter than dense embedding models

When to enable it:

Enable the sparse profile (--profile sparse) if you plan to use the built-in memory provider in sparse mode. The model is pre-downloaded during the Docker image build, so the container starts quickly without needing to fetch weights at runtime.

bash
docker compose --profile qdrant --profile sparse --profile browser up -d

For more details on memory modes, see Built-in Memory Provider.

Prerequisites

Run the official install script (requires Docker and Docker Compose):

bash
curl -fsSL https://memoh.sh | sudo sh

The script will:

  1. Check for Docker and Docker Compose
  2. Prompt for configuration (workspace, data directory, admin credentials, JWT secret, Postgres password, sparse service toggle, browser core selection)
  3. Fetch the latest release tag from GitHub and clone the repository
  4. Generate config.toml from the Docker template with your settings
  5. Pin Docker image versions to the release
  6. Build the browser image with selected cores and start all services

Silent install (use all defaults, no prompts):

bash
curl -fsSL https://memoh.sh | sudo sh -s -- -y

Defaults when running silently:

  • Workspace: ~/memoh
  • Data directory: ~/memoh/data
  • Admin: admin / admin123
  • JWT secret: auto-generated
  • Postgres password: memoh123

Install a specific version:

bash
curl -fsSL https://memoh.sh | sudo sh -s -- --version v0.6.0

Or using the environment variable:

bash
curl -fsSL https://memoh.sh | sudo MEMOH_VERSION=v0.6.0 sh

Use China mainland mirror (for slow image pulls):

bash
curl -fsSL https://memoh.sh | sudo USE_CN_MIRROR=true sh

Environment variables can be combined, e.g. curl -fsSL https://memoh.sh | sudo MEMOH_VERSION=v0.6.0 USE_CN_MIRROR=true sh

Manual Install

bash
git clone https://github.com/memohai/Memoh.git
 cd Memoh
 cp conf/app.docker.toml config.toml

Edit config.toml — at minimum change:

  • admin.password — Admin password
  • auth.jwt_secret — Generate with openssl rand -base64 32
  • postgres.password — Database password (also set POSTGRES_PASSWORD env var to match)

Then start (recommended — with Qdrant, Browser, and Sparse):

bash
sudo POSTGRES_PASSWORD=your-db-password docker compose --profile qdrant --profile browser --profile sparse up -d

Or start core services only (no vector DB or browser automation):

bash
sudo POSTGRES_PASSWORD=your-db-password docker compose up -d

On macOS or if your user is in the docker group, sudo is not required.

Important: docker-compose.yml mounts ./config.toml by default. You must create this file before starting — running without it will fail.

China Mainland Mirror

For users in mainland China who cannot access Docker Hub directly, uncomment the registry line in config.toml:

toml
[workspace]
 registry = "memoh.cn"

And add the China mirror compose overlay:

bash
sudo docker compose -f docker-compose.yml -f docker/docker-compose.cn.yml \
@@ -27,8 +27,8 @@
 docker compose down            # Stop
 docker compose logs -f         # View logs
 docker compose ps              # Status
-docker compose pull && docker compose up -d  # Update to latest images

Environment Variables

VariableDefaultDescription
POSTGRES_PASSWORDmemoh123PostgreSQL password (must match postgres.password in config.toml)
MEMOH_CONFIG./config.tomlPath to the configuration file
MEMOH_VERSION(latest release)Git tag to install (e.g. v0.6.0). Also pins Docker image versions.
USE_CN_MIRRORfalseSet to true to use China mainland image mirrors
BROWSER_CORESchromium,firefoxBrowser engines to include in the browser image
BROWSER_TAGlatestDocker tag for the browser image

Published under AGPLv3

- +docker compose pull && docker compose up -d # Update to latest images

Environment Variables

VariableDefaultDescription
POSTGRES_PASSWORDmemoh123PostgreSQL password (must match postgres.password in config.toml)
MEMOH_CONFIG./config.tomlPath to the configuration file
MEMOH_VERSION(latest release)Git tag to install (e.g. v0.6.0). Also pins Docker image versions.
USE_CN_MIRRORfalseSet to true to use China mainland image mirrors
BROWSER_CORESchromium,firefoxBrowser engines to include in the browser image
BROWSER_TAGlatestDocker tag for the browser image

Published under AGPLv3

+ \ No newline at end of file diff --git a/memory-providers/builtin.html b/memory-providers/builtin.html index c0c8f730..306def55 100644 --- a/memory-providers/builtin.html +++ b/memory-providers/builtin.html @@ -6,26 +6,26 @@ Built-in Memory Provider | Memoh Documentation - + - + - - - + + + -
Skip to content

Built-in Memory Provider

The built-in memory provider is the standard memory backend shipped with Memoh. It works with Memoh's memory pipeline and supports:

  • Automatic memory extraction from conversations
  • Semantic memory retrieval during chat
  • Manual memory creation and editing
  • Memory compaction and rebuild workflows

The built-in provider operates in one of three memory modes, each with different infrastructure requirements and retrieval capabilities.


Memory Modes

ModeIndexRequirementsUse Case
OffFile-based onlyNoneLightweight setup, no vector search
SparseNeural sparse vectorsSparse service + Qdrant (--profile sparse)Good retrieval quality without embedding API costs
DenseDense embeddingsEmbedding model + Qdrant (--profile qdrant)Highest-quality semantic search

How Sparse Mode Works

Sparse mode uses the opensearch-neural-sparse-encoding-multilingual-v1 model (from the OpenSearch project) to convert text into sparse vectors — compact lists of token indices with importance weights. Unlike dense mode, which requires an external embedding API, the sparse model runs locally in the sparse container with no API key or cost. It supports multiple languages and provides significantly better retrieval quality than keyword-only search.


Creating a Built-in Provider

  1. Navigate to the Memory Providers page.
  2. Click Add Memory Provider.
  3. Fill in the following fields:
    • Name: A display name for this provider.
    • Provider Type: Select builtin.
  4. Click Create.

Configuring a Built-in Provider

After creating a provider, select it from the list and configure its settings.

FieldDescription
Memory Modeoff (default), sparse, or dense. Controls how memories are indexed and retrieved.
Embedding ModelEmbedding model for dense vector search. Only used in dense mode.
Qdrant CollectionQdrant collection name. Defaults to memory_sparse.

Managing Providers

  • Edit: Select a provider and update its settings.
  • Delete: Remove a provider you no longer use.

Infrastructure Requirements

Off Mode

No additional infrastructure required. Memories are stored and retrieved using file-based indexing only.

Sparse Mode

Requires the sparse service (runs the opensearch-neural-sparse-encoding-multilingual-v1 model locally) and Qdrant vector database. Enable both with Docker Compose profiles:

bash
docker compose --profile qdrant --profile sparse up -d

The following sections must be present in config.toml:

toml
[qdrant]
+    
Skip to content

Built-in Memory Provider

The built-in memory provider is the standard memory backend shipped with Memoh. It works with Memoh's memory pipeline and supports:

  • Automatic memory extraction from conversations
  • Semantic memory retrieval during chat
  • Manual memory creation and editing
  • Memory compaction and rebuild workflows

The built-in provider operates in one of three memory modes, each with different infrastructure requirements and retrieval capabilities.


Memory Modes

ModeIndexRequirementsUse Case
OffFile-based onlyNoneLightweight setup, no vector search
SparseNeural sparse vectorsSparse service + Qdrant (--profile sparse)Good retrieval quality without embedding API costs
DenseDense embeddingsEmbedding model + Qdrant (--profile qdrant)Highest-quality semantic search

How Sparse Mode Works

Sparse mode uses the opensearch-neural-sparse-encoding-multilingual-v1 model (from the OpenSearch project) to convert text into sparse vectors — compact lists of token indices with importance weights. Unlike dense mode, which requires an external embedding API, the sparse model runs locally in the sparse container with no API key or cost. It supports multiple languages and provides significantly better retrieval quality than keyword-only search.


Creating a Built-in Provider

  1. Navigate to the Memory Providers page.
  2. Click Add Memory Provider.
  3. Fill in the following fields:
    • Name: A display name for this provider.
    • Provider Type: Select builtin.
  4. Click Create.

Configuring a Built-in Provider

After creating a provider, select it from the list and configure its settings.

FieldDescription
Memory Modeoff (default), sparse, or dense. Controls how memories are indexed and retrieved.
Embedding ModelEmbedding model for dense vector search. Only used in dense mode.
Qdrant CollectionQdrant collection name. Defaults to memory_sparse.

Managing Providers

  • Edit: Select a provider and update its settings.
  • Delete: Remove a provider you no longer use.

Infrastructure Requirements

Off Mode

No additional infrastructure required. Memories are stored and retrieved using file-based indexing only.

Sparse Mode

Requires the sparse service (runs the opensearch-neural-sparse-encoding-multilingual-v1 model locally) and Qdrant vector database. Enable both with Docker Compose profiles:

bash
docker compose --profile qdrant --profile sparse up -d

The following sections must be present in config.toml:

toml
[qdrant]
 base_url = "http://qdrant:6334"
 
 [sparse]
 base_url = "http://sparse:8085"

Dense Mode

Requires an embedding model (configured in the provider settings) and Qdrant:

bash
docker compose --profile qdrant up -d

The Qdrant section must be present in config.toml:

toml
[qdrant]
-base_url = "http://qdrant:6334"

Assigning a Memory Provider to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Memory Provider dropdown.
  4. Select the provider you created.
  5. Click Save.

If no memory provider is selected, the bot will not use that provider configuration in its runtime settings.


Using Memory After Setup

Once a memory provider is assigned to the bot, you can manage actual memories from the bot's Memory tab:

  • Create memories manually
  • Extract memories from conversations
  • Search, edit, and delete memories
  • Compact or rebuild the memory store

For day-to-day memory operations, continue with Bot Memory Management.

Published under AGPLv3

- +base_url = "http://qdrant:6334"

Assigning a Memory Provider to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Memory Provider dropdown.
  4. Select the provider you created.
  5. Click Save.

If no memory provider is selected, the bot will not use that provider configuration in its runtime settings.


Using Memory After Setup

Once a memory provider is assigned to the bot, you can manage actual memories from the bot's Memory tab:

  • Create memories manually
  • Extract memories from conversations
  • Search, edit, and delete memories
  • Compact or rebuild the memory store

For day-to-day memory operations, continue with Bot Memory Management.

Published under AGPLv3

+ \ No newline at end of file diff --git a/memory-providers/index.html b/memory-providers/index.html index b5035a6f..efc91b9b 100644 --- a/memory-providers/index.html +++ b/memory-providers/index.html @@ -6,21 +6,21 @@ Memory Providers | Memoh Documentation - + - + - - - + + + -
Skip to content

Memory Providers

Memoh uses a Memory Provider to define how a bot stores, retrieves, and manages long-term memory. A bot can bind one memory provider in its General tab, and that provider becomes the backend for memory extraction and memory search.

Available Providers

Memoh supports the following memory providers:

  • Built-in: The default memory system included with Memoh. Supports three modes — off (file-based), sparse (neural sparse vectors), and dense (embedding-based semantic search). Fully self-hosted.
  • Mem0: SaaS memory provider via the Mem0 API. Requires an API key.
  • OpenViking: Self-hosted or SaaS memory provider with its own API.

Basic Flow

  1. Open the Memory Providers page from the sidebar.
  2. Create a provider instance using one of the supported provider types.
  3. Configure the provider settings.
  4. Open a bot's General tab and assign that provider in Memory Provider.
  5. Manage actual memories from the bot's Memory tab.

Next Steps

Published under AGPLv3

- +
Skip to content

Memory Providers

Memoh uses a Memory Provider to define how a bot stores, retrieves, and manages long-term memory. A bot can bind one memory provider in its General tab, and that provider becomes the backend for memory extraction and memory search.

Available Providers

Memoh supports the following memory providers:

  • Built-in: The default memory system included with Memoh. Supports three modes — off (file-based), sparse (neural sparse vectors), and dense (embedding-based semantic search). Fully self-hosted.
  • Mem0: SaaS memory provider via the Mem0 API. Requires an API key.
  • OpenViking: Self-hosted or SaaS memory provider with its own API.

Basic Flow

  1. Open the Memory Providers page from the sidebar.
  2. Create a provider instance using one of the supported provider types.
  3. Configure the provider settings.
  4. Open a bot's General tab and assign that provider in Memory Provider.
  5. Manage actual memories from the bot's Memory tab.

Next Steps

Published under AGPLv3

+ \ No newline at end of file diff --git a/memory-providers/mem0.html b/memory-providers/mem0.html index 6bc306b5..bdec00f8 100644 --- a/memory-providers/mem0.html +++ b/memory-providers/mem0.html @@ -6,21 +6,21 @@ Mem0 Memory Provider | Memoh Documentation - + - + - - - + + + -
Skip to content

Mem0 Memory Provider

Mem0 is a SaaS memory provider that connects your bot to the Mem0 platform. Instead of managing memory infrastructure yourself, Mem0 handles storage, retrieval, and indexing through its cloud API.


Creating a Mem0 Provider

  1. Navigate to the Memory Providers page.
  2. Click Add Memory Provider.
  3. Fill in the following fields:
    • Name: A display name for this provider.
    • Provider Type: Select mem0.
  4. Click Create.

Configuring a Mem0 Provider

After creating a provider, select it from the list and configure its settings.

FieldRequiredDescription
Base URLNoMem0 API base URL. Defaults to https://api.mem0.ai when empty.
API KeyYesAPI key for Mem0 authentication (stored as a secret).
Organization IDNoOrganization ID for workspace scoping.
Project IDNoProject ID for workspace scoping.

Assigning a Mem0 Provider to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Memory Provider dropdown.
  4. Select the Mem0 provider you created.
  5. Click Save.

Usage

Once assigned, the bot will use Mem0 as its memory backend. Memory extraction, search, and management operations are routed through the Mem0 API.

For day-to-day memory operations, see Bot Memory Management.

Published under AGPLv3

- +
Skip to content

Mem0 Memory Provider

Mem0 is a SaaS memory provider that connects your bot to the Mem0 platform. Instead of managing memory infrastructure yourself, Mem0 handles storage, retrieval, and indexing through its cloud API.


Creating a Mem0 Provider

  1. Navigate to the Memory Providers page.
  2. Click Add Memory Provider.
  3. Fill in the following fields:
    • Name: A display name for this provider.
    • Provider Type: Select mem0.
  4. Click Create.

Configuring a Mem0 Provider

After creating a provider, select it from the list and configure its settings.

FieldRequiredDescription
Base URLNoMem0 API base URL. Defaults to https://api.mem0.ai when empty.
API KeyYesAPI key for Mem0 authentication (stored as a secret).
Organization IDNoOrganization ID for workspace scoping.
Project IDNoProject ID for workspace scoping.

Assigning a Mem0 Provider to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Memory Provider dropdown.
  4. Select the Mem0 provider you created.
  5. Click Save.

Usage

Once assigned, the bot will use Mem0 as its memory backend. Memory extraction, search, and management operations are routed through the Mem0 API.

For day-to-day memory operations, see Bot Memory Management.

Published under AGPLv3

+ \ No newline at end of file diff --git a/memory-providers/openviking.html b/memory-providers/openviking.html index 361e06d4..09e072d9 100644 --- a/memory-providers/openviking.html +++ b/memory-providers/openviking.html @@ -6,21 +6,21 @@ OpenViking Memory Provider | Memoh Documentation - + - + - - - + + + -
Skip to content

OpenViking Memory Provider

OpenViking is a memory provider that can be self-hosted or used as a SaaS service. It provides an alternative memory backend for bots that need a dedicated memory API.


Creating an OpenViking Provider

  1. Navigate to the Memory Providers page.
  2. Click Add Memory Provider.
  3. Fill in the following fields:
    • Name: A display name for this provider.
    • Provider Type: Select openviking.
  4. Click Create.

Configuring an OpenViking Provider

After creating a provider, select it from the list and configure its settings.

FieldRequiredDescription
Base URLYesOpenViking API endpoint (e.g. http://openviking:8088).
API KeyNoAPI key for authentication (stored as a secret).

Assigning an OpenViking Provider to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Memory Provider dropdown.
  4. Select the OpenViking provider you created.
  5. Click Save.

Usage

Once assigned, the bot will use OpenViking as its memory backend. Memory extraction, search, and management operations are routed through the OpenViking API.

For day-to-day memory operations, see Bot Memory Management.

Published under AGPLv3

- +
Skip to content

OpenViking Memory Provider

OpenViking is a memory provider that can be self-hosted or used as a SaaS service. It provides an alternative memory backend for bots that need a dedicated memory API.


Creating an OpenViking Provider

  1. Navigate to the Memory Providers page.
  2. Click Add Memory Provider.
  3. Fill in the following fields:
    • Name: A display name for this provider.
    • Provider Type: Select openviking.
  4. Click Create.

Configuring an OpenViking Provider

After creating a provider, select it from the list and configure its settings.

FieldRequiredDescription
Base URLYesOpenViking API endpoint (e.g. http://openviking:8088).
API KeyNoAPI key for authentication (stored as a secret).

Assigning an OpenViking Provider to a Bot

  1. Navigate to the Bots page and open your bot.
  2. Go to the General tab.
  3. Find the Memory Provider dropdown.
  4. Select the OpenViking provider you created.
  5. Click Save.

Usage

Once assigned, the bot will use OpenViking as its memory backend. Memory extraction, search, and management operations are routed through the OpenViking API.

For day-to-day memory operations, see Bot Memory Management.

Published under AGPLv3

+ \ No newline at end of file diff --git a/tts-providers/edge.html b/tts-providers/edge.html index 1b0ef59a..7946e3dd 100644 --- a/tts-providers/edge.html +++ b/tts-providers/edge.html @@ -6,21 +6,21 @@ Edge TTS | Memoh Documentation - + - + - - - + + + -
Skip to content

Edge TTS

Edge TTS uses Microsoft Edge's public read-aloud API for speech synthesis. It is free, requires no API key, and supports 256+ voices across 50+ languages.


Creating an Edge TTS Provider

  1. Navigate to the TTS Providers page.
  2. Click Add.
  3. Select edge as the provider type.
  4. Click Create.

The default model edge-read-aloud is automatically imported when the provider is created.


Configuring the Model

Click the edge-read-aloud model to configure its settings.

FieldDescription
VoiceLanguage + voice ID. Default: en-US-EmmaMultilingualNeural. Over 256 voices available across 50+ languages.
FormatAudio output format. Options: audio-24khz-48kbitrate-mono-mp3 (default), audio-24khz-96kbitrate-mono-mp3, webm-24khz-16bit-mono-opus.
SpeedPlayback speed. Options: 0.5, 1.0 (default), 2.0, 3.0.
PitchVoice pitch adjustment. Range: -100 to +100, default 0.

Assigning to a Bot

  1. Open a bot's General tab.
  2. Find the TTS Model dropdown.
  3. Select the configured Edge TTS model.
  4. Click Save.

The bot can now synthesize speech using Edge TTS.


Testing

Use the built-in synthesis test button on the model configuration page to preview how the selected voice, format, speed, and pitch sound before assigning to a bot.

Published under AGPLv3

- +
Skip to content

Edge TTS

Edge TTS uses Microsoft Edge's public read-aloud API for speech synthesis. It is free, requires no API key, and supports 256+ voices across 50+ languages.


Creating an Edge TTS Provider

  1. Navigate to the TTS Providers page.
  2. Click Add.
  3. Select edge as the provider type.
  4. Click Create.

The default model edge-read-aloud is automatically imported when the provider is created.


Configuring the Model

Click the edge-read-aloud model to configure its settings.

FieldDescription
VoiceLanguage + voice ID. Default: en-US-EmmaMultilingualNeural. Over 256 voices available across 50+ languages.
FormatAudio output format. Options: audio-24khz-48kbitrate-mono-mp3 (default), audio-24khz-96kbitrate-mono-mp3, webm-24khz-16bit-mono-opus.
SpeedPlayback speed. Options: 0.5, 1.0 (default), 2.0, 3.0.
PitchVoice pitch adjustment. Range: -100 to +100, default 0.

Assigning to a Bot

  1. Open a bot's General tab.
  2. Find the TTS Model dropdown.
  3. Select the configured Edge TTS model.
  4. Click Save.

The bot can now synthesize speech using Edge TTS.


Testing

Use the built-in synthesis test button on the model configuration page to preview how the selected voice, format, speed, and pitch sound before assigning to a bot.

Published under AGPLv3

+ \ No newline at end of file diff --git a/tts-providers/index.html b/tts-providers/index.html index 13dd8798..094bb417 100644 --- a/tts-providers/index.html +++ b/tts-providers/index.html @@ -6,21 +6,21 @@ TTS Providers | Memoh Documentation - + - + - - - + + + -
Skip to content

TTS Providers

Memoh supports Text-to-Speech (TTS) so bots can synthesize spoken audio from text. The TTS system is organized into three layers:

  • TTS Provider: A service type (e.g. Edge TTS). You create named provider instances from the TTS Providers page.
  • TTS Model: A specific voice/model under a provider (e.g. edge-read-aloud). Models have configurable voice, format, speed, and pitch settings.
  • Bot Assignment: In Bot Settings, select a TTS Model. The bot can then synthesize speech in conversations.

Basic Flow

  1. Navigate to the TTS Providers page from the sidebar.
  2. Click Add and select a provider type (e.g. edge).
  3. Click Create — the provider's default model is auto-imported.
  4. Click the model to configure voice, format, speed, and pitch.
  5. Test synthesis with the built-in test button.
  6. Open a bot's General tab and select the TTS Model.
  7. Save — the bot can now synthesize speech.

Available Providers

ProviderDescription
Edge TTSFree, uses Microsoft Edge's public read-aloud API. 256+ voices across 50+ languages. No API key required.

Next Steps

  • To set up the currently available provider, continue with Edge TTS.

Published under AGPLv3

- +
Skip to content

TTS Providers

Memoh supports Text-to-Speech (TTS) so bots can synthesize spoken audio from text. The TTS system is organized into three layers:

  • TTS Provider: A service type (e.g. Edge TTS). You create named provider instances from the TTS Providers page.
  • TTS Model: A specific voice/model under a provider (e.g. edge-read-aloud). Models have configurable voice, format, speed, and pitch settings.
  • Bot Assignment: In Bot Settings, select a TTS Model. The bot can then synthesize speech in conversations.

Basic Flow

  1. Navigate to the TTS Providers page from the sidebar.
  2. Click Add and select a provider type (e.g. edge).
  3. Click Create — the provider's default model is auto-imported.
  4. Click the model to configure voice, format, speed, and pitch.
  5. Test synthesis with the built-in test button.
  6. Open a bot's General tab and select the TTS Model.
  7. Save — the bot can now synthesize speech.

Available Providers

ProviderDescription
Edge TTSFree, uses Microsoft Edge's public read-aloud API. 256+ voices across 50+ languages. No API key required.

Next Steps

  • To set up the currently available provider, continue with Edge TTS.

Published under AGPLv3

+ \ No newline at end of file diff --git a/zh/concepts/identity-and-binding.html b/zh/concepts/identity-and-binding.html index 8cc5eecc..6821335f 100644 --- a/zh/concepts/identity-and-binding.html +++ b/zh/concepts/identity-and-binding.html @@ -6,21 +6,21 @@ 账号模型与绑定 | Memoh Documentation - + - + - - - + + + -
Skip to content

账号模型与绑定

账号模型

Memoh 将平台账号与系统账号视为两类不同实体:

  • 平台账号(ChannelIdentity 是用户在外部接入平台上的账号(例如飞书账号),不是 Memoh 内部账号。
  • 系统账号(User 是 Memoh 系统内账号。

平台账号在初始阶段可以不绑定系统账号。
bind 的职责是完成这两类账号的关联。

接入平台与 Bot

  • 接入平台(channel 是入站消息来源。
  • Bot 是系统内的授权与资源边界。

Bot 由系统账号管理,入站消息由平台账号产生。

为什么账号绑定是账号作用域

账号绑定的目标是建立账号归属关系,而不是直接发放 bot 资源权限:

  • 它只负责平台账号与系统账号的绑定;
  • 不把账号绑定与成员管理语义耦合在一起;
  • 让 bot 访问控制保持独立、可演进。

账号绑定流程(当前共识)

  1. 用户以自己的系统账号申请 bind code;
  2. 平台账号在支持的接入平台会话中发送 code;
  3. 系统校验 code,完成平台账号到系统账号的绑定;
  4. bot 成员与授权由独立流程处理。

Bot 类型语义

  • Public bot:支持成员协作语义。
  • Personal bot:语义上应为单 owner,不应依赖成员机制。

注:本文档记录的是产品语义与共识方向。
部分运行时细节仍可能处于收敛阶段。

Published under AGPLv3

- +
Skip to content

账号模型与绑定

账号模型

Memoh 将平台账号与系统账号视为两类不同实体:

  • 平台账号(ChannelIdentity 是用户在外部接入平台上的账号(例如飞书账号),不是 Memoh 内部账号。
  • 系统账号(User 是 Memoh 系统内账号。

平台账号在初始阶段可以不绑定系统账号。
bind 的职责是完成这两类账号的关联。

接入平台与 Bot

  • 接入平台(channel 是入站消息来源。
  • Bot 是系统内的授权与资源边界。

Bot 由系统账号管理,入站消息由平台账号产生。

为什么账号绑定是账号作用域

账号绑定的目标是建立账号归属关系,而不是直接发放 bot 资源权限:

  • 它只负责平台账号与系统账号的绑定;
  • 不把账号绑定与成员管理语义耦合在一起;
  • 让 bot 访问控制保持独立、可演进。

账号绑定流程(当前共识)

  1. 用户以自己的系统账号申请 bind code;
  2. 平台账号在支持的接入平台会话中发送 code;
  3. 系统校验 code,完成平台账号到系统账号的绑定;
  4. bot 成员与授权由独立流程处理。

Bot 类型语义

  • Public bot:支持成员协作语义。
  • Personal bot:语义上应为单 owner,不应依赖成员机制。

注:本文档记录的是产品语义与共识方向。
部分运行时细节仍可能处于收敛阶段。

Published under AGPLv3

+ \ No newline at end of file diff --git a/zh/concepts/index.html b/zh/concepts/index.html index d620bcd5..893bae74 100644 --- a/zh/concepts/index.html +++ b/zh/concepts/index.html @@ -6,21 +6,21 @@ 核心概念 | Memoh Documentation - + - + - - - + + + -
Skip to content

核心概念

本章节用于定义 Memoh 的核心账号与访问概念。

概念图

  • 系统账号(User:Memoh 系统内账号。
  • 平台账号(ChannelIdentity:用户在外部接入平台上的账号,不是 Memoh 系统内账号(例如用户的飞书账号)。
  • Bot:由系统账号管理的资源与访问边界。
  • 账号绑定(bind:把平台账号关联到系统账号的过程。

为什么重要

Memoh 需要同时处理外部接入平台消息与系统内权限控制。
因此我们明确区分平台账号与系统账号,并将 bot 授权与账号绑定解耦。

术语说明:文档中的“平台账号”统一指用户在对应平台上的真实账号(如飞书账号),不指本项目内部账号。

本章内容

Published under AGPLv3

- +
Skip to content

核心概念

本章节用于定义 Memoh 的核心账号与访问概念。

概念图

  • 系统账号(User:Memoh 系统内账号。
  • 平台账号(ChannelIdentity:用户在外部接入平台上的账号,不是 Memoh 系统内账号(例如用户的飞书账号)。
  • Bot:由系统账号管理的资源与访问边界。
  • 账号绑定(bind:把平台账号关联到系统账号的过程。

为什么重要

Memoh 需要同时处理外部接入平台消息与系统内权限控制。
因此我们明确区分平台账号与系统账号,并将 bot 授权与账号绑定解耦。

术语说明:文档中的“平台账号”统一指用户在对应平台上的真实账号(如飞书账号),不指本项目内部账号。

本章内容

Published under AGPLv3

+ \ No newline at end of file diff --git a/zh/index.html b/zh/index.html index 09406246..ef140664 100644 --- a/zh/index.html +++ b/zh/index.html @@ -6,21 +6,21 @@ Memoh 文档 | Memoh Documentation - + - + - - - + + + -
Skip to content

Memoh 文档

Memoh 是一个多成员、长记忆、容器化的 AI Agent 系统。

文档章节

面向文档贡献者

当前维护范围

当前文档先聚焦账号语义与访问控制:

  • 区分系统账号与平台账号
  • 解释为什么账号绑定是账号作用域
  • 说明账号绑定与 bot 访问控制之间的关系

说明:“平台账号”指用户在外部平台上的真实账号(例如飞书账号),不是 Memoh 系统账号。

Published under AGPLv3

- +
Skip to content

Memoh 文档

Memoh 是一个多成员、长记忆、容器化的 AI Agent 系统。

文档章节

面向文档贡献者

当前维护范围

当前文档先聚焦账号语义与访问控制:

  • 区分系统账号与平台账号
  • 解释为什么账号绑定是账号作用域
  • 说明账号绑定与 bot 访问控制之间的关系

说明:“平台账号”指用户在外部平台上的真实账号(例如飞书账号),不是 Memoh 系统账号。

Published under AGPLv3

+ \ No newline at end of file diff --git a/zh/style/terminology.html b/zh/style/terminology.html index 53aa6c1e..fcbbc891 100644 --- a/zh/style/terminology.html +++ b/zh/style/terminology.html @@ -6,21 +6,21 @@ 术语规范 | Memoh Documentation - + - + - - - + + + -
Skip to content

术语规范

适用对象:文档编写者与维护者。 本页用于统一写作语义,不是面向最终用户的功能说明。

规范术语

  • 系统账号(User:Memoh 系统内账号。
  • 平台账号(ChannelIdentity:用户在外部接入平台上的账号,不是 Memoh 内账号。
  • 接入平台(channel:承载入站消息的外部平台。
  • 账号绑定(bind:把平台账号关联到系统账号的过程。
  • 绑定码(Bind Code):用于账号绑定的一次性代码。
  • Bot:由系统账号管理的资源与授权边界。

推荐写法

  • 面向产品语义时,优先写 “平台账号”,不要直接写 actor。
  • 描述业务行为时,优先写 “接入平台”,不要直接写 channel。
  • 首次出现保留技术别名,后续可只用中文术语:
    • 平台账号(ChannelIdentity
    • 系统账号(User
    • 账号绑定(bind

禁用或不推荐写法

  • 在概念文档中直接使用 actor(除非明确引用代码符号)。
  • 使用含糊表述如 “平台用户”(未区分系统账号与平台账号)。
  • 写出“平台账号是 Memoh 内部账号”这类错误语义。

示例

  • 正确:“平台账号是用户在飞书上的账号,不是 Memoh 系统账号。”
  • 正确:“账号绑定用于把平台账号关联到系统账号。”
  • 错误:“Actor 是 Memoh 里的用户。”

自检清单

  • 是否明确区分了系统账号与平台账号?
  • 叙述中是否将 channel 表述为接入平台?
  • 是否仅在首处保留技术别名?

Published under AGPLv3

- +
Skip to content

术语规范

适用对象:文档编写者与维护者。 本页用于统一写作语义,不是面向最终用户的功能说明。

规范术语

  • 系统账号(User:Memoh 系统内账号。
  • 平台账号(ChannelIdentity:用户在外部接入平台上的账号,不是 Memoh 内账号。
  • 接入平台(channel:承载入站消息的外部平台。
  • 账号绑定(bind:把平台账号关联到系统账号的过程。
  • 绑定码(Bind Code):用于账号绑定的一次性代码。
  • Bot:由系统账号管理的资源与授权边界。

推荐写法

  • 面向产品语义时,优先写 “平台账号”,不要直接写 actor。
  • 描述业务行为时,优先写 “接入平台”,不要直接写 channel。
  • 首次出现保留技术别名,后续可只用中文术语:
    • 平台账号(ChannelIdentity
    • 系统账号(User
    • 账号绑定(bind

禁用或不推荐写法

  • 在概念文档中直接使用 actor(除非明确引用代码符号)。
  • 使用含糊表述如 “平台用户”(未区分系统账号与平台账号)。
  • 写出“平台账号是 Memoh 内部账号”这类错误语义。

示例

  • 正确:“平台账号是用户在飞书上的账号,不是 Memoh 系统账号。”
  • 正确:“账号绑定用于把平台账号关联到系统账号。”
  • 错误:“Actor 是 Memoh 里的用户。”

自检清单

  • 是否明确区分了系统账号与平台账号?
  • 叙述中是否将 channel 表述为接入平台?
  • 是否仅在首处保留技术别名?

Published under AGPLv3

+ \ No newline at end of file