jsii-pacmak 1.41.0 → 1.42.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/lib/targets/dotnet/dotnetdocgenerator.d.ts +3 -3
- package/lib/targets/dotnet/dotnetdocgenerator.js +12 -16
- package/lib/targets/dotnet/dotnetgenerator.js +59 -17
- package/lib/targets/java.d.ts +3 -3
- package/lib/targets/java.js +95 -37
- package/lib/targets/python.d.ts +4 -4
- package/lib/targets/python.js +44 -26
- package/lib/version.d.ts +2 -2
- package/lib/version.js +4 -4
- package/package.json +12 -12
|
@@ -103,7 +103,7 @@ class DotNetGenerator extends generator_1.Generator {
|
|
|
103
103
|
const submodule = (_a = this.assembly.submodules) === null || _a === void 0 ? void 0 : _a[jsiiNs];
|
|
104
104
|
if (submodule) {
|
|
105
105
|
const dotnetNs = this.typeresolver.resolveNamespace(this.assembly, this.assembly.name, jsiiNs);
|
|
106
|
-
this.emitNamespaceDocs(dotnetNs, submodule);
|
|
106
|
+
this.emitNamespaceDocs(dotnetNs, jsiiNs, submodule);
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
onEndNamespace(_ns) {
|
|
@@ -114,7 +114,7 @@ class DotNetGenerator extends generator_1.Generator {
|
|
|
114
114
|
const interfaceName = this.nameutils.convertInterfaceName(ifc);
|
|
115
115
|
const namespace = this.namespaceFor(this.assembly, ifc);
|
|
116
116
|
this.openFileIfNeeded(interfaceName, namespace, this.isNested(ifc));
|
|
117
|
-
this.dotnetDocGenerator.emitDocs(ifc);
|
|
117
|
+
this.dotnetDocGenerator.emitDocs(ifc, { api: 'type', fqn: ifc.fqn });
|
|
118
118
|
this.dotnetRuntimeGenerator.emitAttributesForInterface(ifc);
|
|
119
119
|
if (implementations.length > 0) {
|
|
120
120
|
this.code.openBlock(`public interface ${interfaceName} : ${implementations.join(', ')}`);
|
|
@@ -139,7 +139,11 @@ class DotNetGenerator extends generator_1.Generator {
|
|
|
139
139
|
}
|
|
140
140
|
onInterfaceMethod(ifc, method) {
|
|
141
141
|
var _a;
|
|
142
|
-
this.dotnetDocGenerator.emitDocs(method
|
|
142
|
+
this.dotnetDocGenerator.emitDocs(method, {
|
|
143
|
+
api: 'member',
|
|
144
|
+
fqn: ifc.fqn,
|
|
145
|
+
memberName: method.name,
|
|
146
|
+
});
|
|
143
147
|
this.dotnetRuntimeGenerator.emitAttributesForMethod(ifc, method);
|
|
144
148
|
const returnType = method.returns
|
|
145
149
|
? this.typeresolver.toDotNetType(method.returns.type)
|
|
@@ -161,7 +165,11 @@ class DotNetGenerator extends generator_1.Generator {
|
|
|
161
165
|
throw new Error(`Property ${ifc.name}.${prop.name} is marked as static, but interfaces must not contain static members.`);
|
|
162
166
|
}
|
|
163
167
|
this.emitNewLineIfNecessary();
|
|
164
|
-
this.dotnetDocGenerator.emitDocs(prop
|
|
168
|
+
this.dotnetDocGenerator.emitDocs(prop, {
|
|
169
|
+
api: 'member',
|
|
170
|
+
fqn: ifc.fqn,
|
|
171
|
+
memberName: prop.name,
|
|
172
|
+
});
|
|
165
173
|
this.dotnetRuntimeGenerator.emitAttributesForProperty(prop);
|
|
166
174
|
const propType = this.typeresolver.toDotNetType(prop.type);
|
|
167
175
|
const propName = this.nameutils.convertPropertyName(prop.name);
|
|
@@ -212,7 +220,10 @@ class DotNetGenerator extends generator_1.Generator {
|
|
|
212
220
|
const absPrefix = abstract ? ' abstract' : '';
|
|
213
221
|
this.openFileIfNeeded(className, namespace, nested);
|
|
214
222
|
const implementsExpr = ` : ${baseTypeNames.join(', ')}`;
|
|
215
|
-
this.dotnetDocGenerator.emitDocs(cls
|
|
223
|
+
this.dotnetDocGenerator.emitDocs(cls, {
|
|
224
|
+
api: 'type',
|
|
225
|
+
fqn: cls.fqn,
|
|
226
|
+
});
|
|
216
227
|
this.dotnetRuntimeGenerator.emitAttributesForClass(cls);
|
|
217
228
|
this.code.openBlock(`public${absPrefix} class ${className}${implementsExpr}`);
|
|
218
229
|
// Compute the class parameters
|
|
@@ -220,7 +231,10 @@ class DotNetGenerator extends generator_1.Generator {
|
|
|
220
231
|
let parametersBase = '';
|
|
221
232
|
const initializer = cls.initializer;
|
|
222
233
|
if (initializer) {
|
|
223
|
-
this.dotnetDocGenerator.emitDocs(initializer
|
|
234
|
+
this.dotnetDocGenerator.emitDocs(initializer, {
|
|
235
|
+
api: 'initializer',
|
|
236
|
+
fqn: cls.fqn,
|
|
237
|
+
});
|
|
224
238
|
this.dotnetRuntimeGenerator.emitDeprecatedAttributeIfNecessary(initializer);
|
|
225
239
|
if (initializer.parameters) {
|
|
226
240
|
parametersDefinition = this.renderParametersString(initializer.parameters);
|
|
@@ -302,7 +316,10 @@ class DotNetGenerator extends generator_1.Generator {
|
|
|
302
316
|
const namespace = this.namespaceFor(this.assembly, enm);
|
|
303
317
|
this.openFileIfNeeded(enumName, namespace, this.isNested(enm));
|
|
304
318
|
this.emitNewLineIfNecessary();
|
|
305
|
-
this.dotnetDocGenerator.emitDocs(enm
|
|
319
|
+
this.dotnetDocGenerator.emitDocs(enm, {
|
|
320
|
+
api: 'type',
|
|
321
|
+
fqn: enm.fqn,
|
|
322
|
+
});
|
|
306
323
|
this.dotnetRuntimeGenerator.emitAttributesForEnum(enm, enumName);
|
|
307
324
|
this.code.openBlock(`public enum ${enm.name}`);
|
|
308
325
|
}
|
|
@@ -313,7 +330,11 @@ class DotNetGenerator extends generator_1.Generator {
|
|
|
313
330
|
this.closeFileIfNeeded(enumName, namespace, this.isNested(enm));
|
|
314
331
|
}
|
|
315
332
|
onEnumMember(enm, member) {
|
|
316
|
-
this.dotnetDocGenerator.emitDocs(member
|
|
333
|
+
this.dotnetDocGenerator.emitDocs(member, {
|
|
334
|
+
api: 'member',
|
|
335
|
+
fqn: enm.fqn,
|
|
336
|
+
memberName: member.name,
|
|
337
|
+
});
|
|
317
338
|
const enumMemberName = this.nameutils.convertEnumMemberName(member.name);
|
|
318
339
|
this.dotnetRuntimeGenerator.emitAttributesForEnumMember(enumMemberName, member);
|
|
319
340
|
// If we are on the last enum member, we don't need a comma
|
|
@@ -377,7 +398,11 @@ class DotNetGenerator extends generator_1.Generator {
|
|
|
377
398
|
const methodName = this.nameutils.convertMethodName(method.name);
|
|
378
399
|
const isOptional = method.returns && method.returns.optional ? '?' : '';
|
|
379
400
|
const signature = `${returnType}${isOptional} ${methodName}(${this.renderMethodParameters(method)})`;
|
|
380
|
-
this.dotnetDocGenerator.emitDocs(method
|
|
401
|
+
this.dotnetDocGenerator.emitDocs(method, {
|
|
402
|
+
api: 'member',
|
|
403
|
+
fqn: cls.fqn,
|
|
404
|
+
memberName: method.name,
|
|
405
|
+
});
|
|
381
406
|
this.dotnetRuntimeGenerator.emitAttributesForMethod(cls, method /*, emitForProxyOrDatatype*/);
|
|
382
407
|
if (method.abstract) {
|
|
383
408
|
this.code.line(`${access} ${overrideKeyWord}abstract ${signature};`);
|
|
@@ -472,7 +497,10 @@ class DotNetGenerator extends generator_1.Generator {
|
|
|
472
497
|
const isNested = true;
|
|
473
498
|
this.openFileIfNeeded(name, namespace, isNested);
|
|
474
499
|
this.code.line();
|
|
475
|
-
this.dotnetDocGenerator.emitDocs(ifc
|
|
500
|
+
this.dotnetDocGenerator.emitDocs(ifc, {
|
|
501
|
+
api: 'type',
|
|
502
|
+
fqn: ifc.fqn,
|
|
503
|
+
});
|
|
476
504
|
this.dotnetRuntimeGenerator.emitAttributesForInterfaceProxy(ifc);
|
|
477
505
|
const interfaceFqn = this.typeresolver.toNativeFqn(ifc.fqn);
|
|
478
506
|
const suffix = spec.isInterfaceType(ifc)
|
|
@@ -539,7 +567,10 @@ class DotNetGenerator extends generator_1.Generator {
|
|
|
539
567
|
this.code.line('#pragma warning disable CS8618');
|
|
540
568
|
this.code.line();
|
|
541
569
|
}
|
|
542
|
-
this.dotnetDocGenerator.emitDocs(ifc
|
|
570
|
+
this.dotnetDocGenerator.emitDocs(ifc, {
|
|
571
|
+
api: 'type',
|
|
572
|
+
fqn: ifc.fqn,
|
|
573
|
+
});
|
|
543
574
|
const suffix = `: ${this.typeresolver.toNativeFqn(ifc.fqn)}`;
|
|
544
575
|
this.dotnetRuntimeGenerator.emitAttributesForInterfaceDatatype(ifc);
|
|
545
576
|
this.code.openBlock(`public class ${name} ${suffix}`);
|
|
@@ -638,7 +669,11 @@ class DotNetGenerator extends generator_1.Generator {
|
|
|
638
669
|
const access = this.renderAccessLevel(prop);
|
|
639
670
|
const staticKeyWord = prop.static ? 'static ' : '';
|
|
640
671
|
const propName = this.nameutils.convertPropertyName(prop.name);
|
|
641
|
-
this.dotnetDocGenerator.emitDocs(prop
|
|
672
|
+
this.dotnetDocGenerator.emitDocs(prop, {
|
|
673
|
+
api: 'member',
|
|
674
|
+
fqn: cls.fqn,
|
|
675
|
+
memberName: prop.name,
|
|
676
|
+
});
|
|
642
677
|
if (prop.optional) {
|
|
643
678
|
this.code.line('[JsiiOptional]');
|
|
644
679
|
}
|
|
@@ -708,7 +743,11 @@ class DotNetGenerator extends generator_1.Generator {
|
|
|
708
743
|
this.flagFirstMemberWritten(true);
|
|
709
744
|
const propType = this.typeresolver.toDotNetType(prop.type);
|
|
710
745
|
const isOptional = prop.optional ? '?' : '';
|
|
711
|
-
this.dotnetDocGenerator.emitDocs(prop
|
|
746
|
+
this.dotnetDocGenerator.emitDocs(prop, {
|
|
747
|
+
api: 'member',
|
|
748
|
+
fqn: cls.fqn,
|
|
749
|
+
memberName: prop.name,
|
|
750
|
+
});
|
|
712
751
|
this.dotnetRuntimeGenerator.emitAttributesForProperty(prop);
|
|
713
752
|
const access = this.renderAccessLevel(prop);
|
|
714
753
|
const propName = this.nameutils.convertPropertyName(prop.name);
|
|
@@ -794,7 +833,7 @@ class DotNetGenerator extends generator_1.Generator {
|
|
|
794
833
|
}
|
|
795
834
|
}
|
|
796
835
|
emitAssemblyDocs() {
|
|
797
|
-
this.emitNamespaceDocs(this.assembly.targets.dotnet.namespace, this.assembly);
|
|
836
|
+
this.emitNamespaceDocs(this.assembly.targets.dotnet.namespace, this.assembly.name, this.assembly);
|
|
798
837
|
}
|
|
799
838
|
/**
|
|
800
839
|
* Emit an unused, empty class called `NamespaceDoc` to attach the module README to
|
|
@@ -808,13 +847,16 @@ class DotNetGenerator extends generator_1.Generator {
|
|
|
808
847
|
* In any case, we need a place to attach the docs where they can be transported around,
|
|
809
848
|
* might as well be this method.
|
|
810
849
|
*/
|
|
811
|
-
emitNamespaceDocs(namespace, docSource) {
|
|
850
|
+
emitNamespaceDocs(namespace, jsiiFqn, docSource) {
|
|
812
851
|
if (!docSource.readme) {
|
|
813
852
|
return;
|
|
814
853
|
}
|
|
815
854
|
const className = 'NamespaceDoc';
|
|
816
855
|
this.openFileIfNeeded(className, namespace, false, false);
|
|
817
|
-
this.dotnetDocGenerator.emitMarkdownAsRemarks(docSource.readme.markdown
|
|
856
|
+
this.dotnetDocGenerator.emitMarkdownAsRemarks(docSource.readme.markdown, {
|
|
857
|
+
api: 'moduleReadme',
|
|
858
|
+
moduleFqn: jsiiFqn,
|
|
859
|
+
});
|
|
818
860
|
this.emitHideAttribute();
|
|
819
861
|
// Traditionally this class is made 'internal', but that interacts poorly with DocFX's default filters
|
|
820
862
|
// which aren't overridable. So we make it public, but use attributes to hide it from users' IntelliSense,
|
|
@@ -831,4 +873,4 @@ class DotNetGenerator extends generator_1.Generator {
|
|
|
831
873
|
}
|
|
832
874
|
}
|
|
833
875
|
exports.DotNetGenerator = DotNetGenerator;
|
|
834
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90bmV0Z2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZG90bmV0Z2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFtQztBQUNuQywrQkFBK0I7QUFDL0IsK0JBQStCO0FBRy9CLDZCQUE2QjtBQUU3QiwrQ0FBc0Q7QUFDdEQsNkRBQTBEO0FBQzFELHFFQUFrRTtBQUNsRSw2REFBMEQ7QUFDMUQsbURBQWdEO0FBQ2hELDJDQUE4QztBQUU5Qzs7R0FFRztBQUNILE1BQWEsZUFBZ0IsU0FBUSxxQkFBUztJQVk1QyxZQUNtQixnQ0FBMEMsRUFDMUMsT0FBZ0I7UUFFakMsS0FBSyxFQUFFLENBQUM7UUFIUyxxQ0FBZ0MsR0FBaEMsZ0NBQWdDLENBQVU7UUFDMUMsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQWJuQywyRUFBMkU7UUFDbkUsdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBSWxCLGNBQVMsR0FBb0IsSUFBSSwyQkFBZSxFQUFFLENBQUM7UUFZbEUsb0dBQW9HO1FBQ3BHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsSUFBSTtZQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJLENBQ2YsV0FBbUIsRUFDbkIsUUFBMEI7UUFFMUIsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRLENBQUMsV0FBb0I7UUFDbEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLHVDQUFrQixDQUN4QyxJQUFJLENBQUMsUUFBUSxFQUNiLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxF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QUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixJQUFJLENBQUMsaUJBQWlCLENBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBUSxDQUFDLE1BQU8sQ0FBQyxTQUFTLEVBQ3hDLElBQUksQ0FBQyxRQUFRLENBQ2QsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNLLGlCQUFpQixDQUFDLFNBQWlCLEVBQUUsU0FBMEI7UUFDckUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDckIsT0FBTztTQUNSO1FBRUQsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUUxRCxJQUFJLENBQUMsa0JBQWtCLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixzR0FBc0c7UUFDdEcsMEdBQTBHO1FBQzFHLDRDQUE0QztRQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7T0FFRztJQUNLLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWiwyRkFBMkYsQ0FDNUYsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXpsQ0QsMENBeWxDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHNwZWMgZnJvbSAnQGpzaWkvc3BlYyc7XG5pbXBvcnQgKiBhcyBjbG9uZSBmcm9tICdjbG9uZSc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyByZWZsZWN0IGZyb20gJ2pzaWktcmVmbGVjdCc7XG5pbXBvcnQgeyBSb3NldHRhIH0gZnJvbSAnanNpaS1yb3NldHRhJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IEdlbmVyYXRvciwgTGVnYWxlc2UgfSBmcm9tICcuLi8uLi9nZW5lcmF0b3InO1xuaW1wb3J0IHsgRG90TmV0RG9jR2VuZXJhdG9yIH0gZnJvbSAnLi9kb3RuZXRkb2NnZW5lcmF0b3InO1xuaW1wb3J0IHsgRG90TmV0UnVudGltZUdlbmVyYXRvciB9IGZyb20gJy4vZG90bmV0cnVudGltZWdlbmVyYXRvcic7XG5pbXBvcnQgeyBEb3ROZXRUeXBlUmVzb2x2ZXIgfSBmcm9tICcuL2RvdG5ldHR5cGVyZXNvbHZlcic7XG5pbXBvcnQgeyBGaWxlR2VuZXJhdG9yIH0gZnJvbSAnLi9maWxlZ2VuZXJhdG9yJztcbmltcG9ydCB7IERvdE5ldE5hbWVVdGlscyB9IGZyb20gJy4vbmFtZXV0aWxzJztcblxuLyoqXG4gKiBDT0RFIEdFTkVSQVRPUiBWMlxuICovXG5leHBvcnQgY2xhc3MgRG90TmV0R2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHtcbiAgLy8gRmxhZ3MgdGhhdCB0cmFja3MgaWYgd2UgaGF2ZSBhbHJlYWR5IHdyb3RlIHRoZSBmaXJzdCBtZW1iZXIgb2YgdGhlIGNsYXNzXG4gIHByaXZhdGUgZmlyc3RNZW1iZXJXcml0dGVuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSB0eXBlcmVzb2x2ZXIhOiBEb3ROZXRUeXBlUmVzb2x2ZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBuYW1ldXRpbHM6IERvdE5ldE5hbWVVdGlscyA9IG5ldyBEb3ROZXROYW1lVXRpbHMoKTtcblxuICBwcml2YXRlIGRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IhOiBEb3ROZXRSdW50aW1lR2VuZXJhdG9yO1xuXG4gIHByaXZhdGUgZG90bmV0RG9jR2VuZXJhdG9yITogRG90TmV0RG9jR2VuZXJhdG9yO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFzc2VtYmxpZXNDdXJyZW50bHlCZWluZ0NvbXBpbGVkOiBzdHJpbmdbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvc2V0dGE6IFJvc2V0dGEsXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBPdmVycmlkZSB0aGUgb3BlbkJsb2NrIHRvIGdldCBhIGNvcnJlY3QgQyMgbG9va2luZyBjb2RlIGJsb2NrIHdpdGggdGhlIGN1cmx5IGJyYWNlIGFmdGVyIHRoZSBsaW5lXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICB0aGlzLmxpbmUodGV4dCk7XG4gICAgICB0aGlzLm9wZW4oJ3snKTtcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWQoXG4gICAgcGFja2FnZVJvb3Q6IHN0cmluZyxcbiAgICBhc3NlbWJseTogcmVmbGVjdC5Bc3NlbWJseSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIubG9hZChwYWNrYWdlUm9vdCwgYXNzZW1ibHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIGdlbmVyYXRvciAoaW4tbWVtb3J5KS5cbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZShmaW5nZXJwcmludDogYm9vbGVhbikge1xuICAgIHRoaXMudHlwZXJlc29sdmVyID0gbmV3IERvdE5ldFR5cGVSZXNvbHZlcihcbiAgICAgIHRoaXMuYXNzZW1ibHksXG4gICAgICAoZnFuOiBzdHJpbmcpID0+IHRoaXMuZmluZE1vZHVsZShmcW4pLFxuICAgICAgKGZxbjogc3RyaW5nKSA9PiB0aGlzLmZpbmRUeXBlKGZxbiksXG4gICAgICB0aGlzLmFzc2VtYmxpZXNDdXJyZW50bHlCZWluZ0NvbXBpbGVkLFxuICAgICk7XG5cbiAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IgPSBuZXcgRG90TmV0UnVudGltZUdlbmVyYXRvcihcbiAgICAgIHRoaXMuY29kZSxcbiAgICAgIHRoaXMudHlwZXJlc29sdmVyLFxuICAgICk7XG4gICAgdGhpcy5kb3RuZXREb2NHZW5lcmF0b3IgPSBuZXcgRG90TmV0RG9jR2VuZXJhdG9yKFxuICAgICAgdGhpcy5jb2RlLFxuICAgICAgdGhpcy5yb3NldHRhLFxuICAgICAgdGhpcy5hc3NlbWJseSxcbiAgICApO1xuXG4gICAgdGhpcy5lbWl0QXNzZW1ibHlEb2NzKCk7XG5cbiAgICAvLyBXZSBuZWVkIHRvIHJlc29sdmUgdGhlIGRlcGVuZGVuY3kgdHJlZVxuICAgIHRoaXMudHlwZXJlc29sdmVyLnJlc29sdmVOYW1lc3BhY2VzRGVwZW5kZW5jaWVzKCk7XG4gICAgc3VwZXIuZ2VuZXJhdGUoZmluZ2VycHJpbnQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNhdmUoXG4gICAgb3V0ZGlyOiBzdHJpbmcsXG4gICAgdGFyYmFsbDogc3RyaW5nLFxuICAgIHsgbGljZW5zZSwgbm90aWNlIH06IExlZ2FsZXNlLFxuICApOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgLy8gR2VuZXJhdGluZyB0aGUgY3Nwcm9qIGFuZCBBc3NlbWJseUluZm8uY3MgZmlsZXNcbiAgICBjb25zdCB0YXJiYWxsRmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKHRhcmJhbGwpO1xuICAgIGNvbnN0IGZpbGVnZW4gPSBuZXcgRmlsZUdlbmVyYXRvcihcbiAgICAgIHRoaXMuYXNzZW1ibHksXG4gICAgICB0YXJiYWxsRmlsZU5hbWUsXG4gICAgICB0aGlzLmNvZGUsXG4gICAgKTtcbiAgICBmaWxlZ2VuLmdlbmVyYXRlQXNzZW1ibHlJbmZvRmlsZSgpO1xuICAgIGZpbGVnZW4uZ2VuZXJhdGVQcm9qZWN0RmlsZSh0aGlzLnR5cGVyZXNvbHZlci5uYW1lc3BhY2VEZXBlbmRlbmNpZXMpO1xuICAgIC8vIENhbGxpbmcgc3VwZXIuc2F2ZSgpIGR1bXBzIHRoZSB0YXJiYWxsIGluIHRoZSBmb3JtYXQgbmFtZUB2ZXJzaW9uLmpzaWkudGd6LlxuICAgIC8vIFRoaXMgaXMgbm90IGluIHN5bmMgd2l0aCB0aGUgT2xkIC5ORVQgZ2VuZXJhdG9yIHdoZXJlIHRoZSBuYW1lIGlzIHNjb3BlLW5hbWUtdmVyc2lvbi50Z3ouXG4gICAgLy8gSGVuY2Ugd2UgYXJlIHNhdmluZyB0aGUgZmlsZXMgb3Vyc2VsdmVzIGhlcmU6XG4gICAgY29uc3QgYXNzbSA9IHRoaXMuYXNzZW1ibHk7XG4gICAgY29uc3QgcGFja2FnZUlkOiBzdHJpbmcgPSBhc3NtLnRhcmdldHMhLmRvdG5ldCEucGFja2FnZUlkO1xuICAgIGlmICghcGFja2FnZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgbW9kdWxlICR7YXNzbS5uYW1lfSBkb2VzIG5vdCBoYXZlIGEgZG90bmV0LnBhY2thZ2VJZCBzZXR0aW5nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGF3YWl0IGZzLm1rZGlycChwYXRoLmpvaW4ob3V0ZGlyLCBwYWNrYWdlSWQpKTtcbiAgICBhd2FpdCBmcy5jb3B5RmlsZSh0YXJiYWxsLCBwYXRoLmpvaW4ob3V0ZGlyLCBwYWNrYWdlSWQsIHRhcmJhbGxGaWxlTmFtZSkpO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGFuY2hvciBmaWxlIGZvciB0aGUgY3VycmVudCBtb2RlbFxuICAgIHRoaXMuZ2VuZXJhdGVEZXBlbmRlbmN5QW5jaG9yRmlsZSgpO1xuXG4gICAgaWYgKGxpY2Vuc2UpIHtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4ob3V0ZGlyLCBwYWNrYWdlSWQsICdMSUNFTlNFJyksIGxpY2Vuc2UsIHtcbiAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAobm90aWNlKSB7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKG91dGRpciwgcGFja2FnZUlkLCAnTk9USUNFJyksIG5vdGljZSwge1xuICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU2F2aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS5cbiAgICByZXR1cm4gdGhpcy5jb2RlLnNhdmUob3V0ZGlyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgdGhlIGFuY2hvciBmaWxlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2VuZXJhdGVEZXBlbmRlbmN5QW5jaG9yRmlsZSgpIHtcbiAgICBjb25zdCBuYW1lc3BhY2UgPSBgJHtcbiAgICAgIHRoaXMuYXNzZW1ibHkudGFyZ2V0cyEuZG90bmV0IS5uYW1lc3BhY2VcbiAgICB9LkludGVybmFsLkRlcGVuZGVuY3lSZXNvbHV0aW9uYDtcbiAgICB0aGlzLm9wZW5GaWxlSWZOZWVkZWQoJ0FuY2hvcicsIG5hbWVzcGFjZSwgZmFsc2UsIGZhbHNlKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCdwdWJsaWMgc2VhbGVkIGNsYXNzIEFuY2hvcicpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ3B1YmxpYyBBbmNob3IoKScpO1xuICAgIHRoaXMudHlwZXJlc29sdmVyLm5hbWVzcGFjZURlcGVuZGVuY2llcy5mb3JFYWNoKCh2YWx1ZSkgPT5cbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgbmV3ICR7dmFsdWUubmFtZXNwYWNlfS5JbnRlcm5hbC5EZXBlbmRlbmN5UmVzb2x1dGlvbi5BbmNob3IoKTtgLFxuICAgICAgKSxcbiAgICApO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNsb3NlRmlsZUlmTmVlZGVkKCdBbmNob3InLCBuYW1lc3BhY2UsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3QgdXNlZCBhcyB3ZSBvdmVycmlkZSB0aGUgc2F2ZSgpIG1ldGhvZFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldEFzc2VtYmx5T3V0cHV0RGlyKG1vZDogc3BlYy5Bc3NlbWJseSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubmFtZXV0aWxzLmNvbnZlcnRQYWNrYWdlTmFtZShtb2QubmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogTmFtZXNwYWNlcyBhcmUgaGFuZGxlZCBpbXBsaWNpdGx5IGJ5IG9wZW5GaWxlSWZOZWVkZWQoKS5cbiAgICpcbiAgICogRG8gZ2VuZXJhdGUgZG9jcyBpZiB0aGlzIGlzIGZvciBhIHN1Ym1vZHVsZSB0aG91Z2guXG4gICAqL1xuICBwcm90ZWN0ZWQgb25CZWdpbk5hbWVzcGFjZShqc2lpTnM6IHN0cmluZykge1xuICAgIGNvbnN0IHN1Ym1vZHVsZSA9IHRoaXMuYXNzZW1ibHkuc3VibW9kdWxlcz8uW2pzaWlOc107XG4gICAgaWYgKHN1Ym1vZHVsZSkge1xuICAgICAgY29uc3QgZG90bmV0TnMgPSB0aGlzLnR5cGVyZXNvbHZlci5yZXNvbHZlTmFtZXNwYWNlKFxuICAgICAgICB0aGlzLmFzc2VtYmx5LFxuICAgICAgICB0aGlzLmFzc2VtYmx5Lm5hbWUsXG4gICAgICAgIGpzaWlOcyxcbiAgICAgICk7XG4gICAgICB0aGlzLmVtaXROYW1lc3BhY2VEb2NzKGRvdG5ldE5zLCBzdWJtb2R1bGUpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVuZE5hbWVzcGFjZShfbnM6IHN0cmluZykge1xuICAgIC8qIG5vb3AgKi9cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luSW50ZXJmYWNlKGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlKSB7XG4gICAgY29uc3QgaW1wbGVtZW50YXRpb25zID0gdGhpcy50eXBlcmVzb2x2ZXIucmVzb2x2ZUltcGxlbWVudGVkSW50ZXJmYWNlcyhpZmMpO1xuICAgIGNvbnN0IGludGVyZmFjZU5hbWUgPSB0aGlzLm5hbWV1dGlscy5jb252ZXJ0SW50ZXJmYWNlTmFtZShpZmMpO1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IHRoaXMubmFtZXNwYWNlRm9yKHRoaXMuYXNzZW1ibHksIGlmYyk7XG4gICAgdGhpcy5vcGVuRmlsZUlmTmVlZGVkKGludGVyZmFjZU5hbWUsIG5hbWVzcGFjZSwgdGhpcy5pc05lc3RlZChpZmMpKTtcblxuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXREb2NzKGlmYyk7XG4gICAgdGhpcy5kb3RuZXRSdW50aW1lR2VuZXJhdG9yLmVtaXRBdHRyaWJ1dGVzRm9ySW50ZXJmYWNlKGlmYyk7XG5cbiAgICBpZiAoaW1wbGVtZW50YXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICAgIGBwdWJsaWMgaW50ZXJmYWNlICR7aW50ZXJmYWNlTmFtZX0gOiAke2ltcGxlbWVudGF0aW9ucy5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBwdWJsaWMgaW50ZXJmYWNlICR7aW50ZXJmYWNlTmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy5mbGFnRmlyc3RNZW1iZXJXcml0dGVuKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVuZEludGVyZmFjZShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIC8vIGVtaXQgaW50ZXJmYWNlIHByb3h5IGNsYXNzXG4gICAgdGhpcy5lbWl0SW50ZXJmYWNlUHJveHkoaWZjKTtcblxuICAgIGNvbnN0IGludGVyZmFjZU5hbWUgPSB0aGlzLm5hbWV1dGlscy5jb252ZXJ0SW50ZXJmYWNlTmFtZShpZmMpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgY29uc3QgbmFtZXNwYWNlID0gdGhpcy5uYW1lc3BhY2VGb3IodGhpcy5hc3NlbWJseSwgaWZjKTtcbiAgICB0aGlzLmNsb3NlRmlsZUlmTmVlZGVkKGludGVyZmFjZU5hbWUsIG5hbWVzcGFjZSwgdGhpcy5pc05lc3RlZChpZmMpKTtcblxuICAgIC8vIGVtaXQgaW1wbGVtZW50YXRpb24gY2xhc3NcbiAgICAvLyBUT0RPOiBJZiBkYXRhdHlwZSB0aGVuIHdlIG1heSBub3QgbmVlZCB0aGUgaW50ZXJmYWNlIHByb3h5IHRvIGJlIGNyZWF0ZWQsIFdlIGNvdWxkIGRvIHdpdGgganVzdCB0aGUgaW50ZXJmYWNlIGltcGw/XG4gICAgaWYgKGlmYy5kYXRhdHlwZSkge1xuICAgICAgdGhpcy5lbWl0SW50ZXJmYWNlRGF0YVR5cGUoaWZjKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnRlcmZhY2VNZXRob2QoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsIG1ldGhvZDogc3BlYy5NZXRob2QpIHtcbiAgICB0aGlzLmRvdG5ldERvY0dlbmVyYXRvci5lbWl0RG9jcyhtZXRob2QpO1xuICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5lbWl0QXR0cmlidXRlc0Zvck1ldGhvZChpZmMsIG1ldGhvZCk7XG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IG1ldGhvZC5yZXR1cm5zXG4gICAgICA/IHRoaXMudHlwZXJlc29sdmVyLnRvRG90TmV0VHlwZShtZXRob2QucmV0dXJucy50eXBlKVxuICAgICAgOiAndm9pZCc7XG4gICAgY29uc3QgbnVsbGFibGUgPSBtZXRob2QucmV0dXJucz8ub3B0aW9uYWwgPyAnPycgOiAnJztcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGAke3JldHVyblR5cGV9JHtudWxsYWJsZX0gJHt0aGlzLm5hbWV1dGlscy5jb252ZXJ0TWV0aG9kTmFtZShcbiAgICAgICAgbWV0aG9kLm5hbWUsXG4gICAgICApfSgke3RoaXMucmVuZGVyTWV0aG9kUGFyYW1ldGVycyhtZXRob2QpfSk7YCxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW50ZXJmYWNlTWV0aG9kT3ZlcmxvYWQoXG4gICAgaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsXG4gICAgb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRoaXMub25JbnRlcmZhY2VNZXRob2QoaWZjLCBvdmVybG9hZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnRlcmZhY2VQcm9wZXJ0eShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIGlmICghcHJvcC5hYnN0cmFjdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcmZhY2UgcHJvcGVydGllcyBtdXN0IGJlIGFic3RyYWN0OiAke3Byb3AubmFtZX1gKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcC5wcm90ZWN0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFByb3RlY3RlZCBwcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZCBvbiBpbnRlcmZhY2VzOiAke3Byb3AubmFtZX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcC5zdGF0aWMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFByb3BlcnR5ICR7aWZjLm5hbWV9LiR7cHJvcC5uYW1lfSBpcyBtYXJrZWQgYXMgc3RhdGljLCBidXQgaW50ZXJmYWNlcyBtdXN0IG5vdCBjb250YWluIHN0YXRpYyBtZW1iZXJzLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdE5ld0xpbmVJZk5lY2Vzc2FyeSgpO1xuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXREb2NzKHByb3ApO1xuICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5lbWl0QXR0cmlidXRlc0ZvclByb3BlcnR5KHByb3ApO1xuXG4gICAgY29uc3QgcHJvcFR5cGUgPSB0aGlzLnR5cGVyZXNvbHZlci50b0RvdE5ldFR5cGUocHJvcC50eXBlKTtcbiAgICBjb25zdCBwcm9wTmFtZSA9IHRoaXMubmFtZXV0aWxzLmNvbnZlcnRQcm9wZXJ0eU5hbWUocHJvcC5uYW1lKTtcblxuICAgIGlmIChwcm9wLm9wdGlvbmFsKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgnW0FtYXpvbi5KU0lJLlJ1bnRpbWUuRGVwdXR5LkpzaWlPcHRpb25hbF0nKTtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWZ5aW5nIHRoYXQgYSB0eXBlIGlzIG51bGxhYmxlIGlzIG9ubHkgcmVxdWlyZWQgZm9yIHByaW1pdGl2ZSB2YWx1ZSB0eXBlc1xuICAgIGNvbnN0IGlzT3B0aW9uYWwgPSBwcm9wLm9wdGlvbmFsID8gJz8nIDogJyc7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgJHtwcm9wVHlwZX0ke2lzT3B0aW9uYWx9ICR7cHJvcE5hbWV9YCk7XG5cbiAgICBpZiAocHJvcC5vcHRpb25hbCkge1xuICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jaygnZ2V0Jyk7XG4gICAgICB0aGlzLmNvZGUubGluZSgncmV0dXJuIG51bGw7Jyk7XG4gICAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgICAgaWYgKCFwcm9wLmltbXV0YWJsZSkge1xuICAgICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCdzZXQnKTtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgICAgYHRocm93IG5ldyBTeXN0ZW0uTm90U3VwcG9ydGVkRXhjZXB0aW9uKFwiJ3NldCcgZm9yICcke3Byb3BOYW1lfScgaXMgbm90IGltcGxlbWVudGVkXCIpO2AsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdnZXQ7Jyk7XG4gICAgICBpZiAoIXByb3AuaW1tdXRhYmxlKSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKCdzZXQ7Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmZsYWdGaXJzdE1lbWJlcldyaXR0ZW4odHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkNsYXNzKGNsczogc3BlYy5DbGFzc1R5cGUsIGFic3RyYWN0OiBib29sZWFuKSB7XG4gICAgbGV0IGJhc2VUeXBlTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbmFtZXNwYWNlID0gdGhpcy5uYW1lc3BhY2VGb3IodGhpcy5hc3NlbWJseSwgY2xzKTtcblxuICAgIC8vIEEgY2xhc3MgY2FuIGRlcml2ZSBmcm9tIG9ubHkgb25lIGJhc2UgY2xhc3NcbiAgICAvLyBCdXQgY2FuIGltcGxlbWVudCBtdWx0aXBsZSBpbnRlcmZhY2VzXG4gICAgaWYgKCFjbHMuYmFzZSkge1xuICAgICAgYmFzZVR5cGVOYW1lcy5wdXNoKCdEZXB1dHlCYXNlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNsYXNzQmFzZSA9IHRoaXMudHlwZXJlc29sdmVyLnRvRG90TmV0VHlwZSh7IGZxbjogY2xzLmJhc2UgfSk7XG4gICAgICBiYXNlVHlwZU5hbWVzLnB1c2goY2xhc3NCYXNlKTtcbiAgICB9XG5cbiAgICBpZiAoY2xzLmludGVyZmFjZXMgJiYgY2xzLmludGVyZmFjZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaW1wbGVtZW50YXRpb25zID1cbiAgICAgICAgdGhpcy50eXBlcmVzb2x2ZXIucmVzb2x2ZUltcGxlbWVudGVkSW50ZXJmYWNlcyhjbHMpO1xuICAgICAgYmFzZVR5cGVOYW1lcyA9IGJhc2VUeXBlTmFtZXMuY29uY2F0KGltcGxlbWVudGF0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydENsYXNzTmFtZShjbHMpO1xuXG4gICAgLy8gTmVzdGVkIGNsYXNzZXMgd2lsbCBiZSBkZWFsdCB3aXRoIGR1cmluZyBjYWxjIGNvZGUgZ2VuZXJhdGlvblxuICAgIGNvbnN0IG5lc3RlZCA9IHRoaXMuaXNOZXN0ZWQoY2xzKTtcbiAgICBjb25zdCBhYnNQcmVmaXggPSBhYnN0cmFjdCA/ICcgYWJzdHJhY3QnIDogJyc7XG5cbiAgICB0aGlzLm9wZW5GaWxlSWZOZWVkZWQoY2xhc3NOYW1lLCBuYW1lc3BhY2UsIG5lc3RlZCk7XG5cbiAgICBjb25zdCBpbXBsZW1lbnRzRXhwciA9IGAgOiAke2Jhc2VUeXBlTmFtZXMuam9pbignLCAnKX1gO1xuXG4gICAgdGhpcy5kb3RuZXREb2NHZW5lcmF0b3IuZW1pdERvY3MoY2xzKTtcbiAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdEF0dHJpYnV0ZXNGb3JDbGFzcyhjbHMpO1xuXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwdWJsaWMke2Fic1ByZWZpeH0gY2xhc3MgJHtjbGFzc05hbWV9JHtpbXBsZW1lbnRzRXhwcn1gLFxuICAgICk7XG5cbiAgICAvLyBDb21wdXRlIHRoZSBjbGFzcyBwYXJhbWV0ZXJzXG4gICAgbGV0IHBhcmFtZXRlcnNEZWZpbml0aW9uID0gJyc7XG4gICAgbGV0IHBhcmFtZXRlcnNCYXNlID0gJyc7XG4gICAgY29uc3QgaW5pdGlhbGl6ZXIgPSBjbHMuaW5pdGlhbGl6ZXI7XG4gICAgaWYgKGluaXRpYWxpemVyKSB7XG4gICAgICB0aGlzLmRvdG5ldERvY0dlbmVyYXRvci5lbWl0RG9jcyhpbml0aWFsaXplcik7XG4gICAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdERlcHJlY2F0ZWRBdHRyaWJ1dGVJZk5lY2Vzc2FyeShcbiAgICAgICAgaW5pdGlhbGl6ZXIsXG4gICAgICApO1xuICAgICAgaWYgKGluaXRpYWxpemVyLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgcGFyYW1ldGVyc0RlZmluaXRpb24gPSB0aGlzLnJlbmRlclBhcmFtZXRlcnNTdHJpbmcoXG4gICAgICAgICAgaW5pdGlhbGl6ZXIucGFyYW1ldGVycyxcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIGluaXRpYWxpemVyLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICBwYXJhbWV0ZXJzQmFzZSArPSBgJHt0aGlzLm5hbWV1dGlscy5jb252ZXJ0UGFyYW1ldGVyTmFtZShwLm5hbWUpfWA7XG4gICAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgdGhlIGxhc3QgcGFyYW1ldGVyLCBhcHBlbmQgLFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGluaXRpYWxpemVyLnBhcmFtZXRlcnMuaW5kZXhPZihwKSAhPT1cbiAgICAgICAgICAgIGluaXRpYWxpemVyLnBhcmFtZXRlcnMubGVuZ3RoIC0gMVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcGFyYW1ldGVyc0Jhc2UgKz0gJywgJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHRoZSBjb25zdHJ1Y3RvcnM6XG4gICAgICAvLyBBYnN0cmFjdCBjbGFzc2VzIGhhdmUgcHJvdGVjdGVkIGNvbnN0cnVjdG9ycy5cbiAgICAgIGNvbnN0IHZpc2liaWxpdHkgPSBjbHMuYWJzdHJhY3QgPyAncHJvdGVjdGVkJyA6ICdwdWJsaWMnO1xuXG4gICAgICBjb25zdCBhcmdzID1cbiAgICAgICAgcGFyYW1ldGVyc0Jhc2UubGVuZ3RoID4gMFxuICAgICAgICAgID8gYG5ldyBvYmplY3Q/W117JHtwYXJhbWV0ZXJzQmFzZX19YFxuICAgICAgICAgIDogYFN5c3RlbS5BcnJheS5FbXB0eTxvYmplY3Q/PigpYDtcbiAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICAgIGAke3Zpc2liaWxpdHl9ICR7Y2xhc3NOYW1lfSgke3BhcmFtZXRlcnNEZWZpbml0aW9ufSk6IGJhc2UobmV3IERlcHV0eVByb3BzKCR7YXJnc30pKWAsXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnLy8vIDxzdW1tYXJ5PlVzZWQgYnkganNpaSB0byBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIGEgSmF2YXNjcmlwdC1vd25lZCBvYmplY3QgcmVmZXJlbmNlPC9zdW1tYXJ5PicsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICcvLy8gPHBhcmFtIG5hbWU9XCJyZWZlcmVuY2VcIj5UaGUgSmF2YXNjcmlwdC1vd25lZCBvYmplY3QgcmVmZXJlbmNlPC9wYXJhbT4nLFxuICAgICk7XG4gICAgdGhpcy5kb3RuZXRSdW50aW1lR2VuZXJhdG9yLmVtaXREZXByZWNhdGVkQXR0cmlidXRlSWZOZWNlc3NhcnkoaW5pdGlhbGl6ZXIpO1xuICAgIHRoaXMuZW1pdEhpZGVBdHRyaWJ1dGUoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHByb3RlY3RlZCAke2NsYXNzTmFtZX0oQnlSZWZWYWx1ZSByZWZlcmVuY2UpOiBiYXNlKHJlZmVyZW5jZSlgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnLy8vIDxzdW1tYXJ5PlVzZWQgYnkganNpaSB0byBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIERlcHV0eVByb3BzPC9zdW1tYXJ5PicsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnLy8vIDxwYXJhbSBuYW1lPVwicHJvcHNcIj5UaGUgZGVwdXR5IHByb3BzPC9wYXJhbT4nKTtcbiAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdERlcHJlY2F0ZWRBdHRyaWJ1dGVJZk5lY2Vzc2FyeShpbml0aWFsaXplcik7XG4gICAgdGhpcy5lbWl0SGlkZUF0dHJpYnV0ZSgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJvdGVjdGVkICR7Y2xhc3NOYW1lfShEZXB1dHlQcm9wcyBwcm9wcyk6IGJhc2UocHJvcHMpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICAvLyBXZSBoYXZlIGFscmVhZHkgb3V0cHV0dGVkIG1lbWJlcnMgKGNvbnN0cnVjdG9ycyksIHNldHRpbmcgdGhlIGZsYWcgdG8gdHJ1ZVxuICAgIHRoaXMuZmxhZ0ZpcnN0TWVtYmVyV3JpdHRlbih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVuZENsYXNzKGNsczogc3BlYy5DbGFzc1R5cGUpIHtcbiAgICBpZiAoY2xzLmFic3RyYWN0KSB7XG4gICAgICB0aGlzLmVtaXRJbnRlcmZhY2VQcm94eShjbHMpO1xuICAgIH1cblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydENsYXNzTmFtZShjbHMpO1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IHRoaXMubmFtZXNwYWNlRm9yKHRoaXMuYXNzZW1ibHksIGNscyk7XG4gICAgdGhpcy5jbG9zZUZpbGVJZk5lZWRlZChjbGFzc05hbWUsIG5hbWVzcGFjZSwgdGhpcy5pc05lc3RlZChjbHMpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkZpZWxkKFxuICAgIF9jbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIF9wcm9wOiBzcGVjLlByb3BlcnR5LFxuICAgIF91bmlvbj86IHNwZWMuVW5pb25UeXBlUmVmZXJlbmNlLFxuICApIHtcbiAgICAvKiBub29wICovXG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZXRob2QoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIHRoaXMuZW1pdE1ldGhvZChjbHMsIG1ldGhvZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZXRob2RPdmVybG9hZChcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIG92ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aGlzLm9uTWV0aG9kKGNscywgb3ZlcmxvYWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUHJvcGVydHkoY2xzOiBzcGVjLkNsYXNzVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIHRoaXMuZW1pdFByb3BlcnR5KGNscywgcHJvcCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNNZXRob2QoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIHRoaXMuZW1pdE1ldGhvZChjbHMsIG1ldGhvZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNNZXRob2RPdmVybG9hZChcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIG92ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aGlzLmVtaXRNZXRob2QoY2xzLCBvdmVybG9hZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNQcm9wZXJ0eShjbHM6IHNwZWMuQ2xhc3NUeXBlLCBwcm9wOiBzcGVjLlByb3BlcnR5KSB7XG4gICAgaWYgKHByb3AuY29uc3QpIHtcbiAgICAgIHRoaXMuZW1pdENvbnN0UHJvcGVydHkoY2xzLCBwcm9wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0UHJvcGVydHkoY2xzLCBwcm9wKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25VbmlvblByb3BlcnR5KFxuICAgIGNsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgcHJvcDogc3BlYy5Qcm9wZXJ0eSxcbiAgICBfdW5pb246IHNwZWMuVW5pb25UeXBlUmVmZXJlbmNlLFxuICApIHtcbiAgICB0aGlzLmVtaXRQcm9wZXJ0eShjbHMsIHByb3ApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5FbnVtKGVubTogc3BlYy5FbnVtVHlwZSkge1xuICAgIGNvbnN0IGVudW1OYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydFR5cGVOYW1lKGVubS5uYW1lKTtcbiAgICBjb25zdCBuYW1lc3BhY2UgPSB0aGlzLm5hbWVzcGFjZUZvcih0aGlzLmFzc2VtYmx5LCBlbm0pO1xuICAgIHRoaXMub3BlbkZpbGVJZk5lZWRlZChlbnVtTmFtZSwgbmFtZXNwYWNlLCB0aGlzLmlzTmVzdGVkKGVubSkpO1xuICAgIHRoaXMuZW1pdE5ld0xpbmVJZk5lY2Vzc2FyeSgpO1xuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXREb2NzKGVubSk7XG4gICAgdGhpcy5kb3RuZXRSdW50aW1lR2VuZXJhdG9yLmVtaXRBdHRyaWJ1dGVzRm9yRW51bShlbm0sIGVudW1OYW1lKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBwdWJsaWMgZW51bSAke2VubS5uYW1lfWApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kRW51bShlbm06IHNwZWMuRW51bVR5cGUpIHtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIGNvbnN0IGVudW1OYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydFR5cGVOYW1lKGVubS5uYW1lKTtcbiAgICBjb25zdCBuYW1lc3BhY2UgPSB0aGlzLm5hbWVzcGFjZUZvcih0aGlzLmFzc2VtYmx5LCBlbm0pO1xuICAgIHRoaXMuY2xvc2VGaWxlSWZOZWVkZWQoZW51bU5hbWUsIG5hbWVzcGFjZSwgdGhpcy5pc05lc3RlZChlbm0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVudW1NZW1iZXIoZW5tOiBzcGVjLkVudW1UeXBlLCBtZW1iZXI6IHNwZWMuRW51bU1lbWJlcikge1xuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXREb2NzKG1lbWJlcik7XG4gICAgY29uc3QgZW51bU1lbWJlck5hbWUgPSB0aGlzLm5hbWV1dGlscy5jb252ZXJ0RW51bU1lbWJlck5hbWUobWVtYmVyLm5hbWUpO1xuICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5lbWl0QXR0cmlidXRlc0ZvckVudW1NZW1iZXIoXG4gICAgICBlbnVtTWVtYmVyTmFtZSxcbiAgICAgIG1lbWJlcixcbiAgICApO1xuICAgIC8vIElmIHdlIGFyZSBvbiB0aGUgbGFzdCBlbnVtIG1lbWJlciwgd2UgZG9uJ3QgbmVlZCBhIGNvbW1hXG4gICAgaWYgKGVubS5tZW1iZXJzLmluZGV4T2YobWVtYmVyKSAhPT0gZW5tLm1lbWJlcnMubGVuZ3RoIC0gMSkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYCR7ZW51bU1lbWJlck5hbWV9LGApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvZGUubGluZShgJHtlbnVtTWVtYmVyTmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5hbWVzcGFjZUZvcihhc3NtOiBzcGVjLkFzc2VtYmx5LCB0eXBlOiBzcGVjLlR5cGUpOiBzdHJpbmcge1xuICAgIGxldCBucyA9IHR5cGUubmFtZXNwYWNlO1xuICAgIHdoaWxlIChucyAhPSBudWxsICYmIGFzc20udHlwZXM/LltgJHthc3NtLm5hbWV9LiR7bnN9YF0gIT0gbnVsbCkge1xuICAgICAgY29uc3QgbmVzdGluZyA9IGFzc20udHlwZXNbYCR7YXNzbS5uYW1lfS4ke25zfWBdO1xuICAgICAgbnMgPSBuZXN0aW5nLm5hbWVzcGFjZTtcbiAgICB9XG4gICAgaWYgKG5zICE9IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLnR5cGVyZXNvbHZlci5yZXNvbHZlTmFtZXNwYWNlKGFzc20sIGFzc20ubmFtZSwgbnMpO1xuICAgIH1cbiAgICByZXR1cm4gYXNzbS50YXJnZXRzIS5kb3RuZXQhLm5hbWVzcGFjZTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdE1ldGhvZChcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlIHwgc3BlYy5JbnRlcmZhY2VUeXBlLFxuICAgIG1ldGhvZDogc3BlYy5NZXRob2QsXG4gICAgZW1pdEZvclByb3h5T3JEYXRhdHlwZSA9IGZhbHNlLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmVtaXROZXdMaW5lSWZOZWNlc3NhcnkoKTtcbiAgICBjb25zdCByZXR1cm5UeXBlID0gbWV0aG9kLnJldHVybnNcbiAgICAgID8gdGhpcy50eXBlcmVzb2x2ZXIudG9Eb3ROZXRUeXBlKG1ldGhvZC5yZXR1cm5zLnR5cGUpXG4gICAgICA6ICd2b2lkJztcbiAgICBjb25zdCBzdGF0aWNLZXlXb3JkID0gbWV0aG9kLnN0YXRpYyA/ICdzdGF0aWMgJyA6ICcnO1xuICAgIGxldCBvdmVycmlkZUtleVdvcmQgPSAnJztcbiAgICBsZXQgdmlydHVhbEtleVdvcmQgPSAnJztcblxuICAgIGxldCBkZWZpbmVkT25BbmNlc3RvciA9IGZhbHNlO1xuICAgIC8vIEluIHRoZSBjYXNlIG9mIHRoZSBzb3VyY2UgYmVpbmcgYSBjbGFzcywgd2UgY2hlY2sgaWYgaXQgaXMgYWxyZWFkeSBkZWZpbmVkIG9uIGFuIGFuY2VzdG9yXG4gICAgaWYgKHNwZWMuaXNDbGFzc1R5cGUoY2xzKSkge1xuICAgICAgZGVmaW5lZE9uQW5jZXN0b3IgPSB0aGlzLmlzTWVtYmVyRGVmaW5lZE9uQW5jZXN0b3IoY2xzLCBtZXRob2QpO1xuICAgIH1cbiAgICAvLyBUaGUgbWV0aG9kIGlzIGFuIG92ZXJyaWRlIGlmIGl0J3MgZGVmaW5lZCBvbiB0aGUgYW5jZXN0b3IsIG9yIGlmIHRoZSBwYXJlbnQgaXMgYSBjbGFzcyBhbmQgd2UgYXJlIGdlbmVyYXRpbmcgYSBwcm94eSBvciBkYXRhdHlwZSBjbGFzc1xuICAgIGxldCBvdmVycmlkZXMgPVxuICAgICAgZGVmaW5lZE9uQW5jZXN0b3IgfHwgKHNwZWMuaXNDbGFzc1R5cGUoY2xzKSAmJiBlbWl0Rm9yUHJveHlPckRhdGF0eXBlKTtcbiAgICAvLyBXZSBhbHNvIGluc3BlY3QgdGhlIGpzaWkgbW9kZWwgdG8gc2VlIGlmIGl0IG92ZXJyaWRlcyBhIGNsYXNzIG1lbWJlci5cbiAgICBpZiAobWV0aG9kLm92ZXJyaWRlcykge1xuICAgICAgY29uc3Qgb3ZlcnJpZGVUeXBlID0gdGhpcy5maW5kVHlwZShtZXRob2Qub3ZlcnJpZGVzKTtcbiAgICAgIGlmIChzcGVjLmlzQ2xhc3NUeXBlKG92ZXJyaWRlVHlwZSkpIHtcbiAgICAgICAgLy8gT3ZlcnJpZGVzIGEgY2xhc3MsIG5lZWRzIG92ZXJyaWRlcyBrZXl3b3JkXG4gICAgICAgIG92ZXJyaWRlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvdmVycmlkZXMpIHtcbiAgICAgIC8vIEFkZCB0aGUgb3ZlcnJpZGUga2V5IHdvcmQgaWYgdGhlIG1ldGhvZCBpcyBlbWl0dGVkIGZvciBhIHByb3h5IG9yIGRhdGEgdHlwZSBvciBpcyBkZWZpbmVkIG9uIGFuIGFuY2VzdG9yLiBJZlxuICAgICAgLy8gdGhlIG1lbWJlciBpcyBzdGF0aWMsIHVzZSB0aGUgXCJuZXdcIiBrZXl3b3JkIGluc3RlYWQsIHRvIGluZGljYXRlIHdlIGFyZSBpbnRlbnRpb25hbGx5IGhpZGluZyB0aGUgYW5jZXN0b3JcbiAgICAgIC8vIGRlY2xhcmF0aW9uIChhcyBDIyBkb2VzIG5vdCBpbmhlcml0IHN0YXRpY3MsIHRoZXkgY2FuIGJlIGhpZGRlbiBidXQgbm90IG92ZXJyaWRkZW4pLiBUaGUgXCJuZXdcIiBrZXl3b3JkIGlzXG4gICAgICAvLyBvcHRpb25hbCBpbiB0aGlzIGNvbnRleHQsIGJ1dCBoZWxwcyBjbGFyaWZ5IGludGVudGlvbi5cbiAgICAgIG92ZXJyaWRlS2V5V29yZCA9IG1ldGhvZC5zdGF0aWMgPyAnbmV3ICcgOiAnb3ZlcnJpZGUgJztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgIW1ldGhvZC5zdGF0aWMgJiZcbiAgICAgIChtZXRob2QuYWJzdHJhY3QgfHwgIWRlZmluZWRPbkFuY2VzdG9yKSAmJlxuICAgICAgIWVtaXRGb3JQcm94eU9yRGF0YXR5cGVcbiAgICApIHtcbiAgICAgIC8vIEFkZCB0aGUgdmlydHVhbCBrZXkgd29yZCBpZiB0aGUgbWV0aG9kIGlzIGFic3RyYWN0IG9yIG5vdCBkZWZpbmVkIG9uIGFuIGFuY2VzdG9yIGFuZCB3ZSBhcmUgTk9UIGdlbmVyYXRpbmcgYSBwcm94eSBvciBkYXRhdHlwZSBjbGFzc1xuICAgICAgLy8gTWV0aG9kcyBzaG91bGQgYWx3YXlzIGJlIHZpcnR1YWwgd2hlbiBwb3NzaWJsZVxuICAgICAgdmlydHVhbEtleVdvcmQgPSAndmlydHVhbCAnO1xuICAgIH1cblxuICAgIGNvbnN0IGFjY2VzcyA9IHRoaXMucmVuZGVyQWNjZXNzTGV2ZWwobWV0aG9kKTtcbiAgICBjb25zdCBtZXRob2ROYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydE1ldGhvZE5hbWUobWV0aG9kLm5hbWUpO1xuXG4gICAgY29uc3QgaXNPcHRpb25hbCA9IG1ldGhvZC5yZXR1cm5zICYmIG1ldGhvZC5yZXR1cm5zLm9wdGlvbmFsID8gJz8nIDogJyc7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gYCR7cmV0dXJuVHlwZX0ke2lzT3B0aW9uYWx9ICR7bWV0aG9kTmFtZX0oJHt0aGlzLnJlbmRlck1ldGhvZFBhcmFtZXRlcnMoXG4gICAgICBtZXRob2QsXG4gICAgKX0pYDtcblxuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXREb2NzKG1ldGhvZCk7XG4gICAgdGhpcy5kb3RuZXRSdW50aW1lR2VuZXJhdG9yLmVtaXRBdHRyaWJ1dGVzRm9yTWV0aG9kKFxuICAgICAgY2xzLFxuICAgICAgbWV0aG9kIC8qLCBlbWl0Rm9yUHJveHlPckRhdGF0eXBlKi8sXG4gICAgKTtcblxuICAgIGlmIChtZXRob2QuYWJzdHJhY3QpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKGAke2FjY2Vzc30gJHtvdmVycmlkZUtleVdvcmR9YWJzdHJhY3QgJHtzaWduYXR1cmV9O2ApO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgICAgYCR7YWNjZXNzfSAke3N0YXRpY0tleVdvcmR9JHtvdmVycmlkZUtleVdvcmR9JHt2aXJ0dWFsS2V5V29yZH0ke3NpZ25hdHVyZX1gLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuY3JlYXRlSW52b2tlTWV0aG9kSWRlbnRpZmllcihcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgY2xzIGFzIHNwZWMuQ2xhc3NUeXBlLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvdW5kcyBvdXQgaWYgYSBtZW1iZXIgKHByb3BlcnR5IG9yIG1ldGhvZCkgaXMgYWxyZWFkeSBkZWZpbmVkIGluIG9uZSBvZiB0aGUgYmFzZSBjbGFzc2VzXG4gICAqXG4gICAqIFVzZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgb3ZlcnJpZGUgb3IgdmlydHVhbCBrZXl3b3JkcyBhcmUgbmVjZXNzYXJ5LlxuICAgKi9cbiAgcHJpdmF0ZSBpc01lbWJlckRlZmluZWRPbkFuY2VzdG9yKFxuICAgIGNsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgbWVtYmVyOiBzcGVjLlByb3BlcnR5IHwgc3BlYy5NZXRob2QsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChtZW1iZXIgYXMgc3BlYy5NZXRob2QpIHtcbiAgICAgIGNvbnN0IG9iamVjdE1ldGhvZHMgPSBbJ1RvU3RyaW5nJywgJ0dldEhhc2hDb2RlJywgJ0VxdWFscyddO1xuICAgICAgLy8gTWV0aG9kcyBkZWZpbmVkIG9uIHRoZSBPYmplY3QgY2xhc3Mgc2hvdWxkIGJlIG92ZXJyaWRkZW4sIHJldHVybiB0cnVlO1xuICAgICAgaWYgKFxuICAgICAgICBvYmplY3RNZXRob2RzLmluY2x1ZGVzKHRoaXMubmFtZXV0aWxzLmNvbnZlcnRNZXRob2ROYW1lKG1lbWJlci5uYW1lKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBiYXNlID0gY2xzLmJhc2U7XG4gICAgaWYgKGJhc2UpIHtcbiAgICAgIGNvbnN0IGJhc2VUeXBlID0gdGhpcy5maW5kVHlwZShiYXNlKSBhcyBzcGVjLkNsYXNzVHlwZTtcblxuICAgICAgaWYgKG1lbWJlciBhcyBzcGVjLlByb3BlcnR5KSB7XG4gICAgICAgIGlmIChiYXNlVHlwZS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgYmFzZVR5cGUucHJvcGVydGllcy5maWx0ZXIoXG4gICAgICAgICAgICAgIChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSA9PT0gbWVtYmVyLm5hbWUsXG4gICAgICAgICAgICApLmxlbmd0aCA+IDBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIHByb3BlcnR5IGZvdW5kIGluIGJhc2UgcGFyZW50XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNNZW1iZXJEZWZpbmVkT25BbmNlc3RvcihiYXNlVHlwZSwgbWVtYmVyKTtcbiAgICAgIH0gZWxzZSBpZiAobWVtYmVyIGFzIHNwZWMuTWV0aG9kKSB7XG4gICAgICAgIGlmIChiYXNlVHlwZS5tZXRob2RzKSB7XG4gICAgICAgICAgY29uc3QgbXlNZXRob2QgPSBtZW1iZXIgYXMgc3BlYy5NZXRob2Q7XG4gICAgICAgICAgLy8gSWYgdGhlIG5hbWUsIHBhcmFtZXRlcnMgYW5kIHJldHVybnMgYXJlIHNpbWlsYXIgdGhlbiBpdCBpcyB0aGUgc2FtZSBtZXRob2QgaW4gLk5FVFxuICAgICAgICAgIGZvciAoY29uc3QgbSBvZiBiYXNlVHlwZS5tZXRob2RzKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG0ubmFtZSA9PT0gbXlNZXRob2QubmFtZSAmJlxuICAgICAgICAgICAgICBtLnBhcmFtZXRlcnMgPT09IG15TWV0aG9kLnBhcmFtZXRlcnMgJiZcbiAgICAgICAgICAgICAgbS5yZXR1cm5zID09PSBteU1ldGhvZC5yZXR1cm5zXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmlzTWVtYmVyRGVmaW5lZE9uQW5jZXN0b3IoYmFzZVR5cGUsIG1lbWJlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIG1ldGhvZCBwYXJhbWV0ZXJzIHN0cmluZ1xuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJNZXRob2RQYXJhbWV0ZXJzKG1ldGhvZDogc3BlYy5NZXRob2QpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlbmRlclBhcmFtZXRlcnNTdHJpbmcobWV0aG9kLnBhcmFtZXRlcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgcGFyYW1ldGVycyBzdHJpbmcgZm9yIG1ldGhvZHMgb3IgY29uc3RydWN0b3JzXG4gICAqL1xuICBwcml2YXRlIHJlbmRlclBhcmFtZXRlcnNTdHJpbmcoXG4gICAgcGFyYW1ldGVyczogc3BlYy5QYXJhbWV0ZXJbXSB8IHVuZGVmaW5lZCxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJhbXMgPSBbXTtcbiAgICBpZiAocGFyYW1ldGVycykge1xuICAgICAgZm9yIChjb25zdCBwIG9mIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgbGV0IG9wdGlvbmFsUHJpbWl0aXZlID0gJyc7XG4gICAgICAgIGxldCBvcHRpb25hbEtleXdvcmQgPSAnJztcbiAgICAgICAgbGV0IHR5cGUgPSB0aGlzLnR5cGVyZXNvbHZlci50b0RvdE5ldFR5cGUocC50eXBlKTtcbiAgICAgICAgaWYgKHAub3B0aW9uYWwpIHtcbiAgICAgICAgICBvcHRpb25hbEtleXdvcmQgPSAnID0gbnVsbCc7XG4gICAgICAgICAgaWYgKHAub3B0aW9uYWwpIHtcbiAgICAgICAgICAgIG9wdGlvbmFsUHJpbWl0aXZlID0gJz8nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwLnZhcmlhZGljKSB7XG4gICAgICAgICAgdHlwZSA9IGBwYXJhbXMgJHt0eXBlfVtdYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdCA9IGAke3R5cGV9JHtvcHRpb25hbFByaW1pdGl2ZX0gJHt0aGlzLm5hbWV1dGlscy5jb252ZXJ0UGFyYW1ldGVyTmFtZShcbiAgICAgICAgICBwLm5hbWUsXG4gICAgICAgICl9JHtvcHRpb25hbEtleXdvcmR9YDtcbiAgICAgICAgcGFyYW1zLnB1c2goc3QpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zLmpvaW4oJywgJyk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgYW4gaW50ZXJmYWNlIHByb3h5IGZvciBhbiBpbnRlcmZhY2Ugb3IgYW4gYWJzdHJhY3QgY2xhc3MuXG4gICAqL1xuICBwcml2YXRlIGVtaXRJbnRlcmZhY2VQcm94eShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSB8IHNwZWMuQ2xhc3NUeXBlKTogdm9pZCB7XG4gICAgY29uc3QgbmFtZSA9ICdfUHJveHknO1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IHRoaXMubmFtZXNwYWNlRm9yKHRoaXMuYXNzZW1ibHksIGlmYyk7XG4gICAgY29uc3QgaXNOZXN0ZWQgPSB0cnVlO1xuICAgIHRoaXMub3BlbkZpbGVJZk5lZWRlZChuYW1lLCBuYW1lc3BhY2UsIGlzTmVzdGVkKTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5kb3RuZXREb2NHZW5lcmF0b3IuZW1pdERvY3MoaWZjKTtcbiAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdEF0dHJpYnV0ZXNGb3JJbnRlcmZhY2VQcm94eShpZmMpO1xuXG4gICAgY29uc3QgaW50ZXJmYWNlRnFuID0gdGhpcy50eXBlcmVzb2x2ZXIudG9OYXRpdmVGcW4oaWZjLmZxbik7XG4gICAgY29uc3Qgc3VmZml4ID0gc3BlYy5pc0ludGVyZmFjZVR5cGUoaWZjKVxuICAgICAgPyBgOiBEZXB1dHlCYXNlLCAke2ludGVyZmFjZUZxbn1gXG4gICAgICA6IGA6ICR7aW50ZXJmYWNlRnFufWA7XG4gICAgY29uc3QgbmV3TW9kaWZpZXIgPSB0aGlzLnByb3h5TXVzdFVzZU5ld01vZGlmaWVyKGlmYykgPyAnbmV3ICcgOiAnJztcblxuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgJHtuZXdNb2RpZmllcn1pbnRlcm5hbCBzZWFsZWQgY2xhc3MgJHtuYW1lfSAke3N1ZmZpeH1gLFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIHByaXZhdGUgY29uc3RydWN0b3JcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHByaXZhdGUgJHtuYW1lfShCeVJlZlZhbHVlIHJlZmVyZW5jZSk6IGJhc2UocmVmZXJlbmNlKWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgLy8gV2UgaGF2ZSBhbHJlYWR5IG91dHB1dCBhIG1lbWJlciAoY29uc3RydWN0b3IpLCBzZXR0aW5nIHRoZSBmaXJzdCBtZW1iZXIgZmxhZyB0byB0cnVlXG4gICAgdGhpcy5mbGFnRmlyc3RNZW1iZXJXcml0dGVuKHRydWUpO1xuXG4gICAgY29uc3QgZGF0YXR5cGUgPSBmYWxzZTtcbiAgICBjb25zdCBwcm94eSA9IHRydWU7XG4gICAgdGhpcy5lbWl0SW50ZXJmYWNlTWVtYmVyc0ZvclByb3h5T3JEYXRhdHlwZShpZmMsIGRhdGF0eXBlLCBwcm94eSk7XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY2xvc2VGaWxlSWZOZWVkZWQobmFtZSwgbmFtZXNwYWNlLCBpc05lc3RlZCk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFueSBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gdHlwZSBtdXN0IHVzZSB0aGUgYG5ld2BcbiAgICogbW9kaWZpZXIgd2hlbiBpbnRyb2R1Y2luZyBpdCdzIG93biBwcm94eS5cbiAgICpcbiAgICogSWYgdGhlIHR5cGUgaXMgYSBgY2xhc3NgLCB0aGVuIGl0IG11c3QgdXNlIGBuZXdgIGlmIGl0IGV4dGVuZHMgYW5vdGhlclxuICAgKiBhYnN0cmFjdCBjbGFzcyBkZWZpbmVkIGluIHRoZSBzYW1lIGFzc2VtYmx5IChzaW5jZSBwcm94aWVzIGFyZSBpbnRlcm5hbCxcbiAgICogZXh0ZXJuYWwgdHlwZXMnIHByb3hpZXMgYXJlIG5vdCB2aXNpYmxlIGluIHRoYXQgY29udGV4dCkuXG4gICAqXG4gICAqIElmIHRoZSB0eXBlIGlzIGFuIGBpbnRlcmZhY2VgLCB0aGVuIGl0IG11c3QgdXNlIGBuZXdgIGlmIGl0IGV4dGVuZHMgYW5vdGhlclxuICAgKiBpbnRlcmZhY2UgZnJvbSB0aGUgc2FtZSBhc3NlbWJseS5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgdGhlIHRlc3RlZCBwcm94eS1hYmxlIHR5cGUgKGFuIGFic3RyYWN0IGNsYXNzIG9yIGFuIGludGVyZmFjZSkuXG4gICAqXG4gICAqIEByZXR1cm5zIHRydWUgaWYgYW55IGFuY2VzdG9yIG9mIHRoaXMgdHlwZSBoYXMgYSB2aXNpYmxlIHByb3h5LlxuICAgKi9cbiAgcHJpdmF0ZSBwcm94eU11c3RVc2VOZXdNb2RpZmllcihcbiAgICB0eXBlOiBzcGVjLkNsYXNzVHlwZSB8IHNwZWMuSW50ZXJmYWNlVHlwZSxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKHNwZWMuaXNDbGFzc1R5cGUodHlwZSkpIHtcbiAgICAgIGlmICh0eXBlLmJhc2UgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLmZpbmRUeXBlKHR5cGUuYmFzZSkgYXMgc3BlYy5DbGFzc1R5cGU7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBiYXNlLmFzc2VtYmx5ID09PSB0eXBlLmFzc2VtYmx5ICYmXG4gICAgICAgIChiYXNlLmFic3RyYWN0XG4gICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgOiAvLyBBbiBhYnN0cmFjdCBjbGFzcyBjb3VsZCBleHRlbmQgYSBjb25jcmV0ZSBjbGFzcy4uLiBXZSBtdXN0IHdhbGsgdXAgdGhlIGluaGVyaXRhbmNlIHRyZWUgaW4gdGhpcyBjYXNlLi4uXG4gICAgICAgICAgICB0aGlzLnByb3h5TXVzdFVzZU5ld01vZGlmaWVyKGJhc2UpKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgdHlwZS5pbnRlcmZhY2VzPy5maW5kKFxuICAgICAgICAoZnFuKSA9PiB0aGlzLmZpbmRUeXBlKGZxbikuYXNzZW1ibHkgPT09IHR5cGUuYXNzZW1ibHksXG4gICAgICApICE9IG51bGxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIEludGVyZmFjZSBEYXRhdHlwZSBjbGFzc1xuICAgKlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gZW1pdCBhIGNsYXNzIGltcGxlbWVudGluZyBhbiBpbnRlcmZhY2Ugd2hlbiB0aGUgZGF0YXR5cGUgcHJvcGVydHkgaXMgdHJ1ZSBpbiB0aGUganNpaSBtb2RlbFxuICAgKiBUaGUgZ2VuZXJhdGlvbiBvZiB0aGUgaW50ZXJmYWNlIHByb3h5IG1heSBub3QgYmUgbmVlZGVkIGlmIHRoZSBpbnRlcmZhY2UgaXMgYWxzbyBzZXQgYXMgYSBkYXRhdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0SW50ZXJmYWNlRGF0YVR5cGUoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUpOiB2b2lkIHtcbiAgICAvLyBJbnRlcmZhY2UgZGF0YXR5cGVzIGRvIG5vdCBuZWVkIHRvIGJlIHByZWZpeGVkIGJ5IEksIHdlIGNhbiBjYWxsIGNvbnZlcnRDbGFzc05hbWVcbiAgICBjb25zdCBuYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydENsYXNzTmFtZShpZmMpO1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IHRoaXMubmFtZXNwYWNlRm9yKHRoaXMuYXNzZW1ibHksIGlmYyk7XG4gICAgY29uc3QgaXNOZXN0ZWQgPSB0aGlzLmlzTmVzdGVkKGlmYyk7XG4gICAgdGhpcy5vcGVuRmlsZUlmTmVlZGVkKG5hbWUsIG5hbWVzcGFjZSwgaXNOZXN0ZWQpO1xuXG4gICAgaWYgKGlmYy5wcm9wZXJ0aWVzPy5maW5kKChwcm9wKSA9PiAhcHJvcC5vcHRpb25hbCkgIT0gbnVsbCkge1xuICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBiZSBhbm5veWVkIGJ5IHRoZSBsYWNrIG9mIGluaXRpYWxpemF0aW9uIG9mIG5vbi1udWxsYWJsZSBmaWVsZHMgaW4gdGhpcyBjYXNlLlxuICAgICAgdGhpcy5jb2RlLmxpbmUoJyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIENTODYxOCcpO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmRvdG5ldERvY0dlbmVyYXRvci5lbWl0RG9jcyhpZmMpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IGA6ICR7dGhpcy50eXBlcmVzb2x2ZXIudG9OYXRpdmVGcW4oaWZjLmZxbil9YDtcbiAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdEF0dHJpYnV0ZXNGb3JJbnRlcmZhY2VEYXRhdHlwZShpZmMpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYHB1YmxpYyBjbGFzcyAke25hbWV9ICR7c3VmZml4fWApO1xuICAgIHRoaXMuZmxhZ0ZpcnN0TWVtYmVyV3JpdHRlbihmYWxzZSk7XG4gICAgY29uc3QgZGF0YXR5cGUgPSB0cnVlO1xuICAgIGNvbnN0IHByb3h5ID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0SW50ZXJmYWNlTWVtYmVyc0ZvclByb3h5T3JEYXRhdHlwZShpZmMsIGRhdGF0eXBlLCBwcm94eSk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNsb3NlRmlsZUlmTmVlZGVkKG5hbWUsIG5hbWVzcGFjZSwgaXNOZXN0ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyB0aGUgYm9keSBvZiB0aGUgaW50ZXJmYWNlIHByb3h5IG9yIGRhdGEgdHlwZSBjbGFzc1xuICAgKlxuICAgKiBUaGlzIGxvb3BzIHRocm91Z2ggYWxsIHRoZSBtZW1iZXIgYW5kIGdlbmVyYXRlcyB0aGVtXG4gICAqL1xuICBwcml2YXRlIGVtaXRJbnRlcmZhY2VNZW1iZXJzRm9yUHJveHlPckRhdGF0eXBlKFxuICAgIGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlIHwgc3BlYy5DbGFzc1R5cGUsXG4gICAgZGF0YXR5cGU6IGJvb2xlYW4sXG4gICAgcHJveHk6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIC8vIFRoZSBrZXkgaXMgaW4gdGhlIGZvcm0gJ21ldGhvZC5uYW1lO3BhcmFtZXRlcjE7cGFyYW1ldGVyMjsnIGV0Y1xuICAgIGNvbnN0IG1ldGhvZHM6IE1hcDxzdHJpbmcsIHNwZWMuTWV0aG9kPiA9IG5ldyBNYXA8c3RyaW5nLCBzcGVjLk1ldGhvZD4oKTtcbiAgICAvKlxuICAgICAgICAgIE9ubHkgZ2V0IHRoZSBmaXJzdCBkZWNsYXJhdGlvbiBlbmNvdW50ZXJlZCwgYW5kIGtlZXAgaXQgaWYgaXQgaXMgYWJzdHJhY3QuIFRoZSBsaXN0IGNvbnRhaW5zIEFMTFxuICAgICAgICAgIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgZW5jb3VudGVyZWQsIGluIHRoZSBvcmRlciBlbmNvdW50ZXJlZC4gQW4gYWJzdHJhY3QgY2xhc3MgY2FuIGhhdmUgY29uY3JldGVcbiAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMuIFRoZXJlZm9yZSwgd2Ugb25seSBnZW5lcmF0ZSBtZXRob2RzL3Byb3BlcnRpZXMgaWYgdGhlIGZpcnN0IG1lbWJlciBlbmNvdW50ZXJlZFxuICAgICAgICAgIGlzIHVuaW1wbGVtZW50ZWQuXG4gICAgICAgICovXG4gICAgY29uc3QgZXhjbHVkZWRNZXRob2Q6IHN0cmluZ1tdID0gW107IC8vIEtlZXBzIHRyYWNrIG9mIHRoZSBtZXRob2RzIHdlIGFscmVhZHkgcmFuIGludG8gYW5kIGRvbid0IHdhbnQgdG8gZW1pdFxuICAgIGNvbnN0IGV4Y2x1ZGVkUHJvcGVydGllczogc3RyaW5nW10gPSBbXTsgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIHByb3BlcnRpZXMgd2UgYWxyZWFkeSByYW4gaW50byBhbmQgZG9uJ3Qgd2FudCB0byBlbWl0XG4gICAgY29uc3QgcHJvcGVydGllczogeyBbbmFtZTogc3RyaW5nXTogc3BlYy5Qcm9wZXJ0eSB9ID0ge307XG4gICAgY29uc3QgY29sbGVjdEFic3RyYWN0TWVtYmVycyA9IChcbiAgICAgIGN1cnJlbnRUeXBlOiBzcGVjLkludGVyZmFjZVR5cGUgfCBzcGVjLkNsYXNzVHlwZSxcbiAgICApID0+IHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBjdXJyZW50VHlwZS5wcm9wZXJ0aWVzID8/IFtdKSB7XG4gICAgICAgIGlmICghZXhjbHVkZWRQcm9wZXJ0aWVzLmluY2x1ZGVzKHByb3AubmFtZSkpIHtcbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIG5ldmVyIHJ1biBpbnRvIHRoaXMgcHJvcGVydHkgYmVmb3JlIGFuZCBpdCBpcyBhYnN0cmFjdCwgd2Uga2VlcCBpdFxuICAgICAgICAgIGlmIChwcm9wLmFic3RyYWN0KSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzW3Byb3AubmFtZV0gPSBwcm9wO1xuICAgICAgICAgIH1cbiAgICAgICAgICBleGNsdWRlZFByb3BlcnRpZXMucHVzaChwcm9wLm5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIGN1cnJlbnRUeXBlLm1ldGhvZHMgPz8gW10pIHtcbiAgICAgICAgbGV0IG1ldGhvZFBhcmFtZXRlcnMgPSAnJztcbiAgICAgICAgaWYgKG1ldGhvZC5wYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgbWV0aG9kLnBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW0pID0+IHtcbiAgICAgICAgICAgIG1ldGhvZFBhcmFtZXRlcnMgKz0gYDske3RoaXMudHlwZXJlc29sdmVyLnRvRG90TmV0VHlwZShcbiAgICAgICAgICAgICAgcGFyYW0udHlwZSxcbiAgICAgICAgICAgICl9YDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWV4Y2x1ZGVkTWV0aG9kLmluY2x1ZGVzKGAke21ldGhvZC5uYW1lfSR7bWV0aG9kUGFyYW1ldGVyc31gKSkge1xuICAgICAgICAgIC8vIElmIHdlIGhhdmUgbmV2ZXIgcnVuIGludG8gdGhpcyBtZXRob2QgYmVmb3JlIGFuZCBpdCBpcyBhYnN0cmFjdCwgd2Uga2VlcCBpdFxuICAgICAgICAgIGlmIChtZXRob2QuYWJzdHJhY3QpIHtcbiAgICAgICAgICAgIG1ldGhvZHMuc2V0KGAke21ldGhvZC5uYW1lfSR7bWV0aG9kUGFyYW1ldGVyc31gLCBtZXRob2QpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBleGNsdWRlZE1ldGhvZC5wdXNoKGAke21ldGhvZC5uYW1lfSR7bWV0aG9kUGFyYW1ldGVyc31gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXNlcyA9IG5ldyBBcnJheTxzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZT4oKTtcbiAgICAgIGJhc2VzLnB1c2goXG4gICAgICAgIC4uLihjdXJyZW50VHlwZS5pbnRlcmZhY2VzID8/IFtdKS5tYXAoKGlmYWNlKSA9PiB0aGlzLmZpbmRUeXBlKGlmYWNlKSksXG4gICAgICApO1xuICAgICAgaWYgKHNwZWMuaXNDbGFzc1R5cGUoY3VycmVudFR5cGUpICYmIGN1cnJlbnRUeXBlLmJhc2UpIHtcbiAgICAgICAgYmFzZXMucHVzaCh0aGlzLmZpbmRUeXBlKGN1cnJlbnRUeXBlLmJhc2UpKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgYmFzZSBvZiBiYXNlcykge1xuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5maW5kVHlwZShiYXNlLmZxbik7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlLmtpbmQgIT09IHNwZWMuVHlwZUtpbmQuSW50ZXJmYWNlICYmXG4gICAgICAgICAgdHlwZS5raW5kICE9PSBzcGVjLlR5cGVLaW5kLkNsYXNzXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBCYXNlIGludGVyZmFjZXMgb2YgYW4gaW50ZXJmYWNlIG11c3QgYmUgYW4gaW50ZXJmYWNlIG9yIGEgY2xhc3MgKCR7YmFzZS5mcW59IGlzIG9mIHR5cGUgJHt0eXBlLmtpbmR9KWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb2xsZWN0QWJzdHJhY3RNZW1iZXJzKHR5cGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgY29sbGVjdEFic3RyYWN0TWVtYmVycyhpZmMpO1xuXG4gICAgLy8gZW1pdCBhbGwgcHJvcGVydGllc1xuICAgIGZvciAoY29uc3QgcHJvcE5hbWUgb2YgT2JqZWN0LmtleXMocHJvcGVydGllcykpIHtcbiAgICAgIGNvbnN0IHByb3AgPSBjbG9uZShwcm9wZXJ0aWVzW3Byb3BOYW1lXSk7XG4gICAgICBwcm9wLmFic3RyYWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLmVtaXRQcm9wZXJ0eShpZmMsIHByb3AsIGRhdGF0eXBlLCBwcm94eSk7XG4gICAgfVxuICAgIC8vIGVtaXQgYWxsIHRoZSBtZXRob2RzXG4gICAgZm9yIChjb25zdCBtZXRob2ROYW1lQW5kUGFyYW1ldGVycyBvZiBtZXRob2RzLmtleXMoKSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBtZXRob2RzLmdldChtZXRob2ROYW1lQW5kUGFyYW1ldGVycyk7XG4gICAgICBpZiAob3JpZ2luYWxNZXRob2QpIHtcbiAgICAgICAgY29uc3QgbWV0aG9kID0gY2xvbmUob3JpZ2luYWxNZXRob2QpO1xuICAgICAgICBtZXRob2QuYWJzdHJhY3QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lbWl0TWV0aG9kKGlmYywgbWV0aG9kLCAvKiBlbWl0Rm9yUHJveHlPckRhdGF0eXBlICovIHRydWUpO1xuXG4gICAgICAgIGZvciAoY29uc3Qgb3ZlcmxvYWRlZE1ldGhvZCBvZiB0aGlzLmNyZWF0ZU92ZXJsb2Fkc0Zvck9wdGlvbmFscyhcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICkpIHtcbiAgICAgICAgICBvdmVybG9hZGVkTWV0aG9kLmFic3RyYWN0ID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5lbWl0TWV0aG9kKFxuICAgICAgICAgICAgaWZjLFxuICAgICAgICAgICAgb3ZlcmxvYWRlZE1ldGhvZCxcbiAgICAgICAgICAgIC8qIGVtaXRGb3JQcm94eU9yRGF0YXR5cGUgKi8gdHJ1ZSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGEgcHJvcGVydHlcbiAgICovXG4gIHByaXZhdGUgZW1pdFByb3BlcnR5KFxuICAgIGNsczogc3BlYy5UeXBlLFxuICAgIHByb3A6IHNwZWMuUHJvcGVydHksXG4gICAgZGF0YXR5cGUgPSBmYWxzZSxcbiAgICBwcm94eSA9IGZhbHNlLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmVtaXROZXdMaW5lSWZOZWNlc3NhcnkoKTtcblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHRoaXMudHlwZXJlc29sdmVyLnRvTmF0aXZlRnFuKGNscy5mcW4pO1xuICAgIGNvbnN0IGFjY2VzcyA9IHRoaXMucmVuZGVyQWNjZXNzTGV2ZWwocHJvcCk7XG4gICAgY29uc3Qgc3RhdGljS2V5V29yZCA9IHByb3Auc3RhdGljID8gJ3N0YXRpYyAnIDogJyc7XG4gICAgY29uc3QgcHJvcE5hbWUgPSB0aGlzLm5hbWV1dGlscy5jb252ZXJ0UHJvcGVydHlOYW1lKHByb3AubmFtZSk7XG5cbiAgICB0aGlzLmRvdG5ldERvY0dlbmVyYXRvci5lbWl0RG9jcyhwcm9wKTtcbiAgICBpZiAocHJvcC5vcHRpb25hbCkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJ1tKc2lpT3B0aW9uYWxdJyk7XG4gICAgfVxuICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5lbWl0QXR0cmlidXRlc0ZvclByb3BlcnR5KHByb3AsIGRhdGF0eXBlKTtcblxuICAgIGxldCBpc092ZXJyaWRlS2V5V29yZCA9ICcnO1xuICAgIGxldCBpc1ZpcnR1YWxLZXlXb3JkID0gJyc7XG4gICAgbGV0IGlzQWJzdHJhY3RLZXl3b3JkID0gJyc7XG5cbiAgICAvLyBJZiB0aGUgcHJvcCBwYXJlbnQgaXMgYSBjbGFzc1xuICAgIGlmIChzcGVjLmlzQ2xhc3NUeXBlKGNscykpIHtcbiAgICAgIGNvbnN0IGltcGxlbWVudGVkSW5CYXNlID0gdGhpcy5pc01lbWJlckRlZmluZWRPbkFuY2VzdG9yKFxuICAgICAgICBjbHMgYXMgc3BlYy5DbGFzc1R5cGUsXG4gICAgICAgIHByb3AsXG4gICAgICApO1xuICAgICAgaWYgKGltcGxlbWVudGVkSW5CYXNlIHx8IGRhdGF0eXBlIHx8IHByb3h5KSB7XG4gICAgICAgIC8vIE92ZXJyaWRlIGlmIHRoZSBwcm9wZXJ0eSBpcyBpbiBhIGRhdGF0eXBlIG9yIHByb3h5IGNsYXNzIG9yIGRlY2xhcmVkIGluIGEgcGFyZW50IGNsYXNzLiBJZiB0aGUgbWVtYmVyIGlzXG4gICAgICAgIC8vIHN0YXRpYywgdXNlIHRoZSBcIm5ld1wiIGtleXdvcmQgaW5zdGVhZCwgdG8gaW5kaWNhdGUgd2UgYXJlIGludGVudGlvbmFsbHkgaGlkaW5nIHRoZSBhbmNlc3RvciBkZWNsYXJhdGlvbiAoYXNcbiAgICAgICAgLy8gQyMgZG9lcyBub3QgaW5oZXJpdCBzdGF0aWNzLCB0aGV5IGNhbiBiZSBoaWRkZW4gYnV0IG5vdCBvdmVycmlkZGVuKS5UaGUgXCJuZXdcIiBrZXl3b3JkIGlzIG9wdGlvbmFsIGluIHRoaXNcbiAgICAgICAgLy8gY29udGV4dCwgYnV0IGhlbHBzIGNsYXJpZnkgaW50ZW50aW9uLlxuICAgICAgICBpc092ZXJyaWRlS2V5V29yZCA9IHByb3Auc3RhdGljID8gJ25ldyAnIDogJ292ZXJyaWRlICc7XG4gICAgICB9IGVsc2UgaWYgKHByb3AuYWJzdHJhY3QpIHtcbiAgICAgICAgLy8gQWJzdHJhY3QgbWVtYmVycyBnZXQgZGVjb3JhdGVkIGFzIHN1Y2hcbiAgICAgICAgaXNBYnN0cmFjdEtleXdvcmQgPSAnYWJzdHJhY3QgJztcbiAgICAgIH0gZWxzZSBpZiAoIXByb3Auc3RhdGljICYmICFpbXBsZW1lbnRlZEluQmFzZSkge1xuICAgICAgICAvLyBWaXJ0dWFsIGlmIHRoZSBwcm9wIGlzIG5vdCBzdGF0aWMsIGFuZCBpcyBub3QgaW1wbGVtZW50ZWQgaW4gYmFzZSBtZW1iZXIsIHRoaXMgd2F5IHdlIGNhbiBsYXRlciBvdmVycmlkZSBpdC5cbiAgICAgICAgaXNWaXJ0dWFsS2V5V29yZCA9ICd2aXJ0dWFsICc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcFR5cGVGUU4gPSB0aGlzLnR5cGVyZXNvbHZlci50b0RvdE5ldFR5cGUocHJvcC50eXBlKTtcbiAgICBjb25zdCBpc09wdGlvbmFsID0gcHJvcC5vcHRpb25hbCA/ICc/JyA6ICcnO1xuICAgIGNvbnN0IHN0YXRlbWVudCA9IGAke2FjY2Vzc30gJHtpc0Fic3RyYWN0S2V5d29yZH0ke2lzVmlydHVhbEtleVdvcmR9JHtzdGF0aWNLZXlXb3JkfSR7aXNPdmVycmlkZUtleVdvcmR9JHtwcm9wVHlwZUZRTn0ke2lzT3B0aW9uYWx9ICR7cHJvcE5hbWV9YDtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKHN0YXRlbWVudCk7XG5cbiAgICAvLyBFbWl0IGdldHRlcnNcbiAgICBpZiAoZGF0YXR5cGUgfHwgcHJvcC5jb25zdCB8fCBwcm9wLmFic3RyYWN0KSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgnZ2V0OycpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUgcHJvcGVydHkgaXMgbm9uLW9wdGlvbmFsLCBhZGQgYSBiYW5nIHRvIHNpbGVuY2UgY29tcGlsZXIgd2FybmluZ1xuICAgICAgY29uc3QgYmFuZyA9IHByb3Aub3B0aW9uYWwgPyAnJyA6ICchJztcbiAgICAgIGlmIChwcm9wLnN0YXRpYykge1xuICAgICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgICBgZ2V0ID0+IEdldFN0YXRpY1Byb3BlcnR5PCR7cHJvcFR5cGVGUU59JHtpc09wdGlvbmFsfT4odHlwZW9mKCR7Y2xhc3NOYW1lfSkpJHtiYW5nfTtgLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgICAgYGdldCA9PiBHZXRJbnN0YW5jZVByb3BlcnR5PCR7cHJvcFR5cGVGUU59JHtpc09wdGlvbmFsfT4oKSR7YmFuZ307YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbWl0IHNldHRlcnNcbiAgICBpZiAoZGF0YXR5cGUgfHwgKCFwcm9wLmltbXV0YWJsZSAmJiBwcm9wLmFic3RyYWN0KSkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJ3NldDsnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFwcm9wLmltbXV0YWJsZSkge1xuICAgICAgICBpZiAocHJvcC5zdGF0aWMpIHtcbiAgICAgICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgICAgIGBzZXQgPT4gU2V0U3RhdGljUHJvcGVydHkodHlwZW9mKCR7Y2xhc3NOYW1lfSksIHZhbHVlKTtgLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb2RlLmxpbmUoJ3NldCA9PiBTZXRJbnN0YW5jZVByb3BlcnR5KHZhbHVlKTsnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICB0aGlzLmZsYWdGaXJzdE1lbWJlcldyaXR0ZW4odHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgYSBjb25zdGFudCBwcm9wZXJ0eVxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0Q29uc3RQcm9wZXJ0eShjbHM6IHNwZWMuQ2xhc3NUeXBlLCBwcm9wOiBzcGVjLlByb3BlcnR5KTogdm9pZCB7XG4gICAgdGhpcy5lbWl0TmV3TGluZUlmTmVjZXNzYXJ5KCk7XG4gICAgdGhpcy5mbGFnRmlyc3RNZW1iZXJXcml0dGVuKHRydWUpO1xuICAgIGNvbnN0IHByb3BUeXBlID0gdGhpcy50eXBlcmVzb2x2ZXIudG9Eb3ROZXRUeXBlKHByb3AudHlwZSk7XG4gICAgY29uc3QgaXNPcHRpb25hbCA9IHByb3Aub3B0aW9uYWwgPyAnPycgOiAnJztcbiAgICB0aGlzLmRvdG5ldERvY0dlbmVyYXRvci5lbWl0RG9jcyhwcm9wKTtcbiAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdEF0dHJpYnV0ZXNGb3JQcm9wZXJ0eShwcm9wKTtcbiAgICBjb25zdCBhY2Nlc3MgPSB0aGlzLnJlbmRlckFjY2Vzc0xldmVsKHByb3ApO1xuICAgIGNvbnN0IHByb3BOYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydFByb3BlcnR5TmFtZShwcm9wLm5hbWUpO1xuICAgIGNvbnN0IHN0YXRpY0tleXdvcmQgPSBwcm9wLnN0YXRpYyA/ICdzdGF0aWMgJyA6ICcnO1xuXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGAke2FjY2Vzc30gJHtzdGF0aWNLZXl3b3JkfSR7cHJvcFR5cGV9JHtpc09wdGlvbmFsfSAke3Byb3BOYW1lfWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnZ2V0OycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy50eXBlcmVzb2x2ZXIudG9OYXRpdmVGcW4oY2xzLmZxbik7XG4gICAgLy8gSWYgdGhlIHByb3BlcnR5IGlzIG5vbi1vcHRpb25hbCwgYWRkIGEgYmFuZyB0byBzaWxlbmNlIHRoZSBjb21waWxlciB3YXJuaW5nXG4gICAgY29uc3QgYmFuZyA9IHByb3Aub3B0aW9uYWwgPyAnJyA6ICchJztcbiAgICBjb25zdCBpbml0aWFsaXplciA9IHByb3Auc3RhdGljXG4gICAgICA/IGA9IEdldFN0YXRpY1Byb3BlcnR5PCR7cHJvcFR5cGV9Pih0eXBlb2YoJHtjbGFzc05hbWV9KSkke2Jhbmd9O2BcbiAgICAgIDogYD0gR2V0SW5zdGFuY2VQcm9wZXJ0eTwke3Byb3BUeXBlfT4odHlwZW9mKCR7Y2xhc3NOYW1lfSkpJHtiYW5nfTtgO1xuICAgIHRoaXMuY29kZS5saW5lKGluaXRpYWxpemVyKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQWNjZXNzTGV2ZWwobWV0aG9kOiBzcGVjLk1ldGhvZCB8IHNwZWMuUHJvcGVydHkpOiBzdHJpbmcge1xuICAgIHJldHVybiBtZXRob2QucHJvdGVjdGVkID8gJ3Byb3RlY3RlZCcgOiAncHVibGljJztcbiAgfVxuXG4gIHByaXZhdGUgaXNOZXN0ZWQodHlwZTogc3BlYy5UeXBlKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmFzc2VtYmx5LnR5cGVzIHx8ICF0eXBlLm5hbWVzcGFjZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBgJHt0eXBlLmFzc2VtYmx5fS4ke3R5cGUubmFtZXNwYWNlfWA7XG4gICAgcmV0dXJuIHBhcmVudCBpbiB0aGlzLmFzc2VtYmx5LnR5cGVzO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0NTaGFycEZpbGVQYXRoKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3R5cGV9LmNzYDtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkZpbGVJZk5lZWRlZChcbiAgICB0eXBlTmFtZTogc3RyaW5nLFxuICAgIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgIGlzTmVzdGVkOiBib29sZWFuLFxuICAgIHVzaW5nRGVwdXR5ID0gdHJ1ZSxcbiAgKTogdm9pZCB7XG4gICAgLy8gSWYgTmVzdGVkIHR5cGUsIHdlIHNob3VsZG4ndCBvcGVuL2Nsb3NlIGEgZmlsZVxuICAgIGlmIChpc05lc3RlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRvdG5ldFBhY2thZ2VJZCA9IHRoaXMuYXNzZW1ibHkudGFyZ2V0cz8uZG90bmV0Py5wYWNrYWdlSWQ7XG4gICAgaWYgKCFkb3RuZXRQYWNrYWdlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBtb2R1bGUgJHt0aGlzLmFzc2VtYmx5Lm5hbWV9IGRvZXMgbm90IGhhdmUgYSBkb3RuZXQucGFja2FnZUlkIHNldHRpbmdgLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZmlsZVBhdGggPSBuYW1lc3BhY2UucmVwbGFjZSgvWy5dL2csICcvJyk7XG4gICAgdGhpcy5jb2RlLm9wZW5GaWxlKFxuICAgICAgcGF0aC5qb2luKGRvdG5ldFBhY2thZ2VJZCwgZmlsZVBhdGgsIHRoaXMudG9DU2hhcnBGaWxlUGF0aCh0eXBlTmFtZSkpLFxuICAgICk7XG4gICAgaWYgKHVzaW5nRGVwdXR5KSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgndXNpbmcgQW1hem9uLkpTSUkuUnVudGltZS5EZXB1dHk7Jyk7XG4gICAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIH1cblxuICAgIC8vIFN1cHByZXNzIHdhcm5pbmdzIGFib3V0IG1pc3NpbmcgWE1MRG9jLCBPYnNvbGV0ZSBpbmNvbnNpc3RlbmNpZXNcbiAgICB0aGlzLmNvZGUubGluZSgnI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgQ1MwNjcyLENTMDgwOSxDUzE1OTEnKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgbmFtZXNwYWNlICR7bmFtZXNwYWNlfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZUZpbGVJZk5lZWRlZChcbiAgICB0eXBlTmFtZTogc3RyaW5nLFxuICAgIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgIGlzTmVzdGVkOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICBpZiAoaXNOZXN0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGNvbnN0IGRvdG5ldFBhY2thZ2VJZCA9IHRoaXMuYXNzZW1ibHkudGFyZ2V0cz8uZG90bmV0Py5wYWNrYWdlSWQ7XG4gICAgaWYgKCFkb3RuZXRQYWNrYWdlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBtb2R1bGUgJHt0aGlzLmFzc2VtYmx5Lm5hbWV9IGRvZXMgbm90IGhhdmUgYSBkb3RuZXQucGFja2FnZUlkIHNldHRpbmdgLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZmlsZVBhdGggPSBuYW1lc3BhY2UucmVwbGFjZSgvWy5dL2csICcvJyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlRmlsZShcbiAgICAgIHBhdGguam9pbihkb3RuZXRQYWNrYWdlSWQsIGZpbGVQYXRoLCB0aGlzLnRvQ1NoYXJwRmlsZVBhdGgodHlwZU5hbWUpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgZmlyc3RNZW1iZXIgYm9vbGVhbiBmbGFnIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGZpcnN0IG1lbWJlciBvZiBhIG5ldyBmaWxlXG4gICAqXG4gICAqIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJ5IHdoaXRlIGxpbmVzXG4gICAqL1xuICBwcml2YXRlIGZsYWdGaXJzdE1lbWJlcldyaXR0ZW4oZmlyc3Q6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmZpcnN0TWVtYmVyV3JpdHRlbiA9IGZpcnN0O1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGEgbmV3IGxpbmUgcHJpb3IgdG8gd3JpdGluZyBhIG5ldyBwcm9wZXJ0eSwgbWV0aG9kLCBpZiB0aGUgcHJvcGVydHkgaXMgbm90IHRoZSBmaXJzdCBvbmUgaW4gdGhlIGNsYXNzXG4gICAqXG4gICAqIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJ5IHdoaXRlIGxpbmVzLlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0TmV3TGluZUlmTmVjZXNzYXJ5KCk6IHZvaWQge1xuICAgIC8vIElmIHRoZSBmaXJzdCBtZW1iZXIgaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuLCBpdCBpcyBzYWZlIHRvIHdyaXRlIGEgbmV3IGxpbmVcbiAgICBpZiAodGhpcy5maXJzdE1lbWJlcldyaXR0ZW4pIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlyc3RNZW1iZXJXcml0dGVuID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0QXNzZW1ibHlEb2NzKCkge1xuICAgIHRoaXMuZW1pdE5hbWVzcGFjZURvY3MoXG4gICAgICB0aGlzLmFzc2VtYmx5LnRhcmdldHMhLmRvdG5ldCEubmFtZXNwYWNlLFxuICAgICAgdGhpcy5hc3NlbWJseSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgYW4gdW51c2VkLCBlbXB0eSBjbGFzcyBjYWxsZWQgYE5hbWVzcGFjZURvY2AgdG8gYXR0YWNoIHRoZSBtb2R1bGUgUkVBRE1FIHRvXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIHdheSB0byBhdHRhY2ggZG9jIGNvbW1lbnRzIHRvIGEgbmFtZXNwYWNlIGluIEMjLCBhbmQgdGhpcyB0cmljayBoYXMgYmVlblxuICAgKiBzZW1pLXN0YW5kYXJkaXplZCBieSBORG9jIGFuZCBTYW5kY2FzdGxlIEhlbHAgRmlsZSBCdWlsZGVyLlxuICAgKlxuICAgKiBEb2NGWCBkb2Vzbid0IHN1cHBvcnQgaXQgb3V0IG9mIHRoZSBib3gsIGJ1dCB3ZSBzaG91bGQgYmUgYWJsZSB0byBnZXQgdGhlcmUgd2l0aCBhXG4gICAqIGJpdCBvZiBoYWNrZXJ5LlxuICAgKlxuICAgKiBJbiBhbnkgY2FzZSwgd2UgbmVlZCBhIHBsYWNlIHRvIGF0dGFjaCB0aGUgZG9jcyB3aGVyZSB0aGV5IGNhbiBiZSB0cmFuc3BvcnRlZCBhcm91bmQsXG4gICAqIG1pZ2h0IGFzIHdlbGwgYmUgdGhpcyBtZXRob2QuXG4gICAqL1xuICBwcml2YXRlIGVtaXROYW1lc3BhY2VEb2NzKG5hbWVzcGFjZTogc3RyaW5nLCBkb2NTb3VyY2U6IHNwZWMuVGFyZ2V0YWJsZSkge1xuICAgIGlmICghZG9jU291cmNlLnJlYWRtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9ICdOYW1lc3BhY2VEb2MnO1xuICAgIHRoaXMub3BlbkZpbGVJZk5lZWRlZChjbGFzc05hbWUsIG5hbWVzcGFjZSwgZmFsc2UsIGZhbHNlKTtcblxuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXRNYXJrZG93bkFzUmVtYXJrcyhkb2NTb3VyY2UucmVhZG1lLm1hcmtkb3duKTtcbiAgICB0aGlzLmVtaXRIaWRlQXR0cmlidXRlKCk7XG4gICAgLy8gVHJhZGl0aW9uYWxseSB0aGlzIGNsYXNzIGlzIG1hZGUgJ2ludGVybmFsJywgYnV0IHRoYXQgaW50ZXJhY3RzIHBvb3JseSB3aXRoIERvY0ZYJ3MgZGVmYXVsdCBmaWx0ZXJzXG4gICAgLy8gd2hpY2ggYXJlbid0IG92ZXJyaWRhYmxlLiBTbyB3ZSBtYWtlIGl0IHB1YmxpYywgYnV0IHVzZSBhdHRyaWJ1dGVzIHRvIGhpZGUgaXQgZnJvbSB1c2VycycgSW50ZWxsaVNlbnNlLFxuICAgIC8vIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyB0aGUgY2xhc3MgaW4gRG9jRlguXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgcHVibGljIGNsYXNzICR7Y2xhc3NOYW1lfWApO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jbG9zZUZpbGVJZk5lZWRlZChjbGFzc05hbWUsIG5hbWVzcGFjZSwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgYW4gYXR0cmlidXRlIHRoYXQgd2lsbCBoaWRlIHRoZSBzdWJzZXF1ZW50IEFQSSBlbGVtZW50IGZyb20gdXNlcnNcbiAgICovXG4gIHByaXZhdGUgZW1pdEhpZGVBdHRyaWJ1dGUoKSB7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnW1N5c3RlbS5Db21wb25lbnRNb2RlbC5FZGl0b3JCcm93c2FibGUoU3lzdGVtLkNvbXBvbmVudE1vZGVsLkVkaXRvckJyb3dzYWJsZVN0YXRlLk5ldmVyKV0nLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
876
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90bmV0Z2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZG90bmV0Z2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFtQztBQUNuQywrQkFBK0I7QUFDL0IsK0JBQStCO0FBRy9CLDZCQUE2QjtBQUU3QiwrQ0FBc0Q7QUFDdEQsNkRBQTBEO0FBQzFELHFFQUFrRTtBQUNsRSw2REFBMEQ7QUFDMUQsbURBQWdEO0FBQ2hELDJDQUE4QztBQUU5Qzs7R0FFRztBQUNILE1BQWEsZUFBZ0IsU0FBUSxxQkFBUztJQVk1QyxZQUNtQixnQ0FBMEMsRUFDMUMsT0FBZ0I7UUFFakMsS0FBSyxFQUFFLENBQUM7UUFIUyxxQ0FBZ0MsR0FBaEMsZ0NBQWdDLENBQVU7UUFDMUMsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQWJuQywyRUFBMkU7UUFDbkUsdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBSWxCLGNBQVMsR0FBb0IsSUFBSSwyQkFBZSxFQUFFLENBQUM7UUFZbEUsb0dBQW9HO1FBQ3BHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsSUFBSTtZQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJLENBQ2YsV0FBbUIsRUFDbkIsUUFBMEI7UUFFMUIsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRLENBQUMsV0FBb0I7UUFDbEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLHVDQUFrQixDQUN4QyxJQUFJLENBQUMsUUFBUSxFQUNiLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxF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QUNKLENBQUM7Q0FDRjtBQXpvQ0QsMENBeW9DQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHNwZWMgZnJvbSAnQGpzaWkvc3BlYyc7XG5pbXBvcnQgKiBhcyBjbG9uZSBmcm9tICdjbG9uZSc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyByZWZsZWN0IGZyb20gJ2pzaWktcmVmbGVjdCc7XG5pbXBvcnQgeyBSb3NldHRhIH0gZnJvbSAnanNpaS1yb3NldHRhJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IEdlbmVyYXRvciwgTGVnYWxlc2UgfSBmcm9tICcuLi8uLi9nZW5lcmF0b3InO1xuaW1wb3J0IHsgRG90TmV0RG9jR2VuZXJhdG9yIH0gZnJvbSAnLi9kb3RuZXRkb2NnZW5lcmF0b3InO1xuaW1wb3J0IHsgRG90TmV0UnVudGltZUdlbmVyYXRvciB9IGZyb20gJy4vZG90bmV0cnVudGltZWdlbmVyYXRvcic7XG5pbXBvcnQgeyBEb3ROZXRUeXBlUmVzb2x2ZXIgfSBmcm9tICcuL2RvdG5ldHR5cGVyZXNvbHZlcic7XG5pbXBvcnQgeyBGaWxlR2VuZXJhdG9yIH0gZnJvbSAnLi9maWxlZ2VuZXJhdG9yJztcbmltcG9ydCB7IERvdE5ldE5hbWVVdGlscyB9IGZyb20gJy4vbmFtZXV0aWxzJztcblxuLyoqXG4gKiBDT0RFIEdFTkVSQVRPUiBWMlxuICovXG5leHBvcnQgY2xhc3MgRG90TmV0R2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHtcbiAgLy8gRmxhZ3MgdGhhdCB0cmFja3MgaWYgd2UgaGF2ZSBhbHJlYWR5IHdyb3RlIHRoZSBmaXJzdCBtZW1iZXIgb2YgdGhlIGNsYXNzXG4gIHByaXZhdGUgZmlyc3RNZW1iZXJXcml0dGVuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSB0eXBlcmVzb2x2ZXIhOiBEb3ROZXRUeXBlUmVzb2x2ZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBuYW1ldXRpbHM6IERvdE5ldE5hbWVVdGlscyA9IG5ldyBEb3ROZXROYW1lVXRpbHMoKTtcblxuICBwcml2YXRlIGRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IhOiBEb3ROZXRSdW50aW1lR2VuZXJhdG9yO1xuXG4gIHByaXZhdGUgZG90bmV0RG9jR2VuZXJhdG9yITogRG90TmV0RG9jR2VuZXJhdG9yO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFzc2VtYmxpZXNDdXJyZW50bHlCZWluZ0NvbXBpbGVkOiBzdHJpbmdbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvc2V0dGE6IFJvc2V0dGEsXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBPdmVycmlkZSB0aGUgb3BlbkJsb2NrIHRvIGdldCBhIGNvcnJlY3QgQyMgbG9va2luZyBjb2RlIGJsb2NrIHdpdGggdGhlIGN1cmx5IGJyYWNlIGFmdGVyIHRoZSBsaW5lXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICB0aGlzLmxpbmUodGV4dCk7XG4gICAgICB0aGlzLm9wZW4oJ3snKTtcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWQoXG4gICAgcGFja2FnZVJvb3Q6IHN0cmluZyxcbiAgICBhc3NlbWJseTogcmVmbGVjdC5Bc3NlbWJseSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIubG9hZChwYWNrYWdlUm9vdCwgYXNzZW1ibHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIGdlbmVyYXRvciAoaW4tbWVtb3J5KS5cbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZShmaW5nZXJwcmludDogYm9vbGVhbikge1xuICAgIHRoaXMudHlwZXJlc29sdmVyID0gbmV3IERvdE5ldFR5cGVSZXNvbHZlcihcbiAgICAgIHRoaXMuYXNzZW1ibHksXG4gICAgICAoZnFuOiBzdHJpbmcpID0+IHRoaXMuZmluZE1vZHVsZShmcW4pLFxuICAgICAgKGZxbjogc3RyaW5nKSA9PiB0aGlzLmZpbmRUeXBlKGZxbiksXG4gICAgICB0aGlzLmFzc2VtYmxpZXNDdXJyZW50bHlCZWluZ0NvbXBpbGVkLFxuICAgICk7XG5cbiAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IgPSBuZXcgRG90TmV0UnVudGltZUdlbmVyYXRvcihcbiAgICAgIHRoaXMuY29kZSxcbiAgICAgIHRoaXMudHlwZXJlc29sdmVyLFxuICAgICk7XG4gICAgdGhpcy5kb3RuZXREb2NHZW5lcmF0b3IgPSBuZXcgRG90TmV0RG9jR2VuZXJhdG9yKFxuICAgICAgdGhpcy5jb2RlLFxuICAgICAgdGhpcy5yb3NldHRhLFxuICAgICAgdGhpcy5hc3NlbWJseSxcbiAgICApO1xuXG4gICAgdGhpcy5lbWl0QXNzZW1ibHlEb2NzKCk7XG5cbiAgICAvLyBXZSBuZWVkIHRvIHJlc29sdmUgdGhlIGRlcGVuZGVuY3kgdHJlZVxuICAgIHRoaXMudHlwZXJlc29sdmVyLnJlc29sdmVOYW1lc3BhY2VzRGVwZW5kZW5jaWVzKCk7XG4gICAgc3VwZXIuZ2VuZXJhdGUoZmluZ2VycHJpbnQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNhdmUoXG4gICAgb3V0ZGlyOiBzdHJpbmcsXG4gICAgdGFyYmFsbDogc3RyaW5nLFxuICAgIHsgbGljZW5zZSwgbm90aWNlIH06IExlZ2FsZXNlLFxuICApOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgLy8gR2VuZXJhdGluZyB0aGUgY3Nwcm9qIGFuZCBBc3NlbWJseUluZm8uY3MgZmlsZXNcbiAgICBjb25zdCB0YXJiYWxsRmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKHRhcmJhbGwpO1xuICAgIGNvbnN0IGZpbGVnZW4gPSBuZXcgRmlsZUdlbmVyYXRvcihcbiAgICAgIHRoaXMuYXNzZW1ibHksXG4gICAgICB0YXJiYWxsRmlsZU5hbWUsXG4gICAgICB0aGlzLmNvZGUsXG4gICAgKTtcbiAgICBmaWxlZ2VuLmdlbmVyYXRlQXNzZW1ibHlJbmZvRmlsZSgpO1xuICAgIGZpbGVnZW4uZ2VuZXJhdGVQcm9qZWN0RmlsZSh0aGlzLnR5cGVyZXNvbHZlci5uYW1lc3BhY2VEZXBlbmRlbmNpZXMpO1xuICAgIC8vIENhbGxpbmcgc3VwZXIuc2F2ZSgpIGR1bXBzIHRoZSB0YXJiYWxsIGluIHRoZSBmb3JtYXQgbmFtZUB2ZXJzaW9uLmpzaWkudGd6LlxuICAgIC8vIFRoaXMgaXMgbm90IGluIHN5bmMgd2l0aCB0aGUgT2xkIC5ORVQgZ2VuZXJhdG9yIHdoZXJlIHRoZSBuYW1lIGlzIHNjb3BlLW5hbWUtdmVyc2lvbi50Z3ouXG4gICAgLy8gSGVuY2Ugd2UgYXJlIHNhdmluZyB0aGUgZmlsZXMgb3Vyc2VsdmVzIGhlcmU6XG4gICAgY29uc3QgYXNzbSA9IHRoaXMuYXNzZW1ibHk7XG4gICAgY29uc3QgcGFja2FnZUlkOiBzdHJpbmcgPSBhc3NtLnRhcmdldHMhLmRvdG5ldCEucGFja2FnZUlkO1xuICAgIGlmICghcGFja2FnZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgbW9kdWxlICR7YXNzbS5uYW1lfSBkb2VzIG5vdCBoYXZlIGEgZG90bmV0LnBhY2thZ2VJZCBzZXR0aW5nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGF3YWl0IGZzLm1rZGlycChwYXRoLmpvaW4ob3V0ZGlyLCBwYWNrYWdlSWQpKTtcbiAgICBhd2FpdCBmcy5jb3B5RmlsZSh0YXJiYWxsLCBwYXRoLmpvaW4ob3V0ZGlyLCBwYWNrYWdlSWQsIHRhcmJhbGxGaWxlTmFtZSkpO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGFuY2hvciBmaWxlIGZvciB0aGUgY3VycmVudCBtb2RlbFxuICAgIHRoaXMuZ2VuZXJhdGVEZXBlbmRlbmN5QW5jaG9yRmlsZSgpO1xuXG4gICAgaWYgKGxpY2Vuc2UpIHtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4ob3V0ZGlyLCBwYWNrYWdlSWQsICdMSUNFTlNFJyksIGxpY2Vuc2UsIHtcbiAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAobm90aWNlKSB7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKG91dGRpciwgcGFja2FnZUlkLCAnTk9USUNFJyksIG5vdGljZSwge1xuICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU2F2aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS5cbiAgICByZXR1cm4gdGhpcy5jb2RlLnNhdmUob3V0ZGlyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgdGhlIGFuY2hvciBmaWxlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2VuZXJhdGVEZXBlbmRlbmN5QW5jaG9yRmlsZSgpIHtcbiAgICBjb25zdCBuYW1lc3BhY2UgPSBgJHtcbiAgICAgIHRoaXMuYXNzZW1ibHkudGFyZ2V0cyEuZG90bmV0IS5uYW1lc3BhY2VcbiAgICB9LkludGVybmFsLkRlcGVuZGVuY3lSZXNvbHV0aW9uYDtcbiAgICB0aGlzLm9wZW5GaWxlSWZOZWVkZWQoJ0FuY2hvcicsIG5hbWVzcGFjZSwgZmFsc2UsIGZhbHNlKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCdwdWJsaWMgc2VhbGVkIGNsYXNzIEFuY2hvcicpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ3B1YmxpYyBBbmNob3IoKScpO1xuICAgIHRoaXMudHlwZXJlc29sdmVyLm5hbWVzcGFjZURlcGVuZGVuY2llcy5mb3JFYWNoKCh2YWx1ZSkgPT5cbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgbmV3ICR7dmFsdWUubmFtZXNwYWNlfS5JbnRlcm5hbC5EZXBlbmRlbmN5UmVzb2x1dGlvbi5BbmNob3IoKTtgLFxuICAgICAgKSxcbiAgICApO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNsb3NlRmlsZUlmTmVlZGVkKCdBbmNob3InLCBuYW1lc3BhY2UsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3QgdXNlZCBhcyB3ZSBvdmVycmlkZSB0aGUgc2F2ZSgpIG1ldGhvZFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldEFzc2VtYmx5T3V0cHV0RGlyKG1vZDogc3BlYy5Bc3NlbWJseSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubmFtZXV0aWxzLmNvbnZlcnRQYWNrYWdlTmFtZShtb2QubmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogTmFtZXNwYWNlcyBhcmUgaGFuZGxlZCBpbXBsaWNpdGx5IGJ5IG9wZW5GaWxlSWZOZWVkZWQoKS5cbiAgICpcbiAgICogRG8gZ2VuZXJhdGUgZG9jcyBpZiB0aGlzIGlzIGZvciBhIHN1Ym1vZHVsZSB0aG91Z2guXG4gICAqL1xuICBwcm90ZWN0ZWQgb25CZWdpbk5hbWVzcGFjZShqc2lpTnM6IHN0cmluZykge1xuICAgIGNvbnN0IHN1Ym1vZHVsZSA9IHRoaXMuYXNzZW1ibHkuc3VibW9kdWxlcz8uW2pzaWlOc107XG4gICAgaWYgKHN1Ym1vZHVsZSkge1xuICAgICAgY29uc3QgZG90bmV0TnMgPSB0aGlzLnR5cGVyZXNvbHZlci5yZXNvbHZlTmFtZXNwYWNlKFxuICAgICAgICB0aGlzLmFzc2VtYmx5LFxuICAgICAgICB0aGlzLmFzc2VtYmx5Lm5hbWUsXG4gICAgICAgIGpzaWlOcyxcbiAgICAgICk7XG4gICAgICB0aGlzLmVtaXROYW1lc3BhY2VEb2NzKGRvdG5ldE5zLCBqc2lpTnMsIHN1Ym1vZHVsZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kTmFtZXNwYWNlKF9uczogc3RyaW5nKSB7XG4gICAgLyogbm9vcCAqL1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5JbnRlcmZhY2UoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUpIHtcbiAgICBjb25zdCBpbXBsZW1lbnRhdGlvbnMgPSB0aGlzLnR5cGVyZXNvbHZlci5yZXNvbHZlSW1wbGVtZW50ZWRJbnRlcmZhY2VzKGlmYyk7XG4gICAgY29uc3QgaW50ZXJmYWNlTmFtZSA9IHRoaXMubmFtZXV0aWxzLmNvbnZlcnRJbnRlcmZhY2VOYW1lKGlmYyk7XG4gICAgY29uc3QgbmFtZXNwYWNlID0gdGhpcy5uYW1lc3BhY2VGb3IodGhpcy5hc3NlbWJseSwgaWZjKTtcbiAgICB0aGlzLm9wZW5GaWxlSWZOZWVkZWQoaW50ZXJmYWNlTmFtZSwgbmFtZXNwYWNlLCB0aGlzLmlzTmVzdGVkKGlmYykpO1xuXG4gICAgdGhpcy5kb3RuZXREb2NHZW5lcmF0b3IuZW1pdERvY3MoaWZjLCB7IGFwaTogJ3R5cGUnLCBmcW46IGlmYy5mcW4gfSk7XG4gICAgdGhpcy5kb3RuZXRSdW50aW1lR2VuZXJhdG9yLmVtaXRBdHRyaWJ1dGVzRm9ySW50ZXJmYWNlKGlmYyk7XG5cbiAgICBpZiAoaW1wbGVtZW50YXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICAgIGBwdWJsaWMgaW50ZXJmYWNlICR7aW50ZXJmYWNlTmFtZX0gOiAke2ltcGxlbWVudGF0aW9ucy5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBwdWJsaWMgaW50ZXJmYWNlICR7aW50ZXJmYWNlTmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy5mbGFnRmlyc3RNZW1iZXJXcml0dGVuKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVuZEludGVyZmFjZShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIC8vIGVtaXQgaW50ZXJmYWNlIHByb3h5IGNsYXNzXG4gICAgdGhpcy5lbWl0SW50ZXJmYWNlUHJveHkoaWZjKTtcblxuICAgIGNvbnN0IGludGVyZmFjZU5hbWUgPSB0aGlzLm5hbWV1dGlscy5jb252ZXJ0SW50ZXJmYWNlTmFtZShpZmMpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgY29uc3QgbmFtZXNwYWNlID0gdGhpcy5uYW1lc3BhY2VGb3IodGhpcy5hc3NlbWJseSwgaWZjKTtcbiAgICB0aGlzLmNsb3NlRmlsZUlmTmVlZGVkKGludGVyZmFjZU5hbWUsIG5hbWVzcGFjZSwgdGhpcy5pc05lc3RlZChpZmMpKTtcblxuICAgIC8vIGVtaXQgaW1wbGVtZW50YXRpb24gY2xhc3NcbiAgICAvLyBUT0RPOiBJZiBkYXRhdHlwZSB0aGVuIHdlIG1heSBub3QgbmVlZCB0aGUgaW50ZXJmYWNlIHByb3h5IHRvIGJlIGNyZWF0ZWQsIFdlIGNvdWxkIGRvIHdpdGgganVzdCB0aGUgaW50ZXJmYWNlIGltcGw/XG4gICAgaWYgKGlmYy5kYXRhdHlwZSkge1xuICAgICAgdGhpcy5lbWl0SW50ZXJmYWNlRGF0YVR5cGUoaWZjKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnRlcmZhY2VNZXRob2QoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsIG1ldGhvZDogc3BlYy5NZXRob2QpIHtcbiAgICB0aGlzLmRvdG5ldERvY0dlbmVyYXRvci5lbWl0RG9jcyhtZXRob2QsIHtcbiAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICBmcW46IGlmYy5mcW4sXG4gICAgICBtZW1iZXJOYW1lOiBtZXRob2QubmFtZSxcbiAgICB9KTtcbiAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdEF0dHJpYnV0ZXNGb3JNZXRob2QoaWZjLCBtZXRob2QpO1xuICAgIGNvbnN0IHJldHVyblR5cGUgPSBtZXRob2QucmV0dXJuc1xuICAgICAgPyB0aGlzLnR5cGVyZXNvbHZlci50b0RvdE5ldFR5cGUobWV0aG9kLnJldHVybnMudHlwZSlcbiAgICAgIDogJ3ZvaWQnO1xuICAgIGNvbnN0IG51bGxhYmxlID0gbWV0aG9kLnJldHVybnM/Lm9wdGlvbmFsID8gJz8nIDogJyc7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgJHtyZXR1cm5UeXBlfSR7bnVsbGFibGV9ICR7dGhpcy5uYW1ldXRpbHMuY29udmVydE1ldGhvZE5hbWUoXG4gICAgICAgIG1ldGhvZC5uYW1lLFxuICAgICAgKX0oJHt0aGlzLnJlbmRlck1ldGhvZFBhcmFtZXRlcnMobWV0aG9kKX0pO2AsXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkludGVyZmFjZU1ldGhvZE92ZXJsb2FkKFxuICAgIGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlLFxuICAgIG92ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aGlzLm9uSW50ZXJmYWNlTWV0aG9kKGlmYywgb3ZlcmxvYWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW50ZXJmYWNlUHJvcGVydHkoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICBpZiAoIXByb3AuYWJzdHJhY3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJmYWNlIHByb3BlcnRpZXMgbXVzdCBiZSBhYnN0cmFjdDogJHtwcm9wLm5hbWV9YCk7XG4gICAgfVxuXG4gICAgaWYgKHByb3AucHJvdGVjdGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBQcm90ZWN0ZWQgcHJvcGVydGllcyBhcmUgbm90IGFsbG93ZWQgb24gaW50ZXJmYWNlczogJHtwcm9wLm5hbWV9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHByb3Auc3RhdGljKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBQcm9wZXJ0eSAke2lmYy5uYW1lfS4ke3Byb3AubmFtZX0gaXMgbWFya2VkIGFzIHN0YXRpYywgYnV0IGludGVyZmFjZXMgbXVzdCBub3QgY29udGFpbiBzdGF0aWMgbWVtYmVycy5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmVtaXROZXdMaW5lSWZOZWNlc3NhcnkoKTtcbiAgICB0aGlzLmRvdG5ldERvY0dlbmVyYXRvci5lbWl0RG9jcyhwcm9wLCB7XG4gICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgZnFuOiBpZmMuZnFuLFxuICAgICAgbWVtYmVyTmFtZTogcHJvcC5uYW1lLFxuICAgIH0pO1xuICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5lbWl0QXR0cmlidXRlc0ZvclByb3BlcnR5KHByb3ApO1xuXG4gICAgY29uc3QgcHJvcFR5cGUgPSB0aGlzLnR5cGVyZXNvbHZlci50b0RvdE5ldFR5cGUocHJvcC50eXBlKTtcbiAgICBjb25zdCBwcm9wTmFtZSA9IHRoaXMubmFtZXV0aWxzLmNvbnZlcnRQcm9wZXJ0eU5hbWUocHJvcC5uYW1lKTtcblxuICAgIGlmIChwcm9wLm9wdGlvbmFsKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgnW0FtYXpvbi5KU0lJLlJ1bnRpbWUuRGVwdXR5LkpzaWlPcHRpb25hbF0nKTtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWZ5aW5nIHRoYXQgYSB0eXBlIGlzIG51bGxhYmxlIGlzIG9ubHkgcmVxdWlyZWQgZm9yIHByaW1pdGl2ZSB2YWx1ZSB0eXBlc1xuICAgIGNvbnN0IGlzT3B0aW9uYWwgPSBwcm9wLm9wdGlvbmFsID8gJz8nIDogJyc7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgJHtwcm9wVHlwZX0ke2lzT3B0aW9uYWx9ICR7cHJvcE5hbWV9YCk7XG5cbiAgICBpZiAocHJvcC5vcHRpb25hbCkge1xuICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jaygnZ2V0Jyk7XG4gICAgICB0aGlzLmNvZGUubGluZSgncmV0dXJuIG51bGw7Jyk7XG4gICAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgICAgaWYgKCFwcm9wLmltbXV0YWJsZSkge1xuICAgICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCdzZXQnKTtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgICAgYHRocm93IG5ldyBTeXN0ZW0uTm90U3VwcG9ydGVkRXhjZXB0aW9uKFwiJ3NldCcgZm9yICcke3Byb3BOYW1lfScgaXMgbm90IGltcGxlbWVudGVkXCIpO2AsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdnZXQ7Jyk7XG4gICAgICBpZiAoIXByb3AuaW1tdXRhYmxlKSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKCdzZXQ7Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmZsYWdGaXJzdE1lbWJlcldyaXR0ZW4odHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkNsYXNzKGNsczogc3BlYy5DbGFzc1R5cGUsIGFic3RyYWN0OiBib29sZWFuKSB7XG4gICAgbGV0IGJhc2VUeXBlTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbmFtZXNwYWNlID0gdGhpcy5uYW1lc3BhY2VGb3IodGhpcy5hc3NlbWJseSwgY2xzKTtcblxuICAgIC8vIEEgY2xhc3MgY2FuIGRlcml2ZSBmcm9tIG9ubHkgb25lIGJhc2UgY2xhc3NcbiAgICAvLyBCdXQgY2FuIGltcGxlbWVudCBtdWx0aXBsZSBpbnRlcmZhY2VzXG4gICAgaWYgKCFjbHMuYmFzZSkge1xuICAgICAgYmFzZVR5cGVOYW1lcy5wdXNoKCdEZXB1dHlCYXNlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNsYXNzQmFzZSA9IHRoaXMudHlwZXJlc29sdmVyLnRvRG90TmV0VHlwZSh7IGZxbjogY2xzLmJhc2UgfSk7XG4gICAgICBiYXNlVHlwZU5hbWVzLnB1c2goY2xhc3NCYXNlKTtcbiAgICB9XG5cbiAgICBpZiAoY2xzLmludGVyZmFjZXMgJiYgY2xzLmludGVyZmFjZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaW1wbGVtZW50YXRpb25zID1cbiAgICAgICAgdGhpcy50eXBlcmVzb2x2ZXIucmVzb2x2ZUltcGxlbWVudGVkSW50ZXJmYWNlcyhjbHMpO1xuICAgICAgYmFzZVR5cGVOYW1lcyA9IGJhc2VUeXBlTmFtZXMuY29uY2F0KGltcGxlbWVudGF0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydENsYXNzTmFtZShjbHMpO1xuXG4gICAgLy8gTmVzdGVkIGNsYXNzZXMgd2lsbCBiZSBkZWFsdCB3aXRoIGR1cmluZyBjYWxjIGNvZGUgZ2VuZXJhdGlvblxuICAgIGNvbnN0IG5lc3RlZCA9IHRoaXMuaXNOZXN0ZWQoY2xzKTtcbiAgICBjb25zdCBhYnNQcmVmaXggPSBhYnN0cmFjdCA/ICcgYWJzdHJhY3QnIDogJyc7XG5cbiAgICB0aGlzLm9wZW5GaWxlSWZOZWVkZWQoY2xhc3NOYW1lLCBuYW1lc3BhY2UsIG5lc3RlZCk7XG5cbiAgICBjb25zdCBpbXBsZW1lbnRzRXhwciA9IGAgOiAke2Jhc2VUeXBlTmFtZXMuam9pbignLCAnKX1gO1xuXG4gICAgdGhpcy5kb3RuZXREb2NHZW5lcmF0b3IuZW1pdERvY3MoY2xzLCB7XG4gICAgICBhcGk6ICd0eXBlJyxcbiAgICAgIGZxbjogY2xzLmZxbixcbiAgICB9KTtcblxuICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5lbWl0QXR0cmlidXRlc0ZvckNsYXNzKGNscyk7XG5cbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHB1YmxpYyR7YWJzUHJlZml4fSBjbGFzcyAke2NsYXNzTmFtZX0ke2ltcGxlbWVudHNFeHByfWAsXG4gICAgKTtcblxuICAgIC8vIENvbXB1dGUgdGhlIGNsYXNzIHBhcmFtZXRlcnNcbiAgICBsZXQgcGFyYW1ldGVyc0RlZmluaXRpb24gPSAnJztcbiAgICBsZXQgcGFyYW1ldGVyc0Jhc2UgPSAnJztcbiAgICBjb25zdCBpbml0aWFsaXplciA9IGNscy5pbml0aWFsaXplcjtcbiAgICBpZiAoaW5pdGlhbGl6ZXIpIHtcbiAgICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXREb2NzKGluaXRpYWxpemVyLCB7XG4gICAgICAgIGFwaTogJ2luaXRpYWxpemVyJyxcbiAgICAgICAgZnFuOiBjbHMuZnFuLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdERlcHJlY2F0ZWRBdHRyaWJ1dGVJZk5lY2Vzc2FyeShcbiAgICAgICAgaW5pdGlhbGl6ZXIsXG4gICAgICApO1xuICAgICAgaWYgKGluaXRpYWxpemVyLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgcGFyYW1ldGVyc0RlZmluaXRpb24gPSB0aGlzLnJlbmRlclBhcmFtZXRlcnNTdHJpbmcoXG4gICAgICAgICAgaW5pdGlhbGl6ZXIucGFyYW1ldGVycyxcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIGluaXRpYWxpemVyLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICBwYXJhbWV0ZXJzQmFzZSArPSBgJHt0aGlzLm5hbWV1dGlscy5jb252ZXJ0UGFyYW1ldGVyTmFtZShwLm5hbWUpfWA7XG4gICAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgdGhlIGxhc3QgcGFyYW1ldGVyLCBhcHBlbmQgLFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGluaXRpYWxpemVyLnBhcmFtZXRlcnMuaW5kZXhPZihwKSAhPT1cbiAgICAgICAgICAgIGluaXRpYWxpemVyLnBhcmFtZXRlcnMubGVuZ3RoIC0gMVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcGFyYW1ldGVyc0Jhc2UgKz0gJywgJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHRoZSBjb25zdHJ1Y3RvcnM6XG4gICAgICAvLyBBYnN0cmFjdCBjbGFzc2VzIGhhdmUgcHJvdGVjdGVkIGNvbnN0cnVjdG9ycy5cbiAgICAgIGNvbnN0IHZpc2liaWxpdHkgPSBjbHMuYWJzdHJhY3QgPyAncHJvdGVjdGVkJyA6ICdwdWJsaWMnO1xuXG4gICAgICBjb25zdCBhcmdzID1cbiAgICAgICAgcGFyYW1ldGVyc0Jhc2UubGVuZ3RoID4gMFxuICAgICAgICAgID8gYG5ldyBvYmplY3Q/W117JHtwYXJhbWV0ZXJzQmFzZX19YFxuICAgICAgICAgIDogYFN5c3RlbS5BcnJheS5FbXB0eTxvYmplY3Q/PigpYDtcbiAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICAgIGAke3Zpc2liaWxpdHl9ICR7Y2xhc3NOYW1lfSgke3BhcmFtZXRlcnNEZWZpbml0aW9ufSk6IGJhc2UobmV3IERlcHV0eVByb3BzKCR7YXJnc30pKWAsXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnLy8vIDxzdW1tYXJ5PlVzZWQgYnkganNpaSB0byBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIGEgSmF2YXNjcmlwdC1vd25lZCBvYmplY3QgcmVmZXJlbmNlPC9zdW1tYXJ5PicsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICcvLy8gPHBhcmFtIG5hbWU9XCJyZWZlcmVuY2VcIj5UaGUgSmF2YXNjcmlwdC1vd25lZCBvYmplY3QgcmVmZXJlbmNlPC9wYXJhbT4nLFxuICAgICk7XG4gICAgdGhpcy5kb3RuZXRSdW50aW1lR2VuZXJhdG9yLmVtaXREZXByZWNhdGVkQXR0cmlidXRlSWZOZWNlc3NhcnkoaW5pdGlhbGl6ZXIpO1xuICAgIHRoaXMuZW1pdEhpZGVBdHRyaWJ1dGUoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHByb3RlY3RlZCAke2NsYXNzTmFtZX0oQnlSZWZWYWx1ZSByZWZlcmVuY2UpOiBiYXNlKHJlZmVyZW5jZSlgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnLy8vIDxzdW1tYXJ5PlVzZWQgYnkganNpaSB0byBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIERlcHV0eVByb3BzPC9zdW1tYXJ5PicsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnLy8vIDxwYXJhbSBuYW1lPVwicHJvcHNcIj5UaGUgZGVwdXR5IHByb3BzPC9wYXJhbT4nKTtcbiAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdERlcHJlY2F0ZWRBdHRyaWJ1dGVJZk5lY2Vzc2FyeShpbml0aWFsaXplcik7XG4gICAgdGhpcy5lbWl0SGlkZUF0dHJpYnV0ZSgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJvdGVjdGVkICR7Y2xhc3NOYW1lfShEZXB1dHlQcm9wcyBwcm9wcyk6IGJhc2UocHJvcHMpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICAvLyBXZSBoYXZlIGFscmVhZHkgb3V0cHV0dGVkIG1lbWJlcnMgKGNvbnN0cnVjdG9ycyksIHNldHRpbmcgdGhlIGZsYWcgdG8gdHJ1ZVxuICAgIHRoaXMuZmxhZ0ZpcnN0TWVtYmVyV3JpdHRlbih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVuZENsYXNzKGNsczogc3BlYy5DbGFzc1R5cGUpIHtcbiAgICBpZiAoY2xzLmFic3RyYWN0KSB7XG4gICAgICB0aGlzLmVtaXRJbnRlcmZhY2VQcm94eShjbHMpO1xuICAgIH1cblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydENsYXNzTmFtZShjbHMpO1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IHRoaXMubmFtZXNwYWNlRm9yKHRoaXMuYXNzZW1ibHksIGNscyk7XG4gICAgdGhpcy5jbG9zZUZpbGVJZk5lZWRlZChjbGFzc05hbWUsIG5hbWVzcGFjZSwgdGhpcy5pc05lc3RlZChjbHMpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkZpZWxkKFxuICAgIF9jbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIF9wcm9wOiBzcGVjLlByb3BlcnR5LFxuICAgIF91bmlvbj86IHNwZWMuVW5pb25UeXBlUmVmZXJlbmNlLFxuICApIHtcbiAgICAvKiBub29wICovXG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZXRob2QoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIHRoaXMuZW1pdE1ldGhvZChjbHMsIG1ldGhvZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZXRob2RPdmVybG9hZChcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIG92ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aGlzLm9uTWV0aG9kKGNscywgb3ZlcmxvYWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUHJvcGVydHkoY2xzOiBzcGVjLkNsYXNzVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIHRoaXMuZW1pdFByb3BlcnR5KGNscywgcHJvcCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNNZXRob2QoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIHRoaXMuZW1pdE1ldGhvZChjbHMsIG1ldGhvZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNNZXRob2RPdmVybG9hZChcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIG92ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aGlzLmVtaXRNZXRob2QoY2xzLCBvdmVybG9hZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNQcm9wZXJ0eShjbHM6IHNwZWMuQ2xhc3NUeXBlLCBwcm9wOiBzcGVjLlByb3BlcnR5KSB7XG4gICAgaWYgKHByb3AuY29uc3QpIHtcbiAgICAgIHRoaXMuZW1pdENvbnN0UHJvcGVydHkoY2xzLCBwcm9wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0UHJvcGVydHkoY2xzLCBwcm9wKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25VbmlvblByb3BlcnR5KFxuICAgIGNsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgcHJvcDogc3BlYy5Qcm9wZXJ0eSxcbiAgICBfdW5pb246IHNwZWMuVW5pb25UeXBlUmVmZXJlbmNlLFxuICApIHtcbiAgICB0aGlzLmVtaXRQcm9wZXJ0eShjbHMsIHByb3ApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5FbnVtKGVubTogc3BlYy5FbnVtVHlwZSkge1xuICAgIGNvbnN0IGVudW1OYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydFR5cGVOYW1lKGVubS5uYW1lKTtcbiAgICBjb25zdCBuYW1lc3BhY2UgPSB0aGlzLm5hbWVzcGFjZUZvcih0aGlzLmFzc2VtYmx5LCBlbm0pO1xuICAgIHRoaXMub3BlbkZpbGVJZk5lZWRlZChlbnVtTmFtZSwgbmFtZXNwYWNlLCB0aGlzLmlzTmVzdGVkKGVubSkpO1xuICAgIHRoaXMuZW1pdE5ld0xpbmVJZk5lY2Vzc2FyeSgpO1xuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXREb2NzKGVubSwge1xuICAgICAgYXBpOiAndHlwZScsXG4gICAgICBmcW46IGVubS5mcW4sXG4gICAgfSk7XG4gICAgdGhpcy5kb3RuZXRSdW50aW1lR2VuZXJhdG9yLmVtaXRBdHRyaWJ1dGVzRm9yRW51bShlbm0sIGVudW1OYW1lKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBwdWJsaWMgZW51bSAke2VubS5uYW1lfWApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kRW51bShlbm06IHNwZWMuRW51bVR5cGUpIHtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIGNvbnN0IGVudW1OYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydFR5cGVOYW1lKGVubS5uYW1lKTtcbiAgICBjb25zdCBuYW1lc3BhY2UgPSB0aGlzLm5hbWVzcGFjZUZvcih0aGlzLmFzc2VtYmx5LCBlbm0pO1xuICAgIHRoaXMuY2xvc2VGaWxlSWZOZWVkZWQoZW51bU5hbWUsIG5hbWVzcGFjZSwgdGhpcy5pc05lc3RlZChlbm0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVudW1NZW1iZXIoZW5tOiBzcGVjLkVudW1UeXBlLCBtZW1iZXI6IHNwZWMuRW51bU1lbWJlcikge1xuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXREb2NzKG1lbWJlciwge1xuICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgIGZxbjogZW5tLmZxbixcbiAgICAgIG1lbWJlck5hbWU6IG1lbWJlci5uYW1lLFxuICAgIH0pO1xuICAgIGNvbnN0IGVudW1NZW1iZXJOYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydEVudW1NZW1iZXJOYW1lKG1lbWJlci5uYW1lKTtcbiAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdEF0dHJpYnV0ZXNGb3JFbnVtTWVtYmVyKFxuICAgICAgZW51bU1lbWJlck5hbWUsXG4gICAgICBtZW1iZXIsXG4gICAgKTtcbiAgICAvLyBJZiB3ZSBhcmUgb24gdGhlIGxhc3QgZW51bSBtZW1iZXIsIHdlIGRvbid0IG5lZWQgYSBjb21tYVxuICAgIGlmIChlbm0ubWVtYmVycy5pbmRleE9mKG1lbWJlcikgIT09IGVubS5tZW1iZXJzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKGAke2VudW1NZW1iZXJOYW1lfSxgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYCR7ZW51bU1lbWJlck5hbWV9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBuYW1lc3BhY2VGb3IoYXNzbTogc3BlYy5Bc3NlbWJseSwgdHlwZTogc3BlYy5UeXBlKTogc3RyaW5nIHtcbiAgICBsZXQgbnMgPSB0eXBlLm5hbWVzcGFjZTtcbiAgICB3aGlsZSAobnMgIT0gbnVsbCAmJiBhc3NtLnR5cGVzPy5bYCR7YXNzbS5uYW1lfS4ke25zfWBdICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IG5lc3RpbmcgPSBhc3NtLnR5cGVzW2Ake2Fzc20ubmFtZX0uJHtuc31gXTtcbiAgICAgIG5zID0gbmVzdGluZy5uYW1lc3BhY2U7XG4gICAgfVxuICAgIGlmIChucyAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy50eXBlcmVzb2x2ZXIucmVzb2x2ZU5hbWVzcGFjZShhc3NtLCBhc3NtLm5hbWUsIG5zKTtcbiAgICB9XG4gICAgcmV0dXJuIGFzc20udGFyZ2V0cyEuZG90bmV0IS5uYW1lc3BhY2U7XG4gIH1cblxuICBwcml2YXRlIGVtaXRNZXRob2QoXG4gICAgY2xzOiBzcGVjLkNsYXNzVHlwZSB8IHNwZWMuSW50ZXJmYWNlVHlwZSxcbiAgICBtZXRob2Q6IHNwZWMuTWV0aG9kLFxuICAgIGVtaXRGb3JQcm94eU9yRGF0YXR5cGUgPSBmYWxzZSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5lbWl0TmV3TGluZUlmTmVjZXNzYXJ5KCk7XG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IG1ldGhvZC5yZXR1cm5zXG4gICAgICA/IHRoaXMudHlwZXJlc29sdmVyLnRvRG90TmV0VHlwZShtZXRob2QucmV0dXJucy50eXBlKVxuICAgICAgOiAndm9pZCc7XG4gICAgY29uc3Qgc3RhdGljS2V5V29yZCA9IG1ldGhvZC5zdGF0aWMgPyAnc3RhdGljICcgOiAnJztcbiAgICBsZXQgb3ZlcnJpZGVLZXlXb3JkID0gJyc7XG4gICAgbGV0IHZpcnR1YWxLZXlXb3JkID0gJyc7XG5cbiAgICBsZXQgZGVmaW5lZE9uQW5jZXN0b3IgPSBmYWxzZTtcbiAgICAvLyBJbiB0aGUgY2FzZSBvZiB0aGUgc291cmNlIGJlaW5nIGEgY2xhc3MsIHdlIGNoZWNrIGlmIGl0IGlzIGFscmVhZHkgZGVmaW5lZCBvbiBhbiBhbmNlc3RvclxuICAgIGlmIChzcGVjLmlzQ2xhc3NUeXBlKGNscykpIHtcbiAgICAgIGRlZmluZWRPbkFuY2VzdG9yID0gdGhpcy5pc01lbWJlckRlZmluZWRPbkFuY2VzdG9yKGNscywgbWV0aG9kKTtcbiAgICB9XG4gICAgLy8gVGhlIG1ldGhvZCBpcyBhbiBvdmVycmlkZSBpZiBpdCdzIGRlZmluZWQgb24gdGhlIGFuY2VzdG9yLCBvciBpZiB0aGUgcGFyZW50IGlzIGEgY2xhc3MgYW5kIHdlIGFyZSBnZW5lcmF0aW5nIGEgcHJveHkgb3IgZGF0YXR5cGUgY2xhc3NcbiAgICBsZXQgb3ZlcnJpZGVzID1cbiAgICAgIGRlZmluZWRPbkFuY2VzdG9yIHx8IChzcGVjLmlzQ2xhc3NUeXBlKGNscykgJiYgZW1pdEZvclByb3h5T3JEYXRhdHlwZSk7XG4gICAgLy8gV2UgYWxzbyBpbnNwZWN0IHRoZSBqc2lpIG1vZGVsIHRvIHNlZSBpZiBpdCBvdmVycmlkZXMgYSBjbGFzcyBtZW1iZXIuXG4gICAgaWYgKG1ldGhvZC5vdmVycmlkZXMpIHtcbiAgICAgIGNvbnN0IG92ZXJyaWRlVHlwZSA9IHRoaXMuZmluZFR5cGUobWV0aG9kLm92ZXJyaWRlcyk7XG4gICAgICBpZiAoc3BlYy5pc0NsYXNzVHlwZShvdmVycmlkZVR5cGUpKSB7XG4gICAgICAgIC8vIE92ZXJyaWRlcyBhIGNsYXNzLCBuZWVkcyBvdmVycmlkZXMga2V5d29yZFxuICAgICAgICBvdmVycmlkZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3ZlcnJpZGVzKSB7XG4gICAgICAvLyBBZGQgdGhlIG92ZXJyaWRlIGtleSB3b3JkIGlmIHRoZSBtZXRob2QgaXMgZW1pdHRlZCBmb3IgYSBwcm94eSBvciBkYXRhIHR5cGUgb3IgaXMgZGVmaW5lZCBvbiBhbiBhbmNlc3Rvci4gSWZcbiAgICAgIC8vIHRoZSBtZW1iZXIgaXMgc3RhdGljLCB1c2UgdGhlIFwibmV3XCIga2V5d29yZCBpbnN0ZWFkLCB0byBpbmRpY2F0ZSB3ZSBhcmUgaW50ZW50aW9uYWxseSBoaWRpbmcgdGhlIGFuY2VzdG9yXG4gICAgICAvLyBkZWNsYXJhdGlvbiAoYXMgQyMgZG9lcyBub3QgaW5oZXJpdCBzdGF0aWNzLCB0aGV5IGNhbiBiZSBoaWRkZW4gYnV0IG5vdCBvdmVycmlkZGVuKS4gVGhlIFwibmV3XCIga2V5d29yZCBpc1xuICAgICAgLy8gb3B0aW9uYWwgaW4gdGhpcyBjb250ZXh0LCBidXQgaGVscHMgY2xhcmlmeSBpbnRlbnRpb24uXG4gICAgICBvdmVycmlkZUtleVdvcmQgPSBtZXRob2Quc3RhdGljID8gJ25ldyAnIDogJ292ZXJyaWRlICc7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICFtZXRob2Quc3RhdGljICYmXG4gICAgICAobWV0aG9kLmFic3RyYWN0IHx8ICFkZWZpbmVkT25BbmNlc3RvcikgJiZcbiAgICAgICFlbWl0Rm9yUHJveHlPckRhdGF0eXBlXG4gICAgKSB7XG4gICAgICAvLyBBZGQgdGhlIHZpcnR1YWwga2V5IHdvcmQgaWYgdGhlIG1ldGhvZCBpcyBhYnN0cmFjdCBvciBub3QgZGVmaW5lZCBvbiBhbiBhbmNlc3RvciBhbmQgd2UgYXJlIE5PVCBnZW5lcmF0aW5nIGEgcHJveHkgb3IgZGF0YXR5cGUgY2xhc3NcbiAgICAgIC8vIE1ldGhvZHMgc2hvdWxkIGFsd2F5cyBiZSB2aXJ0dWFsIHdoZW4gcG9zc2libGVcbiAgICAgIHZpcnR1YWxLZXlXb3JkID0gJ3ZpcnR1YWwgJztcbiAgICB9XG5cbiAgICBjb25zdCBhY2Nlc3MgPSB0aGlzLnJlbmRlckFjY2Vzc0xldmVsKG1ldGhvZCk7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHRoaXMubmFtZXV0aWxzLmNvbnZlcnRNZXRob2ROYW1lKG1ldGhvZC5uYW1lKTtcblxuICAgIGNvbnN0IGlzT3B0aW9uYWwgPSBtZXRob2QucmV0dXJucyAmJiBtZXRob2QucmV0dXJucy5vcHRpb25hbCA/ICc/JyA6ICcnO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGAke3JldHVyblR5cGV9JHtpc09wdGlvbmFsfSAke21ldGhvZE5hbWV9KCR7dGhpcy5yZW5kZXJNZXRob2RQYXJhbWV0ZXJzKFxuICAgICAgbWV0aG9kLFxuICAgICl9KWA7XG5cbiAgICB0aGlzLmRvdG5ldERvY0dlbmVyYXRvci5lbWl0RG9jcyhtZXRob2QsIHtcbiAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICBmcW46IGNscy5mcW4sXG4gICAgICBtZW1iZXJOYW1lOiBtZXRob2QubmFtZSxcbiAgICB9KTtcbiAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdEF0dHJpYnV0ZXNGb3JNZXRob2QoXG4gICAgICBjbHMsXG4gICAgICBtZXRob2QgLyosIGVtaXRGb3JQcm94eU9yRGF0YXR5cGUqLyxcbiAgICApO1xuXG4gICAgaWYgKG1ldGhvZC5hYnN0cmFjdCkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYCR7YWNjZXNzfSAke292ZXJyaWRlS2V5V29yZH1hYnN0cmFjdCAke3NpZ25hdHVyZX07YCk7XG4gICAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICBgJHthY2Nlc3N9ICR7c3RhdGljS2V5V29yZH0ke292ZXJyaWRlS2V5V29yZH0ke3ZpcnR1YWxLZXlXb3JkfSR7c2lnbmF0dXJlfWAsXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5jcmVhdGVJbnZva2VNZXRob2RJZGVudGlmaWVyKFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICBjbHMgYXMgc3BlYy5DbGFzc1R5cGUsXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm91bmRzIG91dCBpZiBhIG1lbWJlciAocHJvcGVydHkgb3IgbWV0aG9kKSBpcyBhbHJlYWR5IGRlZmluZWQgaW4gb25lIG9mIHRoZSBiYXNlIGNsYXNzZXNcbiAgICpcbiAgICogVXNlZCB0byBmaWd1cmUgb3V0IGlmIHRoZSBvdmVycmlkZSBvciB2aXJ0dWFsIGtleXdvcmRzIGFyZSBuZWNlc3NhcnkuXG4gICAqL1xuICBwcml2YXRlIGlzTWVtYmVyRGVmaW5lZE9uQW5jZXN0b3IoXG4gICAgY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBtZW1iZXI6IHNwZWMuUHJvcGVydHkgfCBzcGVjLk1ldGhvZCxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKG1lbWJlciBhcyBzcGVjLk1ldGhvZCkge1xuICAgICAgY29uc3Qgb2JqZWN0TWV0aG9kcyA9IFsnVG9TdHJpbmcnLCAnR2V0SGFzaENvZGUnLCAnRXF1YWxzJ107XG4gICAgICAvLyBNZXRob2RzIGRlZmluZWQgb24gdGhlIE9iamVjdCBjbGFzcyBzaG91bGQgYmUgb3ZlcnJpZGRlbiwgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoXG4gICAgICAgIG9iamVjdE1ldGhvZHMuaW5jbHVkZXModGhpcy5uYW1ldXRpbHMuY29udmVydE1ldGhvZE5hbWUobWVtYmVyLm5hbWUpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGJhc2UgPSBjbHMuYmFzZTtcbiAgICBpZiAoYmFzZSkge1xuICAgICAgY29uc3QgYmFzZVR5cGUgPSB0aGlzLmZpbmRUeXBlKGJhc2UpIGFzIHNwZWMuQ2xhc3NUeXBlO1xuXG4gICAgICBpZiAobWVtYmVyIGFzIHNwZWMuUHJvcGVydHkpIHtcbiAgICAgICAgaWYgKGJhc2VUeXBlLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBiYXNlVHlwZS5wcm9wZXJ0aWVzLmZpbHRlcihcbiAgICAgICAgICAgICAgKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lID09PSBtZW1iZXIubmFtZSxcbiAgICAgICAgICAgICkubGVuZ3RoID4gMFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gcHJvcGVydHkgZm91bmQgaW4gYmFzZSBwYXJlbnRcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pc01lbWJlckRlZmluZWRPbkFuY2VzdG9yKGJhc2VUeXBlLCBtZW1iZXIpO1xuICAgICAgfSBlbHNlIGlmIChtZW1iZXIgYXMgc3BlYy5NZXRob2QpIHtcbiAgICAgICAgaWYgKGJhc2VUeXBlLm1ldGhvZHMpIHtcbiAgICAgICAgICBjb25zdCBteU1ldGhvZCA9IG1lbWJlciBhcyBzcGVjLk1ldGhvZDtcbiAgICAgICAgICAvLyBJZiB0aGUgbmFtZSwgcGFyYW1ldGVycyBhbmQgcmV0dXJucyBhcmUgc2ltaWxhciB0aGVuIGl0IGlzIHRoZSBzYW1lIG1ldGhvZCBpbiAuTkVUXG4gICAgICAgICAgZm9yIChjb25zdCBtIG9mIGJhc2VUeXBlLm1ldGhvZHMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgbS5uYW1lID09PSBteU1ldGhvZC5uYW1lICYmXG4gICAgICAgICAgICAgIG0ucGFyYW1ldGVycyA9PT0gbXlNZXRob2QucGFyYW1ldGVycyAmJlxuICAgICAgICAgICAgICBtLnJldHVybnMgPT09IG15TWV0aG9kLnJldHVybnNcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNNZW1iZXJEZWZpbmVkT25BbmNlc3RvcihiYXNlVHlwZSwgbWVtYmVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgbWV0aG9kIHBhcmFtZXRlcnMgc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIHJlbmRlck1ldGhvZFBhcmFtZXRlcnMobWV0aG9kOiBzcGVjLk1ldGhvZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyUGFyYW1ldGVyc1N0cmluZyhtZXRob2QucGFyYW1ldGVycyk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBwYXJhbWV0ZXJzIHN0cmluZyBmb3IgbWV0aG9kcyBvciBjb25zdHJ1Y3RvcnNcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyUGFyYW1ldGVyc1N0cmluZyhcbiAgICBwYXJhbWV0ZXJzOiBzcGVjLlBhcmFtZXRlcltdIHwgdW5kZWZpbmVkLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xuICAgIGlmIChwYXJhbWV0ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgcGFyYW1ldGVycykge1xuICAgICAgICBsZXQgb3B0aW9uYWxQcmltaXRpdmUgPSAnJztcbiAgICAgICAgbGV0IG9wdGlvbmFsS2V5d29yZCA9ICcnO1xuICAgICAgICBsZXQgdHlwZSA9IHRoaXMudHlwZXJlc29sdmVyLnRvRG90TmV0VHlwZShwLnR5cGUpO1xuICAgICAgICBpZiAocC5vcHRpb25hbCkge1xuICAgICAgICAgIG9wdGlvbmFsS2V5d29yZCA9ICcgPSBudWxsJztcbiAgICAgICAgICBpZiAocC5vcHRpb25hbCkge1xuICAgICAgICAgICAgb3B0aW9uYWxQcmltaXRpdmUgPSAnPyc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHAudmFyaWFkaWMpIHtcbiAgICAgICAgICB0eXBlID0gYHBhcmFtcyAke3R5cGV9W11gO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0ID0gYCR7dHlwZX0ke29wdGlvbmFsUHJpbWl0aXZlfSAke3RoaXMubmFtZXV0aWxzLmNvbnZlcnRQYXJhbWV0ZXJOYW1lKFxuICAgICAgICAgIHAubmFtZSxcbiAgICAgICAgKX0ke29wdGlvbmFsS2V5d29yZH1gO1xuICAgICAgICBwYXJhbXMucHVzaChzdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXMuam9pbignLCAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBhbiBpbnRlcmZhY2UgcHJveHkgZm9yIGFuIGludGVyZmFjZSBvciBhbiBhYnN0cmFjdCBjbGFzcy5cbiAgICovXG4gIHByaXZhdGUgZW1pdEludGVyZmFjZVByb3h5KGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlIHwgc3BlYy5DbGFzc1R5cGUpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gJ19Qcm94eSc7XG4gICAgY29uc3QgbmFtZXNwYWNlID0gdGhpcy5uYW1lc3BhY2VGb3IodGhpcy5hc3NlbWJseSwgaWZjKTtcbiAgICBjb25zdCBpc05lc3RlZCA9IHRydWU7XG4gICAgdGhpcy5vcGVuRmlsZUlmTmVlZGVkKG5hbWUsIG5hbWVzcGFjZSwgaXNOZXN0ZWQpO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmRvdG5ldERvY0dlbmVyYXRvci5lbWl0RG9jcyhpZmMsIHtcbiAgICAgIGFwaTogJ3R5cGUnLFxuICAgICAgZnFuOiBpZmMuZnFuLFxuICAgIH0pO1xuICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5lbWl0QXR0cmlidXRlc0ZvckludGVyZmFjZVByb3h5KGlmYyk7XG5cbiAgICBjb25zdCBpbnRlcmZhY2VGcW4gPSB0aGlzLnR5cGVyZXNvbHZlci50b05hdGl2ZUZxbihpZmMuZnFuKTtcbiAgICBjb25zdCBzdWZmaXggPSBzcGVjLmlzSW50ZXJmYWNlVHlwZShpZmMpXG4gICAgICA/IGA6IERlcHV0eUJhc2UsICR7aW50ZXJmYWNlRnFufWBcbiAgICAgIDogYDogJHtpbnRlcmZhY2VGcW59YDtcbiAgICBjb25zdCBuZXdNb2RpZmllciA9IHRoaXMucHJveHlNdXN0VXNlTmV3TW9kaWZpZXIoaWZjKSA/ICduZXcgJyA6ICcnO1xuXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGAke25ld01vZGlmaWVyfWludGVybmFsIHNlYWxlZCBjbGFzcyAke25hbWV9ICR7c3VmZml4fWAsXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgcHJpdmF0ZSBjb25zdHJ1Y3RvclxuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJpdmF0ZSAke25hbWV9KEJ5UmVmVmFsdWUgcmVmZXJlbmNlKTogYmFzZShyZWZlcmVuY2UpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICAvLyBXZSBoYXZlIGFscmVhZHkgb3V0cHV0IGEgbWVtYmVyIChjb25zdHJ1Y3RvciksIHNldHRpbmcgdGhlIGZpcnN0IG1lbWJlciBmbGFnIHRvIHRydWVcbiAgICB0aGlzLmZsYWdGaXJzdE1lbWJlcldyaXR0ZW4odHJ1ZSk7XG5cbiAgICBjb25zdCBkYXRhdHlwZSA9IGZhbHNlO1xuICAgIGNvbnN0IHByb3h5ID0gdHJ1ZTtcbiAgICB0aGlzLmVtaXRJbnRlcmZhY2VNZW1iZXJzRm9yUHJveHlPckRhdGF0eXBlKGlmYywgZGF0YXR5cGUsIHByb3h5KTtcblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jbG9zZUZpbGVJZk5lZWRlZChuYW1lLCBuYW1lc3BhY2UsIGlzTmVzdGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW55IGFuY2VzdG9yIG9mIHRoZSBnaXZlbiB0eXBlIG11c3QgdXNlIHRoZSBgbmV3YFxuICAgKiBtb2RpZmllciB3aGVuIGludHJvZHVjaW5nIGl0J3Mgb3duIHByb3h5LlxuICAgKlxuICAgKiBJZiB0aGUgdHlwZSBpcyBhIGBjbGFzc2AsIHRoZW4gaXQgbXVzdCB1c2UgYG5ld2AgaWYgaXQgZXh0ZW5kcyBhbm90aGVyXG4gICAqIGFic3RyYWN0IGNsYXNzIGRlZmluZWQgaW4gdGhlIHNhbWUgYXNzZW1ibHkgKHNpbmNlIHByb3hpZXMgYXJlIGludGVybmFsLFxuICAgKiBleHRlcm5hbCB0eXBlcycgcHJveGllcyBhcmUgbm90IHZpc2libGUgaW4gdGhhdCBjb250ZXh0KS5cbiAgICpcbiAgICogSWYgdGhlIHR5cGUgaXMgYW4gYGludGVyZmFjZWAsIHRoZW4gaXQgbXVzdCB1c2UgYG5ld2AgaWYgaXQgZXh0ZW5kcyBhbm90aGVyXG4gICAqIGludGVyZmFjZSBmcm9tIHRoZSBzYW1lIGFzc2VtYmx5LlxuICAgKlxuICAgKiBAcGFyYW0gdHlwZSB0aGUgdGVzdGVkIHByb3h5LWFibGUgdHlwZSAoYW4gYWJzdHJhY3QgY2xhc3Mgb3IgYW4gaW50ZXJmYWNlKS5cbiAgICpcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBhbnkgYW5jZXN0b3Igb2YgdGhpcyB0eXBlIGhhcyBhIHZpc2libGUgcHJveHkuXG4gICAqL1xuICBwcml2YXRlIHByb3h5TXVzdFVzZU5ld01vZGlmaWVyKFxuICAgIHR5cGU6IHNwZWMuQ2xhc3NUeXBlIHwgc3BlYy5JbnRlcmZhY2VUeXBlLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoc3BlYy5pc0NsYXNzVHlwZSh0eXBlKSkge1xuICAgICAgaWYgKHR5cGUuYmFzZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmFzZSA9IHRoaXMuZmluZFR5cGUodHlwZS5iYXNlKSBhcyBzcGVjLkNsYXNzVHlwZTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGJhc2UuYXNzZW1ibHkgPT09IHR5cGUuYXNzZW1ibHkgJiZcbiAgICAgICAgKGJhc2UuYWJzdHJhY3RcbiAgICAgICAgICA/IHRydWVcbiAgICAgICAgICA6IC8vIEFuIGFic3RyYWN0IGNsYXNzIGNvdWxkIGV4dGVuZCBhIGNvbmNyZXRlIGNsYXNzLi4uIFdlIG11c3Qgd2FsayB1cCB0aGUgaW5oZXJpdGFuY2UgdHJlZSBpbiB0aGlzIGNhc2UuLi5cbiAgICAgICAgICAgIHRoaXMucHJveHlNdXN0VXNlTmV3TW9kaWZpZXIoYmFzZSkpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICB0eXBlLmludGVyZmFjZXM/LmZpbmQoXG4gICAgICAgIChmcW4pID0+IHRoaXMuZmluZFR5cGUoZnFuKS5hc3NlbWJseSA9PT0gdHlwZS5hc3NlbWJseSxcbiAgICAgICkgIT0gbnVsbFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgYW4gSW50ZXJmYWNlIERhdGF0eXBlIGNsYXNzXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZCB0byBlbWl0IGEgY2xhc3MgaW1wbGVtZW50aW5nIGFuIGludGVyZmFjZSB3aGVuIHRoZSBkYXRhdHlwZSBwcm9wZXJ0eSBpcyB0cnVlIGluIHRoZSBqc2lpIG1vZGVsXG4gICAqIFRoZSBnZW5lcmF0aW9uIG9mIHRoZSBpbnRlcmZhY2UgcHJveHkgbWF5IG5vdCBiZSBuZWVkZWQgaWYgdGhlIGludGVyZmFjZSBpcyBhbHNvIHNldCBhcyBhIGRhdGF0eXBlXG4gICAqL1xuICBwcml2YXRlIGVtaXRJbnRlcmZhY2VEYXRhVHlwZShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSk6IHZvaWQge1xuICAgIC8vIEludGVyZmFjZSBkYXRhdHlwZXMgZG8gbm90IG5lZWQgdG8gYmUgcHJlZml4ZWQgYnkgSSwgd2UgY2FuIGNhbGwgY29udmVydENsYXNzTmFtZVxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLm5hbWV1dGlscy5jb252ZXJ0Q2xhc3NOYW1lKGlmYyk7XG4gICAgY29uc3QgbmFtZXNwYWNlID0gdGhpcy5uYW1lc3BhY2VGb3IodGhpcy5hc3NlbWJseSwgaWZjKTtcbiAgICBjb25zdCBpc05lc3RlZCA9IHRoaXMuaXNOZXN0ZWQoaWZjKTtcbiAgICB0aGlzLm9wZW5GaWxlSWZOZWVkZWQobmFtZSwgbmFtZXNwYWNlLCBpc05lc3RlZCk7XG5cbiAgICBpZiAoaWZjLnByb3BlcnRpZXM/LmZpbmQoKHByb3ApID0+ICFwcm9wLm9wdGlvbmFsKSAhPSBudWxsKSB7XG4gICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGJlIGFubm95ZWQgYnkgdGhlIGxhY2sgb2YgaW5pdGlhbGl6YXRpb24gb2Ygbm9uLW51bGxhYmxlIGZpZWxkcyBpbiB0aGlzIGNhc2UuXG4gICAgICB0aGlzLmNvZGUubGluZSgnI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgQ1M4NjE4Jyk7XG4gICAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIH1cblxuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXREb2NzKGlmYywge1xuICAgICAgYXBpOiAndHlwZScsXG4gICAgICBmcW46IGlmYy5mcW4sXG4gICAgfSk7XG4gICAgY29uc3Qgc3VmZml4ID0gYDogJHt0aGlzLnR5cGVyZXNvbHZlci50b05hdGl2ZUZxbihpZmMuZnFuKX1gO1xuICAgIHRoaXMuZG90bmV0UnVudGltZUdlbmVyYXRvci5lbWl0QXR0cmlidXRlc0ZvckludGVyZmFjZURhdGF0eXBlKGlmYyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgcHVibGljIGNsYXNzICR7bmFtZX0gJHtzdWZmaXh9YCk7XG4gICAgdGhpcy5mbGFnRmlyc3RNZW1iZXJXcml0dGVuKGZhbHNlKTtcbiAgICBjb25zdCBkYXRhdHlwZSA9IHRydWU7XG4gICAgY29uc3QgcHJveHkgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXRJbnRlcmZhY2VNZW1iZXJzRm9yUHJveHlPckRhdGF0eXBlKGlmYywgZGF0YXR5cGUsIHByb3h5KTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY2xvc2VGaWxlSWZOZWVkZWQobmFtZSwgbmFtZXNwYWNlLCBpc05lc3RlZCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHRoZSBib2R5IG9mIHRoZSBpbnRlcmZhY2UgcHJveHkgb3IgZGF0YSB0eXBlIGNsYXNzXG4gICAqXG4gICAqIFRoaXMgbG9vcHMgdGhyb3VnaCBhbGwgdGhlIG1lbWJlciBhbmQgZ2VuZXJhdGVzIHRoZW1cbiAgICovXG4gIHByaXZhdGUgZW1pdEludGVyZmFjZU1lbWJlcnNGb3JQcm94eU9yRGF0YXR5cGUoXG4gICAgaWZjOiBzcGVjLkludGVyZmFjZVR5cGUgfCBzcGVjLkNsYXNzVHlwZSxcbiAgICBkYXRhdHlwZTogYm9vbGVhbixcbiAgICBwcm94eTogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgLy8gVGhlIGtleSBpcyBpbiB0aGUgZm9ybSAnbWV0aG9kLm5hbWU7cGFyYW1ldGVyMTtwYXJhbWV0ZXIyOycgZXRjXG4gICAgY29uc3QgbWV0aG9kczogTWFwPHN0cmluZywgc3BlYy5NZXRob2Q+ID0gbmV3IE1hcDxzdHJpbmcsIHNwZWMuTWV0aG9kPigpO1xuICAgIC8qXG4gICAgICAgICAgT25seSBnZXQgdGhlIGZpcnN0IGRlY2xhcmF0aW9uIGVuY291bnRlcmVkLCBhbmQga2VlcCBpdCBpZiBpdCBpcyBhYnN0cmFjdC4gVGhlIGxpc3QgY29udGFpbnMgQUxMXG4gICAgICAgICAgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBlbmNvdW50ZXJlZCwgaW4gdGhlIG9yZGVyIGVuY291bnRlcmVkLiBBbiBhYnN0cmFjdCBjbGFzcyBjYW4gaGF2ZSBjb25jcmV0ZVxuICAgICAgICAgIGltcGxlbWVudGF0aW9ucy4gVGhlcmVmb3JlLCB3ZSBvbmx5IGdlbmVyYXRlIG1ldGhvZHMvcHJvcGVydGllcyBpZiB0aGUgZmlyc3QgbWVtYmVyIGVuY291bnRlcmVkXG4gICAgICAgICAgaXMgdW5pbXBsZW1lbnRlZC5cbiAgICAgICAgKi9cbiAgICBjb25zdCBleGNsdWRlZE1ldGhvZDogc3RyaW5nW10gPSBbXTsgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIG1ldGhvZHMgd2UgYWxyZWFkeSByYW4gaW50byBhbmQgZG9uJ3Qgd2FudCB0byBlbWl0XG4gICAgY29uc3QgZXhjbHVkZWRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdOyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgcHJvcGVydGllcyB3ZSBhbHJlYWR5IHJhbiBpbnRvIGFuZCBkb24ndCB3YW50IHRvIGVtaXRcbiAgICBjb25zdCBwcm9wZXJ0aWVzOiB7IFtuYW1lOiBzdHJpbmddOiBzcGVjLlByb3BlcnR5IH0gPSB7fTtcbiAgICBjb25zdCBjb2xsZWN0QWJzdHJhY3RNZW1iZXJzID0gKFxuICAgICAgY3VycmVudFR5cGU6IHNwZWMuSW50ZXJmYWNlVHlwZSB8IHNwZWMuQ2xhc3NUeXBlLFxuICAgICkgPT4ge1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGN1cnJlbnRUeXBlLnByb3BlcnRpZXMgPz8gW10pIHtcbiAgICAgICAgaWYgKCFleGNsdWRlZFByb3BlcnRpZXMuaW5jbHVkZXMocHJvcC5uYW1lKSkge1xuICAgICAgICAgIC8vIElmIHdlIGhhdmUgbmV2ZXIgcnVuIGludG8gdGhpcyBwcm9wZXJ0eSBiZWZvcmUgYW5kIGl0IGlzIGFic3RyYWN0LCB3ZSBrZWVwIGl0XG4gICAgICAgICAgaWYgKHByb3AuYWJzdHJhY3QpIHtcbiAgICAgICAgICAgIHByb3BlcnRpZXNbcHJvcC5uYW1lXSA9IHByb3A7XG4gICAgICAgICAgfVxuICAgICAgICAgIGV4Y2x1ZGVkUHJvcGVydGllcy5wdXNoKHByb3AubmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2YgY3VycmVudFR5cGUubWV0aG9kcyA/PyBbXSkge1xuICAgICAgICBsZXQgbWV0aG9kUGFyYW1ldGVycyA9ICcnO1xuICAgICAgICBpZiAobWV0aG9kLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICBtZXRob2QucGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbSkgPT4ge1xuICAgICAgICAgICAgbWV0aG9kUGFyYW1ldGVycyArPSBgOyR7dGhpcy50eXBlcmVzb2x2ZXIudG9Eb3ROZXRUeXBlKFxuICAgICAgICAgICAgICBwYXJhbS50eXBlLFxuICAgICAgICAgICAgKX1gO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXhjbHVkZWRNZXRob2QuaW5jbHVkZXMoYCR7bWV0aG9kLm5hbWV9JHttZXRob2RQYXJhbWV0ZXJzfWApKSB7XG4gICAgICAgICAgLy8gSWYgd2UgaGF2ZSBuZXZlciBydW4gaW50byB0aGlzIG1ldGhvZCBiZWZvcmUgYW5kIGl0IGlzIGFic3RyYWN0LCB3ZSBrZWVwIGl0XG4gICAgICAgICAgaWYgKG1ldGhvZC5hYnN0cmFjdCkge1xuICAgICAgICAgICAgbWV0aG9kcy5zZXQoYCR7bWV0aG9kLm5hbWV9JHttZXRob2RQYXJhbWV0ZXJzfWAsIG1ldGhvZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGV4Y2x1ZGVkTWV0aG9kLnB1c2goYCR7bWV0aG9kLm5hbWV9JHttZXRob2RQYXJhbWV0ZXJzfWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VzID0gbmV3IEFycmF5PHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlPigpO1xuICAgICAgYmFzZXMucHVzaChcbiAgICAgICAgLi4uKGN1cnJlbnRUeXBlLmludGVyZmFjZXMgPz8gW10pLm1hcCgoaWZhY2UpID0+IHRoaXMuZmluZFR5cGUoaWZhY2UpKSxcbiAgICAgICk7XG4gICAgICBpZiAoc3BlYy5pc0NsYXNzVHlwZShjdXJyZW50VHlwZSkgJiYgY3VycmVudFR5cGUuYmFzZSkge1xuICAgICAgICBiYXNlcy5wdXNoKHRoaXMuZmluZFR5cGUoY3VycmVudFR5cGUuYmFzZSkpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBiYXNlIG9mIGJhc2VzKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpbmRUeXBlKGJhc2UuZnFuKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHR5cGUua2luZCAhPT0gc3BlYy5UeXBlS2luZC5JbnRlcmZhY2UgJiZcbiAgICAgICAgICB0eXBlLmtpbmQgIT09IHNwZWMuVHlwZUtpbmQuQ2xhc3NcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEJhc2UgaW50ZXJmYWNlcyBvZiBhbiBpbnRlcmZhY2UgbXVzdCBiZSBhbiBpbnRlcmZhY2Ugb3IgYSBjbGFzcyAoJHtiYXNlLmZxbn0gaXMgb2YgdHlwZSAke3R5cGUua2luZH0pYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbGxlY3RBYnN0cmFjdE1lbWJlcnModHlwZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBjb2xsZWN0QWJzdHJhY3RNZW1iZXJzKGlmYyk7XG5cbiAgICAvLyBlbWl0IGFsbCBwcm9wZXJ0aWVzXG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKSkge1xuICAgICAgY29uc3QgcHJvcCA9IGNsb25lKHByb3BlcnRpZXNbcHJvcE5hbWVdKTtcbiAgICAgIHByb3AuYWJzdHJhY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuZW1pdFByb3BlcnR5KGlmYywgcHJvcCwgZGF0YXR5cGUsIHByb3h5KTtcbiAgICB9XG4gICAgLy8gZW1pdCBhbGwgdGhlIG1ldGhvZHNcbiAgICBmb3IgKGNvbnN0IG1ldGhvZE5hbWVBbmRQYXJhbWV0ZXJzIG9mIG1ldGhvZHMua2V5cygpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IG1ldGhvZHMuZ2V0KG1ldGhvZE5hbWVBbmRQYXJhbWV0ZXJzKTtcbiAgICAgIGlmIChvcmlnaW5hbE1ldGhvZCkge1xuICAgICAgICBjb25zdCBtZXRob2QgPSBjbG9uZShvcmlnaW5hbE1ldGhvZCk7XG4gICAgICAgIG1ldGhvZC5hYnN0cmFjdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVtaXRNZXRob2QoaWZjLCBtZXRob2QsIC8qIGVtaXRGb3JQcm94eU9yRGF0YXR5cGUgKi8gdHJ1ZSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBvdmVybG9hZGVkTWV0aG9kIG9mIHRoaXMuY3JlYXRlT3ZlcmxvYWRzRm9yT3B0aW9uYWxzKFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgKSkge1xuICAgICAgICAgIG92ZXJsb2FkZWRNZXRob2QuYWJzdHJhY3QgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmVtaXRNZXRob2QoXG4gICAgICAgICAgICBpZmMsXG4gICAgICAgICAgICBvdmVybG9hZGVkTWV0aG9kLFxuICAgICAgICAgICAgLyogZW1pdEZvclByb3h5T3JEYXRhdHlwZSAqLyB0cnVlLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgYSBwcm9wZXJ0eVxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0UHJvcGVydHkoXG4gICAgY2xzOiBzcGVjLlR5cGUsXG4gICAgcHJvcDogc3BlYy5Qcm9wZXJ0eSxcbiAgICBkYXRhdHlwZSA9IGZhbHNlLFxuICAgIHByb3h5ID0gZmFsc2UsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuZW1pdE5ld0xpbmVJZk5lY2Vzc2FyeSgpO1xuXG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy50eXBlcmVzb2x2ZXIudG9OYXRpdmVGcW4oY2xzLmZxbik7XG4gICAgY29uc3QgYWNjZXNzID0gdGhpcy5yZW5kZXJBY2Nlc3NMZXZlbChwcm9wKTtcbiAgICBjb25zdCBzdGF0aWNLZXlXb3JkID0gcHJvcC5zdGF0aWMgPyAnc3RhdGljICcgOiAnJztcbiAgICBjb25zdCBwcm9wTmFtZSA9IHRoaXMubmFtZXV0aWxzLmNvbnZlcnRQcm9wZXJ0eU5hbWUocHJvcC5uYW1lKTtcblxuICAgIHRoaXMuZG90bmV0RG9jR2VuZXJhdG9yLmVtaXREb2NzKHByb3AsIHtcbiAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICBmcW46IGNscy5mcW4sXG4gICAgICBtZW1iZXJOYW1lOiBwcm9wLm5hbWUsXG4gICAgfSk7XG4gICAgaWYgKHByb3Aub3B0aW9uYWwpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdbSnNpaU9wdGlvbmFsXScpO1xuICAgIH1cbiAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdEF0dHJpYnV0ZXNGb3JQcm9wZXJ0eShwcm9wLCBkYXRhdHlwZSk7XG5cbiAgICBsZXQgaXNPdmVycmlkZUtleVdvcmQgPSAnJztcbiAgICBsZXQgaXNWaXJ0dWFsS2V5V29yZCA9ICcnO1xuICAgIGxldCBpc0Fic3RyYWN0S2V5d29yZCA9ICcnO1xuXG4gICAgLy8gSWYgdGhlIHByb3AgcGFyZW50IGlzIGEgY2xhc3NcbiAgICBpZiAoc3BlYy5pc0NsYXNzVHlwZShjbHMpKSB7XG4gICAgICBjb25zdCBpbXBsZW1lbnRlZEluQmFzZSA9IHRoaXMuaXNNZW1iZXJEZWZpbmVkT25BbmNlc3RvcihcbiAgICAgICAgY2xzIGFzIHNwZWMuQ2xhc3NUeXBlLFxuICAgICAgICBwcm9wLFxuICAgICAgKTtcbiAgICAgIGlmIChpbXBsZW1lbnRlZEluQmFzZSB8fCBkYXRhdHlwZSB8fCBwcm94eSkge1xuICAgICAgICAvLyBPdmVycmlkZSBpZiB0aGUgcHJvcGVydHkgaXMgaW4gYSBkYXRhdHlwZSBvciBwcm94eSBjbGFzcyBvciBkZWNsYXJlZCBpbiBhIHBhcmVudCBjbGFzcy4gSWYgdGhlIG1lbWJlciBpc1xuICAgICAgICAvLyBzdGF0aWMsIHVzZSB0aGUgXCJuZXdcIiBrZXl3b3JkIGluc3RlYWQsIHRvIGluZGljYXRlIHdlIGFyZSBpbnRlbnRpb25hbGx5IGhpZGluZyB0aGUgYW5jZXN0b3IgZGVjbGFyYXRpb24gKGFzXG4gICAgICAgIC8vIEMjIGRvZXMgbm90IGluaGVyaXQgc3RhdGljcywgdGhleSBjYW4gYmUgaGlkZGVuIGJ1dCBub3Qgb3ZlcnJpZGRlbikuVGhlIFwibmV3XCIga2V5d29yZCBpcyBvcHRpb25hbCBpbiB0aGlzXG4gICAgICAgIC8vIGNvbnRleHQsIGJ1dCBoZWxwcyBjbGFyaWZ5IGludGVudGlvbi5cbiAgICAgICAgaXNPdmVycmlkZUtleVdvcmQgPSBwcm9wLnN0YXRpYyA/ICduZXcgJyA6ICdvdmVycmlkZSAnO1xuICAgICAgfSBlbHNlIGlmIChwcm9wLmFic3RyYWN0KSB7XG4gICAgICAgIC8vIEFic3RyYWN0IG1lbWJlcnMgZ2V0IGRlY29yYXRlZCBhcyBzdWNoXG4gICAgICAgIGlzQWJzdHJhY3RLZXl3b3JkID0gJ2Fic3RyYWN0ICc7XG4gICAgICB9IGVsc2UgaWYgKCFwcm9wLnN0YXRpYyAmJiAhaW1wbGVtZW50ZWRJbkJhc2UpIHtcbiAgICAgICAgLy8gVmlydHVhbCBpZiB0aGUgcHJvcCBpcyBub3Qgc3RhdGljLCBhbmQgaXMgbm90IGltcGxlbWVudGVkIGluIGJhc2UgbWVtYmVyLCB0aGlzIHdheSB3ZSBjYW4gbGF0ZXIgb3ZlcnJpZGUgaXQuXG4gICAgICAgIGlzVmlydHVhbEtleVdvcmQgPSAndmlydHVhbCAnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHByb3BUeXBlRlFOID0gdGhpcy50eXBlcmVzb2x2ZXIudG9Eb3ROZXRUeXBlKHByb3AudHlwZSk7XG4gICAgY29uc3QgaXNPcHRpb25hbCA9IHByb3Aub3B0aW9uYWwgPyAnPycgOiAnJztcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSBgJHthY2Nlc3N9ICR7aXNBYnN0cmFjdEtleXdvcmR9JHtpc1ZpcnR1YWxLZXlXb3JkfSR7c3RhdGljS2V5V29yZH0ke2lzT3ZlcnJpZGVLZXlXb3JkfSR7cHJvcFR5cGVGUU59JHtpc09wdGlvbmFsfSAke3Byb3BOYW1lfWA7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhzdGF0ZW1lbnQpO1xuXG4gICAgLy8gRW1pdCBnZXR0ZXJzXG4gICAgaWYgKGRhdGF0eXBlIHx8IHByb3AuY29uc3QgfHwgcHJvcC5hYnN0cmFjdCkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJ2dldDsnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlIHByb3BlcnR5IGlzIG5vbi1vcHRpb25hbCwgYWRkIGEgYmFuZyB0byBzaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmdcbiAgICAgIGNvbnN0IGJhbmcgPSBwcm9wLm9wdGlvbmFsID8gJycgOiAnISc7XG4gICAgICBpZiAocHJvcC5zdGF0aWMpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgICAgYGdldCA9PiBHZXRTdGF0aWNQcm9wZXJ0eTwke3Byb3BUeXBlRlFOfSR7aXNPcHRpb25hbH0+KHR5cGVvZigke2NsYXNzTmFtZX0pKSR7YmFuZ307YCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICAgIGBnZXQgPT4gR2V0SW5zdGFuY2VQcm9wZXJ0eTwke3Byb3BUeXBlRlFOfSR7aXNPcHRpb25hbH0+KCkke2Jhbmd9O2AsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW1pdCBzZXR0ZXJzXG4gICAgaWYgKGRhdGF0eXBlIHx8ICghcHJvcC5pbW11dGFibGUgJiYgcHJvcC5hYnN0cmFjdCkpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdzZXQ7Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghcHJvcC5pbW11dGFibGUpIHtcbiAgICAgICAgaWYgKHByb3Auc3RhdGljKSB7XG4gICAgICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgICAgICBgc2V0ID0+IFNldFN0YXRpY1Byb3BlcnR5KHR5cGVvZigke2NsYXNzTmFtZX0pLCB2YWx1ZSk7YCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY29kZS5saW5lKCdzZXQgPT4gU2V0SW5zdGFuY2VQcm9wZXJ0eSh2YWx1ZSk7Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgdGhpcy5mbGFnRmlyc3RNZW1iZXJXcml0dGVuKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGEgY29uc3RhbnQgcHJvcGVydHlcbiAgICovXG4gIHByaXZhdGUgZW1pdENvbnN0UHJvcGVydHkoY2xzOiBzcGVjLkNsYXNzVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSk6IHZvaWQge1xuICAgIHRoaXMuZW1pdE5ld0xpbmVJZk5lY2Vzc2FyeSgpO1xuICAgIHRoaXMuZmxhZ0ZpcnN0TWVtYmVyV3JpdHRlbih0cnVlKTtcbiAgICBjb25zdCBwcm9wVHlwZSA9IHRoaXMudHlwZXJlc29sdmVyLnRvRG90TmV0VHlwZShwcm9wLnR5cGUpO1xuICAgIGNvbnN0IGlzT3B0aW9uYWwgPSBwcm9wLm9wdGlvbmFsID8gJz8nIDogJyc7XG4gICAgdGhpcy5kb3RuZXREb2NHZW5lcmF0b3IuZW1pdERvY3MocHJvcCwge1xuICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgIGZxbjogY2xzLmZxbixcbiAgICAgIG1lbWJlck5hbWU6IHByb3AubmFtZSxcbiAgICB9KTtcbiAgICB0aGlzLmRvdG5ldFJ1bnRpbWVHZW5lcmF0b3IuZW1pdEF0dHJpYnV0ZXNGb3JQcm9wZXJ0eShwcm9wKTtcbiAgICBjb25zdCBhY2Nlc3MgPSB0aGlzLnJlbmRlckFjY2Vzc0xldmVsKHByb3ApO1xuICAgIGNvbnN0IHByb3BOYW1lID0gdGhpcy5uYW1ldXRpbHMuY29udmVydFByb3BlcnR5TmFtZShwcm9wLm5hbWUpO1xuICAgIGNvbnN0IHN0YXRpY0tleXdvcmQgPSBwcm9wLnN0YXRpYyA/ICdzdGF0aWMgJyA6ICcnO1xuXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGAke2FjY2Vzc30gJHtzdGF0aWNLZXl3b3JkfSR7cHJvcFR5cGV9JHtpc09wdGlvbmFsfSAke3Byb3BOYW1lfWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnZ2V0OycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy50eXBlcmVzb2x2ZXIudG9OYXRpdmVGcW4oY2xzLmZxbik7XG4gICAgLy8gSWYgdGhlIHByb3BlcnR5IGlzIG5vbi1vcHRpb25hbCwgYWRkIGEgYmFuZyB0byBzaWxlbmNlIHRoZSBjb21waWxlciB3YXJuaW5nXG4gICAgY29uc3QgYmFuZyA9IHByb3Aub3B0aW9uYWwgPyAnJyA6ICchJztcbiAgICBjb25zdCBpbml0aWFsaXplciA9IHByb3Auc3RhdGljXG4gICAgICA/IGA9IEdldFN0YXRpY1Byb3BlcnR5PCR7cHJvcFR5cGV9Pih0eXBlb2YoJHtjbGFzc05hbWV9KSkke2Jhbmd9O2BcbiAgICAgIDogYD0gR2V0SW5zdGFuY2VQcm9wZXJ0eTwke3Byb3BUeXBlfT4odHlwZW9mKCR7Y2xhc3NOYW1lfSkpJHtiYW5nfTtgO1xuICAgIHRoaXMuY29kZS5saW5lKGluaXRpYWxpemVyKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQWNjZXNzTGV2ZWwobWV0aG9kOiBzcGVjLk1ldGhvZCB8IHNwZWMuUHJvcGVydHkpOiBzdHJpbmcge1xuICAgIHJldHVybiBtZXRob2QucHJvdGVjdGVkID8gJ3Byb3RlY3RlZCcgOiAncHVibGljJztcbiAgfVxuXG4gIHByaXZhdGUgaXNOZXN0ZWQodHlwZTogc3BlYy5UeXBlKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmFzc2VtYmx5LnR5cGVzIHx8ICF0eXBlLm5hbWVzcGFjZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBgJHt0eXBlLmFzc2VtYmx5fS4ke3R5cGUubmFtZXNwYWNlfWA7XG4gICAgcmV0dXJuIHBhcmVudCBpbiB0aGlzLmFzc2VtYmx5LnR5cGVzO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0NTaGFycEZpbGVQYXRoKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3R5cGV9LmNzYDtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkZpbGVJZk5lZWRlZChcbiAgICB0eXBlTmFtZTogc3RyaW5nLFxuICAgIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgIGlzTmVzdGVkOiBib29sZWFuLFxuICAgIHVzaW5nRGVwdXR5ID0gdHJ1ZSxcbiAgKTogdm9pZCB7XG4gICAgLy8gSWYgTmVzdGVkIHR5cGUsIHdlIHNob3VsZG4ndCBvcGVuL2Nsb3NlIGEgZmlsZVxuICAgIGlmIChpc05lc3RlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRvdG5ldFBhY2thZ2VJZCA9IHRoaXMuYXNzZW1ibHkudGFyZ2V0cz8uZG90bmV0Py5wYWNrYWdlSWQ7XG4gICAgaWYgKCFkb3RuZXRQYWNrYWdlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBtb2R1bGUgJHt0aGlzLmFzc2VtYmx5Lm5hbWV9IGRvZXMgbm90IGhhdmUgYSBkb3RuZXQucGFja2FnZUlkIHNldHRpbmdgLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZmlsZVBhdGggPSBuYW1lc3BhY2UucmVwbGFjZSgvWy5dL2csICcvJyk7XG4gICAgdGhpcy5jb2RlLm9wZW5GaWxlKFxuICAgICAgcGF0aC5qb2luKGRvdG5ldFBhY2thZ2VJZCwgZmlsZVBhdGgsIHRoaXMudG9DU2hhcnBGaWxlUGF0aCh0eXBlTmFtZSkpLFxuICAgICk7XG4gICAgaWYgKHVzaW5nRGVwdXR5KSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgndXNpbmcgQW1hem9uLkpTSUkuUnVudGltZS5EZXB1dHk7Jyk7XG4gICAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIH1cblxuICAgIC8vIFN1cHByZXNzIHdhcm5pbmdzIGFib3V0IG1pc3NpbmcgWE1MRG9jLCBPYnNvbGV0ZSBpbmNvbnNpc3RlbmNpZXNcbiAgICB0aGlzLmNvZGUubGluZSgnI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgQ1MwNjcyLENTMDgwOSxDUzE1OTEnKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgbmFtZXNwYWNlICR7bmFtZXNwYWNlfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZUZpbGVJZk5lZWRlZChcbiAgICB0eXBlTmFtZTogc3RyaW5nLFxuICAgIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgIGlzTmVzdGVkOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICBpZiAoaXNOZXN0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGNvbnN0IGRvdG5ldFBhY2thZ2VJZCA9IHRoaXMuYXNzZW1ibHkudGFyZ2V0cz8uZG90bmV0Py5wYWNrYWdlSWQ7XG4gICAgaWYgKCFkb3RuZXRQYWNrYWdlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBtb2R1bGUgJHt0aGlzLmFzc2VtYmx5Lm5hbWV9IGRvZXMgbm90IGhhdmUgYSBkb3RuZXQucGFja2FnZUlkIHNldHRpbmdgLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZmlsZVBhdGggPSBuYW1lc3BhY2UucmVwbGFjZSgvWy5dL2csICcvJyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlRmlsZShcbiAgICAgIHBhdGguam9pbihkb3RuZXRQYWNrYWdlSWQsIGZpbGVQYXRoLCB0aGlzLnRvQ1NoYXJwRmlsZVBhdGgodHlwZU5hbWUpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgZmlyc3RNZW1iZXIgYm9vbGVhbiBmbGFnIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGZpcnN0IG1lbWJlciBvZiBhIG5ldyBmaWxlXG4gICAqXG4gICAqIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJ5IHdoaXRlIGxpbmVzXG4gICAqL1xuICBwcml2YXRlIGZsYWdGaXJzdE1lbWJlcldyaXR0ZW4oZmlyc3Q6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmZpcnN0TWVtYmVyV3JpdHRlbiA9IGZpcnN0O1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGEgbmV3IGxpbmUgcHJpb3IgdG8gd3JpdGluZyBhIG5ldyBwcm9wZXJ0eSwgbWV0aG9kLCBpZiB0aGUgcHJvcGVydHkgaXMgbm90IHRoZSBmaXJzdCBvbmUgaW4gdGhlIGNsYXNzXG4gICAqXG4gICAqIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJ5IHdoaXRlIGxpbmVzLlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0TmV3TGluZUlmTmVjZXNzYXJ5KCk6IHZvaWQge1xuICAgIC8vIElmIHRoZSBmaXJzdCBtZW1iZXIgaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuLCBpdCBpcyBzYWZlIHRvIHdyaXRlIGEgbmV3IGxpbmVcbiAgICBpZiAodGhpcy5maXJzdE1lbWJlcldyaXR0ZW4pIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlyc3RNZW1iZXJXcml0dGVuID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0QXNzZW1ibHlEb2NzKCkge1xuICAgIHRoaXMuZW1pdE5hbWVzcGFjZURvY3MoXG4gICAgICB0aGlzLmFzc2VtYmx5LnRhcmdldHMhLmRvdG5ldCEubmFtZXNwYWNlLFxuICAgICAgdGhpcy5hc3NlbWJseS5uYW1lLFxuICAgICAgdGhpcy5hc3NlbWJseSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgYW4gdW51c2VkLCBlbXB0eSBjbGFzcyBjYWxsZWQgYE5hbWVzcGFjZURvY2AgdG8gYXR0YWNoIHRoZSBtb2R1bGUgUkVBRE1FIHRvXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIHdheSB0byBhdHRhY2ggZG9jIGNvbW1lbnRzIHRvIGEgbmFtZXNwYWNlIGluIEMjLCBhbmQgdGhpcyB0cmljayBoYXMgYmVlblxuICAgKiBzZW1pLXN0YW5kYXJkaXplZCBieSBORG9jIGFuZCBTYW5kY2FzdGxlIEhlbHAgRmlsZSBCdWlsZGVyLlxuICAgKlxuICAgKiBEb2NGWCBkb2Vzbid0IHN1cHBvcnQgaXQgb3V0IG9mIHRoZSBib3gsIGJ1dCB3ZSBzaG91bGQgYmUgYWJsZSB0byBnZXQgdGhlcmUgd2l0aCBhXG4gICAqIGJpdCBvZiBoYWNrZXJ5LlxuICAgKlxuICAgKiBJbiBhbnkgY2FzZSwgd2UgbmVlZCBhIHBsYWNlIHRvIGF0dGFjaCB0aGUgZG9jcyB3aGVyZSB0aGV5IGNhbiBiZSB0cmFuc3BvcnRlZCBhcm91bmQsXG4gICAqIG1pZ2h0IGFzIHdlbGwgYmUgdGhpcyBtZXRob2QuXG4gICAqL1xuICBwcml2YXRlIGVtaXROYW1lc3BhY2VEb2NzKFxuICAgIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgIGpzaWlGcW46IHN0cmluZyxcbiAgICBkb2NTb3VyY2U6IHNwZWMuVGFyZ2V0YWJsZSxcbiAgKSB7XG4gICAgaWYgKCFkb2NTb3VyY2UucmVhZG1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2xhc3NOYW1lID0gJ05hbWVzcGFjZURvYyc7XG4gICAgdGhpcy5vcGVuRmlsZUlmTmVlZGVkKGNsYXNzTmFtZSwgbmFtZXNwYWNlLCBmYWxzZSwgZmFsc2UpO1xuXG4gICAgdGhpcy5kb3RuZXREb2NHZW5lcmF0b3IuZW1pdE1hcmtkb3duQXNSZW1hcmtzKGRvY1NvdXJjZS5yZWFkbWUubWFya2Rvd24sIHtcbiAgICAgIGFwaTogJ21vZHVsZVJlYWRtZScsXG4gICAgICBtb2R1bGVGcW46IGpzaWlGcW4sXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0SGlkZUF0dHJpYnV0ZSgpO1xuICAgIC8vIFRyYWRpdGlvbmFsbHkgdGhpcyBjbGFzcyBpcyBtYWRlICdpbnRlcm5hbCcsIGJ1dCB0aGF0IGludGVyYWN0cyBwb29ybHkgd2l0aCBEb2NGWCdzIGRlZmF1bHQgZmlsdGVyc1xuICAgIC8vIHdoaWNoIGFyZW4ndCBvdmVycmlkYWJsZS4gU28gd2UgbWFrZSBpdCBwdWJsaWMsIGJ1dCB1c2UgYXR0cmlidXRlcyB0byBoaWRlIGl0IGZyb20gdXNlcnMnIEludGVsbGlTZW5zZSxcbiAgICAvLyBzbyB0aGF0IHdlIGNhbiBhY2Nlc3MgdGhlIGNsYXNzIGluIERvY0ZYLlxuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYHB1YmxpYyBjbGFzcyAke2NsYXNzTmFtZX1gKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY2xvc2VGaWxlSWZOZWVkZWQoY2xhc3NOYW1lLCBuYW1lc3BhY2UsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IGFuIGF0dHJpYnV0ZSB0aGF0IHdpbGwgaGlkZSB0aGUgc3Vic2VxdWVudCBBUEkgZWxlbWVudCBmcm9tIHVzZXJzXG4gICAqL1xuICBwcml2YXRlIGVtaXRIaWRlQXR0cmlidXRlKCkge1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJ1tTeXN0ZW0uQ29tcG9uZW50TW9kZWwuRWRpdG9yQnJvd3NhYmxlKFN5c3RlbS5Db21wb25lbnRNb2RlbC5FZGl0b3JCcm93c2FibGVTdGF0ZS5OZXZlcildJyxcbiAgICApO1xuICB9XG59XG4iXX0=
|