sonamu 0.11.9 → 0.11.11
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.
- package/dist/database/puri.d.ts +25 -10
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +61 -7
- package/dist/database/puri.types.d.ts +8 -5
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/template/implementations/generated_http.template.d.ts +1 -0
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_http.template.js +281 -3
- package/package.json +1 -1
- package/src/__tests__/index-env.test.ts +51 -0
- package/src/database/__tests__/puri.test.ts +143 -0
- package/src/database/puri.ts +109 -24
- package/src/database/puri.types.test-d.ts +175 -0
- package/src/database/puri.types.ts +26 -29
- package/src/index.test-d.ts +26 -0
- package/src/index.ts +1 -0
- package/src/template/__tests__/generated_http.template.test.ts +996 -0
- package/src/template/implementations/generated_http.template.ts +498 -3
package/dist/database/puri.js
CHANGED
|
@@ -41,6 +41,9 @@ function isOrderByEntries(value) {
|
|
|
41
41
|
function isSqlExpression(value) {
|
|
42
42
|
return isObjectValue(value) && "_type" in value && value["_type"] === "sql_expression";
|
|
43
43
|
}
|
|
44
|
+
function isOrderByExpression(value) {
|
|
45
|
+
return isSqlExpression(value);
|
|
46
|
+
}
|
|
44
47
|
function isNestedSelectObject(value) {
|
|
45
48
|
return isObjectValue(value) && !("_type" in value);
|
|
46
49
|
}
|
|
@@ -144,6 +147,22 @@ var init_puri = __esmMin((() => {
|
|
|
144
147
|
_params: args
|
|
145
148
|
};
|
|
146
149
|
}
|
|
150
|
+
static coalesce(expression, fallback) {
|
|
151
|
+
return {
|
|
152
|
+
_type: "sql_expression",
|
|
153
|
+
_return: "string",
|
|
154
|
+
_sql: `COALESCE(${expression._sql}, ?)`,
|
|
155
|
+
_params: [...expression._params, fallback]
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
static concatExpressions(...args) {
|
|
159
|
+
return {
|
|
160
|
+
_type: "sql_expression",
|
|
161
|
+
_return: "string",
|
|
162
|
+
_sql: `CONCAT(${args.map((arg) => isStringValue(arg) ? "?::text" : arg._sql).join(", ")})`,
|
|
163
|
+
_params: args.flatMap((arg) => isStringValue(arg) ? [arg] : arg._params)
|
|
164
|
+
};
|
|
165
|
+
}
|
|
147
166
|
static upper(column) {
|
|
148
167
|
return {
|
|
149
168
|
_type: "sql_expression",
|
|
@@ -330,6 +349,14 @@ var init_puri = __esmMin((() => {
|
|
|
330
349
|
if (isStringValue(columnOrColumns)) return Puri.rawString(`pgroonga_highlight_html(??, ${queryClause})`, [columnOrColumns, ...queryArr]);
|
|
331
350
|
return Puri.rawStringArray(`pgroonga_highlight_html(ARRAY[${columnOrColumns.map(() => "??").join(", ")}], ${queryClause})`, [...columnOrColumns, ...queryArr]);
|
|
332
351
|
}
|
|
352
|
+
jsonText(column, ...path) {
|
|
353
|
+
return {
|
|
354
|
+
_type: "sql_expression",
|
|
355
|
+
_return: "string",
|
|
356
|
+
_sql: `?? #>> ARRAY[${path.map(() => "?").join(", ")}]`,
|
|
357
|
+
_params: [column, ...path]
|
|
358
|
+
};
|
|
359
|
+
}
|
|
333
360
|
select(selectObj) {
|
|
334
361
|
const flatSelect = this.flattenSelect(selectObj);
|
|
335
362
|
const selectClauses = [];
|
|
@@ -560,6 +587,10 @@ var init_puri = __esmMin((() => {
|
|
|
560
587
|
this.knexQuery.whereJsonSupersetOf(column, serializeJsonSupersetValue(value));
|
|
561
588
|
return this;
|
|
562
589
|
}
|
|
590
|
+
whereJsonKeyExists(column, key) {
|
|
591
|
+
this.knexQuery.whereRaw("?? \\? ?", [column, key]);
|
|
592
|
+
return this;
|
|
593
|
+
}
|
|
563
594
|
whereMatch(column, value) {
|
|
564
595
|
this.knexQuery.whereRaw(`MATCH (${String(column)}) AGAINST (?)`, [value]);
|
|
565
596
|
return this;
|
|
@@ -589,8 +620,13 @@ var init_puri = __esmMin((() => {
|
|
|
589
620
|
const opts = isStringValue(options) ? { config: options } : options ?? {};
|
|
590
621
|
const parser = opts.parser ?? "websearch_to_tsquery";
|
|
591
622
|
const config = opts.config ?? "simple";
|
|
592
|
-
const columnExpr = isSqlExpression(column)
|
|
593
|
-
|
|
623
|
+
const columnExpr = isSqlExpression(column) ? column["_sql"] : String(column);
|
|
624
|
+
const params = isSqlExpression(column) ? [
|
|
625
|
+
...column["_params"],
|
|
626
|
+
config,
|
|
627
|
+
value
|
|
628
|
+
] : [config, value];
|
|
629
|
+
this.knexQuery.whereRaw(`${columnExpr} @@ ${parser}(?, ?)`, params);
|
|
594
630
|
return this;
|
|
595
631
|
}
|
|
596
632
|
whereFuzzy(column, value, options) {
|
|
@@ -622,7 +658,7 @@ var init_puri = __esmMin((() => {
|
|
|
622
658
|
}
|
|
623
659
|
orderBy(columnOrColumns, direction = "asc", nulls) {
|
|
624
660
|
if (isOrderByEntries(columnOrColumns)) {
|
|
625
|
-
for (const entry of columnOrColumns) if (isStringValue(entry) ||
|
|
661
|
+
for (const entry of columnOrColumns) if (isStringValue(entry) || isOrderByExpression(entry)) this.applyOrderBy(entry);
|
|
626
662
|
else this.applyOrderBy(entry.column, entry.order, entry.nulls);
|
|
627
663
|
return this;
|
|
628
664
|
}
|
|
@@ -632,7 +668,7 @@ var init_puri = __esmMin((() => {
|
|
|
632
668
|
applyOrderBy(column, direction, nulls) {
|
|
633
669
|
const normalizedDirection = normalizeOrderByDirection(direction);
|
|
634
670
|
const normalizedNulls = normalizeOrderByNulls(nulls);
|
|
635
|
-
if (
|
|
671
|
+
if (isOrderByExpression(column)) this.knexQuery.orderByRaw(`${column["_sql"]} ${normalizedDirection}${formatNullsSuffix(normalizedNulls)}`, column["_params"]);
|
|
636
672
|
else this.knexQuery.orderBy(column, normalizedDirection, normalizedNulls);
|
|
637
673
|
}
|
|
638
674
|
forUpdate() {
|
|
@@ -939,6 +975,14 @@ var init_puri = __esmMin((() => {
|
|
|
939
975
|
this.builder.orWhereJsonSupersetOf(column, serializeJsonSupersetValue(value));
|
|
940
976
|
return this;
|
|
941
977
|
}
|
|
978
|
+
whereJsonKeyExists(column, key) {
|
|
979
|
+
this.builder.whereRaw("?? \\? ?", [column, key]);
|
|
980
|
+
return this;
|
|
981
|
+
}
|
|
982
|
+
orWhereJsonKeyExists(column, key) {
|
|
983
|
+
this.builder.orWhereRaw("?? \\? ?", [column, key]);
|
|
984
|
+
return this;
|
|
985
|
+
}
|
|
942
986
|
whereMatch(...args) {
|
|
943
987
|
this.builder.whereRaw(`MATCH (${String(args[0])}) AGAINST (?)`, [args[1]]);
|
|
944
988
|
return this;
|
|
@@ -966,7 +1010,12 @@ var init_puri = __esmMin((() => {
|
|
|
966
1010
|
const parser = opts.parser ?? "websearch_to_tsquery";
|
|
967
1011
|
const config = opts.config ?? "simple";
|
|
968
1012
|
const columnExpr = isSqlExpression(args[0]) ? args[0]["_sql"] : String(args[0]);
|
|
969
|
-
|
|
1013
|
+
const params = isSqlExpression(args[0]) ? [
|
|
1014
|
+
...args[0]["_params"],
|
|
1015
|
+
config,
|
|
1016
|
+
args[1]
|
|
1017
|
+
] : [config, args[1]];
|
|
1018
|
+
this.builder.whereRaw(`${columnExpr} @@ ${parser}(?, ?)`, params);
|
|
970
1019
|
return this;
|
|
971
1020
|
}
|
|
972
1021
|
orWhereTsSearch(...args) {
|
|
@@ -974,7 +1023,12 @@ var init_puri = __esmMin((() => {
|
|
|
974
1023
|
const parser = opts.parser ?? "websearch_to_tsquery";
|
|
975
1024
|
const config = opts.config ?? "simple";
|
|
976
1025
|
const columnExpr = isSqlExpression(args[0]) ? args[0]["_sql"] : String(args[0]);
|
|
977
|
-
|
|
1026
|
+
const params = isSqlExpression(args[0]) ? [
|
|
1027
|
+
...args[0]["_params"],
|
|
1028
|
+
config,
|
|
1029
|
+
args[1]
|
|
1030
|
+
] : [config, args[1]];
|
|
1031
|
+
this.builder.orWhereRaw(`${columnExpr} @@ ${parser}(?, ?)`, params);
|
|
978
1032
|
return this;
|
|
979
1033
|
}
|
|
980
1034
|
whereFuzzy(...args) {
|
|
@@ -1092,4 +1146,4 @@ var init_puri = __esmMin((() => {
|
|
|
1092
1146
|
init_puri();
|
|
1093
1147
|
export { JoinClauseGroup, Puri, ResolvedPuri, WhereGroup, init_puri, parseFuzzyOperator };
|
|
1094
1148
|
|
|
1095
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVyaS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvcHVyaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBveGxpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovIC8vIFB1cmnripQg64uk7JaR7ZWcIO2DgOyeheydhCDsgqzsmqntlZjqs6Ag7J6I7Iq164uI64ukLlxuXG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIFRhYmxlU3BlYyB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQge1xuICBpc0Z1bmN0aW9uVmFsdWUsXG4gIGlzTnVtYmVyVmFsdWUsXG4gIGlzT2JqZWN0VmFsdWUsXG4gIGlzU3RyaW5nVmFsdWUsXG59IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5pbXBvcnQgeyB0eXBlIENsZWFyU3RhdGVtZW50cyB9IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIEF2YWlsYWJsZUNvbHVtbnMsXG4gIHR5cGUgQ29sdW1uS2V5cyxcbiAgdHlwZSBDb21wYXJpc29uT3BlcmF0b3IsXG4gIHR5cGUgRXhwYW5kLFxuICB0eXBlIEV4dHJhY3RDb2x1bW5UeXBlLFxuICB0eXBlIEZ1bGx0ZXh0Q29sdW1ucyxcbiAgdHlwZSBGdXp6eU9wZXJhdG9yLFxuICB0eXBlIEluc2VydERhdGEsXG4gIHR5cGUgSW5zZXJ0UmVzdWx0LFxuICB0eXBlIEpzb25Db2x1bW5zLFxuICB0eXBlIEpzb25TdXBlcnNldFZhbHVlLFxuICB0eXBlIExlZnRKb2luZWRNYXJrZXIsXG4gIHR5cGUgTGVmdEpvaW5NYXJrZXJGb3IsXG4gIHR5cGUgTnVtZXJpY0NvbHVtbnMsXG4gIHR5cGUgT25Db25mbGljdEFjdGlvbixcbiAgdHlwZSBQYXJzZVNlbGVjdE9iamVjdCxcbiAgdHlwZSBSZXN1bHRBdmFpbGFibGVDb2x1bW5zLFxuICB0eXBlIFNlbGVjdEFsbFJlc3VsdCxcbiAgdHlwZSBTZWxlY3RPYmplY3QsXG4gIHR5cGUgU2VsZWN0VmFsdWUsXG4gIHR5cGUgU2luZ2xlVGFibGVWYWx1ZSxcbiAgdHlwZSBTcWxFeHByZXNzaW9uLFxuICB0eXBlIFRzSGlnaGxpZ2h0T3B0aW9ucyxcbiAgdHlwZSBUc1F1ZXJ5Q29uZmlnLFxuICB0eXBlIFRzUXVlcnlPcHRpb25zLFxuICB0eXBlIFRzUmFua09wdGlvbnMsXG4gIHR5cGUgVmVjdG9yQ29sdW1ucyxcbiAgdHlwZSBXaGVyZUNvbmRpdGlvbixcbiAgdHlwZSBXaGVyZU9wZXJhdG9yLFxufSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5pbXBvcnQgeyBGVVpaWV9PUEVSQVRPUlMgfSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5cbnR5cGUgUHVyaU9yZGVyQnlEaXJlY3Rpb24gPSBcImFzY1wiIHwgXCJkZXNjXCI7XG50eXBlIFB1cmlPcmRlckJ5TnVsbHMgPSBcImZpcnN0XCIgfCBcImxhc3RcIjtcbnR5cGUgUHVyaU9yZGVyQnlFeHByZXNzaW9uID0gU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj47XG50eXBlIFB1cmlPcmRlckJ5SXRlbTxUQ29sdW1uIGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgY29sdW1uOiBUQ29sdW1uIHwgUHVyaU9yZGVyQnlFeHByZXNzaW9uO1xuICBvcmRlcj86IFB1cmlPcmRlckJ5RGlyZWN0aW9uO1xuICBudWxscz86IFB1cmlPcmRlckJ5TnVsbHM7XG59O1xudHlwZSBQdXJpT3JkZXJCeUVudHJ5PFRDb2x1bW4gZXh0ZW5kcyBzdHJpbmc+ID1cbiAgfCBUQ29sdW1uXG4gIHwgUHVyaU9yZGVyQnlFeHByZXNzaW9uXG4gIHwgUHVyaU9yZGVyQnlJdGVtPFRDb2x1bW4+O1xudHlwZSBQdXJpT3JkZXJCeVJ1bnRpbWVJdGVtID0ge1xuICBjb2x1bW46IHN0cmluZyB8IFB1cmlPcmRlckJ5RXhwcmVzc2lvbjtcbiAgb3JkZXI/OiBQdXJpT3JkZXJCeURpcmVjdGlvbjtcbiAgbnVsbHM/OiBQdXJpT3JkZXJCeU51bGxzO1xufTtcbnR5cGUgUHVyaU9yZGVyQnlSdW50aW1lRW50cnkgPSBzdHJpbmcgfCBQdXJpT3JkZXJCeUV4cHJlc3Npb24gfCBQdXJpT3JkZXJCeVJ1bnRpbWVJdGVtO1xuXG50eXBlIEZyb21SZWdpc3RyYXRpb24gPSB7XG4gIGtpbmQ6IFwiZnJvbVwiO1xuICBhbGlhczogc3RyaW5nO1xuICB0YWJsZTogc3RyaW5nIHwgbnVsbDtcbn07XG5cbnR5cGUgSm9pblJlZ2lzdHJhdGlvbiA9IHtcbiAga2luZDogXCJqb2luXCI7XG4gIGFsaWFzOiBzdHJpbmc7XG4gIHRhYmxlOiBzdHJpbmcgfCBudWxsO1xuICBqb2luVHlwZTogXCJqb2luXCIgfCBcImxlZnRKb2luXCI7XG4gIGxlZnQ6IHN0cmluZyB8IG51bGw7XG4gIHJpZ2h0OiBzdHJpbmcgfCBudWxsO1xuICByZXVzYWJsZTogYm9vbGVhbjtcbn07XG5cbnR5cGUgQ29ycmVsYXRpb25SZWdpc3RyYXRpb24gPSBGcm9tUmVnaXN0cmF0aW9uIHwgSm9pblJlZ2lzdHJhdGlvbjtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRnV6enlPcGVyYXRvcihvcGVyYXRvcj86IHN0cmluZyk6IEZ1enp5T3BlcmF0b3Ige1xuICBjb25zdCBub3JtYWxpemVkID0gb3BlcmF0b3I/LnRyaW0oKSA/PyBcIjwlXCI7XG4gIGNvbnN0IGZ1enp5T3BlcmF0b3IgPSBGVVpaWV9PUEVSQVRPUlMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgPT09IG5vcm1hbGl6ZWQpO1xuXG4gIGlmICghZnV6enlPcGVyYXRvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmdXp6eSBvcGVyYXRvcjogJHtvcGVyYXRvciA/PyBcIlwifWApO1xuICB9XG5cbiAgcmV0dXJuIGZ1enp5T3BlcmF0b3I7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZUpzb25TdXBlcnNldFZhbHVlPFZhbHVlPih2YWx1ZTogVmFsdWUpOiBzdHJpbmcge1xuICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuXG4gIGlmIChzZXJpYWxpemVkID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgXCJQdXJpIEpTT05CIGNvbnRhaW5tZW50IHZhbHVlIG11c3QgYmUgSlNPTi1zZXJpYWxpemFibGU7IEpTT04uc3RyaW5naWZ5IHJldHVybmVkIHVuZGVmaW5lZC5cIixcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZUpzb25Db2x1bW5WYWx1ZTxWYWx1ZT4oXG4gIHRhYmxlU3BlYzogVGFibGVTcGVjIHwgbnVsbCxcbiAgY29sdW1uOiBzdHJpbmcsXG4gIHZhbHVlOiBWYWx1ZSxcbik6IFZhbHVlIHwgc3RyaW5nIHtcbiAgaWYgKCF0YWJsZVNwZWM/Lmpzb25Db2x1bW5zLmluY2x1ZGVzKGNvbHVtbikgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9yZGVyQnlEaXJlY3Rpb24oZGlyZWN0aW9uOiBQdXJpT3JkZXJCeURpcmVjdGlvbiA9IFwiYXNjXCIpOiBQdXJpT3JkZXJCeURpcmVjdGlvbiB7XG4gIGlmIChkaXJlY3Rpb24gIT09IFwiYXNjXCIgJiYgZGlyZWN0aW9uICE9PSBcImRlc2NcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvcmRlciBkaXJlY3Rpb246ICR7ZGlyZWN0aW9ufWApO1xuICB9XG5cbiAgcmV0dXJuIGRpcmVjdGlvbjtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplT3JkZXJCeU51bGxzKG51bGxzPzogUHVyaU9yZGVyQnlOdWxscyk6IFB1cmlPcmRlckJ5TnVsbHMgfCB1bmRlZmluZWQge1xuICBpZiAobnVsbHMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAobnVsbHMgIT09IFwiZmlyc3RcIiAmJiBudWxscyAhPT0gXCJsYXN0XCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb3JkZXIgbnVsbHM6ICR7bnVsbHN9YCk7XG4gIH1cblxuICByZXR1cm4gbnVsbHM7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdE51bGxzU3VmZml4KG51bGxzPzogUHVyaU9yZGVyQnlOdWxscyk6IHN0cmluZyB7XG4gIGlmICghbnVsbHMpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIHJldHVybiBgIE5VTExTICR7bnVsbHMudG9VcHBlckNhc2UoKX1gO1xufVxuXG5mdW5jdGlvbiBpc09yZGVyQnlFbnRyaWVzPFZhbHVlPihcbiAgdmFsdWU6IFZhbHVlLFxuKTogdmFsdWUgaXMgVmFsdWUgJiByZWFkb25seSBQdXJpT3JkZXJCeVJ1bnRpbWVFbnRyeVtdIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBpc1NxbEV4cHJlc3Npb248VmFsdWU+KHZhbHVlOiBWYWx1ZSk6IHZhbHVlIGlzIFZhbHVlICYgUHVyaU9yZGVyQnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIGlzT2JqZWN0VmFsdWUodmFsdWUpICYmIFwiX3R5cGVcIiBpbiB2YWx1ZSAmJiB2YWx1ZVtcIl90eXBlXCJdID09PSBcInNxbF9leHByZXNzaW9uXCI7XG59XG5cbmZ1bmN0aW9uIGlzTmVzdGVkU2VsZWN0T2JqZWN0PFRUYWJsZXMgZXh0ZW5kcyBvYmplY3Q+KFxuICB2YWx1ZTogU2VsZWN0VmFsdWU8VFRhYmxlcz4gfCBTZWxlY3RPYmplY3Q8VFRhYmxlcz4sXG4pOiB2YWx1ZSBpcyBTZWxlY3RPYmplY3Q8VFRhYmxlcz4ge1xuICByZXR1cm4gaXNPYmplY3RWYWx1ZSh2YWx1ZSkgJiYgIShcIl90eXBlXCIgaW4gdmFsdWUpO1xufVxuXG5leHBvcnQgY2xhc3MgUHVyaTxUU2NoZW1hLCBUVGFibGVzIGV4dGVuZHMgb2JqZWN0LCBUUmVzdWx0PiB7XG4gIHByaXZhdGUga25leFF1ZXJ5OiBLbmV4LlF1ZXJ5QnVpbGRlcjtcbiAgcHJpdmF0ZSB0YWJsZVNwZWM6IFRhYmxlU3BlYyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvcnJlbGF0aW9uUmVnaXN0cnkgPSBuZXcgTWFwPHN0cmluZywgQ29ycmVsYXRpb25SZWdpc3RyYXRpb24+KCk7XG5cbiAgLy8g7IOd7ISx7J6QIOyLnOq3uOuLiOyymOuTpFxuICBjb25zdHJ1Y3RvcihrbmV4OiBLbmV4LCB0YWJsZU5hbWU6IHN0cmluZyk7XG4gIGNvbnN0cnVjdG9yKGtuZXg6IEtuZXgsIHRhYmxlU291cmNlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBQdXJpPFRTY2hlbWEsIGFueSwgYW55Pj4pO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMga25leDogS25leCxcbiAgICB0YWJsZU5hbWVPclNvdXJjZTogYW55LFxuICApIHtcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZSh0YWJsZU5hbWVPclNvdXJjZSkpIHtcbiAgICAgIC8vIENhc2U6IG5ldyBQdXJpKGtuZXgsIFwidXNlcnNcIilcbiAgICAgIHRoaXMua25leFF1ZXJ5ID0gdGhpcy5rbmV4KHRhYmxlTmFtZU9yU291cmNlKS5mcm9tKHRhYmxlTmFtZU9yU291cmNlKTtcbiAgICAgIHRoaXMudGFibGVTcGVjID0gdGhpcy5zYWZlR2V0VGFibGVTcGVjKHRhYmxlTmFtZU9yU291cmNlKTtcbiAgICAgIHRoaXMuY29ycmVsYXRpb25SZWdpc3RyeS5zZXQodGFibGVOYW1lT3JTb3VyY2UsIHtcbiAgICAgICAga2luZDogXCJmcm9tXCIsXG4gICAgICAgIGFsaWFzOiB0YWJsZU5hbWVPclNvdXJjZSxcbiAgICAgICAgdGFibGU6IHRhYmxlTmFtZU9yU291cmNlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpc09iamVjdFZhbHVlKHRhYmxlTmFtZU9yU291cmNlKSkge1xuICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRhYmxlTmFtZU9yU291cmNlKTtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUYWJsZSBzcGVjIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBlbnRyeVwiKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChlbnRyaWVzWzBdKTtcbiAgICAgIGNvbnN0IFthbGlhcywgc291cmNlXSA9IGVudHJpZXNbMF07XG4gICAgICBpZiAoaXNTdHJpbmdWYWx1ZShzb3VyY2UpKSB7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5ID0gdGhpcy5rbmV4KHNvdXJjZSkuZnJvbSh7IFthbGlhc106IHNvdXJjZSB9KTtcbiAgICAgICAgdGhpcy50YWJsZVNwZWMgPSB0aGlzLnNhZmVHZXRUYWJsZVNwZWMoc291cmNlKTtcbiAgICAgICAgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LnNldChhbGlhcywgeyBraW5kOiBcImZyb21cIiwgYWxpYXMsIHRhYmxlOiBzb3VyY2UgfSk7XG4gICAgICB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFB1cmkpIHtcbiAgICAgICAgY29uc3Qgc3VicXVlcnlCdWlsZGVyID0gc291cmNlLnJhd1F1ZXJ5KCk7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5ID0gdGhpcy5rbmV4LmZyb20oc3VicXVlcnlCdWlsZGVyLmFzKGFsaWFzKSk7XG4gICAgICAgIHRoaXMuY29ycmVsYXRpb25SZWdpc3RyeS5zZXQoYWxpYXMsIHsga2luZDogXCJmcm9tXCIsIGFsaWFzLCB0YWJsZTogbnVsbCB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdGFibGUgc3BlY2lmaWNhdGlvblwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0YWJsZSBzcGVjaWZpY2F0aW9uXCIpO1xuICAgIH1cbiAgfVxuXG4gIHNhZmVHZXRUYWJsZVNwZWModGFibGVOYW1lOiBzdHJpbmcpOiBUYWJsZVNwZWMgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEVudGl0eU1hbmFnZXIuZ2V0VGFibGVTcGVjKHRhYmxlTmFtZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0aWMgU1FMIGhlbHBlciBmdW5jdGlvbnMgZm9yIFNFTEVDVFxuICBzdGF0aWMgY291bnQoY29sdW1uOiBzdHJpbmcgPSBcIipcIik6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBDT1VOVCg/Pyk6OmludGVnZXJgLFxuICAgICAgX3BhcmFtczogW2NvbHVtbl0sXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgc3VtKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYFNVTSg/PylgLFxuICAgICAgX3BhcmFtczogW2NvbHVtbl0sXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgYXZnKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYEFWRyg/PylgLFxuICAgICAgX3BhcmFtczogW2NvbHVtbl0sXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgbWF4KGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYE1BWCg/PylgLFxuICAgICAgX3BhcmFtczogW2NvbHVtbl0sXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgbWluKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYE1JTig/PylgLFxuICAgICAgX3BhcmFtczogW2NvbHVtbl0sXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgY29uY2F0KC4uLmFyZ3M6IHN0cmluZ1tdKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogYENPTkNBVCgke2FyZ3MubWFwKCgpID0+IFwiP1wiKS5qb2luKFwiLCBcIil9KWAsXG4gICAgICBfcGFyYW1zOiBhcmdzLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIHVwcGVyKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogXCJVUFBFUig/PylcIixcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIGxvd2VyKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogXCJMT1dFUig/PylcIixcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgd29yZFNpbWlsYXJpdHkoXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIGlmIChpc1N0cmluZ1ZhbHVlKGNvbHVtbikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICAgIF9zcWw6IFwid29yZF9zaW1pbGFyaXR5KD8sID8/KVwiLFxuICAgICAgICBfcGFyYW1zOiBbcXVlcnksIGNvbHVtbl0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGB3b3JkX3NpbWlsYXJpdHkoPywgJHtjb2x1bW5bXCJfc3FsXCJdfSlgLFxuICAgICAgX3BhcmFtczogW3F1ZXJ5LCAuLi5jb2x1bW5bXCJfcGFyYW1zXCJdXSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHNpbWlsYXJpdHkoXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIGlmIChpc1N0cmluZ1ZhbHVlKGNvbHVtbikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICAgIF9zcWw6IFwic2ltaWxhcml0eSg/PywgPylcIixcbiAgICAgICAgX3BhcmFtczogW2NvbHVtbiwgcXVlcnldLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgc2ltaWxhcml0eSgke2NvbHVtbltcIl9zcWxcIl19LCA/KWAsXG4gICAgICBfcGFyYW1zOiBbLi4uY29sdW1uW1wiX3BhcmFtc1wiXSwgcXVlcnldLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgc3RyaWN0V29yZFNpbWlsYXJpdHkoXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIGlmIChpc1N0cmluZ1ZhbHVlKGNvbHVtbikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICAgIF9zcWw6IGBzdHJpY3Rfd29yZF9zaW1pbGFyaXR5KD8sID8/KWAsXG4gICAgICAgIF9wYXJhbXM6IFtxdWVyeSwgY29sdW1uXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYHN0cmljdF93b3JkX3NpbWlsYXJpdHkoPywgJHtjb2x1bW5bXCJfc3FsXCJdfSlgLFxuICAgICAgX3BhcmFtczogW3F1ZXJ5LCAuLi5jb2x1bW5bXCJfcGFyYW1zXCJdXSxcbiAgICB9O1xuICB9XG5cbiAgLy8gUmF3IGZ1bmN0aW9ucyBmb3IgU0VMRUNUXG4gIHN0YXRpYyByYXdTdHJpbmcoc3FsOiBzdHJpbmcsIHBhcmFtczogS25leC5SYXdCaW5kaW5nW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwic3RyaW5nXCIsIF9zcWw6IHNxbCwgX3BhcmFtczogcGFyYW1zIH07XG4gIH1cblxuICBzdGF0aWMgcmF3U3RyaW5nQXJyYXkoc3FsOiBzdHJpbmcsIHBhcmFtczogS25leC5SYXdCaW5kaW5nW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdbXVwiPiB7XG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJzdHJpbmdbXVwiLCBfc3FsOiBzcWwsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgc3RhdGljIHJhd051bWJlcihzcWw6IHN0cmluZywgcGFyYW1zOiBLbmV4LlJhd0JpbmRpbmdbXSA9IFtdKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJudW1iZXJcIiwgX3NxbDogc3FsLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIHN0YXRpYyByYXdCb29sZWFuKHNxbDogc3RyaW5nLCBwYXJhbXM6IEtuZXguUmF3QmluZGluZ1tdID0gW10pOiBTcWxFeHByZXNzaW9uPFwiYm9vbGVhblwiPiB7XG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJib29sZWFuXCIsIF9zcWw6IHNxbCwgX3BhcmFtczogcGFyYW1zIH07XG4gIH1cblxuICBzdGF0aWMgcmF3RGF0ZShzcWw6IHN0cmluZywgcGFyYW1zOiBLbmV4LlJhd0JpbmRpbmdbXSA9IFtdKTogU3FsRXhwcmVzc2lvbjxcImRhdGVcIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwiZGF0ZVwiLCBfc3FsOiBzcWwsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZUUyDqsoDsg4nslrQg7ZWY7J2065287J207YyFXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC5zZWxlY3Qoe1xuICAgKiAgIHRpdGxlOiBQdXJpLmhpZ2hsaWdodChcInBvc3RzLnRpdGxlXCIsIHNlYXJjaCksXG4gICAqICAgY29udGVudDogUHVyaS5oaWdobGlnaHQoXCJwb3N0cy5jb250ZW50XCIsIHNlYXJjaCwge1xuICAgKiAgICAgc3RhcnRTZWw6IFwiPG1hcms+XCIsXG4gICAqICAgICBzdG9wU2VsOiBcIjwvbWFyaz5cIixcbiAgICogICAgIG1heEZyYWdtZW50czogMyxcbiAgICogICB9KSxcbiAgICogfSlcbiAgICovXG4gIHN0YXRpYyB0c0hpZ2hsaWdodChcbiAgICBjb2x1bW46IHN0cmluZyxcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIF9vcHRpb25zPzogVHNIaWdobGlnaHRPcHRpb25zLFxuICApOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHtcbiAgICBjb25zdCB7IHBhcnNlciA9IFwid2Vic2VhcmNoX3RvX3RzcXVlcnlcIiwgY29uZmlnID0gXCJzaW1wbGVcIiwgLi4ub3B0aW9ucyB9ID0gX29wdGlvbnMgPz8ge307XG5cbiAgICBjb25zdCBobE9wdGlvblBhcnRzID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucykubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHJldHVybiBgJHtpbmZsZWN0aW9uLmNhbWVsaXplKGtleSl9PSR7dmFsdWV9YDtcbiAgICB9KTtcblxuICAgIGNvbnN0IGhsT3B0aW9ucyA9IGhsT3B0aW9uUGFydHMubGVuZ3RoID4gMCA/IGAsICcke2hsT3B0aW9uUGFydHMuam9pbihcIiwgXCIpfSdgIDogXCJcIjtcblxuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJzdHJpbmdcIixcbiAgICAgIF9zcWw6IGB0c19oZWFkbGluZSg/LCA/PywgJHtwYXJzZXJ9KD8sID8pJHtobE9wdGlvbnN9KWAsXG4gICAgICBfcGFyYW1zOiBbY29uZmlnLCBjb2x1bW4sIGNvbmZpZywgcXVlcnldLFxuICAgIH07XG4gIH1cblxuICAvLyB0c19yYW5rXG4gIHN0YXRpYyB0c1JhbmsoXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTcWxFeHByZXNzaW9uPFwidHN2ZWN0b3JcIj4sXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNSYW5rT3B0aW9ucyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIFB1cmlbXCJfdHNSYW5rXCJdKFwidHNfcmFua1wiLCBjb2x1bW4sIHF1ZXJ5LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIHRzX3JhbmtfY2RcbiAgc3RhdGljIHRzUmFua0NkKFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3FsRXhwcmVzc2lvbjxcInRzdmVjdG9yXCI+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFRzUmFua09wdGlvbnMsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiBQdXJpW1wiX3RzUmFua1wiXShcInRzX3JhbmtfY2RcIiwgY29sdW1uLCBxdWVyeSwgb3B0aW9ucyk7XG4gIH1cblxuICBzdGF0aWMgdG9Uc1ZlY3Rvcihjb2x1bW46IHN0cmluZywgY29uZmlnOiBzdHJpbmcgPSBcInNpbXBsZVwiKTogU3FsRXhwcmVzc2lvbjxcInRzdmVjdG9yXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwidHN2ZWN0b3JcIixcbiAgICAgIF9zcWw6IGB0b190c3ZlY3Rvcig/LCA/PylgLFxuICAgICAgX3BhcmFtczogW2NvbmZpZywgY29sdW1uXSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIF90c1JhbmsoXG4gICAgdHlwZTogXCJ0c19yYW5rXCIgfCBcInRzX3JhbmtfY2RcIixcbiAgICBjb2x1bW46IHN0cmluZyB8IFNxbEV4cHJlc3Npb248XCJ0c3ZlY3RvclwiPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUc1JhbmtPcHRpb25zLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICBjb25zdCB7XG4gICAgICBwYXJzZXIgPSBcIndlYnNlYXJjaF90b190c3F1ZXJ5XCIsXG4gICAgICBjb25maWcgPSBcInNpbXBsZVwiLFxuICAgICAgbm9ybWFsaXphdGlvbixcbiAgICAgIHdlaWdodHMsXG4gICAgfSA9IG9wdGlvbnMgPz8ge307XG5cbiAgICBjb25zdCBwYXJhbXMgPSBbXTtcbiAgICBsZXQgc3FsVGVtcGxhdGUgPSBgJHt0eXBlfShgO1xuXG4gICAgaWYgKHdlaWdodHMpIHtcbiAgICAgIHNxbFRlbXBsYXRlICs9IGBBUlJBWVske3dlaWdodHMubWFwKCgpID0+IFwiP1wiKS5qb2luKFwiLCBcIil9XTo6ZmxvYXQ0W10sIGA7XG4gICAgICBwYXJhbXMucHVzaCguLi53ZWlnaHRzKTtcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJpbmdWYWx1ZShjb2x1bW4pKSB7XG4gICAgICBzcWxUZW1wbGF0ZSArPSBgPz8sICR7cGFyc2VyfSg/LCA/KWA7XG4gICAgICBwYXJhbXMucHVzaChjb2x1bW4sIGNvbmZpZywgcXVlcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcWxUZW1wbGF0ZSArPSBgJHtjb2x1bW5bXCJfc3FsXCJdfSwgJHtwYXJzZXJ9KD8sID8pYDtcbiAgICAgIHBhcmFtcy5wdXNoKC4uLmNvbHVtbltcIl9wYXJhbXNcIl0sIGNvbmZpZywgcXVlcnkpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemF0aW9uKSB7XG4gICAgICBzcWxUZW1wbGF0ZSArPSBcIiwgP1wiO1xuICAgICAgcGFyYW1zLnB1c2gobm9ybWFsaXphdGlvbik7XG4gICAgfVxuXG4gICAgc3FsVGVtcGxhdGUgKz0gXCIpXCI7XG5cbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcIm51bWJlclwiLCBfc3FsOiBzcWxUZW1wbGF0ZSwgX3BhcmFtczogcGFyYW1zIH07XG4gIH1cblxuICAvKipcbiAgICogUEdyb29uZ2EgRnVsbFRleHQg7J24642x7IqkIOqygOyDiSDsoJDsiJhcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLnNlbGVjdCh7XG4gICAqICAgc2NvcmU6IFB1cmkuc2NvcmUoKSxcbiAgICogfSlcbiAgICovXG4gIHN0YXRpYyBzY29yZSgpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4gUHVyaS5yYXdOdW1iZXIoXCJwZ3Jvb25nYV9zY29yZSh0YWJsZW9pZCwgY3RpZClcIik7XG4gIH1cblxuICAvKipcbiAgICogUEdyb29uZ2EgRnVsbFRleHQg7J24642x7IqkIOqygOyDiSDtlZjsnbTrnbzsnbTtjIVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLnNlbGVjdCh7XG4gICAqICAgdGl0bGU6IFB1cmkuaGlnaGxpZ2h0KFwicG9zdHMudGl0bGVcIiwgc2VhcmNoKSxcbiAgICogfSlcbiAgICovXG4gIHN0YXRpYyBoaWdobGlnaHQoY29sdW1uOiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcgfCBzdHJpbmdbXSk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj47XG4gIHN0YXRpYyBoaWdobGlnaHQoY29sdW1uczogc3RyaW5nW10sIHF1ZXJ5OiBzdHJpbmcgfCBzdHJpbmdbXSk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdbXVwiPjtcblxuICBzdGF0aWMgaGlnaGxpZ2h0KFxuICAgIGNvbHVtbk9yQ29sdW1uczogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgcXVlcnk6IHN0cmluZyB8IHN0cmluZ1tdLFxuICApOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHwgU3FsRXhwcmVzc2lvbjxcInN0cmluZ1tdXCI+IHtcbiAgICBjb25zdCBxdWVyeUFyciA9IEFycmF5LmlzQXJyYXkocXVlcnkpID8gcXVlcnkgOiBbcXVlcnldO1xuICAgIGNvbnN0IHF1ZXJ5Q2xhdXNlID0gYEFSUkFZWyR7cXVlcnlBcnIubWFwKCgpID0+IFwiP1wiKS5qb2luKFwiLCBcIil9XWA7XG5cbiAgICAvLyDri6jsnbwg7Lus65+87J24IOqyveyasFxuICAgIGlmIChpc1N0cmluZ1ZhbHVlKGNvbHVtbk9yQ29sdW1ucykpIHtcbiAgICAgIHJldHVybiBQdXJpLnJhd1N0cmluZyhgcGdyb29uZ2FfaGlnaGxpZ2h0X2h0bWwoPz8sICR7cXVlcnlDbGF1c2V9KWAsIFtcbiAgICAgICAgY29sdW1uT3JDb2x1bW5zLFxuICAgICAgICAuLi5xdWVyeUFycixcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIC8vIOy7rOufvCDrsLDsl7Tsnbgg6rK97JqwXG4gICAgcmV0dXJuIFB1cmkucmF3U3RyaW5nQXJyYXkoXG4gICAgICBgcGdyb29uZ2FfaGlnaGxpZ2h0X2h0bWwoQVJSQVlbJHtjb2x1bW5PckNvbHVtbnMubWFwKCgpID0+IFwiPz9cIikuam9pbihcIiwgXCIpfV0sICR7cXVlcnlDbGF1c2V9KWAsXG4gICAgICBbLi4uY29sdW1uT3JDb2x1bW5zLCAuLi5xdWVyeUFycl0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNFTEVDVCAob3ZlcndyaXRlKVxuICBzZWxlY3Q8VFNlbGVjdCBleHRlbmRzIFNlbGVjdE9iamVjdDxUVGFibGVzPj4oXG4gICAgc2VsZWN0T2JqOiBUU2VsZWN0LFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFBhcnNlU2VsZWN0T2JqZWN0PFRUYWJsZXMsIFRTZWxlY3Q+PiB7XG4gICAgLy8g7KSR7LKpIOqwneyytOulvCBmbGF07ZWY6rKMIOuzgO2ZmFxuICAgIGNvbnN0IGZsYXRTZWxlY3QgPSB0aGlzLmZsYXR0ZW5TZWxlY3Qoc2VsZWN0T2JqKTtcblxuICAgIGNvbnN0IHNlbGVjdENsYXVzZXM6IChzdHJpbmcgfCBLbmV4LlJhdylbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbYWxpYXMsIGNvbHVtbk9yRnVuY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKGZsYXRTZWxlY3QpKSB7XG4gICAgICBpZiAoaXNTcWxFeHByZXNzaW9uKGNvbHVtbk9yRnVuY3Rpb24pKSB7XG4gICAgICAgIC8vIFNRTCDtlajsiJjsnbgg6rK97JqwXG4gICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChcbiAgICAgICAgICB0aGlzLmtuZXgucmF3KGAke2NvbHVtbk9yRnVuY3Rpb25bXCJfc3FsXCJdfSBBUyBcIiR7YWxpYXN9XCJgLCBjb2x1bW5PckZ1bmN0aW9uW1wiX3BhcmFtc1wiXSksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDsnbzrsJgg7Lus65+87J24IOqyveyasFxuICAgICAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICBjb25zdCBjb2x1bW5QYXRoID0gY29sdW1uT3JGdW5jdGlvbiBhcyBzdHJpbmc7XG4gICAgICAgIGlmIChhbGlhcyA9PT0gY29sdW1uUGF0aCkge1xuICAgICAgICAgIC8vIGFsaWFz7JmAIOy7rOufvOuqheydtCDqsJnsnLzrqbQgYWxpYXMg7IOd6561XG4gICAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKGNvbHVtblBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGFsaWFzIOyngOyglVxuICAgICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChgJHtjb2x1bW5QYXRofSBBUyAke2FsaWFzfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KHNlbGVjdENsYXVzZXMpO1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIOykkeyyqSDqsJ3ssrTrpbwgZmxhdCDqsJ3ssrTroZwg67OA7ZmYXG4gICAqIOyYiDogeyBwYXJlbnQ6IHsgaWQ6IFwicGFyZW50LmlkXCIsIG5hbWU6IFwicGFyZW50Lm5hbWVcIiB9IH1cbiAgICogICDihpIgeyBwYXJlbnRfX2lkOiBcInBhcmVudC5pZFwiLCBwYXJlbnRfX25hbWU6IFwicGFyZW50Lm5hbWVcIiB9XG4gICAqL1xuICBwcml2YXRlICpmbGF0dGVuU2VsZWN0RW50cmllcyhcbiAgICBzZWxlY3RPYmo6IFNlbGVjdE9iamVjdDxUVGFibGVzPixcbiAgICBwcmVmaXggPSBcIlwiLFxuICApOiBHZW5lcmF0b3I8W3N0cmluZywgU2VsZWN0VmFsdWU8VFRhYmxlcz5dLCB2b2lkPiB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2VsZWN0T2JqKSkge1xuICAgICAgY29uc3QgZnVsbEtleSA9IHByZWZpeCA/IGAke3ByZWZpeH1fXyR7a2V5fWAgOiBrZXk7XG5cbiAgICAgIGlmIChpc05lc3RlZFNlbGVjdE9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgeWllbGQqIHRoaXMuZmxhdHRlblNlbGVjdEVudHJpZXModmFsdWUsIGZ1bGxLZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeWllbGQgW2Z1bGxLZXksIHZhbHVlXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZsYXR0ZW5TZWxlY3Qoc2VsZWN0T2JqOiBTZWxlY3RPYmplY3Q8VFRhYmxlcz4sIHByZWZpeCA9IFwiXCIpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuZmxhdHRlblNlbGVjdEVudHJpZXMoc2VsZWN0T2JqLCBwcmVmaXgpKTtcbiAgfVxuXG4gIC8vIFNFTEVDVCAoc2VsZWN064qUIG92ZXJ3cml0ZSwgYXBwZW5kU2VsZWN064qUIGFwcGVuZClcbiAgYXBwZW5kU2VsZWN0PFRTZWxlY3QgZXh0ZW5kcyBTZWxlY3RPYmplY3Q8VFRhYmxlcz4+KFxuICAgIHNlbGVjdE9iajogVFNlbGVjdCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0ICYgUGFyc2VTZWxlY3RPYmplY3Q8VFRhYmxlcywgVFNlbGVjdD4+IHtcbiAgICAvLyDspJHssqkg6rCd7LK066W8IGZsYXTtlZjqsowg67OA7ZmYXG4gICAgY29uc3QgZmxhdFNlbGVjdCA9IHRoaXMuZmxhdHRlblNlbGVjdChzZWxlY3RPYmopO1xuXG4gICAgY29uc3Qgc2VsZWN0Q2xhdXNlczogKHN0cmluZyB8IEtuZXguUmF3KVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFthbGlhcywgY29sdW1uT3JGdW5jdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoZmxhdFNlbGVjdCkpIHtcbiAgICAgIGlmIChpc1NxbEV4cHJlc3Npb24oY29sdW1uT3JGdW5jdGlvbikpIHtcbiAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKFxuICAgICAgICAgIHRoaXMua25leC5yYXcoYCR7Y29sdW1uT3JGdW5jdGlvbltcIl9zcWxcIl19IEFTICR7YWxpYXN9YCwgY29sdW1uT3JGdW5jdGlvbltcIl9wYXJhbXNcIl0pLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgY29uc3QgY29sdW1uUGF0aCA9IGNvbHVtbk9yRnVuY3Rpb24gYXMgc3RyaW5nO1xuICAgICAgICBpZiAoYWxpYXMgPT09IGNvbHVtblBhdGgpIHtcbiAgICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goY29sdW1uUGF0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKHRoaXMua25leC5yZWYoY29sdW1uUGF0aCkuYXMoYWxpYXMpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdChzZWxlY3RDbGF1c2VzKTtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8vIFNFTEVDVCAqXG4gIHNlbGVjdEFsbCgpOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFNlbGVjdEFsbFJlc3VsdDxUVGFibGVzPj4ge1xuICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdChcIipcIik7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBESVNUSU5DVFxuICBkaXN0aW5jdDxUQ29sdW1ucyBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KC4uLmNvbHVtbnM6IFRDb2x1bW5zW10pOiB0aGlzO1xuICBkaXN0aW5jdCguLi5jb2x1bW5zOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LmRpc3RpbmN0KC4uLmNvbHVtbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gQ0xFQVJcbiAgY2xlYXIoc3RhdGVtZW50OiBDbGVhclN0YXRlbWVudHMpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5jbGVhcihzdGF0ZW1lbnQpO1xuICAgIGlmIChzdGF0ZW1lbnQgPT09IFwiam9pblwiKSB7XG4gICAgICB0aGlzLmNsZWFySm9pblJlZ2lzdHJhdGlvbnMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBrbmV47JeQIOyXhuyWtOyEnCDsp4HsoJEg6rWs7ZiE7ZWoXG4gIGNsZWFySm9pbihhbGlhczogc3RyaW5nKTogdGhpcyB7XG4gICAgbGV0IHJlbW92ZWQgPSBmYWxzZTtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICh0aGlzLmtuZXhRdWVyeSBhcyBhbnkpW1wiX3N0YXRlbWVudHNcIl0gPSAodGhpcy5rbmV4UXVlcnkgYXMgYW55KVtcIl9zdGF0ZW1lbnRzXCJdLmZpbHRlcihcbiAgICAgIChzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKFwiam9pblR5cGVcIiBpbiBzKSB7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkUmVtb3ZlID0gdGhpcy5nZXRLbmV4Sm9pbkFsaWFzKHMudGFibGUpID09PSBhbGlhcztcbiAgICAgICAgICByZW1vdmVkIHx8PSBzaG91bGRSZW1vdmU7XG4gICAgICAgICAgcmV0dXJuICFzaG91bGRSZW1vdmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgICBpZiAocmVtb3ZlZCAmJiB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkuZ2V0KGFsaWFzKT8ua2luZCA9PT0gXCJqb2luXCIpIHtcbiAgICAgIHRoaXMuY29ycmVsYXRpb25SZWdpc3RyeS5kZWxldGUoYWxpYXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzXG4gIGpvaW48VEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZywgVFN1YlJlc3VsdD4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD4gfSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pbkFsaWFzfS4ke0NvbHVtbktleXM8VFN1YlJlc3VsdD59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdD4sIC8vIOyEnOu4jOy/vOumrOydmCBUUmVzdWx0XG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBKT0lOOiDthYzsnbTruJQgKyBBbGlhc1xuICBqb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLCBUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nPihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFRKb2luVGFibGUgfSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pbkFsaWFzfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXT4sIC8vIFRUYWJsZXMg7ZmV7J6lIVxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gSk9JTjog7YWM7J2067iU66qFXG4gIGpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pblRhYmxlICYgc3RyaW5nfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4sIC8vIO2FjOydtOu4lOuqheydtCDtgqRcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzICsg7L2c67CxXG4gIGpvaW48VEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZywgVFN1YlJlc3VsdD4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD4gfSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdD4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdD4sIFRSZXN1bHQ+O1xuICAvLyBKT0lOOiDthYzsnbTruJQgKyBBbGlhcyArIOy9nOuwsVxuICBqb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLCBUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nPihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFRKb2luVGFibGUgfSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXT4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXT4sIFRSZXN1bHQ+O1xuICAvLyBKT0lOOiDthYzsnbTruJTrqoUgKyDsvZzrsLFcbiAgam9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYT4oXG4gICAgdGFibGVOYW1lOiBUSm9pblRhYmxlLFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdPj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgVFJlc3VsdD47XG4gIC8vIEpPSU4g7Iuk7KCcIOq1rO2YhFxuICBqb2luKHRhYmxlTmFtZU9yU3BlYzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXNbXCJfX2NvbW1vbkpvaW5cIl0oXCJqb2luXCIsIHRhYmxlTmFtZU9yU3BlYywgLi4uYXJncyk7XG4gIH1cblxuICAvLyBFTlNVUkUgSk9JTjog7YWM7J2067iUICsgQWxpYXNcbiAgZW5zdXJlSm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgVFJlc3VsdD47XG4gIC8vIEVOU1VSRSBKT0lOOiDthYzsnbTruJTrqoVcbiAgZW5zdXJlSm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYT4oXG4gICAgdGFibGVOYW1lOiBUSm9pblRhYmxlLFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luVGFibGUgJiBzdHJpbmd9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4sIFRSZXN1bHQ+O1xuICBlbnN1cmVKb2luKHRhYmxlTmFtZU9yU3BlYzogYW55LCBsZWZ0OiBzdHJpbmcsIHJpZ2h0OiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB0aGlzW1wiX19lbnN1cmVKb2luXCJdKFwiam9pblwiLCB0YWJsZU5hbWVPclNwZWMsIGxlZnQsIHJpZ2h0KTtcbiAgfVxuXG4gIC8vIExFRlQgSk9JTjog7ISc67iM7L+866asICsgQWxpYXNcbiAgbGVmdEpvaW48VEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZywgVFN1YlJlc3VsdD4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD4gfSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pbkFsaWFzfS4ke0NvbHVtbktleXM8VFN1YlJlc3VsdD59YCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQgJiBMZWZ0Sm9pbmVkTWFya2VyPiwgVFJlc3VsdD47IC8vIOyEnOu4jOy/vOumrOydmCBUUmVzdWx0XG4gIC8vIExFRlQgSk9JTjog7YWM7J2067iUICsgQWxpYXNcbiAgLy8gRksgbnVsbGFibGUg7Jes67aA7JeQIOuUsOudvCDsnpDrj5nsnLzroZwgTGVmdEpvaW5lZE1hcmtlciDqsrDsoJVcbiAgbGVmdEpvaW48XG4gICAgVEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsXG4gICAgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZyxcbiAgICBUTGVmdCBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gID4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgbGVmdDogVExlZnQsXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5NYXJrZXJGb3I8VFRhYmxlcywgVExlZnQ+PixcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIExFRlQgSk9JTjog7YWM7J2067iU66qFXG4gIGxlZnRKb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLCBUTGVmdCBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBsZWZ0OiBUTGVmdCxcbiAgICByaWdodDogYCR7VEpvaW5UYWJsZSAmIHN0cmluZ30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBMZWZ0Sm9pbk1hcmtlckZvcjxUVGFibGVzLCBUTGVmdD4+LFxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gTEVGVCBKT0lOOiDshJzruIzsv7zrpqwgKyBBbGlhcyArIOy9nOuwsVxuICBsZWZ0Sm9pbjxUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLCBUU3ViUmVzdWx0PihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFB1cmk8VFNjaGVtYSwgYW55LCBUU3ViUmVzdWx0PiB9LFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0Pj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0ICYgTGVmdEpvaW5lZE1hcmtlcj4sIFRSZXN1bHQ+O1xuICAvLyBMRUZUIEpPSU46IO2FjOydtOu4lCArIEFsaWFzICsg7L2c67CxXG4gIGxlZnRKb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLCBUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nPihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFRKb2luVGFibGUgfSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXT4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXSAmIExlZnRKb2luZWRNYXJrZXI+LCBUUmVzdWx0PjtcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJTrqoUgKyDsvZzrsLFcbiAgbGVmdEpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXSAmIExlZnRKb2luZWRNYXJrZXI+LCBUUmVzdWx0PjtcbiAgLy8gTEVGVCBKT0lOIOyLpOygnCDqtaztmIRcbiAgbGVmdEpvaW4odGFibGVOYW1lT3JTcGVjOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogYW55IHtcbiAgICByZXR1cm4gdGhpc1tcIl9fY29tbW9uSm9pblwiXShcImxlZnRKb2luXCIsIHRhYmxlTmFtZU9yU3BlYywgLi4uYXJncyk7XG4gIH1cblxuICAvLyBFTlNVUkUgTEVGVCBKT0lOOiDthYzsnbTruJQgKyBBbGlhc1xuICBlbnN1cmVMZWZ0Sm9pbjxcbiAgICBUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSxcbiAgICBUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLFxuICAgIFRMZWZ0IGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgPihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFRKb2luVGFibGUgfSxcbiAgICBsZWZ0OiBUTGVmdCxcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBMZWZ0Sm9pbk1hcmtlckZvcjxUVGFibGVzLCBUTGVmdD4+LFxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gRU5TVVJFIExFRlQgSk9JTjog7YWM7J2067iU66qFXG4gIGVuc3VyZUxlZnRKb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLCBUTGVmdCBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBsZWZ0OiBUTGVmdCxcbiAgICByaWdodDogYCR7VEpvaW5UYWJsZSAmIHN0cmluZ30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBMZWZ0Sm9pbk1hcmtlckZvcjxUVGFibGVzLCBUTGVmdD4+LFxuICAgIFRSZXN1bHRcbiAgPjtcbiAgZW5zdXJlTGVmdEpvaW4odGFibGVOYW1lT3JTcGVjOiBhbnksIGxlZnQ6IHN0cmluZywgcmlnaHQ6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXNbXCJfX2Vuc3VyZUpvaW5cIl0oXCJsZWZ0Sm9pblwiLCB0YWJsZU5hbWVPclNwZWMsIGxlZnQsIHJpZ2h0KTtcbiAgfVxuXG4gIF9fY29tbW9uSm9pbihqb2luVHlwZTogXCJqb2luXCIgfCBcImxlZnRKb2luXCIsIHRhYmxlTmFtZU9yU3BlYzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IHRoaXMuY3JlYXRlSm9pblJlZ2lzdHJhdGlvbihqb2luVHlwZSwgdGFibGVOYW1lT3JTcGVjLCBhcmdzKTtcbiAgICB0aGlzLmFzc2VydENvcnJlbGF0aW9uQXZhaWxhYmxlKHJlZ2lzdHJhdGlvbik7XG5cbiAgICBpZiAoaXNTdHJpbmdWYWx1ZSh0YWJsZU5hbWVPclNwZWMpKSB7XG4gICAgICAvLyBDYXNlIDE6IGpvaW4oXCJwb3N0c1wiLCAuLi4pXG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSB0YWJsZU5hbWVPclNwZWM7XG5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiBpc0Z1bmN0aW9uVmFsdWUoYXJnc1swXSkpIHtcbiAgICAgICAgLy8gam9pbihcInBvc3RzXCIsIGNhbGxiYWNrKVxuICAgICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXSh0YWJsZU5hbWUsIChqb2luQ2xhdXNlKSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2sobmV3IEpvaW5DbGF1c2VHcm91cChqb2luQ2xhdXNlKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gam9pbihcInBvc3RzXCIsIGxlZnQsIHJpZ2h0KVxuICAgICAgICBjb25zdCBbbGVmdCwgcmlnaHRdID0gYXJncztcbiAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHRhYmxlTmFtZSwgbGVmdCwgcmlnaHQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNPYmplY3RWYWx1ZSh0YWJsZU5hbWVPclNwZWMpKSB7XG4gICAgICAvLyBDYXNlIDI6IGpvaW4oeyBhbGlhczogXCJ0YWJsZVwiIH0sIC4uLikgb3Igam9pbih7IGFsaWFzOiBzdWJxdWVyeSB9LCAuLi4pXG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFibGVOYW1lT3JTcGVjKTtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUYWJsZSBzcGVjIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBlbnRyeVwiKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChlbnRyaWVzWzBdKTtcbiAgICAgIGNvbnN0IFtbYWxpYXMsIHNwZWNdXSA9IGVudHJpZXM7XG5cbiAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHNwZWMpKSB7XG4gICAgICAgIC8vIO2FjOydtOu4lDogam9pbih7IHA6IFwicG9zdHNcIiB9LCAuLi4pXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiBpc0Z1bmN0aW9uVmFsdWUoYXJnc1swXSkpIHtcbiAgICAgICAgICAvLyBDYWxsYmFja1xuICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gYXJnc1swXTtcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0oeyBbYWxpYXNdOiBzcGVjIH0sIChqb2luQ2xhdXNlKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgSm9pbkNsYXVzZUdyb3VwKGpvaW5DbGF1c2UpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTaW1wbGVcbiAgICAgICAgICBjb25zdCBbbGVmdCwgcmlnaHRdID0gYXJncztcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0oeyBbYWxpYXNdOiBzcGVjIH0sIGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzcGVjIGluc3RhbmNlb2YgUHVyaSkge1xuICAgICAgICAvLyDshJzruIzsv7zrpqw6IGpvaW4oeyBzcTogc3VicXVlcnkgfSwgLi4uKVxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgaXNGdW5jdGlvblZhbHVlKGFyZ3NbMF0pKSB7XG4gICAgICAgICAgLy8gQ2FsbGJhY2tcbiAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHNwZWMucmF3UXVlcnkoKS5hcyhhbGlhcyksIChqb2luQ2xhdXNlKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgSm9pbkNsYXVzZUdyb3VwKGpvaW5DbGF1c2UpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTaW1wbGVcbiAgICAgICAgICBjb25zdCBbbGVmdCwgcmlnaHRdID0gYXJncztcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0oc3BlYy5yYXdRdWVyeSgpLmFzKGFsaWFzKSwgbGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHRhYmxlIHNwZWNpZmljYXRpb25cIik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzXCIpO1xuICAgIH1cblxuICAgIHRoaXMuY29ycmVsYXRpb25SZWdpc3RyeS5zZXQocmVnaXN0cmF0aW9uLmFsaWFzLCByZWdpc3RyYXRpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJpdmF0ZSBfX2Vuc3VyZUpvaW4oXG4gICAgam9pblR5cGU6IFwiam9pblwiIHwgXCJsZWZ0Sm9pblwiLFxuICAgIHRhYmxlTmFtZU9yU3BlYzogc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBsZWZ0OiBzdHJpbmcsXG4gICAgcmlnaHQ6IHN0cmluZyxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgcmVxdWVzdGVkID0gdGhpcy5jcmVhdGVKb2luUmVnaXN0cmF0aW9uKGpvaW5UeXBlLCB0YWJsZU5hbWVPclNwZWMsIFtsZWZ0LCByaWdodF0pO1xuICAgIGlmICghcmVxdWVzdGVkLnJldXNhYmxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke2pvaW5UeXBlID09PSBcImpvaW5cIiA/IFwiZW5zdXJlSm9pblwiIDogXCJlbnN1cmVMZWZ0Sm9pblwifSBvbmx5IHN1cHBvcnRzIHBoeXNpY2FsIHRhYmxlcyB3aXRoIHNpbXBsZSBjb2x1bW4gZXF1YWxpdHkgY29uZGl0aW9ucy5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkuZ2V0KHJlcXVlc3RlZC5hbGlhcyk7XG5cbiAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICByZXR1cm4gdGhpc1tcIl9fY29tbW9uSm9pblwiXShqb2luVHlwZSwgdGFibGVOYW1lT3JTcGVjLCBsZWZ0LCByaWdodCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNTYW1lSm9pblJlZ2lzdHJhdGlvbihleGlzdGluZywgcmVxdWVzdGVkKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhyb3cgdGhpcy5jcmVhdGVKb2luQ29uZmxpY3RFcnJvcihleGlzdGluZywgcmVxdWVzdGVkKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSm9pblJlZ2lzdHJhdGlvbihcbiAgICBqb2luVHlwZTogXCJqb2luXCIgfCBcImxlZnRKb2luXCIsXG4gICAgdGFibGVOYW1lT3JTcGVjOiBhbnksXG4gICAgYXJnczogYW55W10sXG4gICk6IEpvaW5SZWdpc3RyYXRpb24ge1xuICAgIGxldCBhbGlhczogc3RyaW5nO1xuICAgIGxldCB0YWJsZTogc3RyaW5nIHwgbnVsbDtcblxuICAgIGlmIChpc1N0cmluZ1ZhbHVlKHRhYmxlTmFtZU9yU3BlYykpIHtcbiAgICAgIGFsaWFzID0gdGFibGVOYW1lT3JTcGVjO1xuICAgICAgdGFibGUgPSB0YWJsZU5hbWVPclNwZWM7XG4gICAgfSBlbHNlIGlmIChpc09iamVjdFZhbHVlKHRhYmxlTmFtZU9yU3BlYykpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh0YWJsZU5hbWVPclNwZWMpO1xuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRhYmxlIHNwZWMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGVudHJ5XCIpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KGVudHJpZXNbMF0pO1xuICAgICAgY29uc3QgW1tqb2luQWxpYXMsIHNwZWNdXSA9IGVudHJpZXM7XG4gICAgICBhbGlhcyA9IGpvaW5BbGlhcztcbiAgICAgIHRhYmxlID0gaXNTdHJpbmdWYWx1ZShzcGVjKSA/IHNwZWMgOiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50c1wiKTtcbiAgICB9XG5cbiAgICBjb25zdCBbbGVmdCwgcmlnaHRdID0gYXJncztcbiAgICBjb25zdCByZXVzYWJsZSA9XG4gICAgICB0YWJsZSAhPT0gbnVsbCAmJiBhcmdzLmxlbmd0aCA9PT0gMiAmJiBpc1N0cmluZ1ZhbHVlKGxlZnQpICYmIGlzU3RyaW5nVmFsdWUocmlnaHQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6IFwiam9pblwiLFxuICAgICAgYWxpYXMsXG4gICAgICB0YWJsZSxcbiAgICAgIGpvaW5UeXBlLFxuICAgICAgbGVmdDogcmV1c2FibGUgPyBsZWZ0IDogbnVsbCxcbiAgICAgIHJpZ2h0OiByZXVzYWJsZSA/IHJpZ2h0IDogbnVsbCxcbiAgICAgIHJldXNhYmxlLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzc2VydENvcnJlbGF0aW9uQXZhaWxhYmxlKHJlcXVlc3RlZDogSm9pblJlZ2lzdHJhdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LmdldChyZXF1ZXN0ZWQuYWxpYXMpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgaWYgKHRoaXMuaXNTYW1lSm9pblJlZ2lzdHJhdGlvbihleGlzdGluZywgcmVxdWVzdGVkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEpvaW4gYWxpYXMgXCIke3JlcXVlc3RlZC5hbGlhc31cIiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuIFVzZSBlbnN1cmVKb2luKCkgb3IgZW5zdXJlTGVmdEpvaW4oKSB0byByZXVzZSBhbiBpZGVudGljYWwgam9pbi5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhyb3cgdGhpcy5jcmVhdGVKb2luQ29uZmxpY3RFcnJvcihleGlzdGluZywgcmVxdWVzdGVkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzU2FtZUpvaW5SZWdpc3RyYXRpb24oXG4gICAgZXhpc3Rpbmc6IENvcnJlbGF0aW9uUmVnaXN0cmF0aW9uLFxuICAgIHJlcXVlc3RlZDogSm9pblJlZ2lzdHJhdGlvbixcbiAgKTogZXhpc3RpbmcgaXMgSm9pblJlZ2lzdHJhdGlvbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGV4aXN0aW5nLmtpbmQgPT09IFwiam9pblwiICYmXG4gICAgICBleGlzdGluZy5yZXVzYWJsZSAmJlxuICAgICAgcmVxdWVzdGVkLnJldXNhYmxlICYmXG4gICAgICBleGlzdGluZy50YWJsZSA9PT0gcmVxdWVzdGVkLnRhYmxlICYmXG4gICAgICBleGlzdGluZy5qb2luVHlwZSA9PT0gcmVxdWVzdGVkLmpvaW5UeXBlICYmXG4gICAgICBleGlzdGluZy5sZWZ0ID09PSByZXF1ZXN0ZWQubGVmdCAmJlxuICAgICAgZXhpc3RpbmcucmlnaHQgPT09IHJlcXVlc3RlZC5yaWdodFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUpvaW5Db25mbGljdEVycm9yKFxuICAgIGV4aXN0aW5nOiBDb3JyZWxhdGlvblJlZ2lzdHJhdGlvbixcbiAgICByZXF1ZXN0ZWQ6IEpvaW5SZWdpc3RyYXRpb24sXG4gICk6IEVycm9yIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFxuICAgICAgW1xuICAgICAgICBgSm9pbiBhbGlhcyBcIiR7cmVxdWVzdGVkLmFsaWFzfVwiIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIGEgZGlmZmVyZW50IGRlZmluaXRpb24uYCxcbiAgICAgICAgYEV4aXN0aW5nOiAke3RoaXMuZm9ybWF0Q29ycmVsYXRpb25SZWdpc3RyYXRpb24oZXhpc3RpbmcpfWAsXG4gICAgICAgIGBSZXF1ZXN0ZWQ6ICR7dGhpcy5mb3JtYXRDb3JyZWxhdGlvblJlZ2lzdHJhdGlvbihyZXF1ZXN0ZWQpfWAsXG4gICAgICBdLmpvaW4oXCJcXG5cIiksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0Q29ycmVsYXRpb25SZWdpc3RyYXRpb24ocmVnaXN0cmF0aW9uOiBDb3JyZWxhdGlvblJlZ2lzdHJhdGlvbik6IHN0cmluZyB7XG4gICAgaWYgKHJlZ2lzdHJhdGlvbi5raW5kID09PSBcImZyb21cIikge1xuICAgICAgcmV0dXJuIGBGUk9NICR7cmVnaXN0cmF0aW9uLnRhYmxlID8/IFwic3VicXVlcnlcIn0gQVMgJHtyZWdpc3RyYXRpb24uYWxpYXN9YDtcbiAgICB9XG5cbiAgICBjb25zdCBqb2luS2V5d29yZCA9IHJlZ2lzdHJhdGlvbi5qb2luVHlwZSA9PT0gXCJqb2luXCIgPyBcIkpPSU5cIiA6IFwiTEVGVCBKT0lOXCI7XG4gICAgY29uc3Qgc291cmNlID0gcmVnaXN0cmF0aW9uLnRhYmxlID8/IFwib3BhcXVlIHNvdXJjZVwiO1xuICAgIGNvbnN0IGNvbmRpdGlvbiA9IHJlZ2lzdHJhdGlvbi5yZXVzYWJsZVxuICAgICAgPyBgIE9OICR7cmVnaXN0cmF0aW9uLmxlZnR9ID0gJHtyZWdpc3RyYXRpb24ucmlnaHR9YFxuICAgICAgOiBcIiB3aXRoIG9wYXF1ZSBjb25kaXRpb25cIjtcbiAgICByZXR1cm4gYCR7am9pbktleXdvcmR9ICR7c291cmNlfSBBUyAke3JlZ2lzdHJhdGlvbi5hbGlhc30ke2NvbmRpdGlvbn1gO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckpvaW5SZWdpc3RyYXRpb25zKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW2FsaWFzLCByZWdpc3RyYXRpb25dIG9mIHRoaXMuY29ycmVsYXRpb25SZWdpc3RyeSkge1xuICAgICAgaWYgKHJlZ2lzdHJhdGlvbi5raW5kID09PSBcImpvaW5cIikge1xuICAgICAgICB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkuZGVsZXRlKGFsaWFzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEtuZXhKb2luQWxpYXM8VmFsdWU+KHRhYmxlOiBWYWx1ZSk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmIChpc1N0cmluZ1ZhbHVlKHRhYmxlKSkge1xuICAgICAgcmV0dXJuIHRhYmxlO1xuICAgIH1cbiAgICBpZiAoaXNPYmplY3RWYWx1ZSh0YWJsZSkgJiYgdGFibGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChcbiAgICAgICAgXCJfc2luZ2xlXCIgaW4gdGFibGUgJiZcbiAgICAgICAgaXNPYmplY3RWYWx1ZSh0YWJsZVtcIl9zaW5nbGVcIl0pICYmXG4gICAgICAgIHRhYmxlW1wiX3NpbmdsZVwiXSAhPT0gbnVsbCAmJlxuICAgICAgICBcImFzXCIgaW4gdGFibGVbXCJfc2luZ2xlXCJdICYmXG4gICAgICAgIGlzU3RyaW5nVmFsdWUodGFibGVbXCJfc2luZ2xlXCJdLmFzKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0YWJsZVtcIl9zaW5nbGVcIl0uYXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXModGFibGUpWzBdID8/IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gV0hFUkU6IOqwneyytCAtIOyCrOyaqTogLndoZXJlKHsgXCJ1LmlkXCI6IDEsIFwidS5zdGF0dXNcIjogXCJhY3RpdmVcIiB9KVxuICB3aGVyZShjb25kaXRpb25zOiBXaGVyZUNvbmRpdGlvbjxUVGFibGVzPik6IHRoaXM7XG4gIC8vIFdIRVJFOiDsu6zrn7wgLSDsgqzsmqk6IC53aGVyZShcInUuaWRcIiwgMSksIC53aGVyZShcInUuaWRcIiwgbnVsbClcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIFdIRVJFOiDsu6zrn7wgLSDsgqzsmqk6IC53aGVyZShcInUuaWRcIiwgXCI+XCIsIDEwKSwgLndoZXJlKFwidS5pZFwiLCBcIiE9XCIsIG51bGwpXG4gIHdoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgb3BlcmF0b3I6IFdoZXJlT3BlcmF0b3IsXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBXSEVSRTogU1FMIO2RnO2YhOyLnSAtIOyCrOyaqTogLndoZXJlKHB1cmkucmF3KFwiQ09OQ0FUKHUubmFtZSwgdS5lbWFpbClcIiksIFwibGlrZVwiLCBcIiV0ZXN0JVwiKVxuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgS25leC5SYXc+KGNvbHVtbjogVENvbHVtbiwgb3BlcmF0b3I6IFdoZXJlT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICAvLyBXSEVSRTog7Lus65+8IC0g7IKs7JqpOiAud2hlcmUoXCJ1LmlkXCIsIFwibGlrZVwiLCBcIiV0ZXN0JVwiKVxuICB3aGVyZSguLi5hcmdzOiBbY29sdW1uT3JDb25kaXRpb25zOiBhbnksIG9wZXJhdG9yT3JWYWx1ZT86IGFueSwgdmFsdWU/OiBhbnldKTogdGhpcyB7XG4gICAgY29uc3QgW2NvbHVtbk9yQ29uZGl0aW9ucywgb3BlcmF0b3JPclZhbHVlLCB2YWx1ZV0gPSBhcmdzO1xuICAgIGlmIChpc09iamVjdFZhbHVlKGNvbHVtbk9yQ29uZGl0aW9ucykpIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKGNvbHVtbk9yQ29uZGl0aW9ucyk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAob3BlcmF0b3JPclZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTnVsbChjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKGNvbHVtbk9yQ29uZGl0aW9ucywgb3BlcmF0b3JPclZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBpZiAob3BlcmF0b3JPclZhbHVlID09PSBcIiE9XCIpIHtcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU5vdE51bGwoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvck9yVmFsdWUgPT09IFwiPVwiKSB7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVOdWxsKGNvbHVtbk9yQ29uZGl0aW9ucyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKGNvbHVtbk9yQ29uZGl0aW9ucywgb3BlcmF0b3JPclZhbHVlLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKGNvbHVtbk9yQ29uZGl0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgSU5cbiAgd2hlcmVJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogKEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+ICYgS25leC5WYWx1ZSlbXSxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0PiB7XG4gICAgLy8gS25leOydmCDruYTslrQg7J6I64qUIElOIOuwsOyXtCDsspjrpqzsmYAg64+Z7J287ZWY6rKMIO2VreyDgSDqsbDsp5Psnbgg7KGw6rG07J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoXCIxID0gMFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gdmFsdWVzLm1hcCgoKSA9PiBcIj9cIikuam9pbihcIiwgXCIpO1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYD8/IGluICgke3BsYWNlaG9sZGVyc30pYCwgW1N0cmluZyhjb2x1bW4pLCAuLi52YWx1ZXNdKTtcbiAgICB9XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBXSEVSRSBOT1QgSU5cbiAgd2hlcmVOb3RJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogKEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+ICYgS25leC5WYWx1ZSlbXSxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0PiB7XG4gICAgLy8gS25leOydmCDruYTslrQg7J6I64qUIE5PVCBJTiDrsLDsl7Qg7LKY66as7JmAIOuPmeydvO2VmOqyjCDtla3sg4Eg7LC47J24IOyhsOqxtOydhCDsg53shLHtlanri4jri6QuXG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KFwiMSA9IDFcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IHZhbHVlcy5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGA/PyBub3QgaW4gKCR7cGxhY2Vob2xkZXJzfSlgLCBbU3RyaW5nKGNvbHVtbiksIC4uLnZhbHVlc10pO1xuICAgIH1cbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8vIFdIRVJFIEpTT05CIFNVUEVSU0VUIChAPilcbiAgd2hlcmVKc29uU3VwZXJzZXRPZjxUQ29sdW1uIGV4dGVuZHMgSnNvbkNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogSnNvblN1cGVyc2V0VmFsdWU8RXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbj4+LFxuICApOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZUpzb25TdXBlcnNldE9mKGNvbHVtbiwgc2VyaWFsaXplSnNvblN1cGVyc2V0VmFsdWUodmFsdWUpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIE1BVENIXG4gIHdoZXJlTWF0Y2g8VENvbHVtbiBleHRlbmRzIEZ1bGx0ZXh0Q29sdW1uczxUVGFibGVzPj4oY29sdW1uOiBUQ29sdW1uLCB2YWx1ZTogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYE1BVENIICgke1N0cmluZyhjb2x1bW4pfSkgQUdBSU5TVCAoPylgLCBbdmFsdWVdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQR3Jvb25nYSBGdWxsVGV4dCDsnbjrjbHsiqQg6rKA7IOJXG4gICAqIC0g7IKs7Jqp7ZWgIFBHcm9vbmdhIOyduOuNseyKpOyZgCDrj5nsnbztlZwg7Lus65+8IOq1rOyEseycvOuhnCDqsoDsg4ntlbTslbwg7J24642x7Iqk6rCAIOyCrOyaqeuQqeuLiOuLpC5cbiAgICpcbiAgICog64uo7J28IOy7rOufvCDqsoDsg4k6XG4gICAqIGBgYHNxbFxuICAgKiBXSEVSRSBuYW1lICZAfiAnc2VhcmNoJ1xuICAgKiBgYGBcbiAgICpcbiAgICog67O17ZWpIOy7rOufvCDqsoDsg4k6XG4gICAqIGBgYHNxbFxuICAgKiBXSEVSRSBBUlJBWVtuYW1lOjp0ZXh0LCBkZXNjcmlwdGlvbjo6dGV4dF0gJkB+ICdzZWFyY2gnXG4gICAqIGBgYFxuICAgKi9cbiAgd2hlcmVTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbiB8IFRDb2x1bW5bXSxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICB3ZWlnaHRzPzogbnVtYmVyW107IC8vIOygleyImCDrsLDsl7RcbiAgICB9LFxuICApOiB0aGlzIHtcbiAgICBjb25zdCB7IHdlaWdodHMgfSA9IG9wdGlvbnMgPz8ge307XG4gICAgY29uc3QgY29sdW1uRXhwciA9IEFycmF5LmlzQXJyYXkoY29sdW1uKVxuICAgICAgPyBgQVJSQVlbJHtjb2x1bW4ubWFwKChjKSA9PiBgJHtjfTo6dGV4dGApLmpvaW4oXCIsXCIpfV1gXG4gICAgICA6IGNvbHVtbjtcbiAgICBjb25zdCBwZ3Jvb25nYUNvbmRpdGlvbiA9IGBwZ3Jvb25nYV9jb25kaXRpb24oPyR7d2VpZ2h0cz8ubGVuZ3RoID8gYCwgd2VpZ2h0cyA9PiBBUlJBWVske3dlaWdodHMuam9pbihcIixcIil9XWAgOiBcIlwifSlgO1xuXG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYCR7Y29sdW1uRXhwcn0gJkB+ICR7cGdyb29uZ2FDb25kaXRpb259YCwgW3ZhbHVlXSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIEZVTExURVhUXG4gIHdoZXJlVHNTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNRdWVyeU9wdGlvbnMgfCBUc1F1ZXJ5Q29uZmlnLFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBvcHRzID1cbiAgICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICBpc1N0cmluZ1ZhbHVlKG9wdGlvbnMpID8gKHsgY29uZmlnOiBvcHRpb25zIH0gYXMgVHNRdWVyeU9wdGlvbnMpIDogKG9wdGlvbnMgPz8ge30pO1xuXG4gICAgY29uc3QgcGFyc2VyID0gb3B0cy5wYXJzZXIgPz8gXCJ3ZWJzZWFyY2hfdG9fdHNxdWVyeVwiO1xuICAgIGNvbnN0IGNvbmZpZyA9IG9wdHMuY29uZmlnID8/IFwic2ltcGxlXCI7XG4gICAgY29uc3QgY29sdW1uRXhwciA9XG4gICAgICBpc1NxbEV4cHJlc3Npb24oY29sdW1uKSAmJiBjb2x1bW5bXCJfdHlwZVwiXSA9PT0gXCJzcWxfZXhwcmVzc2lvblwiXG4gICAgICAgID8gY29sdW1uW1wiX3NxbFwiXVxuICAgICAgICA6IFN0cmluZyhjb2x1bW4pO1xuXG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYCR7Y29sdW1uRXhwcn0gQEAgJHtwYXJzZXJ9KD8sID8pYCwgW2NvbmZpZywgdmFsdWVdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHdoZXJlRnV6enk8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgb3BlcmF0b3I/OiBGdXp6eU9wZXJhdG9yO1xuICAgIH0sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IG9wZXJhdG9yID0gcGFyc2VGdXp6eU9wZXJhdG9yKG9wdGlvbnM/Lm9wZXJhdG9yKTtcblxuICAgIGlmIChvcGVyYXRvciA9PT0gXCIlXCIpIHtcbiAgICAgIGlmIChpc1NxbEV4cHJlc3Npb24oY29sdW1uKSkge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgJHtjb2x1bW5bXCJfc3FsXCJdfSAke29wZXJhdG9yfSA/YCwgWy4uLmNvbHVtbltcIl9wYXJhbXNcIl0sIHZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgPz8gJHtvcGVyYXRvcn0gP2AsIFtjb2x1bW4sIHZhbHVlXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAoaXNTcWxFeHByZXNzaW9uKGNvbHVtbikpIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGA/ICR7b3BlcmF0b3J9ICR7Y29sdW1uW1wiX3NxbFwiXX1gLCBbdmFsdWUsIC4uLmNvbHVtbltcIl9wYXJhbXNcIl1dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gPz9gLCBbdmFsdWUsIGNvbHVtbl0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIFJBV1xuICB3aGVyZVJhdyhzcWw6IHN0cmluZywgYmluZGluZ3M/OiByZWFkb25seSBLbmV4LlJhd0JpbmRpbmdbXSk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KHNxbCwgYmluZGluZ3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUg6rSE7Zi4IOq3uOujue2VkVxuICB3aGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKChidWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KGJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soZ3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9yV2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5vcldoZXJlKChidWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KGJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soZ3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gT1JERVIgQlkgKFNxbEV4cHJlc3Npb27snLzroZzrj4Qg7ZWgIOyImCDsnojslrTslbwg7ZWoKVxuICBvcmRlckJ5PFRDb2x1bW4gZXh0ZW5kcyBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW46IFRDb2x1bW4gfCBQdXJpT3JkZXJCeUV4cHJlc3Npb24sXG4gICAgZGlyZWN0aW9uPzogUHVyaU9yZGVyQnlEaXJlY3Rpb24sXG4gICAgbnVsbHM/OiBQdXJpT3JkZXJCeU51bGxzLFxuICApOiB0aGlzO1xuICBvcmRlckJ5PFRDb2x1bW4gZXh0ZW5kcyBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW5zOiByZWFkb25seSBQdXJpT3JkZXJCeUVudHJ5PFRDb2x1bW4+W10sXG4gICk6IHRoaXM7XG4gIG9yZGVyQnkoXG4gICAgY29sdW1uT3JDb2x1bW5zOiBzdHJpbmcgfCBQdXJpT3JkZXJCeUV4cHJlc3Npb24gfCByZWFkb25seSBQdXJpT3JkZXJCeVJ1bnRpbWVFbnRyeVtdLFxuICAgIGRpcmVjdGlvbjogUHVyaU9yZGVyQnlEaXJlY3Rpb24gPSBcImFzY1wiLFxuICAgIG51bGxzPzogUHVyaU9yZGVyQnlOdWxscyxcbiAgKTogdGhpcyB7XG4gICAgaWYgKGlzT3JkZXJCeUVudHJpZXMoY29sdW1uT3JDb2x1bW5zKSkge1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBjb2x1bW5PckNvbHVtbnMpIHtcbiAgICAgICAgaWYgKGlzU3RyaW5nVmFsdWUoZW50cnkpIHx8IGlzU3FsRXhwcmVzc2lvbihlbnRyeSkpIHtcbiAgICAgICAgICB0aGlzLmFwcGx5T3JkZXJCeShlbnRyeSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hcHBseU9yZGVyQnkoZW50cnkuY29sdW1uLCBlbnRyeS5vcmRlciwgZW50cnkubnVsbHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLmFwcGx5T3JkZXJCeShjb2x1bW5PckNvbHVtbnMsIGRpcmVjdGlvbiwgbnVsbHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseU9yZGVyQnkoXG4gICAgY29sdW1uOiBzdHJpbmcgfCBQdXJpT3JkZXJCeUV4cHJlc3Npb24sXG4gICAgZGlyZWN0aW9uPzogUHVyaU9yZGVyQnlEaXJlY3Rpb24sXG4gICAgbnVsbHM/OiBQdXJpT3JkZXJCeU51bGxzLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBub3JtYWxpemVkRGlyZWN0aW9uID0gbm9ybWFsaXplT3JkZXJCeURpcmVjdGlvbihkaXJlY3Rpb24pO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROdWxscyA9IG5vcm1hbGl6ZU9yZGVyQnlOdWxscyhudWxscyk7XG5cbiAgICBpZiAoaXNTcWxFeHByZXNzaW9uKGNvbHVtbikpIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9yZGVyQnlSYXcoXG4gICAgICAgIGAke2NvbHVtbltcIl9zcWxcIl19ICR7bm9ybWFsaXplZERpcmVjdGlvbn0ke2Zvcm1hdE51bGxzU3VmZml4KG5vcm1hbGl6ZWROdWxscyl9YCxcbiAgICAgICAgY29sdW1uW1wiX3BhcmFtc1wiXSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9yZGVyQnkoY29sdW1uLCBub3JtYWxpemVkRGlyZWN0aW9uLCBub3JtYWxpemVkTnVsbHMpO1xuICAgIH1cbiAgfVxuXG4gIGZvclVwZGF0ZSgpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5mb3JVcGRhdGUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZvclNoYXJlKCk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LmZvclNoYXJlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog67Kh7YSwIOycoOyCrOuPhCDqsoDsg4kg7ISk7KCVXG4gICAqXG4gICAqIC0gU0VMRUNU7JeQIHNpbWlsYXJpdHkg7Lus65+8IOy2lOqwgFxuICAgKiAtIFdIRVJFIGNvbCBJUyBOT1QgTlVMTCDstpTqsIBcbiAgICogLSB0aHJlc2hvbGTqsIAg7J6I7Jy866m0IFdIRVJFIOyhsOqxtCDstpTqsIBcbiAgICogLSDquLDsobQgT1JERVIgQlnrpbwgY2xlYXLtlZjqs6Ag7JuQ7IucIOyXsOyCsOyekOuhnCDsoJXroKwgKEhOU1cg7J24642x7IqkIOy1nOygge2ZlClcbiAgICpcbiAgICogQHBhcmFtIGNvbHVtbiDrsqHthLAg7Lus65+8IOqyveuhnFxuICAgKiBAcGFyYW0gZW1iZWRkaW5nIOy/vOumrCDsnoTrsqDrlKkg67Kh7YSwXG4gICAqIEBwYXJhbSBvcHRpb25zIG1ldGhvZCwgdGhyZXNob2xkLCBhcyDrk7Eg7Ji17IWYXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gY29zaW5lIHNpbWlsYXJpdHkgKOq4sOuzuOqwkilcbiAgICogcWIudmVjdG9yU2ltaWxhcml0eShcImNvbHVtbk5hbWVcIiwgcXVlcnlWZWN0b3IsIHtcbiAgICogICBtZXRob2Q6IFwiY29zaW5lXCIsXG4gICAqICAgdGhyZXNob2xkOiAwLjVcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIEwyIGRpc3RhbmNlXG4gICAqIHFiLnZlY3RvclNpbWlsYXJpdHkoXCJjb2x1bW5OYW1lXCIsIHF1ZXJ5VmVjdG9yLCB7XG4gICAqICAgbWV0aG9kOiBcImwyXCIsXG4gICAqICAgdGhyZXNob2xkOiAxLjUgIC8vIOqxsOumrOqwgCAxLjUg7J207ZWY7J24IOqysOqzvOunjFxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gSW5uZXIgcHJvZHVjdFxuICAgKiBxYi52ZWN0b3JTaW1pbGFyaXR5KFwiY29sdW1uTmFtZVwiLCBxdWVyeVZlY3Rvciwge1xuICAgKiAgIG1ldGhvZDogXCJpbm5lcl9wcm9kdWN0XCIsXG4gICAqICAgdGhyZXNob2xkOiAwLjdcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgdmVjdG9yU2ltaWxhcml0eShcbiAgICBjb2x1bW46IFZlY3RvckNvbHVtbnM8VFRhYmxlcz4sXG4gICAgZW1iZWRkaW5nOiBudW1iZXJbXSxcbiAgICBvcHRpb25zOiB7XG4gICAgICBtZXRob2Q/OiBcImNvc2luZVwiIHwgXCJsMlwiIHwgXCJpbm5lcl9wcm9kdWN0XCI7XG4gICAgICB0aHJlc2hvbGQ/OiBudW1iZXI7XG4gICAgICBkaXN0aW5jdE9uPzogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPjtcbiAgICB9ID0ge30sXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdCAmIHsgc2ltaWxhcml0eTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB7IG1ldGhvZCA9IFwiY29zaW5lXCIsIHRocmVzaG9sZCwgZGlzdGluY3RPbiB9ID0gb3B0aW9ucztcblxuICAgIGlmIChcbiAgICAgICFBcnJheS5pc0FycmF5KGVtYmVkZGluZykgfHxcbiAgICAgIGVtYmVkZGluZy5sZW5ndGggPT09IDAgfHxcbiAgICAgIGVtYmVkZGluZy5zb21lKCh2KSA9PiAhTnVtYmVyLmlzRmluaXRlKHYpKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBlbWJlZGRpbmcgdmVjdG9yOiBleHBlY3RlZCBhIG5vbi1lbXB0eSBhcnJheSBvZiBmaW5pdGUgbnVtYmVyc1wiKTtcbiAgICB9XG5cbiAgICBjb25zdCB2ZWN0b3JMaXRlcmFsID0gSlNPTi5zdHJpbmdpZnkoZW1iZWRkaW5nLm1hcCgodikgPT4gTnVtYmVyKHYpKSk7XG4gICAgY29uc3Qgb3BlcmF0b3IgPSB7IGNvc2luZTogXCI8PT5cIiwgbDI6IFwiPC0+XCIsIGlubmVyX3Byb2R1Y3Q6IFwiPCM+XCIgfVttZXRob2RdO1xuXG4gICAgLy8gbWV0aG9k67OEIOyXsOyCsOyekCDrsI8gc2ltaWxhcml0eSDqs4TsgrDsi51cbiAgICAvLyAtIGNvc2luZTogPD0+IChjb3NpbmUgZGlzdGFuY2UsIDB+MiksIHNpbWlsYXJpdHkgPSAxIC0gZGlzdGFuY2VcbiAgICAvLyAtIGwyOiA8LT4gKGV1Y2xpZGVhbiBkaXN0YW5jZSksIHNpbWlsYXJpdHkgPSBkaXN0YW5jZSAo64Ku7J2E7IiY66GdIOycoOyCrClcbiAgICAvLyAtIGlubmVyX3Byb2R1Y3Q6IDwjPiAobmVnYXRpdmUgaW5uZXIgcHJvZHVjdCksIHNpbWlsYXJpdHkgPSAtZGlzdGFuY2UgKOuGkuydhOyImOuhnSDsnKDsgqwpXG4gICAgY29uc3Qgc2ltaWxhcml0eUV4cHIgPVxuICAgICAgbWV0aG9kID09PSBcImNvc2luZVwiXG4gICAgICAgID8gdGhpcy5rbmV4LnJhdyhgMSAtICg/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IpIGFzIHNpbWlsYXJpdHlgLCBbY29sdW1uLCB2ZWN0b3JMaXRlcmFsXSlcbiAgICAgICAgOiBtZXRob2QgPT09IFwibDJcIlxuICAgICAgICAgID8gdGhpcy5rbmV4LnJhdyhgPz8gJHtvcGVyYXRvcn0gPzo6dmVjdG9yIGFzIHNpbWlsYXJpdHlgLCBbY29sdW1uLCB2ZWN0b3JMaXRlcmFsXSlcbiAgICAgICAgICA6IHRoaXMua25leC5yYXcoYC0oPz8gJHtvcGVyYXRvcn0gPzo6dmVjdG9yKSBhcyBzaW1pbGFyaXR5YCwgW2NvbHVtbiwgdmVjdG9yTGl0ZXJhbF0pO1xuXG4gICAgLy8gV0hFUkUgTk9UIE5VTExcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU5vdE51bGwoY29sdW1uKTtcblxuICAgIC8vIOq4sOyhtCBPUkRFUiBCWSBjbGVhclxuICAgIHRoaXMua25leFF1ZXJ5LmNsZWFyKFwib3JkZXJcIik7XG4gICAgaWYgKGRpc3RpbmN0T24pIHtcbiAgICAgIC8vIERJU1RJTkNUIE9O7J2AIFNFTEVDVCDsoIjsnZgg66eoIOyVnuyXkCDsmYDslbwg7ZWY66+A66GcLCDquLDsobQgc2VsZWN0KHN1YnNldCDtlYTrk5zrk6Qp66W8IOuztOyhtCDtm4QgY2xlYXLtlZjqs6Ag64uk7IucIOy2lOqwgFxuICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIGNvbnN0IGV4aXN0aW5nU3Vic2V0Q29scyA9ICh0aGlzLmtuZXhRdWVyeSBhcyBhbnkpW1wiX3N0YXRlbWVudHNcIl1cbiAgICAgICAgLmZpbHRlcigoczogYW55KSA9PiBzLmdyb3VwaW5nID09PSBcImNvbHVtbnNcIilcbiAgICAgICAgLmZsYXRNYXAoKHM6IGFueSkgPT4gcy52YWx1ZSk7XG4gICAgICB0aGlzLmtuZXhRdWVyeS5jbGVhcihcInNlbGVjdFwiKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdCh0aGlzLmtuZXgucmF3KGBESVNUSU5DVCBPTiAoPz8pID8/YCwgW2Rpc3RpbmN0T24sIGRpc3RpbmN0T25dKSk7XG4gICAgICBleGlzdGluZ1N1YnNldENvbHMubWFwKChjb2w6IGFueSkgPT4gdGhpcy5rbmV4UXVlcnkuc2VsZWN0KGNvbCkpO1xuICAgICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KHNpbWlsYXJpdHlFeHByKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9yZGVyQnlSYXcoYD8/LCA/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3JgLCBbXG4gICAgICAgIGRpc3RpbmN0T24sXG4gICAgICAgIGNvbHVtbixcbiAgICAgICAgdmVjdG9yTGl0ZXJhbCxcbiAgICAgIF0pO1xuXG4gICAgICB0aGlzLmtuZXhRdWVyeSA9IHRoaXMua25leFxuICAgICAgICAuZnJvbSh0aGlzLmtuZXhRdWVyeS5hcyhcImRpc3RpbmN0X3ZlY3RvcnNcIikpXG4gICAgICAgIC5zZWxlY3QoXCIqXCIpXG4gICAgICAgIC5vcmRlckJ5KFwic2ltaWxhcml0eVwiLCBcImRlc2NcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdChzaW1pbGFyaXR5RXhwcik7XG4gICAgICB0aGlzLmtuZXhRdWVyeS5vcmRlckJ5UmF3KGA/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3JgLCBbY29sdW1uLCB2ZWN0b3JMaXRlcmFsXSk7XG4gICAgfVxuXG4gICAgLy8gdGhyZXNob2xkXG4gICAgaWYgKGlzTnVtYmVyVmFsdWUodGhyZXNob2xkKSkge1xuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodGhyZXNob2xkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmVjdG9yU2ltaWxhcml0eSB0aHJlc2hvbGQ6ICR7dGhyZXNob2xkfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlzdGluY3RPbikge1xuICAgICAgICBjb25zdCB0aHJlc2hvbGRPcCA9IG1ldGhvZCA9PT0gXCJsMlwiID8gXCI8PVwiIDogXCI+PVwiO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShcInNpbWlsYXJpdHlcIiwgdGhyZXNob2xkT3AsIHRocmVzaG9sZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0aHJlc2hvbGRWYWx1ZSA9XG4gICAgICAgICAgbWV0aG9kID09PSBcImNvc2luZVwiID8gMSAtIHRocmVzaG9sZCA6IG1ldGhvZCA9PT0gXCJpbm5lcl9wcm9kdWN0XCIgPyAtdGhyZXNob2xkIDogdGhyZXNob2xkO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgPz8gJHtvcGVyYXRvcn0gPzo6dmVjdG9yIDw9ID9gLCBbXG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIHZlY3RvckxpdGVyYWwsXG4gICAgICAgICAgdGhyZXNob2xkVmFsdWUsXG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8g6riw67O4IOy/vOumrCDrqZTshJzrk5zrk6RcbiAgbGltaXQoY291bnQ6IG51bWJlcik6IHRoaXMge1xuICAgIGlmIChjb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbGltaXQ6IG11c3QgYmUgPj0gMFwiKTtcbiAgICB9XG4gICAgdGhpcy5rbmV4UXVlcnkubGltaXQoY291bnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb2Zmc2V0KGNvdW50OiBudW1iZXIpOiB0aGlzIHtcbiAgICBpZiAoY291bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG9mZnNldDogbXVzdCBiZSA+PSAwXCIpO1xuICAgIH1cbiAgICB0aGlzLmtuZXhRdWVyeS5vZmZzZXQoY291bnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gR1JPVVAgQllcbiAgZ3JvdXBCeTxUQ29sdW1ucyBleHRlbmRzIFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcywgVFJlc3VsdD4+KC4uLmNvbHVtbnM6IFRDb2x1bW5zW10pOiB0aGlzO1xuICBncm91cEJ5KC4uLmNvbHVtbnM6IHN0cmluZ1tdKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkuZ3JvdXBCeSguLi5jb2x1bW5zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEhBVklOR1xuICBoYXZpbmcoY29uZGl0aW9uOiBzdHJpbmcpOiB0aGlzO1xuICBoYXZpbmc8VENvbHVtbiBleHRlbmRzIFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcywgVFJlc3VsdD4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHZhbHVlOiBhbnksXG4gICk6IHRoaXM7XG4gIC8vIEhBVklORyDqtaztmIRcbiAgaGF2aW5nKC4uLmNvbmRpdGlvbnM6IGFueVtdKTogdGhpcyB7XG4gICAgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAvLyBoYXZpbmcoXCJDT1VOVCgqKSA+IDEwXCIpXG4gICAgICB0aGlzLmtuZXhRdWVyeS5oYXZpbmcodGhpcy5rbmV4LnJhdyhjb25kaXRpb25zWzBdKSk7XG4gICAgfSBlbHNlIGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMykge1xuICAgICAgLy8gaGF2aW5nKFwiY291bnRcIiwgXCI+XCIsIDEwKVxuICAgICAgdGhpcy5rbmV4UXVlcnkuaGF2aW5nKFxuICAgICAgICB0aGlzLmtuZXgucmF3KGNvbmRpdGlvbnNbMF0pLFxuICAgICAgICBjb25kaXRpb25zWzFdLFxuICAgICAgICB0aGlzLmtuZXgucmF3KGNvbmRpdGlvbnNbMl0pLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBoYXZpbmcgYXJndW1lbnRzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOyLpO2WiSDrqZTshJzrk5zrk6QgLSB0aGVuYWJsZSDqtaztmIRcbiAgdGhlbjxUUmVzdWx0MSA9IEV4cGFuZDxUUmVzdWx0PltdLCBUUmVzdWx0MiA9IG5ldmVyPihcbiAgICBvbmZ1bGZpbGxlZD86ICgodmFsdWU6IEV4cGFuZDxUUmVzdWx0PltdKSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPikgfCBudWxsLFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCBudWxsLFxuICApOiBQcm9taXNlPFRSZXN1bHQxIHwgVFJlc3VsdDI+IHtcbiAgICBOYWl0ZS50KFwicHVyaTpleGVjdXRlZC1xdWVyeVwiLCB0aGlzLnRvUXVlcnkoKSk7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkudGhlbihvbmZ1bGZpbGxlZCBhcyBhbnksIG9ucmVqZWN0ZWQpO1xuICB9XG4gIGNhdGNoPFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCBudWxsLFxuICApOiBQcm9taXNlPFRSZXN1bHQgfCBUUmVzdWx0Mj4ge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS5jYXRjaChvbnJlamVjdGVkKTtcbiAgfVxuICBmaW5hbGx5KG9uZmluYWxseT86ICgoKSA9PiB2b2lkKSB8IG51bGwpOiBQcm9taXNlPFRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkuZmluYWxseShvbmZpbmFsbHkpO1xuICB9XG5cbiAgLy8g7ZWY64KY66eMIOy/vOumrFxuICBmaXJzdCgpOiBSZXNvbHZlZFB1cmk8RXhwYW5kPFRSZXN1bHQ+LCBuZXZlcj4ge1xuICAgIHRoaXMua25leFF1ZXJ5LmZpcnN0KCk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCwgdGhpcy50YWJsZVNwZWMpO1xuICB9XG5cbiAgLy8g7L+866as7ZWcIOugiOy9lOuTnOyXkOyEnCDtirnsoJUg7Lus65+866eMIOy2lOy2nO2VnCDrsLDsl7Qg66as7YS0XG4gIHBsdWNrPFRDb2x1bW4gZXh0ZW5kcyBrZXlvZiBUUmVzdWx0IHwgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICApOiBSZXNvbHZlZFB1cmk8XG4gICAgVENvbHVtbiBleHRlbmRzIGtleW9mIFRSZXN1bHRcbiAgICAgID8gVFJlc3VsdFtUQ29sdW1uXVtdXG4gICAgICA6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+W10sXG4gICAgbmV2ZXJcbiAgPiB7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICB0aGlzLmtuZXhRdWVyeS5wbHVjayhjb2x1bW4gYXMgc3RyaW5nKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4LCB0aGlzLnRhYmxlU3BlYyk7XG4gIH1cblxuICAvLyBJTlNFUlQgOiDri6jsnbwg6rCd7LK0XG4gIGluc2VydChcbiAgICBkYXRhOiBJbnNlcnREYXRhPFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+LFxuICApOiBSZXNvbHZlZFB1cmk8SW5zZXJ0UmVzdWx0LCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PjtcbiAgLy8gSU5TRVJUOiDrsLDsl7RcbiAgaW5zZXJ0KFxuICAgIGRhdGE6IEluc2VydERhdGE8U2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj5bXSxcbiAgKTogUmVzb2x2ZWRQdXJpPEluc2VydFJlc3VsdCwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj47XG4gIC8vIElOU0VSVCDsi6TsoJwg6rWs7ZiEXG4gIGluc2VydChcbiAgICByYXdEYXRhOiBJbnNlcnREYXRhPFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+IHwgSW5zZXJ0RGF0YTxTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PltdLFxuICApOiBSZXNvbHZlZFB1cmk8SW5zZXJ0UmVzdWx0LCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgLy8gSlNPTiDsu6zrn7wgc3RyaW5naWZ5IOuhnOyngeydhCDrqZTshJzrk5zroZwg67aE66as7ZWY7JesIOykkeuztSDsoJzqsbBcbiAgICBjb25zdCByZWZpbmVkRGF0YSA9IHRoaXMucmVmaW5lSnNvbkNvbHVtbnMocmF3RGF0YSk7XG4gICAgdGhpcy5rbmV4UXVlcnkuaW5zZXJ0KHJlZmluZWREYXRhKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4LCB0aGlzLnRhYmxlU3BlYyk7XG4gIH1cblxuICAvLyBVUERBVEVcbiAgdXBkYXRlKHJhd0RhdGE6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIC8vIEpTT04g7Lus65+8IHN0cmluZ2lmeSDroZzsp4HsnYQg66mU7ISc65Oc66GcIOu2hOumrO2VmOyXrCDspJHrs7Ug7KCc6rGwXG4gICAgY29uc3QgcmVmaW5lZERhdGEgPSB0aGlzLnJlZmluZUpzb25Db2x1bW5zKHJhd0RhdGEpO1xuICAgIHRoaXMua25leFF1ZXJ5LnVwZGF0ZShyZWZpbmVkRGF0YSk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCwgdGhpcy50YWJsZVNwZWMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04g7Lus65+87JeQIOuMgO2VtCBzdHJpbmdpZnkg7LKY66as66W8IOyImO2Wie2VmOuKlCDrgrTrtoAg66mU7ISc65Oc7J6F64uI64ukLlxuICAgKiBvYmplY3Qg65iQ64qUIG9iamVjdCDrsLDsl7TsnYQg67Cb6rOgLCBKU09OIOy7rOufvOydtCDsnojsnLzrqbQg7KeB66Cs7ZmU7ZWY7JesIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICog7KeB7KCRIOqwkuydhCDrs4Dqsr3tlZjrr4DroZwgc2lkZSBlZmZlY3TqsIAg7J6I7Iq164uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSByZWZpbmVKc29uQ29sdW1uczxSb3cgZXh0ZW5kcyBvYmplY3Q+KGRhdGE6IFJvdyB8IFJvd1tdKTogdHlwZW9mIGRhdGEge1xuICAgIC8vIHRhYmxlU3BlY+ydtOuCmCBqc29uQ29sdW1ucyDsl4bripQg6rK97JqwIOuwlOuhnCDrsJjtmZhcbiAgICBpZiAoIXRoaXMudGFibGVTcGVjIHx8ICF0aGlzLnRhYmxlU3BlYy5qc29uQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIC8vIOuTseuhneuQnCBUYWJsZVNwZWPsnYQg7Ya17ZW0IEpTT07su6zrn7wg66qp66Gd7J2EIOqwgOyguOyZgCBKU09OLnN0cmluZ2lmeSDsspjrpqxcbiAgICBjb25zdCBqc29uQ29sdW1ucyA9IHRoaXMudGFibGVTcGVjLmpzb25Db2x1bW5zO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGF0YSkge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBqc29uQ29sdW1ucykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gT2JqZWN0LmVudHJpZXMoaXRlbSkuZmluZCgoW2tleV0pID0+IGtleSA9PT0gY29sdW1uKT8uWzFdO1xuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0ZW0sIHtcbiAgICAgICAgICAgICAgW2NvbHVtbl06IHNlcmlhbGl6ZUpzb25Db2x1bW5WYWx1ZSh0aGlzLnRhYmxlU3BlYywgY29sdW1uLCB2YWx1ZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YganNvbkNvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBPYmplY3QuZW50cmllcyhkYXRhKS5maW5kKChba2V5XSkgPT4ga2V5ID09PSBjb2x1bW4pPy5bMV07XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihkYXRhLCB7XG4gICAgICAgICAgICBbY29sdW1uXTogc2VyaWFsaXplSnNvbkNvbHVtblZhbHVlKHRoaXMudGFibGVTcGVjLCBjb2x1bW4sIHZhbHVlKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8vIEluY3JlbWVudFxuICBpbmNyZW1lbnQ8VENvbHVtbiBleHRlbmRzIE51bWVyaWNDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IG51bWJlcixcbiAgKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIGlmICh2YWx1ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbmNyZW1lbnQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKTtcbiAgICB9XG4gICAgdGhpcy5rbmV4UXVlcnkuaW5jcmVtZW50KGNvbHVtbiwgdmFsdWUpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuICAvLyBEZWNyZW1lbnRcbiAgZGVjcmVtZW50PFRDb2x1bW4gZXh0ZW5kcyBOdW1lcmljQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICk6IFJlc29sdmVkUHVyaTxudW1iZXIsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+IHtcbiAgICBpZiAodmFsdWUgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGVjcmVtZW50IHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDBcIik7XG4gICAgfVxuICAgIHRoaXMua25leFF1ZXJ5LmRlY3JlbWVudChjb2x1bW4sIHZhbHVlKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4LCB0aGlzLnRhYmxlU3BlYyk7XG4gIH1cblxuICAvLyBERUxFVEVcbiAgZGVsZXRlKCk6IFJlc29sdmVkUHVyaTxudW1iZXIsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5kZWxldGUoKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4LCB0aGlzLnRhYmxlU3BlYyk7XG4gIH1cblxuICAvLyDtmZXsnbgg7L+866asIOumrO2EtFxuICB0b1F1ZXJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LnRvUXVlcnkoKTtcbiAgfVxuXG4gIC8vIOy/vOumrCDrlJTrsoTquYUg66Gc6re4IOy2nOugpVxuICBkZWJ1ZygpOiB0aGlzIHtcbiAgICBjb25zb2xlLmxvZyhgJHtjaGFsay5jeWFuKFwiW1B1cmkgRGVidWddXCIpfSAke2NoYWxrLnllbGxvdyh0aGlzLnRvUXVlcnkoKSl9YCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjbG9uZSgpOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFRSZXN1bHQ+IHtcbiAgICAvLyAnZHVhbCfsnYAg642U66+4IO2FjOydtOu4lOydtOupsCwg67CU66GcIOyVhOuemCDspITsl5DshJwga25leFF1ZXJ56rCAIOuNruyWtOyUjOybjOynkeuLiOuLpC5cbiAgICBjb25zdCBuZXdQdXJpID0gbmV3IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4odGhpcy5rbmV4LCBcImR1YWxcIik7XG4gICAgbmV3UHVyaS5rbmV4UXVlcnkgPSB0aGlzLmtuZXhRdWVyeS5jbG9uZSgpO1xuICAgIG5ld1B1cmkudGFibGVTcGVjID0gdGhpcy50YWJsZVNwZWM7XG4gICAgbmV3UHVyaS5jb3JyZWxhdGlvblJlZ2lzdHJ5ID0gbmV3IE1hcCh0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkpO1xuICAgIHJldHVybiBuZXdQdXJpO1xuICB9XG5cbiAgZm9ybWF0U1FMKHVuZm9ybWF0dGVkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFNRTCDsmIjslb3slrQg66qp66GdXG4gICAgY29uc3Qga2V5d29yZHMgPSBbXG4gICAgICBcIlNFTEVDVFwiLFxuICAgICAgXCJGUk9NXCIsXG4gICAgICBcIldIRVJFXCIsXG4gICAgICBcIklOU0VSVFwiLFxuICAgICAgXCJJTlRPXCIsXG4gICAgICBcIlZBTFVFU1wiLFxuICAgICAgXCJVUERBVEVcIixcbiAgICAgIFwiREVMRVRFXCIsXG4gICAgICBcIkNSRUFURVwiLFxuICAgICAgXCJUQUJMRVwiLFxuICAgICAgXCJBTFRFUlwiLFxuICAgICAgXCJEUk9QXCIsXG4gICAgICBcIkpPSU5cIixcbiAgICAgIFwiT05cIixcbiAgICAgIFwiSU5ORVJcIixcbiAgICAgIFwiTEVGVFwiLFxuICAgICAgXCJSSUdIVFwiLFxuICAgICAgXCJGVUxMXCIsXG4gICAgICBcIk9VVEVSXCIsXG4gICAgICBcIkdST1VQXCIsXG4gICAgICBcIkJZXCIsXG4gICAgICBcIk9SREVSXCIsXG4gICAgICBcIkhBVklOR1wiLFxuICAgICAgXCJESVNUSU5DVFwiLFxuICAgICAgXCJMSU1JVFwiLFxuICAgICAgXCJPRkZTRVRcIixcbiAgICAgIFwiQVNcIixcbiAgICAgIFwiQU5EXCIsXG4gICAgICBcIk9SXCIsXG4gICAgICBcIk5PVFwiLFxuICAgICAgXCJJTlwiLFxuICAgICAgXCJMSUtFXCIsXG4gICAgICBcIklTXCIsXG4gICAgICBcIk5VTExcIixcbiAgICAgIFwiQ0FTRVwiLFxuICAgICAgXCJXSEVOXCIsXG4gICAgICBcIlRIRU5cIixcbiAgICAgIFwiRUxTRVwiLFxuICAgICAgXCJFTkRcIixcbiAgICAgIFwiVU5JT05cIixcbiAgICAgIFwiQUxMXCIsXG4gICAgICBcIkVYSVNUU1wiLFxuICAgICAgXCJCRVRXRUVOXCIsXG4gICAgXTtcblxuICAgIGxldCBmb3JtYXR0ZWQgPSB1bmZvcm1hdHRlZDtcblxuICAgIC8vIOyYiOyVveyWtOulvCDrjIDrrLjsnpDroZwg67OA7ZmYXG4gICAga2V5d29yZHMuZm9yRWFjaCgoa2V5d29yZCkgPT4ge1xuICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBcXFxcYiR7a2V5d29yZH1cXFxcYmAsIFwiZ2lcIik7XG4gICAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZShyZWdleCwga2V5d29yZC50b1VwcGVyQ2FzZSgpKTtcbiAgICB9KTtcblxuICAgIC8vIOyjvOyalCDsoIgg7JWe7JeQIOykhOuwlOq/iCDstpTqsIBcbiAgICBjb25zdCBtYWpvckNsYXVzZXMgPSBbXG4gICAgICBcIlNFTEVDVFwiLFxuICAgICAgXCJGUk9NXCIsXG4gICAgICBcIldIRVJFXCIsXG4gICAgICBcIkdST1VQIEJZXCIsXG4gICAgICBcIk9SREVSIEJZXCIsXG4gICAgICBcIkhBVklOR1wiLFxuICAgICAgXCJMSU1JVFwiLFxuICAgICAgXCJVTklPTlwiLFxuICAgIF07XG4gICAgbWFqb3JDbGF1c2VzLmZvckVhY2goKGNsYXVzZSkgPT4ge1xuICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBcXFxccysoJHtjbGF1c2V9KVxcXFxzK2AsIFwiZ2lcIik7XG4gICAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZShyZWdleCwgYFxcbiR7Y2xhdXNlLnRvVXBwZXJDYXNlKCl9IGApO1xuICAgIH0pO1xuXG4gICAgLy8gSk9JTiDsoIgg7LKY66asXG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL1xccysoKD86SU5ORVJ8TEVGVHxSSUdIVHxGVUxMIE9VVEVSKVxccyspP0pPSU5cXHMrL2dpLCBcIlxcbiQxSk9JTiBcIik7XG5cbiAgICAvLyBBTkQsIE9SIOyhsOqxtCDsspjrpqxcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvXFxzKyhBTkR8T1IpXFxzKy9naSwgXCJcXG4gICQxIFwiKTtcblxuICAgIC8vIOq0hO2YuCDsspjrpqwg67CPIOuTpOyXrOyTsOq4sFxuICAgIGNvbnN0IGxpbmVzID0gZm9ybWF0dGVkLnNwbGl0KFwiXFxuXCIpO1xuICAgIGNvbnN0IGluZGVudGVkTGluZXMgPSBbXTtcbiAgICBsZXQgaW5kZW50TGV2ZWwgPSAwO1xuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgaWYgKCF0cmltbWVkTGluZSkgY29udGludWU7XG5cbiAgICAgIC8vIOuLq+uKlCDqtITtmLjqsIAg7J6I7Jy866m0IOuTpOyXrOyTsOq4sCDroIjrsqgg6rCQ7IaMXG4gICAgICBjb25zdCBjbG9zaW5nUGFyZW5zID0gKHRyaW1tZWRMaW5lLm1hdGNoKC9cXCkvZykgfHwgW10pLmxlbmd0aDtcbiAgICAgIGNvbnN0IG9wZW5pbmdQYXJlbnMgPSAodHJpbW1lZExpbmUubWF0Y2goL1xcKC9nKSB8fCBbXSkubGVuZ3RoO1xuXG4gICAgICBpZiAoY2xvc2luZ1BhcmVucyA+IDAgJiYgb3BlbmluZ1BhcmVucyA9PT0gMCkge1xuICAgICAgICBpbmRlbnRMZXZlbCA9IE1hdGgubWF4KDAsIGluZGVudExldmVsIC0gY2xvc2luZ1BhcmVucyk7XG4gICAgICB9XG5cbiAgICAgIC8vIO2YhOyerCDrk6Tsl6zsk7DquLAg7KCB7JqpXG4gICAgICBjb25zdCBpbmRlbnQgPSBcIiAgXCIucmVwZWF0KGluZGVudExldmVsKTtcbiAgICAgIGluZGVudGVkTGluZXMucHVzaChpbmRlbnQgKyB0cmltbWVkTGluZSk7XG5cbiAgICAgIC8vIOyXrOuKlCDqtITtmLjqsIAg7J6I7Jy866m0IOuTpOyXrOyTsOq4sCDroIjrsqgg7Kad6rCAXG4gICAgICBpZiAob3BlbmluZ1BhcmVucyA+IGNsb3NpbmdQYXJlbnMpIHtcbiAgICAgICAgaW5kZW50TGV2ZWwgKz0gb3BlbmluZ1BhcmVucyAtIGNsb3NpbmdQYXJlbnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGVudGVkTGluZXMuam9pbihcIlxcblwiKS50cmltKCk7XG4gIH1cblxuICByYXcoc3FsOiBzdHJpbmcpOiBLbmV4LlJhdyB7XG4gICAgcmV0dXJuIHRoaXMua25leC5yYXcoc3FsKTtcbiAgfVxuXG4gIC8vIEtuZXgg7L+866asIOu5jOuNlCDsp4HsoJEg7KCR6re8XG4gIHJhd1F1ZXJ5KCk6IEtuZXguUXVlcnlCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdoZXJlR3JvdXA8VFRhYmxlcyBleHRlbmRzIG9iamVjdD4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJ1aWxkZXI6IEtuZXguUXVlcnlCdWlsZGVyKSB7fVxuXG4gIC8vIHdoZXJlIOuplOyEnOuTnOuTpFxuICB3aGVyZShjb25kaXRpb25zOiBXaGVyZUNvbmRpdGlvbjxUVGFibGVzPik6IHRoaXM7XG4gIHdoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIG9wZXJhdG9yOiBXaGVyZU9wZXJhdG9yLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgd2hlcmUoLi4uYXJnczogYW55W10pOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmUoYXJnc1swXSwgLi4uYXJncy5zbGljZSgxKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB3aGVyZUluIC8gd2hlcmVOb3RJbiDrqZTshJzrk5zrk6RcbiAgd2hlcmVJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogKEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+ICYgS25leC5WYWx1ZSlbXSxcbiAgKTogdGhpcztcbiAgd2hlcmVJbiguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZUluKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgd2hlcmVOb3RJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogKEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+ICYgS25leC5WYWx1ZSlbXSxcbiAgKTogdGhpcztcbiAgd2hlcmVOb3RJbiguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZU5vdEluKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gb3JXaGVyZSDrqZTshJzrk5zrk6RcbiAgb3JXaGVyZShjb25kaXRpb25zOiBXaGVyZUNvbmRpdGlvbjxUVGFibGVzPik6IHRoaXM7XG4gIG9yV2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBvcGVyYXRvcjogV2hlcmVPcGVyYXRvcixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmUoLi4uYXJnczogYW55W10pOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZShhcmdzWzBdLCAuLi5hcmdzLnNsaWNlKDEpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIG9yV2hlcmVJbiAvIG9yV2hlcmVOb3RJbiDrqZTshJzrk5zrk6RcbiAgb3JXaGVyZUluPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWVzOiAoRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4gJiBLbmV4LlZhbHVlKVtdLFxuICApOiB0aGlzO1xuICBvcldoZXJlSW4oLi4uYXJnczogYW55W10pOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZUluKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZU5vdEluPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWVzOiAoRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4gJiBLbmV4LlZhbHVlKVtdLFxuICApOiB0aGlzO1xuICBvcldoZXJlTm90SW4oLi4uYXJnczogYW55W10pOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZU5vdEluKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgSlNPTkIgU1VQRVJTRVQgKEA+KVxuICB3aGVyZUpzb25TdXBlcnNldE9mPFRDb2x1bW4gZXh0ZW5kcyBKc29uQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBKc29uU3VwZXJzZXRWYWx1ZTxFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uPj4sXG4gICk6IHRoaXMge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZUpzb25TdXBlcnNldE9mKGNvbHVtbiwgc2VyaWFsaXplSnNvblN1cGVyc2V0VmFsdWUodmFsdWUpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9yV2hlcmVKc29uU3VwZXJzZXRPZjxUQ29sdW1uIGV4dGVuZHMgSnNvbkNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogSnNvblN1cGVyc2V0VmFsdWU8RXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbj4+LFxuICApOiB0aGlzIHtcbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZUpzb25TdXBlcnNldE9mKGNvbHVtbiwgc2VyaWFsaXplSnNvblN1cGVyc2V0VmFsdWUodmFsdWUpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIE1BVENIXG4gIHdoZXJlTWF0Y2g8VENvbHVtbiBleHRlbmRzIEZ1bGx0ZXh0Q29sdW1uczxUVGFibGVzPj4oY29sdW1uOiBUQ29sdW1uLCB2YWx1ZTogc3RyaW5nKTogdGhpcztcbiAgd2hlcmVNYXRjaCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZVJhdyhgTUFUQ0ggKCR7U3RyaW5nKGFyZ3NbMF0pfSkgQUdBSU5TVCAoPylgLCBbYXJnc1sxXV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZU1hdGNoPFRDb2x1bW4gZXh0ZW5kcyBGdWxsdGV4dENvbHVtbnM8VFRhYmxlcz4+KGNvbHVtbjogVENvbHVtbiwgdmFsdWU6IHN0cmluZyk6IHRoaXM7XG4gIG9yV2hlcmVNYXRjaCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGBNQVRDSCAoJHtTdHJpbmcoYXJnc1swXSl9KSBBR0FJTlNUICg/KWAsIFthcmdzWzFdXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBTRUFSQ0hcbiAgd2hlcmVTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbiB8IFRDb2x1bW5bXSxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICB3ZWlnaHRzPzogbnVtYmVyW107IC8vIOygleyImCDrsLDsl7RcbiAgICB9LFxuICApOiB0aGlzO1xuICB3aGVyZVNlYXJjaCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIGNvbnN0IHsgd2VpZ2h0cyB9ID0gYXJnc1syXSA/PyB7fTtcbiAgICBjb25zdCBjb2x1bW5FeHByID0gQXJyYXkuaXNBcnJheShhcmdzWzBdKVxuICAgICAgPyBgQVJSQVlbJHthcmdzWzBdLm1hcCgoYykgPT4gYCR7Y306OnRleHRgKS5qb2luKFwiLFwiKX1dYFxuICAgICAgOiBhcmdzWzBdO1xuICAgIGNvbnN0IHBncm9vbmdhQ29uZGl0aW9uID0gYHBncm9vbmdhX2NvbmRpdGlvbig/JHt3ZWlnaHRzPy5sZW5ndGggPyBgLCB3ZWlnaHRzID0+IEFSUkFZWyR7d2VpZ2h0cy5qb2luKFwiLFwiKX1dYCA6IFwiXCJ9KWA7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGAke2NvbHVtbkV4cHJ9ICZAfiAke3Bncm9vbmdhQ29uZGl0aW9ufWAsIFthcmdzWzFdXSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9yV2hlcmVTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbiB8IFRDb2x1bW5bXSxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICB3ZWlnaHRzPzogbnVtYmVyW107IC8vIOygleyImCDrsLDsl7RcbiAgICB9LFxuICApOiB0aGlzO1xuICBvcldoZXJlU2VhcmNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3QgeyB3ZWlnaHRzIH0gPSBhcmdzWzJdID8/IHt9O1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBBcnJheS5pc0FycmF5KGFyZ3NbMF0pXG4gICAgICA/IGBBUlJBWVske2FyZ3NbMF0ubWFwKChjKSA9PiBgJHtjfTo6dGV4dGApLmpvaW4oXCIsXCIpfV1gXG4gICAgICA6IGFyZ3NbMF07XG4gICAgY29uc3QgcGdyb29uZ2FDb25kaXRpb24gPSBgcGdyb29uZ2FfY29uZGl0aW9uKD8ke3dlaWdodHM/Lmxlbmd0aCA/IGAsIHdlaWdodHMgPT4gQVJSQVlbJHt3ZWlnaHRzLmpvaW4oXCIsXCIpfV1gIDogXCJcIn0pYDtcbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZVJhdyhgJHtjb2x1bW5FeHByfSAmQH4gJHtwZ3Jvb25nYUNvbmRpdGlvbn1gLCBbYXJnc1sxXV0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBGVUxMVEVYVFxuICB3aGVyZVRzU2VhcmNoPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+IHwgU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFRzUXVlcnlPcHRpb25zIHwgVHNRdWVyeUNvbmZpZyxcbiAgKTogdGhpcztcbiAgd2hlcmVUc1NlYXJjaCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIGNvbnN0IG9wdHMgPVxuICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIGlzU3RyaW5nVmFsdWUoYXJnc1syXSkgPyAoeyBjb25maWc6IGFyZ3NbMl0gfSBhcyBUc1F1ZXJ5T3B0aW9ucykgOiAoYXJnc1syXSA/PyB7fSk7XG5cbiAgICBjb25zdCBwYXJzZXIgPSBvcHRzLnBhcnNlciA/PyBcIndlYnNlYXJjaF90b190c3F1ZXJ5XCI7XG4gICAgY29uc3QgY29uZmlnID0gb3B0cy5jb25maWcgPz8gXCJzaW1wbGVcIjtcbiAgICBjb25zdCBjb2x1bW5FeHByID0gaXNTcWxFeHByZXNzaW9uKGFyZ3NbMF0pID8gYXJnc1swXVtcIl9zcWxcIl0gOiBTdHJpbmcoYXJnc1swXSk7XG5cbiAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYCR7Y29sdW1uRXhwcn0gQEAgJHtwYXJzZXJ9KD8sID8pYCwgW2NvbmZpZywgYXJnc1sxXV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZVRzU2VhcmNoPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+IHwgU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFRzUXVlcnlPcHRpb25zIHwgVHNRdWVyeUNvbmZpZyxcbiAgKTogdGhpcztcbiAgb3JXaGVyZVRzU2VhcmNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3Qgb3B0cyA9XG4gICAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgaXNTdHJpbmdWYWx1ZShhcmdzWzJdKSA/ICh7IGNvbmZpZzogYXJnc1syXSB9IGFzIFRzUXVlcnlPcHRpb25zKSA6IChhcmdzWzJdID8/IHt9KTtcblxuICAgIGNvbnN0IHBhcnNlciA9IG9wdHMucGFyc2VyID8/IFwid2Vic2VhcmNoX3RvX3RzcXVlcnlcIjtcbiAgICBjb25zdCBjb25maWcgPSBvcHRzLmNvbmZpZyA/PyBcInNpbXBsZVwiO1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBpc1NxbEV4cHJlc3Npb24oYXJnc1swXSkgPyBhcmdzWzBdW1wiX3NxbFwiXSA6IFN0cmluZyhhcmdzWzBdKTtcblxuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGAke2NvbHVtbkV4cHJ9IEBAICR7cGFyc2VyfSg/LCA/KWAsIFtjb25maWcsIGFyZ3NbMV1dKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHdoZXJlRnV6enk8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgb3BlcmF0b3I/OiBGdXp6eU9wZXJhdG9yO1xuICAgIH0sXG4gICk6IHRoaXM7XG4gIHdoZXJlRnV6enkoLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCBvcGVyYXRvciA9IHBhcnNlRnV6enlPcGVyYXRvcihhcmdzWzJdPy5vcGVyYXRvcik7XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IFwiJVwiKSB7XG4gICAgICBpZiAoaXNTcWxFeHByZXNzaW9uKGFyZ3NbMF0pKSB7XG4gICAgICAgIHRoaXMuYnVpbGRlci53aGVyZVJhdyhgJHthcmdzWzBdW1wiX3NxbFwiXX0gJHtvcGVyYXRvcn0gP2AsIFsuLi5hcmdzWzBdW1wiX3BhcmFtc1wiXSwgYXJnc1sxXV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGA/PyAke29wZXJhdG9yfSA/YCwgW2FyZ3NbMF0sIGFyZ3NbMV1dKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmIChpc1NxbEV4cHJlc3Npb24oYXJnc1swXSkpIHtcbiAgICAgIHRoaXMuYnVpbGRlci53aGVyZVJhdyhgPyAke29wZXJhdG9yfSAke2FyZ3NbMF1bXCJfc3FsXCJdfWAsIFthcmdzWzFdLCAuLi5hcmdzWzBdW1wiX3BhcmFtc1wiXV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gPz9gLCBbYXJnc1sxXSwgYXJnc1swXV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9yV2hlcmVGdXp6eTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPiB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBvcGVyYXRvcj86IEZ1enp5T3BlcmF0b3I7XG4gICAgfSxcbiAgKTogdGhpcztcbiAgb3JXaGVyZUZ1enp5KC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3Qgb3BlcmF0b3IgPSBwYXJzZUZ1enp5T3BlcmF0b3IoYXJnc1syXT8ub3BlcmF0b3IpO1xuXG4gICAgaWYgKG9wZXJhdG9yID09PSBcIiVcIikge1xuICAgICAgaWYgKGlzU3FsRXhwcmVzc2lvbihhcmdzWzBdKSkge1xuICAgICAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZVJhdyhgJHthcmdzWzBdW1wiX3NxbFwiXX0gJHtvcGVyYXRvcn0gP2AsIFtcbiAgICAgICAgICAuLi5hcmdzWzBdW1wiX3BhcmFtc1wiXSxcbiAgICAgICAgICBhcmdzWzFdLFxuICAgICAgICBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGA/PyAke29wZXJhdG9yfSA/YCwgW2FyZ3NbMF0sIGFyZ3NbMV1dKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmIChpc1NxbEV4cHJlc3Npb24oYXJnc1swXSkpIHtcbiAgICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGA/ICR7b3BlcmF0b3J9ICR7YXJnc1swXVtcIl9zcWxcIl19YCwgW2FyZ3NbMV0sIC4uLmFyZ3NbMF1bXCJfcGFyYW1zXCJdXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGA/ICR7b3BlcmF0b3J9ID8/YCwgW2FyZ3NbMV0sIGFyZ3NbMF1dKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDspJHssqkg6re466O5XG4gIHdoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogdGhpcztcbiAgd2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmUoKHN1YkJ1aWxkZXIpID0+IHtcbiAgICAgIGNvbnN0IHN1Ykdyb3VwID0gbmV3IFdoZXJlR3JvdXA8VFRhYmxlcz4oc3ViQnVpbGRlcik7XG4gICAgICBjYWxsYmFjayhzdWJHcm91cCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgb3JXaGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IHRoaXM7XG4gIG9yV2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZSgoc3ViQnVpbGRlcikgPT4ge1xuICAgICAgY29uc3Qgc3ViR3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihzdWJCdWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKHN1Ykdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG4vLyBKT0lOIOygiCDqt7jro7nsl5DripQgTGVmdOyZgCBSaWdodOyXkCDrjIDtlZwg7Iic7ISc6rCAIO2VhOyalO2VmOyngCDslYrsnLzrr4DroZwsIOuqqOuToCDqsr3smrDsnZgg7IiY66W8IOqzhOyCsO2VtOyVvO2VqC5cbmV4cG9ydCBjbGFzcyBKb2luQ2xhdXNlR3JvdXA8VExlZnQgZXh0ZW5kcyBvYmplY3QsIFRSaWdodCBleHRlbmRzIG9iamVjdD4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNhbGxiYWNrOiBLbmV4LkpvaW5DbGF1c2UpIHt9XG5cbiAgLy8gT04oQU5EKTog7Lus65+8ID0g7Lus65+8XG4gIG9uKGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+KTogdGhpcztcbiAgb24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LCByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4pOiB0aGlzO1xuICAvLyBPTihBTkQpOiDsu6zrn7wgPSDqsJJcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRMZWZ0LCBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIG9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VFJpZ2h0LCBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBPTihBTkQpOiDsu6zrn7wgKOyXsOyCsOyekCkg7Lus65+8XG4gIG9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgKTogdGhpcztcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICApOiB0aGlzO1xuICAvLyBPTihBTkQpOiDsu6zrn7wgKOyXsOyCsOyekCkg6rCSXG4gIG9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRMZWZ0LCBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIG9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUUmlnaHQsIEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy9nOuwsVxuICBvbihjYWxsYmFjazogKG5lc3RlZDogSm9pbkNsYXVzZUdyb3VwPFRMZWZ0LCBUUmlnaHQ+KSA9PiB2b2lkKTogdGhpcztcbiAgb24oY2FsbGJhY2s6IChuZXN0ZWQ6IEpvaW5DbGF1c2VHcm91cDxUUmlnaHQsIFRMZWZ0PikgPT4gdm9pZCk6IHRoaXM7XG4gIC8vIE9OKEFORCkg6rWs7ZiEXG4gIG9uKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICB0aGlzLmNhbGxiYWNrLm9uKC4uLihhcmdzIGFzIFtzdHJpbmcsIHN0cmluZ10pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE9OKE9SKTog7Lus65+8ID0g7Lus65+8XG4gIG9yT24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4pOiB0aGlzO1xuICBvck9uKGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+KTogdGhpcztcbiAgLy8gT04oT1IpOiDsu6zrn7wgPSDqsJJcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRSaWdodCwgQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gT04oT1IpOiDsu6zrn7wgKOyXsOyCsOyekCkg7Lus65+8XG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICApOiB0aGlzO1xuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgKTogdGhpcztcbiAgLy8gT04oT1IpOiDsu6zrn7wgKOyXsOyCsOyekCkg6rCSXG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VFJpZ2h0LCBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBPTihPUik6IOy9nOuwsVxuICBvck9uKGNhbGxiYWNrOiAobmVzdGVkOiBKb2luQ2xhdXNlR3JvdXA8VExlZnQsIFRSaWdodD4pID0+IHZvaWQpOiB0aGlzO1xuICBvck9uKGNhbGxiYWNrOiAobmVzdGVkOiBKb2luQ2xhdXNlR3JvdXA8VFJpZ2h0LCBUTGVmdD4pID0+IHZvaWQpOiB0aGlzO1xuICAvLyBPTihPUikg6rWs7ZiEXG4gIG9yT24oLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHRoaXMuY2FsbGJhY2sub3JPbiguLi4oYXJncyBhcyBbc3RyaW5nLCBzdHJpbmddKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBPTiBWQUwoQU5EKTog7Lus65+8ID0g6rCSICjqsJLsnYQg7Lus65+8IOywuOyhsOqwgCDslYTri4wg7YyM652866+47YSw66GcIOuwlOyduOuUqSlcbiAgb25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LCB2YWx1ZTogYW55KTogdGhpcztcbiAgb25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LCBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLCB2YWx1ZTogYW55KTogdGhpcztcbiAgb25WYWwoLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICh0aGlzLmNhbGxiYWNrIGFzIGFueSkub25WYWwoLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBBTkQgT04gVkFMOiBvblZhbOydmCDrqoXsi5zsoIEgYWxpYXMgKEtuZXgg7Zi47ZmYKVxuICBhbmRPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCB2YWx1ZTogYW55KTogdGhpcztcbiAgYW5kT25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBhbmRPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLCB2YWx1ZTogYW55KTogdGhpcztcbiAgYW5kT25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBhbmRPblZhbCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgKHRoaXMuY2FsbGJhY2sgYXMgYW55KS5hbmRPblZhbCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE9SIE9OIFZBTDogT1Ig7KGw6rG07Jy866GcIOqwkiDrsJTsnbjrlKlcbiAgb3JPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCB2YWx1ZTogYW55KTogdGhpcztcbiAgb3JPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9yT25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9yT25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvck9uVmFsKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAodGhpcy5jYWxsYmFjayBhcyBhbnkpLm9yT25WYWwoLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuLypcbiAgVFJlc29sdmVkOiDsv7zrpqwg7Iuk7ZaJIO2bhCDrsJjtmZjrkKAg6rKw6rO8IO2DgOyehVxuICBUUmV0dXJuaW5nOiBSRVRVUk5JTkcg7KCI7JeQIOyCrOyaqeuQoCDtg4DsnoVcbiovXG5leHBvcnQgY2xhc3MgUmVzb2x2ZWRQdXJpPFRSZXNvbHZlZCwgVFJldHVybmluZz4gaW1wbGVtZW50cyBQcm9taXNlPFRSZXNvbHZlZD4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMga25leFF1ZXJ5OiBLbmV4LlF1ZXJ5QnVpbGRlcixcbiAgICBwcml2YXRlIGtuZXg6IEtuZXgsXG4gICAgcHJpdmF0ZSB0YWJsZVNwZWM6IFRhYmxlU3BlYyB8IG51bGwgPSBudWxsLFxuICApIHt9XG5cbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZyA9IFwiUHJvbWlzZVwiO1xuXG4gIHRvUXVlcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkudG9RdWVyeSgpO1xuICB9XG5cbiAgZGVidWcoKTogdGhpcyB7XG4gICAgY29uc29sZS5sb2coYCR7Y2hhbGsuY3lhbihcIltQdXJpIERlYnVnXVwiKX0gJHtjaGFsay55ZWxsb3codGhpcy50b1F1ZXJ5KCkpfWApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdGhlbjxUUmVzdWx0MSA9IFRSZXNvbHZlZCwgVFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBUUmVzb2x2ZWQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IG51bGwsXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgIE5haXRlLnQoXCJwdXJpOmV4ZWN1dGVkLXF1ZXJ5XCIsIHRoaXMudG9RdWVyeSgpKTtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS50aGVuKG9uZnVsZmlsbGVkIGFzIGFueSwgb25yZWplY3RlZCk7XG4gIH1cblxuICBjYXRjaDxUUmVzdWx0MiA9IG5ldmVyPihcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgbnVsbCxcbiAgKTogUHJvbWlzZTxUUmVzb2x2ZWQgfCBUUmVzdWx0Mj4ge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS5jYXRjaChvbnJlamVjdGVkKTtcbiAgfVxuXG4gIGZpbmFsbHkob25maW5hbGx5PzogKCgpID0+IHZvaWQpIHwgbnVsbCk6IFByb21pc2U8VFJlc29sdmVkPiB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LmZpbmFsbHkob25maW5hbGx5KTtcbiAgfVxuXG4gIC8vIE9OIENPTkZMSUNUIC0g7Lus65+8IOq4sOuwmFxuICBvbkNvbmZsaWN0PFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBUUmV0dXJuaW5nPj4oXG4gICAgY29sdW1uczogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgYWN0aW9uPzogT25Db25mbGljdEFjdGlvbjxUVGFibGVzPixcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgdGFyZ2V0ID0gQXJyYXkuaXNBcnJheShjb2x1bW5zKSA/IGNvbHVtbnMgOiBbY29sdW1uc107XG5cbiAgICBpZiAoIWFjdGlvbiB8fCBhY3Rpb24gPT09IFwibm90aGluZ1wiKSB7XG4gICAgICAvLyBETyBOT1RISU5HXG4gICAgICB0aGlzLmtuZXhRdWVyeS5vbkNvbmZsaWN0KHRhcmdldCkuaWdub3JlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERPIFVQREFURVxuICAgICAgY29uc3QgeyB1cGRhdGUgfSA9IGFjdGlvbjtcblxuICAgICAgLy8gYWN0aW9uLnVwZGF0ZSDrsLDsl7Qg7ZiV7YOcIDogW1wibmFtZVwiLCBcImVtYWlsXCJdXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh1cGRhdGUpKSB7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5Lm9uQ29uZmxpY3QodGFyZ2V0KS5tZXJnZSh1cGRhdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYWN0aW9uLnVwZGF0ZSDqsJ3ssrQg7ZiV7YOcOiB7IG5hbWU6IFwiSm9oblwiLCBjb3VudDogcmF3KC4uLikgfVxuICAgICAgICBjb25zdCBtZXJnZU9iaiA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHVwZGF0ZSkpIHtcbiAgICAgICAgICBjb25zdCBtZXJnZWRWYWx1ZSA9IGlzU3FsRXhwcmVzc2lvbih2YWx1ZSlcbiAgICAgICAgICAgID8gdGhpcy5rbmV4LnJhdyh2YWx1ZVtcIl9zcWxcIl0pXG4gICAgICAgICAgICA6IHNlcmlhbGl6ZUpzb25Db2x1bW5WYWx1ZSh0aGlzLnRhYmxlU3BlYywga2V5LCB2YWx1ZSk7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihtZXJnZU9iaiwgeyBba2V5XTogbWVyZ2VkVmFsdWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmtuZXhRdWVyeS5vbkNvbmZsaWN0KHRhcmdldCkubWVyZ2UobWVyZ2VPYmopO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gUkVUVVJOSU5HOiBcIipcIiAtIOyghOyytCDsu6zrn7xcbiAgcmV0dXJuaW5nKGNvbHVtbjogXCIqXCIpOiBSZXNvbHZlZFB1cmk8VFJldHVybmluZ1tdLCBuZXZlcj47XG4gIC8vIFJFVFVSTklORzog64uo7J28IOy7rOufvFxuICByZXR1cm5pbmc8VENvbHVtbiBleHRlbmRzIENvbHVtbktleXM8VFJldHVybmluZz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgKTogUmVzb2x2ZWRQdXJpPFBpY2s8VFJldHVybmluZywgVENvbHVtbj5bXSwgbmV2ZXI+O1xuICAvLyBSRVRVUk5JTkc6IOuzteyImCDsu6zrn7wgKOuwsOyXtClcbiAgcmV0dXJuaW5nPFRDb2x1bW4gZXh0ZW5kcyBDb2x1bW5LZXlzPFRSZXR1cm5pbmc+PihcbiAgICBjb2x1bW5zOiBUQ29sdW1uW10sXG4gICk6IFJlc29sdmVkUHVyaTxQaWNrPFRSZXR1cm5pbmcsIFRDb2x1bW4+W10sIG5ldmVyPjtcbiAgLy8gUkVUVVJOSU5HIOq1rO2YhFxuICByZXR1cm5pbmcoY29sdW1uT3JDb2x1bW5zOiBzdHJpbmcgfCBzdHJpbmdbXSk6IFJlc29sdmVkUHVyaTxhbnlbXSwgbmV2ZXI+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5yZXR1cm5pbmcoY29sdW1uT3JDb2x1bW5zKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhp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
|
|
1149
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVyaS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvcHVyaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBveGxpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovIC8vIFB1cmnripQg64uk7JaR7ZWcIO2DgOyeheydhCDsgqzsmqntlZjqs6Ag7J6I7Iq164uI64ukLlxuXG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIFRhYmxlU3BlYyB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQge1xuICBpc0Z1bmN0aW9uVmFsdWUsXG4gIGlzTnVtYmVyVmFsdWUsXG4gIGlzT2JqZWN0VmFsdWUsXG4gIGlzU3RyaW5nVmFsdWUsXG59IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5pbXBvcnQgeyB0eXBlIENsZWFyU3RhdGVtZW50cyB9IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIEF2YWlsYWJsZUNvbHVtbnMsXG4gIHR5cGUgQ29sdW1uS2V5cyxcbiAgdHlwZSBDb21wYXJpc29uT3BlcmF0b3IsXG4gIHR5cGUgRXhwYW5kLFxuICB0eXBlIEV4dHJhY3RDb2x1bW5UeXBlLFxuICB0eXBlIEZ1bGx0ZXh0Q29sdW1ucyxcbiAgdHlwZSBGdXp6eU9wZXJhdG9yLFxuICB0eXBlIEluc2VydERhdGEsXG4gIHR5cGUgSW5zZXJ0UmVzdWx0LFxuICB0eXBlIEpzb25Db2x1bW5zLFxuICB0eXBlIEpzb25TdXBlcnNldFZhbHVlLFxuICB0eXBlIExlZnRKb2luZWRNYXJrZXIsXG4gIHR5cGUgTGVmdEpvaW5NYXJrZXJGb3IsXG4gIHR5cGUgTnVtZXJpY0NvbHVtbnMsXG4gIHR5cGUgT25Db25mbGljdEFjdGlvbixcbiAgdHlwZSBQYXJzZVNlbGVjdE9iamVjdCxcbiAgdHlwZSBSZXN1bHRBdmFpbGFibGVDb2x1bW5zLFxuICB0eXBlIFNlbGVjdEFsbFJlc3VsdCxcbiAgdHlwZSBTZWxlY3RPYmplY3QsXG4gIHR5cGUgU2VsZWN0VmFsdWUsXG4gIHR5cGUgU2luZ2xlVGFibGVWYWx1ZSxcbiAgdHlwZSBTcWxFeHByZXNzaW9uLFxuICB0eXBlIFRzSGlnaGxpZ2h0T3B0aW9ucyxcbiAgdHlwZSBUc1F1ZXJ5Q29uZmlnLFxuICB0eXBlIFRzUXVlcnlPcHRpb25zLFxuICB0eXBlIFRzUmFua09wdGlvbnMsXG4gIHR5cGUgVmVjdG9yQ29sdW1ucyxcbiAgdHlwZSBXaGVyZUNvbmRpdGlvbixcbiAgdHlwZSBXaGVyZU9wZXJhdG9yLFxufSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5pbXBvcnQgeyBGVVpaWV9PUEVSQVRPUlMgfSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5cbnR5cGUgUHVyaU9yZGVyQnlEaXJlY3Rpb24gPSBcImFzY1wiIHwgXCJkZXNjXCI7XG50eXBlIFB1cmlPcmRlckJ5TnVsbHMgPSBcImZpcnN0XCIgfCBcImxhc3RcIjtcbnR5cGUgQW55U3FsRXhwcmVzc2lvbiA9IFNxbEV4cHJlc3Npb248XG4gIFwic3RyaW5nXCIgfCBcIm51bWJlclwiIHwgXCJib29sZWFuXCIgfCBcImRhdGVcIiB8IFwic3RyaW5nW11cIiB8IFwidHN2ZWN0b3JcIixcbiAgYm9vbGVhblxuPjtcbnR5cGUgU3RyaW5nU3FsRXhwcmVzc2lvbjxUTnVsbGFibGUgZXh0ZW5kcyBib29sZWFuID0gYm9vbGVhbj4gPSBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCIsIFROdWxsYWJsZT47XG50eXBlIFB1cmlPcmRlckJ5RXhwcmVzc2lvbiA9IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIiB8IFwic3RyaW5nXCIsIGJvb2xlYW4+O1xudHlwZSBTdHJpbmdFeHByZXNzaW9uU2VsZWN0ID0gUmVjb3JkPHN0cmluZywgU3RyaW5nU3FsRXhwcmVzc2lvbj47XG50eXBlIFN0cmluZ0V4cHJlc3Npb25TZWxlY3RSZXN1bHQ8VFNlbGVjdCBleHRlbmRzIFN0cmluZ0V4cHJlc3Npb25TZWxlY3Q+ID0ge1xuICBbSyBpbiBrZXlvZiBUU2VsZWN0XTogVFNlbGVjdFtLXSBleHRlbmRzIFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIiwgaW5mZXIgVE51bGxhYmxlPlxuICAgID8gdHJ1ZSBleHRlbmRzIFROdWxsYWJsZVxuICAgICAgPyBzdHJpbmcgfCBudWxsXG4gICAgICA6IHN0cmluZ1xuICAgIDogbmV2ZXI7XG59O1xudHlwZSBQdXJpT3JkZXJCeUl0ZW08VENvbHVtbiBleHRlbmRzIHN0cmluZz4gPSB7XG4gIGNvbHVtbjogVENvbHVtbiB8IFB1cmlPcmRlckJ5RXhwcmVzc2lvbjtcbiAgb3JkZXI/OiBQdXJpT3JkZXJCeURpcmVjdGlvbjtcbiAgbnVsbHM/OiBQdXJpT3JkZXJCeU51bGxzO1xufTtcbnR5cGUgUHVyaU9yZGVyQnlFbnRyeTxUQ29sdW1uIGV4dGVuZHMgc3RyaW5nPiA9XG4gIHwgVENvbHVtblxuICB8IFB1cmlPcmRlckJ5RXhwcmVzc2lvblxuICB8IFB1cmlPcmRlckJ5SXRlbTxUQ29sdW1uPjtcbnR5cGUgUHVyaU9yZGVyQnlSdW50aW1lSXRlbSA9IHtcbiAgY29sdW1uOiBzdHJpbmcgfCBQdXJpT3JkZXJCeUV4cHJlc3Npb247XG4gIG9yZGVyPzogUHVyaU9yZGVyQnlEaXJlY3Rpb247XG4gIG51bGxzPzogUHVyaU9yZGVyQnlOdWxscztcbn07XG50eXBlIFB1cmlPcmRlckJ5UnVudGltZUVudHJ5ID0gc3RyaW5nIHwgUHVyaU9yZGVyQnlFeHByZXNzaW9uIHwgUHVyaU9yZGVyQnlSdW50aW1lSXRlbTtcblxudHlwZSBGcm9tUmVnaXN0cmF0aW9uID0ge1xuICBraW5kOiBcImZyb21cIjtcbiAgYWxpYXM6IHN0cmluZztcbiAgdGFibGU6IHN0cmluZyB8IG51bGw7XG59O1xuXG50eXBlIEpvaW5SZWdpc3RyYXRpb24gPSB7XG4gIGtpbmQ6IFwiam9pblwiO1xuICBhbGlhczogc3RyaW5nO1xuICB0YWJsZTogc3RyaW5nIHwgbnVsbDtcbiAgam9pblR5cGU6IFwiam9pblwiIHwgXCJsZWZ0Sm9pblwiO1xuICBsZWZ0OiBzdHJpbmcgfCBudWxsO1xuICByaWdodDogc3RyaW5nIHwgbnVsbDtcbiAgcmV1c2FibGU6IGJvb2xlYW47XG59O1xuXG50eXBlIENvcnJlbGF0aW9uUmVnaXN0cmF0aW9uID0gRnJvbVJlZ2lzdHJhdGlvbiB8IEpvaW5SZWdpc3RyYXRpb247XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZ1enp5T3BlcmF0b3Iob3BlcmF0b3I/OiBzdHJpbmcpOiBGdXp6eU9wZXJhdG9yIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG9wZXJhdG9yPy50cmltKCkgPz8gXCI8JVwiO1xuICBjb25zdCBmdXp6eU9wZXJhdG9yID0gRlVaWllfT1BFUkFUT1JTLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlID09PSBub3JtYWxpemVkKTtcblxuICBpZiAoIWZ1enp5T3BlcmF0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZnV6enkgb3BlcmF0b3I6ICR7b3BlcmF0b3IgPz8gXCJcIn1gKTtcbiAgfVxuXG4gIHJldHVybiBmdXp6eU9wZXJhdG9yO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVKc29uU3VwZXJzZXRWYWx1ZTxWYWx1ZT4odmFsdWU6IFZhbHVlKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcblxuICBpZiAoc2VyaWFsaXplZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwiUHVyaSBKU09OQiBjb250YWlubWVudCB2YWx1ZSBtdXN0IGJlIEpTT04tc2VyaWFsaXphYmxlOyBKU09OLnN0cmluZ2lmeSByZXR1cm5lZCB1bmRlZmluZWQuXCIsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBzZXJpYWxpemVkO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVKc29uQ29sdW1uVmFsdWU8VmFsdWU+KFxuICB0YWJsZVNwZWM6IFRhYmxlU3BlYyB8IG51bGwsXG4gIGNvbHVtbjogc3RyaW5nLFxuICB2YWx1ZTogVmFsdWUsXG4pOiBWYWx1ZSB8IHN0cmluZyB7XG4gIGlmICghdGFibGVTcGVjPy5qc29uQ29sdW1ucy5pbmNsdWRlcyhjb2x1bW4pIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVPcmRlckJ5RGlyZWN0aW9uKGRpcmVjdGlvbjogUHVyaU9yZGVyQnlEaXJlY3Rpb24gPSBcImFzY1wiKTogUHVyaU9yZGVyQnlEaXJlY3Rpb24ge1xuICBpZiAoZGlyZWN0aW9uICE9PSBcImFzY1wiICYmIGRpcmVjdGlvbiAhPT0gXCJkZXNjXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb3JkZXIgZGlyZWN0aW9uOiAke2RpcmVjdGlvbn1gKTtcbiAgfVxuXG4gIHJldHVybiBkaXJlY3Rpb247XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9yZGVyQnlOdWxscyhudWxscz86IFB1cmlPcmRlckJ5TnVsbHMpOiBQdXJpT3JkZXJCeU51bGxzIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG51bGxzID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKG51bGxzICE9PSBcImZpcnN0XCIgJiYgbnVsbHMgIT09IFwibGFzdFwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9yZGVyIG51bGxzOiAke251bGxzfWApO1xuICB9XG5cbiAgcmV0dXJuIG51bGxzO1xufVxuXG5mdW5jdGlvbiBmb3JtYXROdWxsc1N1ZmZpeChudWxscz86IFB1cmlPcmRlckJ5TnVsbHMpOiBzdHJpbmcge1xuICBpZiAoIW51bGxzKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICByZXR1cm4gYCBOVUxMUyAke251bGxzLnRvVXBwZXJDYXNlKCl9YDtcbn1cblxuZnVuY3Rpb24gaXNPcmRlckJ5RW50cmllczxWYWx1ZT4oXG4gIHZhbHVlOiBWYWx1ZSxcbik6IHZhbHVlIGlzIFZhbHVlICYgcmVhZG9ubHkgUHVyaU9yZGVyQnlSdW50aW1lRW50cnlbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNTcWxFeHByZXNzaW9uPFZhbHVlPih2YWx1ZTogVmFsdWUpOiB2YWx1ZSBpcyBWYWx1ZSAmIEFueVNxbEV4cHJlc3Npb24ge1xuICByZXR1cm4gaXNPYmplY3RWYWx1ZSh2YWx1ZSkgJiYgXCJfdHlwZVwiIGluIHZhbHVlICYmIHZhbHVlW1wiX3R5cGVcIl0gPT09IFwic3FsX2V4cHJlc3Npb25cIjtcbn1cblxuZnVuY3Rpb24gaXNPcmRlckJ5RXhwcmVzc2lvbjxWYWx1ZT4odmFsdWU6IFZhbHVlKTogdmFsdWUgaXMgVmFsdWUgJiBQdXJpT3JkZXJCeUV4cHJlc3Npb24ge1xuICByZXR1cm4gaXNTcWxFeHByZXNzaW9uKHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNOZXN0ZWRTZWxlY3RPYmplY3Q8VFRhYmxlcyBleHRlbmRzIG9iamVjdD4oXG4gIHZhbHVlOiBTZWxlY3RWYWx1ZTxUVGFibGVzPiB8IFNlbGVjdE9iamVjdDxUVGFibGVzPixcbik6IHZhbHVlIGlzIFNlbGVjdE9iamVjdDxUVGFibGVzPiB7XG4gIHJldHVybiBpc09iamVjdFZhbHVlKHZhbHVlKSAmJiAhKFwiX3R5cGVcIiBpbiB2YWx1ZSk7XG59XG5cbmV4cG9ydCBjbGFzcyBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgZXh0ZW5kcyBvYmplY3QsIFRSZXN1bHQ+IHtcbiAgcHJpdmF0ZSBrbmV4UXVlcnk6IEtuZXguUXVlcnlCdWlsZGVyO1xuICBwcml2YXRlIHRhYmxlU3BlYzogVGFibGVTcGVjIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29ycmVsYXRpb25SZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nLCBDb3JyZWxhdGlvblJlZ2lzdHJhdGlvbj4oKTtcblxuICAvLyDsg53shLHsnpAg7Iuc6re464uI7LKY65OkXG4gIGNvbnN0cnVjdG9yKGtuZXg6IEtuZXgsIHRhYmxlTmFtZTogc3RyaW5nKTtcbiAgY29uc3RydWN0b3Ioa25leDogS25leCwgdGFibGVTb3VyY2U6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFB1cmk8VFNjaGVtYSwgYW55LCBhbnk+Pik7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrbmV4OiBLbmV4LFxuICAgIHRhYmxlTmFtZU9yU291cmNlOiBhbnksXG4gICkge1xuICAgIGlmIChpc1N0cmluZ1ZhbHVlKHRhYmxlTmFtZU9yU291cmNlKSkge1xuICAgICAgLy8gQ2FzZTogbmV3IFB1cmkoa25leCwgXCJ1c2Vyc1wiKVxuICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXgodGFibGVOYW1lT3JTb3VyY2UpLmZyb20odGFibGVOYW1lT3JTb3VyY2UpO1xuICAgICAgdGhpcy50YWJsZVNwZWMgPSB0aGlzLnNhZmVHZXRUYWJsZVNwZWModGFibGVOYW1lT3JTb3VyY2UpO1xuICAgICAgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LnNldCh0YWJsZU5hbWVPclNvdXJjZSwge1xuICAgICAgICBraW5kOiBcImZyb21cIixcbiAgICAgICAgYWxpYXM6IHRhYmxlTmFtZU9yU291cmNlLFxuICAgICAgICB0YWJsZTogdGFibGVOYW1lT3JTb3VyY2UsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0VmFsdWUodGFibGVOYW1lT3JTb3VyY2UpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFibGVOYW1lT3JTb3VyY2UpO1xuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRhYmxlIHNwZWMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGVudHJ5XCIpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KGVudHJpZXNbMF0pO1xuICAgICAgY29uc3QgW2FsaWFzLCBzb3VyY2VdID0gZW50cmllc1swXTtcbiAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHNvdXJjZSkpIHtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXgoc291cmNlKS5mcm9tKHsgW2FsaWFzXTogc291cmNlIH0pO1xuICAgICAgICB0aGlzLnRhYmxlU3BlYyA9IHRoaXMuc2FmZUdldFRhYmxlU3BlYyhzb3VyY2UpO1xuICAgICAgICB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkuc2V0KGFsaWFzLCB7IGtpbmQ6IFwiZnJvbVwiLCBhbGlhcywgdGFibGU6IHNvdXJjZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHVyaSkge1xuICAgICAgICBjb25zdCBzdWJxdWVyeUJ1aWxkZXIgPSBzb3VyY2UucmF3UXVlcnkoKTtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXguZnJvbShzdWJxdWVyeUJ1aWxkZXIuYXMoYWxpYXMpKTtcbiAgICAgICAgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LnNldChhbGlhcywgeyBraW5kOiBcImZyb21cIiwgYWxpYXMsIHRhYmxlOiBudWxsIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0YWJsZSBzcGVjaWZpY2F0aW9uXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHRhYmxlIHNwZWNpZmljYXRpb25cIik7XG4gICAgfVxuICB9XG5cbiAgc2FmZUdldFRhYmxlU3BlYyh0YWJsZU5hbWU6IHN0cmluZyk6IFRhYmxlU3BlYyB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRUYWJsZVNwZWModGFibGVOYW1lKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXRpYyBTUUwgaGVscGVyIGZ1bmN0aW9ucyBmb3IgU0VMRUNUXG4gIHN0YXRpYyBjb3VudChjb2x1bW46IHN0cmluZyA9IFwiKlwiKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYENPVU5UKD8/KTo6aW50ZWdlcmAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBzdW0oY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgU1VNKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBhdmcoY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgQVZHKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBtYXgoY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgTUFYKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBtaW4oY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgTUlOKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBjb25jYXQoLi4uYXJnczogc3RyaW5nW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBgQ09OQ0FUKCR7YXJncy5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgIF9wYXJhbXM6IGFyZ3MsXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgY29hbGVzY2UoZXhwcmVzc2lvbjogU3RyaW5nU3FsRXhwcmVzc2lvbiwgZmFsbGJhY2s6IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJzdHJpbmdcIixcbiAgICAgIF9zcWw6IGBDT0FMRVNDRSgke2V4cHJlc3Npb24uX3NxbH0sID8pYCxcbiAgICAgIF9wYXJhbXM6IFsuLi5leHByZXNzaW9uLl9wYXJhbXMsIGZhbGxiYWNrXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBjb25jYXRFeHByZXNzaW9ucyguLi5hcmdzOiAoc3RyaW5nIHwgU3RyaW5nU3FsRXhwcmVzc2lvbilbXSk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJzdHJpbmdcIixcbiAgICAgIF9zcWw6IGBDT05DQVQoJHthcmdzLm1hcCgoYXJnKSA9PiAoaXNTdHJpbmdWYWx1ZShhcmcpID8gXCI/Ojp0ZXh0XCIgOiBhcmcuX3NxbCkpLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgIF9wYXJhbXM6IGFyZ3MuZmxhdE1hcCgoYXJnKSA9PiAoaXNTdHJpbmdWYWx1ZShhcmcpID8gW2FyZ10gOiBhcmcuX3BhcmFtcykpLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIHVwcGVyKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogXCJVUFBFUig/PylcIixcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIGxvd2VyKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogXCJMT1dFUig/PylcIixcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgd29yZFNpbWlsYXJpdHkoY29sdW1uOiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+O1xuICBzdGF0aWMgd29yZFNpbWlsYXJpdHk8VE51bGxhYmxlIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgY29sdW1uOiBTdHJpbmdTcWxFeHByZXNzaW9uPFROdWxsYWJsZT4sXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiLCBUTnVsbGFibGU+O1xuICBzdGF0aWMgd29yZFNpbWlsYXJpdHkoXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTdHJpbmdTcWxFeHByZXNzaW9uLFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIiwgYm9vbGVhbj4ge1xuICAgIGlmIChpc1N0cmluZ1ZhbHVlKGNvbHVtbikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICAgIF9zcWw6IFwid29yZF9zaW1pbGFyaXR5KD8sID8/KVwiLFxuICAgICAgICBfcGFyYW1zOiBbcXVlcnksIGNvbHVtbl0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGB3b3JkX3NpbWlsYXJpdHkoPywgJHtjb2x1bW5bXCJfc3FsXCJdfSlgLFxuICAgICAgX3BhcmFtczogW3F1ZXJ5LCAuLi5jb2x1bW5bXCJfcGFyYW1zXCJdXSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHNpbWlsYXJpdHkoY29sdW1uOiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+O1xuICBzdGF0aWMgc2ltaWxhcml0eTxUTnVsbGFibGUgZXh0ZW5kcyBib29sZWFuPihcbiAgICBjb2x1bW46IFN0cmluZ1NxbEV4cHJlc3Npb248VE51bGxhYmxlPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCIsIFROdWxsYWJsZT47XG4gIHN0YXRpYyBzaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3RyaW5nU3FsRXhwcmVzc2lvbixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCIsIGJvb2xlYW4+IHtcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZShjb2x1bW4pKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgICBfc3FsOiBcInNpbWlsYXJpdHkoPz8sID8pXCIsXG4gICAgICAgIF9wYXJhbXM6IFtjb2x1bW4sIHF1ZXJ5XSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYHNpbWlsYXJpdHkoJHtjb2x1bW5bXCJfc3FsXCJdfSwgPylgLFxuICAgICAgX3BhcmFtczogWy4uLmNvbHVtbltcIl9wYXJhbXNcIl0sIHF1ZXJ5XSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHN0cmljdFdvcmRTaW1pbGFyaXR5KGNvbHVtbjogc3RyaW5nLCBxdWVyeTogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPjtcbiAgc3RhdGljIHN0cmljdFdvcmRTaW1pbGFyaXR5PFROdWxsYWJsZSBleHRlbmRzIGJvb2xlYW4+KFxuICAgIGNvbHVtbjogU3RyaW5nU3FsRXhwcmVzc2lvbjxUTnVsbGFibGU+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIiwgVE51bGxhYmxlPjtcbiAgc3RhdGljIHN0cmljdFdvcmRTaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3RyaW5nU3FsRXhwcmVzc2lvbixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCIsIGJvb2xlYW4+IHtcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZShjb2x1bW4pKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgICBfc3FsOiBgc3RyaWN0X3dvcmRfc2ltaWxhcml0eSg/LCA/PylgLFxuICAgICAgICBfcGFyYW1zOiBbcXVlcnksIGNvbHVtbl0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBzdHJpY3Rfd29yZF9zaW1pbGFyaXR5KD8sICR7Y29sdW1uW1wiX3NxbFwiXX0pYCxcbiAgICAgIF9wYXJhbXM6IFtxdWVyeSwgLi4uY29sdW1uW1wiX3BhcmFtc1wiXV0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFJhdyBmdW5jdGlvbnMgZm9yIFNFTEVDVFxuICBzdGF0aWMgcmF3U3RyaW5nKHNxbDogc3RyaW5nLCBwYXJhbXM6IEtuZXguUmF3QmluZGluZ1tdID0gW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHtcbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcInN0cmluZ1wiLCBfc3FsOiBzcWwsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgc3RhdGljIHJhd1N0cmluZ0FycmF5KHNxbDogc3RyaW5nLCBwYXJhbXM6IEtuZXguUmF3QmluZGluZ1tdID0gW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nW11cIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwic3RyaW5nW11cIiwgX3NxbDogc3FsLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIHN0YXRpYyByYXdOdW1iZXIoc3FsOiBzdHJpbmcsIHBhcmFtczogS25leC5SYXdCaW5kaW5nW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwibnVtYmVyXCIsIF9zcWw6IHNxbCwgX3BhcmFtczogcGFyYW1zIH07XG4gIH1cblxuICBzdGF0aWMgcmF3Qm9vbGVhbihzcWw6IHN0cmluZywgcGFyYW1zOiBLbmV4LlJhd0JpbmRpbmdbXSA9IFtdKTogU3FsRXhwcmVzc2lvbjxcImJvb2xlYW5cIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwiYm9vbGVhblwiLCBfc3FsOiBzcWwsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgc3RhdGljIHJhd0RhdGUoc3FsOiBzdHJpbmcsIHBhcmFtczogS25leC5SYXdCaW5kaW5nW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJkYXRlXCI+IHtcbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcImRhdGVcIiwgX3NxbDogc3FsLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGVFMg6rKA7IOJ7Ja0IO2VmOydtOudvOydtO2MhVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAuc2VsZWN0KHtcbiAgICogICB0aXRsZTogUHVyaS5oaWdobGlnaHQoXCJwb3N0cy50aXRsZVwiLCBzZWFyY2gpLFxuICAgKiAgIGNvbnRlbnQ6IFB1cmkuaGlnaGxpZ2h0KFwicG9zdHMuY29udGVudFwiLCBzZWFyY2gsIHtcbiAgICogICAgIHN0YXJ0U2VsOiBcIjxtYXJrPlwiLFxuICAgKiAgICAgc3RvcFNlbDogXCI8L21hcms+XCIsXG4gICAqICAgICBtYXhGcmFnbWVudHM6IDMsXG4gICAqICAgfSksXG4gICAqIH0pXG4gICAqL1xuICBzdGF0aWMgdHNIaWdobGlnaHQoXG4gICAgY29sdW1uOiBzdHJpbmcsXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBfb3B0aW9ucz86IFRzSGlnaGxpZ2h0T3B0aW9ucyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgY29uc3QgeyBwYXJzZXIgPSBcIndlYnNlYXJjaF90b190c3F1ZXJ5XCIsIGNvbmZpZyA9IFwic2ltcGxlXCIsIC4uLm9wdGlvbnMgfSA9IF9vcHRpb25zID8/IHt9O1xuXG4gICAgY29uc3QgaGxPcHRpb25QYXJ0cyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4gYCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShrZXkpfT0ke3ZhbHVlfWA7XG4gICAgfSk7XG5cbiAgICBjb25zdCBobE9wdGlvbnMgPSBobE9wdGlvblBhcnRzLmxlbmd0aCA+IDAgPyBgLCAnJHtobE9wdGlvblBhcnRzLmpvaW4oXCIsIFwiKX0nYCA6IFwiXCI7XG5cbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBgdHNfaGVhZGxpbmUoPywgPz8sICR7cGFyc2VyfSg/LCA/KSR7aGxPcHRpb25zfSlgLFxuICAgICAgX3BhcmFtczogW2NvbmZpZywgY29sdW1uLCBjb25maWcsIHF1ZXJ5XSxcbiAgICB9O1xuICB9XG5cbiAgLy8gdHNfcmFua1xuICBzdGF0aWMgdHNSYW5rKFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3FsRXhwcmVzc2lvbjxcInRzdmVjdG9yXCI+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFRzUmFua09wdGlvbnMsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiBQdXJpW1wiX3RzUmFua1wiXShcInRzX3JhbmtcIiwgY29sdW1uLCBxdWVyeSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyB0c19yYW5rX2NkXG4gIHN0YXRpYyB0c1JhbmtDZChcbiAgICBjb2x1bW46IHN0cmluZyB8IFNxbEV4cHJlc3Npb248XCJ0c3ZlY3RvclwiPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUc1JhbmtPcHRpb25zLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4gUHVyaVtcIl90c1JhbmtcIl0oXCJ0c19yYW5rX2NkXCIsIGNvbHVtbiwgcXVlcnksIG9wdGlvbnMpO1xuICB9XG5cbiAgc3RhdGljIHRvVHNWZWN0b3IoY29sdW1uOiBzdHJpbmcsIGNvbmZpZzogc3RyaW5nID0gXCJzaW1wbGVcIik6IFNxbEV4cHJlc3Npb248XCJ0c3ZlY3RvclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInRzdmVjdG9yXCIsXG4gICAgICBfc3FsOiBgdG9fdHN2ZWN0b3IoPywgPz8pYCxcbiAgICAgIF9wYXJhbXM6IFtjb25maWcsIGNvbHVtbl0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBfdHNSYW5rKFxuICAgIHR5cGU6IFwidHNfcmFua1wiIHwgXCJ0c19yYW5rX2NkXCIsXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTcWxFeHByZXNzaW9uPFwidHN2ZWN0b3JcIj4sXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNSYW5rT3B0aW9ucyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgY29uc3Qge1xuICAgICAgcGFyc2VyID0gXCJ3ZWJzZWFyY2hfdG9fdHNxdWVyeVwiLFxuICAgICAgY29uZmlnID0gXCJzaW1wbGVcIixcbiAgICAgIG5vcm1hbGl6YXRpb24sXG4gICAgICB3ZWlnaHRzLFxuICAgIH0gPSBvcHRpb25zID8/IHt9O1xuXG4gICAgY29uc3QgcGFyYW1zID0gW107XG4gICAgbGV0IHNxbFRlbXBsYXRlID0gYCR7dHlwZX0oYDtcblxuICAgIGlmICh3ZWlnaHRzKSB7XG4gICAgICBzcWxUZW1wbGF0ZSArPSBgQVJSQVlbJHt3ZWlnaHRzLm1hcCgoKSA9PiBcIj9cIikuam9pbihcIiwgXCIpfV06OmZsb2F0NFtdLCBgO1xuICAgICAgcGFyYW1zLnB1c2goLi4ud2VpZ2h0cyk7XG4gICAgfVxuXG4gICAgaWYgKGlzU3RyaW5nVmFsdWUoY29sdW1uKSkge1xuICAgICAgc3FsVGVtcGxhdGUgKz0gYD8/LCAke3BhcnNlcn0oPywgPylgO1xuICAgICAgcGFyYW1zLnB1c2goY29sdW1uLCBjb25maWcsIHF1ZXJ5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3FsVGVtcGxhdGUgKz0gYCR7Y29sdW1uW1wiX3NxbFwiXX0sICR7cGFyc2VyfSg/LCA/KWA7XG4gICAgICBwYXJhbXMucHVzaCguLi5jb2x1bW5bXCJfcGFyYW1zXCJdLCBjb25maWcsIHF1ZXJ5KTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXphdGlvbikge1xuICAgICAgc3FsVGVtcGxhdGUgKz0gXCIsID9cIjtcbiAgICAgIHBhcmFtcy5wdXNoKG5vcm1hbGl6YXRpb24pO1xuICAgIH1cblxuICAgIHNxbFRlbXBsYXRlICs9IFwiKVwiO1xuXG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJudW1iZXJcIiwgX3NxbDogc3FsVGVtcGxhdGUsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBHcm9vbmdhIEZ1bGxUZXh0IOyduOuNseyKpCDqsoDsg4kg7KCQ7IiYXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC5zZWxlY3Qoe1xuICAgKiAgIHNjb3JlOiBQdXJpLnNjb3JlKCksXG4gICAqIH0pXG4gICAqL1xuICBzdGF0aWMgc2NvcmUoKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIFB1cmkucmF3TnVtYmVyKFwicGdyb29uZ2Ffc2NvcmUodGFibGVvaWQsIGN0aWQpXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBHcm9vbmdhIEZ1bGxUZXh0IOyduOuNseyKpCDqsoDsg4kg7ZWY7J2065287J207YyFXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC5zZWxlY3Qoe1xuICAgKiAgIHRpdGxlOiBQdXJpLmhpZ2hsaWdodChcInBvc3RzLnRpdGxlXCIsIHNlYXJjaCksXG4gICAqIH0pXG4gICAqL1xuICBzdGF0aWMgaGlnaGxpZ2h0KGNvbHVtbjogc3RyaW5nLCBxdWVyeTogc3RyaW5nIHwgc3RyaW5nW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+O1xuICBzdGF0aWMgaGlnaGxpZ2h0KGNvbHVtbnM6IHN0cmluZ1tdLCBxdWVyeTogc3RyaW5nIHwgc3RyaW5nW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nW11cIj47XG5cbiAgc3RhdGljIGhpZ2hsaWdodChcbiAgICBjb2x1bW5PckNvbHVtbnM6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIHF1ZXJ5OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdbXVwiPiB7XG4gICAgY29uc3QgcXVlcnlBcnIgPSBBcnJheS5pc0FycmF5KHF1ZXJ5KSA/IHF1ZXJ5IDogW3F1ZXJ5XTtcbiAgICBjb25zdCBxdWVyeUNsYXVzZSA9IGBBUlJBWVske3F1ZXJ5QXJyLm1hcCgoKSA9PiBcIj9cIikuam9pbihcIiwgXCIpfV1gO1xuXG4gICAgLy8g64uo7J28IOy7rOufvOyduCDqsr3smrBcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZShjb2x1bW5PckNvbHVtbnMpKSB7XG4gICAgICByZXR1cm4gUHVyaS5yYXdTdHJpbmcoYHBncm9vbmdhX2hpZ2hsaWdodF9odG1sKD8/LCAke3F1ZXJ5Q2xhdXNlfSlgLCBbXG4gICAgICAgIGNvbHVtbk9yQ29sdW1ucyxcbiAgICAgICAgLi4ucXVlcnlBcnIsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICAvLyDsu6zrn7wg67Cw7Je07J24IOqyveyasFxuICAgIHJldHVybiBQdXJpLnJhd1N0cmluZ0FycmF5KFxuICAgICAgYHBncm9vbmdhX2hpZ2hsaWdodF9odG1sKEFSUkFZWyR7Y29sdW1uT3JDb2x1bW5zLm1hcCgoKSA9PiBcIj8/XCIpLmpvaW4oXCIsIFwiKX1dLCAke3F1ZXJ5Q2xhdXNlfSlgLFxuICAgICAgWy4uLmNvbHVtbk9yQ29sdW1ucywgLi4ucXVlcnlBcnJdLFxuICAgICk7XG4gIH1cblxuICBqc29uVGV4dChcbiAgICBjb2x1bW46IEpzb25Db2x1bW5zPFRUYWJsZXM+LFxuICAgIC4uLnBhdGg6IFtzdHJpbmcsIC4uLnN0cmluZ1tdXVxuICApOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCIsIHRydWU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBgPz8gIz4+IEFSUkFZWyR7cGF0aC5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW4sIC4uLnBhdGhdLFxuICAgIH07XG4gIH1cblxuICAvLyBTRUxFQ1QgKG92ZXJ3cml0ZSlcbiAgc2VsZWN0PFRTZWxlY3QgZXh0ZW5kcyBTdHJpbmdFeHByZXNzaW9uU2VsZWN0PihcbiAgICBzZWxlY3RPYmo6IFRTZWxlY3QsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgU3RyaW5nRXhwcmVzc2lvblNlbGVjdFJlc3VsdDxUU2VsZWN0Pj47XG4gIHNlbGVjdDxUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+PihcbiAgICBzZWxlY3RPYmo6IFRTZWxlY3QsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgUGFyc2VTZWxlY3RPYmplY3Q8VFRhYmxlcywgVFNlbGVjdD4+O1xuICBzZWxlY3Qoc2VsZWN0T2JqOiBTZWxlY3RPYmplY3Q8VFRhYmxlcz4pOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIGFueT4ge1xuICAgIC8vIOykkeyyqSDqsJ3ssrTrpbwgZmxhdO2VmOqyjCDrs4DtmZhcbiAgICBjb25zdCBmbGF0U2VsZWN0ID0gdGhpcy5mbGF0dGVuU2VsZWN0KHNlbGVjdE9iaik7XG5cbiAgICBjb25zdCBzZWxlY3RDbGF1c2VzOiAoc3RyaW5nIHwgS25leC5SYXcpW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgW2FsaWFzLCBjb2x1bW5PckZ1bmN0aW9uXSBvZiBPYmplY3QuZW50cmllcyhmbGF0U2VsZWN0KSkge1xuICAgICAgaWYgKGlzU3FsRXhwcmVzc2lvbihjb2x1bW5PckZ1bmN0aW9uKSkge1xuICAgICAgICAvLyBTUUwg7ZWo7IiY7J24IOqyveyasFxuICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goXG4gICAgICAgICAgdGhpcy5rbmV4LnJhdyhgJHtjb2x1bW5PckZ1bmN0aW9uW1wiX3NxbFwiXX0gQVMgXCIke2FsaWFzfVwiYCwgY29sdW1uT3JGdW5jdGlvbltcIl9wYXJhbXNcIl0pLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7J2867CYIOy7rOufvOyduCDqsr3smrBcbiAgICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgY29uc3QgY29sdW1uUGF0aCA9IGNvbHVtbk9yRnVuY3Rpb24gYXMgc3RyaW5nO1xuICAgICAgICBpZiAoYWxpYXMgPT09IGNvbHVtblBhdGgpIHtcbiAgICAgICAgICAvLyBhbGlhc+yZgCDsu6zrn7zrqoXsnbQg6rCZ7Jy866m0IGFsaWFzIOyDneuetVxuICAgICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChjb2x1bW5QYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBhbGlhcyDsp4DsoJVcbiAgICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goYCR7Y29sdW1uUGF0aH0gQVMgJHthbGlhc31gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdChzZWxlY3RDbGF1c2VzKTtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiDspJHssqkg6rCd7LK066W8IGZsYXQg6rCd7LK066GcIOuzgO2ZmFxuICAgKiDsmIg6IHsgcGFyZW50OiB7IGlkOiBcInBhcmVudC5pZFwiLCBuYW1lOiBcInBhcmVudC5uYW1lXCIgfSB9XG4gICAqICAg4oaSIHsgcGFyZW50X19pZDogXCJwYXJlbnQuaWRcIiwgcGFyZW50X19uYW1lOiBcInBhcmVudC5uYW1lXCIgfVxuICAgKi9cbiAgcHJpdmF0ZSAqZmxhdHRlblNlbGVjdEVudHJpZXMoXG4gICAgc2VsZWN0T2JqOiBTZWxlY3RPYmplY3Q8VFRhYmxlcz4sXG4gICAgcHJlZml4ID0gXCJcIixcbiAgKTogR2VuZXJhdG9yPFtzdHJpbmcsIFNlbGVjdFZhbHVlPFRUYWJsZXM+XSwgdm9pZD4ge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNlbGVjdE9iaikpIHtcbiAgICAgIGNvbnN0IGZ1bGxLZXkgPSBwcmVmaXggPyBgJHtwcmVmaXh9X18ke2tleX1gIDoga2V5O1xuXG4gICAgICBpZiAoaXNOZXN0ZWRTZWxlY3RPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHlpZWxkKiB0aGlzLmZsYXR0ZW5TZWxlY3RFbnRyaWVzKHZhbHVlLCBmdWxsS2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHlpZWxkIFtmdWxsS2V5LCB2YWx1ZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmbGF0dGVuU2VsZWN0KHNlbGVjdE9iajogU2VsZWN0T2JqZWN0PFRUYWJsZXM+LCBwcmVmaXggPSBcIlwiKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyh0aGlzLmZsYXR0ZW5TZWxlY3RFbnRyaWVzKHNlbGVjdE9iaiwgcHJlZml4KSk7XG4gIH1cblxuICAvLyBTRUxFQ1QgKHNlbGVjdOuKlCBvdmVyd3JpdGUsIGFwcGVuZFNlbGVjdOuKlCBhcHBlbmQpXG4gIGFwcGVuZFNlbGVjdDxUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+PihcbiAgICBzZWxlY3RPYmo6IFRTZWxlY3QsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdCAmIFBhcnNlU2VsZWN0T2JqZWN0PFRUYWJsZXMsIFRTZWxlY3Q+PiB7XG4gICAgLy8g7KSR7LKpIOqwneyytOulvCBmbGF07ZWY6rKMIOuzgO2ZmFxuICAgIGNvbnN0IGZsYXRTZWxlY3QgPSB0aGlzLmZsYXR0ZW5TZWxlY3Qoc2VsZWN0T2JqKTtcblxuICAgIGNvbnN0IHNlbGVjdENsYXVzZXM6IChzdHJpbmcgfCBLbmV4LlJhdylbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbYWxpYXMsIGNvbHVtbk9yRnVuY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKGZsYXRTZWxlY3QpKSB7XG4gICAgICBpZiAoaXNTcWxFeHByZXNzaW9uKGNvbHVtbk9yRnVuY3Rpb24pKSB7XG4gICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChcbiAgICAgICAgICB0aGlzLmtuZXgucmF3KGAke2NvbHVtbk9yRnVuY3Rpb25bXCJfc3FsXCJdfSBBUyAke2FsaWFzfWAsIGNvbHVtbk9yRnVuY3Rpb25bXCJfcGFyYW1zXCJdKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICAgIGNvbnN0IGNvbHVtblBhdGggPSBjb2x1bW5PckZ1bmN0aW9uIGFzIHN0cmluZztcbiAgICAgICAgaWYgKGFsaWFzID09PSBjb2x1bW5QYXRoKSB7XG4gICAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKGNvbHVtblBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdENsYXVzZXMucHVzaCh0aGlzLmtuZXgucmVmKGNvbHVtblBhdGgpLmFzKGFsaWFzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3Qoc2VsZWN0Q2xhdXNlcyk7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBTRUxFQ1QgKlxuICBzZWxlY3RBbGwoKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBTZWxlY3RBbGxSZXN1bHQ8VFRhYmxlcz4+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3QoXCIqXCIpO1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8gRElTVElOQ1RcbiAgZGlzdGluY3Q8VENvbHVtbnMgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PiguLi5jb2x1bW5zOiBUQ29sdW1uc1tdKTogdGhpcztcbiAgZGlzdGluY3QoLi4uY29sdW1uczogc3RyaW5nW10pOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5kaXN0aW5jdCguLi5jb2x1bW5zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIENMRUFSXG4gIGNsZWFyKHN0YXRlbWVudDogQ2xlYXJTdGF0ZW1lbnRzKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkuY2xlYXIoc3RhdGVtZW50KTtcbiAgICBpZiAoc3RhdGVtZW50ID09PSBcImpvaW5cIikge1xuICAgICAgdGhpcy5jbGVhckpvaW5SZWdpc3RyYXRpb25zKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8ga25leOyXkCDsl4bslrTshJwg7KeB7KCRIOq1rO2YhO2VqFxuICBjbGVhckpvaW4oYWxpYXM6IHN0cmluZyk6IHRoaXMge1xuICAgIGxldCByZW1vdmVkID0gZmFsc2U7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAodGhpcy5rbmV4UXVlcnkgYXMgYW55KVtcIl9zdGF0ZW1lbnRzXCJdID0gKHRoaXMua25leFF1ZXJ5IGFzIGFueSlbXCJfc3RhdGVtZW50c1wiXS5maWx0ZXIoXG4gICAgICAoczogYW55KSA9PiB7XG4gICAgICAgIGlmIChcImpvaW5UeXBlXCIgaW4gcykge1xuICAgICAgICAgIGNvbnN0IHNob3VsZFJlbW92ZSA9IHRoaXMuZ2V0S25leEpvaW5BbGlhcyhzLnRhYmxlKSA9PT0gYWxpYXM7XG4gICAgICAgICAgcmVtb3ZlZCB8fD0gc2hvdWxkUmVtb3ZlO1xuICAgICAgICAgIHJldHVybiAhc2hvdWxkUmVtb3ZlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gICAgaWYgKHJlbW92ZWQgJiYgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LmdldChhbGlhcyk/LmtpbmQgPT09IFwiam9pblwiKSB7XG4gICAgICB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkuZGVsZXRlKGFsaWFzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBKT0lOOiDshJzruIzsv7zrpqwgKyBBbGlhc1xuICBqb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTdWJSZXN1bHQ+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+LCAvLyDshJzruIzsv7zrpqzsnZggVFJlc3VsdFxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gSk9JTjog7YWM7J2067iUICsgQWxpYXNcbiAgam9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCAvLyBUVGFibGVzIO2ZleyepSFcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIEpPSU46IO2FjOydtOu4lOuqhVxuICBqb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hPihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5UYWJsZSAmIHN0cmluZ30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCAvLyDthYzsnbTruJTrqoXsnbQg7YKkXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBKT0lOOiDshJzruIzsv7zrpqwgKyBBbGlhcyArIOy9nOuwsVxuICBqb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+LCBUUmVzdWx0PjtcbiAgLy8gSk9JTjog7YWM7J2067iUICsgQWxpYXMgKyDsvZzrsLFcbiAgam9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCBUUmVzdWx0PjtcbiAgLy8gSk9JTjog7YWM7J2067iU66qFICsg7L2c67CxXG4gIGpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4sIFRSZXN1bHQ+O1xuICAvLyBKT0lOIOyLpOygnCDqtaztmIRcbiAgam9pbih0YWJsZU5hbWVPclNwZWM6IGFueSwgLi4uYXJnczogYW55W10pOiBhbnkge1xuICAgIHJldHVybiB0aGlzW1wiX19jb21tb25Kb2luXCJdKFwiam9pblwiLCB0YWJsZU5hbWVPclNwZWMsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLy8gRU5TVVJFIEpPSU46IO2FjOydtOu4lCArIEFsaWFzXG4gIGVuc3VyZUpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXT4sIFRSZXN1bHQ+O1xuICAvLyBFTlNVUkUgSk9JTjog7YWM7J2067iU66qFXG4gIGVuc3VyZUpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pblRhYmxlICYgc3RyaW5nfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCBUUmVzdWx0PjtcbiAgZW5zdXJlSm9pbih0YWJsZU5hbWVPclNwZWM6IGFueSwgbGVmdDogc3RyaW5nLCByaWdodDogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gdGhpc1tcIl9fZW5zdXJlSm9pblwiXShcImpvaW5cIiwgdGFibGVOYW1lT3JTcGVjLCBsZWZ0LCByaWdodCk7XG4gIH1cblxuICAvLyBMRUZUIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzXG4gIGxlZnRKb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTdWJSZXN1bHQ+fWAsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0ICYgTGVmdEpvaW5lZE1hcmtlcj4sIFRSZXN1bHQ+OyAvLyDshJzruIzsv7zrpqzsnZggVFJlc3VsdFxuICAvLyBMRUZUIEpPSU46IO2FjOydtOu4lCArIEFsaWFzXG4gIC8vIEZLIG51bGxhYmxlIOyXrOu2gOyXkCDrlLDrnbwg7J6Q64+Z7Jy866GcIExlZnRKb2luZWRNYXJrZXIg6rKw7KCVXG4gIGxlZnRKb2luPFxuICAgIFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLFxuICAgIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsXG4gICAgVExlZnQgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICA+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGxlZnQ6IFRMZWZ0LFxuICAgIHJpZ2h0OiBgJHtUSm9pbkFsaWFzfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXSAmIExlZnRKb2luTWFya2VyRm9yPFRUYWJsZXMsIFRMZWZ0Pj4sXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBMRUZUIEpPSU46IO2FjOydtOu4lOuqhVxuICBsZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVExlZnQgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgbGVmdDogVExlZnQsXG4gICAgcmlnaHQ6IGAke1RKb2luVGFibGUgJiBzdHJpbmd9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5NYXJrZXJGb3I8VFRhYmxlcywgVExlZnQ+PixcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIExFRlQgSk9JTjog7ISc67iM7L+866asICsgQWxpYXMgKyDsvZzrsLFcbiAgbGVmdEpvaW48VEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZywgVFN1YlJlc3VsdD4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD4gfSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdD4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdCAmIExlZnRKb2luZWRNYXJrZXI+LCBUUmVzdWx0PjtcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJQgKyBBbGlhcyArIOy9nOuwsVxuICBsZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBMZWZ0Sm9pbmVkTWFya2VyPiwgVFJlc3VsdD47XG4gIC8vIExFRlQgSk9JTjog7YWM7J2067iU66qFICsg7L2c67CxXG4gIGxlZnRKb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hPihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBMZWZ0Sm9pbmVkTWFya2VyPiwgVFJlc3VsdD47XG4gIC8vIExFRlQgSk9JTiDsi6TsoJwg6rWs7ZiEXG4gIGxlZnRKb2luKHRhYmxlTmFtZU9yU3BlYzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXNbXCJfX2NvbW1vbkpvaW5cIl0oXCJsZWZ0Sm9pblwiLCB0YWJsZU5hbWVPclNwZWMsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLy8gRU5TVVJFIExFRlQgSk9JTjog7YWM7J2067iUICsgQWxpYXNcbiAgZW5zdXJlTGVmdEpvaW48XG4gICAgVEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsXG4gICAgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZyxcbiAgICBUTGVmdCBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gID4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgbGVmdDogVExlZnQsXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5NYXJrZXJGb3I8VFRhYmxlcywgVExlZnQ+PixcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIEVOU1VSRSBMRUZUIEpPSU46IO2FjOydtOu4lOuqhVxuICBlbnN1cmVMZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVExlZnQgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgbGVmdDogVExlZnQsXG4gICAgcmlnaHQ6IGAke1RKb2luVGFibGUgJiBzdHJpbmd9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5NYXJrZXJGb3I8VFRhYmxlcywgVExlZnQ+PixcbiAgICBUUmVzdWx0XG4gID47XG4gIGVuc3VyZUxlZnRKb2luKHRhYmxlTmFtZU9yU3BlYzogYW55LCBsZWZ0OiBzdHJpbmcsIHJpZ2h0OiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB0aGlzW1wiX19lbnN1cmVKb2luXCJdKFwibGVmdEpvaW5cIiwgdGFibGVOYW1lT3JTcGVjLCBsZWZ0LCByaWdodCk7XG4gIH1cblxuICBfX2NvbW1vbkpvaW4oam9pblR5cGU6IFwiam9pblwiIHwgXCJsZWZ0Sm9pblwiLCB0YWJsZU5hbWVPclNwZWM6IGFueSwgLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLmNyZWF0ZUpvaW5SZWdpc3RyYXRpb24oam9pblR5cGUsIHRhYmxlTmFtZU9yU3BlYywgYXJncyk7XG4gICAgdGhpcy5hc3NlcnRDb3JyZWxhdGlvbkF2YWlsYWJsZShyZWdpc3RyYXRpb24pO1xuXG4gICAgaWYgKGlzU3RyaW5nVmFsdWUodGFibGVOYW1lT3JTcGVjKSkge1xuICAgICAgLy8gQ2FzZSAxOiBqb2luKFwicG9zdHNcIiwgLi4uKVxuICAgICAgY29uc3QgdGFibGVOYW1lID0gdGFibGVOYW1lT3JTcGVjO1xuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgaXNGdW5jdGlvblZhbHVlKGFyZ3NbMF0pKSB7XG4gICAgICAgIC8vIGpvaW4oXCJwb3N0c1wiLCBjYWxsYmFjaylcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzWzBdO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0odGFibGVOYW1lLCAoam9pbkNsYXVzZSkgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKG5ldyBKb2luQ2xhdXNlR3JvdXAoam9pbkNsYXVzZSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGpvaW4oXCJwb3N0c1wiLCBsZWZ0LCByaWdodClcbiAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXSh0YWJsZU5hbWUsIGxlZnQsIHJpZ2h0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0VmFsdWUodGFibGVOYW1lT3JTcGVjKSkge1xuICAgICAgLy8gQ2FzZSAyOiBqb2luKHsgYWxpYXM6IFwidGFibGVcIiB9LCAuLi4pIG9yIGpvaW4oeyBhbGlhczogc3VicXVlcnkgfSwgLi4uKVxuICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRhYmxlTmFtZU9yU3BlYyk7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGFibGUgc3BlYyBtdXN0IGhhdmUgZXhhY3RseSBvbmUgZW50cnlcIik7XG4gICAgICB9XG4gICAgICBhc3NlcnQoZW50cmllc1swXSk7XG4gICAgICBjb25zdCBbW2FsaWFzLCBzcGVjXV0gPSBlbnRyaWVzO1xuXG4gICAgICBpZiAoaXNTdHJpbmdWYWx1ZShzcGVjKSkge1xuICAgICAgICAvLyDthYzsnbTruJQ6IGpvaW4oeyBwOiBcInBvc3RzXCIgfSwgLi4uKVxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgaXNGdW5jdGlvblZhbHVlKGFyZ3NbMF0pKSB7XG4gICAgICAgICAgLy8gQ2FsbGJhY2tcbiAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHsgW2FsaWFzXTogc3BlYyB9LCAoam9pbkNsYXVzZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEpvaW5DbGF1c2VHcm91cChqb2luQ2xhdXNlKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2ltcGxlXG4gICAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHsgW2FsaWFzXTogc3BlYyB9LCBsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3BlYyBpbnN0YW5jZW9mIFB1cmkpIHtcbiAgICAgICAgLy8g7ISc67iM7L+866asOiBqb2luKHsgc3E6IHN1YnF1ZXJ5IH0sIC4uLilcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIGlzRnVuY3Rpb25WYWx1ZShhcmdzWzBdKSkge1xuICAgICAgICAgIC8vIENhbGxiYWNrXG4gICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzWzBdO1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXShzcGVjLnJhd1F1ZXJ5KCkuYXMoYWxpYXMpLCAoam9pbkNsYXVzZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEpvaW5DbGF1c2VHcm91cChqb2luQ2xhdXNlKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2ltcGxlXG4gICAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHNwZWMucmF3UXVlcnkoKS5hcyhhbGlhcyksIGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0YWJsZSBzcGVjaWZpY2F0aW9uXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50c1wiKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkuc2V0KHJlZ2lzdHJhdGlvbi5hbGlhcywgcmVnaXN0cmF0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgX19lbnN1cmVKb2luKFxuICAgIGpvaW5UeXBlOiBcImpvaW5cIiB8IFwibGVmdEpvaW5cIixcbiAgICB0YWJsZU5hbWVPclNwZWM6IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgbGVmdDogc3RyaW5nLFxuICAgIHJpZ2h0OiBzdHJpbmcsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IHJlcXVlc3RlZCA9IHRoaXMuY3JlYXRlSm9pblJlZ2lzdHJhdGlvbihqb2luVHlwZSwgdGFibGVOYW1lT3JTcGVjLCBbbGVmdCwgcmlnaHRdKTtcbiAgICBpZiAoIXJlcXVlc3RlZC5yZXVzYWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtqb2luVHlwZSA9PT0gXCJqb2luXCIgPyBcImVuc3VyZUpvaW5cIiA6IFwiZW5zdXJlTGVmdEpvaW5cIn0gb25seSBzdXBwb3J0cyBwaHlzaWNhbCB0YWJsZXMgd2l0aCBzaW1wbGUgY29sdW1uIGVxdWFsaXR5IGNvbmRpdGlvbnMuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LmdldChyZXF1ZXN0ZWQuYWxpYXMpO1xuXG4gICAgaWYgKCFleGlzdGluZykge1xuICAgICAgcmV0dXJuIHRoaXNbXCJfX2NvbW1vbkpvaW5cIl0oam9pblR5cGUsIHRhYmxlTmFtZU9yU3BlYywgbGVmdCwgcmlnaHQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU2FtZUpvaW5SZWdpc3RyYXRpb24oZXhpc3RpbmcsIHJlcXVlc3RlZCkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRocm93IHRoaXMuY3JlYXRlSm9pbkNvbmZsaWN0RXJyb3IoZXhpc3RpbmcsIHJlcXVlc3RlZCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUpvaW5SZWdpc3RyYXRpb24oXG4gICAgam9pblR5cGU6IFwiam9pblwiIHwgXCJsZWZ0Sm9pblwiLFxuICAgIHRhYmxlTmFtZU9yU3BlYzogYW55LFxuICAgIGFyZ3M6IGFueVtdLFxuICApOiBKb2luUmVnaXN0cmF0aW9uIHtcbiAgICBsZXQgYWxpYXM6IHN0cmluZztcbiAgICBsZXQgdGFibGU6IHN0cmluZyB8IG51bGw7XG5cbiAgICBpZiAoaXNTdHJpbmdWYWx1ZSh0YWJsZU5hbWVPclNwZWMpKSB7XG4gICAgICBhbGlhcyA9IHRhYmxlTmFtZU9yU3BlYztcbiAgICAgIHRhYmxlID0gdGFibGVOYW1lT3JTcGVjO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3RWYWx1ZSh0YWJsZU5hbWVPclNwZWMpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFibGVOYW1lT3JTcGVjKTtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUYWJsZSBzcGVjIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBlbnRyeVwiKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChlbnRyaWVzWzBdKTtcbiAgICAgIGNvbnN0IFtbam9pbkFsaWFzLCBzcGVjXV0gPSBlbnRyaWVzO1xuICAgICAgYWxpYXMgPSBqb2luQWxpYXM7XG4gICAgICB0YWJsZSA9IGlzU3RyaW5nVmFsdWUoc3BlYykgPyBzcGVjIDogbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHNcIik7XG4gICAgfVxuXG4gICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgY29uc3QgcmV1c2FibGUgPVxuICAgICAgdGFibGUgIT09IG51bGwgJiYgYXJncy5sZW5ndGggPT09IDIgJiYgaXNTdHJpbmdWYWx1ZShsZWZ0KSAmJiBpc1N0cmluZ1ZhbHVlKHJpZ2h0KTtcblxuICAgIHJldHVybiB7XG4gICAgICBraW5kOiBcImpvaW5cIixcbiAgICAgIGFsaWFzLFxuICAgICAgdGFibGUsXG4gICAgICBqb2luVHlwZSxcbiAgICAgIGxlZnQ6IHJldXNhYmxlID8gbGVmdCA6IG51bGwsXG4gICAgICByaWdodDogcmV1c2FibGUgPyByaWdodCA6IG51bGwsXG4gICAgICByZXVzYWJsZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnRDb3JyZWxhdGlvbkF2YWlsYWJsZShyZXF1ZXN0ZWQ6IEpvaW5SZWdpc3RyYXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuY29ycmVsYXRpb25SZWdpc3RyeS5nZXQocmVxdWVzdGVkLmFsaWFzKTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIGlmICh0aGlzLmlzU2FtZUpvaW5SZWdpc3RyYXRpb24oZXhpc3RpbmcsIHJlcXVlc3RlZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBKb2luIGFsaWFzIFwiJHtyZXF1ZXN0ZWQuYWxpYXN9XCIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiBVc2UgZW5zdXJlSm9pbigpIG9yIGVuc3VyZUxlZnRKb2luKCkgdG8gcmV1c2UgYW4gaWRlbnRpY2FsIGpvaW4uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRocm93IHRoaXMuY3JlYXRlSm9pbkNvbmZsaWN0RXJyb3IoZXhpc3RpbmcsIHJlcXVlc3RlZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1NhbWVKb2luUmVnaXN0cmF0aW9uKFxuICAgIGV4aXN0aW5nOiBDb3JyZWxhdGlvblJlZ2lzdHJhdGlvbixcbiAgICByZXF1ZXN0ZWQ6IEpvaW5SZWdpc3RyYXRpb24sXG4gICk6IGV4aXN0aW5nIGlzIEpvaW5SZWdpc3RyYXRpb24ge1xuICAgIHJldHVybiAoXG4gICAgICBleGlzdGluZy5raW5kID09PSBcImpvaW5cIiAmJlxuICAgICAgZXhpc3RpbmcucmV1c2FibGUgJiZcbiAgICAgIHJlcXVlc3RlZC5yZXVzYWJsZSAmJlxuICAgICAgZXhpc3RpbmcudGFibGUgPT09IHJlcXVlc3RlZC50YWJsZSAmJlxuICAgICAgZXhpc3Rpbmcuam9pblR5cGUgPT09IHJlcXVlc3RlZC5qb2luVHlwZSAmJlxuICAgICAgZXhpc3RpbmcubGVmdCA9PT0gcmVxdWVzdGVkLmxlZnQgJiZcbiAgICAgIGV4aXN0aW5nLnJpZ2h0ID09PSByZXF1ZXN0ZWQucmlnaHRcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVKb2luQ29uZmxpY3RFcnJvcihcbiAgICBleGlzdGluZzogQ29ycmVsYXRpb25SZWdpc3RyYXRpb24sXG4gICAgcmVxdWVzdGVkOiBKb2luUmVnaXN0cmF0aW9uLFxuICApOiBFcnJvciB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICAgIFtcbiAgICAgICAgYEpvaW4gYWxpYXMgXCIke3JlcXVlc3RlZC5hbGlhc31cIiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCBhIGRpZmZlcmVudCBkZWZpbml0aW9uLmAsXG4gICAgICAgIGBFeGlzdGluZzogJHt0aGlzLmZvcm1hdENvcnJlbGF0aW9uUmVnaXN0cmF0aW9uKGV4aXN0aW5nKX1gLFxuICAgICAgICBgUmVxdWVzdGVkOiAke3RoaXMuZm9ybWF0Q29ycmVsYXRpb25SZWdpc3RyYXRpb24ocmVxdWVzdGVkKX1gLFxuICAgICAgXS5qb2luKFwiXFxuXCIpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdENvcnJlbGF0aW9uUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbjogQ29ycmVsYXRpb25SZWdpc3RyYXRpb24pOiBzdHJpbmcge1xuICAgIGlmIChyZWdpc3RyYXRpb24ua2luZCA9PT0gXCJmcm9tXCIpIHtcbiAgICAgIHJldHVybiBgRlJPTSAke3JlZ2lzdHJhdGlvbi50YWJsZSA/PyBcInN1YnF1ZXJ5XCJ9IEFTICR7cmVnaXN0cmF0aW9uLmFsaWFzfWA7XG4gICAgfVxuXG4gICAgY29uc3Qgam9pbktleXdvcmQgPSByZWdpc3RyYXRpb24uam9pblR5cGUgPT09IFwiam9pblwiID8gXCJKT0lOXCIgOiBcIkxFRlQgSk9JTlwiO1xuICAgIGNvbnN0IHNvdXJjZSA9IHJlZ2lzdHJhdGlvbi50YWJsZSA/PyBcIm9wYXF1ZSBzb3VyY2VcIjtcbiAgICBjb25zdCBjb25kaXRpb24gPSByZWdpc3RyYXRpb24ucmV1c2FibGVcbiAgICAgID8gYCBPTiAke3JlZ2lzdHJhdGlvbi5sZWZ0fSA9ICR7cmVnaXN0cmF0aW9uLnJpZ2h0fWBcbiAgICAgIDogXCIgd2l0aCBvcGFxdWUgY29uZGl0aW9uXCI7XG4gICAgcmV0dXJuIGAke2pvaW5LZXl3b3JkfSAke3NvdXJjZX0gQVMgJHtyZWdpc3RyYXRpb24uYWxpYXN9JHtjb25kaXRpb259YDtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJKb2luUmVnaXN0cmF0aW9ucygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFthbGlhcywgcmVnaXN0cmF0aW9uXSBvZiB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkpIHtcbiAgICAgIGlmIChyZWdpc3RyYXRpb24ua2luZCA9PT0gXCJqb2luXCIpIHtcbiAgICAgICAgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LmRlbGV0ZShhbGlhcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRLbmV4Sm9pbkFsaWFzPFZhbHVlPih0YWJsZTogVmFsdWUpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZSh0YWJsZSkpIHtcbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0VmFsdWUodGFibGUpICYmIHRhYmxlICE9PSBudWxsKSB7XG4gICAgICBpZiAoXG4gICAgICAgIFwiX3NpbmdsZVwiIGluIHRhYmxlICYmXG4gICAgICAgIGlzT2JqZWN0VmFsdWUodGFibGVbXCJfc2luZ2xlXCJdKSAmJlxuICAgICAgICB0YWJsZVtcIl9zaW5nbGVcIl0gIT09IG51bGwgJiZcbiAgICAgICAgXCJhc1wiIGluIHRhYmxlW1wiX3NpbmdsZVwiXSAmJlxuICAgICAgICBpc1N0cmluZ1ZhbHVlKHRhYmxlW1wiX3NpbmdsZVwiXS5hcylcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdGFibGVbXCJfc2luZ2xlXCJdLmFzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRhYmxlKVswXSA/PyBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFdIRVJFOiDqsJ3ssrQgLSDsgqzsmqk6IC53aGVyZSh7IFwidS5pZFwiOiAxLCBcInUuc3RhdHVzXCI6IFwiYWN0aXZlXCIgfSlcbiAgd2hlcmUoY29uZGl0aW9uczogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiB0aGlzO1xuICAvLyBXSEVSRTog7Lus65+8IC0g7IKs7JqpOiAud2hlcmUoXCJ1LmlkXCIsIDEpLCAud2hlcmUoXCJ1LmlkXCIsIG51bGwpXG4gIHdoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBXSEVSRTog7Lus65+8IC0g7IKs7JqpOiAud2hlcmUoXCJ1LmlkXCIsIFwiPlwiLCAxMCksIC53aGVyZShcInUuaWRcIiwgXCIhPVwiLCBudWxsKVxuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIG9wZXJhdG9yOiBXaGVyZU9wZXJhdG9yLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gV0hFUkU6IFNRTCDtkZztmITsi50gLSDsgqzsmqk6IC53aGVyZShwdXJpLnJhdyhcIkNPTkNBVCh1Lm5hbWUsIHUuZW1haWwpXCIpLCBcImxpa2VcIiwgXCIldGVzdCVcIilcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEtuZXguUmF3Pihjb2x1bW46IFRDb2x1bW4sIG9wZXJhdG9yOiBXaGVyZU9wZXJhdG9yLCB2YWx1ZTogYW55KTogdGhpcztcbiAgLy8gV0hFUkU6IOy7rOufvCAtIOyCrOyaqTogLndoZXJlKFwidS5pZFwiLCBcImxpa2VcIiwgXCIldGVzdCVcIilcbiAgd2hlcmUoLi4uYXJnczogW2NvbHVtbk9yQ29uZGl0aW9uczogYW55LCBvcGVyYXRvck9yVmFsdWU/OiBhbnksIHZhbHVlPzogYW55XSk6IHRoaXMge1xuICAgIGNvbnN0IFtjb2x1bW5PckNvbmRpdGlvbnMsIG9wZXJhdG9yT3JWYWx1ZSwgdmFsdWVdID0gYXJncztcbiAgICBpZiAoaXNPYmplY3RWYWx1ZShjb2x1bW5PckNvbmRpdGlvbnMpKSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG9wZXJhdG9yT3JWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU51bGwoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMsIG9wZXJhdG9yT3JWYWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG9wZXJhdG9yT3JWYWx1ZSA9PT0gXCIhPVwiKSB7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVOb3ROdWxsKGNvbHVtbk9yQ29uZGl0aW9ucyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0b3JPclZhbHVlID09PSBcIj1cIikge1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTnVsbChjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMsIG9wZXJhdG9yT3JWYWx1ZSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIElOXG4gIHdoZXJlSW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IChFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPiAmIEtuZXguVmFsdWUpW10sXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4ge1xuICAgIC8vIEtuZXjsnZgg67mE7Ja0IOyeiOuKlCBJTiDrsLDsl7Qg7LKY66as7JmAIOuPmeydvO2VmOqyjCDtla3sg4Eg6rGw7KeT7J24IOyhsOqxtOydhCDsg53shLHtlanri4jri6QuXG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KFwiMSA9IDBcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IHZhbHVlcy5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGA/PyBpbiAoJHtwbGFjZWhvbGRlcnN9KWAsIFtTdHJpbmcoY29sdW1uKSwgLi4udmFsdWVzXSk7XG4gICAgfVxuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8gV0hFUkUgTk9UIElOXG4gIHdoZXJlTm90SW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IChFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPiAmIEtuZXguVmFsdWUpW10sXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4ge1xuICAgIC8vIEtuZXjsnZgg67mE7Ja0IOyeiOuKlCBOT1QgSU4g67Cw7Je0IOyymOumrOyZgCDrj5nsnbztlZjqsowg7ZWt7IOBIOywuOyduCDsobDqsbTsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhcIjEgPSAxXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSB2YWx1ZXMubWFwKCgpID0+IFwiP1wiKS5qb2luKFwiLCBcIik7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgPz8gbm90IGluICgke3BsYWNlaG9sZGVyc30pYCwgW1N0cmluZyhjb2x1bW4pLCAuLi52YWx1ZXNdKTtcbiAgICB9XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBXSEVSRSBKU09OQiBTVVBFUlNFVCAoQD4pXG4gIHdoZXJlSnNvblN1cGVyc2V0T2Y8VENvbHVtbiBleHRlbmRzIEpzb25Db2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEpzb25TdXBlcnNldFZhbHVlPEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4+PixcbiAgKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVKc29uU3VwZXJzZXRPZihjb2x1bW4sIHNlcmlhbGl6ZUpzb25TdXBlcnNldFZhbHVlKHZhbHVlKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB3aGVyZUpzb25LZXlFeGlzdHMoY29sdW1uOiBKc29uQ29sdW1uczxUVGFibGVzPiwga2V5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhcIj8/IFxcXFw/ID9cIiwgW2NvbHVtbiwga2V5XSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBNQVRDSFxuICB3aGVyZU1hdGNoPFRDb2x1bW4gZXh0ZW5kcyBGdWxsdGV4dENvbHVtbnM8VFRhYmxlcz4+KGNvbHVtbjogVENvbHVtbiwgdmFsdWU6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGBNQVRDSCAoJHtTdHJpbmcoY29sdW1uKX0pIEFHQUlOU1QgKD8pYCwgW3ZhbHVlXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUEdyb29uZ2EgRnVsbFRleHQg7J24642x7IqkIOqygOyDiVxuICAgKiAtIOyCrOyaqe2VoCBQR3Jvb25nYSDsnbjrjbHsiqTsmYAg64+Z7J287ZWcIOy7rOufvCDqtazshLHsnLzroZwg6rKA7IOJ7ZW07JW8IOyduOuNseyKpOqwgCDsgqzsmqnrkKnri4jri6QuXG4gICAqXG4gICAqIOuLqOydvCDsu6zrn7wg6rKA7IOJOlxuICAgKiBgYGBzcWxcbiAgICogV0hFUkUgbmFtZSAmQH4gJ3NlYXJjaCdcbiAgICogYGBgXG4gICAqXG4gICAqIOuzte2VqSDsu6zrn7wg6rKA7IOJOlxuICAgKiBgYGBzcWxcbiAgICogV0hFUkUgQVJSQVlbbmFtZTo6dGV4dCwgZGVzY3JpcHRpb246OnRleHRdICZAfiAnc2VhcmNoJ1xuICAgKiBgYGBcbiAgICovXG4gIHdoZXJlU2VhcmNoPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4gfCBUQ29sdW1uW10sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgd2VpZ2h0cz86IG51bWJlcltdOyAvLyDsoJXsiJgg67Cw7Je0XG4gICAgfSxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgeyB3ZWlnaHRzIH0gPSBvcHRpb25zID8/IHt9O1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBBcnJheS5pc0FycmF5KGNvbHVtbilcbiAgICAgID8gYEFSUkFZWyR7Y29sdW1uLm1hcCgoYykgPT4gYCR7Y306OnRleHRgKS5qb2luKFwiLFwiKX1dYFxuICAgICAgOiBjb2x1bW47XG4gICAgY29uc3QgcGdyb29uZ2FDb25kaXRpb24gPSBgcGdyb29uZ2FfY29uZGl0aW9uKD8ke3dlaWdodHM/Lmxlbmd0aCA/IGAsIHdlaWdodHMgPT4gQVJSQVlbJHt3ZWlnaHRzLmpvaW4oXCIsXCIpfV1gIDogXCJcIn0pYDtcblxuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGAke2NvbHVtbkV4cHJ9ICZAfiAke3Bncm9vbmdhQ29uZGl0aW9ufWAsIFt2YWx1ZV0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBGVUxMVEVYVFxuICB3aGVyZVRzU2VhcmNoPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+IHwgU3RyaW5nU3FsRXhwcmVzc2lvbj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFRzUXVlcnlPcHRpb25zIHwgVHNRdWVyeUNvbmZpZyxcbiAgKTogdGhpcyB7XG4gICAgY29uc3Qgb3B0cyA9XG4gICAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgaXNTdHJpbmdWYWx1ZShvcHRpb25zKSA/ICh7IGNvbmZpZzogb3B0aW9ucyB9IGFzIFRzUXVlcnlPcHRpb25zKSA6IChvcHRpb25zID8/IHt9KTtcblxuICAgIGNvbnN0IHBhcnNlciA9IG9wdHMucGFyc2VyID8/IFwid2Vic2VhcmNoX3RvX3RzcXVlcnlcIjtcbiAgICBjb25zdCBjb25maWcgPSBvcHRzLmNvbmZpZyA/PyBcInNpbXBsZVwiO1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBpc1NxbEV4cHJlc3Npb24oY29sdW1uKSA/IGNvbHVtbltcIl9zcWxcIl0gOiBTdHJpbmcoY29sdW1uKTtcbiAgICBjb25zdCBwYXJhbXMgPSBpc1NxbEV4cHJlc3Npb24oY29sdW1uKVxuICAgICAgPyBbLi4uY29sdW1uW1wiX3BhcmFtc1wiXSwgY29uZmlnLCB2YWx1ZV1cbiAgICAgIDogW2NvbmZpZywgdmFsdWVdO1xuXG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYCR7Y29sdW1uRXhwcn0gQEAgJHtwYXJzZXJ9KD8sID8pYCwgcGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHdoZXJlRnV6enk8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTdHJpbmdTcWxFeHByZXNzaW9uPihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgb3BlcmF0b3I/OiBGdXp6eU9wZXJhdG9yO1xuICAgIH0sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IG9wZXJhdG9yID0gcGFyc2VGdXp6eU9wZXJhdG9yKG9wdGlvbnM/Lm9wZXJhdG9yKTtcblxuICAgIGlmIChvcGVyYXRvciA9PT0gXCIlXCIpIHtcbiAgICAgIGlmIChpc1NxbEV4cHJlc3Npb24oY29sdW1uKSkge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgJHtjb2x1bW5bXCJfc3FsXCJdfSAke29wZXJhdG9yfSA/YCwgWy4uLmNvbHVtbltcIl9wYXJhbXNcIl0sIHZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgPz8gJHtvcGVyYXRvcn0gP2AsIFtjb2x1bW4sIHZhbHVlXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAoaXNTcWxFeHByZXNzaW9uKGNvbHVtbikpIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGA/ICR7b3BlcmF0b3J9ICR7Y29sdW1uW1wiX3NxbFwiXX1gLCBbdmFsdWUsIC4uLmNvbHVtbltcIl9wYXJhbXNcIl1dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gPz9gLCBbdmFsdWUsIGNvbHVtbl0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIFJBV1xuICB3aGVyZVJhdyhzcWw6IHN0cmluZywgYmluZGluZ3M/OiByZWFkb25seSBLbmV4LlJhd0JpbmRpbmdbXSk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KHNxbCwgYmluZGluZ3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUg6rSE7Zi4IOq3uOujue2VkVxuICB3aGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKChidWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KGJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soZ3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9yV2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5vcldoZXJlKChidWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KGJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soZ3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gT1JERVIgQlkgKFNxbEV4cHJlc3Npb27snLzroZzrj4Qg7ZWgIOyImCDsnojslrTslbwg7ZWoKVxuICBvcmRlckJ5PFRDb2x1bW4gZXh0ZW5kcyBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW46IFRDb2x1bW4gfCBQdXJpT3JkZXJCeUV4cHJlc3Npb24sXG4gICAgZGlyZWN0aW9uPzogUHVyaU9yZGVyQnlEaXJlY3Rpb24sXG4gICAgbnVsbHM/OiBQdXJpT3JkZXJCeU51bGxzLFxuICApOiB0aGlzO1xuICBvcmRlckJ5PFRDb2x1bW4gZXh0ZW5kcyBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW5zOiByZWFkb25seSBQdXJpT3JkZXJCeUVudHJ5PFRDb2x1bW4+W10sXG4gICk6IHRoaXM7XG4gIG9yZGVyQnkoXG4gICAgY29sdW1uT3JDb2x1bW5zOiBzdHJpbmcgfCBQdXJpT3JkZXJCeUV4cHJlc3Npb24gfCByZWFkb25seSBQdXJpT3JkZXJCeVJ1bnRpbWVFbnRyeVtdLFxuICAgIGRpcmVjdGlvbjogUHVyaU9yZGVyQnlEaXJlY3Rpb24gPSBcImFzY1wiLFxuICAgIG51bGxzPzogUHVyaU9yZGVyQnlOdWxscyxcbiAgKTogdGhpcyB7XG4gICAgaWYgKGlzT3JkZXJCeUVudHJpZXMoY29sdW1uT3JDb2x1bW5zKSkge1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBjb2x1bW5PckNvbHVtbnMpIHtcbiAgICAgICAgaWYgKGlzU3RyaW5nVmFsdWUoZW50cnkpIHx8IGlzT3JkZXJCeUV4cHJlc3Npb24oZW50cnkpKSB7XG4gICAgICAgICAgdGhpcy5hcHBseU9yZGVyQnkoZW50cnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYXBwbHlPcmRlckJ5KGVudHJ5LmNvbHVtbiwgZW50cnkub3JkZXIsIGVudHJ5Lm51bGxzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5hcHBseU9yZGVyQnkoY29sdW1uT3JDb2x1bW5zLCBkaXJlY3Rpb24sIG51bGxzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlPcmRlckJ5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgUHVyaU9yZGVyQnlFeHByZXNzaW9uLFxuICAgIGRpcmVjdGlvbj86IFB1cmlPcmRlckJ5RGlyZWN0aW9uLFxuICAgIG51bGxzPzogUHVyaU9yZGVyQnlOdWxscyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgbm9ybWFsaXplZERpcmVjdGlvbiA9IG5vcm1hbGl6ZU9yZGVyQnlEaXJlY3Rpb24oZGlyZWN0aW9uKTtcbiAgICBjb25zdCBub3JtYWxpemVkTnVsbHMgPSBub3JtYWxpemVPcmRlckJ5TnVsbHMobnVsbHMpO1xuXG4gICAgaWYgKGlzT3JkZXJCeUV4cHJlc3Npb24oY29sdW1uKSkge1xuICAgICAgdGhpcy5rbmV4UXVlcnkub3JkZXJCeVJhdyhcbiAgICAgICAgYCR7Y29sdW1uW1wiX3NxbFwiXX0gJHtub3JtYWxpemVkRGlyZWN0aW9ufSR7Zm9ybWF0TnVsbHNTdWZmaXgobm9ybWFsaXplZE51bGxzKX1gLFxuICAgICAgICBjb2x1bW5bXCJfcGFyYW1zXCJdLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkub3JkZXJCeShjb2x1bW4sIG5vcm1hbGl6ZWREaXJlY3Rpb24sIG5vcm1hbGl6ZWROdWxscyk7XG4gICAgfVxuICB9XG5cbiAgZm9yVXBkYXRlKCk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LmZvclVwZGF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZm9yU2hhcmUoKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkuZm9yU2hhcmUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDrsqHthLAg7Jyg7IKs64+EIOqygOyDiSDshKTsoJVcbiAgICpcbiAgICogLSBTRUxFQ1Tsl5Agc2ltaWxhcml0eSDsu6zrn7wg7LaU6rCAXG4gICAqIC0gV0hFUkUgY29sIElTIE5PVCBOVUxMIOy2lOqwgFxuICAgKiAtIHRocmVzaG9sZOqwgCDsnojsnLzrqbQgV0hFUkUg7KGw6rG0IOy2lOqwgFxuICAgKiAtIOq4sOyhtCBPUkRFUiBCWeulvCBjbGVhcu2VmOqzoCDsm5Dsi5wg7Jew7IKw7J6Q66GcIOygleugrCAoSE5TVyDsnbjrjbHsiqQg7LWc7KCB7ZmUKVxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uIOuyoe2EsCDsu6zrn7wg6rK966GcXG4gICAqIEBwYXJhbSBlbWJlZGRpbmcg7L+866asIOyehOuyoOuUqSDrsqHthLBcbiAgICogQHBhcmFtIG9wdGlvbnMgbWV0aG9kLCB0aHJlc2hvbGQsIGFzIOuTsSDsmLXshZhcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBjb3NpbmUgc2ltaWxhcml0eSAo6riw67O46rCSKVxuICAgKiBxYi52ZWN0b3JTaW1pbGFyaXR5KFwiY29sdW1uTmFtZVwiLCBxdWVyeVZlY3Rvciwge1xuICAgKiAgIG1ldGhvZDogXCJjb3NpbmVcIixcbiAgICogICB0aHJlc2hvbGQ6IDAuNVxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gTDIgZGlzdGFuY2VcbiAgICogcWIudmVjdG9yU2ltaWxhcml0eShcImNvbHVtbk5hbWVcIiwgcXVlcnlWZWN0b3IsIHtcbiAgICogICBtZXRob2Q6IFwibDJcIixcbiAgICogICB0aHJlc2hvbGQ6IDEuNSAgLy8g6rGw66as6rCAIDEuNSDsnbTtlZjsnbgg6rKw6rO866eMXG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBJbm5lciBwcm9kdWN0XG4gICAqIHFiLnZlY3RvclNpbWlsYXJpdHkoXCJjb2x1bW5OYW1lXCIsIHF1ZXJ5VmVjdG9yLCB7XG4gICAqICAgbWV0aG9kOiBcImlubmVyX3Byb2R1Y3RcIixcbiAgICogICB0aHJlc2hvbGQ6IDAuN1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICB2ZWN0b3JTaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogVmVjdG9yQ29sdW1uczxUVGFibGVzPixcbiAgICBlbWJlZGRpbmc6IG51bWJlcltdLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIG1ldGhvZD86IFwiY29zaW5lXCIgfCBcImwyXCIgfCBcImlubmVyX3Byb2R1Y3RcIjtcbiAgICAgIHRocmVzaG9sZD86IG51bWJlcjtcbiAgICAgIGRpc3RpbmN0T24/OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+O1xuICAgIH0gPSB7fSxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0ICYgeyBzaW1pbGFyaXR5OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHsgbWV0aG9kID0gXCJjb3NpbmVcIiwgdGhyZXNob2xkLCBkaXN0aW5jdE9uIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKFxuICAgICAgIUFycmF5LmlzQXJyYXkoZW1iZWRkaW5nKSB8fFxuICAgICAgZW1iZWRkaW5nLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgZW1iZWRkaW5nLnNvbWUoKHYpID0+ICFOdW1iZXIuaXNGaW5pdGUodikpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGVtYmVkZGluZyB2ZWN0b3I6IGV4cGVjdGVkIGEgbm9uLWVtcHR5IGFycmF5IG9mIGZpbml0ZSBudW1iZXJzXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZlY3RvckxpdGVyYWwgPSBKU09OLnN0cmluZ2lmeShlbWJlZGRpbmcubWFwKCh2KSA9PiBOdW1iZXIodikpKTtcbiAgICBjb25zdCBvcGVyYXRvciA9IHsgY29zaW5lOiBcIjw9PlwiLCBsMjogXCI8LT5cIiwgaW5uZXJfcHJvZHVjdDogXCI8Iz5cIiB9W21ldGhvZF07XG5cbiAgICAvLyBtZXRob2Trs4Qg7Jew7IKw7J6QIOuwjyBzaW1pbGFyaXR5IOqzhOyCsOyLnVxuICAgIC8vIC0gY29zaW5lOiA8PT4gKGNvc2luZSBkaXN0YW5jZSwgMH4yKSwgc2ltaWxhcml0eSA9IDEgLSBkaXN0YW5jZVxuICAgIC8vIC0gbDI6IDwtPiAoZXVjbGlkZWFuIGRpc3RhbmNlKSwgc2ltaWxhcml0eSA9IGRpc3RhbmNlICjrgq7snYTsiJjroZ0g7Jyg7IKsKVxuICAgIC8vIC0gaW5uZXJfcHJvZHVjdDogPCM+IChuZWdhdGl2ZSBpbm5lciBwcm9kdWN0KSwgc2ltaWxhcml0eSA9IC1kaXN0YW5jZSAo64aS7J2E7IiY66GdIOycoOyCrClcbiAgICBjb25zdCBzaW1pbGFyaXR5RXhwciA9XG4gICAgICBtZXRob2QgPT09IFwiY29zaW5lXCJcbiAgICAgICAgPyB0aGlzLmtuZXgucmF3KGAxIC0gKD8/ICR7b3BlcmF0b3J9ID86OnZlY3RvcikgYXMgc2ltaWxhcml0eWAsIFtjb2x1bW4sIHZlY3RvckxpdGVyYWxdKVxuICAgICAgICA6IG1ldGhvZCA9PT0gXCJsMlwiXG4gICAgICAgICAgPyB0aGlzLmtuZXgucmF3KGA/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IgYXMgc2ltaWxhcml0eWAsIFtjb2x1bW4sIHZlY3RvckxpdGVyYWxdKVxuICAgICAgICAgIDogdGhpcy5rbmV4LnJhdyhgLSg/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IpIGFzIHNpbWlsYXJpdHlgLCBbY29sdW1uLCB2ZWN0b3JMaXRlcmFsXSk7XG5cbiAgICAvLyBXSEVSRSBOT1QgTlVMTFxuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTm90TnVsbChjb2x1bW4pO1xuXG4gICAgLy8g6riw7KG0IE9SREVSIEJZIGNsZWFyXG4gICAgdGhpcy5rbmV4UXVlcnkuY2xlYXIoXCJvcmRlclwiKTtcbiAgICBpZiAoZGlzdGluY3RPbikge1xuICAgICAgLy8gRElTVElOQ1QgT07snYAgU0VMRUNUIOygiOydmCDrp6gg7JWe7JeQIOyZgOyVvCDtlZjrr4DroZwsIOq4sOyhtCBzZWxlY3Qoc3Vic2V0IO2VhOuTnOuTpCnrpbwg67O07KG0IO2bhCBjbGVhcu2VmOqzoCDri6Tsi5wg7LaU6rCAXG4gICAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgY29uc3QgZXhpc3RpbmdTdWJzZXRDb2xzID0gKHRoaXMua25leFF1ZXJ5IGFzIGFueSlbXCJfc3RhdGVtZW50c1wiXVxuICAgICAgICAuZmlsdGVyKChzOiBhbnkpID0+IHMuZ3JvdXBpbmcgPT09IFwiY29sdW1uc1wiKVxuICAgICAgICAuZmxhdE1hcCgoczogYW55KSA9PiBzLnZhbHVlKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5LmNsZWFyKFwic2VsZWN0XCIpO1xuICAgICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KHRoaXMua25leC5yYXcoYERJU1RJTkNUIE9OICg/PykgPz9gLCBbZGlzdGluY3RPbiwgZGlzdGluY3RPbl0pKTtcbiAgICAgIGV4aXN0aW5nU3Vic2V0Q29scy5tYXAoKGNvbDogYW55KSA9PiB0aGlzLmtuZXhRdWVyeS5zZWxlY3QoY29sKSk7XG4gICAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3Qoc2ltaWxhcml0eUV4cHIpO1xuICAgICAgdGhpcy5rbmV4UXVlcnkub3JkZXJCeVJhdyhgPz8sID8/ICR7b3BlcmF0b3J9ID86OnZlY3RvcmAsIFtcbiAgICAgICAgZGlzdGluY3RPbixcbiAgICAgICAgY29sdW1uLFxuICAgICAgICB2ZWN0b3JMaXRlcmFsLFxuICAgICAgXSk7XG5cbiAgICAgIHRoaXMua25leFF1ZXJ5ID0gdGhpcy5rbmV4XG4gICAgICAgIC5mcm9tKHRoaXMua25leFF1ZXJ5LmFzKFwiZGlzdGluY3RfdmVjdG9yc1wiKSlcbiAgICAgICAgLnNlbGVjdChcIipcIilcbiAgICAgICAgLm9yZGVyQnkoXCJzaW1pbGFyaXR5XCIsIFwiZGVzY1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KHNpbWlsYXJpdHlFeHByKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9yZGVyQnlSYXcoYD8/ICR7b3BlcmF0b3J9ID86OnZlY3RvcmAsIFtjb2x1bW4sIHZlY3RvckxpdGVyYWxdKTtcbiAgICB9XG5cbiAgICAvLyB0aHJlc2hvbGRcbiAgICBpZiAoaXNOdW1iZXJWYWx1ZSh0aHJlc2hvbGQpKSB7XG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh0aHJlc2hvbGQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2ZWN0b3JTaW1pbGFyaXR5IHRocmVzaG9sZDogJHt0aHJlc2hvbGR9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXN0aW5jdE9uKSB7XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZE9wID0gbWV0aG9kID09PSBcImwyXCIgPyBcIjw9XCIgOiBcIj49XCI7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKFwic2ltaWxhcml0eVwiLCB0aHJlc2hvbGRPcCwgdGhyZXNob2xkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZFZhbHVlID1cbiAgICAgICAgICBtZXRob2QgPT09IFwiY29zaW5lXCIgPyAxIC0gdGhyZXNob2xkIDogbWV0aG9kID09PSBcImlubmVyX3Byb2R1Y3RcIiA/IC10aHJlc2hvbGQgOiB0aHJlc2hvbGQ7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGA/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IgPD0gP2AsIFtcbiAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgdmVjdG9yTGl0ZXJhbCxcbiAgICAgICAgICB0aHJlc2hvbGRWYWx1ZSxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyDquLDrs7gg7L+866asIOuplOyEnOuTnOuTpFxuICBsaW1pdChjb3VudDogbnVtYmVyKTogdGhpcyB7XG4gICAgaWYgKGNvdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsaW1pdDogbXVzdCBiZSA+PSAwXCIpO1xuICAgIH1cbiAgICB0aGlzLmtuZXhRdWVyeS5saW1pdChjb3VudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvZmZzZXQoY291bnQ6IG51bWJlcik6IHRoaXMge1xuICAgIGlmIChjb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgb2Zmc2V0OiBtdXN0IGJlID49IDBcIik7XG4gICAgfVxuICAgIHRoaXMua25leFF1ZXJ5Lm9mZnNldChjb3VudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBHUk9VUCBCWVxuICBncm91cEJ5PFRDb2x1bW5zIGV4dGVuZHMgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oLi4uY29sdW1uczogVENvbHVtbnNbXSk6IHRoaXM7XG4gIGdyb3VwQnkoLi4uY29sdW1uczogc3RyaW5nW10pOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5ncm91cEJ5KC4uLmNvbHVtbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gSEFWSU5HXG4gIGhhdmluZyhjb25kaXRpb246IHN0cmluZyk6IHRoaXM7XG4gIGhhdmluZzxUQ29sdW1uIGV4dGVuZHMgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgdmFsdWU6IGFueSxcbiAgKTogdGhpcztcbiAgLy8gSEFWSU5HIOq1rO2YhFxuICBoYXZpbmcoLi4uY29uZGl0aW9uczogYW55W10pOiB0aGlzIHtcbiAgICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIGhhdmluZyhcIkNPVU5UKCopID4gMTBcIilcbiAgICAgIHRoaXMua25leFF1ZXJ5LmhhdmluZyh0aGlzLmtuZXgucmF3KGNvbmRpdGlvbnNbMF0pKTtcbiAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAzKSB7XG4gICAgICAvLyBoYXZpbmcoXCJjb3VudFwiLCBcIj5cIiwgMTApXG4gICAgICB0aGlzLmtuZXhRdWVyeS5oYXZpbmcoXG4gICAgICAgIHRoaXMua25leC5yYXcoY29uZGl0aW9uc1swXSksXG4gICAgICAgIGNvbmRpdGlvbnNbMV0sXG4gICAgICAgIHRoaXMua25leC5yYXcoY29uZGl0aW9uc1syXSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGhhdmluZyBhcmd1bWVudHNcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g7Iuk7ZaJIOuplOyEnOuTnOuTpCAtIHRoZW5hYmxlIOq1rO2YhFxuICB0aGVuPFRSZXN1bHQxID0gRXhwYW5kPFRSZXN1bHQ+W10sIFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogRXhwYW5kPFRSZXN1bHQ+W10pID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IG51bGwsXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgIE5haXRlLnQoXCJwdXJpOmV4ZWN1dGVkLXF1ZXJ5XCIsIHRoaXMudG9RdWVyeSgpKTtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS50aGVuKG9uZnVsZmlsbGVkIGFzIGFueSwgb25yZWplY3RlZCk7XG4gIH1cbiAgY2F0Y2g8VFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc3VsdCB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LmNhdGNoKG9ucmVqZWN0ZWQpO1xuICB9XG4gIGZpbmFsbHkob25maW5hbGx5PzogKCgpID0+IHZvaWQpIHwgbnVsbCk6IFByb21pc2U8VFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS5maW5hbGx5KG9uZmluYWxseSk7XG4gIH1cblxuICAvLyDtlZjrgpjrp4wg7L+866asXG4gIGZpcnN0KCk6IFJlc29sdmVkUHVyaTxFeHBhbmQ8VFJlc3VsdD4sIG5ldmVyPiB7XG4gICAgdGhpcy5rbmV4UXVlcnkuZmlyc3QoKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4LCB0aGlzLnRhYmxlU3BlYyk7XG4gIH1cblxuICAvLyDsv7zrpqztlZwg66CI7L2U65Oc7JeQ7IScIO2KueyglSDsu6zrn7zrp4wg7LaU7Lac7ZWcIOuwsOyXtCDrpqzthLRcbiAgcGx1Y2s8VENvbHVtbiBleHRlbmRzIGtleW9mIFRSZXN1bHQgfCBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICk6IFJlc29sdmVkUHVyaTxcbiAgICBUQ29sdW1uIGV4dGVuZHMga2V5b2YgVFJlc3VsdFxuICAgICAgPyBUUmVzdWx0W1RDb2x1bW5dW11cbiAgICAgIDogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgICBuZXZlclxuICA+IHtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHRoaXMua25leFF1ZXJ5LnBsdWNrKGNvbHVtbiBhcyBzdHJpbmcpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuXG4gIC8vIElOU0VSVCA6IOuLqOydvCDqsJ3ssrRcbiAgaW5zZXJ0KFxuICAgIGRhdGE6IEluc2VydERhdGE8U2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4sXG4gICk6IFJlc29sdmVkUHVyaTxJbnNlcnRSZXN1bHQsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+O1xuICAvLyBJTlNFUlQ6IOuwsOyXtFxuICBpbnNlcnQoXG4gICAgZGF0YTogSW5zZXJ0RGF0YTxTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PltdLFxuICApOiBSZXNvbHZlZFB1cmk8SW5zZXJ0UmVzdWx0LCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PjtcbiAgLy8gSU5TRVJUIOyLpOygnCDqtaztmIRcbiAgaW5zZXJ0KFxuICAgIHJhd0RhdGE6IEluc2VydERhdGE8U2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4gfCBJbnNlcnREYXRhPFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+W10sXG4gICk6IFJlc29sdmVkUHVyaTxJbnNlcnRSZXN1bHQsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+IHtcbiAgICAvLyBKU09OIOy7rOufvCBzdHJpbmdpZnkg66Gc7KeB7J2EIOuplOyEnOuTnOuhnCDrtoTrpqztlZjsl6wg7KSR67O1IOygnOqxsFxuICAgIGNvbnN0IHJlZmluZWREYXRhID0gdGhpcy5yZWZpbmVKc29uQ29sdW1ucyhyYXdEYXRhKTtcbiAgICB0aGlzLmtuZXhRdWVyeS5pbnNlcnQocmVmaW5lZERhdGEpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuXG4gIC8vIFVQREFURVxuICB1cGRhdGUocmF3RGF0YTogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiBSZXNvbHZlZFB1cmk8bnVtYmVyLCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgLy8gSlNPTiDsu6zrn7wgc3RyaW5naWZ5IOuhnOyngeydhCDrqZTshJzrk5zroZwg67aE66as7ZWY7JesIOykkeuztSDsoJzqsbBcbiAgICBjb25zdCByZWZpbmVkRGF0YSA9IHRoaXMucmVmaW5lSnNvbkNvbHVtbnMocmF3RGF0YSk7XG4gICAgdGhpcy5rbmV4UXVlcnkudXBkYXRlKHJlZmluZWREYXRhKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4LCB0aGlzLnRhYmxlU3BlYyk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTiDsu6zrn7zsl5Ag64yA7ZW0IHN0cmluZ2lmeSDsspjrpqzrpbwg7IiY7ZaJ7ZWY64qUIOuCtOu2gCDrqZTshJzrk5zsnoXri4jri6QuXG4gICAqIG9iamVjdCDrmJDripQgb2JqZWN0IOuwsOyXtOydhCDrsJvqs6AsIEpTT04g7Lus65+87J20IOyeiOycvOuptCDsp4HroKztmZTtlZjsl6wg67CY7ZmY7ZWp64uI64ukLlxuICAgKiDsp4HsoJEg6rCS7J2EIOuzgOqyve2VmOuvgOuhnCBzaWRlIGVmZmVjdOqwgCDsnojsirXri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHJlZmluZUpzb25Db2x1bW5zPFJvdyBleHRlbmRzIG9iamVjdD4oZGF0YTogUm93IHwgUm93W10pOiB0eXBlb2YgZGF0YSB7XG4gICAgLy8gdGFibGVTcGVj7J2064KYIGpzb25Db2x1bW5zIOyXhuuKlCDqsr3smrAg67CU66GcIOuwmO2ZmFxuICAgIGlmICghdGhpcy50YWJsZVNwZWMgfHwgIXRoaXMudGFibGVTcGVjLmpzb25Db2x1bW5zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgLy8g65Ox66Gd65CcIFRhYmxlU3BlY+ydhCDthrXtlbQgSlNPTuy7rOufvCDrqqnroZ3snYQg6rCA7KC47JmAIEpTT04uc3RyaW5naWZ5IOyymOumrFxuICAgIGNvbnN0IGpzb25Db2x1bW5zID0gdGhpcy50YWJsZVNwZWMuanNvbkNvbHVtbnM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBkYXRhKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGpzb25Db2x1bW5zKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBPYmplY3QuZW50cmllcyhpdGVtKS5maW5kKChba2V5XSkgPT4ga2V5ID09PSBjb2x1bW4pPy5bMV07XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXRlbSwge1xuICAgICAgICAgICAgICBbY29sdW1uXTogc2VyaWFsaXplSnNvbkNvbHVtblZhbHVlKHRoaXMudGFibGVTcGVjLCBjb2x1bW4sIHZhbHVlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBqc29uQ29sdW1ucykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IE9iamVjdC5lbnRyaWVzKGRhdGEpLmZpbmQoKFtrZXldKSA9PiBrZXkgPT09IGNvbHVtbik/LlsxXTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGRhdGEsIHtcbiAgICAgICAgICAgIFtjb2x1bW5dOiBzZXJpYWxpemVKc29uQ29sdW1uVmFsdWUodGhpcy50YWJsZVNwZWMsIGNvbHVtbiwgdmFsdWUpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLy8gSW5jcmVtZW50XG4gIGluY3JlbWVudDxUQ29sdW1uIGV4dGVuZHMgTnVtZXJpY0NvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogbnVtYmVyLFxuICApOiBSZXNvbHZlZFB1cmk8bnVtYmVyLCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgaWYgKHZhbHVlIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkluY3JlbWVudCB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwXCIpO1xuICAgIH1cbiAgICB0aGlzLmtuZXhRdWVyeS5pbmNyZW1lbnQoY29sdW1uLCB2YWx1ZSk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCwgdGhpcy50YWJsZVNwZWMpO1xuICB9XG4gIC8vIERlY3JlbWVudFxuICBkZWNyZW1lbnQ8VENvbHVtbiBleHRlbmRzIE51bWVyaWNDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IG51bWJlcixcbiAgKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIGlmICh2YWx1ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWNyZW1lbnQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKTtcbiAgICB9XG4gICAgdGhpcy5rbmV4UXVlcnkuZGVjcmVtZW50KGNvbHVtbiwgdmFsdWUpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuXG4gIC8vIERFTEVURVxuICBkZWxldGUoKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIHRoaXMua25leFF1ZXJ5LmRlbGV0ZSgpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuXG4gIC8vIO2ZleyduCDsv7zrpqwg66as7YS0XG4gIHRvUXVlcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkudG9RdWVyeSgpO1xuICB9XG5cbiAgLy8g7L+866asIOuUlOuyhOq5hSDroZzqt7gg7Lac66ClXG4gIGRlYnVnKCk6IHRoaXMge1xuICAgIGNvbnNvbGUubG9nKGAke2NoYWxrLmN5YW4oXCJbUHVyaSBEZWJ1Z11cIil9ICR7Y2hhbGsueWVsbG93KHRoaXMudG9RdWVyeSgpKX1gKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNsb25lKCk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4ge1xuICAgIC8vICdkdWFsJ+ydgCDrjZTrr7gg7YWM7J2067iU7J2066mwLCDrsJTroZwg7JWE656YIOykhOyXkOyEnCBrbmV4UXVlcnnqsIAg642u7Ja07JSM7JuM7KeR64uI64ukLlxuICAgIGNvbnN0IG5ld1B1cmkgPSBuZXcgUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0Pih0aGlzLmtuZXgsIFwiZHVhbFwiKTtcbiAgICBuZXdQdXJpLmtuZXhRdWVyeSA9IHRoaXMua25leFF1ZXJ5LmNsb25lKCk7XG4gICAgbmV3UHVyaS50YWJsZVNwZWMgPSB0aGlzLnRhYmxlU3BlYztcbiAgICBuZXdQdXJpLmNvcnJlbGF0aW9uUmVnaXN0cnkgPSBuZXcgTWFwKHRoaXMuY29ycmVsYXRpb25SZWdpc3RyeSk7XG4gICAgcmV0dXJuIG5ld1B1cmk7XG4gIH1cblxuICBmb3JtYXRTUUwodW5mb3JtYXR0ZWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gU1FMIOyYiOyVveyWtCDrqqnroZ1cbiAgICBjb25zdCBrZXl3b3JkcyA9IFtcbiAgICAgIFwiU0VMRUNUXCIsXG4gICAgICBcIkZST01cIixcbiAgICAgIFwiV0hFUkVcIixcbiAgICAgIFwiSU5TRVJUXCIsXG4gICAgICBcIklOVE9cIixcbiAgICAgIFwiVkFMVUVTXCIsXG4gICAgICBcIlVQREFURVwiLFxuICAgICAgXCJERUxFVEVcIixcbiAgICAgIFwiQ1JFQVRFXCIsXG4gICAgICBcIlRBQkxFXCIsXG4gICAgICBcIkFMVEVSXCIsXG4gICAgICBcIkRST1BcIixcbiAgICAgIFwiSk9JTlwiLFxuICAgICAgXCJPTlwiLFxuICAgICAgXCJJTk5FUlwiLFxuICAgICAgXCJMRUZUXCIsXG4gICAgICBcIlJJR0hUXCIsXG4gICAgICBcIkZVTExcIixcbiAgICAgIFwiT1VURVJcIixcbiAgICAgIFwiR1JPVVBcIixcbiAgICAgIFwiQllcIixcbiAgICAgIFwiT1JERVJcIixcbiAgICAgIFwiSEFWSU5HXCIsXG4gICAgICBcIkRJU1RJTkNUXCIsXG4gICAgICBcIkxJTUlUXCIsXG4gICAgICBcIk9GRlNFVFwiLFxuICAgICAgXCJBU1wiLFxuICAgICAgXCJBTkRcIixcbiAgICAgIFwiT1JcIixcbiAgICAgIFwiTk9UXCIsXG4gICAgICBcIklOXCIsXG4gICAgICBcIkxJS0VcIixcbiAgICAgIFwiSVNcIixcbiAgICAgIFwiTlVMTFwiLFxuICAgICAgXCJDQVNFXCIsXG4gICAgICBcIldIRU5cIixcbiAgICAgIFwiVEhFTlwiLFxuICAgICAgXCJFTFNFXCIsXG4gICAgICBcIkVORFwiLFxuICAgICAgXCJVTklPTlwiLFxuICAgICAgXCJBTExcIixcbiAgICAgIFwiRVhJU1RTXCIsXG4gICAgICBcIkJFVFdFRU5cIixcbiAgICBdO1xuXG4gICAgbGV0IGZvcm1hdHRlZCA9IHVuZm9ybWF0dGVkO1xuXG4gICAgLy8g7JiI7JW97Ja066W8IOuMgOusuOyekOuhnCDrs4DtmZhcbiAgICBrZXl3b3Jkcy5mb3JFYWNoKChrZXl3b3JkKSA9PiB7XG4gICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYFxcXFxiJHtrZXl3b3JkfVxcXFxiYCwgXCJnaVwiKTtcbiAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKHJlZ2V4LCBrZXl3b3JkLnRvVXBwZXJDYXNlKCkpO1xuICAgIH0pO1xuXG4gICAgLy8g7KO87JqUIOygiCDslZ7sl5Ag7KSE67CU6r+IIOy2lOqwgFxuICAgIGNvbnN0IG1ham9yQ2xhdXNlcyA9IFtcbiAgICAgIFwiU0VMRUNUXCIsXG4gICAgICBcIkZST01cIixcbiAgICAgIFwiV0hFUkVcIixcbiAgICAgIFwiR1JPVVAgQllcIixcbiAgICAgIFwiT1JERVIgQllcIixcbiAgICAgIFwiSEFWSU5HXCIsXG4gICAgICBcIkxJTUlUXCIsXG4gICAgICBcIlVOSU9OXCIsXG4gICAgXTtcbiAgICBtYWpvckNsYXVzZXMuZm9yRWFjaCgoY2xhdXNlKSA9PiB7XG4gICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYFxcXFxzKygke2NsYXVzZX0pXFxcXHMrYCwgXCJnaVwiKTtcbiAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKHJlZ2V4LCBgXFxuJHtjbGF1c2UudG9VcHBlckNhc2UoKX0gYCk7XG4gICAgfSk7XG5cbiAgICAvLyBKT0lOIOygiCDsspjrpqxcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvXFxzKygoPzpJTk5FUnxMRUZUfFJJR0hUfEZVTEwgT1VURVIpXFxzKyk/Sk9JTlxccysvZ2ksIFwiXFxuJDFKT0lOIFwiKTtcblxuICAgIC8vIEFORCwgT1Ig7KGw6rG0IOyymOumrFxuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9cXHMrKEFORHxPUilcXHMrL2dpLCBcIlxcbiAgJDEgXCIpO1xuXG4gICAgLy8g6rSE7Zi4IOyymOumrCDrsI8g65Ok7Jes7JOw6riwXG4gICAgY29uc3QgbGluZXMgPSBmb3JtYXR0ZWQuc3BsaXQoXCJcXG5cIik7XG4gICAgY29uc3QgaW5kZW50ZWRMaW5lcyA9IFtdO1xuICAgIGxldCBpbmRlbnRMZXZlbCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG4gICAgICBpZiAoIXRyaW1tZWRMaW5lKSBjb250aW51ZTtcblxuICAgICAgLy8g64ur64qUIOq0hO2YuOqwgCDsnojsnLzrqbQg65Ok7Jes7JOw6riwIOugiOuyqCDqsJDshoxcbiAgICAgIGNvbnN0IGNsb3NpbmdQYXJlbnMgPSAodHJpbW1lZExpbmUubWF0Y2goL1xcKS9nKSB8fCBbXSkubGVuZ3RoO1xuICAgICAgY29uc3Qgb3BlbmluZ1BhcmVucyA9ICh0cmltbWVkTGluZS5tYXRjaCgvXFwoL2cpIHx8IFtdKS5sZW5ndGg7XG5cbiAgICAgIGlmIChjbG9zaW5nUGFyZW5zID4gMCAmJiBvcGVuaW5nUGFyZW5zID09PSAwKSB7XG4gICAgICAgIGluZGVudExldmVsID0gTWF0aC5tYXgoMCwgaW5kZW50TGV2ZWwgLSBjbG9zaW5nUGFyZW5zKTtcbiAgICAgIH1cblxuICAgICAgLy8g7ZiE7J6sIOuTpOyXrOyTsOq4sCDsoIHsmqlcbiAgICAgIGNvbnN0IGluZGVudCA9IFwiICBcIi5yZXBlYXQoaW5kZW50TGV2ZWwpO1xuICAgICAgaW5kZW50ZWRMaW5lcy5wdXNoKGluZGVudCArIHRyaW1tZWRMaW5lKTtcblxuICAgICAgLy8g7Jes64qUIOq0hO2YuOqwgCDsnojsnLzrqbQg65Ok7Jes7JOw6riwIOugiOuyqCDspp3qsIBcbiAgICAgIGlmIChvcGVuaW5nUGFyZW5zID4gY2xvc2luZ1BhcmVucykge1xuICAgICAgICBpbmRlbnRMZXZlbCArPSBvcGVuaW5nUGFyZW5zIC0gY2xvc2luZ1BhcmVucztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZW50ZWRMaW5lcy5qb2luKFwiXFxuXCIpLnRyaW0oKTtcbiAgfVxuXG4gIHJhdyhzcWw6IHN0cmluZyk6IEtuZXguUmF3IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4LnJhdyhzcWwpO1xuICB9XG5cbiAgLy8gS25leCDsv7zrpqwg67mM642UIOyngeygkSDsoJHqt7xcbiAgcmF3UXVlcnkoKTogS25leC5RdWVyeUJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV2hlcmVHcm91cDxUVGFibGVzIGV4dGVuZHMgb2JqZWN0PiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYnVpbGRlcjogS25leC5RdWVyeUJ1aWxkZXIpIHt9XG5cbiAgLy8gd2hlcmUg66mU7ISc65Oc65OkXG4gIHdoZXJlKGNvbmRpdGlvbnM6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogdGhpcztcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIHdoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgb3BlcmF0b3I6IFdoZXJlT3BlcmF0b3IsXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICB3aGVyZSguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZShhcmdzWzBdLCAuLi5hcmdzLnNsaWNlKDEpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHdoZXJlSW4gLyB3aGVyZU5vdEluIOuplOyEnOuTnOuTpFxuICB3aGVyZUluPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWVzOiAoRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4gJiBLbmV4LlZhbHVlKVtdLFxuICApOiB0aGlzO1xuICB3aGVyZUluKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlSW4oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB3aGVyZU5vdEluPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWVzOiAoRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4gJiBLbmV4LlZhbHVlKVtdLFxuICApOiB0aGlzO1xuICB3aGVyZU5vdEluKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlTm90SW4oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBvcldoZXJlIOuplOyEnOuTnOuTpFxuICBvcldoZXJlKGNvbmRpdGlvbnM6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogdGhpcztcbiAgb3JXaGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb3JXaGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIG9wZXJhdG9yOiBXaGVyZU9wZXJhdG9yLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb3JXaGVyZSguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlKGFyZ3NbMF0sIC4uLmFyZ3Muc2xpY2UoMSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gb3JXaGVyZUluIC8gb3JXaGVyZU5vdEluIOuplOyEnOuTnOuTpFxuICBvcldoZXJlSW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IChFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPiAmIEtuZXguVmFsdWUpW10sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVJbiguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlSW4oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcldoZXJlTm90SW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IChFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPiAmIEtuZXguVmFsdWUpW10sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVOb3RJbiguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlTm90SW4oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBKU09OQiBTVVBFUlNFVCAoQD4pXG4gIHdoZXJlSnNvblN1cGVyc2V0T2Y8VENvbHVtbiBleHRlbmRzIEpzb25Db2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEpzb25TdXBlcnNldFZhbHVlPEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4+PixcbiAgKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlSnNvblN1cGVyc2V0T2YoY29sdW1uLCBzZXJpYWxpemVKc29uU3VwZXJzZXRWYWx1ZSh2YWx1ZSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZUpzb25TdXBlcnNldE9mPFRDb2x1bW4gZXh0ZW5kcyBKc29uQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBKc29uU3VwZXJzZXRWYWx1ZTxFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uPj4sXG4gICk6IHRoaXMge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlSnNvblN1cGVyc2V0T2YoY29sdW1uLCBzZXJpYWxpemVKc29uU3VwZXJzZXRWYWx1ZSh2YWx1ZSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgd2hlcmVKc29uS2V5RXhpc3RzKGNvbHVtbjogSnNvbkNvbHVtbnM8VFRhYmxlcz4sIGtleTogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KFwiPz8gXFxcXD8gP1wiLCBbY29sdW1uLCBrZXldKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9yV2hlcmVKc29uS2V5RXhpc3RzKGNvbHVtbjogSnNvbkNvbHVtbnM8VFRhYmxlcz4sIGtleTogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoXCI/PyBcXFxcPyA/XCIsIFtjb2x1bW4sIGtleV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgTUFUQ0hcbiAgd2hlcmVNYXRjaDxUQ29sdW1uIGV4dGVuZHMgRnVsbHRleHRDb2x1bW5zPFRUYWJsZXM+Pihjb2x1bW46IFRDb2x1bW4sIHZhbHVlOiBzdHJpbmcpOiB0aGlzO1xuICB3aGVyZU1hdGNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGBNQVRDSCAoJHtTdHJpbmcoYXJnc1swXSl9KSBBR0FJTlNUICg/KWAsIFthcmdzWzFdXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcldoZXJlTWF0Y2g8VENvbHVtbiBleHRlbmRzIEZ1bGx0ZXh0Q29sdW1uczxUVGFibGVzPj4oY29sdW1uOiBUQ29sdW1uLCB2YWx1ZTogc3RyaW5nKTogdGhpcztcbiAgb3JXaGVyZU1hdGNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYE1BVENIICgke1N0cmluZyhhcmdzWzBdKX0pIEFHQUlOU1QgKD8pYCwgW2FyZ3NbMV1dKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIFNFQVJDSFxuICB3aGVyZVNlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uIHwgVENvbHVtbltdLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHdlaWdodHM/OiBudW1iZXJbXTsgLy8g7KCV7IiYIOuwsOyXtFxuICAgIH0sXG4gICk6IHRoaXM7XG4gIHdoZXJlU2VhcmNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3QgeyB3ZWlnaHRzIH0gPSBhcmdzWzJdID8/IHt9O1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBBcnJheS5pc0FycmF5KGFyZ3NbMF0pXG4gICAgICA/IGBBUlJBWVske2FyZ3NbMF0ubWFwKChjKSA9PiBgJHtjfTo6dGV4dGApLmpvaW4oXCIsXCIpfV1gXG4gICAgICA6IGFyZ3NbMF07XG4gICAgY29uc3QgcGdyb29uZ2FDb25kaXRpb24gPSBgcGdyb29uZ2FfY29uZGl0aW9uKD8ke3dlaWdodHM/Lmxlbmd0aCA/IGAsIHdlaWdodHMgPT4gQVJSQVlbJHt3ZWlnaHRzLmpvaW4oXCIsXCIpfV1gIDogXCJcIn0pYDtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYCR7Y29sdW1uRXhwcn0gJkB+ICR7cGdyb29uZ2FDb25kaXRpb259YCwgW2FyZ3NbMV1dKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZVNlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uIHwgVENvbHVtbltdLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHdlaWdodHM/OiBudW1iZXJbXTsgLy8g7KCV7IiYIOuwsOyXtFxuICAgIH0sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVTZWFyY2goLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCB7IHdlaWdodHMgfSA9IGFyZ3NbMl0gPz8ge307XG4gICAgY29uc3QgY29sdW1uRXhwciA9IEFycmF5LmlzQXJyYXkoYXJnc1swXSlcbiAgICAgID8gYEFSUkFZWyR7YXJnc1swXS5tYXAoKGMpID0+IGAke2N9Ojp0ZXh0YCkuam9pbihcIixcIil9XWBcbiAgICAgIDogYXJnc1swXTtcbiAgICBjb25zdCBwZ3Jvb25nYUNvbmRpdGlvbiA9IGBwZ3Jvb25nYV9jb25kaXRpb24oPyR7d2VpZ2h0cz8ubGVuZ3RoID8gYCwgd2VpZ2h0cyA9PiBBUlJBWVske3dlaWdodHMuam9pbihcIixcIil9XWAgOiBcIlwifSlgO1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGAke2NvbHVtbkV4cHJ9ICZAfiAke3Bncm9vbmdhQ29uZGl0aW9ufWAsIFthcmdzWzFdXSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIEZVTExURVhUXG4gIHdoZXJlVHNTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTdHJpbmdTcWxFeHByZXNzaW9uPihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNRdWVyeU9wdGlvbnMgfCBUc1F1ZXJ5Q29uZmlnLFxuICApOiB0aGlzO1xuICB3aGVyZVRzU2VhcmNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3Qgb3B0cyA9XG4gICAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgaXNTdHJpbmdWYWx1ZShhcmdzWzJdKSA/ICh7IGNvbmZpZzogYXJnc1syXSB9IGFzIFRzUXVlcnlPcHRpb25zKSA6IChhcmdzWzJdID8/IHt9KTtcblxuICAgIGNvbnN0IHBhcnNlciA9IG9wdHMucGFyc2VyID8/IFwid2Vic2VhcmNoX3RvX3RzcXVlcnlcIjtcbiAgICBjb25zdCBjb25maWcgPSBvcHRzLmNvbmZpZyA/PyBcInNpbXBsZVwiO1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBpc1NxbEV4cHJlc3Npb24oYXJnc1swXSkgPyBhcmdzWzBdW1wiX3NxbFwiXSA6IFN0cmluZyhhcmdzWzBdKTtcbiAgICBjb25zdCBwYXJhbXMgPSBpc1NxbEV4cHJlc3Npb24oYXJnc1swXSlcbiAgICAgID8gWy4uLmFyZ3NbMF1bXCJfcGFyYW1zXCJdLCBjb25maWcsIGFyZ3NbMV1dXG4gICAgICA6IFtjb25maWcsIGFyZ3NbMV1dO1xuXG4gICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGAke2NvbHVtbkV4cHJ9IEBAICR7cGFyc2VyfSg/LCA/KWAsIHBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcldoZXJlVHNTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTdHJpbmdTcWxFeHByZXNzaW9uPihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNRdWVyeU9wdGlvbnMgfCBUc1F1ZXJ5Q29uZmlnLFxuICApOiB0aGlzO1xuICBvcldoZXJlVHNTZWFyY2goLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCBvcHRzID1cbiAgICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICBpc1N0cmluZ1ZhbHVlKGFyZ3NbMl0pID8gKHsgY29uZmlnOiBhcmdzWzJdIH0gYXMgVHNRdWVyeU9wdGlvbnMpIDogKGFyZ3NbMl0gPz8ge30pO1xuXG4gICAgY29uc3QgcGFyc2VyID0gb3B0cy5wYXJzZXIgPz8gXCJ3ZWJzZWFyY2hfdG9fdHNxdWVyeVwiO1xuICAgIGNvbnN0IGNvbmZpZyA9IG9wdHMuY29uZmlnID8/IFwic2ltcGxlXCI7XG4gICAgY29uc3QgY29sdW1uRXhwciA9IGlzU3FsRXhwcmVzc2lvbihhcmdzWzBdKSA/IGFyZ3NbMF1bXCJfc3FsXCJdIDogU3RyaW5nKGFyZ3NbMF0pO1xuICAgIGNvbnN0IHBhcmFtcyA9IGlzU3FsRXhwcmVzc2lvbihhcmdzWzBdKVxuICAgICAgPyBbLi4uYXJnc1swXVtcIl9wYXJhbXNcIl0sIGNvbmZpZywgYXJnc1sxXV1cbiAgICAgIDogW2NvbmZpZywgYXJnc1sxXV07XG5cbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZVJhdyhgJHtjb2x1bW5FeHByfSBAQCAke3BhcnNlcn0oPywgPylgLCBwYXJhbXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgd2hlcmVGdXp6eTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPiB8IFN0cmluZ1NxbEV4cHJlc3Npb24+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBvcGVyYXRvcj86IEZ1enp5T3BlcmF0b3I7XG4gICAgfSxcbiAgKTogdGhpcztcbiAgd2hlcmVGdXp6eSguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIGNvbnN0IG9wZXJhdG9yID0gcGFyc2VGdXp6eU9wZXJhdG9yKGFyZ3NbMl0/Lm9wZXJhdG9yKTtcblxuICAgIGlmIChvcGVyYXRvciA9PT0gXCIlXCIpIHtcbiAgICAgIGlmIChpc1NxbEV4cHJlc3Npb24oYXJnc1swXSkpIHtcbiAgICAgICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGAke2FyZ3NbMF1bXCJfc3FsXCJdfSAke29wZXJhdG9yfSA/YCwgWy4uLmFyZ3NbMF1bXCJfcGFyYW1zXCJdLCBhcmdzWzFdXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYD8/ICR7b3BlcmF0b3J9ID9gLCBbYXJnc1swXSwgYXJnc1sxXV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKGlzU3FsRXhwcmVzc2lvbihhcmdzWzBdKSkge1xuICAgICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGA/ICR7b3BlcmF0b3J9ICR7YXJnc1swXVtcIl9zcWxcIl19YCwgW2FyZ3NbMV0sIC4uLmFyZ3NbMF1bXCJfcGFyYW1zXCJdXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYnVpbGRlci53aGVyZVJhdyhgPyAke29wZXJhdG9yfSA/P2AsIFthcmdzWzFdLCBhcmdzWzBdXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZUZ1enp5PFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+IHwgU3RyaW5nU3FsRXhwcmVzc2lvbj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIG9wZXJhdG9yPzogRnV6enlPcGVyYXRvcjtcbiAgICB9LFxuICApOiB0aGlzO1xuICBvcldoZXJlRnV6enkoLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCBvcGVyYXRvciA9IHBhcnNlRnV6enlPcGVyYXRvcihhcmdzWzJdPy5vcGVyYXRvcik7XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IFwiJVwiKSB7XG4gICAgICBpZiAoaXNTcWxFeHByZXNzaW9uKGFyZ3NbMF0pKSB7XG4gICAgICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGAke2FyZ3NbMF1bXCJfc3FsXCJdfSAke29wZXJhdG9yfSA/YCwgW1xuICAgICAgICAgIC4uLmFyZ3NbMF1bXCJfcGFyYW1zXCJdLFxuICAgICAgICAgIGFyZ3NbMV0sXG4gICAgICAgIF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYD8/ICR7b3BlcmF0b3J9ID9gLCBbYXJnc1swXSwgYXJnc1sxXV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKGlzU3FsRXhwcmVzc2lvbihhcmdzWzBdKSkge1xuICAgICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gJHthcmdzWzBdW1wiX3NxbFwiXX1gLCBbYXJnc1sxXSwgLi4uYXJnc1swXVtcIl9wYXJhbXNcIl1dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gPz9gLCBbYXJnc1sxXSwgYXJnc1swXV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOykkeyyqSDqt7jro7lcbiAgd2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzO1xuICB3aGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZSgoc3ViQnVpbGRlcikgPT4ge1xuICAgICAgY29uc3Qgc3ViR3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihzdWJCdWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKHN1Ykdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcldoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogdGhpcztcbiAgb3JXaGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlKChzdWJCdWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBzdWJHcm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KHN1YkJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soc3ViR3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbi8vIEpPSU4g7KCIIOq3uOujueyXkOuKlCBMZWZ07JmAIFJpZ2h07JeQIOuMgO2VnCDsiJzshJzqsIAg7ZWE7JqU7ZWY7KeAIOyViuycvOuvgOuhnCwg66qo65OgIOqyveyasOydmCDsiJjrpbwg6rOE7IKw7ZW07JW87ZWoLlxuZXhwb3J0IGNsYXNzIEpvaW5DbGF1c2VHcm91cDxUTGVmdCBleHRlbmRzIG9iamVjdCwgVFJpZ2h0IGV4dGVuZHMgb2JqZWN0PiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2FsbGJhY2s6IEtuZXguSm9pbkNsYXVzZSkge31cblxuICAvLyBPTihBTkQpOiDsu6zrn7wgPSDsu6zrn7xcbiAgb24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4pOiB0aGlzO1xuICBvbihsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0Pik6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCA9IOqwklxuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUUmlnaHQsIEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCAo7Jew7IKw7J6QKSDsu6zrn7xcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICApOiB0aGlzO1xuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCAo7Jew7IKw7J6QKSDqsJJcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRSaWdodCwgQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gT04oQU5EKTog7L2c67CxXG4gIG9uKGNhbGxiYWNrOiAobmVzdGVkOiBKb2luQ2xhdXNlR3JvdXA8VExlZnQsIFRSaWdodD4pID0+IHZvaWQpOiB0aGlzO1xuICBvbihjYWxsYmFjazogKG5lc3RlZDogSm9pbkNsYXVzZUdyb3VwPFRSaWdodCwgVExlZnQ+KSA9PiB2b2lkKTogdGhpcztcbiAgLy8gT04oQU5EKSDqtaztmIRcbiAgb24oLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHRoaXMuY2FsbGJhY2sub24oLi4uKGFyZ3MgYXMgW3N0cmluZywgc3RyaW5nXSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gT04oT1IpOiDsu6zrn7wgPSDsu6zrn7xcbiAgb3JPbihsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiwgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0Pik6IHRoaXM7XG4gIG9yT24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LCByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4pOiB0aGlzO1xuICAvLyBPTihPUik6IOy7rOufvCA9IOqwklxuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUTGVmdCwgQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VFJpZ2h0LCBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBPTihPUik6IOy7rOufvCAo7Jew7IKw7J6QKSDsu6zrn7xcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICk6IHRoaXM7XG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICApOiB0aGlzO1xuICAvLyBPTihPUik6IOy7rOufvCAo7Jew7IKw7J6QKSDqsJJcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUTGVmdCwgQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUUmlnaHQsIEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKE9SKTog7L2c67CxXG4gIG9yT24oY2FsbGJhY2s6IChuZXN0ZWQ6IEpvaW5DbGF1c2VHcm91cDxUTGVmdCwgVFJpZ2h0PikgPT4gdm9pZCk6IHRoaXM7XG4gIG9yT24oY2FsbGJhY2s6IChuZXN0ZWQ6IEpvaW5DbGF1c2VHcm91cDxUUmlnaHQsIFRMZWZ0PikgPT4gdm9pZCk6IHRoaXM7XG4gIC8vIE9OKE9SKSDqtaztmIRcbiAgb3JPbiguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgdGhpcy5jYWxsYmFjay5vck9uKC4uLihhcmdzIGFzIFtzdHJpbmcsIHN0cmluZ10pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE9OIFZBTChBTkQpOiDsu6zrn7wgPSDqsJIgKOqwkuydhCDsu6zrn7wg7LC47KGw6rCAIOyVhOuLjCDtjIzrnbzrr7jthLDroZwg67CU7J2465SpKVxuICBvblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCB2YWx1ZTogYW55KTogdGhpcztcbiAgb25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLCB2YWx1ZTogYW55KTogdGhpcztcbiAgb25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvblZhbCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgKHRoaXMuY2FsbGJhY2sgYXMgYW55KS5vblZhbCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEFORCBPTiBWQUw6IG9uVmFs7J2YIOuqheyLnOyggSBhbGlhcyAoS25leCDtmLjtmZgpXG4gIGFuZE9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBhbmRPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIGFuZE9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBhbmRPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIGFuZE9uVmFsKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAodGhpcy5jYWxsYmFjayBhcyBhbnkpLmFuZE9uVmFsKC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gT1IgT04gVkFMOiBPUiDsobDqsbTsnLzroZwg6rCSIOuwlOyduOuUqVxuICBvck9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvck9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LCB2YWx1ZTogYW55KTogdGhpcztcbiAgb3JPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLCB2YWx1ZTogYW55KTogdGhpcztcbiAgb3JPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9yT25WYWwoLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICh0aGlzLmNhbGxiYWNrIGFzIGFueSkub3JPblZhbCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG4vKlxuICBUUmVzb2x2ZWQ6IOy/vOumrCDsi6Ttlokg7ZuEIOuwmO2ZmOuQoCDqsrDqs7wg7YOA7J6FXG4gIFRSZXR1cm5pbmc6IFJFVFVSTklORyDsoIjsl5Ag7IKs7Jqp65CgIO2DgOyehVxuKi9cbmV4cG9ydCBjbGFzcyBSZXNvbHZlZFB1cmk8VFJlc29sdmVkLCBUUmV0dXJuaW5nPiBpbXBsZW1lbnRzIFByb21pc2U8VFJlc29sdmVkPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrbmV4UXVlcnk6IEtuZXguUXVlcnlCdWlsZGVyLFxuICAgIHByaXZhdGUga25leDogS25leCxcbiAgICBwcml2YXRlIHRhYmxlU3BlYzogVGFibGVTcGVjIHwgbnVsbCA9IG51bGwsXG4gICkge31cblxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nID0gXCJQcm9taXNlXCI7XG5cbiAgdG9RdWVyeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS50b1F1ZXJ5KCk7XG4gIH1cblxuICBkZWJ1ZygpOiB0aGlzIHtcbiAgICBjb25zb2xlLmxvZyhgJHtjaGFsay5jeWFuKFwiW1B1cmkgRGVidWddXCIpfSAke2NoYWxrLnllbGxvdyh0aGlzLnRvUXVlcnkoKSl9YCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aGVuPFRSZXN1bHQxID0gVFJlc29sdmVkLCBUUmVzdWx0MiA9IG5ldmVyPihcbiAgICBvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFRSZXNvbHZlZCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgbnVsbCxcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgbnVsbCxcbiAgKTogUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgTmFpdGUudChcInB1cmk6ZXhlY3V0ZWQtcXVlcnlcIiwgdGhpcy50b1F1ZXJ5KCkpO1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LnRoZW4ob25mdWxmaWxsZWQgYXMgYW55LCBvbnJlamVjdGVkKTtcbiAgfVxuXG4gIGNhdGNoPFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCBudWxsLFxuICApOiBQcm9taXNlPFRSZXNvbHZlZCB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LmNhdGNoKG9ucmVqZWN0ZWQpO1xuICB9XG5cbiAgZmluYWxseShvbmZpbmFsbHk/OiAoKCkgPT4gdm9pZCkgfCBudWxsKTogUHJvbWlzZTxUUmVzb2x2ZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkuZmluYWxseShvbmZpbmFsbHkpO1xuICB9XG5cbiAgLy8gT04gQ09ORkxJQ1QgLSDsu6zrn7wg6riw67CYXG4gIG9uQ29uZmxpY3Q8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFRSZXR1cm5pbmc+PihcbiAgICBjb2x1bW5zOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBhY3Rpb24/OiBPbkNvbmZsaWN0QWN0aW9uPFRUYWJsZXM+LFxuICApOiB0aGlzIHtcbiAgICBjb25zdCB0YXJnZXQgPSBBcnJheS5pc0FycmF5KGNvbHVtbnMpID8gY29sdW1ucyA6IFtjb2x1bW5zXTtcblxuICAgIGlmICghYWN0aW9uIHx8IGFjdGlvbiA9PT0gXCJub3RoaW5nXCIpIHtcbiAgICAgIC8vIERPIE5PVEhJTkdcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9uQ29uZmxpY3QodGFyZ2V0KS5pZ25vcmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRE8gVVBEQVRFXG4gICAgICBjb25zdCB7IHVwZGF0ZSB9ID0gYWN0aW9uO1xuXG4gICAgICAvLyBhY3Rpb24udXBkYXRlIOuwsOyXtCDtmJXtg5wgOiBbXCJuYW1lXCIsIFwiZW1haWxcIl1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHVwZGF0ZSkpIHtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkub25Db25mbGljdCh0YXJnZXQpLm1lcmdlKHVwZGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhY3Rpb24udXBkYXRlIOqwneyytCDtmJXtg5w6IHsgbmFtZTogXCJKb2huXCIsIGNvdW50OiByYXcoLi4uKSB9XG4gICAgICAgIGNvbnN0IG1lcmdlT2JqID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModXBkYXRlKSkge1xuICAgICAgICAgIGNvbnN0IG1lcmdlZFZhbHVlID0gaXNTcWxFeHByZXNzaW9uKHZhbHVlKVxuICAgICAgICAgICAgPyB0aGlzLmtuZXgucmF3KHZhbHVlW1wiX3NxbFwiXSlcbiAgICAgICAgICAgIDogc2VyaWFsaXplSnNvbkNvbHVtblZhbHVlKHRoaXMudGFibGVTcGVjLCBrZXksIHZhbHVlKTtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKG1lcmdlT2JqLCB7IFtrZXldOiBtZXJnZWRWYWx1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMua25leFF1ZXJ5Lm9uQ29uZmxpY3QodGFyZ2V0KS5tZXJnZShtZXJnZU9iaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBSRVRVUk5JTkc6IFwiKlwiIC0g7KCE7LK0IOy7rOufvFxuICByZXR1cm5pbmcoY29sdW1uOiBcIipcIik6IFJlc29sdmVkUHVyaTxUUmV0dXJuaW5nW10sIG5ldmVyPjtcbiAgLy8gUkVUVVJOSU5HOiDri6jsnbwg7Lus65+8XG4gIHJldHVybmluZzxUQ29sdW1uIGV4dGVuZHMgQ29sdW1uS2V5czxUUmV0dXJuaW5nPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICApOiBSZXNvbHZlZFB1cmk8UGljazxUUmV0dXJuaW5nLCBUQ29sdW1uPltdLCBuZXZlcj47XG4gIC8vIFJFVFVSTklORzog67O17IiYIOy7rOufvCAo67Cw7Je0KVxuICByZXR1cm5pbmc8VENvbHVtbiBleHRlbmRzIENvbHVtbktleXM8VFJldHVybmluZz4+KFxuICAgIGNvbHVtbnM6IFRDb2x1bW5bXSxcbiAgKTogUmVzb2x2ZWRQdXJpPFBpY2s8VFJldHVybmluZywgVENvbHVtbj5bXSwgbmV2ZXI+O1xuICAvLyBSRVRVUk5JTkcg6rWs7ZiEXG4gIHJldHVybmluZyhjb2x1bW5PckNvbHVtbnM6IHN0cmluZyB8IHN0cmluZ1tdKTogUmVzb2x2ZWRQdXJpPGFueVtdLCBuZXZlcj4ge1xuICAgIHRoaXMua25leFF1ZXJ5LnJldHVybmluZyhjb2x1bW5PckNvbHVtbnMpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFxR0EsU0FBZ0IsbUJBQW1CLFVBQWtDO0NBQ25FLE1BQU0sYUFBYSxVQUFVLEtBQUssS0FBSztDQUN2QyxNQUFNLGdCQUFnQixnQkFBZ0IsTUFBTSxjQUFjLGNBQWMsVUFBVTtDQUVsRixJQUFJLENBQUMsZUFDSCxNQUFNLElBQUksTUFBTSwyQkFBMkIsWUFBWSxJQUFJO0NBRzdELE9BQU87QUFDVDtBQUVBLFNBQVMsMkJBQWtDLE9B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
|