@chatcode/cco-llm-chatcode-config 0.1.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 +124 -0
- package/README.zh.md +133 -0
- package/cordis.patch.yml +4 -0
- package/cordis.web.patch.yml +12 -0
- package/docs/chatcode-login.md +88 -0
- package/docs/chatcode-login.zh.md +179 -0
- package/docs/chatcode-models.md +29 -0
- package/docs/chatcode-models.zh.md +29 -0
- package/docs/chatcode-reporting.md +96 -0
- package/docs/chatcode-reporting.zh.md +96 -0
- package/docs/decisions/2026-08-31-chatcode-model-source.md +39 -0
- package/docs/decisions/2026-08-31-chatcode-model-source.zh.md +39 -0
- package/docs/decisions/2026-09-16-actual-model-adapter-routing.md +31 -0
- package/docs/decisions/2026-09-16-actual-model-adapter-routing.zh.md +31 -0
- package/lib/client.js +469 -0
- package/lib/index.d.ts +263 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +4873 -0
- package/lib/index.js.map +1 -0
- package/lib/startup-gate-BaCbWaKH.js +164 -0
- package/lib/startup-gate-BaCbWaKH.js.map +1 -0
- package/lib/web-startup.d.ts +9 -0
- package/lib/web-startup.d.ts.map +1 -0
- package/lib/web-startup.js +20 -0
- package/lib/web-startup.js.map +1 -0
- package/package.json +121 -0
- package/vendor/README.md +7 -0
- package/vendor/dsh-llm-pi-ai/LICENSE +21 -0
- package/vendor/dsh-llm-pi-ai/README.i18n.yaml +6 -0
- package/vendor/dsh-llm-pi-ai/README.md +238 -0
- package/vendor/dsh-llm-pi-ai/README.zh.md +238 -0
- package/vendor/dsh-llm-pi-ai/package.json +65 -0
- package/vendor/dsh-llm-pi-ai/src/adapter.ts +434 -0
- package/vendor/dsh-llm-pi-ai/src/auth.ts +241 -0
- package/vendor/dsh-llm-pi-ai/src/catalog.ts +908 -0
- package/vendor/dsh-llm-pi-ai/src/config.ts +478 -0
- package/vendor/dsh-llm-pi-ai/src/context.ts +349 -0
- package/vendor/dsh-llm-pi-ai/src/discovery.ts +284 -0
- package/vendor/dsh-llm-pi-ai/src/index.ts +336 -0
- package/vendor/dsh-llm-pi-ai/src/invariant.ts +30 -0
- package/vendor/dsh-llm-pi-ai/src/login.ts +161 -0
- package/vendor/dsh-llm-pi-ai/src/provider.ts +192 -0
- package/vendor/dsh-llm-pi-ai/src/replay.ts +249 -0
- package/vendor/dsh-llm-pi-ai/src/stream.ts +232 -0
- package/vendor/dsh-llm-pi-ai/tests/adapter.e2e.ts +168 -0
- package/vendor/dsh-llm-pi-ai/tests/adapter.spec.ts +1034 -0
- package/vendor/dsh-llm-pi-ai/tests/assemble.ts +32 -0
- package/vendor/dsh-llm-pi-ai/tests/auth-double.ts +39 -0
- package/vendor/dsh-llm-pi-ai/tests/auth.spec.ts +221 -0
- package/vendor/dsh-llm-pi-ai/tests/catalog.spec.ts +1220 -0
- package/vendor/dsh-llm-pi-ai/tests/config.spec.ts +111 -0
- package/vendor/dsh-llm-pi-ai/tests/context.spec.ts +474 -0
- package/vendor/dsh-llm-pi-ai/tests/convert.spec.ts +922 -0
- package/vendor/dsh-llm-pi-ai/tests/discovery.spec.ts +374 -0
- package/vendor/dsh-llm-pi-ai/tests/dynamic-config.spec.ts +241 -0
- package/vendor/dsh-llm-pi-ai/tests/fixtures/qr-code.png +0 -0
- package/vendor/dsh-llm-pi-ai/tests/loader-composition.spec.ts +244 -0
- package/vendor/dsh-llm-pi-ai/tests/login.spec.ts +198 -0
- package/vendor/dsh-llm-pi-ai/tests/mock-server.ts +82 -0
- package/vendor/dsh-llm-pi-ai/tests/provider-apis.e2e.ts +266 -0
- package/vendor/dsh-llm-pi-ai/tests/sdk-options.spec.ts +106 -0
- package/vendor/dsh-llm-pi-ai/tsconfig.json +4 -0
- package/vendor/dsh-llm-pi-ai/tsconfig.upstream.json +51 -0
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { Context, Service } from "@deepseek-ai/cordis";
|
|
2
|
+
import { RetryPolicyConfig } from "@deepseek-ai/dsh-llm";
|
|
3
|
+
import { CredentialProvider } from "@deepseek-ai/dsh-credentials";
|
|
4
|
+
import z from "@deepseek-ai/schemastery";
|
|
5
|
+
//#region src/config.d.ts
|
|
6
|
+
/** One user-defined model stored in the plugin-owned settings namespace. */
|
|
7
|
+
interface CustomModel {
|
|
8
|
+
/** Exact model ID sent to the configured gateway. */
|
|
9
|
+
model: string;
|
|
10
|
+
/** Plaintext gateway credential stored in settings.yaml. */
|
|
11
|
+
apiKey: string;
|
|
12
|
+
/** Gateway base URL, including any path prefix. */
|
|
13
|
+
baseUrl: string;
|
|
14
|
+
/** Optional selector label; the model ID is used when omitted. */
|
|
15
|
+
description?: string;
|
|
16
|
+
/** Legacy protocol hint used when protocol is omitted. */
|
|
17
|
+
provider?: string | null;
|
|
18
|
+
/** Compatible wire protocol: OpenAI or Anthropic. */
|
|
19
|
+
protocol?: string;
|
|
20
|
+
/** Context capacity advertised to ChatCode CLI. */
|
|
21
|
+
contextWindow?: number;
|
|
22
|
+
/** Default and maximum output token count. */
|
|
23
|
+
maxTokens?: number;
|
|
24
|
+
/** Legacy context-capacity fallback. */
|
|
25
|
+
maxInputTokens?: number;
|
|
26
|
+
}
|
|
27
|
+
/** One provider/model rule used to classify ChatCode model statistics. */
|
|
28
|
+
interface ModelKindRule {
|
|
29
|
+
/** Exact ChatCode CLI provider route; omission matches every provider. */
|
|
30
|
+
provider?: string;
|
|
31
|
+
/** Exact provider model id; omission matches every model. */
|
|
32
|
+
model?: string;
|
|
33
|
+
/** ChatCode model category. */
|
|
34
|
+
kind: number;
|
|
35
|
+
}
|
|
36
|
+
/** Operational reporting controls for committed ChatCode CLI Session events. */
|
|
37
|
+
interface ReportingConfig {
|
|
38
|
+
/** Enable reporting when the Session service is available. */
|
|
39
|
+
enabled: boolean;
|
|
40
|
+
/** Enable durable AI-generated-code reporting. */
|
|
41
|
+
codeSave: boolean;
|
|
42
|
+
/** Enable conversation and message database synchronization. */
|
|
43
|
+
conversationSync: boolean;
|
|
44
|
+
/** Enable the user-visible ChatCode message chain. */
|
|
45
|
+
chatCodeSession: boolean;
|
|
46
|
+
/** Maximum code records in one save request. */
|
|
47
|
+
codeBatchItems: number;
|
|
48
|
+
/** Maximum aggregate code characters in one save request. */
|
|
49
|
+
codeBatchChars: number;
|
|
50
|
+
/** Delay before retrying the durable code outbox. */
|
|
51
|
+
codeRetryDelayMs: number;
|
|
52
|
+
/** Absolute code outbox directory; an empty value uses the resolved ChatCode CLI Home. */
|
|
53
|
+
codeOutboxDir: string;
|
|
54
|
+
/** Include subagent Sessions in conversation database synchronization. */
|
|
55
|
+
includeSubagentConversationSync: boolean;
|
|
56
|
+
/** Ordered exact-match overrides applied before backend URL classification. */
|
|
57
|
+
modelKindRules: ModelKindRule[];
|
|
58
|
+
}
|
|
59
|
+
/** Model sources, account access, and operations-reporting configuration. */
|
|
60
|
+
interface Config {
|
|
61
|
+
/** Legacy Host JSON file used only when the settings namespace is absent. */
|
|
62
|
+
settingsPath?: string;
|
|
63
|
+
/** User-defined models served from the plugin-owned settings namespace. */
|
|
64
|
+
customModels: CustomModel[];
|
|
65
|
+
/** Context capacity when a managed entry omits its capacity. */
|
|
66
|
+
defaultContextWindow: number;
|
|
67
|
+
/** Output default and ceiling when a managed entry omits maxTokens. */
|
|
68
|
+
defaultMaxTokens: number;
|
|
69
|
+
/** Retry policy for every imported route; omission uses the LLM service default. */
|
|
70
|
+
retryPolicy?: RetryPolicyConfig;
|
|
71
|
+
/** ChatCode account sign-in and refresh endpoint selection. */
|
|
72
|
+
auth: {
|
|
73
|
+
/** Retained for login UI compatibility; it never blocks model calls. */
|
|
74
|
+
requireLogin: boolean;
|
|
75
|
+
loginUrl: string;
|
|
76
|
+
apiBaseUrl: string;
|
|
77
|
+
pollIntervalMs: number;
|
|
78
|
+
pollTimeoutMs: number;
|
|
79
|
+
requestTimeoutMs: number;
|
|
80
|
+
};
|
|
81
|
+
/** CVP backend root for generated code, conversation synchronization, and ChatCode message records. */
|
|
82
|
+
cvpChatCodeApiUrl: string;
|
|
83
|
+
/** Optional CVP credential override and timeout for launch admission. */
|
|
84
|
+
startupGate: {
|
|
85
|
+
token: string;
|
|
86
|
+
timeoutMs: number;
|
|
87
|
+
};
|
|
88
|
+
/** ChatCode operations reporting derived from committed Session events. */
|
|
89
|
+
reporting: ReportingConfig;
|
|
90
|
+
/** Runtime-config API queried once when the ChatCode CLI profile starts. */
|
|
91
|
+
codingPlanEndpoint: string;
|
|
92
|
+
/** Include the separately configured MAAS catalog in the model selector. */
|
|
93
|
+
enableMaas: boolean;
|
|
94
|
+
/** MAAS catalog API, queried only when {@link enableMaas} is true. */
|
|
95
|
+
maasEndpoint: string;
|
|
96
|
+
/** Bound one catalog request so a failed control plane cannot block startup indefinitely. */
|
|
97
|
+
catalogTimeoutMs: number;
|
|
98
|
+
}
|
|
99
|
+
/** Mount input accepts independently partial account and reporting sections. */
|
|
100
|
+
interface ConfigInput extends Omit<Partial<Config>, 'auth' | 'reporting' | 'startupGate'> {
|
|
101
|
+
auth?: Partial<Config['auth']>;
|
|
102
|
+
reporting?: Partial<ReportingConfig>;
|
|
103
|
+
startupGate?: Partial<Config['startupGate']>;
|
|
104
|
+
}
|
|
105
|
+
/** Validate mounting options without exposing control-plane credentials. */
|
|
106
|
+
declare const Config: z<ConfigInput, Config>;
|
|
107
|
+
//#endregion
|
|
108
|
+
//#region src/chatcode-auth.d.ts
|
|
109
|
+
interface ChatCodeLoginState {
|
|
110
|
+
sessionId: string;
|
|
111
|
+
state: 'pending' | 'succeeded' | 'failed' | 'timed-out' | 'cancelled';
|
|
112
|
+
expiresAtMs: number;
|
|
113
|
+
}
|
|
114
|
+
/** Safe UI projection: never add a token or raw upstream response here. */
|
|
115
|
+
interface ChatCodeAuthStatus {
|
|
116
|
+
required: boolean;
|
|
117
|
+
configured: boolean;
|
|
118
|
+
expired: boolean;
|
|
119
|
+
validation: 'valid' | 'invalid' | 'unavailable' | 'none';
|
|
120
|
+
expiresAtMs?: number;
|
|
121
|
+
userName?: string;
|
|
122
|
+
emailAddress?: string;
|
|
123
|
+
login?: ChatCodeLoginState;
|
|
124
|
+
}
|
|
125
|
+
interface ChatCodeLoginStart {
|
|
126
|
+
sessionId: string;
|
|
127
|
+
url: string;
|
|
128
|
+
}
|
|
129
|
+
interface ChatCodeStatusOptions {
|
|
130
|
+
/** Bypass the short validation cache and contact the account service again. */
|
|
131
|
+
force?: boolean;
|
|
132
|
+
}
|
|
133
|
+
interface ChatCodeAuthOptions {
|
|
134
|
+
requireLogin?: boolean;
|
|
135
|
+
loginUrl: string;
|
|
136
|
+
apiBaseUrl: string;
|
|
137
|
+
pollIntervalMs: number;
|
|
138
|
+
pollTimeoutMs: number;
|
|
139
|
+
requestTimeoutMs: number;
|
|
140
|
+
}
|
|
141
|
+
interface ChatCodeAuthApi {
|
|
142
|
+
status(options?: ChatCodeStatusOptions): Promise<ChatCodeAuthStatus>;
|
|
143
|
+
startLogin(): Promise<ChatCodeLoginStart>;
|
|
144
|
+
cancelLogin(sessionId: string): Promise<void>;
|
|
145
|
+
waitForLogin(sessionId: string, signal?: AbortSignal): Promise<ChatCodeLoginState['state']>;
|
|
146
|
+
logout(): Promise<void>;
|
|
147
|
+
/** Host-only accessor; presentation adapters must use status(). */
|
|
148
|
+
accessToken(signal?: AbortSignal): Promise<string | undefined>;
|
|
149
|
+
/** Host-only launch fact; reveals presence, never the credential value. */
|
|
150
|
+
environmentTokenActive(): boolean;
|
|
151
|
+
}
|
|
152
|
+
declare module '@deepseek-ai/cordis' {
|
|
153
|
+
interface Context {
|
|
154
|
+
chatcodeAuth: ChatCodeAuthService;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/** One protocol owner, shared across Web and TUI through credentials-local's file lock. */
|
|
158
|
+
declare class ChatCodeAuthService extends Service implements ChatCodeAuthApi {
|
|
159
|
+
private readonly credentials;
|
|
160
|
+
private readonly options;
|
|
161
|
+
private readonly lifetime;
|
|
162
|
+
private readonly active;
|
|
163
|
+
private readonly failures;
|
|
164
|
+
private readonly tasks;
|
|
165
|
+
/** A new host process must contact ChatCode once before trusting persisted validation metadata. */
|
|
166
|
+
private startupValidationPending;
|
|
167
|
+
private readonly environmentAccessToken;
|
|
168
|
+
constructor(ctx: Context, credentials: CredentialProvider, options: ChatCodeAuthOptions, environmentAccessToken?: string);
|
|
169
|
+
private mutate;
|
|
170
|
+
private ensure;
|
|
171
|
+
status(options?: ChatCodeStatusOptions): Promise<ChatCodeAuthStatus>;
|
|
172
|
+
accessToken(signal?: AbortSignal): Promise<string | undefined>;
|
|
173
|
+
environmentTokenActive(): boolean;
|
|
174
|
+
startLogin(): Promise<ChatCodeLoginStart>;
|
|
175
|
+
logout(): Promise<void>;
|
|
176
|
+
cancelLogin(sessionId: string): Promise<void>;
|
|
177
|
+
waitForLogin(sessionId: string, signal?: AbortSignal): Promise<ChatCodeLoginState['state']>;
|
|
178
|
+
private finish;
|
|
179
|
+
private pollAndCommit;
|
|
180
|
+
private account;
|
|
181
|
+
private refresh;
|
|
182
|
+
private request;
|
|
183
|
+
}
|
|
184
|
+
//#endregion
|
|
185
|
+
//#region src/startup-gate.d.ts
|
|
186
|
+
type StartupGateFailure = {
|
|
187
|
+
ok: false;
|
|
188
|
+
kind: 'disabled';
|
|
189
|
+
host: string;
|
|
190
|
+
disabledReason: string;
|
|
191
|
+
} | {
|
|
192
|
+
ok: false;
|
|
193
|
+
kind: 'error';
|
|
194
|
+
host: string;
|
|
195
|
+
reason: 'auth' | 'timeout' | 'network' | 'server' | 'invalid';
|
|
196
|
+
status?: number;
|
|
197
|
+
};
|
|
198
|
+
type StartupGateResult = {
|
|
199
|
+
ok: true;
|
|
200
|
+
host: string;
|
|
201
|
+
} | StartupGateFailure;
|
|
202
|
+
interface StartupGateCheckOptions {
|
|
203
|
+
request?: typeof fetch;
|
|
204
|
+
environment?: NodeJS.ProcessEnv;
|
|
205
|
+
readSettings?: () => Promise<unknown>;
|
|
206
|
+
}
|
|
207
|
+
declare module '@deepseek-ai/cordis' {
|
|
208
|
+
interface Context {
|
|
209
|
+
chatcodeStartupGate: ChatCodeStartupGateService;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/** Check one launch. Each call contacts CVP unless the explicit legacy bypass applies. */
|
|
213
|
+
declare function checkChatCodeStartupGate(config: Config, options?: StartupGateCheckOptions): Promise<StartupGateResult>;
|
|
214
|
+
/** Localize a failed launch without disclosing the CVP credential or response body. */
|
|
215
|
+
declare function startupGateFailureMessage(failure: StartupGateFailure): string;
|
|
216
|
+
/** Reusable Host service for CLI startup and Web boot admission. */
|
|
217
|
+
declare class ChatCodeStartupGateService extends Service {
|
|
218
|
+
private readonly config;
|
|
219
|
+
constructor(ctx: Context, config: Config);
|
|
220
|
+
/** Read one authoritative CVP launch decision. */
|
|
221
|
+
check(): Promise<StartupGateResult>;
|
|
222
|
+
/** Present a failed decision without publishing credentials or raw response bodies. */
|
|
223
|
+
message(failure: StartupGateFailure): string;
|
|
224
|
+
}
|
|
225
|
+
//#endregion
|
|
226
|
+
//#region src/index.d.ts
|
|
227
|
+
declare const name = "llm-chatcode-config";
|
|
228
|
+
declare const inject: string[];
|
|
229
|
+
declare const SETTINGS_NAMESPACE = "llm-chatcode-config";
|
|
230
|
+
/** Optional, host-only refresh seam for terminal and browser clients. */
|
|
231
|
+
interface ChatCodeModelCatalogApi {
|
|
232
|
+
/** Reload CodingPlan and, when enabled, MAAS routes into the LLM registry. */
|
|
233
|
+
refresh(): Promise<void>;
|
|
234
|
+
/** Current effective MAAS switch value. */
|
|
235
|
+
maasEnabled(): boolean;
|
|
236
|
+
/** Persist the MAAS switch and wait for the matching catalog refresh. */
|
|
237
|
+
setMaasEnabled(enabled: boolean): Promise<void>;
|
|
238
|
+
}
|
|
239
|
+
declare module '@deepseek-ai/cordis' {
|
|
240
|
+
interface Context {
|
|
241
|
+
chatcodeModelCatalog: ChatCodeModelCatalogService;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Keeps catalog I/O in the host bundle: clients ask for a registry refresh but
|
|
246
|
+
* never receive endpoint or credential-bearing runtime configuration.
|
|
247
|
+
*/
|
|
248
|
+
declare class ChatCodeModelCatalogService extends Service implements ChatCodeModelCatalogApi {
|
|
249
|
+
private readonly reload;
|
|
250
|
+
private readonly readMaas;
|
|
251
|
+
private writeMaas;
|
|
252
|
+
constructor(ctx: Context, reload: () => Promise<void>, readMaas: () => boolean);
|
|
253
|
+
refresh(): Promise<void>;
|
|
254
|
+
maasEnabled(): boolean;
|
|
255
|
+
setMaasEnabled(enabled: boolean): Promise<void>;
|
|
256
|
+
/** Bind the durable settings writer once the optional settings service mounts. */
|
|
257
|
+
bindMaasSettings(write: (enabled: boolean) => Promise<void>): void;
|
|
258
|
+
}
|
|
259
|
+
/** Register ChatCode model sources, account access, and operations reporting. */
|
|
260
|
+
declare function apply(ctx: Context, config: Config): Promise<void>;
|
|
261
|
+
//#endregion
|
|
262
|
+
export { ChatCodeAuthService, ChatCodeModelCatalogApi, ChatCodeModelCatalogService, ChatCodeStartupGateService, Config, type CustomModel, type ModelKindRule, type ReportingConfig, SETTINGS_NAMESPACE, type StartupGateFailure, type StartupGateResult, apply, checkChatCodeStartupGate, inject, name, startupGateFailureMessage };
|
|
263
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/config.ts","../src/chatcode-auth.ts","../src/startup-gate.ts","../src/index.ts"],"mappings":";;;;;;UAOiB;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;UAIe;;EAEf;;EAEA;;EAEA;;;UAIe;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA,gBAAgB;;;UAID;;EAEf;;EAEA,cAAc;;EAEd;;EAEA;;EAEA,cAAc;;EAEd;;IAEE;IACA;IACA;IACA;IACA;IACA;;;EAGF;;EAEA;IACE;IACA;;;EAGF,WAAW;;EAGX;;EAEA;;EAEA;;EAEA;;;UAIe,oBAAoB,KAAK,QAAQ;EAChD,OAAO,QAAQ;EACf,YAAY,QAAQ;EACpB,cAAc,QAAQ;;;cAIX,QAAQ,EAAE,aAAa;;;UC1FnB;EACf;EACA;EACA;;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QAAQ;;UAEO;EAAqB;EAAmB;;UACxC;;EAEf;;UAEe;EACf;EACA;EACA;EACA;EACA;EACA;;UAEe;EACf,OAAO,UAAU,wBAAwB,QAAQ;EACjD,cAAc,QAAQ;EACtB,YAAY,oBAAoB;EAChC,aAAa,mBAAmB,SAAS,cAAc,QAAQ;EAC/D,UAAU;;EAEV,YAAY,SAAS,cAAc;;EAEnC;;;YAUU;IAAU,cAAc;;;;cAwGvB,4BAA4B,mBAAmB;mBAYvC;mBACA;mBAZF;mBACA;mBACA;mBACA;;UAET;mBAES;EAGf,YAAA,KAAK,SACY,aAAa,oBACb,SAAS,qBAC1B;UAYY;UAaA;EA2CR,OAAO,UAAS,wBAA6B,QAAQ;EA2BrD,YAAY,SAAS,cAAc;EAQzC;EAIM,cAAc,QAAQ;EA2BtB,UAAU;EAUV,YAAY,oBAAoB;EAMhC,aAAa,mBAAmB,SAAS,cAAc,QAAQ;UAWvD;UAIA;UA6BA;UAWA;UAYA;;;;KCxYJ;EACN;EAAW;EAAkB;EAAc;;EAC3C;EAAW;EAAe;EAAc;EAA+D;;KACjG;EAAsB;EAAU;IAAiB;UAE5C;EACf,iBAAiB;EACjB,cAAc,OAAO;EACrB,qBAAqB;;;YAIX;IAAU,qBAAqB;;;;iBAqErB,yBAAyB,QAAQ,QAAQ,UAAS,0BAA+B,QAAQ;;iBAsC/F,0BAA0B,SAAS;;cAYtC,mCAAmC;mBACH;EAA/B,YAAA,KAAK,SAA0B,QAAQ;;EAGnD,SAAS,QAAQ;;EAGjB,QAAQ,SAAS;;;;cCpHN;cACA;cACA;;UAGI;;EAEf,WAAW;;EAEX;;EAEA,eAAe,mBAAmB;;;YAIxB;IAAU,sBAAsB;;;;;;;cAO/B,oCAAoC,mBAAmB;mBAK/C;mBACA;UALX;EAGN,YAAA,KAAK,SACY,cAAc,eACd;EAKnB,WAAW;EAIX;EAIM,eAAe,mBAAmB;;EASxC,iBAAiB,QAAQ,qBAAqB;;;iBAM1B,MAAM,KAAK,SAAS,QAAQ,SAAS"}
|