@actuate-media/cli 0.8.0 → 0.10.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.
@@ -1,4 +1,4 @@
1
1
 
2
- > @actuate-media/cli@0.8.0 build /home/runner/work/actuatecms/actuatecms/packages/cli
2
+ > @actuate-media/cli@0.10.0 build /home/runner/work/actuatecms/actuatecms/packages/cli
3
3
  > tsc
4
4
 
@@ -1,14 +1,16 @@
1
1
 
2
- > @actuate-media/cli@0.8.0 test /home/runner/work/actuatecms/actuatecms/packages/cli
2
+ > @actuate-media/cli@0.10.0 test /home/runner/work/actuatecms/actuatecms/packages/cli
3
3
  > vitest run
4
4
 
5
5
 
6
6
   RUN  v4.1.8 /home/runner/work/actuatecms/actuatecms/packages/cli
7
7
 
8
- ✓ dist/__tests__/db-sync.test.js (10 tests) 667ms
9
- ✓ src/__tests__/db-sync.test.ts (10 tests) 416ms
10
- ✓ dist/__tests__/deployment-diagnostics.test.js (8 tests) 84ms
11
- ✓ src/__tests__/deployment-diagnostics.test.ts (8 tests) 80ms
8
+ ✓ dist/__tests__/db-sync.test.js (10 tests) 324ms
9
+ ✓ dist/__tests__/seed.test.js (10 tests) 241ms
10
+ ✓ src/__tests__/db-sync.test.ts (10 tests) 300ms
11
+ ✓ src/__tests__/seed.test.ts (10 tests) 141ms
12
+ ✓ dist/__tests__/deployment-diagnostics.test.js (8 tests) 68ms
13
+ ✓ src/__tests__/deployment-diagnostics.test.ts (8 tests) 58ms
12
14
  - Reading canonical Actuate schema...
13
15
  stdout | dist/__tests__/db-init.test.js > db:init (WS-D D5 — canonical schema, no stale fragment) > command > injects canonical models with @@map and no duplicate datasource/generator
14
16
  ✔ Prisma client generated.
@@ -18,45 +20,45 @@
18
20
  - Running prisma generate...
19
21
  stdout | dist/__tests__/db-init.test.js > db:init (WS-D D5 — canonical schema, no stale fragment) > command > fails clearly when cms-core cannot be located
20
22
  ℹ Install it first: `npm install @actuate-media/cms-core`.
21
-
22
23
  - Reading canonical Actuate schema...
24
+
23
25
  ✖ Could not locate @actuate-media/cms-core.
24
26
  - Reading canonical Actuate schema...
25
- ✔ Actuate CMS models added to schema.
26
- - Running prisma generate...
27
27
  stdout | dist/__tests__/db-init.test.js > db:init (WS-D D5 — canonical schema, no stale fragment) > command > is idempotent without --force
28
28
  ✔ Prisma client generated.
29
29
  ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
30
30
 
31
+ ✔ Actuate CMS models added to schema.
32
+ - Running prisma generate...
31
33
  - Reading canonical Actuate schema...
32
34
  ℹ Actuate CMS models already present in schema. Use --force to overwrite.
33
- ✓ dist/__tests__/db-init.test.js (4 tests) 324ms
35
+ ✓ dist/__tests__/db-init.test.js (4 tests) 285ms
34
36
  - Reading canonical Actuate schema...
35
37
  ✔ Actuate CMS models added to schema.
38
+ - Running prisma generate...
36
39
  stdout | src/__tests__/db-init.test.ts > db:init (WS-D D5 — canonical schema, no stale fragment) > command > injects canonical models with @@map and no duplicate datasource/generator
37
40
  ✔ Prisma client generated.
38
- - Running prisma generate...
39
41
  ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
40
42
 
41
43
  stdout | src/__tests__/db-init.test.ts > db:init (WS-D D5 — canonical schema, no stale fragment) > command > fails clearly when cms-core cannot be located
44
+ - Reading canonical Actuate schema...
42
45
  ℹ Install it first: `npm install @actuate-media/cms-core`.
43
46
 
44
- - Reading canonical Actuate schema...
45
47
  ✖ Could not locate @actuate-media/cms-core.
46
48
  - Reading canonical Actuate schema...
49
+ ✔ Actuate CMS models added to schema.
50
+ - Running prisma generate...
47
51
  stdout | src/__tests__/db-init.test.ts > db:init (WS-D D5 — canonical schema, no stale fragment) > command > is idempotent without --force
