@fedify/redis 0.2.0 → 0.3.0-dev.12

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.
package/README.md CHANGED
@@ -62,6 +62,14 @@ bun add @fedify/redis
62
62
  Changelog
63
63
  ---------
64
64
 
65
+ ### Version 0.3.0
66
+
67
+ To be released.
68
+
69
+ - Polling is now more efficient.
70
+ - Renamed `RedisMessageQueueOptions.loopInterval` option to `pollInterval`
71
+ option.
72
+
65
73
  ### Version 0.2.0
66
74
 
67
75
  Released on September 26, 2024.
package/esm/src/mq.js CHANGED
@@ -9,7 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _RedisMessageQueue_instances, _RedisMessageQueue_redis, _RedisMessageQueue_subRedis, _RedisMessageQueue_workerId, _RedisMessageQueue_channelKey, _RedisMessageQueue_queueKey, _RedisMessageQueue_lockKey, _RedisMessageQueue_codec, _RedisMessageQueue_loopInterval, _RedisMessageQueue_loopHandle, _RedisMessageQueue_poll;
12
+ var _RedisMessageQueue_instances, _RedisMessageQueue_redis, _RedisMessageQueue_subRedis, _RedisMessageQueue_workerId, _RedisMessageQueue_channelKey, _RedisMessageQueue_queueKey, _RedisMessageQueue_lockKey, _RedisMessageQueue_codec, _RedisMessageQueue_pollIntervalMs, _RedisMessageQueue_loopHandle, _RedisMessageQueue_poll;
13
13
  // deno-lint-ignore-file no-explicit-any
14
14
  import * as dntShim from "../_dnt.shims.js";
15
15
  import { JsonCodec } from "./codec.js";
