@namzu/deepseek 0.1.0 → 1.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/CHANGELOG.md CHANGED
@@ -1,5 +1,188 @@
1
1
  # @namzu/deepseek
2
2
 
3
+ ## 1.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 77242a0: Expose optional per-model input modalities through `ModelInfo`, add inline image input for DeepSeek's vision preview while refusing images on text models and documents on every DeepSeek model, and label models whose listing explicitly advertises image input in the CLI picker.
8
+
9
+ ## 1.0.0
10
+
11
+ ### Major Changes
12
+
13
+ - ee4fd1d: Persist provider-native reasoning state with the exact provider, model, and fallback-chain member that produced it. Same-route sessions now replay native reasoning after restart, `/resume`, and `/fork`; a model, provider, or member switch keeps portable assistant/tool history without sending foreign native reasoning metadata.
14
+
15
+ `@namzu/sdk` adds `ProviderRoute`, `AssistantMessageSource`, optional assistant source/replay fields, and the provider request/stream/response plumbing. Fallback and forced-final turns now attribute provenance and cost to the member that actually answered.
16
+
17
+ `@namzu/cli` preserves and validates the additive assistant source shape in stateless and durable history.
18
+
19
+ **What breaks in the drivers:** hand-built assistant reasoning and histories written by earlier versions do not carry a validated route-bound replay envelope, so they are no longer emitted as native `reasoning_content` or signed thinking. Their portable assistant text and tool exchanges remain available, but an upstream that requires native metadata for an old tool continuation may refuse that request; compact or start a fresh conversation before continuing such legacy history. Preserve the complete assistant message returned by new runs, including `source.replayState`. Direct callers of the exported DeepSeek `toDeepSeekMessages` converter must also pass the target `ProviderRoute` as its second argument.
20
+
21
+ ### Minor Changes
22
+
23
+ - 94d3306: Add the chain-aware `reasoningEffortLevelsFor(model, thinking)` provider capability while retaining `effortLevelsFor` as a deprecated compatibility member. The four capability states now distinguish a driver with no menu, an unknown model, an explicitly unsupported model, and an exact selectable set; fallback chains expose only levels every reachable member accepts.
24
+
25
+ The TUI adds session-scoped `/effort [level|default]`, sends the selection to later main-query turns, and resets it atomically when a provider/model replacement succeeds. Failed or cancelled replacements preserve the current selection.
26
+
27
+ OpenAI publishes exact known-model menus and keeps unknown compatible-endpoint models unknown. DeepSeek explicitly publishes no supported levels. Anthropic now refuses unsupported effort levels before transport instead of silently dropping them; callers upgrading Anthropic must choose a level returned by `reasoningEffortLevelsFor()` or omit `effort` to retain the provider default.
28
+
29
+ ### Patch Changes
30
+
31
+ - 15f8ee4: Bound provider stream silence, including query-owned advisory calls and
32
+ RouterAgent routing decisions, compaction verifiers and model-graded eval
33
+ judges, to five minutes by default and abort the stalled provider transport,
34
+ with network-classified retry and fallback recovery where those policies
35
+ apply. This changes the previous default, under which a provider iterator could
36
+ remain silent forever. Set `streamIdleTimeoutMs: 0` on the run, agent, manual
37
+ compaction, verifier, or judge config to keep the old unbounded behavior, or set
38
+ a positive millisecond value to choose a different bound.
39
+
40
+ Queries whose caller signal is already aborted now settle as cancelled before
41
+ starting provider, provider-metadata, or tool work. A later cancellation also
42
+ settles while an optional context-window resolver remains pending, even when
43
+ that resolver ignores its signal. With no caller cancellation, `timeoutMs`
44
+ bounds the optional metadata lookup, aborts its private transport signal, and
45
+ falls back to the static context-window table instead of blocking the run.
46
+
47
+ The OpenRouter context-window lookup now forwards cancellation to its model-list
48
+ transport. Only fulfilled listings are cached, so cancelling one concurrent
49
+ query cannot abort another query's shared metadata request or force that query
50
+ onto the static context-window table.
51
+
52
+ `runExperiment({ timeoutMs })` now applies one validated wall-clock deadline to
53
+ both case execution and scoring. Scorers receive its optional cancellation
54
+ signal; a non-cooperative scorer is detached, and `judgeScorer` forwards the
55
+ signal to its bounded provider transport. Values outside the positive platform
56
+ timer range are refused before a case starts; omit the field for the prior
57
+ unbounded case behavior.
58
+
59
+ Compaction verification inside a query now carries the run cancellation cause
60
+ to its provider transport without placing a second idle timer around retry and
61
+ fallback. Public `buildVerifiedSummary`, `compactNow`, and `compactRegion`
62
+ calls bound raw provider silence themselves and accept optional `signal` and
63
+ `streamIdleTimeoutMs`; malformed values and pre-cancelled manual work are
64
+ refused before provider work or a no-op result.
65
+
66
+ HTTP embedding batches now have a 30-second whole-request default, including
67
+ response-body reads, where the previous default could wait forever. Set
68
+ `requestTimeoutMs: 0` on `HttpEmbeddingProvider` to keep the former unbounded
69
+ behavior. Invalid timeout values and non-positive or fractional `batchSize`
70
+ or `dimensions` values are refused at construction instead of silently
71
+ disabling the bound or entering a non-progressing batch loop. Successful HTTP
72
+ responses must contain exactly one unique, in-range result per input and finite
73
+ vectors of the configured dimension; malformed or incomplete batches are
74
+ refused atomically instead of reaching ingestion with missing embeddings.
75
+
76
+ Public RAG operations accept optional cancellation context. The shipped
77
+ `knowledge_search` tool forwards its run-owned signal through
78
+ `KnowledgeBase`, retrieval or ingestion, and the embedding provider. The HTTP
79
+ provider preserves the caller's exact cancellation reason while aborting only
80
+ its private fetch transport. Custom embedding providers receive the signal as
81
+ a cooperative request; callers still own their wait boundary if a custom
82
+ implementation ignores it. Default retrieval and ingestion recheck authority
83
+ after that custom call settles, so a late result cannot start a vector search
84
+ or persist chunks after cancellation. `VectorStore.search` and `upsert` now
85
+ receive the same optional operation context. The default pipelines also race
86
+ those store promises against cancellation, so a non-cooperative custom store
87
+ cannot leave the public query or ingestion call pending forever.
88
+
89
+ A2A agent-card discovery now has a 30-second whole fetch-and-body default and
90
+ accepts an optional caller signal and `timeoutMs`; set `timeoutMs: 0` to retain
91
+ the former unbounded behavior. `A2ADelegate.timeoutMs` now starts before
92
+ `message/send` and bounds the whole delegation instead of polling only. A
93
+ pre-cancelled dispatch starts no remote work, pending fetch and body promises
94
+ cannot hold `waitForTask`, and caller cancellation preserves its exact cause on
95
+ the private transport. Poll and delegation timers are validated at
96
+ construction. Once a safe task id exists, cancellation or timeout sends one
97
+ independently bounded `tasks/cancel`; during initial task creation the client
98
+ keeps a short cleanup grace and explicitly reports an unknown remote outcome if
99
+ the peer never returns an addressable id. Poll replies are bound to that initial
100
+ id, and transport or protocol failures after it is known make the same bounded
101
+ cleanup attempt before the original failure is returned. An `input-required`
102
+ task is also bounded-cancelled before the delegate reports that it cannot
103
+ supply the requested input.
104
+
105
+ Connector execution now carries optional operation authority through the
106
+ manager, every connector-tool adapter, real query runs, tenant/environment
107
+ facades, health checks, and `MCPConnectorBridge.callTool`. Custom connectors
108
+ receive the signal; if they ignore it, the manager settles with an honest
109
+ unknown remote outcome and rejects a late success that does not identify a
110
+ received response. A tenant call cancelled before admission no longer spends a
111
+ rate-limit slot.
112
+
113
+ `HttpConnector` and `WebhookConnector` now apply one validated 30-second
114
+ fetch-and-body deadline and a streaming 2 MiB response limit by default. Set
115
+ positive `timeoutMs` and `maxResponseBytes` values to choose different bounds.
116
+ Cancellation, deadline, or response-size failure aborts only the private
117
+ transport/body reader and preserves the caller's exact cause. Result metadata
118
+ distinguishes `not_started`, `unknown`, and `response_received`, includes retry
119
+ safety, and keeps a received status visible when its body is unavailable.
120
+
121
+ Dynamic HTTP paths and webhook URL overrides must remain on the configured
122
+ origin. Model-authored routing headers are refused, redirects are not followed,
123
+ and 3xx responses are no longer reported as success. Configure a separate
124
+ connector instance for each authorized origin; callers that previously used a
125
+ cross-origin webhook override must migrate to that instance.
126
+
127
+ `GuardedFetchProvider` now applies one validated 30-second deadline across DNS
128
+ resolution, every manually admitted redirect fetch, and the final response
129
+ body, while preserving a caller's exact cancellation cause on a private
130
+ transport signal. Its 2 MiB default response cap is enforced from streamed
131
+ bytes rather than after `response.text()` allocates the whole body; overflow
132
+ cancels the reader and returns a valid UTF-8 prefix. Redirect bodies are
133
+ cancelled when abandoned, and a spent redirect budget causes no DNS lookup for
134
+ the next target. Set positive `timeoutMs` and `maxBytes` values or a
135
+ non-negative integer `maxRedirects` to choose other bounds. Custom
136
+ `GuardedFetchConfig.resolve` functions may now accept the operation signal as
137
+ a second argument. IPv4-mapped IPv6 literals are canonicalized back to their
138
+ IPv4 address before range checks, closing the hexadecimal mapped loopback and
139
+ link-local bypass; the full IPv6 link-local and multicast ranges are also
140
+ refused.
141
+
142
+ MCP request methods now accept optional cancellation authority, and generated
143
+ MCP tool and prompt adapters forward the run-owned tool signal. A pre-aborted
144
+ request starts no transport work; a pending request preserves the caller's
145
+ exact cause, aborts a private transport, removes its correlated pending id, and
146
+ makes a one-second best-effort `notifications/cancelled` attempt. The
147
+ notification does not prove that an already-started remote side effect stopped.
148
+ Paged list calls recheck the same signal before each page.
149
+
150
+ `MCPClient.requestTimeoutMs` and HTTP MCP transport `timeoutMs` values must now
151
+ be positive platform-range integers. A shorter transport deadline remains a
152
+ request-timeout terminal and emits the same correlated cancellation. HTTP
153
+ fetches and response-body reads share operation authority; disconnect owns
154
+ active requests and cancellation cleanup. Reconnects fence late POST responses
155
+ and SSE batches from prior generations, clear Streamable session state, and
156
+ accept session ids only from successful `initialize` responses. Per-send
157
+ failure no longer marks a Streamable client connection-wide errored or rejects
158
+ unrelated concurrent calls. `MCPTransport.send` now accepts optional
159
+ `MCPTransportSendOptions`; custom transports should refuse pre-aborted work and
160
+ stop their per-send I/O when its signal fires.
161
+
162
+ Provider model listings and credential probes now accept optional cancellation
163
+ signals. Retry, fallback, stream-idle and instrumentation decorators preserve
164
+ that authority, and every bundled CLI driver forwards it to the underlying
165
+ transport where supported or refuses a result that arrived after cancellation.
166
+ Existing zero-argument provider implementations remain valid.
167
+
168
+ The interactive provider picker now cancels model discovery, credential checks
169
+ and subscription sign-in when the operator backs out, supersedes the work, or
170
+ leaves the screen. Late results cannot reopen an old model step, accept a
171
+ credential, re-probe the application, or persist a subscription credential
172
+ after cancellation. Model listing and credential probing both settle after a
173
+ three-second bound even when a custom provider ignores its signal.
174
+
175
+ Between-turn and durable-resume subscription refreshes now settle on caller
176
+ cancellation and apply one 30-second bound across the token request and response
177
+ body. Refreshes in one session are serialized and re-read their source at the
178
+ head of the queue, preventing a later stale caller from downgrading a token
179
+ published by an earlier one. Namzu's credential file uses an exact conditional
180
+ replacement under a cross-process, atomically published lock; an external
181
+ rotation or logout wins, and an uncertain publication refuses instead of using
182
+ an uncommitted refresh. Borrowed macOS Keychain credentials are read-only: a
183
+ changed or removed entry wins, and a successful refresh of an unchanged entry
184
+ remains session-local.
185
+
3
186
  ## 0.1.0
