sonamu 0.9.15 → 0.9.16
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/dist/api/sonamu.js +2 -2
- package/dist/template/implementations/generated.template.js +3 -3
- package/dist/template/implementations/sd.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.js +6 -2
- package/dist/template/zod-converter.d.ts +1 -1
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +20 -11
- package/package.json +2 -2
- package/src/api/sonamu.ts +1 -1
- package/src/template/__tests__/generated.template.search-text.test.ts +64 -1
- package/src/template/implementations/generated.template.ts +3 -3
- package/src/template/implementations/sd.template.ts +5 -1
- package/src/template/zod-converter.ts +27 -10
|
@@ -28,6 +28,10 @@ import path from "path";
|
|
|
28
28
|
* - zodTypeToRenderingNode
|
|
29
29
|
* - resolveRenderType
|
|
30
30
|
*/
|
|
31
|
+
function getBuiltInSchemaName(zodType) {
|
|
32
|
+
const matched = Object.entries(BUILT_IN_TYPES).find(([typeId]) => zodType.description === typeId);
|
|
33
|
+
return matched?.[1].schemaName;
|
|
34
|
+
}
|
|
31
35
|
/**
|
|
32
36
|
* zodFormat을 Zod 4 코드 문자열로 변환합니다.
|
|
33
37
|
* Zod 4에서는 z.email(), z.uuid() 등 독립적인 함수 형태를 사용합니다.
|
|
@@ -397,7 +401,12 @@ function zodTypeToTsTypeDef(zt) {
|
|
|
397
401
|
/**
|
|
398
402
|
* Zod 타입 인스턴스를 해당하는 Zod 코드 문자열로 변환합니다.
|
|
399
403
|
*/
|
|
400
|
-
function zodTypeToZodCode(zt) {
|
|
404
|
+
function zodTypeToZodCode(zt, injectImportKeys = []) {
|
|
405
|
+
const builtInSchemaName = getBuiltInSchemaName(zt);
|
|
406
|
+
if (builtInSchemaName) {
|
|
407
|
+
injectImportKeys.push(builtInSchemaName);
|
|
408
|
+
return builtInSchemaName;
|
|
409
|
+
}
|
|
401
410
|
switch (zt.def.type) {
|
|
402
411
|
case "string": return "z.string()";
|
|
403
412
|
case "number": return "z.number()";
|
|
@@ -409,14 +418,14 @@ function zodTypeToZodCode(zt) {
|
|
|
409
418
|
case "any": return "z.any()";
|
|
410
419
|
case "unknown": return "z.unknown()";
|
|
411
420
|
case "never": return "z.never()";
|
|
412
|
-
case "nullable": return `${zodTypeToZodCode(zt.def.innerType)}.nullable()`;
|
|
421
|
+
case "nullable": return `${zodTypeToZodCode(zt.def.innerType, injectImportKeys)}.nullable()`;
|
|
413
422
|
case "default": {
|
|
414
423
|
const zDefaultDef = zt.def;
|
|
415
|
-
return `${zodTypeToZodCode(zDefaultDef.innerType)}.default(${zDefaultDef.defaultValue})`;
|
|
424
|
+
return `${zodTypeToZodCode(zDefaultDef.innerType, injectImportKeys)}.default(${zDefaultDef.defaultValue})`;
|
|
416
425
|
}
|
|
417
426
|
case "record": {
|
|
418
427
|
const zRecordDef = zt.def;
|
|
419
|
-
return `z.record(${zodTypeToZodCode(zRecordDef.keyType)}, ${zodTypeToZodCode(zRecordDef.valueType)})`;
|
|
428
|
+
return `z.record(${zodTypeToZodCode(zRecordDef.keyType, injectImportKeys)}, ${zodTypeToZodCode(zRecordDef.valueType, injectImportKeys)})`;
|
|
420
429
|
}
|
|
421
430
|
case "literal": {
|
|
422
431
|
const items = Array.from(zt.values).map((value) => {
|
|
@@ -436,18 +445,18 @@ function zodTypeToZodCode(zt) {
|
|
|
436
445
|
}
|
|
437
446
|
return `z.literal([${items.join(", ")}])`;
|
|
438
447
|
}
|
|
439
|
-
case "union": return `z.union([${zt.def.options.map((option) => zodTypeToZodCode(option)).join(",")}])`;
|
|
448
|
+
case "union": return `z.union([${zt.def.options.map((option) => zodTypeToZodCode(option, injectImportKeys)).join(",")}])`;
|
|
440
449
|
case "enum": return `z.enum({${Object.entries(zt.def.entries).map(([key, val]) => typeof val === "string" ? `${key}: "${val}"` : `${key}: ${val}`).join(", ")}})`;
|
|
441
|
-
case "array": return `z.array(${zodTypeToZodCode(zt.def.element)})`;
|
|
450
|
+
case "array": return `z.array(${zodTypeToZodCode(zt.def.element, injectImportKeys)})`;
|
|
442
451
|
case "object": {
|
|
443
452
|
const shape = zt.shape;
|
|
444
453
|
return [
|
|
445
454
|
"z.object({",
|
|
446
|
-
...Object.keys(shape).map((key) => `${key}: ${zodTypeToZodCode(shape[key])},`),
|
|
455
|
+
...Object.keys(shape).map((key) => `${key}: ${zodTypeToZodCode(shape[key], injectImportKeys)},`),
|
|
447
456
|
"})"
|
|
448
457
|
].join("\n");
|
|
449
458
|
}
|
|
450
|
-
case "optional": return `${zodTypeToZodCode(zt.def.innerType)}.optional()`;
|
|
459
|
+
case "optional": return `${zodTypeToZodCode(zt.def.innerType, injectImportKeys)}.optional()`;
|
|
451
460
|
case "file": return `z.file()`;
|
|
452
461
|
case "template_literal": {
|
|
453
462
|
const def = zt.def;
|
|
@@ -459,7 +468,7 @@ function zodTypeToZodCode(zt) {
|
|
|
459
468
|
return `"${part}"`;
|
|
460
469
|
}
|
|
461
470
|
if (part && typeof part === "object" && part._zod) {
|
|
462
|
-
return zodTypeToZodCode(part);
|
|
471
|
+
return zodTypeToZodCode(part, injectImportKeys);
|
|
463
472
|
}
|
|
464
473
|
return "z.string()";
|
|
465
474
|
});
|
|
@@ -467,7 +476,7 @@ function zodTypeToZodCode(zt) {
|
|
|
467
476
|
}
|
|
468
477
|
case "intersection": {
|
|
469
478
|
const zIntersectionDef = zt.def;
|
|
470
|
-
return `z.intersection(${zodTypeToZodCode(zIntersectionDef.left)}, ${zodTypeToZodCode(zIntersectionDef.right)})`;
|
|
479
|
+
return `z.intersection(${zodTypeToZodCode(zIntersectionDef.left, injectImportKeys)}, ${zodTypeToZodCode(zIntersectionDef.right, injectImportKeys)})`;
|
|
471
480
|
}
|
|
472
481
|
default: throw new Error(`처리되지 않은 ZodType ${zt.def.type}`);
|
|
473
482
|
}
|
|
@@ -622,4 +631,4 @@ var init_zod_converter = __esmMin((() => {
|
|
|
622
631
|
//#endregion
|
|
623
632
|
init_zod_converter();
|
|
624
633
|
export { BUILT_IN_TYPES, getZodTypeById, init_zod_converter, propNodeToZodTypeDef, propToZodType, propToZodTypeDef, zodTypeToRenderingNode, zodTypeToTsTypeDef, zodTypeToZodCode };
|
|
625
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kLWNvbnZlcnRlci5qcyIsIm5hbWVzIjpbImlzb0Zvcm1hdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4iLCJoYXNoRm9ybWF0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiIsInoiLCJ6b2RUeXBlOiB6LlpvZFR5cGVBbnkiLCJlbGVtZW50VHlwZTogei5ab2RUeXBlIiwic3RtdDogc3RyaW5nIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbXBsYXRlL3pvZC1jb252ZXJ0ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB6b2QtY29udmVydGVyIOq1rOyEsVxuICogMS4g7Jyg7Yu466as7YuwXG4gKiAgLSBnZXRab2RUeXBlQnlJZFxuICpcbiAqIDIuIFpvZCDtg4DsnoUg67OA7ZmYIChFbnRpdHlQcm9wIC0+IFpvZFR5cGUpXG4gKiAgLSBwcm9wVG9ab2RUeXBlXG4gKlxuICogMy4gRW50aXR5UHJvcC9Ob2RlIC0+IFpvZCDsvZTrk5wg66y47J6Q7Je0XG4gKiAgLSBwcm9wVG9ab2RUeXBlRGVmXG4gKiAgLSBwcm9wTm9kZVRvWm9kVHlwZURlZlxuICpcbiAqIDQuIFpvZCDtg4DsnoUg7J247Iqk7YS07Iqk66W8IO2VtOuLue2VmOuKlCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZggKFpvZFR5cGUgLT4gWm9kQ29kZSlcbiAqICAtIHpvZFR5cGVUb1pvZENvZGVcbiAqXG4gKiA1LiBab2Qg7YOA7J6F7J2EIFVJIOugjOuNlOungeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmCAoWm9kVHlwZSAtPiBSZW5kZXJpbmdOb2RlKVxuICogIC0gem9kVHlwZVRvUmVuZGVyaW5nTm9kZVxuICogIC0gcmVzb2x2ZVJlbmRlclR5cGVcbiAqL1xuXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBCVUlMVF9JTl9UWVBFX0lEUyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzQmlnSW50ZWdlckFycmF5UHJvcCxcbiAgaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcCxcbiAgaXNCb29sZWFuQXJyYXlQcm9wLFxuICBpc0Jvb2xlYW5TaW5nbGVQcm9wLFxuICBpc0RhdGVBcnJheVByb3AsXG4gIGlzRGF0ZVNpbmdsZVByb3AsXG4gIGlzRW51bUFycmF5UHJvcCxcbiAgaXNFbnVtU2luZ2xlUHJvcCxcbiAgaXNJbnRlZ2VyQXJyYXlQcm9wLFxuICBpc0ludGVnZXJTaW5nbGVQcm9wLFxuICBpc0pzb25Qcm9wLFxuICBpc051bWJlckFycmF5UHJvcCxcbiAgaXNOdW1iZXJTaW5nbGVQcm9wLFxuICBpc051bWVyaWNBcnJheVByb3AsXG4gIGlzTnVtZXJpY1NpbmdsZVByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1NlYXJjaFRleHRQcm9wLFxuICBpc1N0cmluZ0FycmF5UHJvcCxcbiAgaXNTdHJpbmdTaW5nbGVQcm9wLFxuICBpc1RzVmVjdG9yUHJvcCxcbiAgaXNVdWlkQXJyYXlQcm9wLFxuICBpc1V1aWRTaW5nbGVQcm9wLFxuICBpc1ZlY3RvckFycmF5UHJvcCxcbiAgaXNWZWN0b3JTaW5nbGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gIFNvbmFtdUZpbGVTY2hlbWEsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICB0eXBlIFJlbmRlcmluZ05vZGUsXG4gIHR5cGUgWm9kU3RyaW5nRm9ybWF0LFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUltcG9ydFVybCB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcblxuLy8gPGFueT7rpbwg7J6Q7KCc7ZWY6rOgLCBab2Tsl5DshJwg7KCc7JW97ZWY64qUIOq4sOuzuOyggeyduCBHZW5lcmljIFR5cGUgUGFyYW1ldGVy66W8IOyCrOyaqe2VqC5cbnR5cGUgQW55Wm9kUmVjb3JkID0gei5ab2RSZWNvcmQ8ei5ab2RTdHJpbmcgfCB6LlpvZE51bWJlciB8IHouWm9kU3ltYm9sLCB6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RPYmplY3QgPSB6LlpvZE9iamVjdDtcbnR5cGUgQW55Wm9kTnVsbGFibGUgPSB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT47XG50eXBlIEFueVpvZERlZmF1bHQgPSB6LlpvZERlZmF1bHQ8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kVW5pb24gPSB6LlpvZFVuaW9uPHouWm9kVHlwZVtdPjtcbnR5cGUgQW55Wm9kQXJyYXkgPSB6LlpvZEFycmF5PHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9wdGlvbmFsID0gei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RUZW1wbGF0ZUxpdGVyYWwgPSB6LlpvZFRlbXBsYXRlTGl0ZXJhbDtcblxuLyoqXG4gKiDrgrTsnqUg7YOA7J6FIOygleydmCAoWm9kIOyKpO2CpOuniCArIFVJIOugjOuNlOungSDtg4DsnoUpXG4gKi9cbmV4cG9ydCBjb25zdCBCVUlMVF9JTl9UWVBFUyA9IHtcbiAgU29uYW11RmlsZToge1xuICAgIHNjaGVtYTogU29uYW11RmlsZVNjaGVtYSxcbiAgICByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZVwiLFxuICAgIHNjaGVtYU5hbWU6IFwiU29uYW11RmlsZVNjaGVtYVwiLFxuICB9LFxuICBcIlNvbmFtdUZpbGVbXVwiOiB7XG4gICAgc2NoZW1hOiBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gICAgcmVuZGVyVHlwZTogXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIixcbiAgICBzY2hlbWFOYW1lOiBcIlNvbmFtdUZpbGVBcnJheVNjaGVtYVwiLFxuICB9LFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiB6b2RGb3JtYXTsnYQgWm9kIDQg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBab2QgNOyXkOyEnOuKlCB6LmVtYWlsKCksIHoudXVpZCgpIOuTsSDrj4Xrpr3soIHsnbgg7ZWo7IiYIO2Yle2DnOulvCDsgqzsmqntlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHpvZEZvcm1hdFRvQ29kZShmb3JtYXQ6IFpvZFN0cmluZ0Zvcm1hdCk6IHN0cmluZyB7XG4gIC8vIElTTyDtj6zrp7fsnYAgei5pc28ueHh4KCkg7ZiV7YOcXG4gIGNvbnN0IGlzb0Zvcm1hdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgaXNvRGF0ZTogXCJ6Lmlzby5kYXRlKClcIixcbiAgICBpc29UaW1lOiBcInouaXNvLnRpbWUoKVwiLFxuICAgIGlzb0RhdGV0aW1lOiBcInouaXNvLmRhdGV0aW1lKClcIixcbiAgICBpc29EdXJhdGlvbjogXCJ6Lmlzby5kdXJhdGlvbigpXCIsXG4gIH07XG5cbiAgLy8gaGFzaCDtj6zrp7fsnYAgei5oYXNoKFwiYWxnb3JpdGhtXCIpIO2Yle2DnFxuICBjb25zdCBoYXNoRm9ybWF0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBoYXNoTWQ1OiAnei5oYXNoKFwibWQ1XCIpJyxcbiAgICBoYXNoU2hhMTogJ3ouaGFzaChcInNoYTFcIiknLFxuICAgIGhhc2hTaGEyNTY6ICd6Lmhhc2goXCJzaGEyNTZcIiknLFxuICAgIGhhc2hTaGEzODQ6ICd6Lmhhc2goXCJzaGEzODRcIiknLFxuICAgIGhhc2hTaGE1MTI6ICd6Lmhhc2goXCJzaGE1MTJcIiknLFxuICB9O1xuXG4gIGlmIChmb3JtYXQgaW4gaXNvRm9ybWF0cykge1xuICAgIHJldHVybiBpc29Gb3JtYXRzW2Zvcm1hdF07XG4gIH1cblxuICBpZiAoZm9ybWF0IGluIGhhc2hGb3JtYXRzKSB7XG4gICAgcmV0dXJuIGhhc2hGb3JtYXRzW2Zvcm1hdF07XG4gIH1cblxuICAvLyDquLDrs7gg7Y+s66e37J2AIHoueHh4KCkg7ZiV7YOcIChab2QgNClcbiAgcmV0dXJuIGB6LiR7Zm9ybWF0fSgpYDtcbn1cblxuLyoqXG4gKiB6b2RGb3JtYXTsnYQgWm9kIDQg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIFpvZCA07JeQ7ISc64qUIHouZW1haWwoKSwgei51dWlkKCkg65OxIOuPheumveyggeyduCDtlajsiJgg7ZiV7YOc66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gem9kRm9ybWF0VG9UeXBlKGZvcm1hdDogWm9kU3RyaW5nRm9ybWF0KTogei5ab2RUeXBlIHtcbiAgLy8gSVNPIO2PrOunt+ydgCB6Lmlzby54eHgoKSDtmJXtg5xcbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlIFwiaXNvRGF0ZVwiOlxuICAgICAgcmV0dXJuIHouaXNvLmRhdGUoKTtcbiAgICBjYXNlIFwiaXNvVGltZVwiOlxuICAgICAgcmV0dXJuIHouaXNvLnRpbWUoKTtcbiAgICBjYXNlIFwiaXNvRGF0ZXRpbWVcIjpcbiAgICAgIHJldHVybiB6Lmlzby5kYXRldGltZSgpO1xuICAgIGNhc2UgXCJpc29EdXJhdGlvblwiOlxuICAgICAgcmV0dXJuIHouaXNvLmR1cmF0aW9uKCk7XG4gICAgLy8gaGFzaCDtj6zrp7fsnYAgei5oYXNoKFwiYWxnb3JpdGhtXCIpIO2Yle2DnFxuICAgIGNhc2UgXCJoYXNoTWQ1XCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwibWQ1XCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhMVwiOlxuICAgICAgcmV0dXJuIHouaGFzaChcInNoYTFcIik7XG4gICAgY2FzZSBcImhhc2hTaGEyNTZcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGEyNTZcIik7XG4gICAgY2FzZSBcImhhc2hTaGEzODRcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGEzODRcIik7XG4gICAgY2FzZSBcImhhc2hTaGE1MTJcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGE1MTJcIik7XG4gICAgLy8g6riw67O4IO2PrOunt+ydgCB6Lnh4eCgpIO2Yle2DnCAoWm9kIDQpXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAoeiBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsICgpID0+IHouWm9kVHlwZT4pW2Zvcm1hdF0oKTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoUgSUTroZzrtoDthLAg64+Z7KCB7Jy866GcIFpvZCDsiqTtgqTrp4jrpbwg66Gc65Oc7ZWp64uI64ukLlxuICog64K07J6lIO2DgOyehShCVUlMVF9JTl9UWVBFX0lEUynsnYAg67CU66GcIOuwmO2ZmO2VmOqzoCxcbiAqIOq3uCDsmbjripQgZGlzdCDrlJTroInthqDrpqzsl5DshJwgRVNN7Jy866GcIGltcG9ydO2VmOyXrCDqsIDsoLjsmLXri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRab2RUeXBlQnlJZCh6b2RUeXBlSWQ6IHN0cmluZyk6IFByb21pc2U8ei5ab2RUeXBlQW55PiB7XG4gIC8vIOuCtOyepSDtg4DsnoUg7LKY66asXG4gIGlmICgoQlVJTFRfSU5fVFlQRV9JRFMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHpvZFR5cGVJZCkpIHtcbiAgICBjb25zdCBidWlsdEluVHlwZSA9IEJVSUxUX0lOX1RZUEVTW3pvZFR5cGVJZCBhcyBrZXlvZiB0eXBlb2YgQlVJTFRfSU5fVFlQRVNdO1xuICAgIGlmICghYnVpbHRJblR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg64K07J6lIO2DgOyehSAke3pvZFR5cGVJZH3snZgg7Iqk7YKk66eI6rCAIOygleydmOuQmOyngCDslYrslZjsirXri4jri6RgKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWx0SW5UeXBlLnNjaGVtYS5kZXNjcmliZSh6b2RUeXBlSWQpO1xuICB9XG5cbiAgLy8g7ZSE66Gc7KCd7Yq47JeQ7IScIOygleydmO2VnCDtg4DsnoUg64+Z7KCBIOuhnOuTnFxuICBjb25zdCBtb2R1bGVQYXRoID0gRW50aXR5TWFuYWdlci5nZXRNb2R1bGVQYXRoKHpvZFR5cGVJZCk7XG4gIGNvbnN0IG1vZHVsZUFic1BhdGggPSBwYXRoLmpvaW4oXG4gICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgIHJ1bnRpbWVQYXRoKGBkaXN0L2FwcGxpY2F0aW9uLyR7bW9kdWxlUGF0aH0uanNgKSxcbiAgKTtcbiAgY29uc3QgaW1wb3J0VXJsID0gY3JlYXRlSW1wb3J0VXJsKG1vZHVsZUFic1BhdGgpO1xuICBjb25zdCBpbXBvcnRlZCA9IGF3YWl0IGltcG9ydChpbXBvcnRVcmwpO1xuXG4gIGlmICghaW1wb3J0ZWRbem9kVHlwZUlkXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCB6b2RUeXBlSWQgJHt6b2RUeXBlSWR9YCk7XG4gIH1cbiAgcmV0dXJuIGltcG9ydGVkW3pvZFR5cGVJZF0uZGVzY3JpYmUoem9kVHlwZUlkKTtcbn1cblxuLyoqXG4gKiBFbnRpdHlQcm9w7J2EIFpvZCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICog6rCBIHByb3DsnZgg7YOA7J6F7JeQIOuUsOudvCDsoIHsoIjtlZwgWm9kIHZhbGlkYXRvcuulvCDsg53shLHtlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9wVG9ab2RUeXBlKHByb3A6IEVudGl0eVByb3ApOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICBsZXQgem9kVHlwZTogei5ab2RUeXBlQW55ID0gei51bmtub3duKCk7XG4gIGlmIChpc0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCk7XG4gIH0gZWxzZSBpZiAoaXNJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYmlnaW50KCk7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYmlnaW50KCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0VudW1TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSAoYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCkpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICB6b2RUeXBlID0gem9kRm9ybWF0VG9UeXBlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCAmJiBcIm1heFwiIGluIHpvZFR5cGUpIHtcbiAgICAgICAgem9kVHlwZSA9ICh6b2RUeXBlIGFzIHouWm9kU3RyaW5nKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1N0cmluZ0FycmF5UHJvcChwcm9wKSkge1xuICAgIGxldCBlbGVtZW50VHlwZTogei5ab2RUeXBlO1xuICAgIGlmIChwcm9wLnpvZEZvcm1hdCkge1xuICAgICAgZWxlbWVudFR5cGUgPSB6b2RGb3JtYXRUb1R5cGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoICYmIFwibWF4XCIgaW4gZWxlbWVudFR5cGUpIHtcbiAgICAgICAgZWxlbWVudFR5cGUgPSAoZWxlbWVudFR5cGUgYXMgei5ab2RTdHJpbmcpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgZWxlbWVudFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnRUeXBlID0gei5zdHJpbmcoKTtcbiAgICB9XG4gICAgem9kVHlwZSA9IGVsZW1lbnRUeXBlLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5ib29sZWFuKCk7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYm9vbGVhbigpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNEYXRlU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmRhdGUoKTtcbiAgfSBlbHNlIGlmIChpc0RhdGVBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5kYXRlKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc1V1aWRTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoudXVpZCgpO1xuICB9IGVsc2UgaWYgKGlzVXVpZEFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnV1aWQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzSnNvblByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmFycmF5KHoubnVtYmVyKCkpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYXJyYXkoei5hcnJheSh6Lm51bWJlcigpKSk7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSB7XG4gICAgICAvLyBGSyDtg4DsnoXsnYQg7LC47KGwIOyXlO2LsO2LsCBQSyDtg4DsnoXsl5Ag65Sw6528IOqysOyglVxuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgIGNvbnN0IHBrVHlwZSA9IHJlbEVudGl0eS5nZXRQa1R5cGUoKTtcbiAgICAgIGlmIChwa1R5cGUgPT09IFwic3RyaW5nXCIgfHwgcGtUeXBlID09PSBcInV1aWRcIikge1xuICAgICAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHByb3DsnYQgem9kVHlwZeycvOuhnCDrs4DtmZjtlZjripTrjbAg7Iuk7YyoICR7cHJvcH19YCk7XG4gIH1cblxuICBpZiAoKHByb3AgYXMgeyB1bnNpZ25lZD86IGJvb2xlYW4gfSkudW5zaWduZWQpIHtcbiAgICB6b2RUeXBlID0gKHpvZFR5cGUgYXMgei5ab2ROdW1iZXIpLm5vbm5lZ2F0aXZlKCk7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICB6b2RUeXBlID0gem9kVHlwZS5udWxsYWJsZSgpO1xuICB9XG5cbiAgcmV0dXJuIHpvZFR5cGU7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BUb1pvZFR5cGVEZWYocHJvcDogRW50aXR5UHJvcCwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBsZXQgc3RtdDogc3RyaW5nO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpYDtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5pbnQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KClgO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJpZ2ludCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9LmFycmF5KClgO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC56b2RGb3JtYXQpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB6b2RGb3JtYXRUb0NvZGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke2Jhc2V9Lm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RyaW5nQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICBjb25zdCBiYXNlID0gem9kRm9ybWF0VG9Db2RlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtiYXNlfS5tYXgoJHtwcm9wLmxlbmd0aH0pLmFycmF5KClgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX0uYXJyYXkoKWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkubWF4KCR7cHJvcC5sZW5ndGh9KS5hcnJheSgpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkuYXJyYXkoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTnVtYmVyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpYDtcbiAgfSBlbHNlIGlmIChpc051bWJlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmRhdGUoKWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouZGF0ZSgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5ib29sZWFuKClgO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhbkFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJvb2xlYW4oKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc1V1aWRTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoudXVpZCgpYDtcbiAgfSBlbHNlIGlmIChpc1V1aWRBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei51dWlkKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIC8vIOuCtOyepSDtg4DsnoXsnbgg6rK97JqwIOyKpO2CpOuniCDsnbTrpoTsnLzroZwg67OA7ZmYXG4gICAgaWYgKChCVUlMVF9JTl9UWVBFX0lEUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMocHJvcC5pZCkpIHtcbiAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBwcm9wLmlkID09PSBcIlNvbmFtdUZpbGVcIiA/IFwiU29uYW11RmlsZVNjaGVtYVwiIDogXCJTb25hbXVGaWxlQXJyYXlTY2hlbWFcIjtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3NjaGVtYU5hbWV9YDtcbiAgICAgIGluamVjdEltcG9ydEtleXMucHVzaChzY2hlbWFOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH1gO1xuICAgICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1NlYXJjaFRleHRQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKClgO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmFycmF5KHoubnVtYmVyKCkpYDtcbiAgfSBlbHNlIGlmIChpc1ZlY3RvckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmFycmF5KHouYXJyYXkoei5udW1iZXIoKSkpYDtcbiAgfSBlbHNlIGlmIChpc1RzVmVjdG9yUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgfSBlbHNlIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH1gO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSB7XG4gICAgICAvLyBGSyBab2Qg7YOA7J6F7J2EIOywuOyhsCDsl5Tti7Dti7AgUEsg7YOA7J6F7JeQIOuUsOudvCDqsrDsoJVcbiAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICBjb25zdCBwa1R5cGUgPSByZWxFbnRpdHkuZ2V0UGtUeXBlKCk7XG4gICAgICBpZiAocGtUeXBlID09PSBcInN0cmluZ1wiIHx8IHBrVHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX1faWQ6IHouc3RyaW5nKClgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX1faWQ6IHouaW50KClgO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyDqt7jsmbggcmVsYXRpb24g7LyA7J207IqkIOygnOyZuFxuICAgICAgcmV0dXJuIGAvLyAke3Byb3AubmFtZX06ICR7cHJvcC5yZWxhdGlvblR5cGV9ICR7cHJvcC53aXRofWA7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIi8vIHVuYWJsZSB0byByZXNvbHZlXCI7XG4gIH1cblxuICBpZiAoKHByb3AgYXMgeyB1bnNpZ25lZD86IGJvb2xlYW4gfSkudW5zaWduZWQpIHtcbiAgICBzdG10ICs9IFwiLm5vbm5lZ2F0aXZlKClcIjtcbiAgfVxuICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgIHN0bXQgKz0gXCIubnVsbGFibGUoKVwiO1xuICB9XG5cbiAgLy8gbnVtZXJpYyDtg4DsnoXsnZgg6rK97JqwIG51bGxhYmxlIOydtO2bhOyXkCBtZXRhIOy2lOqwgCAo66mU7YOA642w7J207YSw6rCAIOy1nOyDgeychCDroIjrsqjsl5Ag7J6I7Ja07JW8IO2VqClcbiAgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkgfHwgaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCArPSAnLm1ldGEoeyBTb25hbXVQcm9wVHlwZTogXCJudW1lcmljXCIgfSknO1xuICB9XG5cbiAgcmV0dXJuIGAke3N0bXR9LGA7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcE5vZGXrpbwgWm9kIO2DgOyehSDsoJXsnZgg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBwbGFpbiwgYXJyYXksIG9iamVjdCDrhbjrk5wg7YOA7J6F7J2EIOyerOq3gOyggeycvOuhnCDsspjrpqztlZjsl6wg7KSR7LKpIOq1rOyhsOulvCDsp4Dsm5Dtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wTm9kZVRvWm9kVHlwZURlZihwcm9wTm9kZTogRW50aXR5UHJvcE5vZGUsIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcInBsYWluXCIpIHtcbiAgICByZXR1cm4gcHJvcFRvWm9kVHlwZURlZihwcm9wTm9kZS5wcm9wLCBpbmplY3RJbXBvcnRLZXlzKTtcbiAgfSBlbHNlIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb3BOb2RlLnByb3AgPyBgJHtwcm9wTm9kZS5wcm9wLm5hbWV9OiBgIDogXCJcIixcbiAgICAgIFwiei5hcnJheSh6Lm9iamVjdCh7XCIsXG4gICAgICBwcm9wTm9kZS5jaGlsZHJlblxuICAgICAgICAubWFwKChjaGlsZFByb3BOb2RlKSA9PiBwcm9wTm9kZVRvWm9kVHlwZURlZihjaGlsZFByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICBcIlwiLFxuICAgICAgXCJ9KSksXCIsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9IGVsc2UgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb3BOb2RlLnByb3AgPyBgJHtwcm9wTm9kZS5wcm9wLm5hbWV9OiBgIDogXCJcIixcbiAgICAgIFwiei5vYmplY3Qoe1wiLFxuICAgICAgcHJvcE5vZGUuY2hpbGRyZW5cbiAgICAgICAgLm1hcCgoY2hpbGRQcm9wTm9kZSkgPT4gcHJvcE5vZGVUb1pvZFR5cGVEZWYoY2hpbGRQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5cykpXG4gICAgICAgIC5qb2luKFwiXFxuXCIpLFxuICAgICAgXCJcIixcbiAgICAgIGB9KSR7cHJvcE5vZGUucHJvcD8ubnVsbGFibGUgPyBcIi5udWxsYWJsZSgpXCIgOiBcIlwifSxgLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBFcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvVHNUeXBlRGVmKHp0OiB6LlpvZFR5cGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHp0LmRlZi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICBjYXNlIFwibnVsbFwiOlxuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICBjYXNlIFwibmV2ZXJcIjpcbiAgICAgIHJldHVybiB6dC5kZWYudHlwZTtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIFwiRGF0ZVwiO1xuICAgIGNhc2UgXCJudWxsYWJsZVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kTnVsbGFibGUpLmRlZi5pbm5lclR5cGUpfSB8IG51bGxgO1xuICAgIGNhc2UgXCJkZWZhdWx0XCI6XG4gICAgICByZXR1cm4gem9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2REZWZhdWx0KS5kZWYuaW5uZXJUeXBlKTtcbiAgICBjYXNlIFwicmVjb3JkXCI6IHtcbiAgICAgIGNvbnN0IHJlY29yZFR5cGUgPSB6dCBhcyBBbnlab2RSZWNvcmQ7XG4gICAgICByZXR1cm4gYHsgWyBrZXk6ICR7em9kVHlwZVRvVHNUeXBlRGVmKHJlY29yZFR5cGUuZGVmLmtleVR5cGUpfSBdOiAke3pvZFR5cGVUb1RzVHlwZURlZihyZWNvcmRUeXBlLmRlZi52YWx1ZVR5cGUpfX1gO1xuICAgIH1cbiAgICBjYXNlIFwibGl0ZXJhbFwiOlxuICAgICAgcmV0dXJuIEFycmF5LmZyb20oKHp0IGFzIHouWm9kTGl0ZXJhbCkudmFsdWVzKVxuICAgICAgICAubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBgbnVsbGA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBgdW5kZWZpbmVkYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIgfCBcIik7XG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4gYCR7KHp0IGFzIEFueVpvZFVuaW9uKS5vcHRpb25zXG4gICAgICAgIC5tYXAoKG9wdGlvbikgPT4gem9kVHlwZVRvVHNUeXBlRGVmKG9wdGlvbikpXG4gICAgICAgIC5qb2luKFwiIHwgXCIpfWA7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIHJldHVybiBgJHsoenQgYXMgei5ab2RFbnVtKS5vcHRpb25zLm1hcCgodmFsKSA9PiBgXCIke3ZhbH1cImApLmpvaW4oXCIgfCBcIil9YDtcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZEFycmF5KS5lbGVtZW50KX1bXWA7XG4gICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICBjb25zdCBzaGFwZSA9ICh6dCBhcyBBbnlab2RPYmplY3QpLnNoYXBlO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXCJ7XCIsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKHNoYXBlKS5tYXAoKGtleSkgPT4ge1xuICAgICAgICAgIGlmIChzaGFwZVtrZXldLmRlZi50eXBlID09PSBcIm9wdGlvbmFsXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtrZXl9PzogJHt6b2RUeXBlVG9Uc1R5cGVEZWYoc2hhcGVba2V5XS5kZWYuaW5uZXJUeXBlKX0sYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX06ICR7em9kVHlwZVRvVHNUeXBlRGVmKHNoYXBlW2tleV0pfSxgO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIFwifVwiLFxuICAgICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgICBjYXNlIFwib3B0aW9uYWxcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZE9wdGlvbmFsKS5kZWYuaW5uZXJUeXBlKX0gfCB1bmRlZmluZWRgO1xuICAgIGNhc2UgXCJ0ZW1wbGF0ZV9saXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGRlZiA9ICh6dCBhcyBBbnlab2RUZW1wbGF0ZUxpdGVyYWwpLmRlZjtcblxuICAgICAgLy8g67mIIHRlbXBsYXRlIGxpdGVyYWzsnYAgc3RyaW5n7Jy866GcIO2PtOuwsVxuICAgICAgaWYgKCFkZWYucGFydHMgfHwgZGVmLnBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICAgIH1cblxuICAgICAgLy8g6rCBIHBhcnTrpbwgVHlwZVNjcmlwdCDtg4DsnoUg66y47J6Q7Je066GcIOuzgO2ZmFxuICAgICAgY29uc3QgcGFydHMgPSBkZWYucGFydHMubWFwKChwYXJ0OiB1bmtub3duKSA9PiB7XG4gICAgICAgIC8vIOumrO2EsOuftCDqsJIgKHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBudWxsLCB1bmRlZmluZWQpXG4gICAgICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBgJHtwYXJ0fWA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBab2RUeXBlIC0g7J6s6reA7KCB7Jy866GcIOuzgO2ZmFxuICAgICAgICBpZiAocGFydCAmJiB0eXBlb2YgcGFydCA9PT0gXCJvYmplY3RcIiAmJiAocGFydCBhcyB6LlpvZFR5cGUpLl96b2QpIHtcbiAgICAgICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUeXBlVG9Uc1R5cGVEZWYocGFydCBhcyB6LlpvZFR5cGUpO1xuICAgICAgICAgIHJldHVybiBgJFxceyR7aW5uZXJUeXBlfX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7Y+067CxXG4gICAgICAgIHJldHVybiBgXFwke3N0cmluZ31gO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBgXFxgJHtwYXJ0cy5qb2luKFwiXCIpfVxcYGA7XG4gICAgfVxuICAgIGNhc2UgXCJmaWxlXCI6XG4gICAgICByZXR1cm4gXCJGaWxlXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7LKY66as65CY7KeAIOyViuydgCBab2RUeXBlICR7enQuZGVmLnR5cGV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6FIOyduOyKpO2EtOyKpOulvCDtlbTri7ntlZjripQgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvWm9kQ29kZSh6dDogei5ab2RUeXBlKTogc3RyaW5nIHtcbiAgc3dpdGNoICh6dC5kZWYudHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBcInouc3RyaW5nKClcIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bWJlcigpXCI7XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIFwiei5iaWdpbnQoKVwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJ6LmJvb2xlYW4oKVwiO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJ6LmRhdGUoKVwiO1xuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bGwoKVwiO1xuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgIHJldHVybiBcInoudW5kZWZpbmVkKClcIjtcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgICByZXR1cm4gXCJ6LmFueSgpXCI7XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICAgIHJldHVybiBcInoudW5rbm93bigpXCI7XG4gICAgY2FzZSBcIm5ldmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm5ldmVyKClcIjtcbiAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKCh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSl9Lm51bGxhYmxlKClgO1xuICAgIGNhc2UgXCJkZWZhdWx0XCI6IHtcbiAgICAgIGNvbnN0IHpEZWZhdWx0RGVmID0gKHp0IGFzIEFueVpvZERlZmF1bHQpLmRlZjtcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKHpEZWZhdWx0RGVmLmlubmVyVHlwZSl9LmRlZmF1bHQoJHt6RGVmYXVsdERlZi5kZWZhdWx0VmFsdWV9KWA7XG4gICAgfVxuICAgIGNhc2UgXCJyZWNvcmRcIjoge1xuICAgICAgY29uc3QgelJlY29yZERlZiA9ICh6dCBhcyBBbnlab2RSZWNvcmQpLmRlZjtcbiAgICAgIHJldHVybiBgei5yZWNvcmQoJHt6b2RUeXBlVG9ab2RDb2RlKHpSZWNvcmREZWYua2V5VHlwZSl9LCAke3pvZFR5cGVUb1pvZENvZGUoXG4gICAgICAgIHpSZWNvcmREZWYudmFsdWVUeXBlLFxuICAgICAgKX0pYDtcbiAgICB9XG4gICAgY2FzZSBcImxpdGVyYWxcIjoge1xuICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5mcm9tKCh6dCBhcyB6LlpvZExpdGVyYWw8c3RyaW5nIHwgbnVtYmVyPikudmFsdWVzKS5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gYG51bGxgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gYHVuZGVmaW5lZGA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBgei5saXRlcmFsKCR7aXRlbXNbMF19KWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYHoubGl0ZXJhbChbJHtpdGVtcy5qb2luKFwiLCBcIil9XSlgO1xuICAgIH1cbiAgICBjYXNlIFwidW5pb25cIjpcbiAgICAgIHJldHVybiBgei51bmlvbihbJHsoenQgYXMgQW55Wm9kVW5pb24pLmRlZi5vcHRpb25zXG4gICAgICAgIC5tYXAoKG9wdGlvbjogei5ab2RUeXBlKSA9PiB6b2RUeXBlVG9ab2RDb2RlKG9wdGlvbikpXG4gICAgICAgIC5qb2luKFwiLFwiKX1dKWA7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIC8vIE5PVEU6IHouZW51bShbXCJBXCIsIFwiQlwiXSnrj4Qgei5lbnVtKHsgQTogXCJBXCIsIEI6IFwiQlwiIH0p66GcIOyymOumrOuQqC5cbiAgICAgIHJldHVybiBgei5lbnVtKHske09iamVjdC5lbnRyaWVzKCh6dCBhcyB6LlpvZEVudW0pLmRlZi5lbnRyaWVzKVxuICAgICAgICAubWFwKChba2V5LCB2YWxdKSA9PiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIiA/IGAke2tleX06IFwiJHt2YWx9XCJgIDogYCR7a2V5fTogJHt2YWx9YCkpXG4gICAgICAgIC5qb2luKFwiLCBcIil9fSlgO1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgcmV0dXJuIGB6LmFycmF5KCR7em9kVHlwZVRvWm9kQ29kZSgoenQgYXMgei5ab2RBcnJheTx6LlpvZFR5cGU+KS5kZWYuZWxlbWVudCl9KWA7XG4gICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICBjb25zdCBzaGFwZSA9ICh6dCBhcyBBbnlab2RPYmplY3QpLnNoYXBlO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXCJ6Lm9iamVjdCh7XCIsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKHNoYXBlKS5tYXAoKGtleSkgPT4gYCR7a2V5fTogJHt6b2RUeXBlVG9ab2RDb2RlKHNoYXBlW2tleV0pfSxgKSxcbiAgICAgICAgXCJ9KVwiLFxuICAgICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgICBjYXNlIFwib3B0aW9uYWxcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKCh6dCBhcyB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUpfS5vcHRpb25hbCgpYDtcbiAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgcmV0dXJuIGB6LmZpbGUoKWA7XG4gICAgY2FzZSBcInRlbXBsYXRlX2xpdGVyYWxcIjoge1xuICAgICAgY29uc3QgZGVmID0gKHp0IGFzIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCkuZGVmO1xuXG4gICAgICAvLyDruYggdGVtcGxhdGUgbGl0ZXJhbFxuICAgICAgaWYgKCFkZWYucGFydHMgfHwgZGVmLnBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gXCJ6LnRlbXBsYXRlTGl0ZXJhbChbXSlcIjtcbiAgICAgIH1cblxuICAgICAgLy8g6rCBIHBhcnTrpbwgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGRlZi5wYXJ0cy5tYXAoKHBhcnQ6IHVua25vd24pID0+IHtcbiAgICAgICAgLy8g66y47J6Q7Je0IOumrO2EsOuftFxuICAgICAgICBpZiAodHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gYFwiJHtwYXJ0fVwiYDtcbiAgICAgICAgfVxuICAgICAgICAvLyBab2RUeXBlIC0g7J6s6reA7KCB7Jy866GcIOuzgO2ZmFxuICAgICAgICBpZiAocGFydCAmJiB0eXBlb2YgcGFydCA9PT0gXCJvYmplY3RcIiAmJiAocGFydCBhcyB6LlpvZFR5cGUpLl96b2QpIHtcbiAgICAgICAgICByZXR1cm4gem9kVHlwZVRvWm9kQ29kZShwYXJ0IGFzIHouWm9kVHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDtj7TrsLFcbiAgICAgICAgcmV0dXJuIFwiei5zdHJpbmcoKVwiO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBgei50ZW1wbGF0ZUxpdGVyYWwoWyR7cGFydHMuam9pbihcIiwgXCIpfV0pYDtcbiAgICB9XG4gICAgY2FzZSBcImludGVyc2VjdGlvblwiOiB7XG4gICAgICBjb25zdCB6SW50ZXJzZWN0aW9uRGVmID0gKHp0IGFzIHouWm9kSW50ZXJzZWN0aW9uPHouWm9kVHlwZSwgei5ab2RUeXBlPikuZGVmO1xuICAgICAgcmV0dXJuIGB6LmludGVyc2VjdGlvbigke3pvZFR5cGVUb1pvZENvZGUoekludGVyc2VjdGlvbkRlZi5sZWZ0KX0sICR7em9kVHlwZVRvWm9kQ29kZSh6SW50ZXJzZWN0aW9uRGVmLnJpZ2h0KX0pYDtcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7LKY66as65CY7KeAIOyViuydgCBab2RUeXBlICR7enQuZGVmLnR5cGV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6F7J2EIFVJIOugjOuNlOungeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOyerOq3gOyggeycvOuhnCDspJHssqnrkJwg7YOA7J6F65Ok7J2EIOyymOumrO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gIHpvZFR5cGU6IHouWm9kVHlwZUFueSxcbiAgYmFzZUtleTogc3RyaW5nID0gXCJyb290XCIsXG4pOiBSZW5kZXJpbmdOb2RlIHtcbiAgY29uc3QgZGVmID0ge1xuICAgIG5hbWU6IGJhc2VLZXksXG4gICAgbGFiZWw6IGluZmxlY3Rpb24uY2FtZWxpemUoYmFzZUtleSwgZmFsc2UpLFxuICAgIHpvZFR5cGUsXG4gIH07XG5cbiAgLyoqXG4gICAqIOy8gOydtOyKpCDsspjrpqwg7Iic7IScXG4gICAqXG4gICAqIDEuIO2KueyImCDsvIDsnbTsiqQgKGRlc2NyaXB0aW9uIOq4sOuwmClcbiAgICogICAgLSBTb25hbXVGaWxlL1NvbmFtdUZpbGVbXSA6IHoub2JqZWN0L3ouYXJyYXnsnbTsp4Drp4wg7YyM7J28IOyXheuhnOuTnOyaqSDrgrTsnqUg7YOA7J6FXG4gICAqXG4gICAqIDIuIOydvOuwmCDsvIDsnbTsiqQgKGluc3RhbmNlb2Yg6riw67CYKVxuICAgKiAgICAtIHouWm9kT2JqZWN0IDog7J2867CYIOqwneyytFxuICAgKiAgICAtIHouWm9kQXJyYXkgOiDsnbzrsJgg67Cw7Je0XG4gICAqICAgICAgLSB2ZWN0b3IgOiB6LmFycmF5KHoubnVtYmVyKeydtOyngOunjCDrhKTsnbTrsI0g6riw67CY7Jy866GcIOuyoe2EsCDsnoTrsqDrlKlcbiAgICogICAgICAtIOydvOuwmCDrsLDsl7QgOiDqt7gg7Jm4XG4gICAqICAgIC0gei5ab2RVbmlvbiwgei5ab2RPcHRpb25hbCwgei5ab2ROdWxsYWJsZSA6IOycoO2LuOumrO2LsCDtg4DsnoVcbiAgICogICAgLSDquLDtg4AgOiByZXNvbHZlUmVuZGVyVHlwZSgp7Jy866GcIOyymOumrFxuICAgKi9cblxuICAvLyDtirnsiJgg7LyA7J207IqkOiBTb25hbXVGaWxlW10g7YOA7J6FIOqwkOyngFxuICBpZiAoem9kVHlwZS5kZXNjcmlwdGlvbiA9PT0gXCJTb25hbXVGaWxlW11cIikge1xuICAgIHJldHVybiB7IC4uLmRlZiwgcmVuZGVyVHlwZTogXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIiB9O1xuICB9XG5cbiAgLy8g7Yq57IiYIOy8gOydtOyKpDogU29uYW11RmlsZSDri6jsnbwg7YOA7J6FIOqwkOyngFxuICBpZiAoem9kVHlwZS5kZXNjcmlwdGlvbiA9PT0gXCJTb25hbXVGaWxlXCIpIHtcbiAgICByZXR1cm4geyAuLi5kZWYsIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlXCIgfTtcbiAgfVxuXG4gIC8vIOydvOuwmCDsvIDsnbTsiqQ6IFpvZE9iamVjdCDssrTtgaxcbiAgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9iamVjdCkge1xuICAgIGNvbnN0IGNvbHVtbktleXMgPSBPYmplY3Qua2V5cyh6b2RUeXBlLnNoYXBlKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNvbHVtbktleXMubWFwKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFR5cGUuc2hhcGVba2V5XTtcbiAgICAgIHJldHVybiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGlubmVyVHlwZSwga2V5KTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogXCJvYmplY3RcIixcbiAgICAgIGNoaWxkcmVuLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQXJyYXkpIHtcbiAgICBjb25zdCBpbm5lclR5cGUgPSAoem9kVHlwZSBhcyB6LlpvZEFycmF5PHouWm9kVHlwZUFueT4pLmRlZi5lbGVtZW50O1xuICAgIC8vIHZlY3RvciDtg4DsnoUg7YyQ67OEOiBudW1iZXIg67Cw7Je07J2066m07IScIGVtYmVkZGluZywgdmVjdG9yIOuTseydmCDsnbTrpoTsnYQg6rCA7KeEIOqyveyasFxuICAgIGlmIChcbiAgICAgIGlubmVyVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVtYmVyICYmXG4gICAgICAoYmFzZUtleS5pbmNsdWRlcyhcImVtYmVkZGluZ1wiKSB8fCBiYXNlS2V5LmluY2x1ZGVzKFwidmVjdG9yXCIpKVxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmLFxuICAgICAgICByZW5kZXJUeXBlOiBcInZlY3RvclwiLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGVsZW1lbnQ6IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoaW5uZXJUeXBlLCBiYXNlS2V5KSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVuaW9uKSB7XG4gICAgY29uc3Qgb3B0aW9uTm9kZXMgPSAoem9kVHlwZSBhcyB6LlpvZFVuaW9uPHouWm9kVHlwZVtdPikuZGVmLm9wdGlvbnMubWFwKChvcHQpID0+XG4gICAgICB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKG9wdCwgYmFzZUtleSksXG4gICAgKTtcbiAgICAvLyBUT0RPOiBab2RVbmlvbuydtCDrk6TslrTsnojripQg6rK97JqwIO2VuOuTpOungVxuICAgIHJldHVybiBvcHRpb25Ob2Rlc1swXTtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RPcHRpb25hbCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi56b2RUeXBlVG9SZW5kZXJpbmdOb2RlKCh6b2RUeXBlIGFzIHouWm9kT3B0aW9uYWw8ei5ab2RUeXBlPikuZGVmLmlubmVyVHlwZSwgYmFzZUtleSksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bGxhYmxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoKHpvZFR5cGUgYXMgei5ab2ROdWxsYWJsZTx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLCBiYXNlS2V5KSxcbiAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IHJlc29sdmVSZW5kZXJUeXBlKGJhc2VLZXksIHpvZFR5cGUpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6F6rO8IO2CpCDsnbTrpoTsnLzroZzrtoDthLAg7KCB7KCI7ZWcIFJlbmRlclR5cGXsnYQg6rKw7KCV7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiByZXNvbHZlUmVuZGVyVHlwZShrZXk6IHN0cmluZywgem9kVHlwZTogei5ab2RUeXBlQW55KTogUmVuZGVyaW5nTm9kZVtcInJlbmRlclR5cGVcIl0ge1xuICBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRGF0ZSkge1xuICAgIHJldHVybiBcImRhdGV0aW1lXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouY29yZS4kWm9kU3RyaW5nKSB7XG4gICAgLy8gTk9URTogei5ab2RTdHJpbmfsnLzroZwg67mE6rWQ7ZWY66m0IHoudXJsKCksIHouZW1haWwoKSDrk7HsnZgg7YOA7J6F7JeQ7IScIOusuOygnOqwgCDsg53quLDrr4DroZwgei5jb3JlLiRab2RTdHJpbmfsnLzroZwg67mE6rWQ7ZWoXG4gICAgLy8gRklYTUU6IGVtYWls7J2064KYIHVybCDtg4DsnoUg65Ox7JeQIOuMgO2VnCDsspjrpqzqsIAg7ZWE7JqU7ZWoXG4gICAgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU1FMRGF0ZVRpbWVTdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGV0aW1lXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJkYXRlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZGF0ZVwiO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcImlkXCIpIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1pZFwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiX2lkXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZmtfaWRcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bWJlcikge1xuICAgIGlmIChrZXkgPT09IFwiaWRcIikge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLWlkXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJfaWRcIikpIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1ma19pZFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItcGxhaW5cIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQm9vbGVhbikge1xuICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RFbnVtKSB7XG4gICAgcmV0dXJuIFwiZW51bXNcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RSZWNvcmQpIHtcbiAgICByZXR1cm4gXCJyZWNvcmRcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RBbnkgfHwgem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5rbm93bikge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVuaW9uKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTGl0ZXJhbCkge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFRlbXBsYXRlTGl0ZXJhbCkge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUuZGVmLnR5cGUgPT09IFwiY3VzdG9tXCIpIHtcbiAgICByZXR1cm4gXCJvYmplY3RcIjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYO2DgOyehSDtjIzsi7Eg67aI6rCAICR7a2V5fSAke3pvZFR5cGUuZGVmLnR5cGV9YCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtHQSxTQUFTLGdCQUFnQixRQUFpQztDQUV4RCxNQUFNQSxhQUFxQztFQUN6QyxTQUFTO0VBQ1QsU0FBUztFQUNULGFBQWE7RUFDYixhQUFhO0VBQ2Q7Q0FHRCxNQUFNQyxjQUFzQztFQUMxQyxTQUFTO0VBQ1QsVUFBVTtFQUNWLFlBQVk7RUFDWixZQUFZO0VBQ1osWUFBWTtFQUNiO0FBRUQsS0FBSSxVQUFVLFlBQVk7QUFDeEIsU0FBTyxXQUFXOztBQUdwQixLQUFJLFVBQVUsYUFBYTtBQUN6QixTQUFPLFlBQVk7O0FBSXJCLFFBQU8sS0FBSyxPQUFPOzs7Ozs7QUFPckIsU0FBUyxnQkFBZ0IsUUFBb0M7QUFFM0QsU0FBUSxRQUFSO0VBQ0UsS0FBSyxVQUNILFFBQU9DLElBQUUsSUFBSSxNQUFNO0VBQ3JCLEtBQUssVUFDSCxRQUFPQSxJQUFFLElBQUksTUFBTTtFQUNyQixLQUFLLGNBQ0gsUUFBT0EsSUFBRSxJQUFJLFVBQVU7RUFDekIsS0FBSyxjQUNILFFBQU9BLElBQUUsSUFBSSxVQUFVO0VBRXpCLEtBQUssVUFDSCxRQUFPQSxJQUFFLEtBQUssTUFBTTtFQUN0QixLQUFLLFdBQ0gsUUFBT0EsSUFBRSxLQUFLLE9BQU87RUFDdkIsS0FBSyxhQUNILFFBQU9BLElBQUUsS0FBSyxTQUFTO0VBQ3pCLEtBQUssYUFDSCxRQUFPQSxJQUFFLEtBQUssU0FBUztFQUN6QixLQUFLLGFBQ0gsUUFBT0EsSUFBRSxLQUFLLFNBQVM7RUFFekIsUUFDRSxRQUFRQSxJQUFpRCxTQUFTOzs7Ozs7OztBQVN4RSxlQUFzQixlQUFlLFdBQTBDO0FBRTdFLEtBQUssa0JBQXdDLFNBQVMsVUFBVSxFQUFFO0VBQ2hFLE1BQU0sY0FBYyxlQUFlO0FBQ25DLE1BQUksQ0FBQyxhQUFhO0FBQ2hCLFNBQU0sSUFBSSxNQUFNLFNBQVMsVUFBVSxtQkFBbUI7O0FBRXhELFNBQU8sWUFBWSxPQUFPLFNBQVMsVUFBVTs7Q0FJL0MsTUFBTSxhQUFhLGNBQWMsY0FBYyxVQUFVO0NBQ3pELE1BQU0sZ0JBQWdCLEtBQUssS0FDekIsT0FBTyxhQUNQLFlBQVksb0JBQW9CLFdBQVcsS0FBSyxDQUNqRDtDQUNELE1BQU0sWUFBWSxnQkFBZ0IsY0FBYztDQUNoRCxNQUFNLFdBQVcsTUFBTSxPQUFPO0FBRTlCLEtBQUksQ0FBQyxTQUFTLFlBQVk7QUFDeEIsUUFBTSxJQUFJLE1BQU0scUJBQXFCLFlBQVk7O0FBRW5ELFFBQU8sU0FBUyxXQUFXLFNBQVMsVUFBVTs7Ozs7O0FBT2hELGVBQXNCLGNBQWMsTUFBeUM7Q0FDM0UsSUFBSUMsVUFBd0JELElBQUUsU0FBUztBQUN2QyxLQUFJLG9CQUFvQixLQUFLLEVBQUU7QUFDN0IsWUFBVUEsSUFBRSxRQUFRLENBQUMsS0FBSztZQUNqQixtQkFBbUIsS0FBSyxFQUFFO0FBQ25DLFlBQVVBLElBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPO1lBQ3pCLHVCQUF1QixLQUFLLEVBQUU7QUFDdkMsWUFBVUEsSUFBRSxRQUFRO1lBQ1gsc0JBQXNCLEtBQUssRUFBRTtBQUN0QyxZQUFVQSxJQUFFLFFBQVEsQ0FBQyxPQUFPO1lBQ25CLGlCQUFpQixLQUFLLEVBQUU7QUFDakMsWUFBVSxNQUFNLGVBQWUsS0FBSyxHQUFHO1lBQzlCLGdCQUFnQixLQUFLLEVBQUU7QUFDaEMsYUFBVyxNQUFNLGVBQWUsS0FBSyxHQUFHLEVBQUUsT0FBTztZQUN4QyxtQkFBbUIsS0FBSyxFQUFFO0FBQ25DLE1BQUksS0FBSyxXQUFXO0FBQ2xCLGFBQVUsZ0JBQWdCLEtBQUssVUFBVTtBQUN6QyxPQUFJLEtBQUssVUFBVSxTQUFTLFNBQVM7QUFDbkMsY0FBVyxRQUF3QixJQUFJLEtBQUssT0FBTzs7YUFFNUMsS0FBSyxRQUFRO0FBQ3RCLGFBQVVBLElBQUUsUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPO1NBQ2hDO0FBQ0wsYUFBVUEsSUFBRSxRQUFROztZQUViLGtCQUFrQixLQUFLLEVBQUU7RUFDbEMsSUFBSUU7QUFDSixNQUFJLEtBQUssV0FBVztBQUNsQixpQkFBYyxnQkFBZ0IsS0FBSyxVQUFVO0FBQzdDLE9BQUksS0FBSyxVQUFVLFNBQVMsYUFBYTtBQUN2QyxrQkFBZSxZQUE0QixJQUFJLEtBQUssT0FBTzs7YUFFcEQsS0FBSyxRQUFRO0FBQ3RCLGlCQUFjRixJQUFFLFFBQVEsQ0FBQyxJQUFJLEtBQUssT0FBTztTQUNwQztBQUNMLGlCQUFjQSxJQUFFLFFBQVE7O0FBRTFCLFlBQVUsWUFBWSxPQUFPO1lBQ3BCLG1CQUFtQixLQUFLLEVBQUU7QUFDbkMsWUFBVUEsSUFBRSxRQUFRO1lBQ1gsa0JBQWtCLEtBQUssRUFBRTtBQUNsQyxZQUFVQSxJQUFFLFFBQVEsQ0FBQyxPQUFPO1lBQ25CLG9CQUFvQixLQUFLLEVBQUU7QUFDcEMsWUFBVUEsSUFBRSxRQUFRO1lBQ1gsbUJBQW1CLEtBQUssRUFBRTtBQUNuQyxZQUFVQSxJQUFFLFFBQVEsQ0FBQyxPQUFPO1lBQ25CLG9CQUFvQixLQUFLLEVBQUU7QUFDcEMsWUFBVUEsSUFBRSxTQUFTO1lBQ1osbUJBQW1CLEtBQUssRUFBRTtBQUNuQyxZQUFVQSxJQUFFLFNBQVMsQ0FBQyxPQUFPO1lBQ3BCLGlCQUFpQixLQUFLLEVBQUU7QUFDakMsWUFBVUEsSUFBRSxNQUFNO1lBQ1QsZ0JBQWdCLEtBQUssRUFBRTtBQUNoQyxZQUFVQSxJQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ2pCLGlCQUFpQixLQUFLLEVBQUU7QUFDakMsWUFBVUEsSUFBRSxNQUFNO1lBQ1QsZ0JBQWdCLEtBQUssRUFBRTtBQUNoQyxZQUFVQSxJQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ2pCLFdBQVcsS0FBSyxFQUFFO0FBQzNCLFlBQVUsTUFBTSxlQUFlLEtBQUssR0FBRztZQUM5QixpQkFBaUIsS0FBSyxFQUFFO0FBQ2pDLFlBQVVBLElBQUUsUUFBUTtZQUNYLG1CQUFtQixLQUFLLEVBQUU7QUFDbkMsWUFBVUEsSUFBRSxNQUFNQSxJQUFFLFFBQVEsQ0FBQztZQUNwQixrQkFBa0IsS0FBSyxFQUFFO0FBQ2xDLFlBQVVBLElBQUUsTUFBTUEsSUFBRSxNQUFNQSxJQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzdCLGNBQWMsS0FBSyxFQUFFO0FBQzlCLFlBQVUsTUFBTSxlQUFlLEtBQUssR0FBRztZQUM5QixlQUFlLEtBQUssRUFBRTtBQUMvQixNQUFJLDJCQUEyQixLQUFLLElBQUssdUJBQXVCLEtBQUssSUFBSSxLQUFLLGVBQWdCO0dBRTVGLE1BQU0sWUFBWSxjQUFjLElBQUksS0FBSyxLQUFLO0dBQzlDLE1BQU0sU0FBUyxVQUFVLFdBQVc7QUFDcEMsT0FBSSxXQUFXLFlBQVksV0FBVyxRQUFRO0FBQzVDLGNBQVVBLElBQUUsUUFBUTtVQUNmO0FBQ0wsY0FBVUEsSUFBRSxRQUFRLENBQUMsS0FBSzs7O1FBR3pCO0FBQ0wsUUFBTSxJQUFJLE1BQU0sNEJBQTRCLEtBQUssR0FBRzs7QUFHdEQsS0FBSyxLQUFnQyxVQUFVO0FBQzdDLFlBQVcsUUFBd0IsYUFBYTs7QUFFbEQsS0FBSSxLQUFLLFVBQVU7QUFDakIsWUFBVSxRQUFRLFVBQVU7O0FBRzlCLFFBQU87Ozs7O0FBTVQsU0FBZ0IsaUJBQWlCLE1BQWtCLGtCQUFvQztDQUNyRixJQUFJRztBQUNKLEtBQUksb0JBQW9CLEtBQUssRUFBRTtBQUM3QixTQUFPLEdBQUcsS0FBSyxLQUFLO1lBQ1gsbUJBQW1CLEtBQUssRUFBRTtBQUNuQyxTQUFPLEdBQUcsS0FBSyxLQUFLO1lBQ1gsdUJBQXVCLEtBQUssRUFBRTtBQUN2QyxTQUFPLEdBQUcsS0FBSyxLQUFLO1lBQ1gsc0JBQXNCLEtBQUssRUFBRTtBQUN0QyxTQUFPLEdBQUcsS0FBSyxLQUFLO1lBQ1gsaUJBQWlCLEtBQUssRUFBRTtBQUNqQyxTQUFPLEdBQUcsS0FBSyxLQUFLLElBQUksS0FBSztBQUM3QixtQkFBaUIsS0FBSyxLQUFLLEdBQUc7WUFDckIsZ0JBQWdCLEtBQUssRUFBRTtBQUNoQyxTQUFPLEdBQUcsS0FBSyxLQUFLLElBQUksS0FBSyxHQUFHO0FBQ2hDLG1CQUFpQixLQUFLLEtBQUssR0FBRztZQUNyQixtQkFBbUIsS0FBSyxFQUFFO0FBQ25DLE1BQUksS0FBSyxXQUFXO0dBQ2xCLE1BQU0sT0FBTyxnQkFBZ0IsS0FBSyxVQUFVO0FBQzVDLE9BQUksS0FBSyxRQUFRO0FBQ2YsV0FBTyxHQUFHLEtBQUssS0FBSyxJQUFJLEtBQUssT0FBTyxLQUFLLE9BQU87VUFDM0M7QUFDTCxXQUFPLEdBQUcsS0FBSyxLQUFLLElBQUk7O2FBRWpCLEtBQUssUUFBUTtBQUN0QixVQUFPLEdBQUcsS0FBSyxLQUFLLG1CQUFtQixLQUFLLE9BQU87U0FDOUM7QUFDTCxVQUFPLEdBQUcsS0FBSyxLQUFLOztZQUViLGtCQUFrQixLQUFLLEVBQUU7QUFDbEMsTUFBSSxLQUFLLFdBQVc7R0FDbEIsTUFBTSxPQUFPLGdCQUFnQixLQUFLLFVBQVU7QUFDNUMsT0FBSSxLQUFLLFFBQVE7QUFDZixXQUFPLEdBQUcsS0FBSyxLQUFLLElBQUksS0FBSyxPQUFPLEtBQUssT0FBTztVQUMzQztBQUNMLFdBQU8sR0FBRyxLQUFLLEtBQUssSUFBSSxLQUFLOzthQUV0QixLQUFLLFFBQVE7QUFDdEIsVUFBTyxHQUFHLEtBQUssS0FBSyxtQkFBbUIsS0FBSyxPQUFPO1NBQzlDO0FBQ0wsVUFBTyxHQUFHLEtBQUssS0FBSzs7WUFFYixtQkFBbUIsS0FBSyxFQUFFO0FBQ25DLFNBQU8sR0FBRyxLQUFLLEtBQUs7WUFDWCxrQkFBa0IsS0FBSyxFQUFFO0FBQ2xDLFNBQU8sR0FBRyxLQUFLLEtBQUs7WUFDWCxvQkFBb0IsS0FBSyxFQUFFO0FBQ3BDLFNBQU8sR0FBRyxLQUFLLEtBQUs7WUFDWCxtQkFBbUIsS0FBSyxFQUFFO0FBQ25DLFNBQU8sR0FBRyxLQUFLLEtBQUs7WUFDWCxpQkFBaUIsS0FBSyxFQUFFO0FBQ2pDLFNBQU8sR0FBRyxLQUFLLEtBQUs7WUFDWCxnQkFBZ0IsS0FBSyxFQUFFO0FBQ2hDLFNBQU8sR0FBRyxLQUFLLEtBQUs7WUFDWCxvQkFBb0IsS0FBSyxFQUFFO0FBQ3BDLFNBQU8sR0FBRyxLQUFLLEtBQUs7WUFDWCxtQkFBbUIsS0FBSyxFQUFFO0FBQ25DLFNBQU8sR0FBRyxLQUFLLEtBQUs7WUFDWCxpQkFBaUIsS0FBSyxFQUFFO0FBQ2pDLFNBQU8sR0FBRyxLQUFLLEtBQUs7WUFDWCxnQkFBZ0IsS0FBSyxFQUFFO0FBQ2hDLFNBQU8sR0FBRyxLQUFLLEtBQUs7WUFDWCxXQUFXLEtBQUssRUFBRTtBQUUzQixNQUFLLGtCQUF3QyxTQUFTLEtBQUssR0FBRyxFQUFFO0dBQzlELE1BQU0sYUFBYSxLQUFLLE9BQU8sZUFBZSxxQkFBcUI7QUFDbkUsVUFBTyxHQUFHLEtBQUssS0FBSyxJQUFJO0FBQ3hCLG9CQUFpQixLQUFLLFdBQVc7U0FDNUI7QUFDTCxVQUFPLEdBQUcsS0FBSyxLQUFLLElBQUksS0FBSztBQUM3QixvQkFBaUIsS0FBSyxLQUFLLEdBQUc7O1lBRXZCLGlCQUFpQixLQUFLLEVBQUU7QUFDakMsU0FBTyxHQUFHLEtBQUssS0FBSztZQUNYLG1CQUFtQixLQUFLLEVBQUU7QUFDbkMsU0FBTyxHQUFHLEtBQUssS0FBSztZQUNYLGtCQUFrQixLQUFLLEVBQUU7QUFDbEMsU0FBTyxHQUFHLEtBQUssS0FBSztZQUNYLGVBQWUsS0FBSyxFQUFFO0FBQy9CLFNBQU8sR0FBRyxLQUFLLEtBQUs7WUFDWCxjQUFjLEtBQUssRUFBRTtBQUM5QixTQUFPLEdBQUcsS0FBSyxLQUFLLElBQUksS0FBSztBQUM3QixtQkFBaUIsS0FBSyxLQUFLLEdBQUc7WUFDckIsZUFBZSxLQUFLLEVBQUU7QUFDL0IsTUFBSSwyQkFBMkIsS0FBSyxJQUFLLHVCQUF1QixLQUFLLElBQUksS0FBSyxlQUFnQjtHQUU1RixNQUFNLFlBQVksY0FBYyxJQUFJLEtBQUssS0FBSztHQUM5QyxNQUFNLFNBQVMsVUFBVSxXQUFXO0FBQ3BDLE9BQUksV0FBVyxZQUFZLFdBQVcsUUFBUTtBQUM1QyxXQUFPLEdBQUcsS0FBSyxLQUFLO1VBQ2Y7QUFDTCxXQUFPLEdBQUcsS0FBSyxLQUFLOztTQUVqQjtBQUVMLFVBQU8sTUFBTSxLQUFLLEtBQUssSUFBSSxLQUFLLGFBQWEsR0FBRyxLQUFLOztRQUVsRDtBQUNMLFNBQU87O0FBR1QsS0FBSyxLQUFnQyxVQUFVO0FBQzdDLFVBQVE7O0FBRVYsS0FBSSxLQUFLLFVBQVU7QUFDakIsVUFBUTs7QUFJVixLQUFJLG9CQUFvQixLQUFLLElBQUksbUJBQW1CLEtBQUssRUFBRTtBQUN6RCxVQUFROztBQUdWLFFBQU8sR0FBRyxLQUFLOzs7Ozs7QUFPakIsU0FBZ0IscUJBQXFCLFVBQTBCLGtCQUFvQztBQUNqRyxLQUFJLFNBQVMsYUFBYSxTQUFTO0FBQ2pDLFNBQU8saUJBQWlCLFNBQVMsTUFBTSxpQkFBaUI7WUFDL0MsU0FBUyxhQUFhLFNBQVM7QUFDeEMsU0FBTztHQUNMLFNBQVMsT0FBTyxHQUFHLFNBQVMsS0FBSyxLQUFLLE1BQU07R0FDNUM7R0FDQSxTQUFTLFNBQ04sS0FBSyxrQkFBa0IscUJBQXFCLGVBQWUsaUJBQWlCLENBQUMsQ0FDN0UsS0FBSyxLQUFLO0dBQ2I7R0FDQTtHQUNELENBQUMsS0FBSyxLQUFLO1lBQ0gsU0FBUyxhQUFhLFVBQVU7QUFDekMsU0FBTztHQUNMLFNBQVMsT0FBTyxHQUFHLFNBQVMsS0FBSyxLQUFLLE1BQU07R0FDNUM7R0FDQSxTQUFTLFNBQ04sS0FBSyxrQkFBa0IscUJBQXFCLGVBQWUsaUJBQWlCLENBQUMsQ0FDN0UsS0FBSyxLQUFLO0dBQ2I7R0FDQSxLQUFLLFNBQVMsTUFBTSxXQUFXLGdCQUFnQixHQUFHO0dBQ25ELENBQUMsS0FBSyxLQUFLO1FBQ1A7QUFDTCxRQUFNOzs7QUFJVixTQUFnQixtQkFBbUIsSUFBdUI7QUFDeEQsU0FBUSxHQUFHLElBQUksTUFBZjtFQUNFLEtBQUs7RUFDTCxLQUFLO0VBQ0wsS0FBSztFQUNMLEtBQUs7RUFDTCxLQUFLO0VBQ0wsS0FBSztFQUNMLEtBQUs7RUFDTCxLQUFLO0VBQ0wsS0FBSyxRQUNILFFBQU8sR0FBRyxJQUFJO0VBQ2hCLEtBQUssT0FDSCxRQUFPO0VBQ1QsS0FBSyxXQUNILFFBQU8sR0FBRyxtQkFBb0IsR0FBc0IsSUFBSSxVQUFVLENBQUM7RUFDckUsS0FBSyxVQUNILFFBQU8sbUJBQW9CLEdBQXFCLElBQUksVUFBVTtFQUNoRSxLQUFLLFVBQVU7R0FDYixNQUFNLGFBQWE7QUFDbkIsVUFBTyxZQUFZLG1CQUFtQixXQUFXLElBQUksUUFBUSxDQUFDLE1BQU0sbUJBQW1CLFdBQVcsSUFBSSxVQUFVLENBQUM7O0VBRW5ILEtBQUssVUFDSCxRQUFPLE1BQU0sS0FBTSxHQUFvQixPQUFPLENBQzNDLEtBQUssVUFBVTtBQUNkLE9BQUksT0FBTyxVQUFVLFVBQVU7QUFDN0IsV0FBTyxJQUFJLE1BQU07O0FBR25CLE9BQUksVUFBVSxNQUFNO0FBQ2xCLFdBQU87O0FBR1QsT0FBSSxVQUFVLFdBQVc7QUFDdkIsV0FBTzs7QUFHVCxVQUFPLEdBQUc7SUFDVixDQUNELEtBQUssTUFBTTtFQUNoQixLQUFLLFFBQ0gsUUFBTyxHQUFJLEdBQW1CLFFBQzNCLEtBQUssV0FBVyxtQkFBbUIsT0FBTyxDQUFDLENBQzNDLEtBQUssTUFBTTtFQUNoQixLQUFLLE9BQ0gsUUFBTyxHQUFJLEdBQWlCLFFBQVEsS0FBSyxRQUFRLElBQUksSUFBSSxHQUFHLENBQUMsS0FBSyxNQUFNO0VBQzFFLEtBQUssUUFDSCxRQUFPLEdBQUcsbUJBQW9CLEdBQW1CLFFBQVEsQ0FBQztFQUM1RCxLQUFLLFVBQVU7R0FDYixNQUFNLFFBQVMsR0FBb0I7QUFDbkMsVUFBTztJQUNMO0lBQ0EsR0FBRyxPQUFPLEtBQUssTUFBTSxDQUFDLEtBQUssUUFBUTtBQUNqQyxTQUFJLE1BQU0sS0FBSyxJQUFJLFNBQVMsWUFBWTtBQUN0QyxhQUFPLEdBQUcsSUFBSSxLQUFLLG1CQUFtQixNQUFNLEtBQUssSUFBSSxVQUFVLENBQUM7WUFDM0Q7QUFDTCxhQUFPLEdBQUcsSUFBSSxJQUFJLG1CQUFtQixNQUFNLEtBQUssQ0FBQzs7TUFFbkQ7SUFDRjtJQUNELENBQUMsS0FBSyxLQUFLOztFQUVkLEtBQUssV0FDSCxRQUFPLEdBQUcsbUJBQW9CLEdBQXNCLElBQUksVUFBVSxDQUFDO0VBQ3JFLEtBQUssb0JBQW9CO0dBQ3ZCLE1BQU0sTUFBTyxHQUE2QjtBQUcxQyxPQUFJLENBQUMsSUFBSSxTQUFTLElBQUksTUFBTSxXQUFXLEdBQUc7QUFDeEMsV0FBTzs7R0FJVCxNQUFNLFFBQVEsSUFBSSxNQUFNLEtBQUssU0FBa0I7QUFFN0MsUUFBSSxPQUFPLFNBQVMsVUFBVTtBQUM1QixZQUFPLEdBQUc7O0FBSVosUUFBSSxRQUFRLE9BQU8sU0FBUyxZQUFhLEtBQW1CLE1BQU07S0FDaEUsTUFBTSxZQUFZLG1CQUFtQixLQUFrQjtBQUN2RCxZQUFPLE1BQU0sVUFBVTs7QUFJekIsV0FBTztLQUNQO0FBRUYsVUFBTyxLQUFLLE1BQU0sS0FBSyxHQUFHLENBQUM7O0VBRTdCLEtBQUssT0FDSCxRQUFPO0VBQ1QsUUFDRSxPQUFNLElBQUksTUFBTSxtQkFBbUIsR0FBRyxJQUFJLE9BQU87Ozs7OztBQU92RCxTQUFnQixpQkFBaUIsSUFBdUI7QUFDdEQsU0FBUSxHQUFHLElBQUksTUFBZjtFQUNFLEtBQUssU0FDSCxRQUFPO0VBQ1QsS0FBSyxTQUNILFFBQU87RUFDVCxLQUFLLFNBQ0gsUUFBTztFQUNULEtBQUssVUFDSCxRQUFPO0VBQ1QsS0FBSyxPQUNILFFBQU87RUFDVCxLQUFLLE9BQ0gsUUFBTztFQUNULEtBQUssWUFDSCxRQUFPO0VBQ1QsS0FBSyxNQUNILFFBQU87RUFDVCxLQUFLLFVBQ0gsUUFBTztFQUNULEtBQUssUUFDSCxRQUFPO0VBQ1QsS0FBSyxXQUNILFFBQU8sR0FBRyxpQkFBa0IsR0FBc0IsSUFBSSxVQUFVLENBQUM7RUFDbkUsS0FBSyxXQUFXO0dBQ2QsTUFBTSxjQUFlLEdBQXFCO0FBQzFDLFVBQU8sR0FBRyxpQkFBaUIsWUFBWSxVQUFVLENBQUMsV0FBVyxZQUFZLGFBQWE7O0VBRXhGLEtBQUssVUFBVTtHQUNiLE1BQU0sYUFBYyxHQUFvQjtBQUN4QyxVQUFPLFlBQVksaUJBQWlCLFdBQVcsUUFBUSxDQUFDLElBQUksaUJBQzFELFdBQVcsVUFDWixDQUFDOztFQUVKLEtBQUssV0FBVztHQUNkLE1BQU0sUUFBUSxNQUFNLEtBQU0sR0FBcUMsT0FBTyxDQUFDLEtBQUssVUFBVTtBQUNwRixRQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzdCLFlBQU8sSUFBSSxNQUFNOztBQUduQixRQUFJLFVBQVUsTUFBTTtBQUNsQixZQUFPOztBQUdULFFBQUksVUFBVSxXQUFXO0FBQ3ZCLFlBQU87O0FBR1QsV0FBTyxHQUFHO0tBQ1Y7QUFFRixPQUFJLE1BQU0sV0FBVyxHQUFHO0FBQ3RCLFdBQU8sYUFBYSxNQUFNLEdBQUc7O0FBRS9CLFVBQU8sY0FBYyxNQUFNLEtBQUssS0FBSyxDQUFDOztFQUV4QyxLQUFLLFFBQ0gsUUFBTyxZQUFhLEdBQW1CLElBQUksUUFDeEMsS0FBSyxXQUFzQixpQkFBaUIsT0FBTyxDQUFDLENBQ3BELEtBQUssSUFBSSxDQUFDO0VBQ2YsS0FBSyxPQUVILFFBQU8sV0FBVyxPQUFPLFFBQVMsR0FBaUIsSUFBSSxRQUFRLENBQzVELEtBQUssQ0FBQyxLQUFLLFNBQVUsT0FBTyxRQUFRLFdBQVcsR0FBRyxJQUFJLEtBQUssSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLE1BQU8sQ0FDdEYsS0FBSyxLQUFLLENBQUM7RUFDaEIsS0FBSyxRQUNILFFBQU8sV0FBVyxpQkFBa0IsR0FBNkIsSUFBSSxRQUFRLENBQUM7RUFDaEYsS0FBSyxVQUFVO0dBQ2IsTUFBTSxRQUFTLEdBQW9CO0FBQ25DLFVBQU87SUFDTDtJQUNBLEdBQUcsT0FBTyxLQUFLLE1BQU0sQ0FBQyxLQUFLLFFBQVEsR0FBRyxJQUFJLElBQUksaUJBQWlCLE1BQU0sS0FBSyxDQUFDLEdBQUc7SUFDOUU7SUFDRCxDQUFDLEtBQUssS0FBSzs7RUFFZCxLQUFLLFdBQ0gsUUFBTyxHQUFHLGlCQUFrQixHQUFnQyxJQUFJLFVBQVUsQ0FBQztFQUM3RSxLQUFLLE9BQ0gsUUFBTztFQUNULEtBQUssb0JBQW9CO0dBQ3ZCLE1BQU0sTUFBTyxHQUE2QjtBQUcxQyxPQUFJLENBQUMsSUFBSSxTQUFTLElBQUksTUFBTSxXQUFXLEdBQUc7QUFDeEMsV0FBTzs7R0FJVCxNQUFNLFFBQVEsSUFBSSxNQUFNLEtBQUssU0FBa0I7QUFFN0MsUUFBSSxPQUFPLFNBQVMsVUFBVTtBQUM1QixZQUFPLElBQUksS0FBSzs7QUFHbEIsUUFBSSxRQUFRLE9BQU8sU0FBUyxZQUFhLEtBQW1CLE1BQU07QUFDaEUsWUFBTyxpQkFBaUIsS0FBa0I7O0FBSTVDLFdBQU87S0FDUDtBQUVGLFVBQU8sc0JBQXNCLE1BQU0sS0FBSyxLQUFLLENBQUM7O0VBRWhELEtBQUssZ0JBQWdCO0dBQ25CLE1BQU0sbUJBQW9CLEdBQStDO0FBQ3pFLFVBQU8sa0JBQWtCLGlCQUFpQixpQkFBaUIsS0FBSyxDQUFDLElBQUksaUJBQWlCLGlCQUFpQixNQUFNLENBQUM7O0VBRWhILFFBQ0UsT0FBTSxJQUFJLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxPQUFPOzs7Ozs7O0FBUXZELFNBQWdCLHVCQUNkLFNBQ0EsVUFBa0IsUUFDSDtDQUNmLE1BQU0sTUFBTTtFQUNWLE1BQU07RUFDTixPQUFPLFdBQVcsU0FBUyxTQUFTLE1BQU07RUFDMUM7RUFDRDs7Ozs7Ozs7Ozs7Ozs7O0FBa0JELEtBQUksUUFBUSxnQkFBZ0IsZ0JBQWdCO0FBQzFDLFNBQU87R0FBRSxHQUFHO0dBQUssWUFBWTtHQUF5Qjs7QUFJeEQsS0FBSSxRQUFRLGdCQUFnQixjQUFjO0FBQ3hDLFNBQU87R0FBRSxHQUFHO0dBQUssWUFBWTtHQUFtQjs7QUFJbEQsS0FBSSxtQkFBbUJILElBQUUsV0FBVztFQUNsQyxNQUFNLGFBQWEsT0FBTyxLQUFLLFFBQVEsTUFBTTtFQUM3QyxNQUFNLFdBQVcsV0FBVyxLQUFLLFFBQVE7R0FDdkMsTUFBTSxZQUFZLFFBQVEsTUFBTTtBQUNoQyxVQUFPLHVCQUF1QixXQUFXLElBQUk7SUFDN0M7QUFDRixTQUFPO0dBQ0wsR0FBRztHQUNILFlBQVk7R0FDWjtHQUNEO1lBQ1EsbUJBQW1CQSxJQUFFLFVBQVU7RUFDeEMsTUFBTSxZQUFhLFFBQXFDLElBQUk7QUFFNUQsTUFDRSxxQkFBcUJBLElBQUUsY0FDdEIsUUFBUSxTQUFTLFlBQVksSUFBSSxRQUFRLFNBQVMsU0FBUyxHQUM1RDtBQUNBLFVBQU87SUFDTCxHQUFHO0lBQ0gsWUFBWTtJQUNiOztBQUVILFNBQU87R0FDTCxHQUFHO0dBQ0gsWUFBWTtHQUNaLFNBQVMsdUJBQXVCLFdBQVcsUUFBUTtHQUNwRDtZQUNRLG1CQUFtQkEsSUFBRSxVQUFVO0VBQ3hDLE1BQU0sY0FBZSxRQUFvQyxJQUFJLFFBQVEsS0FBSyxRQUN4RSx1QkFBdUIsS0FBSyxRQUFRLENBQ3JDO0FBRUQsU0FBTyxZQUFZO1lBQ1YsbUJBQW1CQSxJQUFFLGFBQWE7QUFDM0MsU0FBTztHQUNMLEdBQUcsdUJBQXdCLFFBQXFDLElBQUksV0FBVyxRQUFRO0dBQ3ZGLFVBQVU7R0FDWDtZQUNRLG1CQUFtQkEsSUFBRSxhQUFhO0FBQzNDLFNBQU87R0FDTCxHQUFHLHVCQUF3QixRQUFxQyxJQUFJLFdBQVcsUUFBUTtHQUN2RixVQUFVO0dBQ1g7UUFDSTtBQUNMLFNBQU87R0FDTCxHQUFHO0dBQ0gsWUFBWSxrQkFBa0IsU0FBUyxRQUFRO0dBQ2hEOzs7Ozs7QUFPTCxTQUFTLGtCQUFrQixLQUFhLFNBQW9EO0FBQzFGLEtBQUksbUJBQW1CQSxJQUFFLFNBQVM7QUFDaEMsU0FBTztZQUNFLG1CQUFtQkEsSUFBRSxLQUFLLFlBQVk7QUFHL0MsTUFBSSxRQUFRLGdCQUFnQixxQkFBcUI7QUFDL0MsVUFBTzthQUNFLElBQUksU0FBUyxPQUFPLEVBQUU7QUFDL0IsVUFBTzthQUNFLFFBQVEsTUFBTTtBQUN2QixVQUFPO2FBQ0UsSUFBSSxTQUFTLE1BQU0sRUFBRTtBQUM5QixVQUFPO1NBQ0Y7QUFDTCxVQUFPOztZQUVBLG1CQUFtQkEsSUFBRSxXQUFXO0FBQ3pDLE1BQUksUUFBUSxNQUFNO0FBQ2hCLFVBQU87YUFDRSxJQUFJLFNBQVMsTUFBTSxFQUFFO0FBQzlCLFVBQU87U0FDRjtBQUNMLFVBQU87O1lBRUEsbUJBQW1CQSxJQUFFLFlBQVk7QUFDMUMsU0FBTztZQUNFLG1CQUFtQkEsSUFBRSxTQUFTO0FBQ3ZDLFNBQU87WUFDRSxtQkFBbUJBLElBQUUsV0FBVztBQUN6QyxTQUFPO1lBQ0UsbUJBQW1CQSxJQUFFLFVBQVUsbUJBQW1CQSxJQUFFLFlBQVk7QUFDekUsU0FBTztZQUNFLG1CQUFtQkEsSUFBRSxVQUFVO0FBQ3hDLFNBQU87WUFDRSxtQkFBbUJBLElBQUUsWUFBWTtBQUMxQyxTQUFPO1lBQ0UsbUJBQW1CQSxJQUFFLG9CQUFvQjtBQUNsRCxTQUFPO1lBQ0UsUUFBUSxJQUFJLFNBQVMsVUFBVTtBQUN4QyxTQUFPO1FBQ0Y7QUFDTCxRQUFNLElBQUksTUFBTSxZQUFZLElBQUksR0FBRyxRQUFRLElBQUksT0FBTzs7Ozs7Y0E1dkJuQjtzQkFDa0I7YUFnQ2pDO2lCQU82QjtrQkFDSDtDQWVyQyxpQkFBaUI7RUFDNUIsWUFBWTtHQUNWLFFBQVE7R0FDUixZQUFZO0dBQ1osWUFBWTtHQUNiO0VBQ0QsZ0JBQWdCO0dBQ2QsUUFBUTtHQUNSLFlBQVk7R0FDWixZQUFZO0dBQ2I7RUFDRiJ9
|
|
634
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kLWNvbnZlcnRlci5qcyIsIm5hbWVzIjpbImlzb0Zvcm1hdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4iLCJoYXNoRm9ybWF0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiIsInoiLCJ6b2RUeXBlOiB6LlpvZFR5cGVBbnkiLCJlbGVtZW50VHlwZTogei5ab2RUeXBlIiwic3RtdDogc3RyaW5nIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbXBsYXRlL3pvZC1jb252ZXJ0ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB6b2QtY29udmVydGVyIOq1rOyEsVxuICogMS4g7Jyg7Yu466as7YuwXG4gKiAgLSBnZXRab2RUeXBlQnlJZFxuICpcbiAqIDIuIFpvZCDtg4DsnoUg67OA7ZmYIChFbnRpdHlQcm9wIC0+IFpvZFR5cGUpXG4gKiAgLSBwcm9wVG9ab2RUeXBlXG4gKlxuICogMy4gRW50aXR5UHJvcC9Ob2RlIC0+IFpvZCDsvZTrk5wg66y47J6Q7Je0XG4gKiAgLSBwcm9wVG9ab2RUeXBlRGVmXG4gKiAgLSBwcm9wTm9kZVRvWm9kVHlwZURlZlxuICpcbiAqIDQuIFpvZCDtg4DsnoUg7J247Iqk7YS07Iqk66W8IO2VtOuLue2VmOuKlCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZggKFpvZFR5cGUgLT4gWm9kQ29kZSlcbiAqICAtIHpvZFR5cGVUb1pvZENvZGVcbiAqXG4gKiA1LiBab2Qg7YOA7J6F7J2EIFVJIOugjOuNlOungeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmCAoWm9kVHlwZSAtPiBSZW5kZXJpbmdOb2RlKVxuICogIC0gem9kVHlwZVRvUmVuZGVyaW5nTm9kZVxuICogIC0gcmVzb2x2ZVJlbmRlclR5cGVcbiAqL1xuXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBCVUlMVF9JTl9UWVBFX0lEUyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzQmlnSW50ZWdlckFycmF5UHJvcCxcbiAgaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcCxcbiAgaXNCb29sZWFuQXJyYXlQcm9wLFxuICBpc0Jvb2xlYW5TaW5nbGVQcm9wLFxuICBpc0RhdGVBcnJheVByb3AsXG4gIGlzRGF0ZVNpbmdsZVByb3AsXG4gIGlzRW51bUFycmF5UHJvcCxcbiAgaXNFbnVtU2luZ2xlUHJvcCxcbiAgaXNJbnRlZ2VyQXJyYXlQcm9wLFxuICBpc0ludGVnZXJTaW5nbGVQcm9wLFxuICBpc0pzb25Qcm9wLFxuICBpc051bWJlckFycmF5UHJvcCxcbiAgaXNOdW1iZXJTaW5nbGVQcm9wLFxuICBpc051bWVyaWNBcnJheVByb3AsXG4gIGlzTnVtZXJpY1NpbmdsZVByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1NlYXJjaFRleHRQcm9wLFxuICBpc1N0cmluZ0FycmF5UHJvcCxcbiAgaXNTdHJpbmdTaW5nbGVQcm9wLFxuICBpc1RzVmVjdG9yUHJvcCxcbiAgaXNVdWlkQXJyYXlQcm9wLFxuICBpc1V1aWRTaW5nbGVQcm9wLFxuICBpc1ZlY3RvckFycmF5UHJvcCxcbiAgaXNWZWN0b3JTaW5nbGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gIFNvbmFtdUZpbGVTY2hlbWEsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICB0eXBlIFJlbmRlcmluZ05vZGUsXG4gIHR5cGUgWm9kU3RyaW5nRm9ybWF0LFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUltcG9ydFVybCB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcblxuLy8gPGFueT7rpbwg7J6Q7KCc7ZWY6rOgLCBab2Tsl5DshJwg7KCc7JW97ZWY64qUIOq4sOuzuOyggeyduCBHZW5lcmljIFR5cGUgUGFyYW1ldGVy66W8IOyCrOyaqe2VqC5cbnR5cGUgQW55Wm9kUmVjb3JkID0gei5ab2RSZWNvcmQ8ei5ab2RTdHJpbmcgfCB6LlpvZE51bWJlciB8IHouWm9kU3ltYm9sLCB6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RPYmplY3QgPSB6LlpvZE9iamVjdDtcbnR5cGUgQW55Wm9kTnVsbGFibGUgPSB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT47XG50eXBlIEFueVpvZERlZmF1bHQgPSB6LlpvZERlZmF1bHQ8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kVW5pb24gPSB6LlpvZFVuaW9uPHouWm9kVHlwZVtdPjtcbnR5cGUgQW55Wm9kQXJyYXkgPSB6LlpvZEFycmF5PHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9wdGlvbmFsID0gei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RUZW1wbGF0ZUxpdGVyYWwgPSB6LlpvZFRlbXBsYXRlTGl0ZXJhbDtcblxuLyoqXG4gKiDrgrTsnqUg7YOA7J6FIOygleydmCAoWm9kIOyKpO2CpOuniCArIFVJIOugjOuNlOungSDtg4DsnoUpXG4gKi9cbmV4cG9ydCBjb25zdCBCVUlMVF9JTl9UWVBFUyA9IHtcbiAgU29uYW11RmlsZToge1xuICAgIHNjaGVtYTogU29uYW11RmlsZVNjaGVtYSxcbiAgICByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZVwiLFxuICAgIHNjaGVtYU5hbWU6IFwiU29uYW11RmlsZVNjaGVtYVwiLFxuICB9LFxuICBcIlNvbmFtdUZpbGVbXVwiOiB7XG4gICAgc2NoZW1hOiBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gICAgcmVuZGVyVHlwZTogXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIixcbiAgICBzY2hlbWFOYW1lOiBcIlNvbmFtdUZpbGVBcnJheVNjaGVtYVwiLFxuICB9LFxufSBhcyBjb25zdDtcblxuZnVuY3Rpb24gZ2V0QnVpbHRJblNjaGVtYU5hbWUoem9kVHlwZTogei5ab2RUeXBlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF0Y2hlZCA9IE9iamVjdC5lbnRyaWVzKEJVSUxUX0lOX1RZUEVTKS5maW5kKChbdHlwZUlkXSkgPT4gem9kVHlwZS5kZXNjcmlwdGlvbiA9PT0gdHlwZUlkKTtcbiAgcmV0dXJuIG1hdGNoZWQ/LlsxXS5zY2hlbWFOYW1lO1xufVxuXG4vKipcbiAqIHpvZEZvcm1hdOydhCBab2QgNCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIFpvZCA07JeQ7ISc64qUIHouZW1haWwoKSwgei51dWlkKCkg65OxIOuPheumveyggeyduCDtlajsiJgg7ZiV7YOc66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gem9kRm9ybWF0VG9Db2RlKGZvcm1hdDogWm9kU3RyaW5nRm9ybWF0KTogc3RyaW5nIHtcbiAgLy8gSVNPIO2PrOunt+ydgCB6Lmlzby54eHgoKSDtmJXtg5xcbiAgY29uc3QgaXNvRm9ybWF0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBpc29EYXRlOiBcInouaXNvLmRhdGUoKVwiLFxuICAgIGlzb1RpbWU6IFwiei5pc28udGltZSgpXCIsXG4gICAgaXNvRGF0ZXRpbWU6IFwiei5pc28uZGF0ZXRpbWUoKVwiLFxuICAgIGlzb0R1cmF0aW9uOiBcInouaXNvLmR1cmF0aW9uKClcIixcbiAgfTtcblxuICAvLyBoYXNoIO2PrOunt+ydgCB6Lmhhc2goXCJhbGdvcml0aG1cIikg7ZiV7YOcXG4gIGNvbnN0IGhhc2hGb3JtYXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIGhhc2hNZDU6ICd6Lmhhc2goXCJtZDVcIiknLFxuICAgIGhhc2hTaGExOiAnei5oYXNoKFwic2hhMVwiKScsXG4gICAgaGFzaFNoYTI1NjogJ3ouaGFzaChcInNoYTI1NlwiKScsXG4gICAgaGFzaFNoYTM4NDogJ3ouaGFzaChcInNoYTM4NFwiKScsXG4gICAgaGFzaFNoYTUxMjogJ3ouaGFzaChcInNoYTUxMlwiKScsXG4gIH07XG5cbiAgaWYgKGZvcm1hdCBpbiBpc29Gb3JtYXRzKSB7XG4gICAgcmV0dXJuIGlzb0Zvcm1hdHNbZm9ybWF0XTtcbiAgfVxuXG4gIGlmIChmb3JtYXQgaW4gaGFzaEZvcm1hdHMpIHtcbiAgICByZXR1cm4gaGFzaEZvcm1hdHNbZm9ybWF0XTtcbiAgfVxuXG4gIC8vIOq4sOuzuCDtj6zrp7fsnYAgei54eHgoKSDtmJXtg5wgKFpvZCA0KVxuICByZXR1cm4gYHouJHtmb3JtYXR9KClgO1xufVxuXG4vKipcbiAqIHpvZEZvcm1hdOydhCBab2QgNCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICogWm9kIDTsl5DshJzripQgei5lbWFpbCgpLCB6LnV1aWQoKSDrk7Eg64+F66a97KCB7J24IO2VqOyImCDtmJXtg5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiB6b2RGb3JtYXRUb1R5cGUoZm9ybWF0OiBab2RTdHJpbmdGb3JtYXQpOiB6LlpvZFR5cGUge1xuICAvLyBJU08g7Y+s66e37J2AIHouaXNvLnh4eCgpIO2Yle2DnFxuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgXCJpc29EYXRlXCI6XG4gICAgICByZXR1cm4gei5pc28uZGF0ZSgpO1xuICAgIGNhc2UgXCJpc29UaW1lXCI6XG4gICAgICByZXR1cm4gei5pc28udGltZSgpO1xuICAgIGNhc2UgXCJpc29EYXRldGltZVwiOlxuICAgICAgcmV0dXJuIHouaXNvLmRhdGV0aW1lKCk7XG4gICAgY2FzZSBcImlzb0R1cmF0aW9uXCI6XG4gICAgICByZXR1cm4gei5pc28uZHVyYXRpb24oKTtcbiAgICAvLyBoYXNoIO2PrOunt+ydgCB6Lmhhc2goXCJhbGdvcml0aG1cIikg7ZiV7YOcXG4gICAgY2FzZSBcImhhc2hNZDVcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJtZDVcIik7XG4gICAgY2FzZSBcImhhc2hTaGExXCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwic2hhMVwiKTtcbiAgICBjYXNlIFwiaGFzaFNoYTI1NlwiOlxuICAgICAgcmV0dXJuIHouaGFzaChcInNoYTI1NlwiKTtcbiAgICBjYXNlIFwiaGFzaFNoYTM4NFwiOlxuICAgICAgcmV0dXJuIHouaGFzaChcInNoYTM4NFwiKTtcbiAgICBjYXNlIFwiaGFzaFNoYTUxMlwiOlxuICAgICAgcmV0dXJuIHouaGFzaChcInNoYTUxMlwiKTtcbiAgICAvLyDquLDrs7gg7Y+s66e37J2AIHoueHh4KCkg7ZiV7YOcIChab2QgNClcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICh6IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgKCkgPT4gei5ab2RUeXBlPilbZm9ybWF0XSgpO1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyehSBJROuhnOu2gO2EsCDrj5nsoIHsnLzroZwgWm9kIOyKpO2CpOuniOulvCDroZzrk5ztlanri4jri6QuXG4gKiDrgrTsnqUg7YOA7J6FKEJVSUxUX0lOX1RZUEVfSURTKeydgCDrsJTroZwg67CY7ZmY7ZWY6rOgLFxuICog6re4IOyZuOuKlCBkaXN0IOuUlOugie2GoOumrOyXkOyEnCBFU03snLzroZwgaW1wb3J07ZWY7JesIOqwgOyguOyYteuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFpvZFR5cGVCeUlkKHpvZFR5cGVJZDogc3RyaW5nKTogUHJvbWlzZTx6LlpvZFR5cGVBbnk+IHtcbiAgLy8g64K07J6lIO2DgOyehSDsspjrpqxcbiAgaWYgKChCVUlMVF9JTl9UWVBFX0lEUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMoem9kVHlwZUlkKSkge1xuICAgIGNvbnN0IGJ1aWx0SW5UeXBlID0gQlVJTFRfSU5fVFlQRVNbem9kVHlwZUlkIGFzIGtleW9mIHR5cGVvZiBCVUlMVF9JTl9UWVBFU107XG4gICAgaWYgKCFidWlsdEluVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDrgrTsnqUg7YOA7J6FICR7em9kVHlwZUlkfeydmCDsiqTtgqTrp4jqsIAg7KCV7J2Y65CY7KeAIOyViuyVmOyKteuLiOuLpGApO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbHRJblR5cGUuc2NoZW1hLmRlc2NyaWJlKHpvZFR5cGVJZCk7XG4gIH1cblxuICAvLyDtlITroZzsoJ3tirjsl5DshJwg7KCV7J2Y7ZWcIO2DgOyehSDrj5nsoIEg66Gc65OcXG4gIGNvbnN0IG1vZHVsZVBhdGggPSBFbnRpdHlNYW5hZ2VyLmdldE1vZHVsZVBhdGgoem9kVHlwZUlkKTtcbiAgY29uc3QgbW9kdWxlQWJzUGF0aCA9IHBhdGguam9pbihcbiAgICBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgcnVudGltZVBhdGgoYGRpc3QvYXBwbGljYXRpb24vJHttb2R1bGVQYXRofS5qc2ApLFxuICApO1xuICBjb25zdCBpbXBvcnRVcmwgPSBjcmVhdGVJbXBvcnRVcmwobW9kdWxlQWJzUGF0aCk7XG4gIGNvbnN0IGltcG9ydGVkID0gYXdhaXQgaW1wb3J0KGltcG9ydFVybCk7XG5cbiAgaWYgKCFpbXBvcnRlZFt6b2RUeXBlSWRdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHpvZFR5cGVJZCAke3pvZFR5cGVJZH1gKTtcbiAgfVxuICByZXR1cm4gaW1wb3J0ZWRbem9kVHlwZUlkXS5kZXNjcmliZSh6b2RUeXBlSWQpO1xufVxuXG4vKipcbiAqIEVudGl0eVByb3DsnYQgWm9kIO2DgOyeheycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiDqsIEgcHJvcOydmCDtg4DsnoXsl5Ag65Sw6528IOyggeygiO2VnCBab2QgdmFsaWRhdG9y66W8IOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3BUb1pvZFR5cGUocHJvcDogRW50aXR5UHJvcCk6IFByb21pc2U8ei5ab2RUeXBlQW55PiB7XG4gIGxldCB6b2RUeXBlOiB6LlpvZFR5cGVBbnkgPSB6LnVua25vd24oKTtcbiAgaWYgKGlzSW50ZWdlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5pbnQoKTtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5pbnQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5iaWdpbnQoKTtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5iaWdpbnQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNFbnVtQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IChhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKSkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC56b2RGb3JtYXQpIHtcbiAgICAgIHpvZFR5cGUgPSB6b2RGb3JtYXRUb1R5cGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoICYmIFwibWF4XCIgaW4gem9kVHlwZSkge1xuICAgICAgICB6b2RUeXBlID0gKHpvZFR5cGUgYXMgei5ab2RTdHJpbmcpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgem9kVHlwZSA9IHouc3RyaW5nKCkubWF4KHByb3AubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgem9kVHlwZSA9IHouc3RyaW5nKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RyaW5nQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgbGV0IGVsZW1lbnRUeXBlOiB6LlpvZFR5cGU7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICBlbGVtZW50VHlwZSA9IHpvZEZvcm1hdFRvVHlwZShwcm9wLnpvZEZvcm1hdCk7XG4gICAgICBpZiAocHJvcC5sZW5ndGggJiYgXCJtYXhcIiBpbiBlbGVtZW50VHlwZSkge1xuICAgICAgICBlbGVtZW50VHlwZSA9IChlbGVtZW50VHlwZSBhcyB6LlpvZFN0cmluZykubWF4KHByb3AubGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICBlbGVtZW50VHlwZSA9IHouc3RyaW5nKCkubWF4KHByb3AubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudFR5cGUgPSB6LnN0cmluZygpO1xuICAgIH1cbiAgICB6b2RUeXBlID0gZWxlbWVudFR5cGUuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc051bWJlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKTtcbiAgfSBlbHNlIGlmIChpc051bWJlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY0FycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJvb2xlYW4oKTtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5BcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5ib29sZWFuKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0RhdGVTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouZGF0ZSgpO1xuICB9IGVsc2UgaWYgKGlzRGF0ZUFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmRhdGUoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzVXVpZFNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei51dWlkKCk7XG4gIH0gZWxzZSBpZiAoaXNVdWlkQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoudXVpZCgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1NlYXJjaFRleHRQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouc3RyaW5nKCk7XG4gIH0gZWxzZSBpZiAoaXNWZWN0b3JTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYXJyYXkoei5udW1iZXIoKSk7XG4gIH0gZWxzZSBpZiAoaXNWZWN0b3JBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5hcnJheSh6LmFycmF5KHoubnVtYmVyKCkpKTtcbiAgfSBlbHNlIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgaWYgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbikpIHtcbiAgICAgIC8vIEZLIO2DgOyeheydhCDssLjsobAg7JeU7Yuw7YuwIFBLIO2DgOyeheyXkCDrlLDrnbwg6rKw7KCVXG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgY29uc3QgcGtUeXBlID0gcmVsRW50aXR5LmdldFBrVHlwZSgpO1xuICAgICAgaWYgKHBrVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBwa1R5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgcHJvcOydhCB6b2RUeXBl7Jy866GcIOuzgO2ZmO2VmOuKlOuNsCDsi6TtjKggJHtwcm9wfX1gKTtcbiAgfVxuXG4gIGlmICgocHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9KS51bnNpZ25lZCkge1xuICAgIHpvZFR5cGUgPSAoem9kVHlwZSBhcyB6LlpvZE51bWJlcikubm9ubmVnYXRpdmUoKTtcbiAgfVxuICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgIHpvZFR5cGUgPSB6b2RUeXBlLm51bGxhYmxlKCk7XG4gIH1cblxuICByZXR1cm4gem9kVHlwZTtcbn1cblxuLyoqXG4gKiBFbnRpdHlQcm9w7J2EIFpvZCDtg4DsnoUg7KCV7J2YIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcFRvWm9kVHlwZURlZihwcm9wOiBFbnRpdHlQcm9wLCBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGxldCBzdG10OiBzdHJpbmc7XG4gIGlmIChpc0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouaW50KClgO1xuICB9IGVsc2UgaWYgKGlzSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5iaWdpbnQoKWA7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNFbnVtU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNFbnVtQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH0uYXJyYXkoKWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIGlmIChwcm9wLnpvZEZvcm1hdCkge1xuICAgICAgY29uc3QgYmFzZSA9IHpvZEZvcm1hdFRvQ29kZShwcm9wLnpvZEZvcm1hdCk7XG4gICAgICBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX0ubWF4KCR7cHJvcC5sZW5ndGh9KWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtiYXNlfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkubWF4KCR7cHJvcC5sZW5ndGh9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdBcnJheVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC56b2RGb3JtYXQpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB6b2RGb3JtYXRUb0NvZGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke2Jhc2V9Lm1heCgke3Byb3AubGVuZ3RofSkuYXJyYXkoKWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtiYXNlfS5hcnJheSgpYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5tYXgoJHtwcm9wLmxlbmd0aH0pLmFycmF5KClgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5hcnJheSgpYDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoubnVtYmVyKClgO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoubnVtYmVyKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0RhdGVTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouZGF0ZSgpYDtcbiAgfSBlbHNlIGlmIChpc0RhdGVBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5kYXRlKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJvb2xlYW4oKWA7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYm9vbGVhbigpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzVXVpZFNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei51dWlkKClgO1xuICB9IGVsc2UgaWYgKGlzVXVpZEFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnV1aWQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0pzb25Qcm9wKHByb3ApKSB7XG4gICAgLy8g64K07J6lIO2DgOyeheyduCDqsr3smrAg7Iqk7YKk66eIIOydtOumhOycvOuhnCDrs4DtmZhcbiAgICBpZiAoKEJVSUxUX0lOX1RZUEVfSURTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyhwcm9wLmlkKSkge1xuICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IHByb3AuaWQgPT09IFwiU29uYW11RmlsZVwiID8gXCJTb25hbXVGaWxlU2NoZW1hXCIgOiBcIlNvbmFtdUZpbGVBcnJheVNjaGVtYVwiO1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7c2NoZW1hTmFtZX1gO1xuICAgICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHNjaGVtYU5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU2VhcmNoVGV4dFByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNWZWN0b3JTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYXJyYXkoei5udW1iZXIoKSlgO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYXJyYXkoei5hcnJheSh6Lm51bWJlcigpKSlgO1xuICB9IGVsc2UgaWYgKGlzVHNWZWN0b3JQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKClgO1xuICB9IGVsc2UgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgaWYgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbikpIHtcbiAgICAgIC8vIEZLIFpvZCDtg4DsnoXsnYQg7LC47KGwIOyXlO2LsO2LsCBQSyDtg4DsnoXsl5Ag65Sw6528IOqysOyglVxuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgIGNvbnN0IHBrVHlwZSA9IHJlbEVudGl0eS5nZXRQa1R5cGUoKTtcbiAgICAgIGlmIChwa1R5cGUgPT09IFwic3RyaW5nXCIgfHwgcGtUeXBlID09PSBcInV1aWRcIikge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfV9pZDogei5zdHJpbmcoKWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfV9pZDogei5pbnQoKWA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOq3uOyZuCByZWxhdGlvbiDsvIDsnbTsiqQg7KCc7Jm4XG4gICAgICByZXR1cm4gYC8vICR7cHJvcC5uYW1lfTogJHtwcm9wLnJlbGF0aW9uVHlwZX0gJHtwcm9wLndpdGh9YDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFwiLy8gdW5hYmxlIHRvIHJlc29sdmVcIjtcbiAgfVxuXG4gIGlmICgocHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9KS51bnNpZ25lZCkge1xuICAgIHN0bXQgKz0gXCIubm9ubmVnYXRpdmUoKVwiO1xuICB9XG4gIGlmIChwcm9wLm51bGxhYmxlKSB7XG4gICAgc3RtdCArPSBcIi5udWxsYWJsZSgpXCI7XG4gIH1cblxuICAvLyBudW1lcmljIO2DgOyeheydmCDqsr3smrAgbnVsbGFibGUg7J207ZuE7JeQIG1ldGEg7LaU6rCAICjrqZTtg4DrjbDsnbTthLDqsIAg7LWc7IOB7JyEIOugiOuyqOyXkCDsnojslrTslbwg7ZWoKVxuICBpZiAoaXNOdW1lcmljU2luZ2xlUHJvcChwcm9wKSB8fCBpc051bWVyaWNBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ICs9ICcubWV0YSh7IFNvbmFtdVByb3BUeXBlOiBcIm51bWVyaWNcIiB9KSc7XG4gIH1cblxuICByZXR1cm4gYCR7c3RtdH0sYDtcbn1cblxuLyoqXG4gKiBFbnRpdHlQcm9wTm9kZeulvCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIHBsYWluLCBhcnJheSwgb2JqZWN0IOuFuOuTnCDtg4DsnoXsnYQg7J6s6reA7KCB7Jy866GcIOyymOumrO2VmOyXrCDspJHssqkg6rWs7KGw66W8IOyngOybkO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BOb2RlVG9ab2RUeXBlRGVmKHByb3BOb2RlOiBFbnRpdHlQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwicGxhaW5cIikge1xuICAgIHJldHVybiBwcm9wVG9ab2RUeXBlRGVmKHByb3BOb2RlLnByb3AsIGluamVjdEltcG9ydEtleXMpO1xuICB9IGVsc2UgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcImFycmF5XCIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvcE5vZGUucHJvcCA/IGAke3Byb3BOb2RlLnByb3AubmFtZX06IGAgOiBcIlwiLFxuICAgICAgXCJ6LmFycmF5KHoub2JqZWN0KHtcIixcbiAgICAgIHByb3BOb2RlLmNoaWxkcmVuXG4gICAgICAgIC5tYXAoKGNoaWxkUHJvcE5vZGUpID0+IHByb3BOb2RlVG9ab2RUeXBlRGVmKGNoaWxkUHJvcE5vZGUsIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAuam9pbihcIlxcblwiKSxcbiAgICAgIFwiXCIsXG4gICAgICBcIn0pKSxcIixcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gIH0gZWxzZSBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvcE5vZGUucHJvcCA/IGAke3Byb3BOb2RlLnByb3AubmFtZX06IGAgOiBcIlwiLFxuICAgICAgXCJ6Lm9iamVjdCh7XCIsXG4gICAgICBwcm9wTm9kZS5jaGlsZHJlblxuICAgICAgICAubWFwKChjaGlsZFByb3BOb2RlKSA9PiBwcm9wTm9kZVRvWm9kVHlwZURlZihjaGlsZFByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICBcIlwiLFxuICAgICAgYH0pJHtwcm9wTm9kZS5wcm9wPy5udWxsYWJsZSA/IFwiLm51bGxhYmxlKClcIiA6IFwiXCJ9LGAsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB6b2RUeXBlVG9Uc1R5cGVEZWYoenQ6IHouWm9kVHlwZSk6IHN0cmluZyB7XG4gIHN3aXRjaCAoenQuZGVmLnR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgIGNhc2UgXCJhbnlcIjpcbiAgICBjYXNlIFwidW5rbm93blwiOlxuICAgIGNhc2UgXCJuZXZlclwiOlxuICAgICAgcmV0dXJuIHp0LmRlZi50eXBlO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJEYXRlXCI7XG4gICAgY2FzZSBcIm51bGxhYmxlXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSl9IHwgbnVsbGA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjpcbiAgICAgIHJldHVybiB6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZERlZmF1bHQpLmRlZi5pbm5lclR5cGUpO1xuICAgIGNhc2UgXCJyZWNvcmRcIjoge1xuICAgICAgY29uc3QgcmVjb3JkVHlwZSA9IHp0IGFzIEFueVpvZFJlY29yZDtcbiAgICAgIHJldHVybiBgeyBbIGtleTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYua2V5VHlwZSl9IF06ICR7em9kVHlwZVRvVHNUeXBlRGVmKHJlY29yZFR5cGUuZGVmLnZhbHVlVHlwZSl9fWA7XG4gICAgfVxuICAgIGNhc2UgXCJsaXRlcmFsXCI6XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSgoenQgYXMgei5ab2RMaXRlcmFsKS52YWx1ZXMpXG4gICAgICAgIC5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGBudWxsYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGB1bmRlZmluZWRgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbihcIiB8IFwiKTtcbiAgICBjYXNlIFwidW5pb25cIjpcbiAgICAgIHJldHVybiBgJHsoenQgYXMgQW55Wm9kVW5pb24pLm9wdGlvbnNcbiAgICAgICAgLm1hcCgob3B0aW9uKSA9PiB6b2RUeXBlVG9Uc1R5cGVEZWYob3B0aW9uKSlcbiAgICAgICAgLmpvaW4oXCIgfCBcIil9YDtcbiAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgcmV0dXJuIGAkeyh6dCBhcyB6LlpvZEVudW0pLm9wdGlvbnMubWFwKCh2YWwpID0+IGBcIiR7dmFsfVwiYCkuam9pbihcIiB8IFwiKX1gO1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kQXJyYXkpLmVsZW1lbnQpfVtdYDtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IHNoYXBlID0gKHp0IGFzIEFueVpvZE9iamVjdCkuc2hhcGU7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcIntcIixcbiAgICAgICAgLi4uT2JqZWN0LmtleXMoc2hhcGUpLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgICAgaWYgKHNoYXBlW2tleV0uZGVmLnR5cGUgPT09IFwib3B0aW9uYWxcIikge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX0/OiAke3pvZFR5cGVUb1RzVHlwZURlZihzaGFwZVtrZXldLmRlZi5pbm5lclR5cGUpfSxgO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7a2V5fTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYoc2hhcGVba2V5XSl9LGA7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgXCJ9XCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kT3B0aW9uYWwpLmRlZi5pbm5lclR5cGUpfSB8IHVuZGVmaW5lZGA7XG4gICAgY2FzZSBcInRlbXBsYXRlX2xpdGVyYWxcIjoge1xuICAgICAgY29uc3QgZGVmID0gKHp0IGFzIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCkuZGVmO1xuXG4gICAgICAvLyDruYggdGVtcGxhdGUgbGl0ZXJhbOydgCBzdHJpbmfsnLzroZwg7Y+067CxXG4gICAgICBpZiAoIWRlZi5wYXJ0cyB8fCBkZWYucGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgICAgfVxuXG4gICAgICAvLyDqsIEgcGFydOulvCBUeXBlU2NyaXB0IO2DgOyehSDrrLjsnpDsl7TroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGRlZi5wYXJ0cy5tYXAoKHBhcnQ6IHVua25vd24pID0+IHtcbiAgICAgICAgLy8g66as7YSw65+0IOqwkiAoc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG51bGwsIHVuZGVmaW5lZClcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3BhcnR9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFpvZFR5cGUgLSDsnqzqt4DsoIHsnLzroZwg67OA7ZmYXG4gICAgICAgIGlmIChwYXJ0ICYmIHR5cGVvZiBwYXJ0ID09PSBcIm9iamVjdFwiICYmIChwYXJ0IGFzIHouWm9kVHlwZSkuX3pvZCkge1xuICAgICAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFR5cGVUb1RzVHlwZURlZihwYXJ0IGFzIHouWm9kVHlwZSk7XG4gICAgICAgICAgcmV0dXJuIGAkXFx7JHtpbm5lclR5cGV9fWA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDtj7TrsLFcbiAgICAgICAgcmV0dXJuIGBcXCR7c3RyaW5nfWA7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGBcXGAke3BhcnRzLmpvaW4oXCJcIil9XFxgYDtcbiAgICB9XG4gICAgY2FzZSBcImZpbGVcIjpcbiAgICAgIHJldHVybiBcIkZpbGVcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsspjrpqzrkJjsp4Ag7JWK7J2AIFpvZFR5cGUgJHt6dC5kZWYudHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoUg7J247Iqk7YS07Iqk66W8IO2VtOuLue2VmOuKlCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6b2RUeXBlVG9ab2RDb2RlKHp0OiB6LlpvZFR5cGUsIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmcge1xuICBjb25zdCBidWlsdEluU2NoZW1hTmFtZSA9IGdldEJ1aWx0SW5TY2hlbWFOYW1lKHp0KTtcbiAgaWYgKGJ1aWx0SW5TY2hlbWFOYW1lKSB7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKGJ1aWx0SW5TY2hlbWFOYW1lKTtcbiAgICByZXR1cm4gYnVpbHRJblNjaGVtYU5hbWU7XG4gIH1cblxuICBzd2l0Y2ggKHp0LmRlZi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIFwiei5zdHJpbmcoKVwiO1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIHJldHVybiBcInoubnVtYmVyKClcIjtcbiAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICByZXR1cm4gXCJ6LmJpZ2ludCgpXCI7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBcInouYm9vbGVhbigpXCI7XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiBcInouZGF0ZSgpXCI7XG4gICAgY2FzZSBcIm51bGxcIjpcbiAgICAgIHJldHVybiBcInoubnVsbCgpXCI7XG4gICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgcmV0dXJuIFwiei51bmRlZmluZWQoKVwiO1xuICAgIGNhc2UgXCJhbnlcIjpcbiAgICAgIHJldHVybiBcInouYW55KClcIjtcbiAgICBjYXNlIFwidW5rbm93blwiOlxuICAgICAgcmV0dXJuIFwiei51bmtub3duKClcIjtcbiAgICBjYXNlIFwibmV2ZXJcIjpcbiAgICAgIHJldHVybiBcInoubmV2ZXIoKVwiO1xuICAgIGNhc2UgXCJudWxsYWJsZVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoKHp0IGFzIEFueVpvZE51bGxhYmxlKS5kZWYuaW5uZXJUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0ubnVsbGFibGUoKWA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjoge1xuICAgICAgY29uc3QgekRlZmF1bHREZWYgPSAoenQgYXMgQW55Wm9kRGVmYXVsdCkuZGVmO1xuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoekRlZmF1bHREZWYuaW5uZXJUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0uZGVmYXVsdCgke3pEZWZhdWx0RGVmLmRlZmF1bHRWYWx1ZX0pYDtcbiAgICB9XG4gICAgY2FzZSBcInJlY29yZFwiOiB7XG4gICAgICBjb25zdCB6UmVjb3JkRGVmID0gKHp0IGFzIEFueVpvZFJlY29yZCkuZGVmO1xuICAgICAgcmV0dXJuIGB6LnJlY29yZCgke3pvZFR5cGVUb1pvZENvZGUoelJlY29yZERlZi5rZXlUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0sICR7em9kVHlwZVRvWm9kQ29kZShcbiAgICAgICAgelJlY29yZERlZi52YWx1ZVR5cGUsXG4gICAgICAgIGluamVjdEltcG9ydEtleXMsXG4gICAgICApfSlgO1xuICAgIH1cbiAgICBjYXNlIFwibGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20oKHp0IGFzIHouWm9kTGl0ZXJhbDxzdHJpbmcgfCBudW1iZXI+KS52YWx1ZXMpLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBgbnVsbGA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBgdW5kZWZpbmVkYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGB6LmxpdGVyYWwoJHtpdGVtc1swXX0pYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgei5saXRlcmFsKFske2l0ZW1zLmpvaW4oXCIsIFwiKX1dKWA7XG4gICAgfVxuICAgIGNhc2UgXCJ1bmlvblwiOlxuICAgICAgcmV0dXJuIGB6LnVuaW9uKFskeyh6dCBhcyBBbnlab2RVbmlvbikuZGVmLm9wdGlvbnNcbiAgICAgICAgLm1hcCgob3B0aW9uOiB6LlpvZFR5cGUpID0+IHpvZFR5cGVUb1pvZENvZGUob3B0aW9uLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgLmpvaW4oXCIsXCIpfV0pYDtcbiAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgLy8gTk9URTogei5lbnVtKFtcIkFcIiwgXCJCXCJdKeuPhCB6LmVudW0oeyBBOiBcIkFcIiwgQjogXCJCXCIgfSnroZwg7LKY66as65CoLlxuICAgICAgcmV0dXJuIGB6LmVudW0oeyR7T2JqZWN0LmVudHJpZXMoKHp0IGFzIHouWm9kRW51bSkuZGVmLmVudHJpZXMpXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbF0pID0+ICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiID8gYCR7a2V5fTogXCIke3ZhbH1cImAgOiBgJHtrZXl9OiAke3ZhbH1gKSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKX19KWA7XG4gICAgY2FzZSBcImFycmF5XCI6XG4gICAgICByZXR1cm4gYHouYXJyYXkoJHt6b2RUeXBlVG9ab2RDb2RlKCh6dCBhcyB6LlpvZEFycmF5PHouWm9kVHlwZT4pLmRlZi5lbGVtZW50LCBpbmplY3RJbXBvcnRLZXlzKX0pYDtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IHNoYXBlID0gKHp0IGFzIEFueVpvZE9iamVjdCkuc2hhcGU7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcInoub2JqZWN0KHtcIixcbiAgICAgICAgLi4uT2JqZWN0LmtleXMoc2hhcGUpLm1hcChcbiAgICAgICAgICAoa2V5KSA9PiBgJHtrZXl9OiAke3pvZFR5cGVUb1pvZENvZGUoc2hhcGVba2V5XSwgaW5qZWN0SW1wb3J0S2V5cyl9LGAsXG4gICAgICAgICksXG4gICAgICAgIFwifSlcIixcbiAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICB9XG4gICAgY2FzZSBcIm9wdGlvbmFsXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvWm9kQ29kZSgoenQgYXMgei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0ub3B0aW9uYWwoKWA7XG4gICAgY2FzZSBcImZpbGVcIjpcbiAgICAgIHJldHVybiBgei5maWxlKClgO1xuICAgIGNhc2UgXCJ0ZW1wbGF0ZV9saXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGRlZiA9ICh6dCBhcyBBbnlab2RUZW1wbGF0ZUxpdGVyYWwpLmRlZjtcblxuICAgICAgLy8g67mIIHRlbXBsYXRlIGxpdGVyYWxcbiAgICAgIGlmICghZGVmLnBhcnRzIHx8IGRlZi5wYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFwiei50ZW1wbGF0ZUxpdGVyYWwoW10pXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIOqwgSBwYXJ066W8IFpvZCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmFxuICAgICAgY29uc3QgcGFydHMgPSBkZWYucGFydHMubWFwKChwYXJ0OiB1bmtub3duKSA9PiB7XG4gICAgICAgIC8vIOusuOyekOyXtCDrpqzthLDrn7RcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIGBcIiR7cGFydH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gWm9kVHlwZSAtIOyerOq3gOyggeycvOuhnCDrs4DtmZhcbiAgICAgICAgaWYgKHBhcnQgJiYgdHlwZW9mIHBhcnQgPT09IFwib2JqZWN0XCIgJiYgKHBhcnQgYXMgei5ab2RUeXBlKS5fem9kKSB7XG4gICAgICAgICAgcmV0dXJuIHpvZFR5cGVUb1pvZENvZGUocGFydCBhcyB6LlpvZFR5cGUsIGluamVjdEltcG9ydEtleXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7Y+067CxXG4gICAgICAgIHJldHVybiBcInouc3RyaW5nKClcIjtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYHoudGVtcGxhdGVMaXRlcmFsKFske3BhcnRzLmpvaW4oXCIsIFwiKX1dKWA7XG4gICAgfVxuICAgIGNhc2UgXCJpbnRlcnNlY3Rpb25cIjoge1xuICAgICAgY29uc3QgekludGVyc2VjdGlvbkRlZiA9ICh6dCBhcyB6LlpvZEludGVyc2VjdGlvbjx6LlpvZFR5cGUsIHouWm9kVHlwZT4pLmRlZjtcbiAgICAgIHJldHVybiBgei5pbnRlcnNlY3Rpb24oJHt6b2RUeXBlVG9ab2RDb2RlKFxuICAgICAgICB6SW50ZXJzZWN0aW9uRGVmLmxlZnQsXG4gICAgICAgIGluamVjdEltcG9ydEtleXMsXG4gICAgICApfSwgJHt6b2RUeXBlVG9ab2RDb2RlKHpJbnRlcnNlY3Rpb25EZWYucmlnaHQsIGluamVjdEltcG9ydEtleXMpfSlgO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsspjrpqzrkJjsp4Ag7JWK7J2AIFpvZFR5cGUgJHt6dC5kZWYudHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXsnYQgVUkg66CM642U66eB7JeQIOyCrOyaqe2VoCDsiJgg7J6I64qUIFJlbmRlcmluZ05vZGXroZwg67OA7ZmY7ZWp64uI64ukLlxuICog7J6s6reA7KCB7Jy866GcIOykkeyyqeuQnCDtg4DsnoXrk6TsnYQg7LKY66as7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgem9kVHlwZTogei5ab2RUeXBlQW55LFxuICBiYXNlS2V5OiBzdHJpbmcgPSBcInJvb3RcIixcbik6IFJlbmRlcmluZ05vZGUge1xuICBjb25zdCBkZWYgPSB7XG4gICAgbmFtZTogYmFzZUtleSxcbiAgICBsYWJlbDogaW5mbGVjdGlvbi5jYW1lbGl6ZShiYXNlS2V5LCBmYWxzZSksXG4gICAgem9kVHlwZSxcbiAgfTtcblxuICAvKipcbiAgICog7LyA7J207IqkIOyymOumrCDsiJzshJxcbiAgICpcbiAgICogMS4g7Yq57IiYIOy8gOydtOyKpCAoZGVzY3JpcHRpb24g6riw67CYKVxuICAgKiAgICAtIFNvbmFtdUZpbGUvU29uYW11RmlsZVtdIDogei5vYmplY3Qvei5hcnJheeydtOyngOunjCDtjIzsnbwg7JeF66Gc65Oc7JqpIOuCtOyepSDtg4DsnoVcbiAgICpcbiAgICogMi4g7J2867CYIOy8gOydtOyKpCAoaW5zdGFuY2VvZiDquLDrsJgpXG4gICAqICAgIC0gei5ab2RPYmplY3QgOiDsnbzrsJgg6rCd7LK0XG4gICAqICAgIC0gei5ab2RBcnJheSA6IOydvOuwmCDrsLDsl7RcbiAgICogICAgICAtIHZlY3RvciA6IHouYXJyYXkoei5udW1iZXIp7J207KeA66eMIOuEpOydtOuwjSDquLDrsJjsnLzroZwg67Kh7YSwIOyehOuyoOuUqVxuICAgKiAgICAgIC0g7J2867CYIOuwsOyXtCA6IOq3uCDsmbhcbiAgICogICAgLSB6LlpvZFVuaW9uLCB6LlpvZE9wdGlvbmFsLCB6LlpvZE51bGxhYmxlIDog7Jyg7Yu466as7YuwIO2DgOyehVxuICAgKiAgICAtIOq4sO2DgCA6IHJlc29sdmVSZW5kZXJUeXBlKCnsnLzroZwg7LKY66asXG4gICAqL1xuXG4gIC8vIO2KueyImCDsvIDsnbTsiqQ6IFNvbmFtdUZpbGVbXSDtg4DsnoUg6rCQ7KeAXG4gIGlmICh6b2RUeXBlLmRlc2NyaXB0aW9uID09PSBcIlNvbmFtdUZpbGVbXVwiKSB7XG4gICAgcmV0dXJuIHsgLi4uZGVmLCByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiIH07XG4gIH1cblxuICAvLyDtirnsiJgg7LyA7J207IqkOiBTb25hbXVGaWxlIOuLqOydvCDtg4DsnoUg6rCQ7KeAXG4gIGlmICh6b2RUeXBlLmRlc2NyaXB0aW9uID09PSBcIlNvbmFtdUZpbGVcIikge1xuICAgIHJldHVybiB7IC4uLmRlZiwgcmVuZGVyVHlwZTogXCJqc29uLXNvbmFtdWZpbGVcIiB9O1xuICB9XG5cbiAgLy8g7J2867CYIOy8gOydtOyKpDogWm9kT2JqZWN0IOyytO2BrFxuICBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kT2JqZWN0KSB7XG4gICAgY29uc3QgY29sdW1uS2V5cyA9IE9iamVjdC5rZXlzKHpvZFR5cGUuc2hhcGUpO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gY29sdW1uS2V5cy5tYXAoKGtleSkgPT4ge1xuICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVHlwZS5zaGFwZVtrZXldO1xuICAgICAgcmV0dXJuIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoaW5uZXJUeXBlLCBrZXkpO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWYsXG4gICAgICByZW5kZXJUeXBlOiBcIm9iamVjdFwiLFxuICAgICAgY2hpbGRyZW4sXG4gICAgfTtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RBcnJheSkge1xuICAgIGNvbnN0IGlubmVyVHlwZSA9ICh6b2RUeXBlIGFzIHouWm9kQXJyYXk8ei5ab2RUeXBlQW55PikuZGVmLmVsZW1lbnQ7XG4gICAgLy8gdmVjdG9yIO2DgOyehSDtjJDrs4Q6IG51bWJlciDrsLDsl7TsnbTrqbTshJwgZW1iZWRkaW5nLCB2ZWN0b3Ig65Ox7J2YIOydtOumhOydhCDqsIDsp4Qg6rK97JqwXG4gICAgaWYgKFxuICAgICAgaW5uZXJUeXBlIGluc3RhbmNlb2Ygei5ab2ROdW1iZXIgJiZcbiAgICAgIChiYXNlS2V5LmluY2x1ZGVzKFwiZW1iZWRkaW5nXCIpIHx8IGJhc2VLZXkuaW5jbHVkZXMoXCJ2ZWN0b3JcIikpXG4gICAgKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWYsXG4gICAgICAgIHJlbmRlclR5cGU6IFwidmVjdG9yXCIsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogXCJhcnJheVwiLFxuICAgICAgZWxlbWVudDogem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGJhc2VLZXkpLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICBjb25zdCBvcHRpb25Ob2RlcyA9ICh6b2RUeXBlIGFzIHouWm9kVW5pb248ei5ab2RUeXBlW10+KS5kZWYub3B0aW9ucy5tYXAoKG9wdCkgPT5cbiAgICAgIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUob3B0LCBiYXNlS2V5KSxcbiAgICApO1xuICAgIC8vIFRPRE86IFpvZFVuaW9u7J20IOuTpOyWtOyeiOuKlCDqsr3smrAg7ZW465Ok66eBXG4gICAgcmV0dXJuIG9wdGlvbk5vZGVzWzBdO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9wdGlvbmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoKHpvZFR5cGUgYXMgei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLCBiYXNlS2V5KSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVsbGFibGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uem9kVHlwZVRvUmVuZGVyaW5nTm9kZSgoem9kVHlwZSBhcyB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUsIGJhc2VLZXkpLFxuICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogcmVzb2x2ZVJlbmRlclR5cGUoYmFzZUtleSwgem9kVHlwZSksXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXqs7wg7YKkIOydtOumhOycvOuhnOu2gO2EsCDsoIHsoIjtlZwgUmVuZGVyVHlwZeydhCDqsrDsoJXtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSZW5kZXJUeXBlKGtleTogc3RyaW5nLCB6b2RUeXBlOiB6LlpvZFR5cGVBbnkpOiBSZW5kZXJpbmdOb2RlW1wicmVuZGVyVHlwZVwiXSB7XG4gIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2REYXRlKSB7XG4gICAgcmV0dXJuIFwiZGF0ZXRpbWVcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5jb3JlLiRab2RTdHJpbmcpIHtcbiAgICAvLyBOT1RFOiB6LlpvZFN0cmluZ+ycvOuhnCDruYTqtZDtlZjrqbQgei51cmwoKSwgei5lbWFpbCgpIOuTseydmCDtg4DsnoXsl5DshJwg66y47KCc6rCAIOyDneq4sOuvgOuhnCB6LmNvcmUuJFpvZFN0cmluZ+ycvOuhnCDruYTqtZDtlahcbiAgICAvLyBGSVhNRTogZW1haWzsnbTrgpggdXJsIO2DgOyehSDrk7Hsl5Ag64yA7ZWcIOyymOumrOqwgCDtlYTsmpTtlahcbiAgICBpZiAoem9kVHlwZS5kZXNjcmlwdGlvbiA9PT0gXCJTUUxEYXRlVGltZVN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZGF0ZXRpbWVcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcImRhdGVcIikpIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1kYXRlXCI7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiaWRcIikge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWlkXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJfaWRcIikpIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1ma19pZFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVtYmVyKSB7XG4gICAgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItaWRcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcIl9pZFwiKSkge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLWZrX2lkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1wbGFpblwiO1xuICAgIH1cbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RCb29sZWFuKSB7XG4gICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEVudW0pIHtcbiAgICByZXR1cm4gXCJlbnVtc1wiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFJlY29yZCkge1xuICAgIHJldHVybiBcInJlY29yZFwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFueSB8fCB6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmtub3duKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RMaXRlcmFsKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVGVtcGxhdGVMaXRlcmFsKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZS5kZWYudHlwZSA9PT0gXCJjdXN0b21cIikge1xuICAgIHJldHVybiBcIm9iamVjdFwiO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihg7YOA7J6FIO2MjOyLsSDrtojqsIAgJHtrZXl9ICR7em9kVHlwZS5kZWYudHlwZX1gKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE4RkEsU0FBUyxxQkFBcUIsU0FBd0M7Q0FDcEUsTUFBTSxVQUFVLE9BQU8sUUFBUSxlQUFlLENBQUMsTUFBTSxDQUFDLFlBQVksUUFBUSxnQkFBZ0IsT0FBTztBQUNqRyxRQUFPLFVBQVUsR0FBRzs7Ozs7O0FBT3RCLFNBQVMsZ0JBQWdCLFFBQWlDO0NBRXhELE1BQU1BLGFBQXFDO0VBQ3pDLFNBQVM7RUFDVCxTQUFTO0VBQ1QsYUFBYTtFQUNiLGFBQWE7RUFDZDtDQUdELE1BQU1DLGNBQXND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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sonamu",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.16",
|
|
4
4
|
"description": "Sonamu — TypeScript Fullstack API Framework",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"framework",
|
|
@@ -129,9 +129,9 @@
|
|
|
129
129
|
"tsicli": "^1.0.5",
|
|
130
130
|
"vite": "8.0.5",
|
|
131
131
|
"vitest": "^4.1.2",
|
|
132
|
+
"@sonamu-kit/hmr-hook": "^0.5.1",
|
|
132
133
|
"@sonamu-kit/hmr-runner": "^0.2.0",
|
|
133
134
|
"@sonamu-kit/ts-loader": "^2.2.0",
|
|
134
|
-
"@sonamu-kit/hmr-hook": "^0.5.1",
|
|
135
135
|
"@sonamu-kit/tasks": "^0.3.0"
|
|
136
136
|
},
|
|
137
137
|
"devDependencies": {
|
package/src/api/sonamu.ts
CHANGED
|
@@ -2006,7 +2006,7 @@ function formatTime(ms: number): string {
|
|
|
2006
2006
|
|
|
2007
2007
|
const LOCAL_HOSTS = new Set(["localhost", "127.0.0.1", "0.0.0.0", "::1"]);
|
|
2008
2008
|
function isLocalHost(host: string): boolean {
|
|
2009
|
-
return LOCAL_HOSTS.has(host);
|
|
2009
|
+
return LOCAL_HOSTS.has(host) || host.endsWith(".local");
|
|
2010
2010
|
}
|
|
2011
2011
|
|
|
2012
2012
|
// `.every()`가 첫 guard 이후 순회를 멈추는 문제가 있어 `for...of`로 모든 guard를 순서대로 실행하도록 고정함
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { describe, expect, test } from "vitest";
|
|
2
|
+
import { z } from "zod";
|
|
2
3
|
|
|
3
4
|
import { Sonamu } from "../../api";
|
|
4
5
|
import { EntityManager } from "../../entity/entity-manager";
|
|
6
|
+
import { SonamuFileArraySchema, SonamuFileSchema } from "../../types/types";
|
|
5
7
|
import { Template__generated } from "../implementations/generated.template";
|
|
6
8
|
import { Template__init_types } from "../implementations/init_types.template";
|
|
7
|
-
import { propToZodType, propToZodTypeDef } from "../zod-converter";
|
|
9
|
+
import { propToZodType, propToZodTypeDef, zodTypeToZodCode } from "../zod-converter";
|
|
8
10
|
|
|
9
11
|
const TEST_API_ROOT = "/Users/Nebuleto/Workspace/sonamu/modules/sonamu";
|
|
10
12
|
|
|
@@ -50,7 +52,68 @@ async function registerEntity() {
|
|
|
50
52
|
return EntityManager.get(entity.id);
|
|
51
53
|
}
|
|
52
54
|
|
|
55
|
+
async function registerEntityWithFileCustomScalar() {
|
|
56
|
+
entitySeq += 1;
|
|
57
|
+
|
|
58
|
+
const typeId = `GeneratedTemplateFileProps${entitySeq}`;
|
|
59
|
+
const entity = {
|
|
60
|
+
id: `GeneratedTemplateFile${entitySeq}`,
|
|
61
|
+
title: `GeneratedTemplateFile${entitySeq}`,
|
|
62
|
+
table: `generated_template_file_${entitySeq}`,
|
|
63
|
+
props: [
|
|
64
|
+
{ name: "id", type: "integer" as const },
|
|
65
|
+
{
|
|
66
|
+
name: "file_props",
|
|
67
|
+
type: "json" as const,
|
|
68
|
+
id: typeId,
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
indexes: [],
|
|
72
|
+
subsets: {
|
|
73
|
+
A: ["id", "file_props"],
|
|
74
|
+
},
|
|
75
|
+
enums: {},
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
await EntityManager.register(entity);
|
|
79
|
+
|
|
80
|
+
const registeredEntity = EntityManager.get(entity.id);
|
|
81
|
+
registeredEntity.types[typeId] = z.object({
|
|
82
|
+
image: SonamuFileSchema.nullable(),
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
return { typeId };
|
|
86
|
+
}
|
|
87
|
+
|
|
53
88
|
describe("Template__generated searchText", () => {
|
|
89
|
+
test("SonamuFileSchema를 중첩 Zod 코드에서 내장 스키마 import로 유지해야 한다", () => {
|
|
90
|
+
const importKeys: string[] = [];
|
|
91
|
+
const code = zodTypeToZodCode(
|
|
92
|
+
z.object({
|
|
93
|
+
image: SonamuFileSchema.nullable(),
|
|
94
|
+
attachments: SonamuFileArraySchema.optional(),
|
|
95
|
+
}),
|
|
96
|
+
importKeys,
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
expect(code).toContain("image: SonamuFileSchema.nullable(),");
|
|
100
|
+
expect(code).toContain("attachments: SonamuFileArraySchema.optional(),");
|
|
101
|
+
expect(importKeys).toEqual(["SonamuFileSchema", "SonamuFileArraySchema"]);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test("custom scalar 안의 SonamuFileSchema를 inline할 때 sonamu import를 유지해야 한다", async () => {
|
|
105
|
+
const { typeId } = await registerEntityWithFileCustomScalar();
|
|
106
|
+
const template = new Template__generated();
|
|
107
|
+
template.getTargetAndPath = () => ({ target: "", path: "" });
|
|
108
|
+
|
|
109
|
+
const rendered = template.render();
|
|
110
|
+
const headers = rendered.customHeaders.join("\n");
|
|
111
|
+
|
|
112
|
+
expect(rendered.body).toContain(`const ${typeId} = z.object({`);
|
|
113
|
+
expect(rendered.body).toContain("image: SonamuFileSchema.nullable(),");
|
|
114
|
+
expect(headers).toContain("SonamuFileSchema");
|
|
115
|
+
});
|
|
116
|
+
|
|
54
117
|
test("searchText를 문자열 스키마로 변환해야 한다", async () => {
|
|
55
118
|
const prop = {
|
|
56
119
|
name: "search_text",
|
|
@@ -92,14 +92,14 @@ export class Template__generated extends Template {
|
|
|
92
92
|
|
|
93
93
|
return [
|
|
94
94
|
`// CustomScalar: ${importKey}`,
|
|
95
|
-
`const ${importKey} = ${zodTypeToZodCode(zodType)};`,
|
|
95
|
+
`const ${importKey} = ${zodTypeToZodCode(zodType, sourceCode.importKeys)};`,
|
|
96
96
|
`type ${importKey} = z.infer<typeof ${importKey}>`,
|
|
97
97
|
"",
|
|
98
98
|
];
|
|
99
99
|
});
|
|
100
100
|
sourceCode.lines = [...customScalarLines, ...sourceCode.lines];
|
|
101
|
-
sourceCode.importKeys =
|
|
102
|
-
(importKey) => !cdImportKeys.includes(importKey),
|
|
101
|
+
sourceCode.importKeys = unique(
|
|
102
|
+
sourceCode.importKeys.filter((importKey) => !cdImportKeys.includes(importKey)),
|
|
103
103
|
);
|
|
104
104
|
}
|
|
105
105
|
|
|
@@ -294,7 +294,11 @@ export function localizedColumn<T extends Record<string, unknown>, K extends Loc
|
|
|
294
294
|
*/
|
|
295
295
|
SD.enumLabels = (enumName: string): Record<string, LocalizedString> => {
|
|
296
296
|
return new Proxy({} as Record<string, LocalizedString>, {
|
|
297
|
-
get(_, key: string) {
|
|
297
|
+
get(_, key: string | symbol) {
|
|
298
|
+
if (typeof key === "symbol") {
|
|
299
|
+
return undefined;
|
|
300
|
+
}
|
|
301
|
+
|
|
298
302
|
const dictKey = \`enum.\${enumName}.\${key}\` as DictKey;
|
|
299
303
|
return getDictValue(dictKey, getCurrentLocale());
|
|
300
304
|
}
|
|
@@ -92,6 +92,11 @@ export const BUILT_IN_TYPES = {
|
|
|
92
92
|
},
|
|
93
93
|
} as const;
|
|
94
94
|
|
|
95
|
+
function getBuiltInSchemaName(zodType: z.ZodType): string | undefined {
|
|
96
|
+
const matched = Object.entries(BUILT_IN_TYPES).find(([typeId]) => zodType.description === typeId);
|
|
97
|
+
return matched?.[1].schemaName;
|
|
98
|
+
}
|
|
99
|
+
|
|
95
100
|
/**
|
|
96
101
|
* zodFormat을 Zod 4 코드 문자열로 변환합니다.
|
|
97
102
|
* Zod 4에서는 z.email(), z.uuid() 등 독립적인 함수 형태를 사용합니다.
|
|
@@ -537,7 +542,13 @@ export function zodTypeToTsTypeDef(zt: z.ZodType): string {
|
|
|
537
542
|
/**
|
|
538
543
|
* Zod 타입 인스턴스를 해당하는 Zod 코드 문자열로 변환합니다.
|
|
539
544
|
*/
|
|
540
|
-
export function zodTypeToZodCode(zt: z.ZodType): string {
|
|
545
|
+
export function zodTypeToZodCode(zt: z.ZodType, injectImportKeys: string[] = []): string {
|
|
546
|
+
const builtInSchemaName = getBuiltInSchemaName(zt);
|
|
547
|
+
if (builtInSchemaName) {
|
|
548
|
+
injectImportKeys.push(builtInSchemaName);
|
|
549
|
+
return builtInSchemaName;
|
|
550
|
+
}
|
|
551
|
+
|
|
541
552
|
switch (zt.def.type) {
|
|
542
553
|
case "string":
|
|
543
554
|
return "z.string()";
|
|
@@ -560,15 +571,16 @@ export function zodTypeToZodCode(zt: z.ZodType): string {
|
|
|
560
571
|
case "never":
|
|
561
572
|
return "z.never()";
|
|
562
573
|
case "nullable":
|
|
563
|
-
return `${zodTypeToZodCode((zt as AnyZodNullable).def.innerType)}.nullable()`;
|
|
574
|
+
return `${zodTypeToZodCode((zt as AnyZodNullable).def.innerType, injectImportKeys)}.nullable()`;
|
|
564
575
|
case "default": {
|
|
565
576
|
const zDefaultDef = (zt as AnyZodDefault).def;
|
|
566
|
-
return `${zodTypeToZodCode(zDefaultDef.innerType)}.default(${zDefaultDef.defaultValue})`;
|
|
577
|
+
return `${zodTypeToZodCode(zDefaultDef.innerType, injectImportKeys)}.default(${zDefaultDef.defaultValue})`;
|
|
567
578
|
}
|
|
568
579
|
case "record": {
|
|
569
580
|
const zRecordDef = (zt as AnyZodRecord).def;
|
|
570
|
-
return `z.record(${zodTypeToZodCode(zRecordDef.keyType)}, ${zodTypeToZodCode(
|
|
581
|
+
return `z.record(${zodTypeToZodCode(zRecordDef.keyType, injectImportKeys)}, ${zodTypeToZodCode(
|
|
571
582
|
zRecordDef.valueType,
|
|
583
|
+
injectImportKeys,
|
|
572
584
|
)})`;
|
|
573
585
|
}
|
|
574
586
|
case "literal": {
|
|
@@ -595,7 +607,7 @@ export function zodTypeToZodCode(zt: z.ZodType): string {
|
|
|
595
607
|
}
|
|
596
608
|
case "union":
|
|
597
609
|
return `z.union([${(zt as AnyZodUnion).def.options
|
|
598
|
-
.map((option: z.ZodType) => zodTypeToZodCode(option))
|
|
610
|
+
.map((option: z.ZodType) => zodTypeToZodCode(option, injectImportKeys))
|
|
599
611
|
.join(",")}])`;
|
|
600
612
|
case "enum":
|
|
601
613
|
// NOTE: z.enum(["A", "B"])도 z.enum({ A: "A", B: "B" })로 처리됨.
|
|
@@ -603,17 +615,19 @@ export function zodTypeToZodCode(zt: z.ZodType): string {
|
|
|
603
615
|
.map(([key, val]) => (typeof val === "string" ? `${key}: "${val}"` : `${key}: ${val}`))
|
|
604
616
|
.join(", ")}})`;
|
|
605
617
|
case "array":
|
|
606
|
-
return `z.array(${zodTypeToZodCode((zt as z.ZodArray<z.ZodType>).def.element)})`;
|
|
618
|
+
return `z.array(${zodTypeToZodCode((zt as z.ZodArray<z.ZodType>).def.element, injectImportKeys)})`;
|
|
607
619
|
case "object": {
|
|
608
620
|
const shape = (zt as AnyZodObject).shape;
|
|
609
621
|
return [
|
|
610
622
|
"z.object({",
|
|
611
|
-
...Object.keys(shape).map(
|
|
623
|
+
...Object.keys(shape).map(
|
|
624
|
+
(key) => `${key}: ${zodTypeToZodCode(shape[key], injectImportKeys)},`,
|
|
625
|
+
),
|
|
612
626
|
"})",
|
|
613
627
|
].join("\n");
|
|
614
628
|
}
|
|
615
629
|
case "optional":
|
|
616
|
-
return `${zodTypeToZodCode((zt as z.ZodOptional<z.ZodType>).def.innerType)}.optional()`;
|
|
630
|
+
return `${zodTypeToZodCode((zt as z.ZodOptional<z.ZodType>).def.innerType, injectImportKeys)}.optional()`;
|
|
617
631
|
case "file":
|
|
618
632
|
return `z.file()`;
|
|
619
633
|
case "template_literal": {
|
|
@@ -632,7 +646,7 @@ export function zodTypeToZodCode(zt: z.ZodType): string {
|
|
|
632
646
|
}
|
|
633
647
|
// ZodType - 재귀적으로 변환
|
|
634
648
|
if (part && typeof part === "object" && (part as z.ZodType)._zod) {
|
|
635
|
-
return zodTypeToZodCode(part as z.ZodType);
|
|
649
|
+
return zodTypeToZodCode(part as z.ZodType, injectImportKeys);
|
|
636
650
|
}
|
|
637
651
|
|
|
638
652
|
// 폴백
|
|
@@ -643,7 +657,10 @@ export function zodTypeToZodCode(zt: z.ZodType): string {
|
|
|
643
657
|
}
|
|
644
658
|
case "intersection": {
|
|
645
659
|
const zIntersectionDef = (zt as z.ZodIntersection<z.ZodType, z.ZodType>).def;
|
|
646
|
-
return `z.intersection(${zodTypeToZodCode(
|
|
660
|
+
return `z.intersection(${zodTypeToZodCode(
|
|
661
|
+
zIntersectionDef.left,
|
|
662
|
+
injectImportKeys,
|
|
663
|
+
)}, ${zodTypeToZodCode(zIntersectionDef.right, injectImportKeys)})`;
|
|
647
664
|
}
|
|
648
665
|
default:
|
|
649
666
|
throw new Error(`처리되지 않은 ZodType ${zt.def.type}`);
|