@marktoflow/cli 2.0.0-alpha.15 → 2.0.0-alpha.16

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/README.md CHANGED
@@ -1,436 +1,109 @@
1
1
  # @marktoflow/cli
2
2
 
3
- > **Author:** Scott Glover <scottgl@gmail.com>
3
+ > Command-line interface for running markdown-based workflow automations.
4
4
 
5
- **CLI-first agent automation framework** with native MCP support and direct SDK integration.
5
+ [![npm](https://img.shields.io/npm/v/@marktoflow/cli)](https://www.npmjs.com/package/@marktoflow/cli)
6
6
 
7
- **Version:** 2.0.0-alpha.14
8
-
9
- ---
10
-
11
- ## What is marktoflow?
12
-
13
- marktoflow is a **CLI-first automation framework** that lets you define workflows in Markdown + YAML and execute them across 30+ services. Write workflows as code, run them from the terminal, and optionally use the visual designer for editing.
14
-
15
- **Key Differentiators:**
16
-
17
- - 🖥️ **CLI-First** - Design and run workflows from your terminal
18
- - 📝 **Workflows as Markdown** - Human-readable, version-controlled automation
19
- - 🔌 **Native SDK Integration** - Direct method calls with full type safety
20
- - 🤖 **AI Agent Support** - GitHub Copilot, Claude, Ollama - use existing subscriptions
21
- - 🌐 **Universal REST Client** - Connect to any API without custom integrations
22
- - 🎨 **Visual Designer (Optional)** - Web-based drag-and-drop editor
23
- - 🏢 **Enterprise Ready** - RBAC, approvals, audit logging, cost tracking
24
-
25
- ## Features
26
-
27
- - **Workflow Execution** - Run workflows from markdown files
28
- - **Interactive Setup** - Initialize projects with guided prompts
29
- - **OAuth Integration** - Easy OAuth setup for Gmail, Outlook
30
- - **Scheduling** - Background workflow scheduling with cron
31
- - **Webhooks** - HTTP webhook server for event-driven workflows
32
- - **Queue Workers** - Process workflows from queues (Redis/RabbitMQ)
33
- - **Dry Run Mode** - Test workflows without executing actions
34
- - **Debug Mode** - Detailed execution logging
35
- - **Doctor** - System health checks and diagnostics
36
- - **Template Management** - Create workflows from templates
37
-
38
- ## Installation
39
-
40
- ### Install globally from npm
41
-
42
- ```bash
43
- npm install -g @marktoflow/cli@alpha
44
- ```
45
-
46
- ### Use with npx (no installation)
47
-
48
- ```bash
49
- npx @marktoflow/cli@alpha <command>
50
- ```
51
-
52
- ### Install from GitHub
53
-
54
- ```bash
55
- npm install -g github:marktoflow/marktoflow#main
56
- ```
7
+ Part of [marktoflow](../../README.md) — open-source markdown workflow automation.
57
8
 
58
9
  ## Quick Start
59
10
 
60
- ### 1. Initialize a project
61
-
62
11
  ```bash
63
- marktoflow init
64
- ```
65
-
66
- This creates:
67
-
68
- - `.marktoflow/` directory
69
- - `workflows/` directory with example workflow
70
- - `.marktoflow/config.yaml` configuration file
71
-
72
- ### 2. Create a workflow
12
+ npm install -g @marktoflow/cli
73
13
 
74
- Create `workflow.md`:
75
-
76
- ```markdown
77
- ---
78
- workflow:
79
- id: hello-world
80
- name: Hello World
81
-
82
- tools:
83
- slack:
84
- sdk: '@slack/web-api'
85
- auth:
86
- token: '${SLACK_BOT_TOKEN}'
87
-
88
- inputs:
89
- message:
90
- type: string
91
- default: 'Hello World!'
92
- ---
93
-
94
- # Hello World Workflow
95
-
96
- ## Step 1: Send Message
97
-
98
- \`\`\`yaml
99
- action: slack.chat.postMessage
100
- inputs:
101
- channel: '#general'
102
- text: '{{ inputs.message }}'
103
- \`\`\`
14
+ marktoflow init
15
+ marktoflow run workflow.md
104
16
  ```
105
17
 
106
- ### 3. Run the workflow
18
+ Or without installing:
107
19
 
108
20
  ```bash
109
- # Set environment variable
110
- export SLACK_BOT_TOKEN=xoxb-your-token
111
-
112
- # Run workflow
113
- marktoflow run workflow.md
114
-
115
- # With inputs
116
- marktoflow run workflow.md --input message="Hello marktoflow!"
21
+ npx @marktoflow/cli run workflow.md
117
22
  ```
118
23
 
119
- ## CLI Commands
24
+ ## Features
120
25
 
121
- ### Core Commands
26
+ - **Workflow Execution** — Run markdown workflows from the terminal
27
+ - **Dry Run Mode** — Test workflows without executing actions
28
+ - **OAuth Integration** — Easy OAuth setup for Gmail, Outlook, Google services
29
+ - **Scheduling** — Background cron-based workflow scheduling
30
+ - **Webhooks** — Built-in HTTP server for event-driven workflows
31
+ - **Templates** — Create workflows from built-in templates
32
+ - **Diagnostics** — `marktoflow doctor` for system health checks
33
+ - **Visual Designer** — Launch the GUI with `marktoflow gui`
122
34
 
123
- #### `marktoflow run <workflow>`
35
+ ## Key Commands
124
36
 
125
- Execute a workflow.
37
+ ### Run a workflow
126
38
 
127
39
  ```bash
128
- # Basic usage
129
40
  marktoflow run workflow.md
130
-
131
- # With inputs
132
- marktoflow run workflow.md --input key=value --input another=value
133
-
134
- # With config file
135
- marktoflow run workflow.md --config .marktoflow/config.yaml
136
-
137
- # Verbose output
41
+ marktoflow run workflow.md --input key=value
42
+ marktoflow run workflow.md --agent copilot --model gpt-4o
138
43
  marktoflow run workflow.md --verbose
44
+ marktoflow run workflow.md --dry-run
139
45
  ```
140
46
 
141
- #### `marktoflow init`
142
-
143
- Initialize a new marktoflow project.
47
+ ### Validate before running
144
48
 
145
49
  ```bash
146
- marktoflow init
147
-
148
- # Skip prompts
149
- marktoflow init --yes
50
+ marktoflow workflow validate workflow.md
150
51
  ```
151
52
 
152
- #### `marktoflow version`
153
-
154
- Show version information.
53
+ ### Connect services
155
54
 
156
55
  ```bash
157
- marktoflow version
158
- ```
159
-
160
- #### `marktoflow doctor`
161
-
162
- Run system diagnostics.
163
-
164
- ```bash
165
- marktoflow doctor
56
+ marktoflow connect gmail
57
+ marktoflow connect outlook
166
58
  ```
167
59
 
168
- ### Scheduling
169
-
170
- #### `marktoflow schedule <workflow>`
171
-
172
- Schedule a workflow to run on a cron schedule.
60
+ ### Schedule workflows
173
61
 
174
62
  ```bash
175
- # Schedule workflow
176
63
  marktoflow schedule workflow.md --cron "0 9 * * 1-5"
177
-
178
- # List scheduled workflows
179
- marktoflow schedule list
180
-
181
- # Remove schedule
182
- marktoflow schedule remove <workflow-id>
183
-
184
- # Start scheduler daemon
185
64
  marktoflow schedule start
186
-
187
- # Stop scheduler daemon
188
- marktoflow schedule stop
189
- ```
190
-
191
- ### Webhooks
192
-
193
- #### `marktoflow webhook <workflow>`
194
-
195
- Create webhook endpoint for workflow.
196
-
197
- ```bash
198
- # Start webhook server
199
- marktoflow webhook workflow.md --path /github --port 3000
200
-
201
- # With secret for signature verification
202
- marktoflow webhook workflow.md --path /github --secret ${WEBHOOK_SECRET}
203
-
204
- # List webhooks
205
- marktoflow webhook list
206
-
207
- # Stop webhook server
208
- marktoflow webhook stop
209
- ```
210
-
211
- ### Queue Workers
212
-
213
- #### `marktoflow worker`
214
-
215
- Start a queue worker to process workflows.
216
-
217
- ```bash
218
- # Start worker (Redis)
219
- marktoflow worker --queue redis --redis-url redis://localhost:6379
220
-
221
- # Start worker (RabbitMQ)
222
- marktoflow worker --queue rabbitmq --rabbitmq-url amqp://localhost
223
-
224
- # Multiple workers
225
- marktoflow worker --concurrency 5
226
- ```
227
-
228
- ### Development
229
-
230
- #### `marktoflow dry-run <workflow>`
231
-
232
- Test workflow without executing actions.
233
-
234
- ```bash
235
- marktoflow dry-run workflow.md
236
-
237
- # With mocked responses
238
- marktoflow dry-run workflow.md --mock slack.chat.postMessage=success
239
65
  ```
240
66
 
241
- #### `marktoflow debug <workflow>`
242
-
243
- Run workflow with detailed debug logging.
67
+ ### Start webhook server
244
68
 
245
69
  ```bash
246
- marktoflow debug workflow.md
70
+ marktoflow serve --port 3000
71
+ marktoflow serve --socket # Slack Socket Mode
247
72
  ```
248
73
 
249
- ### OAuth Setup
250
-
251
- #### `marktoflow connect <service>`
252
-
253
- Set up OAuth for email services.
74
+ ### Launch visual editor
254
75
 
255
76
  ```bash
256
- # Gmail OAuth
257
- marktoflow connect gmail
258
-
259
- # Outlook OAuth
260
- marktoflow connect outlook
261
- ```
262
-
263
- This launches a browser for OAuth authentication and stores credentials securely.
264
-
265
- ### Visual Designer
266
-
267
- #### `marktoflow gui`
268
-
269
- Start the visual workflow designer.
270
-
271
- ```bash
272
- # Start GUI server
273
77
  marktoflow gui
274
-
275
- # With options
276
- marktoflow gui --port 3000 # Custom port
277
- marktoflow gui --open # Open browser automatically
78
+ marktoflow gui --port 3000 --open
278
79
  ```
279
80
 
280
- ### Templates
281
-
282
- #### `marktoflow new <template>`
283
-
284
- Create workflow from template.
81
+ ### Create from template
285
82
 
286
83
  ```bash
287
- # List available templates
288
84
  marktoflow new --list
289
-
290
- # Create from template
291
85
  marktoflow new code-review --output workflows/code-review.md
292
-
293
- # Interactive wizard
294
- marktoflow new
295
- ```
296
-
297
- **Available Templates:**
298
-
299
- Built-in templates match the examples/ directory:
300
- - `code-review` - Automated GitHub PR review
301
- - `daily-standup` - Jira/Slack standup automation
302
- - `incident-response` - Multi-service incident coordination
303
- - `dependency-update` - Package update automation
304
- - `sprint-planning` - AI-assisted sprint planning
305
- - `web-automation` - Playwright browser automation
306
- - `gmail-notification` - Email automation
307
- - And more...
308
-
309
- ### Agent & Tool Management
310
-
311
- #### `marktoflow agents list`
312
-
313
- List available AI agents.
314
-
315
- ```bash
316
- marktoflow agents list
317
- ```
318
-
319
- #### `marktoflow tools list`
320
-
321
- List available tools and integrations.
322
-
323
- ```bash
324
- marktoflow tools list
325
-
326
- # Show tool details
327
- marktoflow tools show slack
328
- ```
329
-
330
- #### `marktoflow bundles list`
331
-
332
- List available tool bundles.
333
-
334
- ```bash
335
- marktoflow bundles list
336
-
337
- # Install bundle
338
- marktoflow bundles install my-bundle.json
339
- ```
340
-
341
- ## Configuration
342
-
343
- ### Environment Variables
344
-
345
- ```bash
346
- # Core
347
- MARKTOFLOW_DB_PATH=.marktoflow/state.db
348
-
349
- # Slack
350
- SLACK_BOT_TOKEN=xoxb-your-token
351
-
352
- # GitHub
353
- GITHUB_TOKEN=ghp_your-token
354
-
355
- # Jira
356
- JIRA_HOST=your-domain.atlassian.net
357
- JIRA_EMAIL=your@email.com
358
- JIRA_API_TOKEN=your-token
359
-
360
- # Gmail
361
- GMAIL_CLIENT_ID=your-client-id
362
- GMAIL_CLIENT_SECRET=your-secret
363
- GMAIL_REFRESH_TOKEN=your-refresh-token
364
-
365
- # Outlook
366
- OUTLOOK_CLIENT_ID=your-client-id
367
- OUTLOOK_CLIENT_SECRET=your-secret
368
- OUTLOOK_TENANT_ID=your-tenant-id
369
- ```
370
-
371
- ### Configuration File
372
-
373
- `.marktoflow/config.yaml`:
374
-
375
- ```yaml
376
- state:
377
- dbPath: .marktoflow/state.db
378
-
379
- queue:
380
- type: redis
381
- redis:
382
- host: localhost
383
- port: 6379
384
-
385
- security:
386
- rbac:
387
- enabled: true
388
- auditLog:
389
- enabled: true
390
-
391
- costs:
392
- budget:
393
- daily: 100
394
- monthly: 3000
395
-
396
- logging:
397
- level: info
398
- file: .marktoflow/logs/marktoflow.log
399
86
  ```
400
87
 
401
- ## Production Examples
402
-
403
- The [examples/](https://github.com/marktoflow/marktoflow/tree/main/examples) directory contains 14+ production-ready workflow templates you can use as starting points:
404
-
405
- - **[code-review](https://github.com/marktoflow/marktoflow/tree/main/examples/code-review)** - Automated GitHub PR review with security, performance, and quality checks
406
- - **[copilot-code-review](https://github.com/marktoflow/marktoflow/tree/main/examples/copilot-code-review)** - Advanced review using GitHub Copilot SDK
407
- - **[daily-standup](https://github.com/marktoflow/marktoflow/tree/main/examples/daily-standup)** - Jira + Slack activity aggregation with AI summaries
408
- - **[dependency-update](https://github.com/marktoflow/marktoflow/tree/main/examples/dependency-update)** - Automated package updates with AI changelogs
409
- - **[incident-response](https://github.com/marktoflow/marktoflow/tree/main/examples/incident-response)** - PagerDuty + Slack + Jira coordination
410
- - **[sprint-planning](https://github.com/marktoflow/marktoflow/tree/main/examples/sprint-planning)** - Velocity analysis + AI story selection
411
- - **[doc-maintenance](https://github.com/marktoflow/marktoflow/tree/main/examples/doc-maintenance)** - Smart documentation updates using Ollama
412
- - **[web-automation](https://github.com/marktoflow/marktoflow/tree/main/examples/web-automation)** - Playwright-based browser automation
413
- - **[gmail-notification](https://github.com/marktoflow/marktoflow/tree/main/examples/gmail-notification)** - Email automation with Gmail API
414
- - **[linear-sync](https://github.com/marktoflow/marktoflow/tree/main/examples/linear-sync)** - Linear issue tracking sync
415
- - **[codebase-qa](https://github.com/marktoflow/marktoflow/tree/main/examples/codebase-qa)** - AI-powered codebase Q&A
416
-
417
- Run any example:
88
+ ### Other commands
418
89
 
419
90
  ```bash
420
- marktoflow run examples/daily-standup/workflow.md
91
+ marktoflow init # Initialize project
92
+ marktoflow version # Show version
93
+ marktoflow doctor # System diagnostics
94
+ marktoflow agents list # List available AI agents
95
+ marktoflow tools list # List available integrations
96
+ marktoflow history # View execution history
421
97
  ```
422
98
 
423
- ## CLI Examples
424
-
425
- ### Daily Standup Report
99
+ ## Example: Daily Standup
426
100
 
427
101
  ```bash
428
- # Create workflow
429
- cat > workflows/daily-standup.md << 'EOF'
102
+ cat > workflows/standup.md << 'EOF'
430
103
  ---
431
104
  workflow:
432
105
  id: daily-standup
433
- name: Daily Standup Report
106
+ name: Daily Standup
434
107
 
435
108
  tools:
436
109
  jira:
@@ -456,159 +129,13 @@ steps:
456
129
  text: 'Working on: {{ issues.issues[0].fields.summary }}'
457
130
  EOF
458
131
 
459
- # Schedule for weekdays at 9 AM
460
- marktoflow schedule workflows/daily-standup.md --cron "0 9 * * 1-5"
461
-
462
- # Start scheduler
132
+ marktoflow schedule workflows/standup.md --cron "0 9 * * 1-5"
463
133
  marktoflow schedule start
464
134
  ```
465
135
 
466
- ### GitHub PR Webhook
467
-
468
- ```bash
469
- # Create webhook workflow
470
- cat > workflows/github-pr.md << 'EOF'
471
- ---
472
- workflow:
473
- id: github-pr-review
474
- name: GitHub PR Review Notification
475
-
476
- tools:
477
- slack:
478
- sdk: '@slack/web-api'
479
- auth:
480
- token: '${SLACK_BOT_TOKEN}'
481
-
482
- inputs:
483
- pr_url:
484
- type: string
485
- pr_title:
486
- type: string
487
- author:
488
- type: string
489
-
490
- steps:
491
- - action: slack.chat.postMessage
492
- inputs:
493
- channel: '#code-review'
494
- text: |
495
- 🔍 New PR ready for review
496
- *{{ inputs.pr_title }}* by {{ inputs.author }}
497
- {{ inputs.pr_url }}
498
- EOF
499
-
500
- # Start webhook server
501
- marktoflow webhook workflows/github-pr.md --path /github --port 3000
502
- ```
503
-
504
- ### Multi-Agent Workflow
505
-
506
- ```bash
507
- cat > workflows/research-and-summarize.md << 'EOF'
508
- ---
509
- workflow:
510
- id: research-summarize
511
- name: Research and Summarize
512
-
513
- tools:
514
- ollama:
515
- adapter: ollama
516
-
517
- agents:
518
- researcher:
519
- model: llama2
520
- role: research
521
- writer:
522
- model: llama2
523
- role: summarize
524
-
525
- steps:
526
- - action: ollama.generate
527
- agent: researcher
528
- inputs:
529
- prompt: 'Research recent developments in {{ inputs.topic }}'
530
- output_variable: research
531
-
532
- - action: ollama.generate
533
- agent: writer
534
- inputs:
535
- prompt: 'Summarize this research: {{ research.response }}'
536
- output_variable: summary
537
- EOF
538
-
539
- marktoflow run workflows/research-and-summarize.md --input topic="quantum computing"
540
- ```
541
-
542
- ## Troubleshooting
543
-
544
- ### Command not found
545
-
546
- If `marktoflow` command is not found after global installation:
547
-
548
- ```bash
549
- # Check npm global bin directory
550
- npm config get prefix
551
-
552
- # Add to PATH (macOS/Linux)
553
- export PATH="$PATH:$(npm config get prefix)/bin"
554
-
555
- # Or use npx
556
- npx @marktoflow/cli@alpha version
557
- ```
558
-
559
- ### Permission errors
560
-
561
- ```bash
562
- # Use npx instead of global install
563
- npx @marktoflow/cli@alpha run workflow.md
564
-
565
- # Or configure npm to use local directory
566
- npm config set prefix ~/.npm-global
567
- export PATH=~/.npm-global/bin:$PATH
568
- npm install -g @marktoflow/cli@alpha
569
- ```
570
-
571
- ### OAuth issues
572
-
573
- ```bash
574
- # Re-run OAuth setup
575
- marktoflow connect gmail --force
576
-
577
- # Check stored credentials
578
- ls -la .marktoflow/credentials/
579
- ```
580
-
581
- ## Development
582
-
583
- ### Install from source
584
-
585
- ```bash
586
- git clone https://github.com/marktoflow/marktoflow.git
587
- cd marktoflow
588
- pnpm install
589
- pnpm build
590
- npm link packages/cli
591
- ```
592
-
593
- ### Run tests
594
-
595
- ```bash
596
- pnpm test
597
- ```
598
-
599
- ## Links
600
-
601
- - [Main Repository](https://github.com/marktoflow/marktoflow)
602
- - [Documentation](https://github.com/marktoflow/marktoflow#readme)
603
- - [Installation Guide](https://github.com/marktoflow/marktoflow/blob/main/docs/INSTALLATION.md)
604
- - [Publishing Guide](https://github.com/marktoflow/marktoflow/blob/main/docs/PUBLISHING.md)
605
- - [Core Package](@marktoflow/core)
606
- - [Integrations Package](@marktoflow/integrations)
607
-
608
- ## Support
136
+ ## Contributing
609
137
 
610
- - [GitHub Issues](https://github.com/marktoflow/marktoflow/issues)
611
- - [Discussions](https://github.com/marktoflow/marktoflow/discussions)
138
+ See the [contributing guide](../../CONTRIBUTING.md).
612
139
 
613
140
  ## License
614
141
 
@@ -16,6 +16,7 @@ export interface DryRunOptions {
16
16
  }
17
17
  export interface DryRunStepResult {
18
18
  stepId: string;
19
+ stepType: string;
19
20
  action?: string;
20
21
  workflow?: string;
21
22
  status: 'completed' | 'skipped' | 'would-fail';
@@ -1 +1 @@
1
- {"version":3,"file":"dry-run.d.ts","sourceRoot":"","sources":["../../src/commands/dry-run.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,kBAAkB,CAAC;AAOnE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAyB7F;AAgLD,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,YAAY,CAAC;IAC/C,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,WAAW,GAAG,YAAY,CAAC;IACnC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAoFvB;AAiFD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAwBvF"}
1
+ {"version":3,"file":"dry-run.d.ts","sourceRoot":"","sources":["../../src/commands/dry-run.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,kBAAkB,CAAC;AAOnE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAyB7F;AA6MD,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,YAAY,CAAC;IAC/C,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,WAAW,GAAG,YAAY,CAAC;IACnC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CA4HvB;AA4ID;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAwBvF"}