4
187
 
5
188
  ### Minor Changes
package/README.md CHANGED
@@ -3,10 +3,10 @@ type: Reference
3
3
  title: "@namzu/deepseek"
4
4
  description: >-
5
5
  The DeepSeek model driver for the Namzu agent kernel. Chat Completions with
6
- streaming and tool use, and thinking mode mapped onto the kernel's reasoning
7
- blocks in both directions.
6
+ streaming, tool use and inline image input, with thinking mode mapped onto
7
+ the kernel's reasoning blocks in both directions.
8
8
  tags: [readme, package, provider, deepseek]
9
- timestamp: 2026-08-17T00:00:00Z
9
+ timestamp: 2026-08-20T00:00:00Z
10
10
  status: active
11
11
  diataxis: reference
12
12
  -->
@@ -21,7 +21,7 @@ diataxis: reference
21
21
  [![build](https://github.com/cogitave/namzu/actions/workflows/ci.yml/badge.svg)](https://github.com/cogitave/namzu/actions/workflows/ci.yml)
22
22
  [![license](https://img.shields.io/badge/license-FSL--1.1--MIT-blue.svg)](https://github.com/cogitave/namzu/blob/main/LICENSE.md)
23
23
 
24
- [Install](#install) · [Usage](#usage) · [Thinking mode](#thinking-mode) · [Documentation](#documentation)
24
+ [Install](#install) · [Usage](#usage) · [Image input](#image-input) · [Thinking mode](#thinking-mode) · [Documentation](#documentation)
25
25
 
26
26
  </div>
27
27
 
@@ -63,15 +63,32 @@ for await (const chunk of provider.chatStream({
63
63
  }
64
64
  ```
65
65
 
66
- Models are `deepseek-v4-flash` and `deepseek-v4-pro`. `deepseek-chat` and
67
- `deepseek-reasoner` were discontinued on 2026-07-24 and are not aliases.
66
+ The built-in catalogue offers `deepseek-v4-flash`, `deepseek-v4-pro`, and
67
+ `deepseek-v4-flash-vision-exp`. `deepseek-chat` and `deepseek-reasoner` were
68
+ discontinued on 2026-07-24 and are not aliases.
69
+
70
+ ## Image input
71
+
72
+ Only `deepseek-v4-flash-vision-exp` accepts images. User attachments are sent
73
+ as ordered `image_url` data-URL parts. Images returned by tools keep their
74
+ `role: "tool"` result and follow it in a separate user image message, so the
75
+ tool-call/result sequence remains valid. PNG, JPEG, WebP and GIF are accepted.
76
+
77
+ The SDK's accumulated request-rich-content budget still applies before this
78
+ projection and leaves durable `Run.messages` unchanged. This driver currently
79
+ uses inline base64 only; it does not upload through the Files API or claim to
80
+ normalize or decode caller-supplied image bytes. Documents, unresolved stored
81
+ refs, unsupported image types, and images sent to either text model are refused
82
+ before transport.
68
83
 
69
84
  ## Thinking mode
70
85
 
71
86
  **Thinking is on by default** — the vendor's default, not this driver's. The
72
87
  chain of thought arrives as `delta.reasoning` fragments, the same channel
73
- `@namzu/anthropic` uses, and is replayed back to the vendor automatically on
74
- later turns, which its tool-calling flow requires.
88
+ `@namzu/anthropic` uses. The kernel persists it with versioned adapter state and
89
+ the exact provider/model/fallback route, so the same configured route replays it
90
+ after restart or `/resume`. A model, provider, or chain-member switch keeps the
91
+ portable assistant/tool history and omits the foreign native reasoning field.
75
92
 
76
93
  Turn it off per call with `thinking: { type: 'disabled' }`.
77
94
 
@@ -81,7 +98,7 @@ is on. Both refusals, and how to opt out, are in the documentation below.
81
98
 
82
99
  ## Documentation
83
100
 
84
- - [The DeepSeek driver](https://github.com/cogitave/namzu/blob/main/docs/providers/deepseek.md) — thinking mode, reasoning replay, what this wire refuses, and why it carries no price rows
101
+ - [The DeepSeek driver](https://github.com/cogitave/namzu/blob/main/docs/providers/deepseek.md) — image input, thinking mode, reasoning replay, what this wire refuses, and why it carries no price rows
85
102
  - [Namzu docs](https://github.com/cogitave/namzu/tree/main/docs)
86
103
 
87
104
  ## License
package/dist/client.d.ts CHANGED
@@ -1,15 +1,7 @@
1
- import type { ChatCompletionParams, LLMProvider, ModelInfo, ProviderCapabilities, StreamChunk, ThinkingConfig } from '@namzu/sdk';
1
+ import type { ChatCompletionParams, LLMProvider, ModelInfo, ProviderCapabilities, ProviderRoute, ReasoningEffort, StreamChunk, ThinkingConfig } from '@namzu/sdk';
2
2
  import type { ChatCompletionMessageParam, ChatCompletionTool } from 'openai/resources/chat/completions';
3
3
  import type { DeepSeekConfig } from './types.js';
4
- /**
5
- * No vision, no documents.
6
- *
7
- * The wire is OpenAI's Chat Completions, which has `image_url` content parts —
8
- * but the models behind this endpoint are text-only, and a capability set is a
9
- * claim about what a call will actually do, not about what the request format
10
- * can express. Claiming vision here would route an image-bearing run to a
11
- * driver that sends the image and gets prose about nothing.
12
- */
4
+ /** Driver-level mapping capabilities; model input support is listed separately. */
13
5
  export declare const DEEPSEEK_CAPABILITIES: ProviderCapabilities;
14
6
  /**
15
7
  * Is thinking on for this call?
@@ -49,7 +41,7 @@ export declare function assertSamplingUsable(params: ChatCompletionParams, mode:
49
41
  * Completions and says so.
50
42
  */
51
43
  export declare function assertEffortUnsupported(params: ChatCompletionParams): void;
52
- export declare function toDeepSeekMessages(messages: ChatCompletionParams['messages']): ChatCompletionMessageParam[];
44
+ export declare function toDeepSeekMessages(messages: ChatCompletionParams['messages'], targetRoute: ProviderRoute): ChatCompletionMessageParam[];
53
45
  export declare function toDeepSeekTools(params: ChatCompletionParams): ChatCompletionTool[] | undefined;
54
46
  export declare class DeepSeekProvider implements LLMProvider {
55
47
  readonly id = "deepseek";
@@ -60,9 +52,11 @@ export declare class DeepSeekProvider implements LLMProvider {
60
52
  private samplingMode;
61
53
  constructor(config: DeepSeekConfig);
62
54
  private resolveModel;
55
+ /** This Chat Completions endpoint explicitly carries no effort control. */
56
+ reasoningEffortLevelsFor(_model: string): readonly ReasoningEffort[];
63
57
  chatStream(params: ChatCompletionParams): AsyncIterable<StreamChunk>;
64
- probeCredential(): Promise<void>;
65
- listModels(): Promise<ModelInfo[]>;
58
+ probeCredential(signal?: AbortSignal): Promise<void>;
59
+ listModels(signal?: AbortSignal): Promise<ModelInfo[]>;
66
60
  healthCheck(): Promise<boolean>;
67
61
  }
68
62
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,oBAAoB,EAEpB,WAAW,EACX,SAAS,EACT,oBAAoB,EAEpB,WAAW,EACX,cAAc,EAGd,MAAM,YAAY,CAAA;AAUnB,OAAO,KAAK,EACX,0BAA0B,EAC1B,kBAAkB,EAElB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,EAAE,oBAMnC,CAAA;AAuFD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,SAAS,GAAG,OAAO,CAE7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,oBAAoB,EAC5B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GACvB,IAAI,CAQN;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAK1E;AA0BD,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE,oBAAoB,CAAC,UAAU,CAAC,GACxC,0BAA0B,EAAE,CAoC9B;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,oBAAoB,GAAG,kBAAkB,EAAE,GAAG,SAAS,CAe9F;AAED,qBAAa,gBAAiB,YAAW,WAAW;IACnD,QAAQ,CAAC,EAAE,cAAa;IACxB,QAAQ,CAAC,IAAI,cAAa;IAC1B,QAAQ,CAAC,YAAY,uBAAwB;IAE7C,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,YAAY,CAAC,CAAQ;IAC7B,OAAO,CAAC,YAAY,CAAqB;gBAE7B,MAAM,EAAE,cAAc;IAgBlC,OAAO,CAAC,YAAY;IAUb,UAAU,CAAC,MAAM,EAAE,oBAAoB,GAAG,aAAa,CAAC,WAAW,CAAC;IAiJrE,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAYlC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAQrC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,oBAAoB,EAGpB,WAAW,EACX,SAAS,EAET,oBAAoB,EACpB,aAAa,EAEb,eAAe,EACf,WAAW,EACX,cAAc,EAId,MAAM,YAAY,CAAA;AAUnB,OAAO,KAAK,EACX,0BAA0B,EAC1B,kBAAkB,EAElB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD,mFAAmF;AACnF,eAAO,MAAM,qBAAqB,EAAE,oBAMnC,CAAA;AAoGD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,SAAS,GAAG,OAAO,CAE7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,oBAAoB,EAC5B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GACvB,IAAI,CAQN;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAK1E;AAuGD,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE,oBAAoB,CAAC,UAAU,CAAC,EAC1C,WAAW,EAAE,aAAa,GACxB,0BAA0B,EAAE,CA6E9B;AA0ED,wBAAgB,eAAe,CAAC,MAAM,EAAE,oBAAoB,GAAG,kBAAkB,EAAE,GAAG,SAAS,CAe9F;AAED,qBAAa,gBAAiB,YAAW,WAAW;IACnD,QAAQ,CAAC,EAAE,cAAa;IACxB,QAAQ,CAAC,IAAI,cAAa;IAC1B,QAAQ,CAAC,YAAY,uBAAwB;IAE7C,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,YAAY,CAAC,CAAQ;IAC7B,OAAO,CAAC,YAAY,CAAqB;gBAE7B,MAAM,EAAE,cAAc;IAmBlC,OAAO,CAAC,YAAY;IAUpB,2EAA2E;IAC3E,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,eAAe,EAAE;IAI7D,UAAU,CAAC,MAAM,EAAE,oBAAoB,GAAG,aAAa,CAAC,WAAW,CAAC;IA6KrE,eAAe,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpD,UAAU,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAyBtD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAQrC"}