@fluojs/websockets 1.0.0-beta.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 (88) hide show
  1. package/LICENSE +21 -0
  2. package/README.ko.md +133 -0
  3. package/README.md +133 -0
  4. package/dist/bun/bun-module.d.ts +15 -0
  5. package/dist/bun/bun-module.d.ts.map +1 -0
  6. package/dist/bun/bun-module.js +27 -0
  7. package/dist/bun/bun-service.d.ts +63 -0
  8. package/dist/bun/bun-service.d.ts.map +1 -0
  9. package/dist/bun/bun-service.js +558 -0
  10. package/dist/bun/bun-types.d.ts +58 -0
  11. package/dist/bun/bun-types.d.ts.map +1 -0
  12. package/dist/bun/bun-types.js +1 -0
  13. package/dist/bun/bun.d.ts +4 -0
  14. package/dist/bun/bun.d.ts.map +1 -0
  15. package/dist/bun/bun.js +3 -0
  16. package/dist/bun.d.ts +2 -0
  17. package/dist/bun.d.ts.map +1 -0
  18. package/dist/bun.js +1 -0
  19. package/dist/cloudflare-workers/cloudflare-workers-module.d.ts +15 -0
  20. package/dist/cloudflare-workers/cloudflare-workers-module.d.ts.map +1 -0
  21. package/dist/cloudflare-workers/cloudflare-workers-module.js +27 -0
  22. package/dist/cloudflare-workers/cloudflare-workers-service.d.ts +61 -0
  23. package/dist/cloudflare-workers/cloudflare-workers-service.d.ts.map +1 -0
  24. package/dist/cloudflare-workers/cloudflare-workers-service.js +538 -0
  25. package/dist/cloudflare-workers/cloudflare-workers-types.d.ts +30 -0
  26. package/dist/cloudflare-workers/cloudflare-workers-types.d.ts.map +1 -0
  27. package/dist/cloudflare-workers/cloudflare-workers-types.js +1 -0
  28. package/dist/cloudflare-workers/cloudflare-workers.d.ts +4 -0
  29. package/dist/cloudflare-workers/cloudflare-workers.d.ts.map +1 -0
  30. package/dist/cloudflare-workers/cloudflare-workers.js +3 -0
  31. package/dist/cloudflare-workers.d.ts +2 -0
  32. package/dist/cloudflare-workers.d.ts.map +1 -0
  33. package/dist/cloudflare-workers.js +1 -0
  34. package/dist/decorators.d.ts +56 -0
  35. package/dist/decorators.d.ts.map +1 -0
  36. package/dist/decorators.js +115 -0
  37. package/dist/deno/deno-module.d.ts +15 -0
  38. package/dist/deno/deno-module.d.ts.map +1 -0
  39. package/dist/deno/deno-module.js +27 -0
  40. package/dist/deno/deno-service.d.ts +61 -0
  41. package/dist/deno/deno-service.d.ts.map +1 -0
  42. package/dist/deno/deno-service.js +533 -0
  43. package/dist/deno/deno-types.d.ts +25 -0
  44. package/dist/deno/deno-types.d.ts.map +1 -0
  45. package/dist/deno/deno-types.js +1 -0
  46. package/dist/deno/deno.d.ts +4 -0
  47. package/dist/deno/deno.d.ts.map +1 -0
  48. package/dist/deno/deno.js +3 -0
  49. package/dist/deno.d.ts +2 -0
  50. package/dist/deno.d.ts.map +1 -0
  51. package/dist/deno.js +1 -0
  52. package/dist/index.d.ts +6 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +5 -0
  55. package/dist/internal/shared.d.ts +28 -0
  56. package/dist/internal/shared.d.ts.map +1 -0
  57. package/dist/internal/shared.js +188 -0
  58. package/dist/metadata.d.ts +13 -0
  59. package/dist/metadata.d.ts.map +1 -0
  60. package/dist/metadata.js +81 -0
  61. package/dist/module.d.ts +26 -0
  62. package/dist/module.d.ts.map +1 -0
  63. package/dist/module.js +26 -0
  64. package/dist/node/node-module.d.ts +15 -0
  65. package/dist/node/node-module.d.ts.map +1 -0
  66. package/dist/node/node-module.js +27 -0
  67. package/dist/node/node-service.d.ts +129 -0
  68. package/dist/node/node-service.d.ts.map +1 -0
  69. package/dist/node/node-service.js +892 -0
  70. package/dist/node/node-types.d.ts +81 -0
  71. package/dist/node/node-types.d.ts.map +1 -0
  72. package/dist/node/node-types.js +1 -0
  73. package/dist/node/node.d.ts +4 -0
  74. package/dist/node/node.d.ts.map +1 -0
  75. package/dist/node/node.js +3 -0
  76. package/dist/node.d.ts +2 -0
  77. package/dist/node.d.ts.map +1 -0
  78. package/dist/node.js +1 -0
  79. package/dist/options-token.internal.d.ts +7 -0
  80. package/dist/options-token.internal.d.ts.map +1 -0
  81. package/dist/options-token.internal.js +4 -0
  82. package/dist/service.d.ts +9 -0
  83. package/dist/service.d.ts.map +1 -0
  84. package/dist/service.js +8 -0
  85. package/dist/types.d.ts +133 -0
  86. package/dist/types.d.ts.map +1 -0
  87. package/dist/types.js +1 -0
  88. package/package.json +91 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-workers.d.ts","sourceRoot":"","sources":["../../src/cloudflare-workers/cloudflare-workers.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './cloudflare-workers-module.js';
