@alchemy.run/redis 0.0.0-stage → 2.0.0-beta.84

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,47 @@
1
+ import type { RuntimeContext } from "alchemy/RuntimeContext";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Scope from "effect/Scope";
4
+ import { CommandError, type UrlMissing } from "./Errors.ts";
5
+ import { type Arg, type Reply } from "./Resp.ts";
6
+ export declare const DEFAULT_PORT = 6379;
7
+ export declare const TLS_PORT = 6380;
8
+ export interface RedisUrl {
9
+ readonly hostname: string;
10
+ readonly port: number;
11
+ readonly tls: boolean;
12
+ readonly username: string;
13
+ readonly password: string;
14
+ readonly db: number | undefined;
15
+ }
16
+ /** Parse a `redis://` or `rediss://` URL. */
17
+ export declare const parseUrl: (url: string) => RedisUrl;
18
+ /** Build a `redis://` URL. Encodes the password. Used by tests and TcpProxy. */
19
+ export declare const connectionUrl: (input: {
20
+ host: string;
21
+ port: number;
22
+ password: string;
23
+ username?: string;
24
+ db?: number;
25
+ tls?: boolean;
26
+ }) => string;
27
+ export interface Connection {
28
+ readonly send: (command: string, args?: readonly Arg[]) => Effect.Effect<Reply, CommandError>;
29
+ readonly pipeline: (commands: ReadonlyArray<readonly [string, ...Arg[]]>) => Effect.Effect<readonly Reply[], CommandError>;
30
+ }
31
+ /**
32
+ * Open an authenticated Redis session. Closes when the ambient Scope
33
+ * is released. Concurrent `send`/`pipeline` calls on one connection
34
+ * are serialized so replies stay ordered.
35
+ */
36
+ export declare const connect: (url: string) => Effect.Effect<Connection, CommandError, Scope.Scope>;
37
+ /**
38
+ * Send one Redis command over RESP and close the connection.
39
+ */
40
+ export declare const run: (url: string, command: string, args?: readonly Arg[]) => Effect.Effect<Reply, CommandError>;
41
+ /**
42
+ * Pipeline several commands on one connection, then close it.
43
+ */
44
+ export declare const pipeline: (url: string, commands: ReadonlyArray<readonly [string, ...Arg[]]>) => Effect.Effect<readonly Reply[], CommandError>;
45
+ export declare const command: (url: Effect.Effect<string, UrlMissing, RuntimeContext>, name: string, args?: readonly Arg[]) => Effect.Effect<Reply, CommandError | UrlMissing, RuntimeContext>;
46
+ export declare const commandPipeline: (url: Effect.Effect<string, UrlMissing, RuntimeContext>, commands: ReadonlyArray<readonly [string, ...Arg[]]>) => Effect.Effect<readonly Reply[], CommandError | UrlMissing, RuntimeContext>;
47
+ //# sourceMappingURL=Protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Protocol.d.ts","sourceRoot":"","sources":["../src/Protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAiB,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAyB,KAAK,GAAG,EAAE,KAAK,KAAK,EAAE,MAAM,WAAW,CAAC;AAExE,eAAO,MAAM,YAAY,OAAO,CAAC;AACjC,eAAO,MAAM,QAAQ,OAAO,CAAC;AAY7B,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,6CAA6C;AAC7C,eAAO,MAAM,QAAQ,QAAS,MAAM,KAAG,QAatC,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,aAAa,UAAW;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,KAAG,MAKH,CAAC;AA6LF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC9F,QAAQ,CAAC,QAAQ,EAAE,CACjB,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,KACjD,MAAM,CAAC,MAAM,CAAC,SAAS,KAAK,EAAE,EAAE,YAAY,CAAC,CAAC;CACpD;AA6BD;;;;GAIG;AACH,eAAO,MAAM,OAAO,QAAS,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,EAAE,KAAK,CAAC,KAAK,CA2DrF,CAAC;AAQL;;GAEG;AACH,eAAO,MAAM,GAAG,QACT,MAAM,WACF,MAAM,SACT,SAAS,GAAG,EAAE,KACnB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,CAOjC,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,QAAQ,QACd,MAAM,YACD,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,KACnD,MAAM,CAAC,MAAM,CAAC,SAAS,KAAK,EAAE,EAAE,YAAY,CAO5C,CAAC;AAEJ,eAAO,MAAM,OAAO,QACb,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,CAAC,QAChD,MAAM,SACN,SAAS,GAAG,EAAE,KACnB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,UAAU,EAAE,cAAc,CAI7D,CAAC;AAEL,eAAO,MAAM,eAAe,QACrB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,CAAC,YAC5C,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,KACnD,MAAM,CAAC,MAAM,CAAC,SAAS,KAAK,EAAE,EAAE,YAAY,GAAG,UAAU,EAAE,cAAc,CAIxE,CAAC"}
@@ -0,0 +1,269 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Queue from "effect/Queue";
3
+ import * as Scope from "effect/Scope";
4
+ import * as Semaphore from "effect/Semaphore";
5
+ import { CommandError, ProtocolError } from "./Errors.js";
6
+ import { encodeCommand, Parser } from "./Resp.js";
7
+ export const DEFAULT_PORT = 6379;
8
+ export const TLS_PORT = 6380;
9
+ /** Parse a `redis://` or `rediss://` URL. */
10
+ export const parseUrl = (url) => {
11
+ const parsed = new URL(url);
12
+ const tls = parsed.protocol === "rediss:";
13
+ const path = parsed.pathname.startsWith("/") ? parsed.pathname.slice(1) : parsed.pathname;
14
+ const dbRaw = path.length === 0 ? undefined : Number(path);
15
+ return {
16
+ hostname: parsed.hostname,
17
+ port: Number(parsed.port || (tls ? TLS_PORT : DEFAULT_PORT)),
18
+ tls,
19
+ username: decodeURIComponent(parsed.username),
20
+ password: decodeURIComponent(parsed.password),
21
+ db: dbRaw !== undefined && Number.isInteger(dbRaw) && dbRaw >= 0 ? dbRaw : undefined,
22
+ };
23
+ };
24
+ /** Build a `redis://` URL. Encodes the password. Used by tests and TcpProxy. */
25
+ export const connectionUrl = (input) => {
26
+ const username = input.username ?? "default";
27
+ const scheme = input.tls ? "rediss" : "redis";
28
+ const db = input.db !== undefined ? `/${input.db}` : "";
29
+ return `${scheme}://${username}:${encodeURIComponent(input.password)}@${input.host}:${input.port}${db}`;
30
+ };
31
+ const commandError = (command, cause) => cause instanceof CommandError
32
+ ? new CommandError({ command, cause: cause.cause })
33
+ : new CommandError({ command, cause });
34
+ const asBytes = (data) => new Uint8Array(data);
35
+ const writeSocket = (socket, bytes) => {
36
+ const written = socket.write(bytes);
37
+ if (typeof written === "object" && written !== null && "then" in written) {
38
+ return Effect.tryPromise({
39
+ try: () => Promise.resolve(written),
40
+ catch: (cause) => commandError("WRITE", cause),
41
+ }).pipe(Effect.asVoid);
42
+ }
43
+ return Effect.void;
44
+ };
45
+ const openBun = (options, events) => Effect.callback((resume, signal) => {
46
+ let settled = false;
47
+ let socket;
48
+ const succeed = (value) => {
49
+ if (settled)
50
+ return;
51
+ settled = true;
52
+ resume(Effect.succeed(value));
53
+ };
54
+ const fail = (cause) => {
55
+ if (settled) {
56
+ Queue.offerUnsafe(events, { _tag: "Fail", cause });
57
+ return;
58
+ }
59
+ settled = true;
60
+ resume(Effect.fail(commandError("CONNECT", cause)));
61
+ };
62
+ const Client = globalThis.Bun;
63
+ if (Client === undefined) {
64
+ fail(new Error("Bun.connect is not available"));
65
+ return;
66
+ }
67
+ Client.connect({
68
+ hostname: options.hostname,
69
+ port: options.port,
70
+ tls: options.tls,
71
+ socket: {
72
+ binaryType: "uint8array",
73
+ open: (opened) => {
74
+ socket = opened;
75
+ succeed(opened);
76
+ },
77
+ data: (_opened, chunk) => {
78
+ Queue.offerUnsafe(events, {
79
+ _tag: "Data",
80
+ bytes: asBytes(chunk),
81
+ });
82
+ },
83
+ error: (_opened, cause) => fail(cause),
84
+ connectError: (_opened, cause) => fail(cause),
85
+ close: () => {
86
+ Queue.offerUnsafe(events, { _tag: "End" });
87
+ },
88
+ end: () => {
89
+ Queue.offerUnsafe(events, { _tag: "End" });
90
+ },
91
+ },
92
+ }).catch(fail);
93
+ const abort = () => {
94
+ socket?.end();
95
+ };
96
+ signal.addEventListener("abort", abort, { once: true });
97
+ return Effect.sync(() => {
98
+ signal.removeEventListener("abort", abort);
99
+ abort();
100
+ });
101
+ });
102
+ const openNode = (options, events) => Effect.callback((resume, signal) => {
103
+ let settled = false;
104
+ let socket;
105
+ const succeed = (value) => {
106
+ if (settled)
107
+ return;
108
+ settled = true;
109
+ resume(Effect.succeed(value));
110
+ };
111
+ const fail = (cause) => {
112
+ if (settled) {
113
+ Queue.offerUnsafe(events, { _tag: "Fail", cause });
114
+ return;
115
+ }
116
+ settled = true;
117
+ resume(Effect.fail(commandError("CONNECT", cause)));
118
+ };
119
+ const attach = (nodeSocket, ready) => {
120
+ socket = nodeSocket;
121
+ nodeSocket.on(ready, () => succeed({
122
+ write: (bytes) => {
123
+ nodeSocket.write(bytes);
124
+ return bytes.length;
125
+ },
126
+ end: () => {
127
+ nodeSocket.end();
128
+ },
129
+ }));
130
+ nodeSocket.on("data", (chunk) => {
131
+ Queue.offerUnsafe(events, { _tag: "Data", bytes: asBytes(chunk) });
132
+ });
133
+ nodeSocket.on("error", fail);
134
+ nodeSocket.on("close", () => {
135
+ Queue.offerUnsafe(events, { _tag: "End" });
136
+ });
137
+ };
138
+ const start = options.tls
139
+ ? import("node:tls").then((tls) => attach(tls.connect({
140
+ host: options.hostname,
141
+ port: options.port,
142
+ servername: options.hostname,
143
+ }), "secureConnect"))
144
+ : import("node:net").then((net) => attach(net.connect({ host: options.hostname, port: options.port }), "connect"));
145
+ start.catch(fail);
146
+ const abort = () => {
147
+ socket?.end();
148
+ };
149
+ signal.addEventListener("abort", abort, { once: true });
150
+ return Effect.sync(() => {
151
+ signal.removeEventListener("abort", abort);
152
+ abort();
153
+ });
154
+ });
155
+ const openRaw = (options, events) => typeof Bun !== "undefined" ? openBun(options, events) : openNode(options, events);
156
+ const unwrap = (frame, command) => {
157
+ if (frame._tag === "Protocol") {
158
+ return Effect.fail(commandError(command, frame.error));
159
+ }
160
+ if (frame._tag === "Error") {
161
+ return Effect.fail(commandError(command, frame.error));
162
+ }
163
+ if (frame._tag === "Push") {
164
+ return Effect.succeed(frame.value);
165
+ }
166
+ return Effect.succeed(frame.value);
167
+ };
168
+ const expectStatus = (reply, command) => {
169
+ if (typeof reply === "string" && reply.toUpperCase() === "OK") {
170
+ return Effect.void;
171
+ }
172
+ return Effect.fail(commandError(command, new ProtocolError({ message: `expected OK, got ${String(reply)}` })));
173
+ };
174
+ const readReplies = (events, parser, count, command) => Effect.gen(function* () {
175
+ const replies = [];
176
+ while (replies.length < count) {
177
+ const event = yield* Queue.take(events);
178
+ if (event._tag === "Fail") {
179
+ return yield* commandError(command, event.cause);
180
+ }
181
+ if (event._tag === "End") {
182
+ return yield* commandError(command, new ProtocolError({ message: "connection closed" }));
183
+ }
184
+ parser.push(event.bytes);
185
+ while (replies.length < count) {
186
+ const frame = parser.next();
187
+ if (frame._tag === "Incomplete")
188
+ break;
189
+ if (frame._tag === "Push")
190
+ continue;
191
+ replies.push(yield* unwrap(frame, command));
192
+ }
193
+ }
194
+ return replies;
195
+ });
196
+ /**
197
+ * Open an authenticated Redis session. Closes when the ambient Scope
198
+ * is released. Concurrent `send`/`pipeline` calls on one connection
199
+ * are serialized so replies stay ordered.
200
+ */
201
+ export const connect = (url) => Effect.gen(function* () {
202
+ const options = yield* Effect.try({
203
+ try: () => parseUrl(url),
204
+ catch: (cause) => commandError("CONNECT", cause),
205
+ });
206
+ const events = yield* Queue.unbounded();
207
+ const socket = yield* Effect.acquireRelease(openRaw(options, events), (opened) => Effect.sync(() => {
208
+ opened.end();
209
+ }).pipe(Effect.flatMap(() => Queue.shutdown(events)), Effect.asVoid));
210
+ const parser = new Parser();
211
+ const lock = yield* Semaphore.make(1);
212
+ const request = (payload, count, command) => lock.withPermit(Effect.gen(function* () {
213
+ yield* writeSocket(socket, payload);
214
+ return yield* readReplies(events, parser, count, command);
215
+ }));
216
+ if (options.password.length > 0) {
217
+ const authArgs = options.username.length > 0 && options.username !== "default"
218
+ ? [options.username, options.password]
219
+ : [options.password];
220
+ const replies = yield* request(encodeCommand("AUTH", authArgs), 1, "AUTH");
221
+ yield* expectStatus(replies[0] ?? null, "AUTH");
222
+ }
223
+ if (options.db !== undefined && options.db !== 0) {
224
+ const replies = yield* request(encodeCommand("SELECT", [options.db]), 1, "SELECT");
225
+ yield* expectStatus(replies[0] ?? null, "SELECT");
226
+ }
227
+ return {
228
+ send: (command, args = []) => request(encodeCommand(command, args), 1, command).pipe(Effect.map((replies) => replies[0] ?? null)),
229
+ pipeline: (commands) => {
230
+ if (commands.length === 0)
231
+ return Effect.succeed([]);
232
+ const chunks = commands.map(([name, ...args]) => encodeCommand(name, args));
233
+ let total = 0;
234
+ for (const chunk of chunks)
235
+ total += chunk.length;
236
+ const payload = new Uint8Array(total);
237
+ let offset = 0;
238
+ for (const chunk of chunks) {
239
+ payload.set(chunk, offset);
240
+ offset += chunk.length;
241
+ }
242
+ return request(payload, commands.length, commands[0]?.[0] ?? "PIPELINE");
243
+ },
244
+ };
245
+ });
246
+ const scoped = (command, effect) => Effect.scoped(effect).pipe(Effect.mapError((error) => commandError(command, error)));
247
+ /**
248
+ * Send one Redis command over RESP and close the connection.
249
+ */
250
+ export const run = (url, command, args = []) => scoped(command, Effect.gen(function* () {
251
+ const connection = yield* connect(url);
252
+ return yield* connection.send(command, args);
253
+ }));
254
+ /**
255
+ * Pipeline several commands on one connection, then close it.
256
+ */
257
+ export const pipeline = (url, commands) => scoped(commands[0]?.[0] ?? "PIPELINE", Effect.gen(function* () {
258
+ const connection = yield* connect(url);
259
+ return yield* connection.pipeline(commands);
260
+ }));
261
+ export const command = (url, name, args = []) => Effect.gen(function* () {
262
+ const resolved = yield* url;
263
+ return yield* run(resolved, name, args);
264
+ });
265
+ export const commandPipeline = (url, commands) => Effect.gen(function* () {
266
+ const resolved = yield* url;
267
+ return yield* pipeline(resolved, commands);
268
+ });
269
+ //# sourceMappingURL=Protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Protocol.js","sourceRoot":"","sources":["../src/Protocol.ts"],"names":[],"mappings":"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"}
package/lib/Resp.d.ts ADDED
@@ -0,0 +1,65 @@
1
+ /**
2
+ * RESP2 + RESP3 codec. Commands are encoded as arrays of bulk strings.
3
+ * Replies are parsed with a length-prefixed recursive reader so values
4
+ * may contain CR/LF/`$`/`*` and may arrive split across TCP frames.
5
+ *
6
+ * Spec: https://github.com/redis/redis-specifications/blob/master/protocol/RESP2.md
7
+ * Algorithm: the same as NodeRedis/node-redis-parser, reimplemented here
8
+ * so alchemy does not take a Redis client dependency.
9
+ */
10
+ import { ProtocolError, ReplyError } from "./Errors.ts";
11
+ export type Arg = string | number | Uint8Array;
12
+ /**
13
+ * A decoded RESP value. Nested errors stay as {@link ReplyError} values
14
+ * (arrays may contain them). Top-level errors fail the command.
15
+ */
16
+ export type Reply = string | number | boolean | bigint | null | ReplyError | readonly Reply[] | {
17
+ readonly [key: string]: Reply;
18
+ };
19
+ export type ParseResult = {
20
+ readonly _tag: "Incomplete";
21
+ } | {
22
+ readonly _tag: "Reply";
23
+ readonly value: Reply;
24
+ } | {
25
+ readonly _tag: "Error";
26
+ readonly error: ReplyError;
27
+ } | {
28
+ readonly _tag: "Push";
29
+ readonly value: readonly Reply[];
30
+ } | {
31
+ readonly _tag: "Protocol";
32
+ readonly error: ProtocolError;
33
+ };
34
+ export declare const Incomplete: Extract<ParseResult, {
35
+ _tag: "Incomplete";
36
+ }>;
37
+ export declare const encodeSimpleString: (value: string) => Uint8Array;
38
+ export declare const encodeError: (value: string) => Uint8Array;
39
+ export declare const encodeInteger: (value: number | bigint) => Uint8Array;
40
+ export declare const encodeBoolean: (value: boolean) => Uint8Array;
41
+ export declare const encodeDouble: (value: number) => Uint8Array;
42
+ export declare const encodeBigNumber: (value: bigint) => Uint8Array;
43
+ export declare const encodeNull: () => Uint8Array;
44
+ export declare const encodeNullArray: () => Uint8Array;
45
+ export declare const encodeBulk: (value: string | Uint8Array) => Uint8Array;
46
+ export declare const encodeArray: (items: readonly Uint8Array[]) => Uint8Array;
47
+ /** Encode a client command as a RESP array of bulk strings. */
48
+ export declare const encodeCommand: (command: string, args?: readonly Arg[]) => Uint8Array;
49
+ export declare const encodeReply: (value: Reply) => Uint8Array;
50
+ /**
51
+ * Incremental RESP parser. Feed TCP chunks with {@link Parser.push} and
52
+ * pull complete frames with {@link Parser.next}.
53
+ */
54
+ export declare class Parser {
55
+ #private;
56
+ push(chunk: Uint8Array): void;
57
+ /** Unparsed bytes still buffered. */
58
+ get pending(): number;
59
+ next(): ParseResult;
60
+ }
61
+ /** Parse one complete frame. Incomplete or leftover bytes are protocol errors. */
62
+ export declare const decode: (bytes: Uint8Array | string) => ParseResult;
63
+ /** Parse every complete frame in `bytes`. Trailing incomplete data errors. */
64
+ export declare const decodeAll: (bytes: Uint8Array | string) => ParseResult[];
65
+ //# sourceMappingURL=Resp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Resp.d.ts","sourceRoot":"","sources":["../src/Resp.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAE/C;;;GAGG;AACH,MAAM,MAAM,KAAK,GACb,MAAM,GACN,MAAM,GACN,OAAO,GACP,MAAM,GACN,IAAI,GACJ,UAAU,GACV,SAAS,KAAK,EAAE,GAChB;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,KAAK,CAAA;CAAE,CAAC;AAEtC,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;CAAE,GAC/B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,CAAA;CAAE,GAC3D;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAA;CAAE,CAAC;AAgCjE,eAAO,MAAM,UAAU,EAAE,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAEnE,CAAC;AAsBF,eAAO,MAAM,kBAAkB,UAAW,MAAM,KAAG,UACb,CAAC;AAEvC,eAAO,MAAM,WAAW,UAAW,MAAM,KAAG,UAAkD,CAAC;AAE/F,eAAO,MAAM,aAAa,UAAW,MAAM,GAAG,MAAM,KAAG,UACjB,CAAC;AAEvC,eAAO,MAAM,aAAa,UAAW,OAAO,KAAG,UAAkD,CAAC;AAElG,eAAO,MAAM,YAAY,UAAW,MAAM,KAAG,UAK5C,CAAC;AAEF,eAAO,MAAM,eAAe,UAAW,MAAM,KAAG,UAAkD,CAAC;AAEnG,eAAO,MAAM,UAAU,QAAO,UAAgC,CAAC;AAE/D,eAAO,MAAM,eAAe,QAAO,UAAgC,CAAC;AAEpE,eAAO,MAAM,UAAU,UAAW,MAAM,GAAG,UAAU,KAAG,UAGvD,CAAC;AAEF,eAAO,MAAM,WAAW,UAAW,SAAS,UAAU,EAAE,KAAG,UACN,CAAC;AAEtD,+DAA+D;AAC/D,eAAO,MAAM,aAAa,YAAa,MAAM,SAAQ,SAAS,GAAG,EAAE,KAAQ,UAO1E,CAAC;AAEF,eAAO,MAAM,WAAW,UAAW,KAAK,KAAG,UAuB1C,CAAC;AA4WF;;;GAGG;AACH,qBAAa,MAAM;;IAIjB,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAa5B;IAaD,qCAAqC;IACrC,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,IAAI,WAAW,CAYlB;CACF;AAED,kFAAkF;AAClF,eAAO,MAAM,MAAM,UAAW,UAAU,GAAG,MAAM,KAAG,WAkBnD,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,SAAS,UAAW,UAAU,GAAG,MAAM,KAAG,WAAW,EAmBjE,CAAC"}