@@ -43,7 +43,7 @@ export class RedisMessageQueue {
43
43
  _RedisMessageQueue_queueKey.set(this, void 0);
44
44
  _RedisMessageQueue_lockKey.set(this, void 0);
45
45
  _RedisMessageQueue_codec.set(this, void 0);
46
- _RedisMessageQueue_loopInterval.set(this, void 0);
46
+ _RedisMessageQueue_pollIntervalMs.set(this, void 0);
47
47
  _RedisMessageQueue_loopHandle.set(this, void 0);
48
48
  __classPrivateFieldSet(this, _RedisMessageQueue_redis, redis(), "f");
49
49
  __classPrivateFieldSet(this, _RedisMessageQueue_subRedis, redis(), "f");
@@ -52,7 +52,7 @@ export class RedisMessageQueue {
52
52
  __classPrivateFieldSet(this, _RedisMessageQueue_queueKey, options.queueKey ?? "fedify_queue", "f");
53
53
  __classPrivateFieldSet(this, _RedisMessageQueue_lockKey, options.lockKey ?? "fedify_lock", "f");
54
54
  __classPrivateFieldSet(this, _RedisMessageQueue_codec, options.codec ?? new JsonCodec(), "f");
55
- __classPrivateFieldSet(this, _RedisMessageQueue_loopInterval, dntShim.Temporal.Duration.from(options.loopInterval ?? { seconds: 5 }), "f");
55
+ __classPrivateFieldSet(this, _RedisMessageQueue_pollIntervalMs, dntShim.Temporal.Duration.from(options.pollInterval ?? { seconds: 5 }).total("millisecond"), "f");
56
56
  }
57
57
  async enqueue(message, options) {
58
58
  const ts = options?.delay == null
@@ -63,41 +63,62 @@ export class RedisMessageQueue {
63
63
  if (ts < 1)
64
64
  __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").publish(__classPrivateFieldGet(this, _RedisMessageQueue_channelKey, "f"), "");
65
65
  }
66
- listen(handler, options = {}) {
66
+ async listen(handler, options = {}) {
67
67
  if (__classPrivateFieldGet(this, _RedisMessageQueue_loopHandle, "f") != null) {
68
68
  throw new Error("Already listening");
69
69
  }
70
70
  const signal = options.signal;
71
- __classPrivateFieldSet(this, _RedisMessageQueue_loopHandle, setInterval(async () => {
72
- const message = await __classPrivateFieldGet(this, _RedisMessageQueue_instances, "m", _RedisMessageQueue_poll).call(this);
73
- if (message === undefined)
74
- return;
75
- await handler(message);
76
- }, __classPrivateFieldGet(this, _RedisMessageQueue_loopInterval, "f").total({ unit: "milliseconds" })), "f");
77
- const promise = __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").subscribe(__classPrivateFieldGet(this, _RedisMessageQueue_channelKey, "f"), () => {
78
- const onMessage = async () => {
79
- const message = await __classPrivateFieldGet(this, _RedisMessageQueue_instances, "m", _RedisMessageQueue_poll).call(this);
71
+ const poll = async () => {
72
+ while (!signal?.aborted) {
73
+ let message;
74
+ try {
75
+ message = await __classPrivateFieldGet(this, _RedisMessageQueue_instances, "m", _RedisMessageQueue_poll).call(this);
76
+ }
77
+ catch {
78
+ return;
79
+ }
80
80
  if (message === undefined)
81
81
  return;
82
82
  await handler(message);
83
- };
84
- __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").on("message", onMessage);
83
+ }
84
+ };
85
+ const promise = __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").subscribe(__classPrivateFieldGet(this, _RedisMessageQueue_channelKey, "f"), () => {
86
+ __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").on("message", poll);
85
87
  signal?.addEventListener("abort", () => {
86
- __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").off("message", onMessage);
88
+ __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").off("message", poll);
87
89
  });
88
90
  });
89
- return new Promise((resolve) => {
91
+ signal?.addEventListener("abort", () => {
92
+ for (const timeout of timeouts)
93
+ clearTimeout(timeout);
94
+ });
95
+ const timeouts = new Set();
96
+ while (!signal?.aborted) {
97
+ let timeout;
98
+ await new Promise((resolve) => {
99
+ signal?.addEventListener("abort", resolve);
100
+ timeout = setTimeout(() => {
101
+ signal?.removeEventListener("abort", resolve);
102
+ resolve(0);
103
+ }, __classPrivateFieldGet(this, _RedisMessageQueue_pollIntervalMs, "f"));
104
+ timeouts.add(timeout);
105
+ });
106
+ if (timeout != null)
107
+ timeouts.delete(timeout);
108
+ await poll();
109
+ }
110
+ return await new Promise((resolve) => {
90
111
  signal?.addEventListener("abort", () => {
91
- clearInterval(__classPrivateFieldGet(this, _RedisMessageQueue_loopHandle, "f"));
92
- promise.then(() => resolve());
112
+ promise.catch(() => resolve()).then(() => resolve());
93
113
  });
114
+ promise.catch(() => resolve()).then(() => resolve());
94
115
  });
95
116
  }
96
- [(_RedisMessageQueue_redis = new WeakMap(), _RedisMessageQueue_subRedis = new WeakMap(), _RedisMessageQueue_workerId = new WeakMap(), _RedisMessageQueue_channelKey = new WeakMap(), _RedisMessageQueue_queueKey = new WeakMap(), _RedisMessageQueue_lockKey = new WeakMap(), _RedisMessageQueue_codec = new WeakMap(), _RedisMessageQueue_loopInterval = new WeakMap(), _RedisMessageQueue_loopHandle = new WeakMap(), _RedisMessageQueue_instances = new WeakSet(), _RedisMessageQueue_poll = async function _RedisMessageQueue_poll() {
117
+ [(_RedisMessageQueue_redis = new WeakMap(), _RedisMessageQueue_subRedis = new WeakMap(), _RedisMessageQueue_workerId = new WeakMap(), _RedisMessageQueue_channelKey = new WeakMap(), _RedisMessageQueue_queueKey = new WeakMap(), _RedisMessageQueue_lockKey = new WeakMap(), _RedisMessageQueue_codec = new WeakMap(), _RedisMessageQueue_pollIntervalMs = new WeakMap(), _RedisMessageQueue_loopHandle = new WeakMap(), _RedisMessageQueue_instances = new WeakSet(), _RedisMessageQueue_poll = async function _RedisMessageQueue_poll() {
97
118
  const result = await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").setnx(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this, _RedisMessageQueue_workerId, "f"));
98
119
  if (result < 1)
99
120
  return;
100
- await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").expire(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this, _RedisMessageQueue_loopInterval, "f").total({ unit: "seconds" }) * 2);
121
+ await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").expire(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this, _RedisMessageQueue_pollIntervalMs, "f") / 1000 * 2);
101
122
  const messages = await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").zrangebyscoreBuffer(__classPrivateFieldGet(this, _RedisMessageQueue_queueKey, "f"), 0, dntShim.Temporal.Now.instant().epochMilliseconds);
102
123
  try {
103
124
  if (messages.length < 1)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/redis",
3
- "version": "0.2.0",
3
+ "version": "0.3.0-dev.12+c328aa31",
4
4
  "description": "Redis drivers for Fedify",
5
5
  "keywords": [
6
6
  "fedify",
package/script/src/mq.js CHANGED
@@ -33,7 +33,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
33
33
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
34
34
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
35
35
  };
36
- var _RedisMessageQueue_instances, _RedisMessageQueue_redis, _RedisMessageQueue_subRedis, _RedisMessageQueue_workerId, _RedisMessageQueue_channelKey, _RedisMessageQueue_queueKey, _RedisMessageQueue_lockKey, _RedisMessageQueue_codec, _RedisMessageQueue_loopInterval, _RedisMessageQueue_loopHandle, _RedisMessageQueue_poll;
36
+ var _RedisMessageQueue_instances, _RedisMessageQueue_redis, _RedisMessageQueue_subRedis, _RedisMessageQueue_workerId, _RedisMessageQueue_channelKey, _RedisMessageQueue_queueKey, _RedisMessageQueue_lockKey, _RedisMessageQueue_codec, _RedisMessageQueue_pollIntervalMs, _RedisMessageQueue_loopHandle, _RedisMessageQueue_poll;
37
37
  Object.defineProperty(exports, "__esModule", { value: true });
38
38
  exports.RedisMessageQueue = void 0;
39
39
  // deno-lint-ignore-file no-explicit-any
@@ -69,7 +69,7 @@ class RedisMessageQueue {
69
69
  _RedisMessageQueue_queueKey.set(this, void 0);
70
70
  _RedisMessageQueue_lockKey.set(this, void 0);
71
71
  _RedisMessageQueue_codec.set(this, void 0);
72
- _RedisMessageQueue_loopInterval.set(this, void 0);
72
+ _RedisMessageQueue_pollIntervalMs.set(this, void 0);
73
73
  _RedisMessageQueue_loopHandle.set(this, void 0);
74
74
  __classPrivateFieldSet(this, _RedisMessageQueue_redis, redis(), "f");
75
75
  __classPrivateFieldSet(this, _RedisMessageQueue_subRedis, redis(), "f");
@@ -78,7 +78,7 @@ class RedisMessageQueue {
78
78
  __classPrivateFieldSet(this, _RedisMessageQueue_queueKey, options.queueKey ?? "fedify_queue", "f");
79
79
  __classPrivateFieldSet(this, _RedisMessageQueue_lockKey, options.lockKey ?? "fedify_lock", "f");
80
80
  __classPrivateFieldSet(this, _RedisMessageQueue_codec, options.codec ?? new codec_js_1.JsonCodec(), "f");
81
- __classPrivateFieldSet(this, _RedisMessageQueue_loopInterval, dntShim.Temporal.Duration.from(options.loopInterval ?? { seconds: 5 }), "f");
81
+ __classPrivateFieldSet(this, _RedisMessageQueue_pollIntervalMs, dntShim.Temporal.Duration.from(options.pollInterval ?? { seconds: 5 }).total("millisecond"), "f");
82
82
  }
83
83
  async enqueue(message, options) {
84
84
  const ts = options?.delay == null
@@ -89,41 +89,62 @@ class RedisMessageQueue {
89
89
  if (ts < 1)
90
90
  __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").publish(__classPrivateFieldGet(this, _RedisMessageQueue_channelKey, "f"), "");
91
91
  }
92
- listen(handler, options = {}) {
92
+ async listen(handler, options = {}) {
93
93
  if (__classPrivateFieldGet(this, _RedisMessageQueue_loopHandle, "f") != null) {
94
94
  throw new Error("Already listening");
95
95
  }
96
96
  const signal = options.signal;
97
- __classPrivateFieldSet(this, _RedisMessageQueue_loopHandle, setInterval(async () => {
98
- const message = await __classPrivateFieldGet(this, _RedisMessageQueue_instances, "m", _RedisMessageQueue_poll).call(this);
99
- if (message === undefined)
100
- return;
101
- await handler(message);
102
- }, __classPrivateFieldGet(this, _RedisMessageQueue_loopInterval, "f").total({ unit: "milliseconds" })), "f");
103
- const promise = __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").subscribe(__classPrivateFieldGet(this, _RedisMessageQueue_channelKey, "f"), () => {
104
- const onMessage = async () => {
105
- const message = await __classPrivateFieldGet(this, _RedisMessageQueue_instances, "m", _RedisMessageQueue_poll).call(this);
97
+ const poll = async () => {
98
+ while (!signal?.aborted) {
99
+ let message;
100
+ try {
101
+ message = await __classPrivateFieldGet(this, _RedisMessageQueue_instances, "m", _RedisMessageQueue_poll).call(this);
102
+ }
103
+ catch {
104
+ return;
105
+ }
106
106
  if (message === undefined)
107
107
  return;
108
108
  await handler(message);
109
- };
110
- __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").on("message", onMessage);
109
+ }
110
+ };
111
+ const promise = __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").subscribe(__classPrivateFieldGet(this, _RedisMessageQueue_channelKey, "f"), () => {
112
+ __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").on("message", poll);
111
113
  signal?.addEventListener("abort", () => {
112
- __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").off("message", onMessage);
114
+ __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").off("message", poll);
113
115
  });
114
116
  });
115
- return new Promise((resolve) => {
117
+ signal?.addEventListener("abort", () => {
118
+ for (const timeout of timeouts)
119
+ clearTimeout(timeout);
120
+ });
121
+ const timeouts = new Set();
122
+ while (!signal?.aborted) {
123
+ let timeout;
124
+ await new Promise((resolve) => {
125
+ signal?.addEventListener("abort", resolve);
126
+ timeout = setTimeout(() => {
127
+ signal?.removeEventListener("abort", resolve);
128
+ resolve(0);
129
+ }, __classPrivateFieldGet(this, _RedisMessageQueue_pollIntervalMs, "f"));
130
+ timeouts.add(timeout);
131
+ });
132
+ if (timeout != null)
133
+ timeouts.delete(timeout);
134
+ await poll();
135
+ }
136
+ return await new Promise((resolve) => {
116
137
  signal?.addEventListener("abort", () => {
117
- clearInterval(__classPrivateFieldGet(this, _RedisMessageQueue_loopHandle, "f"));
118
- promise.then(() => resolve());
138
+ promise.catch(() => resolve()).then(() => resolve());
119
139
  });
140
+ promise.catch(() => resolve()).then(() => resolve());
120
141
  });
121
142
  }
122
- [(_RedisMessageQueue_redis = new WeakMap(), _RedisMessageQueue_subRedis = new WeakMap(), _RedisMessageQueue_workerId = new WeakMap(), _RedisMessageQueue_channelKey = new WeakMap(), _RedisMessageQueue_queueKey = new WeakMap(), _RedisMessageQueue_lockKey = new WeakMap(), _RedisMessageQueue_codec = new WeakMap(), _RedisMessageQueue_loopInterval = new WeakMap(), _RedisMessageQueue_loopHandle = new WeakMap(), _RedisMessageQueue_instances = new WeakSet(), _RedisMessageQueue_poll = async function _RedisMessageQueue_poll() {
143
+ [(_RedisMessageQueue_redis = new WeakMap(), _RedisMessageQueue_subRedis = new WeakMap(), _RedisMessageQueue_workerId = new WeakMap(), _RedisMessageQueue_channelKey = new WeakMap(), _RedisMessageQueue_queueKey = new WeakMap(), _RedisMessageQueue_lockKey = new WeakMap(), _RedisMessageQueue_codec = new WeakMap(), _RedisMessageQueue_pollIntervalMs = new WeakMap(), _RedisMessageQueue_loopHandle = new WeakMap(), _RedisMessageQueue_instances = new WeakSet(), _RedisMessageQueue_poll = async function _RedisMessageQueue_poll() {
123
144
  const result = await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").setnx(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this, _RedisMessageQueue_workerId, "f"));
124
145
  if (result < 1)
125
146
  return;
126
- await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").expire(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this, _RedisMessageQueue_loopInterval, "f").total({ unit: "seconds" }) * 2);
147
+ await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").expire(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this, _RedisMessageQueue_pollIntervalMs, "f") / 1000 * 2);
127
148
  const messages = await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").zrangebyscoreBuffer(__classPrivateFieldGet(this, _RedisMessageQueue_queueKey, "f"), 0, dntShim.Temporal.Now.instant().epochMilliseconds);
128
149
  try {
129
150
  if (messages.length < 1)
package/types/src/mq.d.ts CHANGED
@@ -16,31 +16,31 @@ export interface RedisMessageQueueOptions {
16
16
  /**
17
17
  * The Pub/Sub channel key to use for the message queue. `"fedify_channel"`
18
18
  * by default.
19
+ * @default `"fedify_channel"`
19
20
  */
20
21
  channelKey?: RedisKey;
21
22
  /**
22
23
  * The Sorted Set key to use for the delayed message queue. `"fedify_queue"`
23
24
  * by default.
25
+ * @default `"fedify_queue"`
24
26
  */
25
27
  queueKey?: RedisKey;
26
28
  /**
27
29
  * The key to use for locking the message queue. `"fedify_lock"` by default.
30
+ * @default `"fedify_lock"`
28
31
  */
29
32
  lockKey?: RedisKey;
30
33
  /**
31
34
  * The codec to use for encoding and decoding messages in the key-value store.
32
35
  * Defaults to {@link JsonCodec}.
36
+ * @default {@link JsonCodec}
33
37
  */
34
38
  codec?: Codec;
35
39
  /**
36
- * The interval at which to poll the message queue for delayed messages.
37
- * If this interval is too short, it may cause excessive load on the Redis
38
- * server. If it is too long, it may cause messages to be delayed longer
39
- * than expected.
40
- *
41
- * 5 seconds by default.
40
+ * The poll interval for the message queue. 5 seconds by default.
41
+ * @default `{ seconds: 5 }`
42
42
  */
43
- loopInterval?: dntShim.Temporal.DurationLike;
43
+ pollInterval?: dntShim.Temporal.Duration | dntShim.Temporal.DurationLike;
44
44
  }
45
45
  /**
46
46
  * A message queue that uses Redis as the underlying storage.
@@ -1 +1 @@
1
- {"version":3,"file":"mq.d.ts","sourceRoot":"","sources":["../../src/src/mq.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,KAAK,KAAK,EAAa,MAAM,YAAY,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,UAAU,CAAC,EAAE,QAAQ,CAAC;IAEtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB;;OAEG;IACH,OAAO,CAAC,EAAE,QAAQ,CAAC;IAEnB;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;CAC9C;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,iBAAkB,YAAW,YAAY,EAAE,UAAU;;IAWhE;;;;OAIG;gBACS,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,GAAE,wBAA6B;IAahE,OAAO,CACX,OAAO,EAAE,GAAG,EACZ,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,IAAI,CAAC;IA+BhB,MAAM,CACJ,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC/C,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,IAAI,CAAC;IA6BhB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CAKzB"}
1
+ {"version":3,"file":"mq.d.ts","sourceRoot":"","sources":["../../src/src/mq.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,KAAK,KAAK,EAAa,MAAM,YAAY,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;OAIG;IACH,UAAU,CAAC,EAAE,QAAQ,CAAC;IAEtB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB;;;OAGG;IACH,OAAO,CAAC,EAAE,QAAQ,CAAC;IAEnB;;;;OAIG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;CAC1E;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,iBAAkB,YAAW,YAAY,EAAE,UAAU;;IAWhE;;;;OAIG;gBACS,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,GAAE,wBAA6B;IAahE,OAAO,CACX,OAAO,EAAE,GAAG,EACZ,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,IAAI,CAAC;IA+BV,MAAM,CACV,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC/C,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,IAAI,CAAC;IAmDhB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CAKzB"}