@vertesia/tools-sdk 0.80.0-dev.20251121 → 0.81.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.
Files changed (61) hide show
  1. package/README.md +122 -0
  2. package/lib/cjs/InteractionCollection.js +118 -0
  3. package/lib/cjs/InteractionCollection.js.map +1 -1
  4. package/lib/cjs/SkillCollection.js +318 -0
  5. package/lib/cjs/SkillCollection.js.map +1 -0
  6. package/lib/cjs/ToolCollection.js +98 -0
  7. package/lib/cjs/ToolCollection.js.map +1 -1
  8. package/lib/cjs/copy-assets.js +84 -0
  9. package/lib/cjs/copy-assets.js.map +1 -0
  10. package/lib/cjs/index.js +6 -1
  11. package/lib/cjs/index.js.map +1 -1
  12. package/lib/cjs/server.js +327 -0
  13. package/lib/cjs/server.js.map +1 -0
  14. package/lib/cjs/site/styles.js +621 -0
  15. package/lib/cjs/site/styles.js.map +1 -0
  16. package/lib/cjs/site/templates.js +932 -0
  17. package/lib/cjs/site/templates.js.map +1 -0
  18. package/lib/esm/InteractionCollection.js +83 -0
  19. package/lib/esm/InteractionCollection.js.map +1 -1
  20. package/lib/esm/SkillCollection.js +311 -0
  21. package/lib/esm/SkillCollection.js.map +1 -0
  22. package/lib/esm/ToolCollection.js +64 -0
  23. package/lib/esm/ToolCollection.js.map +1 -1
  24. package/lib/esm/copy-assets.js +81 -0
  25. package/lib/esm/copy-assets.js.map +1 -0
  26. package/lib/esm/index.js +4 -0
  27. package/lib/esm/index.js.map +1 -1
  28. package/lib/esm/server.js +323 -0
  29. package/lib/esm/server.js.map +1 -0
  30. package/lib/esm/site/styles.js +618 -0
  31. package/lib/esm/site/styles.js.map +1 -0
  32. package/lib/esm/site/templates.js +920 -0
  33. package/lib/esm/site/templates.js.map +1 -0
  34. package/lib/types/InteractionCollection.d.ts +29 -0
  35. package/lib/types/InteractionCollection.d.ts.map +1 -1
  36. package/lib/types/SkillCollection.d.ts +111 -0
  37. package/lib/types/SkillCollection.d.ts.map +1 -0
  38. package/lib/types/ToolCollection.d.ts +18 -0
  39. package/lib/types/ToolCollection.d.ts.map +1 -1
  40. package/lib/types/copy-assets.d.ts +14 -0
  41. package/lib/types/copy-assets.d.ts.map +1 -0
  42. package/lib/types/index.d.ts +4 -0
  43. package/lib/types/index.d.ts.map +1 -1
  44. package/lib/types/server.d.ts +72 -0
  45. package/lib/types/server.d.ts.map +1 -0
  46. package/lib/types/site/styles.d.ts +5 -0
  47. package/lib/types/site/styles.d.ts.map +1 -0
  48. package/lib/types/site/templates.d.ts +54 -0
  49. package/lib/types/site/templates.d.ts.map +1 -0
  50. package/lib/types/types.d.ts +152 -0
  51. package/lib/types/types.d.ts.map +1 -1
  52. package/package.json +18 -5
  53. package/src/InteractionCollection.ts +90 -0
  54. package/src/SkillCollection.ts +389 -0
  55. package/src/ToolCollection.ts +68 -0
  56. package/src/copy-assets.ts +104 -0
  57. package/src/index.ts +4 -0
  58. package/src/server.ts +444 -0
  59. package/src/site/styles.ts +617 -0
  60. package/src/site/templates.ts +956 -0
  61. package/src/types.ts +162 -0
