@homeflare/alchemy 0.35.0 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/README.md +14 -0
  2. package/dist/argocd/cluster.d.ts +102 -0
  3. package/dist/argocd/cluster.d.ts.map +1 -0
  4. package/dist/argocd/credentials.d.ts +37 -0
  5. package/dist/argocd/credentials.d.ts.map +1 -0
  6. package/dist/argocd/fake-argocd.d.ts +42 -0
  7. package/dist/argocd/fake-argocd.d.ts.map +1 -0
  8. package/dist/argocd/git-credentials.d.ts +29 -0
  9. package/dist/argocd/git-credentials.d.ts.map +1 -0
  10. package/dist/argocd/index.d.ts +19 -0
  11. package/dist/argocd/index.d.ts.map +1 -0
  12. package/dist/argocd/index.js +306 -0
  13. package/dist/argocd/index.js.map +17 -0
  14. package/dist/argocd/providers.d.ts +13 -0
  15. package/dist/argocd/providers.d.ts.map +1 -0
  16. package/dist/argocd/repo-creds.d.ts +67 -0
  17. package/dist/argocd/repo-creds.d.ts.map +1 -0
  18. package/dist/argocd/repository.d.ts +87 -0
  19. package/dist/argocd/repository.d.ts.map +1 -0
  20. package/dist/argocd/resource.d.ts +90 -0
  21. package/dist/argocd/resource.d.ts.map +1 -0
  22. package/dist/cloudflare/index.js +4 -4
  23. package/dist/cloudflare/index.js.map +3 -3
  24. package/dist/cloudflare/r2-bucket-lock.d.ts +14 -5
  25. package/dist/cloudflare/r2-bucket-lock.d.ts.map +1 -1
  26. package/dist/grafana/index.d.ts +5 -4
  27. package/dist/grafana/index.d.ts.map +1 -1
  28. package/dist/grafana/index.js +204 -90
  29. package/dist/grafana/index.js.map +7 -4
  30. package/dist/grafana/notification-policy-drop-warning.d.ts +27 -0
  31. package/dist/grafana/notification-policy-drop-warning.d.ts.map +1 -0
  32. package/dist/grafana/notification-policy-fixtures.d.ts +34 -0
  33. package/dist/grafana/notification-policy-fixtures.d.ts.map +1 -0
  34. package/dist/grafana/notification-policy-model.d.ts +53 -0
  35. package/dist/grafana/notification-policy-model.d.ts.map +1 -0
  36. package/dist/grafana/notification-policy.d.ts +57 -0
  37. package/dist/grafana/notification-policy.d.ts.map +1 -0
  38. package/dist/grafana/providers.d.ts +1 -1
  39. package/dist/grafana/providers.d.ts.map +1 -1
  40. package/dist/litellm/index.js.map +2 -2
  41. package/dist/litellm/operations.d.ts.map +1 -1
  42. package/dist/proxmox/ceph-daemon-form.d.ts +4 -5
  43. package/dist/proxmox/ceph-daemon-form.d.ts.map +1 -1
  44. package/dist/proxmox/ceph-daemon-wire.d.ts +33 -0
  45. package/dist/proxmox/ceph-daemon-wire.d.ts.map +1 -0
  46. package/dist/proxmox/ceph-daemon.d.ts +35 -0
  47. package/dist/proxmox/ceph-daemon.d.ts.map +1 -1
  48. package/dist/proxmox/ceph-fs-distilled.d.ts +14 -0
  49. package/dist/proxmox/ceph-fs-distilled.d.ts.map +1 -0
  50. package/dist/proxmox/ceph-fs-wire.d.ts +20 -11
  51. package/dist/proxmox/ceph-fs-wire.d.ts.map +1 -1
  52. package/dist/proxmox/ceph-fs.d.ts +31 -6
  53. package/dist/proxmox/ceph-fs.d.ts.map +1 -1
  54. package/dist/proxmox/ceph-osd-tree.d.ts +12 -3
  55. package/dist/proxmox/ceph-osd-tree.d.ts.map +1 -1
  56. package/dist/proxmox/ceph-osd-write.d.ts +17 -2
  57. package/dist/proxmox/ceph-osd-write.d.ts.map +1 -1
  58. package/dist/proxmox/ceph-osd.d.ts +6 -0
  59. package/dist/proxmox/ceph-osd.d.ts.map +1 -1
  60. package/dist/proxmox/ceph-pool-settle.d.ts +10 -4
  61. package/dist/proxmox/ceph-pool-settle.d.ts.map +1 -1
  62. package/dist/proxmox/ceph-pool-wire.d.ts +46 -0
  63. package/dist/proxmox/ceph-pool-wire.d.ts.map +1 -0
  64. package/dist/proxmox/ceph-pool.d.ts +10 -5
  65. package/dist/proxmox/ceph-pool.d.ts.map +1 -1
  66. package/dist/proxmox/group-wire.d.ts +1 -1
  67. package/dist/proxmox/group-wire.d.ts.map +1 -1
  68. package/dist/proxmox/index.js +611 -477
  69. package/dist/proxmox/index.js.map +15 -12
  70. package/dist/proxmox/storage-wire.d.ts +8 -1
  71. package/dist/proxmox/storage-wire.d.ts.map +1 -1
  72. package/dist/proxmox/user-wire.d.ts +1 -1
  73. package/dist/proxmox/user-wire.d.ts.map +1 -1
  74. package/docs/argocd-kubernetes.md +100 -0
  75. package/docs/argocd.md +139 -0
  76. package/docs/credentials.md +9 -0
  77. package/docs/grafana-alerting.md +3 -2
  78. package/docs/grafana-notification-policy.md +127 -0
  79. package/docs/grafana.md +12 -8
  80. package/docs/litellm.md +17 -0
  81. package/docs/peers.md +7 -0
  82. package/docs/unifi.md +45 -0
  83. package/docs/upstream-conformance.md +19 -5
  84. package/package.json +8 -3
  85. package/src/argocd/cluster.test.ts +120 -0
  86. package/src/argocd/cluster.ts +222 -0
  87. package/src/argocd/credentials.ts +38 -0
  88. package/src/argocd/fake-argocd.ts +60 -0
  89. package/src/argocd/git-credentials.ts +71 -0
  90. package/src/argocd/index.ts +40 -0
  91. package/src/argocd/providers.ts +17 -0
  92. package/src/argocd/repo-creds.test.ts +123 -0
  93. package/src/argocd/repo-creds.ts +115 -0
  94. package/src/argocd/repository.test.ts +167 -0
  95. package/src/argocd/repository.ts +165 -0
  96. package/src/argocd/resource.ts +150 -0
  97. package/src/cloudflare/r2-bucket-lock.test.ts +54 -18
  98. package/src/cloudflare/r2-bucket-lock.ts +25 -18
  99. package/src/grafana/index.ts +11 -4
  100. package/src/grafana/notification-policy-drop-warning.test.ts +163 -0
  101. package/src/grafana/notification-policy-drop-warning.ts +60 -0
  102. package/src/grafana/notification-policy-fixtures.ts +27 -0
  103. package/src/grafana/notification-policy-model.test.ts +104 -0
  104. package/src/grafana/notification-policy-model.ts +100 -0
  105. package/src/grafana/notification-policy-refusals.test.ts +119 -0
  106. package/src/grafana/notification-policy.test.ts +86 -0
  107. package/src/grafana/notification-policy.ts +191 -0
  108. package/src/grafana/providers.ts +2 -0
  109. package/src/litellm/operations.ts +8 -4
  110. package/src/proxmox/ceph-daemon-form.ts +7 -8
  111. package/src/proxmox/ceph-daemon-wire.ts +115 -0
  112. package/src/proxmox/ceph-daemon-write.test.ts +158 -0
  113. package/src/proxmox/ceph-daemon.ts +65 -47
  114. package/src/proxmox/ceph-fs-delete.test.ts +81 -0
  115. package/src/proxmox/ceph-fs-distilled.ts +102 -0
  116. package/src/proxmox/ceph-fs-wire.ts +17 -31
  117. package/src/proxmox/ceph-fs-write.test.ts +67 -0
  118. package/src/proxmox/ceph-fs.ts +66 -69
  119. package/src/proxmox/ceph-osd-tree.ts +14 -5
  120. package/src/proxmox/ceph-osd-write.test.ts +61 -0
  121. package/src/proxmox/ceph-osd-write.ts +33 -6
  122. package/src/proxmox/ceph-osd.ts +6 -0
  123. package/src/proxmox/ceph-pool-settle.ts +13 -7
  124. package/src/proxmox/ceph-pool-wire.ts +110 -0
  125. package/src/proxmox/ceph-pool-write.test.ts +145 -0
  126. package/src/proxmox/ceph-pool.ts +87 -98
  127. package/src/proxmox/distilled-task-await.test.ts +0 -124
