@logixjs/sandbox 0.0.1 → 0.0.2

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 (248) hide show
  1. package/LICENSE +201 -0
  2. package/package.json +3 -1
  3. package/public/sandbox/chunks/chunk-2AUQRESB.js +1114 -0
  4. package/public/sandbox/chunks/chunk-2F72LQKW.js +194 -0
  5. package/public/sandbox/chunks/chunk-2PYDGDD3.js +4071 -0
  6. package/public/sandbox/chunks/chunk-2UGKSXDZ.js +16 -0
  7. package/public/sandbox/chunks/chunk-2XVE7F26.js +153 -0
  8. package/public/sandbox/chunks/chunk-3A7TFNZN.js +219 -0
  9. package/public/sandbox/chunks/chunk-3BHC6JAV.js +1070 -0
  10. package/public/sandbox/chunks/chunk-3U4CAKCX.js +61 -0
  11. package/public/sandbox/chunks/chunk-3VU3JLZO.js +272 -0
  12. package/public/sandbox/chunks/chunk-4CPONKWY.js +1170 -0
  13. package/public/sandbox/chunks/chunk-4GMUQTWH.js +850 -0
  14. package/public/sandbox/chunks/chunk-4KIYG5E4.js +749 -0
  15. package/public/sandbox/chunks/chunk-4MY35XR3.js +175 -0
  16. package/public/sandbox/chunks/chunk-5DNHJMHA.js +69 -0
  17. package/public/sandbox/chunks/chunk-5EC4S7X6.js +42 -0
  18. package/public/sandbox/chunks/chunk-5FB7QFSH.js +227 -0
  19. package/public/sandbox/chunks/chunk-5GEYCJW2.js +206 -0
  20. package/public/sandbox/chunks/chunk-5PT7Q5SS.js +373 -0
  21. package/public/sandbox/chunks/chunk-5WN5IGKA.js +166 -0
  22. package/public/sandbox/chunks/chunk-5XOBKSOT.js +213 -0
  23. package/public/sandbox/chunks/chunk-67RVISUC.js +313 -0
  24. package/public/sandbox/chunks/chunk-6ELJEKZS.js +12 -0
  25. package/public/sandbox/chunks/chunk-6FKWRVP4.js +85 -0
  26. package/public/sandbox/chunks/chunk-6JRP52YT.js +34 -0
  27. package/public/sandbox/chunks/chunk-6JYAC3G6.js +42 -0
  28. package/public/sandbox/chunks/chunk-6TUOP63Q.js +86 -0
  29. package/public/sandbox/chunks/{chunk-A6JFUNQQ.js → chunk-74C5VW7Z.js} +2 -2
  30. package/public/sandbox/chunks/chunk-75DQFC5M.js +16 -0
  31. package/public/sandbox/chunks/{chunk-UCFEP3BH.js → chunk-7GPAF2UK.js} +1 -1
  32. package/public/sandbox/chunks/chunk-7KQFTS2Y.js +135 -0
  33. package/public/sandbox/chunks/chunk-7POKWYE3.js +112 -0
  34. package/public/sandbox/chunks/chunk-7VUEF5F3.js +395 -0
  35. package/public/sandbox/chunks/chunk-7W5APZS2.js +77 -0
  36. package/public/sandbox/chunks/chunk-A6OFCXDQ.js +397 -0
  37. package/public/sandbox/chunks/chunk-A7HLOSO6.js +216 -0
  38. package/public/sandbox/chunks/chunk-AGF4RRCB.js +408 -0
  39. package/public/sandbox/chunks/chunk-ASJSJAAL.js +122 -0
  40. package/public/sandbox/chunks/chunk-ASVMK364.js +283 -0
  41. package/public/sandbox/chunks/chunk-AUDTI2BQ.js +895 -0
  42. package/public/sandbox/chunks/chunk-B2SZTA3M.js +16 -0
  43. package/public/sandbox/chunks/chunk-B6YS2UMV.js +372 -0
  44. package/public/sandbox/chunks/chunk-BCEO3MGD.js +244 -0
  45. package/public/sandbox/chunks/chunk-BCOO65D4.js +373 -0
  46. package/public/sandbox/chunks/chunk-BJOWSSEL.js +38 -0
  47. package/public/sandbox/chunks/chunk-BS2WBFW4.js +373 -0
  48. package/public/sandbox/chunks/chunk-BUVHG3NJ.js +439 -0
  49. package/public/sandbox/chunks/chunk-BVE33AN6.js +42 -0
  50. package/public/sandbox/chunks/chunk-BWTGJZVP.js +19 -0
  51. package/public/sandbox/chunks/chunk-BXD7GZC3.js +1025 -0
  52. package/public/sandbox/chunks/chunk-BZH4EUUD.js +164 -0
  53. package/public/sandbox/chunks/{chunk-HFV5GJPK.js → chunk-C2MYMMO4.js} +3 -3
  54. package/public/sandbox/chunks/chunk-CRE4NJJ6.js +271 -0
  55. package/public/sandbox/chunks/chunk-CVZPRIDB.js +706 -0
  56. package/public/sandbox/chunks/chunk-CWOXD5NG.js +991 -0
  57. package/public/sandbox/chunks/chunk-D6DOC3BJ.js +373 -0
  58. package/public/sandbox/chunks/chunk-DEPSGFSY.js +1698 -0
  59. package/public/sandbox/chunks/chunk-DM7C5NP5.js +819 -0
  60. package/public/sandbox/chunks/chunk-DN33LMOF.js +1112 -0
  61. package/public/sandbox/chunks/{chunk-S46P7MC6.js → chunk-DT7YIIWE.js} +2 -2
  62. package/public/sandbox/chunks/chunk-DVB5WRCI.js +260 -0
  63. package/public/sandbox/chunks/{chunk-TOHCFMQS.js → chunk-E3EVW7NR.js} +11 -18
  64. package/public/sandbox/chunks/chunk-E5BV567Q.js +417 -0
  65. package/public/sandbox/chunks/chunk-E7BIWMQQ.js +203 -0
  66. package/public/sandbox/chunks/chunk-EAKGPSOQ.js +83 -0
  67. package/public/sandbox/chunks/chunk-EGUYL2ER.js +75 -0
  68. package/public/sandbox/chunks/chunk-EP5GQYZ5.js +85 -0
  69. package/public/sandbox/chunks/chunk-ET6CJEHC.js +221 -0
  70. package/public/sandbox/chunks/chunk-EU67YZHZ.js +1070 -0
  71. package/public/sandbox/chunks/{chunk-PTSJJANP.js → chunk-EYNDQLSB.js} +1 -1
  72. package/public/sandbox/chunks/{chunk-CEGSWZ5S.js → chunk-EZTMVCJF.js} +1 -1
  73. package/public/sandbox/chunks/chunk-F5CLVIS6.js +907 -0
  74. package/public/sandbox/chunks/chunk-F743SKYD.js +85 -0
  75. package/public/sandbox/chunks/chunk-FEGFZ5OX.js +86 -0
  76. package/public/sandbox/chunks/chunk-FG5B7ZX3.js +373 -0
  77. package/public/sandbox/chunks/chunk-FKZPYMDG.js +373 -0
  78. package/public/sandbox/chunks/chunk-FNLXHWIU.js +220 -0
  79. package/public/sandbox/chunks/chunk-FQRUTYAD.js +1991 -0
  80. package/public/sandbox/chunks/{chunk-VLYP4WUS.js → chunk-FY5A73NK.js} +5 -5
  81. package/public/sandbox/chunks/chunk-G7FAOG3O.js +221 -0
  82. package/public/sandbox/chunks/chunk-GFXHUC7Y.js +73 -0
  83. package/public/sandbox/chunks/chunk-GIPXUIZQ.js +534 -0
  84. package/public/sandbox/chunks/chunk-GP37MEGJ.js +52 -0
  85. package/public/sandbox/chunks/chunk-GXL5QCMF.js +4511 -0
  86. package/public/sandbox/chunks/chunk-GZ2NSE6A.js +177 -0
  87. package/public/sandbox/chunks/chunk-GZATW4YD.js +69 -0
  88. package/public/sandbox/chunks/chunk-H4EBXROQ.js +166 -0
  89. package/public/sandbox/chunks/chunk-HETCPK6Z.js +153 -0
  90. package/public/sandbox/chunks/chunk-HGUFQ2QC.js +4431 -0
  91. package/public/sandbox/chunks/chunk-HGV3VNH3.js +255 -0
  92. package/public/sandbox/chunks/chunk-HIJ67QWR.js +5397 -0
  93. package/public/sandbox/chunks/chunk-IDHERBKW.js +1114 -0
  94. package/public/sandbox/chunks/chunk-IDTK4FIY.js +102 -0
  95. package/public/sandbox/chunks/chunk-ILFVY7H5.js +164 -0
  96. package/public/sandbox/chunks/chunk-ISGSRYGO.js +57 -0
  97. package/public/sandbox/chunks/chunk-J45VPU24.js +408 -0
  98. package/public/sandbox/chunks/chunk-JAUIM3O5.js +42 -0
  99. package/public/sandbox/chunks/chunk-JB7OQEM6.js +373 -0
  100. package/public/sandbox/chunks/chunk-JCKW6NHD.js +15 -0
  101. package/public/sandbox/chunks/chunk-JMA7GY7Z.js +221 -0
  102. package/public/sandbox/chunks/chunk-JY46J6IL.js +836 -0
  103. package/public/sandbox/chunks/{chunk-X72PZOFA.js → chunk-K2MQ66O7.js} +1 -1
  104. package/public/sandbox/chunks/chunk-KA7PZA6F.js +464 -0
  105. package/public/sandbox/chunks/chunk-KDEQTUID.js +102 -0
  106. package/public/sandbox/chunks/chunk-KDJR27JV.js +1696 -0
  107. package/public/sandbox/chunks/chunk-KFE3JO6N.js +77 -0
  108. package/public/sandbox/chunks/chunk-KLDSYWT5.js +536 -0
  109. package/public/sandbox/chunks/chunk-KQWWFYBF.js +203 -0
  110. package/public/sandbox/chunks/chunk-KTFZSXOW.js +6473 -0
  111. package/public/sandbox/chunks/chunk-KXVIC55U.js +108 -0
  112. package/public/sandbox/chunks/{chunk-HNEDTEGQ.js → chunk-L4PNO2H6.js} +1 -1
  113. package/public/sandbox/chunks/{chunk-WE4STGO2.js → chunk-L4ZNW5DI.js} +2 -2
  114. package/public/sandbox/chunks/chunk-LBUINGZ4.js +836 -0
  115. package/public/sandbox/chunks/chunk-LIYPPU6I.js +112 -0
  116. package/public/sandbox/chunks/chunk-LJHTOJXW.js +221 -0
  117. package/public/sandbox/chunks/{chunk-BWSNPKO5.js → chunk-LQL23SWJ.js} +2 -2
  118. package/public/sandbox/chunks/chunk-LTFCYZQ6.js +46 -0
  119. package/public/sandbox/chunks/chunk-LTWLVCKQ.js +166 -0
  120. package/public/sandbox/chunks/chunk-LWI7BXFN.js +395 -0
  121. package/public/sandbox/chunks/chunk-LYBBX6WM.js +225 -0
  122. package/public/sandbox/chunks/chunk-MXE7HIBM.js +474 -0
  123. package/public/sandbox/chunks/chunk-MYBDYNK4.js +6004 -0
  124. package/public/sandbox/chunks/chunk-NC2MIWZX.js +732 -0
  125. package/public/sandbox/chunks/chunk-NE447XAF.js +597 -0
  126. package/public/sandbox/chunks/chunk-NEAYV5C2.js +255 -0
  127. package/public/sandbox/chunks/chunk-NMGFJZ4I.js +26 -0
  128. package/public/sandbox/chunks/chunk-NWCJJZNQ.js +71 -0
  129. package/public/sandbox/chunks/chunk-O57OZBDR.js +214 -0
  130. package/public/sandbox/chunks/chunk-OJJT664Q.js +731 -0
  131. package/public/sandbox/chunks/chunk-OKTBUTCH.js +1175 -0
  132. package/public/sandbox/chunks/chunk-OQ4SYV5D.js +534 -0
  133. package/public/sandbox/chunks/chunk-OTVVIHJD.js +219 -0
  134. package/public/sandbox/chunks/chunk-OWTMSCF7.js +1052 -0
  135. package/public/sandbox/chunks/chunk-P5ZQNFC3.js +122 -0
  136. package/public/sandbox/chunks/chunk-PBPT2U2N.js +1698 -0
  137. package/public/sandbox/chunks/chunk-PHBJLCP3.js +836 -0
  138. package/public/sandbox/chunks/chunk-PHV4HYHB.js +397 -0
  139. package/public/sandbox/chunks/chunk-PIXQ6SOX.js +4071 -0
  140. package/public/sandbox/chunks/chunk-PKJL6YLK.js +73 -0
  141. package/public/sandbox/chunks/chunk-PKPOITIU.js +221 -0
  142. package/public/sandbox/chunks/{chunk-NQW73ACJ.js → chunk-PMXBOYQI.js} +1 -1
  143. package/public/sandbox/chunks/chunk-PQLZD7NR.js +836 -0
  144. package/public/sandbox/chunks/chunk-QEESVOZU.js +16 -0
  145. package/public/sandbox/chunks/chunk-QGIM3FQK.js +159 -0
  146. package/public/sandbox/chunks/chunk-QL5JNEDO.js +69 -0
  147. package/public/sandbox/chunks/chunk-QQOZ3RMH.js +867 -0
  148. package/public/sandbox/chunks/chunk-QUMEVT2F.js +194 -0
  149. package/public/sandbox/chunks/chunk-QVZBXYVY.js +102 -0
  150. package/public/sandbox/chunks/chunk-R5HQS6RB.js +135 -0
  151. package/public/sandbox/chunks/chunk-R75Q2CTT.js +900 -0
  152. package/public/sandbox/chunks/chunk-RBB6SHW2.js +253 -0
  153. package/public/sandbox/chunks/chunk-RDHNRWQP.js +383 -0
  154. package/public/sandbox/chunks/chunk-RIWOEI3T.js +1101 -0
  155. package/public/sandbox/chunks/chunk-RS5FFPUV.js +103 -0
  156. package/public/sandbox/chunks/chunk-RYSSJBGX.js +203 -0
  157. package/public/sandbox/chunks/chunk-S3KBAE5Z.js +1114 -0
  158. package/public/sandbox/chunks/chunk-S6ZZHV6G.js +244 -0
  159. package/public/sandbox/chunks/chunk-SFXJ24HY.js +499 -0
  160. package/public/sandbox/chunks/chunk-SH7TP5CJ.js +1109 -0
  161. package/public/sandbox/chunks/chunk-SI5OKFFY.js +317 -0
  162. package/public/sandbox/chunks/chunk-SIXNQNIR.js +86 -0
  163. package/public/sandbox/chunks/chunk-ST353BOX.js +42 -0
  164. package/public/sandbox/chunks/chunk-SYEHKMLP.js +1140 -0
  165. package/public/sandbox/chunks/chunk-SZ4KQUJU.js +69 -0
  166. package/public/sandbox/chunks/{chunk-5SOP6EKV.js → chunk-SZI65PSP.js} +5 -10
  167. package/public/sandbox/chunks/chunk-T7RLTSMX.js +78 -0
  168. package/public/sandbox/chunks/chunk-TJ2RLUTW.js +57 -0
  169. package/public/sandbox/chunks/chunk-TJB73XPN.js +4071 -0
  170. package/public/sandbox/chunks/chunk-TXJCYO56.js +4046 -0
  171. package/public/sandbox/chunks/chunk-U5J3LCYI.js +731 -0
  172. package/public/sandbox/chunks/chunk-UABFN3NH.js +208 -0
  173. package/public/sandbox/chunks/chunk-UBMUY7WO.js +13 -0
  174. package/public/sandbox/chunks/chunk-UC27CE32.js +69 -0
  175. package/public/sandbox/chunks/chunk-UJGVDFZN.js +147 -0
  176. package/public/sandbox/chunks/chunk-UNVLTK4N.js +122 -0
  177. package/public/sandbox/chunks/chunk-UQKQ6V3V.js +208 -0
  178. package/public/sandbox/chunks/chunk-UZZBHWIO.js +703 -0
  179. package/public/sandbox/chunks/chunk-VKZIJERL.js +1114 -0
  180. package/public/sandbox/chunks/chunk-VQQEAGID.js +372 -0
  181. package/public/sandbox/chunks/{chunk-3LX3KIQQ.js → chunk-W365QUZ5.js} +3 -5
  182. package/public/sandbox/chunks/chunk-WJY2LSWG.js +1052 -0
  183. package/public/sandbox/chunks/chunk-WNOBN3DX.js +391 -0
  184. package/public/sandbox/chunks/chunk-X2Z5VYG3.js +245 -0
  185. package/public/sandbox/chunks/chunk-X74KU74D.js +959 -0
  186. package/public/sandbox/chunks/chunk-XE7ULSGQ.js +46 -0
  187. package/public/sandbox/chunks/chunk-XRXUJZ3X.js +431 -0
  188. package/public/sandbox/chunks/chunk-XWHIN7CC.js +85 -0
  189. package/public/sandbox/chunks/chunk-Y2TVGGVL.js +527 -0
  190. package/public/sandbox/chunks/chunk-YMVMZA3U.js +1395 -0
  191. package/public/sandbox/chunks/chunk-YOBLFWDV.js +431 -0
  192. package/public/sandbox/chunks/chunk-YR2RFEZA.js +11 -0
  193. package/public/sandbox/chunks/chunk-YTD6A35P.js +836 -0
  194. package/public/sandbox/chunks/chunk-Z5L7EZXS.js +81 -0
  195. package/public/sandbox/chunks/chunk-Z65I5ET2.js +108 -0
  196. package/public/sandbox/chunks/chunk-Z6LV34RO.js +390 -0
  197. package/public/sandbox/chunks/chunk-ZAKUP6QG.js +1634 -0
  198. package/public/sandbox/chunks/chunk-ZHNYE2YH.js +731 -0
  199. package/public/sandbox/chunks/chunk-ZHQX3B3Y.js +867 -0
  200. package/public/sandbox/chunks/chunk-ZIXDFRHJ.js +731 -0
  201. package/public/sandbox/chunks/chunk-ZPZ2MZ4D.js +528 -0
  202. package/public/sandbox/chunks/chunk-ZQD6NZXB.js +373 -0
  203. package/public/sandbox/chunks/chunk-ZVVBP7ON.js +16 -0
  204. package/public/sandbox/chunks/chunk-ZWE3P6X2.js +11 -0
  205. package/public/sandbox/logix-core/Bound.js +14 -14
  206. package/public/sandbox/logix-core/Debug.js +12 -10
  207. package/public/sandbox/logix-core/EffectOp.js +3 -4
  208. package/public/sandbox/logix-core/Env.js +5 -2
  209. package/public/sandbox/logix-core/ExternalStore.js +239 -0
  210. package/public/sandbox/logix-core/Flow.js +7 -8
  211. package/public/sandbox/logix-core/Kernel.js +7 -4
  212. package/public/sandbox/logix-core/Link.js +33 -25
  213. package/public/sandbox/logix-core/Middleware.js +13 -11
  214. package/public/sandbox/logix-core/Module.js +93 -30
  215. package/public/sandbox/logix-core/ModuleTag.js +28 -25
  216. package/public/sandbox/logix-core/Observability.js +21 -19
  217. package/public/sandbox/logix-core/Process.js +27 -22
  218. package/public/sandbox/logix-core/ReadQuery.js +7 -11
  219. package/public/sandbox/logix-core/Reflection.js +173 -53
  220. package/public/sandbox/logix-core/Resource.js +6 -3
  221. package/public/sandbox/logix-core/Root.js +7 -3
  222. package/public/sandbox/logix-core/Runtime.js +54 -40
  223. package/public/sandbox/logix-core/ScopeRegistry.js +6 -3
  224. package/public/sandbox/logix-core/StateTrait.js +17 -14
  225. package/public/sandbox/logix-core/TraitLifecycle.js +8 -8
  226. package/public/sandbox/logix-core/Workflow.js +332 -0
  227. package/public/sandbox/logix-core.js +11133 -6622
  228. package/public/sandbox/logix-core.manifest.json +4 -2
  229. package/public/sandbox/worker.js +3 -3
  230. package/public/sandbox/chunks/chunk-4LRLOTMA.js +0 -1698
  231. package/public/sandbox/chunks/chunk-CDLXJHXY.js +0 -120
  232. package/public/sandbox/chunks/chunk-CZRI7MHA.js +0 -46
  233. package/public/sandbox/chunks/chunk-EJDFUZ4B.js +0 -408
  234. package/public/sandbox/chunks/chunk-IP63FME6.js +0 -282
  235. package/public/sandbox/chunks/chunk-JIXTOQXJ.js +0 -1103
  236. package/public/sandbox/chunks/chunk-MPUSOFJ3.js +0 -1928
  237. package/public/sandbox/chunks/chunk-ON2LY6HJ.js +0 -135
  238. package/public/sandbox/chunks/chunk-POIBXAH5.js +0 -995
  239. package/public/sandbox/chunks/chunk-PQ652ULI.js +0 -6359
  240. package/public/sandbox/chunks/chunk-RJQ4PG2F.js +0 -77
  241. package/public/sandbox/chunks/chunk-S4EXG3OS.js +0 -533
  242. package/public/sandbox/chunks/chunk-SUXDGXVE.js +0 -390
  243. package/public/sandbox/chunks/chunk-TOQ6SJ6O.js +0 -244
  244. package/public/sandbox/chunks/chunk-UKYAF3NL.js +0 -1036
  245. package/public/sandbox/chunks/chunk-UMVN3AWO.js +0 -395
  246. package/public/sandbox/chunks/chunk-WFV5PPWJ.js +0 -194
  247. package/public/sandbox/chunks/chunk-YF6IO732.js +0 -206
  248. package/public/sandbox/chunks/chunk-ZUBABAAO.js +0 -86
