terraconstructs 0.0.10 → 0.0.12
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 +104486 -34582
- package/lib/aws/arn.js +1 -1
- package/lib/aws/aws-construct.d.ts +1 -1
- package/lib/aws/aws-construct.js +28 -2
- package/lib/aws/aws-stack.d.ts +2 -4
- package/lib/aws/aws-stack.js +21 -8
- package/lib/aws/aws-tags.d.ts +58 -0
- package/lib/aws/aws-tags.js +77 -0
- package/lib/aws/cloudwatch/actions/ec2.js +1 -1
- package/lib/aws/cloudwatch/actions/lambda.js +1 -1
- 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.d.ts +1 -1
- package/lib/aws/cloudwatch/metric-filter.js +4 -4
- 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/private/env-tokens.js +5 -6
- package/lib/aws/cloudwatch/private/metric-util.js +4 -5
- package/lib/aws/cloudwatch/private/object.js +2 -3
- package/lib/aws/cloudwatch/private/rendering.js +3 -3
- package/lib/aws/cloudwatch/private/statistic.js +6 -7
- package/lib/aws/cloudwatch/query-definition.js +2 -2
- package/lib/aws/cloudwatch/stats.js +1 -1
- package/lib/aws/cloudwatch/subscription-filter.d.ts +1 -1
- package/lib/aws/cloudwatch/subscription-filter.js +4 -4
- package/lib/aws/cloudwatch/text.js +1 -1
- package/lib/aws/cloudwatch/variable.js +3 -3
- package/lib/aws/cloudwatch/widget.d.ts +1 -1
- package/lib/aws/cloudwatch/widget.js +4 -4
- package/lib/aws/compute/activity.js +3 -2
- package/lib/aws/compute/alb/application-listener-action.d.ts +334 -0
- package/lib/aws/compute/alb/application-listener-action.js +281 -0
- package/lib/aws/compute/alb/application-listener-certificate.d.ts +35 -0
- package/lib/aws/compute/alb/application-listener-certificate.js +35 -0
- package/lib/aws/compute/alb/application-listener-rule.d.ts +233 -0
- package/lib/aws/compute/alb/application-listener-rule.js +220 -0
- package/lib/aws/compute/alb/application-listener.d.ts +574 -0
- package/lib/aws/compute/alb/application-listener.js +538 -0
- package/lib/aws/compute/alb/application-load-balancer.d.ts +715 -0
- package/lib/aws/compute/alb/application-load-balancer.js +780 -0
- package/lib/aws/compute/alb/application-target-group.d.ts +339 -0
- package/lib/aws/compute/alb/application-target-group.js +427 -0
- package/lib/aws/compute/alb/conditions.d.ts +61 -0
- package/lib/aws/compute/alb/conditions.js +164 -0
- package/lib/aws/compute/alb/trust-store-revocation.d.ts +59 -0
- package/lib/aws/compute/alb/trust-store-revocation.js +46 -0
- package/lib/aws/compute/alb/trust-store.d.ts +86 -0
- package/lib/aws/compute/alb/trust-store.js +79 -0
- package/lib/aws/compute/architecture.js +1 -1
- package/lib/aws/compute/aspects/require-imdsv2-aspect.d.ts +75 -0
- package/lib/aws/compute/aspects/require-imdsv2-aspect.js +106 -0
- package/lib/aws/compute/bastion-host.d.ts +172 -0
- package/lib/aws/compute/bastion-host.js +114 -0
- package/lib/aws/compute/chain.js +1 -1
- package/lib/aws/compute/cidr-splits.d.ts +49 -0
- package/lib/aws/compute/cidr-splits.js +59 -0
- package/lib/aws/compute/client-vpn-authorization-rule.d.ts +43 -0
- package/lib/aws/compute/client-vpn-authorization-rule.js +30 -0
- package/lib/aws/compute/client-vpn-endpoint-types.d.ts +62 -0
- package/lib/aws/compute/client-vpn-endpoint-types.js +25 -0
- package/lib/aws/compute/client-vpn-endpoint.d.ts +239 -0
- package/lib/aws/compute/client-vpn-endpoint.js +259 -0
- package/lib/aws/compute/client-vpn-route.d.ts +67 -0
- package/lib/aws/compute/client-vpn-route.js +57 -0
- package/lib/aws/compute/condition.js +1 -1
- package/lib/aws/compute/connections.d.ts +137 -0
- package/lib/aws/compute/connections.js +208 -0
- package/lib/aws/compute/ec2-augmentations.generated.d.ts +53 -0
- package/lib/aws/compute/ec2-augmentations.generated.js +35 -0
- package/lib/aws/compute/ec2-canned-metrics.generated.d.ts +555 -0
- package/lib/aws/compute/ec2-canned-metrics.generated.js +681 -0
- package/lib/aws/compute/ec2-util-v2.d.ts +141 -0
- package/lib/aws/compute/ec2-util-v2.js +286 -0
- package/lib/aws/compute/ec2-util.d.ts +52 -0
- package/lib/aws/compute/ec2-util.js +138 -0
- package/lib/aws/compute/elasticloadbalancing-canned-metrics.generated.d.ts +176 -0
- package/lib/aws/compute/elasticloadbalancing-canned-metrics.generated.js +119 -0
- package/lib/aws/compute/elasticloadbalancingv2-canned-metrics.generated.d.ts +860 -0
- package/lib/aws/compute/elasticloadbalancingv2-canned-metrics.generated.js +597 -0
- 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.js +1 -1
- package/lib/aws/compute/function-url.js +1 -1
- package/lib/aws/compute/function-vpc-config.generated.d.ts +3 -3
- package/lib/aws/compute/function-vpc-config.generated.js +1 -1
- package/lib/aws/compute/function.d.ts +1 -1
- package/lib/aws/compute/function.js +5 -5
- package/lib/aws/compute/index-alpha.d.ts +5 -0
- package/lib/aws/compute/index-alpha.js +22 -0
- package/lib/aws/compute/index.d.ts +60 -0
- package/lib/aws/compute/index.js +70 -2
- package/lib/aws/compute/instance-types.d.ts +1354 -0
- package/lib/aws/compute/instance-types.js +1683 -0
- package/lib/aws/compute/instance.d.ts +436 -0
- package/lib/aws/compute/instance.js +262 -0
- package/lib/aws/compute/ip-addresses.d.ts +249 -0
- package/lib/aws/compute/ip-addresses.js +248 -0
- package/lib/aws/compute/ipam.d.ts +309 -0
- package/lib/aws/compute/ipam.js +306 -0
- package/lib/aws/compute/key-pair.d.ts +178 -0
- package/lib/aws/compute/key-pair.js +194 -0
- package/lib/aws/compute/lambda-augmentations.generated.d.ts +65 -0
- package/lib/aws/compute/lambda-augmentations.generated.js +41 -0
- package/lib/aws/compute/lambda-canned-metrics.generated.d.ts +316 -0
- package/lib/aws/compute/lambda-canned-metrics.generated.js +119 -0
- package/lib/aws/compute/launch-template.d.ts +540 -0
- package/lib/aws/compute/launch-template.js +468 -0
- package/lib/aws/compute/lb-shared/access-logs-accounts.d.ts +7 -0
- package/lib/aws/compute/lb-shared/access-logs-accounts.js +46 -0
- package/lib/aws/compute/lb-shared/base-listener.d.ts +113 -0
- package/lib/aws/compute/lb-shared/base-listener.js +181 -0
- package/lib/aws/compute/lb-shared/base-load-balancer.d.ts +212 -0
- package/lib/aws/compute/lb-shared/base-load-balancer.js +290 -0
- package/lib/aws/compute/lb-shared/base-target-group.d.ts +382 -0
- package/lib/aws/compute/lb-shared/base-target-group.js +364 -0
- package/lib/aws/compute/lb-shared/enums.d.ts +282 -0
- package/lib/aws/compute/lb-shared/enums.js +301 -0
- package/lib/aws/compute/lb-shared/grid-lookup-types.d.ts +42 -0
- package/lib/aws/compute/lb-shared/grid-lookup-types.js +53 -0
- package/lib/aws/compute/lb-shared/imported.d.ts +24 -0
- package/lib/aws/compute/lb-shared/imported.js +27 -0
- package/lib/aws/compute/lb-shared/lb-listener-config.generated.d.ts +194 -0
- package/lib/aws/compute/lb-shared/lb-listener-config.generated.js +3 -0
- package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.d.ts +56 -0
- package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.js +3 -0
- package/lib/aws/compute/lb-shared/listener-action.d.ts +14 -0
- package/lib/aws/compute/lb-shared/listener-action.js +4 -0
- package/lib/aws/compute/lb-shared/listener-certificate.d.ts +28 -0
- package/lib/aws/compute/lb-shared/listener-certificate.js +29 -0
- package/lib/aws/compute/lb-shared/load-balancer-targets.d.ts +93 -0
- package/lib/aws/compute/lb-shared/load-balancer-targets.js +127 -0
- package/lib/aws/compute/lb-shared/util.d.ts +113 -0
- package/lib/aws/compute/lb-shared/util.js +264 -0
- package/lib/aws/compute/lb-targets/alb-target.d.ts +67 -0
- package/lib/aws/compute/lb-targets/alb-target.js +100 -0
- package/lib/aws/compute/lb-targets/index.d.ts +4 -0
- package/lib/aws/compute/lb-targets/index.js +22 -0
- package/lib/aws/compute/lb-targets/instance-target.d.ts +42 -0
- package/lib/aws/compute/lb-targets/instance-target.js +67 -0
- package/lib/aws/compute/lb-targets/ip-target.d.ts +55 -0
- package/lib/aws/compute/lb-targets/ip-target.js +79 -0
- package/lib/aws/compute/lb-targets/lambda-target.d.ts +25 -0
- package/lib/aws/compute/lb-targets/lambda-target.js +50 -0
- package/lib/aws/compute/load-balancer.d.ts +336 -0
- package/lib/aws/compute/load-balancer.js +287 -0
- package/lib/aws/compute/machine-image/amazon-linux-2022.d.ts +63 -0
- package/lib/aws/compute/machine-image/amazon-linux-2022.js +84 -0
- package/lib/aws/compute/machine-image/amazon-linux-2023.d.ts +63 -0
- package/lib/aws/compute/machine-image/amazon-linux-2023.js +84 -0
- package/lib/aws/compute/machine-image/amazon-linux2.d.ts +76 -0
- package/lib/aws/compute/machine-image/amazon-linux2.js +87 -0
- package/lib/aws/compute/machine-image/common.d.ts +181 -0
- package/lib/aws/compute/machine-image/common.js +122 -0
- package/lib/aws/compute/machine-image/index.d.ts +5 -0
- package/lib/aws/compute/machine-image/index.js +22 -0
- package/lib/aws/compute/machine-image/machine-image.d.ts +463 -0
- package/lib/aws/compute/machine-image/machine-image.js +566 -0
- package/lib/aws/compute/machine-image/utils.d.ts +2 -0
- package/lib/aws/compute/machine-image/utils.js +17 -0
- package/lib/aws/compute/nat.d.ts +325 -0
- package/lib/aws/compute/nat.js +455 -0
- package/lib/aws/compute/network-acl-types.d.ts +152 -0
- package/lib/aws/compute/network-acl-types.js +156 -0
- package/lib/aws/compute/network-acl.d.ts +285 -0
- package/lib/aws/compute/network-acl.js +207 -0
- package/lib/aws/compute/network-util.d.ts +116 -0
- package/lib/aws/compute/network-util.js +241 -0
- package/lib/aws/compute/nlb/network-listener-action.d.ts +92 -0
- package/lib/aws/compute/nlb/network-listener-action.js +146 -0
- package/lib/aws/compute/nlb/network-listener-certificate.d.ts +24 -0
- package/lib/aws/compute/nlb/network-listener-certificate.js +25 -0
- package/lib/aws/compute/nlb/network-listener.d.ts +248 -0
- package/lib/aws/compute/nlb/network-listener.js +217 -0
- package/lib/aws/compute/nlb/network-load-balancer.d.ts +315 -0
- package/lib/aws/compute/nlb/network-load-balancer.js +360 -0
- package/lib/aws/compute/nlb/network-target-group.d.ts +153 -0
- package/lib/aws/compute/nlb/network-target-group.js +223 -0
- package/lib/aws/compute/peer.d.ts +64 -0
- package/lib/aws/compute/peer.js +235 -0
- package/lib/aws/compute/placement-group.d.ts +161 -0
- package/lib/aws/compute/placement-group.js +133 -0
- package/lib/aws/compute/port.d.ts +287 -0
- package/lib/aws/compute/port.js +390 -0
- package/lib/aws/compute/prefix-list.d.ts +131 -0
- package/lib/aws/compute/prefix-list.js +114 -0
- package/lib/aws/compute/private/context-stub.d.ts +7 -0
- package/lib/aws/compute/private/context-stub.js +43 -0
- package/lib/aws/compute/private/ebs-util.d.ts +14 -0
- package/lib/aws/compute/private/ebs-util.js +145 -0
- package/lib/aws/compute/private/intrinstics.js +2 -1
- package/lib/aws/compute/private/json-path.js +8 -8
- package/lib/aws/compute/private/util.js +2 -3
- package/lib/aws/compute/route.d.ts +547 -0
- package/lib/aws/compute/route.js +469 -0
- package/lib/aws/compute/security-group.d.ts +414 -0
- package/lib/aws/compute/security-group.js +538 -0
- 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.d.ts +2 -2
- package/lib/aws/compute/state-machine.js +14 -12
- 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 +5 -5
- 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/stepfunctions-canned-metrics.generated.d.ts +83 -0
- package/lib/aws/compute/stepfunctions-canned-metrics.generated.js +127 -0
- package/lib/aws/compute/subnet-v2.d.ts +213 -0
- package/lib/aws/compute/subnet-v2.js +405 -0
- package/lib/aws/compute/subnet.d.ts +37 -0
- package/lib/aws/compute/subnet.js +181 -0
- 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/private/task-utils.js +3 -4
- package/lib/aws/compute/tasks/resource-arn-suffix.js +2 -3
- 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 +2 -2
- package/lib/aws/compute/user-data.d.ts +270 -0
- package/lib/aws/compute/user-data.js +487 -0
- package/lib/aws/compute/util.d.ts +1 -1
- package/lib/aws/compute/util.js +4 -5
- package/lib/aws/compute/volume.d.ts +480 -0
- package/lib/aws/compute/volume.js +426 -0
- package/lib/aws/compute/vpc-endpoint-service.d.ts +149 -0
- package/lib/aws/compute/vpc-endpoint-service.js +90 -0
- package/lib/aws/compute/vpc-endpoint.d.ts +742 -0
- package/lib/aws/compute/vpc-endpoint.js +811 -0
- package/lib/aws/compute/vpc-flow-logs.d.ts +551 -0
- package/lib/aws/compute/vpc-flow-logs.js +693 -0
- package/lib/aws/compute/vpc-lookup.d.ts +73 -0
- package/lib/aws/compute/vpc-lookup.js +3 -0
- package/lib/aws/compute/vpc-v2-base.d.ts +353 -0
- package/lib/aws/compute/vpc-v2-base.js +493 -0
- package/lib/aws/compute/vpc-v2.d.ts +385 -0
- package/lib/aws/compute/vpc-v2.js +408 -0
- package/lib/aws/compute/vpc.d.ts +1448 -0
- package/lib/aws/compute/vpc.js +1495 -0
- package/lib/aws/compute/vpn.d.ts +443 -0
- package/lib/aws/compute/vpn.js +397 -0
- package/lib/aws/compute/windows-versions.d.ts +418 -0
- package/lib/aws/compute/windows-versions.js +426 -0
- package/lib/aws/edge/certificate-base.d.ts +20 -0
- package/lib/aws/edge/certificate-base.js +28 -0
- package/lib/aws/edge/certificate.d.ts +23 -2
- package/lib/aws/edge/certificate.js +54 -4
- package/lib/aws/edge/distribution.js +3 -3
- package/lib/aws/edge/dns-alias-record-targets.js +2 -2
- package/lib/aws/edge/dns-record.js +16 -16
- package/lib/aws/edge/dns-zone.d.ts +20 -2
- package/lib/aws/edge/dns-zone.js +25 -10
- package/lib/aws/edge/function.js +2 -2
- package/lib/aws/edge/index.d.ts +1 -0
- package/lib/aws/edge/index.js +2 -1
- package/lib/aws/edge/key-value-store.js +4 -4
- package/lib/aws/edge/origin.js +8 -6
- 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 +2 -2
- package/lib/aws/iam/index.d.ts +1 -0
- package/lib/aws/iam/index.js +2 -1
- package/lib/aws/iam/instance-profile.d.ts +155 -0
- package/lib/aws/iam/instance-profile.js +124 -0
- package/lib/aws/iam/managed-policy.js +1 -1
- package/lib/aws/iam/oidc-provider.js +1 -1
- package/lib/aws/iam/policy-document-config.generated.d.ts +8 -8
- package/lib/aws/iam/policy-document-config.generated.js +1 -1
- package/lib/aws/iam/policy-document.js +1 -1
- package/lib/aws/iam/policy-statement-props.generated.d.ts +8 -8
- package/lib/aws/iam/policy-statement-props.generated.js +1 -1
- package/lib/aws/iam/policy-statement.js +9 -9
- package/lib/aws/iam/policy.js +1 -1
- package/lib/aws/iam/principals.js +26 -26
- package/lib/aws/iam/private/assume-role-policy.js +2 -3
- package/lib/aws/iam/private/comparable-principal.js +2 -3
- package/lib/aws/iam/private/immutable-role.d.ts +2 -1
- package/lib/aws/iam/private/immutable-role.js +3 -3
- package/lib/aws/iam/private/imported-role.d.ts +1 -1
- package/lib/aws/iam/private/imported-role.js +3 -3
- package/lib/aws/iam/private/merge-statements.js +2 -3
- package/lib/aws/iam/private/util.js +4 -4
- package/lib/aws/iam/role.js +1 -1
- package/lib/aws/iam/saml-provider.d.ts +1 -1
- package/lib/aws/iam/saml-provider.js +6 -6
- package/lib/aws/iam/unknown-principal.js +1 -1
- package/lib/aws/iam/utils.js +2 -3
- package/lib/aws/index.d.ts +1 -0
- package/lib/aws/index.js +4 -1
- package/lib/aws/network/simple-ipv4-vpc.js +5 -5
- package/lib/aws/network/subnet-group.js +3 -3
- package/lib/aws/network/subnet.d.ts +1 -1
- package/lib/aws/network/subnet.js +7 -7
- package/lib/aws/notify/archive.js +3 -2
- package/lib/aws/notify/connection.js +5 -4
- package/lib/aws/notify/event-bus.js +5 -4
- package/lib/aws/notify/event-pattern.js +3 -3
- package/lib/aws/notify/index.js +3 -1
- package/lib/aws/notify/input.js +4 -3
- package/lib/aws/notify/kinesis-stream.js +3 -2
- package/lib/aws/notify/on-event-options.js +2 -1
- package/lib/aws/notify/queue-config.generated.d.ts +18 -11
- package/lib/aws/notify/queue-config.generated.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 +3 -2
- package/lib/aws/notify/schedule.js +2 -2
- package/lib/aws/notify/sqs-augmentations.generated.d.ts +125 -0
- package/lib/aws/notify/sqs-augmentations.generated.js +74 -0
- package/lib/aws/notify/target.js +2 -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/targets/util.d.ts +1 -1
- package/lib/aws/notify/targets/util.js +10 -11
- package/lib/aws/notify/util.js +4 -4
- package/lib/aws/provider-config.generated.d.ts +33 -33
- package/lib/aws/provider-config.generated.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.d.ts +298 -65
- package/lib/aws/storage/bucket.js +548 -225
- package/lib/aws/storage/cors-config.generated.d.ts +3 -3
- package/lib/aws/storage/cors-config.generated.js +1 -1
- package/lib/aws/storage/cors-rule-config.generated.d.ts +5 -5
- package/lib/aws/storage/cors-rule-config.generated.js +1 -1
- package/lib/aws/storage/index.d.ts +1 -0
- package/lib/aws/storage/index.js +2 -1
- package/lib/aws/storage/lifecycle-config.generated.d.ts +11 -11
- package/lib/aws/storage/lifecycle-config.generated.js +1 -1
- package/lib/aws/storage/notification-targets/function.js +6 -6
- package/lib/aws/storage/notification-targets/queue.js +1 -1
- package/lib/aws/storage/origin-access-identity.d.ts +1 -1
- package/lib/aws/storage/origin-access-identity.js +5 -4
- package/lib/aws/storage/parameter-util.d.ts +12 -0
- package/lib/aws/storage/parameter-util.js +65 -0
- package/lib/aws/storage/parameter.d.ts +526 -0
- package/lib/aws/storage/parameter.js +606 -0
- package/lib/aws/storage/s3-canned-metrics.generated.d.ts +22 -0
- package/lib/aws/storage/s3-canned-metrics.generated.js +23 -0
- package/lib/aws/storage/util.d.ts +25 -3
- package/lib/aws/storage/util.js +84 -17
- package/lib/aws/storage/website-config.generated.d.ts +5 -5
- package/lib/aws/storage/website-config.generated.js +1 -1
- package/lib/aws/util.js +2 -3
- package/lib/construct-base.d.ts +10 -1
- package/lib/construct-base.js +9 -6
- package/lib/duration.js +1 -1
- package/lib/expiration.d.ts +48 -0
- package/lib/expiration.js +68 -0
- package/lib/helpers-internal/index.d.ts +1 -0
- package/lib/helpers-internal/index.js +7 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +3 -1
- package/lib/private/md5.d.ts +4 -0
- package/lib/private/md5.js +14 -0
- package/lib/private/unique-resource-name.js +3 -4
- package/lib/size.js +2 -2
- package/lib/stack-base.d.ts +4 -23
- package/lib/stack-base.js +9 -30
- package/lib/terra-func.d.ts +103 -0
- package/lib/terra-func.js +170 -0
- package/lib/token.js +5 -5
- package/package.json +15 -8
- package/bun.lockb +0 -0
|
@@ -0,0 +1,606 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.StringListParameter = exports.StringParameter = exports.ParameterTier = exports.ParameterDataType = exports.ParameterType = exports.ParameterValueType = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
// https://github.com/aws/aws-cdk/blob/v2.175.1/packages/aws-cdk-lib/aws-ssm/lib/parameter.ts
|
|
7
|
+
const provider_aws_1 = require("@cdktf/provider-aws");
|
|
8
|
+
const cdktf_1 = require("cdktf");
|
|
9
|
+
const parameter_util_1 = require("./parameter-util");
|
|
10
|
+
const terra_func_1 = require("../../terra-func");
|
|
11
|
+
const aws_construct_1 = require("../aws-construct");
|
|
12
|
+
const aws_stack_1 = require("../aws-stack");
|
|
13
|
+
const iam = require("../iam");
|
|
14
|
+
/**
|
|
15
|
+
* Basic features shared across all types of SSM Parameters.
|
|
16
|
+
*/
|
|
17
|
+
class ParameterBase extends aws_construct_1.AwsConstructBase {
|
|
18
|
+
get parameterOutputs() {
|
|
19
|
+
return {
|
|
20
|
+
parameterArn: this.parameterArn,
|
|
21
|
+
parameterName: this.parameterName,
|
|
22
|
+
parameterType: this.parameterType,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
get outputs() {
|
|
26
|
+
return this.parameterOutputs;
|
|
27
|
+
}
|
|
28
|
+
grantRead(grantee) {
|
|
29
|
+
if (this.encryptionKey) {
|
|
30
|
+
this.encryptionKey.grantDecrypt(grantee);
|
|
31
|
+
}
|
|
32
|
+
return iam.Grant.addToPrincipal({
|
|
33
|
+
grantee,
|
|
34
|
+
actions: [
|
|
35
|
+
"ssm:DescribeParameters",
|
|
36
|
+
"ssm:GetParameters",
|
|
37
|
+
"ssm:GetParameter",
|
|
38
|
+
"ssm:GetParameterHistory",
|
|
39
|
+
],
|
|
40
|
+
resourceArns: [this.parameterArn],
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
grantWrite(grantee) {
|
|
44
|
+
if (this.encryptionKey) {
|
|
45
|
+
this.encryptionKey.grantEncrypt(grantee);
|
|
46
|
+
}
|
|
47
|
+
return iam.Grant.addToPrincipal({
|
|
48
|
+
grantee,
|
|
49
|
+
actions: ["ssm:PutParameter"],
|
|
50
|
+
resourceArns: [this.parameterArn],
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* The type of CFN SSM Parameter
|
|
56
|
+
*
|
|
57
|
+
* Using specific types can be helpful in catching invalid values
|
|
58
|
+
* at the start of creating or updating a stack. CloudFormation validates
|
|
59
|
+
* the values against existing values in the account.
|
|
60
|
+
*
|
|
61
|
+
* @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html#aws-ssm-parameter-types
|
|
62
|
+
*/
|
|
63
|
+
var ParameterValueType;
|
|
64
|
+
(function (ParameterValueType) {
|
|
65
|
+
/**
|
|
66
|
+
* String
|
|
67
|
+
*/
|
|
68
|
+
ParameterValueType["STRING"] = "String";
|
|
69
|
+
/**
|
|
70
|
+
* An Availability Zone, such as us-west-2a.
|
|
71
|
+
*/
|
|
72
|
+
ParameterValueType["AWS_EC2_AVAILABILITYZONE_NAME"] = "AWS::EC2::AvailabilityZone::Name";
|
|
73
|
+
/**
|
|
74
|
+
* An Amazon EC2 image ID, such as ami-0ff8a91507f77f867.
|
|
75
|
+
*/
|
|
76
|
+
ParameterValueType["AWS_EC2_IMAGE_ID"] = "AWS::EC2::Image::Id";
|
|
77
|
+
/**
|
|
78
|
+
* An Amazon EC2 instance ID, such as i-1e731a32.
|
|
79
|
+
*/
|
|
80
|
+
ParameterValueType["AWS_EC2_INSTANCE_ID"] = "AWS::EC2::Instance::Id";
|
|
81
|
+
/**
|
|
82
|
+
* An Amazon EC2 key pair name.
|
|
83
|
+
*/
|
|
84
|
+
ParameterValueType["AWS_EC2_KEYPAIR_KEYNAME"] = "AWS::EC2::KeyPair::KeyName";
|
|
85
|
+
/**
|
|
86
|
+
* An EC2-Classic or default VPC security group name, such as my-sg-abc.
|
|
87
|
+
*/
|
|
88
|
+
ParameterValueType["AWS_EC2_SECURITYGROUP_GROUPNAME"] = "AWS::EC2::SecurityGroup::GroupName";
|
|
89
|
+
/**
|
|
90
|
+
* A security group ID, such as sg-a123fd85.
|
|
91
|
+
*/
|
|
92
|
+
ParameterValueType["AWS_EC2_SECURITYGROUP_ID"] = "AWS::EC2::SecurityGroup::Id";
|
|
93
|
+
/**
|
|
94
|
+
* A subnet ID, such as subnet-123a351e.
|
|
95
|
+
*/
|
|
96
|
+
ParameterValueType["AWS_EC2_SUBNET_ID"] = "AWS::EC2::Subnet::Id";
|
|
97
|
+
/**
|
|
98
|
+
* An Amazon EBS volume ID, such as vol-3cdd3f56.
|
|
99
|
+
*/
|
|
100
|
+
ParameterValueType["AWS_EC2_VOLUME_ID"] = "AWS::EC2::Volume::Id";
|
|
101
|
+
/**
|
|
102
|
+
* A VPC ID, such as vpc-a123baa3.
|
|
103
|
+
*/
|
|
104
|
+
ParameterValueType["AWS_EC2_VPC_ID"] = "AWS::EC2::VPC::Id";
|
|
105
|
+
/**
|
|
106
|
+
* An Amazon Route 53 hosted zone ID, such as Z23YXV4OVPL04A.
|
|
107
|
+
*/
|
|
108
|
+
ParameterValueType["AWS_ROUTE53_HOSTEDZONE_ID"] = "AWS::Route53::HostedZone::Id";
|
|
109
|
+
})(ParameterValueType || (exports.ParameterValueType = ParameterValueType = {}));
|
|
110
|
+
// Deprecated - see https://github.com/aws/aws-cdk/issues/6039
|
|
111
|
+
/**
|
|
112
|
+
* SSM parameter type
|
|
113
|
+
* @deprecated these types are no longer used
|
|
114
|
+
*/
|
|
115
|
+
var ParameterType;
|
|
116
|
+
(function (ParameterType) {
|
|
117
|
+
/**
|
|
118
|
+
* String
|
|
119
|
+
*/
|
|
120
|
+
ParameterType["STRING"] = "String";
|
|
121
|
+
/**
|
|
122
|
+
* Secure String
|
|
123
|
+
*
|
|
124
|
+
* Parameter Store uses an AWS Key Management Service (KMS) customer master key (CMK) to encrypt the parameter value.
|
|
125
|
+
* Parameters of type SecureString cannot be created directly from a CDK application due to CFN limitations.
|
|
126
|
+
*
|
|
127
|
+
* NOTE: Terraform does not prevent creating SecureString parameters, but it is not recommended
|
|
128
|
+
* because the value will be stored in plain text in the state file.
|
|
129
|
+
*/
|
|
130
|
+
ParameterType["SECURE_STRING"] = "SecureString";
|
|
131
|
+
/**
|
|
132
|
+
* String List
|
|
133
|
+
*/
|
|
134
|
+
ParameterType["STRING_LIST"] = "StringList";
|
|
135
|
+
/**
|
|
136
|
+
* An Amazon EC2 image ID, such as ami-0ff8a91507f77f867
|
|
137
|
+
*/
|
|
138
|
+
ParameterType["AWS_EC2_IMAGE_ID"] = "AWS::EC2::Image::Id";
|
|
139
|
+
})(ParameterType || (exports.ParameterType = ParameterType = {}));
|
|
140
|
+
/**
|
|
141
|
+
* SSM parameter data type
|
|
142
|
+
*/
|
|
143
|
+
var ParameterDataType;
|
|
144
|
+
(function (ParameterDataType) {
|
|
145
|
+
/**
|
|
146
|
+
* Text
|
|
147
|
+
*/
|
|
148
|
+
ParameterDataType["TEXT"] = "text";
|
|
149
|
+
/**
|
|
150
|
+
* Aws Ec2 Image
|
|
151
|
+
*/
|
|
152
|
+
ParameterDataType["AWS_EC2_IMAGE"] = "aws:ec2:image";
|
|
153
|
+
})(ParameterDataType || (exports.ParameterDataType = ParameterDataType = {}));
|
|
154
|
+
/**
|
|
155
|
+
* SSM parameter tier
|
|
156
|
+
*/
|
|
157
|
+
var ParameterTier;
|
|
158
|
+
(function (ParameterTier) {
|
|
159
|
+
/**
|
|
160
|
+
* String
|
|
161
|
+
*/
|
|
162
|
+
ParameterTier["ADVANCED"] = "Advanced";
|
|
163
|
+
/**
|
|
164
|
+
* String
|
|
165
|
+
*/
|
|
166
|
+
ParameterTier["INTELLIGENT_TIERING"] = "Intelligent-Tiering";
|
|
167
|
+
/**
|
|
168
|
+
* String
|
|
169
|
+
*/
|
|
170
|
+
ParameterTier["STANDARD"] = "Standard";
|
|
171
|
+
})(ParameterTier || (exports.ParameterTier = ParameterTier = {}));
|
|
172
|
+
/**
|
|
173
|
+
* Creates a new String SSM Parameter.
|
|
174
|
+
* @resource aws_ssm_parameter
|
|
175
|
+
*
|
|
176
|
+
* @example
|
|
177
|
+
* const ssmParameter = new storage.StringParameter(this, 'mySsmParameter', {
|
|
178
|
+
* parameterName: 'mySsmParameter',
|
|
179
|
+
* stringValue: 'mySsmParameterValue',
|
|
180
|
+
* });
|
|
181
|
+
*/
|
|
182
|
+
class StringParameter extends ParameterBase {
|
|
183
|
+
/**
|
|
184
|
+
* Imports an external string parameter by name.
|
|
185
|
+
*/
|
|
186
|
+
static fromStringParameterName(scope, id, stringParameterName) {
|
|
187
|
+
return this.fromStringParameterAttributes(scope, id, {
|
|
188
|
+
parameterName: stringParameterName,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Imports an external string parameter by ARN.
|
|
193
|
+
*
|
|
194
|
+
* The unencrypted value of a SecureString will be stored in the raw state as plain-text.
|
|
195
|
+
* [Read more about sensitive data in state](https://www.terraform.io/docs/state/sensitive-data.html).
|
|
196
|
+
*/
|
|
197
|
+
static fromStringParameterArn(scope, id, stringParameterArn) {
|
|
198
|
+
if (cdktf_1.Token.isUnresolved(stringParameterArn)) {
|
|
199
|
+
throw new Error("stringParameterArn cannot be an unresolved token");
|
|
200
|
+
}
|
|
201
|
+
// has to be the same region
|
|
202
|
+
// split the arn string to get the region string
|
|
203
|
+
// arn sample: arn:aws:ssm:us-east-1:123456789012:parameter/dummyName
|
|
204
|
+
const arnParts = stringParameterArn.split(":");
|
|
205
|
+
const stackRegion = aws_stack_1.AwsStack.ofAwsConstruct(scope).region;
|
|
206
|
+
if (arnParts.length !== 6) {
|
|
207
|
+
throw new Error("unexpected StringParameterArn format");
|
|
208
|
+
}
|
|
209
|
+
else if (cdktf_1.Token.isUnresolved(stackRegion)) {
|
|
210
|
+
// Region is unknown during synthesis, emit a warning for visibility
|
|
211
|
+
// "aws-cdk-lib/aws-ssm:crossAccountReferenceSameRegion",
|
|
212
|
+
cdktf_1.Annotations.of(scope).addWarning("Cross-account references will only work within the same region");
|
|
213
|
+
}
|
|
214
|
+
else if (!cdktf_1.Token.isUnresolved(stackRegion) &&
|
|
215
|
+
arnParts[3] !== stackRegion) {
|
|
216
|
+
// If the region is known, it must match the region specified in the ARN string
|
|
217
|
+
throw new Error("stringParameterArn must be in the same region as the stack");
|
|
218
|
+
}
|
|
219
|
+
const parameterType = ParameterValueType.STRING;
|
|
220
|
+
const parameterName = stringParameterArn
|
|
221
|
+
.split("/")
|
|
222
|
+
.pop()
|
|
223
|
+
?.replace(/parameter\/$/, "") ?? "";
|
|
224
|
+
const dataSource = new provider_aws_1.dataAwsSsmParameter.DataAwsSsmParameter(scope, `${id}.Parameter`, {
|
|
225
|
+
name: parameterName,
|
|
226
|
+
// withDecryption defaults to true
|
|
227
|
+
});
|
|
228
|
+
class Import extends ParameterBase {
|
|
229
|
+
constructor() {
|
|
230
|
+
super(...arguments);
|
|
231
|
+
this.parameterName = parameterName;
|
|
232
|
+
this.parameterArn = stringParameterArn;
|
|
233
|
+
this.parameterType = parameterType;
|
|
234
|
+
// Use caution: This value is never marked as sensitive.
|
|
235
|
+
this.stringValue = dataSource.insecureValue;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return new Import(scope, id);
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Imports an external string parameter with name and optional version.
|
|
242
|
+
*/
|
|
243
|
+
static fromStringParameterAttributes(scope, id, attrs) {
|
|
244
|
+
if (!attrs.parameterName) {
|
|
245
|
+
throw new Error("parameterName cannot be an empty string");
|
|
246
|
+
}
|
|
247
|
+
if (attrs.type &&
|
|
248
|
+
![ParameterType.STRING, ParameterType.AWS_EC2_IMAGE_ID].includes(attrs.type)) {
|
|
249
|
+
throw new Error(`fromStringParameterAttributes does not support ${attrs.type}. Please use ParameterType.STRING or ParameterType.AWS_EC2_IMAGE_ID`);
|
|
250
|
+
}
|
|
251
|
+
// const forceDynamicReference = attrs.forceDynamicReference ?? false;
|
|
252
|
+
// ref: https://github.com/aws/aws-cdk/blob/v2.143.0/packages/aws-cdk-lib/aws-ssm/lib/parameter.ts#L483
|
|
253
|
+
// const type = attrs.type ?? attrs.valueType ?? ParameterValueType.STRING;
|
|
254
|
+
let name;
|
|
255
|
+
if (attrs.version) {
|
|
256
|
+
// To query by parameter version, use "Name": "name:version".
|
|
257
|
+
// https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html#systemsmanager-GetParameter-request-Name
|
|
258
|
+
name = `${attrs.parameterName}:${cdktf_1.Tokenization.stringifyNumber(attrs.version)}`;
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
name = attrs.parameterName;
|
|
262
|
+
}
|
|
263
|
+
const dataSource = new provider_aws_1.dataAwsSsmParameter.DataAwsSsmParameter(scope, `${id}.Parameter`, {
|
|
264
|
+
name,
|
|
265
|
+
withDecryption: attrs.withDecryption, // defaults to true
|
|
266
|
+
});
|
|
267
|
+
class Import extends ParameterBase {
|
|
268
|
+
constructor() {
|
|
269
|
+
super(...arguments);
|
|
270
|
+
this.parameterName = attrs.parameterName;
|
|
271
|
+
this.parameterArn = (0, parameter_util_1.arnForParameterName)(this, attrs.parameterName, { simpleName: attrs.simpleName });
|
|
272
|
+
this.parameterType = ParameterType.STRING; // dataSource.type - instead of token use concrete
|
|
273
|
+
// Use caution: This value is never marked as sensitive.
|
|
274
|
+
this.stringValue = dataSource.insecureValue;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return new Import(scope, id);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Imports a secure string parameter from the SSM parameter store.
|
|
281
|
+
*/
|
|
282
|
+
static fromSecureStringParameterAttributes(scope, id, attrs) {
|
|
283
|
+
if (!attrs.parameterName) {
|
|
284
|
+
throw new Error("parameterName cannot be an empty string");
|
|
285
|
+
}
|
|
286
|
+
let name;
|
|
287
|
+
if (attrs.version) {
|
|
288
|
+
name = `${attrs.parameterName}:${cdktf_1.Tokenization.stringifyNumber(attrs.version)}`;
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
name = attrs.parameterName;
|
|
292
|
+
}
|
|
293
|
+
const resource = new provider_aws_1.dataAwsSsmParameter.DataAwsSsmParameter(scope, `${id}.Parameter`, {
|
|
294
|
+
name,
|
|
295
|
+
withDecryption: attrs.withDecryption, // defaults to true
|
|
296
|
+
});
|
|
297
|
+
class Import extends ParameterBase {
|
|
298
|
+
constructor() {
|
|
299
|
+
super(...arguments);
|
|
300
|
+
this.parameterName = attrs.parameterName;
|
|
301
|
+
this.parameterArn = (0, parameter_util_1.arnForParameterName)(this, attrs.parameterName, { simpleName: attrs.simpleName });
|
|
302
|
+
this.parameterType = ParameterType.SECURE_STRING; // resource.type - instead of token use concrete
|
|
303
|
+
// value is always marked as sensitive
|
|
304
|
+
this.stringValue = resource.value;
|
|
305
|
+
this.encryptionKey = attrs.encryptionKey;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return new Import(scope, id);
|
|
309
|
+
}
|
|
310
|
+
// // TODO: Use Grid as contextProvider
|
|
311
|
+
// /**
|
|
312
|
+
// * Reads the value of an SSM parameter during synthesis through an
|
|
313
|
+
// * environmental context provider.
|
|
314
|
+
// *
|
|
315
|
+
// * Requires that the stack this scope is defined in will have explicit
|
|
316
|
+
// * account/region information. Otherwise, it will fail during synthesis.
|
|
317
|
+
// *
|
|
318
|
+
// * If defaultValue is provided, it will be used as the dummyValue
|
|
319
|
+
// * and the ContextProvider will be told NOT to raise an error on synthesis
|
|
320
|
+
// * if the SSM Parameter is not found in the account at synth time.
|
|
321
|
+
// */
|
|
322
|
+
// public static valueFromLookup(
|
|
323
|
+
// scope: Construct,
|
|
324
|
+
// parameterName: string,
|
|
325
|
+
// defaultValue?: string,
|
|
326
|
+
// ): string {
|
|
327
|
+
// const value = ContextProvider.getValue(scope, {
|
|
328
|
+
// provider: cxschema.ContextProvider.SSM_PARAMETER_PROVIDER,
|
|
329
|
+
// props: { parameterName },
|
|
330
|
+
// dummyValue: defaultValue || `dummy-value-for-${parameterName}`,
|
|
331
|
+
// ignoreErrorOnMissingContext: defaultValue !== undefined,
|
|
332
|
+
// }).value;
|
|
333
|
+
// return value;
|
|
334
|
+
// }
|
|
335
|
+
/**
|
|
336
|
+
* Returns a token that will resolve (during deployment) to the string value of an SSM string parameter.
|
|
337
|
+
* @param scope Some scope within a stack
|
|
338
|
+
* @param parameterName The name of the SSM parameter.
|
|
339
|
+
* @param version The parameter version (recommended in order to ensure that the value won't change during deployment)
|
|
340
|
+
*/
|
|
341
|
+
static valueForStringParameter(scope, parameterName, version) {
|
|
342
|
+
return StringParameter.valueForTypedStringParameterV2(scope, parameterName, ParameterValueType.STRING, version);
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Returns a token that will resolve (during deployment) to the string value of an SSM string parameter.
|
|
346
|
+
* @param scope Some scope within a stack
|
|
347
|
+
* @param parameterName The name of the SSM parameter.
|
|
348
|
+
* @param type The type of the SSM parameter.
|
|
349
|
+
* @param version The parameter version (recommended in order to ensure that the value won't change during deployment)
|
|
350
|
+
*/
|
|
351
|
+
static valueForTypedStringParameterV2(scope, parameterName, type = ParameterValueType.STRING, version) {
|
|
352
|
+
const stack = aws_stack_1.AwsStack.of(scope);
|
|
353
|
+
const id = makeIdentityForImportedValue(parameterName);
|
|
354
|
+
const exists = stack.node.tryFindChild(id);
|
|
355
|
+
if (exists) {
|
|
356
|
+
return exists.stringValue;
|
|
357
|
+
}
|
|
358
|
+
return this.fromStringParameterAttributes(stack, id, {
|
|
359
|
+
parameterName,
|
|
360
|
+
version,
|
|
361
|
+
valueType: type,
|
|
362
|
+
}).stringValue;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Returns a token that will resolve (during deployment) to the string value of an SSM string parameter.
|
|
366
|
+
* @param scope Some scope within a stack
|
|
367
|
+
* @param parameterName The name of the SSM parameter.
|
|
368
|
+
* @param type The type of the SSM parameter.
|
|
369
|
+
* @param version The parameter version (recommended in order to ensure that the value won't change during deployment)
|
|
370
|
+
* @deprecated - use valueForTypedStringParameterV2 instead
|
|
371
|
+
*/
|
|
372
|
+
static valueForTypedStringParameter(scope, parameterName, type = ParameterType.STRING, version) {
|
|
373
|
+
if (type === ParameterType.STRING_LIST) {
|
|
374
|
+
throw new Error("valueForTypedStringParameter does not support STRING_LIST, " +
|
|
375
|
+
"use valueForTypedListParameter instead");
|
|
376
|
+
}
|
|
377
|
+
const stack = aws_stack_1.AwsStack.of(scope);
|
|
378
|
+
const id = makeIdentityForImportedValue(parameterName);
|
|
379
|
+
const exists = stack.node.tryFindChild(id);
|
|
380
|
+
if (exists) {
|
|
381
|
+
return exists.stringValue;
|
|
382
|
+
}
|
|
383
|
+
return this.fromStringParameterAttributes(stack, id, {
|
|
384
|
+
parameterName,
|
|
385
|
+
version,
|
|
386
|
+
type,
|
|
387
|
+
}).stringValue;
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Returns a token that will resolve (during deployment)
|
|
391
|
+
* @param scope Some scope within a stack
|
|
392
|
+
* @param parameterName The name of the SSM parameter
|
|
393
|
+
* @param version The parameter version (required for secure strings)
|
|
394
|
+
* @deprecated Use `SecretValue.ssmSecure()` instead, it will correctly type the imported value as a `SecretValue` and allow importing without version. `SecretValue` lives in the core `aws-cdk-lib` module.
|
|
395
|
+
*/
|
|
396
|
+
static valueForSecureStringParameter(scope, parameterName, version) {
|
|
397
|
+
const stack = aws_stack_1.AwsStack.of(scope);
|
|
398
|
+
const id = makeIdentityForImportedValue(parameterName);
|
|
399
|
+
const exists = stack.node.tryFindChild(id);
|
|
400
|
+
if (exists) {
|
|
401
|
+
return exists.stringValue;
|
|
402
|
+
}
|
|
403
|
+
return this.fromSecureStringParameterAttributes(stack, id, {
|
|
404
|
+
parameterName,
|
|
405
|
+
version,
|
|
406
|
+
}).stringValue;
|
|
407
|
+
}
|
|
408
|
+
constructor(scope, id, props) {
|
|
409
|
+
super(scope, id, props);
|
|
410
|
+
const parameterName = props.parameterName ||
|
|
411
|
+
this.stack.uniqueResourceName(this, {
|
|
412
|
+
prefix: this.gridUUID,
|
|
413
|
+
});
|
|
414
|
+
if (props.stringValue && props.sensitiveStringValue) {
|
|
415
|
+
throw new Error("Cannot specify both 'stringValue' and 'sensitiveStringValue'");
|
|
416
|
+
}
|
|
417
|
+
const stringValue = props.stringValue ?? props.sensitiveStringValue;
|
|
418
|
+
const isSensitive = !!props.sensitiveStringValue;
|
|
419
|
+
if (!stringValue) {
|
|
420
|
+
throw new Error("Either 'stringValue' or 'sensitiveStringValue' must be specified");
|
|
421
|
+
}
|
|
422
|
+
if (props.allowedPattern) {
|
|
423
|
+
_assertValidValue(stringValue, props.allowedPattern);
|
|
424
|
+
}
|
|
425
|
+
validateParameterName(parameterName);
|
|
426
|
+
if (props.description && props.description?.length > 1024) {
|
|
427
|
+
throw new Error("Description cannot be longer than 1024 characters.");
|
|
428
|
+
}
|
|
429
|
+
if (props.type && props.type === ParameterType.AWS_EC2_IMAGE_ID) {
|
|
430
|
+
throw new Error("The type must either be ParameterType.STRING or ParameterType.STRING_LIST. Did you mean to set dataType: ParameterDataType.AWS_EC2_IMAGE instead?");
|
|
431
|
+
}
|
|
432
|
+
this.resource = new provider_aws_1.ssmParameter.SsmParameter(this, "Resource", {
|
|
433
|
+
allowedPattern: props.allowedPattern,
|
|
434
|
+
description: props.description,
|
|
435
|
+
name: parameterName,
|
|
436
|
+
tier: props.tier,
|
|
437
|
+
type: props.type ?? ParameterType.STRING,
|
|
438
|
+
dataType: props.dataType,
|
|
439
|
+
insecureValue: props.stringValue,
|
|
440
|
+
value: props.sensitiveStringValue,
|
|
441
|
+
});
|
|
442
|
+
this.parameterName = this.resource.name;
|
|
443
|
+
this.parameterArn = (0, parameter_util_1.arnForParameterName)(this, this.parameterName, {
|
|
444
|
+
physicalName: parameterName,
|
|
445
|
+
simpleName: props.simpleName,
|
|
446
|
+
});
|
|
447
|
+
this.parameterType = this.resource.type;
|
|
448
|
+
this.stringValue = isSensitive
|
|
449
|
+
? this.resource.value
|
|
450
|
+
: this.resource.insecureValue;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
exports.StringParameter = StringParameter;
|
|
454
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
455
|
+
StringParameter[_a] = { fqn: "terraconstructs.aws.storage.StringParameter", version: "0.0.12" };
|
|
456
|
+
/**
|
|
457
|
+
* Creates a new StringList SSM Parameter.
|
|
458
|
+
* @resource AWS::SSM::Parameter
|
|
459
|
+
*/
|
|
460
|
+
class StringListParameter extends ParameterBase {
|
|
461
|
+
/**
|
|
462
|
+
* Imports an external parameter of type string list.
|
|
463
|
+
* Returns a token and should not be parsed.
|
|
464
|
+
*/
|
|
465
|
+
static fromStringListParameterName(scope, id, stringListParameterName) {
|
|
466
|
+
// ref: dynamic ref
|
|
467
|
+
// https://github.com/aws/aws-cdk/blob/v2.143.0/packages/aws-cdk-lib/aws-ssm/lib/parameter.ts#L670
|
|
468
|
+
return StringListParameter.fromListParameterAttributes(scope, id, {
|
|
469
|
+
parameterName: stringListParameterName,
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Imports an external string list parameter with name and optional version.
|
|
474
|
+
*/
|
|
475
|
+
static fromListParameterAttributes(scope, id, attrs) {
|
|
476
|
+
if (!attrs.parameterName) {
|
|
477
|
+
throw new Error("parameterName cannot be an empty string");
|
|
478
|
+
}
|
|
479
|
+
let name;
|
|
480
|
+
if (attrs.version) {
|
|
481
|
+
name = `${attrs.parameterName}:${cdktf_1.Tokenization.stringifyNumber(attrs.version)}`;
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
name = attrs.parameterName;
|
|
485
|
+
}
|
|
486
|
+
const type = attrs.elementType ?? ParameterValueType.STRING;
|
|
487
|
+
const valueType = `List<${type}>`;
|
|
488
|
+
const resource = new provider_aws_1.dataAwsSsmParameter.DataAwsSsmParameter(scope, `${id}.Parameter`, {
|
|
489
|
+
name,
|
|
490
|
+
withDecryption: attrs.withDecryption, // defaults to true
|
|
491
|
+
});
|
|
492
|
+
class Import extends ParameterBase {
|
|
493
|
+
constructor() {
|
|
494
|
+
super(...arguments);
|
|
495
|
+
this.parameterName = attrs.parameterName;
|
|
496
|
+
this.parameterArn = (0, parameter_util_1.arnForParameterName)(this, attrs.parameterName, { simpleName: attrs.simpleName });
|
|
497
|
+
this.parameterType = valueType; // it doesn't really matter what this is since a CfnParameter can only be `String | StringList`
|
|
498
|
+
this.stringListValue = terra_func_1.Fn.split(",", resource.insecureValue);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
return new Import(scope, id);
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* Returns a token that will resolve (during deployment) to the list value of an SSM StringList parameter.
|
|
505
|
+
* @param scope Some scope within a stack
|
|
506
|
+
* @param parameterName The name of the SSM parameter.
|
|
507
|
+
* @param type the type of the SSM list parameter
|
|
508
|
+
* @param version The parameter version (recommended in order to ensure that the value won't change during deployment)
|
|
509
|
+
*/
|
|
510
|
+
static valueForTypedListParameter(scope, parameterName, type = ParameterValueType.STRING, version) {
|
|
511
|
+
const stack = aws_stack_1.AwsStack.of(scope);
|
|
512
|
+
const id = makeIdentityForImportedValue(parameterName);
|
|
513
|
+
const exists = stack.node.tryFindChild(id);
|
|
514
|
+
if (exists) {
|
|
515
|
+
return exists.stringListValue;
|
|
516
|
+
}
|
|
517
|
+
return this.fromListParameterAttributes(stack, id, {
|
|
518
|
+
parameterName,
|
|
519
|
+
elementType: type,
|
|
520
|
+
version,
|
|
521
|
+
}).stringListValue;
|
|
522
|
+
}
|
|
523
|
+
constructor(scope, id, props) {
|
|
524
|
+
super(scope, id, props);
|
|
525
|
+
const parameterName = props.parameterName ||
|
|
526
|
+
this.stack.uniqueResourceName(this, {
|
|
527
|
+
prefix: this.gridUUID,
|
|
528
|
+
});
|
|
529
|
+
if (props.stringListValue && props.sensitiveStringListValue) {
|
|
530
|
+
throw new Error("Cannot specify both 'stringListValue' and 'sensitiveStringListValue'");
|
|
531
|
+
}
|
|
532
|
+
const stringListValue = props.stringListValue ?? props.sensitiveStringListValue;
|
|
533
|
+
const isSensitive = !!props.sensitiveStringListValue;
|
|
534
|
+
if (!stringListValue) {
|
|
535
|
+
throw new Error("Either 'stringListValue' or 'sensitiveStringListValue' must be specified");
|
|
536
|
+
}
|
|
537
|
+
if (stringListValue.find((str) => !cdktf_1.Token.isUnresolved(str) && str.indexOf(",") !== -1)) {
|
|
538
|
+
throw new Error("Values of a StringList SSM Parameter cannot contain the ',' character. Use a string parameter instead.");
|
|
539
|
+
}
|
|
540
|
+
if (props.allowedPattern && !cdktf_1.Token.isUnresolved(stringListValue)) {
|
|
541
|
+
stringListValue.forEach((str) => _assertValidValue(str, props.allowedPattern));
|
|
542
|
+
}
|
|
543
|
+
validateParameterName(parameterName);
|
|
544
|
+
if (props.description && props.description?.length > 1024) {
|
|
545
|
+
throw new Error("Description cannot be longer than 1024 characters.");
|
|
546
|
+
}
|
|
547
|
+
this.resource = new provider_aws_1.ssmParameter.SsmParameter(this, "Resource", {
|
|
548
|
+
allowedPattern: props.allowedPattern,
|
|
549
|
+
description: props.description,
|
|
550
|
+
name: parameterName,
|
|
551
|
+
tier: props.tier,
|
|
552
|
+
type: ParameterType.STRING_LIST,
|
|
553
|
+
insecureValue: props.stringListValue
|
|
554
|
+
? terra_func_1.Fn.join(",", props.stringListValue)
|
|
555
|
+
: undefined,
|
|
556
|
+
value: props.sensitiveStringListValue
|
|
557
|
+
? terra_func_1.Fn.join(",", props.sensitiveStringListValue)
|
|
558
|
+
: undefined,
|
|
559
|
+
});
|
|
560
|
+
this.parameterName = this.resource.name;
|
|
561
|
+
this.parameterArn = (0, parameter_util_1.arnForParameterName)(this, this.parameterName, {
|
|
562
|
+
physicalName: parameterName,
|
|
563
|
+
simpleName: props.simpleName,
|
|
564
|
+
});
|
|
565
|
+
this.parameterType = this.resource.type;
|
|
566
|
+
this.stringListValue = isSensitive
|
|
567
|
+
? terra_func_1.Fn.split(",", this.resource.value)
|
|
568
|
+
: terra_func_1.Fn.split(",", this.resource.insecureValue);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
exports.StringListParameter = StringListParameter;
|
|
572
|
+
_b = JSII_RTTI_SYMBOL_1;
|
|
573
|
+
StringListParameter[_b] = { fqn: "terraconstructs.aws.storage.StringListParameter", version: "0.0.12" };
|
|
574
|
+
/**
|
|
575
|
+
* Validates whether a supplied value conforms to the allowedPattern, granted neither is an unresolved token.
|
|
576
|
+
*
|
|
577
|
+
* @param value the value to be validated.
|
|
578
|
+
* @param allowedPattern the regular expression to use for validation.
|
|
579
|
+
*
|
|
580
|
+
* @throws if the ``value`` does not conform to the ``allowedPattern`` and neither is an unresolved token (per
|
|
581
|
+
* ``cdk.unresolved``).
|
|
582
|
+
*/
|
|
583
|
+
function _assertValidValue(value, allowedPattern) {
|
|
584
|
+
if (cdktf_1.Token.isUnresolved(value) || cdktf_1.Token.isUnresolved(allowedPattern)) {
|
|
585
|
+
// Unable to perform validations against unresolved tokens
|
|
586
|
+
return;
|
|
587
|
+
}
|
|
588
|
+
if (!new RegExp(allowedPattern).test(value)) {
|
|
589
|
+
throw new Error(`The supplied value (${value}) does not match the specified allowedPattern (${allowedPattern})`);
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
function makeIdentityForImportedValue(parameterName) {
|
|
593
|
+
return `SsmParameterValue:${parameterName}:C96584B6-F00A-464E-AD19-53AFF4B05118`;
|
|
594
|
+
}
|
|
595
|
+
function validateParameterName(parameterName) {
|
|
596
|
+
if (cdktf_1.Token.isUnresolved(parameterName)) {
|
|
597
|
+
return;
|
|
598
|
+
}
|
|
599
|
+
if (parameterName.length > 2048) {
|
|
600
|
+
throw new Error("name cannot be longer than 2048 characters.");
|
|
601
|
+
}
|
|
602
|
+
if (!parameterName.match(/^[\/\w.-]+$/)) {
|
|
603
|
+
throw new Error(`name must only contain letters, numbers, and the following 4 symbols .-_/; got ${parameterName}`);
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1ldGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F3cy9zdG9yYWdlL3BhcmFtZXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZGQUE2RjtBQUU3RixzREFBd0U7QUFDeEUsaUNBVWU7QUFFZixxREFBdUQ7QUFDdkQsaURBQXNDO0FBQ3RDLG9EQUkwQjtBQUMxQiw0Q0FBd0M7QUFFeEMsOEJBQThCO0FBdU05Qjs7R0FFRztBQUNILE1BQWUsYUFBYyxTQUFRLGdDQUFnQjtJQUluRCxJQUFXLGdCQUFnQjtRQUN6QixPQUFPO1lBQ0wsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQy9CLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7U0FDbEMsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQVNNLFNBQVMsQ0FBQyxPQUF1QjtRQUN0QyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUM5QixPQUFPO1lBQ1AsT0FBTyxFQUFFO2dCQUNQLHdCQUF3QjtnQkFDeEIsbUJBQW1CO2dCQUNuQixrQkFBa0I7Z0JBQ2xCLHlCQUF5QjthQUMxQjtZQUNELFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDbEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFVBQVUsQ0FBQyxPQUF1QjtRQUN2QyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQyxD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QUFHLElBQUksRUFBRSxDQUFDO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUN4QyxNQUFNLElBQUksS0FBSyxDQUNiLGtGQUFrRixhQUFhLEVBQUUsQ0FDbEcsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTc1LjEvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLXNzbS9saWIvcGFyYW1ldGVyLnRzXG5cbmltcG9ydCB7IHNzbVBhcmFtZXRlciwgZGF0YUF3c1NzbVBhcmFtZXRlciB9IGZyb20gXCJAY2RrdGYvcHJvdmlkZXItYXdzXCI7XG5pbXBvcnQge1xuICAvLyBDZm5EeW5hbWljUmVmZXJlbmNlLFxuICAvLyBDZm5EeW5hbWljUmVmZXJlbmNlU2VydmljZSxcbiAgLy8gVE9ETzogVXNlIEdyaWQgYXMgY29udGV4dFByb3ZpZGVyXG4gIC8vIENvbnRleHRQcm92aWRlcixcbiAgQW5ub3RhdGlvbnMsXG4gIC8vIEZuLFxuICBUb2tlbixcbiAgVG9rZW5pemF0aW9uLFxuICBJUmVzb2x2YWJsZSxcbn0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgYXJuRm9yUGFyYW1ldGVyTmFtZSB9IGZyb20gXCIuL3BhcmFtZXRlci11dGlsXCI7XG5pbXBvcnQgeyBGbiB9IGZyb20gXCIuLi8uLi90ZXJyYS1mdW5jXCI7XG5pbXBvcnQge1xuICBJQXdzQ29uc3RydWN0LFxuICBBd3NDb25zdHJ1Y3RCYXNlLFxuICBBd3NDb25zdHJ1Y3RQcm9wcyxcbn0gZnJvbSBcIi4uL2F3cy1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IEF3c1N0YWNrIH0gZnJvbSBcIi4uL2F3cy1zdGFja1wiO1xuaW1wb3J0ICogYXMgZW5jcnlwdGlvbiBmcm9tIFwiLi4vZW5jcnlwdGlvblwiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCIuLi9pYW1cIjtcblxuLyoqXG4gKiBPdXRwdXRzIHdoaWNoIG1heSBiZSByZWdpc3RlcmVkIGZvciBvdXRwdXQgdmlhIHRoZSBHcmlkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmFtZXRlck91dHB1dHMge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgU1NNIFBhcmFtZXRlciByZXNvdXJjZS5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1ldGVyQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBTU00gUGFyYW1ldGVyIHJlc291cmNlLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBTU00gUGFyYW1ldGVyIHJlc291cmNlLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJUeXBlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQW4gU1NNIFBhcmFtZXRlciByZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVBhcmFtZXRlciBleHRlbmRzIElBd3NDb25zdHJ1Y3Qge1xuICAvKiogU3Ryb25nbHkgdHlwZWQgb3V0cHV0cyAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJPdXRwdXRzOiBQYXJhbWV0ZXJPdXRwdXRzO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBTU00gUGFyYW1ldGVyIHJlc291cmNlLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIFNTTSBQYXJhbWV0ZXIgcmVzb3VyY2UuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlck5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIFNTTSBQYXJhbWV0ZXIgcmVzb3VyY2UuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlclR5cGU6IHN0cmluZztcblxuICAvKipcbiAgICogR3JhbnRzIHJlYWQgKERlc2NyaWJlUGFyYW1ldGVyLCBHZXRQYXJhbWV0ZXJzLCBHZXRQYXJhbWV0ZXIsIEdldFBhcmFtZXRlckhpc3RvcnkpIHBlcm1pc3Npb25zIG9uIHRoZSBTU00gUGFyYW1ldGVyLlxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSB0aGUgcm9sZSB0byBiZSBncmFudGVkIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhlIHBhcmFtZXRlci5cbiAgICovXG4gIGdyYW50UmVhZChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnRzIHdyaXRlIChQdXRQYXJhbWV0ZXIpIHBlcm1pc3Npb25zIG9uIHRoZSBTU00gUGFyYW1ldGVyLlxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSB0aGUgcm9sZSB0byBiZSBncmFudGVkIHdyaXRlIGFjY2VzcyB0byB0aGUgcGFyYW1ldGVyLlxuICAgKi9cbiAgZ3JhbnRXcml0ZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcbn1cblxuLyoqXG4gKiBBIFN0cmluZyBTU00gUGFyYW1ldGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElTdHJpbmdQYXJhbWV0ZXIgZXh0ZW5kcyBJUGFyYW1ldGVyIHtcbiAgLyoqXG4gICAqIFRoZSBwYXJhbWV0ZXIgdmFsdWUuIFZhbHVlIG11c3Qgbm90IG5lc3QgYW5vdGhlciBwYXJhbWV0ZXIuIERvIG5vdCB1c2Uge3t9fSBpbiB0aGUgdmFsdWUuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGUgVmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IHN0cmluZ1ZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBTdHJpbmdMaXN0IFNTTSBQYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVN0cmluZ0xpc3RQYXJhbWV0ZXIgZXh0ZW5kcyBJUGFyYW1ldGVyIHtcbiAgLyoqXG4gICAqIFRoZSBwYXJhbWV0ZXIgdmFsdWUuIFZhbHVlIG11c3Qgbm90IG5lc3QgYW5vdGhlciBwYXJhbWV0ZXIuIERvIG5vdCB1c2Uge3t9fSBpbiB0aGUgdmFsdWUuIFZhbHVlcyBpbiB0aGUgYXJyYXlcbiAgICogY2Fubm90IGNvbnRhaW4gY29tbWFzIChgYCxgYCkuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGUgVmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IHN0cmluZ0xpc3RWYWx1ZTogc3RyaW5nW107XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBuZWVkZWQgdG8gY3JlYXRlIGEgbmV3IFNTTSBQYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyYW1ldGVyT3B0aW9ucyBleHRlbmRzIEF3c0NvbnN0cnVjdFByb3BzIHtcbiAgLyoqXG4gICAqIEEgcmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gdmFsaWRhdGUgdGhlIHBhcmFtZXRlciB2YWx1ZS4gRm9yIGV4YW1wbGUsIGZvciBTdHJpbmcgdHlwZXMgd2l0aCB2YWx1ZXMgcmVzdHJpY3RlZCB0b1xuICAgKiBudW1iZXJzLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGZvbGxvd2luZzogYGBeXFxkKyRgYFxuICAgKlxuICAgKiBAZGVmYXVsdCBubyB2YWxpZGF0aW9uIGlzIHBlcmZvcm1lZFxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZFBhdHRlcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXJhbWV0ZXIgdGhhdCB5b3Ugd2FudCB0byBhZGQgdG8gdGhlIHN5c3RlbS5cbiAgICpcbiAgICogQGRlZmF1bHQgbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSBuYW1lIHdpbGwgYmUgZ2VuZXJhdGVkIGJ5IENsb3VkRm9ybWF0aW9uXG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcGFyYW1ldGVyIG5hbWUgaXMgYSBzaW1wbGUgbmFtZS4gQSBwYXJhbWV0ZXIgbmFtZVxuICAgKiB3aXRob3V0IGFueSBcIi9cIiBpcyBjb25zaWRlcmVkIGEgc2ltcGxlIG5hbWUuIElmIHRoZSBwYXJhbWV0ZXIgbmFtZSBpbmNsdWRlc1xuICAgKiBcIi9cIiwgc2V0dGluZyBzaW1wbGVOYW1lIHRvIHRydWUgbWlnaHQgY2F1c2UgdW5pbnRlbmRlZCBpc3N1ZXMgc3VjaFxuICAgKiBhcyBkdXBsaWNhdGUgXCIvXCIgaW4gdGhlIHJlc3VsdGluZyBBUk4uXG4gICAqXG4gICAqIFRoaXMgaXMgcmVxdWlyZWQgb25seSBpZiBgcGFyYW1ldGVyTmFtZWAgaXMgYSB0b2tlbiwgd2hpY2ggbWVhbnMgd2VcbiAgICogYXJlIHVuYWJsZSB0byBkZXRlY3QgaWYgdGhlIG5hbWUgaXMgc2ltcGxlIG9yIFwicGF0aC1saWtlXCIgZm9yIHRoZSBwdXJwb3NlXG4gICAqIG9mIHJlbmRlcmluZyBTU00gcGFyYW1ldGVyIEFSTnMuXG4gICAqXG4gICAqIElmIGBwYXJhbWV0ZXJOYW1lYCBpcyBub3Qgc3BlY2lmaWVkLCBgc2ltcGxlTmFtZWAgbXVzdCBiZSBgdHJ1ZWAgKG9yXG4gICAqIHVuZGVmaW5lZCkgc2luY2UgdGhlIG5hbWUgZ2VuZXJhdGVkIGJ5IEFXUyBDbG91ZEZvcm1hdGlvbiBpcyBhbHdheXMgYVxuICAgKiBzaW1wbGUgbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdXRvLWRldGVjdCBiYXNlZCBvbiBgcGFyYW1ldGVyTmFtZWBcbiAgICovXG4gIHJlYWRvbmx5IHNpbXBsZU5hbWU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdGllciBvZiB0aGUgc3RyaW5nIHBhcmFtZXRlclxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgdGllcj86IFBhcmFtZXRlclRpZXI7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBuZWVkZWQgdG8gY3JlYXRlIGEgU3RyaW5nIFNTTSBwYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyaW5nUGFyYW1ldGVyUHJvcHMgZXh0ZW5kcyBQYXJhbWV0ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLiBJdCBtYXkgbm90IHJlZmVyZW5jZSBhbm90aGVyIHBhcmFtZXRlciBhbmQgYGB7e319YGAgY2Fubm90IGJlIHVzZWQgaW4gdGhlIHZhbHVlLlxuICAgKlxuICAgKiBUaGlzIGlzIG5ldmVyIG1hcmtlZCBhcyBzZW5zaXRpdmUuXG4gICAqXG4gICAqIGNvbmZsaWN0cyB3aXRoIGBzZW5zaXRpdmVTdHJpbmdWYWx1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHN0cmluZ1ZhbHVlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciBhbHdheXMgbWFya2VkIGFzIHNlbnNpdGl2ZS5cbiAgICpcbiAgICogSXQgbWF5IG5vdCByZWZlcmVuY2UgYW5vdGhlciBwYXJhbWV0ZXIgYW5kIGBge3t9fWBgIGNhbm5vdCBiZSB1c2VkIGluIHRoZSB2YWx1ZS5cbiAgICpcbiAgICogY29uZmxpY3RzIHdpdGggYHN0cmluZ1ZhbHVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2Vuc2l0aXZlU3RyaW5nVmFsdWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBzdHJpbmcgcGFyYW1ldGVyXG4gICAqXG4gICAqIEBkZWZhdWx0IFBhcmFtZXRlclR5cGUuU1RSSU5HXG4gICAqIEBkZXByZWNhdGVkIC0gdHlwZSB3aWxsIGFsd2F5cyBiZSAnU3RyaW5nJ1xuICAgKi9cbiAgcmVhZG9ubHkgdHlwZT86IFBhcmFtZXRlclR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHBhcmFtZXRlciwgc3VjaCBhcyBgdGV4dGAgb3IgYGF3czplYzI6aW1hZ2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBQYXJhbWV0ZXJEYXRhVHlwZS5URVhUXG4gICAqL1xuICByZWFkb25seSBkYXRhVHlwZT86IFBhcmFtZXRlckRhdGFUeXBlO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgbmVlZGVkIHRvIGNyZWF0ZSBhIFN0cmluZ0xpc3QgU1NNIFBhcmFtZXRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0cmluZ0xpc3RQYXJhbWV0ZXJQcm9wcyBleHRlbmRzIFBhcmFtZXRlck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHZhbHVlcyBvZiB0aGUgcGFyYW1ldGVyLiBJdCBtYXkgbm90IHJlZmVyZW5jZSBhbm90aGVyIHBhcmFtZXRlciBhbmQgYGB7e319YGAgY2Fubm90IGJlIHVzZWQgaW4gdGhlIHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RyaW5nTGlzdFZhbHVlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZXMgb2YgdGhlIHBhcmFtZXRlciBhbHdheXMgbWFya2VkIGFzIHNlbnNpdGl2ZS5cbiAgICpcbiAgICogSXQgbWF5IG5vdCByZWZlcmVuY2UgYW5vdGhlciBwYXJhbWV0ZXIgYW5kIGBge3t9fWBgIGNhbm5vdCBiZSB1c2VkIGluIHRoZSB2YWx1ZS5cbiAgICpcbiAgICogY29uZmxpY3RzIHdpdGggYHN0cmluZ0xpc3RWYWx1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNlbnNpdGl2ZVN0cmluZ0xpc3RWYWx1ZT86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEJhc2ljIGZlYXR1cmVzIHNoYXJlZCBhY3Jvc3MgYWxsIHR5cGVzIG9mIFNTTSBQYXJhbWV0ZXJzLlxuICovXG5hYnN0cmFjdCBjbGFzcyBQYXJhbWV0ZXJCYXNlIGV4dGVuZHMgQXdzQ29uc3RydWN0QmFzZSBpbXBsZW1lbnRzIElQYXJhbWV0ZXIge1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgcGFyYW1ldGVyQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBwYXJhbWV0ZXJOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBwYXJhbWV0ZXJUeXBlOiBzdHJpbmc7XG4gIHB1YmxpYyBnZXQgcGFyYW1ldGVyT3V0cHV0cygpOiBQYXJhbWV0ZXJPdXRwdXRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyYW1ldGVyQXJuOiB0aGlzLnBhcmFtZXRlckFybixcbiAgICAgIHBhcmFtZXRlck5hbWU6IHRoaXMucGFyYW1ldGVyTmFtZSxcbiAgICAgIHBhcmFtZXRlclR5cGU6IHRoaXMucGFyYW1ldGVyVHlwZSxcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBnZXQgb3V0cHV0cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJPdXRwdXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBlbmNyeXB0aW9uIGtleSB0aGF0IGlzIHVzZWQgdG8gZW5jcnlwdCB0aGlzIHBhcmFtZXRlci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IG1hc3RlciBrZXlcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbmNyeXB0aW9uS2V5PzogZW5jcnlwdGlvbi5JS2V5O1xuXG4gIHB1YmxpYyBncmFudFJlYWQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIGlmICh0aGlzLmVuY3J5cHRpb25LZXkpIHtcbiAgICAgIHRoaXMuZW5jcnlwdGlvbktleS5ncmFudERlY3J5cHQoZ3JhbnRlZSk7XG4gICAgfVxuICAgIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgXCJzc206RGVzY3JpYmVQYXJhbWV0ZXJzXCIsXG4gICAgICAgIFwic3NtOkdldFBhcmFtZXRlcnNcIixcbiAgICAgICAgXCJzc206R2V0UGFyYW1ldGVyXCIsXG4gICAgICAgIFwic3NtOkdldFBhcmFtZXRlckhpc3RvcnlcIixcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZUFybnM6IFt0aGlzLnBhcmFtZXRlckFybl0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ3JhbnRXcml0ZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgaWYgKHRoaXMuZW5jcnlwdGlvbktleSkge1xuICAgICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdChncmFudGVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICBncmFudGVlLFxuICAgICAgYWN0aW9uczogW1wic3NtOlB1dFBhcmFtZXRlclwiXSxcbiAgICAgIHJlc291cmNlQXJuczogW3RoaXMucGFyYW1ldGVyQXJuXSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIENGTiBTU00gUGFyYW1ldGVyXG4gKlxuICogVXNpbmcgc3BlY2lmaWMgdHlwZXMgY2FuIGJlIGhlbHBmdWwgaW4gY2F0Y2hpbmcgaW52YWxpZCB2YWx1ZXNcbiAqIGF0IHRoZSBzdGFydCBvZiBjcmVhdGluZyBvciB1cGRhdGluZyBhIHN0YWNrLiBDbG91ZEZvcm1hdGlvbiB2YWxpZGF0ZXNcbiAqIHRoZSB2YWx1ZXMgYWdhaW5zdCBleGlzdGluZyB2YWx1ZXMgaW4gdGhlIGFjY291bnQuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9wYXJhbWV0ZXJzLXNlY3Rpb24tc3RydWN0dXJlLmh0bWwjYXdzLXNzbS1wYXJhbWV0ZXItdHlwZXNcbiAqL1xuZXhwb3J0IGVudW0gUGFyYW1ldGVyVmFsdWVUeXBlIHtcbiAgLyoqXG4gICAqIFN0cmluZ1xuICAgKi9cbiAgU1RSSU5HID0gXCJTdHJpbmdcIixcblxuICAvKipcbiAgICogQW4gQXZhaWxhYmlsaXR5IFpvbmUsIHN1Y2ggYXMgdXMtd2VzdC0yYS5cbiAgICovXG4gIEFXU19FQzJfQVZBSUxBQklMSVRZWk9ORV9OQU1FID0gXCJBV1M6OkVDMjo6QXZhaWxhYmlsaXR5Wm9uZTo6TmFtZVwiLFxuXG4gIC8qKlxuICAgKiBBbiBBbWF6b24gRUMyIGltYWdlIElELCBzdWNoIGFzIGFtaS0wZmY4YTkxNTA3Zjc3Zjg2Ny5cbiAgICovXG4gIEFXU19FQzJfSU1BR0VfSUQgPSBcIkFXUzo6RUMyOjpJbWFnZTo6SWRcIixcblxuICAvKipcbiAgICogQW4gQW1hem9uIEVDMiBpbnN0YW5jZSBJRCwgc3VjaCBhcyBpLTFlNzMxYTMyLlxuICAgKi9cbiAgQVdTX0VDMl9JTlNUQU5DRV9JRCA9IFwiQVdTOjpFQzI6Okluc3RhbmNlOjpJZFwiLFxuXG4gIC8qKlxuICAgKiBBbiBBbWF6b24gRUMyIGtleSBwYWlyIG5hbWUuXG4gICAqL1xuICBBV1NfRUMyX0tFWVBBSVJfS0VZTkFNRSA9IFwiQVdTOjpFQzI6OktleVBhaXI6OktleU5hbWVcIixcblxuICAvKipcbiAgICogQW4gRUMyLUNsYXNzaWMgb3IgZGVmYXVsdCBWUEMgc2VjdXJpdHkgZ3JvdXAgbmFtZSwgc3VjaCBhcyBteS1zZy1hYmMuXG4gICAqL1xuICBBV1NfRUMyX1NFQ1VSSVRZR1JPVVBfR1JPVVBOQU1FID0gXCJBV1M6OkVDMjo6U2VjdXJpdHlHcm91cDo6R3JvdXBOYW1lXCIsXG5cbiAgLyoqXG4gICAqIEEgc2VjdXJpdHkgZ3JvdXAgSUQsIHN1Y2ggYXMgc2ctYTEyM2ZkODUuXG4gICAqL1xuICBBV1NfRUMyX1NFQ1VSSVRZR1JPVVBfSUQgPSBcIkFXUzo6RUMyOjpTZWN1cml0eUdyb3VwOjpJZFwiLFxuXG4gIC8qKlxuICAgKiBBIHN1Ym5ldCBJRCwgc3VjaCBhcyBzdWJuZXQtMTIzYTM1MWUuXG4gICAqL1xuICBBV1NfRUMyX1NVQk5FVF9JRCA9IFwiQVdTOjpFQzI6OlN1Ym5ldDo6SWRcIixcblxuICAvKipcbiAgICogQW4gQW1hem9uIEVCUyB2b2x1bWUgSUQsIHN1Y2ggYXMgdm9sLTNjZGQzZjU2LlxuICAgKi9cbiAgQVdTX0VDMl9WT0xVTUVfSUQgPSBcIkFXUzo6RUMyOjpWb2x1bWU6OklkXCIsXG5cbiAgLyoqXG4gICAqIEEgVlBDIElELCBzdWNoIGFzIHZwYy1hMTIzYmFhMy5cbiAgICovXG4gIEFXU19FQzJfVlBDX0lEID0gXCJBV1M6OkVDMjo6VlBDOjpJZFwiLFxuXG4gIC8qKlxuICAgKiBBbiBBbWF6b24gUm91dGUgNTMgaG9zdGVkIHpvbmUgSUQsIHN1Y2ggYXMgWjIzWVhWNE9WUEwwNEEuXG4gICAqL1xuICBBV1NfUk9VVEU1M19IT1NURURaT05FX0lEID0gXCJBV1M6OlJvdXRlNTM6Okhvc3RlZFpvbmU6OklkXCIsXG59XG5cbi8vIERlcHJlY2F0ZWQgLSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy82MDM5XG5cbi8qKlxuICogU1NNIHBhcmFtZXRlciB0eXBlXG4gKiBAZGVwcmVjYXRlZCB0aGVzZSB0eXBlcyBhcmUgbm8gbG9uZ2VyIHVzZWRcbiAqL1xuZXhwb3J0IGVudW0gUGFyYW1ldGVyVHlwZSB7XG4gIC8qKlxuICAgKiBTdHJpbmdcbiAgICovXG4gIFNUUklORyA9IFwiU3RyaW5nXCIsXG4gIC8qKlxuICAgKiBTZWN1cmUgU3RyaW5nXG4gICAqXG4gICAqIFBhcmFtZXRlciBTdG9yZSB1c2VzIGFuIEFXUyBLZXkgTWFuYWdlbWVudCBTZXJ2aWNlIChLTVMpIGN1c3RvbWVyIG1hc3RlciBrZXkgKENNSykgdG8gZW5jcnlwdCB0aGUgcGFyYW1ldGVyIHZhbHVlLlxuICAgKiBQYXJhbWV0ZXJzIG9mIHR5cGUgU2VjdXJlU3RyaW5nIGNhbm5vdCBiZSBjcmVhdGVkIGRpcmVjdGx5IGZyb20gYSBDREsgYXBwbGljYXRpb24gZHVlIHRvIENGTiBsaW1pdGF0aW9ucy5cbiAgICpcbiAgICogTk9URTogVGVycmFmb3JtIGRvZXMgbm90IHByZXZlbnQgY3JlYXRpbmcgU2VjdXJlU3RyaW5nIHBhcmFtZXRlcnMsIGJ1dCBpdCBpcyBub3QgcmVjb21tZW5kZWRcbiAgICogYmVjYXVzZSB0aGUgdmFsdWUgd2lsbCBiZSBzdG9yZWQgaW4gcGxhaW4gdGV4dCBpbiB0aGUgc3RhdGUgZmlsZS5cbiAgICovXG4gIFNFQ1VSRV9TVFJJTkcgPSBcIlNlY3VyZVN0cmluZ1wiLFxuICAvKipcbiAgICogU3RyaW5nIExpc3RcbiAgICovXG4gIFNUUklOR19MSVNUID0gXCJTdHJpbmdMaXN0XCIsXG4gIC8qKlxuICAgKiBBbiBBbWF6b24gRUMyIGltYWdlIElELCBzdWNoIGFzIGFtaS0wZmY4YTkxNTA3Zjc3Zjg2N1xuICAgKi9cbiAgQVdTX0VDMl9JTUFHRV9JRCA9IFwiQVdTOjpFQzI6OkltYWdlOjpJZFwiLFxufVxuXG4vKipcbiAqIFNTTSBwYXJhbWV0ZXIgZGF0YSB0eXBlXG4gKi9cbmV4cG9ydCBlbnVtIFBhcmFtZXRlckRhdGFUeXBlIHtcbiAgLyoqXG4gICAqIFRleHRcbiAgICovXG4gIFRFWFQgPSBcInRleHRcIixcbiAgLyoqXG4gICAqIEF3cyBFYzIgSW1hZ2VcbiAgICovXG4gIEFXU19FQzJfSU1BR0UgPSBcImF3czplYzI6aW1hZ2VcIixcbn1cblxuLyoqXG4gKiBTU00gcGFyYW1ldGVyIHRpZXJcbiAqL1xuZXhwb3J0IGVudW0gUGFyYW1ldGVyVGllciB7XG4gIC8qKlxuICAgKiBTdHJpbmdcbiAgICovXG4gIEFEVkFOQ0VEID0gXCJBZHZhbmNlZFwiLFxuICAvKipcbiAgICogU3RyaW5nXG4gICAqL1xuICBJTlRFTExJR0VOVF9USUVSSU5HID0gXCJJbnRlbGxpZ2VudC1UaWVyaW5nXCIsXG4gIC8qKlxuICAgKiBTdHJpbmdcbiAgICovXG4gIFNUQU5EQVJEID0gXCJTdGFuZGFyZFwiLFxufVxuXG4vKipcbiAqIENvbW1vbiBhdHRyaWJ1dGVzIGZvciBzdHJpbmcgcGFyYW1ldGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tb25TdHJpbmdQYXJhbWV0ZXJBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgc3RvcmUgdmFsdWUuXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgY2FuIGJlIGEgdG9rZW4gb3IgYSBjb25jcmV0ZSBzdHJpbmcuIElmIGl0IGlzIGEgY29uY3JldGUgc3RyaW5nXG4gICAqIGFuZCBpbmNsdWRlcyBcIi9cIiBpdCBtdXN0IGFsc28gYmUgcHJlZml4ZWQgd2l0aCBhIFwiL1wiIChmdWxseS1xdWFsaWZpZWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1ldGVyTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcGFyYW1ldGVyIG5hbWUgaXMgYSBzaW1wbGUgbmFtZS4gQSBwYXJhbWV0ZXIgbmFtZVxuICAgKiB3aXRob3V0IGFueSBcIi9cIiBpcyBjb25zaWRlcmVkIGEgc2ltcGxlIG5hbWUuIElmIHRoZSBwYXJhbWV0ZXIgbmFtZSBpbmNsdWRlc1xuICAgKiBcIi9cIiwgc2V0dGluZyBzaW1wbGVOYW1lIHRvIHRydWUgbWlnaHQgY2F1c2UgdW5pbnRlbmRlZCBpc3N1ZXMgc3VjaFxuICAgKiBhcyBkdXBsaWNhdGUgXCIvXCIgaW4gdGhlIHJlc3VsdGluZyBBUk4uXG4gICAqXG4gICAqIFRoaXMgaXMgcmVxdWlyZWQgb25seSBpZiBgcGFyYW1ldGVyTmFtZWAgaXMgYSB0b2tlbiwgd2hpY2ggbWVhbnMgd2VcbiAgICogYXJlIHVuYWJsZSB0byBkZXRlY3QgaWYgdGhlIG5hbWUgaXMgc2ltcGxlIG9yIFwicGF0aC1saWtlXCIgZm9yIHRoZSBwdXJwb3NlXG4gICAqIG9mIHJlbmRlcmluZyBTU00gcGFyYW1ldGVyIEFSTnMuXG4gICAqXG4gICAqIElmIGBwYXJhbWV0ZXJOYW1lYCBpcyBub3Qgc3BlY2lmaWVkLCBgc2ltcGxlTmFtZWAgbXVzdCBiZSBgdHJ1ZWAgKG9yXG4gICAqIHVuZGVmaW5lZCkgc2luY2UgdGhlIG5hbWUgZ2VuZXJhdGVkIGJ5IEFXUyBDbG91ZEZvcm1hdGlvbiBpcyBhbHdheXMgYVxuICAgKiBzaW1wbGUgbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdXRvLWRldGVjdCBiYXNlZCBvbiBgcGFyYW1ldGVyTmFtZWBcbiAgICovXG4gIHJlYWRvbmx5IHNpbXBsZU5hbWU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuNDkuMC9kb2NzL2RhdGEtc291cmNlcy9zc21fcGFyYW1ldGVyI3dpdGhfZGVjcnlwdGlvbiBEYXRhQXdzU3NtUGFyYW1ldGVyI3dpdGhfZGVjcnlwdGlvbn1cbiAgICpcbiAgICogQGRlZmF1bHQ6IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHdpdGhEZWNyeXB0aW9uPzogYm9vbGVhbiB8IElSZXNvbHZhYmxlO1xufVxuXG4vKipcbiAqIEF0dHJpYnV0ZXMgZm9yIHBhcmFtZXRlcnMgb2YgdmFyaW91cyB0eXBlcyBvZiBzdHJpbmcuXG4gKlxuICogQHNlZSBQYXJhbWV0ZXJUeXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlc1xuICBleHRlbmRzIENvbW1vblN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSB2YWx1ZSB5b3Ugd2lzaCB0byByZXRyaWV2ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgVGhlIGxhdGVzdCB2ZXJzaW9uIHdpbGwgYmUgcmV0cmlldmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHN0cmluZyBwYXJhbWV0ZXJcbiAgICpcbiAgICogQGRlZmF1bHQgUGFyYW1ldGVyVHlwZS5TVFJJTkdcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2UgdmFsdWVUeXBlIGluc3RlYWRcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiBQYXJhbWV0ZXJUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgc3RyaW5nIHBhcmFtZXRlciB2YWx1ZVxuICAgKlxuICAgKiBVc2luZyBzcGVjaWZpYyB0eXBlcyBjYW4gYmUgaGVscGZ1bCBpbiBjYXRjaGluZyBpbnZhbGlkIHZhbHVlc1xuICAgKiBhdCB0aGUgc3RhcnQgb2YgY3JlYXRpbmcgb3IgdXBkYXRpbmcgYSBzdGFjay4gQ2xvdWRGb3JtYXRpb24gdmFsaWRhdGVzXG4gICAqIHRoZSB2YWx1ZXMgYWdhaW5zdCBleGlzdGluZyB2YWx1ZXMgaW4gdGhlIGFjY291bnQuXG4gICAqXG4gICAqIE5vdGUgLSBpZiB5b3Ugd2FudCB0byBhbGxvdyB2YWx1ZXMgZnJvbSBkaWZmZXJlbnQgQVdTIGFjY291bnRzLCB1c2VcbiAgICogUGFyYW1ldGVyVmFsdWVUeXBlLlNUUklOR1xuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL3BhcmFtZXRlcnMtc2VjdGlvbi1zdHJ1Y3R1cmUuaHRtbCNhd3Mtc3NtLXBhcmFtZXRlci10eXBlc1xuICAgKlxuICAgKiBAZGVmYXVsdCBQYXJhbWV0ZXJWYWx1ZVR5cGUuU1RSSU5HXG4gICAqL1xuICByZWFkb25seSB2YWx1ZVR5cGU/OiBQYXJhbWV0ZXJWYWx1ZVR5cGU7XG59XG5cbi8qKlxuICogQXR0cmlidXRlcyBmb3IgcGFyYW1ldGVycyBvZiBzdHJpbmcgbGlzdCB0eXBlLlxuICpcbiAqIEBzZWUgUGFyYW1ldGVyVHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RQYXJhbWV0ZXJBdHRyaWJ1dGVzXG4gIGV4dGVuZHMgQ29tbW9uU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHZhbHVlIHlvdSB3aXNoIHRvIHJldHJpZXZlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBUaGUgbGF0ZXN0IHZlcnNpb24gd2lsbCBiZSByZXRyaWV2ZWQuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgc3RyaW5nIGxpc3QgcGFyYW1ldGVyIHZhbHVlLlxuICAgKlxuICAgKiBVc2luZyBzcGVjaWZpYyB0eXBlcyBjYW4gYmUgaGVscGZ1bCBpbiBjYXRjaGluZyBpbnZhbGlkIHZhbHVlc1xuICAgKiBhdCB0aGUgc3RhcnQgb2YgY3JlYXRpbmcgb3IgdXBkYXRpbmcgYSBzdGFjay4gQ2xvdWRGb3JtYXRpb24gdmFsaWRhdGVzXG4gICAqIHRoZSB2YWx1ZXMgYWdhaW5zdCBleGlzdGluZyB2YWx1ZXMgaW4gdGhlIGFjY291bnQuXG4gICAqXG4gICAqIE5vdGUgLSBpZiB5b3Ugd2FudCB0byBhbGxvdyB2YWx1ZXMgZnJvbSBkaWZmZXJlbnQgQVdTIGFjY291bnRzLCB1c2VcbiAgICogUGFyYW1ldGVyVmFsdWVUeXBlLlNUUklOR1xuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL3BhcmFtZXRlcnMtc2VjdGlvbi1zdHJ1Y3R1cmUuaHRtbCNhd3Mtc3NtLXBhcmFtZXRlci10eXBlc1xuICAgKlxuICAgKiBAZGVmYXVsdCBQYXJhbWV0ZXJWYWx1ZVR5cGUuU1RSSU5HXG4gICAqL1xuICByZWFkb25seSBlbGVtZW50VHlwZT86IFBhcmFtZXRlclZhbHVlVHlwZTtcbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGVzIGZvciBzZWN1cmUgc3RyaW5nIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJlU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlc1xuICBleHRlbmRzIENvbW1vblN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSB2YWx1ZSB5b3Ugd2lzaCB0byByZXRyaWV2ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBV1MgQ2xvdWRGb3JtYXRpb24gdXNlcyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHBhcmFtZXRlclxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGVuY3J5cHRpb24ga2V5IHRoYXQgaXMgdXNlZCB0byBlbmNyeXB0IHRoaXMgcGFyYW1ldGVyXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdCBtYXN0ZXIga2V5XG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5PzogZW5jcnlwdGlvbi5JS2V5O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgU3RyaW5nIFNTTSBQYXJhbWV0ZXIuXG4gKiBAcmVzb3VyY2UgYXdzX3NzbV9wYXJhbWV0ZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc3NtUGFyYW1ldGVyID0gbmV3IHN0b3JhZ2UuU3RyaW5nUGFyYW1ldGVyKHRoaXMsICdteVNzbVBhcmFtZXRlcicsIHtcbiAqICAgIHBhcmFtZXRlck5hbWU6ICdteVNzbVBhcmFtZXRlcicsXG4gKiAgICBzdHJpbmdWYWx1ZTogJ215U3NtUGFyYW1ldGVyVmFsdWUnLFxuICogfSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJpbmdQYXJhbWV0ZXIgZXh0ZW5kcyBQYXJhbWV0ZXJCYXNlIGltcGxlbWVudHMgSVN0cmluZ1BhcmFtZXRlciB7XG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIGV4dGVybmFsIHN0cmluZyBwYXJhbWV0ZXIgYnkgbmFtZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZ1BhcmFtZXRlck5hbWUoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHN0cmluZ1BhcmFtZXRlck5hbWU6IHN0cmluZyxcbiAgKTogSVN0cmluZ1BhcmFtZXRlciB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbVN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICBwYXJhbWV0ZXJOYW1lOiBzdHJpbmdQYXJhbWV0ZXJOYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgYW4gZXh0ZXJuYWwgc3RyaW5nIHBhcmFtZXRlciBieSBBUk4uXG4gICAqXG4gICAqIFRoZSB1bmVuY3J5cHRlZCB2YWx1ZSBvZiBhIFNlY3VyZVN0cmluZyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgcmF3IHN0YXRlIGFzIHBsYWluLXRleHQuXG4gICAqIFtSZWFkIG1vcmUgYWJvdXQgc2Vuc2l0aXZlIGRhdGEgaW4gc3RhdGVdKGh0dHBzOi8vd3d3LnRlcnJhZm9ybS5pby9kb2NzL3N0YXRlL3NlbnNpdGl2ZS1kYXRhLmh0bWwpLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nUGFyYW1ldGVyQXJuKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdHJpbmdQYXJhbWV0ZXJBcm46IHN0cmluZyxcbiAgKTogSVN0cmluZ1BhcmFtZXRlciB7XG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChzdHJpbmdQYXJhbWV0ZXJBcm4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdHJpbmdQYXJhbWV0ZXJBcm4gY2Fubm90IGJlIGFuIHVucmVzb2x2ZWQgdG9rZW5cIik7XG4gICAgfVxuXG4gICAgLy8gaGFzIHRvIGJlIHRoZSBzYW1lIHJlZ2lvblxuICAgIC8vIHNwbGl0IHRoZSBhcm4gc3RyaW5nIHRvIGdldCB0aGUgcmVnaW9uIHN0cmluZ1xuICAgIC8vIGFybiBzYW1wbGU6IGFybjphd3M6c3NtOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6cGFyYW1ldGVyL2R1bW15TmFtZVxuICAgIGNvbnN0IGFyblBhcnRzID0gc3RyaW5nUGFyYW1ldGVyQXJuLnNwbGl0KFwiOlwiKTtcbiAgICBjb25zdCBzdGFja1JlZ2lvbiA9IEF3c1N0YWNrLm9mQXdzQ29uc3RydWN0KHNjb3BlKS5yZWdpb247XG4gICAgaWYgKGFyblBhcnRzLmxlbmd0aCAhPT0gNikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5leHBlY3RlZCBTdHJpbmdQYXJhbWV0ZXJBcm4gZm9ybWF0XCIpO1xuICAgIH0gZWxzZSBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHN0YWNrUmVnaW9uKSkge1xuICAgICAgLy8gUmVnaW9uIGlzIHVua25vd24gZHVyaW5nIHN5bnRoZXNpcywgZW1pdCBhIHdhcm5pbmcgZm9yIHZpc2liaWxpdHlcbiAgICAgIC8vIFwiYXdzLWNkay1saWIvYXdzLXNzbTpjcm9zc0FjY291bnRSZWZlcmVuY2VTYW1lUmVnaW9uXCIsXG4gICAgICBBbm5vdGF0aW9ucy5vZihzY29wZSkuYWRkV2FybmluZyhcbiAgICAgICAgXCJDcm9zcy1hY2NvdW50IHJlZmVyZW5jZXMgd2lsbCBvbmx5IHdvcmsgd2l0aGluIHRoZSBzYW1lIHJlZ2lvblwiLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgIVRva2VuLmlzVW5yZXNvbHZlZChzdGFja1JlZ2lvbikgJiZcbiAgICAgIGFyblBhcnRzWzNdICE9PSBzdGFja1JlZ2lvblxuICAgICkge1xuICAgICAgLy8gSWYgdGhlIHJlZ2lvbiBpcyBrbm93biwgaXQgbXVzdCBtYXRjaCB0aGUgcmVnaW9uIHNwZWNpZmllZCBpbiB0aGUgQVJOIHN0cmluZ1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcInN0cmluZ1BhcmFtZXRlckFybiBtdXN0IGJlIGluIHRoZSBzYW1lIHJlZ2lvbiBhcyB0aGUgc3RhY2tcIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1ldGVyVHlwZSA9IFBhcmFtZXRlclZhbHVlVHlwZS5TVFJJTkc7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJOYW1lID1cbiAgICAgIHN0cmluZ1BhcmFtZXRlckFyblxuICAgICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAgIC5wb3AoKVxuICAgICAgICA/LnJlcGxhY2UoL3BhcmFtZXRlclxcLyQvLCBcIlwiKSA/PyBcIlwiO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgZGF0YUF3c1NzbVBhcmFtZXRlci5EYXRhQXdzU3NtUGFyYW1ldGVyKFxuICAgICAgc2NvcGUsXG4gICAgICBgJHtpZH0uUGFyYW1ldGVyYCxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogcGFyYW1ldGVyTmFtZSxcbiAgICAgICAgLy8gd2l0aERlY3J5cHRpb24gZGVmYXVsdHMgdG8gdHJ1ZVxuICAgICAgfSxcbiAgICApO1xuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIFBhcmFtZXRlckJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IHBhcmFtZXRlck5hbWUgPSBwYXJhbWV0ZXJOYW1lO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHBhcmFtZXRlckFybiA9IHN0cmluZ1BhcmFtZXRlckFybjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBwYXJhbWV0ZXJUeXBlID0gcGFyYW1ldGVyVHlwZTtcbiAgICAgIC8vIFVzZSBjYXV0aW9uOiBUaGlzIHZhbHVlIGlzIG5ldmVyIG1hcmtlZCBhcyBzZW5zaXRpdmUuXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgc3RyaW5nVmFsdWUgPSBkYXRhU291cmNlLmluc2VjdXJlVmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIGV4dGVybmFsIHN0cmluZyBwYXJhbWV0ZXIgd2l0aCBuYW1lIGFuZCBvcHRpb25hbCB2ZXJzaW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlcyhcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYXR0cnM6IFN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXMsXG4gICk6IElTdHJpbmdQYXJhbWV0ZXIge1xuICAgIGlmICghYXR0cnMucGFyYW1ldGVyTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwicGFyYW1ldGVyTmFtZSBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nXCIpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBhdHRycy50eXBlICYmXG4gICAgICAhW1BhcmFtZXRlclR5cGUuU1RSSU5HLCBQYXJhbWV0ZXJUeXBlLkFXU19FQzJfSU1BR0VfSURdLmluY2x1ZGVzKFxuICAgICAgICBhdHRycy50eXBlLFxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgZnJvbVN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXMgZG9lcyBub3Qgc3VwcG9ydCAke2F0dHJzLnR5cGV9LiBQbGVhc2UgdXNlIFBhcmFtZXRlclR5cGUuU1RSSU5HIG9yIFBhcmFtZXRlclR5cGUuQVdTX0VDMl9JTUFHRV9JRGAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGNvbnN0IGZvcmNlRHluYW1pY1JlZmVyZW5jZSA9IGF0dHJzLmZvcmNlRHluYW1pY1JlZmVyZW5jZSA/PyBmYWxzZTtcbiAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE0My4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zc20vbGliL3BhcmFtZXRlci50cyNMNDgzXG4gICAgLy8gY29uc3QgdHlwZSA9IGF0dHJzLnR5cGUgPz8gYXR0cnMudmFsdWVUeXBlID8/IFBhcmFtZXRlclZhbHVlVHlwZS5TVFJJTkc7XG5cbiAgICBsZXQgbmFtZTogc3RyaW5nO1xuICAgIGlmIChhdHRycy52ZXJzaW9uKSB7XG4gICAgICAvLyBUbyBxdWVyeSBieSBwYXJhbWV0ZXIgdmVyc2lvbiwgdXNlIFwiTmFtZVwiOiBcIm5hbWU6dmVyc2lvblwiLlxuICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3N5c3RlbXMtbWFuYWdlci9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRQYXJhbWV0ZXIuaHRtbCNzeXN0ZW1zbWFuYWdlci1HZXRQYXJhbWV0ZXItcmVxdWVzdC1OYW1lXG4gICAgICBuYW1lID0gYCR7YXR0cnMucGFyYW1ldGVyTmFtZX06JHtUb2tlbml6YXRpb24uc3RyaW5naWZ5TnVtYmVyKGF0dHJzLnZlcnNpb24pfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBhdHRycy5wYXJhbWV0ZXJOYW1lO1xuICAgIH1cbiAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IGRhdGFBd3NTc21QYXJhbWV0ZXIuRGF0YUF3c1NzbVBhcmFtZXRlcihcbiAgICAgIHNjb3BlLFxuICAgICAgYCR7aWR9LlBhcmFtZXRlcmAsXG4gICAgICB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHdpdGhEZWNyeXB0aW9uOiBhdHRycy53aXRoRGVjcnlwdGlvbiwgLy8gZGVmYXVsdHMgdG8gdHJ1ZVxuICAgICAgfSxcbiAgICApO1xuXG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgUGFyYW1ldGVyQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcGFyYW1ldGVyTmFtZSA9IGF0dHJzLnBhcmFtZXRlck5hbWU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcGFyYW1ldGVyQXJuID0gYXJuRm9yUGFyYW1ldGVyTmFtZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYXR0cnMucGFyYW1ldGVyTmFtZSxcbiAgICAgICAgeyBzaW1wbGVOYW1lOiBhdHRycy5zaW1wbGVOYW1lIH0sXG4gICAgICApO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHBhcmFtZXRlclR5cGUgPSBQYXJhbWV0ZXJUeXBlLlNUUklORzsgLy8gZGF0YVNvdXJjZS50eXBlIC0gaW5zdGVhZCBvZiB0b2tlbiB1c2UgY29uY3JldGVcbiAgICAgIC8vIFVzZSBjYXV0aW9uOiBUaGlzIHZhbHVlIGlzIG5ldmVyIG1hcmtlZCBhcyBzZW5zaXRpdmUuXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgc3RyaW5nVmFsdWUgPSBkYXRhU291cmNlLmluc2VjdXJlVmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGEgc2VjdXJlIHN0cmluZyBwYXJhbWV0ZXIgZnJvbSB0aGUgU1NNIHBhcmFtZXRlciBzdG9yZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNlY3VyZVN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXMoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIGF0dHJzOiBTZWN1cmVTdHJpbmdQYXJhbWV0ZXJBdHRyaWJ1dGVzLFxuICApOiBJU3RyaW5nUGFyYW1ldGVyIHtcbiAgICBpZiAoIWF0dHJzLnBhcmFtZXRlck5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInBhcmFtZXRlck5hbWUgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZ1wiKTtcbiAgICB9XG4gICAgbGV0IG5hbWU6IHN0cmluZztcbiAgICBpZiAoYXR0cnMudmVyc2lvbikge1xuICAgICAgbmFtZSA9IGAke2F0dHJzLnBhcmFtZXRlck5hbWV9OiR7VG9rZW5pemF0aW9uLnN0cmluZ2lmeU51bWJlcihhdHRycy52ZXJzaW9uKX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lID0gYXR0cnMucGFyYW1ldGVyTmFtZTtcbiAgICB9XG4gICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgZGF0YUF3c1NzbVBhcmFtZXRlci5EYXRhQXdzU3NtUGFyYW1ldGVyKFxuICAgICAgc2NvcGUsXG4gICAgICBgJHtpZH0uUGFyYW1ldGVyYCxcbiAgICAgIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgd2l0aERlY3J5cHRpb246IGF0dHJzLndpdGhEZWNyeXB0aW9uLCAvLyBkZWZhdWx0cyB0byB0cnVlXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBQYXJhbWV0ZXJCYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBwYXJhbWV0ZXJOYW1lID0gYXR0cnMucGFyYW1ldGVyTmFtZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBwYXJhbWV0ZXJBcm4gPSBhcm5Gb3JQYXJhbWV0ZXJOYW1lKFxuICAgICAgICB0aGlzLFxuICAgICAgICBhdHRycy5wYXJhbWV0ZXJOYW1lLFxuICAgICAgICB7IHNpbXBsZU5hbWU6IGF0dHJzLnNpbXBsZU5hbWUgfSxcbiAgICAgICk7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcGFyYW1ldGVyVHlwZSA9IFBhcmFtZXRlclR5cGUuU0VDVVJFX1NUUklORzsgLy8gcmVzb3VyY2UudHlwZSAtIGluc3RlYWQgb2YgdG9rZW4gdXNlIGNvbmNyZXRlXG4gICAgICAvLyB2YWx1ZSBpcyBhbHdheXMgbWFya2VkIGFzIHNlbnNpdGl2ZVxuICAgICAgcHVibGljIHJlYWRvbmx5IHN0cmluZ1ZhbHVlID0gcmVzb3VyY2UudmFsdWU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZW5jcnlwdGlvbktleSA9IGF0dHJzLmVuY3J5cHRpb25LZXk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8vIC8vIFRPRE86IFVzZSBHcmlkIGFzIGNvbnRleHRQcm92aWRlclxuICAvLyAvKipcbiAgLy8gICogUmVhZHMgdGhlIHZhbHVlIG9mIGFuIFNTTSBwYXJhbWV0ZXIgZHVyaW5nIHN5bnRoZXNpcyB0aHJvdWdoIGFuXG4gIC8vICAqIGVudmlyb25tZW50YWwgY29udGV4dCBwcm92aWRlci5cbiAgLy8gICpcbiAgLy8gICogUmVxdWlyZXMgdGhhdCB0aGUgc3RhY2sgdGhpcyBzY29wZSBpcyBkZWZpbmVkIGluIHdpbGwgaGF2ZSBleHBsaWNpdFxuICAvLyAgKiBhY2NvdW50L3JlZ2lvbiBpbmZvcm1hdGlvbi4gT3RoZXJ3aXNlLCBpdCB3aWxsIGZhaWwgZHVyaW5nIHN5bnRoZXNpcy5cbiAgLy8gICpcbiAgLy8gICogSWYgZGVmYXVsdFZhbHVlIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGR1bW15VmFsdWVcbiAgLy8gICogYW5kIHRoZSBDb250ZXh0UHJvdmlkZXIgd2lsbCBiZSB0b2xkIE5PVCB0byByYWlzZSBhbiBlcnJvciBvbiBzeW50aGVzaXNcbiAgLy8gICogaWYgdGhlIFNTTSBQYXJhbWV0ZXIgaXMgbm90IGZvdW5kIGluIHRoZSBhY2NvdW50IGF0IHN5bnRoIHRpbWUuXG4gIC8vICAqL1xuICAvLyBwdWJsaWMgc3RhdGljIHZhbHVlRnJvbUxvb2t1cChcbiAgLy8gICBzY29wZTogQ29uc3RydWN0LFxuICAvLyAgIHBhcmFtZXRlck5hbWU6IHN0cmluZyxcbiAgLy8gICBkZWZhdWx0VmFsdWU/OiBzdHJpbmcsXG4gIC8vICk6IHN0cmluZyB7XG4gIC8vICAgY29uc3QgdmFsdWUgPSBDb250ZXh0UHJvdmlkZXIuZ2V0VmFsdWUoc2NvcGUsIHtcbiAgLy8gICAgIHByb3ZpZGVyOiBjeHNjaGVtYS5Db250ZXh0UHJvdmlkZXIuU1NNX1BBUkFNRVRFUl9QUk9WSURFUixcbiAgLy8gICAgIHByb3BzOiB7IHBhcmFtZXRlck5hbWUgfSxcbiAgLy8gICAgIGR1bW15VmFsdWU6IGRlZmF1bHRWYWx1ZSB8fCBgZHVtbXktdmFsdWUtZm9yLSR7cGFyYW1ldGVyTmFtZX1gLFxuICAvLyAgICAgaWdub3JlRXJyb3JPbk1pc3NpbmdDb250ZXh0OiBkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCxcbiAgLy8gICB9KS52YWx1ZTtcblxuICAvLyAgIHJldHVybiB2YWx1ZTtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdG9rZW4gdGhhdCB3aWxsIHJlc29sdmUgKGR1cmluZyBkZXBsb3ltZW50KSB0byB0aGUgc3RyaW5nIHZhbHVlIG9mIGFuIFNTTSBzdHJpbmcgcGFyYW1ldGVyLlxuICAgKiBAcGFyYW0gc2NvcGUgU29tZSBzY29wZSB3aXRoaW4gYSBzdGFja1xuICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgU1NNIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHZlcnNpb24gVGhlIHBhcmFtZXRlciB2ZXJzaW9uIChyZWNvbW1lbmRlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgdmFsdWUgd29uJ3QgY2hhbmdlIGR1cmluZyBkZXBsb3ltZW50KVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2YWx1ZUZvclN0cmluZ1BhcmFtZXRlcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIHBhcmFtZXRlck5hbWU6IHN0cmluZyxcbiAgICB2ZXJzaW9uPzogbnVtYmVyLFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBTdHJpbmdQYXJhbWV0ZXIudmFsdWVGb3JUeXBlZFN0cmluZ1BhcmFtZXRlclYyKFxuICAgICAgc2NvcGUsXG4gICAgICBwYXJhbWV0ZXJOYW1lLFxuICAgICAgUGFyYW1ldGVyVmFsdWVUeXBlLlNUUklORyxcbiAgICAgIHZlcnNpb24sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdG9rZW4gdGhhdCB3aWxsIHJlc29sdmUgKGR1cmluZyBkZXBsb3ltZW50KSB0byB0aGUgc3RyaW5nIHZhbHVlIG9mIGFuIFNTTSBzdHJpbmcgcGFyYW1ldGVyLlxuICAgKiBAcGFyYW0gc2NvcGUgU29tZSBzY29wZSB3aXRoaW4gYSBzdGFja1xuICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgU1NNIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIFNTTSBwYXJhbWV0ZXIuXG4gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBwYXJhbWV0ZXIgdmVyc2lvbiAocmVjb21tZW5kZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHZhbHVlIHdvbid0IGNoYW5nZSBkdXJpbmcgZGVwbG95bWVudClcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmFsdWVGb3JUeXBlZFN0cmluZ1BhcmFtZXRlclYyKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgcGFyYW1ldGVyTmFtZTogc3RyaW5nLFxuICAgIHR5cGUgPSBQYXJhbWV0ZXJWYWx1ZVR5cGUuU1RSSU5HLFxuICAgIHZlcnNpb24/OiBudW1iZXIsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhY2sgPSBBd3NTdGFjay5vZihzY29wZSk7XG4gICAgY29uc3QgaWQgPSBtYWtlSWRlbnRpdHlGb3JJbXBvcnRlZFZhbHVlKHBhcmFtZXRlck5hbWUpO1xuICAgIGNvbnN0IGV4aXN0cyA9IHN0YWNrLm5vZGUudHJ5RmluZENoaWxkKGlkKSBhcyBJU3RyaW5nUGFyYW1ldGVyO1xuXG4gICAgaWYgKGV4aXN0cykge1xuICAgICAgcmV0dXJuIGV4aXN0cy5zdHJpbmdWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mcm9tU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlcyhzdGFjaywgaWQsIHtcbiAgICAgIHBhcmFtZXRlck5hbWUsXG4gICAgICB2ZXJzaW9uLFxuICAgICAgdmFsdWVUeXBlOiB0eXBlLFxuICAgIH0pLnN0cmluZ1ZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB0b2tlbiB0aGF0IHdpbGwgcmVzb2x2ZSAoZHVyaW5nIGRlcGxveW1lbnQpIHRvIHRoZSBzdHJpbmcgdmFsdWUgb2YgYW4gU1NNIHN0cmluZyBwYXJhbWV0ZXIuXG4gICAqIEBwYXJhbSBzY29wZSBTb21lIHNjb3BlIHdpdGhpbiBhIHN0YWNrXG4gICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBTU00gcGFyYW1ldGVyLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgU1NNIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHZlcnNpb24gVGhlIHBhcmFtZXRlciB2ZXJzaW9uIChyZWNvbW1lbmRlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgdmFsdWUgd29uJ3QgY2hhbmdlIGR1cmluZyBkZXBsb3ltZW50KVxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSB2YWx1ZUZvclR5cGVkU3RyaW5nUGFyYW1ldGVyVjIgaW5zdGVhZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2YWx1ZUZvclR5cGVkU3RyaW5nUGFyYW1ldGVyKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgcGFyYW1ldGVyTmFtZTogc3RyaW5nLFxuICAgIHR5cGUgPSBQYXJhbWV0ZXJUeXBlLlNUUklORyxcbiAgICB2ZXJzaW9uPzogbnVtYmVyLFxuICApOiBzdHJpbmcge1xuICAgIGlmICh0eXBlID09PSBQYXJhbWV0ZXJUeXBlLlNUUklOR19MSVNUKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwidmFsdWVGb3JUeXBlZFN0cmluZ1BhcmFtZXRlciBkb2VzIG5vdCBzdXBwb3J0IFNUUklOR19MSVNULCBcIiArXG4gICAgICAgICAgXCJ1c2UgdmFsdWVGb3JUeXBlZExpc3RQYXJhbWV0ZXIgaW5zdGVhZFwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc3RhY2sgPSBBd3NTdGFjay5vZihzY29wZSk7XG4gICAgY29uc3QgaWQgPSBtYWtlSWRlbnRpdHlGb3JJbXBvcnRlZFZhbHVlKHBhcmFtZXRlck5hbWUpO1xuICAgIGNvbnN0IGV4aXN0cyA9IHN0YWNrLm5vZGUudHJ5RmluZENoaWxkKGlkKSBhcyBJU3RyaW5nUGFyYW1ldGVyO1xuXG4gICAgaWYgKGV4aXN0cykge1xuICAgICAgcmV0dXJuIGV4aXN0cy5zdHJpbmdWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mcm9tU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlcyhzdGFjaywgaWQsIHtcbiAgICAgIHBhcmFtZXRlck5hbWUsXG4gICAgICB2ZXJzaW9uLFxuICAgICAgdHlwZSxcbiAgICB9KS5zdHJpbmdWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdG9rZW4gdGhhdCB3aWxsIHJlc29sdmUgKGR1cmluZyBkZXBsb3ltZW50KVxuICAgKiBAcGFyYW0gc2NvcGUgU29tZSBzY29wZSB3aXRoaW4gYSBzdGFja1xuICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgU1NNIHBhcmFtZXRlclxuICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgcGFyYW1ldGVyIHZlcnNpb24gKHJlcXVpcmVkIGZvciBzZWN1cmUgc3RyaW5ncylcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBTZWNyZXRWYWx1ZS5zc21TZWN1cmUoKWAgaW5zdGVhZCwgaXQgd2lsbCBjb3JyZWN0bHkgdHlwZSB0aGUgaW1wb3J0ZWQgdmFsdWUgYXMgYSBgU2VjcmV0VmFsdWVgIGFuZCBhbGxvdyBpbXBvcnRpbmcgd2l0aG91dCB2ZXJzaW9uLiBgU2VjcmV0VmFsdWVgIGxpdmVzIGluIHRoZSBjb3JlIGBhd3MtY2RrLWxpYmAgbW9kdWxlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2YWx1ZUZvclNlY3VyZVN0cmluZ1BhcmFtZXRlcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIHBhcmFtZXRlck5hbWU6IHN0cmluZyxcbiAgICB2ZXJzaW9uOiBudW1iZXIsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhY2sgPSBBd3NTdGFjay5vZihzY29wZSk7XG4gICAgY29uc3QgaWQgPSBtYWtlSWRlbnRpdHlGb3JJbXBvcnRlZFZhbHVlKHBhcmFtZXRlck5hbWUpO1xuICAgIGNvbnN0IGV4aXN0cyA9IHN0YWNrLm5vZGUudHJ5RmluZENoaWxkKGlkKSBhcyBJU3RyaW5nUGFyYW1ldGVyO1xuICAgIGlmIChleGlzdHMpIHtcbiAgICAgIHJldHVybiBleGlzdHMuc3RyaW5nVmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZnJvbVNlY3VyZVN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXMoc3RhY2ssIGlkLCB7XG4gICAgICBwYXJhbWV0ZXJOYW1lLFxuICAgICAgdmVyc2lvbixcbiAgICB9KS5zdHJpbmdWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBwYXJhbWV0ZXJBcm46IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHBhcmFtZXRlck5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHBhcmFtZXRlclR5cGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHN0cmluZ1ZhbHVlOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogc3NtUGFyYW1ldGVyLlNzbVBhcmFtZXRlcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU3RyaW5nUGFyYW1ldGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICBjb25zdCBwYXJhbWV0ZXJOYW1lID1cbiAgICAgIHByb3BzLnBhcmFtZXRlck5hbWUgfHxcbiAgICAgIHRoaXMuc3RhY2sudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHtcbiAgICAgICAgcHJlZml4OiB0aGlzLmdyaWRVVUlELFxuICAgICAgfSk7XG5cbiAgICBpZiAocHJvcHMuc3RyaW5nVmFsdWUgJiYgcHJvcHMuc2Vuc2l0aXZlU3RyaW5nVmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3Qgc3BlY2lmeSBib3RoICdzdHJpbmdWYWx1ZScgYW5kICdzZW5zaXRpdmVTdHJpbmdWYWx1ZSdcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gcHJvcHMuc3RyaW5nVmFsdWUgPz8gcHJvcHMuc2Vuc2l0aXZlU3RyaW5nVmFsdWU7XG4gICAgY29uc3QgaXNTZW5zaXRpdmUgPSAhIXByb3BzLnNlbnNpdGl2ZVN0cmluZ1ZhbHVlO1xuICAgIGlmICghc3RyaW5nVmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJFaXRoZXIgJ3N0cmluZ1ZhbHVlJyBvciAnc2Vuc2l0aXZlU3RyaW5nVmFsdWUnIG11c3QgYmUgc3BlY2lmaWVkXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5hbGxvd2VkUGF0dGVybikge1xuICAgICAgX2Fzc2VydFZhbGlkVmFsdWUoc3RyaW5nVmFsdWUsIHByb3BzLmFsbG93ZWRQYXR0ZXJuKTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZVBhcmFtZXRlck5hbWUocGFyYW1ldGVyTmFtZSk7XG5cbiAgICBpZiAocHJvcHMuZGVzY3JpcHRpb24gJiYgcHJvcHMuZGVzY3JpcHRpb24/Lmxlbmd0aCA+IDEwMjQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlc2NyaXB0aW9uIGNhbm5vdCBiZSBsb25nZXIgdGhhbiAxMDI0IGNoYXJhY3RlcnMuXCIpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy50eXBlICYmIHByb3BzLnR5cGUgPT09IFBhcmFtZXRlclR5cGUuQVdTX0VDMl9JTUFHRV9JRCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlRoZSB0eXBlIG11c3QgZWl0aGVyIGJlIFBhcmFtZXRlclR5cGUuU1RSSU5HIG9yIFBhcmFtZXRlclR5cGUuU1RSSU5HX0xJU1QuIERpZCB5b3UgbWVhbiB0byBzZXQgZGF0YVR5cGU6IFBhcmFtZXRlckRhdGFUeXBlLkFXU19FQzJfSU1BR0UgaW5zdGVhZD9cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBzc21QYXJhbWV0ZXIuU3NtUGFyYW1ldGVyKHRoaXMsIFwiUmVzb3VyY2VcIiwge1xuICAgICAgYWxsb3dlZFBhdHRlcm46IHByb3BzLmFsbG93ZWRQYXR0ZXJuLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgbmFtZTogcGFyYW1ldGVyTmFtZSxcbiAgICAgIHRpZXI6IHByb3BzLnRpZXIsXG4gICAgICB0eXBlOiBwcm9wcy50eXBlID8/IFBhcmFtZXRlclR5cGUuU1RSSU5HLFxuICAgICAgZGF0YVR5cGU6IHByb3BzLmRhdGFUeXBlLFxuICAgICAgaW5zZWN1cmVWYWx1ZTogcHJvcHMuc3RyaW5nVmFsdWUsXG4gICAgICB2YWx1ZTogcHJvcHMuc2Vuc2l0aXZlU3RyaW5nVmFsdWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBhcmFtZXRlck5hbWUgPSB0aGlzLnJlc291cmNlLm5hbWU7XG4gICAgdGhpcy5wYXJhbWV0ZXJBcm4gPSBhcm5Gb3JQYXJhbWV0ZXJOYW1lKHRoaXMsIHRoaXMucGFyYW1ldGVyTmFtZSwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwYXJhbWV0ZXJOYW1lLFxuICAgICAgc2ltcGxlTmFtZTogcHJvcHMuc2ltcGxlTmFtZSxcbiAgICB9KTtcblxuICAgIHRoaXMucGFyYW1ldGVyVHlwZSA9IHRoaXMucmVzb3VyY2UudHlwZTtcbiAgICB0aGlzLnN0cmluZ1ZhbHVlID0gaXNTZW5zaXRpdmVcbiAgICAgID8gdGhpcy5yZXNvdXJjZS52YWx1ZVxuICAgICAgOiB0aGlzLnJlc291cmNlLmluc2VjdXJlVmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFN0cmluZ0xpc3QgU1NNIFBhcmFtZXRlci5cbiAqIEByZXNvdXJjZSBBV1M6OlNTTTo6UGFyYW1ldGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJpbmdMaXN0UGFyYW1ldGVyXG4gIGV4dGVuZHMgUGFyYW1ldGVyQmFzZVxuICBpbXBsZW1lbnRzIElTdHJpbmdMaXN0UGFyYW1ldGVyXG57XG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIGV4dGVybmFsIHBhcmFtZXRlciBvZiB0eXBlIHN0cmluZyBsaXN0LlxuICAgKiBSZXR1cm5zIGEgdG9rZW4gYW5kIHNob3VsZCBub3QgYmUgcGFyc2VkLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nTGlzdFBhcmFtZXRlck5hbWUoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHN0cmluZ0xpc3RQYXJhbWV0ZXJOYW1lOiBzdHJpbmcsXG4gICk6IElTdHJpbmdMaXN0UGFyYW1ldGVyIHtcbiAgICAvLyByZWY6IGR5bmFtaWMgcmVmXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTQzLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLXNzbS9saWIvcGFyYW1ldGVyLnRzI0w2NzBcbiAgICByZXR1cm4gU3RyaW5nTGlzdFBhcmFtZXRlci5mcm9tTGlzdFBhcmFtZXRlckF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICBwYXJhbWV0ZXJOYW1lOiBzdHJpbmdMaXN0UGFyYW1ldGVyTmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIGV4dGVybmFsIHN0cmluZyBsaXN0IHBhcmFtZXRlciB3aXRoIG5hbWUgYW5kIG9wdGlvbmFsIHZlcnNpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21MaXN0UGFyYW1ldGVyQXR0cmlidXRlcyhcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYXR0cnM6IExpc3RQYXJhbWV0ZXJBdHRyaWJ1dGVzLFxuICApOiBJU3RyaW5nTGlzdFBhcmFtZXRlciB7XG4gICAgaWYgKCFhdHRycy5wYXJhbWV0ZXJOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwYXJhbWV0ZXJOYW1lIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmdcIik7XG4gICAgfVxuXG4gICAgbGV0IG5hbWU6IHN0cmluZztcbiAgICBpZiAoYXR0cnMudmVyc2lvbikge1xuICAgICAgbmFtZSA9IGAke2F0dHJzLnBhcmFtZXRlck5hbWV9OiR7VG9rZW5pemF0aW9uLnN0cmluZ2lmeU51bWJlcihhdHRycy52ZXJzaW9uKX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lID0gYXR0cnMucGFyYW1ldGVyTmFtZTtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IGF0dHJzLmVsZW1lbnRUeXBlID8/IFBhcmFtZXRlclZhbHVlVHlwZS5TVFJJTkc7XG4gICAgY29uc3QgdmFsdWVUeXBlID0gYExpc3Q8JHt0eXBlfT5gO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgZGF0YUF3c1NzbVBhcmFtZXRlci5EYXRhQXdzU3NtUGFyYW1ldGVyKFxuICAgICAgc2NvcGUsXG4gICAgICBgJHtpZH0uUGFyYW1ldGVyYCxcbiAgICAgIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgd2l0aERlY3J5cHRpb246IGF0dHJzLndpdGhEZWNyeXB0aW9uLCAvLyBkZWZhdWx0cyB0byB0cnVlXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBQYXJhbWV0ZXJCYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBwYXJhbWV0ZXJOYW1lID0gYXR0cnMucGFyYW1ldGVyTmFtZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBwYXJhbWV0ZXJBcm4gPSBhcm5Gb3JQYXJhbWV0ZXJOYW1lKFxuICAgICAgICB0aGlzLFxuICAgICAgICBhdHRycy5wYXJhbWV0ZXJOYW1lLFxuICAgICAgICB7IHNpbXBsZU5hbWU6IGF0dHJzLnNpbXBsZU5hbWUgfSxcbiAgICAgICk7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcGFyYW1ldGVyVHlwZSA9IHZhbHVlVHlwZTsgLy8gaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyIHdoYXQgdGhpcyBpcyBzaW5jZSBhIENmblBhcmFtZXRlciBjYW4gb25seSBiZSBgU3RyaW5nIHwgU3RyaW5nTGlzdGBcbiAgICAgIHB1YmxpYyByZWFkb25seSBzdHJpbmdMaXN0VmFsdWUgPSBGbi5zcGxpdChcIixcIiwgcmVzb3VyY2UuaW5zZWN1cmVWYWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdG9rZW4gdGhhdCB3aWxsIHJlc29sdmUgKGR1cmluZyBkZXBsb3ltZW50KSB0byB0aGUgbGlzdCB2YWx1ZSBvZiBhbiBTU00gU3RyaW5nTGlzdCBwYXJhbWV0ZXIuXG4gICAqIEBwYXJhbSBzY29wZSBTb21lIHNjb3BlIHdpdGhpbiBhIHN0YWNrXG4gICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBTU00gcGFyYW1ldGVyLlxuICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgU1NNIGxpc3QgcGFyYW1ldGVyXG4gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBwYXJhbWV0ZXIgdmVyc2lvbiAocmVjb21tZW5kZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHZhbHVlIHdvbid0IGNoYW5nZSBkdXJpbmcgZGVwbG95bWVudClcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmFsdWVGb3JUeXBlZExpc3RQYXJhbWV0ZXIoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBwYXJhbWV0ZXJOYW1lOiBzdHJpbmcsXG4gICAgdHlwZSA9IFBhcmFtZXRlclZhbHVlVHlwZS5TVFJJTkcsXG4gICAgdmVyc2lvbj86IG51bWJlcixcbiAgKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN0YWNrID0gQXdzU3RhY2sub2Yoc2NvcGUpO1xuICAgIGNvbnN0IGlkID0gbWFrZUlkZW50aXR5Rm9ySW1wb3J0ZWRWYWx1ZShwYXJhbWV0ZXJOYW1lKTtcbiAgICBjb25zdCBleGlzdHMgPSBzdGFjay5ub2RlLnRyeUZpbmRDaGlsZChpZCkgYXMgSVN0cmluZ0xpc3RQYXJhbWV0ZXI7XG5cbiAgICBpZiAoZXhpc3RzKSB7XG4gICAgICByZXR1cm4gZXhpc3RzLnN0cmluZ0xpc3RWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mcm9tTGlzdFBhcmFtZXRlckF0dHJpYnV0ZXMoc3RhY2ssIGlkLCB7XG4gICAgICBwYXJhbWV0ZXJOYW1lLFxuICAgICAgZWxlbWVudFR5cGU6IHR5cGUsXG4gICAgICB2ZXJzaW9uLFxuICAgIH0pLnN0cmluZ0xpc3RWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBwYXJhbWV0ZXJBcm46IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHBhcmFtZXRlck5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHBhcmFtZXRlclR5cGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHN0cmluZ0xpc3RWYWx1ZTogc3RyaW5nW107XG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogc3NtUGFyYW1ldGVyLlNzbVBhcmFtZXRlcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU3RyaW5nTGlzdFBhcmFtZXRlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgY29uc3QgcGFyYW1ldGVyTmFtZSA9XG4gICAgICBwcm9wcy5wYXJhbWV0ZXJOYW1lIHx8XG4gICAgICB0aGlzLnN0YWNrLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7XG4gICAgICAgIHByZWZpeDogdGhpcy5ncmlkVVVJRCxcbiAgICAgIH0pO1xuXG4gICAgaWYgKHByb3BzLnN0cmluZ0xpc3RWYWx1ZSAmJiBwcm9wcy5zZW5zaXRpdmVTdHJpbmdMaXN0VmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3Qgc3BlY2lmeSBib3RoICdzdHJpbmdMaXN0VmFsdWUnIGFuZCAnc2Vuc2l0aXZlU3RyaW5nTGlzdFZhbHVlJ1wiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc3RyaW5nTGlzdFZhbHVlID1cbiAgICAgIHByb3BzLnN0cmluZ0xpc3RWYWx1ZSA/PyBwcm9wcy5zZW5zaXRpdmVTdHJpbmdMaXN0VmFsdWU7XG4gICAgY29uc3QgaXNTZW5zaXRpdmUgPSAhIXByb3BzLnNlbnNpdGl2ZVN0cmluZ0xpc3RWYWx1ZTtcbiAgICBpZiAoIXN0cmluZ0xpc3RWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkVpdGhlciAnc3RyaW5nTGlzdFZhbHVlJyBvciAnc2Vuc2l0aXZlU3RyaW5nTGlzdFZhbHVlJyBtdXN0IGJlIHNwZWNpZmllZFwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzdHJpbmdMaXN0VmFsdWUuZmluZChcbiAgICAgICAgKHN0cikgPT4gIVRva2VuLmlzVW5yZXNvbHZlZChzdHIpICYmIHN0ci5pbmRleE9mKFwiLFwiKSAhPT0gLTEsXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiVmFsdWVzIG9mIGEgU3RyaW5nTGlzdCBTU00gUGFyYW1ldGVyIGNhbm5vdCBjb250YWluIHRoZSAnLCcgY2hhcmFjdGVyLiBVc2UgYSBzdHJpbmcgcGFyYW1ldGVyIGluc3RlYWQuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5hbGxvd2VkUGF0dGVybiAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKHN0cmluZ0xpc3RWYWx1ZSkpIHtcbiAgICAgIHN0cmluZ0xpc3RWYWx1ZS5mb3JFYWNoKChzdHIpID0+XG4gICAgICAgIF9hc3NlcnRWYWxpZFZhbHVlKHN0ciwgcHJvcHMuYWxsb3dlZFBhdHRlcm4hKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVQYXJhbWV0ZXJOYW1lKHBhcmFtZXRlck5hbWUpO1xuXG4gICAgaWYgKHByb3BzLmRlc2NyaXB0aW9uICYmIHByb3BzLmRlc2NyaXB0aW9uPy5sZW5ndGggPiAxMDI0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZXNjcmlwdGlvbiBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gMTAyNCBjaGFyYWN0ZXJzLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IHNzbVBhcmFtZXRlci5Tc21QYXJhbWV0ZXIodGhpcywgXCJSZXNvdXJjZVwiLCB7XG4gICAgICBhbGxvd2VkUGF0dGVybjogcHJvcHMuYWxsb3dlZFBhdHRlcm4sXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBuYW1lOiBwYXJhbWV0ZXJOYW1lLFxuICAgICAgdGllcjogcHJvcHMudGllcixcbiAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuU1RSSU5HX0xJU1QsXG4gICAgICBpbnNlY3VyZVZhbHVlOiBwcm9wcy5zdHJpbmdMaXN0VmFsdWVcbiAgICAgICAgPyBGbi5qb2luKFwiLFwiLCBwcm9wcy5zdHJpbmdMaXN0VmFsdWUpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgdmFsdWU6IHByb3BzLnNlbnNpdGl2ZVN0cmluZ0xpc3RWYWx1ZVxuICAgICAgICA/IEZuLmpvaW4oXCIsXCIsIHByb3BzLnNlbnNpdGl2ZVN0cmluZ0xpc3RWYWx1ZSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgdGhpcy5wYXJhbWV0ZXJOYW1lID0gdGhpcy5yZXNvdXJjZS5uYW1lO1xuICAgIHRoaXMucGFyYW1ldGVyQXJuID0gYXJuRm9yUGFyYW1ldGVyTmFtZSh0aGlzLCB0aGlzLnBhcmFtZXRlck5hbWUsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcGFyYW1ldGVyTmFtZSxcbiAgICAgIHNpbXBsZU5hbWU6IHByb3BzLnNpbXBsZU5hbWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBhcmFtZXRlclR5cGUgPSB0aGlzLnJlc291cmNlLnR5cGU7XG4gICAgdGhpcy5zdHJpbmdMaXN0VmFsdWUgPSBpc1NlbnNpdGl2ZVxuICAgICAgPyBGbi5zcGxpdChcIixcIiwgdGhpcy5yZXNvdXJjZS52YWx1ZSlcbiAgICAgIDogRm4uc3BsaXQoXCIsXCIsIHRoaXMucmVzb3VyY2UuaW5zZWN1cmVWYWx1ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgd2hldGhlciBhIHN1cHBsaWVkIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSBhbGxvd2VkUGF0dGVybiwgZ3JhbnRlZCBuZWl0aGVyIGlzIGFuIHVucmVzb2x2ZWQgdG9rZW4uXG4gKlxuICogQHBhcmFtIHZhbHVlICAgICAgICAgIHRoZSB2YWx1ZSB0byBiZSB2YWxpZGF0ZWQuXG4gKiBAcGFyYW0gYWxsb3dlZFBhdHRlcm4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byB1c2UgZm9yIHZhbGlkYXRpb24uXG4gKlxuICogQHRocm93cyBpZiB0aGUgYGB2YWx1ZWBgIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIGBgYWxsb3dlZFBhdHRlcm5gYCBhbmQgbmVpdGhlciBpcyBhbiB1bnJlc29sdmVkIHRva2VuIChwZXJcbiAqICAgICAgICAgYGBjZGsudW5yZXNvbHZlZGBgKS5cbiAqL1xuZnVuY3Rpb24gX2Fzc2VydFZhbGlkVmFsdWUodmFsdWU6IHN0cmluZywgYWxsb3dlZFBhdHRlcm46IHN0cmluZyk6IHZvaWQge1xuICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHZhbHVlKSB8fCBUb2tlbi5pc1VucmVzb2x2ZWQoYWxsb3dlZFBhdHRlcm4pKSB7XG4gICAgLy8gVW5hYmxlIHRvIHBlcmZvcm0gdmFsaWRhdGlvbnMgYWdhaW5zdCB1bnJlc29sdmVkIHRva2Vuc1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIW5ldyBSZWdFeHAoYWxsb3dlZFBhdHRlcm4pLnRlc3QodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBzdXBwbGllZCB2YWx1ZSAoJHt2YWx1ZX0pIGRvZXMgbm90IG1hdGNoIHRoZSBzcGVjaWZpZWQgYWxsb3dlZFBhdHRlcm4gKCR7YWxsb3dlZFBhdHRlcm59KWAsXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYWtlSWRlbnRpdHlGb3JJbXBvcnRlZFZhbHVlKHBhcmFtZXRlck5hbWU6IHN0cmluZykge1xuICByZXR1cm4gYFNzbVBhcmFtZXRlclZhbHVlOiR7cGFyYW1ldGVyTmFtZX06Qzk2NTg0QjYtRjAwQS00NjRFLUFEMTktNTNBRkY0QjA1MTE4YDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQYXJhbWV0ZXJOYW1lKHBhcmFtZXRlck5hbWU6IHN0cmluZykge1xuICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHBhcmFtZXRlck5hbWUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwYXJhbWV0ZXJOYW1lLmxlbmd0aCA+IDIwNDgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJuYW1lIGNhbm5vdCBiZSBsb25nZXIgdGhhbiAyMDQ4IGNoYXJhY3RlcnMuXCIpO1xuICB9XG4gIGlmICghcGFyYW1ldGVyTmFtZS5tYXRjaCgvXltcXC9cXHcuLV0rJC8pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYG5hbWUgbXVzdCBvbmx5IGNvbnRhaW4gbGV0dGVycywgbnVtYmVycywgYW5kIHRoZSBmb2xsb3dpbmcgNCBzeW1ib2xzIC4tXy87IGdvdCAke3BhcmFtZXRlck5hbWV9YCxcbiAgICApO1xuICB9XG59XG4iXX0=
|