sonamu 0.13.6 → 0.13.7

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.
@@ -1 +1 @@
1
- {"version":3,"file":"zod-converter.d.ts","sourceRoot":"","sources":["../../src/template/zod-converter.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAoCxB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,aAAa,EAEnB,MAAM,gBAAgB,CAAC;AAexB;;GAEG;AACH,eAAO,MAAM,cAAc;aACzB,UAAU;iBACR,MAAM;iBACN,UAAU,EAAE,iBAAiB;iBAC7B,UAAU,EAAE,kBAAkB;;aAEhC,cAAc;iBACZ,MAAM;iBACN,UAAU,EAAE,uBAAuB;iBACnC,UAAU,EAAE,uBAAuB;;CAE7B,CAAC;AAqGX;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CA8B7E;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAsG3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CA0HrF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CA0BjG;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,MAAM,CAmHxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAE,MAAM,EAAO,GAAG,MAAM,CAuJvF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,CAAC,CAAC,UAAU,EACrB,OAAO,GAAE,MAAe,GACvB,aAAa,CAiGf"}
1
+ {"version":3,"file":"zod-converter.d.ts","sourceRoot":"","sources":["../../src/template/zod-converter.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAoCxB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,aAAa,EAEnB,MAAM,gBAAgB,CAAC;AAexB;;GAEG;AACH,eAAO,MAAM,cAAc;aACzB,UAAU;iBACR,MAAM;iBACN,UAAU,EAAE,iBAAiB;iBAC7B,UAAU,EAAE,kBAAkB;;aAEhC,cAAc;iBACZ,MAAM;iBACN,UAAU,EAAE,uBAAuB;iBACnC,UAAU,EAAE,uBAAuB;;CAE7B,CAAC;AAqGX;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CA8B7E;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAsG3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CA0HrF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CA0BjG;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,MAAM,CAwHxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAE,MAAM,EAAO,GAAG,MAAM,CAwJvF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,CAAC,CAAC,UAAU,EACrB,OAAO,GAAE,MAAe,GACvB,aAAa,CAiGf"}
@@ -259,7 +259,10 @@ function zodTypeToTsTypeDef(zt) {
259
259
  case "default": return zodTypeToTsTypeDef(zt.def.innerType);
260
260
  case "record": {
261
261
  const recordType = zt;
262
- return `{ [ key: ${zodTypeToTsTypeDef(recordType.def.keyType)} ]: ${zodTypeToTsTypeDef(recordType.def.valueType)}}`;
262
+ const keyType = zodTypeToTsTypeDef(recordType.def.keyType);
263
+ const valueType = zodTypeToTsTypeDef(recordType.def.valueType);
264
+ if (recordType.def.partial) return `Partial<Record<${keyType}, ${valueType}>>`;
265
+ return `{ [ key: ${keyType} ]: ${valueType}}`;
263
266
  }
264
267
  case "literal": return Array.from(zt.values).map((value) => {
265
268
  if (isStringValue(value)) return `"${value}"`;
@@ -322,7 +325,7 @@ function zodTypeToZodCode(zt, injectImportKeys = []) {
322
325
  }
323
326
  case "record": {
324
327
  const zRecordDef = zt.def;
325
- return `z.record(${zodTypeToZodCode(zRecordDef.keyType, injectImportKeys)}, ${zodTypeToZodCode(zRecordDef.valueType, injectImportKeys)})`;
328
+ return `z.${zRecordDef.partial ? "partialRecord" : "record"}(${zodTypeToZodCode(zRecordDef.keyType, injectImportKeys)}, ${zodTypeToZodCode(zRecordDef.valueType, injectImportKeys)})`;
326
329
  }
327
330
  case "literal": {
328
331
  const items = Array.from(zt.values).map((value) => {
@@ -479,4 +482,4 @@ var init_zod_converter = __esmMin((() => {
479
482
  init_zod_converter();
480
483
  export { BUILT_IN_TYPES, getZodTypeById, init_zod_converter, propNodeToZodTypeDef, propToZodType, propToZodTypeDef, zodTypeToRenderingNode, zodTypeToTsTypeDef, zodTypeToZodCode };
481
484
 
482
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kLWNvbnZlcnRlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcGxhdGUvem9kLWNvbnZlcnRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuLyoqXG4gKiB6b2QtY29udmVydGVyIOq1rOyEsVxuICogMS4g7Jyg7Yu466as7YuwXG4gKiAgLSBnZXRab2RUeXBlQnlJZFxuICpcbiAqIDIuIFpvZCDtg4DsnoUg67OA7ZmYIChFbnRpdHlQcm9wIC0+IFpvZFR5cGUpXG4gKiAgLSBwcm9wVG9ab2RUeXBlXG4gKlxuICogMy4gRW50aXR5UHJvcC9Ob2RlIC0+IFpvZCDsvZTrk5wg66y47J6Q7Je0XG4gKiAgLSBwcm9wVG9ab2RUeXBlRGVmXG4gKiAgLSBwcm9wTm9kZVRvWm9kVHlwZURlZlxuICpcbiAqIDQuIFpvZCDtg4DsnoUg7J247Iqk7YS07Iqk66W8IO2VtOuLue2VmOuKlCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZggKFpvZFR5cGUgLT4gWm9kQ29kZSlcbiAqICAtIHpvZFR5cGVUb1pvZENvZGVcbiAqXG4gKiA1LiBab2Qg7YOA7J6F7J2EIFVJIOugjOuNlOungeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmCAoWm9kVHlwZSAtPiBSZW5kZXJpbmdOb2RlKVxuICogIC0gem9kVHlwZVRvUmVuZGVyaW5nTm9kZVxuICogIC0gcmVzb2x2ZVJlbmRlclR5cGVcbiAqL1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBCVUlMVF9JTl9UWVBFX0lEUyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzQmlnSW50ZWdlckFycmF5UHJvcCxcbiAgaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcCxcbiAgaXNCb29sZWFuQXJyYXlQcm9wLFxuICBpc0Jvb2xlYW5TaW5nbGVQcm9wLFxuICBpc0RhdGVBcnJheVByb3AsXG4gIGlzRGF0ZVNpbmdsZVByb3AsXG4gIGlzRW51bUFycmF5UHJvcCxcbiAgaXNFbnVtU2luZ2xlUHJvcCxcbiAgaXNJbnRlZ2VyQXJyYXlQcm9wLFxuICBpc0ludGVnZXJTaW5nbGVQcm9wLFxuICBpc0pzb25Qcm9wLFxuICBpc051bWJlckFycmF5UHJvcCxcbiAgaXNOdW1iZXJTaW5nbGVQcm9wLFxuICBpc051bWVyaWNBcnJheVByb3AsXG4gIGlzTnVtZXJpY1NpbmdsZVByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1NlYXJjaFRleHRQcm9wLFxuICBpc1N0cmluZ0FycmF5UHJvcCxcbiAgaXNTdHJpbmdTaW5nbGVQcm9wLFxuICBpc1RzVmVjdG9yUHJvcCxcbiAgaXNVdWlkQXJyYXlQcm9wLFxuICBpc1V1aWRTaW5nbGVQcm9wLFxuICBpc1ZlY3RvckFycmF5UHJvcCxcbiAgaXNWZWN0b3JTaW5nbGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gIFNvbmFtdUZpbGVTY2hlbWEsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICB0eXBlIFJlbmRlcmluZ05vZGUsXG4gIHR5cGUgWm9kU3RyaW5nRm9ybWF0LFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUltcG9ydFVybCB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGlzT2JqZWN0VmFsdWUsIGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuXG4vLyA8YW55PuulvCDsnpDsoJztlZjqs6AsIFpvZOyXkOyEnCDsoJzslb3tlZjripQg6riw67O47KCB7J24IEdlbmVyaWMgVHlwZSBQYXJhbWV0ZXLrpbwg7IKs7Jqp7ZWoLlxudHlwZSBBbnlab2RSZWNvcmQgPSB6LlpvZFJlY29yZDx6LlpvZFN0cmluZyB8IHouWm9kTnVtYmVyIHwgei5ab2RTeW1ib2wsIHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9iamVjdCA9IHouWm9kT2JqZWN0O1xudHlwZSBBbnlab2ROdWxsYWJsZSA9IHouWm9kTnVsbGFibGU8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kRGVmYXVsdCA9IHouWm9kRGVmYXVsdDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RVbmlvbiA9IHouWm9kVW5pb248ei5ab2RUeXBlW10+O1xudHlwZSBBbnlab2RBcnJheSA9IHouWm9kQXJyYXk8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kT3B0aW9uYWwgPSB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT47XG50eXBlIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCA9IHouWm9kVGVtcGxhdGVMaXRlcmFsO1xuXG4vKipcbiAqIOuCtOyepSDtg4DsnoUg7KCV7J2YIChab2Qg7Iqk7YKk66eIICsgVUkg66CM642U66eBIO2DgOyehSlcbiAqL1xuZXhwb3J0IGNvbnN0IEJVSUxUX0lOX1RZUEVTID0ge1xuICBTb25hbXVGaWxlOiB7XG4gICAgc2NoZW1hOiBTb25hbXVGaWxlU2NoZW1hLFxuICAgIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlXCIsXG4gICAgc2NoZW1hTmFtZTogXCJTb25hbXVGaWxlU2NoZW1hXCIsXG4gIH0sXG4gIFwiU29uYW11RmlsZVtdXCI6IHtcbiAgICBzY2hlbWE6IFNvbmFtdUZpbGVBcnJheVNjaGVtYSxcbiAgICByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiLFxuICAgIHNjaGVtYU5hbWU6IFwiU29uYW11RmlsZUFycmF5U2NoZW1hXCIsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBnZXRCdWlsdEluU2NoZW1hTmFtZSh6b2RUeXBlOiB6LlpvZFR5cGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaGVkID0gT2JqZWN0LmVudHJpZXMoQlVJTFRfSU5fVFlQRVMpLmZpbmQoKFt0eXBlSWRdKSA9PiB6b2RUeXBlLmRlc2NyaXB0aW9uID09PSB0eXBlSWQpO1xuICByZXR1cm4gbWF0Y2hlZD8uWzFdLnNjaGVtYU5hbWU7XG59XG5cbi8qKlxuICogem9kRm9ybWF07J2EIFpvZCA0IOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICogWm9kIDTsl5DshJzripQgei5lbWFpbCgpLCB6LnV1aWQoKSDrk7Eg64+F66a97KCB7J24IO2VqOyImCDtmJXtg5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiB6b2RGb3JtYXRUb0NvZGUoZm9ybWF0OiBab2RTdHJpbmdGb3JtYXQpOiBzdHJpbmcge1xuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgXCJpc29EYXRlXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kYXRlKClcIjtcbiAgICBjYXNlIFwiaXNvVGltZVwiOlxuICAgICAgcmV0dXJuIFwiei5pc28udGltZSgpXCI7XG4gICAgY2FzZSBcImlzb0RhdGV0aW1lXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kYXRldGltZSgpXCI7XG4gICAgY2FzZSBcImlzb0R1cmF0aW9uXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kdXJhdGlvbigpXCI7XG4gICAgY2FzZSBcImhhc2hNZDVcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwibWQ1XCIpJztcbiAgICBjYXNlIFwiaGFzaFNoYTFcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwic2hhMVwiKSc7XG4gICAgY2FzZSBcImhhc2hTaGEyNTZcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwic2hhMjU2XCIpJztcbiAgICBjYXNlIFwiaGFzaFNoYTM4NFwiOlxuICAgICAgcmV0dXJuICd6Lmhhc2goXCJzaGEzODRcIiknO1xuICAgIGNhc2UgXCJoYXNoU2hhNTEyXCI6XG4gICAgICByZXR1cm4gJ3ouaGFzaChcInNoYTUxMlwiKSc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBgei4ke2Zvcm1hdH0oKWA7XG4gIH1cbn1cblxuLyoqXG4gKiB6b2RGb3JtYXTsnYQgWm9kIDQg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIFpvZCA07JeQ7ISc64qUIHouZW1haWwoKSwgei51dWlkKCkg65OxIOuPheumveyggeyduCDtlajsiJgg7ZiV7YOc66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gem9kRm9ybWF0VG9UeXBlKGZvcm1hdDogWm9kU3RyaW5nRm9ybWF0KTogei5ab2RUeXBlIHtcbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgIHJldHVybiB6LmVtYWlsKCk7XG4gICAgY2FzZSBcInV1aWRcIjpcbiAgICAgIHJldHVybiB6LnV1aWQoKTtcbiAgICBjYXNlIFwidXJsXCI6XG4gICAgICByZXR1cm4gei51cmwoKTtcbiAgICBjYXNlIFwiaHR0cFVybFwiOlxuICAgICAgcmV0dXJuIHouaHR0cFVybCgpO1xuICAgIGNhc2UgXCJob3N0bmFtZVwiOlxuICAgICAgcmV0dXJuIHouaG9zdG5hbWUoKTtcbiAgICBjYXNlIFwiZW1vamlcIjpcbiAgICAgIHJldHVybiB6LmVtb2ppKCk7XG4gICAgY2FzZSBcImJhc2U2NFwiOlxuICAgICAgcmV0dXJuIHouYmFzZTY0KCk7XG4gICAgY2FzZSBcImJhc2U2NHVybFwiOlxuICAgICAgcmV0dXJuIHouYmFzZTY0dXJsKCk7XG4gICAgY2FzZSBcImhleFwiOlxuICAgICAgcmV0dXJuIHouaGV4KCk7XG4gICAgY2FzZSBcImp3dFwiOlxuICAgICAgcmV0dXJuIHouand0KCk7XG4gICAgY2FzZSBcIm5hbm9pZFwiOlxuICAgICAgcmV0dXJuIHoubmFub2lkKCk7XG4gICAgY2FzZSBcImN1aWRcIjpcbiAgICAgIHJldHVybiB6LmN1aWQoKTtcbiAgICBjYXNlIFwiY3VpZDJcIjpcbiAgICAgIHJldHVybiB6LmN1aWQyKCk7XG4gICAgY2FzZSBcInVsaWRcIjpcbiAgICAgIHJldHVybiB6LnVsaWQoKTtcbiAgICBjYXNlIFwiaXB2NFwiOlxuICAgICAgcmV0dXJuIHouaXB2NCgpO1xuICAgIGNhc2UgXCJpcHY2XCI6XG4gICAgICByZXR1cm4gei5pcHY2KCk7XG4gICAgY2FzZSBcIm1hY1wiOlxuICAgICAgcmV0dXJuIHoubWFjKCk7XG4gICAgY2FzZSBcImNpZHJ2NFwiOlxuICAgICAgcmV0dXJuIHouY2lkcnY0KCk7XG4gICAgY2FzZSBcImNpZHJ2NlwiOlxuICAgICAgcmV0dXJuIHouY2lkcnY2KCk7XG4gICAgY2FzZSBcImlzb0RhdGVcIjpcbiAgICAgIHJldHVybiB6Lmlzby5kYXRlKCk7XG4gICAgY2FzZSBcImlzb1RpbWVcIjpcbiAgICAgIHJldHVybiB6Lmlzby50aW1lKCk7XG4gICAgY2FzZSBcImlzb0RhdGV0aW1lXCI6XG4gICAgICByZXR1cm4gei5pc28uZGF0ZXRpbWUoKTtcbiAgICBjYXNlIFwiaXNvRHVyYXRpb25cIjpcbiAgICAgIHJldHVybiB6Lmlzby5kdXJhdGlvbigpO1xuICAgIGNhc2UgXCJoYXNoTWQ1XCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwibWQ1XCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhMVwiOlxuICAgICAgcmV0dXJuIHouaGFzaChcInNoYTFcIik7XG4gICAgY2FzZSBcImhhc2hTaGEyNTZcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGEyNTZcIik7XG4gICAgY2FzZSBcImhhc2hTaGEzODRcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGEzODRcIik7XG4gICAgY2FzZSBcImhhc2hTaGE1MTJcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGE1MTJcIik7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6FIElE66Gc67aA7YSwIOuPmeyggeycvOuhnCBab2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqIOuCtOyepSDtg4DsnoUoQlVJTFRfSU5fVFlQRV9JRFMp7J2AIOuwlOuhnCDrsJjtmZjtlZjqs6AsXG4gKiDqt7gg7Jm464qUIGRpc3Qg65SU66CJ7Yag66as7JeQ7IScIEVTTeycvOuhnCBpbXBvcnTtlZjsl6wg6rCA7KC47Ji164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Wm9kVHlwZUJ5SWQoem9kVHlwZUlkOiBzdHJpbmcpOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICAvLyDrgrTsnqUg7YOA7J6FIOyymOumrFxuICBpZiAoXG4gICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICBCVUlMVF9JTl9UWVBFX0lEUyBhcyByZWFkb25seSBzdHJpbmdbXVxuICAgICkuaW5jbHVkZXMoem9kVHlwZUlkKVxuICApIHtcbiAgICBjb25zdCBidWlsdEluVHlwZSA9XG4gICAgICBCVUlMVF9JTl9UWVBFU1tcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyB6b2RUeXBlSWQgYXMga2V5b2YgdHlwZW9mIEJVSUxUX0lOX1RZUEVTXG4gICAgICBdO1xuICAgIGlmICghYnVpbHRJblR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg64K07J6lIO2DgOyehSAke3pvZFR5cGVJZH3snZgg7Iqk7YKk66eI6rCAIOygleydmOuQmOyngCDslYrslZjsirXri4jri6RgKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWx0SW5UeXBlLnNjaGVtYS5kZXNjcmliZSh6b2RUeXBlSWQpO1xuICB9XG5cbiAgLy8g7ZSE66Gc7KCd7Yq47JeQ7IScIOygleydmO2VnCDtg4DsnoUg64+Z7KCBIOuhnOuTnFxuICBjb25zdCBtb2R1bGVQYXRoID0gRW50aXR5TWFuYWdlci5nZXRNb2R1bGVQYXRoKHpvZFR5cGVJZCk7XG4gIGNvbnN0IG1vZHVsZUFic1BhdGggPSBwYXRoLmpvaW4oXG4gICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgIHJ1bnRpbWVQYXRoKGBkaXN0L2FwcGxpY2F0aW9uLyR7bW9kdWxlUGF0aH0uanNgKSxcbiAgKTtcbiAgY29uc3QgaW1wb3J0VXJsID0gY3JlYXRlSW1wb3J0VXJsKG1vZHVsZUFic1BhdGgpO1xuICBjb25zdCBpbXBvcnRlZCA9IGF3YWl0IGltcG9ydChpbXBvcnRVcmwpO1xuXG4gIGlmICghaW1wb3J0ZWRbem9kVHlwZUlkXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCB6b2RUeXBlSWQgJHt6b2RUeXBlSWR9YCk7XG4gIH1cbiAgcmV0dXJuIGltcG9ydGVkW3pvZFR5cGVJZF0uZGVzY3JpYmUoem9kVHlwZUlkKTtcbn1cblxuLyoqXG4gKiBFbnRpdHlQcm9w7J2EIFpvZCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICog6rCBIHByb3DsnZgg7YOA7J6F7JeQIOuUsOudvCDsoIHsoIjtlZwgWm9kIHZhbGlkYXRvcuulvCDsg53shLHtlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9wVG9ab2RUeXBlKHByb3A6IEVudGl0eVByb3ApOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICBsZXQgem9kVHlwZTogei5ab2RUeXBlQW55ID0gei51bmtub3duKCk7XG4gIGlmIChpc0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCk7XG4gIH0gZWxzZSBpZiAoaXNJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYmlnaW50KCk7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYmlnaW50KCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0VudW1TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSAoYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCkpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICB6b2RUeXBlID0gem9kRm9ybWF0VG9UeXBlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCAmJiBcIm1heFwiIGluIHpvZFR5cGUpIHtcbiAgICAgICAgem9kVHlwZSA9IC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHpvZFR5cGUgYXMgei5ab2RTdHJpbmdcbiAgICAgICAgKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1N0cmluZ0FycmF5UHJvcChwcm9wKSkge1xuICAgIGxldCBlbGVtZW50VHlwZTogei5ab2RUeXBlO1xuICAgIGlmIChwcm9wLnpvZEZvcm1hdCkge1xuICAgICAgZWxlbWVudFR5cGUgPSB6b2RGb3JtYXRUb1R5cGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoICYmIFwibWF4XCIgaW4gZWxlbWVudFR5cGUpIHtcbiAgICAgICAgZWxlbWVudFR5cGUgPVxuICAgICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgICAgZWxlbWVudFR5cGUgYXMgei5ab2RTdHJpbmdcbiAgICAgICAgICApLm1heChwcm9wLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgZWxlbWVudFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnRUeXBlID0gei5zdHJpbmcoKTtcbiAgICB9XG4gICAgem9kVHlwZSA9IGVsZW1lbnRUeXBlLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5ib29sZWFuKCk7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYm9vbGVhbigpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNEYXRlU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmRhdGUoKTtcbiAgfSBlbHNlIGlmIChpc0RhdGVBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5kYXRlKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc1V1aWRTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoudXVpZCgpO1xuICB9IGVsc2UgaWYgKGlzVXVpZEFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnV1aWQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzSnNvblByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmFycmF5KHoubnVtYmVyKCkpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYXJyYXkoei5hcnJheSh6Lm51bWJlcigpKSk7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSB7XG4gICAgICAvLyBGSyDtg4DsnoXsnYQg7LC47KGwIOyXlO2LsO2LsCBQSyDtg4DsnoXsl5Ag65Sw6528IOqysOyglVxuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgIGNvbnN0IHBrVHlwZSA9IHJlbEVudGl0eS5nZXRQa1R5cGUoKTtcbiAgICAgIGlmIChwa1R5cGUgPT09IFwic3RyaW5nXCIgfHwgcGtUeXBlID09PSBcInV1aWRcIikge1xuICAgICAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHByb3DsnYQgem9kVHlwZeycvOuhnCDrs4DtmZjtlZjripTrjbAg7Iuk7YyoICR7cHJvcH19YCk7XG4gIH1cblxuICBpZiAoXG4gICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICBwcm9wIGFzIHsgdW5zaWduZWQ/OiBib29sZWFuIH1cbiAgICApLnVuc2lnbmVkXG4gICkge1xuICAgIHpvZFR5cGUgPSAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgIHpvZFR5cGUgYXMgei5ab2ROdW1iZXJcbiAgICApLm5vbm5lZ2F0aXZlKCk7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICB6b2RUeXBlID0gem9kVHlwZS5udWxsYWJsZSgpO1xuICB9XG5cbiAgcmV0dXJuIHpvZFR5cGU7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BUb1pvZFR5cGVEZWYocHJvcDogRW50aXR5UHJvcCwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBsZXQgc3RtdDogc3RyaW5nO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpYDtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5pbnQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KClgO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJpZ2ludCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9LmFycmF5KClgO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC56b2RGb3JtYXQpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB6b2RGb3JtYXRUb0NvZGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke2Jhc2V9Lm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RyaW5nQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICBjb25zdCBiYXNlID0gem9kRm9ybWF0VG9Db2RlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtiYXNlfS5tYXgoJHtwcm9wLmxlbmd0aH0pLmFycmF5KClgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX0uYXJyYXkoKWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkubWF4KCR7cHJvcC5sZW5ndGh9KS5hcnJheSgpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkuYXJyYXkoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTnVtYmVyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpYDtcbiAgfSBlbHNlIGlmIChpc051bWJlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmRhdGUoKWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouZGF0ZSgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5ib29sZWFuKClgO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhbkFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJvb2xlYW4oKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc1V1aWRTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoudXVpZCgpYDtcbiAgfSBlbHNlIGlmIChpc1V1aWRBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei51dWlkKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIC8vIOuCtOyepSDtg4DsnoXsnbgg6rK97JqwIOyKpO2CpOuniCDsnbTrpoTsnLzroZwg67OA7ZmYXG4gICAgaWYgKFxuICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIEJVSUxUX0lOX1RZUEVfSURTIGFzIHJlYWRvbmx5IHN0cmluZ1tdXG4gICAgICApLmluY2x1ZGVzKHByb3AuaWQpXG4gICAgKSB7XG4gICAgICBjb25zdCBzY2hlbWFOYW1lID0gcHJvcC5pZCA9PT0gXCJTb25hbXVGaWxlXCIgPyBcIlNvbmFtdUZpbGVTY2hlbWFcIiA6IFwiU29uYW11RmlsZUFycmF5U2NoZW1hXCI7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtzY2hlbWFOYW1lfWA7XG4gICAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2goc2NoZW1hTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgfSBlbHNlIGlmIChpc1ZlY3RvclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6Lm51bWJlcigpKWA7XG4gIH0gZWxzZSBpZiAoaXNWZWN0b3JBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6LmFycmF5KHoubnVtYmVyKCkpKWA7XG4gIH0gZWxzZSBpZiAoaXNUc1ZlY3RvclByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSkge1xuICAgICAgLy8gRksgWm9kIO2DgOyeheydhCDssLjsobAg7JeU7Yuw7YuwIFBLIO2DgOyeheyXkCDrlLDrnbwg6rKw7KCVXG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgY29uc3QgcGtUeXBlID0gcmVsRW50aXR5LmdldFBrVHlwZSgpO1xuICAgICAgaWYgKHBrVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBwa1R5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LnN0cmluZygpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LmludCgpYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g6re47Jm4IHJlbGF0aW9uIOy8gOydtOyKpCDsoJzsmbhcbiAgICAgIHJldHVybiBgLy8gJHtwcm9wLm5hbWV9OiAke3Byb3AucmVsYXRpb25UeXBlfSAke3Byb3Aud2l0aH1gO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCIvLyB1bmFibGUgdG8gcmVzb2x2ZVwiO1xuICB9XG5cbiAgaWYgKFxuICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgcHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9XG4gICAgKS51bnNpZ25lZFxuICApIHtcbiAgICBzdG10ICs9IFwiLm5vbm5lZ2F0aXZlKClcIjtcbiAgfVxuICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgIHN0bXQgKz0gXCIubnVsbGFibGUoKVwiO1xuICB9XG5cbiAgLy8gbnVtZXJpYyDtg4DsnoXsnZgg6rK97JqwIG51bGxhYmxlIOydtO2bhOyXkCBtZXRhIOy2lOqwgCAo66mU7YOA642w7J207YSw6rCAIOy1nOyDgeychCDroIjrsqjsl5Ag7J6I7Ja07JW8IO2VqClcbiAgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkgfHwgaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCArPSAnLm1ldGEoeyBTb25hbXVQcm9wVHlwZTogXCJudW1lcmljXCIgfSknO1xuICB9XG5cbiAgcmV0dXJuIGAke3N0bXR9LGA7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcE5vZGXrpbwgWm9kIO2DgOyehSDsoJXsnZgg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBwbGFpbiwgYXJyYXksIG9iamVjdCDrhbjrk5wg7YOA7J6F7J2EIOyerOq3gOyggeycvOuhnCDsspjrpqztlZjsl6wg7KSR7LKpIOq1rOyhsOulvCDsp4Dsm5Dtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wTm9kZVRvWm9kVHlwZURlZihwcm9wTm9kZTogRW50aXR5UHJvcE5vZGUsIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcInBsYWluXCIpIHtcbiAgICByZXR1cm4gcHJvcFRvWm9kVHlwZURlZihwcm9wTm9kZS5wcm9wLCBpbmplY3RJbXBvcnRLZXlzKTtcbiAgfSBlbHNlIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb3BOb2RlLnByb3AgPyBgJHtwcm9wTm9kZS5wcm9wLm5hbWV9OiBgIDogXCJcIixcbiAgICAgIFwiei5hcnJheSh6Lm9iamVjdCh7XCIsXG4gICAgICBwcm9wTm9kZS5jaGlsZHJlblxuICAgICAgICAubWFwKChjaGlsZFByb3BOb2RlKSA9PiBwcm9wTm9kZVRvWm9kVHlwZURlZihjaGlsZFByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICBcIlwiLFxuICAgICAgXCJ9KSksXCIsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9IGVsc2UgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb3BOb2RlLnByb3AgPyBgJHtwcm9wTm9kZS5wcm9wLm5hbWV9OiBgIDogXCJcIixcbiAgICAgIFwiei5vYmplY3Qoe1wiLFxuICAgICAgcHJvcE5vZGUuY2hpbGRyZW5cbiAgICAgICAgLm1hcCgoY2hpbGRQcm9wTm9kZSkgPT4gcHJvcE5vZGVUb1pvZFR5cGVEZWYoY2hpbGRQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5cykpXG4gICAgICAgIC5qb2luKFwiXFxuXCIpLFxuICAgICAgXCJcIixcbiAgICAgIGB9KSR7cHJvcE5vZGUucHJvcD8ubnVsbGFibGUgPyBcIi5udWxsYWJsZSgpXCIgOiBcIlwifSxgLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBFcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvVHNUeXBlRGVmKHp0OiB6LlpvZFR5cGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHp0LmRlZi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICBjYXNlIFwibnVsbFwiOlxuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICBjYXNlIFwibmV2ZXJcIjpcbiAgICAgIHJldHVybiB6dC5kZWYudHlwZTtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIFwiRGF0ZVwiO1xuICAgIGNhc2UgXCJudWxsYWJsZVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSl9IHwgbnVsbGA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjpcbiAgICAgIHJldHVybiB6b2RUeXBlVG9Uc1R5cGVEZWYoXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIEFueVpvZERlZmF1bHRcbiAgICAgICAgKS5kZWYuaW5uZXJUeXBlLFxuICAgICAgKTtcbiAgICBjYXNlIFwicmVjb3JkXCI6IHtcbiAgICAgIGNvbnN0IHJlY29yZFR5cGUgPVxuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHp0IGFzIEFueVpvZFJlY29yZDtcbiAgICAgIHJldHVybiBgeyBbIGtleTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYua2V5VHlwZSl9IF06ICR7em9kVHlwZVRvVHNUeXBlRGVmKHJlY29yZFR5cGUuZGVmLnZhbHVlVHlwZSl9fWA7XG4gICAgfVxuICAgIGNhc2UgXCJsaXRlcmFsXCI6XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgenQgYXMgei5ab2RMaXRlcmFsXG4gICAgICAgICkudmFsdWVzLFxuICAgICAgKVxuICAgICAgICAubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGBudWxsYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGB1bmRlZmluZWRgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbihcIiB8IFwiKTtcbiAgICBjYXNlIFwidW5pb25cIjpcbiAgICAgIHJldHVybiBgJHtcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgenQgYXMgQW55Wm9kVW5pb25cbiAgICAgICAgKS5vcHRpb25zXG4gICAgICAgICAgLm1hcCgob3B0aW9uKSA9PiB6b2RUeXBlVG9Uc1R5cGVEZWYob3B0aW9uKSlcbiAgICAgICAgICAuam9pbihcIiB8IFwiKVxuICAgICAgfWA7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIHJldHVybiBgJHsvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyB6LlpvZEVudW0pLm9wdGlvbnMubWFwKCh2YWwpID0+IGBcIiR7dmFsfVwiYCkuam9pbihcIiB8IFwiKX1gO1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyBBbnlab2RBcnJheSkuZWxlbWVudCl9W11gO1xuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgY29uc3Qgb2JqZWN0RmllbGRzID0gLyogU0FGRVRZOiBab2TsnZggb2JqZWN0IO2MkOuzhCDrtoTquLDqsIAg6rCd7LK0IO2VhOuTnCDqs4Tslb3snYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIHp0IGFzIEFueVpvZE9iamVjdFxuICAgICAgKVtcInNoYXBlXCJdO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXCJ7XCIsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKG9iamVjdEZpZWxkcykubWFwKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAob2JqZWN0RmllbGRzW2tleV0uZGVmLnR5cGUgPT09IFwib3B0aW9uYWxcIikge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX0/OiAke3pvZFR5cGVUb1RzVHlwZURlZihvYmplY3RGaWVsZHNba2V5XS5kZWYuaW5uZXJUeXBlKX0sYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX06ICR7em9kVHlwZVRvVHNUeXBlRGVmKG9iamVjdEZpZWxkc1trZXldKX0sYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBcIn1cIixcbiAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICB9XG4gICAgY2FzZSBcIm9wdGlvbmFsXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvVHNUeXBlRGVmKC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKHp0IGFzIEFueVpvZE9wdGlvbmFsKS5kZWYuaW5uZXJUeXBlKX0gfCB1bmRlZmluZWRgO1xuICAgIGNhc2UgXCJ0ZW1wbGF0ZV9saXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGRlZiA9IC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6dCBhcyBBbnlab2RUZW1wbGF0ZUxpdGVyYWxcbiAgICAgICkuZGVmO1xuXG4gICAgICAvLyDruYggdGVtcGxhdGUgbGl0ZXJhbOydgCBzdHJpbmfsnLzroZwg7Y+067CxXG4gICAgICBpZiAoIWRlZi5wYXJ0cyB8fCBkZWYucGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgICAgfVxuXG4gICAgICAvLyDqsIEgcGFydOulvCBUeXBlU2NyaXB0IO2DgOyehSDrrLjsnpDsl7TroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGRlZi5wYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgLy8g66as7YSw65+0IOqwkiAoc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG51bGwsIHVuZGVmaW5lZClcbiAgICAgICAgaWYgKGlzU3RyaW5nVmFsdWUocGFydCkpIHtcbiAgICAgICAgICByZXR1cm4gYCR7cGFydH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gWm9kVHlwZSAtIOyerOq3gOyggeycvOuhnCDrs4DtmZhcbiAgICAgICAgaWYgKHBhcnQgJiYgaXNPYmplY3RWYWx1ZShwYXJ0KSAmJiBwYXJ0IGluc3RhbmNlb2Ygei5ab2RUeXBlKSB7XG4gICAgICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVHlwZVRvVHNUeXBlRGVmKFxuICAgICAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBwYXJ0IGFzIHouWm9kVHlwZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBgJFxceyR7aW5uZXJUeXBlfX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7Y+067CxXG4gICAgICAgIHJldHVybiBgXFwke3N0cmluZ31gO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBgXFxgJHtwYXJ0cy5qb2luKFwiXCIpfVxcYGA7XG4gICAgfVxuICAgIGNhc2UgXCJmaWxlXCI6XG4gICAgICByZXR1cm4gXCJGaWxlXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7LKY66as65CY7KeAIOyViuydgCBab2RUeXBlICR7enQuZGVmLnR5cGV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6FIOyduOyKpO2EtOyKpOulvCDtlbTri7ntlZjripQgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvWm9kQ29kZSh6dDogei5ab2RUeXBlLCBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgYnVpbHRJblNjaGVtYU5hbWUgPSBnZXRCdWlsdEluU2NoZW1hTmFtZSh6dCk7XG4gIGlmIChidWlsdEluU2NoZW1hTmFtZSkge1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChidWlsdEluU2NoZW1hTmFtZSk7XG4gICAgcmV0dXJuIGJ1aWx0SW5TY2hlbWFOYW1lO1xuICB9XG5cbiAgc3dpdGNoICh6dC5kZWYudHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBcInouc3RyaW5nKClcIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bWJlcigpXCI7XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIFwiei5iaWdpbnQoKVwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJ6LmJvb2xlYW4oKVwiO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJ6LmRhdGUoKVwiO1xuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bGwoKVwiO1xuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgIHJldHVybiBcInoudW5kZWZpbmVkKClcIjtcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgICByZXR1cm4gXCJ6LmFueSgpXCI7XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICAgIHJldHVybiBcInoudW5rbm93bigpXCI7XG4gICAgY2FzZSBcIm5ldmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm5ldmVyKClcIjtcbiAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKHp0IGFzIEFueVpvZE51bGxhYmxlKS5kZWYuaW5uZXJUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0ubnVsbGFibGUoKWA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjoge1xuICAgICAgY29uc3QgekRlZmF1bHREZWYgPVxuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICB6dCBhcyBBbnlab2REZWZhdWx0XG4gICAgICAgICkuZGVmO1xuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoekRlZmF1bHREZWYuaW5uZXJUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0uZGVmYXVsdCgke3pEZWZhdWx0RGVmLmRlZmF1bHRWYWx1ZX0pYDtcbiAgICB9XG4gICAgY2FzZSBcInJlY29yZFwiOiB7XG4gICAgICBjb25zdCB6UmVjb3JkRGVmID1cbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgenQgYXMgQW55Wm9kUmVjb3JkXG4gICAgICAgICkuZGVmO1xuICAgICAgcmV0dXJuIGB6LnJlY29yZCgke3pvZFR5cGVUb1pvZENvZGUoelJlY29yZERlZi5rZXlUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0sICR7em9kVHlwZVRvWm9kQ29kZShcbiAgICAgICAgelJlY29yZERlZi52YWx1ZVR5cGUsXG4gICAgICAgIGluamVjdEltcG9ydEtleXMsXG4gICAgICApfSlgO1xuICAgIH1cbiAgICBjYXNlIFwibGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20oXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIHouWm9kTGl0ZXJhbDxzdHJpbmcgfCBudW1iZXI+XG4gICAgICAgICkudmFsdWVzLFxuICAgICAgKS5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBgbnVsbGA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBgdW5kZWZpbmVkYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGB6LmxpdGVyYWwoJHtpdGVtc1swXX0pYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgei5saXRlcmFsKFske2l0ZW1zLmpvaW4oXCIsIFwiKX1dKWA7XG4gICAgfVxuICAgIGNhc2UgXCJ1bmlvblwiOlxuICAgICAgcmV0dXJuIGB6LnVuaW9uKFske1xuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICB6dCBhcyBBbnlab2RVbmlvblxuICAgICAgICApLmRlZi5vcHRpb25zXG4gICAgICAgICAgLm1hcCgob3B0aW9uOiB6LlpvZFR5cGUpID0+IHpvZFR5cGVUb1pvZENvZGUob3B0aW9uLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgICAuam9pbihcIixcIilcbiAgICAgIH1dKWA7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIC8vIE5PVEU6IHouZW51bShbXCJBXCIsIFwiQlwiXSnrj4Qgei5lbnVtKHsgQTogXCJBXCIsIEI6IFwiQlwiIH0p66GcIOyymOumrOuQqC5cbiAgICAgIHJldHVybiBgei5lbnVtKHske09iamVjdC5lbnRyaWVzKFxuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICB6dCBhcyB6LlpvZEVudW1cbiAgICAgICAgKS5kZWYuZW50cmllcyxcbiAgICAgIClcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsXSkgPT4gKGlzU3RyaW5nVmFsdWUodmFsKSA/IGAke2tleX06IFwiJHt2YWx9XCJgIDogYCR7a2V5fTogJHt2YWx9YCkpXG4gICAgICAgIC5qb2luKFwiLCBcIil9fSlgO1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgcmV0dXJuIGB6LmFycmF5KCR7em9kVHlwZVRvWm9kQ29kZSgvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyB6LlpvZEFycmF5PHouWm9kVHlwZT4pLmRlZi5lbGVtZW50LCBpbmplY3RJbXBvcnRLZXlzKX0pYDtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IG9iamVjdEZpZWxkcyA9IC8qIFNBRkVUWTogWm9k7J2YIG9iamVjdCDtjJDrs4Qg67aE6riw6rCAIOqwneyytCDtlYTrk5wg6rOE7JW97J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6dCBhcyBBbnlab2RPYmplY3RcbiAgICAgIClbXCJzaGFwZVwiXTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwiei5vYmplY3Qoe1wiLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhvYmplY3RGaWVsZHMpLm1hcChcbiAgICAgICAgICAoa2V5KSA9PiBgJHtrZXl9OiAke3pvZFR5cGVUb1pvZENvZGUob2JqZWN0RmllbGRzW2tleV0sIGluamVjdEltcG9ydEtleXMpfSxgLFxuICAgICAgICApLFxuICAgICAgICBcIn0pXCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoenQgYXMgei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0ub3B0aW9uYWwoKWA7XG4gICAgY2FzZSBcImZpbGVcIjpcbiAgICAgIHJldHVybiBgei5maWxlKClgO1xuICAgIGNhc2UgXCJ0ZW1wbGF0ZV9saXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGRlZiA9IC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6dCBhcyBBbnlab2RUZW1wbGF0ZUxpdGVyYWxcbiAgICAgICkuZGVmO1xuXG4gICAgICAvLyDruYggdGVtcGxhdGUgbGl0ZXJhbFxuICAgICAgaWYgKCFkZWYucGFydHMgfHwgZGVmLnBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gXCJ6LnRlbXBsYXRlTGl0ZXJhbChbXSlcIjtcbiAgICAgIH1cblxuICAgICAgLy8g6rCBIHBhcnTrpbwgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGRlZi5wYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgLy8g66y47J6Q7Je0IOumrO2EsOuftFxuICAgICAgICBpZiAoaXNTdHJpbmdWYWx1ZShwYXJ0KSkge1xuICAgICAgICAgIHJldHVybiBgXCIke3BhcnR9XCJgO1xuICAgICAgICB9XG4gICAgICAgIC8vIFpvZFR5cGUgLSDsnqzqt4DsoIHsnLzroZwg67OA7ZmYXG4gICAgICAgIGlmIChwYXJ0ICYmIGlzT2JqZWN0VmFsdWUocGFydCkgJiYgcGFydCBpbnN0YW5jZW9mIHouWm9kVHlwZSkge1xuICAgICAgICAgIHJldHVybiB6b2RUeXBlVG9ab2RDb2RlKFxuICAgICAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBwYXJ0IGFzIHouWm9kVHlwZSxcbiAgICAgICAgICAgIGluamVjdEltcG9ydEtleXMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIO2PtOuwsVxuICAgICAgICByZXR1cm4gXCJ6LnN0cmluZygpXCI7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGB6LnRlbXBsYXRlTGl0ZXJhbChbJHtwYXJ0cy5qb2luKFwiLCBcIil9XSlgO1xuICAgIH1cbiAgICBjYXNlIFwiaW50ZXJzZWN0aW9uXCI6IHtcbiAgICAgIGNvbnN0IHpJbnRlcnNlY3Rpb25EZWYgPVxuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICB6dCBhcyB6LlpvZEludGVyc2VjdGlvbjx6LlpvZFR5cGUsIHouWm9kVHlwZT5cbiAgICAgICAgKS5kZWY7XG4gICAgICByZXR1cm4gYHouaW50ZXJzZWN0aW9uKCR7em9kVHlwZVRvWm9kQ29kZShcbiAgICAgICAgekludGVyc2VjdGlvbkRlZi5sZWZ0LFxuICAgICAgICBpbmplY3RJbXBvcnRLZXlzLFxuICAgICAgKX0sICR7em9kVHlwZVRvWm9kQ29kZSh6SW50ZXJzZWN0aW9uRGVmLnJpZ2h0LCBpbmplY3RJbXBvcnRLZXlzKX0pYDtcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7LKY66as65CY7KeAIOyViuydgCBab2RUeXBlICR7enQuZGVmLnR5cGV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6F7J2EIFVJIOugjOuNlOungeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOyerOq3gOyggeycvOuhnCDspJHssqnrkJwg7YOA7J6F65Ok7J2EIOyymOumrO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gIHpvZFR5cGU6IHouWm9kVHlwZUFueSxcbiAgYmFzZUtleTogc3RyaW5nID0gXCJyb290XCIsXG4pOiBSZW5kZXJpbmdOb2RlIHtcbiAgY29uc3QgZGVmID0ge1xuICAgIG5hbWU6IGJhc2VLZXksXG4gICAgbGFiZWw6IGluZmxlY3Rpb24uY2FtZWxpemUoYmFzZUtleSwgZmFsc2UpLFxuICAgIHpvZFR5cGUsXG4gIH07XG5cbiAgLyoqXG4gICAqIOy8gOydtOyKpCDsspjrpqwg7Iic7IScXG4gICAqXG4gICAqIDEuIO2KueyImCDsvIDsnbTsiqQgKGRlc2NyaXB0aW9uIOq4sOuwmClcbiAgICogICAgLSBTb25hbXVGaWxlL1NvbmFtdUZpbGVbXSA6IHoub2JqZWN0L3ouYXJyYXnsnbTsp4Drp4wg7YyM7J28IOyXheuhnOuTnOyaqSDrgrTsnqUg7YOA7J6FXG4gICAqXG4gICAqIDIuIOydvOuwmCDsvIDsnbTsiqQgKGluc3RhbmNlb2Yg6riw67CYKVxuICAgKiAgICAtIHouWm9kT2JqZWN0IDog7J2867CYIOqwneyytFxuICAgKiAgICAtIHouWm9kQXJyYXkgOiDsnbzrsJgg67Cw7Je0XG4gICAqICAgICAgLSB2ZWN0b3IgOiB6LmFycmF5KHoubnVtYmVyKeydtOyngOunjCDrhKTsnbTrsI0g6riw67CY7Jy866GcIOuyoe2EsCDsnoTrsqDrlKlcbiAgICogICAgICAtIOydvOuwmCDrsLDsl7QgOiDqt7gg7Jm4XG4gICAqICAgIC0gei5ab2RVbmlvbiwgei5ab2RPcHRpb25hbCwgei5ab2ROdWxsYWJsZSA6IOycoO2LuOumrO2LsCDtg4DsnoVcbiAgICogICAgLSDquLDtg4AgOiByZXNvbHZlUmVuZGVyVHlwZSgp7Jy866GcIOyymOumrFxuICAgKi9cblxuICAvLyDtirnsiJgg7LyA7J207IqkOiBTb25hbXVGaWxlW10g7YOA7J6FIOqwkOyngFxuICBpZiAoem9kVHlwZS5kZXNjcmlwdGlvbiA9PT0gXCJTb25hbXVGaWxlW11cIikge1xuICAgIHJldHVybiB7IC4uLmRlZiwgcmVuZGVyVHlwZTogXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIiB9O1xuICB9XG5cbiAgLy8g7Yq57IiYIOy8gOydtOyKpDogU29uYW11RmlsZSDri6jsnbwg7YOA7J6FIOqwkOyngFxuICBpZiAoem9kVHlwZS5kZXNjcmlwdGlvbiA9PT0gXCJTb25hbXVGaWxlXCIpIHtcbiAgICByZXR1cm4geyAuLi5kZWYsIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlXCIgfTtcbiAgfVxuXG4gIC8vIOydvOuwmCDsvIDsnbTsiqQ6IFpvZE9iamVjdCDssrTtgaxcbiAgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9iamVjdCkge1xuICAgIGNvbnN0IGNvbHVtbktleXMgPSBPYmplY3Qua2V5cyh6b2RUeXBlW1wic2hhcGVcIl0pO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gY29sdW1uS2V5cy5tYXAoKGtleSkgPT4ge1xuICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVHlwZVtcInNoYXBlXCJdW2tleV07XG4gICAgICByZXR1cm4gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGtleSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBjaGlsZHJlbixcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFycmF5KSB7XG4gICAgY29uc3QgaW5uZXJUeXBlID1cbiAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6b2RUeXBlIGFzIHouWm9kQXJyYXk8ei5ab2RUeXBlQW55PlxuICAgICAgKS5kZWYuZWxlbWVudDtcbiAgICAvLyB2ZWN0b3Ig7YOA7J6FIO2MkOuzhDogbnVtYmVyIOuwsOyXtOydtOuptOyEnCBlbWJlZGRpbmcsIHZlY3RvciDrk7HsnZgg7J2066aE7J2EIOqwgOynhCDqsr3smrBcbiAgICBpZiAoXG4gICAgICBpbm5lclR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bWJlciAmJlxuICAgICAgKGJhc2VLZXkuaW5jbHVkZXMoXCJlbWJlZGRpbmdcIikgfHwgYmFzZUtleS5pbmNsdWRlcyhcInZlY3RvclwiKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRlZixcbiAgICAgICAgcmVuZGVyVHlwZTogXCJ2ZWN0b3JcIixcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWYsXG4gICAgICByZW5kZXJUeXBlOiBcImFycmF5XCIsXG4gICAgICBlbGVtZW50OiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGlubmVyVHlwZSwgYmFzZUtleSksXG4gICAgfTtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmlvbikge1xuICAgIGNvbnN0IG9wdGlvbk5vZGVzID1cbiAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6b2RUeXBlIGFzIHouWm9kVW5pb248ei5ab2RUeXBlW10+XG4gICAgICApLmRlZi5vcHRpb25zLm1hcCgob3B0KSA9PiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKG9wdCwgYmFzZUtleSkpO1xuICAgIC8vIFRPRE86IFpvZFVuaW9u7J20IOuTpOyWtOyeiOuKlCDqsr3smrAg7ZW465Ok66eBXG4gICAgcmV0dXJuIG9wdGlvbk5vZGVzWzBdO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9wdGlvbmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHpvZFR5cGUgYXMgei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+XG4gICAgICAgICkuZGVmLmlubmVyVHlwZSxcbiAgICAgICAgYmFzZUtleSxcbiAgICAgICksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bGxhYmxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHpvZFR5cGUgYXMgei5ab2ROdWxsYWJsZTx6LlpvZFR5cGU+XG4gICAgICAgICkuZGVmLmlubmVyVHlwZSxcbiAgICAgICAgYmFzZUtleSxcbiAgICAgICksXG4gICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWYsXG4gICAgICByZW5kZXJUeXBlOiByZXNvbHZlUmVuZGVyVHlwZShiYXNlS2V5LCB6b2RUeXBlKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyeheqzvCDtgqQg7J2066aE7Jy866Gc67aA7YSwIOyggeygiO2VnCBSZW5kZXJUeXBl7J2EIOqysOygle2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJlbmRlclR5cGUoa2V5OiBzdHJpbmcsIHpvZFR5cGU6IHouWm9kVHlwZUFueSk6IFJlbmRlcmluZ05vZGVbXCJyZW5kZXJUeXBlXCJdIHtcbiAgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZERhdGUpIHtcbiAgICByZXR1cm4gXCJkYXRldGltZVwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LmNvcmUuJFpvZFN0cmluZykge1xuICAgIC8vIE5PVEU6IHouWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VmOuptCB6LnVybCgpLCB6LmVtYWlsKCkg65Ox7J2YIO2DgOyeheyXkOyEnCDrrLjsoJzqsIAg7IOd6riw66+A66GcIHouY29yZS4kWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VqFxuICAgIC8vIEZJWE1FOiBlbWFpbOydtOuCmCB1cmwg7YOA7J6FIOuTseyXkCDrjIDtlZwg7LKY66as6rCAIO2VhOyalO2VqFxuICAgIGlmICh6b2RUeXBlLmRlc2NyaXB0aW9uID09PSBcIlNRTERhdGVUaW1lU3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1kYXRldGltZVwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiZGF0ZVwiKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGVcIjtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctaWRcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcIl9pZFwiKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWZrX2lkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICAgIH1cbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2ROdW1iZXIpIHtcbiAgICBpZiAoa2V5ID09PSBcImlkXCIpIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1pZFwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiX2lkXCIpKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItZmtfaWRcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLXBsYWluXCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEJvb2xlYW4pIHtcbiAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgIHJldHVybiBcImVudW1zXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kUmVjb3JkKSB7XG4gICAgcmV0dXJuIFwicmVjb3JkXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQW55IHx8IHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVua25vd24pIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmlvbikge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZExpdGVyYWwpIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RUZW1wbGF0ZUxpdGVyYWwpIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlLmRlZi50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIFwib2JqZWN0XCI7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7IuxIOu2iOqwgCAke2tleX0gJHt6b2RUeXBlLmRlZi50eXBlfWApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThGQSxTQUFTLHFCQUFxQixTQUF3QztDQUVwRSxPQURnQixPQUFPLFFBQVEsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksUUFBUSxnQkFBZ0IsTUFDbkYsQ0FBQSxHQUFVLEVBQUUsQ0FBQztBQUN0Qjs7Ozs7QUFNQSxTQUFTLGdCQUFnQixRQUFpQztDQUN4RCxRQUFRLFFBQVI7RUFDRSxLQUFLLFdBQ0gsT0FBTztFQUNULEtBQUssV0FDSCxPQUFPO0VBQ1QsS0FBSyxlQUNILE9BQU87RUFDVCxLQUFLLGVBQ0gsT0FBTztFQUNULEtBQUssV0FDSCxPQUFPO0VBQ1QsS0FBSyxZQUNILE9BQU87RUFDVCxLQUFLLGNBQ0gsT0FBTztFQUNULEtBQUssY0FDSCxPQUFPO0VBQ1QsS0FBSyxjQUNILE9BQU87RUFDVCxTQUNFLE9BQU8sS0FBSyxPQUFPO0NBQ3ZCO0FBQ0Y7Ozs7O0FBTUEsU0FBUyxnQkFBZ0IsUUFBb0M7Q0FDM0QsUUFBUSxRQUFSO0VBQ0UsS0FBSyxTQUNILE9BQU8sRUFBRSxNQUFNO0VBQ2pCLEtBQUssUUFDSCxPQUFPLEVBQUUsS0FBSztFQUNoQixLQUFLLE9BQ0gsT0FBTyxFQUFFLElBQUk7RUFDZixLQUFLLFdBQ0gsT0FBTyxFQUFFLFFBQVE7RUFDbkIsS0FBSyxZQUNILE9BQU8sRUFBRSxTQUFTO0VBQ3BCLEtBQUssU0FDSCxPQUFPLEVBQUUsTUFBTTtFQUNqQixLQUFLLFVBQ0gsT0FBTyxFQUFFLE9BQU87RUFDbEIsS0FBSyxhQUNILE9BQU8sRUFBRSxVQUFVO0VBQ3JCLEtBQUssT0FDSCxPQUFPLEVBQUUsSUFBSTtFQUNmLEtBQUssT0FDSCxPQUFPLEVBQUUsSUFBSTtFQUNmLEtBQUssVUFDSCxP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
485
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kLWNvbnZlcnRlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcGxhdGUvem9kLWNvbnZlcnRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuLyoqXG4gKiB6b2QtY29udmVydGVyIOq1rOyEsVxuICogMS4g7Jyg7Yu466as7YuwXG4gKiAgLSBnZXRab2RUeXBlQnlJZFxuICpcbiAqIDIuIFpvZCDtg4DsnoUg67OA7ZmYIChFbnRpdHlQcm9wIC0+IFpvZFR5cGUpXG4gKiAgLSBwcm9wVG9ab2RUeXBlXG4gKlxuICogMy4gRW50aXR5UHJvcC9Ob2RlIC0+IFpvZCDsvZTrk5wg66y47J6Q7Je0XG4gKiAgLSBwcm9wVG9ab2RUeXBlRGVmXG4gKiAgLSBwcm9wTm9kZVRvWm9kVHlwZURlZlxuICpcbiAqIDQuIFpvZCDtg4DsnoUg7J247Iqk7YS07Iqk66W8IO2VtOuLue2VmOuKlCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZggKFpvZFR5cGUgLT4gWm9kQ29kZSlcbiAqICAtIHpvZFR5cGVUb1pvZENvZGVcbiAqXG4gKiA1LiBab2Qg7YOA7J6F7J2EIFVJIOugjOuNlOungeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmCAoWm9kVHlwZSAtPiBSZW5kZXJpbmdOb2RlKVxuICogIC0gem9kVHlwZVRvUmVuZGVyaW5nTm9kZVxuICogIC0gcmVzb2x2ZVJlbmRlclR5cGVcbiAqL1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBCVUlMVF9JTl9UWVBFX0lEUyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzQmlnSW50ZWdlckFycmF5UHJvcCxcbiAgaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcCxcbiAgaXNCb29sZWFuQXJyYXlQcm9wLFxuICBpc0Jvb2xlYW5TaW5nbGVQcm9wLFxuICBpc0RhdGVBcnJheVByb3AsXG4gIGlzRGF0ZVNpbmdsZVByb3AsXG4gIGlzRW51bUFycmF5UHJvcCxcbiAgaXNFbnVtU2luZ2xlUHJvcCxcbiAgaXNJbnRlZ2VyQXJyYXlQcm9wLFxuICBpc0ludGVnZXJTaW5nbGVQcm9wLFxuICBpc0pzb25Qcm9wLFxuICBpc051bWJlckFycmF5UHJvcCxcbiAgaXNOdW1iZXJTaW5nbGVQcm9wLFxuICBpc051bWVyaWNBcnJheVByb3AsXG4gIGlzTnVtZXJpY1NpbmdsZVByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1NlYXJjaFRleHRQcm9wLFxuICBpc1N0cmluZ0FycmF5UHJvcCxcbiAgaXNTdHJpbmdTaW5nbGVQcm9wLFxuICBpc1RzVmVjdG9yUHJvcCxcbiAgaXNVdWlkQXJyYXlQcm9wLFxuICBpc1V1aWRTaW5nbGVQcm9wLFxuICBpc1ZlY3RvckFycmF5UHJvcCxcbiAgaXNWZWN0b3JTaW5nbGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gIFNvbmFtdUZpbGVTY2hlbWEsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICB0eXBlIFJlbmRlcmluZ05vZGUsXG4gIHR5cGUgWm9kU3RyaW5nRm9ybWF0LFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUltcG9ydFVybCB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGlzT2JqZWN0VmFsdWUsIGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuXG4vLyA8YW55PuulvCDsnpDsoJztlZjqs6AsIFpvZOyXkOyEnCDsoJzslb3tlZjripQg6riw67O47KCB7J24IEdlbmVyaWMgVHlwZSBQYXJhbWV0ZXLrpbwg7IKs7Jqp7ZWoLlxudHlwZSBBbnlab2RSZWNvcmQgPSB6LlpvZFJlY29yZDx6LlpvZFN0cmluZyB8IHouWm9kTnVtYmVyIHwgei5ab2RTeW1ib2wsIHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9iamVjdCA9IHouWm9kT2JqZWN0O1xudHlwZSBBbnlab2ROdWxsYWJsZSA9IHouWm9kTnVsbGFibGU8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kRGVmYXVsdCA9IHouWm9kRGVmYXVsdDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RVbmlvbiA9IHouWm9kVW5pb248ei5ab2RUeXBlW10+O1xudHlwZSBBbnlab2RBcnJheSA9IHouWm9kQXJyYXk8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kT3B0aW9uYWwgPSB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT47XG50eXBlIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCA9IHouWm9kVGVtcGxhdGVMaXRlcmFsO1xuXG4vKipcbiAqIOuCtOyepSDtg4DsnoUg7KCV7J2YIChab2Qg7Iqk7YKk66eIICsgVUkg66CM642U66eBIO2DgOyehSlcbiAqL1xuZXhwb3J0IGNvbnN0IEJVSUxUX0lOX1RZUEVTID0ge1xuICBTb25hbXVGaWxlOiB7XG4gICAgc2NoZW1hOiBTb25hbXVGaWxlU2NoZW1hLFxuICAgIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlXCIsXG4gICAgc2NoZW1hTmFtZTogXCJTb25hbXVGaWxlU2NoZW1hXCIsXG4gIH0sXG4gIFwiU29uYW11RmlsZVtdXCI6IHtcbiAgICBzY2hlbWE6IFNvbmFtdUZpbGVBcnJheVNjaGVtYSxcbiAgICByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiLFxuICAgIHNjaGVtYU5hbWU6IFwiU29uYW11RmlsZUFycmF5U2NoZW1hXCIsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBnZXRCdWlsdEluU2NoZW1hTmFtZSh6b2RUeXBlOiB6LlpvZFR5cGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaGVkID0gT2JqZWN0LmVudHJpZXMoQlVJTFRfSU5fVFlQRVMpLmZpbmQoKFt0eXBlSWRdKSA9PiB6b2RUeXBlLmRlc2NyaXB0aW9uID09PSB0eXBlSWQpO1xuICByZXR1cm4gbWF0Y2hlZD8uWzFdLnNjaGVtYU5hbWU7XG59XG5cbi8qKlxuICogem9kRm9ybWF07J2EIFpvZCA0IOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICogWm9kIDTsl5DshJzripQgei5lbWFpbCgpLCB6LnV1aWQoKSDrk7Eg64+F66a97KCB7J24IO2VqOyImCDtmJXtg5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiB6b2RGb3JtYXRUb0NvZGUoZm9ybWF0OiBab2RTdHJpbmdGb3JtYXQpOiBzdHJpbmcge1xuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgXCJpc29EYXRlXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kYXRlKClcIjtcbiAgICBjYXNlIFwiaXNvVGltZVwiOlxuICAgICAgcmV0dXJuIFwiei5pc28udGltZSgpXCI7XG4gICAgY2FzZSBcImlzb0RhdGV0aW1lXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kYXRldGltZSgpXCI7XG4gICAgY2FzZSBcImlzb0R1cmF0aW9uXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kdXJhdGlvbigpXCI7XG4gICAgY2FzZSBcImhhc2hNZDVcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwibWQ1XCIpJztcbiAgICBjYXNlIFwiaGFzaFNoYTFcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwic2hhMVwiKSc7XG4gICAgY2FzZSBcImhhc2hTaGEyNTZcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwic2hhMjU2XCIpJztcbiAgICBjYXNlIFwiaGFzaFNoYTM4NFwiOlxuICAgICAgcmV0dXJuICd6Lmhhc2goXCJzaGEzODRcIiknO1xuICAgIGNhc2UgXCJoYXNoU2hhNTEyXCI6XG4gICAgICByZXR1cm4gJ3ouaGFzaChcInNoYTUxMlwiKSc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBgei4ke2Zvcm1hdH0oKWA7XG4gIH1cbn1cblxuLyoqXG4gKiB6b2RGb3JtYXTsnYQgWm9kIDQg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIFpvZCA07JeQ7ISc64qUIHouZW1haWwoKSwgei51dWlkKCkg65OxIOuPheumveyggeyduCDtlajsiJgg7ZiV7YOc66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gem9kRm9ybWF0VG9UeXBlKGZvcm1hdDogWm9kU3RyaW5nRm9ybWF0KTogei5ab2RUeXBlIHtcbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgIHJldHVybiB6LmVtYWlsKCk7XG4gICAgY2FzZSBcInV1aWRcIjpcbiAgICAgIHJldHVybiB6LnV1aWQoKTtcbiAgICBjYXNlIFwidXJsXCI6XG4gICAgICByZXR1cm4gei51cmwoKTtcbiAgICBjYXNlIFwiaHR0cFVybFwiOlxuICAgICAgcmV0dXJuIHouaHR0cFVybCgpO1xuICAgIGNhc2UgXCJob3N0bmFtZVwiOlxuICAgICAgcmV0dXJuIHouaG9zdG5hbWUoKTtcbiAgICBjYXNlIFwiZW1vamlcIjpcbiAgICAgIHJldHVybiB6LmVtb2ppKCk7XG4gICAgY2FzZSBcImJhc2U2NFwiOlxuICAgICAgcmV0dXJuIHouYmFzZTY0KCk7XG4gICAgY2FzZSBcImJhc2U2NHVybFwiOlxuICAgICAgcmV0dXJuIHouYmFzZTY0dXJsKCk7XG4gICAgY2FzZSBcImhleFwiOlxuICAgICAgcmV0dXJuIHouaGV4KCk7XG4gICAgY2FzZSBcImp3dFwiOlxuICAgICAgcmV0dXJuIHouand0KCk7XG4gICAgY2FzZSBcIm5hbm9pZFwiOlxuICAgICAgcmV0dXJuIHoubmFub2lkKCk7XG4gICAgY2FzZSBcImN1aWRcIjpcbiAgICAgIHJldHVybiB6LmN1aWQoKTtcbiAgICBjYXNlIFwiY3VpZDJcIjpcbiAgICAgIHJldHVybiB6LmN1aWQyKCk7XG4gICAgY2FzZSBcInVsaWRcIjpcbiAgICAgIHJldHVybiB6LnVsaWQoKTtcbiAgICBjYXNlIFwiaXB2NFwiOlxuICAgICAgcmV0dXJuIHouaXB2NCgpO1xuICAgIGNhc2UgXCJpcHY2XCI6XG4gICAgICByZXR1cm4gei5pcHY2KCk7XG4gICAgY2FzZSBcIm1hY1wiOlxuICAgICAgcmV0dXJuIHoubWFjKCk7XG4gICAgY2FzZSBcImNpZHJ2NFwiOlxuICAgICAgcmV0dXJuIHouY2lkcnY0KCk7XG4gICAgY2FzZSBcImNpZHJ2NlwiOlxuICAgICAgcmV0dXJuIHouY2lkcnY2KCk7XG4gICAgY2FzZSBcImlzb0RhdGVcIjpcbiAgICAgIHJldHVybiB6Lmlzby5kYXRlKCk7XG4gICAgY2FzZSBcImlzb1RpbWVcIjpcbiAgICAgIHJldHVybiB6Lmlzby50aW1lKCk7XG4gICAgY2FzZSBcImlzb0RhdGV0aW1lXCI6XG4gICAgICByZXR1cm4gei5pc28uZGF0ZXRpbWUoKTtcbiAgICBjYXNlIFwiaXNvRHVyYXRpb25cIjpcbiAgICAgIHJldHVybiB6Lmlzby5kdXJhdGlvbigpO1xuICAgIGNhc2UgXCJoYXNoTWQ1XCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwibWQ1XCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhMVwiOlxuICAgICAgcmV0dXJuIHouaGFzaChcInNoYTFcIik7XG4gICAgY2FzZSBcImhhc2hTaGEyNTZcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGEyNTZcIik7XG4gICAgY2FzZSBcImhhc2hTaGEzODRcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGEzODRcIik7XG4gICAgY2FzZSBcImhhc2hTaGE1MTJcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGE1MTJcIik7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6FIElE66Gc67aA7YSwIOuPmeyggeycvOuhnCBab2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqIOuCtOyepSDtg4DsnoUoQlVJTFRfSU5fVFlQRV9JRFMp7J2AIOuwlOuhnCDrsJjtmZjtlZjqs6AsXG4gKiDqt7gg7Jm464qUIGRpc3Qg65SU66CJ7Yag66as7JeQ7IScIEVTTeycvOuhnCBpbXBvcnTtlZjsl6wg6rCA7KC47Ji164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Wm9kVHlwZUJ5SWQoem9kVHlwZUlkOiBzdHJpbmcpOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICAvLyDrgrTsnqUg7YOA7J6FIOyymOumrFxuICBpZiAoXG4gICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICBCVUlMVF9JTl9UWVBFX0lEUyBhcyByZWFkb25seSBzdHJpbmdbXVxuICAgICkuaW5jbHVkZXMoem9kVHlwZUlkKVxuICApIHtcbiAgICBjb25zdCBidWlsdEluVHlwZSA9XG4gICAgICBCVUlMVF9JTl9UWVBFU1tcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyB6b2RUeXBlSWQgYXMga2V5b2YgdHlwZW9mIEJVSUxUX0lOX1RZUEVTXG4gICAgICBdO1xuICAgIGlmICghYnVpbHRJblR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg64K07J6lIO2DgOyehSAke3pvZFR5cGVJZH3snZgg7Iqk7YKk66eI6rCAIOygleydmOuQmOyngCDslYrslZjsirXri4jri6RgKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWx0SW5UeXBlLnNjaGVtYS5kZXNjcmliZSh6b2RUeXBlSWQpO1xuICB9XG5cbiAgLy8g7ZSE66Gc7KCd7Yq47JeQ7IScIOygleydmO2VnCDtg4DsnoUg64+Z7KCBIOuhnOuTnFxuICBjb25zdCBtb2R1bGVQYXRoID0gRW50aXR5TWFuYWdlci5nZXRNb2R1bGVQYXRoKHpvZFR5cGVJZCk7XG4gIGNvbnN0IG1vZHVsZUFic1BhdGggPSBwYXRoLmpvaW4oXG4gICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgIHJ1bnRpbWVQYXRoKGBkaXN0L2FwcGxpY2F0aW9uLyR7bW9kdWxlUGF0aH0uanNgKSxcbiAgKTtcbiAgY29uc3QgaW1wb3J0VXJsID0gY3JlYXRlSW1wb3J0VXJsKG1vZHVsZUFic1BhdGgpO1xuICBjb25zdCBpbXBvcnRlZCA9IGF3YWl0IGltcG9ydChpbXBvcnRVcmwpO1xuXG4gIGlmICghaW1wb3J0ZWRbem9kVHlwZUlkXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCB6b2RUeXBlSWQgJHt6b2RUeXBlSWR9YCk7XG4gIH1cbiAgcmV0dXJuIGltcG9ydGVkW3pvZFR5cGVJZF0uZGVzY3JpYmUoem9kVHlwZUlkKTtcbn1cblxuLyoqXG4gKiBFbnRpdHlQcm9w7J2EIFpvZCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICog6rCBIHByb3DsnZgg7YOA7J6F7JeQIOuUsOudvCDsoIHsoIjtlZwgWm9kIHZhbGlkYXRvcuulvCDsg53shLHtlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9wVG9ab2RUeXBlKHByb3A6IEVudGl0eVByb3ApOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICBsZXQgem9kVHlwZTogei5ab2RUeXBlQW55ID0gei51bmtub3duKCk7XG4gIGlmIChpc0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCk7XG4gIH0gZWxzZSBpZiAoaXNJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYmlnaW50KCk7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYmlnaW50KCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0VudW1TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSAoYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCkpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICB6b2RUeXBlID0gem9kRm9ybWF0VG9UeXBlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCAmJiBcIm1heFwiIGluIHpvZFR5cGUpIHtcbiAgICAgICAgem9kVHlwZSA9IC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHpvZFR5cGUgYXMgei5ab2RTdHJpbmdcbiAgICAgICAgKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1N0cmluZ0FycmF5UHJvcChwcm9wKSkge1xuICAgIGxldCBlbGVtZW50VHlwZTogei5ab2RUeXBlO1xuICAgIGlmIChwcm9wLnpvZEZvcm1hdCkge1xuICAgICAgZWxlbWVudFR5cGUgPSB6b2RGb3JtYXRUb1R5cGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoICYmIFwibWF4XCIgaW4gZWxlbWVudFR5cGUpIHtcbiAgICAgICAgZWxlbWVudFR5cGUgPVxuICAgICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgICAgZWxlbWVudFR5cGUgYXMgei5ab2RTdHJpbmdcbiAgICAgICAgICApLm1heChwcm9wLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgZWxlbWVudFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnRUeXBlID0gei5zdHJpbmcoKTtcbiAgICB9XG4gICAgem9kVHlwZSA9IGVsZW1lbnRUeXBlLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5ib29sZWFuKCk7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYm9vbGVhbigpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNEYXRlU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmRhdGUoKTtcbiAgfSBlbHNlIGlmIChpc0RhdGVBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5kYXRlKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc1V1aWRTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoudXVpZCgpO1xuICB9IGVsc2UgaWYgKGlzVXVpZEFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnV1aWQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzSnNvblByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmFycmF5KHoubnVtYmVyKCkpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYXJyYXkoei5hcnJheSh6Lm51bWJlcigpKSk7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSB7XG4gICAgICAvLyBGSyDtg4DsnoXsnYQg7LC47KGwIOyXlO2LsO2LsCBQSyDtg4DsnoXsl5Ag65Sw6528IOqysOyglVxuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgIGNvbnN0IHBrVHlwZSA9IHJlbEVudGl0eS5nZXRQa1R5cGUoKTtcbiAgICAgIGlmIChwa1R5cGUgPT09IFwic3RyaW5nXCIgfHwgcGtUeXBlID09PSBcInV1aWRcIikge1xuICAgICAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHByb3DsnYQgem9kVHlwZeycvOuhnCDrs4DtmZjtlZjripTrjbAg7Iuk7YyoICR7cHJvcH19YCk7XG4gIH1cblxuICBpZiAoXG4gICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICBwcm9wIGFzIHsgdW5zaWduZWQ/OiBib29sZWFuIH1cbiAgICApLnVuc2lnbmVkXG4gICkge1xuICAgIHpvZFR5cGUgPSAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgIHpvZFR5cGUgYXMgei5ab2ROdW1iZXJcbiAgICApLm5vbm5lZ2F0aXZlKCk7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICB6b2RUeXBlID0gem9kVHlwZS5udWxsYWJsZSgpO1xuICB9XG5cbiAgcmV0dXJuIHpvZFR5cGU7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BUb1pvZFR5cGVEZWYocHJvcDogRW50aXR5UHJvcCwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBsZXQgc3RtdDogc3RyaW5nO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpYDtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5pbnQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KClgO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJpZ2ludCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9LmFycmF5KClgO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC56b2RGb3JtYXQpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB6b2RGb3JtYXRUb0NvZGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke2Jhc2V9Lm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RyaW5nQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICBjb25zdCBiYXNlID0gem9kRm9ybWF0VG9Db2RlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtiYXNlfS5tYXgoJHtwcm9wLmxlbmd0aH0pLmFycmF5KClgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX0uYXJyYXkoKWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkubWF4KCR7cHJvcC5sZW5ndGh9KS5hcnJheSgpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkuYXJyYXkoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTnVtYmVyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpYDtcbiAgfSBlbHNlIGlmIChpc051bWJlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmRhdGUoKWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouZGF0ZSgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5ib29sZWFuKClgO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhbkFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJvb2xlYW4oKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc1V1aWRTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoudXVpZCgpYDtcbiAgfSBlbHNlIGlmIChpc1V1aWRBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei51dWlkKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIC8vIOuCtOyepSDtg4DsnoXsnbgg6rK97JqwIOyKpO2CpOuniCDsnbTrpoTsnLzroZwg67OA7ZmYXG4gICAgaWYgKFxuICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIEJVSUxUX0lOX1RZUEVfSURTIGFzIHJlYWRvbmx5IHN0cmluZ1tdXG4gICAgICApLmluY2x1ZGVzKHByb3AuaWQpXG4gICAgKSB7XG4gICAgICBjb25zdCBzY2hlbWFOYW1lID0gcHJvcC5pZCA9PT0gXCJTb25hbXVGaWxlXCIgPyBcIlNvbmFtdUZpbGVTY2hlbWFcIiA6IFwiU29uYW11RmlsZUFycmF5U2NoZW1hXCI7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtzY2hlbWFOYW1lfWA7XG4gICAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2goc2NoZW1hTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgfSBlbHNlIGlmIChpc1ZlY3RvclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6Lm51bWJlcigpKWA7XG4gIH0gZWxzZSBpZiAoaXNWZWN0b3JBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6LmFycmF5KHoubnVtYmVyKCkpKWA7XG4gIH0gZWxzZSBpZiAoaXNUc1ZlY3RvclByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSkge1xuICAgICAgLy8gRksgWm9kIO2DgOyeheydhCDssLjsobAg7JeU7Yuw7YuwIFBLIO2DgOyeheyXkCDrlLDrnbwg6rKw7KCVXG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgY29uc3QgcGtUeXBlID0gcmVsRW50aXR5LmdldFBrVHlwZSgpO1xuICAgICAgaWYgKHBrVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBwa1R5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LnN0cmluZygpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LmludCgpYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g6re47Jm4IHJlbGF0aW9uIOy8gOydtOyKpCDsoJzsmbhcbiAgICAgIHJldHVybiBgLy8gJHtwcm9wLm5hbWV9OiAke3Byb3AucmVsYXRpb25UeXBlfSAke3Byb3Aud2l0aH1gO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCIvLyB1bmFibGUgdG8gcmVzb2x2ZVwiO1xuICB9XG5cbiAgaWYgKFxuICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgcHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9XG4gICAgKS51bnNpZ25lZFxuICApIHtcbiAgICBzdG10ICs9IFwiLm5vbm5lZ2F0aXZlKClcIjtcbiAgfVxuICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgIHN0bXQgKz0gXCIubnVsbGFibGUoKVwiO1xuICB9XG5cbiAgLy8gbnVtZXJpYyDtg4DsnoXsnZgg6rK97JqwIG51bGxhYmxlIOydtO2bhOyXkCBtZXRhIOy2lOqwgCAo66mU7YOA642w7J207YSw6rCAIOy1nOyDgeychCDroIjrsqjsl5Ag7J6I7Ja07JW8IO2VqClcbiAgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkgfHwgaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCArPSAnLm1ldGEoeyBTb25hbXVQcm9wVHlwZTogXCJudW1lcmljXCIgfSknO1xuICB9XG5cbiAgcmV0dXJuIGAke3N0bXR9LGA7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcE5vZGXrpbwgWm9kIO2DgOyehSDsoJXsnZgg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBwbGFpbiwgYXJyYXksIG9iamVjdCDrhbjrk5wg7YOA7J6F7J2EIOyerOq3gOyggeycvOuhnCDsspjrpqztlZjsl6wg7KSR7LKpIOq1rOyhsOulvCDsp4Dsm5Dtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wTm9kZVRvWm9kVHlwZURlZihwcm9wTm9kZTogRW50aXR5UHJvcE5vZGUsIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcInBsYWluXCIpIHtcbiAgICByZXR1cm4gcHJvcFRvWm9kVHlwZURlZihwcm9wTm9kZS5wcm9wLCBpbmplY3RJbXBvcnRLZXlzKTtcbiAgfSBlbHNlIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb3BOb2RlLnByb3AgPyBgJHtwcm9wTm9kZS5wcm9wLm5hbWV9OiBgIDogXCJcIixcbiAgICAgIFwiei5hcnJheSh6Lm9iamVjdCh7XCIsXG4gICAgICBwcm9wTm9kZS5jaGlsZHJlblxuICAgICAgICAubWFwKChjaGlsZFByb3BOb2RlKSA9PiBwcm9wTm9kZVRvWm9kVHlwZURlZihjaGlsZFByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICBcIlwiLFxuICAgICAgXCJ9KSksXCIsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9IGVsc2UgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb3BOb2RlLnByb3AgPyBgJHtwcm9wTm9kZS5wcm9wLm5hbWV9OiBgIDogXCJcIixcbiAgICAgIFwiei5vYmplY3Qoe1wiLFxuICAgICAgcHJvcE5vZGUuY2hpbGRyZW5cbiAgICAgICAgLm1hcCgoY2hpbGRQcm9wTm9kZSkgPT4gcHJvcE5vZGVUb1pvZFR5cGVEZWYoY2hpbGRQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5cykpXG4gICAgICAgIC5qb2luKFwiXFxuXCIpLFxuICAgICAgXCJcIixcbiAgICAgIGB9KSR7cHJvcE5vZGUucHJvcD8ubnVsbGFibGUgPyBcIi5udWxsYWJsZSgpXCIgOiBcIlwifSxgLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBFcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvVHNUeXBlRGVmKHp0OiB6LlpvZFR5cGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHp0LmRlZi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICBjYXNlIFwibnVsbFwiOlxuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICBjYXNlIFwibmV2ZXJcIjpcbiAgICAgIHJldHVybiB6dC5kZWYudHlwZTtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIFwiRGF0ZVwiO1xuICAgIGNhc2UgXCJudWxsYWJsZVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSl9IHwgbnVsbGA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjpcbiAgICAgIHJldHVybiB6b2RUeXBlVG9Uc1R5cGVEZWYoXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIEFueVpvZERlZmF1bHRcbiAgICAgICAgKS5kZWYuaW5uZXJUeXBlLFxuICAgICAgKTtcbiAgICBjYXNlIFwicmVjb3JkXCI6IHtcbiAgICAgIGNvbnN0IHJlY29yZFR5cGUgPVxuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHp0IGFzIEFueVpvZFJlY29yZDtcbiAgICAgIGNvbnN0IGtleVR5cGUgPSB6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYua2V5VHlwZSk7XG4gICAgICBjb25zdCB2YWx1ZVR5cGUgPSB6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYudmFsdWVUeXBlKTtcbiAgICAgIGlmIChyZWNvcmRUeXBlLmRlZi5wYXJ0aWFsKSB7XG4gICAgICAgIHJldHVybiBgUGFydGlhbDxSZWNvcmQ8JHtrZXlUeXBlfSwgJHt2YWx1ZVR5cGV9Pj5gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGB7IFsga2V5OiAke2tleVR5cGV9IF06ICR7dmFsdWVUeXBlfX1gO1xuICAgIH1cbiAgICBjYXNlIFwibGl0ZXJhbFwiOlxuICAgICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIHouWm9kTGl0ZXJhbFxuICAgICAgICApLnZhbHVlcyxcbiAgICAgIClcbiAgICAgICAgLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAoaXNTdHJpbmdWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBgbnVsbGA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBgdW5kZWZpbmVkYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIgfCBcIik7XG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4gYCR7XG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIEFueVpvZFVuaW9uXG4gICAgICAgICkub3B0aW9uc1xuICAgICAgICAgIC5tYXAoKG9wdGlvbikgPT4gem9kVHlwZVRvVHNUeXBlRGVmKG9wdGlvbikpXG4gICAgICAgICAgLmpvaW4oXCIgfCBcIilcbiAgICAgIH1gO1xuICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICByZXR1cm4gYCR7LyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoenQgYXMgei5ab2RFbnVtKS5vcHRpb25zLm1hcCgodmFsKSA9PiBgXCIke3ZhbH1cImApLmpvaW4oXCIgfCBcIil9YDtcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9Uc1R5cGVEZWYoLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoenQgYXMgQW55Wm9kQXJyYXkpLmVsZW1lbnQpfVtdYDtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IG9iamVjdEZpZWxkcyA9IC8qIFNBRkVUWTogWm9k7J2YIG9iamVjdCDtjJDrs4Qg67aE6riw6rCAIOqwneyytCDtlYTrk5wg6rOE7JW97J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6dCBhcyBBbnlab2RPYmplY3RcbiAgICAgIClbXCJzaGFwZVwiXTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwie1wiLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhvYmplY3RGaWVsZHMpLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgICAgaWYgKG9iamVjdEZpZWxkc1trZXldLmRlZi50eXBlID09PSBcIm9wdGlvbmFsXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtrZXl9PzogJHt6b2RUeXBlVG9Uc1R5cGVEZWYob2JqZWN0RmllbGRzW2tleV0uZGVmLmlubmVyVHlwZSl9LGA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtrZXl9OiAke3pvZFR5cGVUb1RzVHlwZURlZihvYmplY3RGaWVsZHNba2V5XSl9LGA7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgXCJ9XCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyBBbnlab2RPcHRpb25hbCkuZGVmLmlubmVyVHlwZSl9IHwgdW5kZWZpbmVkYDtcbiAgICBjYXNlIFwidGVtcGxhdGVfbGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBkZWYgPSAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgenQgYXMgQW55Wm9kVGVtcGxhdGVMaXRlcmFsXG4gICAgICApLmRlZjtcblxuICAgICAgLy8g67mIIHRlbXBsYXRlIGxpdGVyYWzsnYAgc3RyaW5n7Jy866GcIO2PtOuwsVxuICAgICAgaWYgKCFkZWYucGFydHMgfHwgZGVmLnBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICAgIH1cblxuICAgICAgLy8g6rCBIHBhcnTrpbwgVHlwZVNjcmlwdCDtg4DsnoUg66y47J6Q7Je066GcIOuzgO2ZmFxuICAgICAgY29uc3QgcGFydHMgPSBkZWYucGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgIC8vIOumrO2EsOuftCDqsJIgKHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBudWxsLCB1bmRlZmluZWQpXG4gICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHBhcnQpKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3BhcnR9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFpvZFR5cGUgLSDsnqzqt4DsoIHsnLzroZwg67OA7ZmYXG4gICAgICAgIGlmIChwYXJ0ICYmIGlzT2JqZWN0VmFsdWUocGFydCkgJiYgcGFydCBpbnN0YW5jZW9mIHouWm9kVHlwZSkge1xuICAgICAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFR5cGVUb1RzVHlwZURlZihcbiAgICAgICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gcGFydCBhcyB6LlpvZFR5cGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gYCRcXHske2lubmVyVHlwZX19YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIO2PtOuwsVxuICAgICAgICByZXR1cm4gYFxcJHtzdHJpbmd9YDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYFxcYCR7cGFydHMuam9pbihcIlwiKX1cXGBgO1xuICAgIH1cbiAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgcmV0dXJuIFwiRmlsZVwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyymOumrOuQmOyngCDslYrsnYAgWm9kVHlwZSAke3p0LmRlZi50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyehSDsnbjsiqTthLTsiqTrpbwg7ZW064u57ZWY64qUIFpvZCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1pvZENvZGUoenQ6IHouWm9kVHlwZSwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10gPSBbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGJ1aWx0SW5TY2hlbWFOYW1lID0gZ2V0QnVpbHRJblNjaGVtYU5hbWUoenQpO1xuICBpZiAoYnVpbHRJblNjaGVtYU5hbWUpIHtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2goYnVpbHRJblNjaGVtYU5hbWUpO1xuICAgIHJldHVybiBidWlsdEluU2NoZW1hTmFtZTtcbiAgfVxuXG4gIHN3aXRjaCAoenQuZGVmLnR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gXCJ6LnN0cmluZygpXCI7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgcmV0dXJuIFwiei5udW1iZXIoKVwiO1xuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgIHJldHVybiBcInouYmlnaW50KClcIjtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIFwiei5ib29sZWFuKClcIjtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIFwiei5kYXRlKClcIjtcbiAgICBjYXNlIFwibnVsbFwiOlxuICAgICAgcmV0dXJuIFwiei5udWxsKClcIjtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICByZXR1cm4gXCJ6LnVuZGVmaW5lZCgpXCI7XG4gICAgY2FzZSBcImFueVwiOlxuICAgICAgcmV0dXJuIFwiei5hbnkoKVwiO1xuICAgIGNhc2UgXCJ1bmtub3duXCI6XG4gICAgICByZXR1cm4gXCJ6LnVua25vd24oKVwiO1xuICAgIGNhc2UgXCJuZXZlclwiOlxuICAgICAgcmV0dXJuIFwiei5uZXZlcigpXCI7XG4gICAgY2FzZSBcIm51bGxhYmxlXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvWm9kQ29kZSgvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSwgaW5qZWN0SW1wb3J0S2V5cyl9Lm51bGxhYmxlKClgO1xuICAgIGNhc2UgXCJkZWZhdWx0XCI6IHtcbiAgICAgIGNvbnN0IHpEZWZhdWx0RGVmID1cbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgenQgYXMgQW55Wm9kRGVmYXVsdFxuICAgICAgICApLmRlZjtcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKHpEZWZhdWx0RGVmLmlubmVyVHlwZSwgaW5qZWN0SW1wb3J0S2V5cyl9LmRlZmF1bHQoJHt6RGVmYXVsdERlZi5kZWZhdWx0VmFsdWV9KWA7XG4gICAgfVxuICAgIGNhc2UgXCJyZWNvcmRcIjoge1xuICAgICAgY29uc3QgelJlY29yZERlZiA9XG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIEFueVpvZFJlY29yZFxuICAgICAgICApLmRlZjtcbiAgICAgIGNvbnN0IHJlY29yZEZuID0gelJlY29yZERlZi5wYXJ0aWFsID8gXCJwYXJ0aWFsUmVjb3JkXCIgOiBcInJlY29yZFwiO1xuICAgICAgcmV0dXJuIGB6LiR7cmVjb3JkRm59KCR7em9kVHlwZVRvWm9kQ29kZSh6UmVjb3JkRGVmLmtleVR5cGUsIGluamVjdEltcG9ydEtleXMpfSwgJHt6b2RUeXBlVG9ab2RDb2RlKFxuICAgICAgICB6UmVjb3JkRGVmLnZhbHVlVHlwZSxcbiAgICAgICAgaW5qZWN0SW1wb3J0S2V5cyxcbiAgICAgICl9KWA7XG4gICAgfVxuICAgIGNhc2UgXCJsaXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbShcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgenQgYXMgei5ab2RMaXRlcmFsPHN0cmluZyB8IG51bWJlcj5cbiAgICAgICAgKS52YWx1ZXMsXG4gICAgICApLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKGlzU3RyaW5nVmFsdWUodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGBudWxsYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGB1bmRlZmluZWRgO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYHoubGl0ZXJhbCgke2l0ZW1zWzBdfSlgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGB6LmxpdGVyYWwoWyR7aXRlbXMuam9pbihcIiwgXCIpfV0pYDtcbiAgICB9XG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4gYHoudW5pb24oWyR7XG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIEFueVpvZFVuaW9uXG4gICAgICAgICkuZGVmLm9wdGlvbnNcbiAgICAgICAgICAubWFwKChvcHRpb246IHouWm9kVHlwZSkgPT4gem9kVHlwZVRvWm9kQ29kZShvcHRpb24sIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAgIC5qb2luKFwiLFwiKVxuICAgICAgfV0pYDtcbiAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgLy8gTk9URTogei5lbnVtKFtcIkFcIiwgXCJCXCJdKeuPhCB6LmVudW0oeyBBOiBcIkFcIiwgQjogXCJCXCIgfSnroZwg7LKY66as65CoLlxuICAgICAgcmV0dXJuIGB6LmVudW0oeyR7T2JqZWN0LmVudHJpZXMoXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIHouWm9kRW51bVxuICAgICAgICApLmRlZi5lbnRyaWVzLFxuICAgICAgKVxuICAgICAgICAubWFwKChba2V5LCB2YWxdKSA9PiAoaXNTdHJpbmdWYWx1ZSh2YWwpID8gYCR7a2V5fTogXCIke3ZhbH1cImAgOiBgJHtrZXl9OiAke3ZhbH1gKSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKX19KWA7XG4gICAgY2FzZSBcImFycmF5XCI6XG4gICAgICByZXR1cm4gYHouYXJyYXkoJHt6b2RUeXBlVG9ab2RDb2RlKC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKHp0IGFzIHouWm9kQXJyYXk8ei5ab2RUeXBlPikuZGVmLmVsZW1lbnQsIGluamVjdEltcG9ydEtleXMpfSlgO1xuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgY29uc3Qgb2JqZWN0RmllbGRzID0gLyogU0FGRVRZOiBab2TsnZggb2JqZWN0IO2MkOuzhCDrtoTquLDqsIAg6rCd7LK0IO2VhOuTnCDqs4Tslb3snYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIHp0IGFzIEFueVpvZE9iamVjdFxuICAgICAgKVtcInNoYXBlXCJdO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXCJ6Lm9iamVjdCh7XCIsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKG9iamVjdEZpZWxkcykubWFwKFxuICAgICAgICAgIChrZXkpID0+IGAke2tleX06ICR7em9kVHlwZVRvWm9kQ29kZShvYmplY3RGaWVsZHNba2V5XSwgaW5qZWN0SW1wb3J0S2V5cyl9LGAsXG4gICAgICAgICksXG4gICAgICAgIFwifSlcIixcbiAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICB9XG4gICAgY2FzZSBcIm9wdGlvbmFsXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvWm9kQ29kZSgvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUsIGluamVjdEltcG9ydEtleXMpfS5vcHRpb25hbCgpYDtcbiAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgcmV0dXJuIGB6LmZpbGUoKWA7XG4gICAgY2FzZSBcInRlbXBsYXRlX2xpdGVyYWxcIjoge1xuICAgICAgY29uc3QgZGVmID0gLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIHp0IGFzIEFueVpvZFRlbXBsYXRlTGl0ZXJhbFxuICAgICAgKS5kZWY7XG5cbiAgICAgIC8vIOu5iCB0ZW1wbGF0ZSBsaXRlcmFsXG4gICAgICBpZiAoIWRlZi5wYXJ0cyB8fCBkZWYucGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBcInoudGVtcGxhdGVMaXRlcmFsKFtdKVwiO1xuICAgICAgfVxuXG4gICAgICAvLyDqsIEgcGFydOulvCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZhcbiAgICAgIGNvbnN0IHBhcnRzID0gZGVmLnBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAvLyDrrLjsnpDsl7Qg66as7YSw65+0XG4gICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHBhcnQpKSB7XG4gICAgICAgICAgcmV0dXJuIGBcIiR7cGFydH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gWm9kVHlwZSAtIOyerOq3gOyggeycvOuhnCDrs4DtmZhcbiAgICAgICAgaWYgKHBhcnQgJiYgaXNPYmplY3RWYWx1ZShwYXJ0KSAmJiBwYXJ0IGluc3RhbmNlb2Ygei5ab2RUeXBlKSB7XG4gICAgICAgICAgcmV0dXJuIHpvZFR5cGVUb1pvZENvZGUoXG4gICAgICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHBhcnQgYXMgei5ab2RUeXBlLFxuICAgICAgICAgICAgaW5qZWN0SW1wb3J0S2V5cyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7Y+067CxXG4gICAgICAgIHJldHVybiBcInouc3RyaW5nKClcIjtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYHoudGVtcGxhdGVMaXRlcmFsKFske3BhcnRzLmpvaW4oXCIsIFwiKX1dKWA7XG4gICAgfVxuICAgIGNhc2UgXCJpbnRlcnNlY3Rpb25cIjoge1xuICAgICAgY29uc3QgekludGVyc2VjdGlvbkRlZiA9XG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIHouWm9kSW50ZXJzZWN0aW9uPHouWm9kVHlwZSwgei5ab2RUeXBlPlxuICAgICAgICApLmRlZjtcbiAgICAgIHJldHVybiBgei5pbnRlcnNlY3Rpb24oJHt6b2RUeXBlVG9ab2RDb2RlKFxuICAgICAgICB6SW50ZXJzZWN0aW9uRGVmLmxlZnQsXG4gICAgICAgIGluamVjdEltcG9ydEtleXMsXG4gICAgICApfSwgJHt6b2RUeXBlVG9ab2RDb2RlKHpJbnRlcnNlY3Rpb25EZWYucmlnaHQsIGluamVjdEltcG9ydEtleXMpfSlgO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsspjrpqzrkJjsp4Ag7JWK7J2AIFpvZFR5cGUgJHt6dC5kZWYudHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXsnYQgVUkg66CM642U66eB7JeQIOyCrOyaqe2VoCDsiJgg7J6I64qUIFJlbmRlcmluZ05vZGXroZwg67OA7ZmY7ZWp64uI64ukLlxuICog7J6s6reA7KCB7Jy866GcIOykkeyyqeuQnCDtg4DsnoXrk6TsnYQg7LKY66as7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgem9kVHlwZTogei5ab2RUeXBlQW55LFxuICBiYXNlS2V5OiBzdHJpbmcgPSBcInJvb3RcIixcbik6IFJlbmRlcmluZ05vZGUge1xuICBjb25zdCBkZWYgPSB7XG4gICAgbmFtZTogYmFzZUtleSxcbiAgICBsYWJlbDogaW5mbGVjdGlvbi5jYW1lbGl6ZShiYXNlS2V5LCBmYWxzZSksXG4gICAgem9kVHlwZSxcbiAgfTtcblxuICAvKipcbiAgICog7LyA7J207IqkIOyymOumrCDsiJzshJxcbiAgICpcbiAgICogMS4g7Yq57IiYIOy8gOydtOyKpCAoZGVzY3JpcHRpb24g6riw67CYKVxuICAgKiAgICAtIFNvbmFtdUZpbGUvU29uYW11RmlsZVtdIDogei5vYmplY3Qvei5hcnJheeydtOyngOunjCDtjIzsnbwg7JeF66Gc65Oc7JqpIOuCtOyepSDtg4DsnoVcbiAgICpcbiAgICogMi4g7J2867CYIOy8gOydtOyKpCAoaW5zdGFuY2VvZiDquLDrsJgpXG4gICAqICAgIC0gei5ab2RPYmplY3QgOiDsnbzrsJgg6rCd7LK0XG4gICAqICAgIC0gei5ab2RBcnJheSA6IOydvOuwmCDrsLDsl7RcbiAgICogICAgICAtIHZlY3RvciA6IHouYXJyYXkoei5udW1iZXIp7J207KeA66eMIOuEpOydtOuwjSDquLDrsJjsnLzroZwg67Kh7YSwIOyehOuyoOuUqVxuICAgKiAgICAgIC0g7J2867CYIOuwsOyXtCA6IOq3uCDsmbhcbiAgICogICAgLSB6LlpvZFVuaW9uLCB6LlpvZE9wdGlvbmFsLCB6LlpvZE51bGxhYmxlIDog7Jyg7Yu466as7YuwIO2DgOyehVxuICAgKiAgICAtIOq4sO2DgCA6IHJlc29sdmVSZW5kZXJUeXBlKCnsnLzroZwg7LKY66asXG4gICAqL1xuXG4gIC8vIO2KueyImCDsvIDsnbTsiqQ6IFNvbmFtdUZpbGVbXSDtg4DsnoUg6rCQ7KeAXG4gIGlmICh6b2RUeXBlLmRlc2NyaXB0aW9uID09PSBcIlNvbmFtdUZpbGVbXVwiKSB7XG4gICAgcmV0dXJuIHsgLi4uZGVmLCByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiIH07XG4gIH1cblxuICAvLyDtirnsiJgg7LyA7J207IqkOiBTb25hbXVGaWxlIOuLqOydvCDtg4DsnoUg6rCQ7KeAXG4gIGlmICh6b2RUeXBlLmRlc2NyaXB0aW9uID09PSBcIlNvbmFtdUZpbGVcIikge1xuICAgIHJldHVybiB7IC4uLmRlZiwgcmVuZGVyVHlwZTogXCJqc29uLXNvbmFtdWZpbGVcIiB9O1xuICB9XG5cbiAgLy8g7J2867CYIOy8gOydtOyKpDogWm9kT2JqZWN0IOyytO2BrFxuICBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kT2JqZWN0KSB7XG4gICAgY29uc3QgY29sdW1uS2V5cyA9IE9iamVjdC5rZXlzKHpvZFR5cGVbXCJzaGFwZVwiXSk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjb2x1bW5LZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUeXBlW1wic2hhcGVcIl1ba2V5XTtcbiAgICAgIHJldHVybiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGlubmVyVHlwZSwga2V5KTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogXCJvYmplY3RcIixcbiAgICAgIGNoaWxkcmVuLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQXJyYXkpIHtcbiAgICBjb25zdCBpbm5lclR5cGUgPVxuICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIHpvZFR5cGUgYXMgei5ab2RBcnJheTx6LlpvZFR5cGVBbnk+XG4gICAgICApLmRlZi5lbGVtZW50O1xuICAgIC8vIHZlY3RvciDtg4DsnoUg7YyQ67OEOiBudW1iZXIg67Cw7Je07J2066m07IScIGVtYmVkZGluZywgdmVjdG9yIOuTseydmCDsnbTrpoTsnYQg6rCA7KeEIOqyveyasFxuICAgIGlmIChcbiAgICAgIGlubmVyVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVtYmVyICYmXG4gICAgICAoYmFzZUtleS5pbmNsdWRlcyhcImVtYmVkZGluZ1wiKSB8fCBiYXNlS2V5LmluY2x1ZGVzKFwidmVjdG9yXCIpKVxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmLFxuICAgICAgICByZW5kZXJUeXBlOiBcInZlY3RvclwiLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGVsZW1lbnQ6IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoaW5uZXJUeXBlLCBiYXNlS2V5KSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVuaW9uKSB7XG4gICAgY29uc3Qgb3B0aW9uTm9kZXMgPVxuICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIHpvZFR5cGUgYXMgei5ab2RVbmlvbjx6LlpvZFR5cGVbXT5cbiAgICAgICkuZGVmLm9wdGlvbnMubWFwKChvcHQpID0+IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUob3B0LCBiYXNlS2V5KSk7XG4gICAgLy8gVE9ETzogWm9kVW5pb27snbQg65Ok7Ja07J6I64qUIOqyveyasCDtlbjrk6Trp4FcbiAgICByZXR1cm4gb3B0aW9uTm9kZXNbMF07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kT3B0aW9uYWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgem9kVHlwZSBhcyB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT5cbiAgICAgICAgKS5kZWYuaW5uZXJUeXBlLFxuICAgICAgICBiYXNlS2V5LFxuICAgICAgKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVsbGFibGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgem9kVHlwZSBhcyB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT5cbiAgICAgICAgKS5kZWYuaW5uZXJUeXBlLFxuICAgICAgICBiYXNlS2V5LFxuICAgICAgKSxcbiAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IHJlc29sdmVSZW5kZXJUeXBlKGJhc2VLZXksIHpvZFR5cGUpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6F6rO8IO2CpCDsnbTrpoTsnLzroZzrtoDthLAg7KCB7KCI7ZWcIFJlbmRlclR5cGXsnYQg6rKw7KCV7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiByZXNvbHZlUmVuZGVyVHlwZShrZXk6IHN0cmluZywgem9kVHlwZTogei5ab2RUeXBlQW55KTogUmVuZGVyaW5nTm9kZVtcInJlbmRlclR5cGVcIl0ge1xuICBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRGF0ZSkge1xuICAgIHJldHVybiBcImRhdGV0aW1lXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouY29yZS4kWm9kU3RyaW5nKSB7XG4gICAgLy8gTk9URTogei5ab2RTdHJpbmfsnLzroZwg67mE6rWQ7ZWY66m0IHoudXJsKCksIHouZW1haWwoKSDrk7HsnZgg7YOA7J6F7JeQ7IScIOusuOygnOqwgCDsg53quLDrr4DroZwgei5jb3JlLiRab2RTdHJpbmfsnLzroZwg67mE6rWQ7ZWoXG4gICAgLy8gRklYTUU6IGVtYWls7J2064KYIHVybCDtg4DsnoUg65Ox7JeQIOuMgO2VnCDsspjrpqzqsIAg7ZWE7JqU7ZWoXG4gICAgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU1FMRGF0ZVRpbWVTdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGV0aW1lXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJkYXRlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZGF0ZVwiO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcImlkXCIpIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1pZFwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiX2lkXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZmtfaWRcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bWJlcikge1xuICAgIGlmIChrZXkgPT09IFwiaWRcIikge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLWlkXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJfaWRcIikpIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1ma19pZFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItcGxhaW5cIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQm9vbGVhbikge1xuICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RFbnVtKSB7XG4gICAgcmV0dXJuIFwiZW51bXNcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RSZWNvcmQpIHtcbiAgICByZXR1cm4gXCJyZWNvcmRcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RBbnkgfHwgem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5rbm93bikge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVuaW9uKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTGl0ZXJhbCkge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFRlbXBsYXRlTGl0ZXJhbCkge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUuZGVmLnR5cGUgPT09IFwiY3VzdG9tXCIpIHtcbiAgICByZXR1cm4gXCJvYmplY3RcIjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYO2DgOyehSDtjIzsi7Eg67aI6rCAICR7a2V5fSAke3pvZFR5cGUuZGVmLnR5cGV9YCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOEZBLFNBQVMscUJBQXFCLFNBQXdDO0NBRXBFLE9BRGdCLE9BQU8sUUFBUSxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxRQUFRLGdCQUFnQixNQUNuRixDQUFBLEdBQVUsRUFBRSxDQUFDO0FBQ3RCOzs7OztBQU1BLFNBQVMsZ0JBQWdCLFFBQWlDO0NBQ3hELFFBQVEsUUFBUjtFQUNFLEtBQUssV0FDSCxPQUFPO0VBQ1QsS0FBSyxXQUNILE9BQU87RUFDVCxLQUFLLGVBQ0gsT0FBTztFQUNULEtBQUssZUFDSCxPQUFPO0VBQ1QsS0FBSyxXQUNILE9BQU87RUFDVCxLQUFLLFlBQ0gsT0FBTztFQUNULEtBQUssY0FDSCxPQUFPO0VBQ1QsS0FBSyxjQUNILE9BQU87RUFDVCxLQUFLLGNBQ0gsT0FBTztFQUNULFNBQ0UsT0FBTyxLQUFLLE9BQU87Q0FDdkI7QUFDRjs7Ozs7QUFNQSxTQUFTLGdCQUFnQixRQUFvQztDQUMzRCxRQUFRLFFBQVI7RUFDRSxLQUFLLFNBQ0gsT0FBTyxFQUFFLE1BQU07RUFDakIsS0FBSyxRQUNILE9BQU8sRUFBRSxLQUFLO0VBQ2hC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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sonamu",
3
- "version": "0.13.6",
3
+ "version": "0.13.7",
4
4
  "description": "Sonamu — TypeScript Fullstack API Framework",
5
5
  "keywords": [
6
6
  "framework",
@@ -520,7 +520,12 @@ export function zodTypeToTsTypeDef(zt: z.ZodType): string {
520
520
  case "record": {
521
521
  const recordType =
522
522
  /* SAFETY: 선행 Zod 종류 분기와 템플릿 입력 계약이 이 값의 타입을 보장한다. */ zt as AnyZodRecord;
523
- return `{ [ key: ${zodTypeToTsTypeDef(recordType.def.keyType)} ]: ${zodTypeToTsTypeDef(recordType.def.valueType)}}`;
523
+ const keyType = zodTypeToTsTypeDef(recordType.def.keyType);
524
+ const valueType = zodTypeToTsTypeDef(recordType.def.valueType);
525
+ if (recordType.def.partial) {
526
+ return `Partial<Record<${keyType}, ${valueType}>>`;
527
+ }
528
+ return `{ [ key: ${keyType} ]: ${valueType}}`;
524
529
  }
525
530
  case "literal":
526
531
  return Array.from(
@@ -657,7 +662,8 @@ export function zodTypeToZodCode(zt: z.ZodType, injectImportKeys: string[] = [])
657
662
  /* SAFETY: 선행 Zod 종류 분기와 템플릿 입력 계약이 이 값의 타입을 보장한다. */ (
658
663
  zt as AnyZodRecord
659
664
  ).def;
660
- return `z.record(${zodTypeToZodCode(zRecordDef.keyType, injectImportKeys)}, ${zodTypeToZodCode(
665
+ const recordFn = zRecordDef.partial ? "partialRecord" : "record";
666
+ return `z.${recordFn}(${zodTypeToZodCode(zRecordDef.keyType, injectImportKeys)}, ${zodTypeToZodCode(
661
667
  zRecordDef.valueType,
662
668
  injectImportKeys,
663
669
  )})`;