2
+ export * from './cloudflare-workers-service.js';
3
+ export * from './cloudflare-workers-types.js';
@@ -0,0 +1,2 @@
1
+ export * from './cloudflare-workers/cloudflare-workers.js';
2
+ //# sourceMappingURL=cloudflare-workers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-workers.d.ts","sourceRoot":"","sources":["../src/cloudflare-workers.ts"],"names":[],"mappings":"AAAA,cAAc,4CAA4C,CAAC"}
@@ -0,0 +1 @@
1
+ export * from './cloudflare-workers/cloudflare-workers.js';
@@ -0,0 +1,56 @@
1
+ import type { WebSocketEventMap, WebSocketGatewayOptions } from './types.js';
2
+ type StandardClassDecoratorFn = (value: Function, context: ClassDecoratorContext) => void;
3
+ type StandardMethodDecoratorFn = (value: Function, context: ClassMethodDecoratorContext) => void;
4
+ type ClassDecoratorLike = StandardClassDecoratorFn;
5
+ type MethodDecoratorLike = StandardMethodDecoratorFn;
6
+ /**
7
+ * Marks a class as a WebSocket gateway discovered during module bootstrap.
8
+ *
9
+ * @param options Gateway path and optional server-backed listener configuration.
10
+ * @returns A class decorator that stores gateway metadata for runtime discovery.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import { WebSocketGateway } from '@fluojs/websockets';
15
+ *
16
+ * @WebSocketGateway({ path: '/chat' })
17
+ * class ChatGateway {}
18
+ * ```
19
+ *
20
+ * @remarks
21
+ * Multiple gateways may share one `path`; handlers run in discovery order.
22
+ */
23
+ export declare function WebSocketGateway(options?: WebSocketGatewayOptions): ClassDecoratorLike;
24
+ /**
25
+ * Registers a method as an inbound message handler for a gateway.
26
+ *
27
+ * @param event Optional event name filter. When omitted, the runtime treats the handler as a generic message listener.
28
+ * @returns A method decorator that records message-handler metadata for the gateway.
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * import { OnMessage } from '@fluojs/websockets';
33
+ *
34
+ * class ChatGateway {
35
+ * @OnMessage('ping')
36
+ * handlePing(payload: unknown) {
37
+ * return payload;
38
+ * }
39
+ * }
40
+ * ```
41
+ */
42
+ export declare function OnMessage<TEvents extends WebSocketEventMap = WebSocketEventMap, K extends keyof TEvents = keyof TEvents>(event?: K & string): MethodDecoratorLike;
43
+ /**
44
+ * Registers a method that runs when one client connection is established.
45
+ *
46
+ * @returns A method decorator that records a connection lifecycle handler.
47
+ */
48
+ export declare function OnConnect(): MethodDecoratorLike;
49
+ /**
50
+ * Registers a method that runs when one client disconnects from the gateway.
51
+ *
52
+ * @returns A method decorator that records a disconnection lifecycle handler.
53
+ */
54
+ export declare function OnDisconnect(): MethodDecoratorLike;
55
+ export {};
56
+ //# sourceMappingURL=decorators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAmC,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAG9G,KAAK,wBAAwB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,qBAAqB,KAAK,IAAI,CAAC;AAC1F,KAAK,yBAAyB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,KAAK,IAAI,CAAC;AACjG,KAAK,kBAAkB,GAAG,wBAAwB,CAAC;AACnD,KAAK,mBAAmB,GAAG,yBAAyB,CAAC;AA6DrD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,GAAE,uBAA4B,GACpC,kBAAkB,CAMpB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,SAAS,CACvB,OAAO,SAAS,iBAAiB,GAAG,iBAAiB,EACrD,CAAC,SAAS,MAAM,OAAO,GAAG,MAAM,OAAO,EACvC,KAAK,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,mBAAmB,CAKzC;AAED;;;;GAIG;AACH,wBAAgB,SAAS,IAAI,mBAAmB,CAI/C;AAED;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,mBAAmB,CAIlD"}
@@ -0,0 +1,115 @@
1
+ import { metadataSymbol } from '@fluojs/core/internal';
2
+ import { webSocketGatewayMetadataSymbol, webSocketHandlerMetadataSymbol } from './metadata.js';
3
+ function getStandardMetadataBag(metadata) {
4
+ void metadataSymbol;
5
+ return metadata;
6
+ }
7
+ function normalizeGatewayPath(path) {
8
+ if (!path || path === '/') {
9
+ return '/';
10
+ }
11
+ const normalized = `/${path.trim().replace(/^\/+/, '').replace(/\/+$/, '')}`;
12
+ return normalized === '' ? '/' : normalized;
13
+ }
14
+ function defineStandardGatewayMetadata(metadata, options) {
15
+ const bag = getStandardMetadataBag(metadata);
16
+ bag[webSocketGatewayMetadataSymbol] = {
17
+ path: normalizeGatewayPath(options.path),
18
+ serverBacked: options.serverBacked ? {
19
+ port: options.serverBacked.port
20
+ } : undefined
21
+ };
22
+ }
23
+ function defineStandardHandlerMetadata(metadata, propertyKey, handlerMetadata) {
24
+ const bag = getStandardMetadataBag(metadata);
25
+ const current = bag[webSocketHandlerMetadataSymbol];
26
+ const map = current ?? new Map();
27
+ map.set(propertyKey, {
28
+ event: handlerMetadata.event,
29
+ type: handlerMetadata.type
30
+ });
31
+ bag[webSocketHandlerMetadataSymbol] = map;
32
+ }
33
+ function createMethodDecorator(metadata) {
34
+ const decorator = (_value, context) => {
35
+ if (context.private) {
36
+ throw new Error(`@${metadata.type === 'message' ? 'OnMessage' : metadata.type === 'connect' ? 'OnConnect' : 'OnDisconnect'}() cannot be used on private methods.`);
37
+ }
38
+ if (context.static) {
39
+ throw new Error(`@${metadata.type === 'message' ? 'OnMessage' : metadata.type === 'connect' ? 'OnConnect' : 'OnDisconnect'}() cannot be used on static methods.`);
40
+ }
41
+ defineStandardHandlerMetadata(context.metadata, context.name, metadata);
42
+ };
43
+ return decorator;
44
+ }
45
+
46
+ /**
47
+ * Marks a class as a WebSocket gateway discovered during module bootstrap.
48
+ *
49
+ * @param options Gateway path and optional server-backed listener configuration.
50
+ * @returns A class decorator that stores gateway metadata for runtime discovery.
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * import { WebSocketGateway } from '@fluojs/websockets';
55
+ *
56
+ * @WebSocketGateway({ path: '/chat' })
57
+ * class ChatGateway {}
58
+ * ```
59
+ *
60
+ * @remarks
61
+ * Multiple gateways may share one `path`; handlers run in discovery order.
62
+ */
63
+ export function WebSocketGateway(options = {}) {
64
+ const decorator = (_value, context) => {
65
+ defineStandardGatewayMetadata(context.metadata, options);
66
+ };
67
+ return decorator;
68
+ }
69
+
70
+ /**
71
+ * Registers a method as an inbound message handler for a gateway.
72
+ *
73
+ * @param event Optional event name filter. When omitted, the runtime treats the handler as a generic message listener.
74
+ * @returns A method decorator that records message-handler metadata for the gateway.
75
+ *
76
+ * @example
77
+ * ```ts
78
+ * import { OnMessage } from '@fluojs/websockets';
79
+ *
80
+ * class ChatGateway {
81
+ * @OnMessage('ping')
82
+ * handlePing(payload: unknown) {
83
+ * return payload;
84
+ * }
85
+ * }
86
+ * ```
87
+ */
88
+ export function OnMessage(event) {
89
+ return createMethodDecorator({
90
+ event,
91
+ type: 'message'
92
+ });
93
+ }
94
+
95
+ /**
96
+ * Registers a method that runs when one client connection is established.
97
+ *
98
+ * @returns A method decorator that records a connection lifecycle handler.
99
+ */
100
+ export function OnConnect() {
101
+ return createMethodDecorator({
102
+ type: 'connect'
103
+ });
104
+ }
105
+
106
+ /**
107
+ * Registers a method that runs when one client disconnects from the gateway.
108
+ *
109
+ * @returns A method decorator that records a disconnection lifecycle handler.
110
+ */
111
+ export function OnDisconnect() {
112
+ return createMethodDecorator({
113
+ type: 'disconnect'
114
+ });
115
+ }
@@ -0,0 +1,15 @@
1
+ import { type ModuleType } from '@fluojs/runtime';
2
+ import type { WebSocketModuleOptions } from './deno-types.js';
3
+ /**
4
+ * Explicit Deno websocket module entrypoint.
5
+ */
6
+ export declare class DenoWebSocketModule {
7
+ /**
8
+ * Registers the Deno websocket lifecycle service for request-upgrade gateway hosting.
9
+ *
10
+ * @param options Websocket gateway runtime options for guards, limits, heartbeat, and shutdown behavior.
11
+ * @returns A runtime module definition scoped to the Deno websocket adapter.
12
+ */
13
+ static forRoot(options?: WebSocketModuleOptions): ModuleType;
14
+ }
15
+ //# sourceMappingURL=deno-module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deno-module.d.ts","sourceRoot":"","sources":["../../src/deno/deno-module.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIhE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAY9D;;GAEG;AACH,qBAAa,mBAAmB;IAC9B;;;;;OAKG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,sBAA2B,GAAG,UAAU;CAOjE"}
@@ -0,0 +1,27 @@
1
+ import { defineModule } from '@fluojs/runtime';
2
+ import { WEBSOCKET_OPTIONS_INTERNAL } from '../options-token.internal.js';
3
+ import { DenoWebSocketGatewayLifecycleService } from './deno-service.js';
4
+ function createDenoWebSocketProviders(options = {}) {
5
+ return [{
6
+ provide: WEBSOCKET_OPTIONS_INTERNAL,
7
+ useValue: options
8
+ }, DenoWebSocketGatewayLifecycleService];
9
+ }
10
+
11
+ /**
12
+ * Explicit Deno websocket module entrypoint.
13
+ */
14
+ export class DenoWebSocketModule {
15
+ /**
16
+ * Registers the Deno websocket lifecycle service for request-upgrade gateway hosting.
17
+ *
18
+ * @param options Websocket gateway runtime options for guards, limits, heartbeat, and shutdown behavior.
19
+ * @returns A runtime module definition scoped to the Deno websocket adapter.
20
+ */
21
+ static forRoot(options = {}) {
22
+ class DenoWebSocketRuntimeModule extends DenoWebSocketModule {}
23
+ return defineModule(DenoWebSocketRuntimeModule, {
24
+ providers: createDenoWebSocketProviders(options)
25
+ });
26
+ }
27
+ }
@@ -0,0 +1,61 @@
1
+ import type { Container } from '@fluojs/di';
2
+ import type { ApplicationLogger, CompiledModule, OnApplicationBootstrap, OnApplicationShutdown, OnModuleDestroy } from '@fluojs/runtime';
3
+ import type { HttpApplicationAdapter } from '@fluojs/http';
4
+ import type { WebSocketRoomService } from '../types.js';
5
+ import type { WebSocketModuleOptions } from './deno-types.js';
6
+ /**
7
+ * Boots Deno-backed websocket gateways and manages their room lifecycle state.
8
+ */
9
+ export declare class DenoWebSocketGatewayLifecycleService implements OnApplicationBootstrap, OnApplicationShutdown, OnModuleDestroy, WebSocketRoomService {
10
+ private readonly runtimeContainer;
11
+ private readonly compiledModules;
12
+ private readonly logger;
13
+ private readonly adapter;
14
+ private readonly moduleOptions;
15
+ private pendingUpgradeReservations;
16
+ private readonly roomSockets;
17
+ private shutdownPromise;
18
+ private readonly socketRegistry;
19
+ private readonly socketRooms;
20
+ constructor(runtimeContainer: Container, compiledModules: readonly CompiledModule[], logger: ApplicationLogger, adapter: HttpApplicationAdapter, moduleOptions: WebSocketModuleOptions);
21
+ onApplicationBootstrap(): Promise<void>;
22
+ private assertNoServerBackedGatewayOptIn;
23
+ onApplicationShutdown(): Promise<void>;
24
+ onModuleDestroy(): Promise<void>;
25
+ private createBinding;
26
+ private groupDescriptorsByPath;
27
+ private bindConnectionHandlers;
28
+ private createConnectionHandlerState;
29
+ private attachConnectionListeners;
30
+ private getBufferedMessageCount;
31
+ private getQueuedMessageCount;
32
+ private maybeCompactBufferedMessages;
33
+ private clearBufferedMessages;
34
+ private maybeCompactQueuedMessages;
35
+ private clearQueuedMessages;
36
+ private bufferIncomingMessage;
37
+ private enqueueMessageDispatch;
38
+ private drainMessageQueue;
39
+ private normalizeMessage;
40
+ private enqueueDisconnectDispatch;
41
+ private resolveConnectionGateways;
42
+ private runConnectHandlers;
43
+ private finalizeConnectionBinding;
44
+ private replayBufferedConnectionEvents;
45
+ private findSocketId;
46
+ private resolveUpgradeRejection;
47
+ private closeOversizedPayload;
48
+ private resolveMaxConnectionCount;
49
+ private resolveReservedConnectionCount;
50
+ private tryReserveUpgradeSlot;
51
+ private releaseUpgradeReservation;
52
+ private resolveMaxPayloadBytes;
53
+ private shutdown;
54
+ private runShutdownLifecycle;
55
+ joinRoom(socketId: string, room: string): void;
56
+ leaveRoom(socketId: string, room: string): void;
57
+ broadcastToRoom(room: string, event: string, data: unknown): void;
58
+ getRooms(socketId: string): ReadonlySet<string>;
59
+ private unregisterSocket;
60
+ }
61
+ //# sourceMappingURL=deno-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deno-service.d.ts","sourceRoot":"","sources":["../../src/deno/deno-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEzI,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAa3D,OAAO,KAAK,EAA8B,oBAAoB,EAA6B,MAAM,aAAa,CAAC;AAC/G,OAAO,KAAK,EAKV,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAsGzB;;GAEG;AACH,qBACa,oCACX,YAAW,sBAAsB,EAAE,qBAAqB,EAAE,eAAe,EAAE,oBAAoB;IAS7F,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAXhC,OAAO,CAAC,0BAA0B,CAAK;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;IAC9D,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA0C;IACzE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;gBAG3C,gBAAgB,EAAE,SAAS,EAC3B,eAAe,EAAE,SAAS,cAAc,EAAE,EAC1C,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,sBAAsB,EAC/B,aAAa,EAAE,sBAAsB;IAGlD,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB7C,OAAO,CAAC,gCAAgC;IAclC,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAItC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAItC,OAAO,CAAC,aAAa;IAoDrB,OAAO,CAAC,sBAAsB;YAmBhB,sBAAsB;IAgBpC,OAAO,CAAC,4BAA4B;IAqBpC,OAAO,CAAC,yBAAyB;IAwCjC,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,4BAA4B;IASpC,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,0BAA0B;IASlC,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,qBAAqB;IA0C7B,OAAO,CAAC,sBAAsB;YAyDhB,iBAAiB;YAqBjB,gBAAgB;IAQ9B,OAAO,CAAC,yBAAyB;YAsBnB,yBAAyB;YAczB,kBAAkB;YAgBlB,yBAAyB;YAUzB,8BAA8B;IAqB5C,OAAO,CAAC,YAAY;YAUN,uBAAuB;IAmDrC,OAAO,CAAC,qBAAqB;IAmB7B,OAAO,CAAC,yBAAyB;IAUjC,OAAO,CAAC,8BAA8B;IAItC,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,yBAAyB;IAMjC,OAAO,CAAC,sBAAsB;YAUhB,QAAQ;YAUR,oBAAoB;IAWlC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAmB9C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAc/C,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IA4BjE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;IAU/C,OAAO,CAAC,gBAAgB;CAoBzB"}