sonamu 0.9.17 → 0.9.19

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.
@@ -4,6 +4,7 @@ import { differenceWith, init_utils, intersectionBy } from "../utils/utils.js";
4
4
  import { init_types, isSearchTextProp } from "../types/types.js";
5
5
  import { EntityManager, init_entity_manager } from "../entity/entity-manager.js";
6
6
  import { Naite, init_naite } from "../naite/naite.js";
7
+ import { init_index_where_predicate, normalizeIndexWherePredicate, normalizeIndexWherePredicateForComparison } from "./index-where-predicate.js";
7
8
  import { PostgreSQLSchemaReader, init_postgresql_schema_reader } from "./postgresql-schema-reader.js";
8
9
  import { alphabetical, diff } from "radashi";
9
10
  import equal from "fast-deep-equal";
@@ -980,15 +981,19 @@ function getAlterIndexesTo(entityIndexes, dbIndexes) {
980
981
  };
981
982
  const normalizedEntityIndexes = entityIndexes.map(setMigrationIndexDefaults);
982
983
  const normalizedDbIndexes = dbIndexes.map(setMigrationIndexDefaults);
984
+ const comparisonEntityIndexes = entityIndexes.map(setMigrationIndexComparisonDefaults);
985
+ const comparisonDbIndexes = dbIndexes.map(setMigrationIndexComparisonDefaults);
983
986
  const extraIndexes = {
984
- db: diff(normalizedDbIndexes, normalizedEntityIndexes, identity),
985
- entity: diff(normalizedEntityIndexes, normalizedDbIndexes, identity)
987
+ db: diff(comparisonDbIndexes, comparisonEntityIndexes, identity),
988
+ entity: diff(comparisonEntityIndexes, comparisonDbIndexes, identity)
986
989
  };
987
990
  if (extraIndexes.entity.length > 0) {
988
- indexesTo.add = indexesTo.add.concat(extraIndexes.entity);
991
+ const addIdentities = new Set(extraIndexes.entity.map(identity));
992
+ indexesTo.add = indexesTo.add.concat(normalizedEntityIndexes.filter((_, index) => addIdentities.has(identity(comparisonEntityIndexes[index]))));
989
993
  }
990
994
  if (extraIndexes.db.length > 0) {
991
- indexesTo.drop = indexesTo.drop.concat(extraIndexes.db);
995
+ const dropIdentities = new Set(extraIndexes.db.map(identity));
996
+ indexesTo.drop = indexesTo.drop.concat(normalizedDbIndexes.filter((_, index) => dropIdentities.has(identity(comparisonDbIndexes[index]))));
992
997
  }
993
998
  return indexesTo;
994
999
  }
@@ -1002,10 +1007,16 @@ function genIndexDropDefinition(index) {
1002
1007
  * DB 조회 결과와 비교하기 위한 인덱스 기본값 설정
1003
1008
  */
1004
1009
  function setMigrationIndexDefaults(index) {
1010
+ return setMigrationIndexDefaultsBase(index, false);
1011
+ }
1012
+ function setMigrationIndexComparisonDefaults(index) {
1013
+ return setMigrationIndexDefaultsBase(index, true);
1014
+ }
1015
+ function setMigrationIndexDefaultsBase(index, normalizeWhereForComparison) {
1005
1016
  const isVectorIndex = index.type === "hnsw" || index.type === "ivfflat";
1006
1017
  const supportsOrdering = !isVectorIndex && (!index.using || index.using === "btree");
1007
1018
  const normalizedUsing = isVectorIndex ? index.using : index.using ?? "btree";
1008
- const normalizedWhere = normalizeIndexWherePredicate(index.where);
1019
+ const normalizedWhere = normalizeWhereForComparison ? normalizeIndexWherePredicateForComparison(index.where) : normalizeIndexWherePredicate(index.where);
1009
1020
  return {
1010
1021
  ...index,
1011
1022
  columns: index.columns.map((col) => ({
@@ -1021,61 +1032,6 @@ function setMigrationIndexDefaults(index) {
1021
1032
  ...normalizedWhere ? { where: normalizedWhere } : {}
1022
1033
  };
1023
1034
  }
1024
- function normalizeIndexWherePredicate(where) {
1025
- if (!where) {
1026
- return undefined;
1027
- }
1028
- const trimmed = where.trim();
1029
- if (trimmed.length === 0) {
1030
- return undefined;
1031
- }
1032
- if (trimmed.startsWith("(") && trimmed.endsWith(")")) {
1033
- const closeIndex = findMatchingParenthesisInSql(trimmed, 0);
1034
- if (closeIndex === trimmed.length - 1) {
1035
- return trimmed.slice(1, -1).trim();
1036
- }
1037
- }
1038
- return trimmed;
1039
- }
1040
- function findMatchingParenthesisInSql(source, openIndex) {
1041
- let depth = 0;
1042
- let inSingleQuote = false;
1043
- let inDoubleQuote = false;
1044
- for (let index = openIndex; index < source.length; index += 1) {
1045
- const char = source[index];
1046
- const nextChar = source[index + 1];
1047
- if (char === "'" && !inDoubleQuote) {
1048
- if (inSingleQuote && nextChar === "'") {
1049
- index += 1;
1050
- continue;
1051
- }
1052
- inSingleQuote = !inSingleQuote;
1053
- continue;
1054
- }
1055
- if (char === "\"" && !inSingleQuote) {
1056
- if (inDoubleQuote && nextChar === "\"") {
1057
- index += 1;
1058
- continue;
1059
- }
1060
- inDoubleQuote = !inDoubleQuote;
1061
- continue;
1062
- }
1063
- if (inSingleQuote || inDoubleQuote) {
1064
- continue;
1065
- }
1066
- if (char === "(") {
1067
- depth += 1;
1068
- continue;
1069
- }
1070
- if (char === ")") {
1071
- depth -= 1;
1072
- if (depth === 0) {
1073
- return index;
1074
- }
1075
- }
1076
- }
1077
- return -1;
1078
- }
1079
1035
  /**
1080
1036
  * 테이블 변경 케이스 - Foreign Key 변경
1081
1037
  */
@@ -1324,6 +1280,7 @@ var init_code_generation = __esmMin((() => {
1324
1280
  init_types();
1325
1281
  init_formatter();
1326
1282
  init_utils();
1283
+ init_index_where_predicate();
1327
1284
  init_postgresql_schema_reader();
1328
1285
  SEARCH_TEXT_HELPER_DEFINITIONS = {
1329
1286
  "text-array": `await knex.raw(\`CREATE OR REPLACE FUNCTION sonamu_text_array_agg(arr text[], ci boolean DEFAULT true)
@@ -1529,4 +1486,4 @@ $$\`);`
1529
1486
  //#endregion
1530
1487
  init_code_generation();
1531
1488
  export { generateAlterCode, generateCreateCode, getAlterIndexesTo, init_code_generation, setMigrationIndexDefaults };
1532
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1nZW5lcmF0aW9uLmpzIiwibmFtZXMiOlsidG9rZW5zOiBTZWFyY2hUZXh0RXhwcmVzc2lvblRva2VuW10iLCJsaW5lczogc3RyaW5nW10iLCJyZXN1bHQ6IENvbHVtbkRlZmluaXRpb25SZXN1bHQiLCJjaGFpbnM6IHN0cmluZ1tdIiwiYWx0ZXJDb2RlczogKEdlbk1pZ3JhdGlvbkNvZGUgfCBHZW5NaWdyYXRpb25Db2RlW10gfCBudWxsKVtdIiwidXBMaW5lczogc3RyaW5nW10iLCJkb3duTGluZXM6IHN0cmluZ1tdIiwiU0VBUkNIX1RFWFRfSEVMUEVSX0RFRklOSVRJT05TOiBSZWNvcmQ8U2VhcmNoVGV4dEhlbHBlcktpbmQsIHN0cmluZz4iLCJhcmdzOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGVbXSIsInBhcnRzOiBzdHJpbmdbXSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vY29kZS1nZW5lcmF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgYWxwaGFiZXRpY2FsLCBkaWZmIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgR2VuTWlncmF0aW9uQ29kZSxcbiAgdHlwZSBNaWdyYXRpb25Db2x1bW4sXG4gIHR5cGUgTWlncmF0aW9uRm9yZWlnbixcbiAgdHlwZSBNaWdyYXRpb25JbmRleCxcbiAgdHlwZSBNaWdyYXRpb25TZXQsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNTZWFyY2hUZXh0UHJvcCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgZm9ybWF0Q29kZSB9IGZyb20gXCIuLi91dGlscy9mb3JtYXR0ZXJcIjtcbmltcG9ydCB7IGRpZmZlcmVuY2VXaXRoLCBpbnRlcnNlY3Rpb25CeSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgUG9zdGdyZVNRTFNjaGVtYVJlYWRlciB9IGZyb20gXCIuL3Bvc3RncmVzcWwtc2NoZW1hLXJlYWRlclwiO1xuXG4vKipcbiAqIOy7rOufvCDsoJXsnZgg6rKw6rO8IO2DgOyehVxuICogLSBidWlsZGVyOiBLbmV4IHRhYmxlIGJ1aWxkZXIg66mU7ISc65Oc66GcIOyLpO2Wie2VoCDqtazrrLggKHRhYmxlLnh4eCgpKVxuICogLSByYXc6IGtuZXgucmF3KCnroZwg7Iuk7ZaJ7ZWgIOq1rOusuFxuICovXG50eXBlIENvbHVtbkRlZmluaXRpb25SZXN1bHQgPSB7XG4gIGJ1aWxkZXI6IHN0cmluZ1tdO1xuICByYXc6IHN0cmluZ1tdO1xufTtcblxudHlwZSBTZWFyY2hUZXh0SGVscGVyS2luZCA9IFwidGV4dC1hcnJheVwiIHwgXCJqc29uYi1hcnJheVwiO1xuXG50eXBlIFNlYXJjaFRleHRFeHByZXNzaW9uVG9rZW4gPVxuICB8IHsgdHlwZTogXCJpZGVudGlmaWVyXCI7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogXCJxdW90ZWRJZGVudGlmaWVyXCI7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogXCJzdHJpbmdcIjsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcInN5bWJvbFwiOyB2YWx1ZTogXCIoXCIgfCBcIilcIiB8IFwiLFwiIH1cbiAgfCB7IHR5cGU6IFwib3BlcmF0b3JcIjsgdmFsdWU6IFwifHxcIiB8IFwiOjpcIiB9O1xuXG50eXBlIFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSA9XG4gIHwgeyB0eXBlOiBcImlkZW50aWZpZXJcIjsgbmFtZTogc3RyaW5nOyBxdW90ZWQ6IGJvb2xlYW4gfVxuICB8IHsgdHlwZTogXCJzdHJpbmdcIjsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcImJvb2xlYW5cIjsgdmFsdWU6IGJvb2xlYW4gfVxuICB8IHsgdHlwZTogXCJmdW5jdGlvblwiOyBuYW1lOiBzdHJpbmc7IGFyZ3M6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZVtdIH1cbiAgfCB7IHR5cGU6IFwiY29uY2F0XCI7IHBhcnRzOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGVbXSB9XG4gIHwgeyB0eXBlOiBcImNvbGxhdGVcIjsgZXhwcjogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlOyBjb2xsYXRpb246IHN0cmluZzsgcXVvdGVkOiBib29sZWFuIH1cbiAgfCB7IHR5cGU6IFwiY2FzdFwiOyBleHByOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGU7IHRhcmdldFR5cGU6IHN0cmluZyB9O1xuXG5jb25zdCBTRUFSQ0hfVEVYVF9IRUxQRVJfREVGSU5JVElPTlM6IFJlY29yZDxTZWFyY2hUZXh0SGVscGVyS2luZCwgc3RyaW5nPiA9IHtcbiAgXCJ0ZXh0LWFycmF5XCI6IGBhd2FpdCBrbmV4LnJhdyhcXGBDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBzb25hbXVfdGV4dF9hcnJheV9hZ2coYXJyIHRleHRbXSwgY2kgYm9vbGVhbiBERUZBVUxUIHRydWUpXG5SRVRVUk5TIHRleHRcbkxBTkdVQUdFIHNxbCBJTU1VVEFCTEUgUEFSQUxMRUwgU0FGRSBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVFxuQVMgJCRcbiAgU0VMRUNUIHN0cmluZ19hZ2coXG4gICAgQ0FTRSBXSEVOIGNpIFRIRU4gbG93ZXIodmFsdWUpIEVMU0UgdmFsdWUgRU5ELFxuICAgICcgJ1xuICApXG4gIEZST00gdW5uZXN0KGFycikgQVMgdmFsdWVcbiQkXFxgKTtgLFxuICBcImpzb25iLWFycmF5XCI6IGBhd2FpdCBrbmV4LnJhdyhcXGBDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBzb25hbXVfanNvbmJfYXJyYXlfYWdnKGFyciBqc29uYiwgY2kgYm9vbGVhbiBERUZBVUxUIHRydWUpXG5SRVRVUk5TIHRleHRcbkxBTkdVQUdFIHNxbCBJTU1VVEFCTEUgUEFSQUxMRUwgU0FGRSBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVFxuQVMgJCRcbiAgU0VMRUNUIHN0cmluZ19hZ2coXG4gICAgQ0FTRSBXSEVOIGNpIFRIRU4gbG93ZXIodmFsdWUpIEVMU0UgdmFsdWUgRU5ELFxuICAgICcgJ1xuICApXG4gIEZST00ganNvbmJfYXJyYXlfZWxlbWVudHNfdGV4dChhcnIpXG4kJFxcYCk7YCxcbn07XG5cbmNsYXNzIFNlYXJjaFRleHRFeHByZXNzaW9uUGFyc2VyIHtcbiAgcHJpdmF0ZSBpbmRleCA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB0b2tlbnM6IFNlYXJjaFRleHRFeHByZXNzaW9uVG9rZW5bXSkge31cblxuICBpc0F0RW5kKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmluZGV4ID49IHRoaXMudG9rZW5zLmxlbmd0aDtcbiAgfVxuXG4gIHBhcnNlRXhwcmVzc2lvbigpOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUge1xuICAgIHJldHVybiB0aGlzLnBhcnNlQ29uY2F0KCk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlQ29uY2F0KCk6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSB7XG4gICAgY29uc3QgcGFydHMgPSBbdGhpcy5wYXJzZVBvc3RmaXgoKV07XG5cbiAgICB3aGlsZSAodGhpcy5tYXRjaE9wZXJhdG9yKFwifHxcIikpIHtcbiAgICAgIHBhcnRzLnB1c2godGhpcy5wYXJzZVBvc3RmaXgoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA9PT0gMSA/IHBhcnRzWzBdIDogeyB0eXBlOiBcImNvbmNhdFwiLCBwYXJ0cyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVBvc3RmaXgoKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlIHtcbiAgICBsZXQgbm9kZSA9IHRoaXMucGFyc2VQcmltYXJ5KCk7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHRoaXMubWF0Y2hPcGVyYXRvcihcIjo6XCIpKSB7XG4gICAgICAgIG5vZGUgPSB7XG4gICAgICAgICAgdHlwZTogXCJjYXN0XCIsXG4gICAgICAgICAgZXhwcjogbm9kZSxcbiAgICAgICAgICB0YXJnZXRUeXBlOiB0aGlzLnBhcnNlVHlwZU5hbWUoKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoSWRlbnRpZmllcihcImNvbGxhdGVcIikpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmNvbnN1bWVDb2xsYXRpb25Ub2tlbigpO1xuICAgICAgICBub2RlID0ge1xuICAgICAgICAgIHR5cGU6IFwiY29sbGF0ZVwiLFxuICAgICAgICAgIGV4cHI6IG5vZGUsXG4gICAgICAgICAgY29sbGF0aW9uOiB0b2tlbi52YWx1ZSxcbiAgICAgICAgICBxdW90ZWQ6IHRva2VuLnR5cGUgPT09IFwicXVvdGVkSWRlbnRpZmllclwiLFxuICAgICAgICB9O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlUHJpbWFyeSgpOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5jb25zdW1lVG9rZW4oXCLtkZztmITsi51cIik7XG5cbiAgICBpZiAodG9rZW4udHlwZSA9PT0gXCJzeW1ib2xcIiAmJiB0b2tlbi52YWx1ZSA9PT0gXCIoXCIpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgdGhpcy5leHBlY3RTeW1ib2woXCIpXCIpO1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwic3RyaW5nXCIsIHZhbHVlOiB0b2tlbi52YWx1ZSB9O1xuICAgIH1cblxuICAgIGlmICh0b2tlbi50eXBlID09PSBcImlkZW50aWZpZXJcIiB8fCB0b2tlbi50eXBlID09PSBcInF1b3RlZElkZW50aWZpZXJcIikge1xuICAgICAgY29uc3QgbG93ZXJOYW1lID0gdG9rZW4udmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmICh0b2tlbi50eXBlID09PSBcImlkZW50aWZpZXJcIiAmJiAobG93ZXJOYW1lID09PSBcInRydWVcIiB8fCBsb3dlck5hbWUgPT09IFwiZmFsc2VcIikpIHtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJib29sZWFuXCIsIHZhbHVlOiBsb3dlck5hbWUgPT09IFwidHJ1ZVwiIH07XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoU3ltYm9sKFwiKFwiKSkge1xuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gXCJpZGVudGlmaWVyXCIgJiYgbG93ZXJOYW1lID09PSBcInRyaW1cIiAmJiB0aGlzLmlzVHJpbUJvdGhGcm9tRm9ybSgpKSB7XG4gICAgICAgICAgdGhpcy5pbmRleCArPSAyO1xuICAgICAgICAgIGNvbnN0IGFyZyA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgICAgdGhpcy5leHBlY3RTeW1ib2woXCIpXCIpO1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6IFwiZnVuY3Rpb25cIiwgbmFtZTogXCJ0cmltXCIsIGFyZ3M6IFthcmddIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5wYXJzZUZ1bmN0aW9uQXJncygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICBuYW1lOiB0b2tlbi52YWx1ZSxcbiAgICAgICAgICBhcmdzLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcImlkZW50aWZpZXJcIixcbiAgICAgICAgbmFtZTogdG9rZW4udmFsdWUsXG4gICAgICAgIHF1b3RlZDogdG9rZW4udHlwZSA9PT0gXCJxdW90ZWRJZGVudGlmaWVyXCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihg7KeA7JuQ65CY7KeAIOyViuuKlCBzZWFyY2hUZXh0IGV4cHJlc3Npb24gdG9rZW46ICR7dG9rZW4udHlwZX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VGdW5jdGlvbkFyZ3MoKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlW10ge1xuICAgIGlmICh0aGlzLm1hdGNoU3ltYm9sKFwiKVwiKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGFyZ3M6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZVtdID0gW107XG4gICAgZG8ge1xuICAgICAgYXJncy5wdXNoKHRoaXMucGFyc2VFeHByZXNzaW9uKCkpO1xuICAgIH0gd2hpbGUgKHRoaXMubWF0Y2hTeW1ib2woXCIsXCIpKTtcblxuICAgIHRoaXMuZXhwZWN0U3ltYm9sKFwiKVwiKTtcbiAgICByZXR1cm4gYXJncztcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VUeXBlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5wZWVrKCk7XG4gICAgICBpZiAoXG4gICAgICAgIHRva2VuPy50eXBlID09PSBcImlkZW50aWZpZXJcIiB8fFxuICAgICAgICB0b2tlbj8udHlwZSA9PT0gXCJxdW90ZWRJZGVudGlmaWVyXCIgfHxcbiAgICAgICAgKHRva2VuPy50eXBlID09PSBcInN5bWJvbFwiICYmXG4gICAgICAgICAgKHRva2VuLnZhbHVlID09PSBcIihcIiB8fCB0b2tlbi52YWx1ZSA9PT0gXCIpXCIgfHwgdG9rZW4udmFsdWUgPT09IFwiLFwiKSlcbiAgICAgICkge1xuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFydHMucHVzaCh0b2tlbi52YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgdGhpcy5pbmRleCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwi7YOA7J6FIOy6kOyKpO2MhSDrjIDsg4Eg7YOA7J6F7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukLlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHMuam9pbihcIiBcIik7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVDb2xsYXRpb25Ub2tlbigpOiBFeHRyYWN0PFxuICAgIFNlYXJjaFRleHRFeHByZXNzaW9uVG9rZW4sXG4gICAgeyB0eXBlOiBcImlkZW50aWZpZXJcIiB8IFwicXVvdGVkSWRlbnRpZmllclwiIH1cbiAgPiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAodG9rZW4/LnR5cGUgIT09IFwiaWRlbnRpZmllclwiICYmIHRva2VuPy50eXBlICE9PSBcInF1b3RlZElkZW50aWZpZXJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ09MTEFURSDrjIDsg4Eg7Iud67OE7J6Q66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukLlwiKTtcbiAgICB9XG4gICAgdGhpcy5pbmRleCArPSAxO1xuICAgIHJldHVybiB0b2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgaXNUcmltQm90aEZyb21Gb3JtKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJvdGhUb2tlbiA9IHRoaXMucGVlaygpO1xuICAgIGNvbnN0IGZyb21Ub2tlbiA9IHRoaXMucGVlaygxKTtcblxuICAgIHJldHVybiAoXG4gICAgICBib3RoVG9rZW4/LnR5cGUgPT09IFwiaWRlbnRpZmllclwiICYmXG4gICAgICBib3RoVG9rZW4udmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJib3RoXCIgJiZcbiAgICAgIGZyb21Ub2tlbj8udHlwZSA9PT0gXCJpZGVudGlmaWVyXCIgJiZcbiAgICAgIGZyb21Ub2tlbi52YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcImZyb21cIlxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGV4cGVjdFN5bWJvbCh2YWx1ZTogXCIoXCIgfCBcIilcIiB8IFwiLFwiKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1hdGNoU3ltYm9sKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBcIiR7dmFsdWV9XCIg7Yag7YGw7J20IO2VhOyalO2VqeuLiOuLpC5gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1hdGNoU3ltYm9sKHZhbHVlOiBcIihcIiB8IFwiKVwiIHwgXCIsXCIpOiBib29sZWFuIHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0b2tlbj8udHlwZSA9PT0gXCJzeW1ib2xcIiAmJiB0b2tlbi52YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuaW5kZXggKz0gMTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIG1hdGNoT3BlcmF0b3IodmFsdWU6IFwifHxcIiB8IFwiOjpcIik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRva2VuPy50eXBlID09PSBcIm9wZXJhdG9yXCIgJiYgdG9rZW4udmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICB0aGlzLmluZGV4ICs9IDE7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXRjaElkZW50aWZpZXIodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRva2VuPy50eXBlID09PSBcImlkZW50aWZpZXJcIiAmJiB0b2tlbi52YWx1ZS50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLmluZGV4ICs9IDE7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lVG9rZW4oY29udGV4dDogc3RyaW5nKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ub2tlbiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Y29udGV4dH0g7Yag7YGw7J20IO2VhOyalO2VqeuLiOuLpC5gKTtcbiAgICB9XG4gICAgdGhpcy5pbmRleCArPSAxO1xuICAgIHJldHVybiB0b2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgcGVlayhvZmZzZXQgPSAwKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ub2tlbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zW3RoaXMuaW5kZXggKyBvZmZzZXRdO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEluZGV4Q29sdW1uT3BjbGFzcyhjb2x1bW46IE1pZ3JhdGlvbkluZGV4W1wiY29sdW1uc1wiXVtudW1iZXJdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbHVtbi5vcGNsYXNzID8/IGNvbHVtbi52ZWN0b3JPcHM7XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplU2VhcmNoVGV4dEV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ub2tlbltdIHtcbiAgY29uc3QgdG9rZW5zOiBTZWFyY2hUZXh0RXhwcmVzc2lvblRva2VuW10gPSBbXTtcbiAgbGV0IGluZGV4ID0gMDtcblxuICB3aGlsZSAoaW5kZXggPCBleHByZXNzaW9uLmxlbmd0aCkge1xuICAgIGNvbnN0IGNoYXIgPSBleHByZXNzaW9uW2luZGV4XTtcblxuICAgIGlmIChjaGFyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICgvXFxzLy50ZXN0KGNoYXIpKSB7XG4gICAgICBpbmRleCArPSAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGV4cHJlc3Npb24uc3RhcnRzV2l0aChcInx8XCIsIGluZGV4KSkge1xuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcIm9wZXJhdG9yXCIsIHZhbHVlOiBcInx8XCIgfSk7XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGV4cHJlc3Npb24uc3RhcnRzV2l0aChcIjo6XCIsIGluZGV4KSkge1xuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcIm9wZXJhdG9yXCIsIHZhbHVlOiBcIjo6XCIgfSk7XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09IFwiKFwiIHx8IGNoYXIgPT09IFwiKVwiIHx8IGNoYXIgPT09IFwiLFwiKSB7XG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFwic3ltYm9sXCIsIHZhbHVlOiBjaGFyIH0pO1xuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGFyID09PSBcIidcIikge1xuICAgICAgbGV0IHZhbHVlID0gXCJcIjtcbiAgICAgIGluZGV4ICs9IDE7XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGV4cHJlc3Npb24ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBleHByZXNzaW9uW2luZGV4XTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IFwiJ1wiKSB7XG4gICAgICAgICAgaWYgKGV4cHJlc3Npb25baW5kZXggKyAxXSA9PT0gXCInXCIpIHtcbiAgICAgICAgICAgIHZhbHVlICs9IFwiJ1wiO1xuICAgICAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZSArPSBjdXJyZW50O1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgfVxuXG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFwic3RyaW5nXCIsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09ICdcIicpIHtcbiAgICAgIGxldCB2YWx1ZSA9IFwiXCI7XG4gICAgICBpbmRleCArPSAxO1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCBleHByZXNzaW9uLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gZXhwcmVzc2lvbltpbmRleF07XG4gICAgICAgIGlmIChjdXJyZW50ID09PSAnXCInKSB7XG4gICAgICAgICAgaWYgKGV4cHJlc3Npb25baW5kZXggKyAxXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgdmFsdWUgKz0gJ1wiJztcbiAgICAgICAgICAgIGluZGV4ICs9IDI7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgKz0gY3VycmVudDtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgIH1cblxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcInF1b3RlZElkZW50aWZpZXJcIiwgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoL1tBLVphLXpfXS8udGVzdChjaGFyKSkge1xuICAgICAgbGV0IHZhbHVlID0gY2hhcjtcbiAgICAgIGluZGV4ICs9IDE7XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGV4cHJlc3Npb24ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBleHByZXNzaW9uW2luZGV4XTtcbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IHVuZGVmaW5lZCAmJiAvW0EtWmEtejAtOV8kXS8udGVzdChjdXJyZW50KSkge1xuICAgICAgICAgIHZhbHVlICs9IGN1cnJlbnQ7XG4gICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcImlkZW50aWZpZXJcIiwgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYOyngOybkOuQmOyngCDslYrripQgc2VhcmNoVGV4dCBleHByZXNzaW9uIOusuOyekDogJHtjaGFyfWApO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuZnVuY3Rpb24gY2Fub25pY2FsaXplU2VhcmNoVGV4dEdlbmVyYXRlZEV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgU2VhcmNoVGV4dEV4cHJlc3Npb25QYXJzZXIodG9rZW5pemVTZWFyY2hUZXh0RXhwcmVzc2lvbihleHByZXNzaW9uKSk7XG4gICAgY29uc3QgcGFyc2VkRXhwcmVzc2lvbiA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24oKTtcblxuICAgIGlmICghcGFyc2VyLmlzQXRFbmQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2VhcmNoVGV4dCBleHByZXNzaW9uIO2MjOyLseydtCDrgZ3rgpjsp4Ag7JWK7JWY7Iq164uI64ukLlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVuZGVyU2VhcmNoVGV4dEV4cHJlc3Npb24obm9ybWFsaXplU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKHBhcnNlZEV4cHJlc3Npb24pKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVNlYXJjaFRleHRFeHByZXNzaW9uRmFsbGJhY2soZXhwcmVzc2lvbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKFxuICBub2RlOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUsXG4pOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUge1xuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJpZGVudGlmaWVyXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5ub2RlLFxuICAgICAgICBuYW1lOiBub2RlLnF1b3RlZCA/IG5vZGUubmFtZSA6IG5vZGUubmFtZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgfTtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBub2RlO1xuICAgIGNhc2UgXCJjb25jYXRcIjoge1xuICAgICAgY29uc3QgcGFydHMgPSBub2RlLnBhcnRzLmZsYXRNYXAoKHBhcnQpID0+IHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhcnQgPSBub3JtYWxpemVTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUocGFydCk7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkUGFydC50eXBlID09PSBcImNvbmNhdFwiID8gbm9ybWFsaXplZFBhcnQucGFydHMgOiBbbm9ybWFsaXplZFBhcnRdO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4geyB0eXBlOiBcImNvbmNhdFwiLCBwYXJ0cyB9O1xuICAgIH1cbiAgICBjYXNlIFwiY29sbGF0ZVwiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJjb2xsYXRlXCIsXG4gICAgICAgIGV4cHI6IG5vcm1hbGl6ZVNlYXJjaFRleHRFeHByZXNzaW9uTm9kZShub2RlLmV4cHIpLFxuICAgICAgICBjb2xsYXRpb246IG5vZGUuY29sbGF0aW9uLnRvVXBwZXJDYXNlKCkgPT09IFwiQ1wiID8gXCJDXCIgOiBub2RlLmNvbGxhdGlvbixcbiAgICAgICAgcXVvdGVkOiBub2RlLnF1b3RlZCB8fCBub2RlLmNvbGxhdGlvbi50b1VwcGVyQ2FzZSgpID09PSBcIkNcIixcbiAgICAgIH07XG4gICAgY2FzZSBcImNhc3RcIjoge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEV4cHIgPSBub3JtYWxpemVTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUobm9kZS5leHByKTtcbiAgICAgIGNvbnN0IHRhcmdldFR5cGUgPSBub2RlLnRhcmdldFR5cGUucmVwbGFjZSgvXFxzKy9nLCBcIiBcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAodGFyZ2V0VHlwZSA9PT0gXCJ0ZXh0XCIgfHwgdGFyZ2V0VHlwZSA9PT0gXCJjaGFyYWN0ZXIgdmFyeWluZ1wiIHx8IHRhcmdldFR5cGUgPT09IFwidmFyY2hhclwiKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRXhwcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiY2FzdFwiLFxuICAgICAgICBleHByOiBub3JtYWxpemVkRXhwcixcbiAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgXCJmdW5jdGlvblwiOiB7XG4gICAgICBjb25zdCBuYW1lID0gbm9kZS5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBsZXQgYXJncyA9IG5vZGUuYXJncy5tYXAoKGFyZykgPT4gbm9ybWFsaXplU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKGFyZykpO1xuXG4gICAgICBpZiAoKG5hbWUgPT09IFwidHJpbVwiIHx8IG5hbWUgPT09IFwiYnRyaW1cIikgJiYgYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgbmFtZTogXCJ0cmltXCIsXG4gICAgICAgICAgYXJncyxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAobmFtZSA9PT0gXCJzb25hbXVfdGV4dF9hcnJheV9hZ2dcIiB8fCBuYW1lID09PSBcInNvbmFtdV9qc29uYl9hcnJheV9hZ2dcIikgJiZcbiAgICAgICAgYXJncy5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgYXJnc1sxXT8udHlwZSA9PT0gXCJib29sZWFuXCIgJiZcbiAgICAgICAgYXJnc1sxXS52YWx1ZVxuICAgICAgKSB7XG4gICAgICAgIGFyZ3MgPSBbYXJnc1swXV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgbmFtZSxcbiAgICAgICAgYXJncyxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlclNlYXJjaFRleHRFeHByZXNzaW9uKG5vZGU6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSwgcGFyZW50UHJlY2VkZW5jZSA9IDApOiBzdHJpbmcge1xuICBjb25zdCBwcmVjZWRlbmNlID0gZ2V0U2VhcmNoVGV4dEV4cHJlc3Npb25QcmVjZWRlbmNlKG5vZGUpO1xuICBjb25zdCByZW5kZXJlZCA9ICgoKSA9PiB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJpZGVudGlmaWVyXCI6XG4gICAgICAgIHJldHVybiBub2RlLnF1b3RlZCA/IGBcIiR7bm9kZS5uYW1lLnJlcGxhY2VBbGwoJ1wiJywgJ1wiXCInKX1cImAgOiBub2RlLm5hbWU7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIHJldHVybiBgJyR7bm9kZS52YWx1ZS5yZXBsYWNlQWxsKFwiJ1wiLCBcIicnXCIpfSdgO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIG5vZGUudmFsdWUgPyBcInRydWVcIiA6IFwiZmFsc2VcIjtcbiAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICByZXR1cm4gYCR7bm9kZS5uYW1lfSgke25vZGUuYXJnc1xuICAgICAgICAgIC5tYXAoKGFyZykgPT4gcmVuZGVyU2VhcmNoVGV4dEV4cHJlc3Npb24oYXJnKSlcbiAgICAgICAgICAuam9pbihcIiwgXCIpfSlgO1xuICAgICAgY2FzZSBcImNvbmNhdFwiOlxuICAgICAgICByZXR1cm4gbm9kZS5wYXJ0cy5tYXAoKHBhcnQpID0+IHJlbmRlclNlYXJjaFRleHRFeHByZXNzaW9uKHBhcnQsIHByZWNlZGVuY2UpKS5qb2luKFwiIHx8IFwiKTtcbiAgICAgIGNhc2UgXCJjb2xsYXRlXCI6IHtcbiAgICAgICAgY29uc3QgY29sbGF0aW9uID0gbm9kZS5xdW90ZWRcbiAgICAgICAgICA/IGBcIiR7bm9kZS5jb2xsYXRpb24ucmVwbGFjZUFsbCgnXCInLCAnXCJcIicpfVwiYFxuICAgICAgICAgIDogbm9kZS5jb2xsYXRpb247XG4gICAgICAgIHJldHVybiBgJHtyZW5kZXJTZWFyY2hUZXh0RXhwcmVzc2lvbihub2RlLmV4cHIsIHByZWNlZGVuY2UpfSBDT0xMQVRFICR7Y29sbGF0aW9ufWA7XG4gICAgICB9XG4gICAgICBjYXNlIFwiY2FzdFwiOlxuICAgICAgICByZXR1cm4gYCR7cmVuZGVyU2VhcmNoVGV4dEV4cHJlc3Npb24obm9kZS5leHByLCBwcmVjZWRlbmNlKX06OiR7bm9kZS50YXJnZXRUeXBlfWA7XG4gICAgfVxuICB9KSgpO1xuXG4gIGlmIChwcmVjZWRlbmNlIDwgcGFyZW50UHJlY2VkZW5jZSkge1xuICAgIHJldHVybiBgKCR7cmVuZGVyZWR9KWA7XG4gIH1cblxuICByZXR1cm4gcmVuZGVyZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFNlYXJjaFRleHRFeHByZXNzaW9uUHJlY2VkZW5jZShub2RlOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUpOiBudW1iZXIge1xuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJjb25jYXRcIjpcbiAgICAgIHJldHVybiAxO1xuICAgIGNhc2UgXCJjb2xsYXRlXCI6XG4gICAgY2FzZSBcImNhc3RcIjpcbiAgICAgIHJldHVybiAyO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gMztcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTZWFyY2hUZXh0RXhwcmVzc2lvbkZhbGxiYWNrKGV4cHJlc3Npb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBleHByZXNzaW9uXG4gICAgLnJlcGxhY2UoL1xccysvZywgXCIgXCIpXG4gICAgLnJlcGxhY2UoL1xcYlRSSU1cXHMqXFwoXFxzKkJPVEhcXHMrRlJPTVxccysvZ2ksIFwidHJpbShcIilcbiAgICAucmVwbGFjZSgvOjooPzp0ZXh0fGNoYXJhY3RlciB2YXJ5aW5nfHZhcmNoYXIpXFxiL2dpLCBcIlwiKVxuICAgIC5yZXBsYWNlKC8sXFxzKnRydWVcXGIvZ2ksIFwiXCIpXG4gICAgLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gdmlzaXRTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUoXG4gIG5vZGU6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSxcbiAgdmlzaXRvcjogKG5vZGU6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSkgPT4gdm9pZCxcbik6IHZvaWQge1xuICB2aXNpdG9yKG5vZGUpO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcImNvbmNhdFwiOlxuICAgICAgbm9kZS5wYXJ0cy5mb3JFYWNoKChwYXJ0KSA9PiB7XG4gICAgICAgIHZpc2l0U2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKHBhcnQsIHZpc2l0b3IpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgY2FzZSBcImNvbGxhdGVcIjpcbiAgICBjYXNlIFwiY2FzdFwiOlxuICAgICAgdmlzaXRTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUobm9kZS5leHByLCB2aXNpdG9yKTtcbiAgICAgIHJldHVybjtcbiAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgIG5vZGUuYXJncy5mb3JFYWNoKChhcmcpID0+IHtcbiAgICAgICAgdmlzaXRTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUoYXJnLCB2aXNpdG9yKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIGNhc2UgXCJpZGVudGlmaWVyXCI6XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U2VhcmNoVGV4dEhlbHBlcktpbmRzRnJvbUV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogU2V0PFNlYXJjaFRleHRIZWxwZXJLaW5kPiB7XG4gIGNvbnN0IGhlbHBlcktpbmRzID0gbmV3IFNldDxTZWFyY2hUZXh0SGVscGVyS2luZD4oKTtcbiAgY29uc3QgYWRkSGVscGVyS2luZEZyb21OYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChub3JtYWxpemVkTmFtZSA9PT0gXCJzb25hbXVfdGV4dF9hcnJheV9hZ2dcIikge1xuICAgICAgaGVscGVyS2luZHMuYWRkKFwidGV4dC1hcnJheVwiKTtcbiAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWROYW1lID09PSBcInNvbmFtdV9qc29uYl9hcnJheV9hZ2dcIikge1xuICAgICAgaGVscGVyS2luZHMuYWRkKFwianNvbmItYXJyYXlcIik7XG4gICAgfVxuICB9O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFNlYXJjaFRleHRFeHByZXNzaW9uUGFyc2VyKHRva2VuaXplU2VhcmNoVGV4dEV4cHJlc3Npb24oZXhwcmVzc2lvbikpO1xuICAgIGNvbnN0IHBhcnNlZEV4cHJlc3Npb24gPSBwYXJzZXIucGFyc2VFeHByZXNzaW9uKCk7XG5cbiAgICBpZiAoIXBhcnNlci5pc0F0RW5kKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNlYXJjaFRleHQgaGVscGVyIGV4cHJlc3Npb24g7YyM7Iux7J20IOuBneuCmOyngCDslYrslZjsirXri4jri6QuXCIpO1xuICAgIH1cblxuICAgIHZpc2l0U2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKHBhcnNlZEV4cHJlc3Npb24sIChub2RlKSA9PiB7XG4gICAgICBpZiAobm9kZS50eXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgYWRkSGVscGVyS2luZEZyb21OYW1lKG5vZGUubmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIGlmICgvXFxic29uYW11X3RleHRfYXJyYXlfYWdnXFxzKlxcKC9pLnRlc3QoZXhwcmVzc2lvbikpIHtcbiAgICAgIGhlbHBlcktpbmRzLmFkZChcInRleHQtYXJyYXlcIik7XG4gICAgfVxuICAgIGlmICgvXFxic29uYW11X2pzb25iX2FycmF5X2FnZ1xccypcXCgvaS50ZXN0KGV4cHJlc3Npb24pKSB7XG4gICAgICBoZWxwZXJLaW5kcy5hZGQoXCJqc29uYi1hcnJheVwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaGVscGVyS2luZHM7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTZWFyY2hUZXh0Q29sdW1ucyh0YWJsZTogc3RyaW5nLCBjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSk6IE1pZ3JhdGlvbkNvbHVtbltdIHtcbiAgY29uc3QgZW50aXR5ID0gKCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEVudGl0eU1hbmFnZXIuZ2V0QnlUYWJsZSh0YWJsZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0pKCk7XG5cbiAgaWYgKCFlbnRpdHkpIHtcbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIGNvbnN0IHByb3BzQnlOYW1lID0gbmV3IE1hcChlbnRpdHkucHJvcHMubWFwKChwcm9wKSA9PiBbcHJvcC5uYW1lLCBwcm9wXSkpO1xuXG4gIHJldHVybiBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgY29uc3QgcHJvcCA9IHByb3BzQnlOYW1lLmdldChjb2x1bW4ubmFtZSk7XG4gICAgaWYgKCFwcm9wIHx8ICFpc1NlYXJjaFRleHRQcm9wKHByb3ApKSB7XG4gICAgICByZXR1cm4gY29sdW1uO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb2x1bW4sXG4gICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgdHlwZTogXCJTVE9SRURcIixcbiAgICAgICAgZXhwcmVzc2lvbjogYnVpbGRTZWFyY2hUZXh0R2VuZXJhdGVkRXhwcmVzc2lvbihwcm9wLCBwcm9wc0J5TmFtZSksXG4gICAgICB9LFxuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZFNlYXJjaFRleHRHZW5lcmF0ZWRFeHByZXNzaW9uKFxuICBwcm9wOiBFeHRyYWN0PEVudGl0eVByb3AsIHsgdHlwZTogXCJzZWFyY2hUZXh0XCIgfT4sXG4gIHByb3BzQnlOYW1lOiBNYXA8c3RyaW5nLCBFbnRpdHlQcm9wPixcbik6IHN0cmluZyB7XG4gIGNvbnN0IHRva2VucyA9IHByb3Auc291cmNlQ29sdW1ucy5tYXAoKHNvdXJjZSkgPT4ge1xuICAgIGNvbnN0IHNvdXJjZVByb3AgPSBwcm9wc0J5TmFtZS5nZXQoc291cmNlLm5hbWUpO1xuICAgIGlmICghc291cmNlUHJvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZWFyY2hUZXh0IHNvdXJjZSBjb2x1bW4gXCIke3NvdXJjZS5uYW1lfVwi7J2EKOulvCkg7LC+7J2EIOyImCDsl4bsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZVByb3AudHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHNvdXJjZS5jYXNlSW5zZW5zaXRpdmVcbiAgICAgICAgPyBgbG93ZXIoQ09BTEVTQ0UoJHtzb3VyY2UubmFtZX0sICcnKSlgXG4gICAgICAgIDogYENPQUxFU0NFKCR7c291cmNlLm5hbWV9LCAnJylgO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2VQcm9wLnR5cGUgPT09IFwic3RyaW5nW11cIikge1xuICAgICAgcmV0dXJuIHNvdXJjZS5jYXNlSW5zZW5zaXRpdmVcbiAgICAgICAgPyBgQ09BTEVTQ0Uoc29uYW11X3RleHRfYXJyYXlfYWdnKCR7c291cmNlLm5hbWV9KSwgJycpYFxuICAgICAgICA6IGBDT0FMRVNDRShzb25hbXVfdGV4dF9hcnJheV9hZ2coJHtzb3VyY2UubmFtZX0sIGZhbHNlKSwgJycpYDtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlUHJvcC50eXBlID09PSBcImpzb25cIikge1xuICAgICAgcmV0dXJuIHNvdXJjZS5jYXNlSW5zZW5zaXRpdmVcbiAgICAgICAgPyBgQ09BTEVTQ0Uoc29uYW11X2pzb25iX2FycmF5X2FnZygke3NvdXJjZS5uYW1lfSksICcnKWBcbiAgICAgICAgOiBgQ09BTEVTQ0Uoc29uYW11X2pzb25iX2FycmF5X2FnZygke3NvdXJjZS5uYW1lfSwgZmFsc2UpLCAnJylgO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBzZWFyY2hUZXh0IHNvdXJjZSBjb2x1bW4gXCIke3NvdXJjZS5uYW1lfVwi7J2YIO2DgOyehSBcIiR7c291cmNlUHJvcC50eXBlfVwi7J2AKOuKlCkg7KeA7JuQ65CY7KeAIOyViuyKteuLiOuLpC5gLFxuICAgICk7XG4gIH0pO1xuXG4gIHJldHVybiBgdHJpbSgke3Rva2Vucy5qb2luKGAgfHwgJyAnIHx8IGApfSlgO1xufVxuXG5mdW5jdGlvbiBnZXRTZWFyY2hUZXh0SGVscGVyRGVmaW5pdGlvbnModGFibGU6IHN0cmluZywgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGhlbHBlcktpbmRzID0gbmV3IFNldDxTZWFyY2hUZXh0SGVscGVyS2luZD4oKTtcblxuICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgIGlmICghY29sdW1uLmdlbmVyYXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGdldFNlYXJjaFRleHRIZWxwZXJLaW5kc0Zyb21FeHByZXNzaW9uKGNvbHVtbi5nZW5lcmF0ZWQuZXhwcmVzc2lvbikuZm9yRWFjaCgoa2luZCkgPT4ge1xuICAgICAgaGVscGVyS2luZHMuYWRkKGtpbmQpO1xuICAgIH0pO1xuICB9KTtcblxuICBpZiAoaGVscGVyS2luZHMuc2l6ZSA+IDApIHtcbiAgICByZXR1cm4gKFtcInRleHQtYXJyYXlcIiwgXCJqc29uYi1hcnJheVwiXSBhcyBjb25zdClcbiAgICAgIC5maWx0ZXIoKGtpbmQpID0+IGhlbHBlcktpbmRzLmhhcyhraW5kKSlcbiAgICAgIC5tYXAoKGtpbmQpID0+IFNFQVJDSF9URVhUX0hFTFBFUl9ERUZJTklUSU9OU1traW5kXSk7XG4gIH1cblxuICBjb25zdCBlbnRpdHkgPSAoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRCeVRhYmxlKHRhYmxlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSkoKTtcblxuICBpZiAoIWVudGl0eSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBwcm9wc0J5TmFtZSA9IG5ldyBNYXAoZW50aXR5LnByb3BzLm1hcCgocHJvcCkgPT4gW3Byb3AubmFtZSwgcHJvcF0pKTtcblxuICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgIGNvbnN0IHByb3AgPSBwcm9wc0J5TmFtZS5nZXQoY29sdW1uLm5hbWUpO1xuICAgIGlmICghcHJvcCB8fCAhaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHByb3Auc291cmNlQ29sdW1ucy5mb3JFYWNoKChzb3VyY2UpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZVByb3AgPSBwcm9wc0J5TmFtZS5nZXQoc291cmNlLm5hbWUpO1xuICAgICAgaWYgKHNvdXJjZVByb3A/LnR5cGUgPT09IFwic3RyaW5nW11cIikge1xuICAgICAgICBoZWxwZXJLaW5kcy5hZGQoXCJ0ZXh0LWFycmF5XCIpO1xuICAgICAgfSBlbHNlIGlmIChzb3VyY2VQcm9wPy50eXBlID09PSBcImpzb25cIikge1xuICAgICAgICBoZWxwZXJLaW5kcy5hZGQoXCJqc29uYi1hcnJheVwiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIChbXCJ0ZXh0LWFycmF5XCIsIFwianNvbmItYXJyYXlcIl0gYXMgY29uc3QpXG4gICAgLmZpbHRlcigoa2luZCkgPT4gaGVscGVyS2luZHMuaGFzKGtpbmQpKVxuICAgIC5tYXAoKGtpbmQpID0+IFNFQVJDSF9URVhUX0hFTFBFUl9ERUZJTklUSU9OU1traW5kXSk7XG59XG5cbmZ1bmN0aW9uIGdldFNlYXJjaFRleHRDb2x1bW5OYW1lcyh0YWJsZTogc3RyaW5nKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCBlbnRpdHkgPSAoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRCeVRhYmxlKHRhYmxlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSkoKTtcblxuICBpZiAoIWVudGl0eSkge1xuICAgIHJldHVybiBuZXcgU2V0KCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFNldChlbnRpdHkucHJvcHMuZmlsdGVyKGlzU2VhcmNoVGV4dFByb3ApLm1hcCgocHJvcCkgPT4gcHJvcC5uYW1lKSk7XG59XG5cbi8qKlxuICog7YWM7J2067iUIOyDneyEse2VmOuKlCDsvIDsnbTsiqQgLSDsu6zrn7wv7J24642x7IqkIOyDneyEsVxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNyZWF0ZUNvZGVfQ29sdW1uQW5kSW5kZXhlcyhcbiAgdGFibGU6IHN0cmluZyxcbiAgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gIGluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10sXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGU+IHtcbiAgY29uc3QgcmVzb2x2ZWRDb2x1bW5zID0gcmVzb2x2ZVNlYXJjaFRleHRDb2x1bW5zKHRhYmxlLCBjb2x1bW5zKTtcbiAgY29uc3QgY29sdW1uRGVmcyA9IGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCByZXNvbHZlZENvbHVtbnMpO1xuICBjb25zdCBoZWxwZXJEZWZpbml0aW9ucyA9IGdldFNlYXJjaFRleHRIZWxwZXJEZWZpbml0aW9ucyh0YWJsZSwgcmVzb2x2ZWRDb2x1bW5zKTtcblxuICAvLyDsu6zrn7wsIOyduOuNseyKpCDsspjrpqxcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICdpbXBvcnQgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjsnLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIC4uLmhlbHBlckRlZmluaXRpb25zLFxuICAgIGBhd2FpdCBrbmV4LnNjaGVtYS5jcmVhdGVUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsXG4gICAgLi4uY29sdW1uRGVmcy5idWlsZGVyLFxuICAgIFwifSk7XCIsXG4gICAgLy8gcmF3IOq1rOusuCAoR2VuZXJhdGVkIENvbHVtbiDrk7EpXG4gICAgLi4uY29sdW1uRGVmcy5yYXcsXG4gICAgLy8gaW5kZXjripQga25leC5yYXfroZwg7LKY66as7ZWY66+A66GcIGNyZWF0ZVRhYmxlIOuwluyXkOyEnCDsi6TtlolcbiAgICAuLi5pbmRleGVzLm1hcCgoaW5kZXgpID0+IGdlbkluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpKSxcbiAgICBcIn1cIixcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd24oa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGAgcmV0dXJuIGtuZXguc2NoZW1hLmRyb3BUYWJsZShcIiR7dGFibGV9XCIpO2AsXG4gICAgXCJ9XCIsXG4gIF07XG4gIHJldHVybiB7XG4gICAgdGFibGUsXG4gICAgdHlwZTogXCJub3JtYWxcIixcbiAgICB0aXRsZTogYGNyZWF0ZV9fJHt0YWJsZX1gLFxuICAgIGZvcm1hdHRlZDogYXdhaXQgZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBgc3JjL21pZ3JhdGlvbi8ke3RhYmxlfS50c2ApLFxuICB9O1xufVxuXG4vKipcbiAqIE1pZ3JhdGlvbkNvbHVtbltdIOydveyWtOyEnCDsu6zrn7wg7KCV7J2Y7ZWY64qUIOq1rOusuCDsg53shLFcbiAqIEByZXR1cm5zIGJ1aWxkZXI6IHRhYmxlIGJ1aWxkZXIg66mU7ISc65OcLCByYXc6IGtuZXgucmF3KCkg6rWs66y4XG4gKi9cbmZ1bmN0aW9uIGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlOiBzdHJpbmcsIGNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdKTogQ29sdW1uRGVmaW5pdGlvblJlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdDogQ29sdW1uRGVmaW5pdGlvblJlc3VsdCA9IHtcbiAgICBidWlsZGVyOiBbXSxcbiAgICByYXc6IFtdLFxuICB9O1xuXG4gIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAvLyBHZW5lcmF0ZWQgQ29sdW1u7J2AIHJhd+uhnCDsspjrpqxcbiAgICBpZiAoY29sdW1uLmdlbmVyYXRlZCkge1xuICAgICAgcmVzdWx0LnJhdy5wdXNoKGdlbkdlbmVyYXRlZENvbHVtbkRlZmluaXRpb24odGFibGUsIGNvbHVtbikpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8g7J2867CYIOy7rOufvOydgCBidWlsZGVy66GcIOyymOumrFxuICAgIHJlc3VsdC5idWlsZGVyLnB1c2goZ2VuTm9ybWFsQ29sdW1uRGVmaW5pdGlvbihjb2x1bW4pKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogR2VuZXJhdGVkIENvbHVtbiDsoJXsnZgg7IOd7ISxIChBTFRFUiBUQUJMRSBBREQgQ09MVU1OIOyCrOyaqSlcbiAqL1xuZnVuY3Rpb24gZ2VuR2VuZXJhdGVkQ29sdW1uRGVmaW5pdGlvbih0YWJsZTogc3RyaW5nLCBjb2x1bW46IE1pZ3JhdGlvbkNvbHVtbik6IHN0cmluZyB7XG4gIGlmICghY29sdW1uLmdlbmVyYXRlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRlZCBjb2x1bW4gZGVmaW5pdGlvbiByZXF1aXJlZFwiKTtcbiAgfVxuICBjb25zdCBwZ1R5cGUgPSBnZXRQZ1R5cGVGb3JDb2x1bW4oY29sdW1uKTtcbiAgY29uc3Qgc3RvcmFnZVR5cGUgPSBjb2x1bW4uZ2VuZXJhdGVkLnR5cGUgPT09IFwiVklSVFVBTFwiID8gXCIgVklSVFVBTFwiIDogXCIgU1RPUkVEXCI7XG4gIGNvbnN0IG51bGxhYmxlQ2xhdXNlID0gY29sdW1uLm51bGxhYmxlID8gXCJcIiA6IFwiIE5PVCBOVUxMXCI7XG4gIHJldHVybiBgYXdhaXQga25leC5yYXcoXFxgQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIEFERCBDT0xVTU4gXCIke2NvbHVtbi5uYW1lfVwiICR7cGdUeXBlfSBHRU5FUkFURUQgQUxXQVlTIEFTICgke2NvbHVtbi5nZW5lcmF0ZWQuZXhwcmVzc2lvbn0pJHtzdG9yYWdlVHlwZX0ke251bGxhYmxlQ2xhdXNlfVxcYCk7YDtcbn1cblxuLyoqXG4gKiDsnbzrsJgg7Lus65+8IOygleydmCDsg53shLEgKHRhYmxlLnh4eCgpIOyytOyduClcbiAqL1xuZnVuY3Rpb24gZ2VuTm9ybWFsQ29sdW1uRGVmaW5pdGlvbihjb2x1bW46IE1pZ3JhdGlvbkNvbHVtbik6IHN0cmluZyB7XG4gIGNvbnN0IGNoYWluczogc3RyaW5nW10gPSBbXTtcblxuICBpZiAoY29sdW1uLm5hbWUgPT09IFwiaWRcIikge1xuICAgIC8vIFBLIO2DgOyeheyXkCDrlLDrpbgg67aE6riwIOyymOumrFxuICAgIGlmIChjb2x1bW4udHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgLy8gc3RyaW5nIFBLOiBsZW5ndGjqsIAg7J6I7Jy866m0IHZhcmNoYXIsIOyXhuycvOuptCB0ZXh0XG4gICAgICBpZiAoY29sdW1uLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBgdGFibGUuc3RyaW5nKCdpZCcsICR7Y29sdW1uLmxlbmd0aH0pLnByaW1hcnkoKS5ub3ROdWxsYWJsZSgpO2A7XG4gICAgICB9XG4gICAgICByZXR1cm4gYHRhYmxlLnRleHQoJ2lkJykucHJpbWFyeSgpLm5vdE51bGxhYmxlKCk7YDtcbiAgICB9XG4gICAgaWYgKGNvbHVtbi50eXBlID09PSBcInV1aWRcIikge1xuICAgICAgcmV0dXJuIGB0YWJsZS51dWlkKCdpZCcpLnByaW1hcnkoKS5ub3ROdWxsYWJsZSgpO2A7XG4gICAgfVxuICAgIC8vIOq4sOyhtCBpbnRlZ2VyIFBLICjquLDrs7jqsJIpXG4gICAgcmV0dXJuIGB0YWJsZS5pbmNyZW1lbnRzKCkucHJpbWFyeSgpO2A7XG4gIH1cblxuICAvLyDrsLDsl7Qg7YOA7J6FIOyymOumrFxuICBpZiAoY29sdW1uLnR5cGUuZW5kc1dpdGgoXCJbXVwiKSkge1xuICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gY29sdW1uLnR5cGUuc2xpY2UoMCwgLTIpOyAvLyBcImludGVnZXJbXVwiIC0+IFwiaW50ZWdlclwiXG4gICAgY29uc3QgcGdUeXBlID0gZ2V0UGdBcnJheVR5cGUoY29sdW1uLCBlbGVtZW50VHlwZSk7XG4gICAgY2hhaW5zLnB1c2goYHNwZWNpZmljVHlwZSgnJHtjb2x1bW4ubmFtZX0nLCAnJHtwZ1R5cGV9JylgKTtcbiAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJ2ZWN0b3JcIikge1xuICAgIC8vIEtuZXjripQgdmVjdG9yIO2DgOyeheydhCDsp4HsoJEg7KeA7JuQ7ZWY7KeAIOyViuycvOuvgOuhnCBzcGVjaWZpY1R5cGUg7IKs7JqpXG4gICAgY2hhaW5zLnB1c2goYHNwZWNpZmljVHlwZSgnJHtjb2x1bW4ubmFtZX0nLCAndmVjdG9yKCR7Y29sdW1uLmRpbWVuc2lvbnN9KScpYCk7XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwibnVtYmVyT3JOdW1lcmljXCIpIHtcbiAgICAvLyBudW1iZXJcbiAgICBpZiAoY29sdW1uLm51bWJlclR5cGUgPT09IFwicmVhbFwiKSB7XG4gICAgICBjaGFpbnMucHVzaChgZmxvYXQoJyR7Y29sdW1uLm5hbWV9JylgKTtcbiAgICB9IGVsc2UgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcImRvdWJsZSBwcmVjaXNpb25cIikge1xuICAgICAgY2hhaW5zLnB1c2goYGRvdWJsZSgnJHtjb2x1bW4ubmFtZX0nKWApO1xuICAgIH0gZWxzZSBpZiAoKGNvbHVtbi5udW1iZXJUeXBlID8/IFwibnVtZXJpY1wiKSA9PT0gXCJudW1lcmljXCIpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBkZWNpbWFsKCcke2NvbHVtbi5uYW1lfScsICR7Y29sdW1uLnByZWNpc2lvbn0sICR7Y29sdW1uLnNjYWxlfSlgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAvLyBzdHJpbmdcbiAgICBpZiAoY29sdW1uLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjaGFpbnMucHVzaChgc3RyaW5nKCcke2NvbHVtbi5uYW1lfScsICR7Y29sdW1uLmxlbmd0aH0pYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYWlucy5wdXNoKGB0ZXh0KCcke2NvbHVtbi5uYW1lfScpYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcImRhdGVcIikge1xuICAgIC8vIGRhdGVcbiAgICBjaGFpbnMucHVzaChcbiAgICAgIGB0aW1lc3RhbXAoJyR7Y29sdW1uLm5hbWV9JywgeyB1c2VUejogdHJ1ZSwgcHJlY2lzaW9uOiAke2NvbHVtbi5wcmVjaXNpb24gPz8gM30gfSlgLFxuICAgICk7XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwianNvblwiKSB7XG4gICAgLy8ganNvblxuICAgIGNoYWlucy5wdXNoKGBqc29uYignJHtjb2x1bW4ubmFtZX0nKWApO1xuICB9IGVsc2Uge1xuICAgIC8vIHR5cGUsIGxlbmd0aFxuICAgIGNoYWlucy5wdXNoKGAke2NvbHVtbi50eXBlfSgnJHtjb2x1bW4ubmFtZX0nJHtjb2x1bW4ubGVuZ3RoID8gYCwgJHtjb2x1bW4ubGVuZ3RofWAgOiBcIlwifSlgKTtcbiAgfVxuXG4gIC8vIG51bGxhYmxlXG4gIGNoYWlucy5wdXNoKGNvbHVtbi5udWxsYWJsZSA/IFwibnVsbGFibGUoKVwiIDogXCJub3ROdWxsYWJsZSgpXCIpO1xuXG4gIC8vIGRlZmF1bHRUb1xuICBpZiAoY29sdW1uLmRlZmF1bHRUbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW4uZGVmYXVsdFRvID09PSBcInN0cmluZ1wiICYmIGNvbHVtbi5kZWZhdWx0VG8uc3RhcnRzV2l0aChgXCJgKSkge1xuICAgICAgY2hhaW5zLnB1c2goYGRlZmF1bHRUbygke2NvbHVtbi5kZWZhdWx0VG99KWApO1xuICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwianNvblwiICYmIHR5cGVvZiBjb2x1bW4uZGVmYXVsdFRvLnN0YXJ0c1dpdGgoJ1wiJykpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBkZWZhdWx0VG8oa25leC5yYXcoXCIke2NvbHVtbi5kZWZhdWx0VG8ucmVwbGFjZUFsbCgnXCInLCBcIidcIil9Ojpqc29uYlwiKSlgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hhaW5zLnB1c2goYGRlZmF1bHRUbyhrbmV4LnJhdygnJHtjb2x1bW4uZGVmYXVsdFRvfScpKWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBgdGFibGUuJHtjaGFpbnMuam9pbihcIi5cIil9O2A7XG59XG5cbi8qKlxuICogTWlncmF0aW9uQ29sdW1u7J2YIO2DgOyeheydhCBQb3N0Z3JlU1FMIO2DgOyehSDrrLjsnpDsl7TroZwg67OA7ZmYXG4gKi9cbmZ1bmN0aW9uIGdldFBnVHlwZUZvckNvbHVtbihjb2x1bW46IE1pZ3JhdGlvbkNvbHVtbik6IHN0cmluZyB7XG4gIGlmIChjb2x1bW4udHlwZS5lbmRzV2l0aChcIltdXCIpKSB7XG4gICAgY29uc3QgZWxlbWVudFR5cGUgPSBjb2x1bW4udHlwZS5zbGljZSgwLCAtMik7XG4gICAgcmV0dXJuIGdldFBnQXJyYXlUeXBlKGNvbHVtbiwgZWxlbWVudFR5cGUpO1xuICB9XG5cbiAgc3dpdGNoIChjb2x1bW4udHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBjb2x1bW4ubGVuZ3RoICE9PSB1bmRlZmluZWQgPyBgdmFyY2hhcigke2NvbHVtbi5sZW5ndGh9KWAgOiBcInRleHRcIjtcbiAgICBjYXNlIFwiYmlnSW50ZWdlclwiOlxuICAgICAgcmV0dXJuIFwiYmlnaW50XCI7XG4gICAgY2FzZSBcIm51bWJlck9yTnVtZXJpY1wiOlxuICAgICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcInJlYWxcIikgcmV0dXJuIFwicmVhbFwiO1xuICAgICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcImRvdWJsZSBwcmVjaXNpb25cIikgcmV0dXJuIFwiZG91YmxlIHByZWNpc2lvblwiO1xuICAgICAgcmV0dXJuIGBudW1lcmljKCR7Y29sdW1uLnByZWNpc2lvbn0sICR7Y29sdW1uLnNjYWxlfSlgO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJ0aW1lc3RhbXB0elwiO1xuICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICByZXR1cm4gXCJqc29uYlwiO1xuICAgIGNhc2UgXCJ2ZWN0b3JcIjpcbiAgICAgIHJldHVybiBgdmVjdG9yKCR7Y29sdW1uLmRpbWVuc2lvbnN9KWA7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBjb2x1bW4udHlwZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQZ0FycmF5VHlwZShjb2x1bW46IE1pZ3JhdGlvbkNvbHVtbiwgZWxlbWVudFR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJudW1iZXJPck51bWVyaWNcIikge1xuICAgIGlmIChjb2x1bW4ubnVtYmVyVHlwZSA9PT0gXCJyZWFsXCIpIHJldHVybiBcInJlYWxbXVwiO1xuICAgIGlmIChjb2x1bW4ubnVtYmVyVHlwZSA9PT0gXCJkb3VibGUgcHJlY2lzaW9uXCIpIHJldHVybiBcImRvdWJsZSBwcmVjaXNpb25bXVwiO1xuICAgIHJldHVybiBgbnVtZXJpYygke2NvbHVtbi5wcmVjaXNpb259LCAke2NvbHVtbi5zY2FsZX0pW11gO1xuICB9XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBjb2x1bW4ubGVuZ3RoID8gYHZhcmNoYXIoJHtjb2x1bW4ubGVuZ3RofSlbXWAgOiBcInRleHRbXVwiO1xuICB9XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJkYXRlXCIpIHJldHVybiBcInRpbWVzdGFtcHR6W11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImludGVnZXJcIikgcmV0dXJuIFwiaW50ZWdlcltdXCI7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIpIHJldHVybiBcImJpZ2ludFtdXCI7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiBcImJvb2xlYW5bXVwiO1xuICBpZiAoZWxlbWVudFR5cGUgPT09IFwidXVpZFwiKSByZXR1cm4gXCJ1dWlkW11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImVudW1cIikgcmV0dXJuIFwidGV4dFtdXCI7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJ2ZWN0b3JcIikgcmV0dXJuIGB2ZWN0b3IoJHtjb2x1bW4uZGltZW5zaW9uc30pW11gO1xuXG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhcnJheSBlbGVtZW50IHR5cGU6ICR7ZWxlbWVudFR5cGV9YCk7XG59XG5cbi8qKlxuICog6rCc67OEIOyduOuNseyKpCDsoJXsnZgg7IOd7ISxXG4gKi9cbmZ1bmN0aW9uIGdlbkluZGV4RGVmaW5pdGlvbihpbmRleDogTWlncmF0aW9uSW5kZXgsIHRhYmxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoaW5kZXgudHlwZSA9PT0gXCJobnN3XCIgfHwgaW5kZXgudHlwZSA9PT0gXCJpdmZmbGF0XCIpIHtcbiAgICByZXR1cm4gZ2VuVmVjdG9ySW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSk7XG4gIH1cblxuICBpZiAoaW5kZXgudXNpbmcgPT09IFwicGdyb29uZ2FcIikge1xuICAgIHJldHVybiBnZW5QZ3Jvb25nYUluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpO1xuICB9XG5cbiAgY29uc3QgbWV0aG9kTWFwID0ge1xuICAgIGluZGV4OiBcIklOREVYXCIsXG4gICAgdW5pcXVlOiBcIlVOSVFVRSBJTkRFWFwiLFxuICB9O1xuXG4gIGNvbnN0IG51bGxzTm90RGlzdGluY3RDbGF1c2UgPVxuICAgIGluZGV4LnR5cGUgPT09IFwidW5pcXVlXCIgJiYgaW5kZXgubnVsbHNOb3REaXN0aW5jdCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGAgTlVMTFMgJHtpbmRleC5udWxsc05vdERpc3RpbmN0ID8gXCJOT1QgRElTVElOQ1RcIiA6IFwiRElTVElOQ1RcIn1gXG4gICAgICA6IFwiXCI7XG5cbiAgY29uc3QgdXNpbmdDbGF1c2UgPSBpbmRleC51c2luZyA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGBVU0lORyAke2luZGV4LnVzaW5nfWA7XG4gIGNvbnN0IHdoZXJlQ2xhdXNlID0gZ2V0SW5kZXhXaGVyZUNsYXVzZShpbmRleCk7XG5cbiAgcmV0dXJuIGBhd2FpdCBrbmV4LnJhdyhcbiAgXFxgQ1JFQVRFICR7bWV0aG9kTWFwW2luZGV4LnR5cGVdfSAke2luZGV4Lm5hbWV9IE9OICR7dGFibGV9ICR7dXNpbmdDbGF1c2V9KCR7aW5kZXguY29sdW1uc1xuICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgY29uc3Qgb3BjbGFzc0NsYXVzZSA9ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wY2xhc3MgPSBnZXRJbmRleENvbHVtbk9wY2xhc3MoY29sKTtcbiAgICAgICAgcmV0dXJuIG9wY2xhc3MgPyBgICR7b3BjbGFzc31gIDogXCJcIjtcbiAgICAgIH0pKCk7XG5cbiAgICAgIC8vIOygleugrCDsmLXshZjsnYAgYnRyZWXrp4wg7IKs7JqpIOqwgOuKpVxuICAgICAgaWYgKGluZGV4LnVzaW5nICE9PSBcImJ0cmVlXCIgJiYgaW5kZXgudXNpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYCR7Y29sLm5hbWV9JHtvcGNsYXNzQ2xhdXNlfWA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNvcnRPcmRlckNsYXVzZSA9IGNvbC5zb3J0T3JkZXIgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBgICR7Y29sLnNvcnRPcmRlcn1gO1xuICAgICAgY29uc3QgbnVsbHNGaXJzdENsYXVzZSA9XG4gICAgICAgIGNvbC5udWxsc0ZpcnN0ID09PSB1bmRlZmluZWQgPyBcIlwiIDogYCBOVUxMUyAke2NvbC5udWxsc0ZpcnN0ID8gXCJGSVJTVFwiIDogXCJMQVNUXCJ9YDtcbiAgICAgIHJldHVybiBgJHtjb2wubmFtZX0ke29wY2xhc3NDbGF1c2V9JHtzb3J0T3JkZXJDbGF1c2V9JHtudWxsc0ZpcnN0Q2xhdXNlfWA7XG4gICAgfSlcbiAgICAuam9pbihcIiwgXCIpfSkke251bGxzTm90RGlzdGluY3RDbGF1c2V9JHt3aGVyZUNsYXVzZX07XFxgXG4gICk7YDtcbn1cblxuZnVuY3Rpb24gZ2VuUGdyb29uZ2FJbmRleERlZmluaXRpb24oaW5kZXg6IE1pZ3JhdGlvbkluZGV4LCB0YWJsZTogc3RyaW5nKSB7XG4gIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0QnlUYWJsZSh0YWJsZSk7XG4gIGNvbnN0IHdoZXJlQ2xhdXNlID0gZ2V0SW5kZXhXaGVyZUNsYXVzZShpbmRleCk7XG5cbiAgLy8g67O17ZWpIOyduOuNseyKpOyduCDqsr3smrAgQVJSQVkg7IKs7JqpXG4gIGNvbnN0IGNvbHVtbkNsYXVzZSA9ICgoKSA9PiB7XG4gICAgaWYgKGluZGV4LmNvbHVtbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBjb2x1bW4gPSBlbnRpdHkucHJvcHNEaWN0W2luZGV4LmNvbHVtbnNbMF0ubmFtZV07XG4gICAgICBjb25zdCBvcHRpb24gPSBnZXRQZ3Jvb25nYUNvbHVtbk9wdGlvbihjb2x1bW4pO1xuICAgICAgcmV0dXJuIGAke2luZGV4LmNvbHVtbnNbMF0ubmFtZX0ke29wdGlvbiA/IGAgJHtvcHRpb259YCA6IFwiXCJ9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYChBUlJBWVske2luZGV4LmNvbHVtbnMubWFwKChjb2wpID0+IGAke2NvbC5uYW1lfTo6dGV4dGApLmpvaW4oXCIsXCIpfV0pYDtcbiAgfSkoKTtcblxuICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxuICBcXGBDUkVBVEUgSU5ERVggJHtpbmRleC5uYW1lfSBPTiAke3RhYmxlfSBVU0lORyBwZ3Jvb25nYSAoJHtjb2x1bW5DbGF1c2V9KSBXSVRIICh0b2tlbml6ZXI9J1Rva2VuTWVjYWInKSR7d2hlcmVDbGF1c2V9O1xcYFxuICApYDtcbn1cblxuLyoqXG4gKiBQR3Jvb25nYSDsu6zrn7wg7Ji17IWYIOy2lOy2nFxuICpcbiAqIEZ1bGxUZXh0IOyYpO2NvOugiOydtO2EsOulvCDsp4Dsm5DtlZjripQg6rK97JqwIOyasOyEoCDshKTsoJUsIOuCmOuouOyngOuKlCDrlJTtj7Ttirgg7J207JqpXG4gKiBAbGluayBodHRwczovL3Bncm9vbmdhLmdpdGh1Yi5pby9yZWZlcmVuY2VcbiAqL1xuZnVuY3Rpb24gZ2V0UGdyb29uZ2FDb2x1bW5PcHRpb24oY29sdW1uOiBFbnRpdHlQcm9wKSB7XG4gIGlmIChjb2x1bW4udHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBjb2x1bW4ubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gXCJwZ3Jvb25nYV92YXJjaGFyX2Z1bGxfdGV4dF9zZWFyY2hfb3BzX3YyXCI7XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwianNvblwiKSB7XG4gICAgcmV0dXJuIFwicGdyb29uZ2FfanNvbmJfZnVsbF90ZXh0X3NlYXJjaF9vcHNfdjJcIjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIC0gSE5TVyAoSGllcmFyY2hpY2FsIE5hdmlnYWJsZSBTbWFsbCBXb3JsZCk6IOuKkOumsCDruYzrk5wsIOu5oOuluCDqsoDsg4kg7IaN64+ELCDrhpLsnYAg66mU66qo66asIOuwjyDsoJXtmZXrj4RcbiAqIC0gSVZGRmxhdCAoSW52ZXJ0ZWQgRmlsZSB3aXRoIEZsYXQgQ29tcHJlc3Npb24pOiDruaDrpbgg67mM65OcLCDspJHqsIQg6rKA7IOJIOyGjeuPhCwg64Ku7J2AIOuplOuqqOumrFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBITlNXIOyduOuNseyKpCAo6raM7J6lIC0g67mg66W4IOqygOyDiSwg64aS7J2AIOygle2ZleuPhClcbiAqIENSRUFURSBJTkRFWCBpZHhfZW1iZWRkaW5nIE9OIGl0ZW1zIFVTSU5HIGhuc3cgKGVtYmVkZGluZyB2ZWN0b3JfY29zaW5lX29wcykgV0lUSCAobSA9IDE2LCBlZl9jb25zdHJ1Y3Rpb24gPSA2NCk7XG4gKlxuICogLy8gSVZGRmxhdCDsnbjrjbHsiqQgKOuMgOyaqeufiSDrjbDsnbTthLAsIOu5hOyaqSDspJHsmpQg7IucKVxuICogQ1JFQVRFIElOREVYIGlkeF9lbWJlZGRpbmcgT04gaXRlbXMgVVNJTkcgaXZmZmxhdCAoZW1iZWRkaW5nIHZlY3Rvcl9jb3NpbmVfb3BzKSBXSVRIIChsaXN0cyA9IDEwMCk7XG4gKi9cbmZ1bmN0aW9uIGdlblZlY3RvckluZGV4RGVmaW5pdGlvbihpbmRleDogTWlncmF0aW9uSW5kZXgsIHRhYmxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjb2x1bW4gPSBpbmRleC5jb2x1bW5zWzBdO1xuICBjb25zdCB2ZWN0b3JPcHMgPSBnZXRJbmRleENvbHVtbk9wY2xhc3MoY29sdW1uKSA/PyBcInZlY3Rvcl9jb3NpbmVfb3BzXCI7XG4gIGNvbnN0IHdoZXJlQ2xhdXNlID0gZ2V0SW5kZXhXaGVyZUNsYXVzZShpbmRleCk7XG5cbiAgLy8gSE5TVyAoSGllcmFyY2hpY2FsIE5hdmlnYWJsZSBTbWFsbCBXb3JsZCkgLSDqtozsnqU6IOu5oOuluCDqsoDsg4ksIOuGkuydgCDsoJXtmZXrj4RcbiAgaWYgKGluZGV4LnR5cGUgPT09IFwiaG5zd1wiKSB7XG4gICAgY29uc3QgbSA9IGluZGV4Lm0gPz8gMTY7XG4gICAgY29uc3QgZWZDb25zdHJ1Y3Rpb24gPSBpbmRleC5lZkNvbnN0cnVjdGlvbiA/PyA2NDtcbiAgICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxcYENSRUFURSBJTkRFWCAke2luZGV4Lm5hbWV9IE9OICR7dGFibGV9IFVTSU5HIGhuc3cgKCR7Y29sdW1uLm5hbWV9ICR7dmVjdG9yT3BzfSkgV0lUSCAobSA9ICR7bX0sIGVmX2NvbnN0cnVjdGlvbiA9ICR7ZWZDb25zdHJ1Y3Rpb259KSR7d2hlcmVDbGF1c2V9XFxgKTtgO1xuICB9XG5cbiAgLy8gSVZGRmxhdCAoSW52ZXJ0ZWQgRmlsZSB3aXRoIEZsYXQgQ29tcHJlc3Npb24pIC0g64yA7Jqp65+JLCDruYTsmqkg7KSR7JqUIOyLnFxuICBpZiAoaW5kZXgudHlwZSA9PT0gXCJpdmZmbGF0XCIpIHtcbiAgICBjb25zdCBsaXN0cyA9IGluZGV4Lmxpc3RzID8/IDEwMDtcbiAgICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxcYENSRUFURSBJTkRFWCAke2luZGV4Lm5hbWV9IE9OICR7dGFibGV9IFVTSU5HIGl2ZmZsYXQgKCR7Y29sdW1uLm5hbWV9ICR7dmVjdG9yT3BzfSkgV0lUSCAobGlzdHMgPSAke2xpc3RzfSkke3doZXJlQ2xhdXNlfVxcYCk7YDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByYXcgU1FMIGluZGV4IHR5cGU6ICR7aW5kZXgudHlwZX1gKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5kZXhXaGVyZUNsYXVzZShpbmRleDogTWlncmF0aW9uSW5kZXgpOiBzdHJpbmcge1xuICBjb25zdCB3aGVyZSA9IG5vcm1hbGl6ZUluZGV4V2hlcmVQcmVkaWNhdGUoaW5kZXgud2hlcmUpO1xuICByZXR1cm4gd2hlcmUgPyBgIFdIRVJFICR7d2hlcmV9YCA6IFwiXCI7XG59XG5cbi8qKlxuICog7YWM7J2067iUIOyDneyEse2VmOuKlCDsvIDsnbTsiqQgLSBGSyDsg53shLFcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVDcmVhdGVDb2RlX0ZvcmVpZ24oXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICBpZiAoZm9yZWlnbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgeyB1cCwgZG93biB9ID0gZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBmb3JlaWducyk7XG4gIGlmICh1cC5sZW5ndGggPT09IDAgJiYgZG93bi5sZW5ndGggPT09IDApIHtcbiAgICAvLyBmb3JlaWduc+qwgCDsnojripTrjbAg7IOd7ISx65CcIOy9lOuTnOqwgCDsl4bripQg6rK97Jqw64qUIOu5hOygleyDgeyggeyduCDsg4HtmansnbTsp4Drp4wsXG4gICAgLy8g66eI7J206re466CI7J207IWYIOyDneyEseydhCDspJHri6jsi5ztgqTsp4Ag7JWK6rOgIOu5iCDrsLDsl7TsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAnaW1wb3J0IHsgS25leCB9IGZyb20gXCJrbmV4XCI7JyxcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICBgcmV0dXJuIGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLFxuICAgIFwiLy8gY3JlYXRlIGZrXCIsXG4gICAgLi4udXAsXG4gICAgXCJ9KTtcIixcbiAgICBcIn1cIixcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd24oa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGByZXR1cm4ga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsXG4gICAgXCIvLyBkcm9wIGZrXCIsXG4gICAgLi4uZG93bixcbiAgICBcIn0pO1wiLFxuICAgIFwifVwiLFxuICBdO1xuXG4gIGNvbnN0IGZvcmVpZ25LZXlzU3RyaW5nID0gZm9yZWlnbnMubWFwKChmb3JlaWduKSA9PiBmb3JlaWduLmNvbHVtbnMuam9pbihcIl9cIikpLmpvaW4oXCJfXCIpO1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHRhYmxlLFxuICAgICAgdHlwZTogXCJmb3JlaWduXCIsXG4gICAgICB0aXRsZTogYGZvcmVpZ25fXyR7dGFibGV9X18ke2ZvcmVpZ25LZXlzU3RyaW5nfWAsXG4gICAgICBmb3JtYXR0ZWQ6IGF3YWl0IGZvcm1hdENvZGUobGluZXMuam9pbihcIlxcblwiKSwgYHNyYy9taWdyYXRpb24vJHt0YWJsZX0udHNgKSxcbiAgICB9LFxuICBdO1xufVxuXG4vKipcbiAqIE1pZ3JhdGlvbkZvcmVpZ25bXSDsnb3slrTshJwg7Jm467aA7YKkIGNvbnN0cmFpbnQg7KCV7J2Y7ZWY64qUIOq1rOusuCDsg53shLFcbiAqL1xuZnVuY3Rpb24gZ2VuRm9yZWlnbkRlZmluaXRpb25zKFxuICB0YWJsZTogc3RyaW5nLFxuICBmb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuKTogeyB1cDogc3RyaW5nW107IGRvd246IHN0cmluZ1tdIH0ge1xuICByZXR1cm4gZm9yZWlnbnMucmVkdWNlKFxuICAgIChyLCBmb3JlaWduKSA9PiB7XG4gICAgICBjb25zdCBjb2x1bW5zU3RyaW5nUXVvdGUgPSBmb3JlaWduLmNvbHVtbnNcbiAgICAgICAgLm1hcCgoY29sKSA9PiBgJyR7Y29sLnJlcGxhY2UoYCR7dGFibGV9LmAsIFwiXCIpfSdgKVxuICAgICAgICAuam9pbihcIixcIik7XG4gICAgICByLnVwLnB1c2goXG4gICAgICAgIGB0YWJsZS5mb3JlaWduKCcke2ZvcmVpZ24uY29sdW1ucy5qb2luKFwiLFwiKX0nKVxuICAgICAgICAgICAgLnJlZmVyZW5jZXMoJyR7Zm9yZWlnbi50b30nKVxuICAgICAgICAgICAgLm9uVXBkYXRlKCcke2ZvcmVpZ24ub25VcGRhdGV9JylcbiAgICAgICAgICAgIC5vbkRlbGV0ZSgnJHtmb3JlaWduLm9uRGVsZXRlfScpYCxcbiAgICAgICk7XG4gICAgICByLmRvd24ucHVzaChgdGFibGUuZHJvcEZvcmVpZ24oWyR7Y29sdW1uc1N0cmluZ1F1b3RlfV0pYCk7XG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgIHtcbiAgICAgIHVwOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgIGRvd246IFtdIGFzIHN0cmluZ1tdLFxuICAgIH0sXG4gICk7XG59XG5cbi8qKlxuICog7YWM7J2067iUIOuzgOqyvSDsvIDsnbTsiqQgLSDsu6zrn7wv7J24642x7IqkIOuzgOqyvVxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFsdGVyQ29kZV9Db2x1bW5BbmRJbmRleGVzKFxuICB0YWJsZTogc3RyaW5nLFxuICBlbnRpdHlDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgZW50aXR5SW5kZXhlczogTWlncmF0aW9uSW5kZXhbXSxcbiAgZGJDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgZGJJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLFxuICBkYkZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4gIGNvbXBhcmVEQj86IEtuZXgsXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICBjb25zdCByZXNvbHZlZEVudGl0eUNvbHVtbnMgPSByZXNvbHZlU2VhcmNoVGV4dENvbHVtbnModGFibGUsIGVudGl0eUNvbHVtbnMpO1xuICBjb25zdCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMgPSBnZXRTZWFyY2hUZXh0Q29sdW1uTmFtZXModGFibGUpO1xuICAvKlxuICAgIOyEuOu2gCDruYTqtZAg7ZuEIOuLpOuluOygkCDssL7slYTshJwg7L2U65OcIOyDneyEsVxuXG4gICAgMS4g7Lus65+86rCv7IiYIOuLpOumhDogTUTsl5Ag7J6I7Jy864KYLCBEQuyXkCDsl4bri6TrqbQg7LaU6rCAXG4gICAgMi4g7Lus65+86rCv7IiYIOuLpOumhDogTUTsl5Ag7JeG7Jy864KYLCBEQuyXkCDsnojri6TrqbQg7IKt7KCcXG4gICAgMy4g6re47Jm4IOy7rOufvCjsu6zrn7wg6rCv7IiY6rCAIOuPmeydvO2VmOqxsOuCmCwg64uk66W4IOqyveyasCDrj5nsnbztlZwg7Lus65+864G866asKSA9PiBhbHRlclxuICAgIDQuIOuLpOuluOqxsCDri6Qg64+Z7J287ZWY6rOgIGluZGV466eMIOuzgOqyveuQmOuKlCDqsr3smrBcblxuICAgICoqIOy7rOufvOuqheydhCDrs4Dqsr3tlZjripQg6rK97Jqw64qUIOuUsOuhnCDtlbjrk6Trp4HtlZjsp4Ag7JWK7J2MXG4gICAgPT4gZHJvcC9hZGQg7ZiV7YOc7J2YIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5zqsIAg7IOd7ISx65CY64qU642wLCDsiJjrj5nsnLzroZwgcmVuYW1lIOy9lOuTnOuhnCDsiJjsoJXtlZjsl6wg7LKY66asXG4gICovXG5cbiAgLy8gUEsoaWQpIOy7rOufvCDtg4DsnoUg67OA6rK9IOqwkOyngCDrsI8g7LKY66asXG4gIGNvbnN0IGVudGl0eUlkQ29sID0gcmVzb2x2ZWRFbnRpdHlDb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwiaWRcIik7XG4gIGNvbnN0IGRiSWRDb2wgPSBkYkNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJpZFwiKTtcblxuICBpZiAoZW50aXR5SWRDb2wgJiYgZGJJZENvbCAmJiBjb21wYXJlREIpIHtcbiAgICBjb25zdCBpc1BrVHlwZUNoYW5nZWQgPVxuICAgICAgZW50aXR5SWRDb2wudHlwZSAhPT0gZGJJZENvbC50eXBlIHx8IGVudGl0eUlkQ29sLmxlbmd0aCAhPT0gZGJJZENvbC5sZW5ndGg7XG5cbiAgICBpZiAoaXNQa1R5cGVDaGFuZ2VkKSB7XG4gICAgICByZXR1cm4gZ2VuZXJhdGVQa1R5cGVDaGFuZ2VNaWdyYXRpb24oXG4gICAgICAgIHRhYmxlLFxuICAgICAgICBlbnRpdHlJZENvbCxcbiAgICAgICAgZGJJZENvbCxcbiAgICAgICAgcmVzb2x2ZWRFbnRpdHlDb2x1bW5zLFxuICAgICAgICBlbnRpdHlJbmRleGVzLFxuICAgICAgICBkYkNvbHVtbnMsXG4gICAgICAgIGRiSW5kZXhlcyxcbiAgICAgICAgZGJGb3JlaWducyxcbiAgICAgICAgY29tcGFyZURCLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyDqsIEg7Lus65+8IOydtOumhCDquLDspIDsnLzroZwgYWRkLCBkcm9wLCBhbHRlciDsl6zrtoAg7ZmV7J24XG4gIGNvbnN0IGFsdGVyQ29sdW1uc1RvID0gZ2V0QWx0ZXJDb2x1bW5zVG8ocmVzb2x2ZWRFbnRpdHlDb2x1bW5zLCBkYkNvbHVtbnMsIHNlYXJjaFRleHRDb2x1bW5OYW1lcyk7XG5cbiAgLy8g7LaU7Lac65CcIOy7rOufvOuTpOydhCDquLDspIDsnLzroZwg6rCB6rCBIOudvOyduCDsg53shLFcbiAgY29uc3QgYWx0ZXJDb2x1bW5MaW5lc1RvID0gZ2V0QWx0ZXJDb2x1bW5MaW5lc1RvKFxuICAgIGFsdGVyQ29sdW1uc1RvLFxuICAgIHJlc29sdmVkRW50aXR5Q29sdW1ucyxcbiAgICB0YWJsZSxcbiAgICBkYkZvcmVpZ25zLFxuICApO1xuXG4gIC8vIOyduOuNseyKpOydmCBhZGQsIGRyb3Ag7Jes67aAIO2ZleyduFxuICBjb25zdCBhbHRlckluZGV4ZXNUbyA9IGdldEFsdGVySW5kZXhlc1RvKGVudGl0eUluZGV4ZXMsIGRiSW5kZXhlcyk7XG4gIGNvbnN0IHJlY3JlYXRlZFNlYXJjaFRleHRDb2x1bW5OYW1lcyA9IG5ldyBTZXQoXG4gICAgYWx0ZXJDb2x1bW5zVG8uYWx0ZXJcbiAgICAgIC5maWx0ZXIoKGRiQ29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGVudGl0eUNvbHVtbiA9IHJlc29sdmVkRW50aXR5Q29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5uYW1lID09PSBkYkNvbHVtbi5uYW1lKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBzZWFyY2hUZXh0Q29sdW1uTmFtZXMuaGFzKGRiQ29sdW1uLm5hbWUpICYmXG4gICAgICAgICAgZGJDb2x1bW4uZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBlbnRpdHlDb2x1bW4/LmdlbmVyYXRlZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSksXG4gICk7XG4gIGNvbnN0IHJlY3JlYXRlZFNlYXJjaFRleHREYkluZGV4ZXMgPSBkYkluZGV4ZXMuZmlsdGVyKFxuICAgIChpbmRleCkgPT5cbiAgICAgIGluZGV4LmNvbHVtbnMuc29tZSgoeyBuYW1lIH0pID0+IHJlY3JlYXRlZFNlYXJjaFRleHRDb2x1bW5OYW1lcy5oYXMobmFtZSkpICYmXG4gICAgICAhYWx0ZXJJbmRleGVzVG8uZHJvcC5zb21lKChkcm9wSW5kZXgpID0+IGRyb3BJbmRleC5uYW1lID09PSBpbmRleC5uYW1lKSxcbiAgKTtcbiAgY29uc3QgcmVjcmVhdGVkU2VhcmNoVGV4dEVudGl0eUluZGV4ZXMgPSBlbnRpdHlJbmRleGVzLmZpbHRlcihcbiAgICAoaW5kZXgpID0+XG4gICAgICBpbmRleC5jb2x1bW5zLnNvbWUoKHsgbmFtZSB9KSA9PiByZWNyZWF0ZWRTZWFyY2hUZXh0Q29sdW1uTmFtZXMuaGFzKG5hbWUpKSAmJlxuICAgICAgIWFsdGVySW5kZXhlc1RvLmFkZC5zb21lKChhZGRJbmRleCkgPT4gYWRkSW5kZXgubmFtZSA9PT0gaW5kZXgubmFtZSksXG4gICk7XG4gIGNvbnN0IGltcGxpY2l0bHlEcm9wcGVkRGJJbmRleGVzID0gYWx0ZXJJbmRleGVzVG8uZHJvcC5maWx0ZXIoKGluZGV4KSA9PlxuICAgIGluZGV4LmNvbHVtbnMuZXZlcnkoKHsgbmFtZSB9KSA9PiBhbHRlckNvbHVtbnNUby5kcm9wLnNvbWUoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUgPT09IG5hbWUpKSxcbiAgKTtcblxuICAvLyDsnbjrjbHsiqTqsIAg7IKt7KCc65CY64qUIOqyveyasCwg7Lus65+86rO8IOqwmeydtCDsgq3soJzrkJwg7LyA7J207Iqk7JeQ64qUIGRyb3Dsl5DshJwg7KCc7Jm47ZW07JW87ZWoIVxuICBjb25zdCBpbmRleE5lZWRzVG9Ecm9wID0gYWx0ZXJJbmRleGVzVG8uZHJvcC5maWx0ZXIoXG4gICAgKGluZGV4KSA9PiAhaW1wbGljaXRseURyb3BwZWREYkluZGV4ZXMuc29tZSgoZHJvcHBlZEluZGV4KSA9PiBkcm9wcGVkSW5kZXgubmFtZSA9PT0gaW5kZXgubmFtZSksXG4gICk7XG5cbiAgLy8g67mIIOy9lOuTnCDsg53shLEg67Cp7KeAXG4gIGNvbnN0IGhhc1VwQ2hhbmdlcyA9XG4gICAgYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC51cC5idWlsZGVyLmxlbmd0aCA+IDAgfHxcbiAgICBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLnJhdy5sZW5ndGggPiAwIHx8XG4gICAgYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AudXAuYnVpbGRlci5sZW5ndGggPiAwIHx8XG4gICAgYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCB8fFxuICAgIGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci51cC5yYXcubGVuZ3RoID4gMCB8fFxuICAgIGFsdGVySW5kZXhlc1RvLmFkZC5sZW5ndGggPiAwIHx8XG4gICAgaW5kZXhOZWVkc1RvRHJvcC5sZW5ndGggPiAwIHx8XG4gICAgcmVjcmVhdGVkU2VhcmNoVGV4dERiSW5kZXhlcy5sZW5ndGggPiAwO1xuICBpZiAoIWhhc1VwQ2hhbmdlcykge1xuICAgIC8vIOuzgOqyveyCrO2VreydtCDsl4bsnLzrqbQg67mIIOuwsOyXtCDrsJjtmZhcbiAgICByZXR1cm4gW107XG4gIH1cbiAgTmFpdGUudChcIm1pZ3JhdG9yOmdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXM6ZGVidWdcIiwge1xuICAgIFwiYWx0ZXJDb2x1bW5zVG8uYWRkLmxlbmd0aFwiOiBhbHRlckNvbHVtbnNUby5hZGQubGVuZ3RoLFxuICAgIFwiYWx0ZXJDb2x1bW5zVG8uZHJvcC5sZW5ndGhcIjogYWx0ZXJDb2x1bW5zVG8uZHJvcC5sZW5ndGgsXG4gICAgXCJhbHRlckNvbHVtbnNUby5hbHRlci5sZW5ndGhcIjogYWx0ZXJDb2x1bW5zVG8uYWx0ZXIubGVuZ3RoLFxuICAgIFwiYWx0ZXJJbmRleGVzVG8uYWRkLmxlbmd0aFwiOiBhbHRlckluZGV4ZXNUby5hZGQubGVuZ3RoLFxuICAgIFwiYWx0ZXJJbmRleGVzVG8uZHJvcC5sZW5ndGhcIjogYWx0ZXJJbmRleGVzVG8uZHJvcC5sZW5ndGgsXG4gICAgXCJpbmRleE5lZWRzVG9Ecm9wLmxlbmd0aFwiOiBpbmRleE5lZWRzVG9Ecm9wLmxlbmd0aCxcbiAgfSk7XG4gIC8vIE5haXRlLnQoXCJtaWdyYXRvcjpnZW5lcmF0ZUFsdGVyQ29kZV9Db2x1bW5BbmRJbmRleGVzOmFsdGVyQ29sdW1uc1RvXCIsIGFsdGVyQ29sdW1uc1RvKTtcblxuICAvLyBUT0RPOiDsnbjrjbHsiqTrqoUg67OA6rK965CcIOqyveyasCDsspjrpqxcblxuICAvLyB0YWJsZSBidWlsZGVyIOuplOyEnOuTnOuhnCDsi6TtlontlaAg7L2U65OcIChkcm9wIOKGkiBhZGQg4oaSIGFsdGVyIOyInOyEnClcbiAgY29uc3QgdXBCdWlsZGVyTGluZXMgPSBbXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5kcm9wLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5kcm9wLnVwLmJ1aWxkZXIgOiBbXSksXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hZGQudXAuYnVpbGRlci5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC51cC5idWlsZGVyIDogW10pLFxuICAgIC4uLnJlY3JlYXRlZFNlYXJjaFRleHREYkluZGV4ZXMubWFwKGdlbkluZGV4RHJvcERlZmluaXRpb24pLFxuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIudXAuYnVpbGRlci5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLmJ1aWxkZXIgOiBbXSksXG4gICAgLi4uaW5kZXhOZWVkc1RvRHJvcC5tYXAoZ2VuSW5kZXhEcm9wRGVmaW5pdGlvbiksXG4gIF07XG5cbiAgLy8ga25leC5yYXcoKeuhnCDsi6TtlontlaAg7L2U65OcXG4gIGNvbnN0IHVwUmF3TGluZXMgPSBbXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hZGQudXAucmF3Lmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLnJhdyA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLnJhdy5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLnJhdyA6IFtdKSxcbiAgICAuLi5yZWNyZWF0ZWRTZWFyY2hUZXh0RW50aXR5SW5kZXhlcy5tYXAoKGluZGV4KSA9PiBnZW5JbmRleERlZmluaXRpb24oaW5kZXgsIHRhYmxlKSksXG4gICAgLi4uYWx0ZXJJbmRleGVzVG8uYWRkLm1hcCgoaW5kZXgpID0+IGdlbkluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpKSxcbiAgXTtcblxuICAvLyBkb3du7J2AIHVw7J2YIOyXreyInCAoYWRkLmRvd24gPSBkcm9wIHJvbGxiYWNrLCBkcm9wLmRvd24gPSBhZGQgcm9sbGJhY2spXG4gIGNvbnN0IGRvd25CdWlsZGVyTGluZXMgPSBbXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hZGQuZG93bi5idWlsZGVyLmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLmRvd24uYnVpbGRlciA6IFtdKSxcbiAgICAuLi5yZWNyZWF0ZWRTZWFyY2hUZXh0RW50aXR5SW5kZXhlcy5tYXAoZ2VuSW5kZXhEcm9wRGVmaW5pdGlvbiksXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci5kb3duLmJ1aWxkZXIubGVuZ3RoID4gMFxuICAgICAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIuZG93bi5idWlsZGVyXG4gICAgICA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AuZG93bi5idWlsZGVyLmxlbmd0aCA+IDBcbiAgICAgID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AuZG93bi5idWlsZGVyXG4gICAgICA6IFtdKSxcbiAgICAuLi5hbHRlckluZGV4ZXNUby5hZGRcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChpbmRleCkgPT5cbiAgICAgICAgICAhaW5kZXguY29sdW1ucy5ldmVyeSgoaW5kZXhDb2wpID0+XG4gICAgICAgICAgICBhbHRlckNvbHVtbnNUby5hZGQubWFwKChjb2wpID0+IGNvbC5uYW1lKS5pbmNsdWRlcyhpbmRleENvbC5uYW1lKSxcbiAgICAgICAgICApLFxuICAgICAgKVxuICAgICAgLm1hcChnZW5JbmRleERyb3BEZWZpbml0aW9uKSxcbiAgXTtcblxuICBjb25zdCBkb3duUmF3TGluZXMgPSBbXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5kcm9wLmRvd24ucmF3Lmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC5kb3duLnJhdyA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLmRvd24ucmF3Lmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIuZG93bi5yYXcgOiBbXSksXG4gICAgLi4ucmVjcmVhdGVkU2VhcmNoVGV4dERiSW5kZXhlcy5tYXAoKGluZGV4KSA9PiBnZW5JbmRleERlZmluaXRpb24oaW5kZXgsIHRhYmxlKSksXG4gICAgLi4uaW1wbGljaXRseURyb3BwZWREYkluZGV4ZXMubWFwKChpbmRleCkgPT4gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSkpLFxuICAgIC4uLmluZGV4TmVlZHNUb0Ryb3AubWFwKChpbmRleCkgPT4gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSkpLFxuICBdO1xuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAnaW1wb3J0IHsgS25leCB9IGZyb20gXCJrbmV4XCI7JyxcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICAuLi4odXBCdWlsZGVyTGluZXMubGVuZ3RoID4gMFxuICAgICAgPyBbYGF3YWl0IGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLCAuLi51cEJ1aWxkZXJMaW5lcywgXCJ9KTtcIl1cbiAgICAgIDogW10pLFxuICAgIC4uLnVwUmF3TGluZXMsXG4gICAgXCJ9XCIsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICAuLi4oZG93bkJ1aWxkZXJMaW5lcy5sZW5ndGggPiAwXG4gICAgICA/IFtgYXdhaXQga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsIC4uLmRvd25CdWlsZGVyTGluZXMsIFwifSk7XCJdXG4gICAgICA6IFtdKSxcbiAgICAuLi5kb3duUmF3TGluZXMsXG4gICAgXCJ9XCIsXG4gIF07XG5cbiAgY29uc3QgZm9ybWF0dGVkID0gYXdhaXQgZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBgc3JjL21pZ3JhdGlvbi8ke3RhYmxlfS50c2ApO1xuICBjb25zdCB0aXRsZSA9IFtcbiAgICBcImFsdGVyXCIsXG4gICAgdGFibGUsXG4gICAgLi4uKFtcImFkZFwiLCBcImRyb3BcIiwgXCJhbHRlclwiXSBhcyBjb25zdClcbiAgICAgIC5tYXAoKGFjdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBsZW4gPSBhbHRlckNvbHVtbnNUb1thY3Rpb25dLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbiA+IDApIHtcbiAgICAgICAgICByZXR1cm4gYWN0aW9uICsgbGVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09IG51bGwpLFxuICBdLmpvaW4oXCJfXCIpO1xuXG4gIHJldHVybiBbXG4gICAge1xuICAgICAgdGFibGUsXG4gICAgICB0aXRsZSxcbiAgICAgIGZvcm1hdHRlZCxcbiAgICAgIHR5cGU6IFwibm9ybWFsXCIsXG4gICAgfSxcbiAgXTtcbn1cblxuLyoqXG4gKiDsu6zrn7wg67mE6rWQ66W8IOychO2VtCBHZW5lcmF0ZWQgQ29sdW1u7J2YIGV4cHJlc3Npb27snYQg7KCc7Jm47ZWcIOqwneyytOulvCDsg53shLFcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbihcbiAgY29sOiBNaWdyYXRpb25Db2x1bW4sXG4gIHNlYXJjaFRleHRDb2x1bW5OYW1lczogU2V0PHN0cmluZz4sXG4pOiBNaWdyYXRpb25Db2x1bW4ge1xuICBpZiAoIWNvbC5nZW5lcmF0ZWQpIHtcbiAgICByZXR1cm4gY29sO1xuICB9XG5cbiAgaWYgKCFzZWFyY2hUZXh0Q29sdW1uTmFtZXMuaGFzKGNvbC5uYW1lKSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5jb2wsXG4gICAgICBnZW5lcmF0ZWQ6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5jb2wsXG4gICAgZ2VuZXJhdGVkOiB7XG4gICAgICAuLi5jb2wuZ2VuZXJhdGVkLFxuICAgICAgZXhwcmVzc2lvbjogY2Fub25pY2FsaXplU2VhcmNoVGV4dEdlbmVyYXRlZEV4cHJlc3Npb24oY29sLmdlbmVyYXRlZC5leHByZXNzaW9uKSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIOqwgSDsu6zrn7wg7J2066aEIOq4sOykgOycvOuhnCBhZGQsIGRyb3AsIGFsdGVyIOyXrOu2gCDtmZXsnbhcbiAqL1xuZnVuY3Rpb24gZ2V0QWx0ZXJDb2x1bW5zVG8oXG4gIGVudGl0eUNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLFxuICBkYkNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLFxuICBzZWFyY2hUZXh0Q29sdW1uTmFtZXM6IFNldDxzdHJpbmc+LFxuKSB7XG4gIGNvbnN0IGNvbHVtbnNUbyA9IHtcbiAgICBhZGQ6IFtdIGFzIE1pZ3JhdGlvbkNvbHVtbltdLFxuICAgIGRyb3A6IFtdIGFzIE1pZ3JhdGlvbkNvbHVtbltdLFxuICAgIGFsdGVyOiBbXSBhcyBNaWdyYXRpb25Db2x1bW5bXSxcbiAgfTtcblxuICAvLyDsu6zrn7zrqoUg6riw7KSAIOu5hOq1kFxuICBjb25zdCBleHRyYUNvbHVtbnMgPSB7XG4gICAgZGI6IGRpZmYoZGJDb2x1bW5zLCBlbnRpdHlDb2x1bW5zLCAoY29sKSA9PiBbY29sLm5hbWUsIGNvbC5nZW5lcmF0ZWQ/LnR5cGVdLmpvaW4oXCIvLy9cIikpLFxuICAgIGVudGl0eTogZGlmZihlbnRpdHlDb2x1bW5zLCBkYkNvbHVtbnMsIChjb2wpID0+IFtjb2wubmFtZSwgY29sLmdlbmVyYXRlZD8udHlwZV0uam9pbihcIi8vL1wiKSksXG4gIH07XG4gIGlmIChleHRyYUNvbHVtbnMuZW50aXR5Lmxlbmd0aCA+IDApIHtcbiAgICBjb2x1bW5zVG8uYWRkID0gY29sdW1uc1RvLmFkZC5jb25jYXQoZXh0cmFDb2x1bW5zLmVudGl0eSk7XG4gIH1cbiAgaWYgKGV4dHJhQ29sdW1ucy5kYi5sZW5ndGggPiAwKSB7XG4gICAgY29sdW1uc1RvLmRyb3AgPSBjb2x1bW5zVG8uZHJvcC5jb25jYXQoZXh0cmFDb2x1bW5zLmRiKTtcbiAgfVxuXG4gIC8vIOuPmeydvCDsu6zrn7zrqoXsnZgg7IS467aAIO2VhOuTnCDruYTqtZBcbiAgY29uc3Qgc2FtZURiQ29sdW1ucyA9IGludGVyc2VjdGlvbkJ5KGRiQ29sdW1ucywgZW50aXR5Q29sdW1ucywgKGNvbCkgPT4gY29sLm5hbWUpO1xuICBjb25zdCBzYW1lTWRDb2x1bW5zID0gaW50ZXJzZWN0aW9uQnkoZW50aXR5Q29sdW1ucywgZGJDb2x1bW5zLCAoY29sKSA9PiBjb2wubmFtZSk7XG4gIGNvbHVtbnNUby5hbHRlciA9IGRpZmZlcmVuY2VXaXRoKHNhbWVEYkNvbHVtbnMsIHNhbWVNZENvbHVtbnMsIChhLCBiKSA9PlxuICAgIGVxdWFsKFxuICAgICAgbm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbihhLCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMpLFxuICAgICAgbm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbihiLCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMpLFxuICAgICksXG4gICk7XG5cbiAgcmV0dXJuIGNvbHVtbnNUbztcbn1cblxuLyoqXG4gKiDstpTstpzrkJwg7Lus65+865Ok7J2EIOq4sOykgOycvOuhnCDqsIHqsIEg65287J24IOyDneyEsVxuICovXG5mdW5jdGlvbiBnZXRBbHRlckNvbHVtbkxpbmVzVG8oXG4gIGNvbHVtbnNUbzogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0QWx0ZXJDb2x1bW5zVG8+LFxuICBlbnRpdHlDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgdGFibGU6IHN0cmluZyxcbiAgZGJGb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuKSB7XG4gIGNvbnN0IHNlYXJjaFRleHRDb2x1bW5OYW1lcyA9IGdldFNlYXJjaFRleHRDb2x1bW5OYW1lcyh0YWJsZSk7XG4gIGNvbnN0IGxpbmVzVG8gPSB7XG4gICAgYWRkOiB7XG4gICAgICB1cDogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgICAgZG93bjogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgIH0sXG4gICAgZHJvcDoge1xuICAgICAgdXA6IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICAgIGRvd246IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICB9LFxuICAgIGFsdGVyOiB7XG4gICAgICB1cDogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgICAgZG93bjogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgIH0sXG4gIH07XG5cbiAgLy8gYWRkIGNvbHVtbnNcbiAgY29uc3QgYWRkQ29sdW1uRGVmcyA9IGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBjb2x1bW5zVG8uYWRkKTtcbiAgbGluZXNUby5hZGQudXAgPSB7XG4gICAgYnVpbGRlcjogYWRkQ29sdW1uRGVmcy5idWlsZGVyLmxlbmd0aCA+IDAgPyBbXCIvLyBhZGRcIiwgLi4uYWRkQ29sdW1uRGVmcy5idWlsZGVyXSA6IFtdLFxuICAgIHJhdzpcbiAgICAgIGFkZENvbHVtbkRlZnMucmF3Lmxlbmd0aCA+IDBcbiAgICAgICAgPyBbXG4gICAgICAgICAgICAuLi5nZXRTZWFyY2hUZXh0SGVscGVyRGVmaW5pdGlvbnModGFibGUsIGNvbHVtbnNUby5hZGQpLFxuICAgICAgICAgICAgXCIvLyBhZGQgKGdlbmVyYXRlZClcIixcbiAgICAgICAgICAgIC4uLmFkZENvbHVtbkRlZnMucmF3LFxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXSxcbiAgfTtcbiAgbGluZXNUby5hZGQuZG93biA9IHtcbiAgICBidWlsZGVyOlxuICAgICAgY29sdW1uc1RvLmFkZC5sZW5ndGggPiAwXG4gICAgICAgID8gW1xuICAgICAgICAgICAgXCIvLyByb2xsYmFjayAtIGFkZFwiLFxuICAgICAgICAgICAgYHRhYmxlLmRyb3BDb2x1bW5zKCR7Y29sdW1uc1RvLmFkZC5tYXAoKGNvbCkgPT4gYCcke2NvbC5uYW1lfSdgKS5qb2luKFwiLCBcIil9KWAsXG4gICAgICAgICAgXVxuICAgICAgICA6IFtdLFxuICAgIHJhdzogW10sXG4gIH07XG5cbiAgLy8gZHJvcO2VoCDsu6zrn7zsl5Ag6rG466awIEZLIOywvuq4sFxuICBjb25zdCBkcm9wQ29sdW1uTmFtZXMgPSBjb2x1bW5zVG8uZHJvcC5tYXAoKGNvbCkgPT4gY29sLm5hbWUpO1xuICBjb25zdCBma1RvRHJvcEJlZm9yZUNvbHVtbiA9IGRiRm9yZWlnbnMuZmlsdGVyKChmaykgPT5cbiAgICBmay5jb2x1bW5zLnNvbWUoKGNvbCkgPT4gZHJvcENvbHVtbk5hbWVzLmluY2x1ZGVzKGNvbCkpLFxuICApO1xuXG4gIGNvbnN0IGRyb3BGa0xpbmVzID0gZmtUb0Ryb3BCZWZvcmVDb2x1bW4ubWFwKChmaykgPT4ge1xuICAgIGNvbnN0IGNvbHVtbnNTdHJpbmdRdW90ZSA9IGZrLmNvbHVtbnMubWFwKChjb2wpID0+IGAnJHtjb2x9J2ApLmpvaW4oXCIsXCIpO1xuICAgIHJldHVybiBgdGFibGUuZHJvcEZvcmVpZ24oWyR7Y29sdW1uc1N0cmluZ1F1b3RlfV0pYDtcbiAgfSk7XG5cbiAgY29uc3QgcmVzdG9yZUZrTGluZXMgPSBnZW5Gb3JlaWduRGVmaW5pdGlvbnModGFibGUsIGZrVG9Ecm9wQmVmb3JlQ29sdW1uKS51cDtcblxuICAvLyBkcm9w7J2YIHJvbGxiYWNr7Iuc7JeQ64qUIGdlbmVyYXRlZCBjb2x1bW7rj4Qg67O17JuQ7ZW07JW8IO2VqFxuICBjb25zdCBkcm9wQ29sdW1uRGVmcyA9IGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBjb2x1bW5zVG8uZHJvcCk7XG4gIGxpbmVzVG8uZHJvcCA9IHtcbiAgICB1cDoge1xuICAgICAgYnVpbGRlcjogW1xuICAgICAgICAuLi4oZHJvcEZrTGluZXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gW1wiLy8gZHJvcCBmb3JlaWduIGtleXMgb24gY29sdW1ucyB0byBiZSBkcm9wcGVkXCIsIC4uLmRyb3BGa0xpbmVzXVxuICAgICAgICAgIDogW10pLFxuICAgICAgICAuLi4oY29sdW1uc1RvLmRyb3AubGVuZ3RoID4gMFxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICBcIi8vIGRyb3AgY29sdW1uc1wiLFxuICAgICAgICAgICAgICBgdGFibGUuZHJvcENvbHVtbnMoJHtjb2x1bW5zVG8uZHJvcC5tYXAoKGNvbCkgPT4gYCcke2NvbC5uYW1lfSdgKS5qb2luKFwiLCBcIil9KWAsXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXSksXG4gICAgICBdLFxuICAgICAgcmF3OiBbXSxcbiAgICB9LFxuICAgIGRvd246IHtcbiAgICAgIGJ1aWxkZXI6IFtcbiAgICAgICAgLi4uKGRyb3BDb2x1bW5EZWZzLmJ1aWxkZXIubGVuZ3RoID4gMFxuICAgICAgICAgID8gW1wiLy8gcm9sbGJhY2sgLSBkcm9wIGNvbHVtbnNcIiwgLi4uZHJvcENvbHVtbkRlZnMuYnVpbGRlcl1cbiAgICAgICAgICA6IFtdKSxcbiAgICAgICAgLi4uKHJlc3RvcmVGa0xpbmVzLmxlbmd0aCA+IDAgPyBbXCIvLyByZXN0b3JlIGZvcmVpZ24ga2V5c1wiLCAuLi5yZXN0b3JlRmtMaW5lc10gOiBbXSksXG4gICAgICBdLFxuICAgICAgcmF3OlxuICAgICAgICBkcm9wQ29sdW1uRGVmcy5yYXcubGVuZ3RoID4gMFxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAuLi5nZXRTZWFyY2hUZXh0SGVscGVyRGVmaW5pdGlvbnModGFibGUsIGNvbHVtbnNUby5kcm9wKSxcbiAgICAgICAgICAgICAgXCIvLyByb2xsYmFjayAtIGRyb3AgY29sdW1ucyAoZ2VuZXJhdGVkKVwiLFxuICAgICAgICAgICAgICAuLi5kcm9wQ29sdW1uRGVmcy5yYXcsXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXSxcbiAgICB9LFxuICB9O1xuXG4gIC8vIGFsdGVyIGNvbHVtbnMgKEdlbmVyYXRlZCBDb2x1bW7snYAgQUxURVIg67aI6rCA7ZWY66+A66GcIGRyb3Ag7ZuEIOyerOyDneyEsSlcbiAgbGluZXNUby5hbHRlciA9IGNvbHVtbnNUby5hbHRlci5yZWR1Y2UoXG4gICAgKHIsIGRiQ29sdW1uKSA9PiB7XG4gICAgICBjb25zdCBlbnRpdHlDb2x1bW4gPSBlbnRpdHlDb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUgPT09IGRiQ29sdW1uLm5hbWUpO1xuICAgICAgaWYgKGVudGl0eUNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHNlYXJjaFRleHRDb2x1bW5OYW1lcy5oYXMoZGJDb2x1bW4ubmFtZSkgJiZcbiAgICAgICAgZGJDb2x1bW4uZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgZW50aXR5Q29sdW1uLmdlbmVyYXRlZCAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgci51cC5idWlsZGVyID0gW1xuICAgICAgICAgIC4uLnIudXAuYnVpbGRlcixcbiAgICAgICAgICBcIi8vIGFsdGVyIGdlbmVyYXRlZCBjb2x1bW5cIixcbiAgICAgICAgICBgdGFibGUuZHJvcENvbHVtbnMoJyR7ZGJDb2x1bW4ubmFtZX0nKWAsXG4gICAgICAgIF07XG4gICAgICAgIHIudXAucmF3ID0gW1xuICAgICAgICAgIC4uLnIudXAucmF3LFxuICAgICAgICAgIC4uLmdldFNlYXJjaFRleHRIZWxwZXJEZWZpbml0aW9ucyh0YWJsZSwgW2VudGl0eUNvbHVtbl0pLFxuICAgICAgICAgIFwiLy8gYWx0ZXIgZ2VuZXJhdGVkIGNvbHVtblwiLFxuICAgICAgICAgIGdlbkdlbmVyYXRlZENvbHVtbkRlZmluaXRpb24odGFibGUsIGVudGl0eUNvbHVtbiksXG4gICAgICAgIF07XG4gICAgICAgIHIuZG93bi5idWlsZGVyID0gW1xuICAgICAgICAgIC4uLnIuZG93bi5idWlsZGVyLFxuICAgICAgICAgIFwiLy8gcm9sbGJhY2sgLSBhbHRlciBnZW5lcmF0ZWQgY29sdW1uXCIsXG4gICAgICAgICAgYHRhYmxlLmRyb3BDb2x1bW5zKCcke2RiQ29sdW1uLm5hbWV9JylgLFxuICAgICAgICBdO1xuICAgICAgICByLmRvd24ucmF3ID0gW1xuICAgICAgICAgIC4uLnIuZG93bi5yYXcsXG4gICAgICAgICAgLi4uZ2V0U2VhcmNoVGV4dEhlbHBlckRlZmluaXRpb25zKHRhYmxlLCBbZGJDb2x1bW5dKSxcbiAgICAgICAgICBcIi8vIHJvbGxiYWNrIC0gYWx0ZXIgZ2VuZXJhdGVkIGNvbHVtblwiLFxuICAgICAgICAgIGdlbkdlbmVyYXRlZENvbHVtbkRlZmluaXRpb24odGFibGUsIGRiQ29sdW1uKSxcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG5cbiAgICAgIC8vIOy7rOufvCDrs4Dqsr3sgqztla1cbiAgICAgIGNvbnN0IGNvbHVtbkRpZmZVcCA9IGRpZmYoXG4gICAgICAgIGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBbZW50aXR5Q29sdW1uXSkuYnVpbGRlcixcbiAgICAgICAgZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIFtkYkNvbHVtbl0pLmJ1aWxkZXIsXG4gICAgICApO1xuICAgICAgY29uc3QgY29sdW1uRGlmZkRvd24gPSBkaWZmKFxuICAgICAgICBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZSwgW2RiQ29sdW1uXSkuYnVpbGRlcixcbiAgICAgICAgZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIFtlbnRpdHlDb2x1bW5dKS5idWlsZGVyLFxuICAgICAgKTtcbiAgICAgIGlmIChjb2x1bW5EaWZmVXAubGVuZ3RoID4gMCkge1xuICAgICAgICByLnVwLmJ1aWxkZXIgPSBbXG4gICAgICAgICAgLi4uci51cC5idWlsZGVyLFxuICAgICAgICAgIFwiLy8gYWx0ZXIgY29sdW1uXCIsXG4gICAgICAgICAgLi4uY29sdW1uRGlmZlVwLm1hcCgobCkgPT4gYCR7bC5yZXBsYWNlKFwiO1wiLCBcIlwiKX0uYWx0ZXIoKTtgKSxcbiAgICAgICAgXTtcbiAgICAgICAgci5kb3duLmJ1aWxkZXIgPSBbXG4gICAgICAgICAgLi4uci5kb3duLmJ1aWxkZXIsXG4gICAgICAgICAgXCIvLyByb2xsYmFjayAtIGFsdGVyIGNvbHVtblwiLFxuICAgICAgICAgIC4uLmNvbHVtbkRpZmZEb3duLm1hcCgobCkgPT4gYCR7bC5yZXBsYWNlKFwiO1wiLCBcIlwiKX0uYWx0ZXIoKTtgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICB7XG4gICAgICB1cDogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgICAgZG93bjogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgIH0sXG4gICk7XG5cbiAgcmV0dXJuIGxpbmVzVG87XG59XG5cbi8qKlxuICog7J24642x7Iqk7J2YIGFkZCwgZHJvcCDsl6zrtoAg7ZmV7J24XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbHRlckluZGV4ZXNUbyhlbnRpdHlJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLCBkYkluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10pIHtcbiAgLy8g7J24642x7IqkIOu5hOq1kFxuICBjb25zdCBpbmRleGVzVG8gPSB7XG4gICAgYWRkOiBbXSBhcyBNaWdyYXRpb25JbmRleFtdLFxuICAgIGRyb3A6IFtdIGFzIE1pZ3JhdGlvbkluZGV4W10sXG4gIH07XG5cbiAgLy8g7J24642x7IqkIOqzoOycoCDsi53rs4TsnpAg7IOd7ISxIChuYW1l7J2EIOygnOyZuO2VnCDrqqjrk6Ag7ZWE65Oc66W8IOusuOyekOyXtOuhnCDrs4DtmZjtlZjsl6wg7KGw7ZWpKVxuICBjb25zdCBpZGVudGl0eSA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGluZGV4OiBUKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaW5kZXgpXG4gICAgICAuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gXCJuYW1lXCIpXG4gICAgICAudG9Tb3J0ZWQoKTtcblxuICAgIHJldHVybiBrZXlzXG4gICAgICAubWFwKChrZXkpID0+IHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJuYW1lXCIpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09IFwiY29sdW1uc1wiKSB7XG4gICAgICAgICAgcmV0dXJuIChpbmRleFtrZXldIGFzIE1pZ3JhdGlvbkluZGV4W1wiY29sdW1uc1wiXSkubWFwKChjb2wpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhjb2wpXG4gICAgICAgICAgICAgIC50b1NvcnRlZCgpXG4gICAgICAgICAgICAgIC5tYXAoKGspID0+IGAke2t9PSR7Y29sW2sgYXMga2V5b2YgdHlwZW9mIGNvbF19YClcbiAgICAgICAgICAgICAgLmpvaW4oXCIvL1wiKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7a2V5fT0ke2luZGV4W2tleSBhcyBrZXlvZiBNaWdyYXRpb25JbmRleF19YDtcbiAgICAgIH0pXG4gICAgICAuam9pbihcIi8vXCIpO1xuICB9O1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFbnRpdHlJbmRleGVzID0gZW50aXR5SW5kZXhlcy5tYXAoc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0cyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWREYkluZGV4ZXMgPSBkYkluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMpO1xuICBjb25zdCBleHRyYUluZGV4ZXMgPSB7XG4gICAgZGI6IGRpZmYobm9ybWFsaXplZERiSW5kZXhlcywgbm9ybWFsaXplZEVudGl0eUluZGV4ZXMsIGlkZW50aXR5KSxcbiAgICBlbnRpdHk6IGRpZmYobm9ybWFsaXplZEVudGl0eUluZGV4ZXMsIG5vcm1hbGl6ZWREYkluZGV4ZXMsIGlkZW50aXR5KSxcbiAgfTtcbiAgaWYgKGV4dHJhSW5kZXhlcy5lbnRpdHkubGVuZ3RoID4gMCkge1xuICAgIGluZGV4ZXNUby5hZGQgPSBpbmRleGVzVG8uYWRkLmNvbmNhdChleHRyYUluZGV4ZXMuZW50aXR5KTtcbiAgfVxuICBpZiAoZXh0cmFJbmRleGVzLmRiLmxlbmd0aCA+IDApIHtcbiAgICBpbmRleGVzVG8uZHJvcCA9IGluZGV4ZXNUby5kcm9wLmNvbmNhdChleHRyYUluZGV4ZXMuZGIpO1xuICB9XG5cbiAgcmV0dXJuIGluZGV4ZXNUbztcbn1cblxuLyoqXG4gKiDsnbjrjbHsiqQg7IKt7KCcIOygleydmCDsg53shLFcbiAqL1xuZnVuY3Rpb24gZ2VuSW5kZXhEcm9wRGVmaW5pdGlvbihpbmRleDogTWlncmF0aW9uSW5kZXgpIHtcbiAgcmV0dXJuIGB0YWJsZS5kcm9wSW5kZXgoWyR7aW5kZXguY29sdW1uc1xuICAgIC5tYXAoKGNvbHVtbikgPT4gYCcke2NvbHVtbi5uYW1lfSdgKVxuICAgIC5qb2luKFwiLFwiKX1dLCAnJHtpbmRleC5uYW1lfScpYDtcbn1cblxuLyoqXG4gKiBEQiDsobDtmowg6rKw6rO87JmAIOu5hOq1kO2VmOq4sCDsnITtlZwg7J24642x7IqkIOq4sOuzuOqwkiDshKTsoJVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMoaW5kZXg6IE1pZ3JhdGlvbkluZGV4KTogTWlncmF0aW9uSW5kZXgge1xuICBjb25zdCBpc1ZlY3RvckluZGV4ID0gaW5kZXgudHlwZSA9PT0gXCJobnN3XCIgfHwgaW5kZXgudHlwZSA9PT0gXCJpdmZmbGF0XCI7XG4gIGNvbnN0IHN1cHBvcnRzT3JkZXJpbmcgPSAhaXNWZWN0b3JJbmRleCAmJiAoIWluZGV4LnVzaW5nIHx8IGluZGV4LnVzaW5nID09PSBcImJ0cmVlXCIpO1xuICBjb25zdCBub3JtYWxpemVkVXNpbmcgPSBpc1ZlY3RvckluZGV4ID8gaW5kZXgudXNpbmcgOiAoaW5kZXgudXNpbmcgPz8gXCJidHJlZVwiKTtcbiAgY29uc3Qgbm9ybWFsaXplZFdoZXJlID0gbm9ybWFsaXplSW5kZXhXaGVyZVByZWRpY2F0ZShpbmRleC53aGVyZSk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5pbmRleCxcbiAgICBjb2x1bW5zOiBpbmRleC5jb2x1bW5zLm1hcCgoY29sKSA9PiAoe1xuICAgICAgbmFtZTogY29sLm5hbWUsXG4gICAgICAuLi4oZ2V0SW5kZXhDb2x1bW5PcGNsYXNzKGNvbCkgPyB7IG9wY2xhc3M6IGdldEluZGV4Q29sdW1uT3BjbGFzcyhjb2wpIH0gOiB7fSksXG4gICAgICAuLi4oc3VwcG9ydHNPcmRlcmluZ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHNvcnRPcmRlcjogY29sLnNvcnRPcmRlciA/PyBcIkFTQ1wiLFxuICAgICAgICAgICAgbnVsbHNGaXJzdDogY29sLm51bGxzRmlyc3QgPz8gY29sLnNvcnRPcmRlciA9PT0gXCJERVNDXCIsXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICB9KSksXG4gICAgbnVsbHNOb3REaXN0aW5jdDogaW5kZXgubnVsbHNOb3REaXN0aW5jdCA/PyBmYWxzZSxcbiAgICAuLi4obm9ybWFsaXplZFVzaW5nID8geyB1c2luZzogbm9ybWFsaXplZFVzaW5nIH0gOiB7fSksXG4gICAgLi4uKG5vcm1hbGl6ZWRXaGVyZSA/IHsgd2hlcmU6IG5vcm1hbGl6ZWRXaGVyZSB9IDoge30pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVJbmRleFdoZXJlUHJlZGljYXRlKHdoZXJlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXdoZXJlKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHRyaW1tZWQgPSB3aGVyZS50cmltKCk7XG4gIGlmICh0cmltbWVkLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKFwiKFwiKSAmJiB0cmltbWVkLmVuZHNXaXRoKFwiKVwiKSkge1xuICAgIGNvbnN0IGNsb3NlSW5kZXggPSBmaW5kTWF0Y2hpbmdQYXJlbnRoZXNpc0luU3FsKHRyaW1tZWQsIDApO1xuICAgIGlmIChjbG9zZUluZGV4ID09PSB0cmltbWVkLmxlbmd0aCAtIDEpIHtcbiAgICAgIHJldHVybiB0cmltbWVkLnNsaWNlKDEsIC0xKS50cmltKCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRyaW1tZWQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRNYXRjaGluZ1BhcmVudGhlc2lzSW5TcWwoc291cmNlOiBzdHJpbmcsIG9wZW5JbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IGRlcHRoID0gMDtcbiAgbGV0IGluU2luZ2xlUXVvdGUgPSBmYWxzZTtcbiAgbGV0IGluRG91YmxlUXVvdGUgPSBmYWxzZTtcblxuICBmb3IgKGxldCBpbmRleCA9IG9wZW5JbmRleDsgaW5kZXggPCBzb3VyY2UubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgY2hhciA9IHNvdXJjZVtpbmRleF07XG4gICAgY29uc3QgbmV4dENoYXIgPSBzb3VyY2VbaW5kZXggKyAxXTtcblxuICAgIGlmIChjaGFyID09PSBcIidcIiAmJiAhaW5Eb3VibGVRdW90ZSkge1xuICAgICAgaWYgKGluU2luZ2xlUXVvdGUgJiYgbmV4dENoYXIgPT09IFwiJ1wiKSB7XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaW5TaW5nbGVRdW90ZSA9ICFpblNpbmdsZVF1b3RlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09ICdcIicgJiYgIWluU2luZ2xlUXVvdGUpIHtcbiAgICAgIGlmIChpbkRvdWJsZVF1b3RlICYmIG5leHRDaGFyID09PSAnXCInKSB7XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaW5Eb3VibGVRdW90ZSA9ICFpbkRvdWJsZVF1b3RlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGluU2luZ2xlUXVvdGUgfHwgaW5Eb3VibGVRdW90ZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09IFwiKFwiKSB7XG4gICAgICBkZXB0aCArPSAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09IFwiKVwiKSB7XG4gICAgICBkZXB0aCAtPSAxO1xuICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICog7YWM7J2067iUIOuzgOqyvSDsvIDsnbTsiqQgLSBGb3JlaWduIEtleSDrs4Dqsr1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBbHRlckNvZGVfRm9yZWlnbnMoXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGVudGl0eUZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4gIGRiRm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSxcbiAgZHJvcHBpbmdDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSA9IFtdLFxuKTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgLy8gY29uc29sZS5sb2coeyBlbnRpdHlGb3JlaWducywgZGJGb3JlaWducyB9KTtcblxuICBjb25zdCBnZXRLZXkgPSAobWY6IE1pZ3JhdGlvbkZvcmVpZ24pOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBbbWYuY29sdW1ucy5qb2luKFwiLVwiKSwgbWYudG9dLmpvaW4oXCIvLy9cIik7XG4gIH07XG5cbiAgLy8g7IKt7KCc65CgIOy7rOufvOuqhSDrqqnroZ1cbiAgY29uc3QgZHJvcHBpbmdDb2x1bW5OYW1lcyA9IGRyb3BwaW5nQ29sdW1ucy5tYXAoKGNvbCkgPT4gY29sLm5hbWUpO1xuXG4gIGNvbnN0IGZrVG8gPSBlbnRpdHlGb3JlaWducy5yZWR1Y2UoXG4gICAgKHJlc3VsdCwgZW50aXR5RikgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hpbmdEYkYgPSBkYkZvcmVpZ25zLmZpbmQoKGRiRikgPT4gZ2V0S2V5KGVudGl0eUYpID09PSBnZXRLZXkoZGJGKSk7XG4gICAgICBpZiAoIW1hdGNoaW5nRGJGKSB7XG4gICAgICAgIHJlc3VsdC5hZGQucHVzaChlbnRpdHlGKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlcXVhbChlbnRpdHlGLCBtYXRjaGluZ0RiRikpIHtcbiAgICAgICAgcmVzdWx0LmFsdGVyU3JjLnB1c2gobWF0Y2hpbmdEYkYpO1xuICAgICAgICByZXN1bHQuYWx0ZXJEc3QucHVzaChlbnRpdHlGKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICB7XG4gICAgICBhZGQ6IFtdIGFzIE1pZ3JhdGlvbkZvcmVpZ25bXSxcbiAgICAgIGRyb3A6IFtdIGFzIE1pZ3JhdGlvbkZvcmVpZ25bXSxcbiAgICAgIGFsdGVyU3JjOiBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgICBhbHRlckRzdDogW10gYXMgTWlncmF0aW9uRm9yZWlnbltdLFxuICAgIH0sXG4gICk7XG5cbiAgLy8gZGJGb3JlaWduc+yXkOuKlCDsnojsp4Drp4wgZW50aXR5Rm9yZWlnbnPsl5DripQg7JeG64qUIOqyveyasCAo7IKt7KCc65CcIEZLKVxuICAvLyDri6gsIOyCreygnOuQoCDsu6zrn7zsnZggRkvripQg7KCc7Jm4IChnZW5lcmF0ZUFsdGVyQ29kZV9Db2x1bW5BbmRJbmRleGVz7JeQ7IScIOyymOumrClcbiAgZGJGb3JlaWducy5mb3JFYWNoKChkYkYpID0+IHtcbiAgICBjb25zdCBtYXRjaGluZ0VudGl0eUYgPSBlbnRpdHlGb3JlaWducy5maW5kKChlbnRpdHlGKSA9PiBnZXRLZXkoZW50aXR5RikgPT09IGdldEtleShkYkYpKTtcbiAgICBpZiAoIW1hdGNoaW5nRW50aXR5Rikge1xuICAgICAgLy8g7J20IEZL7J2YIOy7rOufvOydtCDsgq3soJzrkKAg7Lus65+8IOuqqeuhneyXkCDsnojripTsp4Ag7ZmV7J24XG4gICAgICBjb25zdCBpc0NvbHVtbkRyb3BwaW5nID0gZGJGLmNvbHVtbnMuc29tZSgoY29sKSA9PiBkcm9wcGluZ0NvbHVtbk5hbWVzLmluY2x1ZGVzKGNvbCkpO1xuICAgICAgLy8g7Lus65+87J20IOyCreygnOuQmOyngCDslYrripQg6rK97Jqw7JeQ66eMIEZLIGRyb3Ag66qp66Gd7JeQIOy2lOqwgFxuICAgICAgaWYgKCFpc0NvbHVtbkRyb3BwaW5nKSB7XG4gICAgICAgIGZrVG8uZHJvcC5wdXNoKGRiRik7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBsaW5lc1RvID0ge1xuICAgIGFkZDogZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBma1RvLmFkZCksXG4gICAgZHJvcDogZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBma1RvLmRyb3ApLFxuICAgIGFsdGVyU3JjOiBnZW5Gb3JlaWduRGVmaW5pdGlvbnModGFibGUsIGZrVG8uYWx0ZXJTcmMpLFxuICAgIGFsdGVyRHN0OiBnZW5Gb3JlaWduRGVmaW5pdGlvbnModGFibGUsIGZrVG8uYWx0ZXJEc3QpLFxuICB9O1xuXG4gIC8vIGRyb3AgZmsgY29sdW1uc+yduCDqsr3smrAo7IOd7ISx65CgIOy9lOuTnCDsl4bripQg6rK97JqwKSDtjKjsiqRcbiAgY29uc3QgaGFzTGluZXMgPSBPYmplY3QudmFsdWVzKGxpbmVzVG8pLnNvbWUoKGwpID0+IGwudXAubGVuZ3RoID4gMCB8fCBsLmRvd24ubGVuZ3RoID4gMCk7XG4gIGlmICghaGFzTGluZXMpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBpZiAoXG4gICAgbGluZXNUby5hZGQudXAubGVuZ3RoID09PSAwICYmXG4gICAgbGluZXNUby5kcm9wLnVwLmxlbmd0aCA9PT0gMCAmJlxuICAgIGxpbmVzVG8uYWx0ZXJTcmMudXAubGVuZ3RoID09PSAwICYmXG4gICAgbGluZXNUby5hbHRlckRzdC51cC5sZW5ndGggPT09IDBcbiAgKSB7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdlbmVyYXRlQWx0ZXJDb2RlX0ZvcmVpZ25zOmZrQ2hhbmdlQ29kZUdlbmVyYXRpb25FcnJvclwiLCB7XG4gICAgICB0YWJsZSxcbiAgICAgIGVudGl0eUZvcmVpZ25zLFxuICAgICAgZGJGb3JlaWducyxcbiAgICB9KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJGSyDrs4Dqsr0g7L2U65OcIOyDneyEsSDsmKTrpZhcIik7XG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG4gICAgJ2ltcG9ydCB7IEtuZXggfSBmcm9tIFwia25leFwiOycsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cChrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgYHJldHVybiBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCxcbiAgICAuLi5saW5lc1RvLmRyb3AuZG93bixcbiAgICAuLi5saW5lc1RvLmFkZC51cCxcbiAgICAuLi5saW5lc1RvLmFsdGVyU3JjLmRvd24sXG4gICAgLi4ubGluZXNUby5hbHRlckRzdC51cCxcbiAgICBcIn0pXCIsXG4gICAgXCJ9XCIsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICBgcmV0dXJuIGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLFxuICAgIC4uLmxpbmVzVG8uYWRkLmRvd24sXG4gICAgLi4ubGluZXNUby5hbHRlckRzdC5kb3duLFxuICAgIC4uLmxpbmVzVG8uYWx0ZXJTcmMudXAsXG4gICAgLi4ubGluZXNUby5kcm9wLnVwLFxuICAgIFwifSlcIixcbiAgICBcIn1cIixcbiAgXTtcblxuICBjb25zdCBmb3JtYXR0ZWQgPSBhd2FpdCBmb3JtYXRDb2RlKGxpbmVzLmpvaW4oXCJcXG5cIiksIGBzcmMvbWlncmF0aW9uLyR7dGFibGV9LnRzYCk7XG4gIGNvbnN0IHRpdGxlID0gW1wiYWx0ZXJcIiwgdGFibGUsIFwiZm9yZWlnbnNcIl0uam9pbihcIl9cIik7XG5cbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB0YWJsZSxcbiAgICAgIHRpdGxlLFxuICAgICAgZm9ybWF0dGVkLFxuICAgICAgdHlwZTogXCJub3JtYWxcIixcbiAgICB9LFxuICBdO1xufVxuXG4vKipcbiAqIOyjvOyWtOynhCBFbnRpdHlTZXTsnYQg6riw67CY7Jy866GcIO2FjOydtOu4lCBDUkVBVEUg66eI7J206re466CI7J207IWYIOy9lOuTnOulvCDsg53shLHtlanri4jri6QuXG4gKiBAcGFyYW0gZW50aXR5U2V0XG4gKiBAcmV0dXJucyBDUkVBVEUg66eI7J206re466CI7J207IWYIOy9lOuTnFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVDcmVhdGVDb2RlKGVudGl0eVNldDogTWlncmF0aW9uU2V0KTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgcmV0dXJuIFtcbiAgICBhd2FpdCBnZW5lcmF0ZUNyZWF0ZUNvZGVfQ29sdW1uQW5kSW5kZXhlcyhcbiAgICAgIGVudGl0eVNldC50YWJsZSxcbiAgICAgIGVudGl0eVNldC5jb2x1bW5zLFxuICAgICAgZW50aXR5U2V0LmluZGV4ZXMsXG4gICAgKSxcbiAgICAuLi4oYXdhaXQgZ2VuZXJhdGVDcmVhdGVDb2RlX0ZvcmVpZ24oZW50aXR5U2V0LnRhYmxlLCBlbnRpdHlTZXQuZm9yZWlnbnMpKSxcbiAgXTtcbn1cblxuLyoqXG4gKiDso7zslrTsp4QgZW50aXR5U2V07J2EIOuqqe2RnOuhnCwgZGJTZXTsnYQg7ZiEIOyDge2ZqeycvOuhnCDtlZjsl6wg7YWM7J2067iUIEFMVEVSIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5zrpbwg7IOd7ISx7ZWp64uI64ukLlxuICogQHBhcmFtIGVudGl0eVNldCDtmIQg7IOB7Zmp7J2YIE1pZ3JhdGlvblNldFxuICogQHBhcmFtIGRiU2V0IOuqqe2RnCDsg4HtmansnZggTWlncmF0aW9uU2V0XG4gKiBAcGFyYW0gY29tcGFyZURCIFBLIO2DgOyehSDrs4Dqsr0g7IucIOyXreywuOyhsCBGS+ulvCDsobDtmoztlZjquLAg7JyE7ZWcIEtuZXgg7J247Iqk7YS07IqkICjshKDtg50pXG4gKiBAcmV0dXJucyBBTFRFUiDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFsdGVyQ29kZShcbiAgZW50aXR5U2V0OiBNaWdyYXRpb25TZXQsXG4gIGRiU2V0OiBNaWdyYXRpb25TZXQsXG4gIGNvbXBhcmVEQj86IEtuZXgsXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICBjb25zdCByZXBsYWNlQ29sdW1uRGVmYXVsdFRvID0gKGNvbDogTWlncmF0aW9uQ29sdW1uKSA9PiB7XG4gICAgLy8gZmxvYXTsnbgg6rK97JqwIOq4sOuzuOqwkuydhCAw7Jy866GcIOyngOygle2VmOuKlCDqsr3smrAgXCIwLjAwXCLsnLzroZwg67OA7ZmY65CY64qUIOy8gOydtOyKpCDrjIDsnZFcbiAgICAvLyBpZiAoY29sLnR5cGUgPT09IFwiZmxvYXRcIiAmJiBjb2wuZGVmYXVsdFRvICYmIFN0cmluZyhjb2wuZGVmYXVsdFRvKS5pbmNsdWRlcygnXCInKSA9PT0gZmFsc2UpIHtcbiAgICAvLyAgIGNvbC5kZWZhdWx0VG8gPSBgXCIke051bWJlcihjb2wuZGVmYXVsdFRvKS50b0ZpeGVkKGNvbC5zY2FsZSA/PyAyKX1cImA7XG4gICAgLy8gfVxuICAgIC8vIC8vIHN0cmluZ+yduCDqsr3smrAg6riw67O46rCS7J20IOu5iCDsiqTtirjrp4Hsnbgg6rK97JqwIOuMgOydkVxuICAgIC8vIGlmIChjb2wudHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBjb2wuZGVmYXVsdFRvID09PSBcIlwiKSB7XG4gICAgLy8gICBjb2wuZGVmYXVsdFRvID0gJ1wiXCInO1xuICAgIC8vIH1cbiAgICAvLyAvLyBib29sZWFu7J24IOqyveyasCDquLDrs7jqsJIg7KCV6rec7ZmUIChNeVNRTOyXkOyEnOuKlCBUSU5ZSU5UKDEp66GcIOyggOyepeuQmOuvgOuhnCAwIOuYkOuKlCAx66GcIOygleq3nO2ZlClcbiAgICAvLyAvLyBUT0RPOiBkYi50c+yXkCB0eXBlQ2FzZSDshKTsoJUg7ZmV7J247ZWY7JesIOyymOumrO2VmOuPhOuhnSDsiJjsoJUg7ZWE7JqUXG4gICAgLy8gaWYgKGNvbC50eXBlID09PSBcImJvb2xlYW5cIiAmJiBjb2wuZGVmYXVsdFRvICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyAgIGlmIChjb2wuZGVmYXVsdFRvID09PSBcIjBcIiB8fCBjb2wuZGVmYXVsdFRvLnRvTG93ZXJDYXNlKCkgPT09IFwiZmFsc2VcIikge1xuICAgIC8vICAgICBjb2wuZGVmYXVsdFRvID0gXCIwXCI7XG4gICAgLy8gICB9IGVsc2UgaWYgKGNvbC5kZWZhdWx0VG8gPT09IFwiMVwiIHx8IGNvbC5kZWZhdWx0VG8udG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAvLyAgICAgY29sLmRlZmF1bHRUbyA9IFwiMVwiO1xuICAgIC8vICAgfVxuICAgIC8vIH1cblxuICAgIC8vIEZJWE1FOiDsnbzri6ggTXlTUUwg7IOB7Zmp7JeQ7IScIOuwnOyDne2WiOuNmCDsnbTsiojsnZggd29ya2Fyb3VuZCDsnbTrr4DroZwgUGfsl5DshJwg7J6s7ZmV7J24IO2bhCDrjIDsnZEg7LaU6rCAXG4gICAgcmV0dXJuIGNvbDtcbiAgfTtcbiAgY29uc3QgZW50aXR5Q29sdW1ucyA9IGFscGhhYmV0aWNhbChlbnRpdHlTZXQuY29sdW1ucywgKGEpID0+IGEubmFtZSkubWFwKHJlcGxhY2VDb2x1bW5EZWZhdWx0VG8pO1xuICBjb25zdCBkYkNvbHVtbnMgPSBhbHBoYWJldGljYWwoZGJTZXQuY29sdW1ucywgKGEpID0+IGEubmFtZSkubWFwKHJlcGxhY2VDb2x1bW5EZWZhdWx0VG8pO1xuXG4gIC8qIOuUlOuyhOq5heyaqSDsvZTrk5wsIO2KueyglSDsu6zrn7zsl5DshJwg67aI7J287LmYIOuwnOyDne2VoCDrlYwg7ZmV7J24XG4gICAgICAgIGNvbnN0IGVudGl0eUNvbHVtbiA9IGVudGl0eVNldC5jb2x1bW5zLmZpbmQoXG4gICAgICAgICAgKGNvbCkgPT4gY29sLm5hbWUgPT09IFwicHJpY2Vfa3J3XCJcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZGJDb2x1bW4gPSBkYlNldC5jb2x1bW5zLmZpbmQoXG4gICAgICAgICAgKGNvbCkgPT4gY29sLm5hbWUgPT09IFwicHJpY2Vfa3J3XCJcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh7IGVudGl0eUNvbHVtbiwgZGJDb2x1bW4gfSk7XG4gICAgICAgICAqL1xuXG4gIGNvbnN0IGVudGl0eUluZGV4ZXMgPSBhbHBoYWJldGljYWwoZW50aXR5U2V0LmluZGV4ZXMsIChhKSA9PlxuICAgIFthLnR5cGUsIC4uLmEuY29sdW1ucy5tYXAoKGMpID0+IGMubmFtZSldLmpvaW4oXCItXCIpLFxuICApO1xuICBjb25zdCBkYkluZGV4ZXMgPSBhbHBoYWJldGljYWwoZGJTZXQuaW5kZXhlcywgKGEpID0+XG4gICAgW2EudHlwZSwgLi4uYS5jb2x1bW5zLm1hcCgoYykgPT4gYy5uYW1lKV0uam9pbihcIi1cIiksXG4gICk7XG5cbiAgY29uc3QgcmVwbGFjZU5vQWN0aW9uT25NeVNRTCA9IChmOiBNaWdyYXRpb25Gb3JlaWduKSA9PiB7XG4gICAgLy8gTXlTUUzsl5DshJwgUkVTVFJJQ1TsmYAgTk8gQUNUSU9O7J2AIOuPmeydvO2VqFxuICAgIGNvbnN0IHsgb25EZWxldGUsIG9uVXBkYXRlIH0gPSBmO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5mLFxuICAgICAgb25VcGRhdGU6IG9uVXBkYXRlID09PSBcIlJFU1RSSUNUXCIgPyBcIk5PIEFDVElPTlwiIDogb25VcGRhdGUsXG4gICAgICBvbkRlbGV0ZTogb25EZWxldGUgPT09IFwiUkVTVFJJQ1RcIiA/IFwiTk8gQUNUSU9OXCIgOiBvbkRlbGV0ZSxcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGVudGl0eUZvcmVpZ25zID0gYWxwaGFiZXRpY2FsKGVudGl0eVNldC5mb3JlaWducywgKGEpID0+XG4gICAgW2EudG8sIC4uLmEuY29sdW1uc10uam9pbihcIi1cIiksXG4gICkubWFwKChmKSA9PiByZXBsYWNlTm9BY3Rpb25Pbk15U1FMKGYpKTtcbiAgY29uc3QgZGJGb3JlaWducyA9IGFscGhhYmV0aWNhbChkYlNldC5mb3JlaWducywgKGEpID0+IFthLnRvLCAuLi5hLmNvbHVtbnNdLmpvaW4oXCItXCIpKS5tYXAoKGYpID0+XG4gICAgcmVwbGFjZU5vQWN0aW9uT25NeVNRTChmKSxcbiAgKTtcblxuICAvLyDsgq3soJzrkKAg7Lus65+8IOuqqeuhnSDqs4TsgrBcbiAgY29uc3QgZHJvcHBpbmdDb2x1bW5zID0gZGlmZihkYkNvbHVtbnMsIGVudGl0eUNvbHVtbnMsIChjb2wpID0+IGNvbC5uYW1lKTtcblxuICBjb25zdCBhbHRlckNvZGVzOiAoR2VuTWlncmF0aW9uQ29kZSB8IEdlbk1pZ3JhdGlvbkNvZGVbXSB8IG51bGwpW10gPSBbXTtcblxuICAvLyAxLiBjb2x1bW5zQW5kSW5kZXhlcyDsspjrpqxcbiAgY29uc3Qgc2VhcmNoVGV4dENvbHVtbk5hbWVzID0gZ2V0U2VhcmNoVGV4dENvbHVtbk5hbWVzKGVudGl0eVNldC50YWJsZSk7XG4gIGNvbnN0IGlzRXF1YWxDb2x1bW5zID0gZXF1YWwoXG4gICAgZW50aXR5Q29sdW1ucy5tYXAoKGNvbHVtbikgPT4gbm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbihjb2x1bW4sIHNlYXJjaFRleHRDb2x1bW5OYW1lcykpLFxuICAgIGRiQ29sdW1ucy5tYXAoKGNvbHVtbikgPT4gbm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbihjb2x1bW4sIHNlYXJjaFRleHRDb2x1bW5OYW1lcykpLFxuICApO1xuICBjb25zdCBpc0VxdWFsSW5kZXhlcyA9IGVxdWFsKFxuICAgIGVudGl0eUluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMpLFxuICAgIGRiSW5kZXhlcy5tYXAoc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0cyksXG4gICk7XG4gIGlmICghaXNFcXVhbENvbHVtbnMgfHwgIWlzRXF1YWxJbmRleGVzKSB7XG4gICAgYWx0ZXJDb2Rlcy5wdXNoKFxuICAgICAgYXdhaXQgZ2VuZXJhdGVBbHRlckNvZGVfQ29sdW1uQW5kSW5kZXhlcyhcbiAgICAgICAgZW50aXR5U2V0LnRhYmxlLFxuICAgICAgICBlbnRpdHlDb2x1bW5zLFxuICAgICAgICBlbnRpdHlJbmRleGVzLFxuICAgICAgICBkYkNvbHVtbnMsXG4gICAgICAgIGRiSW5kZXhlcyxcbiAgICAgICAgZGJTZXQuZm9yZWlnbnMsXG4gICAgICAgIGNvbXBhcmVEQixcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8vIDIuIGZvcmVpZ25zIOyymOumrCAo7IKt7KCc65CgIOy7rOufvCDsoJXrs7Qg7KCE64usKVxuICBpZiAoIWVxdWFsKGVudGl0eUZvcmVpZ25zLCBkYkZvcmVpZ25zKSkge1xuICAgIGFsdGVyQ29kZXMucHVzaChcbiAgICAgIGF3YWl0IGdlbmVyYXRlQWx0ZXJDb2RlX0ZvcmVpZ25zKFxuICAgICAgICBlbnRpdHlTZXQudGFibGUsXG4gICAgICAgIGVudGl0eUZvcmVpZ25zLFxuICAgICAgICBkYkZvcmVpZ25zLFxuICAgICAgICBkcm9wcGluZ0NvbHVtbnMsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBpZiAoYWx0ZXJDb2Rlcy5ldmVyeSgoYWx0ZXJDb2RlKSA9PiBhbHRlckNvZGUgPT09IG51bGwpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIGFsdGVyQ29kZXMuZmlsdGVyKChhbHRlckNvZGUpID0+IGFsdGVyQ29kZSAhPT0gbnVsbCkuZmxhdCgpO1xufVxuXG4vKipcbiAqIFBLIO2DgOyehSDrs4Dqsr0g7IucIOyXreywuOyhsCBGSyDsoJzslb3sobDqsbTsnYQg7LKY66as7ZWY64qUIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5zrpbwg7IOd7ISx7ZWp64uI64ukLlxuICpcbiAqIFBLIO2DgOyehSDrs4Dqsr0g7IucIOyInOyEnDpcbiAqIDEuIEZLIOygnOyVveyhsOqxtCDsgq3soJwgKOyXreywuOyhsCDthYzsnbTruJTrk6QpXG4gKiAyLiDsnpDquLAg7LC47KGwIEZLIOyCreygnCAo7J6I64qUIOqyveyasClcbiAqIDMuIFBLIOygnOyVveyhsOqxtCDsgq3soJxcbiAqIDQuIFBLIOy7rOufvCDtg4DsnoUg67OA6rK9XG4gKiA1LiBGSyDsu6zrn7wg7YOA7J6FIOuzgOqyvSAo7Jet7LC47KGwIO2FjOydtOu4lOuTpClcbiAqIDYuIFBLIOygnOyVveyhsOqxtCDrs7XqtaxcbiAqIDcuIOyekOq4sCDssLjsobAgRksg67O16rWsXG4gKiA4LiBGSyDsoJzslb3sobDqsbQg67O16rWsXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGtUeXBlQ2hhbmdlTWlncmF0aW9uKFxuICB0YWJsZTogc3RyaW5nLFxuICBlbnRpdHlJZENvbDogTWlncmF0aW9uQ29sdW1uLFxuICBkYklkQ29sOiBNaWdyYXRpb25Db2x1bW4sXG4gIF9lbnRpdHlDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgX2VudGl0eUluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10sXG4gIF9kYkNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLFxuICBfZGJJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLFxuICBfZGJGb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuICBjb21wYXJlREI6IEtuZXgsXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICAvLyDsl63ssLjsobAgRksg7KGw7ZqMICjsnbQg7YWM7J2067iU7J2YIFBL66W8IOywuOyhsO2VmOuKlCDri6Trpbgg7YWM7J2067iU7J2YIEZL65OkKVxuICBjb25zdCByZWZlcmVuY2luZ0ZLcyA9IGF3YWl0IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIuZ2V0UmVmZXJlbmNpbmdGb3JlaWduS2V5cyhjb21wYXJlREIsIHRhYmxlKTtcblxuICAvLyDsnpDquLAg7LC47KGwIEZLIOu2hOumrCAo7JiIOiBEZXBhcnRtZW50LnBhcmVudF9pZCDihpIgRGVwYXJ0bWVudC5pZClcbiAgY29uc3Qgc2VsZlJlZmVyZW5jaW5nRktzID0gcmVmZXJlbmNpbmdGS3MuZmlsdGVyKChmaykgPT4gZmsudGFibGVOYW1lID09PSB0YWJsZSk7XG4gIGNvbnN0IGV4dGVybmFsUmVmZXJlbmNpbmdGS3MgPSByZWZlcmVuY2luZ0ZLcy5maWx0ZXIoKGZrKSA9PiBmay50YWJsZU5hbWUgIT09IHRhYmxlKTtcblxuICAvLyBQSyDsoJzslb3sobDqsbQg7J2066aEIOyhsO2ajFxuICBjb25zdCBwa0NvbnN0cmFpbnROYW1lID0gYCR7dGFibGV9X3BrZXlgO1xuXG4gIC8vIOyDiCBQSyDtg4DsnoXsl5Ag66ee64qUIFBvc3RncmVTUUwg7YOA7J6FIOusuOyekOyXtFxuICBjb25zdCBuZXdQa1BnVHlwZSA9IGdldFBrUGdUeXBlKGVudGl0eUlkQ29sKTtcbiAgY29uc3Qgb2xkUGtQZ1R5cGUgPSBnZXRQa1BnVHlwZShkYklkQ29sKTtcblxuICAvLyBVUCDsvZTrk5wg7IOd7ISxXG4gIGNvbnN0IHVwTGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gMS4g7Jm467aAIO2FjOydtOu4lOydmCBGSyDsoJzslb3sobDqsbQg7IKt7KCcXG4gIGZvciAoY29uc3QgZmsgb2YgZXh0ZXJuYWxSZWZlcmVuY2luZ0ZLcykge1xuICAgIHVwTGluZXMucHVzaChgICAvLyAke2ZrLnRhYmxlTmFtZX0uJHtmay5jb2x1bW5OYW1lfSBGSyDsoJzslb3sobDqsbQg7IKt7KCcYCk7XG4gICAgdXBMaW5lcy5wdXNoKFxuICAgICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHtmay50YWJsZU5hbWV9XCIgRFJPUCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIicpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDIuIOyekOq4sCDssLjsobAgRksg7IKt7KCcXG4gIGZvciAoY29uc3QgZmsgb2Ygc2VsZlJlZmVyZW5jaW5nRktzKSB7XG4gICAgdXBMaW5lcy5wdXNoKGAgIC8vIOyekOq4sCDssLjsobAgRksg7IKt7KCcOiAke2ZrLmNvbHVtbk5hbWV9YCk7XG4gICAgdXBMaW5lcy5wdXNoKFxuICAgICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHt0YWJsZX1cIiBEUk9QIENPTlNUUkFJTlQgXCIke2ZrLmNvbnN0cmFpbnROYW1lfVwiJyk7YCxcbiAgICApO1xuICB9XG5cbiAgLy8gMy4gUEsg7KCc7JW97KGw6rG0IOyCreygnFxuICB1cExpbmVzLnB1c2goYCAgLy8gUEsg7KCc7JW97KGw6rG0IOyCreygnGApO1xuICB1cExpbmVzLnB1c2goYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHt0YWJsZX1cIiBEUk9QIENPTlNUUkFJTlQgXCIke3BrQ29uc3RyYWludE5hbWV9XCInKTtgKTtcblxuICAvLyA0LiBQSyDsu6zrn7wg7YOA7J6FIOuzgOqyvVxuICB1cExpbmVzLnB1c2goYCAgLy8gUEsg7Lus65+8IO2DgOyehSDrs4Dqsr1gKTtcbiAgdXBMaW5lcy5wdXNoKFxuICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgQUxURVIgQ09MVU1OIFwiaWRcIiBUWVBFICR7bmV3UGtQZ1R5cGV9IFVTSU5HIFwiaWRcIjo6JHtuZXdQa1BnVHlwZX0nKTtgLFxuICApO1xuXG4gIC8vIDUuIEZLIOy7rOufvCDtg4DsnoUg67OA6rK9ICjsl63ssLjsobAg7YWM7J2067iU65OkKSAtIOyekOq4sCDssLjsobAg7Y+s7ZWoXG4gIGZvciAoY29uc3QgZmsgb2YgcmVmZXJlbmNpbmdGS3MpIHtcbiAgICB1cExpbmVzLnB1c2goYCAgLy8gJHtmay50YWJsZU5hbWV9LiR7ZmsuY29sdW1uTmFtZX0g7Lus65+8IO2DgOyehSDrs4Dqsr1gKTtcbiAgICB1cExpbmVzLnB1c2goXG4gICAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke2ZrLnRhYmxlTmFtZX1cIiBBTFRFUiBDT0xVTU4gXCIke2ZrLmNvbHVtbk5hbWV9XCIgVFlQRSAke25ld1BrUGdUeXBlfSBVU0lORyBcIiR7ZmsuY29sdW1uTmFtZX1cIjo6JHtuZXdQa1BnVHlwZX0nKTtgLFxuICAgICk7XG4gIH1cblxuICAvLyA2LiBQSyDsoJzslb3sobDqsbQg67O16rWsXG4gIHVwTGluZXMucHVzaChgICAvLyBQSyDsoJzslb3sobDqsbQg67O16rWsYCk7XG4gIHVwTGluZXMucHVzaChcbiAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIEFERCBDT05TVFJBSU5UIFwiJHtwa0NvbnN0cmFpbnROYW1lfVwiIFBSSU1BUlkgS0VZIChcImlkXCIpJyk7YCxcbiAgKTtcblxuICAvLyA3LiDsnpDquLAg7LC47KGwIEZLIOuzteq1rFxuICBmb3IgKGNvbnN0IGZrIG9mIHNlbGZSZWZlcmVuY2luZ0ZLcykge1xuICAgIHVwTGluZXMucHVzaChgICAvLyDsnpDquLAg7LC47KGwIEZLIOuzteq1rDogJHtmay5jb2x1bW5OYW1lfWApO1xuICAgIHVwTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgQUREIENPTlNUUkFJTlQgXCIke2ZrLmNvbnN0cmFpbnROYW1lfVwiIEZPUkVJR04gS0VZIChcIiR7ZmsuY29sdW1uTmFtZX1cIikgUkVGRVJFTkNFUyBcIiR7dGFibGV9XCIoXCJpZFwiKSBPTiBVUERBVEUgJHtmay5vblVwZGF0ZX0gT04gREVMRVRFICR7Zmsub25EZWxldGV9Jyk7YCxcbiAgICApO1xuICB9XG5cbiAgLy8gOC4g7Jm467aAIO2FjOydtOu4lOydmCBGSyDsoJzslb3sobDqsbQg67O16rWsXG4gIGZvciAoY29uc3QgZmsgb2YgZXh0ZXJuYWxSZWZlcmVuY2luZ0ZLcykge1xuICAgIHVwTGluZXMucHVzaChgICAvLyAke2ZrLnRhYmxlTmFtZX0uJHtmay5jb2x1bW5OYW1lfSBGSyDsoJzslb3sobDqsbQg67O16rWsYCk7XG4gICAgdXBMaW5lcy5wdXNoKFxuICAgICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHtmay50YWJsZU5hbWV9XCIgQUREIENPTlNUUkFJTlQgXCIke2ZrLmNvbnN0cmFpbnROYW1lfVwiIEZPUkVJR04gS0VZIChcIiR7ZmsuY29sdW1uTmFtZX1cIikgUkVGRVJFTkNFUyBcIiR7dGFibGV9XCIoXCJpZFwiKSBPTiBVUERBVEUgJHtmay5vblVwZGF0ZX0gT04gREVMRVRFICR7Zmsub25EZWxldGV9Jyk7YCxcbiAgICApO1xuICB9XG5cbiAgLy8gRE9XTiDsvZTrk5wg7IOd7ISxICjsl63siJwpXG4gIGNvbnN0IGRvd25MaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAvLyAxLiDsmbjrtoAg7YWM7J2067iU7J2YIEZLIOygnOyVveyhsOqxtCDsgq3soJxcbiAgZm9yIChjb25zdCBmayBvZiBleHRlcm5hbFJlZmVyZW5jaW5nRktzKSB7XG4gICAgZG93bkxpbmVzLnB1c2goYCAgLy8gJHtmay50YWJsZU5hbWV9LiR7ZmsuY29sdW1uTmFtZX0gRksg7KCc7JW97KGw6rG0IOyCreygnGApO1xuICAgIGRvd25MaW5lcy5wdXNoKFxuICAgICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHtmay50YWJsZU5hbWV9XCIgRFJPUCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIicpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDIuIOyekOq4sCDssLjsobAgRksg7IKt7KCcXG4gIGZvciAoY29uc3QgZmsgb2Ygc2VsZlJlZmVyZW5jaW5nRktzKSB7XG4gICAgZG93bkxpbmVzLnB1c2goYCAgLy8g7J6Q6riwIOywuOyhsCBGSyDsgq3soJw6ICR7ZmsuY29sdW1uTmFtZX1gKTtcbiAgICBkb3duTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgRFJPUCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIicpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDMuIFBLIOygnOyVveyhsOqxtCDsgq3soJxcbiAgZG93bkxpbmVzLnB1c2goYCAgLy8gUEsg7KCc7JW97KGw6rG0IOyCreygnGApO1xuICBkb3duTGluZXMucHVzaChcbiAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIERST1AgQ09OU1RSQUlOVCBcIiR7cGtDb25zdHJhaW50TmFtZX1cIicpO2AsXG4gICk7XG5cbiAgLy8gNC4gUEsg7Lus65+8IO2DgOyehSDsm5Drs7VcbiAgZG93bkxpbmVzLnB1c2goYCAgLy8gUEsg7Lus65+8IO2DgOyehSDsm5Drs7VgKTtcbiAgZG93bkxpbmVzLnB1c2goXG4gICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHt0YWJsZX1cIiBBTFRFUiBDT0xVTU4gXCJpZFwiIFRZUEUgJHtvbGRQa1BnVHlwZX0gVVNJTkcgXCJpZFwiOjoke29sZFBrUGdUeXBlfScpO2AsXG4gICk7XG5cbiAgLy8gNS4gRksg7Lus65+8IO2DgOyehSDsm5Drs7UgKOyXreywuOyhsCDthYzsnbTruJTrk6QpXG4gIGZvciAoY29uc3QgZmsgb2YgcmVmZXJlbmNpbmdGS3MpIHtcbiAgICBkb3duTGluZXMucHVzaChgICAvLyAke2ZrLnRhYmxlTmFtZX0uJHtmay5jb2x1bW5OYW1lfSDsu6zrn7wg7YOA7J6FIOybkOuztWApO1xuICAgIGRvd25MaW5lcy5wdXNoKFxuICAgICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHtmay50YWJsZU5hbWV9XCIgQUxURVIgQ09MVU1OIFwiJHtmay5jb2x1bW5OYW1lfVwiIFRZUEUgJHtvbGRQa1BnVHlwZX0gVVNJTkcgXCIke2ZrLmNvbHVtbk5hbWV9XCI6OiR7b2xkUGtQZ1R5cGV9Jyk7YCxcbiAgICApO1xuICB9XG5cbiAgLy8gNi4gUEsg7KCc7JW97KGw6rG0IOuzteq1rFxuICBkb3duTGluZXMucHVzaChgICAvLyBQSyDsoJzslb3sobDqsbQg67O16rWsYCk7XG4gIGRvd25MaW5lcy5wdXNoKFxuICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgQUREIENPTlNUUkFJTlQgXCIke3BrQ29uc3RyYWludE5hbWV9XCIgUFJJTUFSWSBLRVkgKFwiaWRcIiknKTtgLFxuICApO1xuXG4gIC8vIDcuIOyekOq4sCDssLjsobAgRksg67O16rWsXG4gIGZvciAoY29uc3QgZmsgb2Ygc2VsZlJlZmVyZW5jaW5nRktzKSB7XG4gICAgZG93bkxpbmVzLnB1c2goYCAgLy8g7J6Q6riwIOywuOyhsCBGSyDrs7Xqtaw6ICR7ZmsuY29sdW1uTmFtZX1gKTtcbiAgICBkb3duTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgQUREIENPTlNUUkFJTlQgXCIke2ZrLmNvbnN0cmFpbnROYW1lfVwiIEZPUkVJR04gS0VZIChcIiR7ZmsuY29sdW1uTmFtZX1cIikgUkVGRVJFTkNFUyBcIiR7dGFibGV9XCIoXCJpZFwiKSBPTiBVUERBVEUgJHtmay5vblVwZGF0ZX0gT04gREVMRVRFICR7Zmsub25EZWxldGV9Jyk7YCxcbiAgICApO1xuICB9XG5cbiAgLy8gOC4g7Jm467aAIO2FjOydtOu4lOydmCBGSyDsoJzslb3sobDqsbQg67O16rWsXG4gIGZvciAoY29uc3QgZmsgb2YgZXh0ZXJuYWxSZWZlcmVuY2luZ0ZLcykge1xuICAgIGRvd25MaW5lcy5wdXNoKGAgIC8vICR7ZmsudGFibGVOYW1lfS4ke2ZrLmNvbHVtbk5hbWV9IEZLIOygnOyVveyhsOqxtCDrs7XqtaxgKTtcbiAgICBkb3duTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7ZmsudGFibGVOYW1lfVwiIEFERCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIiBGT1JFSUdOIEtFWSAoXCIke2ZrLmNvbHVtbk5hbWV9XCIpIFJFRkVSRU5DRVMgXCIke3RhYmxlfVwiKFwiaWRcIikgT04gVVBEQVRFICR7Zmsub25VcGRhdGV9IE9OIERFTEVURSAke2ZrLm9uRGVsZXRlfScpO2AsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAnaW1wb3J0IHsgS25leCB9IGZyb20gXCJrbmV4XCI7JyxcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICAuLi51cExpbmVzLFxuICAgIFwifVwiLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bihrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgLi4uZG93bkxpbmVzLFxuICAgIFwifVwiLFxuICBdO1xuXG4gIGNvbnN0IGZvcm1hdHRlZCA9IGF3YWl0IGZvcm1hdENvZGUobGluZXMuam9pbihcIlxcblwiKSwgYHNyYy9taWdyYXRpb24vJHt0YWJsZX0udHNgKTtcblxuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHRhYmxlLFxuICAgICAgdGl0bGU6IGBhbHRlcl8ke3RhYmxlfV9wa190eXBlYCxcbiAgICAgIGZvcm1hdHRlZCxcbiAgICAgIHR5cGU6IFwibm9ybWFsXCIsXG4gICAgfSxcbiAgXTtcbn1cblxuLyoqXG4gKiBQSyDsu6zrn7zsnZggUG9zdGdyZVNRTCDtg4DsnoUg66y47J6Q7Je07J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0UGtQZ1R5cGUoY29sOiBNaWdyYXRpb25Db2x1bW4pOiBzdHJpbmcge1xuICBpZiAoY29sLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gY29sLmxlbmd0aCAhPT0gdW5kZWZpbmVkID8gYHZhcmNoYXIoJHtjb2wubGVuZ3RofSlgIDogXCJ0ZXh0XCI7XG4gIH1cbiAgaWYgKGNvbC50eXBlID09PSBcInV1aWRcIikge1xuICAgIHJldHVybiBcInV1aWRcIjtcbiAgfVxuICAvLyBpbnRlZ2Vy7J2YIOqyveyasCBzZXJpYWwvaW50ZWdlciDqtazrtoTsnbQg7ZWE7JqU7ZWY7KeA66eMLFxuICAvLyDtg4DsnoUg67OA6rK9IOyLnOyXkOuKlCBpbnRlZ2Vy66GcIOyymOumrO2VqeuLiOuLpC5cbiAgcmV0dXJuIFwiaW50ZWdlclwiO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQTJSQSxTQUFTLHNCQUFzQixRQUErRDtBQUM1RixRQUFPLE9BQU8s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
1489
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1nZW5lcmF0aW9uLmpzIiwibmFtZXMiOlsidG9rZW5zOiBTZWFyY2hUZXh0RXhwcmVzc2lvblRva2VuW10iLCJsaW5lczogc3RyaW5nW10iLCJyZXN1bHQ6IENvbHVtbkRlZmluaXRpb25SZXN1bHQiLCJjaGFpbnM6IHN0cmluZ1tdIiwiYWx0ZXJDb2RlczogKEdlbk1pZ3JhdGlvbkNvZGUgfCBHZW5NaWdyYXRpb25Db2RlW10gfCBudWxsKVtdIiwidXBMaW5lczogc3RyaW5nW10iLCJkb3duTGluZXM6IHN0cmluZ1tdIiwiU0VBUkNIX1RFWFRfSEVMUEVSX0RFRklOSVRJT05TOiBSZWNvcmQ8U2VhcmNoVGV4dEhlbHBlcktpbmQsIHN0cmluZz4iLCJhcmdzOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGVbXSIsInBhcnRzOiBzdHJpbmdbXSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vY29kZS1nZW5lcmF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgYWxwaGFiZXRpY2FsLCBkaWZmIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgR2VuTWlncmF0aW9uQ29kZSxcbiAgdHlwZSBNaWdyYXRpb25Db2x1bW4sXG4gIHR5cGUgTWlncmF0aW9uRm9yZWlnbixcbiAgdHlwZSBNaWdyYXRpb25JbmRleCxcbiAgdHlwZSBNaWdyYXRpb25TZXQsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNTZWFyY2hUZXh0UHJvcCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgZm9ybWF0Q29kZSB9IGZyb20gXCIuLi91dGlscy9mb3JtYXR0ZXJcIjtcbmltcG9ydCB7IGRpZmZlcmVuY2VXaXRoLCBpbnRlcnNlY3Rpb25CeSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplSW5kZXhXaGVyZVByZWRpY2F0ZSxcbiAgbm9ybWFsaXplSW5kZXhXaGVyZVByZWRpY2F0ZUZvckNvbXBhcmlzb24sXG59IGZyb20gXCIuL2luZGV4LXdoZXJlLXByZWRpY2F0ZVwiO1xuaW1wb3J0IHsgUG9zdGdyZVNRTFNjaGVtYVJlYWRlciB9IGZyb20gXCIuL3Bvc3RncmVzcWwtc2NoZW1hLXJlYWRlclwiO1xuXG4vKipcbiAqIOy7rOufvCDsoJXsnZgg6rKw6rO8IO2DgOyehVxuICogLSBidWlsZGVyOiBLbmV4IHRhYmxlIGJ1aWxkZXIg66mU7ISc65Oc66GcIOyLpO2Wie2VoCDqtazrrLggKHRhYmxlLnh4eCgpKVxuICogLSByYXc6IGtuZXgucmF3KCnroZwg7Iuk7ZaJ7ZWgIOq1rOusuFxuICovXG50eXBlIENvbHVtbkRlZmluaXRpb25SZXN1bHQgPSB7XG4gIGJ1aWxkZXI6IHN0cmluZ1tdO1xuICByYXc6IHN0cmluZ1tdO1xufTtcblxudHlwZSBTZWFyY2hUZXh0SGVscGVyS2luZCA9IFwidGV4dC1hcnJheVwiIHwgXCJqc29uYi1hcnJheVwiO1xuXG50eXBlIFNlYXJjaFRleHRFeHByZXNzaW9uVG9rZW4gPVxuICB8IHsgdHlwZTogXCJpZGVudGlmaWVyXCI7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogXCJxdW90ZWRJZGVudGlmaWVyXCI7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogXCJzdHJpbmdcIjsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcInN5bWJvbFwiOyB2YWx1ZTogXCIoXCIgfCBcIilcIiB8IFwiLFwiIH1cbiAgfCB7IHR5cGU6IFwib3BlcmF0b3JcIjsgdmFsdWU6IFwifHxcIiB8IFwiOjpcIiB9O1xuXG50eXBlIFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSA9XG4gIHwgeyB0eXBlOiBcImlkZW50aWZpZXJcIjsgbmFtZTogc3RyaW5nOyBxdW90ZWQ6IGJvb2xlYW4gfVxuICB8IHsgdHlwZTogXCJzdHJpbmdcIjsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcImJvb2xlYW5cIjsgdmFsdWU6IGJvb2xlYW4gfVxuICB8IHsgdHlwZTogXCJmdW5jdGlvblwiOyBuYW1lOiBzdHJpbmc7IGFyZ3M6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZVtdIH1cbiAgfCB7IHR5cGU6IFwiY29uY2F0XCI7IHBhcnRzOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGVbXSB9XG4gIHwgeyB0eXBlOiBcImNvbGxhdGVcIjsgZXhwcjogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlOyBjb2xsYXRpb246IHN0cmluZzsgcXVvdGVkOiBib29sZWFuIH1cbiAgfCB7IHR5cGU6IFwiY2FzdFwiOyBleHByOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGU7IHRhcmdldFR5cGU6IHN0cmluZyB9O1xuXG5jb25zdCBTRUFSQ0hfVEVYVF9IRUxQRVJfREVGSU5JVElPTlM6IFJlY29yZDxTZWFyY2hUZXh0SGVscGVyS2luZCwgc3RyaW5nPiA9IHtcbiAgXCJ0ZXh0LWFycmF5XCI6IGBhd2FpdCBrbmV4LnJhdyhcXGBDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBzb25hbXVfdGV4dF9hcnJheV9hZ2coYXJyIHRleHRbXSwgY2kgYm9vbGVhbiBERUZBVUxUIHRydWUpXG5SRVRVUk5TIHRleHRcbkxBTkdVQUdFIHNxbCBJTU1VVEFCTEUgUEFSQUxMRUwgU0FGRSBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVFxuQVMgJCRcbiAgU0VMRUNUIHN0cmluZ19hZ2coXG4gICAgQ0FTRSBXSEVOIGNpIFRIRU4gbG93ZXIodmFsdWUpIEVMU0UgdmFsdWUgRU5ELFxuICAgICcgJ1xuICApXG4gIEZST00gdW5uZXN0KGFycikgQVMgdmFsdWVcbiQkXFxgKTtgLFxuICBcImpzb25iLWFycmF5XCI6IGBhd2FpdCBrbmV4LnJhdyhcXGBDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBzb25hbXVfanNvbmJfYXJyYXlfYWdnKGFyciBqc29uYiwgY2kgYm9vbGVhbiBERUZBVUxUIHRydWUpXG5SRVRVUk5TIHRleHRcbkxBTkdVQUdFIHNxbCBJTU1VVEFCTEUgUEFSQUxMRUwgU0FGRSBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVFxuQVMgJCRcbiAgU0VMRUNUIHN0cmluZ19hZ2coXG4gICAgQ0FTRSBXSEVOIGNpIFRIRU4gbG93ZXIodmFsdWUpIEVMU0UgdmFsdWUgRU5ELFxuICAgICcgJ1xuICApXG4gIEZST00ganNvbmJfYXJyYXlfZWxlbWVudHNfdGV4dChhcnIpXG4kJFxcYCk7YCxcbn07XG5cbmNsYXNzIFNlYXJjaFRleHRFeHByZXNzaW9uUGFyc2VyIHtcbiAgcHJpdmF0ZSBpbmRleCA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB0b2tlbnM6IFNlYXJjaFRleHRFeHByZXNzaW9uVG9rZW5bXSkge31cblxuICBpc0F0RW5kKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmluZGV4ID49IHRoaXMudG9rZW5zLmxlbmd0aDtcbiAgfVxuXG4gIHBhcnNlRXhwcmVzc2lvbigpOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUge1xuICAgIHJldHVybiB0aGlzLnBhcnNlQ29uY2F0KCk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlQ29uY2F0KCk6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSB7XG4gICAgY29uc3QgcGFydHMgPSBbdGhpcy5wYXJzZVBvc3RmaXgoKV07XG5cbiAgICB3aGlsZSAodGhpcy5tYXRjaE9wZXJhdG9yKFwifHxcIikpIHtcbiAgICAgIHBhcnRzLnB1c2godGhpcy5wYXJzZVBvc3RmaXgoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA9PT0gMSA/IHBhcnRzWzBdIDogeyB0eXBlOiBcImNvbmNhdFwiLCBwYXJ0cyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVBvc3RmaXgoKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlIHtcbiAgICBsZXQgbm9kZSA9IHRoaXMucGFyc2VQcmltYXJ5KCk7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHRoaXMubWF0Y2hPcGVyYXRvcihcIjo6XCIpKSB7XG4gICAgICAgIG5vZGUgPSB7XG4gICAgICAgICAgdHlwZTogXCJjYXN0XCIsXG4gICAgICAgICAgZXhwcjogbm9kZSxcbiAgICAgICAgICB0YXJnZXRUeXBlOiB0aGlzLnBhcnNlVHlwZU5hbWUoKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoSWRlbnRpZmllcihcImNvbGxhdGVcIikpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmNvbnN1bWVDb2xsYXRpb25Ub2tlbigpO1xuICAgICAgICBub2RlID0ge1xuICAgICAgICAgIHR5cGU6IFwiY29sbGF0ZVwiLFxuICAgICAgICAgIGV4cHI6IG5vZGUsXG4gICAgICAgICAgY29sbGF0aW9uOiB0b2tlbi52YWx1ZSxcbiAgICAgICAgICBxdW90ZWQ6IHRva2VuLnR5cGUgPT09IFwicXVvdGVkSWRlbnRpZmllclwiLFxuICAgICAgICB9O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlUHJpbWFyeSgpOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5jb25zdW1lVG9rZW4oXCLtkZztmITsi51cIik7XG5cbiAgICBpZiAodG9rZW4udHlwZSA9PT0gXCJzeW1ib2xcIiAmJiB0b2tlbi52YWx1ZSA9PT0gXCIoXCIpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgdGhpcy5leHBlY3RTeW1ib2woXCIpXCIpO1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwic3RyaW5nXCIsIHZhbHVlOiB0b2tlbi52YWx1ZSB9O1xuICAgIH1cblxuICAgIGlmICh0b2tlbi50eXBlID09PSBcImlkZW50aWZpZXJcIiB8fCB0b2tlbi50eXBlID09PSBcInF1b3RlZElkZW50aWZpZXJcIikge1xuICAgICAgY29uc3QgbG93ZXJOYW1lID0gdG9rZW4udmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmICh0b2tlbi50eXBlID09PSBcImlkZW50aWZpZXJcIiAmJiAobG93ZXJOYW1lID09PSBcInRydWVcIiB8fCBsb3dlck5hbWUgPT09IFwiZmFsc2VcIikpIHtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJib29sZWFuXCIsIHZhbHVlOiBsb3dlck5hbWUgPT09IFwidHJ1ZVwiIH07XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoU3ltYm9sKFwiKFwiKSkge1xuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gXCJpZGVudGlmaWVyXCIgJiYgbG93ZXJOYW1lID09PSBcInRyaW1cIiAmJiB0aGlzLmlzVHJpbUJvdGhGcm9tRm9ybSgpKSB7XG4gICAgICAgICAgdGhpcy5pbmRleCArPSAyO1xuICAgICAgICAgIGNvbnN0IGFyZyA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgICAgdGhpcy5leHBlY3RTeW1ib2woXCIpXCIpO1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6IFwiZnVuY3Rpb25cIiwgbmFtZTogXCJ0cmltXCIsIGFyZ3M6IFthcmddIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5wYXJzZUZ1bmN0aW9uQXJncygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICBuYW1lOiB0b2tlbi52YWx1ZSxcbiAgICAgICAgICBhcmdzLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcImlkZW50aWZpZXJcIixcbiAgICAgICAgbmFtZTogdG9rZW4udmFsdWUsXG4gICAgICAgIHF1b3RlZDogdG9rZW4udHlwZSA9PT0gXCJxdW90ZWRJZGVudGlmaWVyXCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihg7KeA7JuQ65CY7KeAIOyViuuKlCBzZWFyY2hUZXh0IGV4cHJlc3Npb24gdG9rZW46ICR7dG9rZW4udHlwZX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VGdW5jdGlvbkFyZ3MoKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlW10ge1xuICAgIGlmICh0aGlzLm1hdGNoU3ltYm9sKFwiKVwiKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGFyZ3M6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZVtdID0gW107XG4gICAgZG8ge1xuICAgICAgYXJncy5wdXNoKHRoaXMucGFyc2VFeHByZXNzaW9uKCkpO1xuICAgIH0gd2hpbGUgKHRoaXMubWF0Y2hTeW1ib2woXCIsXCIpKTtcblxuICAgIHRoaXMuZXhwZWN0U3ltYm9sKFwiKVwiKTtcbiAgICByZXR1cm4gYXJncztcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VUeXBlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5wZWVrKCk7XG4gICAgICBpZiAoXG4gICAgICAgIHRva2VuPy50eXBlID09PSBcImlkZW50aWZpZXJcIiB8fFxuICAgICAgICB0b2tlbj8udHlwZSA9PT0gXCJxdW90ZWRJZGVudGlmaWVyXCIgfHxcbiAgICAgICAgKHRva2VuPy50eXBlID09PSBcInN5bWJvbFwiICYmXG4gICAgICAgICAgKHRva2VuLnZhbHVlID09PSBcIihcIiB8fCB0b2tlbi52YWx1ZSA9PT0gXCIpXCIgfHwgdG9rZW4udmFsdWUgPT09IFwiLFwiKSlcbiAgICAgICkge1xuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFydHMucHVzaCh0b2tlbi52YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgdGhpcy5pbmRleCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwi7YOA7J6FIOy6kOyKpO2MhSDrjIDsg4Eg7YOA7J6F7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukLlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHMuam9pbihcIiBcIik7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVDb2xsYXRpb25Ub2tlbigpOiBFeHRyYWN0PFxuICAgIFNlYXJjaFRleHRFeHByZXNzaW9uVG9rZW4sXG4gICAgeyB0eXBlOiBcImlkZW50aWZpZXJcIiB8IFwicXVvdGVkSWRlbnRpZmllclwiIH1cbiAgPiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAodG9rZW4/LnR5cGUgIT09IFwiaWRlbnRpZmllclwiICYmIHRva2VuPy50eXBlICE9PSBcInF1b3RlZElkZW50aWZpZXJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ09MTEFURSDrjIDsg4Eg7Iud67OE7J6Q66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukLlwiKTtcbiAgICB9XG4gICAgdGhpcy5pbmRleCArPSAxO1xuICAgIHJldHVybiB0b2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgaXNUcmltQm90aEZyb21Gb3JtKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJvdGhUb2tlbiA9IHRoaXMucGVlaygpO1xuICAgIGNvbnN0IGZyb21Ub2tlbiA9IHRoaXMucGVlaygxKTtcblxuICAgIHJldHVybiAoXG4gICAgICBib3RoVG9rZW4/LnR5cGUgPT09IFwiaWRlbnRpZmllclwiICYmXG4gICAgICBib3RoVG9rZW4udmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJib3RoXCIgJiZcbiAgICAgIGZyb21Ub2tlbj8udHlwZSA9PT0gXCJpZGVudGlmaWVyXCIgJiZcbiAgICAgIGZyb21Ub2tlbi52YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcImZyb21cIlxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGV4cGVjdFN5bWJvbCh2YWx1ZTogXCIoXCIgfCBcIilcIiB8IFwiLFwiKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1hdGNoU3ltYm9sKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBcIiR7dmFsdWV9XCIg7Yag7YGw7J20IO2VhOyalO2VqeuLiOuLpC5gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1hdGNoU3ltYm9sKHZhbHVlOiBcIihcIiB8IFwiKVwiIHwgXCIsXCIpOiBib29sZWFuIHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0b2tlbj8udHlwZSA9PT0gXCJzeW1ib2xcIiAmJiB0b2tlbi52YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuaW5kZXggKz0gMTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIG1hdGNoT3BlcmF0b3IodmFsdWU6IFwifHxcIiB8IFwiOjpcIik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRva2VuPy50eXBlID09PSBcIm9wZXJhdG9yXCIgJiYgdG9rZW4udmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICB0aGlzLmluZGV4ICs9IDE7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXRjaElkZW50aWZpZXIodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRva2VuPy50eXBlID09PSBcImlkZW50aWZpZXJcIiAmJiB0b2tlbi52YWx1ZS50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLmluZGV4ICs9IDE7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lVG9rZW4oY29udGV4dDogc3RyaW5nKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ub2tlbiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Y29udGV4dH0g7Yag7YGw7J20IO2VhOyalO2VqeuLiOuLpC5gKTtcbiAgICB9XG4gICAgdGhpcy5pbmRleCArPSAxO1xuICAgIHJldHVybiB0b2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgcGVlayhvZmZzZXQgPSAwKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ub2tlbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zW3RoaXMuaW5kZXggKyBvZmZzZXRdO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEluZGV4Q29sdW1uT3BjbGFzcyhjb2x1bW46IE1pZ3JhdGlvbkluZGV4W1wiY29sdW1uc1wiXVtudW1iZXJdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbHVtbi5vcGNsYXNzID8/IGNvbHVtbi52ZWN0b3JPcHM7XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplU2VhcmNoVGV4dEV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ub2tlbltdIHtcbiAgY29uc3QgdG9rZW5zOiBTZWFyY2hUZXh0RXhwcmVzc2lvblRva2VuW10gPSBbXTtcbiAgbGV0IGluZGV4ID0gMDtcblxuICB3aGlsZSAoaW5kZXggPCBleHByZXNzaW9uLmxlbmd0aCkge1xuICAgIGNvbnN0IGNoYXIgPSBleHByZXNzaW9uW2luZGV4XTtcblxuICAgIGlmIChjaGFyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICgvXFxzLy50ZXN0KGNoYXIpKSB7XG4gICAgICBpbmRleCArPSAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGV4cHJlc3Npb24uc3RhcnRzV2l0aChcInx8XCIsIGluZGV4KSkge1xuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcIm9wZXJhdG9yXCIsIHZhbHVlOiBcInx8XCIgfSk7XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGV4cHJlc3Npb24uc3RhcnRzV2l0aChcIjo6XCIsIGluZGV4KSkge1xuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcIm9wZXJhdG9yXCIsIHZhbHVlOiBcIjo6XCIgfSk7XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09IFwiKFwiIHx8IGNoYXIgPT09IFwiKVwiIHx8IGNoYXIgPT09IFwiLFwiKSB7XG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFwic3ltYm9sXCIsIHZhbHVlOiBjaGFyIH0pO1xuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGFyID09PSBcIidcIikge1xuICAgICAgbGV0IHZhbHVlID0gXCJcIjtcbiAgICAgIGluZGV4ICs9IDE7XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGV4cHJlc3Npb24ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBleHByZXNzaW9uW2luZGV4XTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IFwiJ1wiKSB7XG4gICAgICAgICAgaWYgKGV4cHJlc3Npb25baW5kZXggKyAxXSA9PT0gXCInXCIpIHtcbiAgICAgICAgICAgIHZhbHVlICs9IFwiJ1wiO1xuICAgICAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZSArPSBjdXJyZW50O1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgfVxuXG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFwic3RyaW5nXCIsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09ICdcIicpIHtcbiAgICAgIGxldCB2YWx1ZSA9IFwiXCI7XG4gICAgICBpbmRleCArPSAxO1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCBleHByZXNzaW9uLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gZXhwcmVzc2lvbltpbmRleF07XG4gICAgICAgIGlmIChjdXJyZW50ID09PSAnXCInKSB7XG4gICAgICAgICAgaWYgKGV4cHJlc3Npb25baW5kZXggKyAxXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgdmFsdWUgKz0gJ1wiJztcbiAgICAgICAgICAgIGluZGV4ICs9IDI7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgKz0gY3VycmVudDtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgIH1cblxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcInF1b3RlZElkZW50aWZpZXJcIiwgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoL1tBLVphLXpfXS8udGVzdChjaGFyKSkge1xuICAgICAgbGV0IHZhbHVlID0gY2hhcjtcbiAgICAgIGluZGV4ICs9IDE7XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGV4cHJlc3Npb24ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBleHByZXNzaW9uW2luZGV4XTtcbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IHVuZGVmaW5lZCAmJiAvW0EtWmEtejAtOV8kXS8udGVzdChjdXJyZW50KSkge1xuICAgICAgICAgIHZhbHVlICs9IGN1cnJlbnQ7XG4gICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcImlkZW50aWZpZXJcIiwgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYOyngOybkOuQmOyngCDslYrripQgc2VhcmNoVGV4dCBleHByZXNzaW9uIOusuOyekDogJHtjaGFyfWApO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuZnVuY3Rpb24gY2Fub25pY2FsaXplU2VhcmNoVGV4dEdlbmVyYXRlZEV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgU2VhcmNoVGV4dEV4cHJlc3Npb25QYXJzZXIodG9rZW5pemVTZWFyY2hUZXh0RXhwcmVzc2lvbihleHByZXNzaW9uKSk7XG4gICAgY29uc3QgcGFyc2VkRXhwcmVzc2lvbiA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24oKTtcblxuICAgIGlmICghcGFyc2VyLmlzQXRFbmQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2VhcmNoVGV4dCBleHByZXNzaW9uIO2MjOyLseydtCDrgZ3rgpjsp4Ag7JWK7JWY7Iq164uI64ukLlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVuZGVyU2VhcmNoVGV4dEV4cHJlc3Npb24obm9ybWFsaXplU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKHBhcnNlZEV4cHJlc3Npb24pKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVNlYXJjaFRleHRFeHByZXNzaW9uRmFsbGJhY2soZXhwcmVzc2lvbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKFxuICBub2RlOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUsXG4pOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUge1xuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJpZGVudGlmaWVyXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5ub2RlLFxuICAgICAgICBuYW1lOiBub2RlLnF1b3RlZCA/IG5vZGUubmFtZSA6IG5vZGUubmFtZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgfTtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBub2RlO1xuICAgIGNhc2UgXCJjb25jYXRcIjoge1xuICAgICAgY29uc3QgcGFydHMgPSBub2RlLnBhcnRzLmZsYXRNYXAoKHBhcnQpID0+IHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhcnQgPSBub3JtYWxpemVTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUocGFydCk7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkUGFydC50eXBlID09PSBcImNvbmNhdFwiID8gbm9ybWFsaXplZFBhcnQucGFydHMgOiBbbm9ybWFsaXplZFBhcnRdO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4geyB0eXBlOiBcImNvbmNhdFwiLCBwYXJ0cyB9O1xuICAgIH1cbiAgICBjYXNlIFwiY29sbGF0ZVwiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJjb2xsYXRlXCIsXG4gICAgICAgIGV4cHI6IG5vcm1hbGl6ZVNlYXJjaFRleHRFeHByZXNzaW9uTm9kZShub2RlLmV4cHIpLFxuICAgICAgICBjb2xsYXRpb246IG5vZGUuY29sbGF0aW9uLnRvVXBwZXJDYXNlKCkgPT09IFwiQ1wiID8gXCJDXCIgOiBub2RlLmNvbGxhdGlvbixcbiAgICAgICAgcXVvdGVkOiBub2RlLnF1b3RlZCB8fCBub2RlLmNvbGxhdGlvbi50b1VwcGVyQ2FzZSgpID09PSBcIkNcIixcbiAgICAgIH07XG4gICAgY2FzZSBcImNhc3RcIjoge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEV4cHIgPSBub3JtYWxpemVTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUobm9kZS5leHByKTtcbiAgICAgIGNvbnN0IHRhcmdldFR5cGUgPSBub2RlLnRhcmdldFR5cGUucmVwbGFjZSgvXFxzKy9nLCBcIiBcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAodGFyZ2V0VHlwZSA9PT0gXCJ0ZXh0XCIgfHwgdGFyZ2V0VHlwZSA9PT0gXCJjaGFyYWN0ZXIgdmFyeWluZ1wiIHx8IHRhcmdldFR5cGUgPT09IFwidmFyY2hhclwiKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRXhwcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiY2FzdFwiLFxuICAgICAgICBleHByOiBub3JtYWxpemVkRXhwcixcbiAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgXCJmdW5jdGlvblwiOiB7XG4gICAgICBjb25zdCBuYW1lID0gbm9kZS5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBsZXQgYXJncyA9IG5vZGUuYXJncy5tYXAoKGFyZykgPT4gbm9ybWFsaXplU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKGFyZykpO1xuXG4gICAgICBpZiAoKG5hbWUgPT09IFwidHJpbVwiIHx8IG5hbWUgPT09IFwiYnRyaW1cIikgJiYgYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgbmFtZTogXCJ0cmltXCIsXG4gICAgICAgICAgYXJncyxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAobmFtZSA9PT0gXCJzb25hbXVfdGV4dF9hcnJheV9hZ2dcIiB8fCBuYW1lID09PSBcInNvbmFtdV9qc29uYl9hcnJheV9hZ2dcIikgJiZcbiAgICAgICAgYXJncy5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgYXJnc1sxXT8udHlwZSA9PT0gXCJib29sZWFuXCIgJiZcbiAgICAgICAgYXJnc1sxXS52YWx1ZVxuICAgICAgKSB7XG4gICAgICAgIGFyZ3MgPSBbYXJnc1swXV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgbmFtZSxcbiAgICAgICAgYXJncyxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlclNlYXJjaFRleHRFeHByZXNzaW9uKG5vZGU6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSwgcGFyZW50UHJlY2VkZW5jZSA9IDApOiBzdHJpbmcge1xuICBjb25zdCBwcmVjZWRlbmNlID0gZ2V0U2VhcmNoVGV4dEV4cHJlc3Npb25QcmVjZWRlbmNlKG5vZGUpO1xuICBjb25zdCByZW5kZXJlZCA9ICgoKSA9PiB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJpZGVudGlmaWVyXCI6XG4gICAgICAgIHJldHVybiBub2RlLnF1b3RlZCA/IGBcIiR7bm9kZS5uYW1lLnJlcGxhY2VBbGwoJ1wiJywgJ1wiXCInKX1cImAgOiBub2RlLm5hbWU7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIHJldHVybiBgJyR7bm9kZS52YWx1ZS5yZXBsYWNlQWxsKFwiJ1wiLCBcIicnXCIpfSdgO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIG5vZGUudmFsdWUgPyBcInRydWVcIiA6IFwiZmFsc2VcIjtcbiAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICByZXR1cm4gYCR7bm9kZS5uYW1lfSgke25vZGUuYXJnc1xuICAgICAgICAgIC5tYXAoKGFyZykgPT4gcmVuZGVyU2VhcmNoVGV4dEV4cHJlc3Npb24oYXJnKSlcbiAgICAgICAgICAuam9pbihcIiwgXCIpfSlgO1xuICAgICAgY2FzZSBcImNvbmNhdFwiOlxuICAgICAgICByZXR1cm4gbm9kZS5wYXJ0cy5tYXAoKHBhcnQpID0+IHJlbmRlclNlYXJjaFRleHRFeHByZXNzaW9uKHBhcnQsIHByZWNlZGVuY2UpKS5qb2luKFwiIHx8IFwiKTtcbiAgICAgIGNhc2UgXCJjb2xsYXRlXCI6IHtcbiAgICAgICAgY29uc3QgY29sbGF0aW9uID0gbm9kZS5xdW90ZWRcbiAgICAgICAgICA/IGBcIiR7bm9kZS5jb2xsYXRpb24ucmVwbGFjZUFsbCgnXCInLCAnXCJcIicpfVwiYFxuICAgICAgICAgIDogbm9kZS5jb2xsYXRpb247XG4gICAgICAgIHJldHVybiBgJHtyZW5kZXJTZWFyY2hUZXh0RXhwcmVzc2lvbihub2RlLmV4cHIsIHByZWNlZGVuY2UpfSBDT0xMQVRFICR7Y29sbGF0aW9ufWA7XG4gICAgICB9XG4gICAgICBjYXNlIFwiY2FzdFwiOlxuICAgICAgICByZXR1cm4gYCR7cmVuZGVyU2VhcmNoVGV4dEV4cHJlc3Npb24obm9kZS5leHByLCBwcmVjZWRlbmNlKX06OiR7bm9kZS50YXJnZXRUeXBlfWA7XG4gICAgfVxuICB9KSgpO1xuXG4gIGlmIChwcmVjZWRlbmNlIDwgcGFyZW50UHJlY2VkZW5jZSkge1xuICAgIHJldHVybiBgKCR7cmVuZGVyZWR9KWA7XG4gIH1cblxuICByZXR1cm4gcmVuZGVyZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFNlYXJjaFRleHRFeHByZXNzaW9uUHJlY2VkZW5jZShub2RlOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUpOiBudW1iZXIge1xuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJjb25jYXRcIjpcbiAgICAgIHJldHVybiAxO1xuICAgIGNhc2UgXCJjb2xsYXRlXCI6XG4gICAgY2FzZSBcImNhc3RcIjpcbiAgICAgIHJldHVybiAyO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gMztcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTZWFyY2hUZXh0RXhwcmVzc2lvbkZhbGxiYWNrKGV4cHJlc3Npb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBleHByZXNzaW9uXG4gICAgLnJlcGxhY2UoL1xccysvZywgXCIgXCIpXG4gICAgLnJlcGxhY2UoL1xcYlRSSU1cXHMqXFwoXFxzKkJPVEhcXHMrRlJPTVxccysvZ2ksIFwidHJpbShcIilcbiAgICAucmVwbGFjZSgvOjooPzp0ZXh0fGNoYXJhY3RlciB2YXJ5aW5nfHZhcmNoYXIpXFxiL2dpLCBcIlwiKVxuICAgIC5yZXBsYWNlKC8sXFxzKnRydWVcXGIvZ2ksIFwiXCIpXG4gICAgLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gdmlzaXRTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUoXG4gIG5vZGU6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSxcbiAgdmlzaXRvcjogKG5vZGU6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSkgPT4gdm9pZCxcbik6IHZvaWQge1xuICB2aXNpdG9yKG5vZGUpO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcImNvbmNhdFwiOlxuICAgICAgbm9kZS5wYXJ0cy5mb3JFYWNoKChwYXJ0KSA9PiB7XG4gICAgICAgIHZpc2l0U2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKHBhcnQsIHZpc2l0b3IpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgY2FzZSBcImNvbGxhdGVcIjpcbiAgICBjYXNlIFwiY2FzdFwiOlxuICAgICAgdmlzaXRTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUobm9kZS5leHByLCB2aXNpdG9yKTtcbiAgICAgIHJldHVybjtcbiAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgIG5vZGUuYXJncy5mb3JFYWNoKChhcmcpID0+IHtcbiAgICAgICAgdmlzaXRTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUoYXJnLCB2aXNpdG9yKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIGNhc2UgXCJpZGVudGlmaWVyXCI6XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U2VhcmNoVGV4dEhlbHBlcktpbmRzRnJvbUV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogU2V0PFNlYXJjaFRleHRIZWxwZXJLaW5kPiB7XG4gIGNvbnN0IGhlbHBlcktpbmRzID0gbmV3IFNldDxTZWFyY2hUZXh0SGVscGVyS2luZD4oKTtcbiAgY29uc3QgYWRkSGVscGVyS2luZEZyb21OYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChub3JtYWxpemVkTmFtZSA9PT0gXCJzb25hbXVfdGV4dF9hcnJheV9hZ2dcIikge1xuICAgICAgaGVscGVyS2luZHMuYWRkKFwidGV4dC1hcnJheVwiKTtcbiAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWROYW1lID09PSBcInNvbmFtdV9qc29uYl9hcnJheV9hZ2dcIikge1xuICAgICAgaGVscGVyS2luZHMuYWRkKFwianNvbmItYXJyYXlcIik7XG4gICAgfVxuICB9O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFNlYXJjaFRleHRFeHByZXNzaW9uUGFyc2VyKHRva2VuaXplU2VhcmNoVGV4dEV4cHJlc3Npb24oZXhwcmVzc2lvbikpO1xuICAgIGNvbnN0IHBhcnNlZEV4cHJlc3Npb24gPSBwYXJzZXIucGFyc2VFeHByZXNzaW9uKCk7XG5cbiAgICBpZiAoIXBhcnNlci5pc0F0RW5kKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNlYXJjaFRleHQgaGVscGVyIGV4cHJlc3Npb24g7YyM7Iux7J20IOuBneuCmOyngCDslYrslZjsirXri4jri6QuXCIpO1xuICAgIH1cblxuICAgIHZpc2l0U2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKHBhcnNlZEV4cHJlc3Npb24sIChub2RlKSA9PiB7XG4gICAgICBpZiAobm9kZS50eXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgYWRkSGVscGVyS2luZEZyb21OYW1lKG5vZGUubmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIGlmICgvXFxic29uYW11X3RleHRfYXJyYXlfYWdnXFxzKlxcKC9pLnRlc3QoZXhwcmVzc2lvbikpIHtcbiAgICAgIGhlbHBlcktpbmRzLmFkZChcInRleHQtYXJyYXlcIik7XG4gICAgfVxuICAgIGlmICgvXFxic29uYW11X2pzb25iX2FycmF5X2FnZ1xccypcXCgvaS50ZXN0KGV4cHJlc3Npb24pKSB7XG4gICAgICBoZWxwZXJLaW5kcy5hZGQoXCJqc29uYi1hcnJheVwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaGVscGVyS2luZHM7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTZWFyY2hUZXh0Q29sdW1ucyh0YWJsZTogc3RyaW5nLCBjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSk6IE1pZ3JhdGlvbkNvbHVtbltdIHtcbiAgY29uc3QgZW50aXR5ID0gKCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEVudGl0eU1hbmFnZXIuZ2V0QnlUYWJsZSh0YWJsZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0pKCk7XG5cbiAgaWYgKCFlbnRpdHkpIHtcbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIGNvbnN0IHByb3BzQnlOYW1lID0gbmV3IE1hcChlbnRpdHkucHJvcHMubWFwKChwcm9wKSA9PiBbcHJvcC5uYW1lLCBwcm9wXSkpO1xuXG4gIHJldHVybiBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgY29uc3QgcHJvcCA9IHByb3BzQnlOYW1lLmdldChjb2x1bW4ubmFtZSk7XG4gICAgaWYgKCFwcm9wIHx8ICFpc1NlYXJjaFRleHRQcm9wKHByb3ApKSB7XG4gICAgICByZXR1cm4gY29sdW1uO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb2x1bW4sXG4gICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgdHlwZTogXCJTVE9SRURcIixcbiAgICAgICAgZXhwcmVzc2lvbjogYnVpbGRTZWFyY2hUZXh0R2VuZXJhdGVkRXhwcmVzc2lvbihwcm9wLCBwcm9wc0J5TmFtZSksXG4gICAgICB9LFxuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZFNlYXJjaFRleHRHZW5lcmF0ZWRFeHByZXNzaW9uKFxuICBwcm9wOiBFeHRyYWN0PEVudGl0eVByb3AsIHsgdHlwZTogXCJzZWFyY2hUZXh0XCIgfT4sXG4gIHByb3BzQnlOYW1lOiBNYXA8c3RyaW5nLCBFbnRpdHlQcm9wPixcbik6IHN0cmluZyB7XG4gIGNvbnN0IHRva2VucyA9IHByb3Auc291cmNlQ29sdW1ucy5tYXAoKHNvdXJjZSkgPT4ge1xuICAgIGNvbnN0IHNvdXJjZVByb3AgPSBwcm9wc0J5TmFtZS5nZXQoc291cmNlLm5hbWUpO1xuICAgIGlmICghc291cmNlUHJvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZWFyY2hUZXh0IHNvdXJjZSBjb2x1bW4gXCIke3NvdXJjZS5uYW1lfVwi7J2EKOulvCkg7LC+7J2EIOyImCDsl4bsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZVByb3AudHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHNvdXJjZS5jYXNlSW5zZW5zaXRpdmVcbiAgICAgICAgPyBgbG93ZXIoQ09BTEVTQ0UoJHtzb3VyY2UubmFtZX0sICcnKSlgXG4gICAgICAgIDogYENPQUxFU0NFKCR7c291cmNlLm5hbWV9LCAnJylgO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2VQcm9wLnR5cGUgPT09IFwic3RyaW5nW11cIikge1xuICAgICAgcmV0dXJuIHNvdXJjZS5jYXNlSW5zZW5zaXRpdmVcbiAgICAgICAgPyBgQ09BTEVTQ0Uoc29uYW11X3RleHRfYXJyYXlfYWdnKCR7c291cmNlLm5hbWV9KSwgJycpYFxuICAgICAgICA6IGBDT0FMRVNDRShzb25hbXVfdGV4dF9hcnJheV9hZ2coJHtzb3VyY2UubmFtZX0sIGZhbHNlKSwgJycpYDtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlUHJvcC50eXBlID09PSBcImpzb25cIikge1xuICAgICAgcmV0dXJuIHNvdXJjZS5jYXNlSW5zZW5zaXRpdmVcbiAgICAgICAgPyBgQ09BTEVTQ0Uoc29uYW11X2pzb25iX2FycmF5X2FnZygke3NvdXJjZS5uYW1lfSksICcnKWBcbiAgICAgICAgOiBgQ09BTEVTQ0Uoc29uYW11X2pzb25iX2FycmF5X2FnZygke3NvdXJjZS5uYW1lfSwgZmFsc2UpLCAnJylgO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBzZWFyY2hUZXh0IHNvdXJjZSBjb2x1bW4gXCIke3NvdXJjZS5uYW1lfVwi7J2YIO2DgOyehSBcIiR7c291cmNlUHJvcC50eXBlfVwi7J2AKOuKlCkg7KeA7JuQ65CY7KeAIOyViuyKteuLiOuLpC5gLFxuICAgICk7XG4gIH0pO1xuXG4gIHJldHVybiBgdHJpbSgke3Rva2Vucy5qb2luKGAgfHwgJyAnIHx8IGApfSlgO1xufVxuXG5mdW5jdGlvbiBnZXRTZWFyY2hUZXh0SGVscGVyRGVmaW5pdGlvbnModGFibGU6IHN0cmluZywgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGhlbHBlcktpbmRzID0gbmV3IFNldDxTZWFyY2hUZXh0SGVscGVyS2luZD4oKTtcblxuICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgIGlmICghY29sdW1uLmdlbmVyYXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGdldFNlYXJjaFRleHRIZWxwZXJLaW5kc0Zyb21FeHByZXNzaW9uKGNvbHVtbi5nZW5lcmF0ZWQuZXhwcmVzc2lvbikuZm9yRWFjaCgoa2luZCkgPT4ge1xuICAgICAgaGVscGVyS2luZHMuYWRkKGtpbmQpO1xuICAgIH0pO1xuICB9KTtcblxuICBpZiAoaGVscGVyS2luZHMuc2l6ZSA+IDApIHtcbiAgICByZXR1cm4gKFtcInRleHQtYXJyYXlcIiwgXCJqc29uYi1hcnJheVwiXSBhcyBjb25zdClcbiAgICAgIC5maWx0ZXIoKGtpbmQpID0+IGhlbHBlcktpbmRzLmhhcyhraW5kKSlcbiAgICAgIC5tYXAoKGtpbmQpID0+IFNFQVJDSF9URVhUX0hFTFBFUl9ERUZJTklUSU9OU1traW5kXSk7XG4gIH1cblxuICBjb25zdCBlbnRpdHkgPSAoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRCeVRhYmxlKHRhYmxlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSkoKTtcblxuICBpZiAoIWVudGl0eSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBwcm9wc0J5TmFtZSA9IG5ldyBNYXAoZW50aXR5LnByb3BzLm1hcCgocHJvcCkgPT4gW3Byb3AubmFtZSwgcHJvcF0pKTtcblxuICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgIGNvbnN0IHByb3AgPSBwcm9wc0J5TmFtZS5nZXQoY29sdW1uLm5hbWUpO1xuICAgIGlmICghcHJvcCB8fCAhaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHByb3Auc291cmNlQ29sdW1ucy5mb3JFYWNoKChzb3VyY2UpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZVByb3AgPSBwcm9wc0J5TmFtZS5nZXQoc291cmNlLm5hbWUpO1xuICAgICAgaWYgKHNvdXJjZVByb3A/LnR5cGUgPT09IFwic3RyaW5nW11cIikge1xuICAgICAgICBoZWxwZXJLaW5kcy5hZGQoXCJ0ZXh0LWFycmF5XCIpO1xuICAgICAgfSBlbHNlIGlmIChzb3VyY2VQcm9wPy50eXBlID09PSBcImpzb25cIikge1xuICAgICAgICBoZWxwZXJLaW5kcy5hZGQoXCJqc29uYi1hcnJheVwiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIChbXCJ0ZXh0LWFycmF5XCIsIFwianNvbmItYXJyYXlcIl0gYXMgY29uc3QpXG4gICAgLmZpbHRlcigoa2luZCkgPT4gaGVscGVyS2luZHMuaGFzKGtpbmQpKVxuICAgIC5tYXAoKGtpbmQpID0+IFNFQVJDSF9URVhUX0hFTFBFUl9ERUZJTklUSU9OU1traW5kXSk7XG59XG5cbmZ1bmN0aW9uIGdldFNlYXJjaFRleHRDb2x1bW5OYW1lcyh0YWJsZTogc3RyaW5nKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCBlbnRpdHkgPSAoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRCeVRhYmxlKHRhYmxlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSkoKTtcblxuICBpZiAoIWVudGl0eSkge1xuICAgIHJldHVybiBuZXcgU2V0KCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFNldChlbnRpdHkucHJvcHMuZmlsdGVyKGlzU2VhcmNoVGV4dFByb3ApLm1hcCgocHJvcCkgPT4gcHJvcC5uYW1lKSk7XG59XG5cbi8qKlxuICog7YWM7J2067iUIOyDneyEse2VmOuKlCDsvIDsnbTsiqQgLSDsu6zrn7wv7J24642x7IqkIOyDneyEsVxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNyZWF0ZUNvZGVfQ29sdW1uQW5kSW5kZXhlcyhcbiAgdGFibGU6IHN0cmluZyxcbiAgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gIGluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10sXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGU+IHtcbiAgY29uc3QgcmVzb2x2ZWRDb2x1bW5zID0gcmVzb2x2ZVNlYXJjaFRleHRDb2x1bW5zKHRhYmxlLCBjb2x1bW5zKTtcbiAgY29uc3QgY29sdW1uRGVmcyA9IGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCByZXNvbHZlZENvbHVtbnMpO1xuICBjb25zdCBoZWxwZXJEZWZpbml0aW9ucyA9IGdldFNlYXJjaFRleHRIZWxwZXJEZWZpbml0aW9ucyh0YWJsZSwgcmVzb2x2ZWRDb2x1bW5zKTtcblxuICAvLyDsu6zrn7wsIOyduOuNseyKpCDsspjrpqxcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICdpbXBvcnQgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjsnLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIC4uLmhlbHBlckRlZmluaXRpb25zLFxuICAgIGBhd2FpdCBrbmV4LnNjaGVtYS5jcmVhdGVUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsXG4gICAgLi4uY29sdW1uRGVmcy5idWlsZGVyLFxuICAgIFwifSk7XCIsXG4gICAgLy8gcmF3IOq1rOusuCAoR2VuZXJhdGVkIENvbHVtbiDrk7EpXG4gICAgLi4uY29sdW1uRGVmcy5yYXcsXG4gICAgLy8gaW5kZXjripQga25leC5yYXfroZwg7LKY66as7ZWY66+A66GcIGNyZWF0ZVRhYmxlIOuwluyXkOyEnCDsi6TtlolcbiAgICAuLi5pbmRleGVzLm1hcCgoaW5kZXgpID0+IGdlbkluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpKSxcbiAgICBcIn1cIixcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd24oa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGAgcmV0dXJuIGtuZXguc2NoZW1hLmRyb3BUYWJsZShcIiR7dGFibGV9XCIpO2AsXG4gICAgXCJ9XCIsXG4gIF07XG4gIHJldHVybiB7XG4gICAgdGFibGUsXG4gICAgdHlwZTogXCJub3JtYWxcIixcbiAgICB0aXRsZTogYGNyZWF0ZV9fJHt0YWJsZX1gLFxuICAgIGZvcm1hdHRlZDogYXdhaXQgZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBgc3JjL21pZ3JhdGlvbi8ke3RhYmxlfS50c2ApLFxuICB9O1xufVxuXG4vKipcbiAqIE1pZ3JhdGlvbkNvbHVtbltdIOydveyWtOyEnCDsu6zrn7wg7KCV7J2Y7ZWY64qUIOq1rOusuCDsg53shLFcbiAqIEByZXR1cm5zIGJ1aWxkZXI6IHRhYmxlIGJ1aWxkZXIg66mU7ISc65OcLCByYXc6IGtuZXgucmF3KCkg6rWs66y4XG4gKi9cbmZ1bmN0aW9uIGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlOiBzdHJpbmcsIGNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdKTogQ29sdW1uRGVmaW5pdGlvblJlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdDogQ29sdW1uRGVmaW5pdGlvblJlc3VsdCA9IHtcbiAgICBidWlsZGVyOiBbXSxcbiAgICByYXc6IFtdLFxuICB9O1xuXG4gIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAvLyBHZW5lcmF0ZWQgQ29sdW1u7J2AIHJhd+uhnCDsspjrpqxcbiAgICBpZiAoY29sdW1uLmdlbmVyYXRlZCkge1xuICAgICAgcmVzdWx0LnJhdy5wdXNoKGdlbkdlbmVyYXRlZENvbHVtbkRlZmluaXRpb24odGFibGUsIGNvbHVtbikpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8g7J2867CYIOy7rOufvOydgCBidWlsZGVy66GcIOyymOumrFxuICAgIHJlc3VsdC5idWlsZGVyLnB1c2goZ2VuTm9ybWFsQ29sdW1uRGVmaW5pdGlvbihjb2x1bW4pKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogR2VuZXJhdGVkIENvbHVtbiDsoJXsnZgg7IOd7ISxIChBTFRFUiBUQUJMRSBBREQgQ09MVU1OIOyCrOyaqSlcbiAqL1xuZnVuY3Rpb24gZ2VuR2VuZXJhdGVkQ29sdW1uRGVmaW5pdGlvbih0YWJsZTogc3RyaW5nLCBjb2x1bW46IE1pZ3JhdGlvbkNvbHVtbik6IHN0cmluZyB7XG4gIGlmICghY29sdW1uLmdlbmVyYXRlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRlZCBjb2x1bW4gZGVmaW5pdGlvbiByZXF1aXJlZFwiKTtcbiAgfVxuICBjb25zdCBwZ1R5cGUgPSBnZXRQZ1R5cGVGb3JDb2x1bW4oY29sdW1uKTtcbiAgY29uc3Qgc3RvcmFnZVR5cGUgPSBjb2x1bW4uZ2VuZXJhdGVkLnR5cGUgPT09IFwiVklSVFVBTFwiID8gXCIgVklSVFVBTFwiIDogXCIgU1RPUkVEXCI7XG4gIGNvbnN0IG51bGxhYmxlQ2xhdXNlID0gY29sdW1uLm51bGxhYmxlID8gXCJcIiA6IFwiIE5PVCBOVUxMXCI7XG4gIHJldHVybiBgYXdhaXQga25leC5yYXcoXFxgQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIEFERCBDT0xVTU4gXCIke2NvbHVtbi5uYW1lfVwiICR7cGdUeXBlfSBHRU5FUkFURUQgQUxXQVlTIEFTICgke2NvbHVtbi5nZW5lcmF0ZWQuZXhwcmVzc2lvbn0pJHtzdG9yYWdlVHlwZX0ke251bGxhYmxlQ2xhdXNlfVxcYCk7YDtcbn1cblxuLyoqXG4gKiDsnbzrsJgg7Lus65+8IOygleydmCDsg53shLEgKHRhYmxlLnh4eCgpIOyytOyduClcbiAqL1xuZnVuY3Rpb24gZ2VuTm9ybWFsQ29sdW1uRGVmaW5pdGlvbihjb2x1bW46IE1pZ3JhdGlvbkNvbHVtbik6IHN0cmluZyB7XG4gIGNvbnN0IGNoYWluczogc3RyaW5nW10gPSBbXTtcblxuICBpZiAoY29sdW1uLm5hbWUgPT09IFwiaWRcIikge1xuICAgIC8vIFBLIO2DgOyeheyXkCDrlLDrpbgg67aE6riwIOyymOumrFxuICAgIGlmIChjb2x1bW4udHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgLy8gc3RyaW5nIFBLOiBsZW5ndGjqsIAg7J6I7Jy866m0IHZhcmNoYXIsIOyXhuycvOuptCB0ZXh0XG4gICAgICBpZiAoY29sdW1uLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBgdGFibGUuc3RyaW5nKCdpZCcsICR7Y29sdW1uLmxlbmd0aH0pLnByaW1hcnkoKS5ub3ROdWxsYWJsZSgpO2A7XG4gICAgICB9XG4gICAgICByZXR1cm4gYHRhYmxlLnRleHQoJ2lkJykucHJpbWFyeSgpLm5vdE51bGxhYmxlKCk7YDtcbiAgICB9XG4gICAgaWYgKGNvbHVtbi50eXBlID09PSBcInV1aWRcIikge1xuICAgICAgcmV0dXJuIGB0YWJsZS51dWlkKCdpZCcpLnByaW1hcnkoKS5ub3ROdWxsYWJsZSgpO2A7XG4gICAgfVxuICAgIC8vIOq4sOyhtCBpbnRlZ2VyIFBLICjquLDrs7jqsJIpXG4gICAgcmV0dXJuIGB0YWJsZS5pbmNyZW1lbnRzKCkucHJpbWFyeSgpO2A7XG4gIH1cblxuICAvLyDrsLDsl7Qg7YOA7J6FIOyymOumrFxuICBpZiAoY29sdW1uLnR5cGUuZW5kc1dpdGgoXCJbXVwiKSkge1xuICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gY29sdW1uLnR5cGUuc2xpY2UoMCwgLTIpOyAvLyBcImludGVnZXJbXVwiIC0+IFwiaW50ZWdlclwiXG4gICAgY29uc3QgcGdUeXBlID0gZ2V0UGdBcnJheVR5cGUoY29sdW1uLCBlbGVtZW50VHlwZSk7XG4gICAgY2hhaW5zLnB1c2goYHNwZWNpZmljVHlwZSgnJHtjb2x1bW4ubmFtZX0nLCAnJHtwZ1R5cGV9JylgKTtcbiAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJ2ZWN0b3JcIikge1xuICAgIC8vIEtuZXjripQgdmVjdG9yIO2DgOyeheydhCDsp4HsoJEg7KeA7JuQ7ZWY7KeAIOyViuycvOuvgOuhnCBzcGVjaWZpY1R5cGUg7IKs7JqpXG4gICAgY2hhaW5zLnB1c2goYHNwZWNpZmljVHlwZSgnJHtjb2x1bW4ubmFtZX0nLCAndmVjdG9yKCR7Y29sdW1uLmRpbWVuc2lvbnN9KScpYCk7XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwibnVtYmVyT3JOdW1lcmljXCIpIHtcbiAgICAvLyBudW1iZXJcbiAgICBpZiAoY29sdW1uLm51bWJlclR5cGUgPT09IFwicmVhbFwiKSB7XG4gICAgICBjaGFpbnMucHVzaChgZmxvYXQoJyR7Y29sdW1uLm5hbWV9JylgKTtcbiAgICB9IGVsc2UgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcImRvdWJsZSBwcmVjaXNpb25cIikge1xuICAgICAgY2hhaW5zLnB1c2goYGRvdWJsZSgnJHtjb2x1bW4ubmFtZX0nKWApO1xuICAgIH0gZWxzZSBpZiAoKGNvbHVtbi5udW1iZXJUeXBlID8/IFwibnVtZXJpY1wiKSA9PT0gXCJudW1lcmljXCIpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBkZWNpbWFsKCcke2NvbHVtbi5uYW1lfScsICR7Y29sdW1uLnByZWNpc2lvbn0sICR7Y29sdW1uLnNjYWxlfSlgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAvLyBzdHJpbmdcbiAgICBpZiAoY29sdW1uLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjaGFpbnMucHVzaChgc3RyaW5nKCcke2NvbHVtbi5uYW1lfScsICR7Y29sdW1uLmxlbmd0aH0pYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYWlucy5wdXNoKGB0ZXh0KCcke2NvbHVtbi5uYW1lfScpYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcImRhdGVcIikge1xuICAgIC8vIGRhdGVcbiAgICBjaGFpbnMucHVzaChcbiAgICAgIGB0aW1lc3RhbXAoJyR7Y29sdW1uLm5hbWV9JywgeyB1c2VUejogdHJ1ZSwgcHJlY2lzaW9uOiAke2NvbHVtbi5wcmVjaXNpb24gPz8gM30gfSlgLFxuICAgICk7XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwianNvblwiKSB7XG4gICAgLy8ganNvblxuICAgIGNoYWlucy5wdXNoKGBqc29uYignJHtjb2x1bW4ubmFtZX0nKWApO1xuICB9IGVsc2Uge1xuICAgIC8vIHR5cGUsIGxlbmd0aFxuICAgIGNoYWlucy5wdXNoKGAke2NvbHVtbi50eXBlfSgnJHtjb2x1bW4ubmFtZX0nJHtjb2x1bW4ubGVuZ3RoID8gYCwgJHtjb2x1bW4ubGVuZ3RofWAgOiBcIlwifSlgKTtcbiAgfVxuXG4gIC8vIG51bGxhYmxlXG4gIGNoYWlucy5wdXNoKGNvbHVtbi5udWxsYWJsZSA/IFwibnVsbGFibGUoKVwiIDogXCJub3ROdWxsYWJsZSgpXCIpO1xuXG4gIC8vIGRlZmF1bHRUb1xuICBpZiAoY29sdW1uLmRlZmF1bHRUbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW4uZGVmYXVsdFRvID09PSBcInN0cmluZ1wiICYmIGNvbHVtbi5kZWZhdWx0VG8uc3RhcnRzV2l0aChgXCJgKSkge1xuICAgICAgY2hhaW5zLnB1c2goYGRlZmF1bHRUbygke2NvbHVtbi5kZWZhdWx0VG99KWApO1xuICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwianNvblwiICYmIHR5cGVvZiBjb2x1bW4uZGVmYXVsdFRvLnN0YXJ0c1dpdGgoJ1wiJykpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBkZWZhdWx0VG8oa25leC5yYXcoXCIke2NvbHVtbi5kZWZhdWx0VG8ucmVwbGFjZUFsbCgnXCInLCBcIidcIil9Ojpqc29uYlwiKSlgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hhaW5zLnB1c2goYGRlZmF1bHRUbyhrbmV4LnJhdygnJHtjb2x1bW4uZGVmYXVsdFRvfScpKWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBgdGFibGUuJHtjaGFpbnMuam9pbihcIi5cIil9O2A7XG59XG5cbi8qKlxuICogTWlncmF0aW9uQ29sdW1u7J2YIO2DgOyeheydhCBQb3N0Z3JlU1FMIO2DgOyehSDrrLjsnpDsl7TroZwg67OA7ZmYXG4gKi9cbmZ1bmN0aW9uIGdldFBnVHlwZUZvckNvbHVtbihjb2x1bW46IE1pZ3JhdGlvbkNvbHVtbik6IHN0cmluZyB7XG4gIGlmIChjb2x1bW4udHlwZS5lbmRzV2l0aChcIltdXCIpKSB7XG4gICAgY29uc3QgZWxlbWVudFR5cGUgPSBjb2x1bW4udHlwZS5zbGljZSgwLCAtMik7XG4gICAgcmV0dXJuIGdldFBnQXJyYXlUeXBlKGNvbHVtbiwgZWxlbWVudFR5cGUpO1xuICB9XG5cbiAgc3dpdGNoIChjb2x1bW4udHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBjb2x1bW4ubGVuZ3RoICE9PSB1bmRlZmluZWQgPyBgdmFyY2hhcigke2NvbHVtbi5sZW5ndGh9KWAgOiBcInRleHRcIjtcbiAgICBjYXNlIFwiYmlnSW50ZWdlclwiOlxuICAgICAgcmV0dXJuIFwiYmlnaW50XCI7XG4gICAgY2FzZSBcIm51bWJlck9yTnVtZXJpY1wiOlxuICAgICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcInJlYWxcIikgcmV0dXJuIFwicmVhbFwiO1xuICAgICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcImRvdWJsZSBwcmVjaXNpb25cIikgcmV0dXJuIFwiZG91YmxlIHByZWNpc2lvblwiO1xuICAgICAgcmV0dXJuIGBudW1lcmljKCR7Y29sdW1uLnByZWNpc2lvbn0sICR7Y29sdW1uLnNjYWxlfSlgO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJ0aW1lc3RhbXB0elwiO1xuICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICByZXR1cm4gXCJqc29uYlwiO1xuICAgIGNhc2UgXCJ2ZWN0b3JcIjpcbiAgICAgIHJldHVybiBgdmVjdG9yKCR7Y29sdW1uLmRpbWVuc2lvbnN9KWA7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBjb2x1bW4udHlwZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQZ0FycmF5VHlwZShjb2x1bW46IE1pZ3JhdGlvbkNvbHVtbiwgZWxlbWVudFR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJudW1iZXJPck51bWVyaWNcIikge1xuICAgIGlmIChjb2x1bW4ubnVtYmVyVHlwZSA9PT0gXCJyZWFsXCIpIHJldHVybiBcInJlYWxbXVwiO1xuICAgIGlmIChjb2x1bW4ubnVtYmVyVHlwZSA9PT0gXCJkb3VibGUgcHJlY2lzaW9uXCIpIHJldHVybiBcImRvdWJsZSBwcmVjaXNpb25bXVwiO1xuICAgIHJldHVybiBgbnVtZXJpYygke2NvbHVtbi5wcmVjaXNpb259LCAke2NvbHVtbi5zY2FsZX0pW11gO1xuICB9XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBjb2x1bW4ubGVuZ3RoID8gYHZhcmNoYXIoJHtjb2x1bW4ubGVuZ3RofSlbXWAgOiBcInRleHRbXVwiO1xuICB9XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJkYXRlXCIpIHJldHVybiBcInRpbWVzdGFtcHR6W11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImludGVnZXJcIikgcmV0dXJuIFwiaW50ZWdlcltdXCI7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIpIHJldHVybiBcImJpZ2ludFtdXCI7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiBcImJvb2xlYW5bXVwiO1xuICBpZiAoZWxlbWVudFR5cGUgPT09IFwidXVpZFwiKSByZXR1cm4gXCJ1dWlkW11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImVudW1cIikgcmV0dXJuIFwidGV4dFtdXCI7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJ2ZWN0b3JcIikgcmV0dXJuIGB2ZWN0b3IoJHtjb2x1bW4uZGltZW5zaW9uc30pW11gO1xuXG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhcnJheSBlbGVtZW50IHR5cGU6ICR7ZWxlbWVudFR5cGV9YCk7XG59XG5cbi8qKlxuICog6rCc67OEIOyduOuNseyKpCDsoJXsnZgg7IOd7ISxXG4gKi9cbmZ1bmN0aW9uIGdlbkluZGV4RGVmaW5pdGlvbihpbmRleDogTWlncmF0aW9uSW5kZXgsIHRhYmxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoaW5kZXgudHlwZSA9PT0gXCJobnN3XCIgfHwgaW5kZXgudHlwZSA9PT0gXCJpdmZmbGF0XCIpIHtcbiAgICByZXR1cm4gZ2VuVmVjdG9ySW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSk7XG4gIH1cblxuICBpZiAoaW5kZXgudXNpbmcgPT09IFwicGdyb29uZ2FcIikge1xuICAgIHJldHVybiBnZW5QZ3Jvb25nYUluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpO1xuICB9XG5cbiAgY29uc3QgbWV0aG9kTWFwID0ge1xuICAgIGluZGV4OiBcIklOREVYXCIsXG4gICAgdW5pcXVlOiBcIlVOSVFVRSBJTkRFWFwiLFxuICB9O1xuXG4gIGNvbnN0IG51bGxzTm90RGlzdGluY3RDbGF1c2UgPVxuICAgIGluZGV4LnR5cGUgPT09IFwidW5pcXVlXCIgJiYgaW5kZXgubnVsbHNOb3REaXN0aW5jdCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGAgTlVMTFMgJHtpbmRleC5udWxsc05vdERpc3RpbmN0ID8gXCJOT1QgRElTVElOQ1RcIiA6IFwiRElTVElOQ1RcIn1gXG4gICAgICA6IFwiXCI7XG5cbiAgY29uc3QgdXNpbmdDbGF1c2UgPSBpbmRleC51c2luZyA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGBVU0lORyAke2luZGV4LnVzaW5nfWA7XG4gIGNvbnN0IHdoZXJlQ2xhdXNlID0gZ2V0SW5kZXhXaGVyZUNsYXVzZShpbmRleCk7XG5cbiAgcmV0dXJuIGBhd2FpdCBrbmV4LnJhdyhcbiAgXFxgQ1JFQVRFICR7bWV0aG9kTWFwW2luZGV4LnR5cGVdfSAke2luZGV4Lm5hbWV9IE9OICR7dGFibGV9ICR7dXNpbmdDbGF1c2V9KCR7aW5kZXguY29sdW1uc1xuICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgY29uc3Qgb3BjbGFzc0NsYXVzZSA9ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wY2xhc3MgPSBnZXRJbmRleENvbHVtbk9wY2xhc3MoY29sKTtcbiAgICAgICAgcmV0dXJuIG9wY2xhc3MgPyBgICR7b3BjbGFzc31gIDogXCJcIjtcbiAgICAgIH0pKCk7XG5cbiAgICAgIC8vIOygleugrCDsmLXshZjsnYAgYnRyZWXrp4wg7IKs7JqpIOqwgOuKpVxuICAgICAgaWYgKGluZGV4LnVzaW5nICE9PSBcImJ0cmVlXCIgJiYgaW5kZXgudXNpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYCR7Y29sLm5hbWV9JHtvcGNsYXNzQ2xhdXNlfWA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNvcnRPcmRlckNsYXVzZSA9IGNvbC5zb3J0T3JkZXIgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBgICR7Y29sLnNvcnRPcmRlcn1gO1xuICAgICAgY29uc3QgbnVsbHNGaXJzdENsYXVzZSA9XG4gICAgICAgIGNvbC5udWxsc0ZpcnN0ID09PSB1bmRlZmluZWQgPyBcIlwiIDogYCBOVUxMUyAke2NvbC5udWxsc0ZpcnN0ID8gXCJGSVJTVFwiIDogXCJMQVNUXCJ9YDtcbiAgICAgIHJldHVybiBgJHtjb2wubmFtZX0ke29wY2xhc3NDbGF1c2V9JHtzb3J0T3JkZXJDbGF1c2V9JHtudWxsc0ZpcnN0Q2xhdXNlfWA7XG4gICAgfSlcbiAgICAuam9pbihcIiwgXCIpfSkke251bGxzTm90RGlzdGluY3RDbGF1c2V9JHt3aGVyZUNsYXVzZX07XFxgXG4gICk7YDtcbn1cblxuZnVuY3Rpb24gZ2VuUGdyb29uZ2FJbmRleERlZmluaXRpb24oaW5kZXg6IE1pZ3JhdGlvbkluZGV4LCB0YWJsZTogc3RyaW5nKSB7XG4gIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0QnlUYWJsZSh0YWJsZSk7XG4gIGNvbnN0IHdoZXJlQ2xhdXNlID0gZ2V0SW5kZXhXaGVyZUNsYXVzZShpbmRleCk7XG5cbiAgLy8g67O17ZWpIOyduOuNseyKpOyduCDqsr3smrAgQVJSQVkg7IKs7JqpXG4gIGNvbnN0IGNvbHVtbkNsYXVzZSA9ICgoKSA9PiB7XG4gICAgaWYgKGluZGV4LmNvbHVtbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBjb2x1bW4gPSBlbnRpdHkucHJvcHNEaWN0W2luZGV4LmNvbHVtbnNbMF0ubmFtZV07XG4gICAgICBjb25zdCBvcHRpb24gPSBnZXRQZ3Jvb25nYUNvbHVtbk9wdGlvbihjb2x1bW4pO1xuICAgICAgcmV0dXJuIGAke2luZGV4LmNvbHVtbnNbMF0ubmFtZX0ke29wdGlvbiA/IGAgJHtvcHRpb259YCA6IFwiXCJ9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYChBUlJBWVske2luZGV4LmNvbHVtbnMubWFwKChjb2wpID0+IGAke2NvbC5uYW1lfTo6dGV4dGApLmpvaW4oXCIsXCIpfV0pYDtcbiAgfSkoKTtcblxuICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxuICBcXGBDUkVBVEUgSU5ERVggJHtpbmRleC5uYW1lfSBPTiAke3RhYmxlfSBVU0lORyBwZ3Jvb25nYSAoJHtjb2x1bW5DbGF1c2V9KSBXSVRIICh0b2tlbml6ZXI9J1Rva2VuTWVjYWInKSR7d2hlcmVDbGF1c2V9O1xcYFxuICApYDtcbn1cblxuLyoqXG4gKiBQR3Jvb25nYSDsu6zrn7wg7Ji17IWYIOy2lOy2nFxuICpcbiAqIEZ1bGxUZXh0IOyYpO2NvOugiOydtO2EsOulvCDsp4Dsm5DtlZjripQg6rK97JqwIOyasOyEoCDshKTsoJUsIOuCmOuouOyngOuKlCDrlJTtj7Ttirgg7J207JqpXG4gKiBAbGluayBodHRwczovL3Bncm9vbmdhLmdpdGh1Yi5pby9yZWZlcmVuY2VcbiAqL1xuZnVuY3Rpb24gZ2V0UGdyb29uZ2FDb2x1bW5PcHRpb24oY29sdW1uOiBFbnRpdHlQcm9wKSB7XG4gIGlmIChjb2x1bW4udHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBjb2x1bW4ubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gXCJwZ3Jvb25nYV92YXJjaGFyX2Z1bGxfdGV4dF9zZWFyY2hfb3BzX3YyXCI7XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwianNvblwiKSB7XG4gICAgcmV0dXJuIFwicGdyb29uZ2FfanNvbmJfZnVsbF90ZXh0X3NlYXJjaF9vcHNfdjJcIjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIC0gSE5TVyAoSGllcmFyY2hpY2FsIE5hdmlnYWJsZSBTbWFsbCBXb3JsZCk6IOuKkOumsCDruYzrk5wsIOu5oOuluCDqsoDsg4kg7IaN64+ELCDrhpLsnYAg66mU66qo66asIOuwjyDsoJXtmZXrj4RcbiAqIC0gSVZGRmxhdCAoSW52ZXJ0ZWQgRmlsZSB3aXRoIEZsYXQgQ29tcHJlc3Npb24pOiDruaDrpbgg67mM65OcLCDspJHqsIQg6rKA7IOJIOyGjeuPhCwg64Ku7J2AIOuplOuqqOumrFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBITlNXIOyduOuNseyKpCAo6raM7J6lIC0g67mg66W4IOqygOyDiSwg64aS7J2AIOygle2ZleuPhClcbiAqIENSRUFURSBJTkRFWCBpZHhfZW1iZWRkaW5nIE9OIGl0ZW1zIFVTSU5HIGhuc3cgKGVtYmVkZGluZyB2ZWN0b3JfY29zaW5lX29wcykgV0lUSCAobSA9IDE2LCBlZl9jb25zdHJ1Y3Rpb24gPSA2NCk7XG4gKlxuICogLy8gSVZGRmxhdCDsnbjrjbHsiqQgKOuMgOyaqeufiSDrjbDsnbTthLAsIOu5hOyaqSDspJHsmpQg7IucKVxuICogQ1JFQVRFIElOREVYIGlkeF9lbWJlZGRpbmcgT04gaXRlbXMgVVNJTkcgaXZmZmxhdCAoZW1iZWRkaW5nIHZlY3Rvcl9jb3NpbmVfb3BzKSBXSVRIIChsaXN0cyA9IDEwMCk7XG4gKi9cbmZ1bmN0aW9uIGdlblZlY3RvckluZGV4RGVmaW5pdGlvbihpbmRleDogTWlncmF0aW9uSW5kZXgsIHRhYmxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjb2x1bW4gPSBpbmRleC5jb2x1bW5zWzBdO1xuICBjb25zdCB2ZWN0b3JPcHMgPSBnZXRJbmRleENvbHVtbk9wY2xhc3MoY29sdW1uKSA/PyBcInZlY3Rvcl9jb3NpbmVfb3BzXCI7XG4gIGNvbnN0IHdoZXJlQ2xhdXNlID0gZ2V0SW5kZXhXaGVyZUNsYXVzZShpbmRleCk7XG5cbiAgLy8gSE5TVyAoSGllcmFyY2hpY2FsIE5hdmlnYWJsZSBTbWFsbCBXb3JsZCkgLSDqtozsnqU6IOu5oOuluCDqsoDsg4ksIOuGkuydgCDsoJXtmZXrj4RcbiAgaWYgKGluZGV4LnR5cGUgPT09IFwiaG5zd1wiKSB7XG4gICAgY29uc3QgbSA9IGluZGV4Lm0gPz8gMTY7XG4gICAgY29uc3QgZWZDb25zdHJ1Y3Rpb24gPSBpbmRleC5lZkNvbnN0cnVjdGlvbiA/PyA2NDtcbiAgICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxcYENSRUFURSBJTkRFWCAke2luZGV4Lm5hbWV9IE9OICR7dGFibGV9IFVTSU5HIGhuc3cgKCR7Y29sdW1uLm5hbWV9ICR7dmVjdG9yT3BzfSkgV0lUSCAobSA9ICR7bX0sIGVmX2NvbnN0cnVjdGlvbiA9ICR7ZWZDb25zdHJ1Y3Rpb259KSR7d2hlcmVDbGF1c2V9XFxgKTtgO1xuICB9XG5cbiAgLy8gSVZGRmxhdCAoSW52ZXJ0ZWQgRmlsZSB3aXRoIEZsYXQgQ29tcHJlc3Npb24pIC0g64yA7Jqp65+JLCDruYTsmqkg7KSR7JqUIOyLnFxuICBpZiAoaW5kZXgudHlwZSA9PT0gXCJpdmZmbGF0XCIpIHtcbiAgICBjb25zdCBsaXN0cyA9IGluZGV4Lmxpc3RzID8/IDEwMDtcbiAgICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxcYENSRUFURSBJTkRFWCAke2luZGV4Lm5hbWV9IE9OICR7dGFibGV9IFVTSU5HIGl2ZmZsYXQgKCR7Y29sdW1uLm5hbWV9ICR7dmVjdG9yT3BzfSkgV0lUSCAobGlzdHMgPSAke2xpc3RzfSkke3doZXJlQ2xhdXNlfVxcYCk7YDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByYXcgU1FMIGluZGV4IHR5cGU6ICR7aW5kZXgudHlwZX1gKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5kZXhXaGVyZUNsYXVzZShpbmRleDogTWlncmF0aW9uSW5kZXgpOiBzdHJpbmcge1xuICBjb25zdCB3aGVyZSA9IG5vcm1hbGl6ZUluZGV4V2hlcmVQcmVkaWNhdGUoaW5kZXgud2hlcmUpO1xuICByZXR1cm4gd2hlcmUgPyBgIFdIRVJFICR7d2hlcmV9YCA6IFwiXCI7XG59XG5cbi8qKlxuICog7YWM7J2067iUIOyDneyEse2VmOuKlCDsvIDsnbTsiqQgLSBGSyDsg53shLFcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVDcmVhdGVDb2RlX0ZvcmVpZ24oXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICBpZiAoZm9yZWlnbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgeyB1cCwgZG93biB9ID0gZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBmb3JlaWducyk7XG4gIGlmICh1cC5sZW5ndGggPT09IDAgJiYgZG93bi5sZW5ndGggPT09IDApIHtcbiAgICAvLyBmb3JlaWduc+qwgCDsnojripTrjbAg7IOd7ISx65CcIOy9lOuTnOqwgCDsl4bripQg6rK97Jqw64qUIOu5hOygleyDgeyggeyduCDsg4HtmansnbTsp4Drp4wsXG4gICAgLy8g66eI7J206re466CI7J207IWYIOyDneyEseydhCDspJHri6jsi5ztgqTsp4Ag7JWK6rOgIOu5iCDrsLDsl7TsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAnaW1wb3J0IHsgS25leCB9IGZyb20gXCJrbmV4XCI7JyxcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICBgcmV0dXJuIGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLFxuICAgIFwiLy8gY3JlYXRlIGZrXCIsXG4gICAgLi4udXAsXG4gICAgXCJ9KTtcIixcbiAgICBcIn1cIixcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd24oa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGByZXR1cm4ga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsXG4gICAgXCIvLyBkcm9wIGZrXCIsXG4gICAgLi4uZG93bixcbiAgICBcIn0pO1wiLFxuICAgIFwifVwiLFxuICBdO1xuXG4gIGNvbnN0IGZvcmVpZ25LZXlzU3RyaW5nID0gZm9yZWlnbnMubWFwKChmb3JlaWduKSA9PiBmb3JlaWduLmNvbHVtbnMuam9pbihcIl9cIikpLmpvaW4oXCJfXCIpO1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHRhYmxlLFxuICAgICAgdHlwZTogXCJmb3JlaWduXCIsXG4gICAgICB0aXRsZTogYGZvcmVpZ25fXyR7dGFibGV9X18ke2ZvcmVpZ25LZXlzU3RyaW5nfWAsXG4gICAgICBmb3JtYXR0ZWQ6IGF3YWl0IGZvcm1hdENvZGUobGluZXMuam9pbihcIlxcblwiKSwgYHNyYy9taWdyYXRpb24vJHt0YWJsZX0udHNgKSxcbiAgICB9LFxuICBdO1xufVxuXG4vKipcbiAqIE1pZ3JhdGlvbkZvcmVpZ25bXSDsnb3slrTshJwg7Jm467aA7YKkIGNvbnN0cmFpbnQg7KCV7J2Y7ZWY64qUIOq1rOusuCDsg53shLFcbiAqL1xuZnVuY3Rpb24gZ2VuRm9yZWlnbkRlZmluaXRpb25zKFxuICB0YWJsZTogc3RyaW5nLFxuICBmb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuKTogeyB1cDogc3RyaW5nW107IGRvd246IHN0cmluZ1tdIH0ge1xuICByZXR1cm4gZm9yZWlnbnMucmVkdWNlKFxuICAgIChyLCBmb3JlaWduKSA9PiB7XG4gICAgICBjb25zdCBjb2x1bW5zU3RyaW5nUXVvdGUgPSBmb3JlaWduLmNvbHVtbnNcbiAgICAgICAgLm1hcCgoY29sKSA9PiBgJyR7Y29sLnJlcGxhY2UoYCR7dGFibGV9LmAsIFwiXCIpfSdgKVxuICAgICAgICAuam9pbihcIixcIik7XG4gICAgICByLnVwLnB1c2goXG4gICAgICAgIGB0YWJsZS5mb3JlaWduKCcke2ZvcmVpZ24uY29sdW1ucy5qb2luKFwiLFwiKX0nKVxuICAgICAgICAgICAgLnJlZmVyZW5jZXMoJyR7Zm9yZWlnbi50b30nKVxuICAgICAgICAgICAgLm9uVXBkYXRlKCcke2ZvcmVpZ24ub25VcGRhdGV9JylcbiAgICAgICAgICAgIC5vbkRlbGV0ZSgnJHtmb3JlaWduLm9uRGVsZXRlfScpYCxcbiAgICAgICk7XG4gICAgICByLmRvd24ucHVzaChgdGFibGUuZHJvcEZvcmVpZ24oWyR7Y29sdW1uc1N0cmluZ1F1b3RlfV0pYCk7XG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgIHtcbiAgICAgIHVwOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgIGRvd246IFtdIGFzIHN0cmluZ1tdLFxuICAgIH0sXG4gICk7XG59XG5cbi8qKlxuICog7YWM7J2067iUIOuzgOqyvSDsvIDsnbTsiqQgLSDsu6zrn7wv7J24642x7IqkIOuzgOqyvVxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFsdGVyQ29kZV9Db2x1bW5BbmRJbmRleGVzKFxuICB0YWJsZTogc3RyaW5nLFxuICBlbnRpdHlDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgZW50aXR5SW5kZXhlczogTWlncmF0aW9uSW5kZXhbXSxcbiAgZGJDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgZGJJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLFxuICBkYkZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4gIGNvbXBhcmVEQj86IEtuZXgsXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICBjb25zdCByZXNvbHZlZEVudGl0eUNvbHVtbnMgPSByZXNvbHZlU2VhcmNoVGV4dENvbHVtbnModGFibGUsIGVudGl0eUNvbHVtbnMpO1xuICBjb25zdCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMgPSBnZXRTZWFyY2hUZXh0Q29sdW1uTmFtZXModGFibGUpO1xuICAvKlxuICAgIOyEuOu2gCDruYTqtZAg7ZuEIOuLpOuluOygkCDssL7slYTshJwg7L2U65OcIOyDneyEsVxuXG4gICAgMS4g7Lus65+86rCv7IiYIOuLpOumhDogTUTsl5Ag7J6I7Jy864KYLCBEQuyXkCDsl4bri6TrqbQg7LaU6rCAXG4gICAgMi4g7Lus65+86rCv7IiYIOuLpOumhDogTUTsl5Ag7JeG7Jy864KYLCBEQuyXkCDsnojri6TrqbQg7IKt7KCcXG4gICAgMy4g6re47Jm4IOy7rOufvCjsu6zrn7wg6rCv7IiY6rCAIOuPmeydvO2VmOqxsOuCmCwg64uk66W4IOqyveyasCDrj5nsnbztlZwg7Lus65+864G866asKSA9PiBhbHRlclxuICAgIDQuIOuLpOuluOqxsCDri6Qg64+Z7J287ZWY6rOgIGluZGV466eMIOuzgOqyveuQmOuKlCDqsr3smrBcblxuICAgICoqIOy7rOufvOuqheydhCDrs4Dqsr3tlZjripQg6rK97Jqw64qUIOuUsOuhnCDtlbjrk6Trp4HtlZjsp4Ag7JWK7J2MXG4gICAgPT4gZHJvcC9hZGQg7ZiV7YOc7J2YIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5zqsIAg7IOd7ISx65CY64qU642wLCDsiJjrj5nsnLzroZwgcmVuYW1lIOy9lOuTnOuhnCDsiJjsoJXtlZjsl6wg7LKY66asXG4gICovXG5cbiAgLy8gUEsoaWQpIOy7rOufvCDtg4DsnoUg67OA6rK9IOqwkOyngCDrsI8g7LKY66asXG4gIGNvbnN0IGVudGl0eUlkQ29sID0gcmVzb2x2ZWRFbnRpdHlDb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwiaWRcIik7XG4gIGNvbnN0IGRiSWRDb2wgPSBkYkNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJpZFwiKTtcblxuICBpZiAoZW50aXR5SWRDb2wgJiYgZGJJZENvbCAmJiBjb21wYXJlREIpIHtcbiAgICBjb25zdCBpc1BrVHlwZUNoYW5nZWQgPVxuICAgICAgZW50aXR5SWRDb2wudHlwZSAhPT0gZGJJZENvbC50eXBlIHx8IGVudGl0eUlkQ29sLmxlbmd0aCAhPT0gZGJJZENvbC5sZW5ndGg7XG5cbiAgICBpZiAoaXNQa1R5cGVDaGFuZ2VkKSB7XG4gICAgICByZXR1cm4gZ2VuZXJhdGVQa1R5cGVDaGFuZ2VNaWdyYXRpb24oXG4gICAgICAgIHRhYmxlLFxuICAgICAgICBlbnRpdHlJZENvbCxcbiAgICAgICAgZGJJZENvbCxcbiAgICAgICAgcmVzb2x2ZWRFbnRpdHlDb2x1bW5zLFxuICAgICAgICBlbnRpdHlJbmRleGVzLFxuICAgICAgICBkYkNvbHVtbnMsXG4gICAgICAgIGRiSW5kZXhlcyxcbiAgICAgICAgZGJGb3JlaWducyxcbiAgICAgICAgY29tcGFyZURCLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyDqsIEg7Lus65+8IOydtOumhCDquLDspIDsnLzroZwgYWRkLCBkcm9wLCBhbHRlciDsl6zrtoAg7ZmV7J24XG4gIGNvbnN0IGFsdGVyQ29sdW1uc1RvID0gZ2V0QWx0ZXJDb2x1bW5zVG8ocmVzb2x2ZWRFbnRpdHlDb2x1bW5zLCBkYkNvbHVtbnMsIHNlYXJjaFRleHRDb2x1bW5OYW1lcyk7XG5cbiAgLy8g7LaU7Lac65CcIOy7rOufvOuTpOydhCDquLDspIDsnLzroZwg6rCB6rCBIOudvOyduCDsg53shLFcbiAgY29uc3QgYWx0ZXJDb2x1bW5MaW5lc1RvID0gZ2V0QWx0ZXJDb2x1bW5MaW5lc1RvKFxuICAgIGFsdGVyQ29sdW1uc1RvLFxuICAgIHJlc29sdmVkRW50aXR5Q29sdW1ucyxcbiAgICB0YWJsZSxcbiAgICBkYkZvcmVpZ25zLFxuICApO1xuXG4gIC8vIOyduOuNseyKpOydmCBhZGQsIGRyb3Ag7Jes67aAIO2ZleyduFxuICBjb25zdCBhbHRlckluZGV4ZXNUbyA9IGdldEFsdGVySW5kZXhlc1RvKGVudGl0eUluZGV4ZXMsIGRiSW5kZXhlcyk7XG4gIGNvbnN0IHJlY3JlYXRlZFNlYXJjaFRleHRDb2x1bW5OYW1lcyA9IG5ldyBTZXQoXG4gICAgYWx0ZXJDb2x1bW5zVG8uYWx0ZXJcbiAgICAgIC5maWx0ZXIoKGRiQ29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGVudGl0eUNvbHVtbiA9IHJlc29sdmVkRW50aXR5Q29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5uYW1lID09PSBkYkNvbHVtbi5uYW1lKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBzZWFyY2hUZXh0Q29sdW1uTmFtZXMuaGFzKGRiQ29sdW1uLm5hbWUpICYmXG4gICAgICAgICAgZGJDb2x1bW4uZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBlbnRpdHlDb2x1bW4/LmdlbmVyYXRlZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSksXG4gICk7XG4gIGNvbnN0IHJlY3JlYXRlZFNlYXJjaFRleHREYkluZGV4ZXMgPSBkYkluZGV4ZXMuZmlsdGVyKFxuICAgIChpbmRleCkgPT5cbiAgICAgIGluZGV4LmNvbHVtbnMuc29tZSgoeyBuYW1lIH0pID0+IHJlY3JlYXRlZFNlYXJjaFRleHRDb2x1bW5OYW1lcy5oYXMobmFtZSkpICYmXG4gICAgICAhYWx0ZXJJbmRleGVzVG8uZHJvcC5zb21lKChkcm9wSW5kZXgpID0+IGRyb3BJbmRleC5uYW1lID09PSBpbmRleC5uYW1lKSxcbiAgKTtcbiAgY29uc3QgcmVjcmVhdGVkU2VhcmNoVGV4dEVudGl0eUluZGV4ZXMgPSBlbnRpdHlJbmRleGVzLmZpbHRlcihcbiAgICAoaW5kZXgpID0+XG4gICAgICBpbmRleC5jb2x1bW5zLnNvbWUoKHsgbmFtZSB9KSA9PiByZWNyZWF0ZWRTZWFyY2hUZXh0Q29sdW1uTmFtZXMuaGFzKG5hbWUpKSAmJlxuICAgICAgIWFsdGVySW5kZXhlc1RvLmFkZC5zb21lKChhZGRJbmRleCkgPT4gYWRkSW5kZXgubmFtZSA9PT0gaW5kZXgubmFtZSksXG4gICk7XG4gIGNvbnN0IGltcGxpY2l0bHlEcm9wcGVkRGJJbmRleGVzID0gYWx0ZXJJbmRleGVzVG8uZHJvcC5maWx0ZXIoKGluZGV4KSA9PlxuICAgIGluZGV4LmNvbHVtbnMuZXZlcnkoKHsgbmFtZSB9KSA9PiBhbHRlckNvbHVtbnNUby5kcm9wLnNvbWUoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUgPT09IG5hbWUpKSxcbiAgKTtcblxuICAvLyDsnbjrjbHsiqTqsIAg7IKt7KCc65CY64qUIOqyveyasCwg7Lus65+86rO8IOqwmeydtCDsgq3soJzrkJwg7LyA7J207Iqk7JeQ64qUIGRyb3Dsl5DshJwg7KCc7Jm47ZW07JW87ZWoIVxuICBjb25zdCBpbmRleE5lZWRzVG9Ecm9wID0gYWx0ZXJJbmRleGVzVG8uZHJvcC5maWx0ZXIoXG4gICAgKGluZGV4KSA9PiAhaW1wbGljaXRseURyb3BwZWREYkluZGV4ZXMuc29tZSgoZHJvcHBlZEluZGV4KSA9PiBkcm9wcGVkSW5kZXgubmFtZSA9PT0gaW5kZXgubmFtZSksXG4gICk7XG5cbiAgLy8g67mIIOy9lOuTnCDsg53shLEg67Cp7KeAXG4gIGNvbnN0IGhhc1VwQ2hhbmdlcyA9XG4gICAgYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC51cC5idWlsZGVyLmxlbmd0aCA+IDAgfHxcbiAgICBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLnJhdy5sZW5ndGggPiAwIHx8XG4gICAgYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AudXAuYnVpbGRlci5sZW5ndGggPiAwIHx8XG4gICAgYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCB8fFxuICAgIGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci51cC5yYXcubGVuZ3RoID4gMCB8fFxuICAgIGFsdGVySW5kZXhlc1RvLmFkZC5sZW5ndGggPiAwIHx8XG4gICAgaW5kZXhOZWVkc1RvRHJvcC5sZW5ndGggPiAwIHx8XG4gICAgcmVjcmVhdGVkU2VhcmNoVGV4dERiSW5kZXhlcy5sZW5ndGggPiAwO1xuICBpZiAoIWhhc1VwQ2hhbmdlcykge1xuICAgIC8vIOuzgOqyveyCrO2VreydtCDsl4bsnLzrqbQg67mIIOuwsOyXtCDrsJjtmZhcbiAgICByZXR1cm4gW107XG4gIH1cbiAgTmFpdGUudChcIm1pZ3JhdG9yOmdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXM6ZGVidWdcIiwge1xuICAgIFwiYWx0ZXJDb2x1bW5zVG8uYWRkLmxlbmd0aFwiOiBhbHRlckNvbHVtbnNUby5hZGQubGVuZ3RoLFxuICAgIFwiYWx0ZXJDb2x1bW5zVG8uZHJvcC5sZW5ndGhcIjogYWx0ZXJDb2x1bW5zVG8uZHJvcC5sZW5ndGgsXG4gICAgXCJhbHRlckNvbHVtbnNUby5hbHRlci5sZW5ndGhcIjogYWx0ZXJDb2x1bW5zVG8uYWx0ZXIubGVuZ3RoLFxuICAgIFwiYWx0ZXJJbmRleGVzVG8uYWRkLmxlbmd0aFwiOiBhbHRlckluZGV4ZXNUby5hZGQubGVuZ3RoLFxuICAgIFwiYWx0ZXJJbmRleGVzVG8uZHJvcC5sZW5ndGhcIjogYWx0ZXJJbmRleGVzVG8uZHJvcC5sZW5ndGgsXG4gICAgXCJpbmRleE5lZWRzVG9Ecm9wLmxlbmd0aFwiOiBpbmRleE5lZWRzVG9Ecm9wLmxlbmd0aCxcbiAgfSk7XG4gIC8vIE5haXRlLnQoXCJtaWdyYXRvcjpnZW5lcmF0ZUFsdGVyQ29kZV9Db2x1bW5BbmRJbmRleGVzOmFsdGVyQ29sdW1uc1RvXCIsIGFsdGVyQ29sdW1uc1RvKTtcblxuICAvLyBUT0RPOiDsnbjrjbHsiqTrqoUg67OA6rK965CcIOqyveyasCDsspjrpqxcblxuICAvLyB0YWJsZSBidWlsZGVyIOuplOyEnOuTnOuhnCDsi6TtlontlaAg7L2U65OcIChkcm9wIOKGkiBhZGQg4oaSIGFsdGVyIOyInOyEnClcbiAgY29uc3QgdXBCdWlsZGVyTGluZXMgPSBbXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5kcm9wLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5kcm9wLnVwLmJ1aWxkZXIgOiBbXSksXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hZGQudXAuYnVpbGRlci5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC51cC5idWlsZGVyIDogW10pLFxuICAgIC4uLnJlY3JlYXRlZFNlYXJjaFRleHREYkluZGV4ZXMubWFwKGdlbkluZGV4RHJvcERlZmluaXRpb24pLFxuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIudXAuYnVpbGRlci5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLmJ1aWxkZXIgOiBbXSksXG4gICAgLi4uaW5kZXhOZWVkc1RvRHJvcC5tYXAoZ2VuSW5kZXhEcm9wRGVmaW5pdGlvbiksXG4gIF07XG5cbiAgLy8ga25leC5yYXcoKeuhnCDsi6TtlontlaAg7L2U65OcXG4gIGNvbnN0IHVwUmF3TGluZXMgPSBbXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hZGQudXAucmF3Lmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLnJhdyA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLnJhdy5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLnJhdyA6IFtdKSxcbiAgICAuLi5yZWNyZWF0ZWRTZWFyY2hUZXh0RW50aXR5SW5kZXhlcy5tYXAoKGluZGV4KSA9PiBnZW5JbmRleERlZmluaXRpb24oaW5kZXgsIHRhYmxlKSksXG4gICAgLi4uYWx0ZXJJbmRleGVzVG8uYWRkLm1hcCgoaW5kZXgpID0+IGdlbkluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpKSxcbiAgXTtcblxuICAvLyBkb3du7J2AIHVw7J2YIOyXreyInCAoYWRkLmRvd24gPSBkcm9wIHJvbGxiYWNrLCBkcm9wLmRvd24gPSBhZGQgcm9sbGJhY2spXG4gIGNvbnN0IGRvd25CdWlsZGVyTGluZXMgPSBbXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hZGQuZG93bi5idWlsZGVyLmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLmRvd24uYnVpbGRlciA6IFtdKSxcbiAgICAuLi5yZWNyZWF0ZWRTZWFyY2hUZXh0RW50aXR5SW5kZXhlcy5tYXAoZ2VuSW5kZXhEcm9wRGVmaW5pdGlvbiksXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci5kb3duLmJ1aWxkZXIubGVuZ3RoID4gMFxuICAgICAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIuZG93bi5idWlsZGVyXG4gICAgICA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AuZG93bi5idWlsZGVyLmxlbmd0aCA+IDBcbiAgICAgID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AuZG93bi5idWlsZGVyXG4gICAgICA6IFtdKSxcbiAgICAuLi5hbHRlckluZGV4ZXNUby5hZGRcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChpbmRleCkgPT5cbiAgICAgICAgICAhaW5kZXguY29sdW1ucy5ldmVyeSgoaW5kZXhDb2wpID0+XG4gICAgICAgICAgICBhbHRlckNvbHVtbnNUby5hZGQubWFwKChjb2wpID0+IGNvbC5uYW1lKS5pbmNsdWRlcyhpbmRleENvbC5uYW1lKSxcbiAgICAgICAgICApLFxuICAgICAgKVxuICAgICAgLm1hcChnZW5JbmRleERyb3BEZWZpbml0aW9uKSxcbiAgXTtcblxuICBjb25zdCBkb3duUmF3TGluZXMgPSBbXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5kcm9wLmRvd24ucmF3Lmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC5kb3duLnJhdyA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLmRvd24ucmF3Lmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIuZG93bi5yYXcgOiBbXSksXG4gICAgLi4ucmVjcmVhdGVkU2VhcmNoVGV4dERiSW5kZXhlcy5tYXAoKGluZGV4KSA9PiBnZW5JbmRleERlZmluaXRpb24oaW5kZXgsIHRhYmxlKSksXG4gICAgLi4uaW1wbGljaXRseURyb3BwZWREYkluZGV4ZXMubWFwKChpbmRleCkgPT4gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSkpLFxuICAgIC4uLmluZGV4TmVlZHNUb0Ryb3AubWFwKChpbmRleCkgPT4gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSkpLFxuICBdO1xuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAnaW1wb3J0IHsgS25leCB9IGZyb20gXCJrbmV4XCI7JyxcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICAuLi4odXBCdWlsZGVyTGluZXMubGVuZ3RoID4gMFxuICAgICAgPyBbYGF3YWl0IGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLCAuLi51cEJ1aWxkZXJMaW5lcywgXCJ9KTtcIl1cbiAgICAgIDogW10pLFxuICAgIC4uLnVwUmF3TGluZXMsXG4gICAgXCJ9XCIsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICAuLi4oZG93bkJ1aWxkZXJMaW5lcy5sZW5ndGggPiAwXG4gICAgICA/IFtgYXdhaXQga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsIC4uLmRvd25CdWlsZGVyTGluZXMsIFwifSk7XCJdXG4gICAgICA6IFtdKSxcbiAgICAuLi5kb3duUmF3TGluZXMsXG4gICAgXCJ9XCIsXG4gIF07XG5cbiAgY29uc3QgZm9ybWF0dGVkID0gYXdhaXQgZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBgc3JjL21pZ3JhdGlvbi8ke3RhYmxlfS50c2ApO1xuICBjb25zdCB0aXRsZSA9IFtcbiAgICBcImFsdGVyXCIsXG4gICAgdGFibGUsXG4gICAgLi4uKFtcImFkZFwiLCBcImRyb3BcIiwgXCJhbHRlclwiXSBhcyBjb25zdClcbiAgICAgIC5tYXAoKGFjdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBsZW4gPSBhbHRlckNvbHVtbnNUb1thY3Rpb25dLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbiA+IDApIHtcbiAgICAgICAgICByZXR1cm4gYWN0aW9uICsgbGVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09IG51bGwpLFxuICBdLmpvaW4oXCJfXCIpO1xuXG4gIHJldHVybiBbXG4gICAge1xuICAgICAgdGFibGUsXG4gICAgICB0aXRsZSxcbiAgICAgIGZvcm1hdHRlZCxcbiAgICAgIHR5cGU6IFwibm9ybWFsXCIsXG4gICAgfSxcbiAgXTtcbn1cblxuLyoqXG4gKiDsu6zrn7wg67mE6rWQ66W8IOychO2VtCBHZW5lcmF0ZWQgQ29sdW1u7J2YIGV4cHJlc3Npb27snYQg7KCc7Jm47ZWcIOqwneyytOulvCDsg53shLFcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbihcbiAgY29sOiBNaWdyYXRpb25Db2x1bW4sXG4gIHNlYXJjaFRleHRDb2x1bW5OYW1lczogU2V0PHN0cmluZz4sXG4pOiBNaWdyYXRpb25Db2x1bW4ge1xuICBpZiAoIWNvbC5nZW5lcmF0ZWQpIHtcbiAgICByZXR1cm4gY29sO1xuICB9XG5cbiAgaWYgKCFzZWFyY2hUZXh0Q29sdW1uTmFtZXMuaGFzKGNvbC5uYW1lKSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5jb2wsXG4gICAgICBnZW5lcmF0ZWQ6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5jb2wsXG4gICAgZ2VuZXJhdGVkOiB7XG4gICAgICAuLi5jb2wuZ2VuZXJhdGVkLFxuICAgICAgZXhwcmVzc2lvbjogY2Fub25pY2FsaXplU2VhcmNoVGV4dEdlbmVyYXRlZEV4cHJlc3Npb24oY29sLmdlbmVyYXRlZC5leHByZXNzaW9uKSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIOqwgSDsu6zrn7wg7J2066aEIOq4sOykgOycvOuhnCBhZGQsIGRyb3AsIGFsdGVyIOyXrOu2gCDtmZXsnbhcbiAqL1xuZnVuY3Rpb24gZ2V0QWx0ZXJDb2x1bW5zVG8oXG4gIGVudGl0eUNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLFxuICBkYkNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLFxuICBzZWFyY2hUZXh0Q29sdW1uTmFtZXM6IFNldDxzdHJpbmc+LFxuKSB7XG4gIGNvbnN0IGNvbHVtbnNUbyA9IHtcbiAgICBhZGQ6IFtdIGFzIE1pZ3JhdGlvbkNvbHVtbltdLFxuICAgIGRyb3A6IFtdIGFzIE1pZ3JhdGlvbkNvbHVtbltdLFxuICAgIGFsdGVyOiBbXSBhcyBNaWdyYXRpb25Db2x1bW5bXSxcbiAgfTtcblxuICAvLyDsu6zrn7zrqoUg6riw7KSAIOu5hOq1kFxuICBjb25zdCBleHRyYUNvbHVtbnMgPSB7XG4gICAgZGI6IGRpZmYoZGJDb2x1bW5zLCBlbnRpdHlDb2x1bW5zLCAoY29sKSA9PiBbY29sLm5hbWUsIGNvbC5nZW5lcmF0ZWQ/LnR5cGVdLmpvaW4oXCIvLy9cIikpLFxuICAgIGVudGl0eTogZGlmZihlbnRpdHlDb2x1bW5zLCBkYkNvbHVtbnMsIChjb2wpID0+IFtjb2wubmFtZSwgY29sLmdlbmVyYXRlZD8udHlwZV0uam9pbihcIi8vL1wiKSksXG4gIH07XG4gIGlmIChleHRyYUNvbHVtbnMuZW50aXR5Lmxlbmd0aCA+IDApIHtcbiAgICBjb2x1bW5zVG8uYWRkID0gY29sdW1uc1RvLmFkZC5jb25jYXQoZXh0cmFDb2x1bW5zLmVudGl0eSk7XG4gIH1cbiAgaWYgKGV4dHJhQ29sdW1ucy5kYi5sZW5ndGggPiAwKSB7XG4gICAgY29sdW1uc1RvLmRyb3AgPSBjb2x1bW5zVG8uZHJvcC5jb25jYXQoZXh0cmFDb2x1bW5zLmRiKTtcbiAgfVxuXG4gIC8vIOuPmeydvCDsu6zrn7zrqoXsnZgg7IS467aAIO2VhOuTnCDruYTqtZBcbiAgY29uc3Qgc2FtZURiQ29sdW1ucyA9IGludGVyc2VjdGlvbkJ5KGRiQ29sdW1ucywgZW50aXR5Q29sdW1ucywgKGNvbCkgPT4gY29sLm5hbWUpO1xuICBjb25zdCBzYW1lTWRDb2x1bW5zID0gaW50ZXJzZWN0aW9uQnkoZW50aXR5Q29sdW1ucywgZGJDb2x1bW5zLCAoY29sKSA9PiBjb2wubmFtZSk7XG4gIGNvbHVtbnNUby5hbHRlciA9IGRpZmZlcmVuY2VXaXRoKHNhbWVEYkNvbHVtbnMsIHNhbWVNZENvbHVtbnMsIChhLCBiKSA9PlxuICAgIGVxdWFsKFxuICAgICAgbm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbihhLCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMpLFxuICAgICAgbm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbihiLCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMpLFxuICAgICksXG4gICk7XG5cbiAgcmV0dXJuIGNvbHVtbnNUbztcbn1cblxuLyoqXG4gKiDstpTstpzrkJwg7Lus65+865Ok7J2EIOq4sOykgOycvOuhnCDqsIHqsIEg65287J24IOyDneyEsVxuICovXG5mdW5jdGlvbiBnZXRBbHRlckNvbHVtbkxpbmVzVG8oXG4gIGNvbHVtbnNUbzogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0QWx0ZXJDb2x1bW5zVG8+LFxuICBlbnRpdHlDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgdGFibGU6IHN0cmluZyxcbiAgZGJGb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuKSB7XG4gIGNvbnN0IHNlYXJjaFRleHRDb2x1bW5OYW1lcyA9IGdldFNlYXJjaFRleHRDb2x1bW5OYW1lcyh0YWJsZSk7XG4gIGNvbnN0IGxpbmVzVG8gPSB7XG4gICAgYWRkOiB7XG4gICAgICB1cDogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgICAgZG93bjogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgIH0sXG4gICAgZHJvcDoge1xuICAgICAgdXA6IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICAgIGRvd246IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICB9LFxuICAgIGFsdGVyOiB7XG4gICAgICB1cDogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgICAgZG93bjogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgIH0sXG4gIH07XG5cbiAgLy8gYWRkIGNvbHVtbnNcbiAgY29uc3QgYWRkQ29sdW1uRGVmcyA9IGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBjb2x1bW5zVG8uYWRkKTtcbiAgbGluZXNUby5hZGQudXAgPSB7XG4gICAgYnVpbGRlcjogYWRkQ29sdW1uRGVmcy5idWlsZGVyLmxlbmd0aCA+IDAgPyBbXCIvLyBhZGRcIiwgLi4uYWRkQ29sdW1uRGVmcy5idWlsZGVyXSA6IFtdLFxuICAgIHJhdzpcbiAgICAgIGFkZENvbHVtbkRlZnMucmF3Lmxlbmd0aCA+IDBcbiAgICAgICAgPyBbXG4gICAgICAgICAgICAuLi5nZXRTZWFyY2hUZXh0SGVscGVyRGVmaW5pdGlvbnModGFibGUsIGNvbHVtbnNUby5hZGQpLFxuICAgICAgICAgICAgXCIvLyBhZGQgKGdlbmVyYXRlZClcIixcbiAgICAgICAgICAgIC4uLmFkZENvbHVtbkRlZnMucmF3LFxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXSxcbiAgfTtcbiAgbGluZXNUby5hZGQuZG93biA9IHtcbiAgICBidWlsZGVyOlxuICAgICAgY29sdW1uc1RvLmFkZC5sZW5ndGggPiAwXG4gICAgICAgID8gW1xuICAgICAgICAgICAgXCIvLyByb2xsYmFjayAtIGFkZFwiLFxuICAgICAgICAgICAgYHRhYmxlLmRyb3BDb2x1bW5zKCR7Y29sdW1uc1RvLmFkZC5tYXAoKGNvbCkgPT4gYCcke2NvbC5uYW1lfSdgKS5qb2luKFwiLCBcIil9KWAsXG4gICAgICAgICAgXVxuICAgICAgICA6IFtdLFxuICAgIHJhdzogW10sXG4gIH07XG5cbiAgLy8gZHJvcO2VoCDsu6zrn7zsl5Ag6rG466awIEZLIOywvuq4sFxuICBjb25zdCBkcm9wQ29sdW1uTmFtZXMgPSBjb2x1bW5zVG8uZHJvcC5tYXAoKGNvbCkgPT4gY29sLm5hbWUpO1xuICBjb25zdCBma1RvRHJvcEJlZm9yZUNvbHVtbiA9IGRiRm9yZWlnbnMuZmlsdGVyKChmaykgPT5cbiAgICBmay5jb2x1bW5zLnNvbWUoKGNvbCkgPT4gZHJvcENvbHVtbk5hbWVzLmluY2x1ZGVzKGNvbCkpLFxuICApO1xuXG4gIGNvbnN0IGRyb3BGa0xpbmVzID0gZmtUb0Ryb3BCZWZvcmVDb2x1bW4ubWFwKChmaykgPT4ge1xuICAgIGNvbnN0IGNvbHVtbnNTdHJpbmdRdW90ZSA9IGZrLmNvbHVtbnMubWFwKChjb2wpID0+IGAnJHtjb2x9J2ApLmpvaW4oXCIsXCIpO1xuICAgIHJldHVybiBgdGFibGUuZHJvcEZvcmVpZ24oWyR7Y29sdW1uc1N0cmluZ1F1b3RlfV0pYDtcbiAgfSk7XG5cbiAgY29uc3QgcmVzdG9yZUZrTGluZXMgPSBnZW5Gb3JlaWduRGVmaW5pdGlvbnModGFibGUsIGZrVG9Ecm9wQmVmb3JlQ29sdW1uKS51cDtcblxuICAvLyBkcm9w7J2YIHJvbGxiYWNr7Iuc7JeQ64qUIGdlbmVyYXRlZCBjb2x1bW7rj4Qg67O17JuQ7ZW07JW8IO2VqFxuICBjb25zdCBkcm9wQ29sdW1uRGVmcyA9IGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBjb2x1bW5zVG8uZHJvcCk7XG4gIGxpbmVzVG8uZHJvcCA9IHtcbiAgICB1cDoge1xuICAgICAgYnVpbGRlcjogW1xuICAgICAgICAuLi4oZHJvcEZrTGluZXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gW1wiLy8gZHJvcCBmb3JlaWduIGtleXMgb24gY29sdW1ucyB0byBiZSBkcm9wcGVkXCIsIC4uLmRyb3BGa0xpbmVzXVxuICAgICAgICAgIDogW10pLFxuICAgICAgICAuLi4oY29sdW1uc1RvLmRyb3AubGVuZ3RoID4gMFxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICBcIi8vIGRyb3AgY29sdW1uc1wiLFxuICAgICAgICAgICAgICBgdGFibGUuZHJvcENvbHVtbnMoJHtjb2x1bW5zVG8uZHJvcC5tYXAoKGNvbCkgPT4gYCcke2NvbC5uYW1lfSdgKS5qb2luKFwiLCBcIil9KWAsXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXSksXG4gICAgICBdLFxuICAgICAgcmF3OiBbXSxcbiAgICB9LFxuICAgIGRvd246IHtcbiAgICAgIGJ1aWxkZXI6IFtcbiAgICAgICAgLi4uKGRyb3BDb2x1bW5EZWZzLmJ1aWxkZXIubGVuZ3RoID4gMFxuICAgICAgICAgID8gW1wiLy8gcm9sbGJhY2sgLSBkcm9wIGNvbHVtbnNcIiwgLi4uZHJvcENvbHVtbkRlZnMuYnVpbGRlcl1cbiAgICAgICAgICA6IFtdKSxcbiAgICAgICAgLi4uKHJlc3RvcmVGa0xpbmVzLmxlbmd0aCA+IDAgPyBbXCIvLyByZXN0b3JlIGZvcmVpZ24ga2V5c1wiLCAuLi5yZXN0b3JlRmtMaW5lc10gOiBbXSksXG4gICAgICBdLFxuICAgICAgcmF3OlxuICAgICAgICBkcm9wQ29sdW1uRGVmcy5yYXcubGVuZ3RoID4gMFxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAuLi5nZXRTZWFyY2hUZXh0SGVscGVyRGVmaW5pdGlvbnModGFibGUsIGNvbHVtbnNUby5kcm9wKSxcbiAgICAgICAgICAgICAgXCIvLyByb2xsYmFjayAtIGRyb3AgY29sdW1ucyAoZ2VuZXJhdGVkKVwiLFxuICAgICAgICAgICAgICAuLi5kcm9wQ29sdW1uRGVmcy5yYXcsXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXSxcbiAgICB9LFxuICB9O1xuXG4gIC8vIGFsdGVyIGNvbHVtbnMgKEdlbmVyYXRlZCBDb2x1bW7snYAgQUxURVIg67aI6rCA7ZWY66+A66GcIGRyb3Ag7ZuEIOyerOyDneyEsSlcbiAgbGluZXNUby5hbHRlciA9IGNvbHVtbnNUby5hbHRlci5yZWR1Y2UoXG4gICAgKHIsIGRiQ29sdW1uKSA9PiB7XG4gICAgICBjb25zdCBlbnRpdHlDb2x1bW4gPSBlbnRpdHlDb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUgPT09IGRiQ29sdW1uLm5hbWUpO1xuICAgICAgaWYgKGVudGl0eUNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHNlYXJjaFRleHRDb2x1bW5OYW1lcy5oYXMoZGJDb2x1bW4ubmFtZSkgJiZcbiAgICAgICAgZGJDb2x1bW4uZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgZW50aXR5Q29sdW1uLmdlbmVyYXRlZCAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgci51cC5idWlsZGVyID0gW1xuICAgICAgICAgIC4uLnIudXAuYnVpbGRlcixcbiAgICAgICAgICBcIi8vIGFsdGVyIGdlbmVyYXRlZCBjb2x1bW5cIixcbiAgICAgICAgICBgdGFibGUuZHJvcENvbHVtbnMoJyR7ZGJDb2x1bW4ubmFtZX0nKWAsXG4gICAgICAgIF07XG4gICAgICAgIHIudXAucmF3ID0gW1xuICAgICAgICAgIC4uLnIudXAucmF3LFxuICAgICAgICAgIC4uLmdldFNlYXJjaFRleHRIZWxwZXJEZWZpbml0aW9ucyh0YWJsZSwgW2VudGl0eUNvbHVtbl0pLFxuICAgICAgICAgIFwiLy8gYWx0ZXIgZ2VuZXJhdGVkIGNvbHVtblwiLFxuICAgICAgICAgIGdlbkdlbmVyYXRlZENvbHVtbkRlZmluaXRpb24odGFibGUsIGVudGl0eUNvbHVtbiksXG4gICAgICAgIF07XG4gICAgICAgIHIuZG93bi5idWlsZGVyID0gW1xuICAgICAgICAgIC4uLnIuZG93bi5idWlsZGVyLFxuICAgICAgICAgIFwiLy8gcm9sbGJhY2sgLSBhbHRlciBnZW5lcmF0ZWQgY29sdW1uXCIsXG4gICAgICAgICAgYHRhYmxlLmRyb3BDb2x1bW5zKCcke2RiQ29sdW1uLm5hbWV9JylgLFxuICAgICAgICBdO1xuICAgICAgICByLmRvd24ucmF3ID0gW1xuICAgICAgICAgIC4uLnIuZG93bi5yYXcsXG4gICAgICAgICAgLi4uZ2V0U2VhcmNoVGV4dEhlbHBlckRlZmluaXRpb25zKHRhYmxlLCBbZGJDb2x1bW5dKSxcbiAgICAgICAgICBcIi8vIHJvbGxiYWNrIC0gYWx0ZXIgZ2VuZXJhdGVkIGNvbHVtblwiLFxuICAgICAgICAgIGdlbkdlbmVyYXRlZENvbHVtbkRlZmluaXRpb24odGFibGUsIGRiQ29sdW1uKSxcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG5cbiAgICAgIC8vIOy7rOufvCDrs4Dqsr3sgqztla1cbiAgICAgIGNvbnN0IGNvbHVtbkRpZmZVcCA9IGRpZmYoXG4gICAgICAgIGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBbZW50aXR5Q29sdW1uXSkuYnVpbGRlcixcbiAgICAgICAgZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIFtkYkNvbHVtbl0pLmJ1aWxkZXIsXG4gICAgICApO1xuICAgICAgY29uc3QgY29sdW1uRGlmZkRvd24gPSBkaWZmKFxuICAgICAgICBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZSwgW2RiQ29sdW1uXSkuYnVpbGRlcixcbiAgICAgICAgZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIFtlbnRpdHlDb2x1bW5dKS5idWlsZGVyLFxuICAgICAgKTtcbiAgICAgIGlmIChjb2x1bW5EaWZmVXAubGVuZ3RoID4gMCkge1xuICAgICAgICByLnVwLmJ1aWxkZXIgPSBbXG4gICAgICAgICAgLi4uci51cC5idWlsZGVyLFxuICAgICAgICAgIFwiLy8gYWx0ZXIgY29sdW1uXCIsXG4gICAgICAgICAgLi4uY29sdW1uRGlmZlVwLm1hcCgobCkgPT4gYCR7bC5yZXBsYWNlKFwiO1wiLCBcIlwiKX0uYWx0ZXIoKTtgKSxcbiAgICAgICAgXTtcbiAgICAgICAgci5kb3duLmJ1aWxkZXIgPSBbXG4gICAgICAgICAgLi4uci5kb3duLmJ1aWxkZXIsXG4gICAgICAgICAgXCIvLyByb2xsYmFjayAtIGFsdGVyIGNvbHVtblwiLFxuICAgICAgICAgIC4uLmNvbHVtbkRpZmZEb3duLm1hcCgobCkgPT4gYCR7bC5yZXBsYWNlKFwiO1wiLCBcIlwiKX0uYWx0ZXIoKTtgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICB7XG4gICAgICB1cDogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgICAgZG93bjogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgIH0sXG4gICk7XG5cbiAgcmV0dXJuIGxpbmVzVG87XG59XG5cbi8qKlxuICog7J24642x7Iqk7J2YIGFkZCwgZHJvcCDsl6zrtoAg7ZmV7J24XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbHRlckluZGV4ZXNUbyhlbnRpdHlJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLCBkYkluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10pIHtcbiAgLy8g7J24642x7IqkIOu5hOq1kFxuICBjb25zdCBpbmRleGVzVG8gPSB7XG4gICAgYWRkOiBbXSBhcyBNaWdyYXRpb25JbmRleFtdLFxuICAgIGRyb3A6IFtdIGFzIE1pZ3JhdGlvbkluZGV4W10sXG4gIH07XG5cbiAgLy8g7J24642x7IqkIOqzoOycoCDsi53rs4TsnpAg7IOd7ISxIChuYW1l7J2EIOygnOyZuO2VnCDrqqjrk6Ag7ZWE65Oc66W8IOusuOyekOyXtOuhnCDrs4DtmZjtlZjsl6wg7KGw7ZWpKVxuICBjb25zdCBpZGVudGl0eSA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGluZGV4OiBUKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaW5kZXgpXG4gICAgICAuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gXCJuYW1lXCIpXG4gICAgICAudG9Tb3J0ZWQoKTtcblxuICAgIHJldHVybiBrZXlzXG4gICAgICAubWFwKChrZXkpID0+IHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJuYW1lXCIpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09IFwiY29sdW1uc1wiKSB7XG4gICAgICAgICAgcmV0dXJuIChpbmRleFtrZXldIGFzIE1pZ3JhdGlvbkluZGV4W1wiY29sdW1uc1wiXSkubWFwKChjb2wpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhjb2wpXG4gICAgICAgICAgICAgIC50b1NvcnRlZCgpXG4gICAgICAgICAgICAgIC5tYXAoKGspID0+IGAke2t9PSR7Y29sW2sgYXMga2V5b2YgdHlwZW9mIGNvbF19YClcbiAgICAgICAgICAgICAgLmpvaW4oXCIvL1wiKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7a2V5fT0ke2luZGV4W2tleSBhcyBrZXlvZiBNaWdyYXRpb25JbmRleF19YDtcbiAgICAgIH0pXG4gICAgICAuam9pbihcIi8vXCIpO1xuICB9O1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFbnRpdHlJbmRleGVzID0gZW50aXR5SW5kZXhlcy5tYXAoc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0cyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWREYkluZGV4ZXMgPSBkYkluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMpO1xuICAvLyDruYTqtZDsl5DripQg7KCV6rec7ZmU65CcIHByZWRpY2F0ZeulvCDsk7DrkJgsIOyLpOygnCBtaWdyYXRpb24g7Lac66Cl7J2AIOybkOuzuCBTUUzsnYQg67O07KG07ZWc64ukLlxuICBjb25zdCBjb21wYXJpc29uRW50aXR5SW5kZXhlcyA9IGVudGl0eUluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4Q29tcGFyaXNvbkRlZmF1bHRzKTtcbiAgY29uc3QgY29tcGFyaXNvbkRiSW5kZXhlcyA9IGRiSW5kZXhlcy5tYXAoc2V0TWlncmF0aW9uSW5kZXhDb21wYXJpc29uRGVmYXVsdHMpO1xuICBjb25zdCBleHRyYUluZGV4ZXMgPSB7XG4gICAgZGI6IGRpZmYoY29tcGFyaXNvbkRiSW5kZXhlcywgY29tcGFyaXNvbkVudGl0eUluZGV4ZXMsIGlkZW50aXR5KSxcbiAgICBlbnRpdHk6IGRpZmYoY29tcGFyaXNvbkVudGl0eUluZGV4ZXMsIGNvbXBhcmlzb25EYkluZGV4ZXMsIGlkZW50aXR5KSxcbiAgfTtcbiAgaWYgKGV4dHJhSW5kZXhlcy5lbnRpdHkubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGFkZElkZW50aXRpZXMgPSBuZXcgU2V0KGV4dHJhSW5kZXhlcy5lbnRpdHkubWFwKGlkZW50aXR5KSk7XG4gICAgaW5kZXhlc1RvLmFkZCA9IGluZGV4ZXNUby5hZGQuY29uY2F0KFxuICAgICAgbm9ybWFsaXplZEVudGl0eUluZGV4ZXMuZmlsdGVyKChfLCBpbmRleCkgPT5cbiAgICAgICAgYWRkSWRlbnRpdGllcy5oYXMoaWRlbnRpdHkoY29tcGFyaXNvbkVudGl0eUluZGV4ZXNbaW5kZXhdKSksXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgaWYgKGV4dHJhSW5kZXhlcy5kYi5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZHJvcElkZW50aXRpZXMgPSBuZXcgU2V0KGV4dHJhSW5kZXhlcy5kYi5tYXAoaWRlbnRpdHkpKTtcbiAgICBpbmRleGVzVG8uZHJvcCA9IGluZGV4ZXNUby5kcm9wLmNvbmNhdChcbiAgICAgIG5vcm1hbGl6ZWREYkluZGV4ZXMuZmlsdGVyKChfLCBpbmRleCkgPT5cbiAgICAgICAgZHJvcElkZW50aXRpZXMuaGFzKGlkZW50aXR5KGNvbXBhcmlzb25EYkluZGV4ZXNbaW5kZXhdKSksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gaW5kZXhlc1RvO1xufVxuXG4vKipcbiAqIOyduOuNseyKpCDsgq3soJwg7KCV7J2YIOyDneyEsVxuICovXG5mdW5jdGlvbiBnZW5JbmRleERyb3BEZWZpbml0aW9uKGluZGV4OiBNaWdyYXRpb25JbmRleCkge1xuICByZXR1cm4gYHRhYmxlLmRyb3BJbmRleChbJHtpbmRleC5jb2x1bW5zXG4gICAgLm1hcCgoY29sdW1uKSA9PiBgJyR7Y29sdW1uLm5hbWV9J2ApXG4gICAgLmpvaW4oXCIsXCIpfV0sICcke2luZGV4Lm5hbWV9JylgO1xufVxuXG4vKipcbiAqIERCIOyhsO2ajCDqsrDqs7zsmYAg67mE6rWQ7ZWY6riwIOychO2VnCDsnbjrjbHsiqQg6riw67O46rCSIOyEpOyglVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0cyhpbmRleDogTWlncmF0aW9uSW5kZXgpOiBNaWdyYXRpb25JbmRleCB7XG4gIHJldHVybiBzZXRNaWdyYXRpb25JbmRleERlZmF1bHRzQmFzZShpbmRleCwgZmFsc2UpO1xufVxuXG5mdW5jdGlvbiBzZXRNaWdyYXRpb25JbmRleENvbXBhcmlzb25EZWZhdWx0cyhpbmRleDogTWlncmF0aW9uSW5kZXgpOiBNaWdyYXRpb25JbmRleCB7XG4gIC8vIERCIGNhbm9uaWNhbCBTUUzqs7wgZW50aXR5IFNRTOydmCDtkZztmIQg7LCo7J2066W8IGRpZmYgaWRlbnRpdHnsl5DshJzrp4wg7Z2h7IiY7ZWc64ukLlxuICByZXR1cm4gc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0c0Jhc2UoaW5kZXgsIHRydWUpO1xufVxuXG5mdW5jdGlvbiBzZXRNaWdyYXRpb25JbmRleERlZmF1bHRzQmFzZShcbiAgaW5kZXg6IE1pZ3JhdGlvbkluZGV4LFxuICBub3JtYWxpemVXaGVyZUZvckNvbXBhcmlzb246IGJvb2xlYW4sXG4pOiBNaWdyYXRpb25JbmRleCB7XG4gIGNvbnN0IGlzVmVjdG9ySW5kZXggPSBpbmRleC50eXBlID09PSBcImhuc3dcIiB8fCBpbmRleC50eXBlID09PSBcIml2ZmZsYXRcIjtcbiAgY29uc3Qgc3VwcG9ydHNPcmRlcmluZyA9ICFpc1ZlY3RvckluZGV4ICYmICghaW5kZXgudXNpbmcgfHwgaW5kZXgudXNpbmcgPT09IFwiYnRyZWVcIik7XG4gIGNvbnN0IG5vcm1hbGl6ZWRVc2luZyA9IGlzVmVjdG9ySW5kZXggPyBpbmRleC51c2luZyA6IChpbmRleC51c2luZyA/PyBcImJ0cmVlXCIpO1xuICBjb25zdCBub3JtYWxpemVkV2hlcmUgPSBub3JtYWxpemVXaGVyZUZvckNvbXBhcmlzb25cbiAgICA/IG5vcm1hbGl6ZUluZGV4V2hlcmVQcmVkaWNhdGVGb3JDb21wYXJpc29uKGluZGV4LndoZXJlKVxuICAgIDogbm9ybWFsaXplSW5kZXhXaGVyZVByZWRpY2F0ZShpbmRleC53aGVyZSk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5pbmRleCxcbiAgICBjb2x1bW5zOiBpbmRleC5jb2x1bW5zLm1hcCgoY29sKSA9PiAoe1xuICAgICAgbmFtZTogY29sLm5hbWUsXG4gICAgICAuLi4oZ2V0SW5kZXhDb2x1bW5PcGNsYXNzKGNvbCkgPyB7IG9wY2xhc3M6IGdldEluZGV4Q29sdW1uT3BjbGFzcyhjb2wpIH0gOiB7fSksXG4gICAgICAuLi4oc3VwcG9ydHNPcmRlcmluZ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHNvcnRPcmRlcjogY29sLnNvcnRPcmRlciA/PyBcIkFTQ1wiLFxuICAgICAgICAgICAgbnVsbHNGaXJzdDogY29sLm51bGxzRmlyc3QgPz8gY29sLnNvcnRPcmRlciA9PT0gXCJERVNDXCIsXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICB9KSksXG4gICAgbnVsbHNOb3REaXN0aW5jdDogaW5kZXgubnVsbHNOb3REaXN0aW5jdCA/PyBmYWxzZSxcbiAgICAuLi4obm9ybWFsaXplZFVzaW5nID8geyB1c2luZzogbm9ybWFsaXplZFVzaW5nIH0gOiB7fSksXG4gICAgLi4uKG5vcm1hbGl6ZWRXaGVyZSA/IHsgd2hlcmU6IG5vcm1hbGl6ZWRXaGVyZSB9IDoge30pLFxuICB9O1xufVxuXG4vKipcbiAqIO2FjOydtOu4lCDrs4Dqsr0g7LyA7J207IqkIC0gRm9yZWlnbiBLZXkg67OA6rK9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWx0ZXJDb2RlX0ZvcmVpZ25zKFxuICB0YWJsZTogc3RyaW5nLFxuICBlbnRpdHlGb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuICBkYkZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4gIGRyb3BwaW5nQ29sdW1uczogTWlncmF0aW9uQ29sdW1uW10gPSBbXSxcbik6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gIC8vIGNvbnNvbGUubG9nKHsgZW50aXR5Rm9yZWlnbnMsIGRiRm9yZWlnbnMgfSk7XG5cbiAgY29uc3QgZ2V0S2V5ID0gKG1mOiBNaWdyYXRpb25Gb3JlaWduKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gW21mLmNvbHVtbnMuam9pbihcIi1cIiksIG1mLnRvXS5qb2luKFwiLy8vXCIpO1xuICB9O1xuXG4gIC8vIOyCreygnOuQoCDsu6zrn7zrqoUg66qp66GdXG4gIGNvbnN0IGRyb3BwaW5nQ29sdW1uTmFtZXMgPSBkcm9wcGluZ0NvbHVtbnMubWFwKChjb2wpID0+IGNvbC5uYW1lKTtcblxuICBjb25zdCBma1RvID0gZW50aXR5Rm9yZWlnbnMucmVkdWNlKFxuICAgIChyZXN1bHQsIGVudGl0eUYpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nRGJGID0gZGJGb3JlaWducy5maW5kKChkYkYpID0+IGdldEtleShlbnRpdHlGKSA9PT0gZ2V0S2V5KGRiRikpO1xuICAgICAgaWYgKCFtYXRjaGluZ0RiRikge1xuICAgICAgICByZXN1bHQuYWRkLnB1c2goZW50aXR5Rik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGlmICghZXF1YWwoZW50aXR5RiwgbWF0Y2hpbmdEYkYpKSB7XG4gICAgICAgIHJlc3VsdC5hbHRlclNyYy5wdXNoKG1hdGNoaW5nRGJGKTtcbiAgICAgICAgcmVzdWx0LmFsdGVyRHN0LnB1c2goZW50aXR5Rik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gICAge1xuICAgICAgYWRkOiBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgICBkcm9wOiBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgICBhbHRlclNyYzogW10gYXMgTWlncmF0aW9uRm9yZWlnbltdLFxuICAgICAgYWx0ZXJEc3Q6IFtdIGFzIE1pZ3JhdGlvbkZvcmVpZ25bXSxcbiAgICB9LFxuICApO1xuXG4gIC8vIGRiRm9yZWlnbnPsl5DripQg7J6I7KeA66eMIGVudGl0eUZvcmVpZ25z7JeQ64qUIOyXhuuKlCDqsr3smrAgKOyCreygnOuQnCBGSylcbiAgLy8g64uoLCDsgq3soJzrkKAg7Lus65+87J2YIEZL64qUIOygnOyZuCAoZ2VuZXJhdGVBbHRlckNvZGVfQ29sdW1uQW5kSW5kZXhlc+yXkOyEnCDsspjrpqwpXG4gIGRiRm9yZWlnbnMuZm9yRWFjaCgoZGJGKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hpbmdFbnRpdHlGID0gZW50aXR5Rm9yZWlnbnMuZmluZCgoZW50aXR5RikgPT4gZ2V0S2V5KGVudGl0eUYpID09PSBnZXRLZXkoZGJGKSk7XG4gICAgaWYgKCFtYXRjaGluZ0VudGl0eUYpIHtcbiAgICAgIC8vIOydtCBGS+ydmCDsu6zrn7zsnbQg7IKt7KCc65CgIOy7rOufvCDrqqnroZ3sl5Ag7J6I64qU7KeAIO2ZleyduFxuICAgICAgY29uc3QgaXNDb2x1bW5Ecm9wcGluZyA9IGRiRi5jb2x1bW5zLnNvbWUoKGNvbCkgPT4gZHJvcHBpbmdDb2x1bW5OYW1lcy5pbmNsdWRlcyhjb2wpKTtcbiAgICAgIC8vIOy7rOufvOydtCDsgq3soJzrkJjsp4Ag7JWK64qUIOqyveyasOyXkOunjCBGSyBkcm9wIOuqqeuhneyXkCDstpTqsIBcbiAgICAgIGlmICghaXNDb2x1bW5Ecm9wcGluZykge1xuICAgICAgICBma1RvLmRyb3AucHVzaChkYkYpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgbGluZXNUbyA9IHtcbiAgICBhZGQ6IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZmtUby5hZGQpLFxuICAgIGRyb3A6IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZmtUby5kcm9wKSxcbiAgICBhbHRlclNyYzogZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBma1RvLmFsdGVyU3JjKSxcbiAgICBhbHRlckRzdDogZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBma1RvLmFsdGVyRHN0KSxcbiAgfTtcblxuICAvLyBkcm9wIGZrIGNvbHVtbnPsnbgg6rK97JqwKOyDneyEseuQoCDsvZTrk5wg7JeG64qUIOqyveyasCkg7Yyo7IqkXG4gIGNvbnN0IGhhc0xpbmVzID0gT2JqZWN0LnZhbHVlcyhsaW5lc1RvKS5zb21lKChsKSA9PiBsLnVwLmxlbmd0aCA+IDAgfHwgbC5kb3duLmxlbmd0aCA+IDApO1xuICBpZiAoIWhhc0xpbmVzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYgKFxuICAgIGxpbmVzVG8uYWRkLnVwLmxlbmd0aCA9PT0gMCAmJlxuICAgIGxpbmVzVG8uZHJvcC51cC5sZW5ndGggPT09IDAgJiZcbiAgICBsaW5lc1RvLmFsdGVyU3JjLnVwLmxlbmd0aCA9PT0gMCAmJlxuICAgIGxpbmVzVG8uYWx0ZXJEc3QudXAubGVuZ3RoID09PSAwXG4gICkge1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZW5lcmF0ZUFsdGVyQ29kZV9Gb3JlaWduczpma0NoYW5nZUNvZGVHZW5lcmF0aW9uRXJyb3JcIiwge1xuICAgICAgdGFibGUsXG4gICAgICBlbnRpdHlGb3JlaWducyxcbiAgICAgIGRiRm9yZWlnbnMsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRksg67OA6rK9IOy9lOuTnCDsg53shLEg7Jik66WYXCIpO1xuICB9XG5cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICdpbXBvcnQgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjsnLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGByZXR1cm4ga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsXG4gICAgLi4ubGluZXNUby5kcm9wLmRvd24sXG4gICAgLi4ubGluZXNUby5hZGQudXAsXG4gICAgLi4ubGluZXNUby5hbHRlclNyYy5kb3duLFxuICAgIC4uLmxpbmVzVG8uYWx0ZXJEc3QudXAsXG4gICAgXCJ9KVwiLFxuICAgIFwifVwiLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bihrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgYHJldHVybiBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCxcbiAgICAuLi5saW5lc1RvLmFkZC5kb3duLFxuICAgIC4uLmxpbmVzVG8uYWx0ZXJEc3QuZG93bixcbiAgICAuLi5saW5lc1RvLmFsdGVyU3JjLnVwLFxuICAgIC4uLmxpbmVzVG8uZHJvcC51cCxcbiAgICBcIn0pXCIsXG4gICAgXCJ9XCIsXG4gIF07XG5cbiAgY29uc3QgZm9ybWF0dGVkID0gYXdhaXQgZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBgc3JjL21pZ3JhdGlvbi8ke3RhYmxlfS50c2ApO1xuICBjb25zdCB0aXRsZSA9IFtcImFsdGVyXCIsIHRhYmxlLCBcImZvcmVpZ25zXCJdLmpvaW4oXCJfXCIpO1xuXG4gIHJldHVybiBbXG4gICAge1xuICAgICAgdGFibGUsXG4gICAgICB0aXRsZSxcbiAgICAgIGZvcm1hdHRlZCxcbiAgICAgIHR5cGU6IFwibm9ybWFsXCIsXG4gICAgfSxcbiAgXTtcbn1cblxuLyoqXG4gKiDso7zslrTsp4QgRW50aXR5U2V07J2EIOq4sOuwmOycvOuhnCDthYzsnbTruJQgQ1JFQVRFIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5zrpbwg7IOd7ISx7ZWp64uI64ukLlxuICogQHBhcmFtIGVudGl0eVNldFxuICogQHJldHVybnMgQ1JFQVRFIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5xcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQ3JlYXRlQ29kZShlbnRpdHlTZXQ6IE1pZ3JhdGlvblNldCk6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gIHJldHVybiBbXG4gICAgYXdhaXQgZ2VuZXJhdGVDcmVhdGVDb2RlX0NvbHVtbkFuZEluZGV4ZXMoXG4gICAgICBlbnRpdHlTZXQudGFibGUsXG4gICAgICBlbnRpdHlTZXQuY29sdW1ucyxcbiAgICAgIGVudGl0eVNldC5pbmRleGVzLFxuICAgICksXG4gICAgLi4uKGF3YWl0IGdlbmVyYXRlQ3JlYXRlQ29kZV9Gb3JlaWduKGVudGl0eVNldC50YWJsZSwgZW50aXR5U2V0LmZvcmVpZ25zKSksXG4gIF07XG59XG5cbi8qKlxuICog7KO87Ja07KeEIGVudGl0eVNldOydhCDrqqntkZzroZwsIGRiU2V07J2EIO2YhCDsg4HtmansnLzroZwg7ZWY7JesIO2FjOydtOu4lCBBTFRFUiDrp4jsnbTqt7jroIjsnbTshZgg7L2U65Oc66W8IOyDneyEse2VqeuLiOuLpC5cbiAqIEBwYXJhbSBlbnRpdHlTZXQg7ZiEIOyDge2ZqeydmCBNaWdyYXRpb25TZXRcbiAqIEBwYXJhbSBkYlNldCDrqqntkZwg7IOB7Zmp7J2YIE1pZ3JhdGlvblNldFxuICogQHBhcmFtIGNvbXBhcmVEQiBQSyDtg4DsnoUg67OA6rK9IOyLnCDsl63ssLjsobAgRkvrpbwg7KGw7ZqM7ZWY6riwIOychO2VnCBLbmV4IOyduOyKpO2EtOyKpCAo7ISg7YOdKVxuICogQHJldHVybnMgQUxURVIg66eI7J206re466CI7J207IWYIOy9lOuTnFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBbHRlckNvZGUoXG4gIGVudGl0eVNldDogTWlncmF0aW9uU2V0LFxuICBkYlNldDogTWlncmF0aW9uU2V0LFxuICBjb21wYXJlREI/OiBLbmV4LFxuKTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgY29uc3QgcmVwbGFjZUNvbHVtbkRlZmF1bHRUbyA9IChjb2w6IE1pZ3JhdGlvbkNvbHVtbikgPT4ge1xuICAgIC8vIGZsb2F07J24IOqyveyasCDquLDrs7jqsJLsnYQgMOycvOuhnCDsp4DsoJXtlZjripQg6rK97JqwIFwiMC4wMFwi7Jy866GcIOuzgO2ZmOuQmOuKlCDsvIDsnbTsiqQg64yA7J2RXG4gICAgLy8gaWYgKGNvbC50eXBlID09PSBcImZsb2F0XCIgJiYgY29sLmRlZmF1bHRUbyAmJiBTdHJpbmcoY29sLmRlZmF1bHRUbykuaW5jbHVkZXMoJ1wiJykgPT09IGZhbHNlKSB7XG4gICAgLy8gICBjb2wuZGVmYXVsdFRvID0gYFwiJHtOdW1iZXIoY29sLmRlZmF1bHRUbykudG9GaXhlZChjb2wuc2NhbGUgPz8gMil9XCJgO1xuICAgIC8vIH1cbiAgICAvLyAvLyBzdHJpbmfsnbgg6rK97JqwIOq4sOuzuOqwkuydtCDruYgg7Iqk7Yq466eB7J24IOqyveyasCDrjIDsnZFcbiAgICAvLyBpZiAoY29sLnR5cGUgPT09IFwic3RyaW5nXCIgJiYgY29sLmRlZmF1bHRUbyA9PT0gXCJcIikge1xuICAgIC8vICAgY29sLmRlZmF1bHRUbyA9ICdcIlwiJztcbiAgICAvLyB9XG4gICAgLy8gLy8gYm9vbGVhbuyduCDqsr3smrAg6riw67O46rCSIOygleq3nO2ZlCAoTXlTUUzsl5DshJzripQgVElOWUlOVCgxKeuhnCDsoIDsnqXrkJjrr4DroZwgMCDrmJDripQgMeuhnCDsoJXqt5ztmZQpXG4gICAgLy8gLy8gVE9ETzogZGIudHPsl5AgdHlwZUNhc2Ug7ISk7KCVIO2ZleyduO2VmOyXrCDsspjrpqztlZjrj4TroZ0g7IiY7KCVIO2VhOyalFxuICAgIC8vIGlmIChjb2wudHlwZSA9PT0gXCJib29sZWFuXCIgJiYgY29sLmRlZmF1bHRUbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gICBpZiAoY29sLmRlZmF1bHRUbyA9PT0gXCIwXCIgfHwgY29sLmRlZmF1bHRUby50b0xvd2VyQ2FzZSgpID09PSBcImZhbHNlXCIpIHtcbiAgICAvLyAgICAgY29sLmRlZmF1bHRUbyA9IFwiMFwiO1xuICAgIC8vICAgfSBlbHNlIGlmIChjb2wuZGVmYXVsdFRvID09PSBcIjFcIiB8fCBjb2wuZGVmYXVsdFRvLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiKSB7XG4gICAgLy8gICAgIGNvbC5kZWZhdWx0VG8gPSBcIjFcIjtcbiAgICAvLyAgIH1cbiAgICAvLyB9XG5cbiAgICAvLyBGSVhNRTog7J2864uoIE15U1FMIOyDge2ZqeyXkOyEnCDrsJzsg53tlojrjZgg7J207IqI7J2YIHdvcmthcm91bmQg7J2066+A66GcIFBn7JeQ7IScIOyerO2ZleyduCDtm4Qg64yA7J2RIOy2lOqwgFxuICAgIHJldHVybiBjb2w7XG4gIH07XG4gIGNvbnN0IGVudGl0eUNvbHVtbnMgPSBhbHBoYWJldGljYWwoZW50aXR5U2V0LmNvbHVtbnMsIChhKSA9PiBhLm5hbWUpLm1hcChyZXBsYWNlQ29sdW1uRGVmYXVsdFRvKTtcbiAgY29uc3QgZGJDb2x1bW5zID0gYWxwaGFiZXRpY2FsKGRiU2V0LmNvbHVtbnMsIChhKSA9PiBhLm5hbWUpLm1hcChyZXBsYWNlQ29sdW1uRGVmYXVsdFRvKTtcblxuICAvKiDrlJTrsoTquYXsmqkg7L2U65OcLCDtirnsoJUg7Lus65+87JeQ7IScIOu2iOydvOy5mCDrsJzsg53tlaAg65WMIO2ZleyduFxuICAgICAgICBjb25zdCBlbnRpdHlDb2x1bW4gPSBlbnRpdHlTZXQuY29sdW1ucy5maW5kKFxuICAgICAgICAgIChjb2wpID0+IGNvbC5uYW1lID09PSBcInByaWNlX2tyd1wiXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRiQ29sdW1uID0gZGJTZXQuY29sdW1ucy5maW5kKFxuICAgICAgICAgIChjb2wpID0+IGNvbC5uYW1lID09PSBcInByaWNlX2tyd1wiXG4gICAgICAgICk7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoeyBlbnRpdHlDb2x1bW4sIGRiQ29sdW1uIH0pO1xuICAgICAgICAgKi9cblxuICBjb25zdCBlbnRpdHlJbmRleGVzID0gYWxwaGFiZXRpY2FsKGVudGl0eVNldC5pbmRleGVzLCAoYSkgPT5cbiAgICBbYS50eXBlLCAuLi5hLmNvbHVtbnMubWFwKChjKSA9PiBjLm5hbWUpXS5qb2luKFwiLVwiKSxcbiAgKTtcbiAgY29uc3QgZGJJbmRleGVzID0gYWxwaGFiZXRpY2FsKGRiU2V0LmluZGV4ZXMsIChhKSA9PlxuICAgIFthLnR5cGUsIC4uLmEuY29sdW1ucy5tYXAoKGMpID0+IGMubmFtZSldLmpvaW4oXCItXCIpLFxuICApO1xuXG4gIGNvbnN0IHJlcGxhY2VOb0FjdGlvbk9uTXlTUUwgPSAoZjogTWlncmF0aW9uRm9yZWlnbikgPT4ge1xuICAgIC8vIE15U1FM7JeQ7IScIFJFU1RSSUNU7JmAIE5PIEFDVElPTuydgCDrj5nsnbztlahcbiAgICBjb25zdCB7IG9uRGVsZXRlLCBvblVwZGF0ZSB9ID0gZjtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZixcbiAgICAgIG9uVXBkYXRlOiBvblVwZGF0ZSA9PT0gXCJSRVNUUklDVFwiID8gXCJOTyBBQ1RJT05cIiA6IG9uVXBkYXRlLFxuICAgICAgb25EZWxldGU6IG9uRGVsZXRlID09PSBcIlJFU1RSSUNUXCIgPyBcIk5PIEFDVElPTlwiIDogb25EZWxldGUsXG4gICAgfTtcbiAgfTtcblxuICBjb25zdCBlbnRpdHlGb3JlaWducyA9IGFscGhhYmV0aWNhbChlbnRpdHlTZXQuZm9yZWlnbnMsIChhKSA9PlxuICAgIFthLnRvLCAuLi5hLmNvbHVtbnNdLmpvaW4oXCItXCIpLFxuICApLm1hcCgoZikgPT4gcmVwbGFjZU5vQWN0aW9uT25NeVNRTChmKSk7XG4gIGNvbnN0IGRiRm9yZWlnbnMgPSBhbHBoYWJldGljYWwoZGJTZXQuZm9yZWlnbnMsIChhKSA9PiBbYS50bywgLi4uYS5jb2x1bW5zXS5qb2luKFwiLVwiKSkubWFwKChmKSA9PlxuICAgIHJlcGxhY2VOb0FjdGlvbk9uTXlTUUwoZiksXG4gICk7XG5cbiAgLy8g7IKt7KCc65CgIOy7rOufvCDrqqnroZ0g6rOE7IKwXG4gIGNvbnN0IGRyb3BwaW5nQ29sdW1ucyA9IGRpZmYoZGJDb2x1bW5zLCBlbnRpdHlDb2x1bW5zLCAoY29sKSA9PiBjb2wubmFtZSk7XG5cbiAgY29uc3QgYWx0ZXJDb2RlczogKEdlbk1pZ3JhdGlvbkNvZGUgfCBHZW5NaWdyYXRpb25Db2RlW10gfCBudWxsKVtdID0gW107XG5cbiAgLy8gMS4gY29sdW1uc0FuZEluZGV4ZXMg7LKY66asXG4gIGNvbnN0IHNlYXJjaFRleHRDb2x1bW5OYW1lcyA9IGdldFNlYXJjaFRleHRDb2x1bW5OYW1lcyhlbnRpdHlTZXQudGFibGUpO1xuICBjb25zdCBpc0VxdWFsQ29sdW1ucyA9IGVxdWFsKFxuICAgIGVudGl0eUNvbHVtbnMubWFwKChjb2x1bW4pID0+IG5vcm1hbGl6ZUNvbHVtbkZvckNvbXBhcmlzb24oY29sdW1uLCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMpKSxcbiAgICBkYkNvbHVtbnMubWFwKChjb2x1bW4pID0+IG5vcm1hbGl6ZUNvbHVtbkZvckNvbXBhcmlzb24oY29sdW1uLCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMpKSxcbiAgKTtcbiAgY29uc3QgaXNFcXVhbEluZGV4ZXMgPSBlcXVhbChcbiAgICBlbnRpdHlJbmRleGVzLm1hcChzZXRNaWdyYXRpb25JbmRleERlZmF1bHRzKSxcbiAgICBkYkluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMpLFxuICApO1xuICBpZiAoIWlzRXF1YWxDb2x1bW5zIHx8ICFpc0VxdWFsSW5kZXhlcykge1xuICAgIGFsdGVyQ29kZXMucHVzaChcbiAgICAgIGF3YWl0IGdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXMoXG4gICAgICAgIGVudGl0eVNldC50YWJsZSxcbiAgICAgICAgZW50aXR5Q29sdW1ucyxcbiAgICAgICAgZW50aXR5SW5kZXhlcyxcbiAgICAgICAgZGJDb2x1bW5zLFxuICAgICAgICBkYkluZGV4ZXMsXG4gICAgICAgIGRiU2V0LmZvcmVpZ25zLFxuICAgICAgICBjb21wYXJlREIsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiBmb3JlaWducyDsspjrpqwgKOyCreygnOuQoCDsu6zrn7wg7KCV67O0IOyghOuLrClcbiAgaWYgKCFlcXVhbChlbnRpdHlGb3JlaWducywgZGJGb3JlaWducykpIHtcbiAgICBhbHRlckNvZGVzLnB1c2goXG4gICAgICBhd2FpdCBnZW5lcmF0ZUFsdGVyQ29kZV9Gb3JlaWducyhcbiAgICAgICAgZW50aXR5U2V0LnRhYmxlLFxuICAgICAgICBlbnRpdHlGb3JlaWducyxcbiAgICAgICAgZGJGb3JlaWducyxcbiAgICAgICAgZHJvcHBpbmdDb2x1bW5zLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgaWYgKGFsdGVyQ29kZXMuZXZlcnkoKGFsdGVyQ29kZSkgPT4gYWx0ZXJDb2RlID09PSBudWxsKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBhbHRlckNvZGVzLmZpbHRlcigoYWx0ZXJDb2RlKSA9PiBhbHRlckNvZGUgIT09IG51bGwpLmZsYXQoKTtcbn1cblxuLyoqXG4gKiBQSyDtg4DsnoUg67OA6rK9IOyLnCDsl63ssLjsobAgRksg7KCc7JW97KGw6rG07J2EIOyymOumrO2VmOuKlCDrp4jsnbTqt7jroIjsnbTshZgg7L2U65Oc66W8IOyDneyEse2VqeuLiOuLpC5cbiAqXG4gKiBQSyDtg4DsnoUg67OA6rK9IOyLnCDsiJzshJw6XG4gKiAxLiBGSyDsoJzslb3sobDqsbQg7IKt7KCcICjsl63ssLjsobAg7YWM7J2067iU65OkKVxuICogMi4g7J6Q6riwIOywuOyhsCBGSyDsgq3soJwgKOyeiOuKlCDqsr3smrApXG4gKiAzLiBQSyDsoJzslb3sobDqsbQg7IKt7KCcXG4gKiA0LiBQSyDsu6zrn7wg7YOA7J6FIOuzgOqyvVxuICogNS4gRksg7Lus65+8IO2DgOyehSDrs4Dqsr0gKOyXreywuOyhsCDthYzsnbTruJTrk6QpXG4gKiA2LiBQSyDsoJzslb3sobDqsbQg67O16rWsXG4gKiA3LiDsnpDquLAg7LC47KGwIEZLIOuzteq1rFxuICogOC4gRksg7KCc7JW97KGw6rG0IOuzteq1rFxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBrVHlwZUNoYW5nZU1pZ3JhdGlvbihcbiAgdGFibGU6IHN0cmluZyxcbiAgZW50aXR5SWRDb2w6IE1pZ3JhdGlvbkNvbHVtbixcbiAgZGJJZENvbDogTWlncmF0aW9uQ29sdW1uLFxuICBfZW50aXR5Q29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gIF9lbnRpdHlJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLFxuICBfZGJDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgX2RiSW5kZXhlczogTWlncmF0aW9uSW5kZXhbXSxcbiAgX2RiRm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSxcbiAgY29tcGFyZURCOiBLbmV4LFxuKTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgLy8g7Jet7LC47KGwIEZLIOyhsO2ajCAo7J20IO2FjOydtOu4lOydmCBQS+ulvCDssLjsobDtlZjripQg64uk66W4IO2FjOydtOu4lOydmCBGS+uTpClcbiAgY29uc3QgcmVmZXJlbmNpbmdGS3MgPSBhd2FpdCBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyLmdldFJlZmVyZW5jaW5nRm9yZWlnbktleXMoY29tcGFyZURCLCB0YWJsZSk7XG5cbiAgLy8g7J6Q6riwIOywuOyhsCBGSyDrtoTrpqwgKOyYiDogRGVwYXJ0bWVudC5wYXJlbnRfaWQg4oaSIERlcGFydG1lbnQuaWQpXG4gIGNvbnN0IHNlbGZSZWZlcmVuY2luZ0ZLcyA9IHJlZmVyZW5jaW5nRktzLmZpbHRlcigoZmspID0+IGZrLnRhYmxlTmFtZSA9PT0gdGFibGUpO1xuICBjb25zdCBleHRlcm5hbFJlZmVyZW5jaW5nRktzID0gcmVmZXJlbmNpbmdGS3MuZmlsdGVyKChmaykgPT4gZmsudGFibGVOYW1lICE9PSB0YWJsZSk7XG5cbiAgLy8gUEsg7KCc7JW97KGw6rG0IOydtOumhCDsobDtmoxcbiAgY29uc3QgcGtDb25zdHJhaW50TmFtZSA9IGAke3RhYmxlfV9wa2V5YDtcblxuICAvLyDsg4ggUEsg7YOA7J6F7JeQIOunnuuKlCBQb3N0Z3JlU1FMIO2DgOyehSDrrLjsnpDsl7RcbiAgY29uc3QgbmV3UGtQZ1R5cGUgPSBnZXRQa1BnVHlwZShlbnRpdHlJZENvbCk7XG4gIGNvbnN0IG9sZFBrUGdUeXBlID0gZ2V0UGtQZ1R5cGUoZGJJZENvbCk7XG5cbiAgLy8gVVAg7L2U65OcIOyDneyEsVxuICBjb25zdCB1cExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIDEuIOyZuOu2gCDthYzsnbTruJTsnZggRksg7KCc7JW97KGw6rG0IOyCreygnFxuICBmb3IgKGNvbnN0IGZrIG9mIGV4dGVybmFsUmVmZXJlbmNpbmdGS3MpIHtcbiAgICB1cExpbmVzLnB1c2goYCAgLy8gJHtmay50YWJsZU5hbWV9LiR7ZmsuY29sdW1uTmFtZX0gRksg7KCc7JW97KGw6rG0IOyCreygnGApO1xuICAgIHVwTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7ZmsudGFibGVOYW1lfVwiIERST1AgQ09OU1RSQUlOVCBcIiR7ZmsuY29uc3RyYWludE5hbWV9XCInKTtgLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiDsnpDquLAg7LC47KGwIEZLIOyCreygnFxuICBmb3IgKGNvbnN0IGZrIG9mIHNlbGZSZWZlcmVuY2luZ0ZLcykge1xuICAgIHVwTGluZXMucHVzaChgICAvLyDsnpDquLAg7LC47KGwIEZLIOyCreygnDogJHtmay5jb2x1bW5OYW1lfWApO1xuICAgIHVwTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgRFJPUCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIicpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDMuIFBLIOygnOyVveyhsOqxtCDsgq3soJxcbiAgdXBMaW5lcy5wdXNoKGAgIC8vIFBLIOygnOyVveyhsOqxtCDsgq3soJxgKTtcbiAgdXBMaW5lcy5wdXNoKGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgRFJPUCBDT05TVFJBSU5UIFwiJHtwa0NvbnN0cmFpbnROYW1lfVwiJyk7YCk7XG5cbiAgLy8gNC4gUEsg7Lus65+8IO2DgOyehSDrs4Dqsr1cbiAgdXBMaW5lcy5wdXNoKGAgIC8vIFBLIOy7rOufvCDtg4DsnoUg67OA6rK9YCk7XG4gIHVwTGluZXMucHVzaChcbiAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIEFMVEVSIENPTFVNTiBcImlkXCIgVFlQRSAke25ld1BrUGdUeXBlfSBVU0lORyBcImlkXCI6OiR7bmV3UGtQZ1R5cGV9Jyk7YCxcbiAgKTtcblxuICAvLyA1LiBGSyDsu6zrn7wg7YOA7J6FIOuzgOqyvSAo7Jet7LC47KGwIO2FjOydtOu4lOuTpCkgLSDsnpDquLAg7LC47KGwIO2PrO2VqFxuICBmb3IgKGNvbnN0IGZrIG9mIHJlZmVyZW5jaW5nRktzKSB7XG4gICAgdXBMaW5lcy5wdXNoKGAgIC8vICR7ZmsudGFibGVOYW1lfS4ke2ZrLmNvbHVtbk5hbWV9IOy7rOufvCDtg4DsnoUg67OA6rK9YCk7XG4gICAgdXBMaW5lcy5wdXNoKFxuICAgICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHtmay50YWJsZU5hbWV9XCIgQUxURVIgQ09MVU1OIFwiJHtmay5jb2x1bW5OYW1lfVwiIFRZUEUgJHtuZXdQa1BnVHlwZX0gVVNJTkcgXCIke2ZrLmNvbHVtbk5hbWV9XCI6OiR7bmV3UGtQZ1R5cGV9Jyk7YCxcbiAgICApO1xuICB9XG5cbiAgLy8gNi4gUEsg7KCc7JW97KGw6rG0IOuzteq1rFxuICB1cExpbmVzLnB1c2goYCAgLy8gUEsg7KCc7JW97KGw6rG0IOuzteq1rGApO1xuICB1cExpbmVzLnB1c2goXG4gICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHt0YWJsZX1cIiBBREQgQ09OU1RSQUlOVCBcIiR7cGtDb25zdHJhaW50TmFtZX1cIiBQUklNQVJZIEtFWSAoXCJpZFwiKScpO2AsXG4gICk7XG5cbiAgLy8gNy4g7J6Q6riwIOywuOyhsCBGSyDrs7XqtaxcbiAgZm9yIChjb25zdCBmayBvZiBzZWxmUmVmZXJlbmNpbmdGS3MpIHtcbiAgICB1cExpbmVzLnB1c2goYCAgLy8g7J6Q6riwIOywuOyhsCBGSyDrs7Xqtaw6ICR7ZmsuY29sdW1uTmFtZX1gKTtcbiAgICB1cExpbmVzLnB1c2goXG4gICAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIEFERCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIiBGT1JFSUdOIEtFWSAoXCIke2ZrLmNvbHVtbk5hbWV9XCIpIFJFRkVSRU5DRVMgXCIke3RhYmxlfVwiKFwiaWRcIikgT04gVVBEQVRFICR7Zmsub25VcGRhdGV9IE9OIERFTEVURSAke2ZrLm9uRGVsZXRlfScpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDguIOyZuOu2gCDthYzsnbTruJTsnZggRksg7KCc7JW97KGw6rG0IOuzteq1rFxuICBmb3IgKGNvbnN0IGZrIG9mIGV4dGVybmFsUmVmZXJlbmNpbmdGS3MpIHtcbiAgICB1cExpbmVzLnB1c2goYCAgLy8gJHtmay50YWJsZU5hbWV9LiR7ZmsuY29sdW1uTmFtZX0gRksg7KCc7JW97KGw6rG0IOuzteq1rGApO1xuICAgIHVwTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7ZmsudGFibGVOYW1lfVwiIEFERCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIiBGT1JFSUdOIEtFWSAoXCIke2ZrLmNvbHVtbk5hbWV9XCIpIFJFRkVSRU5DRVMgXCIke3RhYmxlfVwiKFwiaWRcIikgT04gVVBEQVRFICR7Zmsub25VcGRhdGV9IE9OIERFTEVURSAke2ZrLm9uRGVsZXRlfScpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIERPV04g7L2U65OcIOyDneyEsSAo7Jet7IicKVxuICBjb25zdCBkb3duTGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gMS4g7Jm467aAIO2FjOydtOu4lOydmCBGSyDsoJzslb3sobDqsbQg7IKt7KCcXG4gIGZvciAoY29uc3QgZmsgb2YgZXh0ZXJuYWxSZWZlcmVuY2luZ0ZLcykge1xuICAgIGRvd25MaW5lcy5wdXNoKGAgIC8vICR7ZmsudGFibGVOYW1lfS4ke2ZrLmNvbHVtbk5hbWV9IEZLIOygnOyVveyhsOqxtCDsgq3soJxgKTtcbiAgICBkb3duTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7ZmsudGFibGVOYW1lfVwiIERST1AgQ09OU1RSQUlOVCBcIiR7ZmsuY29uc3RyYWludE5hbWV9XCInKTtgLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiDsnpDquLAg7LC47KGwIEZLIOyCreygnFxuICBmb3IgKGNvbnN0IGZrIG9mIHNlbGZSZWZlcmVuY2luZ0ZLcykge1xuICAgIGRvd25MaW5lcy5wdXNoKGAgIC8vIOyekOq4sCDssLjsobAgRksg7IKt7KCcOiAke2ZrLmNvbHVtbk5hbWV9YCk7XG4gICAgZG93bkxpbmVzLnB1c2goXG4gICAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIERST1AgQ09OU1RSQUlOVCBcIiR7ZmsuY29uc3RyYWludE5hbWV9XCInKTtgLFxuICAgICk7XG4gIH1cblxuICAvLyAzLiBQSyDsoJzslb3sobDqsbQg7IKt7KCcXG4gIGRvd25MaW5lcy5wdXNoKGAgIC8vIFBLIOygnOyVveyhsOqxtCDsgq3soJxgKTtcbiAgZG93bkxpbmVzLnB1c2goXG4gICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHt0YWJsZX1cIiBEUk9QIENPTlNUUkFJTlQgXCIke3BrQ29uc3RyYWludE5hbWV9XCInKTtgLFxuICApO1xuXG4gIC8vIDQuIFBLIOy7rOufvCDtg4DsnoUg7JuQ67O1XG4gIGRvd25MaW5lcy5wdXNoKGAgIC8vIFBLIOy7rOufvCDtg4DsnoUg7JuQ67O1YCk7XG4gIGRvd25MaW5lcy5wdXNoKFxuICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgQUxURVIgQ09MVU1OIFwiaWRcIiBUWVBFICR7b2xkUGtQZ1R5cGV9IFVTSU5HIFwiaWRcIjo6JHtvbGRQa1BnVHlwZX0nKTtgLFxuICApO1xuXG4gIC8vIDUuIEZLIOy7rOufvCDtg4DsnoUg7JuQ67O1ICjsl63ssLjsobAg7YWM7J2067iU65OkKVxuICBmb3IgKGNvbnN0IGZrIG9mIHJlZmVyZW5jaW5nRktzKSB7XG4gICAgZG93bkxpbmVzLnB1c2goYCAgLy8gJHtmay50YWJsZU5hbWV9LiR7ZmsuY29sdW1uTmFtZX0g7Lus65+8IO2DgOyehSDsm5Drs7VgKTtcbiAgICBkb3duTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7ZmsudGFibGVOYW1lfVwiIEFMVEVSIENPTFVNTiBcIiR7ZmsuY29sdW1uTmFtZX1cIiBUWVBFICR7b2xkUGtQZ1R5cGV9IFVTSU5HIFwiJHtmay5jb2x1bW5OYW1lfVwiOjoke29sZFBrUGdUeXBlfScpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDYuIFBLIOygnOyVveyhsOqxtCDrs7XqtaxcbiAgZG93bkxpbmVzLnB1c2goYCAgLy8gUEsg7KCc7JW97KGw6rG0IOuzteq1rGApO1xuICBkb3duTGluZXMucHVzaChcbiAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIEFERCBDT05TVFJBSU5UIFwiJHtwa0NvbnN0cmFpbnROYW1lfVwiIFBSSU1BUlkgS0VZIChcImlkXCIpJyk7YCxcbiAgKTtcblxuICAvLyA3LiDsnpDquLAg7LC47KGwIEZLIOuzteq1rFxuICBmb3IgKGNvbnN0IGZrIG9mIHNlbGZSZWZlcmVuY2luZ0ZLcykge1xuICAgIGRvd25MaW5lcy5wdXNoKGAgIC8vIOyekOq4sCDssLjsobAgRksg67O16rWsOiAke2ZrLmNvbHVtbk5hbWV9YCk7XG4gICAgZG93bkxpbmVzLnB1c2goXG4gICAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIEFERCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIiBGT1JFSUdOIEtFWSAoXCIke2ZrLmNvbHVtbk5hbWV9XCIpIFJFRkVSRU5DRVMgXCIke3RhYmxlfVwiKFwiaWRcIikgT04gVVBEQVRFICR7Zmsub25VcGRhdGV9IE9OIERFTEVURSAke2ZrLm9uRGVsZXRlfScpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDguIOyZuOu2gCDthYzsnbTruJTsnZggRksg7KCc7JW97KGw6rG0IOuzteq1rFxuICBmb3IgKGNvbnN0IGZrIG9mIGV4dGVybmFsUmVmZXJlbmNpbmdGS3MpIHtcbiAgICBkb3duTGluZXMucHVzaChgICAvLyAke2ZrLnRhYmxlTmFtZX0uJHtmay5jb2x1bW5OYW1lfSBGSyDsoJzslb3sobDqsbQg67O16rWsYCk7XG4gICAgZG93bkxpbmVzLnB1c2goXG4gICAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke2ZrLnRhYmxlTmFtZX1cIiBBREQgQ09OU1RSQUlOVCBcIiR7ZmsuY29uc3RyYWludE5hbWV9XCIgRk9SRUlHTiBLRVkgKFwiJHtmay5jb2x1bW5OYW1lfVwiKSBSRUZFUkVOQ0VTIFwiJHt0YWJsZX1cIihcImlkXCIpIE9OIFVQREFURSAke2ZrLm9uVXBkYXRlfSBPTiBERUxFVEUgJHtmay5vbkRlbGV0ZX0nKTtgLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG4gICAgJ2ltcG9ydCB7IEtuZXggfSBmcm9tIFwia25leFwiOycsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cChrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgLi4udXBMaW5lcyxcbiAgICBcIn1cIixcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd24oa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIC4uLmRvd25MaW5lcyxcbiAgICBcIn1cIixcbiAgXTtcblxuICBjb25zdCBmb3JtYXR0ZWQgPSBhd2FpdCBmb3JtYXRDb2RlKGxpbmVzLmpvaW4oXCJcXG5cIiksIGBzcmMvbWlncmF0aW9uLyR7dGFibGV9LnRzYCk7XG5cbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB0YWJsZSxcbiAgICAgIHRpdGxlOiBgYWx0ZXJfJHt0YWJsZX1fcGtfdHlwZWAsXG4gICAgICBmb3JtYXR0ZWQsXG4gICAgICB0eXBlOiBcIm5vcm1hbFwiLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKlxuICogUEsg7Lus65+87J2YIFBvc3RncmVTUUwg7YOA7J6FIOusuOyekOyXtOydhCDrsJjtmZjtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGdldFBrUGdUeXBlKGNvbDogTWlncmF0aW9uQ29sdW1uKTogc3RyaW5nIHtcbiAgaWYgKGNvbC50eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGNvbC5sZW5ndGggIT09IHVuZGVmaW5lZCA/IGB2YXJjaGFyKCR7Y29sLmxlbmd0aH0pYCA6IFwidGV4dFwiO1xuICB9XG4gIGlmIChjb2wudHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICByZXR1cm4gXCJ1dWlkXCI7XG4gIH1cbiAgLy8gaW50ZWdlcuydmCDqsr3smrAgc2VyaWFsL2ludGVnZXIg6rWs67aE7J20IO2VhOyalO2VmOyngOunjCxcbiAgLy8g7YOA7J6FIOuzgOqyvSDsi5zsl5DripQgaW50ZWdlcuuhnCDsspjrpqztlanri4jri6QuXG4gIHJldHVybiBcImludGVnZXJcIjtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBK1JBLFNBQVMsc0JBQXNCLFFBQStEO0FBQzVGLFFBQU8sT0FBTyxXQUFXLE9BQU87O0FBR2xDLFNBQVMsNkJBQTZCLFlBQWlEO0NBQ3JGLE1BQU1BLFNBQXNDLEVBQUU7Q0FDOUMsSUFBSSxRQUFRO0FBRVosUUFBTyxRQUFRLFdBQVcsUUFBUTtFQUNoQyxNQUFNLE9BQU8sV0FBVztBQUV4QixNQUFJLFNBQVMsV0FBVztBQUN0Qjs7QUFHRixNQUFJLEtBQUssS0FBSyxLQUFLLEVBQUU7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