@pathscale/rsbuild-plugin-ui-css-purge 0.9.2 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,15 +5,29 @@ var __getProtoOf = Object.getPrototypeOf;
5
5
  var __defProp = Object.defineProperty;
6
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ function __accessProp(key) {
9
+ return this[key];
10
+ }
11
+ var __toESMCache_node;
12
+ var __toESMCache_esm;
8
13
  var __toESM = (mod, isNodeMode, target) => {
14
+ var canCache = mod != null && typeof mod === "object";
15
+ if (canCache) {
16
+ var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
17
+ var cached = cache.get(mod);
18
+ if (cached)
19
+ return cached;
20
+ }
9
21
  target = mod != null ? __create(__getProtoOf(mod)) : {};
10
22
  const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
11
23
  for (let key of __getOwnPropNames(mod))
12
24
  if (!__hasOwnProp.call(to, key))
13
25
  __defProp(to, key, {
14
- get: () => mod[key],
26
+ get: __accessProp.bind(mod, key),
15
27
  enumerable: true
16
28
  });
29
+ if (canCache)
30
+ cache.set(mod, to);
17
31
  return to;
18
32
  };
19
33
  var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
@@ -845,9 +859,8 @@ import postcss from "postcss";
845
859
  // src/scan-consumer.ts
846
860
  import swc from "@swc/core";
847
861
  var {Glob } = globalThis.Bun;
848
- import path from "path";
849
862
  function walkAST(node, visitor) {
850
- if (!node || typeof node !== "object")
863
+ if (!isRecord(node))
851
864
  return;
852
865
  visitor(node);
853
866
  for (const key of Object.keys(node)) {
@@ -862,74 +875,197 @@ function walkAST(node, visitor) {
862
875
  }
863
876
  }
864
877
  }
865
- function extractUIImports(ast) {
866
- const imports = new Map;
867
- for (const node of ast.body) {
868
- if (node.type !== "ImportDeclaration")
869
- continue;
870
- const src = node.source?.value;
871
- if (!src || !src.startsWith("@pathscale/ui"))
872
- continue;
873
- for (const spec of node.specifiers) {
874
- if (spec.type === "ImportSpecifier") {
875
- const imported = spec.imported?.value ?? spec.local?.value;
876
- const local = spec.local?.value;
877
- if (local && imported)
878
- imports.set(local, imported);
879
- } else if (spec.type === "ImportDefaultSpecifier") {
880
- const local = spec.local?.value;
881
- if (local)
882
- imports.set(local, local);
878
+ function kebabToPascal(s) {
879
+ return s.split("-").filter(Boolean).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join("");
880
+ }
881
+ function componentFromDeepImport(source) {
882
+ const match = source.match(/^@pathscale\/ui\/components\/([^/]+)/);
883
+ if (!match)
884
+ return null;
885
+ return kebabToPascal(match[1]);
886
+ }
887
+ function isUiImport(source) {
888
+ return Boolean(source?.startsWith("@pathscale/ui"));
889
+ }
890
+ function isRecord(v) {
891
+ return v !== null && typeof v === "object" && !Array.isArray(v);
892
+ }
893
+ function getString(value, key) {
894
+ if (!isRecord(value))
895
+ return;
896
+ const prop = value[key];
897
+ return typeof prop === "string" ? prop : undefined;
898
+ }
899
+ function getBoolean(value, key) {
900
+ if (!isRecord(value))
901
+ return false;
902
+ return value[key] === true;
903
+ }
904
+ function getPathString(value, ...keys) {
905
+ let current = value;
906
+ for (const key of keys) {
907
+ if (!isRecord(current))
908
+ return;
909
+ current = current[key];
910
+ }
911
+ return typeof current === "string" ? current : undefined;
912
+ }
913
+ function getArray(value, key) {
914
+ if (!isRecord(value))
915
+ return [];
916
+ const prop = value[key];
917
+ return Array.isArray(prop) ? prop : [];
918
+ }
919
+ function joinPath(base, rel) {
920
+ return `${base.replace(/\/+$/, "")}/${rel.replace(/^\/+/, "")}`;
921
+ }
922
+ function canonicalImportedName(spec, source) {
923
+ const type = getString(spec, "type");
924
+ if (getBoolean(spec, "isTypeOnly"))
925
+ return null;
926
+ const deepComponent = componentFromDeepImport(source);
927
+ if (deepComponent) {
928
+ return deepComponent;
929
+ }
930
+ if (source === "@pathscale/ui" && type === "ImportSpecifier") {
931
+ return getPathString(spec, "imported", "value") ?? getPathString(spec, "local", "value") ?? null;
932
+ }
933
+ return null;
934
+ }
935
+ function conservativeUsage(component, source) {
936
+ return {
937
+ component,
938
+ props: new Map,
939
+ booleanProps: new Set,
940
+ hasSpread: true,
941
+ source
942
+ };
943
+ }
944
+ function extractUIBindings(ast) {
945
+ const bindings = {
946
+ components: new Map,
947
+ namespaces: new Map,
948
+ conservativeUsages: []
949
+ };
950
+ for (const node of getArray(ast, "body")) {
951
+ const nodeType = getString(node, "type");
952
+ if (nodeType === "ImportDeclaration") {
953
+ const source = getPathString(node, "source", "value");
954
+ if (!isUiImport(source))
955
+ continue;
956
+ for (const spec of getArray(node, "specifiers")) {
957
+ const specType = getString(spec, "type");
958
+ if (specType === "ImportSpecifier") {
959
+ const local = getPathString(spec, "local", "value");
960
+ const canonical = canonicalImportedName(spec, source);
961
+ if (local && canonical)
962
+ bindings.components.set(local, canonical);
963
+ } else if (specType === "ImportDefaultSpecifier") {
964
+ const local = getPathString(spec, "local", "value");
965
+ const canonical = componentFromDeepImport(source) ?? local;
966
+ if (local && canonical)
967
+ bindings.components.set(local, canonical);
968
+ } else if (specType === "ImportNamespaceSpecifier") {
969
+ const local = getPathString(spec, "local", "value");
970
+ if (local)
971
+ bindings.namespaces.set(local, componentFromDeepImport(source));
972
+ }
883
973
  }
884
974
  }
975
+ if (nodeType === "ExportNamedDeclaration" && isUiImport(getPathString(node, "source", "value"))) {
976
+ const source = getPathString(node, "source", "value");
977
+ if (!source)
978
+ continue;
979
+ const deepComponent = componentFromDeepImport(source);
980
+ for (const spec of getArray(node, "specifiers")) {
981
+ const exported = getPathString(spec, "orig", "value") ?? getPathString(spec, "local", "value") ?? getPathString(spec, "exported", "value") ?? deepComponent;
982
+ const canonical = deepComponent ?? exported;
983
+ if (canonical)
984
+ bindings.conservativeUsages.push(conservativeUsage(canonical, source));
985
+ }
986
+ }
987
+ if (nodeType === "ExportAllDeclaration" && isUiImport(getPathString(node, "source", "value"))) {
988
+ const source = getPathString(node, "source", "value");
989
+ if (!source)
990
+ continue;
991
+ const deepComponent = componentFromDeepImport(source);
992
+ if (deepComponent) {
993
+ bindings.conservativeUsages.push(conservativeUsage(deepComponent, source));
994
+ }
995
+ }
996
+ }
997
+ return bindings;
998
+ }
999
+ function extractUIImports(ast) {
1000
+ return extractUIBindings(ast).components;
1001
+ }
1002
+ function jsxNameParts(name) {
1003
+ if (!name)
1004
+ return [];
1005
+ const type = getString(name, "type");
1006
+ const value = getString(name, "value");
1007
+ if ((type === "Identifier" || type === "JSXIdentifier") && value)
1008
+ return [value];
1009
+ if (type === "JSXMemberExpression") {
1010
+ return [
1011
+ ...jsxNameParts(isRecord(name) ? name.object : undefined),
1012
+ ...jsxNameParts(isRecord(name) ? name.property : undefined)
1013
+ ];
885
1014
  }
886
- return imports;
1015
+ return [];
1016
+ }
1017
+ function canonicalComponentFromJsx(parts, bindings) {
1018
+ if (parts.length === 0)
1019
+ return null;
1020
+ const [root, ...members] = parts;
1021
+ const namespaceComponent = bindings.namespaces.get(root);
1022
+ if (bindings.namespaces.has(root)) {
1023
+ if (namespaceComponent) {
1024
+ return [namespaceComponent, ...members].join(".");
1025
+ }
1026
+ return members.join(".") || null;
1027
+ }
1028
+ const rootComponent = bindings.components.get(root);
1029
+ if (!rootComponent)
1030
+ return null;
1031
+ return [rootComponent, ...members].join(".");
887
1032
  }
888
1033
  function extractJSXUsages(ast, uiComponents) {
1034
+ const bindings = {
1035
+ components: uiComponents,
1036
+ namespaces: extractUIBindings(ast).namespaces,
1037
+ conservativeUsages: []
1038
+ };
889
1039
  const usages = [];
890
1040
  walkAST(ast, (node) => {
891
- if (node.type !== "JSXOpeningElement")
1041
+ if (getString(node, "type") !== "JSXOpeningElement")
892
1042
  return;
893
- let elementName = null;
894
- let rootName = null;
895
- if (node.name?.type === "Identifier") {
896
- elementName = node.name.value;
897
- rootName = elementName;
898
- } else if (node.name?.type === "JSXMemberExpression") {
899
- const parts = [];
900
- let cursor = node.name;
901
- while (cursor?.type === "JSXMemberExpression") {
902
- parts.unshift(cursor.property?.value);
903
- cursor = cursor.object;
904
- }
905
- if (cursor?.type === "Identifier") {
906
- parts.unshift(cursor.value);
907
- rootName = cursor.value;
908
- }
909
- elementName = parts.join(".");
910
- }
911
- if (!rootName || !uiComponents.has(rootName))
1043
+ const component = canonicalComponentFromJsx(jsxNameParts(node.name), bindings);
1044
+ if (!component)
912
1045
  return;
913
1046
  const usage = {
914
- component: elementName,
1047
+ component,
915
1048
  props: new Map,
916
1049
  booleanProps: new Set,
917
1050
  hasSpread: false
918
1051
  };
919
- for (const attr of node.attributes || []) {
920
- if (attr.type === "SpreadElement" || attr.type === "JSXSpreadAttribute") {
1052
+ for (const attr of getArray(node, "attributes")) {
1053
+ const attrType = getString(attr, "type");
1054
+ if (attrType === "SpreadElement" || attrType === "JSXSpreadAttribute") {
921
1055
  usage.hasSpread = true;
922
1056
  continue;
923
1057
  }
924
- if (attr.type !== "JSXAttribute")
1058
+ if (attrType !== "JSXAttribute")
925
1059
  continue;
926
- const propName = attr.name?.value;
1060
+ const propName = getPathString(attr, "name", "value");
927
1061
  if (!propName)
928
1062
  continue;
929
- if (!attr.value) {
1063
+ const attrValue = isRecord(attr) ? attr.value : undefined;
1064
+ const attrValueType = getString(attrValue, "type");
1065
+ if (!attrValue) {
930
1066
  usage.booleanProps.add(propName);
931
- } else if (attr.value.type === "StringLiteral") {
932
- usage.props.set(propName, attr.value.value);
1067
+ } else if (attrValueType === "StringLiteral") {
1068
+ usage.props.set(propName, getString(attrValue, "value") ?? "");
933
1069
  } else {
934
1070
  usage.props.set(propName, "DYNAMIC");
935
1071
  }
@@ -938,20 +1074,36 @@ function extractJSXUsages(ast, uiComponents) {
938
1074
  });
939
1075
  return usages;
940
1076
  }
1077
+ function manifestComponents(manifest) {
1078
+ if (isPurgeDatabaseV2(manifest)) {
1079
+ return manifest.components;
1080
+ }
1081
+ return manifest;
1082
+ }
1083
+ function isPurgeDatabaseV2(manifest) {
1084
+ return manifest.version === 2 && isRecord(manifest.components);
1085
+ }
941
1086
  function buildSafelists(allUsages, manifest) {
942
1087
  const classSafelist = new Set;
943
1088
  const attrSafelist = new Set;
1089
+ const usedComponents = new Set;
1090
+ const dynamicComponents = new Set;
944
1091
  const componentUsages = new Map;
945
- for (const usage of allUsages) {
1092
+ const components = manifestComponents(manifest);
1093
+ for (const usage of expandDependencyUsages(allUsages, components)) {
946
1094
  const existing = componentUsages.get(usage.component) ?? [];
947
1095
  existing.push(usage);
948
1096
  componentUsages.set(usage.component, existing);
1097
+ usedComponents.add(usage.component);
1098
+ if (usage.hasSpread || [...usage.props.values()].includes("DYNAMIC")) {
1099
+ dynamicComponents.add(usage.component);
1100
+ }
949
1101
  }
950
- for (const [entryName, entry] of Object.entries(manifest)) {
1102
+ for (const [entryName, entry] of Object.entries(components)) {
951
1103
  const matchingUsages = findMatchingUsages(entryName, componentUsages);
952
- if (matchingUsages.length === 0) {
1104
+ if (matchingUsages.length === 0)
953
1105
  continue;
954
- }
1106
+ usedComponents.add(entryName);
955
1107
  for (const cls of entry.classes.always) {
956
1108
  classSafelist.add(cls);
957
1109
  }
@@ -982,28 +1134,65 @@ function buildSafelists(allUsages, manifest) {
982
1134
  for (const [propName, attrMap] of Object.entries(entry.attrs)) {
983
1135
  if (isPropUsed(propName, matchingUsages)) {
984
1136
  for (const [attr, val] of Object.entries(attrMap)) {
985
- attrSafelist.add(`${attr}=${val}`);
1137
+ attrSafelist.add(`[${attr}="${val}"]`);
986
1138
  }
987
1139
  }
988
1140
  }
989
1141
  }
990
1142
  }
991
- return { classSafelist, attrSafelist };
1143
+ return { classSafelist, attrSafelist, usedComponents, dynamicComponents };
992
1144
  }
993
- function findMatchingUsages(entryName, usageMap) {
994
- if (usageMap.has(entryName)) {
995
- return usageMap.get(entryName);
1145
+ function expandDependencyUsages(allUsages, manifest) {
1146
+ const result = [...allUsages];
1147
+ const queue = [...allUsages.map((usage) => rootComponent(usage.component))];
1148
+ const seen = new Set(queue);
1149
+ while (queue.length > 0) {
1150
+ const root = queue.pop();
1151
+ if (!root)
1152
+ continue;
1153
+ const deps = depsForRoot(root, manifest);
1154
+ for (const dep of deps) {
1155
+ if (seen.has(dep))
1156
+ continue;
1157
+ seen.add(dep);
1158
+ queue.push(dep);
1159
+ result.push(conservativeUsage(dep, "manifest-dependency"));
1160
+ }
1161
+ }
1162
+ return result;
1163
+ }
1164
+ function depsForRoot(root, manifest) {
1165
+ const deps = new Set;
1166
+ for (const [key, entry] of Object.entries(manifest)) {
1167
+ if (rootComponent(key) !== root)
1168
+ continue;
1169
+ for (const dep of entry.deps ?? [])
1170
+ deps.add(dep);
996
1171
  }
997
- const results = [];
1172
+ return [...deps];
1173
+ }
1174
+ function rootComponent(component) {
1175
+ return component.split(".")[0];
1176
+ }
1177
+ function findMatchingUsages(entryName, usageMap) {
1178
+ const direct = usageMap.get(entryName) ?? [];
1179
+ const results = [...direct];
1180
+ const entryRoot = rootComponent(entryName);
998
1181
  for (const [usageName, usages] of usageMap) {
999
- if (usageName === entryName) {
1000
- results.push(...usages);
1001
- }
1002
- if (entryName.includes(".")) {
1003
- const [family, part] = entryName.split(".");
1004
- if (part === family && usageName === family) {
1005
- results.push(...usages);
1006
- }
1182
+ if (usageName === entryName)
1183
+ continue;
1184
+ if (!entryName.includes(".") && rootComponent(usageName) === entryName) {
1185
+ results.push(...usages.map((usage) => ({
1186
+ ...usage,
1187
+ component: entryName,
1188
+ props: new Map([...usage.props, ["slot", "DYNAMIC"]])
1189
+ })));
1190
+ }
1191
+ if (entryName.includes(".") && (usageName === entryRoot || rootComponent(usageName) === entryRoot)) {
1192
+ results.push(...usages.map((usage) => ({
1193
+ ...usage,
1194
+ hasSpread: true
1195
+ })));
1007
1196
  }
1008
1197
  }
1009
1198
  return results;
@@ -1040,16 +1229,25 @@ async function scanConsumerSource(srcDir) {
1040
1229
  for await (const relPath of glob.scan({ cwd: srcDir })) {
1041
1230
  if (relPath.includes("node_modules"))
1042
1231
  continue;
1043
- const fullPath = path.join(srcDir, relPath);
1232
+ const fullPath = joinPath(srcDir, relPath);
1044
1233
  const code = await Bun.file(fullPath).text();
1045
1234
  if (!code.includes("@pathscale/ui"))
1046
1235
  continue;
1047
1236
  const isTsx = /\.[tj]sx$/.test(relPath);
1048
1237
  const ast = await swc.parse(code, { syntax: "typescript", tsx: isTsx });
1049
- const uiImports = extractUIImports(ast);
1050
- if (uiImports.size === 0)
1238
+ const bindings = extractUIBindings(ast);
1239
+ if (bindings.components.size === 0 && bindings.namespaces.size === 0 && bindings.conservativeUsages.length === 0) {
1051
1240
  continue;
1052
- allUsages.push(...extractJSXUsages(ast, uiImports));
1241
+ }
1242
+ allUsages.push(...bindings.conservativeUsages);
1243
+ const jsxUsages = extractJSXUsages(ast, bindings.components);
1244
+ allUsages.push(...jsxUsages);
1245
+ for (const component of bindings.components.values()) {
1246
+ if (jsxUsages.some((usage) => usage.component === component || usage.component.startsWith(`${component}.`))) {
1247
+ continue;
1248
+ }
1249
+ allUsages.push(conservativeUsage(component, "import-without-direct-jsx"));
1250
+ }
1053
1251
  }
1054
1252
  return allUsages;
1055
1253
  }
@@ -1075,6 +1273,38 @@ function parseArgs(argv) {
1075
1273
  }
1076
1274
  return { distDir, srcDir, manifestPath };
1077
1275
  }
1276
+ function normalizePurgeDatabase(manifest) {
1277
+ const rawComponents = "version" in manifest && manifest.version === 2 ? manifest.components : manifest;
1278
+ const components = {};
1279
+ for (const [key, record] of Object.entries(rawComponents)) {
1280
+ const maybeV2 = record;
1281
+ const [fallbackComponent, fallbackPart] = splitComponentKey(key);
1282
+ components[key] = {
1283
+ ...record,
1284
+ key: maybeV2.key ?? key,
1285
+ component: maybeV2.component ?? fallbackComponent,
1286
+ part: maybeV2.part ?? fallbackPart,
1287
+ selectors: maybeV2.selectors ?? [],
1288
+ attributeSelectors: maybeV2.attributeSelectors ?? [],
1289
+ cssVars: {
1290
+ declared: maybeV2.cssVars?.declared ?? [],
1291
+ referenced: maybeV2.cssVars?.referenced ?? []
1292
+ },
1293
+ keyframes: {
1294
+ declared: maybeV2.keyframes?.declared ?? [],
1295
+ referenced: maybeV2.keyframes?.referenced ?? []
1296
+ }
1297
+ };
1298
+ }
1299
+ return { version: 2, components };
1300
+ }
1301
+ function splitComponentKey(key) {
1302
+ const [component, ...part] = key.split(".");
1303
+ return [component, part.length > 0 ? part.join(".") : undefined];
1304
+ }
1305
+ function rootComponent2(key) {
1306
+ return key.split(".")[0];
1307
+ }
1078
1308
  function collectClassesFromEntry(entry) {
1079
1309
  const result = [...entry.classes.always];
1080
1310
  for (const value of Object.values(entry.classes.byProp)) {
@@ -1086,209 +1316,101 @@ function collectClassesFromEntry(entry) {
1086
1316
  }
1087
1317
  }
1088
1318
  }
1089
- return result;
1319
+ return [...new Set(result)];
1090
1320
  }
1091
- function buildKillList(manifest, importedComponents) {
1092
- const componentBemRoots = new Map;
1093
- for (const [key, entry] of Object.entries(manifest)) {
1094
- const root = key.split(".")[0];
1095
- const existing = componentBemRoots.get(root) ?? new Set;
1096
- for (const cls of entry.classes.always) {
1097
- existing.add(cls);
1098
- }
1099
- componentBemRoots.set(root, existing);
1100
- }
1101
- const componentClasses = new Map;
1102
- for (const [key, entry] of Object.entries(manifest)) {
1103
- const root = key.split(".")[0];
1104
- const existing = componentClasses.get(root) ?? [];
1105
- existing.push(...collectClassesFromEntry(entry));
1106
- componentClasses.set(root, existing);
1107
- }
1108
- function isBemClass(cls, bemRoots) {
1109
- for (const root of bemRoots) {
1110
- if (cls === root || cls.startsWith(`${root}--`) || cls.startsWith(`${root}__`)) {
1111
- return true;
1112
- }
1321
+ function buildClassOwners(database) {
1322
+ const owners = new Map;
1323
+ for (const [key, entry] of Object.entries(database.components)) {
1324
+ for (const cls of collectClassesFromEntry(entry)) {
1325
+ const existing = owners.get(cls) ?? new Set;
1326
+ existing.add(key);
1327
+ owners.set(cls, existing);
1113
1328
  }
1114
- return false;
1115
1329
  }
1116
- const killList = new Set;
1117
- const safeClasses = new Set;
1118
- const usedBemRoots = new Set;
1119
- for (const [component, classes] of componentClasses) {
1120
- const bemRoots = componentBemRoots.get(component) ?? new Set;
1121
- if (importedComponents.has(component)) {
1122
- for (const cls of classes)
1123
- safeClasses.add(cls);
1124
- for (const root of bemRoots)
1125
- usedBemRoots.add(root);
1126
- } else {
1127
- for (const cls of classes) {
1128
- if (isBemClass(cls, bemRoots)) {
1129
- killList.add(cls);
1130
- }
1131
- }
1132
- }
1133
- }
1134
- for (const cls of safeClasses) {
1135
- killList.delete(cls);
1136
- }
1137
- return { killList, usedBemRoots };
1330
+ return owners;
1138
1331
  }
1139
- function kebabToPascal(s) {
1140
- return s.split("-").map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join("");
1332
+ function isRecordUsed(recordKey, safelists) {
1333
+ return safelists.usedComponents.has(recordKey) || safelists.usedComponents.has(rootComponent2(recordKey));
1141
1334
  }
1142
- async function scanImportedComponents(srcDir) {
1143
- const imported = new Set;
1144
- const glob = new Glob2("**/*.{tsx,ts,jsx,js}");
1145
- for await (const relPath of glob.scan({ cwd: srcDir })) {
1146
- if (relPath.includes("node_modules"))
1147
- continue;
1148
- const fullPath = `${srcDir}/${relPath}`;
1149
- const code = await Bun.file(fullPath).text();
1150
- if (!code.includes("@pathscale/ui"))
1151
- continue;
1152
- const barrelRegex = /import\s*\{([^}]+)\}\s*from\s*['"]@pathscale\/ui['"]/g;
1153
- for (const match of code.matchAll(barrelRegex)) {
1154
- const specifiers = match[1].split(",");
1155
- for (const spec of specifiers) {
1156
- const trimmed = spec.trim();
1157
- if (trimmed.startsWith("type "))
1158
- continue;
1159
- const name = trimmed.split(/\s+as\s+/)[0].trim();
1160
- if (name && /^[A-Z]/.test(name)) {
1161
- imported.add(name);
1162
- }
1163
- }
1164
- }
1165
- const deepDefaultRegex = /import\s+([A-Z][a-zA-Z0-9]*)\s+from\s*['"]@pathscale\/ui\/components\/([^'"]+)['"]/g;
1166
- for (const match of code.matchAll(deepDefaultRegex)) {
1167
- imported.add(match[1]);
1168
- }
1169
- const deepNamedRegex = /import\s*\{([^}]+)\}\s*from\s*['"]@pathscale\/ui\/components\/([^'"]+)['"]/g;
1170
- for (const match of code.matchAll(deepNamedRegex)) {
1171
- const specifiers = match[1].split(",");
1172
- for (const spec of specifiers) {
1173
- const trimmed = spec.trim();
1174
- if (trimmed.startsWith("type "))
1175
- continue;
1176
- const name = trimmed.split(/\s+as\s+/)[0].trim();
1177
- if (name && /^[A-Z]/.test(name)) {
1178
- imported.add(name);
1179
- }
1180
- }
1181
- const dirName = match[2].split("/")[0];
1182
- imported.add(kebabToPascal(dirName));
1183
- }
1184
- }
1185
- return imported;
1186
- }
1187
- function buildDepGraphFromManifest(manifest) {
1188
- const graph = new Map;
1189
- for (const [key, entry] of Object.entries(manifest)) {
1190
- const root = key.split(".")[0];
1191
- if (entry.deps && entry.deps.length > 0 && !graph.has(root)) {
1192
- graph.set(root, new Set(entry.deps));
1335
+ function isClassAllowed(cls, owners, safelists) {
1336
+ const classOwners = owners.get(cls);
1337
+ if (!classOwners)
1338
+ return true;
1339
+ for (const owner of classOwners) {
1340
+ if (isRecordUsed(owner, safelists) && safelists.classSafelist.has(cls)) {
1341
+ return true;
1193
1342
  }
1194
1343
  }
1195
- return graph;
1344
+ return false;
1196
1345
  }
1197
- function resolveTransitiveDeps(imported, depGraph) {
1198
- const resolved = new Set(imported);
1199
- const queue = [...imported];
1200
- while (queue.length > 0) {
1201
- const comp = queue.pop();
1202
- const deps = depGraph.get(comp);
1203
- if (!deps)
1204
- continue;
1205
- for (const dep of deps) {
1206
- if (!resolved.has(dep)) {
1207
- resolved.add(dep);
1208
- queue.push(dep);
1209
- }
1210
- }
1211
- }
1212
- return resolved;
1346
+ function emptySelectorReport() {
1347
+ return {
1348
+ selectorsKeptKnown: 0,
1349
+ selectorsKeptUnknown: 0,
1350
+ selectorsRemoved: 0,
1351
+ selectorsRemovedUnusedComponent: 0,
1352
+ selectorsRemovedUnusedVariant: 0,
1353
+ attrSelectorsSeen: 0,
1354
+ keyframesRemoved: 0,
1355
+ fontFacesRemoved: 0
1356
+ };
1213
1357
  }
1214
1358
  function unescapeCss(s) {
1215
1359
  return s.replace(/\\(.)/g, "$1");
1216
1360
  }
1217
1361
  function extractClassesFromSelector(selector) {
1218
- const matches = selector.matchAll(/\.([a-zA-Z_-](?:[a-zA-Z0-9_-]|\\[^\s])*)/g);
1362
+ const matches = selector.matchAll(/\.([a-zA-Z_-](?:[a-zA-Z0-9_-]|\\[^\s.#:[>+~,)]*)*)/g);
1219
1363
  return [...matches].map((m) => unescapeCss(m[1]));
1220
1364
  }
1221
- var ALWAYS_KEEP_SELECTORS = new Set([
1222
- "*",
1223
- "html",
1224
- "body",
1225
- ":root",
1226
- "::before",
1227
- "::after",
1228
- ":before",
1229
- ":after",
1230
- "::backdrop"
1231
- ]);
1232
- function extractDataSlotValues(sel) {
1233
- const values = [];
1234
- const re = /\[data-slot=(?:"([^"]+)"|'([^']+)'|([^\]\s]+))\]/g;
1235
- for (const m of sel.matchAll(re)) {
1236
- const v = m[1] ?? m[2] ?? m[3];
1237
- if (v)
1238
- values.push(v);
1239
- }
1240
- return values;
1241
- }
1242
- function dataSlotsMatchUsedRoots(sel, usedBemRoots) {
1243
- const slots = extractDataSlotValues(sel);
1244
- if (slots.length === 0)
1245
- return false;
1246
- for (const slot of slots) {
1247
- let matched = false;
1248
- for (const root of usedBemRoots) {
1249
- if (slot === root || slot.startsWith(`${root}-`) || slot.startsWith(`${root}__`) || slot.startsWith(`${root}--`)) {
1250
- matched = true;
1251
- break;
1252
- }
1253
- }
1254
- if (!matched)
1255
- return false;
1256
- }
1257
- return true;
1365
+ function extractAttrsFromSelector(selector) {
1366
+ const matches = selector.matchAll(/\[(data-[a-zA-Z0-9_-]+|aria-[a-zA-Z0-9_-]+)(?:=(?:"([^"]*)"|'([^']*)'|([^\]]+)))?\]/g);
1367
+ return [...matches].map((m) => {
1368
+ const value = m[2] ?? m[3] ?? m[4];
1369
+ return value === undefined ? `[${m[1]}]` : `[${m[1]}="${value.trim()}"]`;
1370
+ });
1258
1371
  }
1259
- function isKeepableNonClassSelector(sel, usedBemRoots = new Set) {
1260
- const stripped = sel.trim();
1261
- for (const el of ALWAYS_KEEP_SELECTORS) {
1262
- if (stripped === el)
1263
- return true;
1264
- if (stripped.startsWith(el + ":") || stripped.startsWith(el + "[") || stripped.startsWith(el + " "))
1265
- return true;
1372
+ function selectorDecision(selector, owners, safelists) {
1373
+ const classes = extractClassesFromSelector(selector);
1374
+ if (classes.length === 0)
1375
+ return "keep-unknown";
1376
+ const hasUnknownClass = classes.some((cls) => !owners.has(cls));
1377
+ if (hasUnknownClass)
1378
+ return "keep-unknown";
1379
+ const hasUsedOwner = classes.some((cls) => {
1380
+ const classOwners = owners.get(cls);
1381
+ return [...classOwners ?? []].some((owner) => isRecordUsed(owner, safelists));
1382
+ });
1383
+ if (!hasUsedOwner)
1384
+ return "remove-unused-component";
1385
+ if (classes.every((cls) => isClassAllowed(cls, owners, safelists))) {
1386
+ return "keep-known";
1266
1387
  }
1267
- if (/^:root/.test(stripped))
1268
- return true;
1269
- if (/^\[data-theme/.test(stripped))
1270
- return true;
1271
- if (/^\[hidden/.test(stripped))
1272
- return true;
1273
- if (dataSlotsMatchUsedRoots(stripped, usedBemRoots))
1274
- return true;
1275
- return false;
1388
+ return "remove-unused-variant";
1276
1389
  }
1277
- function purgeClasses(css, killList, usedBemRoots = new Set) {
1390
+ function purgeCssWithDatabase(css, manifest, safelists) {
1391
+ const database = normalizePurgeDatabase(manifest);
1392
+ const classOwners = buildClassOwners(database);
1393
+ const report = emptySelectorReport();
1278
1394
  const root = postcss.parse(css);
1279
1395
  root.walkRules((rule) => {
1280
1396
  const selectors = rule.selectors;
1281
1397
  const kept = [];
1282
- for (const sel of selectors) {
1283
- const classes = extractClassesFromSelector(sel);
1284
- if (classes.length === 0) {
1285
- if (isKeepableNonClassSelector(sel, usedBemRoots)) {
1286
- kept.push(sel);
1398
+ for (const selector of selectors) {
1399
+ report.attrSelectorsSeen += extractAttrsFromSelector(selector).length;
1400
+ const decision = selectorDecision(selector, classOwners, safelists);
1401
+ if (decision === "keep-known") {
1402
+ report.selectorsKeptKnown++;
1403
+ kept.push(selector);
1404
+ } else if (decision === "keep-unknown") {
1405
+ report.selectorsKeptUnknown++;
1406
+ kept.push(selector);
1407
+ } else {
1408
+ report.selectorsRemoved++;
1409
+ if (decision === "remove-unused-component") {
1410
+ report.selectorsRemovedUnusedComponent++;
1411
+ } else {
1412
+ report.selectorsRemovedUnusedVariant++;
1287
1413
  }
1288
- continue;
1289
- }
1290
- if (classes.some((c) => !killList.has(c))) {
1291
- kept.push(sel);
1292
1414
  }
1293
1415
  }
1294
1416
  if (kept.length === 0) {
@@ -1297,11 +1419,17 @@ function purgeClasses(css, killList, usedBemRoots = new Set) {
1297
1419
  rule.selectors = kept;
1298
1420
  }
1299
1421
  });
1422
+ removeUnusedKeyframes(root, report);
1423
+ removeUnusedFontFaces(root, report);
1424
+ removeEmptyAtRules(root);
1425
+ return { css: root.toString(), report };
1426
+ }
1427
+ function removeUnusedKeyframes(root, report) {
1300
1428
  const usedKeyframes = new Set;
1301
1429
  root.walkDecls(/^animation(-name)?$/, (decl) => {
1302
1430
  for (const part of decl.value.split(",")) {
1303
1431
  const name = part.trim().split(/\s+/)[0];
1304
- if (name && name !== "none" && name !== "initial" && name !== "inherit") {
1432
+ if (name && !["none", "initial", "inherit", "unset"].includes(name)) {
1305
1433
  usedKeyframes.add(name);
1306
1434
  }
1307
1435
  }
@@ -1309,8 +1437,11 @@ function purgeClasses(css, killList, usedBemRoots = new Set) {
1309
1437
  root.walkAtRules("keyframes", (atRule) => {
1310
1438
  if (!usedKeyframes.has(atRule.params.trim())) {
1311
1439
  atRule.remove();
1440
+ report.keyframesRemoved++;
1312
1441
  }
1313
1442
  });
1443
+ }
1444
+ function removeUnusedFontFaces(root, report) {
1314
1445
  const usedFonts = new Set;
1315
1446
  root.walkDecls(/^font(-family)?$/, (decl) => {
1316
1447
  for (const part of decl.value.split(",")) {
@@ -1326,8 +1457,11 @@ function purgeClasses(css, killList, usedBemRoots = new Set) {
1326
1457
  });
1327
1458
  if (family && !usedFonts.has(family)) {
1328
1459
  atRule.remove();
1460
+ report.fontFacesRemoved++;
1329
1461
  }
1330
1462
  });
1463
+ }
1464
+ function removeEmptyAtRules(root) {
1331
1465
  let cleaned = true;
1332
1466
  while (cleaned) {
1333
1467
  cleaned = false;
@@ -1338,39 +1472,23 @@ function purgeClasses(css, killList, usedBemRoots = new Set) {
1338
1472
  }
1339
1473
  });
1340
1474
  }
1341
- return root.toString();
1342
1475
  }
1343
- function purgeAttributes(css, attrSafelist) {
1344
- const root = postcss.parse(css);
1345
- root.walkRules((rule) => {
1346
- const selectors = rule.selectors;
1347
- const kept = [];
1348
- for (const sel of selectors) {
1349
- const attrMatches = sel.matchAll(/\[(data-[a-z-]+|aria-[a-z-]+)="([^"]+)"\]/g);
1350
- let shouldKeep = true;
1351
- for (const match of attrMatches) {
1352
- if (match[1] === "data-slot")
1353
- continue;
1354
- const attrSelector = `[${match[1]}="${match[2]}"]`;
1355
- if (!attrSafelist.has(attrSelector)) {
1356
- shouldKeep = false;
1357
- break;
1358
- }
1359
- }
1360
- if (shouldKeep)
1361
- kept.push(sel);
1362
- }
1363
- if (kept.length === 0) {
1364
- rule.remove();
1365
- } else if (kept.length < selectors.length) {
1366
- rule.selectors = kept;
1476
+ async function collectRuntimeCssVarRefs(distDir) {
1477
+ const refs = new Set;
1478
+ const glob = new Glob2("**/*.{js,mjs,cjs}");
1479
+ for await (const relPath of glob.scan({ cwd: distDir })) {
1480
+ const fullPath = `${distDir}/${relPath}`;
1481
+ const code = await Bun.file(fullPath).text();
1482
+ for (const match of code.matchAll(/var\(\s*(--[a-zA-Z0-9_-]+)/g)) {
1483
+ refs.add(match[1]);
1367
1484
  }
1368
- });
1369
- return root.toString();
1485
+ }
1486
+ return refs;
1370
1487
  }
1371
- function cleanUnusedVars(css) {
1488
+ function cleanUnusedVarsWithReport(css, externallyReferencedVars) {
1372
1489
  let changed = true;
1373
1490
  let result = css;
1491
+ let removed = 0;
1374
1492
  while (changed) {
1375
1493
  changed = false;
1376
1494
  const root = postcss.parse(result);
@@ -1380,11 +1498,11 @@ function cleanUnusedVars(css) {
1380
1498
  entries.push({ rule: decl.parent, prop: decl.prop });
1381
1499
  declared.set(decl.prop, entries);
1382
1500
  });
1383
- const referenced = new Set;
1501
+ const referenced = new Set(externallyReferencedVars);
1384
1502
  root.walkDecls((decl) => {
1385
- const refs = decl.value.matchAll(/var\(\s*(--[a-zA-Z0-9_-]+)/g);
1386
- for (const ref of refs)
1503
+ for (const ref of decl.value.matchAll(/var\(\s*(--[a-zA-Z0-9_-]+)/g)) {
1387
1504
  referenced.add(ref[1]);
1505
+ }
1388
1506
  });
1389
1507
  for (const [varName, entries] of declared) {
1390
1508
  if (!referenced.has(varName)) {
@@ -1392,6 +1510,7 @@ function cleanUnusedVars(css) {
1392
1510
  entry.rule.walkDecls(entry.prop, (decl) => {
1393
1511
  decl.remove();
1394
1512
  changed = true;
1513
+ removed++;
1395
1514
  });
1396
1515
  }
1397
1516
  }
@@ -1400,13 +1519,13 @@ function cleanUnusedVars(css) {
1400
1519
  if (rule.nodes && rule.nodes.length === 0)
1401
1520
  rule.remove();
1402
1521
  });
1403
- root.walkAtRules((atRule) => {
1404
- if (atRule.nodes && atRule.nodes.length === 0)
1405
- atRule.remove();
1406
- });
1522
+ removeEmptyAtRules(root);
1407
1523
  result = root.toString();
1408
1524
  }
1409
- return result;
1525
+ return { css: result, removed };
1526
+ }
1527
+ function cleanUnusedVars(css, externallyReferencedVars) {
1528
+ return cleanUnusedVarsWithReport(css, externallyReferencedVars).css;
1410
1529
  }
1411
1530
  function minify(css) {
1412
1531
  const { code } = transform({
@@ -1420,19 +1539,25 @@ function minify(css) {
1420
1539
  async function main() {
1421
1540
  const { distDir, srcDir, manifestPath } = parseArgs(process.argv);
1422
1541
  const manifest = JSON.parse(await Bun.file(manifestPath).text());
1423
- const totalComponents = new Set(Object.keys(manifest).map((k) => k.split(".")[0])).size;
1424
- console.log(`[css-purge] Manifest loaded: ${Object.keys(manifest).length} entries (${totalComponents} components)`);
1425
- const directImports = await scanImportedComponents(srcDir);
1426
- console.log(`[css-purge] Direct imports from app: ${directImports.size} / ${totalComponents}`);
1427
- const depGraph = buildDepGraphFromManifest(manifest);
1428
- const importedComponents = resolveTransitiveDeps(directImports, depGraph);
1429
- const transitive = importedComponents.size - directImports.size;
1430
- console.log(`[css-purge] Transitive deps: +${transitive} \u2192 ${importedComponents.size} total used components`);
1431
- const { killList, usedBemRoots } = buildKillList(manifest, importedComponents);
1432
- console.log(`[css-purge] Kill-list: ${killList.size} classes from ${totalComponents - importedComponents.size} unused components`);
1433
- console.log(`[css-purge] Used BEM roots: ${usedBemRoots.size} (preserves [data-slot] rules for used components)`);
1542
+ const database = normalizePurgeDatabase(manifest);
1543
+ const roots = new Set(Object.keys(database.components).map(rootComponent2));
1544
+ console.log(`[css-purge] Database loaded: ${Object.keys(database.components).length} records (${roots.size} components)`);
1434
1545
  const usages = await scanConsumerSource(srcDir);
1435
- const { attrSafelist } = buildSafelists(usages, manifest);
1546
+ const safelists = buildSafelists(usages, manifest);
1547
+ const usedRoots = new Set([...safelists.usedComponents].map(rootComponent2));
1548
+ const removedRoots = [...roots].filter((root) => !usedRoots.has(root));
1549
+ console.log(`[css-purge] Components detected: ${usedRoots.size} used, ${removedRoots.length} removable`);
1550
+ if (usedRoots.size > 0) {
1551
+ console.log(`[css-purge] used: ${[...usedRoots].sort().join(", ")}`);
1552
+ }
1553
+ if (removedRoots.length > 0) {
1554
+ console.log(`[css-purge] removable: ${removedRoots.sort().join(", ")}`);
1555
+ }
1556
+ console.log(`[css-purge] Safelist facts: ${safelists.classSafelist.size} classes, ${safelists.attrSafelist.size} attr selectors`);
1557
+ const runtimeCssVarRefs = await collectRuntimeCssVarRefs(distDir);
1558
+ if (runtimeCssVarRefs.size > 0) {
1559
+ console.log(`[css-purge] Runtime CSS vars referenced from JS: ${runtimeCssVarRefs.size}`);
1560
+ }
1436
1561
  const glob = new Glob2("**/*.css");
1437
1562
  let totalBefore = 0;
1438
1563
  let totalAfter = 0;
@@ -1442,35 +1567,34 @@ async function main() {
1442
1567
  const originalSize = Buffer.byteLength(originalCss, "utf-8");
1443
1568
  totalBefore += originalSize;
1444
1569
  console.log(`[css-purge] Processing ${relPath} (${(originalSize / 1024).toFixed(1)} KB)`);
1445
- let purgedCss = purgeClasses(originalCss, killList, usedBemRoots);
1446
- const afterL1 = Buffer.byteLength(purgedCss, "utf-8");
1447
- console.log(`[css-purge] L1 class purge: ${(originalSize / 1024).toFixed(1)} \u2192 ${(afterL1 / 1024).toFixed(1)} KB`);
1448
- purgedCss = purgeAttributes(purgedCss, attrSafelist);
1449
- const afterL2 = Buffer.byteLength(purgedCss, "utf-8");
1450
- console.log(`[css-purge] L2 attr purge: ${(afterL1 / 1024).toFixed(1)} \u2192 ${(afterL2 / 1024).toFixed(1)} KB`);
1451
- purgedCss = cleanUnusedVars(purgedCss);
1452
- const afterL3 = Buffer.byteLength(purgedCss, "utf-8");
1453
- console.log(`[css-purge] L3 var cleanup: \u2192 ${(afterL3 / 1024).toFixed(1)} KB`);
1570
+ const purged = purgeCssWithDatabase(originalCss, database, safelists);
1571
+ let purgedCss = purged.css;
1572
+ const afterSelectors = Buffer.byteLength(purgedCss, "utf-8");
1573
+ console.log(`[css-purge] selectors: ${(originalSize / 1024).toFixed(1)} -> ${(afterSelectors / 1024).toFixed(1)} KB (${purged.report.selectorsRemoved} removed, ${purged.report.selectorsKeptUnknown} kept unknown)`);
1574
+ console.log(`[css-purge] attrs seen: ${purged.report.attrSelectorsSeen}; keyframes removed: ${purged.report.keyframesRemoved}`);
1575
+ const vars = cleanUnusedVarsWithReport(purgedCss, runtimeCssVarRefs);
1576
+ purgedCss = vars.css;
1577
+ const afterVars = Buffer.byteLength(purgedCss, "utf-8");
1578
+ console.log(`[css-purge] vars: ${(afterSelectors / 1024).toFixed(1)} -> ${(afterVars / 1024).toFixed(1)} KB (${vars.removed} removed)`);
1454
1579
  purgedCss = minify(purgedCss);
1455
1580
  const finalSize = Buffer.byteLength(purgedCss, "utf-8");
1456
1581
  totalAfter += finalSize;
1457
- console.log(`[css-purge] Minify (lightningcss): \u2192 ${(finalSize / 1024).toFixed(1)} KB`);
1458
- console.log(`[css-purge] Final: ${(originalSize / 1024).toFixed(1)} \u2192 ${(finalSize / 1024).toFixed(1)} KB (${((1 - finalSize / originalSize) * 100).toFixed(1)}% reduction)`);
1582
+ console.log(`[css-purge] minify: -> ${(finalSize / 1024).toFixed(1)} KB`);
1583
+ console.log(`[css-purge] final: ${(originalSize / 1024).toFixed(1)} -> ${(finalSize / 1024).toFixed(1)} KB (${((1 - finalSize / originalSize) * 100).toFixed(1)}% reduction)`);
1459
1584
  await Bun.write(fullPath, purgedCss);
1460
1585
  }
1461
1586
  console.log(`
1462
- [css-purge] Total: ${(totalBefore / 1024).toFixed(1)} \u2192 ${(totalAfter / 1024).toFixed(1)} KB (${((1 - totalAfter / totalBefore) * 100).toFixed(1)}% reduction)`);
1587
+ [css-purge] Total: ${(totalBefore / 1024).toFixed(1)} -> ${(totalAfter / 1024).toFixed(1)} KB (${((1 - totalAfter / totalBefore) * 100).toFixed(1)}% reduction)`);
1463
1588
  }
1464
1589
  if (import.meta.main) {
1465
1590
  main();
1466
1591
  }
1467
1592
  export {
1468
- purgeClasses,
1469
- isKeepableNonClassSelector,
1470
- extractDataSlotValues,
1471
- dataSlotsMatchUsedRoots,
1472
- buildKillList
1593
+ purgeCssWithDatabase,
1594
+ normalizePurgeDatabase,
1595
+ cleanUnusedVarsWithReport,
1596
+ cleanUnusedVars
1473
1597
  };
1474
1598
 
1475
- //# debugId=2715CBE06DC52FD664756E2164756E21
1476
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1saWJjL2xpYi9wcm9jZXNzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9kZXRlY3QtbGliYy9saWIvZmlsZXN5c3RlbS5qcyIsICIuLi9ub2RlX21vZHVsZXMvZGV0ZWN0LWxpYmMvbGliL2VsZi5qcyIsICIuLi9ub2RlX21vZHVsZXMvZGV0ZWN0LWxpYmMvbGliL2RldGVjdC1saWJjLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9saWdodG5pbmdjc3Mvbm9kZS9icm93c2Vyc2xpc3RUb1RhcmdldHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpZ2h0bmluZ2Nzcy9ub2RlL2NvbXBvc2VWaXNpdG9ycy5qcyIsICIuLi9ub2RlX21vZHVsZXMvbGlnaHRuaW5nY3NzL25vZGUvZmxhZ3MuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpZ2h0bmluZ2Nzcy9ub2RlL2luZGV4LmpzIiwgIi4uL3NyYy9wb3N0YnVpbGQtcHVyZ2UudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpZ2h0bmluZ2Nzcy9ub2RlL2luZGV4Lm1qcyIsICIuLi9zcmMvc2Nhbi1jb25zdW1lci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvLyBDb3B5cmlnaHQgMjAxNyBMb3ZlbGwgRnVsbGVyIGFuZCBvdGhlcnMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGlzTGludXggPSAoKSA9PiBwcm9jZXNzLnBsYXRmb3JtID09PSAnbGludXgnO1xuXG5sZXQgcmVwb3J0ID0gbnVsbDtcbmNvbnN0IGdldFJlcG9ydCA9ICgpID0+IHtcbiAgaWYgKCFyZXBvcnQpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChpc0xpbnV4KCkgJiYgcHJvY2Vzcy5yZXBvcnQpIHtcbiAgICAgIGNvbnN0IG9yaWcgPSBwcm9jZXNzLnJlcG9ydC5leGNsdWRlTmV0d29yaztcbiAgICAgIHByb2Nlc3MucmVwb3J0LmV4Y2x1ZGVOZXR3b3JrID0gdHJ1ZTtcbiAgICAgIHJlcG9ydCA9IHByb2Nlc3MucmVwb3J0LmdldFJlcG9ydCgpO1xuICAgICAgcHJvY2Vzcy5yZXBvcnQuZXhjbHVkZU5ldHdvcmsgPSBvcmlnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXBvcnQgPSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcG9ydDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0geyBpc0xpbnV4LCBnZXRSZXBvcnQgfTtcbiIsCiAgICAiLy8gQ29weXJpZ2h0IDIwMTcgTG92ZWxsIEZ1bGxlciBhbmQgb3RoZXJzLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5cbmNvbnN0IExERF9QQVRIID0gJy91c3IvYmluL2xkZCc7XG5jb25zdCBTRUxGX1BBVEggPSAnL3Byb2Mvc2VsZi9leGUnO1xuY29uc3QgTUFYX0xFTkdUSCA9IDIwNDg7XG5cbi8qKlxuICogUmVhZCB0aGUgY29udGVudCBvZiBhIGZpbGUgc3luY2hyb25vdXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHJldHVybnMge0J1ZmZlcn1cbiAqL1xuY29uc3QgcmVhZEZpbGVTeW5jID0gKHBhdGgpID0+IHtcbiAgY29uc3QgZmQgPSBmcy5vcGVuU3luYyhwYXRoLCAncicpO1xuICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoTUFYX0xFTkdUSCk7XG4gIGNvbnN0IGJ5dGVzUmVhZCA9IGZzLnJlYWRTeW5jKGZkLCBidWZmZXIsIDAsIE1BWF9MRU5HVEgsIDApO1xuICBmcy5jbG9zZShmZCwgKCkgPT4ge30pO1xuICByZXR1cm4gYnVmZmVyLnN1YmFycmF5KDAsIGJ5dGVzUmVhZCk7XG59O1xuXG4vKipcbiAqIFJlYWQgdGhlIGNvbnRlbnQgb2YgYSBmaWxlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJ1ZmZlcj59XG4gKi9cbmNvbnN0IHJlYWRGaWxlID0gKHBhdGgpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgZnMub3BlbihwYXRoLCAncicsIChlcnIsIGZkKSA9PiB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhNQVhfTEVOR1RIKTtcbiAgICAgIGZzLnJlYWQoZmQsIGJ1ZmZlciwgMCwgTUFYX0xFTkdUSCwgMCwgKF8sIGJ5dGVzUmVhZCkgPT4ge1xuICAgICAgICByZXNvbHZlKGJ1ZmZlci5zdWJhcnJheSgwLCBieXRlc1JlYWQpKTtcbiAgICAgICAgZnMuY2xvc2UoZmQsICgpID0+IHt9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIExERF9QQVRILFxuICBTRUxGX1BBVEgsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVhZEZpbGVcbn07XG4iLAogICAgIi8vIENvcHlyaWdodCAyMDE3IExvdmVsbCBGdWxsZXIgYW5kIG90aGVycy5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgaW50ZXJwcmV0ZXJQYXRoID0gKGVsZikgPT4ge1xuICBpZiAoZWxmLmxlbmd0aCA8IDY0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGVsZi5yZWFkVUludDMyQkUoMCkgIT09IDB4N0Y0NTRDNDYpIHtcbiAgICAvLyBVbmV4cGVjdGVkIG1hZ2ljIGJ5dGVzXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGVsZi5yZWFkVUludDgoNCkgIT09IDIpIHtcbiAgICAvLyBOb3QgYSA2NC1iaXQgRUxGXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGVsZi5yZWFkVUludDgoNSkgIT09IDEpIHtcbiAgICAvLyBOb3QgbGl0dGxlLWVuZGlhblxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IG9mZnNldCA9IGVsZi5yZWFkVUludDMyTEUoMzIpO1xuICBjb25zdCBzaXplID0gZWxmLnJlYWRVSW50MTZMRSg1NCk7XG4gIGNvbnN0IGNvdW50ID0gZWxmLnJlYWRVSW50MTZMRSg1Nik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGNvbnN0IGhlYWRlck9mZnNldCA9IG9mZnNldCArIChpICogc2l6ZSk7XG4gICAgY29uc3QgdHlwZSA9IGVsZi5yZWFkVUludDMyTEUoaGVhZGVyT2Zmc2V0KTtcbiAgICBpZiAodHlwZSA9PT0gMykge1xuICAgICAgY29uc3QgZmlsZU9mZnNldCA9IGVsZi5yZWFkVUludDMyTEUoaGVhZGVyT2Zmc2V0ICsgOCk7XG4gICAgICBjb25zdCBmaWxlU2l6ZSA9IGVsZi5yZWFkVUludDMyTEUoaGVhZGVyT2Zmc2V0ICsgMzIpO1xuICAgICAgcmV0dXJuIGVsZi5zdWJhcnJheShmaWxlT2Zmc2V0LCBmaWxlT2Zmc2V0ICsgZmlsZVNpemUpLnRvU3RyaW5nKCkucmVwbGFjZSgvXFwwLiokL2csICcnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaW50ZXJwcmV0ZXJQYXRoXG59O1xuIiwKICAgICIvLyBDb3B5cmlnaHQgMjAxNyBMb3ZlbGwgRnVsbGVyIGFuZCBvdGhlcnMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGNoaWxkUHJvY2VzcyA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKTtcbmNvbnN0IHsgaXNMaW51eCwgZ2V0UmVwb3J0IH0gPSByZXF1aXJlKCcuL3Byb2Nlc3MnKTtcbmNvbnN0IHsgTEREX1BBVEgsIFNFTEZfUEFUSCwgcmVhZEZpbGUsIHJlYWRGaWxlU3luYyB9ID0gcmVxdWlyZSgnLi9maWxlc3lzdGVtJyk7XG5jb25zdCB7IGludGVycHJldGVyUGF0aCB9ID0gcmVxdWlyZSgnLi9lbGYnKTtcblxubGV0IGNhY2hlZEZhbWlseUludGVycHJldGVyO1xubGV0IGNhY2hlZEZhbWlseUZpbGVzeXN0ZW07XG5sZXQgY2FjaGVkVmVyc2lvbkZpbGVzeXN0ZW07XG5cbmNvbnN0IGNvbW1hbmQgPSAnZ2V0Y29uZiBHTlVfTElCQ19WRVJTSU9OIDI+JjEgfHwgdHJ1ZTsgbGRkIC0tdmVyc2lvbiAyPiYxIHx8IHRydWUnO1xubGV0IGNvbW1hbmRPdXQgPSAnJztcblxuY29uc3Qgc2FmZUNvbW1hbmQgPSAoKSA9PiB7XG4gIGlmICghY29tbWFuZE91dCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY2hpbGRQcm9jZXNzLmV4ZWMoY29tbWFuZCwgKGVyciwgb3V0KSA9PiB7XG4gICAgICAgIGNvbW1hbmRPdXQgPSBlcnIgPyAnICcgOiBvdXQ7XG4gICAgICAgIHJlc29sdmUoY29tbWFuZE91dCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY29tbWFuZE91dDtcbn07XG5cbmNvbnN0IHNhZmVDb21tYW5kU3luYyA9ICgpID0+IHtcbiAgaWYgKCFjb21tYW5kT3V0KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbW1hbmRPdXQgPSBjaGlsZFByb2Nlc3MuZXhlY1N5bmMoY29tbWFuZCwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pO1xuICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgIGNvbW1hbmRPdXQgPSAnICc7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb21tYW5kT3V0O1xufTtcblxuLyoqXG4gKiBBIFN0cmluZyBjb25zdGFudCBjb250YWluaW5nIHRoZSB2YWx1ZSBgZ2xpYmNgLlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgR0xJQkMgPSAnZ2xpYmMnO1xuXG4vKipcbiAqIEEgUmVnZXhwIGNvbnN0YW50IHRvIGdldCB0aGUgR0xJQkMgVmVyc2lvbi5cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IFJFX0dMSUJDX1ZFUlNJT04gPSAvTElCQ1thLXowLTkgXFwtKS5dKj8oXFxkK1xcLlxcZCspL2k7XG5cbi8qKlxuICogQSBTdHJpbmcgY29uc3RhbnQgY29udGFpbmluZyB0aGUgdmFsdWUgYG11c2xgLlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgTVVTTCA9ICdtdXNsJztcblxuY29uc3QgaXNGaWxlTXVzbCA9IChmKSA9PiBmLmluY2x1ZGVzKCdsaWJjLm11c2wtJykgfHwgZi5pbmNsdWRlcygnbGQtbXVzbC0nKTtcblxuY29uc3QgZmFtaWx5RnJvbVJlcG9ydCA9ICgpID0+IHtcbiAgY29uc3QgcmVwb3J0ID0gZ2V0UmVwb3J0KCk7XG4gIGlmIChyZXBvcnQuaGVhZGVyICYmIHJlcG9ydC5oZWFkZXIuZ2xpYmNWZXJzaW9uUnVudGltZSkge1xuICAgIHJldHVybiBHTElCQztcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShyZXBvcnQuc2hhcmVkT2JqZWN0cykpIHtcbiAgICBpZiAocmVwb3J0LnNoYXJlZE9iamVjdHMuc29tZShpc0ZpbGVNdXNsKSkge1xuICAgICAgcmV0dXJuIE1VU0w7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgZmFtaWx5RnJvbUNvbW1hbmQgPSAob3V0KSA9PiB7XG4gIGNvbnN0IFtnZXRjb25mLCBsZGQxXSA9IG91dC5zcGxpdCgvW1xcclxcbl0rLyk7XG4gIGlmIChnZXRjb25mICYmIGdldGNvbmYuaW5jbHVkZXMoR0xJQkMpKSB7XG4gICAgcmV0dXJuIEdMSUJDO1xuICB9XG4gIGlmIChsZGQxICYmIGxkZDEuaW5jbHVkZXMoTVVTTCkpIHtcbiAgICByZXR1cm4gTVVTTDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IGZhbWlseUZyb21JbnRlcnByZXRlclBhdGggPSAocGF0aCkgPT4ge1xuICBpZiAocGF0aCkge1xuICAgIGlmIChwYXRoLmluY2x1ZGVzKCcvbGQtbXVzbC0nKSkge1xuICAgICAgcmV0dXJuIE1VU0w7XG4gICAgfSBlbHNlIGlmIChwYXRoLmluY2x1ZGVzKCcvbGQtbGludXgtJykpIHtcbiAgICAgIHJldHVybiBHTElCQztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5jb25zdCBnZXRGYW1pbHlGcm9tTGRkQ29udGVudCA9IChjb250ZW50KSA9PiB7XG4gIGNvbnRlbnQgPSBjb250ZW50LnRvU3RyaW5nKCk7XG4gIGlmIChjb250ZW50LmluY2x1ZGVzKCdtdXNsJykpIHtcbiAgICByZXR1cm4gTVVTTDtcbiAgfVxuICBpZiAoY29udGVudC5pbmNsdWRlcygnR05VIEMgTGlicmFyeScpKSB7XG4gICAgcmV0dXJuIEdMSUJDO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgZmFtaWx5RnJvbUZpbGVzeXN0ZW0gPSBhc3luYyAoKSA9PiB7XG4gIGlmIChjYWNoZWRGYW1pbHlGaWxlc3lzdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkRmFtaWx5RmlsZXN5c3RlbTtcbiAgfVxuICBjYWNoZWRGYW1pbHlGaWxlc3lzdGVtID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBsZGRDb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoTEREX1BBVEgpO1xuICAgIGNhY2hlZEZhbWlseUZpbGVzeXN0ZW0gPSBnZXRGYW1pbHlGcm9tTGRkQ29udGVudChsZGRDb250ZW50KTtcbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIGNhY2hlZEZhbWlseUZpbGVzeXN0ZW07XG59O1xuXG5jb25zdCBmYW1pbHlGcm9tRmlsZXN5c3RlbVN5bmMgPSAoKSA9PiB7XG4gIGlmIChjYWNoZWRGYW1pbHlGaWxlc3lzdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkRmFtaWx5RmlsZXN5c3RlbTtcbiAgfVxuICBjYWNoZWRGYW1pbHlGaWxlc3lzdGVtID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBsZGRDb250ZW50ID0gcmVhZEZpbGVTeW5jKExERF9QQVRIKTtcbiAgICBjYWNoZWRGYW1pbHlGaWxlc3lzdGVtID0gZ2V0RmFtaWx5RnJvbUxkZENvbnRlbnQobGRkQ29udGVudCk7XG4gIH0gY2F0Y2ggKGUpIHt9XG4gIHJldHVybiBjYWNoZWRGYW1pbHlGaWxlc3lzdGVtO1xufTtcblxuY29uc3QgZmFtaWx5RnJvbUludGVycHJldGVyID0gYXN5bmMgKCkgPT4ge1xuICBpZiAoY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjYWNoZWRGYW1pbHlJbnRlcnByZXRlcjtcbiAgfVxuICBjYWNoZWRGYW1pbHlJbnRlcnByZXRlciA9IG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2VsZkNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShTRUxGX1BBVEgpO1xuICAgIGNvbnN0IHBhdGggPSBpbnRlcnByZXRlclBhdGgoc2VsZkNvbnRlbnQpO1xuICAgIGNhY2hlZEZhbWlseUludGVycHJldGVyID0gZmFtaWx5RnJvbUludGVycHJldGVyUGF0aChwYXRoKTtcbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIGNhY2hlZEZhbWlseUludGVycHJldGVyO1xufTtcblxuY29uc3QgZmFtaWx5RnJvbUludGVycHJldGVyU3luYyA9ICgpID0+IHtcbiAgaWYgKGNhY2hlZEZhbWlseUludGVycHJldGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXI7XG4gIH1cbiAgY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXIgPSBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHNlbGZDb250ZW50ID0gcmVhZEZpbGVTeW5jKFNFTEZfUEFUSCk7XG4gICAgY29uc3QgcGF0aCA9IGludGVycHJldGVyUGF0aChzZWxmQ29udGVudCk7XG4gICAgY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXIgPSBmYW1pbHlGcm9tSW50ZXJwcmV0ZXJQYXRoKHBhdGgpO1xuICB9IGNhdGNoIChlKSB7fVxuICByZXR1cm4gY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXI7XG59O1xuXG4vKipcbiAqIFJlc29sdmVzIHdpdGggdGhlIGxpYmMgZmFtaWx5IHdoZW4gaXQgY2FuIGJlIGRldGVybWluZWQsIGBudWxsYCBvdGhlcndpc2UuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTw/c3RyaW5nPn1cbiAqL1xuY29uc3QgZmFtaWx5ID0gYXN5bmMgKCkgPT4ge1xuICBsZXQgZmFtaWx5ID0gbnVsbDtcbiAgaWYgKGlzTGludXgoKSkge1xuICAgIGZhbWlseSA9IGF3YWl0IGZhbWlseUZyb21JbnRlcnByZXRlcigpO1xuICAgIGlmICghZmFtaWx5KSB7XG4gICAgICBmYW1pbHkgPSBhd2FpdCBmYW1pbHlGcm9tRmlsZXN5c3RlbSgpO1xuICAgICAgaWYgKCFmYW1pbHkpIHtcbiAgICAgICAgZmFtaWx5ID0gZmFtaWx5RnJvbVJlcG9ydCgpO1xuICAgICAgfVxuICAgICAgaWYgKCFmYW1pbHkpIHtcbiAgICAgICAgY29uc3Qgb3V0ID0gYXdhaXQgc2FmZUNvbW1hbmQoKTtcbiAgICAgICAgZmFtaWx5ID0gZmFtaWx5RnJvbUNvbW1hbmQob3V0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbWlseTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGliYyBmYW1pbHkgd2hlbiBpdCBjYW4gYmUgZGV0ZXJtaW5lZCwgYG51bGxgIG90aGVyd2lzZS5cbiAqIEByZXR1cm5zIHs/c3RyaW5nfVxuICovXG5jb25zdCBmYW1pbHlTeW5jID0gKCkgPT4ge1xuICBsZXQgZmFtaWx5ID0gbnVsbDtcbiAgaWYgKGlzTGludXgoKSkge1xuICAgIGZhbWlseSA9IGZhbWlseUZyb21JbnRlcnByZXRlclN5bmMoKTtcbiAgICBpZiAoIWZhbWlseSkge1xuICAgICAgZmFtaWx5ID0gZmFtaWx5RnJvbUZpbGVzeXN0ZW1TeW5jKCk7XG4gICAgICBpZiAoIWZhbWlseSkge1xuICAgICAgICBmYW1pbHkgPSBmYW1pbHlGcm9tUmVwb3J0KCk7XG4gICAgICB9XG4gICAgICBpZiAoIWZhbWlseSkge1xuICAgICAgICBjb25zdCBvdXQgPSBzYWZlQ29tbWFuZFN5bmMoKTtcbiAgICAgICAgZmFtaWx5ID0gZmFtaWx5RnJvbUNvbW1hbmQob3V0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbWlseTtcbn07XG5cbi8qKlxuICogUmVzb2x2ZXMgYHRydWVgIG9ubHkgd2hlbiB0aGUgcGxhdGZvcm0gaXMgTGludXggYW5kIHRoZSBsaWJjIGZhbWlseSBpcyBub3QgYGdsaWJjYC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICovXG5jb25zdCBpc05vbkdsaWJjTGludXggPSBhc3luYyAoKSA9PiBpc0xpbnV4KCkgJiYgYXdhaXQgZmFtaWx5KCkgIT09IEdMSUJDO1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIG9ubHkgd2hlbiB0aGUgcGxhdGZvcm0gaXMgTGludXggYW5kIHRoZSBsaWJjIGZhbWlseSBpcyBub3QgYGdsaWJjYC5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc05vbkdsaWJjTGludXhTeW5jID0gKCkgPT4gaXNMaW51eCgpICYmIGZhbWlseVN5bmMoKSAhPT0gR0xJQkM7XG5cbmNvbnN0IHZlcnNpb25Gcm9tRmlsZXN5c3RlbSA9IGFzeW5jICgpID0+IHtcbiAgaWYgKGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkVmVyc2lvbkZpbGVzeXN0ZW07XG4gIH1cbiAgY2FjaGVkVmVyc2lvbkZpbGVzeXN0ZW0gPSBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IGxkZENvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShMRERfUEFUSCk7XG4gICAgY29uc3QgdmVyc2lvbk1hdGNoID0gbGRkQ29udGVudC5tYXRjaChSRV9HTElCQ19WRVJTSU9OKTtcbiAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICBjYWNoZWRWZXJzaW9uRmlsZXN5c3RlbSA9IHZlcnNpb25NYXRjaFsxXTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHt9XG4gIHJldHVybiBjYWNoZWRWZXJzaW9uRmlsZXN5c3RlbTtcbn07XG5cbmNvbnN0IHZlcnNpb25Gcm9tRmlsZXN5c3RlbVN5bmMgPSAoKSA9PiB7XG4gIGlmIChjYWNoZWRWZXJzaW9uRmlsZXN5c3RlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtO1xuICB9XG4gIGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBsZGRDb250ZW50ID0gcmVhZEZpbGVTeW5jKExERF9QQVRIKTtcbiAgICBjb25zdCB2ZXJzaW9uTWF0Y2ggPSBsZGRDb250ZW50Lm1hdGNoKFJFX0dMSUJDX1ZFUlNJT04pO1xuICAgIGlmICh2ZXJzaW9uTWF0Y2gpIHtcbiAgICAgIGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtID0gdmVyc2lvbk1hdGNoWzFdO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtO1xufTtcblxuY29uc3QgdmVyc2lvbkZyb21SZXBvcnQgPSAoKSA9PiB7XG4gIGNvbnN0IHJlcG9ydCA9IGdldFJlcG9ydCgpO1xuICBpZiAocmVwb3J0LmhlYWRlciAmJiByZXBvcnQuaGVhZGVyLmdsaWJjVmVyc2lvblJ1bnRpbWUpIHtcbiAgICByZXR1cm4gcmVwb3J0LmhlYWRlci5nbGliY1ZlcnNpb25SdW50aW1lO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgdmVyc2lvblN1ZmZpeCA9IChzKSA9PiBzLnRyaW0oKS5zcGxpdCgvXFxzKy8pWzFdO1xuXG5jb25zdCB2ZXJzaW9uRnJvbUNvbW1hbmQgPSAob3V0KSA9PiB7XG4gIGNvbnN0IFtnZXRjb25mLCBsZGQxLCBsZGQyXSA9IG91dC5zcGxpdCgvW1xcclxcbl0rLyk7XG4gIGlmIChnZXRjb25mICYmIGdldGNvbmYuaW5jbHVkZXMoR0xJQkMpKSB7XG4gICAgcmV0dXJuIHZlcnNpb25TdWZmaXgoZ2V0Y29uZik7XG4gIH1cbiAgaWYgKGxkZDEgJiYgbGRkMiAmJiBsZGQxLmluY2x1ZGVzKE1VU0wpKSB7XG4gICAgcmV0dXJuIHZlcnNpb25TdWZmaXgobGRkMik7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIFJlc29sdmVzIHdpdGggdGhlIGxpYmMgdmVyc2lvbiB3aGVuIGl0IGNhbiBiZSBkZXRlcm1pbmVkLCBgbnVsbGAgb3RoZXJ3aXNlLlxuICogQHJldHVybnMge1Byb21pc2U8P3N0cmluZz59XG4gKi9cbmNvbnN0IHZlcnNpb24gPSBhc3luYyAoKSA9PiB7XG4gIGxldCB2ZXJzaW9uID0gbnVsbDtcbiAgaWYgKGlzTGludXgoKSkge1xuICAgIHZlcnNpb24gPSBhd2FpdCB2ZXJzaW9uRnJvbUZpbGVzeXN0ZW0oKTtcbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIHZlcnNpb24gPSB2ZXJzaW9uRnJvbVJlcG9ydCgpO1xuICAgIH1cbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIGNvbnN0IG91dCA9IGF3YWl0IHNhZmVDb21tYW5kKCk7XG4gICAgICB2ZXJzaW9uID0gdmVyc2lvbkZyb21Db21tYW5kKG91dCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2ZXJzaW9uO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsaWJjIHZlcnNpb24gd2hlbiBpdCBjYW4gYmUgZGV0ZXJtaW5lZCwgYG51bGxgIG90aGVyd2lzZS5cbiAqIEByZXR1cm5zIHs/c3RyaW5nfVxuICovXG5jb25zdCB2ZXJzaW9uU3luYyA9ICgpID0+IHtcbiAgbGV0IHZlcnNpb24gPSBudWxsO1xuICBpZiAoaXNMaW51eCgpKSB7XG4gICAgdmVyc2lvbiA9IHZlcnNpb25Gcm9tRmlsZXN5c3RlbVN5bmMoKTtcbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIHZlcnNpb24gPSB2ZXJzaW9uRnJvbVJlcG9ydCgpO1xuICAgIH1cbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIGNvbnN0IG91dCA9IHNhZmVDb21tYW5kU3luYygpO1xuICAgICAgdmVyc2lvbiA9IHZlcnNpb25Gcm9tQ29tbWFuZChvdXQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmVyc2lvbjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBHTElCQyxcbiAgTVVTTCxcbiAgZmFtaWx5LFxuICBmYW1pbHlTeW5jLFxuICBpc05vbkdsaWJjTGludXgsXG4gIGlzTm9uR2xpYmNMaW51eFN5bmMsXG4gIHZlcnNpb24sXG4gIHZlcnNpb25TeW5jXG59O1xuIiwKICAgICJjb25zdCBCUk9XU0VSX01BUFBJTkcgPSB7XG4gIGFuZF9jaHI6ICdjaHJvbWUnLFxuICBhbmRfZmY6ICdmaXJlZm94JyxcbiAgaWVfbW9iOiAnaWUnLFxuICBvcF9tb2I6ICdvcGVyYScsXG4gIGFuZF9xcTogbnVsbCxcbiAgYW5kX3VjOiBudWxsLFxuICBiYWlkdTogbnVsbCxcbiAgYmI6IG51bGwsXG4gIGthaW9zOiBudWxsLFxuICBvcF9taW5pOiBudWxsLFxufTtcblxuZnVuY3Rpb24gYnJvd3NlcnNsaXN0VG9UYXJnZXRzKGJyb3dzZXJzbGlzdCkge1xuICBsZXQgdGFyZ2V0cyA9IHt9O1xuICBmb3IgKGxldCBicm93c2VyIG9mIGJyb3dzZXJzbGlzdCkge1xuICAgIGxldCBbbmFtZSwgdl0gPSBicm93c2VyLnNwbGl0KCcgJyk7XG4gICAgaWYgKEJST1dTRVJfTUFQUElOR1tuYW1lXSA9PT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbGV0IHZlcnNpb24gPSBwYXJzZVZlcnNpb24odik7XG4gICAgaWYgKHZlcnNpb24gPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRhcmdldHNbbmFtZV0gPT0gbnVsbCB8fCB2ZXJzaW9uIDwgdGFyZ2V0c1tuYW1lXSkge1xuICAgICAgdGFyZ2V0c1tuYW1lXSA9IHZlcnNpb247XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldHM7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVmVyc2lvbih2ZXJzaW9uKSB7XG4gIGxldCBbbWFqb3IsIG1pbm9yID0gMCwgcGF0Y2ggPSAwXSA9IHZlcnNpb25cbiAgICAuc3BsaXQoJy0nKVswXVxuICAgIC5zcGxpdCgnLicpXG4gICAgLm1hcCh2ID0+IHBhcnNlSW50KHYsIDEwKSk7XG5cbiAgaWYgKGlzTmFOKG1ham9yKSB8fCBpc05hTihtaW5vcikgfHwgaXNOYU4ocGF0Y2gpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gKG1ham9yIDw8IDE2KSB8IChtaW5vciA8PCA4KSB8IHBhdGNoO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJyb3dzZXJzbGlzdFRvVGFyZ2V0cztcbiIsCiAgICAiLy8gQHRzLWNoZWNrXG4vKiogQHR5cGVkZWYge2ltcG9ydCgnLi9pbmRleCcpLlZpc2l0b3J9IFZpc2l0b3IgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KCcuL2luZGV4JykuVmlzaXRvckZ1bmN0aW9ufSBWaXNpdG9yRnVuY3Rpb24gKi9cblxuLyoqXG4gKiBDb21wb3NlcyBtdWx0aXBsZSB2aXNpdG9yIG9iamVjdHMgaW50byBhIHNpbmdsZSBvbmUuXG4gKiBAcGFyYW0geyhWaXNpdG9yIHwgVmlzaXRvckZ1bmN0aW9uKVtdfSB2aXNpdG9ycyBcbiAqIEByZXR1cm4ge1Zpc2l0b3IgfCBWaXNpdG9yRnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VWaXNpdG9ycyh2aXNpdG9ycykge1xuICBpZiAodmlzaXRvcnMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHZpc2l0b3JzWzBdO1xuICB9XG4gIFxuICBpZiAodmlzaXRvcnMuc29tZSh2ID0+IHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSkge1xuICAgIHJldHVybiAob3B0cykgPT4ge1xuICAgICAgbGV0IHYgPSB2aXNpdG9ycy5tYXAodiA9PiB0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJyA/IHYob3B0cykgOiB2KTtcbiAgICAgIHJldHVybiBjb21wb3NlVmlzaXRvcnModik7XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAdHlwZSBWaXNpdG9yICovXG4gIGxldCByZXMgPSB7fTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdTdHlsZVNoZWV0Jyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnU3R5bGVTaGVldEV4aXQnKTtcbiAgY29tcG9zZU9iamVjdFZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdSdWxlJywgcnVsZVZpc2l0b3IsIHdyYXBDdXN0b21BbmRVbmtub3duQXRSdWxlKTtcbiAgY29tcG9zZU9iamVjdFZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdSdWxlRXhpdCcsIHJ1bGVWaXNpdG9yLCB3cmFwQ3VzdG9tQW5kVW5rbm93bkF0UnVsZSk7XG4gIGNvbXBvc2VPYmplY3RWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnRGVjbGFyYXRpb24nLCBkZWNsYXJhdGlvblZpc2l0b3IsIHdyYXBDdXN0b21Qcm9wZXJ0eSk7XG4gIGNvbXBvc2VPYmplY3RWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnRGVjbGFyYXRpb25FeGl0JywgZGVjbGFyYXRpb25WaXNpdG9yLCB3cmFwQ3VzdG9tUHJvcGVydHkpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ1VybCcpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ0NvbG9yJyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnSW1hZ2UnKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdJbWFnZUV4aXQnKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdMZW5ndGgnKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdBbmdsZScpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ1JhdGlvJyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnUmVzb2x1dGlvbicpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ1RpbWUnKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdDdXN0b21JZGVudCcpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ0Rhc2hlZElkZW50Jyk7XG4gIGNvbXBvc2VBcnJheUZ1bmN0aW9ucyhyZXMsIHZpc2l0b3JzLCAnTWVkaWFRdWVyeScpO1xuICBjb21wb3NlQXJyYXlGdW5jdGlvbnMocmVzLCB2aXNpdG9ycywgJ01lZGlhUXVlcnlFeGl0Jyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnU3VwcG9ydHNDb25kaXRpb24nKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdTdXBwb3J0c0NvbmRpdGlvbkV4aXQnKTtcbiAgY29tcG9zZUFycmF5RnVuY3Rpb25zKHJlcywgdmlzaXRvcnMsICdTZWxlY3RvcicpO1xuICBjb21wb3NlVG9rZW5WaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnVG9rZW4nLCAndG9rZW4nLCBmYWxzZSk7XG4gIGNvbXBvc2VUb2tlblZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdGdW5jdGlvbicsICdmdW5jdGlvbicsIGZhbHNlKTtcbiAgY29tcG9zZVRva2VuVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ0Z1bmN0aW9uRXhpdCcsICdmdW5jdGlvbicsIHRydWUpO1xuICBjb21wb3NlVG9rZW5WaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnVmFyaWFibGUnLCAndmFyJywgZmFsc2UpO1xuICBjb21wb3NlVG9rZW5WaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnVmFyaWFibGVFeGl0JywgJ3ZhcicsIHRydWUpO1xuICBjb21wb3NlVG9rZW5WaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnRW52aXJvbm1lbnRWYXJpYWJsZScsICdlbnYnLCBmYWxzZSk7XG4gIGNvbXBvc2VUb2tlblZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdFbnZpcm9ubWVudFZhcmlhYmxlRXhpdCcsICdlbnYnLCB0cnVlKTtcbiAgcmV0dXJuIHJlcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb21wb3NlVmlzaXRvcnM7XG5cbmZ1bmN0aW9uIHdyYXBDdXN0b21BbmRVbmtub3duQXRSdWxlKGssIGYpIHtcbiAgaWYgKGsgPT09ICd1bmtub3duJykge1xuICAgIHJldHVybiAodmFsdWUgPT4gZih7IHR5cGU6ICd1bmtub3duJywgdmFsdWUgfSkpO1xuICB9XG4gIGlmIChrID09PSAnY3VzdG9tJykge1xuICAgIHJldHVybiAodmFsdWUgPT4gZih7IHR5cGU6ICdjdXN0b20nLCB2YWx1ZSB9KSk7XG4gIH1cbiAgcmV0dXJuIGY7XG59XG5cbmZ1bmN0aW9uIHdyYXBDdXN0b21Qcm9wZXJ0eShrLCBmKSB7XG4gIHJldHVybiBrID09PSAnY3VzdG9tJyA/ICh2YWx1ZSA9PiBmKHsgcHJvcGVydHk6ICdjdXN0b20nLCB2YWx1ZSB9KSkgOiBmO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2luZGV4JykuVmlzaXRvclsnUnVsZSddfSBmIFxuICogQHBhcmFtIHtpbXBvcnQoJy4vYXN0JykuUnVsZX0gaXRlbSBcbiAqL1xuZnVuY3Rpb24gcnVsZVZpc2l0b3IoZiwgaXRlbSkge1xuICBpZiAodHlwZW9mIGYgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gJ3Vua25vd24nKSB7XG4gICAgICBsZXQgdiA9IGYudW5rbm93bjtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdiA9IHZbaXRlbS52YWx1ZS5uYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2Py4oaXRlbS52YWx1ZSk7XG4gICAgfVxuICAgIGlmIChpdGVtLnR5cGUgPT09ICdjdXN0b20nKSB7XG4gICAgICBsZXQgdiA9IGYuY3VzdG9tO1xuICAgICAgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0Jykge1xuICAgICAgICB2ID0gdltpdGVtLnZhbHVlLm5hbWVdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHY/LihpdGVtLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZbaXRlbS50eXBlXT8uKGl0ZW0pO1xuICB9XG4gIHJldHVybiBmPy4oaXRlbSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW5kZXgnKS5WaXNpdG9yWydEZWNsYXJhdGlvbiddfSBmIFxuICogQHBhcmFtIHtpbXBvcnQoJy4vYXN0JykuRGVjbGFyYXRpb259IGl0ZW0gXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmF0aW9uVmlzaXRvcihmLCBpdGVtKSB7XG4gIGlmICh0eXBlb2YgZiA9PT0gJ29iamVjdCcpIHtcbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICBsZXQgbmFtZSA9IGl0ZW0ucHJvcGVydHk7XG4gICAgaWYgKGl0ZW0ucHJvcGVydHkgPT09ICd1bnBhcnNlZCcpIHtcbiAgICAgIG5hbWUgPSBpdGVtLnZhbHVlLnByb3BlcnR5SWQucHJvcGVydHk7XG4gICAgfSBlbHNlIGlmIChpdGVtLnByb3BlcnR5ID09PSAnY3VzdG9tJykge1xuICAgICAgbGV0IHYgPSBmLmN1c3RvbTtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdiA9IHZbaXRlbS52YWx1ZS5uYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2Py4oaXRlbS52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBmW25hbWVdPy4oaXRlbSk7XG4gIH1cbiAgcmV0dXJuIGY/LihpdGVtKTtcbn1cblxuLyoqXG4gKiBcbiAqIEBwYXJhbSB7VmlzaXRvcltdfSB2aXNpdG9ycyBcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgXG4gKiBAcmV0dXJucyB7W2FueVtdLCBib29sZWFuLCBTZXQ8c3RyaW5nPl19XG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RPYmplY3RzT3JGdW5jdGlvbnModmlzaXRvcnMsIGtleSkge1xuICBsZXQgdmFsdWVzID0gW107XG4gIGxldCBoYXNGdW5jdGlvbiA9IGZhbHNlO1xuICBsZXQgYWxsS2V5cyA9IG5ldyBTZXQoKTtcbiAgZm9yIChsZXQgdmlzaXRvciBvZiB2aXNpdG9ycykge1xuICAgIGxldCB2ID0gdmlzaXRvcltrZXldO1xuICAgIGlmICh2KSB7XG4gICAgICBpZiAodHlwZW9mIHYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaGFzRnVuY3Rpb24gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHYpIHtcbiAgICAgICAgICBhbGxLZXlzLmFkZChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YWx1ZXMucHVzaCh2KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFt2YWx1ZXMsIGhhc0Z1bmN0aW9uLCBhbGxLZXlzXTtcbn1cblxuLyoqXG4gKiBAdGVtcGxhdGUge2tleW9mIFZpc2l0b3J9IEtcbiAqIEBwYXJhbSB7VmlzaXRvcn0gcmVzXG4gKiBAcGFyYW0ge1Zpc2l0b3JbXX0gdmlzaXRvcnNcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0geyh2aXNpdG9yOiBWaXNpdG9yW0tdLCBpdGVtOiBhbnkpID0+IGFueSB8IGFueVtdIHwgdm9pZH0gYXBwbHkgXG4gKiBAcGFyYW0geyhrOiBzdHJpbmcsIGY6IGFueSkgPT4gYW55fSB3cmFwS2V5IFxuICovXG5mdW5jdGlvbiBjb21wb3NlT2JqZWN0VmlzaXRvcnMocmVzLCB2aXNpdG9ycywga2V5LCBhcHBseSwgd3JhcEtleSkge1xuICBsZXQgW3ZhbHVlcywgaGFzRnVuY3Rpb24sIGFsbEtleXNdID0gZXh0cmFjdE9iamVjdHNPckZ1bmN0aW9ucyh2aXNpdG9ycywga2V5KTtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJlc1trZXldID0gdmFsdWVzWzBdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBmID0gY3JlYXRlQXJyYXlWaXNpdG9yKHZpc2l0b3JzLCAodmlzaXRvciwgaXRlbSkgPT4gYXBwbHkodmlzaXRvcltrZXldLCBpdGVtKSk7XG4gIGlmIChoYXNGdW5jdGlvbikge1xuICAgIHJlc1trZXldID0gZjtcbiAgfSBlbHNlIHtcbiAgICAvKiogQHR5cGUge2FueX0gKi9cbiAgICBsZXQgdiA9IHt9O1xuICAgIGZvciAobGV0IGsgb2YgYWxsS2V5cykge1xuICAgICAgdltrXSA9IHdyYXBLZXkoaywgZik7XG4gICAgfVxuICAgIHJlc1trZXldID0gdjtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7VmlzaXRvcn0gcmVzIFxuICogQHBhcmFtIHtWaXNpdG9yW119IHZpc2l0b3JzIFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2FzdCcpLlRva2VuT3JWYWx1ZVsndHlwZSddfSB0eXBlIFxuICogQHBhcmFtIHtib29sZWFufSBpc0V4aXQgXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VUb2tlblZpc2l0b3JzKHJlcywgdmlzaXRvcnMsIGtleSwgdHlwZSwgaXNFeGl0KSB7XG4gIGxldCBbdmFsdWVzLCBoYXNGdW5jdGlvbiwgYWxsS2V5c10gPSBleHRyYWN0T2JqZWN0c09yRnVuY3Rpb25zKHZpc2l0b3JzLCBrZXkpO1xuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh2YWx1ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgcmVzW2tleV0gPSB2YWx1ZXNbMF07XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGYgPSBjcmVhdGVUb2tlblZpc2l0b3IodmlzaXRvcnMsIHR5cGUsIGlzRXhpdCk7XG4gIGlmIChoYXNGdW5jdGlvbikge1xuICAgIHJlc1trZXldID0gZjtcbiAgfSBlbHNlIHtcbiAgICBsZXQgdiA9IHt9O1xuICAgIGZvciAobGV0IGtleSBvZiBhbGxLZXlzKSB7XG4gICAgICB2W2tleV0gPSBmO1xuICAgIH1cbiAgICByZXNba2V5XSA9IHY7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge1Zpc2l0b3JbXX0gdmlzaXRvcnMgXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9hc3QnKS5Ub2tlbk9yVmFsdWVbJ3R5cGUnXX0gdHlwZSBcbiAqL1xuZnVuY3Rpb24gY3JlYXRlVG9rZW5WaXNpdG9yKHZpc2l0b3JzLCB0eXBlLCBpc0V4aXQpIHtcbiAgbGV0IHYgPSBjcmVhdGVBcnJheVZpc2l0b3IodmlzaXRvcnMsICh2aXNpdG9yLCAvKiogQHR5cGUge2ltcG9ydCgnLi9hc3QnKS5Ub2tlbk9yVmFsdWV9ICovIGl0ZW0pID0+IHtcbiAgICBsZXQgZjtcbiAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgY2FzZSAndG9rZW4nOlxuICAgICAgICBmID0gdmlzaXRvci5Ub2tlbjtcbiAgICAgICAgaWYgKHR5cGVvZiBmID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGYgPSBmW2l0ZW0udmFsdWUudHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgIGYgPSBpc0V4aXQgPyB2aXNpdG9yLkZ1bmN0aW9uRXhpdCA6IHZpc2l0b3IuRnVuY3Rpb247XG4gICAgICAgIGlmICh0eXBlb2YgZiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBmID0gZltpdGVtLnZhbHVlLm5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndmFyJzpcbiAgICAgICAgZiA9IGlzRXhpdCA/IHZpc2l0b3IuVmFyaWFibGVFeGl0IDogdmlzaXRvci5WYXJpYWJsZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlbnYnOlxuICAgICAgICBmID0gaXNFeGl0ID8gdmlzaXRvci5FbnZpcm9ubWVudFZhcmlhYmxlRXhpdCA6IHZpc2l0b3IuRW52aXJvbm1lbnRWYXJpYWJsZTtcbiAgICAgICAgaWYgKHR5cGVvZiBmID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGxldCBuYW1lO1xuICAgICAgICAgIHN3aXRjaCAoaXRlbS52YWx1ZS5uYW1lLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3VhJzpcbiAgICAgICAgICAgIGNhc2UgJ3Vua25vd24nOlxuICAgICAgICAgICAgICBuYW1lID0gaXRlbS52YWx1ZS5uYW1lLnZhbHVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2N1c3RvbSc6XG4gICAgICAgICAgICAgIG5hbWUgPSBpdGVtLnZhbHVlLm5hbWUuaWRlbnQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmID0gZltuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NvbG9yJzpcbiAgICAgICAgZiA9IHZpc2l0b3IuQ29sb3I7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndXJsJzpcbiAgICAgICAgZiA9IHZpc2l0b3IuVXJsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xlbmd0aCc6XG4gICAgICAgIGYgPSB2aXNpdG9yLkxlbmd0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhbmdsZSc6XG4gICAgICAgIGYgPSB2aXNpdG9yLkFuZ2xlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgICBmID0gdmlzaXRvci5UaW1lO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Jlc29sdXRpb24nOlxuICAgICAgICBmID0gdmlzaXRvci5SZXNvbHV0aW9uO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Rhc2hlZC1pZGVudCc6XG4gICAgICAgIGYgPSB2aXNpdG9yLkRhc2hlZElkZW50O1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoIWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmVzID0gZihpdGVtLnZhbHVlKTtcbiAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgY2FzZSAnY29sb3InOlxuICAgICAgY2FzZSAndXJsJzpcbiAgICAgIGNhc2UgJ2xlbmd0aCc6XG4gICAgICBjYXNlICdhbmdsZSc6XG4gICAgICBjYXNlICd0aW1lJzpcbiAgICAgIGNhc2UgJ3Jlc29sdXRpb24nOlxuICAgICAgY2FzZSAnZGFzaGVkLWlkZW50JzpcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkge1xuICAgICAgICAgIHJlcyA9IHJlcy5tYXAodmFsdWUgPT4gKHsgdHlwZTogaXRlbS50eXBlLCB2YWx1ZSB9KSlcbiAgICAgICAgfSBlbHNlIGlmIChyZXMpIHtcbiAgICAgICAgICByZXMgPSB7IHR5cGU6IGl0ZW0udHlwZSwgdmFsdWU6IHJlcyB9O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH0pO1xuXG4gIHJldHVybiB2YWx1ZSA9PiB2KHsgdHlwZSwgdmFsdWUgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtWaXNpdG9yW119IHZpc2l0b3JzIFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEZ1bmN0aW9ucyh2aXNpdG9ycywga2V5KSB7XG4gIGxldCBmdW5jdGlvbnMgPSBbXTtcbiAgZm9yIChsZXQgdmlzaXRvciBvZiB2aXNpdG9ycykge1xuICAgIGxldCBmID0gdmlzaXRvcltrZXldO1xuICAgIGlmIChmKSB7XG4gICAgICBmdW5jdGlvbnMucHVzaChmKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9ucztcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1Zpc2l0b3J9IHJlcyBcbiAqIEBwYXJhbSB7VmlzaXRvcltdfSB2aXNpdG9ycyBcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCBrZXkpIHtcbiAgbGV0IGZ1bmN0aW9ucyA9IGV4dHJhY3RGdW5jdGlvbnModmlzaXRvcnMsIGtleSk7XG4gIGlmIChmdW5jdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGZ1bmN0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXNba2V5XSA9IGZ1bmN0aW9uc1swXTtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXNba2V5XSA9IGFyZyA9PiB7XG4gICAgbGV0IG11dGF0ZWQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBmIG9mIGZ1bmN0aW9ucykge1xuICAgICAgbGV0IHJlcyA9IGYoYXJnKTtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgYXJnID0gcmVzO1xuICAgICAgICBtdXRhdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbXV0YXRlZCA/IGFyZyA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1Zpc2l0b3J9IHJlcyBcbiAqIEBwYXJhbSB7VmlzaXRvcltdfSB2aXNpdG9ycyBcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VBcnJheUZ1bmN0aW9ucyhyZXMsIHZpc2l0b3JzLCBrZXkpIHtcbiAgbGV0IGZ1bmN0aW9ucyA9IGV4dHJhY3RGdW5jdGlvbnModmlzaXRvcnMsIGtleSk7XG4gIGlmIChmdW5jdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGZ1bmN0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXNba2V5XSA9IGZ1bmN0aW9uc1swXTtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXNba2V5XSA9IGNyZWF0ZUFycmF5VmlzaXRvcihmdW5jdGlvbnMsIChmLCBpdGVtKSA9PiBmKGl0ZW0pKTtcbn1cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7VFtdfSB2aXNpdG9ycyBcbiAqIEBwYXJhbSB7KHZpc2l0b3I6IFQsIGl0ZW06IFYpID0+IFYgfCBWW10gfCB2b2lkfSBhcHBseSBcbiAqIEByZXR1cm5zIHsoaXRlbTogVikgPT4gViB8IFZbXSB8IHZvaWR9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUFycmF5VmlzaXRvcih2aXNpdG9ycywgYXBwbHkpIHtcbiAgbGV0IHNlZW4gPSBuZXcgQml0c2V0KHZpc2l0b3JzLmxlbmd0aCk7XG4gIHJldHVybiBhcmcgPT4ge1xuICAgIGxldCBhcnIgPSBbYXJnXTtcbiAgICBsZXQgbXV0YXRlZCA9IGZhbHNlO1xuICAgIHNlZW4uY2xlYXIoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gRm9yIGVhY2ggdmFsdWUsIGNhbGwgYWxsIHZpc2l0b3JzLiBJZiBhIHZpc2l0b3IgcmV0dXJucyBhIG5ldyB2YWx1ZSxcbiAgICAgIC8vIHdlIHN0YXJ0IG92ZXIsIGJ1dCBza2lwIHRoZSB2aXNpdG9yIHRoYXQgZ2VuZXJhdGVkIHRoZSB2YWx1ZSBvciBzYXdcbiAgICAgIC8vIGl0IGJlZm9yZSAodG8gYXZvaWQgY3ljbGVzKS4gVGhpcyB3YXksIHZpc2l0b3JzIGNhbiBiZSBjb21wb3NlZCBpbiBhbnkgb3JkZXIuIFxuICAgICAgZm9yIChsZXQgdiA9IDA7IHYgPCB2aXNpdG9ycy5sZW5ndGggJiYgaSA8IGFyci5sZW5ndGg7KSB7XG4gICAgICAgIGlmIChzZWVuLmdldCh2KSkge1xuICAgICAgICAgIHYrKztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpdGVtID0gYXJyW2ldO1xuICAgICAgICBsZXQgdmlzaXRvciA9IHZpc2l0b3JzW3ZdO1xuICAgICAgICBsZXQgcmVzID0gYXBwbHkodmlzaXRvciwgaXRlbSk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcykpIHtcbiAgICAgICAgICBpZiAocmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgYXJyLnNwbGljZShpLCAxKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGFycltpXSA9IHJlc1swXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJyLnNwbGljZShpLCAxLCAuLi5yZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtdXRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICBzZWVuLnNldCh2KTtcbiAgICAgICAgICB2ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChyZXMpIHtcbiAgICAgICAgICBhcnJbaV0gPSByZXM7XG4gICAgICAgICAgbXV0YXRlZCA9IHRydWU7XG4gICAgICAgICAgc2Vlbi5zZXQodik7XG4gICAgICAgICAgdiA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdisrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFtdXRhdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyci5sZW5ndGggPT09IDEgPyBhcnJbMF0gOiBhcnI7XG4gIH07XG59XG5cbmNsYXNzIEJpdHNldCB7XG4gIGNvbnN0cnVjdG9yKG1heEJpdHMgPSAzMikge1xuICAgIHRoaXMuYml0cyA9IDA7XG4gICAgdGhpcy5tb3JlID0gbWF4Qml0cyA+IDMyID8gbmV3IFVpbnQzMkFycmF5KE1hdGguY2VpbCgobWF4Qml0cyAtIDMyKSAvIDMyKSkgOiBudWxsO1xuICB9XG5cbiAgLyoqIEBwYXJhbSB7bnVtYmVyfSBiaXQgKi9cbiAgZ2V0KGJpdCkge1xuICAgIGlmIChiaXQgPj0gMzIgJiYgdGhpcy5tb3JlKSB7XG4gICAgICBsZXQgaSA9IE1hdGguZmxvb3IoKGJpdCAtIDMyKSAvIDMyKTtcbiAgICAgIGxldCBiID0gYml0ICUgMzI7XG4gICAgICByZXR1cm4gQm9vbGVhbih0aGlzLm1vcmVbaV0gJiAoMSA8PCBiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuYml0cyAmICgxIDw8IGJpdCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge251bWJlcn0gYml0ICovXG4gIHNldChiaXQpIHtcbiAgICBpZiAoYml0ID49IDMyICYmIHRoaXMubW9yZSkge1xuICAgICAgbGV0IGkgPSBNYXRoLmZsb29yKChiaXQgLSAzMikgLyAzMik7XG4gICAgICBsZXQgYiA9IGJpdCAlIDMyO1xuICAgICAgdGhpcy5tb3JlW2ldIHw9IDEgPDwgYjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iaXRzIHw9IDEgPDwgYml0O1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuYml0cyA9IDA7XG4gICAgaWYgKHRoaXMubW9yZSkge1xuICAgICAgdGhpcy5tb3JlLmZpbGwoMCk7XG4gICAgfVxuICB9XG59XG4iLAogICAgIi8vIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGJ5IGJ1aWxkLXByZWZpeGVzLmpzLiBETyBOT1QgRURJVCFcblxuZXhwb3J0cy5GZWF0dXJlcyA9IHtcbiAgTmVzdGluZzogMSxcbiAgTm90U2VsZWN0b3JMaXN0OiAyLFxuICBEaXJTZWxlY3RvcjogNCxcbiAgTGFuZ1NlbGVjdG9yTGlzdDogOCxcbiAgSXNTZWxlY3RvcjogMTYsXG4gIFRleHREZWNvcmF0aW9uVGhpY2tuZXNzUGVyY2VudDogMzIsXG4gIE1lZGlhSW50ZXJ2YWxTeW50YXg6IDY0LFxuICBNZWRpYVJhbmdlU3ludGF4OiAxMjgsXG4gIEN1c3RvbU1lZGlhUXVlcmllczogMjU2LFxuICBDbGFtcEZ1bmN0aW9uOiA1MTIsXG4gIENvbG9yRnVuY3Rpb246IDEwMjQsXG4gIE9rbGFiQ29sb3JzOiAyMDQ4LFxuICBMYWJDb2xvcnM6IDQwOTYsXG4gIFAzQ29sb3JzOiA4MTkyLFxuICBIZXhBbHBoYUNvbG9yczogMTYzODQsXG4gIFNwYWNlU2VwYXJhdGVkQ29sb3JOb3RhdGlvbjogMzI3NjgsXG4gIEZvbnRGYW1pbHlTeXN0ZW1VaTogNjU1MzYsXG4gIERvdWJsZVBvc2l0aW9uR3JhZGllbnRzOiAxMzEwNzIsXG4gIFZlbmRvclByZWZpeGVzOiAyNjIxNDQsXG4gIExvZ2ljYWxQcm9wZXJ0aWVzOiA1MjQyODgsXG4gIExpZ2h0RGFyazogMTA0ODU3NixcbiAgU2VsZWN0b3JzOiAzMSxcbiAgTWVkaWFRdWVyaWVzOiA0NDgsXG4gIENvbG9yczogMTExMzA4OCxcbn07XG4iLAogICAgImxldCBwYXJ0cyA9IFtwcm9jZXNzLnBsYXRmb3JtLCBwcm9jZXNzLmFyY2hdO1xuaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdsaW51eCcpIHtcbiAgY29uc3QgeyBNVVNMLCBmYW1pbHlTeW5jIH0gPSByZXF1aXJlKCdkZXRlY3QtbGliYycpO1xuICBjb25zdCBmYW1pbHkgPSBmYW1pbHlTeW5jKCk7XG4gIGlmIChmYW1pbHkgPT09IE1VU0wpIHtcbiAgICBwYXJ0cy5wdXNoKCdtdXNsJyk7XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAnYXJtJykge1xuICAgIHBhcnRzLnB1c2goJ2dudWVhYmloZicpO1xuICB9IGVsc2Uge1xuICAgIHBhcnRzLnB1c2goJ2dudScpO1xuICB9XG59IGVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgcGFydHMucHVzaCgnbXN2YycpO1xufVxuXG5sZXQgbmF0aXZlO1xudHJ5IHtcbiAgbmF0aXZlID0gcmVxdWlyZShgbGlnaHRuaW5nY3NzLSR7cGFydHMuam9pbignLScpfWApO1xufSBjYXRjaCAoZXJyKSB7XG4gIG5hdGl2ZSA9IHJlcXVpcmUoYC4uL2xpZ2h0bmluZ2Nzcy4ke3BhcnRzLmpvaW4oJy0nKX0ubm9kZWApO1xufVxuXG5tb2R1bGUuZXhwb3J0cy50cmFuc2Zvcm0gPSB3cmFwKG5hdGl2ZS50cmFuc2Zvcm0pO1xubW9kdWxlLmV4cG9ydHMudHJhbnNmb3JtU3R5bGVBdHRyaWJ1dGUgPSB3cmFwKG5hdGl2ZS50cmFuc2Zvcm1TdHlsZUF0dHJpYnV0ZSk7XG5tb2R1bGUuZXhwb3J0cy5idW5kbGUgPSB3cmFwKG5hdGl2ZS5idW5kbGUpO1xubW9kdWxlLmV4cG9ydHMuYnVuZGxlQXN5bmMgPSB3cmFwKG5hdGl2ZS5idW5kbGVBc3luYyk7XG5tb2R1bGUuZXhwb3J0cy5icm93c2Vyc2xpc3RUb1RhcmdldHMgPSByZXF1aXJlKCcuL2Jyb3dzZXJzbGlzdFRvVGFyZ2V0cycpO1xubW9kdWxlLmV4cG9ydHMuY29tcG9zZVZpc2l0b3JzID0gcmVxdWlyZSgnLi9jb21wb3NlVmlzaXRvcnMnKTtcbm1vZHVsZS5leHBvcnRzLkZlYXR1cmVzID0gcmVxdWlyZSgnLi9mbGFncycpLkZlYXR1cmVzO1xuXG5mdW5jdGlvbiB3cmFwKGNhbGwpIHtcbiAgcmV0dXJuIChvcHRpb25zKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnZpc2l0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGxldCBkZXBzID0gW107XG4gICAgICBvcHRpb25zLnZpc2l0b3IgPSBvcHRpb25zLnZpc2l0b3Ioe1xuICAgICAgICBhZGREZXBlbmRlbmN5KGRlcCkge1xuICAgICAgICAgIGRlcHMucHVzaChkZXApO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHJlc3VsdCA9IGNhbGwob3B0aW9ucyk7XG4gICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudGhlbihyZXMgPT4ge1xuICAgICAgICAgIGlmIChkZXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVzLmRlcGVuZGVuY2llcyA/Pz0gW107XG4gICAgICAgICAgICByZXMuZGVwZW5kZW5jaWVzLnB1c2goLi4uZGVwcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChkZXBzLmxlbmd0aCkge1xuICAgICAgICByZXN1bHQuZGVwZW5kZW5jaWVzID8/PSBbXTtcbiAgICAgICAgcmVzdWx0LmRlcGVuZGVuY2llcy5wdXNoKC4uLmRlcHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNhbGwob3B0aW9ucyk7XG4gICAgfVxuICB9O1xufVxuIiwKICAgICIjIS91c3IvYmluL2VudiBidW5cbi8qKlxuICogUG9zdGJ1aWxkIENTUyBwdXJnZSDigJQgc3RhbmRhbG9uZSBCdW4gc2NyaXB0LlxuICpcbiAqIFJ1bnMgYWZ0ZXIgcnNidWlsZCBidWlsZCwgcHVyZ2VzIENTUyBmaWxlcyBpbiBkaXN0LyB1c2luZyB0aGUgcHVyZ2UgbWFuaWZlc3RcbiAqIGFuZCBjb25zdW1lciBKU1ggYW5hbHlzaXMuIFplcm8gTm9kZSBpbXBvcnRzLlxuICpcbiAqIFRocmVlLWxldmVsIHB1cmdlOlxuICogICBMMSDigJQgY2xhc3MtbGV2ZWw6IGRyb3AgcnVsZXMgd2hvc2UgY2xhc3Mgc2VsZWN0b3JzIGFyZW4ndCBpbiB0aGUgc2FmZWxpc3QgKHBvc3Rjc3MpXG4gKiAgIEwyIOKAlCBhdHRyLWxldmVsOiBkcm9wIHJ1bGVzIHdpdGggZGF0YS9hcmlhIGF0dHJpYnV0ZSBzZWxlY3RvcnMgZm9yIHVudXNlZCBwcm9wcyAocG9zdGNzcylcbiAqICAgTDMg4oCUIHZhciBjbGVhbnVwOiBpdGVyYXRpdmVseSByZW1vdmUgZGVjbGFyZWQtYnV0LXVucmVmZXJlbmNlZCBDU1MgY3VzdG9tIHByb3BlcnRpZXMgKHBvc3Rjc3MpXG4gKiAgIEZpbmFsIOKAlCBtaW5pZmljYXRpb24gdmlhIExpZ2h0bmluZyBDU1NcbiAqXG4gKiBVc2FnZTpcbiAqICAgYnVueCBAcGF0aHNjYWxlL3JzYnVpbGQtcGx1Z2luLXVpLWNzcy1wdXJnZSBcXFxuICogICAgIC0tZGlzdCBkaXN0IC0tc3JjIHNyYyAtLW1hbmlmZXN0IG5vZGVfbW9kdWxlcy9AcGF0aHNjYWxlL3VpL2Rpc3QvcHVyZ2UtbWFuaWZlc3QuanNvblxuICovXG5cbmltcG9ydCB7IEdsb2IgfSBmcm9tIFwiYnVuXCI7XG5pbXBvcnQgeyB0cmFuc2Zvcm0gfSBmcm9tIFwibGlnaHRuaW5nY3NzXCI7XG5pbXBvcnQgcG9zdGNzcyBmcm9tIFwicG9zdGNzc1wiO1xuaW1wb3J0IHR5cGUgeyBSdWxlLCBBdFJ1bGUgfSBmcm9tIFwicG9zdGNzc1wiO1xuaW1wb3J0IHsgc2NhbkNvbnN1bWVyU291cmNlLCBidWlsZFNhZmVsaXN0cyB9IGZyb20gXCIuL3NjYW4tY29uc3VtZXJcIjtcbmltcG9ydCB0eXBlIHsgUHVyZ2VNYW5pZmVzdCB9IGZyb20gXCIuL3NjYW4tY29uc3VtZXJcIjtcblxuLy8g4pSA4pSAIENMSSBhcmdzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pOiB7IGRpc3REaXI6IHN0cmluZzsgc3JjRGlyOiBzdHJpbmc7IG1hbmlmZXN0UGF0aDogc3RyaW5nIH0ge1xuICBjb25zdCBhcmdzID0gYXJndi5zbGljZSgyKTtcbiAgbGV0IGRpc3REaXIgPSBcIi4vZGlzdFwiO1xuICBsZXQgc3JjRGlyID0gXCIuL3NyY1wiO1xuICBsZXQgbWFuaWZlc3RQYXRoID0gXCJcIjtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYXJnc1tpXSA9PT0gXCItLWRpc3RcIiAmJiBhcmdzW2kgKyAxXSkgZGlzdERpciA9IGFyZ3NbKytpXTtcbiAgICBlbHNlIGlmIChhcmdzW2ldID09PSBcIi0tc3JjXCIgJiYgYXJnc1tpICsgMV0pIHNyY0RpciA9IGFyZ3NbKytpXTtcbiAgICBlbHNlIGlmIChhcmdzW2ldID09PSBcIi0tbWFuaWZlc3RcIiAmJiBhcmdzW2kgKyAxXSkgbWFuaWZlc3RQYXRoID0gYXJnc1srK2ldO1xuICB9XG5cbiAgaWYgKCFtYW5pZmVzdFBhdGgpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgXCJVc2FnZTogYnVueCBAcGF0aHNjYWxlL3JzYnVpbGQtcGx1Z2luLXVpLWNzcy1wdXJnZSAtLW1hbmlmZXN0IDxwYXRoPiBbLS1kaXN0IDxwYXRoPl0gWy0tc3JjIDxwYXRoPl1cIixcbiAgICApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHJldHVybiB7IGRpc3REaXIsIHNyY0RpciwgbWFuaWZlc3RQYXRoIH07XG59XG5cbi8vIOKUgOKUgCBCdWlsZCBraWxsLWxpc3Q6IGNsYXNzZXMgZnJvbSBjb21wb25lbnRzIHRoYXQgYXJlIG5ldmVyIGltcG9ydGVkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5mdW5jdGlvbiBjb2xsZWN0Q2xhc3Nlc0Zyb21FbnRyeShlbnRyeTogeyBjbGFzc2VzOiB7IGFsd2F5czogc3RyaW5nW107IGJ5UHJvcDogUmVjb3JkPHN0cmluZywgc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4+IH0gfSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcmVzdWx0ID0gWy4uLmVudHJ5LmNsYXNzZXMuYWx3YXlzXTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBPYmplY3QudmFsdWVzKGVudHJ5LmNsYXNzZXMuYnlQcm9wKSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmVzdWx0LnB1c2goLi4udmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGNsYXNzZXMgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goLi4uY2xhc3Nlcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmludGVyZmFjZSBLaWxsTGlzdFJlc3VsdCB7XG4gIGtpbGxMaXN0OiBTZXQ8c3RyaW5nPjtcbiAgLyoqXG4gICAqIEJFTSByb290IGNsYXNzZXMgb2YgY29tcG9uZW50cyB0aGUgY29uc3VtZXIgYWN0dWFsbHkgdXNlcy4gVXNlZCB0b1xuICAgKiBwcmVzZXJ2ZSBwdXJlIGF0dHJpYnV0ZSBzZWxlY3RvciBydWxlcyBsaWtlXG4gICAqIGBbZGF0YS1zbG90PVwiY2hlY2tib3gtZGVmYXVsdC1pbmRpY2F0b3ItLWNoZWNrbWFya1wiXWAgdGhhdCBoYXZlIG5vIGNsYXNzXG4gICAqIHJlZmVyZW5jZSBidXQgYXJlIHN0aWxsIGNvbXBvbmVudC1zY29wZWQuXG4gICAqL1xuICB1c2VkQmVtUm9vdHM6IFNldDxzdHJpbmc+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRLaWxsTGlzdChcbiAgbWFuaWZlc3Q6IFB1cmdlTWFuaWZlc3QsXG4gIGltcG9ydGVkQ29tcG9uZW50czogU2V0PHN0cmluZz4sXG4pOiBLaWxsTGlzdFJlc3VsdCB7XG4gIC8vIEZvciBlYWNoIG1hbmlmZXN0IGVudHJ5LCBjb2xsZWN0IEJFTSByb290IGNsYXNzZXMgKGZyb20gY2xhc3Nlcy5hbHdheXMpLlxuICAvLyBBIGNsYXNzIGlzIGNvbnNpZGVyZWQgYSBCRU0tb3duZWQgY2xhc3Mgb2YgYSBjb21wb25lbnQgaWYgaXQgbWF0Y2hlc1xuICAvLyBvbmUgb2YgaXRzIHJvb3RzOiBleGFjdCBtYXRjaCwgcm9vdC0tLCBvciByb290X18uXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSAoVGFpbHdpbmQgdXRpbGl0aWVzIGxpa2UgZ2FwLTEsIGZsZXgtY29sKSBpcyBuZXZlciBraWxsZWQuXG4gIGNvbnN0IGNvbXBvbmVudEJlbVJvb3RzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuXG4gIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKG1hbmlmZXN0KSkge1xuICAgIGNvbnN0IHJvb3QgPSBrZXkuc3BsaXQoXCIuXCIpWzBdO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gY29tcG9uZW50QmVtUm9vdHMuZ2V0KHJvb3QpID8/IG5ldyBTZXQoKTtcbiAgICBmb3IgKGNvbnN0IGNscyBvZiBlbnRyeS5jbGFzc2VzLmFsd2F5cykge1xuICAgICAgZXhpc3RpbmcuYWRkKGNscyk7XG4gICAgfVxuICAgIGNvbXBvbmVudEJlbVJvb3RzLnNldChyb290LCBleGlzdGluZyk7XG4gIH1cblxuICAvLyBDb2xsZWN0IEFMTCBjbGFzc2VzIHBlciBjb21wb25lbnRcbiAgY29uc3QgY29tcG9uZW50Q2xhc3NlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMobWFuaWZlc3QpKSB7XG4gICAgY29uc3Qgcm9vdCA9IGtleS5zcGxpdChcIi5cIilbMF07XG4gICAgY29uc3QgZXhpc3RpbmcgPSBjb21wb25lbnRDbGFzc2VzLmdldChyb290KSA/PyBbXTtcbiAgICBleGlzdGluZy5wdXNoKC4uLmNvbGxlY3RDbGFzc2VzRnJvbUVudHJ5KGVudHJ5KSk7XG4gICAgY29tcG9uZW50Q2xhc3Nlcy5zZXQocm9vdCwgZXhpc3RpbmcpO1xuICB9XG5cbiAgLy8gRmlsdGVyOiBvbmx5IGluY2x1ZGUgY2xhc3NlcyB0aGF0IG1hdGNoIGEgQkVNIHJvb3Qgb2YgdGhlaXIgY29tcG9uZW50XG4gIGZ1bmN0aW9uIGlzQmVtQ2xhc3MoY2xzOiBzdHJpbmcsIGJlbVJvb3RzOiBTZXQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3Qgcm9vdCBvZiBiZW1Sb290cykge1xuICAgICAgaWYgKGNscyA9PT0gcm9vdCB8fCBjbHMuc3RhcnRzV2l0aChgJHtyb290fS0tYCkgfHwgY2xzLnN0YXJ0c1dpdGgoYCR7cm9vdH1fX2ApKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBraWxsTGlzdCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBzYWZlQ2xhc3NlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCB1c2VkQmVtUm9vdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IFtjb21wb25lbnQsIGNsYXNzZXNdIG9mIGNvbXBvbmVudENsYXNzZXMpIHtcbiAgICBjb25zdCBiZW1Sb290cyA9IGNvbXBvbmVudEJlbVJvb3RzLmdldChjb21wb25lbnQpID8/IG5ldyBTZXQoKTtcbiAgICBpZiAoaW1wb3J0ZWRDb21wb25lbnRzLmhhcyhjb21wb25lbnQpKSB7XG4gICAgICBmb3IgKGNvbnN0IGNscyBvZiBjbGFzc2VzKSBzYWZlQ2xhc3Nlcy5hZGQoY2xzKTtcbiAgICAgIGZvciAoY29uc3Qgcm9vdCBvZiBiZW1Sb290cykgdXNlZEJlbVJvb3RzLmFkZChyb290KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT25seSBraWxsIEJFTS1vd25lZCBjbGFzc2VzLCBub3QgVGFpbHdpbmQgdXRpbGl0aWVzXG4gICAgICBmb3IgKGNvbnN0IGNscyBvZiBjbGFzc2VzKSB7XG4gICAgICAgIGlmIChpc0JlbUNsYXNzKGNscywgYmVtUm9vdHMpKSB7XG4gICAgICAgICAga2lsbExpc3QuYWRkKGNscyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBJZiBhIGNsYXNzIGFwcGVhcnMgaW4gQk9USCB1c2VkIGFuZCB1bnVzZWQgY29tcG9uZW50cywga2VlcCBpdFxuICBmb3IgKGNvbnN0IGNscyBvZiBzYWZlQ2xhc3Nlcykge1xuICAgIGtpbGxMaXN0LmRlbGV0ZShjbHMpO1xuICB9XG5cbiAgcmV0dXJuIHsga2lsbExpc3QsIHVzZWRCZW1Sb290cyB9O1xufVxuXG4vKiogQ29udmVydCBrZWJhYi1jYXNlIGRpcmVjdG9yeSBuYW1lIHRvIFBhc2NhbENhc2UgY29tcG9uZW50IG5hbWUgKi9cbmZ1bmN0aW9uIGtlYmFiVG9QYXNjYWwoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHMuc3BsaXQoXCItXCIpLm1hcCgocCkgPT4gcC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHAuc2xpY2UoMSkpLmpvaW4oXCJcIik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYW5JbXBvcnRlZENvbXBvbmVudHMoc3JjRGlyOiBzdHJpbmcpOiBQcm9taXNlPFNldDxzdHJpbmc+PiB7XG4gIGNvbnN0IGltcG9ydGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGdsb2IgPSBuZXcgR2xvYihcIioqLyoue3RzeCx0cyxqc3gsanN9XCIpO1xuXG4gIGZvciBhd2FpdCAoY29uc3QgcmVsUGF0aCBvZiBnbG9iLnNjYW4oeyBjd2Q6IHNyY0RpciB9KSkge1xuICAgIGlmIChyZWxQYXRoLmluY2x1ZGVzKFwibm9kZV9tb2R1bGVzXCIpKSBjb250aW51ZTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IGAke3NyY0Rpcn0vJHtyZWxQYXRofWA7XG4gICAgY29uc3QgY29kZSA9IGF3YWl0IEJ1bi5maWxlKGZ1bGxQYXRoKS50ZXh0KCk7XG4gICAgaWYgKCFjb2RlLmluY2x1ZGVzKFwiQHBhdGhzY2FsZS91aVwiKSkgY29udGludWU7XG5cbiAgICAvLyBNYXRjaCBiYXJyZWw6IGltcG9ydCB7IEZvbywgQmFyIGFzIEJheiB9IGZyb20gXCJAcGF0aHNjYWxlL3VpXCJcbiAgICBjb25zdCBiYXJyZWxSZWdleCA9IC9pbXBvcnRcXHMqXFx7KFtefV0rKVxcfVxccypmcm9tXFxzKlsnXCJdQHBhdGhzY2FsZVxcL3VpWydcIl0vZztcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGNvZGUubWF0Y2hBbGwoYmFycmVsUmVnZXgpKSB7XG4gICAgICBjb25zdCBzcGVjaWZpZXJzID0gbWF0Y2hbMV0uc3BsaXQoXCIsXCIpO1xuICAgICAgZm9yIChjb25zdCBzcGVjIG9mIHNwZWNpZmllcnMpIHtcbiAgICAgICAgY29uc3QgdHJpbW1lZCA9IHNwZWMudHJpbSgpO1xuICAgICAgICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKFwidHlwZSBcIikpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBuYW1lID0gdHJpbW1lZC5zcGxpdCgvXFxzK2FzXFxzKy8pWzBdLnRyaW0oKTtcbiAgICAgICAgaWYgKG5hbWUgJiYgL15bQS1aXS8udGVzdChuYW1lKSkge1xuICAgICAgICAgIGltcG9ydGVkLmFkZChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1hdGNoIGRlZXAtcGF0aCBkZWZhdWx0OiBpbXBvcnQgRm9vIGZyb20gXCJAcGF0aHNjYWxlL3VpL2NvbXBvbmVudHMvZm9vLWJhclwiXG4gICAgY29uc3QgZGVlcERlZmF1bHRSZWdleCA9IC9pbXBvcnRcXHMrKFtBLVpdW2EtekEtWjAtOV0qKVxccytmcm9tXFxzKlsnXCJdQHBhdGhzY2FsZVxcL3VpXFwvY29tcG9uZW50c1xcLyhbXidcIl0rKVsnXCJdL2c7XG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBjb2RlLm1hdGNoQWxsKGRlZXBEZWZhdWx0UmVnZXgpKSB7XG4gICAgICBpbXBvcnRlZC5hZGQobWF0Y2hbMV0pO1xuICAgIH1cblxuICAgIC8vIE1hdGNoIGRlZXAtcGF0aCBuYW1lZDogaW1wb3J0IHsgRm9vLCBCYXIgfSBmcm9tIFwiQHBhdGhzY2FsZS91aS9jb21wb25lbnRzL2Zvby1iYXJcIlxuICAgIGNvbnN0IGRlZXBOYW1lZFJlZ2V4ID0gL2ltcG9ydFxccypcXHsoW159XSspXFx9XFxzKmZyb21cXHMqWydcIl1AcGF0aHNjYWxlXFwvdWlcXC9jb21wb25lbnRzXFwvKFteJ1wiXSspWydcIl0vZztcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGNvZGUubWF0Y2hBbGwoZGVlcE5hbWVkUmVnZXgpKSB7XG4gICAgICBjb25zdCBzcGVjaWZpZXJzID0gbWF0Y2hbMV0uc3BsaXQoXCIsXCIpO1xuICAgICAgZm9yIChjb25zdCBzcGVjIG9mIHNwZWNpZmllcnMpIHtcbiAgICAgICAgY29uc3QgdHJpbW1lZCA9IHNwZWMudHJpbSgpO1xuICAgICAgICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKFwidHlwZSBcIikpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBuYW1lID0gdHJpbW1lZC5zcGxpdCgvXFxzK2FzXFxzKy8pWzBdLnRyaW0oKTtcbiAgICAgICAgaWYgKG5hbWUgJiYgL15bQS1aXS8udGVzdChuYW1lKSkge1xuICAgICAgICAgIGltcG9ydGVkLmFkZChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQWxzbyBhZGQgdGhlIFBhc2NhbENhc2UgbmFtZSBmcm9tIHRoZSBwYXRoIGl0c2VsZiAoY292ZXJzIHN1Yi1jb21wb25lbnRzKVxuICAgICAgY29uc3QgZGlyTmFtZSA9IG1hdGNoWzJdLnNwbGl0KFwiL1wiKVswXTtcbiAgICAgIGltcG9ydGVkLmFkZChrZWJhYlRvUGFzY2FsKGRpck5hbWUpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW1wb3J0ZWQ7XG59XG5cbi8qKlxuICogQnVpbGQgZGVwZW5kZW5jeSBncmFwaCBmcm9tIG1hbmlmZXN0IGBkZXBzYCBmaWVsZHMuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkRGVwR3JhcGhGcm9tTWFuaWZlc3QobWFuaWZlc3Q6IFB1cmdlTWFuaWZlc3QpOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4ge1xuICBjb25zdCBncmFwaCA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcbiAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMobWFuaWZlc3QpKSB7XG4gICAgY29uc3Qgcm9vdCA9IGtleS5zcGxpdChcIi5cIilbMF07XG4gICAgaWYgKGVudHJ5LmRlcHMgJiYgZW50cnkuZGVwcy5sZW5ndGggPiAwICYmICFncmFwaC5oYXMocm9vdCkpIHtcbiAgICAgIGdyYXBoLnNldChyb290LCBuZXcgU2V0KGVudHJ5LmRlcHMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGdyYXBoO1xufVxuXG4vKipcbiAqIEdpdmVuIGRpcmVjdGx5IGltcG9ydGVkIGNvbXBvbmVudHMgYW5kIGEgZGVwZW5kZW5jeSBncmFwaCxcbiAqIHRyYW5zaXRpdmVseSByZXNvbHZlIGFsbCBjb21wb25lbnRzIHRoYXQgYXJlIG5lZWRlZC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRyYW5zaXRpdmVEZXBzKFxuICBpbXBvcnRlZDogU2V0PHN0cmluZz4sXG4gIGRlcEdyYXBoOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4sXG4pOiBTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IHJlc29sdmVkID0gbmV3IFNldChpbXBvcnRlZCk7XG4gIGNvbnN0IHF1ZXVlID0gWy4uLmltcG9ydGVkXTtcblxuICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGNvbXAgPSBxdWV1ZS5wb3AoKSE7XG4gICAgY29uc3QgZGVwcyA9IGRlcEdyYXBoLmdldChjb21wKTtcbiAgICBpZiAoIWRlcHMpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgIGlmICghcmVzb2x2ZWQuaGFzKGRlcCkpIHtcbiAgICAgICAgcmVzb2x2ZWQuYWRkKGRlcCk7XG4gICAgICAgIHF1ZXVlLnB1c2goZGVwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG5cbi8vIOKUgOKUgCBMZXZlbCAxOiBjbGFzcy1sZXZlbCBwdXJnZSArIGtleWZyYW1lcyArIGZvbnQtZmFjZSArIGVsZW1lbnQgc2VsZWN0b3JzIOKUgOKUgOKUgFxuXG4vKiogVW5lc2NhcGUgQ1NTIGlkZW50aWZpZXJzOiBgaWNvbi1cXFttZGktLWNvZ1xcXWAg4oaSIGBpY29uLVttZGktLWNvZ11gICovXG5mdW5jdGlvbiB1bmVzY2FwZUNzcyhzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcy5yZXBsYWNlKC9cXFxcKC4pL2csIFwiJDFcIik7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RDbGFzc2VzRnJvbVNlbGVjdG9yKHNlbGVjdG9yOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIC8vIE1hdGNoIGNsYXNzIHNlbGVjdG9ycyBpbmNsdWRpbmcgQ1NTIGVzY2FwZSBzZXF1ZW5jZXMgKGUuZy4gLmljb24tXFxbbWRpLS1jb2dcXF0pXG4gIGNvbnN0IG1hdGNoZXMgPSBzZWxlY3Rvci5tYXRjaEFsbCgvXFwuKFthLXpBLVpfLV0oPzpbYS16QS1aMC05Xy1dfFxcXFxbXlxcc10pKikvZyk7XG4gIHJldHVybiBbLi4ubWF0Y2hlc10ubWFwKChtKSA9PiB1bmVzY2FwZUNzcyhtWzFdKSk7XG59XG5cbi8vIEVsZW1lbnRzIHRoYXQgYXJlIGFsd2F5cyBrZXB0IChmdW5kYW1lbnRhbCByZXNldCB0YXJnZXRzKS5cbi8vIEV2ZXJ5dGhpbmcgZWxzZSAoc3ViLCBzdXAsIGltZywgc2VsZWN0LCB0ZXh0YXJlYSwgZXRjLikgaXMgc3RyaXBwZWRcbi8vIHVubGVzcyBpdCBhcHBlYXJzIGFsb25nc2lkZSBhIHNhZmVsaXN0ZWQgY2xhc3MuXG5jb25zdCBBTFdBWVNfS0VFUF9TRUxFQ1RPUlMgPSBuZXcgU2V0KFtcbiAgXCIqXCIsIFwiaHRtbFwiLCBcImJvZHlcIiwgXCI6cm9vdFwiLCBcIjo6YmVmb3JlXCIsIFwiOjphZnRlclwiLFxuICBcIjpiZWZvcmVcIiwgXCI6YWZ0ZXJcIiwgXCI6OmJhY2tkcm9wXCIsXG5dKTtcblxuLyoqXG4gKiBFeHRyYWN0IGFsbCBgW2RhdGEtc2xvdD1cIi4uLlwiXWAgYXR0cmlidXRlIHZhbHVlcyBmcm9tIGEgc2VsZWN0b3IuIEhhbmRsZXNcbiAqIHF1b3RlZCBhbmQgdW5xdW90ZWQgZm9ybXMgKExpZ2h0bmluZyBDU1Mgc3RyaXBzIHF1b3RlcyB3aGVuIHRoZSB2YWx1ZSBpcyBhXG4gKiBzaW1wbGUgaWRlbnRpZmllci1saWtlIHRva2VuLCBzbyBwb3N0LW1pbmlmeSBDU1Mgb2Z0ZW4gbG9va3MgbGlrZVxuICogYFtkYXRhLXNsb3Q9Y2hlY2tib3gtZGVmYXVsdC1pbmRpY2F0b3ItLWNoZWNrbWFya11gKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3REYXRhU2xvdFZhbHVlcyhzZWw6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCByZSA9IC9cXFtkYXRhLXNsb3Q9KD86XCIoW15cIl0rKVwifCcoW14nXSspJ3woW15cXF1cXHNdKykpXFxdL2c7XG4gIGZvciAoY29uc3QgbSBvZiBzZWwubWF0Y2hBbGwocmUpKSB7XG4gICAgY29uc3QgdiA9IG1bMV0gPz8gbVsyXSA/PyBtWzNdO1xuICAgIGlmICh2KSB2YWx1ZXMucHVzaCh2KTtcbiAgfVxuICByZXR1cm4gdmFsdWVzO1xufVxuXG4vKipcbiAqIFRydWUgd2hlbiBldmVyeSBgW2RhdGEtc2xvdD1cIlhcIl1gIGluIGBzZWxgIGJlbG9uZ3MgdG8gYSB1c2VkIGNvbXBvbmVudCDigJRcbiAqIFggbWF0Y2hlcyBvbmUgb2YgYHVzZWRCZW1Sb290c2AgYXMgZXhhY3QsIG9yIGFzIGByb290LWAsIGByb290X19gLCBgcm9vdC0tYFxuICogcHJlZml4LiBSZXR1cm5zIGZhbHNlIHdoZW4gdGhlIHNlbGVjdG9yIGhhcyBubyBgW2RhdGEtc2xvdF1gIGF0IGFsbFxuICogKGNhbGxlciBkZWNpZGVzIHZpYSBvdGhlciBoZXVyaXN0aWNzKSBvciB3aGVuIGFueSBzbG90IGRvZXNuJ3QgbWF0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRhU2xvdHNNYXRjaFVzZWRSb290cyhzZWw6IHN0cmluZywgdXNlZEJlbVJvb3RzOiBTZXQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICBjb25zdCBzbG90cyA9IGV4dHJhY3REYXRhU2xvdFZhbHVlcyhzZWwpO1xuICBpZiAoc2xvdHMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIGZvciAoY29uc3Qgc2xvdCBvZiBzbG90cykge1xuICAgIGxldCBtYXRjaGVkID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCByb290IG9mIHVzZWRCZW1Sb290cykge1xuICAgICAgaWYgKFxuICAgICAgICBzbG90ID09PSByb290IHx8XG4gICAgICAgIHNsb3Quc3RhcnRzV2l0aChgJHtyb290fS1gKSB8fFxuICAgICAgICBzbG90LnN0YXJ0c1dpdGgoYCR7cm9vdH1fX2ApIHx8XG4gICAgICAgIHNsb3Quc3RhcnRzV2l0aChgJHtyb290fS0tYClcbiAgICAgICkge1xuICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghbWF0Y2hlZCkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNLZWVwYWJsZU5vbkNsYXNzU2VsZWN0b3IoXG4gIHNlbDogc3RyaW5nLFxuICB1c2VkQmVtUm9vdHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHN0cmlwcGVkID0gc2VsLnRyaW0oKTtcblxuICAvLyBFeGFjdCBtYXRjaCBvbiBmdW5kYW1lbnRhbCBzZWxlY3RvcnNcbiAgZm9yIChjb25zdCBlbCBvZiBBTFdBWVNfS0VFUF9TRUxFQ1RPUlMpIHtcbiAgICBpZiAoc3RyaXBwZWQgPT09IGVsKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBbGxvdyBwc2V1ZG8tZWxlbWVudHMvY2xhc3NlcyBhdHRhY2hlZCB0byBmdW5kYW1lbnRhbCBzZWxlY3RvcnNcbiAgICAvLyBlLmcuICo6OmJlZm9yZSwgaHRtbDpub3QoW2RhdGEtdGhlbWVdKVxuICAgIGlmIChzdHJpcHBlZC5zdGFydHNXaXRoKGVsICsgXCI6XCIpIHx8IHN0cmlwcGVkLnN0YXJ0c1dpdGgoZWwgKyBcIltcIikgfHwgc3RyaXBwZWQuc3RhcnRzV2l0aChlbCArIFwiIFwiKSkgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBLZWVwIDpyb290IHdpdGggcHNldWRvL2F0dHIgKHRoZW1lIHNlbGVjdG9ycyBsaWtlIDpyb290Om5vdChbZGF0YS10aGVtZV0pKVxuICBpZiAoL146cm9vdC8udGVzdChzdHJpcHBlZCkpIHJldHVybiB0cnVlO1xuXG4gIC8vIEtlZXAgYXR0cmlidXRlLW9ubHkgc2VsZWN0b3JzIGxpa2UgW2RhdGEtdGhlbWU9ZGFya10g4oCUIHRoZW1lIHZhcmlhYmxlIGRlY2xhcmF0aW9uc1xuICBpZiAoL15cXFtkYXRhLXRoZW1lLy50ZXN0KHN0cmlwcGVkKSkgcmV0dXJuIHRydWU7XG5cbiAgLy8gS2VlcCBbaGlkZGVuXSByZXNldCBydWxlc1xuICBpZiAoL15cXFtoaWRkZW4vLnRlc3Qoc3RyaXBwZWQpKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBLZWVwIHB1cmUgYXR0cmlidXRlLXNlbGVjdG9yIHJ1bGVzIHRoYXQgdGFyZ2V0IGEgY29tcG9uZW50LXNjb3BlZFxuICAvLyBbZGF0YS1zbG90PVwiPHJvb3Q+Li4uXCJdIHdoZW4gdGhlIG93bmluZyBjb21wb25lbnQgaXMgdXNlZCBieSB0aGUgY29uc3VtZXIuXG4gIC8vIFdpdGhvdXQgdGhpcywgYmFzZS1zdGF0ZSBydWxlcyBsaWtlXG4gIC8vICAgW2RhdGEtc2xvdD1cImNoZWNrYm94LWRlZmF1bHQtaW5kaWNhdG9yLS1jaGVja21hcmtcIl0geyBvcGFjaXR5OiAwOyAuLi4gfVxuICAvLyBnZXQgZHJvcHBlZCB3aGlsZSB0aGVpciBgZGF0YS1zZWxlY3RlZD10cnVlYCBjb3VudGVycGFydHMgc3Vydml2ZSwgbGVhdmluZ1xuICAvLyB0aGUgaW5kaWNhdG9yIGRyYXduIGF0IHJlc3QuXG4gIGlmIChkYXRhU2xvdHNNYXRjaFVzZWRSb290cyhzdHJpcHBlZCwgdXNlZEJlbVJvb3RzKSkgcmV0dXJuIHRydWU7XG5cbiAgLy8gRHJvcCBldmVyeXRoaW5nIGVsc2U6IDpob3N0LCA6d2hlcmUoc2VsZWN0Li4uKSwgZWxlbWVudCBzZWxlY3RvcnMgKHN1Yiwgc3VwLCBpbWcsIGV0Yy4pXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHB1cmdlQ2xhc3NlcyhcbiAgY3NzOiBzdHJpbmcsXG4gIGtpbGxMaXN0OiBTZXQ8c3RyaW5nPixcbiAgdXNlZEJlbVJvb3RzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHJvb3QgPSBwb3N0Y3NzLnBhcnNlKGNzcyk7XG5cbiAgLy8gUGFzcyAxOiByZW1vdmUgc2VsZWN0b3JzIHdoZXJlIEFMTCBjbGFzc2VzIGFyZSBvbiB0aGUga2lsbC1saXN0XG4gIC8vIChpLmUuIHRoZXkgYmVsb25nIGV4Y2x1c2l2ZWx5IHRvIHVudXNlZCBVSSBjb21wb25lbnRzKS5cbiAgLy8gQW55IHNlbGVjdG9yIHdpdGggZXZlbiBvbmUgY2xhc3MgTk9UIG9uIHRoZSBraWxsLWxpc3QgaXMga2VwdC5cbiAgcm9vdC53YWxrUnVsZXMoKHJ1bGUpID0+IHtcbiAgICBjb25zdCBzZWxlY3RvcnMgPSBydWxlLnNlbGVjdG9ycztcbiAgICBjb25zdCBrZXB0OiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBzZWwgb2Ygc2VsZWN0b3JzKSB7XG4gICAgICBjb25zdCBjbGFzc2VzID0gZXh0cmFjdENsYXNzZXNGcm9tU2VsZWN0b3Ioc2VsKTtcbiAgICAgIGlmIChjbGFzc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpZiAoaXNLZWVwYWJsZU5vbkNsYXNzU2VsZWN0b3Ioc2VsLCB1c2VkQmVtUm9vdHMpKSB7XG4gICAgICAgICAga2VwdC5wdXNoKHNlbCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEtlZXAgaWYgQU5ZIGNsYXNzIGlzIG5vdCBvbiB0aGUga2lsbC1saXN0XG4gICAgICBpZiAoY2xhc3Nlcy5zb21lKChjKSA9PiAha2lsbExpc3QuaGFzKGMpKSkge1xuICAgICAgICBrZXB0LnB1c2goc2VsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoa2VwdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJ1bGUucmVtb3ZlKCk7XG4gICAgfSBlbHNlIGlmIChrZXB0Lmxlbmd0aCA8IHNlbGVjdG9ycy5sZW5ndGgpIHtcbiAgICAgIHJ1bGUuc2VsZWN0b3JzID0ga2VwdDtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFBhc3MgMjogY29sbGVjdCBhbmltYXRpb24gbmFtZXMgcmVmZXJlbmNlZCBieSBzdXJ2aXZpbmcgcnVsZXNcbiAgY29uc3QgdXNlZEtleWZyYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICByb290LndhbGtEZWNscygvXmFuaW1hdGlvbigtbmFtZSk/JC8sIChkZWNsKSA9PiB7XG4gICAgLy8gYW5pbWF0aW9uLW5hbWUgY2FuIGJlIGNvbW1hLXNlcGFyYXRlZFxuICAgIGZvciAoY29uc3QgcGFydCBvZiBkZWNsLnZhbHVlLnNwbGl0KFwiLFwiKSkge1xuICAgICAgY29uc3QgbmFtZSA9IHBhcnQudHJpbSgpLnNwbGl0KC9cXHMrLylbMF07XG4gICAgICBpZiAobmFtZSAmJiBuYW1lICE9PSBcIm5vbmVcIiAmJiBuYW1lICE9PSBcImluaXRpYWxcIiAmJiBuYW1lICE9PSBcImluaGVyaXRcIikge1xuICAgICAgICB1c2VkS2V5ZnJhbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIC8vIFBhc3MgMzogcmVtb3ZlIHVudXNlZCBAa2V5ZnJhbWVzXG4gIHJvb3Qud2Fsa0F0UnVsZXMoXCJrZXlmcmFtZXNcIiwgKGF0UnVsZSkgPT4ge1xuICAgIGlmICghdXNlZEtleWZyYW1lcy5oYXMoYXRSdWxlLnBhcmFtcy50cmltKCkpKSB7XG4gICAgICBhdFJ1bGUucmVtb3ZlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBQYXNzIDQ6IGNvbGxlY3QgZm9udCBmYW1pbGllcyByZWZlcmVuY2VkIGJ5IHN1cnZpdmluZyBydWxlc1xuICBjb25zdCB1c2VkRm9udHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcm9vdC53YWxrRGVjbHMoL15mb250KC1mYW1pbHkpPyQvLCAoZGVjbCkgPT4ge1xuICAgIC8vIEV4dHJhY3QgZm9udCBmYW1pbHkgbmFtZXMgKHJvdWdoIGJ1dCBjYXRjaGVzIGNvbW1vbiBwYXR0ZXJucylcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgZGVjbC52YWx1ZS5zcGxpdChcIixcIikpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBwYXJ0LnRyaW0oKS5yZXBsYWNlKC9eW1wiJ118W1wiJ10kL2csIFwiXCIpO1xuICAgICAgaWYgKG5hbWUpIHVzZWRGb250cy5hZGQobmFtZSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBQYXNzIDU6IHJlbW92ZSB1bnVzZWQgQGZvbnQtZmFjZVxuICByb290LndhbGtBdFJ1bGVzKFwiZm9udC1mYWNlXCIsIChhdFJ1bGUpID0+IHtcbiAgICBsZXQgZmFtaWx5ID0gXCJcIjtcbiAgICBhdFJ1bGUud2Fsa0RlY2xzKFwiZm9udC1mYW1pbHlcIiwgKGRlY2wpID0+IHtcbiAgICAgIGZhbWlseSA9IGRlY2wudmFsdWUudHJpbSgpLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgXCJcIik7XG4gICAgfSk7XG4gICAgaWYgKGZhbWlseSAmJiAhdXNlZEZvbnRzLmhhcyhmYW1pbHkpKSB7XG4gICAgICBhdFJ1bGUucmVtb3ZlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBQYXNzIDY6IGNsZWFuIGVtcHR5IGF0LXJ1bGVzXG4gIGxldCBjbGVhbmVkID0gdHJ1ZTtcbiAgd2hpbGUgKGNsZWFuZWQpIHtcbiAgICBjbGVhbmVkID0gZmFsc2U7XG4gICAgcm9vdC53YWxrQXRSdWxlcygoYXRSdWxlKSA9PiB7XG4gICAgICBpZiAoYXRSdWxlLm5vZGVzICYmIGF0UnVsZS5ub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYXRSdWxlLnJlbW92ZSgpO1xuICAgICAgICBjbGVhbmVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByb290LnRvU3RyaW5nKCk7XG59XG5cbi8vIOKUgOKUgCBMZXZlbCAyOiBhdHRyaWJ1dGUgcHVyZ2UgKHBvc3Rjc3MpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5mdW5jdGlvbiBwdXJnZUF0dHJpYnV0ZXMoY3NzOiBzdHJpbmcsIGF0dHJTYWZlbGlzdDogU2V0PHN0cmluZz4pOiBzdHJpbmcge1xuICBjb25zdCByb290ID0gcG9zdGNzcy5wYXJzZShjc3MpO1xuXG4gIHJvb3Qud2Fsa1J1bGVzKChydWxlKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0b3JzID0gcnVsZS5zZWxlY3RvcnM7XG4gICAgY29uc3Qga2VwdDogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3Qgc2VsIG9mIHNlbGVjdG9ycykge1xuICAgICAgY29uc3QgYXR0ck1hdGNoZXMgPSBzZWwubWF0Y2hBbGwoL1xcWyhkYXRhLVthLXotXSt8YXJpYS1bYS16LV0rKT1cIihbXlwiXSspXCJcXF0vZyk7XG4gICAgICBsZXQgc2hvdWxkS2VlcCA9IHRydWU7XG5cbiAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgYXR0ck1hdGNoZXMpIHtcbiAgICAgICAgaWYgKG1hdGNoWzFdID09PSBcImRhdGEtc2xvdFwiKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgYXR0clNlbGVjdG9yID0gYFske21hdGNoWzFdfT1cIiR7bWF0Y2hbMl19XCJdYDtcbiAgICAgICAgaWYgKCFhdHRyU2FmZWxpc3QuaGFzKGF0dHJTZWxlY3RvcikpIHtcbiAgICAgICAgICBzaG91bGRLZWVwID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZEtlZXApIGtlcHQucHVzaChzZWwpO1xuICAgIH1cblxuICAgIGlmIChrZXB0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcnVsZS5yZW1vdmUoKTtcbiAgICB9IGVsc2UgaWYgKGtlcHQubGVuZ3RoIDwgc2VsZWN0b3JzLmxlbmd0aCkge1xuICAgICAgcnVsZS5zZWxlY3RvcnMgPSBrZXB0O1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJvb3QudG9TdHJpbmcoKTtcbn1cblxuLy8g4pSA4pSAIExldmVsIDM6IHVudXNlZCBDU1MgdmFyaWFibGUgY2xlYW51cCAocG9zdGNzcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmZ1bmN0aW9uIGNsZWFuVW51c2VkVmFycyhjc3M6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBjaGFuZ2VkID0gdHJ1ZTtcbiAgbGV0IHJlc3VsdCA9IGNzcztcblxuICB3aGlsZSAoY2hhbmdlZCkge1xuICAgIGNoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCByb290ID0gcG9zdGNzcy5wYXJzZShyZXN1bHQpO1xuXG4gICAgY29uc3QgZGVjbGFyZWQgPSBuZXcgTWFwPHN0cmluZywgeyBydWxlOiBSdWxlIHwgQXRSdWxlOyBwcm9wOiBzdHJpbmcgfVtdPigpO1xuICAgIHJvb3Qud2Fsa0RlY2xzKC9eLS0vLCAoZGVjbCkgPT4ge1xuICAgICAgY29uc3QgZW50cmllcyA9IGRlY2xhcmVkLmdldChkZWNsLnByb3ApID8/IFtdO1xuICAgICAgZW50cmllcy5wdXNoKHsgcnVsZTogZGVjbC5wYXJlbnQgYXMgUnVsZSwgcHJvcDogZGVjbC5wcm9wIH0pO1xuICAgICAgZGVjbGFyZWQuc2V0KGRlY2wucHJvcCwgZW50cmllcyk7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZWZlcmVuY2VkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcm9vdC53YWxrRGVjbHMoKGRlY2wpID0+IHtcbiAgICAgIGNvbnN0IHJlZnMgPSBkZWNsLnZhbHVlLm1hdGNoQWxsKC92YXJcXChcXHMqKC0tW2EtekEtWjAtOV8tXSspL2cpO1xuICAgICAgZm9yIChjb25zdCByZWYgb2YgcmVmcykgcmVmZXJlbmNlZC5hZGQocmVmWzFdKTtcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgW3Zhck5hbWUsIGVudHJpZXNdIG9mIGRlY2xhcmVkKSB7XG4gICAgICBpZiAoIXJlZmVyZW5jZWQuaGFzKHZhck5hbWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgIGVudHJ5LnJ1bGUud2Fsa0RlY2xzKGVudHJ5LnByb3AsIChkZWNsKSA9PiB7XG4gICAgICAgICAgICBkZWNsLnJlbW92ZSgpO1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByb290LndhbGtSdWxlcygocnVsZSkgPT4ge1xuICAgICAgaWYgKHJ1bGUubm9kZXMgJiYgcnVsZS5ub2Rlcy5sZW5ndGggPT09IDApIHJ1bGUucmVtb3ZlKCk7XG4gICAgfSk7XG4gICAgcm9vdC53YWxrQXRSdWxlcygoYXRSdWxlKSA9PiB7XG4gICAgICBpZiAoYXRSdWxlLm5vZGVzICYmIGF0UnVsZS5ub2Rlcy5sZW5ndGggPT09IDApIGF0UnVsZS5yZW1vdmUoKTtcbiAgICB9KTtcblxuICAgIHJlc3VsdCA9IHJvb3QudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIOKUgOKUgCBNaW5pZmljYXRpb246IExpZ2h0bmluZyBDU1Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmZ1bmN0aW9uIG1pbmlmeShjc3M6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgY29kZSB9ID0gdHJhbnNmb3JtKHtcbiAgICBmaWxlbmFtZTogXCJwdXJnZWQuY3NzXCIsXG4gICAgY29kZTogQnVmZmVyLmZyb20oY3NzKSxcbiAgICBtaW5pZnk6IHRydWUsXG4gICAgZXJyb3JSZWNvdmVyeTogdHJ1ZSxcbiAgfSk7XG4gIHJldHVybiBjb2RlLnRvU3RyaW5nKCk7XG59XG5cbi8vIOKUgOKUgCBNYWluIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICBjb25zdCB7IGRpc3REaXIsIHNyY0RpciwgbWFuaWZlc3RQYXRoIH0gPSBwYXJzZUFyZ3MocHJvY2Vzcy5hcmd2KTtcblxuICAvLyAxLiBMb2FkIG1hbmlmZXN0XG4gIGNvbnN0IG1hbmlmZXN0OiBQdXJnZU1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICBhd2FpdCBCdW4uZmlsZShtYW5pZmVzdFBhdGgpLnRleHQoKSxcbiAgKTtcbiAgY29uc3QgdG90YWxDb21wb25lbnRzID0gbmV3IFNldChPYmplY3Qua2V5cyhtYW5pZmVzdCkubWFwKGsgPT4gay5zcGxpdChcIi5cIilbMF0pKS5zaXplO1xuICBjb25zb2xlLmxvZyhgW2Nzcy1wdXJnZV0gTWFuaWZlc3QgbG9hZGVkOiAke09iamVjdC5rZXlzKG1hbmlmZXN0KS5sZW5ndGh9IGVudHJpZXMgKCR7dG90YWxDb21wb25lbnRzfSBjb21wb25lbnRzKWApO1xuXG4gIC8vIDIuIFNjYW4gY29uc3VtZXIgc291cmNlIGZvciBkaXJlY3RseSBpbXBvcnRlZCBjb21wb25lbnRzXG4gIGNvbnN0IGRpcmVjdEltcG9ydHMgPSBhd2FpdCBzY2FuSW1wb3J0ZWRDb21wb25lbnRzKHNyY0Rpcik7XG4gIGNvbnNvbGUubG9nKGBbY3NzLXB1cmdlXSBEaXJlY3QgaW1wb3J0cyBmcm9tIGFwcDogJHtkaXJlY3RJbXBvcnRzLnNpemV9IC8gJHt0b3RhbENvbXBvbmVudHN9YCk7XG5cbiAgLy8gMy4gUmVzb2x2ZSB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyBmcm9tIG1hbmlmZXN0IGRlcHNcbiAgY29uc3QgZGVwR3JhcGggPSBidWlsZERlcEdyYXBoRnJvbU1hbmlmZXN0KG1hbmlmZXN0KTtcbiAgY29uc3QgaW1wb3J0ZWRDb21wb25lbnRzID0gcmVzb2x2ZVRyYW5zaXRpdmVEZXBzKGRpcmVjdEltcG9ydHMsIGRlcEdyYXBoKTtcbiAgY29uc3QgdHJhbnNpdGl2ZSA9IGltcG9ydGVkQ29tcG9uZW50cy5zaXplIC0gZGlyZWN0SW1wb3J0cy5zaXplO1xuICBjb25zb2xlLmxvZyhgW2Nzcy1wdXJnZV0gVHJhbnNpdGl2ZSBkZXBzOiArJHt0cmFuc2l0aXZlfSDihpIgJHtpbXBvcnRlZENvbXBvbmVudHMuc2l6ZX0gdG90YWwgdXNlZCBjb21wb25lbnRzYCk7XG5cbiAgLy8gNC4gQnVpbGQga2lsbC1saXN0IChjbGFzc2VzIGZyb20gY29tcG9uZW50cyBuZXZlciBpbXBvcnRlZCkgKyBhdHRyIHNhZmVsaXN0XG4gIGNvbnN0IHsga2lsbExpc3QsIHVzZWRCZW1Sb290cyB9ID0gYnVpbGRLaWxsTGlzdChtYW5pZmVzdCwgaW1wb3J0ZWRDb21wb25lbnRzKTtcbiAgY29uc29sZS5sb2coYFtjc3MtcHVyZ2VdIEtpbGwtbGlzdDogJHtraWxsTGlzdC5zaXplfSBjbGFzc2VzIGZyb20gJHt0b3RhbENvbXBvbmVudHMgLSBpbXBvcnRlZENvbXBvbmVudHMuc2l6ZX0gdW51c2VkIGNvbXBvbmVudHNgKTtcbiAgY29uc29sZS5sb2coYFtjc3MtcHVyZ2VdIFVzZWQgQkVNIHJvb3RzOiAke3VzZWRCZW1Sb290cy5zaXplfSAocHJlc2VydmVzIFtkYXRhLXNsb3RdIHJ1bGVzIGZvciB1c2VkIGNvbXBvbmVudHMpYCk7XG5cbiAgLy8gQWxzbyBzY2FuIGZvciBwcm9wLWxldmVsIGF0dHIgcHVyZ2luZ1xuICBjb25zdCB1c2FnZXMgPSBhd2FpdCBzY2FuQ29uc3VtZXJTb3VyY2Uoc3JjRGlyKTtcbiAgY29uc3QgeyBhdHRyU2FmZWxpc3QgfSA9IGJ1aWxkU2FmZWxpc3RzKHVzYWdlcywgbWFuaWZlc3QpO1xuXG4gIC8vIDQuIEdsb2IgQ1NTIGZpbGVzIGluIGRpc3RcbiAgY29uc3QgZ2xvYiA9IG5ldyBHbG9iKFwiKiovKi5jc3NcIik7XG4gIGxldCB0b3RhbEJlZm9yZSA9IDA7XG4gIGxldCB0b3RhbEFmdGVyID0gMDtcblxuICBmb3IgYXdhaXQgKGNvbnN0IHJlbFBhdGggb2YgZ2xvYi5zY2FuKHsgY3dkOiBkaXN0RGlyIH0pKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBgJHtkaXN0RGlyfS8ke3JlbFBhdGh9YDtcbiAgICBjb25zdCBvcmlnaW5hbENzcyA9IGF3YWl0IEJ1bi5maWxlKGZ1bGxQYXRoKS50ZXh0KCk7XG4gICAgY29uc3Qgb3JpZ2luYWxTaXplID0gQnVmZmVyLmJ5dGVMZW5ndGgob3JpZ2luYWxDc3MsIFwidXRmLThcIik7XG4gICAgdG90YWxCZWZvcmUgKz0gb3JpZ2luYWxTaXplO1xuXG4gICAgY29uc29sZS5sb2coYFtjc3MtcHVyZ2VdIFByb2Nlc3NpbmcgJHtyZWxQYXRofSAoJHsob3JpZ2luYWxTaXplIC8gMTAyNCkudG9GaXhlZCgxKX0gS0IpYCk7XG5cbiAgICAvLyBMZXZlbCAxOiBjbGFzcy1sZXZlbCBwdXJnZSAodW51c2VkIGNvbXBvbmVudHMgb25seSlcbiAgICBsZXQgcHVyZ2VkQ3NzID0gcHVyZ2VDbGFzc2VzKG9yaWdpbmFsQ3NzLCBraWxsTGlzdCwgdXNlZEJlbVJvb3RzKTtcbiAgICBjb25zdCBhZnRlckwxID0gQnVmZmVyLmJ5dGVMZW5ndGgocHVyZ2VkQ3NzLCBcInV0Zi04XCIpO1xuICAgIGNvbnNvbGUubG9nKGBbY3NzLXB1cmdlXSAgIEwxIGNsYXNzIHB1cmdlOiAkeyhvcmlnaW5hbFNpemUgLyAxMDI0KS50b0ZpeGVkKDEpfSDihpIgJHsoYWZ0ZXJMMSAvIDEwMjQpLnRvRml4ZWQoMSl9IEtCYCk7XG5cbiAgICAvLyBMZXZlbCAyOiBhdHRyaWJ1dGUtbGV2ZWwgcHVyZ2VcbiAgICBwdXJnZWRDc3MgPSBwdXJnZUF0dHJpYnV0ZXMocHVyZ2VkQ3NzLCBhdHRyU2FmZWxpc3QpO1xuICAgIGNvbnN0IGFmdGVyTDIgPSBCdWZmZXIuYnl0ZUxlbmd0aChwdXJnZWRDc3MsIFwidXRmLThcIik7XG4gICAgY29uc29sZS5sb2coYFtjc3MtcHVyZ2VdICAgTDIgYXR0ciBwdXJnZTogJHsoYWZ0ZXJMMSAvIDEwMjQpLnRvRml4ZWQoMSl9IOKGkiAkeyhhZnRlckwyIC8gMTAyNCkudG9GaXhlZCgxKX0gS0JgKTtcblxuICAgIC8vIExldmVsIDM6IHVudXNlZCBDU1MgdmFyaWFibGUgY2xlYW51cFxuICAgIHB1cmdlZENzcyA9IGNsZWFuVW51c2VkVmFycyhwdXJnZWRDc3MpO1xuICAgIGNvbnN0IGFmdGVyTDMgPSBCdWZmZXIuYnl0ZUxlbmd0aChwdXJnZWRDc3MsIFwidXRmLThcIik7XG4gICAgY29uc29sZS5sb2coYFtjc3MtcHVyZ2VdICAgTDMgdmFyIGNsZWFudXA6IOKGkiAkeyhhZnRlckwzIC8gMTAyNCkudG9GaXhlZCgxKX0gS0JgKTtcblxuICAgIC8vIEZpbmFsOiBtaW5pZmljYXRpb24gdmlhIExpZ2h0bmluZyBDU1NcbiAgICBwdXJnZWRDc3MgPSBtaW5pZnkocHVyZ2VkQ3NzKTtcbiAgICBjb25zdCBmaW5hbFNpemUgPSBCdWZmZXIuYnl0ZUxlbmd0aChwdXJnZWRDc3MsIFwidXRmLThcIik7XG4gICAgdG90YWxBZnRlciArPSBmaW5hbFNpemU7XG4gICAgY29uc29sZS5sb2coYFtjc3MtcHVyZ2VdICAgTWluaWZ5IChsaWdodG5pbmdjc3MpOiDihpIgJHsoZmluYWxTaXplIC8gMTAyNCkudG9GaXhlZCgxKX0gS0JgKTtcbiAgICBjb25zb2xlLmxvZyhgW2Nzcy1wdXJnZV0gICBGaW5hbDogJHsob3JpZ2luYWxTaXplIC8gMTAyNCkudG9GaXhlZCgxKX0g4oaSICR7KGZpbmFsU2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSl9IEtCICgkeygoMSAtIGZpbmFsU2l6ZSAvIG9yaWdpbmFsU2l6ZSkgKiAxMDApLnRvRml4ZWQoMSl9JSByZWR1Y3Rpb24pYCk7XG5cbiAgICBhd2FpdCBCdW4ud3JpdGUoZnVsbFBhdGgsIHB1cmdlZENzcyk7XG4gIH1cblxuICBjb25zb2xlLmxvZyhgXFxuW2Nzcy1wdXJnZV0gVG90YWw6ICR7KHRvdGFsQmVmb3JlIC8gMTAyNCkudG9GaXhlZCgxKX0g4oaSICR7KHRvdGFsQWZ0ZXIgLyAxMDI0KS50b0ZpeGVkKDEpfSBLQiAoJHsoKDEgLSB0b3RhbEFmdGVyIC8gdG90YWxCZWZvcmUpICogMTAwKS50b0ZpeGVkKDEpfSUgcmVkdWN0aW9uKWApO1xufVxuXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuICBtYWluKCk7XG59XG4iLAogICAgImltcG9ydCBpbmRleCBmcm9tICcuL2luZGV4LmpzJztcblxuY29uc3QgeyB0cmFuc2Zvcm0sIHRyYW5zZm9ybVN0eWxlQXR0cmlidXRlLCBidW5kbGUsIGJ1bmRsZUFzeW5jLCBicm93c2Vyc2xpc3RUb1RhcmdldHMsIGNvbXBvc2VWaXNpdG9ycywgRmVhdHVyZXMgfSA9IGluZGV4O1xuZXhwb3J0IHsgdHJhbnNmb3JtLCB0cmFuc2Zvcm1TdHlsZUF0dHJpYnV0ZSwgYnVuZGxlLCBidW5kbGVBc3luYywgYnJvd3NlcnNsaXN0VG9UYXJnZXRzLCBjb21wb3NlVmlzaXRvcnMsIEZlYXR1cmVzIH07XG4iLAogICAgIi8qKlxuICogQ29uc3VtZXItc2lkZSBKU1ggc2Nhbm5lci5cbiAqXG4gKiBXYWxrcyBhIGNvbnN1bWVyJ3Mgc291cmNlIHRyZWUsIGZpbmRzIGNvbXBvbmVudCBpbXBvcnRzIGZyb20gQHBhdGhzY2FsZS91aSxcbiAqIGNvbGxlY3RzIHByb3AgdmFsdWVzLCBhbmQgY3Jvc3MtcmVmZXJlbmNlcyB3aXRoIHRoZSBwdXJnZSBtYW5pZmVzdCB0byBidWlsZFxuICogTGV2ZWwgMSAoY2xhc3MpIGFuZCBMZXZlbCAyIChhdHRyaWJ1dGUpIHNhZmVsaXN0cy5cbiAqXG4gKiBVc2FnZTogIGJ1biBydW4gc3JjL3NjYW4tY29uc3VtZXIudHMgPGNvbnN1bWVyLXNyYy1kaXI+IDxwdXJnZS1tYW5pZmVzdC5qc29uPlxuICovXG5cbmltcG9ydCBzd2MgZnJvbSBcIkBzd2MvY29yZVwiO1xuaW1wb3J0IHsgR2xvYiB9IGZyb20gXCJidW5cIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbi8vIOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIENvbXBvbmVudE1hbmlmZXN0IHtcbiAgY2xhc3Nlczoge1xuICAgIGFsd2F5czogc3RyaW5nW107XG4gICAgYnlQcm9wOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPj47XG4gIH07XG4gIGF0dHJzPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gIGRlcHM/OiBzdHJpbmdbXTtcbn1cblxudHlwZSBQdXJnZU1hbmlmZXN0ID0gUmVjb3JkPHN0cmluZywgQ29tcG9uZW50TWFuaWZlc3Q+O1xuXG4vKiogV2hhdCB3ZSBjb2xsZWN0IHBlciBjb21wb25lbnQgdXNhZ2UgZnJvbSBKU1ggKi9cbmludGVyZmFjZSBQcm9wVXNhZ2Uge1xuICBjb21wb25lbnQ6IHN0cmluZztcbiAgcHJvcHM6IE1hcDxzdHJpbmcsIHN0cmluZyB8IFwiRFlOQU1JQ1wiPjsgLy8gcHJvcE5hbWUg4oaSIGxpdGVyYWwgdmFsdWUgb3IgRFlOQU1JQ1xuICBib29sZWFuUHJvcHM6IFNldDxzdHJpbmc+OyAvLyBwcm9wcyBwcmVzZW50IHdpdGhvdXQgYSB2YWx1ZSAodHJ1dGh5KVxuICBoYXNTcHJlYWQ6IGJvb2xlYW47XG59XG5cbi8vIOKUgOKUgCBBU1Qgd2Fsa2VyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5mdW5jdGlvbiB3YWxrQVNUKG5vZGU6IGFueSwgdmlzaXRvcjogKG5vZGU6IGFueSkgPT4gdm9pZCkge1xuICBpZiAoIW5vZGUgfHwgdHlwZW9mIG5vZGUgIT09IFwib2JqZWN0XCIpIHJldHVybjtcbiAgdmlzaXRvcihub2RlKTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobm9kZSkpIHtcbiAgICBpZiAoa2V5ID09PSBcInNwYW5cIikgY29udGludWU7XG4gICAgY29uc3QgdmFsID0gbm9kZVtrZXldO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWwpIHdhbGtBU1QoaXRlbSwgdmlzaXRvcik7XG4gICAgfSBlbHNlIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgd2Fsa0FTVCh2YWwsIHZpc2l0b3IpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogRXh0cmFjdCBAcGF0aHNjYWxlL3VpIGltcG9ydHMgZnJvbSBhIHBhcnNlZCBtb2R1bGUgKi9cbmZ1bmN0aW9uIGV4dHJhY3RVSUltcG9ydHMoYXN0OiBhbnkpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgaW1wb3J0cyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGZvciAoY29uc3Qgbm9kZSBvZiBhc3QuYm9keSkge1xuICAgIGlmIChub2RlLnR5cGUgIT09IFwiSW1wb3J0RGVjbGFyYXRpb25cIikgY29udGludWU7XG4gICAgY29uc3Qgc3JjID0gbm9kZS5zb3VyY2U/LnZhbHVlIGFzIHN0cmluZztcbiAgICBpZiAoIXNyYyB8fCAhc3JjLnN0YXJ0c1dpdGgoXCJAcGF0aHNjYWxlL3VpXCIpKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBub2RlLnNwZWNpZmllcnMpIHtcbiAgICAgIGlmIChzcGVjLnR5cGUgPT09IFwiSW1wb3J0U3BlY2lmaWVyXCIpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0ZWQgPSBzcGVjLmltcG9ydGVkPy52YWx1ZSA/PyBzcGVjLmxvY2FsPy52YWx1ZTtcbiAgICAgICAgY29uc3QgbG9jYWwgPSBzcGVjLmxvY2FsPy52YWx1ZTtcbiAgICAgICAgaWYgKGxvY2FsICYmIGltcG9ydGVkKSBpbXBvcnRzLnNldChsb2NhbCwgaW1wb3J0ZWQpO1xuICAgICAgfSBlbHNlIGlmIChzcGVjLnR5cGUgPT09IFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiKSB7XG4gICAgICAgIGNvbnN0IGxvY2FsID0gc3BlYy5sb2NhbD8udmFsdWU7XG4gICAgICAgIGlmIChsb2NhbCkgaW1wb3J0cy5zZXQobG9jYWwsIGxvY2FsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGltcG9ydHM7XG59XG5cbi8qKiBFeHRyYWN0IEpTWCB1c2FnZXMgb2YgVUkgY29tcG9uZW50cyAqL1xuZnVuY3Rpb24gZXh0cmFjdEpTWFVzYWdlcyhhc3Q6IGFueSwgdWlDb21wb25lbnRzOiBNYXA8c3RyaW5nLCBzdHJpbmc+KTogUHJvcFVzYWdlW10ge1xuICBjb25zdCB1c2FnZXM6IFByb3BVc2FnZVtdID0gW107XG5cbiAgd2Fsa0FTVChhc3QsIChub2RlKSA9PiB7XG4gICAgaWYgKG5vZGUudHlwZSAhPT0gXCJKU1hPcGVuaW5nRWxlbWVudFwiKSByZXR1cm47XG5cbiAgICBsZXQgZWxlbWVudE5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCByb290TmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICBpZiAobm9kZS5uYW1lPy50eXBlID09PSBcIklkZW50aWZpZXJcIikge1xuICAgICAgZWxlbWVudE5hbWUgPSBub2RlLm5hbWUudmFsdWU7XG4gICAgICByb290TmFtZSA9IGVsZW1lbnROYW1lO1xuICAgIH0gZWxzZSBpZiAobm9kZS5uYW1lPy50eXBlID09PSBcIkpTWE1lbWJlckV4cHJlc3Npb25cIikge1xuICAgICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgICBsZXQgY3Vyc29yID0gbm9kZS5uYW1lO1xuICAgICAgd2hpbGUgKGN1cnNvcj8udHlwZSA9PT0gXCJKU1hNZW1iZXJFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgcGFydHMudW5zaGlmdChjdXJzb3IucHJvcGVydHk/LnZhbHVlKTtcbiAgICAgICAgY3Vyc29yID0gY3Vyc29yLm9iamVjdDtcbiAgICAgIH1cbiAgICAgIGlmIChjdXJzb3I/LnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XG4gICAgICAgIHBhcnRzLnVuc2hpZnQoY3Vyc29yLnZhbHVlKTtcbiAgICAgICAgcm9vdE5hbWUgPSBjdXJzb3IudmFsdWU7XG4gICAgICB9XG4gICAgICBlbGVtZW50TmFtZSA9IHBhcnRzLmpvaW4oXCIuXCIpO1xuICAgIH1cblxuICAgIGlmICghcm9vdE5hbWUgfHwgIXVpQ29tcG9uZW50cy5oYXMocm9vdE5hbWUpKSByZXR1cm47XG5cbiAgICBjb25zdCB1c2FnZTogUHJvcFVzYWdlID0ge1xuICAgICAgY29tcG9uZW50OiBlbGVtZW50TmFtZSEsXG4gICAgICBwcm9wczogbmV3IE1hcCgpLFxuICAgICAgYm9vbGVhblByb3BzOiBuZXcgU2V0KCksXG4gICAgICBoYXNTcHJlYWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IGF0dHIgb2Ygbm9kZS5hdHRyaWJ1dGVzIHx8IFtdKSB7XG4gICAgICBpZiAoYXR0ci50eXBlID09PSBcIlNwcmVhZEVsZW1lbnRcIiB8fCBhdHRyLnR5cGUgPT09IFwiSlNYU3ByZWFkQXR0cmlidXRlXCIpIHtcbiAgICAgICAgdXNhZ2UuaGFzU3ByZWFkID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoYXR0ci50eXBlICE9PSBcIkpTWEF0dHJpYnV0ZVwiKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgcHJvcE5hbWUgPSBhdHRyLm5hbWU/LnZhbHVlO1xuICAgICAgaWYgKCFwcm9wTmFtZSkgY29udGludWU7XG5cbiAgICAgIGlmICghYXR0ci52YWx1ZSkge1xuICAgICAgICB1c2FnZS5ib29sZWFuUHJvcHMuYWRkKHByb3BOYW1lKTtcbiAgICAgIH0gZWxzZSBpZiAoYXR0ci52YWx1ZS50eXBlID09PSBcIlN0cmluZ0xpdGVyYWxcIikge1xuICAgICAgICB1c2FnZS5wcm9wcy5zZXQocHJvcE5hbWUsIGF0dHIudmFsdWUudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXNhZ2UucHJvcHMuc2V0KHByb3BOYW1lLCBcIkRZTkFNSUNcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXNhZ2VzLnB1c2godXNhZ2UpO1xuICB9KTtcblxuICByZXR1cm4gdXNhZ2VzO1xufVxuXG4vLyDilIDilIAgU2FmZWxpc3QgYnVpbGRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIFNhZmVsaXN0cyB7XG4gIGNsYXNzU2FmZWxpc3Q6IFNldDxzdHJpbmc+O1xuICBhdHRyU2FmZWxpc3Q6IFNldDxzdHJpbmc+O1xufVxuXG5mdW5jdGlvbiBidWlsZFNhZmVsaXN0cyhcbiAgYWxsVXNhZ2VzOiBQcm9wVXNhZ2VbXSxcbiAgbWFuaWZlc3Q6IFB1cmdlTWFuaWZlc3QsXG4pOiBTYWZlbGlzdHMge1xuICBjb25zdCBjbGFzc1NhZmVsaXN0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGF0dHJTYWZlbGlzdCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0IGNvbXBvbmVudFVzYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9wVXNhZ2VbXT4oKTtcbiAgZm9yIChjb25zdCB1c2FnZSBvZiBhbGxVc2FnZXMpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IGNvbXBvbmVudFVzYWdlcy5nZXQodXNhZ2UuY29tcG9uZW50KSA/PyBbXTtcbiAgICBleGlzdGluZy5wdXNoKHVzYWdlKTtcbiAgICBjb21wb25lbnRVc2FnZXMuc2V0KHVzYWdlLmNvbXBvbmVudCwgZXhpc3RpbmcpO1xuICB9XG5cbiAgZm9yIChjb25zdCBbZW50cnlOYW1lLCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMobWFuaWZlc3QpKSB7XG4gICAgY29uc3QgbWF0Y2hpbmdVc2FnZXMgPSBmaW5kTWF0Y2hpbmdVc2FnZXMoZW50cnlOYW1lLCBjb21wb25lbnRVc2FnZXMpO1xuXG4gICAgaWYgKG1hdGNoaW5nVXNhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjbHMgb2YgZW50cnkuY2xhc3Nlcy5hbHdheXMpIHtcbiAgICAgIGNsYXNzU2FmZWxpc3QuYWRkKGNscyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbcHJvcE9yU2xvdCwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudHJ5LmNsYXNzZXMuYnlQcm9wKSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGlmIChpc1Byb3BVc2VkKHByb3BPclNsb3QsIG1hdGNoaW5nVXNhZ2VzKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgY2xzIG9mIHZhbHVlKSBjbGFzc1NhZmVsaXN0LmFkZChjbHMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB1c2VkVmFsdWVzID0gZ2V0VXNlZEVudW1WYWx1ZXMocHJvcE9yU2xvdCwgbWF0Y2hpbmdVc2FnZXMpO1xuICAgICAgICBpZiAodXNlZFZhbHVlcyA9PT0gXCJBTExcIikge1xuICAgICAgICAgIGZvciAoY29uc3QgY2xhc3NlcyBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjbHMgb2YgY2xhc3NlcykgY2xhc3NTYWZlbGlzdC5hZGQoY2xzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgdXNlZFZhbHVlcykge1xuICAgICAgICAgICAgaWYgKHZhbHVlW3ZhbF0pIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBjbHMgb2YgdmFsdWVbdmFsXSkgY2xhc3NTYWZlbGlzdC5hZGQoY2xzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW50cnkuYXR0cnMpIHtcbiAgICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBhdHRyTWFwXSBvZiBPYmplY3QuZW50cmllcyhlbnRyeS5hdHRycykpIHtcbiAgICAgICAgaWYgKGlzUHJvcFVzZWQocHJvcE5hbWUsIG1hdGNoaW5nVXNhZ2VzKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgW2F0dHIsIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMoYXR0ck1hcCkpIHtcbiAgICAgICAgICAgIGF0dHJTYWZlbGlzdC5hZGQoYCR7YXR0cn09JHt2YWx9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgY2xhc3NTYWZlbGlzdCwgYXR0clNhZmVsaXN0IH07XG59XG5cbmZ1bmN0aW9uIGZpbmRNYXRjaGluZ1VzYWdlcyhcbiAgZW50cnlOYW1lOiBzdHJpbmcsXG4gIHVzYWdlTWFwOiBNYXA8c3RyaW5nLCBQcm9wVXNhZ2VbXT4sXG4pOiBQcm9wVXNhZ2VbXSB7XG4gIGlmICh1c2FnZU1hcC5oYXMoZW50cnlOYW1lKSkge1xuICAgIHJldHVybiB1c2FnZU1hcC5nZXQoZW50cnlOYW1lKSE7XG4gIH1cblxuICBjb25zdCByZXN1bHRzOiBQcm9wVXNhZ2VbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFt1c2FnZU5hbWUsIHVzYWdlc10gb2YgdXNhZ2VNYXApIHtcbiAgICBpZiAodXNhZ2VOYW1lID09PSBlbnRyeU5hbWUpIHtcbiAgICAgIHJlc3VsdHMucHVzaCguLi51c2FnZXMpO1xuICAgIH1cbiAgICBpZiAoZW50cnlOYW1lLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgY29uc3QgW2ZhbWlseSwgcGFydF0gPSBlbnRyeU5hbWUuc3BsaXQoXCIuXCIpO1xuICAgICAgaWYgKHBhcnQgPT09IGZhbWlseSAmJiB1c2FnZU5hbWUgPT09IGZhbWlseSkge1xuICAgICAgICByZXN1bHRzLnB1c2goLi4udXNhZ2VzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIGlzUHJvcFVzZWQocHJvcE5hbWU6IHN0cmluZywgdXNhZ2VzOiBQcm9wVXNhZ2VbXSk6IGJvb2xlYW4ge1xuICBmb3IgKGNvbnN0IHVzYWdlIG9mIHVzYWdlcykge1xuICAgIGlmICh1c2FnZS5oYXNTcHJlYWQpIHJldHVybiB0cnVlO1xuICAgIGlmICh1c2FnZS5ib29sZWFuUHJvcHMuaGFzKHByb3BOYW1lKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHVzYWdlLnByb3BzLmhhcyhwcm9wTmFtZSkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0VXNlZEVudW1WYWx1ZXMoc2xvdE5hbWU6IHN0cmluZywgdXNhZ2VzOiBQcm9wVXNhZ2VbXSk6IFNldDxzdHJpbmc+IHwgXCJBTExcIiB7XG4gIGNvbnN0IHZhbHVlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHVzYWdlIG9mIHVzYWdlcykge1xuICAgIGlmICh1c2FnZS5oYXNTcHJlYWQpIHJldHVybiBcIkFMTFwiO1xuICAgIGNvbnN0IHZhbCA9IHVzYWdlLnByb3BzLmdldChzbG90TmFtZSk7XG4gICAgaWYgKHZhbCA9PT0gXCJEWU5BTUlDXCIpIHJldHVybiBcIkFMTFwiO1xuICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkgdmFsdWVzLmFkZCh2YWwpO1xuICAgIGlmICh1c2FnZS5ib29sZWFuUHJvcHMuaGFzKHNsb3ROYW1lKSkgcmV0dXJuIFwiQUxMXCI7XG4gIH1cbiAgcmV0dXJuIHZhbHVlcztcbn1cblxuLy8g4pSA4pSAIENvbnN1bWVyIHNvdXJjZSBzY2FubmluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuYXN5bmMgZnVuY3Rpb24gc2NhbkNvbnN1bWVyU291cmNlKHNyY0Rpcjogc3RyaW5nKTogUHJvbWlzZTxQcm9wVXNhZ2VbXT4ge1xuICBjb25zdCBhbGxVc2FnZXM6IFByb3BVc2FnZVtdID0gW107XG4gIGNvbnN0IGdsb2IgPSBuZXcgR2xvYihcIioqLyoue3RzeCx0cyxqc3gsanN9XCIpO1xuXG4gIGZvciBhd2FpdCAoY29uc3QgcmVsUGF0aCBvZiBnbG9iLnNjYW4oeyBjd2Q6IHNyY0RpciB9KSkge1xuICAgIGlmIChyZWxQYXRoLmluY2x1ZGVzKFwibm9kZV9tb2R1bGVzXCIpKSBjb250aW51ZTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihzcmNEaXIsIHJlbFBhdGgpO1xuICAgIGNvbnN0IGNvZGUgPSBhd2FpdCBCdW4uZmlsZShmdWxsUGF0aCkudGV4dCgpO1xuICAgIGlmICghY29kZS5pbmNsdWRlcyhcIkBwYXRoc2NhbGUvdWlcIikpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgaXNUc3ggPSAvXFwuW3RqXXN4JC8udGVzdChyZWxQYXRoKTtcbiAgICBjb25zdCBhc3QgPSBhd2FpdCBzd2MucGFyc2UoY29kZSwgeyBzeW50YXg6IFwidHlwZXNjcmlwdFwiLCB0c3g6IGlzVHN4IH0pO1xuICAgIGNvbnN0IHVpSW1wb3J0cyA9IGV4dHJhY3RVSUltcG9ydHMoYXN0KTtcbiAgICBpZiAodWlJbXBvcnRzLnNpemUgPT09IDApIGNvbnRpbnVlO1xuXG4gICAgYWxsVXNhZ2VzLnB1c2goLi4uZXh0cmFjdEpTWFVzYWdlcyhhc3QsIHVpSW1wb3J0cykpO1xuICB9XG5cbiAgcmV0dXJuIGFsbFVzYWdlcztcbn1cblxuLy8g4pSA4pSAIE1haW4gKHN0YW5kYWxvbmUgQ0xJKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcbiAgY29uc3QgW3NyY0RpciwgbWFuaWZlc3RQYXRoXSA9IHByb2Nlc3MuYXJndi5zbGljZSgyKTtcbiAgaWYgKCFzcmNEaXIgfHwgIW1hbmlmZXN0UGF0aCkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJVc2FnZTogYnVuIHJ1biBzcmMvc2Nhbi1jb25zdW1lci50cyA8Y29uc3VtZXItc3JjLWRpcj4gPHB1cmdlLW1hbmlmZXN0Lmpzb24+XCIpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IG1hbmlmZXN0OiBQdXJnZU1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICBhd2FpdCBCdW4uZmlsZShtYW5pZmVzdFBhdGgpLnRleHQoKSxcbiAgKTtcbiAgY29uc3QgcmVzb2x2ZWRTcmMgPSBwYXRoLnJlc29sdmUoc3JjRGlyKTtcbiAgY29uc29sZS5sb2coYFNjYW5uaW5nICR7cmVzb2x2ZWRTcmN9IGZvciBAcGF0aHNjYWxlL3VpIGNvbXBvbmVudCB1c2FnZeKApmApO1xuICBjb25zb2xlLmxvZyhgTWFuaWZlc3Q6ICR7T2JqZWN0LmtleXMobWFuaWZlc3QpLmxlbmd0aH0gZW50cmllc1xcbmApO1xuXG4gIGNvbnN0IHVzYWdlcyA9IGF3YWl0IHNjYW5Db25zdW1lclNvdXJjZShyZXNvbHZlZFNyYyk7XG4gIGNvbnN0IHsgY2xhc3NTYWZlbGlzdCwgYXR0clNhZmVsaXN0IH0gPSBidWlsZFNhZmVsaXN0cyh1c2FnZXMsIG1hbmlmZXN0KTtcblxuICBjb25zb2xlLmxvZyhcIj09PSBDbGFzcyBTYWZlbGlzdCA9PT1cIik7XG4gIGZvciAoY29uc3QgY2xzIG9mIFsuLi5jbGFzc1NhZmVsaXN0XS5zb3J0KCkpIHtcbiAgICBjb25zb2xlLmxvZyhgICAke2Nsc31gKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBcXG49PT0gQXR0cmlidXRlIFNhZmVsaXN0ID09PWApO1xuICBmb3IgKGNvbnN0IGF0dHIgb2YgWy4uLmF0dHJTYWZlbGlzdF0uc29ydCgpKSB7XG4gICAgY29uc29sZS5sb2coYCAgWyR7YXR0cn1dYCk7XG4gIH1cblxuICBjb25zb2xlLmxvZyhgXFxuVG90YWw6ICR7Y2xhc3NTYWZlbGlzdC5zaXplfSBjbGFzc2VzLCAke2F0dHJTYWZlbGlzdC5zaXplfSBhdHRyaWJ1dGUgc2VsZWN0b3JzYCk7XG59XG5cbi8vIE9ubHkgcnVuIENMSSB3aGVuIGludm9rZWQgZGlyZWN0bHkgKG5vdCB3aGVuIGltcG9ydGVkIGFzIGEgbW9kdWxlKVxuaWYgKGltcG9ydC5tZXRhLm1haW4pIHtcbiAgbWFpbigpO1xufVxuXG5leHBvcnQgeyBleHRyYWN0VUlJbXBvcnRzLCBleHRyYWN0SlNYVXNhZ2VzLCBidWlsZFNhZmVsaXN0cywgc2NhbkNvbnN1bWVyU291cmNlIH07XG5leHBvcnQgdHlwZSB7IFByb3BVc2FnZSwgUHVyZ2VNYW5pZmVzdCwgQ29tcG9uZW50TWFuaWZlc3QsIFNhZmVsaXN0cyB9O1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFLQSxJQUFNLFVBQVUsTUFBTSxRQUFRLGFBQWE7QUFBQSxFQUUzQyxJQUFJLFNBQVM7QUFBQSxFQUNiLElBQU0sWUFBWSxNQUFNO0FBQUEsSUFDdEIsSUFBSSxDQUFDLFFBQVE7QUFBQSxNQUVYLElBQUksUUFBUSxLQUFLLFFBQVEsUUFBUTtBQUFBLFFBQy9CLE1BQU0sT0FBTyxRQUFRLE9BQU87QUFBQSxRQUM1QixRQUFRLE9BQU8saUJBQWlCO0FBQUEsUUFDaEMsU0FBUyxRQUFRLE9BQU8sVUFBVTtBQUFBLFFBQ2xDLFFBQVEsT0FBTyxpQkFBaUI7QUFBQSxNQUNsQyxFQUFPO0FBQUEsUUFDTCxTQUFTLENBQUM7QUFBQTtBQUFBLElBRWQ7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUFBLEVBR1QsT0FBTyxVQUFVLEVBQUUsU0FBUyxVQUFVO0FBQUE7Ozs7RUNsQnRDLElBQU07QUFBQSxFQUVOLElBQU0sV0FBVztBQUFBLEVB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
1599
+ //# debugId=B7A2BA7225DF959E64756E2164756E21
1600
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1saWJjL2xpYi9wcm9jZXNzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9kZXRlY3QtbGliYy9saWIvZmlsZXN5c3RlbS5qcyIsICIuLi9ub2RlX21vZHVsZXMvZGV0ZWN0LWxpYmMvbGliL2VsZi5qcyIsICIuLi9ub2RlX21vZHVsZXMvZGV0ZWN0LWxpYmMvbGliL2RldGVjdC1saWJjLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9saWdodG5pbmdjc3Mvbm9kZS9icm93c2Vyc2xpc3RUb1RhcmdldHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpZ2h0bmluZ2Nzcy9ub2RlL2NvbXBvc2VWaXNpdG9ycy5qcyIsICIuLi9ub2RlX21vZHVsZXMvbGlnaHRuaW5nY3NzL25vZGUvZmxhZ3MuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpZ2h0bmluZ2Nzcy9ub2RlL2luZGV4LmpzIiwgIi4uL3NyYy9wb3N0YnVpbGQtcHVyZ2UudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpZ2h0bmluZ2Nzcy9ub2RlL2luZGV4Lm1qcyIsICIuLi9zcmMvc2Nhbi1jb25zdW1lci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvLyBDb3B5cmlnaHQgMjAxNyBMb3ZlbGwgRnVsbGVyIGFuZCBvdGhlcnMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGlzTGludXggPSAoKSA9PiBwcm9jZXNzLnBsYXRmb3JtID09PSAnbGludXgnO1xuXG5sZXQgcmVwb3J0ID0gbnVsbDtcbmNvbnN0IGdldFJlcG9ydCA9ICgpID0+IHtcbiAgaWYgKCFyZXBvcnQpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChpc0xpbnV4KCkgJiYgcHJvY2Vzcy5yZXBvcnQpIHtcbiAgICAgIGNvbnN0IG9yaWcgPSBwcm9jZXNzLnJlcG9ydC5leGNsdWRlTmV0d29yaztcbiAgICAgIHByb2Nlc3MucmVwb3J0LmV4Y2x1ZGVOZXR3b3JrID0gdHJ1ZTtcbiAgICAgIHJlcG9ydCA9IHByb2Nlc3MucmVwb3J0LmdldFJlcG9ydCgpO1xuICAgICAgcHJvY2Vzcy5yZXBvcnQuZXhjbHVkZU5ldHdvcmsgPSBvcmlnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXBvcnQgPSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcG9ydDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0geyBpc0xpbnV4LCBnZXRSZXBvcnQgfTtcbiIsCiAgICAiLy8gQ29weXJpZ2h0IDIwMTcgTG92ZWxsIEZ1bGxlciBhbmQgb3RoZXJzLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5cbmNvbnN0IExERF9QQVRIID0gJy91c3IvYmluL2xkZCc7XG5jb25zdCBTRUxGX1BBVEggPSAnL3Byb2Mvc2VsZi9leGUnO1xuY29uc3QgTUFYX0xFTkdUSCA9IDIwNDg7XG5cbi8qKlxuICogUmVhZCB0aGUgY29udGVudCBvZiBhIGZpbGUgc3luY2hyb25vdXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHJldHVybnMge0J1ZmZlcn1cbiAqL1xuY29uc3QgcmVhZEZpbGVTeW5jID0gKHBhdGgpID0+IHtcbiAgY29uc3QgZmQgPSBmcy5vcGVuU3luYyhwYXRoLCAncicpO1xuICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoTUFYX0xFTkdUSCk7XG4gIGNvbnN0IGJ5dGVzUmVhZCA9IGZzLnJlYWRTeW5jKGZkLCBidWZmZXIsIDAsIE1BWF9MRU5HVEgsIDApO1xuICBmcy5jbG9zZShmZCwgKCkgPT4ge30pO1xuICByZXR1cm4gYnVmZmVyLnN1YmFycmF5KDAsIGJ5dGVzUmVhZCk7XG59O1xuXG4vKipcbiAqIFJlYWQgdGhlIGNvbnRlbnQgb2YgYSBmaWxlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJ1ZmZlcj59XG4gKi9cbmNvbnN0IHJlYWRGaWxlID0gKHBhdGgpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgZnMub3BlbihwYXRoLCAncicsIChlcnIsIGZkKSA9PiB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhNQVhfTEVOR1RIKTtcbiAgICAgIGZzLnJlYWQoZmQsIGJ1ZmZlciwgMCwgTUFYX0xFTkdUSCwgMCwgKF8sIGJ5dGVzUmVhZCkgPT4ge1xuICAgICAgICByZXNvbHZlKGJ1ZmZlci5zdWJhcnJheSgwLCBieXRlc1JlYWQpKTtcbiAgICAgICAgZnMuY2xvc2UoZmQsICgpID0+IHt9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIExERF9QQVRILFxuICBTRUxGX1BBVEgsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVhZEZpbGVcbn07XG4iLAogICAgIi8vIENvcHlyaWdodCAyMDE3IExvdmVsbCBGdWxsZXIgYW5kIG90aGVycy5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgaW50ZXJwcmV0ZXJQYXRoID0gKGVsZikgPT4ge1xuICBpZiAoZWxmLmxlbmd0aCA8IDY0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGVsZi5yZWFkVUludDMyQkUoMCkgIT09IDB4N0Y0NTRDNDYpIHtcbiAgICAvLyBVbmV4cGVjdGVkIG1hZ2ljIGJ5dGVzXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGVsZi5yZWFkVUludDgoNCkgIT09IDIpIHtcbiAgICAvLyBOb3QgYSA2NC1iaXQgRUxGXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGVsZi5yZWFkVUludDgoNSkgIT09IDEpIHtcbiAgICAvLyBOb3QgbGl0dGxlLWVuZGlhblxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IG9mZnNldCA9IGVsZi5yZWFkVUludDMyTEUoMzIpO1xuICBjb25zdCBzaXplID0gZWxmLnJlYWRVSW50MTZMRSg1NCk7XG4gIGNvbnN0IGNvdW50ID0gZWxmLnJlYWRVSW50MTZMRSg1Nik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGNvbnN0IGhlYWRlck9mZnNldCA9IG9mZnNldCArIChpICogc2l6ZSk7XG4gICAgY29uc3QgdHlwZSA9IGVsZi5yZWFkVUludDMyTEUoaGVhZGVyT2Zmc2V0KTtcbiAgICBpZiAodHlwZSA9PT0gMykge1xuICAgICAgY29uc3QgZmlsZU9mZnNldCA9IGVsZi5yZWFkVUludDMyTEUoaGVhZGVyT2Zmc2V0ICsgOCk7XG4gICAgICBjb25zdCBmaWxlU2l6ZSA9IGVsZi5yZWFkVUludDMyTEUoaGVhZGVyT2Zmc2V0ICsgMzIpO1xuICAgICAgcmV0dXJuIGVsZi5zdWJhcnJheShmaWxlT2Zmc2V0LCBmaWxlT2Zmc2V0ICsgZmlsZVNpemUpLnRvU3RyaW5nKCkucmVwbGFjZSgvXFwwLiokL2csICcnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaW50ZXJwcmV0ZXJQYXRoXG59O1xuIiwKICAgICIvLyBDb3B5cmlnaHQgMjAxNyBMb3ZlbGwgRnVsbGVyIGFuZCBvdGhlcnMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGNoaWxkUHJvY2VzcyA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKTtcbmNvbnN0IHsgaXNMaW51eCwgZ2V0UmVwb3J0IH0gPSByZXF1aXJlKCcuL3Byb2Nlc3MnKTtcbmNvbnN0IHsgTEREX1BBVEgsIFNFTEZfUEFUSCwgcmVhZEZpbGUsIHJlYWRGaWxlU3luYyB9ID0gcmVxdWlyZSgnLi9maWxlc3lzdGVtJyk7XG5jb25zdCB7IGludGVycHJldGVyUGF0aCB9ID0gcmVxdWlyZSgnLi9lbGYnKTtcblxubGV0IGNhY2hlZEZhbWlseUludGVycHJldGVyO1xubGV0IGNhY2hlZEZhbWlseUZpbGVzeXN0ZW07XG5sZXQgY2FjaGVkVmVyc2lvbkZpbGVzeXN0ZW07XG5cbmNvbnN0IGNvbW1hbmQgPSAnZ2V0Y29uZiBHTlVfTElCQ19WRVJTSU9OIDI+JjEgfHwgdHJ1ZTsgbGRkIC0tdmVyc2lvbiAyPiYxIHx8IHRydWUnO1xubGV0IGNvbW1hbmRPdXQgPSAnJztcblxuY29uc3Qgc2FmZUNvbW1hbmQgPSAoKSA9PiB7XG4gIGlmICghY29tbWFuZE91dCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY2hpbGRQcm9jZXNzLmV4ZWMoY29tbWFuZCwgKGVyciwgb3V0KSA9PiB7XG4gICAgICAgIGNvbW1hbmRPdXQgPSBlcnIgPyAnICcgOiBvdXQ7XG4gICAgICAgIHJlc29sdmUoY29tbWFuZE91dCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY29tbWFuZE91dDtcbn07XG5cbmNvbnN0IHNhZmVDb21tYW5kU3luYyA9ICgpID0+IHtcbiAgaWYgKCFjb21tYW5kT3V0KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbW1hbmRPdXQgPSBjaGlsZFByb2Nlc3MuZXhlY1N5bmMoY29tbWFuZCwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pO1xuICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgIGNvbW1hbmRPdXQgPSAnICc7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb21tYW5kT3V0O1xufTtcblxuLyoqXG4gKiBBIFN0cmluZyBjb25zdGFudCBjb250YWluaW5nIHRoZSB2YWx1ZSBgZ2xpYmNgLlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgR0xJQkMgPSAnZ2xpYmMnO1xuXG4vKipcbiAqIEEgUmVnZXhwIGNvbnN0YW50IHRvIGdldCB0aGUgR0xJQkMgVmVyc2lvbi5cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IFJFX0dMSUJDX1ZFUlNJT04gPSAvTElCQ1thLXowLTkgXFwtKS5dKj8oXFxkK1xcLlxcZCspL2k7XG5cbi8qKlxuICogQSBTdHJpbmcgY29uc3RhbnQgY29udGFpbmluZyB0aGUgdmFsdWUgYG11c2xgLlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgTVVTTCA9ICdtdXNsJztcblxuY29uc3QgaXNGaWxlTXVzbCA9IChmKSA9PiBmLmluY2x1ZGVzKCdsaWJjLm11c2wtJykgfHwgZi5pbmNsdWRlcygnbGQtbXVzbC0nKTtcblxuY29uc3QgZmFtaWx5RnJvbVJlcG9ydCA9ICgpID0+IHtcbiAgY29uc3QgcmVwb3J0ID0gZ2V0UmVwb3J0KCk7XG4gIGlmIChyZXBvcnQuaGVhZGVyICYmIHJlcG9ydC5oZWFkZXIuZ2xpYmNWZXJzaW9uUnVudGltZSkge1xuICAgIHJldHVybiBHTElCQztcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShyZXBvcnQuc2hhcmVkT2JqZWN0cykpIHtcbiAgICBpZiAocmVwb3J0LnNoYXJlZE9iamVjdHMuc29tZShpc0ZpbGVNdXNsKSkge1xuICAgICAgcmV0dXJuIE1VU0w7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgZmFtaWx5RnJvbUNvbW1hbmQgPSAob3V0KSA9PiB7XG4gIGNvbnN0IFtnZXRjb25mLCBsZGQxXSA9IG91dC5zcGxpdCgvW1xcclxcbl0rLyk7XG4gIGlmIChnZXRjb25mICYmIGdldGNvbmYuaW5jbHVkZXMoR0xJQkMpKSB7XG4gICAgcmV0dXJuIEdMSUJDO1xuICB9XG4gIGlmIChsZGQxICYmIGxkZDEuaW5jbHVkZXMoTVVTTCkpIHtcbiAgICByZXR1cm4gTVVTTDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IGZhbWlseUZyb21JbnRlcnByZXRlclBhdGggPSAocGF0aCkgPT4ge1xuICBpZiAocGF0aCkge1xuICAgIGlmIChwYXRoLmluY2x1ZGVzKCcvbGQtbXVzbC0nKSkge1xuICAgICAgcmV0dXJuIE1VU0w7XG4gICAgfSBlbHNlIGlmIChwYXRoLmluY2x1ZGVzKCcvbGQtbGludXgtJykpIHtcbiAgICAgIHJldHVybiBHTElCQztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5jb25zdCBnZXRGYW1pbHlGcm9tTGRkQ29udGVudCA9IChjb250ZW50KSA9PiB7XG4gIGNvbnRlbnQgPSBjb250ZW50LnRvU3RyaW5nKCk7XG4gIGlmIChjb250ZW50LmluY2x1ZGVzKCdtdXNsJykpIHtcbiAgICByZXR1cm4gTVVTTDtcbiAgfVxuICBpZiAoY29udGVudC5pbmNsdWRlcygnR05VIEMgTGlicmFyeScpKSB7XG4gICAgcmV0dXJuIEdMSUJDO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgZmFtaWx5RnJvbUZpbGVzeXN0ZW0gPSBhc3luYyAoKSA9PiB7XG4gIGlmIChjYWNoZWRGYW1pbHlGaWxlc3lzdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkRmFtaWx5RmlsZXN5c3RlbTtcbiAgfVxuICBjYWNoZWRGYW1pbHlGaWxlc3lzdGVtID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBsZGRDb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoTEREX1BBVEgpO1xuICAgIGNhY2hlZEZhbWlseUZpbGVzeXN0ZW0gPSBnZXRGYW1pbHlGcm9tTGRkQ29udGVudChsZGRDb250ZW50KTtcbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIGNhY2hlZEZhbWlseUZpbGVzeXN0ZW07XG59O1xuXG5jb25zdCBmYW1pbHlGcm9tRmlsZXN5c3RlbVN5bmMgPSAoKSA9PiB7XG4gIGlmIChjYWNoZWRGYW1pbHlGaWxlc3lzdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkRmFtaWx5RmlsZXN5c3RlbTtcbiAgfVxuICBjYWNoZWRGYW1pbHlGaWxlc3lzdGVtID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBsZGRDb250ZW50ID0gcmVhZEZpbGVTeW5jKExERF9QQVRIKTtcbiAgICBjYWNoZWRGYW1pbHlGaWxlc3lzdGVtID0gZ2V0RmFtaWx5RnJvbUxkZENvbnRlbnQobGRkQ29udGVudCk7XG4gIH0gY2F0Y2ggKGUpIHt9XG4gIHJldHVybiBjYWNoZWRGYW1pbHlGaWxlc3lzdGVtO1xufTtcblxuY29uc3QgZmFtaWx5RnJvbUludGVycHJldGVyID0gYXN5bmMgKCkgPT4ge1xuICBpZiAoY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjYWNoZWRGYW1pbHlJbnRlcnByZXRlcjtcbiAgfVxuICBjYWNoZWRGYW1pbHlJbnRlcnByZXRlciA9IG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2VsZkNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShTRUxGX1BBVEgpO1xuICAgIGNvbnN0IHBhdGggPSBpbnRlcnByZXRlclBhdGgoc2VsZkNvbnRlbnQpO1xuICAgIGNhY2hlZEZhbWlseUludGVycHJldGVyID0gZmFtaWx5RnJvbUludGVycHJldGVyUGF0aChwYXRoKTtcbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIGNhY2hlZEZhbWlseUludGVycHJldGVyO1xufTtcblxuY29uc3QgZmFtaWx5RnJvbUludGVycHJldGVyU3luYyA9ICgpID0+IHtcbiAgaWYgKGNhY2hlZEZhbWlseUludGVycHJldGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXI7XG4gIH1cbiAgY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXIgPSBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHNlbGZDb250ZW50ID0gcmVhZEZpbGVTeW5jKFNFTEZfUEFUSCk7XG4gICAgY29uc3QgcGF0aCA9IGludGVycHJldGVyUGF0aChzZWxmQ29udGVudCk7XG4gICAgY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXIgPSBmYW1pbHlGcm9tSW50ZXJwcmV0ZXJQYXRoKHBhdGgpO1xuICB9IGNhdGNoIChlKSB7fVxuICByZXR1cm4gY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXI7XG59O1xuXG4vKipcbiAqIFJlc29sdmVzIHdpdGggdGhlIGxpYmMgZmFtaWx5IHdoZW4gaXQgY2FuIGJlIGRldGVybWluZWQsIGBudWxsYCBvdGhlcndpc2UuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTw/c3RyaW5nPn1cbiAqL1xuY29uc3QgZmFtaWx5ID0gYXN5bmMgKCkgPT4ge1xuICBsZXQgZmFtaWx5ID0gbnVsbDtcbiAgaWYgKGlzTGludXgoKSkge1xuICAgIGZhbWlseSA9IGF3YWl0IGZhbWlseUZyb21JbnRlcnByZXRlcigpO1xuICAgIGlmICghZmFtaWx5KSB7XG4gICAgICBmYW1pbHkgPSBhd2FpdCBmYW1pbHlGcm9tRmlsZXN5c3RlbSgpO1xuICAgICAgaWYgKCFmYW1pbHkpIHtcbiAgICAgICAgZmFtaWx5ID0gZmFtaWx5RnJvbVJlcG9ydCgpO1xuICAgICAgfVxuICAgICAgaWYgKCFmYW1pbHkpIHtcbiAgICAgICAgY29uc3Qgb3V0ID0gYXdhaXQgc2FmZUNvbW1hbmQoKTtcbiAgICAgICAgZmFtaWx5ID0gZmFtaWx5RnJvbUNvbW1hbmQob3V0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbWlseTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGliYyBmYW1pbHkgd2hlbiBpdCBjYW4gYmUgZGV0ZXJtaW5lZCwgYG51bGxgIG90aGVyd2lzZS5cbiAqIEByZXR1cm5zIHs/c3RyaW5nfVxuICovXG5jb25zdCBmYW1pbHlTeW5jID0gKCkgPT4ge1xuICBsZXQgZmFtaWx5ID0gbnVsbDtcbiAgaWYgKGlzTGludXgoKSkge1xuICAgIGZhbWlseSA9IGZhbWlseUZyb21JbnRlcnByZXRlclN5bmMoKTtcbiAgICBpZiAoIWZhbWlseSkge1xuICAgICAgZmFtaWx5ID0gZmFtaWx5RnJvbUZpbGVzeXN0ZW1TeW5jKCk7XG4gICAgICBpZiAoIWZhbWlseSkge1xuICAgICAgICBmYW1pbHkgPSBmYW1pbHlGcm9tUmVwb3J0KCk7XG4gICAgICB9XG4gICAgICBpZiAoIWZhbWlseSkge1xuICAgICAgICBjb25zdCBvdXQgPSBzYWZlQ29tbWFuZFN5bmMoKTtcbiAgICAgICAgZmFtaWx5ID0gZmFtaWx5RnJvbUNvbW1hbmQob3V0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbWlseTtcbn07XG5cbi8qKlxuICogUmVzb2x2ZXMgYHRydWVgIG9ubHkgd2hlbiB0aGUgcGxhdGZvcm0gaXMgTGludXggYW5kIHRoZSBsaWJjIGZhbWlseSBpcyBub3QgYGdsaWJjYC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICovXG5jb25zdCBpc05vbkdsaWJjTGludXggPSBhc3luYyAoKSA9PiBpc0xpbnV4KCkgJiYgYXdhaXQgZmFtaWx5KCkgIT09IEdMSUJDO1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIG9ubHkgd2hlbiB0aGUgcGxhdGZvcm0gaXMgTGludXggYW5kIHRoZSBsaWJjIGZhbWlseSBpcyBub3QgYGdsaWJjYC5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc05vbkdsaWJjTGludXhTeW5jID0gKCkgPT4gaXNMaW51eCgpICYmIGZhbWlseVN5bmMoKSAhPT0gR0xJQkM7XG5cbmNvbnN0IHZlcnNpb25Gcm9tRmlsZXN5c3RlbSA9IGFzeW5jICgpID0+IHtcbiAgaWYgKGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkVmVyc2lvbkZpbGVzeXN0ZW07XG4gIH1cbiAgY2FjaGVkVmVyc2lvbkZpbGVzeXN0ZW0gPSBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IGxkZENvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShMRERfUEFUSCk7XG4gICAgY29uc3QgdmVyc2lvbk1hdGNoID0gbGRkQ29udGVudC5tYXRjaChSRV9HTElCQ19WRVJTSU9OKTtcbiAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICBjYWNoZWRWZXJzaW9uRmlsZXN5c3RlbSA9IHZlcnNpb25NYXRjaFsxXTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHt9XG4gIHJldHVybiBjYWNoZWRWZXJzaW9uRmlsZXN5c3RlbTtcbn07XG5cbmNvbnN0IHZlcnNpb25Gcm9tRmlsZXN5c3RlbVN5bmMgPSAoKSA9PiB7XG4gIGlmIChjYWNoZWRWZXJzaW9uRmlsZXN5c3RlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtO1xuICB9XG4gIGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBsZGRDb250ZW50ID0gcmVhZEZpbGVTeW5jKExERF9QQVRIKTtcbiAgICBjb25zdCB2ZXJzaW9uTWF0Y2ggPSBsZGRDb250ZW50Lm1hdGNoKFJFX0dMSUJDX1ZFUlNJT04pO1xuICAgIGlmICh2ZXJzaW9uTWF0Y2gpIHtcbiAgICAgIGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtID0gdmVyc2lvbk1hdGNoWzFdO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtO1xufTtcblxuY29uc3QgdmVyc2lvbkZyb21SZXBvcnQgPSAoKSA9PiB7XG4gIGNvbnN0IHJlcG9ydCA9IGdldFJlcG9ydCgpO1xuICBpZiAocmVwb3J0LmhlYWRlciAmJiByZXBvcnQuaGVhZGVyLmdsaWJjVmVyc2lvblJ1bnRpbWUpIHtcbiAgICByZXR1cm4gcmVwb3J0LmhlYWRlci5nbGliY1ZlcnNpb25SdW50aW1lO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgdmVyc2lvblN1ZmZpeCA9IChzKSA9PiBzLnRyaW0oKS5zcGxpdCgvXFxzKy8pWzFdO1xuXG5jb25zdCB2ZXJzaW9uRnJvbUNvbW1hbmQgPSAob3V0KSA9PiB7XG4gIGNvbnN0IFtnZXRjb25mLCBsZGQxLCBsZGQyXSA9IG91dC5zcGxpdCgvW1xcclxcbl0rLyk7XG4gIGlmIChnZXRjb25mICYmIGdldGNvbmYuaW5jbHVkZXMoR0xJQkMpKSB7XG4gICAgcmV0dXJuIHZlcnNpb25TdWZmaXgoZ2V0Y29uZik7XG4gIH1cbiAgaWYgKGxkZDEgJiYgbGRkMiAmJiBsZGQxLmluY2x1ZGVzKE1VU0wpKSB7XG4gICAgcmV0dXJuIHZlcnNpb25TdWZmaXgobGRkMik7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIFJlc29sdmVzIHdpdGggdGhlIGxpYmMgdmVyc2lvbiB3aGVuIGl0IGNhbiBiZSBkZXRlcm1pbmVkLCBgbnVsbGAgb3RoZXJ3aXNlLlxuICogQHJldHVybnMge1Byb21pc2U8P3N0cmluZz59XG4gKi9cbmNvbnN0IHZlcnNpb24gPSBhc3luYyAoKSA9PiB7XG4gIGxldCB2ZXJzaW9uID0gbnVsbDtcbiAgaWYgKGlzTGludXgoKSkge1xuICAgIHZlcnNpb24gPSBhd2FpdCB2ZXJzaW9uRnJvbUZpbGVzeXN0ZW0oKTtcbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIHZlcnNpb24gPSB2ZXJzaW9uRnJvbVJlcG9ydCgpO1xuICAgIH1cbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIGNvbnN0IG91dCA9IGF3YWl0IHNhZmVDb21tYW5kKCk7XG4gICAgICB2ZXJzaW9uID0gdmVyc2lvbkZyb21Db21tYW5kKG91dCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2ZXJzaW9uO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsaWJjIHZlcnNpb24gd2hlbiBpdCBjYW4gYmUgZGV0ZXJtaW5lZCwgYG51bGxgIG90aGVyd2lzZS5cbiAqIEByZXR1cm5zIHs/c3RyaW5nfVxuICovXG5jb25zdCB2ZXJzaW9uU3luYyA9ICgpID0+IHtcbiAgbGV0IHZlcnNpb24gPSBudWxsO1xuICBpZiAoaXNMaW51eCgpKSB7XG4gICAgdmVyc2lvbiA9IHZlcnNpb25Gcm9tRmlsZXN5c3RlbVN5bmMoKTtcbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIHZlcnNpb24gPSB2ZXJzaW9uRnJvbVJlcG9ydCgpO1xuICAgIH1cbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIGNvbnN0IG91dCA9IHNhZmVDb21tYW5kU3luYygpO1xuICAgICAgdmVyc2lvbiA9IHZlcnNpb25Gcm9tQ29tbWFuZChvdXQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmVyc2lvbjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBHTElCQyxcbiAgTVVTTCxcbiAgZmFtaWx5LFxuICBmYW1pbHlTeW5jLFxuICBpc05vbkdsaWJjTGludXgsXG4gIGlzTm9uR2xpYmNMaW51eFN5bmMsXG4gIHZlcnNpb24sXG4gIHZlcnNpb25TeW5jXG59O1xuIiwKICAgICJjb25zdCBCUk9XU0VSX01BUFBJTkcgPSB7XG4gIGFuZF9jaHI6ICdjaHJvbWUnLFxuICBhbmRfZmY6ICdmaXJlZm94JyxcbiAgaWVfbW9iOiAnaWUnLFxuICBvcF9tb2I6ICdvcGVyYScsXG4gIGFuZF9xcTogbnVsbCxcbiAgYW5kX3VjOiBudWxsLFxuICBiYWlkdTogbnVsbCxcbiAgYmI6IG51bGwsXG4gIGthaW9zOiBudWxsLFxuICBvcF9taW5pOiBudWxsLFxufTtcblxuZnVuY3Rpb24gYnJvd3NlcnNsaXN0VG9UYXJnZXRzKGJyb3dzZXJzbGlzdCkge1xuICBsZXQgdGFyZ2V0cyA9IHt9O1xuICBmb3IgKGxldCBicm93c2VyIG9mIGJyb3dzZXJzbGlzdCkge1xuICAgIGxldCBbbmFtZSwgdl0gPSBicm93c2VyLnNwbGl0KCcgJyk7XG4gICAgaWYgKEJST1dTRVJfTUFQUElOR1tuYW1lXSA9PT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbGV0IHZlcnNpb24gPSBwYXJzZVZlcnNpb24odik7XG4gICAgaWYgKHZlcnNpb24gPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRhcmdldHNbbmFtZV0gPT0gbnVsbCB8fCB2ZXJzaW9uIDwgdGFyZ2V0c1tuYW1lXSkge1xuICAgICAgdGFyZ2V0c1tuYW1lXSA9IHZlcnNpb247XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldHM7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVmVyc2lvbih2ZXJzaW9uKSB7XG4gIGxldCBbbWFqb3IsIG1pbm9yID0gMCwgcGF0Y2ggPSAwXSA9IHZlcnNpb25cbiAgICAuc3BsaXQoJy0nKVswXVxuICAgIC5zcGxpdCgnLicpXG4gICAgLm1hcCh2ID0+IHBhcnNlSW50KHYsIDEwKSk7XG5cbiAgaWYgKGlzTmFOKG1ham9yKSB8fCBpc05hTihtaW5vcikgfHwgaXNOYU4ocGF0Y2gpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gKG1ham9yIDw8IDE2KSB8IChtaW5vciA8PCA4KSB8IHBhdGNoO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJyb3dzZXJzbGlzdFRvVGFyZ2V0cztcbiIsCiAgICAiLy8gQHRzLWNoZWNrXG4vKiogQHR5cGVkZWYge2ltcG9ydCgnLi9pbmRleCcpLlZpc2l0b3J9IFZpc2l0b3IgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KCcuL2luZGV4JykuVmlzaXRvckZ1bmN0aW9ufSBWaXNpdG9yRnVuY3Rpb24gKi9cblxuLyoqXG4gKiBDb21wb3NlcyBtdWx0aXBsZSB2aXNpdG9yIG9iamVjdHMgaW50byBhIHNpbmdsZSBvbmUuXG4gKiBAcGFyYW0geyhWaXNpdG9yIHwgVmlzaXRvckZ1bmN0aW9uKVtdfSB2aXNpdG9ycyBcbiAqIEByZXR1cm4ge1Zpc2l0b3IgfCBWaXNpdG9yRnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VWaXNpdG9ycyh2aXNpdG9ycykge1xuICBpZiAodmlzaXRvcnMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHZpc2l0b3JzWzBdO1xuICB9XG4gIFxuICBpZiAodmlzaXRvcnMuc29tZSh2ID0+IHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSkge1xuICAgIHJldHVybiAob3B0cykgPT4ge1xuICAgICAgbGV0IHYgPSB2aXNpdG9ycy5tYXAodiA9PiB0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJyA/IHYob3B0cykgOiB2KTtcbiAgICAgIHJldHVybiBjb21wb3NlVmlzaXRvcnModik7XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAdHlwZSBWaXNpdG9yICovXG4gIGxldCByZXMgPSB7fTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdTdHlsZVNoZWV0Jyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnU3R5bGVTaGVldEV4aXQnKTtcbiAgY29tcG9zZU9iamVjdFZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdSdWxlJywgcnVsZVZpc2l0b3IsIHdyYXBDdXN0b21BbmRVbmtub3duQXRSdWxlKTtcbiAgY29tcG9zZU9iamVjdFZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdSdWxlRXhpdCcsIHJ1bGVWaXNpdG9yLCB3cmFwQ3VzdG9tQW5kVW5rbm93bkF0UnVsZSk7XG4gIGNvbXBvc2VPYmplY3RWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnRGVjbGFyYXRpb24nLCBkZWNsYXJhdGlvblZpc2l0b3IsIHdyYXBDdXN0b21Qcm9wZXJ0eSk7XG4gIGNvbXBvc2VPYmplY3RWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnRGVjbGFyYXRpb25FeGl0JywgZGVjbGFyYXRpb25WaXNpdG9yLCB3cmFwQ3VzdG9tUHJvcGVydHkpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ1VybCcpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ0NvbG9yJyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnSW1hZ2UnKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdJbWFnZUV4aXQnKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdMZW5ndGgnKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdBbmdsZScpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ1JhdGlvJyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnUmVzb2x1dGlvbicpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ1RpbWUnKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdDdXN0b21JZGVudCcpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ0Rhc2hlZElkZW50Jyk7XG4gIGNvbXBvc2VBcnJheUZ1bmN0aW9ucyhyZXMsIHZpc2l0b3JzLCAnTWVkaWFRdWVyeScpO1xuICBjb21wb3NlQXJyYXlGdW5jdGlvbnMocmVzLCB2aXNpdG9ycywgJ01lZGlhUXVlcnlFeGl0Jyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnU3VwcG9ydHNDb25kaXRpb24nKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdTdXBwb3J0c0NvbmRpdGlvbkV4aXQnKTtcbiAgY29tcG9zZUFycmF5RnVuY3Rpb25zKHJlcywgdmlzaXRvcnMsICdTZWxlY3RvcicpO1xuICBjb21wb3NlVG9rZW5WaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnVG9rZW4nLCAndG9rZW4nLCBmYWxzZSk7XG4gIGNvbXBvc2VUb2tlblZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdGdW5jdGlvbicsICdmdW5jdGlvbicsIGZhbHNlKTtcbiAgY29tcG9zZVRva2VuVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ0Z1bmN0aW9uRXhpdCcsICdmdW5jdGlvbicsIHRydWUpO1xuICBjb21wb3NlVG9rZW5WaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnVmFyaWFibGUnLCAndmFyJywgZmFsc2UpO1xuICBjb21wb3NlVG9rZW5WaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnVmFyaWFibGVFeGl0JywgJ3ZhcicsIHRydWUpO1xuICBjb21wb3NlVG9rZW5WaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnRW52aXJvbm1lbnRWYXJpYWJsZScsICdlbnYnLCBmYWxzZSk7XG4gIGNvbXBvc2VUb2tlblZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdFbnZpcm9ubWVudFZhcmlhYmxlRXhpdCcsICdlbnYnLCB0cnVlKTtcbiAgcmV0dXJuIHJlcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb21wb3NlVmlzaXRvcnM7XG5cbmZ1bmN0aW9uIHdyYXBDdXN0b21BbmRVbmtub3duQXRSdWxlKGssIGYpIHtcbiAgaWYgKGsgPT09ICd1bmtub3duJykge1xuICAgIHJldHVybiAodmFsdWUgPT4gZih7IHR5cGU6ICd1bmtub3duJywgdmFsdWUgfSkpO1xuICB9XG4gIGlmIChrID09PSAnY3VzdG9tJykge1xuICAgIHJldHVybiAodmFsdWUgPT4gZih7IHR5cGU6ICdjdXN0b20nLCB2YWx1ZSB9KSk7XG4gIH1cbiAgcmV0dXJuIGY7XG59XG5cbmZ1bmN0aW9uIHdyYXBDdXN0b21Qcm9wZXJ0eShrLCBmKSB7XG4gIHJldHVybiBrID09PSAnY3VzdG9tJyA/ICh2YWx1ZSA9PiBmKHsgcHJvcGVydHk6ICdjdXN0b20nLCB2YWx1ZSB9KSkgOiBmO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2luZGV4JykuVmlzaXRvclsnUnVsZSddfSBmIFxuICogQHBhcmFtIHtpbXBvcnQoJy4vYXN0JykuUnVsZX0gaXRlbSBcbiAqL1xuZnVuY3Rpb24gcnVsZVZpc2l0b3IoZiwgaXRlbSkge1xuICBpZiAodHlwZW9mIGYgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gJ3Vua25vd24nKSB7XG4gICAgICBsZXQgdiA9IGYudW5rbm93bjtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdiA9IHZbaXRlbS52YWx1ZS5uYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2Py4oaXRlbS52YWx1ZSk7XG4gICAgfVxuICAgIGlmIChpdGVtLnR5cGUgPT09ICdjdXN0b20nKSB7XG4gICAgICBsZXQgdiA9IGYuY3VzdG9tO1xuICAgICAgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0Jykge1xuICAgICAgICB2ID0gdltpdGVtLnZhbHVlLm5hbWVdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHY/LihpdGVtLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZbaXRlbS50eXBlXT8uKGl0ZW0pO1xuICB9XG4gIHJldHVybiBmPy4oaXRlbSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW5kZXgnKS5WaXNpdG9yWydEZWNsYXJhdGlvbiddfSBmIFxuICogQHBhcmFtIHtpbXBvcnQoJy4vYXN0JykuRGVjbGFyYXRpb259IGl0ZW0gXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmF0aW9uVmlzaXRvcihmLCBpdGVtKSB7XG4gIGlmICh0eXBlb2YgZiA9PT0gJ29iamVjdCcpIHtcbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICBsZXQgbmFtZSA9IGl0ZW0ucHJvcGVydHk7XG4gICAgaWYgKGl0ZW0ucHJvcGVydHkgPT09ICd1bnBhcnNlZCcpIHtcbiAgICAgIG5hbWUgPSBpdGVtLnZhbHVlLnByb3BlcnR5SWQucHJvcGVydHk7XG4gICAgfSBlbHNlIGlmIChpdGVtLnByb3BlcnR5ID09PSAnY3VzdG9tJykge1xuICAgICAgbGV0IHYgPSBmLmN1c3RvbTtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdiA9IHZbaXRlbS52YWx1ZS5uYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2Py4oaXRlbS52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBmW25hbWVdPy4oaXRlbSk7XG4gIH1cbiAgcmV0dXJuIGY/LihpdGVtKTtcbn1cblxuLyoqXG4gKiBcbiAqIEBwYXJhbSB7VmlzaXRvcltdfSB2aXNpdG9ycyBcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgXG4gKiBAcmV0dXJucyB7W2FueVtdLCBib29sZWFuLCBTZXQ8c3RyaW5nPl19XG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RPYmplY3RzT3JGdW5jdGlvbnModmlzaXRvcnMsIGtleSkge1xuICBsZXQgdmFsdWVzID0gW107XG4gIGxldCBoYXNGdW5jdGlvbiA9IGZhbHNlO1xuICBsZXQgYWxsS2V5cyA9IG5ldyBTZXQoKTtcbiAgZm9yIChsZXQgdmlzaXRvciBvZiB2aXNpdG9ycykge1xuICAgIGxldCB2ID0gdmlzaXRvcltrZXldO1xuICAgIGlmICh2KSB7XG4gICAgICBpZiAodHlwZW9mIHYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaGFzRnVuY3Rpb24gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHYpIHtcbiAgICAgICAgICBhbGxLZXlzLmFkZChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YWx1ZXMucHVzaCh2KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFt2YWx1ZXMsIGhhc0Z1bmN0aW9uLCBhbGxLZXlzXTtcbn1cblxuLyoqXG4gKiBAdGVtcGxhdGUge2tleW9mIFZpc2l0b3J9IEtcbiAqIEBwYXJhbSB7VmlzaXRvcn0gcmVzXG4gKiBAcGFyYW0ge1Zpc2l0b3JbXX0gdmlzaXRvcnNcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0geyh2aXNpdG9yOiBWaXNpdG9yW0tdLCBpdGVtOiBhbnkpID0+IGFueSB8IGFueVtdIHwgdm9pZH0gYXBwbHkgXG4gKiBAcGFyYW0geyhrOiBzdHJpbmcsIGY6IGFueSkgPT4gYW55fSB3cmFwS2V5IFxuICovXG5mdW5jdGlvbiBjb21wb3NlT2JqZWN0VmlzaXRvcnMocmVzLCB2aXNpdG9ycywga2V5LCBhcHBseSwgd3JhcEtleSkge1xuICBsZXQgW3ZhbHVlcywgaGFzRnVuY3Rpb24sIGFsbEtleXNdID0gZXh0cmFjdE9iamVjdHNPckZ1bmN0aW9ucyh2aXNpdG9ycywga2V5KTtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJlc1trZXldID0gdmFsdWVzWzBdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBmID0gY3JlYXRlQXJyYXlWaXNpdG9yKHZpc2l0b3JzLCAodmlzaXRvciwgaXRlbSkgPT4gYXBwbHkodmlzaXRvcltrZXldLCBpdGVtKSk7XG4gIGlmIChoYXNGdW5jdGlvbikge1xuICAgIHJlc1trZXldID0gZjtcbiAgfSBlbHNlIHtcbiAgICAvKiogQHR5cGUge2FueX0gKi9cbiAgICBsZXQgdiA9IHt9O1xuICAgIGZvciAobGV0IGsgb2YgYWxsS2V5cykge1xuICAgICAgdltrXSA9IHdyYXBLZXkoaywgZik7XG4gICAgfVxuICAgIHJlc1trZXldID0gdjtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7VmlzaXRvcn0gcmVzIFxuICogQHBhcmFtIHtWaXNpdG9yW119IHZpc2l0b3JzIFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2FzdCcpLlRva2VuT3JWYWx1ZVsndHlwZSddfSB0eXBlIFxuICogQHBhcmFtIHtib29sZWFufSBpc0V4aXQgXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VUb2tlblZpc2l0b3JzKHJlcywgdmlzaXRvcnMsIGtleSwgdHlwZSwgaXNFeGl0KSB7XG4gIGxldCBbdmFsdWVzLCBoYXNGdW5jdGlvbiwgYWxsS2V5c10gPSBleHRyYWN0T2JqZWN0c09yRnVuY3Rpb25zKHZpc2l0b3JzLCBrZXkpO1xuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh2YWx1ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgcmVzW2tleV0gPSB2YWx1ZXNbMF07XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGYgPSBjcmVhdGVUb2tlblZpc2l0b3IodmlzaXRvcnMsIHR5cGUsIGlzRXhpdCk7XG4gIGlmIChoYXNGdW5jdGlvbikge1xuICAgIHJlc1trZXldID0gZjtcbiAgfSBlbHNlIHtcbiAgICBsZXQgdiA9IHt9O1xuICAgIGZvciAobGV0IGtleSBvZiBhbGxLZXlzKSB7XG4gICAgICB2W2tleV0gPSBmO1xuICAgIH1cbiAgICByZXNba2V5XSA9IHY7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge1Zpc2l0b3JbXX0gdmlzaXRvcnMgXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9hc3QnKS5Ub2tlbk9yVmFsdWVbJ3R5cGUnXX0gdHlwZSBcbiAqL1xuZnVuY3Rpb24gY3JlYXRlVG9rZW5WaXNpdG9yKHZpc2l0b3JzLCB0eXBlLCBpc0V4aXQpIHtcbiAgbGV0IHYgPSBjcmVhdGVBcnJheVZpc2l0b3IodmlzaXRvcnMsICh2aXNpdG9yLCAvKiogQHR5cGUge2ltcG9ydCgnLi9hc3QnKS5Ub2tlbk9yVmFsdWV9ICovIGl0ZW0pID0+IHtcbiAgICBsZXQgZjtcbiAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgY2FzZSAndG9rZW4nOlxuICAgICAgICBmID0gdmlzaXRvci5Ub2tlbjtcbiAgICAgICAgaWYgKHR5cGVvZiBmID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGYgPSBmW2l0ZW0udmFsdWUudHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgIGYgPSBpc0V4aXQgPyB2aXNpdG9yLkZ1bmN0aW9uRXhpdCA6IHZpc2l0b3IuRnVuY3Rpb247XG4gICAgICAgIGlmICh0eXBlb2YgZiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBmID0gZltpdGVtLnZhbHVlLm5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndmFyJzpcbiAgICAgICAgZiA9IGlzRXhpdCA/IHZpc2l0b3IuVmFyaWFibGVFeGl0IDogdmlzaXRvci5WYXJpYWJsZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlbnYnOlxuICAgICAgICBmID0gaXNFeGl0ID8gdmlzaXRvci5FbnZpcm9ubWVudFZhcmlhYmxlRXhpdCA6IHZpc2l0b3IuRW52aXJvbm1lbnRWYXJpYWJsZTtcbiAgICAgICAgaWYgKHR5cGVvZiBmID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGxldCBuYW1lO1xuICAgICAgICAgIHN3aXRjaCAoaXRlbS52YWx1ZS5uYW1lLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3VhJzpcbiAgICAgICAgICAgIGNhc2UgJ3Vua25vd24nOlxuICAgICAgICAgICAgICBuYW1lID0gaXRlbS52YWx1ZS5uYW1lLnZhbHVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2N1c3RvbSc6XG4gICAgICAgICAgICAgIG5hbWUgPSBpdGVtLnZhbHVlLm5hbWUuaWRlbnQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmID0gZltuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NvbG9yJzpcbiAgICAgICAgZiA9IHZpc2l0b3IuQ29sb3I7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndXJsJzpcbiAgICAgICAgZiA9IHZpc2l0b3IuVXJsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xlbmd0aCc6XG4gICAgICAgIGYgPSB2aXNpdG9yLkxlbmd0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhbmdsZSc6XG4gICAgICAgIGYgPSB2aXNpdG9yLkFuZ2xlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgICBmID0gdmlzaXRvci5UaW1lO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Jlc29sdXRpb24nOlxuICAgICAgICBmID0gdmlzaXRvci5SZXNvbHV0aW9uO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Rhc2hlZC1pZGVudCc6XG4gICAgICAgIGYgPSB2aXNpdG9yLkRhc2hlZElkZW50O1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoIWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmVzID0gZihpdGVtLnZhbHVlKTtcbiAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgY2FzZSAnY29sb3InOlxuICAgICAgY2FzZSAndXJsJzpcbiAgICAgIGNhc2UgJ2xlbmd0aCc6XG4gICAgICBjYXNlICdhbmdsZSc6XG4gICAgICBjYXNlICd0aW1lJzpcbiAgICAgIGNhc2UgJ3Jlc29sdXRpb24nOlxuICAgICAgY2FzZSAnZGFzaGVkLWlkZW50JzpcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkge1xuICAgICAgICAgIHJlcyA9IHJlcy5tYXAodmFsdWUgPT4gKHsgdHlwZTogaXRlbS50eXBlLCB2YWx1ZSB9KSlcbiAgICAgICAgfSBlbHNlIGlmIChyZXMpIHtcbiAgICAgICAgICByZXMgPSB7IHR5cGU6IGl0ZW0udHlwZSwgdmFsdWU6IHJlcyB9O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH0pO1xuXG4gIHJldHVybiB2YWx1ZSA9PiB2KHsgdHlwZSwgdmFsdWUgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtWaXNpdG9yW119IHZpc2l0b3JzIFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEZ1bmN0aW9ucyh2aXNpdG9ycywga2V5KSB7XG4gIGxldCBmdW5jdGlvbnMgPSBbXTtcbiAgZm9yIChsZXQgdmlzaXRvciBvZiB2aXNpdG9ycykge1xuICAgIGxldCBmID0gdmlzaXRvcltrZXldO1xuICAgIGlmIChmKSB7XG4gICAgICBmdW5jdGlvbnMucHVzaChmKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9ucztcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1Zpc2l0b3J9IHJlcyBcbiAqIEBwYXJhbSB7VmlzaXRvcltdfSB2aXNpdG9ycyBcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCBrZXkpIHtcbiAgbGV0IGZ1bmN0aW9ucyA9IGV4dHJhY3RGdW5jdGlvbnModmlzaXRvcnMsIGtleSk7XG4gIGlmIChmdW5jdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGZ1bmN0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXNba2V5XSA9IGZ1bmN0aW9uc1swXTtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXNba2V5XSA9IGFyZyA9PiB7XG4gICAgbGV0IG11dGF0ZWQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBmIG9mIGZ1bmN0aW9ucykge1xuICAgICAgbGV0IHJlcyA9IGYoYXJnKTtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgYXJnID0gcmVzO1xuICAgICAgICBtdXRhdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbXV0YXRlZCA/IGFyZyA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1Zpc2l0b3J9IHJlcyBcbiAqIEBwYXJhbSB7VmlzaXRvcltdfSB2aXNpdG9ycyBcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VBcnJheUZ1bmN0aW9ucyhyZXMsIHZpc2l0b3JzLCBrZXkpIHtcbiAgbGV0IGZ1bmN0aW9ucyA9IGV4dHJhY3RGdW5jdGlvbnModmlzaXRvcnMsIGtleSk7XG4gIGlmIChmdW5jdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGZ1bmN0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXNba2V5XSA9IGZ1bmN0aW9uc1swXTtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXNba2V5XSA9IGNyZWF0ZUFycmF5VmlzaXRvcihmdW5jdGlvbnMsIChmLCBpdGVtKSA9PiBmKGl0ZW0pKTtcbn1cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7VFtdfSB2aXNpdG9ycyBcbiAqIEBwYXJhbSB7KHZpc2l0b3I6IFQsIGl0ZW06IFYpID0+IFYgfCBWW10gfCB2b2lkfSBhcHBseSBcbiAqIEByZXR1cm5zIHsoaXRlbTogVikgPT4gViB8IFZbXSB8IHZvaWR9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUFycmF5VmlzaXRvcih2aXNpdG9ycywgYXBwbHkpIHtcbiAgbGV0IHNlZW4gPSBuZXcgQml0c2V0KHZpc2l0b3JzLmxlbmd0aCk7XG4gIHJldHVybiBhcmcgPT4ge1xuICAgIGxldCBhcnIgPSBbYXJnXTtcbiAgICBsZXQgbXV0YXRlZCA9IGZhbHNlO1xuICAgIHNlZW4uY2xlYXIoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gRm9yIGVhY2ggdmFsdWUsIGNhbGwgYWxsIHZpc2l0b3JzLiBJZiBhIHZpc2l0b3IgcmV0dXJucyBhIG5ldyB2YWx1ZSxcbiAgICAgIC8vIHdlIHN0YXJ0IG92ZXIsIGJ1dCBza2lwIHRoZSB2aXNpdG9yIHRoYXQgZ2VuZXJhdGVkIHRoZSB2YWx1ZSBvciBzYXdcbiAgICAgIC8vIGl0IGJlZm9yZSAodG8gYXZvaWQgY3ljbGVzKS4gVGhpcyB3YXksIHZpc2l0b3JzIGNhbiBiZSBjb21wb3NlZCBpbiBhbnkgb3JkZXIuIFxuICAgICAgZm9yIChsZXQgdiA9IDA7IHYgPCB2aXNpdG9ycy5sZW5ndGggJiYgaSA8IGFyci5sZW5ndGg7KSB7XG4gICAgICAgIGlmIChzZWVuLmdldCh2KSkge1xuICAgICAgICAgIHYrKztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpdGVtID0gYXJyW2ldO1xuICAgICAgICBsZXQgdmlzaXRvciA9IHZpc2l0b3JzW3ZdO1xuICAgICAgICBsZXQgcmVzID0gYXBwbHkodmlzaXRvciwgaXRlbSk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcykpIHtcbiAgICAgICAgICBpZiAocmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgYXJyLnNwbGljZShpLCAxKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGFycltpXSA9IHJlc1swXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJyLnNwbGljZShpLCAxLCAuLi5yZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtdXRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICBzZWVuLnNldCh2KTtcbiAgICAgICAgICB2ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChyZXMpIHtcbiAgICAgICAgICBhcnJbaV0gPSByZXM7XG4gICAgICAgICAgbXV0YXRlZCA9IHRydWU7XG4gICAgICAgICAgc2Vlbi5zZXQodik7XG4gICAgICAgICAgdiA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdisrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFtdXRhdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyci5sZW5ndGggPT09IDEgPyBhcnJbMF0gOiBhcnI7XG4gIH07XG59XG5cbmNsYXNzIEJpdHNldCB7XG4gIGNvbnN0cnVjdG9yKG1heEJpdHMgPSAzMikge1xuICAgIHRoaXMuYml0cyA9IDA7XG4gICAgdGhpcy5tb3JlID0gbWF4Qml0cyA+IDMyID8gbmV3IFVpbnQzMkFycmF5KE1hdGguY2VpbCgobWF4Qml0cyAtIDMyKSAvIDMyKSkgOiBudWxsO1xuICB9XG5cbiAgLyoqIEBwYXJhbSB7bnVtYmVyfSBiaXQgKi9cbiAgZ2V0KGJpdCkge1xuICAgIGlmIChiaXQgPj0gMzIgJiYgdGhpcy5tb3JlKSB7XG4gICAgICBsZXQgaSA9IE1hdGguZmxvb3IoKGJpdCAtIDMyKSAvIDMyKTtcbiAgICAgIGxldCBiID0gYml0ICUgMzI7XG4gICAgICByZXR1cm4gQm9vbGVhbih0aGlzLm1vcmVbaV0gJiAoMSA8PCBiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuYml0cyAmICgxIDw8IGJpdCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge251bWJlcn0gYml0ICovXG4gIHNldChiaXQpIHtcbiAgICBpZiAoYml0ID49IDMyICYmIHRoaXMubW9yZSkge1xuICAgICAgbGV0IGkgPSBNYXRoLmZsb29yKChiaXQgLSAzMikgLyAzMik7XG4gICAgICBsZXQgYiA9IGJpdCAlIDMyO1xuICAgICAgdGhpcy5tb3JlW2ldIHw9IDEgPDwgYjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iaXRzIHw9IDEgPDwgYml0O1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuYml0cyA9IDA7XG4gICAgaWYgKHRoaXMubW9yZSkge1xuICAgICAgdGhpcy5tb3JlLmZpbGwoMCk7XG4gICAgfVxuICB9XG59XG4iLAogICAgIi8vIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGJ5IGJ1aWxkLXByZWZpeGVzLmpzLiBETyBOT1QgRURJVCFcblxuZXhwb3J0cy5GZWF0dXJlcyA9IHtcbiAgTmVzdGluZzogMSxcbiAgTm90U2VsZWN0b3JMaXN0OiAyLFxuICBEaXJTZWxlY3RvcjogNCxcbiAgTGFuZ1NlbGVjdG9yTGlzdDogOCxcbiAgSXNTZWxlY3RvcjogMTYsXG4gIFRleHREZWNvcmF0aW9uVGhpY2tuZXNzUGVyY2VudDogMzIsXG4gIE1lZGlhSW50ZXJ2YWxTeW50YXg6IDY0LFxuICBNZWRpYVJhbmdlU3ludGF4OiAxMjgsXG4gIEN1c3RvbU1lZGlhUXVlcmllczogMjU2LFxuICBDbGFtcEZ1bmN0aW9uOiA1MTIsXG4gIENvbG9yRnVuY3Rpb246IDEwMjQsXG4gIE9rbGFiQ29sb3JzOiAyMDQ4LFxuICBMYWJDb2xvcnM6IDQwOTYsXG4gIFAzQ29sb3JzOiA4MTkyLFxuICBIZXhBbHBoYUNvbG9yczogMTYzODQsXG4gIFNwYWNlU2VwYXJhdGVkQ29sb3JOb3RhdGlvbjogMzI3NjgsXG4gIEZvbnRGYW1pbHlTeXN0ZW1VaTogNjU1MzYsXG4gIERvdWJsZVBvc2l0aW9uR3JhZGllbnRzOiAxMzEwNzIsXG4gIFZlbmRvclByZWZpeGVzOiAyNjIxNDQsXG4gIExvZ2ljYWxQcm9wZXJ0aWVzOiA1MjQyODgsXG4gIExpZ2h0RGFyazogMTA0ODU3NixcbiAgU2VsZWN0b3JzOiAzMSxcbiAgTWVkaWFRdWVyaWVzOiA0NDgsXG4gIENvbG9yczogMTExMzA4OCxcbn07XG4iLAogICAgImxldCBwYXJ0cyA9IFtwcm9jZXNzLnBsYXRmb3JtLCBwcm9jZXNzLmFyY2hdO1xuaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdsaW51eCcpIHtcbiAgY29uc3QgeyBNVVNMLCBmYW1pbHlTeW5jIH0gPSByZXF1aXJlKCdkZXRlY3QtbGliYycpO1xuICBjb25zdCBmYW1pbHkgPSBmYW1pbHlTeW5jKCk7XG4gIGlmIChmYW1pbHkgPT09IE1VU0wpIHtcbiAgICBwYXJ0cy5wdXNoKCdtdXNsJyk7XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAnYXJtJykge1xuICAgIHBhcnRzLnB1c2goJ2dudWVhYmloZicpO1xuICB9IGVsc2Uge1xuICAgIHBhcnRzLnB1c2goJ2dudScpO1xuICB9XG59IGVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgcGFydHMucHVzaCgnbXN2YycpO1xufVxuXG5sZXQgbmF0aXZlO1xudHJ5IHtcbiAgbmF0aXZlID0gcmVxdWlyZShgbGlnaHRuaW5nY3NzLSR7cGFydHMuam9pbignLScpfWApO1xufSBjYXRjaCAoZXJyKSB7XG4gIG5hdGl2ZSA9IHJlcXVpcmUoYC4uL2xpZ2h0bmluZ2Nzcy4ke3BhcnRzLmpvaW4oJy0nKX0ubm9kZWApO1xufVxuXG5tb2R1bGUuZXhwb3J0cy50cmFuc2Zvcm0gPSB3cmFwKG5hdGl2ZS50cmFuc2Zvcm0pO1xubW9kdWxlLmV4cG9ydHMudHJhbnNmb3JtU3R5bGVBdHRyaWJ1dGUgPSB3cmFwKG5hdGl2ZS50cmFuc2Zvcm1TdHlsZUF0dHJpYnV0ZSk7XG5tb2R1bGUuZXhwb3J0cy5idW5kbGUgPSB3cmFwKG5hdGl2ZS5idW5kbGUpO1xubW9kdWxlLmV4cG9ydHMuYnVuZGxlQXN5bmMgPSB3cmFwKG5hdGl2ZS5idW5kbGVBc3luYyk7XG5tb2R1bGUuZXhwb3J0cy5icm93c2Vyc2xpc3RUb1RhcmdldHMgPSByZXF1aXJlKCcuL2Jyb3dzZXJzbGlzdFRvVGFyZ2V0cycpO1xubW9kdWxlLmV4cG9ydHMuY29tcG9zZVZpc2l0b3JzID0gcmVxdWlyZSgnLi9jb21wb3NlVmlzaXRvcnMnKTtcbm1vZHVsZS5leHBvcnRzLkZlYXR1cmVzID0gcmVxdWlyZSgnLi9mbGFncycpLkZlYXR1cmVzO1xuXG5mdW5jdGlvbiB3cmFwKGNhbGwpIHtcbiAgcmV0dXJuIChvcHRpb25zKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnZpc2l0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGxldCBkZXBzID0gW107XG4gICAgICBvcHRpb25zLnZpc2l0b3IgPSBvcHRpb25zLnZpc2l0b3Ioe1xuICAgICAgICBhZGREZXBlbmRlbmN5KGRlcCkge1xuICAgICAgICAgIGRlcHMucHVzaChkZXApO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHJlc3VsdCA9IGNhbGwob3B0aW9ucyk7XG4gICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudGhlbihyZXMgPT4ge1xuICAgICAgICAgIGlmIChkZXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVzLmRlcGVuZGVuY2llcyA/Pz0gW107XG4gICAgICAgICAgICByZXMuZGVwZW5kZW5jaWVzLnB1c2goLi4uZGVwcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChkZXBzLmxlbmd0aCkge1xuICAgICAgICByZXN1bHQuZGVwZW5kZW5jaWVzID8/PSBbXTtcbiAgICAgICAgcmVzdWx0LmRlcGVuZGVuY2llcy5wdXNoKC4uLmRlcHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNhbGwob3B0aW9ucyk7XG4gICAgfVxuICB9O1xufVxuIiwKICAgICIjIS91c3IvYmluL2VudiBidW5cbi8qKlxuICogUG9zdGJ1aWxkIENTUyBwdXJnZSDigJQgc3RhbmRhbG9uZSBCdW4gc2NyaXB0LlxuICpcbiAqIFJ1bnMgYWZ0ZXIgcnNidWlsZCBidWlsZCwgcHVyZ2VzIENTUyBmaWxlcyBpbiBkaXN0LyB1c2luZyBhIGRhdGFiYXNlLWZpcnN0XG4gKiBjb21wb25lbnQgbWFuaWZlc3QgYW5kIGNvbnN1bWVyIEpTWCB1c2FnZSBhbmFseXNpcy5cbiAqXG4gKiBDb25zZXJ2YXRpdmUgcnVsZXM6XG4gKiAgIC0gc2VsZWN0b3JzIG93bmVkIG9ubHkgYnkgdW51c2VkIGtub3duIGNvbXBvbmVudHMgY2FuIGJlIHJlbW92ZWRcbiAqICAgLSBzZWxlY3RvcnMgb3duZWQgYnkgdXNlZCBjb21wb25lbnRzIGJ1dCB1bnVzZWQga25vd24gcHJvcCB2YXJpYW50cyBjYW4gYmUgcmVtb3ZlZFxuICogICAtIHNlbGVjdG9ycyB3aXRoIHVua25vd24gb3duZXJzaGlwIGFyZSBrZXB0XG4gKiAgIC0gZGF0YS9hcmlhIHJ1bnRpbWUgc3RhdGUgaXMga2VwdCB3aGVuIHRoZSBvd25pbmcgY29tcG9uZW50IHNlbGVjdG9yIGlzIGtlcHRcbiAqICAgLSB2YXJzL2tleWZyYW1lcyBhcmUgcmVtb3ZlZCBvbmx5IGFmdGVyIHNlbGVjdG9yIHB1cmdlIHByb3ZlcyB0aGVtIHVucmVmZXJlbmNlZFxuICovXG5cbmltcG9ydCB7IEdsb2IgfSBmcm9tIFwiYnVuXCI7XG5pbXBvcnQgeyB0cmFuc2Zvcm0gfSBmcm9tIFwibGlnaHRuaW5nY3NzXCI7XG5pbXBvcnQgcG9zdGNzcyBmcm9tIFwicG9zdGNzc1wiO1xuaW1wb3J0IHR5cGUgeyBBdFJ1bGUsIFJ1bGUgfSBmcm9tIFwicG9zdGNzc1wiO1xuaW1wb3J0IHsgYnVpbGRTYWZlbGlzdHMsIHNjYW5Db25zdW1lclNvdXJjZSB9IGZyb20gXCIuL3NjYW4tY29uc3VtZXJcIjtcbmltcG9ydCB0eXBlIHtcblx0Q29tcG9uZW50UHVyZ2VSZWNvcmQsXG5cdExlZ2FjeUNvbXBvbmVudE1hbmlmZXN0LFxuXHRQdXJnZU1hbmlmZXN0LFxuXHRTYWZlbGlzdHMsXG59IGZyb20gXCIuL3NjYW4tY29uc3VtZXJcIjtcblxuLy8g4pSA4pSAIENMSSBhcmdzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pOiB7XG5cdGRpc3REaXI6IHN0cmluZztcblx0c3JjRGlyOiBzdHJpbmc7XG5cdG1hbmlmZXN0UGF0aDogc3RyaW5nO1xufSB7XG5cdGNvbnN0IGFyZ3MgPSBhcmd2LnNsaWNlKDIpO1xuXHRsZXQgZGlzdERpciA9IFwiLi9kaXN0XCI7XG5cdGxldCBzcmNEaXIgPSBcIi4vc3JjXCI7XG5cdGxldCBtYW5pZmVzdFBhdGggPSBcIlwiO1xuXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChhcmdzW2ldID09PSBcIi0tZGlzdFwiICYmIGFyZ3NbaSArIDFdKSBkaXN0RGlyID0gYXJnc1srK2ldO1xuXHRcdGVsc2UgaWYgKGFyZ3NbaV0gPT09IFwiLS1zcmNcIiAmJiBhcmdzW2kgKyAxXSkgc3JjRGlyID0gYXJnc1srK2ldO1xuXHRcdGVsc2UgaWYgKGFyZ3NbaV0gPT09IFwiLS1tYW5pZmVzdFwiICYmIGFyZ3NbaSArIDFdKSBtYW5pZmVzdFBhdGggPSBhcmdzWysraV07XG5cdH1cblxuXHRpZiAoIW1hbmlmZXN0UGF0aCkge1xuXHRcdGNvbnNvbGUuZXJyb3IoXG5cdFx0XHRcIlVzYWdlOiBidW54IEBwYXRoc2NhbGUvcnNidWlsZC1wbHVnaW4tdWktY3NzLXB1cmdlIC0tbWFuaWZlc3QgPHBhdGg+IFstLWRpc3QgPHBhdGg+XSBbLS1zcmMgPHBhdGg+XVwiLFxuXHRcdCk7XG5cdFx0cHJvY2Vzcy5leGl0KDEpO1xuXHR9XG5cblx0cmV0dXJuIHsgZGlzdERpciwgc3JjRGlyLCBtYW5pZmVzdFBhdGggfTtcbn1cblxuLy8g4pSA4pSAIERhdGFiYXNlIG5vcm1hbGl6YXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmludGVyZmFjZSBOb3JtYWxpemVkQ29tcG9uZW50UmVjb3JkIGV4dGVuZHMgTGVnYWN5Q29tcG9uZW50TWFuaWZlc3Qge1xuXHRrZXk6IHN0cmluZztcblx0Y29tcG9uZW50OiBzdHJpbmc7XG5cdHBhcnQ/OiBzdHJpbmc7XG5cdHNlbGVjdG9yczogc3RyaW5nW107XG5cdGF0dHJpYnV0ZVNlbGVjdG9yczogc3RyaW5nW107XG5cdGNzc1ZhcnM6IHtcblx0XHRkZWNsYXJlZDogc3RyaW5nW107XG5cdFx0cmVmZXJlbmNlZDogc3RyaW5nW107XG5cdH07XG5cdGtleWZyYW1lczoge1xuXHRcdGRlY2xhcmVkOiBzdHJpbmdbXTtcblx0XHRyZWZlcmVuY2VkOiBzdHJpbmdbXTtcblx0fTtcbn1cblxuaW50ZXJmYWNlIE5vcm1hbGl6ZWRQdXJnZURhdGFiYXNlIHtcblx0dmVyc2lvbjogMjtcblx0Y29tcG9uZW50czogUmVjb3JkPHN0cmluZywgTm9ybWFsaXplZENvbXBvbmVudFJlY29yZD47XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVB1cmdlRGF0YWJhc2UoXG5cdG1hbmlmZXN0OiBQdXJnZU1hbmlmZXN0LFxuKTogTm9ybWFsaXplZFB1cmdlRGF0YWJhc2Uge1xuXHRjb25zdCByYXdDb21wb25lbnRzID1cblx0XHRcInZlcnNpb25cIiBpbiBtYW5pZmVzdCAmJiBtYW5pZmVzdC52ZXJzaW9uID09PSAyXG5cdFx0XHQ/IG1hbmlmZXN0LmNvbXBvbmVudHNcblx0XHRcdDogbWFuaWZlc3Q7XG5cdGNvbnN0IGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIE5vcm1hbGl6ZWRDb21wb25lbnRSZWNvcmQ+ID0ge307XG5cblx0Zm9yIChjb25zdCBba2V5LCByZWNvcmRdIG9mIE9iamVjdC5lbnRyaWVzKHJhd0NvbXBvbmVudHMpKSB7XG5cdFx0Y29uc3QgbWF5YmVWMiA9IHJlY29yZCBhcyBDb21wb25lbnRQdXJnZVJlY29yZDtcblx0XHRjb25zdCBbZmFsbGJhY2tDb21wb25lbnQsIGZhbGxiYWNrUGFydF0gPSBzcGxpdENvbXBvbmVudEtleShrZXkpO1xuXHRcdGNvbXBvbmVudHNba2V5XSA9IHtcblx0XHRcdC4uLnJlY29yZCxcblx0XHRcdGtleTogbWF5YmVWMi5rZXkgPz8ga2V5LFxuXHRcdFx0Y29tcG9uZW50OiBtYXliZVYyLmNvbXBvbmVudCA/PyBmYWxsYmFja0NvbXBvbmVudCxcblx0XHRcdHBhcnQ6IG1heWJlVjIucGFydCA/PyBmYWxsYmFja1BhcnQsXG5cdFx0XHRzZWxlY3RvcnM6IG1heWJlVjIuc2VsZWN0b3JzID8/IFtdLFxuXHRcdFx0YXR0cmlidXRlU2VsZWN0b3JzOiBtYXliZVYyLmF0dHJpYnV0ZVNlbGVjdG9ycyA/PyBbXSxcblx0XHRcdGNzc1ZhcnM6IHtcblx0XHRcdFx0ZGVjbGFyZWQ6IG1heWJlVjIuY3NzVmFycz8uZGVjbGFyZWQgPz8gW10sXG5cdFx0XHRcdHJlZmVyZW5jZWQ6IG1heWJlVjIuY3NzVmFycz8ucmVmZXJlbmNlZCA/PyBbXSxcblx0XHRcdH0sXG5cdFx0XHRrZXlmcmFtZXM6IHtcblx0XHRcdFx0ZGVjbGFyZWQ6IG1heWJlVjIua2V5ZnJhbWVzPy5kZWNsYXJlZCA/PyBbXSxcblx0XHRcdFx0cmVmZXJlbmNlZDogbWF5YmVWMi5rZXlmcmFtZXM/LnJlZmVyZW5jZWQgPz8gW10sXG5cdFx0XHR9LFxuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4geyB2ZXJzaW9uOiAyLCBjb21wb25lbnRzIH07XG59XG5cbmZ1bmN0aW9uIHNwbGl0Q29tcG9uZW50S2V5KGtleTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkXSB7XG5cdGNvbnN0IFtjb21wb25lbnQsIC4uLnBhcnRdID0ga2V5LnNwbGl0KFwiLlwiKTtcblx0cmV0dXJuIFtjb21wb25lbnQsIHBhcnQubGVuZ3RoID4gMCA/IHBhcnQuam9pbihcIi5cIikgOiB1bmRlZmluZWRdO1xufVxuXG5mdW5jdGlvbiByb290Q29tcG9uZW50KGtleTogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIGtleS5zcGxpdChcIi5cIilbMF07XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RDbGFzc2VzRnJvbUVudHJ5KGVudHJ5OiBMZWdhY3lDb21wb25lbnRNYW5pZmVzdCk6IHN0cmluZ1tdIHtcblx0Y29uc3QgcmVzdWx0ID0gWy4uLmVudHJ5LmNsYXNzZXMuYWx3YXlzXTtcblx0Zm9yIChjb25zdCB2YWx1ZSBvZiBPYmplY3QudmFsdWVzKGVudHJ5LmNsYXNzZXMuYnlQcm9wKSkge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0cmVzdWx0LnB1c2goLi4udmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKGNvbnN0IGNsYXNzZXMgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goLi4uY2xhc3Nlcyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBbLi4ubmV3IFNldChyZXN1bHQpXTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDbGFzc093bmVycyhcblx0ZGF0YWJhc2U6IE5vcm1hbGl6ZWRQdXJnZURhdGFiYXNlLFxuKTogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+IHtcblx0Y29uc3Qgb3duZXJzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuXHRmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhkYXRhYmFzZS5jb21wb25lbnRzKSkge1xuXHRcdGZvciAoY29uc3QgY2xzIG9mIGNvbGxlY3RDbGFzc2VzRnJvbUVudHJ5KGVudHJ5KSkge1xuXHRcdFx0Y29uc3QgZXhpc3RpbmcgPSBvd25lcnMuZ2V0KGNscykgPz8gbmV3IFNldDxzdHJpbmc+KCk7XG5cdFx0XHRleGlzdGluZy5hZGQoa2V5KTtcblx0XHRcdG93bmVycy5zZXQoY2xzLCBleGlzdGluZyk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvd25lcnM7XG59XG5cbmZ1bmN0aW9uIGlzUmVjb3JkVXNlZChyZWNvcmRLZXk6IHN0cmluZywgc2FmZWxpc3RzOiBTYWZlbGlzdHMpOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHRzYWZlbGlzdHMudXNlZENvbXBvbmVudHMuaGFzKHJlY29yZEtleSkgfHxcblx0XHRzYWZlbGlzdHMudXNlZENvbXBvbmVudHMuaGFzKHJvb3RDb21wb25lbnQocmVjb3JkS2V5KSlcblx0KTtcbn1cblxuZnVuY3Rpb24gaXNDbGFzc0FsbG93ZWQoXG5cdGNsczogc3RyaW5nLFxuXHRvd25lcnM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pixcblx0c2FmZWxpc3RzOiBTYWZlbGlzdHMsXG4pOiBib29sZWFuIHtcblx0Y29uc3QgY2xhc3NPd25lcnMgPSBvd25lcnMuZ2V0KGNscyk7XG5cdGlmICghY2xhc3NPd25lcnMpIHJldHVybiB0cnVlO1xuXHRmb3IgKGNvbnN0IG93bmVyIG9mIGNsYXNzT3duZXJzKSB7XG5cdFx0aWYgKGlzUmVjb3JkVXNlZChvd25lciwgc2FmZWxpc3RzKSAmJiBzYWZlbGlzdHMuY2xhc3NTYWZlbGlzdC5oYXMoY2xzKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuLy8g4pSA4pSAIFNlbGVjdG9yIHB1cmdlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5pbnRlcmZhY2UgU2VsZWN0b3JQdXJnZVJlcG9ydCB7XG5cdHNlbGVjdG9yc0tlcHRLbm93bjogbnVtYmVyO1xuXHRzZWxlY3RvcnNLZXB0VW5rbm93bjogbnVtYmVyO1xuXHRzZWxlY3RvcnNSZW1vdmVkOiBudW1iZXI7XG5cdHNlbGVjdG9yc1JlbW92ZWRVbnVzZWRDb21wb25lbnQ6IG51bWJlcjtcblx0c2VsZWN0b3JzUmVtb3ZlZFVudXNlZFZhcmlhbnQ6IG51bWJlcjtcblx0YXR0clNlbGVjdG9yc1NlZW46IG51bWJlcjtcblx0a2V5ZnJhbWVzUmVtb3ZlZDogbnVtYmVyO1xuXHRmb250RmFjZXNSZW1vdmVkOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBQdXJnZVJlc3VsdCB7XG5cdGNzczogc3RyaW5nO1xuXHRyZXBvcnQ6IFNlbGVjdG9yUHVyZ2VSZXBvcnQ7XG59XG5cbmZ1bmN0aW9uIGVtcHR5U2VsZWN0b3JSZXBvcnQoKTogU2VsZWN0b3JQdXJnZVJlcG9ydCB7XG5cdHJldHVybiB7XG5cdFx0c2VsZWN0b3JzS2VwdEtub3duOiAwLFxuXHRcdHNlbGVjdG9yc0tlcHRVbmtub3duOiAwLFxuXHRcdHNlbGVjdG9yc1JlbW92ZWQ6IDAsXG5cdFx0c2VsZWN0b3JzUmVtb3ZlZFVudXNlZENvbXBvbmVudDogMCxcblx0XHRzZWxlY3RvcnNSZW1vdmVkVW51c2VkVmFyaWFudDogMCxcblx0XHRhdHRyU2VsZWN0b3JzU2VlbjogMCxcblx0XHRrZXlmcmFtZXNSZW1vdmVkOiAwLFxuXHRcdGZvbnRGYWNlc1JlbW92ZWQ6IDAsXG5cdH07XG59XG5cbi8qKiBVbmVzY2FwZSBDU1MgaWRlbnRpZmllcnM6IGBpY29uLVxcW21kaS0tY29nXFxdYCAtPiBgaWNvbi1bbWRpLS1jb2ddYCAqL1xuZnVuY3Rpb24gdW5lc2NhcGVDc3Moczogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHMucmVwbGFjZSgvXFxcXCguKS9nLCBcIiQxXCIpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0Q2xhc3Nlc0Zyb21TZWxlY3RvcihzZWxlY3Rvcjogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRjb25zdCBtYXRjaGVzID0gc2VsZWN0b3IubWF0Y2hBbGwoXG5cdFx0L1xcLihbYS16QS1aXy1dKD86W2EtekEtWjAtOV8tXXxcXFxcW15cXHMuIzpbPit+LCldKikqKS9nLFxuXHQpO1xuXHRyZXR1cm4gWy4uLm1hdGNoZXNdLm1hcCgobSkgPT4gdW5lc2NhcGVDc3MobVsxXSkpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0QXR0cnNGcm9tU2VsZWN0b3Ioc2VsZWN0b3I6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0Y29uc3QgbWF0Y2hlcyA9IHNlbGVjdG9yLm1hdGNoQWxsKFxuXHRcdC9cXFsoZGF0YS1bYS16QS1aMC05Xy1dK3xhcmlhLVthLXpBLVowLTlfLV0rKSg/Oj0oPzpcIihbXlwiXSopXCJ8JyhbXiddKiknfChbXlxcXV0rKSkpP1xcXS9nLFxuXHQpO1xuXHRyZXR1cm4gWy4uLm1hdGNoZXNdLm1hcCgobSkgPT4ge1xuXHRcdGNvbnN0IHZhbHVlID0gbVsyXSA/PyBtWzNdID8/IG1bNF07XG5cdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyBgWyR7bVsxXX1dYCA6IGBbJHttWzFdfT1cIiR7dmFsdWUudHJpbSgpfVwiXWA7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RvckRlY2lzaW9uKFxuXHRzZWxlY3Rvcjogc3RyaW5nLFxuXHRvd25lcnM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pixcblx0c2FmZWxpc3RzOiBTYWZlbGlzdHMsXG4pOlxuXHR8IFwia2VlcC1rbm93blwiXG5cdHwgXCJrZWVwLXVua25vd25cIlxuXHR8IFwicmVtb3ZlLXVudXNlZC1jb21wb25lbnRcIlxuXHR8IFwicmVtb3ZlLXVudXNlZC12YXJpYW50XCIge1xuXHRjb25zdCBjbGFzc2VzID0gZXh0cmFjdENsYXNzZXNGcm9tU2VsZWN0b3Ioc2VsZWN0b3IpO1xuXHRpZiAoY2xhc3Nlcy5sZW5ndGggPT09IDApIHJldHVybiBcImtlZXAtdW5rbm93blwiO1xuXG5cdGNvbnN0IGhhc1Vua25vd25DbGFzcyA9IGNsYXNzZXMuc29tZSgoY2xzKSA9PiAhb3duZXJzLmhhcyhjbHMpKTtcblx0aWYgKGhhc1Vua25vd25DbGFzcykgcmV0dXJuIFwia2VlcC11bmtub3duXCI7XG5cblx0Y29uc3QgaGFzVXNlZE93bmVyID0gY2xhc3Nlcy5zb21lKChjbHMpID0+IHtcblx0XHRjb25zdCBjbGFzc093bmVycyA9IG93bmVycy5nZXQoY2xzKTtcblx0XHRyZXR1cm4gWy4uLihjbGFzc093bmVycyA/PyBbXSldLnNvbWUoKG93bmVyKSA9PlxuXHRcdFx0aXNSZWNvcmRVc2VkKG93bmVyLCBzYWZlbGlzdHMpLFxuXHRcdCk7XG5cdH0pO1xuXG5cdGlmICghaGFzVXNlZE93bmVyKSByZXR1cm4gXCJyZW1vdmUtdW51c2VkLWNvbXBvbmVudFwiO1xuXG5cdGlmIChjbGFzc2VzLmV2ZXJ5KChjbHMpID0+IGlzQ2xhc3NBbGxvd2VkKGNscywgb3duZXJzLCBzYWZlbGlzdHMpKSkge1xuXHRcdHJldHVybiBcImtlZXAta25vd25cIjtcblx0fVxuXG5cdHJldHVybiBcInJlbW92ZS11bnVzZWQtdmFyaWFudFwiO1xufVxuXG5mdW5jdGlvbiBwdXJnZUNzc1dpdGhEYXRhYmFzZShcblx0Y3NzOiBzdHJpbmcsXG5cdG1hbmlmZXN0OiBQdXJnZU1hbmlmZXN0IHwgTm9ybWFsaXplZFB1cmdlRGF0YWJhc2UsXG5cdHNhZmVsaXN0czogU2FmZWxpc3RzLFxuKTogUHVyZ2VSZXN1bHQge1xuXHRjb25zdCBkYXRhYmFzZSA9IG5vcm1hbGl6ZVB1cmdlRGF0YWJhc2UobWFuaWZlc3QgYXMgUHVyZ2VNYW5pZmVzdCk7XG5cdGNvbnN0IGNsYXNzT3duZXJzID0gYnVpbGRDbGFzc093bmVycyhkYXRhYmFzZSk7XG5cdGNvbnN0IHJlcG9ydCA9IGVtcHR5U2VsZWN0b3JSZXBvcnQoKTtcblx0Y29uc3Qgcm9vdCA9IHBvc3Rjc3MucGFyc2UoY3NzKTtcblxuXHRyb290LndhbGtSdWxlcygocnVsZSkgPT4ge1xuXHRcdGNvbnN0IHNlbGVjdG9ycyA9IHJ1bGUuc2VsZWN0b3JzO1xuXHRcdGNvbnN0IGtlcHQ6IHN0cmluZ1tdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IHNlbGVjdG9yIG9mIHNlbGVjdG9ycykge1xuXHRcdFx0cmVwb3J0LmF0dHJTZWxlY3RvcnNTZWVuICs9IGV4dHJhY3RBdHRyc0Zyb21TZWxlY3RvcihzZWxlY3RvcikubGVuZ3RoO1xuXHRcdFx0Y29uc3QgZGVjaXNpb24gPSBzZWxlY3RvckRlY2lzaW9uKHNlbGVjdG9yLCBjbGFzc093bmVycywgc2FmZWxpc3RzKTtcblx0XHRcdGlmIChkZWNpc2lvbiA9PT0gXCJrZWVwLWtub3duXCIpIHtcblx0XHRcdFx0cmVwb3J0LnNlbGVjdG9yc0tlcHRLbm93bisrO1xuXHRcdFx0XHRrZXB0LnB1c2goc2VsZWN0b3IpO1xuXHRcdFx0fSBlbHNlIGlmIChkZWNpc2lvbiA9PT0gXCJrZWVwLXVua25vd25cIikge1xuXHRcdFx0XHRyZXBvcnQuc2VsZWN0b3JzS2VwdFVua25vd24rKztcblx0XHRcdFx0a2VwdC5wdXNoKHNlbGVjdG9yKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlcG9ydC5zZWxlY3RvcnNSZW1vdmVkKys7XG5cdFx0XHRcdGlmIChkZWNpc2lvbiA9PT0gXCJyZW1vdmUtdW51c2VkLWNvbXBvbmVudFwiKSB7XG5cdFx0XHRcdFx0cmVwb3J0LnNlbGVjdG9yc1JlbW92ZWRVbnVzZWRDb21wb25lbnQrKztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXBvcnQuc2VsZWN0b3JzUmVtb3ZlZFVudXNlZFZhcmlhbnQrKztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChrZXB0Lmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cnVsZS5yZW1vdmUoKTtcblx0XHR9IGVsc2UgaWYgKGtlcHQubGVuZ3RoIDwgc2VsZWN0b3JzLmxlbmd0aCkge1xuXHRcdFx0cnVsZS5zZWxlY3RvcnMgPSBrZXB0O1xuXHRcdH1cblx0fSk7XG5cblx0cmVtb3ZlVW51c2VkS2V5ZnJhbWVzKHJvb3QsIHJlcG9ydCk7XG5cdHJlbW92ZVVudXNlZEZvbnRGYWNlcyhyb290LCByZXBvcnQpO1xuXHRyZW1vdmVFbXB0eUF0UnVsZXMocm9vdCk7XG5cblx0cmV0dXJuIHsgY3NzOiByb290LnRvU3RyaW5nKCksIHJlcG9ydCB9O1xufVxuXG5mdW5jdGlvbiByZW1vdmVVbnVzZWRLZXlmcmFtZXMoXG5cdHJvb3Q6IHBvc3Rjc3MuUm9vdCxcblx0cmVwb3J0OiBTZWxlY3RvclB1cmdlUmVwb3J0LFxuKSB7XG5cdGNvbnN0IHVzZWRLZXlmcmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0cm9vdC53YWxrRGVjbHMoL15hbmltYXRpb24oLW5hbWUpPyQvLCAoZGVjbCkgPT4ge1xuXHRcdGZvciAoY29uc3QgcGFydCBvZiBkZWNsLnZhbHVlLnNwbGl0KFwiLFwiKSkge1xuXHRcdFx0Y29uc3QgbmFtZSA9IHBhcnQudHJpbSgpLnNwbGl0KC9cXHMrLylbMF07XG5cdFx0XHRpZiAobmFtZSAmJiAhW1wibm9uZVwiLCBcImluaXRpYWxcIiwgXCJpbmhlcml0XCIsIFwidW5zZXRcIl0uaW5jbHVkZXMobmFtZSkpIHtcblx0XHRcdFx0dXNlZEtleWZyYW1lcy5hZGQobmFtZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRyb290LndhbGtBdFJ1bGVzKFwia2V5ZnJhbWVzXCIsIChhdFJ1bGUpID0+IHtcblx0XHRpZiAoIXVzZWRLZXlmcmFtZXMuaGFzKGF0UnVsZS5wYXJhbXMudHJpbSgpKSkge1xuXHRcdFx0YXRSdWxlLnJlbW92ZSgpO1xuXHRcdFx0cmVwb3J0LmtleWZyYW1lc1JlbW92ZWQrKztcblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVVbnVzZWRGb250RmFjZXMoXG5cdHJvb3Q6IHBvc3Rjc3MuUm9vdCxcblx0cmVwb3J0OiBTZWxlY3RvclB1cmdlUmVwb3J0LFxuKSB7XG5cdGNvbnN0IHVzZWRGb250cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRyb290LndhbGtEZWNscygvXmZvbnQoLWZhbWlseSk/JC8sIChkZWNsKSA9PiB7XG5cdFx0Zm9yIChjb25zdCBwYXJ0IG9mIGRlY2wudmFsdWUuc3BsaXQoXCIsXCIpKSB7XG5cdFx0XHRjb25zdCBuYW1lID0gcGFydC50cmltKCkucmVwbGFjZSgvXltcIiddfFtcIiddJC9nLCBcIlwiKTtcblx0XHRcdGlmIChuYW1lKSB1c2VkRm9udHMuYWRkKG5hbWUpO1xuXHRcdH1cblx0fSk7XG5cblx0cm9vdC53YWxrQXRSdWxlcyhcImZvbnQtZmFjZVwiLCAoYXRSdWxlKSA9PiB7XG5cdFx0bGV0IGZhbWlseSA9IFwiXCI7XG5cdFx0YXRSdWxlLndhbGtEZWNscyhcImZvbnQtZmFtaWx5XCIsIChkZWNsKSA9PiB7XG5cdFx0XHRmYW1pbHkgPSBkZWNsLnZhbHVlLnRyaW0oKS5yZXBsYWNlKC9eW1wiJ118W1wiJ10kL2csIFwiXCIpO1xuXHRcdH0pO1xuXHRcdGlmIChmYW1pbHkgJiYgIXVzZWRGb250cy5oYXMoZmFtaWx5KSkge1xuXHRcdFx0YXRSdWxlLnJlbW92ZSgpO1xuXHRcdFx0cmVwb3J0LmZvbnRGYWNlc1JlbW92ZWQrKztcblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVFbXB0eUF0UnVsZXMocm9vdDogcG9zdGNzcy5Sb290KSB7XG5cdGxldCBjbGVhbmVkID0gdHJ1ZTtcblx0d2hpbGUgKGNsZWFuZWQpIHtcblx0XHRjbGVhbmVkID0gZmFsc2U7XG5cdFx0cm9vdC53YWxrQXRSdWxlcygoYXRSdWxlKSA9PiB7XG5cdFx0XHRpZiAoYXRSdWxlLm5vZGVzICYmIGF0UnVsZS5ub2Rlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0YXRSdWxlLnJlbW92ZSgpO1xuXHRcdFx0XHRjbGVhbmVkID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuXG4vLyDilIDilIAgUnVudGltZSBDU1MgdmFyaWFibGUgcmVmZXJlbmNlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdFJ1bnRpbWVDc3NWYXJSZWZzKGRpc3REaXI6IHN0cmluZyk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcblx0Y29uc3QgcmVmcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRjb25zdCBnbG9iID0gbmV3IEdsb2IoXCIqKi8qLntqcyxtanMsY2pzfVwiKTtcblxuXHRmb3IgYXdhaXQgKGNvbnN0IHJlbFBhdGggb2YgZ2xvYi5zY2FuKHsgY3dkOiBkaXN0RGlyIH0pKSB7XG5cdFx0Y29uc3QgZnVsbFBhdGggPSBgJHtkaXN0RGlyfS8ke3JlbFBhdGh9YDtcblx0XHRjb25zdCBjb2RlID0gYXdhaXQgQnVuLmZpbGUoZnVsbFBhdGgpLnRleHQoKTtcblx0XHRmb3IgKGNvbnN0IG1hdGNoIG9mIGNvZGUubWF0Y2hBbGwoL3ZhclxcKFxccyooLS1bYS16QS1aMC05Xy1dKykvZykpIHtcblx0XHRcdHJlZnMuYWRkKG1hdGNoWzFdKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVmcztcbn1cblxuLy8g4pSA4pSAIFVudXNlZCBDU1MgdmFyaWFibGUgY2xlYW51cCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIFZhckNsZWFudXBSZXN1bHQge1xuXHRjc3M6IHN0cmluZztcblx0cmVtb3ZlZDogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiBjbGVhblVudXNlZFZhcnNXaXRoUmVwb3J0KFxuXHRjc3M6IHN0cmluZyxcblx0ZXh0ZXJuYWxseVJlZmVyZW5jZWRWYXJzOiBTZXQ8c3RyaW5nPixcbik6IFZhckNsZWFudXBSZXN1bHQge1xuXHRsZXQgY2hhbmdlZCA9IHRydWU7XG5cdGxldCByZXN1bHQgPSBjc3M7XG5cdGxldCByZW1vdmVkID0gMDtcblxuXHR3aGlsZSAoY2hhbmdlZCkge1xuXHRcdGNoYW5nZWQgPSBmYWxzZTtcblx0XHRjb25zdCByb290ID0gcG9zdGNzcy5wYXJzZShyZXN1bHQpO1xuXG5cdFx0Y29uc3QgZGVjbGFyZWQgPSBuZXcgTWFwPHN0cmluZywgeyBydWxlOiBSdWxlIHwgQXRSdWxlOyBwcm9wOiBzdHJpbmcgfVtdPigpO1xuXHRcdHJvb3Qud2Fsa0RlY2xzKC9eLS0vLCAoZGVjbCkgPT4ge1xuXHRcdFx0Y29uc3QgZW50cmllcyA9IGRlY2xhcmVkLmdldChkZWNsLnByb3ApID8/IFtdO1xuXHRcdFx0ZW50cmllcy5wdXNoKHsgcnVsZTogZGVjbC5wYXJlbnQgYXMgUnVsZSwgcHJvcDogZGVjbC5wcm9wIH0pO1xuXHRcdFx0ZGVjbGFyZWQuc2V0KGRlY2wucHJvcCwgZW50cmllcyk7XG5cdFx0fSk7XG5cblx0XHRjb25zdCByZWZlcmVuY2VkID0gbmV3IFNldDxzdHJpbmc+KGV4dGVybmFsbHlSZWZlcmVuY2VkVmFycyk7XG5cdFx0cm9vdC53YWxrRGVjbHMoKGRlY2wpID0+IHtcblx0XHRcdGZvciAoY29uc3QgcmVmIG9mIGRlY2wudmFsdWUubWF0Y2hBbGwoL3ZhclxcKFxccyooLS1bYS16QS1aMC05Xy1dKykvZykpIHtcblx0XHRcdFx0cmVmZXJlbmNlZC5hZGQocmVmWzFdKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGZvciAoY29uc3QgW3Zhck5hbWUsIGVudHJpZXNdIG9mIGRlY2xhcmVkKSB7XG5cdFx0XHRpZiAoIXJlZmVyZW5jZWQuaGFzKHZhck5hbWUpKSB7XG5cdFx0XHRcdGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuXHRcdFx0XHRcdGVudHJ5LnJ1bGUud2Fsa0RlY2xzKGVudHJ5LnByb3AsIChkZWNsKSA9PiB7XG5cdFx0XHRcdFx0XHRkZWNsLnJlbW92ZSgpO1xuXHRcdFx0XHRcdFx0Y2hhbmdlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRyZW1vdmVkKys7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyb290LndhbGtSdWxlcygocnVsZSkgPT4ge1xuXHRcdFx0aWYgKHJ1bGUubm9kZXMgJiYgcnVsZS5ub2Rlcy5sZW5ndGggPT09IDApIHJ1bGUucmVtb3ZlKCk7XG5cdFx0fSk7XG5cdFx0cmVtb3ZlRW1wdHlBdFJ1bGVzKHJvb3QpO1xuXG5cdFx0cmVzdWx0ID0gcm9vdC50b1N0cmluZygpO1xuXHR9XG5cblx0cmV0dXJuIHsgY3NzOiByZXN1bHQsIHJlbW92ZWQgfTtcbn1cblxuZnVuY3Rpb24gY2xlYW5VbnVzZWRWYXJzKFxuXHRjc3M6IHN0cmluZyxcblx0ZXh0ZXJuYWxseVJlZmVyZW5jZWRWYXJzOiBTZXQ8c3RyaW5nPixcbik6IHN0cmluZyB7XG5cdHJldHVybiBjbGVhblVudXNlZFZhcnNXaXRoUmVwb3J0KGNzcywgZXh0ZXJuYWxseVJlZmVyZW5jZWRWYXJzKS5jc3M7XG59XG5cbi8vIOKUgOKUgCBNaW5pZmljYXRpb246IExpZ2h0bmluZyBDU1Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmZ1bmN0aW9uIG1pbmlmeShjc3M6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IHsgY29kZSB9ID0gdHJhbnNmb3JtKHtcblx0XHRmaWxlbmFtZTogXCJwdXJnZWQuY3NzXCIsXG5cdFx0Y29kZTogQnVmZmVyLmZyb20oY3NzKSxcblx0XHRtaW5pZnk6IHRydWUsXG5cdFx0ZXJyb3JSZWNvdmVyeTogdHJ1ZSxcblx0fSk7XG5cdHJldHVybiBjb2RlLnRvU3RyaW5nKCk7XG59XG5cbi8vIOKUgOKUgCBNYWluIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuXHRjb25zdCB7IGRpc3REaXIsIHNyY0RpciwgbWFuaWZlc3RQYXRoIH0gPSBwYXJzZUFyZ3MocHJvY2Vzcy5hcmd2KTtcblxuXHRjb25zdCBtYW5pZmVzdDogUHVyZ2VNYW5pZmVzdCA9IEpTT04ucGFyc2UoXG5cdFx0YXdhaXQgQnVuLmZpbGUobWFuaWZlc3RQYXRoKS50ZXh0KCksXG5cdCk7XG5cdGNvbnN0IGRhdGFiYXNlID0gbm9ybWFsaXplUHVyZ2VEYXRhYmFzZShtYW5pZmVzdCk7XG5cdGNvbnN0IHJvb3RzID0gbmV3IFNldChPYmplY3Qua2V5cyhkYXRhYmFzZS5jb21wb25lbnRzKS5tYXAocm9vdENvbXBvbmVudCkpO1xuXHRjb25zb2xlLmxvZyhcblx0XHRgW2Nzcy1wdXJnZV0gRGF0YWJhc2UgbG9hZGVkOiAke09iamVjdC5rZXlzKGRhdGFiYXNlLmNvbXBvbmVudHMpLmxlbmd0aH0gcmVjb3JkcyAoJHtyb290cy5zaXplfSBjb21wb25lbnRzKWAsXG5cdCk7XG5cblx0Y29uc3QgdXNhZ2VzID0gYXdhaXQgc2NhbkNvbnN1bWVyU291cmNlKHNyY0Rpcik7XG5cdGNvbnN0IHNhZmVsaXN0cyA9IGJ1aWxkU2FmZWxpc3RzKHVzYWdlcywgbWFuaWZlc3QpO1xuXHRjb25zdCB1c2VkUm9vdHMgPSBuZXcgU2V0KFsuLi5zYWZlbGlzdHMudXNlZENvbXBvbmVudHNdLm1hcChyb290Q29tcG9uZW50KSk7XG5cdGNvbnN0IHJlbW92ZWRSb290cyA9IFsuLi5yb290c10uZmlsdGVyKChyb290KSA9PiAhdXNlZFJvb3RzLmhhcyhyb290KSk7XG5cblx0Y29uc29sZS5sb2coXG5cdFx0YFtjc3MtcHVyZ2VdIENvbXBvbmVudHMgZGV0ZWN0ZWQ6ICR7dXNlZFJvb3RzLnNpemV9IHVzZWQsICR7cmVtb3ZlZFJvb3RzLmxlbmd0aH0gcmVtb3ZhYmxlYCxcblx0KTtcblx0aWYgKHVzZWRSb290cy5zaXplID4gMCkge1xuXHRcdGNvbnNvbGUubG9nKGBbY3NzLXB1cmdlXSAgIHVzZWQ6ICR7Wy4uLnVzZWRSb290c10uc29ydCgpLmpvaW4oXCIsIFwiKX1gKTtcblx0fVxuXHRpZiAocmVtb3ZlZFJvb3RzLmxlbmd0aCA+IDApIHtcblx0XHRjb25zb2xlLmxvZyhgW2Nzcy1wdXJnZV0gICByZW1vdmFibGU6ICR7cmVtb3ZlZFJvb3RzLnNvcnQoKS5qb2luKFwiLCBcIil9YCk7XG5cdH1cblx0Y29uc29sZS5sb2coXG5cdFx0YFtjc3MtcHVyZ2VdIFNhZmVsaXN0IGZhY3RzOiAke3NhZmVsaXN0cy5jbGFzc1NhZmVsaXN0LnNpemV9IGNsYXNzZXMsICR7c2FmZWxpc3RzLmF0dHJTYWZlbGlzdC5zaXplfSBhdHRyIHNlbGVjdG9yc2AsXG5cdCk7XG5cblx0Y29uc3QgcnVudGltZUNzc1ZhclJlZnMgPSBhd2FpdCBjb2xsZWN0UnVudGltZUNzc1ZhclJlZnMoZGlzdERpcik7XG5cdGlmIChydW50aW1lQ3NzVmFyUmVmcy5zaXplID4gMCkge1xuXHRcdGNvbnNvbGUubG9nKFxuXHRcdFx0YFtjc3MtcHVyZ2VdIFJ1bnRpbWUgQ1NTIHZhcnMgcmVmZXJlbmNlZCBmcm9tIEpTOiAke3J1bnRpbWVDc3NWYXJSZWZzLnNpemV9YCxcblx0XHQpO1xuXHR9XG5cblx0Y29uc3QgZ2xvYiA9IG5ldyBHbG9iKFwiKiovKi5jc3NcIik7XG5cdGxldCB0b3RhbEJlZm9yZSA9IDA7XG5cdGxldCB0b3RhbEFmdGVyID0gMDtcblxuXHRmb3IgYXdhaXQgKGNvbnN0IHJlbFBhdGggb2YgZ2xvYi5zY2FuKHsgY3dkOiBkaXN0RGlyIH0pKSB7XG5cdFx0Y29uc3QgZnVsbFBhdGggPSBgJHtkaXN0RGlyfS8ke3JlbFBhdGh9YDtcblx0XHRjb25zdCBvcmlnaW5hbENzcyA9IGF3YWl0IEJ1bi5maWxlKGZ1bGxQYXRoKS50ZXh0KCk7XG5cdFx0Y29uc3Qgb3JpZ2luYWxTaXplID0gQnVmZmVyLmJ5dGVMZW5ndGgob3JpZ2luYWxDc3MsIFwidXRmLThcIik7XG5cdFx0dG90YWxCZWZvcmUgKz0gb3JpZ2luYWxTaXplO1xuXG5cdFx0Y29uc29sZS5sb2coXG5cdFx0XHRgW2Nzcy1wdXJnZV0gUHJvY2Vzc2luZyAke3JlbFBhdGh9ICgkeyhvcmlnaW5hbFNpemUgLyAxMDI0KS50b0ZpeGVkKDEpfSBLQilgLFxuXHRcdCk7XG5cblx0XHRjb25zdCBwdXJnZWQgPSBwdXJnZUNzc1dpdGhEYXRhYmFzZShvcmlnaW5hbENzcywgZGF0YWJhc2UsIHNhZmVsaXN0cyk7XG5cdFx0bGV0IHB1cmdlZENzcyA9IHB1cmdlZC5jc3M7XG5cdFx0Y29uc3QgYWZ0ZXJTZWxlY3RvcnMgPSBCdWZmZXIuYnl0ZUxlbmd0aChwdXJnZWRDc3MsIFwidXRmLThcIik7XG5cdFx0Y29uc29sZS5sb2coXG5cdFx0XHRgW2Nzcy1wdXJnZV0gICBzZWxlY3RvcnM6ICR7KG9yaWdpbmFsU2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSl9IC0+ICR7KGFmdGVyU2VsZWN0b3JzIC8gMTAyNCkudG9GaXhlZCgxKX0gS0IgKCR7cHVyZ2VkLnJlcG9ydC5zZWxlY3RvcnNSZW1vdmVkfSByZW1vdmVkLCAke3B1cmdlZC5yZXBvcnQuc2VsZWN0b3JzS2VwdFVua25vd259IGtlcHQgdW5rbm93bilgLFxuXHRcdCk7XG5cdFx0Y29uc29sZS5sb2coXG5cdFx0XHRgW2Nzcy1wdXJnZV0gICBhdHRycyBzZWVuOiAke3B1cmdlZC5yZXBvcnQuYXR0clNlbGVjdG9yc1NlZW59OyBrZXlmcmFtZXMgcmVtb3ZlZDogJHtwdXJnZWQucmVwb3J0LmtleWZyYW1lc1JlbW92ZWR9YCxcblx0XHQpO1xuXG5cdFx0Y29uc3QgdmFycyA9IGNsZWFuVW51c2VkVmFyc1dpdGhSZXBvcnQocHVyZ2VkQ3NzLCBydW50aW1lQ3NzVmFyUmVmcyk7XG5cdFx0cHVyZ2VkQ3NzID0gdmFycy5jc3M7XG5cdFx0Y29uc3QgYWZ0ZXJWYXJzID0gQnVmZmVyLmJ5dGVMZW5ndGgocHVyZ2VkQ3NzLCBcInV0Zi04XCIpO1xuXHRcdGNvbnNvbGUubG9nKFxuXHRcdFx0YFtjc3MtcHVyZ2VdICAgdmFyczogJHsoYWZ0ZXJTZWxlY3RvcnMgLyAxMDI0KS50b0ZpeGVkKDEpfSAtPiAkeyhhZnRlclZhcnMgLyAxMDI0KS50b0ZpeGVkKDEpfSBLQiAoJHt2YXJzLnJlbW92ZWR9IHJlbW92ZWQpYCxcblx0XHQpO1xuXG5cdFx0cHVyZ2VkQ3NzID0gbWluaWZ5KHB1cmdlZENzcyk7XG5cdFx0Y29uc3QgZmluYWxTaXplID0gQnVmZmVyLmJ5dGVMZW5ndGgocHVyZ2VkQ3NzLCBcInV0Zi04XCIpO1xuXHRcdHRvdGFsQWZ0ZXIgKz0gZmluYWxTaXplO1xuXHRcdGNvbnNvbGUubG9nKGBbY3NzLXB1cmdlXSAgIG1pbmlmeTogLT4gJHsoZmluYWxTaXplIC8gMTAyNCkudG9GaXhlZCgxKX0gS0JgKTtcblx0XHRjb25zb2xlLmxvZyhcblx0XHRcdGBbY3NzLXB1cmdlXSAgIGZpbmFsOiAkeyhvcmlnaW5hbFNpemUgLyAxMDI0KS50b0ZpeGVkKDEpfSAtPiAkeyhmaW5hbFNpemUgLyAxMDI0KS50b0ZpeGVkKDEpfSBLQiAoJHsoKDEgLSBmaW5hbFNpemUgLyBvcmlnaW5hbFNpemUpICogMTAwKS50b0ZpeGVkKDEpfSUgcmVkdWN0aW9uKWAsXG5cdFx0KTtcblxuXHRcdGF3YWl0IEJ1bi53cml0ZShmdWxsUGF0aCwgcHVyZ2VkQ3NzKTtcblx0fVxuXG5cdGNvbnNvbGUubG9nKFxuXHRcdGBcXG5bY3NzLXB1cmdlXSBUb3RhbDogJHsodG90YWxCZWZvcmUgLyAxMDI0KS50b0ZpeGVkKDEpfSAtPiAkeyh0b3RhbEFmdGVyIC8gMTAyNCkudG9GaXhlZCgxKX0gS0IgKCR7KCgxIC0gdG90YWxBZnRlciAvIHRvdGFsQmVmb3JlKSAqIDEwMCkudG9GaXhlZCgxKX0lIHJlZHVjdGlvbilgLFxuXHQpO1xufVxuXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuXHRtYWluKCk7XG59XG5cbmV4cG9ydCB7XG5cdGNsZWFuVW51c2VkVmFycyxcblx0Y2xlYW5VbnVzZWRWYXJzV2l0aFJlcG9ydCxcblx0bm9ybWFsaXplUHVyZ2VEYXRhYmFzZSxcblx0cHVyZ2VDc3NXaXRoRGF0YWJhc2UsXG59O1xuZXhwb3J0IHR5cGUge1xuXHROb3JtYWxpemVkUHVyZ2VEYXRhYmFzZSxcblx0UHVyZ2VSZXN1bHQsXG5cdFNlbGVjdG9yUHVyZ2VSZXBvcnQsXG5cdFZhckNsZWFudXBSZXN1bHQsXG59O1xuIiwKICAgICJpbXBvcnQgaW5kZXggZnJvbSAnLi9pbmRleC5qcyc7XG5cbmNvbnN0IHsgdHJhbnNmb3JtLCB0cmFuc2Zvcm1TdHlsZUF0dHJpYnV0ZSwgYnVuZGxlLCBidW5kbGVBc3luYywgYnJvd3NlcnNsaXN0VG9UYXJnZXRzLCBjb21wb3NlVmlzaXRvcnMsIEZlYXR1cmVzIH0gPSBpbmRleDtcbmV4cG9ydCB7IHRyYW5zZm9ybSwgdHJhbnNmb3JtU3R5bGVBdHRyaWJ1dGUsIGJ1bmRsZSwgYnVuZGxlQXN5bmMsIGJyb3dzZXJzbGlzdFRvVGFyZ2V0cywgY29tcG9zZVZpc2l0b3JzLCBGZWF0dXJlcyB9O1xuIiwKICAgICIvKipcbiAqIENvbnN1bWVyLXNpZGUgSlNYIHNjYW5uZXIuXG4gKlxuICogV2Fsa3MgYSBjb25zdW1lciBzb3VyY2UgdHJlZSwgcmVzb2x2ZXMgQHBhdGhzY2FsZS91aSBpbXBvcnRzIHdpdGggU1dDLCBhbmRcbiAqIHJlY29yZHMgY2Fub25pY2FsIGNvbXBvbmVudC9wYXJ0IHVzYWdlIHBsdXMgcHJvcCBmYWN0cyBmb3IgZGF0YWJhc2UtZmlyc3QgQ1NTXG4gKiBwdXJnZSBkZWNpc2lvbnMuXG4gKlxuICogVXNhZ2U6ICBidW4gcnVuIHNyYy9zY2FuLWNvbnN1bWVyLnRzIDxjb25zdW1lci1zcmMtZGlyPiA8cHVyZ2UtbWFuaWZlc3QuanNvbj5cbiAqL1xuXG5pbXBvcnQgc3djIGZyb20gXCJAc3djL2NvcmVcIjtcbmltcG9ydCB7IEdsb2IgfSBmcm9tIFwiYnVuXCI7XG5cbi8vIOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIExlZ2FjeUNvbXBvbmVudE1hbmlmZXN0IHtcblx0Y2xhc3Nlczoge1xuXHRcdGFsd2F5czogc3RyaW5nW107XG5cdFx0YnlQcm9wOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPj47XG5cdH07XG5cdGF0dHJzPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cdGRlcHM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIENvbXBvbmVudFB1cmdlUmVjb3JkIGV4dGVuZHMgTGVnYWN5Q29tcG9uZW50TWFuaWZlc3Qge1xuXHRrZXk/OiBzdHJpbmc7XG5cdGNvbXBvbmVudD86IHN0cmluZztcblx0cGFydD86IHN0cmluZztcblx0c2VsZWN0b3JzPzogc3RyaW5nW107XG5cdGF0dHJpYnV0ZVNlbGVjdG9ycz86IHN0cmluZ1tdO1xuXHRjc3NWYXJzPzoge1xuXHRcdGRlY2xhcmVkPzogc3RyaW5nW107XG5cdFx0cmVmZXJlbmNlZD86IHN0cmluZ1tdO1xuXHR9O1xuXHRrZXlmcmFtZXM/OiB7XG5cdFx0ZGVjbGFyZWQ/OiBzdHJpbmdbXTtcblx0XHRyZWZlcmVuY2VkPzogc3RyaW5nW107XG5cdH07XG59XG5cbmludGVyZmFjZSBQdXJnZURhdGFiYXNlVjIge1xuXHR2ZXJzaW9uOiAyO1xuXHRjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBDb21wb25lbnRQdXJnZVJlY29yZD47XG5cdHNoYXJlZD86IHtcblx0XHRzZWxlY3RvcnM/OiB1bmtub3duW107XG5cdFx0Y3NzVmFycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdGtleWZyYW1lcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHR9O1xufVxuXG50eXBlIFB1cmdlTWFuaWZlc3QgPSBSZWNvcmQ8c3RyaW5nLCBMZWdhY3lDb21wb25lbnRNYW5pZmVzdD4gfCBQdXJnZURhdGFiYXNlVjI7XG5cbi8qKiBXaGF0IHdlIGNvbGxlY3QgcGVyIGNvbXBvbmVudCB1c2FnZSBmcm9tIEpTWCAqL1xuaW50ZXJmYWNlIFByb3BVc2FnZSB7XG5cdGNvbXBvbmVudDogc3RyaW5nO1xuXHRwcm9wczogTWFwPHN0cmluZywgc3RyaW5nIHwgXCJEWU5BTUlDXCI+O1xuXHRib29sZWFuUHJvcHM6IFNldDxzdHJpbmc+O1xuXHRoYXNTcHJlYWQ6IGJvb2xlYW47XG5cdHNvdXJjZT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEltcG9ydEJpbmRpbmdzIHtcblx0Y29tcG9uZW50czogTWFwPHN0cmluZywgc3RyaW5nPjtcblx0bmFtZXNwYWNlczogTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD47XG5cdGNvbnNlcnZhdGl2ZVVzYWdlczogUHJvcFVzYWdlW107XG59XG5cbmludGVyZmFjZSBTYWZlbGlzdHMge1xuXHRjbGFzc1NhZmVsaXN0OiBTZXQ8c3RyaW5nPjtcblx0YXR0clNhZmVsaXN0OiBTZXQ8c3RyaW5nPjtcblx0dXNlZENvbXBvbmVudHM6IFNldDxzdHJpbmc+O1xuXHRkeW5hbWljQ29tcG9uZW50czogU2V0PHN0cmluZz47XG59XG5cbnR5cGUgQXN0Tm9kZSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vLyDilIDilIAgQVNUIHdhbGtlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gd2Fsa0FTVChub2RlOiB1bmtub3duLCB2aXNpdG9yOiAobm9kZTogQXN0Tm9kZSkgPT4gdm9pZCkge1xuXHRpZiAoIWlzUmVjb3JkKG5vZGUpKSByZXR1cm47XG5cdHZpc2l0b3Iobm9kZSk7XG5cdGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG5vZGUpKSB7XG5cdFx0aWYgKGtleSA9PT0gXCJzcGFuXCIpIGNvbnRpbnVlO1xuXHRcdGNvbnN0IHZhbCA9IG5vZGVba2V5XTtcblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsKSB3YWxrQVNUKGl0ZW0sIHZpc2l0b3IpO1xuXHRcdH0gZWxzZSBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdHdhbGtBU1QodmFsLCB2aXNpdG9yKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24ga2ViYWJUb1Bhc2NhbChzOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gc1xuXHRcdC5zcGxpdChcIi1cIilcblx0XHQuZmlsdGVyKEJvb2xlYW4pXG5cdFx0Lm1hcCgocCkgPT4gcC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHAuc2xpY2UoMSkpXG5cdFx0LmpvaW4oXCJcIik7XG59XG5cbmZ1bmN0aW9uIGNvbXBvbmVudEZyb21EZWVwSW1wb3J0KHNvdXJjZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG5cdGNvbnN0IG1hdGNoID0gc291cmNlLm1hdGNoKC9eQHBhdGhzY2FsZVxcL3VpXFwvY29tcG9uZW50c1xcLyhbXi9dKykvKTtcblx0aWYgKCFtYXRjaCkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBrZWJhYlRvUGFzY2FsKG1hdGNoWzFdKTtcbn1cblxuZnVuY3Rpb24gaXNVaUltcG9ydChzb3VyY2U6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHNvdXJjZSBpcyBzdHJpbmcge1xuXHRyZXR1cm4gQm9vbGVhbihzb3VyY2U/LnN0YXJ0c1dpdGgoXCJAcGF0aHNjYWxlL3VpXCIpKTtcbn1cblxuZnVuY3Rpb24gaXNSZWNvcmQodjogdW5rbm93bik6IHYgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuXHRyZXR1cm4gdiAhPT0gbnVsbCAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2KTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RyaW5nKHZhbHVlOiB1bmtub3duLCBrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRjb25zdCBwcm9wID0gdmFsdWVba2V5XTtcblx0cmV0dXJuIHR5cGVvZiBwcm9wID09PSBcInN0cmluZ1wiID8gcHJvcCA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0Qm9vbGVhbih2YWx1ZTogdW5rbm93biwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHZhbHVlW2tleV0gPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldFBhdGhTdHJpbmcodmFsdWU6IHVua25vd24sIC4uLmtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0bGV0IGN1cnJlbnQgPSB2YWx1ZTtcblx0Zm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuXHRcdGlmICghaXNSZWNvcmQoY3VycmVudCkpIHJldHVybiB1bmRlZmluZWQ7XG5cdFx0Y3VycmVudCA9IGN1cnJlbnRba2V5XTtcblx0fVxuXHRyZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09IFwic3RyaW5nXCIgPyBjdXJyZW50IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRBcnJheSh2YWx1ZTogdW5rbm93biwga2V5OiBzdHJpbmcpOiB1bmtub3duW10ge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIFtdO1xuXHRjb25zdCBwcm9wID0gdmFsdWVba2V5XTtcblx0cmV0dXJuIEFycmF5LmlzQXJyYXkocHJvcCkgPyBwcm9wIDogW107XG59XG5cbmZ1bmN0aW9uIGpvaW5QYXRoKGJhc2U6IHN0cmluZywgcmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gYCR7YmFzZS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpfS8ke3JlbC5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpfWA7XG59XG5cbmZ1bmN0aW9uIGNhbm9uaWNhbEltcG9ydGVkTmFtZShzcGVjOiB1bmtub3duLCBzb3VyY2U6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuXHRjb25zdCB0eXBlID0gZ2V0U3RyaW5nKHNwZWMsIFwidHlwZVwiKTtcblx0aWYgKGdldEJvb2xlYW4oc3BlYywgXCJpc1R5cGVPbmx5XCIpKSByZXR1cm4gbnVsbDtcblx0Y29uc3QgZGVlcENvbXBvbmVudCA9IGNvbXBvbmVudEZyb21EZWVwSW1wb3J0KHNvdXJjZSk7XG5cdGlmIChkZWVwQ29tcG9uZW50KSB7XG5cdFx0cmV0dXJuIGRlZXBDb21wb25lbnQ7XG5cdH1cblxuXHRpZiAoc291cmNlID09PSBcIkBwYXRoc2NhbGUvdWlcIiAmJiB0eXBlID09PSBcIkltcG9ydFNwZWNpZmllclwiKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdGdldFBhdGhTdHJpbmcoc3BlYywgXCJpbXBvcnRlZFwiLCBcInZhbHVlXCIpID8/XG5cdFx0XHRnZXRQYXRoU3RyaW5nKHNwZWMsIFwibG9jYWxcIiwgXCJ2YWx1ZVwiKSA/P1xuXHRcdFx0bnVsbFxuXHRcdCk7XG5cdH1cblxuXHRyZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gY29uc2VydmF0aXZlVXNhZ2UoY29tcG9uZW50OiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nKTogUHJvcFVzYWdlIHtcblx0cmV0dXJuIHtcblx0XHRjb21wb25lbnQsXG5cdFx0cHJvcHM6IG5ldyBNYXAoKSxcblx0XHRib29sZWFuUHJvcHM6IG5ldyBTZXQoKSxcblx0XHRoYXNTcHJlYWQ6IHRydWUsXG5cdFx0c291cmNlLFxuXHR9O1xufVxuXG4vKiogRXh0cmFjdCBAcGF0aHNjYWxlL3VpIGJpbmRpbmdzIGZyb20gYSBwYXJzZWQgbW9kdWxlLiAqL1xuZnVuY3Rpb24gZXh0cmFjdFVJQmluZGluZ3MoYXN0OiB1bmtub3duKTogSW1wb3J0QmluZGluZ3Mge1xuXHRjb25zdCBiaW5kaW5nczogSW1wb3J0QmluZGluZ3MgPSB7XG5cdFx0Y29tcG9uZW50czogbmV3IE1hcCgpLFxuXHRcdG5hbWVzcGFjZXM6IG5ldyBNYXAoKSxcblx0XHRjb25zZXJ2YXRpdmVVc2FnZXM6IFtdLFxuXHR9O1xuXG5cdGZvciAoY29uc3Qgbm9kZSBvZiBnZXRBcnJheShhc3QsIFwiYm9keVwiKSkge1xuXHRcdGNvbnN0IG5vZGVUeXBlID0gZ2V0U3RyaW5nKG5vZGUsIFwidHlwZVwiKTtcblx0XHRpZiAobm9kZVR5cGUgPT09IFwiSW1wb3J0RGVjbGFyYXRpb25cIikge1xuXHRcdFx0Y29uc3Qgc291cmNlID0gZ2V0UGF0aFN0cmluZyhub2RlLCBcInNvdXJjZVwiLCBcInZhbHVlXCIpO1xuXHRcdFx0aWYgKCFpc1VpSW1wb3J0KHNvdXJjZSkpIGNvbnRpbnVlO1xuXG5cdFx0XHRmb3IgKGNvbnN0IHNwZWMgb2YgZ2V0QXJyYXkobm9kZSwgXCJzcGVjaWZpZXJzXCIpKSB7XG5cdFx0XHRcdGNvbnN0IHNwZWNUeXBlID0gZ2V0U3RyaW5nKHNwZWMsIFwidHlwZVwiKTtcblx0XHRcdFx0aWYgKHNwZWNUeXBlID09PSBcIkltcG9ydFNwZWNpZmllclwiKSB7XG5cdFx0XHRcdFx0Y29uc3QgbG9jYWwgPSBnZXRQYXRoU3RyaW5nKHNwZWMsIFwibG9jYWxcIiwgXCJ2YWx1ZVwiKTtcblx0XHRcdFx0XHRjb25zdCBjYW5vbmljYWwgPSBjYW5vbmljYWxJbXBvcnRlZE5hbWUoc3BlYywgc291cmNlKTtcblx0XHRcdFx0XHRpZiAobG9jYWwgJiYgY2Fub25pY2FsKSBiaW5kaW5ncy5jb21wb25lbnRzLnNldChsb2NhbCwgY2Fub25pY2FsKTtcblx0XHRcdFx0fSBlbHNlIGlmIChzcGVjVHlwZSA9PT0gXCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyXCIpIHtcblx0XHRcdFx0XHRjb25zdCBsb2NhbCA9IGdldFBhdGhTdHJpbmcoc3BlYywgXCJsb2NhbFwiLCBcInZhbHVlXCIpO1xuXHRcdFx0XHRcdGNvbnN0IGNhbm9uaWNhbCA9IGNvbXBvbmVudEZyb21EZWVwSW1wb3J0KHNvdXJjZSkgPz8gbG9jYWw7XG5cdFx0XHRcdFx0aWYgKGxvY2FsICYmIGNhbm9uaWNhbCkgYmluZGluZ3MuY29tcG9uZW50cy5zZXQobG9jYWwsIGNhbm9uaWNhbCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc3BlY1R5cGUgPT09IFwiSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIpIHtcblx0XHRcdFx0XHRjb25zdCBsb2NhbCA9IGdldFBhdGhTdHJpbmcoc3BlYywgXCJsb2NhbFwiLCBcInZhbHVlXCIpO1xuXHRcdFx0XHRcdGlmIChsb2NhbClcblx0XHRcdFx0XHRcdGJpbmRpbmdzLm5hbWVzcGFjZXMuc2V0KGxvY2FsLCBjb21wb25lbnRGcm9tRGVlcEltcG9ydChzb3VyY2UpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdG5vZGVUeXBlID09PSBcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIiAmJlxuXHRcdFx0aXNVaUltcG9ydChnZXRQYXRoU3RyaW5nKG5vZGUsIFwic291cmNlXCIsIFwidmFsdWVcIikpXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBzb3VyY2UgPSBnZXRQYXRoU3RyaW5nKG5vZGUsIFwic291cmNlXCIsIFwidmFsdWVcIik7XG5cdFx0XHRpZiAoIXNvdXJjZSkgY29udGludWU7XG5cdFx0XHRjb25zdCBkZWVwQ29tcG9uZW50ID0gY29tcG9uZW50RnJvbURlZXBJbXBvcnQoc291cmNlKTtcblx0XHRcdGZvciAoY29uc3Qgc3BlYyBvZiBnZXRBcnJheShub2RlLCBcInNwZWNpZmllcnNcIikpIHtcblx0XHRcdFx0Y29uc3QgZXhwb3J0ZWQgPVxuXHRcdFx0XHRcdGdldFBhdGhTdHJpbmcoc3BlYywgXCJvcmlnXCIsIFwidmFsdWVcIikgPz9cblx0XHRcdFx0XHRnZXRQYXRoU3RyaW5nKHNwZWMsIFwibG9jYWxcIiwgXCJ2YWx1ZVwiKSA/P1xuXHRcdFx0XHRcdGdldFBhdGhTdHJpbmcoc3BlYywgXCJleHBvcnRlZFwiLCBcInZhbHVlXCIpID8/XG5cdFx0XHRcdFx0ZGVlcENvbXBvbmVudDtcblx0XHRcdFx0Y29uc3QgY2Fub25pY2FsID0gZGVlcENvbXBvbmVudCA/PyBleHBvcnRlZDtcblx0XHRcdFx0aWYgKGNhbm9uaWNhbClcblx0XHRcdFx0XHRiaW5kaW5ncy5jb25zZXJ2YXRpdmVVc2FnZXMucHVzaChcblx0XHRcdFx0XHRcdGNvbnNlcnZhdGl2ZVVzYWdlKGNhbm9uaWNhbCwgc291cmNlKSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdG5vZGVUeXBlID09PSBcIkV4cG9ydEFsbERlY2xhcmF0aW9uXCIgJiZcblx0XHRcdGlzVWlJbXBvcnQoZ2V0UGF0aFN0cmluZyhub2RlLCBcInNvdXJjZVwiLCBcInZhbHVlXCIpKVxuXHRcdCkge1xuXHRcdFx0Y29uc3Qgc291cmNlID0gZ2V0UGF0aFN0cmluZyhub2RlLCBcInNvdXJjZVwiLCBcInZhbHVlXCIpO1xuXHRcdFx0aWYgKCFzb3VyY2UpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3QgZGVlcENvbXBvbmVudCA9IGNvbXBvbmVudEZyb21EZWVwSW1wb3J0KHNvdXJjZSk7XG5cdFx0XHRpZiAoZGVlcENvbXBvbmVudCkge1xuXHRcdFx0XHRiaW5kaW5ncy5jb25zZXJ2YXRpdmVVc2FnZXMucHVzaChcblx0XHRcdFx0XHRjb25zZXJ2YXRpdmVVc2FnZShkZWVwQ29tcG9uZW50LCBzb3VyY2UpLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBiaW5kaW5ncztcbn1cblxuLyoqIEJhY2stY29tcGF0aWJsZSBpbXBvcnQgZXh0cmFjdGlvbiBBUEk6IGxvY2FsIGJpbmRpbmcgLT4gY2Fub25pY2FsIGNvbXBvbmVudC4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RVSUltcG9ydHMoYXN0OiB1bmtub3duKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG5cdHJldHVybiBleHRyYWN0VUlCaW5kaW5ncyhhc3QpLmNvbXBvbmVudHM7XG59XG5cbmZ1bmN0aW9uIGpzeE5hbWVQYXJ0cyhuYW1lOiB1bmtub3duKTogc3RyaW5nW10ge1xuXHRpZiAoIW5hbWUpIHJldHVybiBbXTtcblx0Y29uc3QgdHlwZSA9IGdldFN0cmluZyhuYW1lLCBcInR5cGVcIik7XG5cdGNvbnN0IHZhbHVlID0gZ2V0U3RyaW5nKG5hbWUsIFwidmFsdWVcIik7XG5cdGlmICgodHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgfHwgdHlwZSA9PT0gXCJKU1hJZGVudGlmaWVyXCIpICYmIHZhbHVlKVxuXHRcdHJldHVybiBbdmFsdWVdO1xuXHRpZiAodHlwZSA9PT0gXCJKU1hNZW1iZXJFeHByZXNzaW9uXCIpIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0Li4uanN4TmFtZVBhcnRzKGlzUmVjb3JkKG5hbWUpID8gbmFtZS5vYmplY3QgOiB1bmRlZmluZWQpLFxuXHRcdFx0Li4uanN4TmFtZVBhcnRzKGlzUmVjb3JkKG5hbWUpID8gbmFtZS5wcm9wZXJ0eSA6IHVuZGVmaW5lZCksXG5cdFx0XTtcblx0fVxuXHRyZXR1cm4gW107XG59XG5cbmZ1bmN0aW9uIGNhbm9uaWNhbENvbXBvbmVudEZyb21Kc3goXG5cdHBhcnRzOiBzdHJpbmdbXSxcblx0YmluZGluZ3M6IEltcG9ydEJpbmRpbmdzLFxuKTogc3RyaW5nIHwgbnVsbCB7XG5cdGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXHRjb25zdCBbcm9vdCwgLi4ubWVtYmVyc10gPSBwYXJ0cztcblxuXHRjb25zdCBuYW1lc3BhY2VDb21wb25lbnQgPSBiaW5kaW5ncy5uYW1lc3BhY2VzLmdldChyb290KTtcblx0aWYgKGJpbmRpbmdzLm5hbWVzcGFjZXMuaGFzKHJvb3QpKSB7XG5cdFx0aWYgKG5hbWVzcGFjZUNvbXBvbmVudCkge1xuXHRcdFx0cmV0dXJuIFtuYW1lc3BhY2VDb21wb25lbnQsIC4uLm1lbWJlcnNdLmpvaW4oXCIuXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gbWVtYmVycy5qb2luKFwiLlwiKSB8fCBudWxsO1xuXHR9XG5cblx0Y29uc3Qgcm9vdENvbXBvbmVudCA9IGJpbmRpbmdzLmNvbXBvbmVudHMuZ2V0KHJvb3QpO1xuXHRpZiAoIXJvb3RDb21wb25lbnQpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gW3Jvb3RDb21wb25lbnQsIC4uLm1lbWJlcnNdLmpvaW4oXCIuXCIpO1xufVxuXG4vKiogRXh0cmFjdCBKU1ggdXNhZ2VzIG9mIFVJIGNvbXBvbmVudHMuICovXG5mdW5jdGlvbiBleHRyYWN0SlNYVXNhZ2VzKFxuXHRhc3Q6IHVua25vd24sXG5cdHVpQ29tcG9uZW50czogTWFwPHN0cmluZywgc3RyaW5nPixcbik6IFByb3BVc2FnZVtdIHtcblx0Y29uc3QgYmluZGluZ3M6IEltcG9ydEJpbmRpbmdzID0ge1xuXHRcdGNvbXBvbmVudHM6IHVpQ29tcG9uZW50cyxcblx0XHRuYW1lc3BhY2VzOiBleHRyYWN0VUlCaW5kaW5ncyhhc3QpLm5hbWVzcGFjZXMsXG5cdFx0Y29uc2VydmF0aXZlVXNhZ2VzOiBbXSxcblx0fTtcblx0Y29uc3QgdXNhZ2VzOiBQcm9wVXNhZ2VbXSA9IFtdO1xuXG5cdHdhbGtBU1QoYXN0LCAobm9kZSkgPT4ge1xuXHRcdGlmIChnZXRTdHJpbmcobm9kZSwgXCJ0eXBlXCIpICE9PSBcIkpTWE9wZW5pbmdFbGVtZW50XCIpIHJldHVybjtcblxuXHRcdGNvbnN0IGNvbXBvbmVudCA9IGNhbm9uaWNhbENvbXBvbmVudEZyb21Kc3goXG5cdFx0XHRqc3hOYW1lUGFydHMobm9kZS5uYW1lKSxcblx0XHRcdGJpbmRpbmdzLFxuXHRcdCk7XG5cdFx0aWYgKCFjb21wb25lbnQpIHJldHVybjtcblxuXHRcdGNvbnN0IHVzYWdlOiBQcm9wVXNhZ2UgPSB7XG5cdFx0XHRjb21wb25lbnQsXG5cdFx0XHRwcm9wczogbmV3IE1hcCgpLFxuXHRcdFx0Ym9vbGVhblByb3BzOiBuZXcgU2V0KCksXG5cdFx0XHRoYXNTcHJlYWQ6IGZhbHNlLFxuXHRcdH07XG5cblx0XHRmb3IgKGNvbnN0IGF0dHIgb2YgZ2V0QXJyYXkobm9kZSwgXCJhdHRyaWJ1dGVzXCIpKSB7XG5cdFx0XHRjb25zdCBhdHRyVHlwZSA9IGdldFN0cmluZyhhdHRyLCBcInR5cGVcIik7XG5cdFx0XHRpZiAoYXR0clR5cGUgPT09IFwiU3ByZWFkRWxlbWVudFwiIHx8IGF0dHJUeXBlID09PSBcIkpTWFNwcmVhZEF0dHJpYnV0ZVwiKSB7XG5cdFx0XHRcdHVzYWdlLmhhc1NwcmVhZCA9IHRydWU7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGF0dHJUeXBlICE9PSBcIkpTWEF0dHJpYnV0ZVwiKSBjb250aW51ZTtcblxuXHRcdFx0Y29uc3QgcHJvcE5hbWUgPSBnZXRQYXRoU3RyaW5nKGF0dHIsIFwibmFtZVwiLCBcInZhbHVlXCIpO1xuXHRcdFx0aWYgKCFwcm9wTmFtZSkgY29udGludWU7XG5cblx0XHRcdGNvbnN0IGF0dHJWYWx1ZSA9IGlzUmVjb3JkKGF0dHIpID8gYXR0ci52YWx1ZSA6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGF0dHJWYWx1ZVR5cGUgPSBnZXRTdHJpbmcoYXR0clZhbHVlLCBcInR5cGVcIik7XG5cdFx0XHRpZiAoIWF0dHJWYWx1ZSkge1xuXHRcdFx0XHR1c2FnZS5ib29sZWFuUHJvcHMuYWRkKHByb3BOYW1lKTtcblx0XHRcdH0gZWxzZSBpZiAoYXR0clZhbHVlVHlwZSA9PT0gXCJTdHJpbmdMaXRlcmFsXCIpIHtcblx0XHRcdFx0dXNhZ2UucHJvcHMuc2V0KHByb3BOYW1lLCBnZXRTdHJpbmcoYXR0clZhbHVlLCBcInZhbHVlXCIpID8/IFwiXCIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dXNhZ2UucHJvcHMuc2V0KHByb3BOYW1lLCBcIkRZTkFNSUNcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dXNhZ2VzLnB1c2godXNhZ2UpO1xuXHR9KTtcblxuXHRyZXR1cm4gdXNhZ2VzO1xufVxuXG4vLyDilIDilIAgTWFuaWZlc3QgY29tcGF0aWJpbGl0eSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gbWFuaWZlc3RDb21wb25lbnRzKFxuXHRtYW5pZmVzdDogUHVyZ2VNYW5pZmVzdCxcbik6IFJlY29yZDxzdHJpbmcsIExlZ2FjeUNvbXBvbmVudE1hbmlmZXN0PiB7XG5cdGlmIChpc1B1cmdlRGF0YWJhc2VWMihtYW5pZmVzdCkpIHtcblx0XHRyZXR1cm4gbWFuaWZlc3QuY29tcG9uZW50cztcblx0fVxuXHRyZXR1cm4gbWFuaWZlc3QgYXMgUmVjb3JkPHN0cmluZywgTGVnYWN5Q29tcG9uZW50TWFuaWZlc3Q+O1xufVxuXG5mdW5jdGlvbiBpc1B1cmdlRGF0YWJhc2VWMihcblx0bWFuaWZlc3Q6IFB1cmdlTWFuaWZlc3QsXG4pOiBtYW5pZmVzdCBpcyBQdXJnZURhdGFiYXNlVjIge1xuXHRyZXR1cm4gKFxuXHRcdChtYW5pZmVzdCBhcyBQdXJnZURhdGFiYXNlVjIpLnZlcnNpb24gPT09IDIgJiZcblx0XHRpc1JlY29yZCgobWFuaWZlc3QgYXMgUHVyZ2VEYXRhYmFzZVYyKS5jb21wb25lbnRzKVxuXHQpO1xufVxuXG4vLyDilIDilIAgU2FmZWxpc3QgYnVpbGRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gYnVpbGRTYWZlbGlzdHMoXG5cdGFsbFVzYWdlczogUHJvcFVzYWdlW10sXG5cdG1hbmlmZXN0OiBQdXJnZU1hbmlmZXN0LFxuKTogU2FmZWxpc3RzIHtcblx0Y29uc3QgY2xhc3NTYWZlbGlzdCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRjb25zdCBhdHRyU2FmZWxpc3QgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0Y29uc3QgdXNlZENvbXBvbmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0Y29uc3QgZHluYW1pY0NvbXBvbmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0Y29uc3QgY29tcG9uZW50VXNhZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFByb3BVc2FnZVtdPigpO1xuXHRjb25zdCBjb21wb25lbnRzID0gbWFuaWZlc3RDb21wb25lbnRzKG1hbmlmZXN0KTtcblxuXHRmb3IgKGNvbnN0IHVzYWdlIG9mIGV4cGFuZERlcGVuZGVuY3lVc2FnZXMoYWxsVXNhZ2VzLCBjb21wb25lbnRzKSkge1xuXHRcdGNvbnN0IGV4aXN0aW5nID0gY29tcG9uZW50VXNhZ2VzLmdldCh1c2FnZS5jb21wb25lbnQpID8/IFtdO1xuXHRcdGV4aXN0aW5nLnB1c2godXNhZ2UpO1xuXHRcdGNvbXBvbmVudFVzYWdlcy5zZXQodXNhZ2UuY29tcG9uZW50LCBleGlzdGluZyk7XG5cdFx0dXNlZENvbXBvbmVudHMuYWRkKHVzYWdlLmNvbXBvbmVudCk7XG5cdFx0aWYgKHVzYWdlLmhhc1NwcmVhZCB8fCBbLi4udXNhZ2UucHJvcHMudmFsdWVzKCldLmluY2x1ZGVzKFwiRFlOQU1JQ1wiKSkge1xuXHRcdFx0ZHluYW1pY0NvbXBvbmVudHMuYWRkKHVzYWdlLmNvbXBvbmVudCk7XG5cdFx0fVxuXHR9XG5cblx0Zm9yIChjb25zdCBbZW50cnlOYW1lLCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoY29tcG9uZW50cykpIHtcblx0XHRjb25zdCBtYXRjaGluZ1VzYWdlcyA9IGZpbmRNYXRjaGluZ1VzYWdlcyhlbnRyeU5hbWUsIGNvbXBvbmVudFVzYWdlcyk7XG5cdFx0aWYgKG1hdGNoaW5nVXNhZ2VzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cblx0XHR1c2VkQ29tcG9uZW50cy5hZGQoZW50cnlOYW1lKTtcblxuXHRcdGZvciAoY29uc3QgY2xzIG9mIGVudHJ5LmNsYXNzZXMuYWx3YXlzKSB7XG5cdFx0XHRjbGFzc1NhZmVsaXN0LmFkZChjbHMpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgW3Byb3BPclNsb3QsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnRyeS5jbGFzc2VzLmJ5UHJvcCkpIHtcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0XHRpZiAoaXNQcm9wVXNlZChwcm9wT3JTbG90LCBtYXRjaGluZ1VzYWdlcykpIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGNscyBvZiB2YWx1ZSkgY2xhc3NTYWZlbGlzdC5hZGQoY2xzKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgdXNlZFZhbHVlcyA9IGdldFVzZWRFbnVtVmFsdWVzKHByb3BPclNsb3QsIG1hdGNoaW5nVXNhZ2VzKTtcblx0XHRcdFx0aWYgKHVzZWRWYWx1ZXMgPT09IFwiQUxMXCIpIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGNsYXNzZXMgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIHtcblx0XHRcdFx0XHRcdGZvciAoY29uc3QgY2xzIG9mIGNsYXNzZXMpIGNsYXNzU2FmZWxpc3QuYWRkKGNscyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZvciAoY29uc3QgdmFsIG9mIHVzZWRWYWx1ZXMpIHtcblx0XHRcdFx0XHRcdGlmICh2YWx1ZVt2YWxdKSB7XG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgY2xzIG9mIHZhbHVlW3ZhbF0pIGNsYXNzU2FmZWxpc3QuYWRkKGNscyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGVudHJ5LmF0dHJzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IFtwcm9wTmFtZSwgYXR0ck1hcF0gb2YgT2JqZWN0LmVudHJpZXMoZW50cnkuYXR0cnMpKSB7XG5cdFx0XHRcdGlmIChpc1Byb3BVc2VkKHByb3BOYW1lLCBtYXRjaGluZ1VzYWdlcykpIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IFthdHRyLCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJNYXApKSB7XG5cdFx0XHRcdFx0XHRhdHRyU2FmZWxpc3QuYWRkKGBbJHthdHRyfT1cIiR7dmFsfVwiXWApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7IGNsYXNzU2FmZWxpc3QsIGF0dHJTYWZlbGlzdCwgdXNlZENvbXBvbmVudHMsIGR5bmFtaWNDb21wb25lbnRzIH07XG59XG5cbmZ1bmN0aW9uIGV4cGFuZERlcGVuZGVuY3lVc2FnZXMoXG5cdGFsbFVzYWdlczogUHJvcFVzYWdlW10sXG5cdG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCBMZWdhY3lDb21wb25lbnRNYW5pZmVzdD4sXG4pOiBQcm9wVXNhZ2VbXSB7XG5cdGNvbnN0IHJlc3VsdCA9IFsuLi5hbGxVc2FnZXNdO1xuXHRjb25zdCBxdWV1ZSA9IFsuLi5hbGxVc2FnZXMubWFwKCh1c2FnZSkgPT4gcm9vdENvbXBvbmVudCh1c2FnZS5jb21wb25lbnQpKV07XG5cdGNvbnN0IHNlZW4gPSBuZXcgU2V0KHF1ZXVlKTtcblxuXHR3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IHJvb3QgPSBxdWV1ZS5wb3AoKTtcblx0XHRpZiAoIXJvb3QpIGNvbnRpbnVlO1xuXHRcdGNvbnN0IGRlcHMgPSBkZXBzRm9yUm9vdChyb290LCBtYW5pZmVzdCk7XG5cdFx0Zm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuXHRcdFx0aWYgKHNlZW4uaGFzKGRlcCkpIGNvbnRpbnVlO1xuXHRcdFx0c2Vlbi5hZGQoZGVwKTtcblx0XHRcdHF1ZXVlLnB1c2goZGVwKTtcblx0XHRcdHJlc3VsdC5wdXNoKGNvbnNlcnZhdGl2ZVVzYWdlKGRlcCwgXCJtYW5pZmVzdC1kZXBlbmRlbmN5XCIpKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBkZXBzRm9yUm9vdChcblx0cm9vdDogc3RyaW5nLFxuXHRtYW5pZmVzdDogUmVjb3JkPHN0cmluZywgTGVnYWN5Q29tcG9uZW50TWFuaWZlc3Q+LFxuKTogc3RyaW5nW10ge1xuXHRjb25zdCBkZXBzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cdGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKG1hbmlmZXN0KSkge1xuXHRcdGlmIChyb290Q29tcG9uZW50KGtleSkgIT09IHJvb3QpIGNvbnRpbnVlO1xuXHRcdGZvciAoY29uc3QgZGVwIG9mIGVudHJ5LmRlcHMgPz8gW10pIGRlcHMuYWRkKGRlcCk7XG5cdH1cblx0cmV0dXJuIFsuLi5kZXBzXTtcbn1cblxuZnVuY3Rpb24gcm9vdENvbXBvbmVudChjb21wb25lbnQ6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiBjb21wb25lbnQuc3BsaXQoXCIuXCIpWzBdO1xufVxuXG5mdW5jdGlvbiBmaW5kTWF0Y2hpbmdVc2FnZXMoXG5cdGVudHJ5TmFtZTogc3RyaW5nLFxuXHR1c2FnZU1hcDogTWFwPHN0cmluZywgUHJvcFVzYWdlW10+LFxuKTogUHJvcFVzYWdlW10ge1xuXHRjb25zdCBkaXJlY3QgPSB1c2FnZU1hcC5nZXQoZW50cnlOYW1lKSA/PyBbXTtcblx0Y29uc3QgcmVzdWx0cyA9IFsuLi5kaXJlY3RdO1xuXHRjb25zdCBlbnRyeVJvb3QgPSByb290Q29tcG9uZW50KGVudHJ5TmFtZSk7XG5cblx0Zm9yIChjb25zdCBbdXNhZ2VOYW1lLCB1c2FnZXNdIG9mIHVzYWdlTWFwKSB7XG5cdFx0aWYgKHVzYWdlTmFtZSA9PT0gZW50cnlOYW1lKSBjb250aW51ZTtcblx0XHRpZiAoIWVudHJ5TmFtZS5pbmNsdWRlcyhcIi5cIikgJiYgcm9vdENvbXBvbmVudCh1c2FnZU5hbWUpID09PSBlbnRyeU5hbWUpIHtcblx0XHRcdHJlc3VsdHMucHVzaChcblx0XHRcdFx0Li4udXNhZ2VzLm1hcCgodXNhZ2UpID0+ICh7XG5cdFx0XHRcdFx0Li4udXNhZ2UsXG5cdFx0XHRcdFx0Y29tcG9uZW50OiBlbnRyeU5hbWUsXG5cdFx0XHRcdFx0cHJvcHM6IG5ldyBNYXAoWy4uLnVzYWdlLnByb3BzLCBbXCJzbG90XCIsIFwiRFlOQU1JQ1wiXV0pLFxuXHRcdFx0XHR9KSksXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRpZiAoXG5cdFx0XHRlbnRyeU5hbWUuaW5jbHVkZXMoXCIuXCIpICYmXG5cdFx0XHQodXNhZ2VOYW1lID09PSBlbnRyeVJvb3QgfHwgcm9vdENvbXBvbmVudCh1c2FnZU5hbWUpID09PSBlbnRyeVJvb3QpXG5cdFx0KSB7XG5cdFx0XHRyZXN1bHRzLnB1c2goXG5cdFx0XHRcdC4uLnVzYWdlcy5tYXAoKHVzYWdlKSA9PiAoe1xuXHRcdFx0XHRcdC4uLnVzYWdlLFxuXHRcdFx0XHRcdGhhc1NwcmVhZDogdHJ1ZSxcblx0XHRcdFx0fSkpLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gaXNQcm9wVXNlZChwcm9wTmFtZTogc3RyaW5nLCB1c2FnZXM6IFByb3BVc2FnZVtdKTogYm9vbGVhbiB7XG5cdGZvciAoY29uc3QgdXNhZ2Ugb2YgdXNhZ2VzKSB7XG5cdFx0aWYgKHVzYWdlLmhhc1NwcmVhZCkgcmV0dXJuIHRydWU7XG5cdFx0aWYgKHVzYWdlLmJvb2xlYW5Qcm9wcy5oYXMocHJvcE5hbWUpKSByZXR1cm4gdHJ1ZTtcblx0XHRpZiAodXNhZ2UucHJvcHMuaGFzKHByb3BOYW1lKSkgcmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRVc2VkRW51bVZhbHVlcyhcblx0c2xvdE5hbWU6IHN0cmluZyxcblx0dXNhZ2VzOiBQcm9wVXNhZ2VbXSxcbik6IFNldDxzdHJpbmc+IHwgXCJBTExcIiB7XG5cdGNvbnN0IHZhbHVlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRmb3IgKGNvbnN0IHVzYWdlIG9mIHVzYWdlcykge1xuXHRcdGlmICh1c2FnZS5oYXNTcHJlYWQpIHJldHVybiBcIkFMTFwiO1xuXHRcdGNvbnN0IHZhbCA9IHVzYWdlLnByb3BzLmdldChzbG90TmFtZSk7XG5cdFx0aWYgKHZhbCA9PT0gXCJEWU5BTUlDXCIpIHJldHVybiBcIkFMTFwiO1xuXHRcdGlmICh2YWwgIT09IHVuZGVmaW5lZCkgdmFsdWVzLmFkZCh2YWwpO1xuXHRcdGlmICh1c2FnZS5ib29sZWFuUHJvcHMuaGFzKHNsb3ROYW1lKSkgcmV0dXJuIFwiQUxMXCI7XG5cdH1cblx0cmV0dXJuIHZhbHVlcztcbn1cblxuLy8g4pSA4pSAIENvbnN1bWVyIHNvdXJjZSBzY2FubmluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuYXN5bmMgZnVuY3Rpb24gc2NhbkNvbnN1bWVyU291cmNlKHNyY0Rpcjogc3RyaW5nKTogUHJvbWlzZTxQcm9wVXNhZ2VbXT4ge1xuXHRjb25zdCBhbGxVc2FnZXM6IFByb3BVc2FnZVtdID0gW107XG5cdGNvbnN0IGdsb2IgPSBuZXcgR2xvYihcIioqLyoue3RzeCx0cyxqc3gsanN9XCIpO1xuXG5cdGZvciBhd2FpdCAoY29uc3QgcmVsUGF0aCBvZiBnbG9iLnNjYW4oeyBjd2Q6IHNyY0RpciB9KSkge1xuXHRcdGlmIChyZWxQYXRoLmluY2x1ZGVzKFwibm9kZV9tb2R1bGVzXCIpKSBjb250aW51ZTtcblx0XHRjb25zdCBmdWxsUGF0aCA9IGpvaW5QYXRoKHNyY0RpciwgcmVsUGF0aCk7XG5cdFx0Y29uc3QgY29kZSA9IGF3YWl0IEJ1bi5maWxlKGZ1bGxQYXRoKS50ZXh0KCk7XG5cdFx0aWYgKCFjb2RlLmluY2x1ZGVzKFwiQHBhdGhzY2FsZS91aVwiKSkgY29udGludWU7XG5cblx0XHRjb25zdCBpc1RzeCA9IC9cXC5bdGpdc3gkLy50ZXN0KHJlbFBhdGgpO1xuXHRcdGNvbnN0IGFzdCA9IGF3YWl0IHN3Yy5wYXJzZShjb2RlLCB7IHN5bnRheDogXCJ0eXBlc2NyaXB0XCIsIHRzeDogaXNUc3ggfSk7XG5cdFx0Y29uc3QgYmluZGluZ3MgPSBleHRyYWN0VUlCaW5kaW5ncyhhc3QpO1xuXHRcdGlmIChcblx0XHRcdGJpbmRpbmdzLmNvbXBvbmVudHMuc2l6ZSA9PT0gMCAmJlxuXHRcdFx0YmluZGluZ3MubmFtZXNwYWNlcy5zaXplID09PSAwICYmXG5cdFx0XHRiaW5kaW5ncy5jb25zZXJ2YXRpdmVVc2FnZXMubGVuZ3RoID09PSAwXG5cdFx0KSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRhbGxVc2FnZXMucHVzaCguLi5iaW5kaW5ncy5jb25zZXJ2YXRpdmVVc2FnZXMpO1xuXHRcdGNvbnN0IGpzeFVzYWdlcyA9IGV4dHJhY3RKU1hVc2FnZXMoYXN0LCBiaW5kaW5ncy5jb21wb25lbnRzKTtcblx0XHRhbGxVc2FnZXMucHVzaCguLi5qc3hVc2FnZXMpO1xuXHRcdGZvciAoY29uc3QgY29tcG9uZW50IG9mIGJpbmRpbmdzLmNvbXBvbmVudHMudmFsdWVzKCkpIHtcblx0XHRcdGlmIChcblx0XHRcdFx0anN4VXNhZ2VzLnNvbWUoXG5cdFx0XHRcdFx0KHVzYWdlKSA9PlxuXHRcdFx0XHRcdFx0dXNhZ2UuY29tcG9uZW50ID09PSBjb21wb25lbnQgfHxcblx0XHRcdFx0XHRcdHVzYWdlLmNvbXBvbmVudC5zdGFydHNXaXRoKGAke2NvbXBvbmVudH0uYCksXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGFsbFVzYWdlcy5wdXNoKGNvbnNlcnZhdGl2ZVVzYWdlKGNvbXBvbmVudCwgXCJpbXBvcnQtd2l0aG91dC1kaXJlY3QtanN4XCIpKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gYWxsVXNhZ2VzO1xufVxuXG4vLyDilIDilIAgTWFpbiAoc3RhbmRhbG9uZSBDTEkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuXHRjb25zdCBbc3JjRGlyLCBtYW5pZmVzdFBhdGhdID0gcHJvY2Vzcy5hcmd2LnNsaWNlKDIpO1xuXHRpZiAoIXNyY0RpciB8fCAhbWFuaWZlc3RQYXRoKSB7XG5cdFx0Y29uc29sZS5lcnJvcihcblx0XHRcdFwiVXNhZ2U6IGJ1biBydW4gc3JjL3NjYW4tY29uc3VtZXIudHMgPGNvbnN1bWVyLXNyYy1kaXI+IDxwdXJnZS1tYW5pZmVzdC5qc29uPlwiLFxuXHRcdCk7XG5cdFx0cHJvY2Vzcy5leGl0KDEpO1xuXHR9XG5cblx0Y29uc3QgbWFuaWZlc3Q6IFB1cmdlTWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuXHRcdGF3YWl0IEJ1bi5maWxlKG1hbmlmZXN0UGF0aCkudGV4dCgpLFxuXHQpO1xuXHRjb25zdCByZXNvbHZlZFNyYyA9IHNyY0Rpcjtcblx0Y29uc3QgbWFuaWZlc3RTaXplID0gT2JqZWN0LmtleXMobWFuaWZlc3RDb21wb25lbnRzKG1hbmlmZXN0KSkubGVuZ3RoO1xuXHRjb25zb2xlLmxvZyhgU2Nhbm5pbmcgJHtyZXNvbHZlZFNyY30gZm9yIEBwYXRoc2NhbGUvdWkgY29tcG9uZW50IHVzYWdlLi4uYCk7XG5cdGNvbnNvbGUubG9nKGBNYW5pZmVzdDogJHttYW5pZmVzdFNpemV9IGVudHJpZXNcXG5gKTtcblxuXHRjb25zdCB1c2FnZXMgPSBhd2FpdCBzY2FuQ29uc3VtZXJTb3VyY2UocmVzb2x2ZWRTcmMpO1xuXHRjb25zdCB7IGNsYXNzU2FmZWxpc3QsIGF0dHJTYWZlbGlzdCwgdXNlZENvbXBvbmVudHMgfSA9IGJ1aWxkU2FmZWxpc3RzKFxuXHRcdHVzYWdlcyxcblx0XHRtYW5pZmVzdCxcblx0KTtcblxuXHRjb25zb2xlLmxvZyhcIj09PSBDb21wb25lbnRzIERldGVjdGVkID09PVwiKTtcblx0Zm9yIChjb25zdCBjb21wb25lbnQgb2YgWy4uLnVzZWRDb21wb25lbnRzXS5zb3J0KCkpIHtcblx0XHRjb25zb2xlLmxvZyhgICAke2NvbXBvbmVudH1gKTtcblx0fVxuXG5cdGNvbnNvbGUubG9nKFwiXFxuPT09IENsYXNzIFNhZmVsaXN0ID09PVwiKTtcblx0Zm9yIChjb25zdCBjbHMgb2YgWy4uLmNsYXNzU2FmZWxpc3RdLnNvcnQoKSkge1xuXHRcdGNvbnNvbGUubG9nKGAgICR7Y2xzfWApO1xuXHR9XG5cblx0Y29uc29sZS5sb2coXCJcXG49PT0gQXR0cmlidXRlIFNhZmVsaXN0ID09PVwiKTtcblx0Zm9yIChjb25zdCBhdHRyIG9mIFsuLi5hdHRyU2FmZWxpc3RdLnNvcnQoKSkge1xuXHRcdGNvbnNvbGUubG9nKGAgICR7YXR0cn1gKTtcblx0fVxuXG5cdGNvbnNvbGUubG9nKFxuXHRcdGBcXG5Ub3RhbDogJHt1c2VkQ29tcG9uZW50cy5zaXplfSBjb21wb25lbnRzLCAke2NsYXNzU2FmZWxpc3Quc2l6ZX0gY2xhc3NlcywgJHthdHRyU2FmZWxpc3Quc2l6ZX0gYXR0cmlidXRlIHNlbGVjdG9yc2AsXG5cdCk7XG59XG5cbmlmIChpbXBvcnQubWV0YS5tYWluKSB7XG5cdG1haW4oKTtcbn1cblxuZXhwb3J0IHtcblx0ZXh0cmFjdFVJSW1wb3J0cyxcblx0ZXh0cmFjdEpTWFVzYWdlcyxcblx0YnVpbGRTYWZlbGlzdHMsXG5cdHNjYW5Db25zdW1lclNvdXJjZSxcbn07XG5leHBvcnQgdHlwZSB7XG5cdExlZ2FjeUNvbXBvbmVudE1hbmlmZXN0LFxuXHRQcm9wVXNhZ2UsXG5cdFB1cmdlTWFuaWZlc3QsXG5cdFB1cmdlRGF0YWJhc2VWMixcblx0Q29tcG9uZW50UHVyZ2VSZWNvcmQsXG5cdExlZ2FjeUNvbXBvbmVudE1hbmlmZXN0IGFzIENvbXBvbmVudE1hbmlmZXN0LFxuXHRTYWZlbGlzdHMsXG59O1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUtBLElBQU0sVUFBVSxNQUFNLFFBQVEsYUFBYTtBQUFBLEVBRTNDLElBQUksU0FBUztBQUFBLEVBQ2IsSUFBTSxZQUFZLE1BQU07QUFBQSxJQUN0QixJQUFJLENBQUMsUUFBUTtBQUFBLE1BRVgsSUFBSSxRQUFRLEtBQUssUUFBUSxRQUFRO0FBQUEsUUFDL0IsTUFBTSxPQUFPLFFBQVEsT0FBTztBQUFBLFFBQzVCLFFBQVEsT0FBTyxpQkFBaUI7QUFBQSxRQUNoQyxTQUFTLFFBQVEsT0FBTyxVQUFVO0FBQUEsUUFDbEMsUUFBUSxPQUFPLGlCQUFpQjtBQUFBLE1BQ2xDLEVBQU87QUFBQSxRQUNMLFNBQVMsQ0FBQztBQUFBO0FBQUEsSUFFZDtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFHVCxPQUFPLFVBQVUsRUFBRSxTQUFTLFVBQVU7QUFBQTs7OztFQ2xCdEMsSUFBTTtBQUFBLEVBRU4sSUFBTSxXQUFXO0FBQUEsRUFDakIsSUFBTSxZQUFZO0FBQUEsRUFDbEIsSUFBTSxhQUFhO0FBQUEsRUFRbkIsSUFBTSxlQUFlLENBQUMsU0FBUztBQUFBLElBQzdCLE1BQU0sS0FBSyxHQUFHLFNBQVMsTUFBTSxHQUFHO0FBQUEsSUFDaEMsTUFBTSxTQUFTLE9B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