lens-content-processor 0.1.0 → 0.2.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 (65) hide show
  1. package/dist/cli.js +5 -1
  2. package/dist/cli.js.map +1 -1
  3. package/dist/flattener/index.js +25 -7
  4. package/dist/flattener/index.js.map +1 -1
  5. package/dist/index.js +23 -2
  6. package/dist/index.js.map +1 -1
  7. package/dist/parser/learning-outcome.js +16 -1
  8. package/dist/parser/learning-outcome.js.map +1 -1
  9. package/dist/parser/lens.js +18 -0
  10. package/dist/parser/lens.js.map +1 -1
  11. package/dist/parser/wikilink.d.ts +28 -0
  12. package/dist/parser/wikilink.js +154 -0
  13. package/dist/parser/wikilink.js.map +1 -1
  14. package/package.json +1 -1
  15. package/dist/bundler/article.test.d.ts +0 -1
  16. package/dist/bundler/article.test.js +0 -212
  17. package/dist/bundler/article.test.js.map +0 -1
  18. package/dist/bundler/video.test.d.ts +0 -1
  19. package/dist/bundler/video.test.js +0 -95
  20. package/dist/bundler/video.test.js.map +0 -1
  21. package/dist/cli.test.d.ts +0 -1
  22. package/dist/cli.test.js +0 -45
  23. package/dist/cli.test.js.map +0 -1
  24. package/dist/flattener/index.test.d.ts +0 -1
  25. package/dist/flattener/index.test.js +0 -547
  26. package/dist/flattener/index.test.js.map +0 -1
  27. package/dist/fs/read-vault.test.d.ts +0 -1
  28. package/dist/fs/read-vault.test.js +0 -37
  29. package/dist/fs/read-vault.test.js.map +0 -1
  30. package/dist/parser/course.test.d.ts +0 -1
  31. package/dist/parser/course.test.js +0 -117
  32. package/dist/parser/course.test.js.map +0 -1
  33. package/dist/parser/frontmatter.test.d.ts +0 -1
  34. package/dist/parser/frontmatter.test.js +0 -54
  35. package/dist/parser/frontmatter.test.js.map +0 -1
  36. package/dist/parser/learning-outcome.test.d.ts +0 -1
  37. package/dist/parser/learning-outcome.test.js +0 -75
  38. package/dist/parser/learning-outcome.test.js.map +0 -1
  39. package/dist/parser/lens.test.d.ts +0 -1
  40. package/dist/parser/lens.test.js +0 -453
  41. package/dist/parser/lens.test.js.map +0 -1
  42. package/dist/parser/module.test.d.ts +0 -1
  43. package/dist/parser/module.test.js +0 -99
  44. package/dist/parser/module.test.js.map +0 -1
  45. package/dist/parser/sections.test.d.ts +0 -1
  46. package/dist/parser/sections.test.js +0 -297
  47. package/dist/parser/sections.test.js.map +0 -1
  48. package/dist/parser/wikilink.test.d.ts +0 -1
  49. package/dist/parser/wikilink.test.js +0 -76
  50. package/dist/parser/wikilink.test.js.map +0 -1
  51. package/dist/validator/field-typos.test.d.ts +0 -1
  52. package/dist/validator/field-typos.test.js +0 -41
  53. package/dist/validator/field-typos.test.js.map +0 -1
  54. package/dist/validator/field-values.test.d.ts +0 -1
  55. package/dist/validator/field-values.test.js +0 -45
  56. package/dist/validator/field-values.test.js.map +0 -1
  57. package/dist/validator/segment-fields.test.d.ts +0 -1
  58. package/dist/validator/segment-fields.test.js +0 -73
  59. package/dist/validator/segment-fields.test.js.map +0 -1
  60. package/dist/validator/standalone.test.d.ts +0 -1
  61. package/dist/validator/standalone.test.js +0 -190
  62. package/dist/validator/standalone.test.js.map +0 -1
  63. package/dist/validator/uuid.test.d.ts +0 -1
  64. package/dist/validator/uuid.test.js +0 -229
  65. package/dist/validator/uuid.test.js.map +0 -1
