@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,474 @@
|
|
|
1
|
+
// @logix/core subpath bundles for @logix/sandbox
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
exportStaticIr,
|
|
5
|
+
fnv1a32,
|
|
6
|
+
stableStringify
|
|
7
|
+
} from "./chunk-QGIM3FQK.js";
|
|
8
|
+
import {
|
|
9
|
+
getModuleTraitsProgram
|
|
10
|
+
} from "./chunk-6FKWRVP4.js";
|
|
11
|
+
import {
|
|
12
|
+
isJsonValue
|
|
13
|
+
} from "./chunk-RYSSJBGX.js";
|
|
14
|
+
|
|
15
|
+
// ../logix-core/src/internal/reflection/staticIr.ts
|
|
16
|
+
var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
17
|
+
var isModuleImpl = (value) => isRecord(value) && value._tag === "ModuleImpl" && isRecord(value.module);
|
|
18
|
+
var resolveModuleId = (input) => {
|
|
19
|
+
if (isModuleImpl(input)) {
|
|
20
|
+
const id = input.module.id;
|
|
21
|
+
return typeof id === "string" && id.length > 0 ? id : "unknown";
|
|
22
|
+
}
|
|
23
|
+
if (isRecord(input)) {
|
|
24
|
+
const id = input.id;
|
|
25
|
+
if (typeof id === "string" && id.length > 0) return id;
|
|
26
|
+
const tag = input.tag;
|
|
27
|
+
if (tag && (typeof tag === "object" || typeof tag === "function")) {
|
|
28
|
+
const tagId = tag.id;
|
|
29
|
+
if (typeof tagId === "string" && tagId.length > 0) return tagId;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return "unknown";
|
|
33
|
+
};
|
|
34
|
+
var resolveModuleTag = (input) => {
|
|
35
|
+
if (isModuleImpl(input)) return input.module;
|
|
36
|
+
if (isRecord(input) && input.tag) return input.tag;
|
|
37
|
+
return void 0;
|
|
38
|
+
};
|
|
39
|
+
var exportStaticIr2 = (module) => {
|
|
40
|
+
const tag = resolveModuleTag(module);
|
|
41
|
+
if (!tag) return void 0;
|
|
42
|
+
const program = getModuleTraitsProgram(tag);
|
|
43
|
+
if (!program) return void 0;
|
|
44
|
+
return exportStaticIr({
|
|
45
|
+
program,
|
|
46
|
+
moduleId: resolveModuleId(module)
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// ../logix-core/src/internal/reflection/manifest.ts
|
|
51
|
+
var isRecord2 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
52
|
+
var isModuleImpl2 = (value) => isRecord2(value) && value._tag === "ModuleImpl" && isRecord2(value.module);
|
|
53
|
+
var resolveModuleId2 = (input) => {
|
|
54
|
+
if (isModuleImpl2(input)) {
|
|
55
|
+
const id = input.module.id;
|
|
56
|
+
return typeof id === "string" && id.length > 0 ? id : "unknown";
|
|
57
|
+
}
|
|
58
|
+
if (isRecord2(input)) {
|
|
59
|
+
const id = input.id;
|
|
60
|
+
if (typeof id === "string" && id.length > 0) return id;
|
|
61
|
+
const tag = input.tag;
|
|
62
|
+
if (tag && (typeof tag === "object" || typeof tag === "function")) {
|
|
63
|
+
const tagId = tag.id;
|
|
64
|
+
if (typeof tagId === "string" && tagId.length > 0) return tagId;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return "unknown";
|
|
68
|
+
};
|
|
69
|
+
var resolveActionKeys = (input) => {
|
|
70
|
+
const tag = isModuleImpl2(input) ? input.module : input?.tag;
|
|
71
|
+
const actionMap = tag?.shape?.actionMap;
|
|
72
|
+
if (!isRecord2(actionMap)) return [];
|
|
73
|
+
return Object.keys(actionMap).sort();
|
|
74
|
+
};
|
|
75
|
+
var resolveSchemaKeys = (input) => {
|
|
76
|
+
if (!isRecord2(input)) return void 0;
|
|
77
|
+
const schemas = input.schemas;
|
|
78
|
+
if (!isRecord2(schemas)) return void 0;
|
|
79
|
+
return Object.keys(schemas).sort();
|
|
80
|
+
};
|
|
81
|
+
var resolveSource = (input) => {
|
|
82
|
+
if (!isRecord2(input)) return void 0;
|
|
83
|
+
const dev = input.dev;
|
|
84
|
+
const source = dev?.source;
|
|
85
|
+
if (!isRecord2(source)) return void 0;
|
|
86
|
+
const file = source.file;
|
|
87
|
+
const line = source.line;
|
|
88
|
+
const column = source.column;
|
|
89
|
+
if (typeof file !== "string" || file.length === 0) return void 0;
|
|
90
|
+
if (typeof line !== "number" || !Number.isInteger(line) || line < 1) return void 0;
|
|
91
|
+
if (typeof column !== "number" || !Number.isInteger(column) || column < 1) return void 0;
|
|
92
|
+
return { file, line, column };
|
|
93
|
+
};
|
|
94
|
+
var resolveMeta = (input) => {
|
|
95
|
+
if (!isRecord2(input)) return void 0;
|
|
96
|
+
const meta = input.meta;
|
|
97
|
+
if (!isRecord2(meta)) return void 0;
|
|
98
|
+
const out = {};
|
|
99
|
+
for (const key of Object.keys(meta).sort()) {
|
|
100
|
+
const value = meta[key];
|
|
101
|
+
if (isJsonValue(value)) {
|
|
102
|
+
out[key] = value;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return Object.keys(out).length > 0 ? out : void 0;
|
|
106
|
+
};
|
|
107
|
+
var MODULE_INTERNAL = /* @__PURE__ */ Symbol.for("logix.module.internal");
|
|
108
|
+
var resolveLogicUnits = (input) => {
|
|
109
|
+
if (!isRecord2(input)) return void 0;
|
|
110
|
+
const internal = input[MODULE_INTERNAL];
|
|
111
|
+
const mounted = internal?.mounted;
|
|
112
|
+
if (!Array.isArray(mounted)) return void 0;
|
|
113
|
+
const out = [];
|
|
114
|
+
for (const unit of mounted) {
|
|
115
|
+
if (!isRecord2(unit)) continue;
|
|
116
|
+
const kind = unit.kind;
|
|
117
|
+
const id = unit.id;
|
|
118
|
+
if (typeof kind !== "string" || kind.length === 0) continue;
|
|
119
|
+
if (typeof id !== "string" || id.length === 0) continue;
|
|
120
|
+
const derived = unit.derived === true ? true : void 0;
|
|
121
|
+
const name = typeof unit.name === "string" ? unit.name : void 0;
|
|
122
|
+
out.push({ kind, id, derived, name });
|
|
123
|
+
}
|
|
124
|
+
out.sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : a.kind.localeCompare(b.kind));
|
|
125
|
+
return out.length > 0 ? out : void 0;
|
|
126
|
+
};
|
|
127
|
+
var digestOf = (base) => `manifest:025:${fnv1a32(stableStringify(base))}`;
|
|
128
|
+
var utf8ByteLength = (value) => {
|
|
129
|
+
const json = JSON.stringify(value);
|
|
130
|
+
if (typeof TextEncoder !== "undefined") {
|
|
131
|
+
return new TextEncoder().encode(json).length;
|
|
132
|
+
}
|
|
133
|
+
return json.length;
|
|
134
|
+
};
|
|
135
|
+
var applyMaxBytes = (manifest, maxBytes) => {
|
|
136
|
+
const originalBytes = utf8ByteLength(manifest);
|
|
137
|
+
if (originalBytes <= maxBytes) return manifest;
|
|
138
|
+
const dropped = [];
|
|
139
|
+
const truncatedArrays = [];
|
|
140
|
+
const baseMarker = () => ({
|
|
141
|
+
truncated: true,
|
|
142
|
+
maxBytes,
|
|
143
|
+
originalBytes,
|
|
144
|
+
dropped,
|
|
145
|
+
truncatedArrays
|
|
146
|
+
});
|
|
147
|
+
const withMarker = (next2) => {
|
|
148
|
+
const meta = {
|
|
149
|
+
__logix: baseMarker()
|
|
150
|
+
};
|
|
151
|
+
return { ...next2, meta };
|
|
152
|
+
};
|
|
153
|
+
let next = withMarker(manifest);
|
|
154
|
+
const dropField = (field) => {
|
|
155
|
+
if (next[field] !== void 0) {
|
|
156
|
+
dropped.push(String(field));
|
|
157
|
+
next = withMarker({ ...next, [field]: void 0 });
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
dropField("meta");
|
|
161
|
+
if (utf8ByteLength(next) <= maxBytes) return next;
|
|
162
|
+
dropField("source");
|
|
163
|
+
if (utf8ByteLength(next) <= maxBytes) return next;
|
|
164
|
+
dropField("staticIr");
|
|
165
|
+
if (utf8ByteLength(next) <= maxBytes) return next;
|
|
166
|
+
dropField("logicUnits");
|
|
167
|
+
if (utf8ByteLength(next) <= maxBytes) return next;
|
|
168
|
+
dropField("schemaKeys");
|
|
169
|
+
if (utf8ByteLength(next) <= maxBytes) return next;
|
|
170
|
+
while (utf8ByteLength(next) > maxBytes && next.actionKeys.length > 1) {
|
|
171
|
+
truncatedArrays.push("actionKeys");
|
|
172
|
+
next = withMarker({
|
|
173
|
+
...next,
|
|
174
|
+
actionKeys: next.actionKeys.slice(0, Math.ceil(next.actionKeys.length / 2))
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
return next;
|
|
178
|
+
};
|
|
179
|
+
var extractManifest = (module, options) => {
|
|
180
|
+
const manifestVersion = "025";
|
|
181
|
+
const moduleId = resolveModuleId2(module);
|
|
182
|
+
const actionKeys = resolveActionKeys(module);
|
|
183
|
+
const schemaKeys = resolveSchemaKeys(module);
|
|
184
|
+
const logicUnits = resolveLogicUnits(module);
|
|
185
|
+
const source = resolveSource(module);
|
|
186
|
+
const meta = resolveMeta(module);
|
|
187
|
+
const staticIr = options?.includeStaticIr ? exportStaticIr2(module) : void 0;
|
|
188
|
+
const digestBase = {
|
|
189
|
+
manifestVersion,
|
|
190
|
+
moduleId,
|
|
191
|
+
actionKeys,
|
|
192
|
+
schemaKeys,
|
|
193
|
+
logicUnits,
|
|
194
|
+
staticIrDigest: staticIr?.digest
|
|
195
|
+
};
|
|
196
|
+
const digest = digestOf(digestBase);
|
|
197
|
+
const manifest = {
|
|
198
|
+
manifestVersion,
|
|
199
|
+
moduleId,
|
|
200
|
+
actionKeys,
|
|
201
|
+
schemaKeys,
|
|
202
|
+
logicUnits,
|
|
203
|
+
source,
|
|
204
|
+
meta,
|
|
205
|
+
staticIr,
|
|
206
|
+
digest
|
|
207
|
+
};
|
|
208
|
+
const maxBytes = options?.budgets?.maxBytes;
|
|
209
|
+
if (typeof maxBytes === "number" && Number.isFinite(maxBytes) && maxBytes > 0) {
|
|
210
|
+
return applyMaxBytes(manifest, maxBytes);
|
|
211
|
+
}
|
|
212
|
+
return manifest;
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
// ../logix-core/src/internal/reflection/diff.ts
|
|
216
|
+
var SEVERITY_RANK = {
|
|
217
|
+
BREAKING: 0,
|
|
218
|
+
RISKY: 1,
|
|
219
|
+
INFO: 2
|
|
220
|
+
};
|
|
221
|
+
var uniqSorted = (input) => {
|
|
222
|
+
const out = Array.from(new Set(input.filter((x) => typeof x === "string" && x.length > 0)));
|
|
223
|
+
out.sort((a, b) => a.localeCompare(b));
|
|
224
|
+
return out;
|
|
225
|
+
};
|
|
226
|
+
var diffStringKeys = (before, after) => {
|
|
227
|
+
const beforeSet = new Set(uniqSorted(before ?? []));
|
|
228
|
+
const afterSet = new Set(uniqSorted(after ?? []));
|
|
229
|
+
const removed = [];
|
|
230
|
+
for (const k of beforeSet) {
|
|
231
|
+
if (!afterSet.has(k)) removed.push(k);
|
|
232
|
+
}
|
|
233
|
+
removed.sort((a, b) => a.localeCompare(b));
|
|
234
|
+
const added = [];
|
|
235
|
+
for (const k of afterSet) {
|
|
236
|
+
if (!beforeSet.has(k)) added.push(k);
|
|
237
|
+
}
|
|
238
|
+
added.sort((a, b) => a.localeCompare(b));
|
|
239
|
+
return { removed, added };
|
|
240
|
+
};
|
|
241
|
+
var eqJsonValue = (a, b) => stableStringify(a) === stableStringify(b);
|
|
242
|
+
var indexLogicUnits = (input) => {
|
|
243
|
+
const map = /* @__PURE__ */ new Map();
|
|
244
|
+
for (const unit of input ?? []) {
|
|
245
|
+
if (!unit || typeof unit !== "object") continue;
|
|
246
|
+
const id = unit.id;
|
|
247
|
+
if (typeof id !== "string" || id.length === 0) continue;
|
|
248
|
+
map.set(id, unit);
|
|
249
|
+
}
|
|
250
|
+
return map;
|
|
251
|
+
};
|
|
252
|
+
var diffManifest = (before, after, options) => {
|
|
253
|
+
const changes = [];
|
|
254
|
+
if (before.moduleId !== after.moduleId) {
|
|
255
|
+
changes.push({
|
|
256
|
+
severity: "BREAKING",
|
|
257
|
+
code: "moduleId.changed",
|
|
258
|
+
message: `moduleId changed (${before.moduleId} -> ${after.moduleId})`,
|
|
259
|
+
pointer: "/moduleId",
|
|
260
|
+
details: {
|
|
261
|
+
before: before.moduleId,
|
|
262
|
+
after: after.moduleId
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
if (before.manifestVersion !== after.manifestVersion) {
|
|
267
|
+
changes.push({
|
|
268
|
+
severity: "INFO",
|
|
269
|
+
code: "manifestVersion.changed",
|
|
270
|
+
message: `manifestVersion changed (${before.manifestVersion} -> ${after.manifestVersion})`,
|
|
271
|
+
pointer: "/manifestVersion",
|
|
272
|
+
details: {
|
|
273
|
+
before: before.manifestVersion,
|
|
274
|
+
after: after.manifestVersion
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
{
|
|
279
|
+
const { removed, added } = diffStringKeys(before.actionKeys, after.actionKeys);
|
|
280
|
+
if (removed.length > 0 || added.length > 0) {
|
|
281
|
+
changes.push({
|
|
282
|
+
severity: removed.length > 0 ? "BREAKING" : "INFO",
|
|
283
|
+
code: "actionKeys.changed",
|
|
284
|
+
message: removed.length > 0 ? `actionKeys removed: ${removed.join(", ")}` : `actionKeys added: ${added.join(", ")}`,
|
|
285
|
+
pointer: "/actionKeys",
|
|
286
|
+
details: { removed, added }
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
{
|
|
291
|
+
const { removed, added } = diffStringKeys(before.schemaKeys, after.schemaKeys);
|
|
292
|
+
if (removed.length > 0 || added.length > 0) {
|
|
293
|
+
changes.push({
|
|
294
|
+
severity: removed.length > 0 ? "BREAKING" : "INFO",
|
|
295
|
+
code: "schemaKeys.changed",
|
|
296
|
+
message: removed.length > 0 ? `schemaKeys removed: ${removed.join(", ")}` : `schemaKeys added: ${added.join(", ")}`,
|
|
297
|
+
pointer: "/schemaKeys",
|
|
298
|
+
details: { removed, added }
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
{
|
|
303
|
+
const beforeById = indexLogicUnits(before.logicUnits);
|
|
304
|
+
const afterById = indexLogicUnits(after.logicUnits);
|
|
305
|
+
const removed = [];
|
|
306
|
+
const added = [];
|
|
307
|
+
const kindChanged = [];
|
|
308
|
+
const riskyChanged = [];
|
|
309
|
+
for (const id of beforeById.keys()) {
|
|
310
|
+
if (!afterById.has(id)) removed.push(id);
|
|
311
|
+
}
|
|
312
|
+
for (const id of afterById.keys()) {
|
|
313
|
+
if (!beforeById.has(id)) added.push(id);
|
|
314
|
+
}
|
|
315
|
+
removed.sort((a, b) => a.localeCompare(b));
|
|
316
|
+
added.sort((a, b) => a.localeCompare(b));
|
|
317
|
+
for (const id of beforeById.keys()) {
|
|
318
|
+
const b = beforeById.get(id);
|
|
319
|
+
const a = afterById.get(id);
|
|
320
|
+
if (!b || !a) continue;
|
|
321
|
+
const fields = [];
|
|
322
|
+
if (b.kind !== a.kind) {
|
|
323
|
+
kindChanged.push({ id, before: b.kind, after: a.kind });
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
326
|
+
if (b.name !== a.name) fields.push("name");
|
|
327
|
+
if (b.derived !== a.derived) fields.push("derived");
|
|
328
|
+
if (fields.length > 0) riskyChanged.push({ id, fields });
|
|
329
|
+
}
|
|
330
|
+
kindChanged.sort((x, y) => x.id.localeCompare(y.id));
|
|
331
|
+
riskyChanged.sort((x, y) => x.id.localeCompare(y.id));
|
|
332
|
+
if (removed.length > 0) {
|
|
333
|
+
changes.push({
|
|
334
|
+
severity: "BREAKING",
|
|
335
|
+
code: "logicUnits.removed",
|
|
336
|
+
message: `logicUnits removed: ${removed.join(", ")}`,
|
|
337
|
+
pointer: "/logicUnits",
|
|
338
|
+
details: { removed }
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
if (kindChanged.length > 0) {
|
|
342
|
+
changes.push({
|
|
343
|
+
severity: "BREAKING",
|
|
344
|
+
code: "logicUnits.kindChanged",
|
|
345
|
+
message: `logicUnits kind changed: ${kindChanged.map((x) => x.id).join(", ")}`,
|
|
346
|
+
pointer: "/logicUnits",
|
|
347
|
+
details: { kindChanged }
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
if (added.length > 0) {
|
|
351
|
+
changes.push({
|
|
352
|
+
severity: "INFO",
|
|
353
|
+
code: "logicUnits.added",
|
|
354
|
+
message: `logicUnits added: ${added.join(", ")}`,
|
|
355
|
+
pointer: "/logicUnits",
|
|
356
|
+
details: { added }
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
if (riskyChanged.length > 0) {
|
|
360
|
+
changes.push({
|
|
361
|
+
severity: "RISKY",
|
|
362
|
+
code: "logicUnits.changed",
|
|
363
|
+
message: `logicUnits changed: ${riskyChanged.map((x) => x.id).join(", ")}`,
|
|
364
|
+
pointer: "/logicUnits",
|
|
365
|
+
details: { changed: riskyChanged }
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
{
|
|
370
|
+
const beforeDigest = before.staticIr?.digest;
|
|
371
|
+
const afterDigest = after.staticIr?.digest;
|
|
372
|
+
if (beforeDigest !== afterDigest) {
|
|
373
|
+
changes.push({
|
|
374
|
+
severity: "RISKY",
|
|
375
|
+
code: "staticIr.digestChanged",
|
|
376
|
+
message: "staticIr.digest changed",
|
|
377
|
+
pointer: "/staticIr/digest",
|
|
378
|
+
details: {
|
|
379
|
+
before: beforeDigest ?? null,
|
|
380
|
+
after: afterDigest ?? null
|
|
381
|
+
}
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
{
|
|
386
|
+
const metaBefore = before.meta ?? {};
|
|
387
|
+
const metaAfter = after.meta ?? {};
|
|
388
|
+
const allowlist = options?.metaAllowlist;
|
|
389
|
+
const keys = allowlist != null ? uniqSorted(allowlist) : uniqSorted([...Object.keys(metaBefore), ...Object.keys(metaAfter)]);
|
|
390
|
+
const changed = [];
|
|
391
|
+
for (const key of keys) {
|
|
392
|
+
const b = key in metaBefore ? metaBefore[key] : void 0;
|
|
393
|
+
const a = key in metaAfter ? metaAfter[key] : void 0;
|
|
394
|
+
if (!eqJsonValue(b, a)) {
|
|
395
|
+
changed.push({
|
|
396
|
+
key,
|
|
397
|
+
before: b ?? null,
|
|
398
|
+
after: a ?? null
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
if (changed.length > 0) {
|
|
403
|
+
changes.push({
|
|
404
|
+
severity: "RISKY",
|
|
405
|
+
code: "meta.changed",
|
|
406
|
+
message: "meta changed",
|
|
407
|
+
pointer: "/meta",
|
|
408
|
+
details: {
|
|
409
|
+
keys: changed.map((x) => x.key),
|
|
410
|
+
changed
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
{
|
|
416
|
+
const b = before.source;
|
|
417
|
+
const a = after.source;
|
|
418
|
+
if (!eqJsonValue(b ?? null, a ?? null)) {
|
|
419
|
+
changes.push({
|
|
420
|
+
severity: "INFO",
|
|
421
|
+
code: "source.changed",
|
|
422
|
+
message: "source changed",
|
|
423
|
+
pointer: "/source",
|
|
424
|
+
details: {
|
|
425
|
+
before: b ?? null,
|
|
426
|
+
after: a ?? null
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
changes.sort((a, b) => {
|
|
432
|
+
const ra = SEVERITY_RANK[a.severity];
|
|
433
|
+
const rb = SEVERITY_RANK[b.severity];
|
|
434
|
+
if (ra !== rb) return ra - rb;
|
|
435
|
+
const ca = a.code.localeCompare(b.code);
|
|
436
|
+
if (ca !== 0) return ca;
|
|
437
|
+
const pa = a.pointer ?? "";
|
|
438
|
+
const pb = b.pointer ?? "";
|
|
439
|
+
return pa.localeCompare(pb);
|
|
440
|
+
});
|
|
441
|
+
const summary = {
|
|
442
|
+
breaking: changes.filter((c) => c.severity === "BREAKING").length,
|
|
443
|
+
risky: changes.filter((c) => c.severity === "RISKY").length,
|
|
444
|
+
info: changes.filter((c) => c.severity === "INFO").length
|
|
445
|
+
};
|
|
446
|
+
const verdict = summary.breaking > 0 ? "FAIL" : summary.risky > 0 ? "WARN" : "PASS";
|
|
447
|
+
return {
|
|
448
|
+
version: "025",
|
|
449
|
+
moduleId: after.moduleId,
|
|
450
|
+
before: {
|
|
451
|
+
digest: before.digest,
|
|
452
|
+
manifestVersion: before.manifestVersion
|
|
453
|
+
},
|
|
454
|
+
after: {
|
|
455
|
+
digest: after.digest,
|
|
456
|
+
manifestVersion: after.manifestVersion
|
|
457
|
+
},
|
|
458
|
+
verdict,
|
|
459
|
+
changes,
|
|
460
|
+
summary
|
|
461
|
+
};
|
|
462
|
+
};
|
|
463
|
+
|
|
464
|
+
// ../logix-core/src/Reflection.ts
|
|
465
|
+
var extractManifest2 = (module, options) => extractManifest(module, options);
|
|
466
|
+
var diffManifest2 = (before, after, options) => diffManifest(before, after, options);
|
|
467
|
+
var exportStaticIr3 = (module) => exportStaticIr2(module);
|
|
468
|
+
|
|
469
|
+
export {
|
|
470
|
+
extractManifest2 as extractManifest,
|
|
471
|
+
diffManifest2 as diffManifest,
|
|
472
|
+
exportStaticIr3 as exportStaticIr
|
|
473
|
+
};
|
|
474
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcmVmbGVjdGlvbi9zdGF0aWNJci50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9yZWZsZWN0aW9uL21hbmlmZXN0LnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3JlZmxlY3Rpb24vZGlmZi50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9SZWZsZWN0aW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IEFueU1vZHVsZVNoYXBlLCBNb2R1bGVJbXBsIH0gZnJvbSBcIi4uL3J1bnRpbWUvY29yZS9tb2R1bGUuanNcIlxuaW1wb3J0IHsgZ2V0TW9kdWxlVHJhaXRzUHJvZ3JhbSB9IGZyb20gXCIuLi9ydW50aW1lL2NvcmUvcnVudGltZUludGVybmFsc0FjY2Vzc29yLmpzXCJcbmltcG9ydCB0eXBlIHsgU3RhdGljSXIgfSBmcm9tIFwiLi4vc3RhdGUtdHJhaXQvaXIuanNcIlxuaW1wb3J0IHR5cGUgeyBTdGF0ZVRyYWl0UHJvZ3JhbSB9IGZyb20gXCIuLi9zdGF0ZS10cmFpdC9tb2RlbC5qc1wiXG5pbXBvcnQgeyBleHBvcnRTdGF0aWNJciBhcyBleHBvcnRTdGF0ZVRyYWl0U3RhdGljSXIgfSBmcm9tIFwiLi4vc3RhdGUtdHJhaXQvaXIuanNcIlxuXG5jb25zdCBpc1JlY29yZCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcblxuY29uc3QgaXNNb2R1bGVJbXBsID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgTW9kdWxlSW1wbDxhbnksIEFueU1vZHVsZVNoYXBlLCBhbnk+ID0+XG4gIGlzUmVjb3JkKHZhbHVlKSAmJiB2YWx1ZS5fdGFnID09PSBcIk1vZHVsZUltcGxcIiAmJiBpc1JlY29yZCh2YWx1ZS5tb2R1bGUpXG5cbmNvbnN0IHJlc29sdmVNb2R1bGVJZCA9IChpbnB1dDogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmIChpc01vZHVsZUltcGwoaW5wdXQpKSB7XG4gICAgY29uc3QgaWQgPSAoaW5wdXQubW9kdWxlIGFzIGFueSkuaWRcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSBcInN0cmluZ1wiICYmIGlkLmxlbmd0aCA+IDAgPyBpZCA6IFwidW5rbm93blwiXG4gIH1cblxuICBpZiAoaXNSZWNvcmQoaW5wdXQpKSB7XG4gICAgY29uc3QgaWQgPSBpbnB1dC5pZFxuICAgIGlmICh0eXBlb2YgaWQgPT09IFwic3RyaW5nXCIgJiYgaWQubGVuZ3RoID4gMCkgcmV0dXJuIGlkXG4gICAgY29uc3QgdGFnID0gKGlucHV0IGFzIGFueSkudGFnXG4gICAgaWYgKHRhZyAmJiAodHlwZW9mIHRhZyA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgdGFnID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgICBjb25zdCB0YWdJZCA9ICh0YWcgYXMgYW55KS5pZFxuICAgICAgaWYgKHR5cGVvZiB0YWdJZCA9PT0gXCJzdHJpbmdcIiAmJiB0YWdJZC5sZW5ndGggPiAwKSByZXR1cm4gdGFnSWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gXCJ1bmtub3duXCJcbn1cblxuY29uc3QgcmVzb2x2ZU1vZHVsZVRhZyA9IChpbnB1dDogdW5rbm93bik6IHVua25vd24gPT4ge1xuICBpZiAoaXNNb2R1bGVJbXBsKGlucHV0KSkgcmV0dXJuIGlucHV0Lm1vZHVsZVxuICBpZiAoaXNSZWNvcmQoaW5wdXQpICYmIChpbnB1dCBhcyBhbnkpLnRhZykgcmV0dXJuIChpbnB1dCBhcyBhbnkpLnRhZ1xuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjb25zdCBleHBvcnRTdGF0aWNJciA9IChtb2R1bGU6IHVua25vd24pOiBTdGF0aWNJciB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHRhZyA9IHJlc29sdmVNb2R1bGVUYWcobW9kdWxlKVxuICBpZiAoIXRhZykgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IHByb2dyYW0gPSBnZXRNb2R1bGVUcmFpdHNQcm9ncmFtKHRhZykgYXMgU3RhdGVUcmFpdFByb2dyYW08YW55PiB8IHVuZGVmaW5lZFxuICBpZiAoIXByb2dyYW0pIHJldHVybiB1bmRlZmluZWRcblxuICByZXR1cm4gZXhwb3J0U3RhdGVUcmFpdFN0YXRpY0lyKHtcbiAgICBwcm9ncmFtLFxuICAgIG1vZHVsZUlkOiByZXNvbHZlTW9kdWxlSWQobW9kdWxlKSxcbiAgfSlcbn1cblxuIiwgImltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZUltcGwgfSBmcm9tIFwiLi4vcnVudGltZS9jb3JlL21vZHVsZS5qc1wiXG5pbXBvcnQgeyBzdGFibGVTdHJpbmdpZnksIGZudjFhMzIgfSBmcm9tIFwiLi4vZGlnZXN0LmpzXCJcbmltcG9ydCB7IGlzSnNvblZhbHVlLCB0eXBlIEpzb25WYWx1ZSB9IGZyb20gXCIuLi9vYnNlcnZhYmlsaXR5L2pzb25WYWx1ZS5qc1wiXG5pbXBvcnQgeyBleHBvcnRTdGF0aWNJciB9IGZyb20gXCIuL3N0YXRpY0lyLmpzXCJcblxuZXhwb3J0IGludGVyZmFjZSBNYW5pZmVzdEJ1ZGdldHMge1xuICByZWFkb25seSBtYXhCeXRlcz86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RNYW5pZmVzdE9wdGlvbnMge1xuICByZWFkb25seSBpbmNsdWRlU3RhdGljSXI/OiBib29sZWFuXG4gIHJlYWRvbmx5IGJ1ZGdldHM/OiBNYW5pZmVzdEJ1ZGdldHNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdCB7XG4gIHJlYWRvbmx5IGtpbmQ6IHN0cmluZ1xuICByZWFkb25seSBpZDogc3RyaW5nXG4gIHJlYWRvbmx5IGRlcml2ZWQ/OiBib29sZWFuXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVNYW5pZmVzdCB7XG4gIHJlYWRvbmx5IG1hbmlmZXN0VmVyc2lvbjogc3RyaW5nXG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgYWN0aW9uS2V5czogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gIHJlYWRvbmx5IHNjaGVtYUtleXM/OiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgcmVhZG9ubHkgbG9naWNVbml0cz86IFJlYWRvbmx5QXJyYXk8TW9kdWxlTWFuaWZlc3RMb2dpY1VuaXQ+XG4gIHJlYWRvbmx5IHNvdXJjZT86IHtcbiAgICByZWFkb25seSBmaWxlOiBzdHJpbmdcbiAgICByZWFkb25seSBsaW5lOiBudW1iZXJcbiAgICByZWFkb25seSBjb2x1bW46IG51bWJlclxuICB9XG4gIHJlYWRvbmx5IG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+XG4gIHJlYWRvbmx5IHN0YXRpY0lyPzogUmV0dXJuVHlwZTx0eXBlb2YgZXhwb3J0U3RhdGljSXI+XG4gIHJlYWRvbmx5IGRpZ2VzdDogc3RyaW5nXG59XG5cbmNvbnN0IGlzUmVjb3JkID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5jb25zdCBpc01vZHVsZUltcGwgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4gPT5cbiAgaXNSZWNvcmQodmFsdWUpICYmIHZhbHVlLl90YWcgPT09IFwiTW9kdWxlSW1wbFwiICYmIGlzUmVjb3JkKHZhbHVlLm1vZHVsZSlcblxuY29uc3QgcmVzb2x2ZU1vZHVsZUlkID0gKGlucHV0OiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKGlzTW9kdWxlSW1wbChpbnB1dCkpIHtcbiAgICBjb25zdCBpZCA9IChpbnB1dC5tb2R1bGUgYXMgYW55KS5pZFxuICAgIHJldHVybiB0eXBlb2YgaWQgPT09IFwic3RyaW5nXCIgJiYgaWQubGVuZ3RoID4gMCA/IGlkIDogXCJ1bmtub3duXCJcbiAgfVxuXG4gIGlmIChpc1JlY29yZChpbnB1dCkpIHtcbiAgICBjb25zdCBpZCA9IGlucHV0LmlkXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIiAmJiBpZC5sZW5ndGggPiAwKSByZXR1cm4gaWRcbiAgICBjb25zdCB0YWcgPSAoaW5wdXQgYXMgYW55KS50YWdcbiAgICBpZiAodGFnICYmICh0eXBlb2YgdGFnID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB0YWcgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICAgIGNvbnN0IHRhZ0lkID0gKHRhZyBhcyBhbnkpLmlkXG4gICAgICBpZiAodHlwZW9mIHRhZ0lkID09PSBcInN0cmluZ1wiICYmIHRhZ0lkLmxlbmd0aCA+IDApIHJldHVybiB0YWdJZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBcInVua25vd25cIlxufVxuXG5jb25zdCByZXNvbHZlQWN0aW9uS2V5cyA9IChpbnB1dDogdW5rbm93bik6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IHRhZyA9IGlzTW9kdWxlSW1wbChpbnB1dCkgPyAoaW5wdXQubW9kdWxlIGFzIGFueSkgOiAoaW5wdXQgYXMgYW55KT8udGFnXG4gIGNvbnN0IGFjdGlvbk1hcCA9IHRhZz8uc2hhcGU/LmFjdGlvbk1hcFxuICBpZiAoIWlzUmVjb3JkKGFjdGlvbk1hcCkpIHJldHVybiBbXVxuICByZXR1cm4gT2JqZWN0LmtleXMoYWN0aW9uTWFwKS5zb3J0KClcbn1cblxuY29uc3QgcmVzb2x2ZVNjaGVtYUtleXMgPSAoaW5wdXQ6IHVua25vd24pOiBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzUmVjb3JkKGlucHV0KSkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBzY2hlbWFzID0gKGlucHV0IGFzIGFueSkuc2NoZW1hc1xuICBpZiAoIWlzUmVjb3JkKHNjaGVtYXMpKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiBPYmplY3Qua2V5cyhzY2hlbWFzKS5zb3J0KClcbn1cblxuY29uc3QgcmVzb2x2ZVNvdXJjZSA9IChpbnB1dDogdW5rbm93bik6IE1vZHVsZU1hbmlmZXN0W1wic291cmNlXCJdIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgZGV2ID0gKGlucHV0IGFzIGFueSkuZGV2XG4gIGNvbnN0IHNvdXJjZSA9IGRldj8uc291cmNlXG4gIGlmICghaXNSZWNvcmQoc291cmNlKSkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBmaWxlID0gc291cmNlLmZpbGVcbiAgY29uc3QgbGluZSA9IHNvdXJjZS5saW5lXG4gIGNvbnN0IGNvbHVtbiA9IHNvdXJjZS5jb2x1bW5cbiAgaWYgKHR5cGVvZiBmaWxlICE9PSBcInN0cmluZ1wiIHx8IGZpbGUubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkXG4gIGlmICh0eXBlb2YgbGluZSAhPT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzSW50ZWdlcihsaW5lKSB8fCBsaW5lIDwgMSkgcmV0dXJuIHVuZGVmaW5lZFxuICBpZiAodHlwZW9mIGNvbHVtbiAhPT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzSW50ZWdlcihjb2x1bW4pIHx8IGNvbHVtbiA8IDEpIHJldHVybiB1bmRlZmluZWRcbiAgcmV0dXJuIHsgZmlsZSwgbGluZSwgY29sdW1uIH1cbn1cblxuY29uc3QgcmVzb2x2ZU1ldGEgPSAoaW5wdXQ6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgbWV0YSA9IChpbnB1dCBhcyBhbnkpLm1ldGFcbiAgaWYgKCFpc1JlY29yZChtZXRhKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgSnNvblZhbHVlPiA9IHt9XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG1ldGEpLnNvcnQoKSkge1xuICAgIGNvbnN0IHZhbHVlID0gbWV0YVtrZXldXG4gICAgaWYgKGlzSnNvblZhbHVlKHZhbHVlKSkge1xuICAgICAgb3V0W2tleV0gPSB2YWx1ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gT2JqZWN0LmtleXMob3V0KS5sZW5ndGggPiAwID8gb3V0IDogdW5kZWZpbmVkXG59XG5cbmNvbnN0IE1PRFVMRV9JTlRFUk5BTCA9IFN5bWJvbC5mb3IoXCJsb2dpeC5tb2R1bGUuaW50ZXJuYWxcIilcblxuY29uc3QgcmVzb2x2ZUxvZ2ljVW5pdHMgPSAoXG4gIGlucHV0OiB1bmtub3duLFxuKTogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdD4gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzUmVjb3JkKGlucHV0KSkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBpbnRlcm5hbCA9IChpbnB1dCBhcyBhbnkpW01PRFVMRV9JTlRFUk5BTF1cbiAgY29uc3QgbW91bnRlZCA9IGludGVybmFsPy5tb3VudGVkXG4gIGlmICghQXJyYXkuaXNBcnJheShtb3VudGVkKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IG91dDogQXJyYXk8TW9kdWxlTWFuaWZlc3RMb2dpY1VuaXQ+ID0gW11cbiAgZm9yIChjb25zdCB1bml0IG9mIG1vdW50ZWQpIHtcbiAgICBpZiAoIWlzUmVjb3JkKHVuaXQpKSBjb250aW51ZVxuICAgIGNvbnN0IGtpbmQgPSB1bml0LmtpbmRcbiAgICBjb25zdCBpZCA9IHVuaXQuaWRcbiAgICBpZiAodHlwZW9mIGtpbmQgIT09IFwic3RyaW5nXCIgfHwga2luZC5sZW5ndGggPT09IDApIGNvbnRpbnVlXG4gICAgaWYgKHR5cGVvZiBpZCAhPT0gXCJzdHJpbmdcIiB8fCBpZC5sZW5ndGggPT09IDApIGNvbnRpbnVlXG5cbiAgICBjb25zdCBkZXJpdmVkID0gdW5pdC5kZXJpdmVkID09PSB0cnVlID8gdHJ1ZSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgdW5pdC5uYW1lID09PSBcInN0cmluZ1wiID8gdW5pdC5uYW1lIDogdW5kZWZpbmVkXG4gICAgb3V0LnB1c2goeyBraW5kLCBpZCwgZGVyaXZlZCwgbmFtZSB9KVxuICB9XG5cbiAgb3V0LnNvcnQoKGEsIGIpID0+IChhLmlkIDwgYi5pZCA/IC0xIDogYS5pZCA+IGIuaWQgPyAxIDogYS5raW5kLmxvY2FsZUNvbXBhcmUoYi5raW5kKSkpXG4gIHJldHVybiBvdXQubGVuZ3RoID4gMCA/IG91dCA6IHVuZGVmaW5lZFxufVxuXG50eXBlIERpZ2VzdEJhc2UgPSB7XG4gIHJlYWRvbmx5IG1hbmlmZXN0VmVyc2lvbjogc3RyaW5nXG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgYWN0aW9uS2V5czogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gIHJlYWRvbmx5IHNjaGVtYUtleXM/OiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgcmVhZG9ubHkgbG9naWNVbml0cz86IFJlYWRvbmx5QXJyYXk8TW9kdWxlTWFuaWZlc3RMb2dpY1VuaXQ+XG4gIHJlYWRvbmx5IHN0YXRpY0lyRGlnZXN0Pzogc3RyaW5nXG59XG5cbmNvbnN0IGRpZ2VzdE9mID0gKGJhc2U6IERpZ2VzdEJhc2UpOiBzdHJpbmcgPT5cbiAgYG1hbmlmZXN0OjAyNToke2ZudjFhMzIoc3RhYmxlU3RyaW5naWZ5KGJhc2UpKX1gXG5cbmNvbnN0IHV0ZjhCeXRlTGVuZ3RoID0gKHZhbHVlOiB1bmtub3duKTogbnVtYmVyID0+IHtcbiAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICBpZiAodHlwZW9mIFRleHRFbmNvZGVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShqc29uKS5sZW5ndGhcbiAgfVxuICByZXR1cm4ganNvbi5sZW5ndGhcbn1cblxuY29uc3QgYXBwbHlNYXhCeXRlcyA9IChtYW5pZmVzdDogTW9kdWxlTWFuaWZlc3QsIG1heEJ5dGVzOiBudW1iZXIpOiBNb2R1bGVNYW5pZmVzdCA9PiB7XG4gIGNvbnN0IG9yaWdpbmFsQnl0ZXMgPSB1dGY4Qnl0ZUxlbmd0aChtYW5pZmVzdClcbiAgaWYgKG9yaWdpbmFsQnl0ZXMgPD0gbWF4Qnl0ZXMpIHJldHVybiBtYW5pZmVzdFxuXG4gIGNvbnN0IGRyb3BwZWQ6IEFycmF5PHN0cmluZz4gPSBbXVxuICBjb25zdCB0cnVuY2F0ZWRBcnJheXM6IEFycmF5PHN0cmluZz4gPSBbXVxuXG4gIGNvbnN0IGJhc2VNYXJrZXIgPSAoKTogSnNvblZhbHVlID0+ICh7XG4gICAgdHJ1bmNhdGVkOiB0cnVlLFxuICAgIG1heEJ5dGVzLFxuICAgIG9yaWdpbmFsQnl0ZXMsXG4gICAgZHJvcHBlZCxcbiAgICB0cnVuY2F0ZWRBcnJheXMsXG4gIH0pXG5cbiAgY29uc3Qgd2l0aE1hcmtlciA9IChuZXh0OiBNb2R1bGVNYW5pZmVzdCk6IE1vZHVsZU1hbmlmZXN0ID0+IHtcbiAgICBjb25zdCBtZXRhOiBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+ID0ge1xuICAgICAgX19sb2dpeDogYmFzZU1hcmtlcigpLFxuICAgIH1cbiAgICByZXR1cm4geyAuLi5uZXh0LCBtZXRhIH1cbiAgfVxuXG4gIGxldCBuZXh0OiBNb2R1bGVNYW5pZmVzdCA9IHdpdGhNYXJrZXIobWFuaWZlc3QpXG5cbiAgY29uc3QgZHJvcEZpZWxkID0gKGZpZWxkOiBrZXlvZiBNb2R1bGVNYW5pZmVzdCk6IHZvaWQgPT4ge1xuICAgIGlmICgobmV4dCBhcyBhbnkpW2ZpZWxkXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkcm9wcGVkLnB1c2goU3RyaW5nKGZpZWxkKSlcbiAgICAgIG5leHQgPSB3aXRoTWFya2VyKHsgLi4uKG5leHQgYXMgYW55KSwgW2ZpZWxkXTogdW5kZWZpbmVkIH0pXG4gICAgfVxuICB9XG5cbiAgLy8gRGV0ZXJtaW5pc3RpYyB0cmltbWluZyBvcmRlciAobGVhc3QgdmFsdWFibGUgZmlyc3QpLlxuICBkcm9wRmllbGQoXCJtZXRhXCIpXG4gIGlmICh1dGY4Qnl0ZUxlbmd0aChuZXh0KSA8PSBtYXhCeXRlcykgcmV0dXJuIG5leHRcblxuICBkcm9wRmllbGQoXCJzb3VyY2VcIilcbiAgaWYgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpIDw9IG1heEJ5dGVzKSByZXR1cm4gbmV4dFxuXG4gIGRyb3BGaWVsZChcInN0YXRpY0lyXCIpXG4gIGlmICh1dGY4Qnl0ZUxlbmd0aChuZXh0KSA8PSBtYXhCeXRlcykgcmV0dXJuIG5leHRcblxuICBkcm9wRmllbGQoXCJsb2dpY1VuaXRzXCIpXG4gIGlmICh1dGY4Qnl0ZUxlbmd0aChuZXh0KSA8PSBtYXhCeXRlcykgcmV0dXJuIG5leHRcblxuICBkcm9wRmllbGQoXCJzY2hlbWFLZXlzXCIpXG4gIGlmICh1dGY4Qnl0ZUxlbmd0aChuZXh0KSA8PSBtYXhCeXRlcykgcmV0dXJuIG5leHRcblxuICAvLyBMYXN0IHJlc29ydDogdHJ1bmNhdGUgYWN0aW9uS2V5cyAoc3RpbGwgZGV0ZXJtaW5pc3RpYywgYnV0IHNpZ25hbHMgdHJ1bmNhdGlvbikuXG4gIHdoaWxlICh1dGY4Qnl0ZUxlbmd0aChuZXh0KSA+IG1heEJ5dGVzICYmIG5leHQuYWN0aW9uS2V5cy5sZW5ndGggPiAxKSB7XG4gICAgdHJ1bmNhdGVkQXJyYXlzLnB1c2goXCJhY3Rpb25LZXlzXCIpXG4gICAgbmV4dCA9IHdpdGhNYXJrZXIoe1xuICAgICAgLi4ubmV4dCxcbiAgICAgIGFjdGlvbktleXM6IG5leHQuYWN0aW9uS2V5cy5zbGljZSgwLCBNYXRoLmNlaWwobmV4dC5hY3Rpb25LZXlzLmxlbmd0aCAvIDIpKSxcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG5leHRcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RNYW5pZmVzdCA9IChcbiAgbW9kdWxlOiB1bmtub3duLFxuICBvcHRpb25zPzogRXh0cmFjdE1hbmlmZXN0T3B0aW9ucyxcbik6IE1vZHVsZU1hbmlmZXN0ID0+IHtcbiAgY29uc3QgbWFuaWZlc3RWZXJzaW9uID0gXCIwMjVcIlxuICBjb25zdCBtb2R1bGVJZCA9IHJlc29sdmVNb2R1bGVJZChtb2R1bGUpXG4gIGNvbnN0IGFjdGlvbktleXMgPSByZXNvbHZlQWN0aW9uS2V5cyhtb2R1bGUpXG5cbiAgY29uc3Qgc2NoZW1hS2V5cyA9IHJlc29sdmVTY2hlbWFLZXlzKG1vZHVsZSlcbiAgY29uc3QgbG9naWNVbml0cyA9IHJlc29sdmVMb2dpY1VuaXRzKG1vZHVsZSlcbiAgY29uc3Qgc291cmNlID0gcmVzb2x2ZVNvdXJjZShtb2R1bGUpXG4gIGNvbnN0IG1ldGEgPSByZXNvbHZlTWV0YShtb2R1bGUpXG5cbiAgY29uc3Qgc3RhdGljSXIgPSBvcHRpb25zPy5pbmNsdWRlU3RhdGljSXIgPyBleHBvcnRTdGF0aWNJcihtb2R1bGUpIDogdW5kZWZpbmVkXG5cbiAgY29uc3QgZGlnZXN0QmFzZTogRGlnZXN0QmFzZSA9IHtcbiAgICBtYW5pZmVzdFZlcnNpb24sXG4gICAgbW9kdWxlSWQsXG4gICAgYWN0aW9uS2V5cyxcbiAgICBzY2hlbWFLZXlzLFxuICAgIGxvZ2ljVW5pdHMsXG4gICAgc3RhdGljSXJEaWdlc3Q6IHN0YXRpY0lyPy5kaWdlc3QsXG4gIH1cblxuICBjb25zdCBkaWdlc3QgPSBkaWdlc3RPZihkaWdlc3RCYXNlKVxuXG4gIGNvbnN0IG1hbmlmZXN0OiBNb2R1bGVNYW5pZmVzdCA9IHtcbiAgICBtYW5pZmVzdFZlcnNpb24sXG4gICAgbW9kdWxlSWQsXG4gICAgYWN0aW9uS2V5cyxcbiAgICBzY2hlbWFLZXlzLFxuICAgIGxvZ2ljVW5pdHMsXG4gICAgc291cmNlLFxuICAgIG1ldGEsXG4gICAgc3RhdGljSXIsXG4gICAgZGlnZXN0LFxuICB9XG5cbiAgY29uc3QgbWF4Qnl0ZXMgPSBvcHRpb25zPy5idWRnZXRzPy5tYXhCeXRlc1xuICBpZiAodHlwZW9mIG1heEJ5dGVzID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZShtYXhCeXRlcykgJiYgbWF4Qnl0ZXMgPiAwKSB7XG4gICAgcmV0dXJuIGFwcGx5TWF4Qnl0ZXMobWFuaWZlc3QsIG1heEJ5dGVzKVxuICB9XG5cbiAgcmV0dXJuIG1hbmlmZXN0XG59XG4iLCAiaW1wb3J0IHsgc3RhYmxlU3RyaW5naWZ5IH0gZnJvbSBcIi4uL2RpZ2VzdC5qc1wiXG5pbXBvcnQgdHlwZSB7IEpzb25WYWx1ZSB9IGZyb20gXCIuLi9vYnNlcnZhYmlsaXR5L2pzb25WYWx1ZS5qc1wiXG5pbXBvcnQgdHlwZSB7IE1vZHVsZU1hbmlmZXN0LCBNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdCB9IGZyb20gXCIuL21hbmlmZXN0LmpzXCJcblxuZXhwb3J0IHR5cGUgTWFuaWZlc3REaWZmU2V2ZXJpdHkgPSBcIkJSRUFLSU5HXCIgfCBcIlJJU0tZXCIgfCBcIklORk9cIlxuZXhwb3J0IHR5cGUgTWFuaWZlc3REaWZmVmVyZGljdCA9IFwiUEFTU1wiIHwgXCJXQVJOXCIgfCBcIkZBSUxcIlxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0RGlmZkNoYW5nZSB7XG4gIHJlYWRvbmx5IHNldmVyaXR5OiBNYW5pZmVzdERpZmZTZXZlcml0eVxuICByZWFkb25seSBjb2RlOiBzdHJpbmdcbiAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZ1xuICByZWFkb25seSBwb2ludGVyPzogc3RyaW5nXG4gIHJlYWRvbmx5IGRldGFpbHM/OiBKc29uVmFsdWVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVNYW5pZmVzdERpZmZTdW1tYXJ5IHtcbiAgcmVhZG9ubHkgYnJlYWtpbmc6IG51bWJlclxuICByZWFkb25seSByaXNreTogbnVtYmVyXG4gIHJlYWRvbmx5IGluZm86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0RGlmZiB7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZ1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGJlZm9yZToge1xuICAgIHJlYWRvbmx5IGRpZ2VzdDogc3RyaW5nXG4gICAgcmVhZG9ubHkgbWFuaWZlc3RWZXJzaW9uPzogc3RyaW5nXG4gIH1cbiAgcmVhZG9ubHkgYWZ0ZXI6IHtcbiAgICByZWFkb25seSBkaWdlc3Q6IHN0cmluZ1xuICAgIHJlYWRvbmx5IG1hbmlmZXN0VmVyc2lvbj86IHN0cmluZ1xuICB9XG4gIHJlYWRvbmx5IHZlcmRpY3Q6IE1hbmlmZXN0RGlmZlZlcmRpY3RcbiAgcmVhZG9ubHkgY2hhbmdlczogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdERpZmZDaGFuZ2U+XG4gIHJlYWRvbmx5IHN1bW1hcnk6IE1vZHVsZU1hbmlmZXN0RGlmZlN1bW1hcnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaWZmTWFuaWZlc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIG1ldGFBbGxvd2xpc3RcdUZGMUFcbiAgICogLSBcdTRFMERcdTYzRDBcdTRGOUJcdUZGMUFtZXRhIFx1NTE2OFx1OTFDRlx1NUJGOVx1NkJENFx1RkYwOFx1OUVEOFx1OEJBNFx1OTBGRFx1ODlDNlx1NEUzQSBSSVNLWVx1RkYwOVx1MzAwMlxuICAgKiAtIFx1NjNEMFx1NEY5Qlx1RkYxQVx1NEVDNVx1NUJGOSBhbGxvd2xpc3QgXHU1MTg1IGtleSBcdTUwNUEgbWV0YSBkaWZmXHVGRjA4XHU1MTc2XHU0RjU5XHU1RkZEXHU3NTY1XHVGRjA5XHUzMDAyXG4gICAqL1xuICByZWFkb25seSBtZXRhQWxsb3dsaXN0PzogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG59XG5cbmNvbnN0IFNFVkVSSVRZX1JBTks6IFJlY29yZDxNYW5pZmVzdERpZmZTZXZlcml0eSwgbnVtYmVyPiA9IHtcbiAgQlJFQUtJTkc6IDAsXG4gIFJJU0tZOiAxLFxuICBJTkZPOiAyLFxufVxuXG5jb25zdCB1bmlxU29ydGVkID0gKGlucHV0OiBSZWFkb25seUFycmF5PHN0cmluZz4pOiBSZWFkb25seUFycmF5PHN0cmluZz4gPT4ge1xuICBjb25zdCBvdXQgPSBBcnJheS5mcm9tKG5ldyBTZXQoaW5wdXQuZmlsdGVyKCh4KSA9PiB0eXBlb2YgeCA9PT0gXCJzdHJpbmdcIiAmJiB4Lmxlbmd0aCA+IDApKSlcbiAgb3V0LnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcbiAgcmV0dXJuIG91dFxufVxuXG5jb25zdCBkaWZmU3RyaW5nS2V5cyA9IChcbiAgYmVmb3JlOiBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQsXG4gIGFmdGVyOiBSZWFkb25seUFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQsXG4pOiB7IHJlYWRvbmx5IHJlbW92ZWQ6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPjsgcmVhZG9ubHkgYWRkZWQ6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiB9ID0+IHtcbiAgY29uc3QgYmVmb3JlU2V0ID0gbmV3IFNldCh1bmlxU29ydGVkKGJlZm9yZSA/PyBbXSkpXG4gIGNvbnN0IGFmdGVyU2V0ID0gbmV3IFNldCh1bmlxU29ydGVkKGFmdGVyID8/IFtdKSlcblxuICBjb25zdCByZW1vdmVkOiBzdHJpbmdbXSA9IFtdXG4gIGZvciAoY29uc3QgayBvZiBiZWZvcmVTZXQpIHtcbiAgICBpZiAoIWFmdGVyU2V0LmhhcyhrKSkgcmVtb3ZlZC5wdXNoKGspXG4gIH1cbiAgcmVtb3ZlZC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG5cbiAgY29uc3QgYWRkZWQ6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBrIG9mIGFmdGVyU2V0KSB7XG4gICAgaWYgKCFiZWZvcmVTZXQuaGFzKGspKSBhZGRlZC5wdXNoKGspXG4gIH1cbiAgYWRkZWQuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuXG4gIHJldHVybiB7IHJlbW92ZWQsIGFkZGVkIH1cbn1cblxuY29uc3QgZXFKc29uVmFsdWUgPSAoYTogdW5rbm93biwgYjogdW5rbm93bik6IGJvb2xlYW4gPT4gc3RhYmxlU3RyaW5naWZ5KGEpID09PSBzdGFibGVTdHJpbmdpZnkoYilcblxuY29uc3QgaW5kZXhMb2dpY1VuaXRzID0gKFxuICBpbnB1dDogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdD4gfCB1bmRlZmluZWQsXG4pOiBSZWFkb25seU1hcDxzdHJpbmcsIE1vZHVsZU1hbmlmZXN0TG9naWNVbml0PiA9PiB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdD4oKVxuICBmb3IgKGNvbnN0IHVuaXQgb2YgaW5wdXQgPz8gW10pIHtcbiAgICBpZiAoIXVuaXQgfHwgdHlwZW9mIHVuaXQgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlXG4gICAgY29uc3QgaWQgPSAodW5pdCBhcyBhbnkpLmlkXG4gICAgaWYgKHR5cGVvZiBpZCAhPT0gXCJzdHJpbmdcIiB8fCBpZC5sZW5ndGggPT09IDApIGNvbnRpbnVlXG4gICAgbWFwLnNldChpZCwgdW5pdClcbiAgfVxuICByZXR1cm4gbWFwXG59XG5cbmV4cG9ydCBjb25zdCBkaWZmTWFuaWZlc3QgPSAoXG4gIGJlZm9yZTogTW9kdWxlTWFuaWZlc3QsXG4gIGFmdGVyOiBNb2R1bGVNYW5pZmVzdCxcbiAgb3B0aW9ucz86IERpZmZNYW5pZmVzdE9wdGlvbnMsXG4pOiBNb2R1bGVNYW5pZmVzdERpZmYgPT4ge1xuICBjb25zdCBjaGFuZ2VzOiBNb2R1bGVNYW5pZmVzdERpZmZDaGFuZ2VbXSA9IFtdXG5cbiAgLy8gSWRlbnRpdHkgLyBwcm90b2NvbFxuICBpZiAoYmVmb3JlLm1vZHVsZUlkICE9PSBhZnRlci5tb2R1bGVJZCkge1xuICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICBzZXZlcml0eTogXCJCUkVBS0lOR1wiLFxuICAgICAgY29kZTogXCJtb2R1bGVJZC5jaGFuZ2VkXCIsXG4gICAgICBtZXNzYWdlOiBgbW9kdWxlSWQgY2hhbmdlZCAoJHtiZWZvcmUubW9kdWxlSWR9IC0+ICR7YWZ0ZXIubW9kdWxlSWR9KWAsXG4gICAgICBwb2ludGVyOiBcIi9tb2R1bGVJZFwiLFxuICAgICAgZGV0YWlsczoge1xuICAgICAgICBiZWZvcmU6IGJlZm9yZS5tb2R1bGVJZCxcbiAgICAgICAgYWZ0ZXI6IGFmdGVyLm1vZHVsZUlkLFxuICAgICAgfSxcbiAgICB9KVxuICB9XG5cbiAgaWYgKGJlZm9yZS5tYW5pZmVzdFZlcnNpb24gIT09IGFmdGVyLm1hbmlmZXN0VmVyc2lvbikge1xuICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICBzZXZlcml0eTogXCJJTkZPXCIsXG4gICAgICBjb2RlOiBcIm1hbmlmZXN0VmVyc2lvbi5jaGFuZ2VkXCIsXG4gICAgICBtZXNzYWdlOiBgbWFuaWZlc3RWZXJzaW9uIGNoYW5nZWQgKCR7YmVmb3JlLm1hbmlmZXN0VmVyc2lvbn0gLT4gJHthZnRlci5tYW5pZmVzdFZlcnNpb259KWAsXG4gICAgICBwb2ludGVyOiBcIi9tYW5pZmVzdFZlcnNpb25cIixcbiAgICAgIGRldGFpbHM6IHtcbiAgICAgICAgYmVmb3JlOiBiZWZvcmUubWFuaWZlc3RWZXJzaW9uLFxuICAgICAgICBhZnRlcjogYWZ0ZXIubWFuaWZlc3RWZXJzaW9uLFxuICAgICAgfSxcbiAgICB9KVxuICB9XG5cbiAgLy8gYWN0aW9uS2V5c1xuICB7XG4gICAgY29uc3QgeyByZW1vdmVkLCBhZGRlZCB9ID0gZGlmZlN0cmluZ0tleXMoYmVmb3JlLmFjdGlvbktleXMsIGFmdGVyLmFjdGlvbktleXMpXG4gICAgaWYgKHJlbW92ZWQubGVuZ3RoID4gMCB8fCBhZGRlZC5sZW5ndGggPiAwKSB7XG4gICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICBzZXZlcml0eTogcmVtb3ZlZC5sZW5ndGggPiAwID8gXCJCUkVBS0lOR1wiIDogXCJJTkZPXCIsXG4gICAgICAgIGNvZGU6IFwiYWN0aW9uS2V5cy5jaGFuZ2VkXCIsXG4gICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgcmVtb3ZlZC5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IGBhY3Rpb25LZXlzIHJlbW92ZWQ6ICR7cmVtb3ZlZC5qb2luKFwiLCBcIil9YFxuICAgICAgICAgICAgOiBgYWN0aW9uS2V5cyBhZGRlZDogJHthZGRlZC5qb2luKFwiLCBcIil9YCxcbiAgICAgICAgcG9pbnRlcjogXCIvYWN0aW9uS2V5c1wiLFxuICAgICAgICBkZXRhaWxzOiB7IHJlbW92ZWQsIGFkZGVkIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8vIHNjaGVtYUtleXNcbiAge1xuICAgIGNvbnN0IHsgcmVtb3ZlZCwgYWRkZWQgfSA9IGRpZmZTdHJpbmdLZXlzKGJlZm9yZS5zY2hlbWFLZXlzLCBhZnRlci5zY2hlbWFLZXlzKVxuICAgIGlmIChyZW1vdmVkLmxlbmd0aCA+IDAgfHwgYWRkZWQubGVuZ3RoID4gMCkge1xuICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgc2V2ZXJpdHk6IHJlbW92ZWQubGVuZ3RoID4gMCA/IFwiQlJFQUtJTkdcIiA6IFwiSU5GT1wiLFxuICAgICAgICBjb2RlOiBcInNjaGVtYUtleXMuY2hhbmdlZFwiLFxuICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgIHJlbW92ZWQubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyBgc2NoZW1hS2V5cyByZW1vdmVkOiAke3JlbW92ZWQuam9pbihcIiwgXCIpfWBcbiAgICAgICAgICAgIDogYHNjaGVtYUtleXMgYWRkZWQ6ICR7YWRkZWQuam9pbihcIiwgXCIpfWAsXG4gICAgICAgIHBvaW50ZXI6IFwiL3NjaGVtYUtleXNcIixcbiAgICAgICAgZGV0YWlsczogeyByZW1vdmVkLCBhZGRlZCB9LFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvLyBsb2dpY1VuaXRzIChzbG90cylcbiAge1xuICAgIGNvbnN0IGJlZm9yZUJ5SWQgPSBpbmRleExvZ2ljVW5pdHMoYmVmb3JlLmxvZ2ljVW5pdHMpXG4gICAgY29uc3QgYWZ0ZXJCeUlkID0gaW5kZXhMb2dpY1VuaXRzKGFmdGVyLmxvZ2ljVW5pdHMpXG5cbiAgICBjb25zdCByZW1vdmVkOiBzdHJpbmdbXSA9IFtdXG4gICAgY29uc3QgYWRkZWQ6IHN0cmluZ1tdID0gW11cbiAgICBjb25zdCBraW5kQ2hhbmdlZDogQXJyYXk8eyByZWFkb25seSBpZDogc3RyaW5nOyByZWFkb25seSBiZWZvcmU6IHN0cmluZzsgcmVhZG9ubHkgYWZ0ZXI6IHN0cmluZyB9PiA9XG4gICAgICBbXVxuICAgIGNvbnN0IHJpc2t5Q2hhbmdlZDogQXJyYXk8eyByZWFkb25seSBpZDogc3RyaW5nOyByZWFkb25seSBmaWVsZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiB9PiA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGlkIG9mIGJlZm9yZUJ5SWQua2V5cygpKSB7XG4gICAgICBpZiAoIWFmdGVyQnlJZC5oYXMoaWQpKSByZW1vdmVkLnB1c2goaWQpXG4gICAgfVxuICAgIGZvciAoY29uc3QgaWQgb2YgYWZ0ZXJCeUlkLmtleXMoKSkge1xuICAgICAgaWYgKCFiZWZvcmVCeUlkLmhhcyhpZCkpIGFkZGVkLnB1c2goaWQpXG4gICAgfVxuXG4gICAgcmVtb3ZlZC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG4gICAgYWRkZWQuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuXG4gICAgZm9yIChjb25zdCBpZCBvZiBiZWZvcmVCeUlkLmtleXMoKSkge1xuICAgICAgY29uc3QgYiA9IGJlZm9yZUJ5SWQuZ2V0KGlkKVxuICAgICAgY29uc3QgYSA9IGFmdGVyQnlJZC5nZXQoaWQpXG4gICAgICBpZiAoIWIgfHwgIWEpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGZpZWxkczogc3RyaW5nW10gPSBbXVxuICAgICAgaWYgKGIua2luZCAhPT0gYS5raW5kKSB7XG4gICAgICAgIGtpbmRDaGFuZ2VkLnB1c2goeyBpZCwgYmVmb3JlOiBiLmtpbmQsIGFmdGVyOiBhLmtpbmQgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGlmIChiLm5hbWUgIT09IGEubmFtZSkgZmllbGRzLnB1c2goXCJuYW1lXCIpXG4gICAgICBpZiAoYi5kZXJpdmVkICE9PSBhLmRlcml2ZWQpIGZpZWxkcy5wdXNoKFwiZGVyaXZlZFwiKVxuICAgICAgaWYgKGZpZWxkcy5sZW5ndGggPiAwKSByaXNreUNoYW5nZWQucHVzaCh7IGlkLCBmaWVsZHMgfSlcbiAgICB9XG5cbiAgICBraW5kQ2hhbmdlZC5zb3J0KCh4LCB5KSA9PiB4LmlkLmxvY2FsZUNvbXBhcmUoeS5pZCkpXG4gICAgcmlza3lDaGFuZ2VkLnNvcnQoKHgsIHkpID0+IHguaWQubG9jYWxlQ29tcGFyZSh5LmlkKSlcblxuICAgIGlmIChyZW1vdmVkLmxlbmd0aCA+IDApIHtcbiAgICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICAgIHNldmVyaXR5OiBcIkJSRUFLSU5HXCIsXG4gICAgICAgIGNvZGU6IFwibG9naWNVbml0cy5yZW1vdmVkXCIsXG4gICAgICAgIG1lc3NhZ2U6IGBsb2dpY1VuaXRzIHJlbW92ZWQ6ICR7cmVtb3ZlZC5qb2luKFwiLCBcIil9YCxcbiAgICAgICAgcG9pbnRlcjogXCIvbG9naWNVbml0c1wiLFxuICAgICAgICBkZXRhaWxzOiB7IHJlbW92ZWQgfSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGtpbmRDaGFuZ2VkLmxlbmd0aCA+IDApIHtcbiAgICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICAgIHNldmVyaXR5OiBcIkJSRUFLSU5HXCIsXG4gICAgICAgIGNvZGU6IFwibG9naWNVbml0cy5raW5kQ2hhbmdlZFwiLFxuICAgICAgICBtZXNzYWdlOiBgbG9naWNVbml0cyBraW5kIGNoYW5nZWQ6ICR7a2luZENoYW5nZWQubWFwKCh4KSA9PiB4LmlkKS5qb2luKFwiLCBcIil9YCxcbiAgICAgICAgcG9pbnRlcjogXCIvbG9naWNVbml0c1wiLFxuICAgICAgICBkZXRhaWxzOiB7IGtpbmRDaGFuZ2VkIH0sXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChhZGRlZC5sZW5ndGggPiAwKSB7XG4gICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICBzZXZlcml0eTogXCJJTkZPXCIsXG4gICAgICAgIGNvZGU6IFwibG9naWNVbml0cy5hZGRlZFwiLFxuICAgICAgICBtZXNzYWdlOiBgbG9naWNVbml0cyBhZGRlZDogJHthZGRlZC5qb2luKFwiLCBcIil9YCxcbiAgICAgICAgcG9pbnRlcjogXCIvbG9naWNVbml0c1wiLFxuICAgICAgICBkZXRhaWxzOiB7IGFkZGVkIH0sXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChyaXNreUNoYW5nZWQubGVuZ3RoID4gMCkge1xuICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgc2V2ZXJpdHk6IFwiUklTS1lcIixcbiAgICAgICAgY29kZTogXCJsb2dpY1VuaXRzLmNoYW5nZWRcIixcbiAgICAgICAgbWVzc2FnZTogYGxvZ2ljVW5pdHMgY2hhbmdlZDogJHtyaXNreUNoYW5nZWQubWFwKCh4KSA9PiB4LmlkKS5qb2luKFwiLCBcIil9YCxcbiAgICAgICAgcG9pbnRlcjogXCIvbG9naWNVbml0c1wiLFxuICAgICAgICBkZXRhaWxzOiB7IGNoYW5nZWQ6IHJpc2t5Q2hhbmdlZCB9LFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvLyBzdGF0aWNJci5kaWdlc3RcbiAge1xuICAgIGNvbnN0IGJlZm9yZURpZ2VzdCA9IGJlZm9yZS5zdGF0aWNJcj8uZGlnZXN0XG4gICAgY29uc3QgYWZ0ZXJEaWdlc3QgPSBhZnRlci5zdGF0aWNJcj8uZGlnZXN0XG4gICAgaWYgKGJlZm9yZURpZ2VzdCAhPT0gYWZ0ZXJEaWdlc3QpIHtcbiAgICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICAgIHNldmVyaXR5OiBcIlJJU0tZXCIsXG4gICAgICAgIGNvZGU6IFwic3RhdGljSXIuZGlnZXN0Q2hhbmdlZFwiLFxuICAgICAgICBtZXNzYWdlOiBcInN0YXRpY0lyLmRpZ2VzdCBjaGFuZ2VkXCIsXG4gICAgICAgIHBvaW50ZXI6IFwiL3N0YXRpY0lyL2RpZ2VzdFwiLFxuICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAgYmVmb3JlOiBiZWZvcmVEaWdlc3QgPz8gbnVsbCxcbiAgICAgICAgICBhZnRlcjogYWZ0ZXJEaWdlc3QgPz8gbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLy8gbWV0YSAoZGVmYXVsdDogUklTS1ksIGFsbG93bGlzdCBzdXBwb3J0ZWQpXG4gIHtcbiAgICBjb25zdCBtZXRhQmVmb3JlID0gYmVmb3JlLm1ldGEgPz8ge31cbiAgICBjb25zdCBtZXRhQWZ0ZXIgPSBhZnRlci5tZXRhID8/IHt9XG5cbiAgICBjb25zdCBhbGxvd2xpc3QgPSBvcHRpb25zPy5tZXRhQWxsb3dsaXN0XG4gICAgY29uc3Qga2V5cyA9XG4gICAgICBhbGxvd2xpc3QgIT0gbnVsbFxuICAgICAgICA/IHVuaXFTb3J0ZWQoYWxsb3dsaXN0KVxuICAgICAgICA6IHVuaXFTb3J0ZWQoWy4uLk9iamVjdC5rZXlzKG1ldGFCZWZvcmUpLCAuLi5PYmplY3Qua2V5cyhtZXRhQWZ0ZXIpXSlcblxuICAgIGNvbnN0IGNoYW5nZWQ6IEFycmF5PHsgcmVhZG9ubHkga2V5OiBzdHJpbmc7IHJlYWRvbmx5IGJlZm9yZTogSnNvblZhbHVlIHwgbnVsbDsgcmVhZG9ubHkgYWZ0ZXI6IEpzb25WYWx1ZSB8IG51bGwgfT4gPVxuICAgICAgW11cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IGIgPSBrZXkgaW4gbWV0YUJlZm9yZSA/IChtZXRhQmVmb3JlIGFzIGFueSlba2V5XSA6IHVuZGVmaW5lZFxuICAgICAgY29uc3QgYSA9IGtleSBpbiBtZXRhQWZ0ZXIgPyAobWV0YUFmdGVyIGFzIGFueSlba2V5XSA6IHVuZGVmaW5lZFxuICAgICAgaWYgKCFlcUpzb25WYWx1ZShiLCBhKSkge1xuICAgICAgICBjaGFuZ2VkLnB1c2goe1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBiZWZvcmU6IChiID8/IG51bGwpIGFzIEpzb25WYWx1ZSB8IG51bGwsXG4gICAgICAgICAgYWZ0ZXI6IChhID8/IG51bGwpIGFzIEpzb25WYWx1ZSB8IG51bGwsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWQubGVuZ3RoID4gMCkge1xuICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgc2V2ZXJpdHk6IFwiUklTS1lcIixcbiAgICAgICAgY29kZTogXCJtZXRhLmNoYW5nZWRcIixcbiAgICAgICAgbWVzc2FnZTogXCJtZXRhIGNoYW5nZWRcIixcbiAgICAgICAgcG9pbnRlcjogXCIvbWV0YVwiLFxuICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAga2V5czogY2hhbmdlZC5tYXAoKHgpID0+IHgua2V5KSxcbiAgICAgICAgICBjaGFuZ2VkLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvLyBzb3VyY2UgKGRlZmF1bHQ6IElORk8pXG4gIHtcbiAgICBjb25zdCBiID0gYmVmb3JlLnNvdXJjZVxuICAgIGNvbnN0IGEgPSBhZnRlci5zb3VyY2VcbiAgICBpZiAoIWVxSnNvblZhbHVlKGIgPz8gbnVsbCwgYSA/PyBudWxsKSkge1xuICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgc2V2ZXJpdHk6IFwiSU5GT1wiLFxuICAgICAgICBjb2RlOiBcInNvdXJjZS5jaGFuZ2VkXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwic291cmNlIGNoYW5nZWRcIixcbiAgICAgICAgcG9pbnRlcjogXCIvc291cmNlXCIsXG4gICAgICAgIGRldGFpbHM6IHtcbiAgICAgICAgICBiZWZvcmU6IGIgPz8gbnVsbCxcbiAgICAgICAgICBhZnRlcjogYSA/PyBudWxsLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCByYSA9IFNFVkVSSVRZX1JBTktbYS5zZXZlcml0eV1cbiAgICBjb25zdCByYiA9IFNFVkVSSVRZX1JBTktbYi5zZXZlcml0eV1cbiAgICBpZiAocmEgIT09IHJiKSByZXR1cm4gcmEgLSByYlxuICAgIGNvbnN0IGNhID0gYS5jb2RlLmxvY2FsZUNvbXBhcmUoYi5jb2RlKVxuICAgIGlmIChjYSAhPT0gMCkgcmV0dXJuIGNhXG4gICAgY29uc3QgcGEgPSBhLnBvaW50ZXIgPz8gXCJcIlxuICAgIGNvbnN0IHBiID0gYi5wb2ludGVyID8/IFwiXCJcbiAgICByZXR1cm4gcGEubG9jYWxlQ29tcGFyZShwYilcbiAgfSlcblxuICBjb25zdCBzdW1tYXJ5OiBNb2R1bGVNYW5pZmVzdERpZmZTdW1tYXJ5ID0ge1xuICAgIGJyZWFraW5nOiBjaGFuZ2VzLmZpbHRlcigoYykgPT4gYy5zZXZlcml0eSA9PT0gXCJCUkVBS0lOR1wiKS5sZW5ndGgsXG4gICAgcmlza3k6IGNoYW5nZXMuZmlsdGVyKChjKSA9PiBjLnNldmVyaXR5ID09PSBcIlJJU0tZXCIpLmxlbmd0aCxcbiAgICBpbmZvOiBjaGFuZ2VzLmZpbHRlcigoYykgPT4gYy5zZXZlcml0eSA9PT0gXCJJTkZPXCIpLmxlbmd0aCxcbiAgfVxuXG4gIGNvbnN0IHZlcmRpY3Q6IE1hbmlmZXN0RGlmZlZlcmRpY3QgPVxuICAgIHN1bW1hcnkuYnJlYWtpbmcgPiAwID8gXCJGQUlMXCIgOiBzdW1tYXJ5LnJpc2t5ID4gMCA/IFwiV0FSTlwiIDogXCJQQVNTXCJcblxuICByZXR1cm4ge1xuICAgIHZlcnNpb246IFwiMDI1XCIsXG4gICAgbW9kdWxlSWQ6IGFmdGVyLm1vZHVsZUlkLFxuICAgIGJlZm9yZToge1xuICAgICAgZGlnZXN0OiBiZWZvcmUuZGlnZXN0LFxuICAgICAgbWFuaWZlc3RWZXJzaW9uOiBiZWZvcmUubWFuaWZlc3RWZXJzaW9uLFxuICAgIH0sXG4gICAgYWZ0ZXI6IHtcbiAgICAgIGRpZ2VzdDogYWZ0ZXIuZGlnZXN0LFxuICAgICAgbWFuaWZlc3RWZXJzaW9uOiBhZnRlci5tYW5pZmVzdFZlcnNpb24sXG4gICAgfSxcbiAgICB2ZXJkaWN0LFxuICAgIGNoYW5nZXMsXG4gICAgc3VtbWFyeSxcbiAgfVxufVxuXG4iLCAiaW1wb3J0IHR5cGUgeyBBbnlNb2R1bGVTaGFwZSwgTW9kdWxlSW1wbCB9IGZyb20gXCIuL2ludGVybmFsL21vZHVsZS5qc1wiXG5pbXBvcnQgdHlwZSB7IEFueU1vZHVsZSB9IGZyb20gXCIuL01vZHVsZS5qc1wiXG5pbXBvcnQgdHlwZSB7IFN0YXRpY0lyIH0gZnJvbSBcIi4vaW50ZXJuYWwvc3RhdGUtdHJhaXQvaXIuanNcIlxuaW1wb3J0IHR5cGUgeyBFeHRyYWN0TWFuaWZlc3RPcHRpb25zLCBNb2R1bGVNYW5pZmVzdCB9IGZyb20gXCIuL2ludGVybmFsL3JlZmxlY3Rpb24vbWFuaWZlc3QuanNcIlxuaW1wb3J0ICogYXMgTWFuaWZlc3QgZnJvbSBcIi4vaW50ZXJuYWwvcmVmbGVjdGlvbi9tYW5pZmVzdC5qc1wiXG5pbXBvcnQgKiBhcyBTdGF0aWNJckV4cG9ydCBmcm9tIFwiLi9pbnRlcm5hbC9yZWZsZWN0aW9uL3N0YXRpY0lyLmpzXCJcbmltcG9ydCB0eXBlIHtcbiAgRGlmZk1hbmlmZXN0T3B0aW9ucyxcbiAgTW9kdWxlTWFuaWZlc3REaWZmLFxufSBmcm9tIFwiLi9pbnRlcm5hbC9yZWZsZWN0aW9uL2RpZmYuanNcIlxuaW1wb3J0ICogYXMgTWFuaWZlc3REaWZmIGZyb20gXCIuL2ludGVybmFsL3JlZmxlY3Rpb24vZGlmZi5qc1wiXG5cbmV4cG9ydCB0eXBlIHtcbiAgTW9kdWxlTWFuaWZlc3QsXG4gIEV4dHJhY3RNYW5pZmVzdE9wdGlvbnMsXG4gIE1vZHVsZU1hbmlmZXN0RGlmZixcbiAgRGlmZk1hbmlmZXN0T3B0aW9ucyxcbn1cblxuLyoqXG4gKiBSZWZsZWN0aW9uLmV4dHJhY3RNYW5pZmVzdFxuICpcbiAqIFx1NEVDRVx1NjcwMFx1N0VDOFx1NkEyMVx1NTc1N1x1NUJGOVx1OEM2MVx1RkYwOGBBbnlNb2R1bGVgIC8gYE1vZHVsZUltcGxgXHVGRjA5XHU2M0QwXHU1M0Q2XHU1RTczXHU1M0YwXHU1M0VGXHU2RDg4XHU4RDM5XHU3Njg0IE1hbmlmZXN0IElSXHVGRjA4SlNPTlx1RkYwQ1x1NTNFRiBkaWZmXHVGRjA5XHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBleHRyYWN0TWFuaWZlc3QgPSAoXG4gIG1vZHVsZTogTW9kdWxlSW1wbDxhbnksIEFueU1vZHVsZVNoYXBlLCBhbnk+IHwgQW55TW9kdWxlLFxuICBvcHRpb25zPzogRXh0cmFjdE1hbmlmZXN0T3B0aW9ucyxcbik6IE1vZHVsZU1hbmlmZXN0ID0+IE1hbmlmZXN0LmV4dHJhY3RNYW5pZmVzdChtb2R1bGUsIG9wdGlvbnMpXG5cbi8qKlxuICogUmVmbGVjdGlvbi5kaWZmTWFuaWZlc3RcbiAqXG4gKiBcdTVCRjlcdTZCRDRcdTRFMjRcdTRFRkQgTWFuaWZlc3RcdUZGMENcdTRFQTdcdTUxRkFcdTdBMzNcdTVCOUFcdTMwMDFcdTUzRUZcdTY3M0FcdThCRkJcdTc2ODRcdTVERUVcdTVGMDJcdTY0NThcdTg5ODFcdUZGMDhDSSBDb250cmFjdCBHdWFyZCAvIFVJIFx1NTkwRFx1NzUyOFx1RkYwOVx1MzAwMlxuICovXG5leHBvcnQgY29uc3QgZGlmZk1hbmlmZXN0ID0gKFxuICBiZWZvcmU6IE1vZHVsZU1hbmlmZXN0LFxuICBhZnRlcjogTW9kdWxlTWFuaWZlc3QsXG4gIG9wdGlvbnM/OiBEaWZmTWFuaWZlc3RPcHRpb25zLFxuKTogTW9kdWxlTWFuaWZlc3REaWZmID0+IE1hbmlmZXN0RGlmZi5kaWZmTWFuaWZlc3QoYmVmb3JlLCBhZnRlciwgb3B0aW9ucylcblxuLyoqXG4gKiBSZWZsZWN0aW9uLmV4cG9ydFN0YXRpY0lyXG4gKlxuICogXHU4MkU1IG1vZHVsZSBcdTU0MkIgU3RhdGVUcmFpdCBwcm9ncmFtXHVGRjBDXHU1MjE5XHU1QkZDXHU1MUZBIGNhbm9uaWNhbCBTdGF0aWNJUlx1RkYwOFx1NTkwRFx1NzUyOCBTdGF0ZVRyYWl0LmV4cG9ydFN0YXRpY0lyIFx1NzY4NFx1NUY2Mlx1NjAwMVx1NEUwRSBkaWdlc3RcdUZGMDlcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IGV4cG9ydFN0YXRpY0lyID0gKFxuICBtb2R1bGU6IE1vZHVsZUltcGw8YW55LCBBbnlNb2R1bGVTaGFwZSwgYW55PiB8IEFueU1vZHVsZSxcbik6IFN0YXRpY0lyIHwgdW5kZWZpbmVkID0+IFN0YXRpY0lyRXhwb3J0LmV4cG9ydFN0YXRpY0lyKG1vZHVsZSlcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7OztBQU1BLElBQU0sV0FBVyxDQUFDLFVBQ2hCLE9BQU8sVUFBVSxZQUFZLFVBQVUsUUFBUSxDQUFDLE1BQU0sUUFBUSxLQUFLO0FBRXJFLElBQU0sZUFBZSxDQUFDLFVBQ3BCLFNBQVMsS0FBSyxLQUFLLE1BQU0sU0FBUyxnQkFBZ0IsU0FBUyxNQUFNLE1BQU07QUFFekUsSUFBTSxrQkFBa0IsQ0FBQyxVQUEyQjtBQUNsRCxNQUFJLGFBQWEsS0FBSyxHQUFHO0FBQ3ZCLFVBQU0sS0FBTSxNQUFNLE9BQWU7QUFDakMsV0FBTyxPQUFPLE9BQU8sWUFBWSxHQUFHLFNBQVMsSUFBSSxLQUFLO0FBQUEsRUFDeEQ7QUFFQSxNQUFJLFNBQVMsS0FBSyxHQUFHO0FBQ25CLFVBQU0sS0FBSyxNQUFNO0FBQ2pCLFFBQUksT0FBTyxPQUFPLFlBQVksR0FBRyxTQUFTLEVBQUcsUUFBTztBQUNwRCxVQUFNLE1BQU8sTUFBYztBQUMzQixRQUFJLFFBQVEsT0FBTyxRQUFRLFlBQVksT0FBTyxRQUFRLGFBQWE7QUFDakUsWUFBTSxRQUFTLElBQVk7QUFDM0IsVUFBSSxPQUFPLFVBQVUsWUFBWSxNQUFNLFNBQVMsRUFBRyxRQUFPO0FBQUEsSUFDNUQ7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBRUEsSUFBTSxtQkFBbUIs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QUk7QUFDdEMsUUFBSSxPQUFPLEVBQUcsUUFBTztBQUNyQixVQUFNLEtBQUssRUFBRSxXQUFXO0FBQ3hCLFVBQU0sS0FBSyxFQUFFLFdBQVc7QUFDeEIsV0FBTyxHQUFHLGNBQWMsRUFBRTtBQUFBLEVBQzVCLENBQUM7QUFFRCxRQUFNLFVBQXFDO0FBQUEsSUFDekMsVUFBVSxRQUFRLE9BQU8sQ0FBQyxNQUFNLEVBQUUsYUFBYSxVQUFVLEVBQUU7QUFBQSxJQUMzRCxPQUFPLFFBQVEsT0FBTyxDQUFDLE1BQU0sRUFBRSxhQUFhLE9BQU8sRUFBRTtBQUFBLElBQ3JELE1BQU0sUUFBUSxPQUFPLENBQUMsTUFBTSxFQUFFLGFBQWEsTUFBTSxFQUFFO0FBQUEsRUFDckQ7QUFFQSxRQUFNLFVBQ0osUUFBUSxXQUFXLElBQUksU0FBUyxRQUFRLFFBQVEsSUFBSSxTQUFTO0FBRS9ELFNBQU87QUFBQSxJQUNMLFNBQVM7QUFBQSxJQUNULFVBQVUsTUFBTTtBQUFBLElBQ2hCLFFBQVE7QUFBQSxNQUNOLFFBQVEsT0FBTztBQUFBLE1BQ2YsaUJBQWlCLE9BQU87QUFBQSxJQUMxQjtBQUFBLElBQ0EsT0FBTztBQUFBLE1BQ0wsUUFBUSxNQUFNO0FBQUEsTUFDZCxpQkFBaUIsTUFBTTtBQUFBLElBQ3pCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGOzs7QUMxVU8sSUFBTUMsbUJBQWtCLENBQzdCLFFBQ0EsWUFDNEIsZ0JBQWdCLFFBQVEsT0FBTztBQU90RCxJQUFNQyxnQkFBZSxDQUMxQixRQUNBLE9BQ0EsWUFDb0MsYUFBYSxRQUFRLE9BQU8sT0FBTztBQU9sRSxJQUFNQyxrQkFBaUIsQ0FDNUIsV0FDd0NBLGdCQUFlLE1BQU07IiwKICAibmFtZXMiOiBbImV4cG9ydFN0YXRpY0lyIiwgImlzUmVjb3JkIiwgImlzTW9kdWxlSW1wbCIsICJyZXNvbHZlTW9kdWxlSWQiLCAibmV4dCIsICJleHBvcnRTdGF0aWNJciIsICJleHRyYWN0TWFuaWZlc3QiLCAiZGlmZk1hbmlmZXN0IiwgImV4cG9ydFN0YXRpY0lyIl0KfQo=
|