sonamu 0.10.3 → 0.10.4

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.
@@ -12,6 +12,11 @@ function normalizeFuzzyOperator(operator) {
12
12
  if (!fuzzyOperator) throw new Error(`Invalid fuzzy operator: ${operator ?? ""}`);
13
13
  return fuzzyOperator;
14
14
  }
15
+ function serializeJsonSupersetValue(value) {
16
+ const serialized = JSON.stringify(value);
17
+ if (serialized === void 0) throw new TypeError("Puri JSONB containment value must be JSON-serializable; JSON.stringify returned undefined.");
18
+ return serialized;
19
+ }
15
20
  function normalizeOrderByDirection(direction = "asc") {
16
21
  if (direction !== "asc" && direction !== "desc") throw new Error(`Invalid order direction: ${direction}`);
17
22
  return direction;
@@ -437,6 +442,10 @@ var init_puri = __esmMin((() => {
437
442
  this.knexQuery.whereNotIn(column, values);
438
443
  return this;
439
444
  }
445
+ whereJsonSupersetOf(column, value) {
446
+ this.knexQuery.whereJsonSupersetOf(column, serializeJsonSupersetValue(value));
447
+ return this;
448
+ }
440
449
  whereMatch(column, value) {
441
450
  this.knexQuery.whereRaw(`MATCH (${String(column)}) AGAINST (?)`, [value]);
442
451
  return this;
@@ -806,6 +815,14 @@ var init_puri = __esmMin((() => {
806
815
  this.builder.orWhereNotIn(args[0], args[1]);
807
816
  return this;
808
817
  }
818
+ whereJsonSupersetOf(column, value) {
819
+ this.builder.whereJsonSupersetOf(column, serializeJsonSupersetValue(value));
820
+ return this;
821
+ }
822
+ orWhereJsonSupersetOf(column, value) {
823
+ this.builder.orWhereJsonSupersetOf(column, serializeJsonSupersetValue(value));
824
+ return this;
825
+ }
809
826
  whereMatch(...args) {
810
827
  this.builder.whereRaw(`MATCH (${String(args[0])}) AGAINST (?)`, [args[1]]);
811
828
  return this;
@@ -955,4 +972,4 @@ var init_puri = __esmMin((() => {
955
972
  init_puri();
956
973
  export { JoinClauseGroup, Puri, ResolvedPuri, WhereGroup, init_puri };
957
974
 
958
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVyaS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvcHVyaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBveGxpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovIC8vIFB1cmnripQg64uk7JaR7ZWcIO2DgOyeheydhCDsgqzsmqntlZjqs6Ag7J6I7Iq164uI64ukLlxuXG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIFRhYmxlU3BlYyB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyB0eXBlIENsZWFyU3RhdGVtZW50cyB9IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIEF2YWlsYWJsZUNvbHVtbnMsXG4gIHR5cGUgQ29sdW1uS2V5cyxcbiAgdHlwZSBDb21wYXJpc29uT3BlcmF0b3IsXG4gIHR5cGUgRXhwYW5kLFxuICB0eXBlIEV4dHJhY3RDb2x1bW5UeXBlLFxuICB0eXBlIEZ1bGx0ZXh0Q29sdW1ucyxcbiAgdHlwZSBGdXp6eU9wZXJhdG9yLFxuICB0eXBlIEluc2VydERhdGEsXG4gIHR5cGUgSW5zZXJ0UmVzdWx0LFxuICB0eXBlIExlZnRKb2luZWRNYXJrZXIsXG4gIHR5cGUgTGVmdEpvaW5NYXJrZXJGb3IsXG4gIHR5cGUgTnVtZXJpY0NvbHVtbnMsXG4gIHR5cGUgT25Db25mbGljdEFjdGlvbixcbiAgdHlwZSBQYXJzZVNlbGVjdE9iamVjdCxcbiAgdHlwZSBSZXN1bHRBdmFpbGFibGVDb2x1bW5zLFxuICB0eXBlIFNlbGVjdEFsbFJlc3VsdCxcbiAgdHlwZSBTZWxlY3RPYmplY3QsXG4gIHR5cGUgU2luZ2xlVGFibGVWYWx1ZSxcbiAgdHlwZSBTcWxFeHByZXNzaW9uLFxuICB0eXBlIFRzSGlnaGxpZ2h0T3B0aW9ucyxcbiAgdHlwZSBUc1F1ZXJ5Q29uZmlnLFxuICB0eXBlIFRzUXVlcnlPcHRpb25zLFxuICB0eXBlIFRzUmFua09wdGlvbnMsXG4gIHR5cGUgVmVjdG9yQ29sdW1ucyxcbiAgdHlwZSBXaGVyZUNvbmRpdGlvbixcbiAgdHlwZSBXaGVyZU9wZXJhdG9yLFxufSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5pbXBvcnQgeyBGVVpaWV9PUEVSQVRPUlMgfSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5cbnR5cGUgUHVyaU9yZGVyQnlEaXJlY3Rpb24gPSBcImFzY1wiIHwgXCJkZXNjXCI7XG50eXBlIFB1cmlPcmRlckJ5TnVsbHMgPSBcImZpcnN0XCIgfCBcImxhc3RcIjtcbnR5cGUgUHVyaU9yZGVyQnlFeHByZXNzaW9uID0gU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj47XG50eXBlIFB1cmlPcmRlckJ5SXRlbTxUQ29sdW1uIGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgY29sdW1uOiBUQ29sdW1uIHwgUHVyaU9yZGVyQnlFeHByZXNzaW9uO1xuICBvcmRlcj86IFB1cmlPcmRlckJ5RGlyZWN0aW9uO1xuICBudWxscz86IFB1cmlPcmRlckJ5TnVsbHM7XG59O1xudHlwZSBQdXJpT3JkZXJCeUVudHJ5PFRDb2x1bW4gZXh0ZW5kcyBzdHJpbmc+ID1cbiAgfCBUQ29sdW1uXG4gIHwgUHVyaU9yZGVyQnlFeHByZXNzaW9uXG4gIHwgUHVyaU9yZGVyQnlJdGVtPFRDb2x1bW4+O1xudHlwZSBQdXJpT3JkZXJCeVJ1bnRpbWVJdGVtID0ge1xuICBjb2x1bW46IHN0cmluZyB8IFB1cmlPcmRlckJ5RXhwcmVzc2lvbjtcbiAgb3JkZXI/OiBQdXJpT3JkZXJCeURpcmVjdGlvbjtcbiAgbnVsbHM/OiBQdXJpT3JkZXJCeU51bGxzO1xufTtcbnR5cGUgUHVyaU9yZGVyQnlSdW50aW1lRW50cnkgPSBzdHJpbmcgfCBQdXJpT3JkZXJCeUV4cHJlc3Npb24gfCBQdXJpT3JkZXJCeVJ1bnRpbWVJdGVtO1xuXG5mdW5jdGlvbiBub3JtYWxpemVGdXp6eU9wZXJhdG9yKG9wZXJhdG9yPzogc3RyaW5nKTogRnV6enlPcGVyYXRvciB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBvcGVyYXRvcj8udHJpbSgpID8/IFwiPCVcIjtcbiAgY29uc3QgZnV6enlPcGVyYXRvciA9IEZVWlpZX09QRVJBVE9SUy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZSA9PT0gbm9ybWFsaXplZCk7XG5cbiAgaWYgKCFmdXp6eU9wZXJhdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZ1enp5IG9wZXJhdG9yOiAke29wZXJhdG9yID8/IFwiXCJ9YCk7XG4gIH1cblxuICByZXR1cm4gZnV6enlPcGVyYXRvcjtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplT3JkZXJCeURpcmVjdGlvbihkaXJlY3Rpb246IFB1cmlPcmRlckJ5RGlyZWN0aW9uID0gXCJhc2NcIik6IFB1cmlPcmRlckJ5RGlyZWN0aW9uIHtcbiAgaWYgKGRpcmVjdGlvbiAhPT0gXCJhc2NcIiAmJiBkaXJlY3Rpb24gIT09IFwiZGVzY1wiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9yZGVyIGRpcmVjdGlvbjogJHtkaXJlY3Rpb259YCk7XG4gIH1cblxuICByZXR1cm4gZGlyZWN0aW9uO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVPcmRlckJ5TnVsbHMobnVsbHM/OiBQdXJpT3JkZXJCeU51bGxzKTogUHVyaU9yZGVyQnlOdWxscyB8IHVuZGVmaW5lZCB7XG4gIGlmIChudWxscyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChudWxscyAhPT0gXCJmaXJzdFwiICYmIG51bGxzICE9PSBcImxhc3RcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvcmRlciBudWxsczogJHtudWxsc31gKTtcbiAgfVxuXG4gIHJldHVybiBudWxscztcbn1cblxuZnVuY3Rpb24gZm9ybWF0TnVsbHNTdWZmaXgobnVsbHM/OiBQdXJpT3JkZXJCeU51bGxzKTogc3RyaW5nIHtcbiAgaWYgKCFudWxscykge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgcmV0dXJuIGAgTlVMTFMgJHtudWxscy50b1VwcGVyQ2FzZSgpfWA7XG59XG5cbmZ1bmN0aW9uIGlzT3JkZXJCeUVudHJpZXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyByZWFkb25seSBQdXJpT3JkZXJCeVJ1bnRpbWVFbnRyeVtdIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBpc1NxbEV4cHJlc3Npb24odmFsdWU6IFB1cmlPcmRlckJ5UnVudGltZUVudHJ5KTogdmFsdWUgaXMgUHVyaU9yZGVyQnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBcIl90eXBlXCIgaW4gdmFsdWUgJiYgdmFsdWUuX3R5cGUgPT09IFwic3FsX2V4cHJlc3Npb25cIjtcbn1cblxuZXhwb3J0IGNsYXNzIFB1cmk8VFNjaGVtYSwgVFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sIFRSZXN1bHQ+IHtcbiAgcHJpdmF0ZSBrbmV4UXVlcnk6IEtuZXguUXVlcnlCdWlsZGVyO1xuICBwcml2YXRlIHRhYmxlU3BlYzogVGFibGVTcGVjIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8g7IOd7ISx7J6QIOyLnOq3uOuLiOyymOuTpFxuICBjb25zdHJ1Y3RvcihrbmV4OiBLbmV4LCB0YWJsZU5hbWU6IHN0cmluZyk7XG4gIGNvbnN0cnVjdG9yKGtuZXg6IEtuZXgsIHRhYmxlU291cmNlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBQdXJpPFRTY2hlbWEsIGFueSwgYW55Pj4pO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMga25leDogS25leCxcbiAgICB0YWJsZU5hbWVPclNvdXJjZTogYW55LFxuICApIHtcbiAgICBpZiAodHlwZW9mIHRhYmxlTmFtZU9yU291cmNlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAvLyBDYXNlOiBuZXcgUHVyaShrbmV4LCBcInVzZXJzXCIpXG4gICAgICB0aGlzLmtuZXhRdWVyeSA9IHRoaXMua25leCh0YWJsZU5hbWVPclNvdXJjZSkuZnJvbSh0YWJsZU5hbWVPclNvdXJjZSk7XG4gICAgICB0aGlzLnRhYmxlU3BlYyA9IHRoaXMuc2FmZUdldFRhYmxlU3BlYyh0YWJsZU5hbWVPclNvdXJjZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGFibGVOYW1lT3JTb3VyY2UgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh0YWJsZU5hbWVPclNvdXJjZSk7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGFibGUgc3BlYyBtdXN0IGhhdmUgZXhhY3RseSBvbmUgZW50cnlcIik7XG4gICAgICB9XG4gICAgICBhc3NlcnQoZW50cmllc1swXSk7XG4gICAgICBjb25zdCBbYWxpYXMsIHNvdXJjZV0gPSBlbnRyaWVzWzBdO1xuICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXgoc291cmNlKS5mcm9tKHsgW2FsaWFzXTogc291cmNlIH0pO1xuICAgICAgICB0aGlzLnRhYmxlU3BlYyA9IHRoaXMuc2FmZUdldFRhYmxlU3BlYyhzb3VyY2UpO1xuICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBQdXJpKSB7XG4gICAgICAgIGNvbnN0IHN1YnF1ZXJ5QnVpbGRlciA9IHNvdXJjZS5yYXdRdWVyeSgpO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeSA9IHRoaXMua25leC5mcm9tKHN1YnF1ZXJ5QnVpbGRlci5hcyhhbGlhcykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0YWJsZSBzcGVjaWZpY2F0aW9uXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHRhYmxlIHNwZWNpZmljYXRpb25cIik7XG4gICAgfVxuICB9XG5cbiAgc2FmZUdldFRhYmxlU3BlYyh0YWJsZU5hbWU6IHN0cmluZyk6IFRhYmxlU3BlYyB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRUYWJsZVNwZWModGFibGVOYW1lKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXRpYyBTUUwgaGVscGVyIGZ1bmN0aW9ucyBmb3IgU0VMRUNUXG4gIHN0YXRpYyBjb3VudChjb2x1bW46IHN0cmluZyA9IFwiKlwiKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYENPVU5UKD8/KTo6aW50ZWdlcmAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBzdW0oY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgU1VNKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBhdmcoY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgQVZHKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBtYXgoY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgTUFYKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBtaW4oY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgTUlOKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBjb25jYXQoLi4uYXJnczogc3RyaW5nW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBgQ09OQ0FUKCR7YXJncy5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgIF9wYXJhbXM6IGFyZ3MsXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgdXBwZXIoY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBcIlVQUEVSKD8/KVwiLFxuICAgICAgX3BhcmFtczogW2NvbHVtbl0sXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgbG93ZXIoY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBcIkxPV0VSKD8/KVwiLFxuICAgICAgX3BhcmFtczogW2NvbHVtbl0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyB3b3JkU2ltaWxhcml0eShcbiAgICBjb2x1bW46IHN0cmluZyB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4sXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW4gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICAgIF9zcWw6IFwid29yZF9zaW1pbGFyaXR5KD8sID8/KVwiLFxuICAgICAgICBfcGFyYW1zOiBbcXVlcnksIGNvbHVtbl0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGB3b3JkX3NpbWlsYXJpdHkoPywgJHtjb2x1bW4uX3NxbH0pYCxcbiAgICAgIF9wYXJhbXM6IFtxdWVyeSwgLi4uY29sdW1uLl9wYXJhbXNdLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgc2ltaWxhcml0eShcbiAgICBjb2x1bW46IHN0cmluZyB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4sXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW4gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICAgIF9zcWw6IFwic2ltaWxhcml0eSg/PywgPylcIixcbiAgICAgICAgX3BhcmFtczogW2NvbHVtbiwgcXVlcnldLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgc2ltaWxhcml0eSgke2NvbHVtbi5fc3FsfSwgPylgLFxuICAgICAgX3BhcmFtczogWy4uLmNvbHVtbi5fcGFyYW1zLCBxdWVyeV0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBzdHJpY3RXb3JkU2ltaWxhcml0eShcbiAgICBjb2x1bW46IHN0cmluZyB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4sXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW4gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICAgIF9zcWw6IGBzdHJpY3Rfd29yZF9zaW1pbGFyaXR5KD8sID8/KWAsXG4gICAgICAgIF9wYXJhbXM6IFtxdWVyeSwgY29sdW1uXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYHN0cmljdF93b3JkX3NpbWlsYXJpdHkoPywgJHtjb2x1bW4uX3NxbH0pYCxcbiAgICAgIF9wYXJhbXM6IFtxdWVyeSwgLi4uY29sdW1uLl9wYXJhbXNdLFxuICAgIH07XG4gIH1cblxuICAvLyBSYXcgZnVuY3Rpb25zIGZvciBTRUxFQ1RcbiAgc3RhdGljIHJhd1N0cmluZyhzcWw6IHN0cmluZywgcGFyYW1zOiBLbmV4LlJhd0JpbmRpbmdbXSA9IFtdKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJzdHJpbmdcIiwgX3NxbDogc3FsLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIHN0YXRpYyByYXdTdHJpbmdBcnJheShzcWw6IHN0cmluZywgcGFyYW1zOiBLbmV4LlJhd0JpbmRpbmdbXSA9IFtdKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1tdXCI+IHtcbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcInN0cmluZ1tdXCIsIF9zcWw6IHNxbCwgX3BhcmFtczogcGFyYW1zIH07XG4gIH1cblxuICBzdGF0aWMgcmF3TnVtYmVyKHNxbDogc3RyaW5nLCBwYXJhbXM6IEtuZXguUmF3QmluZGluZ1tdID0gW10pOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcIm51bWJlclwiLCBfc3FsOiBzcWwsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgc3RhdGljIHJhd0Jvb2xlYW4oc3FsOiBzdHJpbmcsIHBhcmFtczogS25leC5SYXdCaW5kaW5nW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJib29sZWFuXCI+IHtcbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcImJvb2xlYW5cIiwgX3NxbDogc3FsLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIHN0YXRpYyByYXdEYXRlKHNxbDogc3RyaW5nLCBwYXJhbXM6IEtuZXguUmF3QmluZGluZ1tdID0gW10pOiBTcWxFeHByZXNzaW9uPFwiZGF0ZVwiPiB7XG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJkYXRlXCIsIF9zcWw6IHNxbCwgX3BhcmFtczogcGFyYW1zIH07XG4gIH1cblxuICAvKipcbiAgICogRlRTIOqygOyDieyWtCDtlZjsnbTrnbzsnbTtjIVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLnNlbGVjdCh7XG4gICAqICAgdGl0bGU6IFB1cmkuaGlnaGxpZ2h0KFwicG9zdHMudGl0bGVcIiwgc2VhcmNoKSxcbiAgICogICBjb250ZW50OiBQdXJpLmhpZ2hsaWdodChcInBvc3RzLmNvbnRlbnRcIiwgc2VhcmNoLCB7XG4gICAqICAgICBzdGFydFNlbDogXCI8bWFyaz5cIixcbiAgICogICAgIHN0b3BTZWw6IFwiPC9tYXJrPlwiLFxuICAgKiAgICAgbWF4RnJhZ21lbnRzOiAzLFxuICAgKiAgIH0pLFxuICAgKiB9KVxuICAgKi9cbiAgc3RhdGljIHRzSGlnaGxpZ2h0KFxuICAgIGNvbHVtbjogc3RyaW5nLFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgX29wdGlvbnM/OiBUc0hpZ2hsaWdodE9wdGlvbnMsXG4gICk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIGNvbnN0IHsgcGFyc2VyID0gXCJ3ZWJzZWFyY2hfdG9fdHNxdWVyeVwiLCBjb25maWcgPSBcInNpbXBsZVwiLCAuLi5vcHRpb25zIH0gPSBfb3B0aW9ucyA/PyB7fTtcblxuICAgIGNvbnN0IGhsT3B0aW9uUGFydHMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgcmV0dXJuIGAke2luZmxlY3Rpb24uY2FtZWxpemUoa2V5KX09JHt2YWx1ZX1gO1xuICAgIH0pO1xuXG4gICAgY29uc3QgaGxPcHRpb25zID0gaGxPcHRpb25QYXJ0cy5sZW5ndGggPiAwID8gYCwgJyR7aGxPcHRpb25QYXJ0cy5qb2luKFwiLCBcIil9J2AgOiBcIlwiO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogYHRzX2hlYWRsaW5lKD8sID8/LCAke3BhcnNlcn0oPywgPykke2hsT3B0aW9uc30pYCxcbiAgICAgIF9wYXJhbXM6IFtjb25maWcsIGNvbHVtbiwgY29uZmlnLCBxdWVyeV0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIHRzX3JhbmtcbiAgc3RhdGljIHRzUmFuayhcbiAgICBjb2x1bW46IHN0cmluZyB8IFNxbEV4cHJlc3Npb248XCJ0c3ZlY3RvclwiPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUc1JhbmtPcHRpb25zLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4gUHVyaS5fdHNSYW5rKFwidHNfcmFua1wiLCBjb2x1bW4sIHF1ZXJ5LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIHRzX3JhbmtfY2RcbiAgc3RhdGljIHRzUmFua0NkKFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3FsRXhwcmVzc2lvbjxcInRzdmVjdG9yXCI+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFRzUmFua09wdGlvbnMsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiBQdXJpLl90c1JhbmsoXCJ0c19yYW5rX2NkXCIsIGNvbHVtbiwgcXVlcnksIG9wdGlvbnMpO1xuICB9XG5cbiAgc3RhdGljIHRvVHNWZWN0b3IoY29sdW1uOiBzdHJpbmcsIGNvbmZpZzogc3RyaW5nID0gXCJzaW1wbGVcIik6IFNxbEV4cHJlc3Npb248XCJ0c3ZlY3RvclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInRzdmVjdG9yXCIsXG4gICAgICBfc3FsOiBgdG9fdHN2ZWN0b3IoPywgPz8pYCxcbiAgICAgIF9wYXJhbXM6IFtjb25maWcsIGNvbHVtbl0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBfdHNSYW5rKFxuICAgIHR5cGU6IFwidHNfcmFua1wiIHwgXCJ0c19yYW5rX2NkXCIsXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTcWxFeHByZXNzaW9uPFwidHN2ZWN0b3JcIj4sXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNSYW5rT3B0aW9ucyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgY29uc3Qge1xuICAgICAgcGFyc2VyID0gXCJ3ZWJzZWFyY2hfdG9fdHNxdWVyeVwiLFxuICAgICAgY29uZmlnID0gXCJzaW1wbGVcIixcbiAgICAgIG5vcm1hbGl6YXRpb24sXG4gICAgICB3ZWlnaHRzLFxuICAgIH0gPSBvcHRpb25zID8/IHt9O1xuXG4gICAgY29uc3QgcGFyYW1zID0gW107XG4gICAgbGV0IHNxbFRlbXBsYXRlID0gYCR7dHlwZX0oYDtcblxuICAgIGlmICh3ZWlnaHRzKSB7XG4gICAgICBzcWxUZW1wbGF0ZSArPSBgQVJSQVlbJHt3ZWlnaHRzLm1hcCgoKSA9PiBcIj9cIikuam9pbihcIiwgXCIpfV06OmZsb2F0NFtdLCBgO1xuICAgICAgcGFyYW1zLnB1c2goLi4ud2VpZ2h0cyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb2x1bW4gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHNxbFRlbXBsYXRlICs9IGA/PywgJHtwYXJzZXJ9KD8sID8pYDtcbiAgICAgIHBhcmFtcy5wdXNoKGNvbHVtbiwgY29uZmlnLCBxdWVyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNxbFRlbXBsYXRlICs9IGAke2NvbHVtbi5fc3FsfSwgJHtwYXJzZXJ9KD8sID8pYDtcbiAgICAgIHBhcmFtcy5wdXNoKC4uLmNvbHVtbi5fcGFyYW1zLCBjb25maWcsIHF1ZXJ5KTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXphdGlvbikge1xuICAgICAgc3FsVGVtcGxhdGUgKz0gXCIsID9cIjtcbiAgICAgIHBhcmFtcy5wdXNoKG5vcm1hbGl6YXRpb24pO1xuICAgIH1cblxuICAgIHNxbFRlbXBsYXRlICs9IFwiKVwiO1xuXG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJudW1iZXJcIiwgX3NxbDogc3FsVGVtcGxhdGUsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBHcm9vbmdhIEZ1bGxUZXh0IOyduOuNseyKpCDqsoDsg4kg7KCQ7IiYXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC5zZWxlY3Qoe1xuICAgKiAgIHNjb3JlOiBQdXJpLnNjb3JlKCksXG4gICAqIH0pXG4gICAqL1xuICBzdGF0aWMgc2NvcmUoKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIFB1cmkucmF3TnVtYmVyKFwicGdyb29uZ2Ffc2NvcmUodGFibGVvaWQsIGN0aWQpXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBHcm9vbmdhIEZ1bGxUZXh0IOyduOuNseyKpCDqsoDsg4kg7ZWY7J2065287J207YyFXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC5zZWxlY3Qoe1xuICAgKiAgIHRpdGxlOiBQdXJpLmhpZ2hsaWdodChcInBvc3RzLnRpdGxlXCIsIHNlYXJjaCksXG4gICAqIH0pXG4gICAqL1xuICBzdGF0aWMgaGlnaGxpZ2h0KGNvbHVtbjogc3RyaW5nLCBxdWVyeTogc3RyaW5nIHwgc3RyaW5nW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+O1xuICBzdGF0aWMgaGlnaGxpZ2h0KGNvbHVtbnM6IHN0cmluZ1tdLCBxdWVyeTogc3RyaW5nIHwgc3RyaW5nW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nW11cIj47XG5cbiAgc3RhdGljIGhpZ2hsaWdodChcbiAgICBjb2x1bW5PckNvbHVtbnM6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIHF1ZXJ5OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdbXVwiPiB7XG4gICAgY29uc3QgcXVlcnlBcnIgPSBBcnJheS5pc0FycmF5KHF1ZXJ5KSA/IHF1ZXJ5IDogW3F1ZXJ5XTtcbiAgICBjb25zdCBxdWVyeUNsYXVzZSA9IGBBUlJBWVske3F1ZXJ5QXJyLm1hcCgoKSA9PiBcIj9cIikuam9pbihcIiwgXCIpfV1gO1xuXG4gICAgLy8g64uo7J28IOy7rOufvOyduCDqsr3smrBcbiAgICBpZiAodHlwZW9mIGNvbHVtbk9yQ29sdW1ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFB1cmkucmF3U3RyaW5nKGBwZ3Jvb25nYV9oaWdobGlnaHRfaHRtbCg/PywgJHtxdWVyeUNsYXVzZX0pYCwgW1xuICAgICAgICBjb2x1bW5PckNvbHVtbnMsXG4gICAgICAgIC4uLnF1ZXJ5QXJyLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgLy8g7Lus65+8IOuwsOyXtOyduCDqsr3smrBcbiAgICByZXR1cm4gUHVyaS5yYXdTdHJpbmdBcnJheShcbiAgICAgIGBwZ3Jvb25nYV9oaWdobGlnaHRfaHRtbChBUlJBWVske2NvbHVtbk9yQ29sdW1ucy5tYXAoKCkgPT4gXCI/P1wiKS5qb2luKFwiLCBcIil9XSwgJHtxdWVyeUNsYXVzZX0pYCxcbiAgICAgIFsuLi5jb2x1bW5PckNvbHVtbnMsIC4uLnF1ZXJ5QXJyXSxcbiAgICApO1xuICB9XG5cbiAgLy8gU0VMRUNUIChvdmVyd3JpdGUpXG4gIHNlbGVjdDxUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+PihcbiAgICBzZWxlY3RPYmo6IFRTZWxlY3QsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgUGFyc2VTZWxlY3RPYmplY3Q8VFRhYmxlcywgVFNlbGVjdD4+IHtcbiAgICAvLyDspJHssqkg6rCd7LK066W8IGZsYXTtlZjqsowg67OA7ZmYXG4gICAgY29uc3QgZmxhdFNlbGVjdCA9IHRoaXMuZmxhdHRlblNlbGVjdChzZWxlY3RPYmopO1xuXG4gICAgY29uc3Qgc2VsZWN0Q2xhdXNlczogKHN0cmluZyB8IEtuZXguUmF3KVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFthbGlhcywgY29sdW1uT3JGdW5jdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoZmxhdFNlbGVjdCkpIHtcbiAgICAgIGlmICh0eXBlb2YgY29sdW1uT3JGdW5jdGlvbiA9PT0gXCJvYmplY3RcIiAmJiBjb2x1bW5PckZ1bmN0aW9uLl90eXBlID09PSBcInNxbF9leHByZXNzaW9uXCIpIHtcbiAgICAgICAgLy8gU1FMIO2VqOyImOyduCDqsr3smrBcbiAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKFxuICAgICAgICAgIHRoaXMua25leC5yYXcoYCR7Y29sdW1uT3JGdW5jdGlvbi5fc3FsfSBBUyBcIiR7YWxpYXN9XCJgLCBjb2x1bW5PckZ1bmN0aW9uLl9wYXJhbXMpLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7J2867CYIOy7rOufvOyduCDqsr3smrBcbiAgICAgICAgY29uc3QgY29sdW1uUGF0aCA9IGNvbHVtbk9yRnVuY3Rpb24gYXMgc3RyaW5nO1xuICAgICAgICBpZiAoYWxpYXMgPT09IGNvbHVtblBhdGgpIHtcbiAgICAgICAgICAvLyBhbGlhc+yZgCDsu6zrn7zrqoXsnbQg6rCZ7Jy866m0IGFsaWFzIOyDneuetVxuICAgICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChjb2x1bW5QYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBhbGlhcyDsp4DsoJVcbiAgICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goYCR7Y29sdW1uUGF0aH0gQVMgJHthbGlhc31gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdChzZWxlY3RDbGF1c2VzKTtcbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICog7KSR7LKpIOqwneyytOulvCBmbGF0IOqwneyytOuhnCDrs4DtmZhcbiAgICog7JiIOiB7IHBhcmVudDogeyBpZDogXCJwYXJlbnQuaWRcIiwgbmFtZTogXCJwYXJlbnQubmFtZVwiIH0gfVxuICAgKiAgIOKGkiB7IHBhcmVudF9faWQ6IFwicGFyZW50LmlkXCIsIHBhcmVudF9fbmFtZTogXCJwYXJlbnQubmFtZVwiIH1cbiAgICovXG4gIHByaXZhdGUgZmxhdHRlblNlbGVjdChzZWxlY3RPYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sIHByZWZpeCA9IFwiXCIpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCBmbGF0U2VsZWN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZWxlY3RPYmopKSB7XG4gICAgICBjb25zdCBmdWxsS2V5ID0gcHJlZml4ID8gYCR7cHJlZml4fV9fJHtrZXl9YCA6IGtleTtcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhKFwiX3R5cGVcIiBpbiB2YWx1ZSkpIHtcbiAgICAgICAgLy8g7KSR7LKpIOqwneyytOyduCDqsr3smrAgLSDsnqzqt4Ag7LKY66asXG4gICAgICAgIGNvbnN0IG5lc3RlZCA9IHRoaXMuZmxhdHRlblNlbGVjdCh2YWx1ZSwgZnVsbEtleSk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZmxhdFNlbGVjdCwgbmVzdGVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOydvOuwmCDqsJLsnbgg6rK97JqwICjsu6zrn7wg6rK966GcIOuYkOuKlCBTcWxFeHByZXNzaW9uKVxuICAgICAgICBmbGF0U2VsZWN0W2Z1bGxLZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZsYXRTZWxlY3Q7XG4gIH1cblxuICAvLyBTRUxFQ1QgKHNlbGVjdOuKlCBvdmVyd3JpdGUsIGFwcGVuZFNlbGVjdOuKlCBhcHBlbmQpXG4gIGFwcGVuZFNlbGVjdDxUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+PihcbiAgICBzZWxlY3RPYmo6IFRTZWxlY3QsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdCAmIFBhcnNlU2VsZWN0T2JqZWN0PFRUYWJsZXMsIFRTZWxlY3Q+PiB7XG4gICAgLy8g7KSR7LKpIOqwneyytOulvCBmbGF07ZWY6rKMIOuzgO2ZmFxuICAgIGNvbnN0IGZsYXRTZWxlY3QgPSB0aGlzLmZsYXR0ZW5TZWxlY3Qoc2VsZWN0T2JqKTtcblxuICAgIGNvbnN0IHNlbGVjdENsYXVzZXM6IChzdHJpbmcgfCBLbmV4LlJhdylbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbYWxpYXMsIGNvbHVtbk9yRnVuY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKGZsYXRTZWxlY3QpKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbHVtbk9yRnVuY3Rpb24gPT09IFwib2JqZWN0XCIgJiYgY29sdW1uT3JGdW5jdGlvbi5fdHlwZSA9PT0gXCJzcWxfZXhwcmVzc2lvblwiKSB7XG4gICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChcbiAgICAgICAgICB0aGlzLmtuZXgucmF3KGAke2NvbHVtbk9yRnVuY3Rpb24uX3NxbH0gQVMgJHthbGlhc31gLCBjb2x1bW5PckZ1bmN0aW9uLl9wYXJhbXMpLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29sdW1uUGF0aCA9IGNvbHVtbk9yRnVuY3Rpb24gYXMgc3RyaW5nO1xuICAgICAgICBpZiAoYWxpYXMgPT09IGNvbHVtblBhdGgpIHtcbiAgICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goY29sdW1uUGF0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKHRoaXMua25leC5yZWYoY29sdW1uUGF0aCkuYXMoYWxpYXMpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdChzZWxlY3RDbGF1c2VzKTtcbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBTRUxFQ1QgKlxuICBzZWxlY3RBbGwoKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBTZWxlY3RBbGxSZXN1bHQ8VFRhYmxlcz4+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3QoXCIqXCIpO1xuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8vIERJU1RJTkNUXG4gIGRpc3RpbmN0PFRDb2x1bW5zIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oLi4uY29sdW1uczogVENvbHVtbnNbXSk6IHRoaXM7XG4gIGRpc3RpbmN0KC4uLmNvbHVtbnM6IHN0cmluZ1tdKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkuZGlzdGluY3QoLi4uY29sdW1ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBDTEVBUlxuICBjbGVhcihzdGF0ZW1lbnQ6IENsZWFyU3RhdGVtZW50cyk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LmNsZWFyKHN0YXRlbWVudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBrbmV47JeQIOyXhuyWtOyEnCDsp4HsoJEg6rWs7ZiE7ZWoXG4gIGNsZWFySm9pbihhbGlhczogc3RyaW5nKTogdGhpcyB7XG4gICAgKHRoaXMua25leFF1ZXJ5IGFzIGFueSkuX3N0YXRlbWVudHMgPSAodGhpcy5rbmV4UXVlcnkgYXMgYW55KS5fc3RhdGVtZW50cy5maWx0ZXIoKHM6IGFueSkgPT4ge1xuICAgICAgaWYgKFwiam9pblR5cGVcIiBpbiBzKSB7XG4gICAgICAgIGNvbnN0IFtfYWxpYXMsIF90YWJsZV0gPSBPYmplY3QuZW50cmllcyhzLnRhYmxlKVswXTtcbiAgICAgICAgcmV0dXJuIF9hbGlhcyAhPT0gYWxpYXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzXG4gIGpvaW48VEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZywgVFN1YlJlc3VsdD4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD4gfSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pbkFsaWFzfS4ke0NvbHVtbktleXM8VFN1YlJlc3VsdD59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdD4sIC8vIOyEnOu4jOy/vOumrOydmCBUUmVzdWx0XG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBKT0lOOiDthYzsnbTruJQgKyBBbGlhc1xuICBqb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLCBUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nPihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFRKb2luVGFibGUgfSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pbkFsaWFzfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXT4sIC8vIFRUYWJsZXMg7ZmV7J6lIVxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gSk9JTjog7YWM7J2067iU66qFXG4gIGpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pblRhYmxlICYgc3RyaW5nfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4sIC8vIO2FjOydtOu4lOuqheydtCDtgqRcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzICsg7L2c67CxXG4gIGpvaW48VEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZywgVFN1YlJlc3VsdD4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD4gfSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdD4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdD4sIFRSZXN1bHQ+O1xuICAvLyBKT0lOOiDthYzsnbTruJQgKyBBbGlhcyArIOy9nOuwsVxuICBqb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLCBUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nPihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFRKb2luVGFibGUgfSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXT4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXT4sIFRSZXN1bHQ+O1xuICAvLyBKT0lOOiDthYzsnbTruJTrqoUgKyDsvZzrsLFcbiAgam9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYT4oXG4gICAgdGFibGVOYW1lOiBUSm9pblRhYmxlLFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdPj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgVFJlc3VsdD47XG4gIC8vIEpPSU4g7Iuk7KCcIOq1rO2YhFxuICBqb2luKHRhYmxlTmFtZU9yU3BlYzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX19jb21tb25Kb2luKFwiam9pblwiLCB0YWJsZU5hbWVPclNwZWMsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLy8gTEVGVCBKT0lOOiDshJzruIzsv7zrpqwgKyBBbGlhc1xuICBsZWZ0Sm9pbjxUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLCBUU3ViUmVzdWx0PihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFB1cmk8VFNjaGVtYSwgYW55LCBUU3ViUmVzdWx0PiB9LFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU3ViUmVzdWx0Pn1gLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdCAmIExlZnRKb2luZWRNYXJrZXI+LCBUUmVzdWx0PjsgLy8g7ISc67iM7L+866as7J2YIFRSZXN1bHRcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJQgKyBBbGlhc1xuICAvLyBGSyBudWxsYWJsZSDsl6zrtoDsl5Ag65Sw6528IOyekOuPmeycvOuhnCBMZWZ0Sm9pbmVkTWFya2VyIOqysOyglVxuICBsZWZ0Sm9pbjxcbiAgICBUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSxcbiAgICBUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLFxuICAgIFRMZWZ0IGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgPihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFRKb2luVGFibGUgfSxcbiAgICBsZWZ0OiBUTGVmdCxcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBMZWZ0Sm9pbk1hcmtlckZvcjxUVGFibGVzLCBUTGVmdD4+LFxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJTrqoVcbiAgbGVmdEpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRMZWZ0IGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgdGFibGVOYW1lOiBUSm9pblRhYmxlLFxuICAgIGxlZnQ6IFRMZWZ0LFxuICAgIHJpZ2h0OiBgJHtUSm9pblRhYmxlICYgc3RyaW5nfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXSAmIExlZnRKb2luTWFya2VyRm9yPFRUYWJsZXMsIFRMZWZ0Pj4sXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBMRUZUIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzICsg7L2c67CxXG4gIGxlZnRKb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQgJiBMZWZ0Sm9pbmVkTWFya2VyPiwgVFJlc3VsdD47XG4gIC8vIExFRlQgSk9JTjog7YWM7J2067iUICsgQWxpYXMgKyDsvZzrsLFcbiAgbGVmdEpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdPj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5lZE1hcmtlcj4sIFRSZXN1bHQ+O1xuICAvLyBMRUZUIEpPSU46IO2FjOydtOu4lOuqhSArIOy9nOuwsVxuICBsZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYT4oXG4gICAgdGFibGVOYW1lOiBUSm9pblRhYmxlLFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdPj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5lZE1hcmtlcj4sIFRSZXN1bHQ+O1xuICAvLyBMRUZUIEpPSU4g7Iuk7KCcIOq1rO2YhFxuICBsZWZ0Sm9pbih0YWJsZU5hbWVPclNwZWM6IGFueSwgLi4uYXJnczogYW55W10pOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9fY29tbW9uSm9pbihcImxlZnRKb2luXCIsIHRhYmxlTmFtZU9yU3BlYywgLi4uYXJncyk7XG4gIH1cblxuICBfX2NvbW1vbkpvaW4oam9pblR5cGU6IFwiam9pblwiIHwgXCJsZWZ0Sm9pblwiLCB0YWJsZU5hbWVPclNwZWM6IGFueSwgLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBpZiAodHlwZW9mIHRhYmxlTmFtZU9yU3BlYyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgLy8gQ2FzZSAxOiBqb2luKFwicG9zdHNcIiwgLi4uKVxuICAgICAgY29uc3QgdGFibGVOYW1lID0gdGFibGVOYW1lT3JTcGVjO1xuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAvLyBqb2luKFwicG9zdHNcIiwgY2FsbGJhY2spXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gYXJnc1swXTtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHRhYmxlTmFtZSwgKGpvaW5DbGF1c2UpID0+IHtcbiAgICAgICAgICBjYWxsYmFjayhuZXcgSm9pbkNsYXVzZUdyb3VwKGpvaW5DbGF1c2UpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBqb2luKFwicG9zdHNcIiwgbGVmdCwgcmlnaHQpXG4gICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodF0gPSBhcmdzO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0odGFibGVOYW1lLCBsZWZ0LCByaWdodCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGFibGVOYW1lT3JTcGVjID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAvLyBDYXNlIDI6IGpvaW4oeyBhbGlhczogXCJ0YWJsZVwiIH0sIC4uLikgb3Igam9pbih7IGFsaWFzOiBzdWJxdWVyeSB9LCAuLi4pXG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFibGVOYW1lT3JTcGVjKTtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUYWJsZSBzcGVjIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBlbnRyeVwiKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChlbnRyaWVzWzBdKTtcbiAgICAgIGNvbnN0IFtbYWxpYXMsIHNwZWNdXSA9IGVudHJpZXM7XG5cbiAgICAgIGlmICh0eXBlb2Ygc3BlYyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAvLyDthYzsnbTruJQ6IGpvaW4oeyBwOiBcInBvc3RzXCIgfSwgLi4uKVxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIENhbGxiYWNrXG4gICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzWzBdO1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXSh7IFthbGlhc106IHNwZWMgfSwgKGpvaW5DbGF1c2UpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBKb2luQ2xhdXNlR3JvdXAoam9pbkNsYXVzZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNpbXBsZVxuICAgICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodF0gPSBhcmdzO1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXSh7IFthbGlhc106IHNwZWMgfSwgbGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNwZWMgaW5zdGFuY2VvZiBQdXJpKSB7XG4gICAgICAgIC8vIOyEnOu4jOy/vOumrDogam9pbih7IHNxOiBzdWJxdWVyeSB9LCAuLi4pXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gQ2FsbGJhY2tcbiAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHNwZWMucmF3UXVlcnkoKS5hcyhhbGlhcyksIChqb2luQ2xhdXNlKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgSm9pbkNsYXVzZUdyb3VwKGpvaW5DbGF1c2UpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTaW1wbGVcbiAgICAgICAgICBjb25zdCBbbGVmdCwgcmlnaHRdID0gYXJncztcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0oc3BlYy5yYXdRdWVyeSgpLmFzKGFsaWFzKSwgbGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHRhYmxlIHNwZWNpZmljYXRpb25cIik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkU6IOqwneyytCAtIOyCrOyaqTogLndoZXJlKHsgXCJ1LmlkXCI6IDEsIFwidS5zdGF0dXNcIjogXCJhY3RpdmVcIiB9KVxuICB3aGVyZShjb25kaXRpb25zOiBXaGVyZUNvbmRpdGlvbjxUVGFibGVzPik6IHRoaXM7XG4gIC8vIFdIRVJFOiDsu6zrn7wgLSDsgqzsmqk6IC53aGVyZShcInUuaWRcIiwgMSksIC53aGVyZShcInUuaWRcIiwgbnVsbClcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIFdIRVJFOiDsu6zrn7wgLSDsgqzsmqk6IC53aGVyZShcInUuaWRcIiwgXCI+XCIsIDEwKSwgLndoZXJlKFwidS5pZFwiLCBcIiE9XCIsIG51bGwpXG4gIHdoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgb3BlcmF0b3I6IFdoZXJlT3BlcmF0b3IsXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBXSEVSRTogU1FMIO2RnO2YhOyLnSAtIOyCrOyaqTogLndoZXJlKHB1cmkucmF3KFwiQ09OQ0FUKHUubmFtZSwgdS5lbWFpbClcIiksIFwibGlrZVwiLCBcIiV0ZXN0JVwiKVxuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgS25leC5SYXc+KGNvbHVtbjogVENvbHVtbiwgb3BlcmF0b3I6IFdoZXJlT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICAvLyBXSEVSRTog7Lus65+8IC0g7IKs7JqpOiAud2hlcmUoXCJ1LmlkXCIsIFwibGlrZVwiLCBcIiV0ZXN0JVwiKVxuICB3aGVyZSguLi5hcmdzOiBbY29sdW1uT3JDb25kaXRpb25zOiBhbnksIG9wZXJhdG9yT3JWYWx1ZT86IGFueSwgdmFsdWU/OiBhbnldKTogdGhpcyB7XG4gICAgY29uc3QgW2NvbHVtbk9yQ29uZGl0aW9ucywgb3BlcmF0b3JPclZhbHVlLCB2YWx1ZV0gPSBhcmdzO1xuICAgIGlmICh0eXBlb2YgY29sdW1uT3JDb25kaXRpb25zID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAob3BlcmF0b3JPclZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTnVsbChjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKGNvbHVtbk9yQ29uZGl0aW9ucywgb3BlcmF0b3JPclZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIGlmIChvcGVyYXRvck9yVmFsdWUgPT09IFwiIT1cIikge1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTm90TnVsbChjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdG9yT3JWYWx1ZSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU51bGwoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmUoY29sdW1uT3JDb25kaXRpb25zLCBvcGVyYXRvck9yVmFsdWUsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmUoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBJTlxuICB3aGVyZUluPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWVzOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPltdLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFRSZXN1bHQ+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZUluKGNvbHVtbiwgdmFsdWVzKTtcbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBXSEVSRSBOT1QgSU5cbiAgd2hlcmVOb3RJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0PiB7XG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVOb3RJbihjb2x1bW4sIHZhbHVlcyk7XG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8gV0hFUkUgTUFUQ0hcbiAgd2hlcmVNYXRjaDxUQ29sdW1uIGV4dGVuZHMgRnVsbHRleHRDb2x1bW5zPFRUYWJsZXM+Pihjb2x1bW46IFRDb2x1bW4sIHZhbHVlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgTUFUQ0ggKCR7U3RyaW5nKGNvbHVtbil9KSBBR0FJTlNUICg/KWAsIFt2YWx1ZV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBHcm9vbmdhIEZ1bGxUZXh0IOyduOuNseyKpCDqsoDsg4lcbiAgICogLSDsgqzsmqntlaAgUEdyb29uZ2Eg7J24642x7Iqk7JmAIOuPmeydvO2VnCDsu6zrn7wg6rWs7ISx7Jy866GcIOqygOyDie2VtOyVvCDsnbjrjbHsiqTqsIAg7IKs7Jqp65Cp64uI64ukLlxuICAgKlxuICAgKiDri6jsnbwg7Lus65+8IOqygOyDiTpcbiAgICogYGBgc3FsXG4gICAqIFdIRVJFIG5hbWUgJkB+ICdzZWFyY2gnXG4gICAqIGBgYFxuICAgKlxuICAgKiDrs7Xtlakg7Lus65+8IOqygOyDiTpcbiAgICogYGBgc3FsXG4gICAqIFdIRVJFIEFSUkFZW25hbWU6OnRleHQsIGRlc2NyaXB0aW9uOjp0ZXh0XSAmQH4gJ3NlYXJjaCdcbiAgICogYGBgXG4gICAqL1xuICB3aGVyZVNlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uIHwgVENvbHVtbltdLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHdlaWdodHM/OiBudW1iZXJbXTsgLy8g7KCV7IiYIOuwsOyXtFxuICAgIH0sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IHsgd2VpZ2h0cyB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgICBjb25zdCBjb2x1bW5FeHByID0gQXJyYXkuaXNBcnJheShjb2x1bW4pXG4gICAgICA/IGBBUlJBWVske2NvbHVtbi5tYXAoKGMpID0+IGAke2N9Ojp0ZXh0YCkuam9pbihcIixcIil9XWBcbiAgICAgIDogY29sdW1uO1xuICAgIGNvbnN0IHBncm9vbmdhQ29uZGl0aW9uID0gYHBncm9vbmdhX2NvbmRpdGlvbig/JHt3ZWlnaHRzPy5sZW5ndGggPyBgLCB3ZWlnaHRzID0+IEFSUkFZWyR7d2VpZ2h0cy5qb2luKFwiLFwiKX1dYCA6IFwiXCJ9KWA7XG5cbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgJHtjb2x1bW5FeHByfSAmQH4gJHtwZ3Jvb25nYUNvbmRpdGlvbn1gLCBbdmFsdWVdKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgRlVMTFRFWFRcbiAgd2hlcmVUc1NlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPiB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUc1F1ZXJ5T3B0aW9ucyB8IFRzUXVlcnlDb25maWcsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IG9wdHMgPVxuICAgICAgdHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIgPyAoeyBjb25maWc6IG9wdGlvbnMgfSBhcyBUc1F1ZXJ5T3B0aW9ucykgOiAob3B0aW9ucyA/PyB7fSk7XG5cbiAgICBjb25zdCBwYXJzZXIgPSBvcHRzLnBhcnNlciA/PyBcIndlYnNlYXJjaF90b190c3F1ZXJ5XCI7XG4gICAgY29uc3QgY29uZmlnID0gb3B0cy5jb25maWcgPz8gXCJzaW1wbGVcIjtcbiAgICBjb25zdCBjb2x1bW5FeHByID1cbiAgICAgIHR5cGVvZiBjb2x1bW4gPT09IFwib2JqZWN0XCIgJiYgY29sdW1uLl90eXBlID09PSBcInNxbF9leHByZXNzaW9uXCJcbiAgICAgICAgPyBjb2x1bW4uX3NxbFxuICAgICAgICA6IFN0cmluZyhjb2x1bW4pO1xuXG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYCR7Y29sdW1uRXhwcn0gQEAgJHtwYXJzZXJ9KD8sID8pYCwgW2NvbmZpZywgdmFsdWVdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHdoZXJlRnV6enk8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgb3BlcmF0b3I/OiBGdXp6eU9wZXJhdG9yO1xuICAgIH0sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IG9wZXJhdG9yID0gbm9ybWFsaXplRnV6enlPcGVyYXRvcihvcHRpb25zPy5vcGVyYXRvcik7XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IFwiJVwiKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbHVtbiA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgJHtjb2x1bW4uX3NxbH0gJHtvcGVyYXRvcn0gP2AsIFsuLi5jb2x1bW4uX3BhcmFtcywgdmFsdWVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGA/PyAke29wZXJhdG9yfSA/YCwgW2NvbHVtbiwgdmFsdWVdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29sdW1uID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgPyAke29wZXJhdG9yfSAke2NvbHVtbi5fc3FsfWAsIFt2YWx1ZSwgLi4uY29sdW1uLl9wYXJhbXNdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gPz9gLCBbdmFsdWUsIGNvbHVtbl0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIFJBV1xuICB3aGVyZVJhdyhzcWw6IHN0cmluZywgYmluZGluZ3M/OiByZWFkb25seSBLbmV4LlJhd0JpbmRpbmdbXSk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KHNxbCwgYmluZGluZ3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUg6rSE7Zi4IOq3uOujue2VkVxuICB3aGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKChidWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KGJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soZ3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9yV2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5vcldoZXJlKChidWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KGJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soZ3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gT1JERVIgQlkgKFNxbEV4cHJlc3Npb27snLzroZzrj4Qg7ZWgIOyImCDsnojslrTslbwg7ZWoKVxuICBvcmRlckJ5PFRDb2x1bW4gZXh0ZW5kcyBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW46IFRDb2x1bW4gfCBQdXJpT3JkZXJCeUV4cHJlc3Npb24sXG4gICAgZGlyZWN0aW9uPzogUHVyaU9yZGVyQnlEaXJlY3Rpb24sXG4gICAgbnVsbHM/OiBQdXJpT3JkZXJCeU51bGxzLFxuICApOiB0aGlzO1xuICBvcmRlckJ5PFRDb2x1bW4gZXh0ZW5kcyBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW5zOiByZWFkb25seSBQdXJpT3JkZXJCeUVudHJ5PFRDb2x1bW4+W10sXG4gICk6IHRoaXM7XG4gIG9yZGVyQnkoXG4gICAgY29sdW1uT3JDb2x1bW5zOiBzdHJpbmcgfCBQdXJpT3JkZXJCeUV4cHJlc3Npb24gfCByZWFkb25seSBQdXJpT3JkZXJCeVJ1bnRpbWVFbnRyeVtdLFxuICAgIGRpcmVjdGlvbjogUHVyaU9yZGVyQnlEaXJlY3Rpb24gPSBcImFzY1wiLFxuICAgIG51bGxzPzogUHVyaU9yZGVyQnlOdWxscyxcbiAgKTogdGhpcyB7XG4gICAgaWYgKGlzT3JkZXJCeUVudHJpZXMoY29sdW1uT3JDb2x1bW5zKSkge1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBjb2x1bW5PckNvbHVtbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gXCJzdHJpbmdcIiB8fCBpc1NxbEV4cHJlc3Npb24oZW50cnkpKSB7XG4gICAgICAgICAgdGhpcy5hcHBseU9yZGVyQnkoZW50cnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYXBwbHlPcmRlckJ5KGVudHJ5LmNvbHVtbiwgZW50cnkub3JkZXIsIGVudHJ5Lm51bGxzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5hcHBseU9yZGVyQnkoY29sdW1uT3JDb2x1bW5zLCBkaXJlY3Rpb24sIG51bGxzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlPcmRlckJ5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgUHVyaU9yZGVyQnlFeHByZXNzaW9uLFxuICAgIGRpcmVjdGlvbj86IFB1cmlPcmRlckJ5RGlyZWN0aW9uLFxuICAgIG51bGxzPzogUHVyaU9yZGVyQnlOdWxscyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgbm9ybWFsaXplZERpcmVjdGlvbiA9IG5vcm1hbGl6ZU9yZGVyQnlEaXJlY3Rpb24oZGlyZWN0aW9uKTtcbiAgICBjb25zdCBub3JtYWxpemVkTnVsbHMgPSBub3JtYWxpemVPcmRlckJ5TnVsbHMobnVsbHMpO1xuXG4gICAgaWYgKHR5cGVvZiBjb2x1bW4gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9yZGVyQnlSYXcoXG4gICAgICAgIGAke2NvbHVtbi5fc3FsfSAke25vcm1hbGl6ZWREaXJlY3Rpb259JHtmb3JtYXROdWxsc1N1ZmZpeChub3JtYWxpemVkTnVsbHMpfWAsXG4gICAgICAgIGNvbHVtbi5fcGFyYW1zLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkub3JkZXJCeShjb2x1bW4sIG5vcm1hbGl6ZWREaXJlY3Rpb24sIG5vcm1hbGl6ZWROdWxscyk7XG4gICAgfVxuICB9XG5cbiAgZm9yVXBkYXRlKCk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LmZvclVwZGF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZm9yU2hhcmUoKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkuZm9yU2hhcmUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDrsqHthLAg7Jyg7IKs64+EIOqygOyDiSDshKTsoJVcbiAgICpcbiAgICogLSBTRUxFQ1Tsl5Agc2ltaWxhcml0eSDsu6zrn7wg7LaU6rCAXG4gICAqIC0gV0hFUkUgY29sIElTIE5PVCBOVUxMIOy2lOqwgFxuICAgKiAtIHRocmVzaG9sZOqwgCDsnojsnLzrqbQgV0hFUkUg7KGw6rG0IOy2lOqwgFxuICAgKiAtIOq4sOyhtCBPUkRFUiBCWeulvCBjbGVhcu2VmOqzoCDsm5Dsi5wg7Jew7IKw7J6Q66GcIOygleugrCAoSE5TVyDsnbjrjbHsiqQg7LWc7KCB7ZmUKVxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uIOuyoe2EsCDsu6zrn7wg6rK966GcXG4gICAqIEBwYXJhbSBlbWJlZGRpbmcg7L+866asIOyehOuyoOuUqSDrsqHthLBcbiAgICogQHBhcmFtIG9wdGlvbnMgbWV0aG9kLCB0aHJlc2hvbGQsIGFzIOuTsSDsmLXshZhcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBjb3NpbmUgc2ltaWxhcml0eSAo6riw67O46rCSKVxuICAgKiBxYi52ZWN0b3JTaW1pbGFyaXR5KFwiY29sdW1uTmFtZVwiLCBxdWVyeVZlY3Rvciwge1xuICAgKiAgIG1ldGhvZDogXCJjb3NpbmVcIixcbiAgICogICB0aHJlc2hvbGQ6IDAuNVxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gTDIgZGlzdGFuY2VcbiAgICogcWIudmVjdG9yU2ltaWxhcml0eShcImNvbHVtbk5hbWVcIiwgcXVlcnlWZWN0b3IsIHtcbiAgICogICBtZXRob2Q6IFwibDJcIixcbiAgICogICB0aHJlc2hvbGQ6IDEuNSAgLy8g6rGw66as6rCAIDEuNSDsnbTtlZjsnbgg6rKw6rO866eMXG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBJbm5lciBwcm9kdWN0XG4gICAqIHFiLnZlY3RvclNpbWlsYXJpdHkoXCJjb2x1bW5OYW1lXCIsIHF1ZXJ5VmVjdG9yLCB7XG4gICAqICAgbWV0aG9kOiBcImlubmVyX3Byb2R1Y3RcIixcbiAgICogICB0aHJlc2hvbGQ6IDAuN1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICB2ZWN0b3JTaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogVmVjdG9yQ29sdW1uczxUVGFibGVzPixcbiAgICBlbWJlZGRpbmc6IG51bWJlcltdLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIG1ldGhvZD86IFwiY29zaW5lXCIgfCBcImwyXCIgfCBcImlubmVyX3Byb2R1Y3RcIjtcbiAgICAgIHRocmVzaG9sZD86IG51bWJlcjtcbiAgICAgIGRpc3RpbmN0T24/OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+O1xuICAgIH0gPSB7fSxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0ICYgeyBzaW1pbGFyaXR5OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHsgbWV0aG9kID0gXCJjb3NpbmVcIiwgdGhyZXNob2xkLCBkaXN0aW5jdE9uIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKFxuICAgICAgIUFycmF5LmlzQXJyYXkoZW1iZWRkaW5nKSB8fFxuICAgICAgZW1iZWRkaW5nLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgZW1iZWRkaW5nLnNvbWUoKHYpID0+ICFOdW1iZXIuaXNGaW5pdGUodikpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGVtYmVkZGluZyB2ZWN0b3I6IGV4cGVjdGVkIGEgbm9uLWVtcHR5IGFycmF5IG9mIGZpbml0ZSBudW1iZXJzXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZlY3RvckxpdGVyYWwgPSBKU09OLnN0cmluZ2lmeShlbWJlZGRpbmcubWFwKCh2KSA9PiBOdW1iZXIodikpKTtcbiAgICBjb25zdCBvcGVyYXRvciA9IHsgY29zaW5lOiBcIjw9PlwiLCBsMjogXCI8LT5cIiwgaW5uZXJfcHJvZHVjdDogXCI8Iz5cIiB9W21ldGhvZF07XG5cbiAgICAvLyBtZXRob2Trs4Qg7Jew7IKw7J6QIOuwjyBzaW1pbGFyaXR5IOqzhOyCsOyLnVxuICAgIC8vIC0gY29zaW5lOiA8PT4gKGNvc2luZSBkaXN0YW5jZSwgMH4yKSwgc2ltaWxhcml0eSA9IDEgLSBkaXN0YW5jZVxuICAgIC8vIC0gbDI6IDwtPiAoZXVjbGlkZWFuIGRpc3RhbmNlKSwgc2ltaWxhcml0eSA9IGRpc3RhbmNlICjrgq7snYTsiJjroZ0g7Jyg7IKsKVxuICAgIC8vIC0gaW5uZXJfcHJvZHVjdDogPCM+IChuZWdhdGl2ZSBpbm5lciBwcm9kdWN0KSwgc2ltaWxhcml0eSA9IC1kaXN0YW5jZSAo64aS7J2E7IiY66GdIOycoOyCrClcbiAgICBjb25zdCBzaW1pbGFyaXR5RXhwciA9XG4gICAgICBtZXRob2QgPT09IFwiY29zaW5lXCJcbiAgICAgICAgPyB0aGlzLmtuZXgucmF3KGAxIC0gKD8/ICR7b3BlcmF0b3J9ID86OnZlY3RvcikgYXMgc2ltaWxhcml0eWAsIFtjb2x1bW4sIHZlY3RvckxpdGVyYWxdKVxuICAgICAgICA6IG1ldGhvZCA9PT0gXCJsMlwiXG4gICAgICAgICAgPyB0aGlzLmtuZXgucmF3KGA/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IgYXMgc2ltaWxhcml0eWAsIFtjb2x1bW4sIHZlY3RvckxpdGVyYWxdKVxuICAgICAgICAgIDogdGhpcy5rbmV4LnJhdyhgLSg/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IpIGFzIHNpbWlsYXJpdHlgLCBbY29sdW1uLCB2ZWN0b3JMaXRlcmFsXSk7XG5cbiAgICAvLyBXSEVSRSBOT1QgTlVMTFxuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTm90TnVsbChjb2x1bW4pO1xuXG4gICAgLy8g6riw7KG0IE9SREVSIEJZIGNsZWFyXG4gICAgdGhpcy5rbmV4UXVlcnkuY2xlYXIoXCJvcmRlclwiKTtcbiAgICBpZiAoZGlzdGluY3RPbikge1xuICAgICAgLy8gRElTVElOQ1QgT07snYAgU0VMRUNUIOygiOydmCDrp6gg7JWe7JeQIOyZgOyVvCDtlZjrr4DroZwsIOq4sOyhtCBzZWxlY3Qoc3Vic2V0IO2VhOuTnOuTpCnrpbwg67O07KG0IO2bhCBjbGVhcu2VmOqzoCDri6Tsi5wg7LaU6rCAXG4gICAgICBjb25zdCBleGlzdGluZ1N1YnNldENvbHMgPSAodGhpcy5rbmV4UXVlcnkgYXMgYW55KS5fc3RhdGVtZW50c1xuICAgICAgICAuZmlsdGVyKChzOiBhbnkpID0+IHMuZ3JvdXBpbmcgPT09IFwiY29sdW1uc1wiKVxuICAgICAgICAuZmxhdE1hcCgoczogYW55KSA9PiBzLnZhbHVlKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5LmNsZWFyKFwic2VsZWN0XCIpO1xuICAgICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KHRoaXMua25leC5yYXcoYERJU1RJTkNUIE9OICg/PykgPz9gLCBbZGlzdGluY3RPbiwgZGlzdGluY3RPbl0pKTtcbiAgICAgIGV4aXN0aW5nU3Vic2V0Q29scy5tYXAoKGNvbDogYW55KSA9PiB0aGlzLmtuZXhRdWVyeS5zZWxlY3QoY29sKSk7XG4gICAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3Qoc2ltaWxhcml0eUV4cHIpO1xuICAgICAgdGhpcy5rbmV4UXVlcnkub3JkZXJCeVJhdyhgPz8sID8/ICR7b3BlcmF0b3J9ID86OnZlY3RvcmAsIFtcbiAgICAgICAgZGlzdGluY3RPbixcbiAgICAgICAgY29sdW1uLFxuICAgICAgICB2ZWN0b3JMaXRlcmFsLFxuICAgICAgXSk7XG5cbiAgICAgIHRoaXMua25leFF1ZXJ5ID0gdGhpcy5rbmV4XG4gICAgICAgIC5mcm9tKHRoaXMua25leFF1ZXJ5LmFzKFwiZGlzdGluY3RfdmVjdG9yc1wiKSlcbiAgICAgICAgLnNlbGVjdChcIipcIilcbiAgICAgICAgLm9yZGVyQnkoXCJzaW1pbGFyaXR5XCIsIFwiZGVzY1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KHNpbWlsYXJpdHlFeHByKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9yZGVyQnlSYXcoYD8/ICR7b3BlcmF0b3J9ID86OnZlY3RvcmAsIFtjb2x1bW4sIHZlY3RvckxpdGVyYWxdKTtcbiAgICB9XG5cbiAgICAvLyB0aHJlc2hvbGRcbiAgICBpZiAodHlwZW9mIHRocmVzaG9sZCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodGhyZXNob2xkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmVjdG9yU2ltaWxhcml0eSB0aHJlc2hvbGQ6ICR7dGhyZXNob2xkfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlzdGluY3RPbikge1xuICAgICAgICBjb25zdCB0aHJlc2hvbGRPcCA9IG1ldGhvZCA9PT0gXCJsMlwiID8gXCI8PVwiIDogXCI+PVwiO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShcInNpbWlsYXJpdHlcIiwgdGhyZXNob2xkT3AsIHRocmVzaG9sZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0aHJlc2hvbGRWYWx1ZSA9XG4gICAgICAgICAgbWV0aG9kID09PSBcImNvc2luZVwiID8gMSAtIHRocmVzaG9sZCA6IG1ldGhvZCA9PT0gXCJpbm5lcl9wcm9kdWN0XCIgPyAtdGhyZXNob2xkIDogdGhyZXNob2xkO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgPz8gJHtvcGVyYXRvcn0gPzo6dmVjdG9yIDw9ID9gLCBbXG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIHZlY3RvckxpdGVyYWwsXG4gICAgICAgICAgdGhyZXNob2xkVmFsdWUsXG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8vIOq4sOuzuCDsv7zrpqwg66mU7ISc65Oc65OkXG4gIGxpbWl0KGNvdW50OiBudW1iZXIpOiB0aGlzIHtcbiAgICBpZiAoY291bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxpbWl0OiBtdXN0IGJlID49IDBcIik7XG4gICAgfVxuICAgIHRoaXMua25leFF1ZXJ5LmxpbWl0KGNvdW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9mZnNldChjb3VudDogbnVtYmVyKTogdGhpcyB7XG4gICAgaWYgKGNvdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBvZmZzZXQ6IG11c3QgYmUgPj0gMFwiKTtcbiAgICB9XG4gICAgdGhpcy5rbmV4UXVlcnkub2Zmc2V0KGNvdW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEdST1VQIEJZXG4gIGdyb3VwQnk8VENvbHVtbnMgZXh0ZW5kcyBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PiguLi5jb2x1bW5zOiBUQ29sdW1uc1tdKTogdGhpcztcbiAgZ3JvdXBCeSguLi5jb2x1bW5zOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5Lmdyb3VwQnkoLi4uY29sdW1ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBIQVZJTkdcbiAgaGF2aW5nKGNvbmRpdGlvbjogc3RyaW5nKTogdGhpcztcbiAgaGF2aW5nPFRDb2x1bW4gZXh0ZW5kcyBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICB2YWx1ZTogYW55LFxuICApOiB0aGlzO1xuICAvLyBIQVZJTkcg6rWs7ZiEXG4gIGhhdmluZyguLi5jb25kaXRpb25zOiBhbnlbXSk6IHRoaXMge1xuICAgIGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gaGF2aW5nKFwiQ09VTlQoKikgPiAxMFwiKVxuICAgICAgdGhpcy5rbmV4UXVlcnkuaGF2aW5nKHRoaXMua25leC5yYXcoY29uZGl0aW9uc1swXSkpO1xuICAgIH0gZWxzZSBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDMpIHtcbiAgICAgIC8vIGhhdmluZyhcImNvdW50XCIsIFwiPlwiLCAxMClcbiAgICAgIHRoaXMua25leFF1ZXJ5LmhhdmluZyhcbiAgICAgICAgdGhpcy5rbmV4LnJhdyhjb25kaXRpb25zWzBdKSxcbiAgICAgICAgY29uZGl0aW9uc1sxXSxcbiAgICAgICAgdGhpcy5rbmV4LnJhdyhjb25kaXRpb25zWzJdKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaGF2aW5nIGFyZ3VtZW50c1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDsi6Ttlokg66mU7ISc65Oc65OkIC0gdGhlbmFibGUg6rWs7ZiEXG4gIHRoZW48VFJlc3VsdDEgPSBFeHBhbmQ8VFJlc3VsdD5bXSwgVFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBFeHBhbmQ8VFJlc3VsdD5bXSkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgbnVsbCxcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgbnVsbCxcbiAgKTogUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgTmFpdGUudChcInB1cmk6ZXhlY3V0ZWQtcXVlcnlcIiwgdGhpcy50b1F1ZXJ5KCkpO1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS50aGVuKG9uZnVsZmlsbGVkIGFzIGFueSwgb25yZWplY3RlZCk7XG4gIH1cbiAgY2F0Y2g8VFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc3VsdCB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LmNhdGNoKG9ucmVqZWN0ZWQpO1xuICB9XG4gIGZpbmFsbHkob25maW5hbGx5PzogKCgpID0+IHZvaWQpIHwgbnVsbCk6IFByb21pc2U8VFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS5maW5hbGx5KG9uZmluYWxseSk7XG4gIH1cblxuICAvLyDtlZjrgpjrp4wg7L+866asXG4gIGZpcnN0KCk6IFJlc29sdmVkUHVyaTxFeHBhbmQ8VFJlc3VsdD4sIG5ldmVyPiB7XG4gICAgdGhpcy5rbmV4UXVlcnkuZmlyc3QoKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4KTtcbiAgfVxuXG4gIC8vIOy/vOumrO2VnCDroIjsvZTrk5zsl5DshJwg7Yq57KCVIOy7rOufvOunjCDstpTstpztlZwg67Cw7Je0IOumrO2EtFxuICBwbHVjazxUQ29sdW1uIGV4dGVuZHMga2V5b2YgVFJlc3VsdCB8IFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcywgVFJlc3VsdD4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgKTogUmVzb2x2ZWRQdXJpPFxuICAgIFRDb2x1bW4gZXh0ZW5kcyBrZXlvZiBUUmVzdWx0XG4gICAgICA/IFRSZXN1bHRbVENvbHVtbl1bXVxuICAgICAgOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPltdLFxuICAgIG5ldmVyXG4gID4ge1xuICAgIHRoaXMua25leFF1ZXJ5LnBsdWNrKGNvbHVtbiBhcyBzdHJpbmcpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgpO1xuICB9XG5cbiAgLy8gSU5TRVJUIDog64uo7J28IOqwneyytFxuICBpbnNlcnQoXG4gICAgZGF0YTogSW5zZXJ0RGF0YTxTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PixcbiAgKTogUmVzb2x2ZWRQdXJpPEluc2VydFJlc3VsdCwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj47XG4gIC8vIElOU0VSVDog67Cw7Je0XG4gIGluc2VydChcbiAgICBkYXRhOiBJbnNlcnREYXRhPFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+W10sXG4gICk6IFJlc29sdmVkUHVyaTxJbnNlcnRSZXN1bHQsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+O1xuICAvLyBJTlNFUlQg7Iuk7KCcIOq1rO2YhFxuICBpbnNlcnQoXG4gICAgcmF3RGF0YTogSW5zZXJ0RGF0YTxTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB8IEluc2VydERhdGE8U2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj5bXSxcbiAgKTogUmVzb2x2ZWRQdXJpPEluc2VydFJlc3VsdCwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIC8vIEpTT04g7Lus65+8IHN0cmluZ2lmeSDroZzsp4HsnYQg66mU7ISc65Oc66GcIOu2hOumrO2VmOyXrCDspJHrs7Ug7KCc6rGwXG4gICAgY29uc3QgcmVmaW5lZERhdGEgPSB0aGlzLnJlZmluZUpzb25Db2x1bW5zKHJhd0RhdGEpO1xuICAgIHRoaXMua25leFF1ZXJ5Lmluc2VydChyZWZpbmVkRGF0YSk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCk7XG4gIH1cblxuICAvLyBVUERBVEVcbiAgdXBkYXRlKHJhd0RhdGE6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIC8vIEpTT04g7Lus65+8IHN0cmluZ2lmeSDroZzsp4HsnYQg66mU7ISc65Oc66GcIOu2hOumrO2VmOyXrCDspJHrs7Ug7KCc6rGwXG4gICAgY29uc3QgcmVmaW5lZERhdGEgPSB0aGlzLnJlZmluZUpzb25Db2x1bW5zKHJhd0RhdGEpO1xuICAgIHRoaXMua25leFF1ZXJ5LnVwZGF0ZShyZWZpbmVkRGF0YSk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTiDsu6zrn7zsl5Ag64yA7ZW0IHN0cmluZ2lmeSDsspjrpqzrpbwg7IiY7ZaJ7ZWY64qUIOuCtOu2gCDrqZTshJzrk5zsnoXri4jri6QuXG4gICAqIG9iamVjdCDrmJDripQgb2JqZWN0IOuwsOyXtOydhCDrsJvqs6AsIEpTT04g7Lus65+87J20IOyeiOycvOuptCDsp4HroKztmZTtlZjsl6wg67CY7ZmY7ZWp64uI64ukLlxuICAgKiDsp4HsoJEg6rCS7J2EIOuzgOqyve2VmOuvgOuhnCBzaWRlIGVmZmVjdOqwgCDsnojsirXri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHJlZmluZUpzb25Db2x1bW5zKFxuICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbiAgKTogdHlwZW9mIGRhdGEge1xuICAgIC8vIHRhYmxlU3BlY+ydtOuCmCBqc29uQ29sdW1ucyDsl4bripQg6rK97JqwIOuwlOuhnCDrsJjtmZhcbiAgICBpZiAoIXRoaXMudGFibGVTcGVjIHx8ICF0aGlzLnRhYmxlU3BlYy5qc29uQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIC8vIOuTseuhneuQnCBUYWJsZVNwZWPsnYQg7Ya17ZW0IEpTT07su6zrn7wg66qp66Gd7J2EIOqwgOyguOyZgCBKU09OLnN0cmluZ2lmeSDsspjrpqxcbiAgICBjb25zdCBqc29uQ29sdW1ucyA9IHRoaXMudGFibGVTcGVjLmpzb25Db2x1bW5zO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGF0YSkge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBqc29uQ29sdW1ucykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gaXRlbVtjb2x1bW5dO1xuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpdGVtW2NvbHVtbl0gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGpzb25Db2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YVtjb2x1bW5dO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGRhdGFbY29sdW1uXSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8vIEluY3JlbWVudFxuICBpbmNyZW1lbnQ8VENvbHVtbiBleHRlbmRzIE51bWVyaWNDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IG51bWJlcixcbiAgKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIGlmICh2YWx1ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbmNyZW1lbnQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKTtcbiAgICB9XG4gICAgdGhpcy5rbmV4UXVlcnkuaW5jcmVtZW50KGNvbHVtbiwgdmFsdWUpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgpO1xuICB9XG4gIC8vIERlY3JlbWVudFxuICBkZWNyZW1lbnQ8VENvbHVtbiBleHRlbmRzIE51bWVyaWNDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IG51bWJlcixcbiAgKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIGlmICh2YWx1ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWNyZW1lbnQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKTtcbiAgICB9XG4gICAgdGhpcy5rbmV4UXVlcnkuZGVjcmVtZW50KGNvbHVtbiwgdmFsdWUpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgpO1xuICB9XG5cbiAgLy8gREVMRVRFXG4gIGRlbGV0ZSgpOiBSZXNvbHZlZFB1cmk8bnVtYmVyLCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgdGhpcy5rbmV4UXVlcnkuZGVsZXRlKCk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCk7XG4gIH1cblxuICAvLyDtmZXsnbgg7L+866asIOumrO2EtFxuICB0b1F1ZXJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LnRvUXVlcnkoKTtcbiAgfVxuXG4gIC8vIOy/vOumrCDrlJTrsoTquYUg66Gc6re4IOy2nOugpVxuICBkZWJ1ZygpOiB0aGlzIHtcbiAgICBjb25zb2xlLmxvZyhgJHtjaGFsay5jeWFuKFwiW1B1cmkgRGVidWddXCIpfSAke2NoYWxrLnllbGxvdyh0aGlzLnRvUXVlcnkoKSl9YCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjbG9uZSgpOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFRSZXN1bHQ+IHtcbiAgICAvLyAnZHVhbCfsnYAg642U66+4IO2FjOydtOu4lOydtOupsCwg67CU66GcIOyVhOuemCDspITsl5DshJwga25leFF1ZXJ56rCAIOuNruyWtOyUjOybjOynkeuLiOuLpC5cbiAgICBjb25zdCBuZXdQdXJpID0gbmV3IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4odGhpcy5rbmV4LCBcImR1YWxcIik7XG4gICAgbmV3UHVyaS5rbmV4UXVlcnkgPSB0aGlzLmtuZXhRdWVyeS5jbG9uZSgpO1xuICAgIHJldHVybiBuZXdQdXJpO1xuICB9XG5cbiAgZm9ybWF0U1FMKHVuZm9ybWF0dGVkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFNRTCDsmIjslb3slrQg66qp66GdXG4gICAgY29uc3Qga2V5d29yZHMgPSBbXG4gICAgICBcIlNFTEVDVFwiLFxuICAgICAgXCJGUk9NXCIsXG4gICAgICBcIldIRVJFXCIsXG4gICAgICBcIklOU0VSVFwiLFxuICAgICAgXCJJTlRPXCIsXG4gICAgICBcIlZBTFVFU1wiLFxuICAgICAgXCJVUERBVEVcIixcbiAgICAgIFwiREVMRVRFXCIsXG4gICAgICBcIkNSRUFURVwiLFxuICAgICAgXCJUQUJMRVwiLFxuICAgICAgXCJBTFRFUlwiLFxuICAgICAgXCJEUk9QXCIsXG4gICAgICBcIkpPSU5cIixcbiAgICAgIFwiT05cIixcbiAgICAgIFwiSU5ORVJcIixcbiAgICAgIFwiTEVGVFwiLFxuICAgICAgXCJSSUdIVFwiLFxuICAgICAgXCJGVUxMXCIsXG4gICAgICBcIk9VVEVSXCIsXG4gICAgICBcIkdST1VQXCIsXG4gICAgICBcIkJZXCIsXG4gICAgICBcIk9SREVSXCIsXG4gICAgICBcIkhBVklOR1wiLFxuICAgICAgXCJESVNUSU5DVFwiLFxuICAgICAgXCJMSU1JVFwiLFxuICAgICAgXCJPRkZTRVRcIixcbiAgICAgIFwiQVNcIixcbiAgICAgIFwiQU5EXCIsXG4gICAgICBcIk9SXCIsXG4gICAgICBcIk5PVFwiLFxuICAgICAgXCJJTlwiLFxuICAgICAgXCJMSUtFXCIsXG4gICAgICBcIklTXCIsXG4gICAgICBcIk5VTExcIixcbiAgICAgIFwiQ0FTRVwiLFxuICAgICAgXCJXSEVOXCIsXG4gICAgICBcIlRIRU5cIixcbiAgICAgIFwiRUxTRVwiLFxuICAgICAgXCJFTkRcIixcbiAgICAgIFwiVU5JT05cIixcbiAgICAgIFwiQUxMXCIsXG4gICAgICBcIkVYSVNUU1wiLFxuICAgICAgXCJCRVRXRUVOXCIsXG4gICAgXTtcblxuICAgIGxldCBmb3JtYXR0ZWQgPSB1bmZvcm1hdHRlZDtcblxuICAgIC8vIOyYiOyVveyWtOulvCDrjIDrrLjsnpDroZwg67OA7ZmYXG4gICAga2V5d29yZHMuZm9yRWFjaCgoa2V5d29yZCkgPT4ge1xuICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBcXFxcYiR7a2V5d29yZH1cXFxcYmAsIFwiZ2lcIik7XG4gICAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZShyZWdleCwga2V5d29yZC50b1VwcGVyQ2FzZSgpKTtcbiAgICB9KTtcblxuICAgIC8vIOyjvOyalCDsoIgg7JWe7JeQIOykhOuwlOq/iCDstpTqsIBcbiAgICBjb25zdCBtYWpvckNsYXVzZXMgPSBbXG4gICAgICBcIlNFTEVDVFwiLFxuICAgICAgXCJGUk9NXCIsXG4gICAgICBcIldIRVJFXCIsXG4gICAgICBcIkdST1VQIEJZXCIsXG4gICAgICBcIk9SREVSIEJZXCIsXG4gICAgICBcIkhBVklOR1wiLFxuICAgICAgXCJMSU1JVFwiLFxuICAgICAgXCJVTklPTlwiLFxuICAgIF07XG4gICAgbWFqb3JDbGF1c2VzLmZvckVhY2goKGNsYXVzZSkgPT4ge1xuICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBcXFxccysoJHtjbGF1c2V9KVxcXFxzK2AsIFwiZ2lcIik7XG4gICAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZShyZWdleCwgYFxcbiR7Y2xhdXNlLnRvVXBwZXJDYXNlKCl9IGApO1xuICAgIH0pO1xuXG4gICAgLy8gSk9JTiDsoIgg7LKY66asXG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL1xccysoKD86SU5ORVJ8TEVGVHxSSUdIVHxGVUxMIE9VVEVSKVxccyspP0pPSU5cXHMrL2dpLCBcIlxcbiQxSk9JTiBcIik7XG5cbiAgICAvLyBBTkQsIE9SIOyhsOqxtCDsspjrpqxcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvXFxzKyhBTkR8T1IpXFxzKy9naSwgXCJcXG4gICQxIFwiKTtcblxuICAgIC8vIOq0hO2YuCDsspjrpqwg67CPIOuTpOyXrOyTsOq4sFxuICAgIGNvbnN0IGxpbmVzID0gZm9ybWF0dGVkLnNwbGl0KFwiXFxuXCIpO1xuICAgIGNvbnN0IGluZGVudGVkTGluZXMgPSBbXTtcbiAgICBsZXQgaW5kZW50TGV2ZWwgPSAwO1xuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgaWYgKCF0cmltbWVkTGluZSkgY29udGludWU7XG5cbiAgICAgIC8vIOuLq+uKlCDqtITtmLjqsIAg7J6I7Jy866m0IOuTpOyXrOyTsOq4sCDroIjrsqgg6rCQ7IaMXG4gICAgICBjb25zdCBjbG9zaW5nUGFyZW5zID0gKHRyaW1tZWRMaW5lLm1hdGNoKC9cXCkvZykgfHwgW10pLmxlbmd0aDtcbiAgICAgIGNvbnN0IG9wZW5pbmdQYXJlbnMgPSAodHJpbW1lZExpbmUubWF0Y2goL1xcKC9nKSB8fCBbXSkubGVuZ3RoO1xuXG4gICAgICBpZiAoY2xvc2luZ1BhcmVucyA+IDAgJiYgb3BlbmluZ1BhcmVucyA9PT0gMCkge1xuICAgICAgICBpbmRlbnRMZXZlbCA9IE1hdGgubWF4KDAsIGluZGVudExldmVsIC0gY2xvc2luZ1BhcmVucyk7XG4gICAgICB9XG5cbiAgICAgIC8vIO2YhOyerCDrk6Tsl6zsk7DquLAg7KCB7JqpXG4gICAgICBjb25zdCBpbmRlbnQgPSBcIiAgXCIucmVwZWF0KGluZGVudExldmVsKTtcbiAgICAgIGluZGVudGVkTGluZXMucHVzaChpbmRlbnQgKyB0cmltbWVkTGluZSk7XG5cbiAgICAgIC8vIOyXrOuKlCDqtITtmLjqsIAg7J6I7Jy866m0IOuTpOyXrOyTsOq4sCDroIjrsqgg7Kad6rCAXG4gICAgICBpZiAob3BlbmluZ1BhcmVucyA+IGNsb3NpbmdQYXJlbnMpIHtcbiAgICAgICAgaW5kZW50TGV2ZWwgKz0gb3BlbmluZ1BhcmVucyAtIGNsb3NpbmdQYXJlbnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGVudGVkTGluZXMuam9pbihcIlxcblwiKS50cmltKCk7XG4gIH1cblxuICByYXcoc3FsOiBzdHJpbmcpOiBLbmV4LlJhdyB7XG4gICAgcmV0dXJuIHRoaXMua25leC5yYXcoc3FsKTtcbiAgfVxuXG4gIC8vIEtuZXgg7L+866asIOu5jOuNlCDsp4HsoJEg7KCR6re8XG4gIHJhd1F1ZXJ5KCk6IEtuZXguUXVlcnlCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdoZXJlR3JvdXA8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBidWlsZGVyOiBLbmV4LlF1ZXJ5QnVpbGRlcikge31cblxuICAvLyB3aGVyZSDrqZTshJzrk5zrk6RcbiAgd2hlcmUoY29uZGl0aW9uczogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiB0aGlzO1xuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBvcGVyYXRvcjogV2hlcmVPcGVyYXRvcixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIHdoZXJlKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlKGFyZ3NbMF0sIC4uLmFyZ3Muc2xpY2UoMSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gd2hlcmVJbiAvIHdoZXJlTm90SW4g66mU7ISc65Oc65OkXG4gIHdoZXJlSW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+W10sXG4gICk6IHRoaXM7XG4gIHdoZXJlSW4oLi4uYXJnczogYW55W10pOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmVJbihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHdoZXJlTm90SW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+W10sXG4gICk6IHRoaXM7XG4gIHdoZXJlTm90SW4oLi4uYXJnczogYW55W10pOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmVOb3RJbihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIG9yV2hlcmUg66mU7ISc65Oc65OkXG4gIG9yV2hlcmUoY29uZGl0aW9uczogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiB0aGlzO1xuICBvcldoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICBvcldoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgb3BlcmF0b3I6IFdoZXJlT3BlcmF0b3IsXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICBvcldoZXJlKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmUoYXJnc1swXSwgLi4uYXJncy5zbGljZSgxKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBvcldoZXJlSW4gLyBvcldoZXJlTm90SW4g66mU7ISc65Oc65OkXG4gIG9yV2hlcmVJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgKTogdGhpcztcbiAgb3JXaGVyZUluKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmVJbihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9yV2hlcmVOb3RJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgKTogdGhpcztcbiAgb3JXaGVyZU5vdEluKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmVOb3RJbihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIE1BVENIXG4gIHdoZXJlTWF0Y2g8VENvbHVtbiBleHRlbmRzIEZ1bGx0ZXh0Q29sdW1uczxUVGFibGVzPj4oY29sdW1uOiBUQ29sdW1uLCB2YWx1ZTogc3RyaW5nKTogdGhpcztcbiAgd2hlcmVNYXRjaCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZVJhdyhgTUFUQ0ggKCR7U3RyaW5nKGFyZ3NbMF0pfSkgQUdBSU5TVCAoPylgLCBbYXJnc1sxXV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZU1hdGNoPFRDb2x1bW4gZXh0ZW5kcyBGdWxsdGV4dENvbHVtbnM8VFRhYmxlcz4+KGNvbHVtbjogVENvbHVtbiwgdmFsdWU6IHN0cmluZyk6IHRoaXM7XG4gIG9yV2hlcmVNYXRjaCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGBNQVRDSCAoJHtTdHJpbmcoYXJnc1swXSl9KSBBR0FJTlNUICg/KWAsIFthcmdzWzFdXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBTRUFSQ0hcbiAgd2hlcmVTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbiB8IFRDb2x1bW5bXSxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICB3ZWlnaHRzPzogbnVtYmVyW107IC8vIOygleyImCDrsLDsl7RcbiAgICB9LFxuICApOiB0aGlzO1xuICB3aGVyZVNlYXJjaCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIGNvbnN0IHsgd2VpZ2h0cyB9ID0gYXJnc1syXSA/PyB7fTtcbiAgICBjb25zdCBjb2x1bW5FeHByID0gQXJyYXkuaXNBcnJheShhcmdzWzBdKVxuICAgICAgPyBgQVJSQVlbJHthcmdzWzBdLm1hcCgoYykgPT4gYCR7Y306OnRleHRgKS5qb2luKFwiLFwiKX1dYFxuICAgICAgOiBhcmdzWzBdO1xuICAgIGNvbnN0IHBncm9vbmdhQ29uZGl0aW9uID0gYHBncm9vbmdhX2NvbmRpdGlvbig/JHt3ZWlnaHRzPy5sZW5ndGggPyBgLCB3ZWlnaHRzID0+IEFSUkFZWyR7d2VpZ2h0cy5qb2luKFwiLFwiKX1dYCA6IFwiXCJ9KWA7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGAke2NvbHVtbkV4cHJ9ICZAfiAke3Bncm9vbmdhQ29uZGl0aW9ufWAsIFthcmdzWzFdXSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9yV2hlcmVTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbiB8IFRDb2x1bW5bXSxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICB3ZWlnaHRzPzogbnVtYmVyW107IC8vIOygleyImCDrsLDsl7RcbiAgICB9LFxuICApOiB0aGlzO1xuICBvcldoZXJlU2VhcmNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3QgeyB3ZWlnaHRzIH0gPSBhcmdzWzJdID8/IHt9O1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBBcnJheS5pc0FycmF5KGFyZ3NbMF0pXG4gICAgICA/IGBBUlJBWVske2FyZ3NbMF0ubWFwKChjKSA9PiBgJHtjfTo6dGV4dGApLmpvaW4oXCIsXCIpfV1gXG4gICAgICA6IGFyZ3NbMF07XG4gICAgY29uc3QgcGdyb29uZ2FDb25kaXRpb24gPSBgcGdyb29uZ2FfY29uZGl0aW9uKD8ke3dlaWdodHM/Lmxlbmd0aCA/IGAsIHdlaWdodHMgPT4gQVJSQVlbJHt3ZWlnaHRzLmpvaW4oXCIsXCIpfV1gIDogXCJcIn0pYDtcbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZVJhdyhgJHtjb2x1bW5FeHByfSAmQH4gJHtwZ3Jvb25nYUNvbmRpdGlvbn1gLCBbYXJnc1sxXV0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBGVUxMVEVYVFxuICB3aGVyZVRzU2VhcmNoPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+IHwgU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFRzUXVlcnlPcHRpb25zIHwgVHNRdWVyeUNvbmZpZyxcbiAgKTogdGhpcztcbiAgd2hlcmVUc1NlYXJjaCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIGNvbnN0IG9wdHMgPVxuICAgICAgdHlwZW9mIGFyZ3NbMl0gPT09IFwic3RyaW5nXCIgPyAoeyBjb25maWc6IGFyZ3NbMl0gfSBhcyBUc1F1ZXJ5T3B0aW9ucykgOiAoYXJnc1syXSA/PyB7fSk7XG5cbiAgICBjb25zdCBwYXJzZXIgPSBvcHRzLnBhcnNlciA/PyBcIndlYnNlYXJjaF90b190c3F1ZXJ5XCI7XG4gICAgY29uc3QgY29uZmlnID0gb3B0cy5jb25maWcgPz8gXCJzaW1wbGVcIjtcbiAgICBjb25zdCBjb2x1bW5FeHByID1cbiAgICAgIHR5cGVvZiBhcmdzWzBdID09PSBcIm9iamVjdFwiICYmIGFyZ3NbMF0uX3R5cGUgPT09IFwic3FsX2V4cHJlc3Npb25cIlxuICAgICAgICA/IGFyZ3NbMF0uX3NxbFxuICAgICAgICA6IFN0cmluZyhhcmdzWzBdKTtcblxuICAgIHRoaXMuYnVpbGRlci53aGVyZVJhdyhgJHtjb2x1bW5FeHByfSBAQCAke3BhcnNlcn0oPywgPylgLCBbY29uZmlnLCBhcmdzWzFdXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcldoZXJlVHNTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNRdWVyeU9wdGlvbnMgfCBUc1F1ZXJ5Q29uZmlnLFxuICApOiB0aGlzO1xuICBvcldoZXJlVHNTZWFyY2goLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCBvcHRzID1cbiAgICAgIHR5cGVvZiBhcmdzWzJdID09PSBcInN0cmluZ1wiID8gKHsgY29uZmlnOiBhcmdzWzJdIH0gYXMgVHNRdWVyeU9wdGlvbnMpIDogKGFyZ3NbMl0gPz8ge30pO1xuXG4gICAgY29uc3QgcGFyc2VyID0gb3B0cy5wYXJzZXIgPz8gXCJ3ZWJzZWFyY2hfdG9fdHNxdWVyeVwiO1xuICAgIGNvbnN0IGNvbmZpZyA9IG9wdHMuY29uZmlnID8/IFwic2ltcGxlXCI7XG4gICAgY29uc3QgY29sdW1uRXhwciA9XG4gICAgICB0eXBlb2YgYXJnc1swXSA9PT0gXCJvYmplY3RcIiAmJiBhcmdzWzBdLl90eXBlID09PSBcInNxbF9leHByZXNzaW9uXCJcbiAgICAgICAgPyBhcmdzWzBdLl9zcWxcbiAgICAgICAgOiBTdHJpbmcoYXJnc1swXSk7XG5cbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZVJhdyhgJHtjb2x1bW5FeHByfSBAQCAke3BhcnNlcn0oPywgPylgLCBbY29uZmlnLCBhcmdzWzFdXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB3aGVyZUZ1enp5PFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+IHwgU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIG9wZXJhdG9yPzogRnV6enlPcGVyYXRvcjtcbiAgICB9LFxuICApOiB0aGlzO1xuICB3aGVyZUZ1enp5KC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3Qgb3BlcmF0b3IgPSBub3JtYWxpemVGdXp6eU9wZXJhdG9yKGFyZ3NbMl0/Lm9wZXJhdG9yKTtcblxuICAgIGlmIChvcGVyYXRvciA9PT0gXCIlXCIpIHtcbiAgICAgIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYCR7YXJnc1swXS5fc3FsfSAke29wZXJhdG9yfSA/YCwgWy4uLmFyZ3NbMF0uX3BhcmFtcywgYXJnc1sxXV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGA/PyAke29wZXJhdG9yfSA/YCwgW2FyZ3NbMF0sIGFyZ3NbMV1dKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGA/ICR7b3BlcmF0b3J9ICR7YXJnc1swXS5fc3FsfWAsIFthcmdzWzFdLCAuLi5hcmdzWzBdLl9wYXJhbXNdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGA/ICR7b3BlcmF0b3J9ID8/YCwgW2FyZ3NbMV0sIGFyZ3NbMF1dKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcldoZXJlRnV6enk8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgb3BlcmF0b3I/OiBGdXp6eU9wZXJhdG9yO1xuICAgIH0sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVGdXp6eSguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIGNvbnN0IG9wZXJhdG9yID0gbm9ybWFsaXplRnV6enlPcGVyYXRvcihhcmdzWzJdPy5vcGVyYXRvcik7XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IFwiJVwiKSB7XG4gICAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYCR7YXJnc1swXS5fc3FsfSAke29wZXJhdG9yfSA/YCwgWy4uLmFyZ3NbMF0uX3BhcmFtcywgYXJnc1sxXV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYD8/ICR7b3BlcmF0b3J9ID9gLCBbYXJnc1swXSwgYXJnc1sxXV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZVJhdyhgPyAke29wZXJhdG9yfSAke2FyZ3NbMF0uX3NxbH1gLCBbYXJnc1sxXSwgLi4uYXJnc1swXS5fcGFyYW1zXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGA/ICR7b3BlcmF0b3J9ID8/YCwgW2FyZ3NbMV0sIGFyZ3NbMF1dKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDspJHssqkg6re466O5XG4gIHdoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogdGhpcztcbiAgd2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmUoKHN1YkJ1aWxkZXIpID0+IHtcbiAgICAgIGNvbnN0IHN1Ykdyb3VwID0gbmV3IFdoZXJlR3JvdXA8VFRhYmxlcz4oc3ViQnVpbGRlcik7XG4gICAgICBjYWxsYmFjayhzdWJHcm91cCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgb3JXaGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IHRoaXM7XG4gIG9yV2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZSgoc3ViQnVpbGRlcikgPT4ge1xuICAgICAgY29uc3Qgc3ViR3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihzdWJCdWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKHN1Ykdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG4vLyBKT0lOIOygiCDqt7jro7nsl5DripQgTGVmdOyZgCBSaWdodOyXkCDrjIDtlZwg7Iic7ISc6rCAIO2VhOyalO2VmOyngCDslYrsnLzrr4DroZwsIOuqqOuToCDqsr3smrDsnZgg7IiY66W8IOqzhOyCsO2VtOyVvO2VqC5cbmV4cG9ydCBjbGFzcyBKb2luQ2xhdXNlR3JvdXA8XG4gIFRMZWZ0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgVFJpZ2h0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pixcbj4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNhbGxiYWNrOiBLbmV4LkpvaW5DbGF1c2UpIHt9XG5cbiAgLy8gT04oQU5EKTog7Lus65+8ID0g7Lus65+8XG4gIG9uKGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+KTogdGhpcztcbiAgb24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LCByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4pOiB0aGlzO1xuICAvLyBPTihBTkQpOiDsu6zrn7wgPSDqsJJcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRMZWZ0LCBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIG9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VFJpZ2h0LCBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBPTihBTkQpOiDsu6zrn7wgKOyXsOyCsOyekCkg7Lus65+8XG4gIG9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgKTogdGhpcztcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICApOiB0aGlzO1xuICAvLyBPTihBTkQpOiDsu6zrn7wgKOyXsOyCsOyekCkg6rCSXG4gIG9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRMZWZ0LCBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIG9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUUmlnaHQsIEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy9nOuwsVxuICBvbihjYWxsYmFjazogKG5lc3RlZDogSm9pbkNsYXVzZUdyb3VwPFRMZWZ0LCBUUmlnaHQ+KSA9PiB2b2lkKTogdGhpcztcbiAgb24oY2FsbGJhY2s6IChuZXN0ZWQ6IEpvaW5DbGF1c2VHcm91cDxUUmlnaHQsIFRMZWZ0PikgPT4gdm9pZCk6IHRoaXM7XG4gIC8vIE9OKEFORCkg6rWs7ZiEXG4gIG9uKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgdGhpcy5jYWxsYmFjay5vbiguLi4oYXJncyBhcyBbc3RyaW5nLCBzdHJpbmddKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBPTihPUik6IOy7rOufvCA9IOy7rOufvFxuICBvck9uKGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+KTogdGhpcztcbiAgb3JPbihsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0Pik6IHRoaXM7XG4gIC8vIE9OKE9SKTog7Lus65+8ID0g6rCSXG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRMZWZ0LCBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUUmlnaHQsIEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKE9SKTog7Lus65+8ICjsl7DsgrDsnpApIOy7rOufvFxuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgKTogdGhpcztcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKE9SKTog7Lus65+8ICjsl7DsgrDsnpApIOqwklxuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRMZWZ0LCBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRSaWdodCwgQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gT04oT1IpOiDsvZzrsLFcbiAgb3JPbihjYWxsYmFjazogKG5lc3RlZDogSm9pbkNsYXVzZUdyb3VwPFRMZWZ0LCBUUmlnaHQ+KSA9PiB2b2lkKTogdGhpcztcbiAgb3JPbihjYWxsYmFjazogKG5lc3RlZDogSm9pbkNsYXVzZUdyb3VwPFRSaWdodCwgVExlZnQ+KSA9PiB2b2lkKTogdGhpcztcbiAgLy8gT04oT1IpIOq1rO2YhFxuICBvck9uKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgdGhpcy5jYWxsYmFjay5vck9uKC4uLihhcmdzIGFzIFtzdHJpbmcsIHN0cmluZ10pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE9OIFZBTChBTkQpOiDsu6zrn7wgPSDqsJIgKOqwkuydhCDsu6zrn7wg7LC47KGw6rCAIOyVhOuLjCDtjIzrnbzrr7jthLDroZwg67CU7J2465SpKVxuICBvblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCB2YWx1ZTogYW55KTogdGhpcztcbiAgb25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLCB2YWx1ZTogYW55KTogdGhpcztcbiAgb25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvblZhbCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgICh0aGlzLmNhbGxiYWNrIGFzIGFueSkub25WYWwoLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBBTkQgT04gVkFMOiBvblZhbOydmCDrqoXsi5zsoIEgYWxpYXMgKEtuZXgg7Zi47ZmYKVxuICBhbmRPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCB2YWx1ZTogYW55KTogdGhpcztcbiAgYW5kT25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBhbmRPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLCB2YWx1ZTogYW55KTogdGhpcztcbiAgYW5kT25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBhbmRPblZhbCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgICh0aGlzLmNhbGxiYWNrIGFzIGFueSkuYW5kT25WYWwoLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBPUiBPTiBWQUw6IE9SIOyhsOqxtOycvOuhnCDqsJIg67CU7J2465SpXG4gIG9yT25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9yT25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvck9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvck9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LCBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLCB2YWx1ZTogYW55KTogdGhpcztcbiAgb3JPblZhbCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgICh0aGlzLmNhbGxiYWNrIGFzIGFueSkub3JPblZhbCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG4vKlxuICBUUmVzb2x2ZWQ6IOy/vOumrCDsi6Ttlokg7ZuEIOuwmO2ZmOuQoCDqsrDqs7wg7YOA7J6FXG4gIFRSZXR1cm5pbmc6IFJFVFVSTklORyDsoIjsl5Ag7IKs7Jqp65CgIO2DgOyehVxuKi9cbmV4cG9ydCBjbGFzcyBSZXNvbHZlZFB1cmk8VFJlc29sdmVkLCBUUmV0dXJuaW5nPiBpbXBsZW1lbnRzIFByb21pc2U8VFJlc29sdmVkPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrbmV4UXVlcnk6IEtuZXguUXVlcnlCdWlsZGVyLFxuICAgIHByaXZhdGUga25leDogS25leCxcbiAgKSB7fVxuXG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiBzdHJpbmcgPSBcIlByb21pc2VcIjtcblxuICB0b1F1ZXJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LnRvUXVlcnkoKTtcbiAgfVxuXG4gIGRlYnVnKCk6IHRoaXMge1xuICAgIGNvbnNvbGUubG9nKGAke2NoYWxrLmN5YW4oXCJbUHVyaSBEZWJ1Z11cIil9ICR7Y2hhbGsueWVsbG93KHRoaXMudG9RdWVyeSgpKX1gKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRoZW48VFJlc3VsdDEgPSBUUmVzb2x2ZWQsIFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVFJlc29sdmVkKSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPikgfCBudWxsLFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCBudWxsLFxuICApOiBQcm9taXNlPFRSZXN1bHQxIHwgVFJlc3VsdDI+IHtcbiAgICBOYWl0ZS50KFwicHVyaTpleGVjdXRlZC1xdWVyeVwiLCB0aGlzLnRvUXVlcnkoKSk7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LnRoZW4ob25mdWxmaWxsZWQgYXMgYW55LCBvbnJlamVjdGVkKTtcbiAgfVxuXG4gIGNhdGNoPFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCBudWxsLFxuICApOiBQcm9taXNlPFRSZXNvbHZlZCB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LmNhdGNoKG9ucmVqZWN0ZWQpO1xuICB9XG5cbiAgZmluYWxseShvbmZpbmFsbHk/OiAoKCkgPT4gdm9pZCkgfCBudWxsKTogUHJvbWlzZTxUUmVzb2x2ZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkuZmluYWxseShvbmZpbmFsbHkpO1xuICB9XG5cbiAgLy8gT04gQ09ORkxJQ1QgLSDsu6zrn7wg6riw67CYXG4gIG9uQ29uZmxpY3Q8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFRSZXR1cm5pbmc+PihcbiAgICBjb2x1bW5zOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBhY3Rpb24/OiBPbkNvbmZsaWN0QWN0aW9uPFRUYWJsZXM+LFxuICApOiB0aGlzIHtcbiAgICBjb25zdCB0YXJnZXQgPSBBcnJheS5pc0FycmF5KGNvbHVtbnMpID8gY29sdW1ucyA6IFtjb2x1bW5zXTtcblxuICAgIGlmICghYWN0aW9uIHx8IGFjdGlvbiA9PT0gXCJub3RoaW5nXCIpIHtcbiAgICAgIC8vIERPIE5PVEhJTkdcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9uQ29uZmxpY3QodGFyZ2V0KS5pZ25vcmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRE8gVVBEQVRFXG4gICAgICBjb25zdCB7IHVwZGF0ZSB9ID0gYWN0aW9uO1xuXG4gICAgICAvLyBhY3Rpb24udXBkYXRlIOuwsOyXtCDtmJXtg5wgOiBbXCJuYW1lXCIsIFwiZW1haWxcIl1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHVwZGF0ZSkpIHtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkub25Db25mbGljdCh0YXJnZXQpLm1lcmdlKHVwZGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhY3Rpb24udXBkYXRlIOqwneyytCDtmJXtg5w6IHsgbmFtZTogXCJKb2huXCIsIGNvdW50OiByYXcoLi4uKSB9XG4gICAgICAgIGNvbnN0IG1lcmdlT2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModXBkYXRlKSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIFwiX3R5cGVcIiBpbiB2YWx1ZSAmJlxuICAgICAgICAgICAgdmFsdWUuX3R5cGUgPT09IFwic3FsX2V4cHJlc3Npb25cIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gU3FsRXhwcmVzc2lvbiDihpIga25leC5yYXcoKeuhnCDrs4DtmZhcbiAgICAgICAgICAgIG1lcmdlT2JqW2tleV0gPSB0aGlzLmtuZXgucmF3KCh2YWx1ZSBhcyBTcWxFeHByZXNzaW9uPGFueT4pLl9zcWwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDsnbzrsJgg6rCSXG4gICAgICAgICAgICBtZXJnZU9ialtrZXldID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5rbmV4UXVlcnkub25Db25mbGljdCh0YXJnZXQpLm1lcmdlKG1lcmdlT2JqKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFJFVFVSTklORzogXCIqXCIgLSDsoITssrQg7Lus65+8XG4gIHJldHVybmluZyhjb2x1bW46IFwiKlwiKTogUmVzb2x2ZWRQdXJpPFRSZXR1cm5pbmdbXSwgbmV2ZXI+O1xuICAvLyBSRVRVUk5JTkc6IOuLqOydvCDsu6zrn7xcbiAgcmV0dXJuaW5nPFRDb2x1bW4gZXh0ZW5kcyBDb2x1bW5LZXlzPFRSZXR1cm5pbmc+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICk6IFJlc29sdmVkUHVyaTxQaWNrPFRSZXR1cm5pbmcsIFRDb2x1bW4+W10sIG5ldmVyPjtcbiAgLy8gUkVUVVJOSU5HOiDrs7XsiJgg7Lus65+8ICjrsLDsl7QpXG4gIHJldHVybmluZzxUQ29sdW1uIGV4dGVuZHMgQ29sdW1uS2V5czxUUmV0dXJuaW5nPj4oXG4gICAgY29sdW1uczogVENvbHVtbltdLFxuICApOiBSZXNvbHZlZFB1cmk8UGljazxUUmV0dXJuaW5nLCBUQ29sdW1uPltdLCBuZXZlcj47XG4gIC8vIFJFVFVSTklORyDqtaztmIRcbiAgcmV0dXJuaW5nKGNvbHVtbk9yQ29sdW1uczogc3RyaW5nIHwgc3RyaW5nW10pOiBSZXNvbHZlZFB1cmk8YW55W10sIG5ldmVyPiB7XG4gICAgdGhpcy5rbmV4UXVlcnkucmV0dXJuaW5nKGNvbHVtbk9yQ29sdW1ucyk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUE2REEsU0FBUyx1QkFBdUIsVUFBa0M7Q0FDaEUsTUFBTSxhQUFhLFVBQVUsS0FBSyxLQUFLO0NBQ3ZDLE1BQU0sZ0JBQWdCLGdCQUFnQixNQUFNLGNBQWMsY0FBYyxVQUFVO0NBRWxGLElBQUksQ0FBQyxlQUNILE1BQU0sSUFBSSxNQUFNLDJCQUEyQixZQUFZLElBQUk7Q0FHN0QsT0FBTztBQUNUO0FBRUEsU0FBUywwQkFBMEIsWUFBa0MsT0FBNkI7Q0FDaEcsSUFBSSxjQUFjLFNBQVMsY0FBYyxRQUN2QyxNQUFNLElBQUksTUFBTSw0QkFBNEIsV0FBVztDQUd6RCxPQUFPO0FBQ1Q7QUFFQSxTQUFTLHNCQUFzQixPQUF3RDtDQUNyRixJQUFJLFVBQVUsUUFDWjtDQUdGLElBQUksVUFBVSxXQUFXLFVBQVUsUUFDakMsTUFBTSxJQUFJLE1BQU0sd0JBQXdCLE9BQU87Q0FHakQsT0FBTztBQUNUO0FBRUEsU0FBUyxrQkFBa0IsT0FBa0M7Q0FDM0QsSUFBSSxDQUFDLE9BQ0gsT0FBTztDQUdULE9BQU8sVUFBVSxNQUFNLFlBQVk7QUFDckM7QUFFQSxTQUFTLGlCQUFpQixPQUE2RDtDQUNyRixPQUFPLE1BQU0sUUFBUSxLQUFLO0FBQzVCO0FBRUEsU0FBUyxnQkFBZ0IsT0FBZ0U7Q0FDdkYsT0FBTyxPQUFPLFVBQVUsWUFBWSxXQUFXLFNBQVMsTUFBTSxVQUFVO0FBQzFFOzs7cUJBbEd3RDtZQUVsQjtpQkE4QlE7Q0FvRWpDLE9BQWIsTUFBYSxLQUE0RDtFQVE5RDtFQVBUO0VBQ0EsWUFBc0M7RUFLdEMsWUFDRSxNQUNBLG1CQUNB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
975
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVyaS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvcHVyaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBveGxpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovIC8vIFB1cmnripQg64uk7JaR7ZWcIO2DgOyeheydhCDsgqzsmqntlZjqs6Ag7J6I7Iq164uI64ukLlxuXG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIFRhYmxlU3BlYyB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyB0eXBlIENsZWFyU3RhdGVtZW50cyB9IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIEF2YWlsYWJsZUNvbHVtbnMsXG4gIHR5cGUgQ29sdW1uS2V5cyxcbiAgdHlwZSBDb21wYXJpc29uT3BlcmF0b3IsXG4gIHR5cGUgRXhwYW5kLFxuICB0eXBlIEV4dHJhY3RDb2x1bW5UeXBlLFxuICB0eXBlIEZ1bGx0ZXh0Q29sdW1ucyxcbiAgdHlwZSBGdXp6eU9wZXJhdG9yLFxuICB0eXBlIEluc2VydERhdGEsXG4gIHR5cGUgSW5zZXJ0UmVzdWx0LFxuICB0eXBlIEpzb25Db2x1bW5zLFxuICB0eXBlIEpzb25TdXBlcnNldFZhbHVlLFxuICB0eXBlIExlZnRKb2luZWRNYXJrZXIsXG4gIHR5cGUgTGVmdEpvaW5NYXJrZXJGb3IsXG4gIHR5cGUgTnVtZXJpY0NvbHVtbnMsXG4gIHR5cGUgT25Db25mbGljdEFjdGlvbixcbiAgdHlwZSBQYXJzZVNlbGVjdE9iamVjdCxcbiAgdHlwZSBSZXN1bHRBdmFpbGFibGVDb2x1bW5zLFxuICB0eXBlIFNlbGVjdEFsbFJlc3VsdCxcbiAgdHlwZSBTZWxlY3RPYmplY3QsXG4gIHR5cGUgU2luZ2xlVGFibGVWYWx1ZSxcbiAgdHlwZSBTcWxFeHByZXNzaW9uLFxuICB0eXBlIFRzSGlnaGxpZ2h0T3B0aW9ucyxcbiAgdHlwZSBUc1F1ZXJ5Q29uZmlnLFxuICB0eXBlIFRzUXVlcnlPcHRpb25zLFxuICB0eXBlIFRzUmFua09wdGlvbnMsXG4gIHR5cGUgVmVjdG9yQ29sdW1ucyxcbiAgdHlwZSBXaGVyZUNvbmRpdGlvbixcbiAgdHlwZSBXaGVyZU9wZXJhdG9yLFxufSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5pbXBvcnQgeyBGVVpaWV9PUEVSQVRPUlMgfSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5cbnR5cGUgUHVyaU9yZGVyQnlEaXJlY3Rpb24gPSBcImFzY1wiIHwgXCJkZXNjXCI7XG50eXBlIFB1cmlPcmRlckJ5TnVsbHMgPSBcImZpcnN0XCIgfCBcImxhc3RcIjtcbnR5cGUgUHVyaU9yZGVyQnlFeHByZXNzaW9uID0gU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj47XG50eXBlIFB1cmlPcmRlckJ5SXRlbTxUQ29sdW1uIGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgY29sdW1uOiBUQ29sdW1uIHwgUHVyaU9yZGVyQnlFeHByZXNzaW9uO1xuICBvcmRlcj86IFB1cmlPcmRlckJ5RGlyZWN0aW9uO1xuICBudWxscz86IFB1cmlPcmRlckJ5TnVsbHM7XG59O1xudHlwZSBQdXJpT3JkZXJCeUVudHJ5PFRDb2x1bW4gZXh0ZW5kcyBzdHJpbmc+ID1cbiAgfCBUQ29sdW1uXG4gIHwgUHVyaU9yZGVyQnlFeHByZXNzaW9uXG4gIHwgUHVyaU9yZGVyQnlJdGVtPFRDb2x1bW4+O1xudHlwZSBQdXJpT3JkZXJCeVJ1bnRpbWVJdGVtID0ge1xuICBjb2x1bW46IHN0cmluZyB8IFB1cmlPcmRlckJ5RXhwcmVzc2lvbjtcbiAgb3JkZXI/OiBQdXJpT3JkZXJCeURpcmVjdGlvbjtcbiAgbnVsbHM/OiBQdXJpT3JkZXJCeU51bGxzO1xufTtcbnR5cGUgUHVyaU9yZGVyQnlSdW50aW1lRW50cnkgPSBzdHJpbmcgfCBQdXJpT3JkZXJCeUV4cHJlc3Npb24gfCBQdXJpT3JkZXJCeVJ1bnRpbWVJdGVtO1xuXG5mdW5jdGlvbiBub3JtYWxpemVGdXp6eU9wZXJhdG9yKG9wZXJhdG9yPzogc3RyaW5nKTogRnV6enlPcGVyYXRvciB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBvcGVyYXRvcj8udHJpbSgpID8/IFwiPCVcIjtcbiAgY29uc3QgZnV6enlPcGVyYXRvciA9IEZVWlpZX09QRVJBVE9SUy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZSA9PT0gbm9ybWFsaXplZCk7XG5cbiAgaWYgKCFmdXp6eU9wZXJhdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZ1enp5IG9wZXJhdG9yOiAke29wZXJhdG9yID8/IFwiXCJ9YCk7XG4gIH1cblxuICByZXR1cm4gZnV6enlPcGVyYXRvcjtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplSnNvblN1cGVyc2V0VmFsdWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuXG4gIGlmIChzZXJpYWxpemVkID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgXCJQdXJpIEpTT05CIGNvbnRhaW5tZW50IHZhbHVlIG11c3QgYmUgSlNPTi1zZXJpYWxpemFibGU7IEpTT04uc3RyaW5naWZ5IHJldHVybmVkIHVuZGVmaW5lZC5cIixcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9yZGVyQnlEaXJlY3Rpb24oZGlyZWN0aW9uOiBQdXJpT3JkZXJCeURpcmVjdGlvbiA9IFwiYXNjXCIpOiBQdXJpT3JkZXJCeURpcmVjdGlvbiB7XG4gIGlmIChkaXJlY3Rpb24gIT09IFwiYXNjXCIgJiYgZGlyZWN0aW9uICE9PSBcImRlc2NcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvcmRlciBkaXJlY3Rpb246ICR7ZGlyZWN0aW9ufWApO1xuICB9XG5cbiAgcmV0dXJuIGRpcmVjdGlvbjtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplT3JkZXJCeU51bGxzKG51bGxzPzogUHVyaU9yZGVyQnlOdWxscyk6IFB1cmlPcmRlckJ5TnVsbHMgfCB1bmRlZmluZWQge1xuICBpZiAobnVsbHMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAobnVsbHMgIT09IFwiZmlyc3RcIiAmJiBudWxscyAhPT0gXCJsYXN0XCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb3JkZXIgbnVsbHM6ICR7bnVsbHN9YCk7XG4gIH1cblxuICByZXR1cm4gbnVsbHM7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdE51bGxzU3VmZml4KG51bGxzPzogUHVyaU9yZGVyQnlOdWxscyk6IHN0cmluZyB7XG4gIGlmICghbnVsbHMpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIHJldHVybiBgIE5VTExTICR7bnVsbHMudG9VcHBlckNhc2UoKX1gO1xufVxuXG5mdW5jdGlvbiBpc09yZGVyQnlFbnRyaWVzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgcmVhZG9ubHkgUHVyaU9yZGVyQnlSdW50aW1lRW50cnlbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNTcWxFeHByZXNzaW9uKHZhbHVlOiBQdXJpT3JkZXJCeVJ1bnRpbWVFbnRyeSk6IHZhbHVlIGlzIFB1cmlPcmRlckJ5RXhwcmVzc2lvbiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgXCJfdHlwZVwiIGluIHZhbHVlICYmIHZhbHVlLl90eXBlID09PSBcInNxbF9leHByZXNzaW9uXCI7XG59XG5cbmV4cG9ydCBjbGFzcyBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBUUmVzdWx0PiB7XG4gIHByaXZhdGUga25leFF1ZXJ5OiBLbmV4LlF1ZXJ5QnVpbGRlcjtcbiAgcHJpdmF0ZSB0YWJsZVNwZWM6IFRhYmxlU3BlYyB8IG51bGwgPSBudWxsO1xuXG4gIC8vIOyDneyEseyekCDsi5zqt7jri4jsspjrk6RcbiAgY29uc3RydWN0b3Ioa25leDogS25leCwgdGFibGVOYW1lOiBzdHJpbmcpO1xuICBjb25zdHJ1Y3RvcihrbmV4OiBLbmV4LCB0YWJsZVNvdXJjZTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUHVyaTxUU2NoZW1hLCBhbnksIGFueT4+KTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGtuZXg6IEtuZXgsXG4gICAgdGFibGVOYW1lT3JTb3VyY2U6IGFueSxcbiAgKSB7XG4gICAgaWYgKHR5cGVvZiB0YWJsZU5hbWVPclNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgLy8gQ2FzZTogbmV3IFB1cmkoa25leCwgXCJ1c2Vyc1wiKVxuICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXgodGFibGVOYW1lT3JTb3VyY2UpLmZyb20odGFibGVOYW1lT3JTb3VyY2UpO1xuICAgICAgdGhpcy50YWJsZVNwZWMgPSB0aGlzLnNhZmVHZXRUYWJsZVNwZWModGFibGVOYW1lT3JTb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRhYmxlTmFtZU9yU291cmNlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFibGVOYW1lT3JTb3VyY2UpO1xuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRhYmxlIHNwZWMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGVudHJ5XCIpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KGVudHJpZXNbMF0pO1xuICAgICAgY29uc3QgW2FsaWFzLCBzb3VyY2VdID0gZW50cmllc1swXTtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5ID0gdGhpcy5rbmV4KHNvdXJjZSkuZnJvbSh7IFthbGlhc106IHNvdXJjZSB9KTtcbiAgICAgICAgdGhpcy50YWJsZVNwZWMgPSB0aGlzLnNhZmVHZXRUYWJsZVNwZWMoc291cmNlKTtcbiAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHVyaSkge1xuICAgICAgICBjb25zdCBzdWJxdWVyeUJ1aWxkZXIgPSBzb3VyY2UucmF3UXVlcnkoKTtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXguZnJvbShzdWJxdWVyeUJ1aWxkZXIuYXMoYWxpYXMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdGFibGUgc3BlY2lmaWNhdGlvblwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0YWJsZSBzcGVjaWZpY2F0aW9uXCIpO1xuICAgIH1cbiAgfVxuXG4gIHNhZmVHZXRUYWJsZVNwZWModGFibGVOYW1lOiBzdHJpbmcpOiBUYWJsZVNwZWMgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEVudGl0eU1hbmFnZXIuZ2V0VGFibGVTcGVjKHRhYmxlTmFtZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0aWMgU1FMIGhlbHBlciBmdW5jdGlvbnMgZm9yIFNFTEVDVFxuICBzdGF0aWMgY291bnQoY29sdW1uOiBzdHJpbmcgPSBcIipcIik6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBDT1VOVCg/Pyk6OmludGVnZXJgLFxuICAgICAgX3BhcmFtczogW2NvbHVtbl0sXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgc3VtKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYFNVTSg/PylgLFxuICAgICAgX3BhcmFtczogW2NvbHVtbl0sXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgYXZnKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYEFWRyg/PylgLFxuICAgICAgX3BhcmFtczogW2NvbHVtbl0sXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgbWF4KGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYE1BWCg/PylgLFxuICAgICAgX3BhcmFtczogW2NvbHVtbl0sXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgbWluKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYE1JTig/PylgLFxuICAgICAgX3BhcmFtczogW2NvbHVtbl0sXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgY29uY2F0KC4uLmFyZ3M6IHN0cmluZ1tdKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogYENPTkNBVCgke2FyZ3MubWFwKCgpID0+IFwiP1wiKS5qb2luKFwiLCBcIil9KWAsXG4gICAgICBfcGFyYW1zOiBhcmdzLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIHVwcGVyKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogXCJVUFBFUig/PylcIixcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIGxvd2VyKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogXCJMT1dFUig/PylcIixcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgd29yZFNpbWlsYXJpdHkoXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIGlmICh0eXBlb2YgY29sdW1uID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgICBfc3FsOiBcIndvcmRfc2ltaWxhcml0eSg/LCA/PylcIixcbiAgICAgICAgX3BhcmFtczogW3F1ZXJ5LCBjb2x1bW5dLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgd29yZF9zaW1pbGFyaXR5KD8sICR7Y29sdW1uLl9zcWx9KWAsXG4gICAgICBfcGFyYW1zOiBbcXVlcnksIC4uLmNvbHVtbi5fcGFyYW1zXSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHNpbWlsYXJpdHkoXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIGlmICh0eXBlb2YgY29sdW1uID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgICBfc3FsOiBcInNpbWlsYXJpdHkoPz8sID8pXCIsXG4gICAgICAgIF9wYXJhbXM6IFtjb2x1bW4sIHF1ZXJ5XSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYHNpbWlsYXJpdHkoJHtjb2x1bW4uX3NxbH0sID8pYCxcbiAgICAgIF9wYXJhbXM6IFsuLi5jb2x1bW4uX3BhcmFtcywgcXVlcnldLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgc3RyaWN0V29yZFNpbWlsYXJpdHkoXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIGlmICh0eXBlb2YgY29sdW1uID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgICBfc3FsOiBgc3RyaWN0X3dvcmRfc2ltaWxhcml0eSg/LCA/PylgLFxuICAgICAgICBfcGFyYW1zOiBbcXVlcnksIGNvbHVtbl0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBzdHJpY3Rfd29yZF9zaW1pbGFyaXR5KD8sICR7Y29sdW1uLl9zcWx9KWAsXG4gICAgICBfcGFyYW1zOiBbcXVlcnksIC4uLmNvbHVtbi5fcGFyYW1zXSxcbiAgICB9O1xuICB9XG5cbiAgLy8gUmF3IGZ1bmN0aW9ucyBmb3IgU0VMRUNUXG4gIHN0YXRpYyByYXdTdHJpbmcoc3FsOiBzdHJpbmcsIHBhcmFtczogS25leC5SYXdCaW5kaW5nW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwic3RyaW5nXCIsIF9zcWw6IHNxbCwgX3BhcmFtczogcGFyYW1zIH07XG4gIH1cblxuICBzdGF0aWMgcmF3U3RyaW5nQXJyYXkoc3FsOiBzdHJpbmcsIHBhcmFtczogS25leC5SYXdCaW5kaW5nW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdbXVwiPiB7XG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJzdHJpbmdbXVwiLCBfc3FsOiBzcWwsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgc3RhdGljIHJhd051bWJlcihzcWw6IHN0cmluZywgcGFyYW1zOiBLbmV4LlJhd0JpbmRpbmdbXSA9IFtdKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJudW1iZXJcIiwgX3NxbDogc3FsLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIHN0YXRpYyByYXdCb29sZWFuKHNxbDogc3RyaW5nLCBwYXJhbXM6IEtuZXguUmF3QmluZGluZ1tdID0gW10pOiBTcWxFeHByZXNzaW9uPFwiYm9vbGVhblwiPiB7XG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJib29sZWFuXCIsIF9zcWw6IHNxbCwgX3BhcmFtczogcGFyYW1zIH07XG4gIH1cblxuICBzdGF0aWMgcmF3RGF0ZShzcWw6IHN0cmluZywgcGFyYW1zOiBLbmV4LlJhd0JpbmRpbmdbXSA9IFtdKTogU3FsRXhwcmVzc2lvbjxcImRhdGVcIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwiZGF0ZVwiLCBfc3FsOiBzcWwsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZUUyDqsoDsg4nslrQg7ZWY7J2065287J207YyFXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC5zZWxlY3Qoe1xuICAgKiAgIHRpdGxlOiBQdXJpLmhpZ2hsaWdodChcInBvc3RzLnRpdGxlXCIsIHNlYXJjaCksXG4gICAqICAgY29udGVudDogUHVyaS5oaWdobGlnaHQoXCJwb3N0cy5jb250ZW50XCIsIHNlYXJjaCwge1xuICAgKiAgICAgc3RhcnRTZWw6IFwiPG1hcms+XCIsXG4gICAqICAgICBzdG9wU2VsOiBcIjwvbWFyaz5cIixcbiAgICogICAgIG1heEZyYWdtZW50czogMyxcbiAgICogICB9KSxcbiAgICogfSlcbiAgICovXG4gIHN0YXRpYyB0c0hpZ2hsaWdodChcbiAgICBjb2x1bW46IHN0cmluZyxcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIF9vcHRpb25zPzogVHNIaWdobGlnaHRPcHRpb25zLFxuICApOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHtcbiAgICBjb25zdCB7IHBhcnNlciA9IFwid2Vic2VhcmNoX3RvX3RzcXVlcnlcIiwgY29uZmlnID0gXCJzaW1wbGVcIiwgLi4ub3B0aW9ucyB9ID0gX29wdGlvbnMgPz8ge307XG5cbiAgICBjb25zdCBobE9wdGlvblBhcnRzID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucykubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHJldHVybiBgJHtpbmZsZWN0aW9uLmNhbWVsaXplKGtleSl9PSR7dmFsdWV9YDtcbiAgICB9KTtcblxuICAgIGNvbnN0IGhsT3B0aW9ucyA9IGhsT3B0aW9uUGFydHMubGVuZ3RoID4gMCA/IGAsICcke2hsT3B0aW9uUGFydHMuam9pbihcIiwgXCIpfSdgIDogXCJcIjtcblxuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJzdHJpbmdcIixcbiAgICAgIF9zcWw6IGB0c19oZWFkbGluZSg/LCA/PywgJHtwYXJzZXJ9KD8sID8pJHtobE9wdGlvbnN9KWAsXG4gICAgICBfcGFyYW1zOiBbY29uZmlnLCBjb2x1bW4sIGNvbmZpZywgcXVlcnldLFxuICAgIH07XG4gIH1cblxuICAvLyB0c19yYW5rXG4gIHN0YXRpYyB0c1JhbmsoXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTcWxFeHByZXNzaW9uPFwidHN2ZWN0b3JcIj4sXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNSYW5rT3B0aW9ucyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIFB1cmkuX3RzUmFuayhcInRzX3JhbmtcIiwgY29sdW1uLCBxdWVyeSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyB0c19yYW5rX2NkXG4gIHN0YXRpYyB0c1JhbmtDZChcbiAgICBjb2x1bW46IHN0cmluZyB8IFNxbEV4cHJlc3Npb248XCJ0c3ZlY3RvclwiPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUc1JhbmtPcHRpb25zLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4gUHVyaS5fdHNSYW5rKFwidHNfcmFua19jZFwiLCBjb2x1bW4sIHF1ZXJ5LCBvcHRpb25zKTtcbiAgfVxuXG4gIHN0YXRpYyB0b1RzVmVjdG9yKGNvbHVtbjogc3RyaW5nLCBjb25maWc6IHN0cmluZyA9IFwic2ltcGxlXCIpOiBTcWxFeHByZXNzaW9uPFwidHN2ZWN0b3JcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJ0c3ZlY3RvclwiLFxuICAgICAgX3NxbDogYHRvX3RzdmVjdG9yKD8sID8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29uZmlnLCBjb2x1bW5dLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgX3RzUmFuayhcbiAgICB0eXBlOiBcInRzX3JhbmtcIiB8IFwidHNfcmFua19jZFwiLFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3FsRXhwcmVzc2lvbjxcInRzdmVjdG9yXCI+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFRzUmFua09wdGlvbnMsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHBhcnNlciA9IFwid2Vic2VhcmNoX3RvX3RzcXVlcnlcIixcbiAgICAgIGNvbmZpZyA9IFwic2ltcGxlXCIsXG4gICAgICBub3JtYWxpemF0aW9uLFxuICAgICAgd2VpZ2h0cyxcbiAgICB9ID0gb3B0aW9ucyA/PyB7fTtcblxuICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xuICAgIGxldCBzcWxUZW1wbGF0ZSA9IGAke3R5cGV9KGA7XG5cbiAgICBpZiAod2VpZ2h0cykge1xuICAgICAgc3FsVGVtcGxhdGUgKz0gYEFSUkFZWyR7d2VpZ2h0cy5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKX1dOjpmbG9hdDRbXSwgYDtcbiAgICAgIHBhcmFtcy5wdXNoKC4uLndlaWdodHMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29sdW1uID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBzcWxUZW1wbGF0ZSArPSBgPz8sICR7cGFyc2VyfSg/LCA/KWA7XG4gICAgICBwYXJhbXMucHVzaChjb2x1bW4sIGNvbmZpZywgcXVlcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcWxUZW1wbGF0ZSArPSBgJHtjb2x1bW4uX3NxbH0sICR7cGFyc2VyfSg/LCA/KWA7XG4gICAgICBwYXJhbXMucHVzaCguLi5jb2x1bW4uX3BhcmFtcywgY29uZmlnLCBxdWVyeSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6YXRpb24pIHtcbiAgICAgIHNxbFRlbXBsYXRlICs9IFwiLCA/XCI7XG4gICAgICBwYXJhbXMucHVzaChub3JtYWxpemF0aW9uKTtcbiAgICB9XG5cbiAgICBzcWxUZW1wbGF0ZSArPSBcIilcIjtcblxuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwibnVtYmVyXCIsIF9zcWw6IHNxbFRlbXBsYXRlLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQR3Jvb25nYSBGdWxsVGV4dCDsnbjrjbHsiqQg6rKA7IOJIOygkOyImFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAuc2VsZWN0KHtcbiAgICogICBzY29yZTogUHVyaS5zY29yZSgpLFxuICAgKiB9KVxuICAgKi9cbiAgc3RhdGljIHNjb3JlKCk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiBQdXJpLnJhd051bWJlcihcInBncm9vbmdhX3Njb3JlKHRhYmxlb2lkLCBjdGlkKVwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQR3Jvb25nYSBGdWxsVGV4dCDsnbjrjbHsiqQg6rKA7IOJIO2VmOydtOudvOydtO2MhVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAuc2VsZWN0KHtcbiAgICogICB0aXRsZTogUHVyaS5oaWdobGlnaHQoXCJwb3N0cy50aXRsZVwiLCBzZWFyY2gpLFxuICAgKiB9KVxuICAgKi9cbiAgc3RhdGljIGhpZ2hsaWdodChjb2x1bW46IHN0cmluZywgcXVlcnk6IHN0cmluZyB8IHN0cmluZ1tdKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPjtcbiAgc3RhdGljIGhpZ2hsaWdodChjb2x1bW5zOiBzdHJpbmdbXSwgcXVlcnk6IHN0cmluZyB8IHN0cmluZ1tdKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1tdXCI+O1xuXG4gIHN0YXRpYyBoaWdobGlnaHQoXG4gICAgY29sdW1uT3JDb2x1bW5zOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBxdWVyeTogc3RyaW5nIHwgc3RyaW5nW10sXG4gICk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4gfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nW11cIj4ge1xuICAgIGNvbnN0IHF1ZXJ5QXJyID0gQXJyYXkuaXNBcnJheShxdWVyeSkgPyBxdWVyeSA6IFtxdWVyeV07XG4gICAgY29uc3QgcXVlcnlDbGF1c2UgPSBgQVJSQVlbJHtxdWVyeUFyci5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKX1dYDtcblxuICAgIC8vIOuLqOydvCDsu6zrn7zsnbgg6rK97JqwXG4gICAgaWYgKHR5cGVvZiBjb2x1bW5PckNvbHVtbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBQdXJpLnJhd1N0cmluZyhgcGdyb29uZ2FfaGlnaGxpZ2h0X2h0bWwoPz8sICR7cXVlcnlDbGF1c2V9KWAsIFtcbiAgICAgICAgY29sdW1uT3JDb2x1bW5zLFxuICAgICAgICAuLi5xdWVyeUFycixcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIC8vIOy7rOufvCDrsLDsl7Tsnbgg6rK97JqwXG4gICAgcmV0dXJuIFB1cmkucmF3U3RyaW5nQXJyYXkoXG4gICAgICBgcGdyb29uZ2FfaGlnaGxpZ2h0X2h0bWwoQVJSQVlbJHtjb2x1bW5PckNvbHVtbnMubWFwKCgpID0+IFwiPz9cIikuam9pbihcIiwgXCIpfV0sICR7cXVlcnlDbGF1c2V9KWAsXG4gICAgICBbLi4uY29sdW1uT3JDb2x1bW5zLCAuLi5xdWVyeUFycl0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNFTEVDVCAob3ZlcndyaXRlKVxuICBzZWxlY3Q8VFNlbGVjdCBleHRlbmRzIFNlbGVjdE9iamVjdDxUVGFibGVzPj4oXG4gICAgc2VsZWN0T2JqOiBUU2VsZWN0LFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFBhcnNlU2VsZWN0T2JqZWN0PFRUYWJsZXMsIFRTZWxlY3Q+PiB7XG4gICAgLy8g7KSR7LKpIOqwneyytOulvCBmbGF07ZWY6rKMIOuzgO2ZmFxuICAgIGNvbnN0IGZsYXRTZWxlY3QgPSB0aGlzLmZsYXR0ZW5TZWxlY3Qoc2VsZWN0T2JqKTtcblxuICAgIGNvbnN0IHNlbGVjdENsYXVzZXM6IChzdHJpbmcgfCBLbmV4LlJhdylbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbYWxpYXMsIGNvbHVtbk9yRnVuY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKGZsYXRTZWxlY3QpKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbHVtbk9yRnVuY3Rpb24gPT09IFwib2JqZWN0XCIgJiYgY29sdW1uT3JGdW5jdGlvbi5fdHlwZSA9PT0gXCJzcWxfZXhwcmVzc2lvblwiKSB7XG4gICAgICAgIC8vIFNRTCDtlajsiJjsnbgg6rK97JqwXG4gICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChcbiAgICAgICAgICB0aGlzLmtuZXgucmF3KGAke2NvbHVtbk9yRnVuY3Rpb24uX3NxbH0gQVMgXCIke2FsaWFzfVwiYCwgY29sdW1uT3JGdW5jdGlvbi5fcGFyYW1zKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOydvOuwmCDsu6zrn7zsnbgg6rK97JqwXG4gICAgICAgIGNvbnN0IGNvbHVtblBhdGggPSBjb2x1bW5PckZ1bmN0aW9uIGFzIHN0cmluZztcbiAgICAgICAgaWYgKGFsaWFzID09PSBjb2x1bW5QYXRoKSB7XG4gICAgICAgICAgLy8gYWxpYXPsmYAg7Lus65+866qF7J20IOqwmeycvOuptCBhbGlhcyDsg53rnrVcbiAgICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goY29sdW1uUGF0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gYWxpYXMg7KeA7KCVXG4gICAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKGAke2NvbHVtblBhdGh9IEFTICR7YWxpYXN9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3Qoc2VsZWN0Q2xhdXNlcyk7XG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIOykkeyyqSDqsJ3ssrTrpbwgZmxhdCDqsJ3ssrTroZwg67OA7ZmYXG4gICAqIOyYiDogeyBwYXJlbnQ6IHsgaWQ6IFwicGFyZW50LmlkXCIsIG5hbWU6IFwicGFyZW50Lm5hbWVcIiB9IH1cbiAgICogICDihpIgeyBwYXJlbnRfX2lkOiBcInBhcmVudC5pZFwiLCBwYXJlbnRfX25hbWU6IFwicGFyZW50Lm5hbWVcIiB9XG4gICAqL1xuICBwcml2YXRlIGZsYXR0ZW5TZWxlY3Qoc2VsZWN0T2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwcmVmaXggPSBcIlwiKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgZmxhdFNlbGVjdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2VsZWN0T2JqKSkge1xuICAgICAgY29uc3QgZnVsbEtleSA9IHByZWZpeCA/IGAke3ByZWZpeH1fXyR7a2V5fWAgOiBrZXk7XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgIShcIl90eXBlXCIgaW4gdmFsdWUpKSB7XG4gICAgICAgIC8vIOykkeyyqSDqsJ3ssrTsnbgg6rK97JqwIC0g7J6s6reAIOyymOumrFxuICAgICAgICBjb25zdCBuZXN0ZWQgPSB0aGlzLmZsYXR0ZW5TZWxlY3QodmFsdWUsIGZ1bGxLZXkpO1xuICAgICAgICBPYmplY3QuYXNzaWduKGZsYXRTZWxlY3QsIG5lc3RlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDsnbzrsJgg6rCS7J24IOqyveyasCAo7Lus65+8IOqyveuhnCDrmJDripQgU3FsRXhwcmVzc2lvbilcbiAgICAgICAgZmxhdFNlbGVjdFtmdWxsS2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmbGF0U2VsZWN0O1xuICB9XG5cbiAgLy8gU0VMRUNUIChzZWxlY3TripQgb3ZlcndyaXRlLCBhcHBlbmRTZWxlY3TripQgYXBwZW5kKVxuICBhcHBlbmRTZWxlY3Q8VFNlbGVjdCBleHRlbmRzIFNlbGVjdE9iamVjdDxUVGFibGVzPj4oXG4gICAgc2VsZWN0T2JqOiBUU2VsZWN0LFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFRSZXN1bHQgJiBQYXJzZVNlbGVjdE9iamVjdDxUVGFibGVzLCBUU2VsZWN0Pj4ge1xuICAgIC8vIOykkeyyqSDqsJ3ssrTrpbwgZmxhdO2VmOqyjCDrs4DtmZhcbiAgICBjb25zdCBmbGF0U2VsZWN0ID0gdGhpcy5mbGF0dGVuU2VsZWN0KHNlbGVjdE9iaik7XG5cbiAgICBjb25zdCBzZWxlY3RDbGF1c2VzOiAoc3RyaW5nIHwgS25leC5SYXcpW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgW2FsaWFzLCBjb2x1bW5PckZ1bmN0aW9uXSBvZiBPYmplY3QuZW50cmllcyhmbGF0U2VsZWN0KSkge1xuICAgICAgaWYgKHR5cGVvZiBjb2x1bW5PckZ1bmN0aW9uID09PSBcIm9iamVjdFwiICYmIGNvbHVtbk9yRnVuY3Rpb24uX3R5cGUgPT09IFwic3FsX2V4cHJlc3Npb25cIikge1xuICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goXG4gICAgICAgICAgdGhpcy5rbmV4LnJhdyhgJHtjb2x1bW5PckZ1bmN0aW9uLl9zcWx9IEFTICR7YWxpYXN9YCwgY29sdW1uT3JGdW5jdGlvbi5fcGFyYW1zKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvbHVtblBhdGggPSBjb2x1bW5PckZ1bmN0aW9uIGFzIHN0cmluZztcbiAgICAgICAgaWYgKGFsaWFzID09PSBjb2x1bW5QYXRoKSB7XG4gICAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKGNvbHVtblBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdENsYXVzZXMucHVzaCh0aGlzLmtuZXgucmVmKGNvbHVtblBhdGgpLmFzKGFsaWFzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3Qoc2VsZWN0Q2xhdXNlcyk7XG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8gU0VMRUNUICpcbiAgc2VsZWN0QWxsKCk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgU2VsZWN0QWxsUmVzdWx0PFRUYWJsZXM+PiB7XG4gICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KFwiKlwiKTtcbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBESVNUSU5DVFxuICBkaXN0aW5jdDxUQ29sdW1ucyBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KC4uLmNvbHVtbnM6IFRDb2x1bW5zW10pOiB0aGlzO1xuICBkaXN0aW5jdCguLi5jb2x1bW5zOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LmRpc3RpbmN0KC4uLmNvbHVtbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gQ0xFQVJcbiAgY2xlYXIoc3RhdGVtZW50OiBDbGVhclN0YXRlbWVudHMpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5jbGVhcihzdGF0ZW1lbnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8ga25leOyXkCDsl4bslrTshJwg7KeB7KCRIOq1rO2YhO2VqFxuICBjbGVhckpvaW4oYWxpYXM6IHN0cmluZyk6IHRoaXMge1xuICAgICh0aGlzLmtuZXhRdWVyeSBhcyBhbnkpLl9zdGF0ZW1lbnRzID0gKHRoaXMua25leFF1ZXJ5IGFzIGFueSkuX3N0YXRlbWVudHMuZmlsdGVyKChzOiBhbnkpID0+IHtcbiAgICAgIGlmIChcImpvaW5UeXBlXCIgaW4gcykge1xuICAgICAgICBjb25zdCBbX2FsaWFzLCBfdGFibGVdID0gT2JqZWN0LmVudHJpZXMocy50YWJsZSlbMF07XG4gICAgICAgIHJldHVybiBfYWxpYXMgIT09IGFsaWFzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBKT0lOOiDshJzruIzsv7zrpqwgKyBBbGlhc1xuICBqb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTdWJSZXN1bHQ+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+LCAvLyDshJzruIzsv7zrpqzsnZggVFJlc3VsdFxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gSk9JTjog7YWM7J2067iUICsgQWxpYXNcbiAgam9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCAvLyBUVGFibGVzIO2ZleyepSFcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIEpPSU46IO2FjOydtOu4lOuqhVxuICBqb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hPihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5UYWJsZSAmIHN0cmluZ30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCAvLyDthYzsnbTruJTrqoXsnbQg7YKkXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBKT0lOOiDshJzruIzsv7zrpqwgKyBBbGlhcyArIOy9nOuwsVxuICBqb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+LCBUUmVzdWx0PjtcbiAgLy8gSk9JTjog7YWM7J2067iUICsgQWxpYXMgKyDsvZzrsLFcbiAgam9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCBUUmVzdWx0PjtcbiAgLy8gSk9JTjog7YWM7J2067iU66qFICsg7L2c67CxXG4gIGpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4sIFRSZXN1bHQ+O1xuICAvLyBKT0lOIOyLpOygnCDqtaztmIRcbiAgam9pbih0YWJsZU5hbWVPclNwZWM6IGFueSwgLi4uYXJnczogYW55W10pOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9fY29tbW9uSm9pbihcImpvaW5cIiwgdGFibGVOYW1lT3JTcGVjLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8vIExFRlQgSk9JTjog7ISc67iM7L+866asICsgQWxpYXNcbiAgbGVmdEpvaW48VEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZywgVFN1YlJlc3VsdD4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD4gfSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pbkFsaWFzfS4ke0NvbHVtbktleXM8VFN1YlJlc3VsdD59YCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQgJiBMZWZ0Sm9pbmVkTWFya2VyPiwgVFJlc3VsdD47IC8vIOyEnOu4jOy/vOumrOydmCBUUmVzdWx0XG4gIC8vIExFRlQgSk9JTjog7YWM7J2067iUICsgQWxpYXNcbiAgLy8gRksgbnVsbGFibGUg7Jes67aA7JeQIOuUsOudvCDsnpDrj5nsnLzroZwgTGVmdEpvaW5lZE1hcmtlciDqsrDsoJVcbiAgbGVmdEpvaW48XG4gICAgVEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsXG4gICAgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZyxcbiAgICBUTGVmdCBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gID4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgbGVmdDogVExlZnQsXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5NYXJrZXJGb3I8VFRhYmxlcywgVExlZnQ+PixcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIExFRlQgSk9JTjog7YWM7J2067iU66qFXG4gIGxlZnRKb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLCBUTGVmdCBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBsZWZ0OiBUTGVmdCxcbiAgICByaWdodDogYCR7VEpvaW5UYWJsZSAmIHN0cmluZ30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBMZWZ0Sm9pbk1hcmtlckZvcjxUVGFibGVzLCBUTGVmdD4+LFxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gTEVGVCBKT0lOOiDshJzruIzsv7zrpqwgKyBBbGlhcyArIOy9nOuwsVxuICBsZWZ0Sm9pbjxUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLCBUU3ViUmVzdWx0PihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFB1cmk8VFNjaGVtYSwgYW55LCBUU3ViUmVzdWx0PiB9LFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0Pj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0ICYgTGVmdEpvaW5lZE1hcmtlcj4sIFRSZXN1bHQ+O1xuICAvLyBMRUZUIEpPSU46IO2FjOydtOu4lCArIEFsaWFzICsg7L2c67CxXG4gIGxlZnRKb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLCBUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nPihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFRKb2luVGFibGUgfSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXT4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXSAmIExlZnRKb2luZWRNYXJrZXI+LCBUUmVzdWx0PjtcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJTrqoUgKyDsvZzrsLFcbiAgbGVmdEpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXSAmIExlZnRKb2luZWRNYXJrZXI+LCBUUmVzdWx0PjtcbiAgLy8gTEVGVCBKT0lOIOyLpOygnCDqtaztmIRcbiAgbGVmdEpvaW4odGFibGVOYW1lT3JTcGVjOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fX2NvbW1vbkpvaW4oXCJsZWZ0Sm9pblwiLCB0YWJsZU5hbWVPclNwZWMsIC4uLmFyZ3MpO1xuICB9XG5cbiAgX19jb21tb25Kb2luKGpvaW5UeXBlOiBcImpvaW5cIiB8IFwibGVmdEpvaW5cIiwgdGFibGVOYW1lT3JTcGVjOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgaWYgKHR5cGVvZiB0YWJsZU5hbWVPclNwZWMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIC8vIENhc2UgMTogam9pbihcInBvc3RzXCIsIC4uLilcbiAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRhYmxlTmFtZU9yU3BlYztcblxuICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmdzWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgLy8gam9pbihcInBvc3RzXCIsIGNhbGxiYWNrKVxuICAgICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXSh0YWJsZU5hbWUsIChqb2luQ2xhdXNlKSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2sobmV3IEpvaW5DbGF1c2VHcm91cChqb2luQ2xhdXNlKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gam9pbihcInBvc3RzXCIsIGxlZnQsIHJpZ2h0KVxuICAgICAgICBjb25zdCBbbGVmdCwgcmlnaHRdID0gYXJncztcbiAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHRhYmxlTmFtZSwgbGVmdCwgcmlnaHQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRhYmxlTmFtZU9yU3BlYyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgLy8gQ2FzZSAyOiBqb2luKHsgYWxpYXM6IFwidGFibGVcIiB9LCAuLi4pIG9yIGpvaW4oeyBhbGlhczogc3VicXVlcnkgfSwgLi4uKVxuICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRhYmxlTmFtZU9yU3BlYyk7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGFibGUgc3BlYyBtdXN0IGhhdmUgZXhhY3RseSBvbmUgZW50cnlcIik7XG4gICAgICB9XG4gICAgICBhc3NlcnQoZW50cmllc1swXSk7XG4gICAgICBjb25zdCBbW2FsaWFzLCBzcGVjXV0gPSBlbnRyaWVzO1xuXG4gICAgICBpZiAodHlwZW9mIHNwZWMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgLy8g7YWM7J2067iUOiBqb2luKHsgcDogXCJwb3N0c1wiIH0sIC4uLilcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmdzWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAvLyBDYWxsYmFja1xuICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gYXJnc1swXTtcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0oeyBbYWxpYXNdOiBzcGVjIH0sIChqb2luQ2xhdXNlKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgSm9pbkNsYXVzZUdyb3VwKGpvaW5DbGF1c2UpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTaW1wbGVcbiAgICAgICAgICBjb25zdCBbbGVmdCwgcmlnaHRdID0gYXJncztcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0oeyBbYWxpYXNdOiBzcGVjIH0sIGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzcGVjIGluc3RhbmNlb2YgUHVyaSkge1xuICAgICAgICAvLyDshJzruIzsv7zrpqw6IGpvaW4oeyBzcTogc3VicXVlcnkgfSwgLi4uKVxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIENhbGxiYWNrXG4gICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzWzBdO1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXShzcGVjLnJhd1F1ZXJ5KCkuYXMoYWxpYXMpLCAoam9pbkNsYXVzZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEpvaW5DbGF1c2VHcm91cChqb2luQ2xhdXNlKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2ltcGxlXG4gICAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHNwZWMucmF3UXVlcnkoKS5hcyhhbGlhcyksIGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0YWJsZSBzcGVjaWZpY2F0aW9uXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50c1wiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFOiDqsJ3ssrQgLSDsgqzsmqk6IC53aGVyZSh7IFwidS5pZFwiOiAxLCBcInUuc3RhdHVzXCI6IFwiYWN0aXZlXCIgfSlcbiAgd2hlcmUoY29uZGl0aW9uczogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiB0aGlzO1xuICAvLyBXSEVSRTog7Lus65+8IC0g7IKs7JqpOiAud2hlcmUoXCJ1LmlkXCIsIDEpLCAud2hlcmUoXCJ1LmlkXCIsIG51bGwpXG4gIHdoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBXSEVSRTog7Lus65+8IC0g7IKs7JqpOiAud2hlcmUoXCJ1LmlkXCIsIFwiPlwiLCAxMCksIC53aGVyZShcInUuaWRcIiwgXCIhPVwiLCBudWxsKVxuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIG9wZXJhdG9yOiBXaGVyZU9wZXJhdG9yLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gV0hFUkU6IFNRTCDtkZztmITsi50gLSDsgqzsmqk6IC53aGVyZShwdXJpLnJhdyhcIkNPTkNBVCh1Lm5hbWUsIHUuZW1haWwpXCIpLCBcImxpa2VcIiwgXCIldGVzdCVcIilcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEtuZXguUmF3Pihjb2x1bW46IFRDb2x1bW4sIG9wZXJhdG9yOiBXaGVyZU9wZXJhdG9yLCB2YWx1ZTogYW55KTogdGhpcztcbiAgLy8gV0hFUkU6IOy7rOufvCAtIOyCrOyaqTogLndoZXJlKFwidS5pZFwiLCBcImxpa2VcIiwgXCIldGVzdCVcIilcbiAgd2hlcmUoLi4uYXJnczogW2NvbHVtbk9yQ29uZGl0aW9uczogYW55LCBvcGVyYXRvck9yVmFsdWU/OiBhbnksIHZhbHVlPzogYW55XSk6IHRoaXMge1xuICAgIGNvbnN0IFtjb2x1bW5PckNvbmRpdGlvbnMsIG9wZXJhdG9yT3JWYWx1ZSwgdmFsdWVdID0gYXJncztcbiAgICBpZiAodHlwZW9mIGNvbHVtbk9yQ29uZGl0aW9ucyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmUoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKG9wZXJhdG9yT3JWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU51bGwoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMsIG9wZXJhdG9yT3JWYWx1ZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBpZiAob3BlcmF0b3JPclZhbHVlID09PSBcIiE9XCIpIHtcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU5vdE51bGwoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvck9yVmFsdWUgPT09IFwiPVwiKSB7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVOdWxsKGNvbHVtbk9yQ29uZGl0aW9ucyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKGNvbHVtbk9yQ29uZGl0aW9ucywgb3BlcmF0b3JPclZhbHVlLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKGNvbHVtbk9yQ29uZGl0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgSU5cbiAgd2hlcmVJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0PiB7XG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVJbihjb2x1bW4sIHZhbHVlcyk7XG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8gV0hFUkUgTk9UIElOXG4gIHdoZXJlTm90SW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+W10sXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4ge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTm90SW4oY29sdW1uLCB2YWx1ZXMpO1xuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8vIFdIRVJFIEpTT05CIFNVUEVSU0VUIChAPilcbiAgd2hlcmVKc29uU3VwZXJzZXRPZjxUQ29sdW1uIGV4dGVuZHMgSnNvbkNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogSnNvblN1cGVyc2V0VmFsdWU8RXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbj4+LFxuICApOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZUpzb25TdXBlcnNldE9mKGNvbHVtbiwgc2VyaWFsaXplSnNvblN1cGVyc2V0VmFsdWUodmFsdWUpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIE1BVENIXG4gIHdoZXJlTWF0Y2g8VENvbHVtbiBleHRlbmRzIEZ1bGx0ZXh0Q29sdW1uczxUVGFibGVzPj4oY29sdW1uOiBUQ29sdW1uLCB2YWx1ZTogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYE1BVENIICgke1N0cmluZyhjb2x1bW4pfSkgQUdBSU5TVCAoPylgLCBbdmFsdWVdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQR3Jvb25nYSBGdWxsVGV4dCDsnbjrjbHsiqQg6rKA7IOJXG4gICAqIC0g7IKs7Jqp7ZWgIFBHcm9vbmdhIOyduOuNseyKpOyZgCDrj5nsnbztlZwg7Lus65+8IOq1rOyEseycvOuhnCDqsoDsg4ntlbTslbwg7J24642x7Iqk6rCAIOyCrOyaqeuQqeuLiOuLpC5cbiAgICpcbiAgICog64uo7J28IOy7rOufvCDqsoDsg4k6XG4gICAqIGBgYHNxbFxuICAgKiBXSEVSRSBuYW1lICZAfiAnc2VhcmNoJ1xuICAgKiBgYGBcbiAgICpcbiAgICog67O17ZWpIOy7rOufvCDqsoDsg4k6XG4gICAqIGBgYHNxbFxuICAgKiBXSEVSRSBBUlJBWVtuYW1lOjp0ZXh0LCBkZXNjcmlwdGlvbjo6dGV4dF0gJkB+ICdzZWFyY2gnXG4gICAqIGBgYFxuICAgKi9cbiAgd2hlcmVTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbiB8IFRDb2x1bW5bXSxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICB3ZWlnaHRzPzogbnVtYmVyW107IC8vIOygleyImCDrsLDsl7RcbiAgICB9LFxuICApOiB0aGlzIHtcbiAgICBjb25zdCB7IHdlaWdodHMgfSA9IG9wdGlvbnMgPz8ge307XG4gICAgY29uc3QgY29sdW1uRXhwciA9IEFycmF5LmlzQXJyYXkoY29sdW1uKVxuICAgICAgPyBgQVJSQVlbJHtjb2x1bW4ubWFwKChjKSA9PiBgJHtjfTo6dGV4dGApLmpvaW4oXCIsXCIpfV1gXG4gICAgICA6IGNvbHVtbjtcbiAgICBjb25zdCBwZ3Jvb25nYUNvbmRpdGlvbiA9IGBwZ3Jvb25nYV9jb25kaXRpb24oPyR7d2VpZ2h0cz8ubGVuZ3RoID8gYCwgd2VpZ2h0cyA9PiBBUlJBWVske3dlaWdodHMuam9pbihcIixcIil9XWAgOiBcIlwifSlgO1xuXG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYCR7Y29sdW1uRXhwcn0gJkB+ICR7cGdyb29uZ2FDb25kaXRpb259YCwgW3ZhbHVlXSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIEZVTExURVhUXG4gIHdoZXJlVHNTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNRdWVyeU9wdGlvbnMgfCBUc1F1ZXJ5Q29uZmlnLFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBvcHRzID1cbiAgICAgIHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiID8gKHsgY29uZmlnOiBvcHRpb25zIH0gYXMgVHNRdWVyeU9wdGlvbnMpIDogKG9wdGlvbnMgPz8ge30pO1xuXG4gICAgY29uc3QgcGFyc2VyID0gb3B0cy5wYXJzZXIgPz8gXCJ3ZWJzZWFyY2hfdG9fdHNxdWVyeVwiO1xuICAgIGNvbnN0IGNvbmZpZyA9IG9wdHMuY29uZmlnID8/IFwic2ltcGxlXCI7XG4gICAgY29uc3QgY29sdW1uRXhwciA9XG4gICAgICB0eXBlb2YgY29sdW1uID09PSBcIm9iamVjdFwiICYmIGNvbHVtbi5fdHlwZSA9PT0gXCJzcWxfZXhwcmVzc2lvblwiXG4gICAgICAgID8gY29sdW1uLl9zcWxcbiAgICAgICAgOiBTdHJpbmcoY29sdW1uKTtcblxuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGAke2NvbHVtbkV4cHJ9IEBAICR7cGFyc2VyfSg/LCA/KWAsIFtjb25maWcsIHZhbHVlXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB3aGVyZUZ1enp5PFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+IHwgU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIG9wZXJhdG9yPzogRnV6enlPcGVyYXRvcjtcbiAgICB9LFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBvcGVyYXRvciA9IG5vcm1hbGl6ZUZ1enp5T3BlcmF0b3Iob3B0aW9ucz8ub3BlcmF0b3IpO1xuXG4gICAgaWYgKG9wZXJhdG9yID09PSBcIiVcIikge1xuICAgICAgaWYgKHR5cGVvZiBjb2x1bW4gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYCR7Y29sdW1uLl9zcWx9ICR7b3BlcmF0b3J9ID9gLCBbLi4uY29sdW1uLl9wYXJhbXMsIHZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgPz8gJHtvcGVyYXRvcn0gP2AsIFtjb2x1bW4sIHZhbHVlXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbHVtbiA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gJHtjb2x1bW4uX3NxbH1gLCBbdmFsdWUsIC4uLmNvbHVtbi5fcGFyYW1zXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGA/ICR7b3BlcmF0b3J9ID8/YCwgW3ZhbHVlLCBjb2x1bW5dKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBSQVdcbiAgd2hlcmVSYXcoc3FsOiBzdHJpbmcsIGJpbmRpbmdzPzogcmVhZG9ubHkgS25leC5SYXdCaW5kaW5nW10pOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhzcWwsIGJpbmRpbmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIOq0hO2YuCDqt7jro7ntlZFcbiAgd2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZSgoYnVpbGRlcikgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihidWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKGdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcldoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkub3JXaGVyZSgoYnVpbGRlcikgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihidWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKGdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE9SREVSIEJZIChTcWxFeHByZXNzaW9u7Jy866Gc64+EIO2VoCDsiJgg7J6I7Ja07JW8IO2VqClcbiAgb3JkZXJCeTxUQ29sdW1uIGV4dGVuZHMgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oXG4gICAgY29sdW1uOiBUQ29sdW1uIHwgUHVyaU9yZGVyQnlFeHByZXNzaW9uLFxuICAgIGRpcmVjdGlvbj86IFB1cmlPcmRlckJ5RGlyZWN0aW9uLFxuICAgIG51bGxzPzogUHVyaU9yZGVyQnlOdWxscyxcbiAgKTogdGhpcztcbiAgb3JkZXJCeTxUQ29sdW1uIGV4dGVuZHMgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oXG4gICAgY29sdW1uczogcmVhZG9ubHkgUHVyaU9yZGVyQnlFbnRyeTxUQ29sdW1uPltdLFxuICApOiB0aGlzO1xuICBvcmRlckJ5KFxuICAgIGNvbHVtbk9yQ29sdW1uczogc3RyaW5nIHwgUHVyaU9yZGVyQnlFeHByZXNzaW9uIHwgcmVhZG9ubHkgUHVyaU9yZGVyQnlSdW50aW1lRW50cnlbXSxcbiAgICBkaXJlY3Rpb246IFB1cmlPcmRlckJ5RGlyZWN0aW9uID0gXCJhc2NcIixcbiAgICBudWxscz86IFB1cmlPcmRlckJ5TnVsbHMsXG4gICk6IHRoaXMge1xuICAgIGlmIChpc09yZGVyQnlFbnRyaWVzKGNvbHVtbk9yQ29sdW1ucykpIHtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgY29sdW1uT3JDb2x1bW5zKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIgfHwgaXNTcWxFeHByZXNzaW9uKGVudHJ5KSkge1xuICAgICAgICAgIHRoaXMuYXBwbHlPcmRlckJ5KGVudHJ5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFwcGx5T3JkZXJCeShlbnRyeS5jb2x1bW4sIGVudHJ5Lm9yZGVyLCBlbnRyeS5udWxscyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMuYXBwbHlPcmRlckJ5KGNvbHVtbk9yQ29sdW1ucywgZGlyZWN0aW9uLCBudWxscyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5T3JkZXJCeShcbiAgICBjb2x1bW46IHN0cmluZyB8IFB1cmlPcmRlckJ5RXhwcmVzc2lvbixcbiAgICBkaXJlY3Rpb24/OiBQdXJpT3JkZXJCeURpcmVjdGlvbixcbiAgICBudWxscz86IFB1cmlPcmRlckJ5TnVsbHMsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWREaXJlY3Rpb24gPSBub3JtYWxpemVPcmRlckJ5RGlyZWN0aW9uKGRpcmVjdGlvbik7XG4gICAgY29uc3Qgbm9ybWFsaXplZE51bGxzID0gbm9ybWFsaXplT3JkZXJCeU51bGxzKG51bGxzKTtcblxuICAgIGlmICh0eXBlb2YgY29sdW1uID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS5vcmRlckJ5UmF3KFxuICAgICAgICBgJHtjb2x1bW4uX3NxbH0gJHtub3JtYWxpemVkRGlyZWN0aW9ufSR7Zm9ybWF0TnVsbHNTdWZmaXgobm9ybWFsaXplZE51bGxzKX1gLFxuICAgICAgICBjb2x1bW4uX3BhcmFtcyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9yZGVyQnkoY29sdW1uLCBub3JtYWxpemVkRGlyZWN0aW9uLCBub3JtYWxpemVkTnVsbHMpO1xuICAgIH1cbiAgfVxuXG4gIGZvclVwZGF0ZSgpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5mb3JVcGRhdGUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZvclNoYXJlKCk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LmZvclNoYXJlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog67Kh7YSwIOycoOyCrOuPhCDqsoDsg4kg7ISk7KCVXG4gICAqXG4gICAqIC0gU0VMRUNU7JeQIHNpbWlsYXJpdHkg7Lus65+8IOy2lOqwgFxuICAgKiAtIFdIRVJFIGNvbCBJUyBOT1QgTlVMTCDstpTqsIBcbiAgICogLSB0aHJlc2hvbGTqsIAg7J6I7Jy866m0IFdIRVJFIOyhsOqxtCDstpTqsIBcbiAgICogLSDquLDsobQgT1JERVIgQlnrpbwgY2xlYXLtlZjqs6Ag7JuQ7IucIOyXsOyCsOyekOuhnCDsoJXroKwgKEhOU1cg7J24642x7IqkIOy1nOygge2ZlClcbiAgICpcbiAgICogQHBhcmFtIGNvbHVtbiDrsqHthLAg7Lus65+8IOqyveuhnFxuICAgKiBAcGFyYW0gZW1iZWRkaW5nIOy/vOumrCDsnoTrsqDrlKkg67Kh7YSwXG4gICAqIEBwYXJhbSBvcHRpb25zIG1ldGhvZCwgdGhyZXNob2xkLCBhcyDrk7Eg7Ji17IWYXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gY29zaW5lIHNpbWlsYXJpdHkgKOq4sOuzuOqwkilcbiAgICogcWIudmVjdG9yU2ltaWxhcml0eShcImNvbHVtbk5hbWVcIiwgcXVlcnlWZWN0b3IsIHtcbiAgICogICBtZXRob2Q6IFwiY29zaW5lXCIsXG4gICAqICAgdGhyZXNob2xkOiAwLjVcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIEwyIGRpc3RhbmNlXG4gICAqIHFiLnZlY3RvclNpbWlsYXJpdHkoXCJjb2x1bW5OYW1lXCIsIHF1ZXJ5VmVjdG9yLCB7XG4gICAqICAgbWV0aG9kOiBcImwyXCIsXG4gICAqICAgdGhyZXNob2xkOiAxLjUgIC8vIOqxsOumrOqwgCAxLjUg7J207ZWY7J24IOqysOqzvOunjFxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gSW5uZXIgcHJvZHVjdFxuICAgKiBxYi52ZWN0b3JTaW1pbGFyaXR5KFwiY29sdW1uTmFtZVwiLCBxdWVyeVZlY3Rvciwge1xuICAgKiAgIG1ldGhvZDogXCJpbm5lcl9wcm9kdWN0XCIsXG4gICAqICAgdGhyZXNob2xkOiAwLjdcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgdmVjdG9yU2ltaWxhcml0eShcbiAgICBjb2x1bW46IFZlY3RvckNvbHVtbnM8VFRhYmxlcz4sXG4gICAgZW1iZWRkaW5nOiBudW1iZXJbXSxcbiAgICBvcHRpb25zOiB7XG4gICAgICBtZXRob2Q/OiBcImNvc2luZVwiIHwgXCJsMlwiIHwgXCJpbm5lcl9wcm9kdWN0XCI7XG4gICAgICB0aHJlc2hvbGQ/OiBudW1iZXI7XG4gICAgICBkaXN0aW5jdE9uPzogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPjtcbiAgICB9ID0ge30sXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdCAmIHsgc2ltaWxhcml0eTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB7IG1ldGhvZCA9IFwiY29zaW5lXCIsIHRocmVzaG9sZCwgZGlzdGluY3RPbiB9ID0gb3B0aW9ucztcblxuICAgIGlmIChcbiAgICAgICFBcnJheS5pc0FycmF5KGVtYmVkZGluZykgfHxcbiAgICAgIGVtYmVkZGluZy5sZW5ndGggPT09IDAgfHxcbiAgICAgIGVtYmVkZGluZy5zb21lKCh2KSA9PiAhTnVtYmVyLmlzRmluaXRlKHYpKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBlbWJlZGRpbmcgdmVjdG9yOiBleHBlY3RlZCBhIG5vbi1lbXB0eSBhcnJheSBvZiBmaW5pdGUgbnVtYmVyc1wiKTtcbiAgICB9XG5cbiAgICBjb25zdCB2ZWN0b3JMaXRlcmFsID0gSlNPTi5zdHJpbmdpZnkoZW1iZWRkaW5nLm1hcCgodikgPT4gTnVtYmVyKHYpKSk7XG4gICAgY29uc3Qgb3BlcmF0b3IgPSB7IGNvc2luZTogXCI8PT5cIiwgbDI6IFwiPC0+XCIsIGlubmVyX3Byb2R1Y3Q6IFwiPCM+XCIgfVttZXRob2RdO1xuXG4gICAgLy8gbWV0aG9k67OEIOyXsOyCsOyekCDrsI8gc2ltaWxhcml0eSDqs4TsgrDsi51cbiAgICAvLyAtIGNvc2luZTogPD0+IChjb3NpbmUgZGlzdGFuY2UsIDB+MiksIHNpbWlsYXJpdHkgPSAxIC0gZGlzdGFuY2VcbiAgICAvLyAtIGwyOiA8LT4gKGV1Y2xpZGVhbiBkaXN0YW5jZSksIHNpbWlsYXJpdHkgPSBkaXN0YW5jZSAo64Ku7J2E7IiY66GdIOycoOyCrClcbiAgICAvLyAtIGlubmVyX3Byb2R1Y3Q6IDwjPiAobmVnYXRpdmUgaW5uZXIgcHJvZHVjdCksIHNpbWlsYXJpdHkgPSAtZGlzdGFuY2UgKOuGkuydhOyImOuhnSDsnKDsgqwpXG4gICAgY29uc3Qgc2ltaWxhcml0eUV4cHIgPVxuICAgICAgbWV0aG9kID09PSBcImNvc2luZVwiXG4gICAgICAgID8gdGhpcy5rbmV4LnJhdyhgMSAtICg/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IpIGFzIHNpbWlsYXJpdHlgLCBbY29sdW1uLCB2ZWN0b3JMaXRlcmFsXSlcbiAgICAgICAgOiBtZXRob2QgPT09IFwibDJcIlxuICAgICAgICAgID8gdGhpcy5rbmV4LnJhdyhgPz8gJHtvcGVyYXRvcn0gPzo6dmVjdG9yIGFzIHNpbWlsYXJpdHlgLCBbY29sdW1uLCB2ZWN0b3JMaXRlcmFsXSlcbiAgICAgICAgICA6IHRoaXMua25leC5yYXcoYC0oPz8gJHtvcGVyYXRvcn0gPzo6dmVjdG9yKSBhcyBzaW1pbGFyaXR5YCwgW2NvbHVtbiwgdmVjdG9yTGl0ZXJhbF0pO1xuXG4gICAgLy8gV0hFUkUgTk9UIE5VTExcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU5vdE51bGwoY29sdW1uKTtcblxuICAgIC8vIOq4sOyhtCBPUkRFUiBCWSBjbGVhclxuICAgIHRoaXMua25leFF1ZXJ5LmNsZWFyKFwib3JkZXJcIik7XG4gICAgaWYgKGRpc3RpbmN0T24pIHtcbiAgICAgIC8vIERJU1RJTkNUIE9O7J2AIFNFTEVDVCDsoIjsnZgg66eoIOyVnuyXkCDsmYDslbwg7ZWY66+A66GcLCDquLDsobQgc2VsZWN0KHN1YnNldCDtlYTrk5zrk6Qp66W8IOuztOyhtCDtm4QgY2xlYXLtlZjqs6Ag64uk7IucIOy2lOqwgFxuICAgICAgY29uc3QgZXhpc3RpbmdTdWJzZXRDb2xzID0gKHRoaXMua25leFF1ZXJ5IGFzIGFueSkuX3N0YXRlbWVudHNcbiAgICAgICAgLmZpbHRlcigoczogYW55KSA9PiBzLmdyb3VwaW5nID09PSBcImNvbHVtbnNcIilcbiAgICAgICAgLmZsYXRNYXAoKHM6IGFueSkgPT4gcy52YWx1ZSk7XG4gICAgICB0aGlzLmtuZXhRdWVyeS5jbGVhcihcInNlbGVjdFwiKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdCh0aGlzLmtuZXgucmF3KGBESVNUSU5DVCBPTiAoPz8pID8/YCwgW2Rpc3RpbmN0T24sIGRpc3RpbmN0T25dKSk7XG4gICAgICBleGlzdGluZ1N1YnNldENvbHMubWFwKChjb2w6IGFueSkgPT4gdGhpcy5rbmV4UXVlcnkuc2VsZWN0KGNvbCkpO1xuICAgICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KHNpbWlsYXJpdHlFeHByKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9yZGVyQnlSYXcoYD8/LCA/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3JgLCBbXG4gICAgICAgIGRpc3RpbmN0T24sXG4gICAgICAgIGNvbHVtbixcbiAgICAgICAgdmVjdG9yTGl0ZXJhbCxcbiAgICAgIF0pO1xuXG4gICAgICB0aGlzLmtuZXhRdWVyeSA9IHRoaXMua25leFxuICAgICAgICAuZnJvbSh0aGlzLmtuZXhRdWVyeS5hcyhcImRpc3RpbmN0X3ZlY3RvcnNcIikpXG4gICAgICAgIC5zZWxlY3QoXCIqXCIpXG4gICAgICAgIC5vcmRlckJ5KFwic2ltaWxhcml0eVwiLCBcImRlc2NcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdChzaW1pbGFyaXR5RXhwcik7XG4gICAgICB0aGlzLmtuZXhRdWVyeS5vcmRlckJ5UmF3KGA/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3JgLCBbY29sdW1uLCB2ZWN0b3JMaXRlcmFsXSk7XG4gICAgfVxuXG4gICAgLy8gdGhyZXNob2xkXG4gICAgaWYgKHR5cGVvZiB0aHJlc2hvbGQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRocmVzaG9sZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZlY3RvclNpbWlsYXJpdHkgdGhyZXNob2xkOiAke3RocmVzaG9sZH1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpc3RpbmN0T24pIHtcbiAgICAgICAgY29uc3QgdGhyZXNob2xkT3AgPSBtZXRob2QgPT09IFwibDJcIiA/IFwiPD1cIiA6IFwiPj1cIjtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmUoXCJzaW1pbGFyaXR5XCIsIHRocmVzaG9sZE9wLCB0aHJlc2hvbGQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdGhyZXNob2xkVmFsdWUgPVxuICAgICAgICAgIG1ldGhvZCA9PT0gXCJjb3NpbmVcIiA/IDEgLSB0aHJlc2hvbGQgOiBtZXRob2QgPT09IFwiaW5uZXJfcHJvZHVjdFwiID8gLXRocmVzaG9sZCA6IHRocmVzaG9sZDtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYD8/ICR7b3BlcmF0b3J9ID86OnZlY3RvciA8PSA/YCwgW1xuICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICB2ZWN0b3JMaXRlcmFsLFxuICAgICAgICAgIHRocmVzaG9sZFZhbHVlLFxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyDquLDrs7gg7L+866asIOuplOyEnOuTnOuTpFxuICBsaW1pdChjb3VudDogbnVtYmVyKTogdGhpcyB7XG4gICAgaWYgKGNvdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsaW1pdDogbXVzdCBiZSA+PSAwXCIpO1xuICAgIH1cbiAgICB0aGlzLmtuZXhRdWVyeS5saW1pdChjb3VudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvZmZzZXQoY291bnQ6IG51bWJlcik6IHRoaXMge1xuICAgIGlmIChjb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgb2Zmc2V0OiBtdXN0IGJlID49IDBcIik7XG4gICAgfVxuICAgIHRoaXMua25leFF1ZXJ5Lm9mZnNldChjb3VudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBHUk9VUCBCWVxuICBncm91cEJ5PFRDb2x1bW5zIGV4dGVuZHMgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oLi4uY29sdW1uczogVENvbHVtbnNbXSk6IHRoaXM7XG4gIGdyb3VwQnkoLi4uY29sdW1uczogc3RyaW5nW10pOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5ncm91cEJ5KC4uLmNvbHVtbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gSEFWSU5HXG4gIGhhdmluZyhjb25kaXRpb246IHN0cmluZyk6IHRoaXM7XG4gIGhhdmluZzxUQ29sdW1uIGV4dGVuZHMgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgdmFsdWU6IGFueSxcbiAgKTogdGhpcztcbiAgLy8gSEFWSU5HIOq1rO2YhFxuICBoYXZpbmcoLi4uY29uZGl0aW9uczogYW55W10pOiB0aGlzIHtcbiAgICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIGhhdmluZyhcIkNPVU5UKCopID4gMTBcIilcbiAgICAgIHRoaXMua25leFF1ZXJ5LmhhdmluZyh0aGlzLmtuZXgucmF3KGNvbmRpdGlvbnNbMF0pKTtcbiAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAzKSB7XG4gICAgICAvLyBoYXZpbmcoXCJjb3VudFwiLCBcIj5cIiwgMTApXG4gICAgICB0aGlzLmtuZXhRdWVyeS5oYXZpbmcoXG4gICAgICAgIHRoaXMua25leC5yYXcoY29uZGl0aW9uc1swXSksXG4gICAgICAgIGNvbmRpdGlvbnNbMV0sXG4gICAgICAgIHRoaXMua25leC5yYXcoY29uZGl0aW9uc1syXSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGhhdmluZyBhcmd1bWVudHNcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g7Iuk7ZaJIOuplOyEnOuTnOuTpCAtIHRoZW5hYmxlIOq1rO2YhFxuICB0aGVuPFRSZXN1bHQxID0gRXhwYW5kPFRSZXN1bHQ+W10sIFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogRXhwYW5kPFRSZXN1bHQ+W10pID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IG51bGwsXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgIE5haXRlLnQoXCJwdXJpOmV4ZWN1dGVkLXF1ZXJ5XCIsIHRoaXMudG9RdWVyeSgpKTtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkudGhlbihvbmZ1bGZpbGxlZCBhcyBhbnksIG9ucmVqZWN0ZWQpO1xuICB9XG4gIGNhdGNoPFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCBudWxsLFxuICApOiBQcm9taXNlPFRSZXN1bHQgfCBUUmVzdWx0Mj4ge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS5jYXRjaChvbnJlamVjdGVkKTtcbiAgfVxuICBmaW5hbGx5KG9uZmluYWxseT86ICgoKSA9PiB2b2lkKSB8IG51bGwpOiBQcm9taXNlPFRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkuZmluYWxseShvbmZpbmFsbHkpO1xuICB9XG5cbiAgLy8g7ZWY64KY66eMIOy/vOumrFxuICBmaXJzdCgpOiBSZXNvbHZlZFB1cmk8RXhwYW5kPFRSZXN1bHQ+LCBuZXZlcj4ge1xuICAgIHRoaXMua25leFF1ZXJ5LmZpcnN0KCk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCk7XG4gIH1cblxuICAvLyDsv7zrpqztlZwg66CI7L2U65Oc7JeQ7IScIO2KueyglSDsu6zrn7zrp4wg7LaU7Lac7ZWcIOuwsOyXtCDrpqzthLRcbiAgcGx1Y2s8VENvbHVtbiBleHRlbmRzIGtleW9mIFRSZXN1bHQgfCBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICk6IFJlc29sdmVkUHVyaTxcbiAgICBUQ29sdW1uIGV4dGVuZHMga2V5b2YgVFJlc3VsdFxuICAgICAgPyBUUmVzdWx0W1RDb2x1bW5dW11cbiAgICAgIDogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgICBuZXZlclxuICA+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5wbHVjayhjb2x1bW4gYXMgc3RyaW5nKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4KTtcbiAgfVxuXG4gIC8vIElOU0VSVCA6IOuLqOydvCDqsJ3ssrRcbiAgaW5zZXJ0KFxuICAgIGRhdGE6IEluc2VydERhdGE8U2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4sXG4gICk6IFJlc29sdmVkUHVyaTxJbnNlcnRSZXN1bHQsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+O1xuICAvLyBJTlNFUlQ6IOuwsOyXtFxuICBpbnNlcnQoXG4gICAgZGF0YTogSW5zZXJ0RGF0YTxTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PltdLFxuICApOiBSZXNvbHZlZFB1cmk8SW5zZXJ0UmVzdWx0LCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PjtcbiAgLy8gSU5TRVJUIOyLpOygnCDqtaztmIRcbiAgaW5zZXJ0KFxuICAgIHJhd0RhdGE6IEluc2VydERhdGE8U2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4gfCBJbnNlcnREYXRhPFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+W10sXG4gICk6IFJlc29sdmVkUHVyaTxJbnNlcnRSZXN1bHQsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+IHtcbiAgICAvLyBKU09OIOy7rOufvCBzdHJpbmdpZnkg66Gc7KeB7J2EIOuplOyEnOuTnOuhnCDrtoTrpqztlZjsl6wg7KSR67O1IOygnOqxsFxuICAgIGNvbnN0IHJlZmluZWREYXRhID0gdGhpcy5yZWZpbmVKc29uQ29sdW1ucyhyYXdEYXRhKTtcbiAgICB0aGlzLmtuZXhRdWVyeS5pbnNlcnQocmVmaW5lZERhdGEpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgpO1xuICB9XG5cbiAgLy8gVVBEQVRFXG4gIHVwZGF0ZShyYXdEYXRhOiBXaGVyZUNvbmRpdGlvbjxUVGFibGVzPik6IFJlc29sdmVkUHVyaTxudW1iZXIsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+IHtcbiAgICAvLyBKU09OIOy7rOufvCBzdHJpbmdpZnkg66Gc7KeB7J2EIOuplOyEnOuTnOuhnCDrtoTrpqztlZjsl6wg7KSR67O1IOygnOqxsFxuICAgIGNvbnN0IHJlZmluZWREYXRhID0gdGhpcy5yZWZpbmVKc29uQ29sdW1ucyhyYXdEYXRhKTtcbiAgICB0aGlzLmtuZXhRdWVyeS51cGRhdGUocmVmaW5lZERhdGEpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04g7Lus65+87JeQIOuMgO2VtCBzdHJpbmdpZnkg7LKY66as66W8IOyImO2Wie2VmOuKlCDrgrTrtoAg66mU7ISc65Oc7J6F64uI64ukLlxuICAgKiBvYmplY3Qg65iQ64qUIG9iamVjdCDrsLDsl7TsnYQg67Cb6rOgLCBKU09OIOy7rOufvOydtCDsnojsnLzrqbQg7KeB66Cs7ZmU7ZWY7JesIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICog7KeB7KCRIOqwkuydhCDrs4Dqsr3tlZjrr4DroZwgc2lkZSBlZmZlY3TqsIAg7J6I7Iq164uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSByZWZpbmVKc29uQ29sdW1ucyhcbiAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG4gICk6IHR5cGVvZiBkYXRhIHtcbiAgICAvLyB0YWJsZVNwZWPsnbTrgpgganNvbkNvbHVtbnMg7JeG64qUIOqyveyasCDrsJTroZwg67CY7ZmYXG4gICAgaWYgKCF0aGlzLnRhYmxlU3BlYyB8fCAhdGhpcy50YWJsZVNwZWMuanNvbkNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvLyDrk7HroZ3rkJwgVGFibGVTcGVj7J2EIO2Gte2VtCBKU09O7Lus65+8IOuqqeuhneydhCDqsIDsoLjsmYAgSlNPTi5zdHJpbmdpZnkg7LKY66asXG4gICAgY29uc3QganNvbkNvbHVtbnMgPSB0aGlzLnRhYmxlU3BlYy5qc29uQ29sdW1ucztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGRhdGEpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YganNvbkNvbHVtbnMpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGl0ZW1bY29sdW1uXTtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaXRlbVtjb2x1bW5dID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBqc29uQ29sdW1ucykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFbY29sdW1uXTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBkYXRhW2NvbHVtbl0gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvLyBJbmNyZW1lbnRcbiAgaW5jcmVtZW50PFRDb2x1bW4gZXh0ZW5kcyBOdW1lcmljQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICk6IFJlc29sdmVkUHVyaTxudW1iZXIsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+IHtcbiAgICBpZiAodmFsdWUgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5jcmVtZW50IHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDBcIik7XG4gICAgfVxuICAgIHRoaXMua25leFF1ZXJ5LmluY3JlbWVudChjb2x1bW4sIHZhbHVlKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4KTtcbiAgfVxuICAvLyBEZWNyZW1lbnRcbiAgZGVjcmVtZW50PFRDb2x1bW4gZXh0ZW5kcyBOdW1lcmljQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICk6IFJlc29sdmVkUHVyaTxudW1iZXIsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+IHtcbiAgICBpZiAodmFsdWUgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGVjcmVtZW50IHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDBcIik7XG4gICAgfVxuICAgIHRoaXMua25leFF1ZXJ5LmRlY3JlbWVudChjb2x1bW4sIHZhbHVlKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4KTtcbiAgfVxuXG4gIC8vIERFTEVURVxuICBkZWxldGUoKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIHRoaXMua25leFF1ZXJ5LmRlbGV0ZSgpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgpO1xuICB9XG5cbiAgLy8g7ZmV7J24IOy/vOumrCDrpqzthLRcbiAgdG9RdWVyeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS50b1F1ZXJ5KCk7XG4gIH1cblxuICAvLyDsv7zrpqwg65SU67KE6rmFIOuhnOq3uCDstpzroKVcbiAgZGVidWcoKTogdGhpcyB7XG4gICAgY29uc29sZS5sb2coYCR7Y2hhbGsuY3lhbihcIltQdXJpIERlYnVnXVwiKX0gJHtjaGFsay55ZWxsb3codGhpcy50b1F1ZXJ5KCkpfWApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY2xvbmUoKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0PiB7XG4gICAgLy8gJ2R1YWwn7J2AIOuNlOuvuCDthYzsnbTruJTsnbTrqbAsIOuwlOuhnCDslYTrnpgg7KSE7JeQ7IScIGtuZXhRdWVyeeqwgCDrja7slrTslIzsm4zsp5Hri4jri6QuXG4gICAgY29uc3QgbmV3UHVyaSA9IG5ldyBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFRSZXN1bHQ+KHRoaXMua25leCwgXCJkdWFsXCIpO1xuICAgIG5ld1B1cmkua25leFF1ZXJ5ID0gdGhpcy5rbmV4UXVlcnkuY2xvbmUoKTtcbiAgICByZXR1cm4gbmV3UHVyaTtcbiAgfVxuXG4gIGZvcm1hdFNRTCh1bmZvcm1hdHRlZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBTUUwg7JiI7JW97Ja0IOuqqeuhnVxuICAgIGNvbnN0IGtleXdvcmRzID0gW1xuICAgICAgXCJTRUxFQ1RcIixcbiAgICAgIFwiRlJPTVwiLFxuICAgICAgXCJXSEVSRVwiLFxuICAgICAgXCJJTlNFUlRcIixcbiAgICAgIFwiSU5UT1wiLFxuICAgICAgXCJWQUxVRVNcIixcbiAgICAgIFwiVVBEQVRFXCIsXG4gICAgICBcIkRFTEVURVwiLFxuICAgICAgXCJDUkVBVEVcIixcbiAgICAgIFwiVEFCTEVcIixcbiAgICAgIFwiQUxURVJcIixcbiAgICAgIFwiRFJPUFwiLFxuICAgICAgXCJKT0lOXCIsXG4gICAgICBcIk9OXCIsXG4gICAgICBcIklOTkVSXCIsXG4gICAgICBcIkxFRlRcIixcbiAgICAgIFwiUklHSFRcIixcbiAgICAgIFwiRlVMTFwiLFxuICAgICAgXCJPVVRFUlwiLFxuICAgICAgXCJHUk9VUFwiLFxuICAgICAgXCJCWVwiLFxuICAgICAgXCJPUkRFUlwiLFxuICAgICAgXCJIQVZJTkdcIixcbiAgICAgIFwiRElTVElOQ1RcIixcbiAgICAgIFwiTElNSVRcIixcbiAgICAgIFwiT0ZGU0VUXCIsXG4gICAgICBcIkFTXCIsXG4gICAgICBcIkFORFwiLFxuICAgICAgXCJPUlwiLFxuICAgICAgXCJOT1RcIixcbiAgICAgIFwiSU5cIixcbiAgICAgIFwiTElLRVwiLFxuICAgICAgXCJJU1wiLFxuICAgICAgXCJOVUxMXCIsXG4gICAgICBcIkNBU0VcIixcbiAgICAgIFwiV0hFTlwiLFxuICAgICAgXCJUSEVOXCIsXG4gICAgICBcIkVMU0VcIixcbiAgICAgIFwiRU5EXCIsXG4gICAgICBcIlVOSU9OXCIsXG4gICAgICBcIkFMTFwiLFxuICAgICAgXCJFWElTVFNcIixcbiAgICAgIFwiQkVUV0VFTlwiLFxuICAgIF07XG5cbiAgICBsZXQgZm9ybWF0dGVkID0gdW5mb3JtYXR0ZWQ7XG5cbiAgICAvLyDsmIjslb3slrTrpbwg64yA66y47J6Q66GcIOuzgO2ZmFxuICAgIGtleXdvcmRzLmZvckVhY2goKGtleXdvcmQpID0+IHtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXFxcXGIke2tleXdvcmR9XFxcXGJgLCBcImdpXCIpO1xuICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UocmVnZXgsIGtleXdvcmQudG9VcHBlckNhc2UoKSk7XG4gICAgfSk7XG5cbiAgICAvLyDso7zsmpQg7KCIIOyVnuyXkCDspITrsJTqv4gg7LaU6rCAXG4gICAgY29uc3QgbWFqb3JDbGF1c2VzID0gW1xuICAgICAgXCJTRUxFQ1RcIixcbiAgICAgIFwiRlJPTVwiLFxuICAgICAgXCJXSEVSRVwiLFxuICAgICAgXCJHUk9VUCBCWVwiLFxuICAgICAgXCJPUkRFUiBCWVwiLFxuICAgICAgXCJIQVZJTkdcIixcbiAgICAgIFwiTElNSVRcIixcbiAgICAgIFwiVU5JT05cIixcbiAgICBdO1xuICAgIG1ham9yQ2xhdXNlcy5mb3JFYWNoKChjbGF1c2UpID0+IHtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXFxcXHMrKCR7Y2xhdXNlfSlcXFxccytgLCBcImdpXCIpO1xuICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UocmVnZXgsIGBcXG4ke2NsYXVzZS50b1VwcGVyQ2FzZSgpfSBgKTtcbiAgICB9KTtcblxuICAgIC8vIEpPSU4g7KCIIOyymOumrFxuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9cXHMrKCg/OklOTkVSfExFRlR8UklHSFR8RlVMTCBPVVRFUilcXHMrKT9KT0lOXFxzKy9naSwgXCJcXG4kMUpPSU4gXCIpO1xuXG4gICAgLy8gQU5ELCBPUiDsobDqsbQg7LKY66asXG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL1xccysoQU5EfE9SKVxccysvZ2ksIFwiXFxuICAkMSBcIik7XG5cbiAgICAvLyDqtITtmLgg7LKY66asIOuwjyDrk6Tsl6zsk7DquLBcbiAgICBjb25zdCBsaW5lcyA9IGZvcm1hdHRlZC5zcGxpdChcIlxcblwiKTtcbiAgICBjb25zdCBpbmRlbnRlZExpbmVzID0gW107XG4gICAgbGV0IGluZGVudExldmVsID0gMDtcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICAgIGlmICghdHJpbW1lZExpbmUpIGNvbnRpbnVlO1xuXG4gICAgICAvLyDri6vripQg6rSE7Zi46rCAIOyeiOycvOuptCDrk6Tsl6zsk7DquLAg66CI67KoIOqwkOyGjFxuICAgICAgY29uc3QgY2xvc2luZ1BhcmVucyA9ICh0cmltbWVkTGluZS5tYXRjaCgvXFwpL2cpIHx8IFtdKS5sZW5ndGg7XG4gICAgICBjb25zdCBvcGVuaW5nUGFyZW5zID0gKHRyaW1tZWRMaW5lLm1hdGNoKC9cXCgvZykgfHwgW10pLmxlbmd0aDtcblxuICAgICAgaWYgKGNsb3NpbmdQYXJlbnMgPiAwICYmIG9wZW5pbmdQYXJlbnMgPT09IDApIHtcbiAgICAgICAgaW5kZW50TGV2ZWwgPSBNYXRoLm1heCgwLCBpbmRlbnRMZXZlbCAtIGNsb3NpbmdQYXJlbnMpO1xuICAgICAgfVxuXG4gICAgICAvLyDtmITsnqwg65Ok7Jes7JOw6riwIOyggeyaqVxuICAgICAgY29uc3QgaW5kZW50ID0gXCIgIFwiLnJlcGVhdChpbmRlbnRMZXZlbCk7XG4gICAgICBpbmRlbnRlZExpbmVzLnB1c2goaW5kZW50ICsgdHJpbW1lZExpbmUpO1xuXG4gICAgICAvLyDsl6zripQg6rSE7Zi46rCAIOyeiOycvOuptCDrk6Tsl6zsk7DquLAg66CI67KoIOymneqwgFxuICAgICAgaWYgKG9wZW5pbmdQYXJlbnMgPiBjbG9zaW5nUGFyZW5zKSB7XG4gICAgICAgIGluZGVudExldmVsICs9IG9wZW5pbmdQYXJlbnMgLSBjbG9zaW5nUGFyZW5zO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbmRlbnRlZExpbmVzLmpvaW4oXCJcXG5cIikudHJpbSgpO1xuICB9XG5cbiAgcmF3KHNxbDogc3RyaW5nKTogS25leC5SYXcge1xuICAgIHJldHVybiB0aGlzLmtuZXgucmF3KHNxbCk7XG4gIH1cblxuICAvLyBLbmV4IOy/vOumrCDruYzrjZQg7KeB7KCRIOygkeq3vFxuICByYXdRdWVyeSgpOiBLbmV4LlF1ZXJ5QnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBXaGVyZUdyb3VwPFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYnVpbGRlcjogS25leC5RdWVyeUJ1aWxkZXIpIHt9XG5cbiAgLy8gd2hlcmUg66mU7ISc65Oc65OkXG4gIHdoZXJlKGNvbmRpdGlvbnM6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogdGhpcztcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIHdoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgb3BlcmF0b3I6IFdoZXJlT3BlcmF0b3IsXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICB3aGVyZSguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZShhcmdzWzBdLCAuLi5hcmdzLnNsaWNlKDEpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHdoZXJlSW4gLyB3aGVyZU5vdEluIOuplOyEnOuTnOuTpFxuICB3aGVyZUluPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWVzOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPltdLFxuICApOiB0aGlzO1xuICB3aGVyZUluKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlSW4oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB3aGVyZU5vdEluPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWVzOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPltdLFxuICApOiB0aGlzO1xuICB3aGVyZU5vdEluKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlTm90SW4oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBvcldoZXJlIOuplOyEnOuTnOuTpFxuICBvcldoZXJlKGNvbmRpdGlvbnM6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogdGhpcztcbiAgb3JXaGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb3JXaGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIG9wZXJhdG9yOiBXaGVyZU9wZXJhdG9yLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb3JXaGVyZSguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlKGFyZ3NbMF0sIC4uLmFyZ3Muc2xpY2UoMSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gb3JXaGVyZUluIC8gb3JXaGVyZU5vdEluIOuplOyEnOuTnOuTpFxuICBvcldoZXJlSW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+W10sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVJbiguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlSW4oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcldoZXJlTm90SW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+W10sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVOb3RJbiguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlTm90SW4oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBKU09OQiBTVVBFUlNFVCAoQD4pXG4gIHdoZXJlSnNvblN1cGVyc2V0T2Y8VENvbHVtbiBleHRlbmRzIEpzb25Db2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEpzb25TdXBlcnNldFZhbHVlPEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4+PixcbiAgKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlSnNvblN1cGVyc2V0T2YoY29sdW1uLCBzZXJpYWxpemVKc29uU3VwZXJzZXRWYWx1ZSh2YWx1ZSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZUpzb25TdXBlcnNldE9mPFRDb2x1bW4gZXh0ZW5kcyBKc29uQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBKc29uU3VwZXJzZXRWYWx1ZTxFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uPj4sXG4gICk6IHRoaXMge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlSnNvblN1cGVyc2V0T2YoY29sdW1uLCBzZXJpYWxpemVKc29uU3VwZXJzZXRWYWx1ZSh2YWx1ZSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgTUFUQ0hcbiAgd2hlcmVNYXRjaDxUQ29sdW1uIGV4dGVuZHMgRnVsbHRleHRDb2x1bW5zPFRUYWJsZXM+Pihjb2x1bW46IFRDb2x1bW4sIHZhbHVlOiBzdHJpbmcpOiB0aGlzO1xuICB3aGVyZU1hdGNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGBNQVRDSCAoJHtTdHJpbmcoYXJnc1swXSl9KSBBR0FJTlNUICg/KWAsIFthcmdzWzFdXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcldoZXJlTWF0Y2g8VENvbHVtbiBleHRlbmRzIEZ1bGx0ZXh0Q29sdW1uczxUVGFibGVzPj4oY29sdW1uOiBUQ29sdW1uLCB2YWx1ZTogc3RyaW5nKTogdGhpcztcbiAgb3JXaGVyZU1hdGNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYE1BVENIICgke1N0cmluZyhhcmdzWzBdKX0pIEFHQUlOU1QgKD8pYCwgW2FyZ3NbMV1dKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIFNFQVJDSFxuICB3aGVyZVNlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uIHwgVENvbHVtbltdLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHdlaWdodHM/OiBudW1iZXJbXTsgLy8g7KCV7IiYIOuwsOyXtFxuICAgIH0sXG4gICk6IHRoaXM7XG4gIHdoZXJlU2VhcmNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3QgeyB3ZWlnaHRzIH0gPSBhcmdzWzJdID8/IHt9O1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBBcnJheS5pc0FycmF5KGFyZ3NbMF0pXG4gICAgICA/IGBBUlJBWVske2FyZ3NbMF0ubWFwKChjKSA9PiBgJHtjfTo6dGV4dGApLmpvaW4oXCIsXCIpfV1gXG4gICAgICA6IGFyZ3NbMF07XG4gICAgY29uc3QgcGdyb29uZ2FDb25kaXRpb24gPSBgcGdyb29uZ2FfY29uZGl0aW9uKD8ke3dlaWdodHM/Lmxlbmd0aCA/IGAsIHdlaWdodHMgPT4gQVJSQVlbJHt3ZWlnaHRzLmpvaW4oXCIsXCIpfV1gIDogXCJcIn0pYDtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYCR7Y29sdW1uRXhwcn0gJkB+ICR7cGdyb29uZ2FDb25kaXRpb259YCwgW2FyZ3NbMV1dKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZVNlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uIHwgVENvbHVtbltdLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHdlaWdodHM/OiBudW1iZXJbXTsgLy8g7KCV7IiYIOuwsOyXtFxuICAgIH0sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVTZWFyY2goLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCB7IHdlaWdodHMgfSA9IGFyZ3NbMl0gPz8ge307XG4gICAgY29uc3QgY29sdW1uRXhwciA9IEFycmF5LmlzQXJyYXkoYXJnc1swXSlcbiAgICAgID8gYEFSUkFZWyR7YXJnc1swXS5tYXAoKGMpID0+IGAke2N9Ojp0ZXh0YCkuam9pbihcIixcIil9XWBcbiAgICAgIDogYXJnc1swXTtcbiAgICBjb25zdCBwZ3Jvb25nYUNvbmRpdGlvbiA9IGBwZ3Jvb25nYV9jb25kaXRpb24oPyR7d2VpZ2h0cz8ubGVuZ3RoID8gYCwgd2VpZ2h0cyA9PiBBUlJBWVske3dlaWdodHMuam9pbihcIixcIil9XWAgOiBcIlwifSlgO1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGAke2NvbHVtbkV4cHJ9ICZAfiAke3Bncm9vbmdhQ29uZGl0aW9ufWAsIFthcmdzWzFdXSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIEZVTExURVhUXG4gIHdoZXJlVHNTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNRdWVyeU9wdGlvbnMgfCBUc1F1ZXJ5Q29uZmlnLFxuICApOiB0aGlzO1xuICB3aGVyZVRzU2VhcmNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3Qgb3B0cyA9XG4gICAgICB0eXBlb2YgYXJnc1syXSA9PT0gXCJzdHJpbmdcIiA/ICh7IGNvbmZpZzogYXJnc1syXSB9IGFzIFRzUXVlcnlPcHRpb25zKSA6IChhcmdzWzJdID8/IHt9KTtcblxuICAgIGNvbnN0IHBhcnNlciA9IG9wdHMucGFyc2VyID8/IFwid2Vic2VhcmNoX3RvX3RzcXVlcnlcIjtcbiAgICBjb25zdCBjb25maWcgPSBvcHRzLmNvbmZpZyA/PyBcInNpbXBsZVwiO1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPVxuICAgICAgdHlwZW9mIGFyZ3NbMF0gPT09IFwib2JqZWN0XCIgJiYgYXJnc1swXS5fdHlwZSA9PT0gXCJzcWxfZXhwcmVzc2lvblwiXG4gICAgICAgID8gYXJnc1swXS5fc3FsXG4gICAgICAgIDogU3RyaW5nKGFyZ3NbMF0pO1xuXG4gICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGAke2NvbHVtbkV4cHJ9IEBAICR7cGFyc2VyfSg/LCA/KWAsIFtjb25maWcsIGFyZ3NbMV1dKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9yV2hlcmVUc1NlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPiB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUc1F1ZXJ5T3B0aW9ucyB8IFRzUXVlcnlDb25maWcsXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVUc1NlYXJjaCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIGNvbnN0IG9wdHMgPVxuICAgICAgdHlwZW9mIGFyZ3NbMl0gPT09IFwic3RyaW5nXCIgPyAoeyBjb25maWc6IGFyZ3NbMl0gfSBhcyBUc1F1ZXJ5T3B0aW9ucykgOiAoYXJnc1syXSA/PyB7fSk7XG5cbiAgICBjb25zdCBwYXJzZXIgPSBvcHRzLnBhcnNlciA/PyBcIndlYnNlYXJjaF90b190c3F1ZXJ5XCI7XG4gICAgY29uc3QgY29uZmlnID0gb3B0cy5jb25maWcgPz8gXCJzaW1wbGVcIjtcbiAgICBjb25zdCBjb2x1bW5FeHByID1cbiAgICAgIHR5cGVvZiBhcmdzWzBdID09PSBcIm9iamVjdFwiICYmIGFyZ3NbMF0uX3R5cGUgPT09IFwic3FsX2V4cHJlc3Npb25cIlxuICAgICAgICA/IGFyZ3NbMF0uX3NxbFxuICAgICAgICA6IFN0cmluZyhhcmdzWzBdKTtcblxuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGAke2NvbHVtbkV4cHJ9IEBAICR7cGFyc2VyfSg/LCA/KWAsIFtjb25maWcsIGFyZ3NbMV1dKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHdoZXJlRnV6enk8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgb3BlcmF0b3I/OiBGdXp6eU9wZXJhdG9yO1xuICAgIH0sXG4gICk6IHRoaXM7XG4gIHdoZXJlRnV6enkoLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCBvcGVyYXRvciA9IG5vcm1hbGl6ZUZ1enp5T3BlcmF0b3IoYXJnc1syXT8ub3BlcmF0b3IpO1xuXG4gICAgaWYgKG9wZXJhdG9yID09PSBcIiVcIikge1xuICAgICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHRoaXMuYnVpbGRlci53aGVyZVJhdyhgJHthcmdzWzBdLl9zcWx9ICR7b3BlcmF0b3J9ID9gLCBbLi4uYXJnc1swXS5fcGFyYW1zLCBhcmdzWzFdXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYD8/ICR7b3BlcmF0b3J9ID9gLCBbYXJnc1swXSwgYXJnc1sxXV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gJHthcmdzWzBdLl9zcWx9YCwgW2FyZ3NbMV0sIC4uLmFyZ3NbMF0uX3BhcmFtc10pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gPz9gLCBbYXJnc1sxXSwgYXJnc1swXV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9yV2hlcmVGdXp6eTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPiB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBvcGVyYXRvcj86IEZ1enp5T3BlcmF0b3I7XG4gICAgfSxcbiAgKTogdGhpcztcbiAgb3JXaGVyZUZ1enp5KC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3Qgb3BlcmF0b3IgPSBub3JtYWxpemVGdXp6eU9wZXJhdG9yKGFyZ3NbMl0/Lm9wZXJhdG9yKTtcblxuICAgIGlmIChvcGVyYXRvciA9PT0gXCIlXCIpIHtcbiAgICAgIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZVJhdyhgJHthcmdzWzBdLl9zcWx9ICR7b3BlcmF0b3J9ID9gLCBbLi4uYXJnc1swXS5fcGFyYW1zLCBhcmdzWzFdXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZVJhdyhgPz8gJHtvcGVyYXRvcn0gP2AsIFthcmdzWzBdLCBhcmdzWzFdXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGA/ICR7b3BlcmF0b3J9ICR7YXJnc1swXS5fc3FsfWAsIFthcmdzWzFdLCAuLi5hcmdzWzBdLl9wYXJhbXNdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gPz9gLCBbYXJnc1sxXSwgYXJnc1swXV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOykkeyyqSDqt7jro7lcbiAgd2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzO1xuICB3aGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZSgoc3ViQnVpbGRlcikgPT4ge1xuICAgICAgY29uc3Qgc3ViR3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihzdWJCdWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKHN1Ykdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcldoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogdGhpcztcbiAgb3JXaGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlKChzdWJCdWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBzdWJHcm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KHN1YkJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soc3ViR3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbi8vIEpPSU4g7KCIIOq3uOujueyXkOuKlCBMZWZ07JmAIFJpZ2h07JeQIOuMgO2VnCDsiJzshJzqsIAg7ZWE7JqU7ZWY7KeAIOyViuycvOuvgOuhnCwg66qo65OgIOqyveyasOydmCDsiJjrpbwg6rOE7IKw7ZW07JW87ZWoLlxuZXhwb3J0IGNsYXNzIEpvaW5DbGF1c2VHcm91cDxcbiAgVExlZnQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUUmlnaHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuPiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2FsbGJhY2s6IEtuZXguSm9pbkNsYXVzZSkge31cblxuICAvLyBPTihBTkQpOiDsu6zrn7wgPSDsu6zrn7xcbiAgb24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4pOiB0aGlzO1xuICBvbihsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0Pik6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCA9IOqwklxuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUUmlnaHQsIEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCAo7Jew7IKw7J6QKSDsu6zrn7xcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICApOiB0aGlzO1xuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCAo7Jew7IKw7J6QKSDqsJJcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRSaWdodCwgQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gT04oQU5EKTog7L2c67CxXG4gIG9uKGNhbGxiYWNrOiAobmVzdGVkOiBKb2luQ2xhdXNlR3JvdXA8VExlZnQsIFRSaWdodD4pID0+IHZvaWQpOiB0aGlzO1xuICBvbihjYWxsYmFjazogKG5lc3RlZDogSm9pbkNsYXVzZUdyb3VwPFRSaWdodCwgVExlZnQ+KSA9PiB2b2lkKTogdGhpcztcbiAgLy8gT04oQU5EKSDqtaztmIRcbiAgb24oLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICB0aGlzLmNhbGxiYWNrLm9uKC4uLihhcmdzIGFzIFtzdHJpbmcsIHN0cmluZ10pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE9OKE9SKTog7Lus65+8ID0g7Lus65+8XG4gIG9yT24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4pOiB0aGlzO1xuICBvck9uKGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+KTogdGhpcztcbiAgLy8gT04oT1IpOiDsu6zrn7wgPSDqsJJcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRSaWdodCwgQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gT04oT1IpOiDsu6zrn7wgKOyXsOyCsOyekCkg7Lus65+8XG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICApOiB0aGlzO1xuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgKTogdGhpcztcbiAgLy8gT04oT1IpOiDsu6zrn7wgKOyXsOyCsOyekCkg6rCSXG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VFJpZ2h0LCBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBPTihPUik6IOy9nOuwsVxuICBvck9uKGNhbGxiYWNrOiAobmVzdGVkOiBKb2luQ2xhdXNlR3JvdXA8VExlZnQsIFRSaWdodD4pID0+IHZvaWQpOiB0aGlzO1xuICBvck9uKGNhbGxiYWNrOiAobmVzdGVkOiBKb2luQ2xhdXNlR3JvdXA8VFJpZ2h0LCBUTGVmdD4pID0+IHZvaWQpOiB0aGlzO1xuICAvLyBPTihPUikg6rWs7ZiEXG4gIG9yT24oLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICB0aGlzLmNhbGxiYWNrLm9yT24oLi4uKGFyZ3MgYXMgW3N0cmluZywgc3RyaW5nXSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gT04gVkFMKEFORCk6IOy7rOufvCA9IOqwkiAo6rCS7J2EIOy7rOufvCDssLjsobDqsIAg7JWE64uMIO2MjOudvOuvuO2EsOuhnCDrsJTsnbjrlKkpXG4gIG9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9uVmFsKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgKHRoaXMuY2FsbGJhY2sgYXMgYW55KS5vblZhbCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEFORCBPTiBWQUw6IG9uVmFs7J2YIOuqheyLnOyggSBhbGlhcyAoS25leCDtmLjtmZgpXG4gIGFuZE9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBhbmRPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIGFuZE9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBhbmRPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIGFuZE9uVmFsKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgKHRoaXMuY2FsbGJhY2sgYXMgYW55KS5hbmRPblZhbCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE9SIE9OIFZBTDogT1Ig7KGw6rG07Jy866GcIOqwkiDrsJTsnbjrlKlcbiAgb3JPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCB2YWx1ZTogYW55KTogdGhpcztcbiAgb3JPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9yT25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9yT25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvck9uVmFsKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgKHRoaXMuY2FsbGJhY2sgYXMgYW55KS5vck9uVmFsKC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbi8qXG4gIFRSZXNvbHZlZDog7L+866asIOyLpO2WiSDtm4Qg67CY7ZmY65CgIOqysOqzvCDtg4DsnoVcbiAgVFJldHVybmluZzogUkVUVVJOSU5HIOygiOyXkCDsgqzsmqnrkKAg7YOA7J6FXG4qL1xuZXhwb3J0IGNsYXNzIFJlc29sdmVkUHVyaTxUUmVzb2x2ZWQsIFRSZXR1cm5pbmc+IGltcGxlbWVudHMgUHJvbWlzZTxUUmVzb2x2ZWQ+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGtuZXhRdWVyeTogS25leC5RdWVyeUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBrbmV4OiBLbmV4LFxuICApIHt9XG5cbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZyA9IFwiUHJvbWlzZVwiO1xuXG4gIHRvUXVlcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkudG9RdWVyeSgpO1xuICB9XG5cbiAgZGVidWcoKTogdGhpcyB7XG4gICAgY29uc29sZS5sb2coYCR7Y2hhbGsuY3lhbihcIltQdXJpIERlYnVnXVwiKX0gJHtjaGFsay55ZWxsb3codGhpcy50b1F1ZXJ5KCkpfWApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdGhlbjxUUmVzdWx0MSA9IFRSZXNvbHZlZCwgVFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBUUmVzb2x2ZWQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IG51bGwsXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgIE5haXRlLnQoXCJwdXJpOmV4ZWN1dGVkLXF1ZXJ5XCIsIHRoaXMudG9RdWVyeSgpKTtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkudGhlbihvbmZ1bGZpbGxlZCBhcyBhbnksIG9ucmVqZWN0ZWQpO1xuICB9XG5cbiAgY2F0Y2g8VFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc29sdmVkIHwgVFJlc3VsdDI+IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkuY2F0Y2gob25yZWplY3RlZCk7XG4gIH1cblxuICBmaW5hbGx5KG9uZmluYWxseT86ICgoKSA9PiB2b2lkKSB8IG51bGwpOiBQcm9taXNlPFRSZXNvbHZlZD4ge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS5maW5hbGx5KG9uZmluYWxseSk7XG4gIH1cblxuICAvLyBPTiBDT05GTElDVCAtIOy7rOufvCDquLDrsJhcbiAgb25Db25mbGljdDxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgVFJldHVybmluZz4+KFxuICAgIGNvbHVtbnM6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIGFjdGlvbj86IE9uQ29uZmxpY3RBY3Rpb248VFRhYmxlcz4sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IHRhcmdldCA9IEFycmF5LmlzQXJyYXkoY29sdW1ucykgPyBjb2x1bW5zIDogW2NvbHVtbnNdO1xuXG4gICAgaWYgKCFhY3Rpb24gfHwgYWN0aW9uID09PSBcIm5vdGhpbmdcIikge1xuICAgICAgLy8gRE8gTk9USElOR1xuICAgICAgdGhpcy5rbmV4UXVlcnkub25Db25mbGljdCh0YXJnZXQpLmlnbm9yZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBETyBVUERBVEVcbiAgICAgIGNvbnN0IHsgdXBkYXRlIH0gPSBhY3Rpb247XG5cbiAgICAgIC8vIGFjdGlvbi51cGRhdGUg67Cw7Je0IO2Yle2DnCA6IFtcIm5hbWVcIiwgXCJlbWFpbFwiXVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodXBkYXRlKSkge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS5vbkNvbmZsaWN0KHRhcmdldCkubWVyZ2UodXBkYXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFjdGlvbi51cGRhdGUg6rCd7LK0IO2Yle2DnDogeyBuYW1lOiBcIkpvaG5cIiwgY291bnQ6IHJhdyguLi4pIH1cbiAgICAgICAgY29uc3QgbWVyZ2VPYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh1cGRhdGUpKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgXCJfdHlwZVwiIGluIHZhbHVlICYmXG4gICAgICAgICAgICB2YWx1ZS5fdHlwZSA9PT0gXCJzcWxfZXhwcmVzc2lvblwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBTcWxFeHByZXNzaW9uIOKGkiBrbmV4LnJhdygp66GcIOuzgO2ZmFxuICAgICAgICAgICAgbWVyZ2VPYmpba2V5XSA9IHRoaXMua25leC5yYXcoKHZhbHVlIGFzIFNxbEV4cHJlc3Npb248YW55PikuX3NxbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIOydvOuwmCDqsJJcbiAgICAgICAgICAgIG1lcmdlT2JqW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmtuZXhRdWVyeS5vbkNvbmZsaWN0KHRhcmdldCkubWVyZ2UobWVyZ2VPYmopO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gUkVUVVJOSU5HOiBcIipcIiAtIOyghOyytCDsu6zrn7xcbiAgcmV0dXJuaW5nKGNvbHVtbjogXCIqXCIpOiBSZXNvbHZlZFB1cmk8VFJldHVybmluZ1tdLCBuZXZlcj47XG4gIC8vIFJFVFVSTklORzog64uo7J28IOy7rOufvFxuICByZXR1cm5pbmc8VENvbHVtbiBleHRlbmRzIENvbHVtbktleXM8VFJldHVybmluZz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgKTogUmVzb2x2ZWRQdXJpPFBpY2s8VFJldHVybmluZywgVENvbHVtbj5bXSwgbmV2ZXI+O1xuICAvLyBSRVRVUk5JTkc6IOuzteyImCDsu6zrn7wgKOuwsOyXtClcbiAgcmV0dXJuaW5nPFRDb2x1bW4gZXh0ZW5kcyBDb2x1bW5LZXlzPFRSZXR1cm5pbmc+PihcbiAgICBjb2x1bW5zOiBUQ29sdW1uW10sXG4gICk6IFJlc29sdmVkUHVyaTxQaWNrPFRSZXR1cm5pbmcsIFRDb2x1bW4+W10sIG5ldmVyPjtcbiAgLy8gUkVUVVJOSU5HIOq1rO2YhFxuICByZXR1cm5pbmcoY29sdW1uT3JDb2x1bW5zOiBzdHJpbmcgfCBzdHJpbmdbXSk6IFJlc29sdmVkUHVyaTxhbnlbXSwgbmV2ZXI+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5yZXR1cm5pbmcoY29sdW1uT3JDb2x1bW5zKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQStEQSxTQUFTLHVCQUF1QixVQUFrQztDQUNoRSxNQUFNLGFBQWEsVUFBVSxLQUFLLEtBQUs7Q0FDdkMsTUFBTSxnQkFBZ0IsZ0JBQWdCLE1BQU0sY0FBYyxjQUFjLFVBQVU7Q0FFbEYsSUFBSSxDQUFDLGVBQ0gsTUFBTSxJQUFJLE1BQU0sMkJBQTJCLFlBQVksSUFBSTtDQUc3RCxPQUFPO0FBQ1Q7QUFFQSxTQUFTLDJCQUEyQixPQUF3QjtDQUMxRCxNQUFNLGFBQWEsS0FBSyxVQUFVLEtBQUs7Q0FFdkMsSUFBSSxlQUFlLFFBQ2pCLE1BQU0sSUFBSSxVQUNSLDRGQUNGO0NBR0YsT0FBTztBQUNUO0FBRUEsU0FBUywwQkFBMEIsWUFBa0MsT0FBNkI7Q0FDaEcsSUFBSSxjQUFjLFNBQVMsY0FBYyxRQUN2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
@@ -10,14 +10,25 @@ type LeftJoinedKey = "__leftJoined__";
10
10
  type HasDefault = "__hasDefault__";
11
11
  type GeneratedKey = "__generated__";
12
12
  type VectorKey = "__vector__";
13
+ type JsonKey = "__json__";
13
14
  type VirtualQueryKey = "__virtual_query__";
14
- type InternalTypeKeys = FulltextKey | VirtualKey | LeftJoinedKey | HasDefault | GeneratedKey | VectorKey | VirtualQueryKey;
15
+ type InternalTypeKeys = FulltextKey | VirtualKey | LeftJoinedKey | HasDefault | GeneratedKey | VectorKey | JsonKey | VirtualQueryKey;
15
16
  type VectorColumnKeys<T> = T extends {
16
17
  [K in VectorKey]: readonly (infer V)[];
17
18
  } ? V & string : never;
18
19
  export type VectorColumns<TTables extends Record<string, any>> = {
19
20
  [TAlias in keyof TTables]: `${TAlias & string}.${VectorColumnKeys<TTables[TAlias]>}`;
20
21
  }[keyof TTables] | (IsSingleKey<TTables> extends true ? VectorColumnKeys<TTables[keyof TTables]> : never);
22
+ type JsonColumnKeys<T> = T extends {
23
+ [K in JsonKey]: readonly (infer J)[];
24
+ } ? J & string : never;
25
+ export type JsonColumns<TTables extends Record<string, any>> = {
26
+ [TAlias in keyof TTables]: `${TAlias & string}.${JsonColumnKeys<TTables[TAlias]>}`;
27
+ }[keyof TTables] | (IsSingleKey<TTables> extends true ? JsonColumnKeys<TTables[keyof TTables]> : never);
28
+ type JsonSupersetNestedValue<T> = T extends readonly (infer Element)[] ? JsonSupersetNestedValue<Element>[] : T extends object ? {
29
+ [K in keyof T]?: JsonSupersetNestedValue<T[K]>;
30
+ } : T;
31
+ export type JsonSupersetValue<T> = JsonSupersetNestedValue<NonNullable<T>>;
21
32
  export type TableName<TSchema> = keyof TSchema & string;
22
33
  export type IdType<TSchema, TTable extends keyof TSchema> = TSchema[TTable] extends {
23
34
  id: infer I;