@@ -0,0 +1,46 @@
1
+ /**
2
+ * `Proxmox.CephPool`'s distilled wire lane: the status read, and the two request translations.
3
+ *
4
+ * ★ SPLIT OUT OF ceph-pool-form.ts FOR THE 250-LINE CAP (that file is already near it) — the seam
5
+ * is "touches the cluster or not", the same one ceph-pool-form.ts itself draws against
6
+ * ceph-pool.ts. Nothing in ceph-pool-form.ts changed: `createBody`/`updateBody` still build the
7
+ * PVE form, unaware distilled exists: this file is the ONLY place that translates one into a
8
+ * typed distilled request.
9
+ *
10
+ * ⛔ ONE READ FUNCTION, NOT THE readXOrFail/foldingX PAIR user.ts/group.ts/storage.ts/zfs-pool.ts/
11
+ * node-network-wire.ts CARRY. THIS IS A DELIBERATE, MEASURED DIFFERENCE, NOT AN OVERSIGHT. Those
12
+ * families were BUILT with (or later given, after the NodeNetwork adversarial review) the
13
+ * dual-path pattern because their `diff`/`read` hooks needed to tell "genuinely absent" apart
14
+ * from "a transient failure" at specific call sites. CephPool's PRE-MIGRATION behaviour never
15
+ * had that distinction: `resource.ts`'s generic `pveOperations.read` — what `ops.read`/`ops.diff`
16
+ * called before this PR — folds EVERY failure into `undefined` unconditionally
17
+ * (`Effect.orElseSucceed(() => undefined)`, no `output`-branching, checked directly against
18
+ * `resource.ts` 2026-09-24). This migration's own rule is that every existing refusal and guard
19
+ * survives byte-for-byte — not that it gets upgraded on the way past. `readPoolStatus` below
20
+ * reproduces that exact single-fold shape; it does not add the newer pattern.
21
+ * ⚠️ WORTH A LATER, SEPARATELY-SCOPED DECISION: this means CephPool (like CephDaemon) still folds
22
+ * a refused OpenBao mint into "absent" too, same as every other pre-`unreadable-read.ts` family
23
+ * — the cries-wolf class `Proxmox.NodeNetwork`/`Proxmox.ZfsPool`/`Proxmox.Storage` were fixed
24
+ * against. Noted here rather than fixed here, since fixing it is a behaviour change this PR's
25
+ * own rules do not ask for.
26
+ */
27
+ import * as nodes from '@distilled.cloud/proxmox/nodes';
28
+ import * as Effect from 'effect/Effect';
29
+ import { type CephPoolAttributes, type CephPoolProps } from './ceph-pool-form.ts';
30
+ /**
31
+ * The live pool, or `undefined` — folds every failure, exactly as `ops.read` did. Used by `read`,
32
+ * `diff` (via `ceph-pool.ts`'s own hand-written `reconcile`, which predates the factory) and
33
+ * `settle` (ceph-pool-settle.ts) alike, matching the ONE-function shape this family had before.
34
+ *
35
+ * ⛔ `verbose=1` IS WHAT MAKES `applications` VISIBLE AT ALL — ceph-pool.ts's own header has the
36
+ * measured reason and the cost (two extra, unguarded mon commands PVE runs to answer it).
37
+ */
38
+ export declare const readPoolStatus: (props: CephPoolProps) => Effect.Effect<CephPoolAttributes | undefined, never, import("effect/unstable/http/HttpClient").HttpClient>;
39
+ /** The two endpoints, as the keys `guardWrite` (distilled-guard.ts) checks both forms against. */
40
+ export declare const CEPH_POOL_CREATE = "pve:POST /nodes/{node}/ceph/pool";
41
+ export declare const CEPH_POOL_UPDATE = "pve:PUT /nodes/{node}/ceph/pool/{name}";
42
+ /** The actual `createNodeCephPool` call body — `createBody`, translated. No field is renamed. */
43
+ export declare const toDistilledCreate: (props: CephPoolProps) => nodes.CreateNodeCephPoolRequest;
44
+ /** The actual `putNodeCephPool` call body — `updateBody`, translated. No field is renamed. */
45
+ export declare const toDistilledUpdate: (props: CephPoolProps) => nodes.PutNodeCephPoolRequest;
46
+ //# sourceMappingURL=ceph-pool-wire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ceph-pool-wire.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-pool-wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,KAAK,KAAK,MAAM,gCAAgC,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAKnB,MAAM,qBAAqB,CAAC;AAqC7B;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,UAAW,aAAa,+GAShD,CAAC;AAEJ,kGAAkG;AAClG,eAAO,MAAM,gBAAgB,qCAAqC,CAAC;AACnE,eAAO,MAAM,gBAAgB,2CAA2C,CAAC;AAEzE,iGAAiG;AACjG,eAAO,MAAM,iBAAiB,UAAW,aAAa,KAAG,KAAK,CAAC,yBAIb,CAAC;AAEnD,8FAA8F;AAC9F,eAAO,MAAM,iBAAiB,UAAW,aAAa,KAAG,KAAK,CAAC,sBAKhB,CAAC"}
@@ -5,11 +5,16 @@
5
5
  * ⛔ IT DOES NOT USE `pveHandlers`, AND THE REASON IS MEASURED RATHER THAN STYLISTIC: THE READ AND
