@cdklabs/cdk-appmod-catalog-blueprints 1.14.0 → 1.16.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/.jsii +243 -164
- package/README.md +29 -28
- package/lib/document-processing/adapter/queued-s3-adapter.js +1 -1
- package/lib/document-processing/agentic-document-processing.js +1 -1
- package/lib/document-processing/base-document-processing.js +1 -1
- package/lib/document-processing/bedrock-document-processing.js +1 -1
- package/lib/document-processing/default-document-processing-config.js +1 -1
- package/lib/framework/agents/base-agent.js +1 -1
- package/lib/framework/agents/batch-agent.js +1 -1
- package/lib/framework/agents/default-agent-config.js +1 -1
- package/lib/framework/agents/interactive-agent.d.ts +71 -5
- package/lib/framework/agents/interactive-agent.js +92 -15
- package/lib/framework/agents/knowledge-base/base-knowledge-base.js +1 -1
- package/lib/framework/agents/knowledge-base/bedrock-knowledge-base.js +1 -1
- package/lib/framework/bedrock/bedrock.js +1 -1
- package/lib/framework/custom-resource/default-runtimes.js +1 -1
- package/lib/framework/foundation/access-log.js +1 -1
- package/lib/framework/foundation/eventbridge-broker.js +1 -1
- package/lib/framework/foundation/network.js +1 -1
- package/lib/framework/tests/interactive-agent-nag.test.js +2 -2
- package/lib/framework/tests/interactive-agent.test.js +89 -2
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/utilities/data-loader.js +1 -1
- package/lib/utilities/lambda-iam-utils.js +1 -1
- package/lib/utilities/observability/cloudfront-distribution-observability-property-injector.js +1 -1
- package/lib/utilities/observability/cloudwatch-transaction-search.js +1 -1
- package/lib/utilities/observability/default-observability-config.js +1 -1
- package/lib/utilities/observability/lambda-observability-property-injector.js +1 -1
- package/lib/utilities/observability/log-group-data-protection-utils.js +1 -1
- package/lib/utilities/observability/powertools-config.js +1 -1
- package/lib/utilities/observability/state-machine-observability-property-injector.js +1 -1
- package/lib/webapp/frontend-construct.js +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.InteractiveAgent = exports.AgentCoreRuntimeHostingAdapter = exports.LambdaHostingAdapter = exports.NoAuthenticator = exports.DynamoDBSessionIndex = exports.CognitoAuthenticator = exports.NullConversationManager = exports.SlidingWindowConversationManager = exports.S3SessionManager = exports.StreamingHttpAdapter = void 0;
|
|
4
|
+
exports.InteractiveAgent = exports.AgentCoreRuntimeHostingAdapter = exports.NetworkMode = exports.LambdaHostingAdapter = exports.NoAuthenticator = exports.DynamoDBSessionIndex = exports.CognitoAuthenticator = exports.NullConversationManager = exports.SlidingWindowConversationManager = exports.S3SessionManager = exports.StreamingHttpAdapter = void 0;
|
|
5
5
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
6
|
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
7
7
|
// SPDX-License-Identifier: Apache-2.0
|
|
@@ -11,6 +11,7 @@ const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
|
|
|
11
11
|
const aws_bedrockagentcore_1 = require("aws-cdk-lib/aws-bedrockagentcore");
|
|
12
12
|
const aws_cognito_1 = require("aws-cdk-lib/aws-cognito");
|
|
13
13
|
const aws_dynamodb_1 = require("aws-cdk-lib/aws-dynamodb");
|
|
14
|
+
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
14
15
|
const aws_ecr_assets_1 = require("aws-cdk-lib/aws-ecr-assets");
|
|
15
16
|
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
16
17
|
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
@@ -188,7 +189,7 @@ class StreamingHttpAdapter {
|
|
|
188
189
|
}
|
|
189
190
|
exports.StreamingHttpAdapter = StreamingHttpAdapter;
|
|
190
191
|
_a = JSII_RTTI_SYMBOL_1;
|
|
191
|
-
StreamingHttpAdapter[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.StreamingHttpAdapter", version: "1.
|
|
192
|
+
StreamingHttpAdapter[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.StreamingHttpAdapter", version: "1.16.0" };
|
|
192
193
|
/**
|
|
193
194
|
* S3-based session manager for persisting conversation state.
|
|
194
195
|
*
|
|
@@ -265,7 +266,7 @@ class S3SessionManager {
|
|
|
265
266
|
}
|
|
266
267
|
exports.S3SessionManager = S3SessionManager;
|
|
267
268
|
_b = JSII_RTTI_SYMBOL_1;
|
|
268
|
-
S3SessionManager[_b] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.S3SessionManager", version: "1.
|
|
269
|
+
S3SessionManager[_b] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.S3SessionManager", version: "1.16.0" };
|
|
269
270
|
/**
|
|
270
271
|
* Sliding window conversation manager for maintaining recent conversation history.
|
|
271
272
|
*
|
|
@@ -313,7 +314,7 @@ class SlidingWindowConversationManager {
|
|
|
313
314
|
}
|
|
314
315
|
exports.SlidingWindowConversationManager = SlidingWindowConversationManager;
|
|
315
316
|
_c = JSII_RTTI_SYMBOL_1;
|
|
316
|
-
SlidingWindowConversationManager[_c] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.SlidingWindowConversationManager", version: "1.
|
|
317
|
+
SlidingWindowConversationManager[_c] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.SlidingWindowConversationManager", version: "1.16.0" };
|
|
317
318
|
/**
|
|
318
319
|
* Null conversation manager for stateless interactions.
|
|
319
320
|
*
|
|
@@ -336,7 +337,7 @@ class NullConversationManager {
|
|
|
336
337
|
}
|
|
337
338
|
exports.NullConversationManager = NullConversationManager;
|
|
338
339
|
_d = JSII_RTTI_SYMBOL_1;
|
|
339
|
-
NullConversationManager[_d] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.NullConversationManager", version: "1.
|
|
340
|
+
NullConversationManager[_d] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.NullConversationManager", version: "1.16.0" };
|
|
340
341
|
/**
|
|
341
342
|
* Cognito-based authenticator for securing REST API endpoints.
|
|
342
343
|
*
|
|
@@ -459,7 +460,7 @@ class CognitoAuthenticator {
|
|
|
459
460
|
}
|
|
460
461
|
exports.CognitoAuthenticator = CognitoAuthenticator;
|
|
461
462
|
_e = JSII_RTTI_SYMBOL_1;
|
|
462
|
-
CognitoAuthenticator[_e] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.CognitoAuthenticator", version: "1.
|
|
463
|
+
CognitoAuthenticator[_e] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.CognitoAuthenticator", version: "1.16.0" };
|
|
463
464
|
/**
|
|
464
465
|
* DynamoDB-based session index for fast user to session lookups.
|
|
465
466
|
*
|
|
@@ -546,7 +547,7 @@ class DynamoDBSessionIndex {
|
|
|
546
547
|
}
|
|
547
548
|
exports.DynamoDBSessionIndex = DynamoDBSessionIndex;
|
|
548
549
|
_f = JSII_RTTI_SYMBOL_1;
|
|
549
|
-
DynamoDBSessionIndex[_f] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.DynamoDBSessionIndex", version: "1.
|
|
550
|
+
DynamoDBSessionIndex[_f] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.DynamoDBSessionIndex", version: "1.16.0" };
|
|
550
551
|
/**
|
|
551
552
|
* No-authentication authenticator for development and testing.
|
|
552
553
|
*
|
|
@@ -576,7 +577,7 @@ class NoAuthenticator {
|
|
|
576
577
|
}
|
|
577
578
|
exports.NoAuthenticator = NoAuthenticator;
|
|
578
579
|
_g = JSII_RTTI_SYMBOL_1;
|
|
579
|
-
NoAuthenticator[_g] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.NoAuthenticator", version: "1.
|
|
580
|
+
NoAuthenticator[_g] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.NoAuthenticator", version: "1.16.0" };
|
|
580
581
|
/**
|
|
581
582
|
* Lambda hosting adapter for InteractiveAgent.
|
|
582
583
|
*
|
|
@@ -722,7 +723,37 @@ class LambdaHostingAdapter {
|
|
|
722
723
|
}
|
|
723
724
|
exports.LambdaHostingAdapter = LambdaHostingAdapter;
|
|
724
725
|
_h = JSII_RTTI_SYMBOL_1;
|
|
725
|
-
LambdaHostingAdapter[_h] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.LambdaHostingAdapter", version: "1.
|
|
726
|
+
LambdaHostingAdapter[_h] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.LambdaHostingAdapter", version: "1.16.0" };
|
|
727
|
+
/**
|
|
728
|
+
* Configuration properties for AgentCoreRuntimeHostingAdapter.
|
|
729
|
+
*/
|
|
730
|
+
/**
|
|
731
|
+
* Network mode for AgentCore Runtime hosting.
|
|
732
|
+
*
|
|
733
|
+
* Determines whether the AgentCore Runtime runs on the public internet
|
|
734
|
+
* or inside a VPC with private networking.
|
|
735
|
+
*/
|
|
736
|
+
var NetworkMode;
|
|
737
|
+
(function (NetworkMode) {
|
|
738
|
+
/**
|
|
739
|
+
* Runtime is publicly accessible (default).
|
|
740
|
+
* No VPC configuration required.
|
|
741
|
+
*/
|
|
742
|
+
NetworkMode["PUBLIC"] = "PUBLIC";
|
|
743
|
+
/**
|
|
744
|
+
* Runtime runs inside a VPC.
|
|
745
|
+
*
|
|
746
|
+
* AgentCore creates ENIs in the specified subnets. You must provide
|
|
747
|
+
* either explicit `vpcSubnets` and `securityGroups`, or pass a
|
|
748
|
+
* `Network` construct via `InteractiveAgent.network`.
|
|
749
|
+
*
|
|
750
|
+
* Use private subnets with a NAT Gateway for internet access.
|
|
751
|
+
* Public subnets do NOT provide internet access to AgentCore ENIs.
|
|
752
|
+
*
|
|
753
|
+
* @see https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/agentcore-vpc.html
|
|
754
|
+
*/
|
|
755
|
+
NetworkMode["VPC"] = "VPC";
|
|
756
|
+
})(NetworkMode || (exports.NetworkMode = NetworkMode = {}));
|
|
726
757
|
/**
|
|
727
758
|
* AgentCore Runtime hosting adapter for InteractiveAgent.
|
|
728
759
|
*
|
|
@@ -742,12 +773,13 @@ LambdaHostingAdapter[_h] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.Lambda
|
|
|
742
773
|
* - **Managed Infrastructure**: No Lambda cold starts or timeout limits
|
|
743
774
|
* - **Multiple Protocols**: HTTP, MCP, or A2A protocol support
|
|
744
775
|
* - **Container-Based**: Standard Docker image deployment
|
|
776
|
+
* - **VPC Support**: Run inside a VPC with private subnets for network isolation
|
|
745
777
|
*
|
|
746
778
|
* ## Usage
|
|
747
779
|
*
|
|
748
780
|
* ```typescript
|
|
749
781
|
* import { Asset } from 'aws-cdk-lib/aws-s3-assets';
|
|
750
|
-
* import { InteractiveAgent, AgentCoreRuntimeHostingAdapter } from '@cdklabs/cdk-appmod-catalog-blueprints';
|
|
782
|
+
* import { InteractiveAgent, AgentCoreRuntimeHostingAdapter, NetworkMode } from '@cdklabs/cdk-appmod-catalog-blueprints';
|
|
751
783
|
*
|
|
752
784
|
* declare const myPrompt: Asset;
|
|
753
785
|
*
|
|
@@ -755,7 +787,7 @@ LambdaHostingAdapter[_h] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.Lambda
|
|
|
755
787
|
* agentName: 'MyChatbot',
|
|
756
788
|
* agentDefinition: { bedrockModel: {}, systemPrompt: myPrompt },
|
|
757
789
|
* hostingAdapter: new AgentCoreRuntimeHostingAdapter({
|
|
758
|
-
* networkMode:
|
|
790
|
+
* networkMode: NetworkMode.PUBLIC,
|
|
759
791
|
* }),
|
|
760
792
|
* });
|
|
761
793
|
* ```
|
|
@@ -770,7 +802,42 @@ class AgentCoreRuntimeHostingAdapter {
|
|
|
770
802
|
*/
|
|
771
803
|
deploy(config) {
|
|
772
804
|
const scope = config.scope;
|
|
773
|
-
const networkMode = this.props.networkMode ||
|
|
805
|
+
const networkMode = this.props.networkMode || NetworkMode.PUBLIC;
|
|
806
|
+
// Resolve VPC configuration for VPC network mode
|
|
807
|
+
let resolvedSubnetIds;
|
|
808
|
+
let resolvedSecurityGroupIds;
|
|
809
|
+
if (networkMode === NetworkMode.VPC) {
|
|
810
|
+
// Explicit props take precedence over Network construct
|
|
811
|
+
if (this.props.vpcSubnets && config.network) {
|
|
812
|
+
resolvedSubnetIds = config.network.vpc.selectSubnets(this.props.vpcSubnets).subnetIds;
|
|
813
|
+
}
|
|
814
|
+
else if (config.network) {
|
|
815
|
+
const subnets = config.network.vpc.selectSubnets(config.network.applicationSubnetSelection()).subnetIds;
|
|
816
|
+
resolvedSubnetIds = subnets;
|
|
817
|
+
}
|
|
818
|
+
if (this.props.securityGroups) {
|
|
819
|
+
resolvedSecurityGroupIds = this.props.securityGroups.map(sg => sg.securityGroupId);
|
|
820
|
+
}
|
|
821
|
+
else if (config.network) {
|
|
822
|
+
// Create a security group for the AgentCore runtime ENIs
|
|
823
|
+
const sg = new aws_ec2_1.SecurityGroup(scope, 'AgentCoreRuntimeSG', {
|
|
824
|
+
vpc: config.network.vpc,
|
|
825
|
+
description: 'Security group for AgentCore Runtime ENIs',
|
|
826
|
+
allowAllOutbound: true,
|
|
827
|
+
});
|
|
828
|
+
resolvedSecurityGroupIds = [sg.securityGroupId];
|
|
829
|
+
}
|
|
830
|
+
if (!resolvedSubnetIds || resolvedSubnetIds.length === 0) {
|
|
831
|
+
throw new Error('VPC network mode requires subnets to be provided either via ' +
|
|
832
|
+
'AgentCoreRuntimeHostingAdapterProps.vpcSubnets (with a Network construct) ' +
|
|
833
|
+
'or via a Network construct in AgentHostingConfig.network.');
|
|
834
|
+
}
|
|
835
|
+
if (!resolvedSecurityGroupIds || resolvedSecurityGroupIds.length === 0) {
|
|
836
|
+
throw new Error('VPC network mode requires security groups to be provided either via ' +
|
|
837
|
+
'AgentCoreRuntimeHostingAdapterProps.securityGroups or via a Network construct ' +
|
|
838
|
+
'in AgentHostingConfig.network.');
|
|
839
|
+
}
|
|
840
|
+
}
|
|
774
841
|
// Build or reference container image
|
|
775
842
|
let containerUri;
|
|
776
843
|
if (this.props.containerImageUri) {
|
|
@@ -869,6 +936,16 @@ class AgentCoreRuntimeHostingAdapter {
|
|
|
869
936
|
RequestHeaderAllowlist: ['Authorization'],
|
|
870
937
|
});
|
|
871
938
|
}
|
|
939
|
+
// When VPC mode is configured, set the NetworkModeConfig with subnets and
|
|
940
|
+
// security groups via property override. This is needed because CDK 2.218.0
|
|
941
|
+
// does not yet have typed support for NetworkModeConfig (added in 2.240.0).
|
|
942
|
+
// See: https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/agentcore-vpc.html
|
|
943
|
+
if (networkMode === NetworkMode.VPC && resolvedSubnetIds && resolvedSecurityGroupIds) {
|
|
944
|
+
runtime.addPropertyOverride('NetworkConfiguration.NetworkModeConfig', {
|
|
945
|
+
Subnets: resolvedSubnetIds,
|
|
946
|
+
SecurityGroups: resolvedSecurityGroupIds,
|
|
947
|
+
});
|
|
948
|
+
}
|
|
872
949
|
// Ensure CfnRuntime waits for the role and its policies to be fully created/updated.
|
|
873
950
|
// Without this, CloudFormation may validate the role before:
|
|
874
951
|
// - The trust policy is updated to bedrock-agentcore.amazonaws.com (during stack updates)
|
|
@@ -913,7 +990,7 @@ class AgentCoreRuntimeHostingAdapter {
|
|
|
913
990
|
}
|
|
914
991
|
exports.AgentCoreRuntimeHostingAdapter = AgentCoreRuntimeHostingAdapter;
|
|
915
992
|
_j = JSII_RTTI_SYMBOL_1;
|
|
916
|
-
AgentCoreRuntimeHostingAdapter[_j] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.AgentCoreRuntimeHostingAdapter", version: "1.
|
|
993
|
+
AgentCoreRuntimeHostingAdapter[_j] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.AgentCoreRuntimeHostingAdapter", version: "1.16.0" };
|
|
917
994
|
/**
|
|
918
995
|
* Interactive Agent for real-time conversational AI with SSE streaming.
|
|
919
996
|
*
|
|
@@ -1121,5 +1198,5 @@ class InteractiveAgent extends base_agent_1.BaseAgent {
|
|
|
1121
1198
|
}
|
|
1122
1199
|
exports.InteractiveAgent = InteractiveAgent;
|
|
1123
1200
|
_k = JSII_RTTI_SYMBOL_1;
|
|
1124
|
-
InteractiveAgent[_k] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.InteractiveAgent", version: "1.
|
|
1125
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJhY3RpdmUtYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZnJhbWV3b3JrL2FnZW50cy9pbnRlcmFjdGl2ZS1hZ2VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFFQUFxRTtBQUNyRSxzQ0FBc0M7QUFFdEMsNkJBQTZCO0FBQzdCLDZDQUFpRTtBQUNqRSwrREFTb0M7QUFDcEMsMkVBQWtGO0FBQ2xGLHlEQUF5SDtBQUN6SCwyREFBc0g7QUFDdEgsK0RBQThEO0FBQzlELGlEQUFrRztBQUVsRyx1REFBOEc7QUFDOUcsK0NBQTBGO0FBRTFGLDZDQUF5RDtBQUN6RCwrQ0FBMEU7QUFDMUUsaUVBQTREO0FBQzVELCtDQUFtRTtBQUNuRSxpRUFBMkU7QUFDM0Usd0NBQStDO0FBQy9DLHdEQUFxRDtBQXNFckQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Q0c7QUFDSCxNQUFhLG9CQUFvQjtJQW1CL0IsWUFBWSxRQUFtQyxFQUFFO1FBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxnQkFBZ0IsQ0FBQyxjQUF5QjtRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUZBQXVGLENBQUMsQ0FBQztRQUMzRyxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDO1FBQ2pELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM1RSxNQUFNLHNCQUFzQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUUxRCw0QkFBNEI7UUFDNUIscUVB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YyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssYUFBYSxDQUFDLEtBQTRCO1FBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNGLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakQsSUFBSSxjQUFjLEdBQUcsQ0FBQyxJQUFJLGNBQWMsR0FBRyxHQUFHLEVBQUUsQ0FBQztnQkFDL0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsbUJBQW1CLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNuSCxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUM7O0FBbE1ILDRDQW1NQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IER1cmF0aW9uLCBGbiwgUmVtb3ZhbFBvbGljeSwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge1xuICBBdXRob3JpemF0aW9uVHlwZSxcbiAgQ29nbml0b1VzZXJQb29sc0F1dGhvcml6ZXIsXG4gIENvcnMsXG4gIEVuZHBvaW50VHlwZSxcbiAgR2F0ZXdheVJlc3BvbnNlLFxuICBMYW1iZGFJbnRlZ3JhdGlvbixcbiAgUmVzcG9uc2VUeXBlLFxuICBSZXN0QXBpLFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheSc7XG5pbXBvcnQgeyBDZm5SdW50aW1lLCBDZm5SdW50aW1lRW5kcG9pbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYmVkcm9ja2FnZW50Y29yZSc7XG5pbXBvcnQgeyBVc2VyUG9vbCwgVXNlclBvb2xDbGllbnQsIE1mYSwgQWNjb3VudFJlY292ZXJ5LCBVc2VyUG9vbENsaWVudElkZW50aXR5UHJvdmlkZXIgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29nbml0byc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVUeXBlLCBCaWxsaW5nTW9kZSwgSVRhYmxlLCBTdHJlYW1WaWV3VHlwZSwgVGFibGUsIFRhYmxlRW5jcnlwdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1keW5hbW9kYic7XG5pbXBvcnQgeyBEb2NrZXJJbWFnZUFzc2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjci1hc3NldHMnO1xuaW1wb3J0IHsgSUdyYW50YWJsZSwgUm9sZSwgU2VydmljZVByaW5jaXBhbCwgUG9saWN5U3RhdGVtZW50LCBFZmZlY3QgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IElLZXksIEtleSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1rbXMnO1xuaW1wb3J0IHsgSUZ1bmN0aW9uLCBBcmNoaXRlY3R1cmUsIElMYXllclZlcnNpb24sIExheWVyVmVyc2lvbiwgRnVuY3Rpb24sIENvZGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IElCdWNrZXQsIEJ1Y2tldCwgQnVja2V0RW5jcnlwdGlvbiwgQmxvY2tQdWJsaWNBY2Nlc3MgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBCYXNlQWdlbnQsIEJhc2VBZ2VudFByb3BzIH0gZnJvbSAnLi9iYXNlLWFnZW50JztcbmltcG9ydCB7IGdlbmVyYXRlS25vd2xlZGdlQmFzZVN5c3RlbVByb21wdEFkZGl0aW9uIH0gZnJvbSAnLi9iYXRjaC1hZ2VudCc7XG5pbXBvcnQgeyBEZWZhdWx0QWdlbnRDb25maWcgfSBmcm9tICcuL2RlZmF1bHQtYWdlbnQtY29uZmlnJztcbmltcG9ydCB7IExhbWJkYUlhbVV0aWxzLCBQb3dlcnRvb2xzQ29uZmlnIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzJztcbmltcG9ydCB7IERlZmF1bHRPYnNlcnZhYmlsaXR5Q29uZmlnIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL29ic2VydmFiaWxpdHknO1xuaW1wb3J0IHsgQmVkcm9ja01vZGVsVXRpbHMgfSBmcm9tICcuLi9iZWRyb2NrJztcbmltcG9ydCB7IERlZmF1bHRSdW50aW1lcyB9IGZyb20gJy4uL2N1c3RvbS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBOZXR3b3JrIH0gZnJvbSAnLi4vZm91bmRhdGlvbic7XG5cbi8qKlxuICogU3RyYXRlZ3kgaW50ZXJmYWNlIGZvciBwbHVnZ2FibGUgY29tbXVuaWNhdGlvbiBtZWNoYW5pc21zLlxuICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBTdHJlYW1pbmdIdHRwQWRhcHRlciAoQVBJIEdhdGV3YXkgUkVTVCBBUEkgd2l0aCByZXNwb25zZSBzdHJlYW1pbmcpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElDb21tdW5pY2F0aW9uQWRhcHRlciB7XG4gIC8qKlxuICAgKiBBdHRhY2ggdGhlIGFkYXB0ZXIgdG8gYSBMYW1iZGEgZnVuY3Rpb24gYW5kIGNyZWF0ZSBjb21tdW5pY2F0aW9uIGluZnJhc3RydWN0dXJlLlxuICAgKiBSZXR1cm5zIHRoZSBwdWJsaWMgZW5kcG9pbnQgVVJMIGZvciBjbGllbnQgY29ubmVjdGlvbnMuXG4gICAqL1xuICBhdHRhY2hUb0Z1bmN0aW9uKGxhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb24pOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdyYW50IHRoZSBMYW1iZGEgZnVuY3Rpb24gcGVybWlzc2lvbiB0byBzZW5kIHJlc3BvbnNlcyBiYWNrIHRvIGNsaWVudHMuXG4gICAqL1xuICBncmFudEludm9rZShsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaHJvdHRsZSBzZXR0aW5ncyBmb3IgUkVTVCBBUEkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGhyb3R0bGVTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBSYXRlIGxpbWl0IChyZXF1ZXN0cyBwZXIgc2Vjb25kKS5cbiAgICovXG4gIHJlYWRvbmx5IHJhdGVMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogQnVyc3QgbGltaXQgKG1heGltdW0gY29uY3VycmVudCByZXF1ZXN0cykuXG4gICAqL1xuICByZWFkb25seSBidXJzdExpbWl0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgU3RyZWFtaW5nSHR0cEFkYXB0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtaW5nSHR0cEFkYXB0ZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBSRVNUIEFQSSBzdGFnZSBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAncHJvZCdcbiAgICovXG4gIHJlYWRvbmx5IHN0YWdlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhyb3R0bGUgc2V0dGluZ3MgZm9yIFJFU1QgQVBJLlxuICAgKlxuICAgKiBAZGVmYXVsdCBObyB0aHJvdHRsaW5nXG4gICAqL1xuICByZWFkb25seSB0aHJvdHRsZT86IFRocm90dGxlU2V0dGluZ3M7XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0b3IgZm9yIHNlY3VyaW5nIEFQSSBlbmRwb2ludHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFVzZXMgYXV0aGVudGljYXRvciBmcm9tIEludGVyYWN0aXZlQWdlbnRcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhlbnRpY2F0b3I/OiBJQXV0aGVudGljYXRvcjtcblxuICAvKipcbiAgICogSFRUUCBtZXRob2RzIHRvIGFsbG93IGluIENPUlMgcHJlZmxpZ2h0IHJlc3BvbnNlcy5cbiAgICogVXNlIHRoaXMgdG8gZW5hYmxlIGFkZGl0aW9uYWwgbWV0aG9kcyAoR0VULCBERUxFVEUsIFBVVCkgZm9yIGN1c3RvbSByb3V0ZXNcbiAgICogYWRkZWQgdG8gdGhlIFJFU1QgQVBJLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbJ1BPU1QnLCAnT1BUSU9OUyddXG4gICAqL1xuICByZWFkb25seSBjb3JzQWxsb3dNZXRob2RzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogU3RyZWFtaW5nIEhUVFAgYWRhcHRlciBmb3IgcmVhbC10aW1lIGFnZW50IGNvbW11bmljYXRpb24gdmlhIFNTRS5cbiAqXG4gKiBUaGlzIGFkYXB0ZXIgY3JlYXRlcyBhbiBBUEkgR2F0ZXdheSBSRVNUIEFQSSB3aXRoIHJlc3BvbnNlIHN0cmVhbWluZyBlbmFibGVkLFxuICogYWxsb3dpbmcgdGhlIExhbWJkYSBmdW5jdGlvbiB0byBzdHJlYW0gU1NFIChTZXJ2ZXItU2VudCBFdmVudHMpIHJlc3BvbnNlc1xuICogYmFjayB0byBjbGllbnRzIGFzIHRoZSBTdHJhbmRzIEFnZW50IGdlbmVyYXRlcyB0b2tlbnMuXG4gKlxuICogIyMgQXJjaGl0ZWN0dXJlXG4gKlxuICogYGBgXG4gKiBDbGllbnQg4oaSIFBPU1QgL2NoYXQg4oaSIEFQSSBHYXRld2F5IFJFU1QgQVBJIChTVFJFQU0gbW9kZSkg4oaSIExhbWJkYSAoRmFzdEFQSSArIExXQSkg4oaSIEJlZHJvY2tcbiAqIENsaWVudCDihpAgU1NFIHN0cmVhbSDihpAgQVBJIEdhdGV3YXkg4oaQIExhbWJkYSByZXNwb25zZSBzdHJlYW1pbmcg4oaQIEFnZW50IHRva2Vuc1xuICogYGBgXG4gKlxuICogIyMgRmVhdHVyZXNcbiAqXG4gKiAtICoqUmVzcG9uc2UgU3RyZWFtaW5nKio6IFByb2dyZXNzaXZlIFNTRSBkZWxpdmVyeSB2aWEgQVBJIEdhdGV3YXkgcmVzcG9uc2Ugc3RyZWFtaW5nXG4gKiAtICoqMTUtTWludXRlIFRpbWVvdXQqKjogRXh0ZW5kZWQgdGltZW91dCBmb3IgbG9uZy1ydW5uaW5nIGFnZW50IGNvbnZlcnNhdGlvbnNcbiAqIC0gKipDb2duaXRvIEF1dGgqKjogTmF0aXZlIENPR05JVE9fVVNFUl9QT09MUyBhdXRob3JpemVyIG9uIFJFU1QgQVBJXG4gKiAtICoqQ09SUyoqOiBCdWlsdC1pbiBDT1JTIHN1cHBvcnQgZm9yIGJyb3dzZXIgY2xpZW50c1xuICogLSAqKlRocm90dGxpbmcqKjogQ29uZmlndXJhYmxlIHJhdGUgYW5kIGJ1cnN0IGxpbWl0c1xuICpcbiAqICMjIEV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBBc3NldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1hc3NldHMnO1xuICogaW1wb3J0IHsgSW50ZXJhY3RpdmVBZ2VudCwgU3RyZWFtaW5nSHR0cEFkYXB0ZXIgfSBmcm9tICdAY2RrbGFicy9jZGstYXBwbW9kLWNhdGFsb2ctYmx1ZXByaW50cyc7XG4gKlxuICogY29uc3QgbXlQcm9tcHQgPSBuZXcgQXNzZXQodGhpcywgJ1Byb21wdCcsIHsgcGF0aDogJy4vcHJvbXB0LnR4dCcgfSk7XG4gKiBjb25zdCBhZGFwdGVyID0gbmV3IFN0cmVhbWluZ0h0dHBBZGFwdGVyKHtcbiAqICAgc3RhZ2VOYW1lOiAncHJvZCcsXG4gKiAgIHRocm90dGxlOiB7IHJhdGVMaW1pdDogMTAwLCBidXJzdExpbWl0OiAyMDAgfVxuICogfSk7XG4gKlxuICogY29uc3QgYWdlbnQgPSBuZXcgSW50ZXJhY3RpdmVBZ2VudCh0aGlzLCAnQWdlbnQnLCB7XG4gKiAgIGFnZW50TmFtZTogJ0NoYXRBZ2VudCcsXG4gKiAgIGFnZW50RGVmaW5pdGlvbjogeyBiZWRyb2NrTW9kZWw6IHt9LCBzeXN0ZW1Qcm9tcHQ6IG15UHJvbXB0IH0sXG4gKiAgIGNvbW11bmljYXRpb25BZGFwdGVyOiBhZGFwdGVyXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgU3RyZWFtaW5nSHR0cEFkYXB0ZXIgaW1wbGVtZW50cyBJQ29tbXVuaWNhdGlvbkFkYXB0ZXIge1xuICAvKipcbiAgICogVGhlIFJFU1QgQVBJIEdhdGV3YXkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzdEFwaT86IFJlc3RBcGk7XG5cbiAgLyoqXG4gICAqIFRoZSBDb2duaXRvIFVzZXIgUG9vbHMgYXV0aG9yaXplciAoaWYgQ29nbml0byBhdXRoZW50aWNhdGlvbiBpcyBlbmFibGVkKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb2duaXRvQXV0aG9yaXplcj86IENvZ25pdG9Vc2VyUG9vbHNBdXRob3JpemVyO1xuXG4gIC8qKlxuICAgKiBUaGUgQVBJIGVuZHBvaW50IFVSTC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhcGlFbmRwb2ludD86IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBTdHJlYW1pbmdIdHRwQWRhcHRlclByb3BzO1xuICBwcml2YXRlIHNjb3BlPzogQ29uc3RydWN0O1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBTdHJlYW1pbmdIdHRwQWRhcHRlclByb3BzID0ge30pIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIHRoZSBhZGFwdGVyIHRvIGEgTGFtYmRhIGZ1bmN0aW9uIGFuZCBjcmVhdGUgUkVTVCBBUEkgaW5mcmFzdHJ1Y3R1cmUuXG4gICAqIENyZWF0ZXMgQVBJIEdhdGV3YXkgUkVTVCBBUEkgd2l0aCBQT1NUIC9jaGF0IGVuZHBvaW50IGFuZCByZXNwb25zZSBzdHJlYW1pbmcuXG4gICAqL1xuICBhdHRhY2hUb0Z1bmN0aW9uKGxhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb24pOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5zY29wZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdHJlYW1pbmdIdHRwQWRhcHRlciBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYSBzY29wZSBiZWZvcmUgY2FsbGluZyBhdHRhY2hUb0Z1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhZ2VOYW1lID0gdGhpcy5wcm9wcy5zdGFnZU5hbWUgfHwgJ3Byb2QnO1xuICAgIGNvbnN0IGNvcnNBbGxvd01ldGhvZHMgPSB0aGlzLnByb3BzLmNvcnNBbGxvd01ldGhvZHMgfHwgWydQT1NUJywgJ09QVElPTlMnXTtcbiAgICBjb25zdCBjb3JzQWxsb3dNZXRob2RzU3RyaW5nID0gY29yc0FsbG93TWV0aG9kcy5qb2luKCcsJyk7XG5cbiAgICAvLyBDcmVhdGUgUkVTVCBBUEkgd2l0aCBDT1JTXG4gICAgLy8gVXNlIFJFR0lPTkFMIGVuZHBvaW50IGZvciA1LW1pbnV0ZSBpZGxlIHRpbWVvdXQgKHZzIDMwcyBmb3IgRURHRSkuXG4gICAgLy8gVGhpcyBhbGxvd3MgcmVzcG9uc2Ugc3RyZWFtaW5nIHRvIGV4Y2VlZCBBUEkgR2F0ZXdheSdzIDI5cyBsaW1pdC5cbiAgICBjb25zdCByZXN0QXBpID0gbmV3IFJlc3RBcGkodGhpcy5zY29wZSwgJ0NoYXRBcGknLCB7XG4gICAgICByZXN0QXBpTmFtZTogYCR7U3RhY2sub2YodGhpcy5zY29wZSkuc3RhY2tOYW1lfS1DaGF0QXBpYCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSW50ZXJhY3RpdmUgQWdlbnQgQ2hhdCBBUEkgd2l0aCByZXNwb25zZSBzdHJlYW1pbmcnLFxuICAgICAgZW5kcG9pbnRUeXBlczogW0VuZHBvaW50VHlwZS5SRUdJT05BTF0sXG4gICAgICBkZXBsb3lPcHRpb25zOiB7XG4gICAgICAgIHN0YWdlTmFtZSxcbiAgICAgICAgdGhyb3R0bGluZ1JhdGVMaW1pdDogdGhpcy5wcm9wcy50aHJvdHRsZT8ucmF0ZUxpbWl0LFxuICAgICAgICB0aHJvdHRsaW5nQnVyc3RMaW1pdDogdGhpcy5wcm9wcy50aHJvdHRsZT8uYnVyc3RMaW1pdCxcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0Q29yc1ByZWZsaWdodE9wdGlvbnM6IHtcbiAgICAgICAgYWxsb3dPcmlnaW5zOiBDb3JzLkFMTF9PUklHSU5TLFxuICAgICAgICBhbGxvd01ldGhvZHM6IGNvcnNBbGxvd01ldGhvZHMsXG4gICAgICAgIGFsbG93SGVhZGVyczogWydDb250ZW50LVR5cGUnLCAnQXV0aG9yaXphdGlvbiddLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICAodGhpcyBhcyBhbnkpLnJlc3RBcGkgPSByZXN0QXBpO1xuXG4gICAgLy8gQWRkIENPUlMgaGVhZGVycyB0byBBUEkgR2F0ZXdheSBlcnJvciByZXNwb25zZXMgKDRYWC81WFgpLlxuICAgIC8vIFdpdGhvdXQgdGhlc2UsIHRoZSBDb2duaXRvIGF1dGhvcml6ZXIncyA0MDEgcmVzcG9uc2Ugd29uJ3QgaW5jbHVkZVxuICAgIC8vIEFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbiBhbmQgdGhlIGJyb3dzZXIgd2lsbCBibG9jayBpdCBhcyBhIENPUlMgZXJyb3IuXG4gICAgbmV3IEdhdGV3YXlSZXNwb25zZSh0aGlzLnNjb3BlLCAnR2F0ZXdheURlZmF1bHQ0WFgnLCB7XG4gICAgICByZXN0QXBpLFxuICAgICAgdHlwZTogUmVzcG9uc2VUeXBlLkRFRkFVTFRfNFhYLFxuICAgICAgcmVzcG9uc2VIZWFkZXJzOiB7XG4gICAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nOiBcIicqJ1wiLFxuICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycyc6IFwiJ0NvbnRlbnQtVHlwZSxBdXRob3JpemF0aW9uJ1wiLFxuICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcyc6IGAnJHtjb3JzQWxsb3dNZXRob2RzU3RyaW5nfSdgLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBuZXcgR2F0ZXdheVJlc3BvbnNlKHRoaXMuc2NvcGUsICdHYXRld2F5RGVmYXVsdDVYWCcsIHtcbiAgICAgIHJlc3RBcGksXG4gICAgICB0eXBlOiBSZXNwb25zZVR5cGUuREVGQVVMVF81WFgsXG4gICAgICByZXNwb25zZUhlYWRlcnM6IHtcbiAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbic6IFwiJyonXCIsXG4gICAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJzogXCInQ29udGVudC1UeXBlLEF1dGhvcml6YXRpb24nXCIsXG4gICAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJzogYCcke2NvcnNBbGxvd01ldGhvZHNTdHJpbmd9J2AsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIExhbWJkYSBpbnRlZ3JhdGlvblxuICAgIGNvbnN0IGxhbWJkYUludGVncmF0aW9uID0gbmV3IExhbWJkYUludGVncmF0aW9uKGxhbWJkYUZ1bmN0aW9uLCB7XG4gICAgICBwcm94eTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIEFkZCAvY2hhdCByZXNvdXJjZSB3aXRoIFBPU1QgbWV0aG9kXG4gICAgY29uc3QgY2hhdFJlc291cmNlID0gcmVzdEFwaS5yb290LmFkZFJlc291cmNlKCdjaGF0Jyk7XG5cbiAgICAvLyBEZXRlcm1pbmUgYXV0aG9yaXphdGlvbiB0eXBlXG4gICAgbGV0IGF1dGhvcml6YXRpb25UeXBlID0gQXV0aG9yaXphdGlvblR5cGUuTk9ORTtcbiAgICBsZXQgYXV0aG9yaXplcjogQ29nbml0b1VzZXJQb29sc0F1dGhvcml6ZXIgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5hdXRoZW50aWNhdG9yIGluc3RhbmNlb2YgQ29nbml0b0F1dGhlbnRpY2F0b3IgJiYgdGhpcy5wcm9wcy5hdXRoZW50aWNhdG9yLnVzZXJQb29sKSB7XG4gICAgICBhdXRob3JpemVyID0gbmV3IENvZ25pdG9Vc2VyUG9vbHNBdXRob3JpemVyKHRoaXMuc2NvcGUsICdDb2duaXRvQXV0aG9yaXplcicsIHtcbiAgICAgICAgY29nbml0b1VzZXJQb29sczogW3RoaXMucHJvcHMuYXV0aGVudGljYXRvci51c2VyUG9vbF0sXG4gICAgICAgIGF1dGhvcml6ZXJOYW1lOiAnQ29nbml0b0F1dGhvcml6ZXInLFxuICAgICAgfSk7XG4gICAgICAodGhpcyBhcyBhbnkpLmNvZ25pdG9BdXRob3JpemVyID0gYXV0aG9yaXplcjtcbiAgICAgIGF1dGhvcml6YXRpb25UeXBlID0gQXV0aG9yaXphdGlvblR5cGUuQ09HTklUTztcbiAgICB9XG5cbiAgICBjb25zdCBwb3N0TWV0aG9kID0gY2hhdFJlc291cmNlLmFkZE1ldGhvZCgnUE9TVCcsIGxhbWJkYUludGVncmF0aW9uLCB7XG4gICAgICBhdXRob3JpemF0aW9uVHlwZSxcbiAgICAgIGF1dGhvcml6ZXIsXG4gICAgfSk7XG5cbiAgICAvLyBDb25maWd1cmUgcmVzcG9uc2Ugc3RyZWFtaW5nIHZpYSBDZm5NZXRob2QgZXNjYXBlIGhhdGNoXG4gICAgLy8gQVBJIEdhdGV3YXkgUkVTVCBBUEkgcmVzcG9uc2Ugc3RyZWFtaW5nIHJlcXVpcmVzOlxuICAgIC8vIDEuIHJlc3BvbnNlVHJhbnNmZXJNb2RlOiBTVFJFQU0gb24gdGhlIGludGVncmF0aW9uXG4gICAgLy8gMi4gSW50ZWdyYXRpb24gVVJJIHBvaW50aW5nIHRvIC9yZXNwb25zZS1zdHJlYW1pbmctaW52b2NhdGlvbnNcbiAgICBjb25zdCBjZm5NZXRob2QgPSBwb3N0TWV0aG9kLm5vZGUuZGVmYXVsdENoaWxkIGFzIGFueTtcbiAgICBpZiAoY2ZuTWV0aG9kKSB7XG4gICAgICBjZm5NZXRob2QuYWRkUHJvcGVydHlPdmVycmlkZSgnSW50ZWdyYXRpb24uUmVzcG9uc2VUcmFuc2Zlck1vZGUnLCAnU1RSRUFNJyk7XG4gICAgICAvLyBPdmVycmlkZSB0aGUgaW50ZWdyYXRpb24gVVJJIHRvIHVzZSByZXNwb25zZS1zdHJlYW1pbmctaW52b2NhdGlvbnMgcGF0aFxuICAgICAgY29uc3QgcmVnaW9uID0gU3RhY2sub2YodGhpcy5zY29wZSkucmVnaW9uO1xuICAgICAgY2ZuTWV0aG9kLmFkZFByb3BlcnR5T3ZlcnJpZGUoXG4gICAgICAgICdJbnRlZ3JhdGlvbi5VcmknLFxuICAgICAgICBgYXJuOmF3czphcGlnYXRld2F5OiR7cmVnaW9ufTpsYW1iZGE6cGF0aC8yMDIxLTExLTE1L2Z1bmN0aW9ucy8ke2xhbWJkYUZ1bmN0aW9uLmZ1bmN0aW9uQXJufS9yZXNwb25zZS1zdHJlYW1pbmctaW52b2NhdGlvbnNgLFxuICAgICAgKTtcbiAgICAgIC8vIFNldCBpbnRlZ3JhdGlvbiB0aW1lb3V0IHRvIDE1IG1pbnV0ZXMgKDkwMDAwMCBtcylcbiAgICAgIGNmbk1ldGhvZC5hZGRQcm9wZXJ0eU92ZXJyaWRlKCdJbnRlZ3JhdGlvbi5UaW1lb3V0SW5NaWxsaXMnLCA5MDAwMDApO1xuICAgIH1cblxuICAgIC8vIEdyYW50IEFQSSBHYXRld2F5IHBlcm1pc3Npb24gdG8gaW52b2tlIExhbWJkYSB3aXRoIHJlc3BvbnNlIHN0cmVhbWluZ1xuICAgIGxhbWJkYUZ1bmN0aW9uLmFkZFBlcm1pc3Npb24oJ0FwaUdhdGV3YXlJbnZva2UnLCB7XG4gICAgICBwcmluY2lwYWw6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKCdhcGlnYXRld2F5LmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIHNvdXJjZUFybjogcmVzdEFwaS5hcm5Gb3JFeGVjdXRlQXBpKCksXG4gICAgfSk7XG5cbiAgICAvLyBBbHNvIGdyYW50IEludm9rZVdpdGhSZXNwb25zZVN0cmVhbSBwZXJtaXNzaW9uXG4gICAgbGFtYmRhRnVuY3Rpb24uYWRkUGVybWlzc2lvbignQXBpR2F0ZXdheVN0cmVhbUludm9rZScsIHtcbiAgICAgIHByaW5jaXBhbDogbmV3IFNlcnZpY2VQcmluY2lwYWwoJ2FwaWdhdGV3YXkuYW1hem9uYXdzLmNvbScpLFxuICAgICAgc291cmNlQXJuOiByZXN0QXBpLmFybkZvckV4ZWN1dGVBcGkoJ1BPU1QnLCAnL2NoYXQnKSxcbiAgICAgIGFjdGlvbjogJ2xhbWJkYTpJbnZva2VGdW5jdGlvblVybCcsXG4gICAgfSk7XG5cbiAgICAvLyBDb25zdHJ1Y3QgZW5kcG9pbnQgVVJMXG4gICAgY29uc3QgdXJsID0gcmVzdEFwaS51cmxGb3JQYXRoKCcvY2hhdCcpO1xuICAgICh0aGlzIGFzIGFueSkuYXBpRW5kcG9pbnQgPSB1cmw7XG5cbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHRoZSBMYW1iZGEgZnVuY3Rpb24gcGVybWlzc2lvbnMgZm9yIEFQSSBHYXRld2F5IGludGVncmF0aW9uLlxuICAgKiBGb3IgUkVTVCBBUEkgc3RyZWFtaW5nLCBubyBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGFyZSBuZWVkZWQgYmV5b25kIHRoZSBpbnZva2UgcGVybWlzc2lvbi5cbiAgICovXG4gIGdyYW50SW52b2tlKF9sYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKTogdm9pZCB7XG4gICAgLy8gUkVTVCBBUEkgc3RyZWFtaW5nIGRvZXNuJ3QgbmVlZCBwb3N0X3RvX2Nvbm5lY3Rpb24gbGlrZSBXZWJTb2NrZXQuXG4gICAgLy8gVGhlIExhbWJkYSBpbnZva2UgcGVybWlzc2lvbiBpcyBhbHJlYWR5IGdyYW50ZWQgaW4gYXR0YWNoVG9GdW5jdGlvbi5cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBhZGFwdGVyIHdpdGggYSBDREsgc2NvcGUuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBhdHRhY2hUb0Z1bmN0aW9uIG9yIGdyYW50SW52b2tlLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfc2V0U2NvcGUoc2NvcGU6IENvbnN0cnVjdCk6IHZvaWQge1xuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcbiAgfVxufVxuXG4vKipcbiAqIFN0cmF0ZWd5IGludGVyZmFjZSBmb3Igc2Vzc2lvbiBwZXJzaXN0ZW5jZS5cbiAqXG4gKiBTZXNzaW9uIHN0b3JlcyBtYW5hZ2UgY29udmVyc2F0aW9uIHN0YXRlIHBlcnNpc3RlbmNlIGFjcm9zcyBIVFRQIHJlcXVlc3RzLlxuICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gKFMzU2Vzc2lvbk1hbmFnZXIpIHVzZXMgUzMgZm9yIGR1cmFibGUgc3RvcmFnZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgU3RyYW5kcy1uYXRpdmUgYFMzU2Vzc2lvbk1hbmFnZXJgIGZyb20gYHN0cmFuZHMuc2Vzc2lvbi5zM19zZXNzaW9uX21hbmFnZXJgIGluc3RlYWQuXG4gKiBUaGUgUHl0aG9uIGhhbmRsZXIgbm93IHVzZXMgU3RyYW5kcy1uYXRpdmUgc2Vzc2lvbiBtYW5hZ2VtZW50IGF1dG9tYXRpY2FsbHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVNlc3Npb25TdG9yZSB7XG4gIC8qKlxuICAgKiBUaGUgUzMgYnVja2V0IHVzZWQgZm9yIHNlc3Npb24gc3RvcmFnZSAoaWYgUzMtYmFzZWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbkJ1Y2tldD86IElCdWNrZXQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQvd3JpdGUgcGVybWlzc2lvbnMgdG8gYSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBsYW1iZGFGdW5jdGlvbiAtIFRoZSBMYW1iZGEgZnVuY3Rpb24gdGhhdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHNlc3Npb24gc3RvcmVcbiAgICovXG4gIGdyYW50UmVhZFdyaXRlKGxhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb24pOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgUzNTZXNzaW9uTWFuYWdlci5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgU3RyYW5kcy1uYXRpdmUgYFMzU2Vzc2lvbk1hbmFnZXJgIGZyb20gYHN0cmFuZHMuc2Vzc2lvbi5zM19zZXNzaW9uX21hbmFnZXJgIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUzNTZXNzaW9uTWFuYWdlclByb3BzIHtcbiAgLyoqXG4gICAqIFMzIGJ1Y2tldCBmb3Igc2Vzc2lvbiBzdG9yYWdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBdXRvLWNyZWF0ZWQgYnVja2V0IHdpdGggS01TIGVuY3J5cHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldD86IElCdWNrZXQ7XG5cbiAgLyoqXG4gICAqIFRpbWUtdG8tbGl2ZSBmb3Igc2Vzc2lvbnMuXG4gICAqIFNlc3Npb25zIG9sZGVyIHRoYW4gdGhpcyBkdXJhdGlvbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGVsZXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uaG91cnMoMjQpXG4gICAqL1xuICByZWFkb25seSBzZXNzaW9uVFRMPzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEtNUyBlbmNyeXB0aW9uIGtleSBmb3IgdGhlIHNlc3Npb24gYnVja2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBBdXRvLWNyZWF0ZWQgS01TIGtleSB3aXRoIHJvdGF0aW9uIGVuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBJS2V5O1xuXG4gIC8qKlxuICAgKiBSZW1vdmFsIHBvbGljeSBmb3IgdGhlIHNlc3Npb24gYnVja2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LkRFU1RST1lcbiAgICovXG4gIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5O1xufVxuXG4vKipcbiAqIFMzLWJhc2VkIHNlc3Npb24gbWFuYWdlciBmb3IgcGVyc2lzdGluZyBjb252ZXJzYXRpb24gc3RhdGUuXG4gKlxuICogVXNlcyBTMyBmb3IgZHVyYWJsZSBzdG9yYWdlIG9mIHNlc3Npb24gZGF0YSB3aXRoIGF1dG9tYXRpYyBleHBpcmF0aW9uXG4gKiB2aWEgbGlmZWN5Y2xlIHBvbGljaWVzLiBFYWNoIEhUVFAgcmVxdWVzdCBsb2Fkcy9zYXZlcyBzZXNzaW9uIHN0YXRlLFxuICogZW5hYmxpbmcgbXVsdGktdHVybiBjb252ZXJzYXRpb25zIG92ZXIgc3RhdGVsZXNzIEhUVFAuXG4gKlxuICogIyMgRmVhdHVyZXNcbiAqXG4gKiAtICoqRHVyYWJsZSBTdG9yYWdlKio6IFNlc3Npb25zIHBlcnNpc3RlZCB0byBTMyBzdXJ2aXZlIExhbWJkYSByZXN0YXJ0c1xuICogLSAqKkF1dG9tYXRpYyBFeHBpcmF0aW9uKio6IExpZmVjeWNsZSBwb2xpY3kgcmVtb3ZlcyBvbGQgc2Vzc2lvbnNcbiAqIC0gKipFbmNyeXB0aW9uKio6IEtNUyBlbmNyeXB0aW9uIGF0IHJlc3RcbiAqIC0gKipDb3N0IE9wdGltaXphdGlvbioqOiBTMyBTdGFuZGFyZCBzdG9yYWdlIHdpdGggbGlmZWN5Y2xlIG1hbmFnZW1lbnRcbiAqXG4gKiAjIyBVc2FnZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEFzc2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWFzc2V0cyc7XG4gKiBpbXBvcnQgeyBJbnRlcmFjdGl2ZUFnZW50LCBTM1Nlc3Npb25NYW5hZ2VyIH0gZnJvbSAnQGNka2xhYnMvY2RrLWFwcG1vZC1jYXRhbG9nLWJsdWVwcmludHMnO1xuICogaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYic7XG4gKlxuICogY29uc3QgbXlQcm9tcHQgPSBuZXcgQXNzZXQodGhpcywgJ1Byb21wdCcsIHsgcGF0aDogJy4vcHJvbXB0LnR4dCcgfSk7XG4gKiBjb25zdCBzZXNzaW9uTWFuYWdlciA9IG5ldyBTM1Nlc3Npb25NYW5hZ2VyKHRoaXMsICdTZXNzaW9uTWFuYWdlcicsIHtcbiAqICAgc2Vzc2lvblRUTDogRHVyYXRpb24uaG91cnMoNDgpXG4gKiB9KTtcbiAqXG4gKiBjb25zdCBhZ2VudCA9IG5ldyBJbnRlcmFjdGl2ZUFnZW50KHRoaXMsICdBZ2VudCcsIHtcbiAqICAgYWdlbnROYW1lOiAnQ2hhdEFnZW50JyxcbiAqICAgYWdlbnREZWZpbml0aW9uOiB7IGJlZHJvY2tNb2RlbDoge30sIHN5c3RlbVByb21wdDogbXlQcm9tcHQgfSxcbiAqICAgc2Vzc2lvblN0b3JlOiBzZXNzaW9uTWFuYWdlclxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgU3RyYW5kcy1uYXRpdmUgYFMzU2Vzc2lvbk1hbmFnZXJgIGZyb20gYHN0cmFuZHMuc2Vzc2lvbi5zM19zZXNzaW9uX21hbmFnZXJgIGluc3RlYWQuXG4gKiBUaGUgUHl0aG9uIGhhbmRsZXIgbm93IHVzZXMgU3RyYW5kcy1uYXRpdmUgc2Vzc2lvbiBtYW5hZ2VtZW50IGF1dG9tYXRpY2FsbHkuXG4gKiBBbiBTMyBidWNrZXQgaXMgc3RpbGwgY3JlYXRlZCBmb3IgdGhlIFN0cmFuZHMgc2Vzc2lvbiBtYW5hZ2VyOyB0aGlzIENESyBjbGFzc1xuICogaXMgbm8gbG9uZ2VyIG5lZWRlZCB0byBjb25maWd1cmUgc2Vzc2lvbiBwZXJzaXN0ZW5jZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFMzU2Vzc2lvbk1hbmFnZXIgaW1wbGVtZW50cyBJU2Vzc2lvblN0b3JlIHtcbiAgLyoqXG4gICAqIFRoZSBTMyBidWNrZXQgdXNlZCBmb3Igc2Vzc2lvbiBzdG9yYWdlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJ1Y2tldDogSUJ1Y2tldDtcblxuICAvKipcbiAgICogVGhlIHNlc3Npb24gVFRMIGR1cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlc3Npb25UVEw6IER1cmF0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTM1Nlc3Npb25NYW5hZ2VyUHJvcHMgPSB7fSkge1xuICAgIGNvbnN0IHJlbW92YWxQb2xpY3kgPSBwcm9wcy5yZW1vdmFsUG9saWN5IHx8IFJlbW92YWxQb2xpY3kuREVTVFJPWTtcbiAgICBjb25zdCBzZXNzaW9uVFRMID0gcHJvcHMuc2Vzc2lvblRUTCB8fCBEdXJhdGlvbi5ob3VycygyNCk7XG5cbiAgICAvLyBVc2UgcHJvdmlkZWQgYnVja2V0IG9yIGNyZWF0ZSBuZXcgb25lXG4gICAgdGhpcy5idWNrZXQgPSBwcm9wcy5idWNrZXQgfHwgbmV3IEJ1Y2tldChzY29wZSwgYCR7aWR9QnVja2V0YCwge1xuICAgICAgZW5jcnlwdGlvbjogQnVja2V0RW5jcnlwdGlvbi5LTVMsXG4gICAgICBlbmNyeXB0aW9uS2V5OiBwcm9wcy5lbmNyeXB0aW9uS2V5LFxuICAgICAgcmVtb3ZhbFBvbGljeTogcmVtb3ZhbFBvbGljeSxcbiAgICAgIGF1dG9EZWxldGVPYmplY3RzOiByZW1vdmFsUG9saWN5ID09PSBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICBsaWZlY3ljbGVSdWxlczogW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdEZWxldGVPbGRTZXNzaW9ucycsXG4gICAgICAgICAgZXhwaXJhdGlvbjogc2Vzc2lvblRUTCxcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGVuZm9yY2VTU0w6IHRydWUsXG4gICAgICB2ZXJzaW9uZWQ6IGZhbHNlLFxuICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IEJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICB9KTtcblxuICAgIHRoaXMuc2Vzc2lvblRUTCA9IHNlc3Npb25UVEw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIFMzIGJ1Y2tldCB1c2VkIGZvciBzZXNzaW9uIHN0b3JhZ2UgKElTZXNzaW9uU3RvcmUgaW50ZXJmYWNlKS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2Vzc2lvbkJ1Y2tldCgpOiBJQnVja2V0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQ7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgcmVhZC93cml0ZSBwZXJtaXNzaW9ucyB0byBhIExhbWJkYSBmdW5jdGlvbi5cbiAgICovXG4gIGdyYW50UmVhZFdyaXRlKGxhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLmJ1Y2tldC5ncmFudFJlYWRXcml0ZShsYW1iZGFGdW5jdGlvbik7XG4gIH1cbn1cblxuLyoqXG4gKiBTdHJhdGVneSBpbnRlcmZhY2UgZm9yIGNvbnZlcnNhdGlvbiBoaXN0b3J5IG1hbmFnZW1lbnQuXG4gKlxuICogQ29udGV4dCBzdHJhdGVnaWVzIGNvbnRyb2wgaG93IGNvbnZlcnNhdGlvbiBoaXN0b3J5IGlzIG1haW50YWluZWQgYW5kIHByb3ZpZGVkXG4gKiB0byB0aGUgYWdlbnQuIERpZmZlcmVudCBzdHJhdGVnaWVzIGVuYWJsZSBkaWZmZXJlbnQgY29udmVyc2F0aW9uIHBhdHRlcm5zLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBTdHJhbmRzLW5hdGl2ZSBgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXJgIGZyb21cbiAqIGBzdHJhbmRzLmFnZW50LmNvbnZlcnNhdGlvbl9tYW5hZ2VyYCBpbnN0ZWFkLiBUaGUgUHl0aG9uIGhhbmRsZXIgbm93IHVzZXNcbiAqIFN0cmFuZHMtbmF0aXZlIGNvbnZlcnNhdGlvbiBtYW5hZ2VtZW50IGF1dG9tYXRpY2FsbHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRleHRTdHJhdGVneSB7XG4gIC8qKlxuICAgKiBHZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBMYW1iZGEgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGNvbmZpZ3VyZSB0aGUgY29udGV4dCBtYW5hZ2VyXG4gICAqL1xuICBlbnZpcm9ubWVudFZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIFN0cmFuZHMtbmF0aXZlIGBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlcmAgZnJvbVxuICogYHN0cmFuZHMuYWdlbnQuY29udmVyc2F0aW9uX21hbmFnZXJgIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcyB0byBrZWVwIGluIGNvbnZlcnNhdGlvbiBoaXN0b3J5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAyMCBtZXNzYWdlc1xuICAgKi9cbiAgcmVhZG9ubHkgd2luZG93U2l6ZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBTbGlkaW5nIHdpbmRvdyBjb252ZXJzYXRpb24gbWFuYWdlciBmb3IgbWFpbnRhaW5pbmcgcmVjZW50IGNvbnZlcnNhdGlvbiBoaXN0b3J5LlxuICpcbiAqIEtlZXBzIGEgZml4ZWQtc2l6ZSB3aW5kb3cgb2YgcmVjZW50IG1lc3NhZ2VzLCBhdXRvbWF0aWNhbGx5IGRpc2NhcmRpbmcgb2xkZXJcbiAqIG1lc3NhZ2VzIGFzIG5ldyBvbmVzIGFycml2ZS4gUHJvdmlkZXMgY29uc2lzdGVudCBjb250ZXh0IHNpemUgZm9yIHRoZSBhZ2VudC5cbiAqXG4gKiAjIyBVc2FnZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEFzc2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWFzc2V0cyc7XG4gKiBpbXBvcnQgeyBJbnRlcmFjdGl2ZUFnZW50LCBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlciB9IGZyb20gJ0BjZGtsYWJzL2Nkay1hcHBtb2QtY2F0YWxvZy1ibHVlcHJpbnRzJztcbiAqXG4gKiBjb25zdCBteVByb21wdCA9IG5ldyBBc3NldCh0aGlzLCAnUHJvbXB0JywgeyBwYXRoOiAnLi9wcm9tcHQudHh0JyB9KTtcbiAqIGNvbnN0IGNvbnRleHRNYW5hZ2VyID0gbmV3IFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyKHsgd2luZG93U2l6ZTogMzAgfSk7XG4gKlxuICogY29uc3QgYWdlbnQgPSBuZXcgSW50ZXJhY3RpdmVBZ2VudCh0aGlzLCAnQWdlbnQnLCB7XG4gKiAgIGFnZW50TmFtZTogJ0NoYXRBZ2VudCcsXG4gKiAgIGFnZW50RGVmaW5pdGlvbjogeyBiZWRyb2NrTW9kZWw6IHt9LCBzeXN0ZW1Qcm9tcHQ6IG15UHJvbXB0IH0sXG4gKiAgIGNvbnRleHRTdHJhdGVneTogY29udGV4dE1hbmFnZXJcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIFN0cmFuZHMtbmF0aXZlIGBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlcmAgZnJvbVxuICogYHN0cmFuZHMuYWdlbnQuY29udmVyc2F0aW9uX21hbmFnZXJgIGluc3RlYWQuIFRoZSBQeXRob24gaGFuZGxlciBub3cgaGFuZGxlc1xuICogY29udmVyc2F0aW9uIHdpbmRvd2luZyBuYXRpdmVseS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyIGltcGxlbWVudHMgSUNvbnRleHRTdHJhdGVneSB7XG4gIC8qKlxuICAgKiBUaGUgd2luZG93IHNpemUgKG51bWJlciBvZiBtZXNzYWdlcyB0byBrZWVwKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB3aW5kb3dTaXplOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyUHJvcHMgPSB7fSkge1xuICAgIGNvbnN0IHdpbmRvd1NpemUgPSBwcm9wcy53aW5kb3dTaXplICE9PSB1bmRlZmluZWQgPyBwcm9wcy53aW5kb3dTaXplIDogMjA7XG5cbiAgICBpZiAod2luZG93U2l6ZSA8IDEgfHwgd2luZG93U2l6ZSA+IDEwMDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2luZG93U2l6ZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAwMCcpO1xuICAgIH1cblxuICAgIHRoaXMud2luZG93U2l6ZSA9IHdpbmRvd1NpemU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGFtYmRhIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBlbnZpcm9ubWVudFZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4ge1xuICAgICAgQ09OVEVYVF9FTkFCTEVEOiAndHJ1ZScsXG4gICAgICBDT05URVhUX1NUUkFURUdZOiAnU2xpZGluZ1dpbmRvdycsXG4gICAgICBDT05URVhUX1dJTkRPV19TSVpFOiB0aGlzLndpbmRvd1NpemUudG9TdHJpbmcoKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogTnVsbCBjb252ZXJzYXRpb24gbWFuYWdlciBmb3Igc3RhdGVsZXNzIGludGVyYWN0aW9ucy5cbiAqXG4gKiBEaXNhYmxlcyBjb252ZXJzYXRpb24gaGlzdG9yeSwgdHJlYXRpbmcgZWFjaCBtZXNzYWdlIGFzIGluZGVwZW5kZW50LlxuICogVXNlZnVsIGZvciBzdGF0ZWxlc3MgdXNlIGNhc2VzIHdoZXJlIGNvbnRleHQgaXMgbm90IG5lZWRlZC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBUaGUgUHl0aG9uIGhhbmRsZXIgbm93IHVzZXMgU3RyYW5kcy1uYXRpdmUgY29udmVyc2F0aW9uIG1hbmFnZW1lbnQuXG4gKiBUbyBkaXNhYmxlIGNvbnZlcnNhdGlvbiBoaXN0b3J5LCBvbWl0IHRoZSBzZXNzaW9uIGJ1Y2tldCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgTnVsbENvbnZlcnNhdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBJQ29udGV4dFN0cmF0ZWd5IHtcbiAgLyoqXG4gICAqIEdldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExhbWJkYSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZW52aXJvbm1lbnRWYXJpYWJsZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIENPTlRFWFRfRU5BQkxFRDogJ2ZhbHNlJyxcbiAgICAgIENPTlRFWFRfU1RSQVRFR1k6ICdOdWxsJyxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogU3RyYXRlZ3kgaW50ZXJmYWNlIGZvciBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zLlxuICpcbiAqIEF1dGhlbnRpY2F0b3JzIGNvbnRyb2wgaG93IEFQSSBlbmRwb2ludHMgYXJlIHNlY3VyZWQuXG4gKiBEaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIHN1cHBvcnQgdmFyaW91cyBhdXRoZW50aWNhdGlvbiBtZXRob2RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElBdXRoZW50aWNhdG9yIHtcbiAgLyoqXG4gICAqIEdyYW50IGF1dGhlbnRpY2F0aW9uIHBlcm1pc3Npb25zIHRvIGEgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKi9cbiAgZ3JhbnRBdXRoZW50aWNhdGUobGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEdldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExhbWJkYSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZW52aXJvbm1lbnRWYXJpYWJsZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIENvZ25pdG9BdXRoZW50aWNhdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZ25pdG9BdXRoZW50aWNhdG9yUHJvcHMge1xuICAvKipcbiAgICogQ29nbml0byBVc2VyIFBvb2wgZm9yIGF1dGhlbnRpY2F0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBdXRvLWNyZWF0ZWQgVXNlciBQb29sIHdpdGggc2VjdXJlIGRlZmF1bHRzXG4gICAqL1xuICByZWFkb25seSB1c2VyUG9vbD86IFVzZXJQb29sO1xuXG4gIC8qKlxuICAgKiBDb2duaXRvIFVzZXIgUG9vbCBDbGllbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IEF1dG8tY3JlYXRlZCBjbGllbnQgd2l0aCBhcHByb3ByaWF0ZSBhdXRoIGZsb3dzXG4gICAqL1xuICByZWFkb25seSB1c2VyUG9vbENsaWVudD86IFVzZXJQb29sQ2xpZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmFsIHBvbGljeSBmb3IgQ29nbml0byByZXNvdXJjZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlbW92YWxQb2xpY3kuREVTVFJPWVxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3k7XG59XG5cbi8qKlxuICogQ29nbml0by1iYXNlZCBhdXRoZW50aWNhdG9yIGZvciBzZWN1cmluZyBSRVNUIEFQSSBlbmRwb2ludHMuXG4gKlxuICogQ3JlYXRlcyBhIENvZ25pdG8gVXNlciBQb29sIGFuZCBpbnRlZ3JhdGVzIHdpdGggQVBJIEdhdGV3YXkgUkVTVCBBUElcbiAqIHVzaW5nIHRoZSBuYXRpdmUgQ09HTklUT19VU0VSX1BPT0xTIGF1dGhvcml6ZXIgdHlwZS4gQ2xpZW50cyBzZW5kXG4gKiBKV1QgdG9rZW5zIGluIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlci5cbiAqXG4gKiAjIyBGZWF0dXJlc1xuICpcbiAqIC0gKipOYXRpdmUgSldUIFZhbGlkYXRpb24qKjogQVBJIEdhdGV3YXkgdmFsaWRhdGVzIHRva2VucyB3aXRob3V0IGN1c3RvbSBMYW1iZGFcbiAqIC0gKipVc2VyIE1hbmFnZW1lbnQqKjogQnVpbHQtaW4gdXNlciByZWdpc3RyYXRpb24gYW5kIG1hbmFnZW1lbnRcbiAqIC0gKipQYXNzd29yZCBQb2xpY2llcyoqOiBFbmZvcmNlcyBzdHJvbmcgcGFzc3dvcmQgcmVxdWlyZW1lbnRzXG4gKiAtICoqQWNjb3VudCBSZWNvdmVyeSoqOiBFbWFpbC1iYXNlZCBhY2NvdW50IHJlY292ZXJ5XG4gKlxuICogIyMgVXNhZ2VcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBBc3NldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1hc3NldHMnO1xuICogaW1wb3J0IHsgUmVtb3ZhbFBvbGljeSB9IGZyb20gJ2F3cy1jZGstbGliJztcbiAqIGltcG9ydCB7IEludGVyYWN0aXZlQWdlbnQsIENvZ25pdG9BdXRoZW50aWNhdG9yIH0gZnJvbSAnQGNka2xhYnMvY2RrLWFwcG1vZC1jYXRhbG9nLWJsdWVwcmludHMnO1xuICpcbiAqIGNvbnN0IG15UHJvbXB0ID0gbmV3IEFzc2V0KHRoaXMsICdQcm9tcHQnLCB7IHBhdGg6ICcuL3Byb21wdC50eHQnIH0pO1xuICogY29uc3QgYXV0aGVudGljYXRvciA9IG5ldyBDb2duaXRvQXV0aGVudGljYXRvcih7XG4gKiAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuUkVUQUlOXG4gKiB9KTtcbiAqXG4gKiBjb25zdCBhZ2VudCA9IG5ldyBJbnRlcmFjdGl2ZUFnZW50KHRoaXMsICdBZ2VudCcsIHtcbiAqICAgYWdlbnROYW1lOiAnQ2hhdEFnZW50JyxcbiAqICAgYWdlbnREZWZpbml0aW9uOiB7IGJlZHJvY2tNb2RlbDoge30sIHN5c3RlbVByb21wdDogbXlQcm9tcHQgfSxcbiAqICAgYXV0aGVudGljYXRvclxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIENvZ25pdG9BdXRoZW50aWNhdG9yIGltcGxlbWVudHMgSUF1dGhlbnRpY2F0b3Ige1xuICAvKipcbiAgICogVGhlIENvZ25pdG8gVXNlciBQb29sLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVzZXJQb29sPzogVXNlclBvb2w7XG5cbiAgLyoqXG4gICAqIFRoZSBDb2duaXRvIFVzZXIgUG9vbCBDbGllbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclBvb2xDbGllbnQ/OiBVc2VyUG9vbENsaWVudDtcblxuICBwcml2YXRlIHNjb3BlPzogQ29uc3RydWN0O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3k7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IENvZ25pdG9BdXRoZW50aWNhdG9yUHJvcHMgPSB7fSkge1xuICAgIHRoaXMudXNlclBvb2wgPSBwcm9wcy51c2VyUG9vbDtcbiAgICB0aGlzLnVzZXJQb29sQ2xpZW50ID0gcHJvcHMudXNlclBvb2xDbGllbnQ7XG4gICAgdGhpcy5yZW1vdmFsUG9saWN5ID0gcHJvcHMucmVtb3ZhbFBvbGljeSB8fCBSZW1vdmFsUG9saWN5LkRFU1RST1k7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgYXV0aGVudGljYXRpb24gcGVybWlzc2lvbnMgdG8gYSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqIEdyYW50cyBwZXJtaXNzaW9ucyB0byB2ZXJpZnkgQ29nbml0byB0b2tlbnMuXG4gICAqL1xuICBncmFudEF1dGhlbnRpY2F0ZShsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNjb3BlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvZ25pdG9BdXRoZW50aWNhdG9yIG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIHNjb3BlIGJlZm9yZSBjYWxsaW5nIGdyYW50QXV0aGVudGljYXRlJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnVzZXJQb29sKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgUG9vbCBtdXN0IGJlIGNyZWF0ZWQgYmVmb3JlIGdyYW50aW5nIHBlcm1pc3Npb25zLiBDYWxsIF9zZXRTY29wZSBmaXJzdC4nKTtcbiAgICB9XG5cbiAgICBsYW1iZGFGdW5jdGlvbi5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnY29nbml0by1pZHA6R2V0VXNlcicsXG4gICAgICAgICAgJ2NvZ25pdG8taWRwOkFkbWluR2V0VXNlcicsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogW3RoaXMudXNlclBvb2wudXNlclBvb2xBcm5dLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBMYW1iZGEgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGVudmlyb25tZW50VmFyaWFibGVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB7XG4gICAgICBBVVRIX1RZUEU6ICdDb2duaXRvJyxcbiAgICAgIFVTRVJfUE9PTF9JRDogdGhpcy51c2VyUG9vbD8udXNlclBvb2xJZCB8fCAnJyxcbiAgICAgIFVTRVJfUE9PTF9DTElFTlRfSUQ6IHRoaXMudXNlclBvb2xDbGllbnQ/LnVzZXJQb29sQ2xpZW50SWQgfHwgJycsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBhdXRoZW50aWNhdG9yIHdpdGggYSBDREsgc2NvcGUuXG4gICAqIENyZWF0ZXMgVXNlciBQb29sIGFuZCBDbGllbnQgaWYgbm90IHByb3ZpZGVkLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfc2V0U2NvcGUoc2NvcGU6IENvbnN0cnVjdCk6IHZvaWQge1xuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcblxuICAgIGlmICghdGhpcy51c2VyUG9vbCkge1xuICAgICAgKHRoaXMgYXMgYW55KS51c2VyUG9vbCA9IG5ldyBVc2VyUG9vbChzY29wZSwgJ1VzZXJQb29sJywge1xuICAgICAgICB1c2VyUG9vbE5hbWU6IGAke1N0YWNrLm9mKHNjb3BlKS5zdGFja05hbWV9LVVzZXJQb29sYCxcbiAgICAgICAgc2VsZlNpZ25VcEVuYWJsZWQ6IHRydWUsXG4gICAgICAgIHNpZ25JbkFsaWFzZXM6IHtcbiAgICAgICAgICBlbWFpbDogdHJ1ZSxcbiAgICAgICAgICB1c2VybmFtZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgYXV0b1ZlcmlmeToge1xuICAgICAgICAgIGVtYWlsOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBwYXNzd29yZFBvbGljeToge1xuICAgICAgICAgIG1pbkxlbmd0aDogOCxcbiAgICAgICAgICByZXF1aXJlTG93ZXJjYXNlOiB0cnVlLFxuICAgICAgICAgIHJlcXVpcmVVcHBlcmNhc2U6IHRydWUsXG4gICAgICAgICAgcmVxdWlyZURpZ2l0czogdHJ1ZSxcbiAgICAgICAgICByZXF1aXJlU3ltYm9sczogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgbWZhOiBNZmEuT1BUSU9OQUwsXG4gICAgICAgIG1mYVNlY29uZEZhY3Rvcjoge1xuICAgICAgICAgIHNtczogdHJ1ZSxcbiAgICAgICAgICBvdHA6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGFjY291bnRSZWNvdmVyeTogQWNjb3VudFJlY292ZXJ5LkVNQUlMX09OTFksXG4gICAgICAgIHJlbW92YWxQb2xpY3k6IHRoaXMucmVtb3ZhbFBvbGljeSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghdGhpcy51c2VyUG9vbENsaWVudCAmJiB0aGlzLnVzZXJQb29sKSB7XG4gICAgICAodGhpcyBhcyBhbnkpLnVzZXJQb29sQ2xpZW50ID0gbmV3IFVzZXJQb29sQ2xpZW50KHNjb3BlLCAnVXNlclBvb2xDbGllbnQnLCB7XG4gICAgICAgIHVzZXJQb29sOiB0aGlzLnVzZXJQb29sLFxuICAgICAgICB1c2VyUG9vbENsaWVudE5hbWU6IGAke1N0YWNrLm9mKHNjb3BlKS5zdGFja05hbWV9LVVzZXJQb29sQ2xpZW50YCxcbiAgICAgICAgYXV0aEZsb3dzOiB7XG4gICAgICAgICAgdXNlclBhc3N3b3JkOiB0cnVlLFxuICAgICAgICAgIHVzZXJTcnA6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGdlbmVyYXRlU2VjcmV0OiBmYWxzZSxcbiAgICAgICAgc3VwcG9ydGVkSWRlbnRpdHlQcm92aWRlcnM6IFtcbiAgICAgICAgICBVc2VyUG9vbENsaWVudElkZW50aXR5UHJvdmlkZXIuQ09HTklUTyxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFN0cmF0ZWd5IGludGVyZmFjZSBmb3Igc2Vzc2lvbiBpbmRleCBzdG9yYWdlLlxuICpcbiAqIFNlc3Npb24gaW5kZXhlcyBwcm92aWRlIGZhc3QgdXNlciB0byBzZXNzaW9uIGxvb2t1cHMgZm9yIGxpc3RpbmcgYW5kIG1hbmFnaW5nIHNlc3Npb25zLlxuICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gKER5bmFtb0RCU2Vzc2lvbkluZGV4KSB1c2VzIER5bmFtb0RCIGZvciBlZmZpY2llbnQgcXVlcmllcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU2Vzc2lvbkluZGV4IHtcbiAgLyoqXG4gICAqIEdyYW50IHJlYWQvd3JpdGUgcGVybWlzc2lvbnMgdG8gYSBncmFudGVlLlxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSAtIFRoZSBwcmluY2lwYWwgdGhhdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHNlc3Npb24gaW5kZXhcbiAgICovXG4gIGdyYW50UmVhZFdyaXRlKGdyYW50ZWU6IElHcmFudGFibGUpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBHZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBMYW1iZGEgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGNvbmZpZ3VyZSB0aGUgc2Vzc2lvbiBpbmRleFxuICAgKi9cbiAgZW52aXJvbm1lbnRWYXJpYWJsZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIER5bmFtb0RCU2Vzc2lvbkluZGV4LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtb0RCU2Vzc2lvbkluZGV4UHJvcHMge1xuICAvKipcbiAgICogRXhpc3RpbmcgRHluYW1vREIgdGFibGUgdG8gdXNlLlxuICAgKiBUYWJsZSBtdXN0IGhhdmUgcGFydGl0aW9uIGtleSAndXNlcl9pZCcgKFN0cmluZykgYW5kIHNvcnQga2V5ICdzZXNzaW9uX2lkJyAoU3RyaW5nKS5cbiAgICpcbiAgICogQGRlZmF1bHQgQXV0by1jcmVhdGVkIHRhYmxlXG4gICAqL1xuICByZWFkb25seSB0YWJsZT86IElUYWJsZTtcblxuICAvKipcbiAgICogVGltZS10by1saXZlIGZvciBzZXNzaW9uIGluZGV4IHJlY29yZHMuXG4gICAqIFdoZW4gc2V0LCBleHBpcmVkIHJlY29yZHMgYXJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBieSBEeW5hbW9EQiBUVEwuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vIFRUTCAoc2Vzc2lvbnMgcGVyc2lzdCB1bnRpbCBleHBsaWNpdGx5IGRlbGV0ZWQpXG4gICAqL1xuICByZWFkb25seSBzZXNzaW9uVFRMPzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEtNUyBrZXkgZm9yIHRhYmxlIGVuY3J5cHRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IEFXUyBtYW5hZ2VkIGVuY3J5cHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBJS2V5O1xuXG4gIC8qKlxuICAgKiBSZW1vdmFsIHBvbGljeSBmb3IgdGhlIER5bmFtb0RCIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LkRFU1RST1lcbiAgICovXG4gIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5O1xufVxuXG4vKipcbiAqIER5bmFtb0RCLWJhc2VkIHNlc3Npb24gaW5kZXggZm9yIGZhc3QgdXNlciB0byBzZXNzaW9uIGxvb2t1cHMuXG4gKlxuICogQ3JlYXRlcyBhIER5bmFtb0RCIHRhYmxlIGluZGV4ZWQgYnkgdXNlcl9pZCAocGFydGl0aW9uIGtleSkgYW5kIHNlc3Npb25faWQgKHNvcnQga2V5KVxuICogZm9yIGVmZmljaWVudCBxdWVyeWluZyBvZiBhIHVzZXIncyBzZXNzaW9ucy4gVGhlIHRhYmxlIHN0b3JlcyBzZXNzaW9uIG1ldGFkYXRhXG4gKiBpbmNsdWRpbmcgY3JlYXRpb24gdGltZSwgbGFzdCB1cGRhdGUgdGltZSwgYW5kIG9wdGlvbmFsIFRUTCBmb3IgYXV0b21hdGljIGNsZWFudXAuXG4gKlxuICogIyMgVGFibGUgU2NoZW1hXG4gKlxuICogLSAqKlBhcnRpdGlvbiBLZXkqKjogdXNlcl9pZCAoU3RyaW5nKSAtIFVzZXIgaWRlbnRpZmllciBmcm9tIGF1dGhlbnRpY2F0aW9uXG4gKiAtICoqU29ydCBLZXkqKjogc2Vzc2lvbl9pZCAoU3RyaW5nKSAtIFVuaXF1ZSBzZXNzaW9uIGlkZW50aWZpZXJcbiAqIC0gKipBdHRyaWJ1dGVzKio6IGNyZWF0ZWRfYXQsIHVwZGF0ZWRfYXQsIGxhc3RfbWVzc2FnZSwgZXhwaXJlc19hdCAob3B0aW9uYWwpXG4gKlxuICogIyMgRmVhdHVyZXNcbiAqXG4gKiAtICoqRmFzdCBMb29rdXBzKio6IFF1ZXJ5IGFsbCBzZXNzaW9ucyBmb3IgYSB1c2VyIGluIE8oMSkgdXNpbmcgcGFydGl0aW9uIGtleVxuICogLSAqKkF1dG9tYXRpYyBFeHBpcmF0aW9uKio6IE9wdGlvbmFsIFRUTCByZW1vdmVzIHN0YWxlIHNlc3Npb25zIGF1dG9tYXRpY2FsbHlcbiAqIC0gKipPbi1EZW1hbmQgQ2FwYWNpdHkqKjogUGF5LXBlci1yZXF1ZXN0IGJpbGxpbmcsIG5vIGNhcGFjaXR5IHBsYW5uaW5nIG5lZWRlZFxuICogLSAqKkVuY3J5cHRpb24qKjogQVdTIG1hbmFnZWQgb3IgY3VzdG9tZXItbWFuYWdlZCBLTVMgZW5jcnlwdGlvblxuICpcbiAqICMjIFVzYWdlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbiAqIGltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSAnYXdzLWNkay1saWInO1xuICogaW1wb3J0IHsgSW50ZXJhY3RpdmVBZ2VudCwgRHluYW1vREJTZXNzaW9uSW5kZXggfSBmcm9tICdAY2RrbGFicy9jZGstYXBwbW9kLWNhdGFsb2ctYmx1ZXByaW50cyc7XG4gKlxuICogY29uc3QgbXlQcm9tcHQgPSBuZXcgQXNzZXQodGhpcywgJ1Byb21wdCcsIHsgcGF0aDogJy4vcHJvbXB0LnR4dCcgfSk7XG4gKiBjb25zdCBzZXNzaW9uSW5kZXggPSBuZXcgRHluYW1vREJTZXNzaW9uSW5kZXgodGhpcywgJ1Nlc3Npb25JbmRleCcsIHtcbiAqICAgc2Vzc2lvblRUTDogRHVyYXRpb24uZGF5cyg3KVxuICogfSk7XG4gKlxuICogY29uc3QgYWdlbnQgPSBuZXcgSW50ZXJhY3RpdmVBZ2VudCh0aGlzLCAnQWdlbnQnLCB7XG4gKiAgIGFnZW50TmFtZTogJ0NoYXRBZ2VudCcsXG4gKiAgIGFnZW50RGVmaW5pdGlvbjogeyBiZWRyb2NrTW9kZWw6IHt9LCBzeXN0ZW1Qcm9tcHQ6IG15UHJvbXB0IH0sXG4gKiAgIHNlc3Npb25JbmRleFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIER5bmFtb0RCU2Vzc2lvbkluZGV4IGltcGxlbWVudHMgSVNlc3Npb25JbmRleCB7XG4gIC8qKlxuICAgKiBUaGUgRHluYW1vREIgdGFibGUgdXNlZCBmb3Igc2Vzc2lvbiBpbmRleCBzdG9yYWdlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhYmxlOiBJVGFibGU7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXNzaW9uIFRUTCBkdXJhdGlvbiAoaWYgY29uZmlndXJlZCkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2Vzc2lvblRUTD86IER1cmF0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEeW5hbW9EQlNlc3Npb25JbmRleFByb3BzID0ge30pIHtcbiAgICBjb25zdCByZW1vdmFsUG9saWN5ID0gcHJvcHMucmVtb3ZhbFBvbGljeSB8fCBSZW1vdmFsUG9saWN5LkRFU1RST1k7XG5cbiAgICAvLyBVc2UgcHJvdmlkZWQgdGFibGUgb3IgY3JlYXRlIG5ldyBvbmVcbiAgICBpZiAocHJvcHMudGFibGUpIHtcbiAgICAgIHRoaXMudGFibGUgPSBwcm9wcy50YWJsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFibGVQcm9wczogYW55ID0ge1xuICAgICAgICBwYXJ0aXRpb25LZXk6IHsgbmFtZTogJ3VzZXJfaWQnLCB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyB9LFxuICAgICAgICBzb3J0S2V5OiB7IG5hbWU6ICdzZXNzaW9uX2lkJywgdHlwZTogQXR0cmlidXRlVHlwZS5TVFJJTkcgfSxcbiAgICAgICAgYmlsbGluZ01vZGU6IEJpbGxpbmdNb2RlLlBBWV9QRVJfUkVRVUVTVCxcbiAgICAgICAgZW5jcnlwdGlvbjogcHJvcHMuZW5jcnlwdGlvbktleSA/IFRhYmxlRW5jcnlwdGlvbi5DVVNUT01FUl9NQU5BR0VEIDogVGFibGVFbmNyeXB0aW9uLkFXU19NQU5BR0VELFxuICAgICAgICBlbmNyeXB0aW9uS2V5OiBwcm9wcy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICByZW1vdmFsUG9saWN5OiByZW1vdmFsUG9saWN5LFxuICAgICAgICBwb2ludEluVGltZVJlY292ZXJ5OiB0cnVlLFxuICAgICAgICBzdHJlYW06IFN0cmVhbVZpZXdUeXBlLk5FV19BTkRfT0xEX0lNQUdFUyxcbiAgICAgIH07XG5cbiAgICAgIC8vIEVuYWJsZSBUVEwgaWYgc2Vzc2lvblRUTCBpcyBzcGVjaWZpZWRcbiAgICAgIGlmIChwcm9wcy5zZXNzaW9uVFRMKSB7XG4gICAgICAgIHRhYmxlUHJvcHMudGltZVRvTGl2ZUF0dHJpYnV0ZSA9ICdleHBpcmVzX2F0JztcbiAgICAgIH1cblxuICAgICAgdGhpcy50YWJsZSA9IG5ldyBUYWJsZShzY29wZSwgYCR7aWR9VGFibGVgLCB0YWJsZVByb3BzKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlc3Npb25UVEwgPSBwcm9wcy5zZXNzaW9uVFRMO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQvd3JpdGUgcGVybWlzc2lvbnMgdG8gYSBncmFudGVlLlxuICAgKi9cbiAgZ3JhbnRSZWFkV3JpdGUoZ3JhbnRlZTogSUdyYW50YWJsZSk6IHZvaWQge1xuICAgIHRoaXMudGFibGUuZ3JhbnRSZWFkV3JpdGVEYXRhKGdyYW50ZWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExhbWJkYSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZW52aXJvbm1lbnRWYXJpYWJsZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgU0VTU0lPTl9JTkRFWF9UQUJMRTogdGhpcy50YWJsZS50YWJsZU5hbWUsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnNlc3Npb25UVEwpIHtcbiAgICAgIGVudi5TRVNTSU9OX0lOREVYX1RUTF9TRUNPTkRTID0gdGhpcy5zZXNzaW9uVFRMLnRvU2Vjb25kcygpLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudjtcbiAgfVxufVxuXG4vKipcbiAqIE5vLWF1dGhlbnRpY2F0aW9uIGF1dGhlbnRpY2F0b3IgZm9yIGRldmVsb3BtZW50IGFuZCB0ZXN0aW5nLlxuICpcbiAqIERpc2FibGVzIGF1dGhlbnRpY2F0aW9uIGVudGlyZWx5LCBhbGxvd2luZyBhbnkgY2xpZW50IHRvIGNvbm5lY3RcbiAqIHdpdGhvdXQgY3JlZGVudGlhbHMuIFRoaXMgc2hvdWxkIE9OTFkgYmUgdXNlZCBmb3IgZGV2ZWxvcG1lbnRcbiAqIGFuZCB0ZXN0aW5nIGVudmlyb25tZW50cy5cbiAqXG4gKiAjIyBTZWN1cml0eSBXYXJuaW5nXG4gKlxuICogVGhpcyBhdXRoZW50aWNhdG9yIHByb3ZpZGVzIE5PIHNlY3VyaXR5LiBOZXZlciB1c2UgaW4gcHJvZHVjdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE5vQXV0aGVudGljYXRvciBpbXBsZW1lbnRzIElBdXRoZW50aWNhdG9yIHtcbiAgLyoqXG4gICAqIE5vLW9wIGZvciBOb0F1dGhlbnRpY2F0b3Igc2luY2Ugbm8gYXV0aGVudGljYXRpb24gaXMgcGVyZm9ybWVkLlxuICAgKi9cbiAgZ3JhbnRBdXRoZW50aWNhdGUoX2xhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAvLyBObyBwZXJtaXNzaW9ucyBuZWVkZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBMYW1iZGEgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGVudmlyb25tZW50VmFyaWFibGVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB7XG4gICAgICBBVVRIX1RZUEU6ICdOb25lJyxcbiAgICB9O1xuICB9XG59XG5cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHBhc3NlZCB0byBhIGhvc3RpbmcgYWRhcHRlcidzIGRlcGxveSBtZXRob2QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRIb3N0aW5nQ29uZmlnIHtcbiAgLyoqIENESyBzY29wZSBmb3IgY3JlYXRpbmcgcmVzb3VyY2VzLiAqL1xuICByZWFkb25seSBzY29wZTogQ29uc3RydWN0O1xuICAvKiogQWdlbnQgbmFtZSBpZGVudGlmaWVyLiAqL1xuICByZWFkb25seSBhZ2VudE5hbWU6IHN0cmluZztcbiAgLyoqIElBTSByb2xlIGZvciB0aGUgYWdlbnQgcnVudGltZS4gKi9cbiAgcmVhZG9ubHkgYWdlbnRSb2xlOiBSb2xlO1xuICAvKiogRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHNldCBvbiB0aGUgcnVudGltZS4gKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBLTVMgZW5jcnlwdGlvbiBrZXkuICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk6IEtleTtcbiAgLyoqIE9wdGlvbmFsIFZQQyBuZXR3b3JrIGNvbmZpZ3VyYXRpb24uICovXG4gIHJlYWRvbmx5IG5ldHdvcms/OiBOZXR3b3JrO1xuICAvKiogTGFtYmRhIGFyY2hpdGVjdHVyZSAoTGFtYmRhIGhvc3Rpbmcgb25seSkuICovXG4gIHJlYWRvbmx5IGFyY2hpdGVjdHVyZT86IEFyY2hpdGVjdHVyZTtcbiAgLyoqIExhbWJkYSBtZW1vcnkgc2l6ZSBpbiBNQiAoTGFtYmRhIGhvc3Rpbmcgb25seSkuICovXG4gIHJlYWRvbmx5IG1lbW9yeVNpemU/OiBudW1iZXI7XG4gIC8qKiBMYW1iZGEgdGltZW91dCAoTGFtYmRhIGhvc3Rpbmcgb25seSkuICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBEdXJhdGlvbjtcbiAgLyoqIFJlc2VydmVkIGNvbmN1cnJlbnQgZXhlY3V0aW9ucyAoTGFtYmRhIGhvc3Rpbmcgb25seSkuICovXG4gIHJlYWRvbmx5IHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM/OiBudW1iZXI7XG4gIC8qKiBMYW1iZGEgbGF5ZXJzIGZyb20gYWdlbnQgZGVmaW5pdGlvbiAoTGFtYmRhIGhvc3Rpbmcgb25seSkuICovXG4gIHJlYWRvbmx5IGxhbWJkYUxheWVycz86IElMYXllclZlcnNpb25bXTtcbiAgLyoqIExhbWJkYSBsYXllcnMgZnJvbSBrbm93bGVkZ2UgYmFzZXMgKExhbWJkYSBob3N0aW5nIG9ubHkpLiAqL1xuICByZWFkb25seSBrbm93bGVkZ2VCYXNlTGF5ZXJzPzogSUxheWVyVmVyc2lvbltdO1xuICAvKiogV2hldGhlciBvYnNlcnZhYmlsaXR5IGlzIGVuYWJsZWQuICovXG4gIHJlYWRvbmx5IGVuYWJsZU9ic2VydmFiaWxpdHk/OiBib29sZWFuO1xuICAvKiogQWdlbnQgdG9vbHMgbG9jYXRpb24gZGVmaW5pdGlvbnMgKEpTT04gc2VyaWFsaXplZCkuICovXG4gIHJlYWRvbmx5IHRvb2xzQ29uZmlnOiBzdHJpbmc7XG4gIC8qKiBTeXN0ZW0gcHJvbXB0IFMzIGJ1Y2tldCBuYW1lLiAqL1xuICByZWFkb25seSBzeXN0ZW1Qcm9tcHRCdWNrZXQ6IHN0cmluZztcbiAgLyoqIFN5c3RlbSBwcm9tcHQgUzMga2V5LiAqL1xuICByZWFkb25seSBzeXN0ZW1Qcm9tcHRLZXk6IHN0cmluZztcbiAgLyoqIEtub3dsZWRnZSBiYXNlIGNvbmZpZ3MgKEpTT04gc2VyaWFsaXplZCkuICovXG4gIHJlYWRvbmx5IGtub3dsZWRnZUJhc2VDb25maWdzPzogc3RyaW5nO1xuICAvKiogS25vd2xlZGdlIGJhc2Ugc3lzdGVtIHByb21wdCBhZGRpdGlvbi4gKi9cbiAgcmVhZG9ubHkga25vd2xlZGdlQmFzZVN5c3RlbVByb21wdEFkZGl0aW9uPzogc3RyaW5nO1xuICAvKiogUmVtb3ZhbCBwb2xpY3kgZm9yIHJlc291cmNlcy4gKi9cbiAgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3k7XG59XG5cbi8qKlxuICogUmVzdWx0IHJldHVybmVkIGJ5IGEgaG9zdGluZyBhZGFwdGVyJ3MgZGVwbG95IG1ldGhvZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZ2VudEhvc3RpbmdSZXN1bHQge1xuICAvKiogVGhlIGFnZW50IGVuZHBvaW50IFVSTCBvciBBUk4uICovXG4gIHJlYWRvbmx5IGVuZHBvaW50OiBzdHJpbmc7XG4gIC8qKiBUaGUgTGFtYmRhIGZ1bmN0aW9uIChpZiBMYW1iZGEtaG9zdGVkKS4gKi9cbiAgcmVhZG9ubHkgYWdlbnRGdW5jdGlvbj86IElGdW5jdGlvbjtcbiAgLyoqIFRoZSBBZ2VudENvcmUgQ2ZuUnVudGltZSAoaWYgQWdlbnRDb3JlLWhvc3RlZCkuICovXG4gIHJlYWRvbmx5IGNmblJ1bnRpbWU/OiBDZm5SdW50aW1lO1xufVxuXG4vKipcbiAqIFN0cmF0ZWd5IGludGVyZmFjZSBmb3IgcGx1Z2dhYmxlIGhvc3RpbmcgYmFja2VuZHMuXG4gKlxuICogSG9zdGluZyBhZGFwdGVycyBlbmNhcHN1bGF0ZSB0aGUgaW5mcmFzdHJ1Y3R1cmUgbmVlZGVkIHRvIHJ1biBhbiBhZ2VudC5cbiAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGBMYW1iZGFIb3N0aW5nQWRhcHRlcmAgKExhbWJkYSArIExXQSArIEFQSSBHYXRld2F5KS5cbiAqIGBBZ2VudENvcmVSdW50aW1lSG9zdGluZ0FkYXB0ZXJgIHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHVzaW5nIEFnZW50Q29yZSBSdW50aW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3N0aW5nQWRhcHRlciB7XG4gIC8qKlxuICAgKiBUaGUgSUFNIHNlcnZpY2UgcHJpbmNpcGFsIHRoYXQgdGhpcyBob3N0aW5nIGJhY2tlbmQgcmVxdWlyZXMuXG4gICAqXG4gICAqIEJhc2VBZ2VudCB1c2VzIHRoaXMgdG8gY3JlYXRlIHRoZSBhZ2VudCByb2xlIHdpdGggdGhlIGNvcnJlY3QgdHJ1c3QgcG9saWN5LlxuICAgKiBGb3IgZXhhbXBsZSwgTGFtYmRhIGhvc3RpbmcgcmVxdWlyZXMgYGxhbWJkYS5hbWF6b25hd3MuY29tYCB3aGlsZSBBZ2VudENvcmVcbiAgICogaG9zdGluZyByZXF1aXJlcyBgYmVkcm9jay1hZ2VudGNvcmUuYW1hem9uYXdzLmNvbWAuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlUHJpbmNpcGFsOiBTZXJ2aWNlUHJpbmNpcGFsO1xuXG4gIC8qKlxuICAgKiBEZXBsb3kgdGhlIGFnZW50IGhvc3RpbmcgaW5mcmFzdHJ1Y3R1cmUuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIGZvciB0aGUgYWdlbnQgaG9zdGluZ1xuICAgKiBAcmV0dXJucyBUaGUgaG9zdGluZyByZXN1bHQgaW5jbHVkaW5nIGVuZHBvaW50IGFuZCBvcHRpb25hbCByZXNvdXJjZXNcbiAgICovXG4gIGRlcGxveShjb25maWc6IEFnZW50SG9zdGluZ0NvbmZpZyk6IEFnZW50SG9zdGluZ1Jlc3VsdDtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIExhbWJkYUhvc3RpbmdBZGFwdGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExhbWJkYUhvc3RpbmdBZGFwdGVyUHJvcHMge1xuICAvKipcbiAgICogQ29tbXVuaWNhdGlvbiBhZGFwdGVyIGZvciBjbGllbnQtYWdlbnQgaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IFN0cmVhbWluZ0h0dHBBZGFwdGVyXG4gICAqL1xuICByZWFkb25seSBjb21tdW5pY2F0aW9uQWRhcHRlcj86IElDb21tdW5pY2F0aW9uQWRhcHRlcjtcblxuICAvKipcbiAgICogQXV0aGVudGljYXRvciBmb3Igc2VjdXJpbmcgQVBJIGVuZHBvaW50cy5cbiAgICpcbiAgICogQGRlZmF1bHQgQ29nbml0b0F1dGhlbnRpY2F0b3JcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhlbnRpY2F0b3I/OiBJQXV0aGVudGljYXRvcjtcblxuICAvKipcbiAgICogSFRUUCBtZXRob2RzIHRvIGFsbG93IGluIENPUlMgcHJlZmxpZ2h0IHJlc3BvbnNlcy5cbiAgICogVXNlIHRoaXMgdG8gZW5hYmxlIGFkZGl0aW9uYWwgbWV0aG9kcyAoR0VULCBERUxFVEUsIFBVVCkgZm9yIGN1c3RvbSByb3V0ZXNcbiAgICogYWRkZWQgdG8gdGhlIFJFU1QgQVBJLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbJ1BPU1QnLCAnT1BUSU9OUyddXG4gICAqL1xuICByZWFkb25seSBjb3JzQWxsb3dNZXRob2RzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIExhbWJkYSBmdW5jdGlvbiBtZW1vcnkgc2l6ZSBpbiBNQi5cbiAgICpcbiAgICogQGRlZmF1bHQgMTAyNFxuICAgKi9cbiAgcmVhZG9ubHkgbWVtb3J5U2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogTGFtYmRhIGZ1bmN0aW9uIHRpbWVvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLm1pbnV0ZXMoMTUpXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIExhbWJkYSBmdW5jdGlvbiBhcmNoaXRlY3R1cmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IEFyY2hpdGVjdHVyZS5YODZfNjRcbiAgICovXG4gIHJlYWRvbmx5IGFyY2hpdGVjdHVyZT86IEFyY2hpdGVjdHVyZTtcblxuICAvKipcbiAgICogUmVzZXJ2ZWQgY29uY3VycmVudCBleGVjdXRpb25zIGZvciB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBObyByZXNlcnZlZCBjb25jdXJyZW5jeVxuICAgKi9cbiAgcmVhZG9ubHkgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBMYW1iZGEgaG9zdGluZyBhZGFwdGVyIGZvciBJbnRlcmFjdGl2ZUFnZW50LlxuICpcbiAqIERlcGxveXMgdGhlIGFnZW50IGFzIGEgTGFtYmRhIGZ1bmN0aW9uIGJlaGluZCBMYW1iZGEgV2ViIEFkYXB0ZXIgYW5kIEFQSSBHYXRld2F5XG4gKiBSRVNUIEFQSSB3aXRoIHJlc3BvbnNlIHN0cmVhbWluZy4gVGhpcyBpcyB0aGUgZGVmYXVsdCBob3N0aW5nIGJhY2tlbmQuXG4gKlxuICogIyMgQXJjaGl0ZWN0dXJlXG4gKlxuICogYGBgXG4gKiBDbGllbnQg4oaSIFBPU1QgL2NoYXQg4oaSIEFQSSBHYXRld2F5IFJFU1QgQVBJIChTVFJFQU0pIOKGkiBMYW1iZGEgKEZhc3RBUEkgKyBMV0EpIOKGkiBCZWRyb2NrXG4gKiBDbGllbnQg4oaQIFNTRSBzdHJlYW0g4oaQIEFQSSBHYXRld2F5IOKGkCBMYW1iZGEgcmVzcG9uc2Ugc3RyZWFtaW5nIOKGkCBBZ2VudCB0b2tlbnNcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTGFtYmRhSG9zdGluZ0FkYXB0ZXIgaW1wbGVtZW50cyBJSG9zdGluZ0FkYXB0ZXIge1xuICAvKiogVGhlIGNvbW11bmljYXRpb24gYWRhcHRlci4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbW11bmljYXRpb25BZGFwdGVyPzogSUNvbW11bmljYXRpb25BZGFwdGVyO1xuICAvKiogVGhlIGF1dGhlbnRpY2F0b3IuICovXG4gIHB1YmxpYyByZWFkb25seSBhdXRoZW50aWNhdG9yPzogSUF1dGhlbnRpY2F0b3I7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogTGFtYmRhSG9zdGluZ0FkYXB0ZXJQcm9wcztcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogTGFtYmRhSG9zdGluZ0FkYXB0ZXJQcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB9XG5cbiAgZ2V0IHNlcnZpY2VQcmluY2lwYWwoKSB7IHJldHVybiBuZXcgU2VydmljZVByaW5jaXBhbCgnbGFtYmRhLmFtYXpvbmF3cy5jb20nKTsgfVxuXG4gIC8qKlxuICAgKiBEZXBsb3kgTGFtYmRhICsgTFdBICsgQVBJIEdhdGV3YXkgaG9zdGluZyBpbmZyYXN0cnVjdHVyZS5cbiAgICovXG4gIGRlcGxveShjb25maWc6IEFnZW50SG9zdGluZ0NvbmZpZyk6IEFnZW50SG9zdGluZ1Jlc3VsdCB7XG4gICAgY29uc3Qgc2NvcGUgPSBjb25maWcuc2NvcGU7XG5cbiAgICAvLyBJbml0aWFsaXplIGF1dGhlbnRpY2F0b3JcbiAgICBjb25zdCBhdXRoZW50aWNhdG9yID0gdGhpcy5wcm9wcy5hdXRoZW50aWNhdG9yICE9PSB1bmRlZmluZWRcbiAgICAgID8gdGhpcy5wcm9wcy5hdXRoZW50aWNhdG9yXG4gICAgICA6IG5ldyBDb2duaXRvQXV0aGVudGljYXRvcigpO1xuICAgICh0aGlzIGFzIGFueSkuYXV0aGVudGljYXRvciA9IGF1dGhlbnRpY2F0b3I7XG5cbiAgICBpZiAoYXV0aGVudGljYXRvciBpbnN0YW5jZW9mIENvZ25pdG9BdXRoZW50aWNhdG9yKSB7XG4gICAgICBhdXRoZW50aWNhdG9yLl9zZXRTY29wZShzY29wZSk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBjb21tdW5pY2F0aW9uIGFkYXB0ZXJcbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5wcm9wcy5jb21tdW5pY2F0aW9uQWRhcHRlciB8fCBuZXcgU3RyZWFtaW5nSHR0cEFkYXB0ZXIoe1xuICAgICAgYXV0aGVudGljYXRvcixcbiAgICAgIGNvcnNBbGxvd01ldGhvZHM6IHRoaXMucHJvcHMuY29yc0FsbG93TWV0aG9kcyxcbiAgICB9KTtcbiAgICAodGhpcyBhcyBhbnkpLmNvbW11bmljYXRpb25BZGFwdGVyID0gYWRhcHRlcjtcblxuICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgU3RyZWFtaW5nSHR0cEFkYXB0ZXIpIHtcbiAgICAgIGFkYXB0ZXIuX3NldFNjb3BlKHNjb3BlKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICBjb25zdCBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAuLi5jb25maWcuZW52aXJvbm1lbnQsXG4gICAgICAvLyBMYW1iZGEgV2ViIEFkYXB0ZXIgY29uZmlndXJhdGlvblxuICAgICAgQVdTX0xBTUJEQV9FWEVDX1dSQVBQRVI6ICcvb3B0L2Jvb3RzdHJhcCcsXG4gICAgICBBV1NfTFdBX0lOVk9LRV9NT0RFOiAncmVzcG9uc2Vfc3RyZWFtJyxcbiAgICAgIEFXU19MV0FfUkVBRElORVNTX0NIRUNLX1BBVEg6ICcvaGVhbHRoJyxcbiAgICAgIEFXU19MV0FfUE9SVDogJzgwODAnLFxuICAgICAgUE9SVDogJzgwODAnLFxuICAgICAgLi4uYXV0aGVudGljYXRvci5lbnZpcm9ubWVudFZhcmlhYmxlcygpLFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgTGFtYmRhIGZ1bmN0aW9uIHdpdGggTGFtYmRhIFdlYiBBZGFwdGVyIGxheWVyXG4gICAgY29uc3QgeyBhY2NvdW50LCByZWdpb24gfSA9IFN0YWNrLm9mKHNjb3BlKTtcbiAgICBjb25zdCBhZ2VudExhbWJkYUxvZ1Blcm1pc3Npb25zUmVzdWx0ID0gTGFtYmRhSWFtVXRpbHMuY3JlYXRlTG9nc1Blcm1pc3Npb25zKHtcbiAgICAgIGFjY291bnQsXG4gICAgICByZWdpb24sXG4gICAgICBzY29wZSxcbiAgICAgIGZ1bmN0aW9uTmFtZTogY29uZmlnLmFnZW50TmFtZSxcbiAgICAgIGVuYWJsZU9ic2VydmFiaWxpdHk6IGNvbmZpZy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgIH0pO1xuXG4gICAgLy8gTGFtYmRhIFdlYiBBZGFwdGVyIGxheWVyXG4gICAgY29uc3Qgd2ViQWRhcHRlckxheWVyID0gTGF5ZXJWZXJzaW9uLmZyb21MYXllclZlcnNpb25Bcm4oXG4gICAgICBzY29wZSxcbiAgICAgICdMYW1iZGFXZWJBZGFwdGVyTGF5ZXInLFxuICAgICAgYGFybjphd3M6bGFtYmRhOiR7cmVnaW9ufTo3NTMyNDA1OTgwNzU6bGF5ZXI6TGFtYmRhQWRhcHRlckxheWVyWDg2OjI1YCxcbiAgICApO1xuXG4gICAgY29uc3QgYWxsTGF5ZXJzOiBJTGF5ZXJWZXJzaW9uW10gPSBbd2ViQWRhcHRlckxheWVyXTtcbiAgICBpZiAoY29uZmlnLmxhbWJkYUxheWVycykge1xuICAgICAgYWxsTGF5ZXJzLnB1c2goLi4uY29uZmlnLmxhbWJkYUxheWVycyk7XG4gICAgfVxuICAgIGlmIChjb25maWcua25vd2xlZGdlQmFzZUxheWVycyAmJiBjb25maWcua25vd2xlZGdlQmFzZUxheWVycy5sZW5ndGggPiAwKSB7XG4gICAgICBhbGxMYXllcnMucHVzaCguLi5jb25maWcua25vd2xlZGdlQmFzZUxheWVycyk7XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlclBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAncmVzb3VyY2VzL2ludGVyYWN0aXZlLWFnZW50LWhhbmRsZXInKTtcblxuICAgIC8vIEFsbCBQeXRob24gdmVyc2lvbiByZWZlcmVuY2VzIGRlcml2ZWQgZnJvbSBEZWZhdWx0UnVudGltZXMuUFlUSE9OXG4gICAgY29uc3QgcHl0aG9uUnVudGltZSA9IERlZmF1bHRSdW50aW1lcy5QWVRIT047XG4gICAgY29uc3QgcHlWZXJzaW9uID0gcHl0aG9uUnVudGltZS5uYW1lLnJlcGxhY2UoJ3B5dGhvbicsICcnKTsgLy8gZS5nLiBcIjMuMTNcIlxuXG4gICAgY29uc3QgYXJjaGl0ZWN0dXJlID0gdGhpcy5wcm9wcy5hcmNoaXRlY3R1cmUgfHwgY29uZmlnLmFyY2hpdGVjdHVyZSB8fCBBcmNoaXRlY3R1cmUuWDg2XzY0O1xuICAgIGNvbnN0IG1lbW9yeVNpemUgPSB0aGlzLnByb3BzLm1lbW9yeVNpemUgfHwgY29uZmlnLm1lbW9yeVNpemUgfHwgMTAyNDtcbiAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5wcm9wcy50aW1lb3V0IHx8IGNvbmZpZy50aW1lb3V0IHx8IER1cmF0aW9uLm1pbnV0ZXMoMTUpO1xuICAgIGNvbnN0IHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnMgPSB0aGlzLnByb3BzLnJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnMgPz8gY29uZmlnLnJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM7XG5cbiAgICBjb25zdCBhZ2VudEZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKHNjb3BlLCAnSW50ZXJhY3RpdmVBZ2VudEZ1bmN0aW9uJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBhZ2VudExhbWJkYUxvZ1Blcm1pc3Npb25zUmVzdWx0LnVuaXF1ZUZ1bmN0aW9uTmFtZSxcbiAgICAgIGFyY2hpdGVjdHVyZSxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KGhhbmRsZXJQYXRoLCB7XG4gICAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgICAgaW1hZ2U6IHB5dGhvblJ1bnRpbWUuYnVuZGxpbmdJbWFnZSxcbiAgICAgICAgICBjb21tYW5kOiBbXG4gICAgICAgICAgICAnYmFzaCcsICctYycsXG4gICAgICAgICAgICAncGlwIGluc3RhbGwgLXIgcmVxdWlyZW1lbnRzLnR4dCAtdCAvYXNzZXQtb3V0cHV0ICYmIGNwIC1hIC4gL2Fzc2V0LW91dHB1dCcsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBsb2NhbDoge1xuICAgICAgICAgICAgdHJ5QnVuZGxlKG91dHB1dERpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvYyA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgICAgICAgICAgICAgY29uc3QgcHl0aG9uQ2FuZGlkYXRlcyA9IFtgcHl0aG9uJHtweVZlcnNpb259YCwgJ3B5dGhvbjMnLCAncHl0aG9uJ107XG4gICAgICAgICAgICAgICAgbGV0IHB5dGhvbkJpbiA9ICdweXRob24zJztcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBweXRob25DYW5kaWRhdGVzKSB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZXIgPSBwcm9jLmV4ZWNTeW5jKGAke2NhbmRpZGF0ZX0gLS12ZXJzaW9uIDI+JjFgLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSB2ZXIubWF0Y2goL1B5dGhvbiAoXFxkKylcXC4oXFxkKykvKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoICYmIChwYXJzZUludChtYXRjaFsxXSkgPiAzIHx8IChwYXJzZUludChtYXRjaFsxXSkgPT09IDMgJiYgcGFyc2VJbnQobWF0Y2hbMl0pID49IDExKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBweXRob25CaW4gPSBjYW5kaWRhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvYy5leGVjU3luYyhcbiAgICAgICAgICAgICAgICAgIGAke3B5dGhvbkJpbn0gLW0gcGlwIGluc3RhbGwgLXIgcmVxdWlyZW1lbnRzLnR4dCAtdCBcIiR7b3V0cHV0RGlyfVwiIC0tcGxhdGZvcm0gbWFueWxpbnV4MjAxNF94ODZfNjQgLS1vbmx5LWJpbmFyeT06YWxsOiAtLXB5dGhvbi12ZXJzaW9uICR7cHlWZXJzaW9ufWAsXG4gICAgICAgICAgICAgICAgICB7IGN3ZDogaGFuZGxlclBhdGgsIHN0ZGlvOiAnaW5oZXJpdCcgfSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHByb2MuZXhlY1N5bmMoXG4gICAgICAgICAgICAgICAgICBgY3AgLXIgLiBcIiR7b3V0cHV0RGlyfVwiYCxcbiAgICAgICAgICAgICAgICAgIHsgY3dkOiBoYW5kbGVyUGF0aCwgc3RkaW86ICdpbmhlcml0JyB9LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICByb2xlOiBjb25maWcuYWdlbnRSb2xlLFxuICAgICAgaGFuZGxlcjogJ3J1bi5zaCcsXG4gICAgICBydW50aW1lOiBweXRob25SdW50aW1lLFxuICAgICAgbGF5ZXJzOiBhbGxMYXllcnMsXG4gICAgICB0aW1lb3V0LFxuICAgICAgbWVtb3J5U2l6ZSxcbiAgICAgIGVudmlyb25tZW50OiBlbnYsXG4gICAgICBlbnZpcm9ubWVudEVuY3J5cHRpb246IGNvbmZpZy5lbmNyeXB0aW9uS2V5LFxuICAgICAgdnBjOiBjb25maWcubmV0d29yayA/IGNvbmZpZy5uZXR3b3JrLnZwYyA6IHVuZGVmaW5lZCxcbiAgICAgIHZwY1N1Ym5ldHM6IGNvbmZpZy5uZXR3b3JrID8gY29uZmlnLm5ldHdvcmsuYXBwbGljYXRpb25TdWJuZXRTZWxlY3Rpb24oKSA6IHVuZGVmaW5lZCxcbiAgICAgIHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnMsXG4gICAgfSk7XG5cbiAgICAvLyBHcmFudCBsb2cgcGVybWlzc2lvbnNcbiAgICBmb3IgKGNvbnN0IHMgb2YgYWdlbnRMYW1iZGFMb2dQZXJtaXNzaW9uc1Jlc3VsdC5wb2xpY3lTdGF0ZW1lbnRzKSB7XG4gICAgICBjb25maWcuYWdlbnRSb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KHMpO1xuICAgIH1cblxuICAgIC8vIEdyYW50IGF1dGhlbnRpY2F0b3IgcGVybWlzc2lvbnNcbiAgICBpZiAoYXV0aGVudGljYXRvcikge1xuICAgICAgYXV0aGVudGljYXRvci5ncmFudEF1dGhlbnRpY2F0ZShhZ2VudEZ1bmN0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBBdHRhY2ggY29tbXVuaWNhdGlvbiBhZGFwdGVyIGFuZCBnZXQgZW5kcG9pbnRcbiAgICBjb25zdCBlbmRwb2ludCA9IGFkYXB0ZXIuYXR0YWNoVG9GdW5jdGlvbihhZ2VudEZ1bmN0aW9uKTtcbiAgICBhZGFwdGVyLmdyYW50SW52b2tlKGFnZW50RnVuY3Rpb24pO1xuXG4gICAgcmV0dXJuIHsgZW5kcG9pbnQsIGFnZW50RnVuY3Rpb24gfTtcbiAgfVxufVxuXG4vKipcbiAqIEN1c3RvbSBKV1QgYXV0aG9yaXplciBjb25maWd1cmF0aW9uIGZvciBBZ2VudENvcmUgUnVudGltZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZ2VudENvcmVKd3RBdXRob3JpemVyQ29uZmlnIHtcbiAgLyoqIE9JREMgZGlzY292ZXJ5IFVSTC4gKi9cbiAgcmVhZG9ubHkgZGlzY292ZXJ5VXJsOiBzdHJpbmc7XG4gIC8qKiBBbGxvd2VkIGF1ZGllbmNlcy4gKi9cbiAgcmVhZG9ubHkgYWxsb3dlZEF1ZGllbmNlPzogc3RyaW5nW107XG4gIC8qKiBBbGxvd2VkIGNsaWVudCBJRHMuICovXG4gIHJlYWRvbmx5IGFsbG93ZWRDbGllbnRzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBBZ2VudENvcmVSdW50aW1lSG9zdGluZ0FkYXB0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyUHJvcHMge1xuICAvKipcbiAgICogRUNSIGNvbnRhaW5lciBpbWFnZSBVUkkuIElmIG5vdCBwcm92aWRlZCwgYnVpbGRzIGZyb20gdGhlIGJ1bmRsZWQgaGFuZGxlciBzb3VyY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IEJ1aWxkcyBmcm9tIGFnZW50Y29yZS1hZ2VudC1oYW5kbGVyIGRpcmVjdG9yeVxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVySW1hZ2VVcmk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5ldHdvcmsgbW9kZTogJ1BVQkxJQycgb3IgJ1ZQQycuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdQVUJMSUMnXG4gICAqL1xuICByZWFkb25seSBuZXR3b3JrTW9kZT86IHN0cmluZztcblxuICAvKipcbiAgICogQ3VzdG9tIEpXVCBhdXRob3JpemVyIGNvbmZpZ3VyYXRpb24uXG4gICAqIE9taXQgZm9yIElBTS1vbmx5IGF1dGguXG4gICAqL1xuICByZWFkb25seSBjdXN0b21Kd3RBdXRob3JpemVyPzogQWdlbnRDb3JlSnd0QXV0aG9yaXplckNvbmZpZztcblxuICAvKipcbiAgICogUHJvdG9jb2wgY29uZmlndXJhdGlvbjogJ0hUVFAnIHwgJ01DUCcgfCAnQTJBJy5cbiAgICpcbiAgICogQGRlZmF1bHQgJ0hUVFAnXG4gICAqL1xuICByZWFkb25seSBwcm90b2NvbENvbmZpZ3VyYXRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJ1bnRpbWUgZW5kcG9pbnQgbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgQXV0by1nZW5lcmF0ZWQgZnJvbSBhZ2VudCBuYW1lXG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludE5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQWdlbnRDb3JlIFJ1bnRpbWUgaG9zdGluZyBhZGFwdGVyIGZvciBJbnRlcmFjdGl2ZUFnZW50LlxuICpcbiAqIERlcGxveXMgdGhlIGFnZW50IGFzIGEgY29udGFpbmVyIHJ1bm5pbmcgb24gQWdlbnRDb3JlIFJ1bnRpbWUgKG1pY3JvVk0pLlxuICogVXNlcyBMMSBjb25zdHJ1Y3RzIGBDZm5SdW50aW1lYCBhbmQgYENmblJ1bnRpbWVFbmRwb2ludGAgZnJvbVxuICogYGF3cy1jZGstbGliL2F3cy1iZWRyb2NrYWdlbnRjb3JlYC5cbiAqXG4gKiAjIyBBcmNoaXRlY3R1cmVcbiAqXG4gKiBgYGBcbiAqIENsaWVudCDihpIgQWdlbnRDb3JlIFJ1bnRpbWUgRW5kcG9pbnQg4oaSIENvbnRhaW5lciAoRmFzdEFQSSBvbiBwb3J0IDgwODApIOKGkiBCZWRyb2NrXG4gKiBgYGBcbiAqXG4gKiAjIyBGZWF0dXJlc1xuICpcbiAqIC0gKipTZXNzaW9uIElzb2xhdGlvbioqOiBtaWNyb1ZNIHByb3ZpZGVzIHBlci1zZXNzaW9uIGlzb2xhdGlvbiAobm8gUzMgc2Vzc2lvbiBidWNrZXQgbmVlZGVkKVxuICogLSAqKk1hbmFnZWQgSW5mcmFzdHJ1Y3R1cmUqKjogTm8gTGFtYmRhIGNvbGQgc3RhcnRzIG9yIHRpbWVvdXQgbGltaXRzXG4gKiAtICoqTXVsdGlwbGUgUHJvdG9jb2xzKio6IEhUVFAsIE1DUCwgb3IgQTJBIHByb3RvY29sIHN1cHBvcnRcbiAqIC0gKipDb250YWluZXItQmFzZWQqKjogU3RhbmRhcmQgRG9ja2VyIGltYWdlIGRlcGxveW1lbnRcbiAqXG4gKiAjIyBVc2FnZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEFzc2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWFzc2V0cyc7XG4gKiBpbXBvcnQgeyBJbnRlcmFjdGl2ZUFnZW50LCBBZ2VudENvcmVSdW50aW1lSG9zdGluZ0FkYXB0ZXIgfSBmcm9tICdAY2RrbGFicy9jZGstYXBwbW9kLWNhdGFsb2ctYmx1ZXByaW50cyc7XG4gKlxuICogZGVjbGFyZSBjb25zdCBteVByb21wdDogQXNzZXQ7XG4gKlxuICogbmV3IEludGVyYWN0aXZlQWdlbnQodGhpcywgJ0FnZW50Jywge1xuICogICBhZ2VudE5hbWU6ICdNeUNoYXRib3QnLFxuICogICBhZ2VudERlZmluaXRpb246IHsgYmVkcm9ja01vZGVsOiB7fSwgc3lzdGVtUHJvbXB0OiBteVByb21wdCB9LFxuICogICBob3N0aW5nQWRhcHRlcjogbmV3IEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlcih7XG4gKiAgICAgbmV0d29ya01vZGU6ICdQVUJMSUMnLFxuICogICB9KSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBZ2VudENvcmVSdW50aW1lSG9zdGluZ0FkYXB0ZXIgaW1wbGVtZW50cyBJSG9zdGluZ0FkYXB0ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBBZ2VudENvcmVSdW50aW1lSG9zdGluZ0FkYXB0ZXJQcm9wcztcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyUHJvcHMgPSB7fSkge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgfVxuXG4gIGdldCBzZXJ2aWNlUHJpbmNpcGFsKCkgeyByZXR1cm4gbmV3IFNlcnZpY2VQcmluY2lwYWwoJ2JlZHJvY2stYWdlbnRjb3JlLmFtYXpvbmF3cy5jb20nKTsgfVxuXG4gIC8qKlxuICAgKiBEZXBsb3kgQWdlbnRDb3JlIFJ1bnRpbWUgaG9zdGluZyBpbmZyYXN0cnVjdHVyZS5cbiAgICovXG4gIGRlcGxveShjb25maWc6IEFnZW50SG9zdGluZ0NvbmZpZyk6IEFnZW50SG9zdGluZ1Jlc3VsdCB7XG4gICAgY29uc3Qgc2NvcGUgPSBjb25maWcuc2NvcGU7XG4gICAgY29uc3QgbmV0d29ya01vZGUgPSB0aGlzLnByb3BzLm5ldHdvcmtNb2RlIHx8ICdQVUJMSUMnO1xuXG4gICAgLy8gQnVpbGQgb3IgcmVmZXJlbmNlIGNvbnRhaW5lciBpbWFnZVxuICAgIGxldCBjb250YWluZXJVcmk6IHN0cmluZztcbiAgICBpZiAodGhpcy5wcm9wcy5jb250YWluZXJJbWFnZVVyaSkge1xuICAgICAgY29udGFpbmVyVXJpID0gdGhpcy5wcm9wcy5jb250YWluZXJJbWFnZVVyaTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaGFuZGxlclBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAncmVzb3VyY2VzL2FnZW50Y29yZS1hZ2VudC1oYW5kbGVyJyk7XG4gICAgICBjb25zdCBpbWFnZUFzc2V0ID0gbmV3IERvY2tlckltYWdlQXNzZXQoc2NvcGUsICdBZ2VudENvcmVIYW5kbGVySW1hZ2UnLCB7XG4gICAgICAgIGRpcmVjdG9yeTogaGFuZGxlclBhdGgsXG4gICAgICB9KTtcbiAgICAgIGNvbnRhaW5lclVyaSA9IGltYWdlQXNzZXQuaW1hZ2VVcmk7XG4gICAgfVxuXG4gICAgLy8gUmV1c2UgdGhlIHNpbmdsZSBhZ2VudFJvbGUgKGFscmVhZHkgaGFzIGJlZHJvY2stYWdlbnRjb3JlIHRydXN0IGZyb20gQmFzZUFnZW50KS5cbiAgICAvLyBPbmx5IGFkZCBFQ1IgcHVsbCBwZXJtaXNzaW9ucyDigJQgYWxsIG90aGVyIHBlcm1pc3Npb25zIChCZWRyb2NrIEludm9rZU1vZGVsLFxuICAgIC8vIFMzIHRvb2wgYXNzZXRzLCBLQiBhY2Nlc3MsIHNlc3Npb24gYnVja2V0LCBvYnNlcnZhYmlsaXR5KSBhcmUgYWxyZWFkeSBncmFudGVkXG4gICAgLy8gYnkgQmFzZUFnZW50IG9uIGNvbmZpZy5hZ2VudFJvbGUuXG4gICAgY29uc3QgZWNyUG9saWN5UmVzdWx0ID0gY29uZmlnLmFnZW50Um9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICAnZWNyOkdldERvd25sb2FkVXJsRm9yTGF5ZXInLFxuICAgICAgICAnZWNyOkJhdGNoR2V0SW1hZ2UnLFxuICAgICAgICAnZWNyOkdldEF1dGhvcml6YXRpb25Ub2tlbicsXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICB9KSk7XG5cbiAgICAvLyBBZGQgQURPVCBvYnNlcnZhYmlsaXR5IHBlcm1pc3Npb25zIHdoZW4gZW5hYmxlZC5cbiAgICAvLyBUaGUgY29udGFpbmVyIERvY2tlcmZpbGUgdXNlcyBgb3BlbnRlbGVtZXRyeS1pbnN0cnVtZW50YCBhcyBpdHMgQ01EIHdyYXBwZXI7XG4gICAgLy8gQURPVCBuZWVkcyB0aGVzZSBwZXJtaXNzaW9ucyB0byBleHBvcnQgdHJhY2VzLCBsb2dzLCBhbmQgbWV0cmljcyBmcm9tIHRoZSBjb250YWluZXIuXG4gICAgLy8gTm90ZTogV2UgdXNlIGV4cGxpY2l0IHN0YXRlbWVudHMgaW5zdGVhZCBvZiBDbG91ZFdhdGNoTGFtYmRhQXBwbGljYXRpb25TaWduYWxzRXhlY3V0aW9uUm9sZVBvbGljeVxuICAgIC8vIGJlY2F1c2UgdGhhdCBtYW5hZ2VkIHBvbGljeSBvbmx5IGNvdmVycyAvYXdzL2FwcGxpY2F0aW9uLXNpZ25hbHMvZGF0YSBsb2cgZ3JvdXBcbiAgICAvLyBhbmQgbWlzc2VzIHBlcm1pc3Npb25zIEFET1QgbmVlZHMgKERlc2NyaWJlTG9nR3JvdXBzLCBEZXNjcmliZUxvZ1N0cmVhbXMsIFB1dE1ldHJpY0RhdGEpLlxuICAgIGlmIChjb25maWcuZW5hYmxlT2JzZXJ2YWJpbGl0eSkge1xuICAgICAgY29uZmlnLmFnZW50Um9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnbG9nczpEZXNjcmliZUxvZ0dyb3VwcycsXG4gICAgICAgICAgJ2xvZ3M6RGVzY3JpYmVMb2dTdHJlYW1zJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIH0pKTtcbiAgICAgIGNvbmZpZy5hZ2VudFJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2Nsb3Vkd2F0Y2g6UHV0TWV0cmljRGF0YScsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGUgY29udGFpbmVyXG4gICAgY29uc3QgeyByZWdpb24sIGFjY291bnQgfSA9IFN0YWNrLm9mKHNjb3BlKTtcbiAgICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgLy8gVW5saWtlIExhbWJkYSwgQWdlbnRDb3JlIGNvbnRhaW5lcnMgZG9uJ3QgZ2V0IEFXU19SRUdJT04gYXV0b21hdGljYWxseS5cbiAgICAgIC8vIGJvdG8zIGFuZCBvdGhlciBBV1MgU0RLcyBuZWVkIGl0IHRvIG1ha2UgQVBJIGNhbGxzLlxuICAgICAgQVdTX1JFR0lPTjogcmVnaW9uLFxuICAgICAgQVdTX0RFRkFVTFRfUkVHSU9OOiByZWdpb24sXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcuZW52aXJvbm1lbnQpKSB7XG4gICAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBOb3RlOiBBR0VOVF9PQlNFUlZBQklMSVRZX0VOQUJMRUQgYW5kIE9URUxfKiBlbnYgdmFycyBhcmUgTk9UIHNldCBoZXJlLlxuICAgIC8vIEZvciBBZ2VudENvcmUtaG9zdGVkIGFnZW50cywgdGhlIEFET1QgYXV0by1pbnN0cnVtZW50YXRpb24gdmlhXG4gICAgLy8gYG9wZW50ZWxlbWV0cnktaW5zdHJ1bWVudGAgaW4gdGhlIERvY2tlcmZpbGUgQ01EIGhhbmRsZXMgdHJhY2Uvc3BhblxuICAgIC8vIGV4cG9ydCBhdXRvbWF0aWNhbGx5LiBUaGVzZSBlbnYgdmFycyBhcmUgb25seSBuZWVkZWQgZm9yIGFnZW50c1xuICAgIC8vIGhvc3RlZCBvdXRzaWRlIG9mIEFnZW50Q29yZS5cblxuICAgIC8vIEJ1aWxkIG5ldHdvcmsgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IG5ldHdvcmtDb25maWd1cmF0aW9uOiBhbnkgPSB7XG4gICAgICBuZXR3b3JrTW9kZSxcbiAgICB9O1xuXG4gICAgLy8gQnVpbGQgYXV0aG9yaXphdGlvbiBjb25maWd1cmF0aW9uIGlmIEpXVCBhdXRob3JpemVyIGlzIHNwZWNpZmllZFxuICAgIGNvbnN0IGF1dGhDb25maWcgPSB0aGlzLnByb3BzLmN1c3RvbUp3dEF1dGhvcml6ZXIgPyB7XG4gICAgICBjdXN0b21Kd3RBdXRob3JpemVyOiB7XG4gICAgICAgIGRpc2NvdmVyeVVybDogdGhpcy5wcm9wcy5jdXN0b21Kd3RBdXRob3JpemVyLmRpc2NvdmVyeVVybCxcbiAgICAgICAgYWxsb3dlZEF1ZGllbmNlOiB0aGlzLnByb3BzLmN1c3RvbUp3dEF1dGhvcml6ZXIuYWxsb3dlZEF1ZGllbmNlLFxuICAgICAgICBhbGxvd2VkQ2xpZW50czogdGhpcy5wcm9wcy5jdXN0b21Kd3RBdXRob3JpemVyLmFsbG93ZWRDbGllbnRzLFxuICAgICAgfSxcbiAgICB9IDogdW5kZWZpbmVkO1xuXG4gICAgLy8gQ3JlYXRlIENmblJ1bnRpbWVcbiAgICBjb25zdCBydW50aW1lID0gbmV3IENmblJ1bnRpbWUoc2NvcGUsICdBZ2VudENvcmVSdW50aW1lJywge1xuICAgICAgYWdlbnRSdW50aW1lTmFtZTogYCR7Y29uZmlnLmFnZW50TmFtZS5yZXBsYWNlKC8tL2csICdfJyl9X3J1bnRpbWVgLFxuICAgICAgYWdlbnRSdW50aW1lQXJ0aWZhY3Q6IHtcbiAgICAgICAgY29udGFpbmVyQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgIGNvbnRhaW5lclVyaSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByb2xlQXJuOiBjb25maWcuYWdlbnRSb2xlLnJvbGVBcm4sXG4gICAgICBuZXR3b3JrQ29uZmlndXJhdGlvbixcbiAgICAgIGF1dGhvcml6ZXJDb25maWd1cmF0aW9uOiBhdXRoQ29uZmlnLFxuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IGVudlZhcnMsXG4gICAgfSk7XG5cbiAgICBydW50aW1lLmFwcGx5UmVtb3ZhbFBvbGljeShjb25maWcucmVtb3ZhbFBvbGljeSB8fCBSZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuXG4gICAgLy8gV2hlbiBKV1QgYXV0aCBpcyBjb25maWd1cmVkLCBhbGxvd2xpc3QgdGhlIEF1dGhvcml6YXRpb24gaGVhZGVyIHNvIHRoZVxuICAgIC8vIGNvbnRhaW5lciBjYW4gZXh0cmFjdCB1c2VyIGlkZW50aXR5IGNsYWltcyBmcm9tIHRoZSBmb3J3YXJkZWQgSldUIHRva2VuLlxuICAgIC8vIFNlZTogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2JlZHJvY2stYWdlbnRjb3JlL2xhdGVzdC9kZXZndWlkZS9ydW50aW1lLW9hdXRoLmh0bWwjb2F1dGgtcHJvcGFnYXRlLWp3dC10b2tlblxuICAgIGlmICh0aGlzLnByb3BzLmN1c3RvbUp3dEF1dGhvcml6ZXIpIHtcbiAgICAgIHJ1bnRpbWUuYWRkUHJvcGVydHlPdmVycmlkZSgnUmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24nLCB7XG4gICAgICAgIFJlcXVlc3RIZWFkZXJBbGxvd2xpc3Q6IFsnQXV0aG9yaXphdGlvbiddLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIENmblJ1bnRpbWUgd2FpdHMgZm9yIHRoZSByb2xlIGFuZCBpdHMgcG9saWNpZXMgdG8gYmUgZnVsbHkgY3JlYXRlZC91cGRhdGVkLlxuICAgIC8vIFdpdGhvdXQgdGhpcywgQ2xvdWRGb3JtYXRpb24gbWF5IHZhbGlkYXRlIHRoZSByb2xlIGJlZm9yZTpcbiAgICAvLyAtIFRoZSB0cnVzdCBwb2xpY3kgaXMgdXBkYXRlZCB0byBiZWRyb2NrLWFnZW50Y29yZS5hbWF6b25hd3MuY29tIChkdXJpbmcgc3RhY2sgdXBkYXRlcylcbiAgICAvLyAtIFRoZSBFQ1IgcGVybWlzc2lvbnMgcG9saWN5IGlzIGF0dGFjaGVkXG4gICAgcnVudGltZS5ub2RlLmFkZERlcGVuZGVuY3koY29uZmlnLmFnZW50Um9sZSk7XG4gICAgaWYgKGVjclBvbGljeVJlc3VsdC5wb2xpY3lEZXBlbmRhYmxlKSB7XG4gICAgICBydW50aW1lLm5vZGUuYWRkRGVwZW5kZW5jeShlY3JQb2xpY3lSZXN1bHQucG9saWN5RGVwZW5kYWJsZSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIENmblJ1bnRpbWVFbmRwb2ludFxuICAgIGNvbnN0IGVuZHBvaW50TmFtZSA9IHRoaXMucHJvcHMuZW5kcG9pbnROYW1lIHx8IGAke2NvbmZpZy5hZ2VudE5hbWUucmVwbGFjZSgvLS9nLCAnXycpfV9lbmRwb2ludGA7XG4gICAgY29uc3QgcnVudGltZUVuZHBvaW50ID0gbmV3IENmblJ1bnRpbWVFbmRwb2ludChzY29wZSwgJ0FnZW50Q29yZVJ1bnRpbWVFbmRwb2ludCcsIHtcbiAgICAgIGFnZW50UnVudGltZUlkOiBydW50aW1lLnJlZixcbiAgICAgIGFnZW50UnVudGltZVZlcnNpb246IHJ1bnRpbWUuYXR0ckFnZW50UnVudGltZVZlcnNpb24sXG4gICAgICBuYW1lOiBlbmRwb2ludE5hbWUsXG4gICAgICAuLi4odGhpcy5wcm9wcy5wcm90b2NvbENvbmZpZ3VyYXRpb24gJiYge1xuICAgICAgICBwcm90b2NvbENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBzZXJ2ZXJQcm90b2NvbDogdGhpcy5wcm9wcy5wcm90b2NvbENvbmZpZ3VyYXRpb24sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICBydW50aW1lRW5kcG9pbnQuYXBwbHlSZW1vdmFsUG9saWN5KGNvbmZpZy5yZW1vdmFsUG9saWN5IHx8IFJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG5cbiAgICAvLyBDb25zdHJ1Y3QgdGhlIGZ1bGwgaW52b2NhdGlvbiBVUkwgZm9yIGRpcmVjdCBIVFRQUyBhY2Nlc3MgKHJlcXVpcmVkIGZvciBKV1QgYXV0aCkuXG4gICAgLy8gRm9ybWF0OiBodHRwczovL2JlZHJvY2stYWdlbnRjb3JlLntyZWdpb259LmFtYXpvbmF3cy5jb20vcnVudGltZXMve1VSTC1lbmNvZGVkLUFSTn0vaW52b2NhdGlvbnM/cXVhbGlmaWVyPXtlbmRwb2ludE5hbWV9XG4gICAgY29uc3QgZW5jb2RlZEFybiA9IEZuLmpvaW4oJycsIFtcbiAgICAgICdhcm4lM0Fhd3MlM0FiZWRyb2NrLWFnZW50Y29yZSUzQScsXG4gICAgICByZWdpb24sXG4gICAgICAnJTNBJyxcbiAgICAgIGFjY291bnQsXG4gICAgICAnJTNBcnVudGltZSUyRicsXG4gICAgICBydW50aW1lLmF0dHJBZ2VudFJ1bnRpbWVJZCxcbiAgICBdKTtcbiAgICBjb25zdCBlbmRwb2ludCA9IEZuLmpvaW4oJycsIFtcbiAgICAgICdodHRwczovL2JlZHJvY2stYWdlbnRjb3JlLicsXG4gICAgICByZWdpb24sXG4gICAgICAnLmFtYXpvbmF3cy5jb20vcnVudGltZXMvJyxcbiAgICAgIGVuY29kZWRBcm4sXG4gICAgICAnL2ludm9jYXRpb25zP3F1YWxpZmllcj0nLFxuICAgICAgZW5kcG9pbnROYW1lLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHsgZW5kcG9pbnQsIGNmblJ1bnRpbWU6IHJ1bnRpbWUgfTtcbiAgfVxufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgSW50ZXJhY3RpdmVBZ2VudC5cbiAqXG4gKiBFeHRlbmRzIEJhc2VBZ2VudFByb3BzIHdpdGggY29tbXVuaWNhdGlvbiwgc2Vzc2lvbiwgY29udGV4dCwgYW5kIGF1dGhlbnRpY2F0aW9uXG4gKiBzdHJhdGVneSBpbnRlcmZhY2VzIGZvciBidWlsZGluZyByZWFsLXRpbWUgY29udmVyc2F0aW9uYWwgQUkgYWdlbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVyYWN0aXZlQWdlbnRQcm9wcyBleHRlbmRzIEJhc2VBZ2VudFByb3BzIHtcbiAgLyoqXG4gICAqIEhvc3RpbmcgYWRhcHRlciBmb3IgZGVwbG95aW5nIHRoZSBhZ2VudCBydW50aW1lLlxuICAgKlxuICAgKiBVc2UgYExhbWJkYUhvc3RpbmdBZGFwdGVyYCBmb3IgTGFtYmRhICsgQVBJIEdhdGV3YXkgKGRlZmF1bHQpIG9yXG4gICAqIGBBZ2VudENvcmVSdW50aW1lSG9zdGluZ0FkYXB0ZXJgIGZvciBBZ2VudENvcmUgUnVudGltZSBob3N0aW5nLlxuICAgKlxuICAgKiBXaGVuIHByb3ZpZGVkLCBgY29tbXVuaWNhdGlvbkFkYXB0ZXJgLCBgYXV0aGVudGljYXRvcmAsIGBtZW1vcnlTaXplYCxcbiAgICogYHRpbWVvdXRgLCBgYXJjaGl0ZWN0dXJlYCwgYW5kIGByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zYCBwcm9wc1xuICAgKiBhcmUgaWdub3JlZCAoY29uZmlndXJlIHRoZW0gb24gdGhlIGFkYXB0ZXIgZGlyZWN0bHkpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBMYW1iZGFIb3N0aW5nQWRhcHRlclxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdGluZ0FkYXB0ZXI/OiBJSG9zdGluZ0FkYXB0ZXI7XG4gIC8qKlxuICAgKiBDb21tdW5pY2F0aW9uIGFkYXB0ZXIgZm9yIGNsaWVudC1hZ2VudCBpbnRlcmFjdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgU3RyZWFtaW5nSHR0cEFkYXB0ZXIgd2l0aCBDb2duaXRvQXV0aGVudGljYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgY29tbXVuaWNhdGlvbkFkYXB0ZXI/OiBJQ29tbXVuaWNhdGlvbkFkYXB0ZXI7XG5cbiAgLyoqXG4gICAqIFNlc3Npb24gc3RvcmUgZm9yIHBlcnNpc3RpbmcgY29udmVyc2F0aW9uIHN0YXRlLlxuICAgKiBTZXQgdG8gdW5kZWZpbmVkIHRvIGRpc2FibGUgc2Vzc2lvbiBwZXJzaXN0ZW5jZSAoc3RhdGVsZXNzIG1vZGUpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBTM1Nlc3Npb25NYW5hZ2VyIHdpdGggMjQtaG91ciBUVExcbiAgICogQGRlcHJlY2F0ZWQgU2Vzc2lvbiBtYW5hZ2VtZW50IGlzIG5vdyBoYW5kbGVkIGJ5IFN0cmFuZHMtbmF0aXZlIGBTM1Nlc3Npb25NYW5hZ2VyYC5cbiAgICogQW4gUzMgYnVja2V0IGlzIGFsd2F5cyBjcmVhdGVkIGFuZCBwYXNzZWQgYXMgYFNFU1NJT05fQlVDS0VUYCBlbnYgdmFyLlxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvblN0b3JlPzogSVNlc3Npb25TdG9yZTtcblxuICAvKipcbiAgICogUzMgYnVja2V0IGZvciBzZXNzaW9uIHN0b3JhZ2UgKHNob3J0aGFuZCBmb3IgUzNTZXNzaW9uTWFuYWdlcikuXG4gICAqIElnbm9yZWQgaWYgc2Vzc2lvblN0b3JlIGlzIHByb3ZpZGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBdXRvLWNyZWF0ZWQgYnVja2V0XG4gICAqL1xuICByZWFkb25seSBzZXNzaW9uQnVja2V0PzogSUJ1Y2tldDtcblxuICAvKipcbiAgICogVGltZS10by1saXZlIGZvciBzZXNzaW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uaG91cnMoMjQpXG4gICAqL1xuICByZWFkb25seSBzZXNzaW9uVFRMPzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFNlc3Npb24gaW5kZXggZm9yIGZhc3QgdXNlciB0byBzZXNzaW9uIGxvb2t1cHMuXG4gICAqIFByb3ZpZGVzIGVmZmljaWVudCBxdWVyeWluZyBvZiBhIHVzZXIncyBzZXNzaW9ucyBmb3IgbGlzdGluZyBhbmQgbWFuYWdlbWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgRHluYW1vREJTZXNzaW9uSW5kZXggKGF1dG8tY3JlYXRlZClcbiAgICovXG4gIHJlYWRvbmx5IHNlc3Npb25JbmRleD86IElTZXNzaW9uSW5kZXg7XG5cbiAgLyoqXG4gICAqIENvbnRleHQgc3RyYXRlZ3kgZm9yIGNvbnZlcnNhdGlvbiBoaXN0b3J5IG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyIHdpdGggMjAgbWVzc2FnZXNcbiAgICogQGRlcHJlY2F0ZWQgQ29udmVyc2F0aW9uIG1hbmFnZW1lbnQgaXMgbm93IGhhbmRsZWQgYnkgU3RyYW5kcy1uYXRpdmVcbiAgICogYFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyYCBpbiB0aGUgUHl0aG9uIGhhbmRsZXIuXG4gICAqL1xuICByZWFkb25seSBjb250ZXh0U3RyYXRlZ3k/OiBJQ29udGV4dFN0cmF0ZWd5O1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcyB0byBrZWVwIGluIGNvbnZlcnNhdGlvbiBoaXN0b3J5LlxuICAgKiBTaG9ydGhhbmQgZm9yIFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyIHdpbmRvd1NpemUuXG4gICAqIElnbm9yZWQgaWYgY29udGV4dFN0cmF0ZWd5IGlzIHByb3ZpZGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAyMFxuICAgKiBAZGVwcmVjYXRlZCBDb252ZXJzYXRpb24gd2luZG93aW5nIGlzIG5vdyBoYW5kbGVkIGJ5IFN0cmFuZHMtbmF0aXZlXG4gICAqIGBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlcmAgaW4gdGhlIFB5dGhvbiBoYW5kbGVyIChkZWZhdWx0OiAyMCkuXG4gICAqL1xuICByZWFkb25seSBtZXNzYWdlSGlzdG9yeUxpbWl0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdG9yIGZvciBzZWN1cmluZyBBUEkgZW5kcG9pbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBDb2duaXRvQXV0aGVudGljYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aGVudGljYXRvcj86IElBdXRoZW50aWNhdG9yO1xuXG4gIC8qKlxuICAgKiBIVFRQIG1ldGhvZHMgdG8gYWxsb3cgaW4gQ09SUyBwcmVmbGlnaHQgcmVzcG9uc2VzLlxuICAgKiBVc2UgdGhpcyB0byBlbmFibGUgYWRkaXRpb25hbCBtZXRob2RzIChHRVQsIERFTEVURSwgUFVUKSBmb3IgY3VzdG9tIHJvdXRlc1xuICAgKiBhZGRlZCB0byB0aGUgUkVTVCBBUEkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFsnUE9TVCcsICdPUFRJT05TJ11cbiAgICovXG4gIHJlYWRvbmx5IGNvcnNBbGxvd01ldGhvZHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTGFtYmRhIGZ1bmN0aW9uIG1lbW9yeSBzaXplIGluIE1CLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMDI0XG4gICAqL1xuICByZWFkb25seSBtZW1vcnlTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBMYW1iZGEgZnVuY3Rpb24gdGltZW91dC5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24ubWludXRlcygxNSlcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogTGFtYmRhIGZ1bmN0aW9uIGFyY2hpdGVjdHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgQXJjaGl0ZWN0dXJlLlg4Nl82NFxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlO1xuXG4gIC8qKlxuICAgKiBSZXNlcnZlZCBjb25jdXJyZW50IGV4ZWN1dGlvbnMgZm9yIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vIHJlc2VydmVkIGNvbmN1cnJlbmN5XG4gICAqL1xuICByZWFkb25seSByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEludGVyYWN0aXZlIEFnZW50IGZvciByZWFsLXRpbWUgY29udmVyc2F0aW9uYWwgQUkgd2l0aCBTU0Ugc3RyZWFtaW5nLlxuICpcbiAqIENyZWF0ZXMgYSBjb21wbGV0ZSBzZXJ2ZXJsZXNzIGluZnJhc3RydWN0dXJlIGZvciBpbnRlcmFjdGl2ZSBBSSBjb252ZXJzYXRpb25zXG4gKiB1c2luZyBBUEkgR2F0ZXdheSBSRVNUIEFQSSB3aXRoIHJlc3BvbnNlIHN0cmVhbWluZywgTGFtYmRhIFdlYiBBZGFwdGVyLFxuICogRmFzdEFQSSwgYW5kIHN0YW5kYXJkIFN0cmFuZHMgQWdlbnQuXG4gKlxuICogIyMgQXJjaGl0ZWN0dXJlXG4gKlxuICogYGBgXG4gKiBDbGllbnQgKGZldGNoICsgUmVhZGFibGVTdHJlYW0pXG4gKiAgICAg4oaTIFBPU1QgL2NoYXQgKEF1dGhvcml6YXRpb246IEJlYXJlciBKV1QpXG4gKiBBUEkgR2F0ZXdheSBSRVNUIEFQSSAocmVzcG9uc2VUcmFuc2Zlck1vZGU6IFNUUkVBTSlcbiAqICAgICDihpMgSW52b2tlV2l0aFJlc3BvbnNlU3RyZWFtXG4gKiBMYW1iZGEgKFB5dGhvbiArIExhbWJkYSBXZWIgQWRhcHRlciArIEZhc3RBUEkpXG4gKiAgICAg4oaTIHN0cmFuZHMuQWdlbnQgc3RyZWFtaW5nXG4gKiBBbWF6b24gQmVkcm9jayAoQ2xhdWRlKVxuICogYGBgXG4gKlxuICogIyMgRmVhdHVyZXNcbiAqXG4gKiAtICoqU1NFIFN0cmVhbWluZyoqOiBSZWFsLXRpbWUgdG9rZW4tYnktdG9rZW4gcmVzcG9uc2Ugc3RyZWFtaW5nXG4gKiAtICoqMTUtTWludXRlIFRpbWVvdXQqKjogRXh0ZW5kZWQgdGltZW91dCBmb3IgbG9uZyBjb252ZXJzYXRpb25zXG4gKiAtICoqU2Vzc2lvbiBNYW5hZ2VtZW50Kio6IFMzLWJhc2VkIGNvbnZlcnNhdGlvbiBwZXJzaXN0ZW5jZVxuICogLSAqKkNvbnRleHQgV2luZG93aW5nKio6IFNsaWRpbmcgd2luZG93IGNvbnZlcnNhdGlvbiBoaXN0b3J5XG4gKiAtICoqQ29nbml0byBBdXRoKio6IE5hdGl2ZSBKV1QgdmFsaWRhdGlvbiBvbiBSRVNUIEFQSVxuICogLSAqKlN0cmF0ZWd5IEludGVyZmFjZXMqKjogUGx1Z2dhYmxlIGFkYXB0ZXJzIGZvciBhbGwgY29tcG9uZW50c1xuICogLSAqKk9ic2VydmFiaWxpdHkqKjogTGFtYmRhIFBvd2VydG9vbHMgaW50ZWdyYXRpb25cbiAqXG4gKiAjIyBVc2FnZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEFzc2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWFzc2V0cyc7XG4gKiBpbXBvcnQgeyBJbnRlcmFjdGl2ZUFnZW50IH0gZnJvbSAnQGNka2xhYnMvY2RrLWFwcG1vZC1jYXRhbG9nLWJsdWVwcmludHMnO1xuICpcbiAqIGNvbnN0IHN5c3RlbVByb21wdCA9IG5ldyBBc3NldCh0aGlzLCAnUHJvbXB0JywgeyBwYXRoOiAnLi9wcm9tcHQudHh0JyB9KTtcbiAqXG4gKiBjb25zdCBhZ2VudCA9IG5ldyBJbnRlcmFjdGl2ZUFnZW50KHRoaXMsICdDaGF0QWdlbnQnLCB7XG4gKiAgIGFnZW50TmFtZTogJ015Q2hhdGJvdCcsXG4gKiAgIGFnZW50RGVmaW5pdGlvbjoge1xuICogICAgIGJlZHJvY2tNb2RlbDogeyB1c2VDcm9zc1JlZ2lvbkluZmVyZW5jZTogdHJ1ZSB9LFxuICogICAgIHN5c3RlbVByb21wdDogc3lzdGVtUHJvbXB0LFxuICogICB9LFxuICogfSk7XG4gKlxuICogLy8gQWNjZXNzIG91dHB1dHNcbiAqIGFnZW50LmFwaUVuZHBvaW50OyAgICAgICAvLyBSRVNUIEFQSSBlbmRwb2ludCBVUkxcbiAqIGFnZW50LnNlc3Npb25CdWNrZXQ7ICAgICAvLyBTMyBzZXNzaW9uIGJ1Y2tldFxuICogYWdlbnQuYXV0aGVudGljYXRvcjsgICAgIC8vIENvZ25pdG8gYXV0aGVudGljYXRvciAoZm9yIFVzZXIgUG9vbCBpbmZvKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcmFjdGl2ZUFnZW50IGV4dGVuZHMgQmFzZUFnZW50IHtcbiAgcHVibGljIHJlYWRvbmx5IGFnZW50RnVuY3Rpb24/OiBJRnVuY3Rpb247XG4gIHB1YmxpYyByZWFkb25seSBhZGFwdGVyPzogSUNvbW11bmljYXRpb25BZGFwdGVyO1xuICBwdWJsaWMgcmVhZG9ubHkgc2Vzc2lvblN0b3JlPzogSVNlc3Npb25TdG9yZTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRleHRTdHJhdGVneT86IElDb250ZXh0U3RyYXRlZ3k7XG4gIHB1YmxpYyByZWFkb25seSBhdXRoZW50aWNhdG9yPzogSUF1dGhlbnRpY2F0b3I7XG4gIHB1YmxpYyByZWFkb25seSBhcGlFbmRwb2ludDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgc2Vzc2lvbkJ1Y2tldD86IElCdWNrZXQ7XG4gIHB1YmxpYyByZWFkb25seSBjZm5SdW50aW1lPzogQ2ZuUnVudGltZTtcbiAgLyoqXG4gICAqIFRoZSBzZXNzaW9uIGluZGV4IGZvciBmYXN0IHVzZXIgdG8gc2Vzc2lvbiBsb29rdXBzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlc3Npb25JbmRleD86IElTZXNzaW9uSW5kZXg7XG4gIC8qKlxuICAgKiBUaGUgUkVTVCBBUEkgR2F0ZXdheSAob25seSBhdmFpbGFibGUgd2hlbiB1c2luZyBMYW1iZGFIb3N0aW5nQWRhcHRlciB3aXRoIFN0cmVhbWluZ0h0dHBBZGFwdGVyKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXN0QXBpPzogUmVzdEFwaTtcbiAgLyoqXG4gICAqIFRoZSBDb2duaXRvIFVzZXIgUG9vbHMgYXV0aG9yaXplciAob25seSBhdmFpbGFibGUgd2hlbiB1c2luZyBMYW1iZGFIb3N0aW5nQWRhcHRlciB3aXRoIENvZ25pdG9BdXRoZW50aWNhdG9yKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb2duaXRvQXV0aG9yaXplcj86IENvZ25pdG9Vc2VyUG9vbHNBdXRob3JpemVyO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJbnRlcmFjdGl2ZUFnZW50UHJvcHMpIHtcbiAgICAvLyBEZXRlcm1pbmUgaG9zdGluZyBhZGFwdGVyIEJFRk9SRSBzdXBlcigpIHNvIHdlIGNhbiBwYXNzIGl0cyB0cnVzdCBwcmluY2lwYWxcbiAgICBjb25zdCBob3N0aW5nQWRhcHRlciA9IHByb3BzLmhvc3RpbmdBZGFwdGVyIHx8IG5ldyBMYW1iZGFIb3N0aW5nQWRhcHRlcih7XG4gICAgICBjb21tdW5pY2F0aW9uQWRhcHRlcjogcHJvcHMuY29tbXVuaWNhdGlvbkFkYXB0ZXIsXG4gICAgICBhdXRoZW50aWNhdG9yOiBwcm9wcy5hdXRoZW50aWNhdG9yLFxuICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSxcbiAgICAgIHRpbWVvdXQ6IHByb3BzLnRpbWVvdXQsXG4gICAgICBhcmNoaXRlY3R1cmU6IHByb3BzLmFyY2hpdGVjdHVyZSxcbiAgICAgIHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM6IHByb3BzLnJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnMsXG4gICAgfSk7XG5cbiAgICBzdXBlcihzY29wZSwgaWQsIHsgLi4ucHJvcHMsIHNlcnZpY2VQcmluY2lwYWw6IGhvc3RpbmdBZGFwdGVyLnNlcnZpY2VQcmluY2lwYWwgfSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBwcm9wc1xuICAgIHRoaXMudmFsaWRhdGVQcm9wcyhwcm9wcyk7XG5cbiAgICBjb25zdCBtb2RlbElkID0gQmVkcm9ja01vZGVsVXRpbHMuZGVyaXZlQWN0dWFsTW9kZWxJZCh0aGlzLmJlZHJvY2tNb2RlbCk7XG4gICAgY29uc3QgbWV0cmljTmFtZXNwYWNlID0gcHJvcHMubWV0cmljTmFtZXNwYWNlIHx8IERlZmF1bHRPYnNlcnZhYmlsaXR5Q29uZmlnLkRFRkFVTFRfTUVUUklDX05BTUVTUEFDRTtcbiAgICBjb25zdCBtZXRyaWNTZXJ2aWNlTmFtZSA9IHByb3BzLm1ldHJpY1NlcnZpY2VOYW1lIHx8IERlZmF1bHRBZ2VudENvbmZpZy5ERUZBVUxUX09CU0VSVkFCSUxJVFlfTUVUUklDX1NWQ19OQU1FO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzZXNzaW9uIHN0b3JlIChTMyBidWNrZXQgZm9yIFN0cmFuZHMtbmF0aXZlIFMzU2Vzc2lvbk1hbmFnZXIpXG4gICAgaWYgKHByb3BzLnNlc3Npb25TdG9yZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNlc3Npb25TdG9yZSA9IHByb3BzLnNlc3Npb25TdG9yZTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLnNlc3Npb25TdG9yZSA9PT0gdW5kZWZpbmVkICYmIHByb3BzLnNlc3Npb25CdWNrZXQpIHtcbiAgICAgIHRoaXMuc2Vzc2lvblN0b3JlID0gbmV3IFMzU2Vzc2lvbk1hbmFnZXIodGhpcywgJ1Nlc3Npb25NYW5hZ2VyJywge1xuICAgICAgICBidWNrZXQ6IHByb3BzLnNlc3Npb25CdWNrZXQsXG4gICAgICAgIHNlc3Npb25UVEw6IHByb3BzLnNlc3Npb25UVEwsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdDogY3JlYXRlIFMzU2Vzc2lvbk1hbmFnZXIgKGJ1Y2tldCB1c2VkIGJ5IFN0cmFuZHMtbmF0aXZlIHNlc3Npb24gbWFuYWdlcilcbiAgICAgIHRoaXMuc2Vzc2lvblN0b3JlID0gbmV3IFMzU2Vzc2lvbk1hbmFnZXIodGhpcywgJ1Nlc3Npb25NYW5hZ2VyJywge1xuICAgICAgICBzZXNzaW9uVFRMOiBwcm9wcy5zZXNzaW9uVFRMLFxuICAgICAgICBlbmNyeXB0aW9uS2V5OiBwcm9wcy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICByZW1vdmFsUG9saWN5OiBwcm9wcy5yZW1vdmFsUG9saWN5LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc2Vzc2lvbkJ1Y2tldCA9IHRoaXMuc2Vzc2lvblN0b3JlPy5zZXNzaW9uQnVja2V0O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzZXNzaW9uIGluZGV4IChEeW5hbW9EQiB0YWJsZSBmb3IgdXNlcuKGknNlc3Npb24gbG9va3VwcylcbiAgICBpZiAocHJvcHMuc2Vzc2lvbkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2Vzc2lvbkluZGV4ID0gcHJvcHMuc2Vzc2lvbkluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0OiBjcmVhdGUgRHluYW1vREJTZXNzaW9uSW5kZXhcbiAgICAgIHRoaXMuc2Vzc2lvbkluZGV4ID0gbmV3IER5bmFtb0RCU2Vzc2lvbkluZGV4KHRoaXMsICdTZXNzaW9uSW5kZXgnLCB7XG4gICAgICAgIHNlc3Npb25UVEw6IHByb3BzLnNlc3Npb25UVEwsXG4gICAgICAgIGVuY3J5cHRpb25LZXk6IHByb3BzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzLnJlbW92YWxQb2xpY3ksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDb250ZXh0IHN0cmF0ZWd5IGlzIGRlcHJlY2F0ZWQg4oCUIFN0cmFuZHMtbmF0aXZlIGNvbnZlcnNhdGlvbiBtYW5hZ2VyIGhhbmRsZXMgdGhpcy5cbiAgICAvLyBLZWVwIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGJ1dCBkbyBub3QgdXNlIGVudiB2YXJzLlxuICAgIGlmIChwcm9wcy5jb250ZXh0U3RyYXRlZ3kpIHtcbiAgICAgIHRoaXMuY29udGV4dFN0cmF0ZWd5ID0gcHJvcHMuY29udGV4dFN0cmF0ZWd5O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRleHRTdHJhdGVneSA9IG5ldyBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlcih7XG4gICAgICAgIHdpbmRvd1NpemU6IHByb3BzLm1lc3NhZ2VIaXN0b3J5TGltaXQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBiYXNlIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgIGNvbnN0IGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIE1PREVMX0lEOiBtb2RlbElkLFxuICAgICAgU1lTVEVNX1BST01QVF9TM19CVUNLRVRfTkFNRTogcHJvcHMuYWdlbnREZWZpbml0aW9uLnN5c3RlbVByb21wdC5zM0J1Y2tldE5hbWUsXG4gICAgICBTWVNURU1fUFJPTVBUX1MzX0tFWTogcHJvcHMuYWdlbnREZWZpbml0aW9uLnN5c3RlbVByb21wdC5zM09iamVjdEtleSxcbiAgICAgIFRPT0xTX0NPTkZJRzogSlNPTi5zdHJpbmdpZnkodGhpcy5hZ2VudFRvb2xzTG9jYXRpb25EZWZpbml0aW9ucyksXG4gICAgICAuLi5Qb3dlcnRvb2xzQ29uZmlnLmdlbmVyYXRlRGVmYXVsdExhbWJkYUNvbmZpZyhcbiAgICAgICAgcHJvcHMuZW5hYmxlT2JzZXJ2YWJpbGl0eSxcbiAgICAgICAgbWV0cmljTmFtZXNwYWNlLFxuICAgICAgICBtZXRyaWNTZXJ2aWNlTmFtZSxcbiAgICAgICAgJ0RFQlVHJyxcbiAgICAgICksXG4gICAgfTtcblxuICAgIC8vIEFkZCBzZXNzaW9uIGJ1Y2tldCBlbnYgdmFyIGlmIHNlc3Npb24gc3RvcmUgZXhpc3RzXG4gICAgaWYgKHRoaXMuc2Vzc2lvbkJ1Y2tldCkge1xuICAgICAgZW52LlNFU1NJT05fQlVDS0VUID0gdGhpcy5zZXNzaW9uQnVja2V0LmJ1Y2tldE5hbWU7XG4gICAgfVxuXG4gICAgLy8gQWRkIHNlc3Npb24gaW5kZXggZW52IHZhcnMgaWYgc2Vzc2lvbiBpbmRleCBleGlzdHNcbiAgICBpZiAodGhpcy5zZXNzaW9uSW5kZXgpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZW52LCB0aGlzLnNlc3Npb25JbmRleC5lbnZpcm9ubWVudFZhcmlhYmxlcygpKTtcbiAgICB9XG5cbiAgICAvLyBBZGQga25vd2xlZGdlIGJhc2UgY29uZmlndXJhdGlvbiBpZiBLQnMgYXJlIGNvbmZpZ3VyZWRcbiAgICBpZiAodGhpcy5rbm93bGVkZ2VCYXNlQ29uZmlncy5sZW5ndGggPiAwKSB7XG4gICAgICBlbnYuS05PV0xFREdFX0JBU0VTX0NPTkZJRyA9IEpTT04uc3RyaW5naWZ5KHRoaXMua25vd2xlZGdlQmFzZUNvbmZpZ3MpO1xuICAgICAgZW52LktOT1dMRURHRV9CQVNFX1NZU1RFTV9QUk9NUFRfQURESVRJT04gPSBnZW5lcmF0ZUtub3dsZWRnZUJhc2VTeXN0ZW1Qcm9tcHRBZGRpdGlvbih0aGlzLmtub3dsZWRnZUJhc2VDb25maWdzKTtcbiAgICB9XG5cbiAgICAvLyBEZXBsb3kgdmlhIGhvc3RpbmcgYWRhcHRlclxuICAgIGNvbnN0IGhvc3RpbmdSZXN1bHQgPSBob3N0aW5nQWRhcHRlci5kZXBsb3koe1xuICAgICAgc2NvcGU6IHRoaXMsXG4gICAgICBhZ2VudE5hbWU6IHByb3BzLmFnZW50TmFtZSxcbiAgICAgIGFnZW50Um9sZTogdGhpcy5hZ2VudFJvbGUsXG4gICAgICBlbnZpcm9ubWVudDogZW52LFxuICAgICAgZW5jcnlwdGlvbktleTogdGhpcy5lbmNyeXB0aW9uS2V5LFxuICAgICAgbmV0d29yazogcHJvcHMubmV0d29yayxcbiAgICAgIGFyY2hpdGVjdHVyZTogcHJvcHMuYXJjaGl0ZWN0dXJlLFxuICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSxcbiAgICAgIHRpbWVvdXQ6IHByb3BzLnRpbWVvdXQsXG4gICAgICByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zOiBwcm9wcy5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zLFxuICAgICAgbGFtYmRhTGF5ZXJzOiBwcm9wcy5hZ2VudERlZmluaXRpb24ubGFtYmRhTGF5ZXJzLFxuICAgICAga25vd2xlZGdlQmFzZUxheWVyczogdGhpcy5rbm93bGVkZ2VCYXNlTGF5ZXJzLFxuICAgICAgZW5hYmxlT2JzZXJ2YWJpbGl0eTogcHJvcHMuZW5hYmxlT2JzZXJ2YWJpbGl0eSxcbiAgICAgIHRvb2xzQ29uZmlnOiBKU09OLnN0cmluZ2lmeSh0aGlzLmFnZW50VG9vbHNMb2NhdGlvbkRlZmluaXRpb25zKSxcbiAgICAgIHN5c3RlbVByb21wdEJ1Y2tldDogcHJvcHMuYWdlbnREZWZpbml0aW9uLnN5c3RlbVByb21wdC5zM0J1Y2tldE5hbWUsXG4gICAgICBzeXN0ZW1Qcm9tcHRLZXk6IHByb3BzLmFnZW50RGVmaW5pdGlvbi5zeXN0ZW1Qcm9tcHQuczNPYmplY3RLZXksXG4gICAgICBrbm93bGVkZ2VCYXNlQ29uZmlnczogdGhpcy5rbm93bGVkZ2VCYXNlQ29uZmlncy5sZW5ndGggPiAwID8gSlNPTi5zdHJpbmdpZnkodGhpcy5rbm93bGVkZ2VCYXNlQ29uZmlncykgOiB1bmRlZmluZWQsXG4gICAgICBrbm93bGVkZ2VCYXNlU3lzdGVtUHJvbXB0QWRkaXRpb246IHRoaXMua25vd2xlZGdlQmFzZUNvbmZpZ3MubGVuZ3RoID4gMFxuICAgICAgICA/IGdlbmVyYXRlS25vd2xlZGdlQmFzZVN5c3RlbVByb21wdEFkZGl0aW9uKHRoaXMua25vd2xlZGdlQmFzZUNvbmZpZ3MpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeSxcbiAgICB9KTtcblxuICAgIHRoaXMuYXBpRW5kcG9pbnQgPSBob3N0aW5nUmVzdWx0LmVuZHBvaW50O1xuICAgIHRoaXMuYWdlbnRGdW5jdGlvbiA9IGhvc3RpbmdSZXN1bHQuYWdlbnRGdW5jdGlvbjtcbiAgICB0aGlzLmNmblJ1bnRpbWUgPSBob3N0aW5nUmVzdWx0LmNmblJ1bnRpbWU7XG5cbiAgICAvLyBTZXQgYWRhcHRlciBhbmQgYXV0aGVudGljYXRvciByZWZlcmVuY2VzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgaWYgKGhvc3RpbmdBZGFwdGVyIGluc3RhbmNlb2YgTGFtYmRhSG9zdGluZ0FkYXB0ZXIpIHtcbiAgICAgIHRoaXMuYWRhcHRlciA9IGhvc3RpbmdBZGFwdGVyLmNvbW11bmljYXRpb25BZGFwdGVyO1xuICAgICAgdGhpcy5hdXRoZW50aWNhdG9yID0gaG9zdGluZ0FkYXB0ZXIuYXV0aGVudGljYXRvcjtcblxuICAgICAgLy8gRXhwb3NlIFJFU1QgQVBJIGFuZCBDb2duaXRvIGF1dGhvcml6ZXIgZnJvbSB0aGUgY29tbXVuaWNhdGlvbiBhZGFwdGVyXG4gICAgICBpZiAodGhpcy5hZGFwdGVyIGluc3RhbmNlb2YgU3RyZWFtaW5nSHR0cEFkYXB0ZXIpIHtcbiAgICAgICAgdGhpcy5yZXN0QXBpID0gdGhpcy5hZGFwdGVyLnJlc3RBcGk7XG4gICAgICAgIHRoaXMuY29nbml0b0F1dGhvcml6ZXIgPSB0aGlzLmFkYXB0ZXIuY29nbml0b0F1dGhvcml6ZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR3JhbnQgc3lzdGVtIHByb21wdCByZWFkIGFjY2Vzc1xuICAgIHByb3BzLmFnZW50RGVmaW5pdGlvbi5zeXN0ZW1Qcm9tcHQuZ3JhbnRSZWFkKHRoaXMuYWdlbnRSb2xlKTtcblxuICAgIC8vIEdyYW50IHNlc3Npb24gc3RvcmUgYWNjZXNzXG4gICAgaWYgKHRoaXMuc2Vzc2lvblN0b3JlKSB7XG4gICAgICBpZiAodGhpcy5hZ2VudEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuc2Vzc2lvblN0b3JlLmdyYW50UmVhZFdyaXRlKHRoaXMuYWdlbnRGdW5jdGlvbik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2Vzc2lvbkJ1Y2tldCkge1xuICAgICAgICAvLyBGb3IgQWdlbnRDb3JlIGhvc3RpbmcsIGdyYW50IHRoZSBhZ2VudCByb2xlIGRpcmVjdCBTMyBhY2Nlc3NcbiAgICAgICAgdGhpcy5zZXNzaW9uQnVja2V0LmdyYW50UmVhZFdyaXRlKHRoaXMuYWdlbnRSb2xlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHcmFudCBzZXNzaW9uIGluZGV4IGFjY2Vzc1xuICAgIGlmICh0aGlzLnNlc3Npb25JbmRleCkge1xuICAgICAgdGhpcy5zZXNzaW9uSW5kZXguZ3JhbnRSZWFkV3JpdGUodGhpcy5hZ2VudFJvbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgSW50ZXJhY3RpdmVBZ2VudCBwcm9wcy5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQcm9wcyhwcm9wczogSW50ZXJhY3RpdmVBZ2VudFByb3BzKTogdm9pZCB7XG4gICAgaWYgKCFwcm9wcy5hZ2VudE5hbWUgfHwgcHJvcHMuYWdlbnROYW1lLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWdlbnROYW1lIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5tZW1vcnlTaXplICE9PSB1bmRlZmluZWQgJiYgKHByb3BzLm1lbW9yeVNpemUgPCAxMjggfHwgcHJvcHMubWVtb3J5U2l6ZSA+IDEwMjQwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtZW1vcnlTaXplIG11c3QgYmUgYmV0d2VlbiAxMjggYW5kIDEwMjQwIE1CJyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdGltZW91dFNlY29uZHMgPSBwcm9wcy50aW1lb3V0LnRvU2Vjb25kcygpO1xuICAgICAgaWYgKHRpbWVvdXRTZWNvbmRzIDwgMSB8fCB0aW1lb3V0U2Vjb25kcyA+IDkwMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RpbWVvdXQgbXVzdCBiZSBiZXR3ZWVuIDEgc2Vjb25kIGFuZCAxNSBtaW51dGVzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLm1lc3NhZ2VIaXN0b3J5TGltaXQgIT09IHVuZGVmaW5lZCAmJiAocHJvcHMubWVzc2FnZUhpc3RvcnlMaW1pdCA8IDEgfHwgcHJvcHMubWVzc2FnZUhpc3RvcnlMaW1pdCA+IDEwMDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2VIaXN0b3J5TGltaXQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMDAnKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
1201
|
+
InteractiveAgent[_k] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.InteractiveAgent", version: "1.16.0" };
|
|
1202
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJhY3RpdmUtYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZnJhbWV3b3JrL2FnZW50cy9pbnRlcmFjdGl2ZS1hZ2VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFFQUFxRTtBQUNyRSxzQ0FBc0M7QUFFdEMsNkJBQTZCO0FBQzdCLDZDQUFpRTtBQUNqRSwrREFTb0M7QUFDcEMsMkVBQWtGO0FBQ2xGLHlEQUF5SDtBQUN6SCwyREFBc0g7QUFDdEgsaURBQXFGO0FBQ3JGLCtEQUE4RDtBQUM5RCxpREFBa0c7QUFFbEcsdURBQThHO0FBQzlHLCtDQUEwRjtBQUUxRiw2Q0FBeUQ7QUFDekQsK0NBQTBFO0FBQzFFLGlFQUE0RDtBQUM1RCwrQ0FBbUU7QUFDbkUsaUVBQTJFO0FBQzNFLHdDQUErQztBQUMvQyx3REFBcUQ7QUFzRXJEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHO0FBQ0gsTUFBYSxvQkFBb0I7SUFtQi9CLFlBQVksUUFBbUMsRUFBRTtRQUMvQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCLENBQUMsY0FBeUI7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHVGQUF1RixDQUFDLENBQUM7UUFDM0csQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQztRQUNqRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDNUUsTUFBTSxzQkFBc0IsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFMUQsNEJB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RSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3RELE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMzRixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNoQyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pELElBQUksY0FBYyxHQUFHLENBQUMsSUFBSSxjQUFjLEdBQUcsR0FBRyxFQUFFLENBQUM7Z0JBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztZQUNyRSxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLG1CQUFtQixLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbkgsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7SUFDSCxDQUFDOztBQWxNSCw0Q0FtTUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBEdXJhdGlvbiwgRm4sIFJlbW92YWxQb2xpY3ksIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHtcbiAgQXV0aG9yaXphdGlvblR5cGUsXG4gIENvZ25pdG9Vc2VyUG9vbHNBdXRob3JpemVyLFxuICBDb3JzLFxuICBFbmRwb2ludFR5cGUsXG4gIEdhdGV3YXlSZXNwb25zZSxcbiAgTGFtYmRhSW50ZWdyYXRpb24sXG4gIFJlc3BvbnNlVHlwZSxcbiAgUmVzdEFwaSxcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXknO1xuaW1wb3J0IHsgQ2ZuUnVudGltZSwgQ2ZuUnVudGltZUVuZHBvaW50IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWJlZHJvY2thZ2VudGNvcmUnO1xuaW1wb3J0IHsgVXNlclBvb2wsIFVzZXJQb29sQ2xpZW50LCBNZmEsIEFjY291bnRSZWNvdmVyeSwgVXNlclBvb2xDbGllbnRJZGVudGl0eVByb3ZpZGVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZ25pdG8nO1xuaW1wb3J0IHsgQXR0cmlidXRlVHlwZSwgQmlsbGluZ01vZGUsIElUYWJsZSwgU3RyZWFtVmlld1R5cGUsIFRhYmxlLCBUYWJsZUVuY3J5cHRpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGInO1xuaW1wb3J0IHsgSVNlY3VyaXR5R3JvdXAsIFNlY3VyaXR5R3JvdXAsIFN1Ym5ldFNlbGVjdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0IHsgRG9ja2VySW1hZ2VBc3NldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3ItYXNzZXRzJztcbmltcG9ydCB7IElHcmFudGFibGUsIFJvbGUsIFNlcnZpY2VQcmluY2lwYWwsIFBvbGljeVN0YXRlbWVudCwgRWZmZWN0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBJS2V5LCBLZXkgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB7IElGdW5jdGlvbiwgQXJjaGl0ZWN0dXJlLCBJTGF5ZXJWZXJzaW9uLCBMYXllclZlcnNpb24sIEZ1bmN0aW9uLCBDb2RlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBJQnVja2V0LCBCdWNrZXQsIEJ1Y2tldEVuY3J5cHRpb24sIEJsb2NrUHVibGljQWNjZXNzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQmFzZUFnZW50LCBCYXNlQWdlbnRQcm9wcyB9IGZyb20gJy4vYmFzZS1hZ2VudCc7XG5pbXBvcnQgeyBnZW5lcmF0ZUtub3dsZWRnZUJhc2VTeXN0ZW1Qcm9tcHRBZGRpdGlvbiB9IGZyb20gJy4vYmF0Y2gtYWdlbnQnO1xuaW1wb3J0IHsgRGVmYXVsdEFnZW50Q29uZmlnIH0gZnJvbSAnLi9kZWZhdWx0LWFnZW50LWNvbmZpZyc7XG5pbXBvcnQgeyBMYW1iZGFJYW1VdGlscywgUG93ZXJ0b29sc0NvbmZpZyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcyc7XG5pbXBvcnQgeyBEZWZhdWx0T2JzZXJ2YWJpbGl0eUNvbmZpZyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9vYnNlcnZhYmlsaXR5JztcbmltcG9ydCB7IEJlZHJvY2tNb2RlbFV0aWxzIH0gZnJvbSAnLi4vYmVkcm9jayc7XG5pbXBvcnQgeyBEZWZhdWx0UnVudGltZXMgfSBmcm9tICcuLi9jdXN0b20tcmVzb3VyY2UnO1xuaW1wb3J0IHsgTmV0d29yayB9IGZyb20gJy4uL2ZvdW5kYXRpb24nO1xuXG4vKipcbiAqIFN0cmF0ZWd5IGludGVyZmFjZSBmb3IgcGx1Z2dhYmxlIGNvbW11bmljYXRpb24gbWVjaGFuaXNtcy5cbiAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgU3RyZWFtaW5nSHR0cEFkYXB0ZXIgKEFQSSBHYXRld2F5IFJFU1QgQVBJIHdpdGggcmVzcG9uc2Ugc3RyZWFtaW5nKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ29tbXVuaWNhdGlvbkFkYXB0ZXIge1xuICAvKipcbiAgICogQXR0YWNoIHRoZSBhZGFwdGVyIHRvIGEgTGFtYmRhIGZ1bmN0aW9uIGFuZCBjcmVhdGUgY29tbXVuaWNhdGlvbiBpbmZyYXN0cnVjdHVyZS5cbiAgICogUmV0dXJucyB0aGUgcHVibGljIGVuZHBvaW50IFVSTCBmb3IgY2xpZW50IGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgYXR0YWNoVG9GdW5jdGlvbihsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgTGFtYmRhIGZ1bmN0aW9uIHBlcm1pc3Npb24gdG8gc2VuZCByZXNwb25zZXMgYmFjayB0byBjbGllbnRzLlxuICAgKi9cbiAgZ3JhbnRJbnZva2UobGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhyb3R0bGUgc2V0dGluZ3MgZm9yIFJFU1QgQVBJLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRocm90dGxlU2V0dGluZ3Mge1xuICAvKipcbiAgICogUmF0ZSBsaW1pdCAocmVxdWVzdHMgcGVyIHNlY29uZCkuXG4gICAqL1xuICByZWFkb25seSByYXRlTGltaXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEJ1cnN0IGxpbWl0IChtYXhpbXVtIGNvbmN1cnJlbnQgcmVxdWVzdHMpLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVyc3RMaW1pdD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIFN0cmVhbWluZ0h0dHBBZGFwdGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbWluZ0h0dHBBZGFwdGVyUHJvcHMge1xuICAvKipcbiAgICogUkVTVCBBUEkgc3RhZ2UgbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ3Byb2QnXG4gICAqL1xuICByZWFkb25seSBzdGFnZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRocm90dGxlIHNldHRpbmdzIGZvciBSRVNUIEFQSS5cbiAgICpcbiAgICogQGRlZmF1bHQgTm8gdGhyb3R0bGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgdGhyb3R0bGU/OiBUaHJvdHRsZVNldHRpbmdzO1xuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdG9yIGZvciBzZWN1cmluZyBBUEkgZW5kcG9pbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBVc2VzIGF1dGhlbnRpY2F0b3IgZnJvbSBJbnRlcmFjdGl2ZUFnZW50XG4gICAqL1xuICByZWFkb25seSBhdXRoZW50aWNhdG9yPzogSUF1dGhlbnRpY2F0b3I7XG5cbiAgLyoqXG4gICAqIEhUVFAgbWV0aG9kcyB0byBhbGxvdyBpbiBDT1JTIHByZWZsaWdodCByZXNwb25zZXMuXG4gICAqIFVzZSB0aGlzIHRvIGVuYWJsZSBhZGRpdGlvbmFsIG1ldGhvZHMgKEdFVCwgREVMRVRFLCBQVVQpIGZvciBjdXN0b20gcm91dGVzXG4gICAqIGFkZGVkIHRvIHRoZSBSRVNUIEFQSS5cbiAgICpcbiAgICogQGRlZmF1bHQgWydQT1NUJywgJ09QVElPTlMnXVxuICAgKi9cbiAgcmVhZG9ubHkgY29yc0FsbG93TWV0aG9kcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFN0cmVhbWluZyBIVFRQIGFkYXB0ZXIgZm9yIHJlYWwtdGltZSBhZ2VudCBjb21tdW5pY2F0aW9uIHZpYSBTU0UuXG4gKlxuICogVGhpcyBhZGFwdGVyIGNyZWF0ZXMgYW4gQVBJIEdhdGV3YXkgUkVTVCBBUEkgd2l0aCByZXNwb25zZSBzdHJlYW1pbmcgZW5hYmxlZCxcbiAqIGFsbG93aW5nIHRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gc3RyZWFtIFNTRSAoU2VydmVyLVNlbnQgRXZlbnRzKSByZXNwb25zZXNcbiAqIGJhY2sgdG8gY2xpZW50cyBhcyB0aGUgU3RyYW5kcyBBZ2VudCBnZW5lcmF0ZXMgdG9rZW5zLlxuICpcbiAqICMjIEFyY2hpdGVjdHVyZVxuICpcbiAqIGBgYFxuICogQ2xpZW50IOKGkiBQT1NUIC9jaGF0IOKGkiBBUEkgR2F0ZXdheSBSRVNUIEFQSSAoU1RSRUFNIG1vZGUpIOKGkiBMYW1iZGEgKEZhc3RBUEkgKyBMV0EpIOKGkiBCZWRyb2NrXG4gKiBDbGllbnQg4oaQIFNTRSBzdHJlYW0g4oaQIEFQSSBHYXRld2F5IOKGkCBMYW1iZGEgcmVzcG9uc2Ugc3RyZWFtaW5nIOKGkCBBZ2VudCB0b2tlbnNcbiAqIGBgYFxuICpcbiAqICMjIEZlYXR1cmVzXG4gKlxuICogLSAqKlJlc3BvbnNlIFN0cmVhbWluZyoqOiBQcm9ncmVzc2l2ZSBTU0UgZGVsaXZlcnkgdmlhIEFQSSBHYXRld2F5IHJlc3BvbnNlIHN0cmVhbWluZ1xuICogLSAqKjE1LU1pbnV0ZSBUaW1lb3V0Kio6IEV4dGVuZGVkIHRpbWVvdXQgZm9yIGxvbmctcnVubmluZyBhZ2VudCBjb252ZXJzYXRpb25zXG4gKiAtICoqQ29nbml0byBBdXRoKio6IE5hdGl2ZSBDT0dOSVRPX1VTRVJfUE9PTFMgYXV0aG9yaXplciBvbiBSRVNUIEFQSVxuICogLSAqKkNPUlMqKjogQnVpbHQtaW4gQ09SUyBzdXBwb3J0IGZvciBicm93c2VyIGNsaWVudHNcbiAqIC0gKipUaHJvdHRsaW5nKio6IENvbmZpZ3VyYWJsZSByYXRlIGFuZCBidXJzdCBsaW1pdHNcbiAqXG4gKiAjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbiAqIGltcG9ydCB7IEludGVyYWN0aXZlQWdlbnQsIFN0cmVhbWluZ0h0dHBBZGFwdGVyIH0gZnJvbSAnQGNka2xhYnMvY2RrLWFwcG1vZC1jYXRhbG9nLWJsdWVwcmludHMnO1xuICpcbiAqIGNvbnN0IG15UHJvbXB0ID0gbmV3IEFzc2V0KHRoaXMsICdQcm9tcHQnLCB7IHBhdGg6ICcuL3Byb21wdC50eHQnIH0pO1xuICogY29uc3QgYWRhcHRlciA9IG5ldyBTdHJlYW1pbmdIdHRwQWRhcHRlcih7XG4gKiAgIHN0YWdlTmFtZTogJ3Byb2QnLFxuICogICB0aHJvdHRsZTogeyByYXRlTGltaXQ6IDEwMCwgYnVyc3RMaW1pdDogMjAwIH1cbiAqIH0pO1xuICpcbiAqIGNvbnN0IGFnZW50ID0gbmV3IEludGVyYWN0aXZlQWdlbnQodGhpcywgJ0FnZW50Jywge1xuICogICBhZ2VudE5hbWU6ICdDaGF0QWdlbnQnLFxuICogICBhZ2VudERlZmluaXRpb246IHsgYmVkcm9ja01vZGVsOiB7fSwgc3lzdGVtUHJvbXB0OiBteVByb21wdCB9LFxuICogICBjb21tdW5pY2F0aW9uQWRhcHRlcjogYWRhcHRlclxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmVhbWluZ0h0dHBBZGFwdGVyIGltcGxlbWVudHMgSUNvbW11bmljYXRpb25BZGFwdGVyIHtcbiAgLyoqXG4gICAqIFRoZSBSRVNUIEFQSSBHYXRld2F5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc3RBcGk/OiBSZXN0QXBpO1xuXG4gIC8qKlxuICAgKiBUaGUgQ29nbml0byBVc2VyIFBvb2xzIGF1dGhvcml6ZXIgKGlmIENvZ25pdG8gYXV0aGVudGljYXRpb24gaXMgZW5hYmxlZCkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29nbml0b0F1dGhvcml6ZXI/OiBDb2duaXRvVXNlclBvb2xzQXV0aG9yaXplcjtcblxuICAvKipcbiAgICogVGhlIEFQSSBlbmRwb2ludCBVUkwuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXBpRW5kcG9pbnQ/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogU3RyZWFtaW5nSHR0cEFkYXB0ZXJQcm9wcztcbiAgcHJpdmF0ZSBzY29wZT86IENvbnN0cnVjdDtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogU3RyZWFtaW5nSHR0cEFkYXB0ZXJQcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCB0aGUgYWRhcHRlciB0byBhIExhbWJkYSBmdW5jdGlvbiBhbmQgY3JlYXRlIFJFU1QgQVBJIGluZnJhc3RydWN0dXJlLlxuICAgKiBDcmVhdGVzIEFQSSBHYXRld2F5IFJFU1QgQVBJIHdpdGggUE9TVCAvY2hhdCBlbmRwb2ludCBhbmQgcmVzcG9uc2Ugc3RyZWFtaW5nLlxuICAgKi9cbiAgYXR0YWNoVG9GdW5jdGlvbihsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuc2NvcGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3RyZWFtaW5nSHR0cEFkYXB0ZXIgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGEgc2NvcGUgYmVmb3JlIGNhbGxpbmcgYXR0YWNoVG9GdW5jdGlvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YWdlTmFtZSA9IHRoaXMucHJvcHMuc3RhZ2VOYW1lIHx8ICdwcm9kJztcbiAgICBjb25zdCBjb3JzQWxsb3dNZXRob2RzID0gdGhpcy5wcm9wcy5jb3JzQWxsb3dNZXRob2RzIHx8IFsnUE9TVCcsICdPUFRJT05TJ107XG4gICAgY29uc3QgY29yc0FsbG93TWV0aG9kc1N0cmluZyA9IGNvcnNBbGxvd01ldGhvZHMuam9pbignLCcpO1xuXG4gICAgLy8gQ3JlYXRlIFJFU1QgQVBJIHdpdGggQ09SU1xuICAgIC8vIFVzZSBSRUdJT05BTCBlbmRwb2ludCBmb3IgNS1taW51dGUgaWRsZSB0aW1lb3V0ICh2cyAzMHMgZm9yIEVER0UpLlxuICAgIC8vIFRoaXMgYWxsb3dzIHJlc3BvbnNlIHN0cmVhbWluZyB0byBleGNlZWQgQVBJIEdhdGV3YXkncyAyOXMgbGltaXQuXG4gICAgY29uc3QgcmVzdEFwaSA9IG5ldyBSZXN0QXBpKHRoaXMuc2NvcGUsICdDaGF0QXBpJywge1xuICAgICAgcmVzdEFwaU5hbWU6IGAke1N0YWNrLm9mKHRoaXMuc2NvcGUpLnN0YWNrTmFtZX0tQ2hhdEFwaWAsXG4gICAgICBkZXNjcmlwdGlvbjogJ0ludGVyYWN0aXZlIEFnZW50IENoYXQgQVBJIHdpdGggcmVzcG9uc2Ugc3RyZWFtaW5nJyxcbiAgICAgIGVuZHBvaW50VHlwZXM6IFtFbmRwb2ludFR5cGUuUkVHSU9OQUxdLFxuICAgICAgZGVwbG95T3B0aW9uczoge1xuICAgICAgICBzdGFnZU5hbWUsXG4gICAgICAgIHRocm90dGxpbmdSYXRlTGltaXQ6IHRoaXMucHJvcHMudGhyb3R0bGU/LnJhdGVMaW1pdCxcbiAgICAgICAgdGhyb3R0bGluZ0J1cnN0TGltaXQ6IHRoaXMucHJvcHMudGhyb3R0bGU/LmJ1cnN0TGltaXQsXG4gICAgICB9LFxuICAgICAgZGVmYXVsdENvcnNQcmVmbGlnaHRPcHRpb25zOiB7XG4gICAgICAgIGFsbG93T3JpZ2luczogQ29ycy5BTExfT1JJR0lOUyxcbiAgICAgICAgYWxsb3dNZXRob2RzOiBjb3JzQWxsb3dNZXRob2RzLFxuICAgICAgICBhbGxvd0hlYWRlcnM6IFsnQ29udGVudC1UeXBlJywgJ0F1dGhvcml6YXRpb24nXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgKHRoaXMgYXMgYW55KS5yZXN0QXBpID0gcmVzdEFwaTtcblxuICAgIC8vIEFkZCBDT1JTIGhlYWRlcnMgdG8gQVBJIEdhdGV3YXkgZXJyb3IgcmVzcG9uc2VzICg0WFgvNVhYKS5cbiAgICAvLyBXaXRob3V0IHRoZXNlLCB0aGUgQ29nbml0byBhdXRob3JpemVyJ3MgNDAxIHJlc3BvbnNlIHdvbid0IGluY2x1ZGVcbiAgICAvLyBBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4gYW5kIHRoZSBicm93c2VyIHdpbGwgYmxvY2sgaXQgYXMgYSBDT1JTIGVycm9yLlxuICAgIG5ldyBHYXRld2F5UmVzcG9uc2UodGhpcy5zY29wZSwgJ0dhdGV3YXlEZWZhdWx0NFhYJywge1xuICAgICAgcmVzdEFwaSxcbiAgICAgIHR5cGU6IFJlc3BvbnNlVHlwZS5ERUZBVUxUXzRYWCxcbiAgICAgIHJlc3BvbnNlSGVhZGVyczoge1xuICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogXCInKidcIixcbiAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnOiBcIidDb250ZW50LVR5cGUsQXV0aG9yaXphdGlvbidcIixcbiAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMnOiBgJyR7Y29yc0FsbG93TWV0aG9kc1N0cmluZ30nYCxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgbmV3IEdhdGV3YXlSZXNwb25zZSh0aGlzLnNjb3BlLCAnR2F0ZXdheURlZmF1bHQ1WFgnLCB7XG4gICAgICByZXN0QXBpLFxuICAgICAgdHlwZTogUmVzcG9uc2VUeXBlLkRFRkFVTFRfNVhYLFxuICAgICAgcmVzcG9uc2VIZWFkZXJzOiB7XG4gICAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nOiBcIicqJ1wiLFxuICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycyc6IFwiJ0NvbnRlbnQtVHlwZSxBdXRob3JpemF0aW9uJ1wiLFxuICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcyc6IGAnJHtjb3JzQWxsb3dNZXRob2RzU3RyaW5nfSdgLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBMYW1iZGEgaW50ZWdyYXRpb25cbiAgICBjb25zdCBsYW1iZGFJbnRlZ3JhdGlvbiA9IG5ldyBMYW1iZGFJbnRlZ3JhdGlvbihsYW1iZGFGdW5jdGlvbiwge1xuICAgICAgcHJveHk6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBBZGQgL2NoYXQgcmVzb3VyY2Ugd2l0aCBQT1NUIG1ldGhvZFxuICAgIGNvbnN0IGNoYXRSZXNvdXJjZSA9IHJlc3RBcGkucm9vdC5hZGRSZXNvdXJjZSgnY2hhdCcpO1xuXG4gICAgLy8gRGV0ZXJtaW5lIGF1dGhvcml6YXRpb24gdHlwZVxuICAgIGxldCBhdXRob3JpemF0aW9uVHlwZSA9IEF1dGhvcml6YXRpb25UeXBlLk5PTkU7XG4gICAgbGV0IGF1dGhvcml6ZXI6IENvZ25pdG9Vc2VyUG9vbHNBdXRob3JpemVyIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHRoaXMucHJvcHMuYXV0aGVudGljYXRvciBpbnN0YW5jZW9mIENvZ25pdG9BdXRoZW50aWNhdG9yICYmIHRoaXMucHJvcHMuYXV0aGVudGljYXRvci51c2VyUG9vbCkge1xuICAgICAgYXV0aG9yaXplciA9IG5ldyBDb2duaXRvVXNlclBvb2xzQXV0aG9yaXplcih0aGlzLnNjb3BlLCAnQ29nbml0b0F1dGhvcml6ZXInLCB7XG4gICAgICAgIGNvZ25pdG9Vc2VyUG9vbHM6IFt0aGlzLnByb3BzLmF1dGhlbnRpY2F0b3IudXNlclBvb2xdLFxuICAgICAgICBhdXRob3JpemVyTmFtZTogJ0NvZ25pdG9BdXRob3JpemVyJyxcbiAgICAgIH0pO1xuICAgICAgKHRoaXMgYXMgYW55KS5jb2duaXRvQXV0aG9yaXplciA9IGF1dGhvcml6ZXI7XG4gICAgICBhdXRob3JpemF0aW9uVHlwZSA9IEF1dGhvcml6YXRpb25UeXBlLkNPR05JVE87XG4gICAgfVxuXG4gICAgY29uc3QgcG9zdE1ldGhvZCA9IGNoYXRSZXNvdXJjZS5hZGRNZXRob2QoJ1BPU1QnLCBsYW1iZGFJbnRlZ3JhdGlvbiwge1xuICAgICAgYXV0aG9yaXphdGlvblR5cGUsXG4gICAgICBhdXRob3JpemVyLFxuICAgIH0pO1xuXG4gICAgLy8gQ29uZmlndXJlIHJlc3BvbnNlIHN0cmVhbWluZyB2aWEgQ2ZuTWV0aG9kIGVzY2FwZSBoYXRjaFxuICAgIC8vIEFQSSBHYXRld2F5IFJFU1QgQVBJIHJlc3BvbnNlIHN0cmVhbWluZyByZXF1aXJlczpcbiAgICAvLyAxLiByZXNwb25zZVRyYW5zZmVyTW9kZTogU1RSRUFNIG9uIHRoZSBpbnRlZ3JhdGlvblxuICAgIC8vIDIuIEludGVncmF0aW9uIFVSSSBwb2ludGluZyB0byAvcmVzcG9uc2Utc3RyZWFtaW5nLWludm9jYXRpb25zXG4gICAgY29uc3QgY2ZuTWV0aG9kID0gcG9zdE1ldGhvZC5ub2RlLmRlZmF1bHRDaGlsZCBhcyBhbnk7XG4gICAgaWYgKGNmbk1ldGhvZCkge1xuICAgICAgY2ZuTWV0aG9kLmFkZFByb3BlcnR5T3ZlcnJpZGUoJ0ludGVncmF0aW9uLlJlc3BvbnNlVHJhbnNmZXJNb2RlJywgJ1NUUkVBTScpO1xuICAgICAgLy8gT3ZlcnJpZGUgdGhlIGludGVncmF0aW9uIFVSSSB0byB1c2UgcmVzcG9uc2Utc3RyZWFtaW5nLWludm9jYXRpb25zIHBhdGhcbiAgICAgIGNvbnN0IHJlZ2lvbiA9IFN0YWNrLm9mKHRoaXMuc2NvcGUpLnJlZ2lvbjtcbiAgICAgIGNmbk1ldGhvZC5hZGRQcm9wZXJ0eU92ZXJyaWRlKFxuICAgICAgICAnSW50ZWdyYXRpb24uVXJpJyxcbiAgICAgICAgYGFybjphd3M6YXBpZ2F0ZXdheToke3JlZ2lvbn06bGFtYmRhOnBhdGgvMjAyMS0xMS0xNS9mdW5jdGlvbnMvJHtsYW1iZGFGdW5jdGlvbi5mdW5jdGlvbkFybn0vcmVzcG9uc2Utc3RyZWFtaW5nLWludm9jYXRpb25zYCxcbiAgICAgICk7XG4gICAgICAvLyBTZXQgaW50ZWdyYXRpb24gdGltZW91dCB0byAxNSBtaW51dGVzICg5MDAwMDAgbXMpXG4gICAgICBjZm5NZXRob2QuYWRkUHJvcGVydHlPdmVycmlkZSgnSW50ZWdyYXRpb24uVGltZW91dEluTWlsbGlzJywgOTAwMDAwKTtcbiAgICB9XG5cbiAgICAvLyBHcmFudCBBUEkgR2F0ZXdheSBwZXJtaXNzaW9uIHRvIGludm9rZSBMYW1iZGEgd2l0aCByZXNwb25zZSBzdHJlYW1pbmdcbiAgICBsYW1iZGFGdW5jdGlvbi5hZGRQZXJtaXNzaW9uKCdBcGlHYXRld2F5SW52b2tlJywge1xuICAgICAgcHJpbmNpcGFsOiBuZXcgU2VydmljZVByaW5jaXBhbCgnYXBpZ2F0ZXdheS5hbWF6b25hd3MuY29tJyksXG4gICAgICBzb3VyY2VBcm46IHJlc3RBcGkuYXJuRm9yRXhlY3V0ZUFwaSgpLFxuICAgIH0pO1xuXG4gICAgLy8gQWxzbyBncmFudCBJbnZva2VXaXRoUmVzcG9uc2VTdHJlYW0gcGVybWlzc2lvblxuICAgIGxhbWJkYUZ1bmN0aW9uLmFkZFBlcm1pc3Npb24oJ0FwaUdhdGV3YXlTdHJlYW1JbnZva2UnLCB7XG4gICAgICBwcmluY2lwYWw6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKCdhcGlnYXRld2F5LmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIHNvdXJjZUFybjogcmVzdEFwaS5hcm5Gb3JFeGVjdXRlQXBpKCdQT1NUJywgJy9jaGF0JyksXG4gICAgICBhY3Rpb246ICdsYW1iZGE6SW52b2tlRnVuY3Rpb25VcmwnLFxuICAgIH0pO1xuXG4gICAgLy8gQ29uc3RydWN0IGVuZHBvaW50IFVSTFxuICAgIGNvbnN0IHVybCA9IHJlc3RBcGkudXJsRm9yUGF0aCgnL2NoYXQnKTtcbiAgICAodGhpcyBhcyBhbnkpLmFwaUVuZHBvaW50ID0gdXJsO1xuXG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgTGFtYmRhIGZ1bmN0aW9uIHBlcm1pc3Npb25zIGZvciBBUEkgR2F0ZXdheSBpbnRlZ3JhdGlvbi5cbiAgICogRm9yIFJFU1QgQVBJIHN0cmVhbWluZywgbm8gYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBhcmUgbmVlZGVkIGJleW9uZCB0aGUgaW52b2tlIHBlcm1pc3Npb24uXG4gICAqL1xuICBncmFudEludm9rZShfbGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHZvaWQge1xuICAgIC8vIFJFU1QgQVBJIHN0cmVhbWluZyBkb2Vzbid0IG5lZWQgcG9zdF90b19jb25uZWN0aW9uIGxpa2UgV2ViU29ja2V0LlxuICAgIC8vIFRoZSBMYW1iZGEgaW52b2tlIHBlcm1pc3Npb24gaXMgYWxyZWFkeSBncmFudGVkIGluIGF0dGFjaFRvRnVuY3Rpb24uXG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgYWRhcHRlciB3aXRoIGEgQ0RLIHNjb3BlLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgYXR0YWNoVG9GdW5jdGlvbiBvciBncmFudEludm9rZS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3NldFNjb3BlKHNjb3BlOiBDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG4gIH1cbn1cblxuLyoqXG4gKiBTdHJhdGVneSBpbnRlcmZhY2UgZm9yIHNlc3Npb24gcGVyc2lzdGVuY2UuXG4gKlxuICogU2Vzc2lvbiBzdG9yZXMgbWFuYWdlIGNvbnZlcnNhdGlvbiBzdGF0ZSBwZXJzaXN0ZW5jZSBhY3Jvc3MgSFRUUCByZXF1ZXN0cy5cbiAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIChTM1Nlc3Npb25NYW5hZ2VyKSB1c2VzIFMzIGZvciBkdXJhYmxlIHN0b3JhZ2UuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIFN0cmFuZHMtbmF0aXZlIGBTM1Nlc3Npb25NYW5hZ2VyYCBmcm9tIGBzdHJhbmRzLnNlc3Npb24uczNfc2Vzc2lvbl9tYW5hZ2VyYCBpbnN0ZWFkLlxuICogVGhlIFB5dGhvbiBoYW5kbGVyIG5vdyB1c2VzIFN0cmFuZHMtbmF0aXZlIHNlc3Npb24gbWFuYWdlbWVudCBhdXRvbWF0aWNhbGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElTZXNzaW9uU3RvcmUge1xuICAvKipcbiAgICogVGhlIFMzIGJ1Y2tldCB1c2VkIGZvciBzZXNzaW9uIHN0b3JhZ2UgKGlmIFMzLWJhc2VkKS5cbiAgICovXG4gIHJlYWRvbmx5IHNlc3Npb25CdWNrZXQ/OiBJQnVja2V0O1xuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkL3dyaXRlIHBlcm1pc3Npb25zIHRvIGEgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhRnVuY3Rpb24gLSBUaGUgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgbmVlZHMgYWNjZXNzIHRvIHRoZSBzZXNzaW9uIHN0b3JlXG4gICAqL1xuICBncmFudFJlYWRXcml0ZShsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKTogdm9pZDtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIFMzU2Vzc2lvbk1hbmFnZXIuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIFN0cmFuZHMtbmF0aXZlIGBTM1Nlc3Npb25NYW5hZ2VyYCBmcm9tIGBzdHJhbmRzLnNlc3Npb24uczNfc2Vzc2lvbl9tYW5hZ2VyYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFMzU2Vzc2lvbk1hbmFnZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBTMyBidWNrZXQgZm9yIHNlc3Npb24gc3RvcmFnZS5cbiAgICpcbiAgICogQGRlZmF1bHQgQXV0by1jcmVhdGVkIGJ1Y2tldCB3aXRoIEtNUyBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBidWNrZXQ/OiBJQnVja2V0O1xuXG4gIC8qKlxuICAgKiBUaW1lLXRvLWxpdmUgZm9yIHNlc3Npb25zLlxuICAgKiBTZXNzaW9ucyBvbGRlciB0aGFuIHRoaXMgZHVyYXRpb24gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLmhvdXJzKDI0KVxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvblRUTD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBLTVMgZW5jcnlwdGlvbiBrZXkgZm9yIHRoZSBzZXNzaW9uIGJ1Y2tldC5cbiAgICpcbiAgICogQGRlZmF1bHQgQXV0by1jcmVhdGVkIEtNUyBrZXkgd2l0aCByb3RhdGlvbiBlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5PzogSUtleTtcblxuICAvKipcbiAgICogUmVtb3ZhbCBwb2xpY3kgZm9yIHRoZSBzZXNzaW9uIGJ1Y2tldC5cbiAgICpcbiAgICogQGRlZmF1bHQgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG4gICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcbn1cblxuLyoqXG4gKiBTMy1iYXNlZCBzZXNzaW9uIG1hbmFnZXIgZm9yIHBlcnNpc3RpbmcgY29udmVyc2F0aW9uIHN0YXRlLlxuICpcbiAqIFVzZXMgUzMgZm9yIGR1cmFibGUgc3RvcmFnZSBvZiBzZXNzaW9uIGRhdGEgd2l0aCBhdXRvbWF0aWMgZXhwaXJhdGlvblxuICogdmlhIGxpZmVjeWNsZSBwb2xpY2llcy4gRWFjaCBIVFRQIHJlcXVlc3QgbG9hZHMvc2F2ZXMgc2Vzc2lvbiBzdGF0ZSxcbiAqIGVuYWJsaW5nIG11bHRpLXR1cm4gY29udmVyc2F0aW9ucyBvdmVyIHN0YXRlbGVzcyBIVFRQLlxuICpcbiAqICMjIEZlYXR1cmVzXG4gKlxuICogLSAqKkR1cmFibGUgU3RvcmFnZSoqOiBTZXNzaW9ucyBwZXJzaXN0ZWQgdG8gUzMgc3Vydml2ZSBMYW1iZGEgcmVzdGFydHNcbiAqIC0gKipBdXRvbWF0aWMgRXhwaXJhdGlvbioqOiBMaWZlY3ljbGUgcG9saWN5IHJlbW92ZXMgb2xkIHNlc3Npb25zXG4gKiAtICoqRW5jcnlwdGlvbioqOiBLTVMgZW5jcnlwdGlvbiBhdCByZXN0XG4gKiAtICoqQ29zdCBPcHRpbWl6YXRpb24qKjogUzMgU3RhbmRhcmQgc3RvcmFnZSB3aXRoIGxpZmVjeWNsZSBtYW5hZ2VtZW50XG4gKlxuICogIyMgVXNhZ2VcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBBc3NldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1hc3NldHMnO1xuICogaW1wb3J0IHsgSW50ZXJhY3RpdmVBZ2VudCwgUzNTZXNzaW9uTWFuYWdlciB9IGZyb20gJ0BjZGtsYWJzL2Nkay1hcHBtb2QtY2F0YWxvZy1ibHVlcHJpbnRzJztcbiAqIGltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSAnYXdzLWNkay1saWInO1xuICpcbiAqIGNvbnN0IG15UHJvbXB0ID0gbmV3IEFzc2V0KHRoaXMsICdQcm9tcHQnLCB7IHBhdGg6ICcuL3Byb21wdC50eHQnIH0pO1xuICogY29uc3Qgc2Vzc2lvbk1hbmFnZXIgPSBuZXcgUzNTZXNzaW9uTWFuYWdlcih0aGlzLCAnU2Vzc2lvbk1hbmFnZXInLCB7XG4gKiAgIHNlc3Npb25UVEw6IER1cmF0aW9uLmhvdXJzKDQ4KVxuICogfSk7XG4gKlxuICogY29uc3QgYWdlbnQgPSBuZXcgSW50ZXJhY3RpdmVBZ2VudCh0aGlzLCAnQWdlbnQnLCB7XG4gKiAgIGFnZW50TmFtZTogJ0NoYXRBZ2VudCcsXG4gKiAgIGFnZW50RGVmaW5pdGlvbjogeyBiZWRyb2NrTW9kZWw6IHt9LCBzeXN0ZW1Qcm9tcHQ6IG15UHJvbXB0IH0sXG4gKiAgIHNlc3Npb25TdG9yZTogc2Vzc2lvbk1hbmFnZXJcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIFN0cmFuZHMtbmF0aXZlIGBTM1Nlc3Npb25NYW5hZ2VyYCBmcm9tIGBzdHJhbmRzLnNlc3Npb24uczNfc2Vzc2lvbl9tYW5hZ2VyYCBpbnN0ZWFkLlxuICogVGhlIFB5dGhvbiBoYW5kbGVyIG5vdyB1c2VzIFN0cmFuZHMtbmF0aXZlIHNlc3Npb24gbWFuYWdlbWVudCBhdXRvbWF0aWNhbGx5LlxuICogQW4gUzMgYnVja2V0IGlzIHN0aWxsIGNyZWF0ZWQgZm9yIHRoZSBTdHJhbmRzIHNlc3Npb24gbWFuYWdlcjsgdGhpcyBDREsgY2xhc3NcbiAqIGlzIG5vIGxvbmdlciBuZWVkZWQgdG8gY29uZmlndXJlIHNlc3Npb24gcGVyc2lzdGVuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBTM1Nlc3Npb25NYW5hZ2VyIGltcGxlbWVudHMgSVNlc3Npb25TdG9yZSB7XG4gIC8qKlxuICAgKiBUaGUgUzMgYnVja2V0IHVzZWQgZm9yIHNlc3Npb24gc3RvcmFnZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBidWNrZXQ6IElCdWNrZXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXNzaW9uIFRUTCBkdXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzZXNzaW9uVFRMOiBEdXJhdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUzNTZXNzaW9uTWFuYWdlclByb3BzID0ge30pIHtcbiAgICBjb25zdCByZW1vdmFsUG9saWN5ID0gcHJvcHMucmVtb3ZhbFBvbGljeSB8fCBSZW1vdmFsUG9saWN5LkRFU1RST1k7XG4gICAgY29uc3Qgc2Vzc2lvblRUTCA9IHByb3BzLnNlc3Npb25UVEwgfHwgRHVyYXRpb24uaG91cnMoMjQpO1xuXG4gICAgLy8gVXNlIHByb3ZpZGVkIGJ1Y2tldCBvciBjcmVhdGUgbmV3IG9uZVxuICAgIHRoaXMuYnVja2V0ID0gcHJvcHMuYnVja2V0IHx8IG5ldyBCdWNrZXQoc2NvcGUsIGAke2lkfUJ1Y2tldGAsIHtcbiAgICAgIGVuY3J5cHRpb246IEJ1Y2tldEVuY3J5cHRpb24uS01TLFxuICAgICAgZW5jcnlwdGlvbktleTogcHJvcHMuZW5jcnlwdGlvbktleSxcbiAgICAgIHJlbW92YWxQb2xpY3k6IHJlbW92YWxQb2xpY3ksXG4gICAgICBhdXRvRGVsZXRlT2JqZWN0czogcmVtb3ZhbFBvbGljeSA9PT0gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgbGlmZWN5Y2xlUnVsZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnRGVsZXRlT2xkU2Vzc2lvbnMnLFxuICAgICAgICAgIGV4cGlyYXRpb246IHNlc3Npb25UVEwsXG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgICAgdmVyc2lvbmVkOiBmYWxzZSxcbiAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBCbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNlc3Npb25UVEwgPSBzZXNzaW9uVFRMO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBTMyBidWNrZXQgdXNlZCBmb3Igc2Vzc2lvbiBzdG9yYWdlIChJU2Vzc2lvblN0b3JlIGludGVyZmFjZSkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNlc3Npb25CdWNrZXQoKTogSUJ1Y2tldCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQvd3JpdGUgcGVybWlzc2lvbnMgdG8gYSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqL1xuICBncmFudFJlYWRXcml0ZShsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5idWNrZXQuZ3JhbnRSZWFkV3JpdGUobGFtYmRhRnVuY3Rpb24pO1xuICB9XG59XG5cbi8qKlxuICogU3RyYXRlZ3kgaW50ZXJmYWNlIGZvciBjb252ZXJzYXRpb24gaGlzdG9yeSBtYW5hZ2VtZW50LlxuICpcbiAqIENvbnRleHQgc3RyYXRlZ2llcyBjb250cm9sIGhvdyBjb252ZXJzYXRpb24gaGlzdG9yeSBpcyBtYWludGFpbmVkIGFuZCBwcm92aWRlZFxuICogdG8gdGhlIGFnZW50LiBEaWZmZXJlbnQgc3RyYXRlZ2llcyBlbmFibGUgZGlmZmVyZW50IGNvbnZlcnNhdGlvbiBwYXR0ZXJucy5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgU3RyYW5kcy1uYXRpdmUgYFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyYCBmcm9tXG4gKiBgc3RyYW5kcy5hZ2VudC5jb252ZXJzYXRpb25fbWFuYWdlcmAgaW5zdGVhZC4gVGhlIFB5dGhvbiBoYW5kbGVyIG5vdyB1c2VzXG4gKiBTdHJhbmRzLW5hdGl2ZSBjb252ZXJzYXRpb24gbWFuYWdlbWVudCBhdXRvbWF0aWNhbGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElDb250ZXh0U3RyYXRlZ3kge1xuICAvKipcbiAgICogR2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGFtYmRhIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIEVudmlyb25tZW50IHZhcmlhYmxlcyB0byBjb25maWd1cmUgdGhlIGNvbnRleHQgbWFuYWdlclxuICAgKi9cbiAgZW52aXJvbm1lbnRWYXJpYWJsZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBTdHJhbmRzLW5hdGl2ZSBgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXJgIGZyb21cbiAqIGBzdHJhbmRzLmFnZW50LmNvbnZlcnNhdGlvbl9tYW5hZ2VyYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyUHJvcHMge1xuICAvKipcbiAgICogTWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgdG8ga2VlcCBpbiBjb252ZXJzYXRpb24gaGlzdG9yeS5cbiAgICpcbiAgICogQGRlZmF1bHQgMjAgbWVzc2FnZXNcbiAgICovXG4gIHJlYWRvbmx5IHdpbmRvd1NpemU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogU2xpZGluZyB3aW5kb3cgY29udmVyc2F0aW9uIG1hbmFnZXIgZm9yIG1haW50YWluaW5nIHJlY2VudCBjb252ZXJzYXRpb24gaGlzdG9yeS5cbiAqXG4gKiBLZWVwcyBhIGZpeGVkLXNpemUgd2luZG93IG9mIHJlY2VudCBtZXNzYWdlcywgYXV0b21hdGljYWxseSBkaXNjYXJkaW5nIG9sZGVyXG4gKiBtZXNzYWdlcyBhcyBuZXcgb25lcyBhcnJpdmUuIFByb3ZpZGVzIGNvbnNpc3RlbnQgY29udGV4dCBzaXplIGZvciB0aGUgYWdlbnQuXG4gKlxuICogIyMgVXNhZ2VcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBBc3NldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1hc3NldHMnO1xuICogaW1wb3J0IHsgSW50ZXJhY3RpdmVBZ2VudCwgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIgfSBmcm9tICdAY2RrbGFicy9jZGstYXBwbW9kLWNhdGFsb2ctYmx1ZXByaW50cyc7XG4gKlxuICogY29uc3QgbXlQcm9tcHQgPSBuZXcgQXNzZXQodGhpcywgJ1Byb21wdCcsIHsgcGF0aDogJy4vcHJvbXB0LnR4dCcgfSk7XG4gKiBjb25zdCBjb250ZXh0TWFuYWdlciA9IG5ldyBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlcih7IHdpbmRvd1NpemU6IDMwIH0pO1xuICpcbiAqIGNvbnN0IGFnZW50ID0gbmV3IEludGVyYWN0aXZlQWdlbnQodGhpcywgJ0FnZW50Jywge1xuICogICBhZ2VudE5hbWU6ICdDaGF0QWdlbnQnLFxuICogICBhZ2VudERlZmluaXRpb246IHsgYmVkcm9ja01vZGVsOiB7fSwgc3lzdGVtUHJvbXB0OiBteVByb21wdCB9LFxuICogICBjb250ZXh0U3RyYXRlZ3k6IGNvbnRleHRNYW5hZ2VyXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBTdHJhbmRzLW5hdGl2ZSBgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXJgIGZyb21cbiAqIGBzdHJhbmRzLmFnZW50LmNvbnZlcnNhdGlvbl9tYW5hZ2VyYCBpbnN0ZWFkLiBUaGUgUHl0aG9uIGhhbmRsZXIgbm93IGhhbmRsZXNcbiAqIGNvbnZlcnNhdGlvbiB3aW5kb3dpbmcgbmF0aXZlbHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlciBpbXBsZW1lbnRzIElDb250ZXh0U3RyYXRlZ3kge1xuICAvKipcbiAgICogVGhlIHdpbmRvdyBzaXplIChudW1iZXIgb2YgbWVzc2FnZXMgdG8ga2VlcCkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd2luZG93U2l6ZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlclByb3BzID0ge30pIHtcbiAgICBjb25zdCB3aW5kb3dTaXplID0gcHJvcHMud2luZG93U2l6ZSAhPT0gdW5kZWZpbmVkID8gcHJvcHMud2luZG93U2l6ZSA6IDIwO1xuXG4gICAgaWYgKHdpbmRvd1NpemUgPCAxIHx8IHdpbmRvd1NpemUgPiAxMDAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dpbmRvd1NpemUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMDAnKTtcbiAgICB9XG5cbiAgICB0aGlzLndpbmRvd1NpemUgPSB3aW5kb3dTaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExhbWJkYSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZW52aXJvbm1lbnRWYXJpYWJsZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIENPTlRFWFRfRU5BQkxFRDogJ3RydWUnLFxuICAgICAgQ09OVEVYVF9TVFJBVEVHWTogJ1NsaWRpbmdXaW5kb3cnLFxuICAgICAgQ09OVEVYVF9XSU5ET1dfU0laRTogdGhpcy53aW5kb3dTaXplLnRvU3RyaW5nKCksXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIE51bGwgY29udmVyc2F0aW9uIG1hbmFnZXIgZm9yIHN0YXRlbGVzcyBpbnRlcmFjdGlvbnMuXG4gKlxuICogRGlzYWJsZXMgY29udmVyc2F0aW9uIGhpc3RvcnksIHRyZWF0aW5nIGVhY2ggbWVzc2FnZSBhcyBpbmRlcGVuZGVudC5cbiAqIFVzZWZ1bCBmb3Igc3RhdGVsZXNzIHVzZSBjYXNlcyB3aGVyZSBjb250ZXh0IGlzIG5vdCBuZWVkZWQuXG4gKlxuICogQGRlcHJlY2F0ZWQgVGhlIFB5dGhvbiBoYW5kbGVyIG5vdyB1c2VzIFN0cmFuZHMtbmF0aXZlIGNvbnZlcnNhdGlvbiBtYW5hZ2VtZW50LlxuICogVG8gZGlzYWJsZSBjb252ZXJzYXRpb24gaGlzdG9yeSwgb21pdCB0aGUgc2Vzc2lvbiBidWNrZXQgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE51bGxDb252ZXJzYXRpb25NYW5hZ2VyIGltcGxlbWVudHMgSUNvbnRleHRTdHJhdGVneSB7XG4gIC8qKlxuICAgKiBHZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBMYW1iZGEgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGVudmlyb25tZW50VmFyaWFibGVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB7XG4gICAgICBDT05URVhUX0VOQUJMRUQ6ICdmYWxzZScsXG4gICAgICBDT05URVhUX1NUUkFURUdZOiAnTnVsbCcsXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFN0cmF0ZWd5IGludGVyZmFjZSBmb3IgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcy5cbiAqXG4gKiBBdXRoZW50aWNhdG9ycyBjb250cm9sIGhvdyBBUEkgZW5kcG9pbnRzIGFyZSBzZWN1cmVkLlxuICogRGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBzdXBwb3J0IHZhcmlvdXMgYXV0aGVudGljYXRpb24gbWV0aG9kcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQXV0aGVudGljYXRvciB7XG4gIC8qKlxuICAgKiBHcmFudCBhdXRoZW50aWNhdGlvbiBwZXJtaXNzaW9ucyB0byBhIExhbWJkYSBmdW5jdGlvbi5cbiAgICovXG4gIGdyYW50QXV0aGVudGljYXRlKGxhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb24pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBHZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBMYW1iZGEgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGVudmlyb25tZW50VmFyaWFibGVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBDb2duaXRvQXV0aGVudGljYXRvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2duaXRvQXV0aGVudGljYXRvclByb3BzIHtcbiAgLyoqXG4gICAqIENvZ25pdG8gVXNlciBQb29sIGZvciBhdXRoZW50aWNhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgQXV0by1jcmVhdGVkIFVzZXIgUG9vbCB3aXRoIHNlY3VyZSBkZWZhdWx0c1xuICAgKi9cbiAgcmVhZG9ubHkgdXNlclBvb2w/OiBVc2VyUG9vbDtcblxuICAvKipcbiAgICogQ29nbml0byBVc2VyIFBvb2wgQ2xpZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBBdXRvLWNyZWF0ZWQgY2xpZW50IHdpdGggYXBwcm9wcmlhdGUgYXV0aCBmbG93c1xuICAgKi9cbiAgcmVhZG9ubHkgdXNlclBvb2xDbGllbnQ/OiBVc2VyUG9vbENsaWVudDtcblxuICAvKipcbiAgICogUmVtb3ZhbCBwb2xpY3kgZm9yIENvZ25pdG8gcmVzb3VyY2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LkRFU1RST1lcbiAgICovXG4gIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5O1xufVxuXG4vKipcbiAqIENvZ25pdG8tYmFzZWQgYXV0aGVudGljYXRvciBmb3Igc2VjdXJpbmcgUkVTVCBBUEkgZW5kcG9pbnRzLlxuICpcbiAqIENyZWF0ZXMgYSBDb2duaXRvIFVzZXIgUG9vbCBhbmQgaW50ZWdyYXRlcyB3aXRoIEFQSSBHYXRld2F5IFJFU1QgQVBJXG4gKiB1c2luZyB0aGUgbmF0aXZlIENPR05JVE9fVVNFUl9QT09MUyBhdXRob3JpemVyIHR5cGUuIENsaWVudHMgc2VuZFxuICogSldUIHRva2VucyBpbiB0aGUgQXV0aG9yaXphdGlvbiBoZWFkZXIuXG4gKlxuICogIyMgRmVhdHVyZXNcbiAqXG4gKiAtICoqTmF0aXZlIEpXVCBWYWxpZGF0aW9uKio6IEFQSSBHYXRld2F5IHZhbGlkYXRlcyB0b2tlbnMgd2l0aG91dCBjdXN0b20gTGFtYmRhXG4gKiAtICoqVXNlciBNYW5hZ2VtZW50Kio6IEJ1aWx0LWluIHVzZXIgcmVnaXN0cmF0aW9uIGFuZCBtYW5hZ2VtZW50XG4gKiAtICoqUGFzc3dvcmQgUG9saWNpZXMqKjogRW5mb3JjZXMgc3Ryb25nIHBhc3N3b3JkIHJlcXVpcmVtZW50c1xuICogLSAqKkFjY291bnQgUmVjb3ZlcnkqKjogRW1haWwtYmFzZWQgYWNjb3VudCByZWNvdmVyeVxuICpcbiAqICMjIFVzYWdlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbiAqIGltcG9ydCB7IFJlbW92YWxQb2xpY3kgfSBmcm9tICdhd3MtY2RrLWxpYic7XG4gKiBpbXBvcnQgeyBJbnRlcmFjdGl2ZUFnZW50LCBDb2duaXRvQXV0aGVudGljYXRvciB9IGZyb20gJ0BjZGtsYWJzL2Nkay1hcHBtb2QtY2F0YWxvZy1ibHVlcHJpbnRzJztcbiAqXG4gKiBjb25zdCBteVByb21wdCA9IG5ldyBBc3NldCh0aGlzLCAnUHJvbXB0JywgeyBwYXRoOiAnLi9wcm9tcHQudHh0JyB9KTtcbiAqIGNvbnN0IGF1dGhlbnRpY2F0b3IgPSBuZXcgQ29nbml0b0F1dGhlbnRpY2F0b3Ioe1xuICogICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LlJFVEFJTlxuICogfSk7XG4gKlxuICogY29uc3QgYWdlbnQgPSBuZXcgSW50ZXJhY3RpdmVBZ2VudCh0aGlzLCAnQWdlbnQnLCB7XG4gKiAgIGFnZW50TmFtZTogJ0NoYXRBZ2VudCcsXG4gKiAgIGFnZW50RGVmaW5pdGlvbjogeyBiZWRyb2NrTW9kZWw6IHt9LCBzeXN0ZW1Qcm9tcHQ6IG15UHJvbXB0IH0sXG4gKiAgIGF1dGhlbnRpY2F0b3JcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2duaXRvQXV0aGVudGljYXRvciBpbXBsZW1lbnRzIElBdXRoZW50aWNhdG9yIHtcbiAgLyoqXG4gICAqIFRoZSBDb2duaXRvIFVzZXIgUG9vbC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyUG9vbD86IFVzZXJQb29sO1xuXG4gIC8qKlxuICAgKiBUaGUgQ29nbml0byBVc2VyIFBvb2wgQ2xpZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVzZXJQb29sQ2xpZW50PzogVXNlclBvb2xDbGllbnQ7XG5cbiAgcHJpdmF0ZSBzY29wZT86IENvbnN0cnVjdDtcbiAgcHJpdmF0ZSByZWFkb25seSByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5O1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBDb2duaXRvQXV0aGVudGljYXRvclByb3BzID0ge30pIHtcbiAgICB0aGlzLnVzZXJQb29sID0gcHJvcHMudXNlclBvb2w7XG4gICAgdGhpcy51c2VyUG9vbENsaWVudCA9IHByb3BzLnVzZXJQb29sQ2xpZW50O1xuICAgIHRoaXMucmVtb3ZhbFBvbGljeSA9IHByb3BzLnJlbW92YWxQb2xpY3kgfHwgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IGF1dGhlbnRpY2F0aW9uIHBlcm1pc3Npb25zIHRvIGEgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKiBHcmFudHMgcGVybWlzc2lvbnMgdG8gdmVyaWZ5IENvZ25pdG8gdG9rZW5zLlxuICAgKi9cbiAgZ3JhbnRBdXRoZW50aWNhdGUobGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zY29wZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2duaXRvQXV0aGVudGljYXRvciBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYSBzY29wZSBiZWZvcmUgY2FsbGluZyBncmFudEF1dGhlbnRpY2F0ZScpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy51c2VyUG9vbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2VyIFBvb2wgbXVzdCBiZSBjcmVhdGVkIGJlZm9yZSBncmFudGluZyBwZXJtaXNzaW9ucy4gQ2FsbCBfc2V0U2NvcGUgZmlyc3QuJyk7XG4gICAgfVxuXG4gICAgbGFtYmRhRnVuY3Rpb24uYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2NvZ25pdG8taWRwOkdldFVzZXInLFxuICAgICAgICAgICdjb2duaXRvLWlkcDpBZG1pbkdldFVzZXInLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFt0aGlzLnVzZXJQb29sLnVzZXJQb29sQXJuXSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGFtYmRhIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBlbnZpcm9ubWVudFZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4ge1xuICAgICAgQVVUSF9UWVBFOiAnQ29nbml0bycsXG4gICAgICBVU0VSX1BPT0xfSUQ6IHRoaXMudXNlclBvb2w/LnVzZXJQb29sSWQgfHwgJycsXG4gICAgICBVU0VSX1BPT0xfQ0xJRU5UX0lEOiB0aGlzLnVzZXJQb29sQ2xpZW50Py51c2VyUG9vbENsaWVudElkIHx8ICcnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgYXV0aGVudGljYXRvciB3aXRoIGEgQ0RLIHNjb3BlLlxuICAgKiBDcmVhdGVzIFVzZXIgUG9vbCBhbmQgQ2xpZW50IGlmIG5vdCBwcm92aWRlZC5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3NldFNjb3BlKHNjb3BlOiBDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG5cbiAgICBpZiAoIXRoaXMudXNlclBvb2wpIHtcbiAgICAgICh0aGlzIGFzIGFueSkudXNlclBvb2wgPSBuZXcgVXNlclBvb2woc2NvcGUsICdVc2VyUG9vbCcsIHtcbiAgICAgICAgdXNlclBvb2xOYW1lOiBgJHtTdGFjay5vZihzY29wZSkuc3RhY2tOYW1lfS1Vc2VyUG9vbGAsXG4gICAgICAgIHNlbGZTaWduVXBFbmFibGVkOiB0cnVlLFxuICAgICAgICBzaWduSW5BbGlhc2VzOiB7XG4gICAgICAgICAgZW1haWw6IHRydWUsXG4gICAgICAgICAgdXNlcm5hbWU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGF1dG9WZXJpZnk6IHtcbiAgICAgICAgICBlbWFpbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgcGFzc3dvcmRQb2xpY3k6IHtcbiAgICAgICAgICBtaW5MZW5ndGg6IDgsXG4gICAgICAgICAgcmVxdWlyZUxvd2VyY2FzZTogdHJ1ZSxcbiAgICAgICAgICByZXF1aXJlVXBwZXJjYXNlOiB0cnVlLFxuICAgICAgICAgIHJlcXVpcmVEaWdpdHM6IHRydWUsXG4gICAgICAgICAgcmVxdWlyZVN5bWJvbHM6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIG1mYTogTWZhLk9QVElPTkFMLFxuICAgICAgICBtZmFTZWNvbmRGYWN0b3I6IHtcbiAgICAgICAgICBzbXM6IHRydWUsXG4gICAgICAgICAgb3RwOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBhY2NvdW50UmVjb3Zlcnk6IEFjY291bnRSZWNvdmVyeS5FTUFJTF9PTkxZLFxuICAgICAgICByZW1vdmFsUG9saWN5OiB0aGlzLnJlbW92YWxQb2xpY3ksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudXNlclBvb2xDbGllbnQgJiYgdGhpcy51c2VyUG9vbCkge1xuICAgICAgKHRoaXMgYXMgYW55KS51c2VyUG9vbENsaWVudCA9IG5ldyBVc2VyUG9vbENsaWVudChzY29wZSwgJ1VzZXJQb29sQ2xpZW50Jywge1xuICAgICAgICB1c2VyUG9vbDogdGhpcy51c2VyUG9vbCxcbiAgICAgICAgdXNlclBvb2xDbGllbnROYW1lOiBgJHtTdGFjay5vZihzY29wZSkuc3RhY2tOYW1lfS1Vc2VyUG9vbENsaWVudGAsXG4gICAgICAgIGF1dGhGbG93czoge1xuICAgICAgICAgIHVzZXJQYXNzd29yZDogdHJ1ZSxcbiAgICAgICAgICB1c2VyU3JwOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBnZW5lcmF0ZVNlY3JldDogZmFsc2UsXG4gICAgICAgIHN1cHBvcnRlZElkZW50aXR5UHJvdmlkZXJzOiBbXG4gICAgICAgICAgVXNlclBvb2xDbGllbnRJZGVudGl0eVByb3ZpZGVyLkNPR05JVE8sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTdHJhdGVneSBpbnRlcmZhY2UgZm9yIHNlc3Npb24gaW5kZXggc3RvcmFnZS5cbiAqXG4gKiBTZXNzaW9uIGluZGV4ZXMgcHJvdmlkZSBmYXN0IHVzZXIgdG8gc2Vzc2lvbiBsb29rdXBzIGZvciBsaXN0aW5nIGFuZCBtYW5hZ2luZyBzZXNzaW9ucy5cbiAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIChEeW5hbW9EQlNlc3Npb25JbmRleCkgdXNlcyBEeW5hbW9EQiBmb3IgZWZmaWNpZW50IHF1ZXJpZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVNlc3Npb25JbmRleCB7XG4gIC8qKlxuICAgKiBHcmFudCByZWFkL3dyaXRlIHBlcm1pc3Npb25zIHRvIGEgZ3JhbnRlZS5cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgLSBUaGUgcHJpbmNpcGFsIHRoYXQgbmVlZHMgYWNjZXNzIHRvIHRoZSBzZXNzaW9uIGluZGV4XG4gICAqL1xuICBncmFudFJlYWRXcml0ZShncmFudGVlOiBJR3JhbnRhYmxlKTogdm9pZDtcblxuICAvKipcbiAgICogR2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGFtYmRhIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIEVudmlyb25tZW50IHZhcmlhYmxlcyB0byBjb25maWd1cmUgdGhlIHNlc3Npb24gaW5kZXhcbiAgICovXG4gIGVudmlyb25tZW50VmFyaWFibGVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBEeW5hbW9EQlNlc3Npb25JbmRleC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEeW5hbW9EQlNlc3Npb25JbmRleFByb3BzIHtcbiAgLyoqXG4gICAqIEV4aXN0aW5nIER5bmFtb0RCIHRhYmxlIHRvIHVzZS5cbiAgICogVGFibGUgbXVzdCBoYXZlIHBhcnRpdGlvbiBrZXkgJ3VzZXJfaWQnIChTdHJpbmcpIGFuZCBzb3J0IGtleSAnc2Vzc2lvbl9pZCcgKFN0cmluZykuXG4gICAqXG4gICAqIEBkZWZhdWx0IEF1dG8tY3JlYXRlZCB0YWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGU/OiBJVGFibGU7XG5cbiAgLyoqXG4gICAqIFRpbWUtdG8tbGl2ZSBmb3Igc2Vzc2lvbiBpbmRleCByZWNvcmRzLlxuICAgKiBXaGVuIHNldCwgZXhwaXJlZCByZWNvcmRzIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgYnkgRHluYW1vREIgVFRMLlxuICAgKlxuICAgKiBAZGVmYXVsdCBObyBUVEwgKHNlc3Npb25zIHBlcnNpc3QgdW50aWwgZXhwbGljaXRseSBkZWxldGVkKVxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvblRUTD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBLTVMga2V5IGZvciB0YWJsZSBlbmNyeXB0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBV1MgbWFuYWdlZCBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5PzogSUtleTtcblxuICAvKipcbiAgICogUmVtb3ZhbCBwb2xpY3kgZm9yIHRoZSBEeW5hbW9EQiB0YWJsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG4gICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcbn1cblxuLyoqXG4gKiBEeW5hbW9EQi1iYXNlZCBzZXNzaW9uIGluZGV4IGZvciBmYXN0IHVzZXIgdG8gc2Vzc2lvbiBsb29rdXBzLlxuICpcbiAqIENyZWF0ZXMgYSBEeW5hbW9EQiB0YWJsZSBpbmRleGVkIGJ5IHVzZXJfaWQgKHBhcnRpdGlvbiBrZXkpIGFuZCBzZXNzaW9uX2lkIChzb3J0IGtleSlcbiAqIGZvciBlZmZpY2llbnQgcXVlcnlpbmcgb2YgYSB1c2VyJ3Mgc2Vzc2lvbnMuIFRoZSB0YWJsZSBzdG9yZXMgc2Vzc2lvbiBtZXRhZGF0YVxuICogaW5jbHVkaW5nIGNyZWF0aW9uIHRpbWUsIGxhc3QgdXBkYXRlIHRpbWUsIGFuZCBvcHRpb25hbCBUVEwgZm9yIGF1dG9tYXRpYyBjbGVhbnVwLlxuICpcbiAqICMjIFRhYmxlIFNjaGVtYVxuICpcbiAqIC0gKipQYXJ0aXRpb24gS2V5Kio6IHVzZXJfaWQgKFN0cmluZykgLSBVc2VyIGlkZW50aWZpZXIgZnJvbSBhdXRoZW50aWNhdGlvblxuICogLSAqKlNvcnQgS2V5Kio6IHNlc3Npb25faWQgKFN0cmluZykgLSBVbmlxdWUgc2Vzc2lvbiBpZGVudGlmaWVyXG4gKiAtICoqQXR0cmlidXRlcyoqOiBjcmVhdGVkX2F0LCB1cGRhdGVkX2F0LCBsYXN0X21lc3NhZ2UsIGV4cGlyZXNfYXQgKG9wdGlvbmFsKVxuICpcbiAqICMjIEZlYXR1cmVzXG4gKlxuICogLSAqKkZhc3QgTG9va3VwcyoqOiBRdWVyeSBhbGwgc2Vzc2lvbnMgZm9yIGEgdXNlciBpbiBPKDEpIHVzaW5nIHBhcnRpdGlvbiBrZXlcbiAqIC0gKipBdXRvbWF0aWMgRXhwaXJhdGlvbioqOiBPcHRpb25hbCBUVEwgcmVtb3ZlcyBzdGFsZSBzZXNzaW9ucyBhdXRvbWF0aWNhbGx5XG4gKiAtICoqT24tRGVtYW5kIENhcGFjaXR5Kio6IFBheS1wZXItcmVxdWVzdCBiaWxsaW5nLCBubyBjYXBhY2l0eSBwbGFubmluZyBuZWVkZWRcbiAqIC0gKipFbmNyeXB0aW9uKio6IEFXUyBtYW5hZ2VkIG9yIGN1c3RvbWVyLW1hbmFnZWQgS01TIGVuY3J5cHRpb25cbiAqXG4gKiAjIyBVc2FnZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEFzc2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWFzc2V0cyc7XG4gKiBpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbiAqIGltcG9ydCB7IEludGVyYWN0aXZlQWdlbnQsIER5bmFtb0RCU2Vzc2lvbkluZGV4IH0gZnJvbSAnQGNka2xhYnMvY2RrLWFwcG1vZC1jYXRhbG9nLWJsdWVwcmludHMnO1xuICpcbiAqIGNvbnN0IG15UHJvbXB0ID0gbmV3IEFzc2V0KHRoaXMsICdQcm9tcHQnLCB7IHBhdGg6ICcuL3Byb21wdC50eHQnIH0pO1xuICogY29uc3Qgc2Vzc2lvbkluZGV4ID0gbmV3IER5bmFtb0RCU2Vzc2lvbkluZGV4KHRoaXMsICdTZXNzaW9uSW5kZXgnLCB7XG4gKiAgIHNlc3Npb25UVEw6IER1cmF0aW9uLmRheXMoNylcbiAqIH0pO1xuICpcbiAqIGNvbnN0IGFnZW50ID0gbmV3IEludGVyYWN0aXZlQWdlbnQodGhpcywgJ0FnZW50Jywge1xuICogICBhZ2VudE5hbWU6ICdDaGF0QWdlbnQnLFxuICogICBhZ2VudERlZmluaXRpb246IHsgYmVkcm9ja01vZGVsOiB7fSwgc3lzdGVtUHJvbXB0OiBteVByb21wdCB9LFxuICogICBzZXNzaW9uSW5kZXhcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBEeW5hbW9EQlNlc3Npb25JbmRleCBpbXBsZW1lbnRzIElTZXNzaW9uSW5kZXgge1xuICAvKipcbiAgICogVGhlIER5bmFtb0RCIHRhYmxlIHVzZWQgZm9yIHNlc3Npb24gaW5kZXggc3RvcmFnZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0YWJsZTogSVRhYmxlO1xuXG4gIC8qKlxuICAgKiBUaGUgc2Vzc2lvbiBUVEwgZHVyYXRpb24gKGlmIGNvbmZpZ3VyZWQpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlc3Npb25UVEw/OiBEdXJhdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRHluYW1vREJTZXNzaW9uSW5kZXhQcm9wcyA9IHt9KSB7XG4gICAgY29uc3QgcmVtb3ZhbFBvbGljeSA9IHByb3BzLnJlbW92YWxQb2xpY3kgfHwgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZO1xuXG4gICAgLy8gVXNlIHByb3ZpZGVkIHRhYmxlIG9yIGNyZWF0ZSBuZXcgb25lXG4gICAgaWYgKHByb3BzLnRhYmxlKSB7XG4gICAgICB0aGlzLnRhYmxlID0gcHJvcHMudGFibGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRhYmxlUHJvcHM6IGFueSA9IHtcbiAgICAgICAgcGFydGl0aW9uS2V5OiB7IG5hbWU6ICd1c2VyX2lkJywgdHlwZTogQXR0cmlidXRlVHlwZS5TVFJJTkcgfSxcbiAgICAgICAgc29ydEtleTogeyBuYW1lOiAnc2Vzc2lvbl9pZCcsIHR5cGU6IEF0dHJpYnV0ZVR5cGUuU1RSSU5HIH0sXG4gICAgICAgIGJpbGxpbmdNb2RlOiBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QsXG4gICAgICAgIGVuY3J5cHRpb246IHByb3BzLmVuY3J5cHRpb25LZXkgPyBUYWJsZUVuY3J5cHRpb24uQ1VTVE9NRVJfTUFOQUdFRCA6IFRhYmxlRW5jcnlwdGlvbi5BV1NfTUFOQUdFRCxcbiAgICAgICAgZW5jcnlwdGlvbktleTogcHJvcHMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogcmVtb3ZhbFBvbGljeSxcbiAgICAgICAgcG9pbnRJblRpbWVSZWNvdmVyeTogdHJ1ZSxcbiAgICAgICAgc3RyZWFtOiBTdHJlYW1WaWV3VHlwZS5ORVdfQU5EX09MRF9JTUFHRVMsXG4gICAgICB9O1xuXG4gICAgICAvLyBFbmFibGUgVFRMIGlmIHNlc3Npb25UVEwgaXMgc3BlY2lmaWVkXG4gICAgICBpZiAocHJvcHMuc2Vzc2lvblRUTCkge1xuICAgICAgICB0YWJsZVByb3BzLnRpbWVUb0xpdmVBdHRyaWJ1dGUgPSAnZXhwaXJlc19hdCc7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudGFibGUgPSBuZXcgVGFibGUoc2NvcGUsIGAke2lkfVRhYmxlYCwgdGFibGVQcm9wcyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXNzaW9uVFRMID0gcHJvcHMuc2Vzc2lvblRUTDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkL3dyaXRlIHBlcm1pc3Npb25zIHRvIGEgZ3JhbnRlZS5cbiAgICovXG4gIGdyYW50UmVhZFdyaXRlKGdyYW50ZWU6IElHcmFudGFibGUpOiB2b2lkIHtcbiAgICB0aGlzLnRhYmxlLmdyYW50UmVhZFdyaXRlRGF0YShncmFudGVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBMYW1iZGEgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGVudmlyb25tZW50VmFyaWFibGVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFNFU1NJT05fSU5ERVhfVEFCTEU6IHRoaXMudGFibGUudGFibGVOYW1lLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zZXNzaW9uVFRMKSB7XG4gICAgICBlbnYuU0VTU0lPTl9JTkRFWF9UVExfU0VDT05EUyA9IHRoaXMuc2Vzc2lvblRUTC50b1NlY29uZHMoKS50b1N0cmluZygpO1xuICAgIH1cblxuICAgIHJldHVybiBlbnY7XG4gIH1cbn1cblxuLyoqXG4gKiBOby1hdXRoZW50aWNhdGlvbiBhdXRoZW50aWNhdG9yIGZvciBkZXZlbG9wbWVudCBhbmQgdGVzdGluZy5cbiAqXG4gKiBEaXNhYmxlcyBhdXRoZW50aWNhdGlvbiBlbnRpcmVseSwgYWxsb3dpbmcgYW55IGNsaWVudCB0byBjb25uZWN0XG4gKiB3aXRob3V0IGNyZWRlbnRpYWxzLiBUaGlzIHNob3VsZCBPTkxZIGJlIHVzZWQgZm9yIGRldmVsb3BtZW50XG4gKiBhbmQgdGVzdGluZyBlbnZpcm9ubWVudHMuXG4gKlxuICogIyMgU2VjdXJpdHkgV2FybmluZ1xuICpcbiAqIFRoaXMgYXV0aGVudGljYXRvciBwcm92aWRlcyBOTyBzZWN1cml0eS4gTmV2ZXIgdXNlIGluIHByb2R1Y3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBOb0F1dGhlbnRpY2F0b3IgaW1wbGVtZW50cyBJQXV0aGVudGljYXRvciB7XG4gIC8qKlxuICAgKiBOby1vcCBmb3IgTm9BdXRoZW50aWNhdG9yIHNpbmNlIG5vIGF1dGhlbnRpY2F0aW9uIGlzIHBlcmZvcm1lZC5cbiAgICovXG4gIGdyYW50QXV0aGVudGljYXRlKF9sYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKTogdm9pZCB7XG4gICAgLy8gTm8gcGVybWlzc2lvbnMgbmVlZGVkXG4gIH1cblxuICAvKipcbiAgICogR2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGFtYmRhIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBlbnZpcm9ubWVudFZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4ge1xuICAgICAgQVVUSF9UWVBFOiAnTm9uZScsXG4gICAgfTtcbiAgfVxufVxuXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwYXNzZWQgdG8gYSBob3N0aW5nIGFkYXB0ZXIncyBkZXBsb3kgbWV0aG9kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50SG9zdGluZ0NvbmZpZyB7XG4gIC8qKiBDREsgc2NvcGUgZm9yIGNyZWF0aW5nIHJlc291cmNlcy4gKi9cbiAgcmVhZG9ubHkgc2NvcGU6IENvbnN0cnVjdDtcbiAgLyoqIEFnZW50IG5hbWUgaWRlbnRpZmllci4gKi9cbiAgcmVhZG9ubHkgYWdlbnROYW1lOiBzdHJpbmc7XG4gIC8qKiBJQU0gcm9sZSBmb3IgdGhlIGFnZW50IHJ1bnRpbWUuICovXG4gIHJlYWRvbmx5IGFnZW50Um9sZTogUm9sZTtcbiAgLyoqIEVudmlyb25tZW50IHZhcmlhYmxlcyB0byBzZXQgb24gdGhlIHJ1bnRpbWUuICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogS01TIGVuY3J5cHRpb24ga2V5LiAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5OiBLZXk7XG4gIC8qKiBPcHRpb25hbCBWUEMgbmV0d29yayBjb25maWd1cmF0aW9uLiAqL1xuICByZWFkb25seSBuZXR3b3JrPzogTmV0d29yaztcbiAgLyoqIExhbWJkYSBhcmNoaXRlY3R1cmUgKExhbWJkYSBob3N0aW5nIG9ubHkpLiAqL1xuICByZWFkb25seSBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XG4gIC8qKiBMYW1iZGEgbWVtb3J5IHNpemUgaW4gTUIgKExhbWJkYSBob3N0aW5nIG9ubHkpLiAqL1xuICByZWFkb25seSBtZW1vcnlTaXplPzogbnVtYmVyO1xuICAvKiogTGFtYmRhIHRpbWVvdXQgKExhbWJkYSBob3N0aW5nIG9ubHkpLiAqL1xuICByZWFkb25seSB0aW1lb3V0PzogRHVyYXRpb247XG4gIC8qKiBSZXNlcnZlZCBjb25jdXJyZW50IGV4ZWN1dGlvbnMgKExhbWJkYSBob3N0aW5nIG9ubHkpLiAqL1xuICByZWFkb25seSByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zPzogbnVtYmVyO1xuICAvKiogTGFtYmRhIGxheWVycyBmcm9tIGFnZW50IGRlZmluaXRpb24gKExhbWJkYSBob3N0aW5nIG9ubHkpLiAqL1xuICByZWFkb25seSBsYW1iZGFMYXllcnM/OiBJTGF5ZXJWZXJzaW9uW107XG4gIC8qKiBMYW1iZGEgbGF5ZXJzIGZyb20ga25vd2xlZGdlIGJhc2VzIChMYW1iZGEgaG9zdGluZyBvbmx5KS4gKi9cbiAgcmVhZG9ubHkga25vd2xlZGdlQmFzZUxheWVycz86IElMYXllclZlcnNpb25bXTtcbiAgLyoqIFdoZXRoZXIgb2JzZXJ2YWJpbGl0eSBpcyBlbmFibGVkLiAqL1xuICByZWFkb25seSBlbmFibGVPYnNlcnZhYmlsaXR5PzogYm9vbGVhbjtcbiAgLyoqIEFnZW50IHRvb2xzIGxvY2F0aW9uIGRlZmluaXRpb25zIChKU09OIHNlcmlhbGl6ZWQpLiAqL1xuICByZWFkb25seSB0b29sc0NvbmZpZzogc3RyaW5nO1xuICAvKiogU3lzdGVtIHByb21wdCBTMyBidWNrZXQgbmFtZS4gKi9cbiAgcmVhZG9ubHkgc3lzdGVtUHJvbXB0QnVja2V0OiBzdHJpbmc7XG4gIC8qKiBTeXN0ZW0gcHJvbXB0IFMzIGtleS4gKi9cbiAgcmVhZG9ubHkgc3lzdGVtUHJvbXB0S2V5OiBzdHJpbmc7XG4gIC8qKiBLbm93bGVkZ2UgYmFzZSBjb25maWdzIChKU09OIHNlcmlhbGl6ZWQpLiAqL1xuICByZWFkb25seSBrbm93bGVkZ2VCYXNlQ29uZmlncz86IHN0cmluZztcbiAgLyoqIEtub3dsZWRnZSBiYXNlIHN5c3RlbSBwcm9tcHQgYWRkaXRpb24uICovXG4gIHJlYWRvbmx5IGtub3dsZWRnZUJhc2VTeXN0ZW1Qcm9tcHRBZGRpdGlvbj86IHN0cmluZztcbiAgLyoqIFJlbW92YWwgcG9saWN5IGZvciByZXNvdXJjZXMuICovXG4gIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5O1xufVxuXG4vKipcbiAqIFJlc3VsdCByZXR1cm5lZCBieSBhIGhvc3RpbmcgYWRhcHRlcidzIGRlcGxveSBtZXRob2QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRIb3N0aW5nUmVzdWx0IHtcbiAgLyoqIFRoZSBhZ2VudCBlbmRwb2ludCBVUkwgb3IgQVJOLiAqL1xuICByZWFkb25seSBlbmRwb2ludDogc3RyaW5nO1xuICAvKiogVGhlIExhbWJkYSBmdW5jdGlvbiAoaWYgTGFtYmRhLWhvc3RlZCkuICovXG4gIHJlYWRvbmx5IGFnZW50RnVuY3Rpb24/OiBJRnVuY3Rpb247XG4gIC8qKiBUaGUgQWdlbnRDb3JlIENmblJ1bnRpbWUgKGlmIEFnZW50Q29yZS1ob3N0ZWQpLiAqL1xuICByZWFkb25seSBjZm5SdW50aW1lPzogQ2ZuUnVudGltZTtcbn1cblxuLyoqXG4gKiBTdHJhdGVneSBpbnRlcmZhY2UgZm9yIHBsdWdnYWJsZSBob3N0aW5nIGJhY2tlbmRzLlxuICpcbiAqIEhvc3RpbmcgYWRhcHRlcnMgZW5jYXBzdWxhdGUgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byBydW4gYW4gYWdlbnQuXG4gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBgTGFtYmRhSG9zdGluZ0FkYXB0ZXJgIChMYW1iZGEgKyBMV0EgKyBBUEkgR2F0ZXdheSkuXG4gKiBgQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyYCBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB1c2luZyBBZ2VudENvcmUgUnVudGltZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG9zdGluZ0FkYXB0ZXIge1xuICAvKipcbiAgICogVGhlIElBTSBzZXJ2aWNlIHByaW5jaXBhbCB0aGF0IHRoaXMgaG9zdGluZyBiYWNrZW5kIHJlcXVpcmVzLlxuICAgKlxuICAgKiBCYXNlQWdlbnQgdXNlcyB0aGlzIHRvIGNyZWF0ZSB0aGUgYWdlbnQgcm9sZSB3aXRoIHRoZSBjb3JyZWN0IHRydXN0IHBvbGljeS5cbiAgICogRm9yIGV4YW1wbGUsIExhbWJkYSBob3N0aW5nIHJlcXVpcmVzIGBsYW1iZGEuYW1hem9uYXdzLmNvbWAgd2hpbGUgQWdlbnRDb3JlXG4gICAqIGhvc3RpbmcgcmVxdWlyZXMgYGJlZHJvY2stYWdlbnRjb3JlLmFtYXpvbmF3cy5jb21gLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZVByaW5jaXBhbDogU2VydmljZVByaW5jaXBhbDtcblxuICAvKipcbiAgICogRGVwbG95IHRoZSBhZ2VudCBob3N0aW5nIGluZnJhc3RydWN0dXJlLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBmb3IgdGhlIGFnZW50IGhvc3RpbmdcbiAgICogQHJldHVybnMgVGhlIGhvc3RpbmcgcmVzdWx0IGluY2x1ZGluZyBlbmRwb2ludCBhbmQgb3B0aW9uYWwgcmVzb3VyY2VzXG4gICAqL1xuICBkZXBsb3koY29uZmlnOiBBZ2VudEhvc3RpbmdDb25maWcpOiBBZ2VudEhvc3RpbmdSZXN1bHQ7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBMYW1iZGFIb3N0aW5nQWRhcHRlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYW1iZGFIb3N0aW5nQWRhcHRlclByb3BzIHtcbiAgLyoqXG4gICAqIENvbW11bmljYXRpb24gYWRhcHRlciBmb3IgY2xpZW50LWFnZW50IGludGVyYWN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBTdHJlYW1pbmdIdHRwQWRhcHRlclxuICAgKi9cbiAgcmVhZG9ubHkgY29tbXVuaWNhdGlvbkFkYXB0ZXI/OiBJQ29tbXVuaWNhdGlvbkFkYXB0ZXI7XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0b3IgZm9yIHNlY3VyaW5nIEFQSSBlbmRwb2ludHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IENvZ25pdG9BdXRoZW50aWNhdG9yXG4gICAqL1xuICByZWFkb25seSBhdXRoZW50aWNhdG9yPzogSUF1dGhlbnRpY2F0b3I7XG5cbiAgLyoqXG4gICAqIEhUVFAgbWV0aG9kcyB0byBhbGxvdyBpbiBDT1JTIHByZWZsaWdodCByZXNwb25zZXMuXG4gICAqIFVzZSB0aGlzIHRvIGVuYWJsZSBhZGRpdGlvbmFsIG1ldGhvZHMgKEdFVCwgREVMRVRFLCBQVVQpIGZvciBjdXN0b20gcm91dGVzXG4gICAqIGFkZGVkIHRvIHRoZSBSRVNUIEFQSS5cbiAgICpcbiAgICogQGRlZmF1bHQgWydQT1NUJywgJ09QVElPTlMnXVxuICAgKi9cbiAgcmVhZG9ubHkgY29yc0FsbG93TWV0aG9kcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBMYW1iZGEgZnVuY3Rpb24gbWVtb3J5IHNpemUgaW4gTUIuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEwMjRcbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeVNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIExhbWJkYSBmdW5jdGlvbiB0aW1lb3V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5taW51dGVzKDE1KVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBMYW1iZGEgZnVuY3Rpb24gYXJjaGl0ZWN0dXJlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBcmNoaXRlY3R1cmUuWDg2XzY0XG4gICAqL1xuICByZWFkb25seSBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XG5cbiAgLyoqXG4gICAqIFJlc2VydmVkIGNvbmN1cnJlbnQgZXhlY3V0aW9ucyBmb3IgdGhlIExhbWJkYSBmdW5jdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgTm8gcmVzZXJ2ZWQgY29uY3VycmVuY3lcbiAgICovXG4gIHJlYWRvbmx5IHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogTGFtYmRhIGhvc3RpbmcgYWRhcHRlciBmb3IgSW50ZXJhY3RpdmVBZ2VudC5cbiAqXG4gKiBEZXBsb3lzIHRoZSBhZ2VudCBhcyBhIExhbWJkYSBmdW5jdGlvbiBiZWhpbmQgTGFtYmRhIFdlYiBBZGFwdGVyIGFuZCBBUEkgR2F0ZXdheVxuICogUkVTVCBBUEkgd2l0aCByZXNwb25zZSBzdHJlYW1pbmcuIFRoaXMgaXMgdGhlIGRlZmF1bHQgaG9zdGluZyBiYWNrZW5kLlxuICpcbiAqICMjIEFyY2hpdGVjdHVyZVxuICpcbiAqIGBgYFxuICogQ2xpZW50IOKGkiBQT1NUIC9jaGF0IOKGkiBBUEkgR2F0ZXdheSBSRVNUIEFQSSAoU1RSRUFNKSDihpIgTGFtYmRhIChGYXN0QVBJICsgTFdBKSDihpIgQmVkcm9ja1xuICogQ2xpZW50IOKGkCBTU0Ugc3RyZWFtIOKGkCBBUEkgR2F0ZXdheSDihpAgTGFtYmRhIHJlc3BvbnNlIHN0cmVhbWluZyDihpAgQWdlbnQgdG9rZW5zXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIExhbWJkYUhvc3RpbmdBZGFwdGVyIGltcGxlbWVudHMgSUhvc3RpbmdBZGFwdGVyIHtcbiAgLyoqIFRoZSBjb21tdW5pY2F0aW9uIGFkYXB0ZXIuICovXG4gIHB1YmxpYyByZWFkb25seSBjb21tdW5pY2F0aW9uQWRhcHRlcj86IElDb21tdW5pY2F0aW9uQWRhcHRlcjtcbiAgLyoqIFRoZSBhdXRoZW50aWNhdG9yLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXV0aGVudGljYXRvcj86IElBdXRoZW50aWNhdG9yO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IExhbWJkYUhvc3RpbmdBZGFwdGVyUHJvcHM7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IExhbWJkYUhvc3RpbmdBZGFwdGVyUHJvcHMgPSB7fSkge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgfVxuXG4gIGdldCBzZXJ2aWNlUHJpbmNpcGFsKCkgeyByZXR1cm4gbmV3IFNlcnZpY2VQcmluY2lwYWwoJ2xhbWJkYS5hbWF6b25hd3MuY29tJyk7IH1cblxuICAvKipcbiAgICogRGVwbG95IExhbWJkYSArIExXQSArIEFQSSBHYXRld2F5IGhvc3RpbmcgaW5mcmFzdHJ1Y3R1cmUuXG4gICAqL1xuICBkZXBsb3koY29uZmlnOiBBZ2VudEhvc3RpbmdDb25maWcpOiBBZ2VudEhvc3RpbmdSZXN1bHQge1xuICAgIGNvbnN0IHNjb3BlID0gY29uZmlnLnNjb3BlO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBhdXRoZW50aWNhdG9yXG4gICAgY29uc3QgYXV0aGVudGljYXRvciA9IHRoaXMucHJvcHMuYXV0aGVudGljYXRvciAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHRoaXMucHJvcHMuYXV0aGVudGljYXRvclxuICAgICAgOiBuZXcgQ29nbml0b0F1dGhlbnRpY2F0b3IoKTtcbiAgICAodGhpcyBhcyBhbnkpLmF1dGhlbnRpY2F0b3IgPSBhdXRoZW50aWNhdG9yO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0b3IgaW5zdGFuY2VvZiBDb2duaXRvQXV0aGVudGljYXRvcikge1xuICAgICAgYXV0aGVudGljYXRvci5fc2V0U2NvcGUoc2NvcGUpO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgY29tbXVuaWNhdGlvbiBhZGFwdGVyXG4gICAgY29uc3QgYWRhcHRlciA9IHRoaXMucHJvcHMuY29tbXVuaWNhdGlvbkFkYXB0ZXIgfHwgbmV3IFN0cmVhbWluZ0h0dHBBZGFwdGVyKHtcbiAgICAgIGF1dGhlbnRpY2F0b3IsXG4gICAgICBjb3JzQWxsb3dNZXRob2RzOiB0aGlzLnByb3BzLmNvcnNBbGxvd01ldGhvZHMsXG4gICAgfSk7XG4gICAgKHRoaXMgYXMgYW55KS5jb21tdW5pY2F0aW9uQWRhcHRlciA9IGFkYXB0ZXI7XG5cbiAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFN0cmVhbWluZ0h0dHBBZGFwdGVyKSB7XG4gICAgICBhZGFwdGVyLl9zZXRTY29wZShzY29wZSk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAgY29uc3QgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgLi4uY29uZmlnLmVudmlyb25tZW50LFxuICAgICAgLy8gTGFtYmRhIFdlYiBBZGFwdGVyIGNvbmZpZ3VyYXRpb25cbiAgICAgIEFXU19MQU1CREFfRVhFQ19XUkFQUEVSOiAnL29wdC9ib290c3RyYXAnLFxuICAgICAgQVdTX0xXQV9JTlZPS0VfTU9ERTogJ3Jlc3BvbnNlX3N0cmVhbScsXG4gICAgICBBV1NfTFdBX1JFQURJTkVTU19DSEVDS19QQVRIOiAnL2hlYWx0aCcsXG4gICAgICBBV1NfTFdBX1BPUlQ6ICc4MDgwJyxcbiAgICAgIFBPUlQ6ICc4MDgwJyxcbiAgICAgIC4uLmF1dGhlbnRpY2F0b3IuZW52aXJvbm1lbnRWYXJpYWJsZXMoKSxcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIExhbWJkYSBmdW5jdGlvbiB3aXRoIExhbWJkYSBXZWIgQWRhcHRlciBsYXllclxuICAgIGNvbnN0IHsgYWNjb3VudCwgcmVnaW9uIH0gPSBTdGFjay5vZihzY29wZSk7XG4gICAgY29uc3QgYWdlbnRMYW1iZGFMb2dQZXJtaXNzaW9uc1Jlc3VsdCA9IExhbWJkYUlhbVV0aWxzLmNyZWF0ZUxvZ3NQZXJtaXNzaW9ucyh7XG4gICAgICBhY2NvdW50LFxuICAgICAgcmVnaW9uLFxuICAgICAgc2NvcGUsXG4gICAgICBmdW5jdGlvbk5hbWU6IGNvbmZpZy5hZ2VudE5hbWUsXG4gICAgICBlbmFibGVPYnNlcnZhYmlsaXR5OiBjb25maWcuZW5hYmxlT2JzZXJ2YWJpbGl0eSxcbiAgICB9KTtcblxuICAgIC8vIExhbWJkYSBXZWIgQWRhcHRlciBsYXllclxuICAgIGNvbnN0IHdlYkFkYXB0ZXJMYXllciA9IExheWVyVmVyc2lvbi5mcm9tTGF5ZXJWZXJzaW9uQXJuKFxuICAgICAgc2NvcGUsXG4gICAgICAnTGFtYmRhV2ViQWRhcHRlckxheWVyJyxcbiAgICAgIGBhcm46YXdzOmxhbWJkYToke3JlZ2lvbn06NzUzMjQwNTk4MDc1OmxheWVyOkxhbWJkYUFkYXB0ZXJMYXllclg4NjoyNWAsXG4gICAgKTtcblxuICAgIGNvbnN0IGFsbExheWVyczogSUxheWVyVmVyc2lvbltdID0gW3dlYkFkYXB0ZXJMYXllcl07XG4gICAgaWYgKGNvbmZpZy5sYW1iZGFMYXllcnMpIHtcbiAgICAgIGFsbExheWVycy5wdXNoKC4uLmNvbmZpZy5sYW1iZGFMYXllcnMpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmtub3dsZWRnZUJhc2VMYXllcnMgJiYgY29uZmlnLmtub3dsZWRnZUJhc2VMYXllcnMubGVuZ3RoID4gMCkge1xuICAgICAgYWxsTGF5ZXJzLnB1c2goLi4uY29uZmlnLmtub3dsZWRnZUJhc2VMYXllcnMpO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZXJQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ3Jlc291cmNlcy9pbnRlcmFjdGl2ZS1hZ2VudC1oYW5kbGVyJyk7XG5cbiAgICAvLyBBbGwgUHl0aG9uIHZlcnNpb24gcmVmZXJlbmNlcyBkZXJpdmVkIGZyb20gRGVmYXVsdFJ1bnRpbWVzLlBZVEhPTlxuICAgIGNvbnN0IHB5dGhvblJ1bnRpbWUgPSBEZWZhdWx0UnVudGltZXMuUFlUSE9OO1xuICAgIGNvbnN0IHB5VmVyc2lvbiA9IHB5dGhvblJ1bnRpbWUubmFtZS5yZXBsYWNlKCdweXRob24nLCAnJyk7IC8vIGUuZy4gXCIzLjEzXCJcblxuICAgIGNvbnN0IGFyY2hpdGVjdHVyZSA9IHRoaXMucHJvcHMuYXJjaGl0ZWN0dXJlIHx8IGNvbmZpZy5hcmNoaXRlY3R1cmUgfHwgQXJjaGl0ZWN0dXJlLlg4Nl82NDtcbiAgICBjb25zdCBtZW1vcnlTaXplID0gdGhpcy5wcm9wcy5tZW1vcnlTaXplIHx8IGNvbmZpZy5tZW1vcnlTaXplIHx8IDEwMjQ7XG4gICAgY29uc3QgdGltZW91dCA9IHRoaXMucHJvcHMudGltZW91dCB8fCBjb25maWcudGltZW91dCB8fCBEdXJhdGlvbi5taW51dGVzKDE1KTtcbiAgICBjb25zdCByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zID0gdGhpcy5wcm9wcy5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zID8/IGNvbmZpZy5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zO1xuXG4gICAgY29uc3QgYWdlbnRGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbihzY29wZSwgJ0ludGVyYWN0aXZlQWdlbnRGdW5jdGlvbicsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogYWdlbnRMYW1iZGFMb2dQZXJtaXNzaW9uc1Jlc3VsdC51bmlxdWVGdW5jdGlvbk5hbWUsXG4gICAgICBhcmNoaXRlY3R1cmUsXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChoYW5kbGVyUGF0aCwge1xuICAgICAgICBidW5kbGluZzoge1xuICAgICAgICAgIGltYWdlOiBweXRob25SdW50aW1lLmJ1bmRsaW5nSW1hZ2UsXG4gICAgICAgICAgY29tbWFuZDogW1xuICAgICAgICAgICAgJ2Jhc2gnLCAnLWMnLFxuICAgICAgICAgICAgJ3BpcCBpbnN0YWxsIC1yIHJlcXVpcmVtZW50cy50eHQgLXQgL2Fzc2V0LW91dHB1dCAmJiBjcCAtYSAuIC9hc3NldC1vdXRwdXQnLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgbG9jYWw6IHtcbiAgICAgICAgICAgIHRyeUJ1bmRsZShvdXRwdXREaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb2MgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgICAgICAgICAgICAgIGNvbnN0IHB5dGhvbkNhbmRpZGF0ZXMgPSBbYHB5dGhvbiR7cHlWZXJzaW9ufWAsICdweXRob24zJywgJ3B5dGhvbiddO1xuICAgICAgICAgICAgICAgIGxldCBweXRob25CaW4gPSAncHl0aG9uMyc7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgcHl0aG9uQ2FuZGlkYXRlcykge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVyID0gcHJvYy5leGVjU3luYyhgJHtjYW5kaWRhdGV9IC0tdmVyc2lvbiAyPiYxYCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gdmVyLm1hdGNoKC9QeXRob24gKFxcZCspXFwuKFxcZCspLyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCAmJiAocGFyc2VJbnQobWF0Y2hbMV0pID4gMyB8fCAocGFyc2VJbnQobWF0Y2hbMV0pID09PSAzICYmIHBhcnNlSW50KG1hdGNoWzJdKSA+PSAxMSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcHl0aG9uQmluID0gY2FuZGlkYXRlO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb2MuZXhlY1N5bmMoXG4gICAgICAgICAgICAgICAgICBgJHtweXRob25CaW59IC1tIHBpcCBpbnN0YWxsIC1yIHJlcXVpcmVtZW50cy50eHQgLXQgXCIke291dHB1dERpcn1cIiAtLXBsYXRmb3JtIG1hbnlsaW51eDIwMTRfeDg2XzY0IC0tb25seS1iaW5hcnk9OmFsbDogLS1weXRob24tdmVyc2lvbiAke3B5VmVyc2lvbn1gLFxuICAgICAgICAgICAgICAgICAgeyBjd2Q6IGhhbmRsZXJQYXRoLCBzdGRpbzogJ2luaGVyaXQnIH0sXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBwcm9jLmV4ZWNTeW5jKFxuICAgICAgICAgICAgICAgICAgYGNwIC1yIC4gXCIke291dHB1dERpcn1cImAsXG4gICAgICAgICAgICAgICAgICB7IGN3ZDogaGFuZGxlclBhdGgsIHN0ZGlvOiAnaW5oZXJpdCcgfSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgcm9sZTogY29uZmlnLmFnZW50Um9sZSxcbiAgICAgIGhhbmRsZXI6ICdydW4uc2gnLFxuICAgICAgcnVudGltZTogcHl0aG9uUnVudGltZSxcbiAgICAgIGxheWVyczogYWxsTGF5ZXJzLFxuICAgICAgdGltZW91dCxcbiAgICAgIG1lbW9yeVNpemUsXG4gICAgICBlbnZpcm9ubWVudDogZW52LFxuICAgICAgZW52aXJvbm1lbnRFbmNyeXB0aW9uOiBjb25maWcuZW5jcnlwdGlvbktleSxcbiAgICAgIHZwYzogY29uZmlnLm5ldHdvcmsgPyBjb25maWcubmV0d29yay52cGMgOiB1bmRlZmluZWQsXG4gICAgICB2cGNTdWJuZXRzOiBjb25maWcubmV0d29yayA/IGNvbmZpZy5uZXR3b3JrLmFwcGxpY2F0aW9uU3VibmV0U2VsZWN0aW9uKCkgOiB1bmRlZmluZWQsXG4gICAgICByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zLFxuICAgIH0pO1xuXG4gICAgLy8gR3JhbnQgbG9nIHBlcm1pc3Npb25zXG4gICAgZm9yIChjb25zdCBzIG9mIGFnZW50TGFtYmRhTG9nUGVybWlzc2lvbnNSZXN1bHQucG9saWN5U3RhdGVtZW50cykge1xuICAgICAgY29uZmlnLmFnZW50Um9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShzKTtcbiAgICB9XG5cbiAgICAvLyBHcmFudCBhdXRoZW50aWNhdG9yIHBlcm1pc3Npb25zXG4gICAgaWYgKGF1dGhlbnRpY2F0b3IpIHtcbiAgICAgIGF1dGhlbnRpY2F0b3IuZ3JhbnRBdXRoZW50aWNhdGUoYWdlbnRGdW5jdGlvbik7XG4gICAgfVxuXG4gICAgLy8gQXR0YWNoIGNvbW11bmljYXRpb24gYWRhcHRlciBhbmQgZ2V0IGVuZHBvaW50XG4gICAgY29uc3QgZW5kcG9pbnQgPSBhZGFwdGVyLmF0dGFjaFRvRnVuY3Rpb24oYWdlbnRGdW5jdGlvbik7XG4gICAgYWRhcHRlci5ncmFudEludm9rZShhZ2VudEZ1bmN0aW9uKTtcblxuICAgIHJldHVybiB7IGVuZHBvaW50LCBhZ2VudEZ1bmN0aW9uIH07XG4gIH1cbn1cblxuLyoqXG4gKiBDdXN0b20gSldUIGF1dGhvcml6ZXIgY29uZmlndXJhdGlvbiBmb3IgQWdlbnRDb3JlIFJ1bnRpbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRDb3JlSnd0QXV0aG9yaXplckNvbmZpZyB7XG4gIC8qKiBPSURDIGRpc2NvdmVyeSBVUkwuICovXG4gIHJlYWRvbmx5IGRpc2NvdmVyeVVybDogc3RyaW5nO1xuICAvKiogQWxsb3dlZCBhdWRpZW5jZXMuICovXG4gIHJlYWRvbmx5IGFsbG93ZWRBdWRpZW5jZT86IHN0cmluZ1tdO1xuICAvKiogQWxsb3dlZCBjbGllbnQgSURzLiAqL1xuICByZWFkb25seSBhbGxvd2VkQ2xpZW50cz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyLlxuICovXG4vKipcbiAqIE5ldHdvcmsgbW9kZSBmb3IgQWdlbnRDb3JlIFJ1bnRpbWUgaG9zdGluZy5cbiAqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIEFnZW50Q29yZSBSdW50aW1lIHJ1bnMgb24gdGhlIHB1YmxpYyBpbnRlcm5ldFxuICogb3IgaW5zaWRlIGEgVlBDIHdpdGggcHJpdmF0ZSBuZXR3b3JraW5nLlxuICovXG5leHBvcnQgZW51bSBOZXR3b3JrTW9kZSB7XG4gIC8qKlxuICAgKiBSdW50aW1lIGlzIHB1YmxpY2x5IGFjY2Vzc2libGUgKGRlZmF1bHQpLlxuICAgKiBObyBWUEMgY29uZmlndXJhdGlvbiByZXF1aXJlZC5cbiAgICovXG4gIFBVQkxJQyA9ICdQVUJMSUMnLFxuXG4gIC8qKlxuICAgKiBSdW50aW1lIHJ1bnMgaW5zaWRlIGEgVlBDLlxuICAgKlxuICAgKiBBZ2VudENvcmUgY3JlYXRlcyBFTklzIGluIHRoZSBzcGVjaWZpZWQgc3VibmV0cy4gWW91IG11c3QgcHJvdmlkZVxuICAgKiBlaXRoZXIgZXhwbGljaXQgYHZwY1N1Ym5ldHNgIGFuZCBgc2VjdXJpdHlHcm91cHNgLCBvciBwYXNzIGFcbiAgICogYE5ldHdvcmtgIGNvbnN0cnVjdCB2aWEgYEludGVyYWN0aXZlQWdlbnQubmV0d29ya2AuXG4gICAqXG4gICAqIFVzZSBwcml2YXRlIHN1Ym5ldHMgd2l0aCBhIE5BVCBHYXRld2F5IGZvciBpbnRlcm5ldCBhY2Nlc3MuXG4gICAqIFB1YmxpYyBzdWJuZXRzIGRvIE5PVCBwcm92aWRlIGludGVybmV0IGFjY2VzcyB0byBBZ2VudENvcmUgRU5Jcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYmVkcm9jay1hZ2VudGNvcmUvbGF0ZXN0L2Rldmd1aWRlL2FnZW50Y29yZS12cGMuaHRtbFxuICAgKi9cbiAgVlBDID0gJ1ZQQycsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyUHJvcHMge1xuICAvKipcbiAgICogRUNSIGNvbnRhaW5lciBpbWFnZSBVUkkuIElmIG5vdCBwcm92aWRlZCwgYnVpbGRzIGZyb20gdGhlIGJ1bmRsZWQgaGFuZGxlciBzb3VyY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IEJ1aWxkcyBmcm9tIGFnZW50Y29yZS1hZ2VudC1oYW5kbGVyIGRpcmVjdG9yeVxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVySW1hZ2VVcmk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5ldHdvcmsgbW9kZSBmb3IgdGhlIEFnZW50Q29yZSBSdW50aW1lLlxuICAgKlxuICAgKiBXaGVuIHNldCB0byBgTmV0d29ya01vZGUuVlBDYCwgdGhlIHJ1bnRpbWUgcnVucyBpbnNpZGUgYSBWUEMgYW5kIEFnZW50Q29yZSBjcmVhdGVzXG4gICAqIEVOSXMgaW4gdGhlIHNwZWNpZmllZCBzdWJuZXRzLiBZb3UgbXVzdCBwcm92aWRlIGVpdGhlciBleHBsaWNpdCBgdnBjU3VibmV0c2BcbiAgICogYW5kIGBzZWN1cml0eUdyb3Vwc2AsIG9yIHBhc3MgYSBgTmV0d29ya2AgY29uc3RydWN0IHZpYSBgQWdlbnRIb3N0aW5nQ29uZmlnLm5ldHdvcmtgXG4gICAqICh3aGljaCBpcyBzZXQgYXV0b21hdGljYWxseSBieSBgSW50ZXJhY3RpdmVBZ2VudGAgd2hlbiBgbmV0d29ya2AgaXMgcHJvdmlkZWQpLlxuICAgKlxuICAgKiBGb3IgVlBDIG1vZGUsIHVzZSBwcml2YXRlIHN1Ym5ldHMgd2l0aCBhIE5BVCBHYXRld2F5IGZvciBpbnRlcm5ldCBhY2Nlc3MuXG4gICAqIFB1YmxpYyBzdWJuZXRzIGRvIE5PVCBwcm92aWRlIGludGVybmV0IGFjY2VzcyB0byBBZ2VudENvcmUgRU5Jcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYmVkcm9jay1hZ2VudGNvcmUvbGF0ZXN0L2Rldmd1aWRlL2FnZW50Y29yZS12cGMuaHRtbFxuICAgKiBAZGVmYXVsdCBOZXR3b3JrTW9kZS5QVUJMSUNcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtNb2RlPzogTmV0d29ya01vZGU7XG5cbiAgLyoqXG4gICAqIFN1Ym5ldCBzZWxlY3Rpb24gZm9yIFZQQyBuZXR3b3JrIG1vZGUuXG4gICAqXG4gICAqIFNlbGVjdHMgd2hpY2ggc3VibmV0cyB0aGUgQWdlbnRDb3JlIFJ1bnRpbWUgRU5JcyBhcmUgcGxhY2VkIGluLlxuICAgKiBSZXF1aXJlcyBhIFZQQyB0byBiZSBwcm92aWRlZCB2aWEgYEFnZW50SG9zdGluZ0NvbmZpZy5uZXR3b3JrYFxuICAgKiAoc2V0IGF1dG9tYXRpY2FsbHkgYnkgYEludGVyYWN0aXZlQWdlbnRgIHdoZW4gYG5ldHdvcmtgIGlzIHByb3ZpZGVkKVxuICAgKiBzbyB0aGF0IHN1Ym5ldHMgY2FuIGJlIHJlc29sdmVkLlxuICAgKlxuICAgKiBCZXN0IHByYWN0aWNlIGlzIHRvIHNlbGVjdCBwcml2YXRlIHN1Ym5ldHMgd2l0aCBhIE5BVCBHYXRld2F5XG4gICAqIGluIGF0IGxlYXN0IDIgQXZhaWxhYmlsaXR5IFpvbmVzLiBNYXhpbXVtIDE2IHN1Ym5ldHMuXG4gICAqXG4gICAqIFdoZW4gYm90aCBgdnBjU3VibmV0c2AgYW5kIGBBZ2VudEhvc3RpbmdDb25maWcubmV0d29ya2AgYXJlIHByb3ZpZGVkLFxuICAgKiBgdnBjU3VibmV0c2AgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBuZXR3b3JrJ3MgZGVmYXVsdCBhcHBsaWNhdGlvbiBzdWJuZXRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIERlcml2ZWQgZnJvbSBBZ2VudEhvc3RpbmdDb25maWcubmV0d29yay5hcHBsaWNhdGlvblN1Ym5ldFNlbGVjdGlvbigpIGlmIGF2YWlsYWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgdnBjU3VibmV0cz86IFN1Ym5ldFNlbGVjdGlvbjtcblxuICAvKipcbiAgICogU2VjdXJpdHkgZ3JvdXBzIGZvciBWUEMgbmV0d29yayBtb2RlLlxuICAgKlxuICAgKiBBdHRhY2hlZCB0byB0aGUgQWdlbnRDb3JlIFJ1bnRpbWUgRU5Jcy4gTWF4aW11bSAxNiBzZWN1cml0eSBncm91cHMuXG4gICAqXG4gICAqIFdoZW4gYm90aCBgc2VjdXJpdHlHcm91cHNgIGFuZCBgQWdlbnRIb3N0aW5nQ29uZmlnLm5ldHdvcmtgIGFyZSBwcm92aWRlZCxcbiAgICogYHNlY3VyaXR5R3JvdXBzYCB0YWtlcyBwcmVjZWRlbmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEEgbmV3IHNlY3VyaXR5IGdyb3VwIGFsbG93aW5nIGFsbCBvdXRib3VuZCB0cmFmZmljIGlzIGNyZWF0ZWRcbiAgICogZnJvbSBBZ2VudEhvc3RpbmdDb25maWcubmV0d29yayBpZiBhdmFpbGFibGVcbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBzPzogSVNlY3VyaXR5R3JvdXBbXTtcblxuICAvKipcbiAgICogQ3VzdG9tIEpXVCBhdXRob3JpemVyIGNvbmZpZ3VyYXRpb24uXG4gICAqIE9taXQgZm9yIElBTS1vbmx5IGF1dGguXG4gICAqL1xuICByZWFkb25seSBjdXN0b21Kd3RBdXRob3JpemVyPzogQWdlbnRDb3JlSnd0QXV0aG9yaXplckNvbmZpZztcblxuICAvKipcbiAgICogUHJvdG9jb2wgY29uZmlndXJhdGlvbjogJ0hUVFAnIHwgJ01DUCcgfCAnQTJBJy5cbiAgICpcbiAgICogQGRlZmF1bHQgJ0hUVFAnXG4gICAqL1xuICByZWFkb25seSBwcm90b2NvbENvbmZpZ3VyYXRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJ1bnRpbWUgZW5kcG9pbnQgbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgQXV0by1nZW5lcmF0ZWQgZnJvbSBhZ2VudCBuYW1lXG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludE5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQWdlbnRDb3JlIFJ1bnRpbWUgaG9zdGluZyBhZGFwdGVyIGZvciBJbnRlcmFjdGl2ZUFnZW50LlxuICpcbiAqIERlcGxveXMgdGhlIGFnZW50IGFzIGEgY29udGFpbmVyIHJ1bm5pbmcgb24gQWdlbnRDb3JlIFJ1bnRpbWUgKG1pY3JvVk0pLlxuICogVXNlcyBMMSBjb25zdHJ1Y3RzIGBDZm5SdW50aW1lYCBhbmQgYENmblJ1bnRpbWVFbmRwb2ludGAgZnJvbVxuICogYGF3cy1jZGstbGliL2F3cy1iZWRyb2NrYWdlbnRjb3JlYC5cbiAqXG4gKiAjIyBBcmNoaXRlY3R1cmVcbiAqXG4gKiBgYGBcbiAqIENsaWVudCDihpIgQWdlbnRDb3JlIFJ1bnRpbWUgRW5kcG9pbnQg4oaSIENvbnRhaW5lciAoRmFzdEFQSSBvbiBwb3J0IDgwODApIOKGkiBCZWRyb2NrXG4gKiBgYGBcbiAqXG4gKiAjIyBGZWF0dXJlc1xuICpcbiAqIC0gKipTZXNzaW9uIElzb2xhdGlvbioqOiBtaWNyb1ZNIHByb3ZpZGVzIHBlci1zZXNzaW9uIGlzb2xhdGlvbiAobm8gUzMgc2Vzc2lvbiBidWNrZXQgbmVlZGVkKVxuICogLSAqKk1hbmFnZWQgSW5mcmFzdHJ1Y3R1cmUqKjogTm8gTGFtYmRhIGNvbGQgc3RhcnRzIG9yIHRpbWVvdXQgbGltaXRzXG4gKiAtICoqTXVsdGlwbGUgUHJvdG9jb2xzKio6IEhUVFAsIE1DUCwgb3IgQTJBIHByb3RvY29sIHN1cHBvcnRcbiAqIC0gKipDb250YWluZXItQmFzZWQqKjogU3RhbmRhcmQgRG9ja2VyIGltYWdlIGRlcGxveW1lbnRcbiAqIC0gKipWUEMgU3VwcG9ydCoqOiBSdW4gaW5zaWRlIGEgVlBDIHdpdGggcHJpdmF0ZSBzdWJuZXRzIGZvciBuZXR3b3JrIGlzb2xhdGlvblxuICpcbiAqICMjIFVzYWdlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbiAqIGltcG9ydCB7IEludGVyYWN0aXZlQWdlbnQsIEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlciwgTmV0d29ya01vZGUgfSBmcm9tICdAY2RrbGFicy9jZGstYXBwbW9kLWNhdGFsb2ctYmx1ZXByaW50cyc7XG4gKlxuICogZGVjbGFyZSBjb25zdCBteVByb21wdDogQXNzZXQ7XG4gKlxuICogbmV3IEludGVyYWN0aXZlQWdlbnQodGhpcywgJ0FnZW50Jywge1xuICogICBhZ2VudE5hbWU6ICdNeUNoYXRib3QnLFxuICogICBhZ2VudERlZmluaXRpb246IHsgYmVkcm9ja01vZGVsOiB7fSwgc3lzdGVtUHJvbXB0OiBteVByb21wdCB9LFxuICogICBob3N0aW5nQWRhcHRlcjogbmV3IEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlcih7XG4gKiAgICAgbmV0d29ya01vZGU6IE5ldHdvcmtNb2RlLlBVQkxJQyxcbiAqICAgfSksXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyIGltcGxlbWVudHMgSUhvc3RpbmdBZGFwdGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyUHJvcHM7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlclByb3BzID0ge30pIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIH1cblxuICBnZXQgc2VydmljZVByaW5jaXBhbCgpIHsgcmV0dXJuIG5ldyBTZXJ2aWNlUHJpbmNpcGFsKCdiZWRyb2NrLWFnZW50Y29yZS5hbWF6b25hd3MuY29tJyk7IH1cblxuICAvKipcbiAgICogRGVwbG95IEFnZW50Q29yZSBSdW50aW1lIGhvc3RpbmcgaW5mcmFzdHJ1Y3R1cmUuXG4gICAqL1xuICBkZXBsb3koY29uZmlnOiBBZ2VudEhvc3RpbmdDb25maWcpOiBBZ2VudEhvc3RpbmdSZXN1bHQge1xuICAgIGNvbnN0IHNjb3BlID0gY29uZmlnLnNjb3BlO1xuICAgIGNvbnN0IG5ldHdvcmtNb2RlID0gdGhpcy5wcm9wcy5uZXR3b3JrTW9kZSB8fCBOZXR3b3JrTW9kZS5QVUJMSUM7XG5cbiAgICAvLyBSZXNvbHZlIFZQQyBjb25maWd1cmF0aW9uIGZvciBWUEMgbmV0d29yayBtb2RlXG4gICAgbGV0IHJlc29sdmVkU3VibmV0SWRzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVzb2x2ZWRTZWN1cml0eUdyb3VwSWRzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChuZXR3b3JrTW9kZSA9PT0gTmV0d29ya01vZGUuVlBDKSB7XG4gICAgICAvLyBFeHBsaWNpdCBwcm9wcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBOZXR3b3JrIGNvbnN0cnVjdFxuICAgICAgaWYgKHRoaXMucHJvcHMudnBjU3VibmV0cyAmJiBjb25maWcubmV0d29yaykge1xuICAgICAgICByZXNvbHZlZFN1Ym5ldElkcyA9IGNvbmZpZy5uZXR3b3JrLnZwYy5zZWxlY3RTdWJuZXRzKHRoaXMucHJvcHMudnBjU3VibmV0cykuc3VibmV0SWRzO1xuICAgICAgfSBlbHNlIGlmIChjb25maWcubmV0d29yaykge1xuICAgICAgICBjb25zdCBzdWJuZXRzID0gY29uZmlnLm5ldHdvcmsudnBjLnNlbGVjdFN1Ym5ldHMoXG4gICAgICAgICAgY29uZmlnLm5ldHdvcmsuYXBwbGljYXRpb25TdWJuZXRTZWxlY3Rpb24oKSxcbiAgICAgICAgKS5zdWJuZXRJZHM7XG4gICAgICAgIHJlc29sdmVkU3VibmV0SWRzID0gc3VibmV0cztcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucHJvcHMuc2VjdXJpdHlHcm91cHMpIHtcbiAgICAgICAgcmVzb2x2ZWRTZWN1cml0eUdyb3VwSWRzID0gdGhpcy5wcm9wcy5zZWN1cml0eUdyb3Vwcy5tYXAoc2cgPT4gc2cuc2VjdXJpdHlHcm91cElkKTtcbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnLm5ldHdvcmspIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgc2VjdXJpdHkgZ3JvdXAgZm9yIHRoZSBBZ2VudENvcmUgcnVudGltZSBFTklzXG4gICAgICAgIGNvbnN0IHNnID0gbmV3IFNlY3VyaXR5R3JvdXAoc2NvcGUsICdBZ2VudENvcmVSdW50aW1lU0cnLCB7XG4gICAgICAgICAgdnBjOiBjb25maWcubmV0d29yay52cGMsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdTZWN1cml0eSBncm91cCBmb3IgQWdlbnRDb3JlIFJ1bnRpbWUgRU5JcycsXG4gICAgICAgICAgYWxsb3dBbGxPdXRib3VuZDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc29sdmVkU2VjdXJpdHlHcm91cElkcyA9IFtzZy5zZWN1cml0eUdyb3VwSWRdO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJlc29sdmVkU3VibmV0SWRzIHx8IHJlc29sdmVkU3VibmV0SWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1ZQQyBuZXR3b3JrIG1vZGUgcmVxdWlyZXMgc3VibmV0cyB0byBiZSBwcm92aWRlZCBlaXRoZXIgdmlhICcgK1xuICAgICAgICAgICdBZ2VudENvcmVSdW50aW1lSG9zdGluZ0FkYXB0ZXJQcm9wcy52cGNTdWJuZXRzICh3aXRoIGEgTmV0d29yayBjb25zdHJ1Y3QpICcgK1xuICAgICAgICAgICdvciB2aWEgYSBOZXR3b3JrIGNvbnN0cnVjdCBpbiBBZ2VudEhvc3RpbmdDb25maWcubmV0d29yay4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCFyZXNvbHZlZFNlY3VyaXR5R3JvdXBJZHMgfHwgcmVzb2x2ZWRTZWN1cml0eUdyb3VwSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1ZQQyBuZXR3b3JrIG1vZGUgcmVxdWlyZXMgc2VjdXJpdHkgZ3JvdXBzIHRvIGJlIHByb3ZpZGVkIGVpdGhlciB2aWEgJyArXG4gICAgICAgICAgJ0FnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlclByb3BzLnNlY3VyaXR5R3JvdXBzIG9yIHZpYSBhIE5ldHdvcmsgY29uc3RydWN0ICcgK1xuICAgICAgICAgICdpbiBBZ2VudEhvc3RpbmdDb25maWcubmV0d29yay4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJ1aWxkIG9yIHJlZmVyZW5jZSBjb250YWluZXIgaW1hZ2VcbiAgICBsZXQgY29udGFpbmVyVXJpOiBzdHJpbmc7XG4gICAgaWYgKHRoaXMucHJvcHMuY29udGFpbmVySW1hZ2VVcmkpIHtcbiAgICAgIGNvbnRhaW5lclVyaSA9IHRoaXMucHJvcHMuY29udGFpbmVySW1hZ2VVcmk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhhbmRsZXJQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ3Jlc291cmNlcy9hZ2VudGNvcmUtYWdlbnQtaGFuZGxlcicpO1xuICAgICAgY29uc3QgaW1hZ2VBc3NldCA9IG5ldyBEb2NrZXJJbWFnZUFzc2V0KHNjb3BlLCAnQWdlbnRDb3JlSGFuZGxlckltYWdlJywge1xuICAgICAgICBkaXJlY3Rvcnk6IGhhbmRsZXJQYXRoLFxuICAgICAgfSk7XG4gICAgICBjb250YWluZXJVcmkgPSBpbWFnZUFzc2V0LmltYWdlVXJpO1xuICAgIH1cblxuICAgIC8vIFJldXNlIHRoZSBzaW5nbGUgYWdlbnRSb2xlIChhbHJlYWR5IGhhcyBiZWRyb2NrLWFnZW50Y29yZSB0cnVzdCBmcm9tIEJhc2VBZ2VudCkuXG4gICAgLy8gT25seSBhZGQgRUNSIHB1bGwgcGVybWlzc2lvbnMg4oCUIGFsbCBvdGhlciBwZXJtaXNzaW9ucyAoQmVkcm9jayBJbnZva2VNb2RlbCxcbiAgICAvLyBTMyB0b29sIGFzc2V0cywgS0IgYWNjZXNzLCBzZXNzaW9uIGJ1Y2tldCwgb2JzZXJ2YWJpbGl0eSkgYXJlIGFscmVhZHkgZ3JhbnRlZFxuICAgIC8vIGJ5IEJhc2VBZ2VudCBvbiBjb25maWcuYWdlbnRSb2xlLlxuICAgIGNvbnN0IGVjclBvbGljeVJlc3VsdCA9IGNvbmZpZy5hZ2VudFJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgJ2VjcjpHZXREb3dubG9hZFVybEZvckxheWVyJyxcbiAgICAgICAgJ2VjcjpCYXRjaEdldEltYWdlJyxcbiAgICAgICAgJ2VjcjpHZXRBdXRob3JpemF0aW9uVG9rZW4nLFxuICAgICAgXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSkpO1xuXG4gICAgLy8gQWRkIEFET1Qgb2JzZXJ2YWJpbGl0eSBwZXJtaXNzaW9ucyB3aGVuIGVuYWJsZWQuXG4gICAgLy8gVGhlIGNvbnRhaW5lciBEb2NrZXJmaWxlIHVzZXMgYG9wZW50ZWxlbWV0cnktaW5zdHJ1bWVudGAgYXMgaXRzIENNRCB3cmFwcGVyO1xuICAgIC8vIEFET1QgbmVlZHMgdGhlc2UgcGVybWlzc2lvbnMgdG8gZXhwb3J0IHRyYWNlcywgbG9ncywgYW5kIG1ldHJpY3MgZnJvbSB0aGUgY29udGFpbmVyLlxuICAgIC8vIE5vdGU6IFdlIHVzZSBleHBsaWNpdCBzdGF0ZW1lbnRzIGluc3RlYWQgb2YgQ2xvdWRXYXRjaExhbWJkYUFwcGxpY2F0aW9uU2lnbmFsc0V4ZWN1dGlvblJvbGVQb2xpY3lcbiAgICAvLyBiZWNhdXNlIHRoYXQgbWFuYWdlZCBwb2xpY3kgb25seSBjb3ZlcnMgL2F3cy9hcHBsaWNhdGlvbi1zaWduYWxzL2RhdGEgbG9nIGdyb3VwXG4gICAgLy8gYW5kIG1pc3NlcyBwZXJtaXNzaW9ucyBBRE9UIG5lZWRzIChEZXNjcmliZUxvZ0dyb3VwcywgRGVzY3JpYmVMb2dTdHJlYW1zLCBQdXRNZXRyaWNEYXRhKS5cbiAgICBpZiAoY29uZmlnLmVuYWJsZU9ic2VydmFiaWxpdHkpIHtcbiAgICAgIGNvbmZpZy5hZ2VudFJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2xvZ3M6RGVzY3JpYmVMb2dHcm91cHMnLFxuICAgICAgICAgICdsb2dzOkRlc2NyaWJlTG9nU3RyZWFtcycsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICB9KSk7XG4gICAgICBjb25maWcuYWdlbnRSb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdjbG91ZHdhdGNoOlB1dE1ldHJpY0RhdGEnLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGNvbnRhaW5lclxuICAgIGNvbnN0IHsgcmVnaW9uLCBhY2NvdW50IH0gPSBTdGFjay5vZihzY29wZSk7XG4gICAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIC8vIFVubGlrZSBMYW1iZGEsIEFnZW50Q29yZSBjb250YWluZXJzIGRvbid0IGdldCBBV1NfUkVHSU9OIGF1dG9tYXRpY2FsbHkuXG4gICAgICAvLyBib3RvMyBhbmQgb3RoZXIgQVdTIFNES3MgbmVlZCBpdCB0byBtYWtlIEFQSSBjYWxscy5cbiAgICAgIEFXU19SRUdJT046IHJlZ2lvbixcbiAgICAgIEFXU19ERUZBVUxUX1JFR0lPTjogcmVnaW9uLFxuICAgIH07XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmVudmlyb25tZW50KSkge1xuICAgICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gTm90ZTogQUdFTlRfT0JTRVJWQUJJTElUWV9FTkFCTEVEIGFuZCBPVEVMXyogZW52IHZhcnMgYXJlIE5PVCBzZXQgaGVyZS5cbiAgICAvLyBGb3IgQWdlbnRDb3JlLWhvc3RlZCBhZ2VudHMsIHRoZSBBRE9UIGF1dG8taW5zdHJ1bWVudGF0aW9uIHZpYVxuICAgIC8vIGBvcGVudGVsZW1ldHJ5LWluc3RydW1lbnRgIGluIHRoZSBEb2NrZXJmaWxlIENNRCBoYW5kbGVzIHRyYWNlL3NwYW5cbiAgICAvLyBleHBvcnQgYXV0b21hdGljYWxseS4gVGhlc2UgZW52IHZhcnMgYXJlIG9ubHkgbmVlZGVkIGZvciBhZ2VudHNcbiAgICAvLyBob3N0ZWQgb3V0c2lkZSBvZiBBZ2VudENvcmUuXG5cbiAgICAvLyBCdWlsZCBuZXR3b3JrIGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBuZXR3b3JrQ29uZmlndXJhdGlvbjogYW55ID0ge1xuICAgICAgbmV0d29ya01vZGUsXG4gICAgfTtcblxuICAgIC8vIEJ1aWxkIGF1dGhvcml6YXRpb24gY29uZmlndXJhdGlvbiBpZiBKV1QgYXV0aG9yaXplciBpcyBzcGVjaWZpZWRcbiAgICBjb25zdCBhdXRoQ29uZmlnID0gdGhpcy5wcm9wcy5jdXN0b21Kd3RBdXRob3JpemVyID8ge1xuICAgICAgY3VzdG9tSnd0QXV0aG9yaXplcjoge1xuICAgICAgICBkaXNjb3ZlcnlVcmw6IHRoaXMucHJvcHMuY3VzdG9tSnd0QXV0aG9yaXplci5kaXNjb3ZlcnlVcmwsXG4gICAgICAgIGFsbG93ZWRBdWRpZW5jZTogdGhpcy5wcm9wcy5jdXN0b21Kd3RBdXRob3JpemVyLmFsbG93ZWRBdWRpZW5jZSxcbiAgICAgICAgYWxsb3dlZENsaWVudHM6IHRoaXMucHJvcHMuY3VzdG9tSnd0QXV0aG9yaXplci5hbGxvd2VkQ2xpZW50cyxcbiAgICAgIH0sXG4gICAgfSA6IHVuZGVmaW5lZDtcblxuICAgIC8vIENyZWF0ZSBDZm5SdW50aW1lXG4gICAgY29uc3QgcnVudGltZSA9IG5ldyBDZm5SdW50aW1lKHNjb3BlLCAnQWdlbnRDb3JlUnVudGltZScsIHtcbiAgICAgIGFnZW50UnVudGltZU5hbWU6IGAke2NvbmZpZy5hZ2VudE5hbWUucmVwbGFjZSgvLS9nLCAnXycpfV9ydW50aW1lYCxcbiAgICAgIGFnZW50UnVudGltZUFydGlmYWN0OiB7XG4gICAgICAgIGNvbnRhaW5lckNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBjb250YWluZXJVcmksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcm9sZUFybjogY29uZmlnLmFnZW50Um9sZS5yb2xlQXJuLFxuICAgICAgbmV0d29ya0NvbmZpZ3VyYXRpb24sXG4gICAgICBhdXRob3JpemVyQ29uZmlndXJhdGlvbjogYXV0aENvbmZpZyxcbiAgICAgIGVudmlyb25tZW50VmFyaWFibGVzOiBlbnZWYXJzLFxuICAgIH0pO1xuXG4gICAgcnVudGltZS5hcHBseVJlbW92YWxQb2xpY3koY29uZmlnLnJlbW92YWxQb2xpY3kgfHwgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcblxuICAgIC8vIFdoZW4gSldUIGF1dGggaXMgY29uZmlndXJlZCwgYWxsb3dsaXN0IHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBzbyB0aGVcbiAgICAvLyBjb250YWluZXIgY2FuIGV4dHJhY3QgdXNlciBpZGVudGl0eSBjbGFpbXMgZnJvbSB0aGUgZm9yd2FyZGVkIEpXVCB0b2tlbi5cbiAgICAvLyBTZWU6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9iZWRyb2NrLWFnZW50Y29yZS9sYXRlc3QvZGV2Z3VpZGUvcnVudGltZS1vYXV0aC5odG1sI29hdXRoLXByb3BhZ2F0ZS1qd3QtdG9rZW5cbiAgICBpZiAodGhpcy5wcm9wcy5jdXN0b21Kd3RBdXRob3JpemVyKSB7XG4gICAgICBydW50aW1lLmFkZFByb3BlcnR5T3ZlcnJpZGUoJ1JlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uJywge1xuICAgICAgICBSZXF1ZXN0SGVhZGVyQWxsb3dsaXN0OiBbJ0F1dGhvcml6YXRpb24nXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFdoZW4gVlBDIG1vZGUgaXMgY29uZmlndXJlZCwgc2V0IHRoZSBOZXR3b3JrTW9kZUNvbmZpZyB3aXRoIHN1Ym5ldHMgYW5kXG4gICAgLy8gc2VjdXJpdHkgZ3JvdXBzIHZpYSBwcm9wZXJ0eSBvdmVycmlkZS4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBDREsgMi4yMTguMFxuICAgIC8vIGRvZXMgbm90IHlldCBoYXZlIHR5cGVkIHN1cHBvcnQgZm9yIE5ldHdvcmtNb2RlQ29uZmlnIChhZGRlZCBpbiAyLjI0MC4wKS5cbiAgICAvLyBTZWU6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9iZWRyb2NrLWFnZW50Y29yZS9sYXRlc3QvZGV2Z3VpZGUvYWdlbnRjb3JlLXZwYy5odG1sXG4gICAgaWYgKG5ldHdvcmtNb2RlID09PSBOZXR3b3JrTW9kZS5WUEMgJiYgcmVzb2x2ZWRTdWJuZXRJZHMgJiYgcmVzb2x2ZWRTZWN1cml0eUdyb3VwSWRzKSB7XG4gICAgICBydW50aW1lLmFkZFByb3BlcnR5T3ZlcnJpZGUoJ05ldHdvcmtDb25maWd1cmF0aW9uLk5ldHdvcmtNb2RlQ29uZmlnJywge1xuICAgICAgICBTdWJuZXRzOiByZXNvbHZlZFN1Ym5ldElkcyxcbiAgICAgICAgU2VjdXJpdHlHcm91cHM6IHJlc29sdmVkU2VjdXJpdHlHcm91cElkcyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBDZm5SdW50aW1lIHdhaXRzIGZvciB0aGUgcm9sZSBhbmQgaXRzIHBvbGljaWVzIHRvIGJlIGZ1bGx5IGNyZWF0ZWQvdXBkYXRlZC5cbiAgICAvLyBXaXRob3V0IHRoaXMsIENsb3VkRm9ybWF0aW9uIG1heSB2YWxpZGF0ZSB0aGUgcm9sZSBiZWZvcmU6XG4gICAgLy8gLSBUaGUgdHJ1c3QgcG9saWN5IGlzIHVwZGF0ZWQgdG8gYmVkcm9jay1hZ2VudGNvcmUuYW1hem9uYXdzLmNvbSAoZHVyaW5nIHN0YWNrIHVwZGF0ZXMpXG4gICAgLy8gLSBUaGUgRUNSIHBlcm1pc3Npb25zIHBvbGljeSBpcyBhdHRhY2hlZFxuICAgIHJ1bnRpbWUubm9kZS5hZGREZXBlbmRlbmN5KGNvbmZpZy5hZ2VudFJvbGUpO1xuICAgIGlmIChlY3JQb2xpY3lSZXN1bHQucG9saWN5RGVwZW5kYWJsZSkge1xuICAgICAgcnVudGltZS5ub2RlLmFkZERlcGVuZGVuY3koZWNyUG9saWN5UmVzdWx0LnBvbGljeURlcGVuZGFibGUpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBDZm5SdW50aW1lRW5kcG9pbnRcbiAgICBjb25zdCBlbmRwb2ludE5hbWUgPSB0aGlzLnByb3BzLmVuZHBvaW50TmFtZSB8fCBgJHtjb25maWcuYWdlbnROYW1lLnJlcGxhY2UoLy0vZywgJ18nKX1fZW5kcG9pbnRgO1xuICAgIGNvbnN0IHJ1bnRpbWVFbmRwb2ludCA9IG5ldyBDZm5SdW50aW1lRW5kcG9pbnQoc2NvcGUsICdBZ2VudENvcmVSdW50aW1lRW5kcG9pbnQnLCB7XG4gICAgICBhZ2VudFJ1bnRpbWVJZDogcnVudGltZS5yZWYsXG4gICAgICBhZ2VudFJ1bnRpbWVWZXJzaW9uOiBydW50aW1lLmF0dHJBZ2VudFJ1bnRpbWVWZXJzaW9uLFxuICAgICAgbmFtZTogZW5kcG9pbnROYW1lLFxuICAgICAgLi4uKHRoaXMucHJvcHMucHJvdG9jb2xDb25maWd1cmF0aW9uICYmIHtcbiAgICAgICAgcHJvdG9jb2xDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgc2VydmVyUHJvdG9jb2w6IHRoaXMucHJvcHMucHJvdG9jb2xDb25maWd1cmF0aW9uLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgfSk7XG4gICAgcnVudGltZUVuZHBvaW50LmFwcGx5UmVtb3ZhbFBvbGljeShjb25maWcucmVtb3ZhbFBvbGljeSB8fCBSZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuXG4gICAgLy8gQ29uc3RydWN0IHRoZSBmdWxsIGludm9jYXRpb24gVVJMIGZvciBkaXJlY3QgSFRUUFMgYWNjZXNzIChyZXF1aXJlZCBmb3IgSldUIGF1dGgpLlxuICAgIC8vIEZvcm1hdDogaHR0cHM6Ly9iZWRyb2NrLWFnZW50Y29yZS57cmVnaW9ufS5hbWF6b25hd3MuY29tL3J1bnRpbWVzL3tVUkwtZW5jb2RlZC1BUk59L2ludm9jYXRpb25zP3F1YWxpZmllcj17ZW5kcG9pbnROYW1lfVxuICAgIGNvbnN0IGVuY29kZWRBcm4gPSBGbi5qb2luKCcnLCBbXG4gICAgICAnYXJuJTNBYXdzJTNBYmVkcm9jay1hZ2VudGNvcmUlM0EnLFxuICAgICAgcmVnaW9uLFxuICAgICAgJyUzQScsXG4gICAgICBhY2NvdW50LFxuICAgICAgJyUzQXJ1bnRpbWUlMkYnLFxuICAgICAgcnVudGltZS5hdHRyQWdlbnRSdW50aW1lSWQsXG4gICAgXSk7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBGbi5qb2luKCcnLCBbXG4gICAgICAnaHR0cHM6Ly9iZWRyb2NrLWFnZW50Y29yZS4nLFxuICAgICAgcmVnaW9uLFxuICAgICAgJy5hbWF6b25hd3MuY29tL3J1bnRpbWVzLycsXG4gICAgICBlbmNvZGVkQXJuLFxuICAgICAgJy9pbnZvY2F0aW9ucz9xdWFsaWZpZXI9JyxcbiAgICAgIGVuZHBvaW50TmFtZSxcbiAgICBdKTtcblxuICAgIHJldHVybiB7IGVuZHBvaW50LCBjZm5SdW50aW1lOiBydW50aW1lIH07XG4gIH1cbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIEludGVyYWN0aXZlQWdlbnQuXG4gKlxuICogRXh0ZW5kcyBCYXNlQWdlbnRQcm9wcyB3aXRoIGNvbW11bmljYXRpb24sIHNlc3Npb24sIGNvbnRleHQsIGFuZCBhdXRoZW50aWNhdGlvblxuICogc3RyYXRlZ3kgaW50ZXJmYWNlcyBmb3IgYnVpbGRpbmcgcmVhbC10aW1lIGNvbnZlcnNhdGlvbmFsIEFJIGFnZW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlcmFjdGl2ZUFnZW50UHJvcHMgZXh0ZW5kcyBCYXNlQWdlbnRQcm9wcyB7XG4gIC8qKlxuICAgKiBIb3N0aW5nIGFkYXB0ZXIgZm9yIGRlcGxveWluZyB0aGUgYWdlbnQgcnVudGltZS5cbiAgICpcbiAgICogVXNlIGBMYW1iZGFIb3N0aW5nQWRhcHRlcmAgZm9yIExhbWJkYSArIEFQSSBHYXRld2F5IChkZWZhdWx0KSBvclxuICAgKiBgQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyYCBmb3IgQWdlbnRDb3JlIFJ1bnRpbWUgaG9zdGluZy5cbiAgICpcbiAgICogV2hlbiBwcm92aWRlZCwgYGNvbW11bmljYXRpb25BZGFwdGVyYCwgYGF1dGhlbnRpY2F0b3JgLCBgbWVtb3J5U2l6ZWAsXG4gICAqIGB0aW1lb3V0YCwgYGFyY2hpdGVjdHVyZWAsIGFuZCBgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9uc2AgcHJvcHNcbiAgICogYXJlIGlnbm9yZWQgKGNvbmZpZ3VyZSB0aGVtIG9uIHRoZSBhZGFwdGVyIGRpcmVjdGx5KS5cbiAgICpcbiAgICogQGRlZmF1bHQgTGFtYmRhSG9zdGluZ0FkYXB0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGhvc3RpbmdBZGFwdGVyPzogSUhvc3RpbmdBZGFwdGVyO1xuICAvKipcbiAgICogQ29tbXVuaWNhdGlvbiBhZGFwdGVyIGZvciBjbGllbnQtYWdlbnQgaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IFN0cmVhbWluZ0h0dHBBZGFwdGVyIHdpdGggQ29nbml0b0F1dGhlbnRpY2F0b3JcbiAgICovXG4gIHJlYWRvbmx5IGNvbW11bmljYXRpb25BZGFwdGVyPzogSUNvbW11bmljYXRpb25BZGFwdGVyO1xuXG4gIC8qKlxuICAgKiBTZXNzaW9uIHN0b3JlIGZvciBwZXJzaXN0aW5nIGNvbnZlcnNhdGlvbiBzdGF0ZS5cbiAgICogU2V0IHRvIHVuZGVmaW5lZCB0byBkaXNhYmxlIHNlc3Npb24gcGVyc2lzdGVuY2UgKHN0YXRlbGVzcyBtb2RlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgUzNTZXNzaW9uTWFuYWdlciB3aXRoIDI0LWhvdXIgVFRMXG4gICAqIEBkZXByZWNhdGVkIFNlc3Npb24gbWFuYWdlbWVudCBpcyBub3cgaGFuZGxlZCBieSBTdHJhbmRzLW5hdGl2ZSBgUzNTZXNzaW9uTWFuYWdlcmAuXG4gICAqIEFuIFMzIGJ1Y2tldCBpcyBhbHdheXMgY3JlYXRlZCBhbmQgcGFzc2VkIGFzIGBTRVNTSU9OX0JVQ0tFVGAgZW52IHZhci5cbiAgICovXG4gIHJlYWRvbmx5IHNlc3Npb25TdG9yZT86IElTZXNzaW9uU3RvcmU7XG5cbiAgLyoqXG4gICAqIFMzIGJ1Y2tldCBmb3Igc2Vzc2lvbiBzdG9yYWdlIChzaG9ydGhhbmQgZm9yIFMzU2Vzc2lvbk1hbmFnZXIpLlxuICAgKiBJZ25vcmVkIGlmIHNlc3Npb25TdG9yZSBpcyBwcm92aWRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgQXV0by1jcmVhdGVkIGJ1Y2tldFxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbkJ1Y2tldD86IElCdWNrZXQ7XG5cbiAgLyoqXG4gICAqIFRpbWUtdG8tbGl2ZSBmb3Igc2Vzc2lvbnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLmhvdXJzKDI0KVxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvblRUTD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBTZXNzaW9uIGluZGV4IGZvciBmYXN0IHVzZXIgdG8gc2Vzc2lvbiBsb29rdXBzLlxuICAgKiBQcm92aWRlcyBlZmZpY2llbnQgcXVlcnlpbmcgb2YgYSB1c2VyJ3Mgc2Vzc2lvbnMgZm9yIGxpc3RpbmcgYW5kIG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IER5bmFtb0RCU2Vzc2lvbkluZGV4IChhdXRvLWNyZWF0ZWQpXG4gICAqL1xuICByZWFkb25seSBzZXNzaW9uSW5kZXg/OiBJU2Vzc2lvbkluZGV4O1xuXG4gIC8qKlxuICAgKiBDb250ZXh0IHN0cmF0ZWd5IGZvciBjb252ZXJzYXRpb24gaGlzdG9yeSBtYW5hZ2VtZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlciB3aXRoIDIwIG1lc3NhZ2VzXG4gICAqIEBkZXByZWNhdGVkIENvbnZlcnNhdGlvbiBtYW5hZ2VtZW50IGlzIG5vdyBoYW5kbGVkIGJ5IFN0cmFuZHMtbmF0aXZlXG4gICAqIGBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlcmAgaW4gdGhlIFB5dGhvbiBoYW5kbGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dFN0cmF0ZWd5PzogSUNvbnRleHRTdHJhdGVneTtcblxuICAvKipcbiAgICogTWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgdG8ga2VlcCBpbiBjb252ZXJzYXRpb24gaGlzdG9yeS5cbiAgICogU2hvcnRoYW5kIGZvciBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlciB3aW5kb3dTaXplLlxuICAgKiBJZ25vcmVkIGlmIGNvbnRleHRTdHJhdGVneSBpcyBwcm92aWRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgMjBcbiAgICogQGRlcHJlY2F0ZWQgQ29udmVyc2F0aW9uIHdpbmRvd2luZyBpcyBub3cgaGFuZGxlZCBieSBTdHJhbmRzLW5hdGl2ZVxuICAgKiBgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXJgIGluIHRoZSBQeXRob24gaGFuZGxlciAoZGVmYXVsdDogMjApLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZUhpc3RvcnlMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogQXV0aGVudGljYXRvciBmb3Igc2VjdXJpbmcgQVBJIGVuZHBvaW50cy5cbiAgICpcbiAgICogQGRlZmF1bHQgQ29nbml0b0F1dGhlbnRpY2F0b3JcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhlbnRpY2F0b3I/OiBJQXV0aGVudGljYXRvcjtcblxuICAvKipcbiAgICogSFRUUCBtZXRob2RzIHRvIGFsbG93IGluIENPUlMgcHJlZmxpZ2h0IHJlc3BvbnNlcy5cbiAgICogVXNlIHRoaXMgdG8gZW5hYmxlIGFkZGl0aW9uYWwgbWV0aG9kcyAoR0VULCBERUxFVEUsIFBVVCkgZm9yIGN1c3RvbSByb3V0ZXNcbiAgICogYWRkZWQgdG8gdGhlIFJFU1QgQVBJLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbJ1BPU1QnLCAnT1BUSU9OUyddXG4gICAqL1xuICByZWFkb25seSBjb3JzQWxsb3dNZXRob2RzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIExhbWJkYSBmdW5jdGlvbiBtZW1vcnkgc2l6ZSBpbiBNQi5cbiAgICpcbiAgICogQGRlZmF1bHQgMTAyNFxuICAgKi9cbiAgcmVhZG9ubHkgbWVtb3J5U2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogTGFtYmRhIGZ1bmN0aW9uIHRpbWVvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLm1pbnV0ZXMoMTUpXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIExhbWJkYSBmdW5jdGlvbiBhcmNoaXRlY3R1cmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IEFyY2hpdGVjdHVyZS5YODZfNjRcbiAgICovXG4gIHJlYWRvbmx5IGFyY2hpdGVjdHVyZT86IEFyY2hpdGVjdHVyZTtcblxuICAvKipcbiAgICogUmVzZXJ2ZWQgY29uY3VycmVudCBleGVjdXRpb25zIGZvciB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBObyByZXNlcnZlZCBjb25jdXJyZW5jeVxuICAgKi9cbiAgcmVhZG9ubHkgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBJbnRlcmFjdGl2ZSBBZ2VudCBmb3IgcmVhbC10aW1lIGNvbnZlcnNhdGlvbmFsIEFJIHdpdGggU1NFIHN0cmVhbWluZy5cbiAqXG4gKiBDcmVhdGVzIGEgY29tcGxldGUgc2VydmVybGVzcyBpbmZyYXN0cnVjdHVyZSBmb3IgaW50ZXJhY3RpdmUgQUkgY29udmVyc2F0aW9uc1xuICogdXNpbmcgQVBJIEdhdGV3YXkgUkVTVCBBUEkgd2l0aCByZXNwb25zZSBzdHJlYW1pbmcsIExhbWJkYSBXZWIgQWRhcHRlcixcbiAqIEZhc3RBUEksIGFuZCBzdGFuZGFyZCBTdHJhbmRzIEFnZW50LlxuICpcbiAqICMjIEFyY2hpdGVjdHVyZVxuICpcbiAqIGBgYFxuICogQ2xpZW50IChmZXRjaCArIFJlYWRhYmxlU3RyZWFtKVxuICogICAgIOKGkyBQT1NUIC9jaGF0IChBdXRob3JpemF0aW9uOiBCZWFyZXIgSldUKVxuICogQVBJIEdhdGV3YXkgUkVTVCBBUEkgKHJlc3BvbnNlVHJhbnNmZXJNb2RlOiBTVFJFQU0pXG4gKiAgICAg4oaTIEludm9rZVdpdGhSZXNwb25zZVN0cmVhbVxuICogTGFtYmRhIChQeXRob24gKyBMYW1iZGEgV2ViIEFkYXB0ZXIgKyBGYXN0QVBJKVxuICogICAgIOKGkyBzdHJhbmRzLkFnZW50IHN0cmVhbWluZ1xuICogQW1hem9uIEJlZHJvY2sgKENsYXVkZSlcbiAqIGBgYFxuICpcbiAqICMjIEZlYXR1cmVzXG4gKlxuICogLSAqKlNTRSBTdHJlYW1pbmcqKjogUmVhbC10aW1lIHRva2VuLWJ5LXRva2VuIHJlc3BvbnNlIHN0cmVhbWluZ1xuICogLSAqKjE1LU1pbnV0ZSBUaW1lb3V0Kio6IEV4dGVuZGVkIHRpbWVvdXQgZm9yIGxvbmcgY29udmVyc2F0aW9uc1xuICogLSAqKlNlc3Npb24gTWFuYWdlbWVudCoqOiBTMy1iYXNlZCBjb252ZXJzYXRpb24gcGVyc2lzdGVuY2VcbiAqIC0gKipDb250ZXh0IFdpbmRvd2luZyoqOiBTbGlkaW5nIHdpbmRvdyBjb252ZXJzYXRpb24gaGlzdG9yeVxuICogLSAqKkNvZ25pdG8gQXV0aCoqOiBOYXRpdmUgSldUIHZhbGlkYXRpb24gb24gUkVTVCBBUElcbiAqIC0gKipTdHJhdGVneSBJbnRlcmZhY2VzKio6IFBsdWdnYWJsZSBhZGFwdGVycyBmb3IgYWxsIGNvbXBvbmVudHNcbiAqIC0gKipPYnNlcnZhYmlsaXR5Kio6IExhbWJkYSBQb3dlcnRvb2xzIGludGVncmF0aW9uXG4gKlxuICogIyMgVXNhZ2VcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBBc3NldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1hc3NldHMnO1xuICogaW1wb3J0IHsgSW50ZXJhY3RpdmVBZ2VudCB9IGZyb20gJ0BjZGtsYWJzL2Nkay1hcHBtb2QtY2F0YWxvZy1ibHVlcHJpbnRzJztcbiAqXG4gKiBjb25zdCBzeXN0ZW1Qcm9tcHQgPSBuZXcgQXNzZXQodGhpcywgJ1Byb21wdCcsIHsgcGF0aDogJy4vcHJvbXB0LnR4dCcgfSk7XG4gKlxuICogY29uc3QgYWdlbnQgPSBuZXcgSW50ZXJhY3RpdmVBZ2VudCh0aGlzLCAnQ2hhdEFnZW50Jywge1xuICogICBhZ2VudE5hbWU6ICdNeUNoYXRib3QnLFxuICogICBhZ2VudERlZmluaXRpb246IHtcbiAqICAgICBiZWRyb2NrTW9kZWw6IHsgdXNlQ3Jvc3NSZWdpb25JbmZlcmVuY2U6IHRydWUgfSxcbiAqICAgICBzeXN0ZW1Qcm9tcHQ6IHN5c3RlbVByb21wdCxcbiAqICAgfSxcbiAqIH0pO1xuICpcbiAqIC8vIEFjY2VzcyBvdXRwdXRzXG4gKiBhZ2VudC5hcGlFbmRwb2ludDsgICAgICAgLy8gUkVTVCBBUEkgZW5kcG9pbnQgVVJMXG4gKiBhZ2VudC5zZXNzaW9uQnVja2V0OyAgICAgLy8gUzMgc2Vzc2lvbiBidWNrZXRcbiAqIGFnZW50LmF1dGhlbnRpY2F0b3I7ICAgICAvLyBDb2duaXRvIGF1dGhlbnRpY2F0b3IgKGZvciBVc2VyIFBvb2wgaW5mbylcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJhY3RpdmVBZ2VudCBleHRlbmRzIEJhc2VBZ2VudCB7XG4gIHB1YmxpYyByZWFkb25seSBhZ2VudEZ1bmN0aW9uPzogSUZ1bmN0aW9uO1xuICBwdWJsaWMgcmVhZG9ubHkgYWRhcHRlcj86IElDb21tdW5pY2F0aW9uQWRhcHRlcjtcbiAgcHVibGljIHJlYWRvbmx5IHNlc3Npb25TdG9yZT86IElTZXNzaW9uU3RvcmU7XG4gIHB1YmxpYyByZWFkb25seSBjb250ZXh0U3RyYXRlZ3k/OiBJQ29udGV4dFN0cmF0ZWd5O1xuICBwdWJsaWMgcmVhZG9ubHkgYXV0aGVudGljYXRvcj86IElBdXRoZW50aWNhdG9yO1xuICBwdWJsaWMgcmVhZG9ubHkgYXBpRW5kcG9pbnQ6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHNlc3Npb25CdWNrZXQ/OiBJQnVja2V0O1xuICBwdWJsaWMgcmVhZG9ubHkgY2ZuUnVudGltZT86IENmblJ1bnRpbWU7XG4gIC8qKlxuICAgKiBUaGUgc2Vzc2lvbiBpbmRleCBmb3IgZmFzdCB1c2VyIHRvIHNlc3Npb24gbG9va3Vwcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzZXNzaW9uSW5kZXg/OiBJU2Vzc2lvbkluZGV4O1xuICAvKipcbiAgICogVGhlIFJFU1QgQVBJIEdhdGV3YXkgKG9ubHkgYXZhaWxhYmxlIHdoZW4gdXNpbmcgTGFtYmRhSG9zdGluZ0FkYXB0ZXIgd2l0aCBTdHJlYW1pbmdIdHRwQWRhcHRlcikuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzdEFwaT86IFJlc3RBcGk7XG4gIC8qKlxuICAgKiBUaGUgQ29nbml0byBVc2VyIFBvb2xzIGF1dGhvcml6ZXIgKG9ubHkgYXZhaWxhYmxlIHdoZW4gdXNpbmcgTGFtYmRhSG9zdGluZ0FkYXB0ZXIgd2l0aCBDb2duaXRvQXV0aGVudGljYXRvcikuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29nbml0b0F1dGhvcml6ZXI/OiBDb2duaXRvVXNlclBvb2xzQXV0aG9yaXplcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSW50ZXJhY3RpdmVBZ2VudFByb3BzKSB7XG4gICAgLy8gRGV0ZXJtaW5lIGhvc3RpbmcgYWRhcHRlciBCRUZPUkUgc3VwZXIoKSBzbyB3ZSBjYW4gcGFzcyBpdHMgdHJ1c3QgcHJpbmNpcGFsXG4gICAgY29uc3QgaG9zdGluZ0FkYXB0ZXIgPSBwcm9wcy5ob3N0aW5nQWRhcHRlciB8fCBuZXcgTGFtYmRhSG9zdGluZ0FkYXB0ZXIoe1xuICAgICAgY29tbXVuaWNhdGlvbkFkYXB0ZXI6IHByb3BzLmNvbW11bmljYXRpb25BZGFwdGVyLFxuICAgICAgYXV0aGVudGljYXRvcjogcHJvcHMuYXV0aGVudGljYXRvcixcbiAgICAgIG1lbW9yeVNpemU6IHByb3BzLm1lbW9yeVNpemUsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0LFxuICAgICAgYXJjaGl0ZWN0dXJlOiBwcm9wcy5hcmNoaXRlY3R1cmUsXG4gICAgICByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zOiBwcm9wcy5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zLFxuICAgIH0pO1xuXG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7IC4uLnByb3BzLCBzZXJ2aWNlUHJpbmNpcGFsOiBob3N0aW5nQWRhcHRlci5zZXJ2aWNlUHJpbmNpcGFsIH0pO1xuXG4gICAgLy8gVmFsaWRhdGUgcHJvcHNcbiAgICB0aGlzLnZhbGlkYXRlUHJvcHMocHJvcHMpO1xuXG4gICAgY29uc3QgbW9kZWxJZCA9IEJlZHJvY2tNb2RlbFV0aWxzLmRlcml2ZUFjdHVhbE1vZGVsSWQodGhpcy5iZWRyb2NrTW9kZWwpO1xuICAgIGNvbnN0IG1ldHJpY05hbWVzcGFjZSA9IHByb3BzLm1ldHJpY05hbWVzcGFjZSB8fCBEZWZhdWx0T2JzZXJ2YWJpbGl0eUNvbmZpZy5ERUZBVUxUX01FVFJJQ19OQU1FU1BBQ0U7XG4gICAgY29uc3QgbWV0cmljU2VydmljZU5hbWUgPSBwcm9wcy5tZXRyaWNTZXJ2aWNlTmFtZSB8fCBEZWZhdWx0QWdlbnRDb25maWcuREVGQVVMVF9PQlNFUlZBQklMSVRZX01FVFJJQ19TVkNfTkFNRTtcblxuICAgIC8vIEluaXRpYWxpemUgc2Vzc2lvbiBzdG9yZSAoUzMgYnVja2V0IGZvciBTdHJhbmRzLW5hdGl2ZSBTM1Nlc3Npb25NYW5hZ2VyKVxuICAgIGlmIChwcm9wcy5zZXNzaW9uU3RvcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZXNzaW9uU3RvcmUgPSBwcm9wcy5zZXNzaW9uU3RvcmU7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5zZXNzaW9uU3RvcmUgPT09IHVuZGVmaW5lZCAmJiBwcm9wcy5zZXNzaW9uQnVja2V0KSB7XG4gICAgICB0aGlzLnNlc3Npb25TdG9yZSA9IG5ldyBTM1Nlc3Npb25NYW5hZ2VyKHRoaXMsICdTZXNzaW9uTWFuYWdlcicsIHtcbiAgICAgICAgYnVja2V0OiBwcm9wcy5zZXNzaW9uQnVja2V0LFxuICAgICAgICBzZXNzaW9uVFRMOiBwcm9wcy5zZXNzaW9uVFRMLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQ6IGNyZWF0ZSBTM1Nlc3Npb25NYW5hZ2VyIChidWNrZXQgdXNlZCBieSBTdHJhbmRzLW5hdGl2ZSBzZXNzaW9uIG1hbmFnZXIpXG4gICAgICB0aGlzLnNlc3Npb25TdG9yZSA9IG5ldyBTM1Nlc3Npb25NYW5hZ2VyKHRoaXMsICdTZXNzaW9uTWFuYWdlcicsIHtcbiAgICAgICAgc2Vzc2lvblRUTDogcHJvcHMuc2Vzc2lvblRUTCxcbiAgICAgICAgZW5jcnlwdGlvbktleTogcHJvcHMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnNlc3Npb25CdWNrZXQgPSB0aGlzLnNlc3Npb25TdG9yZT8uc2Vzc2lvbkJ1Y2tldDtcblxuICAgIC8vIEluaXRpYWxpemUgc2Vzc2lvbiBpbmRleCAoRHluYW1vREIgdGFibGUgZm9yIHVzZXLihpJzZXNzaW9uIGxvb2t1cHMpXG4gICAgaWYgKHByb3BzLnNlc3Npb25JbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNlc3Npb25JbmRleCA9IHByb3BzLnNlc3Npb25JbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdDogY3JlYXRlIER5bmFtb0RCU2Vzc2lvbkluZGV4XG4gICAgICB0aGlzLnNlc3Npb25JbmRleCA9IG5ldyBEeW5hbW9EQlNlc3Npb25JbmRleCh0aGlzLCAnU2Vzc2lvbkluZGV4Jywge1xuICAgICAgICBzZXNzaW9uVFRMOiBwcm9wcy5zZXNzaW9uVFRMLFxuICAgICAgICBlbmNyeXB0aW9uS2V5OiBwcm9wcy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICByZW1vdmFsUG9saWN5OiBwcm9wcy5yZW1vdmFsUG9saWN5LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ29udGV4dCBzdHJhdGVneSBpcyBkZXByZWNhdGVkIOKAlCBTdHJhbmRzLW5hdGl2ZSBjb252ZXJzYXRpb24gbWFuYWdlciBoYW5kbGVzIHRoaXMuXG4gICAgLy8gS2VlcCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBidXQgZG8gbm90IHVzZSBlbnYgdmFycy5cbiAgICBpZiAocHJvcHMuY29udGV4dFN0cmF0ZWd5KSB7XG4gICAgICB0aGlzLmNvbnRleHRTdHJhdGVneSA9IHByb3BzLmNvbnRleHRTdHJhdGVneTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250ZXh0U3RyYXRlZ3kgPSBuZXcgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIoe1xuICAgICAgICB3aW5kb3dTaXplOiBwcm9wcy5tZXNzYWdlSGlzdG9yeUxpbWl0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgYmFzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICBjb25zdCBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBNT0RFTF9JRDogbW9kZWxJZCxcbiAgICAgIFNZU1RFTV9QUk9NUFRfUzNfQlVDS0VUX05BTUU6IHByb3BzLmFnZW50RGVmaW5pdGlvbi5zeXN0ZW1Qcm9tcHQuczNCdWNrZXROYW1lLFxuICAgICAgU1lTVEVNX1BST01QVF9TM19LRVk6IHByb3BzLmFnZW50RGVmaW5pdGlvbi5zeXN0ZW1Qcm9tcHQuczNPYmplY3RLZXksXG4gICAgICBUT09MU19DT05GSUc6IEpTT04uc3RyaW5naWZ5KHRoaXMuYWdlbnRUb29sc0xvY2F0aW9uRGVmaW5pdGlvbnMpLFxuICAgICAgLi4uUG93ZXJ0b29sc0NvbmZpZy5nZW5lcmF0ZURlZmF1bHRMYW1iZGFDb25maWcoXG4gICAgICAgIHByb3BzLmVuYWJsZU9ic2VydmFiaWxpdHksXG4gICAgICAgIG1ldHJpY05hbWVzcGFjZSxcbiAgICAgICAgbWV0cmljU2VydmljZU5hbWUsXG4gICAgICAgICdERUJVRycsXG4gICAgICApLFxuICAgIH07XG5cbiAgICAvLyBBZGQgc2Vzc2lvbiBidWNrZXQgZW52IHZhciBpZiBzZXNzaW9uIHN0b3JlIGV4aXN0c1xuICAgIGlmICh0aGlzLnNlc3Npb25CdWNrZXQpIHtcbiAgICAgIGVudi5TRVNTSU9OX0JVQ0tFVCA9IHRoaXMuc2Vzc2lvbkJ1Y2tldC5idWNrZXROYW1lO1xuICAgIH1cblxuICAgIC8vIEFkZCBzZXNzaW9uIGluZGV4IGVudiB2YXJzIGlmIHNlc3Npb24gaW5kZXggZXhpc3RzXG4gICAgaWYgKHRoaXMuc2Vzc2lvbkluZGV4KSB7XG4gICAgICBPYmplY3QuYXNzaWduKGVudiwgdGhpcy5zZXNzaW9uSW5kZXguZW52aXJvbm1lbnRWYXJpYWJsZXMoKSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGtub3dsZWRnZSBiYXNlIGNvbmZpZ3VyYXRpb24gaWYgS0JzIGFyZSBjb25maWd1cmVkXG4gICAgaWYgKHRoaXMua25vd2xlZGdlQmFzZUNvbmZpZ3MubGVuZ3RoID4gMCkge1xuICAgICAgZW52LktOT1dMRURHRV9CQVNFU19DT05GSUcgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmtub3dsZWRnZUJhc2VDb25maWdzKTtcbiAgICAgIGVudi5LTk9XTEVER0VfQkFTRV9TWVNURU1fUFJPTVBUX0FERElUSU9OID0gZ2VuZXJhdGVLbm93bGVkZ2VCYXNlU3lzdGVtUHJvbXB0QWRkaXRpb24odGhpcy5rbm93bGVkZ2VCYXNlQ29uZmlncyk7XG4gICAgfVxuXG4gICAgLy8gRGVwbG95IHZpYSBob3N0aW5nIGFkYXB0ZXJcbiAgICBjb25zdCBob3N0aW5nUmVzdWx0ID0gaG9zdGluZ0FkYXB0ZXIuZGVwbG95KHtcbiAgICAgIHNjb3BlOiB0aGlzLFxuICAgICAgYWdlbnROYW1lOiBwcm9wcy5hZ2VudE5hbWUsXG4gICAgICBhZ2VudFJvbGU6IHRoaXMuYWdlbnRSb2xlLFxuICAgICAgZW52aXJvbm1lbnQ6IGVudixcbiAgICAgIGVuY3J5cHRpb25LZXk6IHRoaXMuZW5jcnlwdGlvbktleSxcbiAgICAgIG5ldHdvcms6IHByb3BzLm5ldHdvcmssXG4gICAgICBhcmNoaXRlY3R1cmU6IHByb3BzLmFyY2hpdGVjdHVyZSxcbiAgICAgIG1lbW9yeVNpemU6IHByb3BzLm1lbW9yeVNpemUsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0LFxuICAgICAgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9uczogcHJvcHMucmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucyxcbiAgICAgIGxhbWJkYUxheWVyczogcHJvcHMuYWdlbnREZWZpbml0aW9uLmxhbWJkYUxheWVycyxcbiAgICAgIGtub3dsZWRnZUJhc2VMYXllcnM6IHRoaXMua25vd2xlZGdlQmFzZUxheWVycyxcbiAgICAgIGVuYWJsZU9ic2VydmFiaWxpdHk6IHByb3BzLmVuYWJsZU9ic2VydmFiaWxpdHksXG4gICAgICB0b29sc0NvbmZpZzogSlNPTi5zdHJpbmdpZnkodGhpcy5hZ2VudFRvb2xzTG9jYXRpb25EZWZpbml0aW9ucyksXG4gICAgICBzeXN0ZW1Qcm9tcHRCdWNrZXQ6IHByb3BzLmFnZW50RGVmaW5pdGlvbi5zeXN0ZW1Qcm9tcHQuczNCdWNrZXROYW1lLFxuICAgICAgc3lzdGVtUHJvbXB0S2V5OiBwcm9wcy5hZ2VudERlZmluaXRpb24uc3lzdGVtUHJvbXB0LnMzT2JqZWN0S2V5LFxuICAgICAga25vd2xlZGdlQmFzZUNvbmZpZ3M6IHRoaXMua25vd2xlZGdlQmFzZUNvbmZpZ3MubGVuZ3RoID4gMCA/IEpTT04uc3RyaW5naWZ5KHRoaXMua25vd2xlZGdlQmFzZUNvbmZpZ3MpIDogdW5kZWZpbmVkLFxuICAgICAga25vd2xlZGdlQmFzZVN5c3RlbVByb21wdEFkZGl0aW9uOiB0aGlzLmtub3dsZWRnZUJhc2VDb25maWdzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBnZW5lcmF0ZUtub3dsZWRnZUJhc2VTeXN0ZW1Qcm9tcHRBZGRpdGlvbih0aGlzLmtub3dsZWRnZUJhc2VDb25maWdzKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzLnJlbW92YWxQb2xpY3ksXG4gICAgfSk7XG5cbiAgICB0aGlzLmFwaUVuZHBvaW50ID0gaG9zdGluZ1Jlc3VsdC5lbmRwb2ludDtcbiAgICB0aGlzLmFnZW50RnVuY3Rpb24gPSBob3N0aW5nUmVzdWx0LmFnZW50RnVuY3Rpb247XG4gICAgdGhpcy5jZm5SdW50aW1lID0gaG9zdGluZ1Jlc3VsdC5jZm5SdW50aW1lO1xuXG4gICAgLy8gU2V0IGFkYXB0ZXIgYW5kIGF1dGhlbnRpY2F0b3IgcmVmZXJlbmNlcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgIGlmIChob3N0aW5nQWRhcHRlciBpbnN0YW5jZW9mIExhbWJkYUhvc3RpbmdBZGFwdGVyKSB7XG4gICAgICB0aGlzLmFkYXB0ZXIgPSBob3N0aW5nQWRhcHRlci5jb21tdW5pY2F0aW9uQWRhcHRlcjtcbiAgICAgIHRoaXMuYXV0aGVudGljYXRvciA9IGhvc3RpbmdBZGFwdGVyLmF1dGhlbnRpY2F0b3I7XG5cbiAgICAgIC8vIEV4cG9zZSBSRVNUIEFQSSBhbmQgQ29nbml0byBhdXRob3JpemVyIGZyb20gdGhlIGNvbW11bmljYXRpb24gYWRhcHRlclxuICAgICAgaWYgKHRoaXMuYWRhcHRlciBpbnN0YW5jZW9mIFN0cmVhbWluZ0h0dHBBZGFwdGVyKSB7XG4gICAgICAgIHRoaXMucmVzdEFwaSA9IHRoaXMuYWRhcHRlci5yZXN0QXBpO1xuICAgICAgICB0aGlzLmNvZ25pdG9BdXRob3JpemVyID0gdGhpcy5hZGFwdGVyLmNvZ25pdG9BdXRob3JpemVyO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdyYW50IHN5c3RlbSBwcm9tcHQgcmVhZCBhY2Nlc3NcbiAgICBwcm9wcy5hZ2VudERlZmluaXRpb24uc3lzdGVtUHJvbXB0LmdyYW50UmVhZCh0aGlzLmFnZW50Um9sZSk7XG5cbiAgICAvLyBHcmFudCBzZXNzaW9uIHN0b3JlIGFjY2Vzc1xuICAgIGlmICh0aGlzLnNlc3Npb25TdG9yZSkge1xuICAgICAgaWYgKHRoaXMuYWdlbnRGdW5jdGlvbikge1xuICAgICAgICB0aGlzLnNlc3Npb25TdG9yZS5ncmFudFJlYWRXcml0ZSh0aGlzLmFnZW50RnVuY3Rpb24pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlc3Npb25CdWNrZXQpIHtcbiAgICAgICAgLy8gRm9yIEFnZW50Q29yZSBob3N0aW5nLCBncmFudCB0aGUgYWdlbnQgcm9sZSBkaXJlY3QgUzMgYWNjZXNzXG4gICAgICAgIHRoaXMuc2Vzc2lvbkJ1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLmFnZW50Um9sZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR3JhbnQgc2Vzc2lvbiBpbmRleCBhY2Nlc3NcbiAgICBpZiAodGhpcy5zZXNzaW9uSW5kZXgpIHtcbiAgICAgIHRoaXMuc2Vzc2lvbkluZGV4LmdyYW50UmVhZFdyaXRlKHRoaXMuYWdlbnRSb2xlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIEludGVyYWN0aXZlQWdlbnQgcHJvcHMuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUHJvcHMocHJvcHM6IEludGVyYWN0aXZlQWdlbnRQcm9wcyk6IHZvaWQge1xuICAgIGlmICghcHJvcHMuYWdlbnROYW1lIHx8IHByb3BzLmFnZW50TmFtZS50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FnZW50TmFtZSBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMubWVtb3J5U2l6ZSAhPT0gdW5kZWZpbmVkICYmIChwcm9wcy5tZW1vcnlTaXplIDwgMTI4IHx8IHByb3BzLm1lbW9yeVNpemUgPiAxMDI0MCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWVtb3J5U2l6ZSBtdXN0IGJlIGJldHdlZW4gMTI4IGFuZCAxMDI0MCBNQicpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy50aW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gcHJvcHMudGltZW91dC50b1NlY29uZHMoKTtcbiAgICAgIGlmICh0aW1lb3V0U2Vjb25kcyA8IDEgfHwgdGltZW91dFNlY29uZHMgPiA5MDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aW1lb3V0IG11c3QgYmUgYmV0d2VlbiAxIHNlY29uZCBhbmQgMTUgbWludXRlcycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcm9wcy5tZXNzYWdlSGlzdG9yeUxpbWl0ICE9PSB1bmRlZmluZWQgJiYgKHByb3BzLm1lc3NhZ2VIaXN0b3J5TGltaXQgPCAxIHx8IHByb3BzLm1lc3NhZ2VIaXN0b3J5TGltaXQgPiAxMDAwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtZXNzYWdlSGlzdG9yeUxpbWl0IG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMDAwJyk7XG4gICAgfVxuICB9XG59XG4iXX0=
|