48
52
  ✔ Prisma client generated.
49
- ✔ Actuate CMS models added to schema.
50
53
  ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
51
54
 
52
- - Running prisma generate...
53
55
  - Reading canonical Actuate schema...
54
56
  ℹ Actuate CMS models already present in schema. Use --force to overwrite.
55
- ✓ src/__tests__/db-init.test.ts (4 tests) 381ms
56
- ✓ dist/__tests__/seed.test.js (5 tests) 85ms
57
- ✓ src/__tests__/seed.test.ts (5 tests) 52ms
58
- ✓ dist/__tests__/vercel-env-matrix.test.js (5 tests) 40ms
59
- ✓ src/__tests__/vercel-env-matrix.test.ts (5 tests) 63ms
57
+ ✓ src/__tests__/db-init.test.ts (4 tests) 289ms
58
+ ✓ dist/__tests__/form-seed.test.js (10 tests) 57ms
59
+ ✓ src/__tests__/form-seed.test.ts (10 tests) 59ms
60
+ ✓ dist/__tests__/vercel-env-matrix.test.js (5 tests) 34ms
61
+ ✓ src/__tests__/vercel-env-matrix.test.ts (5 tests) 43ms
60
62
  - Reading canonical Actuate schema...
61
63
  ✔ Actuate CMS models added to schema.
62
64
  - Running prisma generate...
@@ -64,20 +66,20 @@
64
66
  ✔ Prisma client generated.
65
67
  ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
66
68
 
67
- ✓ dist/__tests__/schema-fragment.test.js (1 test) 172ms
69
+ ✓ dist/__tests__/schema-fragment.test.js (1 test) 96ms
68
70
  - Reading canonical Actuate schema...
69
- ✔ Actuate CMS models added to schema.
70
- - Running prisma generate...
71
71
  stdout | src/__tests__/schema-fragment.test.ts > db:init schema fragment > injects all deploy-critical Actuate models
72
+ ✔ Actuate CMS models added to schema.
72
73
  ✔ Prisma client generated.
73
74
  ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
74
75
 
75
- ✓ src/__tests__/schema-fragment.test.ts (1 test) 150ms
76
- ✓ dist/__tests__/init.test.js (2 tests) 46ms
77
- ✓ src/__tests__/init.test.ts (2 tests) 52ms
76
+ - Running prisma generate...
77
+ ✓ src/__tests__/schema-fragment.test.ts (1 test) 116ms
78
+ ✓ dist/__tests__/init.test.js (2 tests) 54ms
79
+ ✓ src/__tests__/init.test.ts (2 tests) 32ms
78
80
 
79
-  Test Files  14 passed (14)
80
-  Tests  70 passed (70)
81
-  Start at  16:12:59
82
-  Duration  20.13s (transform 1.93s, setup 0ms, import 5.06s, tests 2.61s, environment 3ms)
81
+  Test Files  16 passed (16)
82
+  Tests  100 passed (100)
83
+  Start at  15:53:52
84
+  Duration  23.79s (transform 2.27s, setup 0ms, import 6.86s, tests 2.20s, environment 2ms)
83
85
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @actuate-media/cli
2
2
 
3
+ ## 0.10.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 232e251: New `actuate seed --upsert` (also on `populate`): documents are matched by collection + slug and updated in place instead of inserting duplicates, making seed files safe to re-run as content evolves. Every update records a version snapshot; `publishedAt` is only stamped on the transition into PUBLISHED; documents without a slug always insert. The summary line reports created vs updated counts.
8
+
9
+ ## 0.9.0
10
+
11
+ ### Minor Changes
12
+
13
+ - be9b5ff: `actuate seed` now validates `forms`-collection entries before writing anything, with actionable per-form errors. The most common mistake — putting the document envelope status (`PUBLISHED`) in `data.status` instead of the form's own lifecycle status (`active` / `draft` / `archived`, which gates the public endpoints) — gets a targeted explanation, as do fields using `name` instead of `key`/`label` and unknown field types. The `--demo` forms were rewritten to the canonical shape (they previously seeded fields without `key`/`label` and no `data.status`, so `/api/cms/public/forms/:slug` 404'd on them).
14
+
15
+ ### Patch Changes
16
+
17
+ - 854152d: Developer experience improvements from external-consumer feedback:
18
+ - Every published package now ships its `CHANGELOG.md` in the npm tarball, and packages that were missing a `README.md` (cli, cms-admin, cms-core, import, platform-vercel, all plugins, sections-react) now have one — so release notes and usage docs are visible on npmjs.com and in `node_modules`.
19
+ - New client-safe form validation entry point: `@actuate-media/cms-core/forms/client` exports `validateFormFieldClient()`, `validateFormValuesClient()`, visibility/conditional helpers, and the exact `FORM_EMAIL_RE` / `FORM_PHONE_RE` regexes the server enforces — zero Node dependencies, so public-site forms can mirror server rules without reimplementing them. The server validator now imports the same primitives, so client and server can never drift.
20
+
3
21
  ## 0.8.0
