@sriinnu/kosha-discovery 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +286 -0
- package/dist/aliases.d.ts +51 -0
- package/dist/aliases.d.ts.map +1 -0
- package/dist/aliases.js +115 -0
- package/dist/aliases.js.map +1 -0
- package/dist/cache.d.ts +57 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +123 -0
- package/dist/cache.js.map +1 -0
- package/dist/cli-commands.d.ts +142 -0
- package/dist/cli-commands.d.ts.map +1 -0
- package/dist/cli-commands.js +746 -0
- package/dist/cli-commands.js.map +1 -0
- package/dist/cli-format.d.ts +119 -0
- package/dist/cli-format.d.ts.map +1 -0
- package/dist/cli-format.js +171 -0
- package/dist/cli-format.js.map +1 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +143 -0
- package/dist/cli.js.map +1 -0
- package/dist/credentials/index.d.ts +2 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +2 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/credentials/resolver.d.ts +170 -0
- package/dist/credentials/resolver.d.ts.map +1 -0
- package/dist/credentials/resolver.js +597 -0
- package/dist/credentials/resolver.js.map +1 -0
- package/dist/discovery/anthropic.d.ts +49 -0
- package/dist/discovery/anthropic.d.ts.map +1 -0
- package/dist/discovery/anthropic.js +101 -0
- package/dist/discovery/anthropic.js.map +1 -0
- package/dist/discovery/base.d.ts +59 -0
- package/dist/discovery/base.d.ts.map +1 -0
- package/dist/discovery/base.js +123 -0
- package/dist/discovery/base.js.map +1 -0
- package/dist/discovery/bedrock.d.ts +122 -0
- package/dist/discovery/bedrock.d.ts.map +1 -0
- package/dist/discovery/bedrock.js +356 -0
- package/dist/discovery/bedrock.js.map +1 -0
- package/dist/discovery/cerebras.d.ts +43 -0
- package/dist/discovery/cerebras.d.ts.map +1 -0
- package/dist/discovery/cerebras.js +65 -0
- package/dist/discovery/cerebras.js.map +1 -0
- package/dist/discovery/cohere.d.ts +57 -0
- package/dist/discovery/cohere.d.ts.map +1 -0
- package/dist/discovery/cohere.js +82 -0
- package/dist/discovery/cohere.js.map +1 -0
- package/dist/discovery/deepinfra.d.ts +41 -0
- package/dist/discovery/deepinfra.d.ts.map +1 -0
- package/dist/discovery/deepinfra.js +86 -0
- package/dist/discovery/deepinfra.js.map +1 -0
- package/dist/discovery/deepseek.d.ts +17 -0
- package/dist/discovery/deepseek.d.ts.map +1 -0
- package/dist/discovery/deepseek.js +45 -0
- package/dist/discovery/deepseek.js.map +1 -0
- package/dist/discovery/fireworks.d.ts +48 -0
- package/dist/discovery/fireworks.d.ts.map +1 -0
- package/dist/discovery/fireworks.js +101 -0
- package/dist/discovery/fireworks.js.map +1 -0
- package/dist/discovery/glm.d.ts +17 -0
- package/dist/discovery/glm.d.ts.map +1 -0
- package/dist/discovery/glm.js +52 -0
- package/dist/discovery/glm.js.map +1 -0
- package/dist/discovery/google.d.ts +53 -0
- package/dist/discovery/google.d.ts.map +1 -0
- package/dist/discovery/google.js +122 -0
- package/dist/discovery/google.js.map +1 -0
- package/dist/discovery/groq.d.ts +44 -0
- package/dist/discovery/groq.d.ts.map +1 -0
- package/dist/discovery/groq.js +89 -0
- package/dist/discovery/groq.js.map +1 -0
- package/dist/discovery/index.d.ts +48 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +116 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/llama-cpp.d.ts +45 -0
- package/dist/discovery/llama-cpp.d.ts.map +1 -0
- package/dist/discovery/llama-cpp.js +137 -0
- package/dist/discovery/llama-cpp.js.map +1 -0
- package/dist/discovery/minimax.d.ts +16 -0
- package/dist/discovery/minimax.d.ts.map +1 -0
- package/dist/discovery/minimax.js +56 -0
- package/dist/discovery/minimax.js.map +1 -0
- package/dist/discovery/mistral.d.ts +45 -0
- package/dist/discovery/mistral.d.ts.map +1 -0
- package/dist/discovery/mistral.js +82 -0
- package/dist/discovery/mistral.js.map +1 -0
- package/dist/discovery/moonshot.d.ts +16 -0
- package/dist/discovery/moonshot.d.ts.map +1 -0
- package/dist/discovery/moonshot.js +46 -0
- package/dist/discovery/moonshot.js.map +1 -0
- package/dist/discovery/nvidia.d.ts +60 -0
- package/dist/discovery/nvidia.d.ts.map +1 -0
- package/dist/discovery/nvidia.js +145 -0
- package/dist/discovery/nvidia.js.map +1 -0
- package/dist/discovery/ollama.d.ts +57 -0
- package/dist/discovery/ollama.d.ts.map +1 -0
- package/dist/discovery/ollama.js +151 -0
- package/dist/discovery/ollama.js.map +1 -0
- package/dist/discovery/openai-compatible.d.ts +126 -0
- package/dist/discovery/openai-compatible.d.ts.map +1 -0
- package/dist/discovery/openai-compatible.js +161 -0
- package/dist/discovery/openai-compatible.js.map +1 -0
- package/dist/discovery/openai.d.ts +62 -0
- package/dist/discovery/openai.d.ts.map +1 -0
- package/dist/discovery/openai.js +157 -0
- package/dist/discovery/openai.js.map +1 -0
- package/dist/discovery/openrouter.d.ts +78 -0
- package/dist/discovery/openrouter.d.ts.map +1 -0
- package/dist/discovery/openrouter.js +184 -0
- package/dist/discovery/openrouter.js.map +1 -0
- package/dist/discovery/perplexity.d.ts +66 -0
- package/dist/discovery/perplexity.d.ts.map +1 -0
- package/dist/discovery/perplexity.js +86 -0
- package/dist/discovery/perplexity.js.map +1 -0
- package/dist/discovery/together.d.ts +41 -0
- package/dist/discovery/together.d.ts.map +1 -0
- package/dist/discovery/together.js +88 -0
- package/dist/discovery/together.js.map +1 -0
- package/dist/discovery/vertex.d.ts +146 -0
- package/dist/discovery/vertex.d.ts.map +1 -0
- package/dist/discovery/vertex.js +371 -0
- package/dist/discovery/vertex.js.map +1 -0
- package/dist/discovery/zai.d.ts +17 -0
- package/dist/discovery/zai.d.ts.map +1 -0
- package/dist/discovery/zai.js +51 -0
- package/dist/discovery/zai.js.map +1 -0
- package/dist/discovery-contract.d.ts +186 -0
- package/dist/discovery-contract.d.ts.map +1 -0
- package/dist/discovery-contract.js +115 -0
- package/dist/discovery-contract.js.map +1 -0
- package/dist/discovery-routes.d.ts +14 -0
- package/dist/discovery-routes.d.ts.map +1 -0
- package/dist/discovery-routes.js +98 -0
- package/dist/discovery-routes.js.map +1 -0
- package/dist/enrichment/index.d.ts +2 -0
- package/dist/enrichment/index.d.ts.map +1 -0
- package/dist/enrichment/index.js +2 -0
- package/dist/enrichment/index.js.map +1 -0
- package/dist/enrichment/litellm.d.ts +52 -0
- package/dist/enrichment/litellm.d.ts.map +1 -0
- package/dist/enrichment/litellm.js +205 -0
- package/dist/enrichment/litellm.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/normalize.d.ts +64 -0
- package/dist/normalize.d.ts.map +1 -0
- package/dist/normalize.js +166 -0
- package/dist/normalize.js.map +1 -0
- package/dist/provider-catalog.d.ts +62 -0
- package/dist/provider-catalog.d.ts.map +1 -0
- package/dist/provider-catalog.js +331 -0
- package/dist/provider-catalog.js.map +1 -0
- package/dist/registry-delta.d.ts +17 -0
- package/dist/registry-delta.d.ts.map +1 -0
- package/dist/registry-delta.js +74 -0
- package/dist/registry-delta.js.map +1 -0
- package/dist/registry-discovery.d.ts +66 -0
- package/dist/registry-discovery.d.ts.map +1 -0
- package/dist/registry-discovery.js +339 -0
- package/dist/registry-discovery.js.map +1 -0
- package/dist/registry-query.d.ts +74 -0
- package/dist/registry-query.d.ts.map +1 -0
- package/dist/registry-query.js +310 -0
- package/dist/registry-query.js.map +1 -0
- package/dist/registry-runtime.d.ts +48 -0
- package/dist/registry-runtime.d.ts.map +1 -0
- package/dist/registry-runtime.js +255 -0
- package/dist/registry-runtime.js.map +1 -0
- package/dist/registry-selection.d.ts +31 -0
- package/dist/registry-selection.d.ts.map +1 -0
- package/dist/registry-selection.js +167 -0
- package/dist/registry-selection.js.map +1 -0
- package/dist/registry-state.d.ts +92 -0
- package/dist/registry-state.d.ts.map +1 -0
- package/dist/registry-state.js +35 -0
- package/dist/registry-state.js.map +1 -0
- package/dist/registry.d.ts +127 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +248 -0
- package/dist/registry.js.map +1 -0
- package/dist/resilience.d.ts +212 -0
- package/dist/resilience.d.ts.map +1 -0
- package/dist/resilience.js +292 -0
- package/dist/resilience.js.map +1 -0
- package/dist/security.d.ts +44 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +184 -0
- package/dist/security.js.map +1 -0
- package/dist/server.d.ts +41 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +320 -0
- package/dist/server.js.map +1 -0
- package/dist/shell-safe.d.ts +15 -0
- package/dist/shell-safe.d.ts.map +1 -0
- package/dist/shell-safe.js +20 -0
- package/dist/shell-safe.js.map +1 -0
- package/dist/types.d.ts +365 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/logo.svg +81 -0
- package/package.json +85 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Multi-source credential resolver.
|
|
3
|
+
*
|
|
4
|
+
* Implements a layered search strategy to locate API keys and
|
|
5
|
+
* access tokens for each supported provider. The search hierarchy is:
|
|
6
|
+
*
|
|
7
|
+
* 1. **Explicit config** — key passed directly via `KoshaConfig.providers`
|
|
8
|
+
* 2. **Environment variables** — e.g. `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`
|
|
9
|
+
* 3. **CLI tool credential files** — Claude CLI, Copilot, Codex, Gemini CLI
|
|
10
|
+
* 4. **Config / OAuth files** — `~/.config/*`, gcloud ADC, `~/.aws/*`
|
|
11
|
+
* 5. **CLI subprocess** — `gcloud auth print-access-token` etc.
|
|
12
|
+
*
|
|
13
|
+
* The resolver returns the **first** credential found and never throws.
|
|
14
|
+
* If nothing is found, `{ source: "none" }` is returned.
|
|
15
|
+
* @module
|
|
16
|
+
*/
|
|
17
|
+
import type { CredentialResult } from "../types.js";
|
|
18
|
+
/**
|
|
19
|
+
* Multi-source credential resolver for AI providers.
|
|
20
|
+
*
|
|
21
|
+
* Resolution priority per provider:
|
|
22
|
+
* 1. Explicit config key (passed programmatically)
|
|
23
|
+
* 2. Environment variables
|
|
24
|
+
* 3. CLI tool credential files (Claude CLI, Copilot, Gemini CLI, etc.)
|
|
25
|
+
* 4. Config / OAuth files (~/.config/*)
|
|
26
|
+
*
|
|
27
|
+
* Always returns a {@link CredentialResult}; never throws.
|
|
28
|
+
*/
|
|
29
|
+
export declare class CredentialResolver {
|
|
30
|
+
private readonly home;
|
|
31
|
+
private readonly isWindows;
|
|
32
|
+
/**
|
|
33
|
+
* Resolve credentials for the given provider.
|
|
34
|
+
*
|
|
35
|
+
* @param providerId - Provider slug (e.g. "anthropic", "openai").
|
|
36
|
+
* @param explicitKey - Optional API key passed from user config; takes
|
|
37
|
+
* highest precedence when provided.
|
|
38
|
+
* @returns The first credential found, or `{ source: "none" }`.
|
|
39
|
+
*/
|
|
40
|
+
resolve(providerId: string, explicitKey?: string): Promise<CredentialResult>;
|
|
41
|
+
/**
|
|
42
|
+
* Search hierarchy for Anthropic credentials:
|
|
43
|
+
* 1. Explicit config key
|
|
44
|
+
* 2. `ANTHROPIC_API_KEY` env var
|
|
45
|
+
* 3. `~/.claude.json` (Claude CLI)
|
|
46
|
+
* 4. `~/.config/claude/settings.json` (Claude CLI settings)
|
|
47
|
+
* 5. `~/.claude/credentials.json` (Claude CLI OAuth)
|
|
48
|
+
* 6. `~/.codex/auth.json` (Codex CLI — stores Anthropic keys)
|
|
49
|
+
*/
|
|
50
|
+
private resolveAnthropic;
|
|
51
|
+
/**
|
|
52
|
+
* Search hierarchy for OpenAI credentials:
|
|
53
|
+
* 1. Explicit config key
|
|
54
|
+
* 2. `OPENAI_API_KEY` env var
|
|
55
|
+
* 3. GitHub Copilot `hosts.json` (contains an OAuth token usable with OpenAI-compatible APIs)
|
|
56
|
+
* 4. GitHub Copilot `apps.json` (alternative credential location)
|
|
57
|
+
*/
|
|
58
|
+
private resolveOpenAI;
|
|
59
|
+
/**
|
|
60
|
+
* Search hierarchy for Google / Gemini credentials:
|
|
61
|
+
* 1. Explicit config key
|
|
62
|
+
* 2. `GOOGLE_API_KEY` or `GEMINI_API_KEY` env var
|
|
63
|
+
* 3. Gemini CLI `~/.gemini/credentials.json`
|
|
64
|
+
* 4. gcloud Application Default Credentials (ADC)
|
|
65
|
+
*/
|
|
66
|
+
private resolveGoogle;
|
|
67
|
+
/**
|
|
68
|
+
* Search hierarchy for OpenRouter credentials:
|
|
69
|
+
* 1. Explicit config key
|
|
70
|
+
* 2. `OPENROUTER_API_KEY` env var
|
|
71
|
+
* (No known CLI tool stores OpenRouter keys on disk.)
|
|
72
|
+
*/
|
|
73
|
+
private resolveOpenRouter;
|
|
74
|
+
/**
|
|
75
|
+
* Ollama runs locally and never requires authentication.
|
|
76
|
+
* Returns `{ source: "none" }` unconditionally.
|
|
77
|
+
*/
|
|
78
|
+
private resolveOllama;
|
|
79
|
+
/**
|
|
80
|
+
* Search hierarchy for AWS Bedrock credentials:
|
|
81
|
+
* 1. Explicit config key (`config.providers.bedrock.apiKey` or `config.providers.aws.apiKey`)
|
|
82
|
+
* 2. `AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY` env vars (both must be present)
|
|
83
|
+
* 3. `AWS_PROFILE` env var — signals a named profile in `~/.aws/credentials`
|
|
84
|
+
* 4. `~/.aws/credentials` — reads the `[default]` profile's `aws_access_key_id`
|
|
85
|
+
* 5. `~/.aws/config` — detects SSO or IAM role configuration (presence check only)
|
|
86
|
+
*
|
|
87
|
+
* The returned `metadata.region` is resolved from (in order):
|
|
88
|
+
* `AWS_DEFAULT_REGION` → `AWS_REGION` → `region` in `~/.aws/config [default]` → `"us-east-1"`
|
|
89
|
+
*
|
|
90
|
+
* @param explicitKey - Optional AWS access key ID passed from user config.
|
|
91
|
+
* @returns Resolved credential with `key` (access key ID or sentinel) and `metadata.region`.
|
|
92
|
+
*/
|
|
93
|
+
private resolveBedrockCredential;
|
|
94
|
+
/**
|
|
95
|
+
* Resolve the effective AWS region from environment variables or the
|
|
96
|
+
* parsed `~/.aws/config` content.
|
|
97
|
+
*
|
|
98
|
+
* Priority: `AWS_DEFAULT_REGION` → `AWS_REGION` → `region` in `[default]`
|
|
99
|
+
* profile of the provided config text → `"us-east-1"` fallback.
|
|
100
|
+
*
|
|
101
|
+
* @param awsConfigRaw - Optional raw text of `~/.aws/config` already read by the caller.
|
|
102
|
+
* @returns The resolved region string.
|
|
103
|
+
*/
|
|
104
|
+
private resolveAwsRegion;
|
|
105
|
+
/**
|
|
106
|
+
* Parse a single named section from an AWS INI-format file.
|
|
107
|
+
*
|
|
108
|
+
* AWS credential/config files use INI syntax with `[section]` headers and
|
|
109
|
+
* `key = value` pairs. This parser is intentionally minimal: it only extracts
|
|
110
|
+
* key-value pairs belonging to the requested section and ignores all others.
|
|
111
|
+
*
|
|
112
|
+
* @param text - Raw file content.
|
|
113
|
+
* @param sectionName - Section header to extract (without brackets), e.g. `"default"`.
|
|
114
|
+
* @returns A map of key → value strings found within the section, or `{}` if not found.
|
|
115
|
+
*/
|
|
116
|
+
private parseAwsIniSection;
|
|
117
|
+
/**
|
|
118
|
+
* Search hierarchy for GCP Vertex AI credentials:
|
|
119
|
+
* 1. Explicit config key (`config.providers.vertex.apiKey`)
|
|
120
|
+
* 2. `GOOGLE_APPLICATION_CREDENTIALS` env var — path to service account JSON
|
|
121
|
+
* 3. `~/.config/gcloud/application_default_credentials.json` (gcloud ADC)
|
|
122
|
+
* 4. `gcloud auth print-access-token` subprocess (5 s timeout)
|
|
123
|
+
*
|
|
124
|
+
* The returned `metadata` always contains `region` and optionally `projectId`
|
|
125
|
+
* resolved from (in order):
|
|
126
|
+
* - `GOOGLE_CLOUD_PROJECT` / `GCLOUD_PROJECT` env vars
|
|
127
|
+
* - `gcloud config get-value project` subprocess
|
|
128
|
+
*
|
|
129
|
+
* @param explicitKey - Optional explicit key or service-account path from user config.
|
|
130
|
+
* @returns Resolved credential with `key` and `metadata.{ projectId?, region }`.
|
|
131
|
+
*/
|
|
132
|
+
private resolveVertexCredential;
|
|
133
|
+
/**
|
|
134
|
+
* Resolve Vertex AI metadata: GCP project ID and region.
|
|
135
|
+
*
|
|
136
|
+
* Project ID priority: `GOOGLE_CLOUD_PROJECT` → `GCLOUD_PROJECT` → `gcloud config get-value project`
|
|
137
|
+
* Region priority: `GOOGLE_CLOUD_REGION` → `"us-central1"`
|
|
138
|
+
*
|
|
139
|
+
* @returns Metadata object with `region` (always set) and optional `projectId`.
|
|
140
|
+
*/
|
|
141
|
+
private resolveVertexMetadata;
|
|
142
|
+
/**
|
|
143
|
+
* Run `gcloud auth print-access-token` and return the trimmed token.
|
|
144
|
+
* Returns `null` on any error (gcloud not installed, not authenticated, timeout, etc.).
|
|
145
|
+
*/
|
|
146
|
+
private execGcloudToken;
|
|
147
|
+
/**
|
|
148
|
+
* Run `gcloud config get-value project` and return the trimmed project ID.
|
|
149
|
+
* Returns `null` on any error.
|
|
150
|
+
*/
|
|
151
|
+
private execGcloudProject;
|
|
152
|
+
/**
|
|
153
|
+
* Generic resolver for providers that only need an explicit key or a single env var.
|
|
154
|
+
* Used by NVIDIA, Together AI, Fireworks AI, Groq, and Mistral AI.
|
|
155
|
+
*/
|
|
156
|
+
private resolveNvidia;
|
|
157
|
+
private resolveSimpleEnvKey;
|
|
158
|
+
private resolveMultiEnvKey;
|
|
159
|
+
/** Safely read and parse a JSON file; returns null on any error. */
|
|
160
|
+
private readJson;
|
|
161
|
+
/** Safely read a text file as a string; returns null on any error. */
|
|
162
|
+
private readTextFile;
|
|
163
|
+
/** Return candidate paths for GitHub Copilot config files. */
|
|
164
|
+
private getCopilotPaths;
|
|
165
|
+
/** Return candidate paths for gcloud ADC. */
|
|
166
|
+
private getGcloudPaths;
|
|
167
|
+
/** Extract the first OAuth token from a Copilot hosts/apps JSON structure. */
|
|
168
|
+
private extractCopilotToken;
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/credentials/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;;GAUG;AACH,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IAEpD;;;;;;;OAOG;IACG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuDlF;;;;;;;;OAQG;YACW,gBAAgB;IAuD9B;;;;;;OAMG;YACW,aAAa;IA2C3B;;;;;;OAMG;YACW,aAAa;IAkD3B;;;;;OAKG;YACW,iBAAiB;IAoB/B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAQrB;;;;;;;;;;;;;OAaG;YACW,wBAAwB;IAqDtC;;;;;;;;;OASG;YACW,gBAAgB;IAsB9B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,kBAAkB;IAkC1B;;;;;;;;;;;;;;OAcG;YACW,uBAAuB;IA0CrC;;;;;;;OAOG;YACW,qBAAqB;IAkBnC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAavB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,kBAAkB;IAmB1B,oEAAoE;YACtD,QAAQ;IAStB,sEAAsE;YACxD,YAAY;IAQ1B,8DAA8D;IAC9D,OAAO,CAAC,eAAe;IAiBvB,6CAA6C;IAC7C,OAAO,CAAC,cAAc;IAetB,8EAA8E;IAC9E,OAAO,CAAC,mBAAmB;CAS3B"}
|