venice-video-harness 2.4.0 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +112 -1
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/mini-drama/choices.d.ts +20 -0
  8. package/dist/mini-drama/choices.d.ts.map +1 -0
  9. package/dist/mini-drama/choices.js +14 -0
  10. package/dist/mini-drama/choices.js.map +1 -0
  11. package/dist/mini-drama/cli.js +289 -72
  12. package/dist/mini-drama/cli.js.map +1 -1
  13. package/dist/mini-drama/generation-planner.d.ts +5 -6
  14. package/dist/mini-drama/generation-planner.d.ts.map +1 -1
  15. package/dist/mini-drama/generation-planner.js +19 -18
  16. package/dist/mini-drama/generation-planner.js.map +1 -1
  17. package/dist/mini-drama/prompt-builder.d.ts.map +1 -1
  18. package/dist/mini-drama/prompt-builder.js +5 -3
  19. package/dist/mini-drama/prompt-builder.js.map +1 -1
  20. package/dist/mini-drama/video-generator.d.ts.map +1 -1
  21. package/dist/mini-drama/video-generator.js +4 -0
  22. package/dist/mini-drama/video-generator.js.map +1 -1
  23. package/dist/mini-drama/workshop.d.ts +50 -0
  24. package/dist/mini-drama/workshop.d.ts.map +1 -0
  25. package/dist/mini-drama/workshop.js +219 -0
  26. package/dist/mini-drama/workshop.js.map +1 -0
  27. package/dist/series/project-language.d.ts +26 -0
  28. package/dist/series/project-language.d.ts.map +1 -0
  29. package/dist/series/project-language.js +94 -0
  30. package/dist/series/project-language.js.map +1 -0
  31. package/dist/series/types.d.ts +27 -18
  32. package/dist/series/types.d.ts.map +1 -1
  33. package/dist/series/types.js +29 -8
  34. package/dist/series/types.js.map +1 -1
  35. package/dist/venice/models.d.ts.map +1 -1
  36. package/dist/venice/models.js +59 -0
  37. package/dist/venice/models.js.map +1 -1
  38. package/dist/venice/upscale.d.ts +55 -0
  39. package/dist/venice/upscale.d.ts.map +1 -0
  40. package/dist/venice/upscale.js +168 -0
  41. package/dist/venice/upscale.js.map +1 -0
  42. package/package.json +5 -3
  43. package/scripts/postinstall.mjs +24 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,48 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.5.1 — 2026-07-31
4
+
5
+ - Replaced the vague “What should the finished project accomplish?” workshop prompt with concrete, project-specific audience-outcome questions.
6
+ - Film asks what the audience should feel, understand, or keep thinking about when it ends.
7
+ - Product video asks what viewers should understand, believe, and do next; music video, screenplay adaptation, and series receive similarly specific questions.
8
+ - Added examples directly in the interactive prompt and renamed the noninteractive flag to `--outcome` while retaining `--objective` as a deprecated alias.
9
+
10
+ ## 2.5.0 — 2026-07-31
11
+
12
+ - Integrated the Topaz 2x/4x video-upscale engine into the standalone CLI.
13
+ - Added Standard vs 4K delivery selection to the complete project workshop.
14
+ - Added `venice-video finish`, which finds the assembled project master, estimates cost, requires confirmation, and writes a preserved 4K delivery master under `masters/`.
15
+ - Added advanced `venice-video upscale` for arbitrary finished video files.
16
+ - Large masters are split into upload-safe chunks, processed concurrently and resumably, concatenated without another video encode, and remuxed with the original audio.
17
+ - Registered `topaz-video-upscale` in the model catalog and added finishing/delivery regression tests.
18
+
19
+ ## 2.4.4 — 2026-07-31
20
+
21
+ - Added `venice-video workshop` as the project-level creative control center.
22
+ - The workshop develops objective, audience, runtime, logline, synopsis, themes, structure, aesthetic, cast, voices, locations, audio approach, production risks, open questions, and the complete shot script in one coherent process.
23
+ - Added structured revision feedback, status inspection, readable `WORKSHOP.md`, and explicit approval that materializes production state.
24
+ - Replaced unclear manual command-chain handoffs after `new` and `new-script` with the guided workshop.
25
+ - Kept low-level commands as advanced controls rather than the default onboarding experience.
26
+
27
+ ## 2.4.3 — 2026-07-31
28
+
29
+ - Film projects now use Film/Part terminology in script scaffolding and workshop output instead of Episode language.
30
+ - Added `new-script` and `workshop-script` commands while preserving `new-episode` and `workshop-episode` compatibility aliases.
31
+ - Film script prompts no longer force 60-second episode timing, one-location structure, cliffhangers, or mandatory episodic title cards.
32
+ - Film script templates default to five minutes when no requested duration exists; concepts can request any target duration.
33
+
34
+ ## 2.4.2 — 2026-07-31
35
+
36
+ - Native dialogue now remains on the selected R2V family and uses Seedance/HappyHorse voice-donor references when available.
37
+ - Wan 2.7 routing now requires the explicit Exact lip-sync strategy.
38
+ - Reworded the audio wizard to distinguish native voice-reference generation from exact audio-driven mouth movement.
39
+ - Reordered model families to Automatic, Seedance, MiniMax H3, HappyHorse, Grok Imagine, Kling O3.
40
+
41
+ ## 2.4.1 — 2026-07-31
42
+
43
+ - Added an install-time diagnostic that warns when npm's global executable directory is missing from `PATH` and prints the exact shell command to fix it.
44
+ - Added README troubleshooting for successful global installs where `venice-video` is not found.
45
+
3
46
  ## 2.4.0 — 2026-07-31
