n8n-nodes-smartprofiling 0.1.10 → 0.2.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/README.md CHANGED
@@ -1,387 +1,109 @@
1
1
  # n8n-nodes-smartprofiling
2
2
 
3
- > **Extract YouTube transcripts, generate AI summaries, and chat with videos** - all directly in your n8n workflows.
3
+ Turn any YouTube video, channel or playlist into transcripts, summaries, chapters and answers inside your n8n workflows.
4
4
 
5
- [![npm version](https://badge.fury.io/js/n8n-nodes-smartprofiling.svg)](https://www.npmjs.com/package/n8n-nodes-smartprofiling)
6
- [![npm provenance](https://img.shields.io/badge/npm-provenance-blue)](https://www.npmjs.com/package/n8n-nodes-smartprofiling#provenance)
7
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
+ [![npm version](https://img.shields.io/npm/v/n8n-nodes-smartprofiling)](https://www.npmjs.com/package/n8n-nodes-smartprofiling)
6
+ [![npm downloads](https://img.shields.io/npm/dm/n8n-nodes-smartprofiling)](https://www.npmjs.com/package/n8n-nodes-smartprofiling)
7
+ [![CI](https://img.shields.io/github/actions/workflow/status/mjmirza/n8n-nodes-smartprofiling/ci.yml?branch=main&label=CI)](https://github.com/mjmirza/n8n-nodes-smartprofiling/actions/workflows/ci.yml)
8
+ [![Signed with npm provenance](https://img.shields.io/badge/npm-provenance%20signed-brightgreen)](https://www.npmjs.com/package/n8n-nodes-smartprofiling#provenance)
9
+ [![License MIT](https://img.shields.io/npm/l/n8n-nodes-smartprofiling)](LICENSE.md)
8
10
 
9
- ---
11
+ ## What you get
10
12
 
11
- ## Quick Start (2 minutes)
13
+ - **A transcript in one step.** Paste a video ID or URL and get clean text back, ready for a sheet, a CMS or an AI step.
14
+ - **Summaries without watching.** Brief, detailed, bullet point or chapter summaries.
15
+ - **Answers from a video.** Send a question and get an answer grounded in what the video actually says.
16
+ - **Chapters and speakers.** Timestamped chapters ready for a YouTube description, and speakers labelled in interviews and podcasts.
17
+ - **Channel intelligence.** Videos, shorts, playlists, subscriber and view counts, and growth over 7 to 365 days for any channel.
18
+ - **Signed releases.** Every version is published from GitHub Actions with npm provenance, so you can trace it to the exact commit.
12
19
 
13
- ### Step 1: Install the Node
20
+ ## From install to first result
14
21
 
15
- 1. Open your n8n instance
16
- 2. Go to **Settings** (gear icon) → **Community Nodes**
17
- 3. Click **Install a community node**
18
- 4. Paste: `n8n-nodes-smartprofiling`
19
- 5. Click **Install**
22
+ 1. In n8n open **Settings**, then **Community Nodes**, then **Install a community node**, enter `n8n-nodes-smartprofiling` and install.
23
+ 2. Create an API key at [smartprofiling.com](https://smartprofiling.com) under **Dashboard**, then **API Keys**. Keys start with `sp_`.
24
+ 3. In n8n add a credential of type **Smart Profiling API** and paste the key.
25
+ 4. Add a **Smart Profiling** node, pick **Transcript** and **Get Single**, enter a video ID such as `dQw4w9WgXcQ`, and run it.
26
+ 5. The transcript appears in the output panel. Connect it to any next step.
20
27
 
21
- ### Step 2: Get Your API Key
28
+ ## Operations
22
29
 
23
- 1. Go to [smartprofiling.com/signup](https://smartprofiling.com/signup)
24
- 2. Create a free account
25
- 3. Go to **Dashboard** → **API Keys**
26
- 4. Click **Create API Key**
27
- 5. Copy your key (starts with `sp_`)
30
+ | Resource | Operation | What it does |
31
+ |---|---|---|
32
+ | Channel | Get Videos | Lists a channel's videos, with a continuation token for the next page |
33
+ | Channel | Get Shorts | Lists a channel's shorts |
34
+ | Channel | Get Playlists | Lists a channel's playlists |
35
+ | Channel | Get Stats | Subscribers, views and video count, with optional AI insights |
36
+ | Channel | Get Growth | Growth data for 7, 30, 90 or 365 days |
37
+ | Chapter | Generate Chapters | Timestamped chapters as JSON, YouTube description text or Markdown, with optional minimum length and maximum count |
38
+ | Chat | Send Message | Asks a question about a video and keeps a conversation ID for follow ups |
39
+ | Playlist | Get Videos | Lists the videos in a playlist, from an ID or a full URL, up to the Limit you set |
40
+ | Speaker | Identify Speakers | Labels who speaks when |
41
+ | Summarize | Generate Summary | Brief, Detailed, Bullet Points or Chapters format |
42
+ | Transcript | Get Single | Transcript for one video as JSON, text, SRT or VTT. With JSON, a Display Format adds a Timeline, Plain, Paragraph or Sentences `formattedText` field |
43
+ | Transcript | Get Bulk | Transcripts for several videos in one request |
28
44
 
29
- ### Step 3: Add Credentials in n8n
45
+ Every operation supports n8n's **Continue On Fail**, and failed items keep the HTTP status code. Rate limits are retried with backoff and honor the API's Retry-After header. Server errors are retried only on calls that do not use credits, so a paid request is never charged twice.
30
46
 
31
- 1. In n8n, go to **Credentials** → **Add Credential**
32
- 2. Search for **Smart Profiling API**
33
- 3. Paste your API key
34
- 4. Click **Save**
47
+ Summary Length, Custom Prompt, Max Speakers, and the chat Max Tokens and Temperature are sent with the request but not yet applied by the API.
35
48
 
36
- **Done!** You're ready to use the node.
49
+ ### Example workflows
37
50
 
38
- ---
51
+ Daily digest:
52
+ - Schedule Trigger, then Channel Get Videos, then Summarize Generate Summary per video, then send to email, Slack or Notion.
39
53
 
40
- ## What Can You Do?
54
+ Video question bot:
55
+ - Webhook, then Chat Send Message, then Respond to Webhook.
41
56
 
42
- | Feature | Description | Use Case |
43
- |---------|-------------|----------|
44
- | **Transcripts** | Extract captions from any YouTube video | Content repurposing, SEO |
45
- | **Summarize** | AI-powered video summaries | Newsletter digests, research |
46
- | **Chat** | Ask questions about video content | Customer support, Q&A bots |
47
- | **Chapters** | Auto-generate timestamps | YouTube descriptions |
48
- | **Speakers** | Identify and label speakers | Interview analysis, podcasts |
49
- | **Channel** | Get all videos from a channel | Bulk processing, monitoring |
50
- | **Channel Stats** | Get subscriber/view/video counts | Creator analytics |
51
- | **Channel Growth** | Get historical growth data | Trend analysis |
52
- | **Playlist** | Get videos from a playlist | Course processing, archives |
57
+ Bulk transcript export:
58
+ - Playlist Get Videos, then Transcript Get Single per item, then Google Sheets or a database.
53
59
 
54
- ---
60
+ ## Credentials
55
61
 
56
- ## Step-by-Step Examples
62
+ | Field | Value |
63
+ |---|---|
64
+ | API Key | Your key from the Smart Profiling dashboard |
65
+ | Base URL | Leave the default unless you were given a dedicated domain. Must use https and a public host |
57
66
 
58
- ### Example 1: Extract a Transcript
59
-
60
- **Goal:** Get the transcript of a YouTube video
61
-
62
- 1. Add a **Smart Profiling** node to your workflow
63
- 2. Set **Resource** → `Transcript`
64
- 3. Set **Operation** → `Get Single`
65
- 4. Enter the **Video ID**: `dQw4w9WgXcQ` (or paste full URL)
66
- 5. Choose **Format**: `text` or `json`
67
- 6. Execute!
68
-
69
- **Output:**
70
- ```json
71
- {
72
- "transcript": "Never gonna give you up, never gonna let you down...",
73
- "videoId": "dQw4w9WgXcQ",
74
- "language": "en"
75
- }
76
- ```
77
-
78
- ---
79
-
80
- ### Example 2: Summarize a Video
81
-
82
- **Goal:** Get an AI summary of a video
83
-
84
- 1. Add a **Smart Profiling** node
85
- 2. Set **Resource** → `Summarize`
86
- 3. Set **Operation** → `Generate Summary`
87
- 4. Enter the **Video ID**
88
- 5. Choose **Summary Type**:
89
- - `brief` - 2-3 sentences
90
- - `detailed` - Full analysis with key points
91
- - `bullets` - Bullet point list
92
- - `chapters` - Summary organized by chapters
93
-
94
- **Output:**
95
- ```json
96
- {
97
- "summary": "This video explains the basics of...",
98
- "videoId": "abc123",
99
- "type": "brief"
100
- }
101
- ```
102
-
103
- ---
104
-
105
- ### Example 3: Chat with a Video
106
-
107
- **Goal:** Ask questions about video content
108
-
109
- 1. Add a **Smart Profiling** node
110
- 2. Set **Resource** → `Chat`
111
- 3. Set **Operation** → `Ask Question`
112
- 4. Enter the **Video ID**
113
- 5. Type your **Question**: "What are the main topics discussed?"
114
-
115
- **Output:**
116
- ```json
117
- {
118
- "answer": "The main topics discussed are...",
119
- "videoId": "abc123"
120
- }
121
- ```
122
-
123
- ---
124
-
125
- ### Example 4: Get Channel Videos
126
-
127
- **Goal:** Get all videos from a YouTube channel
128
-
129
- 1. Add a **Smart Profiling** node
130
- 2. Set **Resource** → `Channel`
131
- 3. Set **Operation** → `Get Videos`
132
- 4. Enter the **Channel ID or Handle**: `@mkbhd` or `UCBJycsmduvYEL83R_U4JriQ`
133
- 5. Set **Limit**: `50` (max videos to return)
134
-
135
- **Output:** Array of video objects with IDs, titles, thumbnails, etc.
136
-
137
- ---
138
-
139
- ### Example 5: Get Channel Statistics
140
-
141
- **Goal:** Get comprehensive channel statistics
142
-
143
- 1. Add a **Smart Profiling** node
144
- 2. Set **Resource** → `Channel`
145
- 3. Set **Operation** → `Get Stats`
146
- 4. Enter the **Channel ID or Handle**: `@MrBeast`
147
- 5. Optionally enable **Include AI Insights** for growth recommendations
148
-
149
- **Output:**
150
- ```json
151
- {
152
- "success": true,
153
- "data": {
154
- "channelId": "UCX6OQ3DkcsbYNE6H8uQQuVA",
155
- "handle": "@MrBeast",
156
- "name": "MrBeast",
157
- "subscriberCount": 463000000,
158
- "viewCount": 89410000000,
159
- "videoCount": 944,
160
- "thumbnailUrl": "https://...",
161
- "insights": {
162
- "trend": "growing",
163
- "recommendations": ["Post consistently", "Engage with comments"]
164
- }
165
- }
166
- }
167
- ```
168
-
169
- ---
170
-
171
- ### Example 6: Get Channel Growth Data
172
-
173
- **Goal:** Track channel growth over time
174
-
175
- 1. Add a **Smart Profiling** node
176
- 2. Set **Resource** → `Channel`
177
- 3. Set **Operation** → `Get Growth`
178
- 4. Enter the **Channel ID or Handle**: `@MrBeast`
179
- 5. Select **Time Period**: `30d` (or 7d, 90d, 365d)
180
-
181
- **Output:**
182
- ```json
183
- {
184
- "success": true,
185
- "data": {
186
- "channelId": "UCX6OQ3DkcsbYNE6H8uQQuVA",
187
- "period": "30d",
188
- "dataPoints": [
189
- { "date": "2026-01-01", "subscriberCount": 460000000, "viewCount": 88000000000 },
190
- { "date": "2026-01-15", "subscriberCount": 461500000, "viewCount": 88700000000 }
191
- ],
192
- "summary": {
193
- "subscriberChange": 3000000,
194
- "subscriberChangePercent": 0.65,
195
- "viewChange": 1410000000,
196
- "viewChangePercent": 1.6
197
- }
198
- }
199
- }
200
- ```
201
-
202
- ---
203
-
204
- ## Workflow Templates
205
-
206
- ### Template 1: Daily YouTube Digest
207
-
208
- ```
209
- Schedule Trigger (Daily)
210
- ↓
211
- Smart Profiling (Channel → Get Videos)
212
- ↓
213
- Smart Profiling (Summarize each video)
214
- ↓
215
- Send Email / Slack / Notion
216
- ```
217
-
218
- ### Template 2: Video Q&A Bot
219
-
220
- ```
221
- Webhook (receives question)
222
- ↓
223
- Smart Profiling (Chat → Ask Question)
224
- ↓
225
- Respond to Webhook
226
- ```
227
-
228
- ### Template 3: Bulk Transcript Export
229
-
230
- ```
231
- Smart Profiling (Playlist → Get Videos)
232
- ↓
233
- Loop Over Items
234
- ↓
235
- Smart Profiling (Transcript → Get Single)
236
- ↓
237
- Google Sheets / Airtable / Database
238
- ```
239
-
240
- ### Template 4: Creator Analytics Dashboard
241
-
242
- ```
243
- Schedule Trigger (Daily)
244
- ↓
245
- Smart Profiling (Channel → Get Stats) [Multiple channels]
246
- ↓
247
- Smart Profiling (Channel → Get Growth)
248
- ↓
249
- Compare & Calculate Trends
250
- ↓
251
- Store in Database / Send Report
252
- ```
253
-
254
- ### Template 5: Competitor Monitoring
255
-
256
- ```
257
- Schedule Trigger (Weekly)
258
- ↓
259
- Smart Profiling (Channel → Get Stats) [Your channel]
260
- ↓
261
- Smart Profiling (Channel → Get Stats) [Competitor channels]
262
- ↓
263
- Compare Growth Rates
264
- ↓
265
- Slack / Email Alert if competitor is growing faster
266
- ```
267
-
268
- ---
269
-
270
- ## API Reference
271
-
272
- ### Resources & Operations
273
-
274
- #### Transcript
275
- | Operation | Description |
276
- |-----------|-------------|
277
- | Get Single | Extract transcript from one video |
278
- | Get Bulk | Extract transcripts from multiple videos |
279
-
280
- #### Summarize
281
- | Operation | Description |
282
- |-----------|-------------|
283
- | Generate Summary | AI summary (brief/detailed/bullets/takeaways) |
284
-
285
- #### Chat
286
- | Operation | Description |
287
- |-----------|-------------|
288
- | Ask Question | Ask a question about video content |
289
-
290
- #### Chapter
291
- | Operation | Description |
292
- |-----------|-------------|
293
- | Generate Chapters | Auto-generate timestamps |
294
-
295
- #### Speakers
296
- | Operation | Description |
297
- |-----------|-------------|
298
- | Identify Speakers | Identify and label speakers in transcript |
299
-
300
- #### Channel
301
- | Operation | Description |
302
- |-----------|-------------|
303
- | Get Videos | Get all videos from channel |
304
- | Get Shorts | Get shorts from channel |
305
- | Get Playlists | Get playlists from channel |
306
- | Get Stats | Get channel statistics (subscribers, views, videos) |
307
- | Get Growth | Get historical growth data (7d, 30d, 90d, 365d) |
308
-
309
- #### Playlist
310
- | Operation | Description |
311
- |-----------|-------------|
312
- | Get Videos | Get all videos in a playlist |
313
-
314
- ---
315
-
316
- ## Supported Formats
317
-
318
- ### Transcript Formats
319
- - `json` - Structured JSON with timestamps
320
- - `text` - Plain text
321
- - `srt` - SubRip subtitle format
322
- - `vtt` - WebVTT subtitle format
323
-
324
- ### Summary Types
325
- - `brief` - 2-3 sentence summary
326
- - `detailed` - Comprehensive with key points
327
- - `bullet-points` - Bullet point list
328
- - `chapters` - Summary organized by video chapters
329
-
330
- ### Chapter Formats
331
- - `json` - Structured data
332
- - `youtube` - Ready for YouTube description
333
- - `markdown` - Markdown formatted
334
-
335
- ---
67
+ The credential is tested on save with a request that uses no credits, so a wrong key shows up immediately. API documentation is at [smartprofiling.com/api-docs](https://smartprofiling.com/api-docs).
336
68
 
337
69
  ## Troubleshooting
338
70
 
339
- ### "Node not appearing in search"
340
-
341
- 1. Go to **Settings** → **Community Nodes**
342
- 2. Check if `n8n-nodes-smartprofiling` shows version `0.1.9`
343
- 3. If not, click **Update** or uninstall/reinstall
344
- 4. Hard refresh browser: `Ctrl+Shift+R` (Windows) or `Cmd+Shift+R` (Mac)
345
-
346
- ### "Invalid API Key"
347
-
348
- 1. Make sure your key starts with `sp_`
349
- 2. Check for extra spaces when copying
350
- 3. Verify key is active at [smartprofiling.com/dashboard](https://smartprofiling.com/dashboard)
351
-
352
- ### "Video not found"
353
-
354
- 1. Check if video is public (not private/unlisted)
355
- 2. Verify the video ID is correct
356
- 3. Try pasting the full YouTube URL instead
357
-
358
- ### "Rate limit exceeded"
359
-
360
- 1. Check your usage at [smartprofiling.com/dashboard](https://smartprofiling.com/dashboard)
361
- 2. Upgrade your plan if needed
362
- 3. Add delays between requests in bulk operations
363
-
364
- ---
365
-
366
- ## Pricing
367
-
368
- | Plan | Credits/Month | Best For |
369
- |------|---------------|----------|
370
- | Free | 100 | Testing & small projects |
371
- | Pro | 10,000 | Regular workflows |
372
- | Business | 100,000 | High-volume automation |
71
+ | Symptom | Fix |
72
+ |---|---|
73
+ | Node does not appear | Open Community Nodes, update to the latest version, then hard refresh the browser |
74
+ | Invalid API key | Check the key starts with `sp_` and has no surrounding spaces |
75
+ | Video not found | Make sure the video is public and the ID is correct, or paste the full URL |
76
+ | Rate limit exceeded | Check usage in the dashboard, raise retries, or add a Wait node between bulk calls |
77
+
78
+ ## For developers
79
+
80
+ | Area | Detail |
81
+ |---|---|
82
+ | Language | TypeScript, built with `@n8n/node-cli` |
83
+ | Runtime dependencies | None. Only `n8n-workflow` as a peer |
84
+ | Lint | n8n community node rules, the same set n8n uses to verify packages |
85
+ | Node.js | 22 or newer for development |
86
+
87
+ ```bash
88
+ npm ci
89
+ npm run lint
90
+ npm run build
91
+ npm test # lint, build, then the behavior tests in test/
92
+ npm run dev # starts a local n8n with the node loaded
93
+ ```
373
94
 
374
- Get your API key at [smartprofiling.com](https://smartprofiling.com)
95
+ Project layout:
96
+ - `nodes/SmartProfiling/` holds the node, one folder per resource under `resources/`
97
+ - `credentials/` holds the Smart Profiling API credential
98
+ - `.github/workflows/` holds CI and the signed publish workflow
375
99
 
376
- ---
100
+ Releases are cut by pushing a `vX.Y.Z` tag that matches `package.json`. The publish workflow lints, builds and publishes with `--provenance`.
377
101
 
378
102
  ## Support
379
103
 
380
- - **Documentation:** [smartprofiling.com/api-docs](https://smartprofiling.com/api-docs)
381
- - **Email:** support@smartprofiling.com
382
-
383
- ---
104
+ - Product and API questions go to support@smartprofiling.com
105
+ - Bugs and feature requests go to [GitHub issues](https://github.com/mjmirza/n8n-nodes-smartprofiling/issues)
384
106
 
385
107
  ## License
386
108
 
387
- [MIT](LICENSE.md) - Use freely in personal and commercial projects.
109
+ [MIT](LICENSE.md)
@@ -24,7 +24,7 @@ class SmartProfilingApi {
24
24
  default: 'https://smartprofiling.com',
25
25
  placeholder: 'https://smartprofiling.com',
26
26
  hint: 'Enter only the domain. The /api/v1 path is added automatically.',
27
- description: '⚠️ IMPORTANT: Enter ONLY the domain (https://smartprofiling.com). Do NOT add /api/v1 - it will be added automatically and cause errors if included.',
27
+ description: 'Enter only the domain, for example https://smartprofiling.com. The /api/v1 path is added automatically. Must use https and a public host, local and private addresses are rejected.',
28
28
  },
29
29
  ];
30
30
  this.authenticate = {
@@ -38,10 +38,10 @@ class SmartProfilingApi {
38
38
  this.test = {
39
39
  request: {
40
40
  baseURL: '={{$credentials.baseUrl}}',
41
- url: '/api/v1/transcripts',
41
+ url: '/api/v1/channels/UCBR8-60-B28hp2BmDPdntcQ/videos',
42
42
  method: 'GET',
43
43
  qs: {
44
- id: 'dQw4w9WgXcQ',
44
+ limit: 1,
45
45
  },
46
46
  },
47
47
  };
@@ -1 +1 @@
1
- {"version":3,"file":"SmartProfilingApi.credentials.js","sourceRoot":"","sources":["../../credentials/SmartProfilingApi.credentials.ts"],"names":[],"mappings":";;;AAOA,MAAa,iBAAiB;IAA9B;QACC,SAAI,GAAG,mBAAmB,CAAC;QAE3B,gBAAW,GAAG,qBAAqB,CAAC;QAEpC,SAAI,GAAG,yBAAkC,CAAC;QAE1C,qBAAgB,GAAG,qCAAqC,CAAC;QAEzD,eAAU,GAAsB;YAC/B;gBACC,WAAW,EAAE,SAAS;gBACtB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC/B,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,qBAAqB;gBAClC,WAAW,EAAE,iFAAiF;aAC9F;YACD;gBACC,WAAW,EAAE,wBAAwB;gBACrC,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,4BAA4B;gBACrC,WAAW,EAAE,4BAA4B;gBACzC,IAAI,EAAE,iEAAiE;gBACvE,WAAW,EACV,qJAAqJ;aACtJ;SACD,CAAC;QAEF,iBAAY,GAAyB;YACpC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE;gBACX,OAAO,EAAE;oBACR,aAAa,EAAE,iCAAiC;iBAChD;aACD;SACD,CAAC;QAEF,SAAI,GAA2B;YAC9B,OAAO,EAAE;gBACR,OAAO,EAAE,2BAA2B;gBACpC,GAAG,EAAE,qBAAqB;gBAC1B,MAAM,EAAE,KAAK;gBACb,EAAE,EAAE;oBACH,EAAE,EAAE,aAAa;iBACjB;aACD;SACD,CAAC;IACH,CAAC;CAAA;AAlDD,8CAkDC"}
1
+ {"version":3,"file":"SmartProfilingApi.credentials.js","sourceRoot":"","sources":["../../credentials/SmartProfilingApi.credentials.ts"],"names":[],"mappings":";;;AAOA,MAAa,iBAAiB;IAA9B;QACC,SAAI,GAAG,mBAAmB,CAAC;QAE3B,gBAAW,GAAG,qBAAqB,CAAC;QAEpC,SAAI,GAAG,yBAAkC,CAAC;QAE1C,qBAAgB,GAAG,qCAAqC,CAAC;QAEzD,eAAU,GAAsB;YAC/B;gBACC,WAAW,EAAE,SAAS;gBACtB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC/B,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,qBAAqB;gBAClC,WAAW,EAAE,iFAAiF;aAC9F;YACD;gBACC,WAAW,EAAE,wBAAwB;gBACrC,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,4BAA4B;gBACrC,WAAW,EAAE,4BAA4B;gBACzC,IAAI,EAAE,iEAAiE;gBACvE,WAAW,EACV,qLAAqL;aACtL;SACD,CAAC;QAEF,iBAAY,GAAyB;YACpC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE;gBACX,OAAO,EAAE;oBACR,aAAa,EAAE,iCAAiC;iBAChD;aACD;SACD,CAAC;QAEF,SAAI,GAA2B;YAC9B,OAAO,EAAE;gBACR,OAAO,EAAE,2BAA2B;gBAEpC,GAAG,EAAE,kDAAkD;gBACvD,MAAM,EAAE,KAAK;gBACb,EAAE,EAAE;oBACH,KAAK,EAAE,CAAC;iBACR;aACD;SACD,CAAC;IACH,CAAC;CAAA;AAnDD,8CAmDC"}