sonamu 0.9.10 → 0.9.12

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.
@@ -54,7 +54,8 @@ var init_fixture_generator = __esmMin((() => {
54
54
  continue;
55
55
  }
56
56
  if (prop.name === "id") {
57
- if ("cone" in prop && prop.cone?.fixtureStrategy === "sequence") {
57
+ const hasDbSequence = prop.type === "integer" || prop.type === "bigInteger" || prop.type === "string" && "dbDefault" in prop && typeof prop.dbDefault === "string" && prop.dbDefault.includes("nextval");
58
+ if (hasDbSequence) {
58
59
  continue;
59
60
  }
60
61
  if (prop.type === "string") {
@@ -576,7 +577,7 @@ var init_fixture_generator = __esmMin((() => {
576
577
  const llmProps = entity.props.filter((p) => {
577
578
  if (isRelationProp(p)) return false;
578
579
  if (p.cone?.fixtureGenerator) return false;
579
- if (p.name === "id" && p.cone?.fixtureStrategy === "sequence") return false;
580
+ if (p.name === "id") return false;
580
581
  return !!p.cone?.note;
581
582
  });
582
583
  if (llmProps.length === 0) {
@@ -1095,7 +1096,7 @@ Rules:
1095
1096
  for (const { entity: entityName, data, explicitId } of generatedFixtures) {
1096
1097
  const entity = this.entityManager.get(entityName);
1097
1098
  const idProp = entity.props.find((p) => p.name === "id");
1098
- const usesSequence = !explicitId && (idProp?.type === "integer" || idProp?.type === "bigInteger" || idProp?.cone?.fixtureStrategy === "sequence");
1099
+ const usesSequence = !explicitId && (idProp?.type === "integer" || idProp?.type === "bigInteger" || idProp?.type === "string" && "dbDefault" in (idProp ?? {}) && typeof idProp?.dbDefault === "string" && (idProp?.dbDefault ?? "").includes("nextval"));
1099
1100
  const dataForRecord = usesSequence ? {
1100
1101
  ...data,
1101
1102
  id: Math.floor(Math.random() * 1e6)
@@ -1136,7 +1137,7 @@ Rules:
1136
1137
  }
1137
1138
  const fkColName = `${fkProp.name}_id`;
1138
1139
  const companionIdProp = companionEntity.props.find((p) => p.name === "id");
1139
- const usesSequence = companionIdProp?.type === "integer" || companionIdProp?.type === "bigInteger" || companionIdProp?.cone?.fixtureStrategy === "sequence";
1140
+ const usesSequence = companionIdProp?.type === "integer" || companionIdProp?.type === "bigInteger" || companionIdProp?.type === "string" && "dbDefault" in (companionIdProp ?? {}) && typeof companionIdProp?.dbDefault === "string" && (companionIdProp?.dbDefault ?? "").includes("nextval");
1140
1141
  const companionCount = companion.count ?? 1;
1141
1142
  const context = this.createContext();
1142
1143
  const companionFixtureRecords = [];
@@ -1239,4 +1240,4 @@ Rules:
1239
1240
  //#endregion
1240
1241
  init_fixture_generator();
1241
1242
  export { FixtureGenerator, init_fixture_generator };
1242
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1nZW5lcmF0b3IuanMiLCJuYW1lcyI6WyJzb3VyY2VEYjogS25leCIsInRhcmdldERiTmFtZTogXCJmaXh0dXJlXCIgfCBcInRlc3RcIiB8IFwicHJvZHVjdGlvbl9tYXN0ZXJcIiIsImVudGl0eU1hbmFnZXI6IHR5cGVvZiBFbnRpdHlNYW5hZ2VyIiwiZml4dHVyZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4iLCJhbGxGaXh0dXJlUmVjb3JkczogRml4dHVyZVJlY29yZFtdIiwicmVjb3Jkc1RvSW1wb3J0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdIiwibWFpblJlY29yZHNUb0ltcG9ydDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSIsImZuOiB1bmtub3duIiwiYXJnczogdW5rbm93bltdIiwiZW51bVZhbHVlczogc3RyaW5nW10iLCJwYXJzZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IiwicmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiIsImFwaUtleTogc3RyaW5nIHwgdW5kZWZpbmVkIiwiZ2VuZXJhdGVkRml4dHVyZXM6IEFycmF5PHtcbiAgICAgIGVudGl0eTogc3RyaW5nO1xuICAgICAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBleHBsaWNpdElkPzogYm9vbGVhbjtcbiAgICB9PiIsImF2YWlsYWJsZUlkczogbnVtYmVyW10iLCJmaXh0dXJlUmVjb3JkczogRml4dHVyZVJlY29yZFtdIiwiYWxsUmVzdWx0czogRml4dHVyZUltcG9ydFJlc3VsdFtdIiwiY29tcGFuaW9uRml4dHVyZVJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSIsInJlc29sdmVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtZ2VuZXJhdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmltcG9ydCB7IHR5cGUgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5UHJvcCwgdHlwZSBGaXh0dXJlSW1wb3J0UmVzdWx0LCB0eXBlIEZpeHR1cmVSZWNvcmQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLCBpc09uZVRvT25lUmVsYXRpb25Qcm9wLCBpc1JlbGF0aW9uUHJvcCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IERhdGFFeHBsb3JlciB9IGZyb20gXCIuL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IHR5cGUgRXhwbG9yZVdpdGhSZWxhdGlvbnNPcHRpb25zLCB0eXBlIEV4cGxvcmVXaXRoUmVsYXRpb25zUmVzdWx0IH0gZnJvbSBcIi4vZGF0YS1leHBsb3JlclwiO1xuaW1wb3J0IHsgZmFrZXJNYXBwaW5ncyB9IGZyb20gXCIuL2Zha2VyLW1hcHBpbmdzXCI7XG5pbXBvcnQgeyB0eXBlIEZha2VyTWFwcGluZ3MgfSBmcm9tIFwiLi9mYWtlci1tYXBwaW5nc1wiO1xuaW1wb3J0IHsgRml4dHVyZU1hbmFnZXIgfSBmcm9tIFwiLi9maXh0dXJlLW1hbmFnZXJcIjtcblxuZXhwb3J0IHR5cGUgTG9jYWxlID0gXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiO1xuXG5leHBvcnQgdHlwZSBGaXh0dXJlR2VuZXJhdG9yT3B0aW9ucyA9IHtcbiAgbG9jYWxlPzogTG9jYWxlO1xuICB1c2VMTE0/OiBib29sZWFuO1xuICBlbmFibGVMTE1DYWNoZT86IGJvb2xlYW47XG4gIGxsbU1vZGVsPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgR2VuZXJhdG9yQ29udGV4dCA9IHtcbiAgLyoqIOyDneyEsSDspJHsnbggZml4dHVyZeuTpCAo66mU66qo66asIOyDgSkgKi9cbiAgZml4dHVyZXM6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcblxuICAvKiog7LC47KGwIOuNsOydtO2EsCDsupDsi5wgKERhdGFFeHBsb3JlciDqsrDqs7wpICovXG4gIHJlZmVyZW5jZUNhY2hlOiBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPjtcblxuICAvKiog7J2066+4IGltcG9ydOuQnCDroIjsvZTrk5zrpbwg7LaU7KCB7ZWY7JesIOykkeuztSBpbXBvcnTrpbwg67Cp7KeA7ZWp64uI64ukICovXG4gIGltcG9ydGVkUmVjb3JkczogU2V0PHN0cmluZz47IC8vIFwiVXNlciMxMjNcIlxufTtcblxuZXhwb3J0IGNsYXNzIEZpeHR1cmVHZW5lcmF0b3Ige1xuICBwcml2YXRlIGRhdGFFeHBsb3JlcjogRGF0YUV4cGxvcmVyO1xuICBwcml2YXRlIGxvY2FsZTogTG9jYWxlO1xuICBwcml2YXRlIG1hcHBpbmdzOiBGYWtlck1hcHBpbmdzO1xuICBwcml2YXRlIGxsbUNhY2hlOiBNYXA8c3RyaW5nLCB1bmtub3duPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBlbnRpdHlDYWNoZTogTWFwPHN0cmluZywgRW50aXR5PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBvcHRpb25zOiBGaXh0dXJlR2VuZXJhdG9yT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNvdXJjZURiOiBLbmV4LFxuICAgIC8vIEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVz6rCAIGRiTmFtZSDrrLjsnpDsl7TsnYQg67Cb6riwIOuVjOusuOyXkCDsp4HsoJEg7IKs7Jqp7ZWY7KeAIOyViuyKteuLiOuLpFxuICAgIC8vIOuvuOuemCDtmZXsnqXshLHsnYQg7JyE7ZW0IEFQSSDsi5zqt7jri4jsspjsl5DripQg7Y+s7ZWo7Iuc7Lyw7Iq164uI64ukXG4gICAgX3RhcmdldERiOiBLbmV4LFxuICAgIHByaXZhdGUgdGFyZ2V0RGJOYW1lOiBcImZpeHR1cmVcIiB8IFwidGVzdFwiIHwgXCJwcm9kdWN0aW9uX21hc3RlclwiLFxuICAgIHByaXZhdGUgZW50aXR5TWFuYWdlcjogdHlwZW9mIEVudGl0eU1hbmFnZXIsXG4gICAgb3B0aW9ucz86IEZpeHR1cmVHZW5lcmF0b3JPcHRpb25zLFxuICApIHtcbiAgICB0aGlzLmRhdGFFeHBsb3JlciA9IG5ldyBEYXRhRXhwbG9yZXIoc291cmNlRGIsIGVudGl0eU1hbmFnZXIpO1xuICAgIHRoaXMubG9jYWxlID0gb3B0aW9ucz8ubG9jYWxlIHx8IFwia29cIjtcbiAgICB0aGlzLm1hcHBpbmdzID0gZmFrZXJNYXBwaW5ncztcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBsb2NhbGU6IG9wdGlvbnM/LmxvY2FsZSB8fCBcImtvXCIsXG4gICAgICB1c2VMTE06IG9wdGlvbnM/LnVzZUxMTSB8fCBmYWxzZSxcbiAgICAgIGVuYWJsZUxMTUNhY2hlOiBvcHRpb25zPy5lbmFibGVMTE1DYWNoZSAhPT0gZmFsc2UsXG4gICAgICBsbG1Nb2RlbDogb3B0aW9ucz8ubGxtTW9kZWwgfHwgXCJjbGF1ZGUtc29ubmV0LTQtNlwiLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRml4dHVyZSDsg53shLEgKOuLqOydvClcbiAgICogQHJldHVybnMg7IOd7ISx65CcIGZpeHR1cmUg642w7J207YSwICjrqZTrqqjrpqwg7IOBKVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGUoXG4gICAgZW50aXR5TmFtZTogc3RyaW5nLFxuICAgIG92ZXJyaWRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSxcbiAgICBjb250ZXh0OiBHZW5lcmF0b3JDb250ZXh0ID0gdGhpcy5jcmVhdGVDb250ZXh0KCksXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgICAvLyBFbnRpdHkg7LqQ7IuxOiDthYzsiqTtirjsl5DshJwgZW50aXR5IGNvbmUg7IiY7KCV7J20IOuwmOyYgeuQmOuPhOuhnSDrs7TsnqVcbiAgICBsZXQgZW50aXR5ID0gdGhpcy5lbnRpdHlDYWNoZS5nZXQoZW50aXR5TmFtZSk7XG4gICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgIGVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZW50aXR5TmFtZSk7XG4gICAgICB0aGlzLmVudGl0eUNhY2hlLnNldChlbnRpdHlOYW1lLCBlbnRpdHkpO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBJZCA9IGAke2VudGl0eU5hbWV9I3RlbXAjJHtEYXRlLm5vdygpfWA7IC8vIOyehOyLnCBJRFxuXG4gICAgLy8gTExNIHJvdyDri6jsnIQg7IOd7ISx7J2EIOychO2VnCDqs6DsnKAg7YKkICjqsJnsnYAgcm937J2YIO2VhOuTnOuTpOydtCDrj5nsnbztlZwgcm93S2V566W8IOqzteycoClcbiAgICBjb25zdCByb3dLZXkgPSB0aGlzLm9wdGlvbnMudXNlTExNID8gYCR7ZW50aXR5TmFtZX0jcm93IyR7RGF0ZS5ub3coKX1gIDogdW5kZWZpbmVkO1xuXG4gICAgLy8g6rCBIHByb3Drs4Qg6rCSIOyDneyEsVxuICAgIGNvbnN0IGZpeHR1cmU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgZW50aXR5LnByb3BzKSB7XG4gICAgICAvLyBWaXJ0dWFsIHByb3DsnYAg7Iqk7YK1XG4gICAgICBpZiAoXCJ2aXJ0dWFsXCIgaW4gcHJvcCAmJiBwcm9wLnZpcnR1YWwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGlkIHByb3Ag7LKY66asXG4gICAgICBpZiAocHJvcC5uYW1lID09PSBcImlkXCIpIHtcbiAgICAgICAgaWYgKFwiY29uZVwiIGluIHByb3AgJiYgcHJvcC5jb25lPy5maXh0dXJlU3RyYXRlZ3kgPT09IFwic2VxdWVuY2VcIikge1xuICAgICAgICAgIC8vIERCIHNlcXVlbmNl6rCAIOyekOuPmSDtlaDri7ntlZjrr4DroZwg7Iqk7YK1IChVc2VyIOuTsSlcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcC50eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgLy8gREIgREVGQVVMVCDsl4bripQgc3RyaW5nIFBLOiBhbHBoYW51bWVyaWMgMzLsnpAg7IOd7ISxIChiZXR0ZXItYXV0aCDsiqTtg4DsnbwpXG4gICAgICAgICAgY29uc3QgeyBmYWtlcjogX2Zha2VyIH0gPSBhd2FpdCBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIik7XG4gICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gX2Zha2VyLnN0cmluZy5hbHBoYW51bWVyaWMoMzIpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICAgICAgY29uc3QgeyBmYWtlcjogX2Zha2VyIH0gPSBhd2FpdCBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIik7XG4gICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gX2Zha2VyLnN0cmluZy51dWlkKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaW50ZWdlci9iaWdJbnRlZ2VyIFBLOiBnZW5lcmF0ZUJhdGNo7JeQ7IScIHRlbXBJZOulvCDrhKPsnLzrr4DroZwg7Jes6riw7ISgIOyKpO2CtVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gb3ZlcnJpZGXqsIAg7J6I7Jy866m0IOyCrOyaqVxuICAgICAgaWYgKHByb3AubmFtZSBpbiBvdmVycmlkZXMpIHtcbiAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gb3ZlcnJpZGVzW3Byb3AubmFtZV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25l7JeQ7IScIOyDneyEsSDsoITrnrUg7ZmV7J24XG4gICAgICBjb25zdCBjb25lID0gcHJvcC5jb25lO1xuXG4gICAgICAvLyAxLiBSZWxhdGlvbiBwcm9wIOyymOumrFxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIC8vIEJlbG9uZ3NUb09uZSAvIE9uZVRvT25lKGhhc0pvaW5Db2x1bW4p7J2AIEZLIOy7rOufvOuqhSh7cHJvcC5uYW1lfV9pZCnsnLzroZzrj4Qgb3ZlcnJpZGXrpbwg67Cb64qU64ukXG4gICAgICAgIGNvbnN0IGZrQ29sTmFtZSA9IGAke3Byb3AubmFtZX1faWRgO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZmtDb2xOYW1lIGluIG92ZXJyaWRlcyAmJlxuICAgICAgICAgIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKVxuICAgICAgICApIHtcbiAgICAgICAgICBmaXh0dXJlW2ZrQ29sTmFtZV0gPSBvdmVycmlkZXNbZmtDb2xOYW1lXTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uVmFsdWUgPSBhd2FpdCB0aGlzLmdlbmVyYXRlUmVsYXRpb25WYWx1ZShlbnRpdHksIHByb3AsIGNvbnRleHQpO1xuICAgICAgICAvLyBCZWxvbmdzVG9PbmUsIE9uZVRvT25lKGhhc0pvaW5Db2x1bW4p7J2YIOqyveyasCBmb3JlaWduIGtleSDsu6zrn7zrqoXsnLzroZwg7KCA7J6lXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgZml4dHVyZVtgJHtwcm9wLm5hbWV9X2lkYF0gPSByZWxhdGlvblZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpeHR1cmVbcHJvcC5uYW1lXSA9IHJlbGF0aW9uVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIGNvbmUubm90ZSArIExMTSDsgqzsmqkgKHVzZUxMTeydtOuptCBmaXh0dXJlR2VuZXJhdG9y67O064ukIOyasOyEoClcbiAgICAgIGlmIChjb25lPy5ub3RlICYmIHRoaXMub3B0aW9ucy51c2VMTE0pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBsbG1WYWx1ZSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVXaXRoTExNKGNvbmUubm90ZSwgcHJvcCwgZW50aXR5LCByb3dLZXkpO1xuICAgICAgICAgIC8vIHN0cmluZyDtg4DsnoXsnbTqs6AgbGVuZ3RoIOygnOyVveydtCDsnojsnLzrqbQg7LSI6rO8IOyLnCB0cnVuY2F0aW9uXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGxsbVZhbHVlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICBcImxlbmd0aFwiIGluIHByb3AgJiZcbiAgICAgICAgICAgIHR5cGVvZiBwcm9wLmxlbmd0aCA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgICAgbGxtVmFsdWUubGVuZ3RoID4gcHJvcC5sZW5ndGhcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGZpeHR1cmVbcHJvcC5uYW1lXSA9IGxsbVZhbHVlLnNsaWNlKDAsIHByb3AubGVuZ3RoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gbGxtVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBbRml4dHVyZUdlbmVyYXRvcl0gTExNIGdlbmVyYXRpb24gZmFpbGVkIGZvciAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV9LCBmYWxsaW5nIGJhY2sgdG8gZml4dHVyZUdlbmVyYXRvciBvciBkZWZhdWx0YCxcbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBmYWxsYmFjazogZml4dHVyZUdlbmVyYXRvciDihpIgZml4dHVyZURlZmF1bHQg4oaSIOq4sOuzuOqwkuycvOuhnCDqs4Tsho1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAzLiBmaXh0dXJlR2VuZXJhdG9yIOyCrOyaqVxuICAgICAgaWYgKGNvbmU/LmZpeHR1cmVHZW5lcmF0b3IpIHtcbiAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gYXdhaXQgdGhpcy5leGVjdXRlR2VuZXJhdG9yKGNvbmUuZml4dHVyZUdlbmVyYXRvciwgcHJvcCwgZW50aXR5KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIDQuIGZpeHR1cmVEZWZhdWx0IOyCrOyaqVxuICAgICAgaWYgKGNvbmU/LmZpeHR1cmVEZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gY29uZS5maXh0dXJlRGVmYXVsdDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIDUuIO2DgOyeheuzhCDquLDrs7gg7IOd7ISxXG4gICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBhd2FpdCB0aGlzLmdlbmVyYXRlRGVmYXVsdFZhbHVlKHByb3AsIGVudGl0eSk7XG4gICAgfVxuXG4gICAgLy8gNi4gZW1haWwg7ZWE65Oc6rCAIOyeiOqzoCBuYW1lIO2VhOuTnOqwgCDsnojsnLzrqbQsIGVtYWls7J2YIOuhnOy7rCDtjIztirjrpbwgbmFtZSDquLDrsJjsnLzroZwg67O07KCVXG4gICAgaWYgKFwiZW1haWxcIiBpbiBmaXh0dXJlICYmIHR5cGVvZiBmaXh0dXJlLmVtYWlsID09PSBcInN0cmluZ1wiICYmICEoXCJlbWFpbFwiIGluIG92ZXJyaWRlcykpIHtcbiAgICAgIGNvbnN0IG5hbWVWYWx1ZSA9IGZpeHR1cmUubmFtZSB8fCBmaXh0dXJlLnVzZXJuYW1lIHx8IGZpeHR1cmUuZnVsbF9uYW1lIHx8IGZpeHR1cmUubmFtZV9lbjtcbiAgICAgIGlmIChuYW1lVmFsdWUgJiYgdHlwZW9mIG5hbWVWYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCBkb21haW4gPSBmaXh0dXJlLmVtYWlsLnNwbGl0KFwiQFwiKVsxXSB8fCBcImV4YW1wbGUuY29tXCI7XG4gICAgICAgIGNvbnN0IHJvbWFuaXplZCA9IGF3YWl0IHRoaXMucm9tYW5pemVOYW1lKG5hbWVWYWx1ZSk7XG4gICAgICAgIGZpeHR1cmUuZW1haWwgPSBgJHtyb21hbml6ZWR9QCR7ZG9tYWlufWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNy4gcGFzc3dvcmQg7ZWE65OcIOyVlO2YuO2ZlFxuICAgIGlmIChcInBhc3N3b3JkXCIgaW4gZml4dHVyZSAmJiBmaXh0dXJlLnBhc3N3b3JkICYmIHR5cGVvZiBmaXh0dXJlLnBhc3N3b3JkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCBiY3J5cHQgPSBhd2FpdCBpbXBvcnQoXCJiY3J5cHRcIik7XG4gICAgICBmaXh0dXJlLnBhc3N3b3JkID0gYXdhaXQgYmNyeXB0Lmhhc2goZml4dHVyZS5wYXNzd29yZCwgMTApO1xuICAgIH1cblxuICAgIGNvbnRleHQuZml4dHVyZXMuc2V0KHRlbXBJZCwgZml4dHVyZSk7XG4gICAgcmV0dXJuIGZpeHR1cmU7XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb24g6rCSIOyDneyEsSArIOyekOuPmSBJbXBvcnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVSZWxhdGlvblZhbHVlKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHByb3A6IEVudGl0eVByb3AsXG4gICAgY29udGV4dDogR2VuZXJhdG9yQ29udGV4dCxcbiAgKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG4gICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaXh0dXJlR2VuZXJhdG9yOiAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV9IGlzIG5vdCBhIHJlbGF0aW9uIHByb3BgKTtcbiAgICB9XG5cbiAgICAvLyBCZWxvbmdzVG9PbmUsIE9uZVRvT25lKGhhc0pvaW5Db2x1bW4p66eMIOyymOumrFxuICAgIGlmIChcbiAgICAgICFpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJlxuICAgICAgIShpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbilcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmUgPSBwcm9wLmNvbmU7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IGNvbmU/LmRhdGFTb3VyY2U7XG5cbiAgICAvLyBEYXRhRXhwbG9yZXLroZwg7LC47KGwIOuNsOydtO2EsCDsobDtmowgKHNvdXJjZURiKVxuICAgIC8vIOq0gOqzhCDssrTsnbjsnYQg65Sw65286rCA6riwIOychO2VtCBleHBsb3JlV2l0aFJlbGF0aW9ucyDsgqzsmqlcbiAgICBpZiAoZGF0YVNvdXJjZSkge1xuICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtwcm9wLndpdGh9OiR7SlNPTi5zdHJpbmdpZnkoZGF0YVNvdXJjZSl9YDtcblxuICAgICAgaWYgKCFjb250ZXh0LnJlZmVyZW5jZUNhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgICAgY29uc3QgZXhwbG9yZVJlc3VsdCA9IGF3YWl0IHRoaXMuZGF0YUV4cGxvcmVyLmV4cGxvcmVXaXRoUmVsYXRpb25zKHByb3Aud2l0aCwge1xuICAgICAgICAgIHN0cmF0ZWd5OiBkYXRhU291cmNlLnN0cmF0ZWd5LFxuICAgICAgICAgIGxpbWl0OlxuICAgICAgICAgICAgKChkYXRhU291cmNlLmNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk/LmxpbWl0IGFzXG4gICAgICAgICAgICAgIHwgbnVtYmVyXG4gICAgICAgICAgICAgIHwgdW5kZWZpbmVkKSB8fCAxMCxcbiAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zOiB0cnVlLFxuICAgICAgICAgIG1heERlcHRoOiAzLFxuICAgICAgICAgIC4uLihkYXRhU291cmNlLmNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCksXG4gICAgICAgIH0pO1xuICAgICAgICBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLnNldChjYWNoZUtleSwgZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMpO1xuXG4gICAgICAgIC8vIOyhsO2ajO2VnCDrjbDsnbTthLDsmYAg6rSA6rOE65CcIOuqqOuToCDsl5Tti7Dti7DrpbwgdGFyZ2V0RGLsl5AgaW1wb3J0XG4gICAgICAgIGF3YWl0IHRoaXMuaW1wb3J0RXhwbG9yZVJlc3VsdChleHBsb3JlUmVzdWx0LCBjb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IGNvbnRleHQucmVmZXJlbmNlQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICAgIGlmIChjYW5kaWRhdGVzICYmIGNhbmRpZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyDrnpzrjaTtlZjqsowg7ZWY64KYIOyEoO2DnVxuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IGNhbmRpZGF0ZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2FuZGlkYXRlcy5sZW5ndGgpXTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkLmlkIGFzIG51bWJlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRhU291cmNl6rCAIOyXhuydhCDrlYwg7J6Q64+Z7Jy866GcIGZpeHR1cmUgRELsl5DshJwg7KGw7ZqMIOyLnOuPhFxuICAgIC8vIOq0gOqzhCDssrTsnbjsnYQg65Sw65286rCA6riwIOychO2VtCBleHBsb3JlV2l0aFJlbGF0aW9ucyDsgqzsmqlcbiAgICBjb25zdCBhdXRvS2V5ID0gYCR7cHJvcC53aXRofTphdXRvYDtcbiAgICBpZiAoIWNvbnRleHQucmVmZXJlbmNlQ2FjaGUuaGFzKGF1dG9LZXkpKSB7XG4gICAgICAvLyBmaXh0dXJlIERCKHNvdXJjZURiKeyXkOyEnCDsnpDrj5kg7KGw7ZqMICjqtIDqs4Qg7Y+s7ZWoKVxuICAgICAgY29uc3QgYXV0b0V4cGxvcmVSZXN1bHQgPSBhd2FpdCB0aGlzLmRhdGFFeHBsb3Jlci5leHBsb3JlV2l0aFJlbGF0aW9ucyhwcm9wLndpdGgsIHtcbiAgICAgICAgc3RyYXRlZ3k6IFwicmFuZG9tXCIsXG4gICAgICAgIGxpbWl0OiAxMCxcbiAgICAgICAgaW5jbHVkZVJlbGF0aW9uczogdHJ1ZSxcbiAgICAgICAgbWF4RGVwdGg6IDMsXG4gICAgICB9KTtcbiAgICAgIGNvbnRleHQucmVmZXJlbmNlQ2FjaGUuc2V0KGF1dG9LZXksIGF1dG9FeHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcyk7XG5cbiAgICAgIC8vIOyhsO2ajO2VnCDrjbDsnbTthLDsmYAg6rSA6rOE65CcIOuqqOuToCDsl5Tti7Dti7DrpbwgdGFyZ2V0RGLsl5AgaW1wb3J0XG4gICAgICBpZiAoYXV0b0V4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbXBvcnRFeHBsb3JlUmVzdWx0KGF1dG9FeHBsb3JlUmVzdWx0LCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhdXRvQ2FuZGlkYXRlcyA9IGNvbnRleHQucmVmZXJlbmNlQ2FjaGUuZ2V0KGF1dG9LZXkpO1xuICAgIGlmIChhdXRvQ2FuZGlkYXRlcyAmJiBhdXRvQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyDrnpzrjaTtlZjqsowg7ZWY64KYIOyEoO2DnVxuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBhdXRvQ2FuZGlkYXRlc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhdXRvQ2FuZGlkYXRlcy5sZW5ndGgpXTtcbiAgICAgIHJldHVybiBzZWxlY3RlZC5pZCBhcyBudW1iZXI7XG4gICAgfVxuXG4gICAgLy8g7LC47KGwIOuNsOydtO2EsOqwgCDsl4bsnLzrqbQgbnVsbCDrsJjtmZggKG51bGxhYmxl7J24IOqyveyasClcbiAgICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gbnVsbGFibGXsnbQg7JWE64uI6rOgIOuNsOydtO2EsOuPhCDsl4bsnLzrqbQg7JeQ65+sXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZpeHR1cmVHZW5lcmF0b3I6ICR7ZW50aXR5LmlkfS4ke3Byb3AubmFtZX3sl5Ag7ZWE7JqU7ZWcICR7cHJvcC53aXRofSDrjbDsnbTthLDqsIAg7JeG7Iq164uI64ukLiBgICtcbiAgICAgICAgYOuovOyggCAke3Byb3Aud2l0aH3rpbwg7IOd7ISx7ZWY6rGw64KYIGNvbmUuZGF0YVNvdXJjZeulvCDshKTsoJXtlZjshLjsmpQuYCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxvcmVXaXRoUmVsYXRpb25zIOqysOqzvOulvCB0YXJnZXREYuyXkCBpbXBvcnRcbiAgICpcbiAgICog6rSA6rOEIOyytOyduOydhCDrlLDrnbzqsIQg6rKw6rO8KG1haW4gKyByZWxhdGVkKeulvCDrqqjrkZAgaW1wb3J07ZWp64uI64ukLlxuICAgKiDsnZjsobTshLEg7Iic7ISc64qUIEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVz6rCAIOyekOuPmeycvOuhnCDsspjrpqztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGltcG9ydEV4cGxvcmVSZXN1bHQoXG4gICAgZXhwbG9yZVJlc3VsdDogRXhwbG9yZVdpdGhSZWxhdGlvbnNSZXN1bHQsXG4gICAgY29udGV4dDogR2VuZXJhdG9yQ29udGV4dCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYWxsRml4dHVyZVJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSA9IFtdO1xuXG4gICAgLy8gMS4gUmVsYXRlZCBlbnRpdGllcyBpbXBvcnQgKENvbXBhbnksIERlcGFydG1lbnQg65OxKVxuICAgIGZvciAoY29uc3QgW2VudGl0eUlkLCByZWNvcmRzXSBvZiBleHBsb3JlUmVzdWx0LnJlbGF0ZWQuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgIGNvbnN0IHJlY29yZHNUb0ltcG9ydDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuY3lhbihgSW1wb3J0aW5nIHJlbGF0ZWQgZW50aXR5OiAke2VudGl0eUlkfSAoJHtyZWNvcmRzLmxlbmd0aH0gcmVjb3JkcylgKSxcbiAgICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgcmVjb3Jkcykge1xuICAgICAgICBjb25zdCByZWNvcmRLZXkgPSBgJHtlbnRpdHlJZH0jJHtyZWNvcmQuaWR9YDtcbiAgICAgICAgaWYgKCFjb250ZXh0LmltcG9ydGVkUmVjb3Jkcy5oYXMocmVjb3JkS2V5KSkge1xuICAgICAgICAgIHJlY29yZHNUb0ltcG9ydC5wdXNoKHJlY29yZCk7XG4gICAgICAgICAgY29udGV4dC5pbXBvcnRlZFJlY29yZHMuYWRkKHJlY29yZEtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZHNUb0ltcG9ydC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHNUb0ltcG9ydCkge1xuICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgICAgYCAgLSBQcm9jZXNzaW5nICR7ZW50aXR5SWR9IHJlY29yZDpgLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHJlY29yZCkuc2xpY2UoMCwgMTAwKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZml4dHVyZVJlY29yZHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5jcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgcmVjb3JkIGFzIHsgaWQ6IG51bWJlciB8IHN0cmluZzsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfSxcbiAgICAgICAgICAgIHsgX2RiOiB0aGlzLnNvdXJjZURiLCBzaW5nbGVSZWNvcmQ6IHRydWUgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGFsbEZpeHR1cmVSZWNvcmRzLnB1c2goLi4uZml4dHVyZVJlY29yZHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gTWFpbiBlbnRpdHkgaW1wb3J0IChFbXBsb3llZSDrk7EpXG4gICAgY29uc3QgbWFpbkVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZXhwbG9yZVJlc3VsdC5tYWluLmVudGl0eUlkKTtcbiAgICBjb25zdCBtYWluUmVjb3Jkc1RvSW1wb3J0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0gW107XG5cbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgIGBJbXBvcnRpbmcgbWFpbiBlbnRpdHk6ICR7ZXhwbG9yZVJlc3VsdC5tYWluLmVudGl0eUlkfSAoJHtleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGh9IHJlY29yZHMpYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcykge1xuICAgICAgY29uc3QgcmVjb3JkS2V5ID0gYCR7ZXhwbG9yZVJlc3VsdC5tYWluLmVudGl0eUlkfSMke3JlY29yZC5pZH1gO1xuICAgICAgaWYgKCFjb250ZXh0LmltcG9ydGVkUmVjb3Jkcy5oYXMocmVjb3JkS2V5KSkge1xuICAgICAgICBtYWluUmVjb3Jkc1RvSW1wb3J0LnB1c2gocmVjb3JkKTtcbiAgICAgICAgY29udGV4dC5pbXBvcnRlZFJlY29yZHMuYWRkKHJlY29yZEtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1haW5SZWNvcmRzVG9JbXBvcnQubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgbWFpblJlY29yZHNUb0ltcG9ydCkge1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgIGAgIC0gUHJvY2Vzc2luZyAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0gcmVjb3JkOmAsXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHJlY29yZCkuc2xpY2UoMCwgMTAwKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZml4dHVyZVJlY29yZHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5jcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgICAgICAgIG1haW5FbnRpdHksXG4gICAgICAgICAgcmVjb3JkIGFzIHsgaWQ6IG51bWJlciB8IHN0cmluZzsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfSxcbiAgICAgICAgICB7IF9kYjogdGhpcy5zb3VyY2VEYiwgc2luZ2xlUmVjb3JkOiB0cnVlIH0sXG4gICAgICAgICk7XG4gICAgICAgIGFsbEZpeHR1cmVSZWNvcmRzLnB1c2goLi4uZml4dHVyZVJlY29yZHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMuIOuqqOuToCBmaXh0dXJl66W8IO2VnCDrsojsl5Ag7IK97J6FICjsnZjsobTshLEg7Iic7IScIOyekOuPmSDsspjrpqwpXG4gICAgaWYgKGFsbEZpeHR1cmVSZWNvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKHRoaXMudGFyZ2V0RGJOYW1lLCBhbGxGaXh0dXJlUmVjb3Jkcyk7XG5cbiAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICAgIGBBdXRvLWltcG9ydGVkICR7ZXhwbG9yZVJlc3VsdC5tYWluLmVudGl0eUlkfSB3aXRoIHJlbGF0aW9uczogYCArXG4gICAgICAgICAgICAgIGAke2V4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aH0gbWFpbiArICR7ZXhwbG9yZVJlc3VsdC5yZWxhdGVkLnNpemV9IHJlbGF0ZWQgZW50aXRpZXNgLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGZpeHR1cmVHZW5lcmF0b3Ig7Iuk7ZaJIChGYWtlci5qc+unjCDsp4Dsm5ApXG4gICAqXG4gICAqIGZha2VyLiog7ZiV7Iud7J2YIO2RnO2YhOyLneydhCDslYjsoITtlZjqsowg7YyM7Iux7ZWY7JesIOyLpO2Wie2VqeuLiOuLpC5cbiAgICog7JiIOiBcImZha2VyLmludGVybmV0LmVtYWlsKClcIiDihpIgZmFrZXIuaW50ZXJuZXQuZW1haWwoKVxuICAgKiDsmIg6IFwiZmFrZXIubG9yZW0ud29yZHMoMylcIiDihpIgZmFrZXIubG9yZW0ud29yZHMoMylcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUdlbmVyYXRvcihcbiAgICBnZW5lcmF0b3I6IHN0cmluZyxcbiAgICBwcm9wOiBFbnRpdHlQcm9wLFxuICAgIGVudGl0eTogRW50aXR5LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAvLyBGYWtlci5qcyDtkZztmITsi53rp4wg7KeA7JuQXG4gICAgaWYgKGdlbmVyYXRvci5zdGFydHNXaXRoKFwiZmFrZXIuXCIpKSB7XG4gICAgICAvLyB1c2VybmFtZeydtOuCmCBuYW1lIO2VhOuTnOuKlCDtlZzqta3slrQgZmFrZXIg7IKs7JqpXG4gICAgICBjb25zdCBpc05hbWVGaWVsZCA9IHByb3AubmFtZSA9PT0gXCJ1c2VybmFtZVwiIHx8IHByb3AubmFtZSA9PT0gXCJuYW1lXCI7XG4gICAgICBjb25zdCBmYWtlck1vZHVsZSA9IGF3YWl0IGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKTtcbiAgICAgIGNvbnN0IGZha2VyID0gaXNOYW1lRmllbGQgPyBmYWtlck1vZHVsZS5mYWtlcktPIDogZmFrZXJNb2R1bGUuZmFrZXI7XG4gICAgICBjb25zdCBleHByID0gZ2VuZXJhdG9yLnNsaWNlKDYpOyAvLyBcImZha2VyLlwiIOygnOqxsFxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyDtlajsiJgg6rK966Gc7JmAIOyduOyekCDtjIzsi7FcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBleHByLm1hdGNoKC9eKFtcXHcuXSspKD86XFwoKC4qPylcXCkpPyQvKTtcbiAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBGaXh0dXJlR2VuZXJhdG9yOiBJbnZhbGlkIGZha2VyIGV4cHJlc3Npb24gZm9yICR7cHJvcC5uYW1lfTogJHtnZW5lcmF0b3J9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgWywgcGF0aCwgYXJnc1N0cl0gPSBtYXRjaDtcbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcblxuICAgICAgICAvLyBmYWtlciDqsJ3ssrTsl5DshJwg7ZWo7IiYIOywvuq4sFxuICAgICAgICBsZXQgZm46IHVua25vd24gPSBmYWtlcjtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gXCJvYmplY3RcIiAmJiBmbiAhPT0gbnVsbCAmJiBwYXJ0IGluIGZuKSB7XG4gICAgICAgICAgICBmbiA9IChmbiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbcGFydF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRml4dHVyZUdlbmVyYXRvcjogSW52YWxpZCBmYWtlciBwYXRoIGZvciAke3Byb3AubmFtZX06IGZha2VyLiR7cGF0aH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDtlajsiJjqsIAg7JWE64uI66m0IOyXkOufrFxuICAgICAgICBpZiAodHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpeHR1cmVHZW5lcmF0b3I6IGZha2VyLiR7cGF0aH0gaXMgbm90IGEgZnVuY3Rpb24gKGZvciAke3Byb3AubmFtZX0pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYXJnczogdW5rbm93bltdID0gW107XG4gICAgICAgIGlmIChhcmdzU3RyPy50cmltKCkpIHtcbiAgICAgICAgICBhcmdzID0gdGhpcy5wYXJzZUdlbmVyYXRvckFyZ3MoYXJnc1N0ciwgcHJvcC5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmbiguLi5hcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGV4ZWN1dGUgZ2VuZXJhdG9yIFwiJHtnZW5lcmF0b3J9XCIgZm9yICR7cHJvcC5uYW1lfSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQ6YCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZURlZmF1bHRWYWx1ZShwcm9wLCBlbnRpdHkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZha2VyIOydtOyZuOydmCDtkZztmITsi53snYAg7KeA7JuQ7ZWY7KeAIOyViuydjFxuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgVW5zdXBwb3J0ZWQgZ2VuZXJhdG9yIGV4cHJlc3Npb24gZm9yICR7cHJvcC5uYW1lfTogJHtnZW5lcmF0b3J9LiBPbmx5IGZha2VyLiogZXhwcmVzc2lvbnMgYXJlIHN1cHBvcnRlZC4gVXNpbmcgZGVmYXVsdCB2YWx1ZS5gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZURlZmF1bHRWYWx1ZShwcm9wLCBlbnRpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VhOuTnOydmCDtg4DsnoXqs7wg7J2066aE7J2EIOu2hOyEne2VmOyXrCDsoIHsoIjtlZwg6riw67O46rCS7J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICog7Jqw7ISg7Iic7JyEOlxuICAgKiAxLiDtlYTrk5zrqoUg7Yyo7YS0IOunpOy5rSAoc2FsYXJ5LCBidWRnZXQg65OxIOydmOuvuOyeiOuKlCDrjbDsnbTthLApXG4gICAqIDIuIO2KueyImCDsvIDsnbTsiqQgKERlcGFydG1lbnQgbmFtZSDrk7Eg64+E66mU7J24IOyngOyLnSlcbiAgICogMy4g67Cw7Je0IO2DgOyehSAoSlNPTiDrsLDsl7QpXG4gICAqIDQuIEVudW0g7YOA7J6FXG4gICAqIDUuIO2DgOyeheuzhCDquLDrs7jqsJJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVEZWZhdWx0VmFsdWUocHJvcDogRW50aXR5UHJvcCwgZW50aXR5PzogRW50aXR5KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgZmFrZXJNb2R1bGUgPSBhd2FpdCBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIik7XG4gICAgY29uc3QgZmFrZXIgPSBmYWtlck1vZHVsZS5mYWtlcjtcbiAgICBjb25zdCBmYWtlcktPID0gZmFrZXJNb2R1bGUuZmFrZXJLTztcbiAgICBjb25zdCBmYWtlckpBID0gZmFrZXJNb2R1bGUuZmFrZXJKQTtcblxuICAgIGNvbnN0IGxvY2FsZUZha2VyID0gdGhpcy5sb2NhbGUgPT09IFwia29cIiA/IGZha2VyS08gOiB0aGlzLmxvY2FsZSA9PT0gXCJqYVwiID8gZmFrZXJKQSA6IGZha2VyO1xuXG4gICAgLyoqXG4gICAgICogMS4gRW50aXR5LXNwZWNpZmljIO2KueyImCDsvIDsnbTsiqTrpbwg66i87KCAIOyymOumrO2VqeuLiOuLpC5cbiAgICAgKiBmaWVsZF9wYXR0ZXJuc+uztOuLpCDsmrDshKDtlZjsl6wsIO2KueyglSDsl5Tti7Dti7DsnZgg7ZWE65Oc7JeQIOuPhOuplOyduOyXkCDrp57ripQg6rCS7J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICAgKiDsmIg6IERlcGFydG1lbnQubmFtZSDihpIg7ZWc6rWt7Ja0IOu2gOyEnOuqhSAo7IKs656MIOydtOumhOydtCDslYTri5gpXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBEZXBhcnRtZW50IG5hbWXsnYAg7ZWc6rWt7Ja0IOu2gOyEnOuqhSDrqqnroZ3sl5DshJwg7ISg7YOd7ZWp64uI64ukLlxuICAgICAqIOqzoOycoOyEseydhCDsnITtlbQgNzAlIO2ZleuloOuhnCBwcmVmaXgvc3VmZml466W8IOy2lOqwgO2VqeuLiOuLpC5cbiAgICAgKi9cbiAgICBpZiAoZW50aXR5Py5pZCA9PT0gXCJEZXBhcnRtZW50XCIgJiYgcHJvcC5uYW1lID09PSBcIm5hbWVcIikge1xuICAgICAgY29uc3QgZGVwYXJ0bWVudHMgPSBbXG4gICAgICAgIFwi6rCc67Cc7YyAXCIsXG4gICAgICAgIFwi6riw7ZqN7YyAXCIsXG4gICAgICAgIFwi66eI7LyA7YyF7YyAXCIsXG4gICAgICAgIFwi7JiB7JeF7YyAXCIsXG4gICAgICAgIFwi7J247IKs7YyAXCIsXG4gICAgICAgIFwi7LSd66y07YyAXCIsXG4gICAgICAgIFwi7J6s66y07YyAXCIsXG4gICAgICAgIFwi7ZqM6rOE7YyAXCIsXG4gICAgICAgIFwi67KV66y07YyAXCIsXG4gICAgICAgIFwi65SU7J6Q7J247YyAXCIsXG4gICAgICAgIFwiSVTtjIBcIixcbiAgICAgICAgXCLqs6DqsJ3sp4Dsm5DtjIBcIixcbiAgICAgICAgXCLtkojsp4jqtIDrpqztjIBcIixcbiAgICAgICAgXCLsl7DqtazqsJzrsJztjIBcIixcbiAgICAgICAgXCLsg53sgrDtjIBcIixcbiAgICAgICAgXCLqtazrp6TtjIBcIixcbiAgICAgICAgXCLrrLzrpZjtjIBcIixcbiAgICAgIF07XG4gICAgICBjb25zdCBwcmVmaXhlcyA9IFtcIuyLoOq3nFwiLCBcIu2Gte2VqVwiLCBcIuyghOuetVwiLCBcIuq4gOuhnOuyjFwiLCBcIuuUlOyngO2EuFwiLCBcIu2VteyLrFwiXTtcbiAgICAgIGNvbnN0IHN1ZmZpeGVzID0gW1wiMe2MgFwiLCBcIjLtjIBcIiwgXCIz7YyAXCIsIFwiQe2MgFwiLCBcIkLtjIBcIiwgXCLrs7jrtoBcIiwgXCLshLzthLBcIiwgXCLqt7jro7lcIl07XG5cbiAgICAgIGNvbnN0IGRlcHQgPSBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChkZXBhcnRtZW50cyk7XG5cbiAgICAgIGNvbnN0IHJhbmRvbSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICBpZiAocmFuZG9tID4gMC43KSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IGZha2VyLmhlbHBlcnMuYXJyYXlFbGVtZW50KHByZWZpeGVzKTtcbiAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0gJHtkZXB0fWA7XG4gICAgICB9XG4gICAgICBpZiAocmFuZG9tID4gMC40KSB7XG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IGZha2VyLmhlbHBlcnMuYXJyYXlFbGVtZW50KHN1ZmZpeGVzKTtcbiAgICAgICAgcmV0dXJuIGAke2RlcHR9ICR7c3VmZml4fWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVwdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAyLiDtlYTrk5zrqoXsl5DshJwg7J2Y66+466W8IOy2lOuhoO2VmOyXrCDtmITsi6TsoIHsnbgg642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICAgKiDsmIg6IHNhbGFyeSDihpIgMzBNfjE1ME0gKO2VnOq1rSDsl7DrtIkg67KU7JyEKVxuICAgICAqICAgICBidWRnZXQg4oaSIDEwTX41MDBNICjtlITroZzsoJ3tirgg7JiI7IKwIOuylOychClcbiAgICAgKi9cbiAgICBjb25zdCBsb2NhbGVNYXBwaW5ncyA9IHRoaXMubWFwcGluZ3NbdGhpcy5sb2NhbGVdIHx8IHRoaXMubWFwcGluZ3MuZW47XG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBwcm9wLm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csIFwiXCIpO1xuXG4gICAgZm9yIChjb25zdCBbcGF0dGVybiwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhsb2NhbGVNYXBwaW5ncy5maWVsZF9wYXR0ZXJucykpIHtcbiAgICAgIGlmIChub3JtYWxpemVkTmFtZS5pbmNsdWRlcyhwYXR0ZXJuLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUZha2VyRXhwcmVzc2lvbihjb25maWcuZmFrZXIsIHByb3ApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGV4ZWN1dGUgZmllbGQgcGF0dGVybiBcIiR7cGF0dGVybn1cIiBmb3IgJHtwcm9wLm5hbWV9LCBmYWxsaW5nIGJhY2s6YCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogMy4gSlNPTiDtg4DsnoXsnbTrqbTshJwg67Cw7Je07J24IOqyveyasCAoU29uYW11RmlsZVtdLCBzdHJpbmdbXSDrk7EpXG4gICAgICog7ZWE65Oc66qFIO2MqO2EtOydhCDrs7Tqs6Ag7KCB7KCI7ZWcIOuwsOyXtCDrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgICAqL1xuICAgIGlmIChwcm9wLnR5cGUgPT09IFwianNvblwiICYmIFwiaWRcIiBpbiBwcm9wICYmIHByb3AuaWQpIHtcbiAgICAgIGlmIChwcm9wLmlkLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVBcnJheVZhbHVlKHByb3AsIGVudGl0eSwgZmFrZXIsIGxvY2FsZUZha2VyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogNC4gRW51bSDtg4DsnoXsnYAg7KCV7J2Y65CcIOqwkiDspJEg7ZWY64KY66W8IOuenOuNpCDshKDtg53tlanri4jri6QgKi9cbiAgICBpZiAocHJvcC50eXBlID09PSBcImVudW1cIikge1xuICAgICAgbGV0IGVudW1WYWx1ZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGlmIChcImVudW1cIiBpbiBwcm9wICYmIEFycmF5LmlzQXJyYXkocHJvcC5lbnVtKSAmJiBwcm9wLmVudW0ubGVuZ3RoID4gMCkge1xuICAgICAgICBlbnVtVmFsdWVzID0gcHJvcC5lbnVtO1xuICAgICAgfSBlbHNlIGlmIChcImlkXCIgaW4gcHJvcCAmJiBwcm9wLmlkICYmIGVudGl0eT8uZW51bUxhYmVscz8uW3Byb3AuaWRdKSB7XG4gICAgICAgIGVudW1WYWx1ZXMgPSBPYmplY3Qua2V5cyhlbnRpdHkuZW51bUxhYmVsc1twcm9wLmlkXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbnVtVmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGZha2VyLmhlbHBlcnMuYXJyYXlFbGVtZW50KGVudW1WYWx1ZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3AubnVsbGFibGUgPyBudWxsIDogXCJVTktOT1dOXCI7XG4gICAgfVxuXG4gICAgaWYgKHByb3AudHlwZSA9PT0gXCJlbnVtW11cIikge1xuICAgICAgbGV0IGVudW1WYWx1ZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGlmIChcImVudW1cIiBpbiBwcm9wICYmIEFycmF5LmlzQXJyYXkocHJvcC5lbnVtKSAmJiBwcm9wLmVudW0ubGVuZ3RoID4gMCkge1xuICAgICAgICBlbnVtVmFsdWVzID0gcHJvcC5lbnVtO1xuICAgICAgfSBlbHNlIGlmIChcImlkXCIgaW4gcHJvcCAmJiBwcm9wLmlkICYmIGVudGl0eT8uZW51bUxhYmVscz8uW3Byb3AuaWRdKSB7XG4gICAgICAgIGVudW1WYWx1ZXMgPSBPYmplY3Qua2V5cyhlbnRpdHkuZW51bUxhYmVsc1twcm9wLmlkXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbnVtVmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIFtmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChlbnVtVmFsdWVzKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogNS4gVmVjdG9yIO2DgOyeheydgCDtmITsnqwg7KeA7JuQ7ZWY7KeAIOyViuycvOuvgOuhnCBudWxs7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICAgKiDtlqXtm4QgQUkgZW1iZWRkaW5nIOyDneyEsSDquLDriqUg7LaU6rCAIOyLnCDqtaztmIQg7JiI7KCV7J6F64uI64ukLlxuICAgICAqL1xuICAgIGlmIChwcm9wLnR5cGUgPT09IFwidmVjdG9yXCIgfHwgcHJvcC50eXBlID09PSBcInZlY3RvcltdXCIgfHwgcHJvcC50eXBlID09PSBcInRzdmVjdG9yXCIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKiA2LiDtg4DsnoXrs4Qg6riw67O4IEZha2VyIO2RnO2YhOyLneydhCDsi6Ttlontlanri4jri6QgKi9cbiAgICBjb25zdCB0eXBlRGVmYXVsdCA9IGxvY2FsZU1hcHBpbmdzLnR5cGVfZGVmYXVsdHNbcHJvcC50eXBlXTtcbiAgICBpZiAodHlwZURlZmF1bHQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVGYWtlckV4cHJlc3Npb24odHlwZURlZmF1bHQuZmFrZXIsIHByb3ApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coYEZhaWxlZCB0byBleGVjdXRlIHR5cGUgZGVmYXVsdCBmb3IgJHtwcm9wLnR5cGV9LCB1c2luZyBmYWxsYmFjazpgLCBlcnJvciksXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogNy4g66ek7ZWR65CY7KeAIOyViuydgCDtg4DsnoXsnYAg6riw67O4IEZha2VyIO2VqOyImOuhnCDsspjrpqztlanri4jri6QgKi9cbiAgICBzd2l0Y2ggKHByb3AudHlwZSkge1xuICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgY2FzZSBcInN0cmluZ1tdXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5sb3JlbS53b3JkcygzKTtcbiAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDEwMDAgfSk7XG4gICAgICBjYXNlIFwiaW50ZWdlcltdXCI6XG4gICAgICAgIHJldHVybiBbZmFrZXIubnVtYmVyLmludCh7IG1pbjogMSwgbWF4OiAxMDAwIH0pXTtcbiAgICAgIGNhc2UgXCJiaWdJbnRlZ2VyXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5udW1iZXIuYmlnSW50KHsgbWluOiAxbiwgbWF4OiAxMDAwbiB9KTtcbiAgICAgIGNhc2UgXCJiaWdJbnRlZ2VyW11cIjpcbiAgICAgICAgcmV0dXJuIFtmYWtlci5udW1iZXIuYmlnSW50KHsgbWluOiAxbiwgbWF4OiAxMDAwbiB9KV07XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgICByZXR1cm4gZmFrZXIubnVtYmVyLmZsb2F0KHsgbWluOiAwLCBtYXg6IDEwMDAgfSk7XG4gICAgICBjYXNlIFwibnVtYmVyW11cIjpcbiAgICAgIGNhc2UgXCJudW1lcmljW11cIjpcbiAgICAgICAgcmV0dXJuIFtmYWtlci5udW1iZXIuZmxvYXQoeyBtaW46IDAsIG1heDogMTAwMCB9KV07XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gZmFrZXIuZGF0YXR5cGUuYm9vbGVhbigpO1xuICAgICAgY2FzZSBcImJvb2xlYW5bXVwiOlxuICAgICAgICByZXR1cm4gW2Zha2VyLmRhdGF0eXBlLmJvb2xlYW4oKV07XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgY2FzZSBcImRhdGVbXVwiOlxuICAgICAgICByZXR1cm4gZmFrZXIuZGF0ZS5wYXN0KCk7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICByZXR1cm4ge307XG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgY2FzZSBcInV1aWRbXVwiOlxuICAgICAgICByZXR1cm4gZmFrZXIuc3RyaW5nLnV1aWQoKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDrsLDsl7Qg7YOA7J6F7J2YIOqwkuydhCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIO2DgOyehSBJROyZgCDtlYTrk5zrqoUg7Yyo7YS07J2EIOu2hOyEne2VmOyXrCDsoIHsoIjtlZwg67Cw7Je0IOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAqIOyYiDogaW1hZ2VfdXJscyDihpIgW3t1cmwsIG5hbWUsIG1pbWVfdHlwZX0sIC4uLl1cbiAgICogICAgIHRhZ19pZHMg4oaSIFsxLCAyMywgNDVdXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlQXJyYXlWYWx1ZShcbiAgICBwcm9wOiBFbnRpdHlQcm9wLFxuICAgIF9lbnRpdHk6IEVudGl0eSB8IHVuZGVmaW5lZCxcbiAgICBmYWtlcjogdHlwZW9mIGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKS5mYWtlcixcbiAgICBfbG9jYWxlRmFrZXI6IHR5cGVvZiBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIikuZmFrZXIsXG4gICk6IHVua25vd25bXSB7XG4gICAgY29uc3QgY291bnQgPSBmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDMgfSk7XG5cbiAgICAvKiogU29uYW11RmlsZVtd7J2AIFNvbmFtdSDrgrTsnqUg7YOA7J6F7Jy866GcIOq1rOyhsOqwgCDsoJXtlbTsoLgg7J6I7Iq164uI64ukICovXG4gICAgaWYgKFwiaWRcIiBpbiBwcm9wICYmIHByb3AuaWQgPT09IFwiU29uYW11RmlsZVtdXCIpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiAoe1xuICAgICAgICB1cmw6IGZha2VyLmltYWdlLnVybCgpLFxuICAgICAgICBuYW1lOiBmYWtlci5zeXN0ZW0uZmlsZU5hbWUoKSxcbiAgICAgICAgbWltZV90eXBlOiBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChbXG4gICAgICAgICAgXCJpbWFnZS9qcGVnXCIsXG4gICAgICAgICAgXCJpbWFnZS9wbmdcIixcbiAgICAgICAgICBcImltYWdlL2dpZlwiLFxuICAgICAgICAgIFwiYXBwbGljYXRpb24vcGRmXCIsXG4gICAgICAgIF0pLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8qKiDtlYTrk5zrqoXsl5DshJwg67Cw7Je07J2YIOyaqeuPhOulvCDstpTroaDtlanri4jri6QgKi9cbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHByb3AubmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywgXCJcIik7XG5cbiAgICBpZiAobm9ybWFsaXplZE5hbWUuaW5jbHVkZXMoXCJ1cmxcIikgfHwgbm9ybWFsaXplZE5hbWUuaW5jbHVkZXMoXCJpbWFnZVwiKSkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sICgpID0+IGZha2VyLmludGVybmV0LnVybCgpKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZE5hbWUuaW5jbHVkZXMoXCJpZFwiKSAmJiBub3JtYWxpemVkTmFtZS5lbmRzV2l0aChcInNcIikpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiBmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDEwMCB9KSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwidGFnXCIpIHx8IG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwibmFtZVwiKSkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sICgpID0+IGZha2VyLmxvcmVtLndvcmQoKSk7XG4gICAgfVxuXG4gICAgLyoqIO2MqO2EtCDrp6Tsua3rkJjsp4Ag7JWK7Jy866m0IOu5iCDrsLDsl7TsnYQg67CY7ZmY7ZWp64uI64ukICovXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04g66ek7ZWR7J2YIEZha2VyIO2RnO2YhOyLneydhCDtjIzsi7HtlZjsl6wg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgKlxuICAgKiDtkZztmITsi50g7JiI7IucOlxuICAgKiAtIFwiZmFrZXIuaW50ZXJuZXQuZW1haWwoKVwiIOKGkiDsnbjsnpAg7JeG7J2MXG4gICAqIC0gXCJmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDEwMCB9KVwiIOKGkiBKU09OIOyduOyekFxuICAgKiAtIFwie31cIiDihpIg66as7YSw65+0IOqwkiAoSlNPTi5wYXJzZSlcbiAgICpcbiAgICogZmFrZXJLTywgZmFrZXJKQeuPhCDsp4Dsm5DtlZjsl6wg64uk6rWt7Ja0IOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVGYWtlckV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nLCBwcm9wOiBFbnRpdHlQcm9wKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgZmFrZXJNb2R1bGUgPSBhd2FpdCBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIik7XG4gICAgY29uc3QgZmFrZXIgPSBmYWtlck1vZHVsZS5mYWtlcjtcbiAgICBjb25zdCBmYWtlcktPID0gZmFrZXJNb2R1bGUuZmFrZXJLTztcbiAgICBjb25zdCBmYWtlckpBID0gZmFrZXJNb2R1bGUuZmFrZXJKQTtcblxuICAgIC8qKiBGYWtlciDtkZztmITsi53snbQg7JWE64uMIOumrO2EsOuftCDqsJLsnYAgSlNPTuycvOuhnCDtjIzsi7Htlanri4jri6QgKi9cbiAgICBpZiAoIWV4cHJlc3Npb24uc3RhcnRzV2l0aChcImZha2VyXCIpKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShleHByZXNzaW9uKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiog7ZGc7ZiE7Iud7JeQ7IScIEZha2VyIOqwneyytOyZgCDqsr3roZzrpbwg7LaU7Lac7ZWp64uI64ukICovXG4gICAgY29uc3QgbWF0Y2ggPSBleHByZXNzaW9uLm1hdGNoKC9eKGZha2VyfGZha2VyS098ZmFrZXJKQSlcXC4oLio/KSQvKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmFrZXIgZXhwcmVzc2lvbjogJHtleHByZXNzaW9ufWApO1xuICAgIH1cblxuICAgIGNvbnN0IFssIGZha2VyTmFtZSwgZXhwcl0gPSBtYXRjaDtcbiAgICBjb25zdCBzZWxlY3RlZEZha2VyID1cbiAgICAgIGZha2VyTmFtZSA9PT0gXCJmYWtlcktPXCIgPyBmYWtlcktPIDogZmFrZXJOYW1lID09PSBcImZha2VySkFcIiA/IGZha2VySkEgOiBmYWtlcjtcblxuICAgIGNvbnN0IGZ1bmNNYXRjaCA9IGV4cHIubWF0Y2goL14oW1xcdy5dKykoPzpcXCgoLio/KVxcKSk/JC8pO1xuICAgIGlmICghZnVuY01hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmFrZXIgZXhwcmVzc2lvbiBmb3IgJHtwcm9wLm5hbWV9OiAke2V4cHJlc3Npb259YCk7XG4gICAgfVxuXG4gICAgY29uc3QgWywgcGF0aCwgYXJnc1N0cl0gPSBmdW5jTWF0Y2g7XG4gICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcblxuICAgIC8qKiDsoJAg7ZGc6riw67KVKGRvdCBub3RhdGlvbinsnLzroZwgRmFrZXIg7ZWo7IiY66W8IOywvuyVhOqwkeuLiOuLpCAqL1xuICAgIGxldCBmbjogdW5rbm93biA9IHNlbGVjdGVkRmFrZXI7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBpZiAodHlwZW9mIGZuID09PSBcIm9iamVjdFwiICYmIGZuICE9PSBudWxsICYmIHBhcnQgaW4gZm4pIHtcbiAgICAgICAgZm4gPSAoZm4gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3BhcnRdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZha2VyIHBhdGggZm9yICR7cHJvcC5uYW1lfTogJHtmYWtlck5hbWV9LiR7cGF0aH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtmYWtlck5hbWV9LiR7cGF0aH0gaXMgbm90IGEgZnVuY3Rpb24gKGZvciAke3Byb3AubmFtZX0pYCk7XG4gICAgfVxuXG4gICAgbGV0IGFyZ3M6IHVua25vd25bXSA9IFtdO1xuICAgIGlmIChhcmdzU3RyPy50cmltKCkpIHtcbiAgICAgIGFyZ3MgPSB0aGlzLnBhcnNlR2VuZXJhdG9yQXJncyhhcmdzU3RyLCBwcm9wLm5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBmbiguLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBmaXh0dXJlSGludOulvCBMTE3sl5Dqsowg7KCE64us7ZWY7JesIO2YhOyLpOyggeyduCDthYzsiqTtirgg642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICogZmFrZXIuanProZzripQg7IOd7ISx7ZWY6riwIOyWtOugpOyatCDrs7XsnqHtlZwg7YWN7Iqk7Yq4KOyekOq4sOyGjOqwnCwg7ISk66qF66y4IOuTsSnrpbxcbiAgICogTExN7J2EIO2ZnOyaqe2VmOyXrCDsg53shLHtlanri4jri6QuIOuPmeydvO2VnCBoaW507JeQIOuMgO2VnCDspJHrs7Ug7Zi47Lac7J2EIOuwqeyngO2VmOq4sCDsnITtlbRcbiAgICog7LqQ7Iux7J2EIOq4sOuzuOycvOuhnCDsp4Dsm5Dtlanri4jri6QgKExMTSBBUEkg67mE7JqpIOygiOqwkCkuXG4gICAqXG4gICAqIGFpIO2MqO2CpOyngOuKlCBkeW5hbWljIGltcG9ydOuhnCDrtojrn6zsmKTrr4DroZwsIHVzZUxMTeydtCBmYWxzZeyduCDqsr3smrBcbiAgICog7J2Y7KG07ISx7J20IOyEpOy5mOuQmOyngCDslYrslYTrj4QgZml4dHVyZSDsg53shLHsnbQg7KCV7IOBIOuPmeyeke2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVXaXRoTExNKFxuICAgIGZpeHR1cmVIaW50OiBzdHJpbmcsXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICByb3dLZXk/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIC8vIHJvd0tleeqwgCDsnojsnLzrqbQgcm93IOuLqOychCDsg53shLEg7KCE6561IOyCrOyaqVxuICAgIGlmIChyb3dLZXkpIHtcbiAgICAgIGNvbnN0IHJvd0NhY2hlS2V5ID0gYCR7cm93S2V5fToke3Byb3AubmFtZX1gO1xuXG4gICAgICAvLyDsnbTrr7gg7J20IHJvd+yXkCDrjIDtlZwgTExNIO2YuOy2nOydtCDsmYTro4zrkJwg6rK97JqwIOy6kOyLnOyXkOyEnCDrsJTroZwg67CY7ZmYXG4gICAgICBpZiAodGhpcy5sbG1DYWNoZS5oYXMocm93Q2FjaGVLZXkpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxsbUNhY2hlLmdldChyb3dDYWNoZUtleSk7XG4gICAgICB9XG5cbiAgICAgIC8vIOyDiCByb3c6IExMTSDrjIDsg4EgcHJvcCDsoITssrTrpbwg7ZWcIOuyiOyXkCDsg53shLFcbiAgICAgIGNvbnN0IGxsbVByb3BzID0gZW50aXR5LnByb3BzLmZpbHRlcigocCkgPT4ge1xuICAgICAgICBpZiAoaXNSZWxhdGlvblByb3AocCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHAuY29uZT8uZml4dHVyZUdlbmVyYXRvcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAocC5uYW1lID09PSBcImlkXCIgJiYgcC5jb25lPy5maXh0dXJlU3RyYXRlZ3kgPT09IFwic2VxdWVuY2VcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gISFwLmNvbmU/Lm5vdGU7XG4gICAgICB9KTtcblxuICAgICAgLy8gbGxtUHJvcHPqsIAg67mE7Ja07J6I7Jy866m0IOuLqOydvCDtlYTrk5wg67Cp7Iud7Jy866GcIGZhbGxiYWNrXG4gICAgICBpZiAobGxtUHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFtGaXh0dXJlR2VuZXJhdG9yXSBsbG1Qcm9wcyBpcyBlbXB0eSBmb3IgJHtlbnRpdHkuaWR9LiR7cHJvcC5uYW1lfSwgdXNpbmcgc2luZ2xlIGZpZWxkIGZhbGxiYWNrYCxcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVNpbmdsZVdpdGhMTE0oZml4dHVyZUhpbnQsIHByb3AsIGVudGl0eSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFwaUtleSA9IHRoaXMuZ2V0QXBpS2V5KCk7XG4gICAgICBjb25zdCB7IGNyZWF0ZUFudGhyb3BpYyB9ID0gYXdhaXQgaW1wb3J0KFwiQGFpLXNkay9hbnRocm9waWNcIik7XG4gICAgICBjb25zdCB7IGdlbmVyYXRlVGV4dCB9ID0gYXdhaXQgaW1wb3J0KFwiYWlcIik7XG5cbiAgICAgIGNvbnN0IHJvd1Jlc3BvbnNlID0gYXdhaXQgZ2VuZXJhdGVUZXh0KHtcbiAgICAgICAgbW9kZWw6IGNyZWF0ZUFudGhyb3BpYyh7IGFwaUtleSB9KSh0aGlzLm9wdGlvbnMubGxtTW9kZWwgfHwgXCJjbGF1ZGUtc29ubmV0LTQtNlwiKSxcbiAgICAgICAgcHJvbXB0OiB0aGlzLmJ1aWxkUm93TExNUHJvbXB0KGxsbVByb3BzLCBlbnRpdHkpLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJvd1Jlc3BvbnNlIHx8IHR5cGVvZiByb3dSZXNwb25zZS50ZXh0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgTExNIHJlc3BvbnNlXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyDsnZHri7XsnYQg7YyM7Iux7ZWY7JesIOqwgSDtlYTrk5zsl5Ag64yA7ZWcIOqysOqzvOulvCDsupDsi5zsl5Ag7KCA7J6lXG4gICAgICBjb25zdCByb3dSZXN1bHQgPSB0aGlzLnBhcnNlUm93TExNUmVzcG9uc2Uocm93UmVzcG9uc2UudGV4dCwgbGxtUHJvcHMpO1xuICAgICAgZm9yIChjb25zdCBbZmllbGROYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocm93UmVzdWx0KSkge1xuICAgICAgICB0aGlzLmxsbUNhY2hlLnNldChgJHtyb3dLZXl9OiR7ZmllbGROYW1lfWAsIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgLy8g7JqU7LKt7ZWcIO2VhOuTnOydmCDqsJIg67CY7ZmYICjsl4bsnLzrqbQg64uo7J28IO2VhOuTnCBmYWxsYmFjaylcbiAgICAgIGlmICh0aGlzLmxsbUNhY2hlLmhhcyhyb3dDYWNoZUtleSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGxtQ2FjaGUuZ2V0KHJvd0NhY2hlS2V5KTtcbiAgICAgIH1cblxuICAgICAgLy8g66eM7JW9IHJvdyDsnZHri7Xsl5Ag7J20IO2VhOuTnOqwgCDriITrnb3rkJwg6rK97JqwIOuLqOydvCDtlYTrk5wgZmFsbGJhY2tcbiAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU2luZ2xlV2l0aExMTShmaXh0dXJlSGludCwgcHJvcCwgZW50aXR5KTtcbiAgICB9XG5cbiAgICAvLyByb3dLZXnqsIAg7JeG7Jy866m0IOq4sOyhtCDri6jsnbwg7ZWE65OcIOuwqeyLnVxuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU2luZ2xlV2l0aExMTShmaXh0dXJlSGludCwgcHJvcCwgZW50aXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDri6jsnbwg7ZWE65Oc66W8IExMTeycvOuhnCDsg53shLHtlanri4jri6QgKHJvd0tleSDsl4bsnYQg65WMIGZhbGxiYWNr7JqpKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVNpbmdsZVdpdGhMTE0oXG4gICAgZml4dHVyZUhpbnQ6IHN0cmluZyxcbiAgICBwcm9wOiBFbnRpdHlQcm9wLFxuICAgIGVudGl0eTogRW50aXR5LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke2VudGl0eS5pZH06JHtwcm9wLm5hbWV9OiR7Zml4dHVyZUhpbnR9YDtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUxMTUNhY2hlICYmIHRoaXMubGxtQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGxtQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICB9XG5cbiAgICBjb25zdCBhcGlLZXkgPSB0aGlzLmdldEFwaUtleSgpO1xuICAgIGNvbnN0IHsgY3JlYXRlQW50aHJvcGljIH0gPSBhd2FpdCBpbXBvcnQoXCJAYWktc2RrL2FudGhyb3BpY1wiKTtcbiAgICBjb25zdCB7IGdlbmVyYXRlVGV4dCB9ID0gYXdhaXQgaW1wb3J0KFwiYWlcIik7XG5cbiAgICBjb25zdCBzaW5nbGVSZXNwb25zZSA9IGF3YWl0IGdlbmVyYXRlVGV4dCh7XG4gICAgICBtb2RlbDogY3JlYXRlQW50aHJvcGljKHsgYXBpS2V5IH0pKHRoaXMub3B0aW9ucy5sbG1Nb2RlbCB8fCBcImNsYXVkZS1zb25uZXQtNC02XCIpLFxuICAgICAgcHJvbXB0OiB0aGlzLmJ1aWxkTExNUHJvbXB0KGZpeHR1cmVIaW50LCBwcm9wLCBlbnRpdHkpLFxuICAgIH0pO1xuICAgIGlmICghc2luZ2xlUmVzcG9uc2UgfHwgdHlwZW9mIHNpbmdsZVJlc3BvbnNlLnRleHQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgTExNIHJlc3BvbnNlXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5wYXJzZUxMTVJlc3BvbnNlKHNpbmdsZVJlc3BvbnNlLnRleHQsIHByb3AudHlwZSk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMTE1DYWNoZSkge1xuICAgICAgdGhpcy5sbG1DYWNoZS5zZXQoY2FjaGVLZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogcm93IOyghOyytOulvCDtlZwg67KI7JeQIOyDneyEse2VmOuKlCBMTE0g7ZSE66Gs7ZSE7Yq466W8IOunjOuTreuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRSb3dMTE1Qcm9tcHQocHJvcHM6IEVudGl0eVByb3BbXSwgZW50aXR5OiBFbnRpdHkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMub3B0aW9ucy5sb2NhbGUgfHwgXCJrb1wiO1xuICAgIGNvbnN0IGxhbmd1YWdlID0gbG9jYWxlID09PSBcImtvXCIgPyBcIktvcmVhblwiIDogbG9jYWxlID09PSBcImphXCIgPyBcIkphcGFuZXNlXCIgOiBcIkVuZ2xpc2hcIjtcblxuICAgIGNvbnN0IGZpZWxkRGVzY3JpcHRpb25zID0gcHJvcHNcbiAgICAgIC5tYXAoKHApID0+IHtcbiAgICAgICAgbGV0IGRlc2MgPSBgLSAke3AubmFtZX0gKCR7cC50eXBlfSk6ICR7cC5jb25lPy5ub3RlID8/IFwiXCJ9YDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChwLnR5cGUgPT09IFwiZW51bVwiIHx8IHAudHlwZSA9PT0gXCJlbnVtW11cIikgJiZcbiAgICAgICAgICBcImlkXCIgaW4gcCAmJlxuICAgICAgICAgIHAuaWQgJiZcbiAgICAgICAgICBlbnRpdHkuZW51bUxhYmVscz8uW3AuaWRdXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzW3AuaWRdKS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgZGVzYyArPSBgIFthbGxvd2VkIHZhbHVlczogJHt2YWx1ZXN9XWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2M7XG4gICAgICB9KVxuICAgICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgICAvLyBMTE0g64yA7IOB7J20IOyVhOuLjCBwcm9w65Ok64+EIOunpeudveycvOuhnCDsoJzqs7UgKHJlbGF0aW9uIOygnOyZuClcbiAgICBjb25zdCBvdGhlclByb3BzID0gZW50aXR5LnByb3BzXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAocCkgPT5cbiAgICAgICAgICAhcHJvcHMuaW5jbHVkZXMocCkgJiZcbiAgICAgICAgICAhaXNSZWxhdGlvblByb3AocCkgJiZcbiAgICAgICAgICBwLm5hbWUgIT09IFwiaWRcIiAmJlxuICAgICAgICAgICEoXCJ2aXJ0dWFsXCIgaW4gcCAmJiBwLnZpcnR1YWwpLFxuICAgICAgKVxuICAgICAgLm1hcCgocCkgPT4ge1xuICAgICAgICBsZXQgZGVzYyA9IGAtICR7cC5uYW1lfSAoJHtwLnR5cGV9KWA7XG4gICAgICAgIGlmIChwLmNvbmU/Lm5vdGUpIGRlc2MgKz0gYDogJHtwLmNvbmUubm90ZX1gO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHAudHlwZSA9PT0gXCJlbnVtXCIgfHwgcC50eXBlID09PSBcImVudW1bXVwiKSAmJlxuICAgICAgICAgIFwiaWRcIiBpbiBwICYmXG4gICAgICAgICAgcC5pZCAmJlxuICAgICAgICAgIGVudGl0eS5lbnVtTGFiZWxzPy5bcC5pZF1cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHNbcC5pZF0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICBkZXNjICs9IGAgW2FsbG93ZWQgdmFsdWVzOiAke3ZhbHVlc31dYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzYztcbiAgICAgIH0pXG4gICAgICAuam9pbihcIlxcblwiKTtcbiAgICBjb25zdCBvdGhlclByb3BzQ29udGV4dCA9IG90aGVyUHJvcHNcbiAgICAgID8gYFxcblxcbk90aGVyIGZpZWxkcyBpbiB0aGlzIGVudGl0eSAoZm9yIGNvbnRleHQsIGRvIE5PVCBnZW5lcmF0ZSB0aGVzZSk6XFxuJHtvdGhlclByb3BzfWBcbiAgICAgIDogXCJcIjtcblxuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gcHJvcHMubWFwKChwKSA9PiBgICBcIiR7cC5uYW1lfVwiOiA8JHtwLnR5cGV9PmApLmpvaW4oXCIsXFxuXCIpO1xuXG4gICAgY29uc3QgZW50aXR5Q29udGV4dCA9IGVudGl0eS5jb25lPy5ub3RlID8gYFxcbkVudGl0eSBkZXNjcmlwdGlvbjogJHtlbnRpdHkuY29uZS5ub3RlfWAgOiBcIlwiO1xuXG4gICAgcmV0dXJuIGBHZW5lcmF0ZSB0ZXN0IGZpeHR1cmUgZGF0YSBmb3IgdGhlICR7ZW50aXR5LmlkfSBlbnRpdHkuIEFsbCBmaWVsZHMgbXVzdCBiZSBjb2hlcmVudCBhbmQgY29uc2lzdGVudCB3aXRoIGVhY2ggb3RoZXIuXG5cbkVudGl0eTogJHtlbnRpdHkuaWR9JHtlbnRpdHlDb250ZXh0fVxuTG9jYWxlOiAke2xvY2FsZX0gKHVzZSAke2xhbmd1YWdlfSBmb3IgdGV4dCBmaWVsZHMpXG5cbkZpZWxkcyB0byBnZW5lcmF0ZTpcbiR7ZmllbGREZXNjcmlwdGlvbnN9JHtvdGhlclByb3BzQ29udGV4dH1cblxuUnVsZXM6XG4tIEFsbCBmaWVsZHMgaW4gYSBzaW5nbGUgcm93IG11c3QgYmUgbG9naWNhbGx5IGNvbnNpc3RlbnQgKGUuZy4gbmFtZS9uYW1lX2VuL25hbWVfY24gc2hvdWxkIHJlcHJlc2VudCB0aGUgc2FtZSBwZXJzb24pXG4tIFJldHVybiBPTkxZIHZhbGlkIEpTT04sIG5vIG1hcmtkb3duIG9yIGV4cGxhbmF0aW9uXG4tIERhdGVzIGluIElTTyA4NjAxIGZvcm1hdFxuLSBVc2UgJHtsYW5ndWFnZX0gZm9yIHRleHQgdW5sZXNzIGZpZWxkIGRlc2NyaXB0aW9uIHNheXMgb3RoZXJ3aXNlXG5cblJldHVybiBleGFjdGx5IHRoaXMgSlNPTiBzaGFwZTpcbntcbiR7b3V0cHV0U2hhcGV9XG59YDtcbiAgfVxuXG4gIC8qKlxuICAgKiByb3cgTExNIOydkeuLteydhCDtjIzsi7HtlZjsl6wg7ZWE65Oc67OEIOqwkuycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHBhcnNlUm93TExNUmVzcG9uc2UodGV4dDogc3RyaW5nLCBwcm9wczogRW50aXR5UHJvcFtdKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IGpzb25UZXh0ID0gdGV4dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnJlcGxhY2UoL15gYGBqc29uXFxzKi9pLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoL2BgYFxccyokLywgXCJcIilcbiAgICAgIC50cmltKCk7XG5cbiAgICBsZXQgcGFyc2VkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gSlNPTi5wYXJzZShqc29uVGV4dCk7XG4gICAgICBpZiAodHlwZW9mIHJhdyAhPT0gXCJvYmplY3RcIiB8fCByYXcgPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheShyYXcpKSB7XG4gICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgIGNvbnNvbGUud2FybihcIltGaXh0dXJlR2VuZXJhdG9yXSBSb3cgTExNIHJlc3BvbnNlIGlzIG5vdCBhIHBsYWluIG9iamVjdDpcIiwgdGV4dCk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIHBhcnNlZCA9IHJhdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB9IGNhdGNoIHtcbiAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLndhcm4oXCJbRml4dHVyZUdlbmVyYXRvcl0gRmFpbGVkIHRvIHBhcnNlIHJvdyBMTE0gcmVzcG9uc2U6XCIsIHRleHQpO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICAgIGlmIChwcm9wLm5hbWUgaW4gcGFyc2VkKSB7XG4gICAgICAgIHJlc3VsdFtwcm9wLm5hbWVdID0gdGhpcy5wYXJzZUxMTVJlc3BvbnNlKFN0cmluZyhwYXJzZWRbcHJvcC5uYW1lXSA/PyBcIlwiKSwgcHJvcC50eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRMTE1Qcm9tcHQoaGludDogc3RyaW5nLCBwcm9wOiBFbnRpdHlQcm9wLCBlbnRpdHk6IEVudGl0eSk6IHN0cmluZyB7XG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5vcHRpb25zLmxvY2FsZSB8fCBcImtvXCI7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBsb2NhbGUgPT09IFwia29cIiA/IFwiS29yZWFuXCIgOiBsb2NhbGUgPT09IFwiamFcIiA/IFwiSmFwYW5lc2VcIiA6IFwiRW5nbGlzaFwiO1xuXG4gICAgY29uc3QgZW50aXR5Q29udGV4dCA9IGVudGl0eS5jb25lPy5ub3RlID8gYFxcbkVudGl0eSBjb250ZXh0OiAke2VudGl0eS5jb25lLm5vdGV9YCA6IFwiXCI7XG5cbiAgICBjb25zdCBvdGhlckZpZWxkcyA9IGVudGl0eS5wcm9wc1xuICAgICAgLmZpbHRlcigocCkgPT4gcC5uYW1lICE9PSBwcm9wLm5hbWUgJiYgIWlzUmVsYXRpb25Qcm9wKHApICYmIHAuY29uZT8ubm90ZSlcbiAgICAgIC5tYXAoKHApID0+IGAtICR7cC5uYW1lfSAoJHtwLnR5cGV9KTogJHtwLmNvbmU/Lm5vdGV9YClcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuICAgIGNvbnN0IG90aGVyRmllbGRzQ29udGV4dCA9IG90aGVyRmllbGRzXG4gICAgICA/IGBcXG5cXG5PdGhlciBmaWVsZHMgaW4gdGhpcyBlbnRpdHkgKGZvciBjb250ZXh0KTpcXG4ke290aGVyRmllbGRzfWBcbiAgICAgIDogXCJcIjtcblxuICAgIGxldCBwcm9tcHQgPSBgR2VuZXJhdGUgdGVzdCBkYXRhIGZvciAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV9ICh0eXBlOiAke3Byb3AudHlwZX0pJHtlbnRpdHlDb250ZXh0fSR7b3RoZXJGaWVsZHNDb250ZXh0fVxuXG5SZXF1aXJlbWVudDogJHtoaW50fVxuXG5SdWxlczpcbi0gUmV0dXJuIE9OTFkgdGhlIHZhbHVlLCBubyBleHBsYW5hdGlvbiBvciBtYXJrZG93blxuLSBVc2UgJHtsYW5ndWFnZX0gbGFuZ3VhZ2UgaWYgYXBwbGljYWJsZVxuLSBGb3JtYXQ6ICR7dGhpcy5nZXRFeHBlY3RlZEZvcm1hdChwcm9wLnR5cGUpfWA7XG5cbiAgICAvLyBlbnVtIO2DgOyeheyduCDqsr3smrAg6rCA64ql7ZWcIOqwkiDrqqnroZ0g7LaU6rCAXG4gICAgaWYgKHByb3AudHlwZSA9PT0gXCJlbnVtXCIgfHwgcHJvcC50eXBlID09PSBcImVudW1bXVwiKSB7XG4gICAgICBsZXQgZW51bVZhbHVlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgaWYgKFwiZW51bVwiIGluIHByb3AgJiYgQXJyYXkuaXNBcnJheShwcm9wLmVudW0pICYmIHByb3AuZW51bS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVudW1WYWx1ZXMgPSBwcm9wLmVudW07XG4gICAgICB9IGVsc2UgaWYgKFwiaWRcIiBpbiBwcm9wICYmIHByb3AuaWQgJiYgZW50aXR5Py5lbnVtTGFiZWxzPy5bcHJvcC5pZF0pIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzW3Byb3AuaWRdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVudW1WYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBwcm9tcHQgKz0gYFxcbi0gSU1QT1JUQU5UOiBDaG9vc2UgT05MWSBmcm9tIHRoZXNlIGFsbG93ZWQgdmFsdWVzOiAke2VudW1WYWx1ZXMuam9pbihcIiwgXCIpfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvbXB0ICs9IGBcXG5cXG5FeGFtcGxlOiAke3RoaXMuZ2V0RXhhbXBsZUZvclR5cGUocHJvcC50eXBlLCBsb2NhbGUpfWA7XG5cbiAgICByZXR1cm4gcHJvbXB0O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUxMTVJlc3BvbnNlKHRleHQ6IHN0cmluZywgcHJvcFR5cGU6IHN0cmluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IGNsZWFuZWQgPSB0ZXh0LnRyaW0oKTtcblxuICAgIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gICAgaWYgKHByb3BUeXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY2xlYW5lZCk7XG4gICAgICAgIGNvbnN0IGJhc2VUeXBlID0gcHJvcFR5cGUuc2xpY2UoMCwgLTIpOyAvLyBcImludGVnZXJbXVwiIC0+IFwiaW50ZWdlclwiXG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyc2VkKSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZWQubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAvLyBudWxsL3VuZGVmaW5lZOuKlCDtg4DsnoXrs4Qg6riw67O46rCS7Jy866GcXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gbnVsbCB8fCBpdGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdFZhbHVlRm9yVHlwZShiYXNlVHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDqsJ3ssrTripQgSlNPTi5zdHJpbmdpZnkg7ZuEIO2MjOyLsSAoanNvbiDtg4DsnoXsnbgg6rK97JqwKVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlVHlwZSA9PT0gXCJqc29uXCJcbiAgICAgICAgICAgICAgICA/IGl0ZW1cbiAgICAgICAgICAgICAgICA6IHRoaXMucGFyc2VTY2FsYXJWYWx1ZShKU09OLnN0cmluZ2lmeShpdGVtKSwgYmFzZVR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcHJpbWl0aXZlIOqwkuydgCDrrLjsnpDsl7TroZwg67OA7ZmYIO2bhCDtjIzsi7FcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlU2NhbGFyVmFsdWUoU3RyaW5nKGl0ZW0pLCBiYXNlVHlwZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDri6jsnbwg6rCS7J20IOyYqCDqsr3smrAg67Cw7Je066GcIOqwkOyLuOq4sFxuICAgICAgICBpZiAocGFyc2VkID09PSBudWxsIHx8IHBhcnNlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIFt0aGlzLmdldERlZmF1bHRWYWx1ZUZvclR5cGUoYmFzZVR5cGUpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3RoaXMucGFyc2VTY2FsYXJWYWx1ZShTdHJpbmcocGFyc2VkKSwgYmFzZVR5cGUpXTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGFyc2VTY2FsYXJWYWx1ZShjbGVhbmVkLCBwcm9wVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRWYWx1ZUZvclR5cGUocHJvcFR5cGU6IHN0cmluZyk6IHVua25vd24ge1xuICAgIHN3aXRjaCAocHJvcFR5cGUpIHtcbiAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIDBuO1xuICAgICAgY2FzZSBcImZsb2F0XCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSgpO1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgY2FzZSBcInV1aWRcIjpcbiAgICAgICAgcmV0dXJuIFwiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCI7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBhcnNlU2NhbGFyVmFsdWUodGV4dDogc3RyaW5nLCBwcm9wVHlwZTogc3RyaW5nKTogdW5rbm93biB7XG4gICAgY29uc3QgY2xlYW5lZCA9IHRleHQudHJpbSgpO1xuXG4gICAgc3dpdGNoIChwcm9wVHlwZSkge1xuICAgICAgY2FzZSBcImludGVnZXJcIjoge1xuICAgICAgICBjb25zdCBudW0gPSBwYXJzZUludChjbGVhbmVkLCAxMCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4obnVtKSA/IDAgOiBudW07XG4gICAgICB9XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEJpZ0ludChjbGVhbmVkKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIDBuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlIFwiZmxvYXRcIjpcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6IHtcbiAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdChjbGVhbmVkKTtcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihudW0pID8gMCA6IG51bTtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBjbGVhbmVkLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICAgICAgY2FzZSBcImRhdGVcIjoge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoY2xlYW5lZCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gbmV3IERhdGUoKSA6IGRhdGU7XG4gICAgICB9XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGNsZWFuZWQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gY2xlYW5lZDtcbiAgICAgICAgfVxuICAgICAgY2FzZSBcInV1aWRcIjpcbiAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgIHJldHVybiBjbGVhbmVkO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGNsZWFuZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGZha2VyIO2VqOyImCDsnbjsnpAg66y47J6Q7Je07J2EIO2MjOyLse2VmOyXrCDsnbjsnpAg67Cw7Je066GcIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogM+uLqOqzhCDsoITrnrU6XG4gICAqIDEuIEpTT04g7KeB7KCRIO2MjOyLsSAo7ZGc7KSAIEpTT04g7ZGc7ZiE7IudKVxuICAgKiAyLiBKUyDqsJ3ssrQg66as7YSw65+0IOKGkiBKU09OIOuzgO2ZmCDtm4Qg7J6s7Iuc64+EIChzaW5nbGUgcXVvdGUsIHVucXVvdGVkIGtleSDsspjrpqwpXG4gICAqIDMuIOuLqOyInCDri6jsnbwg7J247J6QIO2PtOuwsSAo7Iir7J6QLCDrrLjsnpDsl7QpXG4gICAqL1xuICBwcml2YXRlIHBhcnNlR2VuZXJhdG9yQXJncyhhcmdzU3RyOiBzdHJpbmcsIHByb3BOYW1lOiBzdHJpbmcpOiB1bmtub3duW10ge1xuICAgIC8vIDEuIEpTT04g7KeB7KCRIO2MjOyLsVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGBbJHthcmdzU3RyfV1gKSBhcyB1bmtub3duO1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGFyc2VkKSA/IHBhcnNlZCA6IFtwYXJzZWRdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8g6rOE7IaNXG4gICAgfVxuXG4gICAgLy8gMi4gSlMg6rCd7LK0IOumrO2EsOuftCDihpIgSlNPTiDrs4DtmZgg7ZuEIOyerOyLnOuPhFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBqc29uU3RyID0gdGhpcy5jb252ZXJ0SnNMaXRlcmFsVG9Kc29uKGFyZ3NTdHIpO1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShgWyR7anNvblN0cn1dYCkgYXMgdW5rbm93bjtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhcnNlZCkgPyBwYXJzZWQgOiBbcGFyc2VkXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIOqzhOyGjVxuICAgIH1cblxuICAgIC8vIDMuIOuLqOyInCDri6jsnbwg7J247J6QIO2PtOuwsVxuICAgIGNvbnN0IHRyaW1tZWQgPSBhcmdzU3RyLnRyaW0oKTtcbiAgICBpZiAoIU51bWJlci5pc05hTihOdW1iZXIodHJpbW1lZCkpKSB7XG4gICAgICByZXR1cm4gW051bWJlcih0cmltbWVkKV07XG4gICAgfVxuICAgIGlmIChcbiAgICAgICh0cmltbWVkLnN0YXJ0c1dpdGgoJ1wiJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnXCInKSkgfHxcbiAgICAgICh0cmltbWVkLnN0YXJ0c1dpdGgoXCInXCIpICYmIHRyaW1tZWQuZW5kc1dpdGgoXCInXCIpKVxuICAgICkge1xuICAgICAgcmV0dXJuIFt0cmltbWVkLnNsaWNlKDEsIC0xKV07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBGaXh0dXJlR2VuZXJhdG9yOiBDYW5ub3QgcGFyc2UgYXJndW1lbnRzIGZvciAke3Byb3BOYW1lfTogJHthcmdzU3RyfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTIOqwneyytCDrpqzthLDrn7TsnYQgSlNPTuycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIOuRkCDqsIDsp4Ag67OA7ZmYOlxuICAgKiAxLiBTaW5nbGUtcXVvdGVkIOusuOyekOyXtCDihpIgZG91YmxlLXF1b3RlZCAo7J207Iqk7LyA7J207ZSEIOyymOumrCDtj6ztlagpXG4gICAqIDIuIFVucXVvdGVkIOqwneyytCDtgqQg4oaSIGRvdWJsZS1xdW90ZWRcbiAgICovXG4gIHByaXZhdGUgY29udmVydEpzTGl0ZXJhbFRvSnNvbihpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyAxLiAndmFsdWUnIOKGkiBcInZhbHVlXCIgKOuCtOu2gCBcIiDsnbTsiqTsvIDsnbTtlIQsIFxcJyDihpIgJylcbiAgICBjb25zdCB3aXRoRG91YmxlUXVvdGVzID0gaW5wdXQucmVwbGFjZShcbiAgICAgIC8nKFteJ1xcXFxdKig/OlxcXFwuW14nXFxcXF0qKSopJy9nLFxuICAgICAgKF8sIGNvbnRlbnQ6IHN0cmluZykgPT4gYFwiJHtjb250ZW50LnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXFxcJy9nLCBcIidcIil9XCJgLFxuICAgICk7XG5cbiAgICAvLyAyLiB7IGtleTog4oaSIHsgXCJrZXlcIjpcbiAgICByZXR1cm4gd2l0aERvdWJsZVF1b3Rlcy5yZXBsYWNlKC8oW3ssXVxccyopKFthLXpBLVpfJF1bXFx3JF0qKShcXHMqOikvZywgJyQxXCIkMlwiJDMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb25hbXUuc2VjcmV07J2EIOyasOyEoOycvOuhnCDtlZjqs6AsIOyXhuycvOuptCDtmZjqsr3rs4DsiJjsl5DshJwgQVBJIO2CpOulvCDsnb3sirXri4jri6QuXG4gICAqXG4gICAqIFNvbmFtdS5zZWNyZXTsnYAg7ZSE66Gc7KCd7Yq467OEIOyEpOyglShzb25hbXUuY29uZmlnLnRzKeydtOuvgOuhnCDrjZQg64aS7J2AIOyasOyEoOyInOychOulvCDqsIDsp4DrqbAsXG4gICAqIO2ZmOqyveuzgOyImOuKlCDqsJzrsJwg7ZmY6rK97J2064KYIENJL0NE7JeQ7IScIGZhbGxiYWNr7Jy866GcIOyCrOyaqeuQqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0QXBpS2V5KCk6IHN0cmluZyB7XG4gICAgbGV0IGFwaUtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgU29uYW11IH0gPSByZXF1aXJlKFwiLi4vYXBpXCIpO1xuICAgICAgYXBpS2V5ID0gU29uYW11LnNlY3JldHM/LmFudGhyb3BpY19hcGlfa2V5O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU29uYW116rCAIOy0iOq4sO2ZlOuQmOyngCDslYrsnYAg6rK97JqwICjthYzsiqTtirgg7ZmY6rK9IOuTsSlcbiAgICB9XG5cbiAgICBpZiAoIWFwaUtleSkge1xuICAgICAgYXBpS2V5ID0gcHJvY2Vzcy5lbnYuQU5USFJPUElDX0FQSV9LRVk7XG4gICAgfVxuXG4gICAgaWYgKCFhcGlLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJBTlRIUk9QSUNfQVBJX0tFWSBub3QgZm91bmQuIFNldCBpdCBpbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3IgU29uYW11LnNlY3JldC5hbnRocm9waWNfYXBpX2tleVwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXBpS2V5O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeHBlY3RlZEZvcm1hdChwcm9wVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyDrsLDsl7Qg7YOA7J6FIOyymOumrFxuICAgIGlmIChwcm9wVHlwZS5lbmRzV2l0aChcIltdXCIpKSB7XG4gICAgICBjb25zdCBiYXNlVHlwZSA9IHByb3BUeXBlLnNsaWNlKDAsIC0yKTtcbiAgICAgIGNvbnN0IGJhc2VGb3JtYXQgPSB0aGlzLmdldFNjYWxhckZvcm1hdChiYXNlVHlwZSk7XG4gICAgICByZXR1cm4gYEpTT04gYXJyYXkgb2YgJHtiYXNlRm9ybWF0fSAoZS5nLiwgWyR7dGhpcy5nZXRFeGFtcGxlRm9yVHlwZShiYXNlVHlwZSwgXCJlblwiKX0sIC4uLl0pYDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRTY2FsYXJGb3JtYXQocHJvcFR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTY2FsYXJGb3JtYXQocHJvcFR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChwcm9wVHlwZSkge1xuICAgICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgIGNhc2UgXCJiaWdJbnRlZ2VyXCI6XG4gICAgICAgIHJldHVybiBcImludGVnZXIgbnVtYmVyc1wiO1xuICAgICAgY2FzZSBcImZsb2F0XCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgICByZXR1cm4gXCJkZWNpbWFsIG51bWJlcnNcIjtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBcImJvb2xlYW5zICh0cnVlIG9yIGZhbHNlKVwiO1xuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgcmV0dXJuIFwiSVNPIDg2MDEgZGF0ZSBzdHJpbmdzXCI7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICByZXR1cm4gXCJ2YWxpZCBKU09OIG9iamVjdCBvciBhcnJheVwiO1xuICAgICAgY2FzZSBcInV1aWRcIjpcbiAgICAgICAgcmV0dXJuIFwiVVVJRCBzdHJpbmdzXCI7XG4gICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICByZXR1cm4gXCJvbmUgb2YgdGhlIGFsbG93ZWQgZW51bSB2YWx1ZXNcIjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBcInBsYWluIHRleHQgc3RyaW5nc1wiO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXhhbXBsZUZvclR5cGUocHJvcFR5cGU6IHN0cmluZywgbG9jYWxlOiBMb2NhbGUpOiBzdHJpbmcge1xuICAgIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gICAgaWYgKHByb3BUeXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgIGNvbnN0IGJhc2VUeXBlID0gcHJvcFR5cGUuc2xpY2UoMCwgLTIpO1xuICAgICAgY29uc3QgYmFzZUV4YW1wbGUgPSB0aGlzLmdldFNjYWxhckV4YW1wbGUoYmFzZVR5cGUsIGxvY2FsZSk7XG4gICAgICByZXR1cm4gYFske2Jhc2VFeGFtcGxlfV1gO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldFNjYWxhckV4YW1wbGUocHJvcFR5cGUsIGxvY2FsZSk7XG4gIH1cblxuICBwcml2YXRlIGdldFNjYWxhckV4YW1wbGUocHJvcFR5cGU6IHN0cmluZywgbG9jYWxlOiBMb2NhbGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGlzS29yZWFuID0gbG9jYWxlID09PSBcImtvXCI7XG5cbiAgICBzd2l0Y2ggKHByb3BUeXBlKSB7XG4gICAgICBjYXNlIFwiaW50ZWdlclwiOlxuICAgICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIFwiNDJcIjtcbiAgICAgIGNhc2UgXCJmbG9hdFwiOlxuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgY2FzZSBcIm51bWVyaWNcIjpcbiAgICAgICAgcmV0dXJuIFwiMy4xNFwiO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIFwidHJ1ZVwiO1xuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgcmV0dXJuIFwiMjAyNC0wMS0wMVwiO1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgcmV0dXJuICd7XCJrZXlcIjogXCJ2YWx1ZVwifSc7XG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgICByZXR1cm4gXCI1NTBlODQwMC1lMjliLTQxZDQtYTcxNi00NDY2NTU0NDAwMDBcIjtcbiAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgIHJldHVybiBcIkVOVU1fVkFMVUVcIjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBpc0tvcmVhbiA/IFwi7JWI64WV7ZWY7IS47JqUXCIgOiBcIkhlbGxvXCI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOydtOumhOydhCDsnbTrqZTsnbwg66Gc7LusIO2MjO2KuOyaqSDroZzrp4jrgpjsnbTspojrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICog7ZWc6riAIOydtOumhOydgCDstIjshLEt7KSR7ISxLeyiheyEsSDrtoTtlbQg7ZuEIOuhnOuniOuCmOydtOymiCDsspjrpqztlanri4jri6QuXG4gICAqIOyYgeusuCDsnbTrpoTsnYAg7IaM66y47J6Q66GcIOuzgO2ZmO2VmOqzoCDqs7XrsLHsnYQg7KCQKC4pXFx1YzczY+uhnCDsuZjtmZjtlanri4jri6QuXG4gICAqIOyYiDogXCLquYDssqDsiJhcIiDihpIgXCJjaGVvbHN1LmtpbVwiLCBcIkpvaG4gRG9lXCIg4oaSIFwiam9obi5kb2VcIlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByb21hbml6ZU5hbWUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyDtlZzquIAg7Y+s7ZWoIOyXrOu2gCDtmZXsnbhcbiAgICBpZiAoL1tcXHVBQzAwLVxcdUQ3QUZdLy50ZXN0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb21hbml6ZUtvcmVhbk5hbWUobmFtZSk7XG4gICAgfVxuICAgIC8vIOyYgeusuDog7IaM66y47J6QICsg7KCQIOq1rOu2hFxuICAgIHJldHVybiBuYW1lXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL1xccysvZywgXCIuXCIpXG4gICAgICAucmVwbGFjZSgvW15hLXowLTkuXS9nLCBcIlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZzquIAg7J2066aE7J2EIOuhnOuniOuCmOydtOymiCDsspjrpqztlanri4jri6QuXG4gICAqXG4gICAqIOy0iOyEsS/spJHshLEv7KKF7ISxIOunpO2VkSDthYzsnbTruJTsnYQg7IKs7Jqp7ZWY7JesIO2VnOq4gOydhCDroZzrp4jsnpDroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKiDssqsg6riA7J6Q66W8IOyEseycvOuhnCDqsITso7ztlZjsl6wgXCLquYDssqDsiJhcIiDihpIgXCJjaGVvbHN1LmtpbVwiIO2Yle2DnOuhnCDstpzroKXtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHJvbWFuaXplS29yZWFuTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IENIT1NFT05HID0gW1xuICAgICAgXCJnXCIsXG4gICAgICBcImtrXCIsXG4gICAgICBcIm5cIixcbiAgICAgIFwiZFwiLFxuICAgICAgXCJ0dFwiLFxuICAgICAgXCJyXCIsXG4gICAgICBcIm1cIixcbiAgICAgIFwiYlwiLFxuICAgICAgXCJwcFwiLFxuICAgICAgXCJzXCIsXG4gICAgICBcInNzXCIsXG4gICAgICBcIlwiLFxuICAgICAgXCJqXCIsXG4gICAgICBcImpqXCIsXG4gICAgICBcImNoXCIsXG4gICAgICBcImtcIixcbiAgICAgIFwidFwiLFxuICAgICAgXCJwXCIsXG4gICAgICBcImhcIixcbiAgICBdO1xuICAgIGNvbnN0IEpVTkdTRU9ORyA9IFtcbiAgICAgIFwiYVwiLFxuICAgICAgXCJhZVwiLFxuICAgICAgXCJ5YVwiLFxuICAgICAgXCJ5YWVcIixcbiAgICAgIFwiZW9cIixcbiAgICAgIFwiZVwiLFxuICAgICAgXCJ5ZW9cIixcbiAgICAgIFwieWVcIixcbiAgICAgIFwib1wiLFxuICAgICAgXCJ3YVwiLFxuICAgICAgXCJ3YWVcIixcbiAgICAgIFwib2VcIixcbiAgICAgIFwieW9cIixcbiAgICAgIFwidVwiLFxuICAgICAgXCJ3b1wiLFxuICAgICAgXCJ3ZVwiLFxuICAgICAgXCJ3aVwiLFxuICAgICAgXCJ5dVwiLFxuICAgICAgXCJldVwiLFxuICAgICAgXCJ1aVwiLFxuICAgICAgXCJpXCIsXG4gICAgXTtcbiAgICBjb25zdCBKT05HU0VPTkcgPSBbXG4gICAgICBcIlwiLFxuICAgICAgXCJrXCIsXG4gICAgICBcImtcIixcbiAgICAgIFwia1wiLFxuICAgICAgXCJuXCIsXG4gICAgICBcIm5cIixcbiAgICAgIFwiblwiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJtXCIsXG4gICAgICBcInBcIixcbiAgICAgIFwicFwiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcInRcIixcbiAgICAgIFwibmdcIixcbiAgICAgIFwidFwiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcImtcIixcbiAgICAgIFwidFwiLFxuICAgICAgXCJwXCIsXG4gICAgICBcInRcIixcbiAgICBdO1xuXG4gICAgY29uc3Qgcm9tYW5pemUgPSAoY2hhcjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAgIGNvbnN0IGNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG4gICAgICBpZiAoY29kZSA8IDB4YWMwMCB8fCBjb2RlID4gMHhkN2FmKSByZXR1cm4gY2hhcjtcbiAgICAgIGNvbnN0IG9mZnNldCA9IGNvZGUgLSAweGFjMDA7XG4gICAgICBjb25zdCBjaG8gPSBNYXRoLmZsb29yKG9mZnNldCAvIDU4OCk7XG4gICAgICBjb25zdCBqdW5nID0gTWF0aC5mbG9vcigob2Zmc2V0ICUgNTg4KSAvIDI4KTtcbiAgICAgIGNvbnN0IGpvbmcgPSBvZmZzZXQgJSAyODtcbiAgICAgIHJldHVybiBDSE9TRU9OR1tjaG9dICsgSlVOR1NFT05HW2p1bmddICsgSk9OR1NFT05HW2pvbmddO1xuICAgIH07XG5cbiAgICBjb25zdCBjaGFycyA9IFsuLi5uYW1lXTtcbiAgICAvLyDssqsg6riA7J6Q66W8IOyEsSjlp5Mp7Jy866GcIOqwhOyjvFxuICAgIGNvbnN0IGZhbWlseU5hbWUgPSByb21hbml6ZShjaGFyc1swXSk7XG4gICAgY29uc3QgZ2l2ZW5OYW1lID0gY2hhcnMuc2xpY2UoMSkubWFwKHJvbWFuaXplKS5qb2luKFwiXCIpO1xuXG4gICAgaWYgKGdpdmVuTmFtZSkge1xuICAgICAgcmV0dXJuIGAke2dpdmVuTmFtZX0uJHtmYW1pbHlOYW1lfWA7XG4gICAgfVxuICAgIHJldHVybiBmYW1pbHlOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIExMTSDsupDsi5wg7Ya16rOE66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIGdldExMTUNhY2hlU3RhdHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNpemU6IHRoaXMubGxtQ2FjaGUuc2l6ZSxcbiAgICAgIGVuYWJsZWQ6IHRoaXMub3B0aW9ucy5lbmFibGVMTE1DYWNoZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExMTSDsupDsi5zrpbwg7LSI6riw7ZmU7ZWp64uI64ukLlxuICAgKi9cbiAgY2xlYXJMTE1DYWNoZSgpIHtcbiAgICB0aGlzLmxsbUNhY2hlLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICog7Luo7YWN7Iqk7Yq4IOyDneyEsVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVDb250ZXh0KCk6IEdlbmVyYXRvckNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBmaXh0dXJlczogbmV3IE1hcCgpLFxuICAgICAgcmVmZXJlbmNlQ2FjaGU6IG5ldyBNYXAoKSxcbiAgICAgIGltcG9ydGVkUmVjb3JkczogbmV3IFNldCgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog67Cw7LmYIOyDneyEsSDrsI8g7J6Q64+ZIOyggOyepVxuICAgKlxuICAgKiAxLiDqsIEgc3BlY+uzhOuhnCBmaXh0dXJlIOyDneyEsSAo66mU66qo66asKVxuICAgKiAyLiBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgKiAzLiBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcygp66GcIHRhcmdldERi7JeQIOyggOyepVxuICAgKlxuICAgKiBAcmV0dXJucyDsoIDsnqXrkJwgZml4dHVyZSDrjbDsnbTthLAgKOyLpOygnCBEQiBJRCDtj6ztlagpXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZUJhdGNoKFxuICAgIHNwZWNzOiBBcnJheTx7IGVudGl0eTogc3RyaW5nOyBjb3VudDogbnVtYmVyOyBvdmVycmlkZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PixcbiAgKTogUHJvbWlzZTxGaXh0dXJlSW1wb3J0UmVzdWx0W10+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jcmVhdGVDb250ZXh0KCk7XG4gICAgY29uc3QgZ2VuZXJhdGVkRml4dHVyZXM6IEFycmF5PHtcbiAgICAgIGVudGl0eTogc3RyaW5nO1xuICAgICAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBleHBsaWNpdElkPzogYm9vbGVhbjtcbiAgICB9PiA9IFtdO1xuXG4gICAgLy8gMS4g6rCBIHNwZWPrs4TroZwgZml4dHVyZSDsg53shLFcbiAgICBmb3IgKGNvbnN0IHNwZWMgb2Ygc3BlY3MpIHtcbiAgICAgIGNvbnN0IHNwZWNFbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KHNwZWMuZW50aXR5KTtcblxuICAgICAgaWYgKHNwZWNFbnRpdHkucGFyZW50SWQpIHtcbiAgICAgICAgLy8gcGFyZW50SWQg7JeU7Yuw7YuwOiBEQuyXkOyEnCDshJzruIztg4DsnoUg7ZaJ7J20IOyXhuuKlCDrtoDrqqggaWTrpbwg7KGw7ZqM7ZWY7JesIOyCrOyaqVxuICAgICAgICAvLyAo7IOIIOu2gOuqqCDsg53shLEg64yA7IugIOq4sOyhtCDrjbDsnbTthLAg7J6s7Zmc7JqpKVxuICAgICAgICBjb25zdCBpZFByb3AgPSBzcGVjRW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgICAgY29uc3QgcGFyZW50T3ZlcnJpZGVzID0gaWRQcm9wPy5jb25lPy5maXh0dXJlUGFyZW50T3ZlcnJpZGVzID8/IHt9O1xuICAgICAgICBjb25zdCBwYXJlbnRFbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KHNwZWNFbnRpdHkucGFyZW50SWQpO1xuXG4gICAgICAgIC8vIOu2gOuqqCDthYzsnbTruJTsl5DshJwg7ISc67iM7YOA7J6FIO2FjOydtOu4lOyXkCDsl4bripQgaWTrpbwg7KGw7ZqMXG4gICAgICAgIGxldCBxdWVyeSA9IHRoaXMuc291cmNlRGIocGFyZW50RW50aXR5LnRhYmxlKS5zZWxlY3QoYCR7cGFyZW50RW50aXR5LnRhYmxlfS5pZGApO1xuICAgICAgICBmb3IgKGNvbnN0IFtjb2wsIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMocGFyZW50T3ZlcnJpZGVzKSkge1xuICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoXG4gICAgICAgICAgICBgJHtwYXJlbnRFbnRpdHkudGFibGV9LiR7Y29sfWAsXG4gICAgICAgICAgICB2YWwgYXMgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBxdWVyeSA9IHF1ZXJ5XG4gICAgICAgICAgLmxlZnRKb2luKHNwZWNFbnRpdHkudGFibGUsIGAke3NwZWNFbnRpdHkudGFibGV9LmlkYCwgYCR7cGFyZW50RW50aXR5LnRhYmxlfS5pZGApXG4gICAgICAgICAgLndoZXJlTnVsbChgJHtzcGVjRW50aXR5LnRhYmxlfS5pZGApXG4gICAgICAgICAgLmxpbWl0KHNwZWMuY291bnQpO1xuXG4gICAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeTtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlSWRzOiBudW1iZXJbXSA9IHJvd3MubWFwKChyOiB7IGlkOiBudW1iZXIgfSkgPT4gci5pZCk7XG5cbiAgICAgICAgaWYgKGF2YWlsYWJsZUlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICAgIGBbcGFyZW50SWRdICR7c3BlYy5lbnRpdHl9OiDshJzruIztg4DsnoXsnbQg7JeG64qUIOu2gOuqqCDroIjsvZTrk5zqsIAg67aA7KGx7ZWp64uI64ukLiDqsbTrhIjrnIHri4jri6QuYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChjb25zdCBwYXJlbnRJZCBvZiBhdmFpbGFibGVJZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpeHR1cmUgPSBhd2FpdCB0aGlzLmdlbmVyYXRlKHNwZWMuZW50aXR5LCBzcGVjLm92ZXJyaWRlcyB8fCB7fSwgY29udGV4dCk7XG4gICAgICAgICAgICBmaXh0dXJlLmlkID0gcGFyZW50SWQ7XG4gICAgICAgICAgICBnZW5lcmF0ZWRGaXh0dXJlcy5wdXNoKHsgZW50aXR5OiBzcGVjLmVudGl0eSwgZGF0YTogZml4dHVyZSwgZXhwbGljaXRJZDogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BlYy5jb3VudDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZml4dHVyZSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGUoc3BlYy5lbnRpdHksIHNwZWMub3ZlcnJpZGVzIHx8IHt9LCBjb250ZXh0KTtcbiAgICAgICAgICBnZW5lcmF0ZWRGaXh0dXJlcy5wdXNoKHtcbiAgICAgICAgICAgIGVudGl0eTogc3BlYy5lbnRpdHksXG4gICAgICAgICAgICBkYXRhOiBmaXh0dXJlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gRml4dHVyZVJlY29yZOuhnCDrs4DtmZhcbiAgICBjb25zdCBmaXh0dXJlUmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgZm9yIChjb25zdCB7IGVudGl0eTogZW50aXR5TmFtZSwgZGF0YSwgZXhwbGljaXRJZCB9IG9mIGdlbmVyYXRlZEZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eU5hbWUpO1xuXG4gICAgICAvLyBpbnRlZ2VyL2JpZ0ludGVnZXIgUEvripQg7J6E7IucIElEIOyDneyEsSAoREIg7Iuc7YCA7Iqk6rCAIOyLpOygnCBJRCDtlaDri7kpXG4gICAgICAvLyBzdHJpbmcgUEvripQgZ2VuZXJhdGUoKeyXkOyEnCDsnbTrr7gg7IOd7ISx65CcIGlkIOqwkuydhCDqt7jrjIDroZwg7IKs7JqpXG4gICAgICAvLyBwYXJlbnRJZCDsl5Tti7Dti7DripQg67aA66qo7J2YIOyLpOygnCBpZOulvCDqt7jrjIDroZwg7IKs7JqpICjsi5ztgIDsiqQg66+47IKs7JqpKVxuICAgICAgY29uc3QgaWRQcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgIGNvbnN0IHVzZXNTZXF1ZW5jZSA9XG4gICAgICAgICFleHBsaWNpdElkICYmXG4gICAgICAgIChpZFByb3A/LnR5cGUgPT09IFwiaW50ZWdlclwiIHx8XG4gICAgICAgICAgaWRQcm9wPy50eXBlID09PSBcImJpZ0ludGVnZXJcIiB8fFxuICAgICAgICAgIGlkUHJvcD8uY29uZT8uZml4dHVyZVN0cmF0ZWd5ID09PSBcInNlcXVlbmNlXCIpO1xuXG4gICAgICBjb25zdCBkYXRhRm9yUmVjb3JkID0gdXNlc1NlcXVlbmNlXG4gICAgICAgID8geyAuLi5kYXRhLCBpZDogTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwMCkgfVxuICAgICAgICA6IGRhdGE7XG5cbiAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5jcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgICAgICBlbnRpdHksXG4gICAgICAgIGRhdGFGb3JSZWNvcmQgYXMgeyBpZDogbnVtYmVyIHwgc3RyaW5nOyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB9LFxuICAgICAgICB7IHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgKTtcbiAgICAgIGZpeHR1cmVSZWNvcmRzLnB1c2goLi4ucmVjb3Jkcyk7XG4gICAgfVxuXG4gICAgLy8gMy4gdGFyZ2V0RGLsl5Ag7IK97J6FIChGaXh0dXJlTWFuYWdlcuqwgCDsnZjsobTshLEg7KCV66CsIOyymOumrClcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuaW5zZXJ0Rml4dHVyZXModGhpcy50YXJnZXREYk5hbWUsIGZpeHR1cmVSZWNvcmRzKTtcblxuICAgIC8vIDQuIGNvbXBhbmlvbiBmaXh0dXJlcyDsg53shLEgKGZpeHR1cmVDb21wYW5pb25z6rCAIOyEoOyWuOuQnCDqsr3smrApXG4gICAgY29uc3QgY29tcGFuaW9uUmVzdWx0cyA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVDb21wYW5pb25zKHNwZWNzLCByZXN1bHRzKTtcblxuICAgIGNvbnN0IHRvdGFsID0gcmVzdWx0cy5sZW5ndGggKyBjb21wYW5pb25SZXN1bHRzLmxlbmd0aDtcbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGBHZW5lcmF0ZWQgYW5kIHNhdmVkICR7dG90YWx9IGZpeHR1cmVzIHRvICR7dGhpcy50YXJnZXREYk5hbWV9YCkpO1xuICAgIHJldHVybiBbLi4ucmVzdWx0cywgLi4uY29tcGFuaW9uUmVzdWx0c107XG4gIH1cblxuICAvKipcbiAgICog67aA66qoIGZpeHR1cmUg6rKw6rO866W8IOq4sOuwmOycvOuhnCBmaXh0dXJlQ29tcGFuaW9uc+yXkCDshKDslrjrkJwgY29tcGFuaW9uIEVudGl0eeulvCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIGdlbmVyYXRlQmF0Y2goKeyXkOyEnOunjCDtmLjstpzrkJjrqbAsIGNvbXBhbmlvbiDsg53shLEg7IucIOyerOq3gOulvCDrsKnsp4DtlZjquLAg7JyE7ZW0XG4gICAqIGdlbmVyYXRlQmF0Y2goKeulvCDri6Tsi5wg7Zi47Lac7ZWY7KeAIOyViuqzoCDsp4HsoJEg7IK97J6F7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUNvbXBhbmlvbnMoXG4gICAgc3BlY3M6IEFycmF5PHsgZW50aXR5OiBzdHJpbmc7IGNvdW50OiBudW1iZXI7IG92ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+LFxuICAgIHBhcmVudFJlc3VsdHM6IEZpeHR1cmVJbXBvcnRSZXN1bHRbXSxcbiAgKTogUHJvbWlzZTxGaXh0dXJlSW1wb3J0UmVzdWx0W10+IHtcbiAgICBjb25zdCBhbGxSZXN1bHRzOiBGaXh0dXJlSW1wb3J0UmVzdWx0W10gPSBbXTtcbiAgICBjb25zdCBwcm9jZXNzZWRFbnRpdGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHNwZWNzKSB7XG4gICAgICBpZiAocHJvY2Vzc2VkRW50aXRpZXMuaGFzKHNwZWMuZW50aXR5KSkgY29udGludWU7XG4gICAgICBwcm9jZXNzZWRFbnRpdGllcy5hZGQoc3BlYy5lbnRpdHkpO1xuXG4gICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KHNwZWMuZW50aXR5KTtcbiAgICAgIGNvbnN0IGlkUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICBjb25zdCBjb21wYW5pb25zID0gaWRQcm9wPy5jb25lPy5maXh0dXJlQ29tcGFuaW9ucztcbiAgICAgIGlmICghY29tcGFuaW9ucyB8fCBjb21wYW5pb25zLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGVudGl0eVJlc3VsdHMgPSBwYXJlbnRSZXN1bHRzLmZpbHRlcigocikgPT4gci5lbnRpdHlJZCA9PT0gc3BlYy5lbnRpdHkpO1xuICAgICAgaWYgKGVudGl0eVJlc3VsdHMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgZm9yIChjb25zdCBjb21wYW5pb24gb2YgY29tcGFuaW9ucykge1xuICAgICAgICAvLyBjb21wYW5pb24gZW50aXR57JeQ7IScIOu2gOuqqCBlbnRpdHnroZzsnZggQmVsb25nc1RvT25lIEZLIOy7rOufvOuqhSDtjIzslYVcbiAgICAgICAgY29uc3QgY29tcGFuaW9uRW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChjb21wYW5pb24uZW50aXR5KTtcbiAgICAgICAgY29uc3QgZmtQcm9wID0gY29tcGFuaW9uRW50aXR5LnByb3BzLmZpbmQoXG4gICAgICAgICAgKHApID0+IGlzUmVsYXRpb25Qcm9wKHApICYmIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHApICYmIHAud2l0aCA9PT0gc3BlYy5lbnRpdHksXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZmtQcm9wKSB7XG4gICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICBgW0NvbXBhbmlvbl0gTm8gQmVsb25nc1RvT25lIHJlbGF0aW9uIGZyb20gJHtjb21wYW5pb24uZW50aXR5fSB0byAke3NwZWMuZW50aXR5fS4gU2tpcHBpbmcuYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmtDb2xOYW1lID0gYCR7ZmtQcm9wLm5hbWV9X2lkYDtcblxuICAgICAgICAvLyBjb21wYW5pb27snZggaWRQcm9wLCB1c2VzU2VxdWVuY2UsIGNvdW5064qUIGNvbXBhbmlvbiDri6jsnITroZwg6rOg7KCVXG4gICAgICAgIGNvbnN0IGNvbXBhbmlvbklkUHJvcCA9IGNvbXBhbmlvbkVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICAgIGNvbnN0IHVzZXNTZXF1ZW5jZSA9XG4gICAgICAgICAgY29tcGFuaW9uSWRQcm9wPy50eXBlID09PSBcImludGVnZXJcIiB8fFxuICAgICAgICAgIGNvbXBhbmlvbklkUHJvcD8udHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIgfHxcbiAgICAgICAgICBjb21wYW5pb25JZFByb3A/LmNvbmU/LmZpeHR1cmVTdHJhdGVneSA9PT0gXCJzZXF1ZW5jZVwiO1xuICAgICAgICBjb25zdCBjb21wYW5pb25Db3VudCA9IGNvbXBhbmlvbi5jb3VudCA/PyAxO1xuXG4gICAgICAgIC8vIOqwgSBwYXJlbnQgcmVzdWx07JeQIOuMgO2VtCBjb21wYW5pb24gZml4dHVyZSDsg53shLFcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY3JlYXRlQ29udGV4dCgpO1xuICAgICAgICBjb25zdCBjb21wYW5pb25GaXh0dXJlUmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBwYXJlbnRSZXN1bHQgb2YgZW50aXR5UmVzdWx0cykge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkT3ZlcnJpZGVzID0gdGhpcy5yZXNvbHZlVGVtcGxhdGVPdmVycmlkZXMoXG4gICAgICAgICAgICBjb21wYW5pb24ub3ZlcnJpZGVzID8/IHt9LFxuICAgICAgICAgICAgcGFyZW50UmVzdWx0LmRhdGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXNvbHZlZE92ZXJyaWRlc1tma0NvbE5hbWVdID0gcGFyZW50UmVzdWx0LmRhdGEuaWQ7XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBhbmlvbkNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZpeHR1cmUgPSBhd2FpdCB0aGlzLmdlbmVyYXRlKGNvbXBhbmlvbi5lbnRpdHksIHJlc29sdmVkT3ZlcnJpZGVzLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgY29uc3QgZGF0YUZvclJlY29yZCA9IHVzZXNTZXF1ZW5jZVxuICAgICAgICAgICAgICA/IHsgLi4uZml4dHVyZSwgaWQ6IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApIH1cbiAgICAgICAgICAgICAgOiBmaXh0dXJlO1xuXG4gICAgICAgICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgICAgICAgY29tcGFuaW9uRW50aXR5LFxuICAgICAgICAgICAgICBkYXRhRm9yUmVjb3JkIGFzIHtcbiAgICAgICAgICAgICAgICBpZDogbnVtYmVyIHwgc3RyaW5nO1xuICAgICAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7IHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbXBhbmlvbkZpeHR1cmVSZWNvcmRzLnB1c2goLi4ucmVjb3Jkcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tcGFuaW9uUmVzdWx0cyA9IGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKFxuICAgICAgICAgIHRoaXMudGFyZ2V0RGJOYW1lLFxuICAgICAgICAgIGNvbXBhbmlvbkZpeHR1cmVSZWNvcmRzLFxuICAgICAgICApO1xuICAgICAgICBhbGxSZXN1bHRzLnB1c2goLi4uY29tcGFuaW9uUmVzdWx0cyk7XG5cbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICAgICAgYFtDb21wYW5pb25dIEdlbmVyYXRlZCAke2NvbXBhbmlvblJlc3VsdHMubGVuZ3RofSAke2NvbXBhbmlvbi5lbnRpdHl9IGZpeHR1cmVzYCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWxsUmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBvdmVycmlkZXMg6rCS7J2YIFwie3tmaWVsZE5hbWV9fVwiIO2FnO2UjOumv+ydhCDrtoDrqqggZml4dHVyZSDrjbDsnbTthLDroZwg7LmY7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiDsmIg6IHsgXCJhY2NvdW50X2lkXCI6IFwie3tlbWFpbH19XCIgfSDihpIgeyBcImFjY291bnRfaWRcIjogXCJ1c2VyQGV4YW1wbGUuY29tXCIgfVxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlVGVtcGxhdGVPdmVycmlkZXMoXG4gICAgb3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBwYXJlbnREYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlIHwgbnVsbCB9LFxuICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgcmVzb2x2ZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3ZlcnJpZGVzKSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5zdGFydHNXaXRoKFwie3tcIikgJiYgdmFsdWUuZW5kc1dpdGgoXCJ9fVwiKSkge1xuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSB2YWx1ZS5zbGljZSgyLCAtMikudHJpbSgpO1xuICAgICAgICBpZiAoIShmaWVsZE5hbWUgaW4gcGFyZW50RGF0YSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBg7YWc7ZSM66a/IO2VhOuTnCBcIiR7ZmllbGROYW1lfVwi7J20KOqwgCkg67aA66qoIGZpeHR1cmUg642w7J207YSw7JeQIOyhtOyerO2VmOyngCDslYrsirXri4jri6QgKG92ZXJyaWRlIGtleTogXCIke2tleX1cIilgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZWRba2V5XSA9IHBhcmVudERhdGFbZmllbGROYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmVkW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIOyLpOygnCBEQihzb3VyY2VEYinsl5DshJwg642w7J207YSw66W8IOyhsO2ajO2VmOyXrCBmaXh0dXJlIERCKHRhcmdldERiKeyXkCBpbXBvcnTtlanri4jri6QuXG4gICAqXG4gICAqIDEuIERhdGFFeHBsb3JlcuuhnCBzb3VyY2VEYuyXkOyEnCDrjbDsnbTthLAg7KGw7ZqMICjqtIDroKgg642w7J207YSwIO2PrO2VqClcbiAgICogMi4gRml4dHVyZVJlY29yZOuhnCDrs4DtmZhcbiAgICogMy4gdGFyZ2V0RGLsl5Ag7IK97J6FXG4gICAqXG4gICAqIEBwYXJhbSBlbnRpdHlOYW1lIC0g7KGw7ZqM7ZWgIGVudGl0eSDsnbTrpoRcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDsobDtmowg7Ji17IWYIChzdHJhdGVneSwgbGltaXQsIGluY2x1ZGVSZWxhdGlvbnMg65OxKVxuICAgKiBAcmV0dXJucyDsoIDsnqXrkJwgZml4dHVyZSDrjbDsnbTthLAgKOyLpOygnCBEQiBJRCDtj6ztlagpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIO2UhOuhnOuNleyFmCBEQuyXkOyEnCBVc2VyIDEw66qFICsg6rSA66CoIEVtcGxveWVlLCBEZXBhcnRtZW50IOqwgOyguOyYpOq4sFxuICAgKiBhd2FpdCBnZW5lcmF0b3IuaW1wb3J0RnJvbVNvdXJjZShcIlVzZXJcIiwge1xuICAgKiAgIHN0cmF0ZWd5OiBcInNhbXBsZVwiLFxuICAgKiAgIGxpbWl0OiAxMCxcbiAgICogICBpbmNsdWRlUmVsYXRpb25zOiB0cnVlLFxuICAgKiAgIG1heERlcHRoOiAyXG4gICAqIH0pO1xuICAgKi9cbiAgYXN5bmMgaW1wb3J0RnJvbVNvdXJjZShcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRXhwbG9yZVdpdGhSZWxhdGlvbnNPcHRpb25zLFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmJsdWUoXG4gICAgICAgICAgYEltcG9ydGluZyAke2VudGl0eU5hbWV9IGZyb20gc291cmNlIERCIHdpdGggb3B0aW9uczogJHtKU09OLnN0cmluZ2lmeSh7IHN0cmF0ZWd5OiBvcHRpb25zLnN0cmF0ZWd5LCBsaW1pdDogb3B0aW9ucy5saW1pdCwgaW5jbHVkZVJlbGF0aW9uczogb3B0aW9ucy5pbmNsdWRlUmVsYXRpb25zLCBtYXhEZXB0aDogb3B0aW9ucy5tYXhEZXB0aCB9KX1gLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgIC8vIDEuIERhdGFFeHBsb3JlcuuhnCBzb3VyY2VEYuyXkOyEnCDrjbDsnbTthLAg7KGw7ZqMICjqtIDroKgg642w7J207YSwIO2PrO2VqClcbiAgICBjb25zdCBleHBsb3JlUmVzdWx0ID0gYXdhaXQgdGhpcy5kYXRhRXhwbG9yZXIuZXhwbG9yZVdpdGhSZWxhdGlvbnMoZW50aXR5TmFtZSwgb3B0aW9ucyk7XG5cbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgIGBGb3VuZCAke2V4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aH0gJHtlbnRpdHlOYW1lfSByZWNvcmRzIGFuZCAke2V4cGxvcmVSZXN1bHQucmVsYXRlZC5zaXplfSByZWxhdGVkIGVudGl0aWVzYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAvLyAyLiBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgIGNvbnN0IGZpeHR1cmVSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcblxuICAgIC8vIOuplOyduCBlbnRpdHnsnZggcmVjb3Jkc+ulvCBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgIGNvbnN0IG1haW5FbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eU5hbWUpO1xuICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIGV4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzKSB7XG4gICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgbWFpbkVudGl0eSxcbiAgICAgICAgcmVjb3JkIGFzIHsgaWQ6IG51bWJlciB8IHN0cmluZzsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfSxcbiAgICAgICAgeyBfZGI6IHRoaXMuc291cmNlRGIsIHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgKTtcbiAgICAgIGZpeHR1cmVSZWNvcmRzLnB1c2goLi4ucmVjb3Jkcyk7XG4gICAgfVxuXG4gICAgLy8g6rSA66CoIGVudGl0eeydmCByZWNvcmRz66W8IEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAgZm9yIChjb25zdCBbcmVsYXRlZEVudGl0eU5hbWUsIHJlbGF0ZWRSZWNvcmRzXSBvZiBleHBsb3JlUmVzdWx0LnJlbGF0ZWQuZW50cmllcygpKSB7XG4gICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChyZWxhdGVkRW50aXR5TmFtZSk7XG4gICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWxhdGVkUmVjb3Jkcykge1xuICAgICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgICByZWxhdGVkRW50aXR5LFxuICAgICAgICAgIHJlY29yZCBhcyB7IGlkOiBudW1iZXIgfCBzdHJpbmc7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIH0sXG4gICAgICAgICAgeyBfZGI6IHRoaXMuc291cmNlRGIsIHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgICApO1xuICAgICAgICBmaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLnJlY29yZHMpO1xuICAgICAgfVxuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICAtICR7cmVsYXRlZEVudGl0eU5hbWV9OiAke3JlbGF0ZWRSZWNvcmRzLmxlbmd0aH0gcmVjb3Jkc2ApKTtcbiAgICB9XG5cbiAgICAvLyAzLiB0YXJnZXREYuyXkCDsgr3snoUgKEZpeHR1cmVNYW5hZ2Vy6rCAIOydmOyhtOyEsSDsoJXroKwg7LKY66asKVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyh0aGlzLnRhcmdldERiTmFtZSwgZml4dHVyZVJlY29yZHMpO1xuXG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgYFN1Y2Nlc3NmdWxseSBpbXBvcnRlZCAke3Jlc3VsdHMubGVuZ3RofSByZWNvcmRzIHRvICR7dGhpcy50YXJnZXREYk5hbWV9ICgke2V4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aH0gJHtlbnRpdHlOYW1lfSArICR7cmVzdWx0cy5sZW5ndGggLSBleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGh9IHJlbGF0ZWQpYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7YUFNb0c7a0JBQ3ZEO3FCQUNFO3NCQUVFO3VCQUVFO0NBc0J0QyxtQkFBYixNQUE4QjtFQUM1QixBQUFRO0VBQ1IsQUFBUTtFQUNSLEFBQVE7RUFDUixBQUFRLFdBQWlDLElBQUksS0FBSztFQUNsRCxBQUFRLGNBQW1DLElBQUksS0FBSztFQUNwRCxBQUFRO0VBRVIsWUFDRSxBQUFRQSxVQUdSLFdBQ0EsQUFBUUMsY0FDUixBQUFRQyxlQUNSLFNBQ0E7R0FQUTtHQUlBO0dBQ0E7QUFHUixRQUFLLGVBQWUsSUFBSSxhQUFhLFVBQVUsY0FBYztBQUM3RCxRQUFLLFNBQVMsU0FBUyxVQUFVO0FBQ2pDLFFBQUssV0FB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
1243
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1nZW5lcmF0b3IuanMiLCJuYW1lcyI6WyJzb3VyY2VEYjogS25leCIsInRhcmdldERiTmFtZTogXCJmaXh0dXJlXCIgfCBcInRlc3RcIiB8IFwicHJvZHVjdGlvbl9tYXN0ZXJcIiIsImVudGl0eU1hbmFnZXI6IHR5cGVvZiBFbnRpdHlNYW5hZ2VyIiwiZml4dHVyZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4iLCJhbGxGaXh0dXJlUmVjb3JkczogRml4dHVyZVJlY29yZFtdIiwicmVjb3Jkc1RvSW1wb3J0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdIiwibWFpblJlY29yZHNUb0ltcG9ydDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSIsImZuOiB1bmtub3duIiwiYXJnczogdW5rbm93bltdIiwiZW51bVZhbHVlczogc3RyaW5nW10iLCJwYXJzZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IiwicmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiIsImFwaUtleTogc3RyaW5nIHwgdW5kZWZpbmVkIiwiZ2VuZXJhdGVkRml4dHVyZXM6IEFycmF5PHtcbiAgICAgIGVudGl0eTogc3RyaW5nO1xuICAgICAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBleHBsaWNpdElkPzogYm9vbGVhbjtcbiAgICB9PiIsImF2YWlsYWJsZUlkczogbnVtYmVyW10iLCJmaXh0dXJlUmVjb3JkczogRml4dHVyZVJlY29yZFtdIiwiYWxsUmVzdWx0czogRml4dHVyZUltcG9ydFJlc3VsdFtdIiwiY29tcGFuaW9uRml4dHVyZVJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSIsInJlc29sdmVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtZ2VuZXJhdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmltcG9ydCB7IHR5cGUgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5UHJvcCwgdHlwZSBGaXh0dXJlSW1wb3J0UmVzdWx0LCB0eXBlIEZpeHR1cmVSZWNvcmQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLCBpc09uZVRvT25lUmVsYXRpb25Qcm9wLCBpc1JlbGF0aW9uUHJvcCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IERhdGFFeHBsb3JlciB9IGZyb20gXCIuL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IHR5cGUgRXhwbG9yZVdpdGhSZWxhdGlvbnNPcHRpb25zLCB0eXBlIEV4cGxvcmVXaXRoUmVsYXRpb25zUmVzdWx0IH0gZnJvbSBcIi4vZGF0YS1leHBsb3JlclwiO1xuaW1wb3J0IHsgZmFrZXJNYXBwaW5ncyB9IGZyb20gXCIuL2Zha2VyLW1hcHBpbmdzXCI7XG5pbXBvcnQgeyB0eXBlIEZha2VyTWFwcGluZ3MgfSBmcm9tIFwiLi9mYWtlci1tYXBwaW5nc1wiO1xuaW1wb3J0IHsgRml4dHVyZU1hbmFnZXIgfSBmcm9tIFwiLi9maXh0dXJlLW1hbmFnZXJcIjtcblxuZXhwb3J0IHR5cGUgTG9jYWxlID0gXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiO1xuXG5leHBvcnQgdHlwZSBGaXh0dXJlR2VuZXJhdG9yT3B0aW9ucyA9IHtcbiAgbG9jYWxlPzogTG9jYWxlO1xuICB1c2VMTE0/OiBib29sZWFuO1xuICBlbmFibGVMTE1DYWNoZT86IGJvb2xlYW47XG4gIGxsbU1vZGVsPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgR2VuZXJhdG9yQ29udGV4dCA9IHtcbiAgLyoqIOyDneyEsSDspJHsnbggZml4dHVyZeuTpCAo66mU66qo66asIOyDgSkgKi9cbiAgZml4dHVyZXM6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcblxuICAvKiog7LC47KGwIOuNsOydtO2EsCDsupDsi5wgKERhdGFFeHBsb3JlciDqsrDqs7wpICovXG4gIHJlZmVyZW5jZUNhY2hlOiBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPjtcblxuICAvKiog7J2066+4IGltcG9ydOuQnCDroIjsvZTrk5zrpbwg7LaU7KCB7ZWY7JesIOykkeuztSBpbXBvcnTrpbwg67Cp7KeA7ZWp64uI64ukICovXG4gIGltcG9ydGVkUmVjb3JkczogU2V0PHN0cmluZz47IC8vIFwiVXNlciMxMjNcIlxufTtcblxuZXhwb3J0IGNsYXNzIEZpeHR1cmVHZW5lcmF0b3Ige1xuICBwcml2YXRlIGRhdGFFeHBsb3JlcjogRGF0YUV4cGxvcmVyO1xuICBwcml2YXRlIGxvY2FsZTogTG9jYWxlO1xuICBwcml2YXRlIG1hcHBpbmdzOiBGYWtlck1hcHBpbmdzO1xuICBwcml2YXRlIGxsbUNhY2hlOiBNYXA8c3RyaW5nLCB1bmtub3duPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBlbnRpdHlDYWNoZTogTWFwPHN0cmluZywgRW50aXR5PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBvcHRpb25zOiBGaXh0dXJlR2VuZXJhdG9yT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNvdXJjZURiOiBLbmV4LFxuICAgIC8vIEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVz6rCAIGRiTmFtZSDrrLjsnpDsl7TsnYQg67Cb6riwIOuVjOusuOyXkCDsp4HsoJEg7IKs7Jqp7ZWY7KeAIOyViuyKteuLiOuLpFxuICAgIC8vIOuvuOuemCDtmZXsnqXshLHsnYQg7JyE7ZW0IEFQSSDsi5zqt7jri4jsspjsl5DripQg7Y+s7ZWo7Iuc7Lyw7Iq164uI64ukXG4gICAgX3RhcmdldERiOiBLbmV4LFxuICAgIHByaXZhdGUgdGFyZ2V0RGJOYW1lOiBcImZpeHR1cmVcIiB8IFwidGVzdFwiIHwgXCJwcm9kdWN0aW9uX21hc3RlclwiLFxuICAgIHByaXZhdGUgZW50aXR5TWFuYWdlcjogdHlwZW9mIEVudGl0eU1hbmFnZXIsXG4gICAgb3B0aW9ucz86IEZpeHR1cmVHZW5lcmF0b3JPcHRpb25zLFxuICApIHtcbiAgICB0aGlzLmRhdGFFeHBsb3JlciA9IG5ldyBEYXRhRXhwbG9yZXIoc291cmNlRGIsIGVudGl0eU1hbmFnZXIpO1xuICAgIHRoaXMubG9jYWxlID0gb3B0aW9ucz8ubG9jYWxlIHx8IFwia29cIjtcbiAgICB0aGlzLm1hcHBpbmdzID0gZmFrZXJNYXBwaW5ncztcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBsb2NhbGU6IG9wdGlvbnM/LmxvY2FsZSB8fCBcImtvXCIsXG4gICAgICB1c2VMTE06IG9wdGlvbnM/LnVzZUxMTSB8fCBmYWxzZSxcbiAgICAgIGVuYWJsZUxMTUNhY2hlOiBvcHRpb25zPy5lbmFibGVMTE1DYWNoZSAhPT0gZmFsc2UsXG4gICAgICBsbG1Nb2RlbDogb3B0aW9ucz8ubGxtTW9kZWwgfHwgXCJjbGF1ZGUtc29ubmV0LTQtNlwiLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRml4dHVyZSDsg53shLEgKOuLqOydvClcbiAgICogQHJldHVybnMg7IOd7ISx65CcIGZpeHR1cmUg642w7J207YSwICjrqZTrqqjrpqwg7IOBKVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGUoXG4gICAgZW50aXR5TmFtZTogc3RyaW5nLFxuICAgIG92ZXJyaWRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSxcbiAgICBjb250ZXh0OiBHZW5lcmF0b3JDb250ZXh0ID0gdGhpcy5jcmVhdGVDb250ZXh0KCksXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgICAvLyBFbnRpdHkg7LqQ7IuxOiDthYzsiqTtirjsl5DshJwgZW50aXR5IGNvbmUg7IiY7KCV7J20IOuwmOyYgeuQmOuPhOuhnSDrs7TsnqVcbiAgICBsZXQgZW50aXR5ID0gdGhpcy5lbnRpdHlDYWNoZS5nZXQoZW50aXR5TmFtZSk7XG4gICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgIGVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZW50aXR5TmFtZSk7XG4gICAgICB0aGlzLmVudGl0eUNhY2hlLnNldChlbnRpdHlOYW1lLCBlbnRpdHkpO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBJZCA9IGAke2VudGl0eU5hbWV9I3RlbXAjJHtEYXRlLm5vdygpfWA7IC8vIOyehOyLnCBJRFxuXG4gICAgLy8gTExNIHJvdyDri6jsnIQg7IOd7ISx7J2EIOychO2VnCDqs6DsnKAg7YKkICjqsJnsnYAgcm937J2YIO2VhOuTnOuTpOydtCDrj5nsnbztlZwgcm93S2V566W8IOqzteycoClcbiAgICBjb25zdCByb3dLZXkgPSB0aGlzLm9wdGlvbnMudXNlTExNID8gYCR7ZW50aXR5TmFtZX0jcm93IyR7RGF0ZS5ub3coKX1gIDogdW5kZWZpbmVkO1xuXG4gICAgLy8g6rCBIHByb3Drs4Qg6rCSIOyDneyEsVxuICAgIGNvbnN0IGZpeHR1cmU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgZW50aXR5LnByb3BzKSB7XG4gICAgICAvLyBWaXJ0dWFsIHByb3DsnYAg7Iqk7YK1XG4gICAgICBpZiAoXCJ2aXJ0dWFsXCIgaW4gcHJvcCAmJiBwcm9wLnZpcnR1YWwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGlkIHByb3Ag7LKY66asXG4gICAgICBpZiAocHJvcC5uYW1lID09PSBcImlkXCIpIHtcbiAgICAgICAgLy8gREIgc2VxdWVuY2XqsIAg7J6Q64+ZIO2VoOuLuTogaW50ZWdlci9iaWdJbnRlZ2Vy7J206rGw64KYLCBzdHJpbmfsnbTsp4Drp4wgZGJEZWZhdWx07JeQIG5leHR2YWzsnbQg7J6I64qUIOqyveyasFxuICAgICAgICBjb25zdCBoYXNEYlNlcXVlbmNlID1cbiAgICAgICAgICBwcm9wLnR5cGUgPT09IFwiaW50ZWdlclwiIHx8XG4gICAgICAgICAgcHJvcC50eXBlID09PSBcImJpZ0ludGVnZXJcIiB8fFxuICAgICAgICAgIChwcm9wLnR5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgIFwiZGJEZWZhdWx0XCIgaW4gcHJvcCAmJlxuICAgICAgICAgICAgdHlwZW9mIHByb3AuZGJEZWZhdWx0ID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICBwcm9wLmRiRGVmYXVsdC5pbmNsdWRlcyhcIm5leHR2YWxcIikpO1xuICAgICAgICBpZiAoaGFzRGJTZXF1ZW5jZSkge1xuICAgICAgICAgIC8vIGdlbmVyYXRlQmF0Y2jsl5DshJwg7LKY66as7ZWY66+A66GcIOyXrOq4sOyEoCDsiqTtgrVcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcC50eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgLy8gc3RyaW5nIFBLOiBhbHBoYW51bWVyaWMgMzLsnpAg7IOd7ISxIChiZXR0ZXItYXV0aCDsiqTtg4DsnbwpXG4gICAgICAgICAgY29uc3QgeyBmYWtlcjogX2Zha2VyIH0gPSBhd2FpdCBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIik7XG4gICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gX2Zha2VyLnN0cmluZy5hbHBoYW51bWVyaWMoMzIpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICAgICAgY29uc3QgeyBmYWtlcjogX2Zha2VyIH0gPSBhd2FpdCBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIik7XG4gICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gX2Zha2VyLnN0cmluZy51dWlkKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIG92ZXJyaWRl6rCAIOyeiOycvOuptCDsgqzsmqlcbiAgICAgIGlmIChwcm9wLm5hbWUgaW4gb3ZlcnJpZGVzKSB7XG4gICAgICAgIGZpeHR1cmVbcHJvcC5uYW1lXSA9IG92ZXJyaWRlc1twcm9wLm5hbWVdO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gY29uZeyXkOyEnCDsg53shLEg7KCE6561IO2ZleyduFxuICAgICAgY29uc3QgY29uZSA9IHByb3AuY29uZTtcblxuICAgICAgLy8gMS4gUmVsYXRpb24gcHJvcCDsspjrpqxcbiAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAvLyBCZWxvbmdzVG9PbmUgLyBPbmVUb09uZShoYXNKb2luQ29sdW1uKeydgCBGSyDsu6zrn7zrqoUoe3Byb3AubmFtZX1faWQp7Jy866Gc64+EIG92ZXJyaWRl66W8IOuwm+uKlOuLpFxuICAgICAgICBjb25zdCBma0NvbE5hbWUgPSBgJHtwcm9wLm5hbWV9X2lkYDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZrQ29sTmFtZSBpbiBvdmVycmlkZXMgJiZcbiAgICAgICAgICAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZml4dHVyZVtma0NvbE5hbWVdID0gb3ZlcnJpZGVzW2ZrQ29sTmFtZV07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWxhdGlvblZhbHVlID0gYXdhaXQgdGhpcy5nZW5lcmF0ZVJlbGF0aW9uVmFsdWUoZW50aXR5LCBwcm9wLCBjb250ZXh0KTtcbiAgICAgICAgLy8gQmVsb25nc1RvT25lLCBPbmVUb09uZShoYXNKb2luQ29sdW1uKeydmCDqsr3smrAgZm9yZWlnbiBrZXkg7Lus65+866qF7Jy866GcIOyggOyepVxuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHxcbiAgICAgICAgICAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pXG4gICAgICAgICkge1xuICAgICAgICAgIGZpeHR1cmVbYCR7cHJvcC5uYW1lfV9pZGBdID0gcmVsYXRpb25WYWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSByZWxhdGlvblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBjb25lLm5vdGUgKyBMTE0g7IKs7JqpICh1c2VMTE3snbTrqbQgZml4dHVyZUdlbmVyYXRvcuuztOuLpCDsmrDshKApXG4gICAgICBpZiAoY29uZT8ubm90ZSAmJiB0aGlzLm9wdGlvbnMudXNlTExNKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbGxtVmFsdWUgPSBhd2FpdCB0aGlzLmdlbmVyYXRlV2l0aExMTShjb25lLm5vdGUsIHByb3AsIGVudGl0eSwgcm93S2V5KTtcbiAgICAgICAgICAvLyBzdHJpbmcg7YOA7J6F7J206rOgIGxlbmd0aCDsoJzslb3snbQg7J6I7Jy866m0IOy0iOqzvCDsi5wgdHJ1bmNhdGlvblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBsbG1WYWx1ZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgXCJsZW5ndGhcIiBpbiBwcm9wICYmXG4gICAgICAgICAgICB0eXBlb2YgcHJvcC5sZW5ndGggPT09IFwibnVtYmVyXCIgJiZcbiAgICAgICAgICAgIGxsbVZhbHVlLmxlbmd0aCA+IHByb3AubGVuZ3RoXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBsbG1WYWx1ZS5zbGljZSgwLCBwcm9wLmxlbmd0aCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpeHR1cmVbcHJvcC5uYW1lXSA9IGxsbVZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgW0ZpeHR1cmVHZW5lcmF0b3JdIExMTSBnZW5lcmF0aW9uIGZhaWxlZCBmb3IgJHtlbnRpdHkuaWR9LiR7cHJvcC5uYW1lfSwgZmFsbGluZyBiYWNrIHRvIGZpeHR1cmVHZW5lcmF0b3Igb3IgZGVmYXVsdGAsXG4gICAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gZmFsbGJhY2s6IGZpeHR1cmVHZW5lcmF0b3Ig4oaSIGZpeHR1cmVEZWZhdWx0IOKGkiDquLDrs7jqsJLsnLzroZwg6rOE7IaNXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gMy4gZml4dHVyZUdlbmVyYXRvciDsgqzsmqlcbiAgICAgIGlmIChjb25lPy5maXh0dXJlR2VuZXJhdG9yKSB7XG4gICAgICAgIGZpeHR1cmVbcHJvcC5uYW1lXSA9IGF3YWl0IHRoaXMuZXhlY3V0ZUdlbmVyYXRvcihjb25lLmZpeHR1cmVHZW5lcmF0b3IsIHByb3AsIGVudGl0eSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyA0LiBmaXh0dXJlRGVmYXVsdCDsgqzsmqlcbiAgICAgIGlmIChjb25lPy5maXh0dXJlRGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZpeHR1cmVbcHJvcC5uYW1lXSA9IGNvbmUuZml4dHVyZURlZmF1bHQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyA1LiDtg4DsnoXrs4Qg6riw67O4IOyDneyEsVxuICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gYXdhaXQgdGhpcy5nZW5lcmF0ZURlZmF1bHRWYWx1ZShwcm9wLCBlbnRpdHkpO1xuICAgIH1cblxuICAgIC8vIDYuIGVtYWlsIO2VhOuTnOqwgCDsnojqs6AgbmFtZSDtlYTrk5zqsIAg7J6I7Jy866m0LCBlbWFpbOydmCDroZzsu6wg7YyM7Yq466W8IG5hbWUg6riw67CY7Jy866GcIOuztOyglVxuICAgIGlmIChcImVtYWlsXCIgaW4gZml4dHVyZSAmJiB0eXBlb2YgZml4dHVyZS5lbWFpbCA9PT0gXCJzdHJpbmdcIiAmJiAhKFwiZW1haWxcIiBpbiBvdmVycmlkZXMpKSB7XG4gICAgICBjb25zdCBuYW1lVmFsdWUgPSBmaXh0dXJlLm5hbWUgfHwgZml4dHVyZS51c2VybmFtZSB8fCBmaXh0dXJlLmZ1bGxfbmFtZSB8fCBmaXh0dXJlLm5hbWVfZW47XG4gICAgICBpZiAobmFtZVZhbHVlICYmIHR5cGVvZiBuYW1lVmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29uc3QgZG9tYWluID0gZml4dHVyZS5lbWFpbC5zcGxpdChcIkBcIilbMV0gfHwgXCJleGFtcGxlLmNvbVwiO1xuICAgICAgICBjb25zdCByb21hbml6ZWQgPSBhd2FpdCB0aGlzLnJvbWFuaXplTmFtZShuYW1lVmFsdWUpO1xuICAgICAgICBmaXh0dXJlLmVtYWlsID0gYCR7cm9tYW5pemVkfUAke2RvbWFpbn1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDcuIHBhc3N3b3JkIO2VhOuTnCDslZTtmLjtmZRcbiAgICBpZiAoXCJwYXNzd29yZFwiIGluIGZpeHR1cmUgJiYgZml4dHVyZS5wYXNzd29yZCAmJiB0eXBlb2YgZml4dHVyZS5wYXNzd29yZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgYmNyeXB0ID0gYXdhaXQgaW1wb3J0KFwiYmNyeXB0XCIpO1xuICAgICAgZml4dHVyZS5wYXNzd29yZCA9IGF3YWl0IGJjcnlwdC5oYXNoKGZpeHR1cmUucGFzc3dvcmQsIDEwKTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmZpeHR1cmVzLnNldCh0ZW1wSWQsIGZpeHR1cmUpO1xuICAgIHJldHVybiBmaXh0dXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uIOqwkiDsg53shLEgKyDsnpDrj5kgSW1wb3J0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlUmVsYXRpb25WYWx1ZShcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBwcm9wOiBFbnRpdHlQcm9wLFxuICAgIGNvbnRleHQ6IEdlbmVyYXRvckNvbnRleHQsXG4gICk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuICAgIGlmICghaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRml4dHVyZUdlbmVyYXRvcjogJHtlbnRpdHkuaWR9LiR7cHJvcC5uYW1lfSBpcyBub3QgYSByZWxhdGlvbiBwcm9wYCk7XG4gICAgfVxuXG4gICAgLy8gQmVsb25nc1RvT25lLCBPbmVUb09uZShoYXNKb2luQ29sdW1uKeunjCDsspjrpqxcbiAgICBpZiAoXG4gICAgICAhaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiZcbiAgICAgICEoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjb25lID0gcHJvcC5jb25lO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBjb25lPy5kYXRhU291cmNlO1xuXG4gICAgLy8gRGF0YUV4cGxvcmVy66GcIOywuOyhsCDrjbDsnbTthLAg7KGw7ZqMIChzb3VyY2VEYilcbiAgICAvLyDqtIDqs4Qg7LK07J247J2EIOuUsOudvOqwgOq4sCDsnITtlbQgZXhwbG9yZVdpdGhSZWxhdGlvbnMg7IKs7JqpXG4gICAgaWYgKGRhdGFTb3VyY2UpIHtcbiAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7cHJvcC53aXRofToke0pTT04uc3RyaW5naWZ5KGRhdGFTb3VyY2UpfWA7XG5cbiAgICAgIGlmICghY29udGV4dC5yZWZlcmVuY2VDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICAgIGNvbnN0IGV4cGxvcmVSZXN1bHQgPSBhd2FpdCB0aGlzLmRhdGFFeHBsb3Jlci5leHBsb3JlV2l0aFJlbGF0aW9ucyhwcm9wLndpdGgsIHtcbiAgICAgICAgICBzdHJhdGVneTogZGF0YVNvdXJjZS5zdHJhdGVneSxcbiAgICAgICAgICBsaW1pdDpcbiAgICAgICAgICAgICgoZGF0YVNvdXJjZS5jb25maWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpPy5saW1pdCBhc1xuICAgICAgICAgICAgICB8IG51bWJlclxuICAgICAgICAgICAgICB8IHVuZGVmaW5lZCkgfHwgMTAsXG4gICAgICAgICAgaW5jbHVkZVJlbGF0aW9uczogdHJ1ZSxcbiAgICAgICAgICBtYXhEZXB0aDogMyxcbiAgICAgICAgICAuLi4oZGF0YVNvdXJjZS5jb25maWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpLFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGV4dC5yZWZlcmVuY2VDYWNoZS5zZXQoY2FjaGVLZXksIGV4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzKTtcblxuICAgICAgICAvLyDsobDtmoztlZwg642w7J207YSw7JmAIOq0gOqzhOuQnCDrqqjrk6Ag7JeU7Yuw7Yuw66W8IHRhcmdldERi7JeQIGltcG9ydFxuICAgICAgICBhd2FpdCB0aGlzLmltcG9ydEV4cGxvcmVSZXN1bHQoZXhwbG9yZVJlc3VsdCwgY29udGV4dCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgICBpZiAoY2FuZGlkYXRlcyAmJiBjYW5kaWRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8g656c642k7ZWY6rKMIO2VmOuCmCDshKDtg51cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBjYW5kaWRhdGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNhbmRpZGF0ZXMubGVuZ3RoKV07XG4gICAgICAgIHJldHVybiBzZWxlY3RlZC5pZCBhcyBudW1iZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0YVNvdXJjZeqwgCDsl4bsnYQg65WMIOyekOuPmeycvOuhnCBmaXh0dXJlIERC7JeQ7IScIOyhsO2ajCDsi5zrj4RcbiAgICAvLyDqtIDqs4Qg7LK07J247J2EIOuUsOudvOqwgOq4sCDsnITtlbQgZXhwbG9yZVdpdGhSZWxhdGlvbnMg7IKs7JqpXG4gICAgY29uc3QgYXV0b0tleSA9IGAke3Byb3Aud2l0aH06YXV0b2A7XG4gICAgaWYgKCFjb250ZXh0LnJlZmVyZW5jZUNhY2hlLmhhcyhhdXRvS2V5KSkge1xuICAgICAgLy8gZml4dHVyZSBEQihzb3VyY2VEYinsl5DshJwg7J6Q64+ZIOyhsO2ajCAo6rSA6rOEIO2PrO2VqClcbiAgICAgIGNvbnN0IGF1dG9FeHBsb3JlUmVzdWx0ID0gYXdhaXQgdGhpcy5kYXRhRXhwbG9yZXIuZXhwbG9yZVdpdGhSZWxhdGlvbnMocHJvcC53aXRoLCB7XG4gICAgICAgIHN0cmF0ZWd5OiBcInJhbmRvbVwiLFxuICAgICAgICBsaW1pdDogMTAsXG4gICAgICAgIGluY2x1ZGVSZWxhdGlvbnM6IHRydWUsXG4gICAgICAgIG1heERlcHRoOiAzLFxuICAgICAgfSk7XG4gICAgICBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLnNldChhdXRvS2V5LCBhdXRvRXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMpO1xuXG4gICAgICAvLyDsobDtmoztlZwg642w7J207YSw7JmAIOq0gOqzhOuQnCDrqqjrk6Ag7JeU7Yuw7Yuw66W8IHRhcmdldERi7JeQIGltcG9ydFxuICAgICAgaWYgKGF1dG9FeHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW1wb3J0RXhwbG9yZVJlc3VsdChhdXRvRXhwbG9yZVJlc3VsdCwgY29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYXV0b0NhbmRpZGF0ZXMgPSBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLmdldChhdXRvS2V5KTtcbiAgICBpZiAoYXV0b0NhbmRpZGF0ZXMgJiYgYXV0b0NhbmRpZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8g656c642k7ZWY6rKMIO2VmOuCmCDshKDtg51cbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gYXV0b0NhbmRpZGF0ZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXV0b0NhbmRpZGF0ZXMubGVuZ3RoKV07XG4gICAgICByZXR1cm4gc2VsZWN0ZWQuaWQgYXMgbnVtYmVyO1xuICAgIH1cblxuICAgIC8vIOywuOyhsCDrjbDsnbTthLDqsIAg7JeG7Jy866m0IG51bGwg67CY7ZmYIChudWxsYWJsZeyduCDqsr3smrApXG4gICAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIG51bGxhYmxl7J20IOyVhOuLiOqzoCDrjbDsnbTthLDrj4Qg7JeG7Jy866m0IOyXkOufrFxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGaXh0dXJlR2VuZXJhdG9yOiAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV97JeQIO2VhOyalO2VnCAke3Byb3Aud2l0aH0g642w7J207YSw6rCAIOyXhuyKteuLiOuLpC4gYCArXG4gICAgICAgIGDrqLzsoIAgJHtwcm9wLndpdGh966W8IOyDneyEse2VmOqxsOuCmCBjb25lLmRhdGFTb3VyY2Xrpbwg7ISk7KCV7ZWY7IS47JqULmAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBsb3JlV2l0aFJlbGF0aW9ucyDqsrDqs7zrpbwgdGFyZ2V0RGLsl5AgaW1wb3J0XG4gICAqXG4gICAqIOq0gOqzhCDssrTsnbjsnYQg65Sw65286rCEIOqysOqzvChtYWluICsgcmVsYXRlZCnrpbwg66qo65GQIGltcG9ydO2VqeuLiOuLpC5cbiAgICog7J2Y7KG07ISxIOyInOyEnOuKlCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlc+qwgCDsnpDrj5nsnLzroZwg7LKY66as7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbXBvcnRFeHBsb3JlUmVzdWx0KFxuICAgIGV4cGxvcmVSZXN1bHQ6IEV4cGxvcmVXaXRoUmVsYXRpb25zUmVzdWx0LFxuICAgIGNvbnRleHQ6IEdlbmVyYXRvckNvbnRleHQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFsbEZpeHR1cmVSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcblxuICAgIC8vIDEuIFJlbGF0ZWQgZW50aXRpZXMgaW1wb3J0IChDb21wYW55LCBEZXBhcnRtZW50IOuTsSlcbiAgICBmb3IgKGNvbnN0IFtlbnRpdHlJZCwgcmVjb3Jkc10gb2YgZXhwbG9yZVJlc3VsdC5yZWxhdGVkLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICBjb25zdCByZWNvcmRzVG9JbXBvcnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXTtcblxuICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmN5YW4oYEltcG9ydGluZyByZWxhdGVkIGVudGl0eTogJHtlbnRpdHlJZH0gKCR7cmVjb3Jkcy5sZW5ndGh9IHJlY29yZHMpYCksXG4gICAgICAgICk7XG5cbiAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICAgICAgY29uc3QgcmVjb3JkS2V5ID0gYCR7ZW50aXR5SWR9IyR7cmVjb3JkLmlkfWA7XG4gICAgICAgIGlmICghY29udGV4dC5pbXBvcnRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgICAgICByZWNvcmRzVG9JbXBvcnQucHVzaChyZWNvcmQpO1xuICAgICAgICAgIGNvbnRleHQuaW1wb3J0ZWRSZWNvcmRzLmFkZChyZWNvcmRLZXkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmRzVG9JbXBvcnQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzVG9JbXBvcnQpIHtcbiAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay5ncmF5KFxuICAgICAgICAgICAgICAgIGAgIC0gUHJvY2Vzc2luZyAke2VudGl0eUlkfSByZWNvcmQ6YCxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShyZWNvcmQpLnNsaWNlKDAsIDEwMCksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGZpeHR1cmVSZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgIHJlY29yZCBhcyB7IGlkOiBudW1iZXIgfCBzdHJpbmc7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIH0sXG4gICAgICAgICAgICB7IF9kYjogdGhpcy5zb3VyY2VEYiwgc2luZ2xlUmVjb3JkOiB0cnVlIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhbGxGaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLmZpeHR1cmVSZWNvcmRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIE1haW4gZW50aXR5IGltcG9ydCAoRW1wbG95ZWUg65OxKVxuICAgIGNvbnN0IG1haW5FbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGV4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZCk7XG4gICAgY29uc3QgbWFpblJlY29yZHNUb0ltcG9ydDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuXG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICBgSW1wb3J0aW5nIG1haW4gZW50aXR5OiAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0gKCR7ZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMubGVuZ3RofSByZWNvcmRzKWAsXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgZm9yIChjb25zdCByZWNvcmQgb2YgZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMpIHtcbiAgICAgIGNvbnN0IHJlY29yZEtleSA9IGAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0jJHtyZWNvcmQuaWR9YDtcbiAgICAgIGlmICghY29udGV4dC5pbXBvcnRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgICAgbWFpblJlY29yZHNUb0ltcG9ydC5wdXNoKHJlY29yZCk7XG4gICAgICAgIGNvbnRleHQuaW1wb3J0ZWRSZWNvcmRzLmFkZChyZWNvcmRLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtYWluUmVjb3Jkc1RvSW1wb3J0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIG1haW5SZWNvcmRzVG9JbXBvcnQpIHtcbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ncmF5KFxuICAgICAgICAgICAgICBgICAtIFByb2Nlc3NpbmcgJHtleHBsb3JlUmVzdWx0Lm1haW4uZW50aXR5SWR9IHJlY29yZDpgLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShyZWNvcmQpLnNsaWNlKDAsIDEwMCksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIGNvbnN0IGZpeHR1cmVSZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgICBtYWluRW50aXR5LFxuICAgICAgICAgIHJlY29yZCBhcyB7IGlkOiBudW1iZXIgfCBzdHJpbmc7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIH0sXG4gICAgICAgICAgeyBfZGI6IHRoaXMuc291cmNlRGIsIHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgICApO1xuICAgICAgICBhbGxGaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLmZpeHR1cmVSZWNvcmRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzLiDrqqjrk6AgZml4dHVyZeulvCDtlZwg67KI7JeQIOyCveyehSAo7J2Y7KG07ISxIOyInOyEnCDsnpDrj5kg7LKY66asKVxuICAgIGlmIChhbGxGaXh0dXJlUmVjb3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyh0aGlzLnRhcmdldERiTmFtZSwgYWxsRml4dHVyZVJlY29yZHMpO1xuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICBgQXV0by1pbXBvcnRlZCAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0gd2l0aCByZWxhdGlvbnM6IGAgK1xuICAgICAgICAgICAgICBgJHtleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGh9IG1haW4gKyAke2V4cGxvcmVSZXN1bHQucmVsYXRlZC5zaXplfSByZWxhdGVkIGVudGl0aWVzYCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBmaXh0dXJlR2VuZXJhdG9yIOyLpO2WiSAoRmFrZXIuanPrp4wg7KeA7JuQKVxuICAgKlxuICAgKiBmYWtlci4qIO2YleyLneydmCDtkZztmITsi53snYQg7JWI7KCE7ZWY6rKMIO2MjOyLse2VmOyXrCDsi6Ttlontlanri4jri6QuXG4gICAqIOyYiDogXCJmYWtlci5pbnRlcm5ldC5lbWFpbCgpXCIg4oaSIGZha2VyLmludGVybmV0LmVtYWlsKClcbiAgICog7JiIOiBcImZha2VyLmxvcmVtLndvcmRzKDMpXCIg4oaSIGZha2VyLmxvcmVtLndvcmRzKDMpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVHZW5lcmF0b3IoXG4gICAgZ2VuZXJhdG9yOiBzdHJpbmcsXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgLy8gRmFrZXIuanMg7ZGc7ZiE7Iud66eMIOyngOybkFxuICAgIGlmIChnZW5lcmF0b3Iuc3RhcnRzV2l0aChcImZha2VyLlwiKSkge1xuICAgICAgLy8gdXNlcm5hbWXsnbTrgpggbmFtZSDtlYTrk5zripQg7ZWc6rWt7Ja0IGZha2VyIOyCrOyaqVxuICAgICAgY29uc3QgaXNOYW1lRmllbGQgPSBwcm9wLm5hbWUgPT09IFwidXNlcm5hbWVcIiB8fCBwcm9wLm5hbWUgPT09IFwibmFtZVwiO1xuICAgICAgY29uc3QgZmFrZXJNb2R1bGUgPSBhd2FpdCBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIik7XG4gICAgICBjb25zdCBmYWtlciA9IGlzTmFtZUZpZWxkID8gZmFrZXJNb2R1bGUuZmFrZXJLTyA6IGZha2VyTW9kdWxlLmZha2VyO1xuICAgICAgY29uc3QgZXhwciA9IGdlbmVyYXRvci5zbGljZSg2KTsgLy8gXCJmYWtlci5cIiDsoJzqsbBcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8g7ZWo7IiYIOqyveuhnOyZgCDsnbjsnpAg7YyM7IuxXG4gICAgICAgIGNvbnN0IG1hdGNoID0gZXhwci5tYXRjaCgvXihbXFx3Ll0rKSg/OlxcKCguKj8pXFwpKT8kLyk7XG4gICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRml4dHVyZUdlbmVyYXRvcjogSW52YWxpZCBmYWtlciBleHByZXNzaW9uIGZvciAke3Byb3AubmFtZX06ICR7Z2VuZXJhdG9yfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFssIHBhdGgsIGFyZ3NTdHJdID0gbWF0Y2g7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG5cbiAgICAgICAgLy8gZmFrZXIg6rCd7LK07JeQ7IScIO2VqOyImCDssL7quLBcbiAgICAgICAgbGV0IGZuOiB1bmtub3duID0gZmFrZXI7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09IFwib2JqZWN0XCIgJiYgZm4gIT09IG51bGwgJiYgcGFydCBpbiBmbikge1xuICAgICAgICAgICAgZm4gPSAoZm4gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3BhcnRdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpeHR1cmVHZW5lcmF0b3I6IEludmFsaWQgZmFrZXIgcGF0aCBmb3IgJHtwcm9wLm5hbWV9OiBmYWtlci4ke3BhdGh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g7ZWo7IiY6rCAIOyVhOuLiOuptCDsl5Drn6xcbiAgICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaXh0dXJlR2VuZXJhdG9yOiBmYWtlci4ke3BhdGh9IGlzIG5vdCBhIGZ1bmN0aW9uIChmb3IgJHtwcm9wLm5hbWV9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFyZ3M6IHVua25vd25bXSA9IFtdO1xuICAgICAgICBpZiAoYXJnc1N0cj8udHJpbSgpKSB7XG4gICAgICAgICAgYXJncyA9IHRoaXMucGFyc2VHZW5lcmF0b3JBcmdzKGFyZ3NTdHIsIHByb3AubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm4oLi4uYXJncyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBleGVjdXRlIGdlbmVyYXRvciBcIiR7Z2VuZXJhdG9yfVwiIGZvciAke3Byb3AubmFtZX0sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0OmAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVEZWZhdWx0VmFsdWUocHJvcCwgZW50aXR5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmYWtlciDsnbTsmbjsnZgg7ZGc7ZiE7Iud7J2AIOyngOybkO2VmOyngCDslYrsnYxcbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgYFVuc3VwcG9ydGVkIGdlbmVyYXRvciBleHByZXNzaW9uIGZvciAke3Byb3AubmFtZX06ICR7Z2VuZXJhdG9yfS4gT25seSBmYWtlci4qIGV4cHJlc3Npb25zIGFyZSBzdXBwb3J0ZWQuIFVzaW5nIGRlZmF1bHQgdmFsdWUuYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVEZWZhdWx0VmFsdWUocHJvcCwgZW50aXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlYTrk5zsnZgg7YOA7J6F6rO8IOydtOumhOydhCDrtoTshJ3tlZjsl6wg7KCB7KCI7ZWcIOq4sOuzuOqwkuydhCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIOyasOyEoOyInOychDpcbiAgICogMS4g7ZWE65Oc66qFIO2MqO2EtCDrp6Tsua0gKHNhbGFyeSwgYnVkZ2V0IOuTsSDsnZjrr7jsnojripQg642w7J207YSwKVxuICAgKiAyLiDtirnsiJgg7LyA7J207IqkIChEZXBhcnRtZW50IG5hbWUg65OxIOuPhOuplOyduCDsp4Dsi50pXG4gICAqIDMuIOuwsOyXtCDtg4DsnoUgKEpTT04g67Cw7Je0KVxuICAgKiA0LiBFbnVtIO2DgOyehVxuICAgKiA1LiDtg4DsnoXrs4Qg6riw67O46rCSXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRGVmYXVsdFZhbHVlKHByb3A6IEVudGl0eVByb3AsIGVudGl0eT86IEVudGl0eSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGZha2VyTW9kdWxlID0gYXdhaXQgaW1wb3J0KFwiQGZha2VyLWpzL2Zha2VyXCIpO1xuICAgIGNvbnN0IGZha2VyID0gZmFrZXJNb2R1bGUuZmFrZXI7XG4gICAgY29uc3QgZmFrZXJLTyA9IGZha2VyTW9kdWxlLmZha2VyS087XG4gICAgY29uc3QgZmFrZXJKQSA9IGZha2VyTW9kdWxlLmZha2VySkE7XG5cbiAgICBjb25zdCBsb2NhbGVGYWtlciA9IHRoaXMubG9jYWxlID09PSBcImtvXCIgPyBmYWtlcktPIDogdGhpcy5sb2NhbGUgPT09IFwiamFcIiA/IGZha2VySkEgOiBmYWtlcjtcblxuICAgIC8qKlxuICAgICAqIDEuIEVudGl0eS1zcGVjaWZpYyDtirnsiJgg7LyA7J207Iqk66W8IOuovOyggCDsspjrpqztlanri4jri6QuXG4gICAgICogZmllbGRfcGF0dGVybnPrs7Tri6Qg7Jqw7ISg7ZWY7JesLCDtirnsoJUg7JeU7Yuw7Yuw7J2YIO2VhOuTnOyXkCDrj4TrqZTsnbjsl5Ag66ee64qUIOqwkuydhCDsg53shLHtlanri4jri6QuXG4gICAgICog7JiIOiBEZXBhcnRtZW50Lm5hbWUg4oaSIO2VnOq1reyWtCDrtoDshJzrqoUgKOyCrOuejCDsnbTrpoTsnbQg7JWE64uYKVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogRGVwYXJ0bWVudCBuYW1l7J2AIO2VnOq1reyWtCDrtoDshJzrqoUg66qp66Gd7JeQ7IScIOyEoO2Dne2VqeuLiOuLpC5cbiAgICAgKiDqs6DsnKDshLHsnYQg7JyE7ZW0IDcwJSDtmZXrpaDroZwgcHJlZml4L3N1ZmZpeOulvCDstpTqsIDtlanri4jri6QuXG4gICAgICovXG4gICAgaWYgKGVudGl0eT8uaWQgPT09IFwiRGVwYXJ0bWVudFwiICYmIHByb3AubmFtZSA9PT0gXCJuYW1lXCIpIHtcbiAgICAgIGNvbnN0IGRlcGFydG1lbnRzID0gW1xuICAgICAgICBcIuqwnOuwnO2MgFwiLFxuICAgICAgICBcIuq4sO2aje2MgFwiLFxuICAgICAgICBcIuuniOy8gO2Mhe2MgFwiLFxuICAgICAgICBcIuyYgeyXhe2MgFwiLFxuICAgICAgICBcIuyduOyCrO2MgFwiLFxuICAgICAgICBcIuy0neustO2MgFwiLFxuICAgICAgICBcIuyerOustO2MgFwiLFxuICAgICAgICBcIu2ajOqzhO2MgFwiLFxuICAgICAgICBcIuuyleustO2MgFwiLFxuICAgICAgICBcIuuUlOyekOyduO2MgFwiLFxuICAgICAgICBcIklU7YyAXCIsXG4gICAgICAgIFwi6rOg6rCd7KeA7JuQ7YyAXCIsXG4gICAgICAgIFwi7ZKI7KeI6rSA66as7YyAXCIsXG4gICAgICAgIFwi7Jew6rWs6rCc67Cc7YyAXCIsXG4gICAgICAgIFwi7IOd7IKw7YyAXCIsXG4gICAgICAgIFwi6rWs66ek7YyAXCIsXG4gICAgICAgIFwi66y866WY7YyAXCIsXG4gICAgICBdO1xuICAgICAgY29uc3QgcHJlZml4ZXMgPSBbXCLsi6Dqt5xcIiwgXCLthrXtlalcIiwgXCLsoITrnrVcIiwgXCLquIDroZzrsoxcIiwgXCLrlJTsp4DthLhcIiwgXCLtlbXsi6xcIl07XG4gICAgICBjb25zdCBzdWZmaXhlcyA9IFtcIjHtjIBcIiwgXCIy7YyAXCIsIFwiM+2MgFwiLCBcIkHtjIBcIiwgXCJC7YyAXCIsIFwi67O467aAXCIsIFwi7IS87YSwXCIsIFwi6re466O5XCJdO1xuXG4gICAgICBjb25zdCBkZXB0ID0gZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQoZGVwYXJ0bWVudHMpO1xuXG4gICAgICBjb25zdCByYW5kb20gPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgaWYgKHJhbmRvbSA+IDAuNykge1xuICAgICAgICBjb25zdCBwcmVmaXggPSBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChwcmVmaXhlcyk7XG4gICAgICAgIHJldHVybiBgJHtwcmVmaXh9ICR7ZGVwdH1gO1xuICAgICAgfVxuICAgICAgaWYgKHJhbmRvbSA+IDAuNCkge1xuICAgICAgICBjb25zdCBzdWZmaXggPSBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChzdWZmaXhlcyk7XG4gICAgICAgIHJldHVybiBgJHtkZXB0fSAke3N1ZmZpeH1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlcHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogMi4g7ZWE65Oc66qF7JeQ7IScIOydmOuvuOulvCDstpTroaDtlZjsl6wg7ZiE7Iuk7KCB7J24IOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAgICog7JiIOiBzYWxhcnkg4oaSIDMwTX4xNTBNICjtlZzqta0g7Jew67SJIOuylOychClcbiAgICAgKiAgICAgYnVkZ2V0IOKGkiAxME1+NTAwTSAo7ZSE66Gc7KCd7Yq4IOyYiOyCsCDrspTsnIQpXG4gICAgICovXG4gICAgY29uc3QgbG9jYWxlTWFwcGluZ3MgPSB0aGlzLm1hcHBpbmdzW3RoaXMubG9jYWxlXSB8fCB0aGlzLm1hcHBpbmdzLmVuO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gcHJvcC5uYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXy9nLCBcIlwiKTtcblxuICAgIGZvciAoY29uc3QgW3BhdHRlcm4sIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMobG9jYWxlTWFwcGluZ3MuZmllbGRfcGF0dGVybnMpKSB7XG4gICAgICBpZiAobm9ybWFsaXplZE5hbWUuaW5jbHVkZXMocGF0dGVybi50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVGYWtlckV4cHJlc3Npb24oY29uZmlnLmZha2VyLCBwcm9wKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgICAgYEZhaWxlZCB0byBleGVjdXRlIGZpZWxkIHBhdHRlcm4gXCIke3BhdHRlcm59XCIgZm9yICR7cHJvcC5uYW1lfSwgZmFsbGluZyBiYWNrOmAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDMuIEpTT04g7YOA7J6F7J2066m07IScIOuwsOyXtOyduCDqsr3smrAgKFNvbmFtdUZpbGVbXSwgc3RyaW5nW10g65OxKVxuICAgICAqIO2VhOuTnOuqhSDtjKjthLTsnYQg67O06rOgIOyggeygiO2VnCDrsLDsl7Qg642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICAgKi9cbiAgICBpZiAocHJvcC50eXBlID09PSBcImpzb25cIiAmJiBcImlkXCIgaW4gcHJvcCAmJiBwcm9wLmlkKSB7XG4gICAgICBpZiAocHJvcC5pZC5lbmRzV2l0aChcIltdXCIpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQXJyYXlWYWx1ZShwcm9wLCBlbnRpdHksIGZha2VyLCBsb2NhbGVGYWtlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIDQuIEVudW0g7YOA7J6F7J2AIOygleydmOuQnCDqsJIg7KSRIO2VmOuCmOulvCDrnpzrjaQg7ISg7YOd7ZWp64uI64ukICovXG4gICAgaWYgKHByb3AudHlwZSA9PT0gXCJlbnVtXCIpIHtcbiAgICAgIGxldCBlbnVtVmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBpZiAoXCJlbnVtXCIgaW4gcHJvcCAmJiBBcnJheS5pc0FycmF5KHByb3AuZW51bSkgJiYgcHJvcC5lbnVtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IHByb3AuZW51bTtcbiAgICAgIH0gZWxzZSBpZiAoXCJpZFwiIGluIHByb3AgJiYgcHJvcC5pZCAmJiBlbnRpdHk/LmVudW1MYWJlbHM/Lltwcm9wLmlkXSkge1xuICAgICAgICBlbnVtVmFsdWVzID0gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHNbcHJvcC5pZF0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW51bVZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChlbnVtVmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wLm51bGxhYmxlID8gbnVsbCA6IFwiVU5LTk9XTlwiO1xuICAgIH1cblxuICAgIGlmIChwcm9wLnR5cGUgPT09IFwiZW51bVtdXCIpIHtcbiAgICAgIGxldCBlbnVtVmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBpZiAoXCJlbnVtXCIgaW4gcHJvcCAmJiBBcnJheS5pc0FycmF5KHByb3AuZW51bSkgJiYgcHJvcC5lbnVtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IHByb3AuZW51bTtcbiAgICAgIH0gZWxzZSBpZiAoXCJpZFwiIGluIHByb3AgJiYgcHJvcC5pZCAmJiBlbnRpdHk/LmVudW1MYWJlbHM/Lltwcm9wLmlkXSkge1xuICAgICAgICBlbnVtVmFsdWVzID0gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHNbcHJvcC5pZF0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW51bVZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBbZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQoZW51bVZhbHVlcyldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDUuIFZlY3RvciDtg4DsnoXsnYAg7ZiE7J6sIOyngOybkO2VmOyngCDslYrsnLzrr4DroZwgbnVsbOydhCDrsJjtmZjtlanri4jri6QuXG4gICAgICog7Zal7ZuEIEFJIGVtYmVkZGluZyDsg53shLEg6riw64qlIOy2lOqwgCDsi5wg6rWs7ZiEIOyYiOygleyeheuLiOuLpC5cbiAgICAgKi9cbiAgICBpZiAocHJvcC50eXBlID09PSBcInZlY3RvclwiIHx8IHByb3AudHlwZSA9PT0gXCJ2ZWN0b3JbXVwiIHx8IHByb3AudHlwZSA9PT0gXCJ0c3ZlY3RvclwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKiogNi4g7YOA7J6F67OEIOq4sOuzuCBGYWtlciDtkZztmITsi53snYQg7Iuk7ZaJ7ZWp64uI64ukICovXG4gICAgY29uc3QgdHlwZURlZmF1bHQgPSBsb2NhbGVNYXBwaW5ncy50eXBlX2RlZmF1bHRzW3Byb3AudHlwZV07XG4gICAgaWYgKHR5cGVEZWZhdWx0KSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlRmFrZXJFeHByZXNzaW9uKHR5cGVEZWZhdWx0LmZha2VyLCBwcm9wKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KGBGYWlsZWQgdG8gZXhlY3V0ZSB0eXBlIGRlZmF1bHQgZm9yICR7cHJvcC50eXBlfSwgdXNpbmcgZmFsbGJhY2s6YCwgZXJyb3IpLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIDcuIOunpO2VkeuQmOyngCDslYrsnYAg7YOA7J6F7J2AIOq4sOuzuCBGYWtlciDtlajsiJjroZwg7LKY66as7ZWp64uI64ukICovXG4gICAgc3dpdGNoIChwcm9wLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIGNhc2UgXCJzdHJpbmdbXVwiOlxuICAgICAgICByZXR1cm4gZmFrZXIubG9yZW0ud29yZHMoMyk7XG4gICAgICBjYXNlIFwiaW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gZmFrZXIubnVtYmVyLmludCh7IG1pbjogMSwgbWF4OiAxMDAwIH0pO1xuICAgICAgY2FzZSBcImludGVnZXJbXVwiOlxuICAgICAgICByZXR1cm4gW2Zha2VyLm51bWJlci5pbnQoeyBtaW46IDEsIG1heDogMTAwMCB9KV07XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gZmFrZXIubnVtYmVyLmJpZ0ludCh7IG1pbjogMW4sIG1heDogMTAwMG4gfSk7XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlcltdXCI6XG4gICAgICAgIHJldHVybiBbZmFrZXIubnVtYmVyLmJpZ0ludCh7IG1pbjogMW4sIG1heDogMTAwMG4gfSldO1xuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgY2FzZSBcIm51bWVyaWNcIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLm51bWJlci5mbG9hdCh7IG1pbjogMCwgbWF4OiAxMDAwIH0pO1xuICAgICAgY2FzZSBcIm51bWJlcltdXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1tdXCI6XG4gICAgICAgIHJldHVybiBbZmFrZXIubnVtYmVyLmZsb2F0KHsgbWluOiAwLCBtYXg6IDEwMDAgfSldO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLmRhdGF0eXBlLmJvb2xlYW4oKTtcbiAgICAgIGNhc2UgXCJib29sZWFuW11cIjpcbiAgICAgICAgcmV0dXJuIFtmYWtlci5kYXRhdHlwZS5ib29sZWFuKCldO1xuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIGNhc2UgXCJkYXRlW11cIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLmRhdGUucGFzdCgpO1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgY2FzZSBcInV1aWRcIjpcbiAgICAgIGNhc2UgXCJ1dWlkW11cIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLnN0cmluZy51dWlkKCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog67Cw7Je0IO2DgOyeheydmCDqsJLsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiDtg4DsnoUgSUTsmYAg7ZWE65Oc66qFIO2MqO2EtOydhCDrtoTshJ3tlZjsl6wg7KCB7KCI7ZWcIOuwsOyXtCDrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKiDsmIg6IGltYWdlX3VybHMg4oaSIFt7dXJsLCBuYW1lLCBtaW1lX3R5cGV9LCAuLi5dXG4gICAqICAgICB0YWdfaWRzIOKGkiBbMSwgMjMsIDQ1XVxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZUFycmF5VmFsdWUoXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBfZW50aXR5OiBFbnRpdHkgfCB1bmRlZmluZWQsXG4gICAgZmFrZXI6IHR5cGVvZiBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIikuZmFrZXIsXG4gICAgX2xvY2FsZUZha2VyOiB0eXBlb2YgaW1wb3J0KFwiQGZha2VyLWpzL2Zha2VyXCIpLmZha2VyLFxuICApOiB1bmtub3duW10ge1xuICAgIGNvbnN0IGNvdW50ID0gZmFrZXIubnVtYmVyLmludCh7IG1pbjogMSwgbWF4OiAzIH0pO1xuXG4gICAgLyoqIFNvbmFtdUZpbGVbXeydgCBTb25hbXUg64K07J6lIO2DgOyeheycvOuhnCDqtazsobDqsIAg7KCV7ZW07KC4IOyeiOyKteuLiOuLpCAqL1xuICAgIGlmIChcImlkXCIgaW4gcHJvcCAmJiBwcm9wLmlkID09PSBcIlNvbmFtdUZpbGVbXVwiKSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKCkgPT4gKHtcbiAgICAgICAgdXJsOiBmYWtlci5pbWFnZS51cmwoKSxcbiAgICAgICAgbmFtZTogZmFrZXIuc3lzdGVtLmZpbGVOYW1lKCksXG4gICAgICAgIG1pbWVfdHlwZTogZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQoW1xuICAgICAgICAgIFwiaW1hZ2UvanBlZ1wiLFxuICAgICAgICAgIFwiaW1hZ2UvcG5nXCIsXG4gICAgICAgICAgXCJpbWFnZS9naWZcIixcbiAgICAgICAgICBcImFwcGxpY2F0aW9uL3BkZlwiLFxuICAgICAgICBdKSxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvKiog7ZWE65Oc66qF7JeQ7IScIOuwsOyXtOydmCDsmqnrj4Trpbwg7LaU66Gg7ZWp64uI64ukICovXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBwcm9wLm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csIFwiXCIpO1xuXG4gICAgaWYgKG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwidXJsXCIpIHx8IG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwiaW1hZ2VcIikpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiBmYWtlci5pbnRlcm5ldC51cmwoKSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwiaWRcIikgJiYgbm9ybWFsaXplZE5hbWUuZW5kc1dpdGgoXCJzXCIpKSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKCkgPT4gZmFrZXIubnVtYmVyLmludCh7IG1pbjogMSwgbWF4OiAxMDAgfSkpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkTmFtZS5pbmNsdWRlcyhcInRhZ1wiKSB8fCBub3JtYWxpemVkTmFtZS5pbmNsdWRlcyhcIm5hbWVcIikpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiBmYWtlci5sb3JlbS53b3JkKCkpO1xuICAgIH1cblxuICAgIC8qKiDtjKjthLQg66ek7Lmt65CY7KeAIOyViuycvOuptCDruYgg67Cw7Je07J2EIOuwmO2ZmO2VqeuLiOuLpCAqL1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OIOunpO2VkeydmCBGYWtlciDtkZztmITsi53snYQg7YyM7Iux7ZWY7JesIOyLpO2Wie2VqeuLiOuLpC5cbiAgICpcbiAgICog7ZGc7ZiE7IudIOyYiOyLnDpcbiAgICogLSBcImZha2VyLmludGVybmV0LmVtYWlsKClcIiDihpIg7J247J6QIOyXhuydjFxuICAgKiAtIFwiZmFrZXIubnVtYmVyLmludCh7IG1pbjogMSwgbWF4OiAxMDAgfSlcIiDihpIgSlNPTiDsnbjsnpBcbiAgICogLSBcInt9XCIg4oaSIOumrO2EsOuftCDqsJIgKEpTT04ucGFyc2UpXG4gICAqXG4gICAqIGZha2VyS08sIGZha2VySkHrj4Qg7KeA7JuQ7ZWY7JesIOuLpOq1reyWtCDrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlRmFrZXJFeHByZXNzaW9uKGV4cHJlc3Npb246IHN0cmluZywgcHJvcDogRW50aXR5UHJvcCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGZha2VyTW9kdWxlID0gYXdhaXQgaW1wb3J0KFwiQGZha2VyLWpzL2Zha2VyXCIpO1xuICAgIGNvbnN0IGZha2VyID0gZmFrZXJNb2R1bGUuZmFrZXI7XG4gICAgY29uc3QgZmFrZXJLTyA9IGZha2VyTW9kdWxlLmZha2VyS087XG4gICAgY29uc3QgZmFrZXJKQSA9IGZha2VyTW9kdWxlLmZha2VySkE7XG5cbiAgICAvKiogRmFrZXIg7ZGc7ZiE7Iud7J20IOyVhOuLjCDrpqzthLDrn7Qg6rCS7J2AIEpTT07snLzroZwg7YyM7Iux7ZWp64uI64ukICovXG4gICAgaWYgKCFleHByZXNzaW9uLnN0YXJ0c1dpdGgoXCJmYWtlclwiKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZXhwcmVzc2lvbik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIO2RnO2YhOyLneyXkOyEnCBGYWtlciDqsJ3ssrTsmYAg6rK966Gc66W8IOy2lOy2nO2VqeuLiOuLpCAqL1xuICAgIGNvbnN0IG1hdGNoID0gZXhwcmVzc2lvbi5tYXRjaCgvXihmYWtlcnxmYWtlcktPfGZha2VySkEpXFwuKC4qPykkLyk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZha2VyIGV4cHJlc3Npb246ICR7ZXhwcmVzc2lvbn1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBbLCBmYWtlck5hbWUsIGV4cHJdID0gbWF0Y2g7XG4gICAgY29uc3Qgc2VsZWN0ZWRGYWtlciA9XG4gICAgICBmYWtlck5hbWUgPT09IFwiZmFrZXJLT1wiID8gZmFrZXJLTyA6IGZha2VyTmFtZSA9PT0gXCJmYWtlckpBXCIgPyBmYWtlckpBIDogZmFrZXI7XG5cbiAgICBjb25zdCBmdW5jTWF0Y2ggPSBleHByLm1hdGNoKC9eKFtcXHcuXSspKD86XFwoKC4qPylcXCkpPyQvKTtcbiAgICBpZiAoIWZ1bmNNYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZha2VyIGV4cHJlc3Npb24gZm9yICR7cHJvcC5uYW1lfTogJHtleHByZXNzaW9ufWApO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHBhdGgsIGFyZ3NTdHJdID0gZnVuY01hdGNoO1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG5cbiAgICAvKiog7KCQIO2RnOq4sOuylShkb3Qgbm90YXRpb24p7Jy866GcIEZha2VyIO2VqOyImOulvCDssL7slYTqsJHri4jri6QgKi9cbiAgICBsZXQgZm46IHVua25vd24gPSBzZWxlY3RlZEZha2VyO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gXCJvYmplY3RcIiAmJiBmbiAhPT0gbnVsbCAmJiBwYXJ0IGluIGZuKSB7XG4gICAgICAgIGZuID0gKGZuIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwYXJ0XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmYWtlciBwYXRoIGZvciAke3Byb3AubmFtZX06ICR7ZmFrZXJOYW1lfS4ke3BhdGh9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZmFrZXJOYW1lfS4ke3BhdGh9IGlzIG5vdCBhIGZ1bmN0aW9uIChmb3IgJHtwcm9wLm5hbWV9KWApO1xuICAgIH1cblxuICAgIGxldCBhcmdzOiB1bmtub3duW10gPSBbXTtcbiAgICBpZiAoYXJnc1N0cj8udHJpbSgpKSB7XG4gICAgICBhcmdzID0gdGhpcy5wYXJzZUdlbmVyYXRvckFyZ3MoYXJnc1N0ciwgcHJvcC5uYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm4oLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogZml4dHVyZUhpbnTrpbwgTExN7JeQ6rKMIOyghOuLrO2VmOyXrCDtmITsi6TsoIHsnbgg7YWM7Iqk7Yq4IOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIGZha2VyLmpz66Gc64qUIOyDneyEse2VmOq4sCDslrTroKTsmrQg67O17J6h7ZWcIO2FjeyKpO2KuCjsnpDquLDshozqsJwsIOyEpOuqheusuCDrk7Ep66W8XG4gICAqIExMTeydhCDtmZzsmqntlZjsl6wg7IOd7ISx7ZWp64uI64ukLiDrj5nsnbztlZwgaGludOyXkCDrjIDtlZwg7KSR67O1IO2YuOy2nOydhCDrsKnsp4DtlZjquLAg7JyE7ZW0XG4gICAqIOy6kOyLseydhCDquLDrs7jsnLzroZwg7KeA7JuQ7ZWp64uI64ukIChMTE0gQVBJIOu5hOyaqSDsoIjqsJApLlxuICAgKlxuICAgKiBhaSDtjKjtgqTsp4DripQgZHluYW1pYyBpbXBvcnTroZwg67aI65+s7Jik66+A66GcLCB1c2VMTE3snbQgZmFsc2Xsnbgg6rK97JqwXG4gICAqIOydmOyhtOyEseydtCDshKTsuZjrkJjsp4Ag7JWK7JWE64+EIGZpeHR1cmUg7IOd7ISx7J20IOygleyDgSDrj5nsnpHtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlV2l0aExMTShcbiAgICBmaXh0dXJlSGludDogc3RyaW5nLFxuICAgIHByb3A6IEVudGl0eVByb3AsXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgcm93S2V5Pzogc3RyaW5nLFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAvLyByb3dLZXnqsIAg7J6I7Jy866m0IHJvdyDri6jsnIQg7IOd7ISxIOyghOuetSDsgqzsmqlcbiAgICBpZiAocm93S2V5KSB7XG4gICAgICBjb25zdCByb3dDYWNoZUtleSA9IGAke3Jvd0tleX06JHtwcm9wLm5hbWV9YDtcblxuICAgICAgLy8g7J2066+4IOydtCByb3fsl5Ag64yA7ZWcIExMTSDtmLjstpzsnbQg7JmE66OM65CcIOqyveyasCDsupDsi5zsl5DshJwg67CU66GcIOuwmO2ZmFxuICAgICAgaWYgKHRoaXMubGxtQ2FjaGUuaGFzKHJvd0NhY2hlS2V5KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sbG1DYWNoZS5nZXQocm93Q2FjaGVLZXkpO1xuICAgICAgfVxuXG4gICAgICAvLyDsg4ggcm93OiBMTE0g64yA7IOBIHByb3Ag7KCE7LK066W8IO2VnCDrsojsl5Ag7IOd7ISxXG4gICAgICBjb25zdCBsbG1Qcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoKHApID0+IHtcbiAgICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHApKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChwLmNvbmU/LmZpeHR1cmVHZW5lcmF0b3IpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHAubmFtZSA9PT0gXCJpZFwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiAhIXAuY29uZT8ubm90ZTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBsbG1Qcm9wc+qwgCDruYTslrTsnojsnLzrqbQg64uo7J28IO2VhOuTnCDrsKnsi53snLzroZwgZmFsbGJhY2tcbiAgICAgIGlmIChsbG1Qcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgW0ZpeHR1cmVHZW5lcmF0b3JdIGxsbVByb3BzIGlzIGVtcHR5IGZvciAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV9LCB1c2luZyBzaW5nbGUgZmllbGQgZmFsbGJhY2tgLFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU2luZ2xlV2l0aExMTShmaXh0dXJlSGludCwgcHJvcCwgZW50aXR5KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXBpS2V5ID0gdGhpcy5nZXRBcGlLZXkoKTtcbiAgICAgIGNvbnN0IHsgY3JlYXRlQW50aHJvcGljIH0gPSBhd2FpdCBpbXBvcnQoXCJAYWktc2RrL2FudGhyb3BpY1wiKTtcbiAgICAgIGNvbnN0IHsgZ2VuZXJhdGVUZXh0IH0gPSBhd2FpdCBpbXBvcnQoXCJhaVwiKTtcblxuICAgICAgY29uc3Qgcm93UmVzcG9uc2UgPSBhd2FpdCBnZW5lcmF0ZVRleHQoe1xuICAgICAgICBtb2RlbDogY3JlYXRlQW50aHJvcGljKHsgYXBpS2V5IH0pKHRoaXMub3B0aW9ucy5sbG1Nb2RlbCB8fCBcImNsYXVkZS1zb25uZXQtNC02XCIpLFxuICAgICAgICBwcm9tcHQ6IHRoaXMuYnVpbGRSb3dMTE1Qcm9tcHQobGxtUHJvcHMsIGVudGl0eSksXG4gICAgICB9KTtcbiAgICAgIGlmICghcm93UmVzcG9uc2UgfHwgdHlwZW9mIHJvd1Jlc3BvbnNlLnRleHQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBMTE0gcmVzcG9uc2VcIik7XG4gICAgICB9XG5cbiAgICAgIC8vIOydkeuLteydhCDtjIzsi7HtlZjsl6wg6rCBIO2VhOuTnOyXkCDrjIDtlZwg6rKw6rO866W8IOy6kOyLnOyXkCDsoIDsnqVcbiAgICAgIGNvbnN0IHJvd1Jlc3VsdCA9IHRoaXMucGFyc2VSb3dMTE1SZXNwb25zZShyb3dSZXNwb25zZS50ZXh0LCBsbG1Qcm9wcyk7XG4gICAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyb3dSZXN1bHQpKSB7XG4gICAgICAgIHRoaXMubGxtQ2FjaGUuc2V0KGAke3Jvd0tleX06JHtmaWVsZE5hbWV9YCwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICAvLyDsmpTssq3tlZwg7ZWE65Oc7J2YIOqwkiDrsJjtmZggKOyXhuycvOuptCDri6jsnbwg7ZWE65OcIGZhbGxiYWNrKVxuICAgICAgaWYgKHRoaXMubGxtQ2FjaGUuaGFzKHJvd0NhY2hlS2V5KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sbG1DYWNoZS5nZXQocm93Q2FjaGVLZXkpO1xuICAgICAgfVxuXG4gICAgICAvLyDrp4zslb0gcm93IOydkeuLteyXkCDsnbQg7ZWE65Oc6rCAIOuIhOudveuQnCDqsr3smrAg64uo7J28IO2VhOuTnCBmYWxsYmFja1xuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVTaW5nbGVXaXRoTExNKGZpeHR1cmVIaW50LCBwcm9wLCBlbnRpdHkpO1xuICAgIH1cblxuICAgIC8vIHJvd0tleeqwgCDsl4bsnLzrqbQg6riw7KG0IOuLqOydvCDtlYTrk5wg67Cp7IudXG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVTaW5nbGVXaXRoTExNKGZpeHR1cmVIaW50LCBwcm9wLCBlbnRpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIOuLqOydvCDtlYTrk5zrpbwgTExN7Jy866GcIOyDneyEse2VqeuLiOuLpCAocm93S2V5IOyXhuydhCDrlYwgZmFsbGJhY2vsmqkpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlU2luZ2xlV2l0aExMTShcbiAgICBmaXh0dXJlSGludDogc3RyaW5nLFxuICAgIHByb3A6IEVudGl0eVByb3AsXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7ZW50aXR5LmlkfToke3Byb3AubmFtZX06JHtmaXh0dXJlSGludH1gO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTExNQ2FjaGUgJiYgdGhpcy5sbG1DYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5sbG1DYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgIH1cblxuICAgIGNvbnN0IGFwaUtleSA9IHRoaXMuZ2V0QXBpS2V5KCk7XG4gICAgY29uc3QgeyBjcmVhdGVBbnRocm9waWMgfSA9IGF3YWl0IGltcG9ydChcIkBhaS1zZGsvYW50aHJvcGljXCIpO1xuICAgIGNvbnN0IHsgZ2VuZXJhdGVUZXh0IH0gPSBhd2FpdCBpbXBvcnQoXCJhaVwiKTtcblxuICAgIGNvbnN0IHNpbmdsZVJlc3BvbnNlID0gYXdhaXQgZ2VuZXJhdGVUZXh0KHtcbiAgICAgIG1vZGVsOiBjcmVhdGVBbnRocm9waWMoeyBhcGlLZXkgfSkodGhpcy5vcHRpb25zLmxsbU1vZGVsIHx8IFwiY2xhdWRlLXNvbm5ldC00LTZcIiksXG4gICAgICBwcm9tcHQ6IHRoaXMuYnVpbGRMTE1Qcm9tcHQoZml4dHVyZUhpbnQsIHByb3AsIGVudGl0eSksXG4gICAgfSk7XG4gICAgaWYgKCFzaW5nbGVSZXNwb25zZSB8fCB0eXBlb2Ygc2luZ2xlUmVzcG9uc2UudGV4dCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBMTE0gcmVzcG9uc2VcIik7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnBhcnNlTExNUmVzcG9uc2Uoc2luZ2xlUmVzcG9uc2UudGV4dCwgcHJvcC50eXBlKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUxMTUNhY2hlKSB7XG4gICAgICB0aGlzLmxsbUNhY2hlLnNldChjYWNoZUtleSwgdmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiByb3cg7KCE7LK066W8IO2VnCDrsojsl5Ag7IOd7ISx7ZWY64qUIExMTSDtlITroaztlITtirjrpbwg66eM65Ot64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFJvd0xMTVByb21wdChwcm9wczogRW50aXR5UHJvcFtdLCBlbnRpdHk6IEVudGl0eSk6IHN0cmluZyB7XG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5vcHRpb25zLmxvY2FsZSB8fCBcImtvXCI7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBsb2NhbGUgPT09IFwia29cIiA/IFwiS29yZWFuXCIgOiBsb2NhbGUgPT09IFwiamFcIiA/IFwiSmFwYW5lc2VcIiA6IFwiRW5nbGlzaFwiO1xuXG4gICAgY29uc3QgZmllbGREZXNjcmlwdGlvbnMgPSBwcm9wc1xuICAgICAgLm1hcCgocCkgPT4ge1xuICAgICAgICBsZXQgZGVzYyA9IGAtICR7cC5uYW1lfSAoJHtwLnR5cGV9KTogJHtwLmNvbmU/Lm5vdGUgPz8gXCJcIn1gO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHAudHlwZSA9PT0gXCJlbnVtXCIgfHwgcC50eXBlID09PSBcImVudW1bXVwiKSAmJlxuICAgICAgICAgIFwiaWRcIiBpbiBwICYmXG4gICAgICAgICAgcC5pZCAmJlxuICAgICAgICAgIGVudGl0eS5lbnVtTGFiZWxzPy5bcC5pZF1cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHNbcC5pZF0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICBkZXNjICs9IGAgW2FsbG93ZWQgdmFsdWVzOiAke3ZhbHVlc31dYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzYztcbiAgICAgIH0pXG4gICAgICAuam9pbihcIlxcblwiKTtcblxuICAgIC8vIExMTSDrjIDsg4HsnbQg7JWE64uMIHByb3Drk6Trj4Qg66el65297Jy866GcIOygnOqztSAocmVsYXRpb24g7KCc7Jm4KVxuICAgIGNvbnN0IG90aGVyUHJvcHMgPSBlbnRpdHkucHJvcHNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChwKSA9PlxuICAgICAgICAgICFwcm9wcy5pbmNsdWRlcyhwKSAmJlxuICAgICAgICAgICFpc1JlbGF0aW9uUHJvcChwKSAmJlxuICAgICAgICAgIHAubmFtZSAhPT0gXCJpZFwiICYmXG4gICAgICAgICAgIShcInZpcnR1YWxcIiBpbiBwICYmIHAudmlydHVhbCksXG4gICAgICApXG4gICAgICAubWFwKChwKSA9PiB7XG4gICAgICAgIGxldCBkZXNjID0gYC0gJHtwLm5hbWV9ICgke3AudHlwZX0pYDtcbiAgICAgICAgaWYgKHAuY29uZT8ubm90ZSkgZGVzYyArPSBgOiAke3AuY29uZS5ub3RlfWA7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAocC50eXBlID09PSBcImVudW1cIiB8fCBwLnR5cGUgPT09IFwiZW51bVtdXCIpICYmXG4gICAgICAgICAgXCJpZFwiIGluIHAgJiZcbiAgICAgICAgICBwLmlkICYmXG4gICAgICAgICAgZW50aXR5LmVudW1MYWJlbHM/LltwLmlkXVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBPYmplY3Qua2V5cyhlbnRpdHkuZW51bUxhYmVsc1twLmlkXSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgIGRlc2MgKz0gYCBbYWxsb3dlZCB2YWx1ZXM6ICR7dmFsdWVzfV1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXNjO1xuICAgICAgfSlcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuICAgIGNvbnN0IG90aGVyUHJvcHNDb250ZXh0ID0gb3RoZXJQcm9wc1xuICAgICAgPyBgXFxuXFxuT3RoZXIgZmllbGRzIGluIHRoaXMgZW50aXR5IChmb3IgY29udGV4dCwgZG8gTk9UIGdlbmVyYXRlIHRoZXNlKTpcXG4ke290aGVyUHJvcHN9YFxuICAgICAgOiBcIlwiO1xuXG4gICAgY29uc3Qgb3V0cHV0U2hhcGUgPSBwcm9wcy5tYXAoKHApID0+IGAgIFwiJHtwLm5hbWV9XCI6IDwke3AudHlwZX0+YCkuam9pbihcIixcXG5cIik7XG5cbiAgICBjb25zdCBlbnRpdHlDb250ZXh0ID0gZW50aXR5LmNvbmU/Lm5vdGUgPyBgXFxuRW50aXR5IGRlc2NyaXB0aW9uOiAke2VudGl0eS5jb25lLm5vdGV9YCA6IFwiXCI7XG5cbiAgICByZXR1cm4gYEdlbmVyYXRlIHRlc3QgZml4dHVyZSBkYXRhIGZvciB0aGUgJHtlbnRpdHkuaWR9IGVudGl0eS4gQWxsIGZpZWxkcyBtdXN0IGJlIGNvaGVyZW50IGFuZCBjb25zaXN0ZW50IHdpdGggZWFjaCBvdGhlci5cblxuRW50aXR5OiAke2VudGl0eS5pZH0ke2VudGl0eUNvbnRleHR9XG5Mb2NhbGU6ICR7bG9jYWxlfSAodXNlICR7bGFuZ3VhZ2V9IGZvciB0ZXh0IGZpZWxkcylcblxuRmllbGRzIHRvIGdlbmVyYXRlOlxuJHtmaWVsZERlc2NyaXB0aW9uc30ke290aGVyUHJvcHNDb250ZXh0fVxuXG5SdWxlczpcbi0gQWxsIGZpZWxkcyBpbiBhIHNpbmdsZSByb3cgbXVzdCBiZSBsb2dpY2FsbHkgY29uc2lzdGVudCAoZS5nLiBuYW1lL25hbWVfZW4vbmFtZV9jbiBzaG91bGQgcmVwcmVzZW50IHRoZSBzYW1lIHBlcnNvbilcbi0gUmV0dXJuIE9OTFkgdmFsaWQgSlNPTiwgbm8gbWFya2Rvd24gb3IgZXhwbGFuYXRpb25cbi0gRGF0ZXMgaW4gSVNPIDg2MDEgZm9ybWF0XG4tIFVzZSAke2xhbmd1YWdlfSBmb3IgdGV4dCB1bmxlc3MgZmllbGQgZGVzY3JpcHRpb24gc2F5cyBvdGhlcndpc2VcblxuUmV0dXJuIGV4YWN0bHkgdGhpcyBKU09OIHNoYXBlOlxue1xuJHtvdXRwdXRTaGFwZX1cbn1gO1xuICB9XG5cbiAgLyoqXG4gICAqIHJvdyBMTE0g7J2R64u17J2EIO2MjOyLse2VmOyXrCDtlYTrk5zrs4Qg6rCS7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgcGFyc2VSb3dMTE1SZXNwb25zZSh0ZXh0OiBzdHJpbmcsIHByb3BzOiBFbnRpdHlQcm9wW10pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QganNvblRleHQgPSB0ZXh0XG4gICAgICAudHJpbSgpXG4gICAgICAucmVwbGFjZSgvXmBgYGpzb25cXHMqL2ksIFwiXCIpXG4gICAgICAucmVwbGFjZSgvYGBgXFxzKiQvLCBcIlwiKVxuICAgICAgLnRyaW0oKTtcblxuICAgIGxldCBwYXJzZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBKU09OLnBhcnNlKGpzb25UZXh0KTtcbiAgICAgIGlmICh0eXBlb2YgcmF3ICE9PSBcIm9iamVjdFwiIHx8IHJhdyA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KHJhdykpIHtcbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW0ZpeHR1cmVHZW5lcmF0b3JdIFJvdyBMTE0gcmVzcG9uc2UgaXMgbm90IGEgcGxhaW4gb2JqZWN0OlwiLCB0ZXh0KTtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgcGFyc2VkID0gcmF3IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIH0gY2F0Y2gge1xuICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUud2FybihcIltGaXh0dXJlR2VuZXJhdG9yXSBGYWlsZWQgdG8gcGFyc2Ugcm93IExMTSByZXNwb25zZTpcIiwgdGV4dCk7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgICAgaWYgKHByb3AubmFtZSBpbiBwYXJzZWQpIHtcbiAgICAgICAgcmVzdWx0W3Byb3AubmFtZV0gPSB0aGlzLnBhcnNlTExNUmVzcG9uc2UoU3RyaW5nKHBhcnNlZFtwcm9wLm5hbWVdID8/IFwiXCIpLCBwcm9wLnR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZExMTVByb21wdChoaW50OiBzdHJpbmcsIHByb3A6IEVudGl0eVByb3AsIGVudGl0eTogRW50aXR5KTogc3RyaW5nIHtcbiAgICBjb25zdCBsb2NhbGUgPSB0aGlzLm9wdGlvbnMubG9jYWxlIHx8IFwia29cIjtcbiAgICBjb25zdCBsYW5ndWFnZSA9IGxvY2FsZSA9PT0gXCJrb1wiID8gXCJLb3JlYW5cIiA6IGxvY2FsZSA9PT0gXCJqYVwiID8gXCJKYXBhbmVzZVwiIDogXCJFbmdsaXNoXCI7XG5cbiAgICBjb25zdCBlbnRpdHlDb250ZXh0ID0gZW50aXR5LmNvbmU/Lm5vdGUgPyBgXFxuRW50aXR5IGNvbnRleHQ6ICR7ZW50aXR5LmNvbmUubm90ZX1gIDogXCJcIjtcblxuICAgIGNvbnN0IG90aGVyRmllbGRzID0gZW50aXR5LnByb3BzXG4gICAgICAuZmlsdGVyKChwKSA9PiBwLm5hbWUgIT09IHByb3AubmFtZSAmJiAhaXNSZWxhdGlvblByb3AocCkgJiYgcC5jb25lPy5ub3RlKVxuICAgICAgLm1hcCgocCkgPT4gYC0gJHtwLm5hbWV9ICgke3AudHlwZX0pOiAke3AuY29uZT8ubm90ZX1gKVxuICAgICAgLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3Qgb3RoZXJGaWVsZHNDb250ZXh0ID0gb3RoZXJGaWVsZHNcbiAgICAgID8gYFxcblxcbk90aGVyIGZpZWxkcyBpbiB0aGlzIGVudGl0eSAoZm9yIGNvbnRleHQpOlxcbiR7b3RoZXJGaWVsZHN9YFxuICAgICAgOiBcIlwiO1xuXG4gICAgbGV0IHByb21wdCA9IGBHZW5lcmF0ZSB0ZXN0IGRhdGEgZm9yICR7ZW50aXR5LmlkfS4ke3Byb3AubmFtZX0gKHR5cGU6ICR7cHJvcC50eXBlfSkke2VudGl0eUNvbnRleHR9JHtvdGhlckZpZWxkc0NvbnRleHR9XG5cblJlcXVpcmVtZW50OiAke2hpbnR9XG5cblJ1bGVzOlxuLSBSZXR1cm4gT05MWSB0aGUgdmFsdWUsIG5vIGV4cGxhbmF0aW9uIG9yIG1hcmtkb3duXG4tIFVzZSAke2xhbmd1YWdlfSBsYW5ndWFnZSBpZiBhcHBsaWNhYmxlXG4tIEZvcm1hdDogJHt0aGlzLmdldEV4cGVjdGVkRm9ybWF0KHByb3AudHlwZSl9YDtcblxuICAgIC8vIGVudW0g7YOA7J6F7J24IOqyveyasCDqsIDriqXtlZwg6rCSIOuqqeuhnSDstpTqsIBcbiAgICBpZiAocHJvcC50eXBlID09PSBcImVudW1cIiB8fCBwcm9wLnR5cGUgPT09IFwiZW51bVtdXCIpIHtcbiAgICAgIGxldCBlbnVtVmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBpZiAoXCJlbnVtXCIgaW4gcHJvcCAmJiBBcnJheS5pc0FycmF5KHByb3AuZW51bSkgJiYgcHJvcC5lbnVtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IHByb3AuZW51bTtcbiAgICAgIH0gZWxzZSBpZiAoXCJpZFwiIGluIHByb3AgJiYgcHJvcC5pZCAmJiBlbnRpdHk/LmVudW1MYWJlbHM/Lltwcm9wLmlkXSkge1xuICAgICAgICBlbnVtVmFsdWVzID0gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHNbcHJvcC5pZF0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW51bVZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHByb21wdCArPSBgXFxuLSBJTVBPUlRBTlQ6IENob29zZSBPTkxZIGZyb20gdGhlc2UgYWxsb3dlZCB2YWx1ZXM6ICR7ZW51bVZhbHVlcy5qb2luKFwiLCBcIil9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm9tcHQgKz0gYFxcblxcbkV4YW1wbGU6ICR7dGhpcy5nZXRFeGFtcGxlRm9yVHlwZShwcm9wLnR5cGUsIGxvY2FsZSl9YDtcblxuICAgIHJldHVybiBwcm9tcHQ7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlTExNUmVzcG9uc2UodGV4dDogc3RyaW5nLCBwcm9wVHlwZTogc3RyaW5nKTogdW5rbm93biB7XG4gICAgY29uc3QgY2xlYW5lZCA9IHRleHQudHJpbSgpO1xuXG4gICAgLy8g67Cw7Je0IO2DgOyehSDsspjrpqxcbiAgICBpZiAocHJvcFR5cGUuZW5kc1dpdGgoXCJbXVwiKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjbGVhbmVkKTtcbiAgICAgICAgY29uc3QgYmFzZVR5cGUgPSBwcm9wVHlwZS5zbGljZSgwLCAtMik7IC8vIFwiaW50ZWdlcltdXCIgLT4gXCJpbnRlZ2VyXCJcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJzZWQpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlZC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIC8vIG51bGwvdW5kZWZpbmVk64qUIO2DgOyeheuzhCDquLDrs7jqsJLsnLzroZxcbiAgICAgICAgICAgIGlmIChpdGVtID09PSBudWxsIHx8IGl0ZW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXREZWZhdWx0VmFsdWVGb3JUeXBlKGJhc2VUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOqwneyytOuKlCBKU09OLnN0cmluZ2lmeSDtm4Qg7YyM7IuxIChqc29uIO2DgOyeheyduCDqsr3smrApXG4gICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2VUeXBlID09PSBcImpzb25cIlxuICAgICAgICAgICAgICAgID8gaXRlbVxuICAgICAgICAgICAgICAgIDogdGhpcy5wYXJzZVNjYWxhclZhbHVlKEpTT04uc3RyaW5naWZ5KGl0ZW0pLCBiYXNlVHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBwcmltaXRpdmUg6rCS7J2AIOusuOyekOyXtOuhnCDrs4DtmZgg7ZuEIO2MjOyLsVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VTY2FsYXJWYWx1ZShTdHJpbmcoaXRlbSksIGJhc2VUeXBlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOuLqOydvCDqsJLsnbQg7JioIOqyveyasCDrsLDsl7TroZwg6rCQ7Iu46riwXG4gICAgICAgIGlmIChwYXJzZWQgPT09IG51bGwgfHwgcGFyc2VkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gW3RoaXMuZ2V0RGVmYXVsdFZhbHVlRm9yVHlwZShiYXNlVHlwZSldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdGhpcy5wYXJzZVNjYWxhclZhbHVlKFN0cmluZyhwYXJzZWQpLCBiYXNlVHlwZSldO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJzZVNjYWxhclZhbHVlKGNsZWFuZWQsIHByb3BUeXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFZhbHVlRm9yVHlwZShwcm9wVHlwZTogc3RyaW5nKTogdW5rbm93biB7XG4gICAgc3dpdGNoIChwcm9wVHlwZSkge1xuICAgICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gMG47XG4gICAgICBjYXNlIFwiZmxvYXRcIjpcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICByZXR1cm4ge307XG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgICByZXR1cm4gXCIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VTY2FsYXJWYWx1ZSh0ZXh0OiBzdHJpbmcsIHByb3BUeXBlOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICBjb25zdCBjbGVhbmVkID0gdGV4dC50cmltKCk7XG5cbiAgICBzd2l0Y2ggKHByb3BUeXBlKSB7XG4gICAgICBjYXNlIFwiaW50ZWdlclwiOiB7XG4gICAgICAgIGNvbnN0IG51bSA9IHBhcnNlSW50KGNsZWFuZWQsIDEwKTtcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihudW0pID8gMCA6IG51bTtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJiaWdJbnRlZ2VyXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gQmlnSW50KGNsZWFuZWQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gMG47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgXCJmbG9hdFwiOlxuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgY2FzZSBcIm51bWVyaWNcIjoge1xuICAgICAgICBjb25zdCBudW0gPSBwYXJzZUZsb2F0KGNsZWFuZWQpO1xuICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKG51bSkgPyAwIDogbnVtO1xuICAgICAgfVxuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIGNsZWFuZWQudG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOiB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShjbGVhbmVkKTtcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgPyBuZXcgRGF0ZSgpIDogZGF0ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoY2xlYW5lZCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBjbGVhbmVkO1xuICAgICAgICB9XG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgcmV0dXJuIGNsZWFuZWQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gY2xlYW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZmFrZXIg7ZWo7IiYIOyduOyekCDrrLjsnpDsl7TsnYQg7YyM7Iux7ZWY7JesIOyduOyekCDrsLDsl7TroZwg67CY7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiAz64uo6rOEIOyghOuetTpcbiAgICogMS4gSlNPTiDsp4HsoJEg7YyM7IuxICjtkZzspIAgSlNPTiDtkZztmITsi50pXG4gICAqIDIuIEpTIOqwneyytCDrpqzthLDrn7Qg4oaSIEpTT04g67OA7ZmYIO2bhCDsnqzsi5zrj4QgKHNpbmdsZSBxdW90ZSwgdW5xdW90ZWQga2V5IOyymOumrClcbiAgICogMy4g64uo7IicIOuLqOydvCDsnbjsnpAg7Y+067CxICjsiKvsnpAsIOusuOyekOyXtClcbiAgICovXG4gIHByaXZhdGUgcGFyc2VHZW5lcmF0b3JBcmdzKGFyZ3NTdHI6IHN0cmluZywgcHJvcE5hbWU6IHN0cmluZyk6IHVua25vd25bXSB7XG4gICAgLy8gMS4gSlNPTiDsp4HsoJEg7YyM7IuxXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoYFske2FyZ3NTdHJ9XWApIGFzIHVua25vd247XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXJzZWQpID8gcGFyc2VkIDogW3BhcnNlZF07XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyDqs4Tsho1cbiAgICB9XG5cbiAgICAvLyAyLiBKUyDqsJ3ssrQg66as7YSw65+0IOKGkiBKU09OIOuzgO2ZmCDtm4Qg7J6s7Iuc64+EXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGpzb25TdHIgPSB0aGlzLmNvbnZlcnRKc0xpdGVyYWxUb0pzb24oYXJnc1N0cik7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGBbJHtqc29uU3RyfV1gKSBhcyB1bmtub3duO1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGFyc2VkKSA/IHBhcnNlZCA6IFtwYXJzZWRdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8g6rOE7IaNXG4gICAgfVxuXG4gICAgLy8gMy4g64uo7IicIOuLqOydvCDsnbjsnpAg7Y+067CxXG4gICAgY29uc3QgdHJpbW1lZCA9IGFyZ3NTdHIudHJpbSgpO1xuICAgIGlmICghTnVtYmVyLmlzTmFOKE51bWJlcih0cmltbWVkKSkpIHtcbiAgICAgIHJldHVybiBbTnVtYmVyKHRyaW1tZWQpXTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgKHRyaW1tZWQuc3RhcnRzV2l0aCgnXCInKSAmJiB0cmltbWVkLmVuZHNXaXRoKCdcIicpKSB8fFxuICAgICAgKHRyaW1tZWQuc3RhcnRzV2l0aChcIidcIikgJiYgdHJpbW1lZC5lbmRzV2l0aChcIidcIikpXG4gICAgKSB7XG4gICAgICByZXR1cm4gW3RyaW1tZWQuc2xpY2UoMSwgLTEpXTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpeHR1cmVHZW5lcmF0b3I6IENhbm5vdCBwYXJzZSBhcmd1bWVudHMgZm9yICR7cHJvcE5hbWV9OiAke2FyZ3NTdHJ9YCk7XG4gIH1cblxuICAvKipcbiAgICogSlMg6rCd7LK0IOumrO2EsOuftOydhCBKU09O7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICog65GQIOqwgOyngCDrs4DtmZg6XG4gICAqIDEuIFNpbmdsZS1xdW90ZWQg66y47J6Q7Je0IOKGkiBkb3VibGUtcXVvdGVkICjsnbTsiqTsvIDsnbTtlIQg7LKY66asIO2PrO2VqClcbiAgICogMi4gVW5xdW90ZWQg6rCd7LK0IO2CpCDihpIgZG91YmxlLXF1b3RlZFxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0SnNMaXRlcmFsVG9Kc29uKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIDEuICd2YWx1ZScg4oaSIFwidmFsdWVcIiAo64K067aAIFwiIOydtOyKpOy8gOydtO2UhCwgXFwnIOKGkiAnKVxuICAgIGNvbnN0IHdpdGhEb3VibGVRdW90ZXMgPSBpbnB1dC5yZXBsYWNlKFxuICAgICAgLycoW14nXFxcXF0qKD86XFxcXC5bXidcXFxcXSopKiknL2csXG4gICAgICAoXywgY29udGVudDogc3RyaW5nKSA9PiBgXCIke2NvbnRlbnQucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpLnJlcGxhY2UoL1xcXFwnL2csIFwiJ1wiKX1cImAsXG4gICAgKTtcblxuICAgIC8vIDIuIHsga2V5OiDihpIgeyBcImtleVwiOlxuICAgIHJldHVybiB3aXRoRG91YmxlUXVvdGVzLnJlcGxhY2UoLyhbeyxdXFxzKikoW2EtekEtWl8kXVtcXHckXSopKFxccyo6KS9nLCAnJDFcIiQyXCIkMycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvbmFtdS5zZWNyZXTsnYQg7Jqw7ISg7Jy866GcIO2VmOqzoCwg7JeG7Jy866m0IO2ZmOqyveuzgOyImOyXkOyEnCBBUEkg7YKk66W8IOydveyKteuLiOuLpC5cbiAgICpcbiAgICogU29uYW11LnNlY3JldOydgCDtlITroZzsoJ3tirjrs4Qg7ISk7KCVKHNvbmFtdS5jb25maWcudHMp7J2066+A66GcIOuNlCDrhpLsnYAg7Jqw7ISg7Iic7JyE66W8IOqwgOyngOupsCxcbiAgICog7ZmY6rK967OA7IiY64qUIOqwnOuwnCDtmZjqsr3snbTrgpggQ0kvQ0Tsl5DshJwgZmFsbGJhY2vsnLzroZwg7IKs7Jqp65Cp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBcGlLZXkoKTogc3RyaW5nIHtcbiAgICBsZXQgYXBpS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBTb25hbXUgfSA9IHJlcXVpcmUoXCIuLi9hcGlcIik7XG4gICAgICBhcGlLZXkgPSBTb25hbXUuc2VjcmV0cz8uYW50aHJvcGljX2FwaV9rZXk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTb25hbXXqsIAg7LSI6riw7ZmU65CY7KeAIOyViuydgCDqsr3smrAgKO2FjOyKpO2KuCDtmZjqsr0g65OxKVxuICAgIH1cblxuICAgIGlmICghYXBpS2V5KSB7XG4gICAgICBhcGlLZXkgPSBwcm9jZXNzLmVudi5BTlRIUk9QSUNfQVBJX0tFWTtcbiAgICB9XG5cbiAgICBpZiAoIWFwaUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkFOVEhST1BJQ19BUElfS0VZIG5vdCBmb3VuZC4gU2V0IGl0IGluIGVudmlyb25tZW50IHZhcmlhYmxlcyBvciBTb25hbXUuc2VjcmV0LmFudGhyb3BpY19hcGlfa2V5XCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBhcGlLZXk7XG4gIH1cblxuICBwcml2YXRlIGdldEV4cGVjdGVkRm9ybWF0KHByb3BUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gICAgaWYgKHByb3BUeXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgIGNvbnN0IGJhc2VUeXBlID0gcHJvcFR5cGUuc2xpY2UoMCwgLTIpO1xuICAgICAgY29uc3QgYmFzZUZvcm1hdCA9IHRoaXMuZ2V0U2NhbGFyRm9ybWF0KGJhc2VUeXBlKTtcbiAgICAgIHJldHVybiBgSlNPTiBhcnJheSBvZiAke2Jhc2VGb3JtYXR9IChlLmcuLCBbJHt0aGlzLmdldEV4YW1wbGVGb3JUeXBlKGJhc2VUeXBlLCBcImVuXCIpfSwgLi4uXSlgO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldFNjYWxhckZvcm1hdChwcm9wVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGdldFNjYWxhckZvcm1hdChwcm9wVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHByb3BUeXBlKSB7XG4gICAgICBjYXNlIFwiaW50ZWdlclwiOlxuICAgICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIFwiaW50ZWdlciBudW1iZXJzXCI7XG4gICAgICBjYXNlIFwiZmxvYXRcIjpcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICAgIHJldHVybiBcImRlY2ltYWwgbnVtYmVyc1wiO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIFwiYm9vbGVhbnMgKHRydWUgb3IgZmFsc2UpXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCJJU08gODYwMSBkYXRlIHN0cmluZ3NcIjtcbiAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgIHJldHVybiBcInZhbGlkIEpTT04gb2JqZWN0IG9yIGFycmF5XCI7XG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgICByZXR1cm4gXCJVVUlEIHN0cmluZ3NcIjtcbiAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgIHJldHVybiBcIm9uZSBvZiB0aGUgYWxsb3dlZCBlbnVtIHZhbHVlc1wiO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwicGxhaW4gdGV4dCBzdHJpbmdzXCI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeGFtcGxlRm9yVHlwZShwcm9wVHlwZTogc3RyaW5nLCBsb2NhbGU6IExvY2FsZSk6IHN0cmluZyB7XG4gICAgLy8g67Cw7Je0IO2DgOyehSDsspjrpqxcbiAgICBpZiAocHJvcFR5cGUuZW5kc1dpdGgoXCJbXVwiKSkge1xuICAgICAgY29uc3QgYmFzZVR5cGUgPSBwcm9wVHlwZS5zbGljZSgwLCAtMik7XG4gICAgICBjb25zdCBiYXNlRXhhbXBsZSA9IHRoaXMuZ2V0U2NhbGFyRXhhbXBsZShiYXNlVHlwZSwgbG9jYWxlKTtcbiAgICAgIHJldHVybiBgWyR7YmFzZUV4YW1wbGV9XWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0U2NhbGFyRXhhbXBsZShwcm9wVHlwZSwgbG9jYWxlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2NhbGFyRXhhbXBsZShwcm9wVHlwZTogc3RyaW5nLCBsb2NhbGU6IExvY2FsZSk6IHN0cmluZyB7XG4gICAgY29uc3QgaXNLb3JlYW4gPSBsb2NhbGUgPT09IFwia29cIjtcblxuICAgIHN3aXRjaCAocHJvcFR5cGUpIHtcbiAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gXCI0MlwiO1xuICAgICAgY2FzZSBcImZsb2F0XCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgICByZXR1cm4gXCIzLjE0XCI7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gXCJ0cnVlXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCIyMDI0LTAxLTAxXCI7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICByZXR1cm4gJ3tcImtleVwiOiBcInZhbHVlXCJ9JztcbiAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICAgIHJldHVybiBcIjU1MGU4NDAwLWUyOWItNDFkNC1hNzE2LTQ0NjY1NTQ0MDAwMFwiO1xuICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgcmV0dXJuIFwiRU5VTV9WQUxVRVwiO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGlzS29yZWFuID8gXCLslYjrhZXtlZjshLjsmpRcIiA6IFwiSGVsbG9cIjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7J2066aE7J2EIOydtOuplOydvCDroZzsu6wg7YyM7Yq47JqpIOuhnOuniOuCmOydtOymiOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiDtlZzquIAg7J2066aE7J2AIOy0iOyEsS3spJHshLEt7KKF7ISxIOu2hO2VtCDtm4Qg66Gc66eI64KY7J207KaIIOyymOumrO2VqeuLiOuLpC5cbiAgICog7JiB66y4IOydtOumhOydgCDshozrrLjsnpDroZwg67OA7ZmY7ZWY6rOgIOqzteuwseydhCDsoJAoLilcXHVjNzNj66GcIOy5mO2ZmO2VqeuLiOuLpC5cbiAgICog7JiIOiBcIuq5gOyyoOyImFwiIOKGkiBcImNoZW9sc3Uua2ltXCIsIFwiSm9obiBEb2VcIiDihpIgXCJqb2huLmRvZVwiXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJvbWFuaXplTmFtZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIC8vIO2VnOq4gCDtj6ztlagg7Jes67aAIO2ZleyduFxuICAgIGlmICgvW1xcdUFDMDAtXFx1RDdBRl0vLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvbWFuaXplS29yZWFuTmFtZShuYW1lKTtcbiAgICB9XG4gICAgLy8g7JiB66y4OiDshozrrLjsnpAgKyDsoJAg6rWs67aEXG4gICAgcmV0dXJuIG5hbWVcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAucmVwbGFjZSgvXFxzKy9nLCBcIi5cIilcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOS5dL2csIFwiXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VnOq4gCDsnbTrpoTsnYQg66Gc66eI64KY7J207KaIIOyymOumrO2VqeuLiOuLpC5cbiAgICpcbiAgICog7LSI7ISxL+ykkeyEsS/sooXshLEg66ek7ZWRIO2FjOydtOu4lOydhCDsgqzsmqntlZjsl6wg7ZWc6riA7J2EIOuhnOuniOyekOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqIOyyqyDquIDsnpDrpbwg7ISx7Jy866GcIOqwhOyjvO2VmOyXrCBcIuq5gOyyoOyImFwiIOKGkiBcImNoZW9sc3Uua2ltXCIg7ZiV7YOc66GcIOy2nOugpe2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgcm9tYW5pemVLb3JlYW5OYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgQ0hPU0VPTkcgPSBbXG4gICAgICBcImdcIixcbiAgICAgIFwia2tcIixcbiAgICAgIFwiblwiLFxuICAgICAgXCJkXCIsXG4gICAgICBcInR0XCIsXG4gICAgICBcInJcIixcbiAgICAgIFwibVwiLFxuICAgICAgXCJiXCIsXG4gICAgICBcInBwXCIsXG4gICAgICBcInNcIixcbiAgICAgIFwic3NcIixcbiAgICAgIFwiXCIsXG4gICAgICBcImpcIixcbiAgICAgIFwiampcIixcbiAgICAgIFwiY2hcIixcbiAgICAgIFwia1wiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcInBcIixcbiAgICAgIFwiaFwiLFxuICAgIF07XG4gICAgY29uc3QgSlVOR1NFT05HID0gW1xuICAgICAgXCJhXCIsXG4gICAgICBcImFlXCIsXG4gICAgICBcInlhXCIsXG4gICAgICBcInlhZVwiLFxuICAgICAgXCJlb1wiLFxuICAgICAgXCJlXCIsXG4gICAgICBcInllb1wiLFxuICAgICAgXCJ5ZVwiLFxuICAgICAgXCJvXCIsXG4gICAgICBcIndhXCIsXG4gICAgICBcIndhZVwiLFxuICAgICAgXCJvZVwiLFxuICAgICAgXCJ5b1wiLFxuICAgICAgXCJ1XCIsXG4gICAgICBcIndvXCIsXG4gICAgICBcIndlXCIsXG4gICAgICBcIndpXCIsXG4gICAgICBcInl1XCIsXG4gICAgICBcImV1XCIsXG4gICAgICBcInVpXCIsXG4gICAgICBcImlcIixcbiAgICBdO1xuICAgIGNvbnN0IEpPTkdTRU9ORyA9IFtcbiAgICAgIFwiXCIsXG4gICAgICBcImtcIixcbiAgICAgIFwia1wiLFxuICAgICAgXCJrXCIsXG4gICAgICBcIm5cIixcbiAgICAgIFwiblwiLFxuICAgICAgXCJuXCIsXG4gICAgICBcInRcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcIm1cIixcbiAgICAgIFwicFwiLFxuICAgICAgXCJwXCIsXG4gICAgICBcInRcIixcbiAgICAgIFwidFwiLFxuICAgICAgXCJuZ1wiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcInRcIixcbiAgICAgIFwia1wiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcInBcIixcbiAgICAgIFwidFwiLFxuICAgIF07XG5cbiAgICBjb25zdCByb21hbml6ZSA9IChjaGFyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICAgIGlmIChjb2RlIDwgMHhhYzAwIHx8IGNvZGUgPiAweGQ3YWYpIHJldHVybiBjaGFyO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gY29kZSAtIDB4YWMwMDtcbiAgICAgIGNvbnN0IGNobyA9IE1hdGguZmxvb3Iob2Zmc2V0IC8gNTg4KTtcbiAgICAgIGNvbnN0IGp1bmcgPSBNYXRoLmZsb29yKChvZmZzZXQgJSA1ODgpIC8gMjgpO1xuICAgICAgY29uc3Qgam9uZyA9IG9mZnNldCAlIDI4O1xuICAgICAgcmV0dXJuIENIT1NFT05HW2Nob10gKyBKVU5HU0VPTkdbanVuZ10gKyBKT05HU0VPTkdbam9uZ107XG4gICAgfTtcblxuICAgIGNvbnN0IGNoYXJzID0gWy4uLm5hbWVdO1xuICAgIC8vIOyyqyDquIDsnpDrpbwg7ISxKOWnkynsnLzroZwg6rCE7KO8XG4gICAgY29uc3QgZmFtaWx5TmFtZSA9IHJvbWFuaXplKGNoYXJzWzBdKTtcbiAgICBjb25zdCBnaXZlbk5hbWUgPSBjaGFycy5zbGljZSgxKS5tYXAocm9tYW5pemUpLmpvaW4oXCJcIik7XG5cbiAgICBpZiAoZ2l2ZW5OYW1lKSB7XG4gICAgICByZXR1cm4gYCR7Z2l2ZW5OYW1lfS4ke2ZhbWlseU5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbWlseU5hbWU7XG4gIH1cblxuICAvKipcbiAgICogTExNIOy6kOyLnCDthrXqs4Trpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0TExNQ2FjaGVTdGF0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2l6ZTogdGhpcy5sbG1DYWNoZS5zaXplLFxuICAgICAgZW5hYmxlZDogdGhpcy5vcHRpb25zLmVuYWJsZUxMTUNhY2hlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTExNIOy6kOyLnOulvCDstIjquLDtmZTtlanri4jri6QuXG4gICAqL1xuICBjbGVhckxMTUNhY2hlKCkge1xuICAgIHRoaXMubGxtQ2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsu6jthY3siqTtirgg7IOd7ISxXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUNvbnRleHQoKTogR2VuZXJhdG9yQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpeHR1cmVzOiBuZXcgTWFwKCksXG4gICAgICByZWZlcmVuY2VDYWNoZTogbmV3IE1hcCgpLFxuICAgICAgaW1wb3J0ZWRSZWNvcmRzOiBuZXcgU2V0KCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrsLDsuZgg7IOd7ISxIOuwjyDsnpDrj5kg7KCA7J6lXG4gICAqXG4gICAqIDEuIOqwgSBzcGVj67OE66GcIGZpeHR1cmUg7IOd7ISxICjrqZTrqqjrpqwpXG4gICAqIDIuIEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAqIDMuIEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKCnroZwgdGFyZ2V0RGLsl5Ag7KCA7J6lXG4gICAqXG4gICAqIEByZXR1cm5zIOyggOyepeuQnCBmaXh0dXJlIOuNsOydtO2EsCAo7Iuk7KCcIERCIElEIO2PrO2VqClcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlQmF0Y2goXG4gICAgc3BlY3M6IEFycmF5PHsgZW50aXR5OiBzdHJpbmc7IGNvdW50OiBudW1iZXI7IG92ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+LFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQoKTtcbiAgICBjb25zdCBnZW5lcmF0ZWRGaXh0dXJlczogQXJyYXk8e1xuICAgICAgZW50aXR5OiBzdHJpbmc7XG4gICAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGV4cGxpY2l0SWQ/OiBib29sZWFuO1xuICAgIH0+ID0gW107XG5cbiAgICAvLyAxLiDqsIEgc3BlY+uzhOuhnCBmaXh0dXJlIOyDneyEsVxuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBzcGVjcykge1xuICAgICAgY29uc3Qgc3BlY0VudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoc3BlYy5lbnRpdHkpO1xuXG4gICAgICBpZiAoc3BlY0VudGl0eS5wYXJlbnRJZCkge1xuICAgICAgICAvLyBwYXJlbnRJZCDsl5Tti7Dti7A6IERC7JeQ7IScIOyEnOu4jO2DgOyehSDtlonsnbQg7JeG64qUIOu2gOuqqCBpZOulvCDsobDtmoztlZjsl6wg7IKs7JqpXG4gICAgICAgIC8vICjsg4gg67aA66qoIOyDneyEsSDrjIDsi6Ag6riw7KG0IOuNsOydtO2EsCDsnqztmZzsmqkpXG4gICAgICAgIGNvbnN0IGlkUHJvcCA9IHNwZWNFbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBcImlkXCIpO1xuICAgICAgICBjb25zdCBwYXJlbnRPdmVycmlkZXMgPSBpZFByb3A/LmNvbmU/LmZpeHR1cmVQYXJlbnRPdmVycmlkZXMgPz8ge307XG4gICAgICAgIGNvbnN0IHBhcmVudEVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoc3BlY0VudGl0eS5wYXJlbnRJZCk7XG5cbiAgICAgICAgLy8g67aA66qoIO2FjOydtOu4lOyXkOyEnCDshJzruIztg4DsnoUg7YWM7J2067iU7JeQIOyXhuuKlCBpZOulvCDsobDtmoxcbiAgICAgICAgbGV0IHF1ZXJ5ID0gdGhpcy5zb3VyY2VEYihwYXJlbnRFbnRpdHkudGFibGUpLnNlbGVjdChgJHtwYXJlbnRFbnRpdHkudGFibGV9LmlkYCk7XG4gICAgICAgIGZvciAoY29uc3QgW2NvbCwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhwYXJlbnRPdmVycmlkZXMpKSB7XG4gICAgICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZShcbiAgICAgICAgICAgIGAke3BhcmVudEVudGl0eS50YWJsZX0uJHtjb2x9YCxcbiAgICAgICAgICAgIHZhbCBhcyBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHF1ZXJ5ID0gcXVlcnlcbiAgICAgICAgICAubGVmdEpvaW4oc3BlY0VudGl0eS50YWJsZSwgYCR7c3BlY0VudGl0eS50YWJsZX0uaWRgLCBgJHtwYXJlbnRFbnRpdHkudGFibGV9LmlkYClcbiAgICAgICAgICAud2hlcmVOdWxsKGAke3NwZWNFbnRpdHkudGFibGV9LmlkYClcbiAgICAgICAgICAubGltaXQoc3BlYy5jb3VudCk7XG5cbiAgICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHF1ZXJ5O1xuICAgICAgICBjb25zdCBhdmFpbGFibGVJZHM6IG51bWJlcltdID0gcm93cy5tYXAoKHI6IHsgaWQ6IG51bWJlciB9KSA9PiByLmlkKTtcblxuICAgICAgICBpZiAoYXZhaWxhYmxlSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgICAgYFtwYXJlbnRJZF0gJHtzcGVjLmVudGl0eX06IOyEnOu4jO2DgOyeheydtCDsl4bripQg67aA66qoIOugiOy9lOuTnOqwgCDrtoDsobHtlanri4jri6QuIOqxtOuEiOucgeuLiOuLpC5gLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHBhcmVudElkIG9mIGF2YWlsYWJsZUlkcykge1xuICAgICAgICAgICAgY29uc3QgZml4dHVyZSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGUoc3BlYy5lbnRpdHksIHNwZWMub3ZlcnJpZGVzIHx8IHt9LCBjb250ZXh0KTtcbiAgICAgICAgICAgIGZpeHR1cmUuaWQgPSBwYXJlbnRJZDtcbiAgICAgICAgICAgIGdlbmVyYXRlZEZpeHR1cmVzLnB1c2goeyBlbnRpdHk6IHNwZWMuZW50aXR5LCBkYXRhOiBmaXh0dXJlLCBleHBsaWNpdElkOiB0cnVlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGVjLmNvdW50OyBpKyspIHtcbiAgICAgICAgICBjb25zdCBmaXh0dXJlID0gYXdhaXQgdGhpcy5nZW5lcmF0ZShzcGVjLmVudGl0eSwgc3BlYy5vdmVycmlkZXMgfHwge30sIGNvbnRleHQpO1xuICAgICAgICAgIGdlbmVyYXRlZEZpeHR1cmVzLnB1c2goe1xuICAgICAgICAgICAgZW50aXR5OiBzcGVjLmVudGl0eSxcbiAgICAgICAgICAgIGRhdGE6IGZpeHR1cmUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAyLiBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgIGNvbnN0IGZpeHR1cmVSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHsgZW50aXR5OiBlbnRpdHlOYW1lLCBkYXRhLCBleHBsaWNpdElkIH0gb2YgZ2VuZXJhdGVkRml4dHVyZXMpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZW50aXR5TmFtZSk7XG5cbiAgICAgIC8vIGludGVnZXIvYmlnSW50ZWdlciBQS+uKlCDsnoTsi5wgSUQg7IOd7ISxIChEQiDsi5ztgIDsiqTqsIAg7Iuk7KCcIElEIO2VoOuLuSlcbiAgICAgIC8vIHN0cmluZyBQSyB3aXRoIGRiRGVmYXVsdCBuZXh0dmFs64+EIOuPmeydvO2VmOqyjCDsspjrpqxcbiAgICAgIC8vIOq3uCDsmbggc3RyaW5nL3V1aWQgUEvripQgZ2VuZXJhdGUoKeyXkOyEnCDsnbTrr7gg7IOd7ISx65CcIGlkIOqwkuydhCDqt7jrjIDroZwg7IKs7JqpXG4gICAgICAvLyBwYXJlbnRJZCDsl5Tti7Dti7DripQg67aA66qo7J2YIOyLpOygnCBpZOulvCDqt7jrjIDroZwg7IKs7JqpICjsi5ztgIDsiqQg66+47IKs7JqpKVxuICAgICAgY29uc3QgaWRQcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgIGNvbnN0IHVzZXNTZXF1ZW5jZSA9XG4gICAgICAgICFleHBsaWNpdElkICYmXG4gICAgICAgIChpZFByb3A/LnR5cGUgPT09IFwiaW50ZWdlclwiIHx8XG4gICAgICAgICAgaWRQcm9wPy50eXBlID09PSBcImJpZ0ludGVnZXJcIiB8fFxuICAgICAgICAgIChpZFByb3A/LnR5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgIFwiZGJEZWZhdWx0XCIgaW4gKGlkUHJvcCA/PyB7fSkgJiZcbiAgICAgICAgICAgIHR5cGVvZiAoaWRQcm9wIGFzIHsgZGJEZWZhdWx0PzogdW5rbm93biB9KT8uZGJEZWZhdWx0ID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAoKGlkUHJvcCBhcyB7IGRiRGVmYXVsdD86IHN0cmluZyB9KT8uZGJEZWZhdWx0ID8/IFwiXCIpLmluY2x1ZGVzKFwibmV4dHZhbFwiKSkpO1xuXG4gICAgICBjb25zdCBkYXRhRm9yUmVjb3JkID0gdXNlc1NlcXVlbmNlXG4gICAgICAgID8geyAuLi5kYXRhLCBpZDogTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwMCkgfVxuICAgICAgICA6IGRhdGE7XG5cbiAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5jcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgICAgICBlbnRpdHksXG4gICAgICAgIGRhdGFGb3JSZWNvcmQgYXMgeyBpZDogbnVtYmVyIHwgc3RyaW5nOyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB9LFxuICAgICAgICB7IHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgKTtcbiAgICAgIGZpeHR1cmVSZWNvcmRzLnB1c2goLi4ucmVjb3Jkcyk7XG4gICAgfVxuXG4gICAgLy8gMy4gdGFyZ2V0RGLsl5Ag7IK97J6FIChGaXh0dXJlTWFuYWdlcuqwgCDsnZjsobTshLEg7KCV66CsIOyymOumrClcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuaW5zZXJ0Rml4dHVyZXModGhpcy50YXJnZXREYk5hbWUsIGZpeHR1cmVSZWNvcmRzKTtcblxuICAgIC8vIDQuIGNvbXBhbmlvbiBmaXh0dXJlcyDsg53shLEgKGZpeHR1cmVDb21wYW5pb25z6rCAIOyEoOyWuOuQnCDqsr3smrApXG4gICAgY29uc3QgY29tcGFuaW9uUmVzdWx0cyA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVDb21wYW5pb25zKHNwZWNzLCByZXN1bHRzKTtcblxuICAgIGNvbnN0IHRvdGFsID0gcmVzdWx0cy5sZW5ndGggKyBjb21wYW5pb25SZXN1bHRzLmxlbmd0aDtcbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGBHZW5lcmF0ZWQgYW5kIHNhdmVkICR7dG90YWx9IGZpeHR1cmVzIHRvICR7dGhpcy50YXJnZXREYk5hbWV9YCkpO1xuICAgIHJldHVybiBbLi4ucmVzdWx0cywgLi4uY29tcGFuaW9uUmVzdWx0c107XG4gIH1cblxuICAvKipcbiAgICog67aA66qoIGZpeHR1cmUg6rKw6rO866W8IOq4sOuwmOycvOuhnCBmaXh0dXJlQ29tcGFuaW9uc+yXkCDshKDslrjrkJwgY29tcGFuaW9uIEVudGl0eeulvCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIGdlbmVyYXRlQmF0Y2goKeyXkOyEnOunjCDtmLjstpzrkJjrqbAsIGNvbXBhbmlvbiDsg53shLEg7IucIOyerOq3gOulvCDrsKnsp4DtlZjquLAg7JyE7ZW0XG4gICAqIGdlbmVyYXRlQmF0Y2goKeulvCDri6Tsi5wg7Zi47Lac7ZWY7KeAIOyViuqzoCDsp4HsoJEg7IK97J6F7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUNvbXBhbmlvbnMoXG4gICAgc3BlY3M6IEFycmF5PHsgZW50aXR5OiBzdHJpbmc7IGNvdW50OiBudW1iZXI7IG92ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+LFxuICAgIHBhcmVudFJlc3VsdHM6IEZpeHR1cmVJbXBvcnRSZXN1bHRbXSxcbiAgKTogUHJvbWlzZTxGaXh0dXJlSW1wb3J0UmVzdWx0W10+IHtcbiAgICBjb25zdCBhbGxSZXN1bHRzOiBGaXh0dXJlSW1wb3J0UmVzdWx0W10gPSBbXTtcbiAgICBjb25zdCBwcm9jZXNzZWRFbnRpdGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHNwZWNzKSB7XG4gICAgICBpZiAocHJvY2Vzc2VkRW50aXRpZXMuaGFzKHNwZWMuZW50aXR5KSkgY29udGludWU7XG4gICAgICBwcm9jZXNzZWRFbnRpdGllcy5hZGQoc3BlYy5lbnRpdHkpO1xuXG4gICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KHNwZWMuZW50aXR5KTtcbiAgICAgIGNvbnN0IGlkUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICBjb25zdCBjb21wYW5pb25zID0gaWRQcm9wPy5jb25lPy5maXh0dXJlQ29tcGFuaW9ucztcbiAgICAgIGlmICghY29tcGFuaW9ucyB8fCBjb21wYW5pb25zLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGVudGl0eVJlc3VsdHMgPSBwYXJlbnRSZXN1bHRzLmZpbHRlcigocikgPT4gci5lbnRpdHlJZCA9PT0gc3BlYy5lbnRpdHkpO1xuICAgICAgaWYgKGVudGl0eVJlc3VsdHMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgZm9yIChjb25zdCBjb21wYW5pb24gb2YgY29tcGFuaW9ucykge1xuICAgICAgICAvLyBjb21wYW5pb24gZW50aXR57JeQ7IScIOu2gOuqqCBlbnRpdHnroZzsnZggQmVsb25nc1RvT25lIEZLIOy7rOufvOuqhSDtjIzslYVcbiAgICAgICAgY29uc3QgY29tcGFuaW9uRW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChjb21wYW5pb24uZW50aXR5KTtcbiAgICAgICAgY29uc3QgZmtQcm9wID0gY29tcGFuaW9uRW50aXR5LnByb3BzLmZpbmQoXG4gICAgICAgICAgKHApID0+IGlzUmVsYXRpb25Qcm9wKHApICYmIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHApICYmIHAud2l0aCA9PT0gc3BlYy5lbnRpdHksXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZmtQcm9wKSB7XG4gICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICBgW0NvbXBhbmlvbl0gTm8gQmVsb25nc1RvT25lIHJlbGF0aW9uIGZyb20gJHtjb21wYW5pb24uZW50aXR5fSB0byAke3NwZWMuZW50aXR5fS4gU2tpcHBpbmcuYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmtDb2xOYW1lID0gYCR7ZmtQcm9wLm5hbWV9X2lkYDtcblxuICAgICAgICAvLyBjb21wYW5pb27snZggaWRQcm9wLCB1c2VzU2VxdWVuY2UsIGNvdW5064qUIGNvbXBhbmlvbiDri6jsnITroZwg6rOg7KCVXG4gICAgICAgIGNvbnN0IGNvbXBhbmlvbklkUHJvcCA9IGNvbXBhbmlvbkVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICAgIGNvbnN0IHVzZXNTZXF1ZW5jZSA9XG4gICAgICAgICAgY29tcGFuaW9uSWRQcm9wPy50eXBlID09PSBcImludGVnZXJcIiB8fFxuICAgICAgICAgIGNvbXBhbmlvbklkUHJvcD8udHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIgfHxcbiAgICAgICAgICAoY29tcGFuaW9uSWRQcm9wPy50eXBlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICBcImRiRGVmYXVsdFwiIGluIChjb21wYW5pb25JZFByb3AgPz8ge30pICYmXG4gICAgICAgICAgICB0eXBlb2YgKGNvbXBhbmlvbklkUHJvcCBhcyB7IGRiRGVmYXVsdD86IHVua25vd24gfSk/LmRiRGVmYXVsdCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgKChjb21wYW5pb25JZFByb3AgYXMgeyBkYkRlZmF1bHQ/OiBzdHJpbmcgfSk/LmRiRGVmYXVsdCA/PyBcIlwiKS5pbmNsdWRlcyhcIm5leHR2YWxcIikpO1xuICAgICAgICBjb25zdCBjb21wYW5pb25Db3VudCA9IGNvbXBhbmlvbi5jb3VudCA/PyAxO1xuXG4gICAgICAgIC8vIOqwgSBwYXJlbnQgcmVzdWx07JeQIOuMgO2VtCBjb21wYW5pb24gZml4dHVyZSDsg53shLFcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY3JlYXRlQ29udGV4dCgpO1xuICAgICAgICBjb25zdCBjb21wYW5pb25GaXh0dXJlUmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBwYXJlbnRSZXN1bHQgb2YgZW50aXR5UmVzdWx0cykge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkT3ZlcnJpZGVzID0gdGhpcy5yZXNvbHZlVGVtcGxhdGVPdmVycmlkZXMoXG4gICAgICAgICAgICBjb21wYW5pb24ub3ZlcnJpZGVzID8/IHt9LFxuICAgICAgICAgICAgcGFyZW50UmVzdWx0LmRhdGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXNvbHZlZE92ZXJyaWRlc1tma0NvbE5hbWVdID0gcGFyZW50UmVzdWx0LmRhdGEuaWQ7XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBhbmlvbkNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZpeHR1cmUgPSBhd2FpdCB0aGlzLmdlbmVyYXRlKGNvbXBhbmlvbi5lbnRpdHksIHJlc29sdmVkT3ZlcnJpZGVzLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgY29uc3QgZGF0YUZvclJlY29yZCA9IHVzZXNTZXF1ZW5jZVxuICAgICAgICAgICAgICA/IHsgLi4uZml4dHVyZSwgaWQ6IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApIH1cbiAgICAgICAgICAgICAgOiBmaXh0dXJlO1xuXG4gICAgICAgICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgICAgICAgY29tcGFuaW9uRW50aXR5LFxuICAgICAgICAgICAgICBkYXRhRm9yUmVjb3JkIGFzIHtcbiAgICAgICAgICAgICAgICBpZDogbnVtYmVyIHwgc3RyaW5nO1xuICAgICAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7IHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbXBhbmlvbkZpeHR1cmVSZWNvcmRzLnB1c2goLi4ucmVjb3Jkcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tcGFuaW9uUmVzdWx0cyA9IGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKFxuICAgICAgICAgIHRoaXMudGFyZ2V0RGJOYW1lLFxuICAgICAgICAgIGNvbXBhbmlvbkZpeHR1cmVSZWNvcmRzLFxuICAgICAgICApO1xuICAgICAgICBhbGxSZXN1bHRzLnB1c2goLi4uY29tcGFuaW9uUmVzdWx0cyk7XG5cbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICAgICAgYFtDb21wYW5pb25dIEdlbmVyYXRlZCAke2NvbXBhbmlvblJlc3VsdHMubGVuZ3RofSAke2NvbXBhbmlvbi5lbnRpdHl9IGZpeHR1cmVzYCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWxsUmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBvdmVycmlkZXMg6rCS7J2YIFwie3tmaWVsZE5hbWV9fVwiIO2FnO2UjOumv+ydhCDrtoDrqqggZml4dHVyZSDrjbDsnbTthLDroZwg7LmY7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiDsmIg6IHsgXCJhY2NvdW50X2lkXCI6IFwie3tlbWFpbH19XCIgfSDihpIgeyBcImFjY291bnRfaWRcIjogXCJ1c2VyQGV4YW1wbGUuY29tXCIgfVxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlVGVtcGxhdGVPdmVycmlkZXMoXG4gICAgb3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBwYXJlbnREYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlIHwgbnVsbCB9LFxuICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgcmVzb2x2ZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3ZlcnJpZGVzKSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5zdGFydHNXaXRoKFwie3tcIikgJiYgdmFsdWUuZW5kc1dpdGgoXCJ9fVwiKSkge1xuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSB2YWx1ZS5zbGljZSgyLCAtMikudHJpbSgpO1xuICAgICAgICBpZiAoIShmaWVsZE5hbWUgaW4gcGFyZW50RGF0YSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBg7YWc7ZSM66a/IO2VhOuTnCBcIiR7ZmllbGROYW1lfVwi7J20KOqwgCkg67aA66qoIGZpeHR1cmUg642w7J207YSw7JeQIOyhtOyerO2VmOyngCDslYrsirXri4jri6QgKG92ZXJyaWRlIGtleTogXCIke2tleX1cIilgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZWRba2V5XSA9IHBhcmVudERhdGFbZmllbGROYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmVkW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIOyLpOygnCBEQihzb3VyY2VEYinsl5DshJwg642w7J207YSw66W8IOyhsO2ajO2VmOyXrCBmaXh0dXJlIERCKHRhcmdldERiKeyXkCBpbXBvcnTtlanri4jri6QuXG4gICAqXG4gICAqIDEuIERhdGFFeHBsb3JlcuuhnCBzb3VyY2VEYuyXkOyEnCDrjbDsnbTthLAg7KGw7ZqMICjqtIDroKgg642w7J207YSwIO2PrO2VqClcbiAgICogMi4gRml4dHVyZVJlY29yZOuhnCDrs4DtmZhcbiAgICogMy4gdGFyZ2V0RGLsl5Ag7IK97J6FXG4gICAqXG4gICAqIEBwYXJhbSBlbnRpdHlOYW1lIC0g7KGw7ZqM7ZWgIGVudGl0eSDsnbTrpoRcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDsobDtmowg7Ji17IWYIChzdHJhdGVneSwgbGltaXQsIGluY2x1ZGVSZWxhdGlvbnMg65OxKVxuICAgKiBAcmV0dXJucyDsoIDsnqXrkJwgZml4dHVyZSDrjbDsnbTthLAgKOyLpOygnCBEQiBJRCDtj6ztlagpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIO2UhOuhnOuNleyFmCBEQuyXkOyEnCBVc2VyIDEw66qFICsg6rSA66CoIEVtcGxveWVlLCBEZXBhcnRtZW50IOqwgOyguOyYpOq4sFxuICAgKiBhd2FpdCBnZW5lcmF0b3IuaW1wb3J0RnJvbVNvdXJjZShcIlVzZXJcIiwge1xuICAgKiAgIHN0cmF0ZWd5OiBcInNhbXBsZVwiLFxuICAgKiAgIGxpbWl0OiAxMCxcbiAgICogICBpbmNsdWRlUmVsYXRpb25zOiB0cnVlLFxuICAgKiAgIG1heERlcHRoOiAyXG4gICAqIH0pO1xuICAgKi9cbiAgYXN5bmMgaW1wb3J0RnJvbVNvdXJjZShcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRXhwbG9yZVdpdGhSZWxhdGlvbnNPcHRpb25zLFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmJsdWUoXG4gICAgICAgICAgYEltcG9ydGluZyAke2VudGl0eU5hbWV9IGZyb20gc291cmNlIERCIHdpdGggb3B0aW9uczogJHtKU09OLnN0cmluZ2lmeSh7IHN0cmF0ZWd5OiBvcHRpb25zLnN0cmF0ZWd5LCBsaW1pdDogb3B0aW9ucy5saW1pdCwgaW5jbHVkZVJlbGF0aW9uczogb3B0aW9ucy5pbmNsdWRlUmVsYXRpb25zLCBtYXhEZXB0aDogb3B0aW9ucy5tYXhEZXB0aCB9KX1gLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgIC8vIDEuIERhdGFFeHBsb3JlcuuhnCBzb3VyY2VEYuyXkOyEnCDrjbDsnbTthLAg7KGw7ZqMICjqtIDroKgg642w7J207YSwIO2PrO2VqClcbiAgICBjb25zdCBleHBsb3JlUmVzdWx0ID0gYXdhaXQgdGhpcy5kYXRhRXhwbG9yZXIuZXhwbG9yZVdpdGhSZWxhdGlvbnMoZW50aXR5TmFtZSwgb3B0aW9ucyk7XG5cbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgIGBGb3VuZCAke2V4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aH0gJHtlbnRpdHlOYW1lfSByZWNvcmRzIGFuZCAke2V4cGxvcmVSZXN1bHQucmVsYXRlZC5zaXplfSByZWxhdGVkIGVudGl0aWVzYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAvLyAyLiBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgIGNvbnN0IGZpeHR1cmVSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcblxuICAgIC8vIOuplOyduCBlbnRpdHnsnZggcmVjb3Jkc+ulvCBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgIGNvbnN0IG1haW5FbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eU5hbWUpO1xuICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIGV4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzKSB7XG4gICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgbWFpbkVudGl0eSxcbiAgICAgICAgcmVjb3JkIGFzIHsgaWQ6IG51bWJlciB8IHN0cmluZzsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfSxcbiAgICAgICAgeyBfZGI6IHRoaXMuc291cmNlRGIsIHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgKTtcbiAgICAgIGZpeHR1cmVSZWNvcmRzLnB1c2goLi4ucmVjb3Jkcyk7XG4gICAgfVxuXG4gICAgLy8g6rSA66CoIGVudGl0eeydmCByZWNvcmRz66W8IEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAgZm9yIChjb25zdCBbcmVsYXRlZEVudGl0eU5hbWUsIHJlbGF0ZWRSZWNvcmRzXSBvZiBleHBsb3JlUmVzdWx0LnJlbGF0ZWQuZW50cmllcygpKSB7XG4gICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChyZWxhdGVkRW50aXR5TmFtZSk7XG4gICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWxhdGVkUmVjb3Jkcykge1xuICAgICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgICByZWxhdGVkRW50aXR5LFxuICAgICAgICAgIHJlY29yZCBhcyB7IGlkOiBudW1iZXIgfCBzdHJpbmc7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIH0sXG4gICAgICAgICAgeyBfZGI6IHRoaXMuc291cmNlRGIsIHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgICApO1xuICAgICAgICBmaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLnJlY29yZHMpO1xuICAgICAgfVxuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICAtICR7cmVsYXRlZEVudGl0eU5hbWV9OiAke3JlbGF0ZWRSZWNvcmRzLmxlbmd0aH0gcmVjb3Jkc2ApKTtcbiAgICB9XG5cbiAgICAvLyAzLiB0YXJnZXREYuyXkCDsgr3snoUgKEZpeHR1cmVNYW5hZ2Vy6rCAIOydmOyhtOyEsSDsoJXroKwg7LKY66asKVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyh0aGlzLnRhcmdldERiTmFtZSwgZml4dHVyZVJlY29yZHMpO1xuXG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgYFN1Y2Nlc3NmdWxseSBpbXBvcnRlZCAke3Jlc3VsdHMubGVuZ3RofSByZWNvcmRzIHRvICR7dGhpcy50YXJnZXREYk5hbWV9ICgke2V4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aH0gJHtlbnRpdHlOYW1lfSArICR7cmVzdWx0cy5sZW5ndGggLSBleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGh9IHJlbGF0ZWQpYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7YUFNb0c7a0JBQ3ZEO3FCQUNFO3NCQUVFO3VCQUVFO0NBc0J0QyxtQkFBYixNQUE4QjtFQUM1QixBQUFRO0VBQ1IsQUFBUTtFQUNSLEFBQVE7RUFDUixBQUFRLFdBQWlDLElBQUksS0FBSztFQUNsRCxBQUFRLGNBQW1DLElBQUksS0FBSztFQUNwRCxBQUFRO0VBRVIsWUFDRSxBQUFRQSxVQUdSLFdBQ0EsQUFBUUMsY0FDUixBQUFRQyxlQUNSLFNBQ0E7R0FQUTtHQUlBO0dBQ0E7QUFHUixRQUFLLGVBQWUsSUFBSSxhQUFhLFVBQVUsY0FBYztBQUM3RCxRQUFLLFNBQVMsU0FBUyxVQUFVO0FBQ2pDLFFBQUssV0FBVztBQUNoQixRQUFLLFVBQVU7SUFDYixRQUFRLFNBQVMsVUFBVTtJQUMzQixRQUFRLFNBQVMsVUFBVTtJQUMzQixnQkFBZ0IsU0FBUyxtQkFBbUI7SUFDNUMsVUFBVSxTQUFTLFlBQVk7SUFDaEM7Ozs7OztFQU9ILE1BQU0sU0FDSixZQUNBLFlBQXFDLEVBQUUsRUFDdkMsVUFBNEIsS0FBSyxlQUFlLEVBQ2Q7R0FFbEMsSUFBSSxTQUFTLEtBQUssWUFBWSxJQUFJLFdBQVc7QUFDN0MsT0FBSSxDQUFDLFFBQVE7QUFDWCxhQUFTLEtBQUssY0FBYyxJQUFJLFdBQVc7QUFDM0MsU0FBSyxZQUFZLElBQUksWUFBWSxPQUFPOztHQUcxQyxNQUFNLFNBQVMsR0FBRyxXQUFXLFFBQVEsS0FBSyxLQUFLO0dBRy9DLE1BQU0sU0FBUyxLQUFLLFFBQVEsU0FBUyxHQUFHLFdBQVcsT0FBTyxLQUFLLEtBQUssS0FBSztHQUd6RSxNQUFNQyxVQUFtQyxFQUFFO0FBRTNDLFFBQUssTUFBTSxRQUFRLE9BQU8sT0FBTztBQUUvQixRQUFJLGFBQWEsUUFBUSxLQUFLLFNBQVM7QUFDckM7O0FBSUYsUUFBSSxLQUFLLFNBQVMsTUFBTTtLQUV0QixNQUFNLGdCQUNKLEtBQUssU0FBUyxhQUNkLEtBQUssU0FBUyxnQkFDYixLQUFLLFNBQVMsWUFDYixlQUFlLFFBQ2YsT0FBTyxLQUFLLGNBQWMsWUFDMUIsS0FBSyxVQUFVLFNBQVMsVUFBVTtBQUN0QyxTQUFJLGVBQWU7QUFFakI7O0FBRUYsU0FBSSxLQUFLLFNBQVMsVUFBVTtNQUUxQixNQUFNLEVBQUUsT0FBTyxXQUFXLE1BQU0sT0FBTztBQUN2QyxjQUFRLEtBQUssUUFBUSxPQUFPLE9BQU8sYUFBYSxHQUFHO0FBQ25EOztBQUVGLFNBQUksS0FBSyxTQUFTLFFBQVE7TUFDeEIsTUFBTSxFQUFFLE9BQU8sV0FBVyxNQUFNLE9BQU87QUFDdkMsY0FBUSxLQUFLLFFBQVEsT0FBTyxPQUFPLE1BQU07QUFDekM7O0FBRUY7O0FBSUYsUUFBSSxLQUFLLFFBQVEsV0FBVztBQUMxQixhQUFRLEtBQUssUUFBUSxVQUFVLEtBQUs7QUFDcEM7O0lBSUYsTUFBTSxPQUFPLEtBQUs7QUFHbEIsUUFBSSxlQUFlLEtBQUssRUFBRTtLQUV4QixNQUFNLFlBQVksR0FBRyxLQUFLLEtBQUs7QUFDL0IsU0FDRSxhQUFhLGNBQ1osMkJBQTJCLEtBQUssSUFBSyx1QkFBdUIsS0FBSyxJQUFJLEtBQUssZ0JBQzNFO0FBQ0EsY0FBUSxhQUFhLFVBQVU7QUFDL0I7O0tBR0YsTUFBTSxnQkFBZ0IsTUFBTSxLQUFLLHNCQUFzQixRQUFRLE1BQU0sUUFBUTtBQUU3RSxTQUNFLDJCQUEyQixLQUFLLElBQy9CLHVCQUF1QixLQUFLLElBQUksS0FBSyxlQUN0QztBQUNBLGNBQVEsR0FBRyxLQUFLLEtBQUssUUFBUTtZQUN4QjtBQUNMLGNBQVEsS0FBSyxRQUFROztBQUV2Qjs7QUFJRixRQUFJLE1BQU0sUUFBUSxLQUFLLFFBQVEsUUFBUTtBQUNyQyxTQUFJO01BQ0YsTUFBTSxXQUFXLE1BQU0sS0FBSyxnQkFBZ0IsS0FBSyxNQUFNLE1BQU0sUUFBUSxPQUFPO0FBRTVFLFVBQ0UsT0FBTyxhQUFhLFlBQ3BCLFlBQVksUUFDWixPQUFPLEtBQUssV0FBVyxZQUN2QixTQUFTLFNBQVMsS0FBSyxRQUN2QjtBQUNBLGVBQVEsS0FBSyxRQUFRLFNBQVMsTUFBTSxHQUFHLEtBQUssT0FBTzthQUM5QztBQUNMLGVBQVEsS0FBSyxRQUFROztBQUV2QjtjQUNPLE9BQU87QUFDZCxjQUFRLEtBQ04sZ0RBQWdELE9BQU8sR0FBRyxHQUFHLEtBQUssS0FBSyxnREFDdkUsaUJBQWlCLFFBQVEsTUFBTSxVQUFVLE1BQzFDOzs7QUFNTCxRQUFJLE1BQU0sa0JBQWtCO0FBQzFCLGFBQVEsS0FBSyxRQUFRLE1BQU0sS0FBSyxpQkFBaUIsS0FBSyxrQkFBa0IsTUFBTSxPQUFPO0FBQ3JGOztBQUlGLFFBQUksTUFBTSxtQkFBbUIsV0FBVztBQUN0QyxhQUFRLEtBQUssUUFBUSxLQUFLO0FBQzFCOztBQUlGLFlBQVEsS0FBSyxRQUFRLE1BQU0sS0FBSyxxQkFBcUIsTUFBTSxPQUFPOztBQUlwRSxPQUFJLFdBQVcsV0FBVyxPQUFPLFFBQVEsVUFBVSxZQUFZLEVBQUUsV0FBVyxZQUFZO0lBQ3RGLE1BQU0sWUFBWSxRQUFRLFFBQVEsUUFBUSxZQUFZLFFBQVEsYUFBYSxRQUFRO0FBQ25GLFFBQUksYUFBYSxPQUFPLGNBQWMsVUFBVTtLQUM5QyxNQUFNLFNBQVMsUUFBUSxNQUFNLE1BQU0sSUFBSSxDQUFDLE1BQU07S0FDOUMsTUFBTSxZQUFZLE1BQU0sS0FBSyxhQUFhLFVBQVU7QUFDcEQsYUFBUSxRQUFRLEdBQUcsVUFBVSxHQUFHOzs7QUFLcEMsT0FBSSxjQUFjLFdBQVcsUUFBUSxZQUFZLE9BQU8sUUFBUSxhQUFhLFVBQVU7SUFDckYsTUFBTSxTQUFTLE1BQU0sT0FBTztBQUM1QixZQUFRLFdBQVcsTUFBTSxPQUFPLEtBQUssUUFBUSxVQUFVLEdBQUc7O0FBRzVELFdBQVEsU0FBUyxJQUFJLFFBQVEsUUFBUTtBQUNyQyxVQUFPOzs7OztFQU1ULE1BQWMsc0JBQ1osUUFDQSxNQUNBLFNBQ3dCO0FBQ3hCLE9BQUksQ0FBQyxlQUFlLEtBQUssRUFBRTtBQUN6QixVQUFNLElBQUksTUFBTSxxQkFBcUIsT0FBTyxHQUFHLEdBQUcsS0FBSyxLQUFLLHlCQUF5Qjs7QUFJdkYsT0FDRSxDQUFDLDJCQUEyQixLQUFLLElBQ2pDLEVBQUUsdUJBQXVCLEtBQUssSUFBSSxLQUFLLGdCQUN2QztBQUNBLFdBQU87O0dBR1QsTUFBTSxPQUFPLEtBQUs7R0FDbEIsTUFBTSxhQUFhLE1BQU07QUFJekIsT0FBSSxZQUFZO0lBQ2QsTUFBTSxXQUFXLEdBQUcsS0FBSyxLQUFLLEdBQUcsS0FBSyxVQUFVLFdBQVc7QUFFM0QsUUFBSSxDQUFDLFFBQVEsZUFBZSxJQUFJLFNBQVMsRUFBRTtLQUN6QyxNQUFNLGdCQUFnQixNQUFNLEtBQUssYUFBYSxxQkFBcUIsS0FBSyxNQUFNO01BQzVFLFVBQVUsV0FBVztNQUNyQixPQUNJLFdBQVcsUUFBZ0QsU0FFM0M7TUFDcEIsa0JBQWtCO01BQ2xCLFVBQVU7TUFDVixHQUFJLFdBQVc7TUFDaEIsQ0FBQztBQUNGLGFBQVEsZUFBZSxJQUFJLFVBQVUsY0FBYyxLQUFLLFFBQVE7QUFHaEUsV0FBTSxLQUFLLG9CQUFvQixlQUFlLFFBQVE7O0lBR3hELE1BQU0sYUFBYSxRQUFRLGVBQWUsSUFBSSxTQUFTO0FBQ3ZELFFBQUksY0FBYyxXQUFXLFNBQVMsR0FBRztLQUV2QyxNQUFNLFdBQVcsV0FBVyxLQUFLLE1BQU0sS0FBSyxRQUFRLEdBQUcsV0FBVyxPQUFPO0FBQ3pFLFlBQU8sU0FBUzs7O0dBTXBCLE1BQU0sVUFBVSxHQUFHLEtBQUssS0FBSztBQUM3QixPQUFJLENBQUMsUUFBUSxlQUFlLElBQUksUUFBUSxFQUFFO0lBRXhDLE1BQU0sb0JBQW9CLE1BQU0sS0FBSyxhQUFhLHFCQUFxQixLQUFLLE1BQU07S0FDaEYsVUFBVTtLQUNWLE9BQU87S0FDUCxrQkFBa0I7S0FDbEIsVUFBVTtLQUNYLENBQUM7QUFDRixZQUFRLGVBQWUsSUFBSSxTQUFTLGtCQUFrQixLQUFLLFFBQVE7QUFHbkUsUUFBSSxrQkFBa0IsS0FBSyxRQUFRLFNBQVMsR0FBRztBQUM3QyxXQUFNLEtBQUssb0JBQW9CLG1CQUFtQixRQUFROzs7R0FJOUQsTUFBTSxpQkFBaUIsUUFBUSxlQUFlLElBQUksUUFBUTtBQUMxRCxPQUFJLGtCQUFrQixlQUFlLFNBQVMsR0FBRztJQUUvQyxNQUFNLFdBQVcsZUFBZSxLQUFLLE1BQU0sS0FBSyxRQUFRLEdBQUcsZUFBZSxPQUFPO0FBQ2pGLFdBQU8sU0FBUzs7QUFJbEIsT0FBSSxLQUFLLFVBQVU7QUFDakIsV0FBTzs7QUFJVCxTQUFNLElBQUksTUFDUixxQkFBcUIsT0FBTyxHQUFHLEdBQUcsS0FBSyxLQUFLLFFBQVEsS0FBSyxLQUFLLGdCQUM1RCxNQUFNLEtBQUssS0FBSyxpQ0FDbkI7Ozs7Ozs7O0VBU0gsTUFBYyxvQkFDWixlQUNBLFNBQ2U7R0FDZixNQUFNQyxvQkFBcUMsRUFBRTtBQUc3QyxRQUFLLE1BQU0sQ0FBQyxVQUFVLFlBQVksY0FBYyxRQUFRLFNBQVMsRUFBRTtJQUNqRSxNQUFNLFNBQVMsS0FBSyxjQUFjLElBQUksU0FBUztJQUMvQyxNQUFNQyxrQkFBNkMsRUFBRTtBQUVyRCxLQUFDLFFBQVEsSUFDUCxRQUFRLElBQ04sTUFBTSxLQUFLLDZCQUE2QixTQUFTLElBQUksUUFBUSxPQUFPLFdBQVcsQ0FDaEY7QUFFSCxTQUFLLE1BQU0sVUFBVSxTQUFTO0tBQzVCLE1BQU0sWUFBWSxHQUFHLFNBQVMsR0FBRyxPQUFPO0FBQ3hDLFNBQUksQ0FBQyxRQUFRLGdCQUFnQixJQUFJLFVBQVUsRUFBRTtBQUMzQyxzQkFBZ0IsS0FBSyxPQUFPO0FBQzVCLGNBQVEsZ0JBQWdCLElBQUksVUFBVTs7O0FBSTFDLFFBQUksZ0JBQWdCLFNBQVMsR0FBRztBQUM5QixVQUFLLE1BQU0sVUFBVSxpQkFBaUI7QUFDcEMsT0FBQyxRQUFRLElBQ1AsUUFBUSxJQUNOLE1BQU0sS0FDSixrQkFBa0IsU0FBUyxXQUMzQixLQUFLLFVBQVUsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQ3JDLENBQ0Y7TUFDSCxNQUFNLGlCQUFpQixNQUFNLGVBQWUsb0JBQzFDLFFBQ0EsUUFDQTtPQUFFLEtBQUssS0FBSztPQUFVLGNBQWM7T0FBTSxDQUMzQztBQUNELHdCQUFrQixLQUFLLEdBQUcsZUFBZTs7OztHQU0vQyxNQUFNLGFBQWEsS0FBSyxjQUFjLElBQUksY0FBYyxLQUFLLFNBQVM7R0FDdEUsTUFBTUMsc0JBQWlELEVBQUU7QUFFekQsSUFBQyxRQUFRLElBQ1AsUUFBUSxJQUNOLE1BQU0sS0FDSiwwQkFBMEIsY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLEtBQUssUUFBUSxPQUFPLFdBQzdGLENBQ0Y7QUFFSCxRQUFLLE1BQU0sVUFBVSxjQUFjLEtBQUssU0FBUztJQUMvQyxNQUFNLFlBQVksR0FBRyxjQUFjLEtBQUssU0FBUyxHQUFHLE9BQU87QUFDM0QsUUFBSSxDQUFDLFFBQVEsZ0JBQWdCLElBQUksVUFBVSxFQUFFO0FBQzNDLHlCQUFvQixLQUFLLE9BQU87QUFDaEMsYUFBUSxnQkFBZ0IsSUFBSSxVQUFVOzs7QUFJMUMsT0FBSSxvQkFBb0IsU0FBUyxHQUFHO0FBQ2xDLFNBQUssTUFBTSxVQUFVLHFCQUFxQjtBQUN4QyxNQUFDLFFBQVEsSUFDUCxRQUFRLElBQ04sTUFBTSxLQUNKLGtCQUFrQixjQUFjLEtBQUssU0FBUyxXQUM5QyxLQUFLLFVBQVUsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQ3JDLENBQ0Y7S0FDSCxNQUFNLGlCQUFpQixNQUFNLGVBQWUsb0JBQzFDLFlBQ0EsUUFDQTtNQUFFLEtBQUssS0FBSztNQUFVLGNBQWM7TUFBTSxDQUMzQztBQUNELHVCQUFrQixLQUFLLEdBQUcsZUFBZTs7O0FBSzdDLE9BQUksa0JBQWtCLFNBQVMsR0FBRztBQUNoQyxVQUFNLGVBQWUsZUFBZSxLQUFLLGNBQWMsa0JBQWtCO0FBRXpFLEtBQUMsUUFBUSxJQUNQLFFBQVEsSUFDTixNQUFNLE1BQ0osaUJBQWlCLGNBQWMsS0FBSyxTQUFTLHFCQUMzQyxHQUFHLGNBQWMsS0FBSyxRQUFRLE9BQU8sVUFBVSxjQUFjLFFBQVEsS0FBSyxtQkFDN0UsQ0FDRjs7Ozs7Ozs7OztFQVdQLE1BQWMsaUJBQ1osV0FDQSxNQUNBLFFBQ2tCO0FBRWxCLE9BQUksVUFBVSxXQUFXLFNBQVMsRUFBRTtJQUVsQyxNQUFNLGNBQWMsS0FBSyxTQUFTLGNBQWMsS0FBSyxTQUFTO0lBQzlELE1BQU0sY0FBYyxNQUFNLE9BQU87SUFDakMsTUFBTSxRQUFRLGNBQWMsWUFBWSxVQUFVLFlBQVk7SUFDOUQsTUFBTSxPQUFPLFVBQVUsTUFBTSxFQUFFO0FBRS9CLFFBQUk7S0FFRixNQUFNLFFBQVEsS0FBSyxNQUFNLDJCQUEyQjtBQUNwRCxTQUFJLENBQUMsT0FBTztBQUNWLFlBQU0sSUFBSSxNQUNSLGtEQUFrRCxLQUFLLEtBQUssSUFBSSxZQUNqRTs7S0FHSCxNQUFNLEdBQUcsTUFBTSxXQUFXO0tBQzFCLE1BQU0sUUFBUSxLQUFLLE1BQU0sSUFBSTtLQUc3QixJQUFJQyxLQUFjO0FBQ2xCLFVBQUssTUFBTSxRQUFRLE9BQU87QUFDeEIsVUFBSSxPQUFPLE9BQU8sWUFBWSxPQUFPLFFBQVEsUUFBUSxJQUFJO0FBQ3ZELFlBQU0sR0FBK0I7YUFDaEM7QUFDTCxhQUFNLElBQUksTUFBTSw0Q0FBNEMsS0FBSyxLQUFLLFVBQVUsT0FBTzs7O0FBSzNGLFNBQUksT0FBTyxPQUFPLFlBQVk7QUFDNUIsWUFBTSxJQUFJLE1BQU0sMkJBQTJCLEtBQUssMEJBQTBCLEtBQUssS0FBSyxHQUFHOztLQUd6RixJQUFJQyxPQUFrQixFQUFFO0FBQ3hCLFNBQUksU0FBUyxNQUFNLEVBQUU7QUFDbkIsYUFBTyxLQUFLLG1CQUFtQixTQUFTLEtBQUssS0FBSzs7QUFHcEQsWUFBTyxHQUFHLEdBQUcsS0FBSzthQUNYLE9BQU87QUFDZCxNQUFDLFFBQVEsSUFDUCxRQUFRLElBQ04sTUFBTSxPQUNKLGdDQUFnQyxVQUFVLFFBQVEsS0FBSyxLQUFLLDRCQUM3RCxFQUNELE1BQ0Q7QUFDSCxZQUFPLEtBQUsscUJBQXFCLE1BQU0sT0FBTzs7O0FBS2xELElBQUMsUUFBUSxJQUNQLFFBQVEsSUFDTixNQUFNLE9BQ0osd0NBQXdDLEtBQUssS0FBSyxJQUFJLFVBQVUsZ0VBQ2pFLENBQ0Y7QUFDSCxVQUFPLEtBQUsscUJBQXFCLE1BQU0sT0FBTzs7Ozs7Ozs7Ozs7O0VBYWhELE1BQWMscUJBQXFCLE1BQWtCLFFBQW1DO0dBQ3RGLE1BQU0sY0FBYyxNQUFNLE9BQU87R0FDakMsTUFBTSxRQUFRLFlBQVk7R0FDMUIsTUFBTSxVQUFVLFlBQVk7R0FDNUIsTUFBTSxVQUFVLFlBQVk7R0FFNUIsTUFBTSxjQUFjLEtBQUssV0FBVyxPQUFPLFVBQVUsS0FBSyxXQUFXLE9BQU8sVUFBVTs7Ozs7Ozs7OztBQVl0RixPQUFJLFFBQVEsT0FBTyxnQkFBZ0IsS0FBSyxTQUFTLFFBQVE7SUFDdkQsTUFBTSxjQUFjO0tBQ2xCO0tBQ0E7S0FDQTtLQUNBO0tBQ0E7S0FDQTtLQUNBO0tBQ0E7S0FDQTtLQUNBO0tBQ0E7S0FDQTtLQUNBO0tBQ0E7S0FDQTtLQUNBO0tBQ0E7S0FDRDtJQUNELE1BQU0sV0FBVztLQUFDO0tBQU07S0FBTTtLQUFNO0tBQU87S0FBTztLQUFLO0lBQ3ZELE1BQU0sV0FBVztLQUFDO0tBQU07S0FBTTtLQUFNO0tBQU07S0FBTTtLQUFNO0tBQU07S0FBSztJQUVqRSxNQUFNLE9BQU8sTUFBTSxRQUFRLGFBQWEsWUFBWTtJQUVwRCxNQUFNLFNBQVMsS0FBSyxRQUFRO0FBQzVCLFFBQUksU0FBUyxJQUFLO0tBQ2hCLE1BQU0sU0FBUyxNQUFNLFFBQVEsYUFBYSxTQUFTO0FBQ25ELFlBQU8sR0FBRyxPQUFPLEdBQUc7O0FBRXRCLFFBQUksU0FBUyxJQUFLO0tBQ2hCLE1BQU0sU0FBUyxNQUFNLFFBQVEsYUFBYSxTQUFTO0FBQ25ELFlBQU8sR0FBRyxLQUFLLEdBQUc7O0FBRXBCLFdBQU87Ozs7Ozs7R0FRVCxNQUFNLGlCQUFpQixLQUFLLFNBQVMsS0FBSyxXQUFXLEtBQUssU0FBUztHQUNuRSxNQUFNLGlCQUFpQixLQUFLLEtBQUssYUFBYSxDQUFDLFFBQVEsTUFBTSxHQUFHO0FBRWhFLFFBQUssTUFBTSxDQUFDLFNBQVMsV0FBVyxPQUFPLFFBQVEsZUFBZSxlQUFlLEVBQUU7QUFDN0UsUUFBSSxlQUFlLFNBQVMsUUFBUSxhQUFhLENBQUMsRUFBRTtBQUNsRCxTQUFJO0FBQ0YsYUFBTyxNQUFNLEtBQUssdUJBQXVCLE9BQU8sT0FBTyxLQUFLO2NBQ3JELE9BQU87QUFDZCxPQUFDLFFBQVEsSUFDUCxRQUFRLElBQ04sTUFBTSxPQUNKLG9DQUFvQyxRQUFRLFFBQVEsS0FBSyxLQUFLLGlCQUMvRCxFQUNELE1BQ0Q7QUFDSDs7Ozs7Ozs7QUFTTixPQUFJLEtBQUssU0FBUyxVQUFVLFFBQVEsUUFBUSxLQUFLLElBQUk7QUFDbkQsUUFBSSxLQUFLLEdBQUcsU0FBUyxLQUFLLEVBQUU7QUFDMUIsWUFBTyxLQUFLLG1CQUFtQixNQUFNLFFBQVEsT0FBTyxZQUFZOzs7O0FBS3BFLE9BQUksS0FBSyxTQUFTLFFBQVE7SUFDeEIsSUFBSUMsYUFBdUIsRUFBRTtBQUU3QixRQUFJLFVBQVUsUUFBUSxNQUFNLFFBQVEsS0FBSyxLQUFLLElBQUksS0FBSyxLQUFLLFNBQVMsR0FBRztBQUN0RSxrQkFBYSxLQUFLO2VBQ1QsUUFBUSxRQUFRLEtBQUssTUFBTSxRQUFRLGFBQWEsS0FBSyxLQUFLO0FBQ25FLGtCQUFhLE9BQU8sS0FBSyxPQUFPLFdBQVcsS0FBSyxJQUFJOztBQUd0RCxRQUFJLFdBQVcsU0FBUyxHQUFHO0FBQ3pCLFlBQU8sTUFBTSxRQUFRLGFBQWEsV0FBVzs7QUFFL0MsV0FBTyxLQUFLLFdBQVcsT0FBTzs7QUFHaEMsT0FBSSxLQUFLLFNBQVMsVUFBVTtJQUMxQixJQUFJQSxhQUF1QixFQUFFO0FBRTdCLFFBQUksVUFBVSxRQUFRLE1BQU0sUUFBUSxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUssU0FBUyxHQUFHO0FBQ3RFLGtCQUFhLEtBQUs7ZUFDVCxRQUFRLFFBQVEsS0FBSyxNQUFNLFFBQVEsYUFBYSxLQUFLLEtBQUs7QUFDbkUsa0JBQWEsT0FBTyxLQUFLLE9BQU8sV0FBVyxLQUFLLElBQUk7O0FBR3RELFFBQUksV0FBVyxTQUFTLEdBQUc7QUFDekIsWUFBTyxDQUFDLE1BQU0sUUFBUSxhQUFhLFdBQVcsQ0FBQzs7QUFFakQsV0FBTyxFQUFFOzs7Ozs7QUFPWCxPQUFJLEtBQUssU0FBUyxZQUFZLEtBQUssU0FBUyxjQUFjLEtBQUssU0FBUyxZQUFZO0FBQ2xGLFdBQU87OztHQUlULE1BQU0sY0FBYyxlQUFlLGNBQWMsS0FBSztBQUN0RCxPQUFJLGFBQWE7QUFDZixRQUFJO0FBQ0YsWUFBTyxNQUFNLEtBQUssdUJBQXVCLFlBQVksT0FBTyxLQUFLO2FBQzFELE9BQU87QUFDZCxNQUFDLFFBQVEsSUFDUCxRQUFRLElBQ04sTUFBTSxPQUFPLHNDQUFzQyxLQUFLLEtBQUssb0JBQW9CLE1BQU0sQ0FDeEY7Ozs7QUFLUCxXQUFRLEtBQUssTUFBYjtJQUNFLEtBQUs7SUFDTCxLQUFLLFdBQ0gsUUFBTyxNQUFNLE1BQU0sTUFBTSxFQUFFO0lBQzdCLEtBQUssVUFDSCxRQUFPLE1BQU0sT0FBTyxJQUFJO0tBQUUsS0FBSztLQUFHLEtBQUs7S0FBTSxDQUFDO0lBQ2hELEtBQUssWUFDSCxRQUFPLENBQUMsTUFBTSxPQUFPLElBQUk7S0FBRSxLQUFLO0tBQUcsS0FBSztLQUFNLENBQUMsQ0FBQztJQUNsRCxLQUFLLGFBQ0gsUUFBTyxNQUFNLE9BQU8sT0FBTztLQUFFLEtBQUs7S0FBSSxLQUFLO0tBQU8sQ0FBQztJQUNyRCxLQUFLLGVBQ0gsUUFBTyxDQUFDLE1BQU0sT0FBTyxPQUFPO0tBQUUsS0FBSztLQUFJLEtBQUs7S0FBTyxDQUFDLENBQUM7SUFDdkQsS0FBSztJQUNMLEtBQUssVUFDSCxRQUFPLE1BQU0sT0FBTyxNQUFNO0tBQUUsS0FBSztLQUFHLEtBQUs7S0FBTSxDQUFDO0lBQ2xELEtBQUs7SUFDTCxLQUFLLFlBQ0gsUUFBTyxDQUFDLE1BQU0sT0FBTyxNQUFNO0tBQUUsS0FBSztLQUFHLEtBQUs7S0FBTSxDQUFDLENBQUM7SUFDcEQsS0FBSyxVQUNILFFBQU8sTUFBTSxTQUFTLFNBQVM7SUFDakMsS0FBSyxZQUNILFFBQU8sQ0FBQyxNQUFNLFNBQVMsU0FBUyxDQUFDO0lBQ25DLEtBQUs7SUFDTCxLQUFLLFNBQ0gsUUFBTyxNQUFNLEtBQUssTUFBTTtJQUMxQixLQUFLLE9BQ0gsUUFBTyxFQUFFO0lBQ1gsS0FBSztJQUNMLEtBQUssU0FDSCxRQUFPLE1BQU0sT0FBTyxNQUFNO0lBQzVCLFFBQ0UsUUFBTzs7Ozs7Ozs7OztFQVdiLEFBQVEsbUJBQ04sTUFDQSxTQUNBLE9BQ0EsY0FDVztHQUNYLE1BQU0sUUFBUSxNQUFNLE9BQU8sSUFBSTtJQUFFLEtBQUs7SUFBRyxLQUFLO0lBQUcsQ0FBQzs7QUFHbEQsT0FBSSxRQUFRLFFBQVEsS0FBSyxPQUFPLGdCQUFnQjtBQUM5QyxXQUFPLE1BQU0sS0FBSyxFQUFFLFFBQVEsT0FBTyxTQUFTO0tBQzFDLEtBQUssTUFBTSxNQUFNLEtBQUs7S0FDdEIsTUFBTSxNQUFNLE9BQU8sVUFBVTtLQUM3QixXQUFXLE1BQU0sUUFBUSxhQUFhO01BQ3BDO01BQ0E7TUFDQTtNQUNBO01BQ0QsQ0FBQztLQUNILEVBQUU7OztHQUlMLE1BQU0saUJBQWlCLEtBQUssS0FBSyxhQUFhLENBQUMsUUFBUSxNQUFNLEdBQUc7QUFFaEUsT0FBSSxlQUFlLFNBQVMsTUFBTSxJQUFJLGVBQWUsU0FBUyxRQUFRLEVBQUU7QUFDdEUsV0FBTyxNQUFNLEtBQUssRUFBRSxRQUFRLE9BQU8sUUFBUSxNQUFNLFNBQVMsS0FBSyxDQUFDOztBQUdsRSxPQUFJLGVBQWUsU0FBUyxLQUFLLElBQUksZUFBZSxTQUFTLElBQUksRUFBRTtBQUNqRSxXQUFPLE1BQU0sS0FBSyxFQUFFLFFBQVEsT0FBTyxRQUFRLE1BQU0sT0FBTyxJQUFJO0tBQUUsS0FBSztLQUFHLEtBQUs7S0FBSyxDQUFDLENBQUM7O0FBR3BGLE9BQUksZUFBZSxTQUFTLE1BQU0sSUFBSSxlQUFlLFNBQVMsT0FBTyxFQUFFO0FBQ3JFLFdBQU8sTUFBTSxLQUFLLEVBQUUsUUFBUSxPQUFPLFFBQVEsTUFBTSxNQUFNLE1BQU0sQ0FBQzs7O0FBSWhFLFVBQU8sRUFBRTs7Ozs7Ozs7Ozs7O0VBYVgsTUFBYyx1QkFBdUIsWUFBb0IsTUFBb0M7R0FDM0YsTUFBTSxjQUFjLE1BQU0sT0FBTztHQUNqQyxNQUFNLFFBQVEsWUFBWTtHQUMxQixNQUFNLFVBQVUsWUFBWTtHQUM1QixNQUFNLFVBQVUsWUFBWTs7QUFHNUIsT0FBSSxDQUFDLFdBQVcsV0FBVyxRQUFRLEVBQUU7QUFDbkMsUUFBSTtBQUNGLFlBQU8sS0FBSyxNQUFNLFdBQVc7WUFDdkI7QUFDTixZQUFPOzs7O0dBS1gsTUFBTSxRQUFRLFdBQVcsTUFBTSxtQ0FBbUM7QUFDbEUsT0FBSSxDQUFDLE9BQU87QUFDVixVQUFNLElBQUksTUFBTSw2QkFBNkIsYUFBYTs7R0FHNUQsTUFBTSxHQUFHLFdBQVcsUUFBUTtHQUM1QixNQUFNLGdCQUNKLGNBQWMsWUFBWSxVQUFVLGNBQWMsWUFBWSxVQUFVO0dBRTFFLE1BQU0sWUFBWSxLQUFLLE1BQU0sMkJBQTJCO0FBQ3hELE9BQUksQ0FBQyxXQUFXO0FBQ2QsVUFBTSxJQUFJLE1BQU0sZ0NBQWdDLEtBQUssS0FBSyxJQUFJLGFBQWE7O0dBRzdFLE1BQU0sR0FBRyxNQUFNLFdBQVc7R0FDMUIsTUFBTSxRQUFRLEtBQUssTUFBTSxJQUFJOztHQUc3QixJQUFJRixLQUFjO0FBQ2xCLFFBQUssTUFBTSxRQUFRLE9BQU87QUFDeEIsUUFBSSxPQUFPLE9BQU8sWUFBWSxPQUFPLFFBQVEsUUFBUSxJQUFJO0FBQ3ZELFVBQU0sR0FBK0I7V0FDaEM7QUFDTCxXQUFNLElBQUksTUFBTSwwQkFBMEIsS0FBSyxLQUFLLElBQUksVUFBVSxHQUFHLE9BQU87OztBQUloRixPQUFJLE9BQU8sT0FBTyxZQUFZO0FBQzVCLFVBQU0sSUFBSSxNQUFNLEdBQUcsVUFBVSxHQUFHLEtBQUssMEJBQTBCLEtBQUssS0FBSyxHQUFHOztHQUc5RSxJQUFJQyxPQUFrQixFQUFFO0FBQ3hCLE9BQUksU0FBUyxNQUFNLEVBQUU7QUFDbkIsV0FBTyxLQUFLLG1CQUFtQixTQUFTLEtBQUssS0FBSzs7QUFHcEQsVUFBTyxHQUFHLEdBQUcsS0FBSzs7Ozs7Ozs7Ozs7O0VBYXBCLE1BQWMsZ0JBQ1osYUFDQSxNQUNBLFFBQ0EsUUFDa0I7QUFFbEIsT0FBSSxRQUFRO0lBQ1YsTUFBTSxjQUFjLEdBQUcsT0FBTyxHQUFHLEtBQUs7QUFHdEMsUUFBSSxLQUFLLFNBQVMsSUFBSSxZQUFZLEVBQUU7QUFDbEMsWUFBTyxLQUFLLFNBQVMsSUFBSSxZQUFZOztJQUl2QyxNQUFNLFdBQVcsT0FBTyxNQUFNLFFBQVEsTUFBTTtBQUMxQyxTQUFJLGVBQWUsRUFBRSxDQUFFLFFBQU87QUFDOUIsU0FBSSxFQUFFLE1BQU0saUJBQWtCLFFBQU87QUFDckMsU0FBSSxFQUFFLFNBQVMsS0FBTSxRQUFPO0FBQzVCLFlBQU8sQ0FBQyxDQUFDLEVBQUUsTUFBTTtNQUNqQjtBQUdGLFFBQUksU0FBUyxXQUFXLEdBQUc7QUFDekIsTUFBQyxRQUFRLElBQ1AsUUFBUSxJQUNOLDRDQUE0QyxPQUFPLEdBQUcsR0FBRyxLQUFLLEtBQUssK0JBQ3BFO0FBQ0gsWUFBTyxLQUFLLHNCQUFzQixhQUFhLE1BQU0sT0FBTzs7SUFHOUQsTUFBTSxTQUFTLEtBQUssV0FBVztJQUMvQixNQUFNLEVBQUUsb0JBQW9CLE1BQU0sT0FBTztJQUN6QyxNQUFNLEVBQUUsaUJBQWlCLE1BQU0sT0FBTztJQUV0QyxNQUFNLGNBQWMsTUFBTSxhQUFhO0tBQ3JDLE9BQU8sZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLENBQUMsS0FBSyxRQUFRLFlBQVksb0JBQW9CO0tBQ2hGLFFBQVEsS0FBSyxrQkFBa0IsVUFBVSxPQUFPO0tBQ2pELENBQUM7QUFDRixRQUFJLENBQUMsZUFBZSxPQUFPLFlBQVksU0FBUyxVQUFVO0FBQ3hELFdBQU0sSUFBSSxNQUFNLHVCQUF1Qjs7SUFJekMsTUFBTSxZQUFZLEtBQUssb0JBQW9CLFlBQVksTUFBTSxTQUFTO0FBQ3RFLFNBQUssTUFBTSxDQUFDLFdBQVcsVUFBVSxPQUFPLFFBQVEsVUFBVSxFQUFFO0FBQzFELFVBQUssU0FBUyxJQUFJLEdBQUcsT0FBTyxHQUFHLGFBQWEsTUFBTTs7QUFJcEQsUUFBSSxLQUFLLFNBQVMsSUFBSSxZQUFZLEVBQUU7QUFDbEMsWUFBTyxLQUFLLFNBQVMsSUFBSSxZQUFZOztBQUl2QyxXQUFPLEtBQUssc0JBQXNCLGFBQWEsTUFBTSxPQUFPOztBQUk5RCxVQUFPLEtBQUssc0JBQXNCLGFBQWEsTUFBTSxPQUFPOzs7OztFQU05RCxNQUFjLHNCQUNaLGFBQ0EsTUFDQSxRQUNrQjtHQUNsQixNQUFNLFdBQVcsR0FBRyxPQUFPLEdBQUcsR0FBRyxLQUFLLEtBQUssR0FBRztBQUM5QyxPQUFJLEtBQUssUUFBUSxrQkFBa0IsS0FBSyxTQUFTLElBQUksU0FBUyxFQUFFO0FBQzlELFdBQU8sS0FBSyxTQUFTLElBQUksU0FBUzs7R0FHcEMsTUFBTSxTQUFTLEtBQUssV0FBVztHQUMvQixNQUFNLEVBQUUsb0JBQW9CLE1BQU0sT0FBTztHQUN6QyxNQUFNLEVBQUUsaUJBQWlCLE1BQU0sT0FBTztHQUV0QyxNQUFNLGlCQUFpQixNQUFNLGFBQWE7SUFDeEMsT0FBTyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQyxLQUFLLFFBQVEsWUFBWSxvQkFBb0I7SUFDaEYsUUFBUSxLQUFLLGVBQWUsYUFBYSxNQUFNLE9BQU87SUFDdkQsQ0FBQztBQUNGLE9BQUksQ0FBQyxrQkFBa0IsT0FBTyxlQUFlLFNBQVMsVUFBVTtBQUM5RCxVQUFNLElBQUksTUFBTSx1QkFBdUI7O0dBR3pDLE1BQU0sUUFBUSxLQUFLLGlCQUFpQixlQUFlLE1BQU0sS0FBSyxLQUFLO0FBQ25FLE9BQUksS0FBSyxRQUFRLGdCQUFnQjtBQUMvQixTQUFLLFNBQVMsSUFBSSxVQUFVLE1BQU07O0FBR3BDLFVBQU87Ozs7O0VBTVQsQUFBUSxrQkFBa0IsT0FBcUIsUUFBd0I7R0FDckUsTUFBTSxTQUFTLEtBQUssUUFBUSxVQUFVO0dBQ3RDLE1BQU0sV0FBVyxXQUFXLE9BQU8sV0FBVyxXQUFXLE9BQU8sYUFBYTtHQUU3RSxNQUFNLG9CQUFvQixNQUN2QixLQUFLLE1BQU07SUFDVixJQUFJLE9BQU8sS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFLEtBQUssS0FBSyxFQUFFLE1BQU0sUUFBUTtBQUN2RCxTQUNHLEVBQUUsU0FBUyxVQUFVLEVBQUUsU0FBUyxhQUNqQyxRQUFRLEtBQ1IsRUFBRSxNQUNGLE9BQU8sYUFBYSxFQUFFLEtBQ3RCO0tBQ0EsTUFBTSxTQUFTLE9BQU8sS0FBSyxPQUFPLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxLQUFLO0FBQzlELGFBQVEscUJBQXFCLE9BQU87O0FBRXRDLFdBQU87S0FDUCxDQUNELEtBQUssS0FBSztHQUdiLE1BQU0sYUFBYSxPQUFPLE1BQ3ZCLFFBQ0UsTUFDQyxDQUFDLE1BQU0sU0FBUyxFQUFFLElBQ2xCLENBQUMsZUFBZSxFQUFFLElBQ2xCLEVBQUUsU0FBUyxRQUNYLEVBQUUsYUFBYSxLQUFLLEVBQUUsU0FDekIsQ0FDQSxLQUFLLE1BQU07SUFDVixJQUFJLE9BQU8sS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFLEtBQUs7QUFDbEMsUUFBSSxFQUFFLE1BQU0sS0FBTSxTQUFRLEtBQUssRUFBRSxLQUFLO0FBQ3RDLFNBQ0csRUFBRSxTQUFTLFVBQVUsRUFBRSxTQUFTLGFBQ2pDLFFBQVEsS0FDUixFQUFFLE1BQ0YsT0FBTyxhQUFhLEVBQUUsS0FDdEI7S0FDQSxNQUFNLFNBQVMsT0FBTyxLQUFLLE9BQU8sV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLEtBQUs7QUFDOUQsYUFBUSxxQkFBcUIsT0FBTzs7QUFFdEMsV0FBTztLQUNQLENBQ0QsS0FBSyxLQUFLO0dBQ2IsTUFBTSxvQkFBb0IsYUFDdEIsMEVBQTBFLGVBQzFFO0dBRUosTUFBTSxjQUFjLE1BQU0sS0FBSyxNQUFNLE1BQU0sRUFBRSxLQUFLLE1BQU0sRUFBRSxLQUFLLEdBQUcsQ0FBQyxLQUFLLE1BQU07R0FFOUUsTUFBTSxnQkFBZ0IsT0FBTyxNQUFNLE9BQU8seUJBQXlCLE9BQU8sS0FBSyxTQUFTO0FBRXhGLFVBQU8sc0NBQXNDLE9BQU8sR0FBRzs7VUFFakQsT0FBTyxLQUFLLGNBQWM7VUFDMUIsT0FBTyxRQUFRLFNBQVM7OztFQUdoQyxvQkFBb0Isa0JBQWtCOzs7Ozs7UUFNaEMsU0FBUzs7OztFQUlmLFlBQVk7Ozs7OztFQU9aLEFBQVEsb0JBQW9CLE1BQWMsT0FBOEM7R0FDdEYsTUFBTSxXQUFXLEtBQ2QsTUFBTSxDQUNOLFFBQVEsZ0JBQWdCLEdBQUcsQ0FDM0IsUUFBUSxXQUFXLEdBQUcsQ0FDdEIsTUFBTTtHQUVULElBQUlFO0FBQ0osT0FBSTtJQUNGLE1BQU0sTUFBTSxLQUFLLE1BQU0sU0FBUztBQUNoQyxRQUFJLE9BQU8sUUFBUSxZQUFZLFFBQVEsUUFBUSxNQUFNLFFBQVEsSUFBSSxFQUFFO0FBQ2pFLE1BQUMsUUFBUSxJQUNQLFFBQVEsS0FBSyw4REFBOEQsS0FBSztBQUNsRixZQUFPLEVBQUU7O0FBRVgsYUFBUztXQUNIO0FBQ04sS0FBQyxRQUFRLElBQUksUUFBUSxLQUFLLHdEQUF3RCxLQUFLO0FBQ3ZGLFdBQU8sRUFBRTs7R0FHWCxNQUFNQyxTQUFrQyxFQUFFO0FBQzFDLFFBQUssTUFBTSxRQUFRLE9BQU87QUFDeEIsUUFBSSxLQUFLLFFBQVEsUUFBUTtBQUN2QixZQUFPLEtBQUssUUFBUSxLQUFLLGlCQUFpQixPQUFPLE9BQU8sS0FBSyxTQUFTLEdBQUcsRUFBRSxLQUFLLEtBQUs7OztBQUd6RixVQUFPOztFQUdULEFBQVEsZUFBZSxNQUFjLE1BQWtCLFFBQXdCO0dBQzdFLE1BQU0sU0FBUyxLQUFLLFFBQVEsVUFBVTtHQUN0QyxNQUFNLFdBQVcsV0FBVyxPQUFPLFdBQVcsV0FBVyxPQUFPLGFBQWE7R0FFN0UsTUFBTSxnQkFBZ0IsT0FBTyxNQUFNLE9BQU8scUJBQXFCLE9BQU8sS0FBSyxTQUFTO0dBRXBGLE1BQU0sY0FBYyxPQUFPLE1BQ3hCLFFBQVEsTUFBTSxFQUFFLFNBQVMsS0FBSyxRQUFRLENBQUMsZUFBZSxFQUFFLElBQUksRUFBRSxNQUFNLEtBQUssQ0FDekUsS0FBSyxNQUFNLEtBQUssRUFBRSxLQUFLLElBQUksRUFBRSxLQUFLLEtBQUssRUFBRSxNQUFNLE9BQU8sQ0FDdEQsS0FBSyxLQUFLO0dBQ2IsTUFBTSxxQkFBcUIsY0FDdkIsbURBQW1ELGdCQUNuRDtHQUVKLElBQUksU0FBUywwQkFBMEIsT0FBTyxHQUFHLEdBQUcsS0FBSyxLQUFLLFVBQVUsS0FBSyxLQUFLLEdBQUcsZ0JBQWdCLG1CQUFtQjs7ZUFFN0csS0FBSzs7OztRQUlaLFNBQVM7WUFDTCxLQUFLLGtCQUFrQixLQUFLLEtBQUs7QUFHekMsT0FBSSxLQUFLLFNBQVMsVUFBVSxLQUFLLFNBQVMsVUFBVTtJQUNsRCxJQUFJRixhQUF1QixFQUFFO0FBRTdCLFFBQUksVUFBVSxRQUFRLE1BQU0sUUFBUSxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUssU0FBUyxHQUFHO0FBQ3RFLGtCQUFhLEtBQUs7ZUFDVCxRQUFRLFFBQVEsS0FBSyxNQUFNLFFBQVEsYUFBYSxLQUFLLEtBQUs7QUFDbkUsa0JBQWEsT0FBTyxLQUFLLE9BQU8sV0FBVyxLQUFLLElBQUk7O0FBR3RELFFBQUksV0FBVyxTQUFTLEdBQUc7QUFDekIsZUFBVSx5REFBeUQsV0FBVyxLQUFLLEtBQUs7OztBQUk1RixhQUFVLGdCQUFnQixLQUFLLGtCQUFrQixLQUFLLE1BQU0sT0FBTztBQUVuRSxVQUFPOztFQUdULEFBQVEsaUJBQWlCLE1BQWMsVUFBMkI7R0FDaEUsTUFBTSxVQUFVLEtBQUssTUFBTTtBQUczQixPQUFJLFNBQVMsU0FBUyxLQUFLLEVBQUU7QUFDM0IsUUFBSTtLQUNGLE1BQU0sU0FBUyxLQUFLLE1BQU0sUUFBUTtLQUNsQyxNQUFNLFdBQVcsU0FBUyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBRXRDLFNBQUksTUFBTSxRQUFRLE9BQU8sRUFBRTtBQUN6QixhQUFPLE9BQU8sS0FBSyxTQUFTO0FBRTFCLFdBQUksU0FBUyxRQUFRLFNBQVMsV0FBVztBQUN2QyxlQUFPLEtBQUssdUJBQXVCLFNBQVM7O0FBRzlDLFdBQUksT0FBTyxTQUFTLFVBQVU7QUFDNUIsZUFBTyxhQUFhLFNBQ2hCLE9BQ0EsS0FBSyxpQkFBaUIsS0FBSyxVQUFVLEtBQUssRUFBRSxTQUFTOztBQUczRCxjQUFPLEtBQUssaUJBQWlCLE9BQU8sS0FBSyxFQUFFLFNBQVM7UUFDcEQ7O0FBSUosU0FBSSxXQUFXLFFBQVEsV0FBVyxXQUFXO0FBQzNDLGFBQU8sQ0FBQyxLQUFLLHVCQUF1QixTQUFTLENBQUM7O0FBRWhELFlBQU8sQ0FBQyxLQUFLLGlCQUFpQixPQUFPLE9BQU8sRUFBRSxTQUFTLENBQUM7WUFDbEQ7QUFDTixZQUFPLEVBQUU7OztBQUliLFVBQU8sS0FBSyxpQkFBaUIsU0FBUyxTQUFTOztFQUdqRCxBQUFRLHVCQUF1QixVQUEyQjtBQUN4RCxXQUFRLFVBQVI7SUFDRSxLQUFLLFVBQ0gsUUFBTztJQUNULEtBQUssYUFDSCxRQUFPO0lBQ1QsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLLFVBQ0gsUUFBTztJQUNULEtBQUssVUFDSCxRQUFPO0lBQ1QsS0FBSyxPQUNILFFBQU8sSUFBSSxNQUFNO0lBQ25CLEtBQUssT0FDSCxRQUFPLEVBQUU7SUFDWCxLQUFLLE9BQ0gsUUFBTztJQUNULFFBQ0UsUUFBTzs7O0VBSWIsQUFBUSxpQkFBaUIsTUFBYyxVQUEyQjtHQUNoRSxNQUFNLFVBQVUsS0FBSyxNQUFNO0FBRTNCLFdBQVEsVUFBUjtJQUNFLEtBQUssV0FBVztLQUNkLE1BQU0sTUFBTSxTQUFTLFNBQVMsR0FBRztBQUNqQyxZQUFPLE9BQU8sTUFBTSxJQUFJLEdBQUcsSUFBSTs7SUFFakMsS0FBSyxjQUFjO0FBQ2pCLFNBQUk7QUFDRixhQUFPLE9BQU8sUUFBUTthQUNoQjtBQUNOLGFBQU87OztJQUdYLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSyxXQUFXO0tBQ2QsTUFBTSxNQUFNLFdBQVcsUUFBUTtBQUMvQixZQUFPLE9BQU8sTUFBTSxJQUFJLEdBQUcsSUFBSTs7SUFFakMsS0FBSyxVQUNILFFBQU8sUUFBUSxhQUFhLEtBQUs7SUFDbkMsS0FBSyxRQUFRO0tBQ1gsTUFBTSxPQUFPLElBQUksS0FBSyxRQUFRO0FBQzlCLFlBQU8sT0FBTyxNQUFNLEtBQUssU0FBUyxDQUFDLEdBQUcsSUFBSSxNQUFNLEdBQUc7O0lBRXJELEtBQUssT0FDSCxLQUFJO0FBQ0YsWUFBTyxLQUFLLE1BQU0sUUFBUTtZQUNwQjtBQUNOLFlBQU87O0lBRVgsS0FBSztJQUNMLEtBQUssT0FDSCxRQUFPO0lBQ1QsUUFDRSxRQUFPOzs7Ozs7Ozs7OztFQVliLEFBQVEsbUJBQW1CLFNBQWlCLFVBQTZCO0FBRXZFLE9BQUk7SUFDRixNQUFNLFNBQVMsS0FBSyxNQUFNLElBQUksUUFBUSxHQUFHO0FBQ3pDLFdBQU8sTUFBTSxRQUFRLE9BQU8sR0FBRyxTQUFTLENBQUMsT0FBTztXQUMxQztBQUtSLE9BQUk7SUFDRixNQUFNLFVBQVUsS0FBSyx1QkFBdUIsUUFBUTtJQUNwRCxNQUFNLFNBQVMsS0FBSyxNQUFNLElBQUksUUFBUSxHQUFHO0FBQ3pDLFdBQU8sTUFBTSxRQUFRLE9BQU8sR0FBRyxTQUFTLENBQUMsT0FBTztXQUMxQztHQUtSLE1BQU0sVUFBVSxRQUFRLE1BQU07QUFDOUIsT0FBSSxDQUFDLE9BQU8sTUFBTSxPQUFPLFFBQVEsQ0FBQyxFQUFFO0FBQ2xDLFdBQU8sQ0FBQyxPQUFPLFFBQVEsQ0FBQzs7QUFFMUIsT0FDRyxRQUFRLFdBQVcsS0FBSSxJQUFJLFFBQVEsU0FBUyxLQUFJLElBQ2hELFFBQVEsV0FBVyxJQUFJLElBQUksUUFBUSxTQUFTLElBQUksRUFDakQ7QUFDQSxXQUFPLENBQUMsUUFBUSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0FBRy9CLFNBQU0sSUFBSSxNQUFNLGdEQUFnRCxTQUFTLElBQUksVUFBVTs7Ozs7Ozs7O0VBVXpGLEFBQVEsdUJBQXVCLE9BQXVCO0dBRXBELE1BQU0sbUJBQW1CLE1BQU0sUUFDN0IsZ0NBQ0MsR0FBRyxZQUFvQixJQUFJLFFBQVEsUUFBUSxNQUFNLE9BQU0sQ0FBQyxRQUFRLFFBQVEsSUFBSSxDQUFDLEdBQy9FO0FBR0QsVUFBTyxpQkFBaUIsUUFBUSxzQ0FBc0MsYUFBVzs7Ozs7Ozs7RUFTbkYsQUFBUSxZQUFvQjtHQUMxQixJQUFJRztBQUVKLE9BQUk7SUFDRixNQUFNLEVBQUU7QUFDUixhQUFTLE9BQU8sU0FBUztXQUNuQjtBQUlSLE9BQUksQ0FBQyxRQUFRO0FBQ1gsYUFBUyxRQUFRLElBQUk7O0FBR3ZCLE9BQUksQ0FBQyxRQUFRO0FBQ1gsVUFBTSxJQUFJLE1BQ1Isa0dBQ0Q7O0FBR0gsVUFBTzs7RUFHVCxBQUFRLGtCQUFrQixVQUEwQjtBQUVsRCxPQUFJLFNBQVMsU0FBUyxLQUFLLEVBQUU7SUFDM0IsTUFBTSxXQUFXLFNBQVMsTUFBTSxHQUFHLENBQUMsRUFBRTtJQUN0QyxNQUFNLGFBQWEsS0FBSyxnQkFBZ0IsU0FBUztBQUNqRCxXQUFPLGlCQUFpQixXQUFXLFdBQVcsS0FBSyxrQkFBa0IsVUFBVSxLQUFLLENBQUM7O0FBR3ZGLFVBQU8sS0FBSyxnQkFBZ0IsU0FBUzs7RUFHdkMsQUFBUSxnQkFBZ0IsVUFBMEI7QUFDaEQsV0FBUSxVQUFSO0lBQ0UsS0FBSztJQUNMLEtBQUssYUFDSCxRQUFPO0lBQ1QsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLLFVBQ0gsUUFBTztJQUNULEtBQUssVUFDSCxRQUFPO0lBQ1QsS0FBSyxPQUNILFFBQU87SUFDVCxLQUFLLE9BQ0gsUUFBTztJQUNULEtBQUssT0FDSCxRQUFPO0lBQ1QsS0FBSyxPQUNILFFBQU87SUFDVCxRQUNFLFFBQU87OztFQUliLEFBQVEsa0JBQWtCLFVBQWtCLFFBQXdCO0FBRWxFLE9BQUksU0FBUyxTQUFTLEtBQUssRUFBRTtJQUMzQixNQUFNLFdBQVcsU0FBUyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0lBQ3RDLE1BQU0sY0FBYyxLQUFLLGlCQUFpQixVQUFVLE9BQU87QUFDM0QsV0FBTyxJQUFJLFlBQVk7O0FBR3pCLFVBQU8sS0FBSyxpQkFBaUIsVUFBVSxPQUFPOztFQUdoRCxBQUFRLGlCQUFpQixVQUFrQixRQUF3QjtHQUNqRSxNQUFNLFdBQVcsV0FBVztBQUU1QixXQUFRLFVBQVI7SUFDRSxLQUFLO0lBQ0wsS0FBSyxhQUNILFFBQU87SUFDVCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUssVUFDSCxRQUFPO0lBQ1QsS0FBSyxVQUNILFFBQU87SUFDVCxLQUFLLE9BQ0gsUUFBTztJQUNULEtBQUssT0FDSCxRQUFPO0lBQ1QsS0FBSyxPQUNILFFBQU87SUFDVCxLQUFLLE9BQ0gsUUFBTztJQUNULFFBQ0UsUUFBTyxXQUFXLFVBQVU7Ozs7Ozs7Ozs7RUFXbEMsTUFBYyxhQUFhLE1BQStCO0FBRXhELE9BQUksa0JBQWtCLEtBQUssS0FBSyxFQUFFO0FBQ2hDLFdBQU8sS0FBSyxtQkFBbUIsS0FBSzs7QUFHdEMsVUFBTyxLQUNKLGFBQWEsQ0FDYixRQUFRLFFBQVEsSUFBSSxDQUNwQixRQUFRLGVBQWUsR0FBRzs7Ozs7Ozs7RUFTL0IsQUFBUSxtQkFBbUIsTUFBc0I7R0FDL0MsTUFBTSxXQUFXO0lBQ2Y7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDRDtHQUNELE1BQU0sWUFBWTtJQUNoQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDRDtHQUNELE1BQU0sWUFBWTtJQUNoQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNEO0dBRUQsTUFBTSxZQUFZLFNBQXlCO0lBQ3pDLE1BQU0sT0FBTyxLQUFLLFdBQVcsRUFBRTtBQUMvQixRQUFJLE9BQU8sU0FBVSxPQUFPLE1BQVEsUUFBTztJQUMzQyxNQUFNLFNBQVMsT0FBTztJQUN0QixNQUFNLE1BQU0sS0FBSyxNQUFNLFNBQVMsSUFBSTtJQUNwQyxNQUFNLE9BQU8sS0FBSyxNQUFPLFNBQVMsTUFBTyxHQUFHO0lBQzVDLE1BQU0sT0FBTyxTQUFTO0FBQ3RCLFdBQU8sU0FBUyxPQUFPLFVBQVUsUUFBUSxVQUFVOztHQUdyRCxNQUFNLFFBQVEsQ0FBQyxHQUFHLEtBQUs7R0FFdkIsTUFBTSxhQUFhLFNBQVMsTUFBTSxHQUFHO0dBQ3JDLE1BQU0sWUFBWSxNQUFNLE1BQU0sRUFBRSxDQUFDLElBQUksU0FBUyxDQUFDLEtBQUssR0FBRztBQUV2RCxPQUFJLFdBQVc7QUFDYixXQUFPLEdBQUcsVUFBVSxHQUFHOztBQUV6QixVQUFPOzs7OztFQU1ULG1CQUFtQjtBQUNqQixVQUFPO0lBQ0wsTUFBTSxLQUFLLFNBQVM7SUFDcEIsU0FBUyxLQUFLLFFBQVE7SUFDdkI7Ozs7O0VBTUgsZ0JBQWdCO0FBQ2QsUUFBSyxTQUFTLE9BQU87Ozs7O0VBTXZCLEFBQVEsZ0JBQWtDO0FBQ3hDLFVBQU87SUFDTCxVQUFVLElBQUksS0FBSztJQUNuQixnQkFBZ0IsSUFBSSxLQUFLO0lBQ3pCLGlCQUFpQixJQUFJLEtBQUs7SUFDM0I7Ozs7Ozs7Ozs7O0VBWUgsTUFBTSxjQUNKLE9BQ2dDO0dBQ2hDLE1BQU0sVUFBVSxLQUFLLGVBQWU7R0FDcEMsTUFBTUMsb0JBSUQsRUFBRTtBQUdQLFFBQUssTUFBTSxRQUFRLE9BQU87SUFDeEIsTUFBTSxhQUFhLEtBQUssY0FBYyxJQUFJLEtBQUssT0FBTztBQUV0RCxRQUFJLFdBQVcsVUFBVTtLQUd2QixNQUFNLFNBQVMsV0FBVyxNQUFNLE1BQU0sTUFBTSxFQUFFLFNBQVMsS0FBSztLQUM1RCxNQUFNLGtCQUFrQixRQUFRLE1BQU0sMEJBQTBCLEVBQUU7S0FDbEUsTUFBTSxlQUFlLEtBQUssY0FBYyxJQUFJLFdBQVcsU0FBUztLQUdoRSxJQUFJLFFBQVEsS0FBSyxTQUFTLGFBQWEsTUFBTSxDQUFDLE9BQU8sR0FBRyxhQUFhLE1BQU0sS0FBSztBQUNoRixVQUFLLE1BQU0sQ0FBQyxLQUFLLFFBQVEsT0FBTyxRQUFRLGdCQUFnQixFQUFFO0FBQ3hELGNBQVEsTUFBTSxNQUNaLEdBQUcsYUFBYSxNQUFNLEdBQUcsT0FDekIsSUFDRDs7QUFFSCxhQUFRLE1BQ0wsU0FBUyxXQUFXLE9BQU8sR0FBRyxXQUFXLE1BQU0sTUFBTSxHQUFHLGFBQWEsTUFBTSxLQUFLLENBQ2hGLFVBQVUsR0FBRyxXQUFXLE1BQU0sS0FBSyxDQUNuQyxNQUFNLEtBQUssTUFBTTtLQUVwQixNQUFNLE9BQU8sTUFBTTtLQUNuQixNQUFNQyxlQUF5QixLQUFLLEtBQUssTUFBc0IsRUFBRSxHQUFHO0FBRXBFLFNBQUksYUFBYSxXQUFXLEdBQUc7QUFDN0IsT0FBQyxRQUFRLElBQ1AsUUFBUSxLQUNOLE1BQU0sT0FDSixjQUFjLEtBQUssT0FBTyxrQ0FDM0IsQ0FDRjtZQUNFO0FBQ0wsV0FBSyxNQUFNLFlBQVksY0FBYztPQUNuQyxNQUFNLFVBQVUsTUFBTSxLQUFLLFNBQVMsS0FBSyxRQUFRLEtBQUssYUFBYSxFQUFFLEVBQUUsUUFBUTtBQUMvRSxlQUFRLEtBQUs7QUFDYix5QkFBa0IsS0FBSztRQUFFLFFBQVEsS0FBSztRQUFRLE1BQU07UUFBUyxZQUFZO1FBQU0sQ0FBQzs7O1dBRy9FO0FBQ0wsVUFBSyxJQUFJLElBQUksR0FBRyxJQUFJLEtBQUssT0FBTyxLQUFLO01BQ25DLE1BQU0sVUFBVSxNQUFNLEtBQUssU0FBUyxLQUFLLFFBQVEsS0FBSyxhQUFhLEVBQUUsRUFBRSxRQUFRO0FBQy9FLHdCQUFrQixLQUFLO09BQ3JCLFFBQVEsS0FBSztPQUNiLE1BQU07T0FDUCxDQUFDOzs7O0dBTVIsTUFBTUMsaUJBQWtDLEVBQUU7QUFDMUMsUUFBSyxNQUFNLEVBQUUsUUFBUSxZQUFZLE1BQU0sZ0JBQWdCLG1CQUFtQjtJQUN4RSxNQUFNLFNBQVMsS0FBSyxjQUFjLElBQUksV0FBVztJQU1qRCxNQUFNLFNBQVMsT0FBTyxNQUFNLE1BQU0sTUFBTSxFQUFFLFNBQVMsS0FBSztJQUN4RCxNQUFNLGVBQ0osQ0FBQyxlQUNBLFFBQVEsU0FBUyxhQUNoQixRQUFRLFNBQVMsZ0JBQ2hCLFFBQVEsU0FBUyxZQUNoQixnQkFBZ0IsVUFBVSxFQUFFLEtBQzVCLE9BQVEsUUFBb0MsY0FBYyxhQUN4RCxRQUFtQyxhQUFhLElBQUksU0FBUyxVQUFVO0lBRS9FLE1BQU0sZ0JBQWdCLGVBQ2xCO0tBQUUsR0FBRztLQUFNLElBQUksS0FBSyxNQUFNLEtBQUssUUFBUSxHQUFHLElBQVE7S0FBRSxHQUNwRDtJQUVKLE1BQU0sVUFBVSxNQUFNLGVBQWUsb0JBQ25DLFFBQ0EsZUFDQSxFQUFFLGNBQWMsTUFBTSxDQUN2QjtBQUNELG1CQUFlLEtBQUssR0FBRyxRQUFROztHQUlqQyxNQUFNLFVBQVUsTUFBTSxlQUFlLGVBQWUsS0FBSyxjQUFjLGVBQWU7R0FHdEYsTUFBTSxtQkFBbUIsTUFBTSxLQUFLLG1CQUFtQixPQUFPLFFBQVE7R0FFdEUsTUFBTSxRQUFRLFFBQVEsU0FBUyxpQkFBaUI7QUFDaEQsSUFBQyxRQUFRLElBQ1AsUUFBUSxJQUFJLE1BQU0sTUFBTSx1QkFBdUIsTUFBTSxlQUFlLEtBQUssZUFBZSxDQUFDO0FBQzNGLFVBQU8sQ0FBQyxHQUFHLFNBQVMsR0FBRyxpQkFBaUI7Ozs7Ozs7O0VBUzFDLE1BQWMsbUJBQ1osT0FDQSxlQUNnQztHQUNoQyxNQUFNQyxhQUFvQyxFQUFFO0dBQzVDLE1BQU0sb0JBQW9CLElBQUksS0FBYTtBQUUzQyxRQUFLLE1BQU0sUUFBUSxPQUFPO0FBQ3hCLFFBQUksa0JBQWtCLElBQUksS0FBSyxPQUFPLENBQUU7QUFDeEMsc0JBQWtCLElBQUksS0FBSyxPQUFPO0lBRWxDLE1BQU0sU0FBUyxLQUFLLGNBQWMsSUFBSSxLQUFLLE9BQU87SUFDbEQsTUFBTSxTQUFTLE9BQU8sTUFBTSxNQUFNLE1BQU0sRUFBRSxTQUFTLEtBQUs7SUFDeEQsTUFBTSxhQUFhLFFBQVEsTUFBTTtBQUNqQyxRQUFJLENBQUMsY0FBYyxXQUFXLFdBQVcsRUFBRztJQUU1QyxNQUFNLGdCQUFnQixjQUFjLFFBQVEsTUFBTSxFQUFFLGFBQWEsS0FBSyxPQUFPO0FBQzdFLFFBQUksY0FBYyxXQUFXLEVBQUc7QUFFaEMsU0FBSyxNQUFNLGFBQWEsWUFBWTtLQUVsQyxNQUFNLGtCQUFrQixLQUFLLGNBQWMsSUFBSSxVQUFVLE9BQU87S0FDaEUsTUFBTSxTQUFTLGdCQUFnQixNQUFNLE1BQ2xDLE1BQU0sZUFBZSxFQUFFLElBQUksMkJBQTJCLEVBQUUsSUFBSSxFQUFFLFNBQVMsS0FBSyxPQUM5RTtBQUNELFNBQUksQ0FBQyxRQUFRO0FBQ1gsT0FBQyxRQUFRLElBQ1AsUUFBUSxLQUNOLE1BQU0sT0FDSiw2Q0FBNkMsVUFBVSxPQUFPLE1BQU0sS0FBSyxPQUFPLGFBQ2pGLENBQ0Y7QUFDSDs7S0FFRixNQUFNLFlBQVksR0FBRyxPQUFPLEtBQUs7S0FHakMsTUFBTSxrQkFBa0IsZ0JBQWdCLE1BQU0sTUFBTSxNQUFNLEVBQUUsU0FBUyxLQUFLO0tBQzFFLE1BQU0sZUFDSixpQkFBaUIsU0FBUyxhQUMxQixpQkFBaUIsU0FBUyxnQkFDekIsaUJBQWlCLFNBQVMsWUFDekIsZ0JBQWdCLG1CQUFtQixFQUFFLEtBQ3JDLE9BQVEsaUJBQTZDLGNBQWMsYUFDakUsaUJBQTRDLGFBQWEsSUFBSSxTQUFTLFVBQVU7S0FDdEYsTUFBTSxpQkFBaUIsVUFBVSxTQUFTO0tBRzFDLE1BQU0sVUFBVSxLQUFLLGVBQWU7S0FDcEMsTUFBTUMsMEJBQTJDLEVBQUU7QUFFbkQsVUFBSyxNQUFNLGdCQUFnQixlQUFlO01BQ3hDLE1BQU0sb0JBQW9CLEtBQUsseUJBQzdCLFVBQVUsYUFBYSxFQUFFLEVBQ3pCLGFBQWEsS0FDZDtBQUNELHdCQUFrQixhQUFhLGFBQWEsS0FBSztBQUVqRCxXQUFLLElBQUksSUFBSSxHQUFHLElBQUksZ0JBQWdCLEtBQUs7T0FDdkMsTUFBTSxVQUFVLE1BQU0sS0FBSyxTQUFTLFVBQVUsUUFBUSxtQkFBbUIsUUFBUTtPQUVqRixNQUFNLGdCQUFnQixlQUNsQjtRQUFFLEdBQUc7UUFBUyxJQUFJLEtBQUssTUFBTSxLQUFLLFFBQVEsR0FBRyxJQUFRO1FBQUUsR0FDdkQ7T0FFSixNQUFNLFVBQVUsTUFBTSxlQUFlLG9CQUNuQyxpQkFDQSxlQUlBLEVBQUUsY0FBYyxNQUFNLENBQ3ZCO0FBQ0QsK0JBQXdCLEtBQUssR0FBRyxRQUFROzs7S0FJNUMsTUFBTSxtQkFBbUIsTUFBTSxlQUFlLGVBQzVDLEtBQUssY0FDTCx3QkFDRDtBQUNELGdCQUFXLEtBQUssR0FBRyxpQkFBaUI7QUFFcEMsTUFBQyxRQUFRLElBQ1AsUUFBUSxJQUNOLE1BQU0sTUFDSix5QkFBeUIsaUJBQWlCLE9BQU8sR0FBRyxVQUFVLE9BQU8sV0FDdEUsQ0FDRjs7O0FBSVAsVUFBTzs7Ozs7OztFQVFULEFBQVEseUJBQ04sV0FDQSxZQUN5QjtHQUN6QixNQUFNQyxXQUFvQyxFQUFFO0FBQzVDLFFBQUssTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLFFBQVEsVUFBVSxFQUFFO0FBQ3BELFFBQUksT0FBTyxVQUFVLFlBQVksTUFBTSxXQUFXLEtBQUssSUFBSSxNQUFNLFNBQVMsS0FBSyxFQUFFO0tBQy9FLE1BQU0sWUFBWSxNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNO0FBQzNDLFNBQUksRUFBRSxhQUFhLGFBQWE7QUFDOUIsWUFBTSxJQUFJLE1BQ1IsV0FBVyxVQUFVLGtEQUFrRCxJQUFJLElBQzVFOztBQUVILGNBQVMsT0FBTyxXQUFXO1dBQ3RCO0FBQ0wsY0FBUyxPQUFPOzs7QUFHcEIsVUFBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXVCVCxNQUFNLGlCQUNKLFlBQ0EsU0FDZ0M7QUFDaEMsSUFBQyxRQUFRLElBQ1AsUUFBUSxJQUNOLE1BQU0sS0FDSixhQUFhLFdBQVcsZ0NBQWdDLEtBQUssVUFBVTtJQUFFLFVBQVUsUUFBUTtJQUFVLE9BQU8sUUFBUTtJQUFPLGtCQUFrQixRQUFRO0lBQWtCLFVBQVUsUUFBUTtJQUFVLENBQUMsR0FDck0sQ0FDRjtHQUdILE1BQU0sZ0JBQWdCLE1BQU0sS0FBSyxhQUFhLHFCQUFxQixZQUFZLFFBQVE7QUFFdkYsSUFBQyxRQUFRLElBQ1AsUUFBUSxJQUNOLE1BQU0sS0FDSixTQUFTLGNBQWMsS0FBSyxRQUFRLE9BQU8sR0FBRyxXQUFXLGVBQWUsY0FBYyxRQUFRLEtBQUssbUJBQ3BHLENBQ0Y7R0FHSCxNQUFNSCxpQkFBa0MsRUFBRTtHQUcxQyxNQUFNLGFBQWEsS0FBSyxjQUFjLElBQUksV0FBVztBQUNyRCxRQUFLLE1BQU0sVUFBVSxjQUFjLEtBQUssU0FBUztJQUMvQyxNQUFNLFVBQVUsTUFBTSxlQUFlLG9CQUNuQyxZQUNBLFFBQ0E7S0FBRSxLQUFLLEtBQUs7S0FBVSxjQUFjO0tBQU0sQ0FDM0M7QUFDRCxtQkFBZSxLQUFLLEdBQUcsUUFBUTs7QUFJakMsUUFBSyxNQUFNLENBQUMsbUJBQW1CLG1CQUFtQixjQUFjLFFBQVEsU0FBUyxFQUFFO0lBQ2pGLE1BQU0sZ0JBQWdCLEtBQUssY0FBYyxJQUFJLGtCQUFrQjtBQUMvRCxTQUFLLE1BQU0sVUFBVSxnQkFBZ0I7S0FDbkMsTUFBTSxVQUFVLE1BQU0sZUFBZSxvQkFDbkMsZUFDQSxRQUNBO01BQUUsS0FBSyxLQUFLO01BQVUsY0FBYztNQUFNLENBQzNDO0FBQ0Qsb0JBQWUsS0FBSyxHQUFHLFFBQVE7O0FBR2pDLEtBQUMsUUFBUSxJQUNQLFFBQVEsSUFBSSxNQUFNLEtBQUssT0FBTyxrQkFBa0IsSUFBSSxlQUFlLE9BQU8sVUFBVSxDQUFDOztHQUl6RixNQUFNLFVBQVUsTUFBTSxlQUFlLGVBQWUsS0FBSyxjQUFjLGVBQWU7QUFFdEYsSUFBQyxRQUFRLElBQ1AsUUFBUSxJQUNOLE1BQU0sTUFDSix5QkFBeUIsUUFBUSxPQUFPLGNBQWMsS0FBSyxhQUFhLElBQUksY0FBYyxLQUFLLFFBQVEsT0FBTyxHQUFHLFdBQVcsS0FBSyxRQUFRLFNBQVMsY0FBYyxLQUFLLFFBQVEsT0FBTyxXQUNyTCxDQUNGO0FBRUgsVUFBTyJ9