@camunda8/orchestration-cluster-api 8.9.0-alpha.21 → 8.9.0-alpha.23
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 +34 -0
- package/README.md +120 -7
- package/dist/{chunk-2N2LUTZ2.js → chunk-KQ4UL2WX.js} +3 -3
- package/dist/chunk-KQ4UL2WX.js.map +1 -0
- package/dist/{chunk-Z5TE7HRA.js → chunk-W7A45XXW.js} +227 -114
- package/dist/chunk-W7A45XXW.js.map +1 -0
- package/dist/fp/index.cjs +222 -111
- package/dist/fp/index.cjs.map +1 -1
- package/dist/fp/index.d.cts +1 -1
- package/dist/fp/index.d.ts +1 -1
- package/dist/fp/index.js +2 -2
- package/dist/{index-ddM18uDQ.d.cts → index-kEPhHRPZ.d.cts} +50 -10
- package/dist/{index-BmDqK0O0.d.ts → index-ofViYvpy.d.ts} +50 -10
- package/dist/index.cjs +250 -139
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +31 -31
- package/dist/index.js.map +1 -1
- package/dist/logger.cjs +2 -2
- package/dist/logger.cjs.map +1 -1
- package/dist/logger.js +1 -1
- package/dist/threadWorkerEntry.cjs +2 -2
- package/dist/threadWorkerEntry.cjs.map +1 -1
- package/dist/threadWorkerEntry.js +2 -2
- package/dist/threadWorkerEntry.js.map +1 -1
- package/package.json +14 -23
- package/dist/chunk-2N2LUTZ2.js.map +0 -1
- package/dist/chunk-Z5TE7HRA.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,37 @@
|
|
|
1
|
+
# [8.9.0-alpha.23](https://github.com/camunda/orchestration-cluster-api-js/compare/v8.9.0-alpha.22...v8.9.0-alpha.23) (2026-03-30)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* address PR review comments ([fd357d5](https://github.com/camunda/orchestration-cluster-api-js/commit/fd357d5938dbb0e22d18711087b26560a802494c))
|
|
7
|
+
* address PR review comments on heritable worker defaults ([efec39c](https://github.com/camunda/orchestration-cluster-api-js/commit/efec39c54c788f625f27f7be70c830321ff43ef6))
|
|
8
|
+
* **config:** add signedInt schema type for CAMUNDA_WORKER_REQUEST_TIMEOUT ([9f9f794](https://github.com/camunda/orchestration-cluster-api-js/commit/9f9f7949e3b1cfcf90ab8abf723595276c41a18d))
|
|
9
|
+
* **tests:** convert threaded handler fixtures to .js for Node 20 compat ([1e5f7b1](https://github.com/camunda/orchestration-cluster-api-js/commit/1e5f7b17931043adade84c7630264a1ed543cf2a))
|
|
10
|
+
* **threadedJobWorker:** extract validated fields to fix TS strict null errors ([7097cbd](https://github.com/camunda/orchestration-cluster-api-js/commit/7097cbde12076b8ba0d35208cedf7ebe1c891493))
|
|
11
|
+
* **threadPool:** don't pass TS strip flags to workers on Node < 22 ([dbf18d3](https://github.com/camunda/orchestration-cluster-api-js/commit/dbf18d3ab92ed1fd5fdf54988c1f613eaf7b09e3))
|
|
12
|
+
* use number types for int config overrides in tests and examples ([f7bfa2f](https://github.com/camunda/orchestration-cluster-api-js/commit/f7bfa2f3d9be5152d4cf9a1ca6d0d4f8c117e14b))
|
|
13
|
+
* wire README worker-defaults examples into snippet injection ([7759561](https://github.com/camunda/orchestration-cluster-api-js/commit/775956168f588dd02bf6e969ed641f3abb67e288))
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
### Features
|
|
17
|
+
|
|
18
|
+
* heritable worker defaults via CAMUNDA_WORKER_* env vars ([0311308](https://github.com/camunda/orchestration-cluster-api-js/commit/03113084fb15566bdf7d3bbb3d0d6e78ef582584))
|
|
19
|
+
|
|
20
|
+
# [8.9.0-alpha.22](https://github.com/camunda/orchestration-cluster-api-js/compare/v8.9.0-alpha.21...v8.9.0-alpha.22) (2026-03-30)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
### Bug Fixes
|
|
24
|
+
|
|
25
|
+
* address PR review comments ([ae51b85](https://github.com/camunda/orchestration-cluster-api-js/commit/ae51b8534239de5bb0ca61c1897dfe89514a740d))
|
|
26
|
+
* address PR review comments on job corrections ([3a82c3a](https://github.com/camunda/orchestration-cluster-api-js/commit/3a82c3a06e25f589ccc9638aba191affa8f25948))
|
|
27
|
+
* address review comments on PR [#85](https://github.com/camunda/orchestration-cluster-api-js/issues/85) ([3d3a810](https://github.com/camunda/orchestration-cluster-api-js/commit/3d3a8109742e6b3fec2e17aecc729565da871ed9))
|
|
28
|
+
* restore 'Later, on shutdown:' comment and fix test formatting ([aed9ba5](https://github.com/camunda/orchestration-cluster-api-js/commit/aed9ba5eb0ed5351da0c1c2a84cf3b40c88f63b5))
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
### Features
|
|
32
|
+
|
|
33
|
+
* support job corrections in worker job.complete() ([790e15d](https://github.com/camunda/orchestration-cluster-api-js/commit/790e15d675ef3fea09c47cb820a1bc960a075ff6))
|
|
34
|
+
|
|
1
35
|
# [8.9.0-alpha.21](https://github.com/camunda/orchestration-cluster-api-js/compare/v8.9.0-alpha.20...v8.9.0-alpha.21) (2026-03-25)
|
|
2
36
|
|
|
3
37
|
|
package/README.md
CHANGED
|
@@ -503,7 +503,7 @@ const worker = client.createJobWorker({
|
|
|
503
503
|
const vars = job.variables; // inferred from Input schema
|
|
504
504
|
console.log(`Processing order: ${vars.orderId}`);
|
|
505
505
|
// Do work...
|
|
506
|
-
return job.complete({
|
|
506
|
+
return job.complete({ processed: true });
|
|
507
507
|
},
|
|
508
508
|
});
|
|
509
509
|
|
|
@@ -542,7 +542,7 @@ client.createJobWorker({
|
|
|
542
542
|
|
|
543
543
|
Your `jobHandler` must ultimately invoke exactly one of:
|
|
544
544
|
|
|
545
|
-
- `job.complete(
|
|
545
|
+
- `job.complete(variables?, result?)` OR `job.complete()`
|
|
546
546
|
- `job.fail({ errorMessage, retries?, retryBackoff? })`
|
|
547
547
|
- `job.cancelWorkflow({})` (cancels the process instance)
|
|
548
548
|
- `job.error({ errorCode, errorMessage? })` (throws a business error)
|
|
@@ -569,9 +569,7 @@ Example patterns:
|
|
|
569
569
|
|
|
570
570
|
```ts
|
|
571
571
|
// GOOD: explicit completion
|
|
572
|
-
return job.complete({
|
|
573
|
-
|
|
574
|
-
// GOOD: No-arg completion example, sentinel stored for ultimate return
|
|
572
|
+
return job.complete({ processed: true }); // sentinel stored for ultimate return
|
|
575
573
|
const ack = await job.complete();
|
|
576
574
|
// ...
|
|
577
575
|
return ack;
|
|
@@ -584,6 +582,58 @@ const ack = await job.ignore();
|
|
|
584
582
|
// No-arg completion example
|
|
585
583
|
```
|
|
586
584
|
|
|
585
|
+
### Job Corrections (User Task Listeners)
|
|
586
|
+
|
|
587
|
+
When a job worker handles a [user task listener](https://docs.camunda.io/docs/components/concepts/user-task-listeners/), it can correct task properties (assignee, due date, candidate groups, etc.) by passing a `result` to `job.complete()`:
|
|
588
|
+
|
|
589
|
+
<!-- snippet:ReadmeJobCorrectionsImport+ReadmeJobCorrections -->
|
|
590
|
+
|
|
591
|
+
```ts
|
|
592
|
+
import type { JobResult } from '@camunda8/orchestration-cluster-api';
|
|
593
|
+
|
|
594
|
+
const worker = client.createJobWorker({
|
|
595
|
+
jobType: 'io.camunda:userTaskListener',
|
|
596
|
+
jobTimeoutMs: 30_000,
|
|
597
|
+
maxParallelJobs: 5,
|
|
598
|
+
jobHandler: async (job) => {
|
|
599
|
+
const result: JobResult = {
|
|
600
|
+
type: 'userTask',
|
|
601
|
+
corrections: {
|
|
602
|
+
assignee: 'corrected-user',
|
|
603
|
+
priority: 80,
|
|
604
|
+
},
|
|
605
|
+
};
|
|
606
|
+
return job.complete({}, result);
|
|
607
|
+
},
|
|
608
|
+
});
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
To deny a task completion (reject the work):
|
|
612
|
+
|
|
613
|
+
<!-- snippet:ReadmeJobCorrectionsDenial -->
|
|
614
|
+
|
|
615
|
+
```ts
|
|
616
|
+
return job.complete(
|
|
617
|
+
{},
|
|
618
|
+
{
|
|
619
|
+
type: 'userTask',
|
|
620
|
+
denied: true,
|
|
621
|
+
deniedReason: 'Insufficient documentation',
|
|
622
|
+
}
|
|
623
|
+
);
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
| Correctable attribute | Type | Clear value |
|
|
627
|
+
|---|---|---|
|
|
628
|
+
| `assignee` | `string` | Empty string `""` |
|
|
629
|
+
| `dueDate` | `string` (ISO 8601) | Empty string `""` |
|
|
630
|
+
| `followUpDate` | `string` (ISO 8601) | Empty string `""` |
|
|
631
|
+
| `candidateUsers` | `string[]` | Empty array `[]` |
|
|
632
|
+
| `candidateGroups` | `string[]` | Empty array `[]` |
|
|
633
|
+
| `priority` | `number` (0–100) | — |
|
|
634
|
+
|
|
635
|
+
Omitting an attribute or passing `null` preserves the persisted value.
|
|
636
|
+
|
|
587
637
|
### Concurrency & Backpressure
|
|
588
638
|
|
|
589
639
|
Set `maxParallelJobs` to the maximum number of jobs you want actively processing concurrently. The worker will long‑poll for up to the remaining capacity each cycle. Global backpressure (adaptive concurrency) still applies to the underlying REST calls; activation itself is a normal operation.
|
|
@@ -643,6 +693,61 @@ client.createJobWorker({
|
|
|
643
693
|
|
|
644
694
|
A value of `0` (the default) means no delay.
|
|
645
695
|
|
|
696
|
+
### Heritable Worker Defaults
|
|
697
|
+
|
|
698
|
+
When running many workers with the same base configuration, you can set global defaults via environment variables (or equivalent keys in `CamundaOptions.config`). These apply to every worker created by the client (both `createJobWorker` and `createThreadedJobWorker`) unless the individual worker config explicitly overrides them.
|
|
699
|
+
|
|
700
|
+
| Environment Variable | Worker Config Field | Type |
|
|
701
|
+
| ------------------------------------------ | -------------------------- | ------ |
|
|
702
|
+
| `CAMUNDA_WORKER_TIMEOUT` | `jobTimeoutMs` | number |
|
|
703
|
+
| `CAMUNDA_WORKER_MAX_CONCURRENT_JOBS` | `maxParallelJobs` | number |
|
|
704
|
+
| `CAMUNDA_WORKER_REQUEST_TIMEOUT` | `pollTimeoutMs` | number |
|
|
705
|
+
| `CAMUNDA_WORKER_NAME` | `workerName` | string |
|
|
706
|
+
| `CAMUNDA_WORKER_STARTUP_JITTER_MAX_SECONDS`| `startupJitterMaxSeconds` | number |
|
|
707
|
+
|
|
708
|
+
**Precedence:** explicit worker config value > `CAMUNDA_WORKER_*` (from environment variables or `CamundaOptions.config` overrides) > hardcoded default (where applicable).
|
|
709
|
+
|
|
710
|
+
Example — set defaults via environment:
|
|
711
|
+
|
|
712
|
+
```bash
|
|
713
|
+
export CAMUNDA_WORKER_TIMEOUT=30000
|
|
714
|
+
export CAMUNDA_WORKER_MAX_CONCURRENT_JOBS=8
|
|
715
|
+
export CAMUNDA_WORKER_NAME=order-service
|
|
716
|
+
```
|
|
717
|
+
|
|
718
|
+
<!-- snippet:ReadmeWorkerDefaultsEnv -->
|
|
719
|
+
```ts
|
|
720
|
+
// Workers inherit timeout, concurrency, and name from environment
|
|
721
|
+
const w1 = client.createJobWorker({
|
|
722
|
+
jobType: 'validate-order',
|
|
723
|
+
jobHandler: async (job) => job.complete(),
|
|
724
|
+
});
|
|
725
|
+
|
|
726
|
+
const w2 = client.createJobWorker({
|
|
727
|
+
jobType: 'ship-order',
|
|
728
|
+
jobHandler: async (job) => job.complete(),
|
|
729
|
+
});
|
|
730
|
+
|
|
731
|
+
// Per-worker override: this worker uses 32 concurrent jobs instead of the global 8
|
|
732
|
+
const w3 = client.createJobWorker({
|
|
733
|
+
jobType: 'bulk-import',
|
|
734
|
+
maxParallelJobs: 32,
|
|
735
|
+
jobHandler: async (job) => job.complete(),
|
|
736
|
+
});
|
|
737
|
+
```
|
|
738
|
+
|
|
739
|
+
You can also pass defaults programmatically via the client constructor:
|
|
740
|
+
|
|
741
|
+
<!-- snippet:ReadmeWorkerDefaultsClient -->
|
|
742
|
+
```ts
|
|
743
|
+
const client = createCamundaClient({
|
|
744
|
+
config: {
|
|
745
|
+
CAMUNDA_WORKER_TIMEOUT: 30000,
|
|
746
|
+
CAMUNDA_WORKER_MAX_CONCURRENT_JOBS: 8,
|
|
747
|
+
},
|
|
748
|
+
});
|
|
749
|
+
```
|
|
750
|
+
|
|
646
751
|
### Receipt Type (Unique Symbol)
|
|
647
752
|
|
|
648
753
|
Action methods return a unique symbol (not a string) to avoid accidental misuse and allow internal metrics. If you store the receipt, annotate its type as `JobActionReceipt` to preserve uniqueness:
|
|
@@ -652,7 +757,7 @@ Action methods return a unique symbol (not a string) to avoid accidental misuse
|
|
|
652
757
|
```ts
|
|
653
758
|
import type { JobActionReceipt } from '@camunda8/orchestration-cluster-api';
|
|
654
759
|
|
|
655
|
-
const receipt: JobActionReceipt = await job.complete({
|
|
760
|
+
const receipt: JobActionReceipt = await job.complete({ processed: true });
|
|
656
761
|
```
|
|
657
762
|
|
|
658
763
|
If you ignore the return value you don’t need to import the symbol.
|
|
@@ -928,6 +1033,14 @@ Notes:
|
|
|
928
1033
|
|
|
929
1034
|
@experimental - this feature is not guaranteed to be tested or stable.
|
|
930
1035
|
|
|
1036
|
+
> **Peer dependency:** `fp-ts` is an optional peer dependency. If you use real `fp-ts` functions
|
|
1037
|
+
> (e.g. `pipe`, `TE.match`) alongside this subpath, install it separately:
|
|
1038
|
+
> ```sh
|
|
1039
|
+
> npm install fp-ts
|
|
1040
|
+
> ```
|
|
1041
|
+
> The `/fp` subpath works without `fp-ts` installed — it exposes structurally-compatible
|
|
1042
|
+
> `Either`/`TaskEither` shapes that interoperate with `fp-ts` but do not require it at runtime.
|
|
1043
|
+
|
|
931
1044
|
The main entry stays minimal. To opt in to a TaskEither-style facade & helper combinators import from the dedicated subpath:
|
|
932
1045
|
|
|
933
1046
|
```ts
|
|
@@ -1392,7 +1505,7 @@ Inject a mock fetch:
|
|
|
1392
1505
|
|
|
1393
1506
|
```ts
|
|
1394
1507
|
const client = createCamundaClient({
|
|
1395
|
-
fetch: async (
|
|
1508
|
+
fetch: async (_input, _init) => new Response(JSON.stringify({ ok: true }), { status: 200 }),
|
|
1396
1509
|
});
|
|
1397
1510
|
```
|
|
1398
1511
|
|
|
@@ -16,7 +16,7 @@ function createLogger(opts = {}) {
|
|
|
16
16
|
return ORDER[currentLevel] >= ORDER[need];
|
|
17
17
|
}
|
|
18
18
|
function evalArgs(args) {
|
|
19
|
-
return args.
|
|
19
|
+
return args.flatMap((a) => typeof a === "function" && a.length === 0 ? a() : a);
|
|
20
20
|
}
|
|
21
21
|
function emit(level, scope, rawArgs) {
|
|
22
22
|
if (!isEnabled(level)) return;
|
|
@@ -44,7 +44,7 @@ function createLogger(opts = {}) {
|
|
|
44
44
|
} else {
|
|
45
45
|
const tag = `[camunda-sdk][${level}]${scope ? `[${scope}]` : ""}`;
|
|
46
46
|
const method = level === "error" ? "error" : level === "warn" ? "warn" : "log";
|
|
47
|
-
console[method](tag, code
|
|
47
|
+
console[method](tag, `${code}:`, msg, data ?? "");
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
const make = (scope) => ({
|
|
@@ -74,4 +74,4 @@ function createLogger(opts = {}) {
|
|
|
74
74
|
export {
|
|
75
75
|
createLogger
|
|
76
76
|
};
|
|
77
|
-
//# sourceMappingURL=chunk-
|
|
77
|
+
//# sourceMappingURL=chunk-KQ4UL2WX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime/logger.ts"],"sourcesContent":["// Per-client logger (no global singleton). Construct via createLogger.\n\n// Added 'silly' for deep diagnostics (unsafe: logs HTTP bodies when enabled elsewhere)\nexport type LogLevel = 'silent' | 'error' | 'warn' | 'info' | 'debug' | 'trace' | 'silly';\nexport interface LogEvent {\n level: LogLevel;\n scope: string;\n ts: number;\n args: any[];\n code?: string;\n data?: any;\n}\nexport type LogTransport = (e: LogEvent) => void;\nconst ORDER: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n trace: 5,\n silly: 6,\n};\n\nexport interface Logger {\n level(): LogLevel;\n setLevel(level: LogLevel): void; // internal use\n setTransport(t?: LogTransport): void; // internal use\n error(...a: any[]): void;\n warn(...a: any[]): void;\n info(...a: any[]): void;\n debug(...a: any[]): void;\n trace(...a: any[]): void;\n silly(...a: any[]): void;\n scope(child: string): Logger;\n code(level: LogLevel, code: string, msg: string, data?: any): void;\n}\n\nexport interface CreateLoggerOptions {\n level?: LogLevel;\n transport?: LogTransport;\n scope?: string;\n}\n\nexport function createLogger(opts: CreateLoggerOptions = {}): Logger {\n let currentLevel: LogLevel = opts.level || 'error';\n let transport: LogTransport | undefined = opts.transport;\n const baseScope = opts.scope || '';\n\n function isEnabled(need: LogLevel) {\n return ORDER[currentLevel] >= ORDER[need];\n }\n function evalArgs(args: any[]): any[] {\n // Support lazy function args: if an arg is a function with zero arity, call it.\n return args.flatMap((a) => (typeof a === 'function' && a.length === 0 ? a() : a));\n }\n function emit(level: LogLevel, scope: string, rawArgs: any[]) {\n if (!isEnabled(level)) return;\n const args = evalArgs(rawArgs);\n const evt: LogEvent = { level, scope, ts: Date.now(), args };\n if (transport) {\n try {\n transport(evt);\n } catch {\n /* ignore transport errors */\n }\n } else {\n const tag = `[camunda-sdk][${level}]${scope ? `[${scope}]` : ''}`;\n const method = level === 'error' ? 'error' : level === 'warn' ? 'warn' : 'log';\n\n console[method](tag, ...args);\n }\n }\n function emitCode(level: LogLevel, scope: string, code: string, msg: string, data?: any) {\n if (!isEnabled(level)) return;\n const evt: LogEvent = { level, scope, ts: Date.now(), args: [msg], code, data };\n if (transport) {\n try {\n transport(evt);\n } catch {}\n } else {\n const tag = `[camunda-sdk][${level}]${scope ? `[${scope}]` : ''}`;\n const method = level === 'error' ? 'error' : level === 'warn' ? 'warn' : 'log';\n\n console[method](tag, `${code}:`, msg, data ?? '');\n }\n }\n const make = (scope: string): Logger => ({\n level: () => currentLevel,\n setLevel(l: LogLevel) {\n currentLevel = l;\n },\n setTransport(t?: LogTransport) {\n transport = t;\n },\n error: (...a: any[]) => emit('error', scope, a),\n warn: (...a: any[]) => emit('warn', scope, a),\n info: (...a: any[]) => emit('info', scope, a),\n debug: (...a: any[]) => emit('debug', scope, a),\n trace: (...a: any[]) => emit('trace', scope, a),\n silly: (...a: any[]) => emit('silly', scope, a),\n scope(child: string) {\n return make(scope ? `${scope}:${child}` : child);\n },\n code(l: LogLevel, code: string, msg: string, data?: any) {\n emitCode(l, scope, code, msg, data);\n },\n });\n return make(baseScope);\n}\n"],"mappings":";AAaA,IAAM,QAAkC;AAAA,EACtC,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AACT;AAsBO,SAAS,aAAa,OAA4B,CAAC,GAAW;AACnE,MAAI,eAAyB,KAAK,SAAS;AAC3C,MAAI,YAAsC,KAAK;AAC/C,QAAM,YAAY,KAAK,SAAS;AAEhC,WAAS,UAAU,MAAgB;AACjC,WAAO,MAAM,YAAY,KAAK,MAAM,IAAI;AAAA,EAC1C;AACA,WAAS,SAAS,MAAoB;AAEpC,WAAO,KAAK,QAAQ,CAAC,MAAO,OAAO,MAAM,cAAc,EAAE,WAAW,IAAI,EAAE,IAAI,CAAE;AAAA,EAClF;AACA,WAAS,KAAK,OAAiB,OAAe,SAAgB;AAC5D,QAAI,CAAC,UAAU,KAAK,EAAG;AACvB,UAAM,OAAO,SAAS,OAAO;AAC7B,UAAM,MAAgB,EAAE,OAAO,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK;AAC3D,QAAI,WAAW;AACb,UAAI;AACF,kBAAU,GAAG;AAAA,MACf,QAAQ;AAAA,MAER;AAAA,IACF,OAAO;AACL,YAAM,MAAM,iBAAiB,KAAK,IAAI,QAAQ,IAAI,KAAK,MAAM,EAAE;AAC/D,YAAM,SAAS,UAAU,UAAU,UAAU,UAAU,SAAS,SAAS;AAEzE,cAAQ,MAAM,EAAE,KAAK,GAAG,IAAI;AAAA,IAC9B;AAAA,EACF;AACA,WAAS,SAAS,OAAiB,OAAe,MAAc,KAAa,MAAY;AACvF,QAAI,CAAC,UAAU,KAAK,EAAG;AACvB,UAAM,MAAgB,EAAE,OAAO,OAAO,IAAI,KAAK,IAAI,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,KAAK;AAC9E,QAAI,WAAW;AACb,UAAI;AACF,kBAAU,GAAG;AAAA,MACf,QAAQ;AAAA,MAAC;AAAA,IACX,OAAO;AACL,YAAM,MAAM,iBAAiB,KAAK,IAAI,QAAQ,IAAI,KAAK,MAAM,EAAE;AAC/D,YAAM,SAAS,UAAU,UAAU,UAAU,UAAU,SAAS,SAAS;AAEzE,cAAQ,MAAM,EAAE,KAAK,GAAG,IAAI,KAAK,KAAK,QAAQ,EAAE;AAAA,IAClD;AAAA,EACF;AACA,QAAM,OAAO,CAAC,WAA2B;AAAA,IACvC,OAAO,MAAM;AAAA,IACb,SAAS,GAAa;AACpB,qBAAe;AAAA,IACjB;AAAA,IACA,aAAa,GAAkB;AAC7B,kBAAY;AAAA,IACd;AAAA,IACA,OAAO,IAAI,MAAa,KAAK,SAAS,OAAO,CAAC;AAAA,IAC9C,MAAM,IAAI,MAAa,KAAK,QAAQ,OAAO,CAAC;AAAA,IAC5C,MAAM,IAAI,MAAa,KAAK,QAAQ,OAAO,CAAC;AAAA,IAC5C,OAAO,IAAI,MAAa,KAAK,SAAS,OAAO,CAAC;AAAA,IAC9C,OAAO,IAAI,MAAa,KAAK,SAAS,OAAO,CAAC;AAAA,IAC9C,OAAO,IAAI,MAAa,KAAK,SAAS,OAAO,CAAC;AAAA,IAC9C,MAAM,OAAe;AACnB,aAAO,KAAK,QAAQ,GAAG,KAAK,IAAI,KAAK,KAAK,KAAK;AAAA,IACjD;AAAA,IACA,KAAK,GAAa,MAAc,KAAa,MAAY;AACvD,eAAS,GAAG,OAAO,MAAM,KAAK,IAAI;AAAA,IACpC;AAAA,EACF;AACA,SAAO,KAAK,SAAS;AACvB;","names":[]}
|