6
6
  * THE WRITES SIT AT DIFFERENT PATHS. `GET /nodes/{node}/ceph/pool/{name}` is `poolindex` and
7
7
  * answers `[{"name":"status"}]` — an INDEX OF CHILDREN, not the pool. The pool is one level
8
- * further down, at `.../status` (`getpool`), which accepts no PUT and no DELETE. A `PveSpec`
9
- * carries ONE `path` for read, update and delete, so this family cannot be spelled in it. `path`
10
- * below is therefore the READ path and nothing else consumes it: `ops.reconcile` and
11
- * `ops.destroy` go unused and the two write handlers name their own path. acl.ts is the
12
- * precedent for hand-writing the five handlers over `pveOperations`.
8
+ * further down, at `.../status` (`getpool`), which accepts no PUT and no DELETE. Every handler
9
+ * below is hand-written for that reason, on `client.ts` and now on distilled alike — acl.ts is
10
+ * the precedent for hand-writing over the factory.
11
+ *
12
+ * ★ MIGRATED OFF `client.ts`'s generic `pve()` ONTO `@distilled.cloud/proxmox`'s typed
13
+ * `nodes.getNodeCephPoolStatus`/`createNodeCephPool`/`putNodeCephPool`/`deleteNodeCephPool`/
14
+ * `listNodeCephPool` (2026-09-24, decision 43's walk-down, 2c). `distilled-pve.ts`'s `runPve`
15
+ * replaces `pve()`; `readPoolStatus` (ceph-pool-wire.ts) keeps the SAME single-fold shape this
16
+ * family always had — see that file's own header for why this migration does not also add the
17
+ * newer dual-path pattern `Proxmox.NodeNetwork` carries.
13
18
  *
14
19
  * ⛔ A CREATE FIRED AT A POOL THAT ALREADY EXISTS IS NOT A NO-OP, IT IS A PG MERGE — the second ⛔
15
20
  * in ceph-pool-form.ts has the evidence, and `confirmAbsent` below is the guard that stops it.
@@ -1 +1 @@
1
- {"version":3,"file":"ceph-pool.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EASnB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,KAAK,eAAe,EAA+B,MAAM,eAAe,CAAC;AAIlF,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,CAAC;AAElD,MAAM,WAAW,eAAgB,SAAQ,QAAQ,CAC/C,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,kGAAkG;AAClG,eAAO,MAAM,eAAe,kDAE1B,CAAC;AAsEH,eAAO,MAAM,uBAAuB,qIAuFjC,CAAC"}
1
+ {"version":3,"file":"ceph-pool.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAG7C,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAMnB,MAAM,qBAAqB,CAAC;AAW7B,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAGrD,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,CAAC;AAElD,MAAM,WAAW,eAAgB,SAAQ,QAAQ,CAC/C,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,kGAAkG;AAClG,eAAO,MAAM,eAAe,kDAE1B,CAAC;AAqBH,eAAO,MAAM,uBAAuB,qIAkHjC,CAAC"}
@@ -48,7 +48,7 @@ export declare const matches: (attributes: GroupAttributes, props: GroupProps) =
48
48
  * release that does answer `{}`, but this function is what actually carries the "not found"
49
49
  * case, as a thrown error — `readGroup` below is the one that folds it.
50
50
  */
51
- export declare const readGroupOrFail: (props: GroupProps) => Effect.Effect<typeof UNREADABLE | GroupAttributes | undefined, import("@distilled.cloud/caddy").BadGateway | import("@distilled.cloud/caddy").BadRequest | import("@distilled.cloud/caddy").ConfigError | Error | import("@distilled.cloud/caddy").GatewayTimeout | import("effect/unstable/http/HttpClientError").HttpClientError | import("@distilled.cloud/caddy").InternalServerError | import("@distilled.cloud/proxmox/Errors").ParameterVerificationFailed | import("@distilled.cloud/proxmox/Errors").ProxmoxParseError | import("./distilled-pve.ts").PveClusterExhausted | import("@distilled.cloud/caddy").ServiceUnavailable | import("effect/Cause").TimeoutError | import("@distilled.cloud/caddy").TooManyRequests | import("@distilled.cloud/caddy").Unauthorized | import("@distilled.cloud/proxmox/Errors").UnknownProxmoxError, import("effect/unstable/http/HttpClient").HttpClient>;
51
+ export declare const readGroupOrFail: (props: GroupProps) => Effect.Effect<typeof UNREADABLE | GroupAttributes | undefined, import("@distilled.cloud/caddy").BadGateway | import("@distilled.cloud/caddy").BadRequest | import("@distilled.cloud/caddy").ConfigError | Error | import("@distilled.cloud/caddy").GatewayTimeout | access.GroupNotFound | import("effect/unstable/http/HttpClientError").HttpClientError | import("@distilled.cloud/caddy").InternalServerError | import("@distilled.cloud/proxmox/Errors").ParameterVerificationFailed | import("@distilled.cloud/proxmox/Errors").ProxmoxParseError | import("./distilled-pve.ts").PveClusterExhausted | import("@distilled.cloud/caddy").ServiceUnavailable | import("effect/Cause").TimeoutError | import("@distilled.cloud/caddy").TooManyRequests | import("@distilled.cloud/caddy").Unauthorized | import("@distilled.cloud/proxmox/Errors").UnknownProxmoxError, import("effect/unstable/http/HttpClient").HttpClient>;
52
52
  /**
53
53
  * ⛔ FOLDS A GENUINE READ FAILURE TO `undefined` TOO, AND ONLY `read`/`reconcile` MAY USE IT.
54
54
  * PVE's OWN missing-group answer is a thrown 500 (the ⛔ above), so `reconcile`'s create branch
@@ -1 +1 @@
1
- {"version":3,"file":"group-wire.d.ts","sourceRoot":"","sources":["../../src/proxmox/group-wire.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,MAAM,MAAM,iCAAiC,CAAC;AAC1D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAoB,MAAM,sBAAsB,CAAC;AAGrF,eAAO,MAAM,YAAY,4BAA4B,CAAC;AACtD,eAAO,MAAM,YAAY,qCAAqC,CAAC;AAE/D;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,YAAa,MAAM,GAAG,SAAS,WAGxD,CAAC;AAQF,eAAO,MAAM,UAAU,UAAW,UAAU,KAAG,MAAM,CAAC,wBAGpD,CAAC;AAEH,iGAAiG;AACjG,eAAO,MAAM,UAAU,UAAW,UAAU,KAAG,MAAM,CAAC,qBAGpD,CAAC;AAaH;;;GAGG;AACH,eAAO,MAAM,OAAO,eAAgB,eAAe,SAAS,UAAU,YACjB,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,eAAe,UAAW,UAAU,62BAW9C,CAAC;AAEJ;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,SAAS,UAAW,UAAU,gIACyB,CAAC;AAErE,gGAAgG;AAChG,eAAO,MAAM,cAAc,SAAU,eAAe,GAAG,UAAU,GAAG,SAAS,gCACrC,CAAC"}
1
+ {"version":3,"file":"group-wire.d.ts","sourceRoot":"","sources":["../../src/proxmox/group-wire.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,MAAM,MAAM,iCAAiC,CAAC;AAC1D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAoB,MAAM,sBAAsB,CAAC;AAGrF,eAAO,MAAM,YAAY,4BAA4B,CAAC;AACtD,eAAO,MAAM,YAAY,qCAAqC,CAAC;AAE/D;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,YAAa,MAAM,GAAG,SAAS,WAGxD,CAAC;AAQF,eAAO,MAAM,UAAU,UAAW,UAAU,KAAG,MAAM,CAAC,wBAGpD,CAAC;AAEH,iGAAiG;AACjG,eAAO,MAAM,UAAU,UAAW,UAAU,KAAG,MAAM,CAAC,qBAGpD,CAAC;AAaH;;;GAGG;AACH,eAAO,MAAM,OAAO,eAAgB,eAAe,SAAS,UAAU,YACjB,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,eAAe,UAAW,UAAU,o4BAW9C,CAAC;AAEJ;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,SAAS,UAAW,UAAU,gIACyB,CAAC;AAErE,gGAAgG;AAChG,eAAO,MAAM,cAAc,SAAU,eAAe,GAAG,UAAU,GAAG,SAAS,gCACrC,CAAC"}