4
47
 
5
48
  First standalone CLI release.
package/README.md CHANGED
@@ -38,6 +38,7 @@ Live catalog as of **2026-05-20** (synced against `GET /api/v1/models?type=video
38
38
  | **Seedance 1.5 Pro** | i2v | t2v | 12s | Yes | Older Seedance line; kept for parity. |
39
39
  | **HappyHorse 1.1** | i2v, R2V (up to 9 refs) | t2v | 15s | Yes (joint single-pass, 7-lang phoneme lip-sync) | **#1 blind-preference T2V + I2V** (Alibaba 15B). 3-15s, 720p/1080p, nine aspect ratios. Best for talking characters + multilingual localization; SFW/commercial-leaning. The `happyhorse` video-family now routes here. |
40
40
  | **HappyHorse 1.0** | i2v, R2V | t2v | 15s | Yes | Prior line, kept for back-compat. Livelier hand-camera realism / cinematic grain vs Seedance. |
41
+ | **MiniMax H3** | i2v, R2V (up to 9 refs) | t2v | 15s (**5s floor**) | Yes (native stereo, not toggleable) | Open-weight omni-modal model — one net covers T2V/I2V/reference. **2K is the only resolution** (no draft tier) at ~1/3 the per-second cost of other families; 24fps, 2500-char prompts. The `minimax-h3` video-family routes here. Sub-5s durations are a hard 400. |
41
42
  | **Wan 2.7** | i2v, R2V, V2V, Spicy | t2v | 15s | Wan i2v has no audio; lip-syncs via `audio_url` input | **Lip-sync flagship.** Only Venice model with proper `audio_url`-driven mouth motion. R2V exposes per-element `audio_url` for multi-speaker. Spicy = uncensored i2v variant. |
42
43
  | **Wan 2.6** | Standard, Flash, R2V | Standard | 15s | Yes (i2v/t2v); R2V capped at 10s | Now has R2V variant with `audio_url` input. 1080p. |
43
44
  | **Wan 2.5 Preview** | i2v | t2v | 10s | Yes | `audio_url` input. |
@@ -156,12 +157,37 @@ The CLI works directly against the Venice API. Cursor, Claude Code, OpenCode,
156
157
  MCP, and other agent harnesses are optional integrations, not runtime requirements.
157
158
 
158
159
  ```bash
159
- npm install -g venice-video-harness
160
+ npm install -g venice-video-harness --foreground-scripts
160
161
  venice-video setup
161
162
  venice-video doctor
162
163
  venice-video new
163
164
  ```
164
165
 
166
+ The `--foreground-scripts` flag makes the package's PATH diagnostic visible;
167
+ modern npm otherwise suppresses successful post-install output. After installation,
168
+ verify that your shell can find the executable:
169
+
170
+ ```bash
171
+ command -v venice-video
172
+ venice-video --version
173
+ ```
174
+
175
+ If npm reports a successful install but `venice-video` is not found, npm's global
176
+ `bin` directory is not on your shell `PATH`. The install output prints the exact
177
+ directory and an `export PATH=...` command when it detects this condition. You can
178
+ also inspect the directory manually:
179
+
180
+ ```bash
181
+ NPM_BIN="$(npm prefix -g)/bin"
182
+ echo "$NPM_BIN"
183
+ export PATH="$NPM_BIN:$PATH"
184
+ ```
185
+
186
+ Add that `export` line to `~/.zshrc`, `~/.bashrc`, or the startup file for your
187
+ shell, then open a new terminal. Node version managers can create this mismatch
188
+ when the active `npm` installs globally somewhere different from the active
189
+ Node shim.
190
+
165
191
  `venice-video setup` prompts for the API key without echoing it, validates it,
166
192
  and stores it in the OS-appropriate user configuration directory with owner-only
167
193
  permissions. It also records a default project workspace. Environment variables
@@ -172,6 +198,62 @@ export VENICE_API_KEY=your_key
172
198
  export VENICE_VIDEO_WORKSPACE=~/VeniceVideos
173
199
  ```
174
200
 
201
+ After `new`, the CLI hands the project to one guided control center:
202
+
203
+ ```bash
204
+ venice-video workshop -p ~/VeniceVideos/my-film
205
+ # Noninteractive: --outcome "Leave viewers exhilarated, then unsettled by the signal"
206
+ ```
207
+
208
+ The workshop develops the complete project—not only a shot list:
209
+
210
+ - objective, audience, runtime, constraints, and references
211
+ - logline, synopsis, themes, acts/movements, and story beats
212
+ - visual aesthetic, palette, lighting, lens language, and texture
213
+ - characters, wardrobe, voices, and continuity anchors
214
+ - locations and environmental continuity
215
+ - dialogue/audio approach and exact-lip-sync decisions
216
+ - production-ready shot script, risks, and open questions
217
+
218
+ It writes `WORKSHOP.md` for human review and `workshop.json` as the structured
219
+ source. Iterate without losing project context:
220
+
221
+ ```bash
222
+ venice-video workshop -p ~/VeniceVideos/my-film --feedback "Make the middle more tense"
223
+ venice-video workshop -p ~/VeniceVideos/my-film --status
224
+ venice-video workshop -p ~/VeniceVideos/my-film --approve
225
+ ```
226
+
227
+ Approval materializes the accepted aesthetic, cast, locations, and script into
228
+ the existing production pipeline.
229
+
230
+ The workshop also asks for the final delivery target. Choose **4K master** to
231
+ keep generation/drafts economical and upscale only the approved assembled cut:
232
+
233
+ ```bash
234
+ venice-video finish -p ~/VeniceVideos/my-film
235
+ # Prints input, output, and cost estimate first; then:
236
+ venice-video finish -p ~/VeniceVideos/my-film --yes
237
+ ```
238
+
239
+ The finishing command finds the assembled master, chunks large videos into
240
+ upload-safe segments, upscales them through `topaz-video-upscale`, resumes
241
+ already-finished chunks after interruption, concatenates without another video
242
+ encode, and remuxes the original audio. The 4K master lands in `masters/` while
243
+ the original assembled master is preserved. Current rough estimate: about
244
+ $0.12 per input second; the CLI always shows the estimate before spending.
245
+
246
+ For a standalone file outside a project:
247
+
248
+ ```bash
249
+ venice-video upscale --input final-cut.mp4 --factor 4
250
+ venice-video upscale --input final-cut.mp4 --factor 4 --yes
251
+ ```
252
+
253
+ Individual commands such as
254
+ `explore-aesthetic`, `add-character`, and `storyboard-episode` remain available
255
+ for advanced manual control, but they are no longer the default onboarding path.
256
+
175
257
  The `new` wizard starts with these production types:
176
258
 
177
259
  1. **Film** — a film of any length; there is no short-duration assumption
@@ -180,6 +262,12 @@ The `new` wizard starts with these production types:
180
262
  4. Music video
181
263
  5. Screenplay
182
264
 
265
+ Film projects use `new-script` and `workshop-script` terminology. Internally,
266
+ legacy JSON keys and directories still use `episode` for compatibility, but the
267
+ CLI and scriptwriter prompt call the work a Film and Part. Film scripts do not
268
+ inherit the series workflow's 60-second duration, one-location structure, or
269
+ next-episode cliffhanger.
270
+
183
271
  A non-interactive Film can also be created explicitly:
184
272
 
185
273
  ```bash
@@ -270,6 +358,29 @@ Every shot renders in **pure reference mode** — no start image — from an ord
270
358
 
271
359
  These defaults are overridable per-project via `series.json` → `videoDefaults`. To target a non-Seedance family (e.g. for accounts that lack Seedance access, or projects that need a different look), set `videoDefaults` to `kling-o3-standard-reference-to-video` (character consistency) and `veo3.1-fast-image-to-video` (atmosphere). Image models default to `nano-banana-2` / `nano-banana-2-edit` for all panels regardless of video family.
272
360
 
361
+ ### Picking a family at project creation
362
+
363
+ `venice-video new` asks which family to use, and `venice-video new-series` asks too when it's run on a terminal without `--video-family`. Both write the answer to `series.json` → `videoDefaults.videoFamilyPreference` and swap the action / atmosphere / character-consistency models to match. The wizard orders the families as Automatic, Seedance, MiniMax H3, HappyHorse, Grok Imagine, then Kling O3.
364
+
365
+ ### Choosing dialogue audio
366
+
367
+ - **Native dialogue** keeps the shot on the selected video family. Seedance and HappyHorse attach each character's short voice-donor clip through `reference_audio_urls`, then generate the authored line in-frame with that voice identity.
368
+ - **Exact lip-sync** renders the exact line with Venice speech, creates a Seedance identity keyframe, and drives Wan 2.7 mouth movement from that speech file through `audio_url`.
369
+ - **Narrator voice-over** keeps spoken narration out of the video prompt and mixes Venice speech over the picture in post.
370
+
371
+ A voice-donor reference preserves timbre, accent, and pacing; it is not the exact dialogue recording. Wan 2.7 is used only when the project explicitly selects exact lip-sync.
372
+
373
+ | Family | Picks | Trade-off |
374
+ |--------|-------|-----------|
375
+ | `seedance` | Seedance 2.0 Enhanced R2V for all three lanes | The default. Strongest identity anchoring, 720p drafts, 4-15s. |
376
+ | `minimax-h3` | H3 i2v (action/atmosphere) + H3 R2V (identity) | 2K with native stereo audio at ~1/3 the per-second cost. But 2K is the only resolution, so there's no cheap draft pass, and the 5s floor means 3-4s beats have to be re-scripted. |
377
+ | `happyhorse` | HappyHorse 1.1 i2v + R2V | Best lip-sync (7 languages, phoneme-level), 3-15s, 720p/1080p. |
378
+ | `grok-imagine` | Grok Imagine i2v + R2V | Atmosphere-forward look; R2V durations stepped at 5s/8s/10s. |
379
+ | `kling-o3` | Kling O3 Standard i2v + R2V | Stylized and illustrated aesthetics; `elements` + `scene_image_urls`. |
380
+ | `auto` | Whatever the harness currently defaults to | Tracks the default as it moves; Seedance Enhanced today. |
381
+
382
+ Non-interactive callers (the MCP, CI) pass `--video-family` explicitly; when it's omitted without a TTY the harness defaults stay in place.
383
+
273
384
  ## Image / Video Family Pairing
274
385
 
275
386
  **Venice removed the Seedance seedream-only face restriction (2026-07).** Seedance 2.0 previously rejected face-bearing input images that weren't produced by `seedream-v5-lite` / `seedream-v5-lite-edit`; it now accepts face-bearing images from **any** image family. The harness therefore uses a single high-quality default for every panel — character-bearing or faceless, generation or multi-edit:
package/dist/index.d.ts CHANGED
@@ -3,4 +3,5 @@ export { generateVideo, quoteVideo } from './venice/video.js';
3
3
  export { listVideoModels, getVideoModel } from './venice/models.js';
4
4
  export { createSeries, loadSeries, saveSeries, listSeries } from './series/manager.js';
5
5
  export type { SeriesState, EpisodeScript, ShotScript } from './series/types.js';
6
+ export { upscaleVideo, estimateUpscaleCostUsd, TOPAZ_VIDEO_UPSCALE_MODEL } from './venice/upscale.js';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACvF,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACvF,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -2,4 +2,5 @@ export { VeniceClient, VeniceRequestError } from './venice/client.js';
2
2
  export { generateVideo, quoteVideo } from './venice/video.js';
3
3
  export { listVideoModels, getVideoModel } from './venice/models.js';
4
4
  export { createSeries, loadSeries, saveSeries, listSeries } from './series/manager.js';
5
+ export { upscaleVideo, estimateUpscaleCostUsd, TOPAZ_VIDEO_UPSCALE_MODEL } from './venice/upscale.js';
5
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEvF,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { VideoFamilyPreference } from '../series/types.js';
2
+ export declare const VIDEO_FAMILY_CHOICES: ReadonlyArray<{
3
+ label: string;
4
+ value: VideoFamilyPreference;
5
+ description?: string;
6
+ }>;
7
+ export declare const AUDIO_STRATEGY_CHOICES: readonly [{
8
+ readonly label: "Native dialogue";
9
+ readonly value: "native";
10
+ readonly description: "The selected video model speaks in-frame; Seedance uses character voice references";
11
+ }, {
12
+ readonly label: "Exact lip-sync";
13
+ readonly value: "lip-sync";
14
+ readonly description: "Venice speech drives Wan 2.7 mouth movement";
15
+ }, {
16
+ readonly label: "Narrator voice-over";
17
+ readonly value: "narrator-vo";
18
+ readonly description: "Mute model narration and own the VO lane";
19
+ }];
20
+ //# sourceMappingURL=choices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"choices.d.ts","sourceRoot":"","sources":["../../src/mini-drama/choices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC;IAC/C,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,qBAAqB,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CACnE,CAOA,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;EAIzB,CAAC"}
@@ -0,0 +1,14 @@
1
+ export const VIDEO_FAMILY_CHOICES = [
2
+ { label: 'Automatic', value: 'auto', description: 'Current reference-first Seedance Enhanced defaults' },
3
+ { label: 'Seedance 2.0', value: 'seedance', description: 'Reference-first identity anchoring, native dialogue, 720p drafts, 4-15s' },
4
+ { label: 'MiniMax H3', value: 'minimax-h3', description: 'Open-weight omni-modal, 2K native audio, 5-15s' },
5
+ { label: 'HappyHorse 1.1', value: 'happyhorse', description: 'Native multilingual lip-sync, 720p/1080p, 3-15s' },
6
+ { label: 'Grok Imagine', value: 'grok-imagine', description: 'Atmosphere-forward look; R2V durations stepped at 5s/8s/10s' },
7
+ { label: 'Kling O3', value: 'kling-o3', description: 'Stylized and illustrated aesthetics; structured character elements' },
8
+ ];
9
+ export const AUDIO_STRATEGY_CHOICES = [
10
+ { label: 'Native dialogue', value: 'native', description: 'The selected video model speaks in-frame; Seedance uses character voice references' },
11
+ { label: 'Exact lip-sync', value: 'lip-sync', description: 'Venice speech drives Wan 2.7 mouth movement' },
12
+ { label: 'Narrator voice-over', value: 'narrator-vo', description: 'Mute model narration and own the VO lane' },
13
+ ];
14
+ //# sourceMappingURL=choices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"choices.js","sourceRoot":"","sources":["../../src/mini-drama/choices.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAE5B;IACH,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,oDAAoD,EAAE;IACxG,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,yEAAyE,EAAE;IACpI,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,gDAAgD,EAAE;IAC3G,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,iDAAiD,EAAE;IAChH,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,6DAA6D,EAAE;IAC5H,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,oEAAoE,EAAE;CAC5H,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,oFAAoF,EAAE;IAChJ,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,6CAA6C,EAAE;IAC1G,EAAE,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,0CAA0C,EAAE;CACvG,CAAC"}