@@ -1,453 +0,0 @@
1
- // src/parser/lens.test.ts
2
- import { describe, it, expect } from 'vitest';
3
- import { parseLens } from './lens.js';
4
- describe('parseLens', () => {
5
- it('parses lens with text segment (H3 section, H4 segment)', () => {
6
- const content = `---
7
- id: 550e8400-e29b-41d4-a716-446655440002
8
- ---
9
-
10
- ### Text: Introduction
11
-
12
- #### Text
13
- content:: This is introductory content.
14
- `;
15
- const result = parseLens(content, 'Lenses/lens1.md');
16
- expect(result.lens?.id).toBe('550e8400-e29b-41d4-a716-446655440002');
17
- expect(result.lens?.sections).toHaveLength(1);
18
- expect(result.lens?.sections[0].type).toBe('text');
19
- expect(result.lens?.sections[0].segments[0].type).toBe('text');
20
- expect(result.lens?.sections[0].segments[0].content).toBe('This is introductory content.');
21
- });
22
- it('parses article section with excerpt', () => {
23
- const content = `---
24
- id: 550e8400-e29b-41d4-a716-446655440002
25
- ---
26
-
27
- ### Article: Deep Dive
28
- source:: [[../articles/deep-dive.md|Article]]
29
-
30
- #### Article-excerpt
31
- from:: "The key insight is"
32
- to:: "understanding this concept."
33
- `;
34
- const result = parseLens(content, 'Lenses/lens1.md');
35
- expect(result.lens?.sections[0].type).toBe('lens-article');
36
- expect(result.lens?.sections[0].source).toBe('[[../articles/deep-dive.md|Article]]');
37
- expect(result.lens?.sections[0].segments[0].type).toBe('article-excerpt');
38
- // Note: from/to are parsed as strings here, converted to anchors during bundling
39
- expect(result.lens?.sections[0].segments[0].fromAnchor).toBe('The key insight is');
40
- expect(result.lens?.sections[0].segments[0].toAnchor).toBe('understanding this concept.');
41
- });
42
- it('parses video section with timestamp excerpt', () => {
43
- const content = `---
44
- id: 550e8400-e29b-41d4-a716-446655440002
45
- ---
46
-
47
- ### Video: Expert Interview
48
- source:: [[../video_transcripts/interview.md|Video]]
49
-
50
- #### Video-excerpt
51
- from:: 1:30
52
- to:: 5:45
53
- `;
54
- const result = parseLens(content, 'Lenses/lens1.md');
55
- expect(result.lens?.sections[0].type).toBe('lens-video');
56
- expect(result.lens?.sections[0].source).toBe('[[../video_transcripts/interview.md|Video]]');
57
- expect(result.lens?.sections[0].segments[0].type).toBe('video-excerpt');
58
- // Parsed as strings, converted to seconds during bundling
59
- expect(result.lens?.sections[0].segments[0].fromTimeStr).toBe('1:30');
60
- expect(result.lens?.sections[0].segments[0].toTimeStr).toBe('5:45');
61
- });
62
- it('requires source field in article/video sections', () => {
63
- const content = `---
64
- id: 550e8400-e29b-41d4-a716-446655440002
65
- ---
66
-
67
- ### Article: No Source
68
-
69
- #### Article-excerpt
70
- from:: "Start"
71
- to:: "End"
72
- `;
73
- const result = parseLens(content, 'Lenses/bad.md');
74
- expect(result.errors.some(e => e.message.includes('source'))).toBe(true);
75
- });
76
- it('parses text segment with multiline content', () => {
77
- const content = `---
78
- id: test-id
79
- ---
80
-
81
- ### Text: Introduction
82
-
83
- #### Text
84
- content::
85
- Line one of content.
86
- Line two of content.
87
- Line three of content.
88
-
89
- #### Chat
90
- instructions:: Do something
91
- `;
92
- const result = parseLens(content, 'Lenses/test.md');
93
- expect(result.lens?.sections[0].segments[0].type).toBe('text');
94
- expect(result.lens?.sections[0].segments[0].content).toContain('Line one');
95
- expect(result.lens?.sections[0].segments[0].content).toContain('Line two');
96
- expect(result.lens?.sections[0].segments[0].content).toContain('Line three');
97
- });
98
- it('parses video-excerpt with only to:: (from defaults to 0:00)', () => {
99
- const content = `---
100
- id: test-id
101
- ---
102
-
103
- ### Video: Test Video
104
- source:: [[../video_transcripts/test.md|Video]]
105
-
106
- #### Video-excerpt
107
- to:: 14:49
108
- `;
109
- const result = parseLens(content, 'Lenses/test.md');
110
- expect(result.lens?.sections[0].segments[0].type).toBe('video-excerpt');
111
- expect(result.lens?.sections[0].segments[0].fromTimeStr).toBe('0:00');
112
- expect(result.lens?.sections[0].segments[0].toTimeStr).toBe('14:49');
113
- });
114
- it('parses chat segment with multiline instructions', () => {
115
- const content = `---
116
- id: test-id
117
- ---
118
-
119
- ### Text: Discussion
120
-
121
- #### Chat
122
- instructions::
123
- First line of instructions.
124
- Second line with more details.
125
-
126
- Topics to cover:
127
- - Topic one
128
- - Topic two
129
-
130
- hidePreviousContentFromUser:: false
131
- `;
132
- const result = parseLens(content, 'Lenses/test.md');
133
- const chatSegment = result.lens?.sections[0].segments[0];
134
- expect(chatSegment?.type).toBe('chat');
135
- expect(chatSegment?.instructions).toContain('First line');
136
- expect(chatSegment?.instructions).toContain('Topic one');
137
- expect(chatSegment?.instructions).toContain('Topic two');
138
- });
139
- it('parses article-excerpt with only from:: (to end of article)', () => {
140
- const content = `---
141
- id: test-id
142
- ---
143
-
144
- ### Article: Test Article
145
- source:: [[../articles/test.md|Article]]
146
-
147
- #### Article-excerpt
148
- from:: "Start here"
149
- `;
150
- const result = parseLens(content, 'Lenses/test.md');
151
- expect(result.errors).toHaveLength(0);
152
- expect(result.lens?.sections[0].segments[0].type).toBe('article-excerpt');
153
- expect(result.lens?.sections[0].segments[0].fromAnchor).toBe('Start here');
154
- expect(result.lens?.sections[0].segments[0].toAnchor).toBeUndefined();
155
- });
156
- it('parses article-excerpt with only to:: (from start of article)', () => {
157
- const content = `---
158
- id: test-id
159
- ---
160
-
161
- ### Article: Test Article
162
- source:: [[../articles/test.md|Article]]
163
-
164
- #### Article-excerpt
165
- to:: "End here"
166
- `;
167
- const result = parseLens(content, 'Lenses/test.md');
168
- expect(result.errors).toHaveLength(0);
169
- expect(result.lens?.sections[0].segments[0].type).toBe('article-excerpt');
170
- expect(result.lens?.sections[0].segments[0].fromAnchor).toBeUndefined();
171
- expect(result.lens?.sections[0].segments[0].toAnchor).toBe('End here');
172
- });
173
- it('parses empty article-excerpt (entire article)', () => {
174
- const content = `---
175
- id: test-id
176
- ---
177
-
178
- ### Article: Test Article
179
- source:: [[../articles/test.md|Article]]
180
-
181
- #### Article-excerpt
182
- `;
183
- const result = parseLens(content, 'Lenses/test.md');
184
- expect(result.errors).toHaveLength(0);
185
- expect(result.lens?.sections[0].segments[0].type).toBe('article-excerpt');
186
- expect(result.lens?.sections[0].segments[0].fromAnchor).toBeUndefined();
187
- expect(result.lens?.sections[0].segments[0].toAnchor).toBeUndefined();
188
- });
189
- it('parses chat segment with title', () => {
190
- const content = `---
191
- id: test-id
192
- ---
193
-
194
- ### Text: Discussion
195
-
196
- #### Chat: Discussion on AI Basics
197
- instructions:: Talk about AI basics.
198
- `;
199
- const result = parseLens(content, 'Lenses/test.md');
200
- const chatSegment = result.lens?.sections[0].segments[0];
201
- expect(chatSegment?.type).toBe('chat');
202
- expect(chatSegment?.title).toBe('Discussion on AI Basics');
203
- expect(chatSegment?.instructions).toBe('Talk about AI basics.');
204
- });
205
- // Task 7.2: Field in wrong segment type
206
- it('warns about from:: field in text segment', () => {
207
- const content = `---
208
- id: test-id
209
- ---
210
-
211
- ### Text: Wrong Field
212
-
213
- #### Text
214
- content:: Some text.
215
- from:: "This is wrong"
216
- `;
217
- const result = parseLens(content, 'Lenses/test.md');
218
- expect(result.errors.some(e => e.severity === 'warning' &&
219
- e.message.includes('from') &&
220
- e.message.includes('text'))).toBe(true);
221
- });
222
- it('warns about to:: field in chat segment', () => {
223
- const content = `---
224
- id: test-id
225
- ---
226
-
227
- ### Text: Wrong Field
228
-
229
- #### Chat
230
- instructions:: Do something.
231
- to:: "This is wrong"
232
- `;
233
- const result = parseLens(content, 'Lenses/test.md');
234
- expect(result.errors.some(e => e.severity === 'warning' &&
235
- e.message.includes('to') &&
236
- e.message.includes('chat'))).toBe(true);
237
- });
238
- it('does not warn about from/to in article-excerpt', () => {
239
- const content = `---
240
- id: test-id
241
- ---
242
-
243
- ### Article: Test Article
244
- source:: [[../articles/test.md|Article]]
245
-
246
- #### Article-excerpt
247
- from:: "Start"
248
- to:: "End"
249
- `;
250
- const result = parseLens(content, 'Lenses/test.md');
251
- // No warnings about from/to in article-excerpt
252
- expect(result.errors.filter(e => e.severity === 'warning' &&
253
- (e.message.includes('from') || e.message.includes('to')))).toHaveLength(0);
254
- });
255
- // Task 7.3: Empty content field warning
256
- it('warns about empty content:: field in text segment', () => {
257
- const content = `---
258
- id: test-id
259
- ---
260
-
261
- ### Text: Empty Content
262
-
263
- #### Text
264
- content::
265
- `;
266
- const result = parseLens(content, 'Lenses/test.md');
267
- expect(result.errors.some(e => e.severity === 'warning' &&
268
- e.message.toLowerCase().includes('empty'))).toBe(true);
269
- });
270
- it('warns about whitespace-only content:: field', () => {
271
- const content = `---
272
- id: test-id
273
- ---
274
-
275
- ### Text: Whitespace Only
276
-
277
- #### Text
278
- content::
279
- `;
280
- const result = parseLens(content, 'Lenses/test.md');
281
- expect(result.errors.some(e => e.severity === 'warning' &&
282
- e.message.toLowerCase().includes('empty'))).toBe(true);
283
- });
284
- it('does not warn about content:: with actual text', () => {
285
- const content = `---
286
- id: test-id
287
- ---
288
-
289
- ### Text: Has Content
290
-
291
- #### Text
292
- content:: This is real content.
293
- `;
294
- const result = parseLens(content, 'Lenses/test.md');
295
- // No empty content warnings
296
- expect(result.errors.filter(e => e.severity === 'warning' &&
297
- e.message.toLowerCase().includes('empty'))).toHaveLength(0);
298
- });
299
- // Task 7.5: Empty segment warning
300
- describe('empty segment warnings', () => {
301
- it('warns about empty segment with no fields', () => {
302
- const content = `---
303
- id: test-id
304
- ---
305
-
306
- ### Text: Has Empty
307
-
308
- #### Chat
309
-
310
- #### Text
311
- content:: Real content here.
312
- `;
313
- const result = parseLens(content, 'Lenses/test.md');
314
- expect(result.errors.some(e => e.severity === 'warning' &&
315
- e.message.toLowerCase().includes('empty') &&
316
- e.message.toLowerCase().includes('chat'))).toBe(true);
317
- });
318
- it('warns about segment with only whitespace', () => {
319
- const content = `---
320
- id: test-id
321
- ---
322
-
323
- ### Text: Has Empty
324
-
325
- #### Text
326
-
327
-
328
-
329
- #### Chat
330
- instructions:: Do something.
331
- `;
332
- const result = parseLens(content, 'Lenses/test.md');
333
- expect(result.errors.some(e => e.severity === 'warning' &&
334
- e.message.toLowerCase().includes('empty'))).toBe(true);
335
- });
336
- it('does not warn about segment with fields', () => {
337
- const content = `---
338
- id: test-id
339
- ---
340
-
341
- ### Text: Has Content
342
-
343
- #### Text
344
- content:: Some content.
345
-
346
- #### Chat
347
- instructions:: Do something.
348
- `;
349
- const result = parseLens(content, 'Lenses/test.md');
350
- // No empty segment warnings
351
- expect(result.errors.filter(e => e.severity === 'warning' &&
352
- e.message.toLowerCase().includes('empty') &&
353
- e.message.toLowerCase().includes('segment'))).toHaveLength(0);
354
- });
355
- });
356
- // Task 7.6: Section with no segments warning
357
- describe('section with no segments warnings', () => {
358
- it('warns about section with no segments', () => {
359
- const content = `---
360
- id: test-id
361
- ---
362
-
363
- ### Article: Empty Section
364
- source:: [[../articles/test.md|Article]]
365
- `;
366
- const result = parseLens(content, 'Lenses/test.md');
367
- expect(result.errors.some(e => e.severity === 'warning' &&
368
- e.message.toLowerCase().includes('no segments'))).toBe(true);
369
- });
370
- it('warns about text section with no segments', () => {
371
- const content = `---
372
- id: test-id
373
- ---
374
-
375
- ### Text: Empty Text Section
376
- `;
377
- const result = parseLens(content, 'Lenses/test.md');
378
- expect(result.errors.some(e => e.severity === 'warning' &&
379
- e.message.toLowerCase().includes('no segments'))).toBe(true);
380
- });
381
- it('does not warn about section with segments', () => {
382
- const content = `---
383
- id: test-id
384
- ---
385
-
386
- ### Article: Has Content
387
- source:: [[../articles/test.md|Article]]
388
-
389
- #### Article-excerpt
390
- from:: "Start"
391
- to:: "End"
392
- `;
393
- const result = parseLens(content, 'Lenses/test.md');
394
- // No warnings about no segments
395
- expect(result.errors.filter(e => e.severity === 'warning' &&
396
- e.message.toLowerCase().includes('no segments'))).toHaveLength(0);
397
- });
398
- });
399
- // Task 7.7: Boolean field with non-boolean value
400
- describe('boolean field value validation', () => {
401
- it('warns about optional:: field with non-boolean value', () => {
402
- const content = `---
403
- id: test-id
404
- ---
405
-
406
- ### Text: Test
407
-
408
- #### Text
409
- content:: Some content.
410
- optional:: yes
411
- `;
412
- const result = parseLens(content, 'Lenses/test.md');
413
- expect(result.errors.some(e => e.severity === 'warning' &&
414
- e.message.includes("'optional'") &&
415
- e.message.includes('non-boolean'))).toBe(true);
416
- });
417
- it('warns about hidePreviousContentFromUser:: with non-boolean value', () => {
418
- const content = `---
419
- id: test-id
420
- ---
421
-
422
- ### Text: Test
423
-
424
- #### Chat
425
- instructions:: Do something.
426
- hidePreviousContentFromUser:: 1
427
- `;
428
- const result = parseLens(content, 'Lenses/test.md');
429
- expect(result.errors.some(e => e.severity === 'warning' &&
430
- e.message.includes("'hidePreviousContentFromUser'") &&
431
- e.message.includes('non-boolean'))).toBe(true);
432
- });
433
- it('does not warn about boolean fields with valid values', () => {
434
- const content = `---
435
- id: test-id
436
- ---
437
-
438
- ### Text: Test
439
-
440
- #### Chat
441
- instructions:: Do something.
442
- hidePreviousContentFromUser:: true
443
- hidePreviousContentFromTutor:: false
444
- optional:: true
445
- `;
446
- const result = parseLens(content, 'Lenses/test.md');
447
- // No warnings about boolean values
448
- expect(result.errors.filter(e => e.severity === 'warning' &&
449
- e.message.includes('non-boolean'))).toHaveLength(0);
450
- });
451
- });
452
- });
453
- //# sourceMappingURL=lens.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lens.test.js","sourceRoot":"","sources":["../../src/parser/lens.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,99 +0,0 @@
1
- // src/parser/module.test.ts
2
- import { describe, it, expect } from 'vitest';
3
- import { parseModule, parsePageTextSegments } from './module.js';
4
- describe('parseModule', () => {
5
- it('parses complete module', () => {
6
- const content = `---
7
- slug: intro
8
- title: Introduction
9
- ---
10
-
11
- # Learning Outcome: First Topic
12
- source:: [[../Learning Outcomes/lo1.md|LO1]]
13
- `;
14
- const result = parseModule(content, 'modules/intro.md');
15
- expect(result.module?.slug).toBe('intro');
16
- expect(result.module?.title).toBe('Introduction');
17
- expect(result.module?.sections).toHaveLength(1);
18
- expect(result.errors).toHaveLength(0);
19
- });
20
- it('collects errors from all parsing stages', () => {
21
- const content = `# No frontmatter
22
-
23
- # Unknown: Bad Type
24
- `;
25
- const result = parseModule(content, 'modules/bad.md');
26
- expect(result.errors.length).toBeGreaterThan(0);
27
- expect(result.errors.some(e => e.message.includes('frontmatter'))).toBe(true);
28
- });
29
- it('parses Page section with ## Text content', () => {
30
- const content = `---
31
- slug: test
32
- title: Test Module
33
- ---
34
-
35
- # Page: Welcome
36
- id:: d1e2f3a4-5678-90ab-cdef-1234567890ab
37
-
38
- ## Text
39
- content::
40
- This is the welcome text.
41
- It spans multiple lines.
42
- `;
43
- const result = parseModule(content, 'modules/test.md');
44
- expect(result.module?.sections).toHaveLength(1);
45
- expect(result.module?.sections[0].type).toBe('page');
46
- expect(result.module?.sections[0].fields.id).toBe('d1e2f3a4-5678-90ab-cdef-1234567890ab');
47
- // The body should contain the ## Text subsection
48
- expect(result.module?.sections[0].body).toContain('## Text');
49
- expect(result.module?.sections[0].body).toContain('content::');
50
- });
51
- });
52
- describe('parsePageTextSegments', () => {
53
- it('parses ## Text subsection with multiline content', () => {
54
- const body = `id:: d1e2f3a4-5678-90ab-cdef-1234567890ab
55
-
56
- ## Text
57
- content::
58
- This is the welcome text.
59
- It spans multiple lines.
60
- `;
61
- const segments = parsePageTextSegments(body);
62
- expect(segments).toHaveLength(1);
63
- expect(segments[0].type).toBe('text');
64
- expect(segments[0].content).toContain('welcome text');
65
- expect(segments[0].content).toContain('multiple lines');
66
- });
67
- it('parses multiple ## Text subsections', () => {
68
- const body = `id:: some-id
69
-
70
- ## Text
71
- content::
72
- First text segment.
73
-
74
- ## Text
75
- content::
76
- Second text segment.
77
- `;
78
- const segments = parsePageTextSegments(body);
79
- expect(segments).toHaveLength(2);
80
- expect(segments[0].content).toContain('First text');
81
- expect(segments[1].content).toContain('Second text');
82
- });
83
- it('returns empty array when no ## Text subsections', () => {
84
- const body = `id:: some-id
85
- no text subsections here
86
- `;
87
- const segments = parsePageTextSegments(body);
88
- expect(segments).toHaveLength(0);
89
- });
90
- it('handles content:: on same line', () => {
91
- const body = `## Text
92
- content:: Single line content.
93
- `;
94
- const segments = parsePageTextSegments(body);
95
- expect(segments).toHaveLength(1);
96
- expect(segments[0].content).toBe('Single line content.');
97
- });
98
- });
99
- //# sourceMappingURL=module.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"module.test.js","sourceRoot":"","sources":["../../src/parser/module.test.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEjE,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,OAAO,GAAG;;;;;;;CAOnB,CAAC;QAEE,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QAExD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,OAAO,GAAG;;;CAGnB,CAAC;QAEE,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QAEtD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,OAAO,GAAG;;;;;;;;;;;;CAYnB,CAAC;QAEE,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAEvD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QAC1F,iDAAiD;QACjD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,IAAI,GAAG;;;;;;CAMhB,CAAC;QAEE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAE7C,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACtD,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAG;;;;;;;;;CAShB,CAAC;QAEE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAE7C,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACpD,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG;;CAEhB,CAAC;QAEE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAE7C,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,IAAI,GAAG;;CAEhB,CAAC;QAEE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAE7C,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};