@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
|
@@ -1,395 +0,0 @@
|
|
|
1
|
-
// @logixjs/core subpath bundles for @logixjs/sandbox
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
fnv1a32,
|
|
5
|
-
stableStringify
|
|
6
|
-
} from "./chunk-S46P7MC6.js";
|
|
7
|
-
|
|
8
|
-
// ../logix-core/src/internal/runtime/core/ReadQuery.ts
|
|
9
|
-
function isReadQuery(input) {
|
|
10
|
-
if (!input || typeof input !== "object" && typeof input !== "function") return false;
|
|
11
|
-
const maybe = input;
|
|
12
|
-
return typeof maybe.selectorId === "string" && typeof maybe.select === "function" && Array.isArray(maybe.reads);
|
|
13
|
-
}
|
|
14
|
-
var normalizeReads = (reads) => {
|
|
15
|
-
const unique = [];
|
|
16
|
-
const seen = /* @__PURE__ */ new Set();
|
|
17
|
-
for (const r of reads) {
|
|
18
|
-
const key = typeof r === "number" ? `n:${r}` : `s:${r}`;
|
|
19
|
-
if (seen.has(key)) continue;
|
|
20
|
-
seen.add(key);
|
|
21
|
-
unique.push(r);
|
|
22
|
-
}
|
|
23
|
-
return unique.slice().sort((a, b) => String(a).localeCompare(String(b)));
|
|
24
|
-
};
|
|
25
|
-
var toHash32Number = (hex) => Number.parseInt(hex, 16);
|
|
26
|
-
var makeReadsDigest = (reads) => {
|
|
27
|
-
const normalized = normalizeReads(reads);
|
|
28
|
-
return {
|
|
29
|
-
count: normalized.length,
|
|
30
|
-
hash: toHash32Number(fnv1a32(stableStringify(normalized)))
|
|
31
|
-
};
|
|
32
|
-
};
|
|
33
|
-
var computeSelectorId = (value) => `rq_${fnv1a32(stableStringify(value))}`;
|
|
34
|
-
var nextUnstableSelectorSeq = 0;
|
|
35
|
-
var unstableSelectorIdByFn = /* @__PURE__ */ new WeakMap();
|
|
36
|
-
var computeUnstableSelectorId = (selector) => {
|
|
37
|
-
const existing = unstableSelectorIdByFn.get(selector);
|
|
38
|
-
if (existing) return existing;
|
|
39
|
-
nextUnstableSelectorSeq += 1;
|
|
40
|
-
const selectorId = `rq_u${nextUnstableSelectorSeq}`;
|
|
41
|
-
unstableSelectorIdByFn.set(selector, selectorId);
|
|
42
|
-
return selectorId;
|
|
43
|
-
};
|
|
44
|
-
var unwrapParens = (input) => {
|
|
45
|
-
const trimmed = input.trim();
|
|
46
|
-
if (trimmed.startsWith("(") && trimmed.endsWith(")")) {
|
|
47
|
-
const inner = trimmed.slice(1, -1).trim();
|
|
48
|
-
if (!inner.startsWith("(") || !inner.endsWith(")")) {
|
|
49
|
-
return inner;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return trimmed;
|
|
53
|
-
};
|
|
54
|
-
var extractArrow = (source) => {
|
|
55
|
-
const idx = source.indexOf("=>");
|
|
56
|
-
if (idx < 0) return void 0;
|
|
57
|
-
const left = source.slice(0, idx).trim();
|
|
58
|
-
const right = source.slice(idx + 2).trim();
|
|
59
|
-
const paramRaw = unwrapParens(left);
|
|
60
|
-
if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(paramRaw)) return void 0;
|
|
61
|
-
if (right.startsWith("{")) {
|
|
62
|
-
const m = right.match(/^\{\s*return\s+(.+?);?\s*\}\s*$/s);
|
|
63
|
-
if (!m) return void 0;
|
|
64
|
-
return { param: paramRaw, body: m[1]?.trim() ?? "" };
|
|
65
|
-
}
|
|
66
|
-
return { param: paramRaw, body: right };
|
|
67
|
-
};
|
|
68
|
-
var extractFunctionReturn = (source) => {
|
|
69
|
-
const trimmed = source.trim();
|
|
70
|
-
const m = trimmed.match(
|
|
71
|
-
/^function\s*(?:[A-Za-z_$][A-Za-z0-9_$]*\s*)?\(\s*([A-Za-z_$][A-Za-z0-9_$]*)\s*\)\s*\{\s*return\s+(.+?);?\s*\}\s*$/s
|
|
72
|
-
);
|
|
73
|
-
if (!m) return void 0;
|
|
74
|
-
const param = m[1]?.trim() ?? "";
|
|
75
|
-
if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(param)) return void 0;
|
|
76
|
-
const body = m[2]?.trim() ?? "";
|
|
77
|
-
if (body.length === 0) return void 0;
|
|
78
|
-
return { param, body };
|
|
79
|
-
};
|
|
80
|
-
var tryParseSelectorSource = (source) => {
|
|
81
|
-
const arrowOrFn = extractArrow(source) ?? extractFunctionReturn(source);
|
|
82
|
-
if (!arrowOrFn) return void 0;
|
|
83
|
-
const expr = unwrapParens(arrowOrFn.body).trim().replace(/;$/, "").trim();
|
|
84
|
-
{
|
|
85
|
-
const re = new RegExp(`^${arrowOrFn.param}\\.([A-Za-z0-9_$]+(?:\\.[A-Za-z0-9_$]+)*)$`);
|
|
86
|
-
const m = expr.match(re);
|
|
87
|
-
if (m) {
|
|
88
|
-
return { kind: "path", path: m[1] };
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
if (expr.startsWith("{") && expr.endsWith("}")) {
|
|
92
|
-
const inner = expr.slice(1, -1).trim();
|
|
93
|
-
if (inner.length === 0) return { kind: "struct", entries: [] };
|
|
94
|
-
const parts = inner.split(",").map((p) => p.trim()).filter((p) => p.length > 0);
|
|
95
|
-
const entries = [];
|
|
96
|
-
for (const part of parts) {
|
|
97
|
-
const idx = part.indexOf(":");
|
|
98
|
-
if (idx < 0) return void 0;
|
|
99
|
-
const key = part.slice(0, idx).trim();
|
|
100
|
-
const value = part.slice(idx + 1).trim();
|
|
101
|
-
if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)) return void 0;
|
|
102
|
-
const re = new RegExp(`^${arrowOrFn.param}\\.([A-Za-z0-9_$]+(?:\\.[A-Za-z0-9_$]+)*)$`);
|
|
103
|
-
const m = value.match(re);
|
|
104
|
-
if (!m) return void 0;
|
|
105
|
-
entries.push([key, m[1]]);
|
|
106
|
-
}
|
|
107
|
-
entries.sort((a, b) => a[0].localeCompare(b[0]));
|
|
108
|
-
return { kind: "struct", entries };
|
|
109
|
-
}
|
|
110
|
-
return void 0;
|
|
111
|
-
};
|
|
112
|
-
var READ_QUERY_TEMPLATE_CACHE_MAX = 2048;
|
|
113
|
-
var readQueryTemplateByFn = /* @__PURE__ */ new WeakMap();
|
|
114
|
-
var readQueryTemplateBySource = /* @__PURE__ */ new Map();
|
|
115
|
-
var lruGet = (map, key) => {
|
|
116
|
-
const value = map.get(key);
|
|
117
|
-
if (value === void 0) return void 0;
|
|
118
|
-
map.delete(key);
|
|
119
|
-
map.set(key, value);
|
|
120
|
-
return value;
|
|
121
|
-
};
|
|
122
|
-
var lruSet = (map, key, value, maxSize) => {
|
|
123
|
-
if (map.has(key)) map.delete(key);
|
|
124
|
-
map.set(key, value);
|
|
125
|
-
if (map.size <= maxSize) return;
|
|
126
|
-
const oldestKey = map.keys().next().value;
|
|
127
|
-
if (oldestKey !== void 0) {
|
|
128
|
-
map.delete(oldestKey);
|
|
129
|
-
}
|
|
130
|
-
};
|
|
131
|
-
var safeToString = (fn) => {
|
|
132
|
-
try {
|
|
133
|
-
return fn.toString();
|
|
134
|
-
} catch {
|
|
135
|
-
return "";
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
var make = (spec) => spec;
|
|
139
|
-
var compile = (input) => {
|
|
140
|
-
if (isReadQuery(input)) {
|
|
141
|
-
const reads = normalizeReads(input.reads);
|
|
142
|
-
const readsDigest = reads.length > 0 ? makeReadsDigest(reads) : void 0;
|
|
143
|
-
const equalsKind = input.equalsKind;
|
|
144
|
-
const staticIr2 = {
|
|
145
|
-
selectorId: input.selectorId,
|
|
146
|
-
debugKey: input.debugKey,
|
|
147
|
-
lane: "static",
|
|
148
|
-
producer: "manual",
|
|
149
|
-
reads,
|
|
150
|
-
readsDigest,
|
|
151
|
-
equalsKind
|
|
152
|
-
};
|
|
153
|
-
return {
|
|
154
|
-
...input,
|
|
155
|
-
reads,
|
|
156
|
-
lane: "static",
|
|
157
|
-
producer: "manual",
|
|
158
|
-
readsDigest,
|
|
159
|
-
staticIr: staticIr2
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
const selector = input;
|
|
163
|
-
const debugKey = (typeof selector?.debugKey === "string" && selector.debugKey.length > 0 ? selector.debugKey : void 0) ?? (typeof selector.name === "string" && selector.name.length > 0 ? selector.name : void 0);
|
|
164
|
-
const declaredReads = Array.isArray(selector?.fieldPaths) ? selector.fieldPaths.filter((x) => typeof x === "string") : void 0;
|
|
165
|
-
if (declaredReads && declaredReads.length > 0) {
|
|
166
|
-
const reads = normalizeReads(declaredReads);
|
|
167
|
-
const readsDigest = makeReadsDigest(reads);
|
|
168
|
-
const selectorId2 = computeSelectorId({ kind: "reads", reads });
|
|
169
|
-
const staticIr2 = {
|
|
170
|
-
selectorId: selectorId2,
|
|
171
|
-
debugKey,
|
|
172
|
-
lane: "static",
|
|
173
|
-
producer: "jit",
|
|
174
|
-
reads,
|
|
175
|
-
readsDigest,
|
|
176
|
-
equalsKind: "objectIs"
|
|
177
|
-
};
|
|
178
|
-
return {
|
|
179
|
-
selectorId: selectorId2,
|
|
180
|
-
debugKey,
|
|
181
|
-
reads,
|
|
182
|
-
select: selector,
|
|
183
|
-
equalsKind: "objectIs",
|
|
184
|
-
lane: "static",
|
|
185
|
-
producer: "jit",
|
|
186
|
-
readsDigest,
|
|
187
|
-
staticIr: staticIr2
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
const cachedByFn = readQueryTemplateByFn.get(selector);
|
|
191
|
-
if (cachedByFn) {
|
|
192
|
-
const staticIr2 = {
|
|
193
|
-
selectorId: cachedByFn.selectorId,
|
|
194
|
-
debugKey,
|
|
195
|
-
lane: "static",
|
|
196
|
-
producer: "jit",
|
|
197
|
-
reads: cachedByFn.reads,
|
|
198
|
-
readsDigest: cachedByFn.readsDigest,
|
|
199
|
-
equalsKind: cachedByFn.equalsKind
|
|
200
|
-
};
|
|
201
|
-
return {
|
|
202
|
-
selectorId: cachedByFn.selectorId,
|
|
203
|
-
debugKey,
|
|
204
|
-
reads: cachedByFn.reads,
|
|
205
|
-
select: selector,
|
|
206
|
-
equalsKind: cachedByFn.equalsKind,
|
|
207
|
-
lane: "static",
|
|
208
|
-
producer: "jit",
|
|
209
|
-
readsDigest: cachedByFn.readsDigest,
|
|
210
|
-
staticIr: staticIr2
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
const srcTrimmed = safeToString(selector).trim();
|
|
214
|
-
const cachedBySource = srcTrimmed.length > 0 ? lruGet(readQueryTemplateBySource, srcTrimmed) : void 0;
|
|
215
|
-
if (cachedBySource) {
|
|
216
|
-
readQueryTemplateByFn.set(selector, cachedBySource);
|
|
217
|
-
const staticIr2 = {
|
|
218
|
-
selectorId: cachedBySource.selectorId,
|
|
219
|
-
debugKey,
|
|
220
|
-
lane: "static",
|
|
221
|
-
producer: "jit",
|
|
222
|
-
reads: cachedBySource.reads,
|
|
223
|
-
readsDigest: cachedBySource.readsDigest,
|
|
224
|
-
equalsKind: cachedBySource.equalsKind
|
|
225
|
-
};
|
|
226
|
-
return {
|
|
227
|
-
selectorId: cachedBySource.selectorId,
|
|
228
|
-
debugKey,
|
|
229
|
-
reads: cachedBySource.reads,
|
|
230
|
-
select: selector,
|
|
231
|
-
equalsKind: cachedBySource.equalsKind,
|
|
232
|
-
lane: "static",
|
|
233
|
-
producer: "jit",
|
|
234
|
-
readsDigest: cachedBySource.readsDigest,
|
|
235
|
-
staticIr: staticIr2
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
const parsed = srcTrimmed.length > 0 ? tryParseSelectorSource(srcTrimmed) : void 0;
|
|
239
|
-
if (parsed?.kind === "path") {
|
|
240
|
-
const reads = [parsed.path];
|
|
241
|
-
const readsDigest = makeReadsDigest(reads);
|
|
242
|
-
const selectorId2 = computeSelectorId({ kind: "path", path: parsed.path });
|
|
243
|
-
const template = { selectorId: selectorId2, reads, readsDigest, equalsKind: "objectIs" };
|
|
244
|
-
readQueryTemplateByFn.set(selector, template);
|
|
245
|
-
lruSet(readQueryTemplateBySource, srcTrimmed, template, READ_QUERY_TEMPLATE_CACHE_MAX);
|
|
246
|
-
const staticIr2 = {
|
|
247
|
-
selectorId: selectorId2,
|
|
248
|
-
debugKey,
|
|
249
|
-
lane: "static",
|
|
250
|
-
producer: "jit",
|
|
251
|
-
reads,
|
|
252
|
-
readsDigest,
|
|
253
|
-
equalsKind: "objectIs"
|
|
254
|
-
};
|
|
255
|
-
return {
|
|
256
|
-
selectorId: selectorId2,
|
|
257
|
-
debugKey,
|
|
258
|
-
reads,
|
|
259
|
-
select: selector,
|
|
260
|
-
equalsKind: "objectIs",
|
|
261
|
-
lane: "static",
|
|
262
|
-
producer: "jit",
|
|
263
|
-
readsDigest,
|
|
264
|
-
staticIr: staticIr2
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
if (parsed?.kind === "struct") {
|
|
268
|
-
const reads = normalizeReads(parsed.entries.map(([, path]) => path));
|
|
269
|
-
const readsDigest = makeReadsDigest(reads);
|
|
270
|
-
const selectorId2 = computeSelectorId({ kind: "struct", entries: parsed.entries });
|
|
271
|
-
const template = { selectorId: selectorId2, reads, readsDigest, equalsKind: "shallowStruct" };
|
|
272
|
-
readQueryTemplateByFn.set(selector, template);
|
|
273
|
-
lruSet(readQueryTemplateBySource, srcTrimmed, template, READ_QUERY_TEMPLATE_CACHE_MAX);
|
|
274
|
-
const staticIr2 = {
|
|
275
|
-
selectorId: selectorId2,
|
|
276
|
-
debugKey,
|
|
277
|
-
lane: "static",
|
|
278
|
-
producer: "jit",
|
|
279
|
-
reads,
|
|
280
|
-
readsDigest,
|
|
281
|
-
equalsKind: "shallowStruct"
|
|
282
|
-
};
|
|
283
|
-
return {
|
|
284
|
-
selectorId: selectorId2,
|
|
285
|
-
debugKey,
|
|
286
|
-
reads,
|
|
287
|
-
select: selector,
|
|
288
|
-
equalsKind: "shallowStruct",
|
|
289
|
-
lane: "static",
|
|
290
|
-
producer: "jit",
|
|
291
|
-
readsDigest,
|
|
292
|
-
staticIr: staticIr2
|
|
293
|
-
};
|
|
294
|
-
}
|
|
295
|
-
const baseFallbackReason = srcTrimmed.includes("=>") || srcTrimmed.startsWith("function") ? "unsupportedSyntax" : "missingDeps";
|
|
296
|
-
const lowDiscriminabilitySource = srcTrimmed.length === 0 || srcTrimmed.includes("[native code]");
|
|
297
|
-
const fallbackReason = !debugKey || lowDiscriminabilitySource ? "unstableSelectorId" : baseFallbackReason;
|
|
298
|
-
const selectorId = fallbackReason === "unstableSelectorId" ? computeUnstableSelectorId(selector) : computeSelectorId({ kind: "dynamic", debugKey, src: srcTrimmed });
|
|
299
|
-
const staticIr = {
|
|
300
|
-
selectorId,
|
|
301
|
-
debugKey,
|
|
302
|
-
lane: "dynamic",
|
|
303
|
-
producer: "dynamic",
|
|
304
|
-
fallbackReason,
|
|
305
|
-
equalsKind: "objectIs"
|
|
306
|
-
};
|
|
307
|
-
return {
|
|
308
|
-
selectorId,
|
|
309
|
-
debugKey,
|
|
310
|
-
reads: [],
|
|
311
|
-
select: selector,
|
|
312
|
-
equalsKind: "objectIs",
|
|
313
|
-
lane: "dynamic",
|
|
314
|
-
producer: "dynamic",
|
|
315
|
-
fallbackReason,
|
|
316
|
-
staticIr
|
|
317
|
-
};
|
|
318
|
-
};
|
|
319
|
-
var filterNonEmpty = (values) => {
|
|
320
|
-
if (!values || values.length === 0) return void 0;
|
|
321
|
-
const next = values.map((v) => v.trim()).filter((v) => v.length > 0);
|
|
322
|
-
return next.length > 0 ? next : void 0;
|
|
323
|
-
};
|
|
324
|
-
var makeStrictGateDiagnostic = (args) => {
|
|
325
|
-
const severity = args.config.mode === "warn" ? "warning" : "error";
|
|
326
|
-
return {
|
|
327
|
-
type: "diagnostic",
|
|
328
|
-
moduleId: args.details.moduleId,
|
|
329
|
-
instanceId: args.details.instanceId,
|
|
330
|
-
txnSeq: args.details.txnSeq,
|
|
331
|
-
code: "read_query::strict_gate",
|
|
332
|
-
severity,
|
|
333
|
-
message: `ReadQuery strict gate violated: selector entered dynamic lane (selectorId=${args.details.selectorId}, reason=${args.details.fallbackReason}).`,
|
|
334
|
-
hint: "Fix: make the selector statically compilable (AOT/JIT) or pass an explicit ReadQuery; or disable/narrow the gate via RuntimeOptions.readQuery.strictGate.requireStatic / denyFallbackReasons.",
|
|
335
|
-
kind: "read_query:strict_gate",
|
|
336
|
-
trigger: {
|
|
337
|
-
kind: "read_query",
|
|
338
|
-
name: "strict_gate",
|
|
339
|
-
details: args.details
|
|
340
|
-
}
|
|
341
|
-
};
|
|
342
|
-
};
|
|
343
|
-
var makeStrictGateError = (args) => Object.assign(
|
|
344
|
-
new Error(
|
|
345
|
-
`[ReadQueryStrictGateError] selector entered dynamic lane (selectorId=${args.details.selectorId}, reason=${args.details.fallbackReason}).`
|
|
346
|
-
),
|
|
347
|
-
{
|
|
348
|
-
_tag: "ReadQueryStrictGateError",
|
|
349
|
-
details: args.details
|
|
350
|
-
}
|
|
351
|
-
);
|
|
352
|
-
var evaluateStrictGate = (args) => {
|
|
353
|
-
if (args.config.mode === "off") {
|
|
354
|
-
return { verdict: "PASS" };
|
|
355
|
-
}
|
|
356
|
-
if (args.compiled.lane !== "dynamic") {
|
|
357
|
-
return { verdict: "PASS" };
|
|
358
|
-
}
|
|
359
|
-
const fallbackReason = args.compiled.fallbackReason ?? "missingDeps";
|
|
360
|
-
const denyFallbackReasons = args.config.denyFallbackReasons;
|
|
361
|
-
const denied = !!denyFallbackReasons?.includes(fallbackReason);
|
|
362
|
-
const selectorIds = filterNonEmpty(args.config.requireStatic?.selectorIds);
|
|
363
|
-
const modules = filterNonEmpty(args.config.requireStatic?.modules);
|
|
364
|
-
const hasCoverageFilter = !!selectorIds || !!modules;
|
|
365
|
-
const matchedSelectorId = !!selectorIds?.includes(args.compiled.selectorId);
|
|
366
|
-
const matchedModule = !!modules?.includes(args.moduleId);
|
|
367
|
-
const coveredByRequireStatic = !hasCoverageFilter || matchedSelectorId || matchedModule;
|
|
368
|
-
if (!denied && !coveredByRequireStatic) {
|
|
369
|
-
return { verdict: "PASS" };
|
|
370
|
-
}
|
|
371
|
-
const rule = denied ? "denyFallbackReason" : !hasCoverageFilter ? "requireStatic:global" : matchedSelectorId ? "requireStatic:selectorId" : "requireStatic:module";
|
|
372
|
-
const details = {
|
|
373
|
-
moduleId: args.moduleId,
|
|
374
|
-
instanceId: args.instanceId,
|
|
375
|
-
txnSeq: args.txnSeq,
|
|
376
|
-
selectorId: args.compiled.selectorId,
|
|
377
|
-
debugKey: args.compiled.debugKey,
|
|
378
|
-
fallbackReason,
|
|
379
|
-
rule
|
|
380
|
-
};
|
|
381
|
-
const diagnostic = makeStrictGateDiagnostic({ config: args.config, details });
|
|
382
|
-
if (args.config.mode === "warn") {
|
|
383
|
-
return { verdict: "WARN", diagnostic, details };
|
|
384
|
-
}
|
|
385
|
-
const error = makeStrictGateError({ details });
|
|
386
|
-
return { verdict: "FAIL", diagnostic, error, details };
|
|
387
|
-
};
|
|
388
|
-
|
|
389
|
-
export {
|
|
390
|
-
isReadQuery,
|
|
391
|
-
make,
|
|
392
|
-
compile,
|
|
393
|
-
evaluateStrictGate
|
|
394
|
-
};
|
|
395
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL1JlYWRRdWVyeS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgZm52MWEzMiwgc3RhYmxlU3RyaW5naWZ5IH0gZnJvbSAnLi4vLi4vZGlnZXN0LmpzJ1xuaW1wb3J0IHR5cGUgKiBhcyBEZWJ1Z1NpbmsgZnJvbSAnLi9EZWJ1Z1NpbmsuanMnXG5cbmV4cG9ydCB0eXBlIFJlYWRMYW5lID0gJ3N0YXRpYycgfCAnZHluYW1pYydcblxuZXhwb3J0IHR5cGUgUmVhZFByb2R1Y2VyID0gJ2FvdCcgfCAnaml0JyB8ICdtYW51YWwnIHwgJ2R5bmFtaWMnXG5cbmV4cG9ydCB0eXBlIFJlYWRRdWVyeUZhbGxiYWNrUmVhc29uID0gJ21pc3NpbmdEZXBzJyB8ICd1bnN1cHBvcnRlZFN5bnRheCcgfCAndW5zdGFibGVTZWxlY3RvcklkJ1xuXG5leHBvcnQgdHlwZSBFcXVhbHNLaW5kID0gJ29iamVjdElzJyB8ICdzaGFsbG93U3RydWN0JyB8ICdjdXN0b20nXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZHNEaWdlc3Qge1xuICByZWFkb25seSBjb3VudDogbnVtYmVyXG4gIHJlYWRvbmx5IGhhc2g6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRRdWVyeVN0YXRpY0lyIHtcbiAgcmVhZG9ubHkgc2VsZWN0b3JJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGRlYnVnS2V5Pzogc3RyaW5nXG4gIHJlYWRvbmx5IGxhbmU6IFJlYWRMYW5lXG4gIHJlYWRvbmx5IHByb2R1Y2VyOiBSZWFkUHJvZHVjZXJcbiAgcmVhZG9ubHkgcmVhZHM/OiBSZWFkb25seUFycmF5PHN0cmluZyB8IG51bWJlcj5cbiAgcmVhZG9ubHkgcmVhZHNEaWdlc3Q/OiBSZWFkc0RpZ2VzdFxuICByZWFkb25seSBmYWxsYmFja1JlYXNvbj86IFJlYWRRdWVyeUZhbGxiYWNrUmVhc29uXG4gIHJlYWRvbmx5IGVxdWFsc0tpbmQ6IEVxdWFsc0tpbmRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWFkUXVlcnk8UywgVj4ge1xuICByZWFkb25seSBzZWxlY3RvcklkOiBzdHJpbmdcbiAgcmVhZG9ubHkgZGVidWdLZXk/OiBzdHJpbmdcbiAgcmVhZG9ubHkgcmVhZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nIHwgbnVtYmVyPlxuICByZWFkb25seSBzZWxlY3Q6IChzdGF0ZTogUykgPT4gVlxuICByZWFkb25seSBlcXVhbHNLaW5kOiBFcXVhbHNLaW5kXG4gIHJlYWRvbmx5IGVxdWFscz86IChwcmV2aW91czogViwgbmV4dDogVikgPT4gYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRRdWVyeUNvbXBpbGVkPFMsIFY+IGV4dGVuZHMgUmVhZFF1ZXJ5PFMsIFY+IHtcbiAgcmVhZG9ubHkgbGFuZTogUmVhZExhbmVcbiAgcmVhZG9ubHkgcHJvZHVjZXI6IFJlYWRQcm9kdWNlclxuICByZWFkb25seSByZWFkc0RpZ2VzdD86IFJlYWRzRGlnZXN0XG4gIHJlYWRvbmx5IGZhbGxiYWNrUmVhc29uPzogUmVhZFF1ZXJ5RmFsbGJhY2tSZWFzb25cbiAgcmVhZG9ubHkgc3RhdGljSXI6IFJlYWRRdWVyeVN0YXRpY0lyXG59XG5cbmV4cG9ydCB0eXBlIFJlYWRRdWVyeUlucHV0PFMsIFY+ID0gKChzdGF0ZTogUykgPT4gVikgfCBSZWFkUXVlcnk8UywgVj5cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhZFF1ZXJ5PFMsIFY+KGlucHV0OiBSZWFkUXVlcnlJbnB1dDxTLCBWPik6IGlucHV0IGlzIFJlYWRRdWVyeTxTLCBWPlxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhZFF1ZXJ5KGlucHV0OiB1bmtub3duKTogaW5wdXQgaXMgUmVhZFF1ZXJ5PGFueSwgYW55PlxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhZFF1ZXJ5KGlucHV0OiB1bmtub3duKTogaW5wdXQgaXMgUmVhZFF1ZXJ5PGFueSwgYW55PiB7XG4gIGlmICghaW5wdXQgfHwgKHR5cGVvZiBpbnB1dCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIGlucHV0ICE9PSAnZnVuY3Rpb24nKSkgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IG1heWJlID0gaW5wdXQgYXMgYW55XG4gIHJldHVybiB0eXBlb2YgbWF5YmUuc2VsZWN0b3JJZCA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIG1heWJlLnNlbGVjdCA9PT0gJ2Z1bmN0aW9uJyAmJiBBcnJheS5pc0FycmF5KG1heWJlLnJlYWRzKVxufVxuXG5jb25zdCBub3JtYWxpemVSZWFkcyA9IChyZWFkczogUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudW1iZXI+KTogUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0+IHtcbiAgY29uc3QgdW5pcXVlOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gW11cbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gIGZvciAoY29uc3QgciBvZiByZWFkcykge1xuICAgIGNvbnN0IGtleSA9IHR5cGVvZiByID09PSAnbnVtYmVyJyA/IGBuOiR7cn1gIDogYHM6JHtyfWBcbiAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgY29udGludWVcbiAgICBzZWVuLmFkZChrZXkpXG4gICAgdW5pcXVlLnB1c2gocilcbiAgfVxuICByZXR1cm4gdW5pcXVlLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gU3RyaW5nKGEpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGIpKSlcbn1cblxuY29uc3QgdG9IYXNoMzJOdW1iZXIgPSAoaGV4OiBzdHJpbmcpOiBudW1iZXIgPT4gTnVtYmVyLnBhcnNlSW50KGhleCwgMTYpXG5cbmNvbnN0IG1ha2VSZWFkc0RpZ2VzdCA9IChyZWFkczogUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudW1iZXI+KTogUmVhZHNEaWdlc3QgPT4ge1xuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUmVhZHMocmVhZHMpXG4gIHJldHVybiB7XG4gICAgY291bnQ6IG5vcm1hbGl6ZWQubGVuZ3RoLFxuICAgIGhhc2g6IHRvSGFzaDMyTnVtYmVyKGZudjFhMzIoc3RhYmxlU3RyaW5naWZ5KG5vcm1hbGl6ZWQpKSksXG4gIH1cbn1cblxuY29uc3QgY29tcHV0ZVNlbGVjdG9ySWQgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4gYHJxXyR7Zm52MWEzMihzdGFibGVTdHJpbmdpZnkodmFsdWUpKX1gXG5cbmxldCBuZXh0VW5zdGFibGVTZWxlY3RvclNlcSA9IDBcbmNvbnN0IHVuc3RhYmxlU2VsZWN0b3JJZEJ5Rm4gPSBuZXcgV2Vha01hcDxGdW5jdGlvbiwgc3RyaW5nPigpXG5cbmNvbnN0IGNvbXB1dGVVbnN0YWJsZVNlbGVjdG9ySWQgPSAoc2VsZWN0b3I6IEZ1bmN0aW9uKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZXhpc3RpbmcgPSB1bnN0YWJsZVNlbGVjdG9ySWRCeUZuLmdldChzZWxlY3RvcilcbiAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3RpbmdcbiAgbmV4dFVuc3RhYmxlU2VsZWN0b3JTZXEgKz0gMVxuICBjb25zdCBzZWxlY3RvcklkID0gYHJxX3Uke25leHRVbnN0YWJsZVNlbGVjdG9yU2VxfWBcbiAgdW5zdGFibGVTZWxlY3RvcklkQnlGbi5zZXQoc2VsZWN0b3IsIHNlbGVjdG9ySWQpXG4gIHJldHVybiBzZWxlY3RvcklkXG59XG5cbmNvbnN0IHVud3JhcFBhcmVucyA9IChpbnB1dDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdHJpbW1lZCA9IGlucHV0LnRyaW0oKVxuICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKCcoJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnKScpKSB7XG4gICAgY29uc3QgaW5uZXIgPSB0cmltbWVkLnNsaWNlKDEsIC0xKS50cmltKClcbiAgICAvLyBPbmx5IHVud3JhcCB0aGUgb3V0ZXJtb3N0IHBhaXIgb2YgcGFyZW50aGVzZXMgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IGJyZWFraW5nIHN5bnRheC5cbiAgICBpZiAoIWlubmVyLnN0YXJ0c1dpdGgoJygnKSB8fCAhaW5uZXIuZW5kc1dpdGgoJyknKSkge1xuICAgICAgcmV0dXJuIGlubmVyXG4gICAgfVxuICB9XG4gIHJldHVybiB0cmltbWVkXG59XG5cbmNvbnN0IGV4dHJhY3RBcnJvdyA9IChzb3VyY2U6IHN0cmluZyk6IHsgcmVhZG9ubHkgcGFyYW06IHN0cmluZzsgcmVhZG9ubHkgYm9keTogc3RyaW5nIH0gfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBpZHggPSBzb3VyY2UuaW5kZXhPZignPT4nKVxuICBpZiAoaWR4IDwgMCkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBsZWZ0ID0gc291cmNlLnNsaWNlKDAsIGlkeCkudHJpbSgpXG4gIGNvbnN0IHJpZ2h0ID0gc291cmNlLnNsaWNlKGlkeCArIDIpLnRyaW0oKVxuXG4gIGNvbnN0IHBhcmFtUmF3ID0gdW53cmFwUGFyZW5zKGxlZnQpXG4gIGlmICghL15bQS1aYS16XyRdW0EtWmEtejAtOV8kXSokLy50ZXN0KHBhcmFtUmF3KSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIC8vIGJsb2NrIGJvZHk6IHsgcmV0dXJuIGV4cHIgfVxuICBpZiAocmlnaHQuc3RhcnRzV2l0aCgneycpKSB7XG4gICAgY29uc3QgbSA9IHJpZ2h0Lm1hdGNoKC9eXFx7XFxzKnJldHVyblxccysoLis/KTs/XFxzKlxcfVxccyokL3MpXG4gICAgaWYgKCFtKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHsgcGFyYW06IHBhcmFtUmF3LCBib2R5OiBtWzFdPy50cmltKCkgPz8gJycgfVxuICB9XG5cbiAgcmV0dXJuIHsgcGFyYW06IHBhcmFtUmF3LCBib2R5OiByaWdodCB9XG59XG5cbmNvbnN0IGV4dHJhY3RGdW5jdGlvblJldHVybiA9IChzb3VyY2U6IHN0cmluZyk6IHsgcmVhZG9ubHkgcGFyYW06IHN0cmluZzsgcmVhZG9ubHkgYm9keTogc3RyaW5nIH0gfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB0cmltbWVkID0gc291cmNlLnRyaW0oKVxuICBjb25zdCBtID0gdHJpbW1lZC5tYXRjaChcbiAgICAvXmZ1bmN0aW9uXFxzKig/OltBLVphLXpfJF1bQS1aYS16MC05XyRdKlxccyopP1xcKFxccyooW0EtWmEtel8kXVtBLVphLXowLTlfJF0qKVxccypcXClcXHMqXFx7XFxzKnJldHVyblxccysoLis/KTs/XFxzKlxcfVxccyokL3MsXG4gIClcbiAgaWYgKCFtKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3QgcGFyYW0gPSBtWzFdPy50cmltKCkgPz8gJydcbiAgaWYgKCEvXltBLVphLXpfJF1bQS1aYS16MC05XyRdKiQvLnRlc3QocGFyYW0pKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3QgYm9keSA9IG1bMl0/LnRyaW0oKSA/PyAnJ1xuICBpZiAoYm9keS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcblxuICByZXR1cm4geyBwYXJhbSwgYm9keSB9XG59XG5cbnR5cGUgUGFyc2VkU2VsZWN0b3IgPVxuICB8IHsgcmVhZG9ubHkga2luZDogJ3BhdGgnOyByZWFkb25seSBwYXRoOiBzdHJpbmcgfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ3N0cnVjdCc7IHJlYWRvbmx5IGVudHJpZXM6IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgW3N0cmluZywgc3RyaW5nXT4gfVxuXG5jb25zdCB0cnlQYXJzZVNlbGVjdG9yU291cmNlID0gKHNvdXJjZTogc3RyaW5nKTogUGFyc2VkU2VsZWN0b3IgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBhcnJvd09yRm4gPSBleHRyYWN0QXJyb3coc291cmNlKSA/PyBleHRyYWN0RnVuY3Rpb25SZXR1cm4oc291cmNlKVxuICBpZiAoIWFycm93T3JGbikgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IGV4cHIgPSB1bndyYXBQYXJlbnMoYXJyb3dPckZuLmJvZHkpLnRyaW0oKS5yZXBsYWNlKC87JC8sICcnKS50cmltKClcblxuICAvLyBwYXRoOiBzLmEuYlxuICB7XG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGBeJHthcnJvd09yRm4ucGFyYW19XFxcXC4oW0EtWmEtejAtOV8kXSsoPzpcXFxcLltBLVphLXowLTlfJF0rKSopJGApXG4gICAgY29uc3QgbSA9IGV4cHIubWF0Y2gocmUpXG4gICAgaWYgKG0pIHtcbiAgICAgIHJldHVybiB7IGtpbmQ6ICdwYXRoJywgcGF0aDogbVsxXSB9XG4gICAgfVxuICB9XG5cbiAgLy8gc3RydWN0OiAoeyBhOiBzLmEsIGI6IHMuYiB9KVxuICBpZiAoZXhwci5zdGFydHNXaXRoKCd7JykgJiYgZXhwci5lbmRzV2l0aCgnfScpKSB7XG4gICAgY29uc3QgaW5uZXIgPSBleHByLnNsaWNlKDEsIC0xKS50cmltKClcbiAgICBpZiAoaW5uZXIubGVuZ3RoID09PSAwKSByZXR1cm4geyBraW5kOiAnc3RydWN0JywgZW50cmllczogW10gfVxuXG4gICAgY29uc3QgcGFydHMgPSBpbm5lclxuICAgICAgLnNwbGl0KCcsJylcbiAgICAgIC5tYXAoKHApID0+IHAudHJpbSgpKVxuICAgICAgLmZpbHRlcigocCkgPT4gcC5sZW5ndGggPiAwKVxuXG4gICAgY29uc3QgZW50cmllczogQXJyYXk8cmVhZG9ubHkgW3N0cmluZywgc3RyaW5nXT4gPSBbXVxuXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBjb25zdCBpZHggPSBwYXJ0LmluZGV4T2YoJzonKVxuICAgICAgaWYgKGlkeCA8IDApIHJldHVybiB1bmRlZmluZWRcbiAgICAgIGNvbnN0IGtleSA9IHBhcnQuc2xpY2UoMCwgaWR4KS50cmltKClcbiAgICAgIGNvbnN0IHZhbHVlID0gcGFydC5zbGljZShpZHggKyAxKS50cmltKClcblxuICAgICAgaWYgKCEvXltBLVphLXpfJF1bQS1aYS16MC05XyRdKiQvLnRlc3Qoa2V5KSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoYF4ke2Fycm93T3JGbi5wYXJhbX1cXFxcLihbQS1aYS16MC05XyRdKyg/OlxcXFwuW0EtWmEtejAtOV8kXSspKikkYClcbiAgICAgIGNvbnN0IG0gPSB2YWx1ZS5tYXRjaChyZSlcbiAgICAgIGlmICghbSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgZW50cmllcy5wdXNoKFtrZXksIG1bMV1dIGFzIGNvbnN0KVxuICAgIH1cblxuICAgIC8vIFNvcnQgZW50cmllcyB0byBlbnN1cmUgYSBzdGFibGUgc2VsZWN0b3JJZC5cbiAgICBlbnRyaWVzLnNvcnQoKGEsIGIpID0+IGFbMF0ubG9jYWxlQ29tcGFyZShiWzBdKSlcbiAgICByZXR1cm4geyBraW5kOiAnc3RydWN0JywgZW50cmllcyB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbnR5cGUgUmVhZFF1ZXJ5U3RhdGljVGVtcGxhdGUgPSB7XG4gIHJlYWRvbmx5IHNlbGVjdG9ySWQ6IHN0cmluZ1xuICByZWFkb25seSByZWFkczogUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudW1iZXI+XG4gIHJlYWRvbmx5IHJlYWRzRGlnZXN0OiBSZWFkc0RpZ2VzdFxuICByZWFkb25seSBlcXVhbHNLaW5kOiBFcXVhbHNLaW5kXG59XG5cbmNvbnN0IFJFQURfUVVFUllfVEVNUExBVEVfQ0FDSEVfTUFYID0gMjA0OFxuY29uc3QgcmVhZFF1ZXJ5VGVtcGxhdGVCeUZuID0gbmV3IFdlYWtNYXA8RnVuY3Rpb24sIFJlYWRRdWVyeVN0YXRpY1RlbXBsYXRlPigpXG5jb25zdCByZWFkUXVlcnlUZW1wbGF0ZUJ5U291cmNlID0gbmV3IE1hcDxzdHJpbmcsIFJlYWRRdWVyeVN0YXRpY1RlbXBsYXRlPigpXG5cbmNvbnN0IGxydUdldCA9IDxLLCBWPihtYXA6IE1hcDxLLCBWPiwga2V5OiBLKTogViB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHZhbHVlID0gbWFwLmdldChrZXkpXG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkXG4gIG1hcC5kZWxldGUoa2V5KVxuICBtYXAuc2V0KGtleSwgdmFsdWUpXG4gIHJldHVybiB2YWx1ZVxufVxuXG5jb25zdCBscnVTZXQgPSA8SywgVj4obWFwOiBNYXA8SywgVj4sIGtleTogSywgdmFsdWU6IFYsIG1heFNpemU6IG51bWJlcikgPT4ge1xuICBpZiAobWFwLmhhcyhrZXkpKSBtYXAuZGVsZXRlKGtleSlcbiAgbWFwLnNldChrZXksIHZhbHVlKVxuICBpZiAobWFwLnNpemUgPD0gbWF4U2l6ZSkgcmV0dXJuXG4gIGNvbnN0IG9sZGVzdEtleSA9IG1hcC5rZXlzKCkubmV4dCgpLnZhbHVlIGFzIEsgfCB1bmRlZmluZWRcbiAgaWYgKG9sZGVzdEtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbWFwLmRlbGV0ZShvbGRlc3RLZXkpXG4gIH1cbn1cblxuY29uc3Qgc2FmZVRvU3RyaW5nID0gKGZuOiBGdW5jdGlvbik6IHN0cmluZyA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuLnRvU3RyaW5nKClcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICcnXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG1ha2UgPSA8UywgVj4oc3BlYzogUmVhZFF1ZXJ5PFMsIFY+KTogUmVhZFF1ZXJ5PFMsIFY+ID0+IHNwZWNcblxuZXhwb3J0IGNvbnN0IGNvbXBpbGUgPSA8UywgVj4oaW5wdXQ6IFJlYWRRdWVyeUlucHV0PFMsIFY+KTogUmVhZFF1ZXJ5Q29tcGlsZWQ8UywgVj4gPT4ge1xuICBpZiAoaXNSZWFkUXVlcnkoaW5wdXQpKSB7XG4gICAgY29uc3QgcmVhZHMgPSBub3JtYWxpemVSZWFkcyhpbnB1dC5yZWFkcylcbiAgICBjb25zdCByZWFkc0RpZ2VzdCA9IHJlYWRzLmxlbmd0aCA+IDAgPyBtYWtlUmVhZHNEaWdlc3QocmVhZHMpIDogdW5kZWZpbmVkXG5cbiAgICBjb25zdCBlcXVhbHNLaW5kID0gaW5wdXQuZXF1YWxzS2luZFxuICAgIGNvbnN0IHN0YXRpY0lyOiBSZWFkUXVlcnlTdGF0aWNJciA9IHtcbiAgICAgIHNlbGVjdG9ySWQ6IGlucHV0LnNlbGVjdG9ySWQsXG4gICAgICBkZWJ1Z0tleTogaW5wdXQuZGVidWdLZXksXG4gICAgICBsYW5lOiAnc3RhdGljJyxcbiAgICAgIHByb2R1Y2VyOiAnbWFudWFsJyxcbiAgICAgIHJlYWRzLFxuICAgICAgcmVhZHNEaWdlc3QsXG4gICAgICBlcXVhbHNLaW5kLFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5pbnB1dCxcbiAgICAgIHJlYWRzLFxuICAgICAgbGFuZTogJ3N0YXRpYycsXG4gICAgICBwcm9kdWNlcjogJ21hbnVhbCcsXG4gICAgICByZWFkc0RpZ2VzdCxcbiAgICAgIHN0YXRpY0lyLFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNlbGVjdG9yID0gaW5wdXRcbiAgY29uc3QgZGVidWdLZXkgPVxuICAgICh0eXBlb2YgKHNlbGVjdG9yIGFzIGFueSk/LmRlYnVnS2V5ID09PSAnc3RyaW5nJyAmJiAoc2VsZWN0b3IgYXMgYW55KS5kZWJ1Z0tleS5sZW5ndGggPiAwXG4gICAgICA/IChzZWxlY3RvciBhcyBhbnkpLmRlYnVnS2V5XG4gICAgICA6IHVuZGVmaW5lZCkgPz9cbiAgICAodHlwZW9mIChzZWxlY3RvciBhcyBhbnkpLm5hbWUgPT09ICdzdHJpbmcnICYmIChzZWxlY3RvciBhcyBhbnkpLm5hbWUubGVuZ3RoID4gMFxuICAgICAgPyAoc2VsZWN0b3IgYXMgYW55KS5uYW1lXG4gICAgICA6IHVuZGVmaW5lZClcblxuICBjb25zdCBkZWNsYXJlZFJlYWRzOiBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQgPSBBcnJheS5pc0FycmF5KChzZWxlY3RvciBhcyBhbnkpPy5maWVsZFBhdGhzKVxuICAgID8gKChzZWxlY3RvciBhcyBhbnkpLmZpZWxkUGF0aHMgYXMgUmVhZG9ubHlBcnJheTx1bmtub3duPikuZmlsdGVyKCh4KTogeCBpcyBzdHJpbmcgPT4gdHlwZW9mIHggPT09ICdzdHJpbmcnKVxuICAgIDogdW5kZWZpbmVkXG5cbiAgaWYgKGRlY2xhcmVkUmVhZHMgJiYgZGVjbGFyZWRSZWFkcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcmVhZHMgPSBub3JtYWxpemVSZWFkcyhkZWNsYXJlZFJlYWRzKVxuICAgIGNvbnN0IHJlYWRzRGlnZXN0ID0gbWFrZVJlYWRzRGlnZXN0KHJlYWRzKVxuICAgIGNvbnN0IHNlbGVjdG9ySWQgPSBjb21wdXRlU2VsZWN0b3JJZCh7IGtpbmQ6ICdyZWFkcycsIHJlYWRzIH0pXG5cbiAgICBjb25zdCBzdGF0aWNJcjogUmVhZFF1ZXJ5U3RhdGljSXIgPSB7XG4gICAgICBzZWxlY3RvcklkLFxuICAgICAgZGVidWdLZXksXG4gICAgICBsYW5lOiAnc3RhdGljJyxcbiAgICAgIHByb2R1Y2VyOiAnaml0JyxcbiAgICAgIHJlYWRzLFxuICAgICAgcmVhZHNEaWdlc3QsXG4gICAgICBlcXVhbHNLaW5kOiAnb2JqZWN0SXMnLFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3RvcklkLFxuICAgICAgZGVidWdLZXksXG4gICAgICByZWFkcyxcbiAgICAgIHNlbGVjdDogc2VsZWN0b3IgYXMgYW55LFxuICAgICAgZXF1YWxzS2luZDogJ29iamVjdElzJyxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdqaXQnLFxuICAgICAgcmVhZHNEaWdlc3QsXG4gICAgICBzdGF0aWNJcixcbiAgICB9XG4gIH1cblxuICBjb25zdCBjYWNoZWRCeUZuID0gcmVhZFF1ZXJ5VGVtcGxhdGVCeUZuLmdldChzZWxlY3RvciBhcyB1bmtub3duIGFzIEZ1bmN0aW9uKVxuICBpZiAoY2FjaGVkQnlGbikge1xuICAgIGNvbnN0IHN0YXRpY0lyOiBSZWFkUXVlcnlTdGF0aWNJciA9IHtcbiAgICAgIHNlbGVjdG9ySWQ6IGNhY2hlZEJ5Rm4uc2VsZWN0b3JJZCxcbiAgICAgIGRlYnVnS2V5LFxuICAgICAgbGFuZTogJ3N0YXRpYycsXG4gICAgICBwcm9kdWNlcjogJ2ppdCcsXG4gICAgICByZWFkczogY2FjaGVkQnlGbi5yZWFkcyxcbiAgICAgIHJlYWRzRGlnZXN0OiBjYWNoZWRCeUZuLnJlYWRzRGlnZXN0LFxuICAgICAgZXF1YWxzS2luZDogY2FjaGVkQnlGbi5lcXVhbHNLaW5kLFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3RvcklkOiBjYWNoZWRCeUZuLnNlbGVjdG9ySWQsXG4gICAgICBkZWJ1Z0tleSxcbiAgICAgIHJlYWRzOiBjYWNoZWRCeUZuLnJlYWRzLFxuICAgICAgc2VsZWN0OiBzZWxlY3RvciBhcyBhbnksXG4gICAgICBlcXVhbHNLaW5kOiBjYWNoZWRCeUZuLmVxdWFsc0tpbmQsXG4gICAgICBsYW5lOiAnc3RhdGljJyxcbiAgICAgIHByb2R1Y2VyOiAnaml0JyxcbiAgICAgIHJlYWRzRGlnZXN0OiBjYWNoZWRCeUZuLnJlYWRzRGlnZXN0LFxuICAgICAgc3RhdGljSXIsXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3JjVHJpbW1lZCA9IHNhZmVUb1N0cmluZyhzZWxlY3RvciBhcyB1bmtub3duIGFzIEZ1bmN0aW9uKS50cmltKClcbiAgY29uc3QgY2FjaGVkQnlTb3VyY2UgPSBzcmNUcmltbWVkLmxlbmd0aCA+IDAgPyBscnVHZXQocmVhZFF1ZXJ5VGVtcGxhdGVCeVNvdXJjZSwgc3JjVHJpbW1lZCkgOiB1bmRlZmluZWRcbiAgaWYgKGNhY2hlZEJ5U291cmNlKSB7XG4gICAgcmVhZFF1ZXJ5VGVtcGxhdGVCeUZuLnNldChzZWxlY3RvciBhcyB1bmtub3duIGFzIEZ1bmN0aW9uLCBjYWNoZWRCeVNvdXJjZSlcbiAgICBjb25zdCBzdGF0aWNJcjogUmVhZFF1ZXJ5U3RhdGljSXIgPSB7XG4gICAgICBzZWxlY3RvcklkOiBjYWNoZWRCeVNvdXJjZS5zZWxlY3RvcklkLFxuICAgICAgZGVidWdLZXksXG4gICAgICBsYW5lOiAnc3RhdGljJyxcbiAgICAgIHByb2R1Y2VyOiAnaml0JyxcbiAgICAgIHJlYWRzOiBjYWNoZWRCeVNvdXJjZS5yZWFkcyxcbiAgICAgIHJlYWRzRGlnZXN0OiBjYWNoZWRCeVNvdXJjZS5yZWFkc0RpZ2VzdCxcbiAgICAgIGVxdWFsc0tpbmQ6IGNhY2hlZEJ5U291cmNlLmVxdWFsc0tpbmQsXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdG9ySWQ6IGNhY2hlZEJ5U291cmNlLnNlbGVjdG9ySWQsXG4gICAgICBkZWJ1Z0tleSxcbiAgICAgIHJlYWRzOiBjYWNoZWRCeVNvdXJjZS5yZWFkcyxcbiAgICAgIHNlbGVjdDogc2VsZWN0b3IgYXMgYW55LFxuICAgICAgZXF1YWxzS2luZDogY2FjaGVkQnlTb3VyY2UuZXF1YWxzS2luZCxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdqaXQnLFxuICAgICAgcmVhZHNEaWdlc3Q6IGNhY2hlZEJ5U291cmNlLnJlYWRzRGlnZXN0LFxuICAgICAgc3RhdGljSXIsXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGFyc2VkID0gc3JjVHJpbW1lZC5sZW5ndGggPiAwID8gdHJ5UGFyc2VTZWxlY3RvclNvdXJjZShzcmNUcmltbWVkKSA6IHVuZGVmaW5lZFxuXG4gIGlmIChwYXJzZWQ/LmtpbmQgPT09ICdwYXRoJykge1xuICAgIGNvbnN0IHJlYWRzID0gW3BhcnNlZC5wYXRoXVxuICAgIGNvbnN0IHJlYWRzRGlnZXN0ID0gbWFrZVJlYWRzRGlnZXN0KHJlYWRzKVxuICAgIGNvbnN0IHNlbGVjdG9ySWQgPSBjb21wdXRlU2VsZWN0b3JJZCh7IGtpbmQ6ICdwYXRoJywgcGF0aDogcGFyc2VkLnBhdGggfSlcbiAgICBjb25zdCB0ZW1wbGF0ZTogUmVhZFF1ZXJ5U3RhdGljVGVtcGxhdGUgPSB7IHNlbGVjdG9ySWQsIHJlYWRzLCByZWFkc0RpZ2VzdCwgZXF1YWxzS2luZDogJ29iamVjdElzJyB9XG4gICAgcmVhZFF1ZXJ5VGVtcGxhdGVCeUZuLnNldChzZWxlY3RvciBhcyB1bmtub3duIGFzIEZ1bmN0aW9uLCB0ZW1wbGF0ZSlcbiAgICBscnVTZXQocmVhZFF1ZXJ5VGVtcGxhdGVCeVNvdXJjZSwgc3JjVHJpbW1lZCwgdGVtcGxhdGUsIFJFQURfUVVFUllfVEVNUExBVEVfQ0FDSEVfTUFYKVxuXG4gICAgY29uc3Qgc3RhdGljSXI6IFJlYWRRdWVyeVN0YXRpY0lyID0ge1xuICAgICAgc2VsZWN0b3JJZCxcbiAgICAgIGRlYnVnS2V5LFxuICAgICAgbGFuZTogJ3N0YXRpYycsXG4gICAgICBwcm9kdWNlcjogJ2ppdCcsXG4gICAgICByZWFkcyxcbiAgICAgIHJlYWRzRGlnZXN0LFxuICAgICAgZXF1YWxzS2luZDogJ29iamVjdElzJyxcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0b3JJZCxcbiAgICAgIGRlYnVnS2V5LFxuICAgICAgcmVhZHMsXG4gICAgICBzZWxlY3Q6IHNlbGVjdG9yIGFzIGFueSxcbiAgICAgIGVxdWFsc0tpbmQ6ICdvYmplY3RJcycsXG4gICAgICBsYW5lOiAnc3RhdGljJyxcbiAgICAgIHByb2R1Y2VyOiAnaml0JyxcbiAgICAgIHJlYWRzRGlnZXN0LFxuICAgICAgc3RhdGljSXIsXG4gICAgfVxuICB9XG5cbiAgaWYgKHBhcnNlZD8ua2luZCA9PT0gJ3N0cnVjdCcpIHtcbiAgICBjb25zdCByZWFkcyA9IG5vcm1hbGl6ZVJlYWRzKHBhcnNlZC5lbnRyaWVzLm1hcCgoWywgcGF0aF0pID0+IHBhdGgpKVxuICAgIGNvbnN0IHJlYWRzRGlnZXN0ID0gbWFrZVJlYWRzRGlnZXN0KHJlYWRzKVxuICAgIGNvbnN0IHNlbGVjdG9ySWQgPSBjb21wdXRlU2VsZWN0b3JJZCh7IGtpbmQ6ICdzdHJ1Y3QnLCBlbnRyaWVzOiBwYXJzZWQuZW50cmllcyB9KVxuICAgIGNvbnN0IHRlbXBsYXRlOiBSZWFkUXVlcnlTdGF0aWNUZW1wbGF0ZSA9IHsgc2VsZWN0b3JJZCwgcmVhZHMsIHJlYWRzRGlnZXN0LCBlcXVhbHNLaW5kOiAnc2hhbGxvd1N0cnVjdCcgfVxuICAgIHJlYWRRdWVyeVRlbXBsYXRlQnlGbi5zZXQoc2VsZWN0b3IgYXMgdW5rbm93biBhcyBGdW5jdGlvbiwgdGVtcGxhdGUpXG4gICAgbHJ1U2V0KHJlYWRRdWVyeVRlbXBsYXRlQnlTb3VyY2UsIHNyY1RyaW1tZWQsIHRlbXBsYXRlLCBSRUFEX1FVRVJZX1RFTVBMQVRFX0NBQ0hFX01BWClcblxuICAgIGNvbnN0IHN0YXRpY0lyOiBSZWFkUXVlcnlTdGF0aWNJciA9IHtcbiAgICAgIHNlbGVjdG9ySWQsXG4gICAgICBkZWJ1Z0tleSxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdqaXQnLFxuICAgICAgcmVhZHMsXG4gICAgICByZWFkc0RpZ2VzdCxcbiAgICAgIGVxdWFsc0tpbmQ6ICdzaGFsbG93U3RydWN0JyxcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0b3JJZCxcbiAgICAgIGRlYnVnS2V5LFxuICAgICAgcmVhZHMsXG4gICAgICBzZWxlY3Q6IHNlbGVjdG9yIGFzIGFueSxcbiAgICAgIGVxdWFsc0tpbmQ6ICdzaGFsbG93U3RydWN0JyxcbiAgICAgIGxhbmU6ICdzdGF0aWMnLFxuICAgICAgcHJvZHVjZXI6ICdqaXQnLFxuICAgICAgcmVhZHNEaWdlc3QsXG4gICAgICBzdGF0aWNJcixcbiAgICB9XG4gIH1cblxuICAvLyBEeW5hbWljIGxhbmUgZmFsbGJhY2sgKG5vIHN0YWJsZSByZWFkcyAvIHVuc3VwcG9ydGVkIHN1YnNldClcbiAgY29uc3QgYmFzZUZhbGxiYWNrUmVhc29uOiBSZWFkUXVlcnlGYWxsYmFja1JlYXNvbiA9XG4gICAgc3JjVHJpbW1lZC5pbmNsdWRlcygnPT4nKSB8fCBzcmNUcmltbWVkLnN0YXJ0c1dpdGgoJ2Z1bmN0aW9uJykgPyAndW5zdXBwb3J0ZWRTeW50YXgnIDogJ21pc3NpbmdEZXBzJ1xuXG4gIGNvbnN0IGxvd0Rpc2NyaW1pbmFiaWxpdHlTb3VyY2UgPSBzcmNUcmltbWVkLmxlbmd0aCA9PT0gMCB8fCBzcmNUcmltbWVkLmluY2x1ZGVzKCdbbmF0aXZlIGNvZGVdJylcbiAgY29uc3QgZmFsbGJhY2tSZWFzb246IFJlYWRRdWVyeUZhbGxiYWNrUmVhc29uID1cbiAgICAhZGVidWdLZXkgfHwgbG93RGlzY3JpbWluYWJpbGl0eVNvdXJjZSA/ICd1bnN0YWJsZVNlbGVjdG9ySWQnIDogYmFzZUZhbGxiYWNrUmVhc29uXG5cbiAgY29uc3Qgc2VsZWN0b3JJZCA9XG4gICAgZmFsbGJhY2tSZWFzb24gPT09ICd1bnN0YWJsZVNlbGVjdG9ySWQnXG4gICAgICA/IGNvbXB1dGVVbnN0YWJsZVNlbGVjdG9ySWQoc2VsZWN0b3IgYXMgdW5rbm93biBhcyBGdW5jdGlvbilcbiAgICAgIDogY29tcHV0ZVNlbGVjdG9ySWQoeyBraW5kOiAnZHluYW1pYycsIGRlYnVnS2V5LCBzcmM6IHNyY1RyaW1tZWQgfSlcbiAgY29uc3Qgc3RhdGljSXI6IFJlYWRRdWVyeVN0YXRpY0lyID0ge1xuICAgIHNlbGVjdG9ySWQsXG4gICAgZGVidWdLZXksXG4gICAgbGFuZTogJ2R5bmFtaWMnLFxuICAgIHByb2R1Y2VyOiAnZHluYW1pYycsXG4gICAgZmFsbGJhY2tSZWFzb24sXG4gICAgZXF1YWxzS2luZDogJ29iamVjdElzJyxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2VsZWN0b3JJZCxcbiAgICBkZWJ1Z0tleSxcbiAgICByZWFkczogW10sXG4gICAgc2VsZWN0OiBzZWxlY3RvciBhcyBhbnksXG4gICAgZXF1YWxzS2luZDogJ29iamVjdElzJyxcbiAgICBsYW5lOiAnZHluYW1pYycsXG4gICAgcHJvZHVjZXI6ICdkeW5hbWljJyxcbiAgICBmYWxsYmFja1JlYXNvbixcbiAgICBzdGF0aWNJcixcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRRdWVyeVN0cmljdEdhdGVDb25maWcge1xuICByZWFkb25seSBtb2RlOiAnb2ZmJyB8ICd3YXJuJyB8ICdlcnJvcidcbiAgcmVhZG9ubHkgcmVxdWlyZVN0YXRpYz86IHtcbiAgICByZWFkb25seSBzZWxlY3Rvcklkcz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICAgIHJlYWRvbmx5IG1vZHVsZXM/OiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgfVxuICByZWFkb25seSBkZW55RmFsbGJhY2tSZWFzb25zPzogUmVhZG9ubHlBcnJheTxSZWFkUXVlcnlGYWxsYmFja1JlYXNvbj5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWFkUXVlcnlTdHJpY3RHYXRlVmlvbGF0aW9uRGV0YWlscyB7XG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgaW5zdGFuY2VJZDogc3RyaW5nXG4gIHJlYWRvbmx5IHR4blNlcTogbnVtYmVyXG4gIHJlYWRvbmx5IHNlbGVjdG9ySWQ6IHN0cmluZ1xuICByZWFkb25seSBkZWJ1Z0tleT86IHN0cmluZ1xuICByZWFkb25seSBmYWxsYmFja1JlYXNvbjogUmVhZFF1ZXJ5RmFsbGJhY2tSZWFzb25cbiAgcmVhZG9ubHkgcnVsZTogJ2RlbnlGYWxsYmFja1JlYXNvbicgfCAncmVxdWlyZVN0YXRpYzpnbG9iYWwnIHwgJ3JlcXVpcmVTdGF0aWM6c2VsZWN0b3JJZCcgfCAncmVxdWlyZVN0YXRpYzptb2R1bGUnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZFF1ZXJ5U3RyaWN0R2F0ZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBfdGFnOiAnUmVhZFF1ZXJ5U3RyaWN0R2F0ZUVycm9yJ1xuICByZWFkb25seSBkZXRhaWxzOiBSZWFkUXVlcnlTdHJpY3RHYXRlVmlvbGF0aW9uRGV0YWlsc1xufVxuXG5leHBvcnQgdHlwZSBSZWFkUXVlcnlTdHJpY3RHYXRlRGlhZ25vc3RpY0V2ZW50ID0gRXh0cmFjdDxEZWJ1Z1NpbmsuRXZlbnQsIHsgcmVhZG9ubHkgdHlwZTogJ2RpYWdub3N0aWMnIH0+XG5cbmV4cG9ydCB0eXBlIFJlYWRRdWVyeVN0cmljdEdhdGVEZWNpc2lvbiA9XG4gIHwgeyByZWFkb25seSB2ZXJkaWN0OiAnUEFTUycgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHZlcmRpY3Q6ICdXQVJOJ1xuICAgICAgcmVhZG9ubHkgZGlhZ25vc3RpYzogUmVhZFF1ZXJ5U3RyaWN0R2F0ZURpYWdub3N0aWNFdmVudFxuICAgICAgcmVhZG9ubHkgZGV0YWlsczogUmVhZFF1ZXJ5U3RyaWN0R2F0ZVZpb2xhdGlvbkRldGFpbHNcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdmVyZGljdDogJ0ZBSUwnXG4gICAgICByZWFkb25seSBkaWFnbm9zdGljOiBSZWFkUXVlcnlTdHJpY3RHYXRlRGlhZ25vc3RpY0V2ZW50XG4gICAgICByZWFkb25seSBlcnJvcjogUmVhZFF1ZXJ5U3RyaWN0R2F0ZUVycm9yXG4gICAgICByZWFkb25seSBkZXRhaWxzOiBSZWFkUXVlcnlTdHJpY3RHYXRlVmlvbGF0aW9uRGV0YWlsc1xuICAgIH1cblxuY29uc3QgZmlsdGVyTm9uRW1wdHkgPSAodmFsdWVzOiBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQpOiBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIXZhbHVlcyB8fCB2YWx1ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkXG4gIGNvbnN0IG5leHQgPSB2YWx1ZXMubWFwKCh2KSA9PiB2LnRyaW0oKSkuZmlsdGVyKCh2KSA9PiB2Lmxlbmd0aCA+IDApXG4gIHJldHVybiBuZXh0Lmxlbmd0aCA+IDAgPyBuZXh0IDogdW5kZWZpbmVkXG59XG5cbmNvbnN0IG1ha2VTdHJpY3RHYXRlRGlhZ25vc3RpYyA9IChhcmdzOiB7XG4gIHJlYWRvbmx5IGNvbmZpZzogUmVhZFF1ZXJ5U3RyaWN0R2F0ZUNvbmZpZ1xuICByZWFkb25seSBkZXRhaWxzOiBSZWFkUXVlcnlTdHJpY3RHYXRlVmlvbGF0aW9uRGV0YWlsc1xufSk6IFJlYWRRdWVyeVN0cmljdEdhdGVEaWFnbm9zdGljRXZlbnQgPT4ge1xuICBjb25zdCBzZXZlcml0eSA9IGFyZ3MuY29uZmlnLm1vZGUgPT09ICd3YXJuJyA/ICgnd2FybmluZycgYXMgY29uc3QpIDogKCdlcnJvcicgYXMgY29uc3QpXG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnZGlhZ25vc3RpYycsXG4gICAgbW9kdWxlSWQ6IGFyZ3MuZGV0YWlscy5tb2R1bGVJZCxcbiAgICBpbnN0YW5jZUlkOiBhcmdzLmRldGFpbHMuaW5zdGFuY2VJZCxcbiAgICB0eG5TZXE6IGFyZ3MuZGV0YWlscy50eG5TZXEsXG4gICAgY29kZTogJ3JlYWRfcXVlcnk6OnN0cmljdF9nYXRlJyxcbiAgICBzZXZlcml0eSxcbiAgICBtZXNzYWdlOiBgUmVhZFF1ZXJ5IHN0cmljdCBnYXRlIHZpb2xhdGVkOiBzZWxlY3RvciBlbnRlcmVkIGR5bmFtaWMgbGFuZSAoc2VsZWN0b3JJZD0ke2FyZ3MuZGV0YWlscy5zZWxlY3RvcklkfSwgcmVhc29uPSR7YXJncy5kZXRhaWxzLmZhbGxiYWNrUmVhc29ufSkuYCxcbiAgICBoaW50OlxuICAgICAgJ0ZpeDogbWFrZSB0aGUgc2VsZWN0b3Igc3RhdGljYWxseSBjb21waWxhYmxlIChBT1QvSklUKSBvciBwYXNzIGFuIGV4cGxpY2l0IFJlYWRRdWVyeTsgJyArXG4gICAgICAnb3IgZGlzYWJsZS9uYXJyb3cgdGhlIGdhdGUgdmlhIFJ1bnRpbWVPcHRpb25zLnJlYWRRdWVyeS5zdHJpY3RHYXRlLnJlcXVpcmVTdGF0aWMgLyBkZW55RmFsbGJhY2tSZWFzb25zLicsXG4gICAga2luZDogJ3JlYWRfcXVlcnk6c3RyaWN0X2dhdGUnLFxuICAgIHRyaWdnZXI6IHtcbiAgICAgIGtpbmQ6ICdyZWFkX3F1ZXJ5JyxcbiAgICAgIG5hbWU6ICdzdHJpY3RfZ2F0ZScsXG4gICAgICBkZXRhaWxzOiBhcmdzLmRldGFpbHMsXG4gICAgfSxcbiAgfVxufVxuXG5jb25zdCBtYWtlU3RyaWN0R2F0ZUVycm9yID0gKGFyZ3M6IHtcbiAgcmVhZG9ubHkgZGV0YWlsczogUmVhZFF1ZXJ5U3RyaWN0R2F0ZVZpb2xhdGlvbkRldGFpbHNcbn0pOiBSZWFkUXVlcnlTdHJpY3RHYXRlRXJyb3IgPT5cbiAgT2JqZWN0LmFzc2lnbihcbiAgICBuZXcgRXJyb3IoXG4gICAgICBgW1JlYWRRdWVyeVN0cmljdEdhdGVFcnJvcl0gc2VsZWN0b3IgZW50ZXJlZCBkeW5hbWljIGxhbmUgKHNlbGVjdG9ySWQ9JHthcmdzLmRldGFpbHMuc2VsZWN0b3JJZH0sIHJlYXNvbj0ke2FyZ3MuZGV0YWlscy5mYWxsYmFja1JlYXNvbn0pLmAsXG4gICAgKSxcbiAgICB7XG4gICAgICBfdGFnOiAnUmVhZFF1ZXJ5U3RyaWN0R2F0ZUVycm9yJyBhcyBjb25zdCxcbiAgICAgIGRldGFpbHM6IGFyZ3MuZGV0YWlscyxcbiAgICB9LFxuICApIGFzIFJlYWRRdWVyeVN0cmljdEdhdGVFcnJvclxuXG5leHBvcnQgY29uc3QgZXZhbHVhdGVTdHJpY3RHYXRlID0gKGFyZ3M6IHtcbiAgcmVhZG9ubHkgY29uZmlnOiBSZWFkUXVlcnlTdHJpY3RHYXRlQ29uZmlnXG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgaW5zdGFuY2VJZDogc3RyaW5nXG4gIHJlYWRvbmx5IHR4blNlcTogbnVtYmVyXG4gIHJlYWRvbmx5IGNvbXBpbGVkOiBSZWFkUXVlcnlDb21waWxlZDxhbnksIGFueT5cbn0pOiBSZWFkUXVlcnlTdHJpY3RHYXRlRGVjaXNpb24gPT4ge1xuICBpZiAoYXJncy5jb25maWcubW9kZSA9PT0gJ29mZicpIHtcbiAgICByZXR1cm4geyB2ZXJkaWN0OiAnUEFTUycgfVxuICB9XG5cbiAgaWYgKGFyZ3MuY29tcGlsZWQubGFuZSAhPT0gJ2R5bmFtaWMnKSB7XG4gICAgcmV0dXJuIHsgdmVyZGljdDogJ1BBU1MnIH1cbiAgfVxuXG4gIGNvbnN0IGZhbGxiYWNrUmVhc29uID0gKGFyZ3MuY29tcGlsZWQuZmFsbGJhY2tSZWFzb24gPz8gJ21pc3NpbmdEZXBzJykgYXMgUmVhZFF1ZXJ5RmFsbGJhY2tSZWFzb25cblxuICBjb25zdCBkZW55RmFsbGJhY2tSZWFzb25zID0gYXJncy5jb25maWcuZGVueUZhbGxiYWNrUmVhc29uc1xuICBjb25zdCBkZW5pZWQgPSAhIWRlbnlGYWxsYmFja1JlYXNvbnM/LmluY2x1ZGVzKGZhbGxiYWNrUmVhc29uKVxuXG4gIGNvbnN0IHNlbGVjdG9ySWRzID0gZmlsdGVyTm9uRW1wdHkoYXJncy5jb25maWcucmVxdWlyZVN0YXRpYz8uc2VsZWN0b3JJZHMpXG4gIGNvbnN0IG1vZHVsZXMgPSBmaWx0ZXJOb25FbXB0eShhcmdzLmNvbmZpZy5yZXF1aXJlU3RhdGljPy5tb2R1bGVzKVxuICBjb25zdCBoYXNDb3ZlcmFnZUZpbHRlciA9ICEhc2VsZWN0b3JJZHMgfHwgISFtb2R1bGVzXG5cbiAgY29uc3QgbWF0Y2hlZFNlbGVjdG9ySWQgPSAhIXNlbGVjdG9ySWRzPy5pbmNsdWRlcyhhcmdzLmNvbXBpbGVkLnNlbGVjdG9ySWQpXG4gIGNvbnN0IG1hdGNoZWRNb2R1bGUgPSAhIW1vZHVsZXM/LmluY2x1ZGVzKGFyZ3MubW9kdWxlSWQpXG4gIGNvbnN0IGNvdmVyZWRCeVJlcXVpcmVTdGF0aWMgPSAhaGFzQ292ZXJhZ2VGaWx0ZXIgfHwgbWF0Y2hlZFNlbGVjdG9ySWQgfHwgbWF0Y2hlZE1vZHVsZVxuXG4gIGlmICghZGVuaWVkICYmICFjb3ZlcmVkQnlSZXF1aXJlU3RhdGljKSB7XG4gICAgcmV0dXJuIHsgdmVyZGljdDogJ1BBU1MnIH1cbiAgfVxuXG4gIGNvbnN0IHJ1bGU6IFJlYWRRdWVyeVN0cmljdEdhdGVWaW9sYXRpb25EZXRhaWxzWydydWxlJ10gPSBkZW5pZWRcbiAgICA/ICdkZW55RmFsbGJhY2tSZWFzb24nXG4gICAgOiAhaGFzQ292ZXJhZ2VGaWx0ZXJcbiAgICAgID8gJ3JlcXVpcmVTdGF0aWM6Z2xvYmFsJ1xuICAgICAgOiBtYXRjaGVkU2VsZWN0b3JJZFxuICAgICAgICA/ICdyZXF1aXJlU3RhdGljOnNlbGVjdG9ySWQnXG4gICAgICAgIDogJ3JlcXVpcmVTdGF0aWM6bW9kdWxlJ1xuXG4gIGNvbnN0IGRldGFpbHM6IFJlYWRRdWVyeVN0cmljdEdhdGVWaW9sYXRpb25EZXRhaWxzID0ge1xuICAgIG1vZHVsZUlkOiBhcmdzLm1vZHVsZUlkLFxuICAgIGluc3RhbmNlSWQ6IGFyZ3MuaW5zdGFuY2VJZCxcbiAgICB0eG5TZXE6IGFyZ3MudHhuU2VxLFxuICAgIHNlbGVjdG9ySWQ6IGFyZ3MuY29tcGlsZWQuc2VsZWN0b3JJZCxcbiAgICBkZWJ1Z0tleTogYXJncy5jb21waWxlZC5kZWJ1Z0tleSxcbiAgICBmYWxsYmFja1JlYXNvbixcbiAgICBydWxlLFxuICB9XG5cbiAgY29uc3QgZGlhZ25vc3RpYyA9IG1ha2VTdHJpY3RHYXRlRGlhZ25vc3RpYyh7IGNvbmZpZzogYXJncy5jb25maWcsIGRldGFpbHMgfSlcblxuICBpZiAoYXJncy5jb25maWcubW9kZSA9PT0gJ3dhcm4nKSB7XG4gICAgcmV0dXJuIHsgdmVyZGljdDogJ1dBUk4nLCBkaWFnbm9zdGljLCBkZXRhaWxzIH1cbiAgfVxuXG4gIGNvbnN0IGVycm9yID0gbWFrZVN0cmljdEdhdGVFcnJvcih7IGRldGFpbHMgfSlcbiAgcmV0dXJuIHsgdmVyZGljdDogJ0ZBSUwnLCBkaWFnbm9zdGljLCBlcnJvciwgZGV0YWlscyB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7OztBQWdETyxTQUFTLFlBQVksT0FBOEM7QUFDeEUsTUFBSSxDQUFDLFNBQVUsT0FBTyxVQUFVLFlBQVksT0FBTyxVQUFVLFdBQWEsUUFBTztBQUNqRixRQUFNLFFBQVE7QUFDZCxTQUFPLE9BQU8sTUFBTSxlQUFlLFlBQVksT0FBTyxNQUFNLFdBQVcsY0FBYyxNQUFNLFFBQVEsTUFBTSxLQUFLO0FBQ2hIO0FBRUEsSUFBTSxpQkFBaUIsQ0FBQyxVQUEwRTtBQUNoRyxRQUFNLFNBQWlDLENBQUM7QUFDeEMsUUFBTSxPQUFPLG9CQUFJLElBQVk7QUFDN0IsYUFBVyxLQUFLLE9BQU87QUFDckIsVUFBTSxNQUFNLE9BQU8sTUFBTSxXQUFXLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQztBQUNyRCxRQUFJLEtBQUssSUFBSSxHQUFHLEVBQUc7QUFDbkIsU0FBSyxJQUFJLEdBQUc7QUFDWixX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
|