sonamu 0.13.7 → 0.13.8

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.
@@ -194,5 +194,10 @@ export declare class Entity {
194
194
  * LoaderQuery의 fromIds 타입으로 사용됩니다.
195
195
  */
196
196
  getPkArrayType(): string;
197
+ /**
198
+ * 컬럼 값 배열의 TS 타입을 반환합니다.
199
+ * HasMany 로더의 fromIds 타입으로 사용됩니다. 로더는 부모 행에서 fromColumn(기본 id) 값을 꺼냅니다.
200
+ */
201
+ getColumnArrayType(column: string): string;
197
202
  }
198
203
  //# sourceMappingURL=entity.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/entity/entity.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAkBxB,OAAO,EACL,KAAK,IAAI,EACT,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,YAAY,EAEjB,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAC;AAUxB,qBAAa,MAAM;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,SAAS,EAAE;QACT,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC;KAC3B,CAAC;IACF,SAAS,EAAE;QACT,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC;KAC7B,CAAC;IACF,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,EAAE;QACP,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KACzB,CAAC;IACF,eAAe,EAAE;QACf,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KACzB,CAAC;IACF,KAAK,EAAE;QACL,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC;KAC9B,CAAM;IACP,KAAK,EAAE;QACL,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;KAC/D,CAAM;IACP,UAAU,EAAE;QACV,CAAC,MAAM,EAAE,MAAM,GAAG;YAChB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;SACvB,CAAC;KACH,CAAM;IACP,SAAS,EAAE;QACT,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;KACxB,CAAM;IACP,WAAW,EAAE;QACX,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,CAAM;IAEP,YAAY,EACV,EAAE,EACF,QAAQ,EACR,KAAK,EACL,KAAK,EACL,MAAM,EACN,IAAI,EACJ,KAAK,EACL,OAAO,EACP,OAAO,EACP,KAAK,GACN,EAAE,UAAU,EA4EZ;IAED;;OAEG;IACH,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAEnD;IAED;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA+B5C;IAED;;;;;;;;;;OAUG;IACH,OAAO,CAAC,uBAAuB;IA8C/B;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,2BAA2B;IA6BnC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2G5C;IAKD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAK7C;IAID,kBAAkB,CAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EAAE,EAChB,oBAAoB,GAAE,OAAe,GACpC,WAAW,CA2Mb;IAKD,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,MAAa,GAAG,cAAc,EAAE,CAiFnF;IAED,aAAa,CAAC,MAAM,SAAK,EAAE,QAAQ,GAAE,MAAU,EAAE,KAAK,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CAsB/E;IAED;;;OAGG;IACH,OAAO,CAAC,aAAa;IAOrB,eAAe,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAalD;IAED;;OAEG;IACH,gBAAgB,IAAI,UAAU,EAAE,CAE/B;IAED;;;OAGG;IACH,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAM3D;IAED;;;;;;OAMG;IACH,kBAAkB,IAAI,UAAU,EAAE,CAwBjC;IAED;;;;OAIG;IACG,mBAAmB,CAAC,mBAAmB,CAAC,EAAE,MAAM,iBAwCrD;IAED,kBAAkB,IAAI,IAAI,CAWzB;IAED,MAAM,IAAI,UAAU,CAgDnB;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAwB1B;IAED;;;;;;;OAOG;IACG,qBAAqB,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BtE;IAED;;;;;;OAMG;IACG,aAAa,CAAC,OAAO,CAAC,EAAE;QAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;QAC5B,oCAAoC;QACpC,YAAY,CAAC,EAAE,OAAO,wBAAwB,EAAE,iBAAiB,CAAC;QAClE,sDAAsD;QACtD,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,GAAG,OAAO,CAAC,OAAO,wBAAwB,EAAE,oBAAoB,CAAC,CAejE;IAED;;;;OAIG;IACH,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAsB3C;IAED;;;;OAIG;IACH,UAAU,CAAC,MAAM,EAAE,OAAO,wBAAwB,EAAE,oBAAoB,GAAG,IAAI,CAe9E;IAED,aAAa,CACX,QAAQ,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,EACtC,gBAAgB,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,EAC9C,QAAQ,GAAE,MAAM,EAAO,GACtB,eAAe,EAAE,CAqEnB;IAED,wBAAwB,CACtB,UAAU,EAAE,eAAe,EAAE,EAC7B,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,OAAe,GACxB,MAAM,EAAE,CAcV;IAEK,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO7D;IAED,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG;QACvC,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,EAAE,CAwBF;IAEK,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4C/D;IAEK,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CvC;IAED,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAkBtD;IAEK,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQpD;IAED;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKtC;IAED;;;OAGG;IACH,SAAS,IAAI,SAAS,GAAG,QAAQ,GAAG,MAAM,CASzC;IAED;;;OAGG;IACH,SAAS,IAAI,UAAU,CAMtB;IAED;;;OAGG;IACH,cAAc,IAAI,MAAM,CAGvB;CACF"}
