@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,391 @@
1
+ // @logixjs/core subpath bundles for @logixjs/sandbox
2
+
3
+ import {
4
+ build,
5
+ install
6
+ } from "./chunk-NE447XAF.js";
7
+ import {
8
+ Module
9
+ } from "./chunk-5GEYCJW2.js";
10
+ import {
11
+ attachLogicUnitMeta
12
+ } from "./chunk-BJOWSSEL.js";
13
+ import {
14
+ mutateWithPatchPaths,
15
+ mutateWithoutPatches
16
+ } from "./chunk-RIWOEI3T.js";
17
+ import {
18
+ normalizeActions
19
+ } from "./chunk-DOBF6YTQ.js";
20
+ import {
21
+ registerModuleProgram
22
+ } from "./chunk-74C5VW7Z.js";
23
+ import {
24
+ getBoundInternals,
25
+ setModuleTraitsProgram
26
+ } from "./chunk-7GPAF2UK.js";
27
+ import {
28
+ currentDiagnosticsLevel,
29
+ record
30
+ } from "./chunk-SH7TP5CJ.js";
31
+ import {
32
+ fnv1a32,
33
+ stableStringify
34
+ } from "./chunk-DT7YIIWE.js";
35
+
36
+ // ../logix-core/src/ModuleTag.ts
37
+ import { Effect, FiberRef } from "../effect.js";
38
+
39
+ // ../logix-core/src/internal/runtime/core/ModuleTraits.ts
40
+ var ModuleTraitsConflictError = class extends Error {
41
+ constructor(moduleId, conflicts) {
42
+ super(
43
+ [
44
+ `[ModuleTraitsConflictError] Conflicting traitIds found (moduleId=${moduleId}).`,
45
+ ...conflicts.map(
46
+ (c) => c.kind === "duplicate_traitId" ? `- duplicate ${c.traitId}: ${c.sources.map((s) => `${s.originType}:${s.originId}`).join(", ")}` : c.kind === "missing_requires" ? `- missing requires for ${c.traitId}: ${(c.missing ?? []).join(", ")}; sources=${c.sources.map((s) => `${s.originType}:${s.originId}`).join(", ")}` : `- excludes violation for ${c.traitId}: present=${(c.present ?? []).join(", ")}; sources=${c.sources.map((s) => `${s.originType}:${s.originId}`).join(", ")}`
47
+ )
48
+ ].join("\n")
49
+ );
50
+ this.moduleId = moduleId;
51
+ this.conflicts = conflicts;
52
+ this._tag = "ModuleTraitsConflictError";
53
+ }
54
+ };
55
+ var toProvenanceKey = (p) => `${p.originType}:${p.originId}:${p.originIdKind}:${p.originLabel}:${p.path ?? ""}`;
56
+ var compareString = (a, b) => a < b ? -1 : a > b ? 1 : 0;
57
+ var compareProvenance = (a, b) => {
58
+ const type = compareString(a.originType, b.originType);
59
+ if (type !== 0) return type;
60
+ const id = compareString(a.originId, b.originId);
61
+ if (id !== 0) return id;
62
+ const kind = compareString(a.originIdKind, b.originIdKind);
63
+ if (kind !== 0) return kind;
64
+ const label = compareString(a.originLabel, b.originLabel);
65
+ if (label !== 0) return label;
66
+ return compareString(String(a.path ?? ""), String(b.path ?? ""));
67
+ };
68
+ var originTypeOrder = (t) => t === "module" ? 0 : 1;
69
+ var compareTraitIdByProvenance = (a, b) => {
70
+ const ta = originTypeOrder(a.provenance.originType) - originTypeOrder(b.provenance.originType);
71
+ if (ta !== 0) return ta;
72
+ const oa = compareString(a.provenance.originId, b.provenance.originId);
73
+ if (oa !== 0) return oa;
74
+ return compareString(a.traitId, b.traitId);
75
+ };
76
+ var extractStringArray = (value) => {
77
+ if (!Array.isArray(value)) return [];
78
+ const out = [];
79
+ for (const v of value) {
80
+ if (typeof v !== "string") continue;
81
+ const s = v.trim();
82
+ if (!s) continue;
83
+ out.push(s);
84
+ }
85
+ return out;
86
+ };
87
+ var getTraitRequires = (value) => {
88
+ if (!value || typeof value !== "object") return [];
89
+ const direct = extractStringArray(value.requires);
90
+ return direct;
91
+ };
92
+ var getTraitExcludes = (value) => {
93
+ if (!value || typeof value !== "object") return [];
94
+ const direct = extractStringArray(value.excludes);
95
+ return direct;
96
+ };
97
+ var getTraitName = (traitId, value) => {
98
+ if (value && typeof value === "object") {
99
+ const n = value.name;
100
+ if (typeof n === "string" && n.trim().length > 0) return n.trim();
101
+ }
102
+ return traitId;
103
+ };
104
+ var getTraitDescription = (value) => {
105
+ if (value && typeof value === "object") {
106
+ const d = value.description;
107
+ if (typeof d === "string" && d.trim().length > 0) return d.trim();
108
+ }
109
+ return void 0;
110
+ };
111
+ var finalizeTraitContributions = (args) => {
112
+ const traitById = /* @__PURE__ */ new Map();
113
+ const duplicateSources = /* @__PURE__ */ new Map();
114
+ const contributions = [...args.contributions].sort((a, b) => compareProvenance(a.provenance, b.provenance));
115
+ for (const c of contributions) {
116
+ const traits2 = c.traits;
117
+ if (!traits2 || typeof traits2 !== "object") continue;
118
+ for (const traitId of Object.keys(traits2).sort()) {
119
+ const value = traits2[traitId];
120
+ if (value === void 0) continue;
121
+ const prev = traitById.get(traitId);
122
+ if (!prev) {
123
+ traitById.set(traitId, { value, provenance: c.provenance });
124
+ continue;
125
+ }
126
+ const sources = duplicateSources.get(traitId) ?? [prev.provenance];
127
+ sources.push(c.provenance);
128
+ duplicateSources.set(traitId, sources);
129
+ }
130
+ }
131
+ const conflicts = [];
132
+ const registerConflict = (conflict) => {
133
+ const unique = /* @__PURE__ */ new Map();
134
+ for (const s of conflict.sources) {
135
+ unique.set(toProvenanceKey(s), s);
136
+ }
137
+ conflicts.push({
138
+ ...conflict,
139
+ sources: Array.from(unique.values()).sort(compareProvenance)
140
+ });
141
+ };
142
+ for (const traitId of Array.from(duplicateSources.keys()).sort()) {
143
+ registerConflict({
144
+ kind: "duplicate_traitId",
145
+ traitId,
146
+ sources: duplicateSources.get(traitId) ?? []
147
+ });
148
+ }
149
+ const merged = {};
150
+ const provenanceIndex = {};
151
+ const traits = [];
152
+ const entries = [];
153
+ for (const traitId of traitById.keys()) {
154
+ const entry = traitById.get(traitId);
155
+ if (!entry) continue;
156
+ entries.push({ traitId, value: entry.value, provenance: entry.provenance });
157
+ }
158
+ const ids = entries.slice().sort(compareTraitIdByProvenance).map((e) => e.traitId);
159
+ for (const traitId of ids) {
160
+ const entry = traitById.get(traitId);
161
+ if (!entry) continue;
162
+ merged[traitId] = entry.value;
163
+ provenanceIndex[traitId] = entry.provenance;
164
+ traits.push({
165
+ traitId,
166
+ name: getTraitName(traitId, entry.value),
167
+ description: getTraitDescription(entry.value)
168
+ });
169
+ }
170
+ const present = new Set(ids);
171
+ for (const traitId of ids) {
172
+ const entry = traitById.get(traitId);
173
+ if (!entry) continue;
174
+ const requires = getTraitRequires(entry.value);
175
+ if (requires.length > 0) {
176
+ const missing = requires.filter((r) => !present.has(r));
177
+ if (missing.length > 0) {
178
+ registerConflict({
179
+ kind: "missing_requires",
180
+ traitId,
181
+ missing: Array.from(new Set(missing)).sort(),
182
+ sources: [entry.provenance]
183
+ });
184
+ }
185
+ }
186
+ const excludes = getTraitExcludes(entry.value);
187
+ if (excludes.length > 0) {
188
+ const presentExcluded = excludes.filter((e) => present.has(e));
189
+ if (presentExcluded.length > 0) {
190
+ const otherSources = [];
191
+ for (const otherId of presentExcluded) {
192
+ const other = traitById.get(otherId);
193
+ if (other) otherSources.push(other.provenance);
194
+ }
195
+ registerConflict({
196
+ kind: "excludes_violation",
197
+ traitId,
198
+ present: Array.from(new Set(presentExcluded)).sort(),
199
+ sources: [entry.provenance, ...otherSources]
200
+ });
201
+ }
202
+ }
203
+ }
204
+ if (conflicts.length > 0) {
205
+ const kindOrder = {
206
+ duplicate_traitId: 0,
207
+ missing_requires: 1,
208
+ excludes_violation: 2
209
+ };
210
+ conflicts.sort((a, b) => {
211
+ const k = kindOrder[a.kind] - kindOrder[b.kind];
212
+ if (k !== 0) return k;
213
+ return compareString(a.traitId, b.traitId);
214
+ });
215
+ throw new ModuleTraitsConflictError(args.moduleId, conflicts);
216
+ }
217
+ const digestBase = {
218
+ moduleId: args.moduleId,
219
+ traits,
220
+ provenanceIndex
221
+ };
222
+ const digest = `mtraits:023:${fnv1a32(stableStringify(digestBase))}`;
223
+ return {
224
+ merged,
225
+ snapshot: {
226
+ moduleId: args.moduleId,
227
+ digest,
228
+ traits,
229
+ provenanceIndex
230
+ }
231
+ };
232
+ };
233
+
234
+ // ../logix-core/src/ModuleTag.ts
235
+ var Reducer = {
236
+ mutate: (mutator) => (state, action, sink) => {
237
+ const payload = action?.payload;
238
+ if (!sink) {
239
+ return mutateWithoutPatches(state, (draft) => {
240
+ mutator(draft, payload);
241
+ });
242
+ }
243
+ const { nextState, patchPaths } = mutateWithPatchPaths(state, (draft) => {
244
+ mutator(draft, payload);
245
+ });
246
+ for (const path of patchPaths) {
247
+ sink(path);
248
+ }
249
+ return nextState;
250
+ },
251
+ mutateMap: (mutators) => {
252
+ const out = {};
253
+ for (const key of Object.keys(mutators)) {
254
+ const mutator = mutators[key];
255
+ if (typeof mutator !== "function") continue;
256
+ out[key] = Reducer.mutate(mutator);
257
+ }
258
+ return out;
259
+ }
260
+ };
261
+ var makeImpl = (id, def) => Module(id, def);
262
+ var make = (id, def) => {
263
+ const actions = normalizeActions(def.actions);
264
+ const moduleTag = makeImpl(id, {
265
+ state: def.state,
266
+ actions,
267
+ reducers: def.reducers
268
+ });
269
+ const stateSchema = def.state;
270
+ const moduleTraitsSpec = def.traits;
271
+ const baseProgram = moduleTraitsSpec ? build(stateSchema, moduleTraitsSpec) : void 0;
272
+ if (baseProgram) {
273
+ setModuleTraitsProgram(moduleTag, baseProgram);
274
+ registerModuleProgram(id, baseProgram);
275
+ }
276
+ const makeModuleTraitsContributionLogic = (traits) => {
277
+ const logic = moduleTag.logic(($) => ({
278
+ setup: Effect.sync(() => {
279
+ if (!traits || typeof traits !== "object") return;
280
+ const internals = getBoundInternals($);
281
+ internals.traits.registerModuleTraitsContribution({
282
+ traits,
283
+ provenance: {
284
+ originType: "module",
285
+ originId: id,
286
+ originIdKind: "explicit",
287
+ originLabel: `module:${id}`
288
+ }
289
+ });
290
+ }),
291
+ run: Effect.void
292
+ }));
293
+ attachLogicUnitMeta(logic, {
294
+ id: "__logix_internal:traits:module_contrib",
295
+ kind: "internal",
296
+ name: "traits:module_contrib",
297
+ moduleId: id
298
+ });
299
+ return logic;
300
+ };
301
+ const makeFinalizeTraitsLogic = () => {
302
+ const logic = moduleTag.logic(($) => ({
303
+ setup: Effect.gen(function* () {
304
+ const internals = getBoundInternals($);
305
+ const diagnosticsLevel = yield* FiberRef.get(currentDiagnosticsLevel);
306
+ const contributions = internals.traits.getModuleTraitsContributions();
307
+ let merged;
308
+ let snapshot;
309
+ try {
310
+ ;
311
+ ({ merged, snapshot } = finalizeTraitContributions({
312
+ moduleId: id,
313
+ contributions
314
+ }));
315
+ } catch (cause) {
316
+ if (diagnosticsLevel !== "off" && cause && typeof cause === "object" && cause._tag === "ModuleTraitsConflictError") {
317
+ const conflicts = Array.isArray(cause.conflicts) ? cause.conflicts : [];
318
+ const traitIds = conflicts.map((c) => c && typeof c === "object" ? c.traitId : void 0).filter((t) => typeof t === "string" && t.length > 0).slice(0, 20);
319
+ const data = diagnosticsLevel === "full" ? {
320
+ conflictCount: conflicts.length,
321
+ conflicts
322
+ } : {
323
+ conflictCount: conflicts.length,
324
+ traitIds
325
+ };
326
+ yield* record({
327
+ type: "trace:module:traits:conflict",
328
+ moduleId: id,
329
+ instanceId: internals.instanceId,
330
+ data
331
+ });
332
+ }
333
+ throw cause;
334
+ }
335
+ internals.traits.setModuleTraitsSnapshot(snapshot);
336
+ internals.traits.freezeModuleTraits();
337
+ if (diagnosticsLevel !== "off") {
338
+ const data = diagnosticsLevel === "full" ? {
339
+ digest: snapshot.digest,
340
+ count: snapshot.traits.length,
341
+ traits: snapshot.traits,
342
+ provenanceIndex: snapshot.provenanceIndex
343
+ } : {
344
+ digest: snapshot.digest,
345
+ count: snapshot.traits.length
346
+ };
347
+ yield* record({
348
+ type: "trace:module:traits",
349
+ moduleId: id,
350
+ instanceId: internals.instanceId,
351
+ data
352
+ });
353
+ }
354
+ if (Object.keys(merged).length === 0) {
355
+ return;
356
+ }
357
+ const onlyModuleLevel = contributions.length === 1 && contributions[0]?.provenance?.originType === "module";
358
+ const program = onlyModuleLevel && baseProgram ? baseProgram : build(stateSchema, merged);
359
+ setModuleTraitsProgram(moduleTag, program);
360
+ registerModuleProgram(id, program);
361
+ yield* install($, program);
362
+ }),
363
+ run: Effect.void
364
+ }));
365
+ attachLogicUnitMeta(logic, {
366
+ id: "__logix_internal:traits:finalize",
367
+ kind: "internal",
368
+ name: "traits:finalize",
369
+ moduleId: id
370
+ });
371
+ return logic;
372
+ };
373
+ const originalImplement = moduleTag.implement;
374
+ moduleTag.implement = ((config) => {
375
+ const userLogics = config.logics ?? [];
376
+ const moduleLevel = def.traits ? [makeModuleTraitsContributionLogic(def.traits)] : [];
377
+ const finalize = makeFinalizeTraitsLogic();
378
+ const mergedLogics = [...moduleLevel, ...userLogics, finalize];
379
+ return originalImplement({
380
+ ...config,
381
+ logics: mergedLogics
382
+ });
383
+ });
384
+ return moduleTag;
385
+ };
386
+
387
+ export {
388
+ Reducer,
389
+ make
390
+ };
391
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvTW9kdWxlVGFnLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3J1bnRpbWUvY29yZS9Nb2R1bGVUcmFpdHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IEVmZmVjdCwgRmliZXJSZWYsIExheWVyLCBTY2hlbWEgfSBmcm9tICdlZmZlY3QnXG5pbXBvcnQgKiBhcyBMb2dpYyBmcm9tICcuL0xvZ2ljLmpzJ1xuaW1wb3J0ICogYXMgQWN0aW9uIGZyb20gJy4vaW50ZXJuYWwvYWN0aW9uLmpzJ1xuaW1wb3J0ICogYXMgTW9kdWxlRmFjdG9yeSBmcm9tICcuL2ludGVybmFsL3J1bnRpbWUvTW9kdWxlRmFjdG9yeS5qcydcbmltcG9ydCB0eXBlIHsgRmllbGRQYXRoIH0gZnJvbSAnLi9pbnRlcm5hbC9maWVsZC1wYXRoLmpzJ1xuaW1wb3J0IHsgbXV0YXRlV2l0aG91dFBhdGNoZXMsIG11dGF0ZVdpdGhQYXRjaFBhdGhzIH0gZnJvbSAnLi9pbnRlcm5hbC9ydW50aW1lL2NvcmUvbXV0YXRpdmVQYXRjaGVzLmpzJ1xuaW1wb3J0IHsgZ2V0Qm91bmRJbnRlcm5hbHMsIHNldE1vZHVsZVRyYWl0c1Byb2dyYW0gfSBmcm9tICcuL2ludGVybmFsL3J1bnRpbWUvY29yZS9ydW50aW1lSW50ZXJuYWxzQWNjZXNzb3IuanMnXG5pbXBvcnQgKiBhcyBEZWJ1ZyBmcm9tICcuL2ludGVybmFsL3J1bnRpbWUvY29yZS9EZWJ1Z1NpbmsuanMnXG5pbXBvcnQgKiBhcyBMb2dpY1VuaXRNZXRhIGZyb20gJy4vaW50ZXJuYWwvcnVudGltZS9jb3JlL0xvZ2ljVW5pdE1ldGEuanMnXG5pbXBvcnQgdHlwZSB7XG4gIEFjdGlvbnNGcm9tTWFwLFxuICBBbnlNb2R1bGVTaGFwZSxcbiAgQW55U2NoZW1hLFxuICBCb3VuZEFwaSxcbiAgQWN0aW9uT2YsXG4gIE1vZHVsZUltcGwsXG4gIE1vZHVsZUxvZ2ljLFxuICBNb2R1bGVTaGFwZSxcbiAgTW9kdWxlUnVudGltZSxcbiAgTW9kdWxlVGFnLFxuICBNb2R1bGVIYW5kbGUsXG4gIE1vZHVsZUhhbmRsZVVuaW9uLFxuICBTdGF0ZUNoYW5nZVdpdGhNZXRhLFxuICBTdGF0ZUNvbW1pdE1ldGEsXG4gIFN0YXRlQ29tbWl0TW9kZSxcbiAgU3RhdGVDb21taXRQcmlvcml0eSxcbiAgUmVkdWNlcnNGcm9tTWFwLFxuICBTdGF0ZU9mLFxufSBmcm9tICcuL2ludGVybmFsL21vZHVsZS5qcydcbmltcG9ydCAqIGFzIFN0YXRlVHJhaXQgZnJvbSAnLi9TdGF0ZVRyYWl0LmpzJ1xuaW1wb3J0IHR5cGUgeyBTdGF0ZVRyYWl0UHJvZ3JhbSB9IGZyb20gJy4vU3RhdGVUcmFpdC5qcydcbmltcG9ydCAqIGFzIE1vZHVsZVRyYWl0c1JlZ2lzdHJ5IGZyb20gJy4vaW50ZXJuYWwvZGVidWcvTW9kdWxlVHJhaXRzUmVnaXN0cnkuanMnXG5pbXBvcnQgKiBhcyBNb2R1bGVUcmFpdHMgZnJvbSAnLi9pbnRlcm5hbC9ydW50aW1lL2NvcmUvTW9kdWxlVHJhaXRzLmpzJ1xuXG50eXBlIE5vSW5mZXJfPFQ+ID0gW1RdW1QgZXh0ZW5kcyBhbnkgPyAwIDogbmV2ZXJdXG5cbi8qKlxuICogUHVibGljIGV4cG9ydHMgZm9yIGNvcmUgdHlwZSBkZWZpbml0aW9ucyBzdWNoIGFzIE1vZHVsZVRhZyAvIE1vZHVsZVJ1bnRpbWUgLyBNb2R1bGVJbXBsLlxuICpcbiAqIEtlcHQgYWxpZ25lZCB3aXRoIGBkb2NzL3Nzb3QvcnVudGltZS9sb2dpeC1jb3JlL2FwaS8wMi1tb2R1bGUtYW5kLWxvZ2ljLWFwaS5tZGAuXG4gKiBDb25jcmV0ZSB0eXBlIGRlZmluaXRpb25zIGxpdmUgaW4gaW50ZXJuYWwvbW9kdWxlLnRzOyB0aGlzIG1vZHVsZSB3aXJlcyB0aGUgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUge1xuICBBbnlTY2hlbWEsXG4gIEFueU1vZHVsZVNoYXBlLFxuICBNb2R1bGVTaGFwZSxcbiAgTW9kdWxlTG9naWMsXG4gIE1vZHVsZUltcGwsXG4gIE1vZHVsZVJ1bnRpbWUsXG4gIE1vZHVsZVJ1bnRpbWVPZlNoYXBlLFxuICBNb2R1bGVUYWcsXG4gIE1vZHVsZUhhbmRsZSxcbiAgTW9kdWxlSGFuZGxlVW5pb24sXG4gIFN0YXRlT2YsXG4gIEFjdGlvbnNGcm9tTWFwLFxuICBSZWR1Y2Vyc0Zyb21NYXAsXG4gIEJvdW5kQXBpLFxuICBBY3Rpb25PZixcbiAgTG9naWNFZmZlY3QsXG4gIERpc3BhdGNoRWZmZWN0LFxuICBBY3Rpb25Gb3JUYWcsXG4gIEJvdW5kQXBpUm9vdEFwaSxcbiAgQm91bmRBcGlTdGF0ZUFwaSxcbiAgQm91bmRBcGlEaXNwYXRjaGVyc0FwaSxcbiAgQm91bmRBcGlEaXNwYXRjaEFwaSxcbiAgQm91bmRBcGlMaWZlY3ljbGVBcGksXG4gIEJvdW5kQXBpVXNlQXBpLFxuICBCb3VuZEFwaVRyYWl0c0FwaSxcbiAgQm91bmRBcGlSZWR1Y2VyQXBpLFxuICBTdGF0ZUNvbW1pdE1vZGUsXG4gIFN0YXRlQ29tbWl0UHJpb3JpdHksXG4gIFN0YXRlQ29tbWl0TWV0YSxcbiAgU3RhdGVDaGFuZ2VXaXRoTWV0YSxcbn0gZnJvbSAnLi9pbnRlcm5hbC9tb2R1bGUuanMnXG5cbi8qKlxuICogUmVkdWNlciBoZWxwZXI6XG4gKiAtIGBSZWR1Y2VyLm11dGF0ZWAgcHJvdmlkZXMgdGhlIHNhbWUgbXV0YXRpdmUgc3R5bGUgYXMgYCQuc3RhdGUubXV0YXRlYC5cbiAqIC0gSW50ZXJuYWxseSB1c2VzIG11dGF0aXZlLWJhc2VkIGltbXV0YWJsZSB1cGRhdGVzIHRvIG1hcCBcImluLXBsYWNlIGRyYWZ0IG11dGF0aW9uXCIgaW50byBhIHB1cmUgYChzdGF0ZSwgYWN0aW9uKSA9PiBzdGF0ZWAuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgIGNvbnN0IENvdW50ZXIgPSBMb2dpeC5Nb2R1bGVUYWcubWFrZShcIkNvdW50ZXJcIiwge1xuICogICAgIHN0YXRlOiBDb3VudGVyU3RhdGUsXG4gKiAgICAgYWN0aW9uczogQ291bnRlckFjdGlvbnMsXG4gKiAgICAgcmVkdWNlcnM6IHtcbiAqICAgICAgIGluYzogTG9naXguTW9kdWxlVGFnLlJlZHVjZXIubXV0YXRlKChkcmFmdCwgX3BheWxvYWQpID0+IHtcbiAqICAgICAgICAgZHJhZnQuY291bnQgKz0gMVxuICogICAgICAgfSksXG4gKiAgICAgfSxcbiAqICAgfSlcbiAqXG4gKiAgIHlpZWxkKiAkLnJlZHVjZXIoXG4gKiAgICAgXCJzZXRWYWx1ZVwiLFxuICogICAgIExvZ2l4Lk1vZHVsZVRhZy5SZWR1Y2VyLm11dGF0ZSgoZHJhZnQsIHBheWxvYWQpID0+IHtcbiAqICAgICAgIGRyYWZ0LnZhbHVlID0gcGF5bG9hZFxuICogICAgIH0pLFxuICogICApXG4gKi9cbmV4cG9ydCBjb25zdCBSZWR1Y2VyID0ge1xuICBtdXRhdGU6XG4gICAgPFMsIEEgZXh0ZW5kcyB7IHJlYWRvbmx5IHBheWxvYWQ/OiBhbnkgfT4oXG4gICAgICBtdXRhdG9yOiAoZHJhZnQ6IExvZ2ljLkRyYWZ0PFM+LCBwYXlsb2FkOiBBWydwYXlsb2FkJ10pID0+IHZvaWQsXG4gICAgKTogKChzdGF0ZTogUywgYWN0aW9uOiBBLCBzaW5rPzogKHBhdGg6IHN0cmluZyB8IEZpZWxkUGF0aCkgPT4gdm9pZCkgPT4gUykgPT5cbiAgICAoc3RhdGUsIGFjdGlvbiwgc2luaykgPT4ge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IChhY3Rpb24gYXMgYW55KT8ucGF5bG9hZCBhcyBBWydwYXlsb2FkJ11cbiAgICAgIGlmICghc2luaykge1xuICAgICAgICByZXR1cm4gbXV0YXRlV2l0aG91dFBhdGNoZXMoc3RhdGUgYXMgUywgKGRyYWZ0KSA9PiB7XG4gICAgICAgICAgbXV0YXRvcihkcmFmdCBhcyBMb2dpYy5EcmFmdDxTPiwgcGF5bG9hZClcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBuZXh0U3RhdGUsIHBhdGNoUGF0aHMgfSA9IG11dGF0ZVdpdGhQYXRjaFBhdGhzKHN0YXRlIGFzIFMsIChkcmFmdCkgPT4ge1xuICAgICAgICBtdXRhdG9yKGRyYWZ0IGFzIExvZ2ljLkRyYWZ0PFM+LCBwYXlsb2FkKVxuICAgICAgfSlcblxuICAgICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGNoUGF0aHMpIHtcbiAgICAgICAgc2luayhwYXRoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV4dFN0YXRlXG4gICAgfSxcblxuICBtdXRhdGVNYXA6IDxcbiAgICBSIGV4dGVuZHMgUmVhZG9ubHk8XG4gICAgICBSZWNvcmQ8c3RyaW5nLCAoKHN0YXRlOiBhbnksIGFjdGlvbjogYW55LCBzaW5rPzogKHBhdGg6IHN0cmluZyB8IEZpZWxkUGF0aCkgPT4gdm9pZCkgPT4gYW55KSB8IHVuZGVmaW5lZD5cbiAgICA+LFxuICA+KG11dGF0b3JzOiB7XG4gICAgcmVhZG9ubHkgW0sgaW4ga2V5b2YgTm9JbmZlcl88Uj5dPzogKFxuICAgICAgZHJhZnQ6IExvZ2ljLkRyYWZ0PFBhcmFtZXRlcnM8Tm9uTnVsbGFibGU8Tm9JbmZlcl88Uj5bS10+PlswXT4sXG4gICAgICBwYXlsb2FkOiBQYXJhbWV0ZXJzPE5vbk51bGxhYmxlPE5vSW5mZXJfPFI+W0tdPj5bMV0gZXh0ZW5kcyB7IHJlYWRvbmx5IHBheWxvYWQ6IGluZmVyIFAgfVxuICAgICAgICA/IFBcbiAgICAgICAgOiBQYXJhbWV0ZXJzPE5vbk51bGxhYmxlPE5vSW5mZXJfPFI+W0tdPj5bMV0gZXh0ZW5kcyB7IHJlYWRvbmx5IHBheWxvYWQ/OiBpbmZlciBQIH1cbiAgICAgICAgICA/IFAgfCB1bmRlZmluZWRcbiAgICAgICAgICA6IG5ldmVyLFxuICAgICkgPT4gdm9pZFxuICB9KTogUiA9PiB7XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobXV0YXRvcnMpKSB7XG4gICAgICBjb25zdCBtdXRhdG9yID0gKG11dGF0b3JzIGFzIGFueSlba2V5XVxuICAgICAgaWYgKHR5cGVvZiBtdXRhdG9yICE9PSAnZnVuY3Rpb24nKSBjb250aW51ZVxuICAgICAgb3V0W2tleV0gPSBSZWR1Y2VyLm11dGF0ZShtdXRhdG9yIGFzIGFueSlcbiAgICB9XG4gICAgcmV0dXJuIG91dCBhcyBhbnlcbiAgfSxcbn1cblxuLyoqXG4gKiBBIHNpbXBsaWZpZWQgU2hhcGUgZGVmaW5pdGlvbiBoZWxwZXIsIGRlc2lnbmVkIGZvciBBY3Rpb24gTWFwcy5cbiAqIEBleGFtcGxlIHR5cGUgTXlTaGFwZSA9IFNoYXBlPHR5cGVvZiBNeVN0YXRlLCB0eXBlb2YgTXlBY3Rpb25NYXA+XG4gKi9cbmV4cG9ydCB0eXBlIEFjdGlvblRva2VuTWFwPEFEZWZzIGV4dGVuZHMgQWN0aW9uLkFjdGlvbkRlZnM+ID0gQWN0aW9uLk5vcm1hbGl6ZWRBY3Rpb25Ub2tlbnM8QURlZnM+XG5cbmV4cG9ydCB0eXBlIEFjdGlvblVuaW9uT2Y8QURlZnMgZXh0ZW5kcyBBY3Rpb24uQWN0aW9uRGVmcz4gPSBBY3Rpb25zRnJvbU1hcDxBY3Rpb25Ub2tlbk1hcDxBRGVmcz4+XG5cbmV4cG9ydCB0eXBlIEFjdGlvblNjaGVtYU9mPEFEZWZzIGV4dGVuZHMgQWN0aW9uLkFjdGlvbkRlZnM+ID0gU2NoZW1hLlNjaGVtYTxBY3Rpb25Vbmlvbk9mPEFEZWZzPj5cblxuZXhwb3J0IHR5cGUgU2hhcGU8U1NjaGVtYSBleHRlbmRzIEFueVNjaGVtYSwgQURlZnMgZXh0ZW5kcyBBY3Rpb24uQWN0aW9uRGVmcz4gPSBNb2R1bGVTaGFwZTxcbiAgU1NjaGVtYSxcbiAgQWN0aW9uU2NoZW1hT2Y8QURlZnM+LFxuICBBY3Rpb25Ub2tlbk1hcDxBRGVmcz5cbj5cblxuZXhwb3J0IHR5cGUgU2hhcGVGcm9tQWN0aW9uVG9rZW5NYXA8XG4gIFNTY2hlbWEgZXh0ZW5kcyBBbnlTY2hlbWEsXG4gIEFNYXAgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBBY3Rpb24uQW55QWN0aW9uVG9rZW4+LFxuPiA9IE1vZHVsZVNoYXBlPFNTY2hlbWEsIFNjaGVtYS5TY2hlbWE8QWN0aW9uc0Zyb21NYXA8QU1hcD4+LCBBTWFwPlxuXG5jb25zdCBtYWtlSW1wbCA9IDxJZCBleHRlbmRzIHN0cmluZywgU1NjaGVtYSBleHRlbmRzIEFueVNjaGVtYSwgQU1hcCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIEFjdGlvbi5BbnlBY3Rpb25Ub2tlbj4+KFxuICBpZDogSWQsXG4gIGRlZjoge1xuICAgIHJlYWRvbmx5IHN0YXRlOiBTU2NoZW1hXG4gICAgcmVhZG9ubHkgYWN0aW9uczogQU1hcFxuICAgIHJlYWRvbmx5IHJlZHVjZXJzPzogUmVkdWNlcnNGcm9tTWFwPFNTY2hlbWEsIEFNYXA+XG4gIH0sXG4pOiBNb2R1bGVUYWc8SWQsIFNoYXBlRnJvbUFjdGlvblRva2VuTWFwPFNTY2hlbWEsIEFNYXA+PiA9PlxuICBNb2R1bGVGYWN0b3J5Lk1vZHVsZShpZCwgZGVmKSBhcyBNb2R1bGVUYWc8SWQsIFNoYXBlRnJvbUFjdGlvblRva2VuTWFwPFNTY2hlbWEsIEFNYXA+PlxuXG4vKipcbiAqIE1vZHVsZVRhZy5tYWtlXHVGRjFBXG4gKiAtIERlZmluZXMgYSBkb21haW4gbW9kdWxlIFRhZyB1c2luZyB0aGUgZ2l2ZW4gaWQgYW5kIHN0YXRlL2FjdGlvbnMvcmVkdWNlcnMuXG4gKiAtIFRoZSByZXR1cm5lZCBNb2R1bGVUYWcgaXMgYm90aCBhIENvbnRleHQuVGFnIGFuZCBhIGZhY3RvcnkgY2FycnlpbmcgaXRzIFNoYXBlLlxuICpcbiAqIE5vdGU6IHNpbmNlIDAyMiwgdGhlIG9sZCBgTW9kdWxlYCAoVGFnIGlkZW50aXR5KSB3YXMgcmVuYW1lZCB0byBgTW9kdWxlVGFnYDsgdXNlIGBMb2dpeC5Nb2R1bGVgIGZvciBtb2R1bGUgZGVmaW5pdGlvbiBvYmplY3RzLlxuICovXG5leHBvcnQgY29uc3QgbWFrZSA9IDxJZCBleHRlbmRzIHN0cmluZywgU1NjaGVtYSBleHRlbmRzIEFueVNjaGVtYSwgQURlZnMgZXh0ZW5kcyBBY3Rpb24uQWN0aW9uRGVmcz4oXG4gIGlkOiBJZCxcbiAgZGVmOiB7XG4gICAgcmVhZG9ubHkgc3RhdGU6IFNTY2hlbWFcbiAgICByZWFkb25seSBhY3Rpb25zOiBBRGVmc1xuICAgIHJlYWRvbmx5IHJlZHVjZXJzPzogUmVkdWNlcnNGcm9tTWFwPFNTY2hlbWEsIEFEZWZzPlxuICAgIC8qKlxuICAgICAqIHRyYWl0c1x1RkYxQVxuICAgICAqIC0gVXNlZCB0byBhdHRhY2ggYSBTdGF0ZVRyYWl0U3BlYyAoc2VlIHNwZWNzLzAwMC1tb2R1bGUtdHJhaXRzLXJ1bnRpbWUpLlxuICAgICAqIC0gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gYnVpbGRzIGEgUHJvZ3JhbSBkdXJpbmcgTW9kdWxlVGFnLm1ha2UsIGFuZCBpbmplY3RzIGEgc2V0dXAtb25seSBMb2dpYyBpbiBgTW9kdWxlVGFnLmltcGxlbWVudGBcbiAgICAgKiAgIHRvIGNhbGwgYFN0YXRlVHJhaXQuaW5zdGFsbGAuXG4gICAgICogICAoTm90ZTogaWYgeW91IHVzZSBgTW9kdWxlVGFnLmxpdmVgIHRvIGV4cG9ydCBhIExheWVyIGFuZCB3YW50IHRyYWl0IGJlaGF2aW9yLCBjYWxsIGBTdGF0ZVRyYWl0Lmluc3RhbGxgIGV4cGxpY2l0bHkgaW4gbG9naWNzLFxuICAgICAqICAgb3IgdXNlIGBNb2R1bGVUYWcuaW1wbGVtZW50YCBpbnN0ZWFkLilcbiAgICAgKi9cbiAgICByZWFkb25seSB0cmFpdHM/OiB1bmtub3duXG4gIH0sXG4pOiBNb2R1bGVUYWc8SWQsIFNoYXBlPFNTY2hlbWEsIEFEZWZzPj4gPT4ge1xuICBjb25zdCBhY3Rpb25zID0gQWN0aW9uLm5vcm1hbGl6ZUFjdGlvbnMoZGVmLmFjdGlvbnMpXG4gIGNvbnN0IG1vZHVsZVRhZzogTW9kdWxlVGFnPElkLCBTaGFwZTxTU2NoZW1hLCBBRGVmcz4+ID0gbWFrZUltcGwoaWQsIHtcbiAgICBzdGF0ZTogZGVmLnN0YXRlLFxuICAgIGFjdGlvbnMsXG4gICAgcmVkdWNlcnM6IGRlZi5yZWR1Y2VycyBhcyBhbnksXG4gIH0pXG5cbiAgdHlwZSBTaCA9IFNoYXBlPFNTY2hlbWEsIEFEZWZzPlxuXG4gIGNvbnN0IHN0YXRlU2NoZW1hID0gZGVmLnN0YXRlIGFzIFNjaGVtYS5TY2hlbWE8YW55LCBhbnk+XG4gIGNvbnN0IG1vZHVsZVRyYWl0c1NwZWMgPSBkZWYudHJhaXRzIGFzIFN0YXRlVHJhaXQuU3RhdGVUcmFpdFNwZWM8YW55PiB8IHVuZGVmaW5lZFxuICBjb25zdCBiYXNlUHJvZ3JhbTogU3RhdGVUcmFpdFByb2dyYW08YW55PiB8IHVuZGVmaW5lZCA9IG1vZHVsZVRyYWl0c1NwZWNcbiAgICA/IFN0YXRlVHJhaXQuYnVpbGQoc3RhdGVTY2hlbWEgYXMgYW55LCBtb2R1bGVUcmFpdHNTcGVjIGFzIGFueSlcbiAgICA6IHVuZGVmaW5lZFxuXG4gIGlmIChiYXNlUHJvZ3JhbSkge1xuICAgIC8vIEZvciBUcmFpdExpZmVjeWNsZS9EZWJ1Zy9EZXZ0b29scyByZWFkcyAoZGVmaW5pdGlvbi1zaWRlIGhpZGRlbiBzbG90KS5cbiAgICBzZXRNb2R1bGVUcmFpdHNQcm9ncmFtKG1vZHVsZVRhZyBhcyBhbnksIGJhc2VQcm9ncmFtKVxuICAgIE1vZHVsZVRyYWl0c1JlZ2lzdHJ5LnJlZ2lzdGVyTW9kdWxlUHJvZ3JhbShpZCwgYmFzZVByb2dyYW0gYXMgU3RhdGVUcmFpdFByb2dyYW08YW55PilcbiAgfVxuXG4gIC8vIDAyMzogY29uc29saWRhdGUgdGhlIHRyYWl0IFwiZGVjbGFyYXRpb24vbWVyZ2UgZW50cnkgcG9pbnRzXCIgaW50byB0aGUgc2V0dXAgcGhhc2U6XG4gIC8vIC0gbW9kdWxlLWxldmVsIHRyYWl0cyByZWdpc3RlciBhcyBjb250cmlidXRpb25zIGZpcnN0O1xuICAvLyAtIGxvZ2ljLWxldmVsIGRlY2xhcmVzIHZpYSAkLnRyYWl0cy5kZWNsYXJlO1xuICAvLyAtIGZpbmFsbHksIGZpbmFsaXplIFx1MjE5MiBmcmVlemUgXHUyMTkyIGJ1aWxkL2luc3RhbGwgaW4gb25lIHNob3QuXG5cbiAgY29uc3QgbWFrZU1vZHVsZVRyYWl0c0NvbnRyaWJ1dGlvbkxvZ2ljID0gKHRyYWl0czogdW5rbm93bik6IE1vZHVsZUxvZ2ljPFNoLCBuZXZlciwgbmV2ZXI+ID0+IHtcbiAgICBjb25zdCBsb2dpYyA9IG1vZHVsZVRhZy5sb2dpYygoJCkgPT4gKHtcbiAgICAgIHNldHVwOiBFZmZlY3Quc3luYygoKSA9PiB7XG4gICAgICAgIGlmICghdHJhaXRzIHx8IHR5cGVvZiB0cmFpdHMgIT09ICdvYmplY3QnKSByZXR1cm5cbiAgICAgICAgLy8gbW9kdWxlLWxldmVsIHByb3ZlbmFuY2UgdXNlcyBtb2R1bGVJZCBhcyB0aGUgc3RhYmxlIGFuY2hvclxuICAgICAgICAvLyAoYWxpZ25lZCB3aXRoIDAyMyBkYXRhLW1vZGVsOiBvcmlnaW5UeXBlPW1vZHVsZSwgb3JpZ2luSWQ9bW9kdWxlSWQpLlxuICAgICAgICAvLyBOb3RlOiB0cmFpdHNTcGVjIHN0aWxsIHJldXNlcyBTdGF0ZVRyYWl0U3BlYzsgZG8gbm90IGludHJvZHVjZSBhIHNlY29uZCBJUi5cbiAgICAgICAgY29uc3QgaW50ZXJuYWxzID0gZ2V0Qm91bmRJbnRlcm5hbHMoJCBhcyBhbnkpXG4gICAgICAgIGludGVybmFscy50cmFpdHMucmVnaXN0ZXJNb2R1bGVUcmFpdHNDb250cmlidXRpb24oe1xuICAgICAgICAgIHRyYWl0cyxcbiAgICAgICAgICBwcm92ZW5hbmNlOiB7XG4gICAgICAgICAgICBvcmlnaW5UeXBlOiAnbW9kdWxlJyxcbiAgICAgICAgICAgIG9yaWdpbklkOiBpZCxcbiAgICAgICAgICAgIG9yaWdpbklkS2luZDogJ2V4cGxpY2l0JyxcbiAgICAgICAgICAgIG9yaWdpbkxhYmVsOiBgbW9kdWxlOiR7aWR9YCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgfSksXG4gICAgICBydW46IEVmZmVjdC52b2lkLFxuICAgIH0pKSBhcyBNb2R1bGVMb2dpYzxTaCwgbmV2ZXIsIG5ldmVyPlxuXG4gICAgTG9naWNVbml0TWV0YS5hdHRhY2hMb2dpY1VuaXRNZXRhKGxvZ2ljIGFzIGFueSwge1xuICAgICAgaWQ6ICdfX2xvZ2l4X2ludGVybmFsOnRyYWl0czptb2R1bGVfY29udHJpYicsXG4gICAgICBraW5kOiAnaW50ZXJuYWwnLFxuICAgICAgbmFtZTogJ3RyYWl0czptb2R1bGVfY29udHJpYicsXG4gICAgICBtb2R1bGVJZDogaWQsXG4gICAgfSlcbiAgICByZXR1cm4gbG9naWNcbiAgfVxuXG4gIGNvbnN0IG1ha2VGaW5hbGl6ZVRyYWl0c0xvZ2ljID0gKCk6IE1vZHVsZUxvZ2ljPFNoLCBuZXZlciwgbmV2ZXI+ID0+IHtcbiAgICBjb25zdCBsb2dpYyA9IG1vZHVsZVRhZy5sb2dpYygoJCkgPT4gKHtcbiAgICAgIHNldHVwOiBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGludGVybmFscyA9IGdldEJvdW5kSW50ZXJuYWxzKCQgYXMgYW55KVxuICAgICAgICBjb25zdCBkaWFnbm9zdGljc0xldmVsID0geWllbGQqIEZpYmVyUmVmLmdldChEZWJ1Zy5jdXJyZW50RGlhZ25vc3RpY3NMZXZlbClcblxuICAgICAgICBjb25zdCBjb250cmlidXRpb25zID0gaW50ZXJuYWxzLnRyYWl0cy5nZXRNb2R1bGVUcmFpdHNDb250cmlidXRpb25zKClcbiAgICAgICAgbGV0IG1lcmdlZDogTW9kdWxlVHJhaXRzLlRyYWl0U3BlY1xuICAgICAgICBsZXQgc25hcHNob3Q6IE1vZHVsZVRyYWl0cy5Nb2R1bGVUcmFpdHNTbmFwc2hvdFxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgOyh7IG1lcmdlZCwgc25hcHNob3QgfSA9IE1vZHVsZVRyYWl0cy5maW5hbGl6ZVRyYWl0Q29udHJpYnV0aW9ucyh7XG4gICAgICAgICAgICBtb2R1bGVJZDogaWQsXG4gICAgICAgICAgICBjb250cmlidXRpb25zLFxuICAgICAgICAgIH0pKVxuICAgICAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRpYWdub3N0aWNzTGV2ZWwgIT09ICdvZmYnICYmXG4gICAgICAgICAgICBjYXVzZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGNhdXNlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgKGNhdXNlIGFzIGFueSkuX3RhZyA9PT0gJ01vZHVsZVRyYWl0c0NvbmZsaWN0RXJyb3InXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBjb25mbGljdHMgPSBBcnJheS5pc0FycmF5KChjYXVzZSBhcyBhbnkpLmNvbmZsaWN0cylcbiAgICAgICAgICAgICAgPyAoKGNhdXNlIGFzIGFueSkuY29uZmxpY3RzIGFzIFJlYWRvbmx5QXJyYXk8dW5rbm93bj4pXG4gICAgICAgICAgICAgIDogW11cbiAgICAgICAgICAgIGNvbnN0IHRyYWl0SWRzID0gY29uZmxpY3RzXG4gICAgICAgICAgICAgIC5tYXAoKGM6IGFueSkgPT4gKGMgJiYgdHlwZW9mIGMgPT09ICdvYmplY3QnID8gKGMgYXMgYW55KS50cmFpdElkIDogdW5kZWZpbmVkKSlcbiAgICAgICAgICAgICAgLmZpbHRlcigodCk6IHQgaXMgc3RyaW5nID0+IHR5cGVvZiB0ID09PSAnc3RyaW5nJyAmJiB0Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgIC5zbGljZSgwLCAyMClcblxuICAgICAgICAgICAgY29uc3QgZGF0YSA9XG4gICAgICAgICAgICAgIGRpYWdub3N0aWNzTGV2ZWwgPT09ICdmdWxsJ1xuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBjb25mbGljdENvdW50OiBjb25mbGljdHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBjb25mbGljdHMsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0Q291bnQ6IGNvbmZsaWN0cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHRyYWl0SWRzLFxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB5aWVsZCogRGVidWcucmVjb3JkKHtcbiAgICAgICAgICAgICAgdHlwZTogJ3RyYWNlOm1vZHVsZTp0cmFpdHM6Y29uZmxpY3QnLFxuICAgICAgICAgICAgICBtb2R1bGVJZDogaWQsXG4gICAgICAgICAgICAgIGluc3RhbmNlSWQ6IGludGVybmFscy5pbnN0YW5jZUlkLFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgY2F1c2VcbiAgICAgICAgfVxuXG4gICAgICAgIGludGVybmFscy50cmFpdHMuc2V0TW9kdWxlVHJhaXRzU25hcHNob3Qoc25hcHNob3QpXG4gICAgICAgIGludGVybmFscy50cmFpdHMuZnJlZXplTW9kdWxlVHJhaXRzKClcblxuICAgICAgICBpZiAoZGlhZ25vc3RpY3NMZXZlbCAhPT0gJ29mZicpIHtcbiAgICAgICAgICBjb25zdCBkYXRhID1cbiAgICAgICAgICAgIGRpYWdub3N0aWNzTGV2ZWwgPT09ICdmdWxsJ1xuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIGRpZ2VzdDogc25hcHNob3QuZGlnZXN0LFxuICAgICAgICAgICAgICAgICAgY291bnQ6IHNuYXBzaG90LnRyYWl0cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICB0cmFpdHM6IHNuYXBzaG90LnRyYWl0cyxcbiAgICAgICAgICAgICAgICAgIHByb3ZlbmFuY2VJbmRleDogc25hcHNob3QucHJvdmVuYW5jZUluZGV4LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICBkaWdlc3Q6IHNuYXBzaG90LmRpZ2VzdCxcbiAgICAgICAgICAgICAgICAgIGNvdW50OiBzbmFwc2hvdC50cmFpdHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgICAgICAgdHlwZTogJ3RyYWNlOm1vZHVsZTp0cmFpdHMnLFxuICAgICAgICAgICAgbW9kdWxlSWQ6IGlkLFxuICAgICAgICAgICAgaW5zdGFuY2VJZDogaW50ZXJuYWxzLmluc3RhbmNlSWQsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgIH0gYXMgYW55KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1lcmdlZCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvbmx5TW9kdWxlTGV2ZWwgPSBjb250cmlidXRpb25zLmxlbmd0aCA9PT0gMSAmJiBjb250cmlidXRpb25zWzBdPy5wcm92ZW5hbmNlPy5vcmlnaW5UeXBlID09PSAnbW9kdWxlJ1xuXG4gICAgICAgIC8vIEJ1aWxkIGEgb25lLXNob3QgUHJvZ3JhbSBmcm9tIHRoZSBmaW5hbCBtZXJnZWQgU3BlYywgYW5kIGluc3RhbGwgaXQgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICAgICAgICAvLyAtIElmIHRoZXJlIGlzIG9ubHkgYSBtb2R1bGUtbGV2ZWwgY29udHJpYnV0aW9uLCByZXVzZSB0aGUgcHJvZ3JhbSBidWlsdCBpbiBNb2R1bGVUYWcubWFrZSAodXNlZnVsIGZvciBEZWJ1Zy9UcmFpdExpZmVjeWNsZSkuXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPVxuICAgICAgICAgIG9ubHlNb2R1bGVMZXZlbCAmJiBiYXNlUHJvZ3JhbSA/IGJhc2VQcm9ncmFtIDogU3RhdGVUcmFpdC5idWlsZChzdGF0ZVNjaGVtYSBhcyBhbnksIG1lcmdlZCBhcyBhbnkpXG5cbiAgICAgICAgLy8gRm9yIFRyYWl0TGlmZWN5Y2xlL0RlYnVnL0RldnRvb2xzIHJlYWRzIChkZWZpbml0aW9uLXNpZGUgaGlkZGVuIHNsb3QpLlxuICAgICAgICBzZXRNb2R1bGVUcmFpdHNQcm9ncmFtKG1vZHVsZVRhZyBhcyBhbnksIHByb2dyYW0pXG4gICAgICAgIE1vZHVsZVRyYWl0c1JlZ2lzdHJ5LnJlZ2lzdGVyTW9kdWxlUHJvZ3JhbShpZCwgcHJvZ3JhbSBhcyBTdGF0ZVRyYWl0UHJvZ3JhbTxhbnk+KVxuXG4gICAgICAgIHlpZWxkKiBTdGF0ZVRyYWl0Lmluc3RhbGwoJCBhcyB1bmtub3duIGFzIEJvdW5kQXBpPGFueSwgYW55PiwgcHJvZ3JhbSlcbiAgICAgIH0pLFxuICAgICAgcnVuOiBFZmZlY3Qudm9pZCxcbiAgICB9KSkgYXMgTW9kdWxlTG9naWM8U2gsIG5ldmVyLCBuZXZlcj5cblxuICAgIExvZ2ljVW5pdE1ldGEuYXR0YWNoTG9naWNVbml0TWV0YShsb2dpYyBhcyBhbnksIHtcbiAgICAgIGlkOiAnX19sb2dpeF9pbnRlcm5hbDp0cmFpdHM6ZmluYWxpemUnLFxuICAgICAga2luZDogJ2ludGVybmFsJyxcbiAgICAgIG5hbWU6ICd0cmFpdHM6ZmluYWxpemUnLFxuICAgICAgbW9kdWxlSWQ6IGlkLFxuICAgIH0pXG5cbiAgICByZXR1cm4gbG9naWNcbiAgfVxuXG4gIC8vIFdyYXAgaW1wbGVtZW50OiBpbmplY3QgKDEpIG9wdGlvbmFsIG1vZHVsZS1sZXZlbCBjb250cmlidXRpb24gbG9naWMsIGFuZCAoMikgcmVxdWlyZWQgZmluYWxpemUraW5zdGFsbCBsb2dpYy5cbiAgY29uc3Qgb3JpZ2luYWxJbXBsZW1lbnQgPSBtb2R1bGVUYWcuaW1wbGVtZW50XG4gIDsobW9kdWxlVGFnIGFzIGFueSkuaW1wbGVtZW50ID0gKDxSID0gbmV2ZXI+KGNvbmZpZzoge1xuICAgIGluaXRpYWw6IFN0YXRlT2Y8dHlwZW9mIG1vZHVsZVRhZy5zaGFwZT5cbiAgICBsb2dpY3M/OiBBcnJheTxNb2R1bGVMb2dpYzx0eXBlb2YgbW9kdWxlVGFnLnNoYXBlLCBSLCBhbnk+PlxuICAgIGltcG9ydHM/OiBSZWFkb25seUFycmF5PExheWVyLkxheWVyPGFueSwgYW55LCBhbnk+IHwgTW9kdWxlSW1wbDxhbnksIEFueU1vZHVsZVNoYXBlLCBhbnk+PlxuICAgIHByb2Nlc3Nlcz86IFJlYWRvbmx5QXJyYXk8RWZmZWN0LkVmZmVjdDx2b2lkLCBhbnksIGFueT4+XG4gIH0pID0+IHtcbiAgICBjb25zdCB1c2VyTG9naWNzID0gKGNvbmZpZy5sb2dpY3MgPz8gW10pIGFzIEFycmF5PE1vZHVsZUxvZ2ljPHR5cGVvZiBtb2R1bGVUYWcuc2hhcGUsIFIsIGFueT4+XG5cbiAgICBjb25zdCBtb2R1bGVMZXZlbCA9IGRlZi50cmFpdHMgPyBbbWFrZU1vZHVsZVRyYWl0c0NvbnRyaWJ1dGlvbkxvZ2ljKGRlZi50cmFpdHMpIGFzIGFueV0gOiBbXVxuXG4gICAgY29uc3QgZmluYWxpemUgPSBtYWtlRmluYWxpemVUcmFpdHNMb2dpYygpIGFzIE1vZHVsZUxvZ2ljPHR5cGVvZiBtb2R1bGVUYWcuc2hhcGUsIFIsIGFueT5cblxuICAgIGNvbnN0IG1lcmdlZExvZ2ljcyA9IFsuLi5tb2R1bGVMZXZlbCwgLi4udXNlckxvZ2ljcywgZmluYWxpemVdXG5cbiAgICByZXR1cm4gb3JpZ2luYWxJbXBsZW1lbnQ8Uj4oe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgbG9naWNzOiBtZXJnZWRMb2dpY3MsXG4gICAgfSlcbiAgfSkgYXMgdHlwZW9mIG1vZHVsZVRhZy5pbXBsZW1lbnRcblxuICByZXR1cm4gbW9kdWxlVGFnXG59XG4iLCAiaW1wb3J0IHsgZm52MWEzMiwgc3RhYmxlU3RyaW5naWZ5IH0gZnJvbSAnLi4vLi4vZGlnZXN0LmpzJ1xuXG5leHBvcnQgdHlwZSBUcmFpdElkID0gc3RyaW5nXG5cbmV4cG9ydCB0eXBlIFRyYWl0T3JpZ2luVHlwZSA9ICdtb2R1bGUnIHwgJ2xvZ2ljVW5pdCdcbmV4cG9ydCB0eXBlIFRyYWl0T3JpZ2luSWRLaW5kID0gJ2V4cGxpY2l0JyB8ICdkZXJpdmVkJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWl0UHJvdmVuYW5jZSB7XG4gIHJlYWRvbmx5IG9yaWdpblR5cGU6IFRyYWl0T3JpZ2luVHlwZVxuICByZWFkb25seSBvcmlnaW5JZDogc3RyaW5nXG4gIHJlYWRvbmx5IG9yaWdpbklkS2luZDogVHJhaXRPcmlnaW5JZEtpbmRcbiAgLyoqXG4gICAqIEh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciBEZXZ0b29scy9lcnJvciBtZXNzYWdlcyAoZS5nLiBcImxvZ2ljVW5pdDpQcm9maWxlIzFcIikuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5MYWJlbDogc3RyaW5nXG4gIC8qKlxuICAgKiBPcHRpb25hbCBsb2NhdGlvbiBzdW1tYXJ5IChlLmcuIGZpbGUgcGF0aCAvIGNhbGxzaXRlKTsgZm9yIG5hdmlnYXRpb24gb25seSBhbmQgbm90IHVzZWQgZm9yIHNlbWFudGljIGRlY2lzaW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmdcbn1cblxuLyoqXG4gKiBUcmFpdFNwZWNcdUZGMUFcbiAqIC0gTWluaW1hbCByZXByZXNlbnRhdGlvbiBvZiBcInRyYWl0IGRlY2xhcmF0aW9uc1wiOiBhIHJlY29yZCBrZXllZCBieSB0cmFpdElkLlxuICogLSBUaGUgY29uY3JldGUgdmFsdWUgc2hhcGUgaXMgZGVmaW5lZCBieSB0aGUgc3BlY2lmaWMgdHJhaXQgc3lzdGVtIChlLmcuIFN0YXRlVHJhaXRTcGVjKS5cbiAqIC0gVmFsdWUgc2VyaWFsaXphYmlsaXR5IGlzIG5vdCBjb25zdHJhaW5lZCBoZXJlIChydW50aW1lIGluc3RhbGwgbWF5IGRlcGVuZCBvbiBmdW5jdGlvbnMpLCBidXQgc25hcHNob3RzL2V2aWRlbmNlIGV4cG9ydHNcbiAqICAgbXVzdCBvbmx5IGluY2x1ZGUgc2VyaWFsaXphYmxlIHN1YnNldHMuXG4gKi9cbmV4cG9ydCB0eXBlIFRyYWl0U3BlYyA9IG9iamVjdFxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWl0Q29udHJpYnV0aW9uIHtcbiAgcmVhZG9ubHkgdHJhaXRzOiBUcmFpdFNwZWNcbiAgcmVhZG9ubHkgcHJvdmVuYW5jZTogVHJhaXRQcm92ZW5hbmNlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlVHJhaXRJdGVtIHtcbiAgcmVhZG9ubHkgdHJhaXRJZDogVHJhaXRJZFxuICByZWFkb25seSBuYW1lOiBzdHJpbmdcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgVHJhaXRDb25mbGljdEtpbmQgPSAnZHVwbGljYXRlX3RyYWl0SWQnIHwgJ21pc3NpbmdfcmVxdWlyZXMnIHwgJ2V4Y2x1ZGVzX3Zpb2xhdGlvbidcblxuZXhwb3J0IGludGVyZmFjZSBUcmFpdENvbmZsaWN0IHtcbiAgcmVhZG9ubHkga2luZDogVHJhaXRDb25mbGljdEtpbmRcbiAgcmVhZG9ubHkgdHJhaXRJZDogVHJhaXRJZFxuICByZWFkb25seSBzb3VyY2VzOiBSZWFkb25seUFycmF5PFRyYWl0UHJvdmVuYW5jZT5cbiAgcmVhZG9ubHkgbWlzc2luZz86IFJlYWRvbmx5QXJyYXk8VHJhaXRJZD5cbiAgcmVhZG9ubHkgcHJlc2VudD86IFJlYWRvbmx5QXJyYXk8VHJhaXRJZD5cbn1cblxuZXhwb3J0IGNsYXNzIE1vZHVsZVRyYWl0c0NvbmZsaWN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IF90YWcgPSAnTW9kdWxlVHJhaXRzQ29uZmxpY3RFcnJvcidcblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nLFxuICAgIHJlYWRvbmx5IGNvbmZsaWN0czogUmVhZG9ubHlBcnJheTxUcmFpdENvbmZsaWN0PixcbiAgKSB7XG4gICAgc3VwZXIoXG4gICAgICBbXG4gICAgICAgIGBbTW9kdWxlVHJhaXRzQ29uZmxpY3RFcnJvcl0gQ29uZmxpY3RpbmcgdHJhaXRJZHMgZm91bmQgKG1vZHVsZUlkPSR7bW9kdWxlSWR9KS5gLFxuICAgICAgICAuLi5jb25mbGljdHMubWFwKChjKSA9PlxuICAgICAgICAgIGMua2luZCA9PT0gJ2R1cGxpY2F0ZV90cmFpdElkJ1xuICAgICAgICAgICAgPyBgLSBkdXBsaWNhdGUgJHtjLnRyYWl0SWR9OiAke2Muc291cmNlcy5tYXAoKHMpID0+IGAke3Mub3JpZ2luVHlwZX06JHtzLm9yaWdpbklkfWApLmpvaW4oJywgJyl9YFxuICAgICAgICAgICAgOiBjLmtpbmQgPT09ICdtaXNzaW5nX3JlcXVpcmVzJ1xuICAgICAgICAgICAgICA/IGAtIG1pc3NpbmcgcmVxdWlyZXMgZm9yICR7Yy50cmFpdElkfTogJHsoYy5taXNzaW5nID8/IFtdKS5qb2luKCcsICcpfTsgc291cmNlcz0ke2Muc291cmNlc1xuICAgICAgICAgICAgICAgICAgLm1hcCgocykgPT4gYCR7cy5vcmlnaW5UeXBlfToke3Mub3JpZ2luSWR9YClcbiAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpfWBcbiAgICAgICAgICAgICAgOiBgLSBleGNsdWRlcyB2aW9sYXRpb24gZm9yICR7Yy50cmFpdElkfTogcHJlc2VudD0keyhjLnByZXNlbnQgPz8gW10pLmpvaW4oJywgJyl9OyBzb3VyY2VzPSR7Yy5zb3VyY2VzXG4gICAgICAgICAgICAgICAgICAubWFwKChzKSA9PiBgJHtzLm9yaWdpblR5cGV9OiR7cy5vcmlnaW5JZH1gKVxuICAgICAgICAgICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICAgKSxcbiAgICAgIF0uam9pbignXFxuJyksXG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlVHJhaXRzU25hcHNob3Qge1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGRpZ2VzdDogc3RyaW5nXG4gIHJlYWRvbmx5IHRyYWl0czogUmVhZG9ubHlBcnJheTxNb2R1bGVUcmFpdEl0ZW0+XG4gIHJlYWRvbmx5IHByb3ZlbmFuY2VJbmRleDogUmVjb3JkPFRyYWl0SWQsIFRyYWl0UHJvdmVuYW5jZT5cbn1cblxuY29uc3QgdG9Qcm92ZW5hbmNlS2V5ID0gKHA6IFRyYWl0UHJvdmVuYW5jZSk6IHN0cmluZyA9PlxuICBgJHtwLm9yaWdpblR5cGV9OiR7cC5vcmlnaW5JZH06JHtwLm9yaWdpbklkS2luZH06JHtwLm9yaWdpbkxhYmVsfToke3AucGF0aCA/PyAnJ31gXG5cbmNvbnN0IGNvbXBhcmVTdHJpbmcgPSAoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBudW1iZXIgPT4gKGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKVxuXG5jb25zdCBjb21wYXJlUHJvdmVuYW5jZSA9IChhOiBUcmFpdFByb3ZlbmFuY2UsIGI6IFRyYWl0UHJvdmVuYW5jZSk6IG51bWJlciA9PiB7XG4gIGNvbnN0IHR5cGUgPSBjb21wYXJlU3RyaW5nKGEub3JpZ2luVHlwZSwgYi5vcmlnaW5UeXBlKVxuICBpZiAodHlwZSAhPT0gMCkgcmV0dXJuIHR5cGVcbiAgY29uc3QgaWQgPSBjb21wYXJlU3RyaW5nKGEub3JpZ2luSWQsIGIub3JpZ2luSWQpXG4gIGlmIChpZCAhPT0gMCkgcmV0dXJuIGlkXG4gIGNvbnN0IGtpbmQgPSBjb21wYXJlU3RyaW5nKGEub3JpZ2luSWRLaW5kLCBiLm9yaWdpbklkS2luZClcbiAgaWYgKGtpbmQgIT09IDApIHJldHVybiBraW5kXG4gIGNvbnN0IGxhYmVsID0gY29tcGFyZVN0cmluZyhhLm9yaWdpbkxhYmVsLCBiLm9yaWdpbkxhYmVsKVxuICBpZiAobGFiZWwgIT09IDApIHJldHVybiBsYWJlbFxuICByZXR1cm4gY29tcGFyZVN0cmluZyhTdHJpbmcoYS5wYXRoID8/ICcnKSwgU3RyaW5nKGIucGF0aCA/PyAnJykpXG59XG5cbmNvbnN0IG9yaWdpblR5cGVPcmRlciA9ICh0OiBUcmFpdE9yaWdpblR5cGUpOiBudW1iZXIgPT4gKHQgPT09ICdtb2R1bGUnID8gMCA6IDEpXG5cbmNvbnN0IGNvbXBhcmVUcmFpdElkQnlQcm92ZW5hbmNlID0gKFxuICBhOiB7IHJlYWRvbmx5IHRyYWl0SWQ6IFRyYWl0SWQ7IHJlYWRvbmx5IHByb3ZlbmFuY2U6IFRyYWl0UHJvdmVuYW5jZSB9LFxuICBiOiB7IHJlYWRvbmx5IHRyYWl0SWQ6IFRyYWl0SWQ7IHJlYWRvbmx5IHByb3ZlbmFuY2U6IFRyYWl0UHJvdmVuYW5jZSB9LFxuKTogbnVtYmVyID0+IHtcbiAgY29uc3QgdGEgPSBvcmlnaW5UeXBlT3JkZXIoYS5wcm92ZW5hbmNlLm9yaWdpblR5cGUpIC0gb3JpZ2luVHlwZU9yZGVyKGIucHJvdmVuYW5jZS5vcmlnaW5UeXBlKVxuICBpZiAodGEgIT09IDApIHJldHVybiB0YVxuICBjb25zdCBvYSA9IGNvbXBhcmVTdHJpbmcoYS5wcm92ZW5hbmNlLm9yaWdpbklkLCBiLnByb3ZlbmFuY2Uub3JpZ2luSWQpXG4gIGlmIChvYSAhPT0gMCkgcmV0dXJuIG9hXG4gIHJldHVybiBjb21wYXJlU3RyaW5nKGEudHJhaXRJZCwgYi50cmFpdElkKVxufVxuXG5jb25zdCBleHRyYWN0U3RyaW5nQXJyYXkgPSAodmFsdWU6IHVua25vd24pOiBSZWFkb25seUFycmF5PHN0cmluZz4gPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW11cbiAgY29uc3Qgb3V0OiBBcnJheTxzdHJpbmc+ID0gW11cbiAgZm9yIChjb25zdCB2IG9mIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2ICE9PSAnc3RyaW5nJykgY29udGludWVcbiAgICBjb25zdCBzID0gdi50cmltKClcbiAgICBpZiAoIXMpIGNvbnRpbnVlXG4gICAgb3V0LnB1c2gocylcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmNvbnN0IGdldFRyYWl0UmVxdWlyZXMgPSAodmFsdWU6IHVua25vd24pOiBSZWFkb25seUFycmF5PFRyYWl0SWQ+ID0+IHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gW11cbiAgY29uc3QgZGlyZWN0ID0gZXh0cmFjdFN0cmluZ0FycmF5KCh2YWx1ZSBhcyBhbnkpLnJlcXVpcmVzKVxuICByZXR1cm4gZGlyZWN0XG59XG5cbmNvbnN0IGdldFRyYWl0RXhjbHVkZXMgPSAodmFsdWU6IHVua25vd24pOiBSZWFkb25seUFycmF5PFRyYWl0SWQ+ID0+IHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gW11cbiAgY29uc3QgZGlyZWN0ID0gZXh0cmFjdFN0cmluZ0FycmF5KCh2YWx1ZSBhcyBhbnkpLmV4Y2x1ZGVzKVxuICByZXR1cm4gZGlyZWN0XG59XG5cbmNvbnN0IGdldFRyYWl0TmFtZSA9ICh0cmFpdElkOiBUcmFpdElkLCB2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgbiA9ICh2YWx1ZSBhcyBhbnkpLm5hbWVcbiAgICBpZiAodHlwZW9mIG4gPT09ICdzdHJpbmcnICYmIG4udHJpbSgpLmxlbmd0aCA+IDApIHJldHVybiBuLnRyaW0oKVxuICB9XG4gIHJldHVybiB0cmFpdElkXG59XG5cbmNvbnN0IGdldFRyYWl0RGVzY3JpcHRpb24gPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IGQgPSAodmFsdWUgYXMgYW55KS5kZXNjcmlwdGlvblxuICAgIGlmICh0eXBlb2YgZCA9PT0gJ3N0cmluZycgJiYgZC50cmltKCkubGVuZ3RoID4gMCkgcmV0dXJuIGQudHJpbSgpXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgZmluYWxpemVUcmFpdENvbnRyaWJ1dGlvbnMgPSAoYXJnczoge1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGNvbnRyaWJ1dGlvbnM6IFJlYWRvbmx5QXJyYXk8VHJhaXRDb250cmlidXRpb24+XG59KTogeyByZWFkb25seSBtZXJnZWQ6IFRyYWl0U3BlYzsgcmVhZG9ubHkgc25hcHNob3Q6IE1vZHVsZVRyYWl0c1NuYXBzaG90IH0gPT4ge1xuICBjb25zdCB0cmFpdEJ5SWQgPSBuZXcgTWFwPFRyYWl0SWQsIHsgcmVhZG9ubHkgdmFsdWU6IHVua25vd247IHJlYWRvbmx5IHByb3ZlbmFuY2U6IFRyYWl0UHJvdmVuYW5jZSB9PigpXG5cbiAgY29uc3QgZHVwbGljYXRlU291cmNlcyA9IG5ldyBNYXA8VHJhaXRJZCwgQXJyYXk8VHJhaXRQcm92ZW5hbmNlPj4oKVxuXG4gIGNvbnN0IGNvbnRyaWJ1dGlvbnMgPSBbLi4uYXJncy5jb250cmlidXRpb25zXS5zb3J0KChhLCBiKSA9PiBjb21wYXJlUHJvdmVuYW5jZShhLnByb3ZlbmFuY2UsIGIucHJvdmVuYW5jZSkpXG5cbiAgZm9yIChjb25zdCBjIG9mIGNvbnRyaWJ1dGlvbnMpIHtcbiAgICBjb25zdCB0cmFpdHMgPSBjLnRyYWl0c1xuICAgIGlmICghdHJhaXRzIHx8IHR5cGVvZiB0cmFpdHMgIT09ICdvYmplY3QnKSBjb250aW51ZVxuICAgIGZvciAoY29uc3QgdHJhaXRJZCBvZiBPYmplY3Qua2V5cyh0cmFpdHMpLnNvcnQoKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSAodHJhaXRzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVt0cmFpdElkXVxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHByZXYgPSB0cmFpdEJ5SWQuZ2V0KHRyYWl0SWQpXG4gICAgICBpZiAoIXByZXYpIHtcbiAgICAgICAgdHJhaXRCeUlkLnNldCh0cmFpdElkLCB7IHZhbHVlLCBwcm92ZW5hbmNlOiBjLnByb3ZlbmFuY2UgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc291cmNlcyA9IGR1cGxpY2F0ZVNvdXJjZXMuZ2V0KHRyYWl0SWQpID8/IFtwcmV2LnByb3ZlbmFuY2VdXG4gICAgICBzb3VyY2VzLnB1c2goYy5wcm92ZW5hbmNlKVxuICAgICAgZHVwbGljYXRlU291cmNlcy5zZXQodHJhaXRJZCwgc291cmNlcylcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb25mbGljdHM6IEFycmF5PFRyYWl0Q29uZmxpY3Q+ID0gW11cbiAgY29uc3QgcmVnaXN0ZXJDb25mbGljdCA9IChjb25mbGljdDogVHJhaXRDb25mbGljdCkgPT4ge1xuICAgIGNvbnN0IHVuaXF1ZSA9IG5ldyBNYXA8c3RyaW5nLCBUcmFpdFByb3ZlbmFuY2U+KClcbiAgICBmb3IgKGNvbnN0IHMgb2YgY29uZmxpY3Quc291cmNlcykge1xuICAgICAgdW5pcXVlLnNldCh0b1Byb3ZlbmFuY2VLZXkocyksIHMpXG4gICAgfVxuICAgIGNvbmZsaWN0cy5wdXNoKHtcbiAgICAgIC4uLmNvbmZsaWN0LFxuICAgICAgc291cmNlczogQXJyYXkuZnJvbSh1bmlxdWUudmFsdWVzKCkpLnNvcnQoY29tcGFyZVByb3ZlbmFuY2UpLFxuICAgIH0pXG4gIH1cblxuICAvLyAxKSBkdXBsaWNhdGUgdHJhaXRJZCBjb25mbGljdHNcbiAgZm9yIChjb25zdCB0cmFpdElkIG9mIEFycmF5LmZyb20oZHVwbGljYXRlU291cmNlcy5rZXlzKCkpLnNvcnQoKSkge1xuICAgIHJlZ2lzdGVyQ29uZmxpY3Qoe1xuICAgICAga2luZDogJ2R1cGxpY2F0ZV90cmFpdElkJyxcbiAgICAgIHRyYWl0SWQsXG4gICAgICBzb3VyY2VzOiBkdXBsaWNhdGVTb3VyY2VzLmdldCh0cmFpdElkKSA/PyBbXSxcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gIGNvbnN0IHByb3ZlbmFuY2VJbmRleDogUmVjb3JkPHN0cmluZywgVHJhaXRQcm92ZW5hbmNlPiA9IHt9XG4gIGNvbnN0IHRyYWl0czogQXJyYXk8TW9kdWxlVHJhaXRJdGVtPiA9IFtdXG5cbiAgY29uc3QgZW50cmllczogQXJyYXk8eyByZWFkb25seSB0cmFpdElkOiBUcmFpdElkOyByZWFkb25seSB2YWx1ZTogdW5rbm93bjsgcmVhZG9ubHkgcHJvdmVuYW5jZTogVHJhaXRQcm92ZW5hbmNlIH0+ID1cbiAgICBbXVxuICBmb3IgKGNvbnN0IHRyYWl0SWQgb2YgdHJhaXRCeUlkLmtleXMoKSkge1xuICAgIGNvbnN0IGVudHJ5ID0gdHJhaXRCeUlkLmdldCh0cmFpdElkKVxuICAgIGlmICghZW50cnkpIGNvbnRpbnVlXG4gICAgZW50cmllcy5wdXNoKHsgdHJhaXRJZCwgdmFsdWU6IGVudHJ5LnZhbHVlLCBwcm92ZW5hbmNlOiBlbnRyeS5wcm92ZW5hbmNlIH0pXG4gIH1cblxuICBjb25zdCBpZHMgPSBlbnRyaWVzXG4gICAgLnNsaWNlKClcbiAgICAuc29ydChjb21wYXJlVHJhaXRJZEJ5UHJvdmVuYW5jZSlcbiAgICAubWFwKChlKSA9PiBlLnRyYWl0SWQpXG5cbiAgZm9yIChjb25zdCB0cmFpdElkIG9mIGlkcykge1xuICAgIGNvbnN0IGVudHJ5ID0gdHJhaXRCeUlkLmdldCh0cmFpdElkKVxuICAgIGlmICghZW50cnkpIGNvbnRpbnVlXG4gICAgbWVyZ2VkW3RyYWl0SWRdID0gZW50cnkudmFsdWVcbiAgICBwcm92ZW5hbmNlSW5kZXhbdHJhaXRJZF0gPSBlbnRyeS5wcm92ZW5hbmNlXG4gICAgdHJhaXRzLnB1c2goe1xuICAgICAgdHJhaXRJZCxcbiAgICAgIG5hbWU6IGdldFRyYWl0TmFtZSh0cmFpdElkLCBlbnRyeS52YWx1ZSksXG4gICAgICBkZXNjcmlwdGlvbjogZ2V0VHJhaXREZXNjcmlwdGlvbihlbnRyeS52YWx1ZSksXG4gICAgfSlcbiAgfVxuXG4gIC8vIDIpIGNvbnNpc3RlbmN5IGNoZWNrcyAoRlItMDA3KTogcmVxdWlyZXMgLyBleGNsdWRlc1xuICBjb25zdCBwcmVzZW50ID0gbmV3IFNldChpZHMpXG5cbiAgZm9yIChjb25zdCB0cmFpdElkIG9mIGlkcykge1xuICAgIGNvbnN0IGVudHJ5ID0gdHJhaXRCeUlkLmdldCh0cmFpdElkKVxuICAgIGlmICghZW50cnkpIGNvbnRpbnVlXG5cbiAgICBjb25zdCByZXF1aXJlcyA9IGdldFRyYWl0UmVxdWlyZXMoZW50cnkudmFsdWUpXG4gICAgaWYgKHJlcXVpcmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG1pc3NpbmcgPSByZXF1aXJlcy5maWx0ZXIoKHIpID0+ICFwcmVzZW50LmhhcyhyKSlcbiAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVnaXN0ZXJDb25mbGljdCh7XG4gICAgICAgICAga2luZDogJ21pc3NpbmdfcmVxdWlyZXMnLFxuICAgICAgICAgIHRyYWl0SWQsXG4gICAgICAgICAgbWlzc2luZzogQXJyYXkuZnJvbShuZXcgU2V0KG1pc3NpbmcpKS5zb3J0KCksXG4gICAgICAgICAgc291cmNlczogW2VudHJ5LnByb3ZlbmFuY2VdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGV4Y2x1ZGVzID0gZ2V0VHJhaXRFeGNsdWRlcyhlbnRyeS52YWx1ZSlcbiAgICBpZiAoZXhjbHVkZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcHJlc2VudEV4Y2x1ZGVkID0gZXhjbHVkZXMuZmlsdGVyKChlKSA9PiBwcmVzZW50LmhhcyhlKSlcbiAgICAgIGlmIChwcmVzZW50RXhjbHVkZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBvdGhlclNvdXJjZXM6IEFycmF5PFRyYWl0UHJvdmVuYW5jZT4gPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IG90aGVySWQgb2YgcHJlc2VudEV4Y2x1ZGVkKSB7XG4gICAgICAgICAgY29uc3Qgb3RoZXIgPSB0cmFpdEJ5SWQuZ2V0KG90aGVySWQpXG4gICAgICAgICAgaWYgKG90aGVyKSBvdGhlclNvdXJjZXMucHVzaChvdGhlci5wcm92ZW5hbmNlKVxuICAgICAgICB9XG4gICAgICAgIHJlZ2lzdGVyQ29uZmxpY3Qoe1xuICAgICAgICAgIGtpbmQ6ICdleGNsdWRlc192aW9sYXRpb24nLFxuICAgICAgICAgIHRyYWl0SWQsXG4gICAgICAgICAgcHJlc2VudDogQXJyYXkuZnJvbShuZXcgU2V0KHByZXNlbnRFeGNsdWRlZCkpLnNvcnQoKSxcbiAgICAgICAgICBzb3VyY2VzOiBbZW50cnkucHJvdmVuYW5jZSwgLi4ub3RoZXJTb3VyY2VzXSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmxpY3RzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBraW5kT3JkZXI6IFJlY29yZDxUcmFpdENvbmZsaWN0S2luZCwgbnVtYmVyPiA9IHtcbiAgICAgIGR1cGxpY2F0ZV90cmFpdElkOiAwLFxuICAgICAgbWlzc2luZ19yZXF1aXJlczogMSxcbiAgICAgIGV4Y2x1ZGVzX3Zpb2xhdGlvbjogMixcbiAgICB9XG4gICAgY29uZmxpY3RzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGsgPSBraW5kT3JkZXJbYS5raW5kXSAtIGtpbmRPcmRlcltiLmtpbmRdXG4gICAgICBpZiAoayAhPT0gMCkgcmV0dXJuIGtcbiAgICAgIHJldHVybiBjb21wYXJlU3RyaW5nKGEudHJhaXRJZCwgYi50cmFpdElkKVxuICAgIH0pXG4gICAgdGhyb3cgbmV3IE1vZHVsZVRyYWl0c0NvbmZsaWN0RXJyb3IoYXJncy5tb2R1bGVJZCwgY29uZmxpY3RzKVxuICB9XG5cbiAgY29uc3QgZGlnZXN0QmFzZSA9IHtcbiAgICBtb2R1bGVJZDogYXJncy5tb2R1bGVJZCxcbiAgICB0cmFpdHMsXG4gICAgcHJvdmVuYW5jZUluZGV4LFxuICB9IGFzIGNvbnN0XG5cbiAgY29uc3QgZGlnZXN0ID0gYG10cmFpdHM6MDIzOiR7Zm52MWEzMihzdGFibGVTdHJpbmdpZnkoZGlnZXN0QmFzZSkpfWBcblxuICByZXR1cm4ge1xuICAgIG1lcmdlZCxcbiAgICBzbmFwc2hvdDoge1xuICAgICAgbW9kdWxlSWQ6IGFyZ3MubW9kdWxlSWQsXG4gICAgICBkaWdlc3QsXG4gICAgICB0cmFpdHMsXG4gICAgICBwcm92ZW5hbmNlSW5kZXgsXG4gICAgfSxcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FB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