@cdklabs/cdk-appmod-catalog-blueprints 1.16.0 → 1.17.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.
Files changed (66) hide show
  1. package/.jsii +992 -168
  2. package/lib/document-processing/adapter/queued-s3-adapter.js +1 -1
  3. package/lib/document-processing/agentic-document-processing.js +1 -1
  4. package/lib/document-processing/base-document-processing.js +1 -1
  5. package/lib/document-processing/bedrock-document-processing.d.ts +1 -0
  6. package/lib/document-processing/bedrock-document-processing.js +10 -6
  7. package/lib/document-processing/default-document-processing-config.js +1 -1
  8. package/lib/document-processing/index.d.ts +2 -0
  9. package/lib/document-processing/index.js +3 -1
  10. package/lib/document-processing/localstack-agentic-document-processing.d.ts +20 -0
  11. package/lib/document-processing/localstack-agentic-document-processing.js +66 -0
  12. package/lib/document-processing/localstack-bedrock-document-processing.d.ts +16 -0
  13. package/lib/document-processing/localstack-bedrock-document-processing.js +38 -0
  14. package/lib/document-processing/resources/cleanup/handler.py +16 -1
  15. package/lib/document-processing/resources/default-localstack-invoke/index.py +184 -0
  16. package/lib/document-processing/resources/default-localstack-invoke/provider_runtime.py +251 -0
  17. package/lib/document-processing/resources/default-localstack-invoke/requirements.txt +5 -0
  18. package/lib/document-processing/resources/default-sqs-consumer/index.py +17 -2
  19. package/lib/document-processing/resources/pdf-chunking/handler.py +16 -1
  20. package/lib/document-processing/tests/localstack-agentic-document-processing.test.d.ts +1 -0
  21. package/lib/document-processing/tests/localstack-agentic-document-processing.test.js +78 -0
  22. package/lib/document-processing/tests/localstack-document-processing.test.d.ts +1 -0
  23. package/lib/document-processing/tests/localstack-document-processing.test.js +116 -0
  24. package/lib/framework/agents/base-agent.js +1 -1
  25. package/lib/framework/agents/batch-agent.d.ts +1 -0
  26. package/lib/framework/agents/batch-agent.js +7 -4
  27. package/lib/framework/agents/default-agent-config.js +1 -1
  28. package/lib/framework/agents/index.d.ts +1 -0
  29. package/lib/framework/agents/index.js +2 -1
  30. package/lib/framework/agents/interactive-agent.js +88 -11
  31. package/lib/framework/agents/knowledge-base/base-knowledge-base.js +1 -1
  32. package/lib/framework/agents/knowledge-base/bedrock-knowledge-base.js +1 -1
  33. package/lib/framework/agents/localstack-batch-agent.d.ts +15 -0
  34. package/lib/framework/agents/localstack-batch-agent.js +33 -0
  35. package/lib/framework/agents/resources/default-ollama-agent/batch.py +396 -0
  36. package/lib/framework/agents/resources/default-ollama-agent/models.py +7 -0
  37. package/lib/framework/agents/resources/default-ollama-agent/requirements.txt +9 -0
  38. package/lib/framework/agents/resources/default-ollama-agent/runtime_support.py +237 -0
  39. package/lib/framework/agents/resources/default-ollama-agent/utils.py +77 -0
  40. package/lib/framework/bedrock/bedrock.d.ts +9 -0
  41. package/lib/framework/bedrock/bedrock.js +20 -10
  42. package/lib/framework/custom-resource/default-runtimes.js +1 -1
  43. package/lib/framework/foundation/access-log.js +1 -1
  44. package/lib/framework/foundation/eventbridge-broker.js +1 -1
  45. package/lib/framework/foundation/network.d.ts +1 -1
  46. package/lib/framework/foundation/network.js +8 -3
  47. package/lib/framework/index.d.ts +1 -0
  48. package/lib/framework/index.js +2 -1
  49. package/lib/framework/localstack/index.d.ts +1 -0
  50. package/lib/framework/localstack/index.js +18 -0
  51. package/lib/framework/localstack/localstack-config.d.ts +79 -0
  52. package/lib/framework/localstack/localstack-config.js +49 -0
  53. package/lib/framework/tests/localstack-batch-agent.test.d.ts +1 -0
  54. package/lib/framework/tests/localstack-batch-agent.test.js +67 -0
  55. package/lib/tsconfig.tsbuildinfo +1 -1
  56. package/lib/utilities/data-loader.js +1 -1
  57. package/lib/utilities/lambda-iam-utils.js +1 -1
  58. package/lib/utilities/observability/cloudfront-distribution-observability-property-injector.js +1 -1
  59. package/lib/utilities/observability/cloudwatch-transaction-search.js +1 -1
  60. package/lib/utilities/observability/default-observability-config.js +1 -1
  61. package/lib/utilities/observability/lambda-observability-property-injector.js +1 -1
  62. package/lib/utilities/observability/log-group-data-protection-utils.js +1 -1
  63. package/lib/utilities/observability/powertools-config.js +1 -1
  64. package/lib/utilities/observability/state-machine-observability-property-injector.js +1 -1
  65. package/lib/webapp/frontend-construct.js +1 -1
  66. package/package.json +1 -1
@@ -189,7 +189,7 @@ class StreamingHttpAdapter {
189
189
  }
190
190
  exports.StreamingHttpAdapter = StreamingHttpAdapter;
191
191
  _a = JSII_RTTI_SYMBOL_1;
