@codewithahsan/paperclip-plugin-gsd 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 +231 -0
- package/dist/manifest.js +99 -0
- package/dist/manifest.js.map +7 -0
- package/dist/ui/index.js +536 -0
- package/dist/ui/index.js.map +7 -0
- package/dist/worker.js +7106 -0
- package/dist/worker.js.map +7 -0
- package/package.json +62 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Ahsan Ayaz
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# @codewithahsan/paperclip-plugin-gsd
|
|
2
|
+
|
|
3
|
+
> Bring your GSD planning workflows into [Paperclip](https://github.com/paperclipai/paperclip) — see phase progress, milestones, and verification status right where you manage your AI agents.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Why this exists
|
|
8
|
+
|
|
9
|
+
If you use [GSD (Get Shit Done)](https://github.com/get-shit-done/get-shit-done) to plan and execute work with AI agents, you already know how powerful it is. Phases, plans, waves, verification — GSD gives your agents real structure.
|
|
10
|
+
|
|
11
|
+
But there's a gap: GSD lives in the terminal. Your `.planning/` directory has all the state, but you can't see it from Paperclip's UI. You can't glance at a dashboard and know which phases are done, which agent is executing, or whether verification passed.
|
|
12
|
+
|
|
13
|
+
This plugin bridges that gap. It reads GSD's `.planning/` files (the single source of truth) and surfaces everything in Paperclip — dashboard widgets, project tabs, issue linking, and more. No reimplementation, no duplication. Just a clean read-only window into what GSD is doing.
|
|
14
|
+
|
|
15
|
+
## How it works
|
|
16
|
+
|
|
17
|
+
```mermaid
|
|
18
|
+
flowchart LR
|
|
19
|
+
subgraph Agent Environment
|
|
20
|
+
A[AI Agent] -->|runs| B[GSD Plugin]
|
|
21
|
+
B -->|writes| C[.planning/ directory]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
subgraph Paperclip
|
|
25
|
+
D[paperclip-plugin-gsd] -->|reads| C
|
|
26
|
+
D -->|syncs state| E[Plugin State Store]
|
|
27
|
+
E --> F[Dashboard Widget]
|
|
28
|
+
E --> G[Project Tab]
|
|
29
|
+
E --> H[Issue Tab]
|
|
30
|
+
E --> I[Settings Page]
|
|
31
|
+
D -->|posts comments| J[Linked Issues]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
style C fill:#4f46e5,stroke:#4f46e5,color:#fff
|
|
35
|
+
style D fill:#22c55e,stroke:#22c55e,color:#fff
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The plugin **never writes** to `.planning/` — it only reads. GSD remains the single source of truth.
|
|
39
|
+
|
|
40
|
+
### Sync triggers
|
|
41
|
+
|
|
42
|
+
The plugin syncs GSD state in three ways:
|
|
43
|
+
|
|
44
|
+
```mermaid
|
|
45
|
+
flowchart TD
|
|
46
|
+
A[Agent finishes a run] -->|event: agent.run.finished| S[Sync workspace]
|
|
47
|
+
B[New workspace created] -->|event: project.workspace_created| S
|
|
48
|
+
C[Periodic timer] -->|every N seconds| S
|
|
49
|
+
D[Manual button click] -->|action: sync-project| S
|
|
50
|
+
|
|
51
|
+
S --> P[Parse .planning/]
|
|
52
|
+
P --> U[Update plugin state]
|
|
53
|
+
U --> I[Comment on linked issues]
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Phase lifecycle
|
|
57
|
+
|
|
58
|
+
GSD phases move through a well-defined lifecycle. The plugin detects where each phase is by analyzing which files exist:
|
|
59
|
+
|
|
60
|
+
```mermaid
|
|
61
|
+
stateDiagram-v2
|
|
62
|
+
[*] --> NotStarted: Phase directory created
|
|
63
|
+
NotStarted --> Context: CONTEXT.md written
|
|
64
|
+
Context --> Researching: RESEARCH.md written
|
|
65
|
+
Researching --> Planned: PLAN.md files created
|
|
66
|
+
Planned --> Executing: First SUMMARY.md written
|
|
67
|
+
Executing --> Executing: More SUMMARY.md files
|
|
68
|
+
Executing --> Finishing: All SUMMARY.md done (current phase)
|
|
69
|
+
Finishing --> Complete: Verification passed
|
|
70
|
+
Finishing --> Verifying: Gaps found / needs review
|
|
71
|
+
Verifying --> Complete: Gaps resolved
|
|
72
|
+
Executing --> Diagnosed: UAT found issues
|
|
73
|
+
Diagnosed --> Executing: Fix plans added
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
| Status | What it means | How it's detected |
|
|
77
|
+
|--------|---------------|-------------------|
|
|
78
|
+
| Not Started | Phase directory exists, nothing inside | No CONTEXT, RESEARCH, or PLAN files |
|
|
79
|
+
| Context Gathered | Design vision captured | `CONTEXT.md` present |
|
|
80
|
+
| Researched | Technical research done | `RESEARCH.md` present |
|
|
81
|
+
| Planned | Plans created, ready to execute | `PLAN.md` files exist, no `SUMMARY.md` |
|
|
82
|
+
| Executing | Agent is working through plans | Some plans have `SUMMARY.md` |
|
|
83
|
+
| Finishing | All plans done, post-execution running | All `SUMMARY.md` exist, still current phase |
|
|
84
|
+
| Verifying | Verification found gaps or needs human review | `VERIFICATION.md` status is `gaps_found` or `human_needed` |
|
|
85
|
+
| Complete | Phase fully done | All `SUMMARY.md` + verification passed (or no verification) |
|
|
86
|
+
| Gaps Found | UAT diagnosed issues | `UAT.md` status is `diagnosed` |
|
|
87
|
+
|
|
88
|
+
## Getting started
|
|
89
|
+
|
|
90
|
+
### Prerequisites
|
|
91
|
+
|
|
92
|
+
- A running [Paperclip](https://github.com/paperclipai/paperclip) instance
|
|
93
|
+
- [GSD](https://github.com/get-shit-done/get-shit-done) installed in your agent's environment (Claude Code plugin, Gemini CLI skill, etc.)
|
|
94
|
+
|
|
95
|
+
### Install the plugin
|
|
96
|
+
|
|
97
|
+
From npm:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
npx paperclipai plugin install @codewithahsan/paperclip-plugin-gsd
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
From a local clone:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
git clone https://github.com/AhsanAyaz/paperclip-plugin-gsd.git
|
|
107
|
+
cd paperclip-plugin-gsd
|
|
108
|
+
npm install && npm run build
|
|
109
|
+
npx paperclipai plugin install ./
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### What you'll see
|
|
113
|
+
|
|
114
|
+
Once installed, the plugin adds five UI components to Paperclip:
|
|
115
|
+
|
|
116
|
+
| Component | Where | What it shows |
|
|
117
|
+
|-----------|-------|---------------|
|
|
118
|
+
| **Dashboard Widget** | Main dashboard | Progress overview across all projects |
|
|
119
|
+
| **GSD Tab** | Project detail page | Full phase roadmap with progress bars, artifact badges, and verification status |
|
|
120
|
+
| **GSD Phase Tab** | Issue detail page | Phase details for issues linked to GSD phases |
|
|
121
|
+
| **Sync GSD Button** | Project toolbar | One-click manual sync |
|
|
122
|
+
| **GSD Settings** | Plugin settings | Auto-sync toggle, sync interval, agent compatibility table |
|
|
123
|
+
|
|
124
|
+
### Configuration
|
|
125
|
+
|
|
126
|
+
Open the GSD Settings page in Paperclip to configure:
|
|
127
|
+
|
|
128
|
+
- **Auto-sync** — Enable/disable periodic syncing (default: enabled)
|
|
129
|
+
- **Sync interval** — How often to check for GSD changes, 10–600 seconds (default: 30s)
|
|
130
|
+
|
|
131
|
+
### Linking phases to issues
|
|
132
|
+
|
|
133
|
+
You can link GSD phases to Paperclip issues. When a linked phase makes progress (plans complete, verification runs), the plugin posts a comment on the issue automatically.
|
|
134
|
+
|
|
135
|
+
Use the `link-phase` action via the plugin API:
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
projectId: "your-project-id"
|
|
139
|
+
phaseNumber: "17"
|
|
140
|
+
issueId: "your-issue-id"
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Architecture
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
src/
|
|
147
|
+
├── manifest.ts # Plugin manifest (capabilities, UI slots, config schema)
|
|
148
|
+
├── worker.ts # Core sync logic, event handlers, data providers, actions
|
|
149
|
+
├── gsd-parser.ts # Reads and parses .planning/ directory structure
|
|
150
|
+
├── gsd-types.ts # TypeScript interfaces for all GSD data structures
|
|
151
|
+
├── adapter-compat.ts # Agent adapter compatibility detection
|
|
152
|
+
├── constants.ts # Plugin IDs, data keys, action keys
|
|
153
|
+
└── ui/
|
|
154
|
+
└── index.tsx # All 5 UI components (React)
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Key design decisions
|
|
158
|
+
|
|
159
|
+
- **Read-only** — The plugin never modifies `.planning/` files. GSD is the single source of truth.
|
|
160
|
+
- **File-based detection** — Phase status is inferred from which files exist (CONTEXT.md, RESEARCH.md, PLAN.md, SUMMARY.md, VERIFICATION.md, UAT.md), not from any configuration.
|
|
161
|
+
- **Adapter-aware** — Not all agent adapters support GSD. The plugin detects compatibility and surfaces it clearly in the settings page.
|
|
162
|
+
- **Event-driven + periodic** — Syncs happen on agent run completion, workspace creation, and on a configurable timer. Manual sync is always available.
|
|
163
|
+
|
|
164
|
+
## Development
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
# Install dependencies
|
|
168
|
+
npm install
|
|
169
|
+
|
|
170
|
+
# Build the plugin (worker + manifest + UI)
|
|
171
|
+
npm run build
|
|
172
|
+
|
|
173
|
+
# Watch mode for development
|
|
174
|
+
npm run build:watch
|
|
175
|
+
|
|
176
|
+
# Run tests
|
|
177
|
+
npm test
|
|
178
|
+
|
|
179
|
+
# Type check
|
|
180
|
+
npm run typecheck
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Running tests
|
|
184
|
+
|
|
185
|
+
Tests use [Vitest](https://vitest.dev/) and test the GSD parser against fixture files in `tests/fixtures/.planning/`:
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
npm test
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Contributing
|
|
192
|
+
|
|
193
|
+
Contributions are welcome! Whether it's a bug fix, a new feature, or better docs — we'd love your help.
|
|
194
|
+
|
|
195
|
+
### How to contribute
|
|
196
|
+
|
|
197
|
+
1. **Fork** the repo
|
|
198
|
+
2. **Create a branch** for your change (`git checkout -b feat/my-feature`)
|
|
199
|
+
3. **Make your changes** — follow the existing code style
|
|
200
|
+
4. **Add tests** if you're changing parser or worker logic
|
|
201
|
+
5. **Run `npm test`** to make sure nothing breaks
|
|
202
|
+
6. **Open a PR** with a clear description of what you changed and why
|
|
203
|
+
|
|
204
|
+
### Ideas for contributions
|
|
205
|
+
|
|
206
|
+
- Better UI components (charts, timeline views)
|
|
207
|
+
- Support for more agent adapters
|
|
208
|
+
- Phase-to-issue auto-linking based on naming conventions
|
|
209
|
+
- Milestone progress tracking across multiple projects
|
|
210
|
+
- Notifications when phases complete or verification fails
|
|
211
|
+
|
|
212
|
+
### Code style
|
|
213
|
+
|
|
214
|
+
- TypeScript, strict mode
|
|
215
|
+
- No unnecessary abstractions — keep it simple
|
|
216
|
+
- Tests for parser and worker logic
|
|
217
|
+
- UI components use inline styles with CSS variable fallbacks
|
|
218
|
+
|
|
219
|
+
## Compatibility
|
|
220
|
+
|
|
221
|
+
- **Paperclip** — tested with the latest version
|
|
222
|
+
- **GSD** — compatible with the GSD `.planning/` directory format
|
|
223
|
+
- **Agents** — works with Claude Code (`claude_local` adapter, full support), process-based agents (partial support). Other adapters will show an informational message.
|
|
224
|
+
|
|
225
|
+
## License
|
|
226
|
+
|
|
227
|
+
MIT — see [LICENSE](./LICENSE)
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
Built with care by [Ahsan Ayaz](https://codewithahsan.dev). If this plugin helps your workflow, give it a star!
|
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
const manifest = {
|
|
2
|
+
id: "paperclip.gsd",
|
|
3
|
+
apiVersion: 1,
|
|
4
|
+
version: "0.1.0",
|
|
5
|
+
displayName: "GSD \u2014 Get Shit Done",
|
|
6
|
+
description: "Bridges GSD planning workflows with Paperclip. Syncs phases, milestones, and progress from agent workspaces into Paperclip issues and UI.",
|
|
7
|
+
author: "Paperclip",
|
|
8
|
+
categories: ["workspace", "automation"],
|
|
9
|
+
capabilities: [
|
|
10
|
+
"events.subscribe",
|
|
11
|
+
"jobs.schedule",
|
|
12
|
+
"plugin.state.read",
|
|
13
|
+
"plugin.state.write",
|
|
14
|
+
"companies.read",
|
|
15
|
+
"projects.read",
|
|
16
|
+
"project.workspaces.read",
|
|
17
|
+
"issues.read",
|
|
18
|
+
"issues.update",
|
|
19
|
+
"issue.comments.read",
|
|
20
|
+
"issue.comments.create",
|
|
21
|
+
"agents.read",
|
|
22
|
+
"ui.dashboardWidget.register",
|
|
23
|
+
"ui.detailTab.register",
|
|
24
|
+
"ui.action.register",
|
|
25
|
+
"instance.settings.register",
|
|
26
|
+
"activity.log.write"
|
|
27
|
+
],
|
|
28
|
+
entrypoints: {
|
|
29
|
+
worker: "./dist/worker.js",
|
|
30
|
+
ui: "./dist/ui"
|
|
31
|
+
},
|
|
32
|
+
instanceConfigSchema: {
|
|
33
|
+
type: "object",
|
|
34
|
+
properties: {
|
|
35
|
+
autoSyncEnabled: {
|
|
36
|
+
type: "boolean",
|
|
37
|
+
title: "Enable auto-sync",
|
|
38
|
+
description: "Periodically sync GSD state from project workspaces",
|
|
39
|
+
default: true
|
|
40
|
+
},
|
|
41
|
+
syncIntervalSeconds: {
|
|
42
|
+
type: "number",
|
|
43
|
+
title: "Sync interval (seconds)",
|
|
44
|
+
description: "How often to check for GSD changes (minimum 10)",
|
|
45
|
+
default: 30,
|
|
46
|
+
minimum: 10,
|
|
47
|
+
maximum: 600
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
jobs: [
|
|
52
|
+
{
|
|
53
|
+
jobKey: "periodic-sync",
|
|
54
|
+
displayName: "Periodic GSD Sync"
|
|
55
|
+
}
|
|
56
|
+
],
|
|
57
|
+
ui: {
|
|
58
|
+
slots: [
|
|
59
|
+
{
|
|
60
|
+
type: "dashboardWidget",
|
|
61
|
+
id: "gsd-overview",
|
|
62
|
+
displayName: "GSD Progress",
|
|
63
|
+
exportName: "GsdDashboardWidget"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
type: "detailTab",
|
|
67
|
+
id: "gsd-project-tab",
|
|
68
|
+
displayName: "GSD",
|
|
69
|
+
exportName: "GsdProjectTab",
|
|
70
|
+
entityTypes: ["project"]
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
type: "detailTab",
|
|
74
|
+
id: "gsd-issue-tab",
|
|
75
|
+
displayName: "GSD Phase",
|
|
76
|
+
exportName: "GsdIssueTab",
|
|
77
|
+
entityTypes: ["issue"]
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
type: "toolbarButton",
|
|
81
|
+
id: "gsd-sync-btn",
|
|
82
|
+
displayName: "Sync GSD",
|
|
83
|
+
exportName: "GsdSyncButton",
|
|
84
|
+
entityTypes: ["project"]
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
type: "settingsPage",
|
|
88
|
+
id: "gsd-settings",
|
|
89
|
+
displayName: "GSD Settings",
|
|
90
|
+
exportName: "GsdSettingsPage"
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
var manifest_default = manifest;
|
|
96
|
+
export {
|
|
97
|
+
manifest_default as default
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/manifest.ts"],
|
|
4
|
+
"sourcesContent": ["import type { PaperclipPluginManifestV1 } from \"@paperclipai/plugin-sdk\";\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: \"paperclip.gsd\",\n apiVersion: 1,\n version: \"0.1.0\",\n displayName: \"GSD \\u2014 Get Shit Done\",\n description:\n \"Bridges GSD planning workflows with Paperclip. Syncs phases, milestones, and progress from agent workspaces into Paperclip issues and UI.\",\n author: \"Paperclip\",\n categories: [\"workspace\", \"automation\"],\n capabilities: [\n \"events.subscribe\",\n \"jobs.schedule\",\n \"plugin.state.read\",\n \"plugin.state.write\",\n \"companies.read\",\n \"projects.read\",\n \"project.workspaces.read\",\n \"issues.read\",\n \"issues.update\",\n \"issue.comments.read\",\n \"issue.comments.create\",\n \"agents.read\",\n \"ui.dashboardWidget.register\",\n \"ui.detailTab.register\",\n \"ui.action.register\",\n \"instance.settings.register\",\n \"activity.log.write\",\n ],\n entrypoints: {\n worker: \"./dist/worker.js\",\n ui: \"./dist/ui\",\n },\n instanceConfigSchema: {\n type: \"object\",\n properties: {\n autoSyncEnabled: {\n type: \"boolean\",\n title: \"Enable auto-sync\",\n description: \"Periodically sync GSD state from project workspaces\",\n default: true,\n },\n syncIntervalSeconds: {\n type: \"number\",\n title: \"Sync interval (seconds)\",\n description: \"How often to check for GSD changes (minimum 10)\",\n default: 30,\n minimum: 10,\n maximum: 600,\n },\n },\n },\n jobs: [\n {\n jobKey: \"periodic-sync\",\n displayName: \"Periodic GSD Sync\",\n },\n ],\n ui: {\n slots: [\n {\n type: \"dashboardWidget\",\n id: \"gsd-overview\",\n displayName: \"GSD Progress\",\n exportName: \"GsdDashboardWidget\",\n },\n {\n type: \"detailTab\",\n id: \"gsd-project-tab\",\n displayName: \"GSD\",\n exportName: \"GsdProjectTab\",\n entityTypes: [\"project\"],\n },\n {\n type: \"detailTab\",\n id: \"gsd-issue-tab\",\n displayName: \"GSD Phase\",\n exportName: \"GsdIssueTab\",\n entityTypes: [\"issue\"],\n },\n {\n type: \"toolbarButton\",\n id: \"gsd-sync-btn\",\n displayName: \"Sync GSD\",\n exportName: \"GsdSyncButton\",\n entityTypes: [\"project\"],\n },\n {\n type: \"settingsPage\",\n id: \"gsd-settings\",\n displayName: \"GSD Settings\",\n exportName: \"GsdSettingsPage\",\n },\n ],\n },\n};\n\nexport default manifest;\n"],
|
|
5
|
+
"mappings": "AAEA,MAAM,WAAsC;AAAA,EAC1C,IAAI;AAAA,EACJ,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aACE;AAAA,EACF,QAAQ;AAAA,EACR,YAAY,CAAC,aAAa,YAAY;AAAA,EACtC,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,QAAQ;AAAA,IACR,IAAI;AAAA,EACN;AAAA,EACA,sBAAsB;AAAA,IACpB,MAAM;AAAA,IACN,YAAY;AAAA,MACV,iBAAiB;AAAA,QACf,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA,qBAAqB;AAAA,QACnB,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ;AAAA,MACE,QAAQ;AAAA,MACR,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,IAAI;AAAA,IACF,OAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,aAAa,CAAC,SAAS;AAAA,MACzB;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,aAAa,CAAC,OAAO;AAAA,MACvB;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,aAAa,CAAC,SAAS;AAAA,MACzB;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAO,mBAAQ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|