terraconstructs 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +1081 -229
- package/lib/asset-staging.js +1 -1
- package/lib/aws/arn.js +1 -1
- package/lib/aws/aws-asset-manager.js +1 -1
- package/lib/aws/aws-construct.js +1 -1
- package/lib/aws/aws-stack.js +1 -1
- package/lib/aws/aws-tags.js +2 -2
- package/lib/aws/cloudwatch/actions/appscaling.js +1 -1
- package/lib/aws/cloudwatch/actions/ec2.js +1 -1
- package/lib/aws/cloudwatch/actions/lambda.js +1 -1
- package/lib/aws/cloudwatch/actions/sns.js +1 -1
- package/lib/aws/cloudwatch/actions/ssm.js +2 -2
- package/lib/aws/cloudwatch/alarm-base.js +1 -1
- package/lib/aws/cloudwatch/alarm-rule.js +1 -1
- package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
- package/lib/aws/cloudwatch/alarm.js +1 -1
- package/lib/aws/cloudwatch/composite-alarm.js +1 -1
- package/lib/aws/cloudwatch/dashboard.js +1 -1
- package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
- package/lib/aws/cloudwatch/graph.js +8 -8
- package/lib/aws/cloudwatch/layout.js +3 -3
- package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
- package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
- package/lib/aws/cloudwatch/log-group.js +1 -1
- package/lib/aws/cloudwatch/log-query.js +1 -1
- package/lib/aws/cloudwatch/log-stream.js +1 -1
- package/lib/aws/cloudwatch/metric-filter.js +1 -1
- package/lib/aws/cloudwatch/metric.js +2 -2
- package/lib/aws/cloudwatch/pattern.js +3 -3
- package/lib/aws/cloudwatch/policy.js +1 -1
- package/lib/aws/cloudwatch/query-definition.js +2 -2
- package/lib/aws/cloudwatch/stats.js +1 -1
- package/lib/aws/cloudwatch/subscription-filter.js +1 -1
- package/lib/aws/cloudwatch/text.js +1 -1
- package/lib/aws/cloudwatch/variable.js +3 -3
- package/lib/aws/cloudwatch/widget.js +1 -1
- package/lib/aws/compute/access-log.js +4 -4
- package/lib/aws/compute/activity.js +1 -1
- package/lib/aws/compute/alb/application-listener-action.js +1 -1
- package/lib/aws/compute/alb/application-listener-certificate.js +1 -1
- package/lib/aws/compute/alb/application-listener-rule.js +1 -1
- package/lib/aws/compute/alb/application-listener.js +1 -1
- package/lib/aws/compute/alb/application-load-balancer.js +1 -1
- package/lib/aws/compute/alb/application-target-group.js +1 -1
- package/lib/aws/compute/alb/conditions.js +1 -1
- package/lib/aws/compute/alb/trust-store-revocation.js +1 -1
- package/lib/aws/compute/alb/trust-store.js +1 -1
- package/lib/aws/compute/api-definition.js +3 -3
- package/lib/aws/compute/api-key.js +2 -2
- package/lib/aws/compute/architecture.js +1 -1
- package/lib/aws/compute/aspects/require-imdsv2-aspect.js +2 -2
- package/lib/aws/compute/authorizer.js +1 -1
- package/lib/aws/compute/authorizers/identity-source.js +1 -1
- package/lib/aws/compute/authorizers/lambda.js +2 -2
- package/lib/aws/compute/base-path-mapping.js +1 -1
- package/lib/aws/compute/base-scalable-attribute.js +1 -1
- package/lib/aws/compute/bastion-host.js +1 -1
- package/lib/aws/compute/chain.js +1 -1
- package/lib/aws/compute/client-vpn-authorization-rule.js +1 -1
- package/lib/aws/compute/client-vpn-endpoint.js +2 -2
- package/lib/aws/compute/client-vpn-route.js +2 -2
- package/lib/aws/compute/code.js +8 -8
- package/lib/aws/compute/condition.js +1 -1
- package/lib/aws/compute/connections.js +1 -1
- package/lib/aws/compute/cors.js +1 -1
- package/lib/aws/compute/deployment.js +1 -1
- package/lib/aws/compute/domain-name.js +1 -1
- package/lib/aws/compute/event-invoke-config.js +1 -1
- package/lib/aws/compute/event-source-filter.js +2 -2
- package/lib/aws/compute/event-source-mapping.js +1 -1
- package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
- package/lib/aws/compute/event-sources/s3.js +1 -1
- package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
- package/lib/aws/compute/event-sources/sqs.js +1 -1
- package/lib/aws/compute/fields.js +4 -4
- package/lib/aws/compute/function-alias.js +1 -1
- package/lib/aws/compute/function-base.js +2 -2
- package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
- package/lib/aws/compute/function-destinations/function.js +1 -1
- package/lib/aws/compute/function-destinations/sqs.js +1 -1
- package/lib/aws/compute/function-nodejs/function.js +1 -1
- package/lib/aws/compute/function-url.js +1 -1
- package/lib/aws/compute/function.js +1 -1
- package/lib/aws/compute/gateway-response.js +2 -2
- package/lib/aws/compute/handler.js +1 -1
- package/lib/aws/compute/instance-types.js +1 -1
- package/lib/aws/compute/instance.js +1 -1
- package/lib/aws/compute/integration.js +1 -1
- package/lib/aws/compute/integrations/aws.js +1 -1
- package/lib/aws/compute/integrations/http.js +1 -1
- package/lib/aws/compute/integrations/lambda.js +1 -1
- package/lib/aws/compute/integrations/mock.js +1 -1
- package/lib/aws/compute/integrations/stepfunctions.js +1 -1
- package/lib/aws/compute/ip-addresses.js +2 -2
- package/lib/aws/compute/ipam.js +1 -1
- package/lib/aws/compute/key-pair.js +1 -1
- package/lib/aws/compute/lambda-api.js +1 -1
- package/lib/aws/compute/launch-template.js +2 -2
- package/lib/aws/compute/lb-shared/base-listener.js +1 -1
- package/lib/aws/compute/lb-shared/base-load-balancer.js +2 -2
- package/lib/aws/compute/lb-shared/base-target-group.js +1 -1
- package/lib/aws/compute/lb-shared/listener-certificate.js +1 -1
- package/lib/aws/compute/lb-shared/load-balancer-targets.js +2 -2
- package/lib/aws/compute/lb-targets/alb-target.js +3 -3
- package/lib/aws/compute/lb-targets/instance-target.js +2 -2
- package/lib/aws/compute/lb-targets/ip-target.js +1 -1
- package/lib/aws/compute/lb-targets/lambda-target.js +1 -1
- package/lib/aws/compute/load-balancer.js +3 -3
- package/lib/aws/compute/machine-image/amazon-linux-2022.js +2 -2
- package/lib/aws/compute/machine-image/amazon-linux-2023.js +2 -2
- package/lib/aws/compute/machine-image/amazon-linux2.js +2 -2
- package/lib/aws/compute/machine-image/common.js +1 -1
- package/lib/aws/compute/machine-image/machine-image.js +8 -8
- package/lib/aws/compute/method.js +1 -1
- package/lib/aws/compute/model.js +3 -3
- package/lib/aws/compute/nat.js +5 -5
- package/lib/aws/compute/network-acl-types.js +2 -2
- package/lib/aws/compute/network-acl.js +3 -3
- package/lib/aws/compute/nlb/network-listener-action.js +1 -1
- package/lib/aws/compute/nlb/network-listener.js +1 -1
- package/lib/aws/compute/nlb/network-load-balancer.js +1 -1
- package/lib/aws/compute/nlb/network-target-group.js +1 -1
- package/lib/aws/compute/peer.js +1 -1
- package/lib/aws/compute/placement-group.js +1 -1
- package/lib/aws/compute/port.js +1 -1
- package/lib/aws/compute/prefix-list.js +1 -1
- package/lib/aws/compute/requestvalidator.js +1 -1
- package/lib/aws/compute/resource.js +3 -3
- package/lib/aws/compute/restapi.js +3 -3
- package/lib/aws/compute/route.js +8 -8
- package/lib/aws/compute/runtime.js +1 -1
- package/lib/aws/compute/scalable-target.js +1 -1
- package/lib/aws/compute/schedule.js +1 -1
- package/lib/aws/compute/security-group.js +1 -1
- package/lib/aws/compute/stage.js +2 -2
- package/lib/aws/compute/state-graph.js +1 -1
- package/lib/aws/compute/state-machine-fragment.js +1 -1
- package/lib/aws/compute/state-machine.js +4 -4
- package/lib/aws/compute/states/choice.js +1 -1
- package/lib/aws/compute/states/custom-state.js +1 -1
- package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
- package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
- package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
- package/lib/aws/compute/states/distributed-map.js +1 -1
- package/lib/aws/compute/states/fail.js +1 -1
- package/lib/aws/compute/states/map-base.js +1 -1
- package/lib/aws/compute/states/map.js +1 -1
- package/lib/aws/compute/states/parallel.js +1 -1
- package/lib/aws/compute/states/pass.js +2 -2
- package/lib/aws/compute/states/state.js +1 -1
- package/lib/aws/compute/states/succeed.js +1 -1
- package/lib/aws/compute/states/task-base.js +2 -2
- package/lib/aws/compute/states/task.js +1 -1
- package/lib/aws/compute/states/wait.js +2 -2
- package/lib/aws/compute/step-scaling-action.js +1 -1
- package/lib/aws/compute/step-scaling-policy.js +1 -1
- package/lib/aws/compute/stepfunctions-api.js +1 -1
- package/lib/aws/compute/subnet-v2.js +2 -2
- package/lib/aws/compute/subnet.js +1 -1
- package/lib/aws/compute/target-tracking-scaling-policy.js +1 -1
- package/lib/aws/compute/task-credentials.js +1 -1
- package/lib/aws/compute/task-input.js +1 -1
- package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
- package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
- package/lib/aws/compute/tasks/http/invoke.js +1 -1
- package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
- package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
- package/lib/aws/compute/types.js +1 -1
- package/lib/aws/compute/usage-plan.js +1 -1
- package/lib/aws/compute/user-data.js +3 -3
- package/lib/aws/compute/volume.js +2 -2
- package/lib/aws/compute/vpc-endpoint-service.js +1 -1
- package/lib/aws/compute/vpc-endpoint.js +6 -6
- package/lib/aws/compute/vpc-flow-logs.js +4 -4
- package/lib/aws/compute/vpc-link.js +1 -1
- package/lib/aws/compute/vpc-v2-base.js +1 -1
- package/lib/aws/compute/vpc-v2.js +2 -2
- package/lib/aws/compute/vpc.js +4 -4
- package/lib/aws/compute/vpn.js +3 -3
- package/lib/aws/edge/certificate.js +1 -1
- package/lib/aws/edge/distribution.js +3 -3
- package/lib/aws/edge/dns-alias-record-targets.js +6 -6
- package/lib/aws/edge/dns-record.js +13 -13
- package/lib/aws/edge/dns-zone.js +1 -1
- package/lib/aws/edge/function.js +2 -2
- package/lib/aws/edge/key-value-store.js +4 -4
- package/lib/aws/edge/origin.js +3 -3
- package/lib/aws/edge/response-headers-policy.js +1 -1
- package/lib/aws/encryption/alias.js +1 -1
- package/lib/aws/encryption/key.js +1 -1
- package/lib/aws/encryption/via-service-principal.js +1 -1
- package/lib/aws/iam/grant.js +3 -3
- package/lib/aws/iam/group.js +1 -1
- package/lib/aws/iam/instance-profile.js +1 -1
- package/lib/aws/iam/managed-policy.js +1 -1
- package/lib/aws/iam/oidc-provider.js +1 -1
- package/lib/aws/iam/policy-document.js +1 -1
- package/lib/aws/iam/policy-statement.js +1 -1
- package/lib/aws/iam/policy.js +1 -1
- package/lib/aws/iam/principals.js +20 -20
- package/lib/aws/iam/role.js +14 -5
- package/lib/aws/iam/saml-provider.js +2 -2
- package/lib/aws/iam/unknown-principal.js +1 -1
- package/lib/aws/iam/user.js +1 -1
- package/lib/aws/network/simple-ipv4-vpc.js +1 -1
- package/lib/aws/network/subnet-group.js +3 -3
- package/lib/aws/network/subnet.js +4 -4
- package/lib/aws/notify/archive.js +1 -1
- package/lib/aws/notify/connection.js +3 -3
- package/lib/aws/notify/event-bus.js +3 -3
- package/lib/aws/notify/event-pattern.js +1 -1
- package/lib/aws/notify/input.js +2 -2
- package/lib/aws/notify/kinesis-stream.js +1 -1
- package/lib/aws/notify/notification-rule.js +1 -1
- package/lib/aws/notify/policy.js +1 -1
- package/lib/aws/notify/queue-base.js +1 -1
- package/lib/aws/notify/queue-policy.js +1 -1
- package/lib/aws/notify/queue.js +1 -1
- package/lib/aws/notify/resource-policy.js +1 -1
- package/lib/aws/notify/rule.js +1 -1
- package/lib/aws/notify/schedule.js +1 -1
- package/lib/aws/notify/sqs-grants.generated.js +1 -1
- package/lib/aws/notify/subscription-filter.js +1 -1
- package/lib/aws/notify/subscription.js +4 -4
- package/lib/aws/notify/subscriptions/email.js +1 -1
- package/lib/aws/notify/subscriptions/lambda.js +1 -1
- package/lib/aws/notify/subscriptions/sms.js +1 -1
- package/lib/aws/notify/subscriptions/sqs.js +1 -1
- package/lib/aws/notify/subscriptions/url.js +1 -1
- package/lib/aws/notify/targets/event-bus.js +1 -1
- package/lib/aws/notify/targets/function.js +1 -1
- package/lib/aws/notify/targets/log-group.js +2 -2
- package/lib/aws/notify/targets/sqs.js +1 -1
- package/lib/aws/notify/targets/state-machine.js +1 -1
- package/lib/aws/notify/topic-base.js +1 -1
- package/lib/aws/notify/topic.js +1 -1
- package/lib/aws/storage/assets/image-asset.js +3 -3
- package/lib/aws/storage/assets/s3.js +1 -1
- package/lib/aws/storage/auth-token.js +2 -2
- package/lib/aws/storage/billing.js +1 -1
- package/lib/aws/storage/bucket-notifications.js +1 -1
- package/lib/aws/storage/bucket-policy.js +1 -1
- package/lib/aws/storage/bucket-source.js +1 -1
- package/lib/aws/storage/bucket.js +2 -2
- package/lib/aws/storage/capacity.js +1 -1
- package/lib/aws/storage/dynamodb-perms.d.ts +2 -2
- package/lib/aws/storage/dynamodb-perms.js +9 -16
- package/lib/aws/storage/ecr-repository.js +3 -3
- package/lib/aws/storage/encryption.js +1 -1
- package/lib/aws/storage/index.d.ts +2 -0
- package/lib/aws/storage/index.js +3 -1
- package/lib/aws/storage/notification-targets/function.js +1 -1
- package/lib/aws/storage/notification-targets/queue.js +1 -1
- package/lib/aws/storage/origin-access-identity.js +1 -1
- package/lib/aws/storage/parameter.js +2 -2
- package/lib/aws/storage/shared.d.ts +31 -2
- package/lib/aws/storage/shared.js +29 -2
- package/lib/aws/storage/stream-grants.d.ts +61 -0
- package/lib/aws/storage/stream-grants.js +72 -0
- package/lib/aws/storage/table-grants.d.ts +98 -0
- package/lib/aws/storage/table-grants.js +137 -0
- package/lib/aws/storage/table.d.ts +280 -8
- package/lib/aws/storage/table.js +350 -148
- package/lib/bundling.js +3 -3
- package/lib/construct-base.js +2 -2
- package/lib/duration.js +1 -1
- package/lib/errors.js +1 -1
- package/lib/expiration.js +1 -1
- package/lib/fs/ignore.js +4 -4
- package/lib/fs/index.js +1 -1
- package/lib/size.js +1 -1
- package/lib/stack-base.js +1 -1
- package/lib/terra-func.js +1 -1
- package/lib/time-zone.js +1 -1
- package/package.json +1 -1
package/lib/aws/storage/table.js
CHANGED
|
@@ -8,19 +8,18 @@ const provider_aws_1 = require("@cdktf/provider-aws");
|
|
|
8
8
|
const cdktf_1 = require("cdktf");
|
|
9
9
|
const __1 = require("..");
|
|
10
10
|
const dynamodb_canned_metrics_generated_1 = require("./dynamodb-canned-metrics.generated");
|
|
11
|
-
const perms = require("./dynamodb-perms");
|
|
12
11
|
const scalable_table_attribute_1 = require("./scalable-table-attribute");
|
|
13
12
|
const shared_1 = require("./shared");
|
|
13
|
+
const stream_grants_1 = require("./stream-grants");
|
|
14
|
+
const table_grants_1 = require("./table-grants");
|
|
14
15
|
const errors_1 = require("../../errors");
|
|
15
16
|
const cloudwatch = require("../cloudwatch");
|
|
16
17
|
const appscaling = require("../compute");
|
|
17
18
|
const kms = require("../encryption");
|
|
18
19
|
const iam = require("../iam");
|
|
19
|
-
// Missing in Terraform DynamoDb Replica Configuration block
|
|
20
|
-
// https://registry.terraform.io/providers/hashicorp/aws/5.88.0/docs/resources/dynamodb_table#replica
|
|
21
|
-
// import { Duration } from "../../duration";
|
|
22
20
|
const HASH_KEY_TYPE = "HASH";
|
|
23
21
|
const RANGE_KEY_TYPE = "RANGE";
|
|
22
|
+
// https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html#limits-secondary-indexes
|
|
24
23
|
const MAX_LOCAL_SECONDARY_INDEX_COUNT = 5;
|
|
25
24
|
/**
|
|
26
25
|
* Type of compression to use for imported data.
|
|
@@ -72,6 +71,9 @@ class InputFormat {
|
|
|
72
71
|
* CSV format.
|
|
73
72
|
*/
|
|
74
73
|
static csv(options) {
|
|
74
|
+
// We are using the .length property to check the length of the delimiter.
|
|
75
|
+
// Note that .length may not return the expected result for multi-codepoint characters like full-width characters or emojis,
|
|
76
|
+
// but such characters are not expected to be used as delimiters in this context.
|
|
75
77
|
if (options?.delimiter &&
|
|
76
78
|
(!this.validCsvDelimiters.includes(options.delimiter) ||
|
|
77
79
|
options.delimiter.length !== 1)) {
|
|
@@ -100,7 +102,12 @@ class InputFormat {
|
|
|
100
102
|
}
|
|
101
103
|
exports.InputFormat = InputFormat;
|
|
102
104
|
_a = JSII_RTTI_SYMBOL_1;
|
|
103
|
-
InputFormat[_a] = { fqn: "terraconstructs.aws.storage.InputFormat", version: "0.2.
|
|
105
|
+
InputFormat[_a] = { fqn: "terraconstructs.aws.storage.InputFormat", version: "0.2.2" };
|
|
106
|
+
/**
|
|
107
|
+
* Valid CSV delimiters.
|
|
108
|
+
*
|
|
109
|
+
* @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-csv.html#cfn-dynamodb-table-csv-delimiter
|
|
110
|
+
*/
|
|
104
111
|
InputFormat.validCsvDelimiters = [",", "\t", ":", ";", "|", " "];
|
|
105
112
|
InputFormat.readableValidCsvDelimiters = [
|
|
106
113
|
"comma (,)",
|
|
@@ -129,8 +136,16 @@ var ApproximateCreationDateTimePrecision;
|
|
|
129
136
|
class TableBase extends __1.AwsConstructBase {
|
|
130
137
|
constructor() {
|
|
131
138
|
super(...arguments);
|
|
139
|
+
/**
|
|
140
|
+
* @deprecated This member is still filled but it is not read
|
|
141
|
+
*/
|
|
132
142
|
this.regionalArns = new Array();
|
|
133
143
|
}
|
|
144
|
+
grantOnKey(grantee, ...actions) {
|
|
145
|
+
return {
|
|
146
|
+
grant: this.encryptionKey?.grant(grantee, ...actions),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
134
149
|
get outputs() {
|
|
135
150
|
return {
|
|
136
151
|
tableArn: this.tableArn,
|
|
@@ -138,100 +153,127 @@ class TableBase extends __1.AwsConstructBase {
|
|
|
138
153
|
tableStreamArn: this.tableStreamArn,
|
|
139
154
|
};
|
|
140
155
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
];
|
|
152
|
-
return iam.Grant.addToPrincipalOrResource({
|
|
153
|
-
grantee,
|
|
154
|
-
actions,
|
|
155
|
-
resourceArns: resources.filter((r) => r !== undefined),
|
|
156
|
-
resource: this, // Grant will take the principal from the grantee
|
|
156
|
+
/**
|
|
157
|
+
* Grant a predefined set of permissions on this Table.
|
|
158
|
+
*/
|
|
159
|
+
get grants() {
|
|
160
|
+
return new table_grants_1.TableGrants({
|
|
161
|
+
table: this,
|
|
162
|
+
encryptedResource: this,
|
|
163
|
+
policyResource: this,
|
|
164
|
+
regions: this.regions,
|
|
165
|
+
hasIndex: this.hasIndex,
|
|
157
166
|
});
|
|
158
167
|
}
|
|
159
|
-
|
|
168
|
+
/**
|
|
169
|
+
* Grant a predefined set of permissions on this Table's Stream, if present.
|
|
170
|
+
*
|
|
171
|
+
* Will throw if the Table has not been configured for streaming.
|
|
172
|
+
*/
|
|
173
|
+
get streamGrants() {
|
|
160
174
|
if (!this.tableStreamArn) {
|
|
161
175
|
throw new errors_1.ValidationError(`DynamoDB Streams must be enabled on the table ${this.node.path}`, this);
|
|
162
176
|
}
|
|
163
|
-
return
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
scope: this,
|
|
177
|
+
return new stream_grants_1.StreamGrants({
|
|
178
|
+
table: this,
|
|
179
|
+
tableStreamArn: this.tableStreamArn,
|
|
180
|
+
encryptionKey: this.encryptionKey,
|
|
168
181
|
});
|
|
169
182
|
}
|
|
183
|
+
/**
|
|
184
|
+
* Adds an IAM policy statement associated with this table to an IAM
|
|
185
|
+
* principal's policy.
|
|
186
|
+
*
|
|
187
|
+
* If `encryptionKey` is present, appropriate grants to the key needs to be added
|
|
188
|
+
* separately using the `table.encryptionKey.grant*` methods.
|
|
189
|
+
*
|
|
190
|
+
* @param grantee The principal (no-op if undefined)
|
|
191
|
+
* @param actions The set of actions to allow (i.e. "dynamodb:PutItem", "dynamodb:GetItem", ...)
|
|
192
|
+
*/
|
|
193
|
+
grant(grantee, ...actions) {
|
|
194
|
+
return this.grants.actions(grantee, ...actions);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Adds an IAM policy statement associated with this table's stream to an
|
|
198
|
+
* IAM principal's policy.
|
|
199
|
+
*
|
|
200
|
+
* If `encryptionKey` is present, appropriate grants to the key needs to be added
|
|
201
|
+
* separately using the `table.encryptionKey.grant*` methods.
|
|
202
|
+
*
|
|
203
|
+
* @param grantee The principal (no-op if undefined)
|
|
204
|
+
* @param actions The set of actions to allow (i.e. "dynamodb:DescribeStream", "dynamodb:GetRecords", ...)
|
|
205
|
+
*/
|
|
206
|
+
grantStream(grantee, ...actions) {
|
|
207
|
+
return this.streamGrants.actions(grantee, ...actions);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Permits an IAM principal all data read operations from this table:
|
|
211
|
+
* BatchGetItem, GetRecords, GetShardIterator, Query, GetItem, Scan, DescribeTable.
|
|
212
|
+
*
|
|
213
|
+
* Appropriate grants will also be added to the customer-managed KMS key
|
|
214
|
+
* if one was configured.
|
|
215
|
+
*
|
|
216
|
+
* @param grantee The principal to grant access to
|
|
217
|
+
*/
|
|
170
218
|
grantReadData(grantee) {
|
|
171
|
-
|
|
172
|
-
// If streams are available, also grant stream-specific actions
|
|
173
|
-
if (this.tableStreamArn) {
|
|
174
|
-
return this.combinedGrant(grantee, {
|
|
175
|
-
keyActions: perms.KEY_READ_ACTIONS,
|
|
176
|
-
tableActions,
|
|
177
|
-
streamActions: perms.READ_DATA_ACTIONS_STREAM_ONLY,
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
return this.combinedGrant(grantee, {
|
|
181
|
-
keyActions: perms.KEY_READ_ACTIONS,
|
|
182
|
-
tableActions,
|
|
183
|
-
});
|
|
219
|
+
return this.grants.readData(grantee);
|
|
184
220
|
}
|
|
221
|
+
/**
|
|
222
|
+
* Permits an IAM Principal to list streams attached to current dynamodb table.
|
|
223
|
+
*
|
|
224
|
+
* @param grantee The principal (no-op if undefined)
|
|
225
|
+
*/
|
|
185
226
|
grantTableListStreams(grantee) {
|
|
186
|
-
|
|
187
|
-
throw new errors_1.ValidationError(`DynamoDB Streams must be enabled on the table ${this.node.path}`, this);
|
|
188
|
-
}
|
|
189
|
-
return iam.Grant.addToPrincipal({
|
|
190
|
-
grantee,
|
|
191
|
-
actions: ["dynamodb:ListStreams"],
|
|
192
|
-
resourceArns: ["*"],
|
|
193
|
-
});
|
|
227
|
+
return this.streamGrants.list(grantee);
|
|
194
228
|
}
|
|
229
|
+
/**
|
|
230
|
+
* Permits an IAM principal all stream data read operations for this
|
|
231
|
+
* table's stream:
|
|
232
|
+
* DescribeStream, GetRecords, GetShardIterator, ListStreams.
|
|
233
|
+
*
|
|
234
|
+
* Appropriate grants will also be added to the customer-managed KMS key
|
|
235
|
+
* if one was configured.
|
|
236
|
+
*
|
|
237
|
+
* @param grantee The principal to grant access to
|
|
238
|
+
*/
|
|
195
239
|
grantStreamRead(grantee) {
|
|
196
|
-
this.
|
|
197
|
-
return this.combinedGrant(grantee, {
|
|
198
|
-
keyActions: perms.KEY_READ_ACTIONS,
|
|
199
|
-
streamActions: perms.READ_STREAM_DATA_ACTIONS,
|
|
200
|
-
});
|
|
240
|
+
return this.streamGrants.read(grantee);
|
|
201
241
|
}
|
|
242
|
+
/**
|
|
243
|
+
* Permits an IAM principal all data write operations to this table:
|
|
244
|
+
* BatchWriteItem, PutItem, UpdateItem, DeleteItem, DescribeTable.
|
|
245
|
+
*
|
|
246
|
+
* Appropriate grants will also be added to the customer-managed KMS key
|
|
247
|
+
* if one was configured.
|
|
248
|
+
*
|
|
249
|
+
* @param grantee The principal to grant access to
|
|
250
|
+
*/
|
|
202
251
|
grantWriteData(grantee) {
|
|
203
|
-
|
|
204
|
-
const keyActions = perms.KEY_READ_ACTIONS.concat(perms.KEY_WRITE_ACTIONS);
|
|
205
|
-
return this.combinedGrant(grantee, { keyActions, tableActions });
|
|
252
|
+
return this.grants.writeData(grantee);
|
|
206
253
|
}
|
|
254
|
+
/**
|
|
255
|
+
* Permits an IAM principal to all data read/write operations to this table.
|
|
256
|
+
* BatchGetItem, GetRecords, GetShardIterator, Query, GetItem, Scan,
|
|
257
|
+
* BatchWriteItem, PutItem, UpdateItem, DeleteItem, DescribeTable
|
|
258
|
+
*
|
|
259
|
+
* Appropriate grants will also be added to the customer-managed KMS key
|
|
260
|
+
* if one was configured.
|
|
261
|
+
*
|
|
262
|
+
* @param grantee The principal to grant access to
|
|
263
|
+
*/
|
|
207
264
|
grantReadWriteData(grantee) {
|
|
208
|
-
|
|
209
|
-
const keyActions = perms.KEY_READ_ACTIONS.concat(perms.KEY_WRITE_ACTIONS);
|
|
210
|
-
return this.combinedGrant(grantee, { keyActions, tableActions });
|
|
265
|
+
return this.grants.readWriteData(grantee);
|
|
211
266
|
}
|
|
267
|
+
/**
|
|
268
|
+
* Permits all DynamoDB operations ("dynamodb:*") to an IAM principal.
|
|
269
|
+
*
|
|
270
|
+
* Appropriate grants will also be added to the customer-managed KMS key
|
|
271
|
+
* if one was configured.
|
|
272
|
+
*
|
|
273
|
+
* @param grantee The principal to grant access to
|
|
274
|
+
*/
|
|
212
275
|
grantFullAccess(grantee) {
|
|
213
|
-
|
|
214
|
-
return this.combinedGrant(grantee, {
|
|
215
|
-
keyActions,
|
|
216
|
-
tableActions: ["dynamodb:*"],
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
addToResourcePolicy(statement) {
|
|
220
|
-
if (!this.resourcePolicy) {
|
|
221
|
-
// ensure a policy exists and is associated with the table
|
|
222
|
-
this.resourcePolicy = new iam.PolicyDocument(this, "Policy", {
|
|
223
|
-
statement: [],
|
|
224
|
-
});
|
|
225
|
-
new provider_aws_1.dynamodbResourcePolicy.DynamodbResourcePolicy(this, "PolicyAttachment", {
|
|
226
|
-
policy: this.resourcePolicy.json,
|
|
227
|
-
resourceArn: this.tableArn,
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
this.resourcePolicy.addStatements(statement);
|
|
231
|
-
return {
|
|
232
|
-
statementAdded: true,
|
|
233
|
-
policyDependable: this,
|
|
234
|
-
};
|
|
276
|
+
return this.grants.fullAccess(grantee);
|
|
235
277
|
}
|
|
236
278
|
metric(metricName, props) {
|
|
237
279
|
return new cloudwatch.Metric({
|
|
@@ -243,9 +285,21 @@ class TableBase extends __1.AwsConstructBase {
|
|
|
243
285
|
...props,
|
|
244
286
|
}).attachTo(this);
|
|
245
287
|
}
|
|
288
|
+
/**
|
|
289
|
+
* Metric for the consumed read capacity units this table
|
|
290
|
+
*
|
|
291
|
+
* By default, the metric will be calculated as a sum over a period of 5 minutes.
|
|
292
|
+
* You can customize this by using the `statistic` and `period` properties.
|
|
293
|
+
*/
|
|
246
294
|
metricConsumedReadCapacityUnits(props) {
|
|
247
295
|
return this.cannedMetric(dynamodb_canned_metrics_generated_1.DynamoDBMetrics.consumedReadCapacityUnitsSum, props);
|
|
248
296
|
}
|
|
297
|
+
/**
|
|
298
|
+
* Metric for the consumed write capacity units this table
|
|
299
|
+
*
|
|
300
|
+
* By default, the metric will be calculated as a sum over a period of 5 minutes.
|
|
301
|
+
* You can customize this by using the `statistic` and `period` properties.
|
|
302
|
+
*/
|
|
249
303
|
metricConsumedWriteCapacityUnits(props) {
|
|
250
304
|
return this.cannedMetric(dynamodb_canned_metrics_generated_1.DynamoDBMetrics.consumedWriteCapacityUnitsSum, props);
|
|
251
305
|
}
|
|
@@ -265,16 +319,31 @@ class TableBase extends __1.AwsConstructBase {
|
|
|
265
319
|
dimensionsMap,
|
|
266
320
|
});
|
|
267
321
|
}
|
|
322
|
+
/**
|
|
323
|
+
* Metric for the user errors. Note that this metric reports user errors across all
|
|
324
|
+
* the tables in the account and region the table resides in.
|
|
325
|
+
*
|
|
326
|
+
* By default, the metric will be calculated as a sum over a period of 5 minutes.
|
|
327
|
+
* You can customize this by using the `statistic` and `period` properties.
|
|
328
|
+
*/
|
|
268
329
|
metricUserErrors(props) {
|
|
269
330
|
if (props?.dimensionsMap) {
|
|
270
331
|
throw new errors_1.ValidationError("'dimensionsMap' is not supported for the 'UserErrors' metric", this);
|
|
271
332
|
}
|
|
333
|
+
// overriding 'dimensions' here because this metric is an account metric.
|
|
334
|
+
// see 'UserErrors' in https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/metrics-dimensions.html
|
|
272
335
|
return this.metric("UserErrors", {
|
|
273
336
|
statistic: "sum",
|
|
274
337
|
...props,
|
|
275
338
|
dimensionsMap: {},
|
|
276
339
|
});
|
|
277
340
|
}
|
|
341
|
+
/**
|
|
342
|
+
* Metric for the conditional check failed requests this table
|
|
343
|
+
*
|
|
344
|
+
* By default, the metric will be calculated as a sum over a period of 5 minutes.
|
|
345
|
+
* You can customize this by using the `statistic` and `period` properties.
|
|
346
|
+
*/
|
|
278
347
|
metricConditionalCheckFailedRequests(props) {
|
|
279
348
|
return this.metric("ConditionalCheckFailedRequests", {
|
|
280
349
|
statistic: "sum",
|
|
@@ -285,6 +354,12 @@ class TableBase extends __1.AwsConstructBase {
|
|
|
285
354
|
metricThrottledRequests(props) {
|
|
286
355
|
return this.metric("ThrottledRequests", { statistic: "sum", ...props });
|
|
287
356
|
}
|
|
357
|
+
/**
|
|
358
|
+
* Metric for the successful request latency this table.
|
|
359
|
+
*
|
|
360
|
+
* By default, the metric will be calculated as an average over a period of 5 minutes.
|
|
361
|
+
* You can customize this by using the `statistic` and `period` properties.
|
|
362
|
+
*/
|
|
288
363
|
metricSuccessfulRequestLatency(props) {
|
|
289
364
|
if (!props?.dimensionsMap?.Operation) {
|
|
290
365
|
throw new errors_1.ValidationError("'Operation' dimension must be passed for the 'SuccessfulRequestLatency' metric.", this);
|
|
@@ -299,6 +374,11 @@ class TableBase extends __1.AwsConstructBase {
|
|
|
299
374
|
dimensionsMap,
|
|
300
375
|
}).attachTo(this);
|
|
301
376
|
}
|
|
377
|
+
/**
|
|
378
|
+
* How many requests are throttled on this table, for the given operation
|
|
379
|
+
*
|
|
380
|
+
* Default: sum over 5 minutes
|
|
381
|
+
*/
|
|
302
382
|
metricThrottledRequestsForOperation(operation, props) {
|
|
303
383
|
return new cloudwatch.Metric({
|
|
304
384
|
...dynamodb_canned_metrics_generated_1.DynamoDBMetrics.throttledRequestsSum({
|
|
@@ -308,12 +388,33 @@ class TableBase extends __1.AwsConstructBase {
|
|
|
308
388
|
...props,
|
|
309
389
|
}).attachTo(this);
|
|
310
390
|
}
|
|
391
|
+
/**
|
|
392
|
+
* How many requests are throttled on this table.
|
|
393
|
+
*
|
|
394
|
+
* This will sum errors across all possible operations.
|
|
395
|
+
* Note that by default, each individual metric will be calculated as a sum over a period of 5 minutes.
|
|
396
|
+
* You can customize this by using the `statistic` and `period` properties.
|
|
397
|
+
*/
|
|
311
398
|
metricThrottledRequestsForOperations(props) {
|
|
312
399
|
return this.sumMetricsForOperations("ThrottledRequests", "Sum of throttled requests across all operations", props);
|
|
313
400
|
}
|
|
401
|
+
/**
|
|
402
|
+
* Metric for the system errors this table.
|
|
403
|
+
*
|
|
404
|
+
* This will sum errors across all possible operations.
|
|
405
|
+
* Note that by default, each individual metric will be calculated as a sum over a period of 5 minutes.
|
|
406
|
+
* You can customize this by using the `statistic` and `period` properties.
|
|
407
|
+
*/
|
|
314
408
|
metricSystemErrorsForOperations(props) {
|
|
315
409
|
return this.sumMetricsForOperations("SystemErrors", "Sum of errors across all operations", props);
|
|
316
410
|
}
|
|
411
|
+
/**
|
|
412
|
+
* Create a math expression for operations.
|
|
413
|
+
*
|
|
414
|
+
* @param metricName The metric name.
|
|
415
|
+
* @param expressionLabel Label for expression
|
|
416
|
+
* @param props operation list
|
|
417
|
+
*/
|
|
317
418
|
sumMetricsForOperations(metricName, expressionLabel, props) {
|
|
318
419
|
if (props?.dimensionsMap?.Operation) {
|
|
319
420
|
throw new errors_1.ValidationError("The Operation dimension is not supported. Use the 'operations' property.", this);
|
|
@@ -323,14 +424,26 @@ class TableBase extends __1.AwsConstructBase {
|
|
|
323
424
|
statistic: "sum",
|
|
324
425
|
...props,
|
|
325
426
|
});
|
|
326
|
-
|
|
427
|
+
const sum = new cloudwatch.MathExpression({
|
|
327
428
|
expression: `${Object.keys(values).join(" + ")}`,
|
|
328
429
|
usingMetrics: { ...values },
|
|
329
430
|
color: props?.color,
|
|
330
431
|
label: expressionLabel,
|
|
331
432
|
period: props?.period,
|
|
332
433
|
});
|
|
434
|
+
return sum;
|
|
333
435
|
}
|
|
436
|
+
/**
|
|
437
|
+
* Create a map of metrics that can be used in a math expression.
|
|
438
|
+
*
|
|
439
|
+
* Using the return value of this function as the `usingMetrics` property in `cloudwatch.MathExpression` allows you to
|
|
440
|
+
* use the keys of this map as metric names inside you expression.
|
|
441
|
+
*
|
|
442
|
+
* @param metricName The metric name.
|
|
443
|
+
* @param operations The list of operations to create metrics for.
|
|
444
|
+
* @param props Properties for the individual metrics.
|
|
445
|
+
* @param metricNameMapper Mapper function to allow controlling the individual metric name per operation.
|
|
446
|
+
*/
|
|
334
447
|
createMetricsForOperations(metricName, operations, props, metricNameMapper) {
|
|
335
448
|
const metrics = {};
|
|
336
449
|
const mapper = metricNameMapper ?? ((op) => op.toLowerCase());
|
|
@@ -356,43 +469,6 @@ class TableBase extends __1.AwsConstructBase {
|
|
|
356
469
|
}
|
|
357
470
|
return metrics;
|
|
358
471
|
}
|
|
359
|
-
combinedGrant(grantee, opts) {
|
|
360
|
-
if (this.encryptionKey && opts.keyActions) {
|
|
361
|
-
this.encryptionKey.grant(grantee, ...opts.keyActions);
|
|
362
|
-
}
|
|
363
|
-
if (opts.tableActions) {
|
|
364
|
-
const resources = [
|
|
365
|
-
this.tableArn,
|
|
366
|
-
cdktf_1.Lazy.stringValue({
|
|
367
|
-
produce: () => this.hasIndex ? `${this.tableArn}/index/*` : undefined,
|
|
368
|
-
}),
|
|
369
|
-
...this.regionalArns,
|
|
370
|
-
...this.regionalArns.map((arn) => cdktf_1.Lazy.stringValue({
|
|
371
|
-
produce: () => (this.hasIndex ? `${arn}/index/*` : undefined),
|
|
372
|
-
})),
|
|
373
|
-
];
|
|
374
|
-
const ret = iam.Grant.addToPrincipalOrResource({
|
|
375
|
-
grantee,
|
|
376
|
-
actions: opts.tableActions,
|
|
377
|
-
resourceArns: resources.filter((r) => r !== undefined),
|
|
378
|
-
resource: this,
|
|
379
|
-
});
|
|
380
|
-
return ret;
|
|
381
|
-
}
|
|
382
|
-
if (opts.streamActions) {
|
|
383
|
-
if (!this.tableStreamArn) {
|
|
384
|
-
throw new errors_1.ValidationError(`DynamoDB Streams must be enabled on the table ${this.node.path}`, this);
|
|
385
|
-
}
|
|
386
|
-
const ret = iam.Grant.addToPrincipalOrResource({
|
|
387
|
-
grantee,
|
|
388
|
-
actions: opts.streamActions,
|
|
389
|
-
resourceArns: [this.tableStreamArn],
|
|
390
|
-
resource: this,
|
|
391
|
-
});
|
|
392
|
-
return ret;
|
|
393
|
-
}
|
|
394
|
-
throw new errors_1.ValidationError(`Unexpected grant combination, actions must be provided for table or stream.`, this);
|
|
395
|
-
}
|
|
396
472
|
cannedMetric(fn, props) {
|
|
397
473
|
return new cloudwatch.Metric({
|
|
398
474
|
...fn({ TableName: this.tableName }),
|
|
@@ -402,7 +478,7 @@ class TableBase extends __1.AwsConstructBase {
|
|
|
402
478
|
}
|
|
403
479
|
exports.TableBase = TableBase;
|
|
404
480
|
_b = JSII_RTTI_SYMBOL_1;
|
|
405
|
-
TableBase[_b] = { fqn: "terraconstructs.aws.storage.TableBase", version: "0.2.
|
|
481
|
+
TableBase[_b] = { fqn: "terraconstructs.aws.storage.TableBase", version: "0.2.2" };
|
|
406
482
|
/**
|
|
407
483
|
* Provides a DynamoDB table.
|
|
408
484
|
*/
|
|
@@ -453,11 +529,16 @@ class Table extends TableBase {
|
|
|
453
529
|
this.hasIndex = (attrs.grantIndexPermissions ?? false) ||
|
|
454
530
|
(attrs.globalIndexes ?? []).length > 0 ||
|
|
455
531
|
(attrs.localIndexes ?? []).length > 0;
|
|
532
|
+
this.regions = [];
|
|
456
533
|
this.tableArn = _tableArn;
|
|
457
534
|
this.tableName = tableName;
|
|
458
535
|
this.tableStreamArn = tableStreamArn;
|
|
459
536
|
this.encryptionKey = attrs.encryptionKey;
|
|
460
537
|
}
|
|
538
|
+
addToResourcePolicy(_statement) {
|
|
539
|
+
// Imported tables cannot have resource policies modified
|
|
540
|
+
return { statementAdded: false };
|
|
541
|
+
}
|
|
461
542
|
}
|
|
462
543
|
let name;
|
|
463
544
|
let arn;
|
|
@@ -495,6 +576,7 @@ class Table extends TableBase {
|
|
|
495
576
|
this.nonKeyAttributes = new Set();
|
|
496
577
|
this.tableScaling = {};
|
|
497
578
|
this.indexScaling = new Map();
|
|
579
|
+
this.regions = new Array();
|
|
498
580
|
const physicalTableName = props.tableName ?? this.stack.uniqueResourceName(this);
|
|
499
581
|
const { sseSpecification, encryptionKey } = this.parseEncryption(props);
|
|
500
582
|
this.encryptionKey = encryptionKey;
|
|
@@ -509,11 +591,11 @@ class Table extends TableBase {
|
|
|
509
591
|
if (props.stream && props.stream !== shared_1.StreamViewType.NEW_AND_OLD_IMAGES) {
|
|
510
592
|
throw new errors_1.ValidationError("`stream` must be set to `NEW_AND_OLD_IMAGES` when specifying `replicationRegions`", this);
|
|
511
593
|
}
|
|
512
|
-
this.billingMode = props.billingMode ?? shared_1.BillingMode.PAY_PER_REQUEST;
|
|
513
594
|
streamSpecification = {
|
|
514
595
|
streamEnabled: true,
|
|
515
596
|
streamViewType: shared_1.StreamViewType.NEW_AND_OLD_IMAGES,
|
|
516
597
|
};
|
|
598
|
+
this.billingMode = props.billingMode ?? shared_1.BillingMode.PAY_PER_REQUEST;
|
|
517
599
|
}
|
|
518
600
|
else {
|
|
519
601
|
this.billingMode = props.billingMode ?? shared_1.BillingMode.PROVISIONED;
|
|
@@ -533,14 +615,16 @@ class Table extends TableBase {
|
|
|
533
615
|
}
|
|
534
616
|
this._replicas = this.renderReplicas(props.replicationRegions, props.replicaSpecification);
|
|
535
617
|
if (this._replicas && this._replicas.length > 0) {
|
|
536
|
-
this._replicas.forEach((r) =>
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
618
|
+
this._replicas.forEach((r) => {
|
|
619
|
+
// Save regional arns for grantXxx() methods
|
|
620
|
+
this.regions?.push(r.regionName);
|
|
621
|
+
this.regionalArns.push(this.stack.formatArn({
|
|
622
|
+
region: r.regionName,
|
|
623
|
+
service: "dynamodb",
|
|
624
|
+
resource: "table",
|
|
625
|
+
resourceName: physicalTableName,
|
|
626
|
+
}));
|
|
627
|
+
});
|
|
544
628
|
}
|
|
545
629
|
this._resource = new provider_aws_1.dynamodbTable.DynamodbTable(this, "Resource", {
|
|
546
630
|
name: physicalTableName,
|
|
@@ -579,8 +663,7 @@ class Table extends TableBase {
|
|
|
579
663
|
importTable: this.renderImportSourceSpecification(props.importSource),
|
|
580
664
|
replica: this._replicas,
|
|
581
665
|
// resourcePolicy: props.resourcePolicy ? { policyDocument: this.stack.toJsonString(props.resourcePolicy.toJSON()) } : undefined, // Not in TF resource
|
|
582
|
-
|
|
583
|
-
// warmThroughput: props.warmThroughput ?? undefined, // Not in TF resource
|
|
666
|
+
warmThroughput: props.warmThroughput,
|
|
584
667
|
});
|
|
585
668
|
this.tableArn = this._resource.arn;
|
|
586
669
|
this.tableName = this._resource.name;
|
|
@@ -603,19 +686,42 @@ class Table extends TableBase {
|
|
|
603
686
|
}),
|
|
604
687
|
});
|
|
605
688
|
}
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
// this.globalSecondaryIndexesInternal
|
|
689
|
+
const contributorInsightsSpecification = this.renderContributorInsights(props);
|
|
690
|
+
if (contributorInsightsSpecification?.enabled) {
|
|
609
691
|
new provider_aws_1.dynamodbContributorInsights.DynamodbContributorInsights(this, "ContributorInsights", {
|
|
610
692
|
tableName: this.tableName,
|
|
611
|
-
|
|
612
|
-
// indexName: iterator.value,
|
|
693
|
+
mode: contributorInsightsSpecification.mode,
|
|
613
694
|
});
|
|
614
695
|
}
|
|
615
696
|
// Commenting out scalingRole initialization - let Terraform auto-create service-linked role
|
|
616
697
|
// this.scalingRole = this.makeScalingRole();
|
|
617
698
|
this.node.addValidation({ validate: () => this.validateTable() });
|
|
618
699
|
}
|
|
700
|
+
/**
|
|
701
|
+
* Adds a statement to the resource policy associated with this table.
|
|
702
|
+
* A resource policy will be automatically created upon the first call to `addToResourcePolicy`.
|
|
703
|
+
*
|
|
704
|
+
* Note that this does not work with imported tables.
|
|
705
|
+
*
|
|
706
|
+
* @param statement The policy statement to add
|
|
707
|
+
*/
|
|
708
|
+
addToResourcePolicy(statement) {
|
|
709
|
+
if (!this.resourcePolicy) {
|
|
710
|
+
// ensure a policy exists and is associated with the table
|
|
711
|
+
this.resourcePolicy = new iam.PolicyDocument(this, "Policy", {
|
|
712
|
+
statement: [],
|
|
713
|
+
});
|
|
714
|
+
new provider_aws_1.dynamodbResourcePolicy.DynamodbResourcePolicy(this, "PolicyAttachment", {
|
|
715
|
+
policy: this.resourcePolicy.json,
|
|
716
|
+
resourceArn: this.tableArn,
|
|
717
|
+
});
|
|
718
|
+
}
|
|
719
|
+
this.resourcePolicy.addStatements(statement);
|
|
720
|
+
return {
|
|
721
|
+
statementAdded: true,
|
|
722
|
+
policyDependable: this,
|
|
723
|
+
};
|
|
724
|
+
}
|
|
619
725
|
addGlobalSecondaryIndex(props) {
|
|
620
726
|
this.validateProvisioningGSI(props);
|
|
621
727
|
this.validateIndexName(props.indexName);
|
|
@@ -643,8 +749,8 @@ class Table extends TableBase {
|
|
|
643
749
|
maxWriteRequestUnits: props.maxWriteRequestUnits,
|
|
644
750
|
}
|
|
645
751
|
: undefined,
|
|
646
|
-
|
|
647
|
-
|
|
752
|
+
contributorInsightsSpecification: props.contributorInsightsSpecification, // Not in TF GSI block
|
|
753
|
+
warmThroughput: props.warmThroughput,
|
|
648
754
|
});
|
|
649
755
|
this.secondaryIndexSchemas.set(props.indexName, {
|
|
650
756
|
partitionKey: props.partitionKey,
|
|
@@ -652,7 +758,13 @@ class Table extends TableBase {
|
|
|
652
758
|
});
|
|
653
759
|
this.indexScaling.set(props.indexName, {});
|
|
654
760
|
}
|
|
761
|
+
/**
|
|
762
|
+
* Add a local secondary index of table.
|
|
763
|
+
*
|
|
764
|
+
* @param props the property of local secondary index
|
|
765
|
+
*/
|
|
655
766
|
addLocalSecondaryIndex(props) {
|
|
767
|
+
// https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html#limits-secondary-indexes
|
|
656
768
|
if (this.localSecondaryIndexesInternal.length >=
|
|
657
769
|
MAX_LOCAL_SECONDARY_INDEX_COUNT) {
|
|
658
770
|
throw new RangeError(`A maximum number of local secondary index per table is ${MAX_LOCAL_SECONDARY_INDEX_COUNT}`);
|
|
@@ -675,6 +787,11 @@ class Table extends TableBase {
|
|
|
675
787
|
sortKey: props.sortKey,
|
|
676
788
|
});
|
|
677
789
|
}
|
|
790
|
+
/**
|
|
791
|
+
* Enable read capacity scaling for this table
|
|
792
|
+
*
|
|
793
|
+
* @returns An object to configure additional AutoScaling settings
|
|
794
|
+
*/
|
|
678
795
|
autoScaleReadCapacity(props) {
|
|
679
796
|
if (this.tableScaling.scalableReadAttribute) {
|
|
680
797
|
throw new errors_1.ValidationError("Read AutoScaling already enabled for this table", this);
|
|
@@ -691,6 +808,11 @@ class Table extends TableBase {
|
|
|
691
808
|
...props,
|
|
692
809
|
}));
|
|
693
810
|
}
|
|
811
|
+
/**
|
|
812
|
+
* Enable write capacity scaling for this table
|
|
813
|
+
*
|
|
814
|
+
* @returns An object to configure additional AutoScaling settings for this attribute
|
|
815
|
+
*/
|
|
694
816
|
autoScaleWriteCapacity(props) {
|
|
695
817
|
if (this.tableScaling.scalableWriteAttribute) {
|
|
696
818
|
throw new errors_1.ValidationError("Write AutoScaling already enabled for this table", this);
|
|
@@ -710,6 +832,11 @@ class Table extends TableBase {
|
|
|
710
832
|
// For TF, this dependency is implicit if the provider handles it, or might need explicit dependsOn if issues arise.
|
|
711
833
|
return this.tableScaling.scalableWriteAttribute;
|
|
712
834
|
}
|
|
835
|
+
/**
|
|
836
|
+
* Enable read capacity scaling for the given GSI
|
|
837
|
+
*
|
|
838
|
+
* @returns An object to configure additional AutoScaling settings for this attribute
|
|
839
|
+
*/
|
|
713
840
|
autoScaleGlobalSecondaryIndexReadCapacity(indexName, props) {
|
|
714
841
|
if (this.billingMode === shared_1.BillingMode.PAY_PER_REQUEST) {
|
|
715
842
|
throw new errors_1.ValidationError("AutoScaling is not available for tables with PAY_PER_REQUEST billing mode", this);
|
|
@@ -729,6 +856,11 @@ class Table extends TableBase {
|
|
|
729
856
|
...props,
|
|
730
857
|
}));
|
|
731
858
|
}
|
|
859
|
+
/**
|
|
860
|
+
* Enable write capacity scaling for the given GSI
|
|
861
|
+
*
|
|
862
|
+
* @returns An object to configure additional AutoScaling settings for this attribute
|
|
863
|
+
*/
|
|
732
864
|
autoScaleGlobalSecondaryIndexWriteCapacity(indexName, props) {
|
|
733
865
|
if (this.billingMode === shared_1.BillingMode.PAY_PER_REQUEST) {
|
|
734
866
|
throw new errors_1.ValidationError("AutoScaling is not available for tables with PAY_PER_REQUEST billing mode", this);
|
|
@@ -748,6 +880,11 @@ class Table extends TableBase {
|
|
|
748
880
|
...props,
|
|
749
881
|
}));
|
|
750
882
|
}
|
|
883
|
+
/**
|
|
884
|
+
* Get schema attributes of table or index.
|
|
885
|
+
*
|
|
886
|
+
* @returns Schema of table or index.
|
|
887
|
+
*/
|
|
751
888
|
schema(indexName) {
|
|
752
889
|
if (!indexName) {
|
|
753
890
|
return {
|
|
@@ -761,6 +898,11 @@ class Table extends TableBase {
|
|
|
761
898
|
}
|
|
762
899
|
return schema;
|
|
763
900
|
}
|
|
901
|
+
/**
|
|
902
|
+
* Validate the table construct.
|
|
903
|
+
*
|
|
904
|
+
* @returns an array of validation error message
|
|
905
|
+
*/
|
|
764
906
|
validateTable() {
|
|
765
907
|
const errors = new Array();
|
|
766
908
|
if (!this.tablePartitionKey) {
|
|
@@ -784,6 +926,11 @@ class Table extends TableBase {
|
|
|
784
926
|
}
|
|
785
927
|
return errors;
|
|
786
928
|
}
|
|
929
|
+
/**
|
|
930
|
+
* Validate read and write capacity are not specified for on-demand tables (billing mode PAY_PER_REQUEST).
|
|
931
|
+
*
|
|
932
|
+
* @param props read and write capacity properties
|
|
933
|
+
*/
|
|
787
934
|
validateProvisioning(props) {
|
|
788
935
|
if (this.billingMode === shared_1.BillingMode.PAY_PER_REQUEST) {
|
|
789
936
|
if (props.readCapacity !== undefined ||
|
|
@@ -800,15 +947,27 @@ class Table extends TableBase {
|
|
|
800
947
|
}
|
|
801
948
|
}
|
|
802
949
|
}
|
|
950
|
+
/**
|
|
951
|
+
* Validate index name to check if a duplicate name already exists.
|
|
952
|
+
*
|
|
953
|
+
* @param indexName a name of global or local secondary index
|
|
954
|
+
*/
|
|
803
955
|
validateIndexName(indexName) {
|
|
804
956
|
if (this.secondaryIndexSchemas.has(indexName)) {
|
|
805
957
|
throw new errors_1.ValidationError(`A duplicate index name, ${indexName}, is not allowed`, this);
|
|
806
958
|
}
|
|
807
959
|
}
|
|
960
|
+
/**
|
|
961
|
+
* Validate non-key attributes by checking limits within secondary index, which may vary in future.
|
|
962
|
+
*
|
|
963
|
+
* @param nonKeyAttributes a list of non-key attribute names
|
|
964
|
+
*/
|
|
808
965
|
validateNonKeyAttributes(nonKeyAttributes) {
|
|
809
966
|
if (this.nonKeyAttributes.size + nonKeyAttributes.length > 100) {
|
|
967
|
+
// https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html#limits-secondary-indexes
|
|
810
968
|
throw new RangeError("A maximum number of nonKeyAttributes across all of secondary indexes is 100");
|
|
811
969
|
}
|
|
970
|
+
// store all non-key attributes
|
|
812
971
|
nonKeyAttributes.forEach((att) => this.nonKeyAttributes.add(att));
|
|
813
972
|
}
|
|
814
973
|
renderPointInTimeRecovery(props) {
|
|
@@ -817,18 +976,26 @@ class Table extends TableBase {
|
|
|
817
976
|
throw new errors_1.ValidationError("`pointInTimeRecoverySpecification` and `pointInTimeRecovery` are set. Use `pointInTimeRecoverySpecification` only.", this);
|
|
818
977
|
}
|
|
819
978
|
const spec = props.pointInTimeRecoverySpecification;
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
979
|
+
const recoveryPeriodInDays = spec?.recoveryPeriodInDays;
|
|
980
|
+
if (!spec?.pointInTimeRecoveryEnabled && recoveryPeriodInDays) {
|
|
981
|
+
throw new errors_1.ValidationError("Cannot set `recoveryPeriodInDays` while `pointInTimeRecoveryEnabled` is set to false.", this);
|
|
982
|
+
}
|
|
983
|
+
if (recoveryPeriodInDays !== undefined &&
|
|
984
|
+
(recoveryPeriodInDays < 1 || recoveryPeriodInDays > 35)) {
|
|
985
|
+
throw new errors_1.ValidationError("`recoveryPeriodInDays` must be a value between `1` and `35`.", this);
|
|
823
986
|
}
|
|
824
987
|
const enabled = spec?.pointInTimeRecoveryEnabled ?? props.pointInTimeRecovery;
|
|
825
988
|
if (enabled === undefined)
|
|
826
989
|
return undefined;
|
|
827
|
-
return { enabled };
|
|
990
|
+
return { enabled, recoveryPeriodInDays };
|
|
991
|
+
}
|
|
992
|
+
renderContributorInsights(props) {
|
|
993
|
+
return (0, shared_1.validateContributorInsights)(props.contributorInsightsEnabled, props.contributorInsightsSpecification, "contributorInsightsEnabled", this);
|
|
828
994
|
}
|
|
829
995
|
buildIndexProjection(props) {
|
|
830
996
|
if (props.projectionType === shared_1.ProjectionType.INCLUDE &&
|
|
831
997
|
!props.nonKeyAttributes) {
|
|
998
|
+
// https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-projectionobject.html
|
|
832
999
|
throw new errors_1.ValidationError(`Non-key attributes should be specified when using ${shared_1.ProjectionType.INCLUDE} projection type`, this);
|
|
833
1000
|
}
|
|
834
1001
|
if (props.projectionType !== shared_1.ProjectionType.INCLUDE &&
|
|
@@ -858,6 +1025,11 @@ class Table extends TableBase {
|
|
|
858
1025
|
// For the main table, hashKey and rangeKey are set directly on the resource.
|
|
859
1026
|
// For GSIs/LSIs, they are part of their respective blocks.
|
|
860
1027
|
}
|
|
1028
|
+
/**
|
|
1029
|
+
* Register the key attribute of table or secondary index to assemble attribute definitions of TableResourceProps.
|
|
1030
|
+
*
|
|
1031
|
+
* @param attribute the key attribute of table or secondary index
|
|
1032
|
+
*/
|
|
861
1033
|
registerAttribute(attribute) {
|
|
862
1034
|
const existingDef = this.attributeDefinitionsInternal.find((def) => def.name === attribute.name);
|
|
863
1035
|
if (existingDef && existingDef.type !== attribute.type) {
|
|
@@ -918,11 +1090,18 @@ class Table extends TableBase {
|
|
|
918
1090
|
regionName: region,
|
|
919
1091
|
}));
|
|
920
1092
|
}
|
|
1093
|
+
/**
|
|
1094
|
+
* Whether this table has indexes
|
|
1095
|
+
*/
|
|
921
1096
|
get hasIndex() {
|
|
922
1097
|
return (this.globalSecondaryIndexesInternal.length +
|
|
923
1098
|
this.localSecondaryIndexesInternal.length >
|
|
924
1099
|
0);
|
|
925
1100
|
}
|
|
1101
|
+
/**
|
|
1102
|
+
* Set up key properties and return the Table encryption property from the
|
|
1103
|
+
* user's configuration.
|
|
1104
|
+
*/
|
|
926
1105
|
parseEncryption(props) {
|
|
927
1106
|
let encryptionType = props.encryption;
|
|
928
1107
|
if (encryptionType != null && props.serverSideEncryption != null) {
|
|
@@ -934,10 +1113,12 @@ class Table extends TableBase {
|
|
|
934
1113
|
if (encryptionType === undefined) {
|
|
935
1114
|
encryptionType =
|
|
936
1115
|
props.encryptionKey != null
|
|
937
|
-
?
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
1116
|
+
? // If there is a configured encryptionKey, the encryption is implicitly CUSTOMER_MANAGED
|
|
1117
|
+
shared_1.TableEncryption.CUSTOMER_MANAGED
|
|
1118
|
+
: // Otherwise, if severSideEncryption is enabled, it's AWS_MANAGED; else undefined (do not set anything)
|
|
1119
|
+
props.serverSideEncryption
|
|
1120
|
+
? shared_1.TableEncryption.AWS_MANAGED
|
|
1121
|
+
: undefined;
|
|
941
1122
|
}
|
|
942
1123
|
if (encryptionType !== shared_1.TableEncryption.CUSTOMER_MANAGED &&
|
|
943
1124
|
props.encryptionKey) {
|
|
@@ -996,8 +1177,29 @@ class Table extends TableBase {
|
|
|
996
1177
|
},
|
|
997
1178
|
};
|
|
998
1179
|
}
|
|
1180
|
+
/**
|
|
1181
|
+
* Adds resource to the Terraform JSON output at Synth time.
|
|
1182
|
+
*
|
|
1183
|
+
* called by TerraformStack.prepareStack()
|
|
1184
|
+
*/
|
|
1185
|
+
toTerraform() {
|
|
1186
|
+
/**
|
|
1187
|
+
* A preparing resolve might add new resources to the stack
|
|
1188
|
+
*/
|
|
1189
|
+
for (const gsi of this.globalSecondaryIndexesInternal) {
|
|
1190
|
+
if (gsi.contributorInsightsSpecification?.enabled) {
|
|
1191
|
+
new provider_aws_1.dynamodbContributorInsights.DynamodbContributorInsights(this, "ContributorInsights", {
|
|
1192
|
+
tableName: this.tableName,
|
|
1193
|
+
indexName: gsi.name,
|
|
1194
|
+
mode: gsi.contributorInsightsSpecification?.mode,
|
|
1195
|
+
});
|
|
1196
|
+
delete gsi.contributorInsightsSpecification;
|
|
1197
|
+
}
|
|
1198
|
+
}
|
|
1199
|
+
return {};
|
|
1200
|
+
}
|
|
999
1201
|
}
|
|
1000
1202
|
exports.Table = Table;
|
|
1001
1203
|
_c = JSII_RTTI_SYMBOL_1;
|
|
1002
|
-
Table[_c] = { fqn: "terraconstructs.aws.storage.Table", version: "0.2.
|
|
1003
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzL3N0b3JhZ2UvdGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4RkFBOEY7QUFFOUYsc0RBSzZCO0FBQzdCLGlDQUFpRDtBQUdqRCwwQkFBOEU7QUFDOUUsMkZBQXNFO0FBQ3RFLDBDQUEwQztBQUsxQyx5RUFBb0U7QUFDcEUscUNBY2tCO0FBQ2xCLHlDQUF3RTtBQUN4RSw0Q0FBNEM7QUFDNUMseUNBQXlDO0FBQ3pDLHFDQUFxQztBQUNyQyw4QkFBOEI7QUFFOUIsNERBQTREO0FBQzVELHFHQUFxRztBQUNyRyw2Q0FBNkM7QUFFN0MsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDO0FBQzdCLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQztBQUUvQixNQUFNLCtCQUErQixHQUFHLENBQUMsQ0FBQztBQW1CMUM7O0dBRUc7QUFDSCxJQUFZLG9CQWVYO0FBZkQsV0FBWSxvQkFBb0I7SUFDOUI7O09BRUc7SUFDSCxxQ0FBYSxDQUFBO0lBRWI7O09BRUc7SUFDSCxxQ0FBYSxDQUFBO0lBRWI7O09BRUc7SUFDSCxxQ0FBYSxDQUFBO0FBQ2YsQ0FBQyxFQWZXLG9CQUFvQixvQ0FBcEIsb0JBQW9CLFFBZS9CO0FBZ0NEOztHQUVHO0FBQ0gsTUFBc0IsV0FBVztJQUMvQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxZQUFZO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLEtBQU0sU0FBUSxXQUFXO1lBQzVCLE9BQU87Z0JBSVosT0FBTztvQkFDTCxXQUFXLEVBQUUsZUFBZTtpQkFDN0IsQ0FBQztZQUNKLENBQUM7U0FDRixDQUFDLEVBQUUsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxHQUFHO1FBQ2YsT0FBTyxJQUFJLENBQUMsS0FBTSxTQUFRLFdBQVc7WUFDNUIsT0FBTztnQkFJWixPQUFPO29CQUNMLFdBQVcsRUFBRSxLQUFLO2lCQUNu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QixDQUFDLGtCQUFrQjtZQUMxRCxvQkFBb0IsRUFBRSxZQUFZLENBQUMsZUFBZTtZQUNsRCxjQUFjLEVBQUU7Z0JBQ2QsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVTtnQkFDdEMsV0FBVyxFQUFFLFlBQVksQ0FBQyxXQUFXO2dCQUNyQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFNBQVM7YUFDbEM7U0FDRixDQUFDO0lBQ0osQ0FBQzs7QUFsN0JILHNCQW03QkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xODYuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtZHluYW1vZGIvbGliL3RhYmxlLnRzXG5cbmltcG9ydCB7XG4gIGR5bmFtb2RiQ29udHJpYnV0b3JJbnNpZ2h0cyxcbiAgZHluYW1vZGJLaW5lc2lzU3RyZWFtaW5nRGVzdGluYXRpb24sXG4gIGR5bmFtb2RiUmVzb3VyY2VQb2xpY3ksXG4gIGR5bmFtb2RiVGFibGUsXG59IGZyb20gXCJAY2RrdGYvcHJvdmlkZXItYXdzXCI7XG5pbXBvcnQgeyBUb2tlbiwgTGF6eSwgQW5ub3RhdGlvbnMgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgKiBhcyBzdG9yYWdlIGZyb20gXCIuXCI7XG5pbXBvcnQgeyBBcm5Gb3JtYXQsIEF3c0NvbnN0cnVjdEJhc2UsIEF3c0NvbnN0cnVjdFByb3BzLCBBd3NTdGFjayB9IGZyb20gXCIuLlwiO1xuaW1wb3J0IHsgRHluYW1vREJNZXRyaWNzIH0gZnJvbSBcIi4vZHluYW1vZGItY2FubmVkLW1ldHJpY3MuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgKiBhcyBwZXJtcyBmcm9tIFwiLi9keW5hbW9kYi1wZXJtc1wiO1xuaW1wb3J0IHtcbiAgRW5hYmxlU2NhbGluZ1Byb3BzLFxuICBJU2NhbGFibGVUYWJsZUF0dHJpYnV0ZSxcbn0gZnJvbSBcIi4vc2NhbGFibGUtYXR0cmlidXRlLWFwaVwiO1xuaW1wb3J0IHsgU2NhbGFibGVUYWJsZUF0dHJpYnV0ZSB9IGZyb20gXCIuL3NjYWxhYmxlLXRhYmxlLWF0dHJpYnV0ZVwiO1xuaW1wb3J0IHtcbiAgT3BlcmF0aW9uLFxuICBPcGVyYXRpb25zTWV0cmljT3B0aW9ucyxcbiAgU3lzdGVtRXJyb3JzRm9yT3BlcmF0aW9uc01ldHJpY09wdGlvbnMsXG4gIEF0dHJpYnV0ZSxcbiAgQmlsbGluZ01vZGUsXG4gIFByb2plY3Rpb25UeXBlLFxuICBJVGFibGUsXG4gIFNlY29uZGFyeUluZGV4UHJvcHMsXG4gIFRhYmxlQ2xhc3MsXG4gIExvY2FsU2Vjb25kYXJ5SW5kZXhQcm9wcyxcbiAgVGFibGVFbmNyeXB0aW9uLFxuICBTdHJlYW1WaWV3VHlwZSxcbiAgUG9pbnRJblRpbWVSZWNvdmVyeVNwZWNpZmljYXRpb24sXG59IGZyb20gXCIuL3NoYXJlZFwiO1xuaW1wb3J0IHsgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvcnNcIjtcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSBcIi4uL2Nsb3Vkd2F0Y2hcIjtcbmltcG9ydCAqIGFzIGFwcHNjYWxpbmcgZnJvbSBcIi4uL2NvbXB1dGVcIjtcbmltcG9ydCAqIGFzIGttcyBmcm9tIFwiLi4vZW5jcnlwdGlvblwiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCIuLi9pYW1cIjtcbmltcG9ydCAqIGFzIGtpbmVzaXMgZnJvbSBcIi4uL25vdGlmeVwiO1xuLy8gTWlzc2luZyBpbiBUZXJyYWZvcm0gRHluYW1vRGIgUmVwbGljYSBDb25maWd1cmF0aW9uIGJsb2NrXG4vLyBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg4LjAvZG9jcy9yZXNvdXJjZXMvZHluYW1vZGJfdGFibGUjcmVwbGljYVxuLy8gaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tIFwiLi4vLi4vZHVyYXRpb25cIjtcblxuY29uc3QgSEFTSF9LRVlfVFlQRSA9IFwiSEFTSFwiO1xuY29uc3QgUkFOR0VfS0VZX1RZUEUgPSBcIlJBTkdFXCI7XG5cbmNvbnN0IE1BWF9MT0NBTF9TRUNPTkRBUllfSU5ERVhfQ09VTlQgPSA1O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHRhYmxlIHNjaGVtYSBhdHRyaWJ1dGVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYU9wdGlvbnMge1xuICAvKipcbiAgICogUGFydGl0aW9uIGtleSBhdHRyaWJ1dGUgZGVmaW5pdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBhcnRpdGlvbktleTogQXR0cmlidXRlO1xuXG4gIC8qKlxuICAgKiBTb3J0IGtleSBhdHRyaWJ1dGUgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgbm8gc29ydCBrZXlcbiAgICovXG4gIHJlYWRvbmx5IHNvcnRLZXk/OiBBdHRyaWJ1dGU7XG59XG5cbi8qKlxuICogVHlwZSBvZiBjb21wcmVzc2lvbiB0byB1c2UgZm9yIGltcG9ydGVkIGRhdGEuXG4gKi9cbmV4cG9ydCBlbnVtIElucHV0Q29tcHJlc3Npb25UeXBlIHtcbiAgLyoqXG4gICAqIEdaSVAgY29tcHJlc3Npb24uXG4gICAqL1xuICBHWklQID0gXCJHWklQXCIsXG5cbiAgLyoqXG4gICAqIFpTVEQgY29tcHJlc3Npb24uXG4gICAqL1xuICBaU1REID0gXCJaU1REXCIsXG5cbiAgLyoqXG4gICAqIE5vIGNvbXByZXNzaW9uLlxuICAgKi9cbiAgTk9ORSA9IFwiTk9ORVwiLFxufVxuXG4vKipcbiAqIFRoZSBvcHRpb25zIGZvciBpbXBvcnRlZCBzb3VyY2UgZmlsZXMgaW4gQ1NWIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDc3ZPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBkZWxpbWl0ZXIgdXNlZCBmb3Igc2VwYXJhdGluZyBpdGVtcyBpbiB0aGUgQ1NWIGZpbGUgYmVpbmcgaW1wb3J0ZWQuXG4gICAqXG4gICAqIFZhbGlkIGRlbGltaXRlcnMgYXJlIGFzIGZvbGxvd3M6XG4gICAqIC0gY29tbWEgKGAsYClcbiAgICogLSB0YWIgKGBcXHRgKVxuICAgKiAtIGNvbG9uIChgOmApXG4gICAqIC0gc2VtaWNvbG9uIChgO2ApXG4gICAqIC0gcGlwZSAoYHxgKVxuICAgKiAtIHNwYWNlIChgIGApXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdXNlIGNvbW1hIGFzIGEgZGVsaW1pdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVsaW1pdGVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHRoZSBoZWFkZXJzIHVzZWQgdG8gc3BlY2lmeSBhIGNvbW1vbiBoZWFkZXIgZm9yIGFsbCBzb3VyY2UgQ1NWIGZpbGVzIGJlaW5nIGltcG9ydGVkLlxuICAgKlxuICAgKiAqKk5PVEUqKjogSWYgdGhpcyBmaWVsZCBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgbGluZSBvZiBlYWNoIENTViBmaWxlIGlzIHRyZWF0ZWQgYXMgZGF0YSBpbnN0ZWFkIG9mIHRoZSBoZWFkZXIuXG4gICAqIElmIHRoaXMgZmllbGQgaXMgbm90IHNwZWNpZmllZCB0aGUgdGhlIGZpcnN0IGxpbmUgb2YgZWFjaCBDU1YgZmlsZSBpcyB0cmVhdGVkIGFzIHRoZSBoZWFkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGZpcnN0IGxpbmUgb2YgdGhlIENTViBmaWxlIGlzIHRyZWF0ZWQgYXMgdGhlIGhlYWRlclxuICAgKi9cbiAgcmVhZG9ubHkgaGVhZGVyTGlzdD86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBmb3JtYXQgb2YgdGhlIHNvdXJjZSBkYXRhLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSW5wdXRGb3JtYXQge1xuICAvKipcbiAgICogRHluYW1vREIgSlNPTiBmb3JtYXQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGR5bmFtb0RCSnNvbigpOiBJbnB1dEZvcm1hdCB7XG4gICAgcmV0dXJuIG5ldyAoY2xhc3MgZXh0ZW5kcyBJbnB1dEZvcm1hdCB7XG4gICAgICBwdWJsaWMgX3JlbmRlcigpOiBQaWNrPFxuICAgICAgICBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVJbXBvcnRUYWJsZSxcbiAgICAgICAgXCJpbnB1dEZvcm1hdFwiIHwgXCJpbnB1dEZvcm1hdE9wdGlvbnNcIlxuICAgICAgPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW5wdXRGb3JtYXQ6IFwiRFlOQU1PREJfSlNPTlwiLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pKCk7XG4gIH1cblxuICAvKipcbiAgICogQW1hem9uIElvbiBmb3JtYXQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlvbigpOiBJbnB1dEZvcm1hdCB7XG4gICAgcmV0dXJuIG5ldyAoY2xhc3MgZXh0ZW5kcyBJbnB1dEZvcm1hdCB7XG4gICAgICBwdWJsaWMgX3JlbmRlcigpOiBQaWNrPFxuICAgICAgICBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVJbXBvcnRUYWJsZSxcbiAgICAgICAgXCJpbnB1dEZvcm1hdFwiIHwgXCJpbnB1dEZvcm1hdE9wdGlvbnNcIlxuICAgICAgPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW5wdXRGb3JtYXQ6IFwiSU9OXCIsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU1YgZm9ybWF0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjc3Yob3B0aW9ucz86IENzdk9wdGlvbnMpOiBJbnB1dEZvcm1hdCB7XG4gICAgaWYgKFxuICAgICAgb3B0aW9ucz8uZGVsaW1pdGVyICYmXG4gICAgICAoIXRoaXMudmFsaWRDc3ZEZWxpbWl0ZXJzLmluY2x1ZGVzKG9wdGlvbnMuZGVsaW1pdGVyKSB8fFxuICAgICAgICBvcHRpb25zLmRlbGltaXRlci5sZW5ndGggIT09IDEpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFtcbiAgICAgICAgICBcIkRlbGltaXRlciBtdXN0IGJlIGEgc2luZ2xlIGNoYXJhY3RlciBhbmQgb25lIG9mIHRoZSBmb2xsb3dpbmc6XCIsXG4gICAgICAgICAgYCR7dGhpcy5yZWFkYWJsZVZhbGlkQ3N2RGVsaW1pdGVycy5qb2luKFwiLCBcIil9LGAsXG4gICAgICAgICAgYGdvdCAnJHtvcHRpb25zLmRlbGltaXRlcn0nYCxcbiAgICAgICAgXS5qb2luKFwiIFwiKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyAoY2xhc3MgZXh0ZW5kcyBJbnB1dEZvcm1hdCB7XG4gICAgICBwdWJsaWMgX3JlbmRlcigpOiBQaWNrPFxuICAgICAgICBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVJbXBvcnRUYWJsZSxcbiAgICAgICAgXCJpbnB1dEZvcm1hdFwiIHwgXCJpbnB1dEZvcm1hdE9wdGlvbnNcIlxuICAgICAgPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW5wdXRGb3JtYXQ6IFwiQ1NWXCIsXG4gICAgICAgICAgaW5wdXRGb3JtYXRPcHRpb25zOiBvcHRpb25zXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBjc3Y6IHtcbiAgICAgICAgICAgICAgICAgIGRlbGltaXRlcjogb3B0aW9ucz8uZGVsaW1pdGVyLFxuICAgICAgICAgICAgICAgICAgaGVhZGVyTGlzdDogb3B0aW9ucz8uaGVhZGVyTGlzdCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgdmFsaWRDc3ZEZWxpbWl0ZXJzID0gW1wiLFwiLCBcIlxcdFwiLCBcIjpcIiwgXCI7XCIsIFwifFwiLCBcIiBcIl07XG4gIHByaXZhdGUgc3RhdGljIHJlYWRhYmxlVmFsaWRDc3ZEZWxpbWl0ZXJzID0gW1xuICAgIFwiY29tbWEgKCwpXCIsXG4gICAgXCJ0YWIgKFxcXFx0KVwiLFxuICAgIFwiY29sb24gKDopXCIsXG4gICAgXCJzZW1pY29sb24gKDspXCIsXG4gICAgXCJwaXBlICh8KVwiLFxuICAgIFwic3BhY2UgKCApXCIsXG4gIF07XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IF9yZW5kZXIoKTogUGljazxcbiAgICBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVJbXBvcnRUYWJsZSxcbiAgICBcImlucHV0Rm9ybWF0XCIgfCBcImlucHV0Rm9ybWF0T3B0aW9uc1wiXG4gID47XG59XG5cbi8qKlxuICogIFByb3BlcnRpZXMgZm9yIGltcG9ydGluZyBkYXRhIGZyb20gdGhlIFMzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltcG9ydFNvdXJjZVNwZWNpZmljYXRpb24ge1xuICAvKipcbiAgICogVGhlIGNvbXByZXNzaW9uIHR5cGUgb2YgdGhlIGltcG9ydGVkIGRhdGEuXG4gICAqXG4gICAqIEBkZWZhdWx0IElucHV0Q29tcHJlc3Npb25UeXBlLk5PTkVcbiAgICovXG4gIHJlYWRvbmx5IGNvbXByZXNzaW9uVHlwZT86IElucHV0Q29tcHJlc3Npb25UeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0IG9mIHRoZSBpbXBvcnRlZCBkYXRhLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRGb3JtYXQ6IElucHV0Rm9ybWF0O1xuXG4gIC8qKlxuICAgKiBUaGUgUzMgYnVja2V0IHRoYXQgaXMgYmVpbmcgaW1wb3J0ZWQgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldDogc3RvcmFnZS5JQnVja2V0O1xuXG4gIC8qKlxuICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIFMzIGJ1Y2tldCB0aGF0IGlzIGJlaW5nIGltcG9ydGVkIGZyb20uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldE93bmVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUga2V5IHByZWZpeCBzaGFyZWQgYnkgYWxsIFMzIE9iamVjdHMgdGhhdCBhcmUgYmVpbmcgaW1wb3J0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IGtleVByZWZpeD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcHJlY2lzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgRHluYW1vREIgd3JpdGUgdGltZXN0YW1wcyB0aGF0IHdpbGwgYmUgcmVwbGljYXRlZCB0byBLaW5lc2lzLlxuICogVGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgcmVjb3JkIHRpbWVzdGFtcCBwcmVjaXNpb24gaXMgbWljcm9zZWNvbmRzLiBZb3UgY2FuIGNoYW5nZSB0aGlzIHNldHRpbmcgYXQgYW55IHRpbWUuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWR5bmFtb2RiLXRhYmxlLWtpbmVzaXNzdHJlYW1zcGVjaWZpY2F0aW9uLmh0bWwjYXdzLXByb3BlcnRpZXMtZHluYW1vZGItdGFibGUta2luZXNpc3N0cmVhbXNwZWNpZmljYXRpb24tcHJvcGVydGllc1xuICovXG5leHBvcnQgZW51bSBBcHByb3hpbWF0ZUNyZWF0aW9uRGF0ZVRpbWVQcmVjaXNpb24ge1xuICAvKipcbiAgICogTWlsbGlzZWNvbmQgcHJlY2lzaW9uXG4gICAqL1xuICBNSUxMSVNFQ09ORCA9IFwiTUlMTElTRUNPTkRcIixcblxuICAvKipcbiAgICogTWljcm9zZWNvbmQgcHJlY2lzaW9uXG4gICAqL1xuICBNSUNST1NFQ09ORCA9IFwiTUlDUk9TRUNPTkRcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEeW5hbW9kYlRhYmxlUmVwbGljYSB7XG4gIC8qKiAoT3B0aW9uYWwpIEFSTiBvZiB0aGUgQ01LIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBBV1MgS01TIGVuY3J5cHRpb24uIFRoaXMgYXJndW1lbnQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB0aGUga2V5IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0IEtNUy1tYW5hZ2VkIER5bmFtb0RCIGtleSwgYGFsaWFzL2F3cy9keW5hbW9kYmAuICoqTm90ZToqKiBUaGlzIGF0dHJpYnV0ZSB3aWxsIF9ub3RfIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBBUk4gb2YgX2RlZmF1bHRfIGtleXMuICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcbiAgLyoqIChPcHRpb25hbCkgV2hldGhlciB0byBlbmFibGUgUG9pbnQgSW4gVGltZSBSZWNvdmVyeSBmb3IgdGhlIHJlcGxpY2EuIERlZmF1bHQgaXMgYGZhbHNlYC4gKi9cbiAgcmVhZG9ubHkgcG9pbnRJblRpbWVSZWNvdmVyeT86IGJvb2xlYW47XG4gIC8qKiAoT3B0aW9uYWwpIFdoZXRoZXIgdG8gcHJvcGFnYXRlIHRoZSBnbG9iYWwgdGFibGUncyB0YWdzIHRvIGEgcmVwbGljYS4gRGVmYXVsdCBpcyBgZmFsc2VgLiBDaGFuZ2VzIHRvIHRhZ3Mgb25seSBtb3ZlIGluIG9uZSBkaXJlY3Rpb246IGZyb20gZ2xvYmFsIChzb3VyY2UpIHRvIHJlcGxpY2EuIEluIG90aGVyIHdvcmRzLCB0YWcgZHJpZnQgb24gYSByZXBsaWNhIHdpbGwgbm90IHRyaWdnZXIgYW4gdXBkYXRlLiBUYWcgb3IgcmVwbGljYSBjaGFuZ2VzIG9uIHRoZSBnbG9iYWwgdGFibGUsIHdoZXRoZXIgZnJvbSBkcmlmdCBvciBjb25maWd1cmF0aW9uIGNoYW5nZXMsIGFyZSBwcm9wYWdhdGVkIHRvIHJlcGxpY2FzLiBDaGFuZ2luZyBmcm9tIGB0cnVlYCB0byBgZmFsc2VgIG9uIGEgc3Vic2VxdWVudCBgYXBwbHlgIG1lYW5zIHJlcGxpY2EgdGFncyBhcmUgbGVmdCBhcyB0aGV5IHdlcmUsIHVubWFuYWdlZCwgbm90IGRlbGV0ZWQuICovXG4gIHJlYWRvbmx5IHByb3BhZ2F0ZVRhZ3M/OiBib29sZWFuO1xuICAvKiogKFJlcXVpcmVkKSBSZWdpb24gbmFtZSBvZiB0aGUgcmVwbGljYS4gKi9cbiAgcmVhZG9ubHkgcmVnaW9uTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgb2YgYSBEeW5hbW9EQiBUYWJsZVxuICpcbiAqIFVzZSBgVGFibGVQcm9wc2AgZm9yIGFsbCB0YWJsZSBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVPcHRpb25zIGV4dGVuZHMgU2NoZW1hT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgcmVhZCBjYXBhY2l0eSBmb3IgdGhlIHRhYmxlLiBDYXJlZnVsIGlmIHlvdSBhZGQgR2xvYmFsIFNlY29uZGFyeSBJbmRleGVzLCBhc1xuICAgKiB0aG9zZSB3aWxsIHNoYXJlIHRoZSB0YWJsZSdzIHByb3Zpc2lvbmVkIHRocm91Z2hwdXQuXG4gICAqXG4gICAqIENhbiBvbmx5IGJlIHByb3ZpZGVkIGlmIGJpbGxpbmdNb2RlIGlzIFByb3Zpc2lvbmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCA1XG4gICAqL1xuICByZWFkb25seSByZWFkQ2FwYWNpdHk/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgd3JpdGUgY2FwYWNpdHkgZm9yIHRoZSB0YWJsZS4gQ2FyZWZ1bCBpZiB5b3UgYWRkIEdsb2JhbCBTZWNvbmRhcnkgSW5kZXhlcywgYXNcbiAgICogdGhvc2Ugd2lsbCBzaGFyZSB0aGUgdGFibGUncyBwcm92aXNpb25lZCB0aHJvdWdocHV0LlxuICAgKlxuICAgKiBDYW4gb25seSBiZSBwcm92aWRlZCBpZiBiaWxsaW5nTW9kZSBpcyBQcm92aXNpb25lZC5cbiAgICpcbiAgICogQGRlZmF1bHQgNVxuICAgKi9cbiAgcmVhZG9ubHkgd3JpdGVDYXBhY2l0eT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gcmVhZCByZXF1ZXN0IHVuaXRzIGZvciB0aGUgdGFibGUuIENhcmVmdWwgaWYgeW91IGFkZCBHbG9iYWwgU2Vjb25kYXJ5IEluZGV4ZXMsIGFzXG4gICAqIHRob3NlIHdpbGwgc2hhcmUgdGhlIHRhYmxlJ3MgbWF4aW11bSBvbi1kZW1hbmQgdGhyb3VnaHB1dC5cbiAgICpcbiAgICogQ2FuIG9ubHkgYmUgcHJvdmlkZWQgaWYgYmlsbGluZ01vZGUgaXMgUEFZX1BFUl9SRVFVRVNULlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG9uLWRlbWFuZCB0aHJvdWdocHV0IGlzIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSBtYXhSZWFkUmVxdWVzdFVuaXRzPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHdyaXRlIHJlcXVlc3QgdW5pdHMgZm9yIHRoZSB0YWJsZS4gQ2FyZWZ1bCBpZiB5b3UgYWRkIEdsb2JhbCBTZWNvbmRhcnkgSW5kZXhlcywgYXNcbiAgICogdGhvc2Ugd2lsbCBzaGFyZSB0aGUgdGFibGUncyBtYXhpbXVtIG9uLWRlbWFuZCB0aHJvdWdocHV0LlxuICAgKlxuICAgKiBDYW4gb25seSBiZSBwcm92aWRlZCBpZiBiaWxsaW5nTW9kZSBpcyBQQVlfUEVSX1JFUVVFU1QuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gb24tZGVtYW5kIHRocm91Z2hwdXQgaXMgZGlzYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IG1heFdyaXRlUmVxdWVzdFVuaXRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGhvdyB5b3UgYXJlIGNoYXJnZWQgZm9yIHJlYWQgYW5kIHdyaXRlIHRocm91Z2hwdXQgYW5kIGhvdyB5b3UgbWFuYWdlIGNhcGFjaXR5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBQUk9WSVNJT05FRCBpZiBgcmVwbGljYXRpb25SZWdpb25zYCBpcyBub3Qgc3BlY2lmaWVkLCBQQVlfUEVSX1JFUVVFU1Qgb3RoZXJ3aXNlXG4gICAqL1xuICByZWFkb25seSBiaWxsaW5nTW9kZT86IEJpbGxpbmdNb2RlO1xuXG4gIC8vIFRPRE86IGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdGVycmFmb3JtLXByb3ZpZGVyLWF3cy9pc3N1ZXMvNDMxNDJcbiAgLy8gcmVhZG9ubHkgd2FybVRocm91Z2hwdXQ/OiBXYXJtVGhyb3VnaHB1dDtcblxuICAvKipcbiAgICogV2hldGhlciBwb2ludC1pbi10aW1lIHJlY292ZXJ5IGlzIGVuYWJsZWQuXG4gICAqIEBkZXByZWNhdGVkIHVzZSBgcG9pbnRJblRpbWVSZWNvdmVyeVNwZWNpZmljYXRpb25gIGluc3RlYWRcbiAgICogQGRlZmF1bHQgZmFsc2UgLSBwb2ludCBpbiB0aW1lIHJlY292ZXJ5IGlzIG5vdCBlbmFibGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9pbnRJblRpbWVSZWNvdmVyeT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgcG9pbnQtaW4tdGltZSByZWNvdmVyeSBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHBvaW50IGluIHRpbWUgcmVjb3ZlcnkgaXMgbm90IGVuYWJsZWQuXG4gICAqL1xuICByZWFkb25seSBwb2ludEluVGltZVJlY292ZXJ5U3BlY2lmaWNhdGlvbj86IFBvaW50SW5UaW1lUmVjb3ZlcnlTcGVjaWZpY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gd2l0aCBhbiBBV1MgbWFuYWdlZCBjdXN0b21lciBtYXN0ZXIga2V5IGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgY2Fubm90IGJlIHNldCBpZiBgZW5jcnlwdGlvbmAgYW5kL29yIGBlbmNyeXB0aW9uS2V5YCBpcyBzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhlIHRhYmxlIGlzIGVuY3J5cHRlZCB3aXRoIGFuIGVuY3J5cHRpb24ga2V5IG1hbmFnZWQgYnkgRHluYW1vREIsIGFuZCB5b3UgYXJlIG5vdCBjaGFyZ2VkIGFueSBmZWUgZm9yIHVzaW5nIGl0LlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBUaGlzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQuIEluIG9yZGVyIHRvIG9idGFpbiB0aGUgc2FtZSBiZWhhdmlvciBhc1xuICAgKiBlbmFibGluZyB0aGlzLCBzZXQgdGhlIGBlbmNyeXB0aW9uYCBwcm9wZXJ0eSB0byBgVGFibGVFbmNyeXB0aW9uLkFXU19NQU5BR0VEYCBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmVyU2lkZUVuY3J5cHRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHRoZSB0YWJsZSBjbGFzcy5cbiAgICogQGRlZmF1bHQgU1RBTkRBUkRcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlQ2xhc3M/OiBUYWJsZUNsYXNzO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gd2l0aCBhbiBBV1MgbWFuYWdlZCBjdXN0b21lciBtYXN0ZXIga2V5IGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgY2Fubm90IGJlIHNldCBpZiBgc2VydmVyU2lkZUVuY3J5cHRpb25gIGlzIHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgdGFibGUgaXMgZW5jcnlwdGVkIHdpdGggYW4gZW5jcnlwdGlvbiBrZXkgbWFuYWdlZCBieSBEeW5hbW9EQiwgYW5kIHlvdSBhcmUgbm90IGNoYXJnZWQgYW55IGZlZSBmb3IgdXNpbmcgaXQuXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uPzogVGFibGVFbmNyeXB0aW9uO1xuXG4gIC8qKlxuICAgKiBFeHRlcm5hbCBLTVMga2V5IHRvIHVzZSBmb3IgdGFibGUgZW5jcnlwdGlvbi5cbiAgICpcbiAgICogVGhpcyBwcm9wZXJ0eSBjYW4gb25seSBiZSBzZXQgaWYgYGVuY3J5cHRpb25gIGlzIHNldCB0byBgVGFibGVFbmNyeXB0aW9uLkNVU1RPTUVSX01BTkFHRURgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIGBlbmNyeXB0aW9uYCBpcyBzZXQgdG8gYFRhYmxlRW5jcnlwdGlvbi5DVVNUT01FUl9NQU5BR0VEYCBhbmQgdGhpc1xuICAgKiBwcm9wZXJ0eSBpcyB1bmRlZmluZWQsIGEgbmV3IEtNUyBrZXkgd2lsbCBiZSBjcmVhdGVkIGFuZCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YWJsZS5cbiAgICogSWYgYGVuY3J5cHRpb25gIGFuZCB0aGlzIHByb3BlcnR5IGFyZSBib3RoIHVuZGVmaW5lZCwgdGhlbiB0aGUgdGFibGUgaXMgZW5jcnlwdGVkIHdpdGhcbiAgICogYW4gZW5jcnlwdGlvbiBrZXkgbWFuYWdlZCBieSBEeW5hbW9EQiwgYW5kIHlvdSBhcmUgbm90IGNoYXJnZWQgYW55IGZlZSBmb3IgdXNpbmcgaXQuXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIFRUTCBhdHRyaWJ1dGUuXG4gICAqIEBkZWZhdWx0IC0gVFRMIGlzIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSB0aW1lVG9MaXZlQXR0cmlidXRlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVuIGFuIGl0ZW0gaW4gdGhlIHRhYmxlIGlzIG1vZGlmaWVkLCBTdHJlYW1WaWV3VHlwZSBkZXRlcm1pbmVzIHdoYXQgaW5mb3JtYXRpb25cbiAgICogaXMgd3JpdHRlbiB0byB0aGUgc3RyZWFtIGZvciB0aGlzIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHN0cmVhbXMgYXJlIGRpc2FibGVkIHVubGVzcyBgcmVwbGljYXRpb25SZWdpb25zYCBpcyBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHN0cmVhbT86IFN0cmVhbVZpZXdUeXBlO1xuXG4gIC8qKlxuICAgKiBSZWdpb25zIHdoZXJlIHJlcGxpY2EgdGFibGVzIHdpbGwgYmUgY3JlYXRlZFxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgcmVwbGljYVNwZWNpZmljYXRpb24gaW5zdGVhZFxuICAgKiBAZGVmYXVsdCAtIG5vIHJlcGxpY2EgdGFibGVzIGFyZSBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSByZXBsaWNhdGlvblJlZ2lvbnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIHNwZWNpZmljYXRpb24gZm9yIHJlcGxpY2EgdGFibGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwbGljYVNwZWNpZmljYXRpb24/OiBEeW5hbW9kYlRhYmxlUmVwbGljYVtdO1xuXG4gIC8vIHJlYWRvbmx5IHJlcGxpY2F0aW9uVGltZW91dD86IER1cmF0aW9uOyAvLyBOb3QgZGlyZWN0bHkgYXBwbGljYWJsZSB0byBURidzIHJlcGxpY2EgYmxvY2sgY29uZmlndXJhdGlvblxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIENsb3VkV2F0Y2ggY29udHJpYnV0b3IgaW5zaWdodHMgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRyaWJ1dG9ySW5zaWdodHNFbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBkZWxldGlvbiBwcm90ZWN0aW9uIGZvciB0aGUgdGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBkZWxldGlvblByb3RlY3Rpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyBvZiBkYXRhIGJlaW5nIGltcG9ydGVkIGZyb20gdGhlIFMzIGJ1Y2tldCBzb3VyY2UgdG8gdGhlIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGRhdGEgaW1wb3J0IGZyb20gdGhlIFMzIGJ1Y2tldFxuICAgKi9cbiAgcmVhZG9ubHkgaW1wb3J0U291cmNlPzogSW1wb3J0U291cmNlU3BlY2lmaWNhdGlvbjtcblxuICAvKipcbiAgICogUmVzb3VyY2UgcG9saWN5IHRvIGFzc2lnbiB0byB0YWJsZS5cbiAgICogTm90ZTogYGF3c19keW5hbW9kYl90YWJsZWAgZG9lcyBub3QgZGlyZWN0bHkgc3VwcG9ydCBhIHJlc291cmNlIHBvbGljeSBwcm9wZXJ0eS5cbiAgICogVGhpcyBwb2xpY3kgd291bGQgbmVlZCB0byBiZSBtYW5hZ2VkIGFuZCBhcHBsaWVkIHNlcGFyYXRlbHksIGUuZy4sIHZpYSBgYXdzX2lhbV9wb2xpY3lgIGF0dGFjaGVkIHRvIHByaW5jaXBhbHMuXG4gICAqIEBkZWZhdWx0IC0gTm8gcmVzb3VyY2UgcG9saWN5IHN0YXRlbWVudFxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VQb2xpY3k/OiBpYW0uUG9saWN5RG9jdW1lbnQ7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYSBEeW5hbW9EQiBUYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlUHJvcHMgZXh0ZW5kcyBUYWJsZU9wdGlvbnMsIEF3c0NvbnN0cnVjdFByb3BzIHtcbiAgLyoqXG4gICAqIEVuZm9yY2VzIGEgcGFydGljdWxhciBwaHlzaWNhbCB0YWJsZSBuYW1lLlxuICAgKiBAZGVmYXVsdCA8Z2VuZXJhdGVkPlxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLaW5lc2lzIERhdGEgU3RyZWFtIHRvIGNhcHR1cmUgaXRlbS1sZXZlbCBjaGFuZ2VzIGZvciB0aGUgdGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gS2luZXNpcyBEYXRhIFN0cmVhbVxuICAgKi9cbiAgcmVhZG9ubHkga2luZXNpc1N0cmVhbT86IGtpbmVzaXMuSVN0cmVhbTtcblxuICAvKipcbiAgICogS2luZXNpcyBEYXRhIFN0cmVhbSBhcHByb3hpbWF0ZSBjcmVhdGlvbiB0aW1lc3RhbXAgcHJlY2lzaW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IEFwcHJveGltYXRlQ3JlYXRpb25EYXRlVGltZVByZWNpc2lvbi5NSUNST1NFQ09ORFxuICAgKi9cbiAgcmVhZG9ubHkga2luZXNpc1ByZWNpc2lvblRpbWVzdGFtcD86IEFwcHJveGltYXRlQ3JlYXRpb25EYXRlVGltZVByZWNpc2lvbjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIGdsb2JhbCBzZWNvbmRhcnkgaW5kZXhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHbG9iYWxTZWNvbmRhcnlJbmRleFByb3BzXG4gIGV4dGVuZHMgU2Vjb25kYXJ5SW5kZXhQcm9wcyxcbiAgICBTY2hlbWFPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSByZWFkIGNhcGFjaXR5IGZvciB0aGUgZ2xvYmFsIHNlY29uZGFyeSBpbmRleC5cbiAgICpcbiAgICogQ2FuIG9ubHkgYmUgcHJvdmlkZWQgaWYgdGFibGUgYmlsbGluZ01vZGUgaXMgUHJvdmlzaW9uZWQgb3IgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCA1XG4gICAqL1xuICByZWFkb25seSByZWFkQ2FwYWNpdHk/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB3cml0ZSBjYXBhY2l0eSBmb3IgdGhlIGdsb2JhbCBzZWNvbmRhcnkgaW5kZXguXG4gICAqXG4gICAqIENhbiBvbmx5IGJlIHByb3ZpZGVkIGlmIHRhYmxlIGJpbGxpbmdNb2RlIGlzIFByb3Zpc2lvbmVkIG9yIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQGRlZmF1bHQgNVxuICAgKi9cbiAgcmVhZG9ubHkgd3JpdGVDYXBhY2l0eT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gcmVhZCByZXF1ZXN0IHVuaXRzIGZvciB0aGUgZ2xvYmFsIHNlY29uZGFyeSBpbmRleC5cbiAgICpcbiAgICogQ2FuIG9ubHkgYmUgcHJvdmlkZWQgaWYgdGFibGUgYmlsbGluZ01vZGUgaXMgUEFZX1BFUl9SRVFVRVNULlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG9uLWRlbWFuZCB0aHJvdWdocHV0IGlzIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSBtYXhSZWFkUmVxdWVzdFVuaXRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB3cml0ZSByZXF1ZXN0IHVuaXRzIGZvciB0aGUgZ2xvYmFsIHNlY29uZGFyeSBpbmRleC5cbiAgICpcbiAgICogQ2FuIG9ubHkgYmUgcHJvdmlkZWQgaWYgdGFibGUgYmlsbGluZ01vZGUgaXMgUEFZX1BFUl9SRVFVRVNULlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG9uLWRlbWFuZCB0aHJvdWdocHV0IGlzIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSBtYXhXcml0ZVJlcXVlc3RVbml0cz86IG51bWJlcjtcblxuICAvLyBUT0RPOiBodHRwczovL2dpdGh1Yi5jb20vaGFzaGljb3JwL3RlcnJhZm9ybS1wcm92aWRlci1hd3MvaXNzdWVzLzQzMTQyXG4gIC8vIHJlYWRvbmx5IHdhcm1UaHJvdWdocHV0PzogV2FybVRocm91Z2hwdXQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgQ2xvdWRXYXRjaCBjb250cmlidXRvciBpbnNpZ2h0cyBpcyBlbmFibGVkIGZvciB0aGUgc3BlY2lmaWVkIGdsb2JhbCBzZWNvbmRhcnkgaW5kZXguXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBjb250cmlidXRvckluc2lnaHRzRW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVmZXJlbmNlIHRvIGEgZHluYW1vZGIgdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGR5bmFtb2RiIHRhYmxlLlxuICAgKiBPbmUgb2YgdGhpcywgb3IgYHRhYmxlTmFtZWAsIGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHRhYmxlIGFyblxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0YWJsZSBuYW1lIG9mIHRoZSBkeW5hbW9kYiB0YWJsZS5cbiAgICogT25lIG9mIHRoaXMsIG9yIGB0YWJsZUFybmAsIGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHRhYmxlIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgdGFibGUncyBzdHJlYW0uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gdGFibGUgc3RyZWFtXG4gICAqL1xuICByZWFkb25seSB0YWJsZVN0cmVhbUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogS01TIGVuY3J5cHRpb24ga2V5LCBpZiB0aGlzIHRhYmxlIHVzZXMgYSBjdXN0b21lci1tYW5hZ2VkIGVuY3J5cHRpb24ga2V5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGtleVxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZ2xvYmFsIGluZGV4ZXMgc2V0IGZvciB0aGlzIFRhYmxlLlxuICAgKiBOb3RlIHRoYXQgeW91IG5lZWQgdG8gc2V0IGVpdGhlciB0aGlzIHByb3BlcnR5LFxuICAgKiBvciBgbG9jYWxJbmRleGVzYCxcbiAgICogaWYgeW91IHdhbnQgbWV0aG9kcyBsaWtlIGdyYW50UmVhZERhdGEoKVxuICAgKiB0byBncmFudCBwZXJtaXNzaW9ucyBmb3IgaW5kZXhlcyBhcyB3ZWxsIGFzIHRoZSB0YWJsZSBpdHNlbGYuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZ2xvYmFsIGluZGV4ZXNcbiAgICovXG4gIHJlYWRvbmx5IGdsb2JhbEluZGV4ZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGxvY2FsIGluZGV4ZXMgc2V0IGZvciB0aGlzIFRhYmxlLlxuICAgKiBOb3RlIHRoYXQgeW91IG5lZWQgdG8gc2V0IGVpdGhlciB0aGlzIHByb3BlcnR5LFxuICAgKiBvciBgZ2xvYmFsSW5kZXhlc2AsXG4gICAqIGlmIHlvdSB3YW50IG1ldGhvZHMgbGlrZSBncmFudFJlYWREYXRhKClcbiAgICogdG8gZ3JhbnQgcGVybWlzc2lvbnMgZm9yIGluZGV4ZXMgYXMgd2VsbCBhcyB0aGUgdGFibGUgaXRzZWxmLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGxvY2FsIGluZGV4ZXNcbiAgICovXG4gIHJlYWRvbmx5IGxvY2FsSW5kZXhlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gdHJ1ZSwgZ3JhbnQgbWV0aG9kcyBhbHdheXMgZ3JhbnQgcGVybWlzc2lvbnMgZm9yIGFsbCBpbmRleGVzLlxuICAgKiBJZiBmYWxzZSBpcyBwcm92aWRlZCwgZ3JhbnQgbWV0aG9kcyBncmFudCB0aGUgcGVybWlzc2lvbnNcbiAgICogb25seSB3aGVuIGBnbG9iYWxJbmRleGVzYCBvciBgbG9jYWxJbmRleGVzYCBpcyBzcGVjaWZpZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGdyYW50SW5kZXhQZXJtaXNzaW9ucz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUYWJsZUJhc2VcbiAgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RCYXNlXG4gIGltcGxlbWVudHMgSVRhYmxlLCBpYW0uSUF3c0NvbnN0cnVjdFdpdGhQb2xpY3lcbntcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHRhYmxlQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB0YWJsZU5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHRhYmxlU3RyZWFtQXJuPzogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuICBwdWJsaWMgYWJzdHJhY3QgcmVzb3VyY2VQb2xpY3k/OiBpYW0uUG9saWN5RG9jdW1lbnQ7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlZ2lvbmFsQXJucyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgcHVibGljIGdldCBvdXRwdXRzKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB7XG4gICAgICB0YWJsZUFybjogdGhpcy50YWJsZUFybixcbiAgICAgIHRhYmxlTmFtZTogdGhpcy50YWJsZU5hbWUsXG4gICAgICB0YWJsZVN0cmVhbUFybjogdGhpcy50YWJsZVN0cmVhbUFybixcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdyYW50KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCAuLi5hY3Rpb25zOiBzdHJpbmdbXSk6IGlhbS5HcmFudCB7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gW1xuICAgICAgdGhpcy50YWJsZUFybixcbiAgICAgIExhenkuc3RyaW5nVmFsdWUoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiAodGhpcy5oYXNJbmRleCA/IGAke3RoaXMudGFibGVBcm59L2luZGV4LypgIDogdW5kZWZpbmVkKSxcbiAgICAgIH0pLFxuICAgICAgLi4udGhpcy5yZWdpb25hbEFybnMsXG4gICAgICAuLi50aGlzLnJlZ2lvbmFsQXJucy5tYXAoKGFybikgPT5cbiAgICAgICAgTGF6eS5zdHJpbmdWYWx1ZSh7XG4gICAgICAgICAgcHJvZHVjZTogKCkgPT4gKHRoaXMuaGFzSW5kZXggPyBgJHthcm59L2luZGV4LypgIDogdW5kZWZpbmVkKSxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgIF07XG5cbiAgICByZXR1cm4gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsT3JSZXNvdXJjZSh7XG4gICAgICBncmFudGVlLFxuICAgICAgYWN0aW9ucyxcbiAgICAgIHJlc291cmNlQXJuczogcmVzb3VyY2VzLmZpbHRlcigocikgPT4gciAhPT0gdW5kZWZpbmVkKSxcbiAgICAgIHJlc291cmNlOiB0aGlzLCAvLyBHcmFudCB3aWxsIHRha2UgdGhlIHByaW5jaXBhbCBmcm9tIHRoZSBncmFudGVlXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ3JhbnRTdHJlYW0oZ3JhbnRlZTogaWFtLklHcmFudGFibGUsIC4uLmFjdGlvbnM6IHN0cmluZ1tdKTogaWFtLkdyYW50IHtcbiAgICBpZiAoIXRoaXMudGFibGVTdHJlYW1Bcm4pIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBEeW5hbW9EQiBTdHJlYW1zIG11c3QgYmUgZW5hYmxlZCBvbiB0aGUgdGFibGUgJHt0aGlzLm5vZGUucGF0aH1gLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICBhY3Rpb25zLFxuICAgICAgcmVzb3VyY2VBcm5zOiBbdGhpcy50YWJsZVN0cmVhbUFybl0sXG4gICAgICBzY29wZTogdGhpcyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBncmFudFJlYWREYXRhKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICBjb25zdCB0YWJsZUFjdGlvbnMgPSBwZXJtcy5SRUFEX0RBVEFfQUNUSU9OU19UQUJMRV9TQUZFLmNvbmNhdChcbiAgICAgIHBlcm1zLkRFU0NSSUJFX1RBQkxFLFxuICAgICk7XG5cbiAgICAvLyBJZiBzdHJlYW1zIGFyZSBhdmFpbGFibGUsIGFsc28gZ3JhbnQgc3RyZWFtLXNwZWNpZmljIGFjdGlvbnNcbiAgICBpZiAodGhpcy50YWJsZVN0cmVhbUFybikge1xuICAgICAgcmV0dXJuIHRoaXMuY29tYmluZWRHcmFudChncmFudGVlLCB7XG4gICAgICAgIGtleUFjdGlvbnM6IHBlcm1zLktFWV9SRUFEX0FDVElPTlMsXG4gICAgICAgIHRhYmxlQWN0aW9ucyxcbiAgICAgICAgc3RyZWFtQWN0aW9uczogcGVybXMuUkVBRF9EQVRBX0FDVElPTlNfU1RSRUFNX09OTFksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb21iaW5lZEdyYW50KGdyYW50ZWUsIHtcbiAgICAgIGtleUFjdGlvbnM6IHBlcm1zLktFWV9SRUFEX0FDVElPTlMsXG4gICAgICB0YWJsZUFjdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ3JhbnRUYWJsZUxpc3RTdHJlYW1zKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICBpZiAoIXRoaXMudGFibGVTdHJlYW1Bcm4pIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBEeW5hbW9EQiBTdHJlYW1zIG11c3QgYmUgZW5hYmxlZCBvbiB0aGUgdGFibGUgJHt0aGlzLm5vZGUucGF0aH1gLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICBhY3Rpb25zOiBbXCJkeW5hbW9kYjpMaXN0U3RyZWFtc1wiXSxcbiAgICAgIHJlc291cmNlQXJuczogW1wiKlwiXSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBncmFudFN0cmVhbVJlYWQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHRoaXMuZ3JhbnRUYWJsZUxpc3RTdHJlYW1zKGdyYW50ZWUpO1xuICAgIHJldHVybiB0aGlzLmNvbWJpbmVkR3JhbnQoZ3JhbnRlZSwge1xuICAgICAga2V5QWN0aW9uczogcGVybXMuS0VZX1JFQURfQUNUSU9OUyxcbiAgICAgIHN0cmVhbUFjdGlvbnM6IHBlcm1zLlJFQURfU1RSRUFNX0RBVEFfQUNUSU9OUyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBncmFudFdyaXRlRGF0YShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgY29uc3QgdGFibGVBY3Rpb25zID0gcGVybXMuV1JJVEVfREFUQV9BQ1RJT05TLmNvbmNhdChwZXJtcy5ERVNDUklCRV9UQUJMRSk7XG4gICAgY29uc3Qga2V5QWN0aW9ucyA9IHBlcm1zLktFWV9SRUFEX0FDVElPTlMuY29uY2F0KHBlcm1zLktFWV9XUklURV9BQ1RJT05TKTtcbiAgICByZXR1cm4gdGhpcy5jb21iaW5lZEdyYW50KGdyYW50ZWUsIHsga2V5QWN0aW9ucywgdGFibGVBY3Rpb25zIH0pO1xuICB9XG5cbiAgcHVibGljIGdyYW50UmVhZFdyaXRlRGF0YShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgY29uc3QgdGFibGVBY3Rpb25zID0gcGVybXMuUkVBRF9EQVRBX0FDVElPTlMuY29uY2F0KFxuICAgICAgcGVybXMuV1JJVEVfREFUQV9BQ1RJT05TLFxuICAgICkuY29uY2F0KHBlcm1zLkRFU0NSSUJFX1RBQkxFKTtcbiAgICBjb25zdCBrZXlBY3Rpb25zID0gcGVybXMuS0VZX1JFQURfQUNUSU9OUy5jb25jYXQocGVybXMuS0VZX1dSSVRFX0FDVElPTlMpO1xuICAgIHJldHVybiB0aGlzLmNvbWJpbmVkR3JhbnQoZ3JhbnRlZSwgeyBrZXlBY3Rpb25zLCB0YWJsZUFjdGlvbnMgfSk7XG4gIH1cblxuICBwdWJsaWMgZ3JhbnRGdWxsQWNjZXNzKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKSB7XG4gICAgY29uc3Qga2V5QWN0aW9ucyA9IHBlcm1zLktFWV9SRUFEX0FDVElPTlMuY29uY2F0KHBlcm1zLktFWV9XUklURV9BQ1RJT05TKTtcbiAgICByZXR1cm4gdGhpcy5jb21iaW5lZEdyYW50KGdyYW50ZWUsIHtcbiAgICAgIGtleUFjdGlvbnMsXG4gICAgICB0YWJsZUFjdGlvbnM6IFtcImR5bmFtb2RiOipcIl0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWRkVG9SZXNvdXJjZVBvbGljeShcbiAgICBzdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQsXG4gICk6IGlhbS5BZGRUb1Jlc291cmNlUG9saWN5UmVzdWx0IHtcbiAgICBpZiAoIXRoaXMucmVzb3VyY2VQb2xpY3kpIHtcbiAgICAgIC8vIGVuc3VyZSBhIHBvbGljeSBleGlzdHMgYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFibGVcbiAgICAgIHRoaXMucmVzb3VyY2VQb2xpY3kgPSBuZXcgaWFtLlBvbGljeURvY3VtZW50KHRoaXMsIFwiUG9saWN5XCIsIHtcbiAgICAgICAgc3RhdGVtZW50OiBbXSxcbiAgICAgIH0pO1xuICAgICAgbmV3IGR5bmFtb2RiUmVzb3VyY2VQb2xpY3kuRHluYW1vZGJSZXNvdXJjZVBvbGljeShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgXCJQb2xpY3lBdHRhY2htZW50XCIsXG4gICAgICAgIHtcbiAgICAgICAgICBwb2xpY3k6IHRoaXMucmVzb3VyY2VQb2xpY3kuanNvbixcbiAgICAgICAgICByZXNvdXJjZUFybjogdGhpcy50YWJsZUFybixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucmVzb3VyY2VQb2xpY3kuYWRkU3RhdGVtZW50cyhzdGF0ZW1lbnQpO1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZW1lbnRBZGRlZDogdHJ1ZSxcbiAgICAgIHBvbGljeURlcGVuZGFibGU6IHRoaXMsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBtZXRyaWMoXG4gICAgbWV0cmljTmFtZTogc3RyaW5nLFxuICAgIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zLFxuICApOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICBuYW1lc3BhY2U6IFwiQVdTL0R5bmFtb0RCXCIsXG4gICAgICBtZXRyaWNOYW1lLFxuICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICBUYWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLFxuICAgICAgfSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pLmF0dGFjaFRvKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY0NvbnN1bWVkUmVhZENhcGFjaXR5VW5pdHMoXG4gICAgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMsXG4gICk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5jYW5uZWRNZXRyaWMoXG4gICAgICBEeW5hbW9EQk1ldHJpY3MuY29uc3VtZWRSZWFkQ2FwYWNpdHlVbml0c1N1bSxcbiAgICAgIHByb3BzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljQ29uc3VtZWRXcml0ZUNhcGFjaXR5VW5pdHMoXG4gICAgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMsXG4gICk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5jYW5uZWRNZXRyaWMoXG4gICAgICBEeW5hbW9EQk1ldHJpY3MuY29uc3VtZWRXcml0ZUNhcGFjaXR5VW5pdHNTdW0sXG4gICAgICBwcm9wcyxcbiAgICApO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIHVzZSBgbWV0cmljU3lzdGVtRXJyb3JzRm9yT3BlcmF0aW9uc2AuICovXG4gIHB1YmxpYyBtZXRyaWNTeXN0ZW1FcnJvcnMoXG4gICAgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMsXG4gICk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICBpZiAoIXByb3BzPy5kaW1lbnNpb25zTWFwPy5PcGVyYXRpb24pIHtcbiAgICAgIC8vICdPcGVyYXRpb24nIG11c3QgYmUgcGFzc2VkIGJlY2F1c2UgaXRzIGFuIG9wZXJhdGlvbmFsIG1ldHJpYy5cbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiJ09wZXJhdGlvbicgZGltZW5zaW9uIG11c3QgYmUgcGFzc2VkIGZvciB0aGUgJ1N5c3RlbUVycm9ycycgbWV0cmljLlwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkaW1lbnNpb25zTWFwID0ge1xuICAgICAgVGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIC4uLnByb3BzPy5kaW1lbnNpb25zTWFwLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJTeXN0ZW1FcnJvcnNcIiwge1xuICAgICAgc3RhdGlzdGljOiBcInN1bVwiLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBkaW1lbnNpb25zTWFwLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY1VzZXJFcnJvcnMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgaWYgKHByb3BzPy5kaW1lbnNpb25zTWFwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIidkaW1lbnNpb25zTWFwJyBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgJ1VzZXJFcnJvcnMnIG1ldHJpY1wiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiVXNlckVycm9yc1wiLCB7XG4gICAgICBzdGF0aXN0aWM6IFwic3VtXCIsXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHt9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY0NvbmRpdGlvbmFsQ2hlY2tGYWlsZWRSZXF1ZXN0cyhcbiAgICBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIkNvbmRpdGlvbmFsQ2hlY2tGYWlsZWRSZXF1ZXN0c1wiLCB7XG4gICAgICBzdGF0aXN0aWM6IFwic3VtXCIsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlIHRoaXMgZnVuY3Rpb24uIEl0IHJldHVybnMgYW4gaW52YWxpZCBtZXRyaWMuIFVzZSBgbWV0cmljVGhyb3R0bGVkUmVxdWVzdHNGb3JPcGVyYXRpb25gIGluc3RlYWQuICovXG4gIHB1YmxpYyBtZXRyaWNUaHJvdHRsZWRSZXF1ZXN0cyhcbiAgICBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIlRocm90dGxlZFJlcXVlc3RzXCIsIHsgc3RhdGlzdGljOiBcInN1bVwiLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtZXRyaWNTdWNjZXNzZnVsUmVxdWVzdExhdGVuY3koXG4gICAgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMsXG4gICk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICBpZiAoIXByb3BzPy5kaW1lbnNpb25zTWFwPy5PcGVyYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiJ09wZXJhdGlvbicgZGltZW5zaW9uIG11c3QgYmUgcGFzc2VkIGZvciB0aGUgJ1N1Y2Nlc3NmdWxSZXF1ZXN0TGF0ZW5jeScgbWV0cmljLlwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkaW1lbnNpb25zTWFwID0ge1xuICAgICAgVGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIE9wZXJhdGlvbjogcHJvcHMuZGltZW5zaW9uc01hcC5PcGVyYXRpb24sXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgLi4uRHluYW1vREJNZXRyaWNzLnN1Y2Nlc3NmdWxSZXF1ZXN0TGF0ZW5jeUF2ZXJhZ2UoZGltZW5zaW9uc01hcCksXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGRpbWVuc2lvbnNNYXAsXG4gICAgfSkuYXR0YWNoVG8odGhpcyk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljVGhyb3R0bGVkUmVxdWVzdHNGb3JPcGVyYXRpb24oXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMsXG4gICk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgIC4uLkR5bmFtb0RCTWV0cmljcy50aHJvdHRsZWRSZXF1ZXN0c1N1bSh7XG4gICAgICAgIE9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgICAgICBUYWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLFxuICAgICAgfSksXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KS5hdHRhY2hUbyh0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBtZXRyaWNUaHJvdHRsZWRSZXF1ZXN0c0Zvck9wZXJhdGlvbnMoXG4gICAgcHJvcHM/OiBPcGVyYXRpb25zTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5JTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5zdW1NZXRyaWNzRm9yT3BlcmF0aW9ucyhcbiAgICAgIFwiVGhyb3R0bGVkUmVxdWVzdHNcIixcbiAgICAgIFwiU3VtIG9mIHRocm90dGxlZCByZXF1ZXN0cyBhY3Jvc3MgYWxsIG9wZXJhdGlvbnNcIixcbiAgICAgIHByb3BzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljU3lzdGVtRXJyb3JzRm9yT3BlcmF0aW9ucyhcbiAgICBwcm9wcz86IFN5c3RlbUVycm9yc0Zvck9wZXJhdGlvbnNNZXRyaWNPcHRpb25zLFxuICApOiBjbG91ZHdhdGNoLklNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLnN1bU1ldHJpY3NGb3JPcGVyYXRpb25zKFxuICAgICAgXCJTeXN0ZW1FcnJvcnNcIixcbiAgICAgIFwiU3VtIG9mIGVycm9ycyBhY3Jvc3MgYWxsIG9wZXJhdGlvbnNcIixcbiAgICAgIHByb3BzLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN1bU1ldHJpY3NGb3JPcGVyYXRpb25zKFxuICAgIG1ldHJpY05hbWU6IHN0cmluZyxcbiAgICBleHByZXNzaW9uTGFiZWw6IHN0cmluZyxcbiAgICBwcm9wcz86IE9wZXJhdGlvbnNNZXRyaWNPcHRpb25zLFxuICApOiBjbG91ZHdhdGNoLklNZXRyaWMge1xuICAgIGlmIChwcm9wcz8uZGltZW5zaW9uc01hcD8uT3BlcmF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIlRoZSBPcGVyYXRpb24gZGltZW5zaW9uIGlzIG5vdCBzdXBwb3J0ZWQuIFVzZSB0aGUgJ29wZXJhdGlvbnMnIHByb3BlcnR5LlwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcGVyYXRpb25zID0gcHJvcHM/Lm9wZXJhdGlvbnMgPz8gT2JqZWN0LnZhbHVlcyhPcGVyYXRpb24pO1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuY3JlYXRlTWV0cmljc0Zvck9wZXJhdGlvbnMobWV0cmljTmFtZSwgb3BlcmF0aW9ucywge1xuICAgICAgc3RhdGlzdGljOiBcInN1bVwiLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IGNsb3Vkd2F0Y2guTWF0aEV4cHJlc3Npb24oe1xuICAgICAgZXhwcmVzc2lvbjogYCR7T2JqZWN0LmtleXModmFsdWVzKS5qb2luKFwiICsgXCIpfWAsXG4gICAgICB1c2luZ01ldHJpY3M6IHsgLi4udmFsdWVzIH0sXG4gICAgICBjb2xvcjogcHJvcHM/LmNvbG9yLFxuICAgICAgbGFiZWw6IGV4cHJlc3Npb25MYWJlbCxcbiAgICAgIHBlcmlvZDogcHJvcHM/LnBlcmlvZCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWV0cmljc0Zvck9wZXJhdGlvbnMoXG4gICAgbWV0cmljTmFtZTogc3RyaW5nLFxuICAgIG9wZXJhdGlvbnM6IE9wZXJhdGlvbltdLFxuICAgIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zLFxuICAgIG1ldHJpY05hbWVNYXBwZXI/OiAob3A6IE9wZXJhdGlvbikgPT4gc3RyaW5nLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBjbG91ZHdhdGNoLklNZXRyaWM+IHtcbiAgICBjb25zdCBtZXRyaWNzOiBSZWNvcmQ8c3RyaW5nLCBjbG91ZHdhdGNoLklNZXRyaWM+ID0ge307XG4gICAgY29uc3QgbWFwcGVyID0gbWV0cmljTmFtZU1hcHBlciA/PyAoKG9wKSA9PiBvcC50b0xvd2VyQ2FzZSgpKTtcblxuICAgIGlmIChwcm9wcz8uZGltZW5zaW9uc01hcD8uT3BlcmF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIkludmFsaWQgcHJvcGVydGllcy4gT3BlcmF0aW9uIGRpbWVuc2lvbiBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gY2FsY3VsYXRpbmcgb3BlcmF0aW9uYWwgbWV0cmljc1wiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICBjb25zdCBtZXRyaWMgPSB0aGlzLm1ldHJpYyhtZXRyaWNOYW1lLCB7XG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgICAgVGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgICAgICBPcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgICAuLi5wcm9wcz8uZGltZW5zaW9uc01hcCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBvcGVyYXRpb25NZXRyaWNOYW1lID0gbWFwcGVyKG9wZXJhdGlvbik7XG4gICAgICBjb25zdCBmaXJzdENoYXIgPSBvcGVyYXRpb25NZXRyaWNOYW1lLmNoYXJBdCgwKTtcblxuICAgICAgaWYgKGZpcnN0Q2hhciA9PT0gZmlyc3RDaGFyLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvdXNpbmctbWV0cmljLW1hdGguaHRtbCNtZXRyaWMtbWF0aC1zeW50YXhcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBgTWFwcGVyIGdlbmVyYXRlZCBhbiBpbGxlZ2FsIG9wZXJhdGlvbiBtZXRyaWMgbmFtZTogJHtvcGVyYXRpb25NZXRyaWNOYW1lfS4gTXVzdCBzdGFydCB3aXRoIGEgbG93ZXJjYXNlIGxldHRlcmAsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG1ldHJpY3Nbb3BlcmF0aW9uTWV0cmljTmFtZV0gPSBtZXRyaWM7XG4gICAgfVxuICAgIHJldHVybiBtZXRyaWNzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBoYXNJbmRleCgpOiBib29sZWFuO1xuXG4gIHByaXZhdGUgY29tYmluZWRHcmFudChcbiAgICBncmFudGVlOiBpYW0uSUdyYW50YWJsZSxcbiAgICBvcHRzOiB7XG4gICAgICBrZXlBY3Rpb25zPzogc3RyaW5nW107XG4gICAgICB0YWJsZUFjdGlvbnM/OiBzdHJpbmdbXTtcbiAgICAgIHN0cmVhbUFjdGlvbnM/OiBzdHJpbmdbXTtcbiAgICB9LFxuICApOiBpYW0uR3JhbnQge1xuICAgIGlmICh0aGlzLmVuY3J5cHRpb25LZXkgJiYgb3B0cy5rZXlBY3Rpb25zKSB7XG4gICAgICB0aGlzLmVuY3J5cHRpb25LZXkuZ3JhbnQoZ3JhbnRlZSwgLi4ub3B0cy5rZXlBY3Rpb25zKTtcbiAgICB9XG4gICAgaWYgKG9wdHMudGFibGVBY3Rpb25zKSB7XG4gICAgICBjb25zdCByZXNvdXJjZXMgPSBbXG4gICAgICAgIHRoaXMudGFibGVBcm4sXG4gICAgICAgIExhenkuc3RyaW5nVmFsdWUoe1xuICAgICAgICAgIHByb2R1Y2U6ICgpID0+XG4gICAgICAgICAgICB0aGlzLmhhc0luZGV4ID8gYCR7dGhpcy50YWJsZUFybn0vaW5kZXgvKmAgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pLFxuICAgICAgICAuLi50aGlzLnJlZ2lvbmFsQXJucyxcbiAgICAgICAgLi4udGhpcy5yZWdpb25hbEFybnMubWFwKChhcm4pID0+XG4gICAgICAgICAgTGF6eS5zdHJpbmdWYWx1ZSh7XG4gICAgICAgICAgICBwcm9kdWNlOiAoKSA9PiAodGhpcy5oYXNJbmRleCA/IGAke2Fybn0vaW5kZXgvKmAgOiB1bmRlZmluZWQpLFxuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHJldCA9IGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbE9yUmVzb3VyY2Uoe1xuICAgICAgICBncmFudGVlLFxuICAgICAgICBhY3Rpb25zOiBvcHRzLnRhYmxlQWN0aW9ucyxcbiAgICAgICAgcmVzb3VyY2VBcm5zOiByZXNvdXJjZXMuZmlsdGVyKChyKSA9PiByICE9PSB1bmRlZmluZWQpLFxuICAgICAgICByZXNvdXJjZTogdGhpcyxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5zdHJlYW1BY3Rpb25zKSB7XG4gICAgICBpZiAoIXRoaXMudGFibGVTdHJlYW1Bcm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBgRHluYW1vREIgU3RyZWFtcyBtdXN0IGJlIGVuYWJsZWQgb24gdGhlIHRhYmxlICR7dGhpcy5ub2RlLnBhdGh9YCxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmV0ID0gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsT3JSZXNvdXJjZSh7XG4gICAgICAgIGdyYW50ZWUsXG4gICAgICAgIGFjdGlvbnM6IG9wdHMuc3RyZWFtQWN0aW9ucyxcbiAgICAgICAgcmVzb3VyY2VBcm5zOiBbdGhpcy50YWJsZVN0cmVhbUFybl0sXG4gICAgICAgIHJlc291cmNlOiB0aGlzLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFVuZXhwZWN0ZWQgZ3JhbnQgY29tYmluYXRpb24sIGFjdGlvbnMgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGFibGUgb3Igc3RyZWFtLmAsXG4gICAgICB0aGlzLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNhbm5lZE1ldHJpYyhcbiAgICBmbjogKGRpbXM6IHsgVGFibGVOYW1lOiBzdHJpbmcgfSkgPT4gY2xvdWR3YXRjaC5NZXRyaWNQcm9wcyxcbiAgICBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgLi4uZm4oeyBUYWJsZU5hbWU6IHRoaXMudGFibGVOYW1lIH0pLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSkuYXR0YWNoVG8odGhpcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhIER5bmFtb0RCIHRhYmxlLlxuICovXG5leHBvcnQgY2xhc3MgVGFibGUgZXh0ZW5kcyBUYWJsZUJhc2Uge1xuICAvKipcbiAgICogUGVybWl0cyBhbiBJQU0gUHJpbmNpcGFsIHRvIGxpc3QgYWxsIER5bmFtb0RCIFN0cmVhbXMuXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgI2dyYW50VGFibGVMaXN0U3RyZWFtc2AgZm9yIG1vcmUgZ3JhbnVsYXIgcGVybWlzc2lvblxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsIChuby1vcCBpZiB1bmRlZmluZWQpXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdyYW50TGlzdFN0cmVhbXMoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIGFjdGlvbnM6IFtcImR5bmFtb2RiOkxpc3RTdHJlYW1zXCJdLFxuICAgICAgcmVzb3VyY2VBcm5zOiBbXCIqXCJdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBUYWJsZSBjb25zdHJ1Y3QgdGhhdCByZXByZXNlbnRzIGFuIGV4dGVybmFsIHRhYmxlIHZpYSB0YWJsZSBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIHBhcmVudCBjcmVhdGluZyBjb25zdHJ1Y3QgKHVzdWFsbHkgYHRoaXNgKS5cbiAgICogQHBhcmFtIGlkIFRoZSBjb25zdHJ1Y3QncyBuYW1lLlxuICAgKiBAcGFyYW0gdGFibGVOYW1lIFRoZSB0YWJsZSdzIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21UYWJsZU5hbWUoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiBJVGFibGUge1xuICAgIHJldHVybiBUYWJsZS5mcm9tVGFibGVBdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyB0YWJsZU5hbWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIFRhYmxlIGNvbnN0cnVjdCB0aGF0IHJlcHJlc2VudHMgYW4gZXh0ZXJuYWwgdGFibGUgdmlhIHRhYmxlIGFybi5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY3JlYXRpbmcgY29uc3RydWN0ICh1c3VhbGx5IGB0aGlzYCkuXG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0J3MgbmFtZS5cbiAgICogQHBhcmFtIHRhYmxlQXJuIFRoZSB0YWJsZSdzIEFSTi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVRhYmxlQXJuKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICB0YWJsZUFybjogc3RyaW5nLFxuICApOiBJVGFibGUge1xuICAgIHJldHVybiBUYWJsZS5mcm9tVGFibGVBdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyB0YWJsZUFybiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgVGFibGUgY29uc3RydWN0IHRoYXQgcmVwcmVzZW50cyBhbiBleHRlcm5hbCB0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY3JlYXRpbmcgY29uc3RydWN0ICh1c3VhbGx5IGB0aGlzYCkuXG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0J3MgbmFtZS5cbiAgICogQHBhcmFtIGF0dHJzIEEgYFRhYmxlQXR0cmlidXRlc2Agb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tVGFibGVBdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogVGFibGVBdHRyaWJ1dGVzLFxuICApOiBJVGFibGUge1xuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIFRhYmxlQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdGFibGVOYW1lOiBzdHJpbmc7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdGFibGVBcm46IHN0cmluZztcbiAgICAgIHB1YmxpYyByZWFkb25seSB0YWJsZVN0cmVhbUFybj86IHN0cmluZztcbiAgICAgIHB1YmxpYyByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG4gICAgICBwdWJsaWMgcmVzb3VyY2VQb2xpY3k/OiBpYW0uUG9saWN5RG9jdW1lbnQ7XG4gICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGFzSW5kZXggPVxuICAgICAgICAoYXR0cnMuZ3JhbnRJbmRleFBlcm1pc3Npb25zID8/IGZhbHNlKSB8fFxuICAgICAgICAoYXR0cnMuZ2xvYmFsSW5kZXhlcyA/PyBbXSkubGVuZ3RoID4gMCB8fFxuICAgICAgICAoYXR0cnMubG9jYWxJbmRleGVzID8/IFtdKS5sZW5ndGggPiAwO1xuXG4gICAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvcHM6IEF3c0NvbnN0cnVjdFByb3BzLFxuICAgICAgICBfdGFibGVBcm46IHN0cmluZyxcbiAgICAgICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgICAgIHRhYmxlU3RyZWFtQXJuPzogc3RyaW5nLFxuICAgICAgKSB7XG4gICAgICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgICAgICB0aGlzLnRhYmxlQXJuID0gX3RhYmxlQXJuO1xuICAgICAgICB0aGlzLnRhYmxlTmFtZSA9IHRhYmxlTmFtZTtcbiAgICAgICAgdGhpcy50YWJsZVN0cmVhbUFybiA9IHRhYmxlU3RyZWFtQXJuO1xuICAgICAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBhdHRycy5lbmNyeXB0aW9uS2V5O1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBuYW1lOiBzdHJpbmc7XG4gICAgbGV0IGFybjogc3RyaW5nO1xuICAgIGNvbnN0IHN0YWNrID0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3Qoc2NvcGUpO1xuICAgIGlmICghYXR0cnMudGFibGVOYW1lKSB7XG4gICAgICBpZiAoIWF0dHJzLnRhYmxlQXJuKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgXCJPbmUgb2YgdGFibGVOYW1lIG9yIHRhYmxlQXJuIGlzIHJlcXVpcmVkIVwiLFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYXJuID0gYXR0cnMudGFibGVBcm47XG4gICAgICBjb25zdCBtYXliZVRhYmxlTmFtZSA9IHN0YWNrLnNwbGl0QXJuKFxuICAgICAgICBhdHRycy50YWJsZUFybixcbiAgICAgICAgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgICApLnJlc291cmNlTmFtZTtcbiAgICAgIGlmICghbWF5YmVUYWJsZU5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBcIkFSTiBmb3IgRHluYW1vREIgdGFibGUgbXVzdCBiZSBpbiB0aGUgZm9ybTogYXJuOjxwYXJ0aXRpb24+OmR5bmFtb2RiOjxyZWdpb24+OjxhY2NvdW50Pjp0YWJsZS88dGFibGUtbmFtZT5cIixcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG5hbWUgPSBtYXliZVRhYmxlTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGF0dHJzLnRhYmxlQXJuKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgXCJPbmx5IG9uZSBvZiB0YWJsZUFybiBvciB0YWJsZU5hbWUgY2FuIGJlIHByb3ZpZGVkXCIsXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBuYW1lID0gYXR0cnMudGFibGVOYW1lO1xuICAgICAgYXJuID0gc3RhY2suZm9ybWF0QXJuKHtcbiAgICAgICAgc2VydmljZTogXCJkeW5hbW9kYlwiLFxuICAgICAgICByZXNvdXJjZTogXCJ0YWJsZVwiLFxuICAgICAgICByZXNvdXJjZU5hbWU6IGF0dHJzLnRhYmxlTmFtZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KFxuICAgICAgeyBlbnZpcm9ubWVudEZyb21Bcm46IGFybiB9LFxuICAgICAgYXJuLFxuICAgICAgbmFtZSxcbiAgICAgIGF0dHJzLnRhYmxlU3RyZWFtQXJuLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZSBwb2xpY3kgdG8gYXNzaWduIHRvIER5bmFtb0RCIFRhYmxlLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWR5bmFtb2RiLXRhYmxlLXJlc291cmNlcG9saWN5Lmh0bWxcbiAgICogQGRlZmF1bHQgLSBObyByZXNvdXJjZSBwb2xpY3kgc3RhdGVtZW50cyBhcmUgYWRkZWQgdG8gdGhlIGNyZWF0ZWQgdGFibGUuXG4gICAqL1xuICBwdWJsaWMgcmVzb3VyY2VQb2xpY3k/OiBpYW0uUG9saWN5RG9jdW1lbnQ7XG4gIHB1YmxpYyByZWFkb25seSB0YWJsZUFybjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgdGFibGVOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB0YWJsZVN0cmVhbUFybjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXR0cmlidXRlRGVmaW5pdGlvbnNJbnRlcm5hbCA9XG4gICAgbmV3IEFycmF5PGR5bmFtb2RiVGFibGUuRHluYW1vZGJUYWJsZUF0dHJpYnV0ZT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBnbG9iYWxTZWNvbmRhcnlJbmRleGVzSW50ZXJuYWwgPVxuICAgIG5ldyBBcnJheTxkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVHbG9iYWxTZWNvbmRhcnlJbmRleD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhbFNlY29uZGFyeUluZGV4ZXNJbnRlcm5hbCA9XG4gICAgbmV3IEFycmF5PGR5bmFtb2RiVGFibGUuRHluYW1vZGJUYWJsZUxvY2FsU2Vjb25kYXJ5SW5kZXg+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzZWNvbmRhcnlJbmRleFNjaGVtYXMgPSBuZXcgTWFwPHN0cmluZywgU2NoZW1hT3B0aW9ucz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBub25LZXlBdHRyaWJ1dGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB0YWJsZVBhcnRpdGlvbktleTogQXR0cmlidXRlO1xuICBwcml2YXRlIHJlYWRvbmx5IHRhYmxlU29ydEtleT86IEF0dHJpYnV0ZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGJpbGxpbmdNb2RlOiBCaWxsaW5nTW9kZTtcbiAgcHJpdmF0ZSByZWFkb25seSB0YWJsZVNjYWxpbmc6IFNjYWxhYmxlQXR0cmlidXRlUGFpciA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IGluZGV4U2NhbGluZyA9IG5ldyBNYXA8c3RyaW5nLCBTY2FsYWJsZUF0dHJpYnV0ZVBhaXI+KCk7XG4gIC8vIENvbW1lbnRpbmcgb3V0IHNjYWxpbmdSb2xlIGFzIFRlcnJhZm9ybSBhdXRvLWNyZWF0ZXMgc2VydmljZS1saW5rZWQgcm9sZXNcbiAgLy8gVW5saWtlIEFXUyBDREsgQ2xvdWRGb3JtYXRpb24sIFRlcnJhZm9ybSBBV1MgcHJvdmlkZXIncyByb2xlQXJuIGlzIG9wdGlvbmFsXG4gIC8vIGFuZCBkZWZhdWx0cyB0byBhcHByb3ByaWF0ZSBzZXJ2aWNlLWxpbmtlZCByb2xlcyB3aGVuIG9taXR0ZWRcbiAgLy8gcHJpdmF0ZSByZWFkb25seSBzY2FsaW5nUm9sZTogaWFtLklSb2xlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Jlc291cmNlOiBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3JlcGxpY2FzOiBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVSZXBsaWNhW10gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFRhYmxlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIGNvbnN0IHBoeXNpY2FsVGFibGVOYW1lID1cbiAgICAgIHByb3BzLnRhYmxlTmFtZSA/PyB0aGlzLnN0YWNrLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzKTtcblxuICAgIGNvbnN0IHsgc3NlU3BlY2lmaWNhdGlvbiwgZW5jcnlwdGlvbktleSB9ID0gdGhpcy5wYXJzZUVuY3J5cHRpb24ocHJvcHMpO1xuICAgIHRoaXMuZW5jcnlwdGlvbktleSA9IGVuY3J5cHRpb25LZXk7XG5cbiAgICBjb25zdCBwb2ludEluVGltZVJlY292ZXJ5ID0gdGhpcy5yZW5kZXJQb2ludEluVGltZVJlY292ZXJ5KHByb3BzKTtcblxuICAgIC8vIGVycm9yIGlmIGJvdGggcmVwbGljYXRpb25SZWdpb25zIGFuZCByZXBsaWNhU3BlY2lmaWNhdGlvbiBhcmUgc3BlY2lmaWVkXG4gICAgaWYgKHByb3BzLnJlcGxpY2F0aW9uUmVnaW9ucyAmJiBwcm9wcy5yZXBsaWNhU3BlY2lmaWNhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCJZb3UgY2Fubm90IHNwZWNpZnkgYm90aCBgcmVwbGljYXRpb25SZWdpb25zYCBhbmQgYHJlcGxpY2FTcGVjaWZpY2F0aW9uYFwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgc3RyZWFtU3BlY2lmaWNhdGlvbjpcbiAgICAgIHwge1xuICAgICAgICAgIHN0cmVhbUVuYWJsZWQ6IGJvb2xlYW47XG4gICAgICAgICAgc3RyZWFtVmlld1R5cGU/OiBTdHJlYW1WaWV3VHlwZTtcbiAgICAgICAgfVxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgKHByb3BzLnJlcGxpY2F0aW9uUmVnaW9ucyAmJiBwcm9wcy5yZXBsaWNhdGlvblJlZ2lvbnMubGVuZ3RoID4gMCkgfHxcbiAgICAgIChwcm9wcy5yZXBsaWNhU3BlY2lmaWNhdGlvbiAmJiBwcm9wcy5yZXBsaWNhU3BlY2lmaWNhdGlvbi5sZW5ndGggPiAwKVxuICAgICkge1xuICAgICAgaWYgKHByb3BzLnN0cmVhbSAmJiBwcm9wcy5zdHJlYW0gIT09IFN0cmVhbVZpZXdUeXBlLk5FV19BTkRfT0xEX0lNQUdFUykge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIFwiYHN0cmVhbWAgbXVzdCBiZSBzZXQgdG8gYE5FV19BTkRfT0xEX0lNQUdFU2Agd2hlbiBzcGVjaWZ5aW5nIGByZXBsaWNhdGlvblJlZ2lvbnNgXCIsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYmlsbGluZ01vZGUgPSBwcm9wcy5iaWxsaW5nTW9kZSA/PyBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1Q7XG4gICAgICBzdHJlYW1TcGVjaWZpY2F0aW9uID0ge1xuICAgICAgICBzdHJlYW1FbmFibGVkOiB0cnVlLFxuICAgICAgICBzdHJlYW1WaWV3VHlwZTogU3RyZWFtVmlld1R5cGUuTkVXX0FORF9PTERfSU1BR0VTLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iaWxsaW5nTW9kZSA9IHByb3BzLmJpbGxpbmdNb2RlID8/IEJpbGxpbmdNb2RlLlBST1ZJU0lPTkVEO1xuICAgICAgaWYgKHByb3BzLnN0cmVhbSkge1xuICAgICAgICBzdHJlYW1TcGVjaWZpY2F0aW9uID0ge1xuICAgICAgICAgIHN0cmVhbUVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgc3RyZWFtVmlld1R5cGU6IHByb3BzLnN0cmVhbSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZVByb3Zpc2lvbmluZyhwcm9wcyk7XG4gICAgdGhpcy5hZGRLZXkocHJvcHMucGFydGl0aW9uS2V5LCBIQVNIX0tFWV9UWVBFKTtcbiAgICB0aGlzLnRhYmxlUGFydGl0aW9uS2V5ID0gcHJvcHMucGFydGl0aW9uS2V5O1xuICAgIGlmIChwcm9wcy5zb3J0S2V5KSB7XG4gICAgICB0aGlzLmFkZEtleShwcm9wcy5zb3J0S2V5LCBSQU5HRV9LRVlfVFlQRSk7XG4gICAgICB0aGlzLnRhYmxlU29ydEtleSA9IHByb3BzLnNvcnRLZXk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVwbGljYXMgPSB0aGlzLnJlbmRlclJlcGxpY2FzKFxuICAgICAgcHJvcHMucmVwbGljYXRpb25SZWdpb25zLFxuICAgICAgcHJvcHMucmVwbGljYVNwZWNpZmljYXRpb24sXG4gICAgKTtcbiAgICBpZiAodGhpcy5fcmVwbGljYXMgJiYgdGhpcy5fcmVwbGljYXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fcmVwbGljYXMuZm9yRWFjaCgocikgPT5cbiAgICAgICAgLy8gU2F2ZSByZWdpb25hbCBhcm5zIGZvciBncmFudFh4eCgpIG1ldGhvZHNcbiAgICAgICAgdGhpcy5yZWdpb25hbEFybnMucHVzaChcbiAgICAgICAgICB0aGlzLnN0YWNrLmZvcm1hdEFybih7XG4gICAgICAgICAgICByZWdpb246IHIucmVnaW9uTmFtZSxcbiAgICAgICAgICAgIHNlcnZpY2U6IFwiZHluYW1vZGJcIixcbiAgICAgICAgICAgIHJlc291cmNlOiBcInRhYmxlXCIsXG4gICAgICAgICAgICByZXNvdXJjZU5hbWU6IHBoeXNpY2FsVGFibGVOYW1lLFxuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXNvdXJjZSA9IG5ldyBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGUodGhpcywgXCJSZXNvdXJjZVwiLCB7XG4gICAgICBuYW1lOiBwaHlzaWNhbFRhYmxlTmFtZSxcbiAgICAgIGhhc2hLZXk6IHRoaXMudGFibGVQYXJ0aXRpb25LZXkubmFtZSxcbiAgICAgIHJhbmdlS2V5OiB0aGlzLnRhYmxlU29ydEtleT8ubmFtZSxcbiAgICAgIGF0dHJpYnV0ZTogdGhpcy5hdHRyaWJ1dGVEZWZpbml0aW9uc0ludGVybmFsLFxuICAgICAgZ2xvYmFsU2Vjb25kYXJ5SW5kZXg6IExhenkuYW55VmFsdWUoXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9kdWNlOiAoKSA9PlxuICAgICAgICAgICAgdGhpcy5nbG9iYWxTZWNvbmRhcnlJbmRleGVzSW50ZXJuYWwubWFwKFxuICAgICAgICAgICAgICBkeW5hbW9kYlRhYmxlLmR5bmFtb2RiVGFibGVHbG9iYWxTZWNvbmRhcnlJbmRleFRvVGVycmFmb3JtLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgeyBvbWl0RW1wdHlBcnJheTogdHJ1ZSB9LFxuICAgICAgKSxcbiAgICAgIGxvY2FsU2Vjb25kYXJ5SW5kZXg6IExhenkuYW55VmFsdWUoXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9kdWNlOiAoKSA9PlxuICAgICAgICAgICAgdGhpcy5sb2NhbFNlY29uZGFyeUluZGV4ZXNJbnRlcm5hbC5tYXAoXG4gICAgICAgICAgICAgIGR5bmFtb2RiVGFibGUuZHluYW1vZGJUYWJsZUxvY2FsU2Vjb25kYXJ5SW5kZXhUb1RlcnJhZm9ybSxcbiAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIHsgb21pdEVtcHR5QXJyYXk6IHRydWUgfSxcbiAgICAgICksXG4gICAgICBwb2ludEluVGltZVJlY292ZXJ5LFxuICAgICAgYmlsbGluZ01vZGU6IHRoaXMuYmlsbGluZ01vZGUsXG4gICAgICByZWFkQ2FwYWNpdHk6XG4gICAgICAgIHRoaXMuYmlsbGluZ01vZGUgPT09IEJpbGxpbmdNb2RlLlBST1ZJU0lPTkVEXG4gICAgICAgICAgPyAocHJvcHMucmVhZENhcGFjaXR5ID8/IDUpXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICB3cml0ZUNhcGFjaXR5OlxuICAgICAgICB0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QUk9WSVNJT05FRFxuICAgICAgICAgID8gKHByb3BzLndyaXRlQ2FwYWNpdHkgPz8gNSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIG9uRGVtYW5kVGhyb3VnaHB1dDpcbiAgICAgICAgdGhpcy5iaWxsaW5nTW9kZSA9PT0gQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNUICYmXG4gICAgICAgIChwcm9wcy5tYXhSZWFkUmVxdWVzdFVuaXRzIHx8IHByb3BzLm1heFdyaXRlUmVxdWVzdFVuaXRzKVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBtYXhSZWFkUmVxdWVzdFVuaXRzOiBwcm9wcy5tYXhSZWFkUmVxdWVzdFVuaXRzLFxuICAgICAgICAgICAgICBtYXhXcml0ZVJlcXVlc3RVbml0czogcHJvcHMubWF4V3JpdGVSZXF1ZXN0VW5pdHMsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBzZXJ2ZXJTaWRlRW5jcnlwdGlvbjogc3NlU3BlY2lmaWNhdGlvbixcbiAgICAgIHN0cmVhbUVuYWJsZWQ6IHN0cmVhbVNwZWNpZmljYXRpb24/LnN0cmVhbUVuYWJsZWQsXG4gICAgICBzdHJlYW1WaWV3VHlwZTogc3RyZWFtU3BlY2lmaWNhdGlvbj8uc3RyZWFtVmlld1R5cGUsXG4gICAgICB0YWJsZUNsYXNzOiBwcm9wcy50YWJsZUNsYXNzLFxuICAgICAgdHRsOiBwcm9wcy50aW1lVG9MaXZlQXR0cmlidXRlXG4gICAgICAgID8geyBhdHRyaWJ1dGVOYW1lOiBwcm9wcy50aW1lVG9MaXZlQXR0cmlidXRlLCBlbmFibGVkOiB0cnVlIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBkZWxldGlvblByb3RlY3Rpb25FbmFibGVkOiBwcm9wcy5kZWxldGlvblByb3RlY3Rpb24sXG4gICAgICBpbXBvcnRUYWJsZTogdGhpcy5yZW5kZXJJbXBvcnRTb3VyY2VTcGVjaWZpY2F0aW9uKHByb3BzLmltcG9ydFNvdXJjZSksXG4gICAgICByZXBsaWNhOiB0aGlzLl9yZXBsaWNhcyxcbiAgICAgIC8vIHJlc291cmNlUG9saWN5OiBwcm9wcy5yZXNvdXJjZVBvbGljeSA/IHsgcG9saWN5RG9jdW1lbnQ6IHRoaXMuc3RhY2sudG9Kc29uU3RyaW5nKHByb3BzLnJlc291cmNlUG9saWN5LnRvSlNPTigpKSB9IDogdW5kZWZpbmVkLCAvLyBOb3QgaW4gVEYgcmVzb3VyY2VcbiAgICAgIC8vIFRPRE86IGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdGVycmFmb3JtLXByb3ZpZGVyLWF3cy9pc3N1ZXMvNDMxNDJcbiAgICAgIC8vIHdhcm1UaHJvdWdocHV0OiBwcm9wcy53YXJtVGhyb3VnaHB1dCA/PyB1bmRlZmluZWQsIC8vIE5vdCBpbiBURiByZXNvdXJjZVxuICAgIH0pO1xuXG4gICAgdGhpcy50YWJsZUFybiA9IHRoaXMuX3Jlc291cmNlLmFybjtcbiAgICB0aGlzLnRhYmxlTmFtZSA9IHRoaXMuX3Jlc291cmNlLm5hbWU7XG4gICAgdGhpcy50YWJsZVN0cmVhbUFybiA9IHN0cmVhbVNwZWNpZmljYXRpb24/LnN0cmVhbUVuYWJsZWRcbiAgICAgID8gdGhpcy5fcmVzb3VyY2Uuc3RyZWFtQXJuXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJlc291cmNlUG9saWN5ID0gcHJvcHMucmVzb3VyY2VQb2xpY3k7XG4gICAgaWYgKHRoaXMucmVzb3VyY2VQb2xpY3kpIHtcbiAgICAgIG5ldyBkeW5hbW9kYlJlc291cmNlUG9saWN5LkR5bmFtb2RiUmVzb3VyY2VQb2xpY3koXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiUmVzb3VyY2VQb2xpY3lcIixcbiAgICAgICAge1xuICAgICAgICAgIHBvbGljeTogdGhpcy5yZXNvdXJjZVBvbGljeS5qc29uLFxuICAgICAgICAgIHJlc291cmNlQXJuOiB0aGlzLnRhYmxlQXJuLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMua2luZXNpc1N0cmVhbSkge1xuICAgICAgbmV3IGR5bmFtb2RiS2luZXNpc1N0cmVhbWluZ0Rlc3RpbmF0aW9uLkR5bmFtb2RiS2luZXNpc1N0cmVhbWluZ0Rlc3RpbmF0aW9uKFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIktpbmVzaXNTdHJlYW1pbmdEZXN0aW5hdGlvblwiLFxuICAgICAgICB7XG4gICAgICAgICAgdGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgICAgICBzdHJlYW1Bcm46IHByb3BzLmtpbmVzaXNTdHJlYW0uc3RyZWFtQXJuLFxuICAgICAgICAgIC4uLihwcm9wcy5raW5lc2lzUHJlY2lzaW9uVGltZXN0YW1wICYmIHtcbiAgICAgICAgICAgIGFwcHJveGltYXRlQ3JlYXRpb25EYXRlVGltZVByZWNpc2lvbjpcbiAgICAgICAgICAgICAgcHJvcHMua2luZXNpc1ByZWNpc2lvblRpbWVzdGFtcCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmNvbnRyaWJ1dG9ySW5zaWdodHNFbmFibGVkKSB7XG4gICAgICAvLyBUT0RPOiBHZW5lcmF0ZSBjb25udHJpYnV0b3IgaW5zaWdodHMgcGVyIEdsb2JhbCBTZWNvbmRhcnkgSW5kZXhcbiAgICAgIC8vIHRoaXMuZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlc0ludGVybmFsXG4gICAgICBuZXcgZHluYW1vZGJDb250cmlidXRvckluc2lnaHRzLkR5bmFtb2RiQ29udHJpYnV0b3JJbnNpZ2h0cyhcbiAgICAgICAgdGhpcyxcbiAgICAgICAgXCJDb250cmlidXRvckluc2lnaHRzXCIsXG4gICAgICAgIHtcbiAgICAgICAgICB0YWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLFxuICAgICAgICAgIC8vIFRPRE86IHVzZSBmb3IgZWFjaCBvbiBnbGkgaXRlcmF0b3JcbiAgICAgICAgICAvLyBpbmRleE5hbWU6IGl0ZXJhdG9yLnZhbHVlLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDb21tZW50aW5nIG91dCBzY2FsaW5nUm9sZSBpbml0aWFsaXphdGlvbiAtIGxldCBUZXJyYWZvcm0gYXV0by1jcmVhdGUgc2VydmljZS1saW5rZWQgcm9sZVxuICAgIC8vIHRoaXMuc2NhbGluZ1JvbGUgPSB0aGlzLm1ha2VTY2FsaW5nUm9sZSgpO1xuXG4gICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oeyB2YWxpZGF0ZTogKCkgPT4gdGhpcy52YWxpZGF0ZVRhYmxlKCkgfSk7XG4gIH1cblxuICBwdWJsaWMgYWRkR2xvYmFsU2Vjb25kYXJ5SW5kZXgocHJvcHM6IEdsb2JhbFNlY29uZGFyeUluZGV4UHJvcHMpIHtcbiAgICB0aGlzLnZhbGlkYXRlUHJvdmlzaW9uaW5nR1NJKHByb3BzKTtcbiAgICB0aGlzLnZhbGlkYXRlSW5kZXhOYW1lKHByb3BzLmluZGV4TmFtZSk7XG5cbiAgICBjb25zdCBnc2lQcm9qZWN0aW9uID0gdGhpcy5idWlsZEluZGV4UHJvamVjdGlvbihwcm9wcyk7XG4gICAgdGhpcy5yZWdpc3RlckF0dHJpYnV0ZShwcm9wcy5wYXJ0aXRpb25LZXkpO1xuICAgIGlmIChwcm9wcy5zb3J0S2V5KSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyQXR0cmlidXRlKHByb3BzLnNvcnRLZXkpO1xuICAgIH1cblxuICAgIHRoaXMuZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlc0ludGVybmFsLnB1c2goe1xuICAgICAgbmFtZTogcHJvcHMuaW5kZXhOYW1lLFxuICAgICAgaGFzaEtleTogcHJvcHMucGFydGl0aW9uS2V5Lm5hbWUsXG4gICAgICByYW5nZUtleTogcHJvcHMuc29ydEtleT8ubmFtZSxcbiAgICAgIHByb2plY3Rpb25UeXBlOiBnc2lQcm9qZWN0aW9uLnByb2plY3Rpb25UeXBlLFxuICAgICAgbm9uS2V5QXR0cmlidXRlczogZ3NpUHJvamVjdGlvbi5ub25LZXlBdHRyaWJ1dGVzLFxuICAgICAgcmVhZENhcGFjaXR5OlxuICAgICAgICB0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QUk9WSVNJT05FRFxuICAgICAgICAgID8gKHByb3BzLnJlYWRDYXBhY2l0eSA/PyA1KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgd3JpdGVDYXBhY2l0eTpcbiAgICAgICAgdGhpcy5iaWxsaW5nTW9kZSA9PT0gQmlsbGluZ01vZGUuUFJPVklTSU9ORURcbiAgICAgICAgICA/IChwcm9wcy53cml0ZUNhcGFjaXR5ID8/IDUpXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBvbkRlbWFuZFRocm91Z2hwdXQ6XG4gICAgICAgIHRoaXMuYmlsbGluZ01vZGUgPT09IEJpbGxpbmdNb2RlLlBBWV9QRVJfUkVRVUVTVCAmJlxuICAgICAgICAocHJvcHMubWF4UmVhZFJlcXVlc3RVbml0cyB8fCBwcm9wcy5tYXhXcml0ZVJlcXVlc3RVbml0cylcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgbWF4UmVhZFJlcXVlc3RVbml0czogcHJvcHMubWF4UmVhZFJlcXVlc3RVbml0cyxcbiAgICAgICAgICAgICAgbWF4V3JpdGVSZXF1ZXN0VW5pdHM6IHByb3BzLm1heFdyaXRlUmVxdWVzdFVuaXRzLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgLy8gY29udHJpYnV0b3JJbnNpZ2h0c0VuYWJsZWQ6IHByb3BzLmNvbnRyaWJ1dG9ySW5zaWdodHNFbmFibGVkLCAvLyBOb3QgaW4gVEYgR1NJIGJsb2NrXG4gICAgICAvLyB3YXJtVGhyb3VnaHB1dDogcHJvcHMud2FybVRocm91Z2hwdXQsIC8vIE5vdCBpbiBURiBHU0kgYmxvY2tcbiAgICB9KTtcblxuICAgIHRoaXMuc2Vjb25kYXJ5SW5kZXhTY2hlbWFzLnNldChwcm9wcy5pbmRleE5hbWUsIHtcbiAgICAgIHBhcnRpdGlvbktleTogcHJvcHMucGFydGl0aW9uS2V5LFxuICAgICAgc29ydEtleTogcHJvcHMuc29ydEtleSxcbiAgICB9KTtcbiAgICB0aGlzLmluZGV4U2NhbGluZy5zZXQocHJvcHMuaW5kZXhOYW1lLCB7fSk7XG4gIH1cblxuICBwdWJsaWMgYWRkTG9jYWxTZWNvbmRhcnlJbmRleChwcm9wczogTG9jYWxTZWNvbmRhcnlJbmRleFByb3BzKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5sb2NhbFNlY29uZGFyeUluZGV4ZXNJbnRlcm5hbC5sZW5ndGggPj1cbiAgICAgIE1BWF9MT0NBTF9TRUNPTkRBUllfSU5ERVhfQ09VTlRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICBgQSBtYXhpbXVtIG51bWJlciBvZiBsb2NhbCBzZWNvbmRhcnkgaW5kZXggcGVyIHRhYmxlIGlzICR7TUFYX0xPQ0FMX1NFQ09OREFSWV9JTkRFWF9DT1VOVH1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUluZGV4TmFtZShwcm9wcy5pbmRleE5hbWUpO1xuXG4gICAgaWYgKCF0aGlzLnRhYmxlUGFydGl0aW9uS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIlRhYmxlIHBhcnRpdGlvbiBrZXkgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBhZGRpbmcgbG9jYWwgc2Vjb25kYXJ5IGluZGV4XCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnJlZ2lzdGVyQXR0cmlidXRlKHRoaXMudGFibGVQYXJ0aXRpb25LZXkpO1xuICAgIHRoaXMucmVnaXN0ZXJBdHRyaWJ1dGUocHJvcHMuc29ydEtleSk7XG5cbiAgICBjb25zdCBsc2lQcm9qZWN0aW9uID0gdGhpcy5idWlsZEluZGV4UHJvamVjdGlvbihwcm9wcyk7XG5cbiAgICB0aGlzLmxvY2FsU2Vjb25kYXJ5SW5kZXhlc0ludGVybmFsLnB1c2goe1xuICAgICAgbmFtZTogcHJvcHMuaW5kZXhOYW1lLFxuICAgICAgcmFuZ2VLZXk6IHByb3BzLnNvcnRLZXkubmFtZSxcbiAgICAgIHByb2plY3Rpb25UeXBlOiBsc2lQcm9qZWN0aW9uLnByb2plY3Rpb25UeXBlLFxuICAgICAgbm9uS2V5QXR0cmlidXRlczogbHNpUHJvamVjdGlvbi5ub25LZXlBdHRyaWJ1dGVzLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZWNvbmRhcnlJbmRleFNjaGVtYXMuc2V0KHByb3BzLmluZGV4TmFtZSwge1xuICAgICAgcGFydGl0aW9uS2V5OiB0aGlzLnRhYmxlUGFydGl0aW9uS2V5LFxuICAgICAgc29ydEtleTogcHJvcHMuc29ydEtleSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhdXRvU2NhbGVSZWFkQ2FwYWNpdHkoXG4gICAgcHJvcHM6IEVuYWJsZVNjYWxpbmdQcm9wcyxcbiAgKTogSVNjYWxhYmxlVGFibGVBdHRyaWJ1dGUge1xuICAgIGlmICh0aGlzLnRhYmxlU2NhbGluZy5zY2FsYWJsZVJlYWRBdHRyaWJ1dGUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiUmVhZCBBdXRvU2NhbGluZyBhbHJlYWR5IGVuYWJsZWQgZm9yIHRoaXMgdGFibGVcIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiQXV0b1NjYWxpbmcgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGFibGVzIHdpdGggUEFZX1BFUl9SRVFVRVNUIGJpbGxpbmcgbW9kZVwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHRoaXMudGFibGVTY2FsaW5nLnNjYWxhYmxlUmVhZEF0dHJpYnV0ZSA9XG4gICAgICBuZXcgU2NhbGFibGVUYWJsZUF0dHJpYnV0ZSh0aGlzLCBcIlJlYWRTY2FsaW5nXCIsIHtcbiAgICAgICAgc2VydmljZU5hbWVzcGFjZTogYXBwc2NhbGluZy5TZXJ2aWNlTmFtZXNwYWNlLkRZTkFNT0RCLFxuICAgICAgICByZXNvdXJjZUlkOiBgdGFibGUvJHt0aGlzLnRhYmxlTmFtZX1gLFxuICAgICAgICBkaW1lbnNpb246IFwiZHluYW1vZGI6dGFibGU6UmVhZENhcGFjaXR5VW5pdHNcIixcbiAgICAgICAgLy8gcm9sZTogdGhpcy5zY2FsaW5nUm9sZSwgLy8gQ29tbWVudGluZyBvdXQgLSBsZXQgVGVycmFmb3JtIHVzZSBzZXJ2aWNlLWxpbmtlZCByb2xlXG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgfSkpO1xuICB9XG5cbiAgcHVibGljIGF1dG9TY2FsZVdyaXRlQ2FwYWNpdHkoXG4gICAgcHJvcHM6IEVuYWJsZVNjYWxpbmdQcm9wcyxcbiAgKTogSVNjYWxhYmxlVGFibGVBdHRyaWJ1dGUge1xuICAgIGlmICh0aGlzLnRhYmxlU2NhbGluZy5zY2FsYWJsZVdyaXRlQXR0cmlidXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIldyaXRlIEF1dG9TY2FsaW5nIGFscmVhZHkgZW5hYmxlZCBmb3IgdGhpcyB0YWJsZVwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYmlsbGluZ01vZGUgPT09IEJpbGxpbmdNb2RlLlBBWV9QRVJfUkVRVUVTVCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCJBdXRvU2NhbGluZyBpcyBub3QgYXZhaWxhYmxlIGZvciB0YWJsZXMgd2l0aCBQQVlfUEVSX1JFUVVFU1QgYmlsbGluZyBtb2RlXCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMudGFibGVTY2FsaW5nLnNjYWxhYmxlV3JpdGVBdHRyaWJ1dGUgPSBuZXcgU2NhbGFibGVUYWJsZUF0dHJpYnV0ZShcbiAgICAgIHRoaXMsXG4gICAgICBcIldyaXRlU2NhbGluZ1wiLFxuICAgICAge1xuICAgICAgICBzZXJ2aWNlTmFtZXNwYWNlOiBhcHBzY2FsaW5nLlNlcnZpY2VOYW1lc3BhY2UuRFlOQU1PREIsXG4gICAgICAgIHJlc291cmNlSWQ6IGB0YWJsZS8ke3RoaXMudGFibGVOYW1lfWAsXG4gICAgICAgIGRpbWVuc2lvbjogXCJkeW5hbW9kYjp0YWJsZTpXcml0ZUNhcGFjaXR5VW5pdHNcIixcbiAgICAgICAgLy8gcm9sZTogdGhpcy5zY2FsaW5nUm9sZSwgLy8gQ29tbWVudGluZyBvdXQgLSBsZXQgVGVycmFmb3JtIHVzZSBzZXJ2aWNlLWxpbmtlZCByb2xlXG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgfSxcbiAgICApO1xuICAgIC8vIElmIHRoZXJlIGFyZSByZXBsaWNhcywgdGhleSBkZXBlbmQgb24gdGhlIHdyaXRlIHNjYWxpbmcgcG9saWN5IG9mIHRoZSBtYWluIHRhYmxlLlxuICAgIC8vIFRoaXMgaXMgbm90IGV4cGxpY2l0bHkgbW9kZWxlZCBpbiBURiBidXQgd2FzIGhhbmRsZWQgYnkgQ3VzdG9tUmVzb3VyY2UgZGVwZW5kZW5jaWVzIGluIENESy5cbiAgICAvLyBGb3IgVEYsIHRoaXMgZGVwZW5kZW5jeSBpcyBpbXBsaWNpdCBpZiB0aGUgcHJvdmlkZXIgaGFuZGxlcyBpdCwgb3IgbWlnaHQgbmVlZCBleHBsaWNpdCBkZXBlbmRzT24gaWYgaXNzdWVzIGFyaXNlLlxuICAgIHJldHVybiB0aGlzLnRhYmxlU2NhbGluZy5zY2FsYWJsZVdyaXRlQXR0cmlidXRlO1xuICB9XG5cbiAgcHVibGljIGF1dG9TY2FsZUdsb2JhbFNlY29uZGFyeUluZGV4UmVhZENhcGFjaXR5KFxuICAgIGluZGV4TmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBFbmFibGVTY2FsaW5nUHJvcHMsXG4gICk6IElTY2FsYWJsZVRhYmxlQXR0cmlidXRlIHtcbiAgICBpZiAodGhpcy5iaWxsaW5nTW9kZSA9PT0gQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNUKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIkF1dG9TY2FsaW5nIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRhYmxlcyB3aXRoIFBBWV9QRVJfUkVRVUVTVCBiaWxsaW5nIG1vZGVcIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZVBhaXIgPSB0aGlzLmluZGV4U2NhbGluZy5nZXQoaW5kZXhOYW1lKTtcbiAgICBpZiAoIWF0dHJpYnV0ZVBhaXIpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBObyBnbG9iYWwgc2Vjb25kYXJ5IGluZGV4IHdpdGggbmFtZSAke2luZGV4TmFtZX1gLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGF0dHJpYnV0ZVBhaXIuc2NhbGFibGVSZWFkQXR0cmlidXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIlJlYWQgQXV0b1NjYWxpbmcgYWxyZWFkeSBlbmFibGVkIGZvciB0aGlzIGluZGV4XCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAoYXR0cmlidXRlUGFpci5zY2FsYWJsZVJlYWRBdHRyaWJ1dGUgPSBuZXcgU2NhbGFibGVUYWJsZUF0dHJpYnV0ZShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtpbmRleE5hbWV9UmVhZFNjYWxpbmdgLFxuICAgICAge1xuICAgICAgICBzZXJ2aWNlTmFtZXNwYWNlOiBhcHBzY2FsaW5nLlNlcnZpY2VOYW1lc3BhY2UuRFlOQU1PREIsXG4gICAgICAgIHJlc291cmNlSWQ6IGB0YWJsZS8ke3RoaXMudGFibGVOYW1lfS9pbmRleC8ke2luZGV4TmFtZX1gLFxuICAgICAgICBkaW1lbnNpb246IFwiZHluYW1vZGI6aW5kZXg6UmVhZENhcGFjaXR5VW5pdHNcIixcbiAgICAgICAgLy8gcm9sZTogdGhpcy5zY2FsaW5nUm9sZSwgLy8gQ29tbWVudGluZyBvdXQgLSBsZXQgVGVycmFmb3JtIHVzZSBzZXJ2aWNlLWxpbmtlZCByb2xlXG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgfSxcbiAgICApKTtcbiAgfVxuXG4gIHB1YmxpYyBhdXRvU2NhbGVHbG9iYWxTZWNvbmRhcnlJbmRleFdyaXRlQ2FwYWNpdHkoXG4gICAgaW5kZXhOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IEVuYWJsZVNjYWxpbmdQcm9wcyxcbiAgKTogSVNjYWxhYmxlVGFibGVBdHRyaWJ1dGUge1xuICAgIGlmICh0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiQXV0b1NjYWxpbmcgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGFibGVzIHdpdGggUEFZX1BFUl9SRVFVRVNUIGJpbGxpbmcgbW9kZVwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlUGFpciA9IHRoaXMuaW5kZXhTY2FsaW5nLmdldChpbmRleE5hbWUpO1xuICAgIGlmICghYXR0cmlidXRlUGFpcikge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYE5vIGdsb2JhbCBzZWNvbmRhcnkgaW5kZXggd2l0aCBuYW1lICR7aW5kZXhOYW1lfWAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYXR0cmlidXRlUGFpci5zY2FsYWJsZVdyaXRlQXR0cmlidXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIldyaXRlIEF1dG9TY2FsaW5nIGFscmVhZHkgZW5hYmxlZCBmb3IgdGhpcyBpbmRleFwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGF0dHJpYnV0ZVBhaXIuc2NhbGFibGVXcml0ZUF0dHJpYnV0ZSA9IG5ldyBTY2FsYWJsZVRhYmxlQXR0cmlidXRlKFxuICAgICAgdGhpcyxcbiAgICAgIGAke2luZGV4TmFtZX1Xcml0ZVNjYWxpbmdgLFxuICAgICAge1xuICAgICAgICBzZXJ2aWNlTmFtZXNwYWNlOiBhcHBzY2FsaW5nLlNlcnZpY2VOYW1lc3BhY2UuRFlOQU1PREIsXG4gICAgICAgIHJlc291cmNlSWQ6IGB0YWJsZS8ke3RoaXMudGFibGVOYW1lfS9pbmRleC8ke2luZGV4TmFtZX1gLFxuICAgICAgICBkaW1lbnNpb246IFwiZHluYW1vZGI6aW5kZXg6V3JpdGVDYXBhY2l0eVVuaXRzXCIsXG4gICAgICAgIC8vIHJvbGU6IHRoaXMuc2NhbGluZ1JvbGUsIC8vIENvbW1lbnRpbmcgb3V0IC0gbGV0IFRlcnJhZm9ybSB1c2Ugc2VydmljZS1saW5rZWQgcm9sZVxuICAgICAgICAuLi5wcm9wcyxcbiAgICAgIH0sXG4gICAgKSk7XG4gIH1cblxuICBwdWJsaWMgc2NoZW1hKGluZGV4TmFtZT86IHN0cmluZyk6IFNjaGVtYU9wdGlvbnMge1xuICAgIGlmICghaW5kZXhOYW1lKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXJ0aXRpb25LZXk6IHRoaXMudGFibGVQYXJ0aXRpb25LZXksXG4gICAgICAgIHNvcnRLZXk6IHRoaXMudGFibGVTb3J0S2V5LFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5zZWNvbmRhcnlJbmRleFNjaGVtYXMuZ2V0KGluZGV4TmFtZSk7XG4gICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgZmluZCBzY2hlbWEgZm9yIGluZGV4OiAke2luZGV4TmFtZX0uIFVzZSAnYWRkR2xvYmFsU2Vjb25kYXJ5SW5kZXgnIG9yICdhZGRMb2NhbFNlY29uZGFyeUluZGV4JyB0byBhZGQgaW5kZXhgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVUYWJsZSgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXJyb3JzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBpZiAoIXRoaXMudGFibGVQYXJ0aXRpb25LZXkpIHtcbiAgICAgIGVycm9ycy5wdXNoKFwiQSBwYXJ0aXRpb24ga2V5IG11c3QgYmUgc3BlY2lmaWVkXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2NhbFNlY29uZGFyeUluZGV4ZXNJbnRlcm5hbC5sZW5ndGggPiAwICYmICF0aGlzLnRhYmxlU29ydEtleSkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIFwiQSBzb3J0IGtleSBvZiB0aGUgdGFibGUgbXVzdCBiZSBzcGVjaWZpZWQgdG8gYWRkIGxvY2FsIHNlY29uZGFyeSBpbmRleGVzXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLl9yZXBsaWNhcyAmJlxuICAgICAgdGhpcy5fcmVwbGljYXMubGVuZ3RoID4gMCAmJlxuICAgICAgdGhpcy5iaWxsaW5nTW9kZSA9PT0gQmlsbGluZ01vZGUuUFJPVklTSU9ORURcbiAgICApIHtcbiAgICAgIGNvbnN0IHdyaXRlQXV0b1NjYWxlQXR0cmlidXRlID0gdGhpcy50YWJsZVNjYWxpbmcuc2NhbGFibGVXcml0ZUF0dHJpYnV0ZTtcbiAgICAgIGlmICghd3JpdGVBdXRvU2NhbGVBdHRyaWJ1dGUpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICAgXCJBIGdsb2JhbCBUYWJsZSB0aGF0IHVzZXMgUFJPVklTSU9ORUQgYXMgdGhlIGJpbGxpbmcgbW9kZSBuZWVkcyBhdXRvLXNjYWxlZCB3cml0ZSBjYXBhY2l0eS4gXCIgK1xuICAgICAgICAgICAgXCJVc2UgdGhlIGF1dG9TY2FsZVdyaXRlQ2FwYWNpdHkoKSBtZXRob2QgdG8gZW5hYmxlIGl0LlwiLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICghd3JpdGVBdXRvU2NhbGVBdHRyaWJ1dGUuX3NjYWxpbmdQb2xpY3lDcmVhdGVkKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgIFwiQSBnbG9iYWwgVGFibGUgdGhhdCB1c2VzIFBST1ZJU0lPTkVEIGFzIHRoZSBiaWxsaW5nIG1vZGUgbmVlZHMgYXV0by1zY2FsZWQgd3JpdGUgY2FwYWNpdHkgd2l0aCBhIHBvbGljeS4gXCIgK1xuICAgICAgICAgICAgXCJDYWxsIG9uZSBvZiB0aGUgc2NhbGVPbiooKSBtZXRob2RzIG9mIHRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSBhdXRvU2NhbGVXcml0ZUNhcGFjaXR5KClcIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVycm9ycztcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVQcm92aXNpb25pbmcocHJvcHM6IHtcbiAgICByZWFkQ2FwYWNpdHk/OiBudW1iZXI7XG4gICAgd3JpdGVDYXBhY2l0eT86IG51bWJlcjtcbiAgfSkge1xuICAgIGlmICh0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcHMucmVhZENhcGFjaXR5ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgcHJvcHMud3JpdGVDYXBhY2l0eSAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBcIllvdSBjYW5ub3QgcHJvdmlzaW9uIHJlYWQgYW5kIHdyaXRlIGNhcGFjaXR5IGZvciBhIHRhYmxlIHdpdGggUEFZX1BFUl9SRVFVRVNUIGJpbGxpbmcgbW9kZVwiLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVByb3Zpc2lvbmluZ0dTSShwcm9wczogR2xvYmFsU2Vjb25kYXJ5SW5kZXhQcm9wcykge1xuICAgIGlmICh0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcHMucmVhZENhcGFjaXR5ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgcHJvcHMud3JpdGVDYXBhY2l0eSAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBcIllvdSBjYW5ub3QgcHJvdmlzaW9uIHJlYWQgYW5kIHdyaXRlIGNhcGFjaXR5IGZvciBhIEdTSSB3aXRoIFBBWV9QRVJfUkVRVUVTVCBiaWxsaW5nIG1vZGUgb24gdGhlIHRhYmxlXCIsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlSW5kZXhOYW1lKGluZGV4TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuc2Vjb25kYXJ5SW5kZXhTY2hlbWFzLmhhcyhpbmRleE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgQSBkdXBsaWNhdGUgaW5kZXggbmFtZSwgJHtpbmRleE5hbWV9LCBpcyBub3QgYWxsb3dlZGAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVOb25LZXlBdHRyaWJ1dGVzKG5vbktleUF0dHJpYnV0ZXM6IHN0cmluZ1tdKSB7XG4gICAgaWYgKHRoaXMubm9uS2V5QXR0cmlidXRlcy5zaXplICsgbm9uS2V5QXR0cmlidXRlcy5sZW5ndGggPiAxMDApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICBcIkEgbWF4aW11bSBudW1iZXIgb2Ygbm9uS2V5QXR0cmlidXRlcyBhY3Jvc3MgYWxsIG9mIHNlY29uZGFyeSBpbmRleGVzIGlzIDEwMFwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgbm9uS2V5QXR0cmlidXRlcy5mb3JFYWNoKChhdHQpID0+IHRoaXMubm9uS2V5QXR0cmlidXRlcy5hZGQoYXR0KSk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclBvaW50SW5UaW1lUmVjb3ZlcnkoXG4gICAgcHJvcHM6IFRhYmxlUHJvcHMsXG4gICk6IGR5bmFtb2RiVGFibGUuRHluYW1vZGJUYWJsZVBvaW50SW5UaW1lUmVjb3ZlcnkgfCB1bmRlZmluZWQge1xuICAgIGlmIChcbiAgICAgIHByb3BzLnBvaW50SW5UaW1lUmVjb3ZlcnlTcGVjaWZpY2F0aW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHByb3BzLnBvaW50SW5UaW1lUmVjb3ZlcnkgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCJgcG9pbnRJblRpbWVSZWNvdmVyeVNwZWNpZmljYXRpb25gIGFuZCBgcG9pbnRJblRpbWVSZWNvdmVyeWAgYXJlIHNldC4gVXNlIGBwb2ludEluVGltZVJlY292ZXJ5U3BlY2lmaWNhdGlvbmAgb25seS5cIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3BlYyA9IHByb3BzLnBvaW50SW5UaW1lUmVjb3ZlcnlTcGVjaWZpY2F0aW9uO1xuICAgIGlmIChzcGVjPy5yZWNvdmVyeVBlcmlvZEluRGF5cykge1xuICAgICAgLy8gVE9ETzogVXBncmFkZSBwcm92aWRlciB0byA1Ljk4LjAgdG8gc3VwcG9ydCByZWNvdmVyeVBlcmlvZEluRGF5c1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZyhcbiAgICAgICAgXCJXYXJuaW5nOiByZWNvdmVyeVBlcmlvZEluRGF5cyBpcyBub3Qgc3VwcG9ydGVkIHVudGlsIHByb3ZpZGVyIGF3cyBpcyB1cGdyYWRlZCB0byA1Ljk4LjAgYW5kIHdpbGwgYmUgaWdub3JlZC5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5hYmxlZCA9XG4gICAgICBzcGVjPy5wb2ludEluVGltZVJlY292ZXJ5RW5hYmxlZCA/PyBwcm9wcy5wb2ludEluVGltZVJlY292ZXJ5O1xuICAgIGlmIChlbmFibGVkID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgZW5hYmxlZCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEluZGV4UHJvamVjdGlvbihcbiAgICBwcm9wczogU2Vjb25kYXJ5SW5kZXhQcm9wcyxcbiAgKTogUGljazxcbiAgICBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVHbG9iYWxTZWNvbmRhcnlJbmRleCxcbiAgICBcInByb2plY3Rpb25UeXBlXCIgfCBcIm5vbktleUF0dHJpYnV0ZXNcIlxuICA+IHtcbiAgICBpZiAoXG4gICAgICBwcm9wcy5wcm9qZWN0aW9uVHlwZSA9PT0gUHJvamVjdGlvblR5cGUuSU5DTFVERSAmJlxuICAgICAgIXByb3BzLm5vbktleUF0dHJpYnV0ZXNcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBOb24ta2V5IGF0dHJpYnV0ZXMgc2hvdWxkIGJlIHNwZWNpZmllZCB3aGVuIHVzaW5nICR7UHJvamVjdGlvblR5cGUuSU5DTFVERX0gcHJvamVjdGlvbiB0eXBlYCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHByb3BzLnByb2plY3Rpb25UeXBlICE9PSBQcm9qZWN0aW9uVHlwZS5JTkNMVURFICYmXG4gICAgICBwcm9wcy5ub25LZXlBdHRyaWJ1dGVzXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgTm9uLWtleSBhdHRyaWJ1dGVzIHNob3VsZCBub3QgYmUgc3BlY2lmaWVkIHdoZW4gbm90IHVzaW5nICR7UHJvamVjdGlvblR5cGUuSU5DTFVERX0gcHJvamVjdGlvbiB0eXBlYCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5ub25LZXlBdHRyaWJ1dGVzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlTm9uS2V5QXR0cmlidXRlcyhwcm9wcy5ub25LZXlBdHRyaWJ1dGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb2plY3Rpb25UeXBlOiBwcm9wcy5wcm9qZWN0aW9uVHlwZSA/PyBQcm9qZWN0aW9uVHlwZS5BTEwsXG4gICAgICBub25LZXlBdHRyaWJ1dGVzOiBwcm9wcy5ub25LZXlBdHRyaWJ1dGVzLFxuICAgIH07XG4gIH1cblxuICAvLyBUT0RPOiBrZXlUeXBlIGlzIHVudXNlZFxuICBwcml2YXRlIGFkZEtleShhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgX2tleVR5cGU6IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nQXR0ciA9IHRoaXMuYXR0cmlidXRlRGVmaW5pdGlvbnNJbnRlcm5hbC5maW5kKFxuICAgICAgKGRlZikgPT4gZGVmLm5hbWUgPT09IGF0dHJpYnV0ZS5uYW1lLFxuICAgICk7XG4gICAgaWYgKGV4aXN0aW5nQXR0ciAmJiBleGlzdGluZ0F0dHIudHlwZSAhPT0gYXR0cmlidXRlLnR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBVbmFibGUgdG8gc3BlY2lmeSAke2F0dHJpYnV0ZS5uYW1lfSBhcyAke2F0dHJpYnV0ZS50eXBlfSBiZWNhdXNlIGl0IHdhcyBhbHJlYWR5IGRlZmluZWQgYXMgJHtleGlzdGluZ0F0dHIudHlwZX1gLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFleGlzdGluZ0F0dHIpIHtcbiAgICAgIHRoaXMuYXR0cmlidXRlRGVmaW5pdGlvbnNJbnRlcm5hbC5wdXNoKHtcbiAgICAgICAgbmFtZTogYXR0cmlidXRlLm5hbWUsXG4gICAgICAgIHR5cGU6IGF0dHJpYnV0ZS50eXBlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIEZvciB0aGUgbWFpbiB0YWJsZSwgaGFzaEtleSBhbmQgcmFuZ2VLZXkgYXJlIHNldCBkaXJlY3RseSBvbiB0aGUgcmVzb3VyY2UuXG4gICAgLy8gRm9yIEdTSXMvTFNJcywgdGhleSBhcmUgcGFydCBvZiB0aGVpciByZXNwZWN0aXZlIGJsb2Nrcy5cbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJBdHRyaWJ1dGUoYXR0cmlidXRlOiBBdHRyaWJ1dGUpIHtcbiAgICBjb25zdCBleGlzdGluZ0RlZiA9IHRoaXMuYXR0cmlidXRlRGVmaW5pdGlvbnNJbnRlcm5hbC5maW5kKFxuICAgICAgKGRlZikgPT4gZGVmLm5hbWUgPT09IGF0dHJpYnV0ZS5uYW1lLFxuICAgICk7XG4gICAgaWYgKGV4aXN0aW5nRGVmICYmIGV4aXN0aW5nRGVmLnR5cGUgIT09IGF0dHJpYnV0ZS50eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgVW5hYmxlIHRvIHNwZWNpZnkgJHthdHRyaWJ1dGUubmFtZX0gYXMgJHthdHRyaWJ1dGUudHlwZX0gYmVjYXVzZSBpdCB3YXMgYWxyZWFkeSBkZWZpbmVkIGFzICR7ZXhpc3RpbmdEZWYudHlwZX1gLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFleGlzdGluZ0RlZikge1xuICAgICAgdGhpcy5hdHRyaWJ1dGVEZWZpbml0aW9uc0ludGVybmFsLnB1c2goe1xuICAgICAgICBuYW1lOiBhdHRyaWJ1dGUubmFtZSxcbiAgICAgICAgdHlwZTogYXR0cmlidXRlLnR5cGUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBDb21tZW50aW5nIG91dCBtYWtlU2NhbGluZ1JvbGUgbWV0aG9kIC0gVGVycmFmb3JtIGhhbmRsZXMgc2VydmljZS1saW5rZWQgcm9sZXMgYXV0b21hdGljYWxseVxuICAvLyBVbmxpa2UgQVdTIENESyBDbG91ZEZvcm1hdGlvbiBpbXBsZW1lbnRhdGlvbiwgVGVycmFmb3JtIEFXUyBwcm92aWRlciBjcmVhdGVzIGFwcHJvcHJpYXRlXG4gIC8vIHNlcnZpY2UtbGlua2VkIHJvbGVzIHdoZW4gcm9sZUFybiBpcyBvbWl0dGVkIGZyb20gYXdzX2FwcGF1dG9zY2FsaW5nX3RhcmdldCByZXNvdXJjZVxuICAvLyBwcml2YXRlIG1ha2VTY2FsaW5nUm9sZSgpOiBpYW0uSVJvbGUge1xuICAvLyAgIC8vIFVzZSBhIFNlcnZpY2UgTGlua2VkIFJvbGUuXG4gIC8vICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F1dG9zY2FsaW5nL2FwcGxpY2F0aW9uL3VzZXJndWlkZS9hcHBsaWNhdGlvbi1hdXRvLXNjYWxpbmctc2VydmljZS1saW5rZWQtcm9sZXMuaHRtbFxuICAvLyAgIHJldHVybiBpYW0uUm9sZS5mcm9tUm9sZUFybihcbiAgLy8gICAgIHRoaXMsXG4gIC8vICAgICBcIlNjYWxpbmdSb2xlXCIsXG4gIC8vICAgICB0aGlzLnN0YWNrLmZvcm1hdEFybih7XG4gIC8vICAgICAgIHNlcnZpY2U6IFwiaWFtXCIsXG4gIC8vICAgICAgIHJlZ2lvbjogXCJcIiwgLy8gU0xScyBhcmUgZ2xvYmFsXG4gIC8vICAgICAgIHJlc291cmNlOlxuICAvLyAgICAgICAgIFwicm9sZS9hd3Mtc2VydmljZS1yb2xlL2R5bmFtb2RiLmFwcGxpY2F0aW9uLWF1dG9zY2FsaW5nLmFtYXpvbmF3cy5jb21cIixcbiAgLy8gICAgICAgcmVzb3VyY2VOYW1lOiBcIkFXU1NlcnZpY2VSb2xlRm9yQXBwbGljYXRpb25BdXRvU2NhbGluZ19EeW5hbW9EQlRhYmxlXCIsXG4gIC8vICAgICAgIC8vIFRPRE86IElzIHRoaXMgbmVlZGVkP1xuICAvLyAgICAgICAvLyBhcm5Gb3JtYXQ6IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9TTEFTSF9SRVNPVVJDRV9OQU1FLCAvLyBTcGVjaWFsIGZvcm1hdCBmb3IgU0xSc1xuICAvLyAgICAgfSksXG4gIC8vICAgKTtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHJlcGxpY2EgdGFibGVzXG4gICAqXG4gICAqIEBwYXJhbSByZWdpb25zIHJlZ2lvbnMgd2hlcmUgdG8gY3JlYXRlIHRhYmxlc1xuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJSZXBsaWNhcyhcbiAgICByZWdpb25zPzogc3RyaW5nW10sXG4gICAgcmVwbGljYVNwZWNpZmljYXRpb24/OiBEeW5hbW9kYlRhYmxlUmVwbGljYVtdLFxuICApOiBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVSZXBsaWNhW10gfCB1bmRlZmluZWQge1xuICAgIGlmIChyZXBsaWNhU3BlY2lmaWNhdGlvbiAmJiByZXBsaWNhU3BlY2lmaWNhdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQodGhpcy5zdGFjay5yZWdpb24pICYmXG4gICAgICAgIHJlcGxpY2FTcGVjaWZpY2F0aW9uLnNvbWUoXG4gICAgICAgICAgKHJlcGxpY2EpID0+IHJlcGxpY2EucmVnaW9uTmFtZSA9PT0gdGhpcy5zdGFjay5yZWdpb24sXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIFwiYHJlcGxpY2FTcGVjaWZpY2F0aW9uYCBjYW5ub3QgaW5jbHVkZSB0aGUgcmVnaW9uIHdoZXJlIHRoaXMgc3RhY2sgaXMgZGVwbG95ZWQuXCIsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXBsaWNhU3BlY2lmaWNhdGlvbi5tYXAoKHJlcGxpY2EpID0+ICh7XG4gICAgICAgIHJlZ2lvbk5hbWU6IHJlcGxpY2EucmVnaW9uTmFtZSxcbiAgICAgICAga21zS2V5QXJuOiByZXBsaWNhLmVuY3J5cHRpb25LZXk/LmtleUFybixcbiAgICAgICAgcG9pbnRJblRpbWVSZWNvdmVyeTogcmVwbGljYS5wb2ludEluVGltZVJlY292ZXJ5LFxuICAgICAgICBwcm9wYWdhdGVUYWdzOiByZXBsaWNhLnByb3BhZ2F0ZVRhZ3MsXG4gICAgICB9KSk7XG4gICAgfVxuICAgIGlmICghcmVnaW9ucyB8fCByZWdpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGlmIChcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQodGhpcy5zdGFjay5yZWdpb24pICYmXG4gICAgICByZWdpb25zLmluY2x1ZGVzKHRoaXMuc3RhY2sucmVnaW9uKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCJgcmVwbGljYXRpb25SZWdpb25zYCBjYW5ub3QgaW5jbHVkZSB0aGUgcmVnaW9uIHdoZXJlIHRoaXMgc3RhY2sgaXMgZGVwbG95ZWQuXCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBbLi4ubmV3IFNldChyZWdpb25zKV0ubWFwKChyZWdpb24pID0+ICh7XG4gICAgICByZWdpb25OYW1lOiByZWdpb24sXG4gICAgfSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBoYXNJbmRleCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5nbG9iYWxTZWNvbmRhcnlJbmRleGVzSW50ZXJuYWwubGVuZ3RoICtcbiAgICAgICAgdGhpcy5sb2NhbFNlY29uZGFyeUluZGV4ZXNJbnRlcm5hbC5sZW5ndGggPlxuICAgICAgMFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlRW5jcnlwdGlvbihwcm9wczogVGFibGVQcm9wcyk6IHtcbiAgICBzc2VTcGVjaWZpY2F0aW9uPzogZHluYW1vZGJUYWJsZS5EeW5hbW9kYlRhYmxlU2VydmVyU2lkZUVuY3J5cHRpb247XG4gICAgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuICB9IHtcbiAgICBsZXQgZW5jcnlwdGlvblR5cGUgPSBwcm9wcy5lbmNyeXB0aW9uO1xuICAgIGlmIChlbmNyeXB0aW9uVHlwZSAhPSBudWxsICYmIHByb3BzLnNlcnZlclNpZGVFbmNyeXB0aW9uICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiT25seSBvbmUgb2YgZW5jcnlwdGlvbiBhbmQgc2VydmVyU2lkZUVuY3J5cHRpb24gY2FuIGJlIHNwZWNpZmllZCwgYnV0IGJvdGggd2VyZSBwcm92aWRlZFwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLnNlcnZlclNpZGVFbmNyeXB0aW9uICYmIHByb3BzLmVuY3J5cHRpb25LZXkpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiZW5jcnlwdGlvbktleSBjYW5ub3QgYmUgc3BlY2lmaWVkIHdoZW4gc2VydmVyU2lkZUVuY3J5cHRpb24gaXMgc3BlY2lmaWVkLiBVc2UgZW5jcnlwdGlvbiBpbnN0ZWFkXCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChlbmNyeXB0aW9uVHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmNyeXB0aW9uVHlwZSA9XG4gICAgICAgIHByb3BzLmVuY3J5cHRpb25LZXkgIT0gbnVsbFxuICAgICAgICAgID8gVGFibGVFbmNyeXB0aW9uLkNVU1RPTUVSX01BTkFHRURcbiAgICAgICAgICA6IHByb3BzLnNlcnZlclNpZGVFbmNyeXB0aW9uXG4gICAgICAgICAgICA/IFRhYmxlRW5jcnlwdGlvbi5BV1NfTUFOQUdFRFxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZW5jcnlwdGlvblR5cGUgIT09IFRhYmxlRW5jcnlwdGlvbi5DVVNUT01FUl9NQU5BR0VEICYmXG4gICAgICBwcm9wcy5lbmNyeXB0aW9uS2V5XG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgZW5jcnlwdGlvbktleSBjYW5ub3QgYmUgc3BlY2lmaWVkIHVubGVzcyBlbmNyeXB0aW9uIGlzIHNldCB0byBUYWJsZUVuY3J5cHRpb24uQ1VTVE9NRVJfTUFOQUdFRCAoaXQgd2FzIHNldCB0byAke2VuY3J5cHRpb25UeXBlfSlgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBpbiB0aGlzIGNhc2UsIGVhY2ggcmVwbGljYSBzaG91bGQgc3BlY2lmeSBhIEN1c3RvbWVyIEtNUyBrZXkuXG4gICAgaWYgKFxuICAgICAgZW5jcnlwdGlvblR5cGUgPT09IFRhYmxlRW5jcnlwdGlvbi5DVVNUT01FUl9NQU5BR0VEICYmXG4gICAgICBwcm9wcy5yZXBsaWNhdGlvblJlZ2lvbnNcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiVGFibGVFbmNyeXB0aW9uLkNVU1RPTUVSX01BTkFHRUQgaXMgbm90IHN1cHBvcnRlZCBieSBEeW5hbW9EQiBHbG9iYWwgVGFibGVzICh3aGVyZSByZXBsaWNhdGlvblJlZ2lvbnMgd2FzIHNldClcIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgcHJvcHMucmVwbGljYVNwZWNpZmljYXRpb24gJiZcbiAgICAgIHByb3BzLnJlcGxpY2FTcGVjaWZpY2F0aW9uLmxlbmd0aCA+IDAgJiZcbiAgICAgIGVuY3J5cHRpb25UeXBlID09PSBUYWJsZUVuY3J5cHRpb24uQ1VTVE9NRVJfTUFOQUdFRFxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBwcm9wcy5yZXBsaWNhU3BlY2lmaWNhdGlvbi5zb21lKFxuICAgICAgICAgIChyZXBsaWNhKSA9PiAhcmVwbGljYS5lbmNyeXB0aW9uS2V5LCAvLyBDaGVjayBpZiBhbnkgcmVwbGljYSBpcyBtaXNzaW5nIGFuIGVuY3J5cHRpb24ga2V5XG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIFwiV2hlbiB1c2luZyByZXBsaWNhU3BlY2lmaWNhdGlvbiwgZWFjaCByZXBsaWNhIG11c3Qgc3BlY2lmeSBhbiBlbmNyeXB0aW9uS2V5IGlmIFRhYmxlRW5jcnlwdGlvbi5DVVNUT01FUl9NQU5BR0VEIGlzIHVzZWRcIixcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvL1ZhbGlkYXRlIHRoYXQgdGhlIGtleXMgYmVsb25nIHRvIHRoZSBjb3JyZWN0IHJlZ2lvbnNcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcHMucmVwbGljYVNwZWNpZmljYXRpb24uc29tZShcbiAgICAgICAgICAocmVwbGljYSkgPT5cbiAgICAgICAgICAgIHJlcGxpY2EuZW5jcnlwdGlvbktleSAmJlxuICAgICAgICAgICAgcmVwbGljYS5lbmNyeXB0aW9uS2V5LmVudi5yZWdpb24gIT09IHJlcGxpY2EucmVnaW9uTmFtZSxcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgXCJXaGVuIHVzaW5nIHJlcGxpY2FTcGVjaWZpY2F0aW9uLCBlYWNoIHJlcGxpY2EncyBlbmNyeXB0aW9uS2V5IG11c3QgYmUgaW4gdGhlIHNhbWUgcmVnaW9uIGFzIGl0cyByZXBsaWNhXCIsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKGVuY3J5cHRpb25UeXBlKSB7XG4gICAgICBjYXNlIFRhYmxlRW5jcnlwdGlvbi5DVVNUT01FUl9NQU5BR0VEOlxuICAgICAgICBjb25zdCBrZXkgPVxuICAgICAgICAgIHByb3BzLmVuY3J5cHRpb25LZXkgPz9cbiAgICAgICAgICBuZXcga21zLktleSh0aGlzLCBcIktleVwiLCB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYEN1c3RvbWVyLW1hbmFnZWQga2V5IGF1dG8tY3JlYXRlZCBmb3IgZW5jcnlwdGluZyBEeW5hbW9EQiB0YWJsZSBhdCAke3RoaXMubm9kZS5wYXRofWAsXG4gICAgICAgICAgICBlbmFibGVLZXlSb3RhdGlvbjogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzc2VTcGVjaWZpY2F0aW9uOiB7IGVuYWJsZWQ6IHRydWUsIGttc0tleUFybjoga2V5LmtleUFybiB9LFxuICAgICAgICAgIGVuY3J5cHRpb25LZXk6IGtleSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgVGFibGVFbmNyeXB0aW9uLkFXU19NQU5BR0VEOlxuICAgICAgICByZXR1cm4geyBzc2VTcGVjaWZpY2F0aW9uOiB7IGVuYWJsZWQ6IHRydWUgfSB9OyAvLyBVc2VzIGFsaWFzL2F3cy9keW5hbW9kYiBieSBkZWZhdWx0XG4gICAgICBjYXNlIFRhYmxlRW5jcnlwdGlvbi5ERUZBVUxUOlxuICAgICAgICByZXR1cm4geyBzc2VTcGVjaWZpY2F0aW9uOiB7IGVuYWJsZWQ6IGZhbHNlIH0gfTsgLy8gQVdTLW93bmVkIGtleVxuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiB7IHNzZVNwZWNpZmljYXRpb246IHVuZGVmaW5lZCB9OyAvLyBEZWZhdWx0cyB0byBBV1Mtb3duZWQga2V5XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGBVbmV4cGVjdGVkICdlbmNyeXB0aW9uVHlwZSc6ICR7ZW5jcnlwdGlvblR5cGV9YCxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVySW1wb3J0U291cmNlU3BlY2lmaWNhdGlvbihcbiAgICBpbXBvcnRTb3VyY2U/OiBJbXBvcnRTb3VyY2VTcGVjaWZpY2F0aW9uLFxuICApOiBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVJbXBvcnRUYWJsZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFpbXBvcnRTb3VyY2UpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVuZGVyZWRJbnB1dEZvcm1hdCA9IGltcG9ydFNvdXJjZS5pbnB1dEZvcm1hdC5fcmVuZGVyKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0Rm9ybWF0OiByZW5kZXJlZElucHV0Rm9ybWF0LmlucHV0Rm9ybWF0LFxuICAgICAgaW5wdXRGb3JtYXRPcHRpb25zOiByZW5kZXJlZElucHV0Rm9ybWF0LmlucHV0Rm9ybWF0T3B0aW9ucyxcbiAgICAgIGlucHV0Q29tcHJlc3Npb25UeXBlOiBpbXBvcnRTb3VyY2UuY29tcHJlc3Npb25UeXBlLFxuICAgICAgczNCdWNrZXRTb3VyY2U6IHtcbiAgICAgICAgYnVja2V0OiBpbXBvcnRTb3VyY2UuYnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICAgIGJ1Y2tldE93bmVyOiBpbXBvcnRTb3VyY2UuYnVja2V0T3duZXIsXG4gICAgICAgIGtleVByZWZpeDogaW1wb3J0U291cmNlLmtleVByZWZpeCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgU2NhbGFibGVBdHRyaWJ1dGVQYWlyIHtcbiAgc2NhbGFibGVSZWFkQXR0cmlidXRlPzogU2NhbGFibGVUYWJsZUF0dHJpYnV0ZTtcbiAgc2NhbGFibGVXcml0ZUF0dHJpYnV0ZT86IFNjYWxhYmxlVGFibGVBdHRyaWJ1dGU7XG59XG4iXX0=
|
|
1204
|
+
Table[_c] = { fqn: "terraconstructs.aws.storage.Table", version: "0.2.2" };
|
|
1205
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzL3N0b3JhZ2UvdGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4RkFBOEY7QUFFOUYsc0RBSzZCO0FBQzdCLGlDQUFvQztBQUdwQywwQkFBOEU7QUFDOUUsMkZBQXNFO0FBS3RFLHlFQUFvRTtBQUNwRSxxQ0FpQmtCO0FBQ2xCLG1EQUErQztBQUMvQyxpREFBNkM7QUFDN0MseUNBQXdFO0FBQ3hFLDRDQUE0QztBQUM1Qyx5Q0FBeUM7QUFDekMscUNBQXFDO0FBQ3JDLDhCQUE4QjtBQUc5QixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUM7QUFDN0IsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDO0FBRS9CLHdHQUF3RztBQUN4RyxNQUFNLCtCQUErQixHQUFHLENBQUMsQ0FBQztBQW1CMUM7O0dBRUc7QUFDSCxJQUFZLG9CQWVYO0FBZkQsV0FBWSxvQkFBb0I7SUFDOUI7O09BRUc7SUFDSCxxQ0FBYSxDQUFBO0lBRWI7O09BRUc7SUFDSCxxQ0FBYSxDQUFBO0lBRWI7O09BRUc7SUFDSCxxQ0FBYSxDQUFBO0FBQ2YsQ0FBQyxFQWZXLG9CQUFvQixvQ0FBcEIsb0JBQW9CLFFBZS9CO0FBZ0NEOztHQUVHO0FBQ0gsTUFBc0IsV0FBVztJQUMvQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxZQUFZO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLEtBQU0sU0FBUSxXQUFXO1lBQzVCLE9BQU87Z0JBSVosT0FBTztvQkFDTCxXQUFXLEVBQUUsZUFBZTtpQkFDN0IsQ0FBQztZQUNKLENBQUM7U0FDRixDQUFDLEVBQUUsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxHQUFHO1FBQ2YsT0FBTyxJQUFJLENBQUMsS0FBTSxTQUFRLFdBQVc7WUFDNUIsT0FBTztnQkFJWixPQUFPO29CQUNMLFdBQVcsRUFBRSxLQUFLO2lCQUNuQixDQUFDO1lBQ0os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LHFCQUFxQixFQUNyQjtvQkFDRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7b0JBQ3pCLFNBQVMsRUFBRSxHQUFHLENBQUMsSUFBSTtvQkFDbkIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxnQ0FBZ0MsRUFBRSxJQUFJO2lCQUNqRCxDQUNGLENBQUM7Z0JBQ0YsT0FBTyxHQUFHLENBQUMsZ0NBQWdDLENBQUM7WUFDOUMsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7O0FBaG1DSCxzQkFpbUNDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTg2LjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWR5bmFtb2RiL2xpYi90YWJsZS50c1xuXG5pbXBvcnQge1xuICBkeW5hbW9kYkNvbnRyaWJ1dG9ySW5zaWdodHMsXG4gIGR5bmFtb2RiS2luZXNpc1N0cmVhbWluZ0Rlc3RpbmF0aW9uLFxuICBkeW5hbW9kYlJlc291cmNlUG9saWN5LFxuICBkeW5hbW9kYlRhYmxlLFxufSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF3c1wiO1xuaW1wb3J0IHsgVG9rZW4sIExhenkgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgKiBhcyBzdG9yYWdlIGZyb20gXCIuXCI7XG5pbXBvcnQgeyBBcm5Gb3JtYXQsIEF3c0NvbnN0cnVjdEJhc2UsIEF3c0NvbnN0cnVjdFByb3BzLCBBd3NTdGFjayB9IGZyb20gXCIuLlwiO1xuaW1wb3J0IHsgRHluYW1vREJNZXRyaWNzIH0gZnJvbSBcIi4vZHluYW1vZGItY2FubmVkLW1ldHJpY3MuZ2VuZXJhdGVkXCI7XG5pbXBvcnQge1xuICBFbmFibGVTY2FsaW5nUHJvcHMsXG4gIElTY2FsYWJsZVRhYmxlQXR0cmlidXRlLFxufSBmcm9tIFwiLi9zY2FsYWJsZS1hdHRyaWJ1dGUtYXBpXCI7XG5pbXBvcnQgeyBTY2FsYWJsZVRhYmxlQXR0cmlidXRlIH0gZnJvbSBcIi4vc2NhbGFibGUtdGFibGUtYXR0cmlidXRlXCI7XG5pbXBvcnQge1xuICBPcGVyYXRpb24sXG4gIE9wZXJhdGlvbnNNZXRyaWNPcHRpb25zLFxuICBTeXN0ZW1FcnJvcnNGb3JPcGVyYXRpb25zTWV0cmljT3B0aW9ucyxcbiAgQXR0cmlidXRlLFxuICBCaWxsaW5nTW9kZSxcbiAgUHJvamVjdGlvblR5cGUsXG4gIElUYWJsZSxcbiAgU2Vjb25kYXJ5SW5kZXhQcm9wcyxcbiAgVGFibGVDbGFzcyxcbiAgTG9jYWxTZWNvbmRhcnlJbmRleFByb3BzLFxuICBUYWJsZUVuY3J5cHRpb24sXG4gIFN0cmVhbVZpZXdUeXBlLFxuICBQb2ludEluVGltZVJlY292ZXJ5U3BlY2lmaWNhdGlvbixcbiAgV2FybVRocm91Z2hwdXQsXG4gIENvbnRyaWJ1dG9ySW5zaWdodHNTcGVjaWZpY2F0aW9uLFxuICB2YWxpZGF0ZUNvbnRyaWJ1dG9ySW5zaWdodHMsXG59IGZyb20gXCIuL3NoYXJlZFwiO1xuaW1wb3J0IHsgU3RyZWFtR3JhbnRzIH0gZnJvbSBcIi4vc3RyZWFtLWdyYW50c1wiO1xuaW1wb3J0IHsgVGFibGVHcmFudHMgfSBmcm9tIFwiLi90YWJsZS1ncmFudHNcIjtcbmltcG9ydCB7IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3JzXCI7XG5pbXBvcnQgKiBhcyBjbG91ZHdhdGNoIGZyb20gXCIuLi9jbG91ZHdhdGNoXCI7XG5pbXBvcnQgKiBhcyBhcHBzY2FsaW5nIGZyb20gXCIuLi9jb21wdXRlXCI7XG5pbXBvcnQgKiBhcyBrbXMgZnJvbSBcIi4uL2VuY3J5cHRpb25cIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiLi4vaWFtXCI7XG5pbXBvcnQgKiBhcyBraW5lc2lzIGZyb20gXCIuLi9ub3RpZnlcIjtcblxuY29uc3QgSEFTSF9LRVlfVFlQRSA9IFwiSEFTSFwiO1xuY29uc3QgUkFOR0VfS0VZX1RZUEUgPSBcIlJBTkdFXCI7XG5cbi8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25keW5hbW9kYi9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvTGltaXRzLmh0bWwjbGltaXRzLXNlY29uZGFyeS1pbmRleGVzXG5jb25zdCBNQVhfTE9DQUxfU0VDT05EQVJZX0lOREVYX0NPVU5UID0gNTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSB0YWJsZSBzY2hlbWEgYXR0cmlidXRlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2hlbWFPcHRpb25zIHtcbiAgLyoqXG4gICAqIFBhcnRpdGlvbiBrZXkgYXR0cmlidXRlIGRlZmluaXRpb24uXG4gICAqL1xuICByZWFkb25seSBwYXJ0aXRpb25LZXk6IEF0dHJpYnV0ZTtcblxuICAvKipcbiAgICogU29ydCBrZXkgYXR0cmlidXRlIGRlZmluaXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IG5vIHNvcnQga2V5XG4gICAqL1xuICByZWFkb25seSBzb3J0S2V5PzogQXR0cmlidXRlO1xufVxuXG4vKipcbiAqIFR5cGUgb2YgY29tcHJlc3Npb24gdG8gdXNlIGZvciBpbXBvcnRlZCBkYXRhLlxuICovXG5leHBvcnQgZW51bSBJbnB1dENvbXByZXNzaW9uVHlwZSB7XG4gIC8qKlxuICAgKiBHWklQIGNvbXByZXNzaW9uLlxuICAgKi9cbiAgR1pJUCA9IFwiR1pJUFwiLFxuXG4gIC8qKlxuICAgKiBaU1REIGNvbXByZXNzaW9uLlxuICAgKi9cbiAgWlNURCA9IFwiWlNURFwiLFxuXG4gIC8qKlxuICAgKiBObyBjb21wcmVzc2lvbi5cbiAgICovXG4gIE5PTkUgPSBcIk5PTkVcIixcbn1cblxuLyoqXG4gKiBUaGUgb3B0aW9ucyBmb3IgaW1wb3J0ZWQgc291cmNlIGZpbGVzIGluIENTViBmb3JtYXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3N2T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgZGVsaW1pdGVyIHVzZWQgZm9yIHNlcGFyYXRpbmcgaXRlbXMgaW4gdGhlIENTViBmaWxlIGJlaW5nIGltcG9ydGVkLlxuICAgKlxuICAgKiBWYWxpZCBkZWxpbWl0ZXJzIGFyZSBhcyBmb2xsb3dzOlxuICAgKiAtIGNvbW1hIChgLGApXG4gICAqIC0gdGFiIChgXFx0YClcbiAgICogLSBjb2xvbiAoYDpgKVxuICAgKiAtIHNlbWljb2xvbiAoYDtgKVxuICAgKiAtIHBpcGUgKGB8YClcbiAgICogLSBzcGFjZSAoYCBgKVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVzZSBjb21tYSBhcyBhIGRlbGltaXRlci5cbiAgICovXG4gIHJlYWRvbmx5IGRlbGltaXRlcj86IHN0cmluZztcblxuICAvKipcbiAgICogTGlzdCBvZiB0aGUgaGVhZGVycyB1c2VkIHRvIHNwZWNpZnkgYSBjb21tb24gaGVhZGVyIGZvciBhbGwgc291cmNlIENTViBmaWxlcyBiZWluZyBpbXBvcnRlZC5cbiAgICpcbiAgICogKipOT1RFKio6IElmIHRoaXMgZmllbGQgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGxpbmUgb2YgZWFjaCBDU1YgZmlsZSBpcyB0cmVhdGVkIGFzIGRhdGEgaW5zdGVhZCBvZiB0aGUgaGVhZGVyLlxuICAgKiBJZiB0aGlzIGZpZWxkIGlzIG5vdCBzcGVjaWZpZWQgdGhlIHRoZSBmaXJzdCBsaW5lIG9mIGVhY2ggQ1NWIGZpbGUgaXMgdHJlYXRlZCBhcyB0aGUgaGVhZGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBDU1YgZmlsZSBpcyB0cmVhdGVkIGFzIHRoZSBoZWFkZXJcbiAgICovXG4gIHJlYWRvbmx5IGhlYWRlckxpc3Q/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgZm9ybWF0IG9mIHRoZSBzb3VyY2UgZGF0YS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIElucHV0Rm9ybWF0IHtcbiAgLyoqXG4gICAqIER5bmFtb0RCIEpTT04gZm9ybWF0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkeW5hbW9EQkpzb24oKTogSW5wdXRGb3JtYXQge1xuICAgIHJldHVybiBuZXcgKGNsYXNzIGV4dGVuZHMgSW5wdXRGb3JtYXQge1xuICAgICAgcHVibGljIF9yZW5kZXIoKTogUGljazxcbiAgICAgICAgZHluYW1vZGJUYWJsZS5EeW5hbW9kYlRhYmxlSW1wb3J0VGFibGUsXG4gICAgICAgIFwiaW5wdXRGb3JtYXRcIiB8IFwiaW5wdXRGb3JtYXRPcHRpb25zXCJcbiAgICAgID4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlucHV0Rm9ybWF0OiBcIkRZTkFNT0RCX0pTT05cIixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFtYXpvbiBJb24gZm9ybWF0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpb24oKTogSW5wdXRGb3JtYXQge1xuICAgIHJldHVybiBuZXcgKGNsYXNzIGV4dGVuZHMgSW5wdXRGb3JtYXQge1xuICAgICAgcHVibGljIF9yZW5kZXIoKTogUGljazxcbiAgICAgICAgZHluYW1vZGJUYWJsZS5EeW5hbW9kYlRhYmxlSW1wb3J0VGFibGUsXG4gICAgICAgIFwiaW5wdXRGb3JtYXRcIiB8IFwiaW5wdXRGb3JtYXRPcHRpb25zXCJcbiAgICAgID4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlucHV0Rm9ybWF0OiBcIklPTlwiLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pKCk7XG4gIH1cblxuICAvKipcbiAgICogQ1NWIGZvcm1hdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3N2KG9wdGlvbnM/OiBDc3ZPcHRpb25zKTogSW5wdXRGb3JtYXQge1xuICAgIC8vIFdlIGFyZSB1c2luZyB0aGUgLmxlbmd0aCBwcm9wZXJ0eSB0byBjaGVjayB0aGUgbGVuZ3RoIG9mIHRoZSBkZWxpbWl0ZXIuXG4gICAgLy8gTm90ZSB0aGF0IC5sZW5ndGggbWF5IG5vdCByZXR1cm4gdGhlIGV4cGVjdGVkIHJlc3VsdCBmb3IgbXVsdGktY29kZXBvaW50IGNoYXJhY3RlcnMgbGlrZSBmdWxsLXdpZHRoIGNoYXJhY3RlcnMgb3IgZW1vamlzLFxuICAgIC8vIGJ1dCBzdWNoIGNoYXJhY3RlcnMgYXJlIG5vdCBleHBlY3RlZCB0byBiZSB1c2VkIGFzIGRlbGltaXRlcnMgaW4gdGhpcyBjb250ZXh0LlxuICAgIGlmIChcbiAgICAgIG9wdGlvbnM/LmRlbGltaXRlciAmJlxuICAgICAgKCF0aGlzLnZhbGlkQ3N2RGVsaW1pdGVycy5pbmNsdWRlcyhvcHRpb25zLmRlbGltaXRlcikgfHxcbiAgICAgICAgb3B0aW9ucy5kZWxpbWl0ZXIubGVuZ3RoICE9PSAxKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBbXG4gICAgICAgICAgXCJEZWxpbWl0ZXIgbXVzdCBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIgYW5kIG9uZSBvZiB0aGUgZm9sbG93aW5nOlwiLFxuICAgICAgICAgIGAke3RoaXMucmVhZGFibGVWYWxpZENzdkRlbGltaXRlcnMuam9pbihcIiwgXCIpfSxgLFxuICAgICAgICAgIGBnb3QgJyR7b3B0aW9ucy5kZWxpbWl0ZXJ9J2AsXG4gICAgICAgIF0uam9pbihcIiBcIiksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKGNsYXNzIGV4dGVuZHMgSW5wdXRGb3JtYXQge1xuICAgICAgcHVibGljIF9yZW5kZXIoKTogUGljazxcbiAgICAgICAgZHluYW1vZGJUYWJsZS5EeW5hbW9kYlRhYmxlSW1wb3J0VGFibGUsXG4gICAgICAgIFwiaW5wdXRGb3JtYXRcIiB8IFwiaW5wdXRGb3JtYXRPcHRpb25zXCJcbiAgICAgID4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlucHV0Rm9ybWF0OiBcIkNTVlwiLFxuICAgICAgICAgIGlucHV0Rm9ybWF0T3B0aW9uczogb3B0aW9uc1xuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgY3N2OiB7XG4gICAgICAgICAgICAgICAgICBkZWxpbWl0ZXI6IG9wdGlvbnM/LmRlbGltaXRlcixcbiAgICAgICAgICAgICAgICAgIGhlYWRlckxpc3Q6IG9wdGlvbnM/LmhlYWRlckxpc3QsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZCBDU1YgZGVsaW1pdGVycy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1keW5hbW9kYi10YWJsZS1jc3YuaHRtbCNjZm4tZHluYW1vZGItdGFibGUtY3N2LWRlbGltaXRlclxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgdmFsaWRDc3ZEZWxpbWl0ZXJzID0gW1wiLFwiLCBcIlxcdFwiLCBcIjpcIiwgXCI7XCIsIFwifFwiLCBcIiBcIl07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZGFibGVWYWxpZENzdkRlbGltaXRlcnMgPSBbXG4gICAgXCJjb21tYSAoLClcIixcbiAgICBcInRhYiAoXFxcXHQpXCIsXG4gICAgXCJjb2xvbiAoOilcIixcbiAgICBcInNlbWljb2xvbiAoOylcIixcbiAgICBcInBpcGUgKHwpXCIsXG4gICAgXCJzcGFjZSAoIClcIixcbiAgXTtcblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBpbnB1dCBmb3JtYXQgYW5kIG9wdGlvbnMuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IF9yZW5kZXIoKTogUGljazxcbiAgICBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVJbXBvcnRUYWJsZSxcbiAgICBcImlucHV0Rm9ybWF0XCIgfCBcImlucHV0Rm9ybWF0T3B0aW9uc1wiXG4gID47XG59XG5cbi8qKlxuICogIFByb3BlcnRpZXMgZm9yIGltcG9ydGluZyBkYXRhIGZyb20gdGhlIFMzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltcG9ydFNvdXJjZVNwZWNpZmljYXRpb24ge1xuICAvKipcbiAgICogVGhlIGNvbXByZXNzaW9uIHR5cGUgb2YgdGhlIGltcG9ydGVkIGRhdGEuXG4gICAqXG4gICAqIEBkZWZhdWx0IElucHV0Q29tcHJlc3Npb25UeXBlLk5PTkVcbiAgICovXG4gIHJlYWRvbmx5IGNvbXByZXNzaW9uVHlwZT86IElucHV0Q29tcHJlc3Npb25UeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0IG9mIHRoZSBpbXBvcnRlZCBkYXRhLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRGb3JtYXQ6IElucHV0Rm9ybWF0O1xuXG4gIC8qKlxuICAgKiBUaGUgUzMgYnVja2V0IHRoYXQgaXMgYmVpbmcgaW1wb3J0ZWQgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldDogc3RvcmFnZS5JQnVja2V0O1xuXG4gIC8qKlxuICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIFMzIGJ1Y2tldCB0aGF0IGlzIGJlaW5nIGltcG9ydGVkIGZyb20uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldE93bmVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUga2V5IHByZWZpeCBzaGFyZWQgYnkgYWxsIFMzIE9iamVjdHMgdGhhdCBhcmUgYmVpbmcgaW1wb3J0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IGtleVByZWZpeD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcHJlY2lzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgRHluYW1vREIgd3JpdGUgdGltZXN0YW1wcyB0aGF0IHdpbGwgYmUgcmVwbGljYXRlZCB0byBLaW5lc2lzLlxuICogVGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgcmVjb3JkIHRpbWVzdGFtcCBwcmVjaXNpb24gaXMgbWljcm9zZWNvbmRzLiBZb3UgY2FuIGNoYW5nZSB0aGlzIHNldHRpbmcgYXQgYW55IHRpbWUuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWR5bmFtb2RiLXRhYmxlLWtpbmVzaXNzdHJlYW1zcGVjaWZpY2F0aW9uLmh0bWwjYXdzLXByb3BlcnRpZXMtZHluYW1vZGItdGFibGUta2luZXNpc3N0cmVhbXNwZWNpZmljYXRpb24tcHJvcGVydGllc1xuICovXG5leHBvcnQgZW51bSBBcHByb3hpbWF0ZUNyZWF0aW9uRGF0ZVRpbWVQcmVjaXNpb24ge1xuICAvKipcbiAgICogTWlsbGlzZWNvbmQgcHJlY2lzaW9uXG4gICAqL1xuICBNSUxMSVNFQ09ORCA9IFwiTUlMTElTRUNPTkRcIixcblxuICAvKipcbiAgICogTWljcm9zZWNvbmQgcHJlY2lzaW9uXG4gICAqL1xuICBNSUNST1NFQ09ORCA9IFwiTUlDUk9TRUNPTkRcIixcbn1cblxuLyoqXG4gKiBDb21tb24gaW50ZXJmYWNlIGZvciB0eXBlcyB0aGF0IGNhbiBjb25maWd1cmUgY29udHJpYnV0b3IgaW5zaWdodHNcbiAqIEBpbnRlcm5hbFxuICovXG5pbnRlcmZhY2UgSUNvbnRyaWJ1dG9ySW5zaWdodHNDb25maWd1cmFibGUge1xuICAvKipcbiAgICogV2hldGhlciBDbG91ZFdhdGNoIGNvbnRyaWJ1dG9yIGluc2lnaHRzIGlzIGVuYWJsZWQuXG4gICAqIEBkZXByZWNhdGVkIHVzZSBgY29udHJpYnV0b3JJbnNpZ2h0c1NwZWNpZmljYXRpb25gIGluc3RlYWRcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRyaWJ1dG9ySW5zaWdodHNFbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBDbG91ZFdhdGNoIGNvbnRyaWJ1dG9yIGluc2lnaHRzIGlzIGVuYWJsZWQgYW5kIHdoYXQgbW9kZSBpcyBzZWxlY3RlZFxuICAgKi9cbiAgcmVhZG9ubHkgY29udHJpYnV0b3JJbnNpZ2h0c1NwZWNpZmljYXRpb24/OiBDb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEeW5hbW9kYlRhYmxlUmVwbGljYSB7XG4gIC8qKiAoT3B0aW9uYWwpIEFSTiBvZiB0aGUgQ01LIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBBV1MgS01TIGVuY3J5cHRpb24uIFRoaXMgYXJndW1lbnQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB0aGUga2V5IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0IEtNUy1tYW5hZ2VkIER5bmFtb0RCIGtleSwgYGFsaWFzL2F3cy9keW5hbW9kYmAuICoqTm90ZToqKiBUaGlzIGF0dHJpYnV0ZSB3aWxsIF9ub3RfIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBBUk4gb2YgX2RlZmF1bHRfIGtleXMuICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcbiAgLyoqIChPcHRpb25hbCkgV2hldGhlciB0byBlbmFibGUgUG9pbnQgSW4gVGltZSBSZWNvdmVyeSBmb3IgdGhlIHJlcGxpY2EuIERlZmF1bHQgaXMgYGZhbHNlYC4gKi9cbiAgcmVhZG9ubHkgcG9pbnRJblRpbWVSZWNvdmVyeT86IGJvb2xlYW47XG4gIC8qKiAoT3B0aW9uYWwpIFdoZXRoZXIgdG8gcHJvcGFnYXRlIHRoZSBnbG9iYWwgdGFibGUncyB0YWdzIHRvIGEgcmVwbGljYS4gRGVmYXVsdCBpcyBgZmFsc2VgLiBDaGFuZ2VzIHRvIHRhZ3Mgb25seSBtb3ZlIGluIG9uZSBkaXJlY3Rpb246IGZyb20gZ2xvYmFsIChzb3VyY2UpIHRvIHJlcGxpY2EuIEluIG90aGVyIHdvcmRzLCB0YWcgZHJpZnQgb24gYSByZXBsaWNhIHdpbGwgbm90IHRyaWdnZXIgYW4gdXBkYXRlLiBUYWcgb3IgcmVwbGljYSBjaGFuZ2VzIG9uIHRoZSBnbG9iYWwgdGFibGUsIHdoZXRoZXIgZnJvbSBkcmlmdCBvciBjb25maWd1cmF0aW9uIGNoYW5nZXMsIGFyZSBwcm9wYWdhdGVkIHRvIHJlcGxpY2FzLiBDaGFuZ2luZyBmcm9tIGB0cnVlYCB0byBgZmFsc2VgIG9uIGEgc3Vic2VxdWVudCBgYXBwbHlgIG1lYW5zIHJlcGxpY2EgdGFncyBhcmUgbGVmdCBhcyB0aGV5IHdlcmUsIHVubWFuYWdlZCwgbm90IGRlbGV0ZWQuICovXG4gIHJlYWRvbmx5IHByb3BhZ2F0ZVRhZ3M/OiBib29sZWFuO1xuICAvKiogKFJlcXVpcmVkKSBSZWdpb24gbmFtZSBvZiB0aGUgcmVwbGljYS4gKi9cbiAgcmVhZG9ubHkgcmVnaW9uTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgb2YgYSBEeW5hbW9EQiBUYWJsZVxuICpcbiAqIFVzZSBgVGFibGVQcm9wc2AgZm9yIGFsbCB0YWJsZSBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVPcHRpb25zIGV4dGVuZHMgU2NoZW1hT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgcmVhZCBjYXBhY2l0eSBmb3IgdGhlIHRhYmxlLiBDYXJlZnVsIGlmIHlvdSBhZGQgR2xvYmFsIFNlY29uZGFyeSBJbmRleGVzLCBhc1xuICAgKiB0aG9zZSB3aWxsIHNoYXJlIHRoZSB0YWJsZSdzIHByb3Zpc2lvbmVkIHRocm91Z2hwdXQuXG4gICAqXG4gICAqIENhbiBvbmx5IGJlIHByb3ZpZGVkIGlmIGJpbGxpbmdNb2RlIGlzIFByb3Zpc2lvbmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCA1XG4gICAqL1xuICByZWFkb25seSByZWFkQ2FwYWNpdHk/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgd3JpdGUgY2FwYWNpdHkgZm9yIHRoZSB0YWJsZS4gQ2FyZWZ1bCBpZiB5b3UgYWRkIEdsb2JhbCBTZWNvbmRhcnkgSW5kZXhlcywgYXNcbiAgICogdGhvc2Ugd2lsbCBzaGFyZSB0aGUgdGFibGUncyBwcm92aXNpb25lZCB0aHJvdWdocHV0LlxuICAgKlxuICAgKiBDYW4gb25seSBiZSBwcm92aWRlZCBpZiBiaWxsaW5nTW9kZSBpcyBQcm92aXNpb25lZC5cbiAgICpcbiAgICogQGRlZmF1bHQgNVxuICAgKi9cbiAgcmVhZG9ubHkgd3JpdGVDYXBhY2l0eT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gcmVhZCByZXF1ZXN0IHVuaXRzIGZvciB0aGUgdGFibGUuIENhcmVmdWwgaWYgeW91IGFkZCBHbG9iYWwgU2Vjb25kYXJ5IEluZGV4ZXMsIGFzXG4gICAqIHRob3NlIHdpbGwgc2hhcmUgdGhlIHRhYmxlJ3MgbWF4aW11bSBvbi1kZW1hbmQgdGhyb3VnaHB1dC5cbiAgICpcbiAgICogQ2FuIG9ubHkgYmUgcHJvdmlkZWQgaWYgYmlsbGluZ01vZGUgaXMgUEFZX1BFUl9SRVFVRVNULlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG9uLWRlbWFuZCB0aHJvdWdocHV0IGlzIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSBtYXhSZWFkUmVxdWVzdFVuaXRzPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHdyaXRlIHJlcXVlc3QgdW5pdHMgZm9yIHRoZSB0YWJsZS4gQ2FyZWZ1bCBpZiB5b3UgYWRkIEdsb2JhbCBTZWNvbmRhcnkgSW5kZXhlcywgYXNcbiAgICogdGhvc2Ugd2lsbCBzaGFyZSB0aGUgdGFibGUncyBtYXhpbXVtIG9uLWRlbWFuZCB0aHJvdWdocHV0LlxuICAgKlxuICAgKiBDYW4gb25seSBiZSBwcm92aWRlZCBpZiBiaWxsaW5nTW9kZSBpcyBQQVlfUEVSX1JFUVVFU1QuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gb24tZGVtYW5kIHRocm91Z2hwdXQgaXMgZGlzYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IG1heFdyaXRlUmVxdWVzdFVuaXRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGhvdyB5b3UgYXJlIGNoYXJnZWQgZm9yIHJlYWQgYW5kIHdyaXRlIHRocm91Z2hwdXQgYW5kIGhvdyB5b3UgbWFuYWdlIGNhcGFjaXR5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBQUk9WSVNJT05FRCBpZiBgcmVwbGljYXRpb25SZWdpb25zYCBpcyBub3Qgc3BlY2lmaWVkLCBQQVlfUEVSX1JFUVVFU1Qgb3RoZXJ3aXNlXG4gICAqL1xuICByZWFkb25seSBiaWxsaW5nTW9kZT86IEJpbGxpbmdNb2RlO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHZhbHVlcyB0byBwcmUtd2FybSB5b3UgRHluYW1vREIgVGFibGVcbiAgICogV2FybSBUaHJvdWdocHV0IGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSBmb3IgR2xvYmFsIFRhYmxlIHJlcGxpY2FzIHVzaW5nIHRoZSBgVGFibGVgIGNvbnN0cnVjdC4gVG8gZW5hYmxlIFdhcm0gVGhyb3VnaHB1dCwgdXNlIHRoZSBgVGFibGVWMmAgY29uc3RydWN0IGluc3RlYWQuXG4gICAqIEBzZWUgaHR0cDovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtZHluYW1vZGItdGFibGUuaHRtbCNjZm4tZHluYW1vZGItdGFibGUtd2FybXRocm91Z2hwdXRcbiAgICogQGRlZmF1bHQgLSB3YXJtIHRocm91Z2hwdXQgaXMgbm90IGNvbmZpZ3VyZWRcbiAgICovXG4gIHJlYWRvbmx5IHdhcm1UaHJvdWdocHV0PzogV2FybVRocm91Z2hwdXQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgcG9pbnQtaW4tdGltZSByZWNvdmVyeSBpcyBlbmFibGVkLlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYHBvaW50SW5UaW1lUmVjb3ZlcnlTcGVjaWZpY2F0aW9uYCBpbnN0ZWFkXG4gICAqIEBkZWZhdWx0IGZhbHNlIC0gcG9pbnQgaW4gdGltZSByZWNvdmVyeSBpcyBub3QgZW5hYmxlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBvaW50SW5UaW1lUmVjb3Zlcnk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHBvaW50LWluLXRpbWUgcmVjb3ZlcnkgaXMgZW5hYmxlZFxuICAgKiBhbmQgcmVjb3ZlcnlQZXJpb2RJbkRheXMgaXMgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHBvaW50IGluIHRpbWUgcmVjb3ZlcnkgaXMgbm90IGVuYWJsZWQuXG4gICAqL1xuICByZWFkb25seSBwb2ludEluVGltZVJlY292ZXJ5U3BlY2lmaWNhdGlvbj86IFBvaW50SW5UaW1lUmVjb3ZlcnlTcGVjaWZpY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gd2l0aCBhbiBBV1MgbWFuYWdlZCBjdXN0b21lciBtYXN0ZXIga2V5IGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgY2Fubm90IGJlIHNldCBpZiBgZW5jcnlwdGlvbmAgYW5kL29yIGBlbmNyeXB0aW9uS2V5YCBpcyBzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhlIHRhYmxlIGlzIGVuY3J5cHRlZCB3aXRoIGFuIGVuY3J5cHRpb24ga2V5IG1hbmFnZWQgYnkgRHluYW1vREIsIGFuZCB5b3UgYXJlIG5vdCBjaGFyZ2VkIGFueSBmZWUgZm9yIHVzaW5nIGl0LlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBUaGlzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQuIEluIG9yZGVyIHRvIG9idGFpbiB0aGUgc2FtZSBiZWhhdmlvciBhc1xuICAgKiBlbmFibGluZyB0aGlzLCBzZXQgdGhlIGBlbmNyeXB0aW9uYCBwcm9wZXJ0eSB0byBgVGFibGVFbmNyeXB0aW9uLkFXU19NQU5BR0VEYCBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmVyU2lkZUVuY3J5cHRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHRoZSB0YWJsZSBjbGFzcy5cbiAgICogQGRlZmF1bHQgU1RBTkRBUkRcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlQ2xhc3M/OiBUYWJsZUNsYXNzO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gd2l0aCBhbiBBV1MgbWFuYWdlZCBjdXN0b21lciBtYXN0ZXIga2V5IGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgY2Fubm90IGJlIHNldCBpZiBgc2VydmVyU2lkZUVuY3J5cHRpb25gIGlzIHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgdGFibGUgaXMgZW5jcnlwdGVkIHdpdGggYW4gZW5jcnlwdGlvbiBrZXkgbWFuYWdlZCBieSBEeW5hbW9EQiwgYW5kIHlvdSBhcmUgbm90IGNoYXJnZWQgYW55IGZlZSBmb3IgdXNpbmcgaXQuXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uPzogVGFibGVFbmNyeXB0aW9uO1xuXG4gIC8qKlxuICAgKiBFeHRlcm5hbCBLTVMga2V5IHRvIHVzZSBmb3IgdGFibGUgZW5jcnlwdGlvbi5cbiAgICpcbiAgICogVGhpcyBwcm9wZXJ0eSBjYW4gb25seSBiZSBzZXQgaWYgYGVuY3J5cHRpb25gIGlzIHNldCB0byBgVGFibGVFbmNyeXB0aW9uLkNVU1RPTUVSX01BTkFHRURgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIGBlbmNyeXB0aW9uYCBpcyBzZXQgdG8gYFRhYmxlRW5jcnlwdGlvbi5DVVNUT01FUl9NQU5BR0VEYCBhbmQgdGhpc1xuICAgKiBwcm9wZXJ0eSBpcyB1bmRlZmluZWQsIGEgbmV3IEtNUyBrZXkgd2lsbCBiZSBjcmVhdGVkIGFuZCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YWJsZS5cbiAgICogSWYgYGVuY3J5cHRpb25gIGFuZCB0aGlzIHByb3BlcnR5IGFyZSBib3RoIHVuZGVmaW5lZCwgdGhlbiB0aGUgdGFibGUgaXMgZW5jcnlwdGVkIHdpdGhcbiAgICogYW4gZW5jcnlwdGlvbiBrZXkgbWFuYWdlZCBieSBEeW5hbW9EQiwgYW5kIHlvdSBhcmUgbm90IGNoYXJnZWQgYW55IGZlZSBmb3IgdXNpbmcgaXQuXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIFRUTCBhdHRyaWJ1dGUuXG4gICAqIEBkZWZhdWx0IC0gVFRMIGlzIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSB0aW1lVG9MaXZlQXR0cmlidXRlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVuIGFuIGl0ZW0gaW4gdGhlIHRhYmxlIGlzIG1vZGlmaWVkLCBTdHJlYW1WaWV3VHlwZSBkZXRlcm1pbmVzIHdoYXQgaW5mb3JtYXRpb25cbiAgICogaXMgd3JpdHRlbiB0byB0aGUgc3RyZWFtIGZvciB0aGlzIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHN0cmVhbXMgYXJlIGRpc2FibGVkIHVubGVzcyBgcmVwbGljYXRpb25SZWdpb25zYCBpcyBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHN0cmVhbT86IFN0cmVhbVZpZXdUeXBlO1xuXG4gIC8qKlxuICAgKiBSZWdpb25zIHdoZXJlIHJlcGxpY2EgdGFibGVzIHdpbGwgYmUgY3JlYXRlZFxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgcmVwbGljYVNwZWNpZmljYXRpb24gaW5zdGVhZFxuICAgKiBAZGVmYXVsdCAtIG5vIHJlcGxpY2EgdGFibGVzIGFyZSBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSByZXBsaWNhdGlvblJlZ2lvbnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIHNwZWNpZmljYXRpb24gZm9yIHJlcGxpY2EgdGFibGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwbGljYVNwZWNpZmljYXRpb24/OiBEeW5hbW9kYlRhYmxlUmVwbGljYVtdO1xuXG4gIC8vIHJlYWRvbmx5IHJlcGxpY2F0aW9uVGltZW91dD86IER1cmF0aW9uOyAvLyBOb3QgZGlyZWN0bHkgYXBwbGljYWJsZSB0byBURidzIHJlcGxpY2EgYmxvY2sgY29uZmlndXJhdGlvblxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIENsb3VkV2F0Y2ggY29udHJpYnV0b3IgaW5zaWdodHMgaXMgZW5hYmxlZC5cbiAgICogQGRlcHJlY2F0ZWQgdXNlIGBjb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbiBpbnN0ZWFkXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBjb250cmlidXRvckluc2lnaHRzRW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgQ2xvdWRXYXRjaCBjb250cmlidXRvciBpbnNpZ2h0cyBpcyBlbmFibGVkIGFuZCB3aGF0IG1vZGUgaXMgc2VsZWN0ZWRcbiAgICogQGRlZmF1bHQgLSBjb250cmlidXRvciBpbnNpZ2h0cyBpcyBub3QgZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgY29udHJpYnV0b3JJbnNpZ2h0c1NwZWNpZmljYXRpb24/OiBDb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBkZWxldGlvbiBwcm90ZWN0aW9uIGZvciB0aGUgdGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBkZWxldGlvblByb3RlY3Rpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyBvZiBkYXRhIGJlaW5nIGltcG9ydGVkIGZyb20gdGhlIFMzIGJ1Y2tldCBzb3VyY2UgdG8gdGhlIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGRhdGEgaW1wb3J0IGZyb20gdGhlIFMzIGJ1Y2tldFxuICAgKi9cbiAgcmVhZG9ubHkgaW1wb3J0U291cmNlPzogSW1wb3J0U291cmNlU3BlY2lmaWNhdGlvbjtcblxuICAvKipcbiAgICogUmVzb3VyY2UgcG9saWN5IHRvIGFzc2lnbiB0byB0YWJsZS5cbiAgICogTm90ZTogYGF3c19keW5hbW9kYl90YWJsZWAgZG9lcyBub3QgZGlyZWN0bHkgc3VwcG9ydCBhIHJlc291cmNlIHBvbGljeSBwcm9wZXJ0eS5cbiAgICogVGhpcyBwb2xpY3kgd291bGQgbmVlZCB0byBiZSBtYW5hZ2VkIGFuZCBhcHBsaWVkIHNlcGFyYXRlbHksIGUuZy4sIHZpYSBgYXdzX2lhbV9wb2xpY3lgIGF0dGFjaGVkIHRvIHByaW5jaXBhbHMuXG4gICAqIEBkZWZhdWx0IC0gTm8gcmVzb3VyY2UgcG9saWN5IHN0YXRlbWVudFxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VQb2xpY3k/OiBpYW0uUG9saWN5RG9jdW1lbnQ7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYSBEeW5hbW9EQiBUYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlUHJvcHMgZXh0ZW5kcyBUYWJsZU9wdGlvbnMsIEF3c0NvbnN0cnVjdFByb3BzIHtcbiAgLyoqXG4gICAqIEVuZm9yY2VzIGEgcGFydGljdWxhciBwaHlzaWNhbCB0YWJsZSBuYW1lLlxuICAgKiBAZGVmYXVsdCA8Z2VuZXJhdGVkPlxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLaW5lc2lzIERhdGEgU3RyZWFtIHRvIGNhcHR1cmUgaXRlbS1sZXZlbCBjaGFuZ2VzIGZvciB0aGUgdGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gS2luZXNpcyBEYXRhIFN0cmVhbVxuICAgKi9cbiAgcmVhZG9ubHkga2luZXNpc1N0cmVhbT86IGtpbmVzaXMuSVN0cmVhbTtcblxuICAvKipcbiAgICogS2luZXNpcyBEYXRhIFN0cmVhbSBhcHByb3hpbWF0ZSBjcmVhdGlvbiB0aW1lc3RhbXAgcHJlY2lzaW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IEFwcHJveGltYXRlQ3JlYXRpb25EYXRlVGltZVByZWNpc2lvbi5NSUNST1NFQ09ORFxuICAgKi9cbiAgcmVhZG9ubHkga2luZXNpc1ByZWNpc2lvblRpbWVzdGFtcD86IEFwcHJveGltYXRlQ3JlYXRpb25EYXRlVGltZVByZWNpc2lvbjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIGdsb2JhbCBzZWNvbmRhcnkgaW5kZXhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHbG9iYWxTZWNvbmRhcnlJbmRleFByb3BzXG4gIGV4dGVuZHMgU2Vjb25kYXJ5SW5kZXhQcm9wcyxcbiAgICBTY2hlbWFPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSByZWFkIGNhcGFjaXR5IGZvciB0aGUgZ2xvYmFsIHNlY29uZGFyeSBpbmRleC5cbiAgICpcbiAgICogQ2FuIG9ubHkgYmUgcHJvdmlkZWQgaWYgdGFibGUgYmlsbGluZ01vZGUgaXMgUHJvdmlzaW9uZWQgb3IgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCA1XG4gICAqL1xuICByZWFkb25seSByZWFkQ2FwYWNpdHk/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB3cml0ZSBjYXBhY2l0eSBmb3IgdGhlIGdsb2JhbCBzZWNvbmRhcnkgaW5kZXguXG4gICAqXG4gICAqIENhbiBvbmx5IGJlIHByb3ZpZGVkIGlmIHRhYmxlIGJpbGxpbmdNb2RlIGlzIFByb3Zpc2lvbmVkIG9yIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQGRlZmF1bHQgNVxuICAgKi9cbiAgcmVhZG9ubHkgd3JpdGVDYXBhY2l0eT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gcmVhZCByZXF1ZXN0IHVuaXRzIGZvciB0aGUgZ2xvYmFsIHNlY29uZGFyeSBpbmRleC5cbiAgICpcbiAgICogQ2FuIG9ubHkgYmUgcHJvdmlkZWQgaWYgdGFibGUgYmlsbGluZ01vZGUgaXMgUEFZX1BFUl9SRVFVRVNULlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG9uLWRlbWFuZCB0aHJvdWdocHV0IGlzIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSBtYXhSZWFkUmVxdWVzdFVuaXRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB3cml0ZSByZXF1ZXN0IHVuaXRzIGZvciB0aGUgZ2xvYmFsIHNlY29uZGFyeSBpbmRleC5cbiAgICpcbiAgICogQ2FuIG9ubHkgYmUgcHJvdmlkZWQgaWYgdGFibGUgYmlsbGluZ01vZGUgaXMgUEFZX1BFUl9SRVFVRVNULlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG9uLWRlbWFuZCB0aHJvdWdocHV0IGlzIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSBtYXhXcml0ZVJlcXVlc3RVbml0cz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHdhcm0gdGhyb3VnaHB1dCBjb25maWd1cmF0aW9uIGZvciB0aGUgZ2xvYmFsIHNlY29uZGFyeSBpbmRleC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyB3YXJtIHRocm91Z2hwdXQgaXMgY29uZmlndXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgd2FybVRocm91Z2hwdXQ/OiBXYXJtVGhyb3VnaHB1dDtcblxuICAvKipcbiAgICogV2hldGhlciBDbG91ZFdhdGNoIGNvbnRyaWJ1dG9yIGluc2lnaHRzIGlzIGVuYWJsZWQgYW5kIHdoYXQgbW9kZSBpcyBzZWxlY3RlZFxuICAgKiBAZGVmYXVsdCAtIGNvbnRyaWJ1dG9yIGluc2lnaHRzIGlzIG5vdCBlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBjb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbj86IENvbnRyaWJ1dG9ySW5zaWdodHNTcGVjaWZpY2F0aW9uO1xufVxuXG4vKipcbiAqIFJlZmVyZW5jZSB0byBhIGR5bmFtb2RiIHRhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBkeW5hbW9kYiB0YWJsZS5cbiAgICogT25lIG9mIHRoaXMsIG9yIGB0YWJsZU5hbWVgLCBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyB0YWJsZSBhcm5cbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFibGUgbmFtZSBvZiB0aGUgZHluYW1vZGIgdGFibGUuXG4gICAqIE9uZSBvZiB0aGlzLCBvciBgdGFibGVBcm5gLCBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyB0YWJsZSBuYW1lXG4gICAqL1xuICByZWFkb25seSB0YWJsZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIHRhYmxlJ3Mgc3RyZWFtLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHRhYmxlIHN0cmVhbVxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVTdHJlYW1Bcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEtNUyBlbmNyeXB0aW9uIGtleSwgaWYgdGhpcyB0YWJsZSB1c2VzIGEgY3VzdG9tZXItbWFuYWdlZCBlbmNyeXB0aW9uIGtleS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBrZXlcbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGdsb2JhbCBpbmRleGVzIHNldCBmb3IgdGhpcyBUYWJsZS5cbiAgICogTm90ZSB0aGF0IHlvdSBuZWVkIHRvIHNldCBlaXRoZXIgdGhpcyBwcm9wZXJ0eSxcbiAgICogb3IgYGxvY2FsSW5kZXhlc2AsXG4gICAqIGlmIHlvdSB3YW50IG1ldGhvZHMgbGlrZSBncmFudFJlYWREYXRhKClcbiAgICogdG8gZ3JhbnQgcGVybWlzc2lvbnMgZm9yIGluZGV4ZXMgYXMgd2VsbCBhcyB0aGUgdGFibGUgaXRzZWxmLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGdsb2JhbCBpbmRleGVzXG4gICAqL1xuICByZWFkb25seSBnbG9iYWxJbmRleGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBsb2NhbCBpbmRleGVzIHNldCBmb3IgdGhpcyBUYWJsZS5cbiAgICogTm90ZSB0aGF0IHlvdSBuZWVkIHRvIHNldCBlaXRoZXIgdGhpcyBwcm9wZXJ0eSxcbiAgICogb3IgYGdsb2JhbEluZGV4ZXNgLFxuICAgKiBpZiB5b3Ugd2FudCBtZXRob2RzIGxpa2UgZ3JhbnRSZWFkRGF0YSgpXG4gICAqIHRvIGdyYW50IHBlcm1pc3Npb25zIGZvciBpbmRleGVzIGFzIHdlbGwgYXMgdGhlIHRhYmxlIGl0c2VsZi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBsb2NhbCBpbmRleGVzXG4gICAqL1xuICByZWFkb25seSBsb2NhbEluZGV4ZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogSWYgc2V0IHRvIHRydWUsIGdyYW50IG1ldGhvZHMgYWx3YXlzIGdyYW50IHBlcm1pc3Npb25zIGZvciBhbGwgaW5kZXhlcy5cbiAgICogSWYgZmFsc2UgaXMgcHJvdmlkZWQsIGdyYW50IG1ldGhvZHMgZ3JhbnQgdGhlIHBlcm1pc3Npb25zXG4gICAqIG9ubHkgd2hlbiBgZ2xvYmFsSW5kZXhlc2Agb3IgYGxvY2FsSW5kZXhlc2AgaXMgc3BlY2lmaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZhbHNlXG4gICAqL1xuICByZWFkb25seSBncmFudEluZGV4UGVybWlzc2lvbnM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGFibGVCYXNlXG4gIGV4dGVuZHMgQXdzQ29uc3RydWN0QmFzZVxuICBpbXBsZW1lbnRzIElUYWJsZSwgaWFtLklBd3NDb25zdHJ1Y3RXaXRoUG9saWN5XG57XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB0YWJsZUFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgdGFibGVOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB0YWJsZVN0cmVhbUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogS01TIGVuY3J5cHRpb24ga2V5LCBpZiB0aGlzIHRhYmxlIHVzZXMgYSBjdXN0b21lci1tYW5hZ2VkIGVuY3J5cHRpb24ga2V5LlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogUmVzb3VyY2UgcG9saWN5IHRvIGFzc2lnbiB0byB0YWJsZS5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZXNvdXJjZVBvbGljeT86IGlhbS5Qb2xpY3lEb2N1bWVudDtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCByZWdpb25zIG90aGVyIHRoYW4gdGhlIG1haW4gb25lIHRoYXQgdGhpcyB0YWJsZSBpcyByZXBsaWNhdGVkIHRvXG4gICAqXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgcmVnaW9ucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1lbWJlciBpcyBzdGlsbCBmaWxsZWQgYnV0IGl0IGlzIG5vdCByZWFkXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVnaW9uYWxBcm5zID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICBwdWJsaWMgZ3JhbnRPbktleShcbiAgICBncmFudGVlOiBpYW0uSUdyYW50YWJsZSxcbiAgICAuLi5hY3Rpb25zOiBzdHJpbmdbXVxuICApOiBpYW0uR3JhbnRPbktleVJlc3VsdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdyYW50OiB0aGlzLmVuY3J5cHRpb25LZXk/LmdyYW50KGdyYW50ZWUsIC4uLmFjdGlvbnMpLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0IG91dHB1dHMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhYmxlQXJuOiB0aGlzLnRhYmxlQXJuLFxuICAgICAgdGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIHRhYmxlU3RyZWFtQXJuOiB0aGlzLnRhYmxlU3RyZWFtQXJuLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgYSBwcmVkZWZpbmVkIHNldCBvZiBwZXJtaXNzaW9ucyBvbiB0aGlzIFRhYmxlLlxuICAgKi9cbiAgcHVibGljIGdldCBncmFudHMoKTogVGFibGVHcmFudHMge1xuICAgIHJldHVybiBuZXcgVGFibGVHcmFudHMoe1xuICAgICAgdGFibGU6IHRoaXMsXG4gICAgICBlbmNyeXB0ZWRSZXNvdXJjZTogdGhpcyxcbiAgICAgIHBvbGljeVJlc291cmNlOiB0aGlzLFxuICAgICAgcmVnaW9uczogdGhpcy5yZWdpb25zLFxuICAgICAgaGFzSW5kZXg6IHRoaXMuaGFzSW5kZXgsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgYSBwcmVkZWZpbmVkIHNldCBvZiBwZXJtaXNzaW9ucyBvbiB0aGlzIFRhYmxlJ3MgU3RyZWFtLCBpZiBwcmVzZW50LlxuICAgKlxuICAgKiBXaWxsIHRocm93IGlmIHRoZSBUYWJsZSBoYXMgbm90IGJlZW4gY29uZmlndXJlZCBmb3Igc3RyZWFtaW5nLlxuICAgKi9cbiAgcHVibGljIGdldCBzdHJlYW1HcmFudHMoKTogU3RyZWFtR3JhbnRzIHtcbiAgICBpZiAoIXRoaXMudGFibGVTdHJlYW1Bcm4pIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBEeW5hbW9EQiBTdHJlYW1zIG11c3QgYmUgZW5hYmxlZCBvbiB0aGUgdGFibGUgJHt0aGlzLm5vZGUucGF0aH1gLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTdHJlYW1HcmFudHMoe1xuICAgICAgdGFibGU6IHRoaXMsXG4gICAgICB0YWJsZVN0cmVhbUFybjogdGhpcy50YWJsZVN0cmVhbUFybixcbiAgICAgIGVuY3J5cHRpb25LZXk6IHRoaXMuZW5jcnlwdGlvbktleSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgc3RhdGVtZW50IHRvIHRoZSByZXNvdXJjZSBwb2xpY3kgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGFibGUuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgYWRkVG9SZXNvdXJjZVBvbGljeShcbiAgICBzdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQsXG4gICk6IGlhbS5BZGRUb1Jlc291cmNlUG9saWN5UmVzdWx0O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIElBTSBwb2xpY3kgc3RhdGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhYmxlIHRvIGFuIElBTVxuICAgKiBwcmluY2lwYWwncyBwb2xpY3kuXG4gICAqXG4gICAqIElmIGBlbmNyeXB0aW9uS2V5YCBpcyBwcmVzZW50LCBhcHByb3ByaWF0ZSBncmFudHMgdG8gdGhlIGtleSBuZWVkcyB0byBiZSBhZGRlZFxuICAgKiBzZXBhcmF0ZWx5IHVzaW5nIHRoZSBgdGFibGUuZW5jcnlwdGlvbktleS5ncmFudCpgIG1ldGhvZHMuXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWwgKG5vLW9wIGlmIHVuZGVmaW5lZClcbiAgICogQHBhcmFtIGFjdGlvbnMgVGhlIHNldCBvZiBhY3Rpb25zIHRvIGFsbG93IChpLmUuIFwiZHluYW1vZGI6UHV0SXRlbVwiLCBcImR5bmFtb2RiOkdldEl0ZW1cIiwgLi4uKVxuICAgKi9cbiAgcHVibGljIGdyYW50KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCAuLi5hY3Rpb25zOiBzdHJpbmdbXSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnRzLmFjdGlvbnMoZ3JhbnRlZSwgLi4uYWN0aW9ucyk7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYW4gSUFNIHBvbGljeSBzdGF0ZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGFibGUncyBzdHJlYW0gdG8gYW5cbiAgICogSUFNIHByaW5jaXBhbCdzIHBvbGljeS5cbiAgICpcbiAgICogSWYgYGVuY3J5cHRpb25LZXlgIGlzIHByZXNlbnQsIGFwcHJvcHJpYXRlIGdyYW50cyB0byB0aGUga2V5IG5lZWRzIHRvIGJlIGFkZGVkXG4gICAqIHNlcGFyYXRlbHkgdXNpbmcgdGhlIGB0YWJsZS5lbmNyeXB0aW9uS2V5LmdyYW50KmAgbWV0aG9kcy5cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgVGhlIHByaW5jaXBhbCAobm8tb3AgaWYgdW5kZWZpbmVkKVxuICAgKiBAcGFyYW0gYWN0aW9ucyBUaGUgc2V0IG9mIGFjdGlvbnMgdG8gYWxsb3cgKGkuZS4gXCJkeW5hbW9kYjpEZXNjcmliZVN0cmVhbVwiLCBcImR5bmFtb2RiOkdldFJlY29yZHNcIiwgLi4uKVxuICAgKi9cbiAgcHVibGljIGdyYW50U3RyZWFtKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCAuLi5hY3Rpb25zOiBzdHJpbmdbXSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuc3RyZWFtR3JhbnRzLmFjdGlvbnMoZ3JhbnRlZSwgLi4uYWN0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUGVybWl0cyBhbiBJQU0gcHJpbmNpcGFsIGFsbCBkYXRhIHJlYWQgb3BlcmF0aW9ucyBmcm9tIHRoaXMgdGFibGU6XG4gICAqIEJhdGNoR2V0SXRlbSwgR2V0UmVjb3JkcywgR2V0U2hhcmRJdGVyYXRvciwgUXVlcnksIEdldEl0ZW0sIFNjYW4sIERlc2NyaWJlVGFibGUuXG4gICAqXG4gICAqIEFwcHJvcHJpYXRlIGdyYW50cyB3aWxsIGFsc28gYmUgYWRkZWQgdG8gdGhlIGN1c3RvbWVyLW1hbmFnZWQgS01TIGtleVxuICAgKiBpZiBvbmUgd2FzIGNvbmZpZ3VyZWQuXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWwgdG8gZ3JhbnQgYWNjZXNzIHRvXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRSZWFkRGF0YShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnRzLnJlYWREYXRhKGdyYW50ZWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcm1pdHMgYW4gSUFNIFByaW5jaXBhbCB0byBsaXN0IHN0cmVhbXMgYXR0YWNoZWQgdG8gY3VycmVudCBkeW5hbW9kYiB0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgVGhlIHByaW5jaXBhbCAobm8tb3AgaWYgdW5kZWZpbmVkKVxuICAgKi9cbiAgcHVibGljIGdyYW50VGFibGVMaXN0U3RyZWFtcyhncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuc3RyZWFtR3JhbnRzLmxpc3QoZ3JhbnRlZSk7XG4gIH1cblxuICAvKipcbiAgICogUGVybWl0cyBhbiBJQU0gcHJpbmNpcGFsIGFsbCBzdHJlYW0gZGF0YSByZWFkIG9wZXJhdGlvbnMgZm9yIHRoaXNcbiAgICogdGFibGUncyBzdHJlYW06XG4gICAqIERlc2NyaWJlU3RyZWFtLCBHZXRSZWNvcmRzLCBHZXRTaGFyZEl0ZXJhdG9yLCBMaXN0U3RyZWFtcy5cbiAgICpcbiAgICogQXBwcm9wcmlhdGUgZ3JhbnRzIHdpbGwgYWxzbyBiZSBhZGRlZCB0byB0aGUgY3VzdG9tZXItbWFuYWdlZCBLTVMga2V5XG4gICAqIGlmIG9uZSB3YXMgY29uZmlndXJlZC5cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgVGhlIHByaW5jaXBhbCB0byBncmFudCBhY2Nlc3MgdG9cbiAgICovXG4gIHB1YmxpYyBncmFudFN0cmVhbVJlYWQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLnN0cmVhbUdyYW50cy5yZWFkKGdyYW50ZWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcm1pdHMgYW4gSUFNIHByaW5jaXBhbCBhbGwgZGF0YSB3cml0ZSBvcGVyYXRpb25zIHRvIHRoaXMgdGFibGU6XG4gICAqIEJhdGNoV3JpdGVJdGVtLCBQdXRJdGVtLCBVcGRhdGVJdGVtLCBEZWxldGVJdGVtLCBEZXNjcmliZVRhYmxlLlxuICAgKlxuICAgKiBBcHByb3ByaWF0ZSBncmFudHMgd2lsbCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBjdXN0b21lci1tYW5hZ2VkIEtNUyBrZXlcbiAgICogaWYgb25lIHdhcyBjb25maWd1cmVkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsIHRvIGdyYW50IGFjY2VzcyB0b1xuICAgKi9cbiAgcHVibGljIGdyYW50V3JpdGVEYXRhKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5ncmFudHMud3JpdGVEYXRhKGdyYW50ZWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcm1pdHMgYW4gSUFNIHByaW5jaXBhbCB0byBhbGwgZGF0YSByZWFkL3dyaXRlIG9wZXJhdGlvbnMgdG8gdGhpcyB0YWJsZS5cbiAgICogQmF0Y2hHZXRJdGVtLCBHZXRSZWNvcmRzLCBHZXRTaGFyZEl0ZXJhdG9yLCBRdWVyeSwgR2V0SXRlbSwgU2NhbixcbiAgICogQmF0Y2hXcml0ZUl0ZW0sIFB1dEl0ZW0sIFVwZGF0ZUl0ZW0sIERlbGV0ZUl0ZW0sIERlc2NyaWJlVGFibGVcbiAgICpcbiAgICogQXBwcm9wcmlhdGUgZ3JhbnRzIHdpbGwgYWxzbyBiZSBhZGRlZCB0byB0aGUgY3VzdG9tZXItbWFuYWdlZCBLTVMga2V5XG4gICAqIGlmIG9uZSB3YXMgY29uZmlndXJlZC5cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgVGhlIHByaW5jaXBhbCB0byBncmFudCBhY2Nlc3MgdG9cbiAgICovXG4gIHB1YmxpYyBncmFudFJlYWRXcml0ZURhdGEoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdyYW50cy5yZWFkV3JpdGVEYXRhKGdyYW50ZWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcm1pdHMgYWxsIER5bmFtb0RCIG9wZXJhdGlvbnMgKFwiZHluYW1vZGI6KlwiKSB0byBhbiBJQU0gcHJpbmNpcGFsLlxuICAgKlxuICAgKiBBcHByb3ByaWF0ZSBncmFudHMgd2lsbCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBjdXN0b21lci1tYW5hZ2VkIEtNUyBrZXlcbiAgICogaWYgb25lIHdhcyBjb25maWd1cmVkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsIHRvIGdyYW50IGFjY2VzcyB0b1xuICAgKi9cbiAgcHVibGljIGdyYW50RnVsbEFjY2VzcyhncmFudGVlOiBpYW0uSUdyYW50YWJsZSkge1xuICAgIHJldHVybiB0aGlzLmdyYW50cy5mdWxsQWNjZXNzKGdyYW50ZWUpO1xuICB9XG5cbiAgcHVibGljIG1ldHJpYyhcbiAgICBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMsXG4gICk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgIG5hbWVzcGFjZTogXCJBV1MvRHluYW1vREJcIixcbiAgICAgIG1ldHJpY05hbWUsXG4gICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgIFRhYmxlTmFtZTogdGhpcy50YWJsZU5hbWUsXG4gICAgICB9LFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSkuYXR0YWNoVG8odGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgY29uc3VtZWQgcmVhZCBjYXBhY2l0eSB1bml0cyB0aGlzIHRhYmxlXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBtZXRyaWMgd2lsbCBiZSBjYWxjdWxhdGVkIGFzIGEgc3VtIG92ZXIgYSBwZXJpb2Qgb2YgNSBtaW51dGVzLlxuICAgKiBZb3UgY2FuIGN1c3RvbWl6ZSB0aGlzIGJ5IHVzaW5nIHRoZSBgc3RhdGlzdGljYCBhbmQgYHBlcmlvZGAgcHJvcGVydGllcy5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNDb25zdW1lZFJlYWRDYXBhY2l0eVVuaXRzKFxuICAgIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zLFxuICApOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMuY2FubmVkTWV0cmljKFxuICAgICAgRHluYW1vREJNZXRyaWNzLmNvbnN1bWVkUmVhZENhcGFjaXR5VW5pdHNTdW0sXG4gICAgICBwcm9wcyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIGNvbnN1bWVkIHdyaXRlIGNhcGFjaXR5IHVuaXRzIHRoaXMgdGFibGVcbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhlIG1ldHJpYyB3aWxsIGJlIGNhbGN1bGF0ZWQgYXMgYSBzdW0gb3ZlciBhIHBlcmlvZCBvZiA1IG1pbnV0ZXMuXG4gICAqIFlvdSBjYW4gY3VzdG9taXplIHRoaXMgYnkgdXNpbmcgdGhlIGBzdGF0aXN0aWNgIGFuZCBgcGVyaW9kYCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY0NvbnN1bWVkV3JpdGVDYXBhY2l0eVVuaXRzKFxuICAgIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zLFxuICApOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMuY2FubmVkTWV0cmljKFxuICAgICAgRHluYW1vREJNZXRyaWNzLmNvbnN1bWVkV3JpdGVDYXBhY2l0eVVuaXRzU3VtLFxuICAgICAgcHJvcHMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgYG1ldHJpY1N5c3RlbUVycm9yc0Zvck9wZXJhdGlvbnNgLiAqL1xuICBwdWJsaWMgbWV0cmljU3lzdGVtRXJyb3JzKFxuICAgIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zLFxuICApOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgaWYgKCFwcm9wcz8uZGltZW5zaW9uc01hcD8uT3BlcmF0aW9uKSB7XG4gICAgICAvLyAnT3BlcmF0aW9uJyBtdXN0IGJlIHBhc3NlZCBiZWNhdXNlIGl0cyBhbiBvcGVyYXRpb25hbCBtZXRyaWMuXG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIidPcGVyYXRpb24nIGRpbWVuc2lvbiBtdXN0IGJlIHBhc3NlZCBmb3IgdGhlICdTeXN0ZW1FcnJvcnMnIG1ldHJpYy5cIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZGltZW5zaW9uc01hcCA9IHtcbiAgICAgIFRhYmxlTmFtZTogdGhpcy50YWJsZU5hbWUsXG4gICAgICAuLi5wcm9wcz8uZGltZW5zaW9uc01hcCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiU3lzdGVtRXJyb3JzXCIsIHtcbiAgICAgIHN0YXRpc3RpYzogXCJzdW1cIixcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZGltZW5zaW9uc01hcCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSB1c2VyIGVycm9ycy4gTm90ZSB0aGF0IHRoaXMgbWV0cmljIHJlcG9ydHMgdXNlciBlcnJvcnMgYWNyb3NzIGFsbFxuICAgKiB0aGUgdGFibGVzIGluIHRoZSBhY2NvdW50IGFuZCByZWdpb24gdGhlIHRhYmxlIHJlc2lkZXMgaW4uXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBtZXRyaWMgd2lsbCBiZSBjYWxjdWxhdGVkIGFzIGEgc3VtIG92ZXIgYSBwZXJpb2Qgb2YgNSBtaW51dGVzLlxuICAgKiBZb3UgY2FuIGN1c3RvbWl6ZSB0aGlzIGJ5IHVzaW5nIHRoZSBgc3RhdGlzdGljYCBhbmQgYHBlcmlvZGAgcHJvcGVydGllcy5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNVc2VyRXJyb3JzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIGlmIChwcm9wcz8uZGltZW5zaW9uc01hcCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCInZGltZW5zaW9uc01hcCcgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhlICdVc2VyRXJyb3JzJyBtZXRyaWNcIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gb3ZlcnJpZGluZyAnZGltZW5zaW9ucycgaGVyZSBiZWNhdXNlIHRoaXMgbWV0cmljIGlzIGFuIGFjY291bnQgbWV0cmljLlxuICAgIC8vIHNlZSAnVXNlckVycm9ycycgaW4gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbmR5bmFtb2RiL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9tZXRyaWNzLWRpbWVuc2lvbnMuaHRtbFxuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIlVzZXJFcnJvcnNcIiwge1xuICAgICAgc3RhdGlzdGljOiBcInN1bVwiLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBkaW1lbnNpb25zTWFwOiB7fSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSBjb25kaXRpb25hbCBjaGVjayBmYWlsZWQgcmVxdWVzdHMgdGhpcyB0YWJsZVxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgbWV0cmljIHdpbGwgYmUgY2FsY3VsYXRlZCBhcyBhIHN1bSBvdmVyIGEgcGVyaW9kIG9mIDUgbWludXRlcy5cbiAgICogWW91IGNhbiBjdXN0b21pemUgdGhpcyBieSB1c2luZyB0aGUgYHN0YXRpc3RpY2AgYW5kIGBwZXJpb2RgIHByb3BlcnRpZXMuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljQ29uZGl0aW9uYWxDaGVja0ZhaWxlZFJlcXVlc3RzKFxuICAgIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zLFxuICApOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiQ29uZGl0aW9uYWxDaGVja0ZhaWxlZFJlcXVlc3RzXCIsIHtcbiAgICAgIHN0YXRpc3RpYzogXCJzdW1cIixcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgdGhpcyBmdW5jdGlvbi4gSXQgcmV0dXJucyBhbiBpbnZhbGlkIG1ldHJpYy4gVXNlIGBtZXRyaWNUaHJvdHRsZWRSZXF1ZXN0c0Zvck9wZXJhdGlvbmAgaW5zdGVhZC4gKi9cbiAgcHVibGljIG1ldHJpY1Rocm90dGxlZFJlcXVlc3RzKFxuICAgIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zLFxuICApOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiVGhyb3R0bGVkUmVxdWVzdHNcIiwgeyBzdGF0aXN0aWM6IFwic3VtXCIsIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIHN1Y2Nlc3NmdWwgcmVxdWVzdCBsYXRlbmN5IHRoaXMgdGFibGUuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBtZXRyaWMgd2lsbCBiZSBjYWxjdWxhdGVkIGFzIGFuIGF2ZXJhZ2Ugb3ZlciBhIHBlcmlvZCBvZiA1IG1pbnV0ZXMuXG4gICAqIFlvdSBjYW4gY3VzdG9taXplIHRoaXMgYnkgdXNpbmcgdGhlIGBzdGF0aXN0aWNgIGFuZCBgcGVyaW9kYCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY1N1Y2Nlc3NmdWxSZXF1ZXN0TGF0ZW5jeShcbiAgICBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIGlmICghcHJvcHM/LmRpbWVuc2lvbnNNYXA/Lk9wZXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCInT3BlcmF0aW9uJyBkaW1lbnNpb24gbXVzdCBiZSBwYXNzZWQgZm9yIHRoZSAnU3VjY2Vzc2Z1bFJlcXVlc3RMYXRlbmN5JyBtZXRyaWMuXCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGRpbWVuc2lvbnNNYXAgPSB7XG4gICAgICBUYWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLFxuICAgICAgT3BlcmF0aW9uOiBwcm9wcy5kaW1lbnNpb25zTWFwLk9wZXJhdGlvbixcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICAuLi5EeW5hbW9EQk1ldHJpY3Muc3VjY2Vzc2Z1bFJlcXVlc3RMYXRlbmN5QXZlcmFnZShkaW1lbnNpb25zTWFwKSxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZGltZW5zaW9uc01hcCxcbiAgICB9KS5hdHRhY2hUbyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb3cgbWFueSByZXF1ZXN0cyBhcmUgdGhyb3R0bGVkIG9uIHRoaXMgdGFibGUsIGZvciB0aGUgZ2l2ZW4gb3BlcmF0aW9uXG4gICAqXG4gICAqIERlZmF1bHQ6IHN1bSBvdmVyIDUgbWludXRlc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1Rocm90dGxlZFJlcXVlc3RzRm9yT3BlcmF0aW9uKFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zLFxuICApOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICAuLi5EeW5hbW9EQk1ldHJpY3MudGhyb3R0bGVkUmVxdWVzdHNTdW0oe1xuICAgICAgICBPcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgVGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIH0pLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSkuYXR0YWNoVG8odGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogSG93IG1hbnkgcmVxdWVzdHMgYXJlIHRocm90dGxlZCBvbiB0aGlzIHRhYmxlLlxuICAgKlxuICAgKiBUaGlzIHdpbGwgc3VtIGVycm9ycyBhY3Jvc3MgYWxsIHBvc3NpYmxlIG9wZXJhdGlvbnMuXG4gICAqIE5vdGUgdGhhdCBieSBkZWZhdWx0LCBlYWNoIGluZGl2aWR1YWwgbWV0cmljIHdpbGwgYmUgY2FsY3VsYXRlZCBhcyBhIHN1bSBvdmVyIGEgcGVyaW9kIG9mIDUgbWludXRlcy5cbiAgICogWW91IGNhbiBjdXN0b21pemUgdGhpcyBieSB1c2luZyB0aGUgYHN0YXRpc3RpY2AgYW5kIGBwZXJpb2RgIHByb3BlcnRpZXMuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljVGhyb3R0bGVkUmVxdWVzdHNGb3JPcGVyYXRpb25zKFxuICAgIHByb3BzPzogT3BlcmF0aW9uc01ldHJpY09wdGlvbnMsXG4gICk6IGNsb3Vkd2F0Y2guSU1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMuc3VtTWV0cmljc0Zvck9wZXJhdGlvbnMoXG4gICAgICBcIlRocm90dGxlZFJlcXVlc3RzXCIsXG4gICAgICBcIlN1bSBvZiB0aHJvdHRsZWQgcmVxdWVzdHMgYWNyb3NzIGFsbCBvcGVyYXRpb25zXCIsXG4gICAgICBwcm9wcyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIHN5c3RlbSBlcnJvcnMgdGhpcyB0YWJsZS5cbiAgICpcbiAgICogVGhpcyB3aWxsIHN1bSBlcnJvcnMgYWNyb3NzIGFsbCBwb3NzaWJsZSBvcGVyYXRpb25zLlxuICAgKiBOb3RlIHRoYXQgYnkgZGVmYXVsdCwgZWFjaCBpbmRpdmlkdWFsIG1ldHJpYyB3aWxsIGJlIGNhbGN1bGF0ZWQgYXMgYSBzdW0gb3ZlciBhIHBlcmlvZCBvZiA1IG1pbnV0ZXMuXG4gICAqIFlvdSBjYW4gY3VzdG9taXplIHRoaXMgYnkgdXNpbmcgdGhlIGBzdGF0aXN0aWNgIGFuZCBgcGVyaW9kYCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY1N5c3RlbUVycm9yc0Zvck9wZXJhdGlvbnMoXG4gICAgcHJvcHM/OiBTeXN0ZW1FcnJvcnNGb3JPcGVyYXRpb25zTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5JTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5zdW1NZXRyaWNzRm9yT3BlcmF0aW9ucyhcbiAgICAgIFwiU3lzdGVtRXJyb3JzXCIsXG4gICAgICBcIlN1bSBvZiBlcnJvcnMgYWNyb3NzIGFsbCBvcGVyYXRpb25zXCIsXG4gICAgICBwcm9wcyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG1hdGggZXhwcmVzc2lvbiBmb3Igb3BlcmF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIG1ldHJpY05hbWUgVGhlIG1ldHJpYyBuYW1lLlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbkxhYmVsIExhYmVsIGZvciBleHByZXNzaW9uXG4gICAqIEBwYXJhbSBwcm9wcyBvcGVyYXRpb24gbGlzdFxuICAgKi9cbiAgcHJpdmF0ZSBzdW1NZXRyaWNzRm9yT3BlcmF0aW9ucyhcbiAgICBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgZXhwcmVzc2lvbkxhYmVsOiBzdHJpbmcsXG4gICAgcHJvcHM/OiBPcGVyYXRpb25zTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5JTWV0cmljIHtcbiAgICBpZiAocHJvcHM/LmRpbWVuc2lvbnNNYXA/Lk9wZXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCJUaGUgT3BlcmF0aW9uIGRpbWVuc2lvbiBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgdGhlICdvcGVyYXRpb25zJyBwcm9wZXJ0eS5cIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IHByb3BzPy5vcGVyYXRpb25zID8/IE9iamVjdC52YWx1ZXMoT3BlcmF0aW9uKTtcblxuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuY3JlYXRlTWV0cmljc0Zvck9wZXJhdGlvbnMobWV0cmljTmFtZSwgb3BlcmF0aW9ucywge1xuICAgICAgc3RhdGlzdGljOiBcInN1bVwiLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdW0gPSBuZXcgY2xvdWR3YXRjaC5NYXRoRXhwcmVzc2lvbih7XG4gICAgICBleHByZXNzaW9uOiBgJHtPYmplY3Qua2V5cyh2YWx1ZXMpLmpvaW4oXCIgKyBcIil9YCxcbiAgICAgIHVzaW5nTWV0cmljczogeyAuLi52YWx1ZXMgfSxcbiAgICAgIGNvbG9yOiBwcm9wcz8uY29sb3IsXG4gICAgICBsYWJlbDogZXhwcmVzc2lvbkxhYmVsLFxuICAgICAgcGVyaW9kOiBwcm9wcz8ucGVyaW9kLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHN1bTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBtYXAgb2YgbWV0cmljcyB0aGF0IGNhbiBiZSB1c2VkIGluIGEgbWF0aCBleHByZXNzaW9uLlxuICAgKlxuICAgKiBVc2luZyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gYXMgdGhlIGB1c2luZ01ldHJpY3NgIHByb3BlcnR5IGluIGBjbG91ZHdhdGNoLk1hdGhFeHByZXNzaW9uYCBhbGxvd3MgeW91IHRvXG4gICAqIHVzZSB0aGUga2V5cyBvZiB0aGlzIG1hcCBhcyBtZXRyaWMgbmFtZXMgaW5zaWRlIHlvdSBleHByZXNzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0cmljTmFtZSBUaGUgbWV0cmljIG5hbWUuXG4gICAqIEBwYXJhbSBvcGVyYXRpb25zIFRoZSBsaXN0IG9mIG9wZXJhdGlvbnMgdG8gY3JlYXRlIG1ldHJpY3MgZm9yLlxuICAgKiBAcGFyYW0gcHJvcHMgUHJvcGVydGllcyBmb3IgdGhlIGluZGl2aWR1YWwgbWV0cmljcy5cbiAgICogQHBhcmFtIG1ldHJpY05hbWVNYXBwZXIgTWFwcGVyIGZ1bmN0aW9uIHRvIGFsbG93IGNvbnRyb2xsaW5nIHRoZSBpbmRpdmlkdWFsIG1ldHJpYyBuYW1lIHBlciBvcGVyYXRpb24uXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZU1ldHJpY3NGb3JPcGVyYXRpb25zKFxuICAgIG1ldHJpY05hbWU6IHN0cmluZyxcbiAgICBvcGVyYXRpb25zOiBPcGVyYXRpb25bXSxcbiAgICBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyxcbiAgICBtZXRyaWNOYW1lTWFwcGVyPzogKG9wOiBPcGVyYXRpb24pID0+IHN0cmluZyxcbiAgKTogUmVjb3JkPHN0cmluZywgY2xvdWR3YXRjaC5JTWV0cmljPiB7XG4gICAgY29uc3QgbWV0cmljczogUmVjb3JkPHN0cmluZywgY2xvdWR3YXRjaC5JTWV0cmljPiA9IHt9O1xuXG4gICAgY29uc3QgbWFwcGVyID0gbWV0cmljTmFtZU1hcHBlciA/PyAoKG9wKSA9PiBvcC50b0xvd2VyQ2FzZSgpKTtcblxuICAgIGlmIChwcm9wcz8uZGltZW5zaW9uc01hcD8uT3BlcmF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIkludmFsaWQgcHJvcGVydGllcy4gT3BlcmF0aW9uIGRpbWVuc2lvbiBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gY2FsY3VsYXRpbmcgb3BlcmF0aW9uYWwgbWV0cmljc1wiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICBjb25zdCBtZXRyaWMgPSB0aGlzLm1ldHJpYyhtZXRyaWNOYW1lLCB7XG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgICAgVGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgICAgICBPcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgICAuLi5wcm9wcz8uZGltZW5zaW9uc01hcCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBvcGVyYXRpb25NZXRyaWNOYW1lID0gbWFwcGVyKG9wZXJhdGlvbik7XG4gICAgICBjb25zdCBmaXJzdENoYXIgPSBvcGVyYXRpb25NZXRyaWNOYW1lLmNoYXJBdCgwKTtcblxuICAgICAgaWYgKGZpcnN0Q2hhciA9PT0gZmlyc3RDaGFyLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvdXNpbmctbWV0cmljLW1hdGguaHRtbCNtZXRyaWMtbWF0aC1zeW50YXhcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBgTWFwcGVyIGdlbmVyYXRlZCBhbiBpbGxlZ2FsIG9wZXJhdGlvbiBtZXRyaWMgbmFtZTogJHtvcGVyYXRpb25NZXRyaWNOYW1lfS4gTXVzdCBzdGFydCB3aXRoIGEgbG93ZXJjYXNlIGxldHRlcmAsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbWV0cmljc1tvcGVyYXRpb25NZXRyaWNOYW1lXSA9IG1ldHJpYztcbiAgICB9XG5cbiAgICByZXR1cm4gbWV0cmljcztcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXQgaGFzSW5kZXgoKTogYm9vbGVhbjtcblxuICBwcml2YXRlIGNhbm5lZE1ldHJpYyhcbiAgICBmbjogKGRpbXM6IHsgVGFibGVOYW1lOiBzdHJpbmcgfSkgPT4gY2xvdWR3YXRjaC5NZXRyaWNQcm9wcyxcbiAgICBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgLi4uZm4oeyBUYWJsZU5hbWU6IHRoaXMudGFibGVOYW1lIH0pLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSkuYXR0YWNoVG8odGhpcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhIER5bmFtb0RCIHRhYmxlLlxuICovXG5leHBvcnQgY2xhc3MgVGFibGUgZXh0ZW5kcyBUYWJsZUJhc2Uge1xuICAvKipcbiAgICogUGVybWl0cyBhbiBJQU0gUHJpbmNpcGFsIHRvIGxpc3QgYWxsIER5bmFtb0RCIFN0cmVhbXMuXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgI2dyYW50VGFibGVMaXN0U3RyZWFtc2AgZm9yIG1vcmUgZ3JhbnVsYXIgcGVybWlzc2lvblxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsIChuby1vcCBpZiB1bmRlZmluZWQpXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdyYW50TGlzdFN0cmVhbXMoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIGFjdGlvbnM6IFtcImR5bmFtb2RiOkxpc3RTdHJlYW1zXCJdLFxuICAgICAgcmVzb3VyY2VBcm5zOiBbXCIqXCJdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBUYWJsZSBjb25zdHJ1Y3QgdGhhdCByZXByZXNlbnRzIGFuIGV4dGVybmFsIHRhYmxlIHZpYSB0YWJsZSBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIHBhcmVudCBjcmVhdGluZyBjb25zdHJ1Y3QgKHVzdWFsbHkgYHRoaXNgKS5cbiAgICogQHBhcmFtIGlkIFRoZSBjb25zdHJ1Y3QncyBuYW1lLlxuICAgKiBAcGFyYW0gdGFibGVOYW1lIFRoZSB0YWJsZSdzIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21UYWJsZU5hbWUoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiBJVGFibGUge1xuICAgIHJldHVybiBUYWJsZS5mcm9tVGFibGVBdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyB0YWJsZU5hbWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIFRhYmxlIGNvbnN0cnVjdCB0aGF0IHJlcHJlc2VudHMgYW4gZXh0ZXJuYWwgdGFibGUgdmlhIHRhYmxlIGFybi5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY3JlYXRpbmcgY29uc3RydWN0ICh1c3VhbGx5IGB0aGlzYCkuXG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0J3MgbmFtZS5cbiAgICogQHBhcmFtIHRhYmxlQXJuIFRoZSB0YWJsZSdzIEFSTi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVRhYmxlQXJuKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICB0YWJsZUFybjogc3RyaW5nLFxuICApOiBJVGFibGUge1xuICAgIHJldHVybiBUYWJsZS5mcm9tVGFibGVBdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyB0YWJsZUFybiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgVGFibGUgY29uc3RydWN0IHRoYXQgcmVwcmVzZW50cyBhbiBleHRlcm5hbCB0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY3JlYXRpbmcgY29uc3RydWN0ICh1c3VhbGx5IGB0aGlzYCkuXG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0J3MgbmFtZS5cbiAgICogQHBhcmFtIGF0dHJzIEEgYFRhYmxlQXR0cmlidXRlc2Agb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tVGFibGVBdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogVGFibGVBdHRyaWJ1dGVzLFxuICApOiBJVGFibGUge1xuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIFRhYmxlQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdGFibGVOYW1lOiBzdHJpbmc7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdGFibGVBcm46IHN0cmluZztcbiAgICAgIHB1YmxpYyByZWFkb25seSB0YWJsZVN0cmVhbUFybj86IHN0cmluZztcbiAgICAgIHB1YmxpYyByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG4gICAgICBwdWJsaWMgcmVzb3VyY2VQb2xpY3k/OiBpYW0uUG9saWN5RG9jdW1lbnQ7XG4gICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGFzSW5kZXggPVxuICAgICAgICAoYXR0cnMuZ3JhbnRJbmRleFBlcm1pc3Npb25zID8/IGZhbHNlKSB8fFxuICAgICAgICAoYXR0cnMuZ2xvYmFsSW5kZXhlcyA/PyBbXSkubGVuZ3RoID4gMCB8fFxuICAgICAgICAoYXR0cnMubG9jYWxJbmRleGVzID8/IFtdKS5sZW5ndGggPiAwO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHJlZ2lvbnMgPSBbXTtcblxuICAgICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3BzOiBBd3NDb25zdHJ1Y3RQcm9wcyxcbiAgICAgICAgX3RhYmxlQXJuOiBzdHJpbmcsXG4gICAgICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgICAgICB0YWJsZVN0cmVhbUFybj86IHN0cmluZyxcbiAgICAgICkge1xuICAgICAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICAgICAgdGhpcy50YWJsZUFybiA9IF90YWJsZUFybjtcbiAgICAgICAgdGhpcy50YWJsZU5hbWUgPSB0YWJsZU5hbWU7XG4gICAgICAgIHRoaXMudGFibGVTdHJlYW1Bcm4gPSB0YWJsZVN0cmVhbUFybjtcbiAgICAgICAgdGhpcy5lbmNyeXB0aW9uS2V5ID0gYXR0cnMuZW5jcnlwdGlvbktleTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIGFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgICAgIF9zdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQsXG4gICAgICApOiBpYW0uQWRkVG9SZXNvdXJjZVBvbGljeVJlc3VsdCB7XG4gICAgICAgIC8vIEltcG9ydGVkIHRhYmxlcyBjYW5ub3QgaGF2ZSByZXNvdXJjZSBwb2xpY2llcyBtb2RpZmllZFxuICAgICAgICByZXR1cm4geyBzdGF0ZW1lbnRBZGRlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgbmFtZTogc3RyaW5nO1xuICAgIGxldCBhcm46IHN0cmluZztcbiAgICBjb25zdCBzdGFjayA9IEF3c1N0YWNrLm9mQXdzQ29uc3RydWN0KHNjb3BlKTtcbiAgICBpZiAoIWF0dHJzLnRhYmxlTmFtZSkge1xuICAgICAgaWYgKCFhdHRycy50YWJsZUFybikge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIFwiT25lIG9mIHRhYmxlTmFtZSBvciB0YWJsZUFybiBpcyByZXF1aXJlZCFcIixcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYXJuID0gYXR0cnMudGFibGVBcm47XG4gICAgICBjb25zdCBtYXliZVRhYmxlTmFtZSA9IHN0YWNrLnNwbGl0QXJuKFxuICAgICAgICBhdHRycy50YWJsZUFybixcbiAgICAgICAgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgICApLnJlc291cmNlTmFtZTtcbiAgICAgIGlmICghbWF5YmVUYWJsZU5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBcIkFSTiBmb3IgRHluYW1vREIgdGFibGUgbXVzdCBiZSBpbiB0aGUgZm9ybTogYXJuOjxwYXJ0aXRpb24+OmR5bmFtb2RiOjxyZWdpb24+OjxhY2NvdW50Pjp0YWJsZS88dGFibGUtbmFtZT5cIixcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG5hbWUgPSBtYXliZVRhYmxlTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGF0dHJzLnRhYmxlQXJuKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgXCJPbmx5IG9uZSBvZiB0YWJsZUFybiBvciB0YWJsZU5hbWUgY2FuIGJlIHByb3ZpZGVkXCIsXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBuYW1lID0gYXR0cnMudGFibGVOYW1lO1xuICAgICAgYXJuID0gc3RhY2suZm9ybWF0QXJuKHtcbiAgICAgICAgc2VydmljZTogXCJkeW5hbW9kYlwiLFxuICAgICAgICByZXNvdXJjZTogXCJ0YWJsZVwiLFxuICAgICAgICByZXNvdXJjZU5hbWU6IGF0dHJzLnRhYmxlTmFtZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KFxuICAgICAgeyBlbnZpcm9ubWVudEZyb21Bcm46IGFybiB9LFxuICAgICAgYXJuLFxuICAgICAgbmFtZSxcbiAgICAgIGF0dHJzLnRhYmxlU3RyZWFtQXJuLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZSBwb2xpY3kgdG8gYXNzaWduIHRvIER5bmFtb0RCIFRhYmxlLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWR5bmFtb2RiLXRhYmxlLXJlc291cmNlcG9saWN5Lmh0bWxcbiAgICogQGRlZmF1bHQgLSBObyByZXNvdXJjZSBwb2xpY3kgc3RhdGVtZW50cyBhcmUgYWRkZWQgdG8gdGhlIGNyZWF0ZWQgdGFibGUuXG4gICAqL1xuICBwdWJsaWMgcmVzb3VyY2VQb2xpY3k/OiBpYW0uUG9saWN5RG9jdW1lbnQ7XG4gIHB1YmxpYyByZWFkb25seSB0YWJsZUFybjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgdGFibGVOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB0YWJsZVN0cmVhbUFybjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXR0cmlidXRlRGVmaW5pdGlvbnNJbnRlcm5hbCA9XG4gICAgbmV3IEFycmF5PGR5bmFtb2RiVGFibGUuRHluYW1vZGJUYWJsZUF0dHJpYnV0ZT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBnbG9iYWxTZWNvbmRhcnlJbmRleGVzSW50ZXJuYWwgPSBuZXcgQXJyYXk8XG4gICAgZHluYW1vZGJUYWJsZS5EeW5hbW9kYlRhYmxlR2xvYmFsU2Vjb25kYXJ5SW5kZXggJiB7XG4gICAgICBjb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbj86IENvbnRyaWJ1dG9ySW5zaWdodHNTcGVjaWZpY2F0aW9uO1xuICAgIH1cbiAgPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2FsU2Vjb25kYXJ5SW5kZXhlc0ludGVybmFsID1cbiAgICBuZXcgQXJyYXk8ZHluYW1vZGJUYWJsZS5EeW5hbW9kYlRhYmxlTG9jYWxTZWNvbmRhcnlJbmRleD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNlY29uZGFyeUluZGV4U2NoZW1hcyA9IG5ldyBNYXA8c3RyaW5nLCBTY2hlbWFPcHRpb25zPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IG5vbktleUF0dHJpYnV0ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHRhYmxlUGFydGl0aW9uS2V5OiBBdHRyaWJ1dGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFibGVTb3J0S2V5PzogQXR0cmlidXRlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYmlsbGluZ01vZGU6IEJpbGxpbmdNb2RlO1xuICBwcml2YXRlIHJlYWRvbmx5IHRhYmxlU2NhbGluZzogU2NhbGFibGVBdHRyaWJ1dGVQYWlyID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kZXhTY2FsaW5nID0gbmV3IE1hcDxzdHJpbmcsIFNjYWxhYmxlQXR0cmlidXRlUGFpcj4oKTtcbiAgLy8gQ29tbWVudGluZyBvdXQgc2NhbGluZ1JvbGUgYXMgVGVycmFmb3JtIGF1dG8tY3JlYXRlcyBzZXJ2aWNlLWxpbmtlZCByb2xlc1xuICAvLyBVbmxpa2UgQVdTIENESyBDbG91ZEZvcm1hdGlvbiwgVGVycmFmb3JtIEFXUyBwcm92aWRlcidzIHJvbGVBcm4gaXMgb3B0aW9uYWxcbiAgLy8gYW5kIGRlZmF1bHRzIHRvIGFwcHJvcHJpYXRlIHNlcnZpY2UtbGlua2VkIHJvbGVzIHdoZW4gb21pdHRlZFxuICAvLyBwcml2YXRlIHJlYWRvbmx5IHNjYWxpbmdSb2xlOiBpYW0uSVJvbGU7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfcmVzb3VyY2U6IGR5bmFtb2RiVGFibGUuRHluYW1vZGJUYWJsZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVwbGljYXM6IGR5bmFtb2RiVGFibGUuRHluYW1vZGJUYWJsZVJlcGxpY2FbXSB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgcmVhZG9ubHkgcmVnaW9ucz8gPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBUYWJsZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICBjb25zdCBwaHlzaWNhbFRhYmxlTmFtZSA9XG4gICAgICBwcm9wcy50YWJsZU5hbWUgPz8gdGhpcy5zdGFjay51bmlxdWVSZXNvdXJjZU5hbWUodGhpcyk7XG5cbiAgICBjb25zdCB7IHNzZVNwZWNpZmljYXRpb24sIGVuY3J5cHRpb25LZXkgfSA9IHRoaXMucGFyc2VFbmNyeXB0aW9uKHByb3BzKTtcbiAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBlbmNyeXB0aW9uS2V5O1xuXG4gICAgY29uc3QgcG9pbnRJblRpbWVSZWNvdmVyeSA9IHRoaXMucmVuZGVyUG9pbnRJblRpbWVSZWNvdmVyeShwcm9wcyk7XG5cbiAgICAvLyBlcnJvciBpZiBib3RoIHJlcGxpY2F0aW9uUmVnaW9ucyBhbmQgcmVwbGljYVNwZWNpZmljYXRpb24gYXJlIHNwZWNpZmllZFxuICAgIGlmIChwcm9wcy5yZXBsaWNhdGlvblJlZ2lvbnMgJiYgcHJvcHMucmVwbGljYVNwZWNpZmljYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggYHJlcGxpY2F0aW9uUmVnaW9uc2AgYW5kIGByZXBsaWNhU3BlY2lmaWNhdGlvbmBcIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IHN0cmVhbVNwZWNpZmljYXRpb246XG4gICAgICB8IHtcbiAgICAgICAgICBzdHJlYW1FbmFibGVkOiBib29sZWFuO1xuICAgICAgICAgIHN0cmVhbVZpZXdUeXBlPzogU3RyZWFtVmlld1R5cGU7XG4gICAgICAgIH1cbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGlmIChcbiAgICAgIChwcm9wcy5yZXBsaWNhdGlvblJlZ2lvbnMgJiYgcHJvcHMucmVwbGljYXRpb25SZWdpb25zLmxlbmd0aCA+IDApIHx8XG4gICAgICAocHJvcHMucmVwbGljYVNwZWNpZmljYXRpb24gJiYgcHJvcHMucmVwbGljYVNwZWNpZmljYXRpb24ubGVuZ3RoID4gMClcbiAgICApIHtcbiAgICAgIGlmIChwcm9wcy5zdHJlYW0gJiYgcHJvcHMuc3RyZWFtICE9PSBTdHJlYW1WaWV3VHlwZS5ORVdfQU5EX09MRF9JTUFHRVMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBcImBzdHJlYW1gIG11c3QgYmUgc2V0IHRvIGBORVdfQU5EX09MRF9JTUFHRVNgIHdoZW4gc3BlY2lmeWluZyBgcmVwbGljYXRpb25SZWdpb25zYFwiLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzdHJlYW1TcGVjaWZpY2F0aW9uID0ge1xuICAgICAgICBzdHJlYW1FbmFibGVkOiB0cnVlLFxuICAgICAgICBzdHJlYW1WaWV3VHlwZTogU3RyZWFtVmlld1R5cGUuTkVXX0FORF9PTERfSU1BR0VTLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5iaWxsaW5nTW9kZSA9IHByb3BzLmJpbGxpbmdNb2RlID8/IEJpbGxpbmdNb2RlLlBBWV9QRVJfUkVRVUVTVDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iaWxsaW5nTW9kZSA9IHByb3BzLmJpbGxpbmdNb2RlID8/IEJpbGxpbmdNb2RlLlBST1ZJU0lPTkVEO1xuICAgICAgaWYgKHByb3BzLnN0cmVhbSkge1xuICAgICAgICBzdHJlYW1TcGVjaWZpY2F0aW9uID0ge1xuICAgICAgICAgIHN0cmVhbUVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgc3RyZWFtVmlld1R5cGU6IHByb3BzLnN0cmVhbSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZVByb3Zpc2lvbmluZyhwcm9wcyk7XG4gICAgdGhpcy5hZGRLZXkocHJvcHMucGFydGl0aW9uS2V5LCBIQVNIX0tFWV9UWVBFKTtcbiAgICB0aGlzLnRhYmxlUGFydGl0aW9uS2V5ID0gcHJvcHMucGFydGl0aW9uS2V5O1xuICAgIGlmIChwcm9wcy5zb3J0S2V5KSB7XG4gICAgICB0aGlzLmFkZEtleShwcm9wcy5zb3J0S2V5LCBSQU5HRV9LRVlfVFlQRSk7XG4gICAgICB0aGlzLnRhYmxlU29ydEtleSA9IHByb3BzLnNvcnRLZXk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVwbGljYXMgPSB0aGlzLnJlbmRlclJlcGxpY2FzKFxuICAgICAgcHJvcHMucmVwbGljYXRpb25SZWdpb25zLFxuICAgICAgcHJvcHMucmVwbGljYVNwZWNpZmljYXRpb24sXG4gICAgKTtcbiAgICBpZiAodGhpcy5fcmVwbGljYXMgJiYgdGhpcy5fcmVwbGljYXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fcmVwbGljYXMuZm9yRWFjaCgocikgPT4ge1xuICAgICAgICAvLyBTYXZlIHJlZ2lvbmFsIGFybnMgZm9yIGdyYW50WHh4KCkgbWV0aG9kc1xuICAgICAgICB0aGlzLnJlZ2lvbnM/LnB1c2goci5yZWdpb25OYW1lKTtcbiAgICAgICAgdGhpcy5yZWdpb25hbEFybnMucHVzaChcbiAgICAgICAgICB0aGlzLnN0YWNrLmZvcm1hdEFybih7XG4gICAgICAgICAgICByZWdpb246IHIucmVnaW9uTmFtZSxcbiAgICAgICAgICAgIHNlcnZpY2U6IFwiZHluYW1vZGJcIixcbiAgICAgICAgICAgIHJlc291cmNlOiBcInRhYmxlXCIsXG4gICAgICAgICAgICByZXNvdXJjZU5hbWU6IHBoeXNpY2FsVGFibGVOYW1lLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVzb3VyY2UgPSBuZXcgZHluYW1vZGJUYWJsZS5EeW5hbW9kYlRhYmxlKHRoaXMsIFwiUmVzb3VyY2VcIiwge1xuICAgICAgbmFtZTogcGh5c2ljYWxUYWJsZU5hbWUsXG4gICAgICBoYXNoS2V5OiB0aGlzLnRhYmxlUGFydGl0aW9uS2V5Lm5hbWUsXG4gICAgICByYW5nZUtleTogdGhpcy50YWJsZVNvcnRLZXk/Lm5hbWUsXG4gICAgICBhdHRyaWJ1dGU6IHRoaXMuYXR0cmlidXRlRGVmaW5pdGlvbnNJbnRlcm5hbCxcbiAgICAgIGdsb2JhbFNlY29uZGFyeUluZGV4OiBMYXp5LmFueVZhbHVlKFxuICAgICAgICB7XG4gICAgICAgICAgcHJvZHVjZTogKCkgPT5cbiAgICAgICAgICAgIHRoaXMuZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlc0ludGVybmFsLm1hcChcbiAgICAgICAgICAgICAgZHluYW1vZGJUYWJsZS5keW5hbW9kYlRhYmxlR2xvYmFsU2Vjb25kYXJ5SW5kZXhUb1RlcnJhZm9ybSxcbiAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIHsgb21pdEVtcHR5QXJyYXk6IHRydWUgfSxcbiAgICAgICksXG4gICAgICBsb2NhbFNlY29uZGFyeUluZGV4OiBMYXp5LmFueVZhbHVlKFxuICAgICAgICB7XG4gICAgICAgICAgcHJvZHVjZTogKCkgPT5cbiAgICAgICAgICAgIHRoaXMubG9jYWxTZWNvbmRhcnlJbmRleGVzSW50ZXJuYWwubWFwKFxuICAgICAgICAgICAgICBkeW5hbW9kYlRhYmxlLmR5bmFtb2RiVGFibGVMb2NhbFNlY29uZGFyeUluZGV4VG9UZXJyYWZvcm0sXG4gICAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICB7IG9taXRFbXB0eUFycmF5OiB0cnVlIH0sXG4gICAgICApLFxuICAgICAgcG9pbnRJblRpbWVSZWNvdmVyeSxcbiAgICAgIGJpbGxpbmdNb2RlOiB0aGlzLmJpbGxpbmdNb2RlLFxuICAgICAgcmVhZENhcGFjaXR5OlxuICAgICAgICB0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QUk9WSVNJT05FRFxuICAgICAgICAgID8gKHByb3BzLnJlYWRDYXBhY2l0eSA/PyA1KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgd3JpdGVDYXBhY2l0eTpcbiAgICAgICAgdGhpcy5iaWxsaW5nTW9kZSA9PT0gQmlsbGluZ01vZGUuUFJPVklTSU9ORURcbiAgICAgICAgICA/IChwcm9wcy53cml0ZUNhcGFjaXR5ID8/IDUpXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBvbkRlbWFuZFRocm91Z2hwdXQ6XG4gICAgICAgIHRoaXMuYmlsbGluZ01vZGUgPT09IEJpbGxpbmdNb2RlLlBBWV9QRVJfUkVRVUVTVCAmJlxuICAgICAgICAocHJvcHMubWF4UmVhZFJlcXVlc3RVbml0cyB8fCBwcm9wcy5tYXhXcml0ZVJlcXVlc3RVbml0cylcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgbWF4UmVhZFJlcXVlc3RVbml0czogcHJvcHMubWF4UmVhZFJlcXVlc3RVbml0cyxcbiAgICAgICAgICAgICAgbWF4V3JpdGVSZXF1ZXN0VW5pdHM6IHByb3BzLm1heFdyaXRlUmVxdWVzdFVuaXRzLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgc2VydmVyU2lkZUVuY3J5cHRpb246IHNzZVNwZWNpZmljYXRpb24sXG4gICAgICBzdHJlYW1FbmFibGVkOiBzdHJlYW1TcGVjaWZpY2F0aW9uPy5zdHJlYW1FbmFibGVkLFxuICAgICAgc3RyZWFtVmlld1R5cGU6IHN0cmVhbVNwZWNpZmljYXRpb24/LnN0cmVhbVZpZXdUeXBlLFxuICAgICAgdGFibGVDbGFzczogcHJvcHMudGFibGVDbGFzcyxcbiAgICAgIHR0bDogcHJvcHMudGltZVRvTGl2ZUF0dHJpYnV0ZVxuICAgICAgICA/IHsgYXR0cmlidXRlTmFtZTogcHJvcHMudGltZVRvTGl2ZUF0dHJpYnV0ZSwgZW5hYmxlZDogdHJ1ZSB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgZGVsZXRpb25Qcm90ZWN0aW9uRW5hYmxlZDogcHJvcHMuZGVsZXRpb25Qcm90ZWN0aW9uLFxuICAgICAgaW1wb3J0VGFibGU6IHRoaXMucmVuZGVySW1wb3J0U291cmNlU3BlY2lmaWNhdGlvbihwcm9wcy5pbXBvcnRTb3VyY2UpLFxuICAgICAgcmVwbGljYTogdGhpcy5fcmVwbGljYXMsXG4gICAgICAvLyByZXNvdXJjZVBvbGljeTogcHJvcHMucmVzb3VyY2VQb2xpY3kgPyB7IHBvbGljeURvY3VtZW50OiB0aGlzLnN0YWNrLnRvSnNvblN0cmluZyhwcm9wcy5yZXNvdXJjZVBvbGljeS50b0pTT04oKSkgfSA6IHVuZGVmaW5lZCwgLy8gTm90IGluIFRGIHJlc291cmNlXG4gICAgICB3YXJtVGhyb3VnaHB1dDogcHJvcHMud2FybVRocm91Z2hwdXQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnRhYmxlQXJuID0gdGhpcy5fcmVzb3VyY2UuYXJuO1xuICAgIHRoaXMudGFibGVOYW1lID0gdGhpcy5fcmVzb3VyY2UubmFtZTtcbiAgICB0aGlzLnRhYmxlU3RyZWFtQXJuID0gc3RyZWFtU3BlY2lmaWNhdGlvbj8uc3RyZWFtRW5hYmxlZFxuICAgICAgPyB0aGlzLl9yZXNvdXJjZS5zdHJlYW1Bcm5cbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucmVzb3VyY2VQb2xpY3kgPSBwcm9wcy5yZXNvdXJjZVBvbGljeTtcbiAgICBpZiAodGhpcy5yZXNvdXJjZVBvbGljeSkge1xuICAgICAgbmV3IGR5bmFtb2RiUmVzb3VyY2VQb2xpY3kuRHluYW1vZGJSZXNvdXJjZVBvbGljeShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgXCJSZXNvdXJjZVBvbGljeVwiLFxuICAgICAgICB7XG4gICAgICAgICAgcG9saWN5OiB0aGlzLnJlc291cmNlUG9saWN5Lmpzb24sXG4gICAgICAgICAgcmVzb3VyY2VBcm46IHRoaXMudGFibGVBcm4sXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5raW5lc2lzU3RyZWFtKSB7XG4gICAgICBuZXcgZHluYW1vZGJLaW5lc2lzU3RyZWFtaW5nRGVzdGluYXRpb24uRHluYW1vZGJLaW5lc2lzU3RyZWFtaW5nRGVzdGluYXRpb24oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiS2luZXNpc1N0cmVhbWluZ0Rlc3RpbmF0aW9uXCIsXG4gICAgICAgIHtcbiAgICAgICAgICB0YWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLFxuICAgICAgICAgIHN0cmVhbUFybjogcHJvcHMua2luZXNpc1N0cmVhbS5zdHJlYW1Bcm4sXG4gICAgICAgICAgLi4uKHByb3BzLmtpbmVzaXNQcmVjaXNpb25UaW1lc3RhbXAgJiYge1xuICAgICAgICAgICAgYXBwcm94aW1hdGVDcmVhdGlvbkRhdGVUaW1lUHJlY2lzaW9uOlxuICAgICAgICAgICAgICBwcm9wcy5raW5lc2lzUHJlY2lzaW9uVGltZXN0YW1wLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbiA9XG4gICAgICB0aGlzLnJlbmRlckNvbnRyaWJ1dG9ySW5zaWdodHMocHJvcHMpO1xuICAgIGlmIChjb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbj8uZW5hYmxlZCkge1xuICAgICAgbmV3IGR5bmFtb2RiQ29udHJpYnV0b3JJbnNpZ2h0cy5EeW5hbW9kYkNvbnRyaWJ1dG9ySW5zaWdodHMoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiQ29udHJpYnV0b3JJbnNpZ2h0c1wiLFxuICAgICAgICB7XG4gICAgICAgICAgdGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgICAgICBtb2RlOiBjb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbi5tb2RlLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDb21tZW50aW5nIG91dCBzY2FsaW5nUm9sZSBpbml0aWFsaXphdGlvbiAtIGxldCBUZXJyYWZvcm0gYXV0by1jcmVhdGUgc2VydmljZS1saW5rZWQgcm9sZVxuICAgIC8vIHRoaXMuc2NhbGluZ1JvbGUgPSB0aGlzLm1ha2VTY2FsaW5nUm9sZSgpO1xuXG4gICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oeyB2YWxpZGF0ZTogKCkgPT4gdGhpcy52YWxpZGF0ZVRhYmxlKCkgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHN0YXRlbWVudCB0byB0aGUgcmVzb3VyY2UgcG9saWN5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhYmxlLlxuICAgKiBBIHJlc291cmNlIHBvbGljeSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGBhZGRUb1Jlc291cmNlUG9saWN5YC5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgZG9lcyBub3Qgd29yayB3aXRoIGltcG9ydGVkIHRhYmxlcy5cbiAgICpcbiAgICogQHBhcmFtIHN0YXRlbWVudCBUaGUgcG9saWN5IHN0YXRlbWVudCB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBhZGRUb1Jlc291cmNlUG9saWN5KFxuICAgIHN0YXRlbWVudDogaWFtLlBvbGljeVN0YXRlbWVudCxcbiAgKTogaWFtLkFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQge1xuICAgIGlmICghdGhpcy5yZXNvdXJjZVBvbGljeSkge1xuICAgICAgLy8gZW5zdXJlIGEgcG9saWN5IGV4aXN0cyBhbmQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YWJsZVxuICAgICAgdGhpcy5yZXNvdXJjZVBvbGljeSA9IG5ldyBpYW0uUG9saWN5RG9jdW1lbnQodGhpcywgXCJQb2xpY3lcIiwge1xuICAgICAgICBzdGF0ZW1lbnQ6IFtdLFxuICAgICAgfSk7XG4gICAgICBuZXcgZHluYW1vZGJSZXNvdXJjZVBvbGljeS5EeW5hbW9kYlJlc291cmNlUG9saWN5KFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIlBvbGljeUF0dGFjaG1lbnRcIixcbiAgICAgICAge1xuICAgICAgICAgIHBvbGljeTogdGhpcy5yZXNvdXJjZVBvbGljeS5qc29uLFxuICAgICAgICAgIHJlc291cmNlQXJuOiB0aGlzLnRhYmxlQXJuLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5yZXNvdXJjZVBvbGljeS5hZGRTdGF0ZW1lbnRzKHN0YXRlbWVudCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlbWVudEFkZGVkOiB0cnVlLFxuICAgICAgcG9saWN5RGVwZW5kYWJsZTogdGhpcyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGFkZEdsb2JhbFNlY29uZGFyeUluZGV4KHByb3BzOiBHbG9iYWxTZWNvbmRhcnlJbmRleFByb3BzKSB7XG4gICAgdGhpcy52YWxpZGF0ZVByb3Zpc2lvbmluZ0dTSShwcm9wcyk7XG4gICAgdGhpcy52YWxpZGF0ZUluZGV4TmFtZShwcm9wcy5pbmRleE5hbWUpO1xuXG4gICAgY29uc3QgZ3NpUHJvamVjdGlvbiA9IHRoaXMuYnVpbGRJbmRleFByb2plY3Rpb24ocHJvcHMpO1xuICAgIHRoaXMucmVnaXN0ZXJBdHRyaWJ1dGUocHJvcHMucGFydGl0aW9uS2V5KTtcbiAgICBpZiAocHJvcHMuc29ydEtleSkge1xuICAgICAgdGhpcy5yZWdpc3RlckF0dHJpYnV0ZShwcm9wcy5zb3J0S2V5KTtcbiAgICB9XG5cbiAgICB0aGlzLmdsb2JhbFNlY29uZGFyeUluZGV4ZXNJbnRlcm5hbC5wdXNoKHtcbiAgICAgIG5hbWU6IHByb3BzLmluZGV4TmFtZSxcbiAgICAgIGhhc2hLZXk6IHByb3BzLnBhcnRpdGlvbktleS5uYW1lLFxuICAgICAgcmFuZ2VLZXk6IHByb3BzLnNvcnRLZXk/Lm5hbWUsXG4gICAgICBwcm9qZWN0aW9uVHlwZTogZ3NpUHJvamVjdGlvbi5wcm9qZWN0aW9uVHlwZSxcbiAgICAgIG5vbktleUF0dHJpYnV0ZXM6IGdzaVByb2plY3Rpb24ubm9uS2V5QXR0cmlidXRlcyxcbiAgICAgIHJlYWRDYXBhY2l0eTpcbiAgICAgICAgdGhpcy5iaWxsaW5nTW9kZSA9PT0gQmlsbGluZ01vZGUuUFJPVklTSU9ORURcbiAgICAgICAgICA/IChwcm9wcy5yZWFkQ2FwYWNpdHkgPz8gNSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHdyaXRlQ2FwYWNpdHk6XG4gICAgICAgIHRoaXMuYmlsbGluZ01vZGUgPT09IEJpbGxpbmdNb2RlLlBST1ZJU0lPTkVEXG4gICAgICAgICAgPyAocHJvcHMud3JpdGVDYXBhY2l0eSA/PyA1KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgb25EZW1hbmRUaHJvdWdocHV0OlxuICAgICAgICB0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QgJiZcbiAgICAgICAgKHByb3BzLm1heFJlYWRSZXF1ZXN0VW5pdHMgfHwgcHJvcHMubWF4V3JpdGVSZXF1ZXN0VW5pdHMpXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIG1heFJlYWRSZXF1ZXN0VW5pdHM6IHByb3BzLm1heFJlYWRSZXF1ZXN0VW5pdHMsXG4gICAgICAgICAgICAgIG1heFdyaXRlUmVxdWVzdFVuaXRzOiBwcm9wcy5tYXhXcml0ZVJlcXVlc3RVbml0cyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGNvbnRyaWJ1dG9ySW5zaWdodHNTcGVjaWZpY2F0aW9uOiBwcm9wcy5jb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbiwgLy8gTm90IGluIFRGIEdTSSBibG9ja1xuICAgICAgd2FybVRocm91Z2hwdXQ6IHByb3BzLndhcm1UaHJvdWdocHV0LFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZWNvbmRhcnlJbmRleFNjaGVtYXMuc2V0KHByb3BzLmluZGV4TmFtZSwge1xuICAgICAgcGFydGl0aW9uS2V5OiBwcm9wcy5wYXJ0aXRpb25LZXksXG4gICAgICBzb3J0S2V5OiBwcm9wcy5zb3J0S2V5LFxuICAgIH0pO1xuICAgIHRoaXMuaW5kZXhTY2FsaW5nLnNldChwcm9wcy5pbmRleE5hbWUsIHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBsb2NhbCBzZWNvbmRhcnkgaW5kZXggb2YgdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyB0aGUgcHJvcGVydHkgb2YgbG9jYWwgc2Vjb25kYXJ5IGluZGV4XG4gICAqL1xuICBwdWJsaWMgYWRkTG9jYWxTZWNvbmRhcnlJbmRleChwcm9wczogTG9jYWxTZWNvbmRhcnlJbmRleFByb3BzKSB7XG4gICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbmR5bmFtb2RiL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9MaW1pdHMuaHRtbCNsaW1pdHMtc2Vjb25kYXJ5LWluZGV4ZXNcbiAgICBpZiAoXG4gICAgICB0aGlzLmxvY2FsU2Vjb25kYXJ5SW5kZXhlc0ludGVybmFsLmxlbmd0aCA+PVxuICAgICAgTUFYX0xPQ0FMX1NFQ09OREFSWV9JTkRFWF9DT1VOVFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgIGBBIG1heGltdW0gbnVtYmVyIG9mIGxvY2FsIHNlY29uZGFyeSBpbmRleCBwZXIgdGFibGUgaXMgJHtNQVhfTE9DQUxfU0VDT05EQVJZX0lOREVYX0NPVU5UfWAsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlSW5kZXhOYW1lKHByb3BzLmluZGV4TmFtZSk7XG5cbiAgICBpZiAoIXRoaXMudGFibGVQYXJ0aXRpb25LZXkpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiVGFibGUgcGFydGl0aW9uIGtleSBtdXN0IGJlIGRlZmluZWQgYmVmb3JlIGFkZGluZyBsb2NhbCBzZWNvbmRhcnkgaW5kZXhcIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucmVnaXN0ZXJBdHRyaWJ1dGUodGhpcy50YWJsZVBhcnRpdGlvbktleSk7XG4gICAgdGhpcy5yZWdpc3RlckF0dHJpYnV0ZShwcm9wcy5zb3J0S2V5KTtcblxuICAgIGNvbnN0IGxzaVByb2plY3Rpb24gPSB0aGlzLmJ1aWxkSW5kZXhQcm9qZWN0aW9uKHByb3BzKTtcblxuICAgIHRoaXMubG9jYWxTZWNvbmRhcnlJbmRleGVzSW50ZXJuYWwucHVzaCh7XG4gICAgICBuYW1lOiBwcm9wcy5pbmRleE5hbWUsXG4gICAgICByYW5nZUtleTogcHJvcHMuc29ydEtleS5uYW1lLFxuICAgICAgcHJvamVjdGlvblR5cGU6IGxzaVByb2plY3Rpb24ucHJvamVjdGlvblR5cGUsXG4gICAgICBub25LZXlBdHRyaWJ1dGVzOiBsc2lQcm9qZWN0aW9uLm5vbktleUF0dHJpYnV0ZXMsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNlY29uZGFyeUluZGV4U2NoZW1hcy5zZXQocHJvcHMuaW5kZXhOYW1lLCB7XG4gICAgICBwYXJ0aXRpb25LZXk6IHRoaXMudGFibGVQYXJ0aXRpb25LZXksXG4gICAgICBzb3J0S2V5OiBwcm9wcy5zb3J0S2V5LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSByZWFkIGNhcGFjaXR5IHNjYWxpbmcgZm9yIHRoaXMgdGFibGVcbiAgICpcbiAgICogQHJldHVybnMgQW4gb2JqZWN0IHRvIGNvbmZpZ3VyZSBhZGRpdGlvbmFsIEF1dG9TY2FsaW5nIHNldHRpbmdzXG4gICAqL1xuICBwdWJsaWMgYXV0b1NjYWxlUmVhZENhcGFjaXR5KFxuICAgIHByb3BzOiBFbmFibGVTY2FsaW5nUHJvcHMsXG4gICk6IElTY2FsYWJsZVRhYmxlQXR0cmlidXRlIHtcbiAgICBpZiAodGhpcy50YWJsZVNjYWxpbmcuc2NhbGFibGVSZWFkQXR0cmlidXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIlJlYWQgQXV0b1NjYWxpbmcgYWxyZWFkeSBlbmFibGVkIGZvciB0aGlzIHRhYmxlXCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5iaWxsaW5nTW9kZSA9PT0gQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNUKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIkF1dG9TY2FsaW5nIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRhYmxlcyB3aXRoIFBBWV9QRVJfUkVRVUVTVCBiaWxsaW5nIG1vZGVcIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuICh0aGlzLnRhYmxlU2NhbGluZy5zY2FsYWJsZVJlYWRBdHRyaWJ1dGUgPVxuICAgICAgbmV3IFNjYWxhYmxlVGFibGVBdHRyaWJ1dGUodGhpcywgXCJSZWFkU2NhbGluZ1wiLCB7XG4gICAgICAgIHNlcnZpY2VOYW1lc3BhY2U6IGFwcHNjYWxpbmcuU2VydmljZU5hbWVzcGFjZS5EWU5BTU9EQixcbiAgICAgICAgcmVzb3VyY2VJZDogYHRhYmxlLyR7dGhpcy50YWJsZU5hbWV9YCxcbiAgICAgICAgZGltZW5zaW9uOiBcImR5bmFtb2RiOnRhYmxlOlJlYWRDYXBhY2l0eVVuaXRzXCIsXG4gICAgICAgIC8vIHJvbGU6IHRoaXMuc2NhbGluZ1JvbGUsIC8vIENvbW1lbnRpbmcgb3V0IC0gbGV0IFRlcnJhZm9ybSB1c2Ugc2VydmljZS1saW5rZWQgcm9sZVxuICAgICAgICAuLi5wcm9wcyxcbiAgICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgd3JpdGUgY2FwYWNpdHkgc2NhbGluZyBmb3IgdGhpcyB0YWJsZVxuICAgKlxuICAgKiBAcmV0dXJucyBBbiBvYmplY3QgdG8gY29uZmlndXJlIGFkZGl0aW9uYWwgQXV0b1NjYWxpbmcgc2V0dGluZ3MgZm9yIHRoaXMgYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgYXV0b1NjYWxlV3JpdGVDYXBhY2l0eShcbiAgICBwcm9wczogRW5hYmxlU2NhbGluZ1Byb3BzLFxuICApOiBJU2NhbGFibGVUYWJsZUF0dHJpYnV0ZSB7XG4gICAgaWYgKHRoaXMudGFibGVTY2FsaW5nLnNjYWxhYmxlV3JpdGVBdHRyaWJ1dGUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiV3JpdGUgQXV0b1NjYWxpbmcgYWxyZWFkeSBlbmFibGVkIGZvciB0aGlzIHRhYmxlXCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5iaWxsaW5nTW9kZSA9PT0gQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNUKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIkF1dG9TY2FsaW5nIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRhYmxlcyB3aXRoIFBBWV9QRVJfUkVRVUVTVCBiaWxsaW5nIG1vZGVcIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy50YWJsZVNjYWxpbmcuc2NhbGFibGVXcml0ZUF0dHJpYnV0ZSA9IG5ldyBTY2FsYWJsZVRhYmxlQXR0cmlidXRlKFxuICAgICAgdGhpcyxcbiAgICAgIFwiV3JpdGVTY2FsaW5nXCIsXG4gICAgICB7XG4gICAgICAgIHNlcnZpY2VOYW1lc3BhY2U6IGFwcHNjYWxpbmcuU2VydmljZU5hbWVzcGFjZS5EWU5BTU9EQixcbiAgICAgICAgcmVzb3VyY2VJZDogYHRhYmxlLyR7dGhpcy50YWJsZU5hbWV9YCxcbiAgICAgICAgZGltZW5zaW9uOiBcImR5bmFtb2RiOnRhYmxlOldyaXRlQ2FwYWNpdHlVbml0c1wiLFxuICAgICAgICAvLyByb2xlOiB0aGlzLnNjYWxpbmdSb2xlLCAvLyBDb21tZW50aW5nIG91dCAtIGxldCBUZXJyYWZvcm0gdXNlIHNlcnZpY2UtbGlua2VkIHJvbGVcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICB9LFxuICAgICk7XG4gICAgLy8gSWYgdGhlcmUgYXJlIHJlcGxpY2FzLCB0aGV5IGRlcGVuZCBvbiB0aGUgd3JpdGUgc2NhbGluZyBwb2xpY3kgb2YgdGhlIG1haW4gdGFibGUuXG4gICAgLy8gVGhpcyBpcyBub3QgZXhwbGljaXRseSBtb2RlbGVkIGluIFRGIGJ1dCB3YXMgaGFuZGxlZCBieSBDdXN0b21SZXNvdXJjZSBkZXBlbmRlbmNpZXMgaW4gQ0RLLlxuICAgIC8vIEZvciBURiwgdGhpcyBkZXBlbmRlbmN5IGlzIGltcGxpY2l0IGlmIHRoZSBwcm92aWRlciBoYW5kbGVzIGl0LCBvciBtaWdodCBuZWVkIGV4cGxpY2l0IGRlcGVuZHNPbiBpZiBpc3N1ZXMgYXJpc2UuXG4gICAgcmV0dXJuIHRoaXMudGFibGVTY2FsaW5nLnNjYWxhYmxlV3JpdGVBdHRyaWJ1dGU7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIHJlYWQgY2FwYWNpdHkgc2NhbGluZyBmb3IgdGhlIGdpdmVuIEdTSVxuICAgKlxuICAgKiBAcmV0dXJucyBBbiBvYmplY3QgdG8gY29uZmlndXJlIGFkZGl0aW9uYWwgQXV0b1NjYWxpbmcgc2V0dGluZ3MgZm9yIHRoaXMgYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgYXV0b1NjYWxlR2xvYmFsU2Vjb25kYXJ5SW5kZXhSZWFkQ2FwYWNpdHkoXG4gICAgaW5kZXhOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IEVuYWJsZVNjYWxpbmdQcm9wcyxcbiAgKTogSVNjYWxhYmxlVGFibGVBdHRyaWJ1dGUge1xuICAgIGlmICh0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiQXV0b1NjYWxpbmcgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGFibGVzIHdpdGggUEFZX1BFUl9SRVFVRVNUIGJpbGxpbmcgbW9kZVwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlUGFpciA9IHRoaXMuaW5kZXhTY2FsaW5nLmdldChpbmRleE5hbWUpO1xuICAgIGlmICghYXR0cmlidXRlUGFpcikge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYE5vIGdsb2JhbCBzZWNvbmRhcnkgaW5kZXggd2l0aCBuYW1lICR7aW5kZXhOYW1lfWAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYXR0cmlidXRlUGFpci5zY2FsYWJsZVJlYWRBdHRyaWJ1dGUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiUmVhZCBBdXRvU2NhbGluZyBhbHJlYWR5IGVuYWJsZWQgZm9yIHRoaXMgaW5kZXhcIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChhdHRyaWJ1dGVQYWlyLnNjYWxhYmxlUmVhZEF0dHJpYnV0ZSA9IG5ldyBTY2FsYWJsZVRhYmxlQXR0cmlidXRlKFxuICAgICAgdGhpcyxcbiAgICAgIGAke2luZGV4TmFtZX1SZWFkU2NhbGluZ2AsXG4gICAgICB7XG4gICAgICAgIHNlcnZpY2VOYW1lc3BhY2U6IGFwcHNjYWxpbmcuU2VydmljZU5hbWVzcGFjZS5EWU5BTU9EQixcbiAgICAgICAgcmVzb3VyY2VJZDogYHRhYmxlLyR7dGhpcy50YWJsZU5hbWV9L2luZGV4LyR7aW5kZXhOYW1lfWAsXG4gICAgICAgIGRpbWVuc2lvbjogXCJkeW5hbW9kYjppbmRleDpSZWFkQ2FwYWNpdHlVbml0c1wiLFxuICAgICAgICAvLyByb2xlOiB0aGlzLnNjYWxpbmdSb2xlLCAvLyBDb21tZW50aW5nIG91dCAtIGxldCBUZXJyYWZvcm0gdXNlIHNlcnZpY2UtbGlua2VkIHJvbGVcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICB9LFxuICAgICkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSB3cml0ZSBjYXBhY2l0eSBzY2FsaW5nIGZvciB0aGUgZ2l2ZW4gR1NJXG4gICAqXG4gICAqIEByZXR1cm5zIEFuIG9iamVjdCB0byBjb25maWd1cmUgYWRkaXRpb25hbCBBdXRvU2NhbGluZyBzZXR0aW5ncyBmb3IgdGhpcyBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyBhdXRvU2NhbGVHbG9iYWxTZWNvbmRhcnlJbmRleFdyaXRlQ2FwYWNpdHkoXG4gICAgaW5kZXhOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IEVuYWJsZVNjYWxpbmdQcm9wcyxcbiAgKTogSVNjYWxhYmxlVGFibGVBdHRyaWJ1dGUge1xuICAgIGlmICh0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIFwiQXV0b1NjYWxpbmcgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGFibGVzIHdpdGggUEFZX1BFUl9SRVFVRVNUIGJpbGxpbmcgbW9kZVwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlUGFpciA9IHRoaXMuaW5kZXhTY2FsaW5nLmdldChpbmRleE5hbWUpO1xuICAgIGlmICghYXR0cmlidXRlUGFpcikge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYE5vIGdsb2JhbCBzZWNvbmRhcnkgaW5kZXggd2l0aCBuYW1lICR7aW5kZXhOYW1lfWAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYXR0cmlidXRlUGFpci5zY2FsYWJsZVdyaXRlQXR0cmlidXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIldyaXRlIEF1dG9TY2FsaW5nIGFscmVhZHkgZW5hYmxlZCBmb3IgdGhpcyBpbmRleFwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGF0dHJpYnV0ZVBhaXIuc2NhbGFibGVXcml0ZUF0dHJpYnV0ZSA9IG5ldyBTY2FsYWJsZVRhYmxlQXR0cmlidXRlKFxuICAgICAgdGhpcyxcbiAgICAgIGAke2luZGV4TmFtZX1Xcml0ZVNjYWxpbmdgLFxuICAgICAge1xuICAgICAgICBzZXJ2aWNlTmFtZXNwYWNlOiBhcHBzY2FsaW5nLlNlcnZpY2VOYW1lc3BhY2UuRFlOQU1PREIsXG4gICAgICAgIHJlc291cmNlSWQ6IGB0YWJsZS8ke3RoaXMudGFibGVOYW1lfS9pbmRleC8ke2luZGV4TmFtZX1gLFxuICAgICAgICBkaW1lbnNpb246IFwiZHluYW1vZGI6aW5kZXg6V3JpdGVDYXBhY2l0eVVuaXRzXCIsXG4gICAgICAgIC8vIHJvbGU6IHRoaXMuc2NhbGluZ1JvbGUsIC8vIENvbW1lbnRpbmcgb3V0IC0gbGV0IFRlcnJhZm9ybSB1c2Ugc2VydmljZS1saW5rZWQgcm9sZVxuICAgICAgICAuLi5wcm9wcyxcbiAgICAgIH0sXG4gICAgKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNjaGVtYSBhdHRyaWJ1dGVzIG9mIHRhYmxlIG9yIGluZGV4LlxuICAgKlxuICAgKiBAcmV0dXJucyBTY2hlbWEgb2YgdGFibGUgb3IgaW5kZXguXG4gICAqL1xuICBwdWJsaWMgc2NoZW1hKGluZGV4TmFtZT86IHN0cmluZyk6IFNjaGVtYU9wdGlvbnMge1xuICAgIGlmICghaW5kZXhOYW1lKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXJ0aXRpb25LZXk6IHRoaXMudGFibGVQYXJ0aXRpb25LZXksXG4gICAgICAgIHNvcnRLZXk6IHRoaXMudGFibGVTb3J0S2V5LFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5zZWNvbmRhcnlJbmRleFNjaGVtYXMuZ2V0KGluZGV4TmFtZSk7XG4gICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgZmluZCBzY2hlbWEgZm9yIGluZGV4OiAke2luZGV4TmFtZX0uIFVzZSAnYWRkR2xvYmFsU2Vjb25kYXJ5SW5kZXgnIG9yICdhZGRMb2NhbFNlY29uZGFyeUluZGV4JyB0byBhZGQgaW5kZXhgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSB0YWJsZSBjb25zdHJ1Y3QuXG4gICAqXG4gICAqIEByZXR1cm5zIGFuIGFycmF5IG9mIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRhYmxlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBlcnJvcnMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgaWYgKCF0aGlzLnRhYmxlUGFydGl0aW9uS2V5KSB7XG4gICAgICBlcnJvcnMucHVzaChcIkEgcGFydGl0aW9uIGtleSBtdXN0IGJlIHNwZWNpZmllZFwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubG9jYWxTZWNvbmRhcnlJbmRleGVzSW50ZXJuYWwubGVuZ3RoID4gMCAmJiAhdGhpcy50YWJsZVNvcnRLZXkpIHtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICBcIkEgc29ydCBrZXkgb2YgdGhlIHRhYmxlIG11c3QgYmUgc3BlY2lmaWVkIHRvIGFkZCBsb2NhbCBzZWNvbmRhcnkgaW5kZXhlc1wiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLl9yZXBsaWNhcyAmJlxuICAgICAgdGhpcy5fcmVwbGljYXMubGVuZ3RoID4gMCAmJlxuICAgICAgdGhpcy5iaWxsaW5nTW9kZSA9PT0gQmlsbGluZ01vZGUuUFJPVklTSU9ORURcbiAgICApIHtcbiAgICAgIGNvbnN0IHdyaXRlQXV0b1NjYWxlQXR0cmlidXRlID0gdGhpcy50YWJsZVNjYWxpbmcuc2NhbGFibGVXcml0ZUF0dHJpYnV0ZTtcbiAgICAgIGlmICghd3JpdGVBdXRvU2NhbGVBdHRyaWJ1dGUpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICAgXCJBIGdsb2JhbCBUYWJsZSB0aGF0IHVzZXMgUFJPVklTSU9ORUQgYXMgdGhlIGJpbGxpbmcgbW9kZSBuZWVkcyBhdXRvLXNjYWxlZCB3cml0ZSBjYXBhY2l0eS4gXCIgK1xuICAgICAgICAgICAgXCJVc2UgdGhlIGF1dG9TY2FsZVdyaXRlQ2FwYWNpdHkoKSBtZXRob2QgdG8gZW5hYmxlIGl0LlwiLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICghd3JpdGVBdXRvU2NhbGVBdHRyaWJ1dGUuX3NjYWxpbmdQb2xpY3lDcmVhdGVkKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgIFwiQSBnbG9iYWwgVGFibGUgdGhhdCB1c2VzIFBST1ZJU0lPTkVEIGFzIHRoZSBiaWxsaW5nIG1vZGUgbmVlZHMgYXV0by1zY2FsZWQgd3JpdGUgY2FwYWNpdHkgd2l0aCBhIHBvbGljeS4gXCIgK1xuICAgICAgICAgICAgXCJDYWxsIG9uZSBvZiB0aGUgc2NhbGVPbiooKSBtZXRob2RzIG9mIHRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSBhdXRvU2NhbGVXcml0ZUNhcGFjaXR5KClcIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHJlYWQgYW5kIHdyaXRlIGNhcGFjaXR5IGFyZSBub3Qgc3BlY2lmaWVkIGZvciBvbi1kZW1hbmQgdGFibGVzIChiaWxsaW5nIG1vZGUgUEFZX1BFUl9SRVFVRVNUKS5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIHJlYWQgYW5kIHdyaXRlIGNhcGFjaXR5IHByb3BlcnRpZXNcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQcm92aXNpb25pbmcocHJvcHM6IHtcbiAgICByZWFkQ2FwYWNpdHk/OiBudW1iZXI7XG4gICAgd3JpdGVDYXBhY2l0eT86IG51bWJlcjtcbiAgfSkge1xuICAgIGlmICh0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcHMucmVhZENhcGFjaXR5ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgcHJvcHMud3JpdGVDYXBhY2l0eSAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBcIllvdSBjYW5ub3QgcHJvdmlzaW9uIHJlYWQgYW5kIHdyaXRlIGNhcGFjaXR5IGZvciBhIHRhYmxlIHdpdGggUEFZX1BFUl9SRVFVRVNUIGJpbGxpbmcgbW9kZVwiLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVByb3Zpc2lvbmluZ0dTSShwcm9wczogR2xvYmFsU2Vjb25kYXJ5SW5kZXhQcm9wcykge1xuICAgIGlmICh0aGlzLmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcHMucmVhZENhcGFjaXR5ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgcHJvcHMud3JpdGVDYXBhY2l0eSAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBcIllvdSBjYW5ub3QgcHJvdmlzaW9uIHJlYWQgYW5kIHdyaXRlIGNhcGFjaXR5IGZvciBhIEdTSSB3aXRoIFBBWV9QRVJfUkVRVUVTVCBiaWxsaW5nIG1vZGUgb24gdGhlIHRhYmxlXCIsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgaW5kZXggbmFtZSB0byBjaGVjayBpZiBhIGR1cGxpY2F0ZSBuYW1lIGFscmVhZHkgZXhpc3RzLlxuICAgKlxuICAgKiBAcGFyYW0gaW5kZXhOYW1lIGEgbmFtZSBvZiBnbG9iYWwgb3IgbG9jYWwgc2Vjb25kYXJ5IGluZGV4XG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlSW5kZXhOYW1lKGluZGV4TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuc2Vjb25kYXJ5SW5kZXhTY2hlbWFzLmhhcyhpbmRleE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgQSBkdXBsaWNhdGUgaW5kZXggbmFtZSwgJHtpbmRleE5hbWV9LCBpcyBub3QgYWxsb3dlZGAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBub24ta2V5IGF0dHJpYnV0ZXMgYnkgY2hlY2tpbmcgbGltaXRzIHdpdGhpbiBzZWNvbmRhcnkgaW5kZXgsIHdoaWNoIG1heSB2YXJ5IGluIGZ1dHVyZS5cbiAgICpcbiAgICogQHBhcmFtIG5vbktleUF0dHJpYnV0ZXMgYSBsaXN0IG9mIG5vbi1rZXkgYXR0cmlidXRlIG5hbWVzXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTm9uS2V5QXR0cmlidXRlcyhub25LZXlBdHRyaWJ1dGVzOiBzdHJpbmdbXSkge1xuICAgIGlmICh0aGlzLm5vbktleUF0dHJpYnV0ZXMuc2l6ZSArIG5vbktleUF0dHJpYnV0ZXMubGVuZ3RoID4gMTAwKSB7XG4gICAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9uZHluYW1vZGIvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL0xpbWl0cy5odG1sI2xpbWl0cy1zZWNvbmRhcnktaW5kZXhlc1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgIFwiQSBtYXhpbXVtIG51bWJlciBvZiBub25LZXlBdHRyaWJ1dGVzIGFjcm9zcyBhbGwgb2Ygc2Vjb25kYXJ5IGluZGV4ZXMgaXMgMTAwXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIHN0b3JlIGFsbCBub24ta2V5IGF0dHJpYnV0ZXNcbiAgICBub25LZXlBdHRyaWJ1dGVzLmZvckVhY2goKGF0dCkgPT4gdGhpcy5ub25LZXlBdHRyaWJ1dGVzLmFkZChhdHQpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyUG9pbnRJblRpbWVSZWNvdmVyeShcbiAgICBwcm9wczogVGFibGVQcm9wcyxcbiAgKTogZHluYW1vZGJUYWJsZS5EeW5hbW9kYlRhYmxlUG9pbnRJblRpbWVSZWNvdmVyeSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKFxuICAgICAgcHJvcHMucG9pbnRJblRpbWVSZWNvdmVyeVNwZWNpZmljYXRpb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcHJvcHMucG9pbnRJblRpbWVSZWNvdmVyeSAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcImBwb2ludEluVGltZVJlY292ZXJ5U3BlY2lmaWNhdGlvbmAgYW5kIGBwb2ludEluVGltZVJlY292ZXJ5YCBhcmUgc2V0LiBVc2UgYHBvaW50SW5UaW1lUmVjb3ZlcnlTcGVjaWZpY2F0aW9uYCBvbmx5LlwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGVjID0gcHJvcHMucG9pbnRJblRpbWVSZWNvdmVyeVNwZWNpZmljYXRpb247XG4gICAgY29uc3QgcmVjb3ZlcnlQZXJpb2RJbkRheXMgPSBzcGVjPy5yZWNvdmVyeVBlcmlvZEluRGF5cztcbiAgICBpZiAoIXNwZWM/LnBvaW50SW5UaW1lUmVjb3ZlcnlFbmFibGVkICYmIHJlY292ZXJ5UGVyaW9kSW5EYXlzKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIkNhbm5vdCBzZXQgYHJlY292ZXJ5UGVyaW9kSW5EYXlzYCB3aGlsZSBgcG9pbnRJblRpbWVSZWNvdmVyeUVuYWJsZWRgIGlzIHNldCB0byBmYWxzZS5cIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgcmVjb3ZlcnlQZXJpb2RJbkRheXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKHJlY292ZXJ5UGVyaW9kSW5EYXlzIDwgMSB8fCByZWNvdmVyeVBlcmlvZEluRGF5cyA+IDM1KVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCJgcmVjb3ZlcnlQZXJpb2RJbkRheXNgIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIGAxYCBhbmQgYDM1YC5cIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5hYmxlZCA9XG4gICAgICBzcGVjPy5wb2ludEluVGltZVJlY292ZXJ5RW5hYmxlZCA/PyBwcm9wcy5wb2ludEluVGltZVJlY292ZXJ5O1xuICAgIGlmIChlbmFibGVkID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgZW5hYmxlZCwgcmVjb3ZlcnlQZXJpb2RJbkRheXMgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ29udHJpYnV0b3JJbnNpZ2h0cyhcbiAgICBwcm9wczogSUNvbnRyaWJ1dG9ySW5zaWdodHNDb25maWd1cmFibGUsXG4gICk6IENvbnRyaWJ1dG9ySW5zaWdodHNTcGVjaWZpY2F0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdmFsaWRhdGVDb250cmlidXRvckluc2lnaHRzKFxuICAgICAgcHJvcHMuY29udHJpYnV0b3JJbnNpZ2h0c0VuYWJsZWQsXG4gICAgICBwcm9wcy5jb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbixcbiAgICAgIFwiY29udHJpYnV0b3JJbnNpZ2h0c0VuYWJsZWRcIixcbiAgICAgIHRoaXMsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRJbmRleFByb2plY3Rpb24oXG4gICAgcHJvcHM6IFNlY29uZGFyeUluZGV4UHJvcHMsXG4gICk6IFBpY2s8XG4gICAgZHluYW1vZGJUYWJsZS5EeW5hbW9kYlRhYmxlR2xvYmFsU2Vjb25kYXJ5SW5kZXgsXG4gICAgXCJwcm9qZWN0aW9uVHlwZVwiIHwgXCJub25LZXlBdHRyaWJ1dGVzXCJcbiAgPiB7XG4gICAgaWYgKFxuICAgICAgcHJvcHMucHJvamVjdGlvblR5cGUgPT09IFByb2plY3Rpb25UeXBlLklOQ0xVREUgJiZcbiAgICAgICFwcm9wcy5ub25LZXlBdHRyaWJ1dGVzXG4gICAgKSB7XG4gICAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1keW5hbW9kYi1wcm9qZWN0aW9ub2JqZWN0Lmh0bWxcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBOb24ta2V5IGF0dHJpYnV0ZXMgc2hvdWxkIGJlIHNwZWNpZmllZCB3aGVuIHVzaW5nICR7UHJvamVjdGlvblR5cGUuSU5DTFVERX0gcHJvamVjdGlvbiB0eXBlYCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgcHJvcHMucHJvamVjdGlvblR5cGUgIT09IFByb2plY3Rpb25UeXBlLklOQ0xVREUgJiZcbiAgICAgIHByb3BzLm5vbktleUF0dHJpYnV0ZXNcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBOb24ta2V5IGF0dHJpYnV0ZXMgc2hvdWxkIG5vdCBiZSBzcGVjaWZpZWQgd2hlbiBub3QgdXNpbmcgJHtQcm9qZWN0aW9uVHlwZS5JTkNMVURFfSBwcm9qZWN0aW9uIHR5cGVgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMubm9uS2V5QXR0cmlidXRlcykge1xuICAgICAgdGhpcy52YWxpZGF0ZU5vbktleUF0dHJpYnV0ZXMocHJvcHMubm9uS2V5QXR0cmlidXRlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb2plY3Rpb25UeXBlOiBwcm9wcy5wcm9qZWN0aW9uVHlwZSA/PyBQcm9qZWN0aW9uVHlwZS5BTEwsXG4gICAgICBub25LZXlBdHRyaWJ1dGVzOiBwcm9wcy5ub25LZXlBdHRyaWJ1dGVzLFxuICAgIH07XG4gIH1cblxuICAvLyBUT0RPOiBrZXlUeXBlIGlzIHVudXNlZFxuICBwcml2YXRlIGFkZEtleShhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgX2tleVR5cGU6IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nQXR0ciA9IHRoaXMuYXR0cmlidXRlRGVmaW5pdGlvbnNJbnRlcm5hbC5maW5kKFxuICAgICAgKGRlZikgPT4gZGVmLm5hbWUgPT09IGF0dHJpYnV0ZS5uYW1lLFxuICAgICk7XG4gICAgaWYgKGV4aXN0aW5nQXR0ciAmJiBleGlzdGluZ0F0dHIudHlwZSAhPT0gYXR0cmlidXRlLnR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBVbmFibGUgdG8gc3BlY2lmeSAke2F0dHJpYnV0ZS5uYW1lfSBhcyAke2F0dHJpYnV0ZS50eXBlfSBiZWNhdXNlIGl0IHdhcyBhbHJlYWR5IGRlZmluZWQgYXMgJHtleGlzdGluZ0F0dHIudHlwZX1gLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFleGlzdGluZ0F0dHIpIHtcbiAgICAgIHRoaXMuYXR0cmlidXRlRGVmaW5pdGlvbnNJbnRlcm5hbC5wdXNoKHtcbiAgICAgICAgbmFtZTogYXR0cmlidXRlLm5hbWUsXG4gICAgICAgIHR5cGU6IGF0dHJpYnV0ZS50eXBlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIEZvciB0aGUgbWFpbiB0YWJsZSwgaGFzaEtleSBhbmQgcmFuZ2VLZXkgYXJlIHNldCBkaXJlY3RseSBvbiB0aGUgcmVzb3VyY2UuXG4gICAgLy8gRm9yIEdTSXMvTFNJcywgdGhleSBhcmUgcGFydCBvZiB0aGVpciByZXNwZWN0aXZlIGJsb2Nrcy5cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciB0aGUga2V5IGF0dHJpYnV0ZSBvZiB0YWJsZSBvciBzZWNvbmRhcnkgaW5kZXggdG8gYXNzZW1ibGUgYXR0cmlidXRlIGRlZmluaXRpb25zIG9mIFRhYmxlUmVzb3VyY2VQcm9wcy5cbiAgICpcbiAgICogQHBhcmFtIGF0dHJpYnV0ZSB0aGUga2V5IGF0dHJpYnV0ZSBvZiB0YWJsZSBvciBzZWNvbmRhcnkgaW5kZXhcbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJBdHRyaWJ1dGUoYXR0cmlidXRlOiBBdHRyaWJ1dGUpIHtcbiAgICBjb25zdCBleGlzdGluZ0RlZiA9IHRoaXMuYXR0cmlidXRlRGVmaW5pdGlvbnNJbnRlcm5hbC5maW5kKFxuICAgICAgKGRlZikgPT4gZGVmLm5hbWUgPT09IGF0dHJpYnV0ZS5uYW1lLFxuICAgICk7XG4gICAgaWYgKGV4aXN0aW5nRGVmICYmIGV4aXN0aW5nRGVmLnR5cGUgIT09IGF0dHJpYnV0ZS50eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgVW5hYmxlIHRvIHNwZWNpZnkgJHthdHRyaWJ1dGUubmFtZX0gYXMgJHthdHRyaWJ1dGUudHlwZX0gYmVjYXVzZSBpdCB3YXMgYWxyZWFkeSBkZWZpbmVkIGFzICR7ZXhpc3RpbmdEZWYudHlwZX1gLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFleGlzdGluZ0RlZikge1xuICAgICAgdGhpcy5hdHRyaWJ1dGVEZWZpbml0aW9uc0ludGVybmFsLnB1c2goe1xuICAgICAgICBuYW1lOiBhdHRyaWJ1dGUubmFtZSxcbiAgICAgICAgdHlwZTogYXR0cmlidXRlLnR5cGUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBDb21tZW50aW5nIG91dCBtYWtlU2NhbGluZ1JvbGUgbWV0aG9kIC0gVGVycmFmb3JtIGhhbmRsZXMgc2VydmljZS1saW5rZWQgcm9sZXMgYXV0b21hdGljYWxseVxuICAvLyBVbmxpa2UgQVdTIENESyBDbG91ZEZvcm1hdGlvbiBpbXBsZW1lbnRhdGlvbiwgVGVycmFmb3JtIEFXUyBwcm92aWRlciBjcmVhdGVzIGFwcHJvcHJpYXRlXG4gIC8vIHNlcnZpY2UtbGlua2VkIHJvbGVzIHdoZW4gcm9sZUFybiBpcyBvbWl0dGVkIGZyb20gYXdzX2FwcGF1dG9zY2FsaW5nX3RhcmdldCByZXNvdXJjZVxuICAvLyBwcml2YXRlIG1ha2VTY2FsaW5nUm9sZSgpOiBpYW0uSVJvbGUge1xuICAvLyAgIC8vIFVzZSBhIFNlcnZpY2UgTGlua2VkIFJvbGUuXG4gIC8vICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F1dG9zY2FsaW5nL2FwcGxpY2F0aW9uL3VzZXJndWlkZS9hcHBsaWNhdGlvbi1hdXRvLXNjYWxpbmctc2VydmljZS1saW5rZWQtcm9sZXMuaHRtbFxuICAvLyAgIHJldHVybiBpYW0uUm9sZS5mcm9tUm9sZUFybihcbiAgLy8gICAgIHRoaXMsXG4gIC8vICAgICBcIlNjYWxpbmdSb2xlXCIsXG4gIC8vICAgICB0aGlzLnN0YWNrLmZvcm1hdEFybih7XG4gIC8vICAgICAgIHNlcnZpY2U6IFwiaWFtXCIsXG4gIC8vICAgICAgIHJlZ2lvbjogXCJcIiwgLy8gU0xScyBhcmUgZ2xvYmFsXG4gIC8vICAgICAgIHJlc291cmNlOlxuICAvLyAgICAgICAgIFwicm9sZS9hd3Mtc2VydmljZS1yb2xlL2R5bmFtb2RiLmFwcGxpY2F0aW9uLWF1dG9zY2FsaW5nLmFtYXpvbmF3cy5jb21cIixcbiAgLy8gICAgICAgcmVzb3VyY2VOYW1lOiBcIkFXU1NlcnZpY2VSb2xlRm9yQXBwbGljYXRpb25BdXRvU2NhbGluZ19EeW5hbW9EQlRhYmxlXCIsXG4gIC8vICAgICAgIC8vIFRPRE86IElzIHRoaXMgbmVlZGVkP1xuICAvLyAgICAgICAvLyBhcm5Gb3JtYXQ6IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9TTEFTSF9SRVNPVVJDRV9OQU1FLCAvLyBTcGVjaWFsIGZvcm1hdCBmb3IgU0xSc1xuICAvLyAgICAgfSksXG4gIC8vICAgKTtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHJlcGxpY2EgdGFibGVzXG4gICAqXG4gICAqIEBwYXJhbSByZWdpb25zIHJlZ2lvbnMgd2hlcmUgdG8gY3JlYXRlIHRhYmxlc1xuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJSZXBsaWNhcyhcbiAgICByZWdpb25zPzogc3RyaW5nW10sXG4gICAgcmVwbGljYVNwZWNpZmljYXRpb24/OiBEeW5hbW9kYlRhYmxlUmVwbGljYVtdLFxuICApOiBkeW5hbW9kYlRhYmxlLkR5bmFtb2RiVGFibGVSZXBsaWNhW10gfCB1bmRlZmluZWQge1xuICAgIGlmIChyZXBsaWNhU3BlY2lmaWNhdGlvbiAmJiByZXBsaWNhU3BlY2lmaWNhdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQodGhpcy5zdGFjay5yZWdpb24pICYmXG4gICAgICAgIHJlcGxpY2FTcGVjaWZpY2F0aW9uLnNvbWUoXG4gICAgICAgICAgKHJlcGxpY2EpID0+IHJlcGxpY2EucmVnaW9uTmFtZSA9PT0gdGhpcy5zdGFjay5yZWdpb24sXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIFwiYHJlcGxpY2FTcGVjaWZpY2F0aW9uYCBjYW5ub3QgaW5jbHVkZSB0aGUgcmVnaW9uIHdoZXJlIHRoaXMgc3RhY2sgaXMgZGVwbG95ZWQuXCIsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXBsaWNhU3BlY2lmaWNhdGlvbi5tYXAoKHJlcGxpY2EpID0+ICh7XG4gICAgICAgIHJlZ2lvbk5hbWU6IHJlcGxpY2EucmVnaW9uTmFtZSxcbiAgICAgICAga21zS2V5QXJuOiByZXBsaWNhLmVuY3J5cHRpb25LZXk/LmtleUFybixcbiAgICAgICAgcG9pbnRJblRpbWVSZWNvdmVyeTogcmVwbGljYS5wb2ludEluVGltZVJlY292ZXJ5LFxuICAgICAgICBwcm9wYWdhdGVUYWdzOiByZXBsaWNhLnByb3BhZ2F0ZVRhZ3MsXG4gICAgICB9KSk7XG4gICAgfVxuICAgIGlmICghcmVnaW9ucyB8fCByZWdpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGlmIChcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQodGhpcy5zdGFjay5yZWdpb24pICYmXG4gICAgICByZWdpb25zLmluY2x1ZGVzKHRoaXMuc3RhY2sucmVnaW9uKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCJgcmVwbGljYXRpb25SZWdpb25zYCBjYW5ub3QgaW5jbHVkZSB0aGUgcmVnaW9uIHdoZXJlIHRoaXMgc3RhY2sgaXMgZGVwbG95ZWQuXCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBbLi4ubmV3IFNldChyZWdpb25zKV0ubWFwKChyZWdpb24pID0+ICh7XG4gICAgICByZWdpb25OYW1lOiByZWdpb24sXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyB0YWJsZSBoYXMgaW5kZXhlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBoYXNJbmRleCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5nbG9iYWxTZWNvbmRhcnlJbmRleGVzSW50ZXJuYWwubGVuZ3RoICtcbiAgICAgICAgdGhpcy5sb2NhbFNlY29uZGFyeUluZGV4ZXNJbnRlcm5hbC5sZW5ndGggPlxuICAgICAgMFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVwIGtleSBwcm9wZXJ0aWVzIGFuZCByZXR1cm4gdGhlIFRhYmxlIGVuY3J5cHRpb24gcHJvcGVydHkgZnJvbSB0aGVcbiAgICogdXNlcidzIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwcml2YXRlIHBhcnNlRW5jcnlwdGlvbihwcm9wczogVGFibGVQcm9wcyk6IHtcbiAgICBzc2VTcGVjaWZpY2F0aW9uPzogZHluYW1vZGJUYWJsZS5EeW5hbW9kYlRhYmxlU2VydmVyU2lkZUVuY3J5cHRpb247XG4gICAgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuICB9IHtcbiAgICBsZXQgZW5jcnlwdGlvblR5cGUgPSBwcm9wcy5lbmNyeXB0aW9uO1xuXG4gICAgaWYgKGVuY3J5cHRpb25UeXBlICE9IG51bGwgJiYgcHJvcHMuc2VydmVyU2lkZUVuY3J5cHRpb24gIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgXCJPbmx5IG9uZSBvZiBlbmNyeXB0aW9uIGFuZCBzZXJ2ZXJTaWRlRW5jcnlwdGlvbiBjYW4gYmUgc3BlY2lmaWVkLCBidXQgYm90aCB3ZXJlIHByb3ZpZGVkXCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5zZXJ2ZXJTaWRlRW5jcnlwdGlvbiAmJiBwcm9wcy5lbmNyeXB0aW9uS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcImVuY3J5cHRpb25LZXkgY2Fubm90IGJlIHNwZWNpZmllZCB3aGVuIHNlcnZlclNpZGVFbmNyeXB0aW9uIGlzIHNwZWNpZmllZC4gVXNlIGVuY3J5cHRpb24gaW5zdGVhZFwiLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZW5jcnlwdGlvblR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZW5jcnlwdGlvblR5cGUgPVxuICAgICAgICBwcm9wcy5lbmNyeXB0aW9uS2V5ICE9IG51bGxcbiAgICAgICAgICA/IC8vIElmIHRoZXJlIGlzIGEgY29uZmlndXJlZCBlbmNyeXB0aW9uS2V5LCB0aGUgZW5jcnlwdGlvbiBpcyBpbXBsaWNpdGx5IENVU1RPTUVSX01BTkFHRURcbiAgICAgICAgICAgIFRhYmxlRW5jcnlwdGlvbi5DVVNUT01FUl9NQU5BR0VEXG4gICAgICAgICAgOiAvLyBPdGhlcndpc2UsIGlmIHNldmVyU2lkZUVuY3J5cHRpb24gaXMgZW5hYmxlZCwgaXQncyBBV1NfTUFOQUdFRDsgZWxzZSB1bmRlZmluZWQgKGRvIG5vdCBzZXQgYW55dGhpbmcpXG4gICAgICAgICAgICBwcm9wcy5zZXJ2ZXJTaWRlRW5jcnlwdGlvblxuICAgICAgICAgICAgPyBUYWJsZUVuY3J5cHRpb24uQVdTX01BTkFHRURcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGVuY3J5cHRpb25UeXBlICE9PSBUYWJsZUVuY3J5cHRpb24uQ1VTVE9NRVJfTUFOQUdFRCAmJlxuICAgICAgcHJvcHMuZW5jcnlwdGlvbktleVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYGVuY3J5cHRpb25LZXkgY2Fubm90IGJlIHNwZWNpZmllZCB1bmxlc3MgZW5jcnlwdGlvbiBpcyBzZXQgdG8gVGFibGVFbmNyeXB0aW9uLkNVU1RPTUVSX01BTkFHRUQgKGl0IHdhcyBzZXQgdG8gJHtlbmNyeXB0aW9uVHlwZX0pYCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gaW4gdGhpcyBjYXNlLCBlYWNoIHJlcGxpY2Egc2hvdWxkIHNwZWNpZnkgYSBDdXN0b21lciBLTVMga2V5LlxuICAgIGlmIChcbiAgICAgIGVuY3J5cHRpb25UeXBlID09PSBUYWJsZUVuY3J5cHRpb24uQ1VTVE9NRVJfTUFOQUdFRCAmJlxuICAgICAgcHJvcHMucmVwbGljYXRpb25SZWdpb25zXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIlRhYmxlRW5jcnlwdGlvbi5DVVNUT01FUl9NQU5BR0VEIGlzIG5vdCBzdXBwb3J0ZWQgYnkgRHluYW1vREIgR2xvYmFsIFRhYmxlcyAod2hlcmUgcmVwbGljYXRpb25SZWdpb25zIHdhcyBzZXQpXCIsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHByb3BzLnJlcGxpY2FTcGVjaWZpY2F0aW9uICYmXG4gICAgICBwcm9wcy5yZXBsaWNhU3BlY2lmaWNhdGlvbi5sZW5ndGggPiAwICYmXG4gICAgICBlbmNyeXB0aW9uVHlwZSA9PT0gVGFibGVFbmNyeXB0aW9uLkNVU1RPTUVSX01BTkFHRURcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcHMucmVwbGljYVNwZWNpZmljYXRpb24uc29tZShcbiAgICAgICAgICAocmVwbGljYSkgPT4gIXJlcGxpY2EuZW5jcnlwdGlvbktleSwgLy8gQ2hlY2sgaWYgYW55IHJlcGxpY2EgaXMgbWlzc2luZyBhbiBlbmNyeXB0aW9uIGtleVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBcIldoZW4gdXNpbmcgcmVwbGljYVNwZWNpZmljYXRpb24sIGVhY2ggcmVwbGljYSBtdXN0IHNwZWNpZnkgYW4gZW5jcnlwdGlvbktleSBpZiBUYWJsZUVuY3J5cHRpb24uQ1VTVE9NRVJfTUFOQUdFRCBpcyB1c2VkXCIsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy9WYWxpZGF0ZSB0aGF0IHRoZSBrZXlzIGJlbG9uZyB0byB0aGUgY29ycmVjdCByZWdpb25zXG4gICAgICBpZiAoXG4gICAgICAgIHByb3BzLnJlcGxpY2FTcGVjaWZpY2F0aW9uLnNvbWUoXG4gICAgICAgICAgKHJlcGxpY2EpID0+XG4gICAgICAgICAgICByZXBsaWNhLmVuY3J5cHRpb25LZXkgJiZcbiAgICAgICAgICAgIHJlcGxpY2EuZW5jcnlwdGlvbktleS5lbnYucmVnaW9uICE9PSByZXBsaWNhLnJlZ2lvbk5hbWUsXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIFwiV2hlbiB1c2luZyByZXBsaWNhU3BlY2lmaWNhdGlvbiwgZWFjaCByZXBsaWNhJ3MgZW5jcnlwdGlvbktleSBtdXN0IGJlIGluIHRoZSBzYW1lIHJlZ2lvbiBhcyBpdHMgcmVwbGljYVwiLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChlbmNyeXB0aW9uVHlwZSkge1xuICAgICAgY2FzZSBUYWJsZUVuY3J5cHRpb24uQ1VTVE9NRVJfTUFOQUdFRDpcbiAgICAgICAgY29uc3Qga2V5ID1cbiAgICAgICAgICBwcm9wcy5lbmNyeXB0aW9uS2V5ID8/XG4gICAgICAgICAgbmV3IGttcy5LZXkodGhpcywgXCJLZXlcIiwge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBDdXN0b21lci1tYW5hZ2VkIGtleSBhdXRvLWNyZWF0ZWQgZm9yIGVuY3J5cHRpbmcgRHluYW1vREIgdGFibGUgYXQgJHt0aGlzLm5vZGUucGF0aH1gLFxuICAgICAgICAgICAgZW5hYmxlS2V5Um90YXRpb246IHRydWUsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzc2VTcGVjaWZpY2F0aW9uOiB7IGVuYWJsZWQ6IHRydWUsIGttc0tleUFybjoga2V5LmtleUFybiB9LFxuICAgICAgICAgIGVuY3J5cHRpb25LZXk6IGtleSxcbiAgICAgICAgfTtcblxuICAgICAgY2FzZSBUYWJsZUVuY3J5cHRpb24uQVdTX01BTkFHRUQ6XG4gICAgICAgIHJldHVybiB7IHNzZVNwZWNpZmljYXRpb246IHsgZW5hYmxlZDogdHJ1ZSB9IH07IC8vIFVzZXMgYWxpYXMvYXdzL2R5bmFtb2RiIGJ5IGRlZmF1bHRcbiAgICAgIGNhc2UgVGFibGVFbmNyeXB0aW9uLkRFRkFVTFQ6XG4gICAgICAgIHJldHVybiB7IHNzZVNwZWNpZmljYXRpb246IHsgZW5hYmxlZDogZmFsc2UgfSB9OyAvLyBBV1Mtb3duZWQga2V5XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgcmV0dXJuIHsgc3NlU3BlY2lmaWNhdGlvbjogdW5kZWZpbmVkIH07IC8vIERlZmF1bHRzIHRvIEFXUy1vd25lZCBrZXlcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgYFVuZXhwZWN0ZWQgJ2VuY3J5cHRpb25UeXBlJzogJHtlbmNyeXB0aW9uVHlwZX1gLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJJbXBvcnRTb3VyY2VTcGVjaWZpY2F0aW9uKFxuICAgIGltcG9ydFNvdXJjZT86IEltcG9ydFNvdXJjZVNwZWNpZmljYXRpb24sXG4gICk6IGR5bmFtb2RiVGFibGUuRHluYW1vZGJUYWJsZUltcG9ydFRhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWltcG9ydFNvdXJjZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCByZW5kZXJlZElucHV0Rm9ybWF0ID0gaW1wb3J0U291cmNlLmlucHV0Rm9ybWF0Ll9yZW5kZXIoKTtcbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXRGb3JtYXQ6IHJlbmRlcmVkSW5wdXRGb3JtYXQuaW5wdXRGb3JtYXQsXG4gICAgICBpbnB1dEZvcm1hdE9wdGlvbnM6IHJlbmRlcmVkSW5wdXRGb3JtYXQuaW5wdXRGb3JtYXRPcHRpb25zLFxuICAgICAgaW5wdXRDb21wcmVzc2lvblR5cGU6IGltcG9ydFNvdXJjZS5jb21wcmVzc2lvblR5cGUsXG4gICAgICBzM0J1Y2tldFNvdXJjZToge1xuICAgICAgICBidWNrZXQ6IGltcG9ydFNvdXJjZS5idWNrZXQuYnVja2V0TmFtZSxcbiAgICAgICAgYnVja2V0T3duZXI6IGltcG9ydFNvdXJjZS5idWNrZXRPd25lcixcbiAgICAgICAga2V5UHJlZml4OiBpbXBvcnRTb3VyY2Uua2V5UHJlZml4LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcmVzb3VyY2UgdG8gdGhlIFRlcnJhZm9ybSBKU09OIG91dHB1dCBhdCBTeW50aCB0aW1lLlxuICAgKlxuICAgKiBjYWxsZWQgYnkgVGVycmFmb3JtU3RhY2sucHJlcGFyZVN0YWNrKClcbiAgICovXG4gIHB1YmxpYyB0b1RlcnJhZm9ybSgpOiBhbnkge1xuICAgIC8qKlxuICAgICAqIEEgcHJlcGFyaW5nIHJlc29sdmUgbWlnaHQgYWRkIG5ldyByZXNvdXJjZXMgdG8gdGhlIHN0YWNrXG4gICAgICovXG4gICAgZm9yIChjb25zdCBnc2kgb2YgdGhpcy5nbG9iYWxTZWNvbmRhcnlJbmRleGVzSW50ZXJuYWwpIHtcbiAgICAgIGlmIChnc2kuY29udHJpYnV0b3JJbnNpZ2h0c1NwZWNpZmljYXRpb24/LmVuYWJsZWQpIHtcbiAgICAgICAgbmV3IGR5bmFtb2RiQ29udHJpYnV0b3JJbnNpZ2h0cy5EeW5hbW9kYkNvbnRyaWJ1dG9ySW5zaWdodHMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBcIkNvbnRyaWJ1dG9ySW5zaWdodHNcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0YWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLFxuICAgICAgICAgICAgaW5kZXhOYW1lOiBnc2kubmFtZSxcbiAgICAgICAgICAgIG1vZGU6IGdzaS5jb250cmlidXRvckluc2lnaHRzU3BlY2lmaWNhdGlvbj8ubW9kZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICBkZWxldGUgZ3NpLmNvbnRyaWJ1dG9ySW5zaWdodHNTcGVjaWZpY2F0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqXG4gKiBKdXN0IGEgY29udmVuaWVudCB3YXkgdG8ga2VlcCB0cmFjayBvZiBib3RoIGF0dHJpYnV0ZXNcbiAqL1xuaW50ZXJmYWNlIFNjYWxhYmxlQXR0cmlidXRlUGFpciB7XG4gIHNjYWxhYmxlUmVhZEF0dHJpYnV0ZT86IFNjYWxhYmxlVGFibGVBdHRyaWJ1dGU7XG4gIHNjYWxhYmxlV3JpdGVBdHRyaWJ1dGU/OiBTY2FsYWJsZVRhYmxlQXR0cmlidXRlO1xufVxuIl19
|