agent-comms 3.25.0 → 3.26.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.
@@ -0,0 +1,691 @@
1
+ /**
2
+ * oRPC contract the SharedWorker itself implements, serving tabs.
3
+ *
4
+ * A superset of meshContract (the same procedures tabs already know about, since the worker's own mutation handlers are one-line passthroughs to the real server) plus one worker-only procedure: disconnect, which a tab calls on its own pagehide to have the worker evict that tab's own MessagePort peer -- a browser MessagePort never fires a "close" event on its own, so nothing else tells the worker a tab is gone.
5
+ */
6
+ import { z } from "zod";
7
+ export declare const tabContract: {
8
+ disconnect: import("@orpc/contract").ProcedureContractBuilderWithInputOutput<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{}, z.core.$strip>, object>;
9
+ send: import("@orpc/contract").ProcedureContractBuilderWithInputOutput<z.ZodObject<{
10
+ target: z.ZodString;
11
+ content: z.ZodString;
12
+ }, z.core.$strip>, z.ZodObject<{
13
+ content: z.ZodString;
14
+ isError: z.ZodBoolean;
15
+ }, z.core.$strip>, object>;
16
+ dm: import("@orpc/contract").ProcedureContractBuilderWithInputOutput<z.ZodObject<{
17
+ target: z.ZodString;
18
+ content: z.ZodString;
19
+ }, z.core.$strip>, z.ZodObject<{
20
+ content: z.ZodString;
21
+ isError: z.ZodBoolean;
22
+ }, z.core.$strip>, object>;
23
+ joinRoom: import("@orpc/contract").ProcedureContractBuilderWithInputOutput<z.ZodObject<{
24
+ room: z.ZodString;
25
+ }, z.core.$strip>, z.ZodObject<{
26
+ content: z.ZodString;
27
+ isError: z.ZodBoolean;
28
+ }, z.core.$strip>, object>;
29
+ leaveRoom: import("@orpc/contract").ProcedureContractBuilderWithInputOutput<z.ZodObject<{
30
+ room: z.ZodOptional<z.ZodString>;
31
+ }, z.core.$strip>, z.ZodObject<{
32
+ content: z.ZodString;
33
+ isError: z.ZodBoolean;
34
+ }, z.core.$strip>, object>;
35
+ createRoom: import("@orpc/contract").ProcedureContractBuilderWithInputOutput<z.ZodObject<{
36
+ name: z.ZodString;
37
+ type: z.ZodUnion<readonly [z.ZodLiteral<"public">, z.ZodLiteral<"private">, z.ZodLiteral<"secret">]>;
38
+ description: z.ZodOptional<z.ZodString>;
39
+ }, z.core.$strip>, z.ZodObject<{
40
+ content: z.ZodString;
41
+ isError: z.ZodBoolean;
42
+ }, z.core.$strip>, object>;
43
+ listRooms: import("@orpc/contract").ProcedureContractBuilderWithInputOutput<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
44
+ content: z.ZodString;
45
+ isError: z.ZodBoolean;
46
+ }, z.core.$strip>, object>;
47
+ listAgents: import("@orpc/contract").ProcedureContractBuilderWithInputOutput<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
48
+ content: z.ZodString;
49
+ isError: z.ZodBoolean;
50
+ }, z.core.$strip>, object>;
51
+ readRoom: import("@orpc/contract").ProcedureContractBuilderWithInputOutput<z.ZodObject<{
52
+ room: z.ZodOptional<z.ZodString>;
53
+ }, z.core.$strip>, z.ZodObject<{
54
+ content: z.ZodString;
55
+ isError: z.ZodBoolean;
56
+ }, z.core.$strip>, object>;
57
+ destroyRoom: import("@orpc/contract").ProcedureContractBuilderWithInputOutput<z.ZodObject<{
58
+ room: z.ZodString;
59
+ }, z.core.$strip>, z.ZodObject<{
60
+ content: z.ZodString;
61
+ isError: z.ZodBoolean;
62
+ }, z.core.$strip>, object>;
63
+ invite: import("@orpc/contract").ProcedureContractBuilderWithInputOutput<z.ZodObject<{
64
+ room: z.ZodString;
65
+ agent: z.ZodString;
66
+ }, z.core.$strip>, z.ZodObject<{
67
+ content: z.ZodString;
68
+ isError: z.ZodBoolean;
69
+ }, z.core.$strip>, object>;
70
+ declineInvite: import("@orpc/contract").ProcedureContractBuilderWithInputOutput<z.ZodObject<{
71
+ room: z.ZodString;
72
+ reason: z.ZodString;
73
+ }, z.core.$strip>, z.ZodObject<{
74
+ content: z.ZodString;
75
+ isError: z.ZodBoolean;
76
+ }, z.core.$strip>, object>;
77
+ kick: import("@orpc/contract").ProcedureContractBuilderWithInputOutput<z.ZodObject<{
78
+ room: z.ZodString;
79
+ agent: z.ZodString;
80
+ }, z.core.$strip>, z.ZodObject<{
81
+ content: z.ZodString;
82
+ isError: z.ZodBoolean;
83
+ }, z.core.$strip>, object>;
84
+ renameAgent: import("@orpc/contract").ProcedureContractBuilderWithInputOutput<z.ZodObject<{
85
+ agent: z.ZodString;
86
+ name: z.ZodString;
87
+ }, z.core.$strip>, z.ZodObject<{
88
+ content: z.ZodString;
89
+ isError: z.ZodBoolean;
90
+ }, z.core.$strip>, object>;
91
+ pushSubscribe: import("@orpc/contract").ProcedureContractBuilderWithInputOutput<z.ZodObject<{
92
+ subscription: z.ZodObject<{
93
+ endpoint: z.ZodString;
94
+ keys: z.ZodObject<{
95
+ p256dh: z.ZodString;
96
+ auth: z.ZodString;
97
+ }, z.core.$strip>;
98
+ }, z.core.$strip>;
99
+ agentId: z.ZodOptional<z.ZodString>;
100
+ }, z.core.$strip>, z.ZodObject<{
101
+ content: z.ZodString;
102
+ isError: z.ZodBoolean;
103
+ }, z.core.$strip>, object>;
104
+ pushUnsubscribe: import("@orpc/contract").ProcedureContractBuilderWithInputOutput<z.ZodObject<{
105
+ agentId: z.ZodOptional<z.ZodString>;
106
+ }, z.core.$strip>, z.ZodObject<{
107
+ content: z.ZodString;
108
+ isError: z.ZodBoolean;
109
+ }, z.core.$strip>, object>;
110
+ subscribeEvents: import("@orpc/contract").ProcedureContractBuilderWithInputOutput<z.ZodObject<{
111
+ lastEventId: z.ZodOptional<z.ZodString>;
112
+ }, z.core.$strip>, import("@orpc/contract").Schema<AsyncIteratorObject<{
113
+ kind: "state_sync";
114
+ state: {
115
+ agents: Record<string, {
116
+ id: string;
117
+ version: number;
118
+ name: string;
119
+ harness: string;
120
+ cwd: string;
121
+ pid: number;
122
+ startedAt: string;
123
+ visibility: "visible" | "hidden" | "ghost";
124
+ status: "active" | "idle" | "busy" | "offline";
125
+ tags: string[];
126
+ subscribedRooms: string[];
127
+ }>;
128
+ rooms: Record<string, {
129
+ id: string;
130
+ version: number;
131
+ name: string;
132
+ type: "public" | "private" | "secret";
133
+ owner: string;
134
+ createdAt: string;
135
+ description: string;
136
+ members: string[];
137
+ invited: string[];
138
+ memberJoins: Record<string, number>;
139
+ memberLeaves: Record<string, number>;
140
+ invitedJoins: Record<string, number>;
141
+ invitedLeaves: Record<string, number>;
142
+ }>;
143
+ messages: Record<string, {
144
+ id: string;
145
+ from: string;
146
+ room: string;
147
+ content: string;
148
+ timestamp: string;
149
+ readBy: string[];
150
+ replyTo?: string | undefined;
151
+ streamingBehavior?: "steer" | "followUp" | "info" | undefined;
152
+ }[]>;
153
+ dms: Record<string, {
154
+ id: string;
155
+ from: string;
156
+ to: string;
157
+ content: string;
158
+ timestamp: string;
159
+ readBy: string[];
160
+ streamingBehavior?: "steer" | "followUp" | "info" | undefined;
161
+ }[]>;
162
+ };
163
+ } | {
164
+ kind: "state_patch";
165
+ patch: {
166
+ type: "agent_upsert";
167
+ agent: {
168
+ id: string;
169
+ version: number;
170
+ name: string;
171
+ harness: string;
172
+ cwd: string;
173
+ pid: number;
174
+ startedAt: string;
175
+ visibility: "visible" | "hidden" | "ghost";
176
+ status: "active" | "idle" | "busy" | "offline";
177
+ tags: string[];
178
+ subscribedRooms: string[];
179
+ };
180
+ } | {
181
+ type: "agent_offline";
182
+ agentId: string;
183
+ } | {
184
+ type: "room_upsert";
185
+ room: {
186
+ id: string;
187
+ version: number;
188
+ name: string;
189
+ type: "public" | "private" | "secret";
190
+ owner: string;
191
+ createdAt: string;
192
+ description: string;
193
+ members: string[];
194
+ invited: string[];
195
+ memberJoins: Record<string, number>;
196
+ memberLeaves: Record<string, number>;
197
+ invitedJoins: Record<string, number>;
198
+ invitedLeaves: Record<string, number>;
199
+ };
200
+ } | {
201
+ type: "room_delete";
202
+ roomId: string;
203
+ } | {
204
+ type: "message_add";
205
+ roomId: string;
206
+ message: {
207
+ id: string;
208
+ from: string;
209
+ room: string;
210
+ content: string;
211
+ timestamp: string;
212
+ readBy: string[];
213
+ replyTo?: string | undefined;
214
+ streamingBehavior?: "steer" | "followUp" | "info" | undefined;
215
+ };
216
+ } | {
217
+ type: "dm_add";
218
+ key: string;
219
+ message: {
220
+ id: string;
221
+ from: string;
222
+ to: string;
223
+ content: string;
224
+ timestamp: string;
225
+ readBy: string[];
226
+ streamingBehavior?: "steer" | "followUp" | "info" | undefined;
227
+ };
228
+ } | {
229
+ type: "delivery";
230
+ agentId: string;
231
+ event: {
232
+ type: "room_message";
233
+ message: {
234
+ id: string;
235
+ from: string;
236
+ room: string;
237
+ content: string;
238
+ timestamp: string;
239
+ readBy: string[];
240
+ replyTo?: string | undefined;
241
+ streamingBehavior?: "steer" | "followUp" | "info" | undefined;
242
+ };
243
+ } | {
244
+ type: "dm";
245
+ message: {
246
+ id: string;
247
+ from: string;
248
+ to: string;
249
+ content: string;
250
+ timestamp: string;
251
+ readBy: string[];
252
+ streamingBehavior?: "steer" | "followUp" | "info" | undefined;
253
+ };
254
+ } | {
255
+ type: "room_invite";
256
+ room: string;
257
+ roomDescription: string;
258
+ from: string;
259
+ fromName: string;
260
+ fromCwd: string;
261
+ } | {
262
+ type: "member_joined";
263
+ room: string;
264
+ agent: string;
265
+ } | {
266
+ type: "member_left";
267
+ room: string;
268
+ agent: string;
269
+ } | {
270
+ type: "room_members";
271
+ room: string;
272
+ members: {
273
+ id: string;
274
+ name: string;
275
+ status: "active" | "idle" | "busy" | "offline";
276
+ }[];
277
+ } | {
278
+ type: "member_status";
279
+ room: string;
280
+ agent: string;
281
+ status: "active" | "idle" | "busy" | "offline";
282
+ } | {
283
+ type: "delivery_status";
284
+ messageId: string;
285
+ agent: string;
286
+ status: "delivered" | "read";
287
+ room?: string | undefined;
288
+ } | {
289
+ type: "invite_declined";
290
+ room: string;
291
+ agent: string;
292
+ agentName: string;
293
+ reason: string;
294
+ } | {
295
+ type: "name_changed";
296
+ agent: string;
297
+ oldName: string;
298
+ newName: string;
299
+ } | {
300
+ type: "connection_request";
301
+ connectionId: string;
302
+ peerId: string;
303
+ dataPort: number;
304
+ name: string;
305
+ fingerprint: string;
306
+ } | {
307
+ type: "capability_request";
308
+ requestId: string;
309
+ capability: string;
310
+ scopeKind: string;
311
+ requesterDevice: string;
312
+ scopePath?: string | undefined;
313
+ };
314
+ };
315
+ } | {
316
+ kind: "delivery";
317
+ event: {
318
+ type: "room_message";
319
+ message: {
320
+ id: string;
321
+ from: string;
322
+ room: string;
323
+ content: string;
324
+ timestamp: string;
325
+ readBy: string[];
326
+ replyTo?: string | undefined;
327
+ streamingBehavior?: "steer" | "followUp" | "info" | undefined;
328
+ };
329
+ } | {
330
+ type: "dm";
331
+ message: {
332
+ id: string;
333
+ from: string;
334
+ to: string;
335
+ content: string;
336
+ timestamp: string;
337
+ readBy: string[];
338
+ streamingBehavior?: "steer" | "followUp" | "info" | undefined;
339
+ };
340
+ } | {
341
+ type: "room_invite";
342
+ room: string;
343
+ roomDescription: string;
344
+ from: string;
345
+ fromName: string;
346
+ fromCwd: string;
347
+ } | {
348
+ type: "member_joined";
349
+ room: string;
350
+ agent: string;
351
+ } | {
352
+ type: "member_left";
353
+ room: string;
354
+ agent: string;
355
+ } | {
356
+ type: "room_members";
357
+ room: string;
358
+ members: {
359
+ id: string;
360
+ name: string;
361
+ status: "active" | "idle" | "busy" | "offline";
362
+ }[];
363
+ } | {
364
+ type: "member_status";
365
+ room: string;
366
+ agent: string;
367
+ status: "active" | "idle" | "busy" | "offline";
368
+ } | {
369
+ type: "delivery_status";
370
+ messageId: string;
371
+ agent: string;
372
+ status: "delivered" | "read";
373
+ room?: string | undefined;
374
+ } | {
375
+ type: "invite_declined";
376
+ room: string;
377
+ agent: string;
378
+ agentName: string;
379
+ reason: string;
380
+ } | {
381
+ type: "name_changed";
382
+ agent: string;
383
+ oldName: string;
384
+ newName: string;
385
+ } | {
386
+ type: "connection_request";
387
+ connectionId: string;
388
+ peerId: string;
389
+ dataPort: number;
390
+ name: string;
391
+ fingerprint: string;
392
+ } | {
393
+ type: "capability_request";
394
+ requestId: string;
395
+ capability: string;
396
+ scopeKind: string;
397
+ requesterDevice: string;
398
+ scopePath?: string | undefined;
399
+ };
400
+ }, unknown, void>, import("@orpc/client").AsyncIteratorClass<{
401
+ kind: "state_sync";
402
+ state: {
403
+ agents: Record<string, {
404
+ id: string;
405
+ version: number;
406
+ name: string;
407
+ harness: string;
408
+ cwd: string;
409
+ pid: number;
410
+ startedAt: string;
411
+ visibility: "visible" | "hidden" | "ghost";
412
+ status: "active" | "idle" | "busy" | "offline";
413
+ tags: string[];
414
+ subscribedRooms: string[];
415
+ }>;
416
+ rooms: Record<string, {
417
+ id: string;
418
+ version: number;
419
+ name: string;
420
+ type: "public" | "private" | "secret";
421
+ owner: string;
422
+ createdAt: string;
423
+ description: string;
424
+ members: string[];
425
+ invited: string[];
426
+ memberJoins: Record<string, number>;
427
+ memberLeaves: Record<string, number>;
428
+ invitedJoins: Record<string, number>;
429
+ invitedLeaves: Record<string, number>;
430
+ }>;
431
+ messages: Record<string, {
432
+ id: string;
433
+ from: string;
434
+ room: string;
435
+ content: string;
436
+ timestamp: string;
437
+ readBy: string[];
438
+ replyTo?: string | undefined;
439
+ streamingBehavior?: "steer" | "followUp" | "info" | undefined;
440
+ }[]>;
441
+ dms: Record<string, {
442
+ id: string;
443
+ from: string;
444
+ to: string;
445
+ content: string;
446
+ timestamp: string;
447
+ readBy: string[];
448
+ streamingBehavior?: "steer" | "followUp" | "info" | undefined;
449
+ }[]>;
450
+ };
451
+ } | {
452
+ kind: "state_patch";
453
+ patch: {
454
+ type: "agent_upsert";
455
+ agent: {
456
+ id: string;
457
+ version: number;
458
+ name: string;
459
+ harness: string;
460
+ cwd: string;
461
+ pid: number;
462
+ startedAt: string;
463
+ visibility: "visible" | "hidden" | "ghost";
464
+ status: "active" | "idle" | "busy" | "offline";
465
+ tags: string[];
466
+ subscribedRooms: string[];
467
+ };
468
+ } | {
469
+ type: "agent_offline";
470
+ agentId: string;
471
+ } | {
472
+ type: "room_upsert";
473
+ room: {
474
+ id: string;
475
+ version: number;
476
+ name: string;
477
+ type: "public" | "private" | "secret";
478
+ owner: string;
479
+ createdAt: string;
480
+ description: string;
481
+ members: string[];
482
+ invited: string[];
483
+ memberJoins: Record<string, number>;
484
+ memberLeaves: Record<string, number>;
485
+ invitedJoins: Record<string, number>;
486
+ invitedLeaves: Record<string, number>;
487
+ };
488
+ } | {
489
+ type: "room_delete";
490
+ roomId: string;
491
+ } | {
492
+ type: "message_add";
493
+ roomId: string;
494
+ message: {
495
+ id: string;
496
+ from: string;
497
+ room: string;
498
+ content: string;
499
+ timestamp: string;
500
+ readBy: string[];
501
+ replyTo?: string | undefined;
502
+ streamingBehavior?: "steer" | "followUp" | "info" | undefined;
503
+ };
504
+ } | {
505
+ type: "dm_add";
506
+ key: string;
507
+ message: {
508
+ id: string;
509
+ from: string;
510
+ to: string;
511
+ content: string;
512
+ timestamp: string;
513
+ readBy: string[];
514
+ streamingBehavior?: "steer" | "followUp" | "info" | undefined;
515
+ };
516
+ } | {
517
+ type: "delivery";
518
+ agentId: string;
519
+ event: {
520
+ type: "room_message";
521
+ message: {
522
+ id: string;
523
+ from: string;
524
+ room: string;
525
+ content: string;
526
+ timestamp: string;
527
+ readBy: string[];
528
+ replyTo?: string | undefined;
529
+ streamingBehavior?: "steer" | "followUp" | "info" | undefined;
530
+ };
531
+ } | {
532
+ type: "dm";
533
+ message: {
534
+ id: string;
535
+ from: string;
536
+ to: string;
537
+ content: string;
538
+ timestamp: string;
539
+ readBy: string[];
540
+ streamingBehavior?: "steer" | "followUp" | "info" | undefined;
541
+ };
542
+ } | {
543
+ type: "room_invite";
544
+ room: string;
545
+ roomDescription: string;
546
+ from: string;
547
+ fromName: string;
548
+ fromCwd: string;
549
+ } | {
550
+ type: "member_joined";
551
+ room: string;
552
+ agent: string;
553
+ } | {
554
+ type: "member_left";
555
+ room: string;
556
+ agent: string;
557
+ } | {
558
+ type: "room_members";
559
+ room: string;
560
+ members: {
561
+ id: string;
562
+ name: string;
563
+ status: "active" | "idle" | "busy" | "offline";
564
+ }[];
565
+ } | {
566
+ type: "member_status";
567
+ room: string;
568
+ agent: string;
569
+ status: "active" | "idle" | "busy" | "offline";
570
+ } | {
571
+ type: "delivery_status";
572
+ messageId: string;
573
+ agent: string;
574
+ status: "delivered" | "read";
575
+ room?: string | undefined;
576
+ } | {
577
+ type: "invite_declined";
578
+ room: string;
579
+ agent: string;
580
+ agentName: string;
581
+ reason: string;
582
+ } | {
583
+ type: "name_changed";
584
+ agent: string;
585
+ oldName: string;
586
+ newName: string;
587
+ } | {
588
+ type: "connection_request";
589
+ connectionId: string;
590
+ peerId: string;
591
+ dataPort: number;
592
+ name: string;
593
+ fingerprint: string;
594
+ } | {
595
+ type: "capability_request";
596
+ requestId: string;
597
+ capability: string;
598
+ scopeKind: string;
599
+ requesterDevice: string;
600
+ scopePath?: string | undefined;
601
+ };
602
+ };
603
+ } | {
604
+ kind: "delivery";
605
+ event: {
606
+ type: "room_message";
607
+ message: {
608
+ id: string;
609
+ from: string;
610
+ room: string;
611
+ content: string;
612
+ timestamp: string;
613
+ readBy: string[];
614
+ replyTo?: string | undefined;
615
+ streamingBehavior?: "steer" | "followUp" | "info" | undefined;
616
+ };
617
+ } | {
618
+ type: "dm";
619
+ message: {
620
+ id: string;
621
+ from: string;
622
+ to: string;
623
+ content: string;
624
+ timestamp: string;
625
+ readBy: string[];
626
+ streamingBehavior?: "steer" | "followUp" | "info" | undefined;
627
+ };
628
+ } | {
629
+ type: "room_invite";
630
+ room: string;
631
+ roomDescription: string;
632
+ from: string;
633
+ fromName: string;
634
+ fromCwd: string;
635
+ } | {
636
+ type: "member_joined";
637
+ room: string;
638
+ agent: string;
639
+ } | {
640
+ type: "member_left";
641
+ room: string;
642
+ agent: string;
643
+ } | {
644
+ type: "room_members";
645
+ room: string;
646
+ members: {
647
+ id: string;
648
+ name: string;
649
+ status: "active" | "idle" | "busy" | "offline";
650
+ }[];
651
+ } | {
652
+ type: "member_status";
653
+ room: string;
654
+ agent: string;
655
+ status: "active" | "idle" | "busy" | "offline";
656
+ } | {
657
+ type: "delivery_status";
658
+ messageId: string;
659
+ agent: string;
660
+ status: "delivered" | "read";
661
+ room?: string | undefined;
662
+ } | {
663
+ type: "invite_declined";
664
+ room: string;
665
+ agent: string;
666
+ agentName: string;
667
+ reason: string;
668
+ } | {
669
+ type: "name_changed";
670
+ agent: string;
671
+ oldName: string;
672
+ newName: string;
673
+ } | {
674
+ type: "connection_request";
675
+ connectionId: string;
676
+ peerId: string;
677
+ dataPort: number;
678
+ name: string;
679
+ fingerprint: string;
680
+ } | {
681
+ type: "capability_request";
682
+ requestId: string;
683
+ capability: string;
684
+ scopeKind: string;
685
+ requesterDevice: string;
686
+ scopePath?: string | undefined;
687
+ };
688
+ }, unknown, void>>, object>;
689
+ };
690
+ export type TabContract = typeof tabContract;
691
+ //# sourceMappingURL=tab-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tab-contract.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/tab-contract.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGvB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC"}