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