1
+ {"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/entity/entity.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import { init_runtime_value, isStringValue } from "../utils/runtime-value.js";
3
3
  import { assertDefined, init_utils, nonNullable } from "../utils/utils.js";
4
4
  import { formatCode, init_code_formatting } from "../code-formatting/index.js";
5
5
  import { exists, init_fs_utils } from "../utils/fs-utils.js";
6
- import { getEnumDefValues, getSubsetFields, init_types, isBelongsToOneRelationProp, isEnumProp, isHasManyRelationProp, isInternalSubsetField, isManyToManyRelationProp, isOneToOneRelationProp, isRelationProp, isVirtualCodeProp, isVirtualProp, normalizeSubsetField } from "../types/types.js";
6
+ import { getEnumDefValues, getSubsetFields, init_types, isBelongsToOneRelationProp, isEnumProp, isHasManyRelationProp, isIntegerSingleProp, isInternalSubsetField, isManyToManyRelationProp, isNumberSingleProp, isOneToOneRelationProp, isRelationProp, isVirtualCodeProp, isVirtualProp, normalizeSubsetField } from "../types/types.js";
7
7
  import { Sonamu, init_sonamu } from "../api/sonamu.js";
8
8
  import { importMembers, init_esm_utils } from "../utils/esm-utils.js";
9
9
  import { init_path_utils, runtimePath } from "../utils/path-utils.js";
@@ -188,8 +188,8 @@ var init_entity = __esmMin((() => {
188
188
  const generateLoaderCode = (nestedLoaders) => {
189
189
  const loaderLines = [];
190
190
  for (const loader of nestedLoaders) {
191
- const { toTable, toCol, through, fromTable } = loader.manyJoin;
192
- const fromIdsType = EntityManager.getByTable(fromTable).getPkArrayType();
191
+ const { toTable, toCol, through, fromTable, fromCol } = loader.manyJoin;
192
+ const fromIdsType = EntityManager.getByTable(fromTable).getColumnArrayType(fromCol);
193
193
  loaderLines.push("{", `as: "${loader.as}",`, `refId: "${loader.manyJoin.idField}",`, `qb: (qbWrapper: PuriWrapper<DatabaseSchemaExtend>, fromIds: number[] | string[]) => {`);
194
194
  if (through === void 0) {
195
195
  loaderLines.push("return qbWrapper", `.from("${toTable}")`);
@@ -806,9 +806,19 @@ var init_entity = __esmMin((() => {
806
806
  getPkArrayType() {
807
807
  return this.getPkType() === "integer" ? "number[]" : "string[]";
808
808
  }
809
+ /**
810
+ * 컬럼 값 배열의 TS 타입을 반환합니다.
811
+ * HasMany 로더의 fromIds 타입으로 사용됩니다. 로더는 부모 행에서 fromColumn(기본 id) 값을 꺼냅니다.
812
+ */
813
+ getColumnArrayType(column) {
814
+ if (column === "id") return this.getPkArrayType();
815
+ const prop = this.propsDict[column] ?? this.props.find((p) => (isBelongsToOneRelationProp(p) || isOneToOneRelationProp(p) && p.hasJoinColumn) && `${p.name}_id` === column);
816
+ if (isRelationProp(prop)) return EntityManager.get(prop.with).getPkArrayType();
817
+ return isIntegerSingleProp(prop) || isNumberSingleProp(prop) ? "number[]" : "string[]";
818
+ }
809
819
  };
810
820
  }));
811
821
  init_entity();
812
822
  export { Entity, init_entity };
813
823
 
814
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnRpdHkvZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgZm9ybWF0Q29kZSB9IGZyb20gXCIuLi9jb2RlLWZvcm1hdHRpbmdcIjtcbmltcG9ydCB7XG4gIGdldEVudW1EZWZWYWx1ZXMsXG4gIGdldFN1YnNldEZpZWxkcyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzRW51bVByb3AsXG4gIGlzSGFzTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNJbnRlcm5hbFN1YnNldEZpZWxkLFxuICBpc01hbnlUb01hbnlSZWxhdGlvblByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1ZpcnR1YWxDb2RlUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbiAgbm9ybWFsaXplU3Vic2V0RmllbGQsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBDb25lLFxuICB0eXBlIEVudGl0eUN1c3RvbSxcbiAgdHlwZSBFbnRpdHlJbmRleCxcbiAgdHlwZSBFbnRpdHlKc29uLFxuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRW50aXR5UHJvcE5vZGUsXG4gIHR5cGUgRW50aXR5U3Vic2V0Um93LFxuICB0eXBlIFJlbGF0aW9uUHJvcCxcbiAgdHlwZSBTdWJzZXRGaWVsZCxcbiAgdHlwZSBTdWJzZXRRdWVyeSxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBpbXBvcnRNZW1iZXJzIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgeyBydW50aW1lUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBpc1N0cmluZ1ZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcbmltcG9ydCB7IGFzc2VydERlZmluZWQsIG5vbk51bGxhYmxlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5cbnR5cGUgTmVzdGVkU2VsZWN0ID0geyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBOZXN0ZWRTZWxlY3QgfTtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi9lbnRpdHktbWFuYWdlclwiO1xuXG5leHBvcnQgY2xhc3MgRW50aXR5IHtcbiAgaWQ6IHN0cmluZztcbiAgcGFyZW50SWQ/OiBzdHJpbmc7XG4gIHRhYmxlOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGN1c3RvbT86IEVudGl0eUN1c3RvbTtcbiAgY29uZT86IENvbmU7XG4gIG5hbWVzOiB7XG4gICAgcGFyZW50RnM6IHN0cmluZztcbiAgICBmczogc3RyaW5nO1xuICAgIG1vZHVsZTogc3RyaW5nO1xuICB9O1xuICBwcm9wczogRW50aXR5UHJvcFtdO1xuICBwcm9wc0RpY3Q6IHtcbiAgICBba2V5OiBzdHJpbmddOiBFbnRpdHlQcm9wO1xuICB9O1xuICByZWxhdGlvbnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBSZWxhdGlvblByb3A7XG4gIH07XG4gIGluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gIHN1YnNldHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbiAgc3Vic2V0c0ludGVybmFsOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nW107XG4gIH07XG4gIHR5cGVzOiB7XG4gICAgW25hbWU6IHN0cmluZ106IHouWm9kVHlwZUFueTtcbiAgfSA9IHt9O1xuICBlbnVtczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHouWm9kRW51bTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj47XG4gIH0gPSB7fTtcbiAgZW51bUxhYmVsczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICB9O1xuICB9ID0ge307XG4gIGVudW1Db25lczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IENvbmU7XG4gIH0gPSB7fTtcbiAgc3Vic2V0Q29uZXM6IHtcbiAgICBbc3Vic2V0S2V5OiBzdHJpbmddOiBDb25lO1xuICB9ID0ge307XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGlkLFxuICAgIHBhcmVudElkLFxuICAgIHRhYmxlLFxuICAgIHRpdGxlLFxuICAgIGN1c3RvbSxcbiAgICBjb25lLFxuICAgIHByb3BzLFxuICAgIGluZGV4ZXMsXG4gICAgc3Vic2V0cyxcbiAgICBlbnVtcyxcbiAgfTogRW50aXR5SnNvbikge1xuICAgIC8vIGlkXG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMucGFyZW50SWQgPSBwYXJlbnRJZDtcbiAgICB0aGlzLnRpdGxlID0gdGl0bGUgPz8gdGhpcy5pZDtcbiAgICB0aGlzLnRhYmxlID0gdGFibGUgPz8gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGluZmxlY3Rpb24ucGx1cmFsaXplKGlkKSk7XG4gICAgdGhpcy5jdXN0b20gPSBjdXN0b207XG4gICAgdGhpcy5jb25lID0gY29uZTtcblxuICAgIC8vIHByb3BzXG4gICAgaWYgKHByb3BzKSB7XG4gICAgICB0aGlzLnByb3BzID0gcHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICAgIGlmIChpc0VudW1Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgaWYgKHByb3AuaWQuaW5jbHVkZXMoXCIkTW9kZWxcIikpIHtcbiAgICAgICAgICAgIHByb3AuaWQgPSBwcm9wLmlkLnJlcGxhY2UoXCIkTW9kZWxcIiwgaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5wcm9wc0RpY3QgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIHByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICAgIHJldHVybiBbcHJvcC5uYW1lLCBwcm9wXTtcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICAvLyByZWxhdGlvbnNcbiAgICAgIHRoaXMucmVsYXRpb25zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBwcm9wcy5maWx0ZXIoKHByb3ApID0+IGlzUmVsYXRpb25Qcm9wKHByb3ApKS5tYXAoKHByb3ApID0+IFtwcm9wLm5hbWUsIHByb3BdKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvcHMgPSBbXTtcbiAgICAgIHRoaXMucHJvcHNEaWN0ID0ge307XG4gICAgICB0aGlzLnJlbGF0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIC8vIGluZGV4ZXNcbiAgICB0aGlzLmluZGV4ZXMgPSBpbmRleGVzID8/IFtdO1xuXG4gICAgLy8gc3Vic2V0czogU3Vic2V0RGVm7JeQ7IScIFN1YnNldEZpZWxkW13rpbwg7LaU7Lac7ZWY7JesIHN1YnNldHMo7J2867CYKeyZgCBzdWJzZXRzSW50ZXJuYWwoaW50ZXJuYWwp66GcIOu2hOumrFxuICAgIHRoaXMuc3Vic2V0cyA9IHt9O1xuICAgIHRoaXMuc3Vic2V0c0ludGVybmFsID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCBzdWJzZXREZWZdIG9mIE9iamVjdC5lbnRyaWVzKHN1YnNldHMgPz8ge30pKSB7XG4gICAgICBjb25zdCBmaWVsZHMgPSBnZXRTdWJzZXRGaWVsZHMoc3Vic2V0RGVmKTtcbiAgICAgIHRoaXMuc3Vic2V0c1trZXldID0gZmllbGRzLmZpbHRlcigoZikgPT4gIWlzSW50ZXJuYWxTdWJzZXRGaWVsZChmKSkubWFwKG5vcm1hbGl6ZVN1YnNldEZpZWxkKTtcbiAgICAgIHRoaXMuc3Vic2V0c0ludGVybmFsW2tleV0gPSBmaWVsZHMuZmlsdGVyKGlzSW50ZXJuYWxTdWJzZXRGaWVsZCkubWFwKG5vcm1hbGl6ZVN1YnNldEZpZWxkKTtcblxuICAgICAgLy8gY29uZSDstpTstpxcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdWJzZXREZWYpICYmIFwiY29uZVwiIGluIHN1YnNldERlZiAmJiBzdWJzZXREZWYuY29uZSkge1xuICAgICAgICB0aGlzLnN1YnNldENvbmVzW2tleV0gPSBzdWJzZXREZWYuY29uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnVtczogRW51bURlZuyXkOyEnCB2YWx1ZXPsmYAgY29uZeulvCDstpTstpztlZjsl6wg7LKY66asXG4gICAgdGhpcy5lbnVtTGFiZWxzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoZW51bXMgPz8ge30pLm1hcCgoW2tleSwgZW51bURlZl0pID0+IHtcbiAgICAgICAgLy8gY29uZSDstpTstpxcbiAgICAgICAgaWYgKFwidmFsdWVzXCIgaW4gZW51bURlZiAmJiBcImNvbmVcIiBpbiBlbnVtRGVmICYmIGVudW1EZWYuY29uZSkge1xuICAgICAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICAgIHRoaXMuZW51bUNvbmVzW2tleV0gPSBlbnVtRGVmLmNvbmUgYXMgQ29uZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2tleSwgZ2V0RW51bURlZlZhbHVlcyhlbnVtRGVmKV07XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuZW51bXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLmVudW1MYWJlbHMpLm1hcCgoW2tleSwgZW51bUxhYmVsXSkgPT4ge1xuICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgcmV0dXJuIFtrZXksIHouZW51bShPYmplY3Qua2V5cyhlbnVtTGFiZWwpKV07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gbmFtZXNcbiAgICB0aGlzLm5hbWVzID0ge1xuICAgICAgcGFyZW50RnM6IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShwYXJlbnRJZCA/PyBpZCkpLnRvTG93ZXJDYXNlKCksXG4gICAgICBmczogaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGlkKSkudG9Mb3dlckNhc2UoKSxcbiAgICAgIG1vZHVsZTogaWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsv7zrpqzsmqkg7ISc67iM7IWLIO2VhOuTnOulvCDrsJjtmZjtlanri4jri6QgKHN1YnNldHMgKyBzdWJzZXRzSW50ZXJuYWwg7ZWp7LmoKVxuICAgKi9cbiAgZ2V0U3Vic2V0RmllbGRzRm9yUXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsuLi4odGhpcy5zdWJzZXRzW3N1YnNldEtleV0gPz8gW10pLCAuLi4odGhpcy5zdWJzZXRzSW50ZXJuYWxbc3Vic2V0S2V5XSA/PyBbXSldO1xuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsnbTrpoQoc3Vic2V0S2V5KeydmCBzdWJzZXTsnYQg7Iuk7KCc66GcIOqwgOyguOyYpOuKlCBQdXJpIOy9lOuTnCDqtaztmITssrQgc3RyaW5n7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIGdldFB1cmlTdWJzZXRRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3Vic2V0ID0gdGhpcy5nZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXkpO1xuICAgIGNvbnN0IHN1YnNldFF1ZXJ5ID0gdGhpcy5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgc3Vic2V0KTtcblxuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gZnJvbVxuICAgIGxpbmVzLnB1c2goYHJldHVybiBxYldyYXBwZXJgKTtcbiAgICBsaW5lcy5wdXNoKGAuZnJvbShcIiR7dGhpcy50YWJsZX1cIilgKTtcblxuICAgIC8vIGpvaW5cbiAgICBmb3IgKGNvbnN0IGpvaW4gb2Ygc3Vic2V0UXVlcnkuam9pbnMpIHtcbiAgICAgIC8vIGpvaW4g66mU7ISc65OcIOqysOyglTogaW5uZXIg4oaSIGpvaW4sIG91dGVyIOKGkiBsZWZ0Sm9pblxuICAgICAgLy8gRksgbnVsbGFibGUg7Jes67aA64qUIGxlZnRKb2luIO2DgOyehSDsi5zqt7jri4jsspjsl5DshJwg7J6Q64+Z7Jy866GcIO2MkOuLqOuQqFxuICAgICAgY29uc3Qgam9pbk1ldGhvZCA9IGpvaW4uam9pbiA9PT0gXCJpbm5lclwiID8gXCJqb2luXCIgOiBcImxlZnRKb2luXCI7XG5cbiAgICAgIGlmIChcImN1c3RvbVwiIGluIGpvaW4pIHtcbiAgICAgICAgLy8gY3VzdG9tIGpvaW4gY2xhdXNl64qUIHJhdyDsgqzsmqlcbiAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCBxYldyYXBwZXIua25leC5yYXcoXFxgJHtqb2luLmN1c3RvbX1cXGApKWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaW5lcy5wdXNoKGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIFwiJHtqb2luLmZyb219XCIsIFwiJHtqb2luLnRvfVwiKWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNlbGVjdCAtIOyeheyytOyggSDqtazsobDroZwg7IOd7ISxXG4gICAgY29uc3Qgc2VsZWN0T2JqID0gdGhpcy5idWlsZE5lc3RlZFNlbGVjdE9iamVjdChzdWJzZXRRdWVyeS5zZWxlY3QpO1xuICAgIGxpbmVzLnB1c2goYC5zZWxlY3QoJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RPYmopfSk7YCk7XG5cbiAgICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAqLmVudGl0eS5qc29u7J2YIHN1YnNldOyXkCDrk6TslrTsnojripQg7ZWE65OcIOuwsOyXtOydhCDrsJvslYTshJwsXG4gICAqIFB1cmnsnZggU2VsZWN0T2JqZWN0IO2DgOyeheycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIOyYiDogW1widXNlcnMuaWRcIiwgXCJwYXJlbnQuaWRcIiwgXCJwYXJlbnQubmFtZVwiXVxuICAgKiAgIOKGkiB7IGlkOiBcInVzZXJzLmlkXCIsIHBhcmVudDogeyBpZDogXCJwYXJlbnQuaWRcIiwgbmFtZTogXCJwYXJlbnQubmFtZVwiIH0gfVxuICAgKlxuICAgKiDslrjrjZTrsJTqsIAg7JWE64uMIOykkeyyqSDqsJ3ssrTroZwg67OA7ZmY7ZWo7JeQIOycoOydmO2VmOyEuOyalC5cbiAgICog7J2066CH6rKMIOykkeyyqSDqsJ3ssrTroZwg67OA7ZmY7ZWY7JesIHNlbGVjdOyXkCDrhJjqsqjso7zrqbQgUGFyc2VTZWxlY3RPYmplY3Qg7YOA7J6F7J20IGpvaW7rkJwg6rCd7LK07J2YIO2DgOyeheydhCDsnpgg7J6h7JWE7KSEIOyImCDsnojsirXri4jri6QuXG4gICAqIOymiSwgZW5oYW5jZXLsl5DshJwgcm9366W8IOuwm+yVmOydhCDrlYwgaHlkcmF0ZeuQnCDqsJ3ssrQg7J6Q7LK07J2YIG51bGxpdHnsmYAg6re4IOyViOyqvSDtlYTrk5zsnZggbnVsbGl0eeqwgCBmayBudWxsYWJsZSDsl6zrtoDsl5Ag65Sw6528IOyemCDstpTroaDrkKnri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdEl0ZW1zOiBzdHJpbmdbXSk6IE5lc3RlZFNlbGVjdCB7XG4gICAgY29uc3QgcmVzdWx0OiBOZXN0ZWRTZWxlY3QgPSB7fTtcblxuICAgIGZvciAoY29uc3Qgc2VsZWN0SXRlbSBvZiBzZWxlY3RJdGVtcykge1xuICAgICAgLy8gXCJ1c2Vycy5pZFwiIOuYkOuKlCBcInVzZXJzLmlkIGFzIHVzZXJfX2lkXCIg7ZiV7YOcIO2MjOyLsVxuICAgICAgY29uc3QgbWF0Y2ggPSBzZWxlY3RJdGVtLm1hdGNoKC9eKC4rPykoPzogYXMgKC4rKSk/JC8pO1xuICAgICAgaWYgKCFtYXRjaCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IFssIGNvbHVtbiwgYWxpYXNdID0gbWF0Y2g7XG4gICAgICBjb25zdCBjb2x1bW5WYWx1ZSA9IGBcIiR7Y29sdW1uLnRyaW0oKX1cImA7XG5cbiAgICAgIGlmICghYWxpYXMgfHwgIWFsaWFzLmluY2x1ZGVzKFwiX19cIikpIHtcbiAgICAgICAgLy8gYWxpYXPqsIAg7JeG6rGw64KYIF9f66W8IO2PrO2VqO2VmOyngCDslYrsnLzrqbQg7LWc7IOB7JyEIO2VhOuTnFxuICAgICAgICBjb25zdCBrZXkgPSBhbGlhcyA/PyBhc3NlcnREZWZpbmVkKGNvbHVtbi5zcGxpdChcIi5cIikucG9wKCkpO1xuICAgICAgICByZXN1bHRba2V5XSA9IGNvbHVtblZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYWxpYXPqsIAgX1/rpbwg7Y+s7ZWo7ZWY66m0IOyeheyytCDqtazsobDroZwg6re466O57ZmUXG4gICAgICAgIGNvbnN0IHBhcnRzID0gYWxpYXMuc3BsaXQoXCJfX1wiKTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSByZXN1bHQ7XG5cbiAgICAgICAgLy8g66eI7KeA66eJIO2MjO2KuCDsoITquYzsp4Ag7KSR7LKpIOqwneyytCDsg53shLFcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG4gICAgICAgICAgaWYgKHBhcnQgaW4gY3VycmVudCkge1xuICAgICAgICAgICAgaWYgKGlzU3RyaW5nVmFsdWUoY3VycmVudFtwYXJ0XSkpIHtcbiAgICAgICAgICAgICAgLy8g7J6F66Cl7J20IFtcInVzZXJcIiwgXCJ1c2VyX19pZFwiXSDqsJnsnYAg6rK97JqwIVxuICAgICAgICAgICAgICAvLyDslaDstIjsl5Ag66eQ64+EIOyViCDrkJjsp4Drp4wg7JWI7KCE7ZWY6rKMIOyYiOyZuOulvCDrjZjsp5Hri4jri6QuXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgQ29uZmxpY3QgZGV0ZWN0ZWQgaW4gc2VsZWN0IGl0ZW1zOiBwYXJlbnQgcGF0aCBcIiR7cGFydHMuc2xpY2UoMCwgaSArIDEpLmpvaW4oXCJfX1wiKX1cIiBpcyBhbHJlYWR5IHNldCBhcyBhIGZpZWxkLCBjYW5ub3QgbmVzdCBcIiR7YWxpYXN9XCIgdW5kZXIgaXQuYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudFtwYXJ0XSA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOuniOyngOuniSDtjIztirjsl5Ag6rCSIOyEpOyglVxuICAgICAgICBjb25zdCBsYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBjdXJyZW50W2xhc3RQYXJ0XSA9IGNvbHVtblZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMocmVzdWx0KSk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi5zdHJpbmdpZnnsmYAg7Jyg7IKs7ZWcIOydvOydhCDtlanri4jri6QuXG4gICAqIOuLpOunjCDso7zslrTsp4Qg6rCd7LK066W8IEpTT07snbQg7JWE64uMIFR5cGVTY3JpcHQg6rCd7LK0IOumrO2EsOuftCDsiqTtirjrp4HsnLzroZwg66eM65Ok7Ja07KSN64uI64ukLlxuICAgKiBrZXnsl5Ag65Sw7Ji07ZGc6rCAIOyXhuyWtOyalC5cbiAgICog7Lac66ClIOyYiOyLnDpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB7XG4gICAqICAgaWQ6IFwidXNlcnMuaWRcIixcbiAgICogICBwYXJlbnQ6IHtcbiAgICogICAgIGlkOiBcInBhcmVudC5pZFwiLFxuICAgKiAgICAgbmFtZTogXCJwYXJlbnQubmFtZVwiLFxuICAgKiAgIH0sXG4gICAqIH1cbiAgICogYGBgXG4gICAqIEBwYXJhbSBvYmog67OA7ZmY7ZWgIOqwneyytFxuICAgKiBAcGFyYW0gaW5kZW50IOuTpOyXrOyTsOq4sCDroIjrsqhcbiAgICogQHBhcmFtIHdpdGhCcmFjZXMgdHJ1ZeuptCDspJHqtITtmLgg7Y+s7ZWoLCBmYWxzZeuptCDrgrTsmqnrp4wg67CY7ZmYXG4gICAqL1xuICBwcml2YXRlIHN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChcbiAgICBvYmo6IE5lc3RlZFNlbGVjdCxcbiAgICBpbmRlbnQ6IG51bWJlciA9IDAsXG4gICAgd2l0aEJyYWNlczogYm9vbGVhbiA9IHRydWUsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3BhY2VzID0gXCIgIFwiLnJlcGVhdChpbmRlbnQpO1xuICAgIGNvbnN0IGlubmVyU3BhY2VzID0gXCIgIFwiLnJlcGVhdChpbmRlbnQgKyAxKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhvYmopO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHdpdGhCcmFjZXMgPyBcInt9XCIgOiBcIlwiO1xuXG4gICAgY29uc3QgbGluZXMgPSBlbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAoaXNTdHJpbmdWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgLy8g7Lus65+8IOqyveuhnCAo7J2066+4IOuUsOyYtO2RnCDtj6ztlagpXG4gICAgICAgIHJldHVybiBgJHtpbm5lclNwYWNlc30ke2tleX06ICR7dmFsdWV9LGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDspJHssqkg6rCd7LK0ICjtla3sg4Eg7KSR6rSE7Zi4IO2PrO2VqClcbiAgICAgICAgcmV0dXJuIGAke2lubmVyU3BhY2VzfSR7a2V5fTogJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdCh2YWx1ZSwgaW5kZW50ICsgMSwgdHJ1ZSl9LGA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAod2l0aEJyYWNlcykge1xuICAgICAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbiR7c3BhY2VzfX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDspJHqtITtmLgg7JeG7J20IOuCtOyaqeunjCDrsJjtmZggKOyVnuuSpCDqsJztlokg7KCc7Jm4KVxuICAgICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICB9XG5cbiAgZ2V0UHVyaUxvYWRlclF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLmdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleSk7XG4gICAgY29uc3QgeyBsb2FkZXJzIH0gPSB0aGlzLnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCBzdWJzZXQpO1xuXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW2BbYF07XG5cbiAgICAvLyDsnqzqt4DsoIHsnLzroZwgbG9hZGVyIOyDneyEse2VmOuKlCDtl6ztjbwg7ZWo7IiYXG4gICAgY29uc3QgZ2VuZXJhdGVMb2FkZXJDb2RlID0gKG5lc3RlZExvYWRlcnM6IFN1YnNldFF1ZXJ5W1wibG9hZGVyc1wiXSk6IHN0cmluZ1tdID0+IHtcbiAgICAgIGNvbnN0IGxvYWRlckxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGxvYWRlciBvZiBuZXN0ZWRMb2FkZXJzKSB7XG4gICAgICAgIGNvbnN0IHsgdG9UYWJsZSwgdG9Db2wsIHRocm91Z2gsIGZyb21UYWJsZSB9ID0gbG9hZGVyLm1hbnlKb2luO1xuXG4gICAgICAgIC8vIGZyb21UYWJsZeydmCBFbnRpdHnrpbwg6rCA7KC47JmA7IScIFBLIO2DgOyehSDtmZXsnbhcbiAgICAgICAgY29uc3QgZnJvbUVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0QnlUYWJsZShmcm9tVGFibGUpO1xuICAgICAgICBjb25zdCBmcm9tSWRzVHlwZSA9IGZyb21FbnRpdHkuZ2V0UGtBcnJheVR5cGUoKTtcblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgIFwie1wiLFxuICAgICAgICAgIGBhczogXCIke2xvYWRlci5hc31cIixgLFxuICAgICAgICAgIGByZWZJZDogXCIke2xvYWRlci5tYW55Sm9pbi5pZEZpZWxkfVwiLGAsXG4gICAgICAgICAgYHFiOiAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4sIGZyb21JZHM6IG51bWJlcltdIHwgc3RyaW5nW10pID0+IHtgLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aHJvdWdoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBIYXNNYW55XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBcInJldHVybiBxYldyYXBwZXJcIixcbiAgICAgICAgICAgIGAuZnJvbShcIiR7dG9UYWJsZX1cIilgLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBsb2FkZXIub25lSm9pbnMuZm9yRWFjaCgoam9pbjogU3Vic2V0UXVlcnlbXCJqb2luc1wiXVtudW1iZXJdKSA9PiB7XG4gICAgICAgICAgICAvLyBGSyBudWxsYWJsZSDsl6zrtoDripQgbGVmdEpvaW4g7YOA7J6FIOyLnOq3uOuLiOyymOyXkOyEnCDsnpDrj5nsnLzroZwg7YyQ64uo65CoXG4gICAgICAgICAgICBjb25zdCBqb2luTWV0aG9kID0gam9pbi5qb2luID09PSBcImlubmVyXCIgPyBcImpvaW5cIiA6IFwibGVmdEpvaW5cIjtcbiAgICAgICAgICAgIGlmIChcImN1c3RvbVwiIGluIGpvaW4pIHtcbiAgICAgICAgICAgICAgLy8gY3VzdG9tIGpvaW4gY2xhdXNl64qUIGNhbGxiYWNrIO2Yle2DnOydmCBvbiDrqZTshJzrk5zroZwg7LKY66as7ZWp64uI64ukLlxuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIChqKSA9PiB7YCxcbiAgICAgICAgICAgICAgICBgai5vbihQdXJpLnJhd1N0cmluZyhcIiR7am9pbi5jdXN0b219XCIpKTtgLFxuICAgICAgICAgICAgICAgIFwifSlcIixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgXCIke2pvaW4uZnJvbX1cIiwgXCIke2pvaW4udG99XCIpYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIOyeheyytOyggSBzZWxlY3Qg6rWs7KGwIOyDneyEsSAocmVmSWQg7Y+s7ZWoKVxuICAgICAgICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3QobG9hZGVyLnNlbGVjdCk7XG4gICAgICAgICAgc2VsZWN0T2JqLnJlZklkID0gYFwiJHt0b1RhYmxlfS4ke3RvQ29sfVwiYDtcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgYC53aGVyZUluKFwiJHt0b1RhYmxlfS4ke3RvQ29sfVwiLCBmcm9tSWRzIGFzICR7ZnJvbUlkc1R5cGV9KWAsXG4gICAgICAgICAgICBgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTWFueVRvTWFueVxuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICBcInJldHVybiBxYldyYXBwZXJcIixcbiAgICAgICAgICAgIGAuZnJvbShcIiR7dGhyb3VnaC50YWJsZX1cIilgLFxuICAgICAgICAgICAgYC5qb2luKFwiJHt0b1RhYmxlfVwiLCBcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLnRvQ29sfVwiLCBcIiR7dG9UYWJsZX0uJHt0b0NvbH1cIilgLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBsb2FkZXIub25lSm9pbnMuZm9yRWFjaCgoam9pbjogU3Vic2V0UXVlcnlbXCJqb2luc1wiXVtudW1iZXJdKSA9PiB7XG4gICAgICAgICAgICAvLyBGSyBudWxsYWJsZSDsl6zrtoDripQgbGVmdEpvaW4g7YOA7J6FIOyLnOq3uOuLiOyymOyXkOyEnCDsnpDrj5nsnLzroZwg7YyQ64uo65CoXG4gICAgICAgICAgICBjb25zdCBqb2luTWV0aG9kID0gam9pbi5qb2luID09PSBcImlubmVyXCIgPyBcImpvaW5cIiA6IFwibGVmdEpvaW5cIjtcbiAgICAgICAgICAgIGlmIChcImN1c3RvbVwiIGluIGpvaW4pIHtcbiAgICAgICAgICAgICAgLy8gY3VzdG9tIGpvaW4gY2xhdXNl64qUIGNhbGxiYWNrIO2Yle2DnOydmCBvbiDrqZTshJzrk5zroZwg7LKY66as7ZWp64uI64ukLlxuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIChqKSA9PiB7YCxcbiAgICAgICAgICAgICAgICBgai5vbihQdXJpLnJhd1N0cmluZyhcIiR7am9pbi5jdXN0b219XCIpKTtgLFxuICAgICAgICAgICAgICAgIFwifSlcIixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgXCIke2pvaW4uZnJvbX1cIiwgXCIke2pvaW4udG99XCIpYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIOyeheyytOyggSBzZWxlY3Qg6rWs7KGwIOyDneyEsSAocmVmSWQg7Y+s7ZWoKVxuICAgICAgICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3QobG9hZGVyLnNlbGVjdCk7XG4gICAgICAgICAgc2VsZWN0T2JqLnJlZklkID0gYFwiJHt0aHJvdWdoLnRhYmxlfS4ke3Rocm91Z2guZnJvbUNvbH1cImA7XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIGAud2hlcmVJbihcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLmZyb21Db2x9XCIsIGZyb21JZHMgYXMgJHtmcm9tSWRzVHlwZX0pYCxcbiAgICAgICAgICAgIGAuc2VsZWN0KCR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3Qoc2VsZWN0T2JqKX0pO2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvYWRlckxpbmVzLnB1c2goYH0sYCk7XG5cbiAgICAgICAgLy8g7KSR7LKpIGxvYWRlcnMg7LKY66asXG4gICAgICAgIGlmIChsb2FkZXIubG9hZGVycyAmJiBsb2FkZXIubG9hZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcImxvYWRlcnM6IFtcIiwgLi4uZ2VuZXJhdGVMb2FkZXJDb2RlKGxvYWRlci5sb2FkZXJzKSwgXCJdLFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvYWRlckxpbmVzLnB1c2goXCJ9LFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxvYWRlckxpbmVzO1xuICAgIH07XG5cbiAgICBsaW5lcy5wdXNoKC4uLmdlbmVyYXRlTG9hZGVyQ29kZShsb2FkZXJzKSk7XG4gICAgbGluZXMucHVzaChgXWApO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICAvKlxuICAgIHN1YnNldCBTRUxFQ1QvSk9JTi9MT0FERVIg6rKw6rO8IOumrO2EtFxuICAqL1xuICBnZXRTdWJzZXRRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IFN1YnNldFF1ZXJ5IHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLmdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleSk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFN1YnNldFF1ZXJ5ID0gdGhpcy5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgc3Vic2V0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLypcbiAgICovXG4gIHJlc29sdmVTdWJzZXRRdWVyeShcbiAgICBwcmVmaXg6IHN0cmluZyxcbiAgICBmaWVsZHM6IHN0cmluZ1tdLFxuICAgIGlzQWxyZWFkeU91dGVySm9pbmVkOiBib29sZWFuID0gZmFsc2UsXG4gICk6IFN1YnNldFF1ZXJ5IHtcbiAgICAvLyBwcmVmaXgg7LmY7ZmYIChwcmVmaXjripQgVG9PbmVSZWxhdGlvbuydtCDrs7XsiJjroZwg67aZ7J2AIOqyveyasCDrqqjrkZAgX1/roZwg67OA6rK965CoKVxuICAgIHByZWZpeCA9IHByZWZpeC5yZXBsYWNlKC9cXC4vZywgXCJfX1wiKTtcblxuICAgIC8vIOyEnOu4jOyFi+ydhCAx646B7Iqk66eMIOu2hOumrO2VmOyXrCDqt7jro7ntlZFcbiAgICBjb25zdCBzdWJzZXRHcm91cCA9IGdyb3VwKGZpZWxkcywgKGZpZWxkKSA9PiB7XG4gICAgICBpZiAoZmllbGQuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgIGNvbnN0IFtyZWxdID0gZmllbGQuc3BsaXQoXCIuXCIpO1xuICAgICAgICByZXR1cm4gcmVsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3Qua2V5cyhzdWJzZXRHcm91cCkucmVkdWNlKFxuICAgICAgKHIsIGdyb3VwS2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwZWRGaWVsZHMgPSBzdWJzZXRHcm91cFtncm91cEtleV07XG4gICAgICAgIGFzc2VydChncm91cGVkRmllbGRzICE9PSB1bmRlZmluZWQsIFwiZmllbGRzIGlzIHVuZGVmaW5lZFwiKTtcblxuICAgICAgICAvLyDtmITsnqwg7YWM7J2067iUIO2VhOuTnOyFi+ydgCBzZWxlY3QsIHZpcnR1YWzsl5Ag7LaU6rCA7ZWY6rOgIOumrO2EtFxuICAgICAgICBpZiAoZ3JvdXBLZXkgPT09IFwiXCIpIHtcbiAgICAgICAgICBjb25zdCByZWFsRmllbGRzID0gZ3JvdXBlZEZpZWxkcy5maWx0ZXIoKGZpZWxkKSA9PiAhaXNWaXJ0dWFsUHJvcCh0aGlzLnByb3BzRGljdFtmaWVsZF0pKTtcbiAgICAgICAgICAvLyB2aXJ0dWFsVHlwZTogXCJjb2RlXCIgKOuYkOuKlCB1bmRlZmluZWQp7J24IHZpcnR1YWwgcHJvcOunjCByLnZpcnR1YWzsl5Ag7LaU6rCAXG4gICAgICAgICAgLy8gdmlydHVhbFR5cGU6IFwicXVlcnlcIuyduCDqsr3smrAg7IKs7Jqp7J6Q6rCAIGFwcGVuZFNlbGVjdOuhnCDsp4HsoJEg7LaU6rCA7ZWY66+A66GcIOygnOyZuFxuICAgICAgICAgIGNvbnN0IHZpcnR1YWxDb2RlRmllbGRzID0gZ3JvdXBlZEZpZWxkcy5maWx0ZXIoKGZpZWxkKSA9PlxuICAgICAgICAgICAgaXNWaXJ0dWFsQ29kZVByb3AodGhpcy5wcm9wc0RpY3RbZmllbGRdKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHByZWZpeCA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy8g7ZiE7J6sIO2FjOydtOu4lOyduCDqsr3smrBcbiAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KHJlYWxGaWVsZHMubWFwKChmaWVsZCkgPT4gdGhpcy5nZXRGdWxsRmllbGROYW1lKGZpZWxkKSkpO1xuICAgICAgICAgICAgci52aXJ0dWFsID0gci52aXJ0dWFsLmNvbmNhdCh2aXJ0dWFsQ29kZUZpZWxkcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIOuEmOyWtOyYqCDthYzsnbTruJTsnbgg6rK97JqwXG4gICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChcbiAgICAgICAgICAgICAgcmVhbEZpZWxkcy5tYXAoKGZpZWxkKSA9PiBgJHtwcmVmaXh9LiR7ZmllbGR9IGFzICR7cHJlZml4fV9fJHtmaWVsZH1gKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWxhdGlvbiA9IHRoaXMucmVsYXRpb25zW2dyb3VwS2V5XTtcbiAgICAgICAgaWYgKHJlbGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQgcmVsYXRpb24g7LC47KGwICR7Z3JvdXBLZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsYXRpb24ud2l0aCk7XG5cbiAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pIHx8IGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgIC8vIC1PbmUgUmVsYXRpb246IEpPSU4g7Jy866GcIOyymOumrFxuICAgICAgICAgIGNvbnN0IHJlbEZpZWxkcyA9IGdyb3VwZWRGaWVsZHMubWFwKChmaWVsZCkgPT4gZmllbGQuc3BsaXQoXCIuXCIpLnNsaWNlKDEpLmpvaW4oXCIuXCIpKTtcblxuICAgICAgICAgIC8vIC1PbmUgUmVsYXRpb27sl5DshJwgaWQg7ZWE65Oc66eMIOywuOyhsO2VmOuKlCDqsr3smrAg66a066CI7J207IWYIOuEmOq4sOyngCDslYrqs6Ag66as7YS0XG4gICAgICAgICAgaWYgKHJlbEZpZWxkcy5sZW5ndGggPT09IDEgJiYgcmVsRmllbGRzWzBdID09PSBcImlkXCIpIHtcbiAgICAgICAgICAgIGlmIChwcmVmaXggPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQoYCR7dGhpcy50YWJsZX0uJHtncm91cEtleX1faWRgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KGAke3ByZWZpeH0uJHtncm91cEtleX1faWQgYXMgJHtwcmVmaXh9X18ke2dyb3VwS2V5fV9pZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaW5uZXJPck91dGVyXG4gICAgICAgICAgY29uc3QgaW5uZXJPck91dGVyID0gKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChpc0FscmVhZHlPdXRlckpvaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmhhc0pvaW5Db2x1bW4gJiYgIShyZWxhdGlvbi5udWxsYWJsZSA/PyBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJpbm5lclwiO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm91dGVyXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5udWxsYWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm91dGVyXCI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaW5uZXJcIjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgY29uc3QgcmVsU3Vic2V0UXVlcnkgPSByZWxFbnRpdHkucmVzb2x2ZVN1YnNldFF1ZXJ5KFxuICAgICAgICAgICAgYCR7cHJlZml4ICE9PSBcIlwiID8gYCR7cHJlZml4fS5gIDogXCJcIn0ke2dyb3VwS2V5fWAsXG4gICAgICAgICAgICByZWxGaWVsZHMsXG4gICAgICAgICAgICBpbm5lck9yT3V0ZXIgPT09IFwib3V0ZXJcIixcbiAgICAgICAgICApO1xuICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KHJlbFN1YnNldFF1ZXJ5LnNlbGVjdCk7XG4gICAgICAgICAgci52aXJ0dWFsID0gci52aXJ0dWFsLmNvbmNhdChyZWxTdWJzZXRRdWVyeS52aXJ0dWFsKTtcblxuICAgICAgICAgIGNvbnN0IGpvaW5BcyA9IHByZWZpeCA9PT0gXCJcIiA/IGdyb3VwS2V5IDogYCR7cHJlZml4fV9fJHtncm91cEtleX1gO1xuICAgICAgICAgIGNvbnN0IGZyb21UYWJsZSA9IHByZWZpeCA9PT0gXCJcIiA/IHRoaXMudGFibGUgOiBwcmVmaXg7XG5cbiAgICAgICAgICBsZXQgam9pbkNsYXVzZTpcbiAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgIGZyb206IHN0cmluZztcbiAgICAgICAgICAgICAgICB0bzogc3RyaW5nO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICBjdXN0b206IHN0cmluZztcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICBpZiAocmVsYXRpb24uY3VzdG9tSm9pbkNsYXVzZSkge1xuICAgICAgICAgICAgam9pbkNsYXVzZSA9IHtcbiAgICAgICAgICAgICAgY3VzdG9tOiByZWxhdGlvbi5jdXN0b21Kb2luQ2xhdXNlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZyb206IHN0cmluZywgdG86IHN0cmluZztcbiAgICAgICAgICAgIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaGFzSm9pbkNvbHVtbikge1xuICAgICAgICAgICAgICAgIGZyb20gPSBgJHtmcm9tVGFibGV9LiR7cmVsYXRpb24ubmFtZX1faWRgO1xuICAgICAgICAgICAgICAgIHRvID0gYCR7am9pbkFzfS5pZGA7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZnJvbSA9IGAke2Zyb21UYWJsZX0uaWRgO1xuICAgICAgICAgICAgICAgIHRvID0gYCR7am9pbkFzfS4ke2luZmxlY3Rpb24udW5kZXJzY29yZSh0aGlzLm5hbWVzLmZzLnJlcGxhY2UoLy0vZywgXCJfXCIpKX1faWRgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmcm9tID0gYCR7ZnJvbVRhYmxlfS4ke3JlbGF0aW9uLm5hbWV9X2lkYDtcbiAgICAgICAgICAgICAgdG8gPSBgJHtqb2luQXN9LmlkYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGpvaW5DbGF1c2UgPSB7XG4gICAgICAgICAgICAgIGZyb20sXG4gICAgICAgICAgICAgIHRvLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByLmpvaW5zLnB1c2goe1xuICAgICAgICAgICAgYXM6IGpvaW5BcyxcbiAgICAgICAgICAgIGpvaW46IGlubmVyT3JPdXRlcixcbiAgICAgICAgICAgIHRhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICAuLi5qb2luQ2xhdXNlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gQmVsb25nc1RvT25lIOuwkeyXkCBIYXNNYW556rCAIOu2meydgCDqsr3smrBcbiAgICAgICAgICBpZiAocmVsU3Vic2V0UXVlcnkubG9hZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjb252ZXJ0ZWRMb2FkZXJzID0gcmVsU3Vic2V0UXVlcnkubG9hZGVycy5tYXAoKGxvYWRlcikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBuZXdBcyA9IFtncm91cEtleSwgbG9hZGVyLmFzXS5qb2luKFwiX19cIik7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYXM6IG5ld0FzLFxuICAgICAgICAgICAgICAgIHRhYmxlOiBsb2FkZXIudGFibGUsXG4gICAgICAgICAgICAgICAgbWFueUpvaW46IGxvYWRlci5tYW55Sm9pbixcbiAgICAgICAgICAgICAgICBvbmVKb2luczogbG9hZGVyLm9uZUpvaW5zLFxuICAgICAgICAgICAgICAgIHNlbGVjdDogbG9hZGVyLnNlbGVjdCxcbiAgICAgICAgICAgICAgICBsb2FkZXJzOiBsb2FkZXIubG9hZGVycyxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByLmxvYWRlcnMgPSBbLi4uci5sb2FkZXJzLCAuLi5jb252ZXJ0ZWRMb2FkZXJzXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByLmpvaW5zID0gci5qb2lucy5jb25jYXQocmVsU3Vic2V0UXVlcnkuam9pbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikgfHwgaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgIC8vIC1NYW55IFJlbGF0aW9uOiBMb2FkZXIg66GcIOyymOumrFxuICAgICAgICAgIGNvbnN0IHJlbEZpZWxkcyA9IGdyb3VwZWRGaWVsZHMubWFwKChmaWVsZCkgPT4gZmllbGQuc3BsaXQoXCIuXCIpLnNsaWNlKDEpLmpvaW4oXCIuXCIpKTtcbiAgICAgICAgICBjb25zdCByZWxTdWJzZXRRdWVyeSA9IHJlbEVudGl0eS5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgcmVsRmllbGRzKTtcblxuICAgICAgICAgIGxldCBtYW55Sm9pbjogU3Vic2V0UXVlcnlbXCJsb2FkZXJzXCJdW251bWJlcl1bXCJtYW55Sm9pblwiXTtcbiAgICAgICAgICBpZiAoaXNIYXNNYW55UmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgICAgY29uc3QgZnJvbUNvbCA9IHJlbGF0aW9uPy5mcm9tQ29sdW1uID8/IFwiaWRcIjtcbiAgICAgICAgICAgIG1hbnlKb2luID0ge1xuICAgICAgICAgICAgICBmcm9tVGFibGU6IHRoaXMudGFibGUsXG4gICAgICAgICAgICAgIGZyb21Db2wsXG4gICAgICAgICAgICAgIGlkRmllbGQ6IHByZWZpeCA9PT0gXCJcIiA/IGAke2Zyb21Db2x9YCA6IGAke3ByZWZpeH1fXyR7ZnJvbUNvbH1gLFxuICAgICAgICAgICAgICB0b1RhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICAgIHRvQ29sOiByZWxhdGlvbi5qb2luQ29sdW1uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgIG1hbnlKb2luID0ge1xuICAgICAgICAgICAgICBmcm9tVGFibGU6IHRoaXMudGFibGUsXG4gICAgICAgICAgICAgIGZyb21Db2w6IFwiaWRcIixcbiAgICAgICAgICAgICAgaWRGaWVsZDogcHJlZml4ID09PSBcIlwiID8gYGlkYCA6IGAke3ByZWZpeH1fX2lkYCxcbiAgICAgICAgICAgICAgdGhyb3VnaDoge1xuICAgICAgICAgICAgICAgIHRhYmxlOiByZWxhdGlvbi5qb2luVGFibGUsXG4gICAgICAgICAgICAgICAgZnJvbUNvbDogYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZSh0aGlzLnRhYmxlKX1faWRgLFxuICAgICAgICAgICAgICAgIHRvQ29sOiBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHJlbEVudGl0eS50YWJsZSl9X2lkYCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdG9UYWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgICB0b0NvbDogXCJpZFwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5sb2FkZXJzLnB1c2goe1xuICAgICAgICAgICAgYXM6IGdyb3VwS2V5LFxuICAgICAgICAgICAgdGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgIG1hbnlKb2luLFxuICAgICAgICAgICAgb25lSm9pbnM6IHJlbFN1YnNldFF1ZXJ5LmpvaW5zLFxuICAgICAgICAgICAgc2VsZWN0OiByZWxTdWJzZXRRdWVyeS5zZWxlY3QsXG4gICAgICAgICAgICBsb2FkZXJzOiByZWxTdWJzZXRRdWVyeS5sb2FkZXJzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LFxuICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICB7XG4gICAgICAgIHNlbGVjdDogW10sXG4gICAgICAgIHZpcnR1YWw6IFtdLFxuICAgICAgICBqb2luczogW10sXG4gICAgICAgIGxvYWRlcnM6IFtdLFxuICAgICAgfSBhcyBTdWJzZXRRdWVyeSxcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKlxuICAgIEZpZWxkRXhwcltdIOydhCBFbnRpdHlQcm9wTm9kZVtdIOuhnCDrs4DtmZhcbiAgKi9cbiAgZmllbGRFeHByc1RvUHJvcE5vZGVzKGZpZWxkRXhwcnM6IHN0cmluZ1tdLCBlbnRpdHk6IEVudGl0eSA9IHRoaXMpOiBFbnRpdHlQcm9wTm9kZVtdIHtcbiAgICBjb25zdCBncm91cHMgPSBmaWVsZEV4cHJzLnJlZHVjZShcbiAgICAgIChyZXN1bHQsIGZpZWxkRXhwcikgPT4ge1xuICAgICAgICBsZXQga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGVsc2VFeHByOiBzdHJpbmdbXTtcbiAgICAgICAgaWYgKGZpZWxkRXhwci5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgICAgICBba2V5LCAuLi5lbHNlRXhwcl0gPSBmaWVsZEV4cHIuc3BsaXQoXCIuXCIpO1xuICAgICAgICAgIHZhbHVlID0gZWxzZUV4cHIuam9pbihcIi5cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAga2V5ID0gXCJcIjtcbiAgICAgICAgICB2YWx1ZSA9IGZpZWxkRXhwcjtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRba2V5XSA9IChyZXN1bHRba2V5XSA/PyBbXSkuY29uY2F0KHZhbHVlKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAge30gYXMge1xuICAgICAgICBbazogc3RyaW5nXTogc3RyaW5nW107XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZ3JvdXBzKS5mbGF0TWFwPEVudGl0eVByb3BOb2RlLCBFbnRpdHlQcm9wTm9kZVtdPigoa2V5KSA9PiB7XG4gICAgICBjb25zdCBncm91cGVkRmllbGRFeHBycyA9IGdyb3Vwc1trZXldO1xuXG4gICAgICAvLyDsnbzrsJggcHJvcCDsspjrpqxcbiAgICAgIGlmIChrZXkgPT09IFwiXCIpIHtcbiAgICAgICAgcmV0dXJuIGdyb3VwZWRGaWVsZEV4cHJzLm1hcCgocHJvcE5hbWUpID0+IHtcbiAgICAgICAgICBjb25zdCBwcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgICAgIGlmIChwcm9wID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYCR7ZW50aXR5LmlkfSAtLSDsnpjrqrvrkJwgRmllbGRFeHByICcke3Byb3BOYW1lfScgKOyCrOyaqSDqsIDriqXtlZwgcHJvcHM6ICR7ZW50aXR5LnByb3BzLm1hcCgocCkgPT4gcC5uYW1lKS5qb2luKFwiLCBcIil9KWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZVR5cGU6IFwicGxhaW5cIiBhcyBjb25zdCxcbiAgICAgICAgICAgIHByb3AsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHJlbGF0aW9uIHByb3Ag7LKY66asXG4gICAgICBjb25zdCBwcm9wID0gZW50aXR5LnByb3BzRGljdFtrZXldO1xuICAgICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOyemOuqu+uQnCBGaWVsZEV4cHIgJHtrZXl9LiR7Z3JvdXBlZEZpZWxkRXhwcnNbMF19YCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuXG4gICAgICAvLyByZWxhdGlvbiAtT25lIOyXkCBpZCDtlYTrk5wg7ZWY64KY7J24IOqyveyasFxuICAgICAgaWYgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGdyb3VwZWRGaWVsZEV4cHJzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgIChncm91cGVkRmllbGRFeHByc1swXSA9PT0gXCJpZFwiIHx8IGdyb3VwZWRGaWVsZEV4cHJzWzBdID09PSBcImlkP1wiKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBpZCDtlZjrgpjrp4wg7J6I64qU7KeAIOyytO2BrO2VtOyEnCwg7ZWY64KY66eMIOyeiOycvOuptCDsg4HsnIQgcHJvcOycvOuhnCBpZOulvCDrpqzthLRcbiAgICAgICAgICBjb25zdCBpZFByb3AgPSByZWxFbnRpdHkucHJvcHNEaWN0LmlkO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlVHlwZTogXCJwbGFpblwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgcHJvcDoge1xuICAgICAgICAgICAgICAuLi5pZFByb3AsXG4gICAgICAgICAgICAgIG5hbWU6IGAke2tleX1faWRgLFxuICAgICAgICAgICAgICBudWxsYWJsZTogcHJvcC5udWxsYWJsZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAtT25lIOq3uOyZuOydmCDqsr3smrAgb2JqZWN066GcIOumrO2EtFxuICAgICAgLy8gLU1hbnnsnZgg6rK97JqwIGFycmF566GcIOumrO2EtFxuICAgICAgLy8gUmVjdXJzaXZlIOuhnCDrjoHsiqQg7LKY66asXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZmllbGRFeHByc1RvUHJvcE5vZGVzKGdyb3VwZWRGaWVsZEV4cHJzLCByZWxFbnRpdHkpO1xuICAgICAgY29uc3Qgbm9kZVR5cGUgPVxuICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCBpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApXG4gICAgICAgICAgPyAoXCJvYmplY3RcIiBhcyBjb25zdClcbiAgICAgICAgICA6IChcImFycmF5XCIgYXMgY29uc3QpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBub2RlVHlwZSxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RmllbGRFeHBycyhwcmVmaXggPSBcIlwiLCBtYXhEZXB0aDogbnVtYmVyID0gMywgZnJvbXM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHNcbiAgICAgIC5mbGF0TWFwKChwcm9wKSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BOYW1lID0gW3ByZWZpeCwgcHJvcC5uYW1lXS5maWx0ZXIoKHYpID0+IHYgIT09IFwiXCIpLmpvaW4oXCIuXCIpO1xuICAgICAgICBpZiAocHJvcE5hbWUgPT09IHByZWZpeCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGlmIChtYXhEZXB0aCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZnJvbXMuaW5jbHVkZXMocHJvcC53aXRoKSkge1xuICAgICAgICAgICAgLy8g7Jet67Cp7ZalIHJlbGF0aW9u7J24IOqyveyasCDsoJzsmbhcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyDsoJXrsKntlqUgcmVsYXRpb27snbgg6rK97JqwIHJlY3Vyc2l2ZSDsvZxcbiAgICAgICAgICBjb25zdCByZWxNZCA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgcmV0dXJuIHJlbE1kLmdldEZpZWxkRXhwcnMocHJvcE5hbWUsIG1heERlcHRoIC0gMSwgWy4uLmZyb21zLCB0aGlzLmlkXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BOYW1lO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYgIT09IG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uIHByb3DsnbQg7ZiE7J6sIO2FjOydtOu4lOyXkCBGSyDsu6zrn7zsnYQg7IOd7ISx7ZWY64qU7KeAIO2ZleyduFxuICAgKihCZWxvbmdzVG9PbmUg65iQ64qUIE9uZVRvT25lKGhhc0pvaW5Db2x1bW49dHJ1ZSnsnbgg6rK97JqwIEZLIOyDneyEsSlcbiAgICovXG4gIHByaXZhdGUgaGFzRm9yZWlnbktleShwcm9wOiBSZWxhdGlvblByb3ApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgcHJvcC5yZWxhdGlvblR5cGUgPT09IFwiQmVsb25nc1RvT25lXCIgfHxcbiAgICAgIChwcm9wLnJlbGF0aW9uVHlwZSA9PT0gXCJPbmVUb09uZVwiICYmIHByb3AuaGFzSm9pbkNvbHVtbilcbiAgICApO1xuICB9XG5cbiAgZ2V0VGFibGVDb2x1bW5zKCk6IHsgbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmcgfVtdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wc1xuICAgICAgLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICBpZiAocHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNGb3JlaWduS2V5KHByb3ApKSB7XG4gICAgICAgICAgICByZXR1cm4geyBuYW1lOiBgJHtwcm9wLm5hbWV9X2lkYCwgdHlwZTogXCJpbnRfdW5zaWduZWRcIiB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbmFtZTogcHJvcC5uYW1lLCB0eXBlOiBwcm9wLnR5cGUgfTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRpdHnsl5Ag7KCV7J2Y65CcIOuqqOuToCB2ZWN0b3Ig7YOA7J6FIOy7rOufvCDrsJjtmZhcbiAgICovXG4gIGdldFZlY3RvckNvbHVtbnMoKTogRW50aXR5UHJvcFtdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5maWx0ZXIoKHApID0+IHAudHlwZSA9PT0gXCJ2ZWN0b3JcIik7XG4gIH1cblxuICAvKipcbiAgICog7Yq57KCVIHZlY3RvciDsu6zrn7wg67CY7ZmYXG4gICAqIEBwYXJhbSBjb2x1bW5OYW1lIC0g7Lus65+866qFICjsg53rnrUg7IucIOyyqyDrsojsp7ggdmVjdG9yIOy7rOufvClcbiAgICovXG4gIGdldFZlY3RvckNvbHVtbihjb2x1bW5OYW1lPzogc3RyaW5nKTogRW50aXR5UHJvcCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdmVjdG9yUHJvcHMgPSB0aGlzLmdldFZlY3RvckNvbHVtbnMoKTtcbiAgICBpZiAoY29sdW1uTmFtZSkge1xuICAgICAgcmV0dXJuIHZlY3RvclByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gY29sdW1uTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB2ZWN0b3JQcm9wc1swXTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlYTthLDrp4Eg6rCA64ql7ZWcIHByb3BzIOuwmO2ZmFxuICAgKlxuICAgKiAtIOydvOuwmCBwcm9wXG4gICAqIC0gRkvrpbwg7IOd7ISx7ZWY64qUIHJlbGF0aW9uIChCZWxvbmdzVG9PbmUsIE9uZVRvT25lIHdpdGggaGFzSm9pbkNvbHVtbilcbiAgICogICDihpIge25hbWV9X2lkIO2Yle2DnOydmCDqsIDsg4EgaW50ZWdlciBwcm9w7Jy866GcIOuzgO2ZmFxuICAgKi9cbiAgZ2V0RmlsdGVyYWJsZVByb3BzKCk6IEVudGl0eVByb3BbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZmxhdE1hcCgocHJvcCk6IEVudGl0eVByb3AgfCBFbnRpdHlQcm9wW10gPT4ge1xuICAgICAgLy8gVmlydHVhbCBwcm9wIOygnOyZuFxuICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWxhdGlvbiBwcm9wIOyymOumrFxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIC8vIEZL66W8IOyDneyEse2VmOuKlCByZWxhdGlvbuunjCDtj6ztlahcbiAgICAgICAgaWYgKHRoaXMuaGFzRm9yZWlnbktleShwcm9wKSkge1xuICAgICAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBgJHtwcm9wLm5hbWV9X2lkYCxcbiAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHByb3AubnVsbGFibGUsXG4gICAgICAgICAgfSBhcyBFbnRpdHlQcm9wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgLy8g7J2867CYIHByb3Ag7LKY66asXG4gICAgICByZXR1cm4gcHJvcDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRpdHnqsIAg64W47Lac7ZWY64qUIO2DgOyehSDsnbTrpoTqs7wg66qo65OIIOqyveuhnOulvCBFbnRpdHlNYW5hZ2Vy7JeQIOuTseuhne2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGV4cGxpY2l0QXBpUm9vdFBhdGggLSBTb25hbXUg7LSI6riw7ZmUIOyXhuydtCDrk7HroZ3tlaAg65WMIOyCrOyaqe2VoCBBUEkg66Oo7Yq4IOqyveuhnFxuICAgKi9cbiAgYXN5bmMgcmVnaXN0ZXJNb2R1bGVQYXRocyhleHBsaWNpdEFwaVJvb3RQYXRoPzogc3RyaW5nKSB7XG4gICAgY29uc3QgYmFzZVBhdGggPSBgJHt0aGlzLm5hbWVzLnBhcmVudEZzfWA7XG5cbiAgICAvLyBiYXNlLXNjaGVtZVxuICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChgJHt0aGlzLmlkfUJhc2VTY2hlbWFgLCBgc29uYW11LmdlbmVyYXRlZGApO1xuXG4gICAgLy8gc3Vic2V0XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuc3Vic2V0cykubGVuZ3RoID4gMCkge1xuICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKGAke3RoaXMuaWR9U3Vic2V0S2V5YCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChgJHt0aGlzLmlkfVN1YnNldE1hcHBpbmdgLCBgc29uYW11LmdlbmVyYXRlZGApO1xuICAgICAgZm9yIChjb25zdCBzdWJzZXRLZXkgb2YgT2JqZWN0LmtleXModGhpcy5zdWJzZXRzKSkge1xuICAgICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoXG4gICAgICAgICAgYCR7dGhpcy5pZH1TdWJzZXQke3N1YnNldEtleS50b1VwcGVyQ2FzZSgpfWAsXG4gICAgICAgICAgYHNvbmFtdS5nZW5lcmF0ZWRgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVudW1zXG4gICAgZm9yIChjb25zdCBlbnVtSWQgb2YgT2JqZWN0LmtleXModGhpcy5lbnVtTGFiZWxzKSkge1xuICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKGVudW1JZCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcbiAgICB9XG5cbiAgICAvLyB0eXBlc1xuICAgIGNvbnN0IHR5cGVzTW9kdWxlUGF0aCA9IGAke2Jhc2VQYXRofS8ke3RoaXMubmFtZXMucGFyZW50RnN9LnR5cGVzYDtcbiAgICBjb25zdCB0eXBlc0ZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgZXhwbGljaXRBcGlSb290UGF0aCA/PyBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgICBydW50aW1lUGF0aChgZGlzdC9hcHBsaWNhdGlvbi8ke3R5cGVzTW9kdWxlUGF0aH0uanNgKSxcbiAgICApO1xuXG4gICAgaWYgKGF3YWl0IGV4aXN0cyh0eXBlc0ZpbGVQYXRoKSkge1xuICAgICAgY29uc3QgaW1wb3J0ZWRNZW1iZXJzID0gYXdhaXQgaW1wb3J0TWVtYmVyczx6LlpvZFR5cGVBbnk+KHR5cGVzRmlsZVBhdGgpO1xuICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICB0aGlzLnR5cGVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBpbXBvcnRlZE1lbWJlcnMubWFwKCh7IG5hbWUsIHZhbHVlIH0pID0+IHtcbiAgICAgICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgobmFtZSwgdHlwZXNNb2R1bGVQYXRoKTtcbiAgICAgICAgICByZXR1cm4gW25hbWUsIHZhbHVlXTtcbiAgICAgICAgfSksXG4gICAgICApIGFzIHsgW25hbWU6IHN0cmluZ106IHouWm9kVHlwZUFueSB9O1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyVGFibGVTcGVjcygpOiB2b2lkIHtcbiAgICAvLyDsobDsnbgg7YWM7J2067iUIOyduOuNseyKpCDsoJzsmbggKOy7rOufvCDsnbTrpoTsl5AgJy4n7J20IO2PrO2VqOuQnCDqsr3smrApXG4gICAgY29uc3QgdW5pcXVlSW5kZXhlcyA9IHRoaXMuaW5kZXhlc1xuICAgICAgLmZpbHRlcigoaWR4KSA9PiBpZHgudHlwZSA9PT0gXCJ1bmlxdWVcIilcbiAgICAgIC5maWx0ZXIoKGlkeCkgPT4gaWR4LmNvbHVtbnMuZXZlcnkoKGNvbCkgPT4gIWNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKSkpO1xuXG4gICAgRW50aXR5TWFuYWdlci5zZXRUYWJsZVNwZWMoe1xuICAgICAgbmFtZTogdGhpcy50YWJsZSxcbiAgICAgIHVuaXF1ZUluZGV4ZXMsXG4gICAgICBqc29uQ29sdW1uczogdGhpcy5wcm9wcy5maWx0ZXIoKHApID0+IHAudHlwZSA9PT0gXCJqc29uXCIpLm1hcCgocCkgPT4gcC5uYW1lKSxcbiAgICB9KTtcbiAgfVxuXG4gIHRvSnNvbigpOiBFbnRpdHlKc29uIHtcbiAgICAvLyBzdWJzZXRz7JmAIHN1YnNldHNJbnRlcm5hbOydhCBTdWJzZXREZWYg7ZiV7YOc66GcIOuzteybkCAoY29uZSDtj6ztlagpXG4gICAgY29uc3Qgc3Vic2V0czogeyBba2V5OiBzdHJpbmddOiBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKS5TdWJzZXREZWYgfSA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuc3Vic2V0cykpIHtcbiAgICAgIGNvbnN0IG5vcm1hbEZpZWxkczogU3Vic2V0RmllbGRbXSA9IHRoaXMuc3Vic2V0c1trZXldO1xuICAgICAgY29uc3QgaW50ZXJuYWxGaWVsZHM6IFN1YnNldEZpZWxkW10gPSAodGhpcy5zdWJzZXRzSW50ZXJuYWxba2V5XSA/PyBbXSkubWFwKChmaWVsZCkgPT4gKHtcbiAgICAgICAgZmllbGQsXG4gICAgICAgIGludGVybmFsOiB0cnVlLFxuICAgICAgfSkpO1xuICAgICAgY29uc3QgZmllbGRzID0gWy4uLm5vcm1hbEZpZWxkcywgLi4uaW50ZXJuYWxGaWVsZHNdO1xuXG4gICAgICAvLyBjb25l7J20IOyeiOycvOuptCDsg4jroZzsmrQg6rCd7LK0IO2Yle2DnOuhnCwg7JeG7Jy866m0IOuwsOyXtCDtmJXtg5zroZxcbiAgICAgIGlmICh0aGlzLnN1YnNldENvbmVzW2tleV0pIHtcbiAgICAgICAgc3Vic2V0c1trZXldID0ge1xuICAgICAgICAgIGZpZWxkcyxcbiAgICAgICAgICBjb25lOiB0aGlzLnN1YnNldENvbmVzW2tleV0sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJzZXRzW2tleV0gPSBmaWVsZHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZW51bXPrpbwgRW51bURlZiDtmJXtg5zroZwg67O17JuQIChjb25lIO2PrO2VqClcbiAgICBjb25zdCBlbnVtczogeyBba2V5OiBzdHJpbmddOiBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKS5FbnVtRGVmIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlc10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5lbnVtTGFiZWxzKSkge1xuICAgICAgLy8gY29uZeydtCDsnojsnLzrqbQg7IOI66Gc7Jq0IOqwneyytCDtmJXtg5zroZwsIOyXhuycvOuptCBSZWNvcmQg7ZiV7YOc66GcXG4gICAgICBpZiAodGhpcy5lbnVtQ29uZXNba2V5XSkge1xuICAgICAgICBlbnVtc1trZXldID0ge1xuICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICBjb25lOiB0aGlzLmVudW1Db25lc1trZXldLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW51bXNba2V5XSA9IHZhbHVlcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBwYXJlbnRJZDogdGhpcy5wYXJlbnRJZCxcbiAgICAgIHRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBjdXN0b206IHRoaXMuY3VzdG9tLFxuICAgICAgY29uZTogdGhpcy5jb25lLFxuICAgICAgcHJvcHM6IHRoaXMucHJvcHMsXG4gICAgICBpbmRleGVzOiB0aGlzLmluZGV4ZXMsXG4gICAgICBzdWJzZXRzLFxuICAgICAgZW51bXMsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gc29ydDogc3Vic2V0c1xuICAgIGNvbnN0IHN1YnNldFJvd3MgPSB0aGlzLmdldFN1YnNldFJvd3MoKTtcbiAgICB0aGlzLnN1YnNldHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHMpLm1hcCgoW3N1YnNldEtleV0pID0+IHtcbiAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvd3MsIHN1YnNldEtleSwgZmFsc2UpXTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5zdWJzZXRzSW50ZXJuYWwgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHNJbnRlcm5hbCkubWFwKChbc3Vic2V0S2V5XSkgPT4ge1xuICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgdGhpcy5zdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoc3Vic2V0Um93cywgc3Vic2V0S2V5LCB0cnVlKV07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gc2F2ZVxuICAgIGNvbnN0IGpzb25QYXRoID0gcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke3RoaXMubmFtZXMucGFyZW50RnN9LyR7dGhpcy5uYW1lcy5mc30uZW50aXR5Lmpzb25gLFxuICAgICk7XG4gICAgY29uc3QganNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGpzb25QYXRoLCBhd2FpdCBmb3JtYXRDb2RlKEpTT04uc3RyaW5naWZ5KGpzb24pLCBqc29uUGF0aCkpO1xuXG4gICAgLy8gcmVsb2FkXG4gICAgYXdhaXQgRW50aXR5TWFuYWdlci5yZWdpc3Rlcihqc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDthZztlIzrpr8gY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBMTE3snYQg7IKs7Jqp7ZWY7KeAIOyViuqzoCBmYWtlci1tYXBwaW5ncy50c+ulvCDtmZzsmqntlZjsl6wg6riw67O4IGNvbmXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBzdHViIGVudGl0eSDsg53shLEg7IucIOyekOuPmeycvOuhnCDtmLjstpzrkJjslrQg7LWc7IaM7ZWc7J2YIGNvbmUg66mU7YOA642w7J207YSw66W8IOygnOqzte2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGxvY2FsZSAtIOyDneyEsSDsi5wg7IKs7Jqp7ZWgIGxvY2FsZSAo6riw67O46rCSOiBTb25hbXUuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZSDrmJDripQgXCJrb1wiKVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzKGxvY2FsZT86IFwia29cIiB8IFwiZW5cIiB8IFwiamFcIik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2VudGl0eS10ZW1wbGF0ZS1jb25lXCIpO1xuICAgIGNvbnN0IGNvbmZpZ0xvY2FsZSA9IFNvbmFtdS5jb25maWcuaTE4bj8uZGVmYXVsdExvY2FsZTtcbiAgICBjb25zdCBlZmZlY3RpdmVMb2NhbGUgPVxuICAgICAgbG9jYWxlIHx8XG4gICAgICAoY29uZmlnTG9jYWxlID09PSBcImtvXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImVuXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImphXCJcbiAgICAgICAgPyBjb25maWdMb2NhbGVcbiAgICAgICAgOiBcImtvXCIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGdlbmVyYXRlVGVtcGxhdGVDb25lcyh0aGlzLnRvSnNvbigpLCBlZmZlY3RpdmVMb2NhbGUpO1xuXG4gICAgLy8g6rKw6rO866W8IEVudGl0eeyXkCDsoIHsmqkgKGFwcGx5Q29uZXPsmYAg64+Z7J287ZWcIOuwqeyLnSlcbiAgICBpZiAocmVzdWx0LmVudGl0eUNvbmUpIHtcbiAgICAgIHRoaXMuY29uZSA9IHJlc3VsdC5lbnRpdHlDb25lO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBjb25lXSBvZiBPYmplY3QuZW50cmllcyhyZXN1bHQucHJvcENvbmVzKSkge1xuICAgICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICBpZiAocHJvcCkge1xuICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgKHByb3AgYXMgeyBjb25lPzogQ29uZSB9KS5jb25lID0gY29uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVudW1Db25lcyA9IHsgLi4udGhpcy5lbnVtQ29uZXMsIC4uLnJlc3VsdC5lbnVtQ29uZXMgfTtcbiAgICB0aGlzLnN1YnNldENvbmVzID0geyAuLi50aGlzLnN1YnNldENvbmVzLCAuLi5yZXN1bHQuc3Vic2V0Q29uZXMgfTtcblxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExMTeydhCDsgqzsmqntlZjsl6wgY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5wcmVzZXJ2ZUV4aXN0aW5nIC0g6riw7KG0IGNvbmUg67O07KG0IOyXrOu2gCAo6riw67O46rCSOiB0cnVlKVxuICAgKiBAcGFyYW0gb3B0aW9ucy5vbmx5RW1wdHkgLSBmaXh0dXJlSGludOqwgCDsl4bripQgY29uZeunjCDsg53shLEgKOq4sOuzuOqwkjogZmFsc2UpXG4gICAqIEBwYXJhbSBvcHRpb25zLmxvY2FsZSAtIOyDneyEsSDsi5wg7IKs7Jqp7ZWgIGxvY2FsZSAo6riw67O46rCSOiBcImtvXCIpXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZUNvbmVzKG9wdGlvbnM/OiB7XG4gICAgcHJlc2VydmVFeGlzdGluZz86IGJvb2xlYW47XG4gICAgb25seUVtcHR5PzogYm9vbGVhbjtcbiAgICBsb2NhbGU/OiBcImtvXCIgfCBcImVuXCIgfCBcImphXCI7XG4gICAgLyoqIO2FjOyKpO2KuOuCmCDrjIDssrQgTExNIOqzteq4ieyekOulvCDsnITtlZwg7YWN7Iqk7Yq4IOyDneyEsSDqtaztmIQgKi9cbiAgICBnZW5lcmF0ZVRleHQ/OiBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVUZXh0R2VuZXJhdG9yO1xuICAgIC8qKiBmYWxzZeydtOuptCDsg53shLEg6rKw6rO866W8IOuplOuqqOumrOyXkOunjCDsoIHsmqntlZjqs6AgZW50aXR5IO2MjOydvOydgCDsoIDsnqXtlZjsp4Ag7JWK7Iq164uI64ukLiAqL1xuICAgIHBlcnNpc3Q/OiBib29sZWFuO1xuICB9KTogUHJvbWlzZTxpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVHZW5lcmF0aW9uUmVzdWx0PiB7XG4gICAgY29uc3QgeyBnZW5lcmF0ZUNvbmVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpO1xuICAgIGNvbnN0IGNvbnRleHQ6IGltcG9ydChcIi4uL2NvbmUvY29uZS1nZW5lcmF0b3JcIikuQ29uZUdlbmVyYXRpb25Db250ZXh0ID0ge1xuICAgICAgZW50aXR5OiB0aGlzLnRvSnNvbigpLFxuICAgICAgbG9jYWxlOiBvcHRpb25zPy5sb2NhbGUgfHwgXCJrb1wiLFxuICAgICAgZXhpc3RpbmdDb25lczogb3B0aW9ucz8ucHJlc2VydmVFeGlzdGluZyAhPT0gZmFsc2UgPyB0aGlzLmNvbGxlY3RFeGlzdGluZ0NvbmVzKCkgOiB1bmRlZmluZWQsXG4gICAgICBvbmx5RW1wdHk6IG9wdGlvbnM/Lm9ubHlFbXB0eSA/PyBmYWxzZSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2VuZXJhdGVDb25lcyhjb250ZXh0LCB7IGdlbmVyYXRlVGV4dDogb3B0aW9ucz8uZ2VuZXJhdGVUZXh0IH0pO1xuICAgIHRoaXMuYXBwbHlDb25lcyhyZXN1bHQpO1xuICAgIGlmIChvcHRpb25zPy5wZXJzaXN0ICE9PSBmYWxzZSkge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICog6riw7KG0IGNvbmXrk6TsnYQg7IiY7KeR7ZWp64uI64ukIChlbnRpdHksIHByb3BzLCBlbnVtcywgc3Vic2V0cykuXG4gICAqXG4gICAqIEByZXR1cm5zIO2CpOqwgCBcImVudGl0eTppZFwiLCBcInByb3A6bmFtZVwiLCBcImVudW06ZW51bUlkXCIsIFwic3Vic2V0OmtleVwiIO2YleyLneyduCBjb25lIOuntVxuICAgKi9cbiAgY29sbGVjdEV4aXN0aW5nQ29uZXMoKTogUmVjb3JkPHN0cmluZywgQ29uZT4ge1xuICAgIGNvbnN0IGNvbmVFbnRyaWVzOiBbc3RyaW5nLCBDb25lXVtdID0gW107XG5cbiAgICBpZiAodGhpcy5jb25lKSB7XG4gICAgICBjb25lRW50cmllcy5wdXNoKFtgZW50aXR5OiR7dGhpcy5pZH1gLCB0aGlzLmNvbmVdKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgdGhpcy5wcm9wcykge1xuICAgICAgaWYgKHByb3AuY29uZSkge1xuICAgICAgICBjb25lRW50cmllcy5wdXNoKFtgcHJvcDoke3Byb3AubmFtZX1gLCBwcm9wLmNvbmVdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtlbnVtSWQsIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZW51bUNvbmVzKSkge1xuICAgICAgY29uZUVudHJpZXMucHVzaChbYGVudW06JHtlbnVtSWR9YCwgY29uZV0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3N1YnNldEtleSwgY29uZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zdWJzZXRDb25lcykpIHtcbiAgICAgIGNvbmVFbnRyaWVzLnB1c2goW2BzdWJzZXQ6JHtzdWJzZXRLZXl9YCwgY29uZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoY29uZUVudHJpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyDneyEseuQnCBjb25l65Ok7J2EIEVudGl0eeyXkCDsoIHsmqntlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSByZXN1bHQgLSBMTE3snLzroZwg7IOd7ISx65CcIGNvbmUg6rKw6rO8XG4gICAqL1xuICBhcHBseUNvbmVzKHJlc3VsdDogaW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKS5Db25lR2VuZXJhdGlvblJlc3VsdCk6IHZvaWQge1xuICAgIGlmIChyZXN1bHQuZW50aXR5Q29uZSkge1xuICAgICAgdGhpcy5jb25lID0gcmVzdWx0LmVudGl0eUNvbmU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3VsdC5wcm9wQ29uZXMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gdGhpcy5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICAocHJvcCBhcyB7IGNvbmU/OiBDb25lIH0pLmNvbmUgPSBjb25lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZW51bUNvbmVzID0geyAuLi50aGlzLmVudW1Db25lcywgLi4ucmVzdWx0LmVudW1Db25lcyB9O1xuICAgIHRoaXMuc3Vic2V0Q29uZXMgPSB7IC4uLnRoaXMuc3Vic2V0Q29uZXMsIC4uLnJlc3VsdC5zdWJzZXRDb25lcyB9O1xuICB9XG5cbiAgZ2V0U3Vic2V0Um93cyhcbiAgICBfc3Vic2V0cz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSxcbiAgICBfc3Vic2V0c0ludGVybmFsPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9LFxuICAgIHByZWZpeGVzOiBzdHJpbmdbXSA9IFtdLFxuICApOiBFbnRpdHlTdWJzZXRSb3dbXSB7XG4gICAgaWYgKHByZWZpeGVzLmxlbmd0aCA+IDEwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2V0cyA9IF9zdWJzZXRzID8/IHRoaXMuc3Vic2V0cztcbiAgICBjb25zdCBzdWJzZXRzSW50ZXJuYWwgPSBfc3Vic2V0c0ludGVybmFsID8/IHRoaXMuc3Vic2V0c0ludGVybmFsO1xuICAgIGNvbnN0IHN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhzdWJzZXRzKTtcbiAgICBjb25zdCBhbGxGaWVsZHMgPSB1bmlxdWUoc3Vic2V0S2V5cy5mbGF0TWFwKChrZXkpID0+IHN1YnNldHNba2V5XSkpO1xuICAgIC8vIGludGVybmFsIO2VhOuTnOuPhCBhbGxGaWVsZHPsl5Ag7Y+s7ZWoIChyZWxhdGlvbiDtg5Dsg4nsmqkpXG4gICAgY29uc3QgYWxsSW50ZXJuYWxGaWVsZHMgPSB1bmlxdWUoc3Vic2V0S2V5cy5mbGF0TWFwKChrZXkpID0+IHN1YnNldHNJbnRlcm5hbFtrZXldID8/IFtdKSk7XG4gICAgY29uc3QgY29tYmluZWRGaWVsZHMgPSB1bmlxdWUoWy4uLmFsbEZpZWxkcywgLi4uYWxsSW50ZXJuYWxGaWVsZHNdKTtcblxuICAgIHJldHVybiB0aGlzLnByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiAmJlxuICAgICAgICBjb21iaW5lZEZpZWxkcy5maW5kKChmKSA9PiBmLnN0YXJ0c1dpdGgoYCR7Wy4uLnByZWZpeGVzLCBwcm9wLm5hbWVdLmpvaW4oXCIuXCIpfS5gKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHJlbEVudGl0eS5nZXRTdWJzZXRSb3dzKHN1YnNldHMsIHN1YnNldHNJbnRlcm5hbCwgW1xuICAgICAgICAgIC4uLnByZWZpeGVzLFxuICAgICAgICAgIGAke3Byb3AubmFtZX1gLFxuICAgICAgICBdKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpZWxkOiBwcm9wLm5hbWUsXG4gICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgcmVsYXRpb25FbnRpdHk6IHByb3Aud2l0aCxcbiAgICAgICAgICBwcmVmaXhlcyxcbiAgICAgICAgICBpc09wZW46IGNoaWxkcmVuLmxlbmd0aCA+IDAsXG4gICAgICAgICAgaGFzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBjaGlsZHJlbi5ldmVyeSgoY2hpbGQpID0+IGNoaWxkLmhhc1tzdWJzZXRLZXldKV07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICAgIGlzSW50ZXJuYWw6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGNoaWxkcmVuLmV2ZXJ5KChjaGlsZCkgPT4gY2hpbGQuaXNJbnRlcm5hbFtzdWJzZXRLZXldKV07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWVsZCA9IFsuLi5wcmVmaXhlcywgcHJvcC5uYW1lXS5qb2luKFwiLlwiKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpZWxkOiBwcm9wLm5hbWUsXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgcmVsYXRpb25FbnRpdHk6IHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiID8gcHJvcC53aXRoIDogdW5kZWZpbmVkLFxuICAgICAgICBwcmVmaXhlcyxcbiAgICAgICAgaGFzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3Vic2V0RmllbGRzID0gc3Vic2V0c1tzdWJzZXRLZXldO1xuICAgICAgICAgICAgY29uc3QgaGFzID0gc3Vic2V0RmllbGRzLnNvbWUoKGYpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGYgPT09IGZpZWxkIHx8IGYuc3RhcnRzV2l0aChgJHtmaWVsZH0uYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBoYXNdO1xuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgICBpc0ludGVybmFsOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxGaWVsZHMgPSBzdWJzZXRzSW50ZXJuYWxbc3Vic2V0S2V5XSA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW50ZXJuYWwgPSBpbnRlcm5hbEZpZWxkcy5zb21lKChmKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBmID09PSBmaWVsZCB8fCBmLnN0YXJ0c1dpdGgoYCR7ZmllbGR9LmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgaXNJbnRlcm5hbF07XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKFxuICAgIHN1YnNldFJvd3M6IEVudGl0eVN1YnNldFJvd1tdLFxuICAgIHN1YnNldEtleTogc3RyaW5nLFxuICAgIGludGVybmFsOiBib29sZWFuID0gZmFsc2UsXG4gICk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBoYXNLZXkgPSBpbnRlcm5hbCA/IFwiaXNJbnRlcm5hbFwiIDogXCJoYXNcIjtcbiAgICByZXR1cm4gc3Vic2V0Um93c1xuICAgICAgLm1hcCgoc3Vic2V0Um93KSA9PiB7XG4gICAgICAgIGlmIChzdWJzZXRSb3cuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN1YnNldFJvd3NUb1N1YnNldEZpZWxkcyhzdWJzZXRSb3cuY2hpbGRyZW4sIHN1YnNldEtleSwgaW50ZXJuYWwpO1xuICAgICAgICB9IGVsc2UgaWYgKHN1YnNldFJvd1toYXNLZXldW3N1YnNldEtleV0pIHtcbiAgICAgICAgICByZXR1cm4gc3Vic2V0Um93LnByZWZpeGVzLmNvbmNhdChzdWJzZXRSb3cuZmllbGQpLmpvaW4oXCIuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSlcbiAgICAgIC5mbGF0KCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9wKHByb3A6IEVudGl0eVByb3AsIGF0PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFhdCkge1xuICAgICAgdGhpcy5wcm9wcy5wdXNoKHByb3ApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BzLnNwbGljZShhdCwgMCwgcHJvcCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgYW5hbHl6ZVN1YnNldEZpZWxkKHN1YnNldEZpZWxkOiBzdHJpbmcpOiB7XG4gICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICBwcm9wTmFtZTogc3RyaW5nO1xuICB9W10ge1xuICAgIGNvbnN0IGFyciA9IHN1YnNldEZpZWxkLnNwbGl0KFwiLlwiKTtcblxuICAgIGxldCBlbnRpdHlJZCA9IHRoaXMuaWQ7XG4gICAgY29uc3QgcmVzdWx0OiB7XG4gICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgcHJvcE5hbWU6IHN0cmluZztcbiAgICB9W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcHJvcE5hbWUgPSBhcnJbaV07XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIGVudGl0eUlkLFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwcm9wID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgaWYgKCFwcm9wKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbnRpdHlJZH3snZgg7J6Y66q765CcIOyEnOu4jOyFi+2CpCAke3N1YnNldEZpZWxkfWApO1xuICAgICAgfVxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGVudGl0eUlkID0gcHJvcC53aXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYXN5bmMgbW9kaWZ5UHJvcChuZXdQcm9wOiBFbnRpdHlQcm9wLCBhdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7J207KCEIO2UhOuhrSDsnbTrpoQg7KCA7J6lXG4gICAgY29uc3Qgb2xkTmFtZSA9IHRoaXMucHJvcHNbYXRdLm5hbWU7XG5cbiAgICAvLyDsoIDsnqXtlaAg7JeU7Yuw7YuwXG4gICAgY29uc3QgZW50aXRpZXM6IEVudGl0eVtdID0gW3RoaXNdO1xuXG4gICAgLy8g7J2066aE7J20IOuwlOuAkCDqsr3smrBcbiAgICBpZiAob2xkTmFtZSAhPT0gbmV3UHJvcC5uYW1lKSB7XG4gICAgICAvLyDsoITssrQg7JeU7Yuw7Yuw7JeQ7IScIO2YhOyerCDsiJjsoJXrkJwg7ZSE66Gt7J2EIOywuOyhsO2VmOqzoCDsnojripQg66qo65OgIOyEnOu4jOyFi+2VhOuTnCDssL7slYTshJwg7IiY7KCVXG4gICAgICBjb25zdCBhbGxFbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgZm9yIChjb25zdCByZWxFbnRpdHlJZCBvZiBhbGxFbnRpdHlJZHMpIHtcbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsRW50aXR5SWQpO1xuICAgICAgICBjb25zdCByZWxFbnRpdHlTdWJzZXRLZXlzID0gT2JqZWN0LmtleXMocmVsRW50aXR5LnN1YnNldHMpO1xuICAgICAgICBmb3IgKGNvbnN0IHN1YnNldEtleSBvZiByZWxFbnRpdHlTdWJzZXRLZXlzKSB7XG4gICAgICAgICAgY29uc3Qgc3Vic2V0ID0gcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcblxuICAgICAgICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zrpbwg7Iic7ZqM7ZWY66mwLCDsl5Tti7Dti7At7ZSE66GtIOuLqOychOuhnCDrtoTshJ3tlZwg7ZuEIO2YhOyerCDsl5Tti7Dti7At7ZSE66Gt6rO8IOydvOy5mO2VmOuKlCDqsr3smrAg7IiY7KCVIOyymOumrFxuICAgICAgICAgIGNvbnN0IG1vZGlmaWVkU3Vic2V0RmllbGRzID0gc3Vic2V0Lm1hcCgoc3Vic2V0RmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFuYWx5emVkID0gcmVsRW50aXR5LmFuYWx5emVTdWJzZXRGaWVsZChzdWJzZXRGaWVsZCk7XG4gICAgICAgICAgICBjb25zdCBtb2RpZmllZCA9IGFuYWx5emVkLm1hcCgoYSkgPT5cbiAgICAgICAgICAgICAgYS5wcm9wTmFtZSA9PT0gb2xkTmFtZSAmJiBhLmVudGl0eUlkID09PSB0aGlzLmlkXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmEsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBuZXdQcm9wLm5hbWUsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBhLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIOu2hOyEne2VnCDtlYTrk5zrpbwg64uk7IucIOyEnOu4jOyFiyDtlYTrk5zroZwg67O16rWsXG4gICAgICAgICAgICByZXR1cm4gbW9kaWZpZWQubWFwKChhKSA9PiBhLnByb3BOYW1lKS5qb2luKFwiLlwiKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChzdWJzZXQuam9pbihcIixcIikgIT09IG1vZGlmaWVkU3Vic2V0RmllbGRzLmpvaW4oXCIsXCIpKSB7XG4gICAgICAgICAgICByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldID0gbW9kaWZpZWRTdWJzZXRGaWVsZHM7XG4gICAgICAgICAgICBlbnRpdGllcy5wdXNoKHJlbEVudGl0eSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7ZSE66GtIOyImOyglVxuICAgIHRoaXMucHJvcHNbYXRdID0gbmV3UHJvcDtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGVudGl0aWVzLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2F2ZSgpKSk7XG4gIH1cblxuICBhc3luYyBkZWxQcm9wKGF0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDsnbTsoIQg7ZSE66GtIOydtOumhCDsoIDsnqVcbiAgICBjb25zdCBvbGROYW1lID0gdGhpcy5wcm9wc1thdF0ubmFtZTtcblxuICAgIC8vIOyggOyepe2VoCDsl5Tti7Dti7BcbiAgICBjb25zdCBlbnRpdGllczogRW50aXR5W10gPSBbdGhpc107XG5cbiAgICAvLyDsoITssrQg7JeU7Yuw7Yuw7JeQ7IScIO2YhOyerCDsgq3soJzrkJwg7ZSE66Gt7J2EIOywuOyhsO2VmOqzoCDsnojripQg66qo65OgIOyEnOu4jOyFi+2VhOuTnCDssL7slYTshJwg7KCc7Jm4XG4gICAgY29uc3QgYWxsRW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICBmb3IgKGNvbnN0IHJlbEVudGl0eUlkIG9mIGFsbEVudGl0eUlkcykge1xuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsRW50aXR5SWQpO1xuICAgICAgY29uc3QgcmVsRW50aXR5U3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKHJlbEVudGl0eS5zdWJzZXRzKTtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIHJlbEVudGl0eVN1YnNldEtleXMpIHtcbiAgICAgICAgY29uc3Qgc3Vic2V0ID0gcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcbiAgICAgICAgLy8g7ISc67iM7IWLIO2VhOuTnOulvCDsiJztmoztlZjrqbAsIOyXlO2LsO2LsC3tlITroa0g64uo7JyE66GcIOu2hOyEne2VnCDtm4Qg7ZiE7J6sIOyXlO2LsO2LsC3tlITroa3qs7wg7J287LmY7ZWY64qUIOqyveyasCDsnbTtm4TsnZgg7ZWE65Oc66W8IOygnOyZuFxuICAgICAgICBjb25zdCBtb2RpZmllZFN1YnNldEZpZWxkcyA9IHN1YnNldFxuICAgICAgICAgIC5tYXAoKHN1YnNldEZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbmFseXplZCA9IHJlbEVudGl0eS5hbmFseXplU3Vic2V0RmllbGQoc3Vic2V0RmllbGQpO1xuICAgICAgICAgICAgaWYgKGFuYWx5emVkLmZpbmQoKGEpID0+IGEucHJvcE5hbWUgPT09IG9sZE5hbWUgJiYgYS5lbnRpdHlJZCA9PT0gdGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gc3Vic2V0RmllbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKTtcblxuICAgICAgICBpZiAoc3Vic2V0LmpvaW4oXCIsXCIpICE9PSBtb2RpZmllZFN1YnNldEZpZWxkcy5qb2luKFwiLFwiKSkge1xuICAgICAgICAgIHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV0gPSBtb2RpZmllZFN1YnNldEZpZWxkcztcbiAgICAgICAgICBlbnRpdGllcy5wdXNoKHJlbEVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtmITsnqwg7JeU7Yuw7Yuw7J2YIOyduOuNseyKpOyXkOyEnCDsoJzsmbhcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIEVudGl0eU1hbmFnZXIuZ2V0KHRoaXMuaWQpLmluZGV4ZXMpIHtcbiAgICAgIGluZGV4LmNvbHVtbnMgPSBpbmRleC5jb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjb2wubmFtZSAhPT0gb2xkTmFtZSk7XG4gICAgfVxuXG4gICAgLy8g7ZSE66GtIOyCreygnFxuICAgIHRoaXMucHJvcHMuc3BsaWNlKGF0LCAxKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGVudGl0aWVzLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2F2ZSgpKSk7XG4gIH1cblxuICBnZXRFbnRpdHlJZEZyb21TdWJzZXRGaWVsZChzdWJzZXRGaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXN1YnNldEZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgfVxuXG4gICAgLy8g7ISc67iM7IWLIO2VhOuTnOydmCDrp4jsp4Drp4nsnYAg7ZSE66Gt7J2066+A66GcIOygnOyZuFxuICAgIGNvbnN0IGFyciA9IHN1YnNldEZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgwLCAtMSk7XG5cbiAgICAvLyDshJzruIzshYsg7ZWE65Oc66W8IOuCtOugpOqwgOuptOyEnCDrp4jsp4Drp4nsnLzroZwgcmVsYXRpb27rkJwg7JeU7Yuw7Yuw66W8IOywvuydjFxuICAgIGNvbnN0IGxhc3RFbnRpdHlJZCA9IGFyci5yZWR1Y2UoKGVudGl0eUlkLCBmaWVsZCkgPT4ge1xuICAgICAgY29uc3QgcmVsUHJvcCA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGZpZWxkKTtcbiAgICAgIGlmICghcmVsUHJvcCB8fCByZWxQcm9wLnR5cGUgIT09IFwicmVsYXRpb25cIikge1xuICAgICAgICBjb25zb2xlLmRlYnVnKHsgYXJyLCB0aGlzSWQ6IHRoaXMuaWQsIGVudGl0eUlkLCBmaWVsZCB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnpjrqrvrkJwg7ISc67iM7IWL7YKkICR7c3Vic2V0RmllbGR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVsUHJvcC53aXRoO1xuICAgIH0sIHRoaXMuaWQpO1xuICAgIHJldHVybiBsYXN0RW50aXR5SWQ7XG4gIH1cblxuICBhc3luYyBtb3ZlUHJvcChhdDogbnVtYmVyLCB0bzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHNbYXRdO1xuICAgIGNvbnN0IG5ld1Byb3BzID0gWy4uLnRoaXMucHJvcHNdO1xuICAgIG5ld1Byb3BzLnNwbGljZSh0bywgMCwgcHJvcCk7XG4gICAgbmV3UHJvcHMuc3BsaWNlKGF0IDwgdG8gPyBhdCA6IGF0ICsgMSwgMSk7XG4gICAgdGhpcy5wcm9wcyA9IG5ld1Byb3BzO1xuXG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gIH1cblxuICAvKipcbiAgICog7ZWE65Oc66qF7J2EIFwi7YWM7J2067iU66qFLu2VhOuTnOuqhVwiIO2YleyLneycvOuhnCDrs4DtmZhcbiAgICovXG4gIGdldEZ1bGxGaWVsZE5hbWUoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy50YWJsZX0uJHtmaWVsZH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXlO2LsO2LsOydmCBQSyDtg4DsnoXsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBpZCDtlYTrk5zsnZgg7YOA7J6F7J2EIOq4sOykgOycvOuhnCBcImludGVnZXJcIiB8IFwic3RyaW5nXCIgfCBcInV1aWRcIuulvCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBnZXRQa1R5cGUoKTogXCJpbnRlZ2VyXCIgfCBcInN0cmluZ1wiIHwgXCJ1dWlkXCIge1xuICAgIGNvbnN0IGlkUHJvcCA9IHRoaXMucHJvcHNEaWN0LmlkO1xuICAgIGlmICghaWRQcm9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudGl0eSAke3RoaXMuaWR97JeQIGlkIO2VhOuTnOqwgCDsl4bsirXri4jri6RgKTtcbiAgICB9XG4gICAgaWYgKGlkUHJvcC50eXBlID09PSBcInN0cmluZ1wiIHx8IGlkUHJvcC50eXBlID09PSBcInV1aWRcIikge1xuICAgICAgcmV0dXJuIGlkUHJvcC50eXBlO1xuICAgIH1cbiAgICByZXR1cm4gXCJpbnRlZ2VyXCI7XG4gIH1cblxuICAvKipcbiAgICog7JeU7Yuw7Yuw7J2YIFBLIHByb3DsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBsZW5ndGgg65OxIOyEuOu2gCDsoJXrs7Tsl5Ag7KCR6re87ZWgIOuVjCDsgqzsmqntlanri4jri6QuXG4gICAqL1xuICBnZXRQa1Byb3AoKTogRW50aXR5UHJvcCB7XG4gICAgY29uc3QgaWRQcm9wID0gdGhpcy5wcm9wc0RpY3QuaWQ7XG4gICAgaWYgKCFpZFByb3ApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5ICR7dGhpcy5pZH3sl5AgaWQg7ZWE65Oc6rCAIOyXhuyKteuLiOuLpGApO1xuICAgIH1cbiAgICByZXR1cm4gaWRQcm9wO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXlO2LsO2LsOydmCBQSyDrsLDsl7Qg7YOA7J6F7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICogTG9hZGVyUXVlcnnsnZggZnJvbUlkcyDtg4DsnoXsnLzroZwg7IKs7Jqp65Cp64uI64ukLlxuICAgKi9cbiAgZ2V0UGtBcnJheVR5cGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwa1R5cGUgPSB0aGlzLmdldFBrVHlwZSgpO1xuICAgIHJldHVybiBwa1R5cGUgPT09IFwiaW50ZWdlclwiID8gXCJudW1iZXJbXVwiIDogXCJzdHJpbmdbXVwiO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FRc0MsWUFBQTtDQUNTLHFCQUFBO0NBY3hCLFdBQUE7Q0FhMkIsZUFBQTtDQUNSLGNBQUE7Q0FDTyxnQkFBQTtDQUNLLG1CQUFBO0NBQ0ssV0FBQTtDQUdYLG9CQUFBO0NBRW5DLFNBQWIsTUFBb0I7RUFDbEI7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFLQTtFQUNBO0VBR0E7RUFHQTtFQUNBO0VBR0E7RUFHQSxRQUVJLENBQUM7RUFDTCxRQUVJLENBQUM7RUFDTCxhQUlJLENBQUM7RUFDTCxZQUVJLENBQUM7RUFDTCxjQUVJLENBQUM7RUFFTCxZQUFZLEVBQ1YsSUFDQSxVQUNBLE9BQ0EsT0FDQSxRQUNBLE1BQ0EsT0FDQSxTQUNBLFNBQ0EsU0FDYTtHQUViLEtBQUssS0FBSztHQUNWLEtBQUssV0FBVztHQUNoQixLQUFLLFFBQVEsU0FBUyxLQUFLO0dBQzNCLEtBQUssUUFBUSxTQUFTLFdBQVcsV0FBVyxXQUFXLFVBQVUsRUFBRSxDQUFDO0dBQ3BFLEtBQUssU0FBUztHQUNkLEtBQUssT0FBTztHQUdaLElBQUksT0FBTztJQUNULEtBQUssUUFBUSxNQUFNLEtBQUssU0FBUztLQUMvQixJQUFJLFdBQVcsSUFBSSxHQUNqQjtVQUFJLEtBQUssR0FBRyxT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
824
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnRpdHkvZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgZm9ybWF0Q29kZSB9IGZyb20gXCIuLi9jb2RlLWZvcm1hdHRpbmdcIjtcbmltcG9ydCB7XG4gIGdldEVudW1EZWZWYWx1ZXMsXG4gIGdldFN1YnNldEZpZWxkcyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzRW51bVByb3AsXG4gIGlzSGFzTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNJbnRlZ2VyU2luZ2xlUHJvcCxcbiAgaXNJbnRlcm5hbFN1YnNldEZpZWxkLFxuICBpc01hbnlUb01hbnlSZWxhdGlvblByb3AsXG4gIGlzTnVtYmVyU2luZ2xlUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzVmlydHVhbENvZGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBub3JtYWxpemVTdWJzZXRGaWVsZCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbmUsXG4gIHR5cGUgRW50aXR5Q3VzdG9tLFxuICB0eXBlIEVudGl0eUluZGV4LFxuICB0eXBlIEVudGl0eUpzb24sXG4gIHR5cGUgRW50aXR5UHJvcCxcbiAgdHlwZSBFbnRpdHlQcm9wTm9kZSxcbiAgdHlwZSBFbnRpdHlTdWJzZXRSb3csXG4gIHR5cGUgUmVsYXRpb25Qcm9wLFxuICB0eXBlIFN1YnNldEZpZWxkLFxuICB0eXBlIFN1YnNldFF1ZXJ5LFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGltcG9ydE1lbWJlcnMgfSBmcm9tIFwiLi4vdXRpbHMvZXNtLXV0aWxzXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgYXNzZXJ0RGVmaW5lZCwgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxudHlwZSBOZXN0ZWRTZWxlY3QgPSB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IE5lc3RlZFNlbGVjdCB9O1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuL2VudGl0eS1tYW5hZ2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBFbnRpdHkge1xuICBpZDogc3RyaW5nO1xuICBwYXJlbnRJZD86IHN0cmluZztcbiAgdGFibGU6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgY3VzdG9tPzogRW50aXR5Q3VzdG9tO1xuICBjb25lPzogQ29uZTtcbiAgbmFtZXM6IHtcbiAgICBwYXJlbnRGczogc3RyaW5nO1xuICAgIGZzOiBzdHJpbmc7XG4gICAgbW9kdWxlOiBzdHJpbmc7XG4gIH07XG4gIHByb3BzOiBFbnRpdHlQcm9wW107XG4gIHByb3BzRGljdDoge1xuICAgIFtrZXk6IHN0cmluZ106IEVudGl0eVByb3A7XG4gIH07XG4gIHJlbGF0aW9uczoge1xuICAgIFtrZXk6IHN0cmluZ106IFJlbGF0aW9uUHJvcDtcbiAgfTtcbiAgaW5kZXhlczogRW50aXR5SW5kZXhbXTtcbiAgc3Vic2V0czoge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZ1tdO1xuICB9O1xuICBzdWJzZXRzSW50ZXJuYWw6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbiAgdHlwZXM6IHtcbiAgICBbbmFtZTogc3RyaW5nXTogei5ab2RUeXBlQW55O1xuICB9ID0ge307XG4gIGVudW1zOiB7XG4gICAgW2VudW1JZDogc3RyaW5nXTogei5ab2RFbnVtPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+PjtcbiAgfSA9IHt9O1xuICBlbnVtTGFiZWxzOiB7XG4gICAgW2VudW1JZDogc3RyaW5nXToge1xuICAgICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICAgIH07XG4gIH0gPSB7fTtcbiAgZW51bUNvbmVzOiB7XG4gICAgW2VudW1JZDogc3RyaW5nXTogQ29uZTtcbiAgfSA9IHt9O1xuICBzdWJzZXRDb25lczoge1xuICAgIFtzdWJzZXRLZXk6IHN0cmluZ106IENvbmU7XG4gIH0gPSB7fTtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgaWQsXG4gICAgcGFyZW50SWQsXG4gICAgdGFibGUsXG4gICAgdGl0bGUsXG4gICAgY3VzdG9tLFxuICAgIGNvbmUsXG4gICAgcHJvcHMsXG4gICAgaW5kZXhlcyxcbiAgICBzdWJzZXRzLFxuICAgIGVudW1zLFxuICB9OiBFbnRpdHlKc29uKSB7XG4gICAgLy8gaWRcbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgdGhpcy5wYXJlbnRJZCA9IHBhcmVudElkO1xuICAgIHRoaXMudGl0bGUgPSB0aXRsZSA/PyB0aGlzLmlkO1xuICAgIHRoaXMudGFibGUgPSB0YWJsZSA/PyBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoaW5mbGVjdGlvbi5wbHVyYWxpemUoaWQpKTtcbiAgICB0aGlzLmN1c3RvbSA9IGN1c3RvbTtcbiAgICB0aGlzLmNvbmUgPSBjb25lO1xuXG4gICAgLy8gcHJvcHNcbiAgICBpZiAocHJvcHMpIHtcbiAgICAgIHRoaXMucHJvcHMgPSBwcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgaWYgKGlzRW51bVByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAocHJvcC5pZC5pbmNsdWRlcyhcIiRNb2RlbFwiKSkge1xuICAgICAgICAgICAgcHJvcC5pZCA9IHByb3AuaWQucmVwbGFjZShcIiRNb2RlbFwiLCBpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnByb3BzRGljdCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgcHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFtwcm9wLm5hbWUsIHByb3BdO1xuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIC8vIHJlbGF0aW9uc1xuICAgICAgdGhpcy5yZWxhdGlvbnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIHByb3BzLmZpbHRlcigocHJvcCkgPT4gaXNSZWxhdGlvblByb3AocHJvcCkpLm1hcCgocHJvcCkgPT4gW3Byb3AubmFtZSwgcHJvcF0pLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9wcyA9IFtdO1xuICAgICAgdGhpcy5wcm9wc0RpY3QgPSB7fTtcbiAgICAgIHRoaXMucmVsYXRpb25zID0ge307XG4gICAgfVxuXG4gICAgLy8gaW5kZXhlc1xuICAgIHRoaXMuaW5kZXhlcyA9IGluZGV4ZXMgPz8gW107XG5cbiAgICAvLyBzdWJzZXRzOiBTdWJzZXREZWbsl5DshJwgU3Vic2V0RmllbGRbXeulvCDstpTstpztlZjsl6wgc3Vic2V0cyjsnbzrsJgp7JmAIHN1YnNldHNJbnRlcm5hbChpbnRlcm5hbCnroZwg67aE66asXG4gICAgdGhpcy5zdWJzZXRzID0ge307XG4gICAgdGhpcy5zdWJzZXRzSW50ZXJuYWwgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHN1YnNldERlZl0gb2YgT2JqZWN0LmVudHJpZXMoc3Vic2V0cyA/PyB7fSkpIHtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IGdldFN1YnNldEZpZWxkcyhzdWJzZXREZWYpO1xuICAgICAgdGhpcy5zdWJzZXRzW2tleV0gPSBmaWVsZHMuZmlsdGVyKChmKSA9PiAhaXNJbnRlcm5hbFN1YnNldEZpZWxkKGYpKS5tYXAobm9ybWFsaXplU3Vic2V0RmllbGQpO1xuICAgICAgdGhpcy5zdWJzZXRzSW50ZXJuYWxba2V5XSA9IGZpZWxkcy5maWx0ZXIoaXNJbnRlcm5hbFN1YnNldEZpZWxkKS5tYXAobm9ybWFsaXplU3Vic2V0RmllbGQpO1xuXG4gICAgICAvLyBjb25lIOy2lOy2nFxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHN1YnNldERlZikgJiYgXCJjb25lXCIgaW4gc3Vic2V0RGVmICYmIHN1YnNldERlZi5jb25lKSB7XG4gICAgICAgIHRoaXMuc3Vic2V0Q29uZXNba2V5XSA9IHN1YnNldERlZi5jb25lO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVudW1zOiBFbnVtRGVm7JeQ7IScIHZhbHVlc+yZgCBjb25l66W8IOy2lOy2nO2VmOyXrCDsspjrpqxcbiAgICB0aGlzLmVudW1MYWJlbHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhlbnVtcyA/PyB7fSkubWFwKChba2V5LCBlbnVtRGVmXSkgPT4ge1xuICAgICAgICAvLyBjb25lIOy2lOy2nFxuICAgICAgICBpZiAoXCJ2YWx1ZXNcIiBpbiBlbnVtRGVmICYmIFwiY29uZVwiIGluIGVudW1EZWYgJiYgZW51bURlZi5jb25lKSB7XG4gICAgICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICAgICAgdGhpcy5lbnVtQ29uZXNba2V5XSA9IGVudW1EZWYuY29uZSBhcyBDb25lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBba2V5LCBnZXRFbnVtRGVmVmFsdWVzKGVudW1EZWYpXTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5lbnVtcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuZW51bUxhYmVscykubWFwKChba2V5LCBlbnVtTGFiZWxdKSA9PiB7XG4gICAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICByZXR1cm4gW2tleSwgei5lbnVtKE9iamVjdC5rZXlzKGVudW1MYWJlbCkpXTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBuYW1lc1xuICAgIHRoaXMubmFtZXMgPSB7XG4gICAgICBwYXJlbnRGczogaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKHBhcmVudElkID8/IGlkKSkudG9Mb3dlckNhc2UoKSxcbiAgICAgIGZzOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoaWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgbW9kdWxlOiBpZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOy/vOumrOyaqSDshJzruIzshYsg7ZWE65Oc66W8IOuwmO2ZmO2VqeuLiOuLpCAoc3Vic2V0cyArIHN1YnNldHNJbnRlcm5hbCDtlansuagpXG4gICAqL1xuICBnZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLih0aGlzLnN1YnNldHNbc3Vic2V0S2V5XSA/PyBbXSksIC4uLih0aGlzLnN1YnNldHNJbnRlcm5hbFtzdWJzZXRLZXldID8/IFtdKV07XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOydtOumhChzdWJzZXRLZXkp7J2YIHN1YnNldOydhCDsi6TsoJzroZwg6rCA7KC47Jik64qUIFB1cmkg7L2U65OcIOq1rO2YhOyytCBzdHJpbmfsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0UHVyaVN1YnNldFF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLmdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleSk7XG4gICAgY29uc3Qgc3Vic2V0UXVlcnkgPSB0aGlzLnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCBzdWJzZXQpO1xuXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBmcm9tXG4gICAgbGluZXMucHVzaChgcmV0dXJuIHFiV3JhcHBlcmApO1xuICAgIGxpbmVzLnB1c2goYC5mcm9tKFwiJHt0aGlzLnRhYmxlfVwiKWApO1xuXG4gICAgLy8gam9pblxuICAgIGZvciAoY29uc3Qgam9pbiBvZiBzdWJzZXRRdWVyeS5qb2lucykge1xuICAgICAgLy8gam9pbiDrqZTshJzrk5wg6rKw7KCVOiBpbm5lciDihpIgam9pbiwgb3V0ZXIg4oaSIGxlZnRKb2luXG4gICAgICAvLyBGSyBudWxsYWJsZSDsl6zrtoDripQgbGVmdEpvaW4g7YOA7J6FIOyLnOq3uOuLiOyymOyXkOyEnCDsnpDrj5nsnLzroZwg7YyQ64uo65CoXG4gICAgICBjb25zdCBqb2luTWV0aG9kID0gam9pbi5qb2luID09PSBcImlubmVyXCIgPyBcImpvaW5cIiA6IFwibGVmdEpvaW5cIjtcblxuICAgICAgaWYgKFwiY3VzdG9tXCIgaW4gam9pbikge1xuICAgICAgICAvLyBjdXN0b20gam9pbiBjbGF1c2XripQgcmF3IOyCrOyaqVxuICAgICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIHFiV3JhcHBlci5rbmV4LnJhdyhcXGAke2pvaW4uY3VzdG9tfVxcYCkpYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmVzLnB1c2goYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgXCIke2pvaW4uZnJvbX1cIiwgXCIke2pvaW4udG99XCIpYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2VsZWN0IC0g7J6F7LK07KCBIOq1rOyhsOuhnCDsg53shLFcbiAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KHN1YnNldFF1ZXJ5LnNlbGVjdCk7XG4gICAgbGluZXMucHVzaChgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqICouZW50aXR5Lmpzb27snZggc3Vic2V07JeQIOuTpOyWtOyeiOuKlCDtlYTrk5wg67Cw7Je07J2EIOuwm+yVhOyEnCxcbiAgICogUHVyaeydmCBTZWxlY3RPYmplY3Qg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICog7JiIOiBbXCJ1c2Vycy5pZFwiLCBcInBhcmVudC5pZFwiLCBcInBhcmVudC5uYW1lXCJdXG4gICAqICAg4oaSIHsgaWQ6IFwidXNlcnMuaWRcIiwgcGFyZW50OiB7IGlkOiBcInBhcmVudC5pZFwiLCBuYW1lOiBcInBhcmVudC5uYW1lXCIgfSB9XG4gICAqXG4gICAqIOyWuOuNlOuwlOqwgCDslYTri4wg7KSR7LKpIOqwneyytOuhnCDrs4DtmZjtlajsl5Ag7Jyg7J2Y7ZWY7IS47JqULlxuICAgKiDsnbTroIfqsowg7KSR7LKpIOqwneyytOuhnCDrs4DtmZjtlZjsl6wgc2VsZWN07JeQIOuEmOqyqOyjvOuptCBQYXJzZVNlbGVjdE9iamVjdCDtg4DsnoXsnbQgam9pbuuQnCDqsJ3ssrTsnZgg7YOA7J6F7J2EIOyemCDsnqHslYTspIQg7IiYIOyeiOyKteuLiOuLpC5cbiAgICog7KaJLCBlbmhhbmNlcuyXkOyEnCByb3frpbwg67Cb7JWY7J2EIOuVjCBoeWRyYXRl65CcIOqwneyytCDsnpDssrTsnZggbnVsbGl0eeyZgCDqt7gg7JWI7Kq9IO2VhOuTnOydmCBudWxsaXR56rCAIGZrIG51bGxhYmxlIOyXrOu2gOyXkCDrlLDrnbwg7J6YIOy2lOuhoOuQqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGROZXN0ZWRTZWxlY3RPYmplY3Qoc2VsZWN0SXRlbXM6IHN0cmluZ1tdKTogTmVzdGVkU2VsZWN0IHtcbiAgICBjb25zdCByZXN1bHQ6IE5lc3RlZFNlbGVjdCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBzZWxlY3RJdGVtIG9mIHNlbGVjdEl0ZW1zKSB7XG4gICAgICAvLyBcInVzZXJzLmlkXCIg65iQ64qUIFwidXNlcnMuaWQgYXMgdXNlcl9faWRcIiDtmJXtg5wg7YyM7IuxXG4gICAgICBjb25zdCBtYXRjaCA9IHNlbGVjdEl0ZW0ubWF0Y2goL14oLis/KSg/OiBhcyAoLispKT8kLyk7XG4gICAgICBpZiAoIW1hdGNoKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgWywgY29sdW1uLCBhbGlhc10gPSBtYXRjaDtcbiAgICAgIGNvbnN0IGNvbHVtblZhbHVlID0gYFwiJHtjb2x1bW4udHJpbSgpfVwiYDtcblxuICAgICAgaWYgKCFhbGlhcyB8fCAhYWxpYXMuaW5jbHVkZXMoXCJfX1wiKSkge1xuICAgICAgICAvLyBhbGlhc+qwgCDsl4bqsbDrgpggX1/rpbwg7Y+s7ZWo7ZWY7KeAIOyViuycvOuptCDstZzsg4HsnIQg7ZWE65OcXG4gICAgICAgIGNvbnN0IGtleSA9IGFsaWFzID8/IGFzc2VydERlZmluZWQoY29sdW1uLnNwbGl0KFwiLlwiKS5wb3AoKSk7XG4gICAgICAgIHJlc3VsdFtrZXldID0gY29sdW1uVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhbGlhc+qwgCBfX+ulvCDtj6ztlajtlZjrqbQg7J6F7LK0IOq1rOyhsOuhnCDqt7jro7ntmZRcbiAgICAgICAgY29uc3QgcGFydHMgPSBhbGlhcy5zcGxpdChcIl9fXCIpO1xuICAgICAgICBsZXQgY3VycmVudCA9IHJlc3VsdDtcblxuICAgICAgICAvLyDrp4jsp4Drp4kg7YyM7Yq4IOyghOq5jOyngCDspJHssqkg6rCd7LK0IOyDneyEsVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgICAgICBpZiAocGFydCBpbiBjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAoaXNTdHJpbmdWYWx1ZShjdXJyZW50W3BhcnRdKSkge1xuICAgICAgICAgICAgICAvLyDsnoXroKXsnbQgW1widXNlclwiLCBcInVzZXJfX2lkXCJdIOqwmeydgCDqsr3smrAhXG4gICAgICAgICAgICAgIC8vIOyVoOy0iOyXkCDrp5Drj4Qg7JWIIOuQmOyngOunjCDslYjsoITtlZjqsowg7JiI7Jm466W8IOuNmOynkeuLiOuLpC5cbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBDb25mbGljdCBkZXRlY3RlZCBpbiBzZWxlY3QgaXRlbXM6IHBhcmVudCBwYXRoIFwiJHtwYXJ0cy5zbGljZSgwLCBpICsgMSkuam9pbihcIl9fXCIpfVwiIGlzIGFscmVhZHkgc2V0IGFzIGEgZmllbGQsIGNhbm5vdCBuZXN0IFwiJHthbGlhc31cIiB1bmRlciBpdC5gLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXJyZW50W3BhcnRdID0ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnRdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g66eI7KeA66eJIO2MjO2KuOyXkCDqsJIg7ISk7KCVXG4gICAgICAgIGNvbnN0IGxhc3RQYXJ0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG4gICAgICAgIGN1cnJlbnRbbGFzdFBhcnRdID0gY29sdW1uVmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhyZXN1bHQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OLnN0cmluZ2lmeeyZgCDsnKDsgqztlZwg7J287J2EIO2VqeuLiOuLpC5cbiAgICog64uk66eMIOyjvOyWtOynhCDqsJ3ssrTrpbwgSlNPTuydtCDslYTri4wgVHlwZVNjcmlwdCDqsJ3ssrQg66as7YSw65+0IOyKpO2KuOungeycvOuhnCDrp4zrk6TslrTspI3ri4jri6QuXG4gICAqIGtleeyXkCDrlLDsmLTtkZzqsIAg7JeG7Ja07JqULlxuICAgKiDstpzroKUg7JiI7IucOlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHtcbiAgICogICBpZDogXCJ1c2Vycy5pZFwiLFxuICAgKiAgIHBhcmVudDoge1xuICAgKiAgICAgaWQ6IFwicGFyZW50LmlkXCIsXG4gICAqICAgICBuYW1lOiBcInBhcmVudC5uYW1lXCIsXG4gICAqICAgfSxcbiAgICogfVxuICAgKiBgYGBcbiAgICogQHBhcmFtIG9iaiDrs4DtmZjtlaAg6rCd7LK0XG4gICAqIEBwYXJhbSBpbmRlbnQg65Ok7Jes7JOw6riwIOugiOuyqFxuICAgKiBAcGFyYW0gd2l0aEJyYWNlcyB0cnVl66m0IOykkeq0hO2YuCDtj6ztlagsIGZhbHNl66m0IOuCtOyaqeunjCDrsJjtmZhcbiAgICovXG4gIHByaXZhdGUgc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KFxuICAgIG9iajogTmVzdGVkU2VsZWN0LFxuICAgIGluZGVudDogbnVtYmVyID0gMCxcbiAgICB3aXRoQnJhY2VzOiBib29sZWFuID0gdHJ1ZSxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBzcGFjZXMgPSBcIiAgXCIucmVwZWF0KGluZGVudCk7XG4gICAgY29uc3QgaW5uZXJTcGFjZXMgPSBcIiAgXCIucmVwZWF0KGluZGVudCArIDEpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKG9iaik7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gd2l0aEJyYWNlcyA/IFwie31cIiA6IFwiXCI7XG5cbiAgICBjb25zdCBsaW5lcyA9IGVudHJpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHZhbHVlKSkge1xuICAgICAgICAvLyDsu6zrn7wg6rK966GcICjsnbTrr7gg65Sw7Ji07ZGcIO2PrO2VqClcbiAgICAgICAgcmV0dXJuIGAke2lubmVyU3BhY2VzfSR7a2V5fTogJHt2YWx1ZX0sYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOykkeyyqSDqsJ3ssrQgKO2VreyDgSDspJHqtITtmLgg7Y+s7ZWoKVxuICAgICAgICByZXR1cm4gYCR7aW5uZXJTcGFjZXN9JHtrZXl9OiAke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHZhbHVlLCBpbmRlbnQgKyAxLCB0cnVlKX0sYDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh3aXRoQnJhY2VzKSB7XG4gICAgICByZXR1cm4gYHtcXG4ke2xpbmVzLmpvaW4oXCJcXG5cIil9XFxuJHtzcGFjZXN9fWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOykkeq0hO2YuCDsl4bsnbQg64K07Jqp66eMIOuwmO2ZmCAo7JWe65KkIOqwnO2WiSDsoJzsmbgpXG4gICAgICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbiAgICB9XG4gIH1cblxuICBnZXRQdXJpTG9hZGVyUXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1YnNldCA9IHRoaXMuZ2V0U3Vic2V0RmllbGRzRm9yUXVlcnkoc3Vic2V0S2V5KTtcbiAgICBjb25zdCB7IGxvYWRlcnMgfSA9IHRoaXMucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHN1YnNldCk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbYFtgXTtcblxuICAgIC8vIOyerOq3gOyggeycvOuhnCBsb2FkZXIg7IOd7ISx7ZWY64qUIO2XrO2NvCDtlajsiJhcbiAgICBjb25zdCBnZW5lcmF0ZUxvYWRlckNvZGUgPSAobmVzdGVkTG9hZGVyczogU3Vic2V0UXVlcnlbXCJsb2FkZXJzXCJdKTogc3RyaW5nW10gPT4ge1xuICAgICAgY29uc3QgbG9hZGVyTGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgbG9hZGVyIG9mIG5lc3RlZExvYWRlcnMpIHtcbiAgICAgICAgY29uc3QgeyB0b1RhYmxlLCB0b0NvbCwgdGhyb3VnaCwgZnJvbVRhYmxlLCBmcm9tQ29sIH0gPSBsb2FkZXIubWFueUpvaW47XG5cbiAgICAgICAgLy8gZnJvbUlkc+uKlCDrtoDrqqgg7ZaJ7JeQ7IScIOq6vOuCuCBmcm9tQ29sIOqwkuydtOuvgOuhnCDqt7gg7Lm47J2YIO2DgOyeheydhCDrlLDrpbjri6QoZnJvbUNvbHVtbuydtCBQS+qwgCDslYTri5Ag7IiYIOyeiOydjCkuXG4gICAgICAgIGNvbnN0IGZyb21JZHNUeXBlID0gRW50aXR5TWFuYWdlci5nZXRCeVRhYmxlKGZyb21UYWJsZSkuZ2V0Q29sdW1uQXJyYXlUeXBlKGZyb21Db2wpO1xuXG4gICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgXCJ7XCIsXG4gICAgICAgICAgYGFzOiBcIiR7bG9hZGVyLmFzfVwiLGAsXG4gICAgICAgICAgYHJlZklkOiBcIiR7bG9hZGVyLm1hbnlKb2luLmlkRmllbGR9XCIsYCxcbiAgICAgICAgICBgcWI6IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPiwgZnJvbUlkczogbnVtYmVyW10gfCBzdHJpbmdbXSkgPT4ge2AsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRocm91Z2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIEhhc01hbnlcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIFwicmV0dXJuIHFiV3JhcHBlclwiLFxuICAgICAgICAgICAgYC5mcm9tKFwiJHt0b1RhYmxlfVwiKWAsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGxvYWRlci5vbmVKb2lucy5mb3JFYWNoKChqb2luOiBTdWJzZXRRdWVyeVtcImpvaW5zXCJdW251bWJlcl0pID0+IHtcbiAgICAgICAgICAgIC8vIEZLIG51bGxhYmxlIOyXrOu2gOuKlCBsZWZ0Sm9pbiDtg4DsnoUg7Iuc6re464uI7LKY7JeQ7IScIOyekOuPmeycvOuhnCDtjJDri6jrkKhcbiAgICAgICAgICAgIGNvbnN0IGpvaW5NZXRob2QgPSBqb2luLmpvaW4gPT09IFwiaW5uZXJcIiA/IFwiam9pblwiIDogXCJsZWZ0Sm9pblwiO1xuICAgICAgICAgICAgaWYgKFwiY3VzdG9tXCIgaW4gam9pbikge1xuICAgICAgICAgICAgICAvLyBjdXN0b20gam9pbiBjbGF1c2XripQgY2FsbGJhY2sg7ZiV7YOc7J2YIG9uIOuplOyEnOuTnOuhnCDsspjrpqztlanri4jri6QuXG4gICAgICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgKGopID0+IHtgLFxuICAgICAgICAgICAgICAgIGBqLm9uKFB1cmkucmF3U3RyaW5nKFwiJHtqb2luLmN1c3RvbX1cIikpO2AsXG4gICAgICAgICAgICAgICAgXCJ9KVwiLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCBcIiR7am9pbi5mcm9tfVwiLCBcIiR7am9pbi50b31cIilgLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8g7J6F7LK07KCBIHNlbGVjdCDqtazsobAg7IOd7ISxIChyZWZJZCDtj6ztlagpXG4gICAgICAgICAgY29uc3Qgc2VsZWN0T2JqID0gdGhpcy5idWlsZE5lc3RlZFNlbGVjdE9iamVjdChsb2FkZXIuc2VsZWN0KTtcbiAgICAgICAgICBzZWxlY3RPYmoucmVmSWQgPSBgXCIke3RvVGFibGV9LiR7dG9Db2x9XCJgO1xuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICBgLndoZXJlSW4oXCIke3RvVGFibGV9LiR7dG9Db2x9XCIsIGZyb21JZHMgYXMgJHtmcm9tSWRzVHlwZX0pYCxcbiAgICAgICAgICAgIGAuc2VsZWN0KCR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3Qoc2VsZWN0T2JqKX0pO2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBNYW55VG9NYW55XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIFwicmV0dXJuIHFiV3JhcHBlclwiLFxuICAgICAgICAgICAgYC5mcm9tKFwiJHt0aHJvdWdoLnRhYmxlfVwiKWAsXG4gICAgICAgICAgICBgLmpvaW4oXCIke3RvVGFibGV9XCIsIFwiJHt0aHJvdWdoLnRhYmxlfS4ke3Rocm91Z2gudG9Db2x9XCIsIFwiJHt0b1RhYmxlfS4ke3RvQ29sfVwiKWAsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGxvYWRlci5vbmVKb2lucy5mb3JFYWNoKChqb2luOiBTdWJzZXRRdWVyeVtcImpvaW5zXCJdW251bWJlcl0pID0+IHtcbiAgICAgICAgICAgIC8vIEZLIG51bGxhYmxlIOyXrOu2gOuKlCBsZWZ0Sm9pbiDtg4DsnoUg7Iuc6re464uI7LKY7JeQ7IScIOyekOuPmeycvOuhnCDtjJDri6jrkKhcbiAgICAgICAgICAgIGNvbnN0IGpvaW5NZXRob2QgPSBqb2luLmpvaW4gPT09IFwiaW5uZXJcIiA/IFwiam9pblwiIDogXCJsZWZ0Sm9pblwiO1xuICAgICAgICAgICAgaWYgKFwiY3VzdG9tXCIgaW4gam9pbikge1xuICAgICAgICAgICAgICAvLyBjdXN0b20gam9pbiBjbGF1c2XripQgY2FsbGJhY2sg7ZiV7YOc7J2YIG9uIOuplOyEnOuTnOuhnCDsspjrpqztlanri4jri6QuXG4gICAgICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgKGopID0+IHtgLFxuICAgICAgICAgICAgICAgIGBqLm9uKFB1cmkucmF3U3RyaW5nKFwiJHtqb2luLmN1c3RvbX1cIikpO2AsXG4gICAgICAgICAgICAgICAgXCJ9KVwiLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCBcIiR7am9pbi5mcm9tfVwiLCBcIiR7am9pbi50b31cIilgLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8g7J6F7LK07KCBIHNlbGVjdCDqtazsobAg7IOd7ISxIChyZWZJZCDtj6ztlagpXG4gICAgICAgICAgY29uc3Qgc2VsZWN0T2JqID0gdGhpcy5idWlsZE5lc3RlZFNlbGVjdE9iamVjdChsb2FkZXIuc2VsZWN0KTtcbiAgICAgICAgICBzZWxlY3RPYmoucmVmSWQgPSBgXCIke3Rocm91Z2gudGFibGV9LiR7dGhyb3VnaC5mcm9tQ29sfVwiYDtcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgYC53aGVyZUluKFwiJHt0aHJvdWdoLnRhYmxlfS4ke3Rocm91Z2guZnJvbUNvbH1cIiwgZnJvbUlkcyBhcyAke2Zyb21JZHNUeXBlfSlgLFxuICAgICAgICAgICAgYC5zZWxlY3QoJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RPYmopfSk7YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9hZGVyTGluZXMucHVzaChgfSxgKTtcblxuICAgICAgICAvLyDspJHssqkgbG9hZGVycyDsspjrpqxcbiAgICAgICAgaWYgKGxvYWRlci5sb2FkZXJzICYmIGxvYWRlci5sb2FkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFwibG9hZGVyczogW1wiLCAuLi5nZW5lcmF0ZUxvYWRlckNvZGUobG9hZGVyLmxvYWRlcnMpLCBcIl0sXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9hZGVyTGluZXMucHVzaChcIn0sXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbG9hZGVyTGluZXM7XG4gICAgfTtcblxuICAgIGxpbmVzLnB1c2goLi4uZ2VuZXJhdGVMb2FkZXJDb2RlKGxvYWRlcnMpKTtcbiAgICBsaW5lcy5wdXNoKGBdYCk7XG5cbiAgICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIC8qXG4gICAgc3Vic2V0IFNFTEVDVC9KT0lOL0xPQURFUiDqsrDqs7wg66as7YS0XG4gICovXG4gIGdldFN1YnNldFF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogU3Vic2V0UXVlcnkge1xuICAgIGNvbnN0IHN1YnNldCA9IHRoaXMuZ2V0U3Vic2V0RmllbGRzRm9yUXVlcnkoc3Vic2V0S2V5KTtcblxuICAgIGNvbnN0IHJlc3VsdDogU3Vic2V0UXVlcnkgPSB0aGlzLnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCBzdWJzZXQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKlxuICAgKi9cbiAgcmVzb2x2ZVN1YnNldFF1ZXJ5KFxuICAgIHByZWZpeDogc3RyaW5nLFxuICAgIGZpZWxkczogc3RyaW5nW10sXG4gICAgaXNBbHJlYWR5T3V0ZXJKb2luZWQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogU3Vic2V0UXVlcnkge1xuICAgIC8vIHByZWZpeCDsuZjtmZggKHByZWZpeOuKlCBUb09uZVJlbGF0aW9u7J20IOuzteyImOuhnCDrtpnsnYAg6rK97JqwIOuqqOuRkCBfX+uhnCDrs4Dqsr3rkKgpXG4gICAgcHJlZml4ID0gcHJlZml4LnJlcGxhY2UoL1xcLi9nLCBcIl9fXCIpO1xuXG4gICAgLy8g7ISc67iM7IWL7J2EIDHrjoHsiqTrp4wg67aE66as7ZWY7JesIOq3uOujue2VkVxuICAgIGNvbnN0IHN1YnNldEdyb3VwID0gZ3JvdXAoZmllbGRzLCAoZmllbGQpID0+IHtcbiAgICAgIGlmIChmaWVsZC5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgICAgY29uc3QgW3JlbF0gPSBmaWVsZC5zcGxpdChcIi5cIik7XG4gICAgICAgIHJldHVybiByZWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5rZXlzKHN1YnNldEdyb3VwKS5yZWR1Y2UoXG4gICAgICAociwgZ3JvdXBLZXkpID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXBlZEZpZWxkcyA9IHN1YnNldEdyb3VwW2dyb3VwS2V5XTtcbiAgICAgICAgYXNzZXJ0KGdyb3VwZWRGaWVsZHMgIT09IHVuZGVmaW5lZCwgXCJmaWVsZHMgaXMgdW5kZWZpbmVkXCIpO1xuXG4gICAgICAgIC8vIO2YhOyerCDthYzsnbTruJQg7ZWE65Oc7IWL7J2AIHNlbGVjdCwgdmlydHVhbOyXkCDstpTqsIDtlZjqs6Ag66as7YS0XG4gICAgICAgIGlmIChncm91cEtleSA9PT0gXCJcIikge1xuICAgICAgICAgIGNvbnN0IHJlYWxGaWVsZHMgPSBncm91cGVkRmllbGRzLmZpbHRlcigoZmllbGQpID0+ICFpc1ZpcnR1YWxQcm9wKHRoaXMucHJvcHNEaWN0W2ZpZWxkXSkpO1xuICAgICAgICAgIC8vIHZpcnR1YWxUeXBlOiBcImNvZGVcIiAo65iQ64qUIHVuZGVmaW5lZCnsnbggdmlydHVhbCBwcm9w66eMIHIudmlydHVhbOyXkCDstpTqsIBcbiAgICAgICAgICAvLyB2aXJ0dWFsVHlwZTogXCJxdWVyeVwi7J24IOqyveyasCDsgqzsmqnsnpDqsIAgYXBwZW5kU2VsZWN066GcIOyngeygkSDstpTqsIDtlZjrr4DroZwg7KCc7Jm4XG4gICAgICAgICAgY29uc3QgdmlydHVhbENvZGVGaWVsZHMgPSBncm91cGVkRmllbGRzLmZpbHRlcigoZmllbGQpID0+XG4gICAgICAgICAgICBpc1ZpcnR1YWxDb2RlUHJvcCh0aGlzLnByb3BzRGljdFtmaWVsZF0pLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAocHJlZml4ID09PSBcIlwiKSB7XG4gICAgICAgICAgICAvLyDtmITsnqwg7YWM7J2067iU7J24IOqyveyasFxuICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQocmVhbEZpZWxkcy5tYXAoKGZpZWxkKSA9PiB0aGlzLmdldEZ1bGxGaWVsZE5hbWUoZmllbGQpKSk7XG4gICAgICAgICAgICByLnZpcnR1YWwgPSByLnZpcnR1YWwuY29uY2F0KHZpcnR1YWxDb2RlRmllbGRzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g64SY7Ja07JioIO2FjOydtOu4lOyduCDqsr3smrBcbiAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KFxuICAgICAgICAgICAgICByZWFsRmllbGRzLm1hcCgoZmllbGQpID0+IGAke3ByZWZpeH0uJHtmaWVsZH0gYXMgJHtwcmVmaXh9X18ke2ZpZWxkfWApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uID0gdGhpcy5yZWxhdGlvbnNbZ3JvdXBLZXldO1xuICAgICAgICBpZiAocmVsYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCByZWxhdGlvbiDssLjsobAgJHtncm91cEtleX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChyZWxhdGlvbi53aXRoKTtcblxuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgfHwgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgLy8gLU9uZSBSZWxhdGlvbjogSk9JTiDsnLzroZwg7LKY66asXG4gICAgICAgICAgY29uc3QgcmVsRmllbGRzID0gZ3JvdXBlZEZpZWxkcy5tYXAoKGZpZWxkKSA9PiBmaWVsZC5zcGxpdChcIi5cIikuc2xpY2UoMSkuam9pbihcIi5cIikpO1xuXG4gICAgICAgICAgLy8gLU9uZSBSZWxhdGlvbuyXkOyEnCBpZCDtlYTrk5zrp4wg7LC47KGw7ZWY64qUIOqyveyasCDrprTroIjsnbTshZgg64SY6riw7KeAIOyViuqzoCDrpqzthLRcbiAgICAgICAgICBpZiAocmVsRmllbGRzLmxlbmd0aCA9PT0gMSAmJiByZWxGaWVsZHNbMF0gPT09IFwiaWRcIikge1xuICAgICAgICAgICAgaWYgKHByZWZpeCA9PT0gXCJcIikge1xuICAgICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChgJHt0aGlzLnRhYmxlfS4ke2dyb3VwS2V5fV9pZGApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQoYCR7cHJlZml4fS4ke2dyb3VwS2V5fV9pZCBhcyAke3ByZWZpeH1fXyR7Z3JvdXBLZXl9X2lkYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpbm5lck9yT3V0ZXJcbiAgICAgICAgICBjb25zdCBpbm5lck9yT3V0ZXIgPSAoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzQWxyZWFkeU91dGVySm9pbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBcIm91dGVyXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaGFzSm9pbkNvbHVtbiAmJiAhKHJlbGF0aW9uLm51bGxhYmxlID8/IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImlubmVyXCI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib3V0ZXJcIjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLm51bGxhYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib3V0ZXJcIjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJpbm5lclwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkoKTtcbiAgICAgICAgICBjb25zdCByZWxTdWJzZXRRdWVyeSA9IHJlbEVudGl0eS5yZXNvbHZlU3Vic2V0UXVlcnkoXG4gICAgICAgICAgICBgJHtwcmVmaXggIT09IFwiXCIgPyBgJHtwcmVmaXh9LmAgOiBcIlwifSR7Z3JvdXBLZXl9YCxcbiAgICAgICAgICAgIHJlbEZpZWxkcyxcbiAgICAgICAgICAgIGlubmVyT3JPdXRlciA9PT0gXCJvdXRlclwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQocmVsU3Vic2V0UXVlcnkuc2VsZWN0KTtcbiAgICAgICAgICByLnZpcnR1YWwgPSByLnZpcnR1YWwuY29uY2F0KHJlbFN1YnNldFF1ZXJ5LnZpcnR1YWwpO1xuXG4gICAgICAgICAgY29uc3Qgam9pbkFzID0gcHJlZml4ID09PSBcIlwiID8gZ3JvdXBLZXkgOiBgJHtwcmVmaXh9X18ke2dyb3VwS2V5fWA7XG4gICAgICAgICAgY29uc3QgZnJvbVRhYmxlID0gcHJlZml4ID09PSBcIlwiID8gdGhpcy50YWJsZSA6IHByZWZpeDtcblxuICAgICAgICAgIGxldCBqb2luQ2xhdXNlOlxuICAgICAgICAgICAgfCB7XG4gICAgICAgICAgICAgICAgZnJvbTogc3RyaW5nO1xuICAgICAgICAgICAgICAgIHRvOiBzdHJpbmc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgIGN1c3RvbTogc3RyaW5nO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChyZWxhdGlvbi5jdXN0b21Kb2luQ2xhdXNlKSB7XG4gICAgICAgICAgICBqb2luQ2xhdXNlID0ge1xuICAgICAgICAgICAgICBjdXN0b206IHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nO1xuICAgICAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5oYXNKb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgZnJvbSA9IGAke2Zyb21UYWJsZX0uJHtyZWxhdGlvbi5uYW1lfV9pZGA7XG4gICAgICAgICAgICAgICAgdG8gPSBgJHtqb2luQXN9LmlkYDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcm9tID0gYCR7ZnJvbVRhYmxlfS5pZGA7XG4gICAgICAgICAgICAgICAgdG8gPSBgJHtqb2luQXN9LiR7aW5mbGVjdGlvbi51bmRlcnNjb3JlKHRoaXMubmFtZXMuZnMucmVwbGFjZSgvLS9nLCBcIl9cIikpfV9pZGA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZyb20gPSBgJHtmcm9tVGFibGV9LiR7cmVsYXRpb24ubmFtZX1faWRgO1xuICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uaWRgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgam9pbkNsYXVzZSA9IHtcbiAgICAgICAgICAgICAgZnJvbSxcbiAgICAgICAgICAgICAgdG8sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHIuam9pbnMucHVzaCh7XG4gICAgICAgICAgICBhczogam9pbkFzLFxuICAgICAgICAgICAgam9pbjogaW5uZXJPck91dGVyLFxuICAgICAgICAgICAgdGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgIC4uLmpvaW5DbGF1c2UsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBCZWxvbmdzVG9PbmUg67CR7JeQIEhhc01hbnnqsIAg67aZ7J2AIOqyveyasFxuICAgICAgICAgIGlmIChyZWxTdWJzZXRRdWVyeS5sb2FkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZExvYWRlcnMgPSByZWxTdWJzZXRRdWVyeS5sb2FkZXJzLm1hcCgobG9hZGVyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld0FzID0gW2dyb3VwS2V5LCBsb2FkZXIuYXNdLmpvaW4oXCJfX1wiKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhczogbmV3QXMsXG4gICAgICAgICAgICAgICAgdGFibGU6IGxvYWRlci50YWJsZSxcbiAgICAgICAgICAgICAgICBtYW55Sm9pbjogbG9hZGVyLm1hbnlKb2luLFxuICAgICAgICAgICAgICAgIG9uZUpvaW5zOiBsb2FkZXIub25lSm9pbnMsXG4gICAgICAgICAgICAgICAgc2VsZWN0OiBsb2FkZXIuc2VsZWN0LFxuICAgICAgICAgICAgICAgIGxvYWRlcnM6IGxvYWRlci5sb2FkZXJzLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHIubG9hZGVycyA9IFsuLi5yLmxvYWRlcnMsIC4uLmNvbnZlcnRlZExvYWRlcnNdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHIuam9pbnMgPSByLmpvaW5zLmNvbmNhdChyZWxTdWJzZXRRdWVyeS5qb2lucyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNIYXNNYW55UmVsYXRpb25Qcm9wKHJlbGF0aW9uKSB8fCBpc01hbnlUb01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgLy8gLU1hbnkgUmVsYXRpb246IExvYWRlciDroZwg7LKY66asXG4gICAgICAgICAgY29uc3QgcmVsRmllbGRzID0gZ3JvdXBlZEZpZWxkcy5tYXAoKGZpZWxkKSA9PiBmaWVsZC5zcGxpdChcIi5cIikuc2xpY2UoMSkuam9pbihcIi5cIikpO1xuICAgICAgICAgIGNvbnN0IHJlbFN1YnNldFF1ZXJ5ID0gcmVsRW50aXR5LnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCByZWxGaWVsZHMpO1xuXG4gICAgICAgICAgbGV0IG1hbnlKb2luOiBTdWJzZXRRdWVyeVtcImxvYWRlcnNcIl1bbnVtYmVyXVtcIm1hbnlKb2luXCJdO1xuICAgICAgICAgIGlmIChpc0hhc01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBmcm9tQ29sID0gcmVsYXRpb24/LmZyb21Db2x1bW4gPz8gXCJpZFwiO1xuICAgICAgICAgICAgbWFueUpvaW4gPSB7XG4gICAgICAgICAgICAgIGZyb21UYWJsZTogdGhpcy50YWJsZSxcbiAgICAgICAgICAgICAgZnJvbUNvbCxcbiAgICAgICAgICAgICAgaWRGaWVsZDogcHJlZml4ID09PSBcIlwiID8gYCR7ZnJvbUNvbH1gIDogYCR7cHJlZml4fV9fJHtmcm9tQ29sfWAsXG4gICAgICAgICAgICAgIHRvVGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgICAgdG9Db2w6IHJlbGF0aW9uLmpvaW5Db2x1bW4sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgICAgbWFueUpvaW4gPSB7XG4gICAgICAgICAgICAgIGZyb21UYWJsZTogdGhpcy50YWJsZSxcbiAgICAgICAgICAgICAgZnJvbUNvbDogXCJpZFwiLFxuICAgICAgICAgICAgICBpZEZpZWxkOiBwcmVmaXggPT09IFwiXCIgPyBgaWRgIDogYCR7cHJlZml4fV9faWRgLFxuICAgICAgICAgICAgICB0aHJvdWdoOiB7XG4gICAgICAgICAgICAgICAgdGFibGU6IHJlbGF0aW9uLmpvaW5UYWJsZSxcbiAgICAgICAgICAgICAgICBmcm9tQ29sOiBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHRoaXMudGFibGUpfV9pZGAsXG4gICAgICAgICAgICAgICAgdG9Db2w6IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUocmVsRW50aXR5LnRhYmxlKX1faWRgLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0b1RhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICAgIHRvQ29sOiBcImlkXCIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByLmxvYWRlcnMucHVzaCh7XG4gICAgICAgICAgICBhczogZ3JvdXBLZXksXG4gICAgICAgICAgICB0YWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgbWFueUpvaW4sXG4gICAgICAgICAgICBvbmVKb2luczogcmVsU3Vic2V0UXVlcnkuam9pbnMsXG4gICAgICAgICAgICBzZWxlY3Q6IHJlbFN1YnNldFF1ZXJ5LnNlbGVjdCxcbiAgICAgICAgICAgIGxvYWRlcnM6IHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0sXG4gICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIHtcbiAgICAgICAgc2VsZWN0OiBbXSxcbiAgICAgICAgdmlydHVhbDogW10sXG4gICAgICAgIGpvaW5zOiBbXSxcbiAgICAgICAgbG9hZGVyczogW10sXG4gICAgICB9IGFzIFN1YnNldFF1ZXJ5LFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG4gICAgRmllbGRFeHByW10g7J2EIEVudGl0eVByb3BOb2RlW10g66GcIOuzgO2ZmFxuICAqL1xuICBmaWVsZEV4cHJzVG9Qcm9wTm9kZXMoZmllbGRFeHByczogc3RyaW5nW10sIGVudGl0eTogRW50aXR5ID0gdGhpcyk6IEVudGl0eVByb3BOb2RlW10ge1xuICAgIGNvbnN0IGdyb3VwcyA9IGZpZWxkRXhwcnMucmVkdWNlKFxuICAgICAgKHJlc3VsdCwgZmllbGRFeHByKSA9PiB7XG4gICAgICAgIGxldCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgZWxzZUV4cHI6IHN0cmluZ1tdO1xuICAgICAgICBpZiAoZmllbGRFeHByLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgIFtrZXksIC4uLmVsc2VFeHByXSA9IGZpZWxkRXhwci5zcGxpdChcIi5cIik7XG4gICAgICAgICAgdmFsdWUgPSBlbHNlRXhwci5qb2luKFwiLlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBrZXkgPSBcIlwiO1xuICAgICAgICAgIHZhbHVlID0gZmllbGRFeHByO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdFtrZXldID0gKHJlc3VsdFtrZXldID8/IFtdKS5jb25jYXQodmFsdWUpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICB7fSBhcyB7XG4gICAgICAgIFtrOiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhncm91cHMpLmZsYXRNYXA8RW50aXR5UHJvcE5vZGUsIEVudGl0eVByb3BOb2RlW10+KChrZXkpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwZWRGaWVsZEV4cHJzID0gZ3JvdXBzW2tleV07XG5cbiAgICAgIC8vIOydvOuwmCBwcm9wIOyymOumrFxuICAgICAgaWYgKGtleSA9PT0gXCJcIikge1xuICAgICAgICByZXR1cm4gZ3JvdXBlZEZpZWxkRXhwcnMubWFwKChwcm9wTmFtZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICAgICAgaWYgKHByb3AgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgJHtlbnRpdHkuaWR9IC0tIOyemOuqu+uQnCBGaWVsZEV4cHIgJyR7cHJvcE5hbWV9JyAo7IKs7JqpIOqwgOuKpe2VnCBwcm9wczogJHtlbnRpdHkucHJvcHMubWFwKChwKSA9PiBwLm5hbWUpLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlVHlwZTogXCJwbGFpblwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVsYXRpb24gcHJvcCDsspjrpqxcbiAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHNEaWN0W2tleV07XG4gICAgICBpZiAoIWlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihg7J6Y66q765CcIEZpZWxkRXhwciAke2tleX0uJHtncm91cGVkRmllbGRFeHByc1swXX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG5cbiAgICAgIC8vIHJlbGF0aW9uIC1PbmUg7JeQIGlkIO2VhOuTnCDtlZjrgpjsnbgg6rK97JqwXG4gICAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZ3JvdXBlZEZpZWxkRXhwcnMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgKGdyb3VwZWRGaWVsZEV4cHJzWzBdID09PSBcImlkXCIgfHwgZ3JvdXBlZEZpZWxkRXhwcnNbMF0gPT09IFwiaWQ/XCIpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIGlkIO2VmOuCmOunjCDsnojripTsp4Ag7LK07YGs7ZW07IScLCDtlZjrgpjrp4wg7J6I7Jy866m0IOyDgeychCBwcm9w7Jy866GcIGlk66W8IOumrO2EtFxuICAgICAgICAgIGNvbnN0IGlkUHJvcCA9IHJlbEVudGl0eS5wcm9wc0RpY3QuaWQ7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIgYXMgY29uc3QsXG4gICAgICAgICAgICBwcm9wOiB7XG4gICAgICAgICAgICAgIC4uLmlkUHJvcCxcbiAgICAgICAgICAgICAgbmFtZTogYCR7a2V5fV9pZGAsXG4gICAgICAgICAgICAgIG51bGxhYmxlOiBwcm9wLm51bGxhYmxlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIC1PbmUg6re47Jm47J2YIOqyveyasCBvYmplY3TroZwg66as7YS0XG4gICAgICAvLyAtTWFueeydmCDqsr3smrAgYXJyYXnroZwg66as7YS0XG4gICAgICAvLyBSZWN1cnNpdmUg66GcIOuOgeyKpCDsspjrpqxcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5maWVsZEV4cHJzVG9Qcm9wTm9kZXMoZ3JvdXBlZEZpZWxkRXhwcnMsIHJlbEVudGl0eSk7XG4gICAgICBjb25zdCBub2RlVHlwZSA9XG4gICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcClcbiAgICAgICAgICA/IChcIm9iamVjdFwiIGFzIGNvbnN0KVxuICAgICAgICAgIDogKFwiYXJyYXlcIiBhcyBjb25zdCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5vZGVUeXBlLFxuICAgICAgICBwcm9wLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXRGaWVsZEV4cHJzKHByZWZpeCA9IFwiXCIsIG1heERlcHRoOiBudW1iZXIgPSAzLCBmcm9tczogc3RyaW5nW10gPSBbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wc1xuICAgICAgLmZsYXRNYXAoKHByb3ApID0+IHtcbiAgICAgICAgY29uc3QgcHJvcE5hbWUgPSBbcHJlZml4LCBwcm9wLm5hbWVdLmZpbHRlcigodikgPT4gdiAhPT0gXCJcIikuam9pbihcIi5cIik7XG4gICAgICAgIGlmIChwcm9wTmFtZSA9PT0gcHJlZml4KSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgaWYgKG1heERlcHRoIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmcm9tcy5pbmNsdWRlcyhwcm9wLndpdGgpKSB7XG4gICAgICAgICAgICAvLyDsl63rsKntlqUgcmVsYXRpb27snbgg6rK97JqwIOygnOyZuFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIOygleuwqe2WpSByZWxhdGlvbuyduCDqsr3smrAgcmVjdXJzaXZlIOy9nFxuICAgICAgICAgIGNvbnN0IHJlbE1kID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICByZXR1cm4gcmVsTWQuZ2V0RmllbGRFeHBycyhwcm9wTmFtZSwgbWF4RGVwdGggLSAxLCBbLi4uZnJvbXMsIHRoaXMuaWRdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcE5hbWU7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZikgPT4gZiAhPT0gbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb24gcHJvcOydtCDtmITsnqwg7YWM7J2067iU7JeQIEZLIOy7rOufvOydhCDsg53shLHtlZjripTsp4Ag7ZmV7J24XG4gICAqKEJlbG9uZ3NUb09uZSDrmJDripQgT25lVG9PbmUoaGFzSm9pbkNvbHVtbj10cnVlKeyduCDqsr3smrAgRksg7IOd7ISxKVxuICAgKi9cbiAgcHJpdmF0ZSBoYXNGb3JlaWduS2V5KHByb3A6IFJlbGF0aW9uUHJvcCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBwcm9wLnJlbGF0aW9uVHlwZSA9PT0gXCJCZWxvbmdzVG9PbmVcIiB8fFxuICAgICAgKHByb3AucmVsYXRpb25UeXBlID09PSBcIk9uZVRvT25lXCIgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICk7XG4gIH1cblxuICBnZXRUYWJsZUNvbHVtbnMoKTogeyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9W10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzXG4gICAgICAubWFwKChwcm9wKSA9PiB7XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIikge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0ZvcmVpZ25LZXkocHJvcCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGAke3Byb3AubmFtZX1faWRgLCB0eXBlOiBcImludF91bnNpZ25lZFwiIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBuYW1lOiBwcm9wLm5hbWUsIHR5cGU6IHByb3AudHlwZSB9O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIobm9uTnVsbGFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudGl0eeyXkCDsoJXsnZjrkJwg66qo65OgIHZlY3RvciDtg4DsnoUg7Lus65+8IOuwmO2ZmFxuICAgKi9cbiAgZ2V0VmVjdG9yQ29sdW1ucygpOiBFbnRpdHlQcm9wW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmZpbHRlcigocCkgPT4gcC50eXBlID09PSBcInZlY3RvclwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtirnsoJUgdmVjdG9yIOy7rOufvCDrsJjtmZhcbiAgICogQHBhcmFtIGNvbHVtbk5hbWUgLSDsu6zrn7zrqoUgKOyDneuetSDsi5wg7LKrIOuyiOynuCB2ZWN0b3Ig7Lus65+8KVxuICAgKi9cbiAgZ2V0VmVjdG9yQ29sdW1uKGNvbHVtbk5hbWU/OiBzdHJpbmcpOiBFbnRpdHlQcm9wIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB2ZWN0b3JQcm9wcyA9IHRoaXMuZ2V0VmVjdG9yQ29sdW1ucygpO1xuICAgIGlmIChjb2x1bW5OYW1lKSB7XG4gICAgICByZXR1cm4gdmVjdG9yUHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBjb2x1bW5OYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHZlY3RvclByb3BzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VhO2EsOungSDqsIDriqXtlZwgcHJvcHMg67CY7ZmYXG4gICAqXG4gICAqIC0g7J2867CYIHByb3BcbiAgICogLSBGS+ulvCDsg53shLHtlZjripQgcmVsYXRpb24gKEJlbG9uZ3NUb09uZSwgT25lVG9PbmUgd2l0aCBoYXNKb2luQ29sdW1uKVxuICAgKiAgIOKGkiB7bmFtZX1faWQg7ZiV7YOc7J2YIOqwgOyDgSBpbnRlZ2VyIHByb3DsnLzroZwg67OA7ZmYXG4gICAqL1xuICBnZXRGaWx0ZXJhYmxlUHJvcHMoKTogRW50aXR5UHJvcFtdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5mbGF0TWFwKChwcm9wKTogRW50aXR5UHJvcCB8IEVudGl0eVByb3BbXSA9PiB7XG4gICAgICAvLyBWaXJ0dWFsIHByb3Ag7KCc7Jm4XG4gICAgICBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbGF0aW9uIHByb3Ag7LKY66asXG4gICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgLy8gRkvrpbwg7IOd7ISx7ZWY64qUIHJlbGF0aW9u66eMIO2PrO2VqFxuICAgICAgICBpZiAodGhpcy5oYXNGb3JlaWduS2V5KHByb3ApKSB7XG4gICAgICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGAke3Byb3AubmFtZX1faWRgLFxuICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICBudWxsYWJsZTogcHJvcC5udWxsYWJsZSxcbiAgICAgICAgICB9IGFzIEVudGl0eVByb3A7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICAvLyDsnbzrsJggcHJvcCDsspjrpqxcbiAgICAgIHJldHVybiBwcm9wO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudGl0eeqwgCDrhbjstpztlZjripQg7YOA7J6FIOydtOumhOqzvCDrqqjrk4gg6rK966Gc66W8IEVudGl0eU1hbmFnZXLsl5Ag65Ox66Gd7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwbGljaXRBcGlSb290UGF0aCAtIFNvbmFtdSDstIjquLDtmZQg7JeG7J20IOuTseuhne2VoCDrlYwg7IKs7Jqp7ZWgIEFQSSDro6jtirgg6rK966GcXG4gICAqL1xuICBhc3luYyByZWdpc3Rlck1vZHVsZVBhdGhzKGV4cGxpY2l0QXBpUm9vdFBhdGg/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBiYXNlUGF0aCA9IGAke3RoaXMubmFtZXMucGFyZW50RnN9YDtcblxuICAgIC8vIGJhc2Utc2NoZW1lXG4gICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKGAke3RoaXMuaWR9QmFzZVNjaGVtYWAsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG5cbiAgICAvLyBzdWJzZXRcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5zdWJzZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1TdWJzZXRLZXlgLCBgc29uYW11LmdlbmVyYXRlZGApO1xuICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKGAke3RoaXMuaWR9U3Vic2V0TWFwcGluZ2AsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgICBmb3IgKGNvbnN0IHN1YnNldEtleSBvZiBPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpKSB7XG4gICAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChcbiAgICAgICAgICBgJHt0aGlzLmlkfVN1YnNldCR7c3Vic2V0S2V5LnRvVXBwZXJDYXNlKCl9YCxcbiAgICAgICAgICBgc29uYW11LmdlbmVyYXRlZGAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZW51bXNcbiAgICBmb3IgKGNvbnN0IGVudW1JZCBvZiBPYmplY3Qua2V5cyh0aGlzLmVudW1MYWJlbHMpKSB7XG4gICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoZW51bUlkLCBgc29uYW11LmdlbmVyYXRlZGApO1xuICAgIH1cblxuICAgIC8vIHR5cGVzXG4gICAgY29uc3QgdHlwZXNNb2R1bGVQYXRoID0gYCR7YmFzZVBhdGh9LyR7dGhpcy5uYW1lcy5wYXJlbnRGc30udHlwZXNgO1xuICAgIGNvbnN0IHR5cGVzRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBleHBsaWNpdEFwaVJvb3RQYXRoID8/IFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgIHJ1bnRpbWVQYXRoKGBkaXN0L2FwcGxpY2F0aW9uLyR7dHlwZXNNb2R1bGVQYXRofS5qc2ApLFxuICAgICk7XG5cbiAgICBpZiAoYXdhaXQgZXhpc3RzKHR5cGVzRmlsZVBhdGgpKSB7XG4gICAgICBjb25zdCBpbXBvcnRlZE1lbWJlcnMgPSBhd2FpdCBpbXBvcnRNZW1iZXJzPHouWm9kVHlwZUFueT4odHlwZXNGaWxlUGF0aCk7XG4gICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIHRoaXMudHlwZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIGltcG9ydGVkTWVtYmVycy5tYXAoKHsgbmFtZSwgdmFsdWUgfSkgPT4ge1xuICAgICAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChuYW1lLCB0eXBlc01vZHVsZVBhdGgpO1xuICAgICAgICAgIHJldHVybiBbbmFtZSwgdmFsdWVdO1xuICAgICAgICB9KSxcbiAgICAgICkgYXMgeyBbbmFtZTogc3RyaW5nXTogei5ab2RUeXBlQW55IH07XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJUYWJsZVNwZWNzKCk6IHZvaWQge1xuICAgIC8vIOyhsOyduCDthYzsnbTruJQg7J24642x7IqkIOygnOyZuCAo7Lus65+8IOydtOumhOyXkCAnLifsnbQg7Y+s7ZWo65CcIOqyveyasClcbiAgICBjb25zdCB1bmlxdWVJbmRleGVzID0gdGhpcy5pbmRleGVzXG4gICAgICAuZmlsdGVyKChpZHgpID0+IGlkeC50eXBlID09PSBcInVuaXF1ZVwiKVxuICAgICAgLmZpbHRlcigoaWR4KSA9PiBpZHguY29sdW1ucy5ldmVyeSgoY29sKSA9PiAhY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpKSk7XG5cbiAgICBFbnRpdHlNYW5hZ2VyLnNldFRhYmxlU3BlYyh7XG4gICAgICBuYW1lOiB0aGlzLnRhYmxlLFxuICAgICAgdW5pcXVlSW5kZXhlcyxcbiAgICAgIGpzb25Db2x1bW5zOiB0aGlzLnByb3BzLmZpbHRlcigocCkgPT4gcC50eXBlID09PSBcImpzb25cIikubWFwKChwKSA9PiBwLm5hbWUpLFxuICAgIH0pO1xuICB9XG5cbiAgdG9Kc29uKCk6IEVudGl0eUpzb24ge1xuICAgIC8vIHN1YnNldHPsmYAgc3Vic2V0c0ludGVybmFs7J2EIFN1YnNldERlZiDtmJXtg5zroZwg67O17JuQIChjb25lIO2PrO2VqClcbiAgICBjb25zdCBzdWJzZXRzOiB7IFtrZXk6IHN0cmluZ106IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpLlN1YnNldERlZiB9ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5zdWJzZXRzKSkge1xuICAgICAgY29uc3Qgbm9ybWFsRmllbGRzOiBTdWJzZXRGaWVsZFtdID0gdGhpcy5zdWJzZXRzW2tleV07XG4gICAgICBjb25zdCBpbnRlcm5hbEZpZWxkczogU3Vic2V0RmllbGRbXSA9ICh0aGlzLnN1YnNldHNJbnRlcm5hbFtrZXldID8/IFtdKS5tYXAoKGZpZWxkKSA9PiAoe1xuICAgICAgICBmaWVsZCxcbiAgICAgICAgaW50ZXJuYWw6IHRydWUsXG4gICAgICB9KSk7XG4gICAgICBjb25zdCBmaWVsZHMgPSBbLi4ubm9ybWFsRmllbGRzLCAuLi5pbnRlcm5hbEZpZWxkc107XG5cbiAgICAgIC8vIGNvbmXsnbQg7J6I7Jy866m0IOyDiOuhnOyatCDqsJ3ssrQg7ZiV7YOc66GcLCDsl4bsnLzrqbQg67Cw7Je0IO2Yle2DnOuhnFxuICAgICAgaWYgKHRoaXMuc3Vic2V0Q29uZXNba2V5XSkge1xuICAgICAgICBzdWJzZXRzW2tleV0gPSB7XG4gICAgICAgICAgZmllbGRzLFxuICAgICAgICAgIGNvbmU6IHRoaXMuc3Vic2V0Q29uZXNba2V5XSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YnNldHNba2V5XSA9IGZpZWxkcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnVtc+ulvCBFbnVtRGVmIO2Yle2DnOuhnCDrs7Xsm5AgKGNvbmUg7Y+s7ZWoKVxuICAgIGNvbnN0IGVudW1zOiB7IFtrZXk6IHN0cmluZ106IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpLkVudW1EZWYgfSA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVzXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudW1MYWJlbHMpKSB7XG4gICAgICAvLyBjb25l7J20IOyeiOycvOuptCDsg4jroZzsmrQg6rCd7LK0IO2Yle2DnOuhnCwg7JeG7Jy866m0IFJlY29yZCDtmJXtg5zroZxcbiAgICAgIGlmICh0aGlzLmVudW1Db25lc1trZXldKSB7XG4gICAgICAgIGVudW1zW2tleV0gPSB7XG4gICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgIGNvbmU6IHRoaXMuZW51bUNvbmVzW2tleV0sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnVtc1trZXldID0gdmFsdWVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHBhcmVudElkOiB0aGlzLnBhcmVudElkLFxuICAgICAgdGFibGU6IHRoaXMudGFibGUsXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGN1c3RvbTogdGhpcy5jdXN0b20sXG4gICAgICBjb25lOiB0aGlzLmNvbmUsXG4gICAgICBwcm9wczogdGhpcy5wcm9wcyxcbiAgICAgIGluZGV4ZXM6IHRoaXMuaW5kZXhlcyxcbiAgICAgIHN1YnNldHMsXG4gICAgICBlbnVtcyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgc2F2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBzb3J0OiBzdWJzZXRzXG4gICAgY29uc3Qgc3Vic2V0Um93cyA9IHRoaXMuZ2V0U3Vic2V0Um93cygpO1xuICAgIHRoaXMuc3Vic2V0cyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuc3Vic2V0cykubWFwKChbc3Vic2V0S2V5XSkgPT4ge1xuICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgdGhpcy5zdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoc3Vic2V0Um93cywgc3Vic2V0S2V5LCBmYWxzZSldO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLnN1YnNldHNJbnRlcm5hbCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuc3Vic2V0c0ludGVybmFsKS5tYXAoKFtzdWJzZXRLZXldKSA9PiB7XG4gICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCB0aGlzLnN1YnNldFJvd3NUb1N1YnNldEZpZWxkcyhzdWJzZXRSb3dzLCBzdWJzZXRLZXksIHRydWUpXTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBzYXZlXG4gICAgY29uc3QganNvblBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgICBgc3JjL2FwcGxpY2F0aW9uLyR7dGhpcy5uYW1lcy5wYXJlbnRGc30vJHt0aGlzLm5hbWVzLmZzfS5lbnRpdHkuanNvbmAsXG4gICAgKTtcbiAgICBjb25zdCBqc29uID0gdGhpcy50b0pzb24oKTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoanNvblBhdGgsIGF3YWl0IGZvcm1hdENvZGUoSlNPTi5zdHJpbmdpZnkoanNvbiksIGpzb25QYXRoKSk7XG5cbiAgICAvLyByZWxvYWRcbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLnJlZ2lzdGVyKGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIO2FnO2UjOumvyBjb25lIOuplO2DgOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIExMTeydhCDsgqzsmqntlZjsp4Ag7JWK6rOgIGZha2VyLW1hcHBpbmdzLnRz66W8IO2ZnOyaqe2VmOyXrCDquLDrs7ggY29uZeydhCDsg53shLHtlanri4jri6QuXG4gICAqIHN0dWIgZW50aXR5IOyDneyEsSDsi5wg7J6Q64+Z7Jy866GcIO2YuOy2nOuQmOyWtCDstZzshoztlZzsnZggY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7KCc6rO17ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gbG9jYWxlIC0g7IOd7ISxIOyLnCDsgqzsmqntlaAgbG9jYWxlICjquLDrs7jqsJI6IFNvbmFtdS5jb25maWcuaTE4bi5kZWZhdWx0TG9jYWxlIOuYkOuKlCBcImtvXCIpXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVRlbXBsYXRlQ29uZXMobG9jYWxlPzogXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBnZW5lcmF0ZVRlbXBsYXRlQ29uZXMgfSA9IGF3YWl0IGltcG9ydChcIi4vZW50aXR5LXRlbXBsYXRlLWNvbmVcIik7XG4gICAgY29uc3QgY29uZmlnTG9jYWxlID0gU29uYW11LmNvbmZpZy5pMThuPy5kZWZhdWx0TG9jYWxlO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUxvY2FsZSA9XG4gICAgICBsb2NhbGUgfHxcbiAgICAgIChjb25maWdMb2NhbGUgPT09IFwia29cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiZW5cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiamFcIlxuICAgICAgICA/IGNvbmZpZ0xvY2FsZVxuICAgICAgICA6IFwia29cIik7XG4gICAgY29uc3QgcmVzdWx0ID0gZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzKHRoaXMudG9Kc29uKCksIGVmZmVjdGl2ZUxvY2FsZSk7XG5cbiAgICAvLyDqsrDqs7zrpbwgRW50aXR57JeQIOyggeyaqSAoYXBwbHlDb25lc+yZgCDrj5nsnbztlZwg67Cp7IudKVxuICAgIGlmIChyZXN1bHQuZW50aXR5Q29uZSkge1xuICAgICAgdGhpcy5jb25lID0gcmVzdWx0LmVudGl0eUNvbmU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3VsdC5wcm9wQ29uZXMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gdGhpcy5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICAocHJvcCBhcyB7IGNvbmU/OiBDb25lIH0pLmNvbmUgPSBjb25lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZW51bUNvbmVzID0geyAuLi50aGlzLmVudW1Db25lcywgLi4ucmVzdWx0LmVudW1Db25lcyB9O1xuICAgIHRoaXMuc3Vic2V0Q29uZXMgPSB7IC4uLnRoaXMuc3Vic2V0Q29uZXMsIC4uLnJlc3VsdC5zdWJzZXRDb25lcyB9O1xuXG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gIH1cblxuICAvKipcbiAgICogTExN7J2EIOyCrOyaqe2VmOyXrCBjb25lIOuplO2DgOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLnByZXNlcnZlRXhpc3RpbmcgLSDquLDsobQgY29uZSDrs7TsobQg7Jes67aAICjquLDrs7jqsJI6IHRydWUpXG4gICAqIEBwYXJhbSBvcHRpb25zLm9ubHlFbXB0eSAtIGZpeHR1cmVIaW506rCAIOyXhuuKlCBjb25l66eMIOyDneyEsSAo6riw67O46rCSOiBmYWxzZSlcbiAgICogQHBhcmFtIG9wdGlvbnMubG9jYWxlIC0g7IOd7ISxIOyLnCDsgqzsmqntlaAgbG9jYWxlICjquLDrs7jqsJI6IFwia29cIilcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlQ29uZXMob3B0aW9ucz86IHtcbiAgICBwcmVzZXJ2ZUV4aXN0aW5nPzogYm9vbGVhbjtcbiAgICBvbmx5RW1wdHk/OiBib29sZWFuO1xuICAgIGxvY2FsZT86IFwia29cIiB8IFwiZW5cIiB8IFwiamFcIjtcbiAgICAvKiog7YWM7Iqk7Yq464KYIOuMgOyytCBMTE0g6rO16riJ7J6Q66W8IOychO2VnCDthY3siqTtirgg7IOd7ISxIOq1rO2YhCAqL1xuICAgIGdlbmVyYXRlVGV4dD86IGltcG9ydChcIi4uL2NvbmUvY29uZS1nZW5lcmF0b3JcIikuQ29uZVRleHRHZW5lcmF0b3I7XG4gICAgLyoqIGZhbHNl7J2066m0IOyDneyEsSDqsrDqs7zrpbwg66mU66qo66as7JeQ66eMIOyggeyaqe2VmOqzoCBlbnRpdHkg7YyM7J287J2AIOyggOyepe2VmOyngCDslYrsirXri4jri6QuICovXG4gICAgcGVyc2lzdD86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPGltcG9ydChcIi4uL2NvbmUvY29uZS1nZW5lcmF0b3JcIikuQ29uZUdlbmVyYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCB7IGdlbmVyYXRlQ29uZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NvbmUvY29uZS1nZW5lcmF0b3JcIik7XG4gICAgY29uc3QgY29udGV4dDogaW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKS5Db25lR2VuZXJhdGlvbkNvbnRleHQgPSB7XG4gICAgICBlbnRpdHk6IHRoaXMudG9Kc29uKCksXG4gICAgICBsb2NhbGU6IG9wdGlvbnM/LmxvY2FsZSB8fCBcImtvXCIsXG4gICAgICBleGlzdGluZ0NvbmVzOiBvcHRpb25zPy5wcmVzZXJ2ZUV4aXN0aW5nICE9PSBmYWxzZSA/IHRoaXMuY29sbGVjdEV4aXN0aW5nQ29uZXMoKSA6IHVuZGVmaW5lZCxcbiAgICAgIG9ubHlFbXB0eTogb3B0aW9ucz8ub25seUVtcHR5ID8/IGZhbHNlLFxuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZW5lcmF0ZUNvbmVzKGNvbnRleHQsIHsgZ2VuZXJhdGVUZXh0OiBvcHRpb25zPy5nZW5lcmF0ZVRleHQgfSk7XG4gICAgdGhpcy5hcHBseUNvbmVzKHJlc3VsdCk7XG4gICAgaWYgKG9wdGlvbnM/LnBlcnNpc3QgIT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCB0aGlzLnNhdmUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDquLDsobQgY29uZeuTpOydhCDsiJjsp5Htlanri4jri6QgKGVudGl0eSwgcHJvcHMsIGVudW1zLCBzdWJzZXRzKS5cbiAgICpcbiAgICogQHJldHVybnMg7YKk6rCAIFwiZW50aXR5OmlkXCIsIFwicHJvcDpuYW1lXCIsIFwiZW51bTplbnVtSWRcIiwgXCJzdWJzZXQ6a2V5XCIg7ZiV7Iud7J24IGNvbmUg66e1XG4gICAqL1xuICBjb2xsZWN0RXhpc3RpbmdDb25lcygpOiBSZWNvcmQ8c3RyaW5nLCBDb25lPiB7XG4gICAgY29uc3QgY29uZUVudHJpZXM6IFtzdHJpbmcsIENvbmVdW10gPSBbXTtcblxuICAgIGlmICh0aGlzLmNvbmUpIHtcbiAgICAgIGNvbmVFbnRyaWVzLnB1c2goW2BlbnRpdHk6JHt0aGlzLmlkfWAsIHRoaXMuY29uZV0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiB0aGlzLnByb3BzKSB7XG4gICAgICBpZiAocHJvcC5jb25lKSB7XG4gICAgICAgIGNvbmVFbnRyaWVzLnB1c2goW2Bwcm9wOiR7cHJvcC5uYW1lfWAsIHByb3AuY29uZV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2VudW1JZCwgY29uZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5lbnVtQ29uZXMpKSB7XG4gICAgICBjb25lRW50cmllcy5wdXNoKFtgZW51bToke2VudW1JZH1gLCBjb25lXSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbc3Vic2V0S2V5LCBjb25lXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldENvbmVzKSkge1xuICAgICAgY29uZUVudHJpZXMucHVzaChbYHN1YnNldDoke3N1YnNldEtleX1gLCBjb25lXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhjb25lRW50cmllcyk7XG4gIH1cblxuICAvKipcbiAgICog7IOd7ISx65CcIGNvbmXrk6TsnYQgRW50aXR57JeQIOyggeyaqe2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIHJlc3VsdCAtIExMTeycvOuhnCDsg53shLHrkJwgY29uZSDqsrDqs7xcbiAgICovXG4gIGFwcGx5Q29uZXMocmVzdWx0OiBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVHZW5lcmF0aW9uUmVzdWx0KTogdm9pZCB7XG4gICAgaWYgKHJlc3VsdC5lbnRpdHlDb25lKSB7XG4gICAgICB0aGlzLmNvbmUgPSByZXN1bHQuZW50aXR5Q29uZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgY29uZV0gb2YgT2JqZWN0LmVudHJpZXMocmVzdWx0LnByb3BDb25lcykpIHtcbiAgICAgIGNvbnN0IHByb3AgPSB0aGlzLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICAgIChwcm9wIGFzIHsgY29uZT86IENvbmUgfSkuY29uZSA9IGNvbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5lbnVtQ29uZXMgPSB7IC4uLnRoaXMuZW51bUNvbmVzLCAuLi5yZXN1bHQuZW51bUNvbmVzIH07XG4gICAgdGhpcy5zdWJzZXRDb25lcyA9IHsgLi4udGhpcy5zdWJzZXRDb25lcywgLi4ucmVzdWx0LnN1YnNldENvbmVzIH07XG4gIH1cblxuICBnZXRTdWJzZXRSb3dzKFxuICAgIF9zdWJzZXRzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9LFxuICAgIF9zdWJzZXRzSW50ZXJuYWw/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0sXG4gICAgcHJlZml4ZXM6IHN0cmluZ1tdID0gW10sXG4gICk6IEVudGl0eVN1YnNldFJvd1tdIHtcbiAgICBpZiAocHJlZml4ZXMubGVuZ3RoID4gMTApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzdWJzZXRzID0gX3N1YnNldHMgPz8gdGhpcy5zdWJzZXRzO1xuICAgIGNvbnN0IHN1YnNldHNJbnRlcm5hbCA9IF9zdWJzZXRzSW50ZXJuYWwgPz8gdGhpcy5zdWJzZXRzSW50ZXJuYWw7XG4gICAgY29uc3Qgc3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKHN1YnNldHMpO1xuICAgIGNvbnN0IGFsbEZpZWxkcyA9IHVuaXF1ZShzdWJzZXRLZXlzLmZsYXRNYXAoKGtleSkgPT4gc3Vic2V0c1trZXldKSk7XG4gICAgLy8gaW50ZXJuYWwg7ZWE65Oc64+EIGFsbEZpZWxkc+yXkCDtj6ztlaggKHJlbGF0aW9uIO2DkOyDieyaqSlcbiAgICBjb25zdCBhbGxJbnRlcm5hbEZpZWxkcyA9IHVuaXF1ZShzdWJzZXRLZXlzLmZsYXRNYXAoKGtleSkgPT4gc3Vic2V0c0ludGVybmFsW2tleV0gPz8gW10pKTtcbiAgICBjb25zdCBjb21iaW5lZEZpZWxkcyA9IHVuaXF1ZShbLi4uYWxsRmllbGRzLCAuLi5hbGxJbnRlcm5hbEZpZWxkc10pO1xuXG4gICAgcmV0dXJuIHRoaXMucHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiICYmXG4gICAgICAgIGNvbWJpbmVkRmllbGRzLmZpbmQoKGYpID0+IGYuc3RhcnRzV2l0aChgJHtbLi4ucHJlZml4ZXMsIHByb3AubmFtZV0uam9pbihcIi5cIil9LmApKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gcmVsRW50aXR5LmdldFN1YnNldFJvd3Moc3Vic2V0cywgc3Vic2V0c0ludGVybmFsLCBbXG4gICAgICAgICAgLi4ucHJlZml4ZXMsXG4gICAgICAgICAgYCR7cHJvcC5uYW1lfWAsXG4gICAgICAgIF0pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZmllbGQ6IHByb3AubmFtZSxcbiAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICByZWxhdGlvbkVudGl0eTogcHJvcC53aXRoLFxuICAgICAgICAgIHByZWZpeGVzLFxuICAgICAgICAgIGlzT3BlbjogY2hpbGRyZW4ubGVuZ3RoID4gMCxcbiAgICAgICAgICBoYXM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGNoaWxkcmVuLmV2ZXJ5KChjaGlsZCkgPT4gY2hpbGQuaGFzW3N1YnNldEtleV0pXTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgICAgaXNJbnRlcm5hbDogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgY2hpbGRyZW4uZXZlcnkoKGNoaWxkKSA9PiBjaGlsZC5pc0ludGVybmFsW3N1YnNldEtleV0pXTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpZWxkID0gWy4uLnByZWZpeGVzLCBwcm9wLm5hbWVdLmpvaW4oXCIuXCIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmllbGQ6IHByb3AubmFtZSxcbiAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICByZWxhdGlvbkVudGl0eTogcHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIgPyBwcm9wLndpdGggOiB1bmRlZmluZWQsXG4gICAgICAgIHByZWZpeGVzLFxuICAgICAgICBoYXM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdWJzZXRGaWVsZHMgPSBzdWJzZXRzW3N1YnNldEtleV07XG4gICAgICAgICAgICBjb25zdCBoYXMgPSBzdWJzZXRGaWVsZHMuc29tZSgoZikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gZiA9PT0gZmllbGQgfHwgZi5zdGFydHNXaXRoKGAke2ZpZWxkfS5gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGhhc107XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICAgIGlzSW50ZXJuYWw6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnRlcm5hbEZpZWxkcyA9IHN1YnNldHNJbnRlcm5hbFtzdWJzZXRLZXldID8/IFtdO1xuICAgICAgICAgICAgY29uc3QgaXNJbnRlcm5hbCA9IGludGVybmFsRmllbGRzLnNvbWUoKGYpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGYgPT09IGZpZWxkIHx8IGYuc3RhcnRzV2l0aChgJHtmaWVsZH0uYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBpc0ludGVybmFsXTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBzdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoXG4gICAgc3Vic2V0Um93czogRW50aXR5U3Vic2V0Um93W10sXG4gICAgc3Vic2V0S2V5OiBzdHJpbmcsXG4gICAgaW50ZXJuYWw6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGhhc0tleSA9IGludGVybmFsID8gXCJpc0ludGVybmFsXCIgOiBcImhhc1wiO1xuICAgIHJldHVybiBzdWJzZXRSb3dzXG4gICAgICAubWFwKChzdWJzZXRSb3cpID0+IHtcbiAgICAgICAgaWYgKHN1YnNldFJvdy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvdy5jaGlsZHJlbiwgc3Vic2V0S2V5LCBpbnRlcm5hbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3Vic2V0Um93W2hhc0tleV1bc3Vic2V0S2V5XSkge1xuICAgICAgICAgIHJldHVybiBzdWJzZXRSb3cucHJlZml4ZXMuY29uY2F0KHN1YnNldFJvdy5maWVsZCkuam9pbihcIi5cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKVxuICAgICAgLmZsYXQoKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVByb3AocHJvcDogRW50aXR5UHJvcCwgYXQ/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWF0KSB7XG4gICAgICB0aGlzLnByb3BzLnB1c2gocHJvcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvcHMuc3BsaWNlKGF0LCAwLCBwcm9wKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gIH1cblxuICBhbmFseXplU3Vic2V0RmllbGQoc3Vic2V0RmllbGQ6IHN0cmluZyk6IHtcbiAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgIHByb3BOYW1lOiBzdHJpbmc7XG4gIH1bXSB7XG4gICAgY29uc3QgYXJyID0gc3Vic2V0RmllbGQuc3BsaXQoXCIuXCIpO1xuXG4gICAgbGV0IGVudGl0eUlkID0gdGhpcy5pZDtcbiAgICBjb25zdCByZXN1bHQ6IHtcbiAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICBwcm9wTmFtZTogc3RyaW5nO1xuICAgIH1bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwcm9wTmFtZSA9IGFycltpXTtcbiAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgZW50aXR5SWQsXG4gICAgICAgIHByb3BOYW1lLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHByb3AgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICBpZiAoIXByb3ApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VudGl0eUlkfeydmCDsnpjrqrvrkJwg7ISc67iM7IWL7YKkICR7c3Vic2V0RmllbGR9YCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgZW50aXR5SWQgPSBwcm9wLndpdGg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBtb2RpZnlQcm9wKG5ld1Byb3A6IEVudGl0eVByb3AsIGF0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDsnbTsoIQg7ZSE66GtIOydtOumhCDsoIDsnqVcbiAgICBjb25zdCBvbGROYW1lID0gdGhpcy5wcm9wc1thdF0ubmFtZTtcblxuICAgIC8vIOyggOyepe2VoCDsl5Tti7Dti7BcbiAgICBjb25zdCBlbnRpdGllczogRW50aXR5W10gPSBbdGhpc107XG5cbiAgICAvLyDsnbTrpoTsnbQg67CU64CQIOqyveyasFxuICAgIGlmIChvbGROYW1lICE9PSBuZXdQcm9wLm5hbWUpIHtcbiAgICAgIC8vIOyghOyytCDsl5Tti7Dti7Dsl5DshJwg7ZiE7J6sIOyImOygleuQnCDtlITroa3snYQg7LC47KGw7ZWY6rOgIOyeiOuKlCDrqqjrk6Ag7ISc67iM7IWL7ZWE65OcIOywvuyVhOyEnCDsiJjsoJVcbiAgICAgIGNvbnN0IGFsbEVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgICBmb3IgKGNvbnN0IHJlbEVudGl0eUlkIG9mIGFsbEVudGl0eUlkcykge1xuICAgICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChyZWxFbnRpdHlJZCk7XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eVN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhyZWxFbnRpdHkuc3Vic2V0cyk7XG4gICAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIHJlbEVudGl0eVN1YnNldEtleXMpIHtcbiAgICAgICAgICBjb25zdCBzdWJzZXQgPSByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldO1xuXG4gICAgICAgICAgLy8g7ISc67iM7IWLIO2VhOuTnOulvCDsiJztmoztlZjrqbAsIOyXlO2LsO2LsC3tlITroa0g64uo7JyE66GcIOu2hOyEne2VnCDtm4Qg7ZiE7J6sIOyXlO2LsO2LsC3tlITroa3qs7wg7J287LmY7ZWY64qUIOqyveyasCDsiJjsoJUg7LKY66asXG4gICAgICAgICAgY29uc3QgbW9kaWZpZWRTdWJzZXRGaWVsZHMgPSBzdWJzZXQubWFwKChzdWJzZXRGaWVsZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYW5hbHl6ZWQgPSByZWxFbnRpdHkuYW5hbHl6ZVN1YnNldEZpZWxkKHN1YnNldEZpZWxkKTtcbiAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVkID0gYW5hbHl6ZWQubWFwKChhKSA9PlxuICAgICAgICAgICAgICBhLnByb3BOYW1lID09PSBvbGROYW1lICYmIGEuZW50aXR5SWQgPT09IHRoaXMuaWRcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uYSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWU6IG5ld1Byb3AubmFtZSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IGEsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8g67aE7ISd7ZWcIO2VhOuTnOulvCDri6Tsi5wg7ISc67iM7IWLIO2VhOuTnOuhnCDrs7XqtaxcbiAgICAgICAgICAgIHJldHVybiBtb2RpZmllZC5tYXAoKGEpID0+IGEucHJvcE5hbWUpLmpvaW4oXCIuXCIpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHN1YnNldC5qb2luKFwiLFwiKSAhPT0gbW9kaWZpZWRTdWJzZXRGaWVsZHMuam9pbihcIixcIikpIHtcbiAgICAgICAgICAgIHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV0gPSBtb2RpZmllZFN1YnNldEZpZWxkcztcbiAgICAgICAgICAgIGVudGl0aWVzLnB1c2gocmVsRW50aXR5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtlITroa0g7IiY7KCVXG4gICAgdGhpcy5wcm9wc1thdF0gPSBuZXdQcm9wO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZW50aXRpZXMubWFwKGFzeW5jIChlbnRpdHkpID0+IGVudGl0eS5zYXZlKCkpKTtcbiAgfVxuXG4gIGFzeW5jIGRlbFByb3AoYXQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOydtOyghCDtlITroa0g7J2066aEIOyggOyepVxuICAgIGNvbnN0IG9sZE5hbWUgPSB0aGlzLnByb3BzW2F0XS5uYW1lO1xuXG4gICAgLy8g7KCA7J6l7ZWgIOyXlO2LsO2LsFxuICAgIGNvbnN0IGVudGl0aWVzOiBFbnRpdHlbXSA9IFt0aGlzXTtcblxuICAgIC8vIOyghOyytCDsl5Tti7Dti7Dsl5DshJwg7ZiE7J6sIOyCreygnOuQnCDtlITroa3snYQg7LC47KGw7ZWY6rOgIOyeiOuKlCDrqqjrk6Ag7ISc67iM7IWL7ZWE65OcIOywvuyVhOyEnCDsoJzsmbhcbiAgICBjb25zdCBhbGxFbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgIGZvciAoY29uc3QgcmVsRW50aXR5SWQgb2YgYWxsRW50aXR5SWRzKSB7XG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChyZWxFbnRpdHlJZCk7XG4gICAgICBjb25zdCByZWxFbnRpdHlTdWJzZXRLZXlzID0gT2JqZWN0LmtleXMocmVsRW50aXR5LnN1YnNldHMpO1xuICAgICAgZm9yIChjb25zdCBzdWJzZXRLZXkgb2YgcmVsRW50aXR5U3Vic2V0S2V5cykge1xuICAgICAgICBjb25zdCBzdWJzZXQgPSByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldO1xuICAgICAgICAvLyDshJzruIzshYsg7ZWE65Oc66W8IOyInO2ajO2VmOupsCwg7JeU7Yuw7YuwLe2UhOuhrSDri6jsnITroZwg67aE7ISd7ZWcIO2bhCDtmITsnqwg7JeU7Yuw7YuwLe2UhOuhreqzvCDsnbzsuZjtlZjripQg6rK97JqwIOydtO2bhOydmCDtlYTrk5zrpbwg7KCc7Jm4XG4gICAgICAgIGNvbnN0IG1vZGlmaWVkU3Vic2V0RmllbGRzID0gc3Vic2V0XG4gICAgICAgICAgLm1hcCgoc3Vic2V0RmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFuYWx5emVkID0gcmVsRW50aXR5LmFuYWx5emVTdWJzZXRGaWVsZChzdWJzZXRGaWVsZCk7XG4gICAgICAgICAgICBpZiAoYW5hbHl6ZWQuZmluZCgoYSkgPT4gYS5wcm9wTmFtZSA9PT0gb2xkTmFtZSAmJiBhLmVudGl0eUlkID09PSB0aGlzLmlkKSkge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBzdWJzZXRGaWVsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maWx0ZXIobm9uTnVsbGFibGUpO1xuXG4gICAgICAgIGlmIChzdWJzZXQuam9pbihcIixcIikgIT09IG1vZGlmaWVkU3Vic2V0RmllbGRzLmpvaW4oXCIsXCIpKSB7XG4gICAgICAgICAgcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XSA9IG1vZGlmaWVkU3Vic2V0RmllbGRzO1xuICAgICAgICAgIGVudGl0aWVzLnB1c2gocmVsRW50aXR5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIO2YhOyerCDsl5Tti7Dti7DsnZgg7J24642x7Iqk7JeQ7IScIOygnOyZuFxuICAgIGZvciAoY29uc3QgaW5kZXggb2YgRW50aXR5TWFuYWdlci5nZXQodGhpcy5pZCkuaW5kZXhlcykge1xuICAgICAgaW5kZXguY29sdW1ucyA9IGluZGV4LmNvbHVtbnMuZmlsdGVyKChjb2wpID0+IGNvbC5uYW1lICE9PSBvbGROYW1lKTtcbiAgICB9XG5cbiAgICAvLyDtlITroa0g7IKt7KCcXG4gICAgdGhpcy5wcm9wcy5zcGxpY2UoYXQsIDEpO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZW50aXRpZXMubWFwKGFzeW5jIChlbnRpdHkpID0+IGVudGl0eS5zYXZlKCkpKTtcbiAgfVxuXG4gIGdldEVudGl0eUlkRnJvbVN1YnNldEZpZWxkKHN1YnNldEZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghc3Vic2V0RmllbGQuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5pZDtcbiAgICB9XG5cbiAgICAvLyDshJzruIzshYsg7ZWE65Oc7J2YIOuniOyngOunieydgCDtlITroa3snbTrr4DroZwg7KCc7Jm4XG4gICAgY29uc3QgYXJyID0gc3Vic2V0RmllbGQuc3BsaXQoXCIuXCIpLnNsaWNlKDAsIC0xKTtcblxuICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zrpbwg64K066Ck6rCA66m07IScIOuniOyngOunieycvOuhnCByZWxhdGlvbuuQnCDsl5Tti7Dti7Drpbwg7LC+7J2MXG4gICAgY29uc3QgbGFzdEVudGl0eUlkID0gYXJyLnJlZHVjZSgoZW50aXR5SWQsIGZpZWxkKSA9PiB7XG4gICAgICBjb25zdCByZWxQcm9wID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gZmllbGQpO1xuICAgICAgaWYgKCFyZWxQcm9wIHx8IHJlbFByb3AudHlwZSAhPT0gXCJyZWxhdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoeyBhcnIsIHRoaXNJZDogdGhpcy5pZCwgZW50aXR5SWQsIGZpZWxkIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOyemOuqu+uQnCDshJzruIzshYvtgqQgJHtzdWJzZXRGaWVsZH1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWxQcm9wLndpdGg7XG4gICAgfSwgdGhpcy5pZCk7XG4gICAgcmV0dXJuIGxhc3RFbnRpdHlJZDtcbiAgfVxuXG4gIGFzeW5jIG1vdmVQcm9wKGF0OiBudW1iZXIsIHRvOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcm9wID0gdGhpcy5wcm9wc1thdF07XG4gICAgY29uc3QgbmV3UHJvcHMgPSBbLi4udGhpcy5wcm9wc107XG4gICAgbmV3UHJvcHMuc3BsaWNlKHRvLCAwLCBwcm9wKTtcbiAgICBuZXdQcm9wcy5zcGxpY2UoYXQgPCB0byA/IGF0IDogYXQgKyAxLCAxKTtcbiAgICB0aGlzLnByb3BzID0gbmV3UHJvcHM7XG5cbiAgICBhd2FpdCB0aGlzLnNhdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlYTrk5zrqoXsnYQgXCLthYzsnbTruJTrqoUu7ZWE65Oc66qFXCIg7ZiV7Iud7Jy866GcIOuzgO2ZmFxuICAgKi9cbiAgZ2V0RnVsbEZpZWxkTmFtZShmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoZmllbGQuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuICAgIHJldHVybiBgJHt0aGlzLnRhYmxlfS4ke2ZpZWxkfWA7XG4gIH1cblxuICAvKipcbiAgICog7JeU7Yuw7Yuw7J2YIFBLIO2DgOyeheydhCDrsJjtmZjtlanri4jri6QuXG4gICAqIGlkIO2VhOuTnOydmCDtg4DsnoXsnYQg6riw7KSA7Jy866GcIFwiaW50ZWdlclwiIHwgXCJzdHJpbmdcIiB8IFwidXVpZFwi66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIGdldFBrVHlwZSgpOiBcImludGVnZXJcIiB8IFwic3RyaW5nXCIgfCBcInV1aWRcIiB7XG4gICAgY29uc3QgaWRQcm9wID0gdGhpcy5wcm9wc0RpY3QuaWQ7XG4gICAgaWYgKCFpZFByb3ApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5ICR7dGhpcy5pZH3sl5AgaWQg7ZWE65Oc6rCAIOyXhuyKteuLiOuLpGApO1xuICAgIH1cbiAgICBpZiAoaWRQcm9wLnR5cGUgPT09IFwic3RyaW5nXCIgfHwgaWRQcm9wLnR5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICByZXR1cm4gaWRQcm9wLnR5cGU7XG4gICAgfVxuICAgIHJldHVybiBcImludGVnZXJcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiDsl5Tti7Dti7DsnZggUEsgcHJvcOydhCDrsJjtmZjtlanri4jri6QuXG4gICAqIGxlbmd0aCDrk7Eg7IS467aAIOygleuztOyXkCDsoJHqt7ztlaAg65WMIOyCrOyaqe2VqeuLiOuLpC5cbiAgICovXG4gIGdldFBrUHJvcCgpOiBFbnRpdHlQcm9wIHtcbiAgICBjb25zdCBpZFByb3AgPSB0aGlzLnByb3BzRGljdC5pZDtcbiAgICBpZiAoIWlkUHJvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnRpdHkgJHt0aGlzLmlkfeyXkCBpZCDtlYTrk5zqsIAg7JeG7Iq164uI64ukYCk7XG4gICAgfVxuICAgIHJldHVybiBpZFByb3A7XG4gIH1cblxuICAvKipcbiAgICog7JeU7Yuw7Yuw7J2YIFBLIOuwsOyXtCDtg4DsnoXsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBMb2FkZXJRdWVyeeydmCBmcm9tSWRzIO2DgOyeheycvOuhnCDsgqzsmqnrkKnri4jri6QuXG4gICAqL1xuICBnZXRQa0FycmF5VHlwZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBrVHlwZSA9IHRoaXMuZ2V0UGtUeXBlKCk7XG4gICAgcmV0dXJuIHBrVHlwZSA9PT0gXCJpbnRlZ2VyXCIgPyBcIm51bWJlcltdXCIgOiBcInN0cmluZ1tdXCI7XG4gIH1cblxuICAvKipcbiAgICog7Lus65+8IOqwkiDrsLDsl7TsnZggVFMg7YOA7J6F7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICogSGFzTWFueSDroZzrjZTsnZggZnJvbUlkcyDtg4DsnoXsnLzroZwg7IKs7Jqp65Cp64uI64ukLiDroZzrjZTripQg67aA66qoIO2WieyXkOyEnCBmcm9tQ29sdW1uKOq4sOuzuCBpZCkg6rCS7J2EIOq6vOuDheuLiOuLpC5cbiAgICovXG4gIGdldENvbHVtbkFycmF5VHlwZShjb2x1bW46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGNvbHVtbiA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRQa0FycmF5VHlwZSgpO1xuICAgIH1cbiAgICBjb25zdCBwcm9wID1cbiAgICAgIHRoaXMucHJvcHNEaWN0W2NvbHVtbl0gPz9cbiAgICAgIHRoaXMucHJvcHMuZmluZChcbiAgICAgICAgKHApID0+XG4gICAgICAgICAgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHApICYmIHAuaGFzSm9pbkNvbHVtbikpICYmXG4gICAgICAgICAgYCR7cC5uYW1lfV9pZGAgPT09IGNvbHVtbixcbiAgICAgICk7XG4gICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKS5nZXRQa0FycmF5VHlwZSgpO1xuICAgIH1cbiAgICByZXR1cm4gaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSB8fCBpc051bWJlclNpbmdsZVByb3AocHJvcCkgPyBcIm51bWJlcltdXCIgOiBcInN0cmluZ1tdXCI7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQVFzQyxZQUFBO0NBQ1MscUJBQUE7Q0FnQnhCLFdBQUE7Q0FhMkIsZUFBQTtDQUNSLGNBQUE7Q0FDTyxnQkFBQTtDQUNLLG1CQUFBO0NBQ0ssV0FBQTtDQUdYLG9CQUFBO0NBRW5DLFNBQWIsTUFBb0I7RUFDbEI7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFLQTtFQUNBO0VBR0E7RUFHQTtFQUNBO0VBR0E7RUFHQSxRQUVJLENBQUM7RUFDTCxRQUVJLENBQUM7RUFDTCxhQUlJLENBQUM7RUFDTCxZQUVJLENBQUM7RUFDTCxjQUVJLENBQUM7RUFFTCxZQUFZLEVBQ1YsSUFDQSxVQUNBLE9BQ0EsT0FDQSxRQUNBLE1BQ0EsT0FDQSxTQUNBLFNBQ0EsU0FDYTtHQUViLEtBQUssS0FBSztHQUNWLEtBQUssV0FBVztHQUNoQixLQUFLLFFBQVEsU0FBUyxLQUFLO0dBQzNCLEtBQUssUUFBUSxTQUFTLFdBQVcsV0FBVyxXQUFXLFVBQVUsRUFBRSxDQUFDO0dBQ3BFLEtBQUssU0FBUztHQUNkLEtBQUssT0FBTztHQUdaLElBQUksT0FBTztJQUNULEtBQUssUUFBUSxNQUFNLEtBQUssU0FBUztLQUMvQixJQUFJLFdBQVcsSUFBSSxHQUNqQjtVQUFJLEtBQUssR0FBRyxTQUFTLFFBQVEsR0FDM0IsS0FBSyxLQUFLLEtBQUssR0FB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sonamu",
3
- "version": "0.13.7",
3
+ "version": "0.13.8",
4
4
  "description": "Sonamu — TypeScript Fullstack API Framework",
5
5
  "keywords": [
6
6
  "framework",
@@ -14,8 +14,10 @@ import {
14
14
  isBelongsToOneRelationProp,
15
15
  isEnumProp,
16
16
  isHasManyRelationProp,
17
+ isIntegerSingleProp,
17
18
  isInternalSubsetField,
18
19
  isManyToManyRelationProp,
20
+ isNumberSingleProp,
19
21
  isOneToOneRelationProp,
20
22
  isRelationProp,
21
23
  isVirtualCodeProp,
@@ -334,11 +336,10 @@ export class Entity {
334
336
  const loaderLines: string[] = [];
335
337
 
336
338
  for (const loader of nestedLoaders) {
337
- const { toTable, toCol, through, fromTable } = loader.manyJoin;
339
+ const { toTable, toCol, through, fromTable, fromCol } = loader.manyJoin;
338
340
 
339
- // fromTable의 Entity를 가져와서 PK 타입 확인
340
- const fromEntity = EntityManager.getByTable(fromTable);
341
- const fromIdsType = fromEntity.getPkArrayType();
341
+ // fromIds는 부모 행에서 꺼낸 fromCol 값이므로 그 칸의 타입을 따른다(fromColumn이 PK가 아닐 수 있음).
342
+ const fromIdsType = EntityManager.getByTable(fromTable).getColumnArrayType(fromCol);
342
343
 
343
344
  loaderLines.push(
344
345
  "{",
@@ -1395,4 +1396,25 @@ export class Entity {
1395
1396
  const pkType = this.getPkType();
1396
1397
  return pkType === "integer" ? "number[]" : "string[]";
1397
1398
  }
1399
+
1400
+ /**
1401
+ * 컬럼 값 배열의 TS 타입을 반환합니다.
1402
+ * HasMany 로더의 fromIds 타입으로 사용됩니다. 로더는 부모 행에서 fromColumn(기본 id) 값을 꺼냅니다.
1403
+ */
1404
+ getColumnArrayType(column: string): string {
1405
+ if (column === "id") {
1406
+ return this.getPkArrayType();
1407
+ }
1408
+ const prop =
1409
+ this.propsDict[column] ??
1410
+ this.props.find(
1411
+ (p) =>
1412
+ (isBelongsToOneRelationProp(p) || (isOneToOneRelationProp(p) && p.hasJoinColumn)) &&
1413
+ `${p.name}_id` === column,
1414
+ );
1415
+ if (isRelationProp(prop)) {
1416
+ return EntityManager.get(prop.with).getPkArrayType();
1417
+ }
1418
+ return isIntegerSingleProp(prop) || isNumberSingleProp(prop) ? "number[]" : "string[]";
1419
+ }
1398
1420
  }