4
22
 
5
23
  ### Minor Changes
package/README.md ADDED
@@ -0,0 +1,30 @@
1
+ # @actuate-media/cli
2
+
3
+ CLI for [Actuate CMS](https://github.com/actuate-media/actuatecms) —
4
+ migrations, codegen, seeding, imports/exports, verification, and upgrades.
5
+
6
+ ```bash
7
+ npm install -D @actuate-media/cli
8
+ ```
9
+
10
+ ## Common commands
11
+
12
+ ```bash
13
+ actuate migrate # apply Prisma migrations
14
+ actuate seed # seed content from seed scripts
15
+ actuate codegen # generate typed client from actuate.config.ts
16
+ actuate verify # check config, sections, and environment
17
+ actuate verify:cms-sections # editor ↔ frontend section contract check
18
+ actuate update # check for / apply CMS package updates
19
+ ```
20
+
21
+ Run `actuate --help` for the full command list.
22
+
23
+ ## Release notes
24
+
25
+ See [CHANGELOG.md](./CHANGELOG.md) (shipped with the package) or the
26
+ [GitHub releases](https://github.com/actuate-media/actuatecms/releases).
27
+
28
+ ## License
29
+
30
+ MIT
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=form-seed.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-seed.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/form-seed.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,79 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ // seed.js transitively imports cms-core helpers at module scope via mocks
3
+ // elsewhere; keep the same stub so importing DEMO_FORMS stays side-effect-free.
4
+ vi.mock('@actuate-media/cms-core', () => ({
5
+ extractPlainText: vi.fn(),
6
+ hashContent: vi.fn(),
7
+ sanitizeHtml: vi.fn(),
8
+ createInitialAdmin: vi.fn(),
9
+ }));
10
+ import { validateFormSeedData, validateFormSeeds } from '../utils/form-seed.js';
11
+ import { DEMO_FORMS } from '../commands/seed.js';
12
+ const validForm = () => ({
13
+ name: 'Contact',
14
+ slug: 'contact',
15
+ status: 'active',
16
+ fields: [{ id: 'f1', key: 'email', label: 'Email', type: 'email', required: true, sortOrder: 0 }],
17
+ });
18
+ describe('validateFormSeedData', () => {
19
+ it('accepts the canonical form shape', () => {
20
+ expect(validateFormSeedData(validForm())).toEqual([]);
21
+ });
22
+ it('every DEMO_FORMS entry passes its own validation', () => {
23
+ for (const form of DEMO_FORMS) {
24
+ expect(validateFormSeedData(form, form.slug)).toEqual([]);
25
+ }
26
+ });
27
+ it('explains the data.status vs document status split when status is missing', () => {
28
+ const { status: _status, ...form } = validForm();
29
+ const errors = validateFormSeedData(form);
30
+ expect(errors).toHaveLength(1);
31
+ expect(errors[0]).toContain('data.status to "active"');
32
+ expect(errors[0]).toContain('document envelope status');
33
+ });
34
+ it('catches a document-envelope status (PUBLISHED) used as the form status', () => {
35
+ const errors = validateFormSeedData({ ...validForm(), status: 'PUBLISHED' });
36
+ expect(errors).toHaveLength(1);
37
+ expect(errors[0]).toContain('looks like a document envelope status');
38
+ expect(errors[0]).toContain('"active" | "draft" | "archived"');
39
+ });
40
+ it('rejects unknown statuses with the allowed list', () => {
41
+ const errors = validateFormSeedData({ ...validForm(), status: 'live' });
42
+ expect(errors[0]).toContain('invalid data.status "live"');
43
+ });
44
+ it('requires slug, name, and a non-empty fields array', () => {
45
+ const errors = validateFormSeedData({ status: 'active' });
46
+ expect(errors.some((e) => e.includes('"slug"'))).toBe(true);
47
+ expect(errors.some((e) => e.includes('"name"'))).toBe(true);
48
+ expect(errors.some((e) => e.includes('"fields"'))).toBe(true);
49
+ });
50
+ it('points "name"-keyed fields (the old demo shape) at key/label', () => {
51
+ const errors = validateFormSeedData({
52
+ ...validForm(),
53
+ fields: [{ name: 'email', type: 'email' }],
54
+ });
55
+ expect(errors.some((e) => e.includes('Rename name → key'))).toBe(true);
56
+ expect(errors.some((e) => e.includes('"label"'))).toBe(true);
57
+ });
58
+ it('rejects unknown field types', () => {
59
+ const errors = validateFormSeedData({
60
+ ...validForm(),
61
+ fields: [{ key: 'x', label: 'X', type: 'dropdown' }],
62
+ });
63
+ expect(errors[0]).toContain('invalid type "dropdown"');
64
+ });
65
+ });
66
+ describe('validateFormSeeds', () => {
67
+ it('only validates forms-collection documents and labels errors by slug', () => {
68
+ const errors = validateFormSeeds([
69
+ { collection: 'pages', data: { title: 'Home' } },
70
+ { collection: 'forms', data: { ...validForm(), slug: 'contact', status: 'PUBLISHED' } },
71
+ ]);
72
+ expect(errors).toHaveLength(1);
73
+ expect(errors[0]).toContain('forms "contact"');
74
+ });
75
+ it('returns no errors for a payload without forms', () => {
76
+ expect(validateFormSeeds([{ collection: 'pages', data: {} }])).toEqual([]);
77
+ });
78
+ });
79
+ //# sourceMappingURL=form-seed.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-seed.test.js","sourceRoot":"","sources":["../../src/__tests__/form-seed.test.ts"],"names":[],"mappings":"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"}
@@ -112,6 +112,79 @@ describe('seed document creation', () => {
112
112
  });
113
113
  });