@@ -0,0 +1,166 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ EffectOpMiddlewareTag,
5
+ make,
6
+ run
7
+ } from "./chunk-ASJSJAAL.js";
8
+ import {
9
+ RunSessionTag
10
+ } from "./chunk-RS5FFPUV.js";
11
+ import {
12
+ record
13
+ } from "./chunk-CVZPRIDB.js";
14
+
15
+ // ../logix-core/src/internal/runtime/core/FlowRuntime.ts
16
+ import { Effect, Stream, Ref, Option } from "../effect.js";
17
+ var getMiddlewareStack = () => Effect.serviceOption(EffectOpMiddlewareTag).pipe(
18
+ Effect.map((maybe) => Option.isSome(maybe) ? maybe.value.stack : [])
19
+ );
20
+ var getRuntimeScope = (runtime) => {
21
+ if (!runtime) return {};
22
+ if (typeof runtime !== "object" && typeof runtime !== "function") return {};
23
+ const scope = runtime;
24
+ return {
25
+ moduleId: typeof scope.moduleId === "string" ? scope.moduleId : void 0,
26
+ instanceId: typeof scope.instanceId === "string" ? scope.instanceId : void 0
27
+ };
28
+ };
29
+ var resolveEffect = (eff, payload) => typeof eff === "function" ? eff(payload) : eff;
30
+ var make2 = (runtime, runtimeInternals) => {
31
+ const scope = getRuntimeScope(runtime);
32
+ const resolveConcurrencyLimit = () => runtimeInternals ? runtimeInternals.concurrency.resolveConcurrencyPolicy().pipe(
33
+ Effect.map((p) => p.concurrencyLimit)
34
+ ) : Effect.succeed(16);
35
+ const runAsFlowOp = (name, payload, eff, options) => Effect.gen(function* () {
36
+ const stack = yield* getMiddlewareStack();
37
+ const meta = {
38
+ ...options?.meta ?? {},
39
+ policy: options?.policy,
40
+ tags: options?.tags,
41
+ trace: options?.trace,
42
+ moduleId: scope.moduleId,
43
+ instanceId: scope.instanceId
44
+ };
45
+ if (!(typeof meta.opSeq === "number" && Number.isFinite(meta.opSeq))) {
46
+ const sessionOpt = yield* Effect.serviceOption(RunSessionTag);
47
+ if (Option.isSome(sessionOpt)) {
48
+ const key = meta.instanceId ?? "global";
49
+ meta.opSeq = sessionOpt.value.local.nextSeq("opSeq", key);
50
+ }
51
+ }
52
+ const op = make({
53
+ kind: "flow",
54
+ name,
55
+ payload,
56
+ effect: eff,
57
+ meta
58
+ });
59
+ return yield* run(op, stack);
60
+ });
61
+ const runEffect = (eff) => (payload) => resolveEffect(eff, payload);
62
+ const runStreamSequential = (eff, options) => (stream) => Stream.runForEach(
63
+ stream,
64
+ (payload) => runAsFlowOp(
65
+ "flow.run",
66
+ payload,
67
+ runEffect(eff)(payload),
68
+ options
69
+ )
70
+ );
71
+ const runStreamParallel = (eff, options) => (stream) => Effect.gen(function* () {
72
+ const concurrency = yield* resolveConcurrencyLimit();
73
+ return yield* Stream.runDrain(
74
+ stream.pipe(
75
+ Stream.mapEffect(
76
+ (payload) => runAsFlowOp(
77
+ "flow.runParallel",
78
+ payload,
79
+ runEffect(eff)(payload),
80
+ options
81
+ ),
82
+ { concurrency }
83
+ )
84
+ )
85
+ ).pipe(
86
+ Effect.catchAllCause(
87
+ (cause) => record({
88
+ type: "diagnostic",
89
+ moduleId: scope.moduleId,
90
+ instanceId: scope.instanceId,
91
+ code: "flow::unhandled_failure",
92
+ severity: "error",
93
+ message: "Flow watcher (runParallel) failed with an unhandled error.",
94
+ hint: "\u5728 watcher \u5185\u663E\u5F0F\u5904\u7406\u9519\u8BEF\uFF08catch/catchAll\uFF09\u6216\u7528 TaskRunner \u7684 failure \u5199\u56DE\uFF1B\u907F\u514D silent failure\u3002",
95
+ kind: "flow_unhandled_failure",
96
+ trigger: {
97
+ kind: "flow",
98
+ name: "runParallel"
99
+ }
100
+ }).pipe(Effect.zipRight(Effect.failCause(cause)))
101
+ )
102
+ );
103
+ });
104
+ return {
105
+ fromAction: (predicate) => runtime.actions$.pipe(Stream.filter(predicate)),
106
+ fromState: (selector) => runtime.changes(selector),
107
+ debounce: (ms) => (stream) => Stream.debounce(stream, ms),
108
+ throttle: (ms) => (stream) => Stream.throttle(stream, {
109
+ cost: () => 1,
110
+ units: 1,
111
+ duration: ms,
112
+ strategy: "enforce"
113
+ }),
114
+ filter: (predicate) => (stream) => Stream.filter(stream, predicate),
115
+ run: (eff, options) => (stream) => runStreamSequential(eff, options)(stream),
116
+ runParallel: (eff, options) => (stream) => runStreamParallel(eff, options)(stream),
117
+ runLatest: (eff, options) => (stream) => Stream.runDrain(
118
+ Stream.map(
119
+ stream,
120
+ (payload) => runAsFlowOp(
121
+ "flow.runLatest",
122
+ payload,
123
+ runEffect(eff)(payload),
124
+ options
125
+ )
126
+ ).pipe(
127
+ Stream.flatMap((effect) => Stream.fromEffect(effect), {
128
+ switch: true
129
+ })
130
+ )
131
+ ),
132
+ runExhaust: (eff, options) => (stream) => Effect.gen(function* () {
133
+ const concurrency = yield* resolveConcurrencyLimit();
134
+ const busyRef = yield* Ref.make(false);
135
+ const mapper = (payload) => Effect.gen(function* () {
136
+ const acquired = yield* Ref.modify(
137
+ busyRef,
138
+ (busy) => busy ? [false, busy] : [true, true]
139
+ );
140
+ if (!acquired) {
141
+ return;
142
+ }
143
+ try {
144
+ yield* runAsFlowOp(
145
+ "flow.runExhaust",
146
+ payload,
147
+ runEffect(eff)(payload),
148
+ options
149
+ );
150
+ } finally {
151
+ yield* Ref.set(busyRef, false);
152
+ }
153
+ });
154
+ return yield* Stream.runDrain(
155
+ stream.pipe(
156
+ Stream.mapEffect(mapper, { concurrency })
157
+ )
158
+ );
159
+ })
160
+ };
161
+ };
162
+
163
+ export {
164
+ make2 as make
165
+ };
166
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL0Zsb3dSdW50aW1lLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBFZmZlY3QsIFN0cmVhbSwgUmVmLCBPcHRpb24gfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB0eXBlIHtcbiAgQW55TW9kdWxlU2hhcGUsXG4gIE1vZHVsZVJ1bnRpbWUsXG4gIFN0YXRlT2YsXG4gIEFjdGlvbk9mLFxuICBNb2R1bGVTaGFwZSxcbn0gZnJvbSBcIi4vbW9kdWxlLmpzXCJcbmltcG9ydCB0eXBlICogYXMgTG9naWMgZnJvbSBcIi4vTG9naWNNaWRkbGV3YXJlLmpzXCJcbmltcG9ydCAqIGFzIEVmZmVjdE9wIGZyb20gXCIuLi8uLi8uLi9lZmZlY3RvcC5qc1wiXG5pbXBvcnQgKiBhcyBFZmZlY3RPcENvcmUgZnJvbSBcIi4uL0VmZmVjdE9wQ29yZS5qc1wiXG5pbXBvcnQgeyBSdW5TZXNzaW9uVGFnIH0gZnJvbSBcIi4uLy4uL29ic2VydmFiaWxpdHkvcnVuU2Vzc2lvbi5qc1wiXG5pbXBvcnQgdHlwZSB7IFJ1bnRpbWVJbnRlcm5hbHMgfSBmcm9tIFwiLi9SdW50aW1lSW50ZXJuYWxzLmpzXCJcbmltcG9ydCAqIGFzIERlYnVnIGZyb20gXCIuL0RlYnVnU2luay5qc1wiXG5cbmNvbnN0IGdldE1pZGRsZXdhcmVTdGFjayA9ICgpOiBFZmZlY3QuRWZmZWN0PFxuICBFZmZlY3RPcC5NaWRkbGV3YXJlU3RhY2ssXG4gIG5ldmVyLFxuICBhbnlcbj4gPT5cbiAgRWZmZWN0LnNlcnZpY2VPcHRpb24oRWZmZWN0T3BDb3JlLkVmZmVjdE9wTWlkZGxld2FyZVRhZykucGlwZShcbiAgICBFZmZlY3QubWFwKChtYXliZSkgPT4gKE9wdGlvbi5pc1NvbWUobWF5YmUpID8gbWF5YmUudmFsdWUuc3RhY2sgOiBbXSkpLFxuICApXG5cbmNvbnN0IGdldFJ1bnRpbWVTY29wZSA9IChcbiAgcnVudGltZTogdW5rbm93bixcbik6IHsgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmc7IHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmcgfSA9PiB7XG4gIGlmICghcnVudGltZSkgcmV0dXJuIHt9XG4gIGlmICh0eXBlb2YgcnVudGltZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcnVudGltZSAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4ge31cbiAgY29uc3Qgc2NvcGUgPSBydW50aW1lIGFzIHsgcmVhZG9ubHkgbW9kdWxlSWQ/OiB1bmtub3duOyByZWFkb25seSBpbnN0YW5jZUlkPzogdW5rbm93biB9XG4gIHJldHVybiB7XG4gICAgbW9kdWxlSWQ6IHR5cGVvZiBzY29wZS5tb2R1bGVJZCA9PT0gXCJzdHJpbmdcIiA/IHNjb3BlLm1vZHVsZUlkIDogdW5kZWZpbmVkLFxuICAgIGluc3RhbmNlSWQ6IHR5cGVvZiBzY29wZS5pbnN0YW5jZUlkID09PSBcInN0cmluZ1wiID8gc2NvcGUuaW5zdGFuY2VJZCA6IHVuZGVmaW5lZCxcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwaTxTaCBleHRlbmRzIE1vZHVsZVNoYXBlPGFueSwgYW55PiwgUiA9IG5ldmVyPiB7XG4gIHJlYWRvbmx5IGZyb21BY3Rpb246IDxUIGV4dGVuZHMgQWN0aW9uT2Y8U2g+PihcbiAgICBwcmVkaWNhdGU6IChhOiBBY3Rpb25PZjxTaD4pID0+IGEgaXMgVFxuICApID0+IFN0cmVhbS5TdHJlYW08VD5cblxuICByZWFkb25seSBmcm9tU3RhdGU6IDxWPihcbiAgICBzZWxlY3RvcjogKHM6IFN0YXRlT2Y8U2g+KSA9PiBWXG4gICkgPT4gU3RyZWFtLlN0cmVhbTxWPlxuXG4gIHJlYWRvbmx5IGRlYm91bmNlOiA8Vj4oXG4gICAgbXM6IG51bWJlclxuICApID0+IChzdHJlYW06IFN0cmVhbS5TdHJlYW08Vj4pID0+IFN0cmVhbS5TdHJlYW08Vj5cblxuICByZWFkb25seSB0aHJvdHRsZTogPFY+KFxuICAgIG1zOiBudW1iZXJcbiAgKSA9PiAoc3RyZWFtOiBTdHJlYW0uU3RyZWFtPFY+KSA9PiBTdHJlYW0uU3RyZWFtPFY+XG5cbiAgcmVhZG9ubHkgZmlsdGVyOiA8Vj4oXG4gICAgcHJlZGljYXRlOiAodmFsdWU6IFYpID0+IGJvb2xlYW5cbiAgKSA9PiAoc3RyZWFtOiBTdHJlYW0uU3RyZWFtPFY+KSA9PiBTdHJlYW0uU3RyZWFtPFY+XG5cbiAgcmVhZG9ubHkgcnVuOiA8ViwgQSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICBlZmY6XG4gICAgICB8IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+XG4gICAgICB8ICgocGF5bG9hZDogVikgPT4gTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4pLFxuICAgIG9wdGlvbnM/OiBMb2dpYy5PcGVyYXRpb25PcHRpb25zLFxuICApID0+IChzdHJlYW06IFN0cmVhbS5TdHJlYW08Vj4pID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgRSwgTG9naWMuRW52PFNoLCBSICYgUjI+PlxuXG4gIHJlYWRvbmx5IHJ1blBhcmFsbGVsOiA8ViwgQSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICBlZmY6XG4gICAgICB8IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+XG4gICAgICB8ICgocGF5bG9hZDogVikgPT4gTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4pLFxuICAgIG9wdGlvbnM/OiBMb2dpYy5PcGVyYXRpb25PcHRpb25zLFxuICApID0+IChzdHJlYW06IFN0cmVhbS5TdHJlYW08Vj4pID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgRSwgTG9naWMuRW52PFNoLCBSICYgUjI+PlxuXG4gIHJlYWRvbmx5IHJ1bkxhdGVzdDogPFYsIEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgZWZmOlxuICAgICAgfCBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPlxuICAgICAgfCAoKHBheWxvYWQ6IFYpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KSxcbiAgICBvcHRpb25zPzogTG9naWMuT3BlcmF0aW9uT3B0aW9ucyxcbiAgKSA9PiAoc3RyZWFtOiBTdHJlYW0uU3RyZWFtPFY+KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIEUsIExvZ2ljLkVudjxTaCwgUiAmIFIyPj5cblxuICByZWFkb25seSBydW5FeGhhdXN0OiA8ViwgQSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICBlZmY6XG4gICAgICB8IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+XG4gICAgICB8ICgocGF5bG9hZDogVikgPT4gTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4pLFxuICAgIG9wdGlvbnM/OiBMb2dpYy5PcGVyYXRpb25PcHRpb25zLFxuICApID0+IChzdHJlYW06IFN0cmVhbS5TdHJlYW08Vj4pID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgRSwgTG9naWMuRW52PFNoLCBSICYgUjI+PlxufVxuXG5jb25zdCByZXNvbHZlRWZmZWN0ID0gPFQsIFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGUsIFIsIEEsIEU+KFxuICBlZmY6XG4gICAgfCBMb2dpYy5PZjxTaCwgUiwgQSwgRT5cbiAgICB8ICgocGF5bG9hZDogVCkgPT4gTG9naWMuT2Y8U2gsIFIsIEEsIEU+KSxcbiAgcGF5bG9hZDogVFxuKTogTG9naWMuT2Y8U2gsIFIsIEEsIEU+ID0+XG4gIHR5cGVvZiBlZmYgPT09IFwiZnVuY3Rpb25cIlxuICAgID8gKGVmZiBhcyAocDogVCkgPT4gTG9naWMuT2Y8U2gsIFIsIEEsIEU+KShwYXlsb2FkKVxuICAgIDogZWZmXG5cbmV4cG9ydCBjb25zdCBtYWtlID0gPFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGUsIFIgPSBuZXZlcj4oXG4gIHJ1bnRpbWU6IE1vZHVsZVJ1bnRpbWU8U3RhdGVPZjxTaD4sIEFjdGlvbk9mPFNoPj4sXG4gIHJ1bnRpbWVJbnRlcm5hbHM/OiBSdW50aW1lSW50ZXJuYWxzLFxuKTogQXBpPFNoLCBSPiA9PiB7XG4gIGNvbnN0IHNjb3BlID0gZ2V0UnVudGltZVNjb3BlKHJ1bnRpbWUpXG4gIGNvbnN0IHJlc29sdmVDb25jdXJyZW5jeUxpbWl0ID0gKCk6IEVmZmVjdC5FZmZlY3Q8XG4gICAgbnVtYmVyIHwgXCJ1bmJvdW5kZWRcIixcbiAgICBuZXZlcixcbiAgICBhbnlcbiAgPiA9PlxuICAgIHJ1bnRpbWVJbnRlcm5hbHNcbiAgICAgID8gcnVudGltZUludGVybmFscy5jb25jdXJyZW5jeS5yZXNvbHZlQ29uY3VycmVuY3lQb2xpY3koKS5waXBlKFxuICAgICAgICAgIEVmZmVjdC5tYXAoKHApID0+IHAuY29uY3VycmVuY3lMaW1pdCksXG4gICAgICAgIClcbiAgICAgIDogRWZmZWN0LnN1Y2NlZWQoMTYpXG5cbiAgY29uc3QgcnVuQXNGbG93T3AgPSA8QSwgRSwgUjIsIFY+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBWLFxuICAgIGVmZjogRWZmZWN0LkVmZmVjdDxBLCBFLCBMb2dpYy5FbnY8U2gsIFIgJiBSMj4+LFxuICAgIG9wdGlvbnM/OiBMb2dpYy5PcGVyYXRpb25PcHRpb25zLFxuICApOiBFZmZlY3QuRWZmZWN0PEEsIEUsIExvZ2ljLkVudjxTaCwgUiAmIFIyPj4gPT5cbiAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCBzdGFjayA9IHlpZWxkKiBnZXRNaWRkbGV3YXJlU3RhY2soKVxuICAgICAgY29uc3QgbWV0YTogYW55ID0ge1xuICAgICAgICAuLi4ob3B0aW9ucz8ubWV0YSA/PyB7fSksXG4gICAgICAgIHBvbGljeTogb3B0aW9ucz8ucG9saWN5LFxuICAgICAgICB0YWdzOiBvcHRpb25zPy50YWdzLFxuICAgICAgICB0cmFjZTogb3B0aW9ucz8udHJhY2UsXG4gICAgICAgIG1vZHVsZUlkOiBzY29wZS5tb2R1bGVJZCxcbiAgICAgICAgaW5zdGFuY2VJZDogc2NvcGUuaW5zdGFuY2VJZCxcbiAgICAgIH1cblxuICAgICAgaWYgKCEodHlwZW9mIG1ldGEub3BTZXEgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKG1ldGEub3BTZXEpKSkge1xuICAgICAgICBjb25zdCBzZXNzaW9uT3B0ID0geWllbGQqIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKFJ1blNlc3Npb25UYWcpXG4gICAgICAgIGlmIChPcHRpb24uaXNTb21lKHNlc3Npb25PcHQpKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gbWV0YS5pbnN0YW5jZUlkID8/IFwiZ2xvYmFsXCJcbiAgICAgICAgICBtZXRhLm9wU2VxID0gc2Vzc2lvbk9wdC52YWx1ZS5sb2NhbC5uZXh0U2VxKFwib3BTZXFcIiwga2V5KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wID0gRWZmZWN0T3AubWFrZTxBLCBFLCBhbnk+KHtcbiAgICAgICAga2luZDogXCJmbG93XCIsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGVmZmVjdDogZWZmIGFzIGFueSxcbiAgICAgICAgbWV0YSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4geWllbGQqIEVmZmVjdE9wLnJ1bihvcCwgc3RhY2spXG4gICAgfSkgYXMgYW55XG5cbiAgY29uc3QgcnVuRWZmZWN0ID1cbiAgICA8VCwgQSwgRSwgUjI+KFxuICAgICAgZWZmOlxuICAgICAgICB8IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+XG4gICAgICAgIHwgKChwYXlsb2FkOiBUKSA9PiBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPilcbiAgICApID0+XG4gICAgICAocGF5bG9hZDogVCkgPT5cbiAgICAgICAgcmVzb2x2ZUVmZmVjdDxULCBTaCwgUiAmIFIyLCBBLCBFPihlZmYsIHBheWxvYWQpXG5cbiAgY29uc3QgcnVuU3RyZWFtU2VxdWVudGlhbCA9IDxULCBBLCBFLCBSMj4oXG4gICAgZWZmOlxuICAgICAgfCBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPlxuICAgICAgfCAoKHBheWxvYWQ6IFQpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KSxcbiAgICBvcHRpb25zPzogTG9naWMuT3BlcmF0aW9uT3B0aW9ucyxcbiAgKSA9PiAoc3RyZWFtOiBTdHJlYW0uU3RyZWFtPFQ+KTogRWZmZWN0LkVmZmVjdDx2b2lkLCBFLCBMb2dpYy5FbnY8U2gsIFIgJiBSMj4+ID0+XG4gICAgU3RyZWFtLnJ1bkZvckVhY2goc3RyZWFtLCAocGF5bG9hZCkgPT5cbiAgICAgIHJ1bkFzRmxvd09wPEEsIEUsIFIyLCBUPihcbiAgICAgICAgXCJmbG93LnJ1blwiLFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBydW5FZmZlY3Q8VCwgQSwgRSwgUjI+KGVmZikocGF5bG9hZCksXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApLFxuICAgIClcblxuICBjb25zdCBydW5TdHJlYW1QYXJhbGxlbCA9IDxULCBBLCBFLCBSMj4oXG4gICAgZWZmOlxuICAgICAgfCBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPlxuICAgICAgfCAoKHBheWxvYWQ6IFQpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KSxcbiAgICBvcHRpb25zPzogTG9naWMuT3BlcmF0aW9uT3B0aW9ucyxcbiAgKSA9PiAoc3RyZWFtOiBTdHJlYW0uU3RyZWFtPFQ+KTogRWZmZWN0LkVmZmVjdDx2b2lkLCBFLCBMb2dpYy5FbnY8U2gsIFIgJiBSMj4+ID0+XG4gICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgY29uc3QgY29uY3VycmVuY3kgPSB5aWVsZCogcmVzb2x2ZUNvbmN1cnJlbmN5TGltaXQoKVxuXG4gICAgICByZXR1cm4geWllbGQqIFN0cmVhbS5ydW5EcmFpbihcbiAgICAgICAgc3RyZWFtLnBpcGUoXG4gICAgICAgICAgU3RyZWFtLm1hcEVmZmVjdChcbiAgICAgICAgICAgIChwYXlsb2FkKSA9PlxuICAgICAgICAgICAgICBydW5Bc0Zsb3dPcDxBLCBFLCBSMiwgVD4oXG4gICAgICAgICAgICAgICAgXCJmbG93LnJ1blBhcmFsbGVsXCIsXG4gICAgICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgICAgICBydW5FZmZlY3Q8VCwgQSwgRSwgUjI+KGVmZikocGF5bG9hZCksXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHsgY29uY3VycmVuY3kgfSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKS5waXBlKFxuICAgICAgICBFZmZlY3QuY2F0Y2hBbGxDYXVzZSgoY2F1c2UpID0+XG4gICAgICAgICAgRGVidWcucmVjb3JkKHtcbiAgICAgICAgICAgIHR5cGU6IFwiZGlhZ25vc3RpY1wiLFxuICAgICAgICAgICAgbW9kdWxlSWQ6IHNjb3BlLm1vZHVsZUlkLFxuICAgICAgICAgICAgaW5zdGFuY2VJZDogc2NvcGUuaW5zdGFuY2VJZCxcbiAgICAgICAgICAgIGNvZGU6IFwiZmxvdzo6dW5oYW5kbGVkX2ZhaWx1cmVcIixcbiAgICAgICAgICAgIHNldmVyaXR5OiBcImVycm9yXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBcIkZsb3cgd2F0Y2hlciAocnVuUGFyYWxsZWwpIGZhaWxlZCB3aXRoIGFuIHVuaGFuZGxlZCBlcnJvci5cIixcbiAgICAgICAgICAgIGhpbnQ6XG4gICAgICAgICAgICAgIFwiXHU1NzI4IHdhdGNoZXIgXHU1MTg1XHU2NjNFXHU1RjBGXHU1OTA0XHU3NDA2XHU5NTE5XHU4QkVGXHVGRjA4Y2F0Y2gvY2F0Y2hBbGxcdUZGMDlcdTYyMTZcdTc1MjggVGFza1J1bm5lciBcdTc2ODQgZmFpbHVyZSBcdTUxOTlcdTU2REVcdUZGMUJcdTkwN0ZcdTUxNEQgc2lsZW50IGZhaWx1cmVcdTMwMDJcIixcbiAgICAgICAgICAgIGtpbmQ6IFwiZmxvd191bmhhbmRsZWRfZmFpbHVyZVwiLFxuICAgICAgICAgICAgdHJpZ2dlcjoge1xuICAgICAgICAgICAgICBraW5kOiBcImZsb3dcIixcbiAgICAgICAgICAgICAgbmFtZTogXCJydW5QYXJhbGxlbFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KS5waXBlKEVmZmVjdC56aXBSaWdodChFZmZlY3QuZmFpbENhdXNlKGNhdXNlKSkpLFxuICAgICAgICApLFxuICAgICAgKVxuICAgIH0pIGFzIGFueVxuXG4gIHJldHVybiB7XG4gICAgZnJvbUFjdGlvbjogPFQgZXh0ZW5kcyBBY3Rpb25PZjxTaD4+KFxuICAgICAgcHJlZGljYXRlOiAoYTogQWN0aW9uT2Y8U2g+KSA9PiBhIGlzIFRcbiAgICApID0+IHJ1bnRpbWUuYWN0aW9ucyQucGlwZShTdHJlYW0uZmlsdGVyKHByZWRpY2F0ZSkpLFxuXG4gICAgZnJvbVN0YXRlOiA8Vj4oc2VsZWN0b3I6IChzOiBTdGF0ZU9mPFNoPikgPT4gVikgPT5cbiAgICAgIHJ1bnRpbWUuY2hhbmdlcyhzZWxlY3RvciksXG5cbiAgICBkZWJvdW5jZTogKG1zOiBudW1iZXIpID0+IChzdHJlYW0pID0+IFN0cmVhbS5kZWJvdW5jZShzdHJlYW0sIG1zKSxcblxuICAgIHRocm90dGxlOiAobXM6IG51bWJlcikgPT4gKHN0cmVhbSkgPT5cbiAgICAgIFN0cmVhbS50aHJvdHRsZShzdHJlYW0sIHtcbiAgICAgICAgY29zdDogKCkgPT4gMSxcbiAgICAgICAgdW5pdHM6IDEsXG4gICAgICAgIGR1cmF0aW9uOiBtcyxcbiAgICAgICAgc3RyYXRlZ3k6IFwiZW5mb3JjZVwiLFxuICAgICAgfSksXG5cbiAgICBmaWx0ZXI6IChwcmVkaWNhdGU6ICh2YWx1ZTogYW55KSA9PiBib29sZWFuKSA9PiAoc3RyZWFtKSA9PlxuICAgICAgU3RyZWFtLmZpbHRlcihzdHJlYW0sIHByZWRpY2F0ZSksXG5cbiAgICBydW46IChlZmYsIG9wdGlvbnMpID0+IChzdHJlYW0pID0+XG4gICAgICBydW5TdHJlYW1TZXF1ZW50aWFsPGFueSwgYW55LCBhbnksIGFueT4oZWZmLCBvcHRpb25zKShzdHJlYW0pLFxuXG4gICAgcnVuUGFyYWxsZWw6IChlZmYsIG9wdGlvbnMpID0+IChzdHJlYW0pID0+XG4gICAgICBydW5TdHJlYW1QYXJhbGxlbDxhbnksIGFueSwgYW55LCBhbnk+KGVmZiwgb3B0aW9ucykoc3RyZWFtKSxcblxuICAgIHJ1bkxhdGVzdDogKGVmZiwgb3B0aW9ucykgPT4gKHN0cmVhbSkgPT5cbiAgICAgIFN0cmVhbS5ydW5EcmFpbihcbiAgICAgICAgU3RyZWFtLm1hcChzdHJlYW0sIChwYXlsb2FkKSA9PlxuICAgICAgICAgIHJ1bkFzRmxvd09wPGFueSwgYW55LCBhbnksIGFueT4oXG4gICAgICAgICAgICBcImZsb3cucnVuTGF0ZXN0XCIsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgICAgcnVuRWZmZWN0PGFueSwgYW55LCBhbnksIGFueT4oZWZmKShwYXlsb2FkKSxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgKVxuICAgICAgICApLnBpcGUoXG4gICAgICAgICAgU3RyZWFtLmZsYXRNYXAoKGVmZmVjdCkgPT4gU3RyZWFtLmZyb21FZmZlY3QoZWZmZWN0KSwge1xuICAgICAgICAgICAgc3dpdGNoOiB0cnVlLFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICksXG5cbiAgICBydW5FeGhhdXN0OiAoZWZmLCBvcHRpb25zKSA9PiAoc3RyZWFtKSA9PlxuICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBjb25jdXJyZW5jeSA9IHlpZWxkKiByZXNvbHZlQ29uY3VycmVuY3lMaW1pdCgpXG4gICAgICAgIGNvbnN0IGJ1c3lSZWYgPSB5aWVsZCogUmVmLm1ha2UoZmFsc2UpXG4gICAgICAgIGNvbnN0IG1hcHBlciA9IChwYXlsb2FkOiBhbnkpID0+XG4gICAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgYWNxdWlyZWQgPSB5aWVsZCogUmVmLm1vZGlmeShidXN5UmVmLCAoYnVzeSkgPT5cbiAgICAgICAgICAgICAgYnVzeSA/IChbZmFsc2UsIGJ1c3ldIGFzIGNvbnN0KSA6IChbdHJ1ZSwgdHJ1ZV0gYXMgY29uc3QpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAoIWFjcXVpcmVkKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgeWllbGQqIHJ1bkFzRmxvd09wPGFueSwgYW55LCBhbnksIGFueT4oXG4gICAgICAgICAgICAgICAgXCJmbG93LnJ1bkV4aGF1c3RcIixcbiAgICAgICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgICAgICAgIHJ1bkVmZmVjdDxhbnksIGFueSwgYW55LCBhbnk+KGVmZikocGF5bG9hZCksXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgeWllbGQqIFJlZi5zZXQoYnVzeVJlZiwgZmFsc2UpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4geWllbGQqIFN0cmVhbS5ydW5EcmFpbihcbiAgICAgICAgICBzdHJlYW0ucGlwZShcbiAgICAgICAgICAgIFN0cmVhbS5tYXBFZmZlY3QobWFwcGVyLCB7IGNvbmN1cnJlbmN5IH0pXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICB9KSxcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsU0FBUyxRQUFRLFFBQVEsS0FBSyxjQUFjO0FBZTVDLElBQU0scUJBQXFCLE1BS3pCLE9BQU8sY0FBMkIscUJBQXFCLEVBQUU7QUFBQSxFQUN2RCxPQUFPLElBQUksQ0FBQyxVQUFXLE9BQU8sT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLFFBQVEsQ0FBQyxDQUFFO0FBQ3ZFO0FBRUYsSUFBTSxrQkFBa0IsQ0FDdEIsWUFDaUU7QUFDakUsTUFBSSxDQUFDLFFBQVMsUUFBTyxDQUFD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
@@ -0,0 +1,395 @@
1
+ // @logixjs/core subpath bundles for @logixjs/sandbox
2
+
3
+ import {
4
+ fnv1a32,
5
+ stableStringify
6
+ } from "./chunk-DT7YIIWE.js";
7
+
8
+ // ../logix-core/src/internal/runtime/core/ReadQuery.ts
9
+ function isReadQuery(input) {
10
+ if (!input || typeof input !== "object" && typeof input !== "function") return false;
11
+ const maybe = input;
12
+ return typeof maybe.selectorId === "string" && typeof maybe.select === "function" && Array.isArray(maybe.reads);
13
+ }
14
+ var normalizeReads = (reads) => {
15
+ const unique = [];
16
+ const seen = /* @__PURE__ */ new Set();
17
+ for (const r of reads) {
18
+ const key = typeof r === "number" ? `n:${r}` : `s:${r}`;
19
+ if (seen.has(key)) continue;
20
+ seen.add(key);
21
+ unique.push(r);
22
+ }
23
+ return unique.slice().sort();
24
+ };
25
+ var toHash32Number = (hex) => Number.parseInt(hex, 16);
26
+ var makeReadsDigest = (reads) => {
27
+ const normalized = normalizeReads(reads);
28
+ return {
29
+ count: normalized.length,
30
+ hash: toHash32Number(fnv1a32(stableStringify(normalized)))
31
+ };
32
+ };
33
+ var computeSelectorId = (value) => `rq_${fnv1a32(stableStringify(value))}`;
34
+ var nextUnstableSelectorSeq = 0;
35
+ var unstableSelectorIdByFn = /* @__PURE__ */ new WeakMap();
36
+ var computeUnstableSelectorId = (selector) => {
37
+ const existing = unstableSelectorIdByFn.get(selector);
38
+ if (existing) return existing;
39
+ nextUnstableSelectorSeq += 1;
40
+ const selectorId = `rq_u${nextUnstableSelectorSeq}`;
41
+ unstableSelectorIdByFn.set(selector, selectorId);
42
+ return selectorId;
43
+ };
44
+ var unwrapParens = (input) => {
45
+ const trimmed = input.trim();
46
+ if (trimmed.startsWith("(") && trimmed.endsWith(")")) {
47
+ const inner = trimmed.slice(1, -1).trim();
48
+ if (!inner.startsWith("(") || !inner.endsWith(")")) {
49
+ return inner;
50
+ }
51
+ }
52
+ return trimmed;
53
+ };
54
+ var extractArrow = (source) => {
55
+ const idx = source.indexOf("=>");
56
+ if (idx < 0) return void 0;
57
+ const left = source.slice(0, idx).trim();
58
+ const right = source.slice(idx + 2).trim();
59
+ const paramRaw = unwrapParens(left);
60
+ if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(paramRaw)) return void 0;
61
+ if (right.startsWith("{")) {
62
+ const m = right.match(/^\{\s*return\s+(.+?);?\s*\}\s*$/s);
63
+ if (!m) return void 0;
64
+ return { param: paramRaw, body: m[1]?.trim() ?? "" };
65
+ }
66
+ return { param: paramRaw, body: right };
67
+ };
68
+ var extractFunctionReturn = (source) => {
69
+ const trimmed = source.trim();
70
+ const m = trimmed.match(
71
+ /^function\s*(?:[A-Za-z_$][A-Za-z0-9_$]*\s*)?\(\s*([A-Za-z_$][A-Za-z0-9_$]*)\s*\)\s*\{\s*return\s+(.+?);?\s*\}\s*$/s
72
+ );
73
+ if (!m) return void 0;
74
+ const param = m[1]?.trim() ?? "";
75
+ if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(param)) return void 0;
76
+ const body = m[2]?.trim() ?? "";
77
+ if (body.length === 0) return void 0;
78
+ return { param, body };
79
+ };
80
+ var tryParseSelectorSource = (source) => {
81
+ const arrowOrFn = extractArrow(source) ?? extractFunctionReturn(source);
82
+ if (!arrowOrFn) return void 0;
83
+ const expr = unwrapParens(arrowOrFn.body).trim().replace(/;$/, "").trim();
84
+ {
85
+ const re = new RegExp(`^${arrowOrFn.param}\\.([A-Za-z0-9_$]+(?:\\.[A-Za-z0-9_$]+)*)$`);
86
+ const m = expr.match(re);
87
+ if (m) {
88
+ return { kind: "path", path: m[1] };
89
+ }
90
+ }
91
+ if (expr.startsWith("{") && expr.endsWith("}")) {
92
+ const inner = expr.slice(1, -1).trim();
93
+ if (inner.length === 0) return { kind: "struct", entries: [] };
94
+ const parts = inner.split(",").map((p) => p.trim()).filter((p) => p.length > 0);
95
+ const entries = [];
96
+ for (const part of parts) {
97
+ const idx = part.indexOf(":");
98
+ if (idx < 0) return void 0;
99
+ const key = part.slice(0, idx).trim();
100
+ const value = part.slice(idx + 1).trim();
101
+ if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)) return void 0;
102
+ const re = new RegExp(`^${arrowOrFn.param}\\.([A-Za-z0-9_$]+(?:\\.[A-Za-z0-9_$]+)*)$`);
103
+ const m = value.match(re);
104
+ if (!m) return void 0;
105
+ entries.push([key, m[1]]);
106
+ }
107
+ entries.sort((a, b) => a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0);
108
+ return { kind: "struct", entries };
109
+ }
110
+ return void 0;
111
+ };
112
+ var READ_QUERY_TEMPLATE_CACHE_MAX = 2048;
113
+ var readQueryTemplateByFn = /* @__PURE__ */ new WeakMap();
114
+ var readQueryTemplateBySource = /* @__PURE__ */ new Map();
115
+ var lruGet = (map, key) => {
116
+ const value = map.get(key);
117
+ if (value === void 0) return void 0;
118
+ map.delete(key);
119
+ map.set(key, value);
120
+ return value;
121
+ };
122
+ var lruSet = (map, key, value, maxSize) => {
123
+ if (map.has(key)) map.delete(key);
124
+ map.set(key, value);
125
+ if (map.size <= maxSize) return;
126
+ const oldestKey = map.keys().next().value;
127
+ if (oldestKey !== void 0) {
128
+ map.delete(oldestKey);
129
+ }
130
+ };
131
+ var safeToString = (fn) => {
132
+ try {
133
+ return fn.toString();
134
+ } catch {
135
+ return "";
136
+ }
137
+ };
138
+ var make = (spec) => spec;
139
+ var compile = (input) => {
140
+ if (isReadQuery(input)) {
141
+ const reads = normalizeReads(input.reads);
142
+ const readsDigest = reads.length > 0 ? makeReadsDigest(reads) : void 0;
143
+ const equalsKind = input.equalsKind;
144
+ const staticIr2 = {
145
+ selectorId: input.selectorId,
146
+ debugKey: input.debugKey,
147
+ lane: "static",
148
+ producer: "manual",
149
+ reads,
150
+ readsDigest,
151
+ equalsKind
152
+ };
153
+ return {
154
+ ...input,
155
+ reads,
156
+ lane: "static",
157
+ producer: "manual",
158
+ readsDigest,
159
+ staticIr: staticIr2
160
+ };
161
+ }
162
+ const selector = input;
163
+ const debugKey = (typeof selector?.debugKey === "string" && selector.debugKey.length > 0 ? selector.debugKey : void 0) ?? (typeof selector.name === "string" && selector.name.length > 0 ? selector.name : void 0);
164
+ const declaredReads = Array.isArray(selector?.fieldPaths) ? selector.fieldPaths.filter((x) => typeof x === "string") : void 0;
165
+ if (declaredReads && declaredReads.length > 0) {
166
+ const reads = normalizeReads(declaredReads);
167
+ const readsDigest = makeReadsDigest(reads);
168
+ const selectorId2 = computeSelectorId({ kind: "reads", reads });
169
+ const staticIr2 = {
170
+ selectorId: selectorId2,
171
+ debugKey,
172
+ lane: "static",
173
+ producer: "jit",
174
+ reads,
175
+ readsDigest,
176
+ equalsKind: "objectIs"
177
+ };
178
+ return {
179
+ selectorId: selectorId2,
180
+ debugKey,
181
+ reads,
182
+ select: selector,
183
+ equalsKind: "objectIs",
184
+ lane: "static",
185
+ producer: "jit",
186
+ readsDigest,
187
+ staticIr: staticIr2
188
+ };
189
+ }
190
+ const cachedByFn = readQueryTemplateByFn.get(selector);
191
+ if (cachedByFn) {
192
+ const staticIr2 = {
193
+ selectorId: cachedByFn.selectorId,
194
+ debugKey,
195
+ lane: "static",
196
+ producer: "jit",
197
+ reads: cachedByFn.reads,
198
+ readsDigest: cachedByFn.readsDigest,
199
+ equalsKind: cachedByFn.equalsKind
200
+ };
201
+ return {
202
+ selectorId: cachedByFn.selectorId,
203
+ debugKey,
204
+ reads: cachedByFn.reads,
205
+ select: selector,
206
+ equalsKind: cachedByFn.equalsKind,
207
+ lane: "static",
208
+ producer: "jit",
209
+ readsDigest: cachedByFn.readsDigest,
210
+ staticIr: staticIr2
211
+ };
212
+ }
213
+ const srcTrimmed = safeToString(selector).trim();
214
+ const cachedBySource = srcTrimmed.length > 0 ? lruGet(readQueryTemplateBySource, srcTrimmed) : void 0;
215
+ if (cachedBySource) {
216
+ readQueryTemplateByFn.set(selector, cachedBySource);
217
+ const staticIr2 = {
218
+ selectorId: cachedBySource.selectorId,
219
+ debugKey,
220
+ lane: "static",
221
+ producer: "jit",
222
+ reads: cachedBySource.reads,
223
+ readsDigest: cachedBySource.readsDigest,
224
+ equalsKind: cachedBySource.equalsKind
225
+ };
226
+ return {
227
+ selectorId: cachedBySource.selectorId,
228
+ debugKey,
229
+ reads: cachedBySource.reads,
230
+ select: selector,
231
+ equalsKind: cachedBySource.equalsKind,
232
+ lane: "static",
233
+ producer: "jit",
234
+ readsDigest: cachedBySource.readsDigest,
235
+ staticIr: staticIr2
236
+ };
237
+ }
238
+ const parsed = srcTrimmed.length > 0 ? tryParseSelectorSource(srcTrimmed) : void 0;
239
+ if (parsed?.kind === "path") {
240
+ const reads = [parsed.path];
241
+ const readsDigest = makeReadsDigest(reads);
242
+ const selectorId2 = computeSelectorId({ kind: "path", path: parsed.path });
243
+ const template = { selectorId: selectorId2, reads, readsDigest, equalsKind: "objectIs" };
244
+ readQueryTemplateByFn.set(selector, template);
245
+ lruSet(readQueryTemplateBySource, srcTrimmed, template, READ_QUERY_TEMPLATE_CACHE_MAX);
246
+ const staticIr2 = {
247
+ selectorId: selectorId2,
248
+ debugKey,
249
+ lane: "static",
250
+ producer: "jit",
251
+ reads,
252
+ readsDigest,
253
+ equalsKind: "objectIs"
254
+ };
255
+ return {
256
+ selectorId: selectorId2,
257
+ debugKey,
258
+ reads,
259
+ select: selector,
260
+ equalsKind: "objectIs",
261
+ lane: "static",
262
+ producer: "jit",
263
+ readsDigest,
264
+ staticIr: staticIr2
265
+ };
266
+ }
267
+ if (parsed?.kind === "struct") {
268
+ const reads = normalizeReads(parsed.entries.map(([, path]) => path));
269
+ const readsDigest = makeReadsDigest(reads);
270
+ const selectorId2 = computeSelectorId({ kind: "struct", entries: parsed.entries });
271
+ const template = { selectorId: selectorId2, reads, readsDigest, equalsKind: "shallowStruct" };
272
+ readQueryTemplateByFn.set(selector, template);
273
+ lruSet(readQueryTemplateBySource, srcTrimmed, template, READ_QUERY_TEMPLATE_CACHE_MAX);
274
+ const staticIr2 = {
275
+ selectorId: selectorId2,
276
+ debugKey,
277
+ lane: "static",
278
+ producer: "jit",
279
+ reads,
280
+ readsDigest,
281
+ equalsKind: "shallowStruct"
282
+ };
283
+ return {
284
+ selectorId: selectorId2,
285
+ debugKey,
286
+ reads,
287
+ select: selector,
288
+ equalsKind: "shallowStruct",
289
+ lane: "static",
290
+ producer: "jit",
291
+ readsDigest,
292
+ staticIr: staticIr2
293
+ };
294
+ }
295
+ const baseFallbackReason = srcTrimmed.includes("=>") || srcTrimmed.startsWith("function") ? "unsupportedSyntax" : "missingDeps";
296
+ const lowDiscriminabilitySource = srcTrimmed.length === 0 || srcTrimmed.includes("[native code]");
297
+ const fallbackReason = !debugKey || lowDiscriminabilitySource ? "unstableSelectorId" : baseFallbackReason;
298
+ const selectorId = fallbackReason === "unstableSelectorId" ? computeUnstableSelectorId(selector) : computeSelectorId({ kind: "dynamic", debugKey, src: srcTrimmed });
299
+ const staticIr = {
300
+ selectorId,
301
+ debugKey,
302
+ lane: "dynamic",
303
+ producer: "dynamic",
304
+ fallbackReason,
305
+ equalsKind: "objectIs"
306
+ };
307
+ return {
308
+ selectorId,
309
+ debugKey,
310
+ reads: [],
311
+ select: selector,
312
+ equalsKind: "objectIs",
313
+ lane: "dynamic",
314
+ producer: "dynamic",
315
+ fallbackReason,
316
+ staticIr
317
+ };
318
+ };
319
+ var filterNonEmpty = (values) => {
320
+ if (!values || values.length === 0) return void 0;
321
+ const next = values.map((v) => v.trim()).filter((v) => v.length > 0);
322
+ return next.length > 0 ? next : void 0;
323
+ };
324
+ var makeStrictGateDiagnostic = (args) => {
325
+ const severity = args.config.mode === "warn" ? "warning" : "error";
326
+ return {
327
+ type: "diagnostic",
328
+ moduleId: args.details.moduleId,
329
+ instanceId: args.details.instanceId,
330
+ txnSeq: args.details.txnSeq,
331
+ code: "read_query::strict_gate",
332
+ severity,
333
+ message: `ReadQuery strict gate violated: selector entered dynamic lane (selectorId=${args.details.selectorId}, reason=${args.details.fallbackReason}).`,
334
+ hint: "Fix: make the selector statically compilable (AOT/JIT) or pass an explicit ReadQuery; or disable/narrow the gate via RuntimeOptions.readQuery.strictGate.requireStatic / denyFallbackReasons.",
335
+ kind: "read_query:strict_gate",
336
+ trigger: {
337
+ kind: "read_query",
338
+ name: "strict_gate",
339
+ details: args.details
340
+ }
341
+ };
342
+ };
343
+ var makeStrictGateError = (args) => Object.assign(
344
+ new Error(
345
+ `[ReadQueryStrictGateError] selector entered dynamic lane (selectorId=${args.details.selectorId}, reason=${args.details.fallbackReason}).`
346
+ ),
347
+ {
348
+ _tag: "ReadQueryStrictGateError",
349
+ details: args.details
350
+ }
351
+ );
352
+ var evaluateStrictGate = (args) => {
353
+ if (args.config.mode === "off") {
354
+ return { verdict: "PASS" };
355
+ }
356
+ if (args.compiled.lane !== "dynamic") {
357
+ return { verdict: "PASS" };
358
+ }
359
+ const fallbackReason = args.compiled.fallbackReason ?? "missingDeps";
360
+ const denyFallbackReasons = args.config.denyFallbackReasons;
361
+ const denied = !!denyFallbackReasons?.includes(fallbackReason);
362
+ const selectorIds = filterNonEmpty(args.config.requireStatic?.selectorIds);
363
+ const modules = filterNonEmpty(args.config.requireStatic?.modules);
364
+ const hasCoverageFilter = !!selectorIds || !!modules;
365
+ const matchedSelectorId = !!selectorIds?.includes(args.compiled.selectorId);
366
+ const matchedModule = !!modules?.includes(args.moduleId);
367
+ const coveredByRequireStatic = !hasCoverageFilter || matchedSelectorId || matchedModule;
368
+ if (!denied && !coveredByRequireStatic) {
369
+ return { verdict: "PASS" };
370
+ }
371
+ const rule = denied ? "denyFallbackReason" : !hasCoverageFilter ? "requireStatic:global" : matchedSelectorId ? "requireStatic:selectorId" : "requireStatic:module";
372
+ const details = {
373
+ moduleId: args.moduleId,
374
+ instanceId: args.instanceId,
375
+ txnSeq: args.txnSeq,
376
+ selectorId: args.compiled.selectorId,
377
+ debugKey: args.compiled.debugKey,
378
+ fallbackReason,
379
+ rule
380
+ };
381
+ const diagnostic = makeStrictGateDiagnostic({ config: args.config, details });
382
+ if (args.config.mode === "warn") {
383
+ return { verdict: "WARN", diagnostic, details };
384
+ }
385
+ const error = makeStrictGateError({ details });
386
+ return { verdict: "FAIL", diagnostic, error, details };
387
+ };
388
+
389
+ export {
390
+ isReadQuery,
391
+ make,
392
+ compile,
393
+ evaluateStrictGate
394
+ };
395
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL1JlYWRRdWVyeS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgZm52MWEzMiwgc3RhYmxlU3RyaW5naWZ5IH0gZnJvbSAnLi4vLi4vZGlnZXN0LmpzJ1xuaW1wb3J0IHR5cGUgKiBhcyBEZWJ1Z1NpbmsgZnJvbSAnLi9EZWJ1Z1NpbmsuanMnXG5cbmV4cG9ydCB0eXBlIFJlYWRMYW5lID0gJ3N0YXRpYycgfCAnZHluYW1pYydcblxuZXhwb3J0IHR5cGUgUmVhZFByb2R1Y2VyID0gJ2FvdCcgfCAnaml0JyB8ICdtYW51YWwnIHwgJ2R5bmFtaWMnXG5cbmV4cG9ydCB0eXBlIFJlYWRRdWVyeUZhbGxiYWNrUmVhc29uID0gJ21pc3NpbmdEZXBzJyB8ICd1bnN1cHBvcnRlZFN5bnRheCcgfCAndW5zdGFibGVTZWxlY3RvcklkJ1xuXG5leHBvcnQgdHlwZSBFcXVhbHNLaW5kID0gJ29iamVjdElzJyB8ICdzaGFsbG93U3RydWN0JyB8ICdjdXN0b20nXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZHNEaWdlc3Qge1xuICByZWFkb25seSBjb3VudDogbnVtYmVyXG4gIHJlYWRvbmx5IGhhc2g6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRRdWVyeVN0YXRpY0lyIHtcbiAgcmVhZG9ubHkgc2VsZWN0b3JJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGRlYnVnS2V5Pzogc3RyaW5nXG4gIHJlYWRvbmx5IGxhbmU6IFJlYWRMYW5lXG4gIHJlYWRvbmx5IHByb2R1Y2VyOiBSZWFkUHJvZHVjZXJcbiAgcmVhZG9ubHkgcmVhZHM/OiBSZWFkb25seUFycmF5PHN0cmluZyB8IG51bWJlcj5cbiAgcmVhZG9ubHkgcmVhZHNEaWdlc3Q/OiBSZWFkc0RpZ2VzdFxuICByZWFkb25seSBmYWxsYmFja1JlYXNvbj86IFJlYWRRdWVyeUZhbGxiYWNrUmVhc29uXG4gIHJlYWRvbmx5IGVxdWFsc0tpbmQ6IEVxdWFsc0tpbmRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWFkUXVlcnk8UywgVj4ge1xuICByZWFkb25seSBzZWxlY3RvcklkOiBzdHJpbmdcbiAgcmVhZG9ubHkgZGVidWdLZXk/OiBzdHJpbmdcbiAgcmVhZG9ubHkgcmVhZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nIHwgbnVtYmVyPlxuICByZWFkb25seSBzZWxlY3Q6IChzdGF0ZTogUykgPT4gVlxuICByZWFkb25seSBlcXVhbHNLaW5kOiBFcXVhbHNLaW5kXG4gIHJlYWRvbmx5IGVxdWFscz86IChwcmV2aW91czogViwgbmV4dDogVikgPT4gYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRRdWVyeUNvbXBpbGVkPFMsIFY+IGV4dGVuZHMgUmVhZFF1ZXJ5PFMsIFY+IHtcbiAgcmVhZG9ubHkgbGFuZTogUmVhZExhbmVcbiAgcmVhZG9ubHkgcHJvZHVjZXI6IFJlYWRQcm9kdWNlclxuICByZWFkb25seSByZWFkc0RpZ2VzdD86IFJlYWRzRGlnZXN0XG4gIHJlYWRvbmx5IGZhbGxiYWNrUmVhc29uPzogUmVhZFF1ZXJ5RmFsbGJhY2tSZWFzb25cbiAgcmVhZG9ubHkgc3RhdGljSXI6IFJlYWRRdWVyeVN0YXRpY0lyXG59XG5cbmV4cG9ydCB0eXBlIFJlYWRRdWVyeUlucHV0PFMsIFY+ID0gKChzdGF0ZTogUykgPT4gVikgfCBSZWFkUXVlcnk8UywgVj5cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhZFF1ZXJ5PFMsIFY+KGlucHV0OiBSZWFkUXVlcnlJbnB1dDxTLCBWPik6IGlucHV0IGlzIFJlYWRRdWVyeTxTLCBWPlxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhZFF1ZXJ5KGlucHV0OiB1bmtub3duKTogaW5wdXQgaXMgUmVhZFF1ZXJ5PGFueSwgYW55PlxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhZFF1ZXJ5KGlucHV0OiB1bmtub3duKTogaW5wdXQgaXMgUmVhZFF1ZXJ5PGFueSwgYW55PiB7XG4gIGlmICghaW5wdXQgfHwgKHR5cGVvZiBpbnB1dCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIGlucHV0ICE9PSAnZnVuY3Rpb24nKSkgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IG1heWJlID0gaW5wdXQgYXMgYW55XG4gIHJldHVybiB0eXBlb2YgbWF5YmUuc2VsZWN0b3JJZCA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIG1heWJlLnNlbGVjdCA9PT0gJ2Z1bmN0aW9uJyAmJiBBcnJheS5pc0FycmF5KG1heWJlLnJlYWRzKVxufVxuXG5jb25zdCBub3JtYWxpemVSZWFkcyA9IChyZWFkczogUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudW1iZXI+KTogUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0+IHtcbiAgY29uc3QgdW5pcXVlOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gW11cbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gIGZvciAoY29uc3QgciBvZiByZWFkcykge1xuICAgIGNvbnN0IGtleSA9IHR5cGVvZiByID09PSAnbnVtYmVyJyA/IGBuOiR7cn1gIDogYHM6JHtyfWBcbiAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgY29udGludWVcbiAgICBzZWVuLmFkZChrZXkpXG4gICAgdW5pcXVlLnB1c2gocilcbiAgfVxuICByZXR1cm4gdW5pcXVlLnNsaWNlKCkuc29ydCgpXG59XG5cbmNvbnN0IHRvSGFzaDMyTnVtYmVyID0gKGhleDogc3RyaW5nKTogbnVtYmVyID0+IE51bWJlci5wYXJzZUludChoZXgsIDE2KVxuXG5jb25zdCBtYWtlUmVhZHNEaWdlc3QgPSAocmVhZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nIHwgbnVtYmVyPik6IFJlYWRzRGlnZXN0ID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVJlYWRzKHJlYWRzKVxuICByZXR1cm4ge1xuICAgIGNvdW50OiBub3JtYWxpemVkLmxlbmd0aCxcbiAgICBoYXNoOiB0b0hhc2gzMk51bWJlcihmbnYxYTMyKHN0YWJsZVN0cmluZ2lmeShub3JtYWxpemVkKSkpLFxuICB9XG59XG5cbmNvbnN0IGNvbXB1dGVTZWxlY3RvcklkID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IGBycV8ke2ZudjFhMzIoc3RhYmxlU3RyaW5naWZ5KHZhbHVlKSl9YFxuXG5sZXQgbmV4dFVuc3RhYmxlU2VsZWN0b3JTZXEgPSAwXG5jb25zdCB1bnN0YWJsZVNlbGVjdG9ySWRCeUZuID0gbmV3IFdlYWtNYXA8RnVuY3Rpb24sIHN0cmluZz4oKVxuXG5jb25zdCBjb21wdXRlVW5zdGFibGVTZWxlY3RvcklkID0gKHNlbGVjdG9yOiBGdW5jdGlvbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGV4aXN0aW5nID0gdW5zdGFibGVTZWxlY3RvcklkQnlGbi5nZXQoc2VsZWN0b3IpXG4gIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nXG4gIG5leHRVbnN0YWJsZVNlbGVjdG9yU2VxICs9IDFcbiAgY29uc3Qgc2VsZWN0b3JJZCA9IGBycV91JHtuZXh0VW5zdGFibGVTZWxlY3RvclNlcX1gXG4gIHVuc3RhYmxlU2VsZWN0b3JJZEJ5Rm4uc2V0KHNlbGVjdG9yLCBzZWxlY3RvcklkKVxuICByZXR1cm4gc2VsZWN0b3JJZFxufVxuXG5jb25zdCB1bndyYXBQYXJlbnMgPSAoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHRyaW1tZWQgPSBpbnB1dC50cmltKClcbiAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnKCcpICYmIHRyaW1tZWQuZW5kc1dpdGgoJyknKSkge1xuICAgIGNvbnN0IGlubmVyID0gdHJpbW1lZC5zbGljZSgxLCAtMSkudHJpbSgpXG4gICAgLy8gT25seSB1bndyYXAgdGhlIG91dGVybW9zdCBwYWlyIG9mIHBhcmVudGhlc2VzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBicmVha2luZyBzeW50YXguXG4gICAgaWYgKCFpbm5lci5zdGFydHNXaXRoKCcoJykgfHwgIWlubmVyLmVuZHNXaXRoKCcpJykpIHtcbiAgICAgIHJldHVybiBpbm5lclxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJpbW1lZFxufVxuXG5jb25zdCBleHRyYWN0QXJyb3cgPSAoc291cmNlOiBzdHJpbmcpOiB7IHJlYWRvbmx5IHBhcmFtOiBzdHJpbmc7IHJlYWRvbmx5IGJvZHk6IHN0cmluZyB9IHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgaWR4ID0gc291cmNlLmluZGV4T2YoJz0+JylcbiAgaWYgKGlkeCA8IDApIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgbGVmdCA9IHNvdXJjZS5zbGljZSgwLCBpZHgpLnRyaW0oKVxuICBjb25zdCByaWdodCA9IHNvdXJjZS5zbGljZShpZHggKyAyKS50cmltKClcblxuICBjb25zdCBwYXJhbVJhdyA9IHVud3JhcFBhcmVucyhsZWZ0KVxuICBpZiAoIS9eW0EtWmEtel8kXVtBLVphLXowLTlfJF0qJC8udGVzdChwYXJhbVJhdykpIHJldHVybiB1bmRlZmluZWRcblxuICAvLyBibG9jayBib2R5OiB7IHJldHVybiBleHByIH1cbiAgaWYgKHJpZ2h0LnN0YXJ0c1dpdGgoJ3snKSkge1xuICAgIGNvbnN0IG0gPSByaWdodC5tYXRjaCgvXlxce1xccypyZXR1cm5cXHMrKC4rPyk7P1xccypcXH1cXHMqJC9zKVxuICAgIGlmICghbSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHJldHVybiB7IHBhcmFtOiBwYXJhbVJhdywgYm9keTogbVsxXT8udHJpbSgpID8/ICcnIH1cbiAgfVxuXG4gIHJldHVybiB7IHBhcmFtOiBwYXJhbVJhdywgYm9keTogcmlnaHQgfVxufVxuXG5jb25zdCBleHRyYWN0RnVuY3Rpb25SZXR1cm4gPSAoc291cmNlOiBzdHJpbmcpOiB7IHJlYWRvbmx5IHBhcmFtOiBzdHJpbmc7IHJlYWRvbmx5IGJvZHk6IHN0cmluZyB9IHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgdHJpbW1lZCA9IHNvdXJjZS50cmltKClcbiAgY29uc3QgbSA9IHRyaW1tZWQubWF0Y2goXG4gICAgL15mdW5jdGlvblxccyooPzpbQS1aYS16XyRdW0EtWmEtejAtOV8kXSpcXHMqKT9cXChcXHMqKFtBLVphLXpfJF1bQS1aYS16MC05XyRdKilcXHMqXFwpXFxzKlxce1xccypyZXR1cm5cXHMrKC4rPyk7P1xccypcXH1cXHMqJC9zLFxuICApXG4gIGlmICghbSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IHBhcmFtID0gbVsxXT8udHJpbSgpID8/ICcnXG4gIGlmICghL15bQS1aYS16XyRdW0EtWmEtejAtOV8kXSokLy50ZXN0KHBhcmFtKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IGJvZHkgPSBtWzJdPy50cmltKCkgPz8gJydcbiAgaWYgKGJvZHkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIHsgcGFyYW0sIGJvZHkgfVxufVxuXG50eXBlIFBhcnNlZFNlbGVjdG9yID1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICdwYXRoJzsgcmVhZG9ubHkgcGF0aDogc3RyaW5nIH1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICdzdHJ1Y3QnOyByZWFkb25seSBlbnRyaWVzOiBSZWFkb25seUFycmF5PHJlYWRvbmx5IFtzdHJpbmcsIHN0cmluZ10+IH1cblxuY29uc3QgdHJ5UGFyc2VTZWxlY3RvclNvdXJjZSA9IChzb3VyY2U6IHN0cmluZyk6IFBhcnNlZFNlbGVjdG9yIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgYXJyb3dPckZuID0gZXh0cmFjdEFycm93KHNvdXJjZSkgPz8gZXh0cmFjdEZ1bmN0aW9uUmV0dXJuKHNvdXJjZSlcbiAgaWYgKCFhcnJvd09yRm4pIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBleHByID0gdW53cmFwUGFyZW5zKGFycm93T3JGbi5ib2R5KS50cmltKCkucmVwbGFjZSgvOyQvLCAnJykudHJpbSgpXG5cbiAgLy8gcGF0aDogcy5hLmJcbiAge1xuICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChgXiR7YXJyb3dPckZuLnBhcmFtfVxcXFwuKFtBLVphLXowLTlfJF0rKD86XFxcXC5bQS1aYS16MC05XyRdKykqKSRgKVxuICAgIGNvbnN0IG0gPSBleHByLm1hdGNoKHJlKVxuICAgIGlmIChtKSB7XG4gICAgICByZXR1cm4geyBraW5kOiAncGF0aCcsIHBhdGg6IG1bMV0gfVxuICAgIH1cbiAgfVxuXG4gIC8vIHN0cnVjdDogKHsgYTogcy5hLCBiOiBzLmIgfSlcbiAgaWYgKGV4cHIuc3RhcnRzV2l0aCgneycpICYmIGV4cHIuZW5kc1dpdGgoJ30nKSkge1xuICAgIGNvbnN0IGlubmVyID0gZXhwci5zbGljZSgxLCAtMSkudHJpbSgpXG4gICAgaWYgKGlubmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsga2luZDogJ3N0cnVjdCcsIGVudHJpZXM6IFtdIH1cblxuICAgIGNvbnN0IHBhcnRzID0gaW5uZXJcbiAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAubWFwKChwKSA9PiBwLnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoKHApID0+IHAubGVuZ3RoID4gMClcblxuICAgIGNvbnN0IGVudHJpZXM6IEFycmF5PHJlYWRvbmx5IFtzdHJpbmcsIHN0cmluZ10+ID0gW11cblxuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgY29uc3QgaWR4ID0gcGFydC5pbmRleE9mKCc6JylcbiAgICAgIGlmIChpZHggPCAwKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICBjb25zdCBrZXkgPSBwYXJ0LnNsaWNlKDAsIGlkeCkudHJpbSgpXG4gICAgICBjb25zdCB2YWx1ZSA9IHBhcnQuc2xpY2UoaWR4ICsgMSkudHJpbSgpXG5cbiAgICAgIGlmICghL15bQS1aYS16XyRdW0EtWmEtejAtOV8kXSokLy50ZXN0KGtleSkpIHJldHVybiB1bmRlZmluZWRcblxuICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGBeJHthcnJvd09yRm4ucGFyYW19XFxcXC4oW0EtWmEtejAtOV8kXSsoPzpcXFxcLltBLVphLXowLTlfJF0rKSopJGApXG4gICAgICBjb25zdCBtID0gdmFsdWUubWF0Y2gocmUpXG4gICAgICBpZiAoIW0pIHJldHVybiB1bmRlZmluZWRcbiAgICAgIGVudHJpZXMucHVzaChba2V5LCBtWzFdXSBhcyBjb25zdClcbiAgICB9XG5cbiAgICAvLyBTb3J0IGVudHJpZXMgdG8gZW5zdXJlIGEgc3RhYmxlIHNlbGVjdG9ySWQuXG4gICAgZW50cmllcy5zb3J0KChhLCBiKSA9PiAoYVswXSA8IGJbMF0gPyAtMSA6IGFbMF0gPiBiWzBdID8gMSA6IDApKVxuICAgIHJldHVybiB7IGtpbmQ6ICdzdHJ1Y3QnLCBlbnRyaWVzIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxudHlwZSBSZWFkUXVlcnlTdGF0aWNUZW1wbGF0ZSA9IHtcbiAgcmVhZG9ubHkgc2VsZWN0b3JJZDogc3RyaW5nXG4gIHJlYWRvbmx5IHJlYWRzOiBSZWFkb25seUFycmF5PHN0cmluZyB8IG51bWJlcj5cbiAgcmVhZG9ubHkgcmVhZHNEaWdlc3Q6IFJlYWRzRGlnZXN0XG4gIHJlYWRvbmx5IGVxdWFsc0tpbmQ6IEVxdWFsc0tpbmRcbn1cblxuY29uc3QgUkVBRF9RVUVSWV9URU1QTEFURV9DQUNIRV9NQVggPSAyMDQ4XG5jb25zdCByZWFkUXVlcnlUZW1wbGF0ZUJ5Rm4gPSBuZXcgV2Vha01hcDxGdW5jdGlvbiwgUmVhZFF1ZXJ5U3RhdGljVGVtcGxhdGU+KClcbmNvbnN0IHJlYWRRdWVyeVRlbXBsYXRlQnlTb3VyY2UgPSBuZXcgTWFwPHN0cmluZywgUmVhZFF1ZXJ5U3RhdGljVGVtcGxhdGU+KClcblxuY29uc3QgbHJ1R2V0ID0gPEssIFY+KG1hcDogTWFwPEssIFY+LCBrZXk6IEspOiBWIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgdmFsdWUgPSBtYXAuZ2V0KGtleSlcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWRcbiAgbWFwLmRlbGV0ZShrZXkpXG4gIG1hcC5zZXQoa2V5LCB2YWx1ZSlcbiAgcmV0dXJuIHZhbHVlXG59XG5cbmNvbnN0IGxydVNldCA9IDxLLCBWPihtYXA6IE1hcDxLLCBWPiwga2V5OiBLLCB2YWx1ZTogViwgbWF4U2l6ZTogbnVtYmVyKSA9PiB7XG4gIGlmIChtYXAuaGFzKGtleSkpIG1hcC5kZWxldGUoa2V5KVxuICBtYXAuc2V0KGtleSwgdmFsdWUpXG4gIGlmIChtYXAuc2l6ZSA8PSBtYXhTaXplKSByZXR1cm5cbiAgY29uc3Qgb2xkZXN0S2V5ID0gbWFwLmtleXMoKS5uZXh0KCkudmFsdWUgYXMgSyB8IHVuZGVmaW5lZFxuICBpZiAob2xkZXN0S2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBtYXAuZGVsZXRlKG9sZGVzdEtleSlcbiAgfVxufVxuXG5jb25zdCBzYWZlVG9TdHJpbmcgPSAoZm46IEZ1bmN0aW9uKTogc3RyaW5nID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4udG9TdHJpbmcoKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJydcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbWFrZSA9IDxTLCBWPihzcGVjOiBSZWFkUXVlcnk8UywgVj4pOiBSZWFkUXVlcnk8UywgVj4gPT4gc3BlY1xuXG5leHBvcnQgY29uc3QgY29tcGlsZSA9IDxTLCBWPihpbnB1dDogUmVhZFF1ZXJ5SW5wdXQ8UywgVj4pOiBSZWFkUXVlcnlDb21waWxlZDxTLCBWPiA9PiB7XG4gIGlmIChpc1JlYWRRdWVyeShpbnB1dCkpIHtcbiAgICBjb25zdCByZWFkcyA9IG5vcm1hbGl6ZVJlYWRzKGlucHV0LnJlYWRzKVxuICAgIGNvbnN0IHJlYWRzRGlnZXN0ID0gcmVhZHMubGVuZ3RoID4gMCA/IG1ha2VSZWFkc0RpZ2VzdChyZWFkcykgOiB1bmRlZmluZWRcblxuICAgIGNvbnN0IGVxdWFsc0tpbmQgPSBpbnB1dC5lcXVhbHNLaW5kXG4gICAgY29uc3Qgc3RhdGljSXI6IFJlYWRRdWVyeVN0YXRpY0lyID0ge1xuICAgICAgc2VsZWN0b3JJZDogaW5wdXQuc2VsZWN0b3JJZCxcbiAgICAgIGRlYnVnS2V5OiBpbnB1dC5kZWJ1Z0tleSxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdtYW51YWwnLFxuICAgICAgcmVhZHMsXG4gICAgICByZWFkc0RpZ2VzdCxcbiAgICAgIGVxdWFsc0tpbmQsXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmlucHV0LFxuICAgICAgcmVhZHMsXG4gICAgICBsYW5lOiAnc3RhdGljJyxcbiAgICAgIHByb2R1Y2VyOiAnbWFudWFsJyxcbiAgICAgIHJlYWRzRGlnZXN0LFxuICAgICAgc3RhdGljSXIsXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2VsZWN0b3IgPSBpbnB1dFxuICBjb25zdCBkZWJ1Z0tleSA9XG4gICAgKHR5cGVvZiAoc2VsZWN0b3IgYXMgYW55KT8uZGVidWdLZXkgPT09ICdzdHJpbmcnICYmIChzZWxlY3RvciBhcyBhbnkpLmRlYnVnS2V5Lmxlbmd0aCA+IDBcbiAgICAgID8gKHNlbGVjdG9yIGFzIGFueSkuZGVidWdLZXlcbiAgICAgIDogdW5kZWZpbmVkKSA/P1xuICAgICh0eXBlb2YgKHNlbGVjdG9yIGFzIGFueSkubmFtZSA9PT0gJ3N0cmluZycgJiYgKHNlbGVjdG9yIGFzIGFueSkubmFtZS5sZW5ndGggPiAwXG4gICAgICA/IChzZWxlY3RvciBhcyBhbnkpLm5hbWVcbiAgICAgIDogdW5kZWZpbmVkKVxuXG4gIGNvbnN0IGRlY2xhcmVkUmVhZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCA9IEFycmF5LmlzQXJyYXkoKHNlbGVjdG9yIGFzIGFueSk/LmZpZWxkUGF0aHMpXG4gICAgPyAoKHNlbGVjdG9yIGFzIGFueSkuZmllbGRQYXRocyBhcyBSZWFkb25seUFycmF5PHVua25vd24+KS5maWx0ZXIoKHgpOiB4IGlzIHN0cmluZyA9PiB0eXBlb2YgeCA9PT0gJ3N0cmluZycpXG4gICAgOiB1bmRlZmluZWRcblxuICBpZiAoZGVjbGFyZWRSZWFkcyAmJiBkZWNsYXJlZFJlYWRzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCByZWFkcyA9IG5vcm1hbGl6ZVJlYWRzKGRlY2xhcmVkUmVhZHMpXG4gICAgY29uc3QgcmVhZHNEaWdlc3QgPSBtYWtlUmVhZHNEaWdlc3QocmVhZHMpXG4gICAgY29uc3Qgc2VsZWN0b3JJZCA9IGNvbXB1dGVTZWxlY3RvcklkKHsga2luZDogJ3JlYWRzJywgcmVhZHMgfSlcblxuICAgIGNvbnN0IHN0YXRpY0lyOiBSZWFkUXVlcnlTdGF0aWNJciA9IHtcbiAgICAgIHNlbGVjdG9ySWQsXG4gICAgICBkZWJ1Z0tleSxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdqaXQnLFxuICAgICAgcmVhZHMsXG4gICAgICByZWFkc0RpZ2VzdCxcbiAgICAgIGVxdWFsc0tpbmQ6ICdvYmplY3RJcycsXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdG9ySWQsXG4gICAgICBkZWJ1Z0tleSxcbiAgICAgIHJlYWRzLFxuICAgICAgc2VsZWN0OiBzZWxlY3RvciBhcyBhbnksXG4gICAgICBlcXVhbHNLaW5kOiAnb2JqZWN0SXMnLFxuICAgICAgbGFuZTogJ3N0YXRpYycsXG4gICAgICBwcm9kdWNlcjogJ2ppdCcsXG4gICAgICByZWFkc0RpZ2VzdCxcbiAgICAgIHN0YXRpY0lyLFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNhY2hlZEJ5Rm4gPSByZWFkUXVlcnlUZW1wbGF0ZUJ5Rm4uZ2V0KHNlbGVjdG9yIGFzIHVua25vd24gYXMgRnVuY3Rpb24pXG4gIGlmIChjYWNoZWRCeUZuKSB7XG4gICAgY29uc3Qgc3RhdGljSXI6IFJlYWRRdWVyeVN0YXRpY0lyID0ge1xuICAgICAgc2VsZWN0b3JJZDogY2FjaGVkQnlGbi5zZWxlY3RvcklkLFxuICAgICAgZGVidWdLZXksXG4gICAgICBsYW5lOiAnc3RhdGljJyxcbiAgICAgIHByb2R1Y2VyOiAnaml0JyxcbiAgICAgIHJlYWRzOiBjYWNoZWRCeUZuLnJlYWRzLFxuICAgICAgcmVhZHNEaWdlc3Q6IGNhY2hlZEJ5Rm4ucmVhZHNEaWdlc3QsXG4gICAgICBlcXVhbHNLaW5kOiBjYWNoZWRCeUZuLmVxdWFsc0tpbmQsXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdG9ySWQ6IGNhY2hlZEJ5Rm4uc2VsZWN0b3JJZCxcbiAgICAgIGRlYnVnS2V5LFxuICAgICAgcmVhZHM6IGNhY2hlZEJ5Rm4ucmVhZHMsXG4gICAgICBzZWxlY3Q6IHNlbGVjdG9yIGFzIGFueSxcbiAgICAgIGVxdWFsc0tpbmQ6IGNhY2hlZEJ5Rm4uZXF1YWxzS2luZCxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdqaXQnLFxuICAgICAgcmVhZHNEaWdlc3Q6IGNhY2hlZEJ5Rm4ucmVhZHNEaWdlc3QsXG4gICAgICBzdGF0aWNJcixcbiAgICB9XG4gIH1cblxuICBjb25zdCBzcmNUcmltbWVkID0gc2FmZVRvU3RyaW5nKHNlbGVjdG9yIGFzIHVua25vd24gYXMgRnVuY3Rpb24pLnRyaW0oKVxuICBjb25zdCBjYWNoZWRCeVNvdXJjZSA9IHNyY1RyaW1tZWQubGVuZ3RoID4gMCA/IGxydUdldChyZWFkUXVlcnlUZW1wbGF0ZUJ5U291cmNlLCBzcmNUcmltbWVkKSA6IHVuZGVmaW5lZFxuICBpZiAoY2FjaGVkQnlTb3VyY2UpIHtcbiAgICByZWFkUXVlcnlUZW1wbGF0ZUJ5Rm4uc2V0KHNlbGVjdG9yIGFzIHVua25vd24gYXMgRnVuY3Rpb24sIGNhY2hlZEJ5U291cmNlKVxuICAgIGNvbnN0IHN0YXRpY0lyOiBSZWFkUXVlcnlTdGF0aWNJciA9IHtcbiAgICAgIHNlbGVjdG9ySWQ6IGNhY2hlZEJ5U291cmNlLnNlbGVjdG9ySWQsXG4gICAgICBkZWJ1Z0tleSxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdqaXQnLFxuICAgICAgcmVhZHM6IGNhY2hlZEJ5U291cmNlLnJlYWRzLFxuICAgICAgcmVhZHNEaWdlc3Q6IGNhY2hlZEJ5U291cmNlLnJlYWRzRGlnZXN0LFxuICAgICAgZXF1YWxzS2luZDogY2FjaGVkQnlTb3VyY2UuZXF1YWxzS2luZCxcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0b3JJZDogY2FjaGVkQnlTb3VyY2Uuc2VsZWN0b3JJZCxcbiAgICAgIGRlYnVnS2V5LFxuICAgICAgcmVhZHM6IGNhY2hlZEJ5U291cmNlLnJlYWRzLFxuICAgICAgc2VsZWN0OiBzZWxlY3RvciBhcyBhbnksXG4gICAgICBlcXVhbHNLaW5kOiBjYWNoZWRCeVNvdXJjZS5lcXVhbHNLaW5kLFxuICAgICAgbGFuZTogJ3N0YXRpYycsXG4gICAgICBwcm9kdWNlcjogJ2ppdCcsXG4gICAgICByZWFkc0RpZ2VzdDogY2FjaGVkQnlTb3VyY2UucmVhZHNEaWdlc3QsXG4gICAgICBzdGF0aWNJcixcbiAgICB9XG4gIH1cblxuICBjb25zdCBwYXJzZWQgPSBzcmNUcmltbWVkLmxlbmd0aCA+IDAgPyB0cnlQYXJzZVNlbGVjdG9yU291cmNlKHNyY1RyaW1tZWQpIDogdW5kZWZpbmVkXG5cbiAgaWYgKHBhcnNlZD8ua2luZCA9PT0gJ3BhdGgnKSB7XG4gICAgY29uc3QgcmVhZHMgPSBbcGFyc2VkLnBhdGhdXG4gICAgY29uc3QgcmVhZHNEaWdlc3QgPSBtYWtlUmVhZHNEaWdlc3QocmVhZHMpXG4gICAgY29uc3Qgc2VsZWN0b3JJZCA9IGNvbXB1dGVTZWxlY3RvcklkKHsga2luZDogJ3BhdGgnLCBwYXRoOiBwYXJzZWQucGF0aCB9KVxuICAgIGNvbnN0IHRlbXBsYXRlOiBSZWFkUXVlcnlTdGF0aWNUZW1wbGF0ZSA9IHsgc2VsZWN0b3JJZCwgcmVhZHMsIHJlYWRzRGlnZXN0LCBlcXVhbHNLaW5kOiAnb2JqZWN0SXMnIH1cbiAgICByZWFkUXVlcnlUZW1wbGF0ZUJ5Rm4uc2V0KHNlbGVjdG9yIGFzIHVua25vd24gYXMgRnVuY3Rpb24sIHRlbXBsYXRlKVxuICAgIGxydVNldChyZWFkUXVlcnlUZW1wbGF0ZUJ5U291cmNlLCBzcmNUcmltbWVkLCB0ZW1wbGF0ZSwgUkVBRF9RVUVSWV9URU1QTEFURV9DQUNIRV9NQVgpXG5cbiAgICBjb25zdCBzdGF0aWNJcjogUmVhZFF1ZXJ5U3RhdGljSXIgPSB7XG4gICAgICBzZWxlY3RvcklkLFxuICAgICAgZGVidWdLZXksXG4gICAgICBsYW5lOiAnc3RhdGljJyxcbiAgICAgIHByb2R1Y2VyOiAnaml0JyxcbiAgICAgIHJlYWRzLFxuICAgICAgcmVhZHNEaWdlc3QsXG4gICAgICBlcXVhbHNLaW5kOiAnb2JqZWN0SXMnLFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3RvcklkLFxuICAgICAgZGVidWdLZXksXG4gICAgICByZWFkcyxcbiAgICAgIHNlbGVjdDogc2VsZWN0b3IgYXMgYW55LFxuICAgICAgZXF1YWxzS2luZDogJ29iamVjdElzJyxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdqaXQnLFxuICAgICAgcmVhZHNEaWdlc3QsXG4gICAgICBzdGF0aWNJcixcbiAgICB9XG4gIH1cblxuICBpZiAocGFyc2VkPy5raW5kID09PSAnc3RydWN0Jykge1xuICAgIGNvbnN0IHJlYWRzID0gbm9ybWFsaXplUmVhZHMocGFyc2VkLmVudHJpZXMubWFwKChbLCBwYXRoXSkgPT4gcGF0aCkpXG4gICAgY29uc3QgcmVhZHNEaWdlc3QgPSBtYWtlUmVhZHNEaWdlc3QocmVhZHMpXG4gICAgY29uc3Qgc2VsZWN0b3JJZCA9IGNvbXB1dGVTZWxlY3RvcklkKHsga2luZDogJ3N0cnVjdCcsIGVudHJpZXM6IHBhcnNlZC5lbnRyaWVzIH0pXG4gICAgY29uc3QgdGVtcGxhdGU6IFJlYWRRdWVyeVN0YXRpY1RlbXBsYXRlID0geyBzZWxlY3RvcklkLCByZWFkcywgcmVhZHNEaWdlc3QsIGVxdWFsc0tpbmQ6ICdzaGFsbG93U3RydWN0JyB9XG4gICAgcmVhZFF1ZXJ5VGVtcGxhdGVCeUZuLnNldChzZWxlY3RvciBhcyB1bmtub3duIGFzIEZ1bmN0aW9uLCB0ZW1wbGF0ZSlcbiAgICBscnVTZXQocmVhZFF1ZXJ5VGVtcGxhdGVCeVNvdXJjZSwgc3JjVHJpbW1lZCwgdGVtcGxhdGUsIFJFQURfUVVFUllfVEVNUExBVEVfQ0FDSEVfTUFYKVxuXG4gICAgY29uc3Qgc3RhdGljSXI6IFJlYWRRdWVyeVN0YXRpY0lyID0ge1xuICAgICAgc2VsZWN0b3JJZCxcbiAgICAgIGRlYnVnS2V5LFxuICAgICAgbGFuZTogJ3N0YXRpYycsXG4gICAgICBwcm9kdWNlcjogJ2ppdCcsXG4gICAgICByZWFkcyxcbiAgICAgIHJlYWRzRGlnZXN0LFxuICAgICAgZXF1YWxzS2luZDogJ3NoYWxsb3dTdHJ1Y3QnLFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3RvcklkLFxuICAgICAgZGVidWdLZXksXG4gICAgICByZWFkcyxcbiAgICAgIHNlbGVjdDogc2VsZWN0b3IgYXMgYW55LFxuICAgICAgZXF1YWxzS2luZDogJ3NoYWxsb3dTdHJ1Y3QnLFxuICAgICAgbGFuZTogJ3N0YXRpYycsXG4gICAgICBwcm9kdWNlcjogJ2ppdCcsXG4gICAgICByZWFkc0RpZ2VzdCxcbiAgICAgIHN0YXRpY0lyLFxuICAgIH1cbiAgfVxuXG4gIC8vIER5bmFtaWMgbGFuZSBmYWxsYmFjayAobm8gc3RhYmxlIHJlYWRzIC8gdW5zdXBwb3J0ZWQgc3Vic2V0KVxuICBjb25zdCBiYXNlRmFsbGJhY2tSZWFzb246IFJlYWRRdWVyeUZhbGxiYWNrUmVhc29uID1cbiAgICBzcmNUcmltbWVkLmluY2x1ZGVzKCc9PicpIHx8IHNyY1RyaW1tZWQuc3RhcnRzV2l0aCgnZnVuY3Rpb24nKSA/ICd1bnN1cHBvcnRlZFN5bnRheCcgOiAnbWlzc2luZ0RlcHMnXG5cbiAgY29uc3QgbG93RGlzY3JpbWluYWJpbGl0eVNvdXJjZSA9IHNyY1RyaW1tZWQubGVuZ3RoID09PSAwIHx8IHNyY1RyaW1tZWQuaW5jbHVkZXMoJ1tuYXRpdmUgY29kZV0nKVxuICBjb25zdCBmYWxsYmFja1JlYXNvbjogUmVhZFF1ZXJ5RmFsbGJhY2tSZWFzb24gPVxuICAgICFkZWJ1Z0tleSB8fCBsb3dEaXNjcmltaW5hYmlsaXR5U291cmNlID8gJ3Vuc3RhYmxlU2VsZWN0b3JJZCcgOiBiYXNlRmFsbGJhY2tSZWFzb25cblxuICBjb25zdCBzZWxlY3RvcklkID1cbiAgICBmYWxsYmFja1JlYXNvbiA9PT0gJ3Vuc3RhYmxlU2VsZWN0b3JJZCdcbiAgICAgID8gY29tcHV0ZVVuc3RhYmxlU2VsZWN0b3JJZChzZWxlY3RvciBhcyB1bmtub3duIGFzIEZ1bmN0aW9uKVxuICAgICAgOiBjb21wdXRlU2VsZWN0b3JJZCh7IGtpbmQ6ICdkeW5hbWljJywgZGVidWdLZXksIHNyYzogc3JjVHJpbW1lZCB9KVxuICBjb25zdCBzdGF0aWNJcjogUmVhZFF1ZXJ5U3RhdGljSXIgPSB7XG4gICAgc2VsZWN0b3JJZCxcbiAgICBkZWJ1Z0tleSxcbiAgICBsYW5lOiAnZHluYW1pYycsXG4gICAgcHJvZHVjZXI6ICdkeW5hbWljJyxcbiAgICBmYWxsYmFja1JlYXNvbixcbiAgICBlcXVhbHNLaW5kOiAnb2JqZWN0SXMnLFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzZWxlY3RvcklkLFxuICAgIGRlYnVnS2V5LFxuICAgIHJlYWRzOiBbXSxcbiAgICBzZWxlY3Q6IHNlbGVjdG9yIGFzIGFueSxcbiAgICBlcXVhbHNLaW5kOiAnb2JqZWN0SXMnLFxuICAgIGxhbmU6ICdkeW5hbWljJyxcbiAgICBwcm9kdWNlcjogJ2R5bmFtaWMnLFxuICAgIGZhbGxiYWNrUmVhc29uLFxuICAgIHN0YXRpY0lyLFxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZFF1ZXJ5U3RyaWN0R2F0ZUNvbmZpZyB7XG4gIHJlYWRvbmx5IG1vZGU6ICdvZmYnIHwgJ3dhcm4nIHwgJ2Vycm9yJ1xuICByZWFkb25seSByZXF1aXJlU3RhdGljPzoge1xuICAgIHJlYWRvbmx5IHNlbGVjdG9ySWRzPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gICAgcmVhZG9ubHkgbW9kdWxlcz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICB9XG4gIHJlYWRvbmx5IGRlbnlGYWxsYmFja1JlYXNvbnM/OiBSZWFkb25seUFycmF5PFJlYWRRdWVyeUZhbGxiYWNrUmVhc29uPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRRdWVyeVN0cmljdEdhdGVWaW9sYXRpb25EZXRhaWxzIHtcbiAgcmVhZG9ubHkgbW9kdWxlSWQ6IHN0cmluZ1xuICByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgdHhuU2VxOiBudW1iZXJcbiAgcmVhZG9ubHkgc2VsZWN0b3JJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGRlYnVnS2V5Pzogc3RyaW5nXG4gIHJlYWRvbmx5IGZhbGxiYWNrUmVhc29uOiBSZWFkUXVlcnlGYWxsYmFja1JlYXNvblxuICByZWFkb25seSBydWxlOiAnZGVueUZhbGxiYWNrUmVhc29uJyB8ICdyZXF1aXJlU3RhdGljOmdsb2JhbCcgfCAncmVxdWlyZVN0YXRpYzpzZWxlY3RvcklkJyB8ICdyZXF1aXJlU3RhdGljOm1vZHVsZSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWFkUXVlcnlTdHJpY3RHYXRlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IF90YWc6ICdSZWFkUXVlcnlTdHJpY3RHYXRlRXJyb3InXG4gIHJlYWRvbmx5IGRldGFpbHM6IFJlYWRRdWVyeVN0cmljdEdhdGVWaW9sYXRpb25EZXRhaWxzXG59XG5cbmV4cG9ydCB0eXBlIFJlYWRRdWVyeVN0cmljdEdhdGVEaWFnbm9zdGljRXZlbnQgPSBFeHRyYWN0PERlYnVnU2luay5FdmVudCwgeyByZWFkb25seSB0eXBlOiAnZGlhZ25vc3RpYycgfT5cblxuZXhwb3J0IHR5cGUgUmVhZFF1ZXJ5U3RyaWN0R2F0ZURlY2lzaW9uID1cbiAgfCB7IHJlYWRvbmx5IHZlcmRpY3Q6ICdQQVNTJyB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdmVyZGljdDogJ1dBUk4nXG4gICAgICByZWFkb25seSBkaWFnbm9zdGljOiBSZWFkUXVlcnlTdHJpY3RHYXRlRGlhZ25vc3RpY0V2ZW50XG4gICAgICByZWFkb25seSBkZXRhaWxzOiBSZWFkUXVlcnlTdHJpY3RHYXRlVmlvbGF0aW9uRGV0YWlsc1xuICAgIH1cbiAgfCB7XG4gICAgICByZWFkb25seSB2ZXJkaWN0OiAnRkFJTCdcbiAgICAgIHJlYWRvbmx5IGRpYWdub3N0aWM6IFJlYWRRdWVyeVN0cmljdEdhdGVEaWFnbm9zdGljRXZlbnRcbiAgICAgIHJlYWRvbmx5IGVycm9yOiBSZWFkUXVlcnlTdHJpY3RHYXRlRXJyb3JcbiAgICAgIHJlYWRvbmx5IGRldGFpbHM6IFJlYWRRdWVyeVN0cmljdEdhdGVWaW9sYXRpb25EZXRhaWxzXG4gICAgfVxuXG5jb25zdCBmaWx0ZXJOb25FbXB0eSA9ICh2YWx1ZXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCk6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghdmFsdWVzIHx8IHZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgbmV4dCA9IHZhbHVlcy5tYXAoKHYpID0+IHYudHJpbSgpKS5maWx0ZXIoKHYpID0+IHYubGVuZ3RoID4gMClcbiAgcmV0dXJuIG5leHQubGVuZ3RoID4gMCA/IG5leHQgOiB1bmRlZmluZWRcbn1cblxuY29uc3QgbWFrZVN0cmljdEdhdGVEaWFnbm9zdGljID0gKGFyZ3M6IHtcbiAgcmVhZG9ubHkgY29uZmlnOiBSZWFkUXVlcnlTdHJpY3RHYXRlQ29uZmlnXG4gIHJlYWRvbmx5IGRldGFpbHM6IFJlYWRRdWVyeVN0cmljdEdhdGVWaW9sYXRpb25EZXRhaWxzXG59KTogUmVhZFF1ZXJ5U3RyaWN0R2F0ZURpYWdub3N0aWNFdmVudCA9PiB7XG4gIGNvbnN0IHNldmVyaXR5ID0gYXJncy5jb25maWcubW9kZSA9PT0gJ3dhcm4nID8gKCd3YXJuaW5nJyBhcyBjb25zdCkgOiAoJ2Vycm9yJyBhcyBjb25zdClcblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdkaWFnbm9zdGljJyxcbiAgICBtb2R1bGVJZDogYXJncy5kZXRhaWxzLm1vZHVsZUlkLFxuICAgIGluc3RhbmNlSWQ6IGFyZ3MuZGV0YWlscy5pbnN0YW5jZUlkLFxuICAgIHR4blNlcTogYXJncy5kZXRhaWxzLnR4blNlcSxcbiAgICBjb2RlOiAncmVhZF9xdWVyeTo6c3RyaWN0X2dhdGUnLFxuICAgIHNldmVyaXR5LFxuICAgIG1lc3NhZ2U6IGBSZWFkUXVlcnkgc3RyaWN0IGdhdGUgdmlvbGF0ZWQ6IHNlbGVjdG9yIGVudGVyZWQgZHluYW1pYyBsYW5lIChzZWxlY3RvcklkPSR7YXJncy5kZXRhaWxzLnNlbGVjdG9ySWR9LCByZWFzb249JHthcmdzLmRldGFpbHMuZmFsbGJhY2tSZWFzb259KS5gLFxuICAgIGhpbnQ6XG4gICAgICAnRml4OiBtYWtlIHRoZSBzZWxlY3RvciBzdGF0aWNhbGx5IGNvbXBpbGFibGUgKEFPVC9KSVQpIG9yIHBhc3MgYW4gZXhwbGljaXQgUmVhZFF1ZXJ5OyAnICtcbiAgICAgICdvciBkaXNhYmxlL25hcnJvdyB0aGUgZ2F0ZSB2aWEgUnVudGltZU9wdGlvbnMucmVhZFF1ZXJ5LnN0cmljdEdhdGUucmVxdWlyZVN0YXRpYyAvIGRlbnlGYWxsYmFja1JlYXNvbnMuJyxcbiAgICBraW5kOiAncmVhZF9xdWVyeTpzdHJpY3RfZ2F0ZScsXG4gICAgdHJpZ2dlcjoge1xuICAgICAga2luZDogJ3JlYWRfcXVlcnknLFxuICAgICAgbmFtZTogJ3N0cmljdF9nYXRlJyxcbiAgICAgIGRldGFpbHM6IGFyZ3MuZGV0YWlscyxcbiAgICB9LFxuICB9XG59XG5cbmNvbnN0IG1ha2VTdHJpY3RHYXRlRXJyb3IgPSAoYXJnczoge1xuICByZWFkb25seSBkZXRhaWxzOiBSZWFkUXVlcnlTdHJpY3RHYXRlVmlvbGF0aW9uRGV0YWlsc1xufSk6IFJlYWRRdWVyeVN0cmljdEdhdGVFcnJvciA9PlxuICBPYmplY3QuYXNzaWduKFxuICAgIG5ldyBFcnJvcihcbiAgICAgIGBbUmVhZFF1ZXJ5U3RyaWN0R2F0ZUVycm9yXSBzZWxlY3RvciBlbnRlcmVkIGR5bmFtaWMgbGFuZSAoc2VsZWN0b3JJZD0ke2FyZ3MuZGV0YWlscy5zZWxlY3RvcklkfSwgcmVhc29uPSR7YXJncy5kZXRhaWxzLmZhbGxiYWNrUmVhc29ufSkuYCxcbiAgICApLFxuICAgIHtcbiAgICAgIF90YWc6ICdSZWFkUXVlcnlTdHJpY3RHYXRlRXJyb3InIGFzIGNvbnN0LFxuICAgICAgZGV0YWlsczogYXJncy5kZXRhaWxzLFxuICAgIH0sXG4gICkgYXMgUmVhZFF1ZXJ5U3RyaWN0R2F0ZUVycm9yXG5cbmV4cG9ydCBjb25zdCBldmFsdWF0ZVN0cmljdEdhdGUgPSAoYXJnczoge1xuICByZWFkb25seSBjb25maWc6IFJlYWRRdWVyeVN0cmljdEdhdGVDb25maWdcbiAgcmVhZG9ubHkgbW9kdWxlSWQ6IHN0cmluZ1xuICByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgdHhuU2VxOiBudW1iZXJcbiAgcmVhZG9ubHkgY29tcGlsZWQ6IFJlYWRRdWVyeUNvbXBpbGVkPGFueSwgYW55PlxufSk6IFJlYWRRdWVyeVN0cmljdEdhdGVEZWNpc2lvbiA9PiB7XG4gIGlmIChhcmdzLmNvbmZpZy5tb2RlID09PSAnb2ZmJykge1xuICAgIHJldHVybiB7IHZlcmRpY3Q6ICdQQVNTJyB9XG4gIH1cblxuICBpZiAoYXJncy5jb21waWxlZC5sYW5lICE9PSAnZHluYW1pYycpIHtcbiAgICByZXR1cm4geyB2ZXJkaWN0OiAnUEFTUycgfVxuICB9XG5cbiAgY29uc3QgZmFsbGJhY2tSZWFzb24gPSAoYXJncy5jb21waWxlZC5mYWxsYmFja1JlYXNvbiA/PyAnbWlzc2luZ0RlcHMnKSBhcyBSZWFkUXVlcnlGYWxsYmFja1JlYXNvblxuXG4gIGNvbnN0IGRlbnlGYWxsYmFja1JlYXNvbnMgPSBhcmdzLmNvbmZpZy5kZW55RmFsbGJhY2tSZWFzb25zXG4gIGNvbnN0IGRlbmllZCA9ICEhZGVueUZhbGxiYWNrUmVhc29ucz8uaW5jbHVkZXMoZmFsbGJhY2tSZWFzb24pXG5cbiAgY29uc3Qgc2VsZWN0b3JJZHMgPSBmaWx0ZXJOb25FbXB0eShhcmdzLmNvbmZpZy5yZXF1aXJlU3RhdGljPy5zZWxlY3RvcklkcylcbiAgY29uc3QgbW9kdWxlcyA9IGZpbHRlck5vbkVtcHR5KGFyZ3MuY29uZmlnLnJlcXVpcmVTdGF0aWM/Lm1vZHVsZXMpXG4gIGNvbnN0IGhhc0NvdmVyYWdlRmlsdGVyID0gISFzZWxlY3RvcklkcyB8fCAhIW1vZHVsZXNcblxuICBjb25zdCBtYXRjaGVkU2VsZWN0b3JJZCA9ICEhc2VsZWN0b3JJZHM/LmluY2x1ZGVzKGFyZ3MuY29tcGlsZWQuc2VsZWN0b3JJZClcbiAgY29uc3QgbWF0Y2hlZE1vZHVsZSA9ICEhbW9kdWxlcz8uaW5jbHVkZXMoYXJncy5tb2R1bGVJZClcbiAgY29uc3QgY292ZXJlZEJ5UmVxdWlyZVN0YXRpYyA9ICFoYXNDb3ZlcmFnZUZpbHRlciB8fCBtYXRjaGVkU2VsZWN0b3JJZCB8fCBtYXRjaGVkTW9kdWxlXG5cbiAgaWYgKCFkZW5pZWQgJiYgIWNvdmVyZWRCeVJlcXVpcmVTdGF0aWMpIHtcbiAgICByZXR1cm4geyB2ZXJkaWN0OiAnUEFTUycgfVxuICB9XG5cbiAgY29uc3QgcnVsZTogUmVhZFF1ZXJ5U3RyaWN0R2F0ZVZpb2xhdGlvbkRldGFpbHNbJ3J1bGUnXSA9IGRlbmllZFxuICAgID8gJ2RlbnlGYWxsYmFja1JlYXNvbidcbiAgICA6ICFoYXNDb3ZlcmFnZUZpbHRlclxuICAgICAgPyAncmVxdWlyZVN0YXRpYzpnbG9iYWwnXG4gICAgICA6IG1hdGNoZWRTZWxlY3RvcklkXG4gICAgICAgID8gJ3JlcXVpcmVTdGF0aWM6c2VsZWN0b3JJZCdcbiAgICAgICAgOiAncmVxdWlyZVN0YXRpYzptb2R1bGUnXG5cbiAgY29uc3QgZGV0YWlsczogUmVhZFF1ZXJ5U3RyaWN0R2F0ZVZpb2xhdGlvbkRldGFpbHMgPSB7XG4gICAgbW9kdWxlSWQ6IGFyZ3MubW9kdWxlSWQsXG4gICAgaW5zdGFuY2VJZDogYXJncy5pbnN0YW5jZUlkLFxuICAgIHR4blNlcTogYXJncy50eG5TZXEsXG4gICAgc2VsZWN0b3JJZDogYXJncy5jb21waWxlZC5zZWxlY3RvcklkLFxuICAgIGRlYnVnS2V5OiBhcmdzLmNvbXBpbGVkLmRlYnVnS2V5LFxuICAgIGZhbGxiYWNrUmVhc29uLFxuICAgIHJ1bGUsXG4gIH1cblxuICBjb25zdCBkaWFnbm9zdGljID0gbWFrZVN0cmljdEdhdGVEaWFnbm9zdGljKHsgY29uZmlnOiBhcmdzLmNvbmZpZywgZGV0YWlscyB9KVxuXG4gIGlmIChhcmdzLmNvbmZpZy5tb2RlID09PSAnd2FybicpIHtcbiAgICByZXR1cm4geyB2ZXJkaWN0OiAnV0FSTicsIGRpYWdub3N0aWMsIGRldGFpbHMgfVxuICB9XG5cbiAgY29uc3QgZXJyb3IgPSBtYWtlU3RyaWN0R2F0ZUVycm9yKHsgZGV0YWlscyB9KVxuICByZXR1cm4geyB2ZXJkaWN0OiAnRkFJTCcsIGRpYWdub3N0aWMsIGVycm9yLCBkZXRhaWxzIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7O0FBZ0RPLFNBQVMsWUFBWSxPQUE4QztBQUN4RSxNQUFJLENBQUMsU0FBVSxPQUFPLFVBQVUsWUFBWSxPQUFPLFVBQVUsV0FBYSxRQUFPO0FBQ2pGLFFBQU0sUUFBUTtBQUNkLFNBQU8sT0FBTyxNQUFNLGVBQWUsWUFBWSxPQUFPLE1BQU0sV0FBVyxjQUFjLE1BQU0sUUFBUSxNQUFNLEtBQUs7QUFDaEg7QUFFQSxJQUFNLGlCQUFpQixDQUFDLFVBQTBFO0FBQ2hHLFFBQU0sU0FBaUMsQ0FBQztBQUN4QyxRQUFNLE9BQU8sb0JBQUksSUFBWTtBQUM3QixhQUFXLEtBQUssT0FBTztBQUNyQixVQUFNLE1BQU0sT0FBTyxNQUFNLFdBQVcsS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDO0FBQ3JELFFBQUksS0FBSyxJQUFJLEdBQUcsRUFBRztBQUNuQixTQUFLLElBQUksR0FBRztBQUNaLFdBQU8sS0FBSyxDQUFDO0FBQUEsRUFDZjtBQUNB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QUFDLHdCQUF3QjtBQUN0QyxXQUFPLEVBQUUsU0FBUyxPQUFPO0FBQUEsRUFDM0I7QUFFQSxRQUFNLE9BQW9ELFNBQ3RELHVCQUNBLENBQUMsb0JBQ0MseUJBQ0Esb0JBQ0UsNkJBQ0E7QUFFUixRQUFNLFVBQStDO0FBQUEsSUFDbkQsVUFBVSxLQUFLO0FBQUEsSUFDZixZQUFZLEtBQUs7QUFBQSxJQUNqQixRQUFRLEtBQUs7QUFBQSxJQUNiLFlBQVksS0FBSyxTQUFTO0FBQUEsSUFDMUIsVUFBVSxLQUFLLFNBQVM7QUFBQSxJQUN4QjtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsUUFBTSxhQUFhLHlCQUF5QixFQUFFLFFBQVEsS0FBSyxRQUFRLFFBQVEsQ0FBQztBQUU1RSxNQUFJLEtBQUssT0FBTyxTQUFTLFFBQVE7QUFDL0IsV0FBTyxFQUFFLFNBQVMsUUFBUSxZQUFZLFFBQVE7QUFBQSxFQUNoRDtBQUVBLFFBQU0sUUFBUSxvQkFBb0IsRUFBRSxRQUFRLENBQUM7QUFDN0MsU0FBTyxFQUFFLFNBQVMsUUFBUSxZQUFZLE9BQU8sUUFBUTtBQUN2RDsiLAogICJuYW1lcyI6IFsic3RhdGljSXIiLCAic2VsZWN0b3JJZCJdCn0K