@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,383 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ fnv1a32,
5
+ stableStringify
6
+ } from "./chunk-6JRP52YT.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((a, b) => String(a).localeCompare(String(b)));
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 tryParseSelectorSource = (source) => {
69
+ const arrow = extractArrow(source);
70
+ if (!arrow) return void 0;
71
+ const expr = unwrapParens(arrow.body).trim().replace(/;$/, "").trim();
72
+ {
73
+ const re = new RegExp(`^${arrow.param}\\.([A-Za-z0-9_$]+(?:\\.[A-Za-z0-9_$]+)*)$`);
74
+ const m = expr.match(re);
75
+ if (m) {
76
+ return { kind: "path", path: m[1] };
77
+ }
78
+ }
79
+ if (expr.startsWith("{") && expr.endsWith("}")) {
80
+ const inner = expr.slice(1, -1).trim();
81
+ if (inner.length === 0) return { kind: "struct", entries: [] };
82
+ const parts = inner.split(",").map((p) => p.trim()).filter((p) => p.length > 0);
83
+ const entries = [];
84
+ for (const part of parts) {
85
+ const idx = part.indexOf(":");
86
+ if (idx < 0) return void 0;
87
+ const key = part.slice(0, idx).trim();
88
+ const value = part.slice(idx + 1).trim();
89
+ if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)) return void 0;
90
+ const re = new RegExp(`^${arrow.param}\\.([A-Za-z0-9_$]+(?:\\.[A-Za-z0-9_$]+)*)$`);
91
+ const m = value.match(re);
92
+ if (!m) return void 0;
93
+ entries.push([key, m[1]]);
94
+ }
95
+ entries.sort((a, b) => a[0].localeCompare(b[0]));
96
+ return { kind: "struct", entries };
97
+ }
98
+ return void 0;
99
+ };
100
+ var READ_QUERY_TEMPLATE_CACHE_MAX = 2048;
101
+ var readQueryTemplateByFn = /* @__PURE__ */ new WeakMap();
102
+ var readQueryTemplateBySource = /* @__PURE__ */ new Map();
103
+ var lruGet = (map, key) => {
104
+ const value = map.get(key);
105
+ if (value === void 0) return void 0;
106
+ map.delete(key);
107
+ map.set(key, value);
108
+ return value;
109
+ };
110
+ var lruSet = (map, key, value, maxSize) => {
111
+ if (map.has(key)) map.delete(key);
112
+ map.set(key, value);
113
+ if (map.size <= maxSize) return;
114
+ const oldestKey = map.keys().next().value;
115
+ if (oldestKey !== void 0) {
116
+ map.delete(oldestKey);
117
+ }
118
+ };
119
+ var safeToString = (fn) => {
120
+ try {
121
+ return fn.toString();
122
+ } catch {
123
+ return "";
124
+ }
125
+ };
126
+ var make = (spec) => spec;
127
+ var compile = (input) => {
128
+ if (isReadQuery(input)) {
129
+ const reads = normalizeReads(input.reads);
130
+ const readsDigest = reads.length > 0 ? makeReadsDigest(reads) : void 0;
131
+ const equalsKind = input.equalsKind;
132
+ const staticIr2 = {
133
+ selectorId: input.selectorId,
134
+ debugKey: input.debugKey,
135
+ lane: "static",
136
+ producer: "manual",
137
+ reads,
138
+ readsDigest,
139
+ equalsKind
140
+ };
141
+ return {
142
+ ...input,
143
+ reads,
144
+ lane: "static",
145
+ producer: "manual",
146
+ readsDigest,
147
+ staticIr: staticIr2
148
+ };
149
+ }
150
+ const selector = input;
151
+ 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);
152
+ const declaredReads = Array.isArray(selector?.fieldPaths) ? selector.fieldPaths.filter((x) => typeof x === "string") : void 0;
153
+ if (declaredReads && declaredReads.length > 0) {
154
+ const reads = normalizeReads(declaredReads);
155
+ const readsDigest = makeReadsDigest(reads);
156
+ const selectorId2 = computeSelectorId({ kind: "reads", reads });
157
+ const staticIr2 = {
158
+ selectorId: selectorId2,
159
+ debugKey,
160
+ lane: "static",
161
+ producer: "jit",
162
+ reads,
163
+ readsDigest,
164
+ equalsKind: "objectIs"
165
+ };
166
+ return {
167
+ selectorId: selectorId2,
168
+ debugKey,
169
+ reads,
170
+ select: selector,
171
+ equalsKind: "objectIs",
172
+ lane: "static",
173
+ producer: "jit",
174
+ readsDigest,
175
+ staticIr: staticIr2
176
+ };
177
+ }
178
+ const cachedByFn = readQueryTemplateByFn.get(selector);
179
+ if (cachedByFn) {
180
+ const staticIr2 = {
181
+ selectorId: cachedByFn.selectorId,
182
+ debugKey,
183
+ lane: "static",
184
+ producer: "jit",
185
+ reads: cachedByFn.reads,
186
+ readsDigest: cachedByFn.readsDigest,
187
+ equalsKind: cachedByFn.equalsKind
188
+ };
189
+ return {
190
+ selectorId: cachedByFn.selectorId,
191
+ debugKey,
192
+ reads: cachedByFn.reads,
193
+ select: selector,
194
+ equalsKind: cachedByFn.equalsKind,
195
+ lane: "static",
196
+ producer: "jit",
197
+ readsDigest: cachedByFn.readsDigest,
198
+ staticIr: staticIr2
199
+ };
200
+ }
201
+ const srcTrimmed = safeToString(selector).trim();
202
+ const cachedBySource = srcTrimmed.length > 0 ? lruGet(readQueryTemplateBySource, srcTrimmed) : void 0;
203
+ if (cachedBySource) {
204
+ readQueryTemplateByFn.set(selector, cachedBySource);
205
+ const staticIr2 = {
206
+ selectorId: cachedBySource.selectorId,
207
+ debugKey,
208
+ lane: "static",
209
+ producer: "jit",
210
+ reads: cachedBySource.reads,
211
+ readsDigest: cachedBySource.readsDigest,
212
+ equalsKind: cachedBySource.equalsKind
213
+ };
214
+ return {
215
+ selectorId: cachedBySource.selectorId,
216
+ debugKey,
217
+ reads: cachedBySource.reads,
218
+ select: selector,
219
+ equalsKind: cachedBySource.equalsKind,
220
+ lane: "static",
221
+ producer: "jit",
222
+ readsDigest: cachedBySource.readsDigest,
223
+ staticIr: staticIr2
224
+ };
225
+ }
226
+ const parsed = srcTrimmed.length > 0 ? tryParseSelectorSource(srcTrimmed) : void 0;
227
+ if (parsed?.kind === "path") {
228
+ const reads = [parsed.path];
229
+ const readsDigest = makeReadsDigest(reads);
230
+ const selectorId2 = computeSelectorId({ kind: "path", path: parsed.path });
231
+ const template = { selectorId: selectorId2, reads, readsDigest, equalsKind: "objectIs" };
232
+ readQueryTemplateByFn.set(selector, template);
233
+ lruSet(readQueryTemplateBySource, srcTrimmed, template, READ_QUERY_TEMPLATE_CACHE_MAX);
234
+ const staticIr2 = {
235
+ selectorId: selectorId2,
236
+ debugKey,
237
+ lane: "static",
238
+ producer: "jit",
239
+ reads,
240
+ readsDigest,
241
+ equalsKind: "objectIs"
242
+ };
243
+ return {
244
+ selectorId: selectorId2,
245
+ debugKey,
246
+ reads,
247
+ select: selector,
248
+ equalsKind: "objectIs",
249
+ lane: "static",
250
+ producer: "jit",
251
+ readsDigest,
252
+ staticIr: staticIr2
253
+ };
254
+ }
255
+ if (parsed?.kind === "struct") {
256
+ const reads = normalizeReads(parsed.entries.map(([, path]) => path));
257
+ const readsDigest = makeReadsDigest(reads);
258
+ const selectorId2 = computeSelectorId({ kind: "struct", entries: parsed.entries });
259
+ const template = { selectorId: selectorId2, reads, readsDigest, equalsKind: "shallowStruct" };
260
+ readQueryTemplateByFn.set(selector, template);
261
+ lruSet(readQueryTemplateBySource, srcTrimmed, template, READ_QUERY_TEMPLATE_CACHE_MAX);
262
+ const staticIr2 = {
263
+ selectorId: selectorId2,
264
+ debugKey,
265
+ lane: "static",
266
+ producer: "jit",
267
+ reads,
268
+ readsDigest,
269
+ equalsKind: "shallowStruct"
270
+ };
271
+ return {
272
+ selectorId: selectorId2,
273
+ debugKey,
274
+ reads,
275
+ select: selector,
276
+ equalsKind: "shallowStruct",
277
+ lane: "static",
278
+ producer: "jit",
279
+ readsDigest,
280
+ staticIr: staticIr2
281
+ };
282
+ }
283
+ const baseFallbackReason = extractArrow(srcTrimmed) ? "unsupportedSyntax" : "missingDeps";
284
+ const lowDiscriminabilitySource = srcTrimmed.length === 0 || srcTrimmed.includes("[native code]");
285
+ const fallbackReason = !debugKey || lowDiscriminabilitySource ? "unstableSelectorId" : baseFallbackReason;
286
+ const selectorId = fallbackReason === "unstableSelectorId" ? computeUnstableSelectorId(selector) : computeSelectorId({ kind: "dynamic", debugKey, src: srcTrimmed });
287
+ const staticIr = {
288
+ selectorId,
289
+ debugKey,
290
+ lane: "dynamic",
291
+ producer: "dynamic",
292
+ fallbackReason,
293
+ equalsKind: "objectIs"
294
+ };
295
+ return {
296
+ selectorId,
297
+ debugKey,
298
+ reads: [],
299
+ select: selector,
300
+ equalsKind: "objectIs",
301
+ lane: "dynamic",
302
+ producer: "dynamic",
303
+ fallbackReason,
304
+ staticIr
305
+ };
306
+ };
307
+ var filterNonEmpty = (values) => {
308
+ if (!values || values.length === 0) return void 0;
309
+ const next = values.map((v) => v.trim()).filter((v) => v.length > 0);
310
+ return next.length > 0 ? next : void 0;
311
+ };
312
+ var makeStrictGateDiagnostic = (args) => {
313
+ const severity = args.config.mode === "warn" ? "warning" : "error";
314
+ return {
315
+ type: "diagnostic",
316
+ moduleId: args.details.moduleId,
317
+ instanceId: args.details.instanceId,
318
+ txnSeq: args.details.txnSeq,
319
+ code: "read_query::strict_gate",
320
+ severity,
321
+ message: `ReadQuery strict gate violated: selector entered dynamic lane (selectorId=${args.details.selectorId}, reason=${args.details.fallbackReason}).`,
322
+ 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.",
323
+ kind: "read_query:strict_gate",
324
+ trigger: {
325
+ kind: "read_query",
326
+ name: "strict_gate",
327
+ details: args.details
328
+ }
329
+ };
330
+ };
331
+ var makeStrictGateError = (args) => Object.assign(
332
+ new Error(
333
+ `[ReadQueryStrictGateError] selector entered dynamic lane (selectorId=${args.details.selectorId}, reason=${args.details.fallbackReason}).`
334
+ ),
335
+ {
336
+ _tag: "ReadQueryStrictGateError",
337
+ details: args.details
338
+ }
339
+ );
340
+ var evaluateStrictGate = (args) => {
341
+ if (args.config.mode === "off") {
342
+ return { verdict: "PASS" };
343
+ }
344
+ if (args.compiled.lane !== "dynamic") {
345
+ return { verdict: "PASS" };
346
+ }
347
+ const fallbackReason = args.compiled.fallbackReason ?? "missingDeps";
348
+ const denyFallbackReasons = args.config.denyFallbackReasons;
349
+ const denied = !!denyFallbackReasons?.includes(fallbackReason);
350
+ const selectorIds = filterNonEmpty(args.config.requireStatic?.selectorIds);
351
+ const modules = filterNonEmpty(args.config.requireStatic?.modules);
352
+ const hasCoverageFilter = !!selectorIds || !!modules;
353
+ const matchedSelectorId = !!selectorIds?.includes(args.compiled.selectorId);
354
+ const matchedModule = !!modules?.includes(args.moduleId);
355
+ const coveredByRequireStatic = !hasCoverageFilter || matchedSelectorId || matchedModule;
356
+ if (!denied && !coveredByRequireStatic) {
357
+ return { verdict: "PASS" };
358
+ }
359
+ const rule = denied ? "denyFallbackReason" : !hasCoverageFilter ? "requireStatic:global" : matchedSelectorId ? "requireStatic:selectorId" : "requireStatic:module";
360
+ const details = {
361
+ moduleId: args.moduleId,
362
+ instanceId: args.instanceId,
363
+ txnSeq: args.txnSeq,
364
+ selectorId: args.compiled.selectorId,
365
+ debugKey: args.compiled.debugKey,
366
+ fallbackReason,
367
+ rule
368
+ };
369
+ const diagnostic = makeStrictGateDiagnostic({ config: args.config, details });
370
+ if (args.config.mode === "warn") {
371
+ return { verdict: "WARN", diagnostic, details };
372
+ }
373
+ const error = makeStrictGateError({ details });
374
+ return { verdict: "FAIL", diagnostic, error, details };
375
+ };
376
+
377
+ export {
378
+ isReadQuery,
379
+ make,
380
+ compile,
381
+ evaluateStrictGate
382
+ };
383
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL1JlYWRRdWVyeS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgZm52MWEzMiwgc3RhYmxlU3RyaW5naWZ5IH0gZnJvbSAnLi4vLi4vZGlnZXN0LmpzJ1xuaW1wb3J0IHR5cGUgKiBhcyBEZWJ1Z1NpbmsgZnJvbSAnLi9EZWJ1Z1NpbmsuanMnXG5cbmV4cG9ydCB0eXBlIFJlYWRMYW5lID0gJ3N0YXRpYycgfCAnZHluYW1pYydcblxuZXhwb3J0IHR5cGUgUmVhZFByb2R1Y2VyID0gJ2FvdCcgfCAnaml0JyB8ICdtYW51YWwnIHwgJ2R5bmFtaWMnXG5cbmV4cG9ydCB0eXBlIFJlYWRRdWVyeUZhbGxiYWNrUmVhc29uID0gJ21pc3NpbmdEZXBzJyB8ICd1bnN1cHBvcnRlZFN5bnRheCcgfCAndW5zdGFibGVTZWxlY3RvcklkJ1xuXG5leHBvcnQgdHlwZSBFcXVhbHNLaW5kID0gJ29iamVjdElzJyB8ICdzaGFsbG93U3RydWN0JyB8ICdjdXN0b20nXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZHNEaWdlc3Qge1xuICByZWFkb25seSBjb3VudDogbnVtYmVyXG4gIHJlYWRvbmx5IGhhc2g6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRRdWVyeVN0YXRpY0lyIHtcbiAgcmVhZG9ubHkgc2VsZWN0b3JJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGRlYnVnS2V5Pzogc3RyaW5nXG4gIHJlYWRvbmx5IGxhbmU6IFJlYWRMYW5lXG4gIHJlYWRvbmx5IHByb2R1Y2VyOiBSZWFkUHJvZHVjZXJcbiAgcmVhZG9ubHkgcmVhZHM/OiBSZWFkb25seUFycmF5PHN0cmluZyB8IG51bWJlcj5cbiAgcmVhZG9ubHkgcmVhZHNEaWdlc3Q/OiBSZWFkc0RpZ2VzdFxuICByZWFkb25seSBmYWxsYmFja1JlYXNvbj86IFJlYWRRdWVyeUZhbGxiYWNrUmVhc29uXG4gIHJlYWRvbmx5IGVxdWFsc0tpbmQ6IEVxdWFsc0tpbmRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWFkUXVlcnk8UywgVj4ge1xuICByZWFkb25seSBzZWxlY3RvcklkOiBzdHJpbmdcbiAgcmVhZG9ubHkgZGVidWdLZXk/OiBzdHJpbmdcbiAgcmVhZG9ubHkgcmVhZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nIHwgbnVtYmVyPlxuICByZWFkb25seSBzZWxlY3Q6IChzdGF0ZTogUykgPT4gVlxuICByZWFkb25seSBlcXVhbHNLaW5kOiBFcXVhbHNLaW5kXG4gIHJlYWRvbmx5IGVxdWFscz86IChwcmV2aW91czogViwgbmV4dDogVikgPT4gYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRRdWVyeUNvbXBpbGVkPFMsIFY+IGV4dGVuZHMgUmVhZFF1ZXJ5PFMsIFY+IHtcbiAgcmVhZG9ubHkgbGFuZTogUmVhZExhbmVcbiAgcmVhZG9ubHkgcHJvZHVjZXI6IFJlYWRQcm9kdWNlclxuICByZWFkb25seSByZWFkc0RpZ2VzdD86IFJlYWRzRGlnZXN0XG4gIHJlYWRvbmx5IGZhbGxiYWNrUmVhc29uPzogUmVhZFF1ZXJ5RmFsbGJhY2tSZWFzb25cbiAgcmVhZG9ubHkgc3RhdGljSXI6IFJlYWRRdWVyeVN0YXRpY0lyXG59XG5cbmV4cG9ydCB0eXBlIFJlYWRRdWVyeUlucHV0PFMsIFY+ID0gKChzdGF0ZTogUykgPT4gVikgfCBSZWFkUXVlcnk8UywgVj5cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhZFF1ZXJ5PFMsIFY+KGlucHV0OiBSZWFkUXVlcnlJbnB1dDxTLCBWPik6IGlucHV0IGlzIFJlYWRRdWVyeTxTLCBWPlxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhZFF1ZXJ5KGlucHV0OiB1bmtub3duKTogaW5wdXQgaXMgUmVhZFF1ZXJ5PGFueSwgYW55PlxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhZFF1ZXJ5KGlucHV0OiB1bmtub3duKTogaW5wdXQgaXMgUmVhZFF1ZXJ5PGFueSwgYW55PiB7XG4gIGlmICghaW5wdXQgfHwgKHR5cGVvZiBpbnB1dCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIGlucHV0ICE9PSAnZnVuY3Rpb24nKSkgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IG1heWJlID0gaW5wdXQgYXMgYW55XG4gIHJldHVybiB0eXBlb2YgbWF5YmUuc2VsZWN0b3JJZCA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIG1heWJlLnNlbGVjdCA9PT0gJ2Z1bmN0aW9uJyAmJiBBcnJheS5pc0FycmF5KG1heWJlLnJlYWRzKVxufVxuXG5jb25zdCBub3JtYWxpemVSZWFkcyA9IChyZWFkczogUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudW1iZXI+KTogUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0+IHtcbiAgY29uc3QgdW5pcXVlOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gW11cbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gIGZvciAoY29uc3QgciBvZiByZWFkcykge1xuICAgIGNvbnN0IGtleSA9IHR5cGVvZiByID09PSAnbnVtYmVyJyA/IGBuOiR7cn1gIDogYHM6JHtyfWBcbiAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgY29udGludWVcbiAgICBzZWVuLmFkZChrZXkpXG4gICAgdW5pcXVlLnB1c2gocilcbiAgfVxuICByZXR1cm4gdW5pcXVlLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gU3RyaW5nKGEpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGIpKSlcbn1cblxuY29uc3QgdG9IYXNoMzJOdW1iZXIgPSAoaGV4OiBzdHJpbmcpOiBudW1iZXIgPT4gTnVtYmVyLnBhcnNlSW50KGhleCwgMTYpXG5cbmNvbnN0IG1ha2VSZWFkc0RpZ2VzdCA9IChyZWFkczogUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudW1iZXI+KTogUmVhZHNEaWdlc3QgPT4ge1xuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUmVhZHMocmVhZHMpXG4gIHJldHVybiB7XG4gICAgY291bnQ6IG5vcm1hbGl6ZWQubGVuZ3RoLFxuICAgIGhhc2g6IHRvSGFzaDMyTnVtYmVyKGZudjFhMzIoc3RhYmxlU3RyaW5naWZ5KG5vcm1hbGl6ZWQpKSksXG4gIH1cbn1cblxuY29uc3QgY29tcHV0ZVNlbGVjdG9ySWQgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4gYHJxXyR7Zm52MWEzMihzdGFibGVTdHJpbmdpZnkodmFsdWUpKX1gXG5cbmxldCBuZXh0VW5zdGFibGVTZWxlY3RvclNlcSA9IDBcbmNvbnN0IHVuc3RhYmxlU2VsZWN0b3JJZEJ5Rm4gPSBuZXcgV2Vha01hcDxGdW5jdGlvbiwgc3RyaW5nPigpXG5cbmNvbnN0IGNvbXB1dGVVbnN0YWJsZVNlbGVjdG9ySWQgPSAoc2VsZWN0b3I6IEZ1bmN0aW9uKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZXhpc3RpbmcgPSB1bnN0YWJsZVNlbGVjdG9ySWRCeUZuLmdldChzZWxlY3RvcilcbiAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3RpbmdcbiAgbmV4dFVuc3RhYmxlU2VsZWN0b3JTZXEgKz0gMVxuICBjb25zdCBzZWxlY3RvcklkID0gYHJxX3Uke25leHRVbnN0YWJsZVNlbGVjdG9yU2VxfWBcbiAgdW5zdGFibGVTZWxlY3RvcklkQnlGbi5zZXQoc2VsZWN0b3IsIHNlbGVjdG9ySWQpXG4gIHJldHVybiBzZWxlY3RvcklkXG59XG5cbmNvbnN0IHVud3JhcFBhcmVucyA9IChpbnB1dDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdHJpbW1lZCA9IGlucHV0LnRyaW0oKVxuICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKCcoJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnKScpKSB7XG4gICAgY29uc3QgaW5uZXIgPSB0cmltbWVkLnNsaWNlKDEsIC0xKS50cmltKClcbiAgICAvLyBcdTRFQzVcdTU5MDRcdTc0MDZcdTY3MDBcdTU5MTZcdTVDNDJcdTRFMDBcdTVCRjlcdTYyRUNcdTUzRjdcdUZGMENcdTkwN0ZcdTUxNERcdThCRUZcdTUyMjBcdThCRURcdTZDRDVcdTdFRDNcdTY3ODRcbiAgICBpZiAoIWlubmVyLnN0YXJ0c1dpdGgoJygnKSB8fCAhaW5uZXIuZW5kc1dpdGgoJyknKSkge1xuICAgICAgcmV0dXJuIGlubmVyXG4gICAgfVxuICB9XG4gIHJldHVybiB0cmltbWVkXG59XG5cbmNvbnN0IGV4dHJhY3RBcnJvdyA9IChzb3VyY2U6IHN0cmluZyk6IHsgcmVhZG9ubHkgcGFyYW06IHN0cmluZzsgcmVhZG9ubHkgYm9keTogc3RyaW5nIH0gfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBpZHggPSBzb3VyY2UuaW5kZXhPZignPT4nKVxuICBpZiAoaWR4IDwgMCkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBsZWZ0ID0gc291cmNlLnNsaWNlKDAsIGlkeCkudHJpbSgpXG4gIGNvbnN0IHJpZ2h0ID0gc291cmNlLnNsaWNlKGlkeCArIDIpLnRyaW0oKVxuXG4gIGNvbnN0IHBhcmFtUmF3ID0gdW53cmFwUGFyZW5zKGxlZnQpXG4gIGlmICghL15bQS1aYS16XyRdW0EtWmEtejAtOV8kXSokLy50ZXN0KHBhcmFtUmF3KSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIC8vIGJsb2NrIGJvZHk6IHsgcmV0dXJuIGV4cHIgfVxuICBpZiAocmlnaHQuc3RhcnRzV2l0aCgneycpKSB7XG4gICAgY29uc3QgbSA9IHJpZ2h0Lm1hdGNoKC9eXFx7XFxzKnJldHVyblxccysoLis/KTs/XFxzKlxcfVxccyokL3MpXG4gICAgaWYgKCFtKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHsgcGFyYW06IHBhcmFtUmF3LCBib2R5OiBtWzFdPy50cmltKCkgPz8gJycgfVxuICB9XG5cbiAgcmV0dXJuIHsgcGFyYW06IHBhcmFtUmF3LCBib2R5OiByaWdodCB9XG59XG5cbnR5cGUgUGFyc2VkU2VsZWN0b3IgPVxuICB8IHsgcmVhZG9ubHkga2luZDogJ3BhdGgnOyByZWFkb25seSBwYXRoOiBzdHJpbmcgfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ3N0cnVjdCc7IHJlYWRvbmx5IGVudHJpZXM6IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgW3N0cmluZywgc3RyaW5nXT4gfVxuXG5jb25zdCB0cnlQYXJzZVNlbGVjdG9yU291cmNlID0gKHNvdXJjZTogc3RyaW5nKTogUGFyc2VkU2VsZWN0b3IgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBhcnJvdyA9IGV4dHJhY3RBcnJvdyhzb3VyY2UpXG4gIGlmICghYXJyb3cpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBleHByID0gdW53cmFwUGFyZW5zKGFycm93LmJvZHkpLnRyaW0oKS5yZXBsYWNlKC87JC8sICcnKS50cmltKClcblxuICAvLyBwYXRoOiBzLmEuYlxuICB7XG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGBeJHthcnJvdy5wYXJhbX1cXFxcLihbQS1aYS16MC05XyRdKyg/OlxcXFwuW0EtWmEtejAtOV8kXSspKikkYClcbiAgICBjb25zdCBtID0gZXhwci5tYXRjaChyZSlcbiAgICBpZiAobSkge1xuICAgICAgcmV0dXJuIHsga2luZDogJ3BhdGgnLCBwYXRoOiBtWzFdIH1cbiAgICB9XG4gIH1cblxuICAvLyBzdHJ1Y3Q6ICh7IGE6IHMuYSwgYjogcy5iIH0pXG4gIGlmIChleHByLnN0YXJ0c1dpdGgoJ3snKSAmJiBleHByLmVuZHNXaXRoKCd9JykpIHtcbiAgICBjb25zdCBpbm5lciA9IGV4cHIuc2xpY2UoMSwgLTEpLnRyaW0oKVxuICAgIGlmIChpbm5lci5sZW5ndGggPT09IDApIHJldHVybiB7IGtpbmQ6ICdzdHJ1Y3QnLCBlbnRyaWVzOiBbXSB9XG5cbiAgICBjb25zdCBwYXJ0cyA9IGlubmVyXG4gICAgICAuc3BsaXQoJywnKVxuICAgICAgLm1hcCgocCkgPT4gcC50cmltKCkpXG4gICAgICAuZmlsdGVyKChwKSA9PiBwLmxlbmd0aCA+IDApXG5cbiAgICBjb25zdCBlbnRyaWVzOiBBcnJheTxyZWFkb25seSBbc3RyaW5nLCBzdHJpbmddPiA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgIGNvbnN0IGlkeCA9IHBhcnQuaW5kZXhPZignOicpXG4gICAgICBpZiAoaWR4IDwgMCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgY29uc3Qga2V5ID0gcGFydC5zbGljZSgwLCBpZHgpLnRyaW0oKVxuICAgICAgY29uc3QgdmFsdWUgPSBwYXJ0LnNsaWNlKGlkeCArIDEpLnRyaW0oKVxuXG4gICAgICBpZiAoIS9eW0EtWmEtel8kXVtBLVphLXowLTlfJF0qJC8udGVzdChrZXkpKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChgXiR7YXJyb3cucGFyYW19XFxcXC4oW0EtWmEtejAtOV8kXSsoPzpcXFxcLltBLVphLXowLTlfJF0rKSopJGApXG4gICAgICBjb25zdCBtID0gdmFsdWUubWF0Y2gocmUpXG4gICAgICBpZiAoIW0pIHJldHVybiB1bmRlZmluZWRcbiAgICAgIGVudHJpZXMucHVzaChba2V5LCBtWzFdXSBhcyBjb25zdClcbiAgICB9XG5cbiAgICAvLyBlbnRyaWVzIFx1NjM5Mlx1NUU4Rlx1NEZERFx1OEJDMVx1N0EzM1x1NUI5QSBzZWxlY3RvcklkXG4gICAgZW50cmllcy5zb3J0KChhLCBiKSA9PiBhWzBdLmxvY2FsZUNvbXBhcmUoYlswXSkpXG4gICAgcmV0dXJuIHsga2luZDogJ3N0cnVjdCcsIGVudHJpZXMgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG50eXBlIFJlYWRRdWVyeVN0YXRpY1RlbXBsYXRlID0ge1xuICByZWFkb25seSBzZWxlY3RvcklkOiBzdHJpbmdcbiAgcmVhZG9ubHkgcmVhZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nIHwgbnVtYmVyPlxuICByZWFkb25seSByZWFkc0RpZ2VzdDogUmVhZHNEaWdlc3RcbiAgcmVhZG9ubHkgZXF1YWxzS2luZDogRXF1YWxzS2luZFxufVxuXG5jb25zdCBSRUFEX1FVRVJZX1RFTVBMQVRFX0NBQ0hFX01BWCA9IDIwNDhcbmNvbnN0IHJlYWRRdWVyeVRlbXBsYXRlQnlGbiA9IG5ldyBXZWFrTWFwPEZ1bmN0aW9uLCBSZWFkUXVlcnlTdGF0aWNUZW1wbGF0ZT4oKVxuY29uc3QgcmVhZFF1ZXJ5VGVtcGxhdGVCeVNvdXJjZSA9IG5ldyBNYXA8c3RyaW5nLCBSZWFkUXVlcnlTdGF0aWNUZW1wbGF0ZT4oKVxuXG5jb25zdCBscnVHZXQgPSA8SywgVj4obWFwOiBNYXA8SywgVj4sIGtleTogSyk6IFYgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB2YWx1ZSA9IG1hcC5nZXQoa2V5KVxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZFxuICBtYXAuZGVsZXRlKGtleSlcbiAgbWFwLnNldChrZXksIHZhbHVlKVxuICByZXR1cm4gdmFsdWVcbn1cblxuY29uc3QgbHJ1U2V0ID0gPEssIFY+KG1hcDogTWFwPEssIFY+LCBrZXk6IEssIHZhbHVlOiBWLCBtYXhTaXplOiBudW1iZXIpID0+IHtcbiAgaWYgKG1hcC5oYXMoa2V5KSkgbWFwLmRlbGV0ZShrZXkpXG4gIG1hcC5zZXQoa2V5LCB2YWx1ZSlcbiAgaWYgKG1hcC5zaXplIDw9IG1heFNpemUpIHJldHVyblxuICBjb25zdCBvbGRlc3RLZXkgPSBtYXAua2V5cygpLm5leHQoKS52YWx1ZSBhcyBLIHwgdW5kZWZpbmVkXG4gIGlmIChvbGRlc3RLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgIG1hcC5kZWxldGUob2xkZXN0S2V5KVxuICB9XG59XG5cbmNvbnN0IHNhZmVUb1N0cmluZyA9IChmbjogRnVuY3Rpb24pOiBzdHJpbmcgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBmbi50b1N0cmluZygpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnJ1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBtYWtlID0gPFMsIFY+KHNwZWM6IFJlYWRRdWVyeTxTLCBWPik6IFJlYWRRdWVyeTxTLCBWPiA9PiBzcGVjXG5cbmV4cG9ydCBjb25zdCBjb21waWxlID0gPFMsIFY+KGlucHV0OiBSZWFkUXVlcnlJbnB1dDxTLCBWPik6IFJlYWRRdWVyeUNvbXBpbGVkPFMsIFY+ID0+IHtcbiAgaWYgKGlzUmVhZFF1ZXJ5KGlucHV0KSkge1xuICAgIGNvbnN0IHJlYWRzID0gbm9ybWFsaXplUmVhZHMoaW5wdXQucmVhZHMpXG4gICAgY29uc3QgcmVhZHNEaWdlc3QgPSByZWFkcy5sZW5ndGggPiAwID8gbWFrZVJlYWRzRGlnZXN0KHJlYWRzKSA6IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgZXF1YWxzS2luZCA9IGlucHV0LmVxdWFsc0tpbmRcbiAgICBjb25zdCBzdGF0aWNJcjogUmVhZFF1ZXJ5U3RhdGljSXIgPSB7XG4gICAgICBzZWxlY3RvcklkOiBpbnB1dC5zZWxlY3RvcklkLFxuICAgICAgZGVidWdLZXk6IGlucHV0LmRlYnVnS2V5LFxuICAgICAgbGFuZTogJ3N0YXRpYycsXG4gICAgICBwcm9kdWNlcjogJ21hbnVhbCcsXG4gICAgICByZWFkcyxcbiAgICAgIHJlYWRzRGlnZXN0LFxuICAgICAgZXF1YWxzS2luZCxcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uaW5wdXQsXG4gICAgICByZWFkcyxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdtYW51YWwnLFxuICAgICAgcmVhZHNEaWdlc3QsXG4gICAgICBzdGF0aWNJcixcbiAgICB9XG4gIH1cblxuICBjb25zdCBzZWxlY3RvciA9IGlucHV0XG4gIGNvbnN0IGRlYnVnS2V5ID1cbiAgICAodHlwZW9mIChzZWxlY3RvciBhcyBhbnkpPy5kZWJ1Z0tleSA9PT0gJ3N0cmluZycgJiYgKHNlbGVjdG9yIGFzIGFueSkuZGVidWdLZXkubGVuZ3RoID4gMFxuICAgICAgPyAoc2VsZWN0b3IgYXMgYW55KS5kZWJ1Z0tleVxuICAgICAgOiB1bmRlZmluZWQpID8/XG4gICAgKHR5cGVvZiAoc2VsZWN0b3IgYXMgYW55KS5uYW1lID09PSAnc3RyaW5nJyAmJiAoc2VsZWN0b3IgYXMgYW55KS5uYW1lLmxlbmd0aCA+IDAgPyAoc2VsZWN0b3IgYXMgYW55KS5uYW1lIDogdW5kZWZpbmVkKVxuXG4gIGNvbnN0IGRlY2xhcmVkUmVhZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCA9IEFycmF5LmlzQXJyYXkoKHNlbGVjdG9yIGFzIGFueSk/LmZpZWxkUGF0aHMpXG4gICAgPyAoKHNlbGVjdG9yIGFzIGFueSkuZmllbGRQYXRocyBhcyBSZWFkb25seUFycmF5PHVua25vd24+KS5maWx0ZXIoKHgpOiB4IGlzIHN0cmluZyA9PiB0eXBlb2YgeCA9PT0gJ3N0cmluZycpXG4gICAgOiB1bmRlZmluZWRcblxuICBpZiAoZGVjbGFyZWRSZWFkcyAmJiBkZWNsYXJlZFJlYWRzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCByZWFkcyA9IG5vcm1hbGl6ZVJlYWRzKGRlY2xhcmVkUmVhZHMpXG4gICAgY29uc3QgcmVhZHNEaWdlc3QgPSBtYWtlUmVhZHNEaWdlc3QocmVhZHMpXG4gICAgY29uc3Qgc2VsZWN0b3JJZCA9IGNvbXB1dGVTZWxlY3RvcklkKHsga2luZDogJ3JlYWRzJywgcmVhZHMgfSlcblxuICAgIGNvbnN0IHN0YXRpY0lyOiBSZWFkUXVlcnlTdGF0aWNJciA9IHtcbiAgICAgIHNlbGVjdG9ySWQsXG4gICAgICBkZWJ1Z0tleSxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdqaXQnLFxuICAgICAgcmVhZHMsXG4gICAgICByZWFkc0RpZ2VzdCxcbiAgICAgIGVxdWFsc0tpbmQ6ICdvYmplY3RJcycsXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdG9ySWQsXG4gICAgICBkZWJ1Z0tleSxcbiAgICAgIHJlYWRzLFxuICAgICAgc2VsZWN0OiBzZWxlY3RvciBhcyBhbnksXG4gICAgICBlcXVhbHNLaW5kOiAnb2JqZWN0SXMnLFxuICAgICAgbGFuZTogJ3N0YXRpYycsXG4gICAgICBwcm9kdWNlcjogJ2ppdCcsXG4gICAgICByZWFkc0RpZ2VzdCxcbiAgICAgIHN0YXRpY0lyLFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNhY2hlZEJ5Rm4gPSByZWFkUXVlcnlUZW1wbGF0ZUJ5Rm4uZ2V0KHNlbGVjdG9yIGFzIHVua25vd24gYXMgRnVuY3Rpb24pXG4gIGlmIChjYWNoZWRCeUZuKSB7XG4gICAgY29uc3Qgc3RhdGljSXI6IFJlYWRRdWVyeVN0YXRpY0lyID0ge1xuICAgICAgc2VsZWN0b3JJZDogY2FjaGVkQnlGbi5zZWxlY3RvcklkLFxuICAgICAgZGVidWdLZXksXG4gICAgICBsYW5lOiAnc3RhdGljJyxcbiAgICAgIHByb2R1Y2VyOiAnaml0JyxcbiAgICAgIHJlYWRzOiBjYWNoZWRCeUZuLnJlYWRzLFxuICAgICAgcmVhZHNEaWdlc3Q6IGNhY2hlZEJ5Rm4ucmVhZHNEaWdlc3QsXG4gICAgICBlcXVhbHNLaW5kOiBjYWNoZWRCeUZuLmVxdWFsc0tpbmQsXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdG9ySWQ6IGNhY2hlZEJ5Rm4uc2VsZWN0b3JJZCxcbiAgICAgIGRlYnVnS2V5LFxuICAgICAgcmVhZHM6IGNhY2hlZEJ5Rm4ucmVhZHMsXG4gICAgICBzZWxlY3Q6IHNlbGVjdG9yIGFzIGFueSxcbiAgICAgIGVxdWFsc0tpbmQ6IGNhY2hlZEJ5Rm4uZXF1YWxzS2luZCxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdqaXQnLFxuICAgICAgcmVhZHNEaWdlc3Q6IGNhY2hlZEJ5Rm4ucmVhZHNEaWdlc3QsXG4gICAgICBzdGF0aWNJcixcbiAgICB9XG4gIH1cblxuICBjb25zdCBzcmNUcmltbWVkID0gc2FmZVRvU3RyaW5nKHNlbGVjdG9yIGFzIHVua25vd24gYXMgRnVuY3Rpb24pLnRyaW0oKVxuICBjb25zdCBjYWNoZWRCeVNvdXJjZSA9IHNyY1RyaW1tZWQubGVuZ3RoID4gMCA/IGxydUdldChyZWFkUXVlcnlUZW1wbGF0ZUJ5U291cmNlLCBzcmNUcmltbWVkKSA6IHVuZGVmaW5lZFxuICBpZiAoY2FjaGVkQnlTb3VyY2UpIHtcbiAgICByZWFkUXVlcnlUZW1wbGF0ZUJ5Rm4uc2V0KHNlbGVjdG9yIGFzIHVua25vd24gYXMgRnVuY3Rpb24sIGNhY2hlZEJ5U291cmNlKVxuICAgIGNvbnN0IHN0YXRpY0lyOiBSZWFkUXVlcnlTdGF0aWNJciA9IHtcbiAgICAgIHNlbGVjdG9ySWQ6IGNhY2hlZEJ5U291cmNlLnNlbGVjdG9ySWQsXG4gICAgICBkZWJ1Z0tleSxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdqaXQnLFxuICAgICAgcmVhZHM6IGNhY2hlZEJ5U291cmNlLnJlYWRzLFxuICAgICAgcmVhZHNEaWdlc3Q6IGNhY2hlZEJ5U291cmNlLnJlYWRzRGlnZXN0LFxuICAgICAgZXF1YWxzS2luZDogY2FjaGVkQnlTb3VyY2UuZXF1YWxzS2luZCxcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0b3JJZDogY2FjaGVkQnlTb3VyY2Uuc2VsZWN0b3JJZCxcbiAgICAgIGRlYnVnS2V5LFxuICAgICAgcmVhZHM6IGNhY2hlZEJ5U291cmNlLnJlYWRzLFxuICAgICAgc2VsZWN0OiBzZWxlY3RvciBhcyBhbnksXG4gICAgICBlcXVhbHNLaW5kOiBjYWNoZWRCeVNvdXJjZS5lcXVhbHNLaW5kLFxuICAgICAgbGFuZTogJ3N0YXRpYycsXG4gICAgICBwcm9kdWNlcjogJ2ppdCcsXG4gICAgICByZWFkc0RpZ2VzdDogY2FjaGVkQnlTb3VyY2UucmVhZHNEaWdlc3QsXG4gICAgICBzdGF0aWNJcixcbiAgICB9XG4gIH1cblxuICBjb25zdCBwYXJzZWQgPSBzcmNUcmltbWVkLmxlbmd0aCA+IDAgPyB0cnlQYXJzZVNlbGVjdG9yU291cmNlKHNyY1RyaW1tZWQpIDogdW5kZWZpbmVkXG5cbiAgaWYgKHBhcnNlZD8ua2luZCA9PT0gJ3BhdGgnKSB7XG4gICAgY29uc3QgcmVhZHMgPSBbcGFyc2VkLnBhdGhdXG4gICAgY29uc3QgcmVhZHNEaWdlc3QgPSBtYWtlUmVhZHNEaWdlc3QocmVhZHMpXG4gICAgY29uc3Qgc2VsZWN0b3JJZCA9IGNvbXB1dGVTZWxlY3RvcklkKHsga2luZDogJ3BhdGgnLCBwYXRoOiBwYXJzZWQucGF0aCB9KVxuICAgIGNvbnN0IHRlbXBsYXRlOiBSZWFkUXVlcnlTdGF0aWNUZW1wbGF0ZSA9IHsgc2VsZWN0b3JJZCwgcmVhZHMsIHJlYWRzRGlnZXN0LCBlcXVhbHNLaW5kOiAnb2JqZWN0SXMnIH1cbiAgICByZWFkUXVlcnlUZW1wbGF0ZUJ5Rm4uc2V0KHNlbGVjdG9yIGFzIHVua25vd24gYXMgRnVuY3Rpb24sIHRlbXBsYXRlKVxuICAgIGxydVNldChyZWFkUXVlcnlUZW1wbGF0ZUJ5U291cmNlLCBzcmNUcmltbWVkLCB0ZW1wbGF0ZSwgUkVBRF9RVUVSWV9URU1QTEFURV9DQUNIRV9NQVgpXG5cbiAgICBjb25zdCBzdGF0aWNJcjogUmVhZFF1ZXJ5U3RhdGljSXIgPSB7XG4gICAgICBzZWxlY3RvcklkLFxuICAgICAgZGVidWdLZXksXG4gICAgICBsYW5lOiAnc3RhdGljJyxcbiAgICAgIHByb2R1Y2VyOiAnaml0JyxcbiAgICAgIHJlYWRzLFxuICAgICAgcmVhZHNEaWdlc3QsXG4gICAgICBlcXVhbHNLaW5kOiAnb2JqZWN0SXMnLFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3RvcklkLFxuICAgICAgZGVidWdLZXksXG4gICAgICByZWFkcyxcbiAgICAgIHNlbGVjdDogc2VsZWN0b3IgYXMgYW55LFxuICAgICAgZXF1YWxzS2luZDogJ29iamVjdElzJyxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdqaXQnLFxuICAgICAgcmVhZHNEaWdlc3QsXG4gICAgICBzdGF0aWNJcixcbiAgICB9XG4gIH1cblxuICBpZiAocGFyc2VkPy5raW5kID09PSAnc3RydWN0Jykge1xuICAgIGNvbnN0IHJlYWRzID0gbm9ybWFsaXplUmVhZHMocGFyc2VkLmVudHJpZXMubWFwKChbLCBwYXRoXSkgPT4gcGF0aCkpXG4gICAgY29uc3QgcmVhZHNEaWdlc3QgPSBtYWtlUmVhZHNEaWdlc3QocmVhZHMpXG4gICAgY29uc3Qgc2VsZWN0b3JJZCA9IGNvbXB1dGVTZWxlY3RvcklkKHsga2luZDogJ3N0cnVjdCcsIGVudHJpZXM6IHBhcnNlZC5lbnRyaWVzIH0pXG4gICAgY29uc3QgdGVtcGxhdGU6IFJlYWRRdWVyeVN0YXRpY1RlbXBsYXRlID0geyBzZWxlY3RvcklkLCByZWFkcywgcmVhZHNEaWdlc3QsIGVxdWFsc0tpbmQ6ICdzaGFsbG93U3RydWN0JyB9XG4gICAgcmVhZFF1ZXJ5VGVtcGxhdGVCeUZuLnNldChzZWxlY3RvciBhcyB1bmtub3duIGFzIEZ1bmN0aW9uLCB0ZW1wbGF0ZSlcbiAgICBscnVTZXQocmVhZFF1ZXJ5VGVtcGxhdGVCeVNvdXJjZSwgc3JjVHJpbW1lZCwgdGVtcGxhdGUsIFJFQURfUVVFUllfVEVNUExBVEVfQ0FDSEVfTUFYKVxuXG4gICAgY29uc3Qgc3RhdGljSXI6IFJlYWRRdWVyeVN0YXRpY0lyID0ge1xuICAgICAgc2VsZWN0b3JJZCxcbiAgICAgIGRlYnVnS2V5LFxuICAgICAgbGFuZTogJ3N0YXRpYycsXG4gICAgICBwcm9kdWNlcjogJ2ppdCcsXG4gICAgICByZWFkcyxcbiAgICAgIHJlYWRzRGlnZXN0LFxuICAgICAgZXF1YWxzS2luZDogJ3NoYWxsb3dTdHJ1Y3QnLFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3RvcklkLFxuICAgICAgZGVidWdLZXksXG4gICAgICByZWFkcyxcbiAgICAgIHNlbGVjdDogc2VsZWN0b3IgYXMgYW55LFxuICAgICAgZXF1YWxzS2luZDogJ3NoYWxsb3dTdHJ1Y3QnLFxuICAgICAgbGFuZTogJ3N0YXRpYycsXG4gICAgICBwcm9kdWNlcjogJ2ppdCcsXG4gICAgICByZWFkc0RpZ2VzdCxcbiAgICAgIHN0YXRpY0lyLFxuICAgIH1cbiAgfVxuXG4gIC8vIER5bmFtaWMgbGFuZSBmYWxsYmFjayAobm8gc3RhYmxlIHJlYWRzIC8gdW5zdXBwb3J0ZWQgc3Vic2V0KVxuICBjb25zdCBiYXNlRmFsbGJhY2tSZWFzb246IFJlYWRRdWVyeUZhbGxiYWNrUmVhc29uID0gZXh0cmFjdEFycm93KHNyY1RyaW1tZWQpID8gJ3Vuc3VwcG9ydGVkU3ludGF4JyA6ICdtaXNzaW5nRGVwcydcblxuICBjb25zdCBsb3dEaXNjcmltaW5hYmlsaXR5U291cmNlID0gc3JjVHJpbW1lZC5sZW5ndGggPT09IDAgfHwgc3JjVHJpbW1lZC5pbmNsdWRlcygnW25hdGl2ZSBjb2RlXScpXG4gIGNvbnN0IGZhbGxiYWNrUmVhc29uOiBSZWFkUXVlcnlGYWxsYmFja1JlYXNvbiA9XG4gICAgIWRlYnVnS2V5IHx8IGxvd0Rpc2NyaW1pbmFiaWxpdHlTb3VyY2UgPyAndW5zdGFibGVTZWxlY3RvcklkJyA6IGJhc2VGYWxsYmFja1JlYXNvblxuXG4gIGNvbnN0IHNlbGVjdG9ySWQgPVxuICAgIGZhbGxiYWNrUmVhc29uID09PSAndW5zdGFibGVTZWxlY3RvcklkJ1xuICAgICAgPyBjb21wdXRlVW5zdGFibGVTZWxlY3RvcklkKHNlbGVjdG9yIGFzIHVua25vd24gYXMgRnVuY3Rpb24pXG4gICAgICA6IGNvbXB1dGVTZWxlY3RvcklkKHsga2luZDogJ2R5bmFtaWMnLCBkZWJ1Z0tleSwgc3JjOiBzcmNUcmltbWVkIH0pXG4gIGNvbnN0IHN0YXRpY0lyOiBSZWFkUXVlcnlTdGF0aWNJciA9IHtcbiAgICBzZWxlY3RvcklkLFxuICAgIGRlYnVnS2V5LFxuICAgIGxhbmU6ICdkeW5hbWljJyxcbiAgICBwcm9kdWNlcjogJ2R5bmFtaWMnLFxuICAgIGZhbGxiYWNrUmVhc29uLFxuICAgIGVxdWFsc0tpbmQ6ICdvYmplY3RJcycsXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNlbGVjdG9ySWQsXG4gICAgZGVidWdLZXksXG4gICAgcmVhZHM6IFtdLFxuICAgIHNlbGVjdDogc2VsZWN0b3IgYXMgYW55LFxuICAgIGVxdWFsc0tpbmQ6ICdvYmplY3RJcycsXG4gICAgbGFuZTogJ2R5bmFtaWMnLFxuICAgIHByb2R1Y2VyOiAnZHluYW1pYycsXG4gICAgZmFsbGJhY2tSZWFzb24sXG4gICAgc3RhdGljSXIsXG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWFkUXVlcnlTdHJpY3RHYXRlQ29uZmlnIHtcbiAgcmVhZG9ubHkgbW9kZTogJ29mZicgfCAnd2FybicgfCAnZXJyb3InXG4gIHJlYWRvbmx5IHJlcXVpcmVTdGF0aWM/OiB7XG4gICAgcmVhZG9ubHkgc2VsZWN0b3JJZHM/OiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgICByZWFkb25seSBtb2R1bGVzPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gIH1cbiAgcmVhZG9ubHkgZGVueUZhbGxiYWNrUmVhc29ucz86IFJlYWRvbmx5QXJyYXk8UmVhZFF1ZXJ5RmFsbGJhY2tSZWFzb24+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZFF1ZXJ5U3RyaWN0R2F0ZVZpb2xhdGlvbkRldGFpbHMge1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGluc3RhbmNlSWQ6IHN0cmluZ1xuICByZWFkb25seSB0eG5TZXE6IG51bWJlclxuICByZWFkb25seSBzZWxlY3RvcklkOiBzdHJpbmdcbiAgcmVhZG9ubHkgZGVidWdLZXk/OiBzdHJpbmdcbiAgcmVhZG9ubHkgZmFsbGJhY2tSZWFzb246IFJlYWRRdWVyeUZhbGxiYWNrUmVhc29uXG4gIHJlYWRvbmx5IHJ1bGU6ICdkZW55RmFsbGJhY2tSZWFzb24nIHwgJ3JlcXVpcmVTdGF0aWM6Z2xvYmFsJyB8ICdyZXF1aXJlU3RhdGljOnNlbGVjdG9ySWQnIHwgJ3JlcXVpcmVTdGF0aWM6bW9kdWxlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRRdWVyeVN0cmljdEdhdGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgX3RhZzogJ1JlYWRRdWVyeVN0cmljdEdhdGVFcnJvcidcbiAgcmVhZG9ubHkgZGV0YWlsczogUmVhZFF1ZXJ5U3RyaWN0R2F0ZVZpb2xhdGlvbkRldGFpbHNcbn1cblxuZXhwb3J0IHR5cGUgUmVhZFF1ZXJ5U3RyaWN0R2F0ZURpYWdub3N0aWNFdmVudCA9IEV4dHJhY3Q8RGVidWdTaW5rLkV2ZW50LCB7IHJlYWRvbmx5IHR5cGU6ICdkaWFnbm9zdGljJyB9PlxuXG5leHBvcnQgdHlwZSBSZWFkUXVlcnlTdHJpY3RHYXRlRGVjaXNpb24gPVxuICB8IHsgcmVhZG9ubHkgdmVyZGljdDogJ1BBU1MnIH1cbiAgfCB7IHJlYWRvbmx5IHZlcmRpY3Q6ICdXQVJOJzsgcmVhZG9ubHkgZGlhZ25vc3RpYzogUmVhZFF1ZXJ5U3RyaWN0R2F0ZURpYWdub3N0aWNFdmVudDsgcmVhZG9ubHkgZGV0YWlsczogUmVhZFF1ZXJ5U3RyaWN0R2F0ZVZpb2xhdGlvbkRldGFpbHMgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHZlcmRpY3Q6ICdGQUlMJ1xuICAgICAgcmVhZG9ubHkgZGlhZ25vc3RpYzogUmVhZFF1ZXJ5U3RyaWN0R2F0ZURpYWdub3N0aWNFdmVudFxuICAgICAgcmVhZG9ubHkgZXJyb3I6IFJlYWRRdWVyeVN0cmljdEdhdGVFcnJvclxuICAgICAgcmVhZG9ubHkgZGV0YWlsczogUmVhZFF1ZXJ5U3RyaWN0R2F0ZVZpb2xhdGlvbkRldGFpbHNcbiAgICB9XG5cbmNvbnN0IGZpbHRlck5vbkVtcHR5ID0gKHZhbHVlczogUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkKTogUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCF2YWx1ZXMgfHwgdmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBuZXh0ID0gdmFsdWVzLm1hcCgodikgPT4gdi50cmltKCkpLmZpbHRlcigodikgPT4gdi5sZW5ndGggPiAwKVxuICByZXR1cm4gbmV4dC5sZW5ndGggPiAwID8gbmV4dCA6IHVuZGVmaW5lZFxufVxuXG5jb25zdCBtYWtlU3RyaWN0R2F0ZURpYWdub3N0aWMgPSAoYXJnczoge1xuICByZWFkb25seSBjb25maWc6IFJlYWRRdWVyeVN0cmljdEdhdGVDb25maWdcbiAgcmVhZG9ubHkgZGV0YWlsczogUmVhZFF1ZXJ5U3RyaWN0R2F0ZVZpb2xhdGlvbkRldGFpbHNcbn0pOiBSZWFkUXVlcnlTdHJpY3RHYXRlRGlhZ25vc3RpY0V2ZW50ID0+IHtcbiAgY29uc3Qgc2V2ZXJpdHkgPSBhcmdzLmNvbmZpZy5tb2RlID09PSAnd2FybicgPyAoJ3dhcm5pbmcnIGFzIGNvbnN0KSA6ICgnZXJyb3InIGFzIGNvbnN0KVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ2RpYWdub3N0aWMnLFxuICAgIG1vZHVsZUlkOiBhcmdzLmRldGFpbHMubW9kdWxlSWQsXG4gICAgaW5zdGFuY2VJZDogYXJncy5kZXRhaWxzLmluc3RhbmNlSWQsXG4gICAgdHhuU2VxOiBhcmdzLmRldGFpbHMudHhuU2VxLFxuICAgIGNvZGU6ICdyZWFkX3F1ZXJ5OjpzdHJpY3RfZ2F0ZScsXG4gICAgc2V2ZXJpdHksXG4gICAgbWVzc2FnZTogYFJlYWRRdWVyeSBzdHJpY3QgZ2F0ZSB2aW9sYXRlZDogc2VsZWN0b3IgZW50ZXJlZCBkeW5hbWljIGxhbmUgKHNlbGVjdG9ySWQ9JHthcmdzLmRldGFpbHMuc2VsZWN0b3JJZH0sIHJlYXNvbj0ke2FyZ3MuZGV0YWlscy5mYWxsYmFja1JlYXNvbn0pLmAsXG4gICAgaGludDpcbiAgICAgICdGaXg6IG1ha2UgdGhlIHNlbGVjdG9yIHN0YXRpY2FsbHkgY29tcGlsYWJsZSAoQU9UL0pJVCkgb3IgcGFzcyBhbiBleHBsaWNpdCBSZWFkUXVlcnk7ICcgK1xuICAgICAgJ29yIGRpc2FibGUvbmFycm93IHRoZSBnYXRlIHZpYSBSdW50aW1lT3B0aW9ucy5yZWFkUXVlcnkuc3RyaWN0R2F0ZS5yZXF1aXJlU3RhdGljIC8gZGVueUZhbGxiYWNrUmVhc29ucy4nLFxuICAgIGtpbmQ6ICdyZWFkX3F1ZXJ5OnN0cmljdF9nYXRlJyxcbiAgICB0cmlnZ2VyOiB7XG4gICAgICBraW5kOiAncmVhZF9xdWVyeScsXG4gICAgICBuYW1lOiAnc3RyaWN0X2dhdGUnLFxuICAgICAgZGV0YWlsczogYXJncy5kZXRhaWxzLFxuICAgIH0sXG4gIH1cbn1cblxuY29uc3QgbWFrZVN0cmljdEdhdGVFcnJvciA9IChhcmdzOiB7XG4gIHJlYWRvbmx5IGRldGFpbHM6IFJlYWRRdWVyeVN0cmljdEdhdGVWaW9sYXRpb25EZXRhaWxzXG59KTogUmVhZFF1ZXJ5U3RyaWN0R2F0ZUVycm9yID0+XG4gIE9iamVjdC5hc3NpZ24oXG4gICAgbmV3IEVycm9yKFxuICAgICAgYFtSZWFkUXVlcnlTdHJpY3RHYXRlRXJyb3JdIHNlbGVjdG9yIGVudGVyZWQgZHluYW1pYyBsYW5lIChzZWxlY3RvcklkPSR7YXJncy5kZXRhaWxzLnNlbGVjdG9ySWR9LCByZWFzb249JHthcmdzLmRldGFpbHMuZmFsbGJhY2tSZWFzb259KS5gLFxuICAgICksXG4gICAge1xuICAgICAgX3RhZzogJ1JlYWRRdWVyeVN0cmljdEdhdGVFcnJvcicgYXMgY29uc3QsXG4gICAgICBkZXRhaWxzOiBhcmdzLmRldGFpbHMsXG4gICAgfSxcbiAgKSBhcyBSZWFkUXVlcnlTdHJpY3RHYXRlRXJyb3JcblxuZXhwb3J0IGNvbnN0IGV2YWx1YXRlU3RyaWN0R2F0ZSA9IChhcmdzOiB7XG4gIHJlYWRvbmx5IGNvbmZpZzogUmVhZFF1ZXJ5U3RyaWN0R2F0ZUNvbmZpZ1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGluc3RhbmNlSWQ6IHN0cmluZ1xuICByZWFkb25seSB0eG5TZXE6IG51bWJlclxuICByZWFkb25seSBjb21waWxlZDogUmVhZFF1ZXJ5Q29tcGlsZWQ8YW55LCBhbnk+XG59KTogUmVhZFF1ZXJ5U3RyaWN0R2F0ZURlY2lzaW9uID0+IHtcbiAgaWYgKGFyZ3MuY29uZmlnLm1vZGUgPT09ICdvZmYnKSB7XG4gICAgcmV0dXJuIHsgdmVyZGljdDogJ1BBU1MnIH1cbiAgfVxuXG4gIGlmIChhcmdzLmNvbXBpbGVkLmxhbmUgIT09ICdkeW5hbWljJykge1xuICAgIHJldHVybiB7IHZlcmRpY3Q6ICdQQVNTJyB9XG4gIH1cblxuICBjb25zdCBmYWxsYmFja1JlYXNvbiA9IChhcmdzLmNvbXBpbGVkLmZhbGxiYWNrUmVhc29uID8/ICdtaXNzaW5nRGVwcycpIGFzIFJlYWRRdWVyeUZhbGxiYWNrUmVhc29uXG5cbiAgY29uc3QgZGVueUZhbGxiYWNrUmVhc29ucyA9IGFyZ3MuY29uZmlnLmRlbnlGYWxsYmFja1JlYXNvbnNcbiAgY29uc3QgZGVuaWVkID0gISFkZW55RmFsbGJhY2tSZWFzb25zPy5pbmNsdWRlcyhmYWxsYmFja1JlYXNvbilcblxuICBjb25zdCBzZWxlY3RvcklkcyA9IGZpbHRlck5vbkVtcHR5KGFyZ3MuY29uZmlnLnJlcXVpcmVTdGF0aWM/LnNlbGVjdG9ySWRzKVxuICBjb25zdCBtb2R1bGVzID0gZmlsdGVyTm9uRW1wdHkoYXJncy5jb25maWcucmVxdWlyZVN0YXRpYz8ubW9kdWxlcylcbiAgY29uc3QgaGFzQ292ZXJhZ2VGaWx0ZXIgPSAhIXNlbGVjdG9ySWRzIHx8ICEhbW9kdWxlc1xuXG4gIGNvbnN0IG1hdGNoZWRTZWxlY3RvcklkID0gISFzZWxlY3Rvcklkcz8uaW5jbHVkZXMoYXJncy5jb21waWxlZC5zZWxlY3RvcklkKVxuICBjb25zdCBtYXRjaGVkTW9kdWxlID0gISFtb2R1bGVzPy5pbmNsdWRlcyhhcmdzLm1vZHVsZUlkKVxuICBjb25zdCBjb3ZlcmVkQnlSZXF1aXJlU3RhdGljID0gIWhhc0NvdmVyYWdlRmlsdGVyIHx8IG1hdGNoZWRTZWxlY3RvcklkIHx8IG1hdGNoZWRNb2R1bGVcblxuICBpZiAoIWRlbmllZCAmJiAhY292ZXJlZEJ5UmVxdWlyZVN0YXRpYykge1xuICAgIHJldHVybiB7IHZlcmRpY3Q6ICdQQVNTJyB9XG4gIH1cblxuICBjb25zdCBydWxlOiBSZWFkUXVlcnlTdHJpY3RHYXRlVmlvbGF0aW9uRGV0YWlsc1sncnVsZSddID0gZGVuaWVkXG4gICAgPyAnZGVueUZhbGxiYWNrUmVhc29uJ1xuICAgIDogIWhhc0NvdmVyYWdlRmlsdGVyXG4gICAgICA/ICdyZXF1aXJlU3RhdGljOmdsb2JhbCdcbiAgICAgIDogbWF0Y2hlZFNlbGVjdG9ySWRcbiAgICAgICAgPyAncmVxdWlyZVN0YXRpYzpzZWxlY3RvcklkJ1xuICAgICAgICA6ICdyZXF1aXJlU3RhdGljOm1vZHVsZSdcblxuICBjb25zdCBkZXRhaWxzOiBSZWFkUXVlcnlTdHJpY3RHYXRlVmlvbGF0aW9uRGV0YWlscyA9IHtcbiAgICBtb2R1bGVJZDogYXJncy5tb2R1bGVJZCxcbiAgICBpbnN0YW5jZUlkOiBhcmdzLmluc3RhbmNlSWQsXG4gICAgdHhuU2VxOiBhcmdzLnR4blNlcSxcbiAgICBzZWxlY3RvcklkOiBhcmdzLmNvbXBpbGVkLnNlbGVjdG9ySWQsXG4gICAgZGVidWdLZXk6IGFyZ3MuY29tcGlsZWQuZGVidWdLZXksXG4gICAgZmFsbGJhY2tSZWFzb24sXG4gICAgcnVsZSxcbiAgfVxuXG4gIGNvbnN0IGRpYWdub3N0aWMgPSBtYWtlU3RyaWN0R2F0ZURpYWdub3N0aWMoeyBjb25maWc6IGFyZ3MuY29uZmlnLCBkZXRhaWxzIH0pXG5cbiAgaWYgKGFyZ3MuY29uZmlnLm1vZGUgPT09ICd3YXJuJykge1xuICAgIHJldHVybiB7IHZlcmRpY3Q6ICdXQVJOJywgZGlhZ25vc3RpYywgZGV0YWlscyB9XG4gIH1cblxuICBjb25zdCBlcnJvciA9IG1ha2VTdHJpY3RHYXRlRXJyb3IoeyBkZXRhaWxzIH0pXG4gIHJldHVybiB7IHZlcmRpY3Q6ICdGQUlMJywgZGlhZ25vc3RpYywgZXJyb3IsIGRldGFpbHMgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7QUFnRE8sU0FBUyxZQUFZLE9BQThDO0FBQ3hFLE1BQUksQ0FBQyxTQUFVLE9BQU8sVUFBVSxZQUFZLE9BQU8sVUFBVSxXQUFhLFFBQU87QUFDakYsUUFBTSxRQUFRO0FBQ2QsU0FBTyxPQUFPLE1BQU0sZUFBZSxZQUFZLE9BQU8sTUFBTSxXQUFX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T0FBb0QsU0FDdEQsdUJBQ0EsQ0FBQyxvQkFDQyx5QkFDQSxvQkFDRSw2QkFDQTtBQUVSLFFBQU0sVUFBK0M7QUFBQSxJQUNuRCxVQUFVLEtBQUs7QUFBQSxJQUNmLFlBQVksS0FBSztBQUFBLElBQ2pCLFFBQVEsS0FBSztBQUFBLElBQ2IsWUFBWSxLQUFLLFNBQVM7QUFBQSxJQUMxQixVQUFVLEtBQUssU0FBUztBQUFBLElBQ3hCO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFFQSxRQUFNLGFBQWEseUJBQXlCLEVBQUUsUUFBUSxLQUFLLFFBQVEsUUFBUSxDQUFDO0FBRTVFLE1BQUksS0FBSyxPQUFPLFNBQVMsUUFBUTtBQUMvQixXQUFPLEVBQUUsU0FBUyxRQUFRLFlBQVksUUFBUTtBQUFBLEVBQ2hEO0FBRUEsUUFBTSxRQUFRLG9CQUFvQixFQUFFLFFBQVEsQ0FBQztBQUM3QyxTQUFPLEVBQUUsU0FBUyxRQUFRLFlBQVksT0FBTyxRQUFRO0FBQ3ZEOyIsCiAgIm5hbWVzIjogWyJzdGF0aWNJciIsICJzZWxlY3RvcklkIl0KfQo=