114
114
  });
115
+ describe('seed document upsert', () => {
116
+ function makeDb(existing) {
117
+ const tx = {
118
+ document: {
119
+ create: vi.fn().mockResolvedValue({ id: 'doc-new' }),
120
+ update: vi.fn().mockResolvedValue({ id: existing?.id ?? 'doc-new' }),
121
+ },
122
+ version: { create: vi.fn() },
123
+ };
124
+ const db = {
125
+ document: { findFirst: vi.fn().mockResolvedValue(existing) },
126
+ $transaction: vi.fn(async (fn) => fn(tx)),
127
+ };
128
+ return { db, tx };
129
+ }
130
+ const doc = {
131
+ collection: 'pages',
132
+ status: 'PUBLISHED',
133
+ data: { title: 'Home v2', slug: 'home' },
134
+ };
135
+ it('updates an existing document matched by collection + slug', async () => {
136
+ const publishedAt = new Date('2026-01-01T00:00:00Z');
137
+ const { db, tx } = makeDb({ id: 'doc-1', status: 'PUBLISHED', publishedAt });
138
+ const result = await createSeedDocument(db, 'admin-1', doc, { upsert: true });
139
+ expect(result).toBe('updated');
140
+ expect(db.document.findFirst).toHaveBeenCalledWith({
141
+ where: { collection: 'pages', slug: 'home', deletedAt: null },
142
+ select: { id: true, status: true, publishedAt: true },
143
+ });
144
+ expect(tx.document.create).not.toHaveBeenCalled();
145
+ expect(tx.document.update).toHaveBeenCalledWith({
146
+ where: { id: 'doc-1' },
147
+ data: expect.objectContaining({
148
+ title: 'Home v2',
149
+ status: 'PUBLISHED',
150
+ // Re-publishing an already-published doc keeps the original timestamp.
151
+ publishedAt,
152
+ updatedById: 'admin-1',
153
+ }),
154
+ });
155
+ expect(tx.version.create).toHaveBeenCalledWith({
156
+ data: expect.objectContaining({ documentId: 'doc-1', changeType: 'UPDATE' }),
157
+ });
158
+ });
159
+ it('stamps publishedAt on the transition into PUBLISHED', async () => {
160
+ const { db, tx } = makeDb({ id: 'doc-1', status: 'DRAFT', publishedAt: null });
161
+ await createSeedDocument(db, 'admin-1', doc, { upsert: true });
162
+ expect(tx.document.update).toHaveBeenCalledWith(expect.objectContaining({
163
+ data: expect.objectContaining({ publishedAt: expect.any(Date) }),
164
+ }));
165
+ });
166
+ it('creates when no document matches', async () => {
167
+ const { db, tx } = makeDb(null);
168
+ const result = await createSeedDocument(db, 'admin-1', doc, { upsert: true });
169
+ expect(result).toBe('created');
170
+ expect(tx.document.create).toHaveBeenCalled();
171
+ expect(tx.document.update).not.toHaveBeenCalled();
172
+ });
173
+ it('always creates slugless documents (no upsert key)', async () => {
174
+ const { db, tx } = makeDb({ id: 'doc-1', status: 'DRAFT', publishedAt: null });
175
+ const result = await createSeedDocument(db, 'admin-1', { collection: 'pages', status: 'DRAFT', data: { title: 'No slug' } }, { upsert: true });
176
+ expect(result).toBe('created');
177
+ expect(db.document.findFirst).not.toHaveBeenCalled();
178
+ expect(tx.document.create).toHaveBeenCalled();
179
+ });
180
+ it('does not look up existing documents without the upsert flag', async () => {
181
+ const { db, tx } = makeDb({ id: 'doc-1', status: 'DRAFT', publishedAt: null });
182
+ const result = await createSeedDocument(db, 'admin-1', doc);
183
+ expect(result).toBe('created');
184
+ expect(db.document.findFirst).not.toHaveBeenCalled();
185
+ expect(tx.document.create).toHaveBeenCalled();
186
+ });
187
+ });
115
188
  describe('demo navigations', () => {
116
189
  // The scaffold site layout fetches menus by the `main` and `footer` slugs, so
117
190
  // the demo seed must provide exactly those — guard against slug drift.
@@ -1 +1 @@
1
- {"version":3,"file":"seed.test.js","sourceRoot":"","sources":["../../src/__tests__/seed.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seed.test.js","sourceRoot":"","sources":["../../src/__tests__/seed.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,31 @@
1
1
  import { Command } from 'commander';
2
+ export declare const DEMO_FORMS: {
3
+ name: string;
4
+ title: string;
5
+ slug: string;
6
+ status: string;
7
+ fields: ({
8
+ id: string;
9
+ key: string;
10
+ label: string;
11
+ type: string;
12
+ required: boolean;
13
+ sortOrder: number;
14
+ options?: undefined;
15
+ } | {
16
+ id: string;
17
+ key: string;
18
+ label: string;
19
+ type: string;
20
+ required: boolean;
21
+ sortOrder: number;
22
+ options: {
23
+ label: string;
24
+ value: string;
25
+ }[];
26
+ })[];
27
+ successMessage: string;
28
+ }[];
2
29
  export declare const DEMO_NAVIGATIONS: {
3
30
  name: string;
4
31
  slug: string;
@@ -26,6 +53,8 @@ export declare function normalizeSeedPayload(seedData: unknown): NormalizedSeedP
26
53
  export declare function ensureSeedAdmin(db: any): Promise<{
27
54
  id: string;
28
55
  }>;
29
- export declare function createSeedDocument(db: any, userId: string, doc: NormalizedSeedDocument): Promise<void>;
56
+ export declare function createSeedDocument(db: any, userId: string, doc: NormalizedSeedDocument, options?: {
57
+ upsert?: boolean;
58
+ }): Promise<'created' | 'updated'>;
30
59
  export declare function registerSeedCommand(program: Command): void;
31
60
  //# sourceMappingURL=seed.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../src/commands/seed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA+JnC,eAAO,MAAM,gBAAgB;;;;;;;;;GAoB5B,CAAA;AAaD,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,sBAAsB,EAAE,CAAA;IACnC,OAAO,EAAE,oBAAoB,EAAE,CAAA;CAChC;AAyBD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,GAAG,qBAAqB,CAkC7E;AAwED,wBAAsB,eAAe,CAAC,EAAE,EAAE,GAAG,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBtE;AAoBD,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,GAAG,EACP,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,sBAAsB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAgCf;AAqHD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAe1D"}
1
+ {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../src/commands/seed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA8HnC,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;GA6FtB,CAAA;AAKD,eAAO,MAAM,gBAAgB;;;;;;;;;GAoB5B,CAAA;AAcD,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,sBAAsB,EAAE,CAAA;IACnC,OAAO,EAAE,oBAAoB,EAAE,CAAA;CAChC;AAyBD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,GAAG,qBAAqB,CAkC7E;AAwED,wBAAsB,eAAe,CAAC,EAAE,EAAE,GAAG,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBtE;AAoBD,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,GAAG,EACP,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,sBAAsB,EAC3B,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CA4EhC;AAgJD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuB1D"}