@@ -0,0 +1,621 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.baseStyles = void 0;
4
+ /**
5
+ * Shared CSS styles for the tools server HTML pages
6
+ */
7
+ exports.baseStyles = `
8
+ :root {
9
+ color-scheme: light dark;
10
+ }
11
+
12
+ body {
13
+ font-family: system-ui, -apple-system, sans-serif;
14
+ margin: 0;
15
+ padding: 2.5rem 1.75rem;
16
+ background:
17
+ radial-gradient(circle at 0 0, rgba(56, 189, 248, 0.10), transparent 55%),
18
+ radial-gradient(circle at 100% 0, rgba(129, 140, 248, 0.12), transparent 55%),
19
+ #f9fafb;
20
+ color: #0f172a;
21
+ line-height: 1.5;
22
+ }
23
+
24
+ .page {
25
+ max-width: 1120px;
26
+ margin: 0 auto;
27
+ }
28
+
29
+ .hero {
30
+ display: flex;
31
+ justify-content: space-between;
32
+ align-items: flex-start;
33
+ gap: 2.25rem;
34
+ padding: 1.75rem 2rem;
35
+ margin-bottom: 2.5rem;
36
+ border-radius: 1.25rem;
37
+ background: linear-gradient(135deg, #ffffff, #f3f4ff);
38
+ border: 1px solid #e5e7eb;
39
+ box-shadow:
40
+ 0 18px 40px rgba(15, 23, 42, 0.08),
41
+ 0 0 0 1px rgba(248, 250, 252, 0.8);
42
+ }
43
+
44
+ .hero-main {
45
+ display: flex;
46
+ gap: 1.5rem;
47
+ align-items: center;
48
+ }
49
+
50
+ .hero-logo {
51
+ display: flex;
52
+ align-items: center;
53
+ justify-content: center;
54
+ width: 56px;
55
+ height: 56px;
56
+ border-radius: 999px;
57
+ background: radial-gradient(circle at 30% 0, #38bdf8, #6366f1);
58
+ box-shadow:
59
+ 0 0 0 1px rgba(15, 23, 42, 0.85),
60
+ 0 12px 30px rgba(37, 99, 235, 0.6);
61
+ }
62
+
63
+ .hero-logo-initial {
64
+ font-size: 1.1rem;
65
+ font-weight: 650;
66
+ letter-spacing: 0.08em;
67
+ text-transform: uppercase;
68
+ color: #eff6ff;
69
+ }
70
+
71
+ .hero-logo img {
72
+ display: block;
73
+ max-width: 80%;
74
+ max-height: 60%;
75
+ }
76
+
77
+ .logo-dark {
78
+ display: none;
79
+ }
80
+
81
+ .hero-meta {
82
+ display: flex;
83
+ flex-direction: column;
84
+ gap: 0.5rem;
85
+ }
86
+
87
+ .hero-eyebrow {
88
+ font-size: 0.75rem;
89
+ letter-spacing: 0.12em;
90
+ text-transform: uppercase;
91
+ color: #6b7280;
92
+ }
93
+
94
+ .hero-title {
95
+ font-size: 1.9rem;
96
+ font-weight: 650;
97
+ letter-spacing: -0.03em;
98
+ color: #0f172a;
99
+ margin: 0;
100
+ }
101
+
102
+ .hero-tagline {
103
+ font-size: 0.95rem;
104
+ color: #4b5563;
105
+ margin: 0.1rem 0 0 0;
106
+ }
107
+
108
+ .hero-summary {
109
+ display: flex;
110
+ flex-wrap: wrap;
111
+ gap: 0.5rem;
112
+ margin-top: 0.75rem;
113
+ font-size: 0.8rem;
114
+ color: #6b7280;
115
+ }
116
+
117
+ .hero-summary span {
118
+ display: inline-flex;
119
+ align-items: center;
120
+ gap: 0.35rem;
121
+ padding: 0.15rem 0.55rem;
122
+ border-radius: 999px;
123
+ background: #f9fafb;
124
+ border: 1px solid #e5e7eb;
125
+ }
126
+
127
+ .hero-summary dot {
128
+ width: 6px;
129
+ height: 6px;
130
+ border-radius: 999px;
131
+ display: inline-block;
132
+ background: #22c55e;
133
+ }
134
+
135
+ .search-bar {
136
+ display: flex;
137
+ flex-direction: column;
138
+ gap: 0.4rem;
139
+ margin: 0 0 1.75rem 0;
140
+ }
141
+
142
+ .search-input {
143
+ max-width: 360px;
144
+ padding: 0.55rem 0.75rem;
145
+ border-radius: 999px;
146
+ border: 1px solid #e5e7eb;
147
+ background: #ffffff;
148
+ color: #111827;
149
+ font-size: 0.9rem;
150
+ font-family: inherit;
151
+ box-shadow: 0 4px 10px rgba(15, 23, 42, 0.04);
152
+ }
153
+
154
+ .search-input::placeholder {
155
+ color: #9ca3af;
156
+ }
157
+
158
+ .search-input:focus {
159
+ outline: none;
160
+ border-color: #60a5fa;
161
+ box-shadow:
162
+ 0 0 0 1px rgba(59, 130, 246, 0.4),
163
+ 0 6px 18px rgba(37, 99, 235, 0.18);
164
+ }
165
+
166
+ .search-hint {
167
+ font-size: 0.75rem;
168
+ color: #9ca3af;
169
+ }
170
+
171
+ .search-empty {
172
+ margin-top: 1rem;
173
+ font-size: 0.85rem;
174
+ color: #9ca3af;
175
+ }
176
+
177
+ .hero-panel {
178
+ min-width: 220px;
179
+ max-width: 260px;
180
+ padding: 1.25rem 1.4rem;
181
+ border-radius: 1rem;
182
+ background: radial-gradient(circle at 0 0, rgba(59, 130, 246, 0.10), transparent 70%),
183
+ #eff6ff;
184
+ border: 1px solid #bfdbfe;
185
+ box-shadow: 0 16px 34px rgba(15, 23, 42, 0.10);
186
+ font-size: 0.8rem;
187
+ }
188
+
189
+ .hero-panel-label {
190
+ font-size: 0.7rem;
191
+ letter-spacing: 0.13em;
192
+ text-transform: uppercase;
193
+ color: #1d4ed8;
194
+ margin-bottom: 0.5rem;
195
+ }
196
+
197
+ .hero-panel-endpoint {
198
+ display: inline-flex;
199
+ align-items: center;
200
+ padding: 0.3rem 0.6rem;
201
+ border-radius: 0.5rem;
202
+ background: #f9fafb;
203
+ border: 1px solid #e5e7eb;
204
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
205
+ font-size: 0.82rem;
206
+ color: #111827;
207
+ }
208
+
209
+ .hero-panel-hint {
210
+ margin-top: 0.6rem;
211
+ color: #6b7280;
212
+ line-height: 1.4;
213
+ }
214
+
215
+ .hero-panel-hint strong {
216
+ color: #111827;
217
+ }
218
+
219
+ h1, h2 {
220
+ margin: 0 0 1rem 0;
221
+ color: #0f172a;
222
+ }
223
+
224
+ h1 { font-size: 1.875rem; }
225
+ h2 {
226
+ font-size: 1.4rem;
227
+ margin-top: 2rem;
228
+ letter-spacing: 0.03em;
229
+ text-transform: uppercase;
230
+ color: #6b7280;
231
+ }
232
+
233
+ a {
234
+ color: #2563eb;
235
+ text-decoration: none;
236
+ }
237
+ a:hover {
238
+ text-decoration: underline;
239
+ }
240
+
241
+ hr {
242
+ border: none;
243
+ border-top: 1px solid #e5e7eb;
244
+ margin: 2rem 0;
245
+ }
246
+
247
+ .card-grid {
248
+ display: grid;
249
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
250
+ gap: 1.5rem;
251
+ }
252
+
253
+ .card {
254
+ background: radial-gradient(circle at 0 0, rgba(56, 189, 248, 0.12), transparent 75%),
255
+ #ffffff;
256
+ padding: 1.25rem 1.35rem;
257
+ border-radius: 14px;
258
+ box-shadow:
259
+ 0 14px 30px rgba(15, 23, 42, 0.06),
260
+ 0 0 0 1px rgba(248, 250, 252, 0.9);
261
+ border: 1px solid #e5e7eb;
262
+ transition: transform 0.15s, box-shadow 0.15s;
263
+ text-decoration: none;
264
+ color: inherit;
265
+ display: block;
266
+ }
267
+
268
+ .card:hover {
269
+ transform: translateY(-3px);
270
+ box-shadow:
271
+ 0 18px 40px rgba(15, 23, 42, 0.10),
272
+ 0 0 0 1px rgba(59, 130, 246, 0.6);
273
+ }
274
+
275
+ .card-icon {
276
+ width: 48px;
277
+ height: 48px;
278
+ margin-bottom: 0.75rem;
279
+ }
280
+
281
+ .card-icon svg {
282
+ width: 100%;
283
+ height: 100%;
284
+ }
285
+
286
+ .card-title {
287
+ font-weight: 600;
288
+ font-size: 1.1rem;
289
+ margin-bottom: 0.25rem;
290
+ color: #0f172a;
291
+ }
292
+
293
+ .card-desc {
294
+ font-size: 0.925rem;
295
+ color: #6b7280;
296
+ }
297
+
298
+ .card-meta {
299
+ margin-top: 0.45rem;
300
+ font-size: 0.75rem;
301
+ text-transform: uppercase;
302
+ letter-spacing: 0.08em;
303
+ color: #9ca3af;
304
+ }
305
+
306
+ .item-list {
307
+ display: flex;
308
+ flex-direction: column;
309
+ gap: 1rem;
310
+ }
311
+
312
+ .item-card {
313
+ background: #ffffff;
314
+ padding: 1rem 1.25rem;
315
+ border-radius: 10px;
316
+ border-left: 4px solid #6366f1;
317
+ box-shadow:
318
+ 0 10px 24px rgba(15, 23, 42, 0.06),
319
+ 0 0 0 1px rgba(248, 250, 252, 0.9);
320
+ }
321
+
322
+ .item-card.skill {
323
+ border-left-color: #10b981;
324
+ }
325
+
326
+ .item-card.interaction {
327
+ border-left-color: #f59e0b;
328
+ }
329
+
330
+ .item-name {
331
+ font-weight: 600;
332
+ font-size: 1.05rem;
333
+ }
334
+
335
+ .item-desc {
336
+ font-size: 0.9rem;
337
+ color: #6b7280;
338
+ margin-top: 0.25rem;
339
+ }
340
+
341
+ .item-meta {
342
+ font-size: 0.8rem;
343
+ color: #9ca3af;
344
+ margin-top: 0.5rem;
345
+ }
346
+
347
+ .item-schema {
348
+ margin-top: 0.75rem;
349
+ font-size: 0.8rem;
350
+ font-family: ui-monospace, monospace;
351
+ background: #f3f4f6;
352
+ padding: 0.75rem;
353
+ border-radius: 6px;
354
+ overflow-x: auto;
355
+ white-space: pre-wrap;
356
+ color: #374151;
357
+ }
358
+
359
+ .header {
360
+ display: flex;
361
+ align-items: center;
362
+ gap: 1rem;
363
+ margin-bottom: 1.5rem;
364
+ }
365
+
366
+ .header-icon {
367
+ width: 64px;
368
+ height: 64px;
369
+ }
370
+
371
+ .header-icon svg {
372
+ width: 100%;
373
+ height: 100%;
374
+ }
375
+
376
+ .section-header {
377
+ display: flex;
378
+ align-items: baseline;
379
+ justify-content: space-between;
380
+ gap: 1rem;
381
+ margin-bottom: 0.75rem;
382
+ }
383
+
384
+ .section-subtitle {
385
+ font-size: 0.8rem;
386
+ color: #6b7280;
387
+ }
388
+
389
+ .endpoint-url {
390
+ font-size: 0.85rem;
391
+ color: #6b7280;
392
+ margin-top: 0.25rem;
393
+ }
394
+
395
+ .endpoint-url code {
396
+ background: #f3f4f6;
397
+ padding: 0.125rem 0.375rem;
398
+ border-radius: 4px;
399
+ font-family: ui-monospace, monospace;
400
+ }
401
+
402
+ .badge {
403
+ display: inline-block;
404
+ font-size: 0.75rem;
405
+ padding: 0.125rem 0.5rem;
406
+ border-radius: 9999px;
407
+ background: #f9fafb;
408
+ color: #374151;
409
+ border: 1px solid #e5e7eb;
410
+ margin-right: 0.25rem;
411
+ }
412
+
413
+ .badge.python { background: #fef3c7; color: #92400e; border-color: #facc15; }
414
+ .badge.typescript { background: #dbeafe; color: #1e40af; border-color: #60a5fa; }
415
+ .badge.javascript { background: #fef9c3; color: #854d0e; border-color: #facc15; }
416
+
417
+ @media (max-width: 768px) {
418
+ body {
419
+ padding: 1.75rem 1.25rem;
420
+ }
421
+
422
+ .hero {
423
+ flex-direction: column;
424
+ padding: 1.5rem 1.35rem;
425
+ }
426
+
427
+ .hero-panel {
428
+ max-width: 100%;
429
+ width: 100%;
430
+ }
431
+ }
432
+
433
+ @media (prefers-color-scheme: dark) {
434
+ body {
435
+ background:
436
+ radial-gradient(circle at 0 0, rgba(56, 189, 248, 0.18), transparent 55%),
437
+ radial-gradient(circle at 100% 0, rgba(129, 140, 248, 0.25), transparent 55%),
438
+ #020617;
439
+ color: #e5e7eb;
440
+ }
441
+
442
+ .hero {
443
+ background: linear-gradient(135deg, rgba(15, 23, 42, 0.98), rgba(15, 23, 42, 0.92));
444
+ border: 1px solid rgba(148, 163, 184, 0.45);
445
+ box-shadow:
446
+ 0 24px 60px rgba(15, 23, 42, 0.85),
447
+ 0 0 0 1px rgba(15, 23, 42, 0.75);
448
+ }
449
+
450
+ .hero-eyebrow {
451
+ color: #9ca3af;
452
+ }
453
+
454
+ .hero-title {
455
+ color: #f9fafb;
456
+ }
457
+
458
+ .hero-tagline {
459
+ color: #cbd5f5;
460
+ }
461
+
462
+ .hero-summary {
463
+ color: #9ca3af;
464
+ }
465
+
466
+ .hero-summary span {
467
+ background: rgba(15, 23, 42, 0.95);
468
+ border-color: rgba(148, 163, 184, 0.45);
469
+ }
470
+
471
+ .hero-panel {
472
+ background: radial-gradient(circle at 0 0, rgba(56, 189, 248, 0.16), transparent 70%),
473
+ rgba(15, 23, 42, 0.96);
474
+ border: 1px solid rgba(59, 130, 246, 0.6);
475
+ box-shadow: 0 20px 40px rgba(15, 23, 42, 0.85);
476
+ }
477
+
478
+ .hero-panel-label {
479
+ color: #93c5fd;
480
+ }
481
+
482
+ .hero-panel-endpoint {
483
+ background: rgba(15, 23, 42, 0.98);
484
+ border-color: rgba(148, 163, 184, 0.6);
485
+ color: #e5e7eb;
486
+ }
487
+
488
+ .hero-panel-hint {
489
+ color: #9ca3af;
490
+ }
491
+
492
+ .hero-panel-hint strong {
493
+ color: #e5e7eb;
494
+ }
495
+
496
+ .search-input {
497
+ background: rgba(15, 23, 42, 0.96);
498
+ border-color: rgba(55, 65, 81, 0.9);
499
+ color: #e5e7eb;
500
+ box-shadow:
501
+ 0 6px 16px rgba(15, 23, 42, 0.9),
502
+ 0 0 0 1px rgba(15, 23, 42, 0.9);
503
+ }
504
+
505
+ .search-input::placeholder {
506
+ color: #6b7280;
507
+ }
508
+
509
+ .search-input:focus {
510
+ border-color: #60a5fa;
511
+ box-shadow:
512
+ 0 0 0 1px rgba(59, 130, 246, 0.7),
513
+ 0 10px 26px rgba(30, 64, 175, 0.7);
514
+ }
515
+
516
+ .search-hint,
517
+ .search-empty {
518
+ color: #9ca3af;
519
+ }
520
+
521
+ h1, h2 {
522
+ color: #e5e7eb;
523
+ }
524
+
525
+ h2 {
526
+ color: #9ca3af;
527
+ }
528
+
529
+ a {
530
+ color: #60a5fa;
531
+ }
532
+
533
+ hr {
534
+ border-top-color: rgba(148, 163, 184, 0.4);
535
+ }
536
+
537
+ .card {
538
+ background: radial-gradient(circle at 0 0, rgba(56, 189, 248, 0.12), transparent 75%),
539
+ rgba(15, 23, 42, 0.9);
540
+ box-shadow:
541
+ 0 14px 30px rgba(15, 23, 42, 0.8),
542
+ 0 0 0 1px rgba(15, 23, 42, 0.85);
543
+ border-color: rgba(148, 163, 184, 0.5);
544
+ }
545
+
546
+ .card:hover {
547
+ box-shadow:
548
+ 0 18px 40px rgba(15, 23, 42, 0.9),
549
+ 0 0 0 1px rgba(59, 130, 246, 0.8);
550
+ }
551
+
552
+ .card-title {
553
+ color: #e5e7eb;
554
+ }
555
+
556
+ .card-desc {
557
+ color: #9ca3af;
558
+ }
559
+
560
+ .card-meta {
561
+ color: #6b7280;
562
+ }
563
+
564
+ .item-card {
565
+ background: rgba(15, 23, 42, 0.9);
566
+ box-shadow:
567
+ 0 10px 24px rgba(15, 23, 42, 0.9),
568
+ 0 0 0 1px rgba(15, 23, 42, 0.9);
569
+ }
570
+
571
+ .item-desc,
572
+ .item-meta {
573
+ color: #9ca3af;
574
+ }
575
+
576
+ .item-schema {
577
+ background: rgba(15, 23, 42, 0.95);
578
+ color: #e5e7eb;
579
+ }
580
+
581
+ .endpoint-url {
582
+ color: #9ca3af;
583
+ }
584
+
585
+ .endpoint-url code {
586
+ background: rgba(15, 23, 42, 0.95);
587
+ }
588
+
589
+ .badge {
590
+ background: rgba(15, 23, 42, 0.96);
591
+ color: #e5e7eb;
592
+ border-color: rgba(148, 163, 184, 0.6);
593
+ }
594
+
595
+ .badge.python {
596
+ background: rgba(252, 211, 77, 0.12);
597
+ color: #facc15;
598
+ border-color: rgba(250, 204, 21, 0.5);
599
+ }
600
+
601
+ .badge.typescript {
602
+ background: rgba(59, 130, 246, 0.12);
603
+ color: #93c5fd;
604
+ border-color: rgba(59, 130, 246, 0.7);
605
+ }
606
+
607
+ .badge.javascript {
608
+ background: rgba(251, 191, 36, 0.12);
609
+ color: #fbbf24;
610
+ border-color: rgba(251, 191, 36, 0.55);
611
+ }
612
+
613
+ .logo-light {
614
+ display: none;
615
+ }
616
+ .logo-dark {
617
+ display: block;
618
+ }
619
+ }
620
+ `;
621
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/site/styles.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,UAAU,GAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqmBhC,CAAC"}