192
- StreamingHttpAdapter[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.StreamingHttpAdapter", version: "1.16.0" };
192
+ StreamingHttpAdapter[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.StreamingHttpAdapter", version: "1.17.0" };
193
193
  /**
194
194
  * S3-based session manager for persisting conversation state.
195
195
  *
@@ -266,7 +266,7 @@ class S3SessionManager {
266
266
  }
267
267
  exports.S3SessionManager = S3SessionManager;
268
268
  _b = JSII_RTTI_SYMBOL_1;
269
- S3SessionManager[_b] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.S3SessionManager", version: "1.16.0" };
269
+ S3SessionManager[_b] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.S3SessionManager", version: "1.17.0" };
270
270
  /**
271
271
  * Sliding window conversation manager for maintaining recent conversation history.
272
272
  *
@@ -314,7 +314,7 @@ class SlidingWindowConversationManager {
314
314
  }
315
315
  exports.SlidingWindowConversationManager = SlidingWindowConversationManager;
316
316
  _c = JSII_RTTI_SYMBOL_1;
317
- SlidingWindowConversationManager[_c] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.SlidingWindowConversationManager", version: "1.16.0" };
317
+ SlidingWindowConversationManager[_c] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.SlidingWindowConversationManager", version: "1.17.0" };
318
318
  /**
319
319
  * Null conversation manager for stateless interactions.
320
320
  *
@@ -337,7 +337,7 @@ class NullConversationManager {
337
337
  }
338
338
  exports.NullConversationManager = NullConversationManager;
339
339
  _d = JSII_RTTI_SYMBOL_1;
340
- NullConversationManager[_d] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.NullConversationManager", version: "1.16.0" };
340
+ NullConversationManager[_d] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.NullConversationManager", version: "1.17.0" };
341
341
  /**
342
342
  * Cognito-based authenticator for securing REST API endpoints.
343
343
  *
@@ -460,7 +460,7 @@ class CognitoAuthenticator {
460
460
  }
461
461
  exports.CognitoAuthenticator = CognitoAuthenticator;
462
462
  _e = JSII_RTTI_SYMBOL_1;
463
- CognitoAuthenticator[_e] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.CognitoAuthenticator", version: "1.16.0" };
463
+ CognitoAuthenticator[_e] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.CognitoAuthenticator", version: "1.17.0" };
464
464
  /**
465
465
  * DynamoDB-based session index for fast user to session lookups.
466
466
  *
@@ -547,7 +547,7 @@ class DynamoDBSessionIndex {
547
547
  }
548
548
  exports.DynamoDBSessionIndex = DynamoDBSessionIndex;
549
549
  _f = JSII_RTTI_SYMBOL_1;
550
- DynamoDBSessionIndex[_f] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.DynamoDBSessionIndex", version: "1.16.0" };
550
+ DynamoDBSessionIndex[_f] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.DynamoDBSessionIndex", version: "1.17.0" };
551
551
  /**
552
552
  * No-authentication authenticator for development and testing.
553
553
  *
@@ -577,7 +577,7 @@ class NoAuthenticator {
577
577
  }
578
578
  exports.NoAuthenticator = NoAuthenticator;
579
579
  _g = JSII_RTTI_SYMBOL_1;
580
- NoAuthenticator[_g] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.NoAuthenticator", version: "1.16.0" };
580
+ NoAuthenticator[_g] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.NoAuthenticator", version: "1.17.0" };
581
581
  /**
582
582
  * Lambda hosting adapter for InteractiveAgent.
583
583
  *
@@ -723,7 +723,7 @@ class LambdaHostingAdapter {
723
723
  }
724
724
  exports.LambdaHostingAdapter = LambdaHostingAdapter;
725
725
  _h = JSII_RTTI_SYMBOL_1;
726
- LambdaHostingAdapter[_h] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.LambdaHostingAdapter", version: "1.16.0" };
726
+ LambdaHostingAdapter[_h] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.LambdaHostingAdapter", version: "1.17.0" };
727
727
  /**
728
728
  * Configuration properties for AgentCoreRuntimeHostingAdapter.
729
729
  */
@@ -954,6 +954,79 @@ class AgentCoreRuntimeHostingAdapter {
954
954
  if (ecrPolicyResult.policyDependable) {
955
955
  runtime.node.addDependency(ecrPolicyResult.policyDependable);
956
956
  }
957
+ // In VPC mode, the AgentCore runtime takes longer to provision (ENI creation,
958
+ // subnet attachment) but CloudFormation marks CfnRuntime as CREATE_COMPLETE
959
+ // before the runtime reaches READY status. Insert a custom resource waiter
960
+ // that polls GetAgentRuntime until status is READY before creating the endpoint.
961
+ let runtimeWaiter;
962
+ if (networkMode === NetworkMode.VPC) {
963
+ const uniqueSuffix = aws_cdk_lib_1.Names.uniqueId(runtime).slice(-8).toLowerCase();
964
+ const waiterFn = new aws_lambda_1.Function(scope, 'RuntimeReadyWaiterFn', {
965
+ functionName: `${config.agentName}-rt-waiter-${uniqueSuffix}`,
966
+ runtime: aws_lambda_1.Runtime.NODEJS_22_X,
967
+ handler: 'index.handler',
968
+ code: aws_lambda_1.Code.fromInline([
969
+ 'const https = require("https");',
970
+ 'const url = require("url");',
971
+ 'const { BedrockAgentCoreControlClient, GetAgentRuntimeCommand } = require("@aws-sdk/client-bedrock-agentcore-control");',
972
+ 'function sendResponse(event, context, status, data, reason) {',
973
+ ' const body = JSON.stringify({',
974
+ ' Status: status,',
975
+ ' Reason: reason || "See CloudWatch Log Stream: " + context.logStreamName,',
976
+ ' PhysicalResourceId: event.ResourceProperties.AgentRuntimeId || event.LogicalResourceId,',
977
+ ' StackId: event.StackId,',
978
+ ' RequestId: event.RequestId,',
979
+ ' LogicalResourceId: event.LogicalResourceId,',
980
+ ' Data: data || {},',
981
+ ' });',
982
+ ' const parsed = url.parse(event.ResponseURL);',
983
+ ' return new Promise((resolve, reject) => {',
984
+ ' const req = https.request({ hostname: parsed.hostname, path: parsed.path, method: "PUT",',
985
+ ' headers: { "content-type": "", "content-length": body.length } }, resolve);',
986
+ ' req.on("error", reject);',
987
+ ' req.write(body);',
988
+ ' req.end();',
989
+ ' });',
990
+ '}',
991
+ 'exports.handler = async (event, context) => {',
992
+ ' try {',
993
+ ' if (event.RequestType === "Delete") { await sendResponse(event, context, "SUCCESS", {}); return; }',
994
+ ' const client = new BedrockAgentCoreControlClient();',
995
+ ' const runtimeId = event.ResourceProperties.AgentRuntimeId;',
996
+ ' for (let i = 0; i < 40; i++) {',
997
+ ' const resp = await client.send(new GetAgentRuntimeCommand({ agentRuntimeId: runtimeId }));',
998
+ ' const status = resp.status || resp.agentRuntimeStatus;',
999
+ ' console.log(`Attempt ${i + 1}: runtime status = ${status}`);',
1000
+ ' if (status === "READY") { await sendResponse(event, context, "SUCCESS", { Status: status }); return; }',
1001
+ ' if (status === "FAILED") { await sendResponse(event, context, "FAILED", {}, "Runtime entered FAILED status"); return; }',
1002
+ ' await new Promise(r => setTimeout(r, 15000));',
1003
+ ' }',
1004
+ ' await sendResponse(event, context, "FAILED", {}, "Timed out waiting for runtime READY status");',
1005
+ ' } catch (e) {',
1006
+ ' console.error(e);',
1007
+ ' await sendResponse(event, context, "FAILED", {}, e.message);',
1008
+ ' }',
1009
+ '};',
1010
+ ].join('\n')),
1011
+ timeout: aws_cdk_lib_1.Duration.minutes(12),
1012
+ });
1013
+ waiterFn.addToRolePolicy(new aws_iam_1.PolicyStatement({
1014
+ effect: aws_iam_1.Effect.ALLOW,
1015
+ actions: ['bedrock-agentcore:GetAgentRuntime'],
1016
+ resources: [aws_cdk_lib_1.Stack.of(scope).formatArn({
1017
+ service: 'bedrock-agentcore',
1018
+ resource: 'runtime',
1019
+ resourceName: '*',
1020
+ })],
1021
+ }));
1022
+ runtimeWaiter = new aws_cdk_lib_1.CustomResource(scope, 'RuntimeReadyWaiter', {
1023
+ serviceToken: waiterFn.functionArn,
1024
+ properties: {
1025
+ AgentRuntimeId: runtime.ref,
1026
+ },
1027
+ });
1028
+ runtimeWaiter.node.addDependency(runtime);
1029
+ }
957
1030
  // Create CfnRuntimeEndpoint
958
1031
  const endpointName = this.props.endpointName || `${config.agentName.replace(/-/g, '_')}_endpoint`;
959
1032
  const runtimeEndpoint = new aws_bedrockagentcore_1.CfnRuntimeEndpoint(scope, 'AgentCoreRuntimeEndpoint', {
@@ -967,6 +1040,10 @@ class AgentCoreRuntimeHostingAdapter {
967
1040
  }),
968
1041
  });
969
1042
  runtimeEndpoint.applyRemovalPolicy(config.removalPolicy || aws_cdk_lib_1.RemovalPolicy.DESTROY);
1043
+ // Ensure the endpoint waits for the runtime to be READY in VPC mode
1044
+ if (runtimeWaiter) {
1045
+ runtimeEndpoint.node.addDependency(runtimeWaiter);
1046
+ }
970
1047
  // Construct the full invocation URL for direct HTTPS access (required for JWT auth).
971
1048
  // Format: https://bedrock-agentcore.{region}.amazonaws.com/runtimes/{URL-encoded-ARN}/invocations?qualifier={endpointName}
972
1049
  const encodedArn = aws_cdk_lib_1.Fn.join('', [
@@ -990,7 +1067,7 @@ class AgentCoreRuntimeHostingAdapter {
990
1067
  }
991
1068
  exports.AgentCoreRuntimeHostingAdapter = AgentCoreRuntimeHostingAdapter;
992
1069
  _j = JSII_RTTI_SYMBOL_1;
993
- AgentCoreRuntimeHostingAdapter[_j] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.AgentCoreRuntimeHostingAdapter", version: "1.16.0" };
1070
+ AgentCoreRuntimeHostingAdapter[_j] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.AgentCoreRuntimeHostingAdapter", version: "1.17.0" };
994
1071
  /**
995
1072
  * Interactive Agent for real-time conversational AI with SSE streaming.
996
1073
  *
@@ -1198,5 +1275,5 @@ class InteractiveAgent extends base_agent_1.BaseAgent {
1198
1275
  }
1199
1276
  exports.InteractiveAgent = InteractiveAgent;
1200
1277
  _k = JSII_RTTI_SYMBOL_1;
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=
1278
+ InteractiveAgent[_k] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.InteractiveAgent", version: "1.17.0" };
1279
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJhY3RpdmUtYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZnJhbWV3b3JrL2FnZW50cy9pbnRlcmFjdGl2ZS1hZ2VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFFQUFxRTtBQUNyRSxzQ0FBc0M7QUFFdEMsNkJBQTZCO0FBQzdCLDZDQUF3RjtBQUN4RiwrREFTb0M7QUFDcEMsMkVBQWtGO0FBQ2xGLHlEQUF5SDtBQUN6SCwyREFBc0g7QUFDdEgsaURBQXFGO0FBQ3JGLCtEQUE4RDtBQUM5RCxpREFBa0c7QUFFbEcsdURBQXVIO0FBQ3ZILCtDQUEwRjtBQUUxRiw2Q0FBeUQ7QUFDekQsK0NBQTBFO0FBQzFFLGlFQUE0RDtBQUM1RCwrQ0FBbUU7QUFDbkUsaUVBQTJFO0FBQzNFLHdDQUErQztBQUMvQyx3REFBcUQ7QUFzRXJEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHO0FBQ0gsTUFBYSxvQkFBb0I7SUFtQi9CLFlBQVksUUFBbUMsRUFBRTtRQUMvQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCLENBQUMsY0FBeUI7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHVGQUF1RixDQUFDLENBQUM7UUFDM0csQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQztRQUNqRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDNUUsTUFBTSxzQkFBc0IsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFMUQsNEJBQTRCO1FBQzVCLHFFQUFxRTtRQUNyRSxvRUFBb0U7UUFDcEUsTUFBTSxPQUFPLEdBQUcsSUFBSSx3QkFBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFO1lBQ2pELFdBQVcsRUFBRSxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLFVBQVU7WUFDeEQsV0FBVyxFQUFFLG9EQUFvRDtZQUNqRSxhQUFhLEVBQUUsQ0FBQyw2QkFBWSxDQUFDLFFBQVEsQ0FBQztZQUN0QyxhQUFhLEVBQUU7Z0JBQ2IsU0FBUztnQkFDVCxtQkFBbUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxTQUFTO2dCQUNuRCxvQkFBb0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxVQUFVO2FBQ3REO1lBQ0QsMkJBQTJCLEVBQUU7Z0JBQzNCLFlBQVksRUFBRSxxQkFBSSxDQUFDLFdBQVc7Z0JBQzlCLFlBQVksRUFBRSxnQkFBZ0I7Z0JBQzlCLFlBQVksRUFBRSxDQUFDLGNBQWMsRUFBRSxlQUFlLENBQUM7YUFDaEQ7U0FDRixDQUFDLENBQUM7UUFDRixJQUFZLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUVoQyw2REFBNkQ7UUFDN0QscUVBQXFFO1FBQ3JFLDZFQUE2RTtRQUM3RSxJQUFJLGdDQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxtQkFBbUIsRUFBRTtZQUNuRCxPQUFPO1lBQ1AsSUFBSSxFQUFFLDZCQUFZLENBQUMsV0FBVztZQUM5QixlQUFlLEVBQUU7Z0JBQ2YsNkJBQTZCLEVBQUUsS0FBSztnQkFDcEMsOEJBQThCLEVBQUUsOEJBQThCO2dCQUM5RCw4QkFBOEIsRUFBRSxJQUFJLHNCQUFzQixHQUFHO2FBQzlEO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxnQ0FBZSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLEVBQUU7WUFDbkQsT0FBTztZQUNQLElBQUksRUFBRSw2QkFBWSxDQUFDLFdBQVc7WUFDOUIsZUFBZSxFQUFFO2dCQUNmLDZCQUE2QixFQUFFLEtBQUs7Z0JBQ3BDLDhCQUE4QixFQUFFLDhCQUE4QjtnQkFDOUQsOEJBQThCLEVBQUUsSUFBSSxzQkFBc0IsR0FBRzthQUM5RDtTQUNGLENBQUMsQ0FBQztRQUVILDRCQUE0QjtRQUM1QixNQUFNLGlCQUFpQixHQUFHLElBQUksa0NBQWlCLENBQUMsY0FBYyxFQUFFO1lBQzlELEtBQUssRUFBRSxJQUFJO1NBQ1osQ0FBQyxDQUFDO1FBRUgsc0NBQXNDO1FBQ3RDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXRELCtCQUErQjtRQUMvQixJQUFJLGlCQUFpQixHQUFHLGtDQUFpQixDQUFDLElBQUksQ0FBQztRQUMvQyxJQUFJLFVBQWtELENBQUM7UUFFdkQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsWUFBWSxvQkFBb0IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsRyxVQUFVLEdBQUcsSUFBSSwyQ0FBMEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLG1CQUFtQixFQUFFO2dCQUMzRSxnQkFBZ0IsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztnQkFDckQsY0FBYyxFQUFFLG1CQUFtQjthQUNwQyxDQUFDLENBQUM7WUFDRixJQUFZLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxDQUFDO1lBQzdDLGlCQUFpQixHQUFHLGtDQUFpQixDQUFDLE9BQU8sQ0FBQztRQUNoRCxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLEVBQUU7WUFDbkUsaUJBQWlCO1lBQ2pCLFVBQVU7U0FDWCxDQUFDLENBQUM7UUFFSCwwREFBMEQ7UUFDMUQsb0RBQW9EO1FBQ3BELHFEQUFxRDtRQUNyRCxpRUFBaUU7UUFDakUsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFtQixDQUFDO1FBQ3RELElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxTQUFTLENBQUMsbUJBQW1CLENBQUMsa0NBQWtDLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDNUUsMEVBQTBFO1lBQzFFLE1BQU0sTUFBTSxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDM0MsU0FBUyxDQUFDLG1CQUFtQixDQUMzQixpQkFBaUIsRUFDakIsc0JBQXNCLE1BQU0scUNBQXFDLGNBQWMsQ0FBQyxXQUFXLGlDQUFpQyxDQUM3SCxDQUFDO1lBQ0Ysb0RBQW9EO1lBQ3BELFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyw2QkFBNkIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBRUQsd0VBQXdFO1FBQ3hFLGNBQWMsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEVBQUU7WUFDL0MsU0FBUyxFQUFFLElBQUksMEJBQWdCLENBQUMsMEJBQTBCLENBQUM7WUFDM0QsU0FBUyxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtTQUN0QyxDQUFDLENBQUM7UUFFSCxpREFBaUQ7UUFDakQsY0FBYyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsRUFBRTtZQUNyRCxTQUFTLEVBQUUsSUFBSSwwQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQztZQUMzRCxTQUFTLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7WUFDcEQsTUFBTSxFQUFFLDBCQUEwQjtTQUNuQyxDQUFDLENBQUM7UUFFSCx5QkFBeUI7UUFDekIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2QyxJQUFZLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztRQUVoQyxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXLENBQUMsZUFBMEI7UUFDcEMscUVBQXFFO1FBQ3JFLHVFQUF1RTtJQUN6RSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxTQUFTLENBQUMsS0FBZ0I7UUFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQzs7QUE5Skgsb0RBK0pDOzs7QUE2REQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQ0c7QUFDSCxNQUFhLGdCQUFnQjtJQVczQixZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLFFBQStCLEVBQUU7UUFDekUsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsSUFBSSwyQkFBYSxDQUFDLE9BQU8sQ0FBQztRQUNuRSxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxJQUFJLHNCQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTFELHdDQUF3QztRQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxlQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUU7WUFDN0QsVUFBVSxFQUFFLHlCQUFnQixDQUFDLEdBQUc7WUFDaEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1lBQ2xDLGFBQWEsRUFBRSxhQUFhO1lBQzVCLGlCQUFpQixFQUFFLGFBQWEsS0FBSywyQkFBYSxDQUFDLE9BQU87WUFDMUQsY0FBYyxFQUFFO2dCQUNkO29CQUNFLEVBQUUsRUFBRSxtQkFBbUI7b0JBQ3ZCLFVBQVUsRUFBRSxVQUFVO29CQUN0QixPQUFPLEVBQUUsSUFBSTtpQkFDZDthQUNGO1lBQ0QsVUFBVSxFQUFFLElBQUk7WUFDaEIsU0FBUyxFQUFFLEtBQUs7WUFDaEIsaUJBQWlCLEVBQUUsMEJBQWlCLENBQUMsU0FBUztTQUMvQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWMsQ0FBQyxjQUF5QjtRQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM3QyxDQUFDOztBQWhESCw0Q0FpREM7OztBQW9DRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILE1BQWEsZ0NBQWdDO0lBTTNDLFlBQVksUUFBK0MsRUFBRTtRQUMzRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRTFFLElBQUksVUFBVSxHQUFHLENBQUMsSUFBSSxVQUFVLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDeEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxvQkFBb0I7UUFDbEIsT0FBTztZQUNMLGVBQWUsRUFBRSxNQUFNO1lBQ3ZCLGdCQUFnQixFQUFFLGVBQWU7WUFDakMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7U0FDaEQsQ0FBQztJQUNKLENBQUM7O0FBekJILDRFQTBCQzs7O0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFhLHVCQUF1QjtJQUNsQzs7T0FFRztJQUNILG9CQUFvQjtRQUNsQixPQUFPO1lBQ0wsZUFBZSxFQUFFLE9BQU87WUFDeEIsZ0JBQWdCLEVBQUUsTUFBTTtTQUN6QixDQUFDO0lBQ0osQ0FBQzs7QUFUSCwwREFVQzs7O0FBOENEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdDRztBQUNILE1BQWEsb0JBQW9CO0lBYy9CLFlBQVksUUFBbUMsRUFBRTtRQUMvQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQzNDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsSUFBSSwyQkFBYSxDQUFDLE9BQU8sQ0FBQztJQUNwRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsaUJBQWlCLENBQUMsY0FBeUI7UUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHdGQUF3RixDQUFDLENBQUM7UUFDNUcsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4RUFBOEUsQ0FBQyxDQUFDO1FBQ2xHLENBQUM7UUFFRCxjQUFjLENBQUMsZUFBZSxDQUM1QixJQUFJLHlCQUFlLENBQUM7WUFDbEIsTUFBTSxFQUFFLGdCQUFNLENBQUMsS0FBSztZQUNwQixPQUFPLEVBQUU7Z0JBQ1AscUJBQXFCO2dCQUNyQiwwQkFBMEI7YUFDM0I7WUFDRCxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztTQUN2QyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILG9CQUFvQjtRQUNsQixPQUFPO1lBQ0wsU0FBUyxFQUFFLFNBQVM7WUFDcEIsWUFBWSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxJQUFJLEVBQUU7WUFDN0MsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsSUFBSSxFQUFFO1NBQ2pFLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxTQUFTLENBQUMsS0FBZ0I7UUFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixJQUFZLENBQUMsUUFBUSxHQUFHLElBQUksc0JBQVEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFO2dCQUN2RCxZQUFZLEVBQUUsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLFdBQVc7Z0JBQ3JELGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLGFBQWEsRUFBRTtvQkFDYixLQUFLLEVBQUUsSUFBSTtvQkFDWCxRQUFRLEVBQUUsSUFBSTtpQkFDZjtnQkFDRCxVQUFVLEVBQUU7b0JBQ1YsS0FBSyxFQUFFLElBQUk7aUJBQ1o7Z0JBQ0QsY0FBYyxFQUFFO29CQUNkLFNBQVMsRUFBRSxDQUFDO29CQUNaLGdCQUFnQixFQUFFLElBQUk7b0JBQ3RCLGdCQUFnQixFQUFFLElBQUk7b0JBQ3RCLGFBQWEsRUFBRSxJQUFJO29CQUNuQixjQUFjLEVBQUUsSUFBSTtpQkFDckI7Z0JBQ0QsR0FBRyxFQUFFLGlCQUFHLENBQUMsUUFBUTtnQkFDakIsZUFBZSxFQUFFO29CQUNmLEdBQUcsRUFBRSxJQUFJO29CQUNULEdBQUcsRUFBRSxJQUFJO2lCQUNWO2dCQUNELGVBQWUsRUFBRSw2QkFBZSxDQUFDLFVBQVU7Z0JBQzNDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTthQUNsQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3pDLElBQVksQ0FBQyxjQUFjLEdBQUcsSUFBSSw0QkFBYyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRTtnQkFDekUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN2QixrQkFBa0IsRUFBRSxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsaUJBQWlCO2dCQUNqRSxTQUFTLEVBQUU7b0JBQ1QsWUFBWSxFQUFFLElBQUk7b0JBQ2xCLE9BQU8sRUFBRSxJQUFJO2lCQUNkO2dCQUNELGNBQWMsRUFBRSxLQUFLO2dCQUNyQiwwQkFBMEIsRUFBRTtvQkFDMUIsNENBQThCLENBQUMsT0FBTztpQkFDdkM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQzs7QUEzR0gsb0RBNEdDOzs7QUEyREQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0NHO0FBQ0gsTUFBYSxvQkFBb0I7SUFXL0IsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxRQUFtQyxFQUFFO1FBQzdFLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLElBQUksMkJBQWEsQ0FBQyxPQUFPLENBQUM7UUFFbkUsdUNBQXVDO1FBQ3ZDLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUMzQixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sVUFBVSxHQUFRO2dCQUN0QixZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSw0QkFBYSxDQUFDLE1BQU0sRUFBRTtnQkFDN0QsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsNEJBQWEsQ0FBQyxNQUFNLEVBQUU7Z0JBQzNELFdBQVcsRUFBRSwwQkFBVyxDQUFDLGVBQWU7Z0JBQ3hDLFVBQVUsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyw4QkFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyw4QkFBZSxDQUFDLFdBQVc7Z0JBQ2hHLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtnQkFDbEMsYUFBYSxFQUFFLGFBQWE7Z0JBQzVCLG1CQUFtQixFQUFFLElBQUk7Z0JBQ3pCLE1BQU0sRUFBRSw2QkFBYyxDQUFDLGtCQUFrQjthQUMxQyxDQUFDO1lBRUYsd0NBQXdDO1lBQ3hDLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNyQixVQUFVLENBQUMsbUJBQW1CLEdBQUcsWUFBWSxDQUFDO1lBQ2hELENBQUM7WUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksb0JBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWMsQ0FBQyxPQUFtQjtRQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNILG9CQUFvQjtRQUNsQixNQUFNLEdBQUcsR0FBMkI7WUFDbEMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTO1NBQzFDLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixHQUFHLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6RSxDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDOztBQTVESCxvREE2REM7OztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFhLGVBQWU7SUFDMUI7O09BRUc7SUFDSCxpQkFBaUIsQ0FBQyxlQUEwQjtRQUMxQyx3QkFBd0I7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsb0JBQW9CO1FBQ2xCLE9BQU87WUFDTCxTQUFTLEVBQUUsTUFBTTtTQUNsQixDQUFDO0lBQ0osQ0FBQzs7QUFmSCwwQ0FnQkM7OztBQTZJRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFhLG9CQUFvQjtJQVEvQixZQUFZLFFBQW1DLEVBQUU7UUFDL0MsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksZ0JBQWdCLEtBQUssT0FBTyxJQUFJLDBCQUFnQixDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRS9FOztPQUVHO0lBQ0gsTUFBTSxDQUFDLE1BQTBCO1FBQy9CLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFFM0IsMkJBQTJCO1FBQzNCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxLQUFLLFNBQVM7WUFDMUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYTtZQUMxQixDQUFDLENBQUMsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQzlCLElBQVksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBRTVDLElBQUksYUFBYSxZQUFZLG9CQUFvQixFQUFFLENBQUM7WUFDbEQsYUFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBRUQsbUNBQW1DO1FBQ25DLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLElBQUksSUFBSSxvQkFBb0IsQ0FBQztZQUMxRSxhQUFhO1lBQ2IsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0I7U0FDOUMsQ0FBQyxDQUFDO1FBQ0YsSUFBWSxDQUFDLG9CQUFvQixHQUFHLE9BQU8sQ0FBQztRQUU3QyxJQUFJLE9BQU8sWUFBWSxvQkFBb0IsRUFBRSxDQUFDO1lBQzVDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVELDhCQUE4QjtRQUM5QixNQUFNLEdBQUcsR0FBMkI7WUFDbEMsR0FBRyxNQUFNLENBQUMsV0FBVztZQUNyQixtQ0FBbUM7WUFDbkMsdUJBQXVCLEVBQUUsZ0JBQWdCO1lBQ3pDLG1CQUFtQixFQUFFLGlCQUFpQjtZQUN0Qyw0QkFBNEIsRUFBRSxTQUFTO1lBQ3ZDLFlBQVksRUFBRSxNQUFNO1lBQ3BCLElBQUksRUFBRSxNQUFNO1lBQ1osR0FBRyxhQUFhLENBQUMsb0JBQW9CLEVBQUU7U0FDeEMsQ0FBQztRQUVGLHVEQUF1RDtRQUN2RCxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLE1BQU0sK0JBQStCLEdBQUcsMEJBQWMsQ0FBQyxxQkFBcUIsQ0FBQztZQUMzRSxPQUFPO1lBQ1AsTUFBTTtZQUNOLEtBQUs7WUFDTCxZQUFZLEVBQUUsTUFBTSxDQUFDLFNBQVM7WUFDOUIsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLG1CQUFtQjtTQUNoRCxDQUFDLENBQUM7UUFFSCwyQkFBMkI7UUFDM0IsTUFBTSxlQUFlLEdBQUcseUJBQVksQ0FBQyxtQkFBbUIsQ0FDdEQsS0FBSyxFQUNMLHVCQUF1QixFQUN2QixrQkFBa0IsTUFBTSw4Q0FBOEMsQ0FDdkUsQ0FBQztRQUVGLE1BQU0sU0FBUyxHQUFvQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3JELElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLG1CQUFtQixJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEUsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO1FBRWhGLG9FQUFvRTtRQUNwRSxNQUFNLGFBQWEsR0FBRyxpQ0FBZSxDQUFDLE1BQU0sQ0FBQztRQUM3QyxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjO1FBRTFFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxZQUFZLElBQUkseUJBQVksQ0FBQyxNQUFNLENBQUM7UUFDM0YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUM7UUFDdEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3RSxNQUFNLDRCQUE0QixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsNEJBQTRCLElBQUksTUFBTSxDQUFDLDRCQUE0QixDQUFDO1FBRXBILE1BQU0sYUFBYSxHQUFHLElBQUkscUJBQVEsQ0FBQyxLQUFLLEVBQUUsMEJBQTBCLEVBQUU7WUFDcEUsWUFBWSxFQUFFLCtCQUErQixDQUFDLGtCQUFrQjtZQUNoRSxZQUFZO1lBQ1osSUFBSSxFQUFFLGlCQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRTtnQkFDaEMsUUFBUSxFQUFFO29CQUNSLEtBQUssRUFBRSxhQUFhLENBQUMsYUFBYTtvQkFDbEMsT0FBTyxFQUFFO3dCQUNQLE1BQU0sRUFBRSxJQUFJO3dCQUNaLDJFQUEyRTtxQkFDNUU7b0JBQ0QsS0FBSyxFQUFFO3dCQUNMLFNBQVMsQ0FBQyxTQUFpQjs0QkFDekIsSUFBSSxDQUFDO2dDQUNILE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLDREQUE0RDtnQ0FDbkcsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLFNBQVMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dDQUNyRSxJQUFJLFNBQVMsR0FBRyxTQUFTLENBQUM7Z0NBQzFCLEtBQUssTUFBTSxTQUFTLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztvQ0FDekMsSUFBSSxDQUFDO3dDQUNILE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxTQUFTLGlCQUFpQixFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7d0NBQ3ZGLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQzt3Q0FDL0MsSUFBSSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDOzRDQUNoRyxTQUFTLEdBQUcsU0FBUyxDQUFDOzRDQUN0QixNQUFNO3dDQUNSLENBQUM7b0NBQ0gsQ0FBQztvQ0FBQyxNQUFNLENBQUM7d0NBQ1AsU0FBUztvQ0FDWCxDQUFDO2dDQUNILENBQUM7Z0NBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FDWCxHQUFHLFNBQVMsMkNBQTJDLFNBQVMsMEVBQTBFLFNBQVMsRUFBRSxFQUNySixFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUN2QyxDQUFDO2dDQUNGLElBQUksQ0FBQyxRQUFRLENBQ1gsWUFBWSxTQUFTLEdBQUcsRUFDeEIsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FDdkMsQ0FBQztnQ0FDRixPQUFPLElBQUksQ0FBQzs0QkFDZCxDQUFDOzRCQUFDLE1BQU0sQ0FBQztnQ0FDUCxPQUFPLEtBQUssQ0FBQzs0QkFDZixDQUFDO3dCQUNILENBQUM7cUJBQ0Y7aUJBQ0Y7YUFDRixDQUFDO1lBQ0YsSUFBSSxFQUFFLE1BQU0sQ0FBQyxTQUFTO1lBQ3RCLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLE9BQU8sRUFBRSxhQUFhO1lBQ3RCLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE9BQU87WUFDUCxVQUFVO1lBQ1YsV0FBVyxFQUFFLEdBQUc7WUFDaEIscUJBQXFCLEVBQUUsTUFBTSxDQUFDLGFBQWE7WUFDM0MsR0FBRyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3BELFVBQVUsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDcEYsNEJBQTRCO1NBQzdCLENBQUMsQ0FBQztRQUVILHdCQUF3QjtRQUN4QixLQUFLLE1BQU0sQ0FBQyxJQUFJLCtCQUErQixDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDakUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBRUQsa0NBQWtDO1FBQ2xDLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsYUFBYSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCxnREFBZ0Q7UUFDaEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFbkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsQ0FBQztJQUNyQyxDQUFDOztBQWpLSCxvREFrS0M7OztBQWNEOztHQUVHO0FBQ0g7Ozs7O0dBS0c7QUFDSCxJQUFZLFdBb0JYO0FBcEJELFdBQVksV0FBVztJQUNyQjs7O09BR0c7SUFDSCxnQ0FBaUIsQ0FBQTtJQUVqQjs7Ozs7Ozs7Ozs7T0FXRztJQUNILDBCQUFXLENBQUE7QUFDYixDQUFDLEVBcEJXLFdBQVcsMkJBQVgsV0FBVyxRQW9CdEI7QUE4RUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQ0c7QUFDSCxNQUFhLDhCQUE4QjtJQUd6QyxZQUFZLFFBQTZDLEVBQUU7UUFDekQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksZ0JBQWdCLEtBQUssT0FBTyxJQUFJLDBCQUFnQixDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTFGOztPQUVHO0lBQ0gsTUFBTSxDQUFDLE1BQTBCO1FBQy9CLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDM0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUVqRSxpREFBaUQ7UUFDakQsSUFBSSxpQkFBdUMsQ0FBQztRQUM1QyxJQUFJLHdCQUE4QyxDQUFDO1FBRW5ELElBQUksV0FBVyxLQUFLLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNwQyx3REFBd0Q7WUFDeEQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzVDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN4RixDQUFDO2lCQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUMxQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQzlDLE1BQU0sQ0FBQyxPQUFPLENBQUMsMEJBQTBCLEVBQUUsQ0FDNUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ1osaUJBQWlCLEdBQUcsT0FBTyxDQUFDO1lBQzlCLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzlCLHdCQUF3QixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNyRixDQUFDO2lCQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUMxQix5REFBeUQ7Z0JBQ3pELE1BQU0sRUFBRSxHQUFHLElBQUksdUJBQWEsQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLEVBQUU7b0JBQ3hELEdBQUcsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUc7b0JBQ3ZCLFdBQVcsRUFBRSwyQ0FBMkM7b0JBQ3hELGdCQUFnQixFQUFFLElBQUk7aUJBQ3ZCLENBQUMsQ0FBQztnQkFDSCx3QkFBd0IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBRUQsSUFBSSxDQUFDLGlCQUFpQixJQUFJLGlCQUFpQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekQsTUFBTSxJQUFJLEtBQUssQ0FDYiw4REFBOEQ7b0JBQzlELDRFQUE0RTtvQkFDNUUsMkRBQTJELENBQzVELENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxDQUFDLHdCQUF3QixJQUFJLHdCQUF3QixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdkUsTUFBTSxJQUFJLEtBQUssQ0FDYixzRUFBc0U7b0JBQ3RFLGdGQUFnRjtvQkFDaEYsZ0NBQWdDLENBQ2pDLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELHFDQUFxQztRQUNyQyxJQUFJLFlBQW9CLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDakMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUM7UUFDOUMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO1lBQzlFLE1BQU0sVUFBVSxHQUFHLElBQUksaUNBQWdCLENBQUMsS0FBSyxFQUFFLHVCQUF1QixFQUFFO2dCQUN0RSxTQUFTLEVBQUUsV0FBVzthQUN2QixDQUFDLENBQUM7WUFDSCxZQUFZLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUNyQyxDQUFDO1FBRUQsbUZBQW1GO1FBQ25GLDhFQUE4RTtRQUM5RSxnRkFBZ0Y7UUFDaEYsb0NBQW9DO1FBQ3BDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsSUFBSSx5QkFBZSxDQUFDO1lBQ2hGLE1BQU0sRUFBRSxnQkFBTSxDQUFDLEtBQUs7WUFDcEIsT0FBTyxFQUFFO2dCQUNQLDRCQUE0QjtnQkFDNUIsbUJBQW1CO2dCQUNuQiwyQkFBMkI7YUFDNUI7WUFDRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7U0FDakIsQ0FBQyxDQUFDLENBQUM7UUFFSixtREFBbUQ7UUFDbkQsK0VBQStFO1FBQy9FLHVGQUF1RjtRQUN2RixvR0FBb0c7UUFDcEcsa0ZBQWtGO1FBQ2xGLDRGQUE0RjtRQUM1RixJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsSUFBSSx5QkFBZSxDQUFDO2dCQUN4RCxNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO2dCQUNwQixPQUFPLEVBQUU7b0JBQ1Asd0JBQXdCO29CQUN4Qix5QkFBeUI7aUJBQzFCO2dCQUNELFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQzthQUNqQixDQUFDLENBQUMsQ0FBQztZQUNKLE1BQU0sQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsSUFBSSx5QkFBZSxDQUFDO2dCQUN4RCxNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO2dCQUNwQixPQUFPLEVBQUU7b0JBQ1AsMEJBQTBCO2lCQUMzQjtnQkFDRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7YUFDakIsQ0FBQyxDQUFDLENBQUM7UUFDTixDQUFDO1FBRUQsZ0RBQWdEO1FBQ2hELE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsTUFBTSxPQUFPLEdBQTJCO1lBQ3RDLDBFQUEwRTtZQUMxRSxzREFBc0Q7WUFDdEQsVUFBVSxFQUFFLE1BQU07WUFDbEIsa0JBQWtCLEVBQUUsTUFBTTtTQUMzQixDQUFDO1FBQ0YsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDOUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN2QixDQUFDO1FBRUQsMEVBQTBFO1FBQzFFLGlFQUFpRTtRQUNqRSxzRUFBc0U7UUFDdEUsa0VBQWtFO1FBQ2xFLCtCQUErQjtRQUUvQiw4QkFBOEI7UUFDOUIsTUFBTSxvQkFBb0IsR0FBUTtZQUNoQyxXQUFXO1NBQ1osQ0FBQztRQUVGLG1FQUFtRTtRQUNuRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztZQUNsRCxtQkFBbUIsRUFBRTtnQkFDbkIsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsWUFBWTtnQkFDekQsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsZUFBZTtnQkFDL0QsY0FBYyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsY0FBYzthQUM5RDtTQUNGLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVkLG9CQUFvQjtRQUNwQixNQUFNLE9BQU8sR0FBRyxJQUFJLGlDQUFVLENBQUMsS0FBSyxFQUFFLGtCQUFrQixFQUFFO1lBQ3hELGdCQUFnQixFQUFFLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxVQUFVO1lBQ2xFLG9CQUFvQixFQUFFO2dCQUNwQixzQkFBc0IsRUFBRTtvQkFDdEIsWUFBWTtpQkFDYjthQUNGO1lBQ0QsT0FBTyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTztZQUNqQyxvQkFBb0I7WUFDcEIsdUJBQXVCLEVBQUUsVUFBVTtZQUNuQyxvQkFBb0IsRUFBRSxPQUFPO1NBQzlCLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLDJCQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFMUUseUVBQXlFO1FBQ3pFLDJFQUEyRTtRQUMzRSxrSEFBa0g7UUFDbEgsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDbkMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLDRCQUE0QixFQUFFO2dCQUN4RCxzQkFBc0IsRUFBRSxDQUFDLGVBQWUsQ0FBQzthQUMxQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsMEVBQTBFO1FBQzFFLDRFQUE0RTtRQUM1RSw0RUFBNEU7UUFDNUUsd0ZBQXdGO1FBQ3hGLElBQUksV0FBVyxLQUFLLFdBQVcsQ0FBQyxHQUFHLElBQUksaUJBQWlCLElBQUksd0JBQXdCLEVBQUUsQ0FBQztZQUNyRixPQUFPLENBQUMsbUJBQW1CLENBQUMsd0NBQXdDLEVBQUU7Z0JBQ3BFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLGNBQWMsRUFBRSx3QkFBd0I7YUFDekMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELHFGQUFxRjtRQUNyRiw2REFBNkQ7UUFDN0QsMEZBQTBGO1FBQzFGLDJDQUEyQztRQUMzQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsSUFBSSxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBRUQsOEVBQThFO1FBQzlFLDRFQUE0RTtRQUM1RSwyRUFBMkU7UUFDM0UsaUZBQWlGO1FBQ2pGLElBQUksYUFBeUMsQ0FBQztRQUM5QyxJQUFJLFdBQVcsS0FBSyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDcEMsTUFBTSxZQUFZLEdBQUcsbUJBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFckUsTUFBTSxRQUFRLEdBQUcsSUFBSSxxQkFBUSxDQUFDLEtBQUssRUFBRSxzQkFBc0IsRUFBRTtnQkFDM0QsWUFBWSxFQUFFLEdBQUcsTUFBTSxDQUFDLFNBQVMsY0FBYyxZQUFZLEVBQUU7Z0JBQzdELE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7Z0JBQzVCLE9BQU8sRUFBRSxlQUFlO2dCQUN4QixJQUFJLEVBQUUsaUJBQUksQ0FBQyxVQUFVLENBQUM7b0JBQ3BCLGlDQUFpQztvQkFDakMsNkJBQTZCO29CQUM3Qix5SEFBeUg7b0JBQ3pILCtEQUErRDtvQkFDL0QsaUNBQWlDO29CQUNqQyxxQkFBcUI7b0JBQ3JCLDhFQUE4RTtvQkFDOUUsNkZBQTZGO29CQUM3Riw2QkFBNkI7b0JBQzdCLGlDQUFpQztvQkFDakMsaURBQWlEO29CQUNqRCx1QkFBdUI7b0JBQ3ZCLE9BQU87b0JBQ1AsZ0RBQWdEO29CQUNoRCw2Q0FBNkM7b0JBQzdDLDhGQUE4RjtvQkFDOUYsbUZBQW1GO29CQUNuRiw4QkFBOEI7b0JBQzlCLHNCQUFzQjtvQkFDdEIsZ0JBQWdCO29CQUNoQixPQUFPO29CQUNQLEdBQUc7b0JBQ0gsK0NBQStDO29CQUMvQyxTQUFTO29CQUNULHdHQUF3RztvQkFDeEcseURBQXlEO29CQUN6RCxnRUFBZ0U7b0JBQ2hFLG9DQUFvQztvQkFDcEMsa0dBQWtHO29CQUNsRyw4REFBOEQ7b0JBQzlELG9FQUFvRTtvQkFDcEUsOEdBQThHO29CQUM5RywrSEFBK0g7b0JBQy9ILHFEQUFxRDtvQkFDckQsT0FBTztvQkFDUCxxR0FBcUc7b0JBQ3JHLGlCQUFpQjtvQkFDakIsdUJBQXVCO29CQUN2QixrRUFBa0U7b0JBQ2xFLEtBQUs7b0JBQ0wsSUFBSTtpQkFDTCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDYixPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2FBQzlCLENBQUMsQ0FBQztZQUVILFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSx5QkFBZSxDQUFDO2dCQUMzQyxNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO2dCQUNwQixPQUFPLEVBQUUsQ0FBQyxtQ0FBbUMsQ0FBQztnQkFDOUMsU0FBUyxFQUFFLENBQUMsbUJBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDO3dCQUNwQyxPQUFPLEVBQUUsbUJBQW1CO3dCQUM1QixRQUFRLEVBQUUsU0FBUzt3QkFDbkIsWUFBWSxFQUFFLEdBQUc7cUJBQ2xCLENBQUMsQ0FBQzthQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUosYUFBYSxHQUFHLElBQUksNEJBQWMsQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLEVBQUU7Z0JBQzlELFlBQVksRUFBRSxRQUFRLENBQUMsV0FBVztnQkFDbEMsVUFBVSxFQUFFO29CQUNWLGNBQWMsRUFBRSxPQUFPLENBQUMsR0FBRztpQkFDNUI7YUFDRixDQUFDLENBQUM7WUFDSCxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBRUQsNEJBQTRCO1FBQzVCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUM7UUFDbEcsTUFBTSxlQUFlLEdBQUcsSUFBSSx5Q0FBa0IsQ0FBQyxLQUFLLEVBQUUsMEJBQTBCLEVBQUU7WUFDaEYsY0FBYyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1lBQzNCLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyx1QkFBdUI7WUFDcEQsSUFBSSxFQUFFLFlBQVk7WUFDbEIsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLElBQUk7Z0JBQ3RDLHFCQUFxQixFQUFFO29CQUNyQixjQUFjLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUI7aUJBQ2pEO2FBQ0YsQ0FBQztTQUNILENBQUMsQ0FBQztRQUNILGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLDJCQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbEYsb0VBQW9FO1FBQ3BFLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsZUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUVELHFGQUFxRjtRQUNyRiwySEFBMkg7UUFDM0gsTUFBTSxVQUFVLEdBQUcsZ0JBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQzdCLGtDQUFrQztZQUNsQyxNQUFNO1lBQ04sS0FBSztZQUNMLE9BQU87WUFDUCxlQUFlO1lBQ2YsT0FBTyxDQUFDLGtCQUFrQjtTQUMzQixDQUFDLENBQUM7UUFDSCxNQUFNLFFBQVEsR0FBRyxnQkFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDM0IsNEJBQTRCO1lBQzVCLE1BQU07WUFDTiwwQkFBMEI7WUFDMUIsVUFBVTtZQUNWLHlCQUF5QjtZQUN6QixZQUFZO1NBQ2IsQ0FBQyxDQUFDO1FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDM0MsQ0FBQzs7QUE5U0gsd0VBK1NDOzs7QUErSEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0RHO0FBQ0gsTUFBYSxnQkFBaUIsU0FBUSxzQkFBUztJQXNCN0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE0QjtRQUNwRSw4RUFBOEU7UUFDOUUsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsSUFBSSxJQUFJLG9CQUFvQixDQUFDO1lBQ3RFLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxvQkFBb0I7WUFDaEQsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1lBQ2xDLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDdEIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLDRCQUE0QixFQUFFLEtBQUssQ0FBQyw0QkFBNEI7U0FDakUsQ0FBQyxDQUFDO1FBRUgsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBRWxGLGlCQUFpQjtRQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTFCLE1BQU0sT0FBTyxHQUFHLDJCQUFpQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6RSxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsZUFBZSxJQUFJLDBDQUEwQixDQUFDLHdCQUF3QixDQUFDO1FBQ3JHLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixJQUFJLHlDQUFrQixDQUFDLHFDQUFxQyxDQUFDO1FBRTlHLDJFQUEyRTtRQUMzRSxJQUFJLEtBQUssQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ3pDLENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksZ0JBQWdCLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUMvRCxNQUFNLEVBQUUsS0FBSyxDQUFDLGFBQWE7Z0JBQzNCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTthQUM3QixDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLG1GQUFtRjtZQUNuRixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksZ0JBQWdCLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUMvRCxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtnQkFDbEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO2FBQ25DLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDO1FBRXRELHFFQUFxRTtRQUNyRSxJQUFJLEtBQUssQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ3pDLENBQUM7YUFBTSxDQUFDO1lBQ04sdUNBQXVDO1lBQ3ZDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO2dCQUNqRSxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtnQkFDbEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO2FBQ25DLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxxRkFBcUY7UUFDckYsMkRBQTJEO1FBQzNELElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQztRQUMvQyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxnQ0FBZ0MsQ0FBQztnQkFDMUQsVUFBVSxFQUFFLEtBQUssQ0FBQyxtQkFBbUI7YUFDdEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELG1DQUFtQztRQUNuQyxNQUFNLEdBQUcsR0FBMkI7WUFDbEMsUUFBUSxFQUFFLE9BQU87WUFDakIsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsWUFBWTtZQUM3RSxvQkFBb0IsRUFBRSxLQUFLLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxXQUFXO1lBQ3BFLFlBQVksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQztZQUNoRSxHQUFHLDRCQUFnQixDQUFDLDJCQUEyQixDQUM3QyxLQUFLLENBQUMsbUJBQW1CLEVBQ3pCLGVBQWUsRUFDZixpQkFBaUIsRUFDakIsT0FBTyxDQUNSO1NBQ0YsQ0FBQztRQUVGLHFEQUFxRDtRQUNyRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixHQUFHLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO1FBQ3JELENBQUM7UUFFRCxxREFBcUQ7UUFDckQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVELHlEQUF5RDtRQUN6RCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekMsR0FBRyxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDdkUsR0FBRyxDQUFDLHFDQUFxQyxHQUFHLElBQUEsdURBQXlDLEVBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbkgsQ0FBQztRQUVELDZCQUE2QjtRQUM3QixNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDO1lBQzFDLEtBQUssRUFBRSxJQUFJO1lBQ1gsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1lBQzFCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixXQUFXLEVBQUUsR0FBRztZQUNoQixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDakMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLDRCQUE0QixFQUFFLEtBQUssQ0FBQyw0QkFBNEI7WUFDaEUsWUFBWSxFQUFFLEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWTtZQUNoRCxtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CO1lBQzdDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxtQkFBbUI7WUFDOUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDO1lBQy9ELGtCQUFrQixFQUFFLEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFlBQVk7WUFDbkUsZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFdBQVc7WUFDL0Qsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDbEgsaUNBQWlDLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUNyRSxDQUFDLENBQUMsSUFBQSx1REFBeUMsRUFBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7Z0JBQ3RFLENBQUMsQ0FBQyxTQUFTO1lBQ2IsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1NBQ25DLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQztRQUMxQyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQUM7UUFDakQsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDO1FBRTNDLHNFQUFzRTtRQUN0RSxJQUFJLGNBQWMsWUFBWSxvQkFBb0IsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLG9CQUFvQixDQUFDO1lBQ25ELElBQUksQ0FBQyxhQUFhLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQztZQUVsRCx3RUFBd0U7WUFDeEUsSUFBSSxJQUFJLENBQUMsT0FBTyxZQUFZLG9CQUFvQixFQUFFLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1lBQzFELENBQUM7UUFDSCxDQUFDO1FBRUQsa0NBQWtDO1FBQ2xDLEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFN0QsNkJBQTZCO1FBQzdCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdkQsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDOUIsK0RBQStEO2dCQUMvRCxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDcEQsQ0FBQztRQUNILENBQUM7UUFFRCw2QkFBNkI7UUFDN0IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhLENBQUMsS0FBNEI7UUFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN0RCxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0YsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDaEMsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqRCxJQUFJLGNBQWMsR0FBRyxDQUFDLElBQUksY0FBYyxHQUFHLEdBQUcsRUFBRSxDQUFDO2dCQUMvQyxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7WUFDckUsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ25ILE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztRQUNwRSxDQUFDO0lBQ0gsQ0FBQzs7QUFsTUgsNENBbU1DIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2UsIER1cmF0aW9uLCBGbiwgTmFtZXMsIFJlbW92YWxQb2xpY3ksIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHtcbiAgQXV0aG9yaXphdGlvblR5cGUsXG4gIENvZ25pdG9Vc2VyUG9vbHNBdXRob3JpemVyLFxuICBDb3JzLFxuICBFbmRwb2ludFR5cGUsXG4gIEdhdGV3YXlSZXNwb25zZSxcbiAgTGFtYmRhSW50ZWdyYXRpb24sXG4gIFJlc3BvbnNlVHlwZSxcbiAgUmVzdEFwaSxcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXknO1xuaW1wb3J0IHsgQ2ZuUnVudGltZSwgQ2ZuUnVudGltZUVuZHBvaW50IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWJlZHJvY2thZ2VudGNvcmUnO1xuaW1wb3J0IHsgVXNlclBvb2wsIFVzZXJQb29sQ2xpZW50LCBNZmEsIEFjY291bnRSZWNvdmVyeSwgVXNlclBvb2xDbGllbnRJZGVudGl0eVByb3ZpZGVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZ25pdG8nO1xuaW1wb3J0IHsgQXR0cmlidXRlVHlwZSwgQmlsbGluZ01vZGUsIElUYWJsZSwgU3RyZWFtVmlld1R5cGUsIFRhYmxlLCBUYWJsZUVuY3J5cHRpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGInO1xuaW1wb3J0IHsgSVNlY3VyaXR5R3JvdXAsIFNlY3VyaXR5R3JvdXAsIFN1Ym5ldFNlbGVjdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0IHsgRG9ja2VySW1hZ2VBc3NldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3ItYXNzZXRzJztcbmltcG9ydCB7IElHcmFudGFibGUsIFJvbGUsIFNlcnZpY2VQcmluY2lwYWwsIFBvbGljeVN0YXRlbWVudCwgRWZmZWN0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBJS2V5LCBLZXkgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB7IElGdW5jdGlvbiwgQXJjaGl0ZWN0dXJlLCBJTGF5ZXJWZXJzaW9uLCBMYXllclZlcnNpb24sIEZ1bmN0aW9uLCBDb2RlLCBSdW50aW1lIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBJQnVja2V0LCBCdWNrZXQsIEJ1Y2tldEVuY3J5cHRpb24sIEJsb2NrUHVibGljQWNjZXNzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQmFzZUFnZW50LCBCYXNlQWdlbnRQcm9wcyB9IGZyb20gJy4vYmFzZS1hZ2VudCc7XG5pbXBvcnQgeyBnZW5lcmF0ZUtub3dsZWRnZUJhc2VTeXN0ZW1Qcm9tcHRBZGRpdGlvbiB9IGZyb20gJy4vYmF0Y2gtYWdlbnQnO1xuaW1wb3J0IHsgRGVmYXVsdEFnZW50Q29uZmlnIH0gZnJvbSAnLi9kZWZhdWx0LWFnZW50LWNvbmZpZyc7XG5pbXBvcnQgeyBMYW1iZGFJYW1VdGlscywgUG93ZXJ0b29sc0NvbmZpZyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcyc7XG5pbXBvcnQgeyBEZWZhdWx0T2JzZXJ2YWJpbGl0eUNvbmZpZyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9vYnNlcnZhYmlsaXR5JztcbmltcG9ydCB7IEJlZHJvY2tNb2RlbFV0aWxzIH0gZnJvbSAnLi4vYmVkcm9jayc7XG5pbXBvcnQgeyBEZWZhdWx0UnVudGltZXMgfSBmcm9tICcuLi9jdXN0b20tcmVzb3VyY2UnO1xuaW1wb3J0IHsgTmV0d29yayB9IGZyb20gJy4uL2ZvdW5kYXRpb24nO1xuXG4vKipcbiAqIFN0cmF0ZWd5IGludGVyZmFjZSBmb3IgcGx1Z2dhYmxlIGNvbW11bmljYXRpb24gbWVjaGFuaXNtcy5cbiAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgU3RyZWFtaW5nSHR0cEFkYXB0ZXIgKEFQSSBHYXRld2F5IFJFU1QgQVBJIHdpdGggcmVzcG9uc2Ugc3RyZWFtaW5nKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ29tbXVuaWNhdGlvbkFkYXB0ZXIge1xuICAvKipcbiAgICogQXR0YWNoIHRoZSBhZGFwdGVyIHRvIGEgTGFtYmRhIGZ1bmN0aW9uIGFuZCBjcmVhdGUgY29tbXVuaWNhdGlvbiBpbmZyYXN0cnVjdHVyZS5cbiAgICogUmV0dXJucyB0aGUgcHVibGljIGVuZHBvaW50IFVSTCBmb3IgY2xpZW50IGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgYXR0YWNoVG9GdW5jdGlvbihsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgTGFtYmRhIGZ1bmN0aW9uIHBlcm1pc3Npb24gdG8gc2VuZCByZXNwb25zZXMgYmFjayB0byBjbGllbnRzLlxuICAgKi9cbiAgZ3JhbnRJbnZva2UobGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhyb3R0bGUgc2V0dGluZ3MgZm9yIFJFU1QgQVBJLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRocm90dGxlU2V0dGluZ3Mge1xuICAvKipcbiAgICogUmF0ZSBsaW1pdCAocmVxdWVzdHMgcGVyIHNlY29uZCkuXG4gICAqL1xuICByZWFkb25seSByYXRlTGltaXQ/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/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQWdlbnRDb3JlIFJ1bnRpbWUgaG9zdGluZyBhZGFwdGVyIGZvciBJbnRlcmFjdGl2ZUFnZW50LlxuICpcbiAqIERlcGxveXMgdGhlIGFnZW50IGFzIGEgY29udGFpbmVyIHJ1bm5pbmcgb24gQWdlbnRDb3JlIFJ1bnRpbWUgKG1pY3JvVk0pLlxuICogVXNlcyBMMSBjb25zdHJ1Y3RzIGBDZm5SdW50aW1lYCBhbmQgYENmblJ1bnRpbWVFbmRwb2ludGAgZnJvbVxuICogYGF3cy1jZGstbGliL2F3cy1iZWRyb2NrYWdlbnRjb3JlYC5cbiAqXG4gKiAjIyBBcmNoaXRlY3R1cmVcbiAqXG4gKiBgYGBcbiAqIENsaWVudCDihpIgQWdlbnRDb3JlIFJ1bnRpbWUgRW5kcG9pbnQg4oaSIENvbnRhaW5lciAoRmFzdEFQSSBvbiBwb3J0IDgwODApIOKGkiBCZWRyb2NrXG4gKiBgYGBcbiAqXG4gKiAjIyBGZWF0dXJlc1xuICpcbiAqIC0gKipTZXNzaW9uIElzb2xhdGlvbioqOiBtaWNyb1ZNIHByb3ZpZGVzIHBlci1zZXNzaW9uIGlzb2xhdGlvbiAobm8gUzMgc2Vzc2lvbiBidWNrZXQgbmVlZGVkKVxuICogLSAqKk1hbmFnZWQgSW5mcmFzdHJ1Y3R1cmUqKjogTm8gTGFtYmRhIGNvbGQgc3RhcnRzIG9yIHRpbWVvdXQgbGltaXRzXG4gKiAtICoqTXVsdGlwbGUgUHJvdG9jb2xzKio6IEhUVFAsIE1DUCwgb3IgQTJBIHByb3RvY29sIHN1cHBvcnRcbiAqIC0gKipDb250YWluZXItQmFzZWQqKjogU3RhbmRhcmQgRG9ja2VyIGltYWdlIGRlcGxveW1lbnRcbiAqIC0gKipWUEMgU3VwcG9ydCoqOiBSdW4gaW5zaWRlIGEgVlBDIHdpdGggcHJpdmF0ZSBzdWJuZXRzIGZvciBuZXR3b3JrIGlzb2xhdGlvblxuICpcbiAqICMjIFVzYWdlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbiAqIGltcG9ydCB7IEludGVyYWN0aXZlQWdlbnQsIEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlciwgTmV0d29ya01vZGUgfSBmcm9tICdAY2RrbGFicy9jZGstYXBwbW9kLWNhdGFsb2ctYmx1ZXByaW50cyc7XG4gKlxuICogZGVjbGFyZSBjb25zdCBteVByb21wdDogQXNzZXQ7XG4gKlxuICogbmV3IEludGVyYWN0aXZlQWdlbnQodGhpcywgJ0FnZW50Jywge1xuICogICBhZ2VudE5hbWU6ICdNeUNoYXRib3QnLFxuICogICBhZ2VudERlZmluaXRpb246IHsgYmVkcm9ja01vZGVsOiB7fSwgc3lzdGVtUHJvbXB0OiBteVByb21wdCB9LFxuICogICBob3N0aW5nQWRhcHRlcjogbmV3IEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlcih7XG4gKiAgICAgbmV0d29ya01vZGU6IE5ldHdvcmtNb2RlLlBVQkxJQyxcbiAqICAgfSksXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyIGltcGxlbWVudHMgSUhvc3RpbmdBZGFwdGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyUHJvcHM7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlclByb3BzID0ge30pIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIH1cblxuICBnZXQgc2VydmljZVByaW5jaXBhbCgpIHsgcmV0dXJuIG5ldyBTZXJ2aWNlUHJpbmNpcGFsKCdiZWRyb2NrLWFnZW50Y29yZS5hbWF6b25hd3MuY29tJyk7IH1cblxuICAvKipcbiAgICogRGVwbG95IEFnZW50Q29yZSBSdW50aW1lIGhvc3RpbmcgaW5mcmFzdHJ1Y3R1cmUuXG4gICAqL1xuICBkZXBsb3koY29uZmlnOiBBZ2VudEhvc3RpbmdDb25maWcpOiBBZ2VudEhvc3RpbmdSZXN1bHQge1xuICAgIGNvbnN0IHNjb3BlID0gY29uZmlnLnNjb3BlO1xuICAgIGNvbnN0IG5ldHdvcmtNb2RlID0gdGhpcy5wcm9wcy5uZXR3b3JrTW9kZSB8fCBOZXR3b3JrTW9kZS5QVUJMSUM7XG5cbiAgICAvLyBSZXNvbHZlIFZQQyBjb25maWd1cmF0aW9uIGZvciBWUEMgbmV0d29yayBtb2RlXG4gICAgbGV0IHJlc29sdmVkU3VibmV0SWRzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVzb2x2ZWRTZWN1cml0eUdyb3VwSWRzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChuZXR3b3JrTW9kZSA9PT0gTmV0d29ya01vZGUuVlBDKSB7XG4gICAgICAvLyBFeHBsaWNpdCBwcm9wcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBOZXR3b3JrIGNvbnN0cnVjdFxuICAgICAgaWYgKHRoaXMucHJvcHMudnBjU3VibmV0cyAmJiBjb25maWcubmV0d29yaykge1xuICAgICAgICByZXNvbHZlZFN1Ym5ldElkcyA9IGNvbmZpZy5uZXR3b3JrLnZwYy5zZWxlY3RTdWJuZXRzKHRoaXMucHJvcHMudnBjU3VibmV0cykuc3VibmV0SWRzO1xuICAgICAgfSBlbHNlIGlmIChjb25maWcubmV0d29yaykge1xuICAgICAgICBjb25zdCBzdWJuZXRzID0gY29uZmlnLm5ldHdvcmsudnBjLnNlbGVjdFN1Ym5ldHMoXG4gICAgICAgICAgY29uZmlnLm5ldHdvcmsuYXBwbGljYXRpb25TdWJuZXRTZWxlY3Rpb24oKSxcbiAgICAgICAgKS5zdWJuZXRJZHM7XG4gICAgICAgIHJlc29sdmVkU3VibmV0SWRzID0gc3VibmV0cztcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucHJvcHMuc2VjdXJpdHlHcm91cHMpIHtcbiAgICAgICAgcmVzb2x2ZWRTZWN1cml0eUdyb3VwSWRzID0gdGhpcy5wcm9wcy5zZWN1cml0eUdyb3Vwcy5tYXAoc2cgPT4gc2cuc2VjdXJpdHlHcm91cElkKTtcbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnLm5ldHdvcmspIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgc2VjdXJpdHkgZ3JvdXAgZm9yIHRoZSBBZ2VudENvcmUgcnVudGltZSBFTklzXG4gICAgICAgIGNvbnN0IHNnID0gbmV3IFNlY3VyaXR5R3JvdXAoc2NvcGUsICdBZ2VudENvcmVSdW50aW1lU0cnLCB7XG4gICAgICAgICAgdnBjOiBjb25maWcubmV0d29yay52cGMsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdTZWN1cml0eSBncm91cCBmb3IgQWdlbnRDb3JlIFJ1bnRpbWUgRU5JcycsXG4gICAgICAgICAgYWxsb3dBbGxPdXRib3VuZDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc29sdmVkU2VjdXJpdHlHcm91cElkcyA9IFtzZy5zZWN1cml0eUdyb3VwSWRdO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJlc29sdmVkU3VibmV0SWRzIHx8IHJlc29sdmVkU3VibmV0SWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1ZQQyBuZXR3b3JrIG1vZGUgcmVxdWlyZXMgc3VibmV0cyB0byBiZSBwcm92aWRlZCBlaXRoZXIgdmlhICcgK1xuICAgICAgICAgICdBZ2VudENvcmVSdW50aW1lSG9zdGluZ0FkYXB0ZXJQcm9wcy52cGNTdWJuZXRzICh3aXRoIGEgTmV0d29yayBjb25zdHJ1Y3QpICcgK1xuICAgICAgICAgICdvciB2aWEgYSBOZXR3b3JrIGNvbnN0cnVjdCBpbiBBZ2VudEhvc3RpbmdDb25maWcubmV0d29yay4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCFyZXNvbHZlZFNlY3VyaXR5R3JvdXBJZHMgfHwgcmVzb2x2ZWRTZWN1cml0eUdyb3VwSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1ZQQyBuZXR3b3JrIG1vZGUgcmVxdWlyZXMgc2VjdXJpdHkgZ3JvdXBzIHRvIGJlIHByb3ZpZGVkIGVpdGhlciB2aWEgJyArXG4gICAgICAgICAgJ0FnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlclByb3BzLnNlY3VyaXR5R3JvdXBzIG9yIHZpYSBhIE5ldHdvcmsgY29uc3RydWN0ICcgK1xuICAgICAgICAgICdpbiBBZ2VudEhvc3RpbmdDb25maWcubmV0d29yay4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJ1aWxkIG9yIHJlZmVyZW5jZSBjb250YWluZXIgaW1hZ2VcbiAgICBsZXQgY29udGFpbmVyVXJpOiBzdHJpbmc7XG4gICAgaWYgKHRoaXMucHJvcHMuY29udGFpbmVySW1hZ2VVcmkpIHtcbiAgICAgIGNvbnRhaW5lclVyaSA9IHRoaXMucHJvcHMuY29udGFpbmVySW1hZ2VVcmk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhhbmRsZXJQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ3Jlc291cmNlcy9hZ2VudGNvcmUtYWdlbnQtaGFuZGxlcicpO1xuICAgICAgY29uc3QgaW1hZ2VBc3NldCA9IG5ldyBEb2NrZXJJbWFnZUFzc2V0KHNjb3BlLCAnQWdlbnRDb3JlSGFuZGxlckltYWdlJywge1xuICAgICAgICBkaXJlY3Rvcnk6IGhhbmRsZXJQYXRoLFxuICAgICAgfSk7XG4gICAgICBjb250YWluZXJVcmkgPSBpbWFnZUFzc2V0LmltYWdlVXJpO1xuICAgIH1cblxuICAgIC8vIFJldXNlIHRoZSBzaW5nbGUgYWdlbnRSb2xlIChhbHJlYWR5IGhhcyBiZWRyb2NrLWFnZW50Y29yZSB0cnVzdCBmcm9tIEJhc2VBZ2VudCkuXG4gICAgLy8gT25seSBhZGQgRUNSIHB1bGwgcGVybWlzc2lvbnMg4oCUIGFsbCBvdGhlciBwZXJtaXNzaW9ucyAoQmVkcm9jayBJbnZva2VNb2RlbCxcbiAgICAvLyBTMyB0b29sIGFzc2V0cywgS0IgYWNjZXNzLCBzZXNzaW9uIGJ1Y2tldCwgb2JzZXJ2YWJpbGl0eSkgYXJlIGFscmVhZHkgZ3JhbnRlZFxuICAgIC8vIGJ5IEJhc2VBZ2VudCBvbiBjb25maWcuYWdlbnRSb2xlLlxuICAgIGNvbnN0IGVjclBvbGljeVJlc3VsdCA9IGNvbmZpZy5hZ2VudFJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgJ2VjcjpHZXREb3dubG9hZFVybEZvckxheWVyJyxcbiAgICAgICAgJ2VjcjpCYXRjaEdldEltYWdlJyxcbiAgICAgICAgJ2VjcjpHZXRBdXRob3JpemF0aW9uVG9rZW4nLFxuICAgICAgXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSkpO1xuXG4gICAgLy8gQWRkIEFET1Qgb2JzZXJ2YWJpbGl0eSBwZXJtaXNzaW9ucyB3aGVuIGVuYWJsZWQuXG4gICAgLy8gVGhlIGNvbnRhaW5lciBEb2NrZXJmaWxlIHVzZXMgYG9wZW50ZWxlbWV0cnktaW5zdHJ1bWVudGAgYXMgaXRzIENNRCB3cmFwcGVyO1xuICAgIC8vIEFET1QgbmVlZHMgdGhlc2UgcGVybWlzc2lvbnMgdG8gZXhwb3J0IHRyYWNlcywgbG9ncywgYW5kIG1ldHJpY3MgZnJvbSB0aGUgY29udGFpbmVyLlxuICAgIC8vIE5vdGU6IFdlIHVzZSBleHBsaWNpdCBzdGF0ZW1lbnRzIGluc3RlYWQgb2YgQ2xvdWRXYXRjaExhbWJkYUFwcGxpY2F0aW9uU2lnbmFsc0V4ZWN1dGlvblJvbGVQb2xpY3lcbiAgICAvLyBiZWNhdXNlIHRoYXQgbWFuYWdlZCBwb2xpY3kgb25seSBjb3ZlcnMgL2F3cy9hcHBsaWNhdGlvbi1zaWduYWxzL2RhdGEgbG9nIGdyb3VwXG4gICAgLy8gYW5kIG1pc3NlcyBwZXJtaXNzaW9ucyBBRE9UIG5lZWRzIChEZXNjcmliZUxvZ0dyb3VwcywgRGVzY3JpYmVMb2dTdHJlYW1zLCBQdXRNZXRyaWNEYXRhKS5cbiAgICBpZiAoY29uZmlnLmVuYWJsZU9ic2VydmFiaWxpdHkpIHtcbiAgICAgIGNvbmZpZy5hZ2VudFJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2xvZ3M6RGVzY3JpYmVMb2dHcm91cHMnLFxuICAgICAgICAgICdsb2dzOkRlc2NyaWJlTG9nU3RyZWFtcycsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICB9KSk7XG4gICAgICBjb25maWcuYWdlbnRSb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdjbG91ZHdhdGNoOlB1dE1ldHJpY0RhdGEnLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGNvbnRhaW5lclxuICAgIGNvbnN0IHsgcmVnaW9uLCBhY2NvdW50IH0gPSBTdGFjay5vZihzY29wZSk7XG4gICAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIC8vIFVubGlrZSBMYW1iZGEsIEFnZW50Q29yZSBjb250YWluZXJzIGRvbid0IGdldCBBV1NfUkVHSU9OIGF1dG9tYXRpY2FsbHkuXG4gICAgICAvLyBib3RvMyBhbmQgb3RoZXIgQVdTIFNES3MgbmVlZCBpdCB0byBtYWtlIEFQSSBjYWxscy5cbiAgICAgIEFXU19SRUdJT046IHJlZ2lvbixcbiAgICAgIEFXU19ERUZBVUxUX1JFR0lPTjogcmVnaW9uLFxuICAgIH07XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmVudmlyb25tZW50KSkge1xuICAgICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gTm90ZTogQUdFTlRfT0JTRVJWQUJJTElUWV9FTkFCTEVEIGFuZCBPVEVMXyogZW52IHZhcnMgYXJlIE5PVCBzZXQgaGVyZS5cbiAgICAvLyBGb3IgQWdlbnRDb3JlLWhvc3RlZCBhZ2VudHMsIHRoZSBBRE9UIGF1dG8taW5zdHJ1bWVudGF0aW9uIHZpYVxuICAgIC8vIGBvcGVudGVsZW1ldHJ5LWluc3RydW1lbnRgIGluIHRoZSBEb2NrZXJmaWxlIENNRCBoYW5kbGVzIHRyYWNlL3NwYW5cbiAgICAvLyBleHBvcnQgYXV0b21hdGljYWxseS4gVGhlc2UgZW52IHZhcnMgYXJlIG9ubHkgbmVlZGVkIGZvciBhZ2VudHNcbiAgICAvLyBob3N0ZWQgb3V0c2lkZSBvZiBBZ2VudENvcmUuXG5cbiAgICAvLyBCdWlsZCBuZXR3b3JrIGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBuZXR3b3JrQ29uZmlndXJhdGlvbjogYW55ID0ge1xuICAgICAgbmV0d29ya01vZGUsXG4gICAgfTtcblxuICAgIC8vIEJ1aWxkIGF1dGhvcml6YXRpb24gY29uZmlndXJhdGlvbiBpZiBKV1QgYXV0aG9yaXplciBpcyBzcGVjaWZpZWRcbiAgICBjb25zdCBhdXRoQ29uZmlnID0gdGhpcy5wcm9wcy5jdXN0b21Kd3RBdXRob3JpemVyID8ge1xuICAgICAgY3VzdG9tSnd0QXV0aG9yaXplcjoge1xuICAgICAgICBkaXNjb3ZlcnlVcmw6IHRoaXMucHJvcHMuY3VzdG9tSnd0QXV0aG9yaXplci5kaXNjb3ZlcnlVcmwsXG4gICAgICAgIGFsbG93ZWRBdWRpZW5jZTogdGhpcy5wcm9wcy5jdXN0b21Kd3RBdXRob3JpemVyLmFsbG93ZWRBdWRpZW5jZSxcbiAgICAgICAgYWxsb3dlZENsaWVudHM6IHRoaXMucHJvcHMuY3VzdG9tSnd0QXV0aG9yaXplci5hbGxvd2VkQ2xpZW50cyxcbiAgICAgIH0sXG4gICAgfSA6IHVuZGVmaW5lZDtcblxuICAgIC8vIENyZWF0ZSBDZm5SdW50aW1lXG4gICAgY29uc3QgcnVudGltZSA9IG5ldyBDZm5SdW50aW1lKHNjb3BlLCAnQWdlbnRDb3JlUnVudGltZScsIHtcbiAgICAgIGFnZW50UnVudGltZU5hbWU6IGAke2NvbmZpZy5hZ2VudE5hbWUucmVwbGFjZSgvLS9nLCAnXycpfV9ydW50aW1lYCxcbiAgICAgIGFnZW50UnVudGltZUFydGlmYWN0OiB7XG4gICAgICAgIGNvbnRhaW5lckNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBjb250YWluZXJVcmksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcm9sZUFybjogY29uZmlnLmFnZW50Um9sZS5yb2xlQXJuLFxuICAgICAgbmV0d29ya0NvbmZpZ3VyYXRpb24sXG4gICAgICBhdXRob3JpemVyQ29uZmlndXJhdGlvbjogYXV0aENvbmZpZyxcbiAgICAgIGVudmlyb25tZW50VmFyaWFibGVzOiBlbnZWYXJzLFxuICAgIH0pO1xuXG4gICAgcnVudGltZS5hcHBseVJlbW92YWxQb2xpY3koY29uZmlnLnJlbW92YWxQb2xpY3kgfHwgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcblxuICAgIC8vIFdoZW4gSldUIGF1dGggaXMgY29uZmlndXJlZCwgYWxsb3dsaXN0IHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBzbyB0aGVcbiAgICAvLyBjb250YWluZXIgY2FuIGV4dHJhY3QgdXNlciBpZGVudGl0eSBjbGFpbXMgZnJvbSB0aGUgZm9yd2FyZGVkIEpXVCB0b2tlbi5cbiAgICAvLyBTZWU6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9iZWRyb2NrLWFnZW50Y29yZS9sYXRlc3QvZGV2Z3VpZGUvcnVudGltZS1vYXV0aC5odG1sI29hdXRoLXByb3BhZ2F0ZS1qd3QtdG9rZW5cbiAgICBpZiAodGhpcy5wcm9wcy5jdXN0b21Kd3RBdXRob3JpemVyKSB7XG4gICAgICBydW50aW1lLmFkZFByb3BlcnR5T3ZlcnJpZGUoJ1JlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uJywge1xuICAgICAgICBSZXF1ZXN0SGVhZGVyQWxsb3dsaXN0OiBbJ0F1dGhvcml6YXRpb24nXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFdoZW4gVlBDIG1vZGUgaXMgY29uZmlndXJlZCwgc2V0IHRoZSBOZXR3b3JrTW9kZUNvbmZpZyB3aXRoIHN1Ym5ldHMgYW5kXG4gICAgLy8gc2VjdXJpdHkgZ3JvdXBzIHZpYSBwcm9wZXJ0eSBvdmVycmlkZS4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBDREsgMi4yMTguMFxuICAgIC8vIGRvZXMgbm90IHlldCBoYXZlIHR5cGVkIHN1cHBvcnQgZm9yIE5ldHdvcmtNb2RlQ29uZmlnIChhZGRlZCBpbiAyLjI0MC4wKS5cbiAgICAvLyBTZWU6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9iZWRyb2NrLWFnZW50Y29yZS9sYXRlc3QvZGV2Z3VpZGUvYWdlbnRjb3JlLXZwYy5odG1sXG4gICAgaWYgKG5ldHdvcmtNb2RlID09PSBOZXR3b3JrTW9kZS5WUEMgJiYgcmVzb2x2ZWRTdWJuZXRJZHMgJiYgcmVzb2x2ZWRTZWN1cml0eUdyb3VwSWRzKSB7XG4gICAgICBydW50aW1lLmFkZFByb3BlcnR5T3ZlcnJpZGUoJ05ldHdvcmtDb25maWd1cmF0aW9uLk5ldHdvcmtNb2RlQ29uZmlnJywge1xuICAgICAgICBTdWJuZXRzOiByZXNvbHZlZFN1Ym5ldElkcyxcbiAgICAgICAgU2VjdXJpdHlHcm91cHM6IHJlc29sdmVkU2VjdXJpdHlHcm91cElkcyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBDZm5SdW50aW1lIHdhaXRzIGZvciB0aGUgcm9sZSBhbmQgaXRzIHBvbGljaWVzIHRvIGJlIGZ1bGx5IGNyZWF0ZWQvdXBkYXRlZC5cbiAgICAvLyBXaXRob3V0IHRoaXMsIENsb3VkRm9ybWF0aW9uIG1heSB2YWxpZGF0ZSB0aGUgcm9sZSBiZWZvcmU6XG4gICAgLy8gLSBUaGUgdHJ1c3QgcG9saWN5IGlzIHVwZGF0ZWQgdG8gYmVkcm9jay1hZ2VudGNvcmUuYW1hem9uYXdzLmNvbSAoZHVyaW5nIHN0YWNrIHVwZGF0ZXMpXG4gICAgLy8gLSBUaGUgRUNSIHBlcm1pc3Npb25zIHBvbGljeSBpcyBhdHRhY2hlZFxuICAgIHJ1bnRpbWUubm9kZS5hZGREZXBlbmRlbmN5KGNvbmZpZy5hZ2VudFJvbGUpO1xuICAgIGlmIChlY3JQb2xpY3lSZXN1bHQucG9saWN5RGVwZW5kYWJsZSkge1xuICAgICAgcnVudGltZS5ub2RlLmFkZERlcGVuZGVuY3koZWNyUG9saWN5UmVzdWx0LnBvbGljeURlcGVuZGFibGUpO1xuICAgIH1cblxuICAgIC8vIEluIFZQQyBtb2RlLCB0aGUgQWdlbnRDb3JlIHJ1bnRpbWUgdGFrZXMgbG9uZ2VyIHRvIHByb3Zpc2lvbiAoRU5JIGNyZWF0aW9uLFxuICAgIC8vIHN1Ym5ldCBhdHRhY2htZW50KSBidXQgQ2xvdWRGb3JtYXRpb24gbWFya3MgQ2ZuUnVudGltZSBhcyBDUkVBVEVfQ09NUExFVEVcbiAgICAvLyBiZWZvcmUgdGhlIHJ1bnRpbWUgcmVhY2hlcyBSRUFEWSBzdGF0dXMuIEluc2VydCBhIGN1c3RvbSByZXNvdXJjZSB3YWl0ZXJcbiAgICAvLyB0aGF0IHBvbGxzIEdldEFnZW50UnVudGltZSB1bnRpbCBzdGF0dXMgaXMgUkVBRFkgYmVmb3JlIGNyZWF0aW5nIHRoZSBlbmRwb2ludC5cbiAgICBsZXQgcnVudGltZVdhaXRlcjogQ3VzdG9tUmVzb3VyY2UgfCB1bmRlZmluZWQ7XG4gICAgaWYgKG5ldHdvcmtNb2RlID09PSBOZXR3b3JrTW9kZS5WUEMpIHtcbiAgICAgIGNvbnN0IHVuaXF1ZVN1ZmZpeCA9IE5hbWVzLnVuaXF1ZUlkKHJ1bnRpbWUpLnNsaWNlKC04KS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBjb25zdCB3YWl0ZXJGbiA9IG5ldyBGdW5jdGlvbihzY29wZSwgJ1J1bnRpbWVSZWFkeVdhaXRlckZuJywge1xuICAgICAgICBmdW5jdGlvbk5hbWU6IGAke2NvbmZpZy5hZ2VudE5hbWV9LXJ0LXdhaXRlci0ke3VuaXF1ZVN1ZmZpeH1gLFxuICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShbXG4gICAgICAgICAgJ2NvbnN0IGh0dHBzID0gcmVxdWlyZShcImh0dHBzXCIpOycsXG4gICAgICAgICAgJ2NvbnN0IHVybCA9IHJlcXVpcmUoXCJ1cmxcIik7JyxcbiAgICAgICAgICAnY29uc3QgeyBCZWRyb2NrQWdlbnRDb3JlQ29udHJvbENsaWVudCwgR2V0QWdlbnRSdW50aW1lQ29tbWFuZCB9ID0gcmVxdWlyZShcIkBhd3Mtc2RrL2NsaWVudC1iZWRyb2NrLWFnZW50Y29yZS1jb250cm9sXCIpOycsXG4gICAgICAgICAgJ2Z1bmN0aW9uIHNlbmRSZXNwb25zZShldmVudCwgY29udGV4dCwgc3RhdHVzLCBkYXRhLCByZWFzb24pIHsnLFxuICAgICAgICAgICcgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeSh7JyxcbiAgICAgICAgICAnICAgIFN0YXR1czogc3RhdHVzLCcsXG4gICAgICAgICAgJyAgICBSZWFzb246IHJlYXNvbiB8fCBcIlNlZSBDbG91ZFdhdGNoIExvZyBTdHJlYW06IFwiICsgY29udGV4dC5sb2dTdHJlYW1OYW1lLCcsXG4gICAgICAgICAgJyAgICBQaHlzaWNhbFJlc291cmNlSWQ6IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5BZ2VudFJ1bnRpbWVJZCB8fCBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCwnLFxuICAgICAgICAgICcgICAgU3RhY2tJZDogZXZlbnQuU3RhY2tJZCwnLFxuICAgICAgICAgICcgICAgUmVxdWVzdElkOiBldmVudC5SZXF1ZXN0SWQsJyxcbiAgICAgICAgICAnICAgIExvZ2ljYWxSZXNvdXJjZUlkOiBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCwnLFxuICAgICAgICAgICcgICAgRGF0YTogZGF0YSB8fCB7fSwnLFxuICAgICAgICAgICcgIH0pOycsXG4gICAgICAgICAgJyAgY29uc3QgcGFyc2VkID0gdXJsLnBhcnNlKGV2ZW50LlJlc3BvbnNlVVJMKTsnLFxuICAgICAgICAgICcgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7JyxcbiAgICAgICAgICAnICAgIGNvbnN0IHJlcSA9IGh0dHBzLnJlcXVlc3QoeyBob3N0bmFtZTogcGFyc2VkLmhvc3RuYW1lLCBwYXRoOiBwYXJzZWQucGF0aCwgbWV0aG9kOiBcIlBVVFwiLCcsXG4gICAgICAgICAgJyAgICAgIGhlYWRlcnM6IHsgXCJjb250ZW50LXR5cGVcIjogXCJcIiwgXCJjb250ZW50LWxlbmd0aFwiOiBib2R5Lmxlbmd0aCB9IH0sIHJlc29sdmUpOycsXG4gICAgICAgICAgJyAgICByZXEub24oXCJlcnJvclwiLCByZWplY3QpOycsXG4gICAgICAgICAgJyAgICByZXEud3JpdGUoYm9keSk7JyxcbiAgICAgICAgICAnICAgIHJlcS5lbmQoKTsnLFxuICAgICAgICAgICcgIH0pOycsXG4gICAgICAgICAgJ30nLFxuICAgICAgICAgICdleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoZXZlbnQsIGNvbnRleHQpID0+IHsnLFxuICAgICAgICAgICcgIHRyeSB7JyxcbiAgICAgICAgICAnICAgIGlmIChldmVudC5SZXF1ZXN0VHlwZSA9PT0gXCJEZWxldGVcIikgeyBhd2FpdCBzZW5kUmVzcG9uc2UoZXZlbnQsIGNvbnRleHQsIFwiU1VDQ0VTU1wiLCB7fSk7IHJldHVybjsgfScsXG4gICAgICAgICAgJyAgICBjb25zdCBjbGllbnQgPSBuZXcgQmVkcm9ja0FnZW50Q29yZUNvbnRyb2xDbGllbnQoKTsnLFxuICAgICAgICAgICcgICAgY29uc3QgcnVudGltZUlkID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkFnZW50UnVudGltZUlkOycsXG4gICAgICAgICAgJyAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQwOyBpKyspIHsnLFxuICAgICAgICAgICcgICAgICBjb25zdCByZXNwID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IEdldEFnZW50UnVudGltZUNvbW1hbmQoeyBhZ2VudFJ1bnRpbWVJZDogcnVudGltZUlkIH0pKTsnLFxuICAgICAgICAgICcgICAgICBjb25zdCBzdGF0dXMgPSByZXNwLnN0YXR1cyB8fCByZXNwLmFnZW50UnVudGltZVN0YXR1czsnLFxuICAgICAgICAgICcgICAgICBjb25zb2xlLmxvZyhgQXR0ZW1wdCAke2kgKyAxfTogcnVudGltZSBzdGF0dXMgPSAke3N0YXR1c31gKTsnLFxuICAgICAgICAgICcgICAgICBpZiAoc3RhdHVzID09PSBcIlJFQURZXCIpIHsgYXdhaXQgc2VuZFJlc3BvbnNlKGV2ZW50LCBjb250ZXh0LCBcIlNVQ0NFU1NcIiwgeyBTdGF0dXM6IHN0YXR1cyB9KTsgcmV0dXJuOyB9JyxcbiAgICAgICAgICAnICAgICAgaWYgKHN0YXR1cyA9PT0gXCJGQUlMRURcIikgeyBhd2FpdCBzZW5kUmVzcG9uc2UoZXZlbnQsIGNvbnRleHQsIFwiRkFJTEVEXCIsIHt9LCBcIlJ1bnRpbWUgZW50ZXJlZCBGQUlMRUQgc3RhdHVzXCIpOyByZXR1cm47IH0nLFxuICAgICAgICAgICcgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgMTUwMDApKTsnLFxuICAgICAgICAgICcgICAgfScsXG4gICAgICAgICAgJyAgICBhd2FpdCBzZW5kUmVzcG9uc2UoZXZlbnQsIGNvbnRleHQsIFwiRkFJTEVEXCIsIHt9LCBcIlRpbWVkIG91dCB3YWl0aW5nIGZvciBydW50aW1lIFJFQURZIHN0YXR1c1wiKTsnLFxuICAgICAgICAgICcgIH0gY2F0Y2ggKGUpIHsnLFxuICAgICAgICAgICcgICAgY29uc29sZS5lcnJvcihlKTsnLFxuICAgICAgICAgICcgICAgYXdhaXQgc2VuZFJlc3BvbnNlKGV2ZW50LCBjb250ZXh0LCBcIkZBSUxFRFwiLCB7fSwgZS5tZXNzYWdlKTsnLFxuICAgICAgICAgICcgIH0nLFxuICAgICAgICAgICd9OycsXG4gICAgICAgIF0uam9pbignXFxuJykpLFxuICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDEyKSxcbiAgICAgIH0pO1xuXG4gICAgICB3YWl0ZXJGbi5hZGRUb1JvbGVQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbJ2JlZHJvY2stYWdlbnRjb3JlOkdldEFnZW50UnVudGltZSddLFxuICAgICAgICByZXNvdXJjZXM6IFtTdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgICAgICBzZXJ2aWNlOiAnYmVkcm9jay1hZ2VudGNvcmUnLFxuICAgICAgICAgIHJlc291cmNlOiAncnVudGltZScsXG4gICAgICAgICAgcmVzb3VyY2VOYW1lOiAnKicsXG4gICAgICAgIH0pXSxcbiAgICAgIH0pKTtcblxuICAgICAgcnVudGltZVdhaXRlciA9IG5ldyBDdXN0b21SZXNvdXJjZShzY29wZSwgJ1J1bnRpbWVSZWFkeVdhaXRlcicsIHtcbiAgICAgICAgc2VydmljZVRva2VuOiB3YWl0ZXJGbi5mdW5jdGlvbkFybixcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIEFnZW50UnVudGltZUlkOiBydW50aW1lLnJlZixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcnVudGltZVdhaXRlci5ub2RlLmFkZERlcGVuZGVuY3kocnVudGltZSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIENmblJ1bnRpbWVFbmRwb2ludFxuICAgIGNvbnN0IGVuZHBvaW50TmFtZSA9IHRoaXMucHJvcHMuZW5kcG9pbnROYW1lIHx8IGAke2NvbmZpZy5hZ2VudE5hbWUucmVwbGFjZSgvLS9nLCAnXycpfV9lbmRwb2ludGA7XG4gICAgY29uc3QgcnVudGltZUVuZHBvaW50ID0gbmV3IENmblJ1bnRpbWVFbmRwb2ludChzY29wZSwgJ0FnZW50Q29yZVJ1bnRpbWVFbmRwb2ludCcsIHtcbiAgICAgIGFnZW50UnVudGltZUlkOiBydW50aW1lLnJlZixcbiAgICAgIGFnZW50UnVudGltZVZlcnNpb246IHJ1bnRpbWUuYXR0ckFnZW50UnVudGltZVZlcnNpb24sXG4gICAgICBuYW1lOiBlbmRwb2ludE5hbWUsXG4gICAgICAuLi4odGhpcy5wcm9wcy5wcm90b2NvbENvbmZpZ3VyYXRpb24gJiYge1xuICAgICAgICBwcm90b2NvbENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBzZXJ2ZXJQcm90b2NvbDogdGhpcy5wcm9wcy5wcm90b2NvbENvbmZpZ3VyYXRpb24sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICBydW50aW1lRW5kcG9pbnQuYXBwbHlSZW1vdmFsUG9saWN5KGNvbmZpZy5yZW1vdmFsUG9saWN5IHx8IFJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG5cbiAgICAvLyBFbnN1cmUgdGhlIGVuZHBvaW50IHdhaXRzIGZvciB0aGUgcnVudGltZSB0byBiZSBSRUFEWSBpbiBWUEMgbW9kZVxuICAgIGlmIChydW50aW1lV2FpdGVyKSB7XG4gICAgICBydW50aW1lRW5kcG9pbnQubm9kZS5hZGREZXBlbmRlbmN5KHJ1bnRpbWVXYWl0ZXIpO1xuICAgIH1cblxuICAgIC8vIENvbnN0cnVjdCB0aGUgZnVsbCBpbnZvY2F0aW9uIFVSTCBmb3IgZGlyZWN0IEhUVFBTIGFjY2VzcyAocmVxdWlyZWQgZm9yIEpXVCBhdXRoKS5cbiAgICAvLyBGb3JtYXQ6IGh0dHBzOi8vYmVkcm9jay1hZ2VudGNvcmUue3JlZ2lvbn0uYW1hem9uYXdzLmNvbS9ydW50aW1lcy97VVJMLWVuY29kZWQtQVJOfS9pbnZvY2F0aW9ucz9xdWFsaWZpZXI9e2VuZHBvaW50TmFtZX1cbiAgICBjb25zdCBlbmNvZGVkQXJuID0gRm4uam9pbignJywgW1xuICAgICAgJ2FybiUzQWF3cyUzQWJlZHJvY2stYWdlbnRjb3JlJTNBJyxcbiAgICAgIHJlZ2lvbixcbiAgICAgICclM0EnLFxuICAgICAgYWNjb3VudCxcbiAgICAgICclM0FydW50aW1lJTJGJyxcbiAgICAgIHJ1bnRpbWUuYXR0ckFnZW50UnVudGltZUlkLFxuICAgIF0pO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gRm4uam9pbignJywgW1xuICAgICAgJ2h0dHBzOi8vYmVkcm9jay1hZ2VudGNvcmUuJyxcbiAgICAgIHJlZ2lvbixcbiAgICAgICcuYW1hem9uYXdzLmNvbS9ydW50aW1lcy8nLFxuICAgICAgZW5jb2RlZEFybixcbiAgICAgICcvaW52b2NhdGlvbnM/cXVhbGlmaWVyPScsXG4gICAgICBlbmRwb2ludE5hbWUsXG4gICAgXSk7XG5cbiAgICByZXR1cm4geyBlbmRwb2ludCwgY2ZuUnVudGltZTogcnVudGltZSB9O1xuICB9XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBJbnRlcmFjdGl2ZUFnZW50LlxuICpcbiAqIEV4dGVuZHMgQmFzZUFnZW50UHJvcHMgd2l0aCBjb21tdW5pY2F0aW9uLCBzZXNzaW9uLCBjb250ZXh0LCBhbmQgYXV0aGVudGljYXRpb25cbiAqIHN0cmF0ZWd5IGludGVyZmFjZXMgZm9yIGJ1aWxkaW5nIHJlYWwtdGltZSBjb252ZXJzYXRpb25hbCBBSSBhZ2VudHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJhY3RpdmVBZ2VudFByb3BzIGV4dGVuZHMgQmFzZUFnZW50UHJvcHMge1xuICAvKipcbiAgICogSG9zdGluZyBhZGFwdGVyIGZvciBkZXBsb3lpbmcgdGhlIGFnZW50IHJ1bnRpbWUuXG4gICAqXG4gICAqIFVzZSBgTGFtYmRhSG9zdGluZ0FkYXB0ZXJgIGZvciBMYW1iZGEgKyBBUEkgR2F0ZXdheSAoZGVmYXVsdCkgb3JcbiAgICogYEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlcmAgZm9yIEFnZW50Q29yZSBSdW50aW1lIGhvc3RpbmcuXG4gICAqXG4gICAqIFdoZW4gcHJvdmlkZWQsIGBjb21tdW5pY2F0aW9uQWRhcHRlcmAsIGBhdXRoZW50aWNhdG9yYCwgYG1lbW9yeVNpemVgLFxuICAgKiBgdGltZW91dGAsIGBhcmNoaXRlY3R1cmVgLCBhbmQgYHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnNgIHByb3BzXG4gICAqIGFyZSBpZ25vcmVkIChjb25maWd1cmUgdGhlbSBvbiB0aGUgYWRhcHRlciBkaXJlY3RseSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IExhbWJkYUhvc3RpbmdBZGFwdGVyXG4gICAqL1xuICByZWFkb25seSBob3N0aW5nQWRhcHRlcj86IElIb3N0aW5nQWRhcHRlcjtcbiAgLyoqXG4gICAqIENvbW11bmljYXRpb24gYWRhcHRlciBmb3IgY2xpZW50LWFnZW50IGludGVyYWN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBTdHJlYW1pbmdIdHRwQWRhcHRlciB3aXRoIENvZ25pdG9BdXRoZW50aWNhdG9yXG4gICAqL1xuICByZWFkb25seSBjb21tdW5pY2F0aW9uQWRhcHRlcj86IElDb21tdW5pY2F0aW9uQWRhcHRlcjtcblxuICAvKipcbiAgICogU2Vzc2lvbiBzdG9yZSBmb3IgcGVyc2lzdGluZyBjb252ZXJzYXRpb24gc3RhdGUuXG4gICAqIFNldCB0byB1bmRlZmluZWQgdG8gZGlzYWJsZSBzZXNzaW9uIHBlcnNpc3RlbmNlIChzdGF0ZWxlc3MgbW9kZSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFMzU2Vzc2lvbk1hbmFnZXIgd2l0aCAyNC1ob3VyIFRUTFxuICAgKiBAZGVwcmVjYXRlZCBTZXNzaW9uIG1hbmFnZW1lbnQgaXMgbm93IGhhbmRsZWQgYnkgU3RyYW5kcy1uYXRpdmUgYFMzU2Vzc2lvbk1hbmFnZXJgLlxuICAgKiBBbiBTMyBidWNrZXQgaXMgYWx3YXlzIGNyZWF0ZWQgYW5kIHBhc3NlZCBhcyBgU0VTU0lPTl9CVUNLRVRgIGVudiB2YXIuXG4gICAqL1xuICByZWFkb25seSBzZXNzaW9uU3RvcmU/OiBJU2Vzc2lvblN0b3JlO1xuXG4gIC8qKlxuICAgKiBTMyBidWNrZXQgZm9yIHNlc3Npb24gc3RvcmFnZSAoc2hvcnRoYW5kIGZvciBTM1Nlc3Npb25NYW5hZ2VyKS5cbiAgICogSWdub3JlZCBpZiBzZXNzaW9uU3RvcmUgaXMgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IEF1dG8tY3JlYXRlZCBidWNrZXRcbiAgICovXG4gIHJlYWRvbmx5IHNlc3Npb25CdWNrZXQ/OiBJQnVja2V0O1xuXG4gIC8qKlxuICAgKiBUaW1lLXRvLWxpdmUgZm9yIHNlc3Npb25zLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5ob3VycygyNClcbiAgICovXG4gIHJlYWRvbmx5IHNlc3Npb25UVEw/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogU2Vzc2lvbiBpbmRleCBmb3IgZmFzdCB1c2VyIHRvIHNlc3Npb24gbG9va3Vwcy5cbiAgICogUHJvdmlkZXMgZWZmaWNpZW50IHF1ZXJ5aW5nIG9mIGEgdXNlcidzIHNlc3Npb25zIGZvciBsaXN0aW5nIGFuZCBtYW5hZ2VtZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBEeW5hbW9EQlNlc3Npb25JbmRleCAoYXV0by1jcmVhdGVkKVxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbkluZGV4PzogSVNlc3Npb25JbmRleDtcblxuICAvKipcbiAgICogQ29udGV4dCBzdHJhdGVneSBmb3IgY29udmVyc2F0aW9uIGhpc3RvcnkgbWFuYWdlbWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIgd2l0aCAyMCBtZXNzYWdlc1xuICAgKiBAZGVwcmVjYXRlZCBDb252ZXJzYXRpb24gbWFuYWdlbWVudCBpcyBub3cgaGFuZGxlZCBieSBTdHJhbmRzLW5hdGl2ZVxuICAgKiBgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXJgIGluIHRoZSBQeXRob24gaGFuZGxlci5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHRTdHJhdGVneT86IElDb250ZXh0U3RyYXRlZ3k7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGtlZXAgaW4gY29udmVyc2F0aW9uIGhpc3RvcnkuXG4gICAqIFNob3J0aGFuZCBmb3IgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIgd2luZG93U2l6ZS5cbiAgICogSWdub3JlZCBpZiBjb250ZXh0U3RyYXRlZ3kgaXMgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IDIwXG4gICAqIEBkZXByZWNhdGVkIENvbnZlcnNhdGlvbiB3aW5kb3dpbmcgaXMgbm93IGhhbmRsZWQgYnkgU3RyYW5kcy1uYXRpdmVcbiAgICogYFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyYCBpbiB0aGUgUHl0aG9uIGhhbmRsZXIgKGRlZmF1bHQ6IDIwKS5cbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2VIaXN0b3J5TGltaXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0b3IgZm9yIHNlY3VyaW5nIEFQSSBlbmRwb2ludHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IENvZ25pdG9BdXRoZW50aWNhdG9yXG4gICAqL1xuICByZWFkb25seSBhdXRoZW50aWNhdG9yPzogSUF1dGhlbnRpY2F0b3I7XG5cbiAgLyoqXG4gICAqIEhUVFAgbWV0aG9kcyB0byBhbGxvdyBpbiBDT1JTIHByZWZsaWdodCByZXNwb25zZXMuXG4gICAqIFVzZSB0aGlzIHRvIGVuYWJsZSBhZGRpdGlvbmFsIG1ldGhvZHMgKEdFVCwgREVMRVRFLCBQVVQpIGZvciBjdXN0b20gcm91dGVzXG4gICAqIGFkZGVkIHRvIHRoZSBSRVNUIEFQSS5cbiAgICpcbiAgICogQGRlZmF1bHQgWydQT1NUJywgJ09QVElPTlMnXVxuICAgKi9cbiAgcmVhZG9ubHkgY29yc0FsbG93TWV0aG9kcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBMYW1iZGEgZnVuY3Rpb24gbWVtb3J5IHNpemUgaW4gTUIuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEwMjRcbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeVNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIExhbWJkYSBmdW5jdGlvbiB0aW1lb3V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5taW51dGVzKDE1KVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBMYW1iZGEgZnVuY3Rpb24gYXJjaGl0ZWN0dXJlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBcmNoaXRlY3R1cmUuWDg2XzY0XG4gICAqL1xuICByZWFkb25seSBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XG5cbiAgLyoqXG4gICAqIFJlc2VydmVkIGNvbmN1cnJlbnQgZXhlY3V0aW9ucyBmb3IgdGhlIExhbWJkYSBmdW5jdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgTm8gcmVzZXJ2ZWQgY29uY3VycmVuY3lcbiAgICovXG4gIHJlYWRvbmx5IHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogSW50ZXJhY3RpdmUgQWdlbnQgZm9yIHJlYWwtdGltZSBjb252ZXJzYXRpb25hbCBBSSB3aXRoIFNTRSBzdHJlYW1pbmcuXG4gKlxuICogQ3JlYXRlcyBhIGNvbXBsZXRlIHNlcnZlcmxlc3MgaW5mcmFzdHJ1Y3R1cmUgZm9yIGludGVyYWN0aXZlIEFJIGNvbnZlcnNhdGlvbnNcbiAqIHVzaW5nIEFQSSBHYXRld2F5IFJFU1QgQVBJIHdpdGggcmVzcG9uc2Ugc3RyZWFtaW5nLCBMYW1iZGEgV2ViIEFkYXB0ZXIsXG4gKiBGYXN0QVBJLCBhbmQgc3RhbmRhcmQgU3RyYW5kcyBBZ2VudC5cbiAqXG4gKiAjIyBBcmNoaXRlY3R1cmVcbiAqXG4gKiBgYGBcbiAqIENsaWVudCAoZmV0Y2ggKyBSZWFkYWJsZVN0cmVhbSlcbiAqICAgICDihpMgUE9TVCAvY2hhdCAoQXV0aG9yaXphdGlvbjogQmVhcmVyIEpXVClcbiAqIEFQSSBHYXRld2F5IFJFU1QgQVBJIChyZXNwb25zZVRyYW5zZmVyTW9kZTogU1RSRUFNKVxuICogICAgIOKGkyBJbnZva2VXaXRoUmVzcG9uc2VTdHJlYW1cbiAqIExhbWJkYSAoUHl0aG9uICsgTGFtYmRhIFdlYiBBZGFwdGVyICsgRmFzdEFQSSlcbiAqICAgICDihpMgc3RyYW5kcy5BZ2VudCBzdHJlYW1pbmdcbiAqIEFtYXpvbiBCZWRyb2NrIChDbGF1ZGUpXG4gKiBgYGBcbiAqXG4gKiAjIyBGZWF0dXJlc1xuICpcbiAqIC0gKipTU0UgU3RyZWFtaW5nKio6IFJlYWwtdGltZSB0b2tlbi1ieS10b2tlbiByZXNwb25zZSBzdHJlYW1pbmdcbiAqIC0gKioxNS1NaW51dGUgVGltZW91dCoqOiBFeHRlbmRlZCB0aW1lb3V0IGZvciBsb25nIGNvbnZlcnNhdGlvbnNcbiAqIC0gKipTZXNzaW9uIE1hbmFnZW1lbnQqKjogUzMtYmFzZWQgY29udmVyc2F0aW9uIHBlcnNpc3RlbmNlXG4gKiAtICoqQ29udGV4dCBXaW5kb3dpbmcqKjogU2xpZGluZyB3aW5kb3cgY29udmVyc2F0aW9uIGhpc3RvcnlcbiAqIC0gKipDb2duaXRvIEF1dGgqKjogTmF0aXZlIEpXVCB2YWxpZGF0aW9uIG9uIFJFU1QgQVBJXG4gKiAtICoqU3RyYXRlZ3kgSW50ZXJmYWNlcyoqOiBQbHVnZ2FibGUgYWRhcHRlcnMgZm9yIGFsbCBjb21wb25lbnRzXG4gKiAtICoqT2JzZXJ2YWJpbGl0eSoqOiBMYW1iZGEgUG93ZXJ0b29scyBpbnRlZ3JhdGlvblxuICpcbiAqICMjIFVzYWdlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbiAqIGltcG9ydCB7IEludGVyYWN0aXZlQWdlbnQgfSBmcm9tICdAY2RrbGFicy9jZGstYXBwbW9kLWNhdGFsb2ctYmx1ZXByaW50cyc7XG4gKlxuICogY29uc3Qgc3lzdGVtUHJvbXB0ID0gbmV3IEFzc2V0KHRoaXMsICdQcm9tcHQnLCB7IHBhdGg6ICcuL3Byb21wdC50eHQnIH0pO1xuICpcbiAqIGNvbnN0IGFnZW50ID0gbmV3IEludGVyYWN0aXZlQWdlbnQodGhpcywgJ0NoYXRBZ2VudCcsIHtcbiAqICAgYWdlbnROYW1lOiAnTXlDaGF0Ym90JyxcbiAqICAgYWdlbnREZWZpbml0aW9uOiB7XG4gKiAgICAgYmVkcm9ja01vZGVsOiB7IHVzZUNyb3NzUmVnaW9uSW5mZXJlbmNlOiB0cnVlIH0sXG4gKiAgICAgc3lzdGVtUHJvbXB0OiBzeXN0ZW1Qcm9tcHQsXG4gKiAgIH0sXG4gKiB9KTtcbiAqXG4gKiAvLyBBY2Nlc3Mgb3V0cHV0c1xuICogYWdlbnQuYXBpRW5kcG9pbnQ7ICAgICAgIC8vIFJFU1QgQVBJIGVuZHBvaW50IFVSTFxuICogYWdlbnQuc2Vzc2lvbkJ1Y2tldDsgICAgIC8vIFMzIHNlc3Npb24gYnVja2V0XG4gKiBhZ2VudC5hdXRoZW50aWNhdG9yOyAgICAgLy8gQ29nbml0byBhdXRoZW50aWNhdG9yIChmb3IgVXNlciBQb29sIGluZm8pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEludGVyYWN0aXZlQWdlbnQgZXh0ZW5kcyBCYXNlQWdlbnQge1xuICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRGdW5jdGlvbj86IElGdW5jdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IGFkYXB0ZXI/OiBJQ29tbXVuaWNhdGlvbkFkYXB0ZXI7XG4gIHB1YmxpYyByZWFkb25seSBzZXNzaW9uU3RvcmU/OiBJU2Vzc2lvblN0b3JlO1xuICBwdWJsaWMgcmVhZG9ubHkgY29udGV4dFN0cmF0ZWd5PzogSUNvbnRleHRTdHJhdGVneTtcbiAgcHVibGljIHJlYWRvbmx5IGF1dGhlbnRpY2F0b3I/OiBJQXV0aGVudGljYXRvcjtcbiAgcHVibGljIHJlYWRvbmx5IGFwaUVuZHBvaW50OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBzZXNzaW9uQnVja2V0PzogSUJ1Y2tldDtcbiAgcHVibGljIHJlYWRvbmx5IGNmblJ1bnRpbWU/OiBDZm5SdW50aW1lO1xuICAvKipcbiAgICogVGhlIHNlc3Npb24gaW5kZXggZm9yIGZhc3QgdXNlciB0byBzZXNzaW9uIGxvb2t1cHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2Vzc2lvbkluZGV4PzogSVNlc3Npb25JbmRleDtcbiAgLyoqXG4gICAqIFRoZSBSRVNUIEFQSSBHYXRld2F5IChvbmx5IGF2YWlsYWJsZSB3aGVuIHVzaW5nIExhbWJkYUhvc3RpbmdBZGFwdGVyIHdpdGggU3RyZWFtaW5nSHR0cEFkYXB0ZXIpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc3RBcGk/OiBSZXN0QXBpO1xuICAvKipcbiAgICogVGhlIENvZ25pdG8gVXNlciBQb29scyBhdXRob3JpemVyIChvbmx5IGF2YWlsYWJsZSB3aGVuIHVzaW5nIExhbWJkYUhvc3RpbmdBZGFwdGVyIHdpdGggQ29nbml0b0F1dGhlbnRpY2F0b3IpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvZ25pdG9BdXRob3JpemVyPzogQ29nbml0b1VzZXJQb29sc0F1dGhvcml6ZXI7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEludGVyYWN0aXZlQWdlbnRQcm9wcykge1xuICAgIC8vIERldGVybWluZSBob3N0aW5nIGFkYXB0ZXIgQkVGT1JFIHN1cGVyKCkgc28gd2UgY2FuIHBhc3MgaXRzIHRydXN0IHByaW5jaXBhbFxuICAgIGNvbnN0IGhvc3RpbmdBZGFwdGVyID0gcHJvcHMuaG9zdGluZ0FkYXB0ZXIgfHwgbmV3IExhbWJkYUhvc3RpbmdBZGFwdGVyKHtcbiAgICAgIGNvbW11bmljYXRpb25BZGFwdGVyOiBwcm9wcy5jb21tdW5pY2F0aW9uQWRhcHRlcixcbiAgICAgIGF1dGhlbnRpY2F0b3I6IHByb3BzLmF1dGhlbnRpY2F0b3IsXG4gICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnlTaXplLFxuICAgICAgdGltZW91dDogcHJvcHMudGltZW91dCxcbiAgICAgIGFyY2hpdGVjdHVyZTogcHJvcHMuYXJjaGl0ZWN0dXJlLFxuICAgICAgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9uczogcHJvcHMucmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucyxcbiAgICB9KTtcblxuICAgIHN1cGVyKHNjb3BlLCBpZCwgeyAuLi5wcm9wcywgc2VydmljZVByaW5jaXBhbDogaG9zdGluZ0FkYXB0ZXIuc2VydmljZVByaW5jaXBhbCB9KTtcblxuICAgIC8vIFZhbGlkYXRlIHByb3BzXG4gICAgdGhpcy52YWxpZGF0ZVByb3BzKHByb3BzKTtcblxuICAgIGNvbnN0IG1vZGVsSWQgPSBCZWRyb2NrTW9kZWxVdGlscy5kZXJpdmVBY3R1YWxNb2RlbElkKHRoaXMuYmVkcm9ja01vZGVsKTtcbiAgICBjb25zdCBtZXRyaWNOYW1lc3BhY2UgPSBwcm9wcy5tZXRyaWNOYW1lc3BhY2UgfHwgRGVmYXVsdE9ic2VydmFiaWxpdHlDb25maWcuREVGQVVMVF9NRVRSSUNfTkFNRVNQQUNFO1xuICAgIGNvbnN0IG1ldHJpY1NlcnZpY2VOYW1lID0gcHJvcHMubWV0cmljU2VydmljZU5hbWUgfHwgRGVmYXVsdEFnZW50Q29uZmlnLkRFRkFVTFRfT0JTRVJWQUJJTElUWV9NRVRSSUNfU1ZDX05BTUU7XG5cbiAgICAvLyBJbml0aWFsaXplIHNlc3Npb24gc3RvcmUgKFMzIGJ1Y2tldCBmb3IgU3RyYW5kcy1uYXRpdmUgUzNTZXNzaW9uTWFuYWdlcilcbiAgICBpZiAocHJvcHMuc2Vzc2lvblN0b3JlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2Vzc2lvblN0b3JlID0gcHJvcHMuc2Vzc2lvblN0b3JlO1xuICAgIH0gZWxzZSBpZiAocHJvcHMuc2Vzc2lvblN0b3JlID09PSB1bmRlZmluZWQgJiYgcHJvcHMuc2Vzc2lvbkJ1Y2tldCkge1xuICAgICAgdGhpcy5zZXNzaW9uU3RvcmUgPSBuZXcgUzNTZXNzaW9uTWFuYWdlcih0aGlzLCAnU2Vzc2lvbk1hbmFnZXInLCB7XG4gICAgICAgIGJ1Y2tldDogcHJvcHMuc2Vzc2lvbkJ1Y2tldCxcbiAgICAgICAgc2Vzc2lvblRUTDogcHJvcHMuc2Vzc2lvblRUTCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0OiBjcmVhdGUgUzNTZXNzaW9uTWFuYWdlciAoYnVja2V0IHVzZWQgYnkgU3RyYW5kcy1uYXRpdmUgc2Vzc2lvbiBtYW5hZ2VyKVxuICAgICAgdGhpcy5zZXNzaW9uU3RvcmUgPSBuZXcgUzNTZXNzaW9uTWFuYWdlcih0aGlzLCAnU2Vzc2lvbk1hbmFnZXInLCB7XG4gICAgICAgIHNlc3Npb25UVEw6IHByb3BzLnNlc3Npb25UVEwsXG4gICAgICAgIGVuY3J5cHRpb25LZXk6IHByb3BzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzLnJlbW92YWxQb2xpY3ksXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zZXNzaW9uQnVja2V0ID0gdGhpcy5zZXNzaW9uU3RvcmU/LnNlc3Npb25CdWNrZXQ7XG5cbiAgICAvLyBJbml0aWFsaXplIHNlc3Npb24gaW5kZXggKER5bmFtb0RCIHRhYmxlIGZvciB1c2Vy4oaSc2Vzc2lvbiBsb29rdXBzKVxuICAgIGlmIChwcm9wcy5zZXNzaW9uSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZXNzaW9uSW5kZXggPSBwcm9wcy5zZXNzaW9uSW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQ6IGNyZWF0ZSBEeW5hbW9EQlNlc3Npb25JbmRleFxuICAgICAgdGhpcy5zZXNzaW9uSW5kZXggPSBuZXcgRHluYW1vREJTZXNzaW9uSW5kZXgodGhpcywgJ1Nlc3Npb25JbmRleCcsIHtcbiAgICAgICAgc2Vzc2lvblRUTDogcHJvcHMuc2Vzc2lvblRUTCxcbiAgICAgICAgZW5jcnlwdGlvbktleTogcHJvcHMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENvbnRleHQgc3RyYXRlZ3kgaXMgZGVwcmVjYXRlZCDigJQgU3RyYW5kcy1uYXRpdmUgY29udmVyc2F0aW9uIG1hbmFnZXIgaGFuZGxlcyB0aGlzLlxuICAgIC8vIEtlZXAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYnV0IGRvIG5vdCB1c2UgZW52IHZhcnMuXG4gICAgaWYgKHByb3BzLmNvbnRleHRTdHJhdGVneSkge1xuICAgICAgdGhpcy5jb250ZXh0U3RyYXRlZ3kgPSBwcm9wcy5jb250ZXh0U3RyYXRlZ3k7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGV4dFN0cmF0ZWd5ID0gbmV3IFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyKHtcbiAgICAgICAgd2luZG93U2l6ZTogcHJvcHMubWVzc2FnZUhpc3RvcnlMaW1pdCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIGJhc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAgY29uc3QgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgTU9ERUxfSUQ6IG1vZGVsSWQsXG4gICAgICBTWVNURU1fUFJPTVBUX1MzX0JVQ0tFVF9OQU1FOiBwcm9wcy5hZ2VudERlZmluaXRpb24uc3lzdGVtUHJvbXB0LnMzQnVja2V0TmFtZSxcbiAgICAgIFNZU1RFTV9QUk9NUFRfUzNfS0VZOiBwcm9wcy5hZ2VudERlZmluaXRpb24uc3lzdGVtUHJvbXB0LnMzT2JqZWN0S2V5LFxuICAgICAgVE9PTFNfQ09ORklHOiBKU09OLnN0cmluZ2lmeSh0aGlzLmFnZW50VG9vbHNMb2NhdGlvbkRlZmluaXRpb25zKSxcbiAgICAgIC4uLlBvd2VydG9vbHNDb25maWcuZ2VuZXJhdGVEZWZhdWx0TGFtYmRhQ29uZmlnKFxuICAgICAgICBwcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgICAgICBtZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgIG1ldHJpY1NlcnZpY2VOYW1lLFxuICAgICAgICAnREVCVUcnLFxuICAgICAgKSxcbiAgICB9O1xuXG4gICAgLy8gQWRkIHNlc3Npb24gYnVja2V0IGVudiB2YXIgaWYgc2Vzc2lvbiBzdG9yZSBleGlzdHNcbiAgICBpZiAodGhpcy5zZXNzaW9uQnVja2V0KSB7XG4gICAgICBlbnYuU0VTU0lPTl9CVUNLRVQgPSB0aGlzLnNlc3Npb25CdWNrZXQuYnVja2V0TmFtZTtcbiAgICB9XG5cbiAgICAvLyBBZGQgc2Vzc2lvbiBpbmRleCBlbnYgdmFycyBpZiBzZXNzaW9uIGluZGV4IGV4aXN0c1xuICAgIGlmICh0aGlzLnNlc3Npb25JbmRleCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihlbnYsIHRoaXMuc2Vzc2lvbkluZGV4LmVudmlyb25tZW50VmFyaWFibGVzKCkpO1xuICAgIH1cblxuICAgIC8vIEFkZCBrbm93bGVkZ2UgYmFzZSBjb25maWd1cmF0aW9uIGlmIEtCcyBhcmUgY29uZmlndXJlZFxuICAgIGlmICh0aGlzLmtub3dsZWRnZUJhc2VDb25maWdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGVudi5LTk9XTEVER0VfQkFTRVNfQ09ORklHID0gSlNPTi5zdHJpbmdpZnkodGhpcy5rbm93bGVkZ2VCYXNlQ29uZmlncyk7XG4gICAgICBlbnYuS05PV0xFREdFX0JBU0VfU1lTVEVNX1BST01QVF9BRERJVElPTiA9IGdlbmVyYXRlS25vd2xlZGdlQmFzZVN5c3RlbVByb21wdEFkZGl0aW9uKHRoaXMua25vd2xlZGdlQmFzZUNvbmZpZ3MpO1xuICAgIH1cblxuICAgIC8vIERlcGxveSB2aWEgaG9zdGluZyBhZGFwdGVyXG4gICAgY29uc3QgaG9zdGluZ1Jlc3VsdCA9IGhvc3RpbmdBZGFwdGVyLmRlcGxveSh7XG4gICAgICBzY29wZTogdGhpcyxcbiAgICAgIGFnZW50TmFtZTogcHJvcHMuYWdlbnROYW1lLFxuICAgICAgYWdlbnRSb2xlOiB0aGlzLmFnZW50Um9sZSxcbiAgICAgIGVudmlyb25tZW50OiBlbnYsXG4gICAgICBlbmNyeXB0aW9uS2V5OiB0aGlzLmVuY3J5cHRpb25LZXksXG4gICAgICBuZXR3b3JrOiBwcm9wcy5uZXR3b3JrLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBwcm9wcy5hcmNoaXRlY3R1cmUsXG4gICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnlTaXplLFxuICAgICAgdGltZW91dDogcHJvcHMudGltZW91dCxcbiAgICAgIHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM6IHByb3BzLnJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnMsXG4gICAgICBsYW1iZGFMYXllcnM6IHByb3BzLmFnZW50RGVmaW5pdGlvbi5sYW1iZGFMYXllcnMsXG4gICAgICBrbm93bGVkZ2VCYXNlTGF5ZXJzOiB0aGlzLmtub3dsZWRnZUJhc2VMYXllcnMsXG4gICAgICBlbmFibGVPYnNlcnZhYmlsaXR5OiBwcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgICAgdG9vbHNDb25maWc6IEpTT04uc3RyaW5naWZ5KHRoaXMuYWdlbnRUb29sc0xvY2F0aW9uRGVmaW5pdGlvbnMpLFxuICAgICAgc3lzdGVtUHJvbXB0QnVja2V0OiBwcm9wcy5hZ2VudERlZmluaXRpb24uc3lzdGVtUHJvbXB0LnMzQnVja2V0TmFtZSxcbiAgICAgIHN5c3RlbVByb21wdEtleTogcHJvcHMuYWdlbnREZWZpbml0aW9uLnN5c3RlbVByb21wdC5zM09iamVjdEtleSxcbiAgICAgIGtub3dsZWRnZUJhc2VDb25maWdzOiB0aGlzLmtub3dsZWRnZUJhc2VDb25maWdzLmxlbmd0aCA+IDAgPyBKU09OLnN0cmluZ2lmeSh0aGlzLmtub3dsZWRnZUJhc2VDb25maWdzKSA6IHVuZGVmaW5lZCxcbiAgICAgIGtub3dsZWRnZUJhc2VTeXN0ZW1Qcm9tcHRBZGRpdGlvbjogdGhpcy5rbm93bGVkZ2VCYXNlQ29uZmlncy5sZW5ndGggPiAwXG4gICAgICAgID8gZ2VuZXJhdGVLbm93bGVkZ2VCYXNlU3lzdGVtUHJvbXB0QWRkaXRpb24odGhpcy5rbm93bGVkZ2VCYXNlQ29uZmlncylcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICByZW1vdmFsUG9saWN5OiBwcm9wcy5yZW1vdmFsUG9saWN5LFxuICAgIH0pO1xuXG4gICAgdGhpcy5hcGlFbmRwb2ludCA9IGhvc3RpbmdSZXN1bHQuZW5kcG9pbnQ7XG4gICAgdGhpcy5hZ2VudEZ1bmN0aW9uID0gaG9zdGluZ1Jlc3VsdC5hZ2VudEZ1bmN0aW9uO1xuICAgIHRoaXMuY2ZuUnVudGltZSA9IGhvc3RpbmdSZXN1bHQuY2ZuUnVudGltZTtcblxuICAgIC8vIFNldCBhZGFwdGVyIGFuZCBhdXRoZW50aWNhdG9yIHJlZmVyZW5jZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICBpZiAoaG9zdGluZ0FkYXB0ZXIgaW5zdGFuY2VvZiBMYW1iZGFIb3N0aW5nQWRhcHRlcikge1xuICAgICAgdGhpcy5hZGFwdGVyID0gaG9zdGluZ0FkYXB0ZXIuY29tbXVuaWNhdGlvbkFkYXB0ZXI7XG4gICAgICB0aGlzLmF1dGhlbnRpY2F0b3IgPSBob3N0aW5nQWRhcHRlci5hdXRoZW50aWNhdG9yO1xuXG4gICAgICAvLyBFeHBvc2UgUkVTVCBBUEkgYW5kIENvZ25pdG8gYXV0aG9yaXplciBmcm9tIHRoZSBjb21tdW5pY2F0aW9uIGFkYXB0ZXJcbiAgICAgIGlmICh0aGlzLmFkYXB0ZXIgaW5zdGFuY2VvZiBTdHJlYW1pbmdIdHRwQWRhcHRlcikge1xuICAgICAgICB0aGlzLnJlc3RBcGkgPSB0aGlzLmFkYXB0ZXIucmVzdEFwaTtcbiAgICAgICAgdGhpcy5jb2duaXRvQXV0aG9yaXplciA9IHRoaXMuYWRhcHRlci5jb2duaXRvQXV0aG9yaXplcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHcmFudCBzeXN0ZW0gcHJvbXB0IHJlYWQgYWNjZXNzXG4gICAgcHJvcHMuYWdlbnREZWZpbml0aW9uLnN5c3RlbVByb21wdC5ncmFudFJlYWQodGhpcy5hZ2VudFJvbGUpO1xuXG4gICAgLy8gR3JhbnQgc2Vzc2lvbiBzdG9yZSBhY2Nlc3NcbiAgICBpZiAodGhpcy5zZXNzaW9uU3RvcmUpIHtcbiAgICAgIGlmICh0aGlzLmFnZW50RnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uU3RvcmUuZ3JhbnRSZWFkV3JpdGUodGhpcy5hZ2VudEZ1bmN0aW9uKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZXNzaW9uQnVja2V0KSB7XG4gICAgICAgIC8vIEZvciBBZ2VudENvcmUgaG9zdGluZywgZ3JhbnQgdGhlIGFnZW50IHJvbGUgZGlyZWN0IFMzIGFjY2Vzc1xuICAgICAgICB0aGlzLnNlc3Npb25CdWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5hZ2VudFJvbGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdyYW50IHNlc3Npb24gaW5kZXggYWNjZXNzXG4gICAgaWYgKHRoaXMuc2Vzc2lvbkluZGV4KSB7XG4gICAgICB0aGlzLnNlc3Npb25JbmRleC5ncmFudFJlYWRXcml0ZSh0aGlzLmFnZW50Um9sZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBJbnRlcmFjdGl2ZUFnZW50IHByb3BzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVByb3BzKHByb3BzOiBJbnRlcmFjdGl2ZUFnZW50UHJvcHMpOiB2b2lkIHtcbiAgICBpZiAoIXByb3BzLmFnZW50TmFtZSB8fCBwcm9wcy5hZ2VudE5hbWUudHJpbSgpID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhZ2VudE5hbWUgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLm1lbW9yeVNpemUgIT09IHVuZGVmaW5lZCAmJiAocHJvcHMubWVtb3J5U2l6ZSA8IDEyOCB8fCBwcm9wcy5tZW1vcnlTaXplID4gMTAyNDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21lbW9yeVNpemUgbXVzdCBiZSBiZXR3ZWVuIDEyOCBhbmQgMTAyNDAgTUInKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMudGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IHByb3BzLnRpbWVvdXQudG9TZWNvbmRzKCk7XG4gICAgICBpZiAodGltZW91dFNlY29uZHMgPCAxIHx8IHRpbWVvdXRTZWNvbmRzID4gOTAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGltZW91dCBtdXN0IGJlIGJldHdlZW4gMSBzZWNvbmQgYW5kIDE1IG1pbnV0ZXMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocHJvcHMubWVzc2FnZUhpc3RvcnlMaW1pdCAhPT0gdW5kZWZpbmVkICYmIChwcm9wcy5tZXNzYWdlSGlzdG9yeUxpbWl0IDwgMSB8fCBwcm9wcy5tZXNzYWdlSGlzdG9yeUxpbWl0ID4gMTAwMCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWVzc2FnZUhpc3RvcnlMaW1pdCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAwMCcpO1xuICAgIH1cbiAgfVxufVxuIl19