semantifold 0.12.0 → 0.14.0
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/README.md +2 -0
- package/build/src/backends/effects.js +5 -2
- package/build/src/backends/java.js +33 -14
- package/build/src/backends/javascript.js +83 -18
- package/build/src/backends/php.d.ts.map +1 -1
- package/build/src/backends/php.js +88 -16
- package/build/src/backends/ruby.js +37 -12
- package/build/src/backends/scalars.js +2 -2
- package/build/src/backends/shared.d.ts +2 -1
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +299 -42
- package/build/src/backends/typescript.js +83 -18
- package/build/src/backends/writer.d.ts +18 -4
- package/build/src/backends/writer.d.ts.map +1 -1
- package/build/src/backends/writer.js +40 -4
- package/build/src/frontends/java.d.ts +9 -1
- package/build/src/frontends/java.d.ts.map +1 -1
- package/build/src/frontends/java.js +90 -43
- package/build/src/frontends/javascript-typescript.d.ts +3 -1
- package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
- package/build/src/frontends/javascript-typescript.js +133 -52
- package/build/src/frontends/php.d.ts +13 -1
- package/build/src/frontends/php.d.ts.map +1 -1
- package/build/src/frontends/php.js +226 -59
- package/build/src/frontends/ruby.d.ts +4 -1
- package/build/src/frontends/ruby.d.ts.map +1 -1
- package/build/src/frontends/ruby.js +113 -37
- package/build/src/frontends/types.d.ts +9 -2
- package/build/src/frontends/types.d.ts.map +1 -1
- package/build/src/frontends/types.js +26 -9
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +14 -6
- package/build/src/mapping.d.ts.map +1 -1
- package/build/src/mapping.js +4 -2
- package/build/src/semantic/effects.d.ts.map +1 -1
- package/build/src/semantic/effects.js +20 -6
- package/build/src/semantic/lifetime.js +28 -4
- package/build/src/semantic/provenance.d.ts.map +1 -1
- package/build/src/semantic/provenance.js +61 -9
- package/build/src/semantic/types.d.ts +214 -23
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +58 -11
- package/build/src/semantic/validate.d.ts +31 -2
- package/build/src/semantic/validate.d.ts.map +1 -1
- package/build/src/semantic/validate.js +450 -60
- package/docs/adr/20261026-typed-error-handling-extension.md +55 -0
- package/docs/adr-bounded-subtyping.md +180 -0
- package/docs/adr-numeric-tower.md +156 -0
- package/docs/architecture.md +1 -1
- package/docs/language-support.md +8 -8
- package/docs/testing.md +5 -3
- package/package.json +1 -1
- package/src/backends/effects.js +3 -1
- package/src/backends/java.js +33 -14
- package/src/backends/javascript.js +83 -18
- package/src/backends/php.js +89 -16
- package/src/backends/ruby.js +36 -12
- package/src/backends/scalars.js +1 -1
- package/src/backends/shared.js +298 -47
- package/src/backends/typescript.js +83 -18
- package/src/backends/writer.js +41 -3
- package/src/frontends/java.js +95 -43
- package/src/frontends/javascript-typescript.js +145 -53
- package/src/frontends/php.js +243 -58
- package/src/frontends/ruby.js +117 -35
- package/src/frontends/types.js +26 -8
- package/src/language-registry.js +13 -5
- package/src/mapping.js +3 -1
- package/src/semantic/effects.js +18 -5
- package/src/semantic/lifetime.js +29 -3
- package/src/semantic/provenance.js +60 -14
- package/src/semantic/types.js +62 -10
- package/src/semantic/validate.js +481 -61
|
@@ -5,13 +5,13 @@ import { missingType, parseFailure, unsupportedSyntax } from "../diagnostic.js";
|
|
|
5
5
|
import { blockReferencesProtectedEntry } from "../semantic/effects.js";
|
|
6
6
|
import { locationFromOffsets, moduleLocation } from "../semantic/location.js";
|
|
7
7
|
import { withAdaptedOperation } from "../semantic/operators.js";
|
|
8
|
-
import { withParserRanges } from "../semantic/provenance.js";
|
|
8
|
+
import { setParserRanges, withParserRanges } from "../semantic/provenance.js";
|
|
9
9
|
import { isTask034ResourceProbe } from "../semantic/capabilities.js";
|
|
10
10
|
import { hasExactEffectSupport } from "../backends/effects.js";
|
|
11
11
|
import { hasOnlyUnicodeScalars, scalarType } from "../semantic/scalars.js";
|
|
12
12
|
import { typeContainsAnyVariable } from "../semantic/generics.js";
|
|
13
13
|
import { requireSourceReturnType, requireSourceScalarType, sourceScalarType } from "./scalars.js";
|
|
14
|
-
import { capabilityFunctionSignatures, documentedValueType, instantiatedRecordFieldType, iterationBindingType, iterationOperandType, knownCallParameterTypes, knownCallReturnType, optionalType, orderedMapTypeFromMap, ownedResourceType, preservesGenericOptionalEvidence, recordType, referenceType, sameValueType } from "./types.js";
|
|
14
|
+
import { capabilityFunctionSignatures, documentedValueType, instantiatedRecordFieldType, interfaceType, iterationBindingType, iterationOperandType, knownCallParameterTypes, knownCallReturnType, optionalType, orderedMapTypeFromMap, ownedResourceType, preservesGenericOptionalEvidence, recordType, referenceType, sameValueType } from "./types.js";
|
|
15
15
|
const parser = new PhpParser.Engine({
|
|
16
16
|
ast: { withPositions: true },
|
|
17
17
|
parser: { extractDoc: true, suppressErrors: false }
|
|
@@ -37,13 +37,16 @@ const phpBinaryOperations = new Map([
|
|
|
37
37
|
/**
|
|
38
38
|
* @typedef PhpConversionContext
|
|
39
39
|
* @property {Map<string, import("../semantic/types.js").SemanticBindingType>} bindings - Explicitly typed visible bindings.
|
|
40
|
+
* @property {Set<string>} [catchBindingNames] - Lexically visible exact catch binding names.
|
|
41
|
+
* @property {Map<string, import("../semantic/types.js").CatchBinding>} [catchBindingNodes] - Exact catch binding nodes by visible name.
|
|
40
42
|
* @property {Map<string, import("../semantic/types.js").ClassDeclaration>} classes - Reference classes by identity.
|
|
41
43
|
* @property {import("../semantic/types.js").ClassDeclaration} [currentClass] - Enclosing reference class.
|
|
44
|
+
* @property {Map<string, import("../semantic/types.js").InterfaceDeclaration>} interfaces - Interface declarations by identity.
|
|
42
45
|
* @property {Map<string, import("../semantic/types.js").ErrorDeclaration>} errorNames - Error declarations by source name.
|
|
43
46
|
* @property {Map<string, import("../semantic/types.js").ErrorDeclaration>} errors - Error declarations by identity.
|
|
44
47
|
* @property {Map<string, PhpFunctionSignature>} functions - Explicit module function signatures.
|
|
45
48
|
* @property {Set<object>} [orderedMapDeclarations] - Exact local declarations selected by parser-owned pair iteration.
|
|
46
|
-
* @property {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration>} recordNames - Nominal declarations by source name.
|
|
49
|
+
* @property {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} recordNames - Nominal declarations by source name.
|
|
47
50
|
* @property {Map<string, import("../semantic/types.js").RecordDeclaration>} records - Record declarations by identity.
|
|
48
51
|
* @property {import("../semantic/types.js").SemanticFunctionReturnType | undefined} returnType - Enclosing return type.
|
|
49
52
|
* @property {Map<string, import("../semantic/types.js").TypeParameter>} [typeParameters] - Declaration-scoped parameters.
|
|
@@ -284,6 +287,9 @@ function convertExpression(node, filename, source, context, expectedType, preser
|
|
|
284
287
|
const declaration = context.recordNames.get(name.name);
|
|
285
288
|
if (!declaration)
|
|
286
289
|
return unsupportedSyntax("php", "construction of an unknown nominal class", nodeLocation(construction.what, filename, source));
|
|
290
|
+
if (declaration.kind == "InterfaceDeclaration") {
|
|
291
|
+
return unsupportedSyntax("php", "construction of an interface", nodeLocation(construction.what, filename, source));
|
|
292
|
+
}
|
|
287
293
|
if (declaration.kind == "ClassDeclaration") {
|
|
288
294
|
const unsupportedArgument = construction.arguments.find((argument) => argument.kind == "namedargument" || argument.kind == "variadic" || Reflect.get(argument, "byref") === true);
|
|
289
295
|
if (unsupportedArgument)
|
|
@@ -330,6 +336,9 @@ function convertExpression(node, filename, source, context, expectedType, preser
|
|
|
330
336
|
if (receiverType?.kind == "ReferenceType") {
|
|
331
337
|
return unsupportedSyntax("php", "private reference-class field access", location);
|
|
332
338
|
}
|
|
339
|
+
if (receiverType?.kind == "InterfaceType") {
|
|
340
|
+
return unsupportedSyntax("php", "interface receiver member access", location);
|
|
341
|
+
}
|
|
333
342
|
const receiverRecord = receiverType?.kind == "OptionalType" ? receiverType.valueType : receiverType;
|
|
334
343
|
const declaration = receiverRecord?.kind == "RecordType" ? context.records.get(receiverRecord.declarationId) : undefined;
|
|
335
344
|
if ((declaration?.typeParameters?.length ?? 0) > 0) {
|
|
@@ -441,8 +450,10 @@ function convertExpression(node, filename, source, context, expectedType, preser
|
|
|
441
450
|
const lookup = /** @type {import("php-parser").PropertyLookup} */ ( /** @type {unknown} */(call.what));
|
|
442
451
|
const member = lookup.offset.kind == "identifier" ? /** @type {import("php-parser").Identifier} */ (lookup.offset) : undefined;
|
|
443
452
|
const receiverType = knownExpressionType(lookup.what, context);
|
|
444
|
-
if (member && typeof member.name == "string" && receiverType?.kind == "ReferenceType") {
|
|
445
|
-
const method =
|
|
453
|
+
if (member && typeof member.name == "string" && (receiverType?.kind == "ReferenceType" || receiverType?.kind == "InterfaceType")) {
|
|
454
|
+
const method = receiverType.kind == "ReferenceType"
|
|
455
|
+
? context.classes.get(receiverType.declarationId)?.methods.find((candidate) => candidate.name == member.name)
|
|
456
|
+
: context.interfaces.get(receiverType.declarationId)?.methods.find((candidate) => candidate.name == member.name);
|
|
446
457
|
const unsupportedArgument = call.arguments.find((argument) => argument.kind == "namedargument" || argument.kind == "variadic" || Reflect.get(argument, "byref") === true);
|
|
447
458
|
if (unsupportedArgument)
|
|
448
459
|
return unsupportedSyntax("php", "non-positional method argument", nodeLocation(unsupportedArgument, filename, source));
|
|
@@ -541,6 +552,9 @@ function knownExpressionType(node, context) {
|
|
|
541
552
|
if (receiver?.kind == "ReferenceType" && member && typeof member.name == "string") {
|
|
542
553
|
return context.classes.get(receiver.declarationId)?.methods.find((method) => method.name == member.name)?.returnType;
|
|
543
554
|
}
|
|
555
|
+
if (receiver?.kind == "InterfaceType" && member && typeof member.name == "string") {
|
|
556
|
+
return context.interfaces.get(receiver.declarationId)?.methods.find((method) => method.name == member.name)?.returnType;
|
|
557
|
+
}
|
|
544
558
|
}
|
|
545
559
|
}
|
|
546
560
|
if (node.kind == "offsetlookup") {
|
|
@@ -558,7 +572,9 @@ function knownExpressionType(node, context) {
|
|
|
558
572
|
if (declaration?.id)
|
|
559
573
|
return declaration.kind == "ClassDeclaration"
|
|
560
574
|
? { declarationId: declaration.id, kind: "ReferenceType" }
|
|
561
|
-
:
|
|
575
|
+
: declaration.kind == "InterfaceDeclaration"
|
|
576
|
+
? { declarationId: declaration.id, kind: "InterfaceType" }
|
|
577
|
+
: { declarationId: declaration.id, kind: "RecordType" };
|
|
562
578
|
}
|
|
563
579
|
if (node.kind == "propertylookup") {
|
|
564
580
|
const read = /** @type {import("php-parser").PropertyLookup} */ (node);
|
|
@@ -652,7 +668,7 @@ function convertReturn(node, filename, source, context) {
|
|
|
652
668
|
* @param {string} name - Local name.
|
|
653
669
|
* @param {string} filename - Source filename.
|
|
654
670
|
* @param {string} source - Complete source.
|
|
655
|
-
* @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration>} recordNames - Nominal declarations by source name.
|
|
671
|
+
* @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} recordNames - Nominal declarations by source name.
|
|
656
672
|
* @param {Map<string, import("../semantic/types.js").TypeParameter>} [typeParameters] - Declaration-scoped parameters.
|
|
657
673
|
* @returns {{immutable: boolean, type: import("../semantic/types.js").SemanticValueType} | undefined} Metadata when present.
|
|
658
674
|
*/
|
|
@@ -755,7 +771,7 @@ function convertLocalStatement(node, filename, source, context) {
|
|
|
755
771
|
}
|
|
756
772
|
const inferredType = knownExpressionType(assignment.right, context);
|
|
757
773
|
if (inferredType?.kind == "RecordType" || inferredType?.kind == "ReferenceType" ||
|
|
758
|
-
inferredType?.kind == "OwnedResourceType") {
|
|
774
|
+
inferredType?.kind == "InterfaceType" || inferredType?.kind == "OwnedResourceType") {
|
|
759
775
|
const initializer = convertExpression(assignment.right, filename, source, context, inferredType);
|
|
760
776
|
context.bindings.set(variable.name, inferredType);
|
|
761
777
|
return withParserRanges({
|
|
@@ -838,11 +854,23 @@ function convertStatement(node, filename, source, context) {
|
|
|
838
854
|
* @param {string} filename - Source filename.
|
|
839
855
|
* @param {string} source - Complete source.
|
|
840
856
|
* @param {PhpConversionContext} context - Typed lexical context.
|
|
841
|
-
* @returns {import("../semantic/types.js").RaiseStatement} Semantic raise.
|
|
857
|
+
* @returns {import("../semantic/types.js").RaiseStatement | import("../semantic/types.js").RethrowStatement} Semantic raise or rethrow.
|
|
842
858
|
*/
|
|
843
859
|
function convertPhpRaise(node, filename, source, context) {
|
|
844
860
|
const location = nodeLocation(node, filename, source);
|
|
845
861
|
const construction = Reflect.get(node, "what");
|
|
862
|
+
if (construction?.kind == "variable" && typeof construction.name == "string" && !construction.curly &&
|
|
863
|
+
context.bindings.get(construction.name)?.kind == "ErrorType" && context.catchBindingNames?.has(construction.name)) {
|
|
864
|
+
const bindingNode = context.catchBindingNodes?.get(construction.name);
|
|
865
|
+
if (!bindingNode)
|
|
866
|
+
return unsupportedSyntax("php", "throw of a catch binding without an exact handler binding", location);
|
|
867
|
+
return withParserRanges({
|
|
868
|
+
binding: construction.name,
|
|
869
|
+
bindingNode,
|
|
870
|
+
kind: /** @type {const} */ ("RethrowStatement"),
|
|
871
|
+
location
|
|
872
|
+
}, { keyword: tokenLocation("throw", node.loc?.start.offset ?? 0, construction.loc?.start.offset ?? source.length, filename, source) });
|
|
873
|
+
}
|
|
846
874
|
if (!construction || construction.kind != "new" || construction.what?.kind != "name" ||
|
|
847
875
|
construction.what.resolution != "uqn" || !context.errorNames.has(construction.what.name) ||
|
|
848
876
|
!Array.isArray(construction.arguments) || construction.arguments.length != 1 ||
|
|
@@ -874,39 +902,64 @@ function convertPhpTry(node, filename, source, context) {
|
|
|
874
902
|
const location = nodeLocation(node, filename, source);
|
|
875
903
|
const catches = Reflect.get(node, "catches");
|
|
876
904
|
const body = Reflect.get(node, "body");
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
const
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
905
|
+
const always = Reflect.get(node, "always");
|
|
906
|
+
if (!Array.isArray(catches) || (catches.length == 0 && !always) || body?.kind != "block") {
|
|
907
|
+
return unsupportedSyntax("php", "try without typed catches or finally", location);
|
|
908
|
+
}
|
|
909
|
+
/** @type {import("../semantic/types.js").CatchHandler[]} */
|
|
910
|
+
const handlers = [];
|
|
911
|
+
const seenHandlerNames = new Set(context.catchBindingNames ?? []);
|
|
912
|
+
for (const handler of catches) {
|
|
913
|
+
const caught = handler.what?.[0];
|
|
914
|
+
const binding = handler.variable;
|
|
915
|
+
if (handler.what?.length != 1 || caught?.kind != "name" || caught.resolution != "uqn" ||
|
|
916
|
+
!context.errorNames.has(caught.name) || binding?.kind != "variable" || typeof binding.name != "string" ||
|
|
917
|
+
binding.curly || handler.body?.kind != "block") {
|
|
918
|
+
return unsupportedSyntax("php", "broad, multiple, or malformed catch", nodeLocation(handler, filename, source));
|
|
919
|
+
}
|
|
920
|
+
if (seenHandlerNames.has(binding.name)) {
|
|
921
|
+
return unsupportedSyntax("php", `catch binding '${binding.name}' shadows an outer handler binding`, nodeLocation(binding, filename, source));
|
|
922
|
+
}
|
|
923
|
+
seenHandlerNames.add(binding.name);
|
|
924
|
+
const declaration = /** @type {import("../semantic/types.js").ErrorDeclaration} */ (context.errorNames.get(caught.name));
|
|
925
|
+
const caughtLocation = nodeLocation(caught, filename, source);
|
|
926
|
+
const catchType = withParserRanges({ declarationId: /** @type {string} */ (declaration.id), kind: /** @type {const} */ ("ErrorType") }, {
|
|
927
|
+
type: caughtLocation
|
|
928
|
+
});
|
|
929
|
+
const catchContext = { ...context, bindings: new Map(context.bindings), catchBindingNames: new Set(seenHandlerNames),
|
|
930
|
+
catchBindingNodes: new Map(context.catchBindingNodes) };
|
|
931
|
+
catchContext.bindings.set(binding.name, catchType);
|
|
932
|
+
const catchBindingNode = withParserRanges({
|
|
899
933
|
kind: /** @type {const} */ ("CatchBinding"),
|
|
900
934
|
location: nodeLocation(binding, filename, source),
|
|
901
935
|
mutable: /** @type {const} */ (false),
|
|
902
936
|
name: binding.name,
|
|
903
937
|
type: catchType
|
|
904
|
-
}, { name: nodeLocation(binding, filename, source) })
|
|
905
|
-
|
|
906
|
-
|
|
938
|
+
}, { name: nodeLocation(binding, filename, source) });
|
|
939
|
+
catchContext.catchBindingNodes.set(binding.name, catchBindingNode);
|
|
940
|
+
handlers.push(withParserRanges({
|
|
941
|
+
catchBinding: catchBindingNode,
|
|
942
|
+
catchBody: convertBlock(handler.body, filename, source, catchContext),
|
|
943
|
+
catchType,
|
|
944
|
+
kind: /** @type {const} */ ("CatchHandler"),
|
|
945
|
+
location: nodeLocation(handler, filename, source)
|
|
946
|
+
}, { catch: nodeLocation(handler, filename, source) }));
|
|
947
|
+
}
|
|
948
|
+
const bodyContext = { ...context, bindings: new Map(context.bindings) };
|
|
949
|
+
const semantic = /** @type {import("../semantic/types.js").TryStatement} */ (withParserRanges({
|
|
950
|
+
body: convertBlock(body, filename, source, bodyContext),
|
|
951
|
+
handlers,
|
|
907
952
|
kind: /** @type {const} */ ("TryStatement"),
|
|
908
953
|
location
|
|
909
|
-
}, {
|
|
954
|
+
}, { try: tokenLocation("try", node.loc?.start.offset ?? 0, body.loc?.start.offset ?? source.length, filename, source) }));
|
|
955
|
+
if (always) {
|
|
956
|
+
if (always.kind != "block")
|
|
957
|
+
return unsupportedSyntax("php", "malformed finally block", nodeLocation(always, filename, source));
|
|
958
|
+
semantic.finallyBody = convertBlock(always, filename, source, bodyContext);
|
|
959
|
+
setParserRanges(semantic, { finally: nodeLocation(always, filename, source),
|
|
960
|
+
try: tokenLocation("try", node.loc?.start.offset ?? 0, body.loc?.start.offset ?? source.length, filename, source) });
|
|
961
|
+
}
|
|
962
|
+
return semantic;
|
|
910
963
|
}
|
|
911
964
|
/**
|
|
912
965
|
* Converts exact block-form PHP `foreach ($list as $value)`.
|
|
@@ -1017,7 +1070,7 @@ function convertBlock(node, filename, source, context) {
|
|
|
1017
1070
|
* @param {import("../semantic/types.js").SourceLocation} location - Source location.
|
|
1018
1071
|
* @param {string} filename - Source filename.
|
|
1019
1072
|
* @param {string} source - Complete source.
|
|
1020
|
-
* @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration>} [recordNames] - Nominal declarations by source name.
|
|
1073
|
+
* @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} [recordNames] - Nominal declarations by source name.
|
|
1021
1074
|
* @returns {import("../semantic/types.js").SemanticValueType} Semantic type.
|
|
1022
1075
|
*/
|
|
1023
1076
|
function convertType(sourceType, subject, location, filename, source, recordNames = new Map()) {
|
|
@@ -1032,9 +1085,11 @@ function convertType(sourceType, subject, location, filename, source, recordName
|
|
|
1032
1085
|
if (declaration?.id)
|
|
1033
1086
|
return declaration.kind == "ClassDeclaration"
|
|
1034
1087
|
? referenceType(declaration.id, typeLocation)
|
|
1035
|
-
: declaration.kind == "
|
|
1036
|
-
?
|
|
1037
|
-
:
|
|
1088
|
+
: declaration.kind == "InterfaceDeclaration"
|
|
1089
|
+
? interfaceType(declaration.id, typeLocation)
|
|
1090
|
+
: declaration.kind == "EffectResourceDeclaration"
|
|
1091
|
+
? ownedResourceType(declaration.id, typeLocation)
|
|
1092
|
+
: recordType(declaration.id, typeLocation);
|
|
1038
1093
|
return requireSourceScalarType("php", typeName, subject, location, typeLocation);
|
|
1039
1094
|
}
|
|
1040
1095
|
/**
|
|
@@ -1136,7 +1191,7 @@ function nullableType(valueType, sourceType, ownerStart, filename, source) {
|
|
|
1136
1191
|
* @param {import("../semantic/types.js").SourceLocation} location - Function location.
|
|
1137
1192
|
* @param {string} filename - Source filename.
|
|
1138
1193
|
* @param {string} source - Complete source.
|
|
1139
|
-
* @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration>} [recordNames] - Nominal declarations by source name.
|
|
1194
|
+
* @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} [recordNames] - Nominal declarations by source name.
|
|
1140
1195
|
* @returns {import("../semantic/types.js").SemanticFunctionReturnType} Semantic return type.
|
|
1141
1196
|
*/
|
|
1142
1197
|
function convertReturnType(sourceType, subject, location, filename, source, recordNames = new Map()) {
|
|
@@ -1150,9 +1205,11 @@ function convertReturnType(sourceType, subject, location, filename, source, reco
|
|
|
1150
1205
|
if (declaration?.id)
|
|
1151
1206
|
return declaration.kind == "ClassDeclaration"
|
|
1152
1207
|
? referenceType(declaration.id, nodeLocation(sourceType, filename, source))
|
|
1153
|
-
: declaration.kind == "
|
|
1154
|
-
?
|
|
1155
|
-
:
|
|
1208
|
+
: declaration.kind == "InterfaceDeclaration"
|
|
1209
|
+
? interfaceType(declaration.id, nodeLocation(sourceType, filename, source))
|
|
1210
|
+
: declaration.kind == "EffectResourceDeclaration"
|
|
1211
|
+
? ownedResourceType(declaration.id, nodeLocation(sourceType, filename, source))
|
|
1212
|
+
: recordType(declaration.id, nodeLocation(sourceType, filename, source));
|
|
1156
1213
|
return requireSourceReturnType("php", typeName, subject, location, nodeLocation(sourceType, filename, source));
|
|
1157
1214
|
}
|
|
1158
1215
|
/**
|
|
@@ -1160,7 +1217,7 @@ function convertReturnType(sourceType, subject, location, filename, source, reco
|
|
|
1160
1217
|
* @param {import("php-parser").Function} node - PHP function node.
|
|
1161
1218
|
* @param {string} filename - Source filename.
|
|
1162
1219
|
* @param {string} source - Complete source.
|
|
1163
|
-
* @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration>} recordNames - Nominal declarations by source name.
|
|
1220
|
+
* @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} recordNames - Nominal declarations by source name.
|
|
1164
1221
|
* @param {string} ownerId - Stable function identity.
|
|
1165
1222
|
* @returns {PhpFunctionSignature} Typed function signature.
|
|
1166
1223
|
*/
|
|
@@ -1255,7 +1312,7 @@ function convertFunctionSignature(node, filename, source, recordNames, ownerId)
|
|
|
1255
1312
|
* @param {string | undefined} nativeType - Native PHP type name.
|
|
1256
1313
|
* @param {boolean} nativeNullable - Whether the native carrier has PHP's nullable marker.
|
|
1257
1314
|
* @param {import("../semantic/types.js").SemanticValueType} documentedType - Exact semantic document type.
|
|
1258
|
-
* @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration>} records - Visible nominal declarations by name.
|
|
1315
|
+
* @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} records - Visible nominal declarations by name.
|
|
1259
1316
|
* @returns {boolean} Whether the native carrier agrees without changing meaning.
|
|
1260
1317
|
*/
|
|
1261
1318
|
function phpDocumentedNativeTypeMatches(nativeType, nativeNullable, documentedType, records) {
|
|
@@ -1281,6 +1338,9 @@ function phpDocumentedNativeTypeMatches(nativeType, nativeNullable, documentedTy
|
|
|
1281
1338
|
if (documentedType.kind == "ReferenceType") {
|
|
1282
1339
|
return nativeType !== undefined && records.get(nativeType)?.id == documentedType.declarationId;
|
|
1283
1340
|
}
|
|
1341
|
+
if (documentedType.kind == "InterfaceType") {
|
|
1342
|
+
return nativeType !== undefined && records.get(nativeType)?.id == documentedType.declarationId;
|
|
1343
|
+
}
|
|
1284
1344
|
return false;
|
|
1285
1345
|
}
|
|
1286
1346
|
/**
|
|
@@ -1288,16 +1348,17 @@ function phpDocumentedNativeTypeMatches(nativeType, nativeNullable, documentedTy
|
|
|
1288
1348
|
* @param {import("php-parser").Function} node - PHP function node.
|
|
1289
1349
|
* @param {PhpFunctionSignature} signature - Preconverted explicit signature.
|
|
1290
1350
|
* @param {Map<string, PhpFunctionSignature>} functions - Module function signatures.
|
|
1291
|
-
* @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration>} recordNames - Nominal declarations by source name.
|
|
1351
|
+
* @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} recordNames - Nominal declarations by source name.
|
|
1292
1352
|
* @param {Map<string, import("../semantic/types.js").RecordDeclaration>} records - Record declarations by identity.
|
|
1293
1353
|
* @param {Map<string, import("../semantic/types.js").ClassDeclaration>} classes - Reference classes by identity.
|
|
1354
|
+
* @param {Map<string, import("../semantic/types.js").InterfaceDeclaration>} interfaces - Interface declarations by identity.
|
|
1294
1355
|
* @param {Map<string, import("../semantic/types.js").ErrorDeclaration>} errorNames - Error declarations by source name.
|
|
1295
1356
|
* @param {Map<string, import("../semantic/types.js").ErrorDeclaration>} errors - Error declarations by identity.
|
|
1296
1357
|
* @param {string} filename - Source filename.
|
|
1297
1358
|
* @param {string} source - Complete source.
|
|
1298
1359
|
* @returns {import("../semantic/types.js").FunctionDeclaration} Semantic function.
|
|
1299
1360
|
*/
|
|
1300
|
-
function convertFunction(node, signature, functions, recordNames, records, classes, errorNames, errors, filename, source) {
|
|
1361
|
+
function convertFunction(node, signature, functions, recordNames, records, classes, interfaces, errorNames, errors, filename, source) {
|
|
1301
1362
|
if (!node.body)
|
|
1302
1363
|
return unsupportedSyntax("php", "function body", signature.location);
|
|
1303
1364
|
const context = {
|
|
@@ -1313,7 +1374,7 @@ function convertFunction(node, signature, functions, recordNames, records, class
|
|
|
1313
1374
|
typeParameters: new Map((signature.typeParameters ?? []).map((parameter) => [parameter.name, parameter]))
|
|
1314
1375
|
};
|
|
1315
1376
|
return withParserRanges({
|
|
1316
|
-
body: convertBlock(node.body, filename, source, context),
|
|
1377
|
+
body: convertBlock(node.body, filename, source, { ...context, interfaces }),
|
|
1317
1378
|
kind: "FunctionDeclaration",
|
|
1318
1379
|
location: signature.location,
|
|
1319
1380
|
name: signature.name,
|
|
@@ -1408,7 +1469,7 @@ function convertPhpError(node, declaration, filename, source) {
|
|
|
1408
1469
|
/**
|
|
1409
1470
|
* Reads one exact public PHP constructor or instance-method signature.
|
|
1410
1471
|
* @param {import("php-parser").Method} node - Parser-owned method.
|
|
1411
|
-
* @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration>} nominalNames - Visible nominal declarations.
|
|
1472
|
+
* @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} nominalNames - Visible nominal declarations.
|
|
1412
1473
|
* @param {string} ownerId - Stable callable identity.
|
|
1413
1474
|
* @param {boolean} constructor - Whether this is the sole constructor.
|
|
1414
1475
|
* @param {string} filename - Source filename.
|
|
@@ -1490,13 +1551,93 @@ function convertPhpClassCallableSignature(node, nominalNames, ownerId, construct
|
|
|
1490
1551
|
}
|
|
1491
1552
|
return { location, name, nameLocation: nodeLocation(nameNode, filename, source), parameters, returnType };
|
|
1492
1553
|
}
|
|
1554
|
+
/**
|
|
1555
|
+
* Converts the signature-only PHP interface profile.
|
|
1556
|
+
* @param {import("php-parser").Class} node - Parser interface.
|
|
1557
|
+
* @param {import("../semantic/types.js").InterfaceDeclaration} declaration - Predeclared interface identity.
|
|
1558
|
+
* @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} nominalNames - Visible nominal declarations.
|
|
1559
|
+
* @param {string} filename - Source filename.
|
|
1560
|
+
* @param {string} source - Complete source.
|
|
1561
|
+
* @returns {import("../semantic/types.js").InterfaceDeclaration} Semantic interface.
|
|
1562
|
+
*/
|
|
1563
|
+
function convertPhpInterface(node, declaration, nominalNames, filename, source) {
|
|
1564
|
+
const location = nodeLocation(node, filename, source);
|
|
1565
|
+
const parents = /** @type {readonly import("php-parser").Name[]} */ ( /** @type {unknown} */(node.extends ?? []));
|
|
1566
|
+
if (node.isAnonymous || node.attrGroups.length)
|
|
1567
|
+
return unsupportedSyntax("php", "malformed interface declaration", location);
|
|
1568
|
+
const parentReferences = parents.map((parent) => {
|
|
1569
|
+
if (parent.kind != "name" || parent.resolution != "uqn" || typeof parent.name != "string") {
|
|
1570
|
+
return unsupportedSyntax("php", "qualified or dynamic interface parent", nodeLocation(parent, filename, source));
|
|
1571
|
+
}
|
|
1572
|
+
const parentDeclaration = nominalNames.get(parent.name);
|
|
1573
|
+
if (!parentDeclaration?.id || parentDeclaration.kind != "InterfaceDeclaration") {
|
|
1574
|
+
return unsupportedSyntax("php", `interface parent '${parent.name}' is not a declared interface`, nodeLocation(parent, filename, source));
|
|
1575
|
+
}
|
|
1576
|
+
return interfaceType(/** @type {string} */ (parentDeclaration.id), nodeLocation(parent, filename, source));
|
|
1577
|
+
});
|
|
1578
|
+
const methodNodes = /** @type {import("php-parser").Method[]} */ (node.body.filter((member) => member.kind == "method"));
|
|
1579
|
+
if (methodNodes.length != node.body.length) {
|
|
1580
|
+
return unsupportedSyntax("php", "interface member outside one signature-only public method", nodeLocation(node.body.find((member) => member.kind != "method") ?? node, filename, source));
|
|
1581
|
+
}
|
|
1582
|
+
declaration.methods = methodNodes.map((method, index) => convertPhpInterfaceMethodSignature(method, nominalNames, `${declaration.id}:method:${index}`, filename, source));
|
|
1583
|
+
const nameNode = typeof node.name == "string" ? node : node.name;
|
|
1584
|
+
return withParserRanges({
|
|
1585
|
+
...declaration,
|
|
1586
|
+
...(parentReferences.length > 0 ? { extends: parentReferences } : {})
|
|
1587
|
+
}, { name: nodeLocation(nameNode, filename, source) });
|
|
1588
|
+
}
|
|
1589
|
+
/**
|
|
1590
|
+
* Reads one exact signature-only PHP interface method.
|
|
1591
|
+
* @param {import("php-parser").Method} node - Parser interface method.
|
|
1592
|
+
* @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} nominalNames - Visible nominal declarations.
|
|
1593
|
+
* @param {string} ownerId - Stable interface method identity.
|
|
1594
|
+
* @param {string} filename - Source filename.
|
|
1595
|
+
* @param {string} source - Complete source.
|
|
1596
|
+
* @returns {import("../semantic/types.js").InterfaceMethodDeclaration} Semantic interface method.
|
|
1597
|
+
*/
|
|
1598
|
+
function convertPhpInterfaceMethodSignature(node, nominalNames, ownerId, filename, source) {
|
|
1599
|
+
const location = nodeLocation(node, filename, source);
|
|
1600
|
+
const name = typeof node.name == "string" ? node.name : node.name.name;
|
|
1601
|
+
if (node.visibility != "public" || node.isStatic || node.isAbstract || node.isFinal || Reflect.get(node, "isReadonly") ||
|
|
1602
|
+
node.byref || node.nullable || node.attrGroups.length || node.body !== null) {
|
|
1603
|
+
return unsupportedSyntax("php", "interface method outside one public signature-only declaration", location);
|
|
1604
|
+
}
|
|
1605
|
+
const documented = functionDocumentedTypes(/** @type {import("php-parser").Function} */ ( /** @type {unknown} */(node)), filename, source, ownerId);
|
|
1606
|
+
if (documented.parameters.size > 0 || documented.returnType || documented.typeParameters?.length) {
|
|
1607
|
+
return unsupportedSyntax("php", "documented interface method type annotation", location);
|
|
1608
|
+
}
|
|
1609
|
+
if (!node.type)
|
|
1610
|
+
return missingType("php", `Interface method '${name}' return`, location);
|
|
1611
|
+
const parameters = node.arguments.map((parameter) => {
|
|
1612
|
+
const parameterLocation = nodeLocation(parameter, filename, source);
|
|
1613
|
+
const parameterName = typeof parameter.name == "string" ? parameter.name : parameter.name.name;
|
|
1614
|
+
if (parameter.byref || parameter.variadic || parameter.value || parameter.flags || parameter.readonly || parameter.nullable ||
|
|
1615
|
+
parameter.hooks.length || parameter.attrGroups.length) {
|
|
1616
|
+
return unsupportedSyntax("php", "noncanonical interface method parameter", parameterLocation);
|
|
1617
|
+
}
|
|
1618
|
+
if (!parameter.type)
|
|
1619
|
+
return missingType("php", `Parameter '${parameterName}'`, parameterLocation);
|
|
1620
|
+
const type = convertType(parameter.type, `Parameter '${parameterName}'`, parameterLocation, filename, source, nominalNames);
|
|
1621
|
+
if (type.kind == "OptionalType")
|
|
1622
|
+
return unsupportedSyntax("php", "optional interface method parameter", parameterLocation);
|
|
1623
|
+
const nameNode = typeof parameter.name == "string" ? parameter : parameter.name;
|
|
1624
|
+
return withParserRanges({ kind: /** @type {const} */ ("Parameter"), location: parameterLocation,
|
|
1625
|
+
name: parameterName, type }, { name: nodeLocation(nameNode, filename, source) });
|
|
1626
|
+
});
|
|
1627
|
+
const returnType = convertReturnType(node.type, `Interface method '${name}' return`, location, filename, source, nominalNames);
|
|
1628
|
+
if (returnType.kind == "OptionalType")
|
|
1629
|
+
return unsupportedSyntax("php", "optional interface method return", location);
|
|
1630
|
+
const nameNode = typeof node.name == "string" ? node : node.name;
|
|
1631
|
+
return withParserRanges({ kind: /** @type {const} */ ("InterfaceMethodDeclaration"), location, name, parameters, returnType }, { name: nodeLocation(nameNode, filename, source) });
|
|
1632
|
+
}
|
|
1493
1633
|
/**
|
|
1494
1634
|
* Converts the bounded final/private-field PHP reference-class profile.
|
|
1495
1635
|
* @param {import("php-parser").Class} node - Parser class.
|
|
1496
1636
|
* @param {import("../semantic/types.js").ClassDeclaration} declaration - Predeclared class identity.
|
|
1497
|
-
* @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration>} nominalNames - Visible nominal declarations.
|
|
1637
|
+
* @param {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} nominalNames - Visible nominal declarations.
|
|
1498
1638
|
* @param {Map<string, import("../semantic/types.js").RecordDeclaration>} records - Records by identity.
|
|
1499
1639
|
* @param {Map<string, import("../semantic/types.js").ClassDeclaration>} classes - Classes by identity.
|
|
1640
|
+
* @param {Map<string, import("../semantic/types.js").InterfaceDeclaration>} interfaces - Interfaces by identity.
|
|
1500
1641
|
* @param {Map<string, PhpFunctionSignature>} functions - Top-level signatures.
|
|
1501
1642
|
* @param {Map<string, import("../semantic/types.js").ErrorDeclaration>} errorNames - Errors by name.
|
|
1502
1643
|
* @param {Map<string, import("../semantic/types.js").ErrorDeclaration>} errors - Errors by identity.
|
|
@@ -1504,11 +1645,23 @@ function convertPhpClassCallableSignature(node, nominalNames, ownerId, construct
|
|
|
1504
1645
|
* @param {string} source - Complete source.
|
|
1505
1646
|
* @returns {import("../semantic/types.js").ClassDeclaration} Semantic class.
|
|
1506
1647
|
*/
|
|
1507
|
-
function convertPhpReferenceClass(node, declaration, nominalNames, records, classes, functions, errorNames, errors, filename, source) {
|
|
1648
|
+
function convertPhpReferenceClass(node, declaration, nominalNames, records, classes, interfaces, functions, errorNames, errors, filename, source) {
|
|
1508
1649
|
const location = nodeLocation(node, filename, source);
|
|
1509
|
-
if (node.isAnonymous || !node.isFinal || node.isReadonly || node.isAbstract || node.extends || node.
|
|
1510
|
-
node.attrGroups.length)
|
|
1650
|
+
if (node.isAnonymous || !node.isFinal || node.isReadonly || node.isAbstract || node.extends || node.attrGroups.length) {
|
|
1511
1651
|
return unsupportedSyntax("php", "reference class inheritance or noncanonical modifier", location);
|
|
1652
|
+
}
|
|
1653
|
+
const implementedReferences = /** @type {readonly import("php-parser").Name[]} */ ( /** @type {unknown} */(node.implements ?? []))
|
|
1654
|
+
.map((implemented) => {
|
|
1655
|
+
const implementedLocation = nodeLocation(implemented, filename, source);
|
|
1656
|
+
if (implemented.kind != "name" || implemented.resolution != "uqn" || typeof implemented.name != "string") {
|
|
1657
|
+
return unsupportedSyntax("php", "qualified or dynamic interface implementation", implementedLocation);
|
|
1658
|
+
}
|
|
1659
|
+
const implementedDeclaration = nominalNames.get(implemented.name);
|
|
1660
|
+
if (!implementedDeclaration?.id || implementedDeclaration.kind != "InterfaceDeclaration") {
|
|
1661
|
+
return unsupportedSyntax("php", `implemented interface '${implemented.name}' is not a declared interface`, implementedLocation);
|
|
1662
|
+
}
|
|
1663
|
+
return interfaceType(/** @type {string} */ (implementedDeclaration.id), implementedLocation);
|
|
1664
|
+
});
|
|
1512
1665
|
const fieldStatements = node.body.filter((member) => member.kind == "propertystatement");
|
|
1513
1666
|
const methodNodes = /** @type {import("php-parser").Method[]} */ (node.body.filter((member) => member.kind == "method"));
|
|
1514
1667
|
const constructors = methodNodes.filter((method) => (typeof method.name == "string" ? method.name : method.name.name) == "__construct");
|
|
@@ -1543,8 +1696,10 @@ function convertPhpReferenceClass(node, declaration, nominalNames, records, clas
|
|
|
1543
1696
|
parameters: signature.parameters,
|
|
1544
1697
|
returnType: /** @type {import("../semantic/types.js").SemanticFunctionReturnType} */ (signature.returnType)
|
|
1545
1698
|
}, { name: signature.nameLocation }));
|
|
1699
|
+
if (implementedReferences.length > 0)
|
|
1700
|
+
declaration.implements = implementedReferences;
|
|
1546
1701
|
const base = { bindings: new Map(), classes, currentClass: declaration, errorNames, errors, functions,
|
|
1547
|
-
recordNames: nominalNames, records };
|
|
1702
|
+
interfaces, recordNames: nominalNames, records };
|
|
1548
1703
|
declaration.constructor.body = convertBlock(/** @type {import("php-parser").Block} */ (constructorNode.body), filename, source, { ...base, bindings: new Map(declaration.constructor.parameters.map((parameter) => [parameter.name, parameter.type])),
|
|
1549
1704
|
returnType: { kind: /** @type {const} */ ("TypeReference"), name: /** @type {const} */ ("void") } });
|
|
1550
1705
|
for (let index = 0; index < ordinaryMethods.length; index += 1) {
|
|
@@ -1769,6 +1924,7 @@ export function parsePhp({ capabilities = [], filename, source, program: program
|
|
|
1769
1924
|
const namespace = /** @type {import("php-parser").Namespace} */ (body.find((node) => node.kind == "namespace"));
|
|
1770
1925
|
body = namespace.children.filter((node) => node.kind != "usegroup" && !isPhpRequireOnce(node));
|
|
1771
1926
|
}
|
|
1927
|
+
const interfaceNodes = /** @type {import("php-parser").Class[]} */ (body.filter((node) => node.kind == "interface"));
|
|
1772
1928
|
const classNodes = /** @type {import("php-parser").Class[]} */ (body.filter((node) => node.kind == "class"));
|
|
1773
1929
|
const errorNodes = classNodes.filter((node) => node.extends?.kind == "name" &&
|
|
1774
1930
|
["RuntimeException", "\\RuntimeException"].includes(node.extends.name));
|
|
@@ -1799,7 +1955,12 @@ export function parsePhp({ capabilities = [], filename, source, program: program
|
|
|
1799
1955
|
location: nodeLocation(node, filename, source), methods: [],
|
|
1800
1956
|
name: typeof node.name == "string" ? node.name : node.name.name
|
|
1801
1957
|
}));
|
|
1802
|
-
const
|
|
1958
|
+
const interfaceDeclarations = interfaceNodes.map((node, index) => ({
|
|
1959
|
+
id: `interface:${index}`, kind: /** @type {const} */ ("InterfaceDeclaration"),
|
|
1960
|
+
location: nodeLocation(node, filename, source), methods: [],
|
|
1961
|
+
name: typeof node.name == "string" ? node.name : node.name.name
|
|
1962
|
+
}));
|
|
1963
|
+
const recordNames = /** @type {Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>} */ (new Map(programContext?.records ?? []));
|
|
1803
1964
|
for (const resource of capabilities.flatMap(({ resources }) => resources))
|
|
1804
1965
|
recordNames.set(resource.name, resource);
|
|
1805
1966
|
const errorNames = new Map(programContext?.errors ?? []);
|
|
@@ -1814,10 +1975,13 @@ export function parsePhp({ capabilities = [], filename, source, program: program
|
|
|
1814
1975
|
recordNames.set(declaration.name, declaration);
|
|
1815
1976
|
for (const declaration of classDeclarations)
|
|
1816
1977
|
recordNames.set(declaration.name, declaration);
|
|
1978
|
+
for (const declaration of interfaceDeclarations)
|
|
1979
|
+
recordNames.set(declaration.name, declaration);
|
|
1817
1980
|
const recordsById = new Map([...recordNames.values()]
|
|
1818
1981
|
.filter((declaration) => declaration.kind == "RecordDeclaration")
|
|
1819
1982
|
.map((declaration) => [/** @type {string} */ (declaration.id), declaration]));
|
|
1820
1983
|
const classesById = new Map(classDeclarations.map((declaration) => [/** @type {string} */ (declaration.id), declaration]));
|
|
1984
|
+
const interfacesById = new Map(interfaceDeclarations.map((declaration) => [/** @type {string} */ (declaration.id), declaration]));
|
|
1821
1985
|
const records = recordNodes.map((node, index) => convertPhpRecord(node, recordDeclarations[index],
|
|
1822
1986
|
/** @type {Map<string, import("../semantic/types.js").RecordDeclaration>} */ ( /** @type {unknown} */(recordNames)), filename, source));
|
|
1823
1987
|
const functionNodes = /** @type {import("php-parser").Function[]} */ (body.filter((node) => node.kind == "function"));
|
|
@@ -1833,9 +1997,10 @@ export function parsePhp({ capabilities = [], filename, source, program: program
|
|
|
1833
1997
|
}]));
|
|
1834
1998
|
for (const signature of signatures)
|
|
1835
1999
|
functionSignatures.set(signature.name, signature);
|
|
1836
|
-
const
|
|
1837
|
-
const
|
|
1838
|
-
const
|
|
2000
|
+
const interfaces = interfaceNodes.map((node, index) => convertPhpInterface(node, interfaceDeclarations[index], recordNames, filename, source));
|
|
2001
|
+
const classes = referenceClassNodes.map((node, index) => convertPhpReferenceClass(node, classDeclarations[index], recordNames, recordsById, classesById, interfacesById, functionSignatures, errorNames, errorsById, filename, source));
|
|
2002
|
+
const functions = functionNodes.map((node, index) => convertFunction(node, signatures[index], functionSignatures, recordNames, recordsById, classesById, interfacesById, errorNames, errorsById, filename, source));
|
|
2003
|
+
const executableNodes = body.filter((node) => !["class", "function", "interface", "declare", "noop"].includes(node.kind));
|
|
1839
2004
|
const location = moduleLocation(filename, source);
|
|
1840
2005
|
if (programContext && !programContext.isEntry && executableNodes.length > 0) {
|
|
1841
2006
|
return unsupportedSyntax("php", "top-level side effect outside the selected entry module", nodeLocation(executableNodes[0], filename, source));
|
|
@@ -1851,6 +2016,7 @@ export function parsePhp({ capabilities = [], filename, source, program: program
|
|
|
1851
2016
|
errorNames,
|
|
1852
2017
|
errors: errorsById,
|
|
1853
2018
|
functions: functionSignatures,
|
|
2019
|
+
interfaces: interfacesById,
|
|
1854
2020
|
orderedMapDeclarations: orderedMapDeclarationsForPhp(executableNodes),
|
|
1855
2021
|
recordNames,
|
|
1856
2022
|
records: recordsById,
|
|
@@ -1875,6 +2041,7 @@ export function parsePhp({ capabilities = [], filename, source, program: program
|
|
|
1875
2041
|
location,
|
|
1876
2042
|
...(errors.length > 0 ? { errors } : {}),
|
|
1877
2043
|
...(classes.length > 0 ? { classes } : {}),
|
|
2044
|
+
...(interfaces.length > 0 ? { interfaces } : {}),
|
|
1878
2045
|
...(records.length > 0 ? { records } : {})
|
|
1879
2046
|
};
|
|
1880
2047
|
}
|
|
@@ -2078,4 +2245,4 @@ function phpParserFailureLocation(error, filename, source) {
|
|
|
2078
2245
|
const offset = Math.min(lineStart + column, boundedEnd);
|
|
2079
2246
|
return locationFromOffsets(filename, source, offset, Math.min(offset + 1, source.length));
|
|
2080
2247
|
}
|
|
2081
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Zyb250ZW5kcy9waHAuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQTtBQUNsQyxPQUFPLEVBQUMsS0FBSyxJQUFJLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFBO0FBQ3BELE9BQU8sRUFBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDN0UsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDcEUsT0FBTyxFQUFDLG1CQUFtQixFQUFFLGNBQWMsRUFBQyxNQUFNLHlCQUF5QixDQUFBO0FBQzNFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDBCQUEwQixDQUFBO0FBQzdELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDJCQUEyQixDQUFBO0FBQzFELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLDZCQUE2QixDQUFBO0FBQ2xFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHdCQUF3QixDQUFBO0FBQzVELE9BQU8sRUFBQyxxQkFBcUIsRUFBRSxVQUFVLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUN4RSxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUMvRCxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsdUJBQXVCLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDL0YsT0FBTyxFQUFDLDRCQUE0QixFQUFFLG1CQUFtQixFQUFFLDJCQUEyQixFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLHVCQUF1QixFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSxnQ0FBZ0MsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBQyxNQUFNLFlB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S0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQ2hELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBRS9DLElBQUksT0FBTyxHQUFHLENBQUM7WUFBRSxPQUFPLGNBQWMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDeEQsU0FBUyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUE7SUFDekIsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQy9DLE1BQU0sVUFBVSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQTtJQUN4RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFFdkQsT0FBTyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7QUFDM0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgUGhwUGFyc2VyIGZyb20gXCJwaHAtcGFyc2VyXCJcbmltcG9ydCB7cGFyc2UgYXMgcGFyc2VDb21tZW50fSBmcm9tIFwiY29tbWVudC1wYXJzZXJcIlxuaW1wb3J0IHttaXNzaW5nVHlwZSwgcGFyc2VGYWlsdXJlLCB1bnN1cHBvcnRlZFN5bnRheH0gZnJvbSBcIi4uL2RpYWdub3N0aWMuanNcIlxuaW1wb3J0IHtibG9ja1JlZmVyZW5jZXNQcm90ZWN0ZWRFbnRyeX0gZnJvbSBcIi4uL3NlbWFudGljL2VmZmVjdHMuanNcIlxuaW1wb3J0IHtsb2NhdGlvbkZyb21PZmZzZXRzLCBtb2R1bGVMb2NhdGlvbn0gZnJvbSBcIi4uL3NlbWFudGljL2xvY2F0aW9uLmpzXCJcbmltcG9ydCB7d2l0aEFkYXB0ZWRPcGVyYXRpb259IGZyb20gXCIuLi9zZW1hbnRpYy9vcGVyYXRvcnMuanNcIlxuaW1wb3J0IHt3aXRoUGFyc2VyUmFuZ2VzfSBmcm9tIFwiLi4vc2VtYW50aWMvcHJvdmVuYW5jZS5qc1wiXG5pbXBvcnQge2lzVGFzazAzNFJlc291cmNlUHJvYmV9IGZyb20gXCIuLi9zZW1hbnRpYy9jYXBhYmlsaXRpZXMuanNcIlxuaW1wb3J0IHtoYXNFeGFjdEVmZmVjdFN1cHBvcnR9IGZyb20gXCIuLi9iYWNrZW5kcy9lZmZlY3RzLmpzXCJcbmltcG9ydCB7aGFzT25seVVuaWNvZGVTY2FsYXJzLCBzY2FsYXJUeXBlfSBmcm9tIFwiLi4vc2VtYW50aWMvc2NhbGFycy5qc1wiXG5pbXBvcnQge3R5cGVDb250YWluc0FueVZhcmlhYmxlfSBmcm9tIFwiLi4vc2VtYW50aWMvZ2VuZXJpY3MuanNcIlxuaW1wb3J0IHtyZXF1aXJlU291cmNlUmV0dXJuVHlwZSwgcmVxdWlyZVNvdXJjZVNjYWxhclR5cGUsIHNvdXJjZVNjYWxhclR5cGV9IGZyb20gXCIuL3NjYWxhcnMuanNcIlxuaW1wb3J0IHtjYXBhYmlsaXR5RnVuY3Rpb25TaWduYXR1cmVzLCBkb2N1bWVudGVkVmFsdWVUeXBlLCBpbnN0YW50aWF0ZWRSZWNvcmRGaWVsZFR5cGUsIGl0ZXJhdGlvbkJpbmRpbmdUeXBlLCBpdGVyYXRpb25PcGVyYW5kVHlwZSwga25vd25DYWxsUGFyYW1ldGVyVHlwZXMsIGtub3duQ2FsbFJldHVyblR5cGUsIG9wdGlvbmFsVHlwZSwgb3JkZXJlZE1hcFR5cGVGcm9tTWFwLCBvd25lZFJlc291cmNlVHlwZSwgcHJlc2VydmVzR2VuZXJpY09wdGlvbmFsRXZpZGVuY2UsIHJlY29yZFR5cGUsIHJlZmVyZW5jZVR5cGUsIHNhbWVWYWx1ZVR5cGV9IGZyb20gXCIuL3R5cGVzLmpzXCJcbmNvbnN0IHBhcnNlciA9IG5ldyBQaHBQYXJzZXIuRW5naW5lKHtcbiAgYXN0OiB7d2l0aFBvc2l0aW9uczogdHJ1ZX0sXG4gIHBhcnNlcjoge2V4dHJhY3REb2M6IHRydWUsIHN1cHByZXNzRXJyb3JzOiBmYWxzZX1cbn0pXG4vKiogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi9cbmxldCBjYWNoZWRUb2tlblNvdXJjZVxuLyoqIEB0eXBlIHt7ZW5kOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIHRleHQ6IHN0cmluZ31bXX0gKi9cbmxldCBjYWNoZWRUb2tlblJhbmdlcyA9IFtdXG5jb25zdCBwaHBCaW5hcnlPcGVyYXRpb25zID0gbmV3IE1hcChbXG4gIFtcIitcIiwgXCJQaHBBZGRcIl0sXG4gIFtcIi1cIiwgXCJTdWJ0cmFjdFwiXSxcbiAgW1wiKlwiLCBcIk11bHRpcGx5XCJdLFxuICBbXCImJlwiLCBcIkFuZFwiXSxcbiAgW1wifHxcIiwgXCJPclwiXSxcbiAgW1wiPT09XCIsIFwiRXF1YWxcIl0sXG4gIFtcIiE9PVwiLCBcIk5vdEVxdWFsXCJdLFxuICBbXCI8XCIsIFwiTGVzc1RoYW5cIl0sXG4gIFtcIjw9XCIsIFwiTGVzc1RoYW5PckVxdWFsXCJdLFxuICBbXCI+XCIsIFwiR3JlYXRlclRoYW5cIl0sXG4gIFtcIj49XCIsIFwiR3JlYXRlclRoYW5PckVxdWFsXCJdLFxuICBbXCIuXCIsIFwiU3RyaW5nQ29uY2F0XCJdXG5dKVxuXG4vKipcbiAqIEB0eXBlZGVmIFBocENvbnZlcnNpb25Db250ZXh0XG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljQmluZGluZ1R5cGU+fSBiaW5kaW5ncyAtIEV4cGxpY2l0bHkgdHlwZWQgdmlzaWJsZSBiaW5kaW5ncy5cbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbj59IGNsYXNzZXMgLSBSZWZlcmVuY2UgY2xhc3NlcyBieSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbn0gW2N1cnJlbnRDbGFzc10gLSBFbmNsb3NpbmcgcmVmZXJlbmNlIGNsYXNzLlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9uPn0gZXJyb3JOYW1lcyAtIEVycm9yIGRlY2xhcmF0aW9ucyBieSBzb3VyY2UgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj59IGVycm9ycyAtIEVycm9yIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgUGhwRnVuY3Rpb25TaWduYXR1cmU+fSBmdW5jdGlvbnMgLSBFeHBsaWNpdCBtb2R1bGUgZnVuY3Rpb24gc2lnbmF0dXJlcy5cbiAqIEBwcm9wZXJ0eSB7U2V0PG9iamVjdD59IFtvcmRlcmVkTWFwRGVjbGFyYXRpb25zXSAtIEV4YWN0IGxvY2FsIGRlY2xhcmF0aW9ucyBzZWxlY3RlZCBieSBwYXJzZXItb3duZWQgcGFpciBpdGVyYXRpb24uXG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb24+fSByZWNvcmROYW1lcyAtIE5vbWluYWwgZGVjbGFyYXRpb25zIGJ5IHNvdXJjZSBuYW1lLlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj59IHJlY29yZHMgLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZSB8IHVuZGVmaW5lZH0gcmV0dXJuVHlwZSAtIEVuY2xvc2luZyByZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuVHlwZVBhcmFtZXRlcj59IFt0eXBlUGFyYW1ldGVyc10gLSBEZWNsYXJhdGlvbi1zY29wZWQgcGFyYW1ldGVycy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFBocEZ1bmN0aW9uU2lnbmF0dXJlXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGRlY2xhcmF0aW9uIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbmFtZUxvY2F0aW9uIC0gUGFyc2VyLW93bmVkIG5hbWUgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEZ1bmN0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlBhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gU2VtYW50aWMgcGFyYW1ldGVycy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHJldHVyblR5cGUgLSBTZW1hbnRpYyByZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuVHlwZVBhcmFtZXRlcltdfSBbdHlwZVBhcmFtZXRlcnNdIC0gRGVjbGFyYXRpb24tc2NvcGVkIHBhcmFtZXRlcnMuXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgbm9ybWFsaXplZCBQSFAgbm9kZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Ob2RlfSBub2RlIC0gUEhQIHBhcnNlciBub2RlLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gU291cmNlIGxvY2F0aW9uLlxuICovXG5mdW5jdGlvbiBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBpZiAoIW5vZGUubG9jKSB0aHJvdyBuZXcgRXJyb3IoYFBIUCBwYXJzZXIgb21pdHRlZCBzb3VyY2UgbG9jYXRpb24gZm9yICR7bm9kZS5raW5kfS5gKVxuXG4gIHJldHVybiBsb2NhdGlvbkZyb21PZmZzZXRzKGZpbGVuYW1lLCBzb3VyY2UsIG5vZGUubG9jLnN0YXJ0Lm9mZnNldCwgbm9kZS5sb2MuZW5kLm9mZnNldClcbn1cblxuLyoqXG4gKiBMb2NhdGVzIGEgY29tbWVudC1wYXJzZXIgdG9rZW4gaW5zaWRlIGEgUEhQIHBhcnNlci1vd25lZCBkb2MgY29tbWVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Db21tZW50QmxvY2t9IGNvbW1lbnQgLSBQSFAgZG9jIGNvbW1lbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcImNvbW1lbnQtcGFyc2VyXCIpLlNwZWN9IHRhZyAtIFBhcnNlZCBkb2MgdGFnLlxuICogQHBhcmFtIHtcIm5hbWVcIiB8IFwidHlwZVwifSBmaWVsZCAtIFRva2VuIGZpZWxkLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gRXhhY3QgdG9rZW4gbG9jYXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNvbW1lbnRUYWdMb2NhdGlvbihjb21tZW50LCB0YWcsIGZpZWxkLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGxpbmUgPSB0YWcuc291cmNlWzBdXG5cbiAgaWYgKCFjb21tZW50LmxvYyB8fCAhbGluZSkgdGhyb3cgbmV3IEVycm9yKGBDb21tZW50IHBhcnNlciBvbWl0dGVkIHRoZSBAJHt0YWcudGFnfSBzb3VyY2UgdG9rZW4uYClcblxuICBsZXQgbGluZVN0YXJ0ID0gY29tbWVudC5sb2Muc3RhcnQub2Zmc2V0XG5cbiAgZm9yIChsZXQgbGluZU51bWJlciA9IDA7IGxpbmVOdW1iZXIgPCBsaW5lLm51bWJlcjsgbGluZU51bWJlcisrKSB7XG4gICAgd2hpbGUgKGxpbmVTdGFydCA8IHNvdXJjZS5sZW5ndGggJiYgc291cmNlW2xpbmVTdGFydF0gIT0gXCJcXHJcIiAmJiBzb3VyY2VbbGluZVN0YXJ0XSAhPSBcIlxcblwiKSBsaW5lU3RhcnQrK1xuICAgIGlmIChzb3VyY2VbbGluZVN0YXJ0XSA9PSBcIlxcclwiICYmIHNvdXJjZVtsaW5lU3RhcnQgKyAxXSA9PSBcIlxcblwiKSBsaW5lU3RhcnQgKz0gMlxuICAgIGVsc2UgbGluZVN0YXJ0KytcbiAgfVxuXG4gIGNvbnN0IG9yZGVyZWRGaWVsZHMgPSBbXCJzdGFydFwiLCBcImRlbGltaXRlclwiLCBcInBvc3REZWxpbWl0ZXJcIiwgXCJ0YWdcIiwgXCJwb3N0VGFnXCIsIFwibmFtZVwiLCBcInBvc3ROYW1lXCIsIFwidHlwZVwiXVxuICBjb25zdCBmaWVsZEluZGV4ID0gb3JkZXJlZEZpZWxkcy5pbmRleE9mKGZpZWxkKVxuICBjb25zdCBzdGFydCA9IGxpbmVTdGFydCArIG9yZGVyZWRGaWVsZHMuc2xpY2UoMCwgZmllbGRJbmRleCkucmVkdWNlKChsZW5ndGgsIGtleSkgPT5cbiAgICBsZW5ndGggKyBsaW5lLnRva2Vuc1svKiogQHR5cGUge2tleW9mIHR5cGVvZiBsaW5lLnRva2Vuc30gKi8gKGtleSldLmxlbmd0aCwgMClcbiAgY29uc3QgdmFsdWUgPSBsaW5lLnRva2Vuc1tmaWVsZF1cblxuICByZXR1cm4gbG9jYXRpb25Gcm9tT2Zmc2V0cyhmaWxlbmFtZSwgc291cmNlLCBzdGFydCwgc3RhcnQgKyB2YWx1ZS5sZW5ndGgpXG59XG5cbi8qKlxuICogRmluZHMgb25lIHBhcnNlciB0b2tlbiBiZXR3ZWVuIHBhcnNlci1vd25lZCBub2RlIGJvdW5kYXJpZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5UZXh0IC0gRXhhY3QgdG9rZW4gdGV4dC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydE9mZnNldCAtIEluY2x1c2l2ZSBzZWFyY2ggYm91bmRhcnkuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kT2Zmc2V0IC0gRXhjbHVzaXZlIHNlYXJjaCBib3VuZGFyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IFRva2VuIGxvY2F0aW9uLlxuICovXG5mdW5jdGlvbiB0b2tlbkxvY2F0aW9uKHRva2VuVGV4dCwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBpZiAoY2FjaGVkVG9rZW5Tb3VyY2UgIT0gc291cmNlKSB7XG4gICAgbGV0IG9mZnNldCA9IDBcblxuICAgIGNhY2hlZFRva2VuUmFuZ2VzID0gcGFyc2VyLnRva2VuR2V0QWxsKHNvdXJjZSkubWFwKCh0b2tlbikgPT4ge1xuICAgICAgY29uc3QgdGV4dCA9IHR5cGVvZiB0b2tlbiA9PSBcInN0cmluZ1wiID8gdG9rZW4gOiB0b2tlblsxXVxuICAgICAgY29uc3QgcmFuZ2UgPSB7ZW5kOiBvZmZzZXQgKyB0ZXh0Lmxlbmd0aCwgc3RhcnQ6IG9mZnNldCwgdGV4dH1cblxuICAgICAgb2Zmc2V0ID0gcmFuZ2UuZW5kXG5cbiAgICAgIHJldHVybiByYW5nZVxuICAgIH0pXG4gICAgY2FjaGVkVG9rZW5Tb3VyY2UgPSBzb3VyY2VcbiAgfVxuXG4gIGNvbnN0IHRva2VuID0gY2FjaGVkVG9rZW5SYW5nZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUudGV4dCA9PSB0b2tlblRleHQgJiYgY2FuZGlkYXRlLnN0YXJ0ID49IHN0YXJ0T2Zmc2V0ICYmXG4gICAgY2FuZGlkYXRlLmVuZCA8PSBlbmRPZmZzZXQpXG5cbiAgaWYgKHRva2VuKSByZXR1cm4gbG9jYXRpb25Gcm9tT2Zmc2V0cyhmaWxlbmFtZSwgc291cmNlLCB0b2tlbi5zdGFydCwgdG9rZW4uZW5kKVxuXG4gIHRocm93IG5ldyBFcnJvcihgUEhQIHBhcnNlciBvbWl0dGVkIHRva2VuICcke3Rva2VuVGV4dH0nIGJldHdlZW4gJHtzdGFydE9mZnNldH0gYW5kICR7ZW5kT2Zmc2V0fS5gKVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc3VwcG9ydGVkIFBIUCBleHByZXNzaW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkV4cHJlc3Npb259IG5vZGUgLSBQSFAgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge1BocENvbnZlcnNpb25Db250ZXh0fSBjb250ZXh0IC0gVHlwZWQgY29udmVyc2lvbiBjb250ZXh0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gW2V4cGVjdGVkVHlwZV0gLSBDb250ZXh0dWFsIHR5cGUgZm9yIGVtcHR5IFBIUCBhcnJheXMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVzZXJ2ZU9wdGlvbmFsXSAtIFdoZXRoZXIgYW4gb3B0aW9uYWwgaWRlbnRpZmllciByZW1haW5zIHdyYXBwZWQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gU2VtYW50aWMgZXhwcmVzc2lvbi5cbiAqL1xuZnVuY3Rpb24gY29udmVydEV4cHJlc3Npb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCwgZXhwZWN0ZWRUeXBlLCBwcmVzZXJ2ZU9wdGlvbmFsID0gZmFsc2UpIHtcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBpZiAoZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICBpZiAobm9kZS5raW5kID09IFwibnVsbGtleXdvcmRcIikge1xuICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIk9wdGlvbmFsTm9uZVwiKSwgbG9jYXRpb259LCB7YWJzZW5jZTogbG9jYXRpb259KVxuICAgIH1cbiAgICBpZiAoa25vd25FeHByZXNzaW9uVHlwZShub2RlLCBjb250ZXh0KT8ua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgICByZXR1cm4gY29udmVydEV4cHJlc3Npb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCwgdW5kZWZpbmVkLCB0cnVlKVxuICAgIH1cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJPcHRpb25hbFNvbWVcIiksXG4gICAgICBsb2NhdGlvbixcbiAgICAgIHZhbHVlOiBjb252ZXJ0RXhwcmVzc2lvbihub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCBleHBlY3RlZFR5cGUudmFsdWVUeXBlKVxuICAgIH0sIHtzb21lOiBsb2NhdGlvbn0pXG4gIH1cblxuICBpZiAobm9kZS5raW5kID09IFwibnVsbGtleXdvcmRcIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibnVsbCBvdXRzaWRlIGFuIGV4cGxpY2l0IG9wdGlvbmFsIGNvbnRleHRcIiwgbG9jYXRpb24pXG5cbiAgaWYgKG5vZGUua2luZCA9PSBcInZhcmlhYmxlXCIpIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5WYXJpYWJsZX0gKi8gKG5vZGUpXG5cbiAgICBpZiAodHlwZW9mIHZhcmlhYmxlLm5hbWUgIT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZHluYW1pYyB2YXJpYWJsZVwiLCBsb2NhdGlvbilcbiAgICBpZiAodmFyaWFibGUubmFtZSA9PSBcInRoaXNcIikge1xuICAgICAgaWYgKCFjb250ZXh0LmN1cnJlbnRDbGFzcykgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwicmVjZWl2ZXIgb3V0c2lkZSBhIHJlZmVyZW5jZSBjbGFzc1wiLCBsb2NhdGlvbilcbiAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtjbGFzc0lkOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGNvbnRleHQuY3VycmVudENsYXNzLmlkKSxcbiAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUmVjZWl2ZXJFeHByZXNzaW9uXCIpLCBsb2NhdGlvbn0sIHtyZWNlaXZlcjogbG9jYXRpb259KVxuICAgIH1cblxuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSwgbG9jYXRpb24sIG5hbWU6IHZhcmlhYmxlLm5hbWV9LCB7bmFtZTogbG9jYXRpb259KVxuXG4gICAgaWYgKCFwcmVzZXJ2ZU9wdGlvbmFsICYmIGNvbnRleHQuYmluZGluZ3MuZ2V0KHZhcmlhYmxlLm5hbWUpPy5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJPcHRpb25hbFVud3JhcFwiKSwgbG9jYXRpb24sIG9wZXJhbmQ6IGlkZW50aWZpZXJ9LCB7dW53cmFwOiBsb2NhdGlvbn0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGlkZW50aWZpZXJcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJudW1iZXJcIikge1xuICAgIGNvbnN0IGxpdGVyYWwgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTnVtYmVyfSAqLyAobm9kZSlcbiAgICBjb25zdCB2YWx1ZSA9IE51bWJlcihsaXRlcmFsLnZhbHVlKVxuXG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm5vbi1zYWZlIGludGVnZXIgbGl0ZXJhbFwiLCBsb2NhdGlvbilcblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJJbnRlZ2VyTGl0ZXJhbFwiKSwgbG9jYXRpb24sIHZhbHVlfSwge2xpdGVyYWw6IGxvY2F0aW9ufSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJib29sZWFuXCIpIHtcbiAgICBjb25zdCBsaXRlcmFsID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJvb2xlYW59ICovIChub2RlKVxuXG4gICAgaWYgKHR5cGVvZiBsaXRlcmFsLnZhbHVlICE9IFwiYm9vbGVhblwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJpbnZhbGlkIGJvb2xlYW4gbGl0ZXJhbCB2YWx1ZVwiLCBsb2NhdGlvbilcblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJCb29sZWFuTGl0ZXJhbFwiKSwgbG9jYXRpb24sIHZhbHVlOiBsaXRlcmFsLnZhbHVlfSwge2xpdGVyYWw6IGxvY2F0aW9ufSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IGxpdGVyYWwgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuU3RyaW5nfSAqLyAobm9kZSlcblxuICAgIGlmICh0eXBlb2YgbGl0ZXJhbC5yYXcgPT0gXCJzdHJpbmdcIiAmJiBsaXRlcmFsLnJhdy5zdGFydHNXaXRoKFwiPDw8XCIpKSB7XG4gICAgICBjb25zdCBkZXRhaWwgPSBsaXRlcmFsLnJhdy5zdGFydHNXaXRoKFwiPDw8J1wiKSA/IFwibm93ZG9jIHN0cmluZ1wiIDogXCJoZXJlZG9jIHN0cmluZ1wiXG5cbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBkZXRhaWwsIGxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGxpdGVyYWwucmF3ID09IFwic3RyaW5nXCIgJiYgW1wiYlxcXCJcIiwgXCJCXFxcIlwiLCBcImInXCIsIFwiQidcIl0uc29tZSgocHJlZml4KSA9PiBsaXRlcmFsLnJhdy5zdGFydHNXaXRoKHByZWZpeCkpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJiaW5hcnkgc3RyaW5nIGxpdGVyYWxcIiwgbG9jYXRpb24pXG4gICAgfVxuICAgIGlmICh0eXBlb2YgbGl0ZXJhbC52YWx1ZSAhPSBcInN0cmluZ1wiIHx8ICFoYXNPbmx5VW5pY29kZVNjYWxhcnMobGl0ZXJhbC52YWx1ZSkpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImludmFsaWQgVW5pY29kZSBzdHJpbmcgbGl0ZXJhbFwiLCBsb2NhdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiU3RyaW5nTGl0ZXJhbFwiKSwgbG9jYXRpb24sIHZhbHVlOiBsaXRlcmFsLnZhbHVlfSwge2xpdGVyYWw6IGxvY2F0aW9ufSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJlbmNhcHNlZFwiKSB7XG4gICAgY29uc3QgbGl0ZXJhbCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5FbmNhcHNlZH0gKi8gKG5vZGUpXG5cbiAgICBpZiAobGl0ZXJhbC50eXBlICE9IFwic3RyaW5nXCIpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBgJHtsaXRlcmFsLnR5cGV9IHN0cmluZ2AsIGxvY2F0aW9uKVxuICAgIGlmICghQXJyYXkuaXNBcnJheShsaXRlcmFsLnZhbHVlKSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiaW50ZXJwb2xhdGVkIHN0cmluZ1wiLCBsb2NhdGlvbilcblxuICAgIGNvbnN0IHBhcnRzID0gbGl0ZXJhbC52YWx1ZS5tYXAoKHBhcnQpID0+IHtcbiAgICAgIGlmIChwYXJ0LmtpbmQgIT0gXCJlbmNhcHNlZHBhcnRcIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIGBpbnRlcnBvbGF0ZWQgc3RyaW5nIHBhcnQgJHtwYXJ0LmtpbmR9YCwgbm9kZUxvY2F0aW9uKHBhcnQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgICAgY29uc3QgZW5jYXBzZWRQYXJ0ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkVuY2Fwc2VkUGFydH0gKi8gKHBhcnQpXG5cbiAgICAgIGlmICghZW5jYXBzZWRQYXJ0LmV4cHJlc3Npb24pIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImludGVycG9sYXRlZCBzdHJpbmcgcGFydCB3aXRob3V0IGV4cHJlc3Npb25cIiwgbm9kZUxvY2F0aW9uKGVuY2Fwc2VkUGFydCwgZmlsZW5hbWUsIHNvdXJjZSkpXG5cbiAgICAgIHJldHVybiBjb252ZXJ0RXhwcmVzc2lvbihlbmNhcHNlZFBhcnQuZXhwcmVzc2lvbiwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCwgc2NhbGFyVHlwZShcInN0cmluZ1wiKSlcbiAgICB9KVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiU3RyaW5nTGl0ZXJhbFwiKSwgbG9jYXRpb24sIHZhbHVlOiBcIlwifSwge2xpdGVyYWw6IGxvY2F0aW9ufSlcbiAgICB9XG5cbiAgICBsZXQgbG93ZXJlZCA9IHBhcnRzWzBdXG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMuc2xpY2UoMSkpIHtcbiAgICAgIGNvbnN0IHNlbWFudGljID0gd2l0aEFkYXB0ZWRPcGVyYXRpb24oe1xuICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJCaW5hcnlFeHByZXNzaW9uXCIpLFxuICAgICAgICBsZWZ0OiBsb3dlcmVkLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgcmlnaHQ6IHBhcnRcbiAgICAgIH0sIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvb3BlcmF0b3JzLmpzXCIpLkFkYXB0ZWRPcGVyYXRpb259ICovIChcIlN0cmluZ0NvbmNhdFwiKSlcblxuICAgICAgbG93ZXJlZCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHNlbWFudGljKSlcbiAgICB9XG5cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyhsb3dlcmVkLCB7bGl0ZXJhbDogbG9jYXRpb259KVxuICB9XG5cbiAgaWYgKG5vZGUua2luZCA9PSBcIm5vd2RvY1wiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub3dkb2Mgc3RyaW5nXCIsIGxvY2F0aW9uKVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJhcnJheVwiKSB7XG4gICAgY29uc3QgbGl0ZXJhbCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5BcnJheX0gKi8gKG5vZGUpXG4gICAgY29uc3QgaW52YWxpZEVudHJ5ID0gbGl0ZXJhbC5pdGVtcy5maW5kKChlbnRyeSkgPT4ge1xuICAgICAgaWYgKGVudHJ5LmtpbmQgIT0gXCJlbnRyeVwiKSByZXR1cm4gdHJ1ZVxuICAgICAgY29uc3QgY2FuZGlkYXRlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkVudHJ5fSAqLyAoZW50cnkpXG5cbiAgICAgIHJldHVybiBjYW5kaWRhdGUuYnlSZWYgfHwgY2FuZGlkYXRlLnVucGFja1xuICAgIH0pXG5cbiAgICBpZiAoaW52YWxpZEVudHJ5KSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJhcnJheSByZWZlcmVuY2Ugb3IgdW5wYWNraW5nXCIsIG5vZGVMb2NhdGlvbihpbnZhbGlkRW50cnksIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIGNvbnN0IGVudHJpZXMgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRW50cnlbXX0gKi8gKGxpdGVyYWwuaXRlbXMpXG4gICAgY29uc3QgaGFzS2V5cyA9IGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5LmtleSAhPSBudWxsKVxuICAgIGNvbnN0IGhhc0ltcGxpY2l0ID0gZW50cmllcy5zb21lKChlbnRyeSkgPT4gZW50cnkua2V5ID09IG51bGwpXG4gICAgY29uc3QgY29sbGVjdGlvbktpbmQgPSBlbnRyaWVzLmxlbmd0aCA9PSAwID8gZXhwZWN0ZWRUeXBlPy5raW5kIDogaGFzS2V5cyAmJiAhaGFzSW1wbGljaXRcbiAgICAgID8gZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIiA/IFwiT3JkZXJlZE1hcFR5cGVcIiA6IFwiTWFwVHlwZVwiXG4gICAgICA6ICFoYXNLZXlzID8gXCJMaXN0VHlwZVwiIDogXCJtaXhlZFwiXG5cbiAgICBpZiAoY29sbGVjdGlvbktpbmQgPT0gXCJtaXhlZFwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJtaXhlZCBsaXN0L21hcCBhcnJheSBsaXRlcmFsXCIsIGxvY2F0aW9uKVxuICAgIGlmIChjb2xsZWN0aW9uS2luZCA9PSBcIkxpc3RUeXBlXCIpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiTGlzdFR5cGVcIiA/IGV4cGVjdGVkVHlwZS5lbGVtZW50VHlwZSA6IHVuZGVmaW5lZFxuXG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICAgIGVsZW1lbnRzOiBlbnRyaWVzLm1hcCgoZW50cnkpID0+IGNvbnZlcnRFeHByZXNzaW9uKGVudHJ5LnZhbHVlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCBlbGVtZW50VHlwZSkpLFxuICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJMaXN0TGl0ZXJhbFwiKSxcbiAgICAgICAgbG9jYXRpb25cbiAgICAgIH0sIHtsaXRlcmFsOiBsb2NhdGlvbn0pXG4gICAgfVxuICAgIGlmIChjb2xsZWN0aW9uS2luZCA9PSBcIk1hcFR5cGVcIiB8fCBjb2xsZWN0aW9uS2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IGV4cGVjdGVkVHlwZT8ua2luZCA9PSBcIk1hcFR5cGVcIiB8fCBleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiXG4gICAgICAgID8gZXhwZWN0ZWRUeXBlLnZhbHVlVHlwZSA6IHVuZGVmaW5lZFxuICAgICAgY29uc3Qgc2VtYW50aWNFbnRyaWVzID0gZW50cmllcy5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICAgIGlmICghZW50cnkua2V5IHx8IGVudHJ5LmtleS5raW5kICE9IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJtYXAga2V5IG90aGVyIHRoYW4gYSBsaXRlcmFsIHN0cmluZ1wiLCBlbnRyeS5rZXkgPyBub2RlTG9jYXRpb24oZW50cnkua2V5LCBmaWxlbmFtZSwgc291cmNlKSA6IG5vZGVMb2NhdGlvbihlbnRyeSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gY29udmVydEV4cHJlc3Npb24oZW50cnkua2V5LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KVxuXG4gICAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgICAgICBrZXk6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU3RyaW5nTGl0ZXJhbH0gKi8gKGtleSksXG4gICAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiTWFwRW50cnlcIiksXG4gICAgICAgICAgbG9jYXRpb246IG5vZGVMb2NhdGlvbihlbnRyeSwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgICAgICAgdmFsdWU6IGNvbnZlcnRFeHByZXNzaW9uKGVudHJ5LnZhbHVlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCB2YWx1ZVR5cGUpXG4gICAgICAgIH0sIHtvcGVyYXRvcjogdG9rZW5Mb2NhdGlvbihcIj0+XCIsIGVudHJ5LmtleS5sb2M/LmVuZC5vZmZzZXQgPz8gMCwgZW50cnkudmFsdWUubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgICBlbnRyaWVzOiBzZW1hbnRpY0VudHJpZXMsXG4gICAgICAgIGtpbmQ6IGNvbGxlY3Rpb25LaW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIlxuICAgICAgICAgID8gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiT3JkZXJlZE1hcExpdGVyYWxcIilcbiAgICAgICAgICA6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIk1hcExpdGVyYWxcIiksXG4gICAgICAgIGxvY2F0aW9uXG4gICAgICB9LCB7bGl0ZXJhbDogbG9jYXRpb259KVxuICAgIH1cblxuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImVtcHR5IGFycmF5IHdpdGhvdXQgYSBsaXN0IG9yIG1hcCB0eXBlXCIsIGxvY2F0aW9uKVxuICB9XG5cbiAgaWYgKG5vZGUua2luZCA9PSBcIm5ld1wiKSB7XG4gICAgY29uc3QgY29uc3RydWN0aW9uID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5ld30gKi8gKG5vZGUpXG4gICAgY29uc3QgbmFtZSA9IGNvbnN0cnVjdGlvbi53aGF0LmtpbmQgPT0gXCJuYW1lXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTmFtZX0gKi8gKGNvbnN0cnVjdGlvbi53aGF0KSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKCFuYW1lIHx8IG5hbWUucmVzb2x1dGlvbiAhPSBcInVxblwiIHx8IHR5cGVvZiBuYW1lLm5hbWUgIT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZHluYW1pYyBvciBxdWFsaWZpZWQgcmVjb3JkIGNvbnN0cnVjdGlvblwiLCBub2RlTG9jYXRpb24oY29uc3RydWN0aW9uLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IGNvbnRleHQucmVjb3JkTmFtZXMuZ2V0KG5hbWUubmFtZSlcblxuICAgIGlmICghZGVjbGFyYXRpb24pIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImNvbnN0cnVjdGlvbiBvZiBhbiB1bmtub3duIG5vbWluYWwgY2xhc3NcIiwgbm9kZUxvY2F0aW9uKGNvbnN0cnVjdGlvbi53aGF0LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICBpZiAoZGVjbGFyYXRpb24ua2luZCA9PSBcIkNsYXNzRGVjbGFyYXRpb25cIikge1xuICAgICAgY29uc3QgdW5zdXBwb3J0ZWRBcmd1bWVudCA9IGNvbnN0cnVjdGlvbi5hcmd1bWVudHMuZmluZCgoYXJndW1lbnQpID0+XG4gICAgICAgIGFyZ3VtZW50LmtpbmQgPT0gXCJuYW1lZGFyZ3VtZW50XCIgfHwgYXJndW1lbnQua2luZCA9PSBcInZhcmlhZGljXCIgfHwgUmVmbGVjdC5nZXQoYXJndW1lbnQsIFwiYnlyZWZcIikgPT09IHRydWUpXG5cbiAgICAgIGlmICh1bnN1cHBvcnRlZEFyZ3VtZW50KSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub24tcG9zaXRpb25hbCByZWZlcmVuY2UgY29uc3RydWN0b3IgYXJndW1lbnRcIixcbiAgICAgICAgbm9kZUxvY2F0aW9uKHVuc3VwcG9ydGVkQXJndW1lbnQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgICAgY29uc3QgY2xhc3NMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihjb25zdHJ1Y3Rpb24ud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2FyZ3VtZW50czogY29uc3RydWN0aW9uLmFyZ3VtZW50cy5tYXAoKGFyZ3VtZW50LCBpbmRleCkgPT5cbiAgICAgICAgY29udmVydEV4cHJlc3Npb24oYXJndW1lbnQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQsIGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLnBhcmFtZXRlcnNbaW5kZXhdPy50eXBlKSksXG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJSZWZlcmVuY2VDb25zdHJ1Y3Rpb25cIiksIGxvY2F0aW9uLFxuICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2VUeXBlKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBjbGFzc0xvY2F0aW9uKX0sIHtjbGFzczogY2xhc3NMb2NhdGlvbn0pXG4gICAgfVxuICAgIGlmIChkZWNsYXJhdGlvbi5raW5kID09IFwiRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvblwiKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJvd25lZCByZXNvdXJjZSBjb25zdHJ1Y3Rpb25cIiwgbm9kZUxvY2F0aW9uKGNvbnN0cnVjdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHR1YWxUeXBlQXJndW1lbnRzID0gZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiUmVjb3JkVHlwZVwiICYmIGV4cGVjdGVkVHlwZS5kZWNsYXJhdGlvbklkID09IGRlY2xhcmF0aW9uLmlkXG4gICAgICA/IGV4cGVjdGVkVHlwZS5hcmd1bWVudHNcbiAgICAgIDogdW5kZWZpbmVkXG4gICAgY29uc3QgdmlzaWJsZVR5cGVQYXJhbWV0ZXJJZHMgPSBuZXcgU2V0KFsuLi5jb250ZXh0LnR5cGVQYXJhbWV0ZXJzPy52YWx1ZXMoKSA/PyBbXV1cbiAgICAgIC5tYXAoKHBhcmFtZXRlcikgPT4gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwYXJhbWV0ZXIuaWQpKSlcbiAgICBjb25zdCB0eXBlQXJndW1lbnRzID0gY29udGV4dHVhbFR5cGVBcmd1bWVudHMgJiZcbiAgICAgICFjb250ZXh0dWFsVHlwZUFyZ3VtZW50cy5zb21lKChhcmd1bWVudCkgPT4gdHlwZUNvbnRhaW5zQW55VmFyaWFibGUoYXJndW1lbnQsIHZpc2libGVUeXBlUGFyYW1ldGVySWRzKSlcbiAgICAgID8gY29udGV4dHVhbFR5cGVBcmd1bWVudHNcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICBhcmd1bWVudHM6IGNvbnN0cnVjdGlvbi5hcmd1bWVudHMubWFwKChhcmd1bWVudCwgaW5kZXgpID0+XG4gICAgICAgIGNvbnZlcnRFeHByZXNzaW9uKGFyZ3VtZW50LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LFxuICAgICAgICAgIGluc3RhbnRpYXRlZFJlY29yZEZpZWxkVHlwZShkZWNsYXJhdGlvbiwgdHlwZUFyZ3VtZW50cywgaW5kZXgpKSksXG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJSZWNvcmRDb25zdHJ1Y3Rpb25cIiksXG4gICAgICBsb2NhdGlvbixcbiAgICAgIHJlY29yZDogcmVjb3JkVHlwZSgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgbm9kZUxvY2F0aW9uKGNvbnN0cnVjdGlvbi53aGF0LCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgICAgdHlwZUFyZ3VtZW50cylcbiAgICB9LCB7cmVjb3JkOiBub2RlTG9jYXRpb24oY29uc3RydWN0aW9uLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJwcm9wZXJ0eWxvb2t1cFwiKSB7XG4gICAgY29uc3QgcmVhZCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Qcm9wZXJ0eUxvb2t1cH0gKi8gKG5vZGUpXG4gICAgY29uc3Qgb2Zmc2V0ID0gcmVhZC5vZmZzZXQua2luZCA9PSBcImlkZW50aWZpZXJcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZGVudGlmaWVyfSAqLyAocmVhZC5vZmZzZXQpIDogdW5kZWZpbmVkXG5cbiAgICBpZiAoIW9mZnNldCB8fCB0eXBlb2Ygb2Zmc2V0Lm5hbWUgIT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZHluYW1pYyBvciBjb21wdXRlZCBtZW1iZXIgYWNjZXNzXCIsIG5vZGVMb2NhdGlvbihyZWFkLm9mZnNldCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIGlmIChyZWFkLndoYXQua2luZCA9PSBcInZhcmlhYmxlXCIgJiYgLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlZhcmlhYmxlfSAqLyAocmVhZC53aGF0KS5uYW1lID09IFwidGhpc1wiICYmXG4gICAgICBjb250ZXh0LmN1cnJlbnRDbGFzcykge1xuICAgICAgY29uc3QgZmllbGQgPSBjb250ZXh0LmN1cnJlbnRDbGFzcy5maWVsZHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUubmFtZSA9PSBvZmZzZXQubmFtZSlcblxuICAgICAgaWYgKCFmaWVsZCkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIGB1bmtub3duIHByaXZhdGUgZmllbGQgJyR7b2Zmc2V0Lm5hbWV9J2AsIG5vZGVMb2NhdGlvbihvZmZzZXQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2ZpZWxkOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGZpZWxkLmlkKSwga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUHJpdmF0ZUZpZWxkUmVhZFwiKSwgbG9jYXRpb24sXG4gICAgICAgIHJlY2VpdmVyOiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY2VpdmVyRXhwcmVzc2lvbn0gKi8gKFxuICAgICAgICAgIGNvbnZlcnRFeHByZXNzaW9uKHJlYWQud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCkpfSwge21lbWJlcjogbm9kZUxvY2F0aW9uKG9mZnNldCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICAgIH1cbiAgICBjb25zdCByZWNlaXZlclR5cGUgPSBrbm93bkV4cHJlc3Npb25UeXBlKHJlYWQud2hhdCwgY29udGV4dClcbiAgICBpZiAocmVjZWl2ZXJUeXBlPy5raW5kID09IFwiUmVmZXJlbmNlVHlwZVwiKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJwcml2YXRlIHJlZmVyZW5jZS1jbGFzcyBmaWVsZCBhY2Nlc3NcIiwgbG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IHJlY2VpdmVyUmVjb3JkID0gcmVjZWl2ZXJUeXBlPy5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIgPyByZWNlaXZlclR5cGUudmFsdWVUeXBlIDogcmVjZWl2ZXJUeXBlXG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSByZWNlaXZlclJlY29yZD8ua2luZCA9PSBcIlJlY29yZFR5cGVcIiA/IGNvbnRleHQucmVjb3Jkcy5nZXQocmVjZWl2ZXJSZWNvcmQuZGVjbGFyYXRpb25JZCkgOiB1bmRlZmluZWRcblxuICAgIGlmICgoZGVjbGFyYXRpb24/LnR5cGVQYXJhbWV0ZXJzPy5sZW5ndGggPz8gMCkgPiAwKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJnZW5lcmljIHJlY29yZCBwcm9wZXJ0eSBhY2Nlc3NcIiwgbm9kZUxvY2F0aW9uKHJlYWQub2Zmc2V0LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgZmllbGQ6IG9mZnNldC5uYW1lLFxuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiTWVtYmVyUmVhZFwiKSxcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgcmVjZWl2ZXI6IGNvbnZlcnRFeHByZXNzaW9uKHJlYWQud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dClcbiAgICB9LCB7bWVtYmVyOiBub2RlTG9jYXRpb24ocmVhZC5vZmZzZXQsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJvZmZzZXRsb29rdXBcIikge1xuICAgIGNvbnN0IGxvb2t1cCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5PZmZzZXRMb29rdXB9ICovIChub2RlKVxuXG4gICAgaWYgKCFsb29rdXAub2Zmc2V0KSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJhcHBlbmQgb3IgbWlzc2luZyBhcnJheSBpbmRleFwiLCBsb2NhdGlvbilcbiAgICBjb25zdCByZWNlaXZlciA9IGxvb2t1cC53aGF0LmtpbmQgPT0gXCJ2YXJpYWJsZVwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlZhcmlhYmxlfSAqLyAobG9va3VwLndoYXQpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgcmVjZWl2ZXJUeXBlID0gcmVjZWl2ZXIgJiYgdHlwZW9mIHJlY2VpdmVyLm5hbWUgPT0gXCJzdHJpbmdcIiA/IGNvbnRleHQuYmluZGluZ3MuZ2V0KHJlY2VpdmVyLm5hbWUpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgYWNjZXNzS2luZCA9IHJlY2VpdmVyVHlwZT8ua2luZCA9PSBcIkxpc3RUeXBlXCIgPyBcImxpc3RcIiA6XG4gICAgICByZWNlaXZlclR5cGU/LmtpbmQgPT0gXCJNYXBUeXBlXCIgfHwgcmVjZWl2ZXJUeXBlPy5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIiA/IFwibWFwXCIgOlxuICAgICAgbG9va3VwLm9mZnNldC5raW5kID09IFwibnVtYmVyXCIgPyBcImxpc3RcIiA6IGxvb2t1cC5vZmZzZXQua2luZCA9PSBcInN0cmluZ1wiID8gXCJtYXBcIiA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKGFjY2Vzc0tpbmQgPT0gXCJsaXN0XCIgJiYgW1wibnVtYmVyXCIsIFwic3RyaW5nXCIsIFwidmFyaWFibGVcIl0uaW5jbHVkZXMobG9va3VwLm9mZnNldC5raW5kKSkge1xuICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgICBjb2xsZWN0aW9uOiBjb252ZXJ0RXhwcmVzc2lvbihsb29rdXAud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCksXG4gICAgICAgIGluZGV4OiBjb252ZXJ0RXhwcmVzc2lvbihsb29rdXAub2Zmc2V0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSxcbiAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiTGlzdEluZGV4RXhwcmVzc2lvblwiKSxcbiAgICAgICAgbG9jYXRpb24sXG4gICAgICAgIHRvdGFsaXR5OiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJwcm92ZW5cIilcbiAgICAgIH0sIHtvcGVyYXRvcjogdG9rZW5Mb2NhdGlvbihcIltcIiwgbG9va3VwLndoYXQubG9jPy5lbmQub2Zmc2V0ID8/IDAsIGxvb2t1cC5vZmZzZXQubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICAgIH1cbiAgICBpZiAoYWNjZXNzS2luZCA9PSBcIm1hcFwiICYmIFtcIm51bWJlclwiLCBcInN0cmluZ1wiLCBcInZhcmlhYmxlXCJdLmluY2x1ZGVzKGxvb2t1cC5vZmZzZXQua2luZCkpIHtcbiAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgICAgY29sbGVjdGlvbjogY29udmVydEV4cHJlc3Npb24obG9va3VwLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpLFxuICAgICAgICBrZXk6IGNvbnZlcnRFeHByZXNzaW9uKGxvb2t1cC5vZmZzZXQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpLFxuICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJNYXBMb29rdXBFeHByZXNzaW9uXCIpLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgdG90YWxpdHk6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInByb3ZlblwiKVxuICAgICAgfSwge29wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKFwiW1wiLCBsb29rdXAud2hhdC5sb2M/LmVuZC5vZmZzZXQgPz8gMCwgbG9va3VwLm9mZnNldC5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKX0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibm9ubGl0ZXJhbCBhcnJheSBhY2Nlc3NcIiwgbm9kZUxvY2F0aW9uKGxvb2t1cC5vZmZzZXQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG5cbiAgaWYgKG5vZGUua2luZCA9PSBcInVuYXJ5XCIpIHtcbiAgICBjb25zdCB1bmFyeSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5VbmFyeX0gKi8gKG5vZGUpXG5cbiAgICBpZiAoIVtcIiFcIiwgXCItXCJdLmluY2x1ZGVzKHVuYXJ5LnR5cGUpKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYHVuYXJ5ICR7dW5hcnkudHlwZX1gLCBsb2NhdGlvbilcblxuICAgIGNvbnN0IHNlbWFudGljID0gd2l0aEFkYXB0ZWRPcGVyYXRpb24od2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICBraW5kOiBcIlVuYXJ5RXhwcmVzc2lvblwiLFxuICAgICAgbG9jYXRpb24sXG4gICAgICBvcGVyYW5kOiBjb252ZXJ0RXhwcmVzc2lvbih1bmFyeS53aGF0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KVxuICAgIH0sIHtcbiAgICAgIG9wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKHVuYXJ5LnR5cGUsIHVuYXJ5LmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIHVuYXJ5LndoYXQubG9jPy5zdGFydC5vZmZzZXQgPz8gdW5hcnkubG9jPy5lbmQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgfSksIHVuYXJ5LnR5cGUgPT0gXCIhXCIgPyBcIk5vdFwiIDogXCJOZWdhdGVcIilcblxuICAgIHJldHVybiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChzZW1hbnRpYykpXG4gIH1cblxuICBpZiAobm9kZS5raW5kID09IFwicmV0aWZcIikge1xuICAgIGNvbnN0IHRlcm5hcnkgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuUmV0SWZ9ICovIChub2RlKVxuXG4gICAgaWYgKCF0ZXJuYXJ5LnRlc3QgfHwgIXRlcm5hcnkudHJ1ZUV4cHIgfHwgIXRlcm5hcnkuZmFsc2VFeHByKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJzaG9ydCB0ZXJuYXJ5XCIsIGxvY2F0aW9uKVxuICAgIGlmICh0ZXJuYXJ5LnRlc3Qua2luZCA9PSBcInZhcmlhYmxlXCIpIHtcbiAgICAgIGNvbnN0IHRlc3RlZCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5WYXJpYWJsZX0gKi8gKHRlcm5hcnkudGVzdClcblxuICAgICAgaWYgKHR5cGVvZiB0ZXN0ZWQubmFtZSA9PSBcInN0cmluZ1wiICYmIGNvbnRleHQuYmluZGluZ3MuZ2V0KHRlc3RlZC5uYW1lKT8ua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm9wdGlvbmFsIHRydXRoaW5lc3MgY29uZGl0aW9uXCIsIG5vZGVMb2NhdGlvbih0ZXN0ZWQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovICh3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGFsdGVybmF0ZTogY29udmVydEV4cHJlc3Npb24odGVybmFyeS5mYWxzZUV4cHIsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpLFxuICAgICAgY29uZGl0aW9uOiBjb252ZXJ0RXhwcmVzc2lvbih0ZXJuYXJ5LnRlc3QsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpLFxuICAgICAgY29uc2VxdWVudDogY29udmVydEV4cHJlc3Npb24odGVybmFyeS50cnVlRXhwciwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCksXG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIiksXG4gICAgICBsb2NhdGlvblxuICAgIH0sIHtcbiAgICAgIGFsdGVybmF0ZTogdG9rZW5Mb2NhdGlvbihcIjpcIiwgdGVybmFyeS50cnVlRXhwci5sb2M/LmVuZC5vZmZzZXQgPz8gMCwgdGVybmFyeS5mYWxzZUV4cHIubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgICBjb2xvbjogdG9rZW5Mb2NhdGlvbihcIjpcIiwgdGVybmFyeS50cnVlRXhwci5sb2M/LmVuZC5vZmZzZXQgPz8gMCwgdGVybmFyeS5mYWxzZUV4cHIubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgICBjb25kaXRpb246IHRlcm5hcnkudGVzdC5sb2MgPyBub2RlTG9jYXRpb24odGVybmFyeS50ZXN0LCBmaWxlbmFtZSwgc291cmNlKSA6IGxvY2F0aW9uLFxuICAgICAgY29uc2VxdWVudDogdGVybmFyeS50cnVlRXhwci5sb2MgPyBub2RlTG9jYXRpb24odGVybmFyeS50cnVlRXhwciwgZmlsZW5hbWUsIHNvdXJjZSkgOiBsb2NhdGlvbixcbiAgICAgIG9wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKFwiP1wiLCB0ZXJuYXJ5LnRlc3QubG9jPy5lbmQub2Zmc2V0ID8/IDAsIHRlcm5hcnkudHJ1ZUV4cHIubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICB9KSkpXG4gIH1cblxuICBpZiAobm9kZS5raW5kID09IFwibnVsbHNhZmVwcm9wZXJ0eWxvb2t1cFwiIHx8IG5vZGUua2luZCA9PSBcIm51bGxzYWZlbWV0aG9kY2FsbFwiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwic2FmZSBuYXZpZ2F0aW9uXCIsIGxvY2F0aW9uKVxuICB9XG5cbiAgaWYgKG5vZGUua2luZCA9PSBcImJpblwiKSB7XG4gICAgY29uc3QgYmluYXJ5ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJpbn0gKi8gKG5vZGUpXG4gICAgaWYgKGJpbmFyeS50eXBlID09IFwiIT09XCIgJiYgYmluYXJ5LmxlZnQua2luZCA9PSBcInZhcmlhYmxlXCIgJiYgYmluYXJ5LnJpZ2h0LmtpbmQgPT0gXCJudWxsa2V5d29yZFwiKSB7XG4gICAgICBjb25zdCBvcGVyYW5kID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JZGVudGlmaWVyRXhwcmVzc2lvbn0gKi8gKFxuICAgICAgICBjb252ZXJ0RXhwcmVzc2lvbihiaW5hcnkubGVmdCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCwgdW5kZWZpbmVkLCB0cnVlKVxuICAgICAgKVxuXG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiT3B0aW9uYWxJc1ByZXNlbnRcIiksIGxvY2F0aW9uLCBvcGVyYW5kfSwge1xuICAgICAgICBvcGVyYXRvcjogdG9rZW5Mb2NhdGlvbihiaW5hcnkudHlwZSwgYmluYXJ5LmxlZnQubG9jPy5lbmQub2Zmc2V0ID8/IDAsIGJpbmFyeS5yaWdodC5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKVxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKFtcIj09XCIsIFwiIT1cIl0uaW5jbHVkZXMoYmluYXJ5LnR5cGUpKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYGNvZXJjaXZlIGVxdWFsaXR5ICR7YmluYXJ5LnR5cGV9YCwgbG9jYXRpb24pXG4gICAgaWYgKFtcImFuZFwiLCBcIm9yXCJdLmluY2x1ZGVzKGJpbmFyeS50eXBlKSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIGBwcmVjZWRlbmNlLXNlbnNpdGl2ZSBib29sZWFuICR7YmluYXJ5LnR5cGV9YCwgbG9jYXRpb24pXG4gICAgaWYgKCFwaHBCaW5hcnlPcGVyYXRpb25zLmhhcyhiaW5hcnkudHlwZSkpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBgYmluYXJ5ICR7YmluYXJ5LnR5cGV9YCwgbG9jYXRpb24pXG5cbiAgICBjb25zdCBzZW1hbnRpYyA9IHdpdGhBZGFwdGVkT3BlcmF0aW9uKHtcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkJpbmFyeUV4cHJlc3Npb25cIiksXG4gICAgICBsZWZ0OiBjb252ZXJ0RXhwcmVzc2lvbihiaW5hcnkubGVmdCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCksXG4gICAgICBsb2NhdGlvbixcbiAgICAgIHJpZ2h0OiBjb252ZXJ0RXhwcmVzc2lvbihiaW5hcnkucmlnaHQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gICAgfSwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy9vcGVyYXRvcnMuanNcIikuQWRhcHRlZE9wZXJhdGlvbn0gKi8gKHBocEJpbmFyeU9wZXJhdGlvbnMuZ2V0KGJpbmFyeS50eXBlKSkpXG5cbiAgICByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAod2l0aFBhcnNlclJhbmdlcyhzZW1hbnRpYywge1xuICAgICAgb3BlcmF0b3I6IHRva2VuTG9jYXRpb24oYmluYXJ5LnR5cGUsIGJpbmFyeS5sZWZ0LmxvYz8uZW5kLm9mZnNldCA/PyAwLCBiaW5hcnkucmlnaHQubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICB9KSkpXG4gIH1cblxuICBpZiAobm9kZS5raW5kID09IFwiY2FsbFwiKSB7XG4gICAgY29uc3QgY2FsbCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5DYWxsfSAqLyAobm9kZSlcblxuICAgIGlmIChjYWxsLndoYXQua2luZCA9PSBcInByb3BlcnR5bG9va3VwXCIpIHtcbiAgICAgIGNvbnN0IGxvb2t1cCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Qcm9wZXJ0eUxvb2t1cH0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGNhbGwud2hhdCkpXG4gICAgICBjb25zdCBtZW1iZXIgPSBsb29rdXAub2Zmc2V0LmtpbmQgPT0gXCJpZGVudGlmaWVyXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuSWRlbnRpZmllcn0gKi8gKGxvb2t1cC5vZmZzZXQpIDogdW5kZWZpbmVkXG4gICAgICBjb25zdCByZWNlaXZlclR5cGUgPSBrbm93bkV4cHJlc3Npb25UeXBlKGxvb2t1cC53aGF0LCBjb250ZXh0KVxuXG4gICAgICBpZiAobWVtYmVyICYmIHR5cGVvZiBtZW1iZXIubmFtZSA9PSBcInN0cmluZ1wiICYmIHJlY2VpdmVyVHlwZT8ua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIikge1xuICAgICAgICBjb25zdCBtZXRob2QgPSBjb250ZXh0LmNsYXNzZXMuZ2V0KHJlY2VpdmVyVHlwZS5kZWNsYXJhdGlvbklkKT8ubWV0aG9kcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09IG1lbWJlci5uYW1lKVxuICAgICAgICBjb25zdCB1bnN1cHBvcnRlZEFyZ3VtZW50ID0gY2FsbC5hcmd1bWVudHMuZmluZCgoYXJndW1lbnQpID0+XG4gICAgICAgICAgYXJndW1lbnQua2luZCA9PSBcIm5hbWVkYXJndW1lbnRcIiB8fCBhcmd1bWVudC5raW5kID09IFwidmFyaWFkaWNcIiB8fCBSZWZsZWN0LmdldChhcmd1bWVudCwgXCJieXJlZlwiKSA9PT0gdHJ1ZSlcblxuICAgICAgICBpZiAodW5zdXBwb3J0ZWRBcmd1bWVudCkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibm9uLXBvc2l0aW9uYWwgbWV0aG9kIGFyZ3VtZW50XCIsXG4gICAgICAgICAgbm9kZUxvY2F0aW9uKHVuc3VwcG9ydGVkQXJndW1lbnQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7YXJndW1lbnRzOiBjYWxsLmFyZ3VtZW50cy5tYXAoKGFyZ3VtZW50LCBpbmRleCkgPT5cbiAgICAgICAgICBjb252ZXJ0RXhwcmVzc2lvbihhcmd1bWVudCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCwgbWV0aG9kPy5wYXJhbWV0ZXJzW2luZGV4XT8udHlwZSkpLFxuICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJNZXRob2RDYWxsRXhwcmVzc2lvblwiKSwgbG9jYXRpb24sIG1ldGhvZDogbWV0aG9kPy5pZCA/PyBtZW1iZXIubmFtZSxcbiAgICAgICAgcmVjZWl2ZXI6IGNvbnZlcnRFeHByZXNzaW9uKGxvb2t1cC53aGF0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KX0sIHttZW1iZXI6IG5vZGVMb2NhdGlvbihtZW1iZXIsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2FsbC53aGF0LmtpbmQgPT0gXCJwcm9wZXJ0eWxvb2t1cFwiICYmIGNhbGwuYXJndW1lbnRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICBjb25zdCBsb29rdXAgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuUHJvcGVydHlMb29rdXB9ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChjYWxsLndoYXQpKVxuICAgICAgY29uc3QgcmVjZWl2ZXIgPSBsb29rdXAud2hhdC5raW5kID09IFwidmFyaWFibGVcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5WYXJpYWJsZX0gKi8gKGxvb2t1cC53aGF0KSA6IHVuZGVmaW5lZFxuICAgICAgY29uc3QgbWVtYmVyID0gbG9va3VwLm9mZnNldC5raW5kID09IFwiaWRlbnRpZmllclwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklkZW50aWZpZXJ9ICovIChsb29rdXAub2Zmc2V0KSA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAocmVjZWl2ZXIgJiYgdHlwZW9mIHJlY2VpdmVyLm5hbWUgPT0gXCJzdHJpbmdcIiAmJiBtZW1iZXI/Lm5hbWUgPT0gXCJnZXRNZXNzYWdlXCIgJiYgY29udGV4dC5iaW5kaW5ncy5nZXQocmVjZWl2ZXIubmFtZSk/LmtpbmQgPT0gXCJFcnJvclR5cGVcIikge1xuICAgICAgICBjb25zdCByZWNlaXZlckxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKHJlY2VpdmVyLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gICAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJFcnJvck1lc3NhZ2VSZWFkXCIpLFxuICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgIHJlY2VpdmVyOiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSwgbG9jYXRpb246IHJlY2VpdmVyTG9jYXRpb24sIG5hbWU6IHJlY2VpdmVyLm5hbWV9LCB7XG4gICAgICAgICAgICBuYW1lOiByZWNlaXZlckxvY2F0aW9uXG4gICAgICAgICAgfSlcbiAgICAgICAgfSwge21lbWJlcjogbm9kZUxvY2F0aW9uKG1lbWJlciwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICAgICAgfVxuICAgICAgaWYgKG1lbWJlciAmJiB0eXBlb2YgbWVtYmVyLm5hbWUgPT0gXCJzdHJpbmdcIiAmJiBrbm93bkdlbmVyaWNSZWNvcmRBY2Nlc3NvclR5cGUobG9va3VwLCBjb250ZXh0KSkge1xuICAgICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICAgICAgZmllbGQ6IG1lbWJlci5uYW1lLFxuICAgICAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIk1lbWJlclJlYWRcIiksXG4gICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgcmVjZWl2ZXI6IGNvbnZlcnRFeHByZXNzaW9uKGxvb2t1cC53aGF0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KVxuICAgICAgICB9LCB7bWVtYmVyOiBub2RlTG9jYXRpb24obWVtYmVyLCBmaWxlbmFtZSwgc291cmNlKX0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNhbGwud2hhdC5raW5kID09IFwibmFtZVwiICYmIGNhbGwud2hhdC5uYW1lID09IFwiY291bnRcIiAmJiBjYWxsLmFyZ3VtZW50cy5sZW5ndGggPT0gMSkge1xuICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgICBjb2xsZWN0aW9uOiBjb252ZXJ0RXhwcmVzc2lvbihjYWxsLmFyZ3VtZW50c1swXSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCksXG4gICAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkNvbGxlY3Rpb25TaXplRXhwcmVzc2lvblwiKSxcbiAgICAgICAgbG9jYXRpb25cbiAgICAgIH0sIHtvcGVyYXRvcjogbm9kZUxvY2F0aW9uKGNhbGwud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICAgIH1cblxuICAgIGlmIChjYWxsLndoYXQua2luZCAhPSBcIm5hbWVcIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZHluYW1pYyBjYWxsXCIsIGxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBjYWxsZWROYW1lID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5hbWV9ICovIChjYWxsLndoYXQpXG5cbiAgICBpZiAoY2FsbGVkTmFtZS5yZXNvbHV0aW9uICE9IFwidXFuXCIgfHwgY2FsbGVkTmFtZS5uYW1lLmluY2x1ZGVzKFwiXFxcXFwiKSkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwicXVhbGlmaWVkIGNhbGxcIiwgbm9kZUxvY2F0aW9uKGNhbGwud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIGNvbnN0IHVuc3VwcG9ydGVkQXJndW1lbnQgPSBjYWxsLmFyZ3VtZW50cy5maW5kKChhcmd1bWVudCkgPT5cbiAgICAgIGFyZ3VtZW50LmtpbmQgPT0gXCJuYW1lZGFyZ3VtZW50XCIgfHwgYXJndW1lbnQua2luZCA9PSBcInZhcmlhZGljXCIgfHwgUmVmbGVjdC5nZXQoYXJndW1lbnQsIFwiYnlyZWZcIikgPT09IHRydWUpXG5cbiAgICBpZiAodW5zdXBwb3J0ZWRBcmd1bWVudCkge1xuICAgICAgY29uc3QgZGV0YWlsID0gdW5zdXBwb3J0ZWRBcmd1bWVudC5raW5kID09IFwibmFtZWRhcmd1bWVudFwiID8gXCJuYW1lZCBhcmd1bWVudFwiIDpcbiAgICAgICAgdW5zdXBwb3J0ZWRBcmd1bWVudC5raW5kID09IFwidmFyaWFkaWNcIiA/IFwidW5wYWNrZWQgYXJndW1lbnRcIiA6IFwiYnktcmVmZXJlbmNlIGFyZ3VtZW50XCJcblxuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIGRldGFpbCwgbm9kZUxvY2F0aW9uKHVuc3VwcG9ydGVkQXJndW1lbnQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cblxuICAgIGNvbnN0IGNhbGxlZSA9IGNhbGxlZE5hbWUubmFtZVxuXG4gICAgY29uc3Qgc2lnbmF0dXJlID0gY29udGV4dC5mdW5jdGlvbnMuZ2V0KGNhbGxlZSlcbiAgICBjb25zdCBrbm93bkFyZ3VtZW50cyA9IGNhbGwuYXJndW1lbnRzLm1hcCgoYXJndW1lbnQpID0+IGtub3duQ2FsbEFyZ3VtZW50VHlwZShhcmd1bWVudCwgY29udGV4dCkpXG4gICAgY29uc3QgcGFyYW1ldGVyVHlwZXMgPSBzaWduYXR1cmUgPyBrbm93bkNhbGxQYXJhbWV0ZXJUeXBlcyhzaWduYXR1cmUsIGtub3duQXJndW1lbnRzKSA6IHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgYXJndW1lbnRzOiBjYWxsLmFyZ3VtZW50cy5tYXAoKGFyZ3VtZW50LCBpbmRleCkgPT5cbiAgICAgICAgY29udmVydEV4cHJlc3Npb24oYXJndW1lbnQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQsXG4gICAgICAgICAgcGFyYW1ldGVyVHlwZXM/LltpbmRleF0gPz8gc2lnbmF0dXJlPy5wYXJhbWV0ZXJzW2luZGV4XT8udHlwZSxcbiAgICAgICAgICBwcmVzZXJ2ZXNHZW5lcmljT3B0aW9uYWxFdmlkZW5jZShzaWduYXR1cmUsIGluZGV4KSkpLFxuICAgICAgY2FsbGVlLFxuICAgICAga2luZDogXCJDYWxsRXhwcmVzc2lvblwiLFxuICAgICAgbG9jYXRpb25cbiAgICB9LCB7Y2FsbGVlOiBub2RlTG9jYXRpb24oY2FsbC53aGF0LCBmaWxlbmFtZSwgc291cmNlKX0pXG4gIH1cblxuICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgbm9kZS5raW5kLCBsb2NhdGlvbilcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBvbmx5IHJlc3VsdCB0eXBlcyBlc3RhYmxpc2hlZCBieSBleHBsaWNpdCBzaWduYXR1cmVzIGFuZCBiaW5kaW5ncy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5FeHByZXNzaW9ufSBub2RlIC0gUGFyc2VyLW93bmVkIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0ge1BocENvbnZlcnNpb25Db250ZXh0fSBjb250ZXh0IC0gVHlwZWQgY29udmVyc2lvbiBjb250ZXh0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JUeXBlIHwgdW5kZWZpbmVkfSBLbm93biByZXN1bHQgdHlwZS5cbiAqL1xuZnVuY3Rpb24ga25vd25FeHByZXNzaW9uVHlwZShub2RlLCBjb250ZXh0KSB7XG4gIGlmIChub2RlLmtpbmQgPT0gXCJ2YXJpYWJsZVwiKSB7XG4gICAgY29uc3QgdmFyaWFibGUgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVmFyaWFibGV9ICovIChub2RlKVxuXG4gICAgaWYgKHZhcmlhYmxlLm5hbWUgPT0gXCJ0aGlzXCIgJiYgY29udGV4dC5jdXJyZW50Q2xhc3M/LmlkKSB7XG4gICAgICByZXR1cm4ge2RlY2xhcmF0aW9uSWQ6IGNvbnRleHQuY3VycmVudENsYXNzLmlkLCBraW5kOiBcIlJlZmVyZW5jZVR5cGVcIn1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YXJpYWJsZS5uYW1lID09IFwic3RyaW5nXCIpIHJldHVybiBjb250ZXh0LmJpbmRpbmdzLmdldCh2YXJpYWJsZS5uYW1lKVxuICB9XG4gIGlmIChub2RlLmtpbmQgPT0gXCJjYWxsXCIpIHtcbiAgICBjb25zdCBjYWxsID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkNhbGx9ICovIChub2RlKVxuICAgIGNvbnN0IG5hbWUgPSBjYWxsLndoYXQua2luZCA9PSBcIm5hbWVcIiAmJiB0eXBlb2YgY2FsbC53aGF0Lm5hbWUgPT0gXCJzdHJpbmdcIiA/IGNhbGwud2hhdC5uYW1lIDogdW5kZWZpbmVkXG5cbiAgICBpZiAobmFtZSkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gY29udGV4dC5mdW5jdGlvbnMuZ2V0KG5hbWUpXG5cbiAgICAgIGlmIChzaWduYXR1cmUpIHJldHVybiBrbm93bkNhbGxSZXR1cm5UeXBlKHNpZ25hdHVyZSwgY2FsbC5hcmd1bWVudHMubWFwKChhcmd1bWVudCkgPT4ga25vd25FeHByZXNzaW9uVHlwZShhcmd1bWVudCwgY29udGV4dCkpKVxuICAgIH1cbiAgICBpZiAoY2FsbC53aGF0LmtpbmQgPT0gXCJwcm9wZXJ0eWxvb2t1cFwiICYmIGNhbGwuYXJndW1lbnRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXR1cm4ga25vd25HZW5lcmljUmVjb3JkQWNjZXNzb3JUeXBlKFxuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuUHJvcGVydHlMb29rdXB9ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChjYWxsLndoYXQpKSwgY29udGV4dClcbiAgICB9XG4gICAgaWYgKGNhbGwud2hhdC5raW5kID09IFwicHJvcGVydHlsb29rdXBcIikge1xuICAgICAgY29uc3QgbG9va3VwID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlByb3BlcnR5TG9va3VwfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoY2FsbC53aGF0KSlcbiAgICAgIGNvbnN0IHJlY2VpdmVyID0ga25vd25FeHByZXNzaW9uVHlwZShsb29rdXAud2hhdCwgY29udGV4dClcbiAgICAgIGNvbnN0IG1lbWJlciA9IGxvb2t1cC5vZmZzZXQua2luZCA9PSBcImlkZW50aWZpZXJcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZGVudGlmaWVyfSAqLyAobG9va3VwLm9mZnNldCkgOiB1bmRlZmluZWRcblxuICAgICAgaWYgKHJlY2VpdmVyPy5raW5kID09IFwiUmVmZXJlbmNlVHlwZVwiICYmIG1lbWJlciAmJiB0eXBlb2YgbWVtYmVyLm5hbWUgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gY29udGV4dC5jbGFzc2VzLmdldChyZWNlaXZlci5kZWNsYXJhdGlvbklkKT8ubWV0aG9kcy5maW5kKChtZXRob2QpID0+IG1ldGhvZC5uYW1lID09IG1lbWJlci5uYW1lKT8ucmV0dXJuVHlwZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAobm9kZS5raW5kID09IFwib2Zmc2V0bG9va3VwXCIpIHtcbiAgICBjb25zdCBsb29rdXAgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuT2Zmc2V0TG9va3VwfSAqLyAobm9kZSlcbiAgICBjb25zdCBjb2xsZWN0aW9uVHlwZSA9IGtub3duRXhwcmVzc2lvblR5cGUobG9va3VwLndoYXQsIGNvbnRleHQpXG5cbiAgICBpZiAoY29sbGVjdGlvblR5cGU/LmtpbmQgPT0gXCJMaXN0VHlwZVwiKSByZXR1cm4gY29sbGVjdGlvblR5cGUuZWxlbWVudFR5cGVcbiAgICBpZiAoY29sbGVjdGlvblR5cGU/LmtpbmQgPT0gXCJNYXBUeXBlXCIgfHwgY29sbGVjdGlvblR5cGU/LmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiKSByZXR1cm4gY29sbGVjdGlvblR5cGUudmFsdWVUeXBlXG4gIH1cbiAgaWYgKG5vZGUua2luZCA9PSBcIm5ld1wiKSB7XG4gICAgY29uc3QgY29uc3RydWN0aW9uID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5ld30gKi8gKG5vZGUpXG4gICAgY29uc3QgbmFtZSA9IGNvbnN0cnVjdGlvbi53aGF0LmtpbmQgPT0gXCJuYW1lXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTmFtZX0gKi8gKGNvbnN0cnVjdGlvbi53aGF0KSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gbmFtZSAmJiB0eXBlb2YgbmFtZS5uYW1lID09IFwic3RyaW5nXCIgPyBjb250ZXh0LnJlY29yZE5hbWVzLmdldChuYW1lLm5hbWUpIDogdW5kZWZpbmVkXG5cbiAgICBpZiAoZGVjbGFyYXRpb24/LmlkKSByZXR1cm4gZGVjbGFyYXRpb24ua2luZCA9PSBcIkNsYXNzRGVjbGFyYXRpb25cIlxuICAgICAgPyB7ZGVjbGFyYXRpb25JZDogZGVjbGFyYXRpb24uaWQsIGtpbmQ6IFwiUmVmZXJlbmNlVHlwZVwifVxuICAgICAgOiB7ZGVjbGFyYXRpb25JZDogZGVjbGFyYXRpb24uaWQsIGtpbmQ6IFwiUmVjb3JkVHlwZVwifVxuICB9XG4gIGlmIChub2RlLmtpbmQgPT0gXCJwcm9wZXJ0eWxvb2t1cFwiKSB7XG4gICAgY29uc3QgcmVhZCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Qcm9wZXJ0eUxvb2t1cH0gKi8gKG5vZGUpXG4gICAgY29uc3QgcmVjZWl2ZXIgPSBrbm93bkV4cHJlc3Npb25UeXBlKHJlYWQud2hhdCwgY29udGV4dClcblxuICAgIGlmIChyZWFkLndoYXQua2luZCA9PSBcInZhcmlhYmxlXCIgJiYgLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlZhcmlhYmxlfSAqLyAocmVhZC53aGF0KS5uYW1lID09IFwidGhpc1wiICYmXG4gICAgICBjb250ZXh0LmN1cnJlbnRDbGFzcykge1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gcmVhZC5vZmZzZXQua2luZCA9PSBcImlkZW50aWZpZXJcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZGVudGlmaWVyfSAqLyAocmVhZC5vZmZzZXQpIDogdW5kZWZpbmVkXG5cbiAgICAgIHJldHVybiBjb250ZXh0LmN1cnJlbnRDbGFzcy5maWVsZHMuZmluZCgoZmllbGQpID0+IGZpZWxkLm5hbWUgPT0gb2Zmc2V0Py5uYW1lKT8udHlwZVxuICAgIH1cblxuICAgIGlmIChyZWNlaXZlcj8ua2luZCAhPSBcIlJlY29yZFR5cGVcIikgcmV0dXJuIHVuZGVmaW5lZFxuICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gY29udGV4dC5yZWNvcmRzLmdldChyZWNlaXZlci5kZWNsYXJhdGlvbklkKVxuICAgIGNvbnN0IG9mZnNldCA9IHJlYWQub2Zmc2V0LmtpbmQgPT0gXCJpZGVudGlmaWVyXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuSWRlbnRpZmllcn0gKi8gKHJlYWQub2Zmc2V0KSA6IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgbWVtYmVyTmFtZSA9IG9mZnNldCAmJiB0eXBlb2Ygb2Zmc2V0Lm5hbWUgPT0gXCJzdHJpbmdcIiA/IG9mZnNldC5uYW1lIDogdW5kZWZpbmVkXG5cbiAgICBpZiAobWVtYmVyTmFtZSAmJiBkZWNsYXJhdGlvbikge1xuICAgICAgY29uc3QgaW5kZXggPSBkZWNsYXJhdGlvbi5maWVsZHMuZmluZEluZGV4KChmaWVsZCkgPT4gZmllbGQubmFtZSA9PSBtZW1iZXJOYW1lKVxuXG4gICAgICByZXR1cm4gaW5zdGFudGlhdGVkUmVjb3JkRmllbGRUeXBlKGRlY2xhcmF0aW9uLCByZWNlaXZlci5hcmd1bWVudHMsIGluZGV4KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBleGFjdCBwYXJzZXIta25vd24gYXJndW1lbnQgZXZpZGVuY2Ugd2l0aG91dCBjaGFuZ2luZyB0aGUgZXN0YWJsaXNoZWRcbiAqIGV4cHJlc3Npb24tcmVzdWx0IGNsYXNzaWZpZXIgdXNlZCBmb3Igb3B0aW9uYWwgY29udmVyc2lvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5FeHByZXNzaW9ufSBub2RlIC0gUGFyc2VyLW93bmVkIGNhbGwgYXJndW1lbnQuXG4gKiBAcGFyYW0ge1BocENvbnZlcnNpb25Db250ZXh0fSBjb250ZXh0IC0gVHlwZWQgY29udmVyc2lvbiBjb250ZXh0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JUeXBlIHwgdW5kZWZpbmVkfSBLbm93biBhcmd1bWVudCB0eXBlLlxuICovXG5mdW5jdGlvbiBrbm93bkNhbGxBcmd1bWVudFR5cGUobm9kZSwgY29udGV4dCkge1xuICBjb25zdCBrbm93biA9IGtub3duRXhwcmVzc2lvblR5cGUobm9kZSwgY29udGV4dClcblxuICBpZiAoa25vd24pIHJldHVybiBrbm93blxuICBpZiAobm9kZS5raW5kID09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzU2FmZUludGVnZXIoTnVtYmVyKC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5OdW1iZXJ9ICovIChub2RlKS52YWx1ZSkpKSB7XG4gICAgcmV0dXJuIHNjYWxhclR5cGUoXCJpbnRlZ2VyXCIpXG4gIH1cbiAgaWYgKG5vZGUua2luZCA9PSBcImJvb2xlYW5cIiAmJiB0eXBlb2YgLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJvb2xlYW59ICovIChub2RlKS52YWx1ZSA9PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiBzY2FsYXJUeXBlKFwiYm9vbGVhblwiKVxuICB9XG4gIGlmIChub2RlLmtpbmQgPT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlN0cmluZ30gKi8gKG5vZGUpLnZhbHVlID09IFwic3RyaW5nXCIgJiZcbiAgICBoYXNPbmx5VW5pY29kZVNjYWxhcnMoLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlN0cmluZ30gKi8gKG5vZGUpLnZhbHVlKSkge1xuICAgIHJldHVybiBzY2FsYXJUeXBlKFwic3RyaW5nXCIpXG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgUEhQJ3MgZXhhY3QgemVyby1hcmd1bWVudCBhY2Nlc3NvciBjYXJyaWVyIGFnYWluc3QgaXRzIHJlY2VpdmVyJ3NcbiAqIGdlbmVyaWMgcmVjb3JkIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlByb3BlcnR5TG9va3VwfSBsb29rdXAgLSBQYXJzZXItb3duZWQgbWV0aG9kIGxvb2t1cC5cbiAqIEBwYXJhbSB7UGhwQ29udmVyc2lvbkNvbnRleHR9IGNvbnRleHQgLSBUeXBlZCBjb252ZXJzaW9uIGNvbnRleHQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGUgfCB1bmRlZmluZWR9IEluc3RhbnRpYXRlZCBmaWVsZCB0eXBlLlxuICovXG5mdW5jdGlvbiBrbm93bkdlbmVyaWNSZWNvcmRBY2Nlc3NvclR5cGUobG9va3VwLCBjb250ZXh0KSB7XG4gIGNvbnN0IHJlY2VpdmVyID0ga25vd25FeHByZXNzaW9uVHlwZShsb29rdXAud2hhdCwgY29udGV4dClcbiAgY29uc3QgcmVjZWl2ZXJSZWNvcmQgPSByZWNlaXZlcj8ua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiID8gcmVjZWl2ZXIudmFsdWVUeXBlIDogcmVjZWl2ZXJcblxuICBpZiAocmVjZWl2ZXJSZWNvcmQ/LmtpbmQgIT0gXCJSZWNvcmRUeXBlXCIpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgZGVjbGFyYXRpb24gPSBjb250ZXh0LnJlY29yZHMuZ2V0KHJlY2VpdmVyUmVjb3JkLmRlY2xhcmF0aW9uSWQpXG4gIGNvbnN0IG1lbWJlciA9IGxvb2t1cC5vZmZzZXQua2luZCA9PSBcImlkZW50aWZpZXJcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZGVudGlmaWVyfSAqLyAobG9va3VwLm9mZnNldCkgOiB1bmRlZmluZWRcbiAgY29uc3QgaW5kZXggPSBtZW1iZXIgJiYgdHlwZW9mIG1lbWJlci5uYW1lID09IFwic3RyaW5nXCJcbiAgICA/IGRlY2xhcmF0aW9uPy5maWVsZHMuZmluZEluZGV4KChmaWVsZCkgPT4gZmllbGQubmFtZSA9PSBtZW1iZXIubmFtZSkgPz8gLTFcbiAgICA6IC0xXG5cbiAgaWYgKCFkZWNsYXJhdGlvbiB8fCAoZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnM/Lmxlbmd0aCA/PyAwKSA9PSAwIHx8IGluZGV4IDwgMCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIHJldHVybiBpbnN0YW50aWF0ZWRSZWNvcmRGaWVsZFR5cGUoZGVjbGFyYXRpb24sIHJlY2VpdmVyUmVjb3JkLmFyZ3VtZW50cywgaW5kZXgpXG59XG5cbi8qKlxuICogQ29udmVydHMgb25lIGV4cGxpY2l0IFBIUCByZXR1cm4uXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZX0gbm9kZSAtIFBIUCBub2RlLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEBwYXJhbSB7UGhwQ29udmVyc2lvbkNvbnRleHR9IGNvbnRleHQgLSBUeXBlZCBjb252ZXJzaW9uIGNvbnRleHQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmV0dXJuU3RhdGVtZW50fSBTZW1hbnRpYyByZXR1cm4uXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRSZXR1cm4obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gIGlmIChub2RlLmtpbmQgIT0gXCJyZXR1cm5cIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIG5vZGUua2luZCwgbG9jYXRpb24pXG5cbiAgY29uc3QgcmV0dXJuTm9kZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5SZXR1cm59ICovIChub2RlKVxuICBjb25zdCBleHBlY3RlZFR5cGUgPSBjb250ZXh0LnJldHVyblR5cGU/LmtpbmQgPT0gXCJUeXBlUmVmZXJlbmNlXCIgJiYgY29udGV4dC5yZXR1cm5UeXBlLm5hbWUgPT0gXCJ2b2lkXCJcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZSB8IHVuZGVmaW5lZH0gKi8gKGNvbnRleHQucmV0dXJuVHlwZSlcblxuICByZXR1cm4ge1xuICAgIC4uLihyZXR1cm5Ob2RlLmV4cHIgPyB7ZXhwcmVzc2lvbjogY29udmVydEV4cHJlc3Npb24ocmV0dXJuTm9kZS5leHByLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCBleHBlY3RlZFR5cGUpfSA6IHt9KSxcbiAgICBraW5kOiBcIlJldHVyblN0YXRlbWVudFwiLFxuICAgIGxvY2F0aW9uXG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkcyBvbmUgZXhhY3QgUEhQIGxvY2FsIGBAdmFyYCBjYXJyaWVyIGFuZCBpbW11dGFiaWxpdHkgbWFya2VyLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5vZGV9IG5vZGUgLSBBc3NpZ25tZW50LW93bmluZyBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2FsIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uPn0gcmVjb3JkTmFtZXMgLSBOb21pbmFsIGRlY2xhcmF0aW9ucyBieSBzb3VyY2UgbmFtZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuVHlwZVBhcmFtZXRlcj59IFt0eXBlUGFyYW1ldGVyc10gLSBEZWNsYXJhdGlvbi1zY29wZWQgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIHt7aW1tdXRhYmxlOiBib29sZWFuLCB0eXBlOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gfCB1bmRlZmluZWR9IE1ldGFkYXRhIHdoZW4gcHJlc2VudC5cbiAqL1xuZnVuY3Rpb24gbG9jYWxNZXRhZGF0YShub2RlLCBuYW1lLCBmaWxlbmFtZSwgc291cmNlLCByZWNvcmROYW1lcywgdHlwZVBhcmFtZXRlcnMgPSBuZXcgTWFwKCkpIHtcbiAgY29uc3QgY29tbWVudHMgPSBub2RlLmxlYWRpbmdDb21tZW50cyA/PyBbXVxuICBjb25zdCBjb21tZW50ID0gY29tbWVudHMuYXQoLTEpXG5cbiAgaWYgKCFjb21tZW50IHx8IGNvbW1lbnQua2luZCAhPSBcImNvbW1lbnRibG9ja1wiIHx8ICFjb21tZW50LmxvYyB8fCAhbm9kZS5sb2MpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBnYXAgPSBzb3VyY2Uuc2xpY2UoY29tbWVudC5sb2MuZW5kLm9mZnNldCwgbm9kZS5sb2Muc3RhcnQub2Zmc2V0KVxuXG4gIGlmICghL15cXHMqJC91LnRlc3QoZ2FwKSB8fCAoZ2FwLm1hdGNoKC9cXG4vZ3UpPy5sZW5ndGggPz8gMCkgPiAxKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3QgYmxvY2sgPSBwYXJzZUNvbW1lbnQoY29tbWVudC52YWx1ZSlbMF1cbiAgY29uc3QgdGFncyA9IGJsb2NrPy50YWdzID8/IFtdXG4gIGNvbnN0IHZhcmlhYmxlcyA9IHRhZ3MuZmlsdGVyKCh0YWcpID0+IHRhZy50YWcgPT0gXCJ2YXJcIilcbiAgY29uc3QgaW1tdXRhYmxlID0gdGFncy5maWx0ZXIoKHRhZykgPT4gdGFnLnRhZyA9PSBcInNlbWFudGlmb2xkLWltbXV0YWJsZVwiKVxuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gIGlmICh2YXJpYWJsZXMubGVuZ3RoID09IDAgJiYgaW1tdXRhYmxlLmxlbmd0aCA9PSAwKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3QgZXhhY3RWYXJpYWJsZSA9IHZhcmlhYmxlcy5sZW5ndGggPT0gMSAmJiB2YXJpYWJsZXNbMF0udHlwZSA9PSBcIlwiICYmIHZhcmlhYmxlc1swXS5kZXNjcmlwdGlvbiA9PSBgJCR7bmFtZX1gXG4gIGNvbnN0IGV4YWN0SW1tdXRhYmxlID0gaW1tdXRhYmxlLmxlbmd0aCA8PSAxICYmIGltbXV0YWJsZS5ldmVyeSgodGFnKSA9PiB0YWcubmFtZSA9PSBcIlwiICYmIHRhZy50eXBlID09IFwiXCIgJiYgdGFnLmRlc2NyaXB0aW9uID09IFwiXCIpXG4gIGNvbnN0IGtub3duVGFncyA9IHRhZ3MuZXZlcnkoKHRhZykgPT4gdGFnLnRhZyA9PSBcInZhclwiIHx8IHRhZy50YWcgPT0gXCJzZW1hbnRpZm9sZC1pbW11dGFibGVcIilcblxuICBpZiAoIWV4YWN0VmFyaWFibGUgfHwgIWV4YWN0SW1tdXRhYmxlIHx8ICFrbm93blRhZ3MpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJtYWxmb3JtZWQgbG9jYWwgdHlwZSBtZXRhZGF0YVwiLCBsb2NhdGlvbilcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaW1tdXRhYmxlOiBpbW11dGFibGUubGVuZ3RoID09IDEsXG4gICAgdHlwZTogZG9jdW1lbnRlZFZhbHVlVHlwZSh7XG4gICAgICBsYW5ndWFnZTogXCJwaHBcIixcbiAgICAgIGxvY2F0aW9uOiBjb21tZW50VGFnTG9jYXRpb24oY29tbWVudCwgdmFyaWFibGVzWzBdLCBcIm5hbWVcIiwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgICBvd25lckxvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgIHJlY29yZHM6IHJlY29yZE5hbWVzLFxuICAgICAgc291cmNlLFxuICAgICAgc291cmNlVHlwZTogdmFyaWFibGVzWzBdLm5hbWUsXG4gICAgICBzdWJqZWN0OiBgTG9jYWwgJyR7bmFtZX0nYCxcbiAgICAgIHR5cGVQYXJhbWV0ZXJzXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIG9uZSBQSFAgbG9jYWwgZGVjbGFyYXRpb24gb3IgYXNzaWdubWVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Ob2RlfSBub2RlIC0gUEhQIHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge1BocENvbnZlcnNpb25Db250ZXh0fSBjb250ZXh0IC0gVHlwZWQgY29udmVyc2lvbiBjb250ZXh0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkxvY2FsU3RhdGVtZW50IHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnR9IFNlbWFudGljIGxvY2FsIG9yIHByaXZhdGUtZmllbGQgc3RhdGVtZW50LlxuICovXG5mdW5jdGlvbiBjb252ZXJ0TG9jYWxTdGF0ZW1lbnQobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gIGlmIChub2RlLmtpbmQgIT0gXCJleHByZXNzaW9uc3RhdGVtZW50XCIpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBub2RlLmtpbmQsIGxvY2F0aW9uKVxuXG4gIGNvbnN0IGV4cHJlc3Npb24gPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRXhwcmVzc2lvblN0YXRlbWVudH0gKi8gKG5vZGUpLmV4cHJlc3Npb25cblxuICBpZiAoZXhwcmVzc2lvbi5raW5kICE9IFwiYXNzaWduXCIpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBleHByZXNzaW9uLmtpbmQsIG5vZGVMb2NhdGlvbihleHByZXNzaW9uLCBmaWxlbmFtZSwgc291cmNlKSlcblxuICBjb25zdCBhc3NpZ25tZW50ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkFzc2lnbn0gKi8gKGV4cHJlc3Npb24pXG5cbiAgaWYgKGFzc2lnbm1lbnQub3BlcmF0b3IgIT0gXCI9XCIpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBgYXNzaWdubWVudCAke2Fzc2lnbm1lbnQub3BlcmF0b3J9YCwgbG9jYXRpb24pXG4gIGlmIChhc3NpZ25tZW50LmxlZnQua2luZCA9PSBcInByb3BlcnR5bG9va3VwXCIgJiYgY29udGV4dC5jdXJyZW50Q2xhc3MpIHtcbiAgICBjb25zdCBsb29rdXAgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuUHJvcGVydHlMb29rdXB9ICovIChhc3NpZ25tZW50LmxlZnQpXG4gICAgY29uc3QgcmVjZWl2ZXIgPSBsb29rdXAud2hhdC5raW5kID09IFwidmFyaWFibGVcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5WYXJpYWJsZX0gKi8gKGxvb2t1cC53aGF0KSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IG1lbWJlciA9IGxvb2t1cC5vZmZzZXQua2luZCA9PSBcImlkZW50aWZpZXJcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZGVudGlmaWVyfSAqLyAobG9va3VwLm9mZnNldCkgOiB1bmRlZmluZWRcbiAgICBjb25zdCBmaWVsZCA9IHJlY2VpdmVyPy5uYW1lID09IFwidGhpc1wiICYmIG1lbWJlciAmJiB0eXBlb2YgbWVtYmVyLm5hbWUgPT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb250ZXh0LmN1cnJlbnRDbGFzcy5maWVsZHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUubmFtZSA9PSBtZW1iZXIubmFtZSlcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICBpZiAoIWZpZWxkKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJwcml2YXRlIGZpZWxkIHdyaXRlIG91dHNpZGUgdGhlIGRlY2xhcmluZyByZWNlaXZlclwiLCBub2RlTG9jYXRpb24oYXNzaWdubWVudC5sZWZ0LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7ZXhwcmVzc2lvbjogY29udmVydEV4cHJlc3Npb24oYXNzaWdubWVudC5yaWdodCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCwgZmllbGQudHlwZSksXG4gICAgICBmaWVsZDogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChmaWVsZC5pZCksIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50XCIpLCBsb2NhdGlvbixcbiAgICAgIHJlY2VpdmVyOiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY2VpdmVyRXhwcmVzc2lvbn0gKi8gKFxuICAgICAgICBjb252ZXJ0RXhwcmVzc2lvbihsb29rdXAud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCkpfSxcbiAgICB7bWVtYmVyOiBub2RlTG9jYXRpb24oLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklkZW50aWZpZXJ9ICovIChtZW1iZXIpLCBmaWxlbmFtZSwgc291cmNlKSwgb3BlcmF0b3I6IHRva2VuTG9jYXRpb24oXCI9XCIsIGFzc2lnbm1lbnQubGVmdC5sb2M/LmVuZC5vZmZzZXQgPz8gMCxcbiAgICAgIGFzc2lnbm1lbnQucmlnaHQubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICB9XG4gIGlmIChhc3NpZ25tZW50LmxlZnQua2luZCAhPSBcInZhcmlhYmxlXCIpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBhc3NpZ25tZW50LmxlZnQua2luZCwgbm9kZUxvY2F0aW9uKGFzc2lnbm1lbnQubGVmdCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIGlmIChhc3NpZ25tZW50LnJpZ2h0LmtpbmQgPT0gXCJ0aHJvd1wiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwidGhyb3cgZXhwcmVzc2lvbiBpbiBhIHZhbHVlIGNvbnRleHRcIiwgbm9kZUxvY2F0aW9uKGFzc2lnbm1lbnQucmlnaHQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG5cbiAgY29uc3QgdmFyaWFibGUgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVmFyaWFibGV9ICovIChhc3NpZ25tZW50LmxlZnQpXG4gIGNvbnN0IHRhcmdldExvY2F0aW9uID0gbm9kZUxvY2F0aW9uKHZhcmlhYmxlLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gIGlmICh0eXBlb2YgdmFyaWFibGUubmFtZSAhPSBcInN0cmluZ1wiIHx8IHZhcmlhYmxlLmN1cmx5KSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkeW5hbWljIHZhcmlhYmxlXCIsIHRhcmdldExvY2F0aW9uKVxuXG4gIGNvbnN0IG1ldGFkYXRhID0gbG9jYWxNZXRhZGF0YShub2RlLCB2YXJpYWJsZS5uYW1lLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LnJlY29yZE5hbWVzLCBjb250ZXh0LnR5cGVQYXJhbWV0ZXJzKVxuXG4gIGlmIChtZXRhZGF0YSkge1xuICAgIGxldCBkZWNsYXJlZFR5cGUgPSBtZXRhZGF0YS50eXBlXG4gICAgbGV0IG9yZGVyZWQgPSBmYWxzZVxuXG4gICAgaWYgKGRlY2xhcmVkVHlwZS5raW5kID09IFwiTWFwVHlwZVwiICYmIGNvbnRleHQub3JkZXJlZE1hcERlY2xhcmF0aW9ucz8uaGFzKGFzc2lnbm1lbnQpICYmIGFzc2lnbm1lbnQucmlnaHQua2luZCA9PSBcImFycmF5XCIpIHtcbiAgICAgIGRlY2xhcmVkVHlwZSA9IG9yZGVyZWRNYXBUeXBlRnJvbU1hcChkZWNsYXJlZFR5cGUsIGxvY2F0aW9uKVxuICAgICAgb3JkZXJlZCA9IHRydWVcbiAgICB9XG4gICAgY29uc3QgaW5pdGlhbGl6ZXIgPSBjb252ZXJ0RXhwcmVzc2lvbihhc3NpZ25tZW50LnJpZ2h0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCBkZWNsYXJlZFR5cGUpXG5cbiAgICBjb250ZXh0LmJpbmRpbmdzLnNldCh2YXJpYWJsZS5uYW1lLCBkZWNsYXJlZFR5cGUpXG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgaW5pdGlhbGl6ZXIsXG4gICAgICBraW5kOiBcIkxvY2FsRGVjbGFyYXRpb25cIixcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgbXV0YWJsZTogb3JkZXJlZCA/IGZhbHNlIDogIW1ldGFkYXRhLmltbXV0YWJsZSxcbiAgICAgIG5hbWU6IHZhcmlhYmxlLm5hbWUsXG4gICAgICB0eXBlOiBkZWNsYXJlZFR5cGVcbiAgICB9LCB7XG4gICAgICBuYW1lOiB0YXJnZXRMb2NhdGlvbixcbiAgICAgIG9wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKFwiPVwiLCBhc3NpZ25tZW50LmxlZnQubG9jPy5lbmQub2Zmc2V0ID8/IDAsIGFzc2lnbm1lbnQucmlnaHQubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgaW5mZXJyZWRUeXBlID0ga25vd25FeHByZXNzaW9uVHlwZShhc3NpZ25tZW50LnJpZ2h0LCBjb250ZXh0KVxuXG4gIGlmIChpbmZlcnJlZFR5cGU/LmtpbmQgPT0gXCJSZWNvcmRUeXBlXCIgfHwgaW5mZXJyZWRUeXBlPy5raW5kID09IFwiUmVmZXJlbmNlVHlwZVwiIHx8XG4gICAgaW5mZXJyZWRUeXBlPy5raW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIikge1xuICAgIGNvbnN0IGluaXRpYWxpemVyID0gY29udmVydEV4cHJlc3Npb24oYXNzaWdubWVudC5yaWdodCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCwgaW5mZXJyZWRUeXBlKVxuXG4gICAgY29udGV4dC5iaW5kaW5ncy5zZXQodmFyaWFibGUubmFtZSwgaW5mZXJyZWRUeXBlKVxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGluaXRpYWxpemVyLFxuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiTG9jYWxEZWNsYXJhdGlvblwiKSxcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgbXV0YWJsZTogZmFsc2UsXG4gICAgICBuYW1lOiB2YXJpYWJsZS5uYW1lLFxuICAgICAgdHlwZTogaW5mZXJyZWRUeXBlXG4gICAgfSwge1xuICAgICAgbmFtZTogdGFyZ2V0TG9jYXRpb24sXG4gICAgICBvcGVyYXRvcjogdG9rZW5Mb2NhdGlvbihcIj1cIiwgYXNzaWdubWVudC5sZWZ0LmxvYz8uZW5kLm9mZnNldCA/PyAwLCBhc3NpZ25tZW50LnJpZ2h0LmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IGJpbmRpbmdUeXBlID0gY29udGV4dC5iaW5kaW5ncy5nZXQodmFyaWFibGUubmFtZSlcblxuICBpZiAoIWJpbmRpbmdUeXBlKSByZXR1cm4gbWlzc2luZ1R5cGUoXCJwaHBcIiwgYExvY2FsICcke3ZhcmlhYmxlLm5hbWV9J2AsIGxvY2F0aW9uKVxuXG4gIGNvbnN0IHRhcmdldCA9IHdpdGhQYXJzZXJSYW5nZXMoe2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIklkZW50aWZpZXJFeHByZXNzaW9uXCIpLCBsb2NhdGlvbjogdGFyZ2V0TG9jYXRpb24sIG5hbWU6IHZhcmlhYmxlLm5hbWV9LCB7XG4gICAgbmFtZTogdGFyZ2V0TG9jYXRpb25cbiAgfSlcbiAgY29uc3QgdmFsdWUgPSBjb252ZXJ0RXhwcmVzc2lvbihhc3NpZ25tZW50LnJpZ2h0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LFxuICAgIGJpbmRpbmdUeXBlLmtpbmQgPT0gXCJFcnJvclR5cGVcIiA/IHVuZGVmaW5lZCA6IGJpbmRpbmdUeXBlKVxuXG4gIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICBleHByZXNzaW9uOiB2YWx1ZSxcbiAgICBraW5kOiBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIixcbiAgICBsb2NhdGlvbixcbiAgICB0YXJnZXRcbiAgfSwge1xuICAgIG9wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKFwiPVwiLCBhc3NpZ25tZW50LmxlZnQubG9jPy5lbmQub2Zmc2V0ID8/IDAsIGFzc2lnbm1lbnQucmlnaHQubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgfSlcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBvbmUgZXhoYXVzdGl2ZSBQSFAgc3RhdGVtZW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5vZGV9IG5vZGUgLSBQSFAgc3RhdGVtZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEBwYXJhbSB7UGhwQ29udmVyc2lvbkNvbnRleHR9IGNvbnRleHQgLSBUeXBlZCBjb252ZXJzaW9uIGNvbnRleHQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU3RhdGVtZW50fSBTZW1hbnRpYyBzdGF0ZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRTdGF0ZW1lbnQobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCkge1xuICBpZiAobm9kZS5raW5kID09IFwicmV0dXJuXCIpIHJldHVybiBjb252ZXJ0UmV0dXJuKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gIGlmIChub2RlLmtpbmQgPT0gXCJpZlwiKSByZXR1cm4gY29udmVydElmKC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZn0gKi8gKG5vZGUpLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KVxuICBpZiAobm9kZS5raW5kID09IFwidGhyb3dcIikgcmV0dXJuIGNvbnZlcnRQaHBSYWlzZShub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KVxuICBpZiAobm9kZS5raW5kID09IFwidHJ5XCIpIHJldHVybiBjb252ZXJ0UGhwVHJ5KG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gIGlmIChub2RlLmtpbmQgPT0gXCJ3aGlsZVwiKSByZXR1cm4gY29udmVydFdoaWxlKC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5XaGlsZX0gKi8gKG5vZGUpLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KVxuICBpZiAobm9kZS5raW5kID09IFwiZm9yZWFjaFwiKSByZXR1cm4gY29udmVydEZvckVhY2goLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkZvcmVhY2h9ICovIChub2RlKSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dClcbiAgaWYgKG5vZGUua2luZCA9PSBcImJyZWFrXCIgfHwgbm9kZS5raW5kID09IFwiY29udGludWVcIikge1xuICAgIGNvbnN0IGNvbnRyb2wgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuQnJlYWsgfCBpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkNvbnRpbnVlfSAqLyAobm9kZSlcblxuICAgIGlmIChjb250cm9sLmxldmVsKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYCR7bm9kZS5raW5kfSBsZXZlbGAsIG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICBjb25zdCBsb2NhdGlvbiA9IHRva2VuTG9jYXRpb24obm9kZS5raW5kLCBub2RlLmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIG5vZGUubG9jPy5lbmQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICBraW5kOiAvKiogQHR5cGUge1wiQnJlYWtTdGF0ZW1lbnRcIiB8IFwiQ29udGludWVTdGF0ZW1lbnRcIn0gKi8gKG5vZGUua2luZCA9PSBcImJyZWFrXCIgPyBcIkJyZWFrU3RhdGVtZW50XCIgOiBcIkNvbnRpbnVlU3RhdGVtZW50XCIpLFxuICAgICAgbG9jYXRpb25cbiAgICB9LCB7a2V5d29yZDogbG9jYXRpb259KVxuICB9XG4gIGlmIChub2RlLmtpbmQgPT0gXCJlY2hvXCIpIHJldHVybiBjb252ZXJ0UHJpbnQoLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkVjaG99ICovIChub2RlKSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dClcbiAgaWYgKG5vZGUua2luZCA9PSBcImV4cHJlc3Npb25zdGF0ZW1lbnRcIikge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRXhwcmVzc2lvblN0YXRlbWVudH0gKi8gKG5vZGUpLmV4cHJlc3Npb25cblxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJjYWxsXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV4cHJlc3Npb246IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2FsbEV4cHJlc3Npb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5NZXRob2RDYWxsRXhwcmVzc2lvbn0gKi8gKFxuICAgICAgICAgIGNvbnZlcnRFeHByZXNzaW9uKGV4cHJlc3Npb24sIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gICAgICAgICksXG4gICAgICAgIGtpbmQ6IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiLFxuICAgICAgICBsb2NhdGlvbjogbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnZlcnRMb2NhbFN0YXRlbWVudChub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KVxuICB9XG5cbiAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIG5vZGUua2luZCwgbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGV4YWN0IGB0aHJvdyBuZXcgRGVjbGFyZWRFcnJvcihtZXNzYWdlKWAuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZX0gbm9kZSAtIFBIUCB0aHJvdyBub2RlLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEBwYXJhbSB7UGhwQ29udmVyc2lvbkNvbnRleHR9IGNvbnRleHQgLSBUeXBlZCBsZXhpY2FsIGNvbnRleHQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmFpc2VTdGF0ZW1lbnR9IFNlbWFudGljIHJhaXNlLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0UGhwUmFpc2Uobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBjb25zdHJ1Y3Rpb24gPSBSZWZsZWN0LmdldChub2RlLCBcIndoYXRcIilcblxuICBpZiAoIWNvbnN0cnVjdGlvbiB8fCBjb25zdHJ1Y3Rpb24ua2luZCAhPSBcIm5ld1wiIHx8IGNvbnN0cnVjdGlvbi53aGF0Py5raW5kICE9IFwibmFtZVwiIHx8XG4gICAgY29uc3RydWN0aW9uLndoYXQucmVzb2x1dGlvbiAhPSBcInVxblwiIHx8ICFjb250ZXh0LmVycm9yTmFtZXMuaGFzKGNvbnN0cnVjdGlvbi53aGF0Lm5hbWUpIHx8XG4gICAgIUFycmF5LmlzQXJyYXkoY29uc3RydWN0aW9uLmFyZ3VtZW50cykgfHwgY29uc3RydWN0aW9uLmFyZ3VtZW50cy5sZW5ndGggIT0gMSB8fFxuICAgIGNvbnN0cnVjdGlvbi5hcmd1bWVudHNbMF0ua2luZCA9PSBcIm5hbWVkYXJndW1lbnRcIiB8fCBjb25zdHJ1Y3Rpb24uYXJndW1lbnRzWzBdLmtpbmQgPT0gXCJ2YXJpYWRpY1wiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwidGhyb3cgb3RoZXIgdGhhbiBleGFjdCBkZWNsYXJlZCBlcnJvciBjb25zdHJ1Y3Rpb25cIiwgbG9jYXRpb24pXG4gIH1cbiAgY29uc3QgZGVjbGFyYXRpb24gPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb259ICovIChjb250ZXh0LmVycm9yTmFtZXMuZ2V0KGNvbnN0cnVjdGlvbi53aGF0Lm5hbWUpKVxuICBjb25zdCB0eXBlTG9jYXRpb24gPSBub2RlTG9jYXRpb24oY29uc3RydWN0aW9uLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgIGVycm9yOiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGVycm9yOiB3aXRoUGFyc2VyUmFuZ2VzKHtkZWNsYXJhdGlvbklkOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiRXJyb3JUeXBlXCIpfSwge3R5cGU6IHR5cGVMb2NhdGlvbn0pLFxuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiRXJyb3JDb25zdHJ1Y3Rpb25cIiksXG4gICAgICBsb2NhdGlvbjogbm9kZUxvY2F0aW9uKGNvbnN0cnVjdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgICBtZXNzYWdlOiBjb252ZXJ0RXhwcmVzc2lvbihjb25zdHJ1Y3Rpb24uYXJndW1lbnRzWzBdLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KVxuICAgIH0sIHt0eXBlOiB0eXBlTG9jYXRpb259KSxcbiAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJSYWlzZVN0YXRlbWVudFwiKSxcbiAgICBsb2NhdGlvblxuICB9LCB7a2V5d29yZDogdG9rZW5Mb2NhdGlvbihcInRocm93XCIsIG5vZGUubG9jPy5zdGFydC5vZmZzZXQgPz8gMCwgY29uc3RydWN0aW9uLmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBvbmUgZXhhY3QgdHlwZWQgY2F0Y2ggd2l0aCBubyBmaW5hbGx5LlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5vZGV9IG5vZGUgLSBQSFAgdHJ5IG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGxleGljYWwgY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5UcnlTdGF0ZW1lbnR9IFNlbWFudGljIGV4YWN0IGhhbmRsZXIuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRQaHBUcnkobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBjYXRjaGVzID0gUmVmbGVjdC5nZXQobm9kZSwgXCJjYXRjaGVzXCIpXG4gIGNvbnN0IGJvZHkgPSBSZWZsZWN0LmdldChub2RlLCBcImJvZHlcIilcblxuICBpZiAoUmVmbGVjdC5nZXQobm9kZSwgXCJhbHdheXNcIikgfHwgIUFycmF5LmlzQXJyYXkoY2F0Y2hlcykgfHwgY2F0Y2hlcy5sZW5ndGggIT0gMSB8fCBib2R5Py5raW5kICE9IFwiYmxvY2tcIikge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInRyeSB3aXRob3V0IG9uZSB0eXBlZCBjYXRjaCBhbmQgbm8gZmluYWxseVwiLCBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBoYW5kbGVyID0gY2F0Y2hlc1swXVxuICBjb25zdCBjYXVnaHQgPSBoYW5kbGVyLndoYXQ/LlswXVxuICBjb25zdCBiaW5kaW5nID0gaGFuZGxlci52YXJpYWJsZVxuXG4gIGlmIChoYW5kbGVyLndoYXQ/Lmxlbmd0aCAhPSAxIHx8IGNhdWdodD8ua2luZCAhPSBcIm5hbWVcIiB8fCBjYXVnaHQucmVzb2x1dGlvbiAhPSBcInVxblwiIHx8XG4gICAgIWNvbnRleHQuZXJyb3JOYW1lcy5oYXMoY2F1Z2h0Lm5hbWUpIHx8IGJpbmRpbmc/LmtpbmQgIT0gXCJ2YXJpYWJsZVwiIHx8IHR5cGVvZiBiaW5kaW5nLm5hbWUgIT0gXCJzdHJpbmdcIiB8fFxuICAgIGJpbmRpbmcuY3VybHkgfHwgaGFuZGxlci5ib2R5Py5raW5kICE9IFwiYmxvY2tcIikge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImJyb2FkLCBtdWx0aXBsZSwgb3IgbWFsZm9ybWVkIGNhdGNoXCIsIG5vZGVMb2NhdGlvbihoYW5kbGVyLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBjb25zdCBkZWNsYXJhdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbn0gKi8gKGNvbnRleHQuZXJyb3JOYW1lcy5nZXQoY2F1Z2h0Lm5hbWUpKVxuICBjb25zdCBjYXVnaHRMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihjYXVnaHQsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IGNhdGNoVHlwZSA9IHdpdGhQYXJzZXJSYW5nZXMoe2RlY2xhcmF0aW9uSWQ6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJFcnJvclR5cGVcIil9LCB7XG4gICAgdHlwZTogY2F1Z2h0TG9jYXRpb25cbiAgfSlcbiAgY29uc3QgYm9keUNvbnRleHQgPSB7Li4uY29udGV4dCwgYmluZGluZ3M6IG5ldyBNYXAoY29udGV4dC5iaW5kaW5ncyl9XG4gIGNvbnN0IGNhdGNoQ29udGV4dCA9IHsuLi5jb250ZXh0LCBiaW5kaW5nczogbmV3IE1hcChjb250ZXh0LmJpbmRpbmdzKX1cblxuICBjYXRjaENvbnRleHQuYmluZGluZ3Muc2V0KGJpbmRpbmcubmFtZSwgY2F0Y2hUeXBlKVxuICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgYm9keTogY29udmVydEJsb2NrKGJvZHksIGZpbGVuYW1lLCBzb3VyY2UsIGJvZHlDb250ZXh0KSxcbiAgICBjYXRjaEJpbmRpbmc6IHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiQ2F0Y2hCaW5kaW5nXCIpLFxuICAgICAgbG9jYXRpb246IG5vZGVMb2NhdGlvbihiaW5kaW5nLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIG11dGFibGU6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChmYWxzZSksXG4gICAgICBuYW1lOiBiaW5kaW5nLm5hbWUsXG4gICAgICB0eXBlOiBjYXRjaFR5cGVcbiAgICB9LCB7bmFtZTogbm9kZUxvY2F0aW9uKGJpbmRpbmcsIGZpbGVuYW1lLCBzb3VyY2UpfSksXG4gICAgY2F0Y2hCb2R5OiBjb252ZXJ0QmxvY2soaGFuZGxlci5ib2R5LCBmaWxlbmFtZSwgc291cmNlLCBjYXRjaENvbnRleHQpLFxuICAgIGNhdGNoVHlwZSxcbiAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJUcnlTdGF0ZW1lbnRcIiksXG4gICAgbG9jYXRpb25cbiAgfSwge2NhdGNoOiBub2RlTG9jYXRpb24oaGFuZGxlciwgZmlsZW5hbWUsIHNvdXJjZSksIHRyeTogdG9rZW5Mb2NhdGlvbihcInRyeVwiLCBub2RlLmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIGJvZHkubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGV4YWN0IGJsb2NrLWZvcm0gUEhQIGBmb3JlYWNoICgkbGlzdCBhcyAkdmFsdWUpYC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Gb3JlYWNofSBub2RlIC0gUEhQIGZvcmVhY2ggbm9kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge1BocENvbnZlcnNpb25Db250ZXh0fSBjb250ZXh0IC0gVHlwZWQgY29udmVyc2lvbiBjb250ZXh0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkZvckVhY2hTdGF0ZW1lbnQgfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Gb3JFYWNoTWFwU3RhdGVtZW50fSBTZW1hbnRpYyBsb29wLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0Rm9yRWFjaChub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKG5vZGUuc2hvcnRGb3JtKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJhbHRlcm5hdGl2ZSBmb3JlYWNoIHN5bnRheFwiLCBsb2NhdGlvbilcbiAgaWYgKG5vZGUudmFsdWUua2luZCAhPSBcInZhcmlhYmxlXCIpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImZvcmVhY2ggZGVzdHJ1Y3R1cmluZ1wiLCBub2RlTG9jYXRpb24obm9kZS52YWx1ZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIGNvbnN0IHZhcmlhYmxlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlZhcmlhYmxlfSAqLyAobm9kZS52YWx1ZSlcblxuICBpZiAoUmVmbGVjdC5nZXQodmFyaWFibGUsIFwiYnlyZWZcIikgPT09IHRydWUpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImJ5LXJlZmVyZW5jZSBmb3JlYWNoXCIsIG5vZGVMb2NhdGlvbih2YXJpYWJsZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIGlmICh0eXBlb2YgdmFyaWFibGUubmFtZSAhPSBcInN0cmluZ1wiIHx8IHZhcmlhYmxlLmN1cmx5KSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkeW5hbWljIGZvcmVhY2ggYmluZGluZ1wiLCBub2RlTG9jYXRpb24odmFyaWFibGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICBpZiAoIW5vZGUuYm9keSB8fCBub2RlLmJvZHkua2luZCAhPSBcImJsb2NrXCIpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJmb3JlYWNoIHdpdGhvdXQgYmxvY2sgYm9keVwiLCBub2RlLmJvZHkgPyBub2RlTG9jYXRpb24obm9kZS5ib2R5LCBmaWxlbmFtZSwgc291cmNlKSA6IGxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IGJvZHkgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuQmxvY2t9ICovIChub2RlLmJvZHkpXG4gIGNvbnN0IGNvbGxlY3Rpb25UeXBlID0gaXRlcmF0aW9uT3BlcmFuZFR5cGUoa25vd25FeHByZXNzaW9uVHlwZShub2RlLnNvdXJjZSwgY29udGV4dCkpXG5cbiAgaWYgKG5vZGUua2V5KSB7XG4gICAgaWYgKG5vZGUua2V5LmtpbmQgIT0gXCJ2YXJpYWJsZVwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJmb3JlYWNoIGtleSBiaW5kaW5nIHNoYXBlXCIsIG5vZGVMb2NhdGlvbihub2RlLmtleSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgY29uc3Qga2V5VmFyaWFibGUgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVmFyaWFibGV9ICovIChub2RlLmtleSlcblxuICAgIGlmIChSZWZsZWN0LmdldChrZXlWYXJpYWJsZSwgXCJieXJlZlwiKSA9PT0gdHJ1ZSB8fCB0eXBlb2Yga2V5VmFyaWFibGUubmFtZSAhPSBcInN0cmluZ1wiIHx8IGtleVZhcmlhYmxlLmN1cmx5KSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJpbnZhbGlkIGZvcmVhY2gga2V5IGJpbmRpbmdcIiwgbm9kZUxvY2F0aW9uKGtleVZhcmlhYmxlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG4gICAgaWYgKGNvbGxlY3Rpb25UeXBlPy5raW5kID09IFwiTWFwVHlwZVwiKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJ1bm9yZGVyZWQgbWFwIGl0ZXJhdGlvblwiLCBub2RlTG9jYXRpb24obm9kZS5zb3VyY2UsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICBpZiAoIWNvbGxlY3Rpb25UeXBlIHx8IGNvbGxlY3Rpb25UeXBlLmtpbmQgIT0gXCJPcmRlcmVkTWFwVHlwZVwiKSB7XG4gICAgICByZXR1cm4gbWlzc2luZ1R5cGUoXCJwaHBcIiwgXCJPcmRlcmVkIG1hcCBpdGVyYXRpb24gY29sbGVjdGlvblwiLCBub2RlTG9jYXRpb24obm9kZS5zb3VyY2UsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICBjb25zdCBrZXlMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihrZXlWYXJpYWJsZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICBjb25zdCB2YWx1ZUxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKHZhcmlhYmxlLCBmaWxlbmFtZSwgc291cmNlKVxuICAgIGNvbnN0IGtleVR5cGUgPSBpdGVyYXRpb25CaW5kaW5nVHlwZShjb2xsZWN0aW9uVHlwZS5rZXlUeXBlLCBrZXlMb2NhdGlvbilcbiAgICBjb25zdCB2YWx1ZVR5cGUgPSBpdGVyYXRpb25CaW5kaW5nVHlwZShjb2xsZWN0aW9uVHlwZS52YWx1ZVR5cGUsIHZhbHVlTG9jYXRpb24pXG4gICAgY29uc3Qga2V5QmluZGluZyA9IHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiVmFsdWVCaW5kaW5nXCIpLCBsb2NhdGlvbjoga2V5TG9jYXRpb24sIG11dGFibGU6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChmYWxzZSksXG4gICAgICBuYW1lOiBrZXlWYXJpYWJsZS5uYW1lLCB0eXBlOiBrZXlUeXBlXG4gICAgfSwge25hbWU6IGtleUxvY2F0aW9ufSlcbiAgICBjb25zdCB2YWx1ZUJpbmRpbmcgPSB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlZhbHVlQmluZGluZ1wiKSwgbG9jYXRpb246IHZhbHVlTG9jYXRpb24sIG11dGFibGU6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChmYWxzZSksXG4gICAgICBuYW1lOiB2YXJpYWJsZS5uYW1lLCB0eXBlOiB2YWx1ZVR5cGVcbiAgICB9LCB7bmFtZTogdmFsdWVMb2NhdGlvbn0pXG4gICAgY29uc3QgYm9keUNvbnRleHQgPSB7Li4uY29udGV4dCwgYmluZGluZ3M6IG5ldyBNYXAoY29udGV4dC5iaW5kaW5ncyl9XG5cbiAgICBib2R5Q29udGV4dC5iaW5kaW5ncy5zZXQoa2V5VmFyaWFibGUubmFtZSwga2V5VHlwZSlcbiAgICBib2R5Q29udGV4dC5iaW5kaW5ncy5zZXQodmFyaWFibGUubmFtZSwgdmFsdWVUeXBlKVxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGJvZHk6IGNvbnZlcnRCbG9jayhib2R5LCBmaWxlbmFtZSwgc291cmNlLCBib2R5Q29udGV4dCksXG4gICAgICBrZXlCaW5kaW5nLFxuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiRm9yRWFjaE1hcFN0YXRlbWVudFwiKSxcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgbWFwOiBjb252ZXJ0RXhwcmVzc2lvbihub2RlLnNvdXJjZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCksXG4gICAgICB2YWx1ZUJpbmRpbmdcbiAgICB9LCB7b3BlcmF0b3I6IHRva2VuTG9jYXRpb24oXCJmb3JlYWNoXCIsIG5vZGUubG9jPy5zdGFydC5vZmZzZXQgPz8gMCwgbm9kZS5zb3VyY2UubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCxcbiAgICAgIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgfVxuXG4gIGlmIChjb2xsZWN0aW9uVHlwZT8ua2luZCA9PSBcIk1hcFR5cGVcIiB8fCBjb2xsZWN0aW9uVHlwZT8ua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJtYXAgaXRlcmF0aW9uIHdpdGhvdXQga2V5L3ZhbHVlIHBhaXIgYmluZGluZ1wiLCBub2RlTG9jYXRpb24obm9kZS5zb3VyY2UsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG4gIGlmICghY29sbGVjdGlvblR5cGUgfHwgY29sbGVjdGlvblR5cGUua2luZCAhPSBcIkxpc3RUeXBlXCIpIHtcbiAgICByZXR1cm4gbWlzc2luZ1R5cGUoXCJwaHBcIiwgXCJJdGVyYXRpb24gY29sbGVjdGlvblwiLCBub2RlTG9jYXRpb24obm9kZS5zb3VyY2UsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG4gIGNvbnN0IGJpbmRpbmdMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbih2YXJpYWJsZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgaW5mZXJyZWRUeXBlID0gY29sbGVjdGlvblR5cGUuZWxlbWVudFR5cGVcbiAgY29uc3QgYmluZGluZ1R5cGUgPSBpdGVyYXRpb25CaW5kaW5nVHlwZShpbmZlcnJlZFR5cGUsIGJpbmRpbmdMb2NhdGlvbilcbiAgY29uc3QgdmFsdWVCaW5kaW5nID0gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiVmFsdWVCaW5kaW5nXCIpLFxuICAgIGxvY2F0aW9uOiBiaW5kaW5nTG9jYXRpb24sXG4gICAgbXV0YWJsZTogLyoqIEB0eXBlIHtjb25zdH0gKi8gKGZhbHNlKSxcbiAgICBuYW1lOiB2YXJpYWJsZS5uYW1lLFxuICAgIHR5cGU6IGJpbmRpbmdUeXBlXG4gIH0sIHtuYW1lOiBiaW5kaW5nTG9jYXRpb259KVxuICBjb25zdCBib2R5Q29udGV4dCA9IHsuLi5jb250ZXh0LCBiaW5kaW5nczogbmV3IE1hcChjb250ZXh0LmJpbmRpbmdzKX1cblxuICBib2R5Q29udGV4dC5iaW5kaW5ncy5zZXQodmFyaWFibGUubmFtZSwgYmluZGluZ1R5cGUpXG4gIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICBib2R5OiBjb252ZXJ0QmxvY2soYm9keSwgZmlsZW5hbWUsIHNvdXJjZSwgYm9keUNvbnRleHQpLFxuICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkZvckVhY2hTdGF0ZW1lbnRcIiksXG4gICAgbGlzdDogY29udmVydEV4cHJlc3Npb24obm9kZS5zb3VyY2UsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpLFxuICAgIGxvY2F0aW9uLFxuICAgIHZhbHVlQmluZGluZ1xuICB9LCB7b3BlcmF0b3I6IHRva2VuTG9jYXRpb24oXCJmb3JlYWNoXCIsIG5vZGUubG9jPy5zdGFydC5vZmZzZXQgPz8gMCwgbm9kZS5zb3VyY2UubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9yZGVyZWQgUEhQIGJsb2NrIHdpdGggaXRzIG93biBhZGFwdGF0aW9uIHNjb3BlLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJsb2NrfSBub2RlIC0gUEhQIHBhcnNlciBibG9jay5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge1BocENvbnZlcnNpb25Db250ZXh0fSBjb250ZXh0IC0gVHlwZWQgY29udmVyc2lvbiBjb250ZXh0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkJsb2NrfSBTZW1hbnRpYyBibG9jay5cbiAqL1xuZnVuY3Rpb24gY29udmVydEJsb2NrKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpIHtcbiAgcmV0dXJuIHtcbiAgICBraW5kOiBcIkJsb2NrXCIsXG4gICAgbG9jYXRpb246IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICBzdGF0ZW1lbnRzOiBub2RlLmNoaWxkcmVuLm1hcCgoc3RhdGVtZW50KSA9PiBjb252ZXJ0U3RhdGVtZW50KHN0YXRlbWVudCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCkpXG4gIH1cbn1cblxuLyoqXG4gKiBSZXF1aXJlcyBhbiBleGFjdCBQSFAgc2NhbGFyIGRlY2xhcmF0aW9uIHR5cGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZSB8IG51bGx9IHNvdXJjZVR5cGUgLSBQSFAgdHlwZSBub2RlLlxuICogQHBhcmFtIHtzdHJpbmd9IHN1YmplY3QgLSBUeXBlZCBzdWJqZWN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uPn0gW3JlY29yZE5hbWVzXSAtIE5vbWluYWwgZGVjbGFyYXRpb25zIGJ5IHNvdXJjZSBuYW1lLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSBTZW1hbnRpYyB0eXBlLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0VHlwZShzb3VyY2VUeXBlLCBzdWJqZWN0LCBsb2NhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSwgcmVjb3JkTmFtZXMgPSBuZXcgTWFwKCkpIHtcbiAgaWYgKCFzb3VyY2VUeXBlKSByZXR1cm4gcmVxdWlyZVNvdXJjZVNjYWxhclR5cGUoXCJwaHBcIiwgdW5kZWZpbmVkLCBzdWJqZWN0LCBsb2NhdGlvbilcbiAgaWYgKHNvdXJjZVR5cGUua2luZCAhPSBcInR5cGVyZWZlcmVuY2VcIiAmJiBzb3VyY2VUeXBlLmtpbmQgIT0gXCJuYW1lXCIgJiYgc291cmNlVHlwZS5raW5kICE9IFwiaWRlbnRpZmllclwiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwidW5zdXBwb3J0ZWQgc2NhbGFyIHR5cGVcIiwgbm9kZUxvY2F0aW9uKHNvdXJjZVR5cGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG5cbiAgY29uc3QgdHlwZU5hbWUgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVHlwZVJlZmVyZW5jZSB8IGltcG9ydChcInBocC1wYXJzZXJcIikuTmFtZSB8IGltcG9ydChcInBocC1wYXJzZXJcIikuSWRlbnRpZmllcn0gKi8gKHNvdXJjZVR5cGUpLm5hbWVcblxuICBjb25zdCB0eXBlTG9jYXRpb24gPSBub2RlTG9jYXRpb24oc291cmNlVHlwZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgZGVjbGFyYXRpb24gPSByZWNvcmROYW1lcy5nZXQodHlwZU5hbWUpXG5cbiAgaWYgKGRlY2xhcmF0aW9uPy5pZCkgcmV0dXJuIGRlY2xhcmF0aW9uLmtpbmQgPT0gXCJDbGFzc0RlY2xhcmF0aW9uXCJcbiAgICA/IHJlZmVyZW5jZVR5cGUoZGVjbGFyYXRpb24uaWQsIHR5cGVMb2NhdGlvbilcbiAgICA6IGRlY2xhcmF0aW9uLmtpbmQgPT0gXCJFZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uXCJcbiAgICAgID8gb3duZWRSZXNvdXJjZVR5cGUoZGVjbGFyYXRpb24uaWQsIHR5cGVMb2NhdGlvbilcbiAgICAgIDogcmVjb3JkVHlwZShkZWNsYXJhdGlvbi5pZCwgdHlwZUxvY2F0aW9uKVxuXG4gIHJldHVybiByZXF1aXJlU291cmNlU2NhbGFyVHlwZShcInBocFwiLCB0eXBlTmFtZSwgc3ViamVjdCwgbG9jYXRpb24sIHR5cGVMb2NhdGlvbilcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgZXhhY3QgUEhQRG9jIGNvbnRhaW5lciBzaWduYXR1cmUgYXR0YWNoZWQgdG8gb25lIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkZ1bmN0aW9ufSBub2RlIC0gRnVuY3Rpb24gZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvd25lcklkXSAtIFN0YWJsZSBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHt7cGFyYW1ldGVyczogTWFwPHN0cmluZywge2xvY2F0aW9uOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiwgc291cmNlVHlwZTogc3RyaW5nfT4sIHJldHVyblR5cGU6IHtsb2NhdGlvbjogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIHNvdXJjZVR5cGU6IHN0cmluZ30gfCB1bmRlZmluZWQsIHR5cGVQYXJhbWV0ZXJzPzogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuVHlwZVBhcmFtZXRlcltdfX0gRG9jdW1lbnRlZCB0eXBlcy5cbiAqL1xuZnVuY3Rpb24gZnVuY3Rpb25Eb2N1bWVudGVkVHlwZXMobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgb3duZXJJZCkge1xuICBjb25zdCBjb21tZW50ID0gbm9kZS5sZWFkaW5nQ29tbWVudHM/LmF0KC0xKVxuXG4gIGlmICghY29tbWVudCB8fCBjb21tZW50LmtpbmQgIT0gXCJjb21tZW50YmxvY2tcIiB8fCAhY29tbWVudC5sb2MgfHwgIW5vZGUubG9jIHx8XG4gICAgIS9eXFxzKiQvdS50ZXN0KHNvdXJjZS5zbGljZShjb21tZW50LmxvYy5lbmQub2Zmc2V0LCBub2RlLmxvYy5zdGFydC5vZmZzZXQpKSkgcmV0dXJuIHtwYXJhbWV0ZXJzOiBuZXcgTWFwKCksIHJldHVyblR5cGU6IHVuZGVmaW5lZH1cbiAgY29uc3QgYmxvY2sgPSBwYXJzZUNvbW1lbnQoY29tbWVudC52YWx1ZSlbMF1cbiAgY29uc3QgdGFncyA9IGJsb2NrPy50YWdzID8/IFtdXG4gIGNvbnN0IHBhcmFtZXRlclRhZ3MgPSB0YWdzLmZpbHRlcigodGFnKSA9PiB0YWcudGFnID09IFwicGFyYW1cIilcbiAgY29uc3QgcmV0dXJuVGFncyA9IHRhZ3MuZmlsdGVyKCh0YWcpID0+IHRhZy50YWcgPT0gXCJyZXR1cm5cIiB8fCB0YWcudGFnID09IFwicmV0dXJuc1wiKVxuICBjb25zdCB0ZW1wbGF0ZVRhZ3MgPSB0YWdzLmZpbHRlcigodGFnKSA9PiB0YWcudGFnID09IFwidGVtcGxhdGVcIilcbiAgY29uc3QgbWFsZm9ybWVkVGVtcGxhdGUgPSB0YWdzLmZpbmQoKHRhZykgPT4gdGFnLnRhZy5zdGFydHNXaXRoKFwidGVtcGxhdGVcIikgJiYgdGFnLnRhZyAhPSBcInRlbXBsYXRlXCIpXG4gIGNvbnN0IG1hbGZvcm1lZCA9IHRhZ3Muc29tZSgodGFnKSA9PiAhW1wicGFyYW1cIiwgXCJyZXR1cm5cIiwgXCJyZXR1cm5zXCIsIFwidGVtcGxhdGVcIl0uaW5jbHVkZXModGFnLnRhZykpIHx8IHJldHVyblRhZ3MubGVuZ3RoID4gMSB8fFxuICAgIHBhcmFtZXRlclRhZ3Muc29tZSgodGFnKSA9PiB0YWcudHlwZSAhPSBcIlwiIHx8ICEvXlxcJFtBLVphLXpfXVtBLVphLXowLTlfXSokL3UudGVzdCh0YWcuZGVzY3JpcHRpb24pKSB8fFxuICAgIHJldHVyblRhZ3Muc29tZSgodGFnKSA9PiB0YWcudHlwZSAhPSBcIlwiIHx8IHRhZy5kZXNjcmlwdGlvbiAhPSBcIlwiKSB8fCBtYWxmb3JtZWRUZW1wbGF0ZSB8fFxuICAgIHRlbXBsYXRlVGFncy5zb21lKCh0YWcpID0+ICEvXltBLVphLXpfXVtBLVphLXowLTlfXSokL3UudGVzdCh0YWcubmFtZSkgfHwgdGFnLnR5cGUgIT0gXCJcIiB8fCB0YWcuZGVzY3JpcHRpb24gIT0gXCJcIikgfHxcbiAgICB0ZW1wbGF0ZVRhZ3MubGVuZ3RoID4gMCAmJiAhb3duZXJJZFxuXG4gIGlmIChtYWxmb3JtZWQpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm1hbGZvcm1lZCBmdW5jdGlvbiB0eXBlIGFubm90YXRpb25cIiwgbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICBjb25zdCBwYXJhbWV0ZXJzID0gbmV3IE1hcChwYXJhbWV0ZXJUYWdzLm1hcCgodGFnKSA9PiBbdGFnLmRlc2NyaXB0aW9uLnNsaWNlKDEpLCB7XG4gICAgbG9jYXRpb246IGNvbW1lbnRUYWdMb2NhdGlvbihjb21tZW50LCB0YWcsIFwibmFtZVwiLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICBzb3VyY2VUeXBlOiB0YWcubmFtZVxuICB9XSkpXG5cbiAgaWYgKHBhcmFtZXRlcnMuc2l6ZSAhPSBwYXJhbWV0ZXJUYWdzLmxlbmd0aCkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImR1cGxpY2F0ZSBwYXJhbWV0ZXIgYW5ub3RhdGlvblwiLCBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbiAgY29uc3QgcmV0dXJuVGFnID0gcmV0dXJuVGFnc1swXVxuICBjb25zdCB0eXBlUGFyYW1ldGVycyA9IHRlbXBsYXRlVGFncy5tYXAoKHRhZywgaW5kZXgpID0+IHtcbiAgICBjb25zdCBsb2NhdGlvbiA9IGNvbW1lbnRUYWdMb2NhdGlvbihjb21tZW50LCB0YWcsIFwibmFtZVwiLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2lkOiBgJHtvd25lcklkfTp0eXBlOiR7aW5kZXh9YCwga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiVHlwZVBhcmFtZXRlclwiKSwgbG9jYXRpb24sIG5hbWU6IHRhZy5uYW1lfSwge25hbWU6IGxvY2F0aW9ufSlcbiAgfSlcblxuICByZXR1cm4ge1xuICAgIHBhcmFtZXRlcnMsXG4gICAgcmV0dXJuVHlwZTogcmV0dXJuVGFnID8ge1xuICAgICAgbG9jYXRpb246IGNvbW1lbnRUYWdMb2NhdGlvbihjb21tZW50LCByZXR1cm5UYWcsIFwibmFtZVwiLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIHNvdXJjZVR5cGU6IHJldHVyblRhZy5uYW1lXG4gICAgfSA6IHVuZGVmaW5lZCxcbiAgICAuLi4odHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCA/IHt0eXBlUGFyYW1ldGVyc30gOiB7fSlcbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIGFuIG9wdGlvbmFsIGV4YWN0IGNsYXNzLWxldmVsIFBIUERvYyB0ZW1wbGF0ZSBsaXN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkNsYXNzfSBub2RlIC0gQ2xhc3MgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gb3duZXJJZCAtIFN0YWJsZSByZWNvcmQgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlR5cGVQYXJhbWV0ZXJbXSB8IHVuZGVmaW5lZH0gT3JkZXJlZCBwYXJhbWV0ZXJzLlxuICovXG5mdW5jdGlvbiBjbGFzc0RvY3VtZW50ZWRUeXBlUGFyYW1ldGVycyhub2RlLCBvd25lcklkLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGRvY3VtZW50ZWQgPSBmdW5jdGlvbkRvY3VtZW50ZWRUeXBlcyhcbiAgICAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRnVuY3Rpb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChub2RlKSksIGZpbGVuYW1lLCBzb3VyY2UsIG93bmVySWQpXG5cbiAgaWYgKGRvY3VtZW50ZWQucGFyYW1ldGVycy5zaXplIHx8IGRvY3VtZW50ZWQucmV0dXJuVHlwZSkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImZ1bmN0aW9uIHR5cGUgYW5ub3RhdGlvbiBvbiByZWNvcmQgZGVjbGFyYXRpb25cIiwgbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG5cbiAgcmV0dXJuIGRvY3VtZW50ZWQudHlwZVBhcmFtZXRlcnNcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbmF0aXZlIFBIUCB0eXBlIG5hbWUgZnJvbSBvbmUgc3VwcG9ydGVkIHBhcnNlciBub2RlLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5vZGUgfCBudWxsfSB0eXBlIC0gTmF0aXZlIHR5cGUgbm9kZS5cbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IFR5cGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gcGhwVHlwZU5hbWUodHlwZSkge1xuICBpZiAoIXR5cGUgfHwgIVtcInR5cGVyZWZlcmVuY2VcIiwgXCJuYW1lXCIsIFwiaWRlbnRpZmllclwiXS5pbmNsdWRlcyh0eXBlLmtpbmQpKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5UeXBlUmVmZXJlbmNlIHwgaW1wb3J0KFwicGhwLXBhcnNlclwiKS5OYW1lIHwgaW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZGVudGlmaWVyfSAqLyAodHlwZSkubmFtZVxufVxuXG4vKipcbiAqIFdyYXBzIG9uZSBwYXJzZXItZGVjbGFyZWQgY2Fub25pY2FsIFBIUCBudWxsYWJsZSB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gdmFsdWVUeXBlIC0gUHJlc2VudC12YWx1ZSBzZW1hbnRpYyB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5vZGV9IHNvdXJjZVR5cGUgLSBOYXRpdmUgcGFyc2VyIHR5cGUgbm9kZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBvd25lclN0YXJ0IC0gRWFybGllc3Qgb3duaW5nIHBhcnNlciBvZmZzZXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLk9wdGlvbmFsVHlwZX0gT3B0aW9uYWwgc2VtYW50aWMgdHlwZS5cbiAqL1xuZnVuY3Rpb24gbnVsbGFibGVUeXBlKHZhbHVlVHlwZSwgc291cmNlVHlwZSwgb3duZXJTdGFydCwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBpZiAoIXNvdXJjZVR5cGUubG9jKSB0aHJvdyBuZXcgRXJyb3IoXCJQSFAgcGFyc2VyIG9taXR0ZWQgbnVsbGFibGUgdHlwZSBsb2NhdGlvbi5cIilcbiAgY29uc3QgdmFsdWVMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihzb3VyY2VUeXBlLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBtYXJrZXIgPSB0b2tlbkxvY2F0aW9uKFwiP1wiLCBvd25lclN0YXJ0LCBzb3VyY2VUeXBlLmxvYy5zdGFydC5vZmZzZXQsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKG1hcmtlci5lbmQub2Zmc2V0ICE9IHZhbHVlTG9jYXRpb24uc3RhcnQub2Zmc2V0KSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibm9uY2Fub25pY2FsIG51bGxhYmxlIHR5cGVcIiwgbWFya2VyKVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbmFsVHlwZShcbiAgICB2YWx1ZVR5cGUsXG4gICAgbG9jYXRpb25Gcm9tT2Zmc2V0cyhmaWxlbmFtZSwgc291cmNlLCBtYXJrZXIuc3RhcnQub2Zmc2V0LCB2YWx1ZUxvY2F0aW9uLmVuZC5vZmZzZXQpLFxuICAgIHZhbHVlTG9jYXRpb25cbiAgKVxufVxuXG4vKipcbiAqIENvbnZlcnRzIG9uZSBleHBsaWNpdCBQSFAgZnVuY3Rpb24gcmV0dXJuIHR5cGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZSB8IG51bGx9IHNvdXJjZVR5cGUgLSBQSFAgcmV0dXJuIHR5cGUgbm9kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdWJqZWN0IC0gVHlwZWQgZnVuY3Rpb24gcmV0dXJuLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBGdW5jdGlvbiBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb24+fSBbcmVjb3JkTmFtZXNdIC0gTm9taW5hbCBkZWNsYXJhdGlvbnMgYnkgc291cmNlIG5hbWUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IFNlbWFudGljIHJldHVybiB0eXBlLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0UmV0dXJuVHlwZShzb3VyY2VUeXBlLCBzdWJqZWN0LCBsb2NhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSwgcmVjb3JkTmFtZXMgPSBuZXcgTWFwKCkpIHtcbiAgaWYgKCFzb3VyY2VUeXBlKSByZXR1cm4gcmVxdWlyZVNvdXJjZVJldHVyblR5cGUoXCJwaHBcIiwgdW5kZWZpbmVkLCBzdWJqZWN0LCBsb2NhdGlvbilcbiAgaWYgKHNvdXJjZVR5cGUua2luZCAhPSBcInR5cGVyZWZlcmVuY2VcIiAmJiBzb3VyY2VUeXBlLmtpbmQgIT0gXCJuYW1lXCIgJiYgc291cmNlVHlwZS5raW5kICE9IFwiaWRlbnRpZmllclwiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwidW5zdXBwb3J0ZWQgcmV0dXJuIHR5cGVcIiwgbm9kZUxvY2F0aW9uKHNvdXJjZVR5cGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG4gIGNvbnN0IHR5cGVOYW1lID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlR5cGVSZWZlcmVuY2UgfCBpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5hbWUgfCBpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklkZW50aWZpZXJ9ICovIChzb3VyY2VUeXBlKS5uYW1lXG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gcmVjb3JkTmFtZXMuZ2V0KHR5cGVOYW1lKVxuXG4gIGlmIChkZWNsYXJhdGlvbj8uaWQpIHJldHVybiBkZWNsYXJhdGlvbi5raW5kID09IFwiQ2xhc3NEZWNsYXJhdGlvblwiXG4gICAgPyByZWZlcmVuY2VUeXBlKGRlY2xhcmF0aW9uLmlkLCBub2RlTG9jYXRpb24oc291cmNlVHlwZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgOiBkZWNsYXJhdGlvbi5raW5kID09IFwiRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvblwiXG4gICAgICA/IG93bmVkUmVzb3VyY2VUeXBlKGRlY2xhcmF0aW9uLmlkLCBub2RlTG9jYXRpb24oc291cmNlVHlwZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgICA6IHJlY29yZFR5cGUoZGVjbGFyYXRpb24uaWQsIG5vZGVMb2NhdGlvbihzb3VyY2VUeXBlLCBmaWxlbmFtZSwgc291cmNlKSlcblxuICByZXR1cm4gcmVxdWlyZVNvdXJjZVJldHVyblR5cGUoXCJwaHBcIiwgdHlwZU5hbWUsIHN1YmplY3QsIGxvY2F0aW9uLCBub2RlTG9jYXRpb24oc291cmNlVHlwZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG59XG5cbi8qKlxuICogQ29udmVydHMgdGhlIGV4cGxpY2l0IHR5cGUgc2lnbmF0dXJlIG9mIG9uZSBQSFAgZnVuY3Rpb24gYmVmb3JlIGFueSBib2R5IGV4cHJlc3Npb25zLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkZ1bmN0aW9ufSBub2RlIC0gUEhQIGZ1bmN0aW9uIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uPn0gcmVjb3JkTmFtZXMgLSBOb21pbmFsIGRlY2xhcmF0aW9ucyBieSBzb3VyY2UgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvd25lcklkIC0gU3RhYmxlIGZ1bmN0aW9uIGlkZW50aXR5LlxuICogQHJldHVybnMge1BocEZ1bmN0aW9uU2lnbmF0dXJlfSBUeXBlZCBmdW5jdGlvbiBzaWduYXR1cmUuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRGdW5jdGlvblNpZ25hdHVyZShub2RlLCBmaWxlbmFtZSwgc291cmNlLCByZWNvcmROYW1lcywgb3duZXJJZCkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBuYW1lID0gdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZS5uYW1lIDogbm9kZS5uYW1lLm5hbWVcblxuICBpZiAoIW5vZGUuYm9keSkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImZ1bmN0aW9uIGJvZHlcIiwgbG9jYXRpb24pXG4gIH1cblxuICBjb25zdCBkb2N1bWVudGVkID0gZnVuY3Rpb25Eb2N1bWVudGVkVHlwZXMobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgb3duZXJJZClcbiAgY29uc3QgdHlwZVBhcmFtZXRlck5hbWVzID0gbmV3IE1hcCgoZG9jdW1lbnRlZC50eXBlUGFyYW1ldGVycyA/PyBbXSkubWFwKChwYXJhbWV0ZXIpID0+IFtwYXJhbWV0ZXIubmFtZSwgcGFyYW1ldGVyXSkpXG4gIGNvbnN0IHBhcmFtZXRlcnMgPSBub2RlLmFyZ3VtZW50cy5tYXAoKHBhcmFtZXRlcikgPT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlckxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKHBhcmFtZXRlciwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICBjb25zdCBwYXJhbWV0ZXJOYW1lID0gdHlwZW9mIHBhcmFtZXRlci5uYW1lID09IFwic3RyaW5nXCIgPyBwYXJhbWV0ZXIubmFtZSA6IHBhcmFtZXRlci5uYW1lLm5hbWVcblxuICAgIGlmIChwYXJhbWV0ZXIuYnlyZWYpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImJ5LXJlZmVyZW5jZSBwYXJhbWV0ZXJcIiwgcGFyYW1ldGVyTG9jYXRpb24pXG4gICAgaWYgKHBhcmFtZXRlci52YXJpYWRpYykgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwidmFyaWFkaWMgcGFyYW1ldGVyXCIsIHBhcmFtZXRlckxvY2F0aW9uKVxuICAgIGlmIChwYXJhbWV0ZXIudmFsdWUpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImRlZmF1bHQgcGFyYW1ldGVyXCIsIHBhcmFtZXRlckxvY2F0aW9uKVxuICAgIGNvbnN0IHBhcmFtZXRlck5vZGUgPSB0eXBlb2YgcGFyYW1ldGVyLm5hbWUgPT0gXCJzdHJpbmdcIiA/IHBhcmFtZXRlciA6IHBhcmFtZXRlci5uYW1lXG4gICAgY29uc3QgZG9jdW1lbnRlZFR5cGUgPSBkb2N1bWVudGVkLnBhcmFtZXRlcnMuZ2V0KHBhcmFtZXRlck5hbWUpXG4gICAgY29uc3QgbmF0aXZlVHlwZSA9IHBocFR5cGVOYW1lKHBhcmFtZXRlci50eXBlKVxuXG4gICAgbGV0IHBhcmFtZXRlclR5cGUgPSBkb2N1bWVudGVkVHlwZVxuICAgICAgPyBkb2N1bWVudGVkVmFsdWVUeXBlKHtsYW5ndWFnZTogXCJwaHBcIiwgbG9jYXRpb246IGRvY3VtZW50ZWRUeXBlLmxvY2F0aW9uLCBvd25lckxvY2F0aW9uOiBwYXJhbWV0ZXJMb2NhdGlvbiwgc291cmNlLFxuICAgICAgICByZWNvcmRzOiByZWNvcmROYW1lcywgc291cmNlVHlwZTogZG9jdW1lbnRlZFR5cGUuc291cmNlVHlwZSwgc3ViamVjdDogYFBhcmFtZXRlciAnJHtwYXJhbWV0ZXJOYW1lfSdgLCB0eXBlUGFyYW1ldGVyczogdHlwZVBhcmFtZXRlck5hbWVzfSlcbiAgICAgIDogY29udmVydFR5cGUocGFyYW1ldGVyLnR5cGUsIGBQYXJhbWV0ZXIgJyR7cGFyYW1ldGVyTmFtZX0nYCwgcGFyYW1ldGVyTG9jYXRpb24sIGZpbGVuYW1lLCBzb3VyY2UsIHJlY29yZE5hbWVzKVxuXG4gICAgaWYgKG5hdGl2ZVR5cGUgPT0gXCJhcnJheVwiICYmICFkb2N1bWVudGVkVHlwZSkgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIGBQYXJhbWV0ZXIgJyR7cGFyYW1ldGVyTmFtZX0nYCwgcGFyYW1ldGVyTG9jYXRpb24pXG4gICAgaWYgKGRvY3VtZW50ZWRUeXBlICYmICFwaHBEb2N1bWVudGVkTmF0aXZlVHlwZU1hdGNoZXMobmF0aXZlVHlwZSwgcGFyYW1ldGVyLm51bGxhYmxlLCBwYXJhbWV0ZXJUeXBlLCByZWNvcmROYW1lcykpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImRvY3VtZW50ZWQgcGFyYW1ldGVyIHR5cGUgaW5jb21wYXRpYmxlIHdpdGggbmF0aXZlIHR5cGVcIiwgZG9jdW1lbnRlZFR5cGUubG9jYXRpb24pXG4gICAgfVxuXG4gICAgaWYgKHBhcmFtZXRlci5udWxsYWJsZSAmJiBwYXJhbWV0ZXJUeXBlLmtpbmQgIT0gXCJPcHRpb25hbFR5cGVcIikge1xuICAgICAgaWYgKCFwYXJhbWV0ZXIudHlwZSkgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIGBQYXJhbWV0ZXIgJyR7cGFyYW1ldGVyTmFtZX0nYCwgcGFyYW1ldGVyTG9jYXRpb24pXG4gICAgICBwYXJhbWV0ZXJUeXBlID0gbnVsbGFibGVUeXBlKHBhcmFtZXRlclR5cGUsIHBhcmFtZXRlci50eXBlLCBwYXJhbWV0ZXIubG9jPy5zdGFydC5vZmZzZXQgPz8gMCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICB9IGVsc2UgaWYgKCFwYXJhbWV0ZXIubnVsbGFibGUgJiYgcGFyYW1ldGVyVHlwZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIgJiZcbiAgICAgIHBhcmFtZXRlclR5cGUudmFsdWVUeXBlLmtpbmQgIT0gXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwib3B0aW9uYWwgYW5ub3RhdGlvbiB3aXRob3V0IG51bGxhYmxlIG5hdGl2ZSB0eXBlXCIsIGRvY3VtZW50ZWRUeXBlPy5sb2NhdGlvbiA/PyBwYXJhbWV0ZXJMb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3Qgc2VtYW50aWNQYXJhbWV0ZXIgPSB7XG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJQYXJhbWV0ZXJcIiksXG4gICAgICBsb2NhdGlvbjogcGFyYW1ldGVyTG9jYXRpb24sXG4gICAgICBuYW1lOiBwYXJhbWV0ZXJOYW1lLFxuICAgICAgdHlwZTogcGFyYW1ldGVyVHlwZVxuICAgIH1cblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHNlbWFudGljUGFyYW1ldGVyLCB7bmFtZTogbm9kZUxvY2F0aW9uKHBhcmFtZXRlck5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgfSlcbiAgY29uc3QgZXh0cmFEb2N1bWVudGVkUGFyYW1ldGVyID0gWy4uLmRvY3VtZW50ZWQucGFyYW1ldGVycy5rZXlzKCldLmZpbmQoKG5hbWUpID0+XG4gICAgIW5vZGUuYXJndW1lbnRzLnNvbWUoKHBhcmFtZXRlcikgPT4gKHR5cGVvZiBwYXJhbWV0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gcGFyYW1ldGVyLm5hbWUgOiBwYXJhbWV0ZXIubmFtZS5uYW1lKSA9PSBuYW1lKSlcblxuICBpZiAoZXh0cmFEb2N1bWVudGVkUGFyYW1ldGVyKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYGFubm90YXRpb24gZm9yIHVua25vd24gcGFyYW1ldGVyICcke2V4dHJhRG9jdW1lbnRlZFBhcmFtZXRlcn0nYCwgbG9jYXRpb24pXG4gIGlmIChub2RlLmJ5cmVmKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJieS1yZWZlcmVuY2UgcmV0dXJuXCIsIGxvY2F0aW9uKVxuICBjb25zdCBuYW1lTm9kZSA9IHR5cGVvZiBub2RlLm5hbWUgPT0gXCJzdHJpbmdcIiA/IG5vZGUgOiBub2RlLm5hbWVcbiAgY29uc3QgbmF0aXZlUmV0dXJuVHlwZSA9IHBocFR5cGVOYW1lKG5vZGUudHlwZSlcbiAgbGV0IHJldHVyblR5cGVcblxuICBpZiAoZG9jdW1lbnRlZC5yZXR1cm5UeXBlKSB7XG4gICAgcmV0dXJuVHlwZSA9IGRvY3VtZW50ZWRWYWx1ZVR5cGUoe2xhbmd1YWdlOiBcInBocFwiLCBsb2NhdGlvbjogZG9jdW1lbnRlZC5yZXR1cm5UeXBlLmxvY2F0aW9uLCBvd25lckxvY2F0aW9uOiBsb2NhdGlvbiwgc291cmNlLFxuICAgICAgcmVjb3JkczogcmVjb3JkTmFtZXMsIHNvdXJjZVR5cGU6IGRvY3VtZW50ZWQucmV0dXJuVHlwZS5zb3VyY2VUeXBlLCBzdWJqZWN0OiBgRnVuY3Rpb24gJyR7bmFtZX0nIHJldHVybmAsIHR5cGVQYXJhbWV0ZXJzOiB0eXBlUGFyYW1ldGVyTmFtZXN9KVxuICAgIGlmICghcGhwRG9jdW1lbnRlZE5hdGl2ZVR5cGVNYXRjaGVzKG5hdGl2ZVJldHVyblR5cGUsIG5vZGUubnVsbGFibGUsIHJldHVyblR5cGUsIHJlY29yZE5hbWVzKSkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZG9jdW1lbnRlZCByZXR1cm4gdHlwZSBpbmNvbXBhdGlibGUgd2l0aCBuYXRpdmUgdHlwZVwiLCBkb2N1bWVudGVkLnJldHVyblR5cGUubG9jYXRpb24pXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChuYXRpdmVSZXR1cm5UeXBlID09IFwiYXJyYXlcIikgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIGBGdW5jdGlvbiAnJHtuYW1lfScgcmV0dXJuYCwgbG9jYXRpb24pXG4gICAgcmV0dXJuVHlwZSA9IGNvbnZlcnRSZXR1cm5UeXBlKG5vZGUudHlwZSwgYEZ1bmN0aW9uICcke25hbWV9JyByZXR1cm5gLCBsb2NhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSwgcmVjb3JkTmFtZXMpXG4gIH1cbiAgaWYgKG5vZGUubnVsbGFibGUgJiYgcmV0dXJuVHlwZS5raW5kICE9IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICBpZiAoIW5vZGUudHlwZSkgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIGBGdW5jdGlvbiAnJHtuYW1lfScgcmV0dXJuYCwgbG9jYXRpb24pXG4gICAgY29uc3QgdHlwZVN0YXJ0ID0gbm9kZS50eXBlLmxvYz8uc3RhcnQub2Zmc2V0ID8/IDBcblxuICAgIHJldHVyblR5cGUgPSBudWxsYWJsZVR5cGUoXG4gICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSAqLyAocmV0dXJuVHlwZSksXG4gICAgICBub2RlLnR5cGUsXG4gICAgICBNYXRoLm1heChub2RlLmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIHR5cGVTdGFydCAtIDIpLFxuICAgICAgZmlsZW5hbWUsXG4gICAgICBzb3VyY2VcbiAgICApXG4gIH0gZWxzZSBpZiAoIW5vZGUubnVsbGFibGUgJiYgcmV0dXJuVHlwZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIgJiZcbiAgICByZXR1cm5UeXBlLnZhbHVlVHlwZS5raW5kICE9IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJvcHRpb25hbCBhbm5vdGF0aW9uIHdpdGhvdXQgbnVsbGFibGUgbmF0aXZlIHJldHVybiB0eXBlXCIsIGRvY3VtZW50ZWQucmV0dXJuVHlwZT8ubG9jYXRpb24gPz8gbG9jYXRpb24pXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGxvY2F0aW9uLFxuICAgIG5hbWUsXG4gICAgbmFtZUxvY2F0aW9uOiBub2RlTG9jYXRpb24obmFtZU5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpLFxuICAgIHBhcmFtZXRlcnMsXG4gICAgcmV0dXJuVHlwZSxcbiAgICAuLi4oZG9jdW1lbnRlZC50eXBlUGFyYW1ldGVycyA/IHt0eXBlUGFyYW1ldGVyczogZG9jdW1lbnRlZC50eXBlUGFyYW1ldGVyc30gOiB7fSlcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB0aGUgZXhhY3QgcnVudGltZSBjYXJyaWVyIHBlcm1pdHRlZCBiZXNpZGUgYSBwcmVjaXNlIFBIUERvYyB0eXBlLlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IG5hdGl2ZVR5cGUgLSBOYXRpdmUgUEhQIHR5cGUgbmFtZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbmF0aXZlTnVsbGFibGUgLSBXaGV0aGVyIHRoZSBuYXRpdmUgY2FycmllciBoYXMgUEhQJ3MgbnVsbGFibGUgbWFya2VyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gZG9jdW1lbnRlZFR5cGUgLSBFeGFjdCBzZW1hbnRpYyBkb2N1bWVudCB0eXBlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uPn0gcmVjb3JkcyAtIFZpc2libGUgbm9taW5hbCBkZWNsYXJhdGlvbnMgYnkgbmFtZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBuYXRpdmUgY2FycmllciBhZ3JlZXMgd2l0aG91dCBjaGFuZ2luZyBtZWFuaW5nLlxuICovXG5mdW5jdGlvbiBwaHBEb2N1bWVudGVkTmF0aXZlVHlwZU1hdGNoZXMobmF0aXZlVHlwZSwgbmF0aXZlTnVsbGFibGUsIGRvY3VtZW50ZWRUeXBlLCByZWNvcmRzKSB7XG4gIGlmIChkb2N1bWVudGVkVHlwZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICBpZiAoZG9jdW1lbnRlZFR5cGUudmFsdWVUeXBlLmtpbmQgPT0gXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIikge1xuICAgICAgcmV0dXJuIG5hdGl2ZVR5cGUgPT09IHVuZGVmaW5lZCAmJiAhbmF0aXZlTnVsbGFibGVcbiAgICB9XG5cbiAgICByZXR1cm4gbmF0aXZlTnVsbGFibGUgJiYgcGhwRG9jdW1lbnRlZE5hdGl2ZVR5cGVNYXRjaGVzKG5hdGl2ZVR5cGUsIGZhbHNlLCBkb2N1bWVudGVkVHlwZS52YWx1ZVR5cGUsIHJlY29yZHMpXG4gIH1cbiAgaWYgKG5hdGl2ZU51bGxhYmxlKSByZXR1cm4gZmFsc2VcbiAgaWYgKGRvY3VtZW50ZWRUeXBlLmtpbmQgPT0gXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIikgcmV0dXJuIG5hdGl2ZVR5cGUgPT09IHVuZGVmaW5lZFxuICBpZiAoZG9jdW1lbnRlZFR5cGUua2luZCA9PSBcIlR5cGVSZWZlcmVuY2VcIikge1xuICAgIHJldHVybiBuYXRpdmVUeXBlICE9PSB1bmRlZmluZWQgJiYgc291cmNlU2NhbGFyVHlwZShcInBocFwiLCBuYXRpdmVUeXBlKT8ubmFtZSA9PSBkb2N1bWVudGVkVHlwZS5uYW1lXG4gIH1cbiAgaWYgKGRvY3VtZW50ZWRUeXBlLmtpbmQgPT0gXCJMaXN0VHlwZVwiIHx8IGRvY3VtZW50ZWRUeXBlLmtpbmQgPT0gXCJNYXBUeXBlXCIgfHwgZG9jdW1lbnRlZFR5cGUua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICByZXR1cm4gbmF0aXZlVHlwZSA9PSBcImFycmF5XCJcbiAgfVxuICBpZiAoZG9jdW1lbnRlZFR5cGUua2luZCA9PSBcIlJlY29yZFR5cGVcIikge1xuICAgIHJldHVybiBuYXRpdmVUeXBlICE9PSB1bmRlZmluZWQgJiYgcmVjb3Jkcy5nZXQobmF0aXZlVHlwZSk/LmlkID09IGRvY3VtZW50ZWRUeXBlLmRlY2xhcmF0aW9uSWRcbiAgfVxuICBpZiAoZG9jdW1lbnRlZFR5cGUua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIikge1xuICAgIHJldHVybiBuYXRpdmVUeXBlICE9PSB1bmRlZmluZWQgJiYgcmVjb3Jkcy5nZXQobmF0aXZlVHlwZSk/LmlkID09IGRvY3VtZW50ZWRUeXBlLmRlY2xhcmF0aW9uSWRcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgUEhQIGZ1bmN0aW9uIGJvZHkgdXNpbmcgdGhlIGFscmVhZHktcHJvdmVkIG1vZHVsZSBzaWduYXR1cmVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkZ1bmN0aW9ufSBub2RlIC0gUEhQIGZ1bmN0aW9uIG5vZGUuXG4gKiBAcGFyYW0ge1BocEZ1bmN0aW9uU2lnbmF0dXJlfSBzaWduYXR1cmUgLSBQcmVjb252ZXJ0ZWQgZXhwbGljaXQgc2lnbmF0dXJlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBQaHBGdW5jdGlvblNpZ25hdHVyZT59IGZ1bmN0aW9ucyAtIE1vZHVsZSBmdW5jdGlvbiBzaWduYXR1cmVzLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uPn0gcmVjb3JkTmFtZXMgLSBOb21pbmFsIGRlY2xhcmF0aW9ucyBieSBzb3VyY2UgbmFtZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24+fSByZWNvcmRzIC0gUmVjb3JkIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbj59IGNsYXNzZXMgLSBSZWZlcmVuY2UgY2xhc3NlcyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj59IGVycm9yTmFtZXMgLSBFcnJvciBkZWNsYXJhdGlvbnMgYnkgc291cmNlIG5hbWUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb24+fSBlcnJvcnMgLSBFcnJvciBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb259IFNlbWFudGljIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0RnVuY3Rpb24obm9kZSwgc2lnbmF0dXJlLCBmdW5jdGlvbnMsIHJlY29yZE5hbWVzLCByZWNvcmRzLCBjbGFzc2VzLCBlcnJvck5hbWVzLCBlcnJvcnMsIGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgaWYgKCFub2RlLmJvZHkpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImZ1bmN0aW9uIGJvZHlcIiwgc2lnbmF0dXJlLmxvY2F0aW9uKVxuICBjb25zdCBjb250ZXh0ID0ge1xuICAgIGJpbmRpbmdzOiBuZXcgTWFwKHNpZ25hdHVyZS5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PiBbcGFyYW1ldGVyLm5hbWUsIHBhcmFtZXRlci50eXBlXSkpLFxuICAgIGNsYXNzZXMsXG4gICAgZXJyb3JOYW1lcyxcbiAgICBlcnJvcnMsXG4gICAgZnVuY3Rpb25zLFxuICAgIG9yZGVyZWRNYXBEZWNsYXJhdGlvbnM6IG9yZGVyZWRNYXBEZWNsYXJhdGlvbnNGb3JQaHAobm9kZS5ib2R5KSxcbiAgICByZWNvcmROYW1lcyxcbiAgICByZWNvcmRzLFxuICAgIHJldHVyblR5cGU6IHNpZ25hdHVyZS5yZXR1cm5UeXBlLFxuICAgIHR5cGVQYXJhbWV0ZXJzOiBuZXcgTWFwKChzaWduYXR1cmUudHlwZVBhcmFtZXRlcnMgPz8gW10pLm1hcCgocGFyYW1ldGVyKSA9PiBbcGFyYW1ldGVyLm5hbWUsIHBhcmFtZXRlcl0pKVxuICB9XG5cbiAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgIGJvZHk6IGNvbnZlcnRCbG9jayhub2RlLmJvZHksIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpLFxuICAgIGtpbmQ6IFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiLFxuICAgIGxvY2F0aW9uOiBzaWduYXR1cmUubG9jYXRpb24sXG4gICAgbmFtZTogc2lnbmF0dXJlLm5hbWUsXG4gICAgcGFyYW1ldGVyczogc2lnbmF0dXJlLnBhcmFtZXRlcnMsXG4gICAgcmV0dXJuVHlwZTogc2lnbmF0dXJlLnJldHVyblR5cGUsXG4gICAgLi4uKHNpZ25hdHVyZS50eXBlUGFyYW1ldGVycyA/IHt0eXBlUGFyYW1ldGVyczogc2lnbmF0dXJlLnR5cGVQYXJhbWV0ZXJzfSA6IHt9KVxuICB9LCB7bmFtZTogc2lnbmF0dXJlLm5hbWVMb2NhdGlvbn0pXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgcGFyc2VyLW93bmVkIGtleS92YWx1ZSBsb29wcyB0byBleGFjdCBkZWNsYXJhdGlvbnMgaW5zaWRlIG9uZSBsZXhpY2FsIG93bmVyLlxuICogQW1iaWd1b3VzIHNhbWUtbmFtZSBkZWNsYXJhdGlvbnMgcHJvZHVjZSBubyBldmlkZW5jZSBhbmQgZmFpbCBkdXJpbmcgbG9vcCBjb252ZXJzaW9uLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIEZ1bmN0aW9uIGJvZHkgb3IgZW50cnktcG9pbnQgc3VidHJlZS5cbiAqIEByZXR1cm5zIHtTZXQ8b2JqZWN0Pn0gRXhhY3QgcGFpci1pdGVyYXRlZCBwYXJzZXIgZGVjbGFyYXRpb25zLlxuICovXG5mdW5jdGlvbiBvcmRlcmVkTWFwRGVjbGFyYXRpb25zRm9yUGhwKHZhbHVlKSB7XG4gIC8qKiBAdHlwZSB7e2RlY2xhcmF0aW9uOiBvYmplY3QsIG5hbWU6IHN0cmluZywgb2Zmc2V0OiBudW1iZXJ9W119ICovXG4gIGNvbnN0IGRlY2xhcmF0aW9ucyA9IFtdXG4gIC8qKiBAdHlwZSB7e25hbWU6IHN0cmluZywgb2Zmc2V0OiBudW1iZXJ9W119ICovXG4gIGNvbnN0IHJlY2VpdmVycyA9IFtdXG4gIGNvbnN0IHNlZW4gPSBuZXcgV2Vha1NldCgpXG4gIC8qKlxuICAgKiBWaXNpdHMgb25lIHBhcnNlciBjYW5kaWRhdGUuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlIC0gUGFyc2VyIGNhbmRpZGF0ZS5cbiAgICovXG4gIGNvbnN0IHZpc2l0ID0gKGNhbmRpZGF0ZSkgPT4ge1xuICAgIGlmICghY2FuZGlkYXRlIHx8IHR5cGVvZiBjYW5kaWRhdGUgIT0gXCJvYmplY3RcIiB8fCBzZWVuLmhhcyhjYW5kaWRhdGUpKSByZXR1cm5cbiAgICBzZWVuLmFkZChjYW5kaWRhdGUpXG4gICAgY29uc3Qga2luZCA9IFJlZmxlY3QuZ2V0KGNhbmRpZGF0ZSwgXCJraW5kXCIpXG5cbiAgICBpZiAoa2luZCA9PSBcImZ1bmN0aW9uXCIgfHwga2luZCA9PSBcImNsYXNzXCIpIHJldHVyblxuICAgIGlmIChraW5kID09IFwiYXNzaWduXCIpIHtcbiAgICAgIGNvbnN0IHZhcmlhYmxlID0gUmVmbGVjdC5nZXQoY2FuZGlkYXRlLCBcImxlZnRcIilcblxuICAgICAgaWYgKFJlZmxlY3QuZ2V0KHZhcmlhYmxlLCBcImtpbmRcIikgPT0gXCJ2YXJpYWJsZVwiICYmIHR5cGVvZiBSZWZsZWN0LmdldCh2YXJpYWJsZSwgXCJuYW1lXCIpID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgZGVjbGFyYXRpb25zLnB1c2goe1xuICAgICAgICAgIGRlY2xhcmF0aW9uOiBjYW5kaWRhdGUsXG4gICAgICAgICAgbmFtZTogUmVmbGVjdC5nZXQodmFyaWFibGUsIFwibmFtZVwiKSxcbiAgICAgICAgICBvZmZzZXQ6IFJlZmxlY3QuZ2V0KHZhcmlhYmxlLCBcImxvY1wiKT8uc3RhcnQub2Zmc2V0XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChraW5kID09IFwiZm9yZWFjaFwiKSB7XG4gICAgICBjb25zdCByZWNlaXZlciA9IFJlZmxlY3QuZ2V0KGNhbmRpZGF0ZSwgXCJzb3VyY2VcIilcblxuICAgICAgaWYgKFJlZmxlY3QuZ2V0KHJlY2VpdmVyLCBcImtpbmRcIikgPT0gXCJ2YXJpYWJsZVwiICYmIHR5cGVvZiBSZWZsZWN0LmdldChyZWNlaXZlciwgXCJuYW1lXCIpID09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgUmVmbGVjdC5nZXQoY2FuZGlkYXRlLCBcImtleVwiKSkgcmVjZWl2ZXJzLnB1c2goe1xuICAgICAgICBuYW1lOiBSZWZsZWN0LmdldChyZWNlaXZlciwgXCJuYW1lXCIpLFxuICAgICAgICBvZmZzZXQ6IFJlZmxlY3QuZ2V0KGNhbmRpZGF0ZSwgXCJsb2NcIik/LnN0YXJ0Lm9mZnNldFxuICAgICAgfSlcbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMoY2FuZGlkYXRlKSkge1xuICAgICAgaWYgKFtcImxvY1wiLCBcImxlYWRpbmdDb21tZW50c1wiLCBcInRyYWlsaW5nQ29tbWVudHNcIl0uaW5jbHVkZXMoa2V5KSkgY29udGludWVcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY2hpbGQpIHZpc2l0KGl0ZW0pXG4gICAgICB9IGVsc2UgdmlzaXQoY2hpbGQpXG4gICAgfVxuICB9XG5cbiAgdmlzaXQodmFsdWUpXG4gIGNvbnN0IHNlbGVjdGVkID0gbmV3IFNldCgpXG4gIGZvciAoY29uc3QgcmVjZWl2ZXIgb2YgcmVjZWl2ZXJzKSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IGRlY2xhcmF0aW9ucy5maWx0ZXIoKHtuYW1lLCBvZmZzZXR9KSA9PiBuYW1lID09IHJlY2VpdmVyLm5hbWUgJiYgb2Zmc2V0IDwgcmVjZWl2ZXIub2Zmc2V0KVxuXG4gICAgaWYgKG1hdGNoZXMubGVuZ3RoID09IDEpIHNlbGVjdGVkLmFkZChtYXRjaGVzWzBdLmRlY2xhcmF0aW9uKVxuICB9XG5cbiAgcmV0dXJuIHNlbGVjdGVkXG59XG5cbi8qKlxuICogQ29udmVydHMgb25lIGV4YWN0IGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gc3ViY2xhc3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuQ2xhc3N9IG5vZGUgLSBQSFAgY2xhc3MgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gUHJlZGVjbGFyZWQgc2VtYW50aWMgZXJyb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb259IFNlbWFudGljIGVycm9yIGRlY2xhcmF0aW9uLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0UGhwRXJyb3Iobm9kZSwgZGVjbGFyYXRpb24sIGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgcGFyZW50ID0gbm9kZS5leHRlbmRzXG4gIGNvbnN0IHBhcmVudE5hbWUgPSBwYXJlbnQ/LmtpbmQgPT0gXCJuYW1lXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTmFtZX0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHBhcmVudCkpIDogdW5kZWZpbmVkXG5cbiAgaWYgKG5vZGUuaXNBbm9ueW1vdXMgfHwgIW5vZGUuaXNGaW5hbCB8fCBub2RlLmlzUmVhZG9ubHkgfHwgbm9kZS5pc0Fic3RyYWN0IHx8IG5vZGUuaW1wbGVtZW50cz8ubGVuZ3RoIHx8XG4gICAgbm9kZS5hdHRyR3JvdXBzLmxlbmd0aCB8fCBub2RlLmJvZHkubGVuZ3RoICE9IDAgfHwgIXBhcmVudE5hbWUgfHxcbiAgICAhKHBhcmVudE5hbWUubmFtZSA9PSBcIlJ1bnRpbWVFeGNlcHRpb25cIiAmJiBwYXJlbnROYW1lLnJlc29sdXRpb24gPT0gXCJ1cW5cIiB8fFxuICAgICAgcGFyZW50TmFtZS5uYW1lID09IFwiXFxcXFJ1bnRpbWVFeGNlcHRpb25cIiAmJiBwYXJlbnROYW1lLnJlc29sdXRpb24gPT0gXCJmcW5cIikpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25jYW5vbmljYWwgdHlwZWQgZXJyb3IgZGVjbGFyYXRpb25cIiwgbG9jYXRpb24pXG4gIH1cbiAgY29uc3QgbmFtZU5vZGUgPSB0eXBlb2Ygbm9kZS5uYW1lID09IFwic3RyaW5nXCIgPyBub2RlIDogbm9kZS5uYW1lXG5cbiAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoZGVjbGFyYXRpb24sIHtuYW1lOiBub2RlTG9jYXRpb24obmFtZU5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpLCB0eXBlOiBub2RlTG9jYXRpb24ocGFyZW50TmFtZSwgZmlsZW5hbWUsIHNvdXJjZSl9KVxufVxuXG4vKipcbiAqIFJlYWRzIG9uZSBleGFjdCBwdWJsaWMgUEhQIGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlLW1ldGhvZCBzaWduYXR1cmUuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTWV0aG9kfSBub2RlIC0gUGFyc2VyLW93bmVkIG1ldGhvZC5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbj59IG5vbWluYWxOYW1lcyAtIFZpc2libGUgbm9taW5hbCBkZWNsYXJhdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3duZXJJZCAtIFN0YWJsZSBjYWxsYWJsZSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY29uc3RydWN0b3IgLSBXaGV0aGVyIHRoaXMgaXMgdGhlIHNvbGUgY29uc3RydWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge3tsb2NhdGlvbjogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIG5hbWU6IHN0cmluZywgbmFtZUxvY2F0aW9uOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiwgcGFyYW1ldGVyczogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUGFyYW1ldGVyW10sIHJldHVyblR5cGU/OiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX19IEV4YWN0IHNpZ25hdHVyZS5cbiAqL1xuZnVuY3Rpb24gY29udmVydFBocENsYXNzQ2FsbGFibGVTaWduYXR1cmUobm9kZSwgbm9taW5hbE5hbWVzLCBvd25lcklkLCBjb25zdHJ1Y3RvciwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBuYW1lID0gdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZS5uYW1lIDogbm9kZS5uYW1lLm5hbWVcblxuICBpZiAoIWNvbnN0cnVjdG9yICYmIC9eX18vdS50ZXN0KG5hbWUpKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYHJlc2VydmVkIHJlZmVyZW5jZSBtZXRob2QgJyR7bmFtZX0nYCwgbG9jYXRpb24pXG4gIGlmIChub2RlLnZpc2liaWxpdHkgIT0gXCJwdWJsaWNcIiB8fCBub2RlLmlzU3RhdGljIHx8IG5vZGUuaXNBYnN0cmFjdCB8fCBub2RlLmlzRmluYWwgfHwgUmVmbGVjdC5nZXQobm9kZSwgXCJpc1JlYWRvbmx5XCIpIHx8IG5vZGUuYnlyZWYgfHxcbiAgICBub2RlLmF0dHJHcm91cHMubGVuZ3RoIHx8ICFub2RlLmJvZHkgfHwgY29uc3RydWN0b3IgIT0gKG5hbWUgPT0gXCJfX2NvbnN0cnVjdFwiKSkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm5vbmNhbm9uaWNhbCByZWZlcmVuY2UgY2xhc3MgY2FsbGFibGVcIiwgbG9jYXRpb24pXG4gIH1cbiAgY29uc3QgZG9jdW1lbnRlZCA9IGZ1bmN0aW9uRG9jdW1lbnRlZFR5cGVzKC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5GdW5jdGlvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKG5vZGUpKSxcbiAgICBmaWxlbmFtZSwgc291cmNlLCBvd25lcklkKVxuICBpZiAoZG9jdW1lbnRlZC50eXBlUGFyYW1ldGVycz8ubGVuZ3RoKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJnZW5lcmljIHJlZmVyZW5jZSBjbGFzcyBjYWxsYWJsZVwiLCBsb2NhdGlvbilcbiAgaWYgKGNvbnN0cnVjdG9yICYmIChub2RlLnR5cGUgfHwgbm9kZS5udWxsYWJsZSB8fCBkb2N1bWVudGVkLnJldHVyblR5cGUpKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiY29uc3RydWN0b3IgcmV0dXJuIGFubm90YXRpb25cIiwgbG9jYXRpb24pXG4gIH1cbiAgY29uc3QgcGFyYW1ldGVycyA9IG5vZGUuYXJndW1lbnRzLm1hcCgocGFyYW1ldGVyKSA9PiB7XG4gICAgY29uc3QgcGFyYW1ldGVyTG9jYXRpb24gPSBub2RlTG9jYXRpb24ocGFyYW1ldGVyLCBmaWxlbmFtZSwgc291cmNlKVxuICAgIGNvbnN0IHBhcmFtZXRlck5hbWUgPSB0eXBlb2YgcGFyYW1ldGVyLm5hbWUgPT0gXCJzdHJpbmdcIiA/IHBhcmFtZXRlci5uYW1lIDogcGFyYW1ldGVyLm5hbWUubmFtZVxuXG4gICAgaWYgKHBhcmFtZXRlci5ieXJlZiB8fCBwYXJhbWV0ZXIudmFyaWFkaWMgfHwgcGFyYW1ldGVyLnZhbHVlIHx8IHBhcmFtZXRlci5mbGFncyB8fCBwYXJhbWV0ZXIucmVhZG9ubHkgfHxcbiAgICAgIHBhcmFtZXRlci5ob29rcy5sZW5ndGggfHwgcGFyYW1ldGVyLmF0dHJHcm91cHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25jYW5vbmljYWwgcmVmZXJlbmNlIGNsYXNzIHBhcmFtZXRlclwiLCBwYXJhbWV0ZXJMb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgZG9jdW1lbnRlZFR5cGUgPSBkb2N1bWVudGVkLnBhcmFtZXRlcnMuZ2V0KHBhcmFtZXRlck5hbWUpXG4gICAgY29uc3QgbmF0aXZlVHlwZSA9IHBocFR5cGVOYW1lKHBhcmFtZXRlci50eXBlKVxuICAgIGxldCB0eXBlID0gZG9jdW1lbnRlZFR5cGVcbiAgICAgID8gZG9jdW1lbnRlZFZhbHVlVHlwZSh7bGFuZ3VhZ2U6IFwicGhwXCIsIGxvY2F0aW9uOiBkb2N1bWVudGVkVHlwZS5sb2NhdGlvbiwgb3duZXJMb2NhdGlvbjogcGFyYW1ldGVyTG9jYXRpb24sXG4gICAgICAgIHJlY29yZHM6IG5vbWluYWxOYW1lcywgc291cmNlLCBzb3VyY2VUeXBlOiBkb2N1bWVudGVkVHlwZS5zb3VyY2VUeXBlLCBzdWJqZWN0OiBgUGFyYW1ldGVyICcke3BhcmFtZXRlck5hbWV9J2B9KVxuICAgICAgOiBjb252ZXJ0VHlwZShwYXJhbWV0ZXIudHlwZSwgYFBhcmFtZXRlciAnJHtwYXJhbWV0ZXJOYW1lfSdgLCBwYXJhbWV0ZXJMb2NhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSwgbm9taW5hbE5hbWVzKVxuXG4gICAgaWYgKG5hdGl2ZVR5cGUgPT0gXCJhcnJheVwiICYmICFkb2N1bWVudGVkVHlwZSkgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIGBQYXJhbWV0ZXIgJyR7cGFyYW1ldGVyTmFtZX0nYCwgcGFyYW1ldGVyTG9jYXRpb24pXG4gICAgaWYgKGRvY3VtZW50ZWRUeXBlICYmICFwaHBEb2N1bWVudGVkTmF0aXZlVHlwZU1hdGNoZXMobmF0aXZlVHlwZSwgcGFyYW1ldGVyLm51bGxhYmxlLCB0eXBlLCBub21pbmFsTmFtZXMpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkb2N1bWVudGVkIHBhcmFtZXRlciB0eXBlIGluY29tcGF0aWJsZSB3aXRoIG5hdGl2ZSB0eXBlXCIsIGRvY3VtZW50ZWRUeXBlLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAocGFyYW1ldGVyLm51bGxhYmxlICYmIHR5cGUua2luZCAhPSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgICBpZiAoIXBhcmFtZXRlci50eXBlKSByZXR1cm4gbWlzc2luZ1R5cGUoXCJwaHBcIiwgYFBhcmFtZXRlciAnJHtwYXJhbWV0ZXJOYW1lfSdgLCBwYXJhbWV0ZXJMb2NhdGlvbilcbiAgICAgIHR5cGUgPSBudWxsYWJsZVR5cGUodHlwZSwgcGFyYW1ldGVyLnR5cGUsIHBhcmFtZXRlci5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwLCBmaWxlbmFtZSwgc291cmNlKVxuICAgIH0gZWxzZSBpZiAoIXBhcmFtZXRlci5udWxsYWJsZSAmJiB0eXBlLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwib3B0aW9uYWwgYW5ub3RhdGlvbiB3aXRob3V0IG51bGxhYmxlIG5hdGl2ZSB0eXBlXCIsIGRvY3VtZW50ZWRUeXBlPy5sb2NhdGlvbiA/PyBwYXJhbWV0ZXJMb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgbmFtZU5vZGUgPSB0eXBlb2YgcGFyYW1ldGVyLm5hbWUgPT0gXCJzdHJpbmdcIiA/IHBhcmFtZXRlciA6IHBhcmFtZXRlci5uYW1lXG5cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUGFyYW1ldGVyXCIpLCBsb2NhdGlvbjogcGFyYW1ldGVyTG9jYXRpb24sXG4gICAgICBuYW1lOiBwYXJhbWV0ZXJOYW1lLCB0eXBlfSwge25hbWU6IG5vZGVMb2NhdGlvbihuYW1lTm9kZSwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICB9KVxuICBpZiAoWy4uLmRvY3VtZW50ZWQucGFyYW1ldGVycy5rZXlzKCldLnNvbWUoKHBhcmFtZXRlck5hbWUpID0+XG4gICAgIW5vZGUuYXJndW1lbnRzLnNvbWUoKHBhcmFtZXRlcikgPT4gKHR5cGVvZiBwYXJhbWV0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gcGFyYW1ldGVyLm5hbWUgOiBwYXJhbWV0ZXIubmFtZS5uYW1lKSA9PSBwYXJhbWV0ZXJOYW1lKSkpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJtZXRob2QgUEhQRG9jIHBhcmFtZXRlciBtaXNtYXRjaFwiLCBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBuYW1lTm9kZSA9IHR5cGVvZiBub2RlLm5hbWUgPT0gXCJzdHJpbmdcIiA/IG5vZGUgOiBub2RlLm5hbWVcblxuICBpZiAoY29uc3RydWN0b3IpIHJldHVybiB7bG9jYXRpb24sIG5hbWU6IFwiY29uc3RydWN0b3JcIiwgbmFtZUxvY2F0aW9uOiBub2RlTG9jYXRpb24obmFtZU5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpLCBwYXJhbWV0ZXJzfVxuICBsZXQgcmV0dXJuVHlwZVxuICBjb25zdCBuYXRpdmVSZXR1cm5UeXBlID0gcGhwVHlwZU5hbWUobm9kZS50eXBlKVxuXG4gIGlmIChkb2N1bWVudGVkLnJldHVyblR5cGUpIHtcbiAgICByZXR1cm5UeXBlID0gZG9jdW1lbnRlZFZhbHVlVHlwZSh7bGFuZ3VhZ2U6IFwicGhwXCIsIGxvY2F0aW9uOiBkb2N1bWVudGVkLnJldHVyblR5cGUubG9jYXRpb24sIG93bmVyTG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgcmVjb3Jkczogbm9taW5hbE5hbWVzLCBzb3VyY2UsIHNvdXJjZVR5cGU6IGRvY3VtZW50ZWQucmV0dXJuVHlwZS5zb3VyY2VUeXBlLCBzdWJqZWN0OiBgTWV0aG9kICcke25hbWV9JyByZXR1cm5gfSlcbiAgICBpZiAoIXBocERvY3VtZW50ZWROYXRpdmVUeXBlTWF0Y2hlcyhuYXRpdmVSZXR1cm5UeXBlLCBub2RlLm51bGxhYmxlLCByZXR1cm5UeXBlLCBub21pbmFsTmFtZXMpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkb2N1bWVudGVkIG1ldGhvZCByZXR1cm4gdHlwZSBpbmNvbXBhdGlibGUgd2l0aCBuYXRpdmUgdHlwZVwiLCBkb2N1bWVudGVkLnJldHVyblR5cGUubG9jYXRpb24pXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChuYXRpdmVSZXR1cm5UeXBlID09IFwiYXJyYXlcIikgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIGBNZXRob2QgJyR7bmFtZX0nIHJldHVybmAsIGxvY2F0aW9uKVxuICAgIHJldHVyblR5cGUgPSBjb252ZXJ0UmV0dXJuVHlwZShub2RlLnR5cGUsIGBNZXRob2QgJyR7bmFtZX0nIHJldHVybmAsIGxvY2F0aW9uLCBmaWxlbmFtZSwgc291cmNlLCBub21pbmFsTmFtZXMpXG4gIH1cbiAgaWYgKG5vZGUubnVsbGFibGUgJiYgcmV0dXJuVHlwZS5raW5kICE9IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICBpZiAoIW5vZGUudHlwZSkgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIGBNZXRob2QgJyR7bmFtZX0nIHJldHVybmAsIGxvY2F0aW9uKVxuICAgIHJldHVyblR5cGUgPSBudWxsYWJsZVR5cGUoLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gKi8gKHJldHVyblR5cGUpLCBub2RlLnR5cGUsXG4gICAgICBub2RlLnR5cGUubG9jPy5zdGFydC5vZmZzZXQgPz8gMCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgfSBlbHNlIGlmICghbm9kZS5udWxsYWJsZSAmJiByZXR1cm5UeXBlLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm9wdGlvbmFsIGFubm90YXRpb24gd2l0aG91dCBudWxsYWJsZSBuYXRpdmUgcmV0dXJuIHR5cGVcIiwgZG9jdW1lbnRlZC5yZXR1cm5UeXBlPy5sb2NhdGlvbiA/PyBsb2NhdGlvbilcbiAgfVxuXG4gIHJldHVybiB7bG9jYXRpb24sIG5hbWUsIG5hbWVMb2NhdGlvbjogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKSwgcGFyYW1ldGVycywgcmV0dXJuVHlwZX1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgYm91bmRlZCBmaW5hbC9wcml2YXRlLWZpZWxkIFBIUCByZWZlcmVuY2UtY2xhc3MgcHJvZmlsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5DbGFzc30gbm9kZSAtIFBhcnNlciBjbGFzcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbn0gZGVjbGFyYXRpb24gLSBQcmVkZWNsYXJlZCBjbGFzcyBpZGVudGl0eS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbj59IG5vbWluYWxOYW1lcyAtIFZpc2libGUgbm9taW5hbCBkZWNsYXJhdGlvbnMuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uPn0gcmVjb3JkcyAtIFJlY29yZHMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24+fSBjbGFzc2VzIC0gQ2xhc3NlcyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgUGhwRnVuY3Rpb25TaWduYXR1cmU+fSBmdW5jdGlvbnMgLSBUb3AtbGV2ZWwgc2lnbmF0dXJlcy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj59IGVycm9yTmFtZXMgLSBFcnJvcnMgYnkgbmFtZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj59IGVycm9ycyAtIEVycm9ycyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbn0gU2VtYW50aWMgY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRQaHBSZWZlcmVuY2VDbGFzcyhub2RlLCBkZWNsYXJhdGlvbiwgbm9taW5hbE5hbWVzLCByZWNvcmRzLCBjbGFzc2VzLCBmdW5jdGlvbnMsIGVycm9yTmFtZXMsIGVycm9ycyxcbiAgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gIGlmIChub2RlLmlzQW5vbnltb3VzIHx8ICFub2RlLmlzRmluYWwgfHwgbm9kZS5pc1JlYWRvbmx5IHx8IG5vZGUuaXNBYnN0cmFjdCB8fCBub2RlLmV4dGVuZHMgfHwgbm9kZS5pbXBsZW1lbnRzPy5sZW5ndGggfHxcbiAgICBub2RlLmF0dHJHcm91cHMubGVuZ3RoKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJyZWZlcmVuY2UgY2xhc3MgaW5oZXJpdGFuY2Ugb3Igbm9uY2Fub25pY2FsIG1vZGlmaWVyXCIsIGxvY2F0aW9uKVxuICBjb25zdCBmaWVsZFN0YXRlbWVudHMgPSBub2RlLmJvZHkuZmlsdGVyKChtZW1iZXIpID0+IG1lbWJlci5raW5kID09IFwicHJvcGVydHlzdGF0ZW1lbnRcIilcbiAgY29uc3QgbWV0aG9kTm9kZXMgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTWV0aG9kW119ICovIChub2RlLmJvZHkuZmlsdGVyKChtZW1iZXIpID0+IG1lbWJlci5raW5kID09IFwibWV0aG9kXCIpKVxuICBjb25zdCBjb25zdHJ1Y3RvcnMgPSBtZXRob2ROb2Rlcy5maWx0ZXIoKG1ldGhvZCkgPT4gKHR5cGVvZiBtZXRob2QubmFtZSA9PSBcInN0cmluZ1wiID8gbWV0aG9kLm5hbWUgOiBtZXRob2QubmFtZS5uYW1lKSA9PSBcIl9fY29uc3RydWN0XCIpXG4gIGNvbnN0IG9yZGluYXJ5TWV0aG9kcyA9IG1ldGhvZE5vZGVzLmZpbHRlcigobWV0aG9kKSA9PiAhY29uc3RydWN0b3JzLmluY2x1ZGVzKG1ldGhvZCkpXG5cbiAgaWYgKGNvbnN0cnVjdG9ycy5sZW5ndGggIT0gMSB8fCBmaWVsZFN0YXRlbWVudHMubGVuZ3RoID09IDAgfHwgZmllbGRTdGF0ZW1lbnRzLmxlbmd0aCArIG1ldGhvZE5vZGVzLmxlbmd0aCAhPSBub2RlLmJvZHkubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwicmVmZXJlbmNlIGNsYXNzIHJlcXVpcmVzIHByaXZhdGUgZmllbGRzLCBvbmUgY29uc3RydWN0b3IsIGFuZCBvcmRpbmFyeSBtZXRob2RzXCIsIGxvY2F0aW9uKVxuICB9XG4gIGRlY2xhcmF0aW9uLmZpZWxkcyA9IGZpZWxkU3RhdGVtZW50cy5tYXAoKHN0YXRlbWVudCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBmaWVsZExvY2F0aW9uID0gbm9kZUxvY2F0aW9uKHN0YXRlbWVudCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBcInByb3BlcnRpZXNcIilcbiAgICBjb25zdCBwcm9wZXJ0eSA9IEFycmF5LmlzQXJyYXkocHJvcGVydGllcykgJiYgcHJvcGVydGllcy5sZW5ndGggPT0gMSA/IHByb3BlcnRpZXNbMF0gOiB1bmRlZmluZWRcbiAgICBjb25zdCBuYW1lTm9kZSA9IHByb3BlcnR5Py5uYW1lXG4gICAgY29uc3QgbmFtZSA9IHR5cGVvZiBuYW1lTm9kZSA9PSBcInN0cmluZ1wiID8gbmFtZU5vZGUgOiBuYW1lTm9kZT8ubmFtZVxuXG4gICAgaWYgKFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJ2aXNpYmlsaXR5XCIpICE9IFwicHJpdmF0ZVwiIHx8IFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJpc1N0YXRpY1wiKSB8fFxuICAgICAgUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBcImlzQWJzdHJhY3RcIikgfHwgUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBcImlzRmluYWxcIikgfHwgIXByb3BlcnR5IHx8XG4gICAgICB0eXBlb2YgbmFtZSAhPSBcInN0cmluZ1wiIHx8IHByb3BlcnR5LnZhbHVlIHx8IHByb3BlcnR5LnJlYWRvbmx5IHx8IHByb3BlcnR5Lm51bGxhYmxlIHx8IHByb3BlcnR5LmF0dHJHcm91cHM/Lmxlbmd0aCB8fFxuICAgICAgcHJvcGVydHkuaG9va3M/Lmxlbmd0aCkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibm9uY2Fub25pY2FsIHByaXZhdGUgaW5zdGFuY2UgZmllbGRcIiwgZmllbGRMb2NhdGlvbilcbiAgICBjb25zdCB0eXBlID0gY29udmVydFR5cGUocHJvcGVydHkudHlwZSwgYFByaXZhdGUgZmllbGQgJyR7bmFtZX0nYCwgZmllbGRMb2NhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSwgbm9taW5hbE5hbWVzKVxuXG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2lkOiBgJHtkZWNsYXJhdGlvbi5pZH06ZmllbGQ6JHtpbmRleH1gLCBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJQcml2YXRlRmllbGRcIiksXG4gICAgICBsb2NhdGlvbjogZmllbGRMb2NhdGlvbiwgbmFtZSwgdHlwZX0sIHtuYW1lOiBub2RlTG9jYXRpb24odHlwZW9mIG5hbWVOb2RlID09IFwic3RyaW5nXCIgPyBwcm9wZXJ0eSA6IG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKX0pXG4gIH0pXG4gIGNvbnN0IGNvbnN0cnVjdG9yTm9kZSA9IGNvbnN0cnVjdG9yc1swXVxuICBjb25zdCBjb25zdHJ1Y3RvclNpZ25hdHVyZSA9IGNvbnZlcnRQaHBDbGFzc0NhbGxhYmxlU2lnbmF0dXJlKGNvbnN0cnVjdG9yTm9kZSwgbm9taW5hbE5hbWVzLFxuICAgIGAke2RlY2xhcmF0aW9uLmlkfTpjb25zdHJ1Y3RvcmAsIHRydWUsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgZGVjbGFyYXRpb24uY29uc3RydWN0b3IgPSB3aXRoUGFyc2VyUmFuZ2VzKHtib2R5OiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkJsb2NrfSAqLyAoe30pLFxuICAgIGlkOiBgJHtkZWNsYXJhdGlvbi5pZH06Y29uc3RydWN0b3JgLCBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJDb25zdHJ1Y3RvckRlY2xhcmF0aW9uXCIpLFxuICAgIGxvY2F0aW9uOiBjb25zdHJ1Y3RvclNpZ25hdHVyZS5sb2NhdGlvbiwgcGFyYW1ldGVyczogY29uc3RydWN0b3JTaWduYXR1cmUucGFyYW1ldGVyc30sIHtjb25zdHJ1Y3RvcjogY29uc3RydWN0b3JTaWduYXR1cmUubmFtZUxvY2F0aW9ufSlcbiAgY29uc3QgbWV0aG9kU2lnbmF0dXJlcyA9IG9yZGluYXJ5TWV0aG9kcy5tYXAoKG1ldGhvZCwgaW5kZXgpID0+IGNvbnZlcnRQaHBDbGFzc0NhbGxhYmxlU2lnbmF0dXJlKG1ldGhvZCwgbm9taW5hbE5hbWVzLFxuICAgIGAke2RlY2xhcmF0aW9uLmlkfTptZXRob2Q6JHtpbmRleH1gLCBmYWxzZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG5cbiAgZGVjbGFyYXRpb24ubWV0aG9kcyA9IG1ldGhvZFNpZ25hdHVyZXMubWFwKChzaWduYXR1cmUsIGluZGV4KSA9PiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICBib2R5OiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkJsb2NrfSAqLyAoe30pLCBpZDogYCR7ZGVjbGFyYXRpb24uaWR9Om1ldGhvZDoke2luZGV4fWAsXG4gICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiTWV0aG9kRGVjbGFyYXRpb25cIiksIGxvY2F0aW9uOiBzaWduYXR1cmUubG9jYXRpb24sIG5hbWU6IHNpZ25hdHVyZS5uYW1lLFxuICAgIHBhcmFtZXRlcnM6IHNpZ25hdHVyZS5wYXJhbWV0ZXJzLFxuICAgIHJldHVyblR5cGU6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9ICovIChzaWduYXR1cmUucmV0dXJuVHlwZSlcbiAgfSwge25hbWU6IHNpZ25hdHVyZS5uYW1lTG9jYXRpb259KSlcbiAgY29uc3QgYmFzZSA9IHtiaW5kaW5nczogbmV3IE1hcCgpLCBjbGFzc2VzLCBjdXJyZW50Q2xhc3M6IGRlY2xhcmF0aW9uLCBlcnJvck5hbWVzLCBlcnJvcnMsIGZ1bmN0aW9ucyxcbiAgICByZWNvcmROYW1lczogbm9taW5hbE5hbWVzLCByZWNvcmRzfVxuXG4gIGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLmJvZHkgPSBjb252ZXJ0QmxvY2soLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJsb2NrfSAqLyAoY29uc3RydWN0b3JOb2RlLmJvZHkpLCBmaWxlbmFtZSwgc291cmNlLFxuICAgIHsuLi5iYXNlLCBiaW5kaW5nczogbmV3IE1hcChkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PiBbcGFyYW1ldGVyLm5hbWUsIHBhcmFtZXRlci50eXBlXSkpLFxuICAgICAgcmV0dXJuVHlwZToge2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlR5cGVSZWZlcmVuY2VcIiksIG5hbWU6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInZvaWRcIil9fSlcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG9yZGluYXJ5TWV0aG9kcy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCBtZXRob2QgPSBkZWNsYXJhdGlvbi5tZXRob2RzW2luZGV4XVxuXG4gICAgbWV0aG9kLmJvZHkgPSBjb252ZXJ0QmxvY2soLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJsb2NrfSAqLyAob3JkaW5hcnlNZXRob2RzW2luZGV4XS5ib2R5KSwgZmlsZW5hbWUsIHNvdXJjZSxcbiAgICAgIHsuLi5iYXNlLCBiaW5kaW5nczogbmV3IE1hcChtZXRob2QucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT4gW3BhcmFtZXRlci5uYW1lLCBwYXJhbWV0ZXIudHlwZV0pKSwgcmV0dXJuVHlwZTogbWV0aG9kLnJldHVyblR5cGV9KVxuICB9XG4gIGNvbnN0IG5hbWVOb2RlID0gdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZSA6IG5vZGUubmFtZVxuXG4gIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKGRlY2xhcmF0aW9uLCB7bmFtZTogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKX0pXG59XG5cbi8qKlxuICogQ29udmVydHMgb25lIGV4YWN0IGZpbmFsIHJlYWRvbmx5IHByb21vdGVkLXByb3BlcnR5IFBIUCByZWNvcmQuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuQ2xhc3N9IG5vZGUgLSBQSFAgY2xhc3MgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9ufSBkZWNsYXJhdGlvbiAtIFByZWRlY2xhcmVkIG5vbWluYWwgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uPn0gcmVjb3JkTmFtZXMgLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9ufSBTZW1hbnRpYyByZWNvcmQuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRQaHBSZWNvcmQobm9kZSwgZGVjbGFyYXRpb24sIHJlY29yZE5hbWVzLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IGdlbmVyaWMgPSAoZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnM/Lmxlbmd0aCA/PyAwKSA+IDBcblxuICBpZiAobm9kZS5pc0Fub255bW91cyB8fCAhbm9kZS5pc0ZpbmFsIHx8IG5vZGUuaXNSZWFkb25seSA9PSBnZW5lcmljIHx8IG5vZGUuaXNBYnN0cmFjdCB8fCBub2RlLmV4dGVuZHMgfHwgbm9kZS5pbXBsZW1lbnRzPy5sZW5ndGggfHxcbiAgICBub2RlLmF0dHJHcm91cHMubGVuZ3RoKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25jYW5vbmljYWwgcmVjb3JkIGNsYXNzIG1vZGlmaWVyc1wiLCBsb2NhdGlvbilcbiAgaWYgKG5vZGUuYm9keS5sZW5ndGggPCAxIHx8IG5vZGUuYm9keVswXS5raW5kICE9IFwibWV0aG9kXCIgfHwgIWdlbmVyaWMgJiYgbm9kZS5ib2R5Lmxlbmd0aCAhPSAxKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwicmVjb3JkIGNsYXNzIGJvZHkgb3V0c2lkZSBvbmUgY29uc3RydWN0b3JcIiwgbm9kZUxvY2F0aW9uKG5vZGUuYm9keVsxXSA/PyBub2RlLmJvZHlbMF0gPz8gbm9kZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbiAgY29uc3QgY29uc3RydWN0b3IgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTWV0aG9kfSAqLyAobm9kZS5ib2R5WzBdKVxuICBjb25zdCB0eXBlUGFyYW1ldGVyTmFtZXMgPSBuZXcgTWFwKChkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycyA/PyBbXSkubWFwKChwYXJhbWV0ZXIpID0+IFtwYXJhbWV0ZXIubmFtZSwgcGFyYW1ldGVyXSkpXG4gIGNvbnN0IGNvbnN0cnVjdG9yTmFtZSA9IHR5cGVvZiBjb25zdHJ1Y3Rvci5uYW1lID09IFwic3RyaW5nXCIgPyBjb25zdHJ1Y3Rvci5uYW1lIDogY29uc3RydWN0b3IubmFtZS5uYW1lXG5cbiAgaWYgKGNvbnN0cnVjdG9yTmFtZSAhPSBcIl9fY29uc3RydWN0XCIgfHwgY29uc3RydWN0b3IudmlzaWJpbGl0eSAhPSBcInB1YmxpY1wiIHx8IGNvbnN0cnVjdG9yLmlzU3RhdGljIHx8IGNvbnN0cnVjdG9yLmlzQWJzdHJhY3QgfHxcbiAgICBjb25zdHJ1Y3Rvci5pc0ZpbmFsIHx8IFJlZmxlY3QuZ2V0KGNvbnN0cnVjdG9yLCBcImlzUmVhZG9ubHlcIikgfHwgY29uc3RydWN0b3IuYnlyZWYgfHwgY29uc3RydWN0b3IudHlwZSB8fCBjb25zdHJ1Y3Rvci5udWxsYWJsZSB8fFxuICAgIGNvbnN0cnVjdG9yLmF0dHJHcm91cHMubGVuZ3RoIHx8ICFjb25zdHJ1Y3Rvci5ib2R5IHx8IGNvbnN0cnVjdG9yLmJvZHkuY2hpbGRyZW4ubGVuZ3RoICE9IDApIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25jYW5vbmljYWwgcmVjb3JkIGNvbnN0cnVjdG9yXCIsIG5vZGVMb2NhdGlvbihjb25zdHJ1Y3RvciwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbiAgY29uc3QgZG9jdW1lbnRlZCA9IGZ1bmN0aW9uRG9jdW1lbnRlZFR5cGVzKC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5GdW5jdGlvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGNvbnN0cnVjdG9yKSksIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgZGVjbGFyYXRpb24uZmllbGRzID0gY29uc3RydWN0b3IuYXJndW1lbnRzLm1hcCgocGFyYW1ldGVyKSA9PiB7XG4gICAgY29uc3QgZmllbGRMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihwYXJhbWV0ZXIsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgY29uc3QgbmFtZSA9IHR5cGVvZiBwYXJhbWV0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gcGFyYW1ldGVyLm5hbWUgOiBwYXJhbWV0ZXIubmFtZS5uYW1lXG4gICAgY29uc3QgZG9jdW1lbnRlZFR5cGUgPSBkb2N1bWVudGVkLnBhcmFtZXRlcnMuZ2V0KG5hbWUpXG4gICAgY29uc3QgbmF0aXZlVHlwZSA9IHBocFR5cGVOYW1lKHBhcmFtZXRlci50eXBlKVxuXG4gICAgaWYgKHBhcmFtZXRlci5mbGFncyAhPSAoZ2VuZXJpYyA/IDQgOiAxKSB8fCBwYXJhbWV0ZXIuYnlyZWYgfHwgcGFyYW1ldGVyLnZhcmlhZGljIHx8IHBhcmFtZXRlci52YWx1ZSB8fCBwYXJhbWV0ZXIucmVhZG9ubHkgfHxcbiAgICAgIHBhcmFtZXRlci5ob29rcy5sZW5ndGggfHwgcGFyYW1ldGVyLmF0dHJHcm91cHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJyZWNvcmQgZmllbGQgb3V0c2lkZSBwdWJsaWMgcHJvbW90ZWQtcHJvcGVydHkgcHJvZmlsZVwiLCBmaWVsZExvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAobmF0aXZlVHlwZSA9PSBcImFycmF5XCIgJiYgIWRvY3VtZW50ZWRUeXBlKSByZXR1cm4gbWlzc2luZ1R5cGUoXCJwaHBcIiwgYFJlY29yZCBmaWVsZCAnJHtuYW1lfSdgLCBmaWVsZExvY2F0aW9uKVxuICAgIGxldCB0eXBlID0gZG9jdW1lbnRlZFR5cGVcbiAgICAgID8gZG9jdW1lbnRlZFZhbHVlVHlwZSh7bGFuZ3VhZ2U6IFwicGhwXCIsIGxvY2F0aW9uOiBkb2N1bWVudGVkVHlwZS5sb2NhdGlvbiwgb3duZXJMb2NhdGlvbjogZmllbGRMb2NhdGlvbiwgcmVjb3JkczogcmVjb3JkTmFtZXMsXG4gICAgICAgIHNvdXJjZSwgc291cmNlVHlwZTogZG9jdW1lbnRlZFR5cGUuc291cmNlVHlwZSwgc3ViamVjdDogYFJlY29yZCBmaWVsZCAnJHtuYW1lfSdgLCB0eXBlUGFyYW1ldGVyczogdHlwZVBhcmFtZXRlck5hbWVzfSlcbiAgICAgIDogY29udmVydFR5cGUocGFyYW1ldGVyLnR5cGUsIGBSZWNvcmQgZmllbGQgJyR7bmFtZX0nYCwgZmllbGRMb2NhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSwgcmVjb3JkTmFtZXMpXG5cbiAgICBpZiAoZG9jdW1lbnRlZFR5cGUgJiYgIXBocERvY3VtZW50ZWROYXRpdmVUeXBlTWF0Y2hlcyhuYXRpdmVUeXBlLCBwYXJhbWV0ZXIubnVsbGFibGUsIHR5cGUsIHJlY29yZE5hbWVzKSkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZG9jdW1lbnRlZCByZWNvcmQgZmllbGQgdHlwZSBpbmNvbXBhdGlibGUgd2l0aCBuYXRpdmUgdHlwZVwiLCBkb2N1bWVudGVkVHlwZS5sb2NhdGlvbilcbiAgICB9XG5cbiAgICBpZiAocGFyYW1ldGVyLm51bGxhYmxlICYmIHR5cGUua2luZCAhPSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgICBpZiAoIXBhcmFtZXRlci50eXBlKSByZXR1cm4gbWlzc2luZ1R5cGUoXCJwaHBcIiwgYFJlY29yZCBmaWVsZCAnJHtuYW1lfSdgLCBmaWVsZExvY2F0aW9uKVxuICAgICAgdHlwZSA9IG51bGxhYmxlVHlwZSh0eXBlLCBwYXJhbWV0ZXIudHlwZSwgcGFyYW1ldGVyLmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgfSBlbHNlIGlmICghcGFyYW1ldGVyLm51bGxhYmxlICYmIHR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiICYmIHR5cGUudmFsdWVUeXBlLmtpbmQgIT0gXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwib3B0aW9uYWwgYW5ub3RhdGlvbiB3aXRob3V0IG51bGxhYmxlIG5hdGl2ZSByZWNvcmQgZmllbGRcIiwgZG9jdW1lbnRlZFR5cGU/LmxvY2F0aW9uID8/IGZpZWxkTG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGZpZWxkID0ge2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlJlY29yZEZpZWxkXCIpLCBsb2NhdGlvbjogZmllbGRMb2NhdGlvbiwgbmFtZSwgdHlwZX1cbiAgICBjb25zdCBuYW1lTm9kZSA9IHR5cGVvZiBwYXJhbWV0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gcGFyYW1ldGVyIDogcGFyYW1ldGVyLm5hbWVcblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKGZpZWxkLCB7bmFtZTogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKX0pXG4gIH0pXG4gIGNvbnN0IGV4dHJhRG9jdW1lbnRlZCA9IFsuLi5kb2N1bWVudGVkLnBhcmFtZXRlcnMua2V5cygpXS5maW5kKChuYW1lKSA9PlxuICAgICFjb25zdHJ1Y3Rvci5hcmd1bWVudHMuc29tZSgocGFyYW1ldGVyKSA9PiAodHlwZW9mIHBhcmFtZXRlci5uYW1lID09IFwic3RyaW5nXCIgPyBwYXJhbWV0ZXIubmFtZSA6IHBhcmFtZXRlci5uYW1lLm5hbWUpID09IG5hbWUpKVxuXG4gIGlmIChleHRyYURvY3VtZW50ZWQgfHwgZG9jdW1lbnRlZC5yZXR1cm5UeXBlKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJpbnZhbGlkIHJlY29yZCBjb25zdHJ1Y3RvciBhbm5vdGF0aW9uXCIsIGxvY2F0aW9uKVxuICBpZiAoZ2VuZXJpYykgdmFsaWRhdGVQaHBHZW5lcmljUmVjb3JkR2V0dGVycyhub2RlLCBkZWNsYXJhdGlvbiwgcmVjb3JkTmFtZXMsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IG5hbWVOb2RlID0gdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZSA6IG5vZGUubmFtZVxuXG4gIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKGRlY2xhcmF0aW9uLCB7bmFtZTogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKX0pXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBleGFjdCBhY2Nlc3NvciBoYWxmIG9mIFBIUCdzIGRvY3VtZW50ZWQgZ2VuZXJpYy1yZWNvcmQgcHJvZmlsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5DbGFzc30gbm9kZSAtIFBIUCBjbGFzcyBkZWNsYXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gQ29udmVydGVkIHJlY29yZC5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24+fSByZWNvcmROYW1lcyAtIFZpc2libGUgcmVjb3Jkcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQaHBHZW5lcmljUmVjb3JkR2V0dGVycyhub2RlLCBkZWNsYXJhdGlvbiwgcmVjb3JkTmFtZXMsIGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgY29uc3QgZ2V0dGVycyA9IG5vZGUuYm9keS5zbGljZSgxKVxuICBjb25zdCB0eXBlUGFyYW1ldGVycyA9IG5ldyBNYXAoKGRlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzID8/IFtdKS5tYXAoKHBhcmFtZXRlcikgPT4gW3BhcmFtZXRlci5uYW1lLCBwYXJhbWV0ZXJdKSlcblxuICBpZiAoZ2V0dGVycy5sZW5ndGggIT0gZGVjbGFyYXRpb24uZmllbGRzLmxlbmd0aCkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImdlbmVyaWMgcmVjb3JkIGdldHRlciBjb3VudFwiLCBub2RlTG9jYXRpb24oZ2V0dGVyc1tkZWNsYXJhdGlvbi5maWVsZHMubGVuZ3RoXSA/PyBub2RlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBnZXR0ZXJzLmZvckVhY2goKGNhbmRpZGF0ZSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IGRlY2xhcmF0aW9uLmZpZWxkc1tpbmRleF1cblxuICAgIGlmIChjYW5kaWRhdGUua2luZCAhPSBcIm1ldGhvZFwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25jYW5vbmljYWwgZ2VuZXJpYyByZWNvcmQgZ2V0dGVyXCIsIG5vZGVMb2NhdGlvbihjYW5kaWRhdGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIGNvbnN0IGdldHRlciA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5NZXRob2R9ICovIChjYW5kaWRhdGUpXG4gICAgY29uc3QgbmFtZSA9IHR5cGVvZiBnZXR0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gZ2V0dGVyLm5hbWUgOiBnZXR0ZXIubmFtZS5uYW1lXG4gICAgY29uc3Qgc3RhdGVtZW50ID0gZ2V0dGVyLmJvZHk/LmNoaWxkcmVuWzBdXG4gICAgY29uc3QgcmV0dXJuZWQgPSBzdGF0ZW1lbnQ/LmtpbmQgPT0gXCJyZXR1cm5cIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5SZXR1cm59ICovIChzdGF0ZW1lbnQpLmV4cHIgOiB1bmRlZmluZWRcbiAgICBjb25zdCBsb29rdXAgPSByZXR1cm5lZD8ua2luZCA9PSBcInByb3BlcnR5bG9va3VwXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuUHJvcGVydHlMb29rdXB9ICovIChyZXR1cm5lZCkgOiB1bmRlZmluZWRcbiAgICBjb25zdCByZWNlaXZlciA9IGxvb2t1cD8ud2hhdC5raW5kID09IFwidmFyaWFibGVcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5WYXJpYWJsZX0gKi8gKGxvb2t1cC53aGF0KSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IG1lbWJlciA9IGxvb2t1cD8ub2Zmc2V0LmtpbmQgPT0gXCJpZGVudGlmaWVyXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuSWRlbnRpZmllcn0gKi8gKGxvb2t1cC5vZmZzZXQpIDogdW5kZWZpbmVkXG5cbiAgICBpZiAobmFtZSAhPSBmaWVsZC5uYW1lIHx8IGdldHRlci52aXNpYmlsaXR5ICE9IFwicHVibGljXCIgfHwgZ2V0dGVyLmlzU3RhdGljIHx8IGdldHRlci5pc0Fic3RyYWN0IHx8IGdldHRlci5pc0ZpbmFsIHx8XG4gICAgICBSZWZsZWN0LmdldChnZXR0ZXIsIFwiaXNSZWFkb25seVwiKSB8fCBnZXR0ZXIuYnlyZWYgfHwgZ2V0dGVyLmFyZ3VtZW50cy5sZW5ndGggfHwgZ2V0dGVyLmF0dHJHcm91cHMubGVuZ3RoIHx8XG4gICAgICAhZ2V0dGVyLmJvZHkgfHwgZ2V0dGVyLmJvZHkuY2hpbGRyZW4ubGVuZ3RoICE9IDEgfHwgcmVjZWl2ZXI/Lm5hbWUgIT0gXCJ0aGlzXCIgfHwgbWVtYmVyPy5uYW1lICE9IGZpZWxkLm5hbWUpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm5vbmNhbm9uaWNhbCBnZW5lcmljIHJlY29yZCBnZXR0ZXJcIiwgbm9kZUxvY2F0aW9uKGdldHRlciwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIGNvbnN0IGRvY3VtZW50ZWQgPSBmdW5jdGlvbkRvY3VtZW50ZWRUeXBlcyhcbiAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5GdW5jdGlvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGdldHRlcikpLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gICAgaWYgKGRvY3VtZW50ZWQucGFyYW1ldGVycy5zaXplIHx8IGRvY3VtZW50ZWQudHlwZVBhcmFtZXRlcnMgfHwgIWRvY3VtZW50ZWQucmV0dXJuVHlwZSkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibWlzc2luZyBvciBpbnZhbGlkIGdlbmVyaWMgcmVjb3JkIGdldHRlciB0eXBlXCIsIG5vZGVMb2NhdGlvbihnZXR0ZXIsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICBjb25zdCByZXR1cm5UeXBlID0gZG9jdW1lbnRlZFZhbHVlVHlwZSh7bGFuZ3VhZ2U6IFwicGhwXCIsIGxvY2F0aW9uOiBkb2N1bWVudGVkLnJldHVyblR5cGUubG9jYXRpb24sXG4gICAgICBvd25lckxvY2F0aW9uOiBub2RlTG9jYXRpb24oZ2V0dGVyLCBmaWxlbmFtZSwgc291cmNlKSwgcmVjb3JkczogcmVjb3JkTmFtZXMsIHNvdXJjZSxcbiAgICAgIHNvdXJjZVR5cGU6IGRvY3VtZW50ZWQucmV0dXJuVHlwZS5zb3VyY2VUeXBlLCBzdWJqZWN0OiBgUmVjb3JkIGdldHRlciAnJHtuYW1lfSdgLCB0eXBlUGFyYW1ldGVyc30pXG4gICAgY29uc3QgbmF0aXZlVHlwZSA9IHBocFR5cGVOYW1lKGdldHRlci50eXBlKVxuXG4gICAgaWYgKCFwaHBEb2N1bWVudGVkTmF0aXZlVHlwZU1hdGNoZXMobmF0aXZlVHlwZSwgZ2V0dGVyLm51bGxhYmxlLCByZXR1cm5UeXBlLCByZWNvcmROYW1lcykgfHxcbiAgICAgICFzYW1lVmFsdWVUeXBlKHJldHVyblR5cGUsIGZpZWxkLnR5cGUpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJnZW5lcmljIHJlY29yZCBnZXR0ZXIgdHlwZSBtaXNtYXRjaFwiLCBkb2N1bWVudGVkLnJldHVyblR5cGUubG9jYXRpb24pXG4gICAgfVxuICB9KVxufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBleGlzdGluZyBQSFAgaWYvZWxzZSB0ZXJtaW5hbCB3aXRoIHJlc3RyaWN0ZWQgYnJhbmNoIHByZWZpeGVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklmfSBub2RlIC0gUEhQIGlmIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JZlN0YXRlbWVudH0gU2VtYW50aWMgYnJhbmNoLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0SWYobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gIGlmIChub2RlLnNob3J0Rm9ybSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiYWx0ZXJuYXRpdmUgaWYgc3ludGF4XCIsIGxvY2F0aW9uKVxuICBpZiAobm9kZS5ib2R5LmtpbmQgIT0gXCJibG9ja1wiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJpZiB3aXRob3V0IGJsb2NrIGNvbnNlcXVlbnRcIiwgbG9jYXRpb24pXG4gIGlmIChub2RlLnRlc3Qua2luZCA9PSBcInZhcmlhYmxlXCIpIHtcbiAgICBjb25zdCB0ZXN0ZWQgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVmFyaWFibGV9ICovIChub2RlLnRlc3QpXG5cbiAgICBpZiAodHlwZW9mIHRlc3RlZC5uYW1lID09IFwic3RyaW5nXCIgJiYgY29udGV4dC5iaW5kaW5ncy5nZXQodGVzdGVkLm5hbWUpPy5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm9wdGlvbmFsIHRydXRoaW5lc3MgY29uZGl0aW9uXCIsIG5vZGVMb2NhdGlvbih0ZXN0ZWQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvbmRpdGlvbiA9IGNvbnZlcnRFeHByZXNzaW9uKG5vZGUudGVzdCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dClcbiAgY29uc3QgY29uc2VxdWVudENvbnRleHQgPSB7Li4uY29udGV4dCwgYmluZGluZ3M6IG5ldyBNYXAoY29udGV4dC5iaW5kaW5ncyl9XG4gIGNvbnN0IGFsdGVybmF0ZUNvbnRleHQgPSB7Li4uY29udGV4dCwgYmluZGluZ3M6IG5ldyBNYXAoY29udGV4dC5iaW5kaW5ncyl9XG4gIGxldCBhbHRlcm5hdGVcblxuICBpZiAobm9kZS5hbHRlcm5hdGUpIHtcbiAgICBpZiAobm9kZS5hbHRlcm5hdGUua2luZCA9PSBcImJsb2NrXCIpIHtcbiAgICAgIGFsdGVybmF0ZSA9IGNvbnZlcnRCbG9jaygvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuQmxvY2t9ICovIChub2RlLmFsdGVybmF0ZSksIGZpbGVuYW1lLCBzb3VyY2UsIGFsdGVybmF0ZUNvbnRleHQpXG4gICAgfSBlbHNlIGlmIChub2RlLmFsdGVybmF0ZS5raW5kID09IFwiaWZcIikge1xuICAgICAgY29uc3QgbmVzdGVkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklmfSAqLyAobm9kZS5hbHRlcm5hdGUpXG5cbiAgICAgIGFsdGVybmF0ZSA9IHtcbiAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiQmxvY2tcIiksXG4gICAgICAgIGxvY2F0aW9uOiBub2RlTG9jYXRpb24obmVzdGVkLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgICAgc3RhdGVtZW50czogW2NvbnZlcnRJZihuZXN0ZWQsIGZpbGVuYW1lLCBzb3VyY2UsIGFsdGVybmF0ZUNvbnRleHQpXVxuICAgICAgfVxuICAgIH0gZWxzZSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYGlmIGFsdGVybmF0ZSAke25vZGUuYWx0ZXJuYXRlLmtpbmR9YCwgbm9kZUxvY2F0aW9uKG5vZGUuYWx0ZXJuYXRlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uKGFsdGVybmF0ZSA/IHthbHRlcm5hdGV9IDoge30pLFxuICAgIGNvbmRpdGlvbixcbiAgICBjb25zZXF1ZW50OiBjb252ZXJ0QmxvY2sobm9kZS5ib2R5LCBmaWxlbmFtZSwgc291cmNlLCBjb25zZXF1ZW50Q29udGV4dCksXG4gICAga2luZDogXCJJZlN0YXRlbWVudFwiLFxuICAgIGxvY2F0aW9uXG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBleGFjdCBicmFjZWQgUEhQIGB3aGlsZSAoJGNvbmRpdGlvbikgeyAuLi4gfWAgc3ludGF4LlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLldoaWxlfSBub2RlIC0gUEhQIHdoaWxlIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5XaGlsZVN0YXRlbWVudH0gU2VtYW50aWMgbG9vcC5cbiAqL1xuZnVuY3Rpb24gY29udmVydFdoaWxlKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpIHtcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBpZiAobm9kZS5zaG9ydEZvcm0pIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImFsdGVybmF0aXZlIHdoaWxlIHN5bnRheFwiLCBsb2NhdGlvbilcbiAgaWYgKCFub2RlLmJvZHkgfHwgbm9kZS5ib2R5LmtpbmQgIT0gXCJibG9ja1wiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwid2hpbGUgd2l0aG91dCBibG9jayBib2R5XCIsIG5vZGUuYm9keSA/IG5vZGVMb2NhdGlvbihub2RlLmJvZHksIGZpbGVuYW1lLCBzb3VyY2UpIDogbG9jYXRpb24pXG4gIH1cbiAgY29uc3QgYm9keUNvbnRleHQgPSB7Li4uY29udGV4dCwgYmluZGluZ3M6IG5ldyBNYXAoY29udGV4dC5iaW5kaW5ncyl9XG5cbiAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgIGJvZHk6IGNvbnZlcnRCbG9jaygvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuQmxvY2t9ICovIChub2RlLmJvZHkpLCBmaWxlbmFtZSwgc291cmNlLCBib2R5Q29udGV4dCksXG4gICAgY29uZGl0aW9uOiBjb252ZXJ0RXhwcmVzc2lvbihub2RlLnRlc3QsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQsIHVuZGVmaW5lZCwgdHJ1ZSksXG4gICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiV2hpbGVTdGF0ZW1lbnRcIiksXG4gICAgbG9jYXRpb25cbiAgfSwge2tleXdvcmQ6IHRva2VuTG9jYXRpb24oXCJ3aGlsZVwiLCBub2RlLmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIG5vZGUudGVzdC5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKX0pXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBQSFAgZWNobyBlbnRyeSBwb2ludC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5FY2hvfSBub2RlIC0gUEhQIGVjaG8gbm9kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge1BocENvbnZlcnNpb25Db250ZXh0fSBjb250ZXh0IC0gVHlwZWQgY29udmVyc2lvbiBjb250ZXh0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlByaW50U3RhdGVtZW50fSBQcmludCBzdGF0ZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRQcmludChub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKG5vZGUuZXhwcmVzc2lvbnMubGVuZ3RoICE9IDIgfHwgbm9kZS5leHByZXNzaW9uc1sxXS5raW5kICE9IFwibmFtZVwiIHx8XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5hbWV9ICovIChub2RlLmV4cHJlc3Npb25zWzFdKS5uYW1lICE9IFwiUEhQX0VPTFwiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZWNobyB3aXRob3V0IG9uZSBleHByZXNzaW9uIGFuZCBQSFBfRU9MXCIsIGxvY2F0aW9uKVxuICB9XG5cbiAgcmV0dXJuIHtleHByZXNzaW9uOiBjb252ZXJ0RXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb25zWzBdLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSwga2luZDogXCJQcmludFN0YXRlbWVudFwiLCBsb2NhdGlvbn1cbn1cblxuLyoqXG4gKiBQYXJzZXMgUEhQIGludG8gdGhlIHNoYXJlZCBzZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBQYXJzZXIgaW5wdXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuc291cmNlIC0gU291cmNlIHRleHQuXG4gKiBAcGFyYW0ge3JlYWRvbmx5IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbltdfSBbaW5wdXQuY2FwYWJpbGl0aWVzXSAtIENvbXBpbGVyLWF1dGhvcml6ZWQgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHt7aXNFbnRyeTogYm9vbGVhbiwgZnVuY3Rpb25zOiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPiwgcmVjb3JkczogTWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24+LCBlcnJvcnM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9uPn19IFtpbnB1dC5wcm9ncmFtXSAtIFJlc29sdmVkIHByb2dyYW0gaW1wb3J0cyBhbmQgZW50cnkgcm9sZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gU2VtYW50aWMgbW9kdWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQaHAoe2NhcGFiaWxpdGllcyA9IFtdLCBmaWxlbmFtZSwgc291cmNlLCBwcm9ncmFtOiBwcm9ncmFtQ29udGV4dH0pIHtcbiAgY29uc3QgcHJvZ3JhbSA9IHBhcnNlUGhwUHJvZ3JhbShmaWxlbmFtZSwgc291cmNlKVxuICB2YWxpZGF0ZURlY2xhcmVOb2Rlcyhwcm9ncmFtLmNoaWxkcmVuLCBmaWxlbmFtZSwgc291cmNlKVxuICBsZXQgYm9keSA9IHRhc2swMzRQaHBCb2R5KHByb2dyYW0uY2hpbGRyZW4sIGNhcGFiaWxpdGllcywgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBpZiAocHJvZ3JhbUNvbnRleHQpIHtcbiAgICBpbnNwZWN0UGhwTW9kdWxlKHtmaWxlbmFtZSwgc291cmNlfSlcbiAgICBjb25zdCBuYW1lc3BhY2UgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTmFtZXNwYWNlfSAqLyAoYm9keS5maW5kKChub2RlKSA9PiBub2RlLmtpbmQgPT0gXCJuYW1lc3BhY2VcIikpXG5cbiAgICBib2R5ID0gbmFtZXNwYWNlLmNoaWxkcmVuLmZpbHRlcigobm9kZSkgPT4gbm9kZS5raW5kICE9IFwidXNlZ3JvdXBcIiAmJiAhaXNQaHBSZXF1aXJlT25jZShub2RlKSlcbiAgfVxuICBjb25zdCBjbGFzc05vZGVzID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkNsYXNzW119ICovIChib2R5LmZpbHRlcigobm9kZSkgPT4gbm9kZS5raW5kID09IFwiY2xhc3NcIikpXG4gIGNvbnN0IGVycm9yTm9kZXMgPSBjbGFzc05vZGVzLmZpbHRlcigobm9kZSkgPT4gbm9kZS5leHRlbmRzPy5raW5kID09IFwibmFtZVwiICYmXG4gICAgW1wiUnVudGltZUV4Y2VwdGlvblwiLCBcIlxcXFxSdW50aW1lRXhjZXB0aW9uXCJdLmluY2x1ZGVzKG5vZGUuZXh0ZW5kcy5uYW1lKSlcbiAgY29uc3QgcmVmZXJlbmNlQ2xhc3NOb2RlcyA9IGNsYXNzTm9kZXMuZmlsdGVyKChub2RlKSA9PiAhZXJyb3JOb2Rlcy5pbmNsdWRlcyhub2RlKSAmJlxuICAgIG5vZGUuYm9keS5zb21lKChtZW1iZXIpID0+IG1lbWJlci5raW5kID09IFwicHJvcGVydHlzdGF0ZW1lbnRcIikpXG4gIGNvbnN0IHJlY29yZE5vZGVzID0gY2xhc3NOb2Rlcy5maWx0ZXIoKG5vZGUpID0+ICFlcnJvck5vZGVzLmluY2x1ZGVzKG5vZGUpICYmICFyZWZlcmVuY2VDbGFzc05vZGVzLmluY2x1ZGVzKG5vZGUpKVxuICBjb25zdCBlcnJvckRlY2xhcmF0aW9ucyA9IGVycm9yTm9kZXMubWFwKChub2RlLCBpbmRleCkgPT4gKHtcbiAgICBpZDogYGVycm9yOiR7aW5kZXh9YCxcbiAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJFcnJvckRlY2xhcmF0aW9uXCIpLFxuICAgIGxvY2F0aW9uOiBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgbmFtZTogdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZS5uYW1lIDogbm9kZS5uYW1lLm5hbWVcbiAgfSkpXG4gIGNvbnN0IHJlY29yZERlY2xhcmF0aW9ucyA9IHJlY29yZE5vZGVzLm1hcCgobm9kZSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBpZCA9IGByZWNvcmQ6JHtpbmRleH1gXG4gICAgY29uc3QgdHlwZVBhcmFtZXRlcnMgPSBjbGFzc0RvY3VtZW50ZWRUeXBlUGFyYW1ldGVycyhub2RlLCBpZCwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICAgIHJldHVybiB7XG4gICAgICBmaWVsZHM6IFtdLFxuICAgICAgaWQsXG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJSZWNvcmREZWNsYXJhdGlvblwiKSxcbiAgICAgIGxvY2F0aW9uOiBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgICBuYW1lOiB0eXBlb2Ygbm9kZS5uYW1lID09IFwic3RyaW5nXCIgPyBub2RlLm5hbWUgOiBub2RlLm5hbWUubmFtZSxcbiAgICAgIC4uLih0eXBlUGFyYW1ldGVycyA/IHt0eXBlUGFyYW1ldGVyc30gOiB7fSlcbiAgICB9XG4gIH0pXG4gIGNvbnN0IGNsYXNzRGVjbGFyYXRpb25zID0gcmVmZXJlbmNlQ2xhc3NOb2Rlcy5tYXAoKG5vZGUsIGluZGV4KSA9PiAoe1xuICAgIGNvbnN0cnVjdG9yOiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNvbnN0cnVjdG9yRGVjbGFyYXRpb259ICovICh7fSksXG4gICAgZmllbGRzOiBbXSwgaWQ6IGBjbGFzczoke2luZGV4fWAsIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkNsYXNzRGVjbGFyYXRpb25cIiksXG4gICAgbG9jYXRpb246IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKSwgbWV0aG9kczogW10sXG4gICAgbmFtZTogdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZS5uYW1lIDogbm9kZS5uYW1lLm5hbWVcbiAgfSkpXG4gIGNvbnN0IHJlY29yZE5hbWVzID0gLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uPn0gKi8gKFxuICAgIG5ldyBNYXAocHJvZ3JhbUNvbnRleHQ/LnJlY29yZHMgPz8gW10pKVxuICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIGNhcGFiaWxpdGllcy5mbGF0TWFwKCh7cmVzb3VyY2VzfSkgPT4gcmVzb3VyY2VzKSkgcmVjb3JkTmFtZXMuc2V0KHJlc291cmNlLm5hbWUsIHJlc291cmNlKVxuICBjb25zdCBlcnJvck5hbWVzID0gbmV3IE1hcChwcm9ncmFtQ29udGV4dD8uZXJyb3JzID8/IFtdKVxuICBmb3IgKGNvbnN0IGZhaWx1cmUgb2YgY2FwYWJpbGl0aWVzLmZsYXRNYXAoKHtmYWlsdXJlc30pID0+IGZhaWx1cmVzKSkge1xuICAgIGVycm9yTmFtZXMuc2V0KGZhaWx1cmUubmFtZSwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9ufSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoZmFpbHVyZSkpKVxuICB9XG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgZXJyb3JEZWNsYXJhdGlvbnMpIGVycm9yTmFtZXMuc2V0KGRlY2xhcmF0aW9uLm5hbWUsIGRlY2xhcmF0aW9uKVxuICBjb25zdCBlcnJvcnNCeUlkID0gbmV3IE1hcChbLi4uZXJyb3JOYW1lcy52YWx1ZXMoKV0ubWFwKChkZWNsYXJhdGlvbikgPT4gWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBkZWNsYXJhdGlvbl0pKVxuICBjb25zdCBlcnJvcnMgPSBlcnJvck5vZGVzLm1hcCgobm9kZSwgaW5kZXgpID0+IGNvbnZlcnRQaHBFcnJvcihub2RlLCBlcnJvckRlY2xhcmF0aW9uc1tpbmRleF0sIGZpbGVuYW1lLCBzb3VyY2UpKVxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIHJlY29yZERlY2xhcmF0aW9ucykgcmVjb3JkTmFtZXMuc2V0KGRlY2xhcmF0aW9uLm5hbWUsIGRlY2xhcmF0aW9uKVxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIGNsYXNzRGVjbGFyYXRpb25zKSByZWNvcmROYW1lcy5zZXQoZGVjbGFyYXRpb24ubmFtZSwgZGVjbGFyYXRpb24pXG4gIGNvbnN0IHJlY29yZHNCeUlkID0gbmV3IE1hcChbLi4ucmVjb3JkTmFtZXMudmFsdWVzKCldXG4gICAgLmZpbHRlcigoZGVjbGFyYXRpb24pID0+IGRlY2xhcmF0aW9uLmtpbmQgPT0gXCJSZWNvcmREZWNsYXJhdGlvblwiKVxuICAgIC5tYXAoKGRlY2xhcmF0aW9uKSA9PiBbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIGRlY2xhcmF0aW9uXSkpXG4gIGNvbnN0IGNsYXNzZXNCeUlkID0gbmV3IE1hcChjbGFzc0RlY2xhcmF0aW9ucy5tYXAoKGRlY2xhcmF0aW9uKSA9PiBbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIGRlY2xhcmF0aW9uXSkpXG4gIGNvbnN0IHJlY29yZHMgPSByZWNvcmROb2Rlcy5tYXAoKG5vZGUsIGluZGV4KSA9PiBjb252ZXJ0UGhwUmVjb3JkKG5vZGUsIHJlY29yZERlY2xhcmF0aW9uc1tpbmRleF0sXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj59ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChyZWNvcmROYW1lcykpLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgY29uc3QgZnVuY3Rpb25Ob2RlcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5GdW5jdGlvbltdfSAqLyAoYm9keS5maWx0ZXIoKG5vZGUpID0+IG5vZGUua2luZCA9PSBcImZ1bmN0aW9uXCIpKVxuICBjb25zdCBzaWduYXR1cmVzID0gZnVuY3Rpb25Ob2Rlcy5tYXAoKG5vZGUsIGluZGV4KSA9PiBjb252ZXJ0RnVuY3Rpb25TaWduYXR1cmUobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgcmVjb3JkTmFtZXMsIGBmdW5jdGlvbjoke2luZGV4fWApKVxuICBjb25zdCBmdW5jdGlvblNpZ25hdHVyZXMgPSBuZXcgTWFwKFsuLi5jYXBhYmlsaXR5RnVuY3Rpb25TaWduYXR1cmVzKGNhcGFiaWxpdGllcywgbW9kdWxlTG9jYXRpb24oZmlsZW5hbWUsIHNvdXJjZSkpLFxuICAgIC4uLihwcm9ncmFtQ29udGV4dD8uZnVuY3Rpb25zID8/IFtdKV0ubWFwKChbbG9jYWxOYW1lLCBkZWNsYXJhdGlvbl0pID0+IFtsb2NhbE5hbWUsIHtcbiAgICBsb2NhdGlvbjogZGVjbGFyYXRpb24ubG9jYXRpb24sXG4gICAgbmFtZTogbG9jYWxOYW1lLFxuICAgIG5hbWVMb2NhdGlvbjogZGVjbGFyYXRpb24ubG9jYXRpb24sXG4gICAgcGFyYW1ldGVyczogZGVjbGFyYXRpb24ucGFyYW1ldGVycyxcbiAgICByZXR1cm5UeXBlOiBkZWNsYXJhdGlvbi5yZXR1cm5UeXBlLFxuICAgIC4uLihkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycyA/IHt0eXBlUGFyYW1ldGVyczogZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnN9IDoge30pXG4gIH1dKSlcbiAgZm9yIChjb25zdCBzaWduYXR1cmUgb2Ygc2lnbmF0dXJlcykgZnVuY3Rpb25TaWduYXR1cmVzLnNldChzaWduYXR1cmUubmFtZSwgc2lnbmF0dXJlKVxuICBjb25zdCBjbGFzc2VzID0gcmVmZXJlbmNlQ2xhc3NOb2Rlcy5tYXAoKG5vZGUsIGluZGV4KSA9PiBjb252ZXJ0UGhwUmVmZXJlbmNlQ2xhc3Mobm9kZSwgY2xhc3NEZWNsYXJhdGlvbnNbaW5kZXhdLFxuICAgIHJlY29yZE5hbWVzLCByZWNvcmRzQnlJZCwgY2xhc3Nlc0J5SWQsIGZ1bmN0aW9uU2lnbmF0dXJlcywgZXJyb3JOYW1lcywgZXJyb3JzQnlJZCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIGNvbnN0IGZ1bmN0aW9ucyA9IGZ1bmN0aW9uTm9kZXMubWFwKChub2RlLCBpbmRleCkgPT5cbiAgICBjb252ZXJ0RnVuY3Rpb24obm9kZSwgc2lnbmF0dXJlc1tpbmRleF0sIGZ1bmN0aW9uU2lnbmF0dXJlcywgcmVjb3JkTmFtZXMsIHJlY29yZHNCeUlkLCBjbGFzc2VzQnlJZCwgZXJyb3JOYW1lcywgZXJyb3JzQnlJZCxcbiAgICAgIGZpbGVuYW1lLCBzb3VyY2UpKVxuICBjb25zdCBleGVjdXRhYmxlTm9kZXMgPSBib2R5LmZpbHRlcigobm9kZSkgPT4gIVtcImNsYXNzXCIsIFwiZnVuY3Rpb25cIiwgXCJkZWNsYXJlXCIsIFwibm9vcFwiXS5pbmNsdWRlcyhub2RlLmtpbmQpKVxuICBjb25zdCBsb2NhdGlvbiA9IG1vZHVsZUxvY2F0aW9uKGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKHByb2dyYW1Db250ZXh0ICYmICFwcm9ncmFtQ29udGV4dC5pc0VudHJ5ICYmIGV4ZWN1dGFibGVOb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwidG9wLWxldmVsIHNpZGUgZWZmZWN0IG91dHNpZGUgdGhlIHNlbGVjdGVkIGVudHJ5IG1vZHVsZVwiLCBub2RlTG9jYXRpb24oZXhlY3V0YWJsZU5vZGVzWzBdLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBjb25zdCBmaXJzdCA9IGV4ZWN1dGFibGVOb2Rlc1swXVxuICBjb25zdCBsYXN0ID0gZXhlY3V0YWJsZU5vZGVzLmF0KC0xKSA/PyBmaXJzdFxuICBjb25zdCBlbnRyeUxvY2F0aW9uID0gZmlyc3RcbiAgICA/IGxvY2F0aW9uRnJvbU9mZnNldHMoZmlsZW5hbWUsIHNvdXJjZSwgZmlyc3QubG9jPy5zdGFydC5vZmZzZXQgPz8gMCwgbGFzdD8ubG9jPy5lbmQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgpXG4gICAgOiBsb2NhdGlvblxuICBjb25zdCBlbnRyeUNvbnRleHQgPSB7XG4gICAgYmluZGluZ3M6IG5ldyBNYXAoKSxcbiAgICBjbGFzc2VzOiBjbGFzc2VzQnlJZCxcbiAgICBlcnJvck5hbWVzLFxuICAgIGVycm9yczogZXJyb3JzQnlJZCxcbiAgICBmdW5jdGlvbnM6IGZ1bmN0aW9uU2lnbmF0dXJlcyxcbiAgICBvcmRlcmVkTWFwRGVjbGFyYXRpb25zOiBvcmRlcmVkTWFwRGVjbGFyYXRpb25zRm9yUGhwKGV4ZWN1dGFibGVOb2RlcyksXG4gICAgcmVjb3JkTmFtZXMsXG4gICAgcmVjb3JkczogcmVjb3Jkc0J5SWQsXG4gICAgcmV0dXJuVHlwZTogdW5kZWZpbmVkXG4gIH1cbiAgY29uc3QgZW50cnlCbG9jayA9IHtcbiAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJCbG9ja1wiKSxcbiAgICBsb2NhdGlvbjogZW50cnlMb2NhdGlvbixcbiAgICBzdGF0ZW1lbnRzOiBleGVjdXRhYmxlTm9kZXMubWFwKChub2RlKSA9PiBjb252ZXJ0U3RhdGVtZW50KG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIGVudHJ5Q29udGV4dCkpXG4gIH1cblxuICBpZiAoIXByb2dyYW1Db250ZXh0ICYmIGZ1bmN0aW9ucy5sZW5ndGggPT0gMCAmJiBjYXBhYmlsaXRpZXMubGVuZ3RoID09IDAgJiYgIWJsb2NrUmVmZXJlbmNlc1Byb3RlY3RlZEVudHJ5KGVudHJ5QmxvY2spKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibW9kdWxlIHdpdGhvdXQgYSBmdW5jdGlvblwiLCBsb2NhdGlvbilcbiAgfVxuICByZXR1cm4ge1xuICAgIGVudHJ5UG9pbnQ6IHtcbiAgICAgIGJvZHk6IGVudHJ5QmxvY2ssXG4gICAgICBraW5kOiBcIkVudHJ5UG9pbnRcIixcbiAgICAgIGxvY2F0aW9uOiBlbnRyeUxvY2F0aW9uXG4gICAgfSxcbiAgICBmdW5jdGlvbnMsXG4gICAga2luZDogXCJNb2R1bGVcIixcbiAgICBsb2NhdGlvbixcbiAgICAuLi4oZXJyb3JzLmxlbmd0aCA+IDAgPyB7ZXJyb3JzfSA6IHt9KSxcbiAgICAuLi4oY2xhc3Nlcy5sZW5ndGggPiAwID8ge2NsYXNzZXN9IDoge30pLFxuICAgIC4uLihyZWNvcmRzLmxlbmd0aCA+IDAgPyB7cmVjb3Jkc30gOiB7fSlcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZXMgZXhhY3QgcHJvdGVjdGVkIFBIUCBwcm9iZSBzdXBwb3J0IGJlZm9yZSBwb3J0YWJsZSBjb252ZXJzaW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlN0YXRlbWVudFtdfSBib2R5IC0gUGFyc2VkIHRvcC1sZXZlbCBzdGF0ZW1lbnRzLlxuICogQHBhcmFtIHtyZWFkb25seSBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gY2FwYWJpbGl0aWVzIC0gQXV0aG9yaXplZCBkZWNsYXJhdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcInBocC1wYXJzZXJcIikuU3RhdGVtZW50W119IFBvcnRhYmxlIHN0YXRlbWVudHMuXG4gKi9cbmZ1bmN0aW9uIHRhc2swMzRQaHBCb2R5KGJvZHksIGNhcGFiaWxpdGllcywgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBpZiAoIWlzVGFzazAzNFJlc291cmNlUHJvYmUoY2FwYWJpbGl0aWVzKSkgcmV0dXJuIGJvZHlcbiAgY29uc3Qgc3RhcnQgPSBib2R5LmZpbmRJbmRleCgobm9kZSkgPT4gbm9kZS5sZWFkaW5nQ29tbWVudHM/LnNvbWUoKHt2YWx1ZX0pID0+IHZhbHVlID09IFwiLyogc2VtYW50aWZvbGQtdGFzazAzNC1zdXBwb3J0ICovXCIpKVxuXG4gIGlmIChzdGFydCA8IDApIHJldHVybiBib2R5XG4gIGlmICghaGFzRXhhY3RFZmZlY3RTdXBwb3J0KHNvdXJjZSwgXCJwaHBcIikpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJtYWxmb3JtZWQgcHJvdGVjdGVkIFRhc2sgMDM0IHN1cHBvcnRcIiwgbm9kZUxvY2F0aW9uKGJvZHlbc3RhcnRdLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBjb25zdCBleHBlY3RlZCA9IFtcbiAgICBbXCJjbGFzc1wiLCBcIlByb2JlT3BlcmF0aW9uRmFpbHVyZVwiXSwgW1wiY2xhc3NcIiwgXCJQcm9iZUFjcXVpcmVGYWlsdXJlXCJdLCBbXCJjbGFzc1wiLCBcIlByb2JlUmVhZEZhaWx1cmVcIl0sXG4gICAgW1wiY2xhc3NcIiwgXCJQcm9iZUNsb3NlRmFpbHVyZVwiXSwgW1wiY2xhc3NcIiwgXCJQcm9iZVJlc291cmNlQ2xvc2VkXCJdLCBbXCJjbGFzc1wiLCBcIlByb2JlUmVzb3VyY2VcIl0sXG4gICAgW1wiZXhwcmVzc2lvbnN0YXRlbWVudFwiLCB1bmRlZmluZWRdLCBbXCJmdW5jdGlvblwiLCBcInByb2JlRWZmZWN0XCJdLCBbXCJmdW5jdGlvblwiLCBcInByb2JlQWNxdWlyZVwiXSxcbiAgICBbXCJmdW5jdGlvblwiLCBcInByb2JlUmVhZFwiXSwgW1wiZnVuY3Rpb25cIiwgXCJwcm9iZUNsb3NlXCJdLCBbXCJmdW5jdGlvblwiLCBcInByb2JlVHJhY2VcIl1cbiAgXVxuICBjb25zdCBtYXRjaGVzID0gZXhwZWN0ZWQuZXZlcnkoKFtraW5kLCBuYW1lXSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBub2RlID0gYm9keVtzdGFydCArIGluZGV4XVxuICAgIGNvbnN0IHJhd05hbWUgPSBub2RlID8gUmVmbGVjdC5nZXQobm9kZSwgXCJuYW1lXCIpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgYWN0dWFsTmFtZSA9IHR5cGVvZiByYXdOYW1lID09IFwic3RyaW5nXCIgPyByYXdOYW1lIDogcmF3TmFtZSAmJiB0eXBlb2YgcmF3TmFtZSA9PSBcIm9iamVjdFwiID8gUmVmbGVjdC5nZXQocmF3TmFtZSwgXCJuYW1lXCIpIDogdW5kZWZpbmVkXG4gICAgcmV0dXJuIG5vZGU/LmtpbmQgPT0ga2luZCAmJiBhY3R1YWxOYW1lID09IG5hbWVcbiAgfSlcbiAgY29uc3QgbmV4dCA9IGJvZHlbc3RhcnQgKyBleHBlY3RlZC5sZW5ndGhdXG5cbiAgaWYgKCFtYXRjaGVzIHx8IG5leHQgJiYgIW5leHQubGVhZGluZ0NvbW1lbnRzPy5zb21lKCh7dmFsdWV9KSA9PiB2YWx1ZSA9PSBcIi8qIHNlbWFudGlmb2xkLXRhc2swMzQtc3VwcG9ydC1lbmQgKi9cIikpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJtYWxmb3JtZWQgcHJvdGVjdGVkIFRhc2sgMDM0IHN1cHBvcnRcIiwgbm9kZUxvY2F0aW9uKGJvZHlbc3RhcnRdLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICByZXR1cm4gWy4uLmJvZHkuc2xpY2UoMCwgc3RhcnQpLCAuLi5ib2R5LnNsaWNlKHN0YXJ0ICsgZXhwZWN0ZWQubGVuZ3RoKV1cbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgY2Fub25pY2FsIHBhcnNlci1vd25lZCBQSFAgbmFtZXNwYWNlLCB1c2UgYmluZGluZ3MsIGFuZCBsaXRlcmFsIHJlcXVpcmVfb25jZSBlZGdlcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dCAtIFBhcnNlciBpbnB1dC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dC5maWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dC5zb3VyY2UgLSBTb3VyY2UgdGV4dC5cbiAqIEByZXR1cm5zIHt7YmluZGluZ3M6IHtpbXBvcnRlZE5hbWU6IHN0cmluZywgbG9jYWxOYW1lOiBzdHJpbmcsIGxvY2F0aW9uOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiwgbmF0aXZlTmFtZTogc3RyaW5nLCBzeW1ib2xLaW5kOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0RlY2xhcmF0aW9uS2luZCwgdHlwZU9ubHk6IGZhbHNlfVtdLCBpbXBvcnRzOiB7aW1wb3J0ZWROYW1lOiBzdHJpbmcsIGxvY2FsTmFtZTogc3RyaW5nLCBsb2NhdGlvbjogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIG5hbWVzcGFjZTogdHJ1ZSwgcGF0aExvY2F0aW9uOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiwgc3BlY2lmaWVyOiBzdHJpbmcsIHR5cGVPbmx5OiBmYWxzZX1bXSwgZXhwb3J0czoge2V4cG9ydGVkTmFtZTogc3RyaW5nLCBsb2NhbE5hbWU6IHN0cmluZywgbG9jYXRpb246IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uLCB0eXBlT25seTogZmFsc2V9W10sIG5hdGl2ZU5hbWU6IHN0cmluZ319IFBhcnNlci1vd25lZCBQSFAgbW9kdWxlIGhlYWRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3BlY3RQaHBNb2R1bGUoe2ZpbGVuYW1lLCBzb3VyY2V9KSB7XG4gIGNvbnN0IHByb2dyYW0gPSBwYXJzZVBocFByb2dyYW0oZmlsZW5hbWUsIHNvdXJjZSlcblxuICB2YWxpZGF0ZURlY2xhcmVOb2Rlcyhwcm9ncmFtLmNoaWxkcmVuLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBuYW1lc3BhY2VzID0gcHJvZ3JhbS5jaGlsZHJlbi5maWx0ZXIoKG5vZGUpID0+IG5vZGUua2luZCA9PSBcIm5hbWVzcGFjZVwiKVxuICBjb25zdCBpbnZhbGlkT3V0ZXIgPSBwcm9ncmFtLmNoaWxkcmVuLmZpbmQoKG5vZGUpID0+ICFbXCJkZWNsYXJlXCIsIFwibmFtZXNwYWNlXCIsIFwibm9vcFwiXS5pbmNsdWRlcyhub2RlLmtpbmQpKVxuICBjb25zdCBuYW1lc3BhY2UgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTmFtZXNwYWNlIHwgdW5kZWZpbmVkfSAqLyAobmFtZXNwYWNlc1swXSlcblxuICBpZiAoIW5hbWVzcGFjZSB8fCBuYW1lc3BhY2VzLmxlbmd0aCAhPSAxIHx8IG5hbWVzcGFjZS53aXRoQnJhY2tldHMgfHwgdHlwZW9mIG5hbWVzcGFjZS5uYW1lICE9IFwic3RyaW5nXCIgfHwgaW52YWxpZE91dGVyKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwib25lIGNhbm9uaWNhbCB1bmJyYWNrZXRlZCBuYW1lc3BhY2VcIixcbiAgICAgIG5vZGVMb2NhdGlvbihpbnZhbGlkT3V0ZXIgPz8gbmFtZXNwYWNlc1sxXSA/PyBuYW1lc3BhY2UgPz8gcHJvZ3JhbSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbiAgY29uc3QgYmluZGluZ3MgPSBbXVxuXG4gIGZvciAoY29uc3Qgbm9kZSBvZiBuYW1lc3BhY2UuY2hpbGRyZW4uZmlsdGVyKChjaGlsZCkgPT4gY2hpbGQua2luZCA9PSBcInVzZWdyb3VwXCIpKSB7XG4gICAgY29uc3QgZ3JvdXAgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVXNlR3JvdXB9ICovIChub2RlKVxuXG4gICAgaWYgKGdyb3VwLm5hbWUgIT09IG51bGwgfHwgIVtudWxsLCBcImZ1bmN0aW9uXCJdLmluY2x1ZGVzKGdyb3VwLnR5cGUpIHx8IGdyb3VwLml0ZW1zLmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJncm91cGVkLCBjb25zdGFudCwgb3IgZW1wdHkgdXNlIGRlY2xhcmF0aW9uXCIsIG5vZGVMb2NhdGlvbihncm91cCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBncm91cC5pdGVtcykge1xuICAgICAgaWYgKGl0ZW0udHlwZSAhPT0gbnVsbCB8fCB0eXBlb2YgaXRlbS5uYW1lICE9IFwic3RyaW5nXCIgfHwgIWl0ZW0ubmFtZS5pbmNsdWRlcyhcIlxcXFxcIikpIHtcbiAgICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZ3JvdXBlZCBvciB1bnF1YWxpZmllZCB1c2UgaXRlbVwiLCBub2RlTG9jYXRpb24oaXRlbSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgICB9XG4gICAgICBjb25zdCBpbXBvcnRlZE5hbWUgPSBpdGVtLm5hbWUuc3BsaXQoXCJcXFxcXCIpLmF0KC0xKVxuICAgICAgY29uc3QgYWxpYXMgPSBpdGVtLmFsaWFzXG5cbiAgICAgIGlmICghaW1wb3J0ZWROYW1lIHx8IGFsaWFzICYmIGFsaWFzLmtpbmQgIT0gXCJpZGVudGlmaWVyXCIpIHtcbiAgICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiaW52YWxpZCB1c2UgYWxpYXNcIiwgbm9kZUxvY2F0aW9uKGl0ZW0sIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgICAgfVxuICAgICAgYmluZGluZ3MucHVzaCh7XG4gICAgICAgIGltcG9ydGVkTmFtZSxcbiAgICAgICAgbG9jYWxOYW1lOiBhbGlhcyA/IGFsaWFzLm5hbWUgOiBpbXBvcnRlZE5hbWUsXG4gICAgICAgIGxvY2F0aW9uOiBub2RlTG9jYXRpb24oaXRlbSwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgICAgIG5hdGl2ZU5hbWU6IGl0ZW0ubmFtZSxcbiAgICAgICAgc3ltYm9sS2luZDogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0RlY2xhcmF0aW9uS2luZH0gKi8gKGdyb3VwLnR5cGUgPT0gXCJmdW5jdGlvblwiID8gXCJmdW5jdGlvblwiIDogXCJyZWNvcmRcIiksXG4gICAgICAgIHR5cGVPbmx5OiAvKiogQHR5cGUge2NvbnN0fSAqLyAoZmFsc2UpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuICBjb25zdCBpbXBvcnRzID0gbmFtZXNwYWNlLmNoaWxkcmVuLmZpbHRlcihpc1BocEluY2x1ZGVTdGF0ZW1lbnQpLm1hcCgobm9kZSkgPT4ge1xuICAgIGlmICghaXNQaHBSZXF1aXJlT25jZShub2RlKSkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiaW5jbHVkZS9yZXF1aXJlIG91dHNpZGUgbGl0ZXJhbCByZXF1aXJlX29uY2UgX19ESVJfXyBwcm9maWxlXCIsIG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkV4cHJlc3Npb25TdGF0ZW1lbnR9ICovIChub2RlKVxuICAgIGNvbnN0IGluY2x1ZGUgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuSW5jbHVkZX0gKi8gKHN0YXRlbWVudC5leHByZXNzaW9uKVxuICAgIGNvbnN0IHRhcmdldCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5CaW59ICovIChpbmNsdWRlLnRhcmdldClcbiAgICBjb25zdCBwYXRoID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlN0cmluZ30gKi8gKHRhcmdldC5yaWdodClcblxuICAgIGlmICghcGF0aC52YWx1ZS5zdGFydHNXaXRoKFwiL1wiKSB8fCBwYXRoLnZhbHVlLmluY2x1ZGVzKFwiXFwwXCIpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJ1bnNhZmUgcmVxdWlyZV9vbmNlIHBhdGhcIiwgbm9kZUxvY2F0aW9uKHBhdGgsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpbXBvcnRlZE5hbWU6IFwiKlwiLFxuICAgICAgbG9jYWxOYW1lOiBcIlwiLFxuICAgICAgbG9jYXRpb246IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIG5hbWVzcGFjZTogLyoqIEB0eXBlIHtjb25zdH0gKi8gKHRydWUpLFxuICAgICAgcGF0aExvY2F0aW9uOiBub2RlTG9jYXRpb24ocGF0aCwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgICBzcGVjaWZpZXI6IGAuJHtwYXRoLnZhbHVlfWAsXG4gICAgICB0eXBlT25seTogLyoqIEB0eXBlIHtjb25zdH0gKi8gKGZhbHNlKVxuICAgIH1cbiAgfSlcbiAgY29uc3QgZXhwb3J0cyA9IG5hbWVzcGFjZS5jaGlsZHJlbi5mbGF0TWFwKChub2RlKSA9PiB7XG4gICAgaWYgKG5vZGUua2luZCAhPSBcImNsYXNzXCIgJiYgbm9kZS5raW5kICE9IFwiZnVuY3Rpb25cIikgcmV0dXJuIFtdXG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuQ2xhc3MgfCBpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkZ1bmN0aW9ufSAqLyAobm9kZSlcbiAgICBjb25zdCBuYW1lID0gdHlwZW9mIGRlY2xhcmF0aW9uLm5hbWUgPT0gXCJzdHJpbmdcIiA/IGRlY2xhcmF0aW9uLm5hbWUgOiBkZWNsYXJhdGlvbi5uYW1lLm5hbWVcblxuICAgIHJldHVybiBbe2V4cG9ydGVkTmFtZTogbmFtZSwgbG9jYWxOYW1lOiBuYW1lLCBsb2NhdGlvbjogbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpLCB0eXBlT25seTogLyoqIEB0eXBlIHtjb25zdH0gKi8gKGZhbHNlKX1dXG4gIH0pXG5cbiAgcmV0dXJuIHtiaW5kaW5ncywgZXhwb3J0cywgaW1wb3J0cywgbmF0aXZlTmFtZTogbmFtZXNwYWNlLm5hbWV9XG59XG5cbi8qKlxuICogUmVwb3J0cyB3aGV0aGVyIGEgUEhQIHN0YXRlbWVudCBpcyBhbnkgaW5jbHVkZS9yZXF1aXJlIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZX0gbm9kZSAtIENhbmRpZGF0ZSBzdGF0ZW1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgbm9kZSBpcyBhbiBpbmNsdWRlIGV4cHJlc3Npb24gc3RhdGVtZW50LlxuICovXG5mdW5jdGlvbiBpc1BocEluY2x1ZGVTdGF0ZW1lbnQobm9kZSkge1xuICByZXR1cm4gbm9kZS5raW5kID09IFwiZXhwcmVzc2lvbnN0YXRlbWVudFwiICYmXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkV4cHJlc3Npb25TdGF0ZW1lbnR9ICovIChub2RlKS5leHByZXNzaW9uLmtpbmQgPT0gXCJpbmNsdWRlXCJcbn1cblxuLyoqXG4gKiBSZXBvcnRzIHdoZXRoZXIgYSBQSFAgc3RhdGVtZW50IGlzIHRoZSBjYW5vbmljYWwgbGl0ZXJhbCBwcm9qZWN0IGxvYWQgZWRnZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Ob2RlfSBub2RlIC0gQ2FuZGlkYXRlIHN0YXRlbWVudC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBub2RlIGlzIGEgc3VwcG9ydGVkIHJlcXVpcmUtb25jZSBzdGF0ZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGlzUGhwUmVxdWlyZU9uY2Uobm9kZSkge1xuICBpZiAoIWlzUGhwSW5jbHVkZVN0YXRlbWVudChub2RlKSkgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IHN0YXRlbWVudCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5FeHByZXNzaW9uU3RhdGVtZW50fSAqLyAobm9kZSlcbiAgY29uc3QgaW5jbHVkZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JbmNsdWRlfSAqLyAoc3RhdGVtZW50LmV4cHJlc3Npb24pXG4gIGNvbnN0IHRhcmdldCA9IGluY2x1ZGUudGFyZ2V0LmtpbmQgPT0gXCJiaW5cIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5CaW59ICovIChpbmNsdWRlLnRhcmdldCkgOiB1bmRlZmluZWRcbiAgY29uc3QgbGVmdCA9IHRhcmdldD8ubGVmdC5raW5kID09IFwibWFnaWNcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5NYWdpY30gKi8gKHRhcmdldC5sZWZ0KSA6IHVuZGVmaW5lZFxuXG4gIHJldHVybiBpbmNsdWRlLm9uY2UgJiYgaW5jbHVkZS5yZXF1aXJlICYmIHRhcmdldD8udHlwZSA9PSBcIi5cIiAmJlxuICAgIGxlZnQ/LnZhbHVlID09IFwiX19ESVJfX1wiICYmIHRhcmdldC5yaWdodC5raW5kID09IFwic3RyaW5nXCJcbn1cblxuLyoqXG4gKiBBY2NlcHRzIG9ubHkgYW4gb3B0aW9uYWwgc2luZ2xlIGBkZWNsYXJlKHN0cmljdF90eXBlcz0xKWAgZGlyZWN0aXZlLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5vZGVbXX0gbm9kZXMgLSBUb3AtbGV2ZWwgUEhQIG5vZGVzLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZURlY2xhcmVOb2Rlcyhub2RlcywgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBjb25zdCBkZWNsYXJhdGlvbnMgPSBub2Rlcy5maWx0ZXIoKG5vZGUpID0+IG5vZGUua2luZCA9PSBcImRlY2xhcmVcIilcblxuICBpZiAoZGVjbGFyYXRpb25zLmxlbmd0aCA+IDEpIHtcbiAgICB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm11bHRpcGxlIGRlY2xhcmUgZGlyZWN0aXZlc1wiLCBub2RlTG9jYXRpb24oZGVjbGFyYXRpb25zWzFdLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb25Ob2RlIG9mIGRlY2xhcmF0aW9ucykge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkRlY2xhcmV9ICovIChkZWNsYXJhdGlvbk5vZGUpXG4gICAgY29uc3QgZGlyZWN0aXZlID0gZGVjbGFyYXRpb24uZGlyZWN0aXZlc1swXVxuICAgIGNvbnN0IGtleSA9IGRpcmVjdGl2ZT8ua2V5XG4gICAgY29uc3QgdmFsdWUgPSBkaXJlY3RpdmU/LnZhbHVlXG4gICAgY29uc3QgbnVtZXJpY1ZhbHVlID0gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIgJiYgdmFsdWUua2luZCA9PSBcIm51bWJlclwiXG4gICAgICA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5OdW1iZXJ9ICovICh2YWx1ZSlcbiAgICAgIDogdW5kZWZpbmVkXG4gICAgY29uc3QgdmFsdWVJc09uZSA9IG51bWVyaWNWYWx1ZT8ubG9jICYmIHNvdXJjZS5zbGljZShudW1lcmljVmFsdWUubG9jLnN0YXJ0Lm9mZnNldCwgbnVtZXJpY1ZhbHVlLmxvYy5lbmQub2Zmc2V0KSA9PSBcIjFcIlxuICAgIGNvbnN0IHZhbGlkID0gZGVjbGFyYXRpb24ubW9kZSA9PSBcIm5vbmVcIiAmJiBkZWNsYXJhdGlvbi5jaGlsZHJlbi5sZW5ndGggPT0gMCAmJiBkZWNsYXJhdGlvbi5kaXJlY3RpdmVzLmxlbmd0aCA9PSAxICYmXG4gICAgICBrZXkua2luZCA9PSBcImlkZW50aWZpZXJcIiAmJiBrZXkubmFtZSA9PSBcInN0cmljdF90eXBlc1wiICYmIHZhbHVlSXNPbmVcblxuICAgIGlmICghdmFsaWQpIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZGVjbGFyZSBvdGhlciB0aGFuIHN0cmljdF90eXBlcz0xXCIsIG5vZGVMb2NhdGlvbihkZWNsYXJhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbn1cblxuLyoqXG4gKiBJbnZva2VzIHBocC1wYXJzZXIgYW5kIG5vcm1hbGl6ZXMgc3ludGF4IGZhaWx1cmVzLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIFNvdXJjZSB0ZXh0LlxuICogQHJldHVybnMge2ltcG9ydChcInBocC1wYXJzZXJcIikuUHJvZ3JhbX0gUEhQIHByb2dyYW0uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlUGhwUHJvZ3JhbShmaWxlbmFtZSwgc291cmNlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZUNvZGUoc291cmNlLCBmaWxlbmFtZSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gcGFyc2VGYWlsdXJlKFwicGhwXCIsIGVycm9yLCBwaHBQYXJzZXJGYWlsdXJlTG9jYXRpb24oZXJyb3IsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBwaHAtcGFyc2VyJ3Mgb25lLWJhc2VkIGxpbmUgYW5kIHplcm8tYmFzZWQgY29sdW1uIHdoZW4gcHJlc2VudC5cbiAqIEEgbW9kdWxlIHJhbmdlIHJlbWFpbnMgdGhlIGRldGVybWluaXN0aWMgZmFsbGJhY2sgZm9yIG9wYXF1ZSBwYXJzZXIgZXJyb3JzLlxuICogQHBhcmFtIHt1bmtub3dufSBlcnJvciAtIE5hdGl2ZSBwYXJzZXIgZXJyb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBSZXF1ZXN0ZWQgc291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gRmFpbHVyZSByYW5nZS5cbiAqL1xuZnVuY3Rpb24gcGhwUGFyc2VyRmFpbHVyZUxvY2F0aW9uKGVycm9yLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9IFwib2JqZWN0XCIpIHJldHVybiBtb2R1bGVMb2NhdGlvbihmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBsaW5lID0gUmVmbGVjdC5nZXQoZXJyb3IsIFwibGluZU51bWJlclwiKVxuICBjb25zdCBjb2x1bW4gPSBSZWZsZWN0LmdldChlcnJvciwgXCJjb2x1bW5OdW1iZXJcIilcblxuICBpZiAodHlwZW9mIGxpbmUgIT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzU2FmZUludGVnZXIobGluZSkgfHwgbGluZSA8IDEgfHxcbiAgICB0eXBlb2YgY29sdW1uICE9IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKGNvbHVtbikgfHwgY29sdW1uIDwgMCkge1xuICAgIHJldHVybiBtb2R1bGVMb2NhdGlvbihmaWxlbmFtZSwgc291cmNlKVxuICB9XG4gIGxldCBsaW5lU3RhcnQgPSAwXG5cbiAgZm9yIChsZXQgY3VycmVudCA9IDE7IGN1cnJlbnQgPCBsaW5lOyBjdXJyZW50KyspIHtcbiAgICBjb25zdCBuZXdsaW5lID0gc291cmNlLmluZGV4T2YoXCJcXG5cIiwgbGluZVN0YXJ0KVxuXG4gICAgaWYgKG5ld2xpbmUgPCAwKSByZXR1cm4gbW9kdWxlTG9jYXRpb24oZmlsZW5hbWUsIHNvdXJjZSlcbiAgICBsaW5lU3RhcnQgPSBuZXdsaW5lICsgMVxuICB9XG4gIGNvbnN0IGxpbmVFbmQgPSBzb3VyY2UuaW5kZXhPZihcIlxcblwiLCBsaW5lU3RhcnQpXG4gIGNvbnN0IGJvdW5kZWRFbmQgPSBsaW5lRW5kIDwgMCA/IHNvdXJjZS5sZW5ndGggOiBsaW5lRW5kXG4gIGNvbnN0IG9mZnNldCA9IE1hdGgubWluKGxpbmVTdGFydCArIGNvbHVtbiwgYm91bmRlZEVuZClcblxuICByZXR1cm4gbG9jYXRpb25Gcm9tT2Zmc2V0cyhmaWxlbmFtZSwgc291cmNlLCBvZmZzZXQsIE1hdGgubWluKG9mZnNldCArIDEsIHNvdXJjZS5sZW5ndGgpKVxufVxuIl19
|
|
2248
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Zyb250ZW5kcy9waHAuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQTtBQUNsQyxPQUFPLEVBQUMsS0FBSyxJQUFJLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFBO0FBQ3BELE9BQU8sRUFBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDN0UsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDcEUsT0FBTyxFQUFDLG1CQUFtQixFQUFFLGNBQWMsRUFBQyxNQUFNLHlCQUF5QixDQUFBO0FBQzNFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDBCQUEwQixDQUFBO0FBQzdELE9BQU8sRUFBQyxlQUFlLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQTtBQUMzRSxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQTtBQUNsRSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUM1RCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsVUFBVSxFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDeEUsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0seUJBQXlCLENBQUE7QUFDL0QsT0FBTyxFQUFDLHVCQUF1QixFQUFFLHVCQUF1QixFQUFFLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFBO0FBQy9GLE9BQU8sRUFBQyw0QkFBNEIsRUFBRSxtQkFBbUIsRUFBRSwyQkFBMkIsRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLGlCQUFpQixFQUFFLGdDQUFnQyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVB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LENBQUMsTUFBTSxDQUFDLENBQUM7UUFBRSxPQUFPLEVBQUMsVUFBVSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBQyxDQUFBO0lBQ3BJLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDNUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUE7SUFDOUIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQTtJQUM5RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLFFBQVEsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxDQUFBO0lBQ3BGLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksVUFBVSxDQUFDLENBQUE7SUFDaEUsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFBO0lBQ3JHLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQzFILGFBQWEsQ0FBQyxJQUFJ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QUFNLENBQUMsQ0FBQTtJQUN6QyxDQUFDO0lBQ0QsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFBO0lBRWpCLEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUNoRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUUvQyxJQUFJLE9BQU8sR0FBRyxDQUFDO1lBQUUsT0FBTyxjQUFjLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3hELFNBQVMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFBO0lBQ3pCLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUMvQyxNQUFNLFVBQVUsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUE7SUFDeEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBRXZELE9BQU8sbUJBQW1CLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO0FBQzNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IFBocFBhcnNlciBmcm9tIFwicGhwLXBhcnNlclwiXG5pbXBvcnQge3BhcnNlIGFzIHBhcnNlQ29tbWVudH0gZnJvbSBcImNvbW1lbnQtcGFyc2VyXCJcbmltcG9ydCB7bWlzc2luZ1R5cGUsIHBhcnNlRmFpbHVyZSwgdW5zdXBwb3J0ZWRTeW50YXh9IGZyb20gXCIuLi9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7YmxvY2tSZWZlcmVuY2VzUHJvdGVjdGVkRW50cnl9IGZyb20gXCIuLi9zZW1hbnRpYy9lZmZlY3RzLmpzXCJcbmltcG9ydCB7bG9jYXRpb25Gcm9tT2Zmc2V0cywgbW9kdWxlTG9jYXRpb259IGZyb20gXCIuLi9zZW1hbnRpYy9sb2NhdGlvbi5qc1wiXG5pbXBvcnQge3dpdGhBZGFwdGVkT3BlcmF0aW9ufSBmcm9tIFwiLi4vc2VtYW50aWMvb3BlcmF0b3JzLmpzXCJcbmltcG9ydCB7c2V0UGFyc2VyUmFuZ2VzLCB3aXRoUGFyc2VyUmFuZ2VzfSBmcm9tIFwiLi4vc2VtYW50aWMvcHJvdmVuYW5jZS5qc1wiXG5pbXBvcnQge2lzVGFzazAzNFJlc291cmNlUHJvYmV9IGZyb20gXCIuLi9zZW1hbnRpYy9jYXBhYmlsaXRpZXMuanNcIlxuaW1wb3J0IHtoYXNFeGFjdEVmZmVjdFN1cHBvcnR9IGZyb20gXCIuLi9iYWNrZW5kcy9lZmZlY3RzLmpzXCJcbmltcG9ydCB7aGFzT25seVVuaWNvZGVTY2FsYXJzLCBzY2FsYXJUeXBlfSBmcm9tIFwiLi4vc2VtYW50aWMvc2NhbGFycy5qc1wiXG5pbXBvcnQge3R5cGVDb250YWluc0FueVZhcmlhYmxlfSBmcm9tIFwiLi4vc2VtYW50aWMvZ2VuZXJpY3MuanNcIlxuaW1wb3J0IHtyZXF1aXJlU291cmNlUmV0dXJuVHlwZSwgcmVxdWlyZVNvdXJjZVNjYWxhclR5cGUsIHNvdXJjZVNjYWxhclR5cGV9IGZyb20gXCIuL3NjYWxhcnMuanNcIlxuaW1wb3J0IHtjYXBhYmlsaXR5RnVuY3Rpb25TaWduYXR1cmVzLCBkb2N1bWVudGVkVmFsdWVUeXBlLCBpbnN0YW50aWF0ZWRSZWNvcmRGaWVsZFR5cGUsIGludGVyZmFjZVR5cGUsIGl0ZXJhdGlvbkJpbmRpbmdUeXBlLCBpdGVyYXRpb25PcGVyYW5kVHlwZSwga25vd25DYWxsUGFyYW1ldGVyVHlwZXMsIGtub3duQ2FsbFJldHVyblR5cGUsIG9wdGlvbmFsVHlwZSwgb3JkZXJlZE1hcFR5cGVGcm9tTWFwLCBvd25lZFJlc291cmNlVHlwZSwgcHJlc2VydmVzR2VuZXJpY09wdGlvbmFsRXZpZGVuY2UsIHJlY29yZFR5cGUsIHJlZmVyZW5jZVR5cGUsIHNhbWVWYWx1ZVR5cGV9IGZyb20gXCIuL3R5cGVzLmpzXCJcbmNvbnN0IHBhcnNlciA9IG5ldyBQaHBQYXJzZXIuRW5naW5lKHtcbiAgYXN0OiB7d2l0aFBvc2l0aW9uczogdHJ1ZX0sXG4gIHBhcnNlcjoge2V4dHJhY3REb2M6IHRydWUsIHN1cHByZXNzRXJyb3JzOiBmYWxzZX1cbn0pXG4vKiogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi9cbmxldCBjYWNoZWRUb2tlblNvdXJjZVxuLyoqIEB0eXBlIHt7ZW5kOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIHRleHQ6IHN0cmluZ31bXX0gKi9cbmxldCBjYWNoZWRUb2tlblJhbmdlcyA9IFtdXG5jb25zdCBwaHBCaW5hcnlPcGVyYXRpb25zID0gbmV3IE1hcChbXG4gIFtcIitcIiwgXCJQaHBBZGRcIl0sXG4gIFtcIi1cIiwgXCJTdWJ0cmFjdFwiXSxcbiAgW1wiKlwiLCBcIk11bHRpcGx5XCJdLFxuICBbXCImJlwiLCBcIkFuZFwiXSxcbiAgW1wifHxcIiwgXCJPclwiXSxcbiAgW1wiPT09XCIsIFwiRXF1YWxcIl0sXG4gIFtcIiE9PVwiLCBcIk5vdEVxdWFsXCJdLFxuICBbXCI8XCIsIFwiTGVzc1RoYW5cIl0sXG4gIFtcIjw9XCIsIFwiTGVzc1RoYW5PckVxdWFsXCJdLFxuICBbXCI+XCIsIFwiR3JlYXRlclRoYW5cIl0sXG4gIFtcIj49XCIsIFwiR3JlYXRlclRoYW5PckVxdWFsXCJdLFxuICBbXCIuXCIsIFwiU3RyaW5nQ29uY2F0XCJdXG5dKVxuXG4vKipcbiAqIEB0eXBlZGVmIFBocENvbnZlcnNpb25Db250ZXh0XG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljQmluZGluZ1R5cGU+fSBiaW5kaW5ncyAtIEV4cGxpY2l0bHkgdHlwZWQgdmlzaWJsZSBiaW5kaW5ncy5cbiAqIEBwcm9wZXJ0eSB7U2V0PHN0cmluZz59IFtjYXRjaEJpbmRpbmdOYW1lc10gLSBMZXhpY2FsbHkgdmlzaWJsZSBleGFjdCBjYXRjaCBiaW5kaW5nIG5hbWVzLlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DYXRjaEJpbmRpbmc+fSBbY2F0Y2hCaW5kaW5nTm9kZXNdIC0gRXhhY3QgY2F0Y2ggYmluZGluZyBub2RlcyBieSB2aXNpYmxlIG5hbWUuXG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24+fSBjbGFzc2VzIC0gUmVmZXJlbmNlIGNsYXNzZXMgYnkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb259IFtjdXJyZW50Q2xhc3NdIC0gRW5jbG9zaW5nIHJlZmVyZW5jZSBjbGFzcy5cbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuSW50ZXJmYWNlRGVjbGFyYXRpb24+fSBpbnRlcmZhY2VzIC0gSW50ZXJmYWNlIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj59IGVycm9yTmFtZXMgLSBFcnJvciBkZWNsYXJhdGlvbnMgYnkgc291cmNlIG5hbWUuXG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb24+fSBlcnJvcnMgLSBFcnJvciBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIFBocEZ1bmN0aW9uU2lnbmF0dXJlPn0gZnVuY3Rpb25zIC0gRXhwbGljaXQgbW9kdWxlIGZ1bmN0aW9uIHNpZ25hdHVyZXMuXG4gKiBAcHJvcGVydHkge1NldDxvYmplY3Q+fSBbb3JkZXJlZE1hcERlY2xhcmF0aW9uc10gLSBFeGFjdCBsb2NhbCBkZWNsYXJhdGlvbnMgc2VsZWN0ZWQgYnkgcGFyc2VyLW93bmVkIHBhaXIgaXRlcmF0aW9uLlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuSW50ZXJmYWNlRGVjbGFyYXRpb24+fSByZWNvcmROYW1lcyAtIE5vbWluYWwgZGVjbGFyYXRpb25zIGJ5IHNvdXJjZSBuYW1lLlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj59IHJlY29yZHMgLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZSB8IHVuZGVmaW5lZH0gcmV0dXJuVHlwZSAtIEVuY2xvc2luZyByZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuVHlwZVBhcmFtZXRlcj59IFt0eXBlUGFyYW1ldGVyc10gLSBEZWNsYXJhdGlvbi1zY29wZWQgcGFyYW1ldGVycy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFBocEZ1bmN0aW9uU2lnbmF0dXJlXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGRlY2xhcmF0aW9uIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbmFtZUxvY2F0aW9uIC0gUGFyc2VyLW93bmVkIG5hbWUgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEZ1bmN0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlBhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gU2VtYW50aWMgcGFyYW1ldGVycy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHJldHVyblR5cGUgLSBTZW1hbnRpYyByZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuVHlwZVBhcmFtZXRlcltdfSBbdHlwZVBhcmFtZXRlcnNdIC0gRGVjbGFyYXRpb24tc2NvcGVkIHBhcmFtZXRlcnMuXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgbm9ybWFsaXplZCBQSFAgbm9kZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Ob2RlfSBub2RlIC0gUEhQIHBhcnNlciBub2RlLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gU291cmNlIGxvY2F0aW9uLlxuICovXG5mdW5jdGlvbiBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBpZiAoIW5vZGUubG9jKSB0aHJvdyBuZXcgRXJyb3IoYFBIUCBwYXJzZXIgb21pdHRlZCBzb3VyY2UgbG9jYXRpb24gZm9yICR7bm9kZS5raW5kfS5gKVxuXG4gIHJldHVybiBsb2NhdGlvbkZyb21PZmZzZXRzKGZpbGVuYW1lLCBzb3VyY2UsIG5vZGUubG9jLnN0YXJ0Lm9mZnNldCwgbm9kZS5sb2MuZW5kLm9mZnNldClcbn1cblxuLyoqXG4gKiBMb2NhdGVzIGEgY29tbWVudC1wYXJzZXIgdG9rZW4gaW5zaWRlIGEgUEhQIHBhcnNlci1vd25lZCBkb2MgY29tbWVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Db21tZW50QmxvY2t9IGNvbW1lbnQgLSBQSFAgZG9jIGNvbW1lbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcImNvbW1lbnQtcGFyc2VyXCIpLlNwZWN9IHRhZyAtIFBhcnNlZCBkb2MgdGFnLlxuICogQHBhcmFtIHtcIm5hbWVcIiB8IFwidHlwZVwifSBmaWVsZCAtIFRva2VuIGZpZWxkLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gRXhhY3QgdG9rZW4gbG9jYXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNvbW1lbnRUYWdMb2NhdGlvbihjb21tZW50LCB0YWcsIGZpZWxkLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGxpbmUgPSB0YWcuc291cmNlWzBdXG5cbiAgaWYgKCFjb21tZW50LmxvYyB8fCAhbGluZSkgdGhyb3cgbmV3IEVycm9yKGBDb21tZW50IHBhcnNlciBvbWl0dGVkIHRoZSBAJHt0YWcudGFnfSBzb3VyY2UgdG9rZW4uYClcblxuICBsZXQgbGluZVN0YXJ0ID0gY29tbWVudC5sb2Muc3RhcnQub2Zmc2V0XG5cbiAgZm9yIChsZXQgbGluZU51bWJlciA9IDA7IGxpbmVOdW1iZXIgPCBsaW5lLm51bWJlcjsgbGluZU51bWJlcisrKSB7XG4gICAgd2hpbGUgKGxpbmVTdGFydCA8IHNvdXJjZS5sZW5ndGggJiYgc291cmNlW2xpbmVTdGFydF0gIT0gXCJcXHJcIiAmJiBzb3VyY2VbbGluZVN0YXJ0XSAhPSBcIlxcblwiKSBsaW5lU3RhcnQrK1xuICAgIGlmIChzb3VyY2VbbGluZVN0YXJ0XSA9PSBcIlxcclwiICYmIHNvdXJjZVtsaW5lU3RhcnQgKyAxXSA9PSBcIlxcblwiKSBsaW5lU3RhcnQgKz0gMlxuICAgIGVsc2UgbGluZVN0YXJ0KytcbiAgfVxuXG4gIGNvbnN0IG9yZGVyZWRGaWVsZHMgPSBbXCJzdGFydFwiLCBcImRlbGltaXRlclwiLCBcInBvc3REZWxpbWl0ZXJcIiwgXCJ0YWdcIiwgXCJwb3N0VGFnXCIsIFwibmFtZVwiLCBcInBvc3ROYW1lXCIsIFwidHlwZVwiXVxuICBjb25zdCBmaWVsZEluZGV4ID0gb3JkZXJlZEZpZWxkcy5pbmRleE9mKGZpZWxkKVxuICBjb25zdCBzdGFydCA9IGxpbmVTdGFydCArIG9yZGVyZWRGaWVsZHMuc2xpY2UoMCwgZmllbGRJbmRleCkucmVkdWNlKChsZW5ndGgsIGtleSkgPT5cbiAgICBsZW5ndGggKyBsaW5lLnRva2Vuc1svKiogQHR5cGUge2tleW9mIHR5cGVvZiBsaW5lLnRva2Vuc30gKi8gKGtleSldLmxlbmd0aCwgMClcbiAgY29uc3QgdmFsdWUgPSBsaW5lLnRva2Vuc1tmaWVsZF1cblxuICByZXR1cm4gbG9jYXRpb25Gcm9tT2Zmc2V0cyhmaWxlbmFtZSwgc291cmNlLCBzdGFydCwgc3RhcnQgKyB2YWx1ZS5sZW5ndGgpXG59XG5cbi8qKlxuICogRmluZHMgb25lIHBhcnNlciB0b2tlbiBiZXR3ZWVuIHBhcnNlci1vd25lZCBub2RlIGJvdW5kYXJpZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5UZXh0IC0gRXhhY3QgdG9rZW4gdGV4dC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydE9mZnNldCAtIEluY2x1c2l2ZSBzZWFyY2ggYm91bmRhcnkuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kT2Zmc2V0IC0gRXhjbHVzaXZlIHNlYXJjaCBib3VuZGFyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IFRva2VuIGxvY2F0aW9uLlxuICovXG5mdW5jdGlvbiB0b2tlbkxvY2F0aW9uKHRva2VuVGV4dCwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBpZiAoY2FjaGVkVG9rZW5Tb3VyY2UgIT0gc291cmNlKSB7XG4gICAgbGV0IG9mZnNldCA9IDBcblxuICAgIGNhY2hlZFRva2VuUmFuZ2VzID0gcGFyc2VyLnRva2VuR2V0QWxsKHNvdXJjZSkubWFwKCh0b2tlbikgPT4ge1xuICAgICAgY29uc3QgdGV4dCA9IHR5cGVvZiB0b2tlbiA9PSBcInN0cmluZ1wiID8gdG9rZW4gOiB0b2tlblsxXVxuICAgICAgY29uc3QgcmFuZ2UgPSB7ZW5kOiBvZmZzZXQgKyB0ZXh0Lmxlbmd0aCwgc3RhcnQ6IG9mZnNldCwgdGV4dH1cblxuICAgICAgb2Zmc2V0ID0gcmFuZ2UuZW5kXG5cbiAgICAgIHJldHVybiByYW5nZVxuICAgIH0pXG4gICAgY2FjaGVkVG9rZW5Tb3VyY2UgPSBzb3VyY2VcbiAgfVxuXG4gIGNvbnN0IHRva2VuID0gY2FjaGVkVG9rZW5SYW5nZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUudGV4dCA9PSB0b2tlblRleHQgJiYgY2FuZGlkYXRlLnN0YXJ0ID49IHN0YXJ0T2Zmc2V0ICYmXG4gICAgY2FuZGlkYXRlLmVuZCA8PSBlbmRPZmZzZXQpXG5cbiAgaWYgKHRva2VuKSByZXR1cm4gbG9jYXRpb25Gcm9tT2Zmc2V0cyhmaWxlbmFtZSwgc291cmNlLCB0b2tlbi5zdGFydCwgdG9rZW4uZW5kKVxuXG4gIHRocm93IG5ldyBFcnJvcihgUEhQIHBhcnNlciBvbWl0dGVkIHRva2VuICcke3Rva2VuVGV4dH0nIGJldHdlZW4gJHtzdGFydE9mZnNldH0gYW5kICR7ZW5kT2Zmc2V0fS5gKVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc3VwcG9ydGVkIFBIUCBleHByZXNzaW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkV4cHJlc3Npb259IG5vZGUgLSBQSFAgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge1BocENvbnZlcnNpb25Db250ZXh0fSBjb250ZXh0IC0gVHlwZWQgY29udmVyc2lvbiBjb250ZXh0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gW2V4cGVjdGVkVHlwZV0gLSBDb250ZXh0dWFsIHR5cGUgZm9yIGVtcHR5IFBIUCBhcnJheXMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVzZXJ2ZU9wdGlvbmFsXSAtIFdoZXRoZXIgYW4gb3B0aW9uYWwgaWRlbnRpZmllciByZW1haW5zIHdyYXBwZWQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gU2VtYW50aWMgZXhwcmVzc2lvbi5cbiAqL1xuZnVuY3Rpb24gY29udmVydEV4cHJlc3Npb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCwgZXhwZWN0ZWRUeXBlLCBwcmVzZXJ2ZU9wdGlvbmFsID0gZmFsc2UpIHtcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBpZiAoZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICBpZiAobm9kZS5raW5kID09IFwibnVsbGtleXdvcmRcIikge1xuICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIk9wdGlvbmFsTm9uZVwiKSwgbG9jYXRpb259LCB7YWJzZW5jZTogbG9jYXRpb259KVxuICAgIH1cbiAgICBpZiAoa25vd25FeHByZXNzaW9uVHlwZShub2RlLCBjb250ZXh0KT8ua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgICByZXR1cm4gY29udmVydEV4cHJlc3Npb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCwgdW5kZWZpbmVkLCB0cnVlKVxuICAgIH1cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJPcHRpb25hbFNvbWVcIiksXG4gICAgICBsb2NhdGlvbixcbiAgICAgIHZhbHVlOiBjb252ZXJ0RXhwcmVzc2lvbihub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCBleHBlY3RlZFR5cGUudmFsdWVUeXBlKVxuICAgIH0sIHtzb21lOiBsb2NhdGlvbn0pXG4gIH1cblxuICBpZiAobm9kZS5raW5kID09IFwibnVsbGtleXdvcmRcIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibnVsbCBvdXRzaWRlIGFuIGV4cGxpY2l0IG9wdGlvbmFsIGNvbnRleHRcIiwgbG9jYXRpb24pXG5cbiAgaWYgKG5vZGUua2luZCA9PSBcInZhcmlhYmxlXCIpIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5WYXJpYWJsZX0gKi8gKG5vZGUpXG5cbiAgICBpZiAodHlwZW9mIHZhcmlhYmxlLm5hbWUgIT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZHluYW1pYyB2YXJpYWJsZVwiLCBsb2NhdGlvbilcbiAgICBpZiAodmFyaWFibGUubmFtZSA9PSBcInRoaXNcIikge1xuICAgICAgaWYgKCFjb250ZXh0LmN1cnJlbnRDbGFzcykgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwicmVjZWl2ZXIgb3V0c2lkZSBhIHJlZmVyZW5jZSBjbGFzc1wiLCBsb2NhdGlvbilcbiAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtjbGFzc0lkOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGNvbnRleHQuY3VycmVudENsYXNzLmlkKSxcbiAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUmVjZWl2ZXJFeHByZXNzaW9uXCIpLCBsb2NhdGlvbn0sIHtyZWNlaXZlcjogbG9jYXRpb259KVxuICAgIH1cblxuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSwgbG9jYXRpb24sIG5hbWU6IHZhcmlhYmxlLm5hbWV9LCB7bmFtZTogbG9jYXRpb259KVxuXG4gICAgaWYgKCFwcmVzZXJ2ZU9wdGlvbmFsICYmIGNvbnRleHQuYmluZGluZ3MuZ2V0KHZhcmlhYmxlLm5hbWUpPy5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJPcHRpb25hbFVud3JhcFwiKSwgbG9jYXRpb24sIG9wZXJhbmQ6IGlkZW50aWZpZXJ9LCB7dW53cmFwOiBsb2NhdGlvbn0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGlkZW50aWZpZXJcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJudW1iZXJcIikge1xuICAgIGNvbnN0IGxpdGVyYWwgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTnVtYmVyfSAqLyAobm9kZSlcbiAgICBjb25zdCB2YWx1ZSA9IE51bWJlcihsaXRlcmFsLnZhbHVlKVxuXG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm5vbi1zYWZlIGludGVnZXIgbGl0ZXJhbFwiLCBsb2NhdGlvbilcblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJJbnRlZ2VyTGl0ZXJhbFwiKSwgbG9jYXRpb24sIHZhbHVlfSwge2xpdGVyYWw6IGxvY2F0aW9ufSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJib29sZWFuXCIpIHtcbiAgICBjb25zdCBsaXRlcmFsID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJvb2xlYW59ICovIChub2RlKVxuXG4gICAgaWYgKHR5cGVvZiBsaXRlcmFsLnZhbHVlICE9IFwiYm9vbGVhblwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJpbnZhbGlkIGJvb2xlYW4gbGl0ZXJhbCB2YWx1ZVwiLCBsb2NhdGlvbilcblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJCb29sZWFuTGl0ZXJhbFwiKSwgbG9jYXRpb24sIHZhbHVlOiBsaXRlcmFsLnZhbHVlfSwge2xpdGVyYWw6IGxvY2F0aW9ufSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IGxpdGVyYWwgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuU3RyaW5nfSAqLyAobm9kZSlcblxuICAgIGlmICh0eXBlb2YgbGl0ZXJhbC5yYXcgPT0gXCJzdHJpbmdcIiAmJiBsaXRlcmFsLnJhdy5zdGFydHNXaXRoKFwiPDw8XCIpKSB7XG4gICAgICBjb25zdCBkZXRhaWwgPSBsaXRlcmFsLnJhdy5zdGFydHNXaXRoKFwiPDw8J1wiKSA/IFwibm93ZG9jIHN0cmluZ1wiIDogXCJoZXJlZG9jIHN0cmluZ1wiXG5cbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBkZXRhaWwsIGxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGxpdGVyYWwucmF3ID09IFwic3RyaW5nXCIgJiYgW1wiYlxcXCJcIiwgXCJCXFxcIlwiLCBcImInXCIsIFwiQidcIl0uc29tZSgocHJlZml4KSA9PiBsaXRlcmFsLnJhdy5zdGFydHNXaXRoKHByZWZpeCkpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJiaW5hcnkgc3RyaW5nIGxpdGVyYWxcIiwgbG9jYXRpb24pXG4gICAgfVxuICAgIGlmICh0eXBlb2YgbGl0ZXJhbC52YWx1ZSAhPSBcInN0cmluZ1wiIHx8ICFoYXNPbmx5VW5pY29kZVNjYWxhcnMobGl0ZXJhbC52YWx1ZSkpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImludmFsaWQgVW5pY29kZSBzdHJpbmcgbGl0ZXJhbFwiLCBsb2NhdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiU3RyaW5nTGl0ZXJhbFwiKSwgbG9jYXRpb24sIHZhbHVlOiBsaXRlcmFsLnZhbHVlfSwge2xpdGVyYWw6IGxvY2F0aW9ufSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJlbmNhcHNlZFwiKSB7XG4gICAgY29uc3QgbGl0ZXJhbCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5FbmNhcHNlZH0gKi8gKG5vZGUpXG5cbiAgICBpZiAobGl0ZXJhbC50eXBlICE9IFwic3RyaW5nXCIpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBgJHtsaXRlcmFsLnR5cGV9IHN0cmluZ2AsIGxvY2F0aW9uKVxuICAgIGlmICghQXJyYXkuaXNBcnJheShsaXRlcmFsLnZhbHVlKSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiaW50ZXJwb2xhdGVkIHN0cmluZ1wiLCBsb2NhdGlvbilcblxuICAgIGNvbnN0IHBhcnRzID0gbGl0ZXJhbC52YWx1ZS5tYXAoKHBhcnQpID0+IHtcbiAgICAgIGlmIChwYXJ0LmtpbmQgIT0gXCJlbmNhcHNlZHBhcnRcIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIGBpbnRlcnBvbGF0ZWQgc3RyaW5nIHBhcnQgJHtwYXJ0LmtpbmR9YCwgbm9kZUxvY2F0aW9uKHBhcnQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgICAgY29uc3QgZW5jYXBzZWRQYXJ0ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkVuY2Fwc2VkUGFydH0gKi8gKHBhcnQpXG5cbiAgICAgIGlmICghZW5jYXBzZWRQYXJ0LmV4cHJlc3Npb24pIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImludGVycG9sYXRlZCBzdHJpbmcgcGFydCB3aXRob3V0IGV4cHJlc3Npb25cIiwgbm9kZUxvY2F0aW9uKGVuY2Fwc2VkUGFydCwgZmlsZW5hbWUsIHNvdXJjZSkpXG5cbiAgICAgIHJldHVybiBjb252ZXJ0RXhwcmVzc2lvbihlbmNhcHNlZFBhcnQuZXhwcmVzc2lvbiwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCwgc2NhbGFyVHlwZShcInN0cmluZ1wiKSlcbiAgICB9KVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiU3RyaW5nTGl0ZXJhbFwiKSwgbG9jYXRpb24sIHZhbHVlOiBcIlwifSwge2xpdGVyYWw6IGxvY2F0aW9ufSlcbiAgICB9XG5cbiAgICBsZXQgbG93ZXJlZCA9IHBhcnRzWzBdXG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMuc2xpY2UoMSkpIHtcbiAgICAgIGNvbnN0IHNlbWFudGljID0gd2l0aEFkYXB0ZWRPcGVyYXRpb24oe1xuICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJCaW5hcnlFeHByZXNzaW9uXCIpLFxuICAgICAgICBsZWZ0OiBsb3dlcmVkLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgcmlnaHQ6IHBhcnRcbiAgICAgIH0sIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvb3BlcmF0b3JzLmpzXCIpLkFkYXB0ZWRPcGVyYXRpb259ICovIChcIlN0cmluZ0NvbmNhdFwiKSlcblxuICAgICAgbG93ZXJlZCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHNlbWFudGljKSlcbiAgICB9XG5cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyhsb3dlcmVkLCB7bGl0ZXJhbDogbG9jYXRpb259KVxuICB9XG5cbiAgaWYgKG5vZGUua2luZCA9PSBcIm5vd2RvY1wiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub3dkb2Mgc3RyaW5nXCIsIGxvY2F0aW9uKVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJhcnJheVwiKSB7XG4gICAgY29uc3QgbGl0ZXJhbCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5BcnJheX0gKi8gKG5vZGUpXG4gICAgY29uc3QgaW52YWxpZEVudHJ5ID0gbGl0ZXJhbC5pdGVtcy5maW5kKChlbnRyeSkgPT4ge1xuICAgICAgaWYgKGVudHJ5LmtpbmQgIT0gXCJlbnRyeVwiKSByZXR1cm4gdHJ1ZVxuICAgICAgY29uc3QgY2FuZGlkYXRlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkVudHJ5fSAqLyAoZW50cnkpXG5cbiAgICAgIHJldHVybiBjYW5kaWRhdGUuYnlSZWYgfHwgY2FuZGlkYXRlLnVucGFja1xuICAgIH0pXG5cbiAgICBpZiAoaW52YWxpZEVudHJ5KSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJhcnJheSByZWZlcmVuY2Ugb3IgdW5wYWNraW5nXCIsIG5vZGVMb2NhdGlvbihpbnZhbGlkRW50cnksIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIGNvbnN0IGVudHJpZXMgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRW50cnlbXX0gKi8gKGxpdGVyYWwuaXRlbXMpXG4gICAgY29uc3QgaGFzS2V5cyA9IGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5LmtleSAhPSBudWxsKVxuICAgIGNvbnN0IGhhc0ltcGxpY2l0ID0gZW50cmllcy5zb21lKChlbnRyeSkgPT4gZW50cnkua2V5ID09IG51bGwpXG4gICAgY29uc3QgY29sbGVjdGlvbktpbmQgPSBlbnRyaWVzLmxlbmd0aCA9PSAwID8gZXhwZWN0ZWRUeXBlPy5raW5kIDogaGFzS2V5cyAmJiAhaGFzSW1wbGljaXRcbiAgICAgID8gZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIiA/IFwiT3JkZXJlZE1hcFR5cGVcIiA6IFwiTWFwVHlwZVwiXG4gICAgICA6ICFoYXNLZXlzID8gXCJMaXN0VHlwZVwiIDogXCJtaXhlZFwiXG5cbiAgICBpZiAoY29sbGVjdGlvbktpbmQgPT0gXCJtaXhlZFwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJtaXhlZCBsaXN0L21hcCBhcnJheSBsaXRlcmFsXCIsIGxvY2F0aW9uKVxuICAgIGlmIChjb2xsZWN0aW9uS2luZCA9PSBcIkxpc3RUeXBlXCIpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiTGlzdFR5cGVcIiA/IGV4cGVjdGVkVHlwZS5lbGVtZW50VHlwZSA6IHVuZGVmaW5lZFxuXG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICAgIGVsZW1lbnRzOiBlbnRyaWVzLm1hcCgoZW50cnkpID0+IGNvbnZlcnRFeHByZXNzaW9uKGVudHJ5LnZhbHVlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCBlbGVtZW50VHlwZSkpLFxuICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJMaXN0TGl0ZXJhbFwiKSxcbiAgICAgICAgbG9jYXRpb25cbiAgICAgIH0sIHtsaXRlcmFsOiBsb2NhdGlvbn0pXG4gICAgfVxuICAgIGlmIChjb2xsZWN0aW9uS2luZCA9PSBcIk1hcFR5cGVcIiB8fCBjb2xsZWN0aW9uS2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IGV4cGVjdGVkVHlwZT8ua2luZCA9PSBcIk1hcFR5cGVcIiB8fCBleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiXG4gICAgICAgID8gZXhwZWN0ZWRUeXBlLnZhbHVlVHlwZSA6IHVuZGVmaW5lZFxuICAgICAgY29uc3Qgc2VtYW50aWNFbnRyaWVzID0gZW50cmllcy5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICAgIGlmICghZW50cnkua2V5IHx8IGVudHJ5LmtleS5raW5kICE9IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJtYXAga2V5IG90aGVyIHRoYW4gYSBsaXRlcmFsIHN0cmluZ1wiLCBlbnRyeS5rZXkgPyBub2RlTG9jYXRpb24oZW50cnkua2V5LCBmaWxlbmFtZSwgc291cmNlKSA6IG5vZGVMb2NhdGlvbihlbnRyeSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gY29udmVydEV4cHJlc3Npb24oZW50cnkua2V5LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KVxuXG4gICAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgICAgICBrZXk6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU3RyaW5nTGl0ZXJhbH0gKi8gKGtleSksXG4gICAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiTWFwRW50cnlcIiksXG4gICAgICAgICAgbG9jYXRpb246IG5vZGVMb2NhdGlvbihlbnRyeSwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgICAgICAgdmFsdWU6IGNvbnZlcnRFeHByZXNzaW9uKGVudHJ5LnZhbHVlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCB2YWx1ZVR5cGUpXG4gICAgICAgIH0sIHtvcGVyYXRvcjogdG9rZW5Mb2NhdGlvbihcIj0+XCIsIGVudHJ5LmtleS5sb2M/LmVuZC5vZmZzZXQgPz8gMCwgZW50cnkudmFsdWUubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgICBlbnRyaWVzOiBzZW1hbnRpY0VudHJpZXMsXG4gICAgICAgIGtpbmQ6IGNvbGxlY3Rpb25LaW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIlxuICAgICAgICAgID8gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiT3JkZXJlZE1hcExpdGVyYWxcIilcbiAgICAgICAgICA6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIk1hcExpdGVyYWxcIiksXG4gICAgICAgIGxvY2F0aW9uXG4gICAgICB9LCB7bGl0ZXJhbDogbG9jYXRpb259KVxuICAgIH1cblxuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImVtcHR5IGFycmF5IHdpdGhvdXQgYSBsaXN0IG9yIG1hcCB0eXBlXCIsIGxvY2F0aW9uKVxuICB9XG5cbiAgaWYgKG5vZGUua2luZCA9PSBcIm5ld1wiKSB7XG4gICAgY29uc3QgY29uc3RydWN0aW9uID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5ld30gKi8gKG5vZGUpXG4gICAgY29uc3QgbmFtZSA9IGNvbnN0cnVjdGlvbi53aGF0LmtpbmQgPT0gXCJuYW1lXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTmFtZX0gKi8gKGNvbnN0cnVjdGlvbi53aGF0KSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKCFuYW1lIHx8IG5hbWUucmVzb2x1dGlvbiAhPSBcInVxblwiIHx8IHR5cGVvZiBuYW1lLm5hbWUgIT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZHluYW1pYyBvciBxdWFsaWZpZWQgcmVjb3JkIGNvbnN0cnVjdGlvblwiLCBub2RlTG9jYXRpb24oY29uc3RydWN0aW9uLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IGNvbnRleHQucmVjb3JkTmFtZXMuZ2V0KG5hbWUubmFtZSlcblxuICAgIGlmICghZGVjbGFyYXRpb24pIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImNvbnN0cnVjdGlvbiBvZiBhbiB1bmtub3duIG5vbWluYWwgY2xhc3NcIiwgbm9kZUxvY2F0aW9uKGNvbnN0cnVjdGlvbi53aGF0LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICBpZiAoZGVjbGFyYXRpb24ua2luZCA9PSBcIkludGVyZmFjZURlY2xhcmF0aW9uXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImNvbnN0cnVjdGlvbiBvZiBhbiBpbnRlcmZhY2VcIiwgbm9kZUxvY2F0aW9uKGNvbnN0cnVjdGlvbi53aGF0LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG4gICAgaWYgKGRlY2xhcmF0aW9uLmtpbmQgPT0gXCJDbGFzc0RlY2xhcmF0aW9uXCIpIHtcbiAgICAgIGNvbnN0IHVuc3VwcG9ydGVkQXJndW1lbnQgPSBjb25zdHJ1Y3Rpb24uYXJndW1lbnRzLmZpbmQoKGFyZ3VtZW50KSA9PlxuICAgICAgICBhcmd1bWVudC5raW5kID09IFwibmFtZWRhcmd1bWVudFwiIHx8IGFyZ3VtZW50LmtpbmQgPT0gXCJ2YXJpYWRpY1wiIHx8IFJlZmxlY3QuZ2V0KGFyZ3VtZW50LCBcImJ5cmVmXCIpID09PSB0cnVlKVxuXG4gICAgICBpZiAodW5zdXBwb3J0ZWRBcmd1bWVudCkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibm9uLXBvc2l0aW9uYWwgcmVmZXJlbmNlIGNvbnN0cnVjdG9yIGFyZ3VtZW50XCIsXG4gICAgICAgIG5vZGVMb2NhdGlvbih1bnN1cHBvcnRlZEFyZ3VtZW50LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICAgIGNvbnN0IGNsYXNzTG9jYXRpb24gPSBub2RlTG9jYXRpb24oY29uc3RydWN0aW9uLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHthcmd1bWVudHM6IGNvbnN0cnVjdGlvbi5hcmd1bWVudHMubWFwKChhcmd1bWVudCwgaW5kZXgpID0+XG4gICAgICAgIGNvbnZlcnRFeHByZXNzaW9uKGFyZ3VtZW50LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCBkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzW2luZGV4XT8udHlwZSkpLFxuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUmVmZXJlbmNlQ29uc3RydWN0aW9uXCIpLCBsb2NhdGlvbixcbiAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlVHlwZSgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgY2xhc3NMb2NhdGlvbil9LCB7Y2xhc3M6IGNsYXNzTG9jYXRpb259KVxuICAgIH1cbiAgICBpZiAoZGVjbGFyYXRpb24ua2luZCA9PSBcIkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb25cIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwib3duZWQgcmVzb3VyY2UgY29uc3RydWN0aW9uXCIsIG5vZGVMb2NhdGlvbihjb25zdHJ1Y3Rpb24sIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICBjb25zdCBjb250ZXh0dWFsVHlwZUFyZ3VtZW50cyA9IGV4cGVjdGVkVHlwZT8ua2luZCA9PSBcIlJlY29yZFR5cGVcIiAmJiBleHBlY3RlZFR5cGUuZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbi5pZFxuICAgICAgPyBleHBlY3RlZFR5cGUuYXJndW1lbnRzXG4gICAgICA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IHZpc2libGVUeXBlUGFyYW1ldGVySWRzID0gbmV3IFNldChbLi4uY29udGV4dC50eXBlUGFyYW1ldGVycz8udmFsdWVzKCkgPz8gW11dXG4gICAgICAubWFwKChwYXJhbWV0ZXIpID0+IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGFyYW1ldGVyLmlkKSkpXG4gICAgY29uc3QgdHlwZUFyZ3VtZW50cyA9IGNvbnRleHR1YWxUeXBlQXJndW1lbnRzICYmXG4gICAgICAhY29udGV4dHVhbFR5cGVBcmd1bWVudHMuc29tZSgoYXJndW1lbnQpID0+IHR5cGVDb250YWluc0FueVZhcmlhYmxlKGFyZ3VtZW50LCB2aXNpYmxlVHlwZVBhcmFtZXRlcklkcykpXG4gICAgICA/IGNvbnRleHR1YWxUeXBlQXJndW1lbnRzXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgYXJndW1lbnRzOiBjb25zdHJ1Y3Rpb24uYXJndW1lbnRzLm1hcCgoYXJndW1lbnQsIGluZGV4KSA9PlxuICAgICAgICBjb252ZXJ0RXhwcmVzc2lvbihhcmd1bWVudCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCxcbiAgICAgICAgICBpbnN0YW50aWF0ZWRSZWNvcmRGaWVsZFR5cGUoZGVjbGFyYXRpb24sIHR5cGVBcmd1bWVudHMsIGluZGV4KSkpLFxuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUmVjb3JkQ29uc3RydWN0aW9uXCIpLFxuICAgICAgbG9jYXRpb24sXG4gICAgICByZWNvcmQ6IHJlY29yZFR5cGUoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIG5vZGVMb2NhdGlvbihjb25zdHJ1Y3Rpb24ud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgICAgIHR5cGVBcmd1bWVudHMpXG4gICAgfSwge3JlY29yZDogbm9kZUxvY2F0aW9uKGNvbnN0cnVjdGlvbi53aGF0LCBmaWxlbmFtZSwgc291cmNlKX0pXG4gIH1cblxuICBpZiAobm9kZS5raW5kID09IFwicHJvcGVydHlsb29rdXBcIikge1xuICAgIGNvbnN0IHJlYWQgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuUHJvcGVydHlMb29rdXB9ICovIChub2RlKVxuICAgIGNvbnN0IG9mZnNldCA9IHJlYWQub2Zmc2V0LmtpbmQgPT0gXCJpZGVudGlmaWVyXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuSWRlbnRpZmllcn0gKi8gKHJlYWQub2Zmc2V0KSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKCFvZmZzZXQgfHwgdHlwZW9mIG9mZnNldC5uYW1lICE9IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImR5bmFtaWMgb3IgY29tcHV0ZWQgbWVtYmVyIGFjY2Vzc1wiLCBub2RlTG9jYXRpb24ocmVhZC5vZmZzZXQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICBpZiAocmVhZC53aGF0LmtpbmQgPT0gXCJ2YXJpYWJsZVwiICYmIC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5WYXJpYWJsZX0gKi8gKHJlYWQud2hhdCkubmFtZSA9PSBcInRoaXNcIiAmJlxuICAgICAgY29udGV4dC5jdXJyZW50Q2xhc3MpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gY29udGV4dC5jdXJyZW50Q2xhc3MuZmllbGRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT0gb2Zmc2V0Lm5hbWUpXG5cbiAgICAgIGlmICghZmllbGQpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBgdW5rbm93biBwcml2YXRlIGZpZWxkICcke29mZnNldC5uYW1lfSdgLCBub2RlTG9jYXRpb24ob2Zmc2V0LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtmaWVsZDogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChmaWVsZC5pZCksIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlByaXZhdGVGaWVsZFJlYWRcIiksIGxvY2F0aW9uLFxuICAgICAgICByZWNlaXZlcjogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNlaXZlckV4cHJlc3Npb259ICovIChcbiAgICAgICAgICBjb252ZXJ0RXhwcmVzc2lvbihyZWFkLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpKX0sIHttZW1iZXI6IG5vZGVMb2NhdGlvbihvZmZzZXQsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgICB9XG4gICAgY29uc3QgcmVjZWl2ZXJUeXBlID0ga25vd25FeHByZXNzaW9uVHlwZShyZWFkLndoYXQsIGNvbnRleHQpXG4gICAgaWYgKHJlY2VpdmVyVHlwZT8ua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwicHJpdmF0ZSByZWZlcmVuY2UtY2xhc3MgZmllbGQgYWNjZXNzXCIsIGxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAocmVjZWl2ZXJUeXBlPy5raW5kID09IFwiSW50ZXJmYWNlVHlwZVwiKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJpbnRlcmZhY2UgcmVjZWl2ZXIgbWVtYmVyIGFjY2Vzc1wiLCBsb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgcmVjZWl2ZXJSZWNvcmQgPSByZWNlaXZlclR5cGU/LmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIiA/IHJlY2VpdmVyVHlwZS52YWx1ZVR5cGUgOiByZWNlaXZlclR5cGVcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHJlY2VpdmVyUmVjb3JkPy5raW5kID09IFwiUmVjb3JkVHlwZVwiID8gY29udGV4dC5yZWNvcmRzLmdldChyZWNlaXZlclJlY29yZC5kZWNsYXJhdGlvbklkKSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKChkZWNsYXJhdGlvbj8udHlwZVBhcmFtZXRlcnM/Lmxlbmd0aCA/PyAwKSA+IDApIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImdlbmVyaWMgcmVjb3JkIHByb3BlcnR5IGFjY2Vzc1wiLCBub2RlTG9jYXRpb24ocmVhZC5vZmZzZXQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICBmaWVsZDogb2Zmc2V0Lm5hbWUsXG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJNZW1iZXJSZWFkXCIpLFxuICAgICAgbG9jYXRpb24sXG4gICAgICByZWNlaXZlcjogY29udmVydEV4cHJlc3Npb24ocmVhZC53aGF0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KVxuICAgIH0sIHttZW1iZXI6IG5vZGVMb2NhdGlvbihyZWFkLm9mZnNldCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICB9XG5cbiAgaWYgKG5vZGUua2luZCA9PSBcIm9mZnNldGxvb2t1cFwiKSB7XG4gICAgY29uc3QgbG9va3VwID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk9mZnNldExvb2t1cH0gKi8gKG5vZGUpXG5cbiAgICBpZiAoIWxvb2t1cC5vZmZzZXQpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImFwcGVuZCBvciBtaXNzaW5nIGFycmF5IGluZGV4XCIsIGxvY2F0aW9uKVxuICAgIGNvbnN0IHJlY2VpdmVyID0gbG9va3VwLndoYXQua2luZCA9PSBcInZhcmlhYmxlXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVmFyaWFibGV9ICovIChsb29rdXAud2hhdCkgOiB1bmRlZmluZWRcbiAgICBjb25zdCByZWNlaXZlclR5cGUgPSByZWNlaXZlciAmJiB0eXBlb2YgcmVjZWl2ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gY29udGV4dC5iaW5kaW5ncy5nZXQocmVjZWl2ZXIubmFtZSkgOiB1bmRlZmluZWRcbiAgICBjb25zdCBhY2Nlc3NLaW5kID0gcmVjZWl2ZXJUeXBlPy5raW5kID09IFwiTGlzdFR5cGVcIiA/IFwibGlzdFwiIDpcbiAgICAgIHJlY2VpdmVyVHlwZT8ua2luZCA9PSBcIk1hcFR5cGVcIiB8fCByZWNlaXZlclR5cGU/LmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiID8gXCJtYXBcIiA6XG4gICAgICBsb29rdXAub2Zmc2V0LmtpbmQgPT0gXCJudW1iZXJcIiA/IFwibGlzdFwiIDogbG9va3VwLm9mZnNldC5raW5kID09IFwic3RyaW5nXCIgPyBcIm1hcFwiIDogdW5kZWZpbmVkXG5cbiAgICBpZiAoYWNjZXNzS2luZCA9PSBcImxpc3RcIiAmJiBbXCJudW1iZXJcIiwgXCJzdHJpbmdcIiwgXCJ2YXJpYWJsZVwiXS5pbmNsdWRlcyhsb29rdXAub2Zmc2V0LmtpbmQpKSB7XG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICAgIGNvbGxlY3Rpb246IGNvbnZlcnRFeHByZXNzaW9uKGxvb2t1cC53aGF0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSxcbiAgICAgICAgaW5kZXg6IGNvbnZlcnRFeHByZXNzaW9uKGxvb2t1cC5vZmZzZXQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpLFxuICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJMaXN0SW5kZXhFeHByZXNzaW9uXCIpLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgdG90YWxpdHk6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInByb3ZlblwiKVxuICAgICAgfSwge29wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKFwiW1wiLCBsb29rdXAud2hhdC5sb2M/LmVuZC5vZmZzZXQgPz8gMCwgbG9va3VwLm9mZnNldC5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKX0pXG4gICAgfVxuICAgIGlmIChhY2Nlc3NLaW5kID09IFwibWFwXCIgJiYgW1wibnVtYmVyXCIsIFwic3RyaW5nXCIsIFwidmFyaWFibGVcIl0uaW5jbHVkZXMobG9va3VwLm9mZnNldC5raW5kKSkge1xuICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgICBjb2xsZWN0aW9uOiBjb252ZXJ0RXhwcmVzc2lvbihsb29rdXAud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCksXG4gICAgICAgIGtleTogY29udmVydEV4cHJlc3Npb24obG9va3VwLm9mZnNldCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCksXG4gICAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIk1hcExvb2t1cEV4cHJlc3Npb25cIiksXG4gICAgICAgIGxvY2F0aW9uLFxuICAgICAgICB0b3RhbGl0eTogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwicHJvdmVuXCIpXG4gICAgICB9LCB7b3BlcmF0b3I6IHRva2VuTG9jYXRpb24oXCJbXCIsIGxvb2t1cC53aGF0LmxvYz8uZW5kLm9mZnNldCA/PyAwLCBsb29rdXAub2Zmc2V0LmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgICB9XG5cbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25saXRlcmFsIGFycmF5IGFjY2Vzc1wiLCBub2RlTG9jYXRpb24obG9va3VwLm9mZnNldCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cblxuICBpZiAobm9kZS5raW5kID09IFwidW5hcnlcIikge1xuICAgIGNvbnN0IHVuYXJ5ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlVuYXJ5fSAqLyAobm9kZSlcblxuICAgIGlmICghW1wiIVwiLCBcIi1cIl0uaW5jbHVkZXModW5hcnkudHlwZSkpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBgdW5hcnkgJHt1bmFyeS50eXBlfWAsIGxvY2F0aW9uKVxuXG4gICAgY29uc3Qgc2VtYW50aWMgPSB3aXRoQWRhcHRlZE9wZXJhdGlvbih3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGtpbmQ6IFwiVW5hcnlFeHByZXNzaW9uXCIsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIG9wZXJhbmQ6IGNvbnZlcnRFeHByZXNzaW9uKHVuYXJ5LndoYXQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gICAgfSwge1xuICAgICAgb3BlcmF0b3I6IHRva2VuTG9jYXRpb24odW5hcnkudHlwZSwgdW5hcnkubG9jPy5zdGFydC5vZmZzZXQgPz8gMCwgdW5hcnkud2hhdC5sb2M/LnN0YXJ0Lm9mZnNldCA/PyB1bmFyeS5sb2M/LmVuZC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICB9KSwgdW5hcnkudHlwZSA9PSBcIiFcIiA/IFwiTm90XCIgOiBcIk5lZ2F0ZVwiKVxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHNlbWFudGljKSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJyZXRpZlwiKSB7XG4gICAgY29uc3QgdGVybmFyeSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5SZXRJZn0gKi8gKG5vZGUpXG5cbiAgICBpZiAoIXRlcm5hcnkudGVzdCB8fCAhdGVybmFyeS50cnVlRXhwciB8fCAhdGVybmFyeS5mYWxzZUV4cHIpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInNob3J0IHRlcm5hcnlcIiwgbG9jYXRpb24pXG4gICAgaWYgKHRlcm5hcnkudGVzdC5raW5kID09IFwidmFyaWFibGVcIikge1xuICAgICAgY29uc3QgdGVzdGVkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlZhcmlhYmxlfSAqLyAodGVybmFyeS50ZXN0KVxuXG4gICAgICBpZiAodHlwZW9mIHRlc3RlZC5uYW1lID09IFwic3RyaW5nXCIgJiYgY29udGV4dC5iaW5kaW5ncy5nZXQodGVzdGVkLm5hbWUpPy5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwib3B0aW9uYWwgdHJ1dGhpbmVzcyBjb25kaXRpb25cIiwgbm9kZUxvY2F0aW9uKHRlc3RlZCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgYWx0ZXJuYXRlOiBjb252ZXJ0RXhwcmVzc2lvbih0ZXJuYXJ5LmZhbHNlRXhwciwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCksXG4gICAgICBjb25kaXRpb246IGNvbnZlcnRFeHByZXNzaW9uKHRlcm5hcnkudGVzdCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCksXG4gICAgICBjb25zZXF1ZW50OiBjb252ZXJ0RXhwcmVzc2lvbih0ZXJuYXJ5LnRydWVFeHByLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSxcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiKSxcbiAgICAgIGxvY2F0aW9uXG4gICAgfSwge1xuICAgICAgYWx0ZXJuYXRlOiB0b2tlbkxvY2F0aW9uKFwiOlwiLCB0ZXJuYXJ5LnRydWVFeHByLmxvYz8uZW5kLm9mZnNldCA/PyAwLCB0ZXJuYXJ5LmZhbHNlRXhwci5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIGNvbG9uOiB0b2tlbkxvY2F0aW9uKFwiOlwiLCB0ZXJuYXJ5LnRydWVFeHByLmxvYz8uZW5kLm9mZnNldCA/PyAwLCB0ZXJuYXJ5LmZhbHNlRXhwci5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIGNvbmRpdGlvbjogdGVybmFyeS50ZXN0LmxvYyA/IG5vZGVMb2NhdGlvbih0ZXJuYXJ5LnRlc3QsIGZpbGVuYW1lLCBzb3VyY2UpIDogbG9jYXRpb24sXG4gICAgICBjb25zZXF1ZW50OiB0ZXJuYXJ5LnRydWVFeHByLmxvYyA/IG5vZGVMb2NhdGlvbih0ZXJuYXJ5LnRydWVFeHByLCBmaWxlbmFtZSwgc291cmNlKSA6IGxvY2F0aW9uLFxuICAgICAgb3BlcmF0b3I6IHRva2VuTG9jYXRpb24oXCI/XCIsIHRlcm5hcnkudGVzdC5sb2M/LmVuZC5vZmZzZXQgPz8gMCwgdGVybmFyeS50cnVlRXhwci5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKVxuICAgIH0pKSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJudWxsc2FmZXByb3BlcnR5bG9va3VwXCIgfHwgbm9kZS5raW5kID09IFwibnVsbHNhZmVtZXRob2RjYWxsXCIpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJzYWZlIG5hdmlnYXRpb25cIiwgbG9jYXRpb24pXG4gIH1cblxuICBpZiAobm9kZS5raW5kID09IFwiYmluXCIpIHtcbiAgICBjb25zdCBiaW5hcnkgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuQmlufSAqLyAobm9kZSlcbiAgICBpZiAoYmluYXJ5LnR5cGUgPT0gXCIhPT1cIiAmJiBiaW5hcnkubGVmdC5raW5kID09IFwidmFyaWFibGVcIiAmJiBiaW5hcnkucmlnaHQua2luZCA9PSBcIm51bGxrZXl3b3JkXCIpIHtcbiAgICAgIGNvbnN0IG9wZXJhbmQgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLklkZW50aWZpZXJFeHByZXNzaW9ufSAqLyAoXG4gICAgICAgIGNvbnZlcnRFeHByZXNzaW9uKGJpbmFyeS5sZWZ0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCB1bmRlZmluZWQsIHRydWUpXG4gICAgICApXG5cbiAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJPcHRpb25hbElzUHJlc2VudFwiKSwgbG9jYXRpb24sIG9wZXJhbmR9LCB7XG4gICAgICAgIG9wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKGJpbmFyeS50eXBlLCBiaW5hcnkubGVmdC5sb2M/LmVuZC5vZmZzZXQgPz8gMCwgYmluYXJ5LnJpZ2h0LmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoW1wiPT1cIiwgXCIhPVwiXS5pbmNsdWRlcyhiaW5hcnkudHlwZSkpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBgY29lcmNpdmUgZXF1YWxpdHkgJHtiaW5hcnkudHlwZX1gLCBsb2NhdGlvbilcbiAgICBpZiAoW1wiYW5kXCIsIFwib3JcIl0uaW5jbHVkZXMoYmluYXJ5LnR5cGUpKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYHByZWNlZGVuY2Utc2Vuc2l0aXZlIGJvb2xlYW4gJHtiaW5hcnkudHlwZX1gLCBsb2NhdGlvbilcbiAgICBpZiAoIXBocEJpbmFyeU9wZXJhdGlvbnMuaGFzKGJpbmFyeS50eXBlKSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIGBiaW5hcnkgJHtiaW5hcnkudHlwZX1gLCBsb2NhdGlvbilcblxuICAgIGNvbnN0IHNlbWFudGljID0gd2l0aEFkYXB0ZWRPcGVyYXRpb24oe1xuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiQmluYXJ5RXhwcmVzc2lvblwiKSxcbiAgICAgIGxlZnQ6IGNvbnZlcnRFeHByZXNzaW9uKGJpbmFyeS5sZWZ0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSxcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgcmlnaHQ6IGNvbnZlcnRFeHByZXNzaW9uKGJpbmFyeS5yaWdodCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dClcbiAgICB9LCAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL29wZXJhdG9ycy5qc1wiKS5BZGFwdGVkT3BlcmF0aW9ufSAqLyAocGhwQmluYXJ5T3BlcmF0aW9ucy5nZXQoYmluYXJ5LnR5cGUpKSlcblxuICAgIHJldHVybiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovICh3aXRoUGFyc2VyUmFuZ2VzKHNlbWFudGljLCB7XG4gICAgICBvcGVyYXRvcjogdG9rZW5Mb2NhdGlvbihiaW5hcnkudHlwZSwgYmluYXJ5LmxlZnQubG9jPy5lbmQub2Zmc2V0ID8/IDAsIGJpbmFyeS5yaWdodC5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKVxuICAgIH0pKSlcbiAgfVxuXG4gIGlmIChub2RlLmtpbmQgPT0gXCJjYWxsXCIpIHtcbiAgICBjb25zdCBjYWxsID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkNhbGx9ICovIChub2RlKVxuXG4gICAgaWYgKGNhbGwud2hhdC5raW5kID09IFwicHJvcGVydHlsb29rdXBcIikge1xuICAgICAgY29uc3QgbG9va3VwID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlByb3BlcnR5TG9va3VwfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoY2FsbC53aGF0KSlcbiAgICAgIGNvbnN0IG1lbWJlciA9IGxvb2t1cC5vZmZzZXQua2luZCA9PSBcImlkZW50aWZpZXJcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZGVudGlmaWVyfSAqLyAobG9va3VwLm9mZnNldCkgOiB1bmRlZmluZWRcbiAgICAgIGNvbnN0IHJlY2VpdmVyVHlwZSA9IGtub3duRXhwcmVzc2lvblR5cGUobG9va3VwLndoYXQsIGNvbnRleHQpXG5cbiAgICAgIGlmIChtZW1iZXIgJiYgdHlwZW9mIG1lbWJlci5uYW1lID09IFwic3RyaW5nXCIgJiYgKHJlY2VpdmVyVHlwZT8ua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIiB8fCByZWNlaXZlclR5cGU/LmtpbmQgPT0gXCJJbnRlcmZhY2VUeXBlXCIpKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IHJlY2VpdmVyVHlwZS5raW5kID09IFwiUmVmZXJlbmNlVHlwZVwiXG4gICAgICAgICAgPyBjb250ZXh0LmNsYXNzZXMuZ2V0KHJlY2VpdmVyVHlwZS5kZWNsYXJhdGlvbklkKT8ubWV0aG9kcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09IG1lbWJlci5uYW1lKVxuICAgICAgICAgIDogY29udGV4dC5pbnRlcmZhY2VzLmdldChyZWNlaXZlclR5cGUuZGVjbGFyYXRpb25JZCk/Lm1ldGhvZHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUubmFtZSA9PSBtZW1iZXIubmFtZSlcbiAgICAgICAgY29uc3QgdW5zdXBwb3J0ZWRBcmd1bWVudCA9IGNhbGwuYXJndW1lbnRzLmZpbmQoKGFyZ3VtZW50KSA9PlxuICAgICAgICAgIGFyZ3VtZW50LmtpbmQgPT0gXCJuYW1lZGFyZ3VtZW50XCIgfHwgYXJndW1lbnQua2luZCA9PSBcInZhcmlhZGljXCIgfHwgUmVmbGVjdC5nZXQoYXJndW1lbnQsIFwiYnlyZWZcIikgPT09IHRydWUpXG5cbiAgICAgICAgaWYgKHVuc3VwcG9ydGVkQXJndW1lbnQpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm5vbi1wb3NpdGlvbmFsIG1ldGhvZCBhcmd1bWVudFwiLFxuICAgICAgICAgIG5vZGVMb2NhdGlvbih1bnN1cHBvcnRlZEFyZ3VtZW50LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2FyZ3VtZW50czogY2FsbC5hcmd1bWVudHMubWFwKChhcmd1bWVudCwgaW5kZXgpID0+XG4gICAgICAgICAgY29udmVydEV4cHJlc3Npb24oYXJndW1lbnQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQsIG1ldGhvZD8ucGFyYW1ldGVyc1tpbmRleF0/LnR5cGUpKSxcbiAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIiksIGxvY2F0aW9uLCBtZXRob2Q6IG1ldGhvZD8uaWQgPz8gbWVtYmVyLm5hbWUsXG4gICAgICAgIHJlY2VpdmVyOiBjb252ZXJ0RXhwcmVzc2lvbihsb29rdXAud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCl9LCB7bWVtYmVyOiBub2RlTG9jYXRpb24obWVtYmVyLCBmaWxlbmFtZSwgc291cmNlKX0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNhbGwud2hhdC5raW5kID09IFwicHJvcGVydHlsb29rdXBcIiAmJiBjYWxsLmFyZ3VtZW50cy5sZW5ndGggPT0gMCkge1xuICAgICAgY29uc3QgbG9va3VwID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlByb3BlcnR5TG9va3VwfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoY2FsbC53aGF0KSlcbiAgICAgIGNvbnN0IHJlY2VpdmVyID0gbG9va3VwLndoYXQua2luZCA9PSBcInZhcmlhYmxlXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVmFyaWFibGV9ICovIChsb29rdXAud2hhdCkgOiB1bmRlZmluZWRcbiAgICAgIGNvbnN0IG1lbWJlciA9IGxvb2t1cC5vZmZzZXQua2luZCA9PSBcImlkZW50aWZpZXJcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZGVudGlmaWVyfSAqLyAobG9va3VwLm9mZnNldCkgOiB1bmRlZmluZWRcblxuICAgICAgaWYgKHJlY2VpdmVyICYmIHR5cGVvZiByZWNlaXZlci5uYW1lID09IFwic3RyaW5nXCIgJiYgbWVtYmVyPy5uYW1lID09IFwiZ2V0TWVzc2FnZVwiICYmIGNvbnRleHQuYmluZGluZ3MuZ2V0KHJlY2VpdmVyLm5hbWUpPy5raW5kID09IFwiRXJyb3JUeXBlXCIpIHtcbiAgICAgICAgY29uc3QgcmVjZWl2ZXJMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihyZWNlaXZlciwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICAgICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiRXJyb3JNZXNzYWdlUmVhZFwiKSxcbiAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICByZWNlaXZlcjogd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiksIGxvY2F0aW9uOiByZWNlaXZlckxvY2F0aW9uLCBuYW1lOiByZWNlaXZlci5uYW1lfSwge1xuICAgICAgICAgICAgbmFtZTogcmVjZWl2ZXJMb2NhdGlvblxuICAgICAgICAgIH0pXG4gICAgICAgIH0sIHttZW1iZXI6IG5vZGVMb2NhdGlvbihtZW1iZXIsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgICAgIH1cbiAgICAgIGlmIChtZW1iZXIgJiYgdHlwZW9mIG1lbWJlci5uYW1lID09IFwic3RyaW5nXCIgJiYga25vd25HZW5lcmljUmVjb3JkQWNjZXNzb3JUeXBlKGxvb2t1cCwgY29udGV4dCkpIHtcbiAgICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgICAgIGZpZWxkOiBtZW1iZXIubmFtZSxcbiAgICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJNZW1iZXJSZWFkXCIpLFxuICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgIHJlY2VpdmVyOiBjb252ZXJ0RXhwcmVzc2lvbihsb29rdXAud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dClcbiAgICAgICAgfSwge21lbWJlcjogbm9kZUxvY2F0aW9uKG1lbWJlciwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjYWxsLndoYXQua2luZCA9PSBcIm5hbWVcIiAmJiBjYWxsLndoYXQubmFtZSA9PSBcImNvdW50XCIgJiYgY2FsbC5hcmd1bWVudHMubGVuZ3RoID09IDEpIHtcbiAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgICAgY29sbGVjdGlvbjogY29udmVydEV4cHJlc3Npb24oY2FsbC5hcmd1bWVudHNbMF0sIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpLFxuICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJDb2xsZWN0aW9uU2l6ZUV4cHJlc3Npb25cIiksXG4gICAgICAgIGxvY2F0aW9uXG4gICAgICB9LCB7b3BlcmF0b3I6IG5vZGVMb2NhdGlvbihjYWxsLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgICB9XG5cbiAgICBpZiAoY2FsbC53aGF0LmtpbmQgIT0gXCJuYW1lXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImR5bmFtaWMgY2FsbFwiLCBsb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgY2FsbGVkTmFtZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5OYW1lfSAqLyAoY2FsbC53aGF0KVxuXG4gICAgaWYgKGNhbGxlZE5hbWUucmVzb2x1dGlvbiAhPSBcInVxblwiIHx8IGNhbGxlZE5hbWUubmFtZS5pbmNsdWRlcyhcIlxcXFxcIikpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInF1YWxpZmllZCBjYWxsXCIsIG5vZGVMb2NhdGlvbihjYWxsLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICBjb25zdCB1bnN1cHBvcnRlZEFyZ3VtZW50ID0gY2FsbC5hcmd1bWVudHMuZmluZCgoYXJndW1lbnQpID0+XG4gICAgICBhcmd1bWVudC5raW5kID09IFwibmFtZWRhcmd1bWVudFwiIHx8IGFyZ3VtZW50LmtpbmQgPT0gXCJ2YXJpYWRpY1wiIHx8IFJlZmxlY3QuZ2V0KGFyZ3VtZW50LCBcImJ5cmVmXCIpID09PSB0cnVlKVxuXG4gICAgaWYgKHVuc3VwcG9ydGVkQXJndW1lbnQpIHtcbiAgICAgIGNvbnN0IGRldGFpbCA9IHVuc3VwcG9ydGVkQXJndW1lbnQua2luZCA9PSBcIm5hbWVkYXJndW1lbnRcIiA/IFwibmFtZWQgYXJndW1lbnRcIiA6XG4gICAgICAgIHVuc3VwcG9ydGVkQXJndW1lbnQua2luZCA9PSBcInZhcmlhZGljXCIgPyBcInVucGFja2VkIGFyZ3VtZW50XCIgOiBcImJ5LXJlZmVyZW5jZSBhcmd1bWVudFwiXG5cbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBkZXRhaWwsIG5vZGVMb2NhdGlvbih1bnN1cHBvcnRlZEFyZ3VtZW50LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG5cbiAgICBjb25zdCBjYWxsZWUgPSBjYWxsZWROYW1lLm5hbWVcblxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGNvbnRleHQuZnVuY3Rpb25zLmdldChjYWxsZWUpXG4gICAgY29uc3Qga25vd25Bcmd1bWVudHMgPSBjYWxsLmFyZ3VtZW50cy5tYXAoKGFyZ3VtZW50KSA9PiBrbm93bkNhbGxBcmd1bWVudFR5cGUoYXJndW1lbnQsIGNvbnRleHQpKVxuICAgIGNvbnN0IHBhcmFtZXRlclR5cGVzID0gc2lnbmF0dXJlID8ga25vd25DYWxsUGFyYW1ldGVyVHlwZXMoc2lnbmF0dXJlLCBrbm93bkFyZ3VtZW50cykgOiB1bmRlZmluZWRcblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGFyZ3VtZW50czogY2FsbC5hcmd1bWVudHMubWFwKChhcmd1bWVudCwgaW5kZXgpID0+XG4gICAgICAgIGNvbnZlcnRFeHByZXNzaW9uKGFyZ3VtZW50LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LFxuICAgICAgICAgIHBhcmFtZXRlclR5cGVzPy5baW5kZXhdID8/IHNpZ25hdHVyZT8ucGFyYW1ldGVyc1tpbmRleF0/LnR5cGUsXG4gICAgICAgICAgcHJlc2VydmVzR2VuZXJpY09wdGlvbmFsRXZpZGVuY2Uoc2lnbmF0dXJlLCBpbmRleCkpKSxcbiAgICAgIGNhbGxlZSxcbiAgICAgIGtpbmQ6IFwiQ2FsbEV4cHJlc3Npb25cIixcbiAgICAgIGxvY2F0aW9uXG4gICAgfSwge2NhbGxlZTogbm9kZUxvY2F0aW9uKGNhbGwud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICB9XG5cbiAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIG5vZGUua2luZCwgbG9jYXRpb24pXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgb25seSByZXN1bHQgdHlwZXMgZXN0YWJsaXNoZWQgYnkgZXhwbGljaXQgc2lnbmF0dXJlcyBhbmQgYmluZGluZ3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuRXhwcmVzc2lvbn0gbm9kZSAtIFBhcnNlci1vd25lZCBleHByZXNzaW9uLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZSB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yVHlwZSB8IHVuZGVmaW5lZH0gS25vd24gcmVzdWx0IHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGtub3duRXhwcmVzc2lvblR5cGUobm9kZSwgY29udGV4dCkge1xuICBpZiAobm9kZS5raW5kID09IFwidmFyaWFibGVcIikge1xuICAgIGNvbnN0IHZhcmlhYmxlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlZhcmlhYmxlfSAqLyAobm9kZSlcblxuICAgIGlmICh2YXJpYWJsZS5uYW1lID09IFwidGhpc1wiICYmIGNvbnRleHQuY3VycmVudENsYXNzPy5pZCkge1xuICAgICAgcmV0dXJuIHtkZWNsYXJhdGlvbklkOiBjb250ZXh0LmN1cnJlbnRDbGFzcy5pZCwga2luZDogXCJSZWZlcmVuY2VUeXBlXCJ9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFyaWFibGUubmFtZSA9PSBcInN0cmluZ1wiKSByZXR1cm4gY29udGV4dC5iaW5kaW5ncy5nZXQodmFyaWFibGUubmFtZSlcbiAgfVxuICBpZiAobm9kZS5raW5kID09IFwiY2FsbFwiKSB7XG4gICAgY29uc3QgY2FsbCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5DYWxsfSAqLyAobm9kZSlcbiAgICBjb25zdCBuYW1lID0gY2FsbC53aGF0LmtpbmQgPT0gXCJuYW1lXCIgJiYgdHlwZW9mIGNhbGwud2hhdC5uYW1lID09IFwic3RyaW5nXCIgPyBjYWxsLndoYXQubmFtZSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGNvbnRleHQuZnVuY3Rpb25zLmdldChuYW1lKVxuXG4gICAgICBpZiAoc2lnbmF0dXJlKSByZXR1cm4ga25vd25DYWxsUmV0dXJuVHlwZShzaWduYXR1cmUsIGNhbGwuYXJndW1lbnRzLm1hcCgoYXJndW1lbnQpID0+IGtub3duRXhwcmVzc2lvblR5cGUoYXJndW1lbnQsIGNvbnRleHQpKSlcbiAgICB9XG4gICAgaWYgKGNhbGwud2hhdC5raW5kID09IFwicHJvcGVydHlsb29rdXBcIiAmJiBjYWxsLmFyZ3VtZW50cy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIGtub3duR2VuZXJpY1JlY29yZEFjY2Vzc29yVHlwZShcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlByb3BlcnR5TG9va3VwfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoY2FsbC53aGF0KSksIGNvbnRleHQpXG4gICAgfVxuICAgIGlmIChjYWxsLndoYXQua2luZCA9PSBcInByb3BlcnR5bG9va3VwXCIpIHtcbiAgICAgIGNvbnN0IGxvb2t1cCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Qcm9wZXJ0eUxvb2t1cH0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGNhbGwud2hhdCkpXG4gICAgICBjb25zdCByZWNlaXZlciA9IGtub3duRXhwcmVzc2lvblR5cGUobG9va3VwLndoYXQsIGNvbnRleHQpXG4gICAgICBjb25zdCBtZW1iZXIgPSBsb29rdXAub2Zmc2V0LmtpbmQgPT0gXCJpZGVudGlmaWVyXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuSWRlbnRpZmllcn0gKi8gKGxvb2t1cC5vZmZzZXQpIDogdW5kZWZpbmVkXG5cbiAgICAgIGlmIChyZWNlaXZlcj8ua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIiAmJiBtZW1iZXIgJiYgdHlwZW9mIG1lbWJlci5uYW1lID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuY2xhc3Nlcy5nZXQocmVjZWl2ZXIuZGVjbGFyYXRpb25JZCk/Lm1ldGhvZHMuZmluZCgobWV0aG9kKSA9PiBtZXRob2QubmFtZSA9PSBtZW1iZXIubmFtZSk/LnJldHVyblR5cGVcbiAgICAgIH1cbiAgICAgIGlmIChyZWNlaXZlcj8ua2luZCA9PSBcIkludGVyZmFjZVR5cGVcIiAmJiBtZW1iZXIgJiYgdHlwZW9mIG1lbWJlci5uYW1lID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuaW50ZXJmYWNlcy5nZXQocmVjZWl2ZXIuZGVjbGFyYXRpb25JZCk/Lm1ldGhvZHMuZmluZCgobWV0aG9kKSA9PiBtZXRob2QubmFtZSA9PSBtZW1iZXIubmFtZSk/LnJldHVyblR5cGVcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKG5vZGUua2luZCA9PSBcIm9mZnNldGxvb2t1cFwiKSB7XG4gICAgY29uc3QgbG9va3VwID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk9mZnNldExvb2t1cH0gKi8gKG5vZGUpXG4gICAgY29uc3QgY29sbGVjdGlvblR5cGUgPSBrbm93bkV4cHJlc3Npb25UeXBlKGxvb2t1cC53aGF0LCBjb250ZXh0KVxuXG4gICAgaWYgKGNvbGxlY3Rpb25UeXBlPy5raW5kID09IFwiTGlzdFR5cGVcIikgcmV0dXJuIGNvbGxlY3Rpb25UeXBlLmVsZW1lbnRUeXBlXG4gICAgaWYgKGNvbGxlY3Rpb25UeXBlPy5raW5kID09IFwiTWFwVHlwZVwiIHx8IGNvbGxlY3Rpb25UeXBlPy5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIikgcmV0dXJuIGNvbGxlY3Rpb25UeXBlLnZhbHVlVHlwZVxuICB9XG4gIGlmIChub2RlLmtpbmQgPT0gXCJuZXdcIikge1xuICAgIGNvbnN0IGNvbnN0cnVjdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5OZXd9ICovIChub2RlKVxuICAgIGNvbnN0IG5hbWUgPSBjb25zdHJ1Y3Rpb24ud2hhdC5raW5kID09IFwibmFtZVwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5hbWV9ICovIChjb25zdHJ1Y3Rpb24ud2hhdCkgOiB1bmRlZmluZWRcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IG5hbWUgJiYgdHlwZW9mIG5hbWUubmFtZSA9PSBcInN0cmluZ1wiID8gY29udGV4dC5yZWNvcmROYW1lcy5nZXQobmFtZS5uYW1lKSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKGRlY2xhcmF0aW9uPy5pZCkgcmV0dXJuIGRlY2xhcmF0aW9uLmtpbmQgPT0gXCJDbGFzc0RlY2xhcmF0aW9uXCJcbiAgICAgID8ge2RlY2xhcmF0aW9uSWQ6IGRlY2xhcmF0aW9uLmlkLCBraW5kOiBcIlJlZmVyZW5jZVR5cGVcIn1cbiAgICAgIDogZGVjbGFyYXRpb24ua2luZCA9PSBcIkludGVyZmFjZURlY2xhcmF0aW9uXCJcbiAgICAgICAgPyB7ZGVjbGFyYXRpb25JZDogZGVjbGFyYXRpb24uaWQsIGtpbmQ6IFwiSW50ZXJmYWNlVHlwZVwifVxuICAgICAgICA6IHtkZWNsYXJhdGlvbklkOiBkZWNsYXJhdGlvbi5pZCwga2luZDogXCJSZWNvcmRUeXBlXCJ9XG4gIH1cbiAgaWYgKG5vZGUua2luZCA9PSBcInByb3BlcnR5bG9va3VwXCIpIHtcbiAgICBjb25zdCByZWFkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlByb3BlcnR5TG9va3VwfSAqLyAobm9kZSlcbiAgICBjb25zdCByZWNlaXZlciA9IGtub3duRXhwcmVzc2lvblR5cGUocmVhZC53aGF0LCBjb250ZXh0KVxuXG4gICAgaWYgKHJlYWQud2hhdC5raW5kID09IFwidmFyaWFibGVcIiAmJiAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVmFyaWFibGV9ICovIChyZWFkLndoYXQpLm5hbWUgPT0gXCJ0aGlzXCIgJiZcbiAgICAgIGNvbnRleHQuY3VycmVudENsYXNzKSB7XG4gICAgICBjb25zdCBvZmZzZXQgPSByZWFkLm9mZnNldC5raW5kID09IFwiaWRlbnRpZmllclwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklkZW50aWZpZXJ9ICovIChyZWFkLm9mZnNldCkgOiB1bmRlZmluZWRcblxuICAgICAgcmV0dXJuIGNvbnRleHQuY3VycmVudENsYXNzLmZpZWxkcy5maW5kKChmaWVsZCkgPT4gZmllbGQubmFtZSA9PSBvZmZzZXQ/Lm5hbWUpPy50eXBlXG4gICAgfVxuXG4gICAgaWYgKHJlY2VpdmVyPy5raW5kICE9IFwiUmVjb3JkVHlwZVwiKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSBjb250ZXh0LnJlY29yZHMuZ2V0KHJlY2VpdmVyLmRlY2xhcmF0aW9uSWQpXG4gICAgY29uc3Qgb2Zmc2V0ID0gcmVhZC5vZmZzZXQua2luZCA9PSBcImlkZW50aWZpZXJcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZGVudGlmaWVyfSAqLyAocmVhZC5vZmZzZXQpIDogdW5kZWZpbmVkXG5cbiAgICBjb25zdCBtZW1iZXJOYW1lID0gb2Zmc2V0ICYmIHR5cGVvZiBvZmZzZXQubmFtZSA9PSBcInN0cmluZ1wiID8gb2Zmc2V0Lm5hbWUgOiB1bmRlZmluZWRcblxuICAgIGlmIChtZW1iZXJOYW1lICYmIGRlY2xhcmF0aW9uKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGRlY2xhcmF0aW9uLmZpZWxkcy5maW5kSW5kZXgoKGZpZWxkKSA9PiBmaWVsZC5uYW1lID09IG1lbWJlck5hbWUpXG5cbiAgICAgIHJldHVybiBpbnN0YW50aWF0ZWRSZWNvcmRGaWVsZFR5cGUoZGVjbGFyYXRpb24sIHJlY2VpdmVyLmFyZ3VtZW50cywgaW5kZXgpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIFJlc29sdmVzIGV4YWN0IHBhcnNlci1rbm93biBhcmd1bWVudCBldmlkZW5jZSB3aXRob3V0IGNoYW5naW5nIHRoZSBlc3RhYmxpc2hlZFxuICogZXhwcmVzc2lvbi1yZXN1bHQgY2xhc3NpZmllciB1c2VkIGZvciBvcHRpb25hbCBjb252ZXJzaW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkV4cHJlc3Npb259IG5vZGUgLSBQYXJzZXItb3duZWQgY2FsbCBhcmd1bWVudC5cbiAqIEBwYXJhbSB7UGhwQ29udmVyc2lvbkNvbnRleHR9IGNvbnRleHQgLSBUeXBlZCBjb252ZXJzaW9uIGNvbnRleHQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGUgfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvclR5cGUgfCB1bmRlZmluZWR9IEtub3duIGFyZ3VtZW50IHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGtub3duQ2FsbEFyZ3VtZW50VHlwZShub2RlLCBjb250ZXh0KSB7XG4gIGNvbnN0IGtub3duID0ga25vd25FeHByZXNzaW9uVHlwZShub2RlLCBjb250ZXh0KVxuXG4gIGlmIChrbm93bikgcmV0dXJuIGtub3duXG4gIGlmIChub2RlLmtpbmQgPT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNTYWZlSW50ZWdlcihOdW1iZXIoLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk51bWJlcn0gKi8gKG5vZGUpLnZhbHVlKSkpIHtcbiAgICByZXR1cm4gc2NhbGFyVHlwZShcImludGVnZXJcIilcbiAgfVxuICBpZiAobm9kZS5raW5kID09IFwiYm9vbGVhblwiICYmIHR5cGVvZiAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuQm9vbGVhbn0gKi8gKG5vZGUpLnZhbHVlID09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIHNjYWxhclR5cGUoXCJib29sZWFuXCIpXG4gIH1cbiAgaWYgKG5vZGUua2luZCA9PSBcInN0cmluZ1wiICYmIHR5cGVvZiAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuU3RyaW5nfSAqLyAobm9kZSkudmFsdWUgPT0gXCJzdHJpbmdcIiAmJlxuICAgIGhhc09ubHlVbmljb2RlU2NhbGFycygvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuU3RyaW5nfSAqLyAobm9kZSkudmFsdWUpKSB7XG4gICAgcmV0dXJuIHNjYWxhclR5cGUoXCJzdHJpbmdcIilcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBQSFAncyBleGFjdCB6ZXJvLWFyZ3VtZW50IGFjY2Vzc29yIGNhcnJpZXIgYWdhaW5zdCBpdHMgcmVjZWl2ZXInc1xuICogZ2VuZXJpYyByZWNvcmQgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuUHJvcGVydHlMb29rdXB9IGxvb2t1cCAtIFBhcnNlci1vd25lZCBtZXRob2QgbG9va3VwLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZSB8IHVuZGVmaW5lZH0gSW5zdGFudGlhdGVkIGZpZWxkIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGtub3duR2VuZXJpY1JlY29yZEFjY2Vzc29yVHlwZShsb29rdXAsIGNvbnRleHQpIHtcbiAgY29uc3QgcmVjZWl2ZXIgPSBrbm93bkV4cHJlc3Npb25UeXBlKGxvb2t1cC53aGF0LCBjb250ZXh0KVxuICBjb25zdCByZWNlaXZlclJlY29yZCA9IHJlY2VpdmVyPy5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIgPyByZWNlaXZlci52YWx1ZVR5cGUgOiByZWNlaXZlclxuXG4gIGlmIChyZWNlaXZlclJlY29yZD8ua2luZCAhPSBcIlJlY29yZFR5cGVcIikgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBkZWNsYXJhdGlvbiA9IGNvbnRleHQucmVjb3Jkcy5nZXQocmVjZWl2ZXJSZWNvcmQuZGVjbGFyYXRpb25JZClcbiAgY29uc3QgbWVtYmVyID0gbG9va3VwLm9mZnNldC5raW5kID09IFwiaWRlbnRpZmllclwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklkZW50aWZpZXJ9ICovIChsb29rdXAub2Zmc2V0KSA6IHVuZGVmaW5lZFxuICBjb25zdCBpbmRleCA9IG1lbWJlciAmJiB0eXBlb2YgbWVtYmVyLm5hbWUgPT0gXCJzdHJpbmdcIlxuICAgID8gZGVjbGFyYXRpb24/LmZpZWxkcy5maW5kSW5kZXgoKGZpZWxkKSA9PiBmaWVsZC5uYW1lID09IG1lbWJlci5uYW1lKSA/PyAtMVxuICAgIDogLTFcblxuICBpZiAoIWRlY2xhcmF0aW9uIHx8IChkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycz8ubGVuZ3RoID8/IDApID09IDAgfHwgaW5kZXggPCAwKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIGluc3RhbnRpYXRlZFJlY29yZEZpZWxkVHlwZShkZWNsYXJhdGlvbiwgcmVjZWl2ZXJSZWNvcmQuYXJndW1lbnRzLCBpbmRleClcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBvbmUgZXhwbGljaXQgUEhQIHJldHVybi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Ob2RlfSBub2RlIC0gUEhQIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZXR1cm5TdGF0ZW1lbnR9IFNlbWFudGljIHJldHVybi5cbiAqL1xuZnVuY3Rpb24gY29udmVydFJldHVybihub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKG5vZGUua2luZCAhPSBcInJldHVyblwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgbm9kZS5raW5kLCBsb2NhdGlvbilcblxuICBjb25zdCByZXR1cm5Ob2RlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlJldHVybn0gKi8gKG5vZGUpXG4gIGNvbnN0IGV4cGVjdGVkVHlwZSA9IGNvbnRleHQucmV0dXJuVHlwZT8ua2luZCA9PSBcIlR5cGVSZWZlcmVuY2VcIiAmJiBjb250ZXh0LnJldHVyblR5cGUubmFtZSA9PSBcInZvaWRcIlxuICAgID8gdW5kZWZpbmVkXG4gICAgOiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlIHwgdW5kZWZpbmVkfSAqLyAoY29udGV4dC5yZXR1cm5UeXBlKVxuXG4gIHJldHVybiB7XG4gICAgLi4uKHJldHVybk5vZGUuZXhwciA/IHtleHByZXNzaW9uOiBjb252ZXJ0RXhwcmVzc2lvbihyZXR1cm5Ob2RlLmV4cHIsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQsIGV4cGVjdGVkVHlwZSl9IDoge30pLFxuICAgIGtpbmQ6IFwiUmV0dXJuU3RhdGVtZW50XCIsXG4gICAgbG9jYXRpb25cbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIG9uZSBleGFjdCBQSFAgbG9jYWwgYEB2YXJgIGNhcnJpZXIgYW5kIGltbXV0YWJpbGl0eSBtYXJrZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZX0gbm9kZSAtIEFzc2lnbm1lbnQtb3duaW5nIHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jYWwgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JbnRlcmZhY2VEZWNsYXJhdGlvbj59IHJlY29yZE5hbWVzIC0gTm9taW5hbCBkZWNsYXJhdGlvbnMgYnkgc291cmNlIG5hbWUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlR5cGVQYXJhbWV0ZXI+fSBbdHlwZVBhcmFtZXRlcnNdIC0gRGVjbGFyYXRpb24tc2NvcGVkIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyB7e2ltbXV0YWJsZTogYm9vbGVhbiwgdHlwZTogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9IHwgdW5kZWZpbmVkfSBNZXRhZGF0YSB3aGVuIHByZXNlbnQuXG4gKi9cbmZ1bmN0aW9uIGxvY2FsTWV0YWRhdGEobm9kZSwgbmFtZSwgZmlsZW5hbWUsIHNvdXJjZSwgcmVjb3JkTmFtZXMsIHR5cGVQYXJhbWV0ZXJzID0gbmV3IE1hcCgpKSB7XG4gIGNvbnN0IGNvbW1lbnRzID0gbm9kZS5sZWFkaW5nQ29tbWVudHMgPz8gW11cbiAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRzLmF0KC0xKVxuXG4gIGlmICghY29tbWVudCB8fCBjb21tZW50LmtpbmQgIT0gXCJjb21tZW50YmxvY2tcIiB8fCAhY29tbWVudC5sb2MgfHwgIW5vZGUubG9jKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3QgZ2FwID0gc291cmNlLnNsaWNlKGNvbW1lbnQubG9jLmVuZC5vZmZzZXQsIG5vZGUubG9jLnN0YXJ0Lm9mZnNldClcblxuICBpZiAoIS9eXFxzKiQvdS50ZXN0KGdhcCkgfHwgKGdhcC5tYXRjaCgvXFxuL2d1KT8ubGVuZ3RoID8/IDApID4gMSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IGJsb2NrID0gcGFyc2VDb21tZW50KGNvbW1lbnQudmFsdWUpWzBdXG4gIGNvbnN0IHRhZ3MgPSBibG9jaz8udGFncyA/PyBbXVxuICBjb25zdCB2YXJpYWJsZXMgPSB0YWdzLmZpbHRlcigodGFnKSA9PiB0YWcudGFnID09IFwidmFyXCIpXG4gIGNvbnN0IGltbXV0YWJsZSA9IHRhZ3MuZmlsdGVyKCh0YWcpID0+IHRhZy50YWcgPT0gXCJzZW1hbnRpZm9sZC1pbW11dGFibGVcIilcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBpZiAodmFyaWFibGVzLmxlbmd0aCA9PSAwICYmIGltbXV0YWJsZS5sZW5ndGggPT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IGV4YWN0VmFyaWFibGUgPSB2YXJpYWJsZXMubGVuZ3RoID09IDEgJiYgdmFyaWFibGVzWzBdLnR5cGUgPT0gXCJcIiAmJiB2YXJpYWJsZXNbMF0uZGVzY3JpcHRpb24gPT0gYCQke25hbWV9YFxuICBjb25zdCBleGFjdEltbXV0YWJsZSA9IGltbXV0YWJsZS5sZW5ndGggPD0gMSAmJiBpbW11dGFibGUuZXZlcnkoKHRhZykgPT4gdGFnLm5hbWUgPT0gXCJcIiAmJiB0YWcudHlwZSA9PSBcIlwiICYmIHRhZy5kZXNjcmlwdGlvbiA9PSBcIlwiKVxuICBjb25zdCBrbm93blRhZ3MgPSB0YWdzLmV2ZXJ5KCh0YWcpID0+IHRhZy50YWcgPT0gXCJ2YXJcIiB8fCB0YWcudGFnID09IFwic2VtYW50aWZvbGQtaW1tdXRhYmxlXCIpXG5cbiAgaWYgKCFleGFjdFZhcmlhYmxlIHx8ICFleGFjdEltbXV0YWJsZSB8fCAha25vd25UYWdzKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibWFsZm9ybWVkIGxvY2FsIHR5cGUgbWV0YWRhdGFcIiwgbG9jYXRpb24pXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGltbXV0YWJsZTogaW1tdXRhYmxlLmxlbmd0aCA9PSAxLFxuICAgIHR5cGU6IGRvY3VtZW50ZWRWYWx1ZVR5cGUoe1xuICAgICAgbGFuZ3VhZ2U6IFwicGhwXCIsXG4gICAgICBsb2NhdGlvbjogY29tbWVudFRhZ0xvY2F0aW9uKGNvbW1lbnQsIHZhcmlhYmxlc1swXSwgXCJuYW1lXCIsIGZpbGVuYW1lLCBzb3VyY2UpLFxuICAgICAgb3duZXJMb2NhdGlvbjogbG9jYXRpb24sXG4gICAgICByZWNvcmRzOiByZWNvcmROYW1lcyxcbiAgICAgIHNvdXJjZSxcbiAgICAgIHNvdXJjZVR5cGU6IHZhcmlhYmxlc1swXS5uYW1lLFxuICAgICAgc3ViamVjdDogYExvY2FsICcke25hbWV9J2AsXG4gICAgICB0eXBlUGFyYW1ldGVyc1xuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBvbmUgUEhQIGxvY2FsIGRlY2xhcmF0aW9uIG9yIGFzc2lnbm1lbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZX0gbm9kZSAtIFBIUCBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Mb2NhbFN0YXRlbWVudCB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50fSBTZW1hbnRpYyBsb2NhbCBvciBwcml2YXRlLWZpZWxkIHN0YXRlbWVudC5cbiAqL1xuZnVuY3Rpb24gY29udmVydExvY2FsU3RhdGVtZW50KG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpIHtcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBpZiAobm9kZS5raW5kICE9IFwiZXhwcmVzc2lvbnN0YXRlbWVudFwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgbm9kZS5raW5kLCBsb2NhdGlvbilcblxuICBjb25zdCBleHByZXNzaW9uID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkV4cHJlc3Npb25TdGF0ZW1lbnR9ICovIChub2RlKS5leHByZXNzaW9uXG5cbiAgaWYgKGV4cHJlc3Npb24ua2luZCAhPSBcImFzc2lnblwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgZXhwcmVzc2lvbi5raW5kLCBub2RlTG9jYXRpb24oZXhwcmVzc2lvbiwgZmlsZW5hbWUsIHNvdXJjZSkpXG5cbiAgY29uc3QgYXNzaWdubWVudCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Bc3NpZ259ICovIChleHByZXNzaW9uKVxuXG4gIGlmIChhc3NpZ25tZW50Lm9wZXJhdG9yICE9IFwiPVwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYGFzc2lnbm1lbnQgJHthc3NpZ25tZW50Lm9wZXJhdG9yfWAsIGxvY2F0aW9uKVxuICBpZiAoYXNzaWdubWVudC5sZWZ0LmtpbmQgPT0gXCJwcm9wZXJ0eWxvb2t1cFwiICYmIGNvbnRleHQuY3VycmVudENsYXNzKSB7XG4gICAgY29uc3QgbG9va3VwID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlByb3BlcnR5TG9va3VwfSAqLyAoYXNzaWdubWVudC5sZWZ0KVxuICAgIGNvbnN0IHJlY2VpdmVyID0gbG9va3VwLndoYXQua2luZCA9PSBcInZhcmlhYmxlXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVmFyaWFibGV9ICovIChsb29rdXAud2hhdCkgOiB1bmRlZmluZWRcbiAgICBjb25zdCBtZW1iZXIgPSBsb29rdXAub2Zmc2V0LmtpbmQgPT0gXCJpZGVudGlmaWVyXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuSWRlbnRpZmllcn0gKi8gKGxvb2t1cC5vZmZzZXQpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgZmllbGQgPSByZWNlaXZlcj8ubmFtZSA9PSBcInRoaXNcIiAmJiBtZW1iZXIgJiYgdHlwZW9mIG1lbWJlci5uYW1lID09IFwic3RyaW5nXCJcbiAgICAgID8gY29udGV4dC5jdXJyZW50Q2xhc3MuZmllbGRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT0gbWVtYmVyLm5hbWUpXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKCFmaWVsZCkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwicHJpdmF0ZSBmaWVsZCB3cml0ZSBvdXRzaWRlIHRoZSBkZWNsYXJpbmcgcmVjZWl2ZXJcIiwgbm9kZUxvY2F0aW9uKGFzc2lnbm1lbnQubGVmdCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2V4cHJlc3Npb246IGNvbnZlcnRFeHByZXNzaW9uKGFzc2lnbm1lbnQucmlnaHQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQsIGZpZWxkLnR5cGUpLFxuICAgICAgZmllbGQ6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZmllbGQuaWQpLCBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFwiKSwgbG9jYXRpb24sXG4gICAgICByZWNlaXZlcjogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNlaXZlckV4cHJlc3Npb259ICovIChcbiAgICAgICAgY29udmVydEV4cHJlc3Npb24obG9va3VwLndoYXQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpKX0sXG4gICAge21lbWJlcjogbm9kZUxvY2F0aW9uKC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZGVudGlmaWVyfSAqLyAobWVtYmVyKSwgZmlsZW5hbWUsIHNvdXJjZSksIG9wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKFwiPVwiLCBhc3NpZ25tZW50LmxlZnQubG9jPy5lbmQub2Zmc2V0ID8/IDAsXG4gICAgICBhc3NpZ25tZW50LnJpZ2h0LmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgfVxuICBpZiAoYXNzaWdubWVudC5sZWZ0LmtpbmQgIT0gXCJ2YXJpYWJsZVwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYXNzaWdubWVudC5sZWZ0LmtpbmQsIG5vZGVMb2NhdGlvbihhc3NpZ25tZW50LmxlZnQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICBpZiAoYXNzaWdubWVudC5yaWdodC5raW5kID09IFwidGhyb3dcIikge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInRocm93IGV4cHJlc3Npb24gaW4gYSB2YWx1ZSBjb250ZXh0XCIsIG5vZGVMb2NhdGlvbihhc3NpZ25tZW50LnJpZ2h0LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuXG4gIGNvbnN0IHZhcmlhYmxlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlZhcmlhYmxlfSAqLyAoYXNzaWdubWVudC5sZWZ0KVxuICBjb25zdCB0YXJnZXRMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbih2YXJpYWJsZSwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBpZiAodHlwZW9mIHZhcmlhYmxlLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCB2YXJpYWJsZS5jdXJseSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZHluYW1pYyB2YXJpYWJsZVwiLCB0YXJnZXRMb2NhdGlvbilcblxuICBjb25zdCBtZXRhZGF0YSA9IGxvY2FsTWV0YWRhdGEobm9kZSwgdmFyaWFibGUubmFtZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dC5yZWNvcmROYW1lcywgY29udGV4dC50eXBlUGFyYW1ldGVycylcblxuICBpZiAobWV0YWRhdGEpIHtcbiAgICBsZXQgZGVjbGFyZWRUeXBlID0gbWV0YWRhdGEudHlwZVxuICAgIGxldCBvcmRlcmVkID0gZmFsc2VcblxuICAgIGlmIChkZWNsYXJlZFR5cGUua2luZCA9PSBcIk1hcFR5cGVcIiAmJiBjb250ZXh0Lm9yZGVyZWRNYXBEZWNsYXJhdGlvbnM/Lmhhcyhhc3NpZ25tZW50KSAmJiBhc3NpZ25tZW50LnJpZ2h0LmtpbmQgPT0gXCJhcnJheVwiKSB7XG4gICAgICBkZWNsYXJlZFR5cGUgPSBvcmRlcmVkTWFwVHlwZUZyb21NYXAoZGVjbGFyZWRUeXBlLCBsb2NhdGlvbilcbiAgICAgIG9yZGVyZWQgPSB0cnVlXG4gICAgfVxuICAgIGNvbnN0IGluaXRpYWxpemVyID0gY29udmVydEV4cHJlc3Npb24oYXNzaWdubWVudC5yaWdodCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCwgZGVjbGFyZWRUeXBlKVxuXG4gICAgY29udGV4dC5iaW5kaW5ncy5zZXQodmFyaWFibGUubmFtZSwgZGVjbGFyZWRUeXBlKVxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGluaXRpYWxpemVyLFxuICAgICAga2luZDogXCJMb2NhbERlY2xhcmF0aW9uXCIsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIG11dGFibGU6IG9yZGVyZWQgPyBmYWxzZSA6ICFtZXRhZGF0YS5pbW11dGFibGUsXG4gICAgICBuYW1lOiB2YXJpYWJsZS5uYW1lLFxuICAgICAgdHlwZTogZGVjbGFyZWRUeXBlXG4gICAgfSwge1xuICAgICAgbmFtZTogdGFyZ2V0TG9jYXRpb24sXG4gICAgICBvcGVyYXRvcjogdG9rZW5Mb2NhdGlvbihcIj1cIiwgYXNzaWdubWVudC5sZWZ0LmxvYz8uZW5kLm9mZnNldCA/PyAwLCBhc3NpZ25tZW50LnJpZ2h0LmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IGluZmVycmVkVHlwZSA9IGtub3duRXhwcmVzc2lvblR5cGUoYXNzaWdubWVudC5yaWdodCwgY29udGV4dClcblxuICBpZiAoaW5mZXJyZWRUeXBlPy5raW5kID09IFwiUmVjb3JkVHlwZVwiIHx8IGluZmVycmVkVHlwZT8ua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIiB8fFxuICAgIGluZmVycmVkVHlwZT8ua2luZCA9PSBcIkludGVyZmFjZVR5cGVcIiB8fCBpbmZlcnJlZFR5cGU/LmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiKSB7XG4gICAgY29uc3QgaW5pdGlhbGl6ZXIgPSBjb252ZXJ0RXhwcmVzc2lvbihhc3NpZ25tZW50LnJpZ2h0LCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0LCBpbmZlcnJlZFR5cGUpXG5cbiAgICBjb250ZXh0LmJpbmRpbmdzLnNldCh2YXJpYWJsZS5uYW1lLCBpbmZlcnJlZFR5cGUpXG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgaW5pdGlhbGl6ZXIsXG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJMb2NhbERlY2xhcmF0aW9uXCIpLFxuICAgICAgbG9jYXRpb24sXG4gICAgICBtdXRhYmxlOiBmYWxzZSxcbiAgICAgIG5hbWU6IHZhcmlhYmxlLm5hbWUsXG4gICAgICB0eXBlOiBpbmZlcnJlZFR5cGVcbiAgICB9LCB7XG4gICAgICBuYW1lOiB0YXJnZXRMb2NhdGlvbixcbiAgICAgIG9wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKFwiPVwiLCBhc3NpZ25tZW50LmxlZnQubG9jPy5lbmQub2Zmc2V0ID8/IDAsIGFzc2lnbm1lbnQucmlnaHQubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgYmluZGluZ1R5cGUgPSBjb250ZXh0LmJpbmRpbmdzLmdldCh2YXJpYWJsZS5uYW1lKVxuXG4gIGlmICghYmluZGluZ1R5cGUpIHJldHVybiBtaXNzaW5nVHlwZShcInBocFwiLCBgTG9jYWwgJyR7dmFyaWFibGUubmFtZX0nYCwgbG9jYXRpb24pXG5cbiAgY29uc3QgdGFyZ2V0ID0gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiksIGxvY2F0aW9uOiB0YXJnZXRMb2NhdGlvbiwgbmFtZTogdmFyaWFibGUubmFtZX0sIHtcbiAgICBuYW1lOiB0YXJnZXRMb2NhdGlvblxuICB9KVxuICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRFeHByZXNzaW9uKGFzc2lnbm1lbnQucmlnaHQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQsXG4gICAgYmluZGluZ1R5cGUua2luZCA9PSBcIkVycm9yVHlwZVwiID8gdW5kZWZpbmVkIDogYmluZGluZ1R5cGUpXG5cbiAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgIGV4cHJlc3Npb246IHZhbHVlLFxuICAgIGtpbmQ6IFwiQXNzaWdubWVudFN0YXRlbWVudFwiLFxuICAgIGxvY2F0aW9uLFxuICAgIHRhcmdldFxuICB9LCB7XG4gICAgb3BlcmF0b3I6IHRva2VuTG9jYXRpb24oXCI9XCIsIGFzc2lnbm1lbnQubGVmdC5sb2M/LmVuZC5vZmZzZXQgPz8gMCwgYXNzaWdubWVudC5yaWdodC5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKVxuICB9KVxufVxuXG4vKipcbiAqIENvbnZlcnRzIG9uZSBleGhhdXN0aXZlIFBIUCBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZX0gbm9kZSAtIFBIUCBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TdGF0ZW1lbnR9IFNlbWFudGljIHN0YXRlbWVudC5cbiAqL1xuZnVuY3Rpb24gY29udmVydFN0YXRlbWVudChub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIGlmIChub2RlLmtpbmQgPT0gXCJyZXR1cm5cIikgcmV0dXJuIGNvbnZlcnRSZXR1cm4obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dClcbiAgaWYgKG5vZGUua2luZCA9PSBcImlmXCIpIHJldHVybiBjb252ZXJ0SWYoLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklmfSAqLyAobm9kZSksIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gIGlmIChub2RlLmtpbmQgPT0gXCJ0aHJvd1wiKSByZXR1cm4gY29udmVydFBocFJhaXNlKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gIGlmIChub2RlLmtpbmQgPT0gXCJ0cnlcIikgcmV0dXJuIGNvbnZlcnRQaHBUcnkobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dClcbiAgaWYgKG5vZGUua2luZCA9PSBcIndoaWxlXCIpIHJldHVybiBjb252ZXJ0V2hpbGUoLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLldoaWxlfSAqLyAobm9kZSksIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gIGlmIChub2RlLmtpbmQgPT0gXCJmb3JlYWNoXCIpIHJldHVybiBjb252ZXJ0Rm9yRWFjaCgvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRm9yZWFjaH0gKi8gKG5vZGUpLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KVxuICBpZiAobm9kZS5raW5kID09IFwiYnJlYWtcIiB8fCBub2RlLmtpbmQgPT0gXCJjb250aW51ZVwiKSB7XG4gICAgY29uc3QgY29udHJvbCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5CcmVhayB8IGltcG9ydChcInBocC1wYXJzZXJcIikuQ29udGludWV9ICovIChub2RlKVxuXG4gICAgaWYgKGNvbnRyb2wubGV2ZWwpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBgJHtub2RlLmtpbmR9IGxldmVsYCwgbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIGNvbnN0IGxvY2F0aW9uID0gdG9rZW5Mb2NhdGlvbihub2RlLmtpbmQsIG5vZGUubG9jPy5zdGFydC5vZmZzZXQgPz8gMCwgbm9kZS5sb2M/LmVuZC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7XCJCcmVha1N0YXRlbWVudFwiIHwgXCJDb250aW51ZVN0YXRlbWVudFwifSAqLyAobm9kZS5raW5kID09IFwiYnJlYWtcIiA/IFwiQnJlYWtTdGF0ZW1lbnRcIiA6IFwiQ29udGludWVTdGF0ZW1lbnRcIiksXG4gICAgICBsb2NhdGlvblxuICAgIH0sIHtrZXl3b3JkOiBsb2NhdGlvbn0pXG4gIH1cbiAgaWYgKG5vZGUua2luZCA9PSBcImVjaG9cIikgcmV0dXJuIGNvbnZlcnRQcmludCgvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRWNob30gKi8gKG5vZGUpLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KVxuICBpZiAobm9kZS5raW5kID09IFwiZXhwcmVzc2lvbnN0YXRlbWVudFwiKSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5FeHByZXNzaW9uU3RhdGVtZW50fSAqLyAobm9kZSkuZXhwcmVzc2lvblxuXG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcImNhbGxcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhwcmVzc2lvbjogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DYWxsRXhwcmVzc2lvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLk1ldGhvZENhbGxFeHByZXNzaW9ufSAqLyAoXG4gICAgICAgICAgY29udmVydEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dClcbiAgICAgICAgKSxcbiAgICAgICAga2luZDogXCJFeHByZXNzaW9uU3RhdGVtZW50XCIsXG4gICAgICAgIGxvY2F0aW9uOiBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29udmVydExvY2FsU3RhdGVtZW50KG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gIH1cblxuICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgbm9kZS5raW5kLCBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG59XG5cbi8qKlxuICogQ29udmVydHMgZXhhY3QgYHRocm93IG5ldyBEZWNsYXJlZEVycm9yKG1lc3NhZ2UpYC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Ob2RlfSBub2RlIC0gUEhQIHRocm93IG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGxleGljYWwgY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SYWlzZVN0YXRlbWVudCB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJldGhyb3dTdGF0ZW1lbnR9IFNlbWFudGljIHJhaXNlIG9yIHJldGhyb3cuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRQaHBSYWlzZShub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IGNvbnN0cnVjdGlvbiA9IFJlZmxlY3QuZ2V0KG5vZGUsIFwid2hhdFwiKVxuXG4gIGlmIChjb25zdHJ1Y3Rpb24/LmtpbmQgPT0gXCJ2YXJpYWJsZVwiICYmIHR5cGVvZiBjb25zdHJ1Y3Rpb24ubmFtZSA9PSBcInN0cmluZ1wiICYmICFjb25zdHJ1Y3Rpb24uY3VybHkgJiZcbiAgICBjb250ZXh0LmJpbmRpbmdzLmdldChjb25zdHJ1Y3Rpb24ubmFtZSk/LmtpbmQgPT0gXCJFcnJvclR5cGVcIiAmJiBjb250ZXh0LmNhdGNoQmluZGluZ05hbWVzPy5oYXMoY29uc3RydWN0aW9uLm5hbWUpKSB7XG4gICAgY29uc3QgYmluZGluZ05vZGUgPSBjb250ZXh0LmNhdGNoQmluZGluZ05vZGVzPy5nZXQoY29uc3RydWN0aW9uLm5hbWUpXG5cbiAgICBpZiAoIWJpbmRpbmdOb2RlKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJ0aHJvdyBvZiBhIGNhdGNoIGJpbmRpbmcgd2l0aG91dCBhbiBleGFjdCBoYW5kbGVyIGJpbmRpbmdcIiwgbG9jYXRpb24pXG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgYmluZGluZzogY29uc3RydWN0aW9uLm5hbWUsXG4gICAgICBiaW5kaW5nTm9kZSxcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlJldGhyb3dTdGF0ZW1lbnRcIiksXG4gICAgICBsb2NhdGlvblxuICAgIH0sIHtrZXl3b3JkOiB0b2tlbkxvY2F0aW9uKFwidGhyb3dcIiwgbm9kZS5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwLCBjb25zdHJ1Y3Rpb24ubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICB9XG4gIGlmICghY29uc3RydWN0aW9uIHx8IGNvbnN0cnVjdGlvbi5raW5kICE9IFwibmV3XCIgfHwgY29uc3RydWN0aW9uLndoYXQ/LmtpbmQgIT0gXCJuYW1lXCIgfHxcbiAgICBjb25zdHJ1Y3Rpb24ud2hhdC5yZXNvbHV0aW9uICE9IFwidXFuXCIgfHwgIWNvbnRleHQuZXJyb3JOYW1lcy5oYXMoY29uc3RydWN0aW9uLndoYXQubmFtZSkgfHxcbiAgICAhQXJyYXkuaXNBcnJheShjb25zdHJ1Y3Rpb24uYXJndW1lbnRzKSB8fCBjb25zdHJ1Y3Rpb24uYXJndW1lbnRzLmxlbmd0aCAhPSAxIHx8XG4gICAgY29uc3RydWN0aW9uLmFyZ3VtZW50c1swXS5raW5kID09IFwibmFtZWRhcmd1bWVudFwiIHx8IGNvbnN0cnVjdGlvbi5hcmd1bWVudHNbMF0ua2luZCA9PSBcInZhcmlhZGljXCIpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJ0aHJvdyBvdGhlciB0aGFuIGV4YWN0IGRlY2xhcmVkIGVycm9yIGNvbnN0cnVjdGlvblwiLCBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBkZWNsYXJhdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbn0gKi8gKGNvbnRleHQuZXJyb3JOYW1lcy5nZXQoY29uc3RydWN0aW9uLndoYXQubmFtZSkpXG4gIGNvbnN0IHR5cGVMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihjb25zdHJ1Y3Rpb24ud2hhdCwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgZXJyb3I6IHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAgZXJyb3I6IHdpdGhQYXJzZXJSYW5nZXMoe2RlY2xhcmF0aW9uSWQ6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJFcnJvclR5cGVcIil9LCB7dHlwZTogdHlwZUxvY2F0aW9ufSksXG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJFcnJvckNvbnN0cnVjdGlvblwiKSxcbiAgICAgIGxvY2F0aW9uOiBub2RlTG9jYXRpb24oY29uc3RydWN0aW9uLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIG1lc3NhZ2U6IGNvbnZlcnRFeHByZXNzaW9uKGNvbnN0cnVjdGlvbi5hcmd1bWVudHNbMF0sIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpXG4gICAgfSwge3R5cGU6IHR5cGVMb2NhdGlvbn0pLFxuICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlJhaXNlU3RhdGVtZW50XCIpLFxuICAgIGxvY2F0aW9uXG4gIH0sIHtrZXl3b3JkOiB0b2tlbkxvY2F0aW9uKFwidGhyb3dcIiwgbm9kZS5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwLCBjb25zdHJ1Y3Rpb24ubG9jPy5zdGFydC5vZmZzZXQgPz8gc291cmNlLmxlbmd0aCwgZmlsZW5hbWUsIHNvdXJjZSl9KVxufVxuXG4vKipcbiAqIENvbnZlcnRzIG9uZSBleGFjdCB0eXBlZCBjYXRjaCB3aXRoIG5vIGZpbmFsbHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZX0gbm9kZSAtIFBIUCB0cnkgbm9kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge1BocENvbnZlcnNpb25Db250ZXh0fSBjb250ZXh0IC0gVHlwZWQgbGV4aWNhbCBjb250ZXh0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlRyeVN0YXRlbWVudH0gU2VtYW50aWMgZXhhY3QgaGFuZGxlci5cbiAqL1xuZnVuY3Rpb24gY29udmVydFBocFRyeShub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IGNhdGNoZXMgPSBSZWZsZWN0LmdldChub2RlLCBcImNhdGNoZXNcIilcbiAgY29uc3QgYm9keSA9IFJlZmxlY3QuZ2V0KG5vZGUsIFwiYm9keVwiKVxuICBjb25zdCBhbHdheXMgPSBSZWZsZWN0LmdldChub2RlLCBcImFsd2F5c1wiKVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShjYXRjaGVzKSB8fCAoY2F0Y2hlcy5sZW5ndGggPT0gMCAmJiAhYWx3YXlzKSB8fCBib2R5Py5raW5kICE9IFwiYmxvY2tcIikge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInRyeSB3aXRob3V0IHR5cGVkIGNhdGNoZXMgb3IgZmluYWxseVwiLCBsb2NhdGlvbilcbiAgfVxuICAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNhdGNoSGFuZGxlcltdfSAqL1xuICBjb25zdCBoYW5kbGVycyA9IFtdXG4gIGNvbnN0IHNlZW5IYW5kbGVyTmFtZXMgPSBuZXcgU2V0KGNvbnRleHQuY2F0Y2hCaW5kaW5nTmFtZXMgPz8gW10pXG5cbiAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGNhdGNoZXMpIHtcbiAgICBjb25zdCBjYXVnaHQgPSBoYW5kbGVyLndoYXQ/LlswXVxuICAgIGNvbnN0IGJpbmRpbmcgPSBoYW5kbGVyLnZhcmlhYmxlXG5cbiAgICBpZiAoaGFuZGxlci53aGF0Py5sZW5ndGggIT0gMSB8fCBjYXVnaHQ/LmtpbmQgIT0gXCJuYW1lXCIgfHwgY2F1Z2h0LnJlc29sdXRpb24gIT0gXCJ1cW5cIiB8fFxuICAgICAgIWNvbnRleHQuZXJyb3JOYW1lcy5oYXMoY2F1Z2h0Lm5hbWUpIHx8IGJpbmRpbmc/LmtpbmQgIT0gXCJ2YXJpYWJsZVwiIHx8IHR5cGVvZiBiaW5kaW5nLm5hbWUgIT0gXCJzdHJpbmdcIiB8fFxuICAgICAgYmluZGluZy5jdXJseSB8fCBoYW5kbGVyLmJvZHk/LmtpbmQgIT0gXCJibG9ja1wiKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJicm9hZCwgbXVsdGlwbGUsIG9yIG1hbGZvcm1lZCBjYXRjaFwiLCBub2RlTG9jYXRpb24oaGFuZGxlciwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIGlmIChzZWVuSGFuZGxlck5hbWVzLmhhcyhiaW5kaW5nLm5hbWUpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYGNhdGNoIGJpbmRpbmcgJyR7YmluZGluZy5uYW1lfScgc2hhZG93cyBhbiBvdXRlciBoYW5kbGVyIGJpbmRpbmdgLCBub2RlTG9jYXRpb24oYmluZGluZywgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIHNlZW5IYW5kbGVyTmFtZXMuYWRkKGJpbmRpbmcubmFtZSlcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbn0gKi8gKGNvbnRleHQuZXJyb3JOYW1lcy5nZXQoY2F1Z2h0Lm5hbWUpKVxuICAgIGNvbnN0IGNhdWdodExvY2F0aW9uID0gbm9kZUxvY2F0aW9uKGNhdWdodCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICBjb25zdCBjYXRjaFR5cGUgPSB3aXRoUGFyc2VyUmFuZ2VzKHtkZWNsYXJhdGlvbklkOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiRXJyb3JUeXBlXCIpfSwge1xuICAgICAgdHlwZTogY2F1Z2h0TG9jYXRpb25cbiAgICB9KVxuICAgIGNvbnN0IGNhdGNoQ29udGV4dCA9IHsuLi5jb250ZXh0LCBiaW5kaW5nczogbmV3IE1hcChjb250ZXh0LmJpbmRpbmdzKSwgY2F0Y2hCaW5kaW5nTmFtZXM6IG5ldyBTZXQoc2VlbkhhbmRsZXJOYW1lcyksXG4gICAgICBjYXRjaEJpbmRpbmdOb2RlczogbmV3IE1hcChjb250ZXh0LmNhdGNoQmluZGluZ05vZGVzKX1cblxuICAgIGNhdGNoQ29udGV4dC5iaW5kaW5ncy5zZXQoYmluZGluZy5uYW1lLCBjYXRjaFR5cGUpXG4gICAgY29uc3QgY2F0Y2hCaW5kaW5nTm9kZSA9IHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiQ2F0Y2hCaW5kaW5nXCIpLFxuICAgICAgbG9jYXRpb246IG5vZGVMb2NhdGlvbihiaW5kaW5nLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIG11dGFibGU6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChmYWxzZSksXG4gICAgICBuYW1lOiBiaW5kaW5nLm5hbWUsXG4gICAgICB0eXBlOiBjYXRjaFR5cGVcbiAgICB9LCB7bmFtZTogbm9kZUxvY2F0aW9uKGJpbmRpbmcsIGZpbGVuYW1lLCBzb3VyY2UpfSlcblxuICAgIGNhdGNoQ29udGV4dC5jYXRjaEJpbmRpbmdOb2Rlcy5zZXQoYmluZGluZy5uYW1lLCBjYXRjaEJpbmRpbmdOb2RlKVxuICAgIGhhbmRsZXJzLnB1c2god2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICBjYXRjaEJpbmRpbmc6IGNhdGNoQmluZGluZ05vZGUsXG4gICAgICBjYXRjaEJvZHk6IGNvbnZlcnRCbG9jayhoYW5kbGVyLmJvZHksIGZpbGVuYW1lLCBzb3VyY2UsIGNhdGNoQ29udGV4dCksXG4gICAgICBjYXRjaFR5cGUsXG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJDYXRjaEhhbmRsZXJcIiksXG4gICAgICBsb2NhdGlvbjogbm9kZUxvY2F0aW9uKGhhbmRsZXIsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgfSwge2NhdGNoOiBub2RlTG9jYXRpb24oaGFuZGxlciwgZmlsZW5hbWUsIHNvdXJjZSl9KSlcbiAgfVxuICBjb25zdCBib2R5Q29udGV4dCA9IHsuLi5jb250ZXh0LCBiaW5kaW5nczogbmV3IE1hcChjb250ZXh0LmJpbmRpbmdzKX1cbiAgY29uc3Qgc2VtYW50aWMgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlRyeVN0YXRlbWVudH0gKi8gKHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgIGJvZHk6IGNvbnZlcnRCbG9jayhib2R5LCBmaWxlbmFtZSwgc291cmNlLCBib2R5Q29udGV4dCksXG4gICAgaGFuZGxlcnMsXG4gICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiVHJ5U3RhdGVtZW50XCIpLFxuICAgIGxvY2F0aW9uXG4gIH0sIHt0cnk6IHRva2VuTG9jYXRpb24oXCJ0cnlcIiwgbm9kZS5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwLCBib2R5LmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpfSkpXG5cbiAgaWYgKGFsd2F5cykge1xuICAgIGlmIChhbHdheXMua2luZCAhPSBcImJsb2NrXCIpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm1hbGZvcm1lZCBmaW5hbGx5IGJsb2NrXCIsIG5vZGVMb2NhdGlvbihhbHdheXMsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIHNlbWFudGljLmZpbmFsbHlCb2R5ID0gY29udmVydEJsb2NrKGFsd2F5cywgZmlsZW5hbWUsIHNvdXJjZSwgYm9keUNvbnRleHQpXG4gICAgc2V0UGFyc2VyUmFuZ2VzKHNlbWFudGljLCB7ZmluYWxseTogbm9kZUxvY2F0aW9uKGFsd2F5cywgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgICB0cnk6IHRva2VuTG9jYXRpb24oXCJ0cnlcIiwgbm9kZS5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwLCBib2R5LmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgfVxuICByZXR1cm4gc2VtYW50aWNcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBleGFjdCBibG9jay1mb3JtIFBIUCBgZm9yZWFjaCAoJGxpc3QgYXMgJHZhbHVlKWAuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuRm9yZWFjaH0gbm9kZSAtIFBIUCBmb3JlYWNoIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Gb3JFYWNoU3RhdGVtZW50IHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRm9yRWFjaE1hcFN0YXRlbWVudH0gU2VtYW50aWMgbG9vcC5cbiAqL1xuZnVuY3Rpb24gY29udmVydEZvckVhY2gobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gIGlmIChub2RlLnNob3J0Rm9ybSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiYWx0ZXJuYXRpdmUgZm9yZWFjaCBzeW50YXhcIiwgbG9jYXRpb24pXG4gIGlmIChub2RlLnZhbHVlLmtpbmQgIT0gXCJ2YXJpYWJsZVwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJmb3JlYWNoIGRlc3RydWN0dXJpbmdcIiwgbm9kZUxvY2F0aW9uKG5vZGUudmFsdWUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICBjb25zdCB2YXJpYWJsZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5WYXJpYWJsZX0gKi8gKG5vZGUudmFsdWUpXG5cbiAgaWYgKFJlZmxlY3QuZ2V0KHZhcmlhYmxlLCBcImJ5cmVmXCIpID09PSB0cnVlKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJieS1yZWZlcmVuY2UgZm9yZWFjaFwiLCBub2RlTG9jYXRpb24odmFyaWFibGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICBpZiAodHlwZW9mIHZhcmlhYmxlLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCB2YXJpYWJsZS5jdXJseSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZHluYW1pYyBmb3JlYWNoIGJpbmRpbmdcIiwgbm9kZUxvY2F0aW9uKHZhcmlhYmxlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgaWYgKCFub2RlLmJvZHkgfHwgbm9kZS5ib2R5LmtpbmQgIT0gXCJibG9ja1wiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZm9yZWFjaCB3aXRob3V0IGJsb2NrIGJvZHlcIiwgbm9kZS5ib2R5ID8gbm9kZUxvY2F0aW9uKG5vZGUuYm9keSwgZmlsZW5hbWUsIHNvdXJjZSkgOiBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBib2R5ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJsb2NrfSAqLyAobm9kZS5ib2R5KVxuICBjb25zdCBjb2xsZWN0aW9uVHlwZSA9IGl0ZXJhdGlvbk9wZXJhbmRUeXBlKGtub3duRXhwcmVzc2lvblR5cGUobm9kZS5zb3VyY2UsIGNvbnRleHQpKVxuXG4gIGlmIChub2RlLmtleSkge1xuICAgIGlmIChub2RlLmtleS5raW5kICE9IFwidmFyaWFibGVcIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZm9yZWFjaCBrZXkgYmluZGluZyBzaGFwZVwiLCBub2RlTG9jYXRpb24obm9kZS5rZXksIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIGNvbnN0IGtleVZhcmlhYmxlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLlZhcmlhYmxlfSAqLyAobm9kZS5rZXkpXG5cbiAgICBpZiAoUmVmbGVjdC5nZXQoa2V5VmFyaWFibGUsIFwiYnlyZWZcIikgPT09IHRydWUgfHwgdHlwZW9mIGtleVZhcmlhYmxlLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCBrZXlWYXJpYWJsZS5jdXJseSkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiaW52YWxpZCBmb3JlYWNoIGtleSBiaW5kaW5nXCIsIG5vZGVMb2NhdGlvbihrZXlWYXJpYWJsZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIGlmIChjb2xsZWN0aW9uVHlwZT8ua2luZCA9PSBcIk1hcFR5cGVcIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwidW5vcmRlcmVkIG1hcCBpdGVyYXRpb25cIiwgbm9kZUxvY2F0aW9uKG5vZGUuc291cmNlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG4gICAgaWYgKCFjb2xsZWN0aW9uVHlwZSB8fCBjb2xsZWN0aW9uVHlwZS5raW5kICE9IFwiT3JkZXJlZE1hcFR5cGVcIikge1xuICAgICAgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIFwiT3JkZXJlZCBtYXAgaXRlcmF0aW9uIGNvbGxlY3Rpb25cIiwgbm9kZUxvY2F0aW9uKG5vZGUuc291cmNlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG4gICAgY29uc3Qga2V5TG9jYXRpb24gPSBub2RlTG9jYXRpb24oa2V5VmFyaWFibGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgY29uc3QgdmFsdWVMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbih2YXJpYWJsZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgICBjb25zdCBrZXlUeXBlID0gaXRlcmF0aW9uQmluZGluZ1R5cGUoY29sbGVjdGlvblR5cGUua2V5VHlwZSwga2V5TG9jYXRpb24pXG4gICAgY29uc3QgdmFsdWVUeXBlID0gaXRlcmF0aW9uQmluZGluZ1R5cGUoY29sbGVjdGlvblR5cGUudmFsdWVUeXBlLCB2YWx1ZUxvY2F0aW9uKVxuICAgIGNvbnN0IGtleUJpbmRpbmcgPSB3aXRoUGFyc2VyUmFuZ2VzKHtcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlZhbHVlQmluZGluZ1wiKSwgbG9jYXRpb246IGtleUxvY2F0aW9uLCBtdXRhYmxlOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoZmFsc2UpLFxuICAgICAgbmFtZToga2V5VmFyaWFibGUubmFtZSwgdHlwZToga2V5VHlwZVxuICAgIH0sIHtuYW1lOiBrZXlMb2NhdGlvbn0pXG4gICAgY29uc3QgdmFsdWVCaW5kaW5nID0gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJWYWx1ZUJpbmRpbmdcIiksIGxvY2F0aW9uOiB2YWx1ZUxvY2F0aW9uLCBtdXRhYmxlOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoZmFsc2UpLFxuICAgICAgbmFtZTogdmFyaWFibGUubmFtZSwgdHlwZTogdmFsdWVUeXBlXG4gICAgfSwge25hbWU6IHZhbHVlTG9jYXRpb259KVxuICAgIGNvbnN0IGJvZHlDb250ZXh0ID0gey4uLmNvbnRleHQsIGJpbmRpbmdzOiBuZXcgTWFwKGNvbnRleHQuYmluZGluZ3MpfVxuXG4gICAgYm9keUNvbnRleHQuYmluZGluZ3Muc2V0KGtleVZhcmlhYmxlLm5hbWUsIGtleVR5cGUpXG4gICAgYm9keUNvbnRleHQuYmluZGluZ3Muc2V0KHZhcmlhYmxlLm5hbWUsIHZhbHVlVHlwZSlcbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgICBib2R5OiBjb252ZXJ0QmxvY2soYm9keSwgZmlsZW5hbWUsIHNvdXJjZSwgYm9keUNvbnRleHQpLFxuICAgICAga2V5QmluZGluZyxcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIiksXG4gICAgICBsb2NhdGlvbixcbiAgICAgIG1hcDogY29udmVydEV4cHJlc3Npb24obm9kZS5zb3VyY2UsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpLFxuICAgICAgdmFsdWVCaW5kaW5nXG4gICAgfSwge29wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKFwiZm9yZWFjaFwiLCBub2RlLmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIG5vZGUuc291cmNlLmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsXG4gICAgICBmaWxlbmFtZSwgc291cmNlKX0pXG4gIH1cblxuICBpZiAoY29sbGVjdGlvblR5cGU/LmtpbmQgPT0gXCJNYXBUeXBlXCIgfHwgY29sbGVjdGlvblR5cGU/LmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibWFwIGl0ZXJhdGlvbiB3aXRob3V0IGtleS92YWx1ZSBwYWlyIGJpbmRpbmdcIiwgbm9kZUxvY2F0aW9uKG5vZGUuc291cmNlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBpZiAoIWNvbGxlY3Rpb25UeXBlIHx8IGNvbGxlY3Rpb25UeXBlLmtpbmQgIT0gXCJMaXN0VHlwZVwiKSB7XG4gICAgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIFwiSXRlcmF0aW9uIGNvbGxlY3Rpb25cIiwgbm9kZUxvY2F0aW9uKG5vZGUuc291cmNlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBjb25zdCBiaW5kaW5nTG9jYXRpb24gPSBub2RlTG9jYXRpb24odmFyaWFibGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IGluZmVycmVkVHlwZSA9IGNvbGxlY3Rpb25UeXBlLmVsZW1lbnRUeXBlXG4gIGNvbnN0IGJpbmRpbmdUeXBlID0gaXRlcmF0aW9uQmluZGluZ1R5cGUoaW5mZXJyZWRUeXBlLCBiaW5kaW5nTG9jYXRpb24pXG4gIGNvbnN0IHZhbHVlQmluZGluZyA9IHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlZhbHVlQmluZGluZ1wiKSxcbiAgICBsb2NhdGlvbjogYmluZGluZ0xvY2F0aW9uLFxuICAgIG11dGFibGU6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChmYWxzZSksXG4gICAgbmFtZTogdmFyaWFibGUubmFtZSxcbiAgICB0eXBlOiBiaW5kaW5nVHlwZVxuICB9LCB7bmFtZTogYmluZGluZ0xvY2F0aW9ufSlcbiAgY29uc3QgYm9keUNvbnRleHQgPSB7Li4uY29udGV4dCwgYmluZGluZ3M6IG5ldyBNYXAoY29udGV4dC5iaW5kaW5ncyl9XG5cbiAgYm9keUNvbnRleHQuYmluZGluZ3Muc2V0KHZhcmlhYmxlLm5hbWUsIGJpbmRpbmdUeXBlKVxuICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgYm9keTogY29udmVydEJsb2NrKGJvZHksIGZpbGVuYW1lLCBzb3VyY2UsIGJvZHlDb250ZXh0KSxcbiAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJGb3JFYWNoU3RhdGVtZW50XCIpLFxuICAgIGxpc3Q6IGNvbnZlcnRFeHByZXNzaW9uKG5vZGUuc291cmNlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSxcbiAgICBsb2NhdGlvbixcbiAgICB2YWx1ZUJpbmRpbmdcbiAgfSwge29wZXJhdG9yOiB0b2tlbkxvY2F0aW9uKFwiZm9yZWFjaFwiLCBub2RlLmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIG5vZGUuc291cmNlLmxvYz8uc3RhcnQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvcmRlcmVkIFBIUCBibG9jayB3aXRoIGl0cyBvd24gYWRhcHRhdGlvbiBzY29wZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5CbG9ja30gbm9kZSAtIFBIUCBwYXJzZXIgYmxvY2suXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CbG9ja30gU2VtYW50aWMgYmxvY2suXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRCbG9jayhub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIHJldHVybiB7XG4gICAga2luZDogXCJCbG9ja1wiLFxuICAgIGxvY2F0aW9uOiBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSksXG4gICAgc3RhdGVtZW50czogbm9kZS5jaGlsZHJlbi5tYXAoKHN0YXRlbWVudCkgPT4gY29udmVydFN0YXRlbWVudChzdGF0ZW1lbnQsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpKVxuICB9XG59XG5cbi8qKlxuICogUmVxdWlyZXMgYW4gZXhhY3QgUEhQIHNjYWxhciBkZWNsYXJhdGlvbiB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5vZGUgfCBudWxsfSBzb3VyY2VUeXBlIC0gUEhQIHR5cGUgbm9kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdWJqZWN0IC0gVHlwZWQgc3ViamVjdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkludGVyZmFjZURlY2xhcmF0aW9uPn0gW3JlY29yZE5hbWVzXSAtIE5vbWluYWwgZGVjbGFyYXRpb25zIGJ5IHNvdXJjZSBuYW1lLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSBTZW1hbnRpYyB0eXBlLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0VHlwZShzb3VyY2VUeXBlLCBzdWJqZWN0LCBsb2NhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSwgcmVjb3JkTmFtZXMgPSBuZXcgTWFwKCkpIHtcbiAgaWYgKCFzb3VyY2VUeXBlKSByZXR1cm4gcmVxdWlyZVNvdXJjZVNjYWxhclR5cGUoXCJwaHBcIiwgdW5kZWZpbmVkLCBzdWJqZWN0LCBsb2NhdGlvbilcbiAgaWYgKHNvdXJjZVR5cGUua2luZCAhPSBcInR5cGVyZWZlcmVuY2VcIiAmJiBzb3VyY2VUeXBlLmtpbmQgIT0gXCJuYW1lXCIgJiYgc291cmNlVHlwZS5raW5kICE9IFwiaWRlbnRpZmllclwiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwidW5zdXBwb3J0ZWQgc2NhbGFyIHR5cGVcIiwgbm9kZUxvY2F0aW9uKHNvdXJjZVR5cGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG5cbiAgY29uc3QgdHlwZU5hbWUgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVHlwZVJlZmVyZW5jZSB8IGltcG9ydChcInBocC1wYXJzZXJcIikuTmFtZSB8IGltcG9ydChcInBocC1wYXJzZXJcIikuSWRlbnRpZmllcn0gKi8gKHNvdXJjZVR5cGUpLm5hbWVcblxuICBjb25zdCB0eXBlTG9jYXRpb24gPSBub2RlTG9jYXRpb24oc291cmNlVHlwZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgZGVjbGFyYXRpb24gPSByZWNvcmROYW1lcy5nZXQodHlwZU5hbWUpXG5cbiAgaWYgKGRlY2xhcmF0aW9uPy5pZCkgcmV0dXJuIGRlY2xhcmF0aW9uLmtpbmQgPT0gXCJDbGFzc0RlY2xhcmF0aW9uXCJcbiAgICA/IHJlZmVyZW5jZVR5cGUoZGVjbGFyYXRpb24uaWQsIHR5cGVMb2NhdGlvbilcbiAgICA6IGRlY2xhcmF0aW9uLmtpbmQgPT0gXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiXG4gICAgICA/IGludGVyZmFjZVR5cGUoZGVjbGFyYXRpb24uaWQsIHR5cGVMb2NhdGlvbilcbiAgICAgIDogZGVjbGFyYXRpb24ua2luZCA9PSBcIkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb25cIlxuICAgICAgICA/IG93bmVkUmVzb3VyY2VUeXBlKGRlY2xhcmF0aW9uLmlkLCB0eXBlTG9jYXRpb24pXG4gICAgICAgIDogcmVjb3JkVHlwZShkZWNsYXJhdGlvbi5pZCwgdHlwZUxvY2F0aW9uKVxuXG4gIHJldHVybiByZXF1aXJlU291cmNlU2NhbGFyVHlwZShcInBocFwiLCB0eXBlTmFtZSwgc3ViamVjdCwgbG9jYXRpb24sIHR5cGVMb2NhdGlvbilcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgZXhhY3QgUEhQRG9jIGNvbnRhaW5lciBzaWduYXR1cmUgYXR0YWNoZWQgdG8gb25lIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkZ1bmN0aW9ufSBub2RlIC0gRnVuY3Rpb24gZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvd25lcklkXSAtIFN0YWJsZSBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHt7cGFyYW1ldGVyczogTWFwPHN0cmluZywge2xvY2F0aW9uOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiwgc291cmNlVHlwZTogc3RyaW5nfT4sIHJldHVyblR5cGU6IHtsb2NhdGlvbjogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIHNvdXJjZVR5cGU6IHN0cmluZ30gfCB1bmRlZmluZWQsIHR5cGVQYXJhbWV0ZXJzPzogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuVHlwZVBhcmFtZXRlcltdfX0gRG9jdW1lbnRlZCB0eXBlcy5cbiAqL1xuZnVuY3Rpb24gZnVuY3Rpb25Eb2N1bWVudGVkVHlwZXMobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgb3duZXJJZCkge1xuICBjb25zdCBjb21tZW50ID0gbm9kZS5sZWFkaW5nQ29tbWVudHM/LmF0KC0xKVxuXG4gIGlmICghY29tbWVudCB8fCBjb21tZW50LmtpbmQgIT0gXCJjb21tZW50YmxvY2tcIiB8fCAhY29tbWVudC5sb2MgfHwgIW5vZGUubG9jIHx8XG4gICAgIS9eXFxzKiQvdS50ZXN0KHNvdXJjZS5zbGljZShjb21tZW50LmxvYy5lbmQub2Zmc2V0LCBub2RlLmxvYy5zdGFydC5vZmZzZXQpKSkgcmV0dXJuIHtwYXJhbWV0ZXJzOiBuZXcgTWFwKCksIHJldHVyblR5cGU6IHVuZGVmaW5lZH1cbiAgY29uc3QgYmxvY2sgPSBwYXJzZUNvbW1lbnQoY29tbWVudC52YWx1ZSlbMF1cbiAgY29uc3QgdGFncyA9IGJsb2NrPy50YWdzID8/IFtdXG4gIGNvbnN0IHBhcmFtZXRlclRhZ3MgPSB0YWdzLmZpbHRlcigodGFnKSA9PiB0YWcudGFnID09IFwicGFyYW1cIilcbiAgY29uc3QgcmV0dXJuVGFncyA9IHRhZ3MuZmlsdGVyKCh0YWcpID0+IHRhZy50YWcgPT0gXCJyZXR1cm5cIiB8fCB0YWcudGFnID09IFwicmV0dXJuc1wiKVxuICBjb25zdCB0ZW1wbGF0ZVRhZ3MgPSB0YWdzLmZpbHRlcigodGFnKSA9PiB0YWcudGFnID09IFwidGVtcGxhdGVcIilcbiAgY29uc3QgbWFsZm9ybWVkVGVtcGxhdGUgPSB0YWdzLmZpbmQoKHRhZykgPT4gdGFnLnRhZy5zdGFydHNXaXRoKFwidGVtcGxhdGVcIikgJiYgdGFnLnRhZyAhPSBcInRlbXBsYXRlXCIpXG4gIGNvbnN0IG1hbGZvcm1lZCA9IHRhZ3Muc29tZSgodGFnKSA9PiAhW1wicGFyYW1cIiwgXCJyZXR1cm5cIiwgXCJyZXR1cm5zXCIsIFwidGVtcGxhdGVcIl0uaW5jbHVkZXModGFnLnRhZykpIHx8IHJldHVyblRhZ3MubGVuZ3RoID4gMSB8fFxuICAgIHBhcmFtZXRlclRhZ3Muc29tZSgodGFnKSA9PiB0YWcudHlwZSAhPSBcIlwiIHx8ICEvXlxcJFtBLVphLXpfXVtBLVphLXowLTlfXSokL3UudGVzdCh0YWcuZGVzY3JpcHRpb24pKSB8fFxuICAgIHJldHVyblRhZ3Muc29tZSgodGFnKSA9PiB0YWcudHlwZSAhPSBcIlwiIHx8IHRhZy5kZXNjcmlwdGlvbiAhPSBcIlwiKSB8fCBtYWxmb3JtZWRUZW1wbGF0ZSB8fFxuICAgIHRlbXBsYXRlVGFncy5zb21lKCh0YWcpID0+ICEvXltBLVphLXpfXVtBLVphLXowLTlfXSokL3UudGVzdCh0YWcubmFtZSkgfHwgdGFnLnR5cGUgIT0gXCJcIiB8fCB0YWcuZGVzY3JpcHRpb24gIT0gXCJcIikgfHxcbiAgICB0ZW1wbGF0ZVRhZ3MubGVuZ3RoID4gMCAmJiAhb3duZXJJZFxuXG4gIGlmIChtYWxmb3JtZWQpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm1hbGZvcm1lZCBmdW5jdGlvbiB0eXBlIGFubm90YXRpb25cIiwgbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICBjb25zdCBwYXJhbWV0ZXJzID0gbmV3IE1hcChwYXJhbWV0ZXJUYWdzLm1hcCgodGFnKSA9PiBbdGFnLmRlc2NyaXB0aW9uLnNsaWNlKDEpLCB7XG4gICAgbG9jYXRpb246IGNvbW1lbnRUYWdMb2NhdGlvbihjb21tZW50LCB0YWcsIFwibmFtZVwiLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICBzb3VyY2VUeXBlOiB0YWcubmFtZVxuICB9XSkpXG5cbiAgaWYgKHBhcmFtZXRlcnMuc2l6ZSAhPSBwYXJhbWV0ZXJUYWdzLmxlbmd0aCkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImR1cGxpY2F0ZSBwYXJhbWV0ZXIgYW5ub3RhdGlvblwiLCBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbiAgY29uc3QgcmV0dXJuVGFnID0gcmV0dXJuVGFnc1swXVxuICBjb25zdCB0eXBlUGFyYW1ldGVycyA9IHRlbXBsYXRlVGFncy5tYXAoKHRhZywgaW5kZXgpID0+IHtcbiAgICBjb25zdCBsb2NhdGlvbiA9IGNvbW1lbnRUYWdMb2NhdGlvbihjb21tZW50LCB0YWcsIFwibmFtZVwiLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2lkOiBgJHtvd25lcklkfTp0eXBlOiR7aW5kZXh9YCwga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiVHlwZVBhcmFtZXRlclwiKSwgbG9jYXRpb24sIG5hbWU6IHRhZy5uYW1lfSwge25hbWU6IGxvY2F0aW9ufSlcbiAgfSlcblxuICByZXR1cm4ge1xuICAgIHBhcmFtZXRlcnMsXG4gICAgcmV0dXJuVHlwZTogcmV0dXJuVGFnID8ge1xuICAgICAgbG9jYXRpb246IGNvbW1lbnRUYWdMb2NhdGlvbihjb21tZW50LCByZXR1cm5UYWcsIFwibmFtZVwiLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIHNvdXJjZVR5cGU6IHJldHVyblRhZy5uYW1lXG4gICAgfSA6IHVuZGVmaW5lZCxcbiAgICAuLi4odHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCA/IHt0eXBlUGFyYW1ldGVyc30gOiB7fSlcbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIGFuIG9wdGlvbmFsIGV4YWN0IGNsYXNzLWxldmVsIFBIUERvYyB0ZW1wbGF0ZSBsaXN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkNsYXNzfSBub2RlIC0gQ2xhc3MgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gb3duZXJJZCAtIFN0YWJsZSByZWNvcmQgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlR5cGVQYXJhbWV0ZXJbXSB8IHVuZGVmaW5lZH0gT3JkZXJlZCBwYXJhbWV0ZXJzLlxuICovXG5mdW5jdGlvbiBjbGFzc0RvY3VtZW50ZWRUeXBlUGFyYW1ldGVycyhub2RlLCBvd25lcklkLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGRvY3VtZW50ZWQgPSBmdW5jdGlvbkRvY3VtZW50ZWRUeXBlcyhcbiAgICAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRnVuY3Rpb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChub2RlKSksIGZpbGVuYW1lLCBzb3VyY2UsIG93bmVySWQpXG5cbiAgaWYgKGRvY3VtZW50ZWQucGFyYW1ldGVycy5zaXplIHx8IGRvY3VtZW50ZWQucmV0dXJuVHlwZSkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImZ1bmN0aW9uIHR5cGUgYW5ub3RhdGlvbiBvbiByZWNvcmQgZGVjbGFyYXRpb25cIiwgbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG5cbiAgcmV0dXJuIGRvY3VtZW50ZWQudHlwZVBhcmFtZXRlcnNcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbmF0aXZlIFBIUCB0eXBlIG5hbWUgZnJvbSBvbmUgc3VwcG9ydGVkIHBhcnNlciBub2RlLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5vZGUgfCBudWxsfSB0eXBlIC0gTmF0aXZlIHR5cGUgbm9kZS5cbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IFR5cGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gcGhwVHlwZU5hbWUodHlwZSkge1xuICBpZiAoIXR5cGUgfHwgIVtcInR5cGVyZWZlcmVuY2VcIiwgXCJuYW1lXCIsIFwiaWRlbnRpZmllclwiXS5pbmNsdWRlcyh0eXBlLmtpbmQpKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5UeXBlUmVmZXJlbmNlIHwgaW1wb3J0KFwicGhwLXBhcnNlclwiKS5OYW1lIHwgaW1wb3J0KFwicGhwLXBhcnNlclwiKS5JZGVudGlmaWVyfSAqLyAodHlwZSkubmFtZVxufVxuXG4vKipcbiAqIFdyYXBzIG9uZSBwYXJzZXItZGVjbGFyZWQgY2Fub25pY2FsIFBIUCBudWxsYWJsZSB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gdmFsdWVUeXBlIC0gUHJlc2VudC12YWx1ZSBzZW1hbnRpYyB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5vZGV9IHNvdXJjZVR5cGUgLSBOYXRpdmUgcGFyc2VyIHR5cGUgbm9kZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBvd25lclN0YXJ0IC0gRWFybGllc3Qgb3duaW5nIHBhcnNlciBvZmZzZXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLk9wdGlvbmFsVHlwZX0gT3B0aW9uYWwgc2VtYW50aWMgdHlwZS5cbiAqL1xuZnVuY3Rpb24gbnVsbGFibGVUeXBlKHZhbHVlVHlwZSwgc291cmNlVHlwZSwgb3duZXJTdGFydCwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBpZiAoIXNvdXJjZVR5cGUubG9jKSB0aHJvdyBuZXcgRXJyb3IoXCJQSFAgcGFyc2VyIG9taXR0ZWQgbnVsbGFibGUgdHlwZSBsb2NhdGlvbi5cIilcbiAgY29uc3QgdmFsdWVMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihzb3VyY2VUeXBlLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBtYXJrZXIgPSB0b2tlbkxvY2F0aW9uKFwiP1wiLCBvd25lclN0YXJ0LCBzb3VyY2VUeXBlLmxvYy5zdGFydC5vZmZzZXQsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKG1hcmtlci5lbmQub2Zmc2V0ICE9IHZhbHVlTG9jYXRpb24uc3RhcnQub2Zmc2V0KSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibm9uY2Fub25pY2FsIG51bGxhYmxlIHR5cGVcIiwgbWFya2VyKVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbmFsVHlwZShcbiAgICB2YWx1ZVR5cGUsXG4gICAgbG9jYXRpb25Gcm9tT2Zmc2V0cyhmaWxlbmFtZSwgc291cmNlLCBtYXJrZXIuc3RhcnQub2Zmc2V0LCB2YWx1ZUxvY2F0aW9uLmVuZC5vZmZzZXQpLFxuICAgIHZhbHVlTG9jYXRpb25cbiAgKVxufVxuXG4vKipcbiAqIENvbnZlcnRzIG9uZSBleHBsaWNpdCBQSFAgZnVuY3Rpb24gcmV0dXJuIHR5cGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZSB8IG51bGx9IHNvdXJjZVR5cGUgLSBQSFAgcmV0dXJuIHR5cGUgbm9kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdWJqZWN0IC0gVHlwZWQgZnVuY3Rpb24gcmV0dXJuLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBGdW5jdGlvbiBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JbnRlcmZhY2VEZWNsYXJhdGlvbj59IFtyZWNvcmROYW1lc10gLSBOb21pbmFsIGRlY2xhcmF0aW9ucyBieSBzb3VyY2UgbmFtZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gU2VtYW50aWMgcmV0dXJuIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRSZXR1cm5UeXBlKHNvdXJjZVR5cGUsIHN1YmplY3QsIGxvY2F0aW9uLCBmaWxlbmFtZSwgc291cmNlLCByZWNvcmROYW1lcyA9IG5ldyBNYXAoKSkge1xuICBpZiAoIXNvdXJjZVR5cGUpIHJldHVybiByZXF1aXJlU291cmNlUmV0dXJuVHlwZShcInBocFwiLCB1bmRlZmluZWQsIHN1YmplY3QsIGxvY2F0aW9uKVxuICBpZiAoc291cmNlVHlwZS5raW5kICE9IFwidHlwZXJlZmVyZW5jZVwiICYmIHNvdXJjZVR5cGUua2luZCAhPSBcIm5hbWVcIiAmJiBzb3VyY2VUeXBlLmtpbmQgIT0gXCJpZGVudGlmaWVyXCIpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJ1bnN1cHBvcnRlZCByZXR1cm4gdHlwZVwiLCBub2RlTG9jYXRpb24oc291cmNlVHlwZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbiAgY29uc3QgdHlwZU5hbWUgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVHlwZVJlZmVyZW5jZSB8IGltcG9ydChcInBocC1wYXJzZXJcIikuTmFtZSB8IGltcG9ydChcInBocC1wYXJzZXJcIikuSWRlbnRpZmllcn0gKi8gKHNvdXJjZVR5cGUpLm5hbWVcbiAgY29uc3QgZGVjbGFyYXRpb24gPSByZWNvcmROYW1lcy5nZXQodHlwZU5hbWUpXG5cbiAgaWYgKGRlY2xhcmF0aW9uPy5pZCkgcmV0dXJuIGRlY2xhcmF0aW9uLmtpbmQgPT0gXCJDbGFzc0RlY2xhcmF0aW9uXCJcbiAgICA/IHJlZmVyZW5jZVR5cGUoZGVjbGFyYXRpb24uaWQsIG5vZGVMb2NhdGlvbihzb3VyY2VUeXBlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICA6IGRlY2xhcmF0aW9uLmtpbmQgPT0gXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiXG4gICAgICA/IGludGVyZmFjZVR5cGUoZGVjbGFyYXRpb24uaWQsIG5vZGVMb2NhdGlvbihzb3VyY2VUeXBlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICAgIDogZGVjbGFyYXRpb24ua2luZCA9PSBcIkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb25cIlxuICAgICAgICA/IG93bmVkUmVzb3VyY2VUeXBlKGRlY2xhcmF0aW9uLmlkLCBub2RlTG9jYXRpb24oc291cmNlVHlwZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgICAgIDogcmVjb3JkVHlwZShkZWNsYXJhdGlvbi5pZCwgbm9kZUxvY2F0aW9uKHNvdXJjZVR5cGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuXG4gIHJldHVybiByZXF1aXJlU291cmNlUmV0dXJuVHlwZShcInBocFwiLCB0eXBlTmFtZSwgc3ViamVjdCwgbG9jYXRpb24sIG5vZGVMb2NhdGlvbihzb3VyY2VUeXBlLCBmaWxlbmFtZSwgc291cmNlKSlcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgZXhwbGljaXQgdHlwZSBzaWduYXR1cmUgb2Ygb25lIFBIUCBmdW5jdGlvbiBiZWZvcmUgYW55IGJvZHkgZXhwcmVzc2lvbnMuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuRnVuY3Rpb259IG5vZGUgLSBQSFAgZnVuY3Rpb24gbm9kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JbnRlcmZhY2VEZWNsYXJhdGlvbj59IHJlY29yZE5hbWVzIC0gTm9taW5hbCBkZWNsYXJhdGlvbnMgYnkgc291cmNlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3duZXJJZCAtIFN0YWJsZSBmdW5jdGlvbiBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtQaHBGdW5jdGlvblNpZ25hdHVyZX0gVHlwZWQgZnVuY3Rpb24gc2lnbmF0dXJlLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0RnVuY3Rpb25TaWduYXR1cmUobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgcmVjb3JkTmFtZXMsIG93bmVySWQpIHtcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgbmFtZSA9IHR5cGVvZiBub2RlLm5hbWUgPT0gXCJzdHJpbmdcIiA/IG5vZGUubmFtZSA6IG5vZGUubmFtZS5uYW1lXG5cbiAgaWYgKCFub2RlLmJvZHkpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJmdW5jdGlvbiBib2R5XCIsIGxvY2F0aW9uKVxuICB9XG5cbiAgY29uc3QgZG9jdW1lbnRlZCA9IGZ1bmN0aW9uRG9jdW1lbnRlZFR5cGVzKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIG93bmVySWQpXG4gIGNvbnN0IHR5cGVQYXJhbWV0ZXJOYW1lcyA9IG5ldyBNYXAoKGRvY3VtZW50ZWQudHlwZVBhcmFtZXRlcnMgPz8gW10pLm1hcCgocGFyYW1ldGVyKSA9PiBbcGFyYW1ldGVyLm5hbWUsIHBhcmFtZXRlcl0pKVxuICBjb25zdCBwYXJhbWV0ZXJzID0gbm9kZS5hcmd1bWVudHMubWFwKChwYXJhbWV0ZXIpID0+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihwYXJhbWV0ZXIsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgY29uc3QgcGFyYW1ldGVyTmFtZSA9IHR5cGVvZiBwYXJhbWV0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gcGFyYW1ldGVyLm5hbWUgOiBwYXJhbWV0ZXIubmFtZS5uYW1lXG5cbiAgICBpZiAocGFyYW1ldGVyLmJ5cmVmKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJieS1yZWZlcmVuY2UgcGFyYW1ldGVyXCIsIHBhcmFtZXRlckxvY2F0aW9uKVxuICAgIGlmIChwYXJhbWV0ZXIudmFyaWFkaWMpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInZhcmlhZGljIHBhcmFtZXRlclwiLCBwYXJhbWV0ZXJMb2NhdGlvbilcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkZWZhdWx0IHBhcmFtZXRlclwiLCBwYXJhbWV0ZXJMb2NhdGlvbilcbiAgICBjb25zdCBwYXJhbWV0ZXJOb2RlID0gdHlwZW9mIHBhcmFtZXRlci5uYW1lID09IFwic3RyaW5nXCIgPyBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXIubmFtZVxuICAgIGNvbnN0IGRvY3VtZW50ZWRUeXBlID0gZG9jdW1lbnRlZC5wYXJhbWV0ZXJzLmdldChwYXJhbWV0ZXJOYW1lKVxuICAgIGNvbnN0IG5hdGl2ZVR5cGUgPSBwaHBUeXBlTmFtZShwYXJhbWV0ZXIudHlwZSlcblxuICAgIGxldCBwYXJhbWV0ZXJUeXBlID0gZG9jdW1lbnRlZFR5cGVcbiAgICAgID8gZG9jdW1lbnRlZFZhbHVlVHlwZSh7bGFuZ3VhZ2U6IFwicGhwXCIsIGxvY2F0aW9uOiBkb2N1bWVudGVkVHlwZS5sb2NhdGlvbiwgb3duZXJMb2NhdGlvbjogcGFyYW1ldGVyTG9jYXRpb24sIHNvdXJjZSxcbiAgICAgICAgcmVjb3JkczogcmVjb3JkTmFtZXMsIHNvdXJjZVR5cGU6IGRvY3VtZW50ZWRUeXBlLnNvdXJjZVR5cGUsIHN1YmplY3Q6IGBQYXJhbWV0ZXIgJyR7cGFyYW1ldGVyTmFtZX0nYCwgdHlwZVBhcmFtZXRlcnM6IHR5cGVQYXJhbWV0ZXJOYW1lc30pXG4gICAgICA6IGNvbnZlcnRUeXBlKHBhcmFtZXRlci50eXBlLCBgUGFyYW1ldGVyICcke3BhcmFtZXRlck5hbWV9J2AsIHBhcmFtZXRlckxvY2F0aW9uLCBmaWxlbmFtZSwgc291cmNlLCByZWNvcmROYW1lcylcblxuICAgIGlmIChuYXRpdmVUeXBlID09IFwiYXJyYXlcIiAmJiAhZG9jdW1lbnRlZFR5cGUpIHJldHVybiBtaXNzaW5nVHlwZShcInBocFwiLCBgUGFyYW1ldGVyICcke3BhcmFtZXRlck5hbWV9J2AsIHBhcmFtZXRlckxvY2F0aW9uKVxuICAgIGlmIChkb2N1bWVudGVkVHlwZSAmJiAhcGhwRG9jdW1lbnRlZE5hdGl2ZVR5cGVNYXRjaGVzKG5hdGl2ZVR5cGUsIHBhcmFtZXRlci5udWxsYWJsZSwgcGFyYW1ldGVyVHlwZSwgcmVjb3JkTmFtZXMpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkb2N1bWVudGVkIHBhcmFtZXRlciB0eXBlIGluY29tcGF0aWJsZSB3aXRoIG5hdGl2ZSB0eXBlXCIsIGRvY3VtZW50ZWRUeXBlLmxvY2F0aW9uKVxuICAgIH1cblxuICAgIGlmIChwYXJhbWV0ZXIubnVsbGFibGUgJiYgcGFyYW1ldGVyVHlwZS5raW5kICE9IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIGlmICghcGFyYW1ldGVyLnR5cGUpIHJldHVybiBtaXNzaW5nVHlwZShcInBocFwiLCBgUGFyYW1ldGVyICcke3BhcmFtZXRlck5hbWV9J2AsIHBhcmFtZXRlckxvY2F0aW9uKVxuICAgICAgcGFyYW1ldGVyVHlwZSA9IG51bGxhYmxlVHlwZShwYXJhbWV0ZXJUeXBlLCBwYXJhbWV0ZXIudHlwZSwgcGFyYW1ldGVyLmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgfSBlbHNlIGlmICghcGFyYW1ldGVyLm51bGxhYmxlICYmIHBhcmFtZXRlclR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiICYmXG4gICAgICBwYXJhbWV0ZXJUeXBlLnZhbHVlVHlwZS5raW5kICE9IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm9wdGlvbmFsIGFubm90YXRpb24gd2l0aG91dCBudWxsYWJsZSBuYXRpdmUgdHlwZVwiLCBkb2N1bWVudGVkVHlwZT8ubG9jYXRpb24gPz8gcGFyYW1ldGVyTG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IHNlbWFudGljUGFyYW1ldGVyID0ge1xuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUGFyYW1ldGVyXCIpLFxuICAgICAgbG9jYXRpb246IHBhcmFtZXRlckxvY2F0aW9uLFxuICAgICAgbmFtZTogcGFyYW1ldGVyTmFtZSxcbiAgICAgIHR5cGU6IHBhcmFtZXRlclR5cGVcbiAgICB9XG5cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyhzZW1hbnRpY1BhcmFtZXRlciwge25hbWU6IG5vZGVMb2NhdGlvbihwYXJhbWV0ZXJOb2RlLCBmaWxlbmFtZSwgc291cmNlKX0pXG4gIH0pXG4gIGNvbnN0IGV4dHJhRG9jdW1lbnRlZFBhcmFtZXRlciA9IFsuLi5kb2N1bWVudGVkLnBhcmFtZXRlcnMua2V5cygpXS5maW5kKChuYW1lKSA9PlxuICAgICFub2RlLmFyZ3VtZW50cy5zb21lKChwYXJhbWV0ZXIpID0+ICh0eXBlb2YgcGFyYW1ldGVyLm5hbWUgPT0gXCJzdHJpbmdcIiA/IHBhcmFtZXRlci5uYW1lIDogcGFyYW1ldGVyLm5hbWUubmFtZSkgPT0gbmFtZSkpXG5cbiAgaWYgKGV4dHJhRG9jdW1lbnRlZFBhcmFtZXRlcikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIGBhbm5vdGF0aW9uIGZvciB1bmtub3duIHBhcmFtZXRlciAnJHtleHRyYURvY3VtZW50ZWRQYXJhbWV0ZXJ9J2AsIGxvY2F0aW9uKVxuICBpZiAobm9kZS5ieXJlZikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiYnktcmVmZXJlbmNlIHJldHVyblwiLCBsb2NhdGlvbilcbiAgY29uc3QgbmFtZU5vZGUgPSB0eXBlb2Ygbm9kZS5uYW1lID09IFwic3RyaW5nXCIgPyBub2RlIDogbm9kZS5uYW1lXG4gIGNvbnN0IG5hdGl2ZVJldHVyblR5cGUgPSBwaHBUeXBlTmFtZShub2RlLnR5cGUpXG4gIGxldCByZXR1cm5UeXBlXG5cbiAgaWYgKGRvY3VtZW50ZWQucmV0dXJuVHlwZSkge1xuICAgIHJldHVyblR5cGUgPSBkb2N1bWVudGVkVmFsdWVUeXBlKHtsYW5ndWFnZTogXCJwaHBcIiwgbG9jYXRpb246IGRvY3VtZW50ZWQucmV0dXJuVHlwZS5sb2NhdGlvbiwgb3duZXJMb2NhdGlvbjogbG9jYXRpb24sIHNvdXJjZSxcbiAgICAgIHJlY29yZHM6IHJlY29yZE5hbWVzLCBzb3VyY2VUeXBlOiBkb2N1bWVudGVkLnJldHVyblR5cGUuc291cmNlVHlwZSwgc3ViamVjdDogYEZ1bmN0aW9uICcke25hbWV9JyByZXR1cm5gLCB0eXBlUGFyYW1ldGVyczogdHlwZVBhcmFtZXRlck5hbWVzfSlcbiAgICBpZiAoIXBocERvY3VtZW50ZWROYXRpdmVUeXBlTWF0Y2hlcyhuYXRpdmVSZXR1cm5UeXBlLCBub2RlLm51bGxhYmxlLCByZXR1cm5UeXBlLCByZWNvcmROYW1lcykpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImRvY3VtZW50ZWQgcmV0dXJuIHR5cGUgaW5jb21wYXRpYmxlIHdpdGggbmF0aXZlIHR5cGVcIiwgZG9jdW1lbnRlZC5yZXR1cm5UeXBlLmxvY2F0aW9uKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAobmF0aXZlUmV0dXJuVHlwZSA9PSBcImFycmF5XCIpIHJldHVybiBtaXNzaW5nVHlwZShcInBocFwiLCBgRnVuY3Rpb24gJyR7bmFtZX0nIHJldHVybmAsIGxvY2F0aW9uKVxuICAgIHJldHVyblR5cGUgPSBjb252ZXJ0UmV0dXJuVHlwZShub2RlLnR5cGUsIGBGdW5jdGlvbiAnJHtuYW1lfScgcmV0dXJuYCwgbG9jYXRpb24sIGZpbGVuYW1lLCBzb3VyY2UsIHJlY29yZE5hbWVzKVxuICB9XG4gIGlmIChub2RlLm51bGxhYmxlICYmIHJldHVyblR5cGUua2luZCAhPSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgaWYgKCFub2RlLnR5cGUpIHJldHVybiBtaXNzaW5nVHlwZShcInBocFwiLCBgRnVuY3Rpb24gJyR7bmFtZX0nIHJldHVybmAsIGxvY2F0aW9uKVxuICAgIGNvbnN0IHR5cGVTdGFydCA9IG5vZGUudHlwZS5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwXG5cbiAgICByZXR1cm5UeXBlID0gbnVsbGFibGVUeXBlKFxuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gKi8gKHJldHVyblR5cGUpLFxuICAgICAgbm9kZS50eXBlLFxuICAgICAgTWF0aC5tYXgobm9kZS5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwLCB0eXBlU3RhcnQgLSAyKSxcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgc291cmNlXG4gICAgKVxuICB9IGVsc2UgaWYgKCFub2RlLm51bGxhYmxlICYmIHJldHVyblR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiICYmXG4gICAgcmV0dXJuVHlwZS52YWx1ZVR5cGUua2luZCAhPSBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwib3B0aW9uYWwgYW5ub3RhdGlvbiB3aXRob3V0IG51bGxhYmxlIG5hdGl2ZSByZXR1cm4gdHlwZVwiLCBkb2N1bWVudGVkLnJldHVyblR5cGU/LmxvY2F0aW9uID8/IGxvY2F0aW9uKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBsb2NhdGlvbixcbiAgICBuYW1lLFxuICAgIG5hbWVMb2NhdGlvbjogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICBwYXJhbWV0ZXJzLFxuICAgIHJldHVyblR5cGUsXG4gICAgLi4uKGRvY3VtZW50ZWQudHlwZVBhcmFtZXRlcnMgPyB7dHlwZVBhcmFtZXRlcnM6IGRvY3VtZW50ZWQudHlwZVBhcmFtZXRlcnN9IDoge30pXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIGV4YWN0IHJ1bnRpbWUgY2FycmllciBwZXJtaXR0ZWQgYmVzaWRlIGEgcHJlY2lzZSBQSFBEb2MgdHlwZS5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBuYXRpdmVUeXBlIC0gTmF0aXZlIFBIUCB0eXBlIG5hbWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG5hdGl2ZU51bGxhYmxlIC0gV2hldGhlciB0aGUgbmF0aXZlIGNhcnJpZXIgaGFzIFBIUCdzIG51bGxhYmxlIG1hcmtlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9IGRvY3VtZW50ZWRUeXBlIC0gRXhhY3Qgc2VtYW50aWMgZG9jdW1lbnQgdHlwZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkludGVyZmFjZURlY2xhcmF0aW9uPn0gcmVjb3JkcyAtIFZpc2libGUgbm9taW5hbCBkZWNsYXJhdGlvbnMgYnkgbmFtZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBuYXRpdmUgY2FycmllciBhZ3JlZXMgd2l0aG91dCBjaGFuZ2luZyBtZWFuaW5nLlxuICovXG5mdW5jdGlvbiBwaHBEb2N1bWVudGVkTmF0aXZlVHlwZU1hdGNoZXMobmF0aXZlVHlwZSwgbmF0aXZlTnVsbGFibGUsIGRvY3VtZW50ZWRUeXBlLCByZWNvcmRzKSB7XG4gIGlmIChkb2N1bWVudGVkVHlwZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICBpZiAoZG9jdW1lbnRlZFR5cGUudmFsdWVUeXBlLmtpbmQgPT0gXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIikge1xuICAgICAgcmV0dXJuIG5hdGl2ZVR5cGUgPT09IHVuZGVmaW5lZCAmJiAhbmF0aXZlTnVsbGFibGVcbiAgICB9XG5cbiAgICByZXR1cm4gbmF0aXZlTnVsbGFibGUgJiYgcGhwRG9jdW1lbnRlZE5hdGl2ZVR5cGVNYXRjaGVzKG5hdGl2ZVR5cGUsIGZhbHNlLCBkb2N1bWVudGVkVHlwZS52YWx1ZVR5cGUsIHJlY29yZHMpXG4gIH1cbiAgaWYgKG5hdGl2ZU51bGxhYmxlKSByZXR1cm4gZmFsc2VcbiAgaWYgKGRvY3VtZW50ZWRUeXBlLmtpbmQgPT0gXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIikgcmV0dXJuIG5hdGl2ZVR5cGUgPT09IHVuZGVmaW5lZFxuICBpZiAoZG9jdW1lbnRlZFR5cGUua2luZCA9PSBcIlR5cGVSZWZlcmVuY2VcIikge1xuICAgIHJldHVybiBuYXRpdmVUeXBlICE9PSB1bmRlZmluZWQgJiYgc291cmNlU2NhbGFyVHlwZShcInBocFwiLCBuYXRpdmVUeXBlKT8ubmFtZSA9PSBkb2N1bWVudGVkVHlwZS5uYW1lXG4gIH1cbiAgaWYgKGRvY3VtZW50ZWRUeXBlLmtpbmQgPT0gXCJMaXN0VHlwZVwiIHx8IGRvY3VtZW50ZWRUeXBlLmtpbmQgPT0gXCJNYXBUeXBlXCIgfHwgZG9jdW1lbnRlZFR5cGUua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICByZXR1cm4gbmF0aXZlVHlwZSA9PSBcImFycmF5XCJcbiAgfVxuICBpZiAoZG9jdW1lbnRlZFR5cGUua2luZCA9PSBcIlJlY29yZFR5cGVcIikge1xuICAgIHJldHVybiBuYXRpdmVUeXBlICE9PSB1bmRlZmluZWQgJiYgcmVjb3Jkcy5nZXQobmF0aXZlVHlwZSk/LmlkID09IGRvY3VtZW50ZWRUeXBlLmRlY2xhcmF0aW9uSWRcbiAgfVxuICBpZiAoZG9jdW1lbnRlZFR5cGUua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIikge1xuICAgIHJldHVybiBuYXRpdmVUeXBlICE9PSB1bmRlZmluZWQgJiYgcmVjb3Jkcy5nZXQobmF0aXZlVHlwZSk/LmlkID09IGRvY3VtZW50ZWRUeXBlLmRlY2xhcmF0aW9uSWRcbiAgfVxuICBpZiAoZG9jdW1lbnRlZFR5cGUua2luZCA9PSBcIkludGVyZmFjZVR5cGVcIikge1xuICAgIHJldHVybiBuYXRpdmVUeXBlICE9PSB1bmRlZmluZWQgJiYgcmVjb3Jkcy5nZXQobmF0aXZlVHlwZSk/LmlkID09IGRvY3VtZW50ZWRUeXBlLmRlY2xhcmF0aW9uSWRcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgUEhQIGZ1bmN0aW9uIGJvZHkgdXNpbmcgdGhlIGFscmVhZHktcHJvdmVkIG1vZHVsZSBzaWduYXR1cmVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkZ1bmN0aW9ufSBub2RlIC0gUEhQIGZ1bmN0aW9uIG5vZGUuXG4gKiBAcGFyYW0ge1BocEZ1bmN0aW9uU2lnbmF0dXJlfSBzaWduYXR1cmUgLSBQcmVjb252ZXJ0ZWQgZXhwbGljaXQgc2lnbmF0dXJlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBQaHBGdW5jdGlvblNpZ25hdHVyZT59IGZ1bmN0aW9ucyAtIE1vZHVsZSBmdW5jdGlvbiBzaWduYXR1cmVzLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuSW50ZXJmYWNlRGVjbGFyYXRpb24+fSByZWNvcmROYW1lcyAtIE5vbWluYWwgZGVjbGFyYXRpb25zIGJ5IHNvdXJjZSBuYW1lLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj59IHJlY29yZHMgLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uPn0gY2xhc3NlcyAtIFJlZmVyZW5jZSBjbGFzc2VzIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JbnRlcmZhY2VEZWNsYXJhdGlvbj59IGludGVyZmFjZXMgLSBJbnRlcmZhY2UgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9uPn0gZXJyb3JOYW1lcyAtIEVycm9yIGRlY2xhcmF0aW9ucyBieSBzb3VyY2UgbmFtZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj59IGVycm9ycyAtIEVycm9yIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbn0gU2VtYW50aWMgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRGdW5jdGlvbihub2RlLCBzaWduYXR1cmUsIGZ1bmN0aW9ucywgcmVjb3JkTmFtZXMsIHJlY29yZHMsIGNsYXNzZXMsIGludGVyZmFjZXMsIGVycm9yTmFtZXMsIGVycm9ycywgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBpZiAoIW5vZGUuYm9keSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZnVuY3Rpb24gYm9keVwiLCBzaWduYXR1cmUubG9jYXRpb24pXG4gIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgYmluZGluZ3M6IG5ldyBNYXAoc2lnbmF0dXJlLnBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+IFtwYXJhbWV0ZXIubmFtZSwgcGFyYW1ldGVyLnR5cGVdKSksXG4gICAgY2xhc3NlcyxcbiAgICBlcnJvck5hbWVzLFxuICAgIGVycm9ycyxcbiAgICBmdW5jdGlvbnMsXG4gICAgb3JkZXJlZE1hcERlY2xhcmF0aW9uczogb3JkZXJlZE1hcERlY2xhcmF0aW9uc0ZvclBocChub2RlLmJvZHkpLFxuICAgIHJlY29yZE5hbWVzLFxuICAgIHJlY29yZHMsXG4gICAgcmV0dXJuVHlwZTogc2lnbmF0dXJlLnJldHVyblR5cGUsXG4gICAgdHlwZVBhcmFtZXRlcnM6IG5ldyBNYXAoKHNpZ25hdHVyZS50eXBlUGFyYW1ldGVycyA/PyBbXSkubWFwKChwYXJhbWV0ZXIpID0+IFtwYXJhbWV0ZXIubmFtZSwgcGFyYW1ldGVyXSkpXG4gIH1cblxuICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7XG4gICAgYm9keTogY29udmVydEJsb2NrKG5vZGUuYm9keSwgZmlsZW5hbWUsIHNvdXJjZSwgey4uLmNvbnRleHQsIGludGVyZmFjZXN9KSxcbiAgICBraW5kOiBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIixcbiAgICBsb2NhdGlvbjogc2lnbmF0dXJlLmxvY2F0aW9uLFxuICAgIG5hbWU6IHNpZ25hdHVyZS5uYW1lLFxuICAgIHBhcmFtZXRlcnM6IHNpZ25hdHVyZS5wYXJhbWV0ZXJzLFxuICAgIHJldHVyblR5cGU6IHNpZ25hdHVyZS5yZXR1cm5UeXBlLFxuICAgIC4uLihzaWduYXR1cmUudHlwZVBhcmFtZXRlcnMgPyB7dHlwZVBhcmFtZXRlcnM6IHNpZ25hdHVyZS50eXBlUGFyYW1ldGVyc30gOiB7fSlcbiAgfSwge25hbWU6IHNpZ25hdHVyZS5uYW1lTG9jYXRpb259KVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHBhcnNlci1vd25lZCBrZXkvdmFsdWUgbG9vcHMgdG8gZXhhY3QgZGVjbGFyYXRpb25zIGluc2lkZSBvbmUgbGV4aWNhbCBvd25lci5cbiAqIEFtYmlndW91cyBzYW1lLW5hbWUgZGVjbGFyYXRpb25zIHByb2R1Y2Ugbm8gZXZpZGVuY2UgYW5kIGZhaWwgZHVyaW5nIGxvb3AgY29udmVyc2lvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBGdW5jdGlvbiBib2R5IG9yIGVudHJ5LXBvaW50IHN1YnRyZWUuXG4gKiBAcmV0dXJucyB7U2V0PG9iamVjdD59IEV4YWN0IHBhaXItaXRlcmF0ZWQgcGFyc2VyIGRlY2xhcmF0aW9ucy5cbiAqL1xuZnVuY3Rpb24gb3JkZXJlZE1hcERlY2xhcmF0aW9uc0ZvclBocCh2YWx1ZSkge1xuICAvKiogQHR5cGUge3tkZWNsYXJhdGlvbjogb2JqZWN0LCBuYW1lOiBzdHJpbmcsIG9mZnNldDogbnVtYmVyfVtdfSAqL1xuICBjb25zdCBkZWNsYXJhdGlvbnMgPSBbXVxuICAvKiogQHR5cGUge3tuYW1lOiBzdHJpbmcsIG9mZnNldDogbnVtYmVyfVtdfSAqL1xuICBjb25zdCByZWNlaXZlcnMgPSBbXVxuICBjb25zdCBzZWVuID0gbmV3IFdlYWtTZXQoKVxuICAvKipcbiAgICogVmlzaXRzIG9uZSBwYXJzZXIgY2FuZGlkYXRlLlxuICAgKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZSAtIFBhcnNlciBjYW5kaWRhdGUuXG4gICAqL1xuICBjb25zdCB2aXNpdCA9IChjYW5kaWRhdGUpID0+IHtcbiAgICBpZiAoIWNhbmRpZGF0ZSB8fCB0eXBlb2YgY2FuZGlkYXRlICE9IFwib2JqZWN0XCIgfHwgc2Vlbi5oYXMoY2FuZGlkYXRlKSkgcmV0dXJuXG4gICAgc2Vlbi5hZGQoY2FuZGlkYXRlKVxuICAgIGNvbnN0IGtpbmQgPSBSZWZsZWN0LmdldChjYW5kaWRhdGUsIFwia2luZFwiKVxuXG4gICAgaWYgKGtpbmQgPT0gXCJmdW5jdGlvblwiIHx8IGtpbmQgPT0gXCJjbGFzc1wiKSByZXR1cm5cbiAgICBpZiAoa2luZCA9PSBcImFzc2lnblwiKSB7XG4gICAgICBjb25zdCB2YXJpYWJsZSA9IFJlZmxlY3QuZ2V0KGNhbmRpZGF0ZSwgXCJsZWZ0XCIpXG5cbiAgICAgIGlmIChSZWZsZWN0LmdldCh2YXJpYWJsZSwgXCJraW5kXCIpID09IFwidmFyaWFibGVcIiAmJiB0eXBlb2YgUmVmbGVjdC5nZXQodmFyaWFibGUsIFwibmFtZVwiKSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGRlY2xhcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICBkZWNsYXJhdGlvbjogY2FuZGlkYXRlLFxuICAgICAgICAgIG5hbWU6IFJlZmxlY3QuZ2V0KHZhcmlhYmxlLCBcIm5hbWVcIiksXG4gICAgICAgICAgb2Zmc2V0OiBSZWZsZWN0LmdldCh2YXJpYWJsZSwgXCJsb2NcIik/LnN0YXJ0Lm9mZnNldFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2luZCA9PSBcImZvcmVhY2hcIikge1xuICAgICAgY29uc3QgcmVjZWl2ZXIgPSBSZWZsZWN0LmdldChjYW5kaWRhdGUsIFwic291cmNlXCIpXG5cbiAgICAgIGlmIChSZWZsZWN0LmdldChyZWNlaXZlciwgXCJraW5kXCIpID09IFwidmFyaWFibGVcIiAmJiB0eXBlb2YgUmVmbGVjdC5nZXQocmVjZWl2ZXIsIFwibmFtZVwiKSA9PSBcInN0cmluZ1wiICYmXG4gICAgICAgIFJlZmxlY3QuZ2V0KGNhbmRpZGF0ZSwgXCJrZXlcIikpIHJlY2VpdmVycy5wdXNoKHtcbiAgICAgICAgbmFtZTogUmVmbGVjdC5nZXQocmVjZWl2ZXIsIFwibmFtZVwiKSxcbiAgICAgICAgb2Zmc2V0OiBSZWZsZWN0LmdldChjYW5kaWRhdGUsIFwibG9jXCIpPy5zdGFydC5vZmZzZXRcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKGNhbmRpZGF0ZSkpIHtcbiAgICAgIGlmIChbXCJsb2NcIiwgXCJsZWFkaW5nQ29tbWVudHNcIiwgXCJ0cmFpbGluZ0NvbW1lbnRzXCJdLmluY2x1ZGVzKGtleSkpIGNvbnRpbnVlXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGNoaWxkKSB2aXNpdChpdGVtKVxuICAgICAgfSBlbHNlIHZpc2l0KGNoaWxkKVxuICAgIH1cbiAgfVxuXG4gIHZpc2l0KHZhbHVlKVxuICBjb25zdCBzZWxlY3RlZCA9IG5ldyBTZXQoKVxuICBmb3IgKGNvbnN0IHJlY2VpdmVyIG9mIHJlY2VpdmVycykge1xuICAgIGNvbnN0IG1hdGNoZXMgPSBkZWNsYXJhdGlvbnMuZmlsdGVyKCh7bmFtZSwgb2Zmc2V0fSkgPT4gbmFtZSA9PSByZWNlaXZlci5uYW1lICYmIG9mZnNldCA8IHJlY2VpdmVyLm9mZnNldClcblxuICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PSAxKSBzZWxlY3RlZC5hZGQobWF0Y2hlc1swXS5kZWNsYXJhdGlvbilcbiAgfVxuXG4gIHJldHVybiBzZWxlY3RlZFxufVxuXG4vKipcbiAqIENvbnZlcnRzIG9uZSBleGFjdCBmaW5hbCBSdW50aW1lRXhjZXB0aW9uIHN1YmNsYXNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkNsYXNzfSBub2RlIC0gUEhQIGNsYXNzIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9ufSBkZWNsYXJhdGlvbiAtIFByZWRlY2xhcmVkIHNlbWFudGljIGVycm9yLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9ufSBTZW1hbnRpYyBlcnJvciBkZWNsYXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gY29udmVydFBocEVycm9yKG5vZGUsIGRlY2xhcmF0aW9uLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IHBhcmVudCA9IG5vZGUuZXh0ZW5kc1xuICBjb25zdCBwYXJlbnROYW1lID0gcGFyZW50Py5raW5kID09IFwibmFtZVwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5hbWV9ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChwYXJlbnQpKSA6IHVuZGVmaW5lZFxuXG4gIGlmIChub2RlLmlzQW5vbnltb3VzIHx8ICFub2RlLmlzRmluYWwgfHwgbm9kZS5pc1JlYWRvbmx5IHx8IG5vZGUuaXNBYnN0cmFjdCB8fCBub2RlLmltcGxlbWVudHM/Lmxlbmd0aCB8fFxuICAgIG5vZGUuYXR0ckdyb3Vwcy5sZW5ndGggfHwgbm9kZS5ib2R5Lmxlbmd0aCAhPSAwIHx8ICFwYXJlbnROYW1lIHx8XG4gICAgIShwYXJlbnROYW1lLm5hbWUgPT0gXCJSdW50aW1lRXhjZXB0aW9uXCIgJiYgcGFyZW50TmFtZS5yZXNvbHV0aW9uID09IFwidXFuXCIgfHxcbiAgICAgIHBhcmVudE5hbWUubmFtZSA9PSBcIlxcXFxSdW50aW1lRXhjZXB0aW9uXCIgJiYgcGFyZW50TmFtZS5yZXNvbHV0aW9uID09IFwiZnFuXCIpKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibm9uY2Fub25pY2FsIHR5cGVkIGVycm9yIGRlY2xhcmF0aW9uXCIsIGxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IG5hbWVOb2RlID0gdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZSA6IG5vZGUubmFtZVxuXG4gIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKGRlY2xhcmF0aW9uLCB7bmFtZTogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKSwgdHlwZTogbm9kZUxvY2F0aW9uKHBhcmVudE5hbWUsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbn1cblxuLyoqXG4gKiBSZWFkcyBvbmUgZXhhY3QgcHVibGljIFBIUCBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZS1tZXRob2Qgc2lnbmF0dXJlLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk1ldGhvZH0gbm9kZSAtIFBhcnNlci1vd25lZCBtZXRob2QuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JbnRlcmZhY2VEZWNsYXJhdGlvbj59IG5vbWluYWxOYW1lcyAtIFZpc2libGUgbm9taW5hbCBkZWNsYXJhdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3duZXJJZCAtIFN0YWJsZSBjYWxsYWJsZSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY29uc3RydWN0b3IgLSBXaGV0aGVyIHRoaXMgaXMgdGhlIHNvbGUgY29uc3RydWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge3tsb2NhdGlvbjogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIG5hbWU6IHN0cmluZywgbmFtZUxvY2F0aW9uOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiwgcGFyYW1ldGVyczogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUGFyYW1ldGVyW10sIHJldHVyblR5cGU/OiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX19IEV4YWN0IHNpZ25hdHVyZS5cbiAqL1xuZnVuY3Rpb24gY29udmVydFBocENsYXNzQ2FsbGFibGVTaWduYXR1cmUobm9kZSwgbm9taW5hbE5hbWVzLCBvd25lcklkLCBjb25zdHJ1Y3RvciwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBuYW1lID0gdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZS5uYW1lIDogbm9kZS5uYW1lLm5hbWVcblxuICBpZiAoIWNvbnN0cnVjdG9yICYmIC9eX18vdS50ZXN0KG5hbWUpKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYHJlc2VydmVkIHJlZmVyZW5jZSBtZXRob2QgJyR7bmFtZX0nYCwgbG9jYXRpb24pXG4gIGlmIChub2RlLnZpc2liaWxpdHkgIT0gXCJwdWJsaWNcIiB8fCBub2RlLmlzU3RhdGljIHx8IG5vZGUuaXNBYnN0cmFjdCB8fCBub2RlLmlzRmluYWwgfHwgUmVmbGVjdC5nZXQobm9kZSwgXCJpc1JlYWRvbmx5XCIpIHx8IG5vZGUuYnlyZWYgfHxcbiAgICBub2RlLmF0dHJHcm91cHMubGVuZ3RoIHx8ICFub2RlLmJvZHkgfHwgY29uc3RydWN0b3IgIT0gKG5hbWUgPT0gXCJfX2NvbnN0cnVjdFwiKSkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm5vbmNhbm9uaWNhbCByZWZlcmVuY2UgY2xhc3MgY2FsbGFibGVcIiwgbG9jYXRpb24pXG4gIH1cbiAgY29uc3QgZG9jdW1lbnRlZCA9IGZ1bmN0aW9uRG9jdW1lbnRlZFR5cGVzKC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5GdW5jdGlvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKG5vZGUpKSxcbiAgICBmaWxlbmFtZSwgc291cmNlLCBvd25lcklkKVxuICBpZiAoZG9jdW1lbnRlZC50eXBlUGFyYW1ldGVycz8ubGVuZ3RoKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJnZW5lcmljIHJlZmVyZW5jZSBjbGFzcyBjYWxsYWJsZVwiLCBsb2NhdGlvbilcbiAgaWYgKGNvbnN0cnVjdG9yICYmIChub2RlLnR5cGUgfHwgbm9kZS5udWxsYWJsZSB8fCBkb2N1bWVudGVkLnJldHVyblR5cGUpKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiY29uc3RydWN0b3IgcmV0dXJuIGFubm90YXRpb25cIiwgbG9jYXRpb24pXG4gIH1cbiAgY29uc3QgcGFyYW1ldGVycyA9IG5vZGUuYXJndW1lbnRzLm1hcCgocGFyYW1ldGVyKSA9PiB7XG4gICAgY29uc3QgcGFyYW1ldGVyTG9jYXRpb24gPSBub2RlTG9jYXRpb24ocGFyYW1ldGVyLCBmaWxlbmFtZSwgc291cmNlKVxuICAgIGNvbnN0IHBhcmFtZXRlck5hbWUgPSB0eXBlb2YgcGFyYW1ldGVyLm5hbWUgPT0gXCJzdHJpbmdcIiA/IHBhcmFtZXRlci5uYW1lIDogcGFyYW1ldGVyLm5hbWUubmFtZVxuXG4gICAgaWYgKHBhcmFtZXRlci5ieXJlZiB8fCBwYXJhbWV0ZXIudmFyaWFkaWMgfHwgcGFyYW1ldGVyLnZhbHVlIHx8IHBhcmFtZXRlci5mbGFncyB8fCBwYXJhbWV0ZXIucmVhZG9ubHkgfHxcbiAgICAgIHBhcmFtZXRlci5ob29rcy5sZW5ndGggfHwgcGFyYW1ldGVyLmF0dHJHcm91cHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25jYW5vbmljYWwgcmVmZXJlbmNlIGNsYXNzIHBhcmFtZXRlclwiLCBwYXJhbWV0ZXJMb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgZG9jdW1lbnRlZFR5cGUgPSBkb2N1bWVudGVkLnBhcmFtZXRlcnMuZ2V0KHBhcmFtZXRlck5hbWUpXG4gICAgY29uc3QgbmF0aXZlVHlwZSA9IHBocFR5cGVOYW1lKHBhcmFtZXRlci50eXBlKVxuICAgIGxldCB0eXBlID0gZG9jdW1lbnRlZFR5cGVcbiAgICAgID8gZG9jdW1lbnRlZFZhbHVlVHlwZSh7bGFuZ3VhZ2U6IFwicGhwXCIsIGxvY2F0aW9uOiBkb2N1bWVudGVkVHlwZS5sb2NhdGlvbiwgb3duZXJMb2NhdGlvbjogcGFyYW1ldGVyTG9jYXRpb24sXG4gICAgICAgIHJlY29yZHM6IG5vbWluYWxOYW1lcywgc291cmNlLCBzb3VyY2VUeXBlOiBkb2N1bWVudGVkVHlwZS5zb3VyY2VUeXBlLCBzdWJqZWN0OiBgUGFyYW1ldGVyICcke3BhcmFtZXRlck5hbWV9J2B9KVxuICAgICAgOiBjb252ZXJ0VHlwZShwYXJhbWV0ZXIudHlwZSwgYFBhcmFtZXRlciAnJHtwYXJhbWV0ZXJOYW1lfSdgLCBwYXJhbWV0ZXJMb2NhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSwgbm9taW5hbE5hbWVzKVxuXG4gICAgaWYgKG5hdGl2ZVR5cGUgPT0gXCJhcnJheVwiICYmICFkb2N1bWVudGVkVHlwZSkgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIGBQYXJhbWV0ZXIgJyR7cGFyYW1ldGVyTmFtZX0nYCwgcGFyYW1ldGVyTG9jYXRpb24pXG4gICAgaWYgKGRvY3VtZW50ZWRUeXBlICYmICFwaHBEb2N1bWVudGVkTmF0aXZlVHlwZU1hdGNoZXMobmF0aXZlVHlwZSwgcGFyYW1ldGVyLm51bGxhYmxlLCB0eXBlLCBub21pbmFsTmFtZXMpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkb2N1bWVudGVkIHBhcmFtZXRlciB0eXBlIGluY29tcGF0aWJsZSB3aXRoIG5hdGl2ZSB0eXBlXCIsIGRvY3VtZW50ZWRUeXBlLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAocGFyYW1ldGVyLm51bGxhYmxlICYmIHR5cGUua2luZCAhPSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgICBpZiAoIXBhcmFtZXRlci50eXBlKSByZXR1cm4gbWlzc2luZ1R5cGUoXCJwaHBcIiwgYFBhcmFtZXRlciAnJHtwYXJhbWV0ZXJOYW1lfSdgLCBwYXJhbWV0ZXJMb2NhdGlvbilcbiAgICAgIHR5cGUgPSBudWxsYWJsZVR5cGUodHlwZSwgcGFyYW1ldGVyLnR5cGUsIHBhcmFtZXRlci5sb2M/LnN0YXJ0Lm9mZnNldCA/PyAwLCBmaWxlbmFtZSwgc291cmNlKVxuICAgIH0gZWxzZSBpZiAoIXBhcmFtZXRlci5udWxsYWJsZSAmJiB0eXBlLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwib3B0aW9uYWwgYW5ub3RhdGlvbiB3aXRob3V0IG51bGxhYmxlIG5hdGl2ZSB0eXBlXCIsIGRvY3VtZW50ZWRUeXBlPy5sb2NhdGlvbiA/PyBwYXJhbWV0ZXJMb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgbmFtZU5vZGUgPSB0eXBlb2YgcGFyYW1ldGVyLm5hbWUgPT0gXCJzdHJpbmdcIiA/IHBhcmFtZXRlciA6IHBhcmFtZXRlci5uYW1lXG5cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUGFyYW1ldGVyXCIpLCBsb2NhdGlvbjogcGFyYW1ldGVyTG9jYXRpb24sXG4gICAgICBuYW1lOiBwYXJhbWV0ZXJOYW1lLCB0eXBlfSwge25hbWU6IG5vZGVMb2NhdGlvbihuYW1lTm9kZSwgZmlsZW5hbWUsIHNvdXJjZSl9KVxuICB9KVxuICBpZiAoWy4uLmRvY3VtZW50ZWQucGFyYW1ldGVycy5rZXlzKCldLnNvbWUoKHBhcmFtZXRlck5hbWUpID0+XG4gICAgIW5vZGUuYXJndW1lbnRzLnNvbWUoKHBhcmFtZXRlcikgPT4gKHR5cGVvZiBwYXJhbWV0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gcGFyYW1ldGVyLm5hbWUgOiBwYXJhbWV0ZXIubmFtZS5uYW1lKSA9PSBwYXJhbWV0ZXJOYW1lKSkpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJtZXRob2QgUEhQRG9jIHBhcmFtZXRlciBtaXNtYXRjaFwiLCBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBuYW1lTm9kZSA9IHR5cGVvZiBub2RlLm5hbWUgPT0gXCJzdHJpbmdcIiA/IG5vZGUgOiBub2RlLm5hbWVcblxuICBpZiAoY29uc3RydWN0b3IpIHJldHVybiB7bG9jYXRpb24sIG5hbWU6IFwiY29uc3RydWN0b3JcIiwgbmFtZUxvY2F0aW9uOiBub2RlTG9jYXRpb24obmFtZU5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpLCBwYXJhbWV0ZXJzfVxuICBsZXQgcmV0dXJuVHlwZVxuICBjb25zdCBuYXRpdmVSZXR1cm5UeXBlID0gcGhwVHlwZU5hbWUobm9kZS50eXBlKVxuXG4gIGlmIChkb2N1bWVudGVkLnJldHVyblR5cGUpIHtcbiAgICByZXR1cm5UeXBlID0gZG9jdW1lbnRlZFZhbHVlVHlwZSh7bGFuZ3VhZ2U6IFwicGhwXCIsIGxvY2F0aW9uOiBkb2N1bWVudGVkLnJldHVyblR5cGUubG9jYXRpb24sIG93bmVyTG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgcmVjb3Jkczogbm9taW5hbE5hbWVzLCBzb3VyY2UsIHNvdXJjZVR5cGU6IGRvY3VtZW50ZWQucmV0dXJuVHlwZS5zb3VyY2VUeXBlLCBzdWJqZWN0OiBgTWV0aG9kICcke25hbWV9JyByZXR1cm5gfSlcbiAgICBpZiAoIXBocERvY3VtZW50ZWROYXRpdmVUeXBlTWF0Y2hlcyhuYXRpdmVSZXR1cm5UeXBlLCBub2RlLm51bGxhYmxlLCByZXR1cm5UeXBlLCBub21pbmFsTmFtZXMpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkb2N1bWVudGVkIG1ldGhvZCByZXR1cm4gdHlwZSBpbmNvbXBhdGlibGUgd2l0aCBuYXRpdmUgdHlwZVwiLCBkb2N1bWVudGVkLnJldHVyblR5cGUubG9jYXRpb24pXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChuYXRpdmVSZXR1cm5UeXBlID09IFwiYXJyYXlcIikgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIGBNZXRob2QgJyR7bmFtZX0nIHJldHVybmAsIGxvY2F0aW9uKVxuICAgIHJldHVyblR5cGUgPSBjb252ZXJ0UmV0dXJuVHlwZShub2RlLnR5cGUsIGBNZXRob2QgJyR7bmFtZX0nIHJldHVybmAsIGxvY2F0aW9uLCBmaWxlbmFtZSwgc291cmNlLCBub21pbmFsTmFtZXMpXG4gIH1cbiAgaWYgKG5vZGUubnVsbGFibGUgJiYgcmV0dXJuVHlwZS5raW5kICE9IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICBpZiAoIW5vZGUudHlwZSkgcmV0dXJuIG1pc3NpbmdUeXBlKFwicGhwXCIsIGBNZXRob2QgJyR7bmFtZX0nIHJldHVybmAsIGxvY2F0aW9uKVxuICAgIHJldHVyblR5cGUgPSBudWxsYWJsZVR5cGUoLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gKi8gKHJldHVyblR5cGUpLCBub2RlLnR5cGUsXG4gICAgICBub2RlLnR5cGUubG9jPy5zdGFydC5vZmZzZXQgPz8gMCwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgfSBlbHNlIGlmICghbm9kZS5udWxsYWJsZSAmJiByZXR1cm5UeXBlLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm9wdGlvbmFsIGFubm90YXRpb24gd2l0aG91dCBudWxsYWJsZSBuYXRpdmUgcmV0dXJuIHR5cGVcIiwgZG9jdW1lbnRlZC5yZXR1cm5UeXBlPy5sb2NhdGlvbiA/PyBsb2NhdGlvbilcbiAgfVxuXG4gIHJldHVybiB7bG9jYXRpb24sIG5hbWUsIG5hbWVMb2NhdGlvbjogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKSwgcGFyYW1ldGVycywgcmV0dXJuVHlwZX1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgc2lnbmF0dXJlLW9ubHkgUEhQIGludGVyZmFjZSBwcm9maWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkNsYXNzfSBub2RlIC0gUGFyc2VyIGludGVyZmFjZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuSW50ZXJmYWNlRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gUHJlZGVjbGFyZWQgaW50ZXJmYWNlIGlkZW50aXR5LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuSW50ZXJmYWNlRGVjbGFyYXRpb24+fSBub21pbmFsTmFtZXMgLSBWaXNpYmxlIG5vbWluYWwgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JbnRlcmZhY2VEZWNsYXJhdGlvbn0gU2VtYW50aWMgaW50ZXJmYWNlLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0UGhwSW50ZXJmYWNlKG5vZGUsIGRlY2xhcmF0aW9uLCBub21pbmFsTmFtZXMsIGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcbiAgY29uc3QgcGFyZW50cyA9IC8qKiBAdHlwZSB7cmVhZG9ubHkgaW1wb3J0KFwicGhwLXBhcnNlclwiKS5OYW1lW119ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChub2RlLmV4dGVuZHMgPz8gW10pKVxuXG4gIGlmIChub2RlLmlzQW5vbnltb3VzIHx8IG5vZGUuYXR0ckdyb3Vwcy5sZW5ndGgpIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm1hbGZvcm1lZCBpbnRlcmZhY2UgZGVjbGFyYXRpb25cIiwgbG9jYXRpb24pXG4gIGNvbnN0IHBhcmVudFJlZmVyZW5jZXMgPSBwYXJlbnRzLm1hcCgocGFyZW50KSA9PiB7XG4gICAgaWYgKHBhcmVudC5raW5kICE9IFwibmFtZVwiIHx8IHBhcmVudC5yZXNvbHV0aW9uICE9IFwidXFuXCIgfHwgdHlwZW9mIHBhcmVudC5uYW1lICE9IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInF1YWxpZmllZCBvciBkeW5hbWljIGludGVyZmFjZSBwYXJlbnRcIiwgbm9kZUxvY2F0aW9uKHBhcmVudCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIGNvbnN0IHBhcmVudERlY2xhcmF0aW9uID0gbm9taW5hbE5hbWVzLmdldChwYXJlbnQubmFtZSlcblxuICAgIGlmICghcGFyZW50RGVjbGFyYXRpb24/LmlkIHx8IHBhcmVudERlY2xhcmF0aW9uLmtpbmQgIT0gXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYGludGVyZmFjZSBwYXJlbnQgJyR7cGFyZW50Lm5hbWV9JyBpcyBub3QgYSBkZWNsYXJlZCBpbnRlcmZhY2VgLCBub2RlTG9jYXRpb24ocGFyZW50LCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJmYWNlVHlwZSgvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhcmVudERlY2xhcmF0aW9uLmlkKSwgbm9kZUxvY2F0aW9uKHBhcmVudCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH0pXG4gIGNvbnN0IG1ldGhvZE5vZGVzID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk1ldGhvZFtdfSAqLyAobm9kZS5ib2R5LmZpbHRlcigobWVtYmVyKSA9PiBtZW1iZXIua2luZCA9PSBcIm1ldGhvZFwiKSlcblxuICBpZiAobWV0aG9kTm9kZXMubGVuZ3RoICE9IG5vZGUuYm9keS5sZW5ndGgpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJpbnRlcmZhY2UgbWVtYmVyIG91dHNpZGUgb25lIHNpZ25hdHVyZS1vbmx5IHB1YmxpYyBtZXRob2RcIixcbiAgICAgIG5vZGVMb2NhdGlvbihub2RlLmJvZHkuZmluZCgobWVtYmVyKSA9PiBtZW1iZXIua2luZCAhPSBcIm1ldGhvZFwiKSA/PyBub2RlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBkZWNsYXJhdGlvbi5tZXRob2RzID0gbWV0aG9kTm9kZXMubWFwKChtZXRob2QsIGluZGV4KSA9PiBjb252ZXJ0UGhwSW50ZXJmYWNlTWV0aG9kU2lnbmF0dXJlKG1ldGhvZCwgbm9taW5hbE5hbWVzLFxuICAgIGAke2RlY2xhcmF0aW9uLmlkfTptZXRob2Q6JHtpbmRleH1gLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgY29uc3QgbmFtZU5vZGUgPSB0eXBlb2Ygbm9kZS5uYW1lID09IFwic3RyaW5nXCIgPyBub2RlIDogbm9kZS5uYW1lXG5cbiAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgIC4uLmRlY2xhcmF0aW9uLFxuICAgIC4uLihwYXJlbnRSZWZlcmVuY2VzLmxlbmd0aCA+IDAgPyB7ZXh0ZW5kczogcGFyZW50UmVmZXJlbmNlc30gOiB7fSlcbiAgfSwge25hbWU6IG5vZGVMb2NhdGlvbihuYW1lTm9kZSwgZmlsZW5hbWUsIHNvdXJjZSl9KVxufVxuXG4vKipcbiAqIFJlYWRzIG9uZSBleGFjdCBzaWduYXR1cmUtb25seSBQSFAgaW50ZXJmYWNlIG1ldGhvZC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5NZXRob2R9IG5vZGUgLSBQYXJzZXIgaW50ZXJmYWNlIG1ldGhvZC5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkludGVyZmFjZURlY2xhcmF0aW9uPn0gbm9taW5hbE5hbWVzIC0gVmlzaWJsZSBub21pbmFsIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvd25lcklkIC0gU3RhYmxlIGludGVyZmFjZSBtZXRob2QgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkludGVyZmFjZU1ldGhvZERlY2xhcmF0aW9ufSBTZW1hbnRpYyBpbnRlcmZhY2UgbWV0aG9kLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0UGhwSW50ZXJmYWNlTWV0aG9kU2lnbmF0dXJlKG5vZGUsIG5vbWluYWxOYW1lcywgb3duZXJJZCwgZmlsZW5hbWUsIHNvdXJjZSkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuICBjb25zdCBuYW1lID0gdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZS5uYW1lIDogbm9kZS5uYW1lLm5hbWVcblxuICBpZiAobm9kZS52aXNpYmlsaXR5ICE9IFwicHVibGljXCIgfHwgbm9kZS5pc1N0YXRpYyB8fCBub2RlLmlzQWJzdHJhY3QgfHwgbm9kZS5pc0ZpbmFsIHx8IFJlZmxlY3QuZ2V0KG5vZGUsIFwiaXNSZWFkb25seVwiKSB8fFxuICAgIG5vZGUuYnlyZWYgfHwgbm9kZS5udWxsYWJsZSB8fCBub2RlLmF0dHJHcm91cHMubGVuZ3RoIHx8IG5vZGUuYm9keSAhPT0gbnVsbCkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImludGVyZmFjZSBtZXRob2Qgb3V0c2lkZSBvbmUgcHVibGljIHNpZ25hdHVyZS1vbmx5IGRlY2xhcmF0aW9uXCIsIGxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IGRvY3VtZW50ZWQgPSBmdW5jdGlvbkRvY3VtZW50ZWRUeXBlcygvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRnVuY3Rpb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChub2RlKSksXG4gICAgZmlsZW5hbWUsIHNvdXJjZSwgb3duZXJJZClcblxuICBpZiAoZG9jdW1lbnRlZC5wYXJhbWV0ZXJzLnNpemUgPiAwIHx8IGRvY3VtZW50ZWQucmV0dXJuVHlwZSB8fCBkb2N1bWVudGVkLnR5cGVQYXJhbWV0ZXJzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkb2N1bWVudGVkIGludGVyZmFjZSBtZXRob2QgdHlwZSBhbm5vdGF0aW9uXCIsIGxvY2F0aW9uKVxuICB9XG4gIGlmICghbm9kZS50eXBlKSByZXR1cm4gbWlzc2luZ1R5cGUoXCJwaHBcIiwgYEludGVyZmFjZSBtZXRob2QgJyR7bmFtZX0nIHJldHVybmAsIGxvY2F0aW9uKVxuICBjb25zdCBwYXJhbWV0ZXJzID0gbm9kZS5hcmd1bWVudHMubWFwKChwYXJhbWV0ZXIpID0+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihwYXJhbWV0ZXIsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgY29uc3QgcGFyYW1ldGVyTmFtZSA9IHR5cGVvZiBwYXJhbWV0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gcGFyYW1ldGVyLm5hbWUgOiBwYXJhbWV0ZXIubmFtZS5uYW1lXG5cbiAgICBpZiAocGFyYW1ldGVyLmJ5cmVmIHx8IHBhcmFtZXRlci52YXJpYWRpYyB8fCBwYXJhbWV0ZXIudmFsdWUgfHwgcGFyYW1ldGVyLmZsYWdzIHx8IHBhcmFtZXRlci5yZWFkb25seSB8fCBwYXJhbWV0ZXIubnVsbGFibGUgfHxcbiAgICAgIHBhcmFtZXRlci5ob29rcy5sZW5ndGggfHwgcGFyYW1ldGVyLmF0dHJHcm91cHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25jYW5vbmljYWwgaW50ZXJmYWNlIG1ldGhvZCBwYXJhbWV0ZXJcIiwgcGFyYW1ldGVyTG9jYXRpb24pXG4gICAgfVxuICAgIGlmICghcGFyYW1ldGVyLnR5cGUpIHJldHVybiBtaXNzaW5nVHlwZShcInBocFwiLCBgUGFyYW1ldGVyICcke3BhcmFtZXRlck5hbWV9J2AsIHBhcmFtZXRlckxvY2F0aW9uKVxuICAgIGNvbnN0IHR5cGUgPSBjb252ZXJ0VHlwZShwYXJhbWV0ZXIudHlwZSwgYFBhcmFtZXRlciAnJHtwYXJhbWV0ZXJOYW1lfSdgLCBwYXJhbWV0ZXJMb2NhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSwgbm9taW5hbE5hbWVzKVxuXG4gICAgaWYgKHR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJvcHRpb25hbCBpbnRlcmZhY2UgbWV0aG9kIHBhcmFtZXRlclwiLCBwYXJhbWV0ZXJMb2NhdGlvbilcbiAgICBjb25zdCBuYW1lTm9kZSA9IHR5cGVvZiBwYXJhbWV0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gcGFyYW1ldGVyIDogcGFyYW1ldGVyLm5hbWVcblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJQYXJhbWV0ZXJcIiksIGxvY2F0aW9uOiBwYXJhbWV0ZXJMb2NhdGlvbixcbiAgICAgIG5hbWU6IHBhcmFtZXRlck5hbWUsIHR5cGV9LCB7bmFtZTogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKX0pXG4gIH0pXG4gIGNvbnN0IHJldHVyblR5cGUgPSBjb252ZXJ0UmV0dXJuVHlwZShub2RlLnR5cGUsIGBJbnRlcmZhY2UgbWV0aG9kICcke25hbWV9JyByZXR1cm5gLCBsb2NhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSwgbm9taW5hbE5hbWVzKVxuXG4gIGlmIChyZXR1cm5UeXBlLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwib3B0aW9uYWwgaW50ZXJmYWNlIG1ldGhvZCByZXR1cm5cIiwgbG9jYXRpb24pXG4gIGNvbnN0IG5hbWVOb2RlID0gdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZSA6IG5vZGUubmFtZVxuXG4gIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJJbnRlcmZhY2VNZXRob2REZWNsYXJhdGlvblwiKSwgbG9jYXRpb24sIG5hbWUsIHBhcmFtZXRlcnMsIHJldHVyblR5cGV9LFxuICAgIHtuYW1lOiBub2RlTG9jYXRpb24obmFtZU5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgYm91bmRlZCBmaW5hbC9wcml2YXRlLWZpZWxkIFBIUCByZWZlcmVuY2UtY2xhc3MgcHJvZmlsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5DbGFzc30gbm9kZSAtIFBhcnNlciBjbGFzcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbn0gZGVjbGFyYXRpb24gLSBQcmVkZWNsYXJlZCBjbGFzcyBpZGVudGl0eS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkludGVyZmFjZURlY2xhcmF0aW9uPn0gbm9taW5hbE5hbWVzIC0gVmlzaWJsZSBub21pbmFsIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24+fSByZWNvcmRzIC0gUmVjb3JkcyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbj59IGNsYXNzZXMgLSBDbGFzc2VzIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JbnRlcmZhY2VEZWNsYXJhdGlvbj59IGludGVyZmFjZXMgLSBJbnRlcmZhY2VzIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBQaHBGdW5jdGlvblNpZ25hdHVyZT59IGZ1bmN0aW9ucyAtIFRvcC1sZXZlbCBzaWduYXR1cmVzLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9uPn0gZXJyb3JOYW1lcyAtIEVycm9ycyBieSBuYW1lLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9uPn0gZXJyb3JzIC0gRXJyb3JzIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9ufSBTZW1hbnRpYyBjbGFzcy5cbiAqL1xuZnVuY3Rpb24gY29udmVydFBocFJlZmVyZW5jZUNsYXNzKG5vZGUsIGRlY2xhcmF0aW9uLCBub21pbmFsTmFtZXMsIHJlY29yZHMsIGNsYXNzZXMsIGludGVyZmFjZXMsIGZ1bmN0aW9ucywgZXJyb3JOYW1lcywgZXJyb3JzLFxuICBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKG5vZGUuaXNBbm9ueW1vdXMgfHwgIW5vZGUuaXNGaW5hbCB8fCBub2RlLmlzUmVhZG9ubHkgfHwgbm9kZS5pc0Fic3RyYWN0IHx8IG5vZGUuZXh0ZW5kcyB8fCBub2RlLmF0dHJHcm91cHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwicmVmZXJlbmNlIGNsYXNzIGluaGVyaXRhbmNlIG9yIG5vbmNhbm9uaWNhbCBtb2RpZmllclwiLCBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBpbXBsZW1lbnRlZFJlZmVyZW5jZXMgPSAvKiogQHR5cGUge3JlYWRvbmx5IGltcG9ydChcInBocC1wYXJzZXJcIikuTmFtZVtdfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAobm9kZS5pbXBsZW1lbnRzID8/IFtdKSlcbiAgICAubWFwKChpbXBsZW1lbnRlZCkgPT4ge1xuICAgIGNvbnN0IGltcGxlbWVudGVkTG9jYXRpb24gPSBub2RlTG9jYXRpb24oaW1wbGVtZW50ZWQsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgICBpZiAoaW1wbGVtZW50ZWQua2luZCAhPSBcIm5hbWVcIiB8fCBpbXBsZW1lbnRlZC5yZXNvbHV0aW9uICE9IFwidXFuXCIgfHwgdHlwZW9mIGltcGxlbWVudGVkLm5hbWUgIT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwicXVhbGlmaWVkIG9yIGR5bmFtaWMgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uXCIsIGltcGxlbWVudGVkTG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGltcGxlbWVudGVkRGVjbGFyYXRpb24gPSBub21pbmFsTmFtZXMuZ2V0KGltcGxlbWVudGVkLm5hbWUpXG5cbiAgICBpZiAoIWltcGxlbWVudGVkRGVjbGFyYXRpb24/LmlkIHx8IGltcGxlbWVudGVkRGVjbGFyYXRpb24ua2luZCAhPSBcIkludGVyZmFjZURlY2xhcmF0aW9uXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBgaW1wbGVtZW50ZWQgaW50ZXJmYWNlICcke2ltcGxlbWVudGVkLm5hbWV9JyBpcyBub3QgYSBkZWNsYXJlZCBpbnRlcmZhY2VgLCBpbXBsZW1lbnRlZExvY2F0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiBpbnRlcmZhY2VUeXBlKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoaW1wbGVtZW50ZWREZWNsYXJhdGlvbi5pZCksIGltcGxlbWVudGVkTG9jYXRpb24pXG4gIH0pXG4gIGNvbnN0IGZpZWxkU3RhdGVtZW50cyA9IG5vZGUuYm9keS5maWx0ZXIoKG1lbWJlcikgPT4gbWVtYmVyLmtpbmQgPT0gXCJwcm9wZXJ0eXN0YXRlbWVudFwiKVxuICBjb25zdCBtZXRob2ROb2RlcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5NZXRob2RbXX0gKi8gKG5vZGUuYm9keS5maWx0ZXIoKG1lbWJlcikgPT4gbWVtYmVyLmtpbmQgPT0gXCJtZXRob2RcIikpXG4gIGNvbnN0IGNvbnN0cnVjdG9ycyA9IG1ldGhvZE5vZGVzLmZpbHRlcigobWV0aG9kKSA9PiAodHlwZW9mIG1ldGhvZC5uYW1lID09IFwic3RyaW5nXCIgPyBtZXRob2QubmFtZSA6IG1ldGhvZC5uYW1lLm5hbWUpID09IFwiX19jb25zdHJ1Y3RcIilcbiAgY29uc3Qgb3JkaW5hcnlNZXRob2RzID0gbWV0aG9kTm9kZXMuZmlsdGVyKChtZXRob2QpID0+ICFjb25zdHJ1Y3RvcnMuaW5jbHVkZXMobWV0aG9kKSlcblxuICBpZiAoY29uc3RydWN0b3JzLmxlbmd0aCAhPSAxIHx8IGZpZWxkU3RhdGVtZW50cy5sZW5ndGggPT0gMCB8fCBmaWVsZFN0YXRlbWVudHMubGVuZ3RoICsgbWV0aG9kTm9kZXMubGVuZ3RoICE9IG5vZGUuYm9keS5sZW5ndGgpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJyZWZlcmVuY2UgY2xhc3MgcmVxdWlyZXMgcHJpdmF0ZSBmaWVsZHMsIG9uZSBjb25zdHJ1Y3RvciwgYW5kIG9yZGluYXJ5IG1ldGhvZHNcIiwgbG9jYXRpb24pXG4gIH1cbiAgZGVjbGFyYXRpb24uZmllbGRzID0gZmllbGRTdGF0ZW1lbnRzLm1hcCgoc3RhdGVtZW50LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkTG9jYXRpb24gPSBub2RlTG9jYXRpb24oc3RhdGVtZW50LCBmaWxlbmFtZSwgc291cmNlKVxuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwicHJvcGVydGllc1wiKVxuICAgIGNvbnN0IHByb3BlcnR5ID0gQXJyYXkuaXNBcnJheShwcm9wZXJ0aWVzKSAmJiBwcm9wZXJ0aWVzLmxlbmd0aCA9PSAxID8gcHJvcGVydGllc1swXSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IG5hbWVOb2RlID0gcHJvcGVydHk/Lm5hbWVcbiAgICBjb25zdCBuYW1lID0gdHlwZW9mIG5hbWVOb2RlID09IFwic3RyaW5nXCIgPyBuYW1lTm9kZSA6IG5hbWVOb2RlPy5uYW1lXG5cbiAgICBpZiAoUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBcInZpc2liaWxpdHlcIikgIT0gXCJwcml2YXRlXCIgfHwgUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBcImlzU3RhdGljXCIpIHx8XG4gICAgICBSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiaXNBYnN0cmFjdFwiKSB8fCBSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiaXNGaW5hbFwiKSB8fCAhcHJvcGVydHkgfHxcbiAgICAgIHR5cGVvZiBuYW1lICE9IFwic3RyaW5nXCIgfHwgcHJvcGVydHkudmFsdWUgfHwgcHJvcGVydHkucmVhZG9ubHkgfHwgcHJvcGVydHkubnVsbGFibGUgfHwgcHJvcGVydHkuYXR0ckdyb3Vwcz8ubGVuZ3RoIHx8XG4gICAgICBwcm9wZXJ0eS5ob29rcz8ubGVuZ3RoKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25jYW5vbmljYWwgcHJpdmF0ZSBpbnN0YW5jZSBmaWVsZFwiLCBmaWVsZExvY2F0aW9uKVxuICAgIGNvbnN0IHR5cGUgPSBjb252ZXJ0VHlwZShwcm9wZXJ0eS50eXBlLCBgUHJpdmF0ZSBmaWVsZCAnJHtuYW1lfSdgLCBmaWVsZExvY2F0aW9uLCBmaWxlbmFtZSwgc291cmNlLCBub21pbmFsTmFtZXMpXG5cbiAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7aWQ6IGAke2RlY2xhcmF0aW9uLmlkfTpmaWVsZDoke2luZGV4fWAsIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlByaXZhdGVGaWVsZFwiKSxcbiAgICAgIGxvY2F0aW9uOiBmaWVsZExvY2F0aW9uLCBuYW1lLCB0eXBlfSwge25hbWU6IG5vZGVMb2NhdGlvbih0eXBlb2YgbmFtZU5vZGUgPT0gXCJzdHJpbmdcIiA/IHByb3BlcnR5IDogbmFtZU5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpfSlcbiAgfSlcbiAgY29uc3QgY29uc3RydWN0b3JOb2RlID0gY29uc3RydWN0b3JzWzBdXG4gIGNvbnN0IGNvbnN0cnVjdG9yU2lnbmF0dXJlID0gY29udmVydFBocENsYXNzQ2FsbGFibGVTaWduYXR1cmUoY29uc3RydWN0b3JOb2RlLCBub21pbmFsTmFtZXMsXG4gICAgYCR7ZGVjbGFyYXRpb24uaWR9OmNvbnN0cnVjdG9yYCwgdHJ1ZSwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBkZWNsYXJhdGlvbi5jb25zdHJ1Y3RvciA9IHdpdGhQYXJzZXJSYW5nZXMoe2JvZHk6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmxvY2t9ICovICh7fSksXG4gICAgaWQ6IGAke2RlY2xhcmF0aW9uLmlkfTpjb25zdHJ1Y3RvcmAsIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkNvbnN0cnVjdG9yRGVjbGFyYXRpb25cIiksXG4gICAgbG9jYXRpb246IGNvbnN0cnVjdG9yU2lnbmF0dXJlLmxvY2F0aW9uLCBwYXJhbWV0ZXJzOiBjb25zdHJ1Y3RvclNpZ25hdHVyZS5wYXJhbWV0ZXJzfSwge2NvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvclNpZ25hdHVyZS5uYW1lTG9jYXRpb259KVxuICBjb25zdCBtZXRob2RTaWduYXR1cmVzID0gb3JkaW5hcnlNZXRob2RzLm1hcCgobWV0aG9kLCBpbmRleCkgPT4gY29udmVydFBocENsYXNzQ2FsbGFibGVTaWduYXR1cmUobWV0aG9kLCBub21pbmFsTmFtZXMsXG4gICAgYCR7ZGVjbGFyYXRpb24uaWR9Om1ldGhvZDoke2luZGV4fWAsIGZhbHNlLCBmaWxlbmFtZSwgc291cmNlKSlcblxuICBkZWNsYXJhdGlvbi5tZXRob2RzID0gbWV0aG9kU2lnbmF0dXJlcy5tYXAoKHNpZ25hdHVyZSwgaW5kZXgpID0+IHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgIGJvZHk6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmxvY2t9ICovICh7fSksIGlkOiBgJHtkZWNsYXJhdGlvbi5pZH06bWV0aG9kOiR7aW5kZXh9YCxcbiAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJNZXRob2REZWNsYXJhdGlvblwiKSwgbG9jYXRpb246IHNpZ25hdHVyZS5sb2NhdGlvbiwgbmFtZTogc2lnbmF0dXJlLm5hbWUsXG4gICAgcGFyYW1ldGVyczogc2lnbmF0dXJlLnBhcmFtZXRlcnMsXG4gICAgcmV0dXJuVHlwZTogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gKi8gKHNpZ25hdHVyZS5yZXR1cm5UeXBlKVxuICB9LCB7bmFtZTogc2lnbmF0dXJlLm5hbWVMb2NhdGlvbn0pKVxuICBpZiAoaW1wbGVtZW50ZWRSZWZlcmVuY2VzLmxlbmd0aCA+IDApIGRlY2xhcmF0aW9uLmltcGxlbWVudHMgPSBpbXBsZW1lbnRlZFJlZmVyZW5jZXNcbiAgY29uc3QgYmFzZSA9IHtiaW5kaW5nczogbmV3IE1hcCgpLCBjbGFzc2VzLCBjdXJyZW50Q2xhc3M6IGRlY2xhcmF0aW9uLCBlcnJvck5hbWVzLCBlcnJvcnMsIGZ1bmN0aW9ucyxcbiAgICBpbnRlcmZhY2VzLCByZWNvcmROYW1lczogbm9taW5hbE5hbWVzLCByZWNvcmRzfVxuXG4gIGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLmJvZHkgPSBjb252ZXJ0QmxvY2soLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJsb2NrfSAqLyAoY29uc3RydWN0b3JOb2RlLmJvZHkpLCBmaWxlbmFtZSwgc291cmNlLFxuICAgIHsuLi5iYXNlLCBiaW5kaW5nczogbmV3IE1hcChkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PiBbcGFyYW1ldGVyLm5hbWUsIHBhcmFtZXRlci50eXBlXSkpLFxuICAgICAgcmV0dXJuVHlwZToge2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlR5cGVSZWZlcmVuY2VcIiksIG5hbWU6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInZvaWRcIil9fSlcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG9yZGluYXJ5TWV0aG9kcy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCBtZXRob2QgPSBkZWNsYXJhdGlvbi5tZXRob2RzW2luZGV4XVxuXG4gICAgbWV0aG9kLmJvZHkgPSBjb252ZXJ0QmxvY2soLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJsb2NrfSAqLyAob3JkaW5hcnlNZXRob2RzW2luZGV4XS5ib2R5KSwgZmlsZW5hbWUsIHNvdXJjZSxcbiAgICAgIHsuLi5iYXNlLCBiaW5kaW5nczogbmV3IE1hcChtZXRob2QucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT4gW3BhcmFtZXRlci5uYW1lLCBwYXJhbWV0ZXIudHlwZV0pKSwgcmV0dXJuVHlwZTogbWV0aG9kLnJldHVyblR5cGV9KVxuICB9XG4gIGNvbnN0IG5hbWVOb2RlID0gdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZSA6IG5vZGUubmFtZVxuXG4gIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKGRlY2xhcmF0aW9uLCB7bmFtZTogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKX0pXG59XG5cbi8qKlxuICogQ29udmVydHMgb25lIGV4YWN0IGZpbmFsIHJlYWRvbmx5IHByb21vdGVkLXByb3BlcnR5IFBIUCByZWNvcmQuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuQ2xhc3N9IG5vZGUgLSBQSFAgY2xhc3MgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9ufSBkZWNsYXJhdGlvbiAtIFByZWRlY2xhcmVkIG5vbWluYWwgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uPn0gcmVjb3JkTmFtZXMgLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9ufSBTZW1hbnRpYyByZWNvcmQuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRQaHBSZWNvcmQobm9kZSwgZGVjbGFyYXRpb24sIHJlY29yZE5hbWVzLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IGdlbmVyaWMgPSAoZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnM/Lmxlbmd0aCA/PyAwKSA+IDBcblxuICBpZiAobm9kZS5pc0Fub255bW91cyB8fCAhbm9kZS5pc0ZpbmFsIHx8IG5vZGUuaXNSZWFkb25seSA9PSBnZW5lcmljIHx8IG5vZGUuaXNBYnN0cmFjdCB8fCBub2RlLmV4dGVuZHMgfHwgbm9kZS5pbXBsZW1lbnRzPy5sZW5ndGggfHxcbiAgICBub2RlLmF0dHJHcm91cHMubGVuZ3RoKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25jYW5vbmljYWwgcmVjb3JkIGNsYXNzIG1vZGlmaWVyc1wiLCBsb2NhdGlvbilcbiAgaWYgKG5vZGUuYm9keS5sZW5ndGggPCAxIHx8IG5vZGUuYm9keVswXS5raW5kICE9IFwibWV0aG9kXCIgfHwgIWdlbmVyaWMgJiYgbm9kZS5ib2R5Lmxlbmd0aCAhPSAxKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwicmVjb3JkIGNsYXNzIGJvZHkgb3V0c2lkZSBvbmUgY29uc3RydWN0b3JcIiwgbm9kZUxvY2F0aW9uKG5vZGUuYm9keVsxXSA/PyBub2RlLmJvZHlbMF0gPz8gbm9kZSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbiAgY29uc3QgY29uc3RydWN0b3IgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTWV0aG9kfSAqLyAobm9kZS5ib2R5WzBdKVxuICBjb25zdCB0eXBlUGFyYW1ldGVyTmFtZXMgPSBuZXcgTWFwKChkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycyA/PyBbXSkubWFwKChwYXJhbWV0ZXIpID0+IFtwYXJhbWV0ZXIubmFtZSwgcGFyYW1ldGVyXSkpXG4gIGNvbnN0IGNvbnN0cnVjdG9yTmFtZSA9IHR5cGVvZiBjb25zdHJ1Y3Rvci5uYW1lID09IFwic3RyaW5nXCIgPyBjb25zdHJ1Y3Rvci5uYW1lIDogY29uc3RydWN0b3IubmFtZS5uYW1lXG5cbiAgaWYgKGNvbnN0cnVjdG9yTmFtZSAhPSBcIl9fY29uc3RydWN0XCIgfHwgY29uc3RydWN0b3IudmlzaWJpbGl0eSAhPSBcInB1YmxpY1wiIHx8IGNvbnN0cnVjdG9yLmlzU3RhdGljIHx8IGNvbnN0cnVjdG9yLmlzQWJzdHJhY3QgfHxcbiAgICBjb25zdHJ1Y3Rvci5pc0ZpbmFsIHx8IFJlZmxlY3QuZ2V0KGNvbnN0cnVjdG9yLCBcImlzUmVhZG9ubHlcIikgfHwgY29uc3RydWN0b3IuYnlyZWYgfHwgY29uc3RydWN0b3IudHlwZSB8fCBjb25zdHJ1Y3Rvci5udWxsYWJsZSB8fFxuICAgIGNvbnN0cnVjdG9yLmF0dHJHcm91cHMubGVuZ3RoIHx8ICFjb25zdHJ1Y3Rvci5ib2R5IHx8IGNvbnN0cnVjdG9yLmJvZHkuY2hpbGRyZW4ubGVuZ3RoICE9IDApIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25jYW5vbmljYWwgcmVjb3JkIGNvbnN0cnVjdG9yXCIsIG5vZGVMb2NhdGlvbihjb25zdHJ1Y3RvciwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbiAgY29uc3QgZG9jdW1lbnRlZCA9IGZ1bmN0aW9uRG9jdW1lbnRlZFR5cGVzKC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5GdW5jdGlvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGNvbnN0cnVjdG9yKSksIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgZGVjbGFyYXRpb24uZmllbGRzID0gY29uc3RydWN0b3IuYXJndW1lbnRzLm1hcCgocGFyYW1ldGVyKSA9PiB7XG4gICAgY29uc3QgZmllbGRMb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihwYXJhbWV0ZXIsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgY29uc3QgbmFtZSA9IHR5cGVvZiBwYXJhbWV0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gcGFyYW1ldGVyLm5hbWUgOiBwYXJhbWV0ZXIubmFtZS5uYW1lXG4gICAgY29uc3QgZG9jdW1lbnRlZFR5cGUgPSBkb2N1bWVudGVkLnBhcmFtZXRlcnMuZ2V0KG5hbWUpXG4gICAgY29uc3QgbmF0aXZlVHlwZSA9IHBocFR5cGVOYW1lKHBhcmFtZXRlci50eXBlKVxuXG4gICAgaWYgKHBhcmFtZXRlci5mbGFncyAhPSAoZ2VuZXJpYyA/IDQgOiAxKSB8fCBwYXJhbWV0ZXIuYnlyZWYgfHwgcGFyYW1ldGVyLnZhcmlhZGljIHx8IHBhcmFtZXRlci52YWx1ZSB8fCBwYXJhbWV0ZXIucmVhZG9ubHkgfHxcbiAgICAgIHBhcmFtZXRlci5ob29rcy5sZW5ndGggfHwgcGFyYW1ldGVyLmF0dHJHcm91cHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJyZWNvcmQgZmllbGQgb3V0c2lkZSBwdWJsaWMgcHJvbW90ZWQtcHJvcGVydHkgcHJvZmlsZVwiLCBmaWVsZExvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAobmF0aXZlVHlwZSA9PSBcImFycmF5XCIgJiYgIWRvY3VtZW50ZWRUeXBlKSByZXR1cm4gbWlzc2luZ1R5cGUoXCJwaHBcIiwgYFJlY29yZCBmaWVsZCAnJHtuYW1lfSdgLCBmaWVsZExvY2F0aW9uKVxuICAgIGxldCB0eXBlID0gZG9jdW1lbnRlZFR5cGVcbiAgICAgID8gZG9jdW1lbnRlZFZhbHVlVHlwZSh7bGFuZ3VhZ2U6IFwicGhwXCIsIGxvY2F0aW9uOiBkb2N1bWVudGVkVHlwZS5sb2NhdGlvbiwgb3duZXJMb2NhdGlvbjogZmllbGRMb2NhdGlvbiwgcmVjb3JkczogcmVjb3JkTmFtZXMsXG4gICAgICAgIHNvdXJjZSwgc291cmNlVHlwZTogZG9jdW1lbnRlZFR5cGUuc291cmNlVHlwZSwgc3ViamVjdDogYFJlY29yZCBmaWVsZCAnJHtuYW1lfSdgLCB0eXBlUGFyYW1ldGVyczogdHlwZVBhcmFtZXRlck5hbWVzfSlcbiAgICAgIDogY29udmVydFR5cGUocGFyYW1ldGVyLnR5cGUsIGBSZWNvcmQgZmllbGQgJyR7bmFtZX0nYCwgZmllbGRMb2NhdGlvbiwgZmlsZW5hbWUsIHNvdXJjZSwgcmVjb3JkTmFtZXMpXG5cbiAgICBpZiAoZG9jdW1lbnRlZFR5cGUgJiYgIXBocERvY3VtZW50ZWROYXRpdmVUeXBlTWF0Y2hlcyhuYXRpdmVUeXBlLCBwYXJhbWV0ZXIubnVsbGFibGUsIHR5cGUsIHJlY29yZE5hbWVzKSkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZG9jdW1lbnRlZCByZWNvcmQgZmllbGQgdHlwZSBpbmNvbXBhdGlibGUgd2l0aCBuYXRpdmUgdHlwZVwiLCBkb2N1bWVudGVkVHlwZS5sb2NhdGlvbilcbiAgICB9XG5cbiAgICBpZiAocGFyYW1ldGVyLm51bGxhYmxlICYmIHR5cGUua2luZCAhPSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgICBpZiAoIXBhcmFtZXRlci50eXBlKSByZXR1cm4gbWlzc2luZ1R5cGUoXCJwaHBcIiwgYFJlY29yZCBmaWVsZCAnJHtuYW1lfSdgLCBmaWVsZExvY2F0aW9uKVxuICAgICAgdHlwZSA9IG51bGxhYmxlVHlwZSh0eXBlLCBwYXJhbWV0ZXIudHlwZSwgcGFyYW1ldGVyLmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIGZpbGVuYW1lLCBzb3VyY2UpXG4gICAgfSBlbHNlIGlmICghcGFyYW1ldGVyLm51bGxhYmxlICYmIHR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiICYmIHR5cGUudmFsdWVUeXBlLmtpbmQgIT0gXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIikge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwib3B0aW9uYWwgYW5ub3RhdGlvbiB3aXRob3V0IG51bGxhYmxlIG5hdGl2ZSByZWNvcmQgZmllbGRcIiwgZG9jdW1lbnRlZFR5cGU/LmxvY2F0aW9uID8/IGZpZWxkTG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGZpZWxkID0ge2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlJlY29yZEZpZWxkXCIpLCBsb2NhdGlvbjogZmllbGRMb2NhdGlvbiwgbmFtZSwgdHlwZX1cbiAgICBjb25zdCBuYW1lTm9kZSA9IHR5cGVvZiBwYXJhbWV0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gcGFyYW1ldGVyIDogcGFyYW1ldGVyLm5hbWVcblxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKGZpZWxkLCB7bmFtZTogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKX0pXG4gIH0pXG4gIGNvbnN0IGV4dHJhRG9jdW1lbnRlZCA9IFsuLi5kb2N1bWVudGVkLnBhcmFtZXRlcnMua2V5cygpXS5maW5kKChuYW1lKSA9PlxuICAgICFjb25zdHJ1Y3Rvci5hcmd1bWVudHMuc29tZSgocGFyYW1ldGVyKSA9PiAodHlwZW9mIHBhcmFtZXRlci5uYW1lID09IFwic3RyaW5nXCIgPyBwYXJhbWV0ZXIubmFtZSA6IHBhcmFtZXRlci5uYW1lLm5hbWUpID09IG5hbWUpKVxuXG4gIGlmIChleHRyYURvY3VtZW50ZWQgfHwgZG9jdW1lbnRlZC5yZXR1cm5UeXBlKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJpbnZhbGlkIHJlY29yZCBjb25zdHJ1Y3RvciBhbm5vdGF0aW9uXCIsIGxvY2F0aW9uKVxuICBpZiAoZ2VuZXJpYykgdmFsaWRhdGVQaHBHZW5lcmljUmVjb3JkR2V0dGVycyhub2RlLCBkZWNsYXJhdGlvbiwgcmVjb3JkTmFtZXMsIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IG5hbWVOb2RlID0gdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZSA6IG5vZGUubmFtZVxuXG4gIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKGRlY2xhcmF0aW9uLCB7bmFtZTogbm9kZUxvY2F0aW9uKG5hbWVOb2RlLCBmaWxlbmFtZSwgc291cmNlKX0pXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBleGFjdCBhY2Nlc3NvciBoYWxmIG9mIFBIUCdzIGRvY3VtZW50ZWQgZ2VuZXJpYy1yZWNvcmQgcHJvZmlsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5DbGFzc30gbm9kZSAtIFBIUCBjbGFzcyBkZWNsYXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gQ29udmVydGVkIHJlY29yZC5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24+fSByZWNvcmROYW1lcyAtIFZpc2libGUgcmVjb3Jkcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQaHBHZW5lcmljUmVjb3JkR2V0dGVycyhub2RlLCBkZWNsYXJhdGlvbiwgcmVjb3JkTmFtZXMsIGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgY29uc3QgZ2V0dGVycyA9IG5vZGUuYm9keS5zbGljZSgxKVxuICBjb25zdCB0eXBlUGFyYW1ldGVycyA9IG5ldyBNYXAoKGRlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzID8/IFtdKS5tYXAoKHBhcmFtZXRlcikgPT4gW3BhcmFtZXRlci5uYW1lLCBwYXJhbWV0ZXJdKSlcblxuICBpZiAoZ2V0dGVycy5sZW5ndGggIT0gZGVjbGFyYXRpb24uZmllbGRzLmxlbmd0aCkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImdlbmVyaWMgcmVjb3JkIGdldHRlciBjb3VudFwiLCBub2RlTG9jYXRpb24oZ2V0dGVyc1tkZWNsYXJhdGlvbi5maWVsZHMubGVuZ3RoXSA/PyBub2RlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBnZXR0ZXJzLmZvckVhY2goKGNhbmRpZGF0ZSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IGRlY2xhcmF0aW9uLmZpZWxkc1tpbmRleF1cblxuICAgIGlmIChjYW5kaWRhdGUua2luZCAhPSBcIm1ldGhvZFwiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJub25jYW5vbmljYWwgZ2VuZXJpYyByZWNvcmQgZ2V0dGVyXCIsIG5vZGVMb2NhdGlvbihjYW5kaWRhdGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIGNvbnN0IGdldHRlciA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5NZXRob2R9ICovIChjYW5kaWRhdGUpXG4gICAgY29uc3QgbmFtZSA9IHR5cGVvZiBnZXR0ZXIubmFtZSA9PSBcInN0cmluZ1wiID8gZ2V0dGVyLm5hbWUgOiBnZXR0ZXIubmFtZS5uYW1lXG4gICAgY29uc3Qgc3RhdGVtZW50ID0gZ2V0dGVyLmJvZHk/LmNoaWxkcmVuWzBdXG4gICAgY29uc3QgcmV0dXJuZWQgPSBzdGF0ZW1lbnQ/LmtpbmQgPT0gXCJyZXR1cm5cIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5SZXR1cm59ICovIChzdGF0ZW1lbnQpLmV4cHIgOiB1bmRlZmluZWRcbiAgICBjb25zdCBsb29rdXAgPSByZXR1cm5lZD8ua2luZCA9PSBcInByb3BlcnR5bG9va3VwXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuUHJvcGVydHlMb29rdXB9ICovIChyZXR1cm5lZCkgOiB1bmRlZmluZWRcbiAgICBjb25zdCByZWNlaXZlciA9IGxvb2t1cD8ud2hhdC5raW5kID09IFwidmFyaWFibGVcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5WYXJpYWJsZX0gKi8gKGxvb2t1cC53aGF0KSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IG1lbWJlciA9IGxvb2t1cD8ub2Zmc2V0LmtpbmQgPT0gXCJpZGVudGlmaWVyXCIgPyAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuSWRlbnRpZmllcn0gKi8gKGxvb2t1cC5vZmZzZXQpIDogdW5kZWZpbmVkXG5cbiAgICBpZiAobmFtZSAhPSBmaWVsZC5uYW1lIHx8IGdldHRlci52aXNpYmlsaXR5ICE9IFwicHVibGljXCIgfHwgZ2V0dGVyLmlzU3RhdGljIHx8IGdldHRlci5pc0Fic3RyYWN0IHx8IGdldHRlci5pc0ZpbmFsIHx8XG4gICAgICBSZWZsZWN0LmdldChnZXR0ZXIsIFwiaXNSZWFkb25seVwiKSB8fCBnZXR0ZXIuYnlyZWYgfHwgZ2V0dGVyLmFyZ3VtZW50cy5sZW5ndGggfHwgZ2V0dGVyLmF0dHJHcm91cHMubGVuZ3RoIHx8XG4gICAgICAhZ2V0dGVyLmJvZHkgfHwgZ2V0dGVyLmJvZHkuY2hpbGRyZW4ubGVuZ3RoICE9IDEgfHwgcmVjZWl2ZXI/Lm5hbWUgIT0gXCJ0aGlzXCIgfHwgbWVtYmVyPy5uYW1lICE9IGZpZWxkLm5hbWUpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm5vbmNhbm9uaWNhbCBnZW5lcmljIHJlY29yZCBnZXR0ZXJcIiwgbm9kZUxvY2F0aW9uKGdldHRlciwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuICAgIGNvbnN0IGRvY3VtZW50ZWQgPSBmdW5jdGlvbkRvY3VtZW50ZWRUeXBlcyhcbiAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5GdW5jdGlvbn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGdldHRlcikpLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gICAgaWYgKGRvY3VtZW50ZWQucGFyYW1ldGVycy5zaXplIHx8IGRvY3VtZW50ZWQudHlwZVBhcmFtZXRlcnMgfHwgIWRvY3VtZW50ZWQucmV0dXJuVHlwZSkge1xuICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibWlzc2luZyBvciBpbnZhbGlkIGdlbmVyaWMgcmVjb3JkIGdldHRlciB0eXBlXCIsIG5vZGVMb2NhdGlvbihnZXR0ZXIsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICBjb25zdCByZXR1cm5UeXBlID0gZG9jdW1lbnRlZFZhbHVlVHlwZSh7bGFuZ3VhZ2U6IFwicGhwXCIsIGxvY2F0aW9uOiBkb2N1bWVudGVkLnJldHVyblR5cGUubG9jYXRpb24sXG4gICAgICBvd25lckxvY2F0aW9uOiBub2RlTG9jYXRpb24oZ2V0dGVyLCBmaWxlbmFtZSwgc291cmNlKSwgcmVjb3JkczogcmVjb3JkTmFtZXMsIHNvdXJjZSxcbiAgICAgIHNvdXJjZVR5cGU6IGRvY3VtZW50ZWQucmV0dXJuVHlwZS5zb3VyY2VUeXBlLCBzdWJqZWN0OiBgUmVjb3JkIGdldHRlciAnJHtuYW1lfSdgLCB0eXBlUGFyYW1ldGVyc30pXG4gICAgY29uc3QgbmF0aXZlVHlwZSA9IHBocFR5cGVOYW1lKGdldHRlci50eXBlKVxuXG4gICAgaWYgKCFwaHBEb2N1bWVudGVkTmF0aXZlVHlwZU1hdGNoZXMobmF0aXZlVHlwZSwgZ2V0dGVyLm51bGxhYmxlLCByZXR1cm5UeXBlLCByZWNvcmROYW1lcykgfHxcbiAgICAgICFzYW1lVmFsdWVUeXBlKHJldHVyblR5cGUsIGZpZWxkLnR5cGUpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJnZW5lcmljIHJlY29yZCBnZXR0ZXIgdHlwZSBtaXNtYXRjaFwiLCBkb2N1bWVudGVkLnJldHVyblR5cGUubG9jYXRpb24pXG4gICAgfVxuICB9KVxufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBleGlzdGluZyBQSFAgaWYvZWxzZSB0ZXJtaW5hbCB3aXRoIHJlc3RyaWN0ZWQgYnJhbmNoIHByZWZpeGVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklmfSBub2RlIC0gUEhQIGlmIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JZlN0YXRlbWVudH0gU2VtYW50aWMgYnJhbmNoLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0SWYobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dCkge1xuICBjb25zdCBsb2NhdGlvbiA9IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKVxuXG4gIGlmIChub2RlLnNob3J0Rm9ybSkgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiYWx0ZXJuYXRpdmUgaWYgc3ludGF4XCIsIGxvY2F0aW9uKVxuICBpZiAobm9kZS5ib2R5LmtpbmQgIT0gXCJibG9ja1wiKSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJpZiB3aXRob3V0IGJsb2NrIGNvbnNlcXVlbnRcIiwgbG9jYXRpb24pXG4gIGlmIChub2RlLnRlc3Qua2luZCA9PSBcInZhcmlhYmxlXCIpIHtcbiAgICBjb25zdCB0ZXN0ZWQgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuVmFyaWFibGV9ICovIChub2RlLnRlc3QpXG5cbiAgICBpZiAodHlwZW9mIHRlc3RlZC5uYW1lID09IFwic3RyaW5nXCIgJiYgY29udGV4dC5iaW5kaW5ncy5nZXQodGVzdGVkLm5hbWUpPy5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm9wdGlvbmFsIHRydXRoaW5lc3MgY29uZGl0aW9uXCIsIG5vZGVMb2NhdGlvbih0ZXN0ZWQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvbmRpdGlvbiA9IGNvbnZlcnRFeHByZXNzaW9uKG5vZGUudGVzdCwgZmlsZW5hbWUsIHNvdXJjZSwgY29udGV4dClcbiAgY29uc3QgY29uc2VxdWVudENvbnRleHQgPSB7Li4uY29udGV4dCwgYmluZGluZ3M6IG5ldyBNYXAoY29udGV4dC5iaW5kaW5ncyl9XG4gIGNvbnN0IGFsdGVybmF0ZUNvbnRleHQgPSB7Li4uY29udGV4dCwgYmluZGluZ3M6IG5ldyBNYXAoY29udGV4dC5iaW5kaW5ncyl9XG4gIGxldCBhbHRlcm5hdGVcblxuICBpZiAobm9kZS5hbHRlcm5hdGUpIHtcbiAgICBpZiAobm9kZS5hbHRlcm5hdGUua2luZCA9PSBcImJsb2NrXCIpIHtcbiAgICAgIGFsdGVybmF0ZSA9IGNvbnZlcnRCbG9jaygvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuQmxvY2t9ICovIChub2RlLmFsdGVybmF0ZSksIGZpbGVuYW1lLCBzb3VyY2UsIGFsdGVybmF0ZUNvbnRleHQpXG4gICAgfSBlbHNlIGlmIChub2RlLmFsdGVybmF0ZS5raW5kID09IFwiaWZcIikge1xuICAgICAgY29uc3QgbmVzdGVkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLklmfSAqLyAobm9kZS5hbHRlcm5hdGUpXG5cbiAgICAgIGFsdGVybmF0ZSA9IHtcbiAgICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiQmxvY2tcIiksXG4gICAgICAgIGxvY2F0aW9uOiBub2RlTG9jYXRpb24obmVzdGVkLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgICAgc3RhdGVtZW50czogW2NvbnZlcnRJZihuZXN0ZWQsIGZpbGVuYW1lLCBzb3VyY2UsIGFsdGVybmF0ZUNvbnRleHQpXVxuICAgICAgfVxuICAgIH0gZWxzZSByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgYGlmIGFsdGVybmF0ZSAke25vZGUuYWx0ZXJuYXRlLmtpbmR9YCwgbm9kZUxvY2F0aW9uKG5vZGUuYWx0ZXJuYXRlLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uKGFsdGVybmF0ZSA/IHthbHRlcm5hdGV9IDoge30pLFxuICAgIGNvbmRpdGlvbixcbiAgICBjb25zZXF1ZW50OiBjb252ZXJ0QmxvY2sobm9kZS5ib2R5LCBmaWxlbmFtZSwgc291cmNlLCBjb25zZXF1ZW50Q29udGV4dCksXG4gICAga2luZDogXCJJZlN0YXRlbWVudFwiLFxuICAgIGxvY2F0aW9uXG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBleGFjdCBicmFjZWQgUEhQIGB3aGlsZSAoJGNvbmRpdGlvbikgeyAuLi4gfWAgc3ludGF4LlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLldoaWxlfSBub2RlIC0gUEhQIHdoaWxlIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtQaHBDb252ZXJzaW9uQ29udGV4dH0gY29udGV4dCAtIFR5cGVkIGNvbnZlcnNpb24gY29udGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5XaGlsZVN0YXRlbWVudH0gU2VtYW50aWMgbG9vcC5cbiAqL1xuZnVuY3Rpb24gY29udmVydFdoaWxlKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQpIHtcbiAgY29uc3QgbG9jYXRpb24gPSBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBpZiAobm9kZS5zaG9ydEZvcm0pIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImFsdGVybmF0aXZlIHdoaWxlIHN5bnRheFwiLCBsb2NhdGlvbilcbiAgaWYgKCFub2RlLmJvZHkgfHwgbm9kZS5ib2R5LmtpbmQgIT0gXCJibG9ja1wiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwid2hpbGUgd2l0aG91dCBibG9jayBib2R5XCIsIG5vZGUuYm9keSA/IG5vZGVMb2NhdGlvbihub2RlLmJvZHksIGZpbGVuYW1lLCBzb3VyY2UpIDogbG9jYXRpb24pXG4gIH1cbiAgY29uc3QgYm9keUNvbnRleHQgPSB7Li4uY29udGV4dCwgYmluZGluZ3M6IG5ldyBNYXAoY29udGV4dC5iaW5kaW5ncyl9XG5cbiAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe1xuICAgIGJvZHk6IGNvbnZlcnRCbG9jaygvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuQmxvY2t9ICovIChub2RlLmJvZHkpLCBmaWxlbmFtZSwgc291cmNlLCBib2R5Q29udGV4dCksXG4gICAgY29uZGl0aW9uOiBjb252ZXJ0RXhwcmVzc2lvbihub2RlLnRlc3QsIGZpbGVuYW1lLCBzb3VyY2UsIGNvbnRleHQsIHVuZGVmaW5lZCwgdHJ1ZSksXG4gICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiV2hpbGVTdGF0ZW1lbnRcIiksXG4gICAgbG9jYXRpb25cbiAgfSwge2tleXdvcmQ6IHRva2VuTG9jYXRpb24oXCJ3aGlsZVwiLCBub2RlLmxvYz8uc3RhcnQub2Zmc2V0ID8/IDAsIG5vZGUudGVzdC5sb2M/LnN0YXJ0Lm9mZnNldCA/PyBzb3VyY2UubGVuZ3RoLCBmaWxlbmFtZSwgc291cmNlKX0pXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBQSFAgZWNobyBlbnRyeSBwb2ludC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5FY2hvfSBub2RlIC0gUEhQIGVjaG8gbm9kZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge1BocENvbnZlcnNpb25Db250ZXh0fSBjb250ZXh0IC0gVHlwZWQgY29udmVyc2lvbiBjb250ZXh0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlByaW50U3RhdGVtZW50fSBQcmludCBzdGF0ZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRQcmludChub2RlLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKG5vZGUuZXhwcmVzc2lvbnMubGVuZ3RoICE9IDIgfHwgbm9kZS5leHByZXNzaW9uc1sxXS5raW5kICE9IFwibmFtZVwiIHx8XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5hbWV9ICovIChub2RlLmV4cHJlc3Npb25zWzFdKS5uYW1lICE9IFwiUEhQX0VPTFwiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwiZWNobyB3aXRob3V0IG9uZSBleHByZXNzaW9uIGFuZCBQSFBfRU9MXCIsIGxvY2F0aW9uKVxuICB9XG5cbiAgcmV0dXJuIHtleHByZXNzaW9uOiBjb252ZXJ0RXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb25zWzBdLCBmaWxlbmFtZSwgc291cmNlLCBjb250ZXh0KSwga2luZDogXCJQcmludFN0YXRlbWVudFwiLCBsb2NhdGlvbn1cbn1cblxuLyoqXG4gKiBQYXJzZXMgUEhQIGludG8gdGhlIHNoYXJlZCBzZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBQYXJzZXIgaW5wdXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuc291cmNlIC0gU291cmNlIHRleHQuXG4gKiBAcGFyYW0ge3JlYWRvbmx5IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbltdfSBbaW5wdXQuY2FwYWJpbGl0aWVzXSAtIENvbXBpbGVyLWF1dGhvcml6ZWQgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHt7aXNFbnRyeTogYm9vbGVhbiwgZnVuY3Rpb25zOiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPiwgcmVjb3JkczogTWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24+LCBlcnJvcnM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9uPn19IFtpbnB1dC5wcm9ncmFtXSAtIFJlc29sdmVkIHByb2dyYW0gaW1wb3J0cyBhbmQgZW50cnkgcm9sZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gU2VtYW50aWMgbW9kdWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQaHAoe2NhcGFiaWxpdGllcyA9IFtdLCBmaWxlbmFtZSwgc291cmNlLCBwcm9ncmFtOiBwcm9ncmFtQ29udGV4dH0pIHtcbiAgY29uc3QgcHJvZ3JhbSA9IHBhcnNlUGhwUHJvZ3JhbShmaWxlbmFtZSwgc291cmNlKVxuICB2YWxpZGF0ZURlY2xhcmVOb2Rlcyhwcm9ncmFtLmNoaWxkcmVuLCBmaWxlbmFtZSwgc291cmNlKVxuICBsZXQgYm9keSA9IHRhc2swMzRQaHBCb2R5KHByb2dyYW0uY2hpbGRyZW4sIGNhcGFiaWxpdGllcywgZmlsZW5hbWUsIHNvdXJjZSlcblxuICBpZiAocHJvZ3JhbUNvbnRleHQpIHtcbiAgICBpbnNwZWN0UGhwTW9kdWxlKHtmaWxlbmFtZSwgc291cmNlfSlcbiAgICBjb25zdCBuYW1lc3BhY2UgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuTmFtZXNwYWNlfSAqLyAoYm9keS5maW5kKChub2RlKSA9PiBub2RlLmtpbmQgPT0gXCJuYW1lc3BhY2VcIikpXG5cbiAgICBib2R5ID0gbmFtZXNwYWNlLmNoaWxkcmVuLmZpbHRlcigobm9kZSkgPT4gbm9kZS5raW5kICE9IFwidXNlZ3JvdXBcIiAmJiAhaXNQaHBSZXF1aXJlT25jZShub2RlKSlcbiAgfVxuICBjb25zdCBpbnRlcmZhY2VOb2RlcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5DbGFzc1tdfSAqLyAoYm9keS5maWx0ZXIoKG5vZGUpID0+IG5vZGUua2luZCA9PSBcImludGVyZmFjZVwiKSlcbiAgY29uc3QgY2xhc3NOb2RlcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5DbGFzc1tdfSAqLyAoYm9keS5maWx0ZXIoKG5vZGUpID0+IG5vZGUua2luZCA9PSBcImNsYXNzXCIpKVxuICBjb25zdCBlcnJvck5vZGVzID0gY2xhc3NOb2Rlcy5maWx0ZXIoKG5vZGUpID0+IG5vZGUuZXh0ZW5kcz8ua2luZCA9PSBcIm5hbWVcIiAmJlxuICAgIFtcIlJ1bnRpbWVFeGNlcHRpb25cIiwgXCJcXFxcUnVudGltZUV4Y2VwdGlvblwiXS5pbmNsdWRlcyhub2RlLmV4dGVuZHMubmFtZSkpXG4gIGNvbnN0IHJlZmVyZW5jZUNsYXNzTm9kZXMgPSBjbGFzc05vZGVzLmZpbHRlcigobm9kZSkgPT4gIWVycm9yTm9kZXMuaW5jbHVkZXMobm9kZSkgJiZcbiAgICBub2RlLmJvZHkuc29tZSgobWVtYmVyKSA9PiBtZW1iZXIua2luZCA9PSBcInByb3BlcnR5c3RhdGVtZW50XCIpKVxuICBjb25zdCByZWNvcmROb2RlcyA9IGNsYXNzTm9kZXMuZmlsdGVyKChub2RlKSA9PiAhZXJyb3JOb2Rlcy5pbmNsdWRlcyhub2RlKSAmJiAhcmVmZXJlbmNlQ2xhc3NOb2Rlcy5pbmNsdWRlcyhub2RlKSlcbiAgY29uc3QgZXJyb3JEZWNsYXJhdGlvbnMgPSBlcnJvck5vZGVzLm1hcCgobm9kZSwgaW5kZXgpID0+ICh7XG4gICAgaWQ6IGBlcnJvcjoke2luZGV4fWAsXG4gICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiRXJyb3JEZWNsYXJhdGlvblwiKSxcbiAgICBsb2NhdGlvbjogbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpLFxuICAgIG5hbWU6IHR5cGVvZiBub2RlLm5hbWUgPT0gXCJzdHJpbmdcIiA/IG5vZGUubmFtZSA6IG5vZGUubmFtZS5uYW1lXG4gIH0pKVxuICBjb25zdCByZWNvcmREZWNsYXJhdGlvbnMgPSByZWNvcmROb2Rlcy5tYXAoKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgaWQgPSBgcmVjb3JkOiR7aW5kZXh9YFxuICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXJzID0gY2xhc3NEb2N1bWVudGVkVHlwZVBhcmFtZXRlcnMobm9kZSwgaWQsIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgICByZXR1cm4ge1xuICAgICAgZmllbGRzOiBbXSxcbiAgICAgIGlkLFxuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUmVjb3JkRGVjbGFyYXRpb25cIiksXG4gICAgICBsb2NhdGlvbjogbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpLFxuICAgICAgbmFtZTogdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZS5uYW1lIDogbm9kZS5uYW1lLm5hbWUsXG4gICAgICAuLi4odHlwZVBhcmFtZXRlcnMgPyB7dHlwZVBhcmFtZXRlcnN9IDoge30pXG4gICAgfVxuICB9KVxuICBjb25zdCBjbGFzc0RlY2xhcmF0aW9ucyA9IHJlZmVyZW5jZUNsYXNzTm9kZXMubWFwKChub2RlLCBpbmRleCkgPT4gKHtcbiAgICBjb25zdHJ1Y3RvcjogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9ufSAqLyAoe30pLFxuICAgIGZpZWxkczogW10sIGlkOiBgY2xhc3M6JHtpbmRleH1gLCBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJDbGFzc0RlY2xhcmF0aW9uXCIpLFxuICAgIGxvY2F0aW9uOiBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSksIG1ldGhvZHM6IFtdLFxuICAgIG5hbWU6IHR5cGVvZiBub2RlLm5hbWUgPT0gXCJzdHJpbmdcIiA/IG5vZGUubmFtZSA6IG5vZGUubmFtZS5uYW1lXG4gIH0pKVxuICBjb25zdCBpbnRlcmZhY2VEZWNsYXJhdGlvbnMgPSBpbnRlcmZhY2VOb2Rlcy5tYXAoKG5vZGUsIGluZGV4KSA9PiAoe1xuICAgIGlkOiBgaW50ZXJmYWNlOiR7aW5kZXh9YCwga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiSW50ZXJmYWNlRGVjbGFyYXRpb25cIiksXG4gICAgbG9jYXRpb246IG5vZGVMb2NhdGlvbihub2RlLCBmaWxlbmFtZSwgc291cmNlKSwgbWV0aG9kczogW10sXG4gICAgbmFtZTogdHlwZW9mIG5vZGUubmFtZSA9PSBcInN0cmluZ1wiID8gbm9kZS5uYW1lIDogbm9kZS5uYW1lLm5hbWVcbiAgfSkpXG4gIGNvbnN0IHJlY29yZE5hbWVzID0gLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuSW50ZXJmYWNlRGVjbGFyYXRpb24+fSAqLyAoXG4gICAgbmV3IE1hcChwcm9ncmFtQ29udGV4dD8ucmVjb3JkcyA/PyBbXSkpXG4gIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgY2FwYWJpbGl0aWVzLmZsYXRNYXAoKHtyZXNvdXJjZXN9KSA9PiByZXNvdXJjZXMpKSByZWNvcmROYW1lcy5zZXQocmVzb3VyY2UubmFtZSwgcmVzb3VyY2UpXG4gIGNvbnN0IGVycm9yTmFtZXMgPSBuZXcgTWFwKHByb2dyYW1Db250ZXh0Py5lcnJvcnMgPz8gW10pXG4gIGZvciAoY29uc3QgZmFpbHVyZSBvZiBjYXBhYmlsaXRpZXMuZmxhdE1hcCgoe2ZhaWx1cmVzfSkgPT4gZmFpbHVyZXMpKSB7XG4gICAgZXJyb3JOYW1lcy5zZXQoZmFpbHVyZS5uYW1lLCAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChmYWlsdXJlKSkpXG4gIH1cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBlcnJvckRlY2xhcmF0aW9ucykgZXJyb3JOYW1lcy5zZXQoZGVjbGFyYXRpb24ubmFtZSwgZGVjbGFyYXRpb24pXG4gIGNvbnN0IGVycm9yc0J5SWQgPSBuZXcgTWFwKFsuLi5lcnJvck5hbWVzLnZhbHVlcygpXS5tYXAoKGRlY2xhcmF0aW9uKSA9PiBbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIGRlY2xhcmF0aW9uXSkpXG4gIGNvbnN0IGVycm9ycyA9IGVycm9yTm9kZXMubWFwKChub2RlLCBpbmRleCkgPT4gY29udmVydFBocEVycm9yKG5vZGUsIGVycm9yRGVjbGFyYXRpb25zW2luZGV4XSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgcmVjb3JkRGVjbGFyYXRpb25zKSByZWNvcmROYW1lcy5zZXQoZGVjbGFyYXRpb24ubmFtZSwgZGVjbGFyYXRpb24pXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgY2xhc3NEZWNsYXJhdGlvbnMpIHJlY29yZE5hbWVzLnNldChkZWNsYXJhdGlvbi5uYW1lLCBkZWNsYXJhdGlvbilcbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBpbnRlcmZhY2VEZWNsYXJhdGlvbnMpIHJlY29yZE5hbWVzLnNldChkZWNsYXJhdGlvbi5uYW1lLCBkZWNsYXJhdGlvbilcbiAgY29uc3QgcmVjb3Jkc0J5SWQgPSBuZXcgTWFwKFsuLi5yZWNvcmROYW1lcy52YWx1ZXMoKV1cbiAgICAuZmlsdGVyKChkZWNsYXJhdGlvbikgPT4gZGVjbGFyYXRpb24ua2luZCA9PSBcIlJlY29yZERlY2xhcmF0aW9uXCIpXG4gICAgLm1hcCgoZGVjbGFyYXRpb24pID0+IFsvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgZGVjbGFyYXRpb25dKSlcbiAgY29uc3QgY2xhc3Nlc0J5SWQgPSBuZXcgTWFwKGNsYXNzRGVjbGFyYXRpb25zLm1hcCgoZGVjbGFyYXRpb24pID0+IFsvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgZGVjbGFyYXRpb25dKSlcbiAgY29uc3QgaW50ZXJmYWNlc0J5SWQgPSBuZXcgTWFwKGludGVyZmFjZURlY2xhcmF0aW9ucy5tYXAoKGRlY2xhcmF0aW9uKSA9PiBbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIGRlY2xhcmF0aW9uXSkpXG4gIGNvbnN0IHJlY29yZHMgPSByZWNvcmROb2Rlcy5tYXAoKG5vZGUsIGluZGV4KSA9PiBjb252ZXJ0UGhwUmVjb3JkKG5vZGUsIHJlY29yZERlY2xhcmF0aW9uc1tpbmRleF0sXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj59ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChyZWNvcmROYW1lcykpLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgY29uc3QgZnVuY3Rpb25Ob2RlcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5GdW5jdGlvbltdfSAqLyAoYm9keS5maWx0ZXIoKG5vZGUpID0+IG5vZGUua2luZCA9PSBcImZ1bmN0aW9uXCIpKVxuICBjb25zdCBzaWduYXR1cmVzID0gZnVuY3Rpb25Ob2Rlcy5tYXAoKG5vZGUsIGluZGV4KSA9PiBjb252ZXJ0RnVuY3Rpb25TaWduYXR1cmUobm9kZSwgZmlsZW5hbWUsIHNvdXJjZSwgcmVjb3JkTmFtZXMsIGBmdW5jdGlvbjoke2luZGV4fWApKVxuICBjb25zdCBmdW5jdGlvblNpZ25hdHVyZXMgPSBuZXcgTWFwKFsuLi5jYXBhYmlsaXR5RnVuY3Rpb25TaWduYXR1cmVzKGNhcGFiaWxpdGllcywgbW9kdWxlTG9jYXRpb24oZmlsZW5hbWUsIHNvdXJjZSkpLFxuICAgIC4uLihwcm9ncmFtQ29udGV4dD8uZnVuY3Rpb25zID8/IFtdKV0ubWFwKChbbG9jYWxOYW1lLCBkZWNsYXJhdGlvbl0pID0+IFtsb2NhbE5hbWUsIHtcbiAgICBsb2NhdGlvbjogZGVjbGFyYXRpb24ubG9jYXRpb24sXG4gICAgbmFtZTogbG9jYWxOYW1lLFxuICAgIG5hbWVMb2NhdGlvbjogZGVjbGFyYXRpb24ubG9jYXRpb24sXG4gICAgcGFyYW1ldGVyczogZGVjbGFyYXRpb24ucGFyYW1ldGVycyxcbiAgICByZXR1cm5UeXBlOiBkZWNsYXJhdGlvbi5yZXR1cm5UeXBlLFxuICAgIC4uLihkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycyA/IHt0eXBlUGFyYW1ldGVyczogZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnN9IDoge30pXG4gIH1dKSlcbiAgZm9yIChjb25zdCBzaWduYXR1cmUgb2Ygc2lnbmF0dXJlcykgZnVuY3Rpb25TaWduYXR1cmVzLnNldChzaWduYXR1cmUubmFtZSwgc2lnbmF0dXJlKVxuICBjb25zdCBpbnRlcmZhY2VzID0gaW50ZXJmYWNlTm9kZXMubWFwKChub2RlLCBpbmRleCkgPT4gY29udmVydFBocEludGVyZmFjZShub2RlLCBpbnRlcmZhY2VEZWNsYXJhdGlvbnNbaW5kZXhdLFxuICAgIHJlY29yZE5hbWVzLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgY29uc3QgY2xhc3NlcyA9IHJlZmVyZW5jZUNsYXNzTm9kZXMubWFwKChub2RlLCBpbmRleCkgPT4gY29udmVydFBocFJlZmVyZW5jZUNsYXNzKG5vZGUsIGNsYXNzRGVjbGFyYXRpb25zW2luZGV4XSxcbiAgICByZWNvcmROYW1lcywgcmVjb3Jkc0J5SWQsIGNsYXNzZXNCeUlkLCBpbnRlcmZhY2VzQnlJZCwgZnVuY3Rpb25TaWduYXR1cmVzLCBlcnJvck5hbWVzLCBlcnJvcnNCeUlkLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgY29uc3QgZnVuY3Rpb25zID0gZnVuY3Rpb25Ob2Rlcy5tYXAoKG5vZGUsIGluZGV4KSA9PlxuICAgIGNvbnZlcnRGdW5jdGlvbihub2RlLCBzaWduYXR1cmVzW2luZGV4XSwgZnVuY3Rpb25TaWduYXR1cmVzLCByZWNvcmROYW1lcywgcmVjb3Jkc0J5SWQsIGNsYXNzZXNCeUlkLCBpbnRlcmZhY2VzQnlJZCxcbiAgICAgIGVycm9yTmFtZXMsIGVycm9yc0J5SWQsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICBjb25zdCBleGVjdXRhYmxlTm9kZXMgPSBib2R5LmZpbHRlcigobm9kZSkgPT4gIVtcImNsYXNzXCIsIFwiZnVuY3Rpb25cIiwgXCJpbnRlcmZhY2VcIiwgXCJkZWNsYXJlXCIsIFwibm9vcFwiXS5pbmNsdWRlcyhub2RlLmtpbmQpKVxuICBjb25zdCBsb2NhdGlvbiA9IG1vZHVsZUxvY2F0aW9uKGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgaWYgKHByb2dyYW1Db250ZXh0ICYmICFwcm9ncmFtQ29udGV4dC5pc0VudHJ5ICYmIGV4ZWN1dGFibGVOb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwidG9wLWxldmVsIHNpZGUgZWZmZWN0IG91dHNpZGUgdGhlIHNlbGVjdGVkIGVudHJ5IG1vZHVsZVwiLCBub2RlTG9jYXRpb24oZXhlY3V0YWJsZU5vZGVzWzBdLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBjb25zdCBmaXJzdCA9IGV4ZWN1dGFibGVOb2Rlc1swXVxuICBjb25zdCBsYXN0ID0gZXhlY3V0YWJsZU5vZGVzLmF0KC0xKSA/PyBmaXJzdFxuICBjb25zdCBlbnRyeUxvY2F0aW9uID0gZmlyc3RcbiAgICA/IGxvY2F0aW9uRnJvbU9mZnNldHMoZmlsZW5hbWUsIHNvdXJjZSwgZmlyc3QubG9jPy5zdGFydC5vZmZzZXQgPz8gMCwgbGFzdD8ubG9jPy5lbmQub2Zmc2V0ID8/IHNvdXJjZS5sZW5ndGgpXG4gICAgOiBsb2NhdGlvblxuICBjb25zdCBlbnRyeUNvbnRleHQgPSB7XG4gICAgYmluZGluZ3M6IG5ldyBNYXAoKSxcbiAgICBjbGFzc2VzOiBjbGFzc2VzQnlJZCxcbiAgICBlcnJvck5hbWVzLFxuICAgIGVycm9yczogZXJyb3JzQnlJZCxcbiAgICBmdW5jdGlvbnM6IGZ1bmN0aW9uU2lnbmF0dXJlcyxcbiAgICBpbnRlcmZhY2VzOiBpbnRlcmZhY2VzQnlJZCxcbiAgICBvcmRlcmVkTWFwRGVjbGFyYXRpb25zOiBvcmRlcmVkTWFwRGVjbGFyYXRpb25zRm9yUGhwKGV4ZWN1dGFibGVOb2RlcyksXG4gICAgcmVjb3JkTmFtZXMsXG4gICAgcmVjb3JkczogcmVjb3Jkc0J5SWQsXG4gICAgcmV0dXJuVHlwZTogdW5kZWZpbmVkXG4gIH1cbiAgY29uc3QgZW50cnlCbG9jayA9IHtcbiAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJCbG9ja1wiKSxcbiAgICBsb2NhdGlvbjogZW50cnlMb2NhdGlvbixcbiAgICBzdGF0ZW1lbnRzOiBleGVjdXRhYmxlTm9kZXMubWFwKChub2RlKSA9PiBjb252ZXJ0U3RhdGVtZW50KG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UsIGVudHJ5Q29udGV4dCkpXG4gIH1cblxuICBpZiAoIXByb2dyYW1Db250ZXh0ICYmIGZ1bmN0aW9ucy5sZW5ndGggPT0gMCAmJiBjYXBhYmlsaXRpZXMubGVuZ3RoID09IDAgJiYgIWJsb2NrUmVmZXJlbmNlc1Byb3RlY3RlZEVudHJ5KGVudHJ5QmxvY2spKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibW9kdWxlIHdpdGhvdXQgYSBmdW5jdGlvblwiLCBsb2NhdGlvbilcbiAgfVxuICByZXR1cm4ge1xuICAgIGVudHJ5UG9pbnQ6IHtcbiAgICAgIGJvZHk6IGVudHJ5QmxvY2ssXG4gICAgICBraW5kOiBcIkVudHJ5UG9pbnRcIixcbiAgICAgIGxvY2F0aW9uOiBlbnRyeUxvY2F0aW9uXG4gICAgfSxcbiAgICBmdW5jdGlvbnMsXG4gICAga2luZDogXCJNb2R1bGVcIixcbiAgICBsb2NhdGlvbixcbiAgICAuLi4oZXJyb3JzLmxlbmd0aCA+IDAgPyB7ZXJyb3JzfSA6IHt9KSxcbiAgICAuLi4oY2xhc3Nlcy5sZW5ndGggPiAwID8ge2NsYXNzZXN9IDoge30pLFxuICAgIC4uLihpbnRlcmZhY2VzLmxlbmd0aCA+IDAgPyB7aW50ZXJmYWNlc30gOiB7fSksXG4gICAgLi4uKHJlY29yZHMubGVuZ3RoID4gMCA/IHtyZWNvcmRzfSA6IHt9KVxuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlcyBleGFjdCBwcm90ZWN0ZWQgUEhQIHByb2JlIHN1cHBvcnQgYmVmb3JlIHBvcnRhYmxlIGNvbnZlcnNpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuU3RhdGVtZW50W119IGJvZHkgLSBQYXJzZWQgdG9wLWxldmVsIHN0YXRlbWVudHMuXG4gKiBAcGFyYW0ge3JlYWRvbmx5IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbltdfSBjYXBhYmlsaXRpZXMgLSBBdXRob3JpemVkIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5TdGF0ZW1lbnRbXX0gUG9ydGFibGUgc3RhdGVtZW50cy5cbiAqL1xuZnVuY3Rpb24gdGFzazAzNFBocEJvZHkoYm9keSwgY2FwYWJpbGl0aWVzLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGlmICghaXNUYXNrMDM0UmVzb3VyY2VQcm9iZShjYXBhYmlsaXRpZXMpKSByZXR1cm4gYm9keVxuICBjb25zdCBzdGFydCA9IGJvZHkuZmluZEluZGV4KChub2RlKSA9PiBub2RlLmxlYWRpbmdDb21tZW50cz8uc29tZSgoe3ZhbHVlfSkgPT4gdmFsdWUgPT0gXCIvKiBzZW1hbnRpZm9sZC10YXNrMDM0LXN1cHBvcnQgKi9cIikpXG5cbiAgaWYgKHN0YXJ0IDwgMCkgcmV0dXJuIGJvZHlcbiAgaWYgKCFoYXNFeGFjdEVmZmVjdFN1cHBvcnQoc291cmNlLCBcInBocFwiKSkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm1hbGZvcm1lZCBwcm90ZWN0ZWQgVGFzayAwMzQgc3VwcG9ydFwiLCBub2RlTG9jYXRpb24oYm9keVtzdGFydF0sIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG4gIGNvbnN0IGV4cGVjdGVkID0gW1xuICAgIFtcImNsYXNzXCIsIFwiUHJvYmVPcGVyYXRpb25GYWlsdXJlXCJdLCBbXCJjbGFzc1wiLCBcIlByb2JlQWNxdWlyZUZhaWx1cmVcIl0sIFtcImNsYXNzXCIsIFwiUHJvYmVSZWFkRmFpbHVyZVwiXSxcbiAgICBbXCJjbGFzc1wiLCBcIlByb2JlQ2xvc2VGYWlsdXJlXCJdLCBbXCJjbGFzc1wiLCBcIlByb2JlUmVzb3VyY2VDbG9zZWRcIl0sIFtcImNsYXNzXCIsIFwiUHJvYmVSZXNvdXJjZVwiXSxcbiAgICBbXCJleHByZXNzaW9uc3RhdGVtZW50XCIsIHVuZGVmaW5lZF0sIFtcImZ1bmN0aW9uXCIsIFwicHJvYmVFZmZlY3RcIl0sIFtcImZ1bmN0aW9uXCIsIFwicHJvYmVBY3F1aXJlXCJdLFxuICAgIFtcImZ1bmN0aW9uXCIsIFwicHJvYmVSZWFkXCJdLCBbXCJmdW5jdGlvblwiLCBcInByb2JlQ2xvc2VcIl0sIFtcImZ1bmN0aW9uXCIsIFwicHJvYmVUcmFjZVwiXVxuICBdXG4gIGNvbnN0IG1hdGNoZXMgPSBleHBlY3RlZC5ldmVyeSgoW2tpbmQsIG5hbWVdLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IG5vZGUgPSBib2R5W3N0YXJ0ICsgaW5kZXhdXG4gICAgY29uc3QgcmF3TmFtZSA9IG5vZGUgPyBSZWZsZWN0LmdldChub2RlLCBcIm5hbWVcIikgOiB1bmRlZmluZWRcbiAgICBjb25zdCBhY3R1YWxOYW1lID0gdHlwZW9mIHJhd05hbWUgPT0gXCJzdHJpbmdcIiA/IHJhd05hbWUgOiByYXdOYW1lICYmIHR5cGVvZiByYXdOYW1lID09IFwib2JqZWN0XCIgPyBSZWZsZWN0LmdldChyYXdOYW1lLCBcIm5hbWVcIikgOiB1bmRlZmluZWRcbiAgICByZXR1cm4gbm9kZT8ua2luZCA9PSBraW5kICYmIGFjdHVhbE5hbWUgPT0gbmFtZVxuICB9KVxuICBjb25zdCBuZXh0ID0gYm9keVtzdGFydCArIGV4cGVjdGVkLmxlbmd0aF1cblxuICBpZiAoIW1hdGNoZXMgfHwgbmV4dCAmJiAhbmV4dC5sZWFkaW5nQ29tbWVudHM/LnNvbWUoKHt2YWx1ZX0pID0+IHZhbHVlID09IFwiLyogc2VtYW50aWZvbGQtdGFzazAzNC1zdXBwb3J0LWVuZCAqL1wiKSkge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcIm1hbGZvcm1lZCBwcm90ZWN0ZWQgVGFzayAwMzQgc3VwcG9ydFwiLCBub2RlTG9jYXRpb24oYm9keVtzdGFydF0sIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG4gIHJldHVybiBbLi4uYm9keS5zbGljZSgwLCBzdGFydCksIC4uLmJvZHkuc2xpY2Uoc3RhcnQgKyBleHBlY3RlZC5sZW5ndGgpXVxufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBjYW5vbmljYWwgcGFyc2VyLW93bmVkIFBIUCBuYW1lc3BhY2UsIHVzZSBiaW5kaW5ncywgYW5kIGxpdGVyYWwgcmVxdWlyZV9vbmNlIGVkZ2VzLlxuICogQHBhcmFtIHtvYmplY3R9IGlucHV0IC0gUGFyc2VyIGlucHV0LlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0LmZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0LnNvdXJjZSAtIFNvdXJjZSB0ZXh0LlxuICogQHJldHVybnMge3tiaW5kaW5nczoge2ltcG9ydGVkTmFtZTogc3RyaW5nLCBsb2NhbE5hbWU6IHN0cmluZywgbG9jYXRpb246IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uLCBuYXRpdmVOYW1lOiBzdHJpbmcsIHN5bWJvbEtpbmQ6IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljRGVjbGFyYXRpb25LaW5kLCB0eXBlT25seTogZmFsc2V9W10sIGltcG9ydHM6IHtpbXBvcnRlZE5hbWU6IHN0cmluZywgbG9jYWxOYW1lOiBzdHJpbmcsIGxvY2F0aW9uOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiwgbmFtZXNwYWNlOiB0cnVlLCBwYXRoTG9jYXRpb246IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uLCBzcGVjaWZpZXI6IHN0cmluZywgdHlwZU9ubHk6IGZhbHNlfVtdLCBleHBvcnRzOiB7ZXhwb3J0ZWROYW1lOiBzdHJpbmcsIGxvY2FsTmFtZTogc3RyaW5nLCBsb2NhdGlvbjogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIHR5cGVPbmx5OiBmYWxzZX1bXSwgbmF0aXZlTmFtZTogc3RyaW5nfX0gUGFyc2VyLW93bmVkIFBIUCBtb2R1bGUgaGVhZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zcGVjdFBocE1vZHVsZSh7ZmlsZW5hbWUsIHNvdXJjZX0pIHtcbiAgY29uc3QgcHJvZ3JhbSA9IHBhcnNlUGhwUHJvZ3JhbShmaWxlbmFtZSwgc291cmNlKVxuXG4gIHZhbGlkYXRlRGVjbGFyZU5vZGVzKHByb2dyYW0uY2hpbGRyZW4sIGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IG5hbWVzcGFjZXMgPSBwcm9ncmFtLmNoaWxkcmVuLmZpbHRlcigobm9kZSkgPT4gbm9kZS5raW5kID09IFwibmFtZXNwYWNlXCIpXG4gIGNvbnN0IGludmFsaWRPdXRlciA9IHByb2dyYW0uY2hpbGRyZW4uZmluZCgobm9kZSkgPT4gIVtcImRlY2xhcmVcIiwgXCJuYW1lc3BhY2VcIiwgXCJub29wXCJdLmluY2x1ZGVzKG5vZGUua2luZCkpXG4gIGNvbnN0IG5hbWVzcGFjZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5OYW1lc3BhY2UgfCB1bmRlZmluZWR9ICovIChuYW1lc3BhY2VzWzBdKVxuXG4gIGlmICghbmFtZXNwYWNlIHx8IG5hbWVzcGFjZXMubGVuZ3RoICE9IDEgfHwgbmFtZXNwYWNlLndpdGhCcmFja2V0cyB8fCB0eXBlb2YgbmFtZXNwYWNlLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCBpbnZhbGlkT3V0ZXIpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJvbmUgY2Fub25pY2FsIHVuYnJhY2tldGVkIG5hbWVzcGFjZVwiLFxuICAgICAgbm9kZUxvY2F0aW9uKGludmFsaWRPdXRlciA/PyBuYW1lc3BhY2VzWzFdID8/IG5hbWVzcGFjZSA/PyBwcm9ncmFtLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxuICBjb25zdCBiaW5kaW5ncyA9IFtdXG5cbiAgZm9yIChjb25zdCBub2RlIG9mIG5hbWVzcGFjZS5jaGlsZHJlbi5maWx0ZXIoKGNoaWxkKSA9PiBjaGlsZC5raW5kID09IFwidXNlZ3JvdXBcIikpIHtcbiAgICBjb25zdCBncm91cCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Vc2VHcm91cH0gKi8gKG5vZGUpXG5cbiAgICBpZiAoZ3JvdXAubmFtZSAhPT0gbnVsbCB8fCAhW251bGwsIFwiZnVuY3Rpb25cIl0uaW5jbHVkZXMoZ3JvdXAudHlwZSkgfHwgZ3JvdXAuaXRlbXMubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcImdyb3VwZWQsIGNvbnN0YW50LCBvciBlbXB0eSB1c2UgZGVjbGFyYXRpb25cIiwgbm9kZUxvY2F0aW9uKGdyb3VwLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICB9XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGdyb3VwLml0ZW1zKSB7XG4gICAgICBpZiAoaXRlbS50eXBlICE9PSBudWxsIHx8IHR5cGVvZiBpdGVtLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCAhaXRlbS5uYW1lLmluY2x1ZGVzKFwiXFxcXFwiKSkge1xuICAgICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJncm91cGVkIG9yIHVucXVhbGlmaWVkIHVzZSBpdGVtXCIsIG5vZGVMb2NhdGlvbihpdGVtLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IGltcG9ydGVkTmFtZSA9IGl0ZW0ubmFtZS5zcGxpdChcIlxcXFxcIikuYXQoLTEpXG4gICAgICBjb25zdCBhbGlhcyA9IGl0ZW0uYWxpYXNcblxuICAgICAgaWYgKCFpbXBvcnRlZE5hbWUgfHwgYWxpYXMgJiYgYWxpYXMua2luZCAhPSBcImlkZW50aWZpZXJcIikge1xuICAgICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJpbnZhbGlkIHVzZSBhbGlhc1wiLCBub2RlTG9jYXRpb24oaXRlbSwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgICB9XG4gICAgICBiaW5kaW5ncy5wdXNoKHtcbiAgICAgICAgaW1wb3J0ZWROYW1lLFxuICAgICAgICBsb2NhbE5hbWU6IGFsaWFzID8gYWxpYXMubmFtZSA6IGltcG9ydGVkTmFtZSxcbiAgICAgICAgbG9jYXRpb246IG5vZGVMb2NhdGlvbihpdGVtLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgICAgbmF0aXZlTmFtZTogaXRlbS5uYW1lLFxuICAgICAgICBzeW1ib2xLaW5kOiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljRGVjbGFyYXRpb25LaW5kfSAqLyAoZ3JvdXAudHlwZSA9PSBcImZ1bmN0aW9uXCIgPyBcImZ1bmN0aW9uXCIgOiBcInJlY29yZFwiKSxcbiAgICAgICAgdHlwZU9ubHk6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChmYWxzZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG4gIGNvbnN0IGltcG9ydHMgPSBuYW1lc3BhY2UuY2hpbGRyZW4uZmlsdGVyKGlzUGhwSW5jbHVkZVN0YXRlbWVudCkubWFwKChub2RlKSA9PiB7XG4gICAgaWYgKCFpc1BocFJlcXVpcmVPbmNlKG5vZGUpKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJpbmNsdWRlL3JlcXVpcmUgb3V0c2lkZSBsaXRlcmFsIHJlcXVpcmVfb25jZSBfX0RJUl9fIHByb2ZpbGVcIiwgbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpKVxuICAgIH1cbiAgICBjb25zdCBzdGF0ZW1lbnQgPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRXhwcmVzc2lvblN0YXRlbWVudH0gKi8gKG5vZGUpXG4gICAgY29uc3QgaW5jbHVkZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5JbmNsdWRlfSAqLyAoc3RhdGVtZW50LmV4cHJlc3Npb24pXG4gICAgY29uc3QgdGFyZ2V0ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJpbn0gKi8gKGluY2x1ZGUudGFyZ2V0KVxuICAgIGNvbnN0IHBhdGggPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuU3RyaW5nfSAqLyAodGFyZ2V0LnJpZ2h0KVxuXG4gICAgaWYgKCFwYXRoLnZhbHVlLnN0YXJ0c1dpdGgoXCIvXCIpIHx8IHBhdGgudmFsdWUuaW5jbHVkZXMoXCJcXDBcIikpIHtcbiAgICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcInBocFwiLCBcInVuc2FmZSByZXF1aXJlX29uY2UgcGF0aFwiLCBub2RlTG9jYXRpb24ocGF0aCwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGltcG9ydGVkTmFtZTogXCIqXCIsXG4gICAgICBsb2NhbE5hbWU6IFwiXCIsXG4gICAgICBsb2NhdGlvbjogbm9kZUxvY2F0aW9uKG5vZGUsIGZpbGVuYW1lLCBzb3VyY2UpLFxuICAgICAgbmFtZXNwYWNlOiAvKiogQHR5cGUge2NvbnN0fSAqLyAodHJ1ZSksXG4gICAgICBwYXRoTG9jYXRpb246IG5vZGVMb2NhdGlvbihwYXRoLCBmaWxlbmFtZSwgc291cmNlKSxcbiAgICAgIHNwZWNpZmllcjogYC4ke3BhdGgudmFsdWV9YCxcbiAgICAgIHR5cGVPbmx5OiAvKiogQHR5cGUge2NvbnN0fSAqLyAoZmFsc2UpXG4gICAgfVxuICB9KVxuICBjb25zdCBleHBvcnRzID0gbmFtZXNwYWNlLmNoaWxkcmVuLmZsYXRNYXAoKG5vZGUpID0+IHtcbiAgICBpZiAobm9kZS5raW5kICE9IFwiY2xhc3NcIiAmJiBub2RlLmtpbmQgIT0gXCJmdW5jdGlvblwiKSByZXR1cm4gW11cbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5DbGFzcyB8IGltcG9ydChcInBocC1wYXJzZXJcIikuRnVuY3Rpb259ICovIChub2RlKVxuICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgZGVjbGFyYXRpb24ubmFtZSA9PSBcInN0cmluZ1wiID8gZGVjbGFyYXRpb24ubmFtZSA6IGRlY2xhcmF0aW9uLm5hbWUubmFtZVxuXG4gICAgcmV0dXJuIFt7ZXhwb3J0ZWROYW1lOiBuYW1lLCBsb2NhbE5hbWU6IG5hbWUsIGxvY2F0aW9uOiBub2RlTG9jYXRpb24obm9kZSwgZmlsZW5hbWUsIHNvdXJjZSksIHR5cGVPbmx5OiAvKiogQHR5cGUge2NvbnN0fSAqLyAoZmFsc2UpfV1cbiAgfSlcblxuICByZXR1cm4ge2JpbmRpbmdzLCBleHBvcnRzLCBpbXBvcnRzLCBuYXRpdmVOYW1lOiBuYW1lc3BhY2UubmFtZX1cbn1cblxuLyoqXG4gKiBSZXBvcnRzIHdoZXRoZXIgYSBQSFAgc3RhdGVtZW50IGlzIGFueSBpbmNsdWRlL3JlcXVpcmUgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Ob2RlfSBub2RlIC0gQ2FuZGlkYXRlIHN0YXRlbWVudC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBub2RlIGlzIGFuIGluY2x1ZGUgZXhwcmVzc2lvbiBzdGF0ZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGlzUGhwSW5jbHVkZVN0YXRlbWVudChub2RlKSB7XG4gIHJldHVybiBub2RlLmtpbmQgPT0gXCJleHByZXNzaW9uc3RhdGVtZW50XCIgJiZcbiAgICAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRXhwcmVzc2lvblN0YXRlbWVudH0gKi8gKG5vZGUpLmV4cHJlc3Npb24ua2luZCA9PSBcImluY2x1ZGVcIlxufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciBhIFBIUCBzdGF0ZW1lbnQgaXMgdGhlIGNhbm9uaWNhbCBsaXRlcmFsIHByb2plY3QgbG9hZCBlZGdlLlxuICogQHBhcmFtIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk5vZGV9IG5vZGUgLSBDYW5kaWRhdGUgc3RhdGVtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG5vZGUgaXMgYSBzdXBwb3J0ZWQgcmVxdWlyZS1vbmNlIHN0YXRlbWVudC5cbiAqL1xuZnVuY3Rpb24gaXNQaHBSZXF1aXJlT25jZShub2RlKSB7XG4gIGlmICghaXNQaHBJbmNsdWRlU3RhdGVtZW50KG5vZGUpKSByZXR1cm4gZmFsc2VcbiAgY29uc3Qgc3RhdGVtZW50ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkV4cHJlc3Npb25TdGF0ZW1lbnR9ICovIChub2RlKVxuICBjb25zdCBpbmNsdWRlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkluY2x1ZGV9ICovIChzdGF0ZW1lbnQuZXhwcmVzc2lvbilcbiAgY29uc3QgdGFyZ2V0ID0gaW5jbHVkZS50YXJnZXQua2luZCA9PSBcImJpblwiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLkJpbn0gKi8gKGluY2x1ZGUudGFyZ2V0KSA6IHVuZGVmaW5lZFxuICBjb25zdCBsZWZ0ID0gdGFyZ2V0Py5sZWZ0LmtpbmQgPT0gXCJtYWdpY1wiID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk1hZ2ljfSAqLyAodGFyZ2V0LmxlZnQpIDogdW5kZWZpbmVkXG5cbiAgcmV0dXJuIGluY2x1ZGUub25jZSAmJiBpbmNsdWRlLnJlcXVpcmUgJiYgdGFyZ2V0Py50eXBlID09IFwiLlwiICYmXG4gICAgbGVmdD8udmFsdWUgPT0gXCJfX0RJUl9fXCIgJiYgdGFyZ2V0LnJpZ2h0LmtpbmQgPT0gXCJzdHJpbmdcIlxufVxuXG4vKipcbiAqIEFjY2VwdHMgb25seSBhbiBvcHRpb25hbCBzaW5nbGUgYGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpYCBkaXJlY3RpdmUuXG4gKiBAcGFyYW0ge2ltcG9ydChcInBocC1wYXJzZXJcIikuTm9kZVtdfSBub2RlcyAtIFRvcC1sZXZlbCBQSFAgbm9kZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRGVjbGFyZU5vZGVzKG5vZGVzLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGNvbnN0IGRlY2xhcmF0aW9ucyA9IG5vZGVzLmZpbHRlcigobm9kZSkgPT4gbm9kZS5raW5kID09IFwiZGVjbGFyZVwiKVxuXG4gIGlmIChkZWNsYXJhdGlvbnMubGVuZ3RoID4gMSkge1xuICAgIHVuc3VwcG9ydGVkU3ludGF4KFwicGhwXCIsIFwibXVsdGlwbGUgZGVjbGFyZSBkaXJlY3RpdmVzXCIsIG5vZGVMb2NhdGlvbihkZWNsYXJhdGlvbnNbMV0sIGZpbGVuYW1lLCBzb3VyY2UpKVxuICB9XG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbk5vZGUgb2YgZGVjbGFyYXRpb25zKSB7XG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSAvKiogQHR5cGUge2ltcG9ydChcInBocC1wYXJzZXJcIikuRGVjbGFyZX0gKi8gKGRlY2xhcmF0aW9uTm9kZSlcbiAgICBjb25zdCBkaXJlY3RpdmUgPSBkZWNsYXJhdGlvbi5kaXJlY3RpdmVzWzBdXG4gICAgY29uc3Qga2V5ID0gZGlyZWN0aXZlPy5rZXlcbiAgICBjb25zdCB2YWx1ZSA9IGRpcmVjdGl2ZT8udmFsdWVcbiAgICBjb25zdCBudW1lcmljVmFsdWUgPSB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIiAmJiB2YWx1ZS5raW5kID09IFwibnVtYmVyXCJcbiAgICAgID8gLyoqIEB0eXBlIHtpbXBvcnQoXCJwaHAtcGFyc2VyXCIpLk51bWJlcn0gKi8gKHZhbHVlKVxuICAgICAgOiB1bmRlZmluZWRcbiAgICBjb25zdCB2YWx1ZUlzT25lID0gbnVtZXJpY1ZhbHVlPy5sb2MgJiYgc291cmNlLnNsaWNlKG51bWVyaWNWYWx1ZS5sb2Muc3RhcnQub2Zmc2V0LCBudW1lcmljVmFsdWUubG9jLmVuZC5vZmZzZXQpID09IFwiMVwiXG4gICAgY29uc3QgdmFsaWQgPSBkZWNsYXJhdGlvbi5tb2RlID09IFwibm9uZVwiICYmIGRlY2xhcmF0aW9uLmNoaWxkcmVuLmxlbmd0aCA9PSAwICYmIGRlY2xhcmF0aW9uLmRpcmVjdGl2ZXMubGVuZ3RoID09IDEgJiZcbiAgICAgIGtleS5raW5kID09IFwiaWRlbnRpZmllclwiICYmIGtleS5uYW1lID09IFwic3RyaWN0X3R5cGVzXCIgJiYgdmFsdWVJc09uZVxuXG4gICAgaWYgKCF2YWxpZCkgdW5zdXBwb3J0ZWRTeW50YXgoXCJwaHBcIiwgXCJkZWNsYXJlIG90aGVyIHRoYW4gc3RyaWN0X3R5cGVzPTFcIiwgbm9kZUxvY2F0aW9uKGRlY2xhcmF0aW9uLCBmaWxlbmFtZSwgc291cmNlKSlcbiAgfVxufVxuXG4vKipcbiAqIEludm9rZXMgcGhwLXBhcnNlciBhbmQgbm9ybWFsaXplcyBzeW50YXggZmFpbHVyZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gU291cmNlIHRleHQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwicGhwLXBhcnNlclwiKS5Qcm9ncmFtfSBQSFAgcHJvZ3JhbS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VQaHBQcm9ncmFtKGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlQ29kZShzb3VyY2UsIGZpbGVuYW1lKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBwYXJzZUZhaWx1cmUoXCJwaHBcIiwgZXJyb3IsIHBocFBhcnNlckZhaWx1cmVMb2NhdGlvbihlcnJvciwgZmlsZW5hbWUsIHNvdXJjZSkpXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHBocC1wYXJzZXIncyBvbmUtYmFzZWQgbGluZSBhbmQgemVyby1iYXNlZCBjb2x1bW4gd2hlbiBwcmVzZW50LlxuICogQSBtb2R1bGUgcmFuZ2UgcmVtYWlucyB0aGUgZGV0ZXJtaW5pc3RpYyBmYWxsYmFjayBmb3Igb3BhcXVlIHBhcnNlciBlcnJvcnMuXG4gKiBAcGFyYW0ge3Vua25vd259IGVycm9yIC0gTmF0aXZlIHBhcnNlciBlcnJvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFJlcXVlc3RlZCBzb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBGYWlsdXJlIHJhbmdlLlxuICovXG5mdW5jdGlvbiBwaHBQYXJzZXJGYWlsdXJlTG9jYXRpb24oZXJyb3IsIGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT0gXCJvYmplY3RcIikgcmV0dXJuIG1vZHVsZUxvY2F0aW9uKGZpbGVuYW1lLCBzb3VyY2UpXG4gIGNvbnN0IGxpbmUgPSBSZWZsZWN0LmdldChlcnJvciwgXCJsaW5lTnVtYmVyXCIpXG4gIGNvbnN0IGNvbHVtbiA9IFJlZmxlY3QuZ2V0KGVycm9yLCBcImNvbHVtbk51bWJlclwiKVxuXG4gIGlmICh0eXBlb2YgbGluZSAhPSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihsaW5lKSB8fCBsaW5lIDwgMSB8fFxuICAgIHR5cGVvZiBjb2x1bW4gIT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzU2FmZUludGVnZXIoY29sdW1uKSB8fCBjb2x1bW4gPCAwKSB7XG4gICAgcmV0dXJuIG1vZHVsZUxvY2F0aW9uKGZpbGVuYW1lLCBzb3VyY2UpXG4gIH1cbiAgbGV0IGxpbmVTdGFydCA9IDBcblxuICBmb3IgKGxldCBjdXJyZW50ID0gMTsgY3VycmVudCA8IGxpbmU7IGN1cnJlbnQrKykge1xuICAgIGNvbnN0IG5ld2xpbmUgPSBzb3VyY2UuaW5kZXhPZihcIlxcblwiLCBsaW5lU3RhcnQpXG5cbiAgICBpZiAobmV3bGluZSA8IDApIHJldHVybiBtb2R1bGVMb2NhdGlvbihmaWxlbmFtZSwgc291cmNlKVxuICAgIGxpbmVTdGFydCA9IG5ld2xpbmUgKyAxXG4gIH1cbiAgY29uc3QgbGluZUVuZCA9IHNvdXJjZS5pbmRleE9mKFwiXFxuXCIsIGxpbmVTdGFydClcbiAgY29uc3QgYm91bmRlZEVuZCA9IGxpbmVFbmQgPCAwID8gc291cmNlLmxlbmd0aCA6IGxpbmVFbmRcbiAgY29uc3Qgb2Zmc2V0ID0gTWF0aC5taW4obGluZVN0YXJ0ICsgY29sdW1uLCBib3VuZGVkRW5kKVxuXG4gIHJldHVybiBsb2NhdGlvbkZyb21PZmZzZXRzKGZpbGVuYW1lLCBzb3VyY2UsIG9mZnNldCwgTWF0aC5taW4ob2Zmc2V0ICsgMSwgc291cmNlLmxlbmd0aCkpXG59XG4iXX0=
|