@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,1114 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ ReplayLog,
5
+ getAtPath,
6
+ parseListItemFieldPath,
7
+ setAtPathMutating,
8
+ toListItemValuePath
9
+ } from "./chunk-67RVISUC.js";
10
+ import {
11
+ Snapshot,
12
+ internal,
13
+ keyHash
14
+ } from "./chunk-7POKWYE3.js";
15
+ import {
16
+ create
17
+ } from "./chunk-Y5I45PEB.js";
18
+ import {
19
+ inSyncTransactionFiber
20
+ } from "./chunk-E7BIWMQQ.js";
21
+ import {
22
+ getBoundInternals
23
+ } from "./chunk-6FKWRVP4.js";
24
+ import {
25
+ ReplayModeConfigTag,
26
+ isDevEnv
27
+ } from "./chunk-GP37MEGJ.js";
28
+ import {
29
+ EffectOpMiddlewareTag,
30
+ make,
31
+ run
32
+ } from "./chunk-ASJSJAAL.js";
33
+ import {
34
+ RunSessionTag
35
+ } from "./chunk-RS5FFPUV.js";
36
+ import {
37
+ record
38
+ } from "./chunk-CVZPRIDB.js";
39
+
40
+ // ../logix-core/src/internal/state-trait/source.ts
41
+ import { Effect, Fiber, Option } from "../effect.js";
42
+
43
+ // ../logix-core/src/internal/state-trait/deps-trace.ts
44
+ var isTraceableObject = (value) => {
45
+ if (!value || typeof value !== "object") return false;
46
+ if (Array.isArray(value)) return true;
47
+ if (value instanceof Date) return false;
48
+ if (value instanceof RegExp) return false;
49
+ if (value instanceof Error) return false;
50
+ if (value instanceof Map) return false;
51
+ if (value instanceof Set) return false;
52
+ if (value instanceof WeakMap) return false;
53
+ if (value instanceof WeakSet) return false;
54
+ return true;
55
+ };
56
+ var shouldIgnoreKey = (key) => key === "__proto__" || key === "prototype" || key === "constructor";
57
+ var normalizeReads = (reads) => {
58
+ const all = Array.from(reads).filter((p) => typeof p === "string" && p.length > 0);
59
+ all.sort();
60
+ const isPrefix = (prefix, full) => full !== prefix && full.startsWith(prefix + ".");
61
+ const pruned = [];
62
+ for (const p of all) {
63
+ let hasMoreSpecific = false;
64
+ for (const other of all) {
65
+ if (isPrefix(p, other)) {
66
+ hasMoreSpecific = true;
67
+ break;
68
+ }
69
+ }
70
+ if (!hasMoreSpecific) {
71
+ pruned.push(p);
72
+ }
73
+ }
74
+ pruned.sort();
75
+ return pruned;
76
+ };
77
+ var covers = (declared, read) => declared === read || read.startsWith(declared + ".");
78
+ var diffDeps = (declared, reads) => {
79
+ const declaredList = Array.from(new Set(declared)).filter((p) => typeof p === "string" && p.length > 0);
80
+ declaredList.sort();
81
+ const readList = Array.from(new Set(reads)).filter((p) => typeof p === "string" && p.length > 0);
82
+ readList.sort();
83
+ const missing = readList.filter((r) => declaredList.every((d) => !covers(d, r)));
84
+ const unused = declaredList.filter((d) => readList.every((r) => !covers(d, r)));
85
+ if (missing.length === 0 && unused.length === 0) return void 0;
86
+ return {
87
+ reads: readList,
88
+ declared: declaredList,
89
+ missing,
90
+ unused
91
+ };
92
+ };
93
+ var trace = (fn, state) => {
94
+ if (!isTraceableObject(state)) {
95
+ return { value: fn(state), reads: [] };
96
+ }
97
+ const reads = /* @__PURE__ */ new Set();
98
+ const proxyCache = /* @__PURE__ */ new WeakMap();
99
+ const proxyToTarget = /* @__PURE__ */ new WeakMap();
100
+ const wrap = (value2, path) => {
101
+ if (!isTraceableObject(value2)) return value2;
102
+ return getProxy(value2, path);
103
+ };
104
+ const unwrap = (value2) => {
105
+ if (value2 && (typeof value2 === "object" || typeof value2 === "function")) {
106
+ const target = proxyToTarget.get(value2);
107
+ if (target) return target;
108
+ }
109
+ return value2;
110
+ };
111
+ const getProxy = (target, basePath) => {
112
+ let byPath = proxyCache.get(target);
113
+ if (!byPath) {
114
+ byPath = /* @__PURE__ */ new Map();
115
+ proxyCache.set(target, byPath);
116
+ }
117
+ const cached = byPath.get(basePath);
118
+ if (cached) return cached;
119
+ const record2 = (path) => {
120
+ if (path) reads.add(path);
121
+ };
122
+ const proxy = new Proxy(target, {
123
+ get: (t, prop, receiver) => {
124
+ if (typeof prop === "symbol") {
125
+ return Reflect.get(t, prop, receiver);
126
+ }
127
+ const key = String(prop);
128
+ if (shouldIgnoreKey(key)) {
129
+ return Reflect.get(t, prop, receiver);
130
+ }
131
+ const nextPath = basePath ? `${basePath}.${key}` : key;
132
+ record2(nextPath);
133
+ const value2 = Reflect.get(t, prop, receiver);
134
+ return wrap(value2, nextPath);
135
+ },
136
+ has: (t, prop) => {
137
+ if (typeof prop === "symbol") return Reflect.has(t, prop);
138
+ const key = String(prop);
139
+ if (!shouldIgnoreKey(key)) {
140
+ const nextPath = basePath ? `${basePath}.${key}` : key;
141
+ record2(nextPath);
142
+ }
143
+ return Reflect.has(t, prop);
144
+ },
145
+ ownKeys: (t) => {
146
+ if (basePath) record2(basePath);
147
+ return Reflect.ownKeys(t);
148
+ },
149
+ getOwnPropertyDescriptor: (t, prop) => {
150
+ if (typeof prop === "symbol") {
151
+ return Reflect.getOwnPropertyDescriptor(t, prop);
152
+ }
153
+ const key = String(prop);
154
+ if (!shouldIgnoreKey(key)) {
155
+ const nextPath = basePath ? `${basePath}.${key}` : key;
156
+ record2(nextPath);
157
+ }
158
+ return Reflect.getOwnPropertyDescriptor(t, prop);
159
+ },
160
+ set: () => {
161
+ throw new Error(
162
+ "[deps-trace] Attempted to mutate state during deps tracing (state is readonly in dev-mode diagnostics)."
163
+ );
164
+ },
165
+ defineProperty: () => {
166
+ throw new Error(
167
+ "[deps-trace] Attempted to define property on state during deps tracing (state is readonly in dev-mode diagnostics)."
168
+ );
169
+ },
170
+ deleteProperty: () => {
171
+ throw new Error(
172
+ "[deps-trace] Attempted to delete property on state during deps tracing (state is readonly in dev-mode diagnostics)."
173
+ );
174
+ }
175
+ });
176
+ byPath.set(basePath, proxy);
177
+ proxyToTarget.set(proxy, target);
178
+ return proxy;
179
+ };
180
+ const root = getProxy(state, "");
181
+ const value = unwrap(fn(root));
182
+ return {
183
+ value,
184
+ reads: normalizeReads(reads)
185
+ };
186
+ };
187
+
188
+ // ../logix-core/src/internal/state-trait/source.ts
189
+ var makePatch = (path, from, to, reason, stepId) => ({
190
+ path,
191
+ from,
192
+ to,
193
+ reason,
194
+ stepId
195
+ });
196
+ var onceInRunSession = (key) => Effect.serviceOption(RunSessionTag).pipe(
197
+ Effect.map(
198
+ (maybe) => Option.isSome(maybe) ? maybe.value.local.once(key) : true
199
+ )
200
+ );
201
+ var formatList = (items, limit = 10) => {
202
+ if (items.length === 0) return "";
203
+ if (items.length <= limit) return items.join(", ");
204
+ return `${items.slice(0, limit).join(", ")}, \u2026(+${items.length - limit})`;
205
+ };
206
+ var emitDepsMismatch = (params) => Effect.gen(function* () {
207
+ const key = `${params.instanceId ?? "unknown"}::${params.kind}::${params.fieldPath}`;
208
+ const shouldEmit = yield* onceInRunSession(`deps_mismatch:${key}`);
209
+ if (!shouldEmit) return;
210
+ yield* record({
211
+ type: "diagnostic",
212
+ moduleId: params.moduleId,
213
+ instanceId: params.instanceId,
214
+ code: "state_trait::deps_mismatch",
215
+ severity: "warning",
216
+ message: `[deps] ${params.kind} "${params.fieldPath}" declared=[${formatList(params.diff.declared)}] reads=[${formatList(params.diff.reads)}] missing=[${formatList(params.diff.missing)}] unused=[${formatList(params.diff.unused)}]`,
217
+ hint: 'deps \u662F\u552F\u4E00\u4F9D\u8D56\u4E8B\u5B9E\u6E90\uFF1A\u540E\u7EED\u589E\u91CF\u8C03\u5EA6/\u53CD\u5411\u95ED\u5305/\u6027\u80FD\u4F18\u5316\u90FD\u53EA\u8BA4 deps\u3002\u8BF7\u5C06 deps \u4E0E\u5B9E\u9645\u8BFB\u53D6\u4FDD\u6301\u4E00\u81F4\uFF1B\u82E5\u786E\u5B9E\u4F9D\u8D56\u6574\u68F5\u5BF9\u8C61\uFF0C\u53EF\u58F0\u660E\u66F4\u7C97\u7C92\u5EA6\u7684 deps\uFF08\u4F8B\u5982 "profile"\uFF09\u4EE5\u8986\u76D6\u5B50\u5B57\u6BB5\u8BFB\u53D6\u3002',
218
+ kind: `deps_mismatch:${params.kind}`
219
+ });
220
+ });
221
+ var getMiddlewareStack = () => Effect.serviceOption(EffectOpMiddlewareTag).pipe(
222
+ Effect.map(
223
+ (maybe) => Option.isSome(maybe) ? maybe.value.stack : []
224
+ )
225
+ );
226
+ var recordTraitPatch = (bound, patch) => {
227
+ try {
228
+ const internals = getBoundInternals(bound);
229
+ internals.txn.recordStatePatch(patch);
230
+ } catch {
231
+ }
232
+ };
233
+ var recordReplayEvent = (bound, event) => {
234
+ try {
235
+ const internals = getBoundInternals(bound);
236
+ internals.txn.recordReplayEvent(event);
237
+ } catch {
238
+ }
239
+ };
240
+ var getBoundScope = (bound) => {
241
+ try {
242
+ const internals = getBoundInternals(bound);
243
+ return { moduleId: internals.moduleId, instanceId: internals.instanceId };
244
+ } catch {
245
+ return { moduleId: void 0, instanceId: void 0 };
246
+ }
247
+ };
248
+ var setSnapshotInTxn = (bound, fieldPath, next, reason, stepId, traitNodeId) => Effect.gen(function* () {
249
+ let wrote = false;
250
+ yield* bound.state.mutate((draft) => {
251
+ const prev = getAtPath(draft, fieldPath);
252
+ if (Object.is(prev, next)) return;
253
+ wrote = true;
254
+ setAtPathMutating(draft, fieldPath, next);
255
+ recordTraitPatch(bound, {
256
+ path: fieldPath,
257
+ from: prev,
258
+ to: next,
259
+ reason,
260
+ stepId,
261
+ traitNodeId
262
+ });
263
+ });
264
+ return wrote;
265
+ });
266
+ var writebackIfCurrentKeyHash = (bound, fieldPath, keyHash2, next, reason, stepId, traitNodeId, replayEvent) => Effect.gen(function* () {
267
+ let wrote = false;
268
+ yield* bound.state.mutate((draft) => {
269
+ const current = getAtPath(draft, fieldPath);
270
+ const currentKeyHash = current && typeof current === "object" ? current.keyHash : void 0;
271
+ if (currentKeyHash !== keyHash2) return;
272
+ const prev = current;
273
+ if (Object.is(prev, next)) return;
274
+ wrote = true;
275
+ setAtPathMutating(draft, fieldPath, next);
276
+ if (replayEvent) {
277
+ recordReplayEvent(bound, replayEvent);
278
+ }
279
+ recordTraitPatch(bound, {
280
+ path: fieldPath,
281
+ from: prev,
282
+ to: next,
283
+ reason,
284
+ stepId,
285
+ traitNodeId
286
+ });
287
+ });
288
+ return wrote;
289
+ });
290
+ var syncIdleInTransaction = (program, ctx) => Effect.sync(() => {
291
+ const draft = ctx.getDraft();
292
+ const updates = [];
293
+ for (const entry of program.entries) {
294
+ if (entry.kind !== "source") continue;
295
+ const fieldPath = entry.fieldPath;
296
+ const listItem = parseListItemFieldPath(fieldPath);
297
+ if (listItem) {
298
+ const listValue = getAtPath(draft, listItem.listPath);
299
+ const items = Array.isArray(listValue) ? listValue : [];
300
+ for (let index = 0; index < items.length; index++) {
301
+ const item = items[index];
302
+ let key2;
303
+ try {
304
+ key2 = entry.meta.key(item);
305
+ } catch {
306
+ continue;
307
+ }
308
+ if (key2 !== void 0) continue;
309
+ const concretePath = toListItemValuePath(
310
+ listItem.listPath,
311
+ index,
312
+ listItem.itemPath
313
+ );
314
+ const prev2 = getAtPath(draft, concretePath);
315
+ const prevStatus2 = prev2 && typeof prev2 === "object" ? prev2.status : void 0;
316
+ if (prevStatus2 === "idle") {
317
+ const data = prev2?.data;
318
+ const error = prev2?.error;
319
+ if (data === void 0 && error === void 0) {
320
+ continue;
321
+ }
322
+ }
323
+ updates.push({ fieldPath: concretePath, prev: prev2 });
324
+ }
325
+ continue;
326
+ }
327
+ let key;
328
+ try {
329
+ key = entry.meta.key(draft);
330
+ } catch {
331
+ continue;
332
+ }
333
+ if (key !== void 0) continue;
334
+ const prev = getAtPath(draft, fieldPath);
335
+ const prevStatus = prev && typeof prev === "object" ? prev.status : void 0;
336
+ if (prevStatus === "idle") {
337
+ const data = prev?.data;
338
+ const error = prev?.error;
339
+ if (data === void 0 && error === void 0) {
340
+ continue;
341
+ }
342
+ }
343
+ updates.push({ fieldPath, prev });
344
+ }
345
+ if (updates.length === 0) return;
346
+ const reason = "source:idle";
347
+ const nextDraft = create(draft, (next) => {
348
+ for (const u of updates) {
349
+ setAtPathMutating(next, u.fieldPath, Snapshot.idle());
350
+ }
351
+ });
352
+ ctx.setDraft(nextDraft);
353
+ for (const u of updates) {
354
+ ctx.recordPatch(
355
+ makePatch(
356
+ u.fieldPath,
357
+ u.prev,
358
+ Snapshot.idle(),
359
+ reason,
360
+ `source:${u.fieldPath}:idle`
361
+ )
362
+ );
363
+ }
364
+ });
365
+ var installSourceRefresh = (bound, step, entry) => {
366
+ if (!step.targetFieldPath) return Effect.void;
367
+ const fieldPath = step.targetFieldPath;
368
+ const resourceId = step.resourceId ?? entry.meta.resource;
369
+ const listItem = parseListItemFieldPath(fieldPath);
370
+ let internals;
371
+ try {
372
+ internals = getBoundInternals(bound);
373
+ } catch {
374
+ return Effect.void;
375
+ }
376
+ const register = internals.traits.registerSourceRefresh;
377
+ const recordSnapshot = (replayMode, replayLog, input) => {
378
+ if (!replayLog) return Effect.void;
379
+ if (replayMode !== "live") return Effect.void;
380
+ const event = input && typeof input === "object" && input._tag === "ResourceSnapshot" ? input : {
381
+ _tag: "ResourceSnapshot",
382
+ resourceId,
383
+ fieldPath: input.fieldPath,
384
+ keyHash: input.keyHash,
385
+ phase: input.phase,
386
+ snapshot: input.snapshot,
387
+ timestamp: Date.now(),
388
+ moduleId: input.moduleId,
389
+ instanceId: input.instanceId
390
+ };
391
+ return replayLog.record(event);
392
+ };
393
+ if (listItem) {
394
+ const store = internals.traits.rowIdStore;
395
+ if (!store) {
396
+ return Effect.void;
397
+ }
398
+ const listPath = listItem.listPath;
399
+ const itemPath = listItem.itemPath;
400
+ if (!itemPath) {
401
+ return Effect.void;
402
+ }
403
+ const concurrency2 = entry.meta.concurrency;
404
+ const mode2 = concurrency2 ?? "switch";
405
+ const inFlight2 = /* @__PURE__ */ new Map();
406
+ const trailing2 = /* @__PURE__ */ new Map();
407
+ let gen2 = 0;
408
+ store.onRemoved(listPath, (rowId) => {
409
+ trailing2.delete(rowId);
410
+ inFlight2.delete(rowId);
411
+ });
412
+ const setSnapshotForRowInTxn = (rowId, next, reason, stepId) => Effect.gen(function* () {
413
+ let wrotePath;
414
+ yield* bound.state.mutate((draft) => {
415
+ const index = store.getIndex(listPath, rowId);
416
+ if (index === void 0) return;
417
+ const concretePath = toListItemValuePath(listPath, index, itemPath);
418
+ const prev = getAtPath(draft, concretePath);
419
+ if (Object.is(prev, next)) return;
420
+ wrotePath = concretePath;
421
+ setAtPathMutating(draft, concretePath, next);
422
+ recordTraitPatch(bound, {
423
+ path: concretePath,
424
+ from: prev,
425
+ to: next,
426
+ reason,
427
+ stepId,
428
+ traitNodeId: step.debugInfo?.graphNodeId
429
+ });
430
+ });
431
+ return wrotePath;
432
+ });
433
+ const writebackIfCurrentKeyHashForRow = (rowId, keyHash2, next, reason, stepId, phase) => Effect.gen(function* () {
434
+ let wrotePath;
435
+ yield* bound.state.mutate((draft) => {
436
+ const index = store.getIndex(listPath, rowId);
437
+ if (index === void 0) return;
438
+ const concretePath = toListItemValuePath(listPath, index, itemPath);
439
+ const current = getAtPath(draft, concretePath);
440
+ const currentKeyHash = current && typeof current === "object" ? current.keyHash : void 0;
441
+ if (currentKeyHash !== keyHash2) return;
442
+ const prev = current;
443
+ if (Object.is(prev, next)) return;
444
+ wrotePath = concretePath;
445
+ setAtPathMutating(draft, concretePath, next);
446
+ if (phase) {
447
+ const { moduleId, instanceId } = getBoundScope(bound);
448
+ recordReplayEvent(bound, {
449
+ _tag: "ResourceSnapshot",
450
+ resourceId,
451
+ fieldPath: concretePath,
452
+ keyHash: keyHash2,
453
+ phase,
454
+ snapshot: next,
455
+ timestamp: Date.now(),
456
+ moduleId,
457
+ instanceId
458
+ });
459
+ }
460
+ recordTraitPatch(bound, {
461
+ path: concretePath,
462
+ from: prev,
463
+ to: next,
464
+ reason,
465
+ stepId,
466
+ traitNodeId: step.debugInfo?.graphNodeId
467
+ });
468
+ });
469
+ return wrotePath;
470
+ });
471
+ const startFetch2 = (rowId, key, keyHash2, replayMode, replayLog) => Effect.gen(function* () {
472
+ const { moduleId, instanceId } = getBoundScope(bound);
473
+ const indexForLog = store.getIndex(listPath, rowId);
474
+ const logFieldPath = indexForLog === void 0 ? void 0 : toListItemValuePath(listPath, indexForLog, itemPath);
475
+ let loadingSnapshot = Snapshot.loading({ keyHash: keyHash2 });
476
+ if (replayMode === "replay" && replayLog && logFieldPath) {
477
+ const replayLoading = yield* replayLog.consumeNextResourceSnapshot({
478
+ resourceId,
479
+ fieldPath: logFieldPath,
480
+ keyHash: keyHash2,
481
+ phase: "loading"
482
+ });
483
+ if (replayLoading) {
484
+ loadingSnapshot = replayLoading.snapshot;
485
+ }
486
+ }
487
+ const wroteLoadingPath = yield* setSnapshotForRowInTxn(
488
+ rowId,
489
+ loadingSnapshot,
490
+ "source:loading",
491
+ `source:${fieldPath}:${rowId}:loading`
492
+ );
493
+ if (wroteLoadingPath) {
494
+ const event = {
495
+ _tag: "ResourceSnapshot",
496
+ resourceId,
497
+ fieldPath: wroteLoadingPath,
498
+ keyHash: keyHash2,
499
+ phase: "loading",
500
+ snapshot: loadingSnapshot,
501
+ timestamp: Date.now(),
502
+ moduleId,
503
+ instanceId
504
+ };
505
+ recordReplayEvent(bound, event);
506
+ yield* recordSnapshot(replayMode, replayLog, event);
507
+ }
508
+ const io = Effect.gen(function* () {
509
+ if (replayMode === "replay" && replayLog) {
510
+ yield* Effect.yieldNow();
511
+ const consumePath = wroteLoadingPath ?? logFieldPath;
512
+ if (!consumePath) return yield* Effect.void;
513
+ const replayed = yield* replayLog.consumeNextResourceSnapshot({
514
+ resourceId,
515
+ fieldPath: consumePath,
516
+ keyHash: keyHash2
517
+ });
518
+ if (!replayed) return yield* Effect.void;
519
+ if (replayed.phase === "success") {
520
+ yield* writebackIfCurrentKeyHashForRow(
521
+ rowId,
522
+ keyHash2,
523
+ replayed.snapshot,
524
+ "source:success",
525
+ `source:${fieldPath}:${rowId}:success`,
526
+ "success"
527
+ );
528
+ } else if (replayed.phase === "error") {
529
+ yield* writebackIfCurrentKeyHashForRow(
530
+ rowId,
531
+ keyHash2,
532
+ replayed.snapshot,
533
+ "source:error",
534
+ `source:${fieldPath}:${rowId}:error`,
535
+ "error"
536
+ );
537
+ }
538
+ return yield* Effect.void;
539
+ }
540
+ const stack = yield* getMiddlewareStack();
541
+ const registryOpt = yield* Effect.serviceOption(internal.ResourceRegistryTag);
542
+ const registry = Option.isSome(registryOpt) ? registryOpt.value : void 0;
543
+ const spec = registry?.specs.get(resourceId);
544
+ if (!spec) {
545
+ return yield* Effect.void;
546
+ }
547
+ const loadEffect = spec.load(key);
548
+ const meta = {
549
+ moduleId,
550
+ instanceId,
551
+ fieldPath,
552
+ resourceId,
553
+ key,
554
+ keyHash: keyHash2,
555
+ rowId,
556
+ traitNodeId: step.debugInfo?.graphNodeId,
557
+ stepId: step.id
558
+ };
559
+ if (!(typeof meta.opSeq === "number" && Number.isFinite(meta.opSeq))) {
560
+ const sessionOpt = yield* Effect.serviceOption(RunSessionTag);
561
+ if (Option.isSome(sessionOpt)) {
562
+ const seqKey = instanceId ?? "global";
563
+ meta.opSeq = sessionOpt.value.local.nextSeq("opSeq", seqKey);
564
+ }
565
+ }
566
+ const op = make({
567
+ kind: "service",
568
+ name: resourceId,
569
+ effect: loadEffect,
570
+ meta
571
+ });
572
+ const exit = yield* Effect.exit(run(op, stack));
573
+ if (exit._tag === "Success") {
574
+ const successSnapshot = Snapshot.success({ keyHash: keyHash2, data: exit.value });
575
+ const wroteSuccessPath = yield* writebackIfCurrentKeyHashForRow(
576
+ rowId,
577
+ keyHash2,
578
+ successSnapshot,
579
+ "source:success",
580
+ `source:${fieldPath}:${rowId}:success`,
581
+ "success"
582
+ );
583
+ if (wroteSuccessPath) {
584
+ yield* recordSnapshot(replayMode, replayLog, {
585
+ _tag: "ResourceSnapshot",
586
+ resourceId,
587
+ fieldPath: wroteSuccessPath,
588
+ keyHash: keyHash2,
589
+ phase: "success",
590
+ snapshot: successSnapshot,
591
+ timestamp: Date.now(),
592
+ moduleId,
593
+ instanceId
594
+ });
595
+ }
596
+ } else {
597
+ const errorSnapshot = Snapshot.error({ keyHash: keyHash2, error: exit.cause });
598
+ const wroteErrorPath = yield* writebackIfCurrentKeyHashForRow(
599
+ rowId,
600
+ keyHash2,
601
+ errorSnapshot,
602
+ "source:error",
603
+ `source:${fieldPath}:${rowId}:error`,
604
+ "error"
605
+ );
606
+ if (wroteErrorPath) {
607
+ yield* recordSnapshot(replayMode, replayLog, {
608
+ _tag: "ResourceSnapshot",
609
+ resourceId,
610
+ fieldPath: wroteErrorPath,
611
+ keyHash: keyHash2,
612
+ phase: "error",
613
+ snapshot: errorSnapshot,
614
+ timestamp: Date.now(),
615
+ moduleId,
616
+ instanceId
617
+ });
618
+ }
619
+ }
620
+ }).pipe(Effect.catchAllCause(() => Effect.void));
621
+ const fiber = yield* Effect.forkScoped(
622
+ Effect.locally(inSyncTransactionFiber, false)(io)
623
+ );
624
+ const myGen = gen2 += 1;
625
+ inFlight2.set(rowId, { gen: myGen, fiber, keyHash: keyHash2 });
626
+ yield* Effect.forkScoped(
627
+ Effect.locally(inSyncTransactionFiber, false)(
628
+ Fiber.await(fiber)
629
+ ).pipe(
630
+ Effect.zipRight(
631
+ Effect.sync(() => {
632
+ const current = inFlight2.get(rowId);
633
+ if (current && current.gen === myGen) {
634
+ inFlight2.delete(rowId);
635
+ }
636
+ })
637
+ ),
638
+ Effect.zipRight(
639
+ mode2 === "exhaust-trailing" && trailing2.has(rowId) ? Effect.gen(function* () {
640
+ const next = trailing2.get(rowId);
641
+ trailing2.delete(rowId);
642
+ if (next) {
643
+ yield* startFetch2(
644
+ rowId,
645
+ next.key,
646
+ next.keyHash,
647
+ replayMode,
648
+ replayLog
649
+ );
650
+ }
651
+ }) : Effect.void
652
+ ),
653
+ Effect.catchAllCause(() => Effect.void)
654
+ )
655
+ );
656
+ });
657
+ register(
658
+ fieldPath,
659
+ (state) => Effect.gen(function* () {
660
+ const { moduleId, instanceId } = getBoundScope(bound);
661
+ const replayModeOpt = yield* Effect.serviceOption(ReplayModeConfigTag);
662
+ const replayMode = Option.isSome(replayModeOpt) ? replayModeOpt.value.mode : "live";
663
+ const replayLogOpt = yield* Effect.serviceOption(ReplayLog);
664
+ const replayLog = Option.isSome(replayLogOpt) ? replayLogOpt.value : void 0;
665
+ const listValue = getAtPath(state, listPath);
666
+ const items = Array.isArray(listValue) ? listValue : [];
667
+ const ids = store.ensureList(listPath, items);
668
+ const traceKey = `${instanceId ?? "unknown"}::source::${fieldPath}`;
669
+ if (isDevEnv() && (yield* onceInRunSession(`deps_trace_settled:${traceKey}`))) {
670
+ try {
671
+ const sample = items[0];
672
+ if (sample !== void 0) {
673
+ const traced = trace((s) => entry.meta.key(s), sample);
674
+ const prefixedReads = traced.reads.map(
675
+ (r) => r ? `${listPath}[].${r}` : `${listPath}[]`
676
+ );
677
+ const diff = diffDeps(
678
+ entry.meta.deps ?? [],
679
+ prefixedReads
680
+ );
681
+ if (diff) {
682
+ yield* emitDepsMismatch({
683
+ moduleId,
684
+ instanceId,
685
+ kind: "source",
686
+ fieldPath,
687
+ diff
688
+ });
689
+ }
690
+ }
691
+ } catch {
692
+ }
693
+ }
694
+ for (let index = 0; index < items.length; index++) {
695
+ const rowId = ids[index];
696
+ if (!rowId) continue;
697
+ const concretePath = toListItemValuePath(listPath, index, itemPath);
698
+ const prevSnapshot = getAtPath(state, concretePath);
699
+ let key;
700
+ try {
701
+ key = entry.meta.key(items[index]);
702
+ } catch {
703
+ key = void 0;
704
+ }
705
+ const current = inFlight2.get(rowId);
706
+ if (key === void 0) {
707
+ trailing2.delete(rowId);
708
+ inFlight2.delete(rowId);
709
+ if (prevSnapshot && typeof prevSnapshot === "object" && prevSnapshot.status === "idle" && prevSnapshot.data === void 0 && prevSnapshot.error === void 0) {
710
+ continue;
711
+ }
712
+ const idleSnapshot = Snapshot.idle();
713
+ const wroteIdlePath = yield* setSnapshotForRowInTxn(
714
+ rowId,
715
+ idleSnapshot,
716
+ "source:idle",
717
+ `source:${fieldPath}:${rowId}:idle`
718
+ );
719
+ if (wroteIdlePath) {
720
+ const event = {
721
+ _tag: "ResourceSnapshot",
722
+ resourceId,
723
+ fieldPath: wroteIdlePath,
724
+ keyHash: void 0,
725
+ phase: "idle",
726
+ snapshot: idleSnapshot,
727
+ timestamp: Date.now(),
728
+ moduleId,
729
+ instanceId
730
+ };
731
+ recordReplayEvent(bound, event);
732
+ yield* recordSnapshot(replayMode, replayLog, event);
733
+ }
734
+ continue;
735
+ }
736
+ const h = keyHash(key);
737
+ if (current && current.keyHash === h) {
738
+ continue;
739
+ }
740
+ const prevKeyHash = prevSnapshot && typeof prevSnapshot === "object" ? prevSnapshot.keyHash : void 0;
741
+ if (!current && prevKeyHash === h) {
742
+ continue;
743
+ }
744
+ if (mode2 === "exhaust-trailing" && current) {
745
+ trailing2.set(rowId, { key, keyHash: h });
746
+ const loadingSnapshot = Snapshot.loading({ keyHash: h });
747
+ const wroteLoadingPath = yield* setSnapshotForRowInTxn(
748
+ rowId,
749
+ loadingSnapshot,
750
+ "source:loading",
751
+ `source:${fieldPath}:${rowId}:loading`
752
+ );
753
+ if (wroteLoadingPath) {
754
+ const event = {
755
+ _tag: "ResourceSnapshot",
756
+ resourceId,
757
+ fieldPath: wroteLoadingPath,
758
+ keyHash: h,
759
+ phase: "loading",
760
+ snapshot: loadingSnapshot,
761
+ timestamp: Date.now(),
762
+ moduleId,
763
+ instanceId
764
+ };
765
+ recordReplayEvent(bound, event);
766
+ yield* recordSnapshot(replayMode, replayLog, event);
767
+ }
768
+ continue;
769
+ }
770
+ if (mode2 === "switch" && current) {
771
+ trailing2.delete(rowId);
772
+ inFlight2.delete(rowId);
773
+ }
774
+ yield* startFetch2(rowId, key, h, replayMode, replayLog);
775
+ }
776
+ })
777
+ );
778
+ return Effect.void;
779
+ }
780
+ let inFlight;
781
+ let gen = 0;
782
+ let trailing;
783
+ const concurrency = entry.meta.concurrency;
784
+ const mode = concurrency ?? "switch";
785
+ const startFetch = (key, keyHash2, replayMode, replayLog) => Effect.gen(function* () {
786
+ const { moduleId, instanceId } = getBoundScope(bound);
787
+ let loadingSnapshot = Snapshot.loading({ keyHash: keyHash2 });
788
+ if (replayMode === "replay" && replayLog) {
789
+ const replayLoading = yield* replayLog.consumeNextResourceSnapshot({
790
+ resourceId,
791
+ fieldPath,
792
+ keyHash: keyHash2,
793
+ phase: "loading"
794
+ });
795
+ if (replayLoading) {
796
+ loadingSnapshot = replayLoading.snapshot;
797
+ }
798
+ }
799
+ const wroteLoading = yield* setSnapshotInTxn(
800
+ bound,
801
+ fieldPath,
802
+ loadingSnapshot,
803
+ "source:loading",
804
+ `source:${fieldPath}:loading`,
805
+ step.debugInfo?.graphNodeId
806
+ );
807
+ if (wroteLoading) {
808
+ const event = {
809
+ _tag: "ResourceSnapshot",
810
+ resourceId,
811
+ fieldPath,
812
+ keyHash: keyHash2,
813
+ phase: "loading",
814
+ snapshot: loadingSnapshot,
815
+ timestamp: Date.now(),
816
+ moduleId,
817
+ instanceId
818
+ };
819
+ recordReplayEvent(bound, event);
820
+ yield* recordSnapshot(replayMode, replayLog, event);
821
+ }
822
+ const io = Effect.gen(function* () {
823
+ if (replayMode === "replay" && replayLog) {
824
+ yield* Effect.yieldNow();
825
+ const replayed = yield* replayLog.consumeNextResourceSnapshot({
826
+ resourceId,
827
+ fieldPath,
828
+ keyHash: keyHash2
829
+ });
830
+ if (!replayed) return yield* Effect.void;
831
+ if (replayed.phase === "success") {
832
+ const event = {
833
+ _tag: "ResourceSnapshot",
834
+ resourceId,
835
+ fieldPath,
836
+ keyHash: keyHash2,
837
+ phase: "success",
838
+ snapshot: replayed.snapshot,
839
+ timestamp: Date.now(),
840
+ moduleId,
841
+ instanceId
842
+ };
843
+ yield* writebackIfCurrentKeyHash(
844
+ bound,
845
+ fieldPath,
846
+ keyHash2,
847
+ replayed.snapshot,
848
+ "source:success",
849
+ `source:${fieldPath}:success`,
850
+ step.debugInfo?.graphNodeId,
851
+ event
852
+ );
853
+ } else if (replayed.phase === "error") {
854
+ const event = {
855
+ _tag: "ResourceSnapshot",
856
+ resourceId,
857
+ fieldPath,
858
+ keyHash: keyHash2,
859
+ phase: "error",
860
+ snapshot: replayed.snapshot,
861
+ timestamp: Date.now(),
862
+ moduleId,
863
+ instanceId
864
+ };
865
+ yield* writebackIfCurrentKeyHash(
866
+ bound,
867
+ fieldPath,
868
+ keyHash2,
869
+ replayed.snapshot,
870
+ "source:error",
871
+ `source:${fieldPath}:error`,
872
+ step.debugInfo?.graphNodeId,
873
+ event
874
+ );
875
+ }
876
+ return yield* Effect.void;
877
+ }
878
+ const stack = yield* getMiddlewareStack();
879
+ const registryOpt = yield* Effect.serviceOption(
880
+ internal.ResourceRegistryTag
881
+ );
882
+ const registry = Option.isSome(registryOpt) ? registryOpt.value : void 0;
883
+ const spec = registry?.specs.get(resourceId);
884
+ if (!spec) {
885
+ return yield* Effect.void;
886
+ }
887
+ const loadEffect = spec.load(key);
888
+ const meta = {
889
+ moduleId,
890
+ instanceId,
891
+ fieldPath,
892
+ resourceId,
893
+ key,
894
+ keyHash: keyHash2,
895
+ traitNodeId: step.debugInfo?.graphNodeId,
896
+ stepId: step.id
897
+ };
898
+ if (!(typeof meta.opSeq === "number" && Number.isFinite(meta.opSeq))) {
899
+ const sessionOpt = yield* Effect.serviceOption(RunSessionTag);
900
+ if (Option.isSome(sessionOpt)) {
901
+ const seqKey = instanceId ?? "global";
902
+ meta.opSeq = sessionOpt.value.local.nextSeq("opSeq", seqKey);
903
+ }
904
+ }
905
+ const op = make({
906
+ kind: "trait-source",
907
+ name: resourceId,
908
+ effect: loadEffect,
909
+ meta
910
+ });
911
+ const exit = yield* Effect.exit(run(op, stack));
912
+ if (exit._tag === "Success") {
913
+ const successSnapshot = Snapshot.success({ keyHash: keyHash2, data: exit.value });
914
+ const event = {
915
+ _tag: "ResourceSnapshot",
916
+ resourceId,
917
+ fieldPath,
918
+ keyHash: keyHash2,
919
+ phase: "success",
920
+ snapshot: successSnapshot,
921
+ timestamp: Date.now(),
922
+ moduleId,
923
+ instanceId
924
+ };
925
+ const wroteSuccess = yield* writebackIfCurrentKeyHash(
926
+ bound,
927
+ fieldPath,
928
+ keyHash2,
929
+ successSnapshot,
930
+ "source:success",
931
+ `source:${fieldPath}:success`,
932
+ step.debugInfo?.graphNodeId,
933
+ event
934
+ );
935
+ if (wroteSuccess) {
936
+ yield* recordSnapshot(replayMode, replayLog, event);
937
+ }
938
+ } else {
939
+ const errorSnapshot = Snapshot.error({ keyHash: keyHash2, error: exit.cause });
940
+ const event = {
941
+ _tag: "ResourceSnapshot",
942
+ resourceId,
943
+ fieldPath,
944
+ keyHash: keyHash2,
945
+ phase: "error",
946
+ snapshot: errorSnapshot,
947
+ timestamp: Date.now(),
948
+ moduleId,
949
+ instanceId
950
+ };
951
+ const wroteError = yield* writebackIfCurrentKeyHash(
952
+ bound,
953
+ fieldPath,
954
+ keyHash2,
955
+ errorSnapshot,
956
+ "source:error",
957
+ `source:${fieldPath}:error`,
958
+ step.debugInfo?.graphNodeId,
959
+ event
960
+ );
961
+ if (wroteError) {
962
+ yield* recordSnapshot(replayMode, replayLog, event);
963
+ }
964
+ }
965
+ }).pipe(
966
+ Effect.catchAllCause(() => Effect.void)
967
+ );
968
+ const fiber = yield* Effect.forkScoped(
969
+ Effect.locally(inSyncTransactionFiber, false)(io)
970
+ );
971
+ const myGen = gen += 1;
972
+ inFlight = { gen: myGen, fiber, keyHash: keyHash2 };
973
+ yield* Effect.forkScoped(
974
+ Effect.locally(inSyncTransactionFiber, false)(
975
+ Fiber.await(fiber)
976
+ ).pipe(
977
+ Effect.zipRight(
978
+ Effect.sync(() => {
979
+ if (inFlight && inFlight.gen === myGen) {
980
+ inFlight = void 0;
981
+ }
982
+ })
983
+ ),
984
+ Effect.zipRight(
985
+ mode === "exhaust-trailing" && trailing ? Effect.gen(function* () {
986
+ const next = trailing;
987
+ trailing = void 0;
988
+ if (next) {
989
+ yield* startFetch(
990
+ next.key,
991
+ next.keyHash,
992
+ replayMode,
993
+ replayLog
994
+ );
995
+ }
996
+ }) : Effect.void
997
+ ),
998
+ Effect.catchAllCause(() => Effect.void)
999
+ )
1000
+ );
1001
+ });
1002
+ register(
1003
+ fieldPath,
1004
+ (state) => Effect.gen(function* () {
1005
+ const { moduleId, instanceId } = getBoundScope(bound);
1006
+ const replayModeOpt = yield* Effect.serviceOption(ReplayModeConfigTag);
1007
+ const replayMode = Option.isSome(replayModeOpt) ? replayModeOpt.value.mode : "live";
1008
+ const replayLogOpt = yield* Effect.serviceOption(ReplayLog);
1009
+ const replayLog = Option.isSome(replayLogOpt) ? replayLogOpt.value : void 0;
1010
+ let key;
1011
+ try {
1012
+ key = entry.meta.key(state);
1013
+ } catch {
1014
+ key = void 0;
1015
+ }
1016
+ const traceKey = `${instanceId ?? "unknown"}::source::${fieldPath}`;
1017
+ if (isDevEnv() && (yield* onceInRunSession(`deps_trace_settled:${traceKey}`))) {
1018
+ try {
1019
+ const traced = trace((s) => entry.meta.key(s), state);
1020
+ const diff = diffDeps(
1021
+ entry.meta.deps ?? [],
1022
+ traced.reads
1023
+ );
1024
+ if (diff) {
1025
+ yield* emitDepsMismatch({
1026
+ moduleId,
1027
+ instanceId,
1028
+ kind: "source",
1029
+ fieldPath,
1030
+ diff
1031
+ });
1032
+ }
1033
+ } catch {
1034
+ }
1035
+ }
1036
+ if (key === void 0) {
1037
+ if (inFlight) {
1038
+ yield* Fiber.interruptFork(inFlight.fiber);
1039
+ inFlight = void 0;
1040
+ }
1041
+ trailing = void 0;
1042
+ const idleSnapshot = Snapshot.idle();
1043
+ const wroteIdle = yield* setSnapshotInTxn(
1044
+ bound,
1045
+ fieldPath,
1046
+ idleSnapshot,
1047
+ "source:idle",
1048
+ `source:${fieldPath}:idle`,
1049
+ step.debugInfo?.graphNodeId
1050
+ );
1051
+ if (wroteIdle) {
1052
+ const event = {
1053
+ _tag: "ResourceSnapshot",
1054
+ resourceId,
1055
+ fieldPath,
1056
+ keyHash: void 0,
1057
+ phase: "idle",
1058
+ snapshot: idleSnapshot,
1059
+ timestamp: Date.now(),
1060
+ moduleId,
1061
+ instanceId
1062
+ };
1063
+ recordReplayEvent(bound, event);
1064
+ yield* recordSnapshot(replayMode, replayLog, event);
1065
+ }
1066
+ return;
1067
+ }
1068
+ const h = keyHash(key);
1069
+ if (mode === "exhaust-trailing" && inFlight) {
1070
+ trailing = { key, keyHash: h };
1071
+ const loadingSnapshot = Snapshot.loading({ keyHash: h });
1072
+ const wroteLoading = yield* setSnapshotInTxn(
1073
+ bound,
1074
+ fieldPath,
1075
+ loadingSnapshot,
1076
+ "source:loading",
1077
+ `source:${fieldPath}:loading`,
1078
+ step.debugInfo?.graphNodeId
1079
+ );
1080
+ if (wroteLoading) {
1081
+ const event = {
1082
+ _tag: "ResourceSnapshot",
1083
+ resourceId,
1084
+ fieldPath,
1085
+ keyHash: h,
1086
+ phase: "loading",
1087
+ snapshot: loadingSnapshot,
1088
+ timestamp: Date.now(),
1089
+ moduleId,
1090
+ instanceId
1091
+ };
1092
+ recordReplayEvent(bound, event);
1093
+ yield* recordSnapshot(replayMode, replayLog, event);
1094
+ }
1095
+ return;
1096
+ }
1097
+ if (mode === "switch" && inFlight) {
1098
+ yield* Fiber.interruptFork(inFlight.fiber);
1099
+ inFlight = void 0;
1100
+ trailing = void 0;
1101
+ }
1102
+ yield* startFetch(key, h, replayMode, replayLog);
1103
+ })
1104
+ );
1105
+ return Effect.void;
1106
+ };
1107
+
1108
+ export {
1109
+ diffDeps,
1110
+ trace,
1111
+ syncIdleInTransaction,
1112
+ installSourceRefresh
1113
+ };
1114
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvc3RhdGUtdHJhaXQvc291cmNlLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3N0YXRlLXRyYWl0L2RlcHMtdHJhY2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IEVmZmVjdCwgRmliZXIsIE9wdGlvbiB9IGZyb20gXCJlZmZlY3RcIlxuaW1wb3J0IHsgY3JlYXRlIH0gZnJvbSBcIm11dGF0aXZlXCJcbmltcG9ydCAqIGFzIEVmZmVjdE9wIGZyb20gXCIuLi8uLi9lZmZlY3RvcC5qc1wiXG5pbXBvcnQgeyBTbmFwc2hvdCwgaW50ZXJuYWwgYXMgUmVzb3VyY2VJbnRlcm5hbCwga2V5SGFzaCBhcyBoYXNoS2V5IH0gZnJvbSBcIi4uLy4uL1Jlc291cmNlLmpzXCJcbmltcG9ydCAqIGFzIEVmZmVjdE9wQ29yZSBmcm9tIFwiLi4vcnVudGltZS9FZmZlY3RPcENvcmUuanNcIlxuaW1wb3J0ICogYXMgRGVidWcgZnJvbSBcIi4uL3J1bnRpbWUvY29yZS9EZWJ1Z1NpbmsuanNcIlxuaW1wb3J0ICogYXMgVGFza1J1bm5lciBmcm9tIFwiLi4vcnVudGltZS9jb3JlL1Rhc2tSdW5uZXIuanNcIlxuaW1wb3J0IHsgaXNEZXZFbnYsIFJlcGxheU1vZGVDb25maWdUYWcgfSBmcm9tIFwiLi4vcnVudGltZS9jb3JlL2Vudi5qc1wiXG5pbXBvcnQgKiBhcyBSZXBsYXlMb2cgZnJvbSBcIi4uL3J1bnRpbWUvY29yZS9SZXBsYXlMb2cuanNcIlxuaW1wb3J0IHR5cGUgeyBQYXRjaFJlYXNvbiwgU3RhdGVQYXRjaCB9IGZyb20gXCIuLi9ydW50aW1lL2NvcmUvU3RhdGVUcmFuc2FjdGlvbi5qc1wiXG5pbXBvcnQgdHlwZSB7IEJvdW5kQXBpIH0gZnJvbSBcIi4uL3J1bnRpbWUvY29yZS9tb2R1bGUuanNcIlxuaW1wb3J0IHsgZ2V0Qm91bmRJbnRlcm5hbHMgfSBmcm9tIFwiLi4vcnVudGltZS9jb3JlL3J1bnRpbWVJbnRlcm5hbHNBY2Nlc3Nvci5qc1wiXG5pbXBvcnQgeyBSdW5TZXNzaW9uVGFnIH0gZnJvbSBcIi4uL29ic2VydmFiaWxpdHkvcnVuU2Vzc2lvbi5qc1wiXG5pbXBvcnQgKiBhcyBEZXBzVHJhY2UgZnJvbSBcIi4vZGVwcy10cmFjZS5qc1wiXG5pbXBvcnQgKiBhcyBSb3dJZCBmcm9tIFwiLi9yb3dpZC5qc1wiXG5pbXBvcnQgdHlwZSB7XG4gIFN0YXRlVHJhaXRFbnRyeSxcbiAgU3RhdGVUcmFpdFBsYW5TdGVwLFxuICBTdGF0ZVRyYWl0UHJvZ3JhbSxcbn0gZnJvbSBcIi4vbW9kZWwuanNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZVN5bmNDb250ZXh0PFM+IHtcbiAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICByZWFkb25seSBnZXREcmFmdDogKCkgPT4gU1xuICByZWFkb25seSBzZXREcmFmdDogKG5leHQ6IFMpID0+IHZvaWRcbiAgcmVhZG9ubHkgcmVjb3JkUGF0Y2g6IChwYXRjaDogU3RhdGVQYXRjaCkgPT4gdm9pZFxufVxuXG5jb25zdCBtYWtlUGF0Y2ggPSAoXG4gIHBhdGg6IHN0cmluZyxcbiAgZnJvbTogdW5rbm93bixcbiAgdG86IHVua25vd24sXG4gIHJlYXNvbjogUGF0Y2hSZWFzb24sXG4gIHN0ZXBJZDogc3RyaW5nLFxuKTogU3RhdGVQYXRjaCA9PiAoe1xuICBwYXRoLFxuICBmcm9tLFxuICB0byxcbiAgcmVhc29uLFxuICBzdGVwSWQsXG59KVxuXG5jb25zdCBvbmNlSW5SdW5TZXNzaW9uID0gKGtleTogc3RyaW5nKTogRWZmZWN0LkVmZmVjdDxib29sZWFuLCBuZXZlciwgYW55PiA9PlxuICBFZmZlY3Quc2VydmljZU9wdGlvbihSdW5TZXNzaW9uVGFnKS5waXBlKFxuICAgIEVmZmVjdC5tYXAoKG1heWJlKSA9PlxuICAgICAgT3B0aW9uLmlzU29tZShtYXliZSkgPyBtYXliZS52YWx1ZS5sb2NhbC5vbmNlKGtleSkgOiB0cnVlLFxuICAgICksXG4gIClcblxuY29uc3QgZm9ybWF0TGlzdCA9IChpdGVtczogUmVhZG9ubHlBcnJheTxzdHJpbmc+LCBsaW1pdCA9IDEwKTogc3RyaW5nID0+IHtcbiAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCJcbiAgaWYgKGl0ZW1zLmxlbmd0aCA8PSBsaW1pdCkgcmV0dXJuIGl0ZW1zLmpvaW4oXCIsIFwiKVxuICByZXR1cm4gYCR7aXRlbXMuc2xpY2UoMCwgbGltaXQpLmpvaW4oXCIsIFwiKX0sIFx1MjAyNigrJHtpdGVtcy5sZW5ndGggLSBsaW1pdH0pYFxufVxuXG5jb25zdCBlbWl0RGVwc01pc21hdGNoID0gKFxuICBwYXJhbXM6IHtcbiAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICByZWFkb25seSBraW5kOiBcImNvbXB1dGVkXCIgfCBcInNvdXJjZVwiXG4gICAgcmVhZG9ubHkgZmllbGRQYXRoOiBzdHJpbmdcbiAgICByZWFkb25seSBkaWZmOiBEZXBzVHJhY2UuRGVwc0RpZmZcbiAgfSxcbik6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IGtleSA9IGAke3BhcmFtcy5pbnN0YW5jZUlkID8/IFwidW5rbm93blwifTo6JHtwYXJhbXMua2luZH06OiR7cGFyYW1zLmZpZWxkUGF0aH1gXG4gICAgY29uc3Qgc2hvdWxkRW1pdCA9IHlpZWxkKiBvbmNlSW5SdW5TZXNzaW9uKGBkZXBzX21pc21hdGNoOiR7a2V5fWApXG4gICAgaWYgKCFzaG91bGRFbWl0KSByZXR1cm5cblxuICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgdHlwZTogXCJkaWFnbm9zdGljXCIsXG4gICAgICBtb2R1bGVJZDogcGFyYW1zLm1vZHVsZUlkLFxuICAgICAgaW5zdGFuY2VJZDogcGFyYW1zLmluc3RhbmNlSWQsXG4gICAgICBjb2RlOiBcInN0YXRlX3RyYWl0OjpkZXBzX21pc21hdGNoXCIsXG4gICAgICBzZXZlcml0eTogXCJ3YXJuaW5nXCIsXG4gICAgICBtZXNzYWdlOlxuICAgICAgICBgW2RlcHNdICR7cGFyYW1zLmtpbmR9IFwiJHtwYXJhbXMuZmllbGRQYXRofVwiIGRlY2xhcmVkPVske2Zvcm1hdExpc3QocGFyYW1zLmRpZmYuZGVjbGFyZWQpfV0gYCArXG4gICAgICAgIGByZWFkcz1bJHtmb3JtYXRMaXN0KHBhcmFtcy5kaWZmLnJlYWRzKX1dIG1pc3Npbmc9WyR7Zm9ybWF0TGlzdChwYXJhbXMuZGlmZi5taXNzaW5nKX1dIGAgK1xuICAgICAgICBgdW51c2VkPVske2Zvcm1hdExpc3QocGFyYW1zLmRpZmYudW51c2VkKX1dYCxcbiAgICAgIGhpbnQ6XG4gICAgICAgIFwiZGVwcyBcdTY2MkZcdTU1MkZcdTRFMDBcdTRGOURcdThENTZcdTRFOEJcdTVCOUVcdTZFOTBcdUZGMUFcdTU0MEVcdTdFRURcdTU4OUVcdTkxQ0ZcdThDMDNcdTVFQTYvXHU1M0NEXHU1NDExXHU5NUVEXHU1MzA1L1x1NjAyN1x1ODBGRFx1NEYxOFx1NTMxNlx1OTBGRFx1NTNFQVx1OEJBNCBkZXBzXHUzMDAyXHU4QkY3XHU1QzA2IGRlcHMgXHU0RTBFXHU1QjlFXHU5NjQ1XHU4QkZCXHU1M0Q2XHU0RkREXHU2MzAxXHU0RTAwXHU4MUY0XHVGRjFCXCIgK1xuICAgICAgICBcIlx1ODJFNVx1Nzg2RVx1NUI5RVx1NEY5RFx1OEQ1Nlx1NjU3NFx1NjhGNVx1NUJGOVx1OEM2MVx1RkYwQ1x1NTNFRlx1NThGMFx1NjYwRVx1NjZGNFx1N0M5N1x1N0M5Mlx1NUVBNlx1NzY4NCBkZXBzXHVGRjA4XHU0RjhCXHU1OTgyIFxcXCJwcm9maWxlXFxcIlx1RkYwOVx1NEVFNVx1ODk4Nlx1NzZENlx1NUI1MFx1NUI1N1x1NkJCNVx1OEJGQlx1NTNENlx1MzAwMlwiLFxuICAgICAga2luZDogYGRlcHNfbWlzbWF0Y2g6JHtwYXJhbXMua2luZH1gLFxuICAgIH0pXG4gIH0pXG5cbmNvbnN0IGdldE1pZGRsZXdhcmVTdGFjayA9ICgpOiBFZmZlY3QuRWZmZWN0PFxuICBFZmZlY3RPcC5NaWRkbGV3YXJlU3RhY2ssXG4gIG5ldmVyLFxuICBhbnlcbj4gPT5cbiAgRWZmZWN0LnNlcnZpY2VPcHRpb24oRWZmZWN0T3BDb3JlLkVmZmVjdE9wTWlkZGxld2FyZVRhZykucGlwZShcbiAgICBFZmZlY3QubWFwKChtYXliZSkgPT5cbiAgICAgIE9wdGlvbi5pc1NvbWUobWF5YmUpID8gbWF5YmUudmFsdWUuc3RhY2sgOiBbXSxcbiAgICApLFxuICApXG5cbmNvbnN0IHJlY29yZFRyYWl0UGF0Y2ggPSAoXG4gIGJvdW5kOiBCb3VuZEFwaTxhbnksIGFueT4sXG4gIHBhdGNoOiB7XG4gICAgcmVhZG9ubHkgcGF0aDogc3RyaW5nXG4gICAgcmVhZG9ubHkgZnJvbT86IHVua25vd25cbiAgICByZWFkb25seSB0bz86IHVua25vd25cbiAgICByZWFkb25seSByZWFzb246IFBhdGNoUmVhc29uXG4gICAgcmVhZG9ubHkgdHJhaXROb2RlSWQ/OiBzdHJpbmdcbiAgICByZWFkb25seSBzdGVwSWQ/OiBzdHJpbmdcbiAgfSxcbik6IHZvaWQgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGludGVybmFscyA9IGdldEJvdW5kSW50ZXJuYWxzKGJvdW5kIGFzIGFueSlcbiAgICBpbnRlcm5hbHMudHhuLnJlY29yZFN0YXRlUGF0Y2gocGF0Y2ggYXMgYW55KVxuICB9IGNhdGNoIHtcbiAgICAvLyBuby1vcCBmb3IgbGVnYWN5L21vY2tlZCBib3VuZFxuICB9XG59XG5cbmNvbnN0IHJlY29yZFJlcGxheUV2ZW50ID0gKFxuICBib3VuZDogQm91bmRBcGk8YW55LCBhbnk+LFxuICBldmVudDogUmVwbGF5TG9nLlJlcGxheUxvZ0V2ZW50LFxuKTogdm9pZCA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgaW50ZXJuYWxzID0gZ2V0Qm91bmRJbnRlcm5hbHMoYm91bmQgYXMgYW55KVxuICAgIGludGVybmFscy50eG4ucmVjb3JkUmVwbGF5RXZlbnQoZXZlbnQpXG4gIH0gY2F0Y2gge1xuICAgIC8vIG5vLW9wIGZvciBsZWdhY3kvbW9ja2VkIGJvdW5kXG4gIH1cbn1cblxuY29uc3QgZ2V0Qm91bmRTY29wZSA9IChcbiAgYm91bmQ6IEJvdW5kQXBpPGFueSwgYW55Pixcbik6IHsgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmc7IHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmcgfSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgaW50ZXJuYWxzID0gZ2V0Qm91bmRJbnRlcm5hbHMoYm91bmQgYXMgYW55KVxuICAgIHJldHVybiB7IG1vZHVsZUlkOiBpbnRlcm5hbHMubW9kdWxlSWQsIGluc3RhbmNlSWQ6IGludGVybmFscy5pbnN0YW5jZUlkIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHsgbW9kdWxlSWQ6IHVuZGVmaW5lZCwgaW5zdGFuY2VJZDogdW5kZWZpbmVkIH1cbiAgfVxufVxuXG5jb25zdCBzZXRTbmFwc2hvdEluVHhuID0gKFxuICBib3VuZDogQm91bmRBcGk8YW55LCBhbnk+LFxuICBmaWVsZFBhdGg6IHN0cmluZyxcbiAgbmV4dDogdW5rbm93bixcbiAgcmVhc29uOiBQYXRjaFJlYXNvbixcbiAgc3RlcElkOiBzdHJpbmcsXG4gIHRyYWl0Tm9kZUlkPzogc3RyaW5nLFxuKTogRWZmZWN0LkVmZmVjdDxib29sZWFuLCBuZXZlciwgYW55PiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgbGV0IHdyb3RlID0gZmFsc2VcbiAgICB5aWVsZCogKGJvdW5kLnN0YXRlLm11dGF0ZSgoZHJhZnQ6IGFueSkgPT4ge1xuICAgICAgY29uc3QgcHJldiA9IFJvd0lkLmdldEF0UGF0aChkcmFmdCwgZmllbGRQYXRoKVxuICAgICAgaWYgKE9iamVjdC5pcyhwcmV2LCBuZXh0KSkgcmV0dXJuXG4gICAgICB3cm90ZSA9IHRydWVcbiAgICAgIFJvd0lkLnNldEF0UGF0aE11dGF0aW5nKGRyYWZ0LCBmaWVsZFBhdGgsIG5leHQpXG4gICAgICByZWNvcmRUcmFpdFBhdGNoKGJvdW5kLCB7XG4gICAgICAgIHBhdGg6IGZpZWxkUGF0aCxcbiAgICAgICAgZnJvbTogcHJldixcbiAgICAgICAgdG86IG5leHQsXG4gICAgICAgIHJlYXNvbixcbiAgICAgICAgc3RlcElkLFxuICAgICAgICB0cmFpdE5vZGVJZCxcbiAgICAgIH0pXG4gICAgfSkgYXMgRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PilcbiAgICByZXR1cm4gd3JvdGVcbiAgfSlcblxuY29uc3Qgd3JpdGViYWNrSWZDdXJyZW50S2V5SGFzaCA9IChcbiAgYm91bmQ6IEJvdW5kQXBpPGFueSwgYW55PixcbiAgZmllbGRQYXRoOiBzdHJpbmcsXG4gIGtleUhhc2g6IHN0cmluZyxcbiAgbmV4dDogdW5rbm93bixcbiAgcmVhc29uOiBQYXRjaFJlYXNvbixcbiAgc3RlcElkOiBzdHJpbmcsXG4gIHRyYWl0Tm9kZUlkPzogc3RyaW5nLFxuICByZXBsYXlFdmVudD86IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCxcbik6IEVmZmVjdC5FZmZlY3Q8Ym9vbGVhbiwgbmV2ZXIsIGFueT4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGxldCB3cm90ZSA9IGZhbHNlXG4gICAgeWllbGQqIChib3VuZC5zdGF0ZS5tdXRhdGUoKGRyYWZ0OiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBSb3dJZC5nZXRBdFBhdGgoZHJhZnQsIGZpZWxkUGF0aClcbiAgICAgIGNvbnN0IGN1cnJlbnRLZXlIYXNoID1cbiAgICAgICAgY3VycmVudCAmJiB0eXBlb2YgY3VycmVudCA9PT0gXCJvYmplY3RcIiA/IChjdXJyZW50IGFzIGFueSkua2V5SGFzaCA6IHVuZGVmaW5lZFxuICAgICAgaWYgKGN1cnJlbnRLZXlIYXNoICE9PSBrZXlIYXNoKSByZXR1cm5cblxuICAgICAgY29uc3QgcHJldiA9IGN1cnJlbnRcbiAgICAgIGlmIChPYmplY3QuaXMocHJldiwgbmV4dCkpIHJldHVyblxuXG4gICAgICB3cm90ZSA9IHRydWVcbiAgICAgIFJvd0lkLnNldEF0UGF0aE11dGF0aW5nKGRyYWZ0LCBmaWVsZFBhdGgsIG5leHQpXG4gICAgICBpZiAocmVwbGF5RXZlbnQpIHtcbiAgICAgICAgcmVjb3JkUmVwbGF5RXZlbnQoYm91bmQsIHJlcGxheUV2ZW50KVxuICAgICAgfVxuICAgICAgcmVjb3JkVHJhaXRQYXRjaChib3VuZCwge1xuICAgICAgICBwYXRoOiBmaWVsZFBhdGgsXG4gICAgICAgIGZyb206IHByZXYsXG4gICAgICAgIHRvOiBuZXh0LFxuICAgICAgICByZWFzb24sXG4gICAgICAgIHN0ZXBJZCxcbiAgICAgICAgdHJhaXROb2RlSWQsXG4gICAgICB9KVxuICAgIH0pIGFzIEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4pXG4gICAgcmV0dXJuIHdyb3RlXG4gIH0pXG5cbi8qKlxuICogc3luY0lkbGVJblRyYW5zYWN0aW9uXHVGRjFBXG4gKiAtIFx1NTcyOFx1NEU4Qlx1NTJBMVx1N0E5N1x1NTNFM1x1NTE4NVx1NTQwQ1x1NkI2NVx1OEJDNFx1NEYzMFx1NjI0MFx1NjcwOSBzb3VyY2Uua2V5KHN0YXRlKVx1RkYxQlxuICogLSBcdTgyRTUga2V5IFx1NTNEOFx1NEUzQVx1N0E3QVx1RkYwOHVuZGVmaW5lZFx1RkYwOVx1RkYwQ1x1NTIxOVx1NTQwQ1x1NkI2NVx1NUMwNlx1NUJGOVx1NUU5NFx1NUI1N1x1NkJCNVx1OTFDRFx1N0Y2RVx1NEUzQSBpZGxlIHNuYXBzaG90XHVGRjA4XHU5MDdGXHU1MTREIHRlYXJpbmdcdUZGMDlcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IHN5bmNJZGxlSW5UcmFuc2FjdGlvbiA9IDxTIGV4dGVuZHMgb2JqZWN0PihcbiAgcHJvZ3JhbTogU3RhdGVUcmFpdFByb2dyYW08Uz4sXG4gIGN0eDogU291cmNlU3luY0NvbnRleHQ8Uz4sXG4pOiBFZmZlY3QuRWZmZWN0PHZvaWQ+ID0+XG4gIEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICBjb25zdCBkcmFmdCA9IGN0eC5nZXREcmFmdCgpIGFzIGFueVxuICAgIGNvbnN0IHVwZGF0ZXM6IEFycmF5PHsgcmVhZG9ubHkgZmllbGRQYXRoOiBzdHJpbmc7IHJlYWRvbmx5IHByZXY6IHVua25vd24gfT4gPSBbXVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBwcm9ncmFtLmVudHJpZXMpIHtcbiAgICAgIGlmIChlbnRyeS5raW5kICE9PSBcInNvdXJjZVwiKSBjb250aW51ZVxuICAgICAgY29uc3QgZmllbGRQYXRoID0gZW50cnkuZmllbGRQYXRoXG4gICAgICBjb25zdCBsaXN0SXRlbSA9IFJvd0lkLnBhcnNlTGlzdEl0ZW1GaWVsZFBhdGgoZmllbGRQYXRoKVxuXG4gICAgICBpZiAobGlzdEl0ZW0pIHtcbiAgICAgICAgLy8gbGlzdC5pdGVtIHNjb3BlXHVGRjFBXHU2MzA5IGluZGV4IFx1OTAxMFx1ODg0Q1x1OEJDNFx1NEYzMCBrZXlcdUZGMENcdTVFNzZcdTVCRjlcdTY3MkFcdTZGQzBcdTZEM0JcdTg4NENcdTU0MENcdTZCNjVcdTUxOTlcdTU2REUgaWRsZVx1MzAwMlxuICAgICAgICBjb25zdCBsaXN0VmFsdWUgPSBSb3dJZC5nZXRBdFBhdGgoZHJhZnQsIGxpc3RJdGVtLmxpc3RQYXRoKVxuICAgICAgICBjb25zdCBpdGVtczogUmVhZG9ubHlBcnJheTx1bmtub3duPiA9IEFycmF5LmlzQXJyYXkobGlzdFZhbHVlKSA/IGxpc3RWYWx1ZSA6IFtdXG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGl0ZW1zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpbmRleF1cblxuICAgICAgICAgIGxldCBrZXk6IHVua25vd25cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAga2V5ID0gKGVudHJ5Lm1ldGEgYXMgYW55KS5rZXkoaXRlbSlcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuXG4gICAgICAgICAgY29uc3QgY29uY3JldGVQYXRoID0gUm93SWQudG9MaXN0SXRlbVZhbHVlUGF0aChcbiAgICAgICAgICAgIGxpc3RJdGVtLmxpc3RQYXRoLFxuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBsaXN0SXRlbS5pdGVtUGF0aCxcbiAgICAgICAgICApXG4gICAgICAgICAgY29uc3QgcHJldiA9IFJvd0lkLmdldEF0UGF0aChkcmFmdCwgY29uY3JldGVQYXRoKVxuICAgICAgICAgIGNvbnN0IHByZXZTdGF0dXMgPVxuICAgICAgICAgICAgcHJldiAmJiB0eXBlb2YgcHJldiA9PT0gXCJvYmplY3RcIiA/IChwcmV2IGFzIGFueSkuc3RhdHVzIDogdW5kZWZpbmVkXG4gICAgICAgICAgaWYgKHByZXZTdGF0dXMgPT09IFwiaWRsZVwiKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gKHByZXYgYXMgYW55KT8uZGF0YVxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSAocHJldiBhcyBhbnkpPy5lcnJvclxuICAgICAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlcy5wdXNoKHsgZmllbGRQYXRoOiBjb25jcmV0ZVBhdGgsIHByZXYgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGxldCBrZXk6IHVua25vd25cbiAgICAgIHRyeSB7XG4gICAgICAgIGtleSA9IChlbnRyeS5tZXRhIGFzIGFueSkua2V5KGRyYWZ0KVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkgY29udGludWVcblxuICAgICAgY29uc3QgcHJldiA9IFJvd0lkLmdldEF0UGF0aChkcmFmdCwgZmllbGRQYXRoKVxuICAgICAgY29uc3QgcHJldlN0YXR1cyA9XG4gICAgICAgIHByZXYgJiYgdHlwZW9mIHByZXYgPT09IFwib2JqZWN0XCIgPyAocHJldiBhcyBhbnkpLnN0YXR1cyA6IHVuZGVmaW5lZFxuICAgICAgaWYgKHByZXZTdGF0dXMgPT09IFwiaWRsZVwiKSB7XG4gICAgICAgIC8vIFx1NEVDRFx1OTcwMFx1Nzg2RVx1NEZERCBkYXRhL2Vycm9yIFx1ODhBQlx1NkUwNVx1N0E3QVxuICAgICAgICBjb25zdCBkYXRhID0gKHByZXYgYXMgYW55KT8uZGF0YVxuICAgICAgICBjb25zdCBlcnJvciA9IChwcmV2IGFzIGFueSk/LmVycm9yXG4gICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQgJiYgZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlcy5wdXNoKHsgZmllbGRQYXRoLCBwcmV2IH0pXG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgIGNvbnN0IHJlYXNvbjogUGF0Y2hSZWFzb24gPSBcInNvdXJjZTppZGxlXCJcblxuICAgIGNvbnN0IG5leHREcmFmdCA9IGNyZWF0ZShkcmFmdCwgKG5leHQ6IGFueSkgPT4ge1xuICAgICAgZm9yIChjb25zdCB1IG9mIHVwZGF0ZXMpIHtcbiAgICAgICAgUm93SWQuc2V0QXRQYXRoTXV0YXRpbmcobmV4dCwgdS5maWVsZFBhdGgsIFNuYXBzaG90LmlkbGUoKSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY3R4LnNldERyYWZ0KG5leHREcmFmdCBhcyBTKVxuXG4gICAgZm9yIChjb25zdCB1IG9mIHVwZGF0ZXMpIHtcbiAgICAgIGN0eC5yZWNvcmRQYXRjaChcbiAgICAgICAgbWFrZVBhdGNoKFxuICAgICAgICAgIHUuZmllbGRQYXRoLFxuICAgICAgICAgIHUucHJldixcbiAgICAgICAgICBTbmFwc2hvdC5pZGxlKCksXG4gICAgICAgICAgcmVhc29uLFxuICAgICAgICAgIGBzb3VyY2U6JHt1LmZpZWxkUGF0aH06aWRsZWAsXG4gICAgICAgICksXG4gICAgICApXG4gICAgfVxuICB9KVxuXG4vKipcbiAqIGluc3RhbGxTb3VyY2VSZWZyZXNoXHVGRjFBXG4gKiAtIFx1NEUzQVx1NTM1NVx1NEUyQSBzb3VyY2UgXHU1QjU3XHU2QkI1XHU2Q0U4XHU1MThDXHU1MjM3XHU2NUIwXHU1QjlFXHU3M0IwXHVGRjA4UmVzb3VyY2VTbmFwc2hvdCArIGtleUhhc2ggZ2F0ZSArIGNvbmN1cnJlbmN5XHVGRjA5XHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBpbnN0YWxsU291cmNlUmVmcmVzaCA9IDxTPihcbiAgYm91bmQ6IEJvdW5kQXBpPGFueSwgYW55PixcbiAgc3RlcDogU3RhdGVUcmFpdFBsYW5TdGVwLFxuICBlbnRyeTogRXh0cmFjdDxTdGF0ZVRyYWl0RW50cnk8Uywgc3RyaW5nPiwgeyByZWFkb25seSBraW5kOiBcInNvdXJjZVwiIH0+LFxuKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9PiB7XG4gIGlmICghc3RlcC50YXJnZXRGaWVsZFBhdGgpIHJldHVybiBFZmZlY3Qudm9pZFxuXG4gIGNvbnN0IGZpZWxkUGF0aCA9IHN0ZXAudGFyZ2V0RmllbGRQYXRoXG4gIGNvbnN0IHJlc291cmNlSWQgPSBzdGVwLnJlc291cmNlSWQgPz8gZW50cnkubWV0YS5yZXNvdXJjZVxuICBjb25zdCBsaXN0SXRlbSA9IFJvd0lkLnBhcnNlTGlzdEl0ZW1GaWVsZFBhdGgoZmllbGRQYXRoKVxuXG4gIGxldCBpbnRlcm5hbHM6IFJldHVyblR5cGU8dHlwZW9mIGdldEJvdW5kSW50ZXJuYWxzPiB8IHVuZGVmaW5lZFxuICB0cnkge1xuICAgIGludGVybmFscyA9IGdldEJvdW5kSW50ZXJuYWxzKGJvdW5kIGFzIGFueSlcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gIH1cblxuICBjb25zdCByZWdpc3RlciA9IGludGVybmFscy50cmFpdHMucmVnaXN0ZXJTb3VyY2VSZWZyZXNoXG5cbiAgY29uc3QgcmVjb3JkU25hcHNob3QgPSAoXG4gICAgcmVwbGF5TW9kZTogXCJsaXZlXCIgfCBcInJlcGxheVwiLFxuICAgIHJlcGxheUxvZzogUmVwbGF5TG9nLlJlcGxheUxvZ1NlcnZpY2UgfCB1bmRlZmluZWQsXG4gICAgaW5wdXQ6XG4gICAgICB8IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudFxuICAgICAgfCB7XG4gICAgICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgICAgICAgcmVhZG9ubHkgZmllbGRQYXRoOiBzdHJpbmdcbiAgICAgICAgICByZWFkb25seSBrZXlIYXNoPzogc3RyaW5nXG4gICAgICAgICAgcmVhZG9ubHkgcGhhc2U6IFJlcGxheUxvZy5SZXNvdXJjZVNuYXBzaG90UGhhc2VcbiAgICAgICAgICByZWFkb25seSBzbmFwc2hvdDogdW5rbm93blxuICAgICAgICB9LFxuICApOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+ID0+IHtcbiAgICBpZiAoIXJlcGxheUxvZykgcmV0dXJuIEVmZmVjdC52b2lkXG4gICAgaWYgKHJlcGxheU1vZGUgIT09IFwibGl2ZVwiKSByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICBjb25zdCBldmVudDogUmVwbGF5TG9nLlJlcGxheUxvZ0V2ZW50ID1cbiAgICAgIGlucHV0ICYmIHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIiAmJiAoaW5wdXQgYXMgYW55KS5fdGFnID09PSBcIlJlc291cmNlU25hcHNob3RcIlxuICAgICAgICA/IChpbnB1dCBhcyBSZXBsYXlMb2cuUmVwbGF5TG9nRXZlbnQpXG4gICAgICAgIDoge1xuICAgICAgICAgICAgX3RhZzogXCJSZXNvdXJjZVNuYXBzaG90XCIsXG4gICAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgICAgZmllbGRQYXRoOiAoaW5wdXQgYXMgYW55KS5maWVsZFBhdGgsXG4gICAgICAgICAgICBrZXlIYXNoOiAoaW5wdXQgYXMgYW55KS5rZXlIYXNoLFxuICAgICAgICAgICAgcGhhc2U6IChpbnB1dCBhcyBhbnkpLnBoYXNlLFxuICAgICAgICAgICAgc25hcHNob3Q6IChpbnB1dCBhcyBhbnkpLnNuYXBzaG90LFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgbW9kdWxlSWQ6IChpbnB1dCBhcyBhbnkpLm1vZHVsZUlkLFxuICAgICAgICAgICAgaW5zdGFuY2VJZDogKGlucHV0IGFzIGFueSkuaW5zdGFuY2VJZCxcbiAgICAgICAgICB9XG4gICAgcmV0dXJuIHJlcGxheUxvZy5yZWNvcmQoZXZlbnQpXG4gIH1cblxuICAvLyBsaXN0Lml0ZW0gc2NvcGVcdUZGMUFcdTYzMDkgUm93SUQgXHU1MDVBIGluLWZsaWdodCBcdTk1RThcdTYzQTdcdUZGMDhcdTkwN0ZcdTUxNEQgaW5zZXJ0L3JlbW92ZS9yZW9yZGVyIFx1NEUwQlx1NTE5OVx1OTUxOVx1ODg0Q1x1RkYwOVx1MzAwMlxuICBpZiAobGlzdEl0ZW0pIHtcbiAgICBjb25zdCBzdG9yZSA9IGludGVybmFscy50cmFpdHMucm93SWRTdG9yZSBhcyBSb3dJZC5Sb3dJZFN0b3JlIHwgdW5kZWZpbmVkXG4gICAgaWYgKCFzdG9yZSkge1xuICAgICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gICAgfVxuXG4gICAgY29uc3QgbGlzdFBhdGggPSBsaXN0SXRlbS5saXN0UGF0aFxuICAgIGNvbnN0IGl0ZW1QYXRoID0gbGlzdEl0ZW0uaXRlbVBhdGhcbiAgICBpZiAoIWl0ZW1QYXRoKSB7XG4gICAgICAvLyBcdTc5ODFcdTZCNjJcdTYyOEEgc25hcHNob3QgXHU1MTk5XHU1NkRFXHU1MjMwXHU2NTc0XHU0RTJBIGl0ZW1cdUZGMDhcdTRGMUFcdTg5ODZcdTc2RDZcdTRFMUFcdTUyQTEgdmFsdWVzXHVGRjA5XHUzMDAyXG4gICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICB9XG5cbiAgICBjb25zdCBjb25jdXJyZW5jeSA9IChlbnRyeS5tZXRhIGFzIGFueSkuY29uY3VycmVuY3kgYXNcbiAgICAgIHwgXCJzd2l0Y2hcIlxuICAgICAgfCBcImV4aGF1c3QtdHJhaWxpbmdcIlxuICAgICAgfCB1bmRlZmluZWRcbiAgICBjb25zdCBtb2RlID0gY29uY3VycmVuY3kgPz8gXCJzd2l0Y2hcIlxuXG4gICAgY29uc3QgaW5GbGlnaHQgPSBuZXcgTWFwPFxuICAgICAgUm93SWQuUm93SWQsXG4gICAgICB7XG4gICAgICAgIHJlYWRvbmx5IGdlbjogbnVtYmVyXG4gICAgICAgIHJlYWRvbmx5IGZpYmVyOiBGaWJlci5SdW50aW1lRmliZXI8dm9pZCwgbmV2ZXI+XG4gICAgICAgIHJlYWRvbmx5IGtleUhhc2g6IHN0cmluZ1xuICAgICAgfVxuICAgID4oKVxuICAgIGNvbnN0IHRyYWlsaW5nID0gbmV3IE1hcDxSb3dJZC5Sb3dJZCwgeyByZWFkb25seSBrZXk6IHVua25vd247IHJlYWRvbmx5IGtleUhhc2g6IHN0cmluZyB9PigpXG4gICAgbGV0IGdlbiA9IDBcblxuICAgIC8vIHJvdyBcdTg4QUJcdTc5RkJcdTk2NjRcdUZGMUFcdTZFMDVcdTc0MDYgdHJhaWxpbmcvaW5GbGlnaHQgXHU1RjE1XHU3NTI4XHVGRjBDXHU5MDdGXHU1MTREXHU1NDBFXHU3RUVEXHU5NTE5XHU4QkVGXHU1RjUyXHU1QzVFXHU2MjE2XHU1MTg1XHU1QjU4XHU2Q0M0XHU2RjBGXHUzMDAyXG4gICAgc3RvcmUub25SZW1vdmVkKGxpc3RQYXRoLCAocm93SWQpID0+IHtcbiAgICAgIHRyYWlsaW5nLmRlbGV0ZShyb3dJZClcbiAgICAgIGluRmxpZ2h0LmRlbGV0ZShyb3dJZClcbiAgICB9KVxuXG4gICAgY29uc3Qgc2V0U25hcHNob3RGb3JSb3dJblR4biA9IChcbiAgICAgIHJvd0lkOiBSb3dJZC5Sb3dJZCxcbiAgICAgIG5leHQ6IHVua25vd24sXG4gICAgICByZWFzb246IFBhdGNoUmVhc29uLFxuICAgICAgc3RlcElkOiBzdHJpbmcsXG4gICAgKTogRWZmZWN0LkVmZmVjdDxzdHJpbmcgfCB1bmRlZmluZWQsIG5ldmVyLCBhbnk+ID0+XG4gICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCB3cm90ZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICAgICB5aWVsZCogKGJvdW5kLnN0YXRlLm11dGF0ZSgoZHJhZnQ6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RvcmUuZ2V0SW5kZXgobGlzdFBhdGgsIHJvd0lkKVxuICAgICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSByZXR1cm5cbiAgICAgICAgICBjb25zdCBjb25jcmV0ZVBhdGggPSBSb3dJZC50b0xpc3RJdGVtVmFsdWVQYXRoKGxpc3RQYXRoLCBpbmRleCwgaXRlbVBhdGgpXG4gICAgICAgICAgY29uc3QgcHJldiA9IFJvd0lkLmdldEF0UGF0aChkcmFmdCwgY29uY3JldGVQYXRoKVxuICAgICAgICAgIGlmIChPYmplY3QuaXMocHJldiwgbmV4dCkpIHJldHVyblxuICAgICAgICAgIHdyb3RlUGF0aCA9IGNvbmNyZXRlUGF0aFxuICAgICAgICAgIFJvd0lkLnNldEF0UGF0aE11dGF0aW5nKGRyYWZ0LCBjb25jcmV0ZVBhdGgsIG5leHQpXG4gICAgICAgICAgcmVjb3JkVHJhaXRQYXRjaChib3VuZCwge1xuICAgICAgICAgICAgcGF0aDogY29uY3JldGVQYXRoLFxuICAgICAgICAgICAgZnJvbTogcHJldixcbiAgICAgICAgICAgIHRvOiBuZXh0LFxuICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgdHJhaXROb2RlSWQ6IHN0ZXAuZGVidWdJbmZvPy5ncmFwaE5vZGVJZCxcbiAgICAgICAgICB9KVxuICAgICAgICB9KSBhcyBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+KVxuICAgICAgICByZXR1cm4gd3JvdGVQYXRoXG4gICAgICB9KVxuXG4gICAgY29uc3Qgd3JpdGViYWNrSWZDdXJyZW50S2V5SGFzaEZvclJvdyA9IChcbiAgICAgIHJvd0lkOiBSb3dJZC5Sb3dJZCxcbiAgICAgIGtleUhhc2g6IHN0cmluZyxcbiAgICAgIG5leHQ6IHVua25vd24sXG4gICAgICByZWFzb246IFBhdGNoUmVhc29uLFxuICAgICAgc3RlcElkOiBzdHJpbmcsXG4gICAgICBwaGFzZT86IFJlcGxheUxvZy5SZXNvdXJjZVNuYXBzaG90UGhhc2UsXG4gICAgKTogRWZmZWN0LkVmZmVjdDxzdHJpbmcgfCB1bmRlZmluZWQsIG5ldmVyLCBhbnk+ID0+XG4gICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCB3cm90ZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICAgICB5aWVsZCogKGJvdW5kLnN0YXRlLm11dGF0ZSgoZHJhZnQ6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RvcmUuZ2V0SW5kZXgobGlzdFBhdGgsIHJvd0lkKVxuICAgICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSByZXR1cm5cbiAgICAgICAgICBjb25zdCBjb25jcmV0ZVBhdGggPSBSb3dJZC50b0xpc3RJdGVtVmFsdWVQYXRoKGxpc3RQYXRoLCBpbmRleCwgaXRlbVBhdGgpXG5cbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gUm93SWQuZ2V0QXRQYXRoKGRyYWZ0LCBjb25jcmV0ZVBhdGgpXG4gICAgICAgICAgY29uc3QgY3VycmVudEtleUhhc2ggPVxuICAgICAgICAgICAgY3VycmVudCAmJiB0eXBlb2YgY3VycmVudCA9PT0gXCJvYmplY3RcIiA/IChjdXJyZW50IGFzIGFueSkua2V5SGFzaCA6IHVuZGVmaW5lZFxuICAgICAgICAgIGlmIChjdXJyZW50S2V5SGFzaCAhPT0ga2V5SGFzaCkgcmV0dXJuXG5cbiAgICAgICAgICBjb25zdCBwcmV2ID0gY3VycmVudFxuICAgICAgICAgIGlmIChPYmplY3QuaXMocHJldiwgbmV4dCkpIHJldHVyblxuXG4gICAgICAgICAgd3JvdGVQYXRoID0gY29uY3JldGVQYXRoXG4gICAgICAgICAgUm93SWQuc2V0QXRQYXRoTXV0YXRpbmcoZHJhZnQsIGNvbmNyZXRlUGF0aCwgbmV4dClcbiAgICAgICAgICBpZiAocGhhc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbW9kdWxlSWQsIGluc3RhbmNlSWQgfSA9IGdldEJvdW5kU2NvcGUoYm91bmQpXG4gICAgICAgICAgICByZWNvcmRSZXBsYXlFdmVudChib3VuZCwge1xuICAgICAgICAgICAgICBfdGFnOiBcIlJlc291cmNlU25hcHNob3RcIixcbiAgICAgICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICAgICAgZmllbGRQYXRoOiBjb25jcmV0ZVBhdGgsXG4gICAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICAgIHBoYXNlLFxuICAgICAgICAgICAgICBzbmFwc2hvdDogbmV4dCxcbiAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIHJlY29yZFRyYWl0UGF0Y2goYm91bmQsIHtcbiAgICAgICAgICAgIHBhdGg6IGNvbmNyZXRlUGF0aCxcbiAgICAgICAgICAgIGZyb206IHByZXYsXG4gICAgICAgICAgICB0bzogbmV4dCxcbiAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgIHRyYWl0Tm9kZUlkOiBzdGVwLmRlYnVnSW5mbz8uZ3JhcGhOb2RlSWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSkgYXMgRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PilcbiAgICAgICAgcmV0dXJuIHdyb3RlUGF0aFxuICAgICAgfSlcblxuICAgIGNvbnN0IHN0YXJ0RmV0Y2ggPSAoXG4gICAgICByb3dJZDogUm93SWQuUm93SWQsXG4gICAgICBrZXk6IHVua25vd24sXG4gICAgICBrZXlIYXNoOiBzdHJpbmcsXG4gICAgICByZXBsYXlNb2RlOiBcImxpdmVcIiB8IFwicmVwbGF5XCIsXG4gICAgICByZXBsYXlMb2c6IFJlcGxheUxvZy5SZXBsYXlMb2dTZXJ2aWNlIHwgdW5kZWZpbmVkLFxuICAgICk6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgeyBtb2R1bGVJZCwgaW5zdGFuY2VJZCB9ID0gZ2V0Qm91bmRTY29wZShib3VuZClcblxuICAgICAgICBjb25zdCBpbmRleEZvckxvZyA9IHN0b3JlLmdldEluZGV4KGxpc3RQYXRoLCByb3dJZClcbiAgICAgICAgY29uc3QgbG9nRmllbGRQYXRoID1cbiAgICAgICAgICBpbmRleEZvckxvZyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBSb3dJZC50b0xpc3RJdGVtVmFsdWVQYXRoKGxpc3RQYXRoLCBpbmRleEZvckxvZywgaXRlbVBhdGgpXG5cbiAgICAgICAgbGV0IGxvYWRpbmdTbmFwc2hvdDogdW5rbm93biA9IFNuYXBzaG90LmxvYWRpbmcoeyBrZXlIYXNoIH0pXG4gICAgICAgIGlmIChyZXBsYXlNb2RlID09PSBcInJlcGxheVwiICYmIHJlcGxheUxvZyAmJiBsb2dGaWVsZFBhdGgpIHtcbiAgICAgICAgICBjb25zdCByZXBsYXlMb2FkaW5nID0geWllbGQqIHJlcGxheUxvZy5jb25zdW1lTmV4dFJlc291cmNlU25hcHNob3Qoe1xuICAgICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICAgIGZpZWxkUGF0aDogbG9nRmllbGRQYXRoLFxuICAgICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICAgIHBoYXNlOiBcImxvYWRpbmdcIixcbiAgICAgICAgICB9KVxuICAgICAgICAgIGlmIChyZXBsYXlMb2FkaW5nKSB7XG4gICAgICAgICAgICBsb2FkaW5nU25hcHNob3QgPSByZXBsYXlMb2FkaW5nLnNuYXBzaG90XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdyb3RlTG9hZGluZ1BhdGggPSB5aWVsZCogc2V0U25hcHNob3RGb3JSb3dJblR4bihcbiAgICAgICAgICByb3dJZCxcbiAgICAgICAgICBsb2FkaW5nU25hcHNob3QsXG4gICAgICAgICAgXCJzb3VyY2U6bG9hZGluZ1wiLFxuICAgICAgICAgIGBzb3VyY2U6JHtmaWVsZFBhdGh9OiR7cm93SWR9OmxvYWRpbmdgLFxuICAgICAgICApXG4gICAgICAgIGlmICh3cm90ZUxvYWRpbmdQYXRoKSB7XG4gICAgICAgICAgY29uc3QgZXZlbnQ6IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCA9IHtcbiAgICAgICAgICAgIF90YWc6IFwiUmVzb3VyY2VTbmFwc2hvdFwiLFxuICAgICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICAgIGZpZWxkUGF0aDogd3JvdGVMb2FkaW5nUGF0aCxcbiAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICBwaGFzZTogXCJsb2FkaW5nXCIsXG4gICAgICAgICAgICBzbmFwc2hvdDogbG9hZGluZ1NuYXBzaG90LFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgICAgICBpbnN0YW5jZUlkLFxuICAgICAgICAgIH1cbiAgICAgICAgICByZWNvcmRSZXBsYXlFdmVudChib3VuZCwgZXZlbnQpXG4gICAgICAgICAgeWllbGQqIHJlY29yZFNuYXBzaG90KHJlcGxheU1vZGUsIHJlcGxheUxvZywgZXZlbnQpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbyA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICBpZiAocmVwbGF5TW9kZSA9PT0gXCJyZXBsYXlcIiAmJiByZXBsYXlMb2cpIHtcbiAgICAgICAgICAgIC8vIFx1OEJBOSBsb2FkaW5nIFx1NjNEMFx1NEVBNFx1NTE0OFx1NTNFRlx1ODlDMVx1RkYwQ1x1NTE4RFx1OTFDRFx1OEQ1Qlx1N0VDOFx1NjAwMVx1RkYwOFx1NEZERFx1NjMwMVx1MjAxQ1x1NUYwMlx1NkI2NVx1OEQ0NFx1NkU5MFx1MjAxRFx1NzY4NFx1NjVGNlx1OTVGNFx1N0VCRlx1N0VEM1x1Njc4NFx1RkYwOVx1MzAwMlxuICAgICAgICAgICAgeWllbGQqIEVmZmVjdC55aWVsZE5vdygpXG4gICAgICAgICAgICBjb25zdCBjb25zdW1lUGF0aCA9IHdyb3RlTG9hZGluZ1BhdGggPz8gbG9nRmllbGRQYXRoXG4gICAgICAgICAgICBpZiAoIWNvbnN1bWVQYXRoKSByZXR1cm4geWllbGQqIEVmZmVjdC52b2lkXG5cbiAgICAgICAgICAgIGNvbnN0IHJlcGxheWVkID0geWllbGQqIHJlcGxheUxvZy5jb25zdW1lTmV4dFJlc291cmNlU25hcHNob3Qoe1xuICAgICAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgICAgICBmaWVsZFBhdGg6IGNvbnN1bWVQYXRoLFxuICAgICAgICAgICAgICBrZXlIYXNoLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGlmICghcmVwbGF5ZWQpIHJldHVybiB5aWVsZCogRWZmZWN0LnZvaWRcblxuICAgICAgICAgICAgaWYgKHJlcGxheWVkLnBoYXNlID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgICB5aWVsZCogd3JpdGViYWNrSWZDdXJyZW50S2V5SGFzaEZvclJvdyhcbiAgICAgICAgICAgICAgICByb3dJZCxcbiAgICAgICAgICAgICAgICBrZXlIYXNoLFxuICAgICAgICAgICAgICAgIHJlcGxheWVkLnNuYXBzaG90LFxuICAgICAgICAgICAgICAgIFwic291cmNlOnN1Y2Nlc3NcIixcbiAgICAgICAgICAgICAgICBgc291cmNlOiR7ZmllbGRQYXRofToke3Jvd0lkfTpzdWNjZXNzYCxcbiAgICAgICAgICAgICAgICBcInN1Y2Nlc3NcIixcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXBsYXllZC5waGFzZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgICAgIHlpZWxkKiB3cml0ZWJhY2tJZkN1cnJlbnRLZXlIYXNoRm9yUm93KFxuICAgICAgICAgICAgICAgIHJvd0lkLFxuICAgICAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICAgICAgcmVwbGF5ZWQuc25hcHNob3QsXG4gICAgICAgICAgICAgICAgXCJzb3VyY2U6ZXJyb3JcIixcbiAgICAgICAgICAgICAgICBgc291cmNlOiR7ZmllbGRQYXRofToke3Jvd0lkfTplcnJvcmAsXG4gICAgICAgICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LnZvaWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzdGFjayA9IHlpZWxkKiBnZXRNaWRkbGV3YXJlU3RhY2soKVxuXG4gICAgICAgICAgY29uc3QgcmVnaXN0cnlPcHQgPSB5aWVsZCogRWZmZWN0LnNlcnZpY2VPcHRpb24oUmVzb3VyY2VJbnRlcm5hbC5SZXNvdXJjZVJlZ2lzdHJ5VGFnKVxuICAgICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gT3B0aW9uLmlzU29tZShyZWdpc3RyeU9wdCkgPyByZWdpc3RyeU9wdC52YWx1ZSA6IHVuZGVmaW5lZFxuICAgICAgICAgIGNvbnN0IHNwZWMgPSByZWdpc3RyeT8uc3BlY3MuZ2V0KHJlc291cmNlSWQpXG5cbiAgICAgICAgICBpZiAoIXNwZWMpIHtcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LnZvaWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBsb2FkRWZmZWN0ID0gKHNwZWMubG9hZCBhcyBhbnkpKGtleSkgYXMgRWZmZWN0LkVmZmVjdDxhbnksIGFueSwgYW55PlxuXG4gICAgICAgICAgY29uc3QgbWV0YTogYW55ID0ge1xuICAgICAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgICAgICBpbnN0YW5jZUlkLFxuICAgICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICByb3dJZCxcbiAgICAgICAgICAgIHRyYWl0Tm9kZUlkOiBzdGVwLmRlYnVnSW5mbz8uZ3JhcGhOb2RlSWQsXG4gICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuaWQsXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCEodHlwZW9mIG1ldGEub3BTZXEgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKG1ldGEub3BTZXEpKSkge1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbk9wdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihSdW5TZXNzaW9uVGFnKVxuICAgICAgICAgICAgaWYgKE9wdGlvbi5pc1NvbWUoc2Vzc2lvbk9wdCkpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc2VxS2V5ID0gaW5zdGFuY2VJZCA/PyBcImdsb2JhbFwiXG4gICAgICAgICAgICAgIG1ldGEub3BTZXEgPSBzZXNzaW9uT3B0LnZhbHVlLmxvY2FsLm5leHRTZXEoXCJvcFNlcVwiLCBzZXFLZXkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgb3AgPSBFZmZlY3RPcC5tYWtlPGFueSwgYW55LCBhbnk+KHtcbiAgICAgICAgICAgIGtpbmQ6IFwic2VydmljZVwiLFxuICAgICAgICAgICAgbmFtZTogcmVzb3VyY2VJZCxcbiAgICAgICAgICAgIGVmZmVjdDogbG9hZEVmZmVjdCxcbiAgICAgICAgICAgIG1ldGEsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGNvbnN0IGV4aXQgPSB5aWVsZCogRWZmZWN0LmV4aXQoRWZmZWN0T3AucnVuKG9wLCBzdGFjaykpXG5cbiAgICAgICAgICBpZiAoZXhpdC5fdGFnID09PSBcIlN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgY29uc3Qgc3VjY2Vzc1NuYXBzaG90ID0gU25hcHNob3Quc3VjY2Vzcyh7IGtleUhhc2gsIGRhdGE6IGV4aXQudmFsdWUgfSlcbiAgICAgICAgICAgIGNvbnN0IHdyb3RlU3VjY2Vzc1BhdGggPSB5aWVsZCogd3JpdGViYWNrSWZDdXJyZW50S2V5SGFzaEZvclJvdyhcbiAgICAgICAgICAgICAgcm93SWQsXG4gICAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICAgIHN1Y2Nlc3NTbmFwc2hvdCxcbiAgICAgICAgICAgICAgXCJzb3VyY2U6c3VjY2Vzc1wiLFxuICAgICAgICAgICAgICBgc291cmNlOiR7ZmllbGRQYXRofToke3Jvd0lkfTpzdWNjZXNzYCxcbiAgICAgICAgICAgICAgXCJzdWNjZXNzXCIsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAod3JvdGVTdWNjZXNzUGF0aCkge1xuICAgICAgICAgICAgICB5aWVsZCogcmVjb3JkU25hcHNob3QocmVwbGF5TW9kZSwgcmVwbGF5TG9nLCB7XG4gICAgICAgICAgICAgICAgX3RhZzogXCJSZXNvdXJjZVNuYXBzaG90XCIsXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICAgICAgICBmaWVsZFBhdGg6IHdyb3RlU3VjY2Vzc1BhdGgsXG4gICAgICAgICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICAgICAgICBwaGFzZTogXCJzdWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgc25hcHNob3Q6IHN1Y2Nlc3NTbmFwc2hvdCxcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JTbmFwc2hvdCA9IFNuYXBzaG90LmVycm9yKHsga2V5SGFzaCwgZXJyb3I6IGV4aXQuY2F1c2UgfSlcbiAgICAgICAgICAgIGNvbnN0IHdyb3RlRXJyb3JQYXRoID0geWllbGQqIHdyaXRlYmFja0lmQ3VycmVudEtleUhhc2hGb3JSb3coXG4gICAgICAgICAgICAgIHJvd0lkLFxuICAgICAgICAgICAgICBrZXlIYXNoLFxuICAgICAgICAgICAgICBlcnJvclNuYXBzaG90LFxuICAgICAgICAgICAgICBcInNvdXJjZTplcnJvclwiLFxuICAgICAgICAgICAgICBgc291cmNlOiR7ZmllbGRQYXRofToke3Jvd0lkfTplcnJvcmAsXG4gICAgICAgICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGlmICh3cm90ZUVycm9yUGF0aCkge1xuICAgICAgICAgICAgICB5aWVsZCogcmVjb3JkU25hcHNob3QocmVwbGF5TW9kZSwgcmVwbGF5TG9nLCB7XG4gICAgICAgICAgICAgICAgX3RhZzogXCJSZXNvdXJjZVNuYXBzaG90XCIsXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICAgICAgICBmaWVsZFBhdGg6IHdyb3RlRXJyb3JQYXRoLFxuICAgICAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICAgICAgcGhhc2U6IFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICBzbmFwc2hvdDogZXJyb3JTbmFwc2hvdCxcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pLnBpcGUoRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKCkgPT4gRWZmZWN0LnZvaWQpKVxuXG4gICAgICAgIC8vIGxpc3QuaXRlbVx1RkYxQUlPIGZpYmVyIFx1NUZDNVx1OTg3Qlx1ODEzMVx1NzlCQlx1NTQwQ1x1NkI2NVx1NEU4Qlx1NTJBMSBGaWJlclJlZlx1RkYwQ1x1NTQyNlx1NTIxOVx1NEYxQVx1ODhBQlx1OEJFRlx1NTIyNFx1NEUzQVx1MjAxQ1x1NEU4Qlx1NTJBMVx1N0E5N1x1NTNFM1x1NTE4NVx1MjAxRFx1RkYwQ1x1NEVDRVx1ODAwQ1x1OTYzQlx1NjVBRFx1NTQwRVx1N0VFRFx1NTE5OVx1NTZERVx1NTE2NVx1NTNFM1x1MzAwMlxuICAgICAgICBjb25zdCBmaWJlciA9IHlpZWxkKiBFZmZlY3QuZm9ya1Njb3BlZChcbiAgICAgICAgICBFZmZlY3QubG9jYWxseShUYXNrUnVubmVyLmluU3luY1RyYW5zYWN0aW9uRmliZXIsIGZhbHNlKShpbyksXG4gICAgICAgIClcbiAgICAgICAgY29uc3QgbXlHZW4gPSAoZ2VuICs9IDEpXG4gICAgICAgIGluRmxpZ2h0LnNldChyb3dJZCwgeyBnZW46IG15R2VuLCBmaWJlciwga2V5SGFzaCB9KVxuXG4gICAgICAgIHlpZWxkKiBFZmZlY3QuZm9ya1Njb3BlZChcbiAgICAgICAgICBFZmZlY3QubG9jYWxseShUYXNrUnVubmVyLmluU3luY1RyYW5zYWN0aW9uRmliZXIsIGZhbHNlKShcbiAgICAgICAgICAgIEZpYmVyLmF3YWl0KGZpYmVyKSxcbiAgICAgICAgICApLnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QuemlwUmlnaHQoXG4gICAgICAgICAgICAgIEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gaW5GbGlnaHQuZ2V0KHJvd0lkKVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnQuZ2VuID09PSBteUdlbikge1xuICAgICAgICAgICAgICAgICAgaW5GbGlnaHQuZGVsZXRlKHJvd0lkKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgRWZmZWN0LnppcFJpZ2h0KFxuICAgICAgICAgICAgICBtb2RlID09PSBcImV4aGF1c3QtdHJhaWxpbmdcIiAmJiB0cmFpbGluZy5oYXMocm93SWQpXG4gICAgICAgICAgICAgICAgPyBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSB0cmFpbGluZy5nZXQocm93SWQpXG4gICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nLmRlbGV0ZShyb3dJZClcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICB5aWVsZCogc3RhcnRGZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5rZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0LmtleUhhc2gsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlNb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5TG9nLFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IEVmZmVjdC52b2lkLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKCgpID0+IEVmZmVjdC52b2lkKSxcbiAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICB9KVxuXG4gICAgcmVnaXN0ZXIoZmllbGRQYXRoLCAoc3RhdGU6IGFueSkgPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgeyBtb2R1bGVJZCwgaW5zdGFuY2VJZCB9ID0gZ2V0Qm91bmRTY29wZShib3VuZClcbiAgICAgICAgY29uc3QgcmVwbGF5TW9kZU9wdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihSZXBsYXlNb2RlQ29uZmlnVGFnKVxuICAgICAgICBjb25zdCByZXBsYXlNb2RlID0gT3B0aW9uLmlzU29tZShyZXBsYXlNb2RlT3B0KSA/IHJlcGxheU1vZGVPcHQudmFsdWUubW9kZSA6IFwibGl2ZVwiXG4gICAgICAgIGNvbnN0IHJlcGxheUxvZ09wdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihSZXBsYXlMb2cuUmVwbGF5TG9nKVxuICAgICAgICBjb25zdCByZXBsYXlMb2cgPSBPcHRpb24uaXNTb21lKHJlcGxheUxvZ09wdCkgPyByZXBsYXlMb2dPcHQudmFsdWUgOiB1bmRlZmluZWRcblxuICAgICAgICBjb25zdCBsaXN0VmFsdWUgPSBSb3dJZC5nZXRBdFBhdGgoc3RhdGUsIGxpc3RQYXRoKVxuICAgICAgICBjb25zdCBpdGVtczogUmVhZG9ubHlBcnJheTx1bmtub3duPiA9IEFycmF5LmlzQXJyYXkobGlzdFZhbHVlKSA/IGxpc3RWYWx1ZSA6IFtdXG4gICAgICAgIGNvbnN0IGlkcyA9IHN0b3JlLmVuc3VyZUxpc3QobGlzdFBhdGgsIGl0ZW1zKVxuXG4gICAgICAgIC8vIGRldi1tb2RlXHVGRjFBXHU1QkY5XHU5OTk2XHU4ODRDXHU1MDVBXHU0RTAwXHU2QjIxIGRlcHMgdHJhY2VcdUZGMDhcdTUzRUFcdTUwNUFcdThCQ0FcdTY1QURcdUZGMENcdTRFMERcdTVGNzFcdTU0Q0RcdTYyNjdcdTg4NENcdThCRURcdTRFNDlcdUZGMDlcdTMwMDJcbiAgICAgICAgY29uc3QgdHJhY2VLZXkgPSBgJHtpbnN0YW5jZUlkID8/IFwidW5rbm93blwifTo6c291cmNlOjoke2ZpZWxkUGF0aH1gXG4gICAgICAgIGlmIChpc0RldkVudigpICYmICh5aWVsZCogb25jZUluUnVuU2Vzc2lvbihgZGVwc190cmFjZV9zZXR0bGVkOiR7dHJhY2VLZXl9YCkpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHNhbXBsZSA9IGl0ZW1zWzBdXG4gICAgICAgICAgICBpZiAoc2FtcGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgdHJhY2VkID0gRGVwc1RyYWNlLnRyYWNlKChzKSA9PiAoZW50cnkubWV0YSBhcyBhbnkpLmtleShzKSwgc2FtcGxlIGFzIGFueSlcbiAgICAgICAgICAgICAgY29uc3QgcHJlZml4ZWRSZWFkcyA9IHRyYWNlZC5yZWFkcy5tYXAoKHIpID0+XG4gICAgICAgICAgICAgICAgciA/IGAke2xpc3RQYXRofVtdLiR7cn1gIDogYCR7bGlzdFBhdGh9W11gLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IGRpZmYgPSBEZXBzVHJhY2UuZGlmZkRlcHMoXG4gICAgICAgICAgICAgICAgKChlbnRyeS5tZXRhIGFzIGFueSkuZGVwcyA/PyBbXSkgYXMgUmVhZG9ubHlBcnJheTxzdHJpbmc+LFxuICAgICAgICAgICAgICAgIHByZWZpeGVkUmVhZHMsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogZW1pdERlcHNNaXNtYXRjaCh7XG4gICAgICAgICAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgICBraW5kOiBcInNvdXJjZVwiLFxuICAgICAgICAgICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgICAgICAgICAgZGlmZixcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyB0cmFjaW5nIGZhaWx1cmUgc2hvdWxkIG5ldmVyIGJyZWFrIHJlZnJlc2ggZmxvd1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBpdGVtcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBjb25zdCByb3dJZCA9IGlkc1tpbmRleF1cbiAgICAgICAgICBpZiAoIXJvd0lkKSBjb250aW51ZVxuXG4gICAgICAgICAgY29uc3QgY29uY3JldGVQYXRoID0gUm93SWQudG9MaXN0SXRlbVZhbHVlUGF0aChsaXN0UGF0aCwgaW5kZXgsIGl0ZW1QYXRoKVxuICAgICAgICAgIGNvbnN0IHByZXZTbmFwc2hvdCA9IFJvd0lkLmdldEF0UGF0aChzdGF0ZSwgY29uY3JldGVQYXRoKSBhcyBhbnlcblxuICAgICAgICAgIGxldCBrZXk6IHVua25vd25cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAga2V5ID0gKGVudHJ5Lm1ldGEgYXMgYW55KS5rZXkoaXRlbXNbaW5kZXhdKVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAga2V5ID0gdW5kZWZpbmVkXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IGluRmxpZ2h0LmdldChyb3dJZClcblxuICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdHJhaWxpbmcuZGVsZXRlKHJvd0lkKVxuICAgICAgICAgICAgaW5GbGlnaHQuZGVsZXRlKHJvd0lkKVxuXG4gICAgICAgICAgICAvLyBcdTgyRTVcdTVERjJcdTY2MkYgY2xlYW4gaWRsZVx1RkYwQ1x1NTIxOVx1NjVFMFx1OTcwMFx1OTFDRFx1NTkwRFx1NTE5OVx1NTZERVx1RkYwOFx1OTA3Rlx1NTE0RFx1NjVFMFx1NjEwRlx1NEU0OSBwYXRjaCBcdTVCRkNcdTgxRjQgVUkgXHU2Mjk2XHU1MkE4XHVGRjA5XHUzMDAyXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHByZXZTbmFwc2hvdCAmJlxuICAgICAgICAgICAgICB0eXBlb2YgcHJldlNuYXBzaG90ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICAgIHByZXZTbmFwc2hvdC5zdGF0dXMgPT09IFwiaWRsZVwiICYmXG4gICAgICAgICAgICAgIHByZXZTbmFwc2hvdC5kYXRhID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgcHJldlNuYXBzaG90LmVycm9yID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpZGxlU25hcHNob3QgPSBTbmFwc2hvdC5pZGxlKClcbiAgICAgICAgICAgIGNvbnN0IHdyb3RlSWRsZVBhdGggPSB5aWVsZCogc2V0U25hcHNob3RGb3JSb3dJblR4bihcbiAgICAgICAgICAgICAgcm93SWQsXG4gICAgICAgICAgICAgIGlkbGVTbmFwc2hvdCxcbiAgICAgICAgICAgICAgXCJzb3VyY2U6aWRsZVwiLFxuICAgICAgICAgICAgICBgc291cmNlOiR7ZmllbGRQYXRofToke3Jvd0lkfTppZGxlYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGlmICh3cm90ZUlkbGVQYXRoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGV2ZW50OiBSZXBsYXlMb2cuUmVwbGF5TG9nRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgX3RhZzogXCJSZXNvdXJjZVNuYXBzaG90XCIsXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICAgICAgICBmaWVsZFBhdGg6IHdyb3RlSWRsZVBhdGgsXG4gICAgICAgICAgICAgICAga2V5SGFzaDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHBoYXNlOiBcImlkbGVcIixcbiAgICAgICAgICAgICAgICBzbmFwc2hvdDogaWRsZVNuYXBzaG90LFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUlkLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlY29yZFJlcGxheUV2ZW50KGJvdW5kLCBldmVudClcbiAgICAgICAgICAgICAgeWllbGQqIHJlY29yZFNuYXBzaG90KHJlcGxheU1vZGUsIHJlcGxheUxvZywgZXZlbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGggPSBoYXNoS2V5KGtleSlcblxuICAgICAgICAgIC8vIGtleUhhc2ggXHU2NzJBXHU1M0Q4XHU1MzE2XHVGRjFBXHU5MDdGXHU1MTREXHU2NUUwXHU2MTBGXHU0RTQ5XHU5MUNEXHU1OTBEXHU1MjM3XHU2NUIwXHVGRjA4XHU1NDBDXHU2NUY2XHU0RkREXHU0RjRGIGluLWZsaWdodFx1RkYwOVx1MzAwMlxuICAgICAgICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnQua2V5SGFzaCA9PT0gaCkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBcdTk3NUUgaW4tZmxpZ2h0XHVGRjFBXHU4MkU1XHU1RjUzXHU1MjREIHNuYXBzaG90LmtleUhhc2ggXHU1REYyXHU1MzM5XHU5MTREXHVGRjBDXHU1MjE5XHU4OUM2XHU0RTNBXHU1REYyXHU2NjJGXHU2NzAwXHU2NUIwXHU2NTcwXHU2MzZFXHVGRjA4XHU5MDdGXHU1MTREXHU1MTY4XHU5MUNGIHJlZnJlc2ggXHU5MDIwXHU2MjEwXHU2MjQwXHU2NzA5XHU4ODRDXHU2Mjk2XHU1MkE4XHVGRjA5XHUzMDAyXG4gICAgICAgICAgY29uc3QgcHJldktleUhhc2ggPVxuICAgICAgICAgICAgcHJldlNuYXBzaG90ICYmIHR5cGVvZiBwcmV2U25hcHNob3QgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgPyAocHJldlNuYXBzaG90IGFzIGFueSkua2V5SGFzaFxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgIGlmICghY3VycmVudCAmJiBwcmV2S2V5SGFzaCA9PT0gaCkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobW9kZSA9PT0gXCJleGhhdXN0LXRyYWlsaW5nXCIgJiYgY3VycmVudCkge1xuICAgICAgICAgICAgdHJhaWxpbmcuc2V0KHJvd0lkLCB7IGtleSwga2V5SGFzaDogaCB9KVxuICAgICAgICAgICAgY29uc3QgbG9hZGluZ1NuYXBzaG90ID0gU25hcHNob3QubG9hZGluZyh7IGtleUhhc2g6IGggfSlcbiAgICAgICAgICAgIGNvbnN0IHdyb3RlTG9hZGluZ1BhdGggPSB5aWVsZCogc2V0U25hcHNob3RGb3JSb3dJblR4bihcbiAgICAgICAgICAgICAgcm93SWQsXG4gICAgICAgICAgICAgIGxvYWRpbmdTbmFwc2hvdCxcbiAgICAgICAgICAgICAgXCJzb3VyY2U6bG9hZGluZ1wiLFxuICAgICAgICAgICAgICBgc291cmNlOiR7ZmllbGRQYXRofToke3Jvd0lkfTpsb2FkaW5nYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGlmICh3cm90ZUxvYWRpbmdQYXRoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGV2ZW50OiBSZXBsYXlMb2cuUmVwbGF5TG9nRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgX3RhZzogXCJSZXNvdXJjZVNuYXBzaG90XCIsXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICAgICAgICBmaWVsZFBhdGg6IHdyb3RlTG9hZGluZ1BhdGgsXG4gICAgICAgICAgICAgICAga2V5SGFzaDogaCxcbiAgICAgICAgICAgICAgICBwaGFzZTogXCJsb2FkaW5nXCIsXG4gICAgICAgICAgICAgICAgc25hcHNob3Q6IGxvYWRpbmdTbmFwc2hvdCxcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZWNvcmRSZXBsYXlFdmVudChib3VuZCwgZXZlbnQpXG4gICAgICAgICAgICAgIHlpZWxkKiByZWNvcmRTbmFwc2hvdChyZXBsYXlNb2RlLCByZXBsYXlMb2csIGV2ZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobW9kZSA9PT0gXCJzd2l0Y2hcIiAmJiBjdXJyZW50KSB7XG4gICAgICAgICAgICAvLyBcdTRFMERcdTRGOURcdThENTZcdTUzRDZcdTZEODhcdTZCNjNcdTc4NkVcdTYwMjdcdUZGMUFcdTY1RTdcdTdFRDNcdTY3OUNcdTUxOTlcdTU2REVcdTRGMUFcdTg4QUIga2V5SGFzaCBnYXRlIFx1NEUyMlx1NUYwM1x1MzAwMlxuICAgICAgICAgICAgdHJhaWxpbmcuZGVsZXRlKHJvd0lkKVxuICAgICAgICAgICAgaW5GbGlnaHQuZGVsZXRlKHJvd0lkKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHlpZWxkKiBzdGFydEZldGNoKHJvd0lkLCBrZXksIGgsIHJlcGxheU1vZGUsIHJlcGxheUxvZylcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKVxuXG4gICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gIH1cblxuICAvLyBpbi1mbGlnaHQgc3RhdGUgKHBlciBmaWVsZClcbiAgbGV0IGluRmxpZ2h0OlxuICAgIHwge1xuICAgICAgICByZWFkb25seSBnZW46IG51bWJlclxuICAgICAgICByZWFkb25seSBmaWJlcjogRmliZXIuUnVudGltZUZpYmVyPHZvaWQsIG5ldmVyPlxuICAgICAgICByZWFkb25seSBrZXlIYXNoOiBzdHJpbmdcbiAgICAgIH1cbiAgICB8IHVuZGVmaW5lZFxuICBsZXQgZ2VuID0gMFxuICBsZXQgdHJhaWxpbmc6IHsgcmVhZG9ubHkga2V5OiB1bmtub3duOyByZWFkb25seSBrZXlIYXNoOiBzdHJpbmcgfSB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGNvbmN1cnJlbmN5ID0gKGVudHJ5Lm1ldGEgYXMgYW55KS5jb25jdXJyZW5jeSBhc1xuICAgIHwgXCJzd2l0Y2hcIlxuICAgIHwgXCJleGhhdXN0LXRyYWlsaW5nXCJcbiAgICB8IHVuZGVmaW5lZFxuICBjb25zdCBtb2RlID0gY29uY3VycmVuY3kgPz8gXCJzd2l0Y2hcIlxuXG4gIGNvbnN0IHN0YXJ0RmV0Y2ggPSAoXG4gICAga2V5OiB1bmtub3duLFxuICAgIGtleUhhc2g6IHN0cmluZyxcbiAgICByZXBsYXlNb2RlOiBcImxpdmVcIiB8IFwicmVwbGF5XCIsXG4gICAgcmVwbGF5TG9nOiBSZXBsYXlMb2cuUmVwbGF5TG9nU2VydmljZSB8IHVuZGVmaW5lZCxcbiAgKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9PlxuICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGNvbnN0IHsgbW9kdWxlSWQsIGluc3RhbmNlSWQgfSA9IGdldEJvdW5kU2NvcGUoYm91bmQpXG5cbiAgICAgIC8vIDEpIHBlbmRpbmdcdUZGMUFcdTU0MENcdTZCNjVcdTUxOTlcdTUxNjUgbG9hZGluZyBzbmFwc2hvdFx1RkYwOFx1ODQzRFx1NTcyOFx1NUY1M1x1NTI0RFx1NEU4Qlx1NTJBMVx1N0E5N1x1NTNFM1x1RkYwOVx1MzAwMlxuICAgICAgbGV0IGxvYWRpbmdTbmFwc2hvdDogdW5rbm93biA9IFNuYXBzaG90LmxvYWRpbmcoeyBrZXlIYXNoIH0pXG4gICAgICBpZiAocmVwbGF5TW9kZSA9PT0gXCJyZXBsYXlcIiAmJiByZXBsYXlMb2cpIHtcbiAgICAgICAgY29uc3QgcmVwbGF5TG9hZGluZyA9IHlpZWxkKiByZXBsYXlMb2cuY29uc3VtZU5leHRSZXNvdXJjZVNuYXBzaG90KHtcbiAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgICBrZXlIYXNoLFxuICAgICAgICAgIHBoYXNlOiBcImxvYWRpbmdcIixcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKHJlcGxheUxvYWRpbmcpIHtcbiAgICAgICAgICBsb2FkaW5nU25hcHNob3QgPSByZXBsYXlMb2FkaW5nLnNuYXBzaG90XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHdyb3RlTG9hZGluZyA9IHlpZWxkKiBzZXRTbmFwc2hvdEluVHhuKFxuICAgICAgICBib3VuZCxcbiAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICBsb2FkaW5nU25hcHNob3QsXG4gICAgICAgIFwic291cmNlOmxvYWRpbmdcIixcbiAgICAgICAgYHNvdXJjZToke2ZpZWxkUGF0aH06bG9hZGluZ2AsXG4gICAgICAgIHN0ZXAuZGVidWdJbmZvPy5ncmFwaE5vZGVJZCxcbiAgICAgIClcbiAgICAgIGlmICh3cm90ZUxvYWRpbmcpIHtcbiAgICAgICAgY29uc3QgZXZlbnQ6IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCA9IHtcbiAgICAgICAgICBfdGFnOiBcIlJlc291cmNlU25hcHNob3RcIixcbiAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgICBrZXlIYXNoLFxuICAgICAgICAgIHBoYXNlOiBcImxvYWRpbmdcIixcbiAgICAgICAgICBzbmFwc2hvdDogbG9hZGluZ1NuYXBzaG90LFxuICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICBpbnN0YW5jZUlkLFxuICAgICAgICB9XG4gICAgICAgIHJlY29yZFJlcGxheUV2ZW50KGJvdW5kLCBldmVudClcbiAgICAgICAgeWllbGQqIHJlY29yZFNuYXBzaG90KHJlcGxheU1vZGUsIHJlcGxheUxvZywgZXZlbnQpXG4gICAgICB9XG5cbiAgICAgIC8vIDIpIElPXHVGRjFBXHU1NzI4XHU1NDBFXHU1M0YwIGZpYmVyIFx1NEUyRFx1OEZEMFx1ODg0Q1x1RkYwOFx1OTA3Rlx1NTE0RFx1OTYzQlx1NTg1RVx1NUY1M1x1NTI0RFx1NEU4Qlx1NTJBMVx1RkYwOVx1MzAwMlxuICAgICAgY29uc3QgaW8gPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmIChyZXBsYXlNb2RlID09PSBcInJlcGxheVwiICYmIHJlcGxheUxvZykge1xuICAgICAgICAgIC8vIFx1OEJBOSBsb2FkaW5nIFx1NjNEMFx1NEVBNFx1NTE0OFx1NTNFRlx1ODlDMVx1RkYwQ1x1NTE4RFx1OTFDRFx1OEQ1Qlx1N0VDOFx1NjAwMVx1RkYwOFx1NEZERFx1NjMwMVx1MjAxQ1x1NUYwMlx1NkI2NVx1OEQ0NFx1NkU5MFx1MjAxRFx1NzY4NFx1NjVGNlx1OTVGNFx1N0VCRlx1N0VEM1x1Njc4NFx1RkYwOVx1MzAwMlxuICAgICAgICAgIHlpZWxkKiBFZmZlY3QueWllbGROb3coKVxuICAgICAgICAgIGNvbnN0IHJlcGxheWVkID0geWllbGQqIHJlcGxheUxvZy5jb25zdW1lTmV4dFJlc291cmNlU25hcHNob3Qoe1xuICAgICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBpZiAoIXJlcGxheWVkKSByZXR1cm4geWllbGQqIEVmZmVjdC52b2lkXG5cbiAgICAgICAgICBpZiAocmVwbGF5ZWQucGhhc2UgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgICBjb25zdCBldmVudDogUmVwbGF5TG9nLlJlcGxheUxvZ0V2ZW50ID0ge1xuICAgICAgICAgICAgICBfdGFnOiBcIlJlc291cmNlU25hcHNob3RcIixcbiAgICAgICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgICAgICBrZXlIYXNoLFxuICAgICAgICAgICAgICBwaGFzZTogXCJzdWNjZXNzXCIsXG4gICAgICAgICAgICAgIHNuYXBzaG90OiByZXBsYXllZC5zbmFwc2hvdCxcbiAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkKiB3cml0ZWJhY2tJZkN1cnJlbnRLZXlIYXNoKFxuICAgICAgICAgICAgICBib3VuZCxcbiAgICAgICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgICAgICBrZXlIYXNoLFxuICAgICAgICAgICAgICByZXBsYXllZC5zbmFwc2hvdCxcbiAgICAgICAgICAgICAgXCJzb3VyY2U6c3VjY2Vzc1wiLFxuICAgICAgICAgICAgICBgc291cmNlOiR7ZmllbGRQYXRofTpzdWNjZXNzYCxcbiAgICAgICAgICAgICAgc3RlcC5kZWJ1Z0luZm8/LmdyYXBoTm9kZUlkLFxuICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcGxheWVkLnBoYXNlID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50OiBSZXBsYXlMb2cuUmVwbGF5TG9nRXZlbnQgPSB7XG4gICAgICAgICAgICAgIF90YWc6IFwiUmVzb3VyY2VTbmFwc2hvdFwiLFxuICAgICAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICAgIHBoYXNlOiBcImVycm9yXCIsXG4gICAgICAgICAgICAgIHNuYXBzaG90OiByZXBsYXllZC5zbmFwc2hvdCxcbiAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkKiB3cml0ZWJhY2tJZkN1cnJlbnRLZXlIYXNoKFxuICAgICAgICAgICAgICBib3VuZCxcbiAgICAgICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgICAgICBrZXlIYXNoLFxuICAgICAgICAgICAgICByZXBsYXllZC5zbmFwc2hvdCxcbiAgICAgICAgICAgICAgXCJzb3VyY2U6ZXJyb3JcIixcbiAgICAgICAgICAgICAgYHNvdXJjZToke2ZpZWxkUGF0aH06ZXJyb3JgLFxuICAgICAgICAgICAgICBzdGVwLmRlYnVnSW5mbz8uZ3JhcGhOb2RlSWQsXG4gICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LnZvaWRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YWNrID0geWllbGQqIGdldE1pZGRsZXdhcmVTdGFjaygpXG5cbiAgICAgICAgY29uc3QgcmVnaXN0cnlPcHQgPSB5aWVsZCogRWZmZWN0LnNlcnZpY2VPcHRpb24oXG4gICAgICAgICAgUmVzb3VyY2VJbnRlcm5hbC5SZXNvdXJjZVJlZ2lzdHJ5VGFnLFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gT3B0aW9uLmlzU29tZShyZWdpc3RyeU9wdCkgPyByZWdpc3RyeU9wdC52YWx1ZSA6IHVuZGVmaW5lZFxuICAgICAgICBjb25zdCBzcGVjID0gcmVnaXN0cnk/LnNwZWNzLmdldChyZXNvdXJjZUlkKVxuXG4gICAgICAgIGlmICghc3BlYykge1xuICAgICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LnZvaWRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvYWRFZmZlY3QgPSAoc3BlYy5sb2FkIGFzIGFueSkoa2V5KSBhcyBFZmZlY3QuRWZmZWN0PGFueSwgYW55LCBhbnk+XG5cbiAgICAgICAgY29uc3QgbWV0YTogYW55ID0ge1xuICAgICAgICAgIG1vZHVsZUlkLFxuICAgICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgIHJlc291cmNlSWQsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgdHJhaXROb2RlSWQ6IHN0ZXAuZGVidWdJbmZvPy5ncmFwaE5vZGVJZCxcbiAgICAgICAgICBzdGVwSWQ6IHN0ZXAuaWQsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoISh0eXBlb2YgbWV0YS5vcFNlcSA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUobWV0YS5vcFNlcSkpKSB7XG4gICAgICAgICAgY29uc3Qgc2Vzc2lvbk9wdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihSdW5TZXNzaW9uVGFnKVxuICAgICAgICAgIGlmIChPcHRpb24uaXNTb21lKHNlc3Npb25PcHQpKSB7XG4gICAgICAgICAgICBjb25zdCBzZXFLZXkgPSBpbnN0YW5jZUlkID8/IFwiZ2xvYmFsXCJcbiAgICAgICAgICAgIG1ldGEub3BTZXEgPSBzZXNzaW9uT3B0LnZhbHVlLmxvY2FsLm5leHRTZXEoXCJvcFNlcVwiLCBzZXFLZXkpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3AgPSBFZmZlY3RPcC5tYWtlPGFueSwgYW55LCBhbnk+KHtcbiAgICAgICAgICBraW5kOiBcInRyYWl0LXNvdXJjZVwiLFxuICAgICAgICAgIG5hbWU6IHJlc291cmNlSWQsXG4gICAgICAgICAgZWZmZWN0OiBsb2FkRWZmZWN0LFxuICAgICAgICAgIG1ldGEsXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgZXhpdCA9IHlpZWxkKiBFZmZlY3QuZXhpdChFZmZlY3RPcC5ydW4ob3AsIHN0YWNrKSlcblxuICAgICAgICAvLyAzKSB3cml0ZWJhY2tcdUZGMUFcdTRFRTUga2V5SGFzaCBnYXRlIFx1OTYzMlx1NkI2Mlx1NjVFN1x1N0VEM1x1Njc5Q1x1NTZERVx1NTE5OVx1NTIzMFx1NjVCMCBrZXkgXHU0RTBBXHUzMDAyXG4gICAgICAgIGlmIChleGl0Ll90YWcgPT09IFwiU3VjY2Vzc1wiKSB7XG4gICAgICAgICAgY29uc3Qgc3VjY2Vzc1NuYXBzaG90ID0gU25hcHNob3Quc3VjY2Vzcyh7IGtleUhhc2gsIGRhdGE6IGV4aXQudmFsdWUgfSlcbiAgICAgICAgICBjb25zdCBldmVudDogUmVwbGF5TG9nLlJlcGxheUxvZ0V2ZW50ID0ge1xuICAgICAgICAgICAgX3RhZzogXCJSZXNvdXJjZVNuYXBzaG90XCIsXG4gICAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICAgIHBoYXNlOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgICAgIHNuYXBzaG90OiBzdWNjZXNzU25hcHNob3QsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHdyb3RlU3VjY2VzcyA9IHlpZWxkKiB3cml0ZWJhY2tJZkN1cnJlbnRLZXlIYXNoKFxuICAgICAgICAgICAgYm91bmQsXG4gICAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAgICBrZXlIYXNoLFxuICAgICAgICAgICAgc3VjY2Vzc1NuYXBzaG90LFxuICAgICAgICAgICAgXCJzb3VyY2U6c3VjY2Vzc1wiLFxuICAgICAgICAgICAgYHNvdXJjZToke2ZpZWxkUGF0aH06c3VjY2Vzc2AsXG4gICAgICAgICAgICBzdGVwLmRlYnVnSW5mbz8uZ3JhcGhOb2RlSWQsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICApXG4gICAgICAgICAgaWYgKHdyb3RlU3VjY2Vzcykge1xuICAgICAgICAgICAgeWllbGQqIHJlY29yZFNuYXBzaG90KHJlcGxheU1vZGUsIHJlcGxheUxvZywgZXZlbnQpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVycm9yU25hcHNob3QgPSBTbmFwc2hvdC5lcnJvcih7IGtleUhhc2gsIGVycm9yOiBleGl0LmNhdXNlIH0pXG4gICAgICAgICAgY29uc3QgZXZlbnQ6IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCA9IHtcbiAgICAgICAgICAgIF90YWc6IFwiUmVzb3VyY2VTbmFwc2hvdFwiLFxuICAgICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICBwaGFzZTogXCJlcnJvclwiLFxuICAgICAgICAgICAgc25hcHNob3Q6IGVycm9yU25hcHNob3QsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHdyb3RlRXJyb3IgPSB5aWVsZCogd3JpdGViYWNrSWZDdXJyZW50S2V5SGFzaChcbiAgICAgICAgICAgIGJvdW5kLFxuICAgICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICAgIGVycm9yU25hcHNob3QsXG4gICAgICAgICAgICBcInNvdXJjZTplcnJvclwiLFxuICAgICAgICAgICAgYHNvdXJjZToke2ZpZWxkUGF0aH06ZXJyb3JgLFxuICAgICAgICAgICAgc3RlcC5kZWJ1Z0luZm8/LmdyYXBoTm9kZUlkLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgKVxuICAgICAgICAgIGlmICh3cm90ZUVycm9yKSB7XG4gICAgICAgICAgICB5aWVsZCogcmVjb3JkU25hcHNob3QocmVwbGF5TW9kZSwgcmVwbGF5TG9nLCBldmVudClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pLnBpcGUoXG4gICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKCgpID0+IEVmZmVjdC52b2lkKSxcbiAgICAgIClcblxuICAgICAgLy8gXHU0RTBEXHU3QjQ5XHU1Rjg1IElPIFx1NUI4Q1x1NjIxMFx1RkYxQWZvcmtTY29wZWQgXHU2MzAyXHU1MjMwIHJ1bnRpbWUgc2NvcGVcdUZGMENcdTRGRERcdThCQzFcdTUzNzhcdThGN0RcdTY1RjZcdTgxRUFcdTUyQTggaW50ZXJydXB0XHUzMDAyXG4gICAgICBjb25zdCBmaWJlciA9IHlpZWxkKiBFZmZlY3QuZm9ya1Njb3BlZChcbiAgICAgICAgRWZmZWN0LmxvY2FsbHkoVGFza1J1bm5lci5pblN5bmNUcmFuc2FjdGlvbkZpYmVyLCBmYWxzZSkoaW8pLFxuICAgICAgKVxuICAgICAgY29uc3QgbXlHZW4gPSAoZ2VuICs9IDEpXG4gICAgICBpbkZsaWdodCA9IHsgZ2VuOiBteUdlbiwgZmliZXIsIGtleUhhc2ggfVxuXG4gICAgICAvLyBpbi1mbGlnaHQgXHU3RUQzXHU2NzVGXHU1NDBFXHU2RTA1XHU3NDA2XHVGRjBDXHU1RTc2XHU1NzI4IGV4aGF1c3QtdHJhaWxpbmcgXHU2QTIxXHU1RjBGXHU0RTBCXHU4ODY1XHU4REQxXHU0RTAwXHU2QjIxIHRyYWlsaW5nXHUzMDAyXG4gICAgICB5aWVsZCogRWZmZWN0LmZvcmtTY29wZWQoXG4gICAgICAgIEVmZmVjdC5sb2NhbGx5KFRhc2tSdW5uZXIuaW5TeW5jVHJhbnNhY3Rpb25GaWJlciwgZmFsc2UpKFxuICAgICAgICAgIEZpYmVyLmF3YWl0KGZpYmVyKSxcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIEVmZmVjdC56aXBSaWdodChcbiAgICAgICAgICAgIEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGluRmxpZ2h0ICYmIGluRmxpZ2h0LmdlbiA9PT0gbXlHZW4pIHtcbiAgICAgICAgICAgICAgICBpbkZsaWdodCA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICAgIEVmZmVjdC56aXBSaWdodChcbiAgICAgICAgICAgIG1vZGUgPT09IFwiZXhoYXVzdC10cmFpbGluZ1wiICYmIHRyYWlsaW5nXG4gICAgICAgICAgICAgID8gRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRyYWlsaW5nXG4gICAgICAgICAgICAgICAgICB0cmFpbGluZyA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHN0YXJ0RmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgbmV4dC5rZXksXG4gICAgICAgICAgICAgICAgICAgICAgbmV4dC5rZXlIYXNoLFxuICAgICAgICAgICAgICAgICAgICAgIHJlcGxheU1vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5TG9nLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgOiBFZmZlY3Qudm9pZCxcbiAgICAgICAgICApLFxuICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKCgpID0+IEVmZmVjdC52b2lkKSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICB9KVxuXG4gIHJlZ2lzdGVyKGZpZWxkUGF0aCwgKHN0YXRlOiBhbnkpID0+XG4gICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgY29uc3QgeyBtb2R1bGVJZCwgaW5zdGFuY2VJZCB9ID0gZ2V0Qm91bmRTY29wZShib3VuZClcbiAgICAgIGNvbnN0IHJlcGxheU1vZGVPcHQgPSB5aWVsZCogRWZmZWN0LnNlcnZpY2VPcHRpb24oUmVwbGF5TW9kZUNvbmZpZ1RhZylcbiAgICAgIGNvbnN0IHJlcGxheU1vZGUgPSBPcHRpb24uaXNTb21lKHJlcGxheU1vZGVPcHQpID8gcmVwbGF5TW9kZU9wdC52YWx1ZS5tb2RlIDogXCJsaXZlXCJcbiAgICAgIGNvbnN0IHJlcGxheUxvZ09wdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihSZXBsYXlMb2cuUmVwbGF5TG9nKVxuICAgICAgY29uc3QgcmVwbGF5TG9nID0gT3B0aW9uLmlzU29tZShyZXBsYXlMb2dPcHQpID8gcmVwbGF5TG9nT3B0LnZhbHVlIDogdW5kZWZpbmVkXG5cbiAgICAgIGxldCBrZXk6IHVua25vd25cbiAgICAgIHRyeSB7XG4gICAgICAgIGtleSA9IChlbnRyeS5tZXRhIGFzIGFueSkua2V5KHN0YXRlKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGtleSA9IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICAvLyBkZXYtbW9kZVx1RkYxQVx1NEZBNlx1NkQ0QiBrZXlTZWxlY3RvciBcdTc2ODRcdTVCOUVcdTk2NDVcdThCRkJcdTUzRDZcdThERUZcdTVGODRcdTRFMEVcdTU4RjBcdTY2MEUgZGVwcyBcdTc2ODRcdTVERUVcdTVGMDJcdUZGMDhcdTRFQzVcdTUwNUFcdThCQ0FcdTY1QURcdUZGMENcdTRFMERcdTVGNzFcdTU0Q0RcdTYyNjdcdTg4NENcdThCRURcdTRFNDlcdUZGMDlcdTMwMDJcbiAgICAgIGNvbnN0IHRyYWNlS2V5ID0gYCR7aW5zdGFuY2VJZCA/PyBcInVua25vd25cIn06OnNvdXJjZTo6JHtmaWVsZFBhdGh9YFxuICAgICAgaWYgKGlzRGV2RW52KCkgJiYgKHlpZWxkKiBvbmNlSW5SdW5TZXNzaW9uKGBkZXBzX3RyYWNlX3NldHRsZWQ6JHt0cmFjZUtleX1gKSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0cmFjZWQgPSBEZXBzVHJhY2UudHJhY2UoKHMpID0+IChlbnRyeS5tZXRhIGFzIGFueSkua2V5KHMpLCBzdGF0ZSlcbiAgICAgICAgICBjb25zdCBkaWZmID0gRGVwc1RyYWNlLmRpZmZEZXBzKFxuICAgICAgICAgICAgKChlbnRyeS5tZXRhIGFzIGFueSkuZGVwcyA/PyBbXSkgYXMgUmVhZG9ubHlBcnJheTxzdHJpbmc+LFxuICAgICAgICAgICAgdHJhY2VkLnJlYWRzLFxuICAgICAgICAgIClcbiAgICAgICAgICBpZiAoZGlmZikge1xuICAgICAgICAgICAgeWllbGQqIGVtaXREZXBzTWlzbWF0Y2goe1xuICAgICAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAga2luZDogXCJzb3VyY2VcIixcbiAgICAgICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgICAgICBkaWZmLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIHRyYWNpbmcgZmFpbHVyZSBzaG91bGQgbmV2ZXIgYnJlYWsgcmVmcmVzaCBmbG93XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8ga2V5IFx1NTNEOFx1N0E3QVx1RkYxQVx1NTQwQ1x1NkI2NSBpZGxlIFx1NkUwNVx1N0E3QVx1RkYwOFx1NUU3Nlx1NEUyRFx1NjVBRCBpbi1mbGlnaHRcdUZGMDlcdTMwMDJcbiAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoaW5GbGlnaHQpIHtcbiAgICAgICAgICB5aWVsZCogRmliZXIuaW50ZXJydXB0Rm9yayhpbkZsaWdodC5maWJlcilcbiAgICAgICAgICBpbkZsaWdodCA9IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICAgIHRyYWlsaW5nID0gdW5kZWZpbmVkXG5cbiAgICAgICAgY29uc3QgaWRsZVNuYXBzaG90ID0gU25hcHNob3QuaWRsZSgpXG4gICAgICAgIGNvbnN0IHdyb3RlSWRsZSA9IHlpZWxkKiBzZXRTbmFwc2hvdEluVHhuKFxuICAgICAgICAgIGJvdW5kLFxuICAgICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgICBpZGxlU25hcHNob3QsXG4gICAgICAgICAgXCJzb3VyY2U6aWRsZVwiLFxuICAgICAgICAgIGBzb3VyY2U6JHtmaWVsZFBhdGh9OmlkbGVgLFxuICAgICAgICAgIHN0ZXAuZGVidWdJbmZvPy5ncmFwaE5vZGVJZCxcbiAgICAgICAgKVxuICAgICAgICBpZiAod3JvdGVJZGxlKSB7XG4gICAgICAgICAgY29uc3QgZXZlbnQ6IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCA9IHtcbiAgICAgICAgICAgIF90YWc6IFwiUmVzb3VyY2VTbmFwc2hvdFwiLFxuICAgICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgICAgIGtleUhhc2g6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHBoYXNlOiBcImlkbGVcIixcbiAgICAgICAgICAgIHNuYXBzaG90OiBpZGxlU25hcHNob3QsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgICAgfVxuICAgICAgICAgIHJlY29yZFJlcGxheUV2ZW50KGJvdW5kLCBldmVudClcbiAgICAgICAgICB5aWVsZCogcmVjb3JkU25hcHNob3QocmVwbGF5TW9kZSwgcmVwbGF5TG9nLCBldmVudClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgaCA9IGhhc2hLZXkoa2V5KVxuXG4gICAgICBpZiAobW9kZSA9PT0gXCJleGhhdXN0LXRyYWlsaW5nXCIgJiYgaW5GbGlnaHQpIHtcbiAgICAgICAgLy8gXHU1RkQ5XHU3ODhDXHU2NUY2XHVGRjFBXHU4QkIwXHU1RjU1IHRyYWlsaW5nXHVGRjBDXHU1RTc2XHU3QUNCXHU1MzczXHU2NkY0XHU2NUIwXHU1MjMwXHU2NzAwXHU2NUIwIGxvYWRpbmdcdUZGMDhcdTY1RTcgaW4tZmxpZ2h0IFx1NTE5OVx1NTZERVx1NEYxQVx1ODhBQiBrZXlIYXNoIGdhdGUgXHU2MkU2XHU0RjRGXHVGRjA5XHUzMDAyXG4gICAgICAgIHRyYWlsaW5nID0geyBrZXksIGtleUhhc2g6IGggfVxuICAgICAgICBjb25zdCBsb2FkaW5nU25hcHNob3QgPSBTbmFwc2hvdC5sb2FkaW5nKHsga2V5SGFzaDogaCB9KVxuICAgICAgICBjb25zdCB3cm90ZUxvYWRpbmcgPSB5aWVsZCogc2V0U25hcHNob3RJblR4bihcbiAgICAgICAgICBib3VuZCxcbiAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAgbG9hZGluZ1NuYXBzaG90LFxuICAgICAgICAgIFwic291cmNlOmxvYWRpbmdcIixcbiAgICAgICAgICBgc291cmNlOiR7ZmllbGRQYXRofTpsb2FkaW5nYCxcbiAgICAgICAgICBzdGVwLmRlYnVnSW5mbz8uZ3JhcGhOb2RlSWQsXG4gICAgICAgIClcbiAgICAgICAgaWYgKHdyb3RlTG9hZGluZykge1xuICAgICAgICAgIGNvbnN0IGV2ZW50OiBSZXBsYXlMb2cuUmVwbGF5TG9nRXZlbnQgPSB7XG4gICAgICAgICAgICBfdGFnOiBcIlJlc291cmNlU25hcHNob3RcIixcbiAgICAgICAgICAgIHJlc291cmNlSWQsXG4gICAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAgICBrZXlIYXNoOiBoLFxuICAgICAgICAgICAgcGhhc2U6IFwibG9hZGluZ1wiLFxuICAgICAgICAgICAgc25hcHNob3Q6IGxvYWRpbmdTbmFwc2hvdCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIG1vZHVsZUlkLFxuICAgICAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVjb3JkUmVwbGF5RXZlbnQoYm91bmQsIGV2ZW50KVxuICAgICAgICAgIHlpZWxkKiByZWNvcmRTbmFwc2hvdChyZXBsYXlNb2RlLCByZXBsYXlMb2csIGV2ZW50KVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAobW9kZSA9PT0gXCJzd2l0Y2hcIiAmJiBpbkZsaWdodCkge1xuICAgICAgICB5aWVsZCogRmliZXIuaW50ZXJydXB0Rm9yayhpbkZsaWdodC5maWJlcilcbiAgICAgICAgaW5GbGlnaHQgPSB1bmRlZmluZWRcbiAgICAgICAgdHJhaWxpbmcgPSB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgLy8gc3RhcnQgZmV0Y2ggKHBlbmRpbmcgdHggKyBmb3JrIElPKVxuICAgICAgeWllbGQqIHN0YXJ0RmV0Y2goa2V5LCBoLCByZXBsYXlNb2RlLCByZXBsYXlMb2cpXG4gICAgfSksXG4gIClcblxuICByZXR1cm4gRWZmZWN0LnZvaWRcbn1cbiIsICJleHBvcnQgaW50ZXJmYWNlIERlcHNUcmFjZVJlc3VsdDxUPiB7XG4gIHJlYWRvbmx5IHZhbHVlOiBUXG4gIHJlYWRvbmx5IHJlYWRzOiBSZWFkb25seUFycmF5PHN0cmluZz5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXBzRGlmZiB7XG4gIHJlYWRvbmx5IHJlYWRzOiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgcmVhZG9ubHkgZGVjbGFyZWQ6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBtaXNzaW5nOiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgcmVhZG9ubHkgdW51c2VkOiBSZWFkb25seUFycmF5PHN0cmluZz5cbn1cblxuY29uc3QgaXNUcmFjZWFibGVPYmplY3QgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBvYmplY3QgPT4ge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHRydWVcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGZhbHNlXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkgcmV0dXJuIGZhbHNlXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gZmFsc2VcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSByZXR1cm4gZmFsc2VcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSByZXR1cm4gZmFsc2VcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgV2Vha01hcCkgcmV0dXJuIGZhbHNlXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFdlYWtTZXQpIHJldHVybiBmYWxzZVxuICByZXR1cm4gdHJ1ZVxufVxuXG5jb25zdCBzaG91bGRJZ25vcmVLZXkgPSAoa2V5OiBzdHJpbmcpOiBib29sZWFuID0+XG4gIGtleSA9PT0gXCJfX3Byb3RvX19cIiB8fCBrZXkgPT09IFwicHJvdG90eXBlXCIgfHwga2V5ID09PSBcImNvbnN0cnVjdG9yXCJcblxuY29uc3Qgbm9ybWFsaXplUmVhZHMgPSAocmVhZHM6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBSZWFkb25seUFycmF5PHN0cmluZz4gPT4ge1xuICBjb25zdCBhbGwgPSBBcnJheS5mcm9tKHJlYWRzKS5maWx0ZXIoKHApID0+IHR5cGVvZiBwID09PSBcInN0cmluZ1wiICYmIHAubGVuZ3RoID4gMClcbiAgYWxsLnNvcnQoKVxuXG4gIC8vIFx1NTNCQlx1NjM4OVx1NEUyNVx1NjgzQ1x1NTI0RFx1N0YwMFx1OERFRlx1NUY4NFx1RkYwOFx1NEY4Qlx1NTk4Mlx1NTQwQ1x1NjVGNlx1OEJGQlx1NEU4NiBwcm9maWxlIFx1NEUwRSBwcm9maWxlLmlkIFx1NjVGNlx1RkYwQ1x1NTNFQVx1NEZERFx1NzU1OVx1NjZGNFx1NTE3N1x1NEY1M1x1NzY4NCBwcm9maWxlLmlkXHVGRjA5XHUzMDAyXG4gIGNvbnN0IGlzUHJlZml4ID0gKHByZWZpeDogc3RyaW5nLCBmdWxsOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgZnVsbCAhPT0gcHJlZml4ICYmIGZ1bGwuc3RhcnRzV2l0aChwcmVmaXggKyBcIi5cIilcblxuICBjb25zdCBwcnVuZWQ6IEFycmF5PHN0cmluZz4gPSBbXVxuICBmb3IgKGNvbnN0IHAgb2YgYWxsKSB7XG4gICAgbGV0IGhhc01vcmVTcGVjaWZpYyA9IGZhbHNlXG4gICAgZm9yIChjb25zdCBvdGhlciBvZiBhbGwpIHtcbiAgICAgIGlmIChpc1ByZWZpeChwLCBvdGhlcikpIHtcbiAgICAgICAgaGFzTW9yZVNwZWNpZmljID0gdHJ1ZVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01vcmVTcGVjaWZpYykge1xuICAgICAgcHJ1bmVkLnB1c2gocClcbiAgICB9XG4gIH1cblxuICBwcnVuZWQuc29ydCgpXG4gIHJldHVybiBwcnVuZWRcbn1cblxuY29uc3QgY292ZXJzID0gKGRlY2xhcmVkOiBzdHJpbmcsIHJlYWQ6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgZGVjbGFyZWQgPT09IHJlYWQgfHwgcmVhZC5zdGFydHNXaXRoKGRlY2xhcmVkICsgXCIuXCIpXG5cbmV4cG9ydCBjb25zdCBkaWZmRGVwcyA9IChcbiAgZGVjbGFyZWQ6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgcmVhZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbik6IERlcHNEaWZmIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgZGVjbGFyZWRMaXN0ID0gQXJyYXkuZnJvbShuZXcgU2V0KGRlY2xhcmVkKSkuZmlsdGVyKChwKSA9PiB0eXBlb2YgcCA9PT0gXCJzdHJpbmdcIiAmJiBwLmxlbmd0aCA+IDApXG4gIGRlY2xhcmVkTGlzdC5zb3J0KClcbiAgY29uc3QgcmVhZExpc3QgPSBBcnJheS5mcm9tKG5ldyBTZXQocmVhZHMpKS5maWx0ZXIoKHApID0+IHR5cGVvZiBwID09PSBcInN0cmluZ1wiICYmIHAubGVuZ3RoID4gMClcbiAgcmVhZExpc3Quc29ydCgpXG5cbiAgY29uc3QgbWlzc2luZyA9IHJlYWRMaXN0LmZpbHRlcigocikgPT4gZGVjbGFyZWRMaXN0LmV2ZXJ5KChkKSA9PiAhY292ZXJzKGQsIHIpKSlcbiAgY29uc3QgdW51c2VkID0gZGVjbGFyZWRMaXN0LmZpbHRlcigoZCkgPT4gcmVhZExpc3QuZXZlcnkoKHIpID0+ICFjb3ZlcnMoZCwgcikpKVxuXG4gIGlmIChtaXNzaW5nLmxlbmd0aCA9PT0gMCAmJiB1bnVzZWQubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIHtcbiAgICByZWFkczogcmVhZExpc3QsXG4gICAgZGVjbGFyZWQ6IGRlY2xhcmVkTGlzdCxcbiAgICBtaXNzaW5nLFxuICAgIHVudXNlZCxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdHJhY2UgPSA8VD4oXG4gIGZuOiAoc3RhdGU6IGFueSkgPT4gVCxcbiAgc3RhdGU6IHVua25vd24sXG4pOiBEZXBzVHJhY2VSZXN1bHQ8VD4gPT4ge1xuICBpZiAoIWlzVHJhY2VhYmxlT2JqZWN0KHN0YXRlKSkge1xuICAgIHJldHVybiB7IHZhbHVlOiBmbihzdGF0ZSBhcyBhbnkpLCByZWFkczogW10gfVxuICB9XG5cbiAgY29uc3QgcmVhZHMgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4gIC8vIHBlci10cmFjZSBjYWNoZXMgdG8gcHJlc2VydmUgcmVmZXJlbmNlIGlkZW50aXR5IHdpdGhpbiB0aGUgdHJhY2VkIGNhbGwuXG4gIGNvbnN0IHByb3h5Q2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIE1hcDxzdHJpbmcsIGFueT4+KClcbiAgY29uc3QgcHJveHlUb1RhcmdldCA9IG5ldyBXZWFrTWFwPG9iamVjdCwgb2JqZWN0PigpXG5cbiAgY29uc3Qgd3JhcCA9ICh2YWx1ZTogdW5rbm93biwgcGF0aDogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gICAgaWYgKCFpc1RyYWNlYWJsZU9iamVjdCh2YWx1ZSkpIHJldHVybiB2YWx1ZVxuICAgIHJldHVybiBnZXRQcm94eSh2YWx1ZSBhcyBhbnksIHBhdGgpXG4gIH1cblxuICBjb25zdCB1bndyYXAgPSA8Vj4odmFsdWU6IFYpOiBWID0+IHtcbiAgICBpZiAodmFsdWUgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHByb3h5VG9UYXJnZXQuZ2V0KHZhbHVlIGFzIGFueSlcbiAgICAgIGlmICh0YXJnZXQpIHJldHVybiB0YXJnZXQgYXMgYW55IGFzIFZcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBjb25zdCBnZXRQcm94eSA9ICh0YXJnZXQ6IG9iamVjdCwgYmFzZVBhdGg6IHN0cmluZyk6IGFueSA9PiB7XG4gICAgbGV0IGJ5UGF0aCA9IHByb3h5Q2FjaGUuZ2V0KHRhcmdldClcbiAgICBpZiAoIWJ5UGF0aCkge1xuICAgICAgYnlQYXRoID0gbmV3IE1hcCgpXG4gICAgICBwcm94eUNhY2hlLnNldCh0YXJnZXQsIGJ5UGF0aClcbiAgICB9XG5cbiAgICBjb25zdCBjYWNoZWQgPSBieVBhdGguZ2V0KGJhc2VQYXRoKVxuICAgIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWRcblxuICAgIGNvbnN0IHJlY29yZCA9IChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChwYXRoKSByZWFkcy5hZGQocGF0aClcbiAgICB9XG5cbiAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQgYXMgYW55LCB7XG4gICAgICBnZXQ6ICh0LCBwcm9wLCByZWNlaXZlcikgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodCwgcHJvcCwgcmVjZWl2ZXIpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHByb3ApXG4gICAgICAgIGlmIChzaG91bGRJZ25vcmVLZXkoa2V5KSkge1xuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0LCBwcm9wLCByZWNlaXZlcilcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5leHRQYXRoID0gYmFzZVBhdGggPyBgJHtiYXNlUGF0aH0uJHtrZXl9YCA6IGtleVxuICAgICAgICByZWNvcmQobmV4dFBhdGgpXG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBSZWZsZWN0LmdldCh0LCBwcm9wLCByZWNlaXZlcikgYXMgdW5rbm93blxuICAgICAgICByZXR1cm4gd3JhcCh2YWx1ZSwgbmV4dFBhdGgpXG4gICAgICB9LFxuICAgICAgaGFzOiAodCwgcHJvcCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09IFwic3ltYm9sXCIpIHJldHVybiBSZWZsZWN0Lmhhcyh0LCBwcm9wKVxuICAgICAgICBjb25zdCBrZXkgPSBTdHJpbmcocHJvcClcbiAgICAgICAgaWYgKCFzaG91bGRJZ25vcmVLZXkoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IG5leHRQYXRoID0gYmFzZVBhdGggPyBgJHtiYXNlUGF0aH0uJHtrZXl9YCA6IGtleVxuICAgICAgICAgIHJlY29yZChuZXh0UGF0aClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVmbGVjdC5oYXModCwgcHJvcClcbiAgICAgIH0sXG4gICAgICBvd25LZXlzOiAodCkgPT4ge1xuICAgICAgICBpZiAoYmFzZVBhdGgpIHJlY29yZChiYXNlUGF0aClcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyh0KVxuICAgICAgfSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogKHQsIHByb3ApID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHByb3ApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHByb3ApXG4gICAgICAgIGlmICghc2hvdWxkSWdub3JlS2V5KGtleSkpIHtcbiAgICAgICAgICBjb25zdCBuZXh0UGF0aCA9IGJhc2VQYXRoID8gYCR7YmFzZVBhdGh9LiR7a2V5fWAgOiBrZXlcbiAgICAgICAgICByZWNvcmQobmV4dFBhdGgpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHByb3ApXG4gICAgICB9LFxuICAgICAgc2V0OiAoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIltkZXBzLXRyYWNlXSBBdHRlbXB0ZWQgdG8gbXV0YXRlIHN0YXRlIGR1cmluZyBkZXBzIHRyYWNpbmcgKHN0YXRlIGlzIHJlYWRvbmx5IGluIGRldi1tb2RlIGRpYWdub3N0aWNzKS5cIixcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIGRlZmluZVByb3BlcnR5OiAoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIltkZXBzLXRyYWNlXSBBdHRlbXB0ZWQgdG8gZGVmaW5lIHByb3BlcnR5IG9uIHN0YXRlIGR1cmluZyBkZXBzIHRyYWNpbmcgKHN0YXRlIGlzIHJlYWRvbmx5IGluIGRldi1tb2RlIGRpYWdub3N0aWNzKS5cIixcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiAoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIltkZXBzLXRyYWNlXSBBdHRlbXB0ZWQgdG8gZGVsZXRlIHByb3BlcnR5IG9uIHN0YXRlIGR1cmluZyBkZXBzIHRyYWNpbmcgKHN0YXRlIGlzIHJlYWRvbmx5IGluIGRldi1tb2RlIGRpYWdub3N0aWNzKS5cIixcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgYnlQYXRoLnNldChiYXNlUGF0aCwgcHJveHkpXG4gICAgcHJveHlUb1RhcmdldC5zZXQocHJveHksIHRhcmdldClcbiAgICByZXR1cm4gcHJveHlcbiAgfVxuXG4gIGNvbnN0IHJvb3QgPSBnZXRQcm94eShzdGF0ZSBhcyBhbnksIFwiXCIpXG4gIGNvbnN0IHZhbHVlID0gdW53cmFwKGZuKHJvb3QpKVxuXG4gIHJldHVybiB7XG4gICAgdmFsdWUsXG4gICAgcmVhZHM6IG5vcm1hbGl6ZVJlYWRzKHJlYWRzKSxcbiAgfVxufVxuXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FB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LFNBQVMsRUFBRTtBQUM3QixjQUFNLGtCQUFrQixTQUFTLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQztBQUN2RCxjQUFNLGVBQWUsT0FBTztBQUFBLFVBQzFCO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQSxVQUFVLFNBQVM7QUFBQSxVQUNuQixLQUFLLFdBQVc7QUFBQSxRQUNsQjtBQUNBLFlBQUksY0FBYztBQUNoQixnQkFBTSxRQUFrQztBQUFBLFlBQ3RDLE1BQU07QUFBQSxZQUNOO0FBQUEsWUFDQTtBQUFBLFlBQ0EsU0FBUztBQUFBLFlBQ1QsT0FBTztBQUFBLFlBQ1AsVUFBVTtBQUFBLFlBQ1YsV0FBVyxLQUFLLElBQUk7QUFBQSxZQUNwQjtBQUFBLFlBQ0E7QUFBQSxVQUNGO0FBQ0EsNEJBQWtCLE9BQU8sS0FBSztBQUM5QixpQkFBTyxlQUFlLFlBQVksV0FBVyxLQUFLO0FBQUEsUUFDcEQ7QUFDQTtBQUFBLE1BQ0Y7QUFFQSxVQUFJLFNBQVMsWUFBWSxVQUFVO0FBQ2pDLGVBQU8sTUFBTSxjQUFjLFNBQVMsS0FBSztBQUN6QyxtQkFBVztBQUNYLG1CQUFXO0FBQUEsTUFDYjtBQUdBLGFBQU8sV0FBVyxLQUFLLEdBQUcsWUFBWSxTQUFTO0FBQUEsSUFDakQsQ0FBQztBQUFBLEVBQ0g7QUFFQSxTQUFPLE9BQU87QUFDaEI7IiwKICAibmFtZXMiOiBbInZhbHVlIiwgInJlY29yZCIsICJrZXlIYXNoIiwgImtleSIsICJwcmV2IiwgInByZXZTdGF0dXMiLCAiY29uY3VycmVuY3kiLCAibW9kZSIsICJpbkZsaWdodCIsICJ0cmFpbGluZyIsICJnZW4iLCAic3RhcnRGZXRjaCJdCn0K