@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.
- package/LICENSE +201 -0
- package/package.json +3 -1
- package/public/sandbox/chunks/chunk-2AUQRESB.js +1114 -0
- package/public/sandbox/chunks/chunk-2F72LQKW.js +194 -0
- package/public/sandbox/chunks/chunk-2PYDGDD3.js +4071 -0
- package/public/sandbox/chunks/chunk-2UGKSXDZ.js +16 -0
- package/public/sandbox/chunks/chunk-2XVE7F26.js +153 -0
- package/public/sandbox/chunks/chunk-3A7TFNZN.js +219 -0
- package/public/sandbox/chunks/chunk-3BHC6JAV.js +1070 -0
- package/public/sandbox/chunks/chunk-3U4CAKCX.js +61 -0
- package/public/sandbox/chunks/chunk-3VU3JLZO.js +272 -0
- package/public/sandbox/chunks/chunk-4CPONKWY.js +1170 -0
- package/public/sandbox/chunks/chunk-4GMUQTWH.js +850 -0
- package/public/sandbox/chunks/chunk-4KIYG5E4.js +749 -0
- package/public/sandbox/chunks/chunk-4MY35XR3.js +175 -0
- package/public/sandbox/chunks/chunk-5DNHJMHA.js +69 -0
- package/public/sandbox/chunks/chunk-5EC4S7X6.js +42 -0
- package/public/sandbox/chunks/chunk-5FB7QFSH.js +227 -0
- package/public/sandbox/chunks/chunk-5GEYCJW2.js +206 -0
- package/public/sandbox/chunks/chunk-5PT7Q5SS.js +373 -0
- package/public/sandbox/chunks/chunk-5WN5IGKA.js +166 -0
- package/public/sandbox/chunks/chunk-5XOBKSOT.js +213 -0
- package/public/sandbox/chunks/chunk-67RVISUC.js +313 -0
- package/public/sandbox/chunks/chunk-6ELJEKZS.js +12 -0
- package/public/sandbox/chunks/chunk-6FKWRVP4.js +85 -0
- package/public/sandbox/chunks/chunk-6JRP52YT.js +34 -0
- package/public/sandbox/chunks/chunk-6JYAC3G6.js +42 -0
- package/public/sandbox/chunks/chunk-6TUOP63Q.js +86 -0
- package/public/sandbox/chunks/{chunk-A6JFUNQQ.js → chunk-74C5VW7Z.js} +2 -2
- package/public/sandbox/chunks/chunk-75DQFC5M.js +16 -0
- package/public/sandbox/chunks/{chunk-UCFEP3BH.js → chunk-7GPAF2UK.js} +1 -1
- package/public/sandbox/chunks/chunk-7KQFTS2Y.js +135 -0
- package/public/sandbox/chunks/chunk-7POKWYE3.js +112 -0
- package/public/sandbox/chunks/chunk-7VUEF5F3.js +395 -0
- package/public/sandbox/chunks/chunk-7W5APZS2.js +77 -0
- package/public/sandbox/chunks/chunk-A6OFCXDQ.js +397 -0
- package/public/sandbox/chunks/chunk-A7HLOSO6.js +216 -0
- package/public/sandbox/chunks/chunk-AGF4RRCB.js +408 -0
- package/public/sandbox/chunks/chunk-ASJSJAAL.js +122 -0
- package/public/sandbox/chunks/chunk-ASVMK364.js +283 -0
- package/public/sandbox/chunks/chunk-AUDTI2BQ.js +895 -0
- package/public/sandbox/chunks/chunk-B2SZTA3M.js +16 -0
- package/public/sandbox/chunks/chunk-B6YS2UMV.js +372 -0
- package/public/sandbox/chunks/chunk-BCEO3MGD.js +244 -0
- package/public/sandbox/chunks/chunk-BCOO65D4.js +373 -0
- package/public/sandbox/chunks/chunk-BJOWSSEL.js +38 -0
- package/public/sandbox/chunks/chunk-BS2WBFW4.js +373 -0
- package/public/sandbox/chunks/chunk-BUVHG3NJ.js +439 -0
- package/public/sandbox/chunks/chunk-BVE33AN6.js +42 -0
- package/public/sandbox/chunks/chunk-BWTGJZVP.js +19 -0
- package/public/sandbox/chunks/chunk-BXD7GZC3.js +1025 -0
- package/public/sandbox/chunks/chunk-BZH4EUUD.js +164 -0
- package/public/sandbox/chunks/{chunk-HFV5GJPK.js → chunk-C2MYMMO4.js} +3 -3
- package/public/sandbox/chunks/chunk-CRE4NJJ6.js +271 -0
- package/public/sandbox/chunks/chunk-CVZPRIDB.js +706 -0
- package/public/sandbox/chunks/chunk-CWOXD5NG.js +991 -0
- package/public/sandbox/chunks/chunk-D6DOC3BJ.js +373 -0
- package/public/sandbox/chunks/chunk-DEPSGFSY.js +1698 -0
- package/public/sandbox/chunks/chunk-DM7C5NP5.js +819 -0
- package/public/sandbox/chunks/chunk-DN33LMOF.js +1112 -0
- package/public/sandbox/chunks/{chunk-S46P7MC6.js → chunk-DT7YIIWE.js} +2 -2
- package/public/sandbox/chunks/chunk-DVB5WRCI.js +260 -0
- package/public/sandbox/chunks/{chunk-TOHCFMQS.js → chunk-E3EVW7NR.js} +11 -18
- package/public/sandbox/chunks/chunk-E5BV567Q.js +417 -0
- package/public/sandbox/chunks/chunk-E7BIWMQQ.js +203 -0
- package/public/sandbox/chunks/chunk-EAKGPSOQ.js +83 -0
- package/public/sandbox/chunks/chunk-EGUYL2ER.js +75 -0
- package/public/sandbox/chunks/chunk-EP5GQYZ5.js +85 -0
- package/public/sandbox/chunks/chunk-ET6CJEHC.js +221 -0
- package/public/sandbox/chunks/chunk-EU67YZHZ.js +1070 -0
- package/public/sandbox/chunks/{chunk-PTSJJANP.js → chunk-EYNDQLSB.js} +1 -1
- package/public/sandbox/chunks/{chunk-CEGSWZ5S.js → chunk-EZTMVCJF.js} +1 -1
- package/public/sandbox/chunks/chunk-F5CLVIS6.js +907 -0
- package/public/sandbox/chunks/chunk-F743SKYD.js +85 -0
- package/public/sandbox/chunks/chunk-FEGFZ5OX.js +86 -0
- package/public/sandbox/chunks/chunk-FG5B7ZX3.js +373 -0
- package/public/sandbox/chunks/chunk-FKZPYMDG.js +373 -0
- package/public/sandbox/chunks/chunk-FNLXHWIU.js +220 -0
- package/public/sandbox/chunks/chunk-FQRUTYAD.js +1991 -0
- package/public/sandbox/chunks/{chunk-VLYP4WUS.js → chunk-FY5A73NK.js} +5 -5
- package/public/sandbox/chunks/chunk-G7FAOG3O.js +221 -0
- package/public/sandbox/chunks/chunk-GFXHUC7Y.js +73 -0
- package/public/sandbox/chunks/chunk-GIPXUIZQ.js +534 -0
- package/public/sandbox/chunks/chunk-GP37MEGJ.js +52 -0
- package/public/sandbox/chunks/chunk-GXL5QCMF.js +4511 -0
- package/public/sandbox/chunks/chunk-GZ2NSE6A.js +177 -0
- package/public/sandbox/chunks/chunk-GZATW4YD.js +69 -0
- package/public/sandbox/chunks/chunk-H4EBXROQ.js +166 -0
- package/public/sandbox/chunks/chunk-HETCPK6Z.js +153 -0
- package/public/sandbox/chunks/chunk-HGUFQ2QC.js +4431 -0
- package/public/sandbox/chunks/chunk-HGV3VNH3.js +255 -0
- package/public/sandbox/chunks/chunk-HIJ67QWR.js +5397 -0
- package/public/sandbox/chunks/chunk-IDHERBKW.js +1114 -0
- package/public/sandbox/chunks/chunk-IDTK4FIY.js +102 -0
- package/public/sandbox/chunks/chunk-ILFVY7H5.js +164 -0
- package/public/sandbox/chunks/chunk-ISGSRYGO.js +57 -0
- package/public/sandbox/chunks/chunk-J45VPU24.js +408 -0
- package/public/sandbox/chunks/chunk-JAUIM3O5.js +42 -0
- package/public/sandbox/chunks/chunk-JB7OQEM6.js +373 -0
- package/public/sandbox/chunks/chunk-JCKW6NHD.js +15 -0
- package/public/sandbox/chunks/chunk-JMA7GY7Z.js +221 -0
- package/public/sandbox/chunks/chunk-JY46J6IL.js +836 -0
- package/public/sandbox/chunks/{chunk-X72PZOFA.js → chunk-K2MQ66O7.js} +1 -1
- package/public/sandbox/chunks/chunk-KA7PZA6F.js +464 -0
- package/public/sandbox/chunks/chunk-KDEQTUID.js +102 -0
- package/public/sandbox/chunks/chunk-KDJR27JV.js +1696 -0
- package/public/sandbox/chunks/chunk-KFE3JO6N.js +77 -0
- package/public/sandbox/chunks/chunk-KLDSYWT5.js +536 -0
- package/public/sandbox/chunks/chunk-KQWWFYBF.js +203 -0
- package/public/sandbox/chunks/chunk-KTFZSXOW.js +6473 -0
- package/public/sandbox/chunks/chunk-KXVIC55U.js +108 -0
- package/public/sandbox/chunks/{chunk-HNEDTEGQ.js → chunk-L4PNO2H6.js} +1 -1
- package/public/sandbox/chunks/{chunk-WE4STGO2.js → chunk-L4ZNW5DI.js} +2 -2
- package/public/sandbox/chunks/chunk-LBUINGZ4.js +836 -0
- package/public/sandbox/chunks/chunk-LIYPPU6I.js +112 -0
- package/public/sandbox/chunks/chunk-LJHTOJXW.js +221 -0
- package/public/sandbox/chunks/{chunk-BWSNPKO5.js → chunk-LQL23SWJ.js} +2 -2
- package/public/sandbox/chunks/chunk-LTFCYZQ6.js +46 -0
- package/public/sandbox/chunks/chunk-LTWLVCKQ.js +166 -0
- package/public/sandbox/chunks/chunk-LWI7BXFN.js +395 -0
- package/public/sandbox/chunks/chunk-LYBBX6WM.js +225 -0
- package/public/sandbox/chunks/chunk-MXE7HIBM.js +474 -0
- package/public/sandbox/chunks/chunk-MYBDYNK4.js +6004 -0
- package/public/sandbox/chunks/chunk-NC2MIWZX.js +732 -0
- package/public/sandbox/chunks/chunk-NE447XAF.js +597 -0
- package/public/sandbox/chunks/chunk-NEAYV5C2.js +255 -0
- package/public/sandbox/chunks/chunk-NMGFJZ4I.js +26 -0
- package/public/sandbox/chunks/chunk-NWCJJZNQ.js +71 -0
- package/public/sandbox/chunks/chunk-O57OZBDR.js +214 -0
- package/public/sandbox/chunks/chunk-OJJT664Q.js +731 -0
- package/public/sandbox/chunks/chunk-OKTBUTCH.js +1175 -0
- package/public/sandbox/chunks/chunk-OQ4SYV5D.js +534 -0
- package/public/sandbox/chunks/chunk-OTVVIHJD.js +219 -0
- package/public/sandbox/chunks/chunk-OWTMSCF7.js +1052 -0
- package/public/sandbox/chunks/chunk-P5ZQNFC3.js +122 -0
- package/public/sandbox/chunks/chunk-PBPT2U2N.js +1698 -0
- package/public/sandbox/chunks/chunk-PHBJLCP3.js +836 -0
- package/public/sandbox/chunks/chunk-PHV4HYHB.js +397 -0
- package/public/sandbox/chunks/chunk-PIXQ6SOX.js +4071 -0
- package/public/sandbox/chunks/chunk-PKJL6YLK.js +73 -0
- package/public/sandbox/chunks/chunk-PKPOITIU.js +221 -0
- package/public/sandbox/chunks/{chunk-NQW73ACJ.js → chunk-PMXBOYQI.js} +1 -1
- package/public/sandbox/chunks/chunk-PQLZD7NR.js +836 -0
- package/public/sandbox/chunks/chunk-QEESVOZU.js +16 -0
- package/public/sandbox/chunks/chunk-QGIM3FQK.js +159 -0
- package/public/sandbox/chunks/chunk-QL5JNEDO.js +69 -0
- package/public/sandbox/chunks/chunk-QQOZ3RMH.js +867 -0
- package/public/sandbox/chunks/chunk-QUMEVT2F.js +194 -0
- package/public/sandbox/chunks/chunk-QVZBXYVY.js +102 -0
- package/public/sandbox/chunks/chunk-R5HQS6RB.js +135 -0
- package/public/sandbox/chunks/chunk-R75Q2CTT.js +900 -0
- package/public/sandbox/chunks/chunk-RBB6SHW2.js +253 -0
- package/public/sandbox/chunks/chunk-RDHNRWQP.js +383 -0
- package/public/sandbox/chunks/chunk-RIWOEI3T.js +1101 -0
- package/public/sandbox/chunks/chunk-RS5FFPUV.js +103 -0
- package/public/sandbox/chunks/chunk-RYSSJBGX.js +203 -0
- package/public/sandbox/chunks/chunk-S3KBAE5Z.js +1114 -0
- package/public/sandbox/chunks/chunk-S6ZZHV6G.js +244 -0
- package/public/sandbox/chunks/chunk-SFXJ24HY.js +499 -0
- package/public/sandbox/chunks/chunk-SH7TP5CJ.js +1109 -0
- package/public/sandbox/chunks/chunk-SI5OKFFY.js +317 -0
- package/public/sandbox/chunks/chunk-SIXNQNIR.js +86 -0
- package/public/sandbox/chunks/chunk-ST353BOX.js +42 -0
- package/public/sandbox/chunks/chunk-SYEHKMLP.js +1140 -0
- package/public/sandbox/chunks/chunk-SZ4KQUJU.js +69 -0
- package/public/sandbox/chunks/{chunk-5SOP6EKV.js → chunk-SZI65PSP.js} +5 -10
- package/public/sandbox/chunks/chunk-T7RLTSMX.js +78 -0
- package/public/sandbox/chunks/chunk-TJ2RLUTW.js +57 -0
- package/public/sandbox/chunks/chunk-TJB73XPN.js +4071 -0
- package/public/sandbox/chunks/chunk-TXJCYO56.js +4046 -0
- package/public/sandbox/chunks/chunk-U5J3LCYI.js +731 -0
- package/public/sandbox/chunks/chunk-UABFN3NH.js +208 -0
- package/public/sandbox/chunks/chunk-UBMUY7WO.js +13 -0
- package/public/sandbox/chunks/chunk-UC27CE32.js +69 -0
- package/public/sandbox/chunks/chunk-UJGVDFZN.js +147 -0
- package/public/sandbox/chunks/chunk-UNVLTK4N.js +122 -0
- package/public/sandbox/chunks/chunk-UQKQ6V3V.js +208 -0
- package/public/sandbox/chunks/chunk-UZZBHWIO.js +703 -0
- package/public/sandbox/chunks/chunk-VKZIJERL.js +1114 -0
- package/public/sandbox/chunks/chunk-VQQEAGID.js +372 -0
- package/public/sandbox/chunks/{chunk-3LX3KIQQ.js → chunk-W365QUZ5.js} +3 -5
- package/public/sandbox/chunks/chunk-WJY2LSWG.js +1052 -0
- package/public/sandbox/chunks/chunk-WNOBN3DX.js +391 -0
- package/public/sandbox/chunks/chunk-X2Z5VYG3.js +245 -0
- package/public/sandbox/chunks/chunk-X74KU74D.js +959 -0
- package/public/sandbox/chunks/chunk-XE7ULSGQ.js +46 -0
- package/public/sandbox/chunks/chunk-XRXUJZ3X.js +431 -0
- package/public/sandbox/chunks/chunk-XWHIN7CC.js +85 -0
- package/public/sandbox/chunks/chunk-Y2TVGGVL.js +527 -0
- package/public/sandbox/chunks/chunk-YMVMZA3U.js +1395 -0
- package/public/sandbox/chunks/chunk-YOBLFWDV.js +431 -0
- package/public/sandbox/chunks/chunk-YR2RFEZA.js +11 -0
- package/public/sandbox/chunks/chunk-YTD6A35P.js +836 -0
- package/public/sandbox/chunks/chunk-Z5L7EZXS.js +81 -0
- package/public/sandbox/chunks/chunk-Z65I5ET2.js +108 -0
- package/public/sandbox/chunks/chunk-Z6LV34RO.js +390 -0
- package/public/sandbox/chunks/chunk-ZAKUP6QG.js +1634 -0
- package/public/sandbox/chunks/chunk-ZHNYE2YH.js +731 -0
- package/public/sandbox/chunks/chunk-ZHQX3B3Y.js +867 -0
- package/public/sandbox/chunks/chunk-ZIXDFRHJ.js +731 -0
- package/public/sandbox/chunks/chunk-ZPZ2MZ4D.js +528 -0
- package/public/sandbox/chunks/chunk-ZQD6NZXB.js +373 -0
- package/public/sandbox/chunks/chunk-ZVVBP7ON.js +16 -0
- package/public/sandbox/chunks/chunk-ZWE3P6X2.js +11 -0
- package/public/sandbox/logix-core/Bound.js +14 -14
- package/public/sandbox/logix-core/Debug.js +12 -10
- package/public/sandbox/logix-core/EffectOp.js +3 -4
- package/public/sandbox/logix-core/Env.js +5 -2
- package/public/sandbox/logix-core/ExternalStore.js +239 -0
- package/public/sandbox/logix-core/Flow.js +7 -8
- package/public/sandbox/logix-core/Kernel.js +7 -4
- package/public/sandbox/logix-core/Link.js +33 -25
- package/public/sandbox/logix-core/Middleware.js +13 -11
- package/public/sandbox/logix-core/Module.js +93 -30
- package/public/sandbox/logix-core/ModuleTag.js +28 -25
- package/public/sandbox/logix-core/Observability.js +21 -19
- package/public/sandbox/logix-core/Process.js +27 -22
- package/public/sandbox/logix-core/ReadQuery.js +7 -11
- package/public/sandbox/logix-core/Reflection.js +173 -53
- package/public/sandbox/logix-core/Resource.js +6 -3
- package/public/sandbox/logix-core/Root.js +7 -3
- package/public/sandbox/logix-core/Runtime.js +54 -40
- package/public/sandbox/logix-core/ScopeRegistry.js +6 -3
- package/public/sandbox/logix-core/StateTrait.js +17 -14
- package/public/sandbox/logix-core/TraitLifecycle.js +8 -8
- package/public/sandbox/logix-core/Workflow.js +332 -0
- package/public/sandbox/logix-core.js +11133 -6622
- package/public/sandbox/logix-core.manifest.json +4 -2
- package/public/sandbox/worker.js +3 -3
- package/public/sandbox/chunks/chunk-4LRLOTMA.js +0 -1698
- package/public/sandbox/chunks/chunk-CDLXJHXY.js +0 -120
- package/public/sandbox/chunks/chunk-CZRI7MHA.js +0 -46
- package/public/sandbox/chunks/chunk-EJDFUZ4B.js +0 -408
- package/public/sandbox/chunks/chunk-IP63FME6.js +0 -282
- package/public/sandbox/chunks/chunk-JIXTOQXJ.js +0 -1103
- package/public/sandbox/chunks/chunk-MPUSOFJ3.js +0 -1928
- package/public/sandbox/chunks/chunk-ON2LY6HJ.js +0 -135
- package/public/sandbox/chunks/chunk-POIBXAH5.js +0 -995
- package/public/sandbox/chunks/chunk-PQ652ULI.js +0 -6359
- package/public/sandbox/chunks/chunk-RJQ4PG2F.js +0 -77
- package/public/sandbox/chunks/chunk-S4EXG3OS.js +0 -533
- package/public/sandbox/chunks/chunk-SUXDGXVE.js +0 -390
- package/public/sandbox/chunks/chunk-TOQ6SJ6O.js +0 -244
- package/public/sandbox/chunks/chunk-UKYAF3NL.js +0 -1036
- package/public/sandbox/chunks/chunk-UMVN3AWO.js +0 -395
- package/public/sandbox/chunks/chunk-WFV5PPWJ.js +0 -194
- package/public/sandbox/chunks/chunk-YF6IO732.js +0 -206
- package/public/sandbox/chunks/chunk-ZUBABAAO.js +0 -86
|
@@ -0,0 +1,597 @@
|
|
|
1
|
+
// @logixjs/core subpath bundles for @logixjs/sandbox
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
build,
|
|
5
|
+
installSourceRefresh,
|
|
6
|
+
onceInRunSession
|
|
7
|
+
} from "./chunk-FQRUTYAD.js";
|
|
8
|
+
import {
|
|
9
|
+
getAtPath,
|
|
10
|
+
setAtPathMutating
|
|
11
|
+
} from "./chunk-C2MYMMO4.js";
|
|
12
|
+
import {
|
|
13
|
+
create
|
|
14
|
+
} from "./chunk-KE2H62D6.js";
|
|
15
|
+
import {
|
|
16
|
+
exportStaticIr
|
|
17
|
+
} from "./chunk-4MY35XR3.js";
|
|
18
|
+
import {
|
|
19
|
+
sanitizeWithReport
|
|
20
|
+
} from "./chunk-X2Z5VYG3.js";
|
|
21
|
+
import {
|
|
22
|
+
normalizeFieldPath
|
|
23
|
+
} from "./chunk-ASVMK364.js";
|
|
24
|
+
import {
|
|
25
|
+
getBoundInternals
|
|
26
|
+
} from "./chunk-7GPAF2UK.js";
|
|
27
|
+
import {
|
|
28
|
+
DeclarativeLinkRuntimeTag,
|
|
29
|
+
HostSchedulerTag,
|
|
30
|
+
inSyncTransactionFiber,
|
|
31
|
+
isDevEnv
|
|
32
|
+
} from "./chunk-YMVMZA3U.js";
|
|
33
|
+
import {
|
|
34
|
+
getExternalStoreDescriptor
|
|
35
|
+
} from "./chunk-NMGFJZ4I.js";
|
|
36
|
+
import {
|
|
37
|
+
getGlobalHostScheduler
|
|
38
|
+
} from "./chunk-UJGVDFZN.js";
|
|
39
|
+
import {
|
|
40
|
+
currentDiagnosticsLevel,
|
|
41
|
+
record
|
|
42
|
+
} from "./chunk-SH7TP5CJ.js";
|
|
43
|
+
|
|
44
|
+
// ../logix-core/src/internal/state-trait/install.ts
|
|
45
|
+
import { Effect as Effect3 } from "../effect.js";
|
|
46
|
+
|
|
47
|
+
// ../logix-core/src/internal/state-trait/external-store.ts
|
|
48
|
+
import { Context, Effect, FiberRef, Option } from "../effect.js";
|
|
49
|
+
var isFn = (value) => typeof value === "function";
|
|
50
|
+
var resolveStore = (entry) => Effect.gen(function* () {
|
|
51
|
+
const store = entry.meta?.store;
|
|
52
|
+
const descriptor = getExternalStoreDescriptor(store);
|
|
53
|
+
if (descriptor?.kind === "service") {
|
|
54
|
+
const service = yield* descriptor.tag;
|
|
55
|
+
return descriptor.map(service);
|
|
56
|
+
}
|
|
57
|
+
return store;
|
|
58
|
+
});
|
|
59
|
+
var installExternalStoreSync = (bound, step, entry) => Effect.gen(function* () {
|
|
60
|
+
const fieldPath = step.targetFieldPath;
|
|
61
|
+
if (!fieldPath) return;
|
|
62
|
+
const env = yield* Effect.context();
|
|
63
|
+
const hostSchedulerOpt = yield* Effect.serviceOption(HostSchedulerTag);
|
|
64
|
+
const hostScheduler = Option.isSome(hostSchedulerOpt) ? hostSchedulerOpt.value : getGlobalHostScheduler();
|
|
65
|
+
const microtask = Effect.async((resume2) => {
|
|
66
|
+
hostScheduler.scheduleMicrotask(() => resume2(Effect.void));
|
|
67
|
+
});
|
|
68
|
+
let internals;
|
|
69
|
+
try {
|
|
70
|
+
internals = getBoundInternals(bound);
|
|
71
|
+
} catch {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const select = entry.meta?.select;
|
|
75
|
+
const equals = entry.meta?.equals;
|
|
76
|
+
const computeValue = (snapshot) => isFn(select) ? select(snapshot) : snapshot;
|
|
77
|
+
const isEqual = (a, b) => isFn(equals) ? equals(a, b) : Object.is(a, b);
|
|
78
|
+
const traitLane = entry.meta?.priority;
|
|
79
|
+
const rawStore = entry.meta?.store;
|
|
80
|
+
const rawDescriptor = getExternalStoreDescriptor(rawStore);
|
|
81
|
+
if (rawDescriptor?.kind === "module") {
|
|
82
|
+
const linkRuntimeOpt = yield* Effect.serviceOption(DeclarativeLinkRuntimeTag);
|
|
83
|
+
if (Option.isNone(linkRuntimeOpt)) {
|
|
84
|
+
return yield* Effect.dieMessage("[StateTrait.externalStore] Missing DeclarativeLinkRuntime service (073).");
|
|
85
|
+
}
|
|
86
|
+
const module = rawDescriptor.module;
|
|
87
|
+
const sourceRuntime = (() => {
|
|
88
|
+
if (module && typeof module === "object") {
|
|
89
|
+
const moduleId = module.moduleId;
|
|
90
|
+
const instanceId = module.instanceId;
|
|
91
|
+
const getState = module.getState;
|
|
92
|
+
if (typeof moduleId === "string" && moduleId.length > 0 && typeof instanceId === "string" && instanceId.length > 0 && getState) {
|
|
93
|
+
return module;
|
|
94
|
+
}
|
|
95
|
+
const tag = module.tag;
|
|
96
|
+
if (tag && Context.isTag(tag)) {
|
|
97
|
+
return internals.imports.get(tag);
|
|
98
|
+
}
|
|
99
|
+
if (Context.isTag(module)) {
|
|
100
|
+
return internals.imports.get(module);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return void 0;
|
|
104
|
+
})();
|
|
105
|
+
if (!sourceRuntime) {
|
|
106
|
+
return yield* Effect.dieMessage(
|
|
107
|
+
`[StateTrait.externalStore] Module-as-Source store is unresolved for "${fieldPath}". Fix: include the source ModuleTag in module imports (moduleId=${rawDescriptor.moduleId}).`
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
if (rawDescriptor.instanceId && rawDescriptor.instanceId !== sourceRuntime.instanceId) {
|
|
111
|
+
return yield* Effect.dieMessage(
|
|
112
|
+
`[StateTrait.externalStore] Module-as-Source instanceId mismatch for "${fieldPath}". descriptor.instanceId=${rawDescriptor.instanceId}, resolved.instanceId=${sourceRuntime.instanceId}`
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
if (sourceRuntime.moduleId !== rawDescriptor.moduleId) {
|
|
116
|
+
return yield* Effect.dieMessage(
|
|
117
|
+
`[StateTrait.externalStore] Module-as-Source moduleId mismatch for "${fieldPath}". descriptor.moduleId=${rawDescriptor.moduleId}, resolved.moduleId=${sourceRuntime.moduleId}`
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
const staticIr = rawDescriptor.readQuery.staticIr;
|
|
121
|
+
const isRecognizableStatic = staticIr.lane === "static" && staticIr.readsDigest != null && staticIr.fallbackReason == null;
|
|
122
|
+
if (!isRecognizableStatic) {
|
|
123
|
+
yield* record({
|
|
124
|
+
type: "diagnostic",
|
|
125
|
+
moduleId: internals.moduleId,
|
|
126
|
+
instanceId: internals.instanceId,
|
|
127
|
+
code: "external_store::module_source_degraded",
|
|
128
|
+
severity: "warning",
|
|
129
|
+
message: "[StateTrait.externalStore] Module-as-Source selector is not fully IR-recognizable; falling back to module-topic edge (may reduce perf).",
|
|
130
|
+
hint: "Fix: provide a static ReadQuery (ReadQuery.make) or annotate selector.fieldPaths to get a stable readsDigest; avoid dynamic lane.",
|
|
131
|
+
kind: "module_as_source_degraded",
|
|
132
|
+
trigger: {
|
|
133
|
+
kind: "trait",
|
|
134
|
+
name: "externalStore.moduleSource",
|
|
135
|
+
details: {
|
|
136
|
+
sourceModuleId: rawDescriptor.moduleId,
|
|
137
|
+
selectorId: staticIr.selectorId,
|
|
138
|
+
lane: staticIr.lane,
|
|
139
|
+
fallbackReason: staticIr.fallbackReason,
|
|
140
|
+
readsDigest: staticIr.readsDigest
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
const moduleInstanceKey = `${sourceRuntime.moduleId}::${sourceRuntime.instanceId}`;
|
|
146
|
+
const writeValue2 = (nextValue) => Effect.gen(function* () {
|
|
147
|
+
const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
|
|
148
|
+
const body = Effect.gen(function* () {
|
|
149
|
+
const prevState = yield* bound.state.read;
|
|
150
|
+
const prevValue = getAtPath(prevState, fieldPath);
|
|
151
|
+
if (isEqual(prevValue, nextValue)) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const nextDraft = create(prevState, (draft) => {
|
|
155
|
+
setAtPathMutating(draft, fieldPath, nextValue);
|
|
156
|
+
});
|
|
157
|
+
const normalized = normalizeFieldPath(fieldPath) ?? [];
|
|
158
|
+
internals.txn.recordStatePatch(normalized, "trait-external-store", prevValue, nextValue, step.id);
|
|
159
|
+
internals.txn.updateDraft(nextDraft);
|
|
160
|
+
});
|
|
161
|
+
if (inTxn) {
|
|
162
|
+
return yield* body;
|
|
163
|
+
}
|
|
164
|
+
const stateCommitPriority = traitLane === "nonUrgent" ? "low" : "normal";
|
|
165
|
+
return yield* internals.txn.runWithStateTransaction(
|
|
166
|
+
{
|
|
167
|
+
kind: "trait-external-store",
|
|
168
|
+
name: fieldPath,
|
|
169
|
+
details: {
|
|
170
|
+
stateCommit: {
|
|
171
|
+
priority: stateCommitPriority
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
() => body.pipe(Effect.asVoid)
|
|
176
|
+
);
|
|
177
|
+
}).pipe(Effect.provide(env));
|
|
178
|
+
const unregister = linkRuntimeOpt.value.registerModuleAsSourceLink({
|
|
179
|
+
id: `${internals.instanceId}::externalStore:${step.id}`,
|
|
180
|
+
sourceModuleInstanceKey: moduleInstanceKey,
|
|
181
|
+
readQuery: rawDescriptor.readQuery,
|
|
182
|
+
computeValue,
|
|
183
|
+
equalsValue: isEqual,
|
|
184
|
+
applyValue: writeValue2
|
|
185
|
+
});
|
|
186
|
+
yield* Effect.addFinalizer(
|
|
187
|
+
() => Effect.sync(() => {
|
|
188
|
+
unregister();
|
|
189
|
+
})
|
|
190
|
+
);
|
|
191
|
+
const initialState = yield* sourceRuntime.getState;
|
|
192
|
+
const initialSelected = rawDescriptor.readQuery.select(initialState);
|
|
193
|
+
yield* writeValue2(computeValue(initialSelected));
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const store = rawDescriptor?.kind === "service" ? yield* resolveStore(entry) : rawStore;
|
|
197
|
+
if (!store || typeof store !== "object") {
|
|
198
|
+
return yield* Effect.dieMessage(
|
|
199
|
+
`[StateTrait.externalStore] Invalid store for "${fieldPath}". Expected { getSnapshot, subscribe }.`
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
if (!isFn(store.getSnapshot) || !isFn(store.subscribe)) {
|
|
203
|
+
return yield* Effect.dieMessage(
|
|
204
|
+
`[StateTrait.externalStore] Invalid store for "${fieldPath}". Expected { getSnapshot, subscribe }.`
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
let fused = false;
|
|
208
|
+
let fuseCause;
|
|
209
|
+
let fuseRecorded = false;
|
|
210
|
+
let pending = false;
|
|
211
|
+
let resume;
|
|
212
|
+
const recordFuseDiagnostic = Effect.gen(function* () {
|
|
213
|
+
if (fuseRecorded) return;
|
|
214
|
+
fuseRecorded = true;
|
|
215
|
+
const errorMessage = (() => {
|
|
216
|
+
if (fuseCause instanceof Error) return fuseCause.message;
|
|
217
|
+
if (typeof fuseCause === "string") return fuseCause;
|
|
218
|
+
return "unknown";
|
|
219
|
+
})();
|
|
220
|
+
yield* record({
|
|
221
|
+
type: "diagnostic",
|
|
222
|
+
moduleId: internals.moduleId,
|
|
223
|
+
instanceId: internals.instanceId,
|
|
224
|
+
code: "external_store::snapshot_threw",
|
|
225
|
+
severity: "warning",
|
|
226
|
+
message: `[StateTrait.externalStore] store.getSnapshot() threw; trait is fused and will stop syncing for "${fieldPath}".`,
|
|
227
|
+
hint: "Fix: ensure getSnapshot is synchronous and non-throwing; async resources should use StateTrait.source or ExternalStore.fromStream({ current/initial }).",
|
|
228
|
+
kind: "external_store_fused:get_snapshot",
|
|
229
|
+
trigger: {
|
|
230
|
+
kind: "trait",
|
|
231
|
+
name: "externalStore.getSnapshot",
|
|
232
|
+
details: {
|
|
233
|
+
fieldPath,
|
|
234
|
+
traitId: step.id,
|
|
235
|
+
storeKind: rawDescriptor?.kind ?? "raw",
|
|
236
|
+
error: errorMessage
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
const signal = () => {
|
|
242
|
+
if (fused) return;
|
|
243
|
+
if (resume) {
|
|
244
|
+
const r = resume;
|
|
245
|
+
pending = false;
|
|
246
|
+
r();
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
pending = true;
|
|
250
|
+
};
|
|
251
|
+
const awaitSignal = () => {
|
|
252
|
+
if (pending) {
|
|
253
|
+
pending = false;
|
|
254
|
+
return Effect.void;
|
|
255
|
+
}
|
|
256
|
+
return Effect.async((resumeEffect, signal2) => {
|
|
257
|
+
let done = false;
|
|
258
|
+
const r = () => {
|
|
259
|
+
if (done) return;
|
|
260
|
+
done = true;
|
|
261
|
+
resume = void 0;
|
|
262
|
+
resumeEffect(Effect.void);
|
|
263
|
+
};
|
|
264
|
+
resume = r;
|
|
265
|
+
try {
|
|
266
|
+
signal2.addEventListener(
|
|
267
|
+
"abort",
|
|
268
|
+
() => {
|
|
269
|
+
if (resume === r) {
|
|
270
|
+
resume = void 0;
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
{ once: true }
|
|
274
|
+
);
|
|
275
|
+
} catch {
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
};
|
|
279
|
+
const getSnapshotOrFuse = () => {
|
|
280
|
+
try {
|
|
281
|
+
return store.getSnapshot();
|
|
282
|
+
} catch (err) {
|
|
283
|
+
fused = true;
|
|
284
|
+
fuseCause = err;
|
|
285
|
+
return void 0;
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
const readSnapshotOrFuse = Effect.locally(inSyncTransactionFiber, false)(Effect.sync(getSnapshotOrFuse));
|
|
289
|
+
const before = yield* readSnapshotOrFuse;
|
|
290
|
+
if (fused) {
|
|
291
|
+
yield* recordFuseDiagnostic;
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
const unsubscribe = store.subscribe(signal);
|
|
295
|
+
yield* Effect.addFinalizer(
|
|
296
|
+
() => Effect.sync(() => {
|
|
297
|
+
try {
|
|
298
|
+
unsubscribe?.();
|
|
299
|
+
} catch {
|
|
300
|
+
}
|
|
301
|
+
})
|
|
302
|
+
);
|
|
303
|
+
const after = yield* readSnapshotOrFuse;
|
|
304
|
+
if (fused) {
|
|
305
|
+
yield* recordFuseDiagnostic;
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
const writeValue = (nextValue) => Effect.gen(function* () {
|
|
309
|
+
const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
|
|
310
|
+
const body = Effect.gen(function* () {
|
|
311
|
+
const prevState = yield* bound.state.read;
|
|
312
|
+
const prevValue = getAtPath(prevState, fieldPath);
|
|
313
|
+
if (isEqual(prevValue, nextValue)) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
const nextDraft = create(prevState, (draft) => {
|
|
317
|
+
setAtPathMutating(draft, fieldPath, nextValue);
|
|
318
|
+
});
|
|
319
|
+
const normalized = normalizeFieldPath(fieldPath) ?? [];
|
|
320
|
+
internals.txn.recordStatePatch(normalized, "trait-external-store", prevValue, nextValue, step.id);
|
|
321
|
+
internals.txn.updateDraft(nextDraft);
|
|
322
|
+
});
|
|
323
|
+
if (inTxn) {
|
|
324
|
+
return yield* body;
|
|
325
|
+
}
|
|
326
|
+
const stateCommitPriority = traitLane === "nonUrgent" ? "low" : "normal";
|
|
327
|
+
return yield* internals.txn.runWithStateTransaction(
|
|
328
|
+
{
|
|
329
|
+
kind: "trait-external-store",
|
|
330
|
+
name: fieldPath,
|
|
331
|
+
details: {
|
|
332
|
+
stateCommit: {
|
|
333
|
+
priority: stateCommitPriority
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
},
|
|
337
|
+
() => body.pipe(Effect.asVoid)
|
|
338
|
+
);
|
|
339
|
+
});
|
|
340
|
+
yield* writeValue(computeValue(after));
|
|
341
|
+
if (!isEqual(before, after)) {
|
|
342
|
+
signal();
|
|
343
|
+
}
|
|
344
|
+
yield* Effect.forkScoped(
|
|
345
|
+
Effect.locally(inSyncTransactionFiber, false)(
|
|
346
|
+
Effect.gen(function* () {
|
|
347
|
+
while (true) {
|
|
348
|
+
yield* awaitSignal();
|
|
349
|
+
if (fused) return;
|
|
350
|
+
yield* microtask;
|
|
351
|
+
if (fused) return;
|
|
352
|
+
const snapshot = yield* readSnapshotOrFuse;
|
|
353
|
+
if (fused) {
|
|
354
|
+
yield* recordFuseDiagnostic;
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
yield* writeValue(computeValue(snapshot));
|
|
358
|
+
}
|
|
359
|
+
})
|
|
360
|
+
)
|
|
361
|
+
);
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
// ../logix-core/src/internal/state-trait/meta-diagnostics.ts
|
|
365
|
+
import { Effect as Effect2, FiberRef as FiberRef2 } from "../effect.js";
|
|
366
|
+
var formatList = (items, limit = 6) => {
|
|
367
|
+
if (!items || items.length === 0) return void 0;
|
|
368
|
+
if (items.length <= limit) return items.join(", ");
|
|
369
|
+
return `${items.slice(0, limit).join(", ")}, \u2026(+${items.length - limit})`;
|
|
370
|
+
};
|
|
371
|
+
var formatPart = (label, value) => {
|
|
372
|
+
if (value === void 0) return void 0;
|
|
373
|
+
return `${label}=${value}`;
|
|
374
|
+
};
|
|
375
|
+
var formatIssue = (issue) => {
|
|
376
|
+
const r = issue.report;
|
|
377
|
+
const parts = [];
|
|
378
|
+
if (r.invalidInput) parts.push("invalidInput=true");
|
|
379
|
+
const unknownKeys = formatList(r.unknownKeys, 6);
|
|
380
|
+
if (unknownKeys) {
|
|
381
|
+
parts.push(
|
|
382
|
+
`unknownKeys=[${unknownKeys}]${typeof r.unknownKeyCount === "number" && r.unknownKeyCount > r.unknownKeys.length ? ` total=${r.unknownKeyCount}` : ""}`
|
|
383
|
+
);
|
|
384
|
+
}
|
|
385
|
+
const droppedKeys = formatList(r.droppedKeys, 6);
|
|
386
|
+
if (droppedKeys) parts.push(`droppedKeys=[${droppedKeys}]`);
|
|
387
|
+
if (typeof r.droppedTagItems === "number" && r.droppedTagItems > 0) {
|
|
388
|
+
parts.push(`droppedTagItems=${r.droppedTagItems}`);
|
|
389
|
+
}
|
|
390
|
+
const ignoredAnnotationKeys = formatList(r.ignoredAnnotationKeys, 6);
|
|
391
|
+
if (ignoredAnnotationKeys) {
|
|
392
|
+
parts.push(
|
|
393
|
+
`ignoredAnnotationKeys=[${ignoredAnnotationKeys}]${typeof r.ignoredAnnotationKeyCount === "number" && r.ignoredAnnotationKeyCount > r.ignoredAnnotationKeys.length ? ` total=${r.ignoredAnnotationKeyCount}` : ""}`
|
|
394
|
+
);
|
|
395
|
+
}
|
|
396
|
+
const droppedAnnotationKeys = formatList(r.droppedAnnotationKeys, 6);
|
|
397
|
+
if (droppedAnnotationKeys) {
|
|
398
|
+
parts.push(
|
|
399
|
+
`droppedAnnotationKeys=[${droppedAnnotationKeys}]${typeof r.droppedAnnotationKeyCount === "number" && r.droppedAnnotationKeyCount > r.droppedAnnotationKeys.length ? ` total=${r.droppedAnnotationKeyCount}` : ""}`
|
|
400
|
+
);
|
|
401
|
+
}
|
|
402
|
+
const droppedValues = formatPart("droppedAnnotationValues", r.droppedAnnotationValues);
|
|
403
|
+
if (droppedValues) parts.push(droppedValues);
|
|
404
|
+
const nonSerializable = formatPart("nonSerializable", r.droppedAnnotationNonSerializable);
|
|
405
|
+
const depthExceeded = formatPart("depthExceeded", r.droppedAnnotationDepthExceeded);
|
|
406
|
+
const nonFiniteNumber = formatPart("nonFiniteNumber", r.droppedAnnotationNonFiniteNumber);
|
|
407
|
+
const reasons = [nonSerializable, depthExceeded, nonFiniteNumber].filter((x) => x !== void 0);
|
|
408
|
+
if (reasons.length > 0) parts.push(`reasons={${reasons.join(", ")}}`);
|
|
409
|
+
return `[${issue.origin}] ${parts.join(" ")}`;
|
|
410
|
+
};
|
|
411
|
+
var collectNodeMetaIssues = (program) => {
|
|
412
|
+
const spec = program.spec;
|
|
413
|
+
if (!spec || typeof spec !== "object") return [];
|
|
414
|
+
const isNode = (value) => typeof value === "object" && value !== null && value._tag === "StateTraitNode";
|
|
415
|
+
const isList = (value) => typeof value === "object" && value !== null && value._tag === "StateTraitList";
|
|
416
|
+
const issues = [];
|
|
417
|
+
const add = (origin, meta) => {
|
|
418
|
+
const { report } = sanitizeWithReport(meta);
|
|
419
|
+
if (report) issues.push({ origin, report });
|
|
420
|
+
};
|
|
421
|
+
for (const key of Object.keys(spec)) {
|
|
422
|
+
const raw = spec[key];
|
|
423
|
+
if (!raw) continue;
|
|
424
|
+
if (isList(raw)) {
|
|
425
|
+
if (raw.item && isNode(raw.item) && raw.item.meta !== void 0) {
|
|
426
|
+
add(`node:${key}[]`, raw.item.meta);
|
|
427
|
+
}
|
|
428
|
+
if (raw.list && isNode(raw.list) && raw.list.meta !== void 0) {
|
|
429
|
+
add(`node:${key}`, raw.list.meta);
|
|
430
|
+
}
|
|
431
|
+
continue;
|
|
432
|
+
}
|
|
433
|
+
if (isNode(raw)) {
|
|
434
|
+
if (raw.meta === void 0) continue;
|
|
435
|
+
add(`node:${key === "$root" ? "$root" : key}`, raw.meta);
|
|
436
|
+
continue;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
return issues;
|
|
440
|
+
};
|
|
441
|
+
var collectEntryMetaIssues = (program) => {
|
|
442
|
+
const issues = [];
|
|
443
|
+
for (const entry of program.entries) {
|
|
444
|
+
if (entry.kind !== "source" && entry.kind !== "externalStore") continue;
|
|
445
|
+
const rawMeta = entry.meta?.meta;
|
|
446
|
+
if (rawMeta === void 0) continue;
|
|
447
|
+
const origin = entry.kind === "source" ? `source:${entry.fieldPath}` : `externalStore:${entry.fieldPath}`;
|
|
448
|
+
const { report } = sanitizeWithReport(rawMeta);
|
|
449
|
+
if (report) issues.push({ origin, report });
|
|
450
|
+
}
|
|
451
|
+
return issues;
|
|
452
|
+
};
|
|
453
|
+
var emitMetaSanitizeDiagnostics = (program, ctx) => Effect2.gen(function* () {
|
|
454
|
+
if (!isDevEnv()) return;
|
|
455
|
+
const level = yield* FiberRef2.get(currentDiagnosticsLevel);
|
|
456
|
+
if (level === "off") return;
|
|
457
|
+
const moduleId = ctx.moduleId ?? "unknown";
|
|
458
|
+
const shouldEmit = yield* onceInRunSession(`meta_sanitize:${moduleId}`);
|
|
459
|
+
if (!shouldEmit) return;
|
|
460
|
+
const issues = [...collectNodeMetaIssues(program), ...collectEntryMetaIssues(program)];
|
|
461
|
+
if (issues.length === 0) return;
|
|
462
|
+
const limit = level === "light" || level === "sampled" ? 8 : 24;
|
|
463
|
+
const lines = issues.slice(0, limit).map(formatIssue);
|
|
464
|
+
if (issues.length > limit) {
|
|
465
|
+
lines.push(`\u2026(+${issues.length - limit})`);
|
|
466
|
+
}
|
|
467
|
+
yield* record({
|
|
468
|
+
type: "diagnostic",
|
|
469
|
+
moduleId: ctx.moduleId,
|
|
470
|
+
instanceId: ctx.instanceId,
|
|
471
|
+
code: "state_trait::meta_sanitized",
|
|
472
|
+
severity: "warning",
|
|
473
|
+
message: `[meta] TraitMeta contains non-exportable fields/values and will be sanitized (total ${issues.length}):
|
|
474
|
+
${lines.join("\n")}`,
|
|
475
|
+
hint: "TraitMeta is export-only (Devtools/Static IR) and MUST be JsonValue. Use `annotations` with `x-*` keys for extension hints; avoid closures/functions/Effect/Fiber/Tag/DOM/BigInt/circular refs. See specs/016 and docs/ssot/platform/contracts/03-control-surface-manifest.md.",
|
|
476
|
+
kind: "meta_sanitized"
|
|
477
|
+
});
|
|
478
|
+
});
|
|
479
|
+
|
|
480
|
+
// ../logix-core/src/internal/state-trait/install.ts
|
|
481
|
+
var buildEntryIndex = (entries) => {
|
|
482
|
+
const index = /* @__PURE__ */ new Map();
|
|
483
|
+
for (const entry of entries) {
|
|
484
|
+
const list2 = index.get(entry.fieldPath) ?? [];
|
|
485
|
+
list2.push(entry);
|
|
486
|
+
index.set(entry.fieldPath, list2);
|
|
487
|
+
}
|
|
488
|
+
return index;
|
|
489
|
+
};
|
|
490
|
+
var install = (bound, program) => {
|
|
491
|
+
return Effect3.gen(function* () {
|
|
492
|
+
let internals;
|
|
493
|
+
try {
|
|
494
|
+
internals = getBoundInternals(bound);
|
|
495
|
+
internals.traits.registerStateTraitProgram(program, {
|
|
496
|
+
bumpReason: "logic_installed"
|
|
497
|
+
});
|
|
498
|
+
} catch {
|
|
499
|
+
}
|
|
500
|
+
if (internals) {
|
|
501
|
+
yield* emitMetaSanitizeDiagnostics(program, {
|
|
502
|
+
moduleId: internals.moduleId,
|
|
503
|
+
instanceId: internals.instanceId
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
const entryIndex = buildEntryIndex(program.entries);
|
|
507
|
+
const installStep = (step) => {
|
|
508
|
+
if (!step.targetFieldPath) {
|
|
509
|
+
return Effect3.void;
|
|
510
|
+
}
|
|
511
|
+
if (step.kind !== "source-refresh" && step.kind !== "external-store-sync") {
|
|
512
|
+
return Effect3.void;
|
|
513
|
+
}
|
|
514
|
+
const candidates = entryIndex.get(step.targetFieldPath);
|
|
515
|
+
if (!candidates || candidates.length === 0) {
|
|
516
|
+
return Effect3.void;
|
|
517
|
+
}
|
|
518
|
+
const entry = step.kind === "source-refresh" ? candidates.find((e) => e.kind === "source") : candidates.find((e) => e.kind === "externalStore");
|
|
519
|
+
if (!entry) {
|
|
520
|
+
return Effect3.void;
|
|
521
|
+
}
|
|
522
|
+
return step.kind === "source-refresh" ? installSourceRefresh(bound, step, entry) : installExternalStoreSync(bound, step, entry);
|
|
523
|
+
};
|
|
524
|
+
yield* Effect3.forEach(program.plan.steps, (step) => installStep(step)).pipe(Effect3.asVoid);
|
|
525
|
+
}).pipe(Effect3.asVoid);
|
|
526
|
+
};
|
|
527
|
+
|
|
528
|
+
// ../logix-core/src/StateTrait.ts
|
|
529
|
+
var $root = "$root";
|
|
530
|
+
var from = (_schema) => (spec) => spec;
|
|
531
|
+
var node = (spec) => ({
|
|
532
|
+
_tag: "StateTraitNode",
|
|
533
|
+
...spec
|
|
534
|
+
});
|
|
535
|
+
var list = (spec) => ({
|
|
536
|
+
_tag: "StateTraitList",
|
|
537
|
+
...spec
|
|
538
|
+
});
|
|
539
|
+
var computed = (input) => {
|
|
540
|
+
const derive = (state) => {
|
|
541
|
+
const args = input.deps.map((dep) => getAtPath(state, dep));
|
|
542
|
+
return input.get(...args);
|
|
543
|
+
};
|
|
544
|
+
return {
|
|
545
|
+
fieldPath: void 0,
|
|
546
|
+
kind: "computed",
|
|
547
|
+
meta: {
|
|
548
|
+
deps: input.deps,
|
|
549
|
+
derive,
|
|
550
|
+
equals: input.equals,
|
|
551
|
+
...input.scheduling ? { scheduling: input.scheduling } : {}
|
|
552
|
+
}
|
|
553
|
+
};
|
|
554
|
+
};
|
|
555
|
+
var source = (input) => {
|
|
556
|
+
const key = (state) => {
|
|
557
|
+
const args = input.deps.map((dep) => getAtPath(state, dep));
|
|
558
|
+
return input.key(...args);
|
|
559
|
+
};
|
|
560
|
+
return {
|
|
561
|
+
fieldPath: void 0,
|
|
562
|
+
kind: "source",
|
|
563
|
+
meta: { ...input, key }
|
|
564
|
+
};
|
|
565
|
+
};
|
|
566
|
+
var externalStore = (input) => ({
|
|
567
|
+
fieldPath: void 0,
|
|
568
|
+
kind: "externalStore",
|
|
569
|
+
meta: input
|
|
570
|
+
});
|
|
571
|
+
var link = (meta) => ({
|
|
572
|
+
fieldPath: void 0,
|
|
573
|
+
kind: "link",
|
|
574
|
+
meta: { ...meta, ...meta.scheduling ? { scheduling: meta.scheduling } : {} }
|
|
575
|
+
});
|
|
576
|
+
var build2 = (stateSchema, spec) => build(stateSchema, spec);
|
|
577
|
+
var install2 = (bound, program) => install(bound, program);
|
|
578
|
+
var exportStaticIr2 = (program, moduleId, options) => exportStaticIr({
|
|
579
|
+
program,
|
|
580
|
+
moduleId,
|
|
581
|
+
version: options?.version
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
export {
|
|
585
|
+
$root,
|
|
586
|
+
from,
|
|
587
|
+
node,
|
|
588
|
+
list,
|
|
589
|
+
computed,
|
|
590
|
+
source,
|
|
591
|
+
externalStore,
|
|
592
|
+
link,
|
|
593
|
+
build2 as build,
|
|
594
|
+
install2 as install,
|
|
595
|
+
exportStaticIr2 as exportStaticIr
|
|
596
|
+
};
|
|
597
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvc3RhdGUtdHJhaXQvaW5zdGFsbC50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9zdGF0ZS10cmFpdC9leHRlcm5hbC1zdG9yZS50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9zdGF0ZS10cmFpdC9tZXRhLWRpYWdub3N0aWNzLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL1N0YXRlVHJhaXQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IEVmZmVjdCB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB0eXBlIHsgQm91bmRBcGkgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvbW9kdWxlLmpzJ1xuaW1wb3J0IHsgZ2V0Qm91bmRJbnRlcm5hbHMgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvcnVudGltZUludGVybmFsc0FjY2Vzc29yLmpzJ1xuaW1wb3J0ICogYXMgU291cmNlUnVudGltZSBmcm9tICcuL3NvdXJjZS5qcydcbmltcG9ydCAqIGFzIEV4dGVybmFsU3RvcmVSdW50aW1lIGZyb20gJy4vZXh0ZXJuYWwtc3RvcmUuanMnXG5pbXBvcnQgKiBhcyBNZXRhRGlhZ25vc3RpY3MgZnJvbSAnLi9tZXRhLWRpYWdub3N0aWNzLmpzJ1xuaW1wb3J0IHR5cGUge1xuICBTdGF0ZVRyYWl0UHJvZ3JhbSxcbiAgU3RhdGVUcmFpdFBsYW5TdGVwLFxuICBTdGF0ZVRyYWl0RW50cnksXG4gIFRyYWl0Q29udmVyZ2VHZW5lcmF0aW9uQnVtcFJlYXNvbixcbn0gZnJvbSAnLi9tb2RlbC5qcydcblxuY29uc3QgYnVpbGRFbnRyeUluZGV4ID0gPFM+KFxuICBlbnRyaWVzOiBSZWFkb25seUFycmF5PFN0YXRlVHJhaXRFbnRyeTxTLCBzdHJpbmc+Pixcbik6IE1hcDxzdHJpbmcsIEFycmF5PFN0YXRlVHJhaXRFbnRyeTxTLCBzdHJpbmc+Pj4gPT4ge1xuICBjb25zdCBpbmRleCA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTxTdGF0ZVRyYWl0RW50cnk8Uywgc3RyaW5nPj4+KClcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgbGlzdCA9IGluZGV4LmdldChlbnRyeS5maWVsZFBhdGgpID8/IFtdXG4gICAgbGlzdC5wdXNoKGVudHJ5KVxuICAgIGluZGV4LnNldChlbnRyeS5maWVsZFBhdGgsIGxpc3QpXG4gIH1cbiAgcmV0dXJuIGluZGV4XG59XG5cbi8qKlxuICogSW5zdGFsbCBiZWhhdmlvcnMgZGVzY3JpYmVkIGJ5IFN0YXRlVHJhaXRQcm9ncmFtIG9udG8gdGhlIGdpdmVuIEJvdW5kIEFQSS5cbiAqXG4gKiAtIFBoYXNlIDIgbWluaW1hbCBpbXBsZW1lbnRhdGlvbjpcbiAqICAgLSBSZWdpc3RlciB3YXRjaGVycyBmb3IgY29tcHV0ZWQgZmllbGRzOiByZWNvbXB1dGUgdGFyZ2V0IGZpZWxkcyB3aGVuIFN0YXRlIGNoYW5nZXMuXG4gKiAgIC0gUmVnaXN0ZXIgd2F0Y2hlcnMgZm9yIGxpbmsgZmllbGRzOiBzeW5jIHRhcmdldCBmaWVsZHMgd2hlbiBzb3VyY2UgZmllbGRzIGNoYW5nZS5cbiAqICAgLSBSZXNlcnZlIHJlZnJlc2ggZW50cnlwb2ludHMgZm9yIHNvdXJjZSBmaWVsZHMgKG5vIGV4dGVybmFsIGNhbGxzIHlldCkuXG4gKlxuICogTm90ZXM6XG4gKiAtIEFsbCB3YXRjaGVycyBhcmUgaW5zdGFsbGVkIHZpYSBCb3VuZCBBUEkgYCRgLCB3aXRob3V0IGRpcmVjdGx5IGRlcGVuZGluZyBvbiBNb2R1bGVSdW50aW1lLlxuICogLSBFYWNoIFBsYW5TdGVwIGNvcnJlc3BvbmRzIHRvIGEgbG9uZy1saXZlZCBFZmZlY3QgYW5kIGlzIG1vdW50ZWQgaW50byB0aGUgUnVudGltZSBTY29wZSB2aWEgZm9ya1Njb3BlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGluc3RhbGwgPSA8Uz4oXG4gIGJvdW5kOiBCb3VuZEFwaTxhbnksIGFueT4sXG4gIHByb2dyYW06IFN0YXRlVHJhaXRQcm9ncmFtPFM+LFxuKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9PiB7XG4gIHJldHVybiBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgLy8gUmVnaXN0ZXIgdGhlIHByb2dyYW0gdG8gUnVudGltZSBmaXJzdCAodGhlIGNvbnZlcmdlIGVuZ2luZSBydW5zIGNvbXB1dGVkL2xpbmsvY2hlY2sgYmVmb3JlIHR4biBjb21taXQpLlxuICAgIGxldCBpbnRlcm5hbHM6IGFueSB8IHVuZGVmaW5lZFxuICAgIHRyeSB7XG4gICAgICBpbnRlcm5hbHMgPSBnZXRCb3VuZEludGVybmFscyhib3VuZCBhcyBhbnkpXG4gICAgICA7KGludGVybmFscy50cmFpdHMucmVnaXN0ZXJTdGF0ZVRyYWl0UHJvZ3JhbSBhcyBhbnkpKHByb2dyYW0sIHtcbiAgICAgICAgYnVtcFJlYXNvbjogJ2xvZ2ljX2luc3RhbGxlZCcgYXMgVHJhaXRDb252ZXJnZUdlbmVyYXRpb25CdW1wUmVhc29uLFxuICAgICAgfSlcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIG5vLW9wIGZvciBsZWdhY3kvbW9ja2VkIGJvdW5kXG4gICAgfVxuXG4gICAgaWYgKGludGVybmFscykge1xuICAgICAgeWllbGQqIE1ldGFEaWFnbm9zdGljcy5lbWl0TWV0YVNhbml0aXplRGlhZ25vc3RpY3MocHJvZ3JhbSBhcyBhbnksIHtcbiAgICAgICAgbW9kdWxlSWQ6IGludGVybmFscy5tb2R1bGVJZCxcbiAgICAgICAgaW5zdGFuY2VJZDogaW50ZXJuYWxzLmluc3RhbmNlSWQsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IGVudHJ5SW5kZXggPSBidWlsZEVudHJ5SW5kZXgocHJvZ3JhbS5lbnRyaWVzIGFzIGFueSlcblxuICAgIGNvbnN0IGluc3RhbGxTdGVwID0gKHN0ZXA6IFN0YXRlVHJhaXRQbGFuU3RlcCk6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPT4ge1xuICAgICAgaWYgKCFzdGVwLnRhcmdldEZpZWxkUGF0aCkge1xuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICAgIH1cblxuICAgICAgaWYgKHN0ZXAua2luZCAhPT0gJ3NvdXJjZS1yZWZyZXNoJyAmJiBzdGVwLmtpbmQgIT09ICdleHRlcm5hbC1zdG9yZS1zeW5jJykge1xuICAgICAgICAvLyBjb21wdXRlZC9saW5rL2NoZWNrIGFyZSBoYW5kbGVkIGJ5IHRoZSBydW50aW1lIGNvcmUgd2l0aGluIHRoZSB0cmFuc2FjdGlvbiB3aW5kb3c7IGluc3RhbGwga2VlcHMgb25seSBzb3VyY2UucmVmcmVzaC9leHRlcm5hbFN0b3JlIHN5bmMgZW50cnlwb2ludHMuXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZFxuICAgICAgfVxuXG4gICAgICBjb25zdCBjYW5kaWRhdGVzID0gZW50cnlJbmRleC5nZXQoc3RlcC50YXJnZXRGaWVsZFBhdGgpXG4gICAgICBpZiAoIWNhbmRpZGF0ZXMgfHwgY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gVGhlIHBsYW4gcmVmZXJlbmNlcyBhIG1pc3Npbmcgc3BlYzogdHJlYXQgaXQgYXMgYSBidWlsZC10aW1lIGJ1ZyBhbmQgaWdub3JlIHRoZSBzdGVwIGhlcmUuXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZFxuICAgICAgfVxuXG4gICAgICBjb25zdCBlbnRyeSA9XG4gICAgICAgIHN0ZXAua2luZCA9PT0gJ3NvdXJjZS1yZWZyZXNoJ1xuICAgICAgICAgID8gY2FuZGlkYXRlcy5maW5kKChlKSA9PiBlLmtpbmQgPT09ICdzb3VyY2UnKVxuICAgICAgICAgIDogY2FuZGlkYXRlcy5maW5kKChlKSA9PiBlLmtpbmQgPT09ICdleHRlcm5hbFN0b3JlJylcblxuICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0ZXAua2luZCA9PT0gJ3NvdXJjZS1yZWZyZXNoJ1xuICAgICAgICA/IFNvdXJjZVJ1bnRpbWUuaW5zdGFsbFNvdXJjZVJlZnJlc2goYm91bmQsIHN0ZXAsIGVudHJ5IGFzIGFueSlcbiAgICAgICAgOiBFeHRlcm5hbFN0b3JlUnVudGltZS5pbnN0YWxsRXh0ZXJuYWxTdG9yZVN5bmMoYm91bmQsIHN0ZXAsIGVudHJ5IGFzIGFueSlcbiAgICB9XG5cbiAgICB5aWVsZCogRWZmZWN0LmZvckVhY2gocHJvZ3JhbS5wbGFuLnN0ZXBzLCAoc3RlcCkgPT4gaW5zdGFsbFN0ZXAoc3RlcCkpLnBpcGUoRWZmZWN0LmFzVm9pZClcbiAgfSkucGlwZShFZmZlY3QuYXNWb2lkKVxufVxuIiwgImltcG9ydCB7IENvbnRleHQsIEVmZmVjdCwgRmliZXJSZWYsIE9wdGlvbiB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJ211dGF0aXZlJ1xuaW1wb3J0IHR5cGUgeyBCb3VuZEFwaSB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9tb2R1bGUuanMnXG5pbXBvcnQgeyBnZXRCb3VuZEludGVybmFscyB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9ydW50aW1lSW50ZXJuYWxzQWNjZXNzb3IuanMnXG5pbXBvcnQgKiBhcyBUYXNrUnVubmVyIGZyb20gJy4uL3J1bnRpbWUvY29yZS9UYXNrUnVubmVyLmpzJ1xuaW1wb3J0ICogYXMgRGVidWcgZnJvbSAnLi4vcnVudGltZS9jb3JlL0RlYnVnU2luay5qcydcbmltcG9ydCB7IGdldEV4dGVybmFsU3RvcmVEZXNjcmlwdG9yIH0gZnJvbSAnLi4vZXh0ZXJuYWwtc3RvcmUtZGVzY3JpcHRvci5qcydcbmltcG9ydCB7IG5vcm1hbGl6ZUZpZWxkUGF0aCB9IGZyb20gJy4uL2ZpZWxkLXBhdGguanMnXG5pbXBvcnQgeyBEZWNsYXJhdGl2ZUxpbmtSdW50aW1lVGFnLCBIb3N0U2NoZWR1bGVyVGFnIH0gZnJvbSAnLi4vcnVudGltZS9jb3JlL2Vudi5qcydcbmltcG9ydCB7IGdldEdsb2JhbEhvc3RTY2hlZHVsZXIgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvSG9zdFNjaGVkdWxlci5qcydcbmltcG9ydCAqIGFzIFJvd0lkIGZyb20gJy4vcm93aWQuanMnXG5pbXBvcnQgdHlwZSB7IFN0YXRlVHJhaXRFbnRyeSwgU3RhdGVUcmFpdFBsYW5TdGVwIH0gZnJvbSAnLi9tb2RlbC5qcydcblxuY29uc3QgaXNGbiA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzICguLi5hcmdzOiBSZWFkb25seUFycmF5PGFueT4pID0+IHVua25vd24gPT4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nXG5cbnR5cGUgRXh0ZXJuYWxTdG9yZUVudHJ5PFM+ID0gRXh0cmFjdDxTdGF0ZVRyYWl0RW50cnk8Uywgc3RyaW5nPiwgeyByZWFkb25seSBraW5kOiAnZXh0ZXJuYWxTdG9yZScgfT5cblxuY29uc3QgcmVzb2x2ZVN0b3JlID0gKGVudHJ5OiBFeHRlcm5hbFN0b3JlRW50cnk8YW55Pik6IEVmZmVjdC5FZmZlY3Q8YW55LCBuZXZlciwgYW55PiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3Qgc3RvcmUgPSAoZW50cnkubWV0YSBhcyBhbnkpPy5zdG9yZVxuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBnZXRFeHRlcm5hbFN0b3JlRGVzY3JpcHRvcihzdG9yZSlcblxuICAgIGlmIChkZXNjcmlwdG9yPy5raW5kID09PSAnc2VydmljZScpIHtcbiAgICAgIGNvbnN0IHNlcnZpY2UgPSB5aWVsZCogZGVzY3JpcHRvci50YWdcbiAgICAgIHJldHVybiBkZXNjcmlwdG9yLm1hcChzZXJ2aWNlKVxuICAgIH1cblxuICAgIHJldHVybiBzdG9yZVxuICB9KVxuXG5leHBvcnQgY29uc3QgaW5zdGFsbEV4dGVybmFsU3RvcmVTeW5jID0gPFM+KFxuICBib3VuZDogQm91bmRBcGk8YW55LCBhbnk+LFxuICBzdGVwOiBTdGF0ZVRyYWl0UGxhblN0ZXAsXG4gIGVudHJ5OiBFeHRlcm5hbFN0b3JlRW50cnk8Uz4sXG4pOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBmaWVsZFBhdGggPSBzdGVwLnRhcmdldEZpZWxkUGF0aFxuICAgIGlmICghZmllbGRQYXRoKSByZXR1cm5cblxuICAgIGNvbnN0IGVudiA9IHlpZWxkKiBFZmZlY3QuY29udGV4dDxhbnk+KClcbiAgICBjb25zdCBob3N0U2NoZWR1bGVyT3B0ID0geWllbGQqIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKEhvc3RTY2hlZHVsZXJUYWcpXG4gICAgY29uc3QgaG9zdFNjaGVkdWxlciA9IE9wdGlvbi5pc1NvbWUoaG9zdFNjaGVkdWxlck9wdCkgPyBob3N0U2NoZWR1bGVyT3B0LnZhbHVlIDogZ2V0R2xvYmFsSG9zdFNjaGVkdWxlcigpXG4gICAgY29uc3QgbWljcm90YXNrID0gRWZmZWN0LmFzeW5jPHZvaWQsIG5ldmVyPigocmVzdW1lKSA9PiB7XG4gICAgICBob3N0U2NoZWR1bGVyLnNjaGVkdWxlTWljcm90YXNrKCgpID0+IHJlc3VtZShFZmZlY3Qudm9pZCkpXG4gICAgfSlcblxuICAgIGxldCBpbnRlcm5hbHM6IFJldHVyblR5cGU8dHlwZW9mIGdldEJvdW5kSW50ZXJuYWxzPlxuICAgIHRyeSB7XG4gICAgICBpbnRlcm5hbHMgPSBnZXRCb3VuZEludGVybmFscyhib3VuZCBhcyBhbnkpXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3QgPSAoZW50cnkubWV0YSBhcyBhbnkpPy5zZWxlY3QgYXMgKChzbmFwc2hvdDogdW5rbm93bikgPT4gdW5rbm93bikgfCB1bmRlZmluZWRcbiAgICBjb25zdCBlcXVhbHMgPSAoZW50cnkubWV0YSBhcyBhbnkpPy5lcXVhbHMgYXMgKChhOiB1bmtub3duLCBiOiB1bmtub3duKSA9PiBib29sZWFuKSB8IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgY29tcHV0ZVZhbHVlID0gKHNuYXBzaG90OiB1bmtub3duKTogdW5rbm93biA9PiAoaXNGbihzZWxlY3QpID8gc2VsZWN0KHNuYXBzaG90KSA6IHNuYXBzaG90KVxuICAgIGNvbnN0IGlzRXF1YWwgPSAoYTogdW5rbm93biwgYjogdW5rbm93bik6IGJvb2xlYW4gPT4gKGlzRm4oZXF1YWxzKSA/IGVxdWFscyhhLCBiKSA6IE9iamVjdC5pcyhhLCBiKSlcblxuICAgIGNvbnN0IHRyYWl0TGFuZSA9IChlbnRyeS5tZXRhIGFzIGFueSk/LnByaW9yaXR5IGFzICd1cmdlbnQnIHwgJ25vblVyZ2VudCcgfCB1bmRlZmluZWRcblxuICAgIGNvbnN0IHJhd1N0b3JlID0gKGVudHJ5Lm1ldGEgYXMgYW55KT8uc3RvcmVcbiAgICBjb25zdCByYXdEZXNjcmlwdG9yID0gZ2V0RXh0ZXJuYWxTdG9yZURlc2NyaXB0b3IocmF3U3RvcmUpXG5cbiAgICBpZiAocmF3RGVzY3JpcHRvcj8ua2luZCA9PT0gJ21vZHVsZScpIHtcbiAgICAgIGNvbnN0IGxpbmtSdW50aW1lT3B0ID0geWllbGQqIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKERlY2xhcmF0aXZlTGlua1J1bnRpbWVUYWcpXG4gICAgICBpZiAoT3B0aW9uLmlzTm9uZShsaW5rUnVudGltZU9wdCkpIHtcbiAgICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3QuZGllTWVzc2FnZSgnW1N0YXRlVHJhaXQuZXh0ZXJuYWxTdG9yZV0gTWlzc2luZyBEZWNsYXJhdGl2ZUxpbmtSdW50aW1lIHNlcnZpY2UgKDA3MykuJylcbiAgICAgIH1cblxuICAgICAgY29uc3QgbW9kdWxlID0gcmF3RGVzY3JpcHRvci5tb2R1bGVcblxuICAgICAgY29uc3Qgc291cmNlUnVudGltZSA9ICgoKSA9PiB7XG4gICAgICAgIGlmIChtb2R1bGUgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBjb25zdCBtb2R1bGVJZCA9IChtb2R1bGUgYXMgYW55KS5tb2R1bGVJZFxuICAgICAgICAgIGNvbnN0IGluc3RhbmNlSWQgPSAobW9kdWxlIGFzIGFueSkuaW5zdGFuY2VJZFxuICAgICAgICAgIGNvbnN0IGdldFN0YXRlID0gKG1vZHVsZSBhcyBhbnkpLmdldFN0YXRlXG4gICAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGVJZCA9PT0gJ3N0cmluZycgJiYgbW9kdWxlSWQubGVuZ3RoID4gMCAmJiB0eXBlb2YgaW5zdGFuY2VJZCA9PT0gJ3N0cmluZycgJiYgaW5zdGFuY2VJZC5sZW5ndGggPiAwICYmIGdldFN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9kdWxlIGFzIGFueVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHRhZyA9IChtb2R1bGUgYXMgYW55KS50YWdcbiAgICAgICAgICBpZiAodGFnICYmIENvbnRleHQuaXNUYWcodGFnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGludGVybmFscy5pbXBvcnRzLmdldCh0YWcgYXMgYW55KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChDb250ZXh0LmlzVGFnKG1vZHVsZSBhcyBhbnkpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxzLmltcG9ydHMuZ2V0KG1vZHVsZSBhcyBhbnkpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH0pKClcblxuICAgICAgaWYgKCFzb3VyY2VSdW50aW1lKSB7XG4gICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LmRpZU1lc3NhZ2UoXG4gICAgICAgICAgYFtTdGF0ZVRyYWl0LmV4dGVybmFsU3RvcmVdIE1vZHVsZS1hcy1Tb3VyY2Ugc3RvcmUgaXMgdW5yZXNvbHZlZCBmb3IgXCIke2ZpZWxkUGF0aH1cIi4gYCArXG4gICAgICAgICAgICBgRml4OiBpbmNsdWRlIHRoZSBzb3VyY2UgTW9kdWxlVGFnIGluIG1vZHVsZSBpbXBvcnRzIChtb2R1bGVJZD0ke3Jhd0Rlc2NyaXB0b3IubW9kdWxlSWR9KS5gLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGlmIChyYXdEZXNjcmlwdG9yLmluc3RhbmNlSWQgJiYgcmF3RGVzY3JpcHRvci5pbnN0YW5jZUlkICE9PSBzb3VyY2VSdW50aW1lLmluc3RhbmNlSWQpIHtcbiAgICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3QuZGllTWVzc2FnZShcbiAgICAgICAgICBgW1N0YXRlVHJhaXQuZXh0ZXJuYWxTdG9yZV0gTW9kdWxlLWFzLVNvdXJjZSBpbnN0YW5jZUlkIG1pc21hdGNoIGZvciBcIiR7ZmllbGRQYXRofVwiLiBgICtcbiAgICAgICAgICAgIGBkZXNjcmlwdG9yLmluc3RhbmNlSWQ9JHtyYXdEZXNjcmlwdG9yLmluc3RhbmNlSWR9LCByZXNvbHZlZC5pbnN0YW5jZUlkPSR7c291cmNlUnVudGltZS5pbnN0YW5jZUlkfWAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgaWYgKHNvdXJjZVJ1bnRpbWUubW9kdWxlSWQgIT09IHJhd0Rlc2NyaXB0b3IubW9kdWxlSWQpIHtcbiAgICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3QuZGllTWVzc2FnZShcbiAgICAgICAgICBgW1N0YXRlVHJhaXQuZXh0ZXJuYWxTdG9yZV0gTW9kdWxlLWFzLVNvdXJjZSBtb2R1bGVJZCBtaXNtYXRjaCBmb3IgXCIke2ZpZWxkUGF0aH1cIi4gYCArXG4gICAgICAgICAgICBgZGVzY3JpcHRvci5tb2R1bGVJZD0ke3Jhd0Rlc2NyaXB0b3IubW9kdWxlSWR9LCByZXNvbHZlZC5tb2R1bGVJZD0ke3NvdXJjZVJ1bnRpbWUubW9kdWxlSWR9YCxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGF0aWNJciA9IHJhd0Rlc2NyaXB0b3IucmVhZFF1ZXJ5LnN0YXRpY0lyXG4gICAgICBjb25zdCBpc1JlY29nbml6YWJsZVN0YXRpYyA9XG4gICAgICAgIHN0YXRpY0lyLmxhbmUgPT09ICdzdGF0aWMnICYmIHN0YXRpY0lyLnJlYWRzRGlnZXN0ICE9IG51bGwgJiYgc3RhdGljSXIuZmFsbGJhY2tSZWFzb24gPT0gbnVsbFxuXG4gICAgICBpZiAoIWlzUmVjb2duaXphYmxlU3RhdGljKSB7XG4gICAgICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgICAgIHR5cGU6ICdkaWFnbm9zdGljJyxcbiAgICAgICAgICBtb2R1bGVJZDogaW50ZXJuYWxzLm1vZHVsZUlkLFxuICAgICAgICAgIGluc3RhbmNlSWQ6IGludGVybmFscy5pbnN0YW5jZUlkLFxuICAgICAgICAgIGNvZGU6ICdleHRlcm5hbF9zdG9yZTo6bW9kdWxlX3NvdXJjZV9kZWdyYWRlZCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcbiAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgJ1tTdGF0ZVRyYWl0LmV4dGVybmFsU3RvcmVdIE1vZHVsZS1hcy1Tb3VyY2Ugc2VsZWN0b3IgaXMgbm90IGZ1bGx5IElSLXJlY29nbml6YWJsZTsgZmFsbGluZyBiYWNrIHRvIG1vZHVsZS10b3BpYyBlZGdlIChtYXkgcmVkdWNlIHBlcmYpLicsXG4gICAgICAgICAgaGludDpcbiAgICAgICAgICAgICdGaXg6IHByb3ZpZGUgYSBzdGF0aWMgUmVhZFF1ZXJ5IChSZWFkUXVlcnkubWFrZSkgb3IgYW5ub3RhdGUgc2VsZWN0b3IuZmllbGRQYXRocyB0byBnZXQgYSBzdGFibGUgcmVhZHNEaWdlc3Q7IGF2b2lkIGR5bmFtaWMgbGFuZS4nLFxuICAgICAgICAgIGtpbmQ6ICdtb2R1bGVfYXNfc291cmNlX2RlZ3JhZGVkJyxcbiAgICAgICAgICB0cmlnZ2VyOiB7XG4gICAgICAgICAgICBraW5kOiAndHJhaXQnLFxuICAgICAgICAgICAgbmFtZTogJ2V4dGVybmFsU3RvcmUubW9kdWxlU291cmNlJyxcbiAgICAgICAgICAgIGRldGFpbHM6IHtcbiAgICAgICAgICAgICAgc291cmNlTW9kdWxlSWQ6IHJhd0Rlc2NyaXB0b3IubW9kdWxlSWQsXG4gICAgICAgICAgICAgIHNlbGVjdG9ySWQ6IHN0YXRpY0lyLnNlbGVjdG9ySWQsXG4gICAgICAgICAgICAgIGxhbmU6IHN0YXRpY0lyLmxhbmUsXG4gICAgICAgICAgICAgIGZhbGxiYWNrUmVhc29uOiBzdGF0aWNJci5mYWxsYmFja1JlYXNvbixcbiAgICAgICAgICAgICAgcmVhZHNEaWdlc3Q6IHN0YXRpY0lyLnJlYWRzRGlnZXN0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtb2R1bGVJbnN0YW5jZUtleSA9IGAke3NvdXJjZVJ1bnRpbWUubW9kdWxlSWR9Ojoke3NvdXJjZVJ1bnRpbWUuaW5zdGFuY2VJZH1gIGFzIGFueVxuXG4gICAgICBjb25zdCB3cml0ZVZhbHVlID0gKG5leHRWYWx1ZTogdW5rbm93bik6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIG5ldmVyPiA9PlxuICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgY29uc3QgaW5UeG4gPSB5aWVsZCogRmliZXJSZWYuZ2V0KFRhc2tSdW5uZXIuaW5TeW5jVHJhbnNhY3Rpb25GaWJlcilcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2U3RhdGUgPSAoeWllbGQqIGJvdW5kLnN0YXRlLnJlYWQpIGFzIGFueVxuICAgICAgICAgICAgY29uc3QgcHJldlZhbHVlID0gUm93SWQuZ2V0QXRQYXRoKHByZXZTdGF0ZSBhcyBhbnksIGZpZWxkUGF0aClcblxuICAgICAgICAgICAgaWYgKGlzRXF1YWwocHJldlZhbHVlLCBuZXh0VmFsdWUpKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBuZXh0RHJhZnQgPSBjcmVhdGUocHJldlN0YXRlLCAoZHJhZnQpID0+IHtcbiAgICAgICAgICAgICAgUm93SWQuc2V0QXRQYXRoTXV0YXRpbmcoZHJhZnQgYXMgYW55LCBmaWVsZFBhdGgsIG5leHRWYWx1ZSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVGaWVsZFBhdGgoZmllbGRQYXRoKSA/PyBbXVxuICAgICAgICAgICAgaW50ZXJuYWxzLnR4bi5yZWNvcmRTdGF0ZVBhdGNoKG5vcm1hbGl6ZWQsICd0cmFpdC1leHRlcm5hbC1zdG9yZScsIHByZXZWYWx1ZSwgbmV4dFZhbHVlLCBzdGVwLmlkKVxuICAgICAgICAgICAgaW50ZXJuYWxzLnR4bi51cGRhdGVEcmFmdChuZXh0RHJhZnQpXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmIChpblR4bikge1xuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiBib2R5XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc3RhdGVDb21taXRQcmlvcml0eSA9IHRyYWl0TGFuZSA9PT0gJ25vblVyZ2VudCcgPyAnbG93JyA6ICdub3JtYWwnXG4gICAgICAgICAgcmV0dXJuIHlpZWxkKiBpbnRlcm5hbHMudHhuLnJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBraW5kOiAndHJhaXQtZXh0ZXJuYWwtc3RvcmUnLFxuICAgICAgICAgICAgICBuYW1lOiBmaWVsZFBhdGgsXG4gICAgICAgICAgICAgIGRldGFpbHM6IHtcbiAgICAgICAgICAgICAgICBzdGF0ZUNvbW1pdDoge1xuICAgICAgICAgICAgICAgICAgcHJpb3JpdHk6IHN0YXRlQ29tbWl0UHJpb3JpdHksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiBib2R5LnBpcGUoRWZmZWN0LmFzVm9pZCksXG4gICAgICAgICAgKVxuICAgICAgICB9KS5waXBlKEVmZmVjdC5wcm92aWRlKGVudikpXG5cbiAgICAgIGNvbnN0IHVucmVnaXN0ZXIgPSBsaW5rUnVudGltZU9wdC52YWx1ZS5yZWdpc3Rlck1vZHVsZUFzU291cmNlTGluayh7XG4gICAgICAgIGlkOiBgJHtpbnRlcm5hbHMuaW5zdGFuY2VJZH06OmV4dGVybmFsU3RvcmU6JHtzdGVwLmlkfWAsXG4gICAgICAgIHNvdXJjZU1vZHVsZUluc3RhbmNlS2V5OiBtb2R1bGVJbnN0YW5jZUtleSxcbiAgICAgICAgcmVhZFF1ZXJ5OiByYXdEZXNjcmlwdG9yLnJlYWRRdWVyeSBhcyBhbnksXG4gICAgICAgIGNvbXB1dGVWYWx1ZSxcbiAgICAgICAgZXF1YWxzVmFsdWU6IGlzRXF1YWwsXG4gICAgICAgIGFwcGx5VmFsdWU6IHdyaXRlVmFsdWUsXG4gICAgICB9KVxuXG4gICAgICB5aWVsZCogRWZmZWN0LmFkZEZpbmFsaXplcigoKSA9PlxuICAgICAgICBFZmZlY3Quc3luYygoKSA9PiB7XG4gICAgICAgICAgdW5yZWdpc3RlcigpXG4gICAgICAgIH0pLFxuICAgICAgKVxuXG4gICAgICAvLyBJbml0aWFsIHN5bmM6IHJlYWQgdGhlIGN1cnJlbnQgc291cmNlIHNuYXBzaG90IGFuZCB3cml0ZSBpdCBiYWNrIGltbWVkaWF0ZWx5LlxuICAgICAgY29uc3QgaW5pdGlhbFN0YXRlID0geWllbGQqIChzb3VyY2VSdW50aW1lLmdldFN0YXRlIGFzIEVmZmVjdC5FZmZlY3Q8dW5rbm93biwgbmV2ZXIsIG5ldmVyPilcbiAgICAgIGNvbnN0IGluaXRpYWxTZWxlY3RlZCA9IHJhd0Rlc2NyaXB0b3IucmVhZFF1ZXJ5LnNlbGVjdChpbml0aWFsU3RhdGUgYXMgYW55KVxuICAgICAgeWllbGQqIHdyaXRlVmFsdWUoY29tcHV0ZVZhbHVlKGluaXRpYWxTZWxlY3RlZCkpXG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlID0gcmF3RGVzY3JpcHRvcj8ua2luZCA9PT0gJ3NlcnZpY2UnID8geWllbGQqIHJlc29sdmVTdG9yZShlbnRyeSkgOiByYXdTdG9yZVxuXG4gICAgaWYgKCFzdG9yZSB8fCB0eXBlb2Ygc3RvcmUgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4geWllbGQqIEVmZmVjdC5kaWVNZXNzYWdlKFxuICAgICAgICBgW1N0YXRlVHJhaXQuZXh0ZXJuYWxTdG9yZV0gSW52YWxpZCBzdG9yZSBmb3IgXCIke2ZpZWxkUGF0aH1cIi4gRXhwZWN0ZWQgeyBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlIH0uYCxcbiAgICAgIClcbiAgICB9XG4gICAgaWYgKCFpc0ZuKChzdG9yZSBhcyBhbnkpLmdldFNuYXBzaG90KSB8fCAhaXNGbigoc3RvcmUgYXMgYW55KS5zdWJzY3JpYmUpKSB7XG4gICAgICByZXR1cm4geWllbGQqIEVmZmVjdC5kaWVNZXNzYWdlKFxuICAgICAgICBgW1N0YXRlVHJhaXQuZXh0ZXJuYWxTdG9yZV0gSW52YWxpZCBzdG9yZSBmb3IgXCIke2ZpZWxkUGF0aH1cIi4gRXhwZWN0ZWQgeyBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlIH0uYCxcbiAgICAgIClcbiAgICB9XG5cbiAgICBsZXQgZnVzZWQgPSBmYWxzZVxuICAgIGxldCBmdXNlQ2F1c2U6IHVua25vd24gfCB1bmRlZmluZWRcbiAgICBsZXQgZnVzZVJlY29yZGVkID0gZmFsc2VcbiAgICBsZXQgcGVuZGluZyA9IGZhbHNlXG4gICAgbGV0IHJlc3VtZTogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG5cbiAgICBjb25zdCByZWNvcmRGdXNlRGlhZ25vc3RpYyA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGlmIChmdXNlUmVjb3JkZWQpIHJldHVyblxuICAgICAgZnVzZVJlY29yZGVkID0gdHJ1ZVxuXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAoKCkgPT4ge1xuICAgICAgICBpZiAoZnVzZUNhdXNlIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBmdXNlQ2F1c2UubWVzc2FnZVxuICAgICAgICBpZiAodHlwZW9mIGZ1c2VDYXVzZSA9PT0gJ3N0cmluZycpIHJldHVybiBmdXNlQ2F1c2VcbiAgICAgICAgcmV0dXJuICd1bmtub3duJ1xuICAgICAgfSkoKVxuXG4gICAgICB5aWVsZCogRGVidWcucmVjb3JkKHtcbiAgICAgICAgdHlwZTogJ2RpYWdub3N0aWMnLFxuICAgICAgICBtb2R1bGVJZDogaW50ZXJuYWxzLm1vZHVsZUlkLFxuICAgICAgICBpbnN0YW5jZUlkOiBpbnRlcm5hbHMuaW5zdGFuY2VJZCxcbiAgICAgICAgY29kZTogJ2V4dGVybmFsX3N0b3JlOjpzbmFwc2hvdF90aHJldycsXG4gICAgICAgIHNldmVyaXR5OiAnd2FybmluZycsXG4gICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgYFtTdGF0ZVRyYWl0LmV4dGVybmFsU3RvcmVdIHN0b3JlLmdldFNuYXBzaG90KCkgdGhyZXc7IHRyYWl0IGlzIGZ1c2VkIGFuZCB3aWxsIHN0b3Agc3luY2luZyBmb3IgXCIke2ZpZWxkUGF0aH1cIi5gLFxuICAgICAgICBoaW50OiAnRml4OiBlbnN1cmUgZ2V0U25hcHNob3QgaXMgc3luY2hyb25vdXMgYW5kIG5vbi10aHJvd2luZzsgYXN5bmMgcmVzb3VyY2VzIHNob3VsZCB1c2UgU3RhdGVUcmFpdC5zb3VyY2Ugb3IgRXh0ZXJuYWxTdG9yZS5mcm9tU3RyZWFtKHsgY3VycmVudC9pbml0aWFsIH0pLicsXG4gICAgICAgIGtpbmQ6ICdleHRlcm5hbF9zdG9yZV9mdXNlZDpnZXRfc25hcHNob3QnLFxuICAgICAgICB0cmlnZ2VyOiB7XG4gICAgICAgICAga2luZDogJ3RyYWl0JyxcbiAgICAgICAgICBuYW1lOiAnZXh0ZXJuYWxTdG9yZS5nZXRTbmFwc2hvdCcsXG4gICAgICAgICAgZGV0YWlsczoge1xuICAgICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgICAgdHJhaXRJZDogc3RlcC5pZCxcbiAgICAgICAgICAgIHN0b3JlS2luZDogcmF3RGVzY3JpcHRvcj8ua2luZCA/PyAncmF3JyxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGNvbnN0IHNpZ25hbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChmdXNlZCkgcmV0dXJuXG4gICAgICBpZiAocmVzdW1lKSB7XG4gICAgICAgIGNvbnN0IHIgPSByZXN1bWVcbiAgICAgICAgcGVuZGluZyA9IGZhbHNlXG4gICAgICAgIHIoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHBlbmRpbmcgPSB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgYXdhaXRTaWduYWwgPSAoKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgbmV2ZXI+ID0+IHtcbiAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgIHBlbmRpbmcgPSBmYWxzZVxuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIEVmZmVjdC5hc3luYzx2b2lkLCBuZXZlcj4oKHJlc3VtZUVmZmVjdCwgc2lnbmFsKSA9PiB7XG4gICAgICAgIGxldCBkb25lID0gZmFsc2VcbiAgICAgICAgY29uc3QgciA9ICgpID0+IHtcbiAgICAgICAgICBpZiAoZG9uZSkgcmV0dXJuXG4gICAgICAgICAgZG9uZSA9IHRydWVcbiAgICAgICAgICByZXN1bWUgPSB1bmRlZmluZWRcbiAgICAgICAgICByZXN1bWVFZmZlY3QoRWZmZWN0LnZvaWQpXG4gICAgICAgIH1cblxuICAgICAgICByZXN1bWUgPSByXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICdhYm9ydCcsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChyZXN1bWUgPT09IHIpIHtcbiAgICAgICAgICAgICAgICByZXN1bWUgPSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9LFxuICAgICAgICAgIClcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gYmVzdC1lZmZvcnRcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCBnZXRTbmFwc2hvdE9yRnVzZSA9ICgpOiB1bmtub3duID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiAoc3RvcmUgYXMgYW55KS5nZXRTbmFwc2hvdCgpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgZnVzZWQgPSB0cnVlXG4gICAgICAgIGZ1c2VDYXVzZSA9IGVyclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVhZFNuYXBzaG90T3JGdXNlID0gRWZmZWN0LmxvY2FsbHkoVGFza1J1bm5lci5pblN5bmNUcmFuc2FjdGlvbkZpYmVyLCBmYWxzZSkoRWZmZWN0LnN5bmMoZ2V0U25hcHNob3RPckZ1c2UpKVxuXG4gICAgLy8gVDAxNjogYXRvbWljIGluaXQgc2VtYW50aWNzIChubyBtaXNzZWQgdXBkYXRlcyBiZXR3ZWVuIGdldFNuYXBzaG90KCkgYW5kIHN1YnNjcmliZSgpKS5cbiAgICBjb25zdCBiZWZvcmUgPSB5aWVsZCogcmVhZFNuYXBzaG90T3JGdXNlXG4gICAgaWYgKGZ1c2VkKSB7XG4gICAgICB5aWVsZCogcmVjb3JkRnVzZURpYWdub3N0aWNcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gKHN0b3JlIGFzIGFueSkuc3Vic2NyaWJlKHNpZ25hbCkgYXMgKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG4gICAgeWllbGQqIEVmZmVjdC5hZGRGaW5hbGl6ZXIoKCkgPT5cbiAgICAgIEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB1bnN1YnNjcmliZT8uKClcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gYmVzdC1lZmZvcnRcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKVxuXG4gICAgY29uc3QgYWZ0ZXIgPSB5aWVsZCogcmVhZFNuYXBzaG90T3JGdXNlXG4gICAgaWYgKGZ1c2VkKSB7XG4gICAgICB5aWVsZCogcmVjb3JkRnVzZURpYWdub3N0aWNcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHdyaXRlVmFsdWUgPSAobmV4dFZhbHVlOiB1bmtub3duKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9PlxuICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBpblR4biA9IHlpZWxkKiBGaWJlclJlZi5nZXQoVGFza1J1bm5lci5pblN5bmNUcmFuc2FjdGlvbkZpYmVyKVxuXG4gICAgICAgIGNvbnN0IGJvZHkgPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgY29uc3QgcHJldlN0YXRlID0gKHlpZWxkKiBib3VuZC5zdGF0ZS5yZWFkKSBhcyBhbnlcbiAgICAgICAgICBjb25zdCBwcmV2VmFsdWUgPSBSb3dJZC5nZXRBdFBhdGgocHJldlN0YXRlIGFzIGFueSwgZmllbGRQYXRoKVxuXG4gICAgICAgICAgaWYgKGlzRXF1YWwocHJldlZhbHVlLCBuZXh0VmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBuZXh0RHJhZnQgPSBjcmVhdGUocHJldlN0YXRlLCAoZHJhZnQpID0+IHtcbiAgICAgICAgICAgIFJvd0lkLnNldEF0UGF0aE11dGF0aW5nKGRyYWZ0IGFzIGFueSwgZmllbGRQYXRoLCBuZXh0VmFsdWUpXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVGaWVsZFBhdGgoZmllbGRQYXRoKSA/PyBbXVxuICAgICAgICAgIGludGVybmFscy50eG4ucmVjb3JkU3RhdGVQYXRjaChub3JtYWxpemVkLCAndHJhaXQtZXh0ZXJuYWwtc3RvcmUnLCBwcmV2VmFsdWUsIG5leHRWYWx1ZSwgc3RlcC5pZClcbiAgICAgICAgICBpbnRlcm5hbHMudHhuLnVwZGF0ZURyYWZ0KG5leHREcmFmdClcbiAgICAgICAgfSlcblxuICAgICAgICAgIGlmIChpblR4bikge1xuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiBib2R5XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc3RhdGVDb21taXRQcmlvcml0eSA9IHRyYWl0TGFuZSA9PT0gJ25vblVyZ2VudCcgPyAnbG93JyA6ICdub3JtYWwnXG4gICAgICAgICAgcmV0dXJuIHlpZWxkKiBpbnRlcm5hbHMudHhuLnJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBraW5kOiAndHJhaXQtZXh0ZXJuYWwtc3RvcmUnLFxuICAgICAgICAgICAgICBuYW1lOiBmaWVsZFBhdGgsXG4gICAgICAgICAgICAgIGRldGFpbHM6IHtcbiAgICAgICAgICAgICAgICBzdGF0ZUNvbW1pdDoge1xuICAgICAgICAgICAgICAgICAgcHJpb3JpdHk6IHN0YXRlQ29tbWl0UHJpb3JpdHksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiBib2R5LnBpcGUoRWZmZWN0LmFzVm9pZCksXG4gICAgICAgICAgKVxuICAgICAgICB9KVxuXG4gICAgLy8gVXNlIHRoZSBwb3N0LXN1YnNjcmliZSBzbmFwc2hvdCBhcyB0aGUgaW5pdGlhbCBjb21taXR0ZWQgdmFsdWUgdG8gYXZvaWQgbWlzc2luZyBhbiB1cGRhdGUgYmV0d2VlbiBnZXRTbmFwc2hvdCBhbmQgc3Vic2NyaWJlLlxuICAgIHlpZWxkKiB3cml0ZVZhbHVlKGNvbXB1dGVWYWx1ZShhZnRlcikpXG5cbiAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLCBhZnRlcikpIHtcbiAgICAgIHNpZ25hbCgpXG4gICAgfVxuXG4gICAgLy8gTG9uZy1saXZlZCBzeW5jIGxvb3A6IGNvYWxlc2NlIGNoYW5nZXMsIHB1bGwgbGF0ZXN0IHNuYXBzaG90LCBhbmQgd3JpdGUgYmFjayBpbiBhIHR4bi5cbiAgICB5aWVsZCogRWZmZWN0LmZvcmtTY29wZWQoXG4gICAgICBFZmZlY3QubG9jYWxseShUYXNrUnVubmVyLmluU3luY1RyYW5zYWN0aW9uRmliZXIsIGZhbHNlKShcbiAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICB5aWVsZCogYXdhaXRTaWduYWwoKVxuICAgICAgICAgICAgaWYgKGZ1c2VkKSByZXR1cm5cbiAgICAgICAgICAgIHlpZWxkKiBtaWNyb3Rhc2tcbiAgICAgICAgICAgIGlmIChmdXNlZCkgcmV0dXJuXG5cbiAgICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0geWllbGQqIHJlYWRTbmFwc2hvdE9yRnVzZVxuICAgICAgICAgICAgaWYgKGZ1c2VkKSB7XG4gICAgICAgICAgICAgIHlpZWxkKiByZWNvcmRGdXNlRGlhZ25vc3RpY1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgeWllbGQqIHdyaXRlVmFsdWUoY29tcHV0ZVZhbHVlKHNuYXBzaG90KSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApXG4gIH0pXG4iLCAiaW1wb3J0IHsgRWZmZWN0LCBGaWJlclJlZiB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCAqIGFzIERlYnVnIGZyb20gJy4uL3J1bnRpbWUvY29yZS9EZWJ1Z1NpbmsuanMnXG5pbXBvcnQgeyBpc0RldkVudiB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9lbnYuanMnXG5pbXBvcnQgeyBvbmNlSW5SdW5TZXNzaW9uIH0gZnJvbSAnLi9jb252ZXJnZS1kaWFnbm9zdGljcy5qcydcbmltcG9ydCB0eXBlIHsgU3RhdGVUcmFpdFByb2dyYW0gfSBmcm9tICcuL21vZGVsLmpzJ1xuaW1wb3J0ICogYXMgTWV0YSBmcm9tICcuL21ldGEuanMnXG5cbnR5cGUgTWV0YUlzc3VlID0gUmVhZG9ubHk8e1xuICByZWFkb25seSBvcmlnaW46IHN0cmluZ1xuICByZWFkb25seSByZXBvcnQ6IE1ldGEuVHJhaXRNZXRhU2FuaXRpemVSZXBvcnRcbn0+XG5cbmNvbnN0IGZvcm1hdExpc3QgPSAoaXRlbXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCwgbGltaXQgPSA2KTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpdGVtcyB8fCBpdGVtcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcbiAgaWYgKGl0ZW1zLmxlbmd0aCA8PSBsaW1pdCkgcmV0dXJuIGl0ZW1zLmpvaW4oJywgJylcbiAgcmV0dXJuIGAke2l0ZW1zLnNsaWNlKDAsIGxpbWl0KS5qb2luKCcsICcpfSwgXHUyMDI2KCske2l0ZW1zLmxlbmd0aCAtIGxpbWl0fSlgXG59XG5cbmNvbnN0IGZvcm1hdFBhcnQgPSAobGFiZWw6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiBgJHtsYWJlbH09JHt2YWx1ZX1gXG59XG5cbmNvbnN0IGZvcm1hdElzc3VlID0gKGlzc3VlOiBNZXRhSXNzdWUpOiBzdHJpbmcgPT4ge1xuICBjb25zdCByID0gaXNzdWUucmVwb3J0XG5cbiAgY29uc3QgcGFydHM6IEFycmF5PHN0cmluZz4gPSBbXVxuXG4gIGlmIChyLmludmFsaWRJbnB1dCkgcGFydHMucHVzaCgnaW52YWxpZElucHV0PXRydWUnKVxuXG4gIGNvbnN0IHVua25vd25LZXlzID0gZm9ybWF0TGlzdChyLnVua25vd25LZXlzLCA2KVxuICBpZiAodW5rbm93bktleXMpIHtcbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgYHVua25vd25LZXlzPVske3Vua25vd25LZXlzfV0ke3R5cGVvZiByLnVua25vd25LZXlDb3VudCA9PT0gJ251bWJlcicgJiYgci51bmtub3duS2V5Q291bnQgPiByLnVua25vd25LZXlzIS5sZW5ndGggPyBgIHRvdGFsPSR7ci51bmtub3duS2V5Q291bnR9YCA6ICcnfWAsXG4gICAgKVxuICB9XG5cbiAgY29uc3QgZHJvcHBlZEtleXMgPSBmb3JtYXRMaXN0KHIuZHJvcHBlZEtleXMsIDYpXG4gIGlmIChkcm9wcGVkS2V5cykgcGFydHMucHVzaChgZHJvcHBlZEtleXM9WyR7ZHJvcHBlZEtleXN9XWApXG5cbiAgaWYgKHR5cGVvZiByLmRyb3BwZWRUYWdJdGVtcyA9PT0gJ251bWJlcicgJiYgci5kcm9wcGVkVGFnSXRlbXMgPiAwKSB7XG4gICAgcGFydHMucHVzaChgZHJvcHBlZFRhZ0l0ZW1zPSR7ci5kcm9wcGVkVGFnSXRlbXN9YClcbiAgfVxuXG4gIGNvbnN0IGlnbm9yZWRBbm5vdGF0aW9uS2V5cyA9IGZvcm1hdExpc3Qoci5pZ25vcmVkQW5ub3RhdGlvbktleXMsIDYpXG4gIGlmIChpZ25vcmVkQW5ub3RhdGlvbktleXMpIHtcbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgYGlnbm9yZWRBbm5vdGF0aW9uS2V5cz1bJHtpZ25vcmVkQW5ub3RhdGlvbktleXN9XSR7XG4gICAgICAgIHR5cGVvZiByLmlnbm9yZWRBbm5vdGF0aW9uS2V5Q291bnQgPT09ICdudW1iZXInICYmIHIuaWdub3JlZEFubm90YXRpb25LZXlDb3VudCA+IHIuaWdub3JlZEFubm90YXRpb25LZXlzIS5sZW5ndGhcbiAgICAgICAgICA/IGAgdG90YWw9JHtyLmlnbm9yZWRBbm5vdGF0aW9uS2V5Q291bnR9YFxuICAgICAgICAgIDogJydcbiAgICAgIH1gLFxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGRyb3BwZWRBbm5vdGF0aW9uS2V5cyA9IGZvcm1hdExpc3Qoci5kcm9wcGVkQW5ub3RhdGlvbktleXMsIDYpXG4gIGlmIChkcm9wcGVkQW5ub3RhdGlvbktleXMpIHtcbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgYGRyb3BwZWRBbm5vdGF0aW9uS2V5cz1bJHtkcm9wcGVkQW5ub3RhdGlvbktleXN9XSR7XG4gICAgICAgIHR5cGVvZiByLmRyb3BwZWRBbm5vdGF0aW9uS2V5Q291bnQgPT09ICdudW1iZXInICYmIHIuZHJvcHBlZEFubm90YXRpb25LZXlDb3VudCA+IHIuZHJvcHBlZEFubm90YXRpb25LZXlzIS5sZW5ndGhcbiAgICAgICAgICA/IGAgdG90YWw9JHtyLmRyb3BwZWRBbm5vdGF0aW9uS2V5Q291bnR9YFxuICAgICAgICAgIDogJydcbiAgICAgIH1gLFxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGRyb3BwZWRWYWx1ZXMgPSBmb3JtYXRQYXJ0KCdkcm9wcGVkQW5ub3RhdGlvblZhbHVlcycsIHIuZHJvcHBlZEFubm90YXRpb25WYWx1ZXMpXG4gIGlmIChkcm9wcGVkVmFsdWVzKSBwYXJ0cy5wdXNoKGRyb3BwZWRWYWx1ZXMpXG5cbiAgY29uc3Qgbm9uU2VyaWFsaXphYmxlID0gZm9ybWF0UGFydCgnbm9uU2VyaWFsaXphYmxlJywgci5kcm9wcGVkQW5ub3RhdGlvbk5vblNlcmlhbGl6YWJsZSlcbiAgY29uc3QgZGVwdGhFeGNlZWRlZCA9IGZvcm1hdFBhcnQoJ2RlcHRoRXhjZWVkZWQnLCByLmRyb3BwZWRBbm5vdGF0aW9uRGVwdGhFeGNlZWRlZClcbiAgY29uc3Qgbm9uRmluaXRlTnVtYmVyID0gZm9ybWF0UGFydCgnbm9uRmluaXRlTnVtYmVyJywgci5kcm9wcGVkQW5ub3RhdGlvbk5vbkZpbml0ZU51bWJlcilcbiAgY29uc3QgcmVhc29ucyA9IFtub25TZXJpYWxpemFibGUsIGRlcHRoRXhjZWVkZWQsIG5vbkZpbml0ZU51bWJlcl0uZmlsdGVyKCh4KTogeCBpcyBzdHJpbmcgPT4geCAhPT0gdW5kZWZpbmVkKVxuICBpZiAocmVhc29ucy5sZW5ndGggPiAwKSBwYXJ0cy5wdXNoKGByZWFzb25zPXske3JlYXNvbnMuam9pbignLCAnKX19YClcblxuICByZXR1cm4gYFske2lzc3VlLm9yaWdpbn1dICR7cGFydHMuam9pbignICcpfWBcbn1cblxuY29uc3QgY29sbGVjdE5vZGVNZXRhSXNzdWVzID0gKHByb2dyYW06IFN0YXRlVHJhaXRQcm9ncmFtPGFueT4pOiBBcnJheTxNZXRhSXNzdWU+ID0+IHtcbiAgY29uc3Qgc3BlYzogYW55ID0gcHJvZ3JhbS5zcGVjIGFzIGFueVxuICBpZiAoIXNwZWMgfHwgdHlwZW9mIHNwZWMgIT09ICdvYmplY3QnKSByZXR1cm4gW11cblxuICBjb25zdCBpc05vZGUgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyB7IHJlYWRvbmx5IF90YWc6ICdTdGF0ZVRyYWl0Tm9kZSc7IHJlYWRvbmx5IG1ldGE/OiB1bmtub3duIH0gPT5cbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICh2YWx1ZSBhcyBhbnkpLl90YWcgPT09ICdTdGF0ZVRyYWl0Tm9kZSdcblxuICBjb25zdCBpc0xpc3QgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyB7IHJlYWRvbmx5IF90YWc6ICdTdGF0ZVRyYWl0TGlzdCc7IHJlYWRvbmx5IGl0ZW0/OiB1bmtub3duOyByZWFkb25seSBsaXN0PzogdW5rbm93biB9ID0+XG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAodmFsdWUgYXMgYW55KS5fdGFnID09PSAnU3RhdGVUcmFpdExpc3QnXG5cbiAgY29uc3QgaXNzdWVzOiBBcnJheTxNZXRhSXNzdWU+ID0gW11cblxuICBjb25zdCBhZGQgPSAob3JpZ2luOiBzdHJpbmcsIG1ldGE6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICBjb25zdCB7IHJlcG9ydCB9ID0gTWV0YS5zYW5pdGl6ZVdpdGhSZXBvcnQobWV0YSlcbiAgICBpZiAocmVwb3J0KSBpc3N1ZXMucHVzaCh7IG9yaWdpbiwgcmVwb3J0IH0pXG4gIH1cblxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzcGVjKSkge1xuICAgIGNvbnN0IHJhdyA9IHNwZWNba2V5XVxuICAgIGlmICghcmF3KSBjb250aW51ZVxuXG4gICAgaWYgKGlzTGlzdChyYXcpKSB7XG4gICAgICBpZiAocmF3Lml0ZW0gJiYgaXNOb2RlKHJhdy5pdGVtKSAmJiAocmF3Lml0ZW0gYXMgYW55KS5tZXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWRkKGBub2RlOiR7a2V5fVtdYCwgKHJhdy5pdGVtIGFzIGFueSkubWV0YSlcbiAgICAgIH1cbiAgICAgIGlmIChyYXcubGlzdCAmJiBpc05vZGUocmF3Lmxpc3QpICYmIChyYXcubGlzdCBhcyBhbnkpLm1ldGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhZGQoYG5vZGU6JHtrZXl9YCwgKHJhdy5saXN0IGFzIGFueSkubWV0YSlcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKGlzTm9kZShyYXcpKSB7XG4gICAgICBpZiAoKHJhdyBhcyBhbnkpLm1ldGEgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgIGFkZChgbm9kZToke2tleSA9PT0gJyRyb290JyA/ICckcm9vdCcgOiBrZXl9YCwgKHJhdyBhcyBhbnkpLm1ldGEpXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc3N1ZXNcbn1cblxuY29uc3QgY29sbGVjdEVudHJ5TWV0YUlzc3VlcyA9IChwcm9ncmFtOiBTdGF0ZVRyYWl0UHJvZ3JhbTxhbnk+KTogQXJyYXk8TWV0YUlzc3VlPiA9PiB7XG4gIGNvbnN0IGlzc3VlczogQXJyYXk8TWV0YUlzc3VlPiA9IFtdXG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBwcm9ncmFtLmVudHJpZXMpIHtcbiAgICBpZiAoZW50cnkua2luZCAhPT0gJ3NvdXJjZScgJiYgZW50cnkua2luZCAhPT0gJ2V4dGVybmFsU3RvcmUnKSBjb250aW51ZVxuICAgIGNvbnN0IHJhd01ldGEgPSAoZW50cnkubWV0YSBhcyBhbnkpPy5tZXRhXG4gICAgaWYgKHJhd01ldGEgPT09IHVuZGVmaW5lZCkgY29udGludWVcblxuICAgIGNvbnN0IG9yaWdpbiA9IGVudHJ5LmtpbmQgPT09ICdzb3VyY2UnID8gYHNvdXJjZToke2VudHJ5LmZpZWxkUGF0aH1gIDogYGV4dGVybmFsU3RvcmU6JHtlbnRyeS5maWVsZFBhdGh9YFxuICAgIGNvbnN0IHsgcmVwb3J0IH0gPSBNZXRhLnNhbml0aXplV2l0aFJlcG9ydChyYXdNZXRhKVxuICAgIGlmIChyZXBvcnQpIGlzc3Vlcy5wdXNoKHsgb3JpZ2luLCByZXBvcnQgfSlcbiAgfVxuXG4gIHJldHVybiBpc3N1ZXNcbn1cblxuZXhwb3J0IGNvbnN0IGVtaXRNZXRhU2FuaXRpemVEaWFnbm9zdGljcyA9IChcbiAgcHJvZ3JhbTogU3RhdGVUcmFpdFByb2dyYW08YW55PixcbiAgY3R4OiBSZWFkb25seTx7IHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nOyByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nIH0+LFxuKTogRWZmZWN0LkVmZmVjdDx2b2lkPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgaWYgKCFpc0RldkVudigpKSByZXR1cm5cblxuICAgIGNvbnN0IGxldmVsID0geWllbGQqIEZpYmVyUmVmLmdldChEZWJ1Zy5jdXJyZW50RGlhZ25vc3RpY3NMZXZlbClcbiAgICBpZiAobGV2ZWwgPT09ICdvZmYnKSByZXR1cm5cblxuICAgIGNvbnN0IG1vZHVsZUlkID0gY3R4Lm1vZHVsZUlkID8/ICd1bmtub3duJ1xuICAgIGNvbnN0IHNob3VsZEVtaXQgPSB5aWVsZCogb25jZUluUnVuU2Vzc2lvbihgbWV0YV9zYW5pdGl6ZToke21vZHVsZUlkfWApXG4gICAgaWYgKCFzaG91bGRFbWl0KSByZXR1cm5cblxuICAgIGNvbnN0IGlzc3VlcyA9IFsuLi5jb2xsZWN0Tm9kZU1ldGFJc3N1ZXMocHJvZ3JhbSksIC4uLmNvbGxlY3RFbnRyeU1ldGFJc3N1ZXMocHJvZ3JhbSldXG4gICAgaWYgKGlzc3Vlcy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgY29uc3QgbGltaXQgPSBsZXZlbCA9PT0gJ2xpZ2h0JyB8fCBsZXZlbCA9PT0gJ3NhbXBsZWQnID8gOCA6IDI0XG4gICAgY29uc3QgbGluZXMgPSBpc3N1ZXMuc2xpY2UoMCwgbGltaXQpLm1hcChmb3JtYXRJc3N1ZSlcbiAgICBpZiAoaXNzdWVzLmxlbmd0aCA+IGxpbWl0KSB7XG4gICAgICBsaW5lcy5wdXNoKGBcdTIwMjYoKyR7aXNzdWVzLmxlbmd0aCAtIGxpbWl0fSlgKVxuICAgIH1cblxuICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgdHlwZTogJ2RpYWdub3N0aWMnLFxuICAgICAgbW9kdWxlSWQ6IGN0eC5tb2R1bGVJZCxcbiAgICAgIGluc3RhbmNlSWQ6IGN0eC5pbnN0YW5jZUlkLFxuICAgICAgY29kZTogJ3N0YXRlX3RyYWl0OjptZXRhX3Nhbml0aXplZCcsXG4gICAgICBzZXZlcml0eTogJ3dhcm5pbmcnLFxuICAgICAgbWVzc2FnZTogYFttZXRhXSBUcmFpdE1ldGEgY29udGFpbnMgbm9uLWV4cG9ydGFibGUgZmllbGRzL3ZhbHVlcyBhbmQgd2lsbCBiZSBzYW5pdGl6ZWQgKHRvdGFsICR7aXNzdWVzLmxlbmd0aH0pOlxcbiR7bGluZXMuam9pbignXFxuJyl9YCxcbiAgICAgIGhpbnQ6XG4gICAgICAgICdUcmFpdE1ldGEgaXMgZXhwb3J0LW9ubHkgKERldnRvb2xzL1N0YXRpYyBJUikgYW5kIE1VU1QgYmUgSnNvblZhbHVlLiAnICtcbiAgICAgICAgJ1VzZSBgYW5ub3RhdGlvbnNgIHdpdGggYHgtKmAga2V5cyBmb3IgZXh0ZW5zaW9uIGhpbnRzOyBhdm9pZCBjbG9zdXJlcy9mdW5jdGlvbnMvRWZmZWN0L0ZpYmVyL1RhZy9ET00vQmlnSW50L2NpcmN1bGFyIHJlZnMuICcgK1xuICAgICAgICAnU2VlIHNwZWNzLzAxNiBhbmQgZG9jcy9zc290L3BsYXRmb3JtL2NvbnRyYWN0cy8wMy1jb250cm9sLXN1cmZhY2UtbWFuaWZlc3QubWQuJyxcbiAgICAgIGtpbmQ6ICdtZXRhX3Nhbml0aXplZCcsXG4gICAgfSlcbiAgfSlcblxuIiwgIi8vIFN0YXRlVHJhaXQgbmFtZXNwYWNlIG1vZHVsZSAoQGxvZ2l4anMvY29yZS9TdGF0ZVRyYWl0KTpcbi8vIC0gUHJvdmlkZXMgYSBEU0wgZm9yIHRyYWl0IHNwZWNzIChmcm9tL25vZGUvbGlzdC9jb21wdXRlZC9zb3VyY2UvbGluaykuXG4vLyAtIGJ1aWxkOiBub3JtYWxpemVzIHRoZSBzcGVjIGFuZCBwcm9kdWNlcyBQcm9ncmFtL0dyYXBoL1BsYW4uXG4vLyAtIGluc3RhbGw6IGluc3RhbGxzIGEgUHJvZ3JhbSBpbnRvIHRoZSBydW50aW1lIChyZWdpc3RlcnMgc291cmNlLnJlZnJlc2gsIHJ1bnMgY29udmVyZ2UvdmFsaWRhdGUgaW4gdHhuIHdpbmRvd3MpLlxuXG5pbXBvcnQgdHlwZSB7IFNjaGVtYSB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB7IEVmZmVjdCB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB0eXBlIHsgQm91bmRBcGkgfSBmcm9tICcuL0JvdW5kLmpzJ1xuaW1wb3J0IHR5cGUgeyBFeHRlcm5hbFN0b3JlIGFzIEV4dGVybmFsU3RvcmVUeXBlIH0gZnJvbSAnLi9FeHRlcm5hbFN0b3JlLmpzJ1xuaW1wb3J0ICogYXMgTW9kZWwgZnJvbSAnLi9pbnRlcm5hbC9zdGF0ZS10cmFpdC9tb2RlbC5qcydcbmltcG9ydCB0eXBlIHsgVHJhaXRNZXRhIGFzIFRyYWl0TWV0YUludGVybmFsIH0gZnJvbSAnLi9pbnRlcm5hbC9zdGF0ZS10cmFpdC9tZXRhLmpzJ1xuaW1wb3J0ICogYXMgRmllbGRQYXRoIGZyb20gJy4vaW50ZXJuYWwvc3RhdGUtdHJhaXQvZmllbGQtcGF0aC5qcydcbmltcG9ydCAqIGFzIFJvd0lkIGZyb20gJy4vaW50ZXJuYWwvc3RhdGUtdHJhaXQvcm93aWQuanMnXG5pbXBvcnQgKiBhcyBJbnRlcm5hbEJ1aWxkIGZyb20gJy4vaW50ZXJuYWwvc3RhdGUtdHJhaXQvYnVpbGQuanMnXG5pbXBvcnQgKiBhcyBJbnRlcm5hbEluc3RhbGwgZnJvbSAnLi9pbnRlcm5hbC9zdGF0ZS10cmFpdC9pbnN0YWxsLmpzJ1xuaW1wb3J0ICogYXMgSW50ZXJuYWxJciBmcm9tICcuL2ludGVybmFsL3N0YXRlLXRyYWl0L2lyLmpzJ1xuXG4vLyBQdWJsaWMgdHlwZSBhbGlhc2VzLlxuZXhwb3J0IHR5cGUgU3RhdGVUcmFpdFNwZWM8Uz4gPSBNb2RlbC5TdGF0ZVRyYWl0U3BlYzxTPlxuZXhwb3J0IHR5cGUgU3RhdGVUcmFpdEVudHJ5PFMgPSB1bmtub3duLCBQIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9IE1vZGVsLlN0YXRlVHJhaXRFbnRyeTxTLCBQPlxuZXhwb3J0IHR5cGUgU3RhdGVUcmFpdFByb2dyYW08Uz4gPSBNb2RlbC5TdGF0ZVRyYWl0UHJvZ3JhbTxTPlxuZXhwb3J0IHR5cGUgU3RhdGVUcmFpdEdyYXBoID0gTW9kZWwuU3RhdGVUcmFpdEdyYXBoXG5leHBvcnQgdHlwZSBTdGF0ZVRyYWl0UGxhbiA9IE1vZGVsLlN0YXRlVHJhaXRQbGFuXG5leHBvcnQgdHlwZSBTdGF0ZVRyYWl0Tm9kZTxJbnB1dCA9IHVua25vd24sIEN0eCA9IHVua25vd24+ID0gTW9kZWwuU3RhdGVUcmFpdE5vZGU8SW5wdXQsIEN0eD5cbmV4cG9ydCB0eXBlIFN0YXRlVHJhaXRMaXN0PEl0ZW0gPSB1bmtub3duPiA9IE1vZGVsLlN0YXRlVHJhaXRMaXN0PEl0ZW0+XG5leHBvcnQgdHlwZSBDaGVja1J1bGU8SW5wdXQgPSB1bmtub3duLCBDdHggPSB1bmtub3duPiA9IE1vZGVsLkNoZWNrUnVsZTxJbnB1dCwgQ3R4PlxuZXhwb3J0IHR5cGUgVHJhaXRNZXRhID0gVHJhaXRNZXRhSW50ZXJuYWxcblxuZXhwb3J0IHR5cGUgU3RhdGVGaWVsZFBhdGg8Uz4gPSBGaWVsZFBhdGguU3RhdGVGaWVsZFBhdGg8Uz5cbmV4cG9ydCB0eXBlIFN0YXRlQXRQYXRoPFMsIFA+ID0gRmllbGRQYXRoLlN0YXRlQXRQYXRoPFMsIFA+XG5cbmV4cG9ydCBjb25zdCAkcm9vdCA9ICckcm9vdCcgYXMgY29uc3RcblxudHlwZSBEZXBzQXJnczxTIGV4dGVuZHMgb2JqZWN0LCBEZXBzIGV4dGVuZHMgUmVhZG9ubHlBcnJheTxTdGF0ZUZpZWxkUGF0aDxTPj4+ID0ge1xuICByZWFkb25seSBbSyBpbiBrZXlvZiBEZXBzXTogU3RhdGVBdFBhdGg8UywgRGVwc1tLXT5cbn1cblxuLyoqXG4gKiBTdGF0ZVRyYWl0LmZyb206XG4gKiAtIE5hcnJvd3MgYXZhaWxhYmxlIGZpZWxkIHBhdGhzIGJhc2VkIG9uIHRoZSBzdGF0ZSBTY2hlbWEsIGFkZGluZyB0eXBlIGNvbnN0cmFpbnRzIHRvIHRyYWl0IHNwZWNzLlxuICogLSBBdCBydW50aW1lIHRoaXMgcmV0dXJucyB0aGUgcmF3IHNwZWMgb2JqZWN0OyBub3JtYWxpemF0aW9uIGlzIGhhbmRsZWQgYnkgaW50ZXJuYWwgbGF5ZXJzLlxuICovXG5leHBvcnQgY29uc3QgZnJvbSA9XG4gIDxTIGV4dGVuZHMgb2JqZWN0LCBJPihfc2NoZW1hOiBTY2hlbWEuU2NoZW1hPFMsIEk+KSA9PlxuICAoc3BlYzogU3RhdGVUcmFpdFNwZWM8Uz4pOiBTdGF0ZVRyYWl0U3BlYzxTPiA9PlxuICAgIHNwZWNcblxuZXhwb3J0IGNvbnN0IG5vZGUgPSA8SW5wdXQgPSB1bmtub3duLCBDdHggPSB1bmtub3duPihcbiAgc3BlYzogT21pdDxNb2RlbC5TdGF0ZVRyYWl0Tm9kZTxJbnB1dCwgQ3R4PiwgJ190YWcnPixcbik6IE1vZGVsLlN0YXRlVHJhaXROb2RlPElucHV0LCBDdHg+ID0+ICh7XG4gIF90YWc6ICdTdGF0ZVRyYWl0Tm9kZScsXG4gIC4uLnNwZWMsXG59KVxuXG5leHBvcnQgY29uc3QgbGlzdCA9IDxJdGVtID0gdW5rbm93bj4oc3BlYzogT21pdDxNb2RlbC5TdGF0ZVRyYWl0TGlzdDxJdGVtPiwgJ190YWcnPik6IE1vZGVsLlN0YXRlVHJhaXRMaXN0PEl0ZW0+ID0+ICh7XG4gIF90YWc6ICdTdGF0ZVRyYWl0TGlzdCcsXG4gIC4uLnNwZWMsXG59KVxuXG4vKipcbiAqIFN0YXRlVHJhaXQuY29tcHV0ZWQ6XG4gKiAtIERlY2xhcmVzIGNvbXB1dGVkIHNlbWFudGljcyBmb3IgYSBmaWVsZC5cbiAqIC0gVXNlcyBleHBsaWNpdCBkZXBzIGFzIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBkZXBlbmRlbmNpZXMgKGRpYWdub3N0aWNzIC8gcmV2ZXJzZS1jbG9zdXJlIC8gaW5jcmVtZW50YWwgc2NoZWQpLlxuICovXG5leHBvcnQgY29uc3QgY29tcHV0ZWQgPSA8XG4gIFMgZXh0ZW5kcyBvYmplY3QsXG4gIFAgZXh0ZW5kcyBTdGF0ZUZpZWxkUGF0aDxTPixcbiAgY29uc3QgRGVwcyBleHRlbmRzIFJlYWRvbmx5QXJyYXk8U3RhdGVGaWVsZFBhdGg8Uz4+LFxuPihpbnB1dDoge1xuICByZWFkb25seSBkZXBzOiBEZXBzXG4gIHJlYWRvbmx5IGdldDogKC4uLmRlcHNWYWx1ZXM6IERlcHNBcmdzPFMsIERlcHM+KSA9PiBTdGF0ZUF0UGF0aDxTLCBQPlxuICByZWFkb25seSBlcXVhbHM/OiAocHJldjogU3RhdGVBdFBhdGg8UywgUD4sIG5leHQ6IFN0YXRlQXRQYXRoPFMsIFA+KSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiAwNDM6IGV4cGxpY2l0IGNvbnZlcmdlIHRpbWUtc2xpY2luZyBzY2hlZHVsaW5nLlxuICAgKiAtIHVuc2V0OiBpbW1lZGlhdGUgKGRlZmF1bHQgYmVoYXZpb3IgdW5jaGFuZ2VkKVxuICAgKiAtIGRlZmVycmVkOiBjYW4gYmUgcG9zdHBvbmVkIGFuZCBtZXJnZWQgaW50byBsYXRlciB3aW5kb3dzIChyZXF1aXJlcyBydW50aW1lIHRpbWUtc2xpY2luZyBlbmFibGVkKVxuICAgKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGluZz86IE1vZGVsLlRyYWl0Q29udmVyZ2VTY2hlZHVsaW5nXG59KTogU3RhdGVUcmFpdEVudHJ5PFMsIFA+ID0+IHtcbiAgY29uc3QgZGVyaXZlID0gKHN0YXRlOiBSZWFkb25seTxTPik6IFN0YXRlQXRQYXRoPFMsIFA+ID0+IHtcbiAgICBjb25zdCBhcmdzID0gKGlucHV0LmRlcHMgYXMgUmVhZG9ubHlBcnJheTxzdHJpbmc+KS5tYXAoKGRlcCkgPT4gUm93SWQuZ2V0QXRQYXRoKHN0YXRlIGFzIGFueSwgZGVwKSlcbiAgICByZXR1cm4gKGlucHV0LmdldCBhcyBhbnkpKC4uLmFyZ3MpXG4gIH1cbiAgcmV0dXJuIHtcbiAgICBmaWVsZFBhdGg6IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIFAsXG4gICAga2luZDogJ2NvbXB1dGVkJyxcbiAgICBtZXRhOiB7XG4gICAgICBkZXBzOiBpbnB1dC5kZXBzLFxuICAgICAgZGVyaXZlLFxuICAgICAgZXF1YWxzOiBpbnB1dC5lcXVhbHMsXG4gICAgICAuLi4oaW5wdXQuc2NoZWR1bGluZyA/IHsgc2NoZWR1bGluZzogaW5wdXQuc2NoZWR1bGluZyB9IDoge30pLFxuICAgIH0sXG4gIH0gYXMgU3RhdGVUcmFpdEVudHJ5PFMsIFA+XG59XG5cbi8qKlxuICogU3RhdGVUcmFpdC5zb3VyY2U6XG4gKiAtIERlY2xhcmVzIGFuIGV4dGVybmFsIHJlc291cmNlIHNvdXJjZSBmb3IgYSBmaWVsZCAoUmVzb3VyY2UgLyBRdWVyeSBpbnRlZ3JhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiBsYXRlciBwaGFzZXMpLlxuICogLSBUaGUga2VybmVsIG93bnMga2V5SGFzaCBnYXRpbmcgLyBjb25jdXJyZW5jeSAvIFJlcGxheU1vZGUgYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBjb25zdCBzb3VyY2UgPSA8XG4gIFMgZXh0ZW5kcyBvYmplY3QsXG4gIFAgZXh0ZW5kcyBTdGF0ZUZpZWxkUGF0aDxTPixcbiAgY29uc3QgRGVwcyBleHRlbmRzIFJlYWRvbmx5QXJyYXk8U3RhdGVGaWVsZFBhdGg8Uz4+LFxuPihpbnB1dDoge1xuICByZWFkb25seSByZXNvdXJjZTogc3RyaW5nXG4gIHJlYWRvbmx5IGRlcHM6IERlcHNcbiAgcmVhZG9ubHkga2V5OiAoLi4uZGVwc1ZhbHVlczogRGVwc0FyZ3M8UywgRGVwcz4pID0+IHVua25vd25cbiAgcmVhZG9ubHkgdHJpZ2dlcnM/OiBSZWFkb25seUFycmF5PCdvbk1vdW50JyB8ICdvbktleUNoYW5nZScgfCAnbWFudWFsJz5cbiAgcmVhZG9ubHkgZGVib3VuY2VNcz86IG51bWJlclxuICByZWFkb25seSBjb25jdXJyZW5jeT86ICdzd2l0Y2gnIHwgJ2V4aGF1c3QtdHJhaWxpbmcnXG4gIC8qKlxuICAgKiBTZXJpYWxpemFibGUgbWV0YWRhdGEgZm9yIERldnRvb2xzL2RvY3MgKHdoaXRlbGlzdGVkIGZpZWxkcyBhcmUgZXh0cmFjdGVkIGR1cmluZyBidWlsZCkuXG4gICAqL1xuICByZWFkb25seSBtZXRhPzogVHJhaXRNZXRhXG59KTogU3RhdGVUcmFpdEVudHJ5PFMsIFA+ID0+IHtcbiAgY29uc3Qga2V5ID0gKHN0YXRlOiBSZWFkb25seTxTPik6IHVua25vd24gPT4ge1xuICAgIGNvbnN0IGFyZ3MgPSAoaW5wdXQuZGVwcyBhcyBSZWFkb25seUFycmF5PHN0cmluZz4pLm1hcCgoZGVwKSA9PiBSb3dJZC5nZXRBdFBhdGgoc3RhdGUgYXMgYW55LCBkZXApKVxuICAgIHJldHVybiAoaW5wdXQua2V5IGFzIGFueSkoLi4uYXJncylcbiAgfVxuICByZXR1cm4ge1xuICAgIGZpZWxkUGF0aDogdW5kZWZpbmVkIGFzIHVua25vd24gYXMgUCxcbiAgICBraW5kOiAnc291cmNlJyxcbiAgICBtZXRhOiB7IC4uLmlucHV0LCBrZXkgfSxcbiAgfSBhcyBTdGF0ZVRyYWl0RW50cnk8UywgUD5cbn1cblxuLyoqXG4gKiBTdGF0ZVRyYWl0LmV4dGVybmFsU3RvcmU6XG4gKiAtIERlY2xhcmVzIHRoYXQgYSBmaWVsZCBpcyB3cml0dGVuIGJhY2sgZnJvbSBhbiBFeHRlcm5hbFN0b3JlIChleHRlcm5hbCBpbnB1dCBvciBNb2R1bGUtYXMtU291cmNlKS5cbiAqIC0gVGhlIGZpZWxkIGlzIHRyZWF0ZWQgYXMgZXh0ZXJuYWwtb3duZWQ6IGRvIG5vdCB3cml0ZSB0byBpdCBmcm9tIHJlZHVjZXJzL2NvbXB1dGVkL2xpbmsvc291cmNlOyB1c2Ugc2VwYXJhdGUgZmllbGRzICsgZGVyaXZlZCB0cmFpdHMuXG4gKi9cbmV4cG9ydCBjb25zdCBleHRlcm5hbFN0b3JlID0gPFMgZXh0ZW5kcyBvYmplY3QsIFAgZXh0ZW5kcyBTdGF0ZUZpZWxkUGF0aDxTPiwgVCA9IFN0YXRlQXRQYXRoPFMsIFA+PihpbnB1dDoge1xuICByZWFkb25seSBzdG9yZTogRXh0ZXJuYWxTdG9yZVR5cGU8VD5cbiAgcmVhZG9ubHkgc2VsZWN0PzogKHNuYXBzaG90OiBUKSA9PiBTdGF0ZUF0UGF0aDxTLCBQPlxuICByZWFkb25seSBlcXVhbHM/OiAocHJldjogU3RhdGVBdFBhdGg8UywgUD4sIG5leHQ6IFN0YXRlQXRQYXRoPFMsIFA+KSA9PiBib29sZWFuXG4gIHJlYWRvbmx5IGNvYWxlc2NlV2luZG93TXM/OiBudW1iZXJcbiAgcmVhZG9ubHkgcHJpb3JpdHk/OiBNb2RlbC5UcmFpdExhbmVcbiAgcmVhZG9ubHkgbWV0YT86IFRyYWl0TWV0YVxufSk6IFN0YXRlVHJhaXRFbnRyeTxTLCBQPiA9PlxuICAoe1xuICAgIGZpZWxkUGF0aDogdW5kZWZpbmVkIGFzIHVua25vd24gYXMgUCxcbiAgICBraW5kOiAnZXh0ZXJuYWxTdG9yZScsXG4gICAgbWV0YTogaW5wdXQgYXMgYW55LFxuICB9KSBhcyBTdGF0ZVRyYWl0RW50cnk8UywgUD5cblxuLyoqXG4gKiBTdGF0ZVRyYWl0Lmxpbms6XG4gKiAtIERlY2xhcmVzIGEgbGlua2FnZSBmcm9tIGFub3RoZXIgZmllbGQgaW50byB0aGUgdGFyZ2V0IGZpZWxkLlxuICogLSBgbWV0YS5mcm9tYCBpcyBhbHNvIGNvbnN0cmFpbmVkIGJ5IGBTdGF0ZUZpZWxkUGF0aDxTPmAuXG4gKi9cbmV4cG9ydCBjb25zdCBsaW5rID0gPFMgZXh0ZW5kcyBvYmplY3QsIFAgZXh0ZW5kcyBTdGF0ZUZpZWxkUGF0aDxTPj4obWV0YToge1xuICBmcm9tOiBTdGF0ZUZpZWxkUGF0aDxTPlxuICAvKipcbiAgICogMDQzOiBleHBsaWNpdCBjb252ZXJnZSB0aW1lLXNsaWNpbmcgc2NoZWR1bGluZy5cbiAgICogLSB1bnNldDogaW1tZWRpYXRlIChkZWZhdWx0IGJlaGF2aW9yIHVuY2hhbmdlZClcbiAgICogLSBkZWZlcnJlZDogY2FuIGJlIHBvc3Rwb25lZCBhbmQgbWVyZ2VkIGludG8gbGF0ZXIgd2luZG93cyAocmVxdWlyZXMgcnVudGltZSB0aW1lLXNsaWNpbmcgZW5hYmxlZClcbiAgICovXG4gIHNjaGVkdWxpbmc/OiBNb2RlbC5UcmFpdENvbnZlcmdlU2NoZWR1bGluZ1xufSk6IFN0YXRlVHJhaXRFbnRyeTxTLCBQPiA9PlxuICAoe1xuICAgIGZpZWxkUGF0aDogdW5kZWZpbmVkIGFzIHVua25vd24gYXMgUCxcbiAgICBraW5kOiAnbGluaycsXG4gICAgbWV0YTogeyAuLi5tZXRhLCAuLi4obWV0YS5zY2hlZHVsaW5nID8geyBzY2hlZHVsaW5nOiBtZXRhLnNjaGVkdWxpbmcgfSA6IHt9KSB9LFxuICB9KSBhcyBTdGF0ZVRyYWl0RW50cnk8UywgUD5cblxuLyoqXG4gKiBTdGF0ZVRyYWl0LmJ1aWxkOlxuICogLSBOb3JtYWxpemVzIHRoZSBzcGVjIGludG8gYW4gZXhlY3V0YWJsZSBQcm9ncmFtIChpbmNsdWRpbmcgR3JhcGgvUGxhbikuXG4gKiAtIFdoZW4gRFNMIGFuZCBidWlsZCBjb25zdHJhaW50cyBkaWZmZXIsIGJ1aWxkIGlzIHRoZSBmaW5hbCBhdXRob3JpdHkgKGUuZy4gcmVxdWlyaW5nIGV4cGxpY2l0IGRlcHMpLlxuICovXG5leHBvcnQgY29uc3QgYnVpbGQgPSA8UyBleHRlbmRzIG9iamVjdD4oXG4gIHN0YXRlU2NoZW1hOiBTY2hlbWEuU2NoZW1hPFMsIGFueT4sXG4gIHNwZWM6IFN0YXRlVHJhaXRTcGVjPFM+LFxuKTogU3RhdGVUcmFpdFByb2dyYW08Uz4gPT4gSW50ZXJuYWxCdWlsZC5idWlsZChzdGF0ZVNjaGVtYSwgc3BlYylcblxuLyoqXG4gKiBTdGF0ZVRyYWl0Lmluc3RhbGw6XG4gKiAtIEluc3RhbGxzIFByb2dyYW0tZGVmaW5lZCBiZWhhdmlvciAoY29tcHV0ZWQvbGluay9zb3VyY2UvY2hlY2ssIGV0Yy4pIG9uIHRvcCBvZiBhIEJvdW5kIEFQSS5cbiAqIC0gRWFjaCBQbGFuU3RlcCBjb3JyZXNwb25kcyB0byBhIGxvbmctbGl2ZWQgRWZmZWN0IG1vdW50ZWQgaW50byB0aGUgcnVudGltZSBTY29wZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGluc3RhbGwgPSA8UyBleHRlbmRzIG9iamVjdD4oXG4gIGJvdW5kOiBCb3VuZEFwaTxhbnksIGFueT4sXG4gIHByb2dyYW06IFN0YXRlVHJhaXRQcm9ncmFtPFM+LFxuKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9PiBJbnRlcm5hbEluc3RhbGwuaW5zdGFsbChib3VuZCwgcHJvZ3JhbSlcblxuLyoqXG4gKiBTdGF0ZVRyYWl0LmV4cG9ydFN0YXRpY0lyOlxuICogLSBFeHBvcnRzIG1pbmltYWwgU3RhdGljIElSIChhbGlnbmVkIHdpdGggMDA5IGNhbm9uaWNhbCBGaWVsZFBhdGggY29uc3RyYWludHMpIGZvciBEZXZ0b29scyAvIEFsaWdubWVudCBMYWIuXG4gKiAtIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBKU09OLXN0cmluZ2lmaWFibGUgKGV2aWRlbmNlIHBhY2thZ2VzIC8gcmVwbGF5IHBpcGVsaW5lKS5cbiAqL1xuZXhwb3J0IHR5cGUgU3RhdGljSXIgPSBJbnRlcm5hbElyLlN0YXRpY0lyXG5cbmV4cG9ydCBjb25zdCBleHBvcnRTdGF0aWNJciA9IChcbiAgcHJvZ3JhbTogU3RhdGVUcmFpdFByb2dyYW08YW55PixcbiAgbW9kdWxlSWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IHtcbiAgICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nXG4gIH0sXG4pOiBTdGF0aWNJciA9PlxuICBJbnRlcm5hbElyLmV4cG9ydFN0YXRpY0lyKHtcbiAgICBwcm9ncmFtLFxuICAgIG1vZHVsZUlkLFxuICAgIHZlcnNpb246IG9wdGlvbnM/LnZlcnNpb24sXG4gIH0pXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLFNBQVMsVUFBQUEsZUFBYzs7O0FDQXZCLFNBQVMsU0FBUyxRQUFRLFVBQVUsY0FBYztBQWFsRCxJQUFNLE9BQU8sQ0FBQyxVQUFzRSxPQUFPLFVBQVU7QUFJckcsSUFBTSxlQUFlLENBQUMsVUFDcEIsT0FBTyxJQUFJLGFBQWE7QUFDdEIsUUFBTSxRQUFTLE1BQU0sTUFBYztBQUNuQyxRQUFNLGFBQWEsMkJBQTJCLEtBQUs7QUFFbkQsTUFBSSxZQUFZLFNBQVMsV0FBVztBQUNsQyxVQUFNLFVBQVUsT0FBTyxXQUFXO0FBQ2xDLFdBQU8sV0FBVyxJQUFJLE9BQU87QUFBQSxFQUMvQjtBQUVBLFNBQU87QUFDVCxDQUFDO0FBRUksSUFBTSwyQkFBMkIsQ0FDdEMsT0FDQSxNQUNBLFVBRUEsT0FBTyxJQUFJLGFBQWE7QUFDdEIsUUFBTSxZQUFZLEtBQUs7QUFDdkIsTUFBSSxDQUFDLFVBQVc7QUFFaEIsUUFBTSxNQUFNLE9BQU8sT0FBTyxRQUFhO0FBQ3ZDLFFBQU0sbUJBQW1CLE9BQU8sT0FBTyxjQUFjLGdCQUFnQjtBQUNyRSxRQUFNLGdCQUFnQixPQUFPLE9BQU8sZ0JBQWdCLElBQUksaUJBQWlCLFFBQVEsdUJBQXVCO0FBQ3hHLFFBQU0sWUFBWSxPQUFPLE1BQW1CLENBQUNDLFlBQVc7QUFDdEQsa0JBQWMsa0JBQWtCLE1BQU1BLFFBQU8sT0FBTyxJQUFJLENBQUM7QUFBQSxFQUMzRCxDQUFDO0FBRUQsTUFBSTtBQUNKLE1BQUk7QUFDRixnQkFBWSxrQkFBa0IsS0FBWTtBQUFBLEVBQzVDLFFBQVE7QUFDTjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFNBQVUsTUFBTSxNQUFjO0FBQ3BDLFFBQU0sU0FBVSxNQUFNLE1BQWM7QUFFcEMsUUFBTSxlQUFlLENBQUMsYUFBZ0Ms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QUFNO0FBQUEsTUFDSixNQUFNLE1BQU07QUFBQSxNQUNaO0FBQUEsTUFDQSxRQUFRLE1BQU07QUFBQSxNQUNkLEdBQUksTUFBTSxhQUFhLEVBQUUsWUFBWSxNQUFNLFdBQVcsSUFBSSxDQUFDO0FBQUEsSUFDN0Q7QUFBQSxFQUNGO0FBQ0Y7QUFPTyxJQUFNLFNBQVMsQ0FJcEIsVUFXMkI7QUFDM0IsUUFBTSxNQUFNLENBQUMsVUFBZ0M7QUFDM0MsVUFBTSxPQUFRLE1BQU0sS0FBK0IsSUFBSSxDQUFDLFFBQWMsVUFBVSxPQUFjLEdBQUcsQ0FBQztBQUNsRyxXQUFRLE1BQU0sSUFBWSxHQUFHLElBQUk7QUFBQSxFQUNuQztBQUNBLFNBQU87QUFBQSxJQUNMLFdBQVc7QUFBQSxJQUNYLE1BQU07QUFBQSxJQUNOLE1BQU0sRUFBRSxHQUFHLE9BQU8sSUFBSTtBQUFBLEVBQ3hCO0FBQ0Y7QUFPTyxJQUFNLGdCQUFnQixDQUF1RSxXQVFqRztBQUFBLEVBQ0MsV0FBVztBQUFBLEVBQ1gsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUNSO0FBT0ssSUFBTSxPQUFPLENBQWdELFVBU2pFO0FBQUEsRUFDQyxXQUFXO0FBQUEsRUFDWCxNQUFNO0FBQUEsRUFDTixNQUFNLEVBQUUsR0FBRyxNQUFNLEdBQUksS0FBSyxhQUFhLEVBQUUsWUFBWSxLQUFLLFdBQVcsSUFBSSxDQUFDLEVBQUc7QUFDL0U7QUFPSyxJQUFNQyxTQUFRLENBQ25CLGFBQ0EsU0FDdUMsTUFBTSxhQUFhLElBQUk7QUFPekQsSUFBTUMsV0FBVSxDQUNyQixPQUNBLFlBQ29ELFFBQVEsT0FBTyxPQUFPO0FBU3JFLElBQU1DLGtCQUFpQixDQUM1QixTQUNBLFVBQ0EsWUFJVyxlQUFlO0FBQUEsRUFDeEI7QUFBQSxFQUNBO0FBQUEsRUFDQSxTQUFTLFNBQVM7QUFDcEIsQ0FBQzsiLAogICJuYW1lcyI6IFsiRWZmZWN0IiwgInJlc3VtZSIsICJ3cml0ZVZhbHVlIiwgInNpZ25hbCIsICJFZmZlY3QiLCAiRmliZXJSZWYiLCAiRWZmZWN0IiwgIkZpYmVyUmVmIiwgImxpc3QiLCAiRWZmZWN0IiwgImJ1aWxkIiwgImluc3RhbGwiLCAiZXhwb3J0U3RhdGljSXIiXQp9Cg==
|