signalium 2.2.1 → 2.2.3
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/CHANGELOG.md +15 -0
- package/dist/cjs/development/{core-api-BLfPllpC.js → core-api-C6HCIyL3.js} +2 -2
- package/dist/cjs/development/{core-api-BLfPllpC.js.map → core-api-C6HCIyL3.js.map} +1 -1
- package/dist/cjs/development/{debug-C4VkJKKv.js → debug-3nd-6Gnf.js} +82 -51
- package/dist/cjs/development/debug-3nd-6Gnf.js.map +1 -0
- package/dist/cjs/development/debug.js +1 -1
- package/dist/cjs/development/index.js +2 -2
- package/dist/cjs/development/react/index.js +2 -2
- package/dist/cjs/development/utils.js +2 -2
- package/dist/cjs/production/{contexts-D9PmMMc5.js → contexts-DoZWv_3I.js} +82 -51
- package/dist/cjs/production/contexts-DoZWv_3I.js.map +1 -0
- package/dist/cjs/production/{core-api-nNbd4L7C.js → core-api-CUviCxtM.js} +2 -2
- package/dist/cjs/production/{core-api-nNbd4L7C.js.map → core-api-CUviCxtM.js.map} +1 -1
- package/dist/cjs/production/debug.js +1 -1
- package/dist/cjs/production/index.js +2 -2
- package/dist/cjs/production/react/index.js +2 -2
- package/dist/cjs/production/utils.js +2 -2
- package/dist/esm/development/{core-api-BKTJuFkJ.js → core-api-CjsScNn1.js} +2 -2
- package/dist/esm/development/{core-api-BKTJuFkJ.js.map → core-api-CjsScNn1.js.map} +1 -1
- package/dist/esm/development/{debug-qm_Izoi_.js → debug-BfudYKc4.js} +82 -51
- package/dist/esm/development/debug-BfudYKc4.js.map +1 -0
- package/dist/esm/development/debug.js +1 -1
- package/dist/esm/development/index.js +2 -2
- package/dist/esm/development/react/index.js +2 -2
- package/dist/esm/development/utils.js +3 -3
- package/dist/esm/internals/async.d.ts.map +1 -1
- package/dist/esm/internals/reactive.d.ts +14 -4
- package/dist/esm/internals/reactive.d.ts.map +1 -1
- package/dist/esm/internals/scheduling.d.ts.map +1 -1
- package/dist/esm/internals/utils/hash.d.ts +1 -3
- package/dist/esm/internals/utils/hash.d.ts.map +1 -1
- package/dist/esm/internals/watch.d.ts.map +1 -1
- package/dist/esm/production/{contexts-BLI-Vgt4.js → contexts-CilfS6eG.js} +82 -51
- package/dist/esm/production/contexts-CilfS6eG.js.map +1 -0
- package/dist/esm/production/{core-api-Ckj2uqeX.js → core-api-tTQttL8R.js} +2 -2
- package/dist/esm/production/{core-api-Ckj2uqeX.js.map → core-api-tTQttL8R.js.map} +1 -1
- package/dist/esm/production/debug.js +1 -1
- package/dist/esm/production/index.js +2 -2
- package/dist/esm/production/react/index.js +2 -2
- package/dist/esm/production/utils.js +3 -3
- package/dist/esm/types.d.ts +5 -1
- package/dist/esm/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/development/debug-C4VkJKKv.js.map +0 -1
- package/dist/cjs/production/contexts-D9PmMMc5.js.map +0 -1
- package/dist/esm/development/debug-qm_Izoi_.js.map +0 -1
- package/dist/esm/production/contexts-BLI-Vgt4.js.map +0 -1
|
@@ -106,6 +106,7 @@ function watchActiveSignal(signal2) {
|
|
|
106
106
|
const { watchCount } = signal2;
|
|
107
107
|
const newWatchCount = watchCount + 1;
|
|
108
108
|
signal2.watchCount = newWatchCount;
|
|
109
|
+
cancelDeactivate(signal2);
|
|
109
110
|
if (signal2._isActive) {
|
|
110
111
|
return;
|
|
111
112
|
}
|
|
@@ -128,7 +129,6 @@ function watchSuspendedSignal(signal2) {
|
|
|
128
129
|
const newSuspendCount = suspendCount + 1;
|
|
129
130
|
signal2.watchCount = newWatchCount;
|
|
130
131
|
signal2.suspendCount = newSuspendCount;
|
|
131
|
-
signal2.scope?.removeFromGc(signal2);
|
|
132
132
|
cancelDeactivate(signal2);
|
|
133
133
|
if (watchCount === 0) {
|
|
134
134
|
for (const dep of signal2.deps.keys()) {
|
|
@@ -150,6 +150,7 @@ function resumeSignal(signal2) {
|
|
|
150
150
|
const { watchCount, suspendCount } = signal2;
|
|
151
151
|
const newSuspendCount = Math.max(suspendCount - 1, 0);
|
|
152
152
|
signal2.suspendCount = newSuspendCount;
|
|
153
|
+
cancelDeactivate(signal2);
|
|
153
154
|
if (watchCount > 0 && !signal2._isActive) {
|
|
154
155
|
for (const dep of signal2.deps.keys()) {
|
|
155
156
|
resumeSignal(dep);
|
|
@@ -230,6 +231,7 @@ const scheduleDeactivate = (signal2) => {
|
|
|
230
231
|
scheduleFlush();
|
|
231
232
|
};
|
|
232
233
|
const cancelDeactivate = (signal2) => {
|
|
234
|
+
signal2.scope?.removeFromGc(signal2);
|
|
233
235
|
PENDING_DEACTIVE.delete(signal2);
|
|
234
236
|
};
|
|
235
237
|
const scheduleListeners = (signal2) => {
|
|
@@ -775,10 +777,10 @@ class ReactivePromiseImpl {
|
|
|
775
777
|
this._promise = promise;
|
|
776
778
|
const flags = this._flags;
|
|
777
779
|
let awaitSubs = this._awaitSubs;
|
|
778
|
-
if ((flags & 1) === 0) {
|
|
779
|
-
awaitSubs = this._setPending();
|
|
780
|
-
}
|
|
781
780
|
try {
|
|
781
|
+
if ((flags & 1) === 0) {
|
|
782
|
+
awaitSubs = this._setPending();
|
|
783
|
+
}
|
|
782
784
|
const nextValue = await promise;
|
|
783
785
|
if (promise !== this._promise) {
|
|
784
786
|
return;
|
|
@@ -1021,6 +1023,9 @@ function createRelay(activate, scope, opts) {
|
|
|
1021
1023
|
currentSub = void 0;
|
|
1022
1024
|
};
|
|
1023
1025
|
const state = {
|
|
1026
|
+
get isPending() {
|
|
1027
|
+
return (p["_flags"] & 1) !== 0;
|
|
1028
|
+
},
|
|
1024
1029
|
get value() {
|
|
1025
1030
|
return p["_value"];
|
|
1026
1031
|
},
|
|
@@ -1070,7 +1075,11 @@ function createTask(task, scope, opts) {
|
|
|
1070
1075
|
64
|
|
1071
1076
|
/* isRunnable */
|
|
1072
1077
|
);
|
|
1078
|
+
const throwIfRunning = opts?.throwIfRunning === true;
|
|
1073
1079
|
p["run"] = ((...args) => {
|
|
1080
|
+
if (throwIfRunning && (p["_flags"] & 1) !== 0) {
|
|
1081
|
+
throw new Error("Task is already running");
|
|
1082
|
+
}
|
|
1074
1083
|
p._setPromise(fn(...args));
|
|
1075
1084
|
return p;
|
|
1076
1085
|
});
|
|
@@ -1217,30 +1226,22 @@ function hashStr(key, seed = 0) {
|
|
|
1217
1226
|
const c1 = 3432918353;
|
|
1218
1227
|
const c2 = 461845907;
|
|
1219
1228
|
let i = 0;
|
|
1220
|
-
while (i +
|
|
1221
|
-
let
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
h ^=
|
|
1229
|
+
while (i + 2 <= key.length) {
|
|
1230
|
+
let k = key.charCodeAt(i) & 65535 | (key.charCodeAt(i + 1) & 65535) << 16;
|
|
1231
|
+
k = imul(k, c1);
|
|
1232
|
+
k = k << 15 | k >>> 17;
|
|
1233
|
+
k = imul(k, c2);
|
|
1234
|
+
h ^= k;
|
|
1226
1235
|
h = h << 13 | h >>> 19;
|
|
1227
1236
|
h = imul(h, 5) + 3864292196;
|
|
1228
|
-
i +=
|
|
1229
|
-
}
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
k ^= (key.charCodeAt(i + 1) & 255) << 8;
|
|
1237
|
-
// eslint-disable-next-line no-fallthrough
|
|
1238
|
-
case 1:
|
|
1239
|
-
k ^= key.charCodeAt(i) & 255;
|
|
1240
|
-
k = imul(k, c1);
|
|
1241
|
-
k = k << 15 | k >>> 17;
|
|
1242
|
-
k = imul(k, c2);
|
|
1243
|
-
h ^= k;
|
|
1237
|
+
i += 2;
|
|
1238
|
+
}
|
|
1239
|
+
if (key.length & 1) {
|
|
1240
|
+
let k = key.charCodeAt(i) & 65535;
|
|
1241
|
+
k = imul(k, c1);
|
|
1242
|
+
k = k << 15 | k >>> 17;
|
|
1243
|
+
k = imul(k, c2);
|
|
1244
|
+
h ^= k;
|
|
1244
1245
|
}
|
|
1245
1246
|
h ^= key.length;
|
|
1246
1247
|
h ^= h >>> 16;
|
|
@@ -1251,8 +1252,9 @@ function hashStr(key, seed = 0) {
|
|
|
1251
1252
|
return h >>> 0;
|
|
1252
1253
|
}
|
|
1253
1254
|
function hashNumber(num, seed = 0) {
|
|
1255
|
+
let h = num < 0 ? seed ^ 2147483648 : seed;
|
|
1254
1256
|
num = abs(num);
|
|
1255
|
-
|
|
1257
|
+
const origNum = num;
|
|
1256
1258
|
const c1 = 3432918353;
|
|
1257
1259
|
const c2 = 461845907;
|
|
1258
1260
|
while (num >= 4294967295) {
|
|
@@ -1272,7 +1274,7 @@ function hashNumber(num, seed = 0) {
|
|
|
1272
1274
|
k = imul(k, c2);
|
|
1273
1275
|
h ^= k;
|
|
1274
1276
|
}
|
|
1275
|
-
const numBytes =
|
|
1277
|
+
const numBytes = origNum === 0 ? 1 : floor(log(origNum) / log(256)) + 1;
|
|
1276
1278
|
h ^= numBytes;
|
|
1277
1279
|
h ^= h >>> 16;
|
|
1278
1280
|
h = imul(h, 2246822507);
|
|
@@ -1281,12 +1283,12 @@ function hashNumber(num, seed = 0) {
|
|
|
1281
1283
|
h ^= h >>> 16;
|
|
1282
1284
|
return h >>> 0;
|
|
1283
1285
|
}
|
|
1284
|
-
function hashArray(arr) {
|
|
1285
|
-
let h =
|
|
1286
|
+
function hashArray(arr, seen) {
|
|
1287
|
+
let h = ARRAY;
|
|
1286
1288
|
const c1 = 3432918353;
|
|
1287
1289
|
const c2 = 461845907;
|
|
1288
1290
|
for (const item of arr) {
|
|
1289
|
-
let k = hashValue(item);
|
|
1291
|
+
let k = hashValue(item, seen);
|
|
1290
1292
|
k = imul(k, c1);
|
|
1291
1293
|
k = k << 15 | k >>> 17;
|
|
1292
1294
|
k = imul(k, c2);
|
|
@@ -1302,36 +1304,36 @@ function hashArray(arr) {
|
|
|
1302
1304
|
h ^= h >>> 16;
|
|
1303
1305
|
return h >>> 0;
|
|
1304
1306
|
}
|
|
1305
|
-
function hashObject(obj) {
|
|
1307
|
+
function hashObject(obj, seen) {
|
|
1306
1308
|
let sum = OBJECT;
|
|
1307
1309
|
const keys = Object.keys(obj);
|
|
1308
1310
|
for (const key of keys) {
|
|
1309
|
-
sum += hashValue(key) ^ hashValue(obj[key]);
|
|
1311
|
+
sum += imul(hashValue(key, seen), 2654435769) ^ hashValue(obj[key], seen);
|
|
1310
1312
|
}
|
|
1311
1313
|
return sum >>> 0;
|
|
1312
1314
|
}
|
|
1313
|
-
function hashSet(set) {
|
|
1314
|
-
let sum =
|
|
1315
|
+
function hashSet(set, seen) {
|
|
1316
|
+
let sum = SET;
|
|
1315
1317
|
for (const value of set) {
|
|
1316
|
-
sum += hashValue(value);
|
|
1318
|
+
sum += hashValue(value, seen);
|
|
1317
1319
|
}
|
|
1318
1320
|
return sum >>> 0;
|
|
1319
1321
|
}
|
|
1320
|
-
function hashMap(map) {
|
|
1321
|
-
let sum =
|
|
1322
|
+
function hashMap(map, seen) {
|
|
1323
|
+
let sum = MAP;
|
|
1322
1324
|
for (const [key, value] of map) {
|
|
1323
|
-
sum += hashValue(key) ^ hashValue(value);
|
|
1325
|
+
sum += imul(hashValue(key, seen), 2654435769) ^ hashValue(value, seen);
|
|
1324
1326
|
}
|
|
1325
1327
|
return sum >>> 0;
|
|
1326
1328
|
}
|
|
1327
|
-
function hashDate(date) {
|
|
1329
|
+
function hashDate(date, _seen) {
|
|
1328
1330
|
return hashNumber(
|
|
1329
1331
|
date.getTime(),
|
|
1330
1332
|
14
|
|
1331
1333
|
/* DATE */
|
|
1332
1334
|
);
|
|
1333
1335
|
}
|
|
1334
|
-
function hashRegExp(regexp) {
|
|
1336
|
+
function hashRegExp(regexp, _seen) {
|
|
1335
1337
|
const h = hashStr(
|
|
1336
1338
|
regexp.source + regexp.flags,
|
|
1337
1339
|
15
|
|
@@ -1359,7 +1361,7 @@ const FALSE = hashStr(
|
|
|
1359
1361
|
3
|
|
1360
1362
|
/* FALSE */
|
|
1361
1363
|
);
|
|
1362
|
-
hashStr(
|
|
1364
|
+
const ARRAY = hashStr(
|
|
1363
1365
|
"array",
|
|
1364
1366
|
7
|
|
1365
1367
|
/* ARRAY */
|
|
@@ -1369,6 +1371,16 @@ const OBJECT = hashStr(
|
|
|
1369
1371
|
8
|
|
1370
1372
|
/* OBJECT */
|
|
1371
1373
|
);
|
|
1374
|
+
const SET = hashStr(
|
|
1375
|
+
"set",
|
|
1376
|
+
13
|
|
1377
|
+
/* SET */
|
|
1378
|
+
);
|
|
1379
|
+
const MAP = hashStr(
|
|
1380
|
+
"map",
|
|
1381
|
+
12
|
|
1382
|
+
/* MAP */
|
|
1383
|
+
);
|
|
1372
1384
|
const getObjectProto = Object.getPrototypeOf;
|
|
1373
1385
|
const PROTO_TO_HASH = /* @__PURE__ */ new Map([
|
|
1374
1386
|
[Object.prototype, hashObject],
|
|
@@ -1379,7 +1391,7 @@ const PROTO_TO_HASH = /* @__PURE__ */ new Map([
|
|
|
1379
1391
|
[RegExp.prototype, hashRegExp]
|
|
1380
1392
|
]);
|
|
1381
1393
|
const registerCustomHash = (ctor, hashFn) => {
|
|
1382
|
-
PROTO_TO_HASH.set(ctor.prototype, hashFn);
|
|
1394
|
+
PROTO_TO_HASH.set(ctor.prototype, (obj, _seen) => hashFn(obj));
|
|
1383
1395
|
};
|
|
1384
1396
|
function hashValue(node, seen = []) {
|
|
1385
1397
|
switch (typeof node) {
|
|
@@ -1420,7 +1432,7 @@ function hashValue(node, seen = []) {
|
|
|
1420
1432
|
const hashFn = PROTO_TO_HASH.get(getObjectProto(node));
|
|
1421
1433
|
if (hashFn) {
|
|
1422
1434
|
seen.push(node);
|
|
1423
|
-
const hash = hashFn(node);
|
|
1435
|
+
const hash = hashFn(node, seen);
|
|
1424
1436
|
seen.pop();
|
|
1425
1437
|
return hash;
|
|
1426
1438
|
}
|
|
@@ -1450,9 +1462,16 @@ function getObjectHash(obj) {
|
|
|
1450
1462
|
}
|
|
1451
1463
|
return id;
|
|
1452
1464
|
}
|
|
1453
|
-
const EMPTY_ARRAY_HASH = hashArray([]);
|
|
1465
|
+
const EMPTY_ARRAY_HASH = hashArray([], []);
|
|
1454
1466
|
function hashReactiveFn(fn, args) {
|
|
1455
|
-
|
|
1467
|
+
const argsHash = args.length > 0 ? hashArray(args, []) : EMPTY_ARRAY_HASH;
|
|
1468
|
+
let k = imul(argsHash, 3432918353);
|
|
1469
|
+
k = k << 15 | k >>> 17;
|
|
1470
|
+
k = imul(k, 461845907);
|
|
1471
|
+
let h = getObjectHash(fn);
|
|
1472
|
+
h ^= k;
|
|
1473
|
+
h = h << 13 | h >>> 19;
|
|
1474
|
+
return imul(h, 5) + 3864292196 >>> 0;
|
|
1456
1475
|
}
|
|
1457
1476
|
var ReactiveFnState = /* @__PURE__ */ ((ReactiveFnState2) => {
|
|
1458
1477
|
ReactiveFnState2[ReactiveFnState2["Clean"] = 0] = "Clean";
|
|
@@ -1541,22 +1560,33 @@ class ReactiveSignal {
|
|
|
1541
1560
|
get listeners() {
|
|
1542
1561
|
return this._listeners ?? (this._listeners = {
|
|
1543
1562
|
updatedAt: 0,
|
|
1544
|
-
current: /* @__PURE__ */ new
|
|
1563
|
+
current: /* @__PURE__ */ new Map(),
|
|
1545
1564
|
cachedBoundAdd: this.addListener.bind(this)
|
|
1546
1565
|
});
|
|
1547
1566
|
}
|
|
1548
1567
|
get value() {
|
|
1549
1568
|
return getSignal(this);
|
|
1550
1569
|
}
|
|
1551
|
-
addListener(listener) {
|
|
1570
|
+
addListener(listener, opts) {
|
|
1552
1571
|
const { current } = this.listeners;
|
|
1553
1572
|
if (!current.has(listener)) {
|
|
1573
|
+
let effective = listener;
|
|
1574
|
+
if (opts?.skipInitial) {
|
|
1575
|
+
let initial = true;
|
|
1576
|
+
effective = () => {
|
|
1577
|
+
if (initial) {
|
|
1578
|
+
initial = false;
|
|
1579
|
+
return;
|
|
1580
|
+
}
|
|
1581
|
+
listener();
|
|
1582
|
+
};
|
|
1583
|
+
}
|
|
1554
1584
|
if (!this._isListener) {
|
|
1555
1585
|
watchSignal(this, this._isSuspended);
|
|
1556
1586
|
this.flags |= 16;
|
|
1557
1587
|
}
|
|
1558
1588
|
schedulePull(this);
|
|
1559
|
-
current.
|
|
1589
|
+
current.set(listener, effective);
|
|
1560
1590
|
}
|
|
1561
1591
|
return () => {
|
|
1562
1592
|
if (current.has(listener)) {
|
|
@@ -1565,6 +1595,7 @@ class ReactiveSignal {
|
|
|
1565
1595
|
cancelPull(this);
|
|
1566
1596
|
unwatchSignal(this, this._isSuspended);
|
|
1567
1597
|
this.flags &= -17;
|
|
1598
|
+
this.listeners.updatedAt = 0;
|
|
1568
1599
|
}
|
|
1569
1600
|
}
|
|
1570
1601
|
};
|
|
@@ -1612,7 +1643,7 @@ const runListeners = (signal2) => {
|
|
|
1612
1643
|
return;
|
|
1613
1644
|
}
|
|
1614
1645
|
const { current } = listeners;
|
|
1615
|
-
for (const listener of current) {
|
|
1646
|
+
for (const listener of current.values()) {
|
|
1616
1647
|
listener();
|
|
1617
1648
|
}
|
|
1618
1649
|
};
|
|
@@ -1798,4 +1829,4 @@ exports.signal = signal;
|
|
|
1798
1829
|
exports.unwatchSignal = unwatchSignal;
|
|
1799
1830
|
exports.watchSignal = watchSignal;
|
|
1800
1831
|
exports.withContexts = withContexts;
|
|
1801
|
-
//# sourceMappingURL=contexts-
|
|
1832
|
+
//# sourceMappingURL=contexts-DoZWv_3I.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contexts-DoZWv_3I.js","sources":["../../../src/internals/weakref.ts","../../../src/internals/consumer.ts","../../../src/internals/signal.ts","../../../src/internals/watch.ts","../../../src/internals/scheduling.ts","../../../src/internals/dirty.ts","../../../src/internals/edge.ts","../../../src/internals/utils/equals.ts","../../../src/internals/utils/type-utils.ts","../../../src/internals/generators.ts","../../../src/internals/callback.ts","../../../src/internals/async.ts","../../../src/internals/get.ts","../../../src/internals/utils/hash.ts","../../../src/internals/reactive.ts","../../../src/internals/contexts.ts"],"sourcesContent":["class WeakRefPolyfill<T extends WeakKey> {\n constructor(private value: T) {}\n\n deref(): T {\n return this.value;\n }\n}\n\nexport default typeof WeakRef === 'function' ? WeakRef : (WeakRefPolyfill as unknown as WeakRefConstructor);\n","import { ReactiveSignal } from './reactive.js';\n\nlet CURRENT_CONSUMER: ReactiveSignal<any, any> | undefined;\n\nlet IS_WATCHING = false;\n\nexport const setIsWatching = (isWatching: boolean) => {\n IS_WATCHING = isWatching;\n};\n\nexport const setCurrentConsumer = (consumer: ReactiveSignal<any, any> | undefined) => {\n CURRENT_CONSUMER = consumer;\n};\n\nexport const getCurrentConsumer = () => {\n return CURRENT_CONSUMER;\n};\n\nexport const getIsWatching = () => {\n return IS_WATCHING;\n};\n\nexport const untrack = <T>(fn: () => T): T => {\n const prevConsumer = CURRENT_CONSUMER;\n CURRENT_CONSUMER = undefined;\n try {\n return fn();\n } finally {\n CURRENT_CONSUMER = prevConsumer;\n }\n};\n","import { getTracerProxy, TracerEventType } from './trace.js';\nimport { Signal, Equals, SignalOptions, Notifier } from '../types.js';\nimport { ReactiveSignal } from './reactive.js';\nimport { dirtySignal } from './dirty.js';\nimport { getCurrentConsumer } from './consumer.js';\nimport { scheduleListeners } from './scheduling.js';\n\nlet STATE_ID = 0;\n\nexport class StateSignal<T> implements Signal<T> {\n private _value: T;\n private _equals: Equals<T>;\n private _subs = new Map<WeakRef<ReactiveSignal<unknown, unknown[]>>, number>();\n _desc: string;\n _id: number;\n\n private _listeners: Set<() => void> | null = null;\n\n constructor(value: T, equals: Equals<T> = (a, b) => a === b, desc: string = 'signal') {\n this._value = value;\n this._equals = equals;\n this._id = STATE_ID++;\n this._desc = desc;\n }\n\n get value(): T {\n this.consume();\n\n return this._value;\n }\n\n update(fn: (value: T) => T) {\n this.value = fn(this._value);\n }\n\n set value(value: T) {\n if (this._equals(value, this._value)) {\n return;\n }\n\n this._value = value;\n\n this.notify();\n }\n\n consume(): void {\n const currentConsumer = getCurrentConsumer();\n if (currentConsumer !== undefined) {\n if (IS_DEV) {\n const tracer = getTracerProxy();\n tracer?.emit({\n type: TracerEventType.ConsumeState,\n id: currentConsumer.tracerMeta!.id,\n name: this._desc,\n childId: this._id,\n value: this._value,\n setValue: (value: unknown) => {\n this.value = value as T;\n },\n });\n }\n this._subs.set(currentConsumer.ref, currentConsumer.computedCount);\n }\n }\n\n notify(): void {\n const { _subs: subs } = this;\n\n for (const [subRef, consumedAt] of subs.entries()) {\n const sub = subRef.deref();\n\n if (sub === undefined || consumedAt !== sub.computedCount) {\n continue;\n }\n\n dirtySignal(sub);\n }\n\n this._subs = new Map();\n\n scheduleListeners(this);\n }\n\n addListener(listener: () => void): () => void {\n let listeners = this._listeners;\n\n if (listeners === null) {\n this._listeners = listeners = new Set();\n }\n\n listeners.add(listener);\n\n return () => listeners.delete(listener);\n }\n}\n\nexport function runListeners(signal: StateSignal<any>) {\n const listeners = signal['_listeners'];\n\n if (listeners === null) {\n return;\n }\n\n for (const listener of listeners) {\n listener();\n }\n}\n\nconst FALSE_EQUALS: Equals<unknown> = () => false;\n\nexport function signal<T>(initialValue: T, opts?: SignalOptions<T>): Signal<T> {\n const equals = opts?.equals === false ? FALSE_EQUALS : (opts?.equals ?? ((a, b) => a === b));\n\n return new StateSignal(initialValue, equals, opts?.desc) as Signal<T>;\n}\n\nexport const notifier = (opts?: SignalOptions<undefined>) => {\n return new StateSignal(undefined, FALSE_EQUALS, opts?.desc) as Notifier;\n};\n","import { ReactiveSignal, isRelay } from './reactive.js';\nimport { checkSignal } from './get.js';\nimport { cancelDeactivate, scheduleDeactivate } from './scheduling.js';\n\nexport function watchSignal(signal: ReactiveSignal<any, any>, parentIsSuspended: boolean): void {\n if (parentIsSuspended) {\n watchSuspendedSignal(signal);\n } else {\n watchActiveSignal(signal);\n }\n}\n\nexport function unwatchSignal(signal: ReactiveSignal<any, any>, parentIsSuspended: boolean): void {\n if (parentIsSuspended) {\n unwatchSuspendedSignal(signal);\n } else {\n unwatchActiveSignal(signal);\n }\n}\n\nfunction watchActiveSignal(signal: ReactiveSignal<any, any>): void {\n const { watchCount } = signal;\n const newWatchCount = watchCount + 1;\n\n signal.watchCount = newWatchCount;\n cancelDeactivate(signal);\n\n if (signal._isActive) {\n return;\n }\n\n for (const dep of signal.deps.keys()) {\n watchActiveSignal(dep);\n }\n\n activateSignal(signal);\n}\n\nfunction unwatchActiveSignal(signal: ReactiveSignal<any, any>) {\n const { watchCount } = signal;\n const newWatchCount = Math.max(watchCount - 1, 0);\n\n signal.watchCount = newWatchCount;\n\n if (newWatchCount === 0) {\n scheduleDeactivate(signal);\n }\n}\n\nfunction watchSuspendedSignal(signal: ReactiveSignal<any, any>): void {\n const { watchCount, suspendCount } = signal;\n\n const newWatchCount = watchCount + 1;\n const newSuspendCount = suspendCount + 1;\n\n signal.watchCount = newWatchCount;\n signal.suspendCount = newSuspendCount;\n\n cancelDeactivate(signal);\n\n // If the original watch count was 0, we need to propagate the watch + suspend\n // to dependencies because we are becoming watched. BUT, we don't need to\n // activate, because the signal is not changing state in this case. It is\n // moving from unwatched -> suspended, which means we _do not_ activate.\n if (watchCount === 0) {\n for (const dep of signal.deps.keys()) {\n watchSuspendedSignal(dep);\n }\n }\n}\n\nfunction unwatchSuspendedSignal(signal: ReactiveSignal<any, any>): void {\n const { watchCount, suspendCount } = signal;\n\n const newWatchCount = Math.max(watchCount - 1, 0);\n const newSuspendCount = Math.max(suspendCount - 1, 0);\n\n signal.watchCount = newWatchCount;\n signal.suspendCount = newSuspendCount;\n\n // We _do_ need to schedule deactivate if we are no longer watched, because\n // the signal is now becoming inactive.\n if (newWatchCount === 0) {\n scheduleDeactivate(signal);\n }\n}\n\nexport function resumeSignal(signal: ReactiveSignal<any, any>): void {\n const { watchCount, suspendCount } = signal;\n const newSuspendCount = Math.max(suspendCount - 1, 0);\n\n signal.suspendCount = newSuspendCount;\n cancelDeactivate(signal);\n\n if (watchCount > 0 && !signal._isActive) {\n for (const dep of signal.deps.keys()) {\n resumeSignal(dep);\n }\n\n activateSignal(signal);\n }\n}\n\nexport function suspendSignal(signal: ReactiveSignal<any, any>): void {\n const { watchCount, suspendCount } = signal;\n const newSuspendCount = suspendCount + 1;\n\n signal.suspendCount = newSuspendCount;\n\n if (watchCount > 0 && newSuspendCount === watchCount) {\n scheduleDeactivate(signal);\n }\n}\n\nfunction activateSignal(signal: ReactiveSignal<any, any>): void {\n // If signal is being watched again, remove from GC candidates and add back to scope\n signal.scope?.removeFromGc(signal);\n cancelDeactivate(signal);\n\n signal._isActive = true;\n\n if (isRelay(signal)) {\n // Bootstrap the relay\n checkSignal(signal);\n }\n}\n\nexport function deactivateSignal(signal: ReactiveSignal<any, any>) {\n const { watchCount, suspendCount } = signal;\n\n signal._isActive = false;\n const isSuspending = watchCount > 0 && suspendCount === watchCount;\n\n for (const dep of signal.deps.keys()) {\n const { watchCount: depWatchCount, suspendCount: depSuspendCount } = dep;\n\n if (isSuspending) {\n const newSuspendCount = (dep.suspendCount = depSuspendCount + 1);\n\n if (newSuspendCount === depWatchCount) {\n deactivateSignal(dep);\n }\n } else {\n const newWatchCount = (dep.watchCount = depWatchCount - 1);\n\n if (newWatchCount === 0) {\n deactivateSignal(dep);\n }\n }\n }\n\n if (isRelay(signal)) {\n // teardown the relay\n signal._value?.();\n }\n\n // If watchCount is now zero, mark the signal for GC\n if (watchCount === 0) {\n signal.scope?.markForGc(signal);\n signal.reset();\n }\n}\n","import { scheduleFlush as _scheduleFlush, runBatch } from './config.js';\nimport { ReactiveSignal } from './reactive.js';\nimport { checkAndRunListeners, checkSignal } from './get.js';\nimport { runListeners as runDerivedListeners } from './reactive.js';\nimport { runListeners as runStateListeners } from './signal.js';\nimport type { Tracer } from './trace.js';\nimport { deactivateSignal } from './watch.js';\nimport { StateSignal } from './signal.js';\nimport { SignalScope } from './contexts.js';\n\n// Determine once at startup which scheduling function to use for GC\nconst scheduleIdleCallback =\n typeof requestIdleCallback === 'function' ? requestIdleCallback : (cb: () => void) => _scheduleFlush(cb);\n\nlet PENDING_PULLS: Set<ReactiveSignal<any, any>> = new Set();\nlet PENDING_ASYNC_PULLS: ReactiveSignal<any, any>[] = [];\nlet PENDING_DEACTIVE = new Set<ReactiveSignal<any, any>>();\nlet PENDING_LISTENERS: (ReactiveSignal<any, any> | StateSignal<any>)[] = [];\nlet PENDING_TRACERS: Tracer[] | undefined = IS_DEV ? [] : undefined;\nlet PENDING_GC = new Set<SignalScope>();\n\nconst microtask = () => Promise.resolve();\n\nlet currentFlush: { promise: Promise<void>; resolve: () => void } | null = null;\n\nconst scheduleFlush = (fn: () => void) => {\n if (currentFlush) return;\n\n let resolve: () => void;\n const promise = new Promise<void>(r => (resolve = r));\n\n currentFlush = { promise, resolve: resolve! };\n\n _scheduleFlush(flushWatchers);\n};\n\nexport const schedulePull = (signal: ReactiveSignal<any, any>) => {\n PENDING_PULLS.add(signal);\n scheduleFlush(flushWatchers);\n};\n\nexport const cancelPull = (signal: ReactiveSignal<any, any>) => {\n PENDING_PULLS.delete(signal);\n};\n\nexport const scheduleAsyncPull = (signal: ReactiveSignal<any, any>) => {\n PENDING_ASYNC_PULLS.push(signal);\n scheduleFlush(flushWatchers);\n};\n\nexport const scheduleDeactivate = (signal: ReactiveSignal<any, any>) => {\n PENDING_DEACTIVE.add(signal);\n scheduleFlush(flushWatchers);\n};\n\nexport const cancelDeactivate = (signal: ReactiveSignal<any, any>) => {\n signal.scope?.removeFromGc(signal);\n PENDING_DEACTIVE.delete(signal);\n};\n\nexport const scheduleListeners = (signal: ReactiveSignal<any, any> | StateSignal<any>) => {\n PENDING_LISTENERS.push(signal);\n scheduleFlush(flushWatchers);\n};\n\nexport const scheduleTracer = (tracer: Tracer) => {\n if (IS_DEV) {\n PENDING_TRACERS!.push(tracer);\n scheduleFlush(flushWatchers);\n }\n};\n\nexport const scheduleGcSweep = (scope: SignalScope) => {\n PENDING_GC.add(scope);\n\n if (PENDING_GC.size > 1) return;\n\n scheduleIdleCallback(() => {\n for (const scope of PENDING_GC) {\n scope.sweepGc();\n }\n\n PENDING_GC.clear();\n });\n};\n\nconst flushWatchers = async () => {\n const flush = currentFlush!;\n\n // Flush all auto-pulled signals recursively, clearing\n // the microtask queue until they are all settled\n while (PENDING_ASYNC_PULLS.length > 0 || PENDING_PULLS.size > 0) {\n const asyncPulls = PENDING_ASYNC_PULLS;\n\n PENDING_ASYNC_PULLS = [];\n\n for (const pull of asyncPulls) {\n checkSignal(pull);\n }\n\n const pulls = PENDING_PULLS;\n\n PENDING_PULLS = new Set();\n\n for (const pull of pulls) {\n checkAndRunListeners(pull);\n }\n\n // This is used to tell the scheduler to wait if any async values have been resolved\n // since the last tick. If they have, we wait an extra microtask to ensure that the\n // async values have recursivey flushed before moving on to pulling watchers.\n\n await microtask();\n }\n\n // Clear the flush so that if any more watchers are scheduled,\n // they will be flushed in the next tick\n currentFlush = null;\n\n runBatch(() => {\n for (const signal of PENDING_DEACTIVE) {\n deactivateSignal(signal);\n }\n\n PENDING_DEACTIVE.clear();\n\n for (const signal of PENDING_LISTENERS) {\n if (signal instanceof ReactiveSignal) {\n runDerivedListeners(signal as any);\n } else {\n runStateListeners(signal as any);\n }\n }\n\n if (IS_DEV) {\n for (const tracer of PENDING_TRACERS!) {\n tracer.flush();\n }\n PENDING_TRACERS = [];\n }\n\n PENDING_LISTENERS = [];\n });\n\n // resolve the flush promise\n flush.resolve();\n};\n\nexport const settled = async () => {\n while (currentFlush) {\n await currentFlush.promise;\n }\n};\n\nlet _pendingAsyncCount = 0;\nlet _pendingAsyncResolvers: (() => void)[] = [];\n\nexport const trackPendingStart = () => {\n _pendingAsyncCount++;\n};\n\nexport const trackPendingEnd = () => {\n _pendingAsyncCount--;\n if (_pendingAsyncCount === 0) {\n const resolvers = _pendingAsyncResolvers;\n _pendingAsyncResolvers = [];\n for (const resolve of resolvers) resolve();\n }\n};\n\nexport const asyncSettled = async (timeout = 100) => {\n const deadline = Date.now() + timeout;\n\n while (true) {\n await settled();\n if (_pendingAsyncCount === 0) break;\n\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n throw new Error(\n `asyncSettled timed out: ${_pendingAsyncCount} reactive promises still pending after ${timeout}ms`,\n );\n }\n\n await Promise.race([\n new Promise<void>(resolve => _pendingAsyncResolvers.push(resolve)),\n new Promise<never>((_, reject) =>\n setTimeout(\n () =>\n reject(\n new Error(\n `asyncSettled timed out: ${_pendingAsyncCount} reactive promises still pending after ${timeout}ms`,\n ),\n ),\n remaining,\n ),\n ),\n ]);\n }\n};\n\nexport const batch = (fn: () => void) => {\n let resolve: () => void;\n const promise = new Promise<void>(r => (resolve = r));\n\n currentFlush = { promise, resolve: resolve! };\n\n fn();\n flushWatchers();\n};\n","import { scheduleAsyncPull, schedulePull } from './scheduling.js';\nimport { ReactiveSignal, isRelay, ReactiveFnState } from './reactive.js';\nimport { getCurrentConsumer } from './consumer.js';\nimport { Edge } from './edge.js';\n\nexport function dirtySignal(signal: ReactiveSignal<any, any>) {\n const prevState = signal._state;\n\n if (prevState === ReactiveFnState.Dirty) {\n return;\n }\n\n signal._state = ReactiveFnState.Dirty;\n\n if (prevState < ReactiveFnState.MaybeDirty) {\n propagateDirty(signal);\n }\n}\n\nfunction propagateDirty(signal: ReactiveSignal<any, any>) {\n if (getCurrentConsumer() === signal) {\n throw new Error(\n 'A signal was dirtied after it was consumed by the current function. This can cause race conditions and infinite rerenders and is not allowed.',\n );\n }\n\n if (isRelay(signal)) {\n if (signal.watchCount > 0) {\n scheduleAsyncPull(signal);\n }\n\n // else do nothing, only schedule if connected\n } else {\n if (signal._isListener && !signal._isSuspendedListener) {\n schedulePull(signal);\n }\n\n dirtySignalConsumers(signal.subs);\n signal.subs = new Map();\n }\n}\n\nexport function dirtySignalConsumers(map: Map<WeakRef<ReactiveSignal<any, any>>, Edge>) {\n for (const [subRef, edge] of map) {\n const sub = subRef.deref();\n\n if (sub === undefined || sub.computedCount !== edge.consumedAt) continue;\n\n const dirtyState = sub._state;\n\n switch (dirtyState) {\n case ReactiveFnState.Clean:\n sub._state = ReactiveFnState.MaybeDirty;\n sub.dirtyHead = edge;\n edge.nextDirty = undefined;\n propagateDirty(sub);\n break;\n\n case ReactiveFnState.Pending:\n case ReactiveFnState.MaybeDirty:\n case ReactiveFnState.PendingDirty: {\n let subEdge = sub.dirtyHead!;\n const ord = edge.ord;\n\n if (subEdge.ord > ord) {\n sub.dirtyHead = edge;\n edge.nextDirty = subEdge;\n\n if (dirtyState === ReactiveFnState.Pending || dirtyState === ReactiveFnState.PendingDirty) {\n // If the signal is pending, the first edge is the halt edge. If the\n // new dirty edge is BEFORE the halt edge, then it means that something\n // changed before the current halt, so we need to cancel the current computation\n // and recompute.\n sub._state = ReactiveFnState.MaybeDirty;\n propagateDirty(sub);\n }\n } else {\n let nextDirty = subEdge.nextDirty;\n\n while (nextDirty !== undefined && nextDirty.ord < ord) {\n subEdge = nextDirty;\n nextDirty = subEdge.nextDirty;\n }\n\n if (IS_DEV && edge === nextDirty) {\n throw new Error('Edge already inserted, this should not happen. Please open an issue on GitHub.');\n }\n\n edge.nextDirty = nextDirty;\n subEdge!.nextDirty = edge;\n }\n break;\n }\n }\n }\n}\n","import { ReactivePromiseImpl } from './async.js';\nimport type { ReactiveSignal } from './reactive.js';\n\nlet CURRENT_ORD = 0;\n\nexport const enum EdgeType {\n Signal = 0,\n Promise = 1,\n}\n\nexport interface EdgeTypeDep {\n [EdgeType.Signal]: ReactiveSignal<any, any>;\n [EdgeType.Promise]: ReactivePromiseImpl<any>;\n}\n\ninterface BaseEdge {\n type: EdgeType;\n dep: EdgeTypeDep[EdgeType];\n ord: number;\n updatedAt: number;\n consumedAt: number;\n\n nextDirty: Edge | undefined;\n}\n\nexport interface SignalEdge extends BaseEdge {\n type: EdgeType.Signal;\n dep: ReactiveSignal<any, any>;\n}\n\nexport interface PromiseEdge extends BaseEdge {\n type: EdgeType.Promise;\n dep: ReactivePromiseImpl<any>;\n}\n\nexport type Edge = SignalEdge | PromiseEdge;\n\nexport function createEdge<T extends EdgeType, R extends T extends EdgeType.Signal ? SignalEdge : PromiseEdge>(\n prevEdge: Edge | undefined,\n type: T,\n dep: EdgeTypeDep[T],\n updatedAt: number,\n consumedAt: number,\n): R {\n if (prevEdge === undefined) {\n return {\n type,\n dep,\n ord: CURRENT_ORD++,\n updatedAt,\n consumedAt,\n nextDirty: undefined,\n } as R;\n }\n\n prevEdge.ord = CURRENT_ORD++;\n prevEdge.updatedAt = updatedAt;\n prevEdge.consumedAt = consumedAt;\n prevEdge.nextDirty = undefined;\n return prevEdge as R;\n}\n\nexport function findAndRemoveDirty(\n sub: ReactiveSignal<any, any>,\n dep: ReactiveSignal<any, any> | ReactivePromiseImpl<any>,\n): Edge | undefined {\n let edge = sub.dirtyHead;\n\n if (edge === undefined) {\n return undefined;\n }\n\n if (edge.dep === dep) {\n sub.dirtyHead = edge.nextDirty;\n return edge;\n }\n\n let nextLink = edge.nextDirty;\n\n while (nextLink !== undefined) {\n if (nextLink.dep === dep) {\n edge.nextDirty = nextLink.nextDirty;\n return nextLink;\n }\n\n edge = nextLink;\n nextLink = edge.nextDirty;\n }\n\n return undefined;\n}\n","import { Equals } from '../../types.js';\n\nexport const DEFAULT_EQUALS: Equals<unknown> = (a, b) => a === b;\nexport const FALSE_EQUALS: Equals<unknown> = () => false;\n\nexport const equalsFrom = <T>(equals: Equals<T> | false | undefined): Equals<T> => {\n if (equals === false) {\n return FALSE_EQUALS;\n }\n\n return equals ?? DEFAULT_EQUALS;\n};\n","export const unreachable = (value: never) => {\n throw new Error(`Unreachable code: ${value}`);\n};\n\nconst GeneratorResultConstructor = (function* () {})().constructor;\n\nexport function isGeneratorResult(value: object): value is Generator {\n return value.constructor === GeneratorResultConstructor;\n}\n\nexport function isPromise(value: object): value is Promise<unknown> {\n return value.constructor === Promise;\n}\n\nexport function isThennable(value: unknown): value is Promise<unknown> {\n return value !== null && typeof value === 'object' && typeof (value as any).then === 'function';\n}\n","import { isReactivePromise } from './async.js';\nimport { getCurrentConsumer, setCurrentConsumer } from './consumer.js';\nimport { getInternalCurrentScope, setCurrentScope, SignalScope } from './contexts.js';\nimport { ReactiveSignal } from './reactive.js';\nimport { isPromise } from './utils/type-utils.js';\n\nexport function generatorResultToPromiseWithConsumer<T>(\n generator: Generator<any, T>,\n savedConsumer: ReactiveSignal<any, any> | undefined,\n): Promise<T> {\n function adopt(value: any) {\n return typeof value === 'object' && value !== null && (isPromise(value) || isReactivePromise(value))\n ? value\n : Promise.resolve(value);\n }\n\n return new Promise((resolve, reject) => {\n function step(fn: (value: any) => IteratorResult<any, any>, value?: any) {\n const prevConsumer = getCurrentConsumer();\n\n try {\n setCurrentConsumer(savedConsumer);\n const result = fn(value);\n if (result.done) {\n resolve(result.value);\n } else {\n adopt(result.value).then(fulfilled, rejected);\n }\n } catch (e) {\n reject(e);\n } finally {\n setCurrentConsumer(prevConsumer);\n }\n }\n\n const nextFn = generator.next.bind(generator);\n const throwFn = generator.throw.bind(generator);\n\n function fulfilled(value: any) {\n step(nextFn, value);\n }\n\n function rejected(value: any) {\n step(throwFn, value);\n }\n\n step(nextFn);\n });\n}\n\nexport function generatorResultToPromiseWithScope<T, Args extends unknown[]>(\n generator: Generator<any, T>,\n savedScope: SignalScope | undefined,\n): Promise<T> {\n function adopt(value: any) {\n return typeof value === 'object' && value !== null && (isPromise(value) || isReactivePromise(value))\n ? value\n : Promise.resolve(value);\n }\n\n return new Promise((resolve, reject) => {\n function step(fn: (value: any) => IteratorResult<any, any>, value?: any) {\n const prevScope = getInternalCurrentScope();\n\n try {\n setCurrentScope(savedScope);\n const result = fn(value);\n if (result.done) {\n resolve(result.value);\n } else {\n adopt(result.value).then(fulfilled, rejected);\n }\n } catch (e) {\n reject(e);\n } finally {\n setCurrentScope(prevScope);\n }\n }\n\n const nextFn = generator.next.bind(generator);\n const throwFn = generator.throw.bind(generator);\n\n function fulfilled(value: any) {\n step(nextFn, value);\n }\n\n function rejected(value: any) {\n step(throwFn, value);\n }\n\n step(nextFn);\n });\n}\n","import { getCurrentConsumer } from './consumer.js';\nimport { getCurrentScope, getInternalCurrentScope, setCurrentScope, SignalScope } from './contexts.js';\nimport { generatorResultToPromiseWithScope } from './generators.js';\nimport { isGeneratorResult } from './utils/type-utils.js';\n\nlet CURRENT_CALLBACK: Callback | undefined = undefined;\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport class Callback<T extends Function = Function> {\n scope: SignalScope;\n deps: unknown[] | undefined;\n _callbacks: Callback[] | undefined;\n fn!: T;\n\n constructor(fn: T, scope: SignalScope, deps?: unknown[]) {\n this.deps = deps;\n this.scope = scope;\n\n this.setFn(fn);\n }\n\n get callbacks() {\n return this._callbacks ?? (this._callbacks = []);\n }\n\n setFn(fn: T) {\n this.fn = ((...args: unknown[]) => {\n const scope = this.scope;\n const prevScope = getInternalCurrentScope();\n const prevCallback = CURRENT_CALLBACK;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n CURRENT_CALLBACK = this;\n setCurrentScope(scope);\n\n const result = fn(...args);\n\n return typeof result === 'object' && result !== null && isGeneratorResult(result)\n ? generatorResultToPromiseWithScope(result, scope)\n : result;\n } finally {\n CURRENT_CALLBACK = prevCallback;\n setCurrentScope(prevScope);\n }\n }) as unknown as T;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport function createCallback<T extends Function>(\n fn: T,\n scope: SignalScope,\n deps?: unknown[] | undefined,\n): Callback<T> {\n return new Callback(fn, scope, deps);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport function callback<T extends Function>(fn: T, idx: number, deps?: unknown[] | undefined): T {\n let callbacks: Callback[];\n\n if (CURRENT_CALLBACK !== undefined) {\n callbacks = CURRENT_CALLBACK.callbacks;\n } else {\n const currentConsumer = getCurrentConsumer();\n if (currentConsumer === undefined) {\n throw new Error('callback must be used within a reactive function, component, or nested callback');\n }\n\n callbacks = currentConsumer.callbacks ?? (currentConsumer.callbacks = []);\n }\n\n let callback = callbacks[idx];\n\n if (callback === undefined) {\n callback = callbacks[idx] = createCallback(fn, getCurrentScope(), deps);\n } else if (deps && callback.deps?.findIndex((dep, i) => dep !== deps[i]) !== -1) {\n callback.setFn(fn);\n callback.deps = deps as unknown[];\n }\n\n return callback.fn as T;\n}\n","import {\n ReactivePromise as IReactivePromise,\n ReactiveTask,\n Equals,\n ReactiveOptions,\n RelayActivate,\n RelayHooks,\n RelayState,\n} from '../types.js';\nimport { createReactiveSignal, ReactiveSignal, ReactiveDefinition, ReactiveFnState } from './reactive.js';\nimport { disconnectSignal, getSignal } from './get.js';\nimport { dirtySignal, dirtySignalConsumers } from './dirty.js';\nimport { scheduleAsyncPull, trackPendingStart, trackPendingEnd } from './scheduling.js';\nimport { createEdge, EdgeType, findAndRemoveDirty, PromiseEdge } from './edge.js';\nimport { SignalScope } from './contexts.js';\nimport { signal } from './signal.js';\nimport { DEFAULT_EQUALS, equalsFrom } from './utils/equals.js';\nimport { getCurrentConsumer } from './consumer.js';\nimport { createCallback } from './callback.js';\nimport { getTracerProxy, TracerEventType } from './trace.js';\n\nconst enum AsyncFlags {\n // ======= Notifiers ========\n\n Pending = 1,\n Rejected = 1 << 1,\n Resolved = 1 << 2,\n Ready = 1 << 3,\n\n Value = 1 << 4,\n Error = 1 << 5,\n\n // ======= Properties ========\n\n isRunnable = 1 << 6,\n isRelay = 1 << 7,\n\n // ======= Helpers ========\n\n Settled = Resolved | Rejected,\n}\n\ninterface PendingResolve<T> {\n ref: WeakRef<ReactiveSignal<unknown, unknown[]>> | undefined;\n edge: PromiseEdge | undefined;\n resolve: ((value: T) => void) | undefined | null;\n reject: ((error: unknown) => void) | undefined | null;\n}\n\nconst arrayFrom = Array.from;\n\nfunction isThenable(v: unknown): v is PromiseLike<unknown> {\n return v !== null && typeof v === 'object' && typeof (v as any).then === 'function';\n}\n\nfunction thenLoop(v: unknown, onFulfill: (value: unknown) => void, onReject: (reason: unknown) => void): void {\n if (isThenable(v)) {\n (v as PromiseLike<unknown>).then(onFulfill, onReject);\n } else {\n onFulfill(v);\n }\n}\n\nexport class ReactivePromiseImpl<T> implements IReactivePromise<T> {\n private _value: T | undefined = undefined;\n\n private _error: unknown | undefined = undefined;\n private _flags = AsyncFlags.Pending;\n\n private _signal: ReactiveSignal<any, any> | undefined = undefined;\n private _equals: Equals<T> = DEFAULT_EQUALS as Equals<T>;\n private _promise: Promise<T> | undefined;\n\n private _pending: PendingResolve<T>[] = [];\n\n private _stateSubs = new Map<WeakRef<ReactiveSignal<unknown, unknown[]>>, number>();\n _awaitSubs = new Map<WeakRef<ReactiveSignal<unknown, unknown[]>>, PromiseEdge>();\n\n _updatedCount = 0;\n\n // Version is not really needed in a pure signal world, but when integrating\n // with non-signal code, it's sometimes needed to entangle changes to the promise.\n // For example, in React we need to entangle each promise immediately after it\n // was used because we can't dynamically call hooks.\n private _version = signal(0);\n\n // Private but exposed for the ReactiveTask interface so we don't have to create a new\n // class and make all this code polypmorphic\n private run: ((...args: unknown[]) => ReactivePromiseImpl<T>) | undefined = undefined;\n\n constructor(executor?: (resolve: (value: T | PromiseLike<T>) => void, reject: (reason: unknown) => void) => void) {\n setReactivePromise(this);\n\n // If an executor is provided, behave like Promise constructor\n if (executor) {\n const resolve = (value: T | PromiseLike<T>) => {\n if (value && typeof (value as any).then === 'function') {\n this._setPromise(value as Promise<T>);\n } else {\n this._setValue(value as T);\n }\n };\n const reject = (reason: unknown) => {\n this._setError(reason);\n };\n try {\n executor(resolve, reject);\n } catch (e) {\n reject(e);\n }\n }\n }\n\n static all<T extends readonly unknown[] | []>(\n values: T,\n ): ReactivePromiseImpl<{ -readonly [P in keyof T]: Awaited<T[P]> }> {\n const p = new ReactivePromiseImpl();\n const arr = arrayFrom(values);\n const len = arr.length;\n if (len === 0) {\n p._setValue([] as any);\n return p as unknown as ReactivePromiseImpl<any>;\n }\n const results: unknown[] = new Array(len);\n let remaining = len;\n let rejected = false;\n const onFulfillAt = (i: number) => (v: unknown) => {\n if (rejected) return;\n results[i] = v;\n if (--remaining === 0) p._setValue(results as any);\n };\n const onReject = (r: unknown) => {\n if (rejected) return;\n rejected = true;\n p._setError(r);\n };\n for (let i = 0; i < len; i++) {\n thenLoop(arr[i], onFulfillAt(i), onReject);\n }\n return p as unknown as ReactivePromiseImpl<any>;\n }\n\n static race<T extends readonly unknown[] | []>(values: T): ReactivePromiseImpl<Awaited<T[number]>> {\n const p = new ReactivePromiseImpl();\n const arr = arrayFrom(values);\n const len = arr.length;\n if (len === 0) return p as unknown as ReactivePromiseImpl<any>;\n let settled = false;\n const onFulfill = (v: unknown) => {\n if (settled) return;\n settled = true;\n p._setValue(v as any);\n };\n const onReject = (r: unknown) => {\n if (settled) return;\n settled = true;\n p._setError(r);\n };\n for (let i = 0; i < len; i++) {\n thenLoop(arr[i], onFulfill, onReject);\n }\n return p as unknown as ReactivePromiseImpl<any>;\n }\n\n static any<T>(values: Iterable<T | PromiseLike<T>>): ReactivePromiseImpl<Awaited<T>>;\n static any<T extends readonly unknown[] | []>(values: T): ReactivePromiseImpl<Awaited<T[number]>> {\n const p = new ReactivePromiseImpl();\n const arr = arrayFrom(values);\n const len = arr.length;\n\n if (len === 0) {\n // Like native Promise.any([]): reject with AggregateError\n p._setError(new AggregateError([], 'No promises were provided to ReactivePromise.any'));\n return p as unknown as ReactivePromiseImpl<any>;\n }\n\n let pending = len;\n const errors: unknown[] = new Array(len);\n let fulfilled = false;\n\n const onFulfill = (value: unknown) => {\n if (fulfilled) return;\n fulfilled = true;\n p._setValue(value as any);\n };\n const onRejectAt = (index: number) => (reason: unknown) => {\n if (fulfilled) return;\n errors[index] = reason;\n if (--pending === 0) {\n p._setError(new AggregateError(errors, 'All promises were rejected in ReactivePromise.any'));\n }\n };\n\n for (let i = 0; i < len; i++) {\n thenLoop(arr[i], onFulfill, onRejectAt(i));\n }\n\n return p as unknown as ReactivePromiseImpl<any>;\n }\n\n static allSettled<T>(values: Iterable<T | PromiseLike<T>>): Promise<PromiseSettledResult<Awaited<T>>[]>;\n static allSettled<T extends readonly unknown[] | []>(\n values: T,\n ): Promise<{ -readonly [P in keyof T]: PromiseSettledResult<Awaited<T[P]>> }> {\n const p = new ReactivePromiseImpl();\n const arr = arrayFrom(values);\n const len = arr.length;\n\n if (len === 0) {\n p._setValue([] as any);\n return p as unknown as Promise<any>;\n }\n\n const results: PromiseSettledResult<unknown>[] = new Array(len);\n let remaining = len;\n\n const onFulfillAt = (index: number) => (value: unknown) => {\n results[index] = { status: 'fulfilled', value } as PromiseFulfilledResult<unknown>;\n if (--remaining === 0) p._setValue(results as any);\n };\n const onRejectAt = (index: number) => (reason: unknown) => {\n results[index] = { status: 'rejected', reason } as PromiseRejectedResult;\n if (--remaining === 0) p._setValue(results as any);\n };\n\n for (let i = 0; i < len; i++) {\n thenLoop(arr[i], onFulfillAt(i), onRejectAt(i));\n }\n\n return p as unknown as Promise<any>;\n }\n\n static resolve<T>(value: T): ReactivePromiseImpl<T> {\n if (value instanceof ReactivePromiseImpl) return value as unknown as ReactivePromiseImpl<T>;\n return new ReactivePromiseImpl<T>(resolve => resolve(value)) as unknown as ReactivePromiseImpl<T>;\n }\n\n static reject<T = never>(reason: any): ReactivePromiseImpl<T> {\n return new ReactivePromiseImpl<T>((_resolve, reject) => reject(reason)) as unknown as ReactivePromiseImpl<T>;\n }\n\n static withResolvers<T>() {\n const p = new ReactivePromiseImpl<T>();\n p._equals = DEFAULT_EQUALS as Equals<T>;\n p._initFlags(AsyncFlags.Pending);\n\n const resolve = (value: T | PromiseLike<T>) => {\n if (value && typeof (value as any).then === 'function') {\n p._setPromise(value as Promise<T>);\n } else {\n p._setValue(value as T);\n }\n };\n const reject = (reason: unknown) => {\n p._setError(reason);\n };\n\n return { promise: p as unknown as ReactivePromiseImpl<T>, resolve, reject } as const;\n }\n\n private _initFlags(baseFlags: number) {\n if (IS_DEV) {\n const tracer = getTracerProxy();\n if (tracer !== undefined && this._signal !== undefined && (baseFlags & AsyncFlags.Pending) !== 0) {\n tracer.emit({\n type: TracerEventType.StartLoading,\n id: this._signal.tracerMeta!.id,\n });\n }\n }\n\n if (baseFlags & AsyncFlags.Pending) {\n trackPendingStart();\n }\n\n this._flags = baseFlags;\n }\n\n private _consumeFlags(flags: number) {\n const currentConsumer = getCurrentConsumer();\n if (currentConsumer === undefined) return;\n\n if ((this._flags & AsyncFlags.isRelay) !== 0) {\n this._connect();\n }\n\n const ref = currentConsumer.ref;\n\n const subs = this._stateSubs;\n\n const subbedFlags = subs.get(ref) ?? 0;\n subs.set(ref, subbedFlags | flags);\n }\n\n private _connect() {\n const signal = this._signal as ReactiveSignal<any, any>;\n\n const currentConsumer = getCurrentConsumer();\n if (currentConsumer?.watchCount === 0) {\n const { ref, computedCount, deps } = currentConsumer;\n const prevEdge = deps.get(signal);\n\n if (prevEdge?.consumedAt !== computedCount) {\n const newEdge = createEdge(prevEdge, EdgeType.Signal, signal, signal.updatedCount, computedCount);\n\n signal.subs.set(ref, newEdge);\n deps.set(signal, newEdge);\n }\n } else {\n getSignal(signal);\n }\n }\n\n private _setFlags(setTrue: number, setFalse = 0, notify = 0) {\n const prevFlags = this._flags;\n\n const nextFlags = (prevFlags & ~setFalse) | setTrue;\n const allChanged = (prevFlags ^ nextFlags) | notify;\n\n this._flags = nextFlags;\n\n if (IS_LOCAL_DEV) {\n const pendingChanged = allChanged & AsyncFlags.Pending;\n if (pendingChanged) {\n if (nextFlags & AsyncFlags.Pending) {\n trackPendingStart();\n } else {\n trackPendingEnd();\n }\n }\n }\n\n if (allChanged === 0) {\n return;\n }\n\n if ((allChanged & (AsyncFlags.Value | AsyncFlags.Error)) !== 0) {\n this._updatedCount++;\n }\n\n const subs = this._stateSubs;\n\n for (const [signalRef, subbedFlags] of subs) {\n if ((subbedFlags & allChanged) !== 0) {\n const signal = signalRef.deref();\n\n if (signal) {\n dirtySignal(signal);\n }\n\n subs.delete(signalRef);\n }\n }\n\n this._version.update(v => v + 1);\n\n if (IS_DEV) {\n const tracer = getTracerProxy();\n if (tracer !== undefined && this._signal !== undefined) {\n if (setTrue & AsyncFlags.Pending && allChanged & AsyncFlags.Pending) {\n tracer.emit({\n type: TracerEventType.StartLoading,\n id: this._signal.tracerMeta!.id,\n });\n } else if (setFalse & AsyncFlags.Pending && allChanged & AsyncFlags.Pending) {\n tracer.emit({\n type: TracerEventType.EndLoading,\n id: this._signal.tracerMeta!.id,\n value: isRelay(this) ? '...' : this._value,\n });\n }\n }\n }\n }\n\n _getPending() {\n return (this._flags & AsyncFlags.Pending) !== 0;\n }\n\n _setPending() {\n if (this._getPending()) {\n return this._awaitSubs;\n }\n\n this._setFlags(AsyncFlags.Pending);\n\n // We need to dirty the consumers of the promise so that we insert the promise edge\n // into the dirty list of the consumers. This way, when the reactive function is\n // called again, it will see the promise edge and halt computation. This way we\n // ensure that we recompute the promises _in order_, without calling subsequent\n // dirty promises until the previous promise is resolved.\n dirtySignalConsumers(this._awaitSubs);\n return (this._awaitSubs = new Map());\n }\n\n _clearPending() {\n this._setValue(this._value!);\n }\n\n async _setPromise(promise: Promise<T>) {\n // Store the current promise so we can check if it's the same promise in the\n // then handlers. If it's not the same promise, it means that the promise has\n // been recomputed and replaced, so we should not update state.\n this._promise = promise;\n\n const flags = this._flags;\n let awaitSubs = this._awaitSubs;\n\n try {\n // If we were not already pending, we need to propagate the dirty state to any\n // consumers that were added since the promise was resolved last.\n if ((flags & AsyncFlags.Pending) === 0) {\n awaitSubs = this._setPending();\n }\n\n const nextValue = await promise;\n\n if (promise !== this._promise) {\n return;\n }\n\n this._setValue(nextValue, awaitSubs);\n } catch (nextError) {\n if (promise !== this._promise) {\n return;\n }\n\n this._setError(nextError, awaitSubs);\n }\n }\n\n private _setValue(nextValue: T, awaitSubs = this._awaitSubs) {\n let flags = this._flags;\n let value = this._value;\n\n let notifyFlags = 0;\n\n if ((flags & AsyncFlags.Ready) === 0 || this._equals(value!, nextValue) === false) {\n this._value = value = nextValue;\n notifyFlags = AsyncFlags.Value;\n }\n\n if (flags & AsyncFlags.Rejected) {\n notifyFlags = AsyncFlags.Error;\n this._error = undefined;\n }\n\n if ((flags & AsyncFlags.Pending) !== 0) {\n this._scheduleSubs(awaitSubs, notifyFlags !== 0);\n } else if (notifyFlags !== 0) {\n dirtySignalConsumers(awaitSubs);\n }\n\n this._awaitSubs = awaitSubs = new Map();\n\n this._setFlags(AsyncFlags.Resolved | AsyncFlags.Ready, AsyncFlags.Pending | AsyncFlags.Rejected, notifyFlags);\n\n const pending = this._pending;\n this._pending = [];\n\n const updatedAt = this._updatedCount;\n\n for (const { ref, edge, resolve } of pending) {\n resolve?.(value!);\n\n if (ref !== undefined) {\n edge!.updatedAt = updatedAt;\n awaitSubs.set(ref, edge!);\n }\n }\n\n const signal = this._signal;\n\n if (signal !== undefined) {\n disconnectSignal(signal);\n }\n }\n\n private _setError(nextError: unknown, awaitSubs = this._awaitSubs) {\n let error = this._error;\n\n let notifyFlags = 0;\n\n if (error !== nextError) {\n this._error = error = nextError;\n notifyFlags = AsyncFlags.Error;\n }\n\n if ((this._flags & AsyncFlags.Pending) !== 0) {\n this._scheduleSubs(awaitSubs, notifyFlags !== 0);\n } else if (notifyFlags !== 0) {\n dirtySignalConsumers(awaitSubs);\n }\n\n this._awaitSubs = awaitSubs = new Map();\n\n this._setFlags(AsyncFlags.Rejected, AsyncFlags.Pending | AsyncFlags.Resolved, notifyFlags);\n\n const pending = this._pending;\n this._pending = [];\n\n const updatedAt = this._updatedCount;\n\n for (const { ref, edge, reject } of pending) {\n reject?.(error);\n\n if (ref !== undefined) {\n edge!.updatedAt = updatedAt;\n awaitSubs.set(ref, edge!);\n }\n }\n\n const signal = this._signal;\n\n if (signal !== undefined) {\n disconnectSignal(signal);\n }\n }\n\n private _scheduleSubs(awaitSubs: Map<WeakRef<ReactiveSignal<unknown, unknown[]>>, PromiseEdge>, dirty: boolean) {\n /**\n * Await subscribers represent `await` statements, which is why they have a bit\n * of a different notification path in general. But this area in particular is\n * very nuanced.\n *\n * Basically, there are two places where an Await subscriber can be added:\n *\n * 1. `.then()` on the ReactivePromise, e.g. a real `await` statement\n * 2. `checkSignal` on a signal that is a dependency of the ReactivePromise\n *\n * In the first case, we're actually executing the parent function, so when it\n * halts on that `await` statement, it'll automatically start running again\n * when we resolve the promise. This is why we push that subscriber into `pending`,\n * because we don't need to notify that promise until the _next change_.\n *\n * In the second case, we're not actually executing the parent function, we're just\n * checking the signal's dependencies. So to continue \"executing\" the parent\n * function, we need to schedule it to continue where we left off.\n *\n * So the `_awaitSubs` map we're capturing here is _just_ the subscribers\n * added in the second case, which is why we schedule them eagerly.\n */\n const newState = dirty ? ReactiveFnState.Dirty : ReactiveFnState.PendingDirty;\n\n for (const ref of awaitSubs.keys()) {\n const signal = ref.deref();\n\n if (signal === undefined) {\n continue;\n }\n\n signal._state = newState;\n\n scheduleAsyncPull(signal);\n }\n }\n\n get value() {\n this._consumeFlags(AsyncFlags.Value);\n\n return this._value;\n }\n\n get error() {\n this._consumeFlags(AsyncFlags.Error);\n\n return this._error;\n }\n\n get isPending() {\n this._consumeFlags(AsyncFlags.Pending);\n\n return (this._flags & AsyncFlags.Pending) !== 0;\n }\n\n get isRejected() {\n this._consumeFlags(AsyncFlags.Rejected);\n\n return (this._flags & AsyncFlags.Rejected) !== 0;\n }\n\n get isResolved() {\n this._consumeFlags(AsyncFlags.Resolved);\n\n return (this._flags & AsyncFlags.Resolved) !== 0;\n }\n\n get isReady() {\n this._consumeFlags(AsyncFlags.Ready);\n\n return (this._flags & AsyncFlags.Ready) !== 0;\n }\n\n get isSettled() {\n this._consumeFlags(AsyncFlags.Settled);\n\n return (this._flags & AsyncFlags.Settled) !== 0;\n }\n\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n let flags = this._flags;\n\n // Create a new Promise that will be returned\n return new Promise<TResult1 | TResult2>((resolve, reject) => {\n let ref, edge;\n\n const currentConsumer = getCurrentConsumer();\n if (currentConsumer !== undefined) {\n if ((flags & AsyncFlags.isRelay) !== 0) {\n this._connect();\n flags = this._flags;\n }\n\n ref = currentConsumer.ref;\n\n const prevEdge =\n this._awaitSubs.get(ref!) ?? findAndRemoveDirty(currentConsumer, this as ReactivePromiseImpl<any>);\n\n edge = createEdge(\n prevEdge,\n EdgeType.Promise,\n this as ReactivePromiseImpl<any>,\n this._updatedCount,\n currentConsumer.computedCount,\n );\n }\n // Create wrapper functions that will call the original callbacks and then resolve/reject the new Promise\n const wrappedFulfilled = onfulfilled\n ? (value: T) => {\n try {\n const result = onfulfilled(value);\n resolve(result);\n } catch (error) {\n reject(error);\n }\n }\n : (resolve as unknown as (value: T) => void);\n\n const wrappedRejected = onrejected\n ? (reason: unknown) => {\n try {\n const result = onrejected(reason);\n resolve(result);\n } catch (error) {\n reject(error);\n }\n }\n : reject;\n\n if (flags & AsyncFlags.Pending) {\n this._pending.push({ ref, edge, resolve: wrappedFulfilled, reject: wrappedRejected });\n } else {\n if (flags & AsyncFlags.Resolved) {\n wrappedFulfilled(this._value!);\n } else if (flags & AsyncFlags.Rejected) {\n wrappedRejected(this._error);\n }\n\n if (ref) {\n this._awaitSubs.set(ref, edge!);\n }\n }\n });\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null,\n ): Promise<T | TResult> {\n return this.then(null, onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.then(\n value => {\n onfinally?.();\n return value;\n },\n reason => {\n onfinally?.();\n throw reason;\n },\n );\n }\n\n get [Symbol.toStringTag](): string {\n return `ReactivePromise`;\n }\n}\n\nconst REACTIVE_PROMISE_SET = new WeakSet<object>();\n\n/**\n * This is a utility function to mark a value as a ReactivePromise, primarily to enable _proxy_\n * wrapping of ReactivePromises to add additional functionality (see: Signalium Query)\n */\nexport function setReactivePromise(value: object) {\n REACTIVE_PROMISE_SET.add(value);\n}\n\nexport function isReactivePromise(value: object): value is ReactivePromiseImpl<unknown> {\n return REACTIVE_PROMISE_SET.has(value);\n}\n\nexport function isRelay<T>(obj: object): obj is ReactivePromiseImpl<T> {\n return isReactivePromise(obj) && (obj['_flags'] & AsyncFlags.isRelay) !== 0;\n}\n\nexport function createPromise<T>(promise: Promise<T>, signal: ReactiveSignal<T, unknown[]>) {\n const p = new ReactivePromiseImpl<T>();\n\n p['_signal'] = signal;\n p['_equals'] = signal.def.equals;\n p['_initFlags'](AsyncFlags.Pending);\n p['_setPromise'](promise);\n\n return p;\n}\n\nexport function createRelay<T>(activate: RelayActivate<T>, scope: SignalScope, opts?: ReactiveOptions<T, unknown[]>) {\n const p = new ReactivePromiseImpl<T>();\n\n let active = false;\n let currentSub: RelayHooks | (() => void) | undefined | void;\n\n const unsubscribe = () => {\n if (typeof currentSub === 'function') {\n currentSub();\n } else if (currentSub !== undefined) {\n currentSub.deactivate?.();\n }\n\n const signal = p['_signal'] as ReactiveSignal<any, any>;\n\n // Reset the signal state, preparing it for next activation\n signal.subs = new Map();\n signal._state = ReactiveFnState.Dirty;\n active = false;\n currentSub = undefined;\n };\n\n const state: RelayState<T> = {\n get isPending() {\n return (p['_flags'] & AsyncFlags.Pending) !== 0;\n },\n\n get value() {\n return p['_value'] as T;\n },\n\n set value(value: T) {\n p['_setValue'](value);\n },\n\n setPromise: (promise: Promise<T>) => {\n p['_setPromise'](promise);\n },\n\n setError: (error: unknown) => {\n p['_setError'](error);\n },\n };\n\n const def: ReactiveDefinition<() => void, unknown[]> = {\n compute: () => {\n if (active === false) {\n currentSub = activate(state);\n active = true;\n } else if (typeof currentSub === 'function' || currentSub === undefined) {\n currentSub?.();\n currentSub = activate(state);\n } else {\n currentSub.update?.();\n }\n\n return unsubscribe;\n },\n equals: DEFAULT_EQUALS,\n isRelay: true,\n paramKey: opts?.paramKey,\n id: opts?.id,\n desc: opts?.desc,\n tracer: undefined,\n };\n\n p['_signal'] = createReactiveSignal<() => void, unknown[]>(def, [], undefined, scope);\n\n p['_equals'] = equalsFrom(opts?.equals);\n p['_initFlags'](AsyncFlags.isRelay | AsyncFlags.Pending);\n\n return p;\n}\n\nexport function createTask<T, Args extends unknown[]>(\n task: (...args: Args) => Promise<T>,\n scope: SignalScope,\n opts?: ReactiveOptions<T, Args>,\n): ReactiveTask<T, Args> {\n const p = new ReactivePromiseImpl<T>();\n\n const { fn } = createCallback(task, scope);\n\n p['_equals'] = equalsFrom(opts?.equals);\n p['_initFlags'](AsyncFlags.isRunnable);\n\n const throwIfRunning = opts?.throwIfRunning === true;\n\n p['run'] = ((...args: Args) => {\n if (throwIfRunning && (p['_flags'] & AsyncFlags.Pending) !== 0) {\n throw new Error('Task is already running');\n }\n\n p._setPromise(fn(...args));\n\n return p;\n }) as any;\n\n return p as unknown as ReactiveTask<T, Args>;\n}\n\n// Type-cast to make sure we don't expose any internal properties\nexport const ReactivePromise = ReactivePromiseImpl;\n\n// Export the instance type separately to avoid the \"value used as type\" error\nexport type ReactivePromise<T> = IReactivePromise<T>;\n","import { ReactiveValue } from '../types.js';\nimport { createPromise, isReactivePromise, ReactivePromiseImpl } from './async.js';\nimport { getCurrentConsumer, setCurrentConsumer } from './consumer.js';\nimport { createEdge, Edge, EdgeType } from './edge.js';\nimport { generatorResultToPromiseWithConsumer } from './generators.js';\nimport { isRelay, ReactiveFnState, ReactiveSignal } from './reactive.js';\nimport { scheduleListeners, scheduleTracer } from './scheduling.js';\nimport { getTracerProxy, SignalType, TracerEventType } from './trace.js';\nimport { isGeneratorResult, isPromise } from './utils/type-utils.js';\nimport { unwatchSignal, watchSignal } from './watch.js';\n\nexport function getSignal<T, Args extends unknown[]>(signal: ReactiveSignal<T, Args>): ReactiveValue<T> {\n const currentConsumer = getCurrentConsumer();\n if (currentConsumer !== undefined) {\n const { ref, computedCount, deps } = currentConsumer;\n const prevEdge = deps.get(signal);\n\n const prevConsumedAt = prevEdge?.consumedAt;\n\n if (prevConsumedAt !== computedCount) {\n if (prevEdge === undefined) {\n if (IS_DEV) {\n getTracerProxy()?.emit({\n type: TracerEventType.Connected,\n id: currentConsumer.tracerMeta!.id,\n childId: signal.tracerMeta!.id,\n name: signal.tracerMeta!.desc,\n params: signal.tracerMeta!.params,\n nodeType: SignalType.Reactive,\n });\n }\n\n if (currentConsumer.watchCount > 0) {\n watchSignal(signal, currentConsumer._isSuspended);\n }\n }\n\n const updatedAt = checkSignal(signal);\n const newEdge = createEdge(prevEdge, EdgeType.Signal, signal, updatedAt, computedCount);\n\n signal.subs.set(ref, newEdge);\n deps.set(signal, newEdge);\n } else {\n const updatedAt = checkSignal(signal);\n\n if (prevEdge !== undefined) {\n prevEdge.updatedAt = updatedAt;\n }\n }\n } else {\n checkSignal(signal);\n }\n\n return signal._value as ReactiveValue<T>;\n}\n\nexport function checkSignal(signal: ReactiveSignal<any, any>): number {\n const { ref, _state: state } = signal;\n\n if (state < ReactiveFnState.Dirty) {\n return signal.updatedCount;\n }\n\n if (state >= ReactiveFnState.MaybeDirty) {\n let edge: Edge | undefined = signal.dirtyHead;\n\n while (edge !== undefined) {\n if (edge.type === EdgeType.Promise) {\n const dep = edge.dep;\n\n // If the dependency is pending, then we need to propagate the pending state to the\n // parent signal, and we halt the computation here.\n if (dep._getPending()) {\n const value = signal._value;\n\n // Add the signal to the awaitSubs map to be notified when the promise is resolved\n dep['_awaitSubs'].set(ref, edge);\n\n // Propagate the pending state to the parent signal\n (value as ReactivePromiseImpl<unknown>)._setPending();\n signal._state = ReactiveFnState.Pending;\n signal.dirtyHead = edge;\n\n // Early return to prevent the signal from being computed and to preserve the dirty state\n return signal.updatedCount;\n } else if (edge.updatedAt === edge.dep._updatedCount) {\n // Add the signal to the awaitSubs map as its still a dependency, just not dirty\n dep['_awaitSubs'].set(ref, edge);\n } else {\n signal.dirtyHead = edge.nextDirty;\n signal._state = ReactiveFnState.Dirty;\n break;\n }\n\n edge = edge.nextDirty;\n continue;\n }\n\n const dep = edge.dep;\n const updatedAt = checkSignal(dep);\n\n dep.subs.set(ref, edge);\n\n if (edge.updatedAt !== updatedAt) {\n signal.dirtyHead = edge.nextDirty;\n signal._state = ReactiveFnState.Dirty;\n break;\n }\n\n edge = edge.nextDirty;\n }\n }\n\n const newState = signal._state;\n\n // If the signal is dirty, we need to run it. This should always be checked\n // directly on the signal instance, because the state could have been changed\n // mid computation and not just through direct dependencies.\n if (newState === ReactiveFnState.Dirty) {\n if (signal._isLazy) {\n signal.updatedCount++;\n } else {\n runSignal(signal);\n }\n } else if (newState === ReactiveFnState.PendingDirty) {\n (signal._value as ReactivePromiseImpl<unknown>)._clearPending();\n }\n\n signal._state = ReactiveFnState.Clean;\n signal.dirtyHead = undefined;\n\n if (IS_DEV && getTracerProxy() !== undefined && signal.tracerMeta?.tracer) {\n scheduleTracer(signal.tracerMeta.tracer);\n }\n\n return signal.updatedCount;\n}\n\nexport function runSignal(signal: ReactiveSignal<any, any[]>) {\n let tracer: ReturnType<typeof getTracerProxy> | undefined;\n if (IS_DEV) {\n tracer = getTracerProxy();\n tracer?.emit({\n type: TracerEventType.StartUpdate,\n id: signal.tracerMeta!.id,\n });\n }\n\n const prevConsumer = getCurrentConsumer();\n\n const updatedCount = signal.updatedCount;\n const computedCount = ++signal.computedCount;\n\n try {\n setCurrentConsumer(signal);\n\n const initialized = updatedCount !== 0;\n const prevValue = signal._value;\n let nextValue = signal.def.compute(...signal.args);\n let valueIsPromise = false;\n\n if (nextValue !== null && typeof nextValue === 'object') {\n if (isGeneratorResult(nextValue)) {\n nextValue = generatorResultToPromiseWithConsumer(nextValue, signal);\n valueIsPromise = true;\n } else if (isPromise(nextValue)) {\n valueIsPromise = true;\n }\n }\n\n if (valueIsPromise) {\n if (prevValue !== null && typeof prevValue === 'object' && isReactivePromise(prevValue)) {\n // Update the AsyncSignal with the new promise. Since the value\n // returned from the function is the same AsyncSignal instance,\n // we don't need to increment the updatedCount, because the returned\n // value is the same. _setPromise will update the nested values on the\n // AsyncSignal instance, and consumers of those values will be notified\n // of the change through that.\n prevValue['_setPromise'](nextValue);\n } else {\n signal._value = createPromise(nextValue, signal);\n signal.updatedCount = updatedCount + 1;\n }\n } else {\n if (!initialized || !signal.def.equals(prevValue!, nextValue)) {\n signal._value = nextValue;\n // If the signal is lazy, we don't want to increment the updatedCount, it\n // has already been updated\n signal.updatedCount = signal._isLazy ? updatedCount : updatedCount + 1;\n }\n\n // Disconnect the signal from all its previous dependencies synchronously\n disconnectSignal(signal, computedCount);\n }\n } finally {\n setCurrentConsumer(prevConsumer);\n\n if (IS_DEV) {\n tracer?.emit({\n type: TracerEventType.EndUpdate,\n id: signal.tracerMeta!.id,\n value: isRelay(signal) ? '...' : signal._value,\n });\n }\n }\n}\n\nexport function disconnectSignal(signal: ReactiveSignal<any, any>, computedCount: number = signal.computedCount) {\n const { ref, deps, _isSuspended: isSuspended } = signal;\n\n for (const [dep, edge] of deps) {\n if (edge.consumedAt !== computedCount) {\n unwatchSignal(dep, isSuspended);\n dep.subs.delete(ref);\n deps.delete(dep);\n }\n }\n}\n\nexport function checkAndRunListeners(signal: ReactiveSignal<any, any>) {\n const listeners = signal.listeners;\n\n let updatedCount = checkSignal(signal);\n\n if (listeners !== null && listeners.updatedAt !== updatedCount) {\n listeners.updatedAt = updatedCount;\n\n scheduleListeners(signal);\n }\n\n return updatedCount;\n}\n","const { log, floor, imul, abs } = Math;\n\nfunction hashStr(key: string, seed = 0) {\n let h = seed ^ key.length;\n const c1 = 0xcc9e2d51;\n const c2 = 0x1b873593;\n let i = 0;\n // Process 2 UTF-16 code units (= 32 bits) at a time\n while (i + 2 <= key.length) {\n let k = (key.charCodeAt(i) & 0xffff) | ((key.charCodeAt(i + 1) & 0xffff) << 16);\n k = imul(k, c1);\n k = (k << 15) | (k >>> 17);\n k = imul(k, c2);\n h ^= k;\n h = (h << 13) | (h >>> 19);\n h = imul(h, 5) + 0xe6546b64;\n i += 2;\n }\n // Handle odd-length strings: one remaining UTF-16 code unit\n if (key.length & 1) {\n let k = key.charCodeAt(i) & 0xffff;\n k = imul(k, c1);\n k = (k << 15) | (k >>> 17);\n k = imul(k, c2);\n h ^= k;\n }\n h ^= key.length;\n h ^= h >>> 16;\n h = imul(h, 0x85ebca6b);\n h ^= h >>> 13;\n h = imul(h, 0xc2b2ae35);\n h ^= h >>> 16;\n return h >>> 0; // Convert to unsigned 32-bit integer\n}\n\nfunction hashNumber(num: number, seed = 0) {\n let h = num < 0 ? seed ^ 0x80000000 : seed;\n num = abs(num);\n const origNum = num;\n const c1 = 0xcc9e2d51;\n const c2 = 0x1b873593;\n\n // Process 4 bytes at a time\n while (num >= 0xffffffff) {\n // Extract the lowest 32 bits\n let k = num & 0xffffffff;\n num = floor(num / 0x100000000);\n\n k = imul(k, c1);\n k = (k << 15) | (k >>> 17);\n k = imul(k, c2);\n\n h ^= k;\n h = (h << 13) | (h >>> 19);\n h = imul(h, 5) + 0xe6546b64;\n }\n\n // Process the remaining bytes (up to 4 bytes)\n if (num > 0) {\n let k = num & 0xffffffff;\n k = imul(k, c1);\n k = (k << 15) | (k >>> 17);\n k = imul(k, c2);\n h ^= k;\n }\n\n // Mix in the byte-length of the original number\n const numBytes = origNum === 0 ? 1 : floor(log(origNum) / log(256)) + 1;\n\n h ^= numBytes;\n h ^= h >>> 16;\n h = imul(h, 0x85ebca6b);\n h ^= h >>> 13;\n h = imul(h, 0xc2b2ae35);\n h ^= h >>> 16;\n\n return h >>> 0; // Convert to unsigned 32-bit integer\n}\n\nfunction hashArray(arr: unknown[], seen: unknown[]) {\n let h = ARRAY;\n const c1 = 0xcc9e2d51;\n const c2 = 0x1b873593;\n\n // Process 4 bytes at a time\n for (const item of arr) {\n // Extract the lowest 32 bits\n let k = hashValue(item, seen);\n\n k = imul(k, c1);\n k = (k << 15) | (k >>> 17);\n k = imul(k, c2);\n\n h ^= k;\n h = (h << 13) | (h >>> 19);\n h = imul(h, 5) + 0xe6546b64;\n }\n\n h ^= arr.length;\n h ^= h >>> 16;\n h = imul(h, 0x85ebca6b);\n h ^= h >>> 13;\n h = imul(h, 0xc2b2ae35);\n h ^= h >>> 16;\n\n return h >>> 0; // Convert to unsigned 32-bit integer\n}\n\nfunction hashObject(obj: object, seen: unknown[]) {\n let sum = OBJECT;\n const keys = Object.keys(obj);\n\n for (const key of keys) {\n sum += imul(hashValue(key, seen), 0x9e3779b9) ^ hashValue((obj as any)[key], seen);\n }\n\n return sum >>> 0;\n}\n\nfunction hashSet(set: Set<unknown>, seen: unknown[]) {\n let sum = SET;\n for (const value of set) {\n sum += hashValue(value, seen);\n }\n return sum >>> 0;\n}\n\nfunction hashMap(map: Map<unknown, unknown>, seen: unknown[]) {\n let sum = MAP;\n\n for (const [key, value] of map) {\n sum += imul(hashValue(key, seen), 0x9e3779b9) ^ hashValue(value, seen);\n }\n\n return sum >>> 0;\n}\n\nfunction hashDate(date: Date, _seen: unknown[]) {\n return hashNumber(date.getTime(), HashType.DATE);\n}\n\nfunction hashRegExp(regexp: RegExp, _seen: unknown[]) {\n const h = hashStr(regexp.source + regexp.flags, HashType.REGEXP);\n return (h ^ regexp.lastIndex) >>> 0;\n}\n\nconst enum HashType {\n UNDEFINED = 0,\n NULL = 1,\n TRUE = 2,\n FALSE = 3,\n NUMBER = 4,\n STRING = 5,\n BIGINT = 6,\n ARRAY = 7,\n OBJECT = 8,\n REFERENCE = 9,\n SYMBOL = 10,\n CYCLE = 11,\n MAP = 12,\n SET = 13,\n DATE = 14,\n REGEXP = 15,\n}\n\nconst UNDEFINED = hashStr('undefined', HashType.UNDEFINED);\nconst NULL = hashStr('null', HashType.NULL);\nconst TRUE = hashStr('true', HashType.TRUE);\nconst FALSE = hashStr('false', HashType.FALSE);\nconst ARRAY = hashStr('array', HashType.ARRAY);\nconst OBJECT = hashStr('object', HashType.OBJECT);\nconst SET = hashStr('set', HashType.SET);\nconst MAP = hashStr('map', HashType.MAP);\n\nconst getObjectProto = Object.getPrototypeOf;\n\nconst PROTO_TO_HASH = new Map<object, (obj: any, seen: unknown[]) => number>([\n [Object.prototype, hashObject],\n [Array.prototype, hashArray],\n [Map.prototype, hashMap],\n [Set.prototype, hashSet],\n [Date.prototype, hashDate],\n [RegExp.prototype, hashRegExp],\n]);\n\nexport const registerCustomHash = <T>(ctor: new (...args: any[]) => T, hashFn: (obj: T) => number) => {\n PROTO_TO_HASH.set(ctor.prototype, (obj, _seen) => hashFn(obj));\n};\n\nexport function hashValue(node: unknown, seen: unknown[] = []) {\n switch (typeof node) {\n case 'undefined':\n return UNDEFINED;\n case 'boolean':\n return node ? TRUE : FALSE;\n case 'number':\n return hashStr(String(node), HashType.NUMBER);\n case 'string':\n return hashStr(node, HashType.STRING);\n case 'bigint':\n return hashStr(node.toString(), HashType.BIGINT);\n case 'object': {\n if (node === null) {\n return NULL;\n }\n\n const index = seen.indexOf(node);\n if (index !== -1) {\n return hashStr(String(index), HashType.CYCLE);\n }\n\n const hashFn = PROTO_TO_HASH.get(getObjectProto(node));\n\n if (hashFn) {\n seen.push(node);\n const hash = hashFn(node, seen);\n seen.pop();\n return hash;\n }\n\n return getObjectHash(node);\n }\n case 'function':\n return getObjectHash(node);\n case 'symbol':\n return hashStr(node.toString(), HashType.SYMBOL);\n }\n}\n\nconst objectToHashMap = new WeakMap<object, number>();\nlet nextHashMapId = 1;\n\nexport function getObjectHash(obj: object): number {\n let id = objectToHashMap.get(obj);\n if (id === undefined) {\n id = hashNumber(nextHashMapId++, HashType.REFERENCE);\n objectToHashMap.set(obj, id);\n }\n return id;\n}\n\nconst EMPTY_ARRAY_HASH = hashArray([], []);\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport function hashReactiveFn(fn: Function, args: unknown[]) {\n const argsHash = args.length > 0 ? hashArray(args, []) : EMPTY_ARRAY_HASH;\n // Mix argsHash into fnHash using a single MurmurHash3 block round,\n // avoiding the XOR cancellation that occurs when fnHash === argsHash.\n let k = imul(argsHash, 0xcc9e2d51);\n k = (k << 15) | (k >>> 17);\n k = imul(k, 0x1b873593);\n let h = getObjectHash(fn);\n h ^= k;\n h = (h << 13) | (h >>> 19);\n return (imul(h, 5) + 0xe6546b64) >>> 0;\n}\n","import WeakRef from './weakref.js';\nimport { Tracer, getTracerProxy, TracerMeta } from './trace.js';\nimport { ReactiveValue, Equals, ReactiveOptions } from '../types.js';\nimport { getUnknownSignalFnName } from './utils/debug-name.js';\nimport { SignalScope } from './contexts.js';\nimport { getSignal } from './get.js';\nimport { Edge } from './edge.js';\nimport { cancelPull, schedulePull } from './scheduling.js';\nimport { hashValue } from './utils/hash.js';\nimport { stringifyValue } from './utils/stringify.js';\nimport { Callback } from './callback.js';\nimport { resumeSignal, suspendSignal, unwatchSignal, watchSignal } from './watch.js';\nimport { equalsFrom } from './utils/equals.js';\nimport { dirtySignal } from './dirty.js';\n\n/**\n * This file contains computed signal base types and struct definitions.\n *\n * Computed signals are monomorphic to make them more efficient, but this also\n * means that multiple fields differ based on the type of the signal. Defining\n * them using this pattern rather than a class allows us to switch on the `type`\n * field to get strong typing in branches everywhere else.\n *\n * \"Methods\" for this struct are defined in other files for better organization.\n */\n\nexport type SignalId = number;\n\nexport const enum ReactiveFnState {\n Clean = 0,\n Pending = 1,\n Dirty = 2,\n MaybeDirty = 3,\n PendingDirty = 4,\n}\n\nexport const enum ReactiveFnFlags {\n // State\n State = 0b111,\n\n // Properties\n isRelay = 0b1000,\n isListener = 0b10000,\n isSuspendedListener = 0b100000,\n isActive = 0b1000000,\n isLazy = 0b10000000,\n}\n\nlet ID = 0;\n\ninterface ListenerMeta {\n updatedAt: number;\n current: Map<() => void, () => void>;\n\n // Cached bound add method to avoid creating a new one on each call, this is\n // specifically for React hooks where useSyncExternalStore will resubscribe each\n // time if the method is not cached. This prevents us from having to add a\n // useCallback for the listener.\n cachedBoundAdd: (listener: () => void) => () => void;\n}\n\n/**\n * Shared definition for derived signals to reduce memory usage.\n * Contains configuration that's common across all instances of a reactive function.\n */\nexport interface ReactiveDefinition<T, Args extends unknown[]> extends ReactiveOptions<T, Args> {\n compute: (...args: Args) => T;\n equals: Equals<T>;\n isRelay: boolean;\n tracer: Tracer | undefined;\n}\n\n/**\n * Unified way to create a reactive definition (protects shaping)\n */\nexport function createReactiveDefinition<T, Args extends unknown[]>(\n id: string | undefined,\n desc: string | undefined,\n compute: (...args: Args) => T,\n equals: Equals<T> | false | undefined,\n isRelay: boolean,\n paramKey: ((...args: Args) => string | number) | undefined,\n tracer: Tracer | undefined,\n): ReactiveDefinition<T, Args> {\n return {\n id,\n desc,\n compute,\n equals: equalsFrom(equals),\n isRelay,\n paramKey,\n tracer,\n };\n}\n\nexport class ReactiveSignal<T, Args extends unknown[]> {\n // Bitmask containing state in the first 2 bits and boolean properties in the remaining bits\n private flags: number;\n scope: SignalScope | undefined = undefined;\n\n id = ++ID;\n\n subs = new Map<WeakRef<ReactiveSignal<any, any>>, Edge>();\n deps = new Map<ReactiveSignal<any, any>, Edge>();\n\n ref: WeakRef<ReactiveSignal<T, Args>> = new WeakRef(this);\n\n dirtyHead: Edge | undefined = undefined;\n\n updatedCount: number = 0;\n computedCount: number = 0;\n\n watchCount: number = 0;\n suspendCount: number = 0;\n\n key: SignalId | undefined;\n args: Args;\n callbacks: Callback[] | undefined = undefined;\n\n _listeners: ListenerMeta | null = null;\n _value: ReactiveValue<T> | undefined = undefined;\n\n tracerMeta?: TracerMeta;\n\n // Reference to the shared definition\n def: ReactiveDefinition<T, Args>;\n\n constructor(def: ReactiveDefinition<T, Args>, args: Args, key?: SignalId, scope?: SignalScope) {\n this.flags = (def.isRelay ? ReactiveFnFlags.isRelay : 0) | ReactiveFnState.Dirty;\n this.scope = scope;\n this.key = key;\n this.args = args;\n this.def = def;\n\n if (IS_DEV) {\n this.tracerMeta = {\n id: def.id ?? key ?? hashValue([def.compute, ID++]),\n desc: def.desc ?? def.compute.name ?? getUnknownSignalFnName(def.compute),\n params: args.map(arg => stringifyValue(arg)).join(', '),\n tracer: def.tracer,\n };\n }\n }\n\n get _state() {\n return this.flags & ReactiveFnFlags.State;\n }\n\n set _state(state: ReactiveFnState) {\n this.flags = (this.flags & ~ReactiveFnFlags.State) | state;\n }\n\n get _isListener() {\n return (this.flags & ReactiveFnFlags.isListener) !== 0;\n }\n\n get _isSuspendedListener() {\n return (this.flags & ReactiveFnFlags.isSuspendedListener) !== 0;\n }\n\n get _isSuspended() {\n const { watchCount, suspendCount } = this;\n return watchCount > 0 && watchCount === suspendCount;\n }\n\n get _isActive() {\n return (this.flags & ReactiveFnFlags.isActive) !== 0;\n }\n\n set _isActive(isActive: boolean) {\n if (isActive) {\n this.flags |= ReactiveFnFlags.isActive;\n } else {\n this.flags &= ~ReactiveFnFlags.isActive;\n }\n }\n\n get _isLazy() {\n return (this.flags & ReactiveFnFlags.isLazy) !== 0;\n }\n\n set _isLazy(isLazy: boolean) {\n if (isLazy) {\n this.flags |= ReactiveFnFlags.isLazy;\n } else {\n this.flags &= ~ReactiveFnFlags.isLazy;\n }\n }\n\n get listeners() {\n return (\n this._listeners ??\n (this._listeners = {\n updatedAt: 0,\n current: new Map(),\n cachedBoundAdd: this.addListener.bind(this),\n })\n );\n }\n\n get value() {\n return getSignal(this);\n }\n\n addListener(listener: () => void, opts?: { skipInitial?: boolean }) {\n const { current } = this.listeners;\n\n if (!current.has(listener)) {\n let effective = listener;\n\n if (opts?.skipInitial) {\n let initial = true;\n effective = () => {\n if (initial) {\n initial = false;\n return;\n }\n listener();\n };\n }\n\n if (!this._isListener) {\n watchSignal(this, this._isSuspended);\n this.flags |= ReactiveFnFlags.isListener;\n }\n\n schedulePull(this);\n\n current.set(listener, effective);\n }\n\n return () => {\n if (current.has(listener)) {\n current.delete(listener);\n\n if (current.size === 0) {\n cancelPull(this);\n unwatchSignal(this, this._isSuspended);\n this.flags &= ~ReactiveFnFlags.isListener;\n this.listeners.updatedAt = 0;\n }\n }\n };\n }\n\n // This method is used in React hooks specifically. It returns a bound add method\n // that is cached to avoid creating a new one on each call, and it eagerly sets\n // the listener as watched so that relays that are accessed will be activated.\n addListenerLazy() {\n if (!this._isListener) {\n watchSignal(this, this._isSuspended);\n this.flags |= ReactiveFnFlags.isListener;\n }\n\n return this.listeners.cachedBoundAdd;\n }\n\n setSuspended(suspended: boolean) {\n const { flags } = this;\n const isListener = (flags & ReactiveFnFlags.isListener) !== 0;\n const isSuspendedListener = (flags & ReactiveFnFlags.isSuspendedListener) !== 0;\n\n if (suspended && !isSuspendedListener) {\n this.flags = flags | ReactiveFnFlags.isSuspendedListener;\n\n if (isListener) {\n suspendSignal(this);\n }\n } else if (!suspended && isSuspendedListener) {\n this.flags = flags & ~ReactiveFnFlags.isSuspendedListener;\n\n if (isListener) {\n resumeSignal(this);\n }\n }\n }\n\n reset() {\n this.flags = (this.def.isRelay ? ReactiveFnFlags.isRelay : 0) | ReactiveFnState.Dirty;\n this.dirtyHead = undefined;\n this.updatedCount = 0;\n this.computedCount = 0;\n this.deps = new Map();\n this.subs = new Map();\n this.watchCount = 0;\n this.suspendCount = 0;\n }\n}\n\nexport const runListeners = (signal: ReactiveSignal<any, any>) => {\n const { listeners } = signal;\n\n if (listeners === null) {\n return;\n }\n\n const { current } = listeners;\n\n for (const listener of current.values()) {\n listener();\n }\n};\n\nexport const isRelay = (signal: ReactiveSignal<any, any>): boolean => {\n return (signal['flags'] & ReactiveFnFlags.isRelay) !== 0;\n};\n\nexport function createReactiveSignal<T, Args extends unknown[]>(\n def: ReactiveDefinition<T, Args>,\n args: Args = [] as any,\n key?: SignalId,\n scope?: SignalScope,\n): ReactiveSignal<T, Args> {\n return new ReactiveSignal(def, args, key, scope);\n}\n","import { ReactiveSignal, ReactiveDefinition, createReactiveSignal } from './reactive.js';\nimport { hashReactiveFn, hashValue } from './utils/hash.js';\nimport { scheduleGcSweep } from './scheduling.js';\nimport { getCurrentConsumer } from './consumer.js';\nimport { Context } from '../types.js';\nimport { dirtySignal } from './dirty.js';\n\n// ======= Contexts =======\n\nexport type ContextPair<T extends unknown[]> = {\n [K in keyof T]: [Context<T[K]>, NoInfer<T[K]>];\n};\n\nlet CONTEXT_ID = 0;\n\nexport class ContextImpl<T> {\n _key: symbol;\n _description: string;\n\n constructor(\n public readonly defaultValue: T,\n desc?: string,\n ) {\n this._description = desc ?? `context:${CONTEXT_ID++}`;\n this._key = Symbol(this._description);\n }\n}\n\nexport const context = <T>(initialValue: T, description?: string): Context<T> => {\n return new ContextImpl(initialValue, description);\n};\n\nexport function withContexts<C extends unknown[], U>(contexts: [...ContextPair<C>], fn: () => U): U {\n const prevScope = CURRENT_SCOPE;\n const currentScope = getCurrentScope();\n\n try {\n CURRENT_SCOPE = currentScope.getChild(contexts as [ContextImpl<unknown>, unknown][]);\n return fn();\n } finally {\n CURRENT_SCOPE = prevScope;\n }\n}\n\nexport const getContext = <T>(context: Context<T>): T => {\n const scope = CURRENT_SCOPE ?? getCurrentConsumer()?.scope;\n\n if (scope === undefined) {\n throw new Error(\n 'getContext must be used within a reactive function, a withContext, or within a framework-specific context provider.',\n );\n }\n\n return scope.getContext(context) ?? (context as unknown as ContextImpl<T>).defaultValue;\n};\n\n// ======= Signal Scope =======\n\nexport class SignalScope {\n private parentScope?: SignalScope;\n\n constructor(contexts: [ContextImpl<unknown>, unknown][], parent?: SignalScope) {\n this.parentScope = parent;\n this.contexts = Object.create(parent?.contexts || null);\n\n this.setContexts(contexts);\n }\n\n private contexts: Record<symbol, unknown>;\n private children = new Map<number, SignalScope>();\n private signals = new Map<number, ReactiveSignal<any, any>>();\n private gcCandidates = new Set<ReactiveSignal<any, any>>();\n\n setContexts(contexts: [ContextImpl<unknown>, unknown][]) {\n for (const [context, value] of contexts) {\n this.contexts[context._key] = value;\n\n if (typeof value === 'object' && value !== null) {\n SCOPE_OWNER_MAP.set(value, this);\n }\n }\n\n this.signals.clear();\n }\n\n getChild(contexts: [ContextImpl<unknown>, unknown][]) {\n const key = hashValue(contexts);\n\n let child = this.children.get(key);\n\n if (child === undefined) {\n child = new SignalScope(contexts, this);\n this.children.set(key, child);\n }\n\n return child;\n }\n\n getContext<T>(_context: Context<T>): T | undefined {\n const context = _context as unknown as ContextImpl<T>;\n\n return this.contexts[context._key] as T | undefined;\n }\n\n get<T, Args extends unknown[]>(def: ReactiveDefinition<T, Args>, args: Args): ReactiveSignal<T, Args> {\n const paramKey = def.paramKey?.(...args);\n const key = hashReactiveFn(def.compute, paramKey ? [paramKey] : args);\n let signal = this.signals.get(key) as ReactiveSignal<T, Args> | undefined;\n\n if (signal === undefined) {\n signal = createReactiveSignal(def, args, key, this);\n this.signals.set(key, signal);\n }\n\n return signal;\n }\n\n markForGc(signal: ReactiveSignal<any, any>) {\n if (!this.gcCandidates.has(signal)) {\n this.gcCandidates.add(signal);\n scheduleGcSweep(this);\n }\n }\n\n removeFromGc(signal: ReactiveSignal<any, any>) {\n this.gcCandidates.delete(signal);\n\n const { key } = signal;\n\n // if the signal has a key, add it back to the signals map so we can re-use it\n if (key) {\n this.signals.set(key, signal);\n }\n }\n\n forceGc(signal: ReactiveSignal<any, any>) {\n this.signals.delete(signal.key!);\n }\n\n sweepGc() {\n const signals = this.signals;\n\n for (const signal of this.gcCandidates) {\n if (signal.watchCount === 0) {\n signals.delete(signal.key!);\n }\n }\n\n this.gcCandidates = new Set();\n }\n}\n\nlet GLOBAL_SCOPE = new SignalScope([]);\n\nexport const getGlobalScope = () => {\n return GLOBAL_SCOPE;\n};\n\nexport function setGlobalContexts<C extends unknown[], U>(contexts: [...ContextPair<C>]): void {\n GLOBAL_SCOPE.setContexts(contexts as [ContextImpl<unknown>, unknown][]);\n}\n\nexport const clearGlobalContexts = () => {\n GLOBAL_SCOPE = new SignalScope([]);\n};\n\nlet CURRENT_SCOPE: SignalScope | undefined;\n\nexport const setCurrentScope = (scope: SignalScope | undefined) => {\n CURRENT_SCOPE = scope;\n};\n\nexport const getInternalCurrentScope = () => {\n return CURRENT_SCOPE;\n};\n\nexport const getCurrentScope = (fallback = GLOBAL_SCOPE): SignalScope => {\n return CURRENT_SCOPE ?? getCurrentConsumer()?.scope ?? fallback;\n};\n\n// ======= Owner =======\n\nconst SCOPE_OWNER_MAP = new WeakMap<object, SignalScope>();\nconst OWNER_CHILD_MAP = new WeakMap<object, object>();\n\nexport const setScopeOwner = (obj: object, ownerObject: object) => {\n if (OWNER_CHILD_MAP.has(obj)) {\n throw new Error('Object already has a scope owner, owners cannot be dynamic');\n }\n\n OWNER_CHILD_MAP.set(obj, ownerObject);\n};\n\nconst reifyScopeOwner = (obj: object): SignalScope => {\n const owner = OWNER_CHILD_MAP.get(obj);\n\n if (!owner) {\n throw new Error('Object has no scope owner, reactiveMethod must be attached to an owned context object');\n }\n\n const scope = SCOPE_OWNER_MAP.get(owner) ?? reifyScopeOwner(owner);\n\n SCOPE_OWNER_MAP.set(obj, scope);\n\n return scope;\n};\n\nexport const getScopeOwner = (obj: object): SignalScope => {\n let scope = SCOPE_OWNER_MAP.get(obj);\n\n if (!scope) {\n scope = reifyScopeOwner(obj);\n }\n\n return scope;\n};\n\n// ======= Test Helper =======\n\nexport function forceGc(_signal: object) {\n const signal = _signal as ReactiveSignal<any, any>;\n signal.scope?.forceGc(signal);\n}\n"],"names":["runListeners","signal","FALSE_EQUALS","_scheduleFlush","scope","runBatch","runDerivedListeners","runStateListeners","EdgeType","callback","settled","isRelay","dep","ReactiveFnState","WeakRef","context"],"mappings":";;AAAA,MAAM,gBAAmC;AAAA,EACvC,YAAoB,OAAU;AAAV,SAAA,QAAA;AAAA,EAAW;AAAA,EAE/B,QAAW;AACT,WAAO,KAAK;AAAA,EACd;AACF;AAEA,MAAA,YAAe,OAAO,YAAY,aAAa,UAAW;ACN1D,IAAI;AAQG,MAAM,qBAAqB,CAAC,aAAmD;AACpF,qBAAmB;AACrB;AAEO,MAAM,qBAAqB,MAAM;AACtC,SAAO;AACT;ACTA,IAAI,WAAW;AAER,MAAM,YAAoC;AAAA,EACvC;AAAA,EACA;AAAA,EACA,4BAAY,IAAA;AAAA,EACpB;AAAA,EACA;AAAA,EAEQ,aAAqC;AAAA,EAE7C,YAAY,OAAU,SAAoB,CAAC,GAAG,MAAM,MAAM,GAAG,OAAe,UAAU;AACpF,SAAK,SAAS;AACd,SAAK,UAAU;AACf,SAAK,MAAM;AACX,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,IAAI,QAAW;AACb,SAAK,QAAA;AAEL,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAO,IAAqB;AAC1B,SAAK,QAAQ,GAAG,KAAK,MAAM;AAAA,EAC7B;AAAA,EAEA,IAAI,MAAM,OAAU;AAClB,QAAI,KAAK,QAAQ,OAAO,KAAK,MAAM,GAAG;AACpC;AAAA,IACF;AAEA,SAAK,SAAS;AAEd,SAAK,OAAA;AAAA,EACP;AAAA,EAEA,UAAgB;AACd,UAAM,kBAAkB,mBAAA;AACxB,QAAI,oBAAoB,QAAW;AAcjC,WAAK,MAAM,IAAI,gBAAgB,KAAK,gBAAgB,aAAa;AAAA,IACnE;AAAA,EACF;AAAA,EAEA,SAAe;AACb,UAAM,EAAE,OAAO,KAAA,IAAS;AAExB,eAAW,CAAC,QAAQ,UAAU,KAAK,KAAK,WAAW;AACjD,YAAM,MAAM,OAAO,MAAA;AAEnB,UAAI,QAAQ,UAAa,eAAe,IAAI,eAAe;AACzD;AAAA,MACF;AAEA,kBAAY,GAAG;AAAA,IACjB;AAEA,SAAK,4BAAY,IAAA;AAEjB,sBAAkB,IAAI;AAAA,EACxB;AAAA,EAEA,YAAY,UAAkC;AAC5C,QAAI,YAAY,KAAK;AAErB,QAAI,cAAc,MAAM;AACtB,WAAK,aAAa,YAAY,oBAAI,IAAA;AAAA,IACpC;AAEA,cAAU,IAAI,QAAQ;AAEtB,WAAO,MAAM,UAAU,OAAO,QAAQ;AAAA,EACxC;AACF;AAEO,SAASA,eAAaC,SAA0B;AACrD,QAAM,YAAYA,QAAO,YAAY;AAErC,MAAI,cAAc,MAAM;AACtB;AAAA,EACF;AAEA,aAAW,YAAY,WAAW;AAChC,aAAA;AAAA,EACF;AACF;AAEA,MAAMC,iBAAgC,MAAM;AAErC,SAAS,OAAU,cAAiB,MAAoC;AAC7E,QAAM,SAAS,MAAM,WAAW,QAAQA,iBAAgB,MAAM,WAAW,CAAC,GAAG,MAAM,MAAM;AAEzF,SAAO,IAAI,YAAY,cAAc,QAAQ,MAAM,IAAI;AACzD;AAEO,MAAM,WAAW,CAAC,SAAoC;AAC3D,SAAO,IAAI,YAAY,QAAWA,gBAAc,MAAM,IAAI;AAC5D;AClHO,SAAS,YAAYD,SAAkC,mBAAkC;AAC9F,MAAI,mBAAmB;AACrB,yBAAqBA,OAAM;AAAA,EAC7B,OAAO;AACL,sBAAkBA,OAAM;AAAA,EAC1B;AACF;AAEO,SAAS,cAAcA,SAAkC,mBAAkC;AAChG,MAAI,mBAAmB;AACrB,2BAAuBA,OAAM;AAAA,EAC/B,OAAO;AACL,wBAAoBA,OAAM;AAAA,EAC5B;AACF;AAEA,SAAS,kBAAkBA,SAAwC;AACjE,QAAM,EAAE,eAAeA;AACvB,QAAM,gBAAgB,aAAa;AAEnC,EAAAA,QAAO,aAAa;AACpB,mBAAiBA,OAAM;AAEvB,MAAIA,QAAO,WAAW;AACpB;AAAA,EACF;AAEA,aAAW,OAAOA,QAAO,KAAK,KAAA,GAAQ;AACpC,sBAAkB,GAAG;AAAA,EACvB;AAEA,iBAAeA,OAAM;AACvB;AAEA,SAAS,oBAAoBA,SAAkC;AAC7D,QAAM,EAAE,eAAeA;AACvB,QAAM,gBAAgB,KAAK,IAAI,aAAa,GAAG,CAAC;AAEhD,EAAAA,QAAO,aAAa;AAEpB,MAAI,kBAAkB,GAAG;AACvB,uBAAmBA,OAAM;AAAA,EAC3B;AACF;AAEA,SAAS,qBAAqBA,SAAwC;AACpE,QAAM,EAAE,YAAY,aAAA,IAAiBA;AAErC,QAAM,gBAAgB,aAAa;AACnC,QAAM,kBAAkB,eAAe;AAEvC,EAAAA,QAAO,aAAa;AACpB,EAAAA,QAAO,eAAe;AAEtB,mBAAiBA,OAAM;AAMvB,MAAI,eAAe,GAAG;AACpB,eAAW,OAAOA,QAAO,KAAK,KAAA,GAAQ;AACpC,2BAAqB,GAAG;AAAA,IAC1B;AAAA,EACF;AACF;AAEA,SAAS,uBAAuBA,SAAwC;AACtE,QAAM,EAAE,YAAY,aAAA,IAAiBA;AAErC,QAAM,gBAAgB,KAAK,IAAI,aAAa,GAAG,CAAC;AAChD,QAAM,kBAAkB,KAAK,IAAI,eAAe,GAAG,CAAC;AAEpD,EAAAA,QAAO,aAAa;AACpB,EAAAA,QAAO,eAAe;AAItB,MAAI,kBAAkB,GAAG;AACvB,uBAAmBA,OAAM;AAAA,EAC3B;AACF;AAEO,SAAS,aAAaA,SAAwC;AACnE,QAAM,EAAE,YAAY,aAAA,IAAiBA;AACrC,QAAM,kBAAkB,KAAK,IAAI,eAAe,GAAG,CAAC;AAEpD,EAAAA,QAAO,eAAe;AACtB,mBAAiBA,OAAM;AAEvB,MAAI,aAAa,KAAK,CAACA,QAAO,WAAW;AACvC,eAAW,OAAOA,QAAO,KAAK,KAAA,GAAQ;AACpC,mBAAa,GAAG;AAAA,IAClB;AAEA,mBAAeA,OAAM;AAAA,EACvB;AACF;AAEO,SAAS,cAAcA,SAAwC;AACpE,QAAM,EAAE,YAAY,aAAA,IAAiBA;AACrC,QAAM,kBAAkB,eAAe;AAEvC,EAAAA,QAAO,eAAe;AAEtB,MAAI,aAAa,KAAK,oBAAoB,YAAY;AACpD,uBAAmBA,OAAM;AAAA,EAC3B;AACF;AAEA,SAAS,eAAeA,SAAwC;AAE9D,EAAAA,QAAO,OAAO,aAAaA,OAAM;AACjC,mBAAiBA,OAAM;AAEvB,EAAAA,QAAO,YAAY;AAEnB,MAAI,QAAQA,OAAM,GAAG;AAEnB,gBAAYA,OAAM;AAAA,EACpB;AACF;AAEO,SAAS,iBAAiBA,SAAkC;AACjE,QAAM,EAAE,YAAY,aAAA,IAAiBA;AAErC,EAAAA,QAAO,YAAY;AACnB,QAAM,eAAe,aAAa,KAAK,iBAAiB;AAExD,aAAW,OAAOA,QAAO,KAAK,KAAA,GAAQ;AACpC,UAAM,EAAE,YAAY,eAAe,cAAc,oBAAoB;AAErE,QAAI,cAAc;AAChB,YAAM,kBAAmB,IAAI,eAAe,kBAAkB;AAE9D,UAAI,oBAAoB,eAAe;AACrC,yBAAiB,GAAG;AAAA,MACtB;AAAA,IACF,OAAO;AACL,YAAM,gBAAiB,IAAI,aAAa,gBAAgB;AAExD,UAAI,kBAAkB,GAAG;AACvB,yBAAiB,GAAG;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQA,OAAM,GAAG;AAEnB,IAAAA,QAAO,SAAA;AAAA,EACT;AAGA,MAAI,eAAe,GAAG;AACpB,IAAAA,QAAO,OAAO,UAAUA,OAAM;AAC9B,IAAAA,QAAO,MAAA;AAAA,EACT;AACF;ACtJA,MAAM,uBACJ,OAAO,wBAAwB,aAAa,sBAAsB,CAAC,OAAmBE,OAAAA,cAAe,EAAE;AAEzG,IAAI,oCAAmD,IAAA;AACvD,IAAI,sBAAkD,CAAA;AACtD,IAAI,uCAAuB,IAAA;AAC3B,IAAI,oBAAqE,CAAA;AAEzE,IAAI,iCAAiB,IAAA;AAErB,MAAM,YAAY,MAAM,QAAQ,QAAA;AAEhC,IAAI,eAAuE;AAE3E,MAAM,gBAAgB,CAAC,OAAmB;AACxC,MAAI,aAAc;AAElB,MAAI;AACJ,QAAM,UAAU,IAAI,QAAc,CAAA,MAAM,UAAU,CAAE;AAEpD,iBAAe,EAAE,SAAS,QAAA;AAE1BA,SAAAA,cAAe,aAAa;AAC9B;AAEO,MAAM,eAAe,CAACF,YAAqC;AAChE,gBAAc,IAAIA,OAAM;AACxB,gBAA2B;AAC7B;AAEO,MAAM,aAAa,CAACA,YAAqC;AAC9D,gBAAc,OAAOA,OAAM;AAC7B;AAEO,MAAM,oBAAoB,CAACA,YAAqC;AACrE,sBAAoB,KAAKA,OAAM;AAC/B,gBAA2B;AAC7B;AAEO,MAAM,qBAAqB,CAACA,YAAqC;AACtE,mBAAiB,IAAIA,OAAM;AAC3B,gBAA2B;AAC7B;AAEO,MAAM,mBAAmB,CAACA,YAAqC;AACpE,EAAAA,QAAO,OAAO,aAAaA,OAAM;AACjC,mBAAiB,OAAOA,OAAM;AAChC;AAEO,MAAM,oBAAoB,CAACA,YAAwD;AACxF,oBAAkB,KAAKA,OAAM;AAC7B,gBAA2B;AAC7B;AAEO,MAAM,iBAAiB,CAAC,WAAmB;AAKlD;AAEO,MAAM,kBAAkB,CAAC,UAAuB;AACrD,aAAW,IAAI,KAAK;AAEpB,MAAI,WAAW,OAAO,EAAG;AAEzB,uBAAqB,MAAM;AACzB,eAAWG,UAAS,YAAY;AAC9BA,aAAM,QAAA;AAAA,IACR;AAEA,eAAW,MAAA;AAAA,EACb,CAAC;AACH;AAEA,MAAM,gBAAgB,YAAY;AAChC,QAAM,QAAQ;AAId,SAAO,oBAAoB,SAAS,KAAK,cAAc,OAAO,GAAG;AAC/D,UAAM,aAAa;AAEnB,0BAAsB,CAAA;AAEtB,eAAW,QAAQ,YAAY;AAC7B,kBAAY,IAAI;AAAA,IAClB;AAEA,UAAM,QAAQ;AAEd,wCAAoB,IAAA;AAEpB,eAAW,QAAQ,OAAO;AACxB,2BAAqB,IAAI;AAAA,IAC3B;AAMA,UAAM,UAAA;AAAA,EACR;AAIA,iBAAe;AAEfC,SAAAA,SAAS,MAAM;AACb,eAAWJ,WAAU,kBAAkB;AACrC,uBAAiBA,OAAM;AAAA,IACzB;AAEA,qBAAiB,MAAA;AAEjB,eAAWA,WAAU,mBAAmB;AACtC,UAAIA,mBAAkB,gBAAgB;AACpCK,qBAAoBL,OAAa;AAAA,MACnC,OAAO;AACLM,uBAAkBN,OAAa;AAAA,MACjC;AAAA,IACF;AASA,wBAAoB,CAAA;AAAA,EACtB,CAAC;AAGD,QAAM,QAAA;AACR;AAEO,MAAM,UAAU,YAAY;AACjC,SAAO,cAAc;AACnB,UAAM,aAAa;AAAA,EACrB;AACF;ACnJO,SAAS,YAAYA,SAAkC;AAC5D,QAAM,YAAYA,QAAO;AAEzB,MAAI,cAAc,gBAAgB,OAAO;AACvC;AAAA,EACF;AAEA,EAAAA,QAAO,SAAS,gBAAgB;AAEhC,MAAI,YAAY,gBAAgB,YAAY;AAC1C,mBAAeA,OAAM;AAAA,EACvB;AACF;AAEA,SAAS,eAAeA,SAAkC;AACxD,MAAI,mBAAA,MAAyBA,SAAQ;AACnC,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AAEA,MAAI,QAAQA,OAAM,GAAG;AACnB,QAAIA,QAAO,aAAa,GAAG;AACzB,wBAAkBA,OAAM;AAAA,IAC1B;AAAA,EAGF,OAAO;AACL,QAAIA,QAAO,eAAe,CAACA,QAAO,sBAAsB;AACtD,mBAAaA,OAAM;AAAA,IACrB;AAEA,yBAAqBA,QAAO,IAAI;AAChC,IAAAA,QAAO,2BAAW,IAAA;AAAA,EACpB;AACF;AAEO,SAAS,qBAAqB,KAAmD;AACtF,aAAW,CAAC,QAAQ,IAAI,KAAK,KAAK;AAChC,UAAM,MAAM,OAAO,MAAA;AAEnB,QAAI,QAAQ,UAAa,IAAI,kBAAkB,KAAK,WAAY;AAEhE,UAAM,aAAa,IAAI;AAEvB,YAAQ,YAAA;AAAA,MACN,KAAK,gBAAgB;AACnB,YAAI,SAAS,gBAAgB;AAC7B,YAAI,YAAY;AAChB,aAAK,YAAY;AACjB,uBAAe,GAAG;AAClB;AAAA,MAEF,KAAK,gBAAgB;AAAA,MACrB,KAAK,gBAAgB;AAAA,MACrB,KAAK,gBAAgB,cAAc;AACjC,YAAI,UAAU,IAAI;AAClB,cAAM,MAAM,KAAK;AAEjB,YAAI,QAAQ,MAAM,KAAK;AACrB,cAAI,YAAY;AAChB,eAAK,YAAY;AAEjB,cAAI,eAAe,gBAAgB,WAAW,eAAe,gBAAgB,cAAc;AAKzF,gBAAI,SAAS,gBAAgB;AAC7B,2BAAe,GAAG;AAAA,UACpB;AAAA,QACF,OAAO;AACL,cAAI,YAAY,QAAQ;AAExB,iBAAO,cAAc,UAAa,UAAU,MAAM,KAAK;AACrD,sBAAU;AACV,wBAAY,QAAQ;AAAA,UACtB;AAMA,eAAK,YAAY;AACjB,kBAAS,YAAY;AAAA,QACvB;AACA;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ;AACF;AC5FA,IAAI,cAAc;AAEX,IAAW,6BAAAO,cAAX;AACLA,YAAAA,UAAA,YAAS,CAAA,IAAT;AACAA,YAAAA,UAAA,aAAU,CAAA,IAAV;AAFgB,SAAAA;AAAA,GAAA,YAAA,CAAA,CAAA;AAgCX,SAAS,WACd,UACA,MACA,KACA,WACA,YACG;AACH,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,WAAW;AAAA,IAAA;AAAA,EAEf;AAEA,WAAS,MAAM;AACf,WAAS,YAAY;AACrB,WAAS,aAAa;AACtB,WAAS,YAAY;AACrB,SAAO;AACT;AAEO,SAAS,mBACd,KACA,KACkB;AAClB,MAAI,OAAO,IAAI;AAEf,MAAI,SAAS,QAAW;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,QAAQ,KAAK;AACpB,QAAI,YAAY,KAAK;AACrB,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,KAAK;AAEpB,SAAO,aAAa,QAAW;AAC7B,QAAI,SAAS,QAAQ,KAAK;AACxB,WAAK,YAAY,SAAS;AAC1B,aAAO;AAAA,IACT;AAEA,WAAO;AACP,eAAW,KAAK;AAAA,EAClB;AAEA,SAAO;AACT;ACxFO,MAAM,iBAAkC,CAAC,GAAG,MAAM,MAAM;AACxD,MAAM,eAAgC,MAAM;AAE5C,MAAM,aAAa,CAAI,WAAqD;AACjF,MAAI,WAAW,OAAO;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,UAAU;AACnB;ACPA,MAAM,8BAA8B,aAAa;AAAC,GAAA,EAAK;AAEhD,SAAS,kBAAkB,OAAmC;AACnE,SAAO,MAAM,gBAAgB;AAC/B;AAEO,SAAS,UAAU,OAA0C;AAClE,SAAO,MAAM,gBAAgB;AAC/B;ACNO,SAAS,qCACd,WACA,eACY;AACZ,WAAS,MAAM,OAAY;AACzB,WAAO,OAAO,UAAU,YAAY,UAAU,SAAS,UAAU,KAAK,KAAK,kBAAkB,KAAK,KAC9F,QACA,QAAQ,QAAQ,KAAK;AAAA,EAC3B;AAEA,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,aAAS,KAAK,IAA8C,OAAa;AACvE,YAAM,eAAe,mBAAA;AAErB,UAAI;AACF,2BAAmB,aAAa;AAChC,cAAM,SAAS,GAAG,KAAK;AACvB,YAAI,OAAO,MAAM;AACf,kBAAQ,OAAO,KAAK;AAAA,QACtB,OAAO;AACL,gBAAM,OAAO,KAAK,EAAE,KAAK,WAAW,QAAQ;AAAA,QAC9C;AAAA,MACF,SAAS,GAAG;AACV,eAAO,CAAC;AAAA,MACV,UAAA;AACE,2BAAmB,YAAY;AAAA,MACjC;AAAA,IACF;AAEA,UAAM,SAAS,UAAU,KAAK,KAAK,SAAS;AAC5C,UAAM,UAAU,UAAU,MAAM,KAAK,SAAS;AAE9C,aAAS,UAAU,OAAY;AAC7B,WAAK,QAAQ,KAAK;AAAA,IACpB;AAEA,aAAS,SAAS,OAAY;AAC5B,WAAK,SAAS,KAAK;AAAA,IACrB;AAEA,SAAK,MAAM;AAAA,EACb,CAAC;AACH;AAEO,SAAS,kCACd,WACA,YACY;AACZ,WAAS,MAAM,OAAY;AACzB,WAAO,OAAO,UAAU,YAAY,UAAU,SAAS,UAAU,KAAK,KAAK,kBAAkB,KAAK,KAC9F,QACA,QAAQ,QAAQ,KAAK;AAAA,EAC3B;AAEA,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,aAAS,KAAK,IAA8C,OAAa;AACvE,YAAM,YAAY,wBAAA;AAElB,UAAI;AACF,wBAAgB,UAAU;AAC1B,cAAM,SAAS,GAAG,KAAK;AACvB,YAAI,OAAO,MAAM;AACf,kBAAQ,OAAO,KAAK;AAAA,QACtB,OAAO;AACL,gBAAM,OAAO,KAAK,EAAE,KAAK,WAAW,QAAQ;AAAA,QAC9C;AAAA,MACF,SAAS,GAAG;AACV,eAAO,CAAC;AAAA,MACV,UAAA;AACE,wBAAgB,SAAS;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,SAAS,UAAU,KAAK,KAAK,SAAS;AAC5C,UAAM,UAAU,UAAU,MAAM,KAAK,SAAS;AAE9C,aAAS,UAAU,OAAY;AAC7B,WAAK,QAAQ,KAAK;AAAA,IACpB;AAEA,aAAS,SAAS,OAAY;AAC5B,WAAK,SAAS,KAAK;AAAA,IACrB;AAEA,SAAK,MAAM;AAAA,EACb,CAAC;AACH;ACvFA,IAAI,mBAAyC;AAGtC,MAAM,SAAwC;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,IAAO,OAAoB,MAAkB;AACvD,SAAK,OAAO;AACZ,SAAK,QAAQ;AAEb,SAAK,MAAM,EAAE;AAAA,EACf;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,KAAK,eAAe,KAAK,aAAa,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,IAAO;AACX,SAAK,MAAM,IAAI,SAAoB;AACjC,YAAM,QAAQ,KAAK;AACnB,YAAM,YAAY,wBAAA;AAClB,YAAM,eAAe;AAErB,UAAI;AAEF,2BAAmB;AACnB,wBAAgB,KAAK;AAErB,cAAM,SAAS,GAAG,GAAG,IAAI;AAEzB,eAAO,OAAO,WAAW,YAAY,WAAW,QAAQ,kBAAkB,MAAM,IAC5E,kCAAkC,QAAQ,KAAK,IAC/C;AAAA,MACN,UAAA;AACE,2BAAmB;AACnB,wBAAgB,SAAS;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;AAGO,SAAS,eACd,IACA,OACA,MACa;AACb,SAAO,IAAI,SAAS,IAAI,OAAO,IAAI;AACrC;AAGO,SAAS,SAA6B,IAAO,KAAa,MAAiC;AAChG,MAAI;AAEJ,MAAI,qBAAqB,QAAW;AAClC,gBAAY,iBAAiB;AAAA,EAC/B,OAAO;AACL,UAAM,kBAAkB,mBAAA;AACxB,QAAI,oBAAoB,QAAW;AACjC,YAAM,IAAI,MAAM,iFAAiF;AAAA,IACnG;AAEA,gBAAY,gBAAgB,cAAc,gBAAgB,YAAY,CAAA;AAAA,EACxE;AAEA,MAAIC,YAAW,UAAU,GAAG;AAE5B,MAAIA,cAAa,QAAW;AAC1BA,gBAAW,UAAU,GAAG,IAAI,eAAe,IAAI,gBAAA,GAAmB,IAAI;AAAA,EACxE,WAAW,QAAQA,UAAS,MAAM,UAAU,CAAC,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC,MAAM,IAAI;AAC/EA,cAAS,MAAM,EAAE;AACjBA,cAAS,OAAO;AAAA,EAClB;AAEA,SAAOA,UAAS;AAClB;AClCA,MAAM,YAAY,MAAM;AAExB,SAAS,WAAW,GAAuC;AACzD,SAAO,MAAM,QAAQ,OAAO,MAAM,YAAY,OAAQ,EAAU,SAAS;AAC3E;AAEA,SAAS,SAAS,GAAY,WAAqC,UAA2C;AAC5G,MAAI,WAAW,CAAC,GAAG;AAChB,MAA2B,KAAK,WAAW,QAAQ;AAAA,EACtD,OAAO;AACL,cAAU,CAAC;AAAA,EACb;AACF;AAEO,MAAM,oBAAsD;AAAA,EACzD,SAAwB;AAAA,EAExB,SAA8B;AAAA,EAC9B,SAAS;AAAA,EAET,UAAgD;AAAA,EAChD,UAAqB;AAAA,EACrB;AAAA,EAEA,WAAgC,CAAA;AAAA,EAEhC,iCAAiB,IAAA;AAAA,EACzB,iCAAiB,IAAA;AAAA,EAEjB,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,WAAW,OAAO,CAAC;AAAA;AAAA;AAAA,EAInB,MAAoE;AAAA,EAE5E,YAAY,UAAsG;AAChH,uBAAmB,IAAI;AAGvB,QAAI,UAAU;AACZ,YAAM,UAAU,CAAC,UAA8B;AAC7C,YAAI,SAAS,OAAQ,MAAc,SAAS,YAAY;AACtD,eAAK,YAAY,KAAmB;AAAA,QACtC,OAAO;AACL,eAAK,UAAU,KAAU;AAAA,QAC3B;AAAA,MACF;AACA,YAAM,SAAS,CAAC,WAAoB;AAClC,aAAK,UAAU,MAAM;AAAA,MACvB;AACA,UAAI;AACF,iBAAS,SAAS,MAAM;AAAA,MAC1B,SAAS,GAAG;AACV,eAAO,CAAC;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,IACL,QACkE;AAClE,UAAM,IAAI,IAAI,oBAAA;AACd,UAAM,MAAM,UAAU,MAAM;AAC5B,UAAM,MAAM,IAAI;AAChB,QAAI,QAAQ,GAAG;AACb,QAAE,UAAU,EAAS;AACrB,aAAO;AAAA,IACT;AACA,UAAM,UAAqB,IAAI,MAAM,GAAG;AACxC,QAAI,YAAY;AAChB,QAAI,WAAW;AACf,UAAM,cAAc,CAAC,MAAc,CAAC,MAAe;AACjD,UAAI,SAAU;AACd,cAAQ,CAAC,IAAI;AACb,UAAI,EAAE,cAAc,EAAG,GAAE,UAAU,OAAc;AAAA,IACnD;AACA,UAAM,WAAW,CAAC,MAAe;AAC/B,UAAI,SAAU;AACd,iBAAW;AACX,QAAE,UAAU,CAAC;AAAA,IACf;AACA,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,eAAS,IAAI,CAAC,GAAG,YAAY,CAAC,GAAG,QAAQ;AAAA,IAC3C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,KAAwC,QAAoD;AACjG,UAAM,IAAI,IAAI,oBAAA;AACd,UAAM,MAAM,UAAU,MAAM;AAC5B,UAAM,MAAM,IAAI;AAChB,QAAI,QAAQ,EAAG,QAAO;AACtB,QAAIC,WAAU;AACd,UAAM,YAAY,CAAC,MAAe;AAChC,UAAIA,SAAS;AACb,MAAAA,WAAU;AACV,QAAE,UAAU,CAAQ;AAAA,IACtB;AACA,UAAM,WAAW,CAAC,MAAe;AAC/B,UAAIA,SAAS;AACb,MAAAA,WAAU;AACV,QAAE,UAAU,CAAC;AAAA,IACf;AACA,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,eAAS,IAAI,CAAC,GAAG,WAAW,QAAQ;AAAA,IACtC;AACA,WAAO;AAAA,EACT;AAAA,EAGA,OAAO,IAAuC,QAAoD;AAChG,UAAM,IAAI,IAAI,oBAAA;AACd,UAAM,MAAM,UAAU,MAAM;AAC5B,UAAM,MAAM,IAAI;AAEhB,QAAI,QAAQ,GAAG;AAEb,QAAE,UAAU,IAAI,eAAe,CAAA,GAAI,kDAAkD,CAAC;AACtF,aAAO;AAAA,IACT;AAEA,QAAI,UAAU;AACd,UAAM,SAAoB,IAAI,MAAM,GAAG;AACvC,QAAI,YAAY;AAEhB,UAAM,YAAY,CAAC,UAAmB;AACpC,UAAI,UAAW;AACf,kBAAY;AACZ,QAAE,UAAU,KAAY;AAAA,IAC1B;AACA,UAAM,aAAa,CAAC,UAAkB,CAAC,WAAoB;AACzD,UAAI,UAAW;AACf,aAAO,KAAK,IAAI;AAChB,UAAI,EAAE,YAAY,GAAG;AACnB,UAAE,UAAU,IAAI,eAAe,QAAQ,mDAAmD,CAAC;AAAA,MAC7F;AAAA,IACF;AAEA,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,eAAS,IAAI,CAAC,GAAG,WAAW,WAAW,CAAC,CAAC;AAAA,IAC3C;AAEA,WAAO;AAAA,EACT;AAAA,EAGA,OAAO,WACL,QAC4E;AAC5E,UAAM,IAAI,IAAI,oBAAA;AACd,UAAM,MAAM,UAAU,MAAM;AAC5B,UAAM,MAAM,IAAI;AAEhB,QAAI,QAAQ,GAAG;AACb,QAAE,UAAU,EAAS;AACrB,aAAO;AAAA,IACT;AAEA,UAAM,UAA2C,IAAI,MAAM,GAAG;AAC9D,QAAI,YAAY;AAEhB,UAAM,cAAc,CAAC,UAAkB,CAAC,UAAmB;AACzD,cAAQ,KAAK,IAAI,EAAE,QAAQ,aAAa,MAAA;AACxC,UAAI,EAAE,cAAc,EAAG,GAAE,UAAU,OAAc;AAAA,IACnD;AACA,UAAM,aAAa,CAAC,UAAkB,CAAC,WAAoB;AACzD,cAAQ,KAAK,IAAI,EAAE,QAAQ,YAAY,OAAA;AACvC,UAAI,EAAE,cAAc,EAAG,GAAE,UAAU,OAAc;AAAA,IACnD;AAEA,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,eAAS,IAAI,CAAC,GAAG,YAAY,CAAC,GAAG,WAAW,CAAC,CAAC;AAAA,IAChD;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,QAAW,OAAkC;AAClD,QAAI,iBAAiB,oBAAqB,QAAO;AACjD,WAAO,IAAI,oBAAuB,CAAA,YAAW,QAAQ,KAAK,CAAC;AAAA,EAC7D;AAAA,EAEA,OAAO,OAAkB,QAAqC;AAC5D,WAAO,IAAI,oBAAuB,CAAC,UAAU,WAAW,OAAO,MAAM,CAAC;AAAA,EACxE;AAAA,EAEA,OAAO,gBAAmB;AACxB,UAAM,IAAI,IAAI,oBAAA;AACd,MAAE,UAAU;AACZ,MAAE;AAAA,MAAW;AAAA;AAAA,IAAA;AAEb,UAAM,UAAU,CAAC,UAA8B;AAC7C,UAAI,SAAS,OAAQ,MAAc,SAAS,YAAY;AACtD,UAAE,YAAY,KAAmB;AAAA,MACnC,OAAO;AACL,UAAE,UAAU,KAAU;AAAA,MACxB;AAAA,IACF;AACA,UAAM,SAAS,CAAC,WAAoB;AAClC,QAAE,UAAU,MAAM;AAAA,IACpB;AAEA,WAAO,EAAE,SAAS,GAAwC,SAAS,OAAA;AAAA,EACrE;AAAA,EAEQ,WAAW,WAAmB;AAepC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEQ,cAAc,OAAe;AACnC,UAAM,kBAAkB,mBAAA;AACxB,QAAI,oBAAoB,OAAW;AAEnC,SAAK,KAAK,SAAS,SAAwB,GAAG;AAC5C,WAAK,SAAA;AAAA,IACP;AAEA,UAAM,MAAM,gBAAgB;AAE5B,UAAM,OAAO,KAAK;AAElB,UAAM,cAAc,KAAK,IAAI,GAAG,KAAK;AACrC,SAAK,IAAI,KAAK,cAAc,KAAK;AAAA,EACnC;AAAA,EAEQ,WAAW;AACjB,UAAMT,UAAS,KAAK;AAEpB,UAAM,kBAAkB,mBAAA;AACxB,QAAI,iBAAiB,eAAe,GAAG;AACrC,YAAM,EAAE,KAAK,eAAe,KAAA,IAAS;AACrC,YAAM,WAAW,KAAK,IAAIA,OAAM;AAEhC,UAAI,UAAU,eAAe,eAAe;AAC1C,cAAM,UAAU,WAAW,UAAU,SAAS,QAAQA,SAAQA,QAAO,cAAc,aAAa;AAEhGA,gBAAO,KAAK,IAAI,KAAK,OAAO;AAC5B,aAAK,IAAIA,SAAQ,OAAO;AAAA,MAC1B;AAAA,IACF,OAAO;AACL,gBAAUA,OAAM;AAAA,IAClB;AAAA,EACF;AAAA,EAEQ,UAAU,SAAiB,WAAW,GAAG,SAAS,GAAG;AAC3D,UAAM,YAAY,KAAK;AAEvB,UAAM,YAAa,YAAY,CAAC,WAAY;AAC5C,UAAM,aAAc,YAAY,YAAa;AAE7C,SAAK,SAAS;AAad,QAAI,eAAe,GAAG;AACpB;AAAA,IACF;AAEA,SAAK,cAAc,KAAmB,SAAuB,GAAG;AAC9D,WAAK;AAAA,IACP;AAEA,UAAM,OAAO,KAAK;AAElB,eAAW,CAAC,WAAW,WAAW,KAAK,MAAM;AAC3C,WAAK,cAAc,gBAAgB,GAAG;AACpC,cAAMA,UAAS,UAAU,MAAA;AAEzB,YAAIA,SAAQ;AACV,sBAAYA,OAAM;AAAA,QACpB;AAEA,aAAK,OAAO,SAAS;AAAA,MACvB;AAAA,IACF;AAEA,SAAK,SAAS,OAAO,CAAA,MAAK,IAAI,CAAC;AAAA,EAmBjC;AAAA,EAEA,cAAc;AACZ,YAAQ,KAAK,SAAS,OAAwB;AAAA,EAChD;AAAA,EAEA,cAAc;AACZ,QAAI,KAAK,eAAe;AACtB,aAAO,KAAK;AAAA,IACd;AAEA,SAAK;AAAA,MAAU;AAAA;AAAA,IAAA;AAOf,yBAAqB,KAAK,UAAU;AACpC,WAAQ,KAAK,aAAa,oBAAI,IAAA;AAAA,EAChC;AAAA,EAEA,gBAAgB;AACd,SAAK,UAAU,KAAK,MAAO;AAAA,EAC7B;AAAA,EAEA,MAAM,YAAY,SAAqB;AAIrC,SAAK,WAAW;AAEhB,UAAM,QAAQ,KAAK;AACnB,QAAI,YAAY,KAAK;AAErB,QAAI;AAGF,WAAK,QAAQ,OAAwB,GAAG;AACtC,oBAAY,KAAK,YAAA;AAAA,MACnB;AAEA,YAAM,YAAY,MAAM;AAExB,UAAI,YAAY,KAAK,UAAU;AAC7B;AAAA,MACF;AAEA,WAAK,UAAU,WAAW,SAAS;AAAA,IACrC,SAAS,WAAW;AAClB,UAAI,YAAY,KAAK,UAAU;AAC7B;AAAA,MACF;AAEA,WAAK,UAAU,WAAW,SAAS;AAAA,IACrC;AAAA,EACF;AAAA,EAEQ,UAAU,WAAc,YAAY,KAAK,YAAY;AAC3D,QAAI,QAAQ,KAAK;AACjB,QAAI,QAAQ,KAAK;AAEjB,QAAI,cAAc;AAElB,SAAK,QAAQ,OAAsB,KAAK,KAAK,QAAQ,OAAQ,SAAS,MAAM,OAAO;AACjF,WAAK,SAAS,QAAQ;AACtB,oBAAc;AAAA,IAChB;AAEA,QAAI,QAAQ,GAAqB;AAC/B,oBAAc;AACd,WAAK,SAAS;AAAA,IAChB;AAEA,SAAK,QAAQ,OAAwB,GAAG;AACtC,WAAK,cAAc,WAAW,gBAAgB,CAAC;AAAA,IACjD,WAAW,gBAAgB,GAAG;AAC5B,2BAAqB,SAAS;AAAA,IAChC;AAEA,SAAK,aAAa,YAAY,oBAAI,IAAA;AAElC,SAAK,UAAU,IAAsB,GAAkB,IAAqB,GAAqB,WAAW;AAE5G,UAAM,UAAU,KAAK;AACrB,SAAK,WAAW,CAAA;AAEhB,UAAM,YAAY,KAAK;AAEvB,eAAW,EAAE,KAAK,MAAM,QAAA,KAAa,SAAS;AAC5C,gBAAU,KAAM;AAEhB,UAAI,QAAQ,QAAW;AACrB,aAAM,YAAY;AAClB,kBAAU,IAAI,KAAK,IAAK;AAAA,MAC1B;AAAA,IACF;AAEA,UAAMA,UAAS,KAAK;AAEpB,QAAIA,YAAW,QAAW;AACxB,uBAAiBA,OAAM;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,UAAU,WAAoB,YAAY,KAAK,YAAY;AACjE,QAAI,QAAQ,KAAK;AAEjB,QAAI,cAAc;AAElB,QAAI,UAAU,WAAW;AACvB,WAAK,SAAS,QAAQ;AACtB,oBAAc;AAAA,IAChB;AAEA,SAAK,KAAK,SAAS,OAAwB,GAAG;AAC5C,WAAK,cAAc,WAAW,gBAAgB,CAAC;AAAA,IACjD,WAAW,gBAAgB,GAAG;AAC5B,2BAAqB,SAAS;AAAA,IAChC;AAEA,SAAK,aAAa,YAAY,oBAAI,IAAA;AAElC,SAAK,UAAU,GAAqB,IAAqB,GAAqB,WAAW;AAEzF,UAAM,UAAU,KAAK;AACrB,SAAK,WAAW,CAAA;AAEhB,UAAM,YAAY,KAAK;AAEvB,eAAW,EAAE,KAAK,MAAM,OAAA,KAAY,SAAS;AAC3C,eAAS,KAAK;AAEd,UAAI,QAAQ,QAAW;AACrB,aAAM,YAAY;AAClB,kBAAU,IAAI,KAAK,IAAK;AAAA,MAC1B;AAAA,IACF;AAEA,UAAMA,UAAS,KAAK;AAEpB,QAAIA,YAAW,QAAW;AACxB,uBAAiBA,OAAM;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,cAAc,WAA0E,OAAgB;AAuB9G,UAAM,WAAW,QAAQ,gBAAgB,QAAQ,gBAAgB;AAEjE,eAAW,OAAO,UAAU,QAAQ;AAClC,YAAMA,UAAS,IAAI,MAAA;AAEnB,UAAIA,YAAW,QAAW;AACxB;AAAA,MACF;AAEAA,cAAO,SAAS;AAEhB,wBAAkBA,OAAM;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,IAAI,QAAQ;AACV,SAAK;AAAA,MAAc;AAAA;AAAA,IAAA;AAEnB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,QAAQ;AACV,SAAK;AAAA,MAAc;AAAA;AAAA,IAAA;AAEnB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,YAAY;AACd,SAAK;AAAA,MAAc;AAAA;AAAA,IAAA;AAEnB,YAAQ,KAAK,SAAS,OAAwB;AAAA,EAChD;AAAA,EAEA,IAAI,aAAa;AACf,SAAK;AAAA,MAAc;AAAA;AAAA,IAAA;AAEnB,YAAQ,KAAK,SAAS,OAAyB;AAAA,EACjD;AAAA,EAEA,IAAI,aAAa;AACf,SAAK;AAAA,MAAc;AAAA;AAAA,IAAA;AAEnB,YAAQ,KAAK,SAAS,OAAyB;AAAA,EACjD;AAAA,EAEA,IAAI,UAAU;AACZ,SAAK;AAAA,MAAc;AAAA;AAAA,IAAA;AAEnB,YAAQ,KAAK,SAAS,OAAsB;AAAA,EAC9C;AAAA,EAEA,IAAI,YAAY;AACd,SAAK;AAAA,MAAc;AAAA;AAAA,IAAA;AAEnB,YAAQ,KAAK,SAAS,OAAwB;AAAA,EAChD;AAAA,EAEA,KACE,aACA,YAC8B;AAC9B,QAAI,QAAQ,KAAK;AAGjB,WAAO,IAAI,QAA6B,CAAC,SAAS,WAAW;AAC3D,UAAI,KAAK;AAET,YAAM,kBAAkB,mBAAA;AACxB,UAAI,oBAAoB,QAAW;AACjC,aAAK,QAAQ,SAAwB,GAAG;AACtC,eAAK,SAAA;AACL,kBAAQ,KAAK;AAAA,QACf;AAEA,cAAM,gBAAgB;AAEtB,cAAM,WACJ,KAAK,WAAW,IAAI,GAAI,KAAK,mBAAmB,iBAAiB,IAAgC;AAEnG,eAAO;AAAA,UACL;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA,KAAK;AAAA,UACL,gBAAgB;AAAA,QAAA;AAAA,MAEpB;AAEA,YAAM,mBAAmB,cACrB,CAAC,UAAa;AACZ,YAAI;AACF,gBAAM,SAAS,YAAY,KAAK;AAChC,kBAAQ,MAAM;AAAA,QAChB,SAAS,OAAO;AACd,iBAAO,KAAK;AAAA,QACd;AAAA,MACF,IACC;AAEL,YAAM,kBAAkB,aACpB,CAAC,WAAoB;AACnB,YAAI;AACF,gBAAM,SAAS,WAAW,MAAM;AAChC,kBAAQ,MAAM;AAAA,QAChB,SAAS,OAAO;AACd,iBAAO,KAAK;AAAA,QACd;AAAA,MACF,IACA;AAEJ,UAAI,QAAQ,GAAoB;AAC9B,aAAK,SAAS,KAAK,EAAE,KAAK,MAAM,SAAS,kBAAkB,QAAQ,iBAAiB;AAAA,MACtF,OAAO;AACL,YAAI,QAAQ,GAAqB;AAC/B,2BAAiB,KAAK,MAAO;AAAA,QAC/B,WAAW,QAAQ,GAAqB;AACtC,0BAAgB,KAAK,MAAM;AAAA,QAC7B;AAEA,YAAI,KAAK;AACP,eAAK,WAAW,IAAI,KAAK,IAAK;AAAA,QAChC;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MACE,YACsB;AACtB,WAAO,KAAK,KAAK,MAAM,UAAU;AAAA,EACnC;AAAA,EAEA,QAAQ,WAA6C;AACnD,WAAO,KAAK;AAAA,MACV,CAAA,UAAS;AACP,oBAAA;AACA,eAAO;AAAA,MACT;AAAA,MACA,CAAA,WAAU;AACR,oBAAA;AACA,cAAM;AAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,KAAK,OAAO,WAAW,IAAY;AACjC,WAAO;AAAA,EACT;AACF;AAEA,MAAM,2CAA2B,QAAA;AAM1B,SAAS,mBAAmB,OAAe;AAChD,uBAAqB,IAAI,KAAK;AAChC;AAEO,SAAS,kBAAkB,OAAsD;AACtF,SAAO,qBAAqB,IAAI,KAAK;AACvC;AAEO,SAASU,UAAW,KAA4C;AACrE,SAAO,kBAAkB,GAAG,MAAM,IAAI,QAAQ,IAAI,SAAwB;AAC5E;AAEO,SAAS,cAAiB,SAAqBV,SAAsC;AAC1F,QAAM,IAAI,IAAI,oBAAA;AAEd,IAAE,SAAS,IAAIA;AACf,IAAE,SAAS,IAAIA,QAAO,IAAI;AAC1B,IAAE,YAAY;AAAA,IAAE;AAAA;AAAA,EAAA;AAChB,IAAE,aAAa,EAAE,OAAO;AAExB,SAAO;AACT;AAEO,SAAS,YAAe,UAA4B,OAAoB,MAAsC;AACnH,QAAM,IAAI,IAAI,oBAAA;AAEd,MAAI,SAAS;AACb,MAAI;AAEJ,QAAM,cAAc,MAAM;AACxB,QAAI,OAAO,eAAe,YAAY;AACpC,iBAAA;AAAA,IACF,WAAW,eAAe,QAAW;AACnC,iBAAW,aAAA;AAAA,IACb;AAEA,UAAMA,UAAS,EAAE,SAAS;AAG1BA,YAAO,2BAAW,IAAA;AAClBA,YAAO,SAAS,gBAAgB;AAChC,aAAS;AACT,iBAAa;AAAA,EACf;AAEA,QAAM,QAAuB;AAAA,IAC3B,IAAI,YAAY;AACd,cAAQ,EAAE,QAAQ,IAAI,OAAwB;AAAA,IAChD;AAAA,IAEA,IAAI,QAAQ;AACV,aAAO,EAAE,QAAQ;AAAA,IACnB;AAAA,IAEA,IAAI,MAAM,OAAU;AAClB,QAAE,WAAW,EAAE,KAAK;AAAA,IACtB;AAAA,IAEA,YAAY,CAAC,YAAwB;AACnC,QAAE,aAAa,EAAE,OAAO;AAAA,IAC1B;AAAA,IAEA,UAAU,CAAC,UAAmB;AAC5B,QAAE,WAAW,EAAE,KAAK;AAAA,IACtB;AAAA,EAAA;AAGF,QAAM,MAAiD;AAAA,IACrD,SAAS,MAAM;AACb,UAAI,WAAW,OAAO;AACpB,qBAAa,SAAS,KAAK;AAC3B,iBAAS;AAAA,MACX,WAAW,OAAO,eAAe,cAAc,eAAe,QAAW;AACvE,qBAAA;AACA,qBAAa,SAAS,KAAK;AAAA,MAC7B,OAAO;AACL,mBAAW,SAAA;AAAA,MACb;AAEA,aAAO;AAAA,IACT;AAAA,IACA,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU,MAAM;AAAA,IAChB,IAAI,MAAM;AAAA,IACV,MAAM,MAAM;AAAA,IACZ,QAAQ;AAAA,EAAA;AAGV,IAAE,SAAS,IAAI,qBAA4C,KAAK,CAAA,GAAI,QAAW,KAAK;AAEpF,IAAE,SAAS,IAAI,WAAW,MAAM,MAAM;AACtC,IAAE,YAAY;AAAA,IAAE,MAAqB;AAAA;AAAA,EAAA;AAErC,SAAO;AACT;AAEO,SAAS,WACd,MACA,OACA,MACuB;AACvB,QAAM,IAAI,IAAI,oBAAA;AAEd,QAAM,EAAE,GAAA,IAAO,eAAe,MAAM,KAAK;AAEzC,IAAE,SAAS,IAAI,WAAW,MAAM,MAAM;AACtC,IAAE,YAAY;AAAA,IAAE;AAAA;AAAA,EAAA;AAEhB,QAAM,iBAAiB,MAAM,mBAAmB;AAEhD,IAAE,KAAK,KAAK,IAAI,SAAe;AAC7B,QAAI,mBAAmB,EAAE,QAAQ,IAAI,OAAwB,GAAG;AAC9D,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AAEA,MAAE,YAAY,GAAG,GAAG,IAAI,CAAC;AAEzB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAGO,MAAM,kBAAkB;AC5yBxB,SAAS,UAAqCA,SAAmD;AACtG,QAAM,kBAAkB,mBAAA;AACxB,MAAI,oBAAoB,QAAW;AACjC,UAAM,EAAE,KAAK,eAAe,KAAA,IAAS;AACrC,UAAM,WAAW,KAAK,IAAIA,OAAM;AAEhC,UAAM,iBAAiB,UAAU;AAEjC,QAAI,mBAAmB,eAAe;AACpC,UAAI,aAAa,QAAW;AAY1B,YAAI,gBAAgB,aAAa,GAAG;AAClC,sBAAYA,SAAQ,gBAAgB,YAAY;AAAA,QAClD;AAAA,MACF;AAEA,YAAM,YAAY,YAAYA,OAAM;AACpC,YAAM,UAAU,WAAW,UAAU,SAAS,QAAQA,SAAQ,WAAW,aAAa;AAEtF,MAAAA,QAAO,KAAK,IAAI,KAAK,OAAO;AAC5B,WAAK,IAAIA,SAAQ,OAAO;AAAA,IAC1B,OAAO;AACL,YAAM,YAAY,YAAYA,OAAM;AAEpC,UAAI,aAAa,QAAW;AAC1B,iBAAS,YAAY;AAAA,MACvB;AAAA,IACF;AAAA,EACF,OAAO;AACL,gBAAYA,OAAM;AAAA,EACpB;AAEA,SAAOA,QAAO;AAChB;AAEO,SAAS,YAAYA,SAA0C;AACpE,QAAM,EAAE,KAAK,QAAQ,MAAA,IAAUA;AAE/B,MAAI,QAAQ,gBAAgB,OAAO;AACjC,WAAOA,QAAO;AAAA,EAChB;AAEA,MAAI,SAAS,gBAAgB,YAAY;AACvC,QAAI,OAAyBA,QAAO;AAEpC,WAAO,SAAS,QAAW;AACzB,UAAI,KAAK,SAAS,SAAS,SAAS;AAClC,cAAMW,OAAM,KAAK;AAIjB,YAAIA,KAAI,eAAe;AACrB,gBAAM,QAAQX,QAAO;AAGrBW,eAAI,YAAY,EAAE,IAAI,KAAK,IAAI;AAG9B,gBAAuC,YAAA;AACxC,UAAAX,QAAO,SAAS,gBAAgB;AAChC,UAAAA,QAAO,YAAY;AAGnB,iBAAOA,QAAO;AAAA,QAChB,WAAW,KAAK,cAAc,KAAK,IAAI,eAAe;AAEpDW,eAAI,YAAY,EAAE,IAAI,KAAK,IAAI;AAAA,QACjC,OAAO;AACL,UAAAX,QAAO,YAAY,KAAK;AACxB,UAAAA,QAAO,SAAS,gBAAgB;AAChC;AAAA,QACF;AAEA,eAAO,KAAK;AACZ;AAAA,MACF;AAEA,YAAM,MAAM,KAAK;AACjB,YAAM,YAAY,YAAY,GAAG;AAEjC,UAAI,KAAK,IAAI,KAAK,IAAI;AAEtB,UAAI,KAAK,cAAc,WAAW;AAChC,QAAAA,QAAO,YAAY,KAAK;AACxB,QAAAA,QAAO,SAAS,gBAAgB;AAChC;AAAA,MACF;AAEA,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AAEA,QAAM,WAAWA,QAAO;AAKxB,MAAI,aAAa,gBAAgB,OAAO;AACtC,QAAIA,QAAO,SAAS;AAClB,MAAAA,QAAO;AAAA,IACT,OAAO;AACL,gBAAUA,OAAM;AAAA,IAClB;AAAA,EACF,WAAW,aAAa,gBAAgB,cAAc;AACnD,IAAAA,QAAO,OAAwC,cAAA;AAAA,EAClD;AAEA,EAAAA,QAAO,SAAS,gBAAgB;AAChC,EAAAA,QAAO,YAAY;AAMnB,SAAOA,QAAO;AAChB;AAEO,SAAS,UAAUA,SAAoC;AAU5D,QAAM,eAAe,mBAAA;AAErB,QAAM,eAAeA,QAAO;AAC5B,QAAM,gBAAgB,EAAEA,QAAO;AAE/B,MAAI;AACF,uBAAmBA,OAAM;AAEzB,UAAM,cAAc,iBAAiB;AACrC,UAAM,YAAYA,QAAO;AACzB,QAAI,YAAYA,QAAO,IAAI,QAAQ,GAAGA,QAAO,IAAI;AACjD,QAAI,iBAAiB;AAErB,QAAI,cAAc,QAAQ,OAAO,cAAc,UAAU;AACvD,UAAI,kBAAkB,SAAS,GAAG;AAChC,oBAAY,qCAAqC,WAAWA,OAAM;AAClE,yBAAiB;AAAA,MACnB,WAAW,UAAU,SAAS,GAAG;AAC/B,yBAAiB;AAAA,MACnB;AAAA,IACF;AAEA,QAAI,gBAAgB;AAClB,UAAI,cAAc,QAAQ,OAAO,cAAc,YAAY,kBAAkB,SAAS,GAAG;AAOvF,kBAAU,aAAa,EAAE,SAAS;AAAA,MACpC,OAAO;AACL,QAAAA,QAAO,SAAS,cAAc,WAAWA,OAAM;AAC/C,QAAAA,QAAO,eAAe,eAAe;AAAA,MACvC;AAAA,IACF,OAAO;AACL,UAAI,CAAC,eAAe,CAACA,QAAO,IAAI,OAAO,WAAY,SAAS,GAAG;AAC7D,QAAAA,QAAO,SAAS;AAGhB,QAAAA,QAAO,eAAeA,QAAO,UAAU,eAAe,eAAe;AAAA,MACvE;AAGA,uBAAiBA,SAAQ,aAAa;AAAA,IACxC;AAAA,EACF,UAAA;AACE,uBAAmB,YAAY;AAAA,EASjC;AACF;AAEO,SAAS,iBAAiBA,SAAkC,gBAAwBA,QAAO,eAAe;AAC/G,QAAM,EAAE,KAAK,MAAM,cAAc,gBAAgBA;AAEjD,aAAW,CAAC,KAAK,IAAI,KAAK,MAAM;AAC9B,QAAI,KAAK,eAAe,eAAe;AACrC,oBAAc,KAAK,WAAW;AAC9B,UAAI,KAAK,OAAO,GAAG;AACnB,WAAK,OAAO,GAAG;AAAA,IACjB;AAAA,EACF;AACF;AAEO,SAAS,qBAAqBA,SAAkC;AACrE,QAAM,YAAYA,QAAO;AAEzB,MAAI,eAAe,YAAYA,OAAM;AAErC,MAAI,cAAc,QAAQ,UAAU,cAAc,cAAc;AAC9D,cAAU,YAAY;AAEtB,sBAAkBA,OAAM;AAAA,EAC1B;AAEA,SAAO;AACT;ACvOA,MAAM,EAAE,KAAK,OAAO,MAAM,QAAQ;AAElC,SAAS,QAAQ,KAAa,OAAO,GAAG;AACtC,MAAI,IAAI,OAAO,IAAI;AACnB,QAAM,KAAK;AACX,QAAM,KAAK;AACX,MAAI,IAAI;AAER,SAAO,IAAI,KAAK,IAAI,QAAQ;AAC1B,QAAI,IAAK,IAAI,WAAW,CAAC,IAAI,SAAY,IAAI,WAAW,IAAI,CAAC,IAAI,UAAW;AAC5E,QAAI,KAAK,GAAG,EAAE;AACd,QAAK,KAAK,KAAO,MAAM;AACvB,QAAI,KAAK,GAAG,EAAE;AACd,SAAK;AACL,QAAK,KAAK,KAAO,MAAM;AACvB,QAAI,KAAK,GAAG,CAAC,IAAI;AACjB,SAAK;AAAA,EACP;AAEA,MAAI,IAAI,SAAS,GAAG;AAClB,QAAI,IAAI,IAAI,WAAW,CAAC,IAAI;AAC5B,QAAI,KAAK,GAAG,EAAE;AACd,QAAK,KAAK,KAAO,MAAM;AACvB,QAAI,KAAK,GAAG,EAAE;AACd,SAAK;AAAA,EACP;AACA,OAAK,IAAI;AACT,OAAK,MAAM;AACX,MAAI,KAAK,GAAG,UAAU;AACtB,OAAK,MAAM;AACX,MAAI,KAAK,GAAG,UAAU;AACtB,OAAK,MAAM;AACX,SAAO,MAAM;AACf;AAEA,SAAS,WAAW,KAAa,OAAO,GAAG;AACzC,MAAI,IAAI,MAAM,IAAI,OAAO,aAAa;AACtC,QAAM,IAAI,GAAG;AACb,QAAM,UAAU;AAChB,QAAM,KAAK;AACX,QAAM,KAAK;AAGX,SAAO,OAAO,YAAY;AAExB,QAAI,IAAI,MAAM;AACd,UAAM,MAAM,MAAM,UAAW;AAE7B,QAAI,KAAK,GAAG,EAAE;AACd,QAAK,KAAK,KAAO,MAAM;AACvB,QAAI,KAAK,GAAG,EAAE;AAEd,SAAK;AACL,QAAK,KAAK,KAAO,MAAM;AACvB,QAAI,KAAK,GAAG,CAAC,IAAI;AAAA,EACnB;AAGA,MAAI,MAAM,GAAG;AACX,QAAI,IAAI,MAAM;AACd,QAAI,KAAK,GAAG,EAAE;AACd,QAAK,KAAK,KAAO,MAAM;AACvB,QAAI,KAAK,GAAG,EAAE;AACd,SAAK;AAAA,EACP;AAGA,QAAM,WAAW,YAAY,IAAI,IAAI,MAAM,IAAI,OAAO,IAAI,IAAI,GAAG,CAAC,IAAI;AAEtE,OAAK;AACL,OAAK,MAAM;AACX,MAAI,KAAK,GAAG,UAAU;AACtB,OAAK,MAAM;AACX,MAAI,KAAK,GAAG,UAAU;AACtB,OAAK,MAAM;AAEX,SAAO,MAAM;AACf;AAEA,SAAS,UAAU,KAAgB,MAAiB;AAClD,MAAI,IAAI;AACR,QAAM,KAAK;AACX,QAAM,KAAK;AAGX,aAAW,QAAQ,KAAK;AAEtB,QAAI,IAAI,UAAU,MAAM,IAAI;AAE5B,QAAI,KAAK,GAAG,EAAE;AACd,QAAK,KAAK,KAAO,MAAM;AACvB,QAAI,KAAK,GAAG,EAAE;AAEd,SAAK;AACL,QAAK,KAAK,KAAO,MAAM;AACvB,QAAI,KAAK,GAAG,CAAC,IAAI;AAAA,EACnB;AAEA,OAAK,IAAI;AACT,OAAK,MAAM;AACX,MAAI,KAAK,GAAG,UAAU;AACtB,OAAK,MAAM;AACX,MAAI,KAAK,GAAG,UAAU;AACtB,OAAK,MAAM;AAEX,SAAO,MAAM;AACf;AAEA,SAAS,WAAW,KAAa,MAAiB;AAChD,MAAI,MAAM;AACV,QAAM,OAAO,OAAO,KAAK,GAAG;AAE5B,aAAW,OAAO,MAAM;AACtB,WAAO,KAAK,UAAU,KAAK,IAAI,GAAG,UAAU,IAAI,UAAW,IAAY,GAAG,GAAG,IAAI;AAAA,EACnF;AAEA,SAAO,QAAQ;AACjB;AAEA,SAAS,QAAQ,KAAmB,MAAiB;AACnD,MAAI,MAAM;AACV,aAAW,SAAS,KAAK;AACvB,WAAO,UAAU,OAAO,IAAI;AAAA,EAC9B;AACA,SAAO,QAAQ;AACjB;AAEA,SAAS,QAAQ,KAA4B,MAAiB;AAC5D,MAAI,MAAM;AAEV,aAAW,CAAC,KAAK,KAAK,KAAK,KAAK;AAC9B,WAAO,KAAK,UAAU,KAAK,IAAI,GAAG,UAAU,IAAI,UAAU,OAAO,IAAI;AAAA,EACvE;AAEA,SAAO,QAAQ;AACjB;AAEA,SAAS,SAAS,MAAY,OAAkB;AAC9C,SAAO;AAAA,IAAW,KAAK,QAAA;AAAA,IAAW;AAAA;AAAA,EAAA;AACpC;AAEA,SAAS,WAAW,QAAgB,OAAkB;AACpD,QAAM,IAAI;AAAA,IAAQ,OAAO,SAAS,OAAO;AAAA,IAAO;AAAA;AAAA,EAAA;AAChD,UAAQ,IAAI,OAAO,eAAe;AACpC;AAqBA,MAAM,YAAY;AAAA,EAAQ;AAAA,EAAa;AAAA;AAAA;AACvC,MAAM,OAAO;AAAA,EAAQ;AAAA,EAAQ;AAAA;AAAA;AAC7B,MAAM,OAAO;AAAA,EAAQ;AAAA,EAAQ;AAAA;AAAA;AAC7B,MAAM,QAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA;AAAA;AAC/B,MAAM,QAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA;AAAA;AAC/B,MAAM,SAAS;AAAA,EAAQ;AAAA,EAAU;AAAA;AAAA;AACjC,MAAM,MAAM;AAAA,EAAQ;AAAA,EAAO;AAAA;AAAA;AAC3B,MAAM,MAAM;AAAA,EAAQ;AAAA,EAAO;AAAA;AAAA;AAE3B,MAAM,iBAAiB,OAAO;AAE9B,MAAM,oCAAoB,IAAmD;AAAA,EAC3E,CAAC,OAAO,WAAW,UAAU;AAAA,EAC7B,CAAC,MAAM,WAAW,SAAS;AAAA,EAC3B,CAAC,IAAI,WAAW,OAAO;AAAA,EACvB,CAAC,IAAI,WAAW,OAAO;AAAA,EACvB,CAAC,KAAK,WAAW,QAAQ;AAAA,EACzB,CAAC,OAAO,WAAW,UAAU;AAC/B,CAAC;AAEM,MAAM,qBAAqB,CAAI,MAAiC,WAA+B;AACpG,gBAAc,IAAI,KAAK,WAAW,CAAC,KAAK,UAAU,OAAO,GAAG,CAAC;AAC/D;AAEO,SAAS,UAAU,MAAe,OAAkB,IAAI;AAC7D,UAAQ,OAAO,MAAA;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,OAAO,OAAO;AAAA,IACvB,KAAK;AACH,aAAO;AAAA,QAAQ,OAAO,IAAI;AAAA,QAAG;AAAA;AAAA,MAAA;AAAA,IAC/B,KAAK;AACH,aAAO;AAAA,QAAQ;AAAA,QAAM;AAAA;AAAA,MAAA;AAAA,IACvB,KAAK;AACH,aAAO;AAAA,QAAQ,KAAK,SAAA;AAAA,QAAY;AAAA;AAAA,MAAA;AAAA,IAClC,KAAK,UAAU;AACb,UAAI,SAAS,MAAM;AACjB,eAAO;AAAA,MACT;AAEA,YAAM,QAAQ,KAAK,QAAQ,IAAI;AAC/B,UAAI,UAAU,IAAI;AAChB,eAAO;AAAA,UAAQ,OAAO,KAAK;AAAA,UAAG;AAAA;AAAA,QAAA;AAAA,MAChC;AAEA,YAAM,SAAS,cAAc,IAAI,eAAe,IAAI,CAAC;AAErD,UAAI,QAAQ;AACV,aAAK,KAAK,IAAI;AACd,cAAM,OAAO,OAAO,MAAM,IAAI;AAC9B,aAAK,IAAA;AACL,eAAO;AAAA,MACT;AAEA,aAAO,cAAc,IAAI;AAAA,IAC3B;AAAA,IACA,KAAK;AACH,aAAO,cAAc,IAAI;AAAA,IAC3B,KAAK;AACH,aAAO;AAAA,QAAQ,KAAK,SAAA;AAAA,QAAY;AAAA;AAAA,MAAA;AAAA,EAAe;AAErD;AAEA,MAAM,sCAAsB,QAAA;AAC5B,IAAI,gBAAgB;AAEb,SAAS,cAAc,KAAqB;AACjD,MAAI,KAAK,gBAAgB,IAAI,GAAG;AAChC,MAAI,OAAO,QAAW;AACpB,SAAK;AAAA,MAAW;AAAA,MAAiB;AAAA;AAAA,IAAA;AACjC,oBAAgB,IAAI,KAAK,EAAE;AAAA,EAC7B;AACA,SAAO;AACT;AAEA,MAAM,mBAAmB,UAAU,CAAA,GAAI,EAAE;AAGlC,SAAS,eAAe,IAAc,MAAiB;AAC5D,QAAM,WAAW,KAAK,SAAS,IAAI,UAAU,MAAM,CAAA,CAAE,IAAI;AAGzD,MAAI,IAAI,KAAK,UAAU,UAAU;AACjC,MAAK,KAAK,KAAO,MAAM;AACvB,MAAI,KAAK,GAAG,SAAU;AACtB,MAAI,IAAI,cAAc,EAAE;AACxB,OAAK;AACL,MAAK,KAAK,KAAO,MAAM;AACvB,SAAQ,KAAK,GAAG,CAAC,IAAI,eAAgB;AACvC;ACnOO,IAAW,oCAAAY,qBAAX;AACLA,mBAAAA,iBAAA,WAAQ,CAAA,IAAR;AACAA,mBAAAA,iBAAA,aAAU,CAAA,IAAV;AACAA,mBAAAA,iBAAA,WAAQ,CAAA,IAAR;AACAA,mBAAAA,iBAAA,gBAAa,CAAA,IAAb;AACAA,mBAAAA,iBAAA,kBAAe,CAAA,IAAf;AALgB,SAAAA;AAAA,GAAA,mBAAA,CAAA,CAAA;AAoBlB,IAAI,KAAK;AA2BF,SAAS,yBACd,IACA,MACA,SACA,QACAF,UACA,UACA,QAC6B;AAC7B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,WAAW,MAAM;AAAA,IACzB,SAAAA;AAAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AAEO,MAAM,eAA0C;AAAA;AAAA,EAE7C;AAAA,EACR,QAAiC;AAAA,EAEjC,KAAK,EAAE;AAAA,EAEP,2BAAW,IAAA;AAAA,EACX,2BAAW,IAAA;AAAA,EAEX,MAAwC,IAAIG,UAAQ,IAAI;AAAA,EAExD,YAA8B;AAAA,EAE9B,eAAuB;AAAA,EACvB,gBAAwB;AAAA,EAExB,aAAqB;AAAA,EACrB,eAAuB;AAAA,EAEvB;AAAA,EACA;AAAA,EACA,YAAoC;AAAA,EAEpC,aAAkC;AAAA,EAClC,SAAuC;AAAA,EAEvC;AAAA;AAAA,EAGA;AAAA,EAEA,YAAY,KAAkC,MAAY,KAAgB,OAAqB;AAC7F,SAAK,SAAS,IAAI,UAAU,IAA0B,KAAK;AAC3D,SAAK,QAAQ;AACb,SAAK,MAAM;AACX,SAAK,OAAO;AACZ,SAAK,MAAM;AAAA,EAUb;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,OAAO,OAAwB;AACjC,SAAK,QAAS,KAAK,QAAQ,KAA0B;AAAA,EACvD;AAAA,EAEA,IAAI,cAAc;AAChB,YAAQ,KAAK,QAAQ,QAAgC;AAAA,EACvD;AAAA,EAEA,IAAI,uBAAuB;AACzB,YAAQ,KAAK,QAAQ,QAAyC;AAAA,EAChE;AAAA,EAEA,IAAI,eAAe;AACjB,UAAM,EAAE,YAAY,aAAA,IAAiB;AACrC,WAAO,aAAa,KAAK,eAAe;AAAA,EAC1C;AAAA,EAEA,IAAI,YAAY;AACd,YAAQ,KAAK,QAAQ,QAA8B;AAAA,EACrD;AAAA,EAEA,IAAI,UAAU,UAAmB;AAC/B,QAAI,UAAU;AACZ,WAAK,SAAS;AAAA,IAChB,OAAO;AACL,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,IAAI,UAAU;AACZ,YAAQ,KAAK,QAAQ,SAA4B;AAAA,EACnD;AAAA,EAEA,IAAI,QAAQ,QAAiB;AAC3B,QAAI,QAAQ;AACV,WAAK,SAAS;AAAA,IAChB,OAAO;AACL,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,IAAI,YAAY;AACd,WACE,KAAK,eACJ,KAAK,aAAa;AAAA,MACjB,WAAW;AAAA,MACX,6BAAa,IAAA;AAAA,MACb,gBAAgB,KAAK,YAAY,KAAK,IAAI;AAAA,IAAA;AAAA,EAGhD;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,UAAU,IAAI;AAAA,EACvB;AAAA,EAEA,YAAY,UAAsB,MAAkC;AAClE,UAAM,EAAE,YAAY,KAAK;AAEzB,QAAI,CAAC,QAAQ,IAAI,QAAQ,GAAG;AAC1B,UAAI,YAAY;AAEhB,UAAI,MAAM,aAAa;AACrB,YAAI,UAAU;AACd,oBAAY,MAAM;AAChB,cAAI,SAAS;AACX,sBAAU;AACV;AAAA,UACF;AACA,mBAAA;AAAA,QACF;AAAA,MACF;AAEA,UAAI,CAAC,KAAK,aAAa;AACrB,oBAAY,MAAM,KAAK,YAAY;AACnC,aAAK,SAAS;AAAA,MAChB;AAEA,mBAAa,IAAI;AAEjB,cAAQ,IAAI,UAAU,SAAS;AAAA,IACjC;AAEA,WAAO,MAAM;AACX,UAAI,QAAQ,IAAI,QAAQ,GAAG;AACzB,gBAAQ,OAAO,QAAQ;AAEvB,YAAI,QAAQ,SAAS,GAAG;AACtB,qBAAW,IAAI;AACf,wBAAc,MAAM,KAAK,YAAY;AACrC,eAAK,SAAS;AACd,eAAK,UAAU,YAAY;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB;AAChB,QAAI,CAAC,KAAK,aAAa;AACrB,kBAAY,MAAM,KAAK,YAAY;AACnC,WAAK,SAAS;AAAA,IAChB;AAEA,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,aAAa,WAAoB;AAC/B,UAAM,EAAE,UAAU;AAClB,UAAM,cAAc,QAAQ,QAAgC;AAC5D,UAAM,uBAAuB,QAAQ,QAAyC;AAE9E,QAAI,aAAa,CAAC,qBAAqB;AACrC,WAAK,QAAQ,QAAQ;AAErB,UAAI,YAAY;AACd,sBAAc,IAAI;AAAA,MACpB;AAAA,IACF,WAAW,CAAC,aAAa,qBAAqB;AAC5C,WAAK,QAAQ,QAAQ;AAErB,UAAI,YAAY;AACd,qBAAa,IAAI;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAQ;AACN,SAAK,SAAS,KAAK,IAAI,UAAU,IAA0B,KAAK;AAChE,SAAK,YAAY;AACjB,SAAK,eAAe;AACpB,SAAK,gBAAgB;AACrB,SAAK,2BAAW,IAAA;AAChB,SAAK,2BAAW,IAAA;AAChB,SAAK,aAAa;AAClB,SAAK,eAAe;AAAA,EACtB;AACF;AAEO,MAAM,eAAe,CAACb,YAAqC;AAChE,QAAM,EAAE,cAAcA;AAEtB,MAAI,cAAc,MAAM;AACtB;AAAA,EACF;AAEA,QAAM,EAAE,YAAY;AAEpB,aAAW,YAAY,QAAQ,UAAU;AACvC,aAAA;AAAA,EACF;AACF;AAEO,MAAM,UAAU,CAACA,YAA8C;AACpE,UAAQA,QAAO,OAAO,IAAI,OAA6B;AACzD;AAEO,SAAS,qBACd,KACA,OAAa,CAAA,GACb,KACA,OACyB;AACzB,SAAO,IAAI,eAAe,KAAK,MAAM,KAAK,KAAK;AACjD;AC7SA,IAAI,aAAa;AAEV,MAAM,YAAe;AAAA,EAI1B,YACkB,cAChB,MACA;AAFgB,SAAA,eAAA;AAGhB,SAAK,eAAe,QAAQ,WAAW,YAAY;AACnD,SAAK,OAAO,OAAO,KAAK,YAAY;AAAA,EACtC;AAAA,EATA;AAAA,EACA;AASF;AAEO,MAAM,UAAU,CAAI,cAAiB,gBAAqC;AAC/E,SAAO,IAAI,YAAY,cAAc,WAAW;AAClD;AAEO,SAAS,aAAqC,UAA+B,IAAgB;AAClG,QAAM,YAAY;AAClB,QAAM,eAAe,gBAAA;AAErB,MAAI;AACF,oBAAgB,aAAa,SAAS,QAA6C;AACnF,WAAO,GAAA;AAAA,EACT,UAAA;AACE,oBAAgB;AAAA,EAClB;AACF;AAEO,MAAM,aAAa,CAAIc,aAA2B;AACvD,QAAM,QAAQ,iBAAiB,mBAAA,GAAsB;AAErD,MAAI,UAAU,QAAW;AACvB,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AAEA,SAAO,MAAM,WAAWA,QAAO,KAAMA,SAAsC;AAC7E;AAIO,MAAM,YAAY;AAAA,EACf;AAAA,EAER,YAAY,UAA6C,QAAsB;AAC7E,SAAK,cAAc;AACnB,SAAK,WAAW,OAAO,OAAO,QAAQ,YAAY,IAAI;AAEtD,SAAK,YAAY,QAAQ;AAAA,EAC3B;AAAA,EAEQ;AAAA,EACA,+BAAe,IAAA;AAAA,EACf,8BAAc,IAAA;AAAA,EACd,mCAAmB,IAAA;AAAA,EAE3B,YAAY,UAA6C;AACvD,eAAW,CAACA,UAAS,KAAK,KAAK,UAAU;AACvC,WAAK,SAASA,SAAQ,IAAI,IAAI;AAE9B,UAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,wBAAgB,IAAI,OAAO,IAAI;AAAA,MACjC;AAAA,IACF;AAEA,SAAK,QAAQ,MAAA;AAAA,EACf;AAAA,EAEA,SAAS,UAA6C;AACpD,UAAM,MAAM,UAAU,QAAQ;AAE9B,QAAI,QAAQ,KAAK,SAAS,IAAI,GAAG;AAEjC,QAAI,UAAU,QAAW;AACvB,cAAQ,IAAI,YAAY,UAAU,IAAI;AACtC,WAAK,SAAS,IAAI,KAAK,KAAK;AAAA,IAC9B;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,WAAc,UAAqC;AACjD,UAAMA,WAAU;AAEhB,WAAO,KAAK,SAASA,SAAQ,IAAI;AAAA,EACnC;AAAA,EAEA,IAA+B,KAAkC,MAAqC;AACpG,UAAM,WAAW,IAAI,WAAW,GAAG,IAAI;AACvC,UAAM,MAAM,eAAe,IAAI,SAAS,WAAW,CAAC,QAAQ,IAAI,IAAI;AACpE,QAAId,UAAS,KAAK,QAAQ,IAAI,GAAG;AAEjC,QAAIA,YAAW,QAAW;AACxB,MAAAA,UAAS,qBAAqB,KAAK,MAAM,KAAK,IAAI;AAClD,WAAK,QAAQ,IAAI,KAAKA,OAAM;AAAA,IAC9B;AAEA,WAAOA;AAAA,EACT;AAAA,EAEA,UAAUA,SAAkC;AAC1C,QAAI,CAAC,KAAK,aAAa,IAAIA,OAAM,GAAG;AAClC,WAAK,aAAa,IAAIA,OAAM;AAC5B,sBAAgB,IAAI;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,aAAaA,SAAkC;AAC7C,SAAK,aAAa,OAAOA,OAAM;AAE/B,UAAM,EAAE,QAAQA;AAGhB,QAAI,KAAK;AACP,WAAK,QAAQ,IAAI,KAAKA,OAAM;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,QAAQA,SAAkC;AACxC,SAAK,QAAQ,OAAOA,QAAO,GAAI;AAAA,EACjC;AAAA,EAEA,UAAU;AACR,UAAM,UAAU,KAAK;AAErB,eAAWA,WAAU,KAAK,cAAc;AACtC,UAAIA,QAAO,eAAe,GAAG;AAC3B,gBAAQ,OAAOA,QAAO,GAAI;AAAA,MAC5B;AAAA,IACF;AAEA,SAAK,mCAAmB,IAAA;AAAA,EAC1B;AACF;AAEA,IAAI,eAAe,IAAI,YAAY,EAAE;AAE9B,MAAM,iBAAiB,MAAM;AAClC,SAAO;AACT;AAEO,SAAS,kBAA0C,UAAqC;AAC7F,eAAa,YAAY,QAA6C;AACxE;AAEO,MAAM,sBAAsB,MAAM;AACvC,iBAAe,IAAI,YAAY,EAAE;AACnC;AAEA,IAAI;AAEG,MAAM,kBAAkB,CAAC,UAAmC;AACjE,kBAAgB;AAClB;AAEO,MAAM,0BAA0B,MAAM;AAC3C,SAAO;AACT;AAEO,MAAM,kBAAkB,CAAC,WAAW,iBAA8B;AACvE,SAAO,iBAAiB,sBAAsB,SAAS;AACzD;AAIA,MAAM,sCAAsB,QAAA;AAC5B,MAAM,sCAAsB,QAAA;AAErB,MAAM,gBAAgB,CAAC,KAAa,gBAAwB;AACjE,MAAI,gBAAgB,IAAI,GAAG,GAAG;AAC5B,UAAM,IAAI,MAAM,4DAA4D;AAAA,EAC9E;AAEA,kBAAgB,IAAI,KAAK,WAAW;AACtC;AAEA,MAAM,kBAAkB,CAAC,QAA6B;AACpD,QAAM,QAAQ,gBAAgB,IAAI,GAAG;AAErC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,uFAAuF;AAAA,EACzG;AAEA,QAAM,QAAQ,gBAAgB,IAAI,KAAK,KAAK,gBAAgB,KAAK;AAEjE,kBAAgB,IAAI,KAAK,KAAK;AAE9B,SAAO;AACT;AAEO,MAAM,gBAAgB,CAAC,QAA6B;AACzD,MAAI,QAAQ,gBAAgB,IAAI,GAAG;AAEnC,MAAI,CAAC,OAAO;AACV,YAAQ,gBAAgB,GAAG;AAAA,EAC7B;AAEA,SAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
const contexts = require("./contexts-
|
|
2
|
+
const contexts = require("./contexts-DoZWv_3I.js");
|
|
3
3
|
const DERIVED_DEFINITION_MAP = /* @__PURE__ */ new Map();
|
|
4
4
|
function getReactiveFnAndDefinition(fn, opts) {
|
|
5
5
|
let fnAndDef = DERIVED_DEFINITION_MAP.get(fn);
|
|
@@ -52,4 +52,4 @@ exports.reactiveSignal = reactiveSignal;
|
|
|
52
52
|
exports.relay = relay;
|
|
53
53
|
exports.task = task;
|
|
54
54
|
exports.watcher = watcher;
|
|
55
|
-
//# sourceMappingURL=core-api-
|
|
55
|
+
//# sourceMappingURL=core-api-CUviCxtM.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core-api-
|
|
1
|
+
{"version":3,"file":"core-api-CUviCxtM.js","sources":["../../../src/internals/core-api.ts"],"sourcesContent":["import {\n ReactiveTask,\n ReactiveValue,\n Watcher,\n ReactiveOptions,\n RelayActivate,\n type DiscriminatedReactivePromise,\n SignalOptions,\n ReactiveFn,\n ReadonlySignal,\n} from '../types.js';\nimport { getCurrentScope, getScopeOwner, SignalScope } from './contexts.js';\nimport {\n createReactiveDefinition,\n createReactiveSignal,\n ReactiveDefinition as ReactiveDefinition,\n} from './reactive.js';\nimport { createRelay, createTask } from './async.js';\nimport { Tracer } from './trace.js';\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const DERIVED_DEFINITION_MAP = new Map<Function, [(...args: any) => any, ReactiveDefinition<any, any>]>();\n\nexport function getReactiveFnAndDefinition<T, Args extends unknown[]>(\n fn: (...args: Args) => T,\n opts?: ReactiveOptions<T, Args>,\n): [(...args: Args) => ReactiveValue<T>, ReactiveDefinition<T, Args>] {\n let fnAndDef = DERIVED_DEFINITION_MAP.get(fn);\n\n if (!fnAndDef) {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, opts?.paramKey, undefined);\n\n const defScope = getCurrentScope();\n\n const reactiveFn: ReactiveFn<T, Args> = (...args) => {\n const scope = getCurrentScope(defScope);\n const signal = scope.get(def, args as any);\n\n return signal.value;\n };\n\n fnAndDef = [reactiveFn, def];\n\n DERIVED_DEFINITION_MAP.set(fn, fnAndDef);\n }\n\n return fnAndDef;\n}\n\nexport function reactive<T, Args extends unknown[]>(\n fn: (...args: Args) => T,\n opts?: ReactiveOptions<T, Args>,\n): ReactiveFn<T, Args> {\n return getReactiveFnAndDefinition(fn, opts)[0];\n}\n\nexport const reactiveMethod = <T, Args extends unknown[]>(\n owner: object,\n fn: (...args: Args) => T,\n opts?: ReactiveOptions<T, Args>,\n): ReactiveFn<T, Args> => {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, opts?.paramKey, undefined);\n\n const reactiveFn: ReactiveFn<T, Args> = (...args) => {\n return getScopeOwner(owner).get(def, args as any).value;\n };\n\n DERIVED_DEFINITION_MAP.set(reactiveFn, [reactiveFn, def]);\n\n return reactiveFn;\n};\n\nexport function relay<T>(activate: RelayActivate<T>, opts?: SignalOptions<T>): DiscriminatedReactivePromise<T> {\n const scope = getCurrentScope();\n\n return createRelay(activate, scope, opts) as DiscriminatedReactivePromise<T>;\n}\n\nexport const task = <T, Args extends unknown[]>(\n fn: (...args: Args) => Promise<T>,\n opts?: SignalOptions<T>,\n): ReactiveTask<T, Args> => {\n const scope = getCurrentScope();\n\n return createTask(fn, scope, opts);\n};\n\nexport function watcher<T>(fn: () => T, opts?: SignalOptions<T> & { isolate?: boolean; tracer?: Tracer }): Watcher<T> {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, undefined, opts?.tracer);\n\n const scope = opts?.isolate ? new SignalScope([]) : getCurrentScope();\n\n return createReactiveSignal(def, undefined, undefined, scope);\n}\n\n/**\n * Creates a reactive signal from a compute function. This is useful for when you\n * want to create a signal that does not receive parameters, but is still reactive.\n *\n * @param compute\n * @param opts\n * @returns\n */\nexport const reactiveSignal = <T>(\n compute: () => T,\n opts?: SignalOptions<T> & { isolate?: boolean },\n): ReadonlySignal<T> => {\n const def = createReactiveDefinition(opts?.id, opts?.desc, compute, opts?.equals, false, undefined, undefined);\n\n const scope = opts?.isolate ? new SignalScope([]) : getCurrentScope();\n\n return createReactiveSignal(def, undefined, undefined, scope);\n};\n"],"names":["createReactiveDefinition","getCurrentScope","getScopeOwner","createRelay","createTask","SignalScope","createReactiveSignal"],"mappings":";;AAqBO,MAAM,6CAA6B,IAAA;AAEnC,SAAS,2BACd,IACA,MACoE;AACpE,MAAI,WAAW,uBAAuB,IAAI,EAAE;AAE5C,MAAI,CAAC,UAAU;AACb,UAAM,MAAMA,SAAAA,yBAAyB,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,OAAO,MAAM,UAAU,MAAS;AAE7G,UAAM,WAAWC,SAAAA,gBAAA;AAEjB,UAAM,aAAkC,IAAI,SAAS;AACnD,YAAM,QAAQA,SAAAA,gBAAgB,QAAQ;AACtC,YAAM,SAAS,MAAM,IAAI,KAAK,IAAW;AAEzC,aAAO,OAAO;AAAA,IAChB;AAEA,eAAW,CAAC,YAAY,GAAG;AAE3B,2BAAuB,IAAI,IAAI,QAAQ;AAAA,EACzC;AAEA,SAAO;AACT;AAEO,SAAS,SACd,IACA,MACqB;AACrB,SAAO,2BAA2B,IAAI,IAAI,EAAE,CAAC;AAC/C;AAEO,MAAM,iBAAiB,CAC5B,OACA,IACA,SACwB;AACxB,QAAM,MAAMD,SAAAA,yBAAyB,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,OAAO,MAAM,UAAU,MAAS;AAE7G,QAAM,aAAkC,IAAI,SAAS;AACnD,WAAOE,SAAAA,cAAc,KAAK,EAAE,IAAI,KAAK,IAAW,EAAE;AAAA,EACpD;AAEA,yBAAuB,IAAI,YAAY,CAAC,YAAY,GAAG,CAAC;AAExD,SAAO;AACT;AAEO,SAAS,MAAS,UAA4B,MAA0D;AAC7G,QAAM,QAAQD,SAAAA,gBAAA;AAEd,SAAOE,qBAAY,UAAU,OAAO,IAAI;AAC1C;AAEO,MAAM,OAAO,CAClB,IACA,SAC0B;AAC1B,QAAM,QAAQF,SAAAA,gBAAA;AAEd,SAAOG,oBAAW,IAAI,OAAO,IAAI;AACnC;AAEO,SAAS,QAAW,IAAa,MAA8E;AACpH,QAAM,MAAMJ,SAAAA,yBAAyB,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,OAAO,QAAW,MAAM,MAAM;AAE3G,QAAM,QAAQ,MAAM,UAAU,IAAIK,SAAAA,YAAY,CAAA,CAAE,IAAIJ,yBAAA;AAEpD,SAAOK,SAAAA,qBAAqB,KAAK,QAAW,QAAW,KAAK;AAC9D;AAUO,MAAM,iBAAiB,CAC5B,SACA,SACsB;AACtB,QAAM,MAAMN,SAAAA,yBAAyB,MAAM,IAAI,MAAM,MAAM,SAAS,MAAM,QAAQ,OAAO,QAAW,MAAS;AAE7G,QAAM,QAAQ,MAAM,UAAU,IAAIK,SAAAA,YAAY,CAAA,CAAE,IAAIJ,yBAAA;AAEpD,SAAOK,SAAAA,qBAAqB,KAAK,QAAW,QAAW,KAAK;AAC9D;;;;;;;;"}
|