terraconstructs 0.0.11 → 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 +7 -5
- 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,336 @@
|
|
|
1
|
+
import { elb as tfElb } from "@cdktf/provider-aws";
|
|
2
|
+
import { Construct } from "constructs";
|
|
3
|
+
import { Connections, IConnectable } from "./connections";
|
|
4
|
+
import { Instance } from "./instance";
|
|
5
|
+
import { Port } from "./port";
|
|
6
|
+
import { ISecurityGroup } from "./security-group";
|
|
7
|
+
import { IVpc, SubnetSelection } from "./vpc";
|
|
8
|
+
import { Duration } from "../../duration";
|
|
9
|
+
import { AwsConstructBase } from "../aws-construct";
|
|
10
|
+
/**
|
|
11
|
+
* Construction properties for a LoadBalancer
|
|
12
|
+
*/
|
|
13
|
+
export interface LoadBalancerProps {
|
|
14
|
+
/**
|
|
15
|
+
* VPC network of the fleet instances
|
|
16
|
+
*/
|
|
17
|
+
readonly vpc: IVpc;
|
|
18
|
+
/**
|
|
19
|
+
* Whether this is an internet-facing Load Balancer
|
|
20
|
+
*
|
|
21
|
+
* This controls whether the LB has a public IP address assigned. It does
|
|
22
|
+
* not open up the Load Balancer's security groups to public internet access.
|
|
23
|
+
*
|
|
24
|
+
* @default false
|
|
25
|
+
*/
|
|
26
|
+
readonly internetFacing?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* What listeners to set up for the load balancer.
|
|
29
|
+
*
|
|
30
|
+
* Can also be added by .addListener()
|
|
31
|
+
*
|
|
32
|
+
* @default -
|
|
33
|
+
*/
|
|
34
|
+
readonly listeners?: LoadBalancerListener[];
|
|
35
|
+
/**
|
|
36
|
+
* What targets to load balance to.
|
|
37
|
+
*
|
|
38
|
+
* Can also be added by .addTarget()
|
|
39
|
+
*
|
|
40
|
+
* @default - None.
|
|
41
|
+
*/
|
|
42
|
+
readonly targets?: ILoadBalancerTarget[];
|
|
43
|
+
/**
|
|
44
|
+
* Health check settings for the load balancing targets.
|
|
45
|
+
*
|
|
46
|
+
* Not required but recommended.
|
|
47
|
+
*
|
|
48
|
+
* @default - None.
|
|
49
|
+
*/
|
|
50
|
+
readonly healthCheck?: ElbHealthCheck;
|
|
51
|
+
/**
|
|
52
|
+
* Whether cross zone load balancing is enabled
|
|
53
|
+
*
|
|
54
|
+
* This controls whether the load balancer evenly distributes requests
|
|
55
|
+
* across each availability zone
|
|
56
|
+
*
|
|
57
|
+
* @default true
|
|
58
|
+
*/
|
|
59
|
+
readonly crossZone?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Which subnets to deploy the load balancer
|
|
62
|
+
*
|
|
63
|
+
* Can be used to define a specific set of subnets to deploy the load balancer to.
|
|
64
|
+
* Useful multiple public or private subnets are covering the same availability zone.
|
|
65
|
+
*
|
|
66
|
+
* @default - Public subnets if internetFacing, Private subnets otherwise
|
|
67
|
+
*/
|
|
68
|
+
readonly subnetSelection?: SubnetSelection;
|
|
69
|
+
/**
|
|
70
|
+
* Enable Loadbalancer access logs
|
|
71
|
+
* Can be used to avoid manual work as aws console
|
|
72
|
+
* Required S3 bucket name , enabled flag
|
|
73
|
+
* Can add interval for pushing log
|
|
74
|
+
* Can set bucket prefix in order to provide folder name inside bucket
|
|
75
|
+
* @default - disabled
|
|
76
|
+
*/
|
|
77
|
+
readonly accessLoggingPolicy?: tfElb.ElbAccessLogs;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Describe the health check to a load balancer
|
|
81
|
+
*/
|
|
82
|
+
export interface ElbHealthCheck {
|
|
83
|
+
/**
|
|
84
|
+
* What port number to health check on
|
|
85
|
+
*/
|
|
86
|
+
readonly port: number;
|
|
87
|
+
/**
|
|
88
|
+
* What protocol to use for health checking
|
|
89
|
+
*
|
|
90
|
+
* The protocol is automatically determined from the port if it's not supplied.
|
|
91
|
+
*
|
|
92
|
+
* @default Automatic
|
|
93
|
+
*/
|
|
94
|
+
readonly protocol?: LoadBalancingProtocol;
|
|
95
|
+
/**
|
|
96
|
+
* What path to use for HTTP or HTTPS health check (must return 200)
|
|
97
|
+
*
|
|
98
|
+
* For SSL and TCP health checks, accepting connections is enough to be considered
|
|
99
|
+
* healthy.
|
|
100
|
+
*
|
|
101
|
+
* @default "/"
|
|
102
|
+
*/
|
|
103
|
+
readonly path?: string;
|
|
104
|
+
/**
|
|
105
|
+
* After how many successful checks is an instance considered healthy
|
|
106
|
+
*
|
|
107
|
+
* @default 2
|
|
108
|
+
*/
|
|
109
|
+
readonly healthyThreshold?: number;
|
|
110
|
+
/**
|
|
111
|
+
* After how many unsuccessful checks is an instance considered unhealthy
|
|
112
|
+
*
|
|
113
|
+
* @default 5
|
|
114
|
+
*/
|
|
115
|
+
readonly unhealthyThreshold?: number;
|
|
116
|
+
/**
|
|
117
|
+
* Number of seconds between health checks
|
|
118
|
+
*
|
|
119
|
+
* @default Duration.seconds(30)
|
|
120
|
+
*/
|
|
121
|
+
readonly interval?: Duration;
|
|
122
|
+
/**
|
|
123
|
+
* Health check timeout
|
|
124
|
+
*
|
|
125
|
+
* @default Duration.seconds(5)
|
|
126
|
+
*/
|
|
127
|
+
readonly timeout?: Duration;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Interface that is going to be implemented by constructs that you can load balance to
|
|
131
|
+
*/
|
|
132
|
+
export interface ILoadBalancerTarget extends IConnectable {
|
|
133
|
+
/**
|
|
134
|
+
* Attach load-balanced target to a classic ELB
|
|
135
|
+
* @param loadBalancer [disable-awslint:ref-via-interface] The load balancer to attach the target to
|
|
136
|
+
*/
|
|
137
|
+
attachToClassicLB(loadBalancer: LoadBalancer): void;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Add a backend to the load balancer
|
|
141
|
+
*/
|
|
142
|
+
export interface LoadBalancerListener {
|
|
143
|
+
/**
|
|
144
|
+
* External listening port
|
|
145
|
+
*/
|
|
146
|
+
readonly externalPort: number;
|
|
147
|
+
/**
|
|
148
|
+
* What public protocol to use for load balancing
|
|
149
|
+
*
|
|
150
|
+
* Either 'tcp', 'ssl', 'http' or 'https'.
|
|
151
|
+
*
|
|
152
|
+
* May be omitted if the external port is either 80 or 443.
|
|
153
|
+
*/
|
|
154
|
+
readonly externalProtocol?: LoadBalancingProtocol;
|
|
155
|
+
/**
|
|
156
|
+
* Instance listening port
|
|
157
|
+
*
|
|
158
|
+
* Same as the externalPort if not specified.
|
|
159
|
+
*
|
|
160
|
+
* @default externalPort
|
|
161
|
+
*/
|
|
162
|
+
readonly internalPort?: number;
|
|
163
|
+
/**
|
|
164
|
+
* What public protocol to use for load balancing
|
|
165
|
+
*
|
|
166
|
+
* Either 'tcp', 'ssl', 'http' or 'https'.
|
|
167
|
+
*
|
|
168
|
+
* May be omitted if the internal port is either 80 or 443.
|
|
169
|
+
*
|
|
170
|
+
* The instance protocol is 'tcp' if the front-end protocol
|
|
171
|
+
* is 'tcp' or 'ssl', the instance protocol is 'http' if the
|
|
172
|
+
* front-end protocol is 'https'.
|
|
173
|
+
*/
|
|
174
|
+
readonly internalProtocol?: LoadBalancingProtocol;
|
|
175
|
+
/**
|
|
176
|
+
* SSL policy names
|
|
177
|
+
*
|
|
178
|
+
* @see https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-security-policy-table.html
|
|
179
|
+
*/
|
|
180
|
+
readonly policyNames?: string[];
|
|
181
|
+
/**
|
|
182
|
+
* the ARN of the SSL certificate
|
|
183
|
+
*
|
|
184
|
+
* @default - none
|
|
185
|
+
*/
|
|
186
|
+
readonly sslCertificateArn?: string;
|
|
187
|
+
/**
|
|
188
|
+
* Allow connections to the load balancer from the given set of connection peers
|
|
189
|
+
*
|
|
190
|
+
* By default, connections will be allowed from anywhere. Set this to an empty list
|
|
191
|
+
* to deny connections, or supply a custom list of peers to allow connections from
|
|
192
|
+
* (IP ranges or security groups).
|
|
193
|
+
*
|
|
194
|
+
* @default Anywhere
|
|
195
|
+
*/
|
|
196
|
+
readonly allowConnectionsFrom?: IConnectable[];
|
|
197
|
+
}
|
|
198
|
+
export declare enum LoadBalancingProtocol {
|
|
199
|
+
TCP = "tcp",
|
|
200
|
+
SSL = "ssl",
|
|
201
|
+
HTTP = "http",
|
|
202
|
+
HTTPS = "https"
|
|
203
|
+
}
|
|
204
|
+
export interface LoadBalancerOutputs {
|
|
205
|
+
/**
|
|
206
|
+
* The name of the ELB
|
|
207
|
+
* @attribute
|
|
208
|
+
*/
|
|
209
|
+
readonly loadBalancerName: string;
|
|
210
|
+
/**
|
|
211
|
+
* The canonical hosted zone ID of the ELB (to be used in a Route 53 Alias record)
|
|
212
|
+
*
|
|
213
|
+
* @attribute
|
|
214
|
+
*/
|
|
215
|
+
readonly loadBalancerCanonicalHostedZoneNameId: string;
|
|
216
|
+
/**
|
|
217
|
+
* The DNS name of the ELB
|
|
218
|
+
*
|
|
219
|
+
* @attribute
|
|
220
|
+
*/
|
|
221
|
+
readonly loadBalancerDnsName: string;
|
|
222
|
+
/**
|
|
223
|
+
* The ID of the security group that you can use as part of your inbound rules
|
|
224
|
+
* for your load balancer's back-end application instances.
|
|
225
|
+
*
|
|
226
|
+
* Only available on ELBs launched in a VPC.
|
|
227
|
+
*
|
|
228
|
+
* @attribute
|
|
229
|
+
*/
|
|
230
|
+
readonly loadBalancerSourceSecurityGroupId: string;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* A load balancer with a single listener
|
|
234
|
+
*
|
|
235
|
+
* Routes to a fleet of of instances in a VPC.
|
|
236
|
+
*/
|
|
237
|
+
export declare class LoadBalancer extends AwsConstructBase implements IConnectable {
|
|
238
|
+
/**
|
|
239
|
+
* Control all connections from and to this load balancer
|
|
240
|
+
*/
|
|
241
|
+
readonly connections: Connections;
|
|
242
|
+
get loadBalancerOutputs(): LoadBalancerOutputs;
|
|
243
|
+
get outputs(): Record<string, any>;
|
|
244
|
+
/**
|
|
245
|
+
* An object controlling specifically the connections for each listener added to this load balancer
|
|
246
|
+
*/
|
|
247
|
+
readonly listenerPorts: ListenerPort[];
|
|
248
|
+
private readonly elb;
|
|
249
|
+
private readonly securityGroup;
|
|
250
|
+
private readonly listeners;
|
|
251
|
+
private readonly instancePorts;
|
|
252
|
+
private readonly targets;
|
|
253
|
+
private readonly instanceIds;
|
|
254
|
+
constructor(scope: Construct, id: string, props: LoadBalancerProps);
|
|
255
|
+
/**
|
|
256
|
+
* Add a backend to the load balancer
|
|
257
|
+
*
|
|
258
|
+
* @returns A ListenerPort object that controls connections to the listener port
|
|
259
|
+
*/
|
|
260
|
+
addListener(listener: LoadBalancerListener): ListenerPort;
|
|
261
|
+
addTarget(target: ILoadBalancerTarget): void;
|
|
262
|
+
/**
|
|
263
|
+
* The name of the ELB
|
|
264
|
+
* @attribute
|
|
265
|
+
*/
|
|
266
|
+
get loadBalancerName(): string;
|
|
267
|
+
/**
|
|
268
|
+
* The canonical hosted zone ID of the ELB (to be used in a Route 53 Alias record)
|
|
269
|
+
*
|
|
270
|
+
* @attribute
|
|
271
|
+
*/
|
|
272
|
+
get loadBalancerCanonicalHostedZoneNameId(): string;
|
|
273
|
+
/**
|
|
274
|
+
* The DNS name of the ELB
|
|
275
|
+
*
|
|
276
|
+
* @attribute
|
|
277
|
+
*/
|
|
278
|
+
get loadBalancerDnsName(): string;
|
|
279
|
+
/**
|
|
280
|
+
* The ID of the security group that you can use as part of your inbound rules
|
|
281
|
+
* for your load balancer's back-end application instances.
|
|
282
|
+
*
|
|
283
|
+
* Only available on ELBs launched in a VPC.
|
|
284
|
+
*
|
|
285
|
+
* @attribute
|
|
286
|
+
*/
|
|
287
|
+
get loadBalancerSourceSecurityGroupId(): string;
|
|
288
|
+
/**
|
|
289
|
+
* Allow connections to all existing targets on new instance port
|
|
290
|
+
*/
|
|
291
|
+
private newInstancePort;
|
|
292
|
+
/**
|
|
293
|
+
* Allow connections to target on all existing instance ports
|
|
294
|
+
*/
|
|
295
|
+
private newTarget;
|
|
296
|
+
/**
|
|
297
|
+
* Allow connections for a single (port, target) pair
|
|
298
|
+
*/
|
|
299
|
+
private allowTargetConnection;
|
|
300
|
+
/**
|
|
301
|
+
* Add instance to the load balancer.
|
|
302
|
+
* @internal
|
|
303
|
+
*/
|
|
304
|
+
_addInstanceId(instanceId: string): void;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* An EC2 instance that is the target for load balancing
|
|
308
|
+
*/
|
|
309
|
+
export declare class ElbInstanceTarget implements ILoadBalancerTarget {
|
|
310
|
+
readonly instance: Instance;
|
|
311
|
+
readonly connections: Connections;
|
|
312
|
+
/**
|
|
313
|
+
* Create a new Instance target.
|
|
314
|
+
*
|
|
315
|
+
* @param instance Instance to register to.
|
|
316
|
+
*/
|
|
317
|
+
constructor(instance: Instance);
|
|
318
|
+
attachToClassicLB(loadBalancer: LoadBalancer): void;
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Reference to a listener's port just created.
|
|
322
|
+
*
|
|
323
|
+
* This implements IConnectable with a default port (the port that an ELB
|
|
324
|
+
* listener was just created on) for a given security group so that it can be
|
|
325
|
+
* conveniently used just like any Connectable. E.g:
|
|
326
|
+
*
|
|
327
|
+
* const listener = elb.addListener(...);
|
|
328
|
+
*
|
|
329
|
+
* listener.connections.allowDefaultPortFromAnyIPv4();
|
|
330
|
+
* // or
|
|
331
|
+
* instance.connections.allowToDefaultPort(listener);
|
|
332
|
+
*/
|
|
333
|
+
export declare class ListenerPort implements IConnectable {
|
|
334
|
+
readonly connections: Connections;
|
|
335
|
+
constructor(securityGroup: ISecurityGroup, defaultPort: Port);
|
|
336
|
+
}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b, _c;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ListenerPort = exports.ElbInstanceTarget = exports.LoadBalancer = exports.LoadBalancingProtocol = 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-elasticloadbalancing/lib/load-balancer.ts
|
|
7
|
+
const provider_aws_1 = require("@cdktf/provider-aws");
|
|
8
|
+
const cdktf_1 = require("cdktf");
|
|
9
|
+
const connections_1 = require("./connections");
|
|
10
|
+
const peer_1 = require("./peer");
|
|
11
|
+
const port_1 = require("./port");
|
|
12
|
+
const security_group_1 = require("./security-group");
|
|
13
|
+
const vpc_1 = require("./vpc");
|
|
14
|
+
const duration_1 = require("../../duration");
|
|
15
|
+
const aws_construct_1 = require("../aws-construct");
|
|
16
|
+
var LoadBalancingProtocol;
|
|
17
|
+
(function (LoadBalancingProtocol) {
|
|
18
|
+
LoadBalancingProtocol["TCP"] = "tcp";
|
|
19
|
+
LoadBalancingProtocol["SSL"] = "ssl";
|
|
20
|
+
LoadBalancingProtocol["HTTP"] = "http";
|
|
21
|
+
LoadBalancingProtocol["HTTPS"] = "https";
|
|
22
|
+
})(LoadBalancingProtocol || (exports.LoadBalancingProtocol = LoadBalancingProtocol = {}));
|
|
23
|
+
/**
|
|
24
|
+
* A load balancer with a single listener
|
|
25
|
+
*
|
|
26
|
+
* Routes to a fleet of of instances in a VPC.
|
|
27
|
+
*/
|
|
28
|
+
class LoadBalancer extends aws_construct_1.AwsConstructBase {
|
|
29
|
+
get loadBalancerOutputs() {
|
|
30
|
+
return {
|
|
31
|
+
loadBalancerName: this.loadBalancerName,
|
|
32
|
+
loadBalancerCanonicalHostedZoneNameId: this.loadBalancerCanonicalHostedZoneNameId,
|
|
33
|
+
loadBalancerDnsName: this.loadBalancerDnsName,
|
|
34
|
+
loadBalancerSourceSecurityGroupId: this.loadBalancerSourceSecurityGroupId,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
get outputs() {
|
|
38
|
+
return this.loadBalancerOutputs;
|
|
39
|
+
}
|
|
40
|
+
constructor(scope, id, props) {
|
|
41
|
+
super(scope, id);
|
|
42
|
+
/**
|
|
43
|
+
* An object controlling specifically the connections for each listener added to this load balancer
|
|
44
|
+
*/
|
|
45
|
+
this.listenerPorts = [];
|
|
46
|
+
this.listeners = [];
|
|
47
|
+
this.instancePorts = [];
|
|
48
|
+
this.targets = [];
|
|
49
|
+
this.instanceIds = [];
|
|
50
|
+
this.securityGroup = new security_group_1.SecurityGroup(this, "SecurityGroup", {
|
|
51
|
+
vpc: props.vpc,
|
|
52
|
+
allowAllOutbound: false,
|
|
53
|
+
});
|
|
54
|
+
this.connections = new connections_1.Connections({
|
|
55
|
+
securityGroups: [this.securityGroup],
|
|
56
|
+
});
|
|
57
|
+
// Depending on whether the ELB has public or internal IPs, pick the right backend subnets
|
|
58
|
+
const selectedSubnets = loadBalancerSubnets(props);
|
|
59
|
+
this.elb = new provider_aws_1.elb.Elb(this, "Resource", {
|
|
60
|
+
securityGroups: [this.securityGroup.securityGroupId],
|
|
61
|
+
subnets: selectedSubnets.subnetIds,
|
|
62
|
+
listener: cdktf_1.Lazy.anyValue({ produce: () => this.listeners }),
|
|
63
|
+
instances: cdktf_1.Lazy.listValue({ produce: () => this.instanceIds }, { omitEmpty: true }),
|
|
64
|
+
internal: !props.internetFacing,
|
|
65
|
+
healthCheck: props.healthCheck && healthCheckToJSON(props.healthCheck),
|
|
66
|
+
crossZoneLoadBalancing: props.crossZone ?? true,
|
|
67
|
+
});
|
|
68
|
+
if (props.internetFacing) {
|
|
69
|
+
this.elb.node.addDependency(selectedSubnets.internetConnectivityEstablished);
|
|
70
|
+
}
|
|
71
|
+
if (props.accessLoggingPolicy !== undefined) {
|
|
72
|
+
this.elb.putAccessLogs(props.accessLoggingPolicy);
|
|
73
|
+
}
|
|
74
|
+
ifUndefined(props.listeners, []).forEach((b) => this.addListener(b));
|
|
75
|
+
ifUndefined(props.targets, []).forEach((t) => this.addTarget(t));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Add a backend to the load balancer
|
|
79
|
+
*
|
|
80
|
+
* @returns A ListenerPort object that controls connections to the listener port
|
|
81
|
+
*/
|
|
82
|
+
addListener(listener) {
|
|
83
|
+
const protocol = ifUndefinedLazy(listener.externalProtocol, () => wellKnownProtocol(listener.externalPort));
|
|
84
|
+
const instancePort = listener.internalPort || listener.externalPort;
|
|
85
|
+
const instanceProtocol = ifUndefined(listener.internalProtocol, ifUndefined(tryWellKnownProtocol(instancePort), isHttpProtocol(protocol)
|
|
86
|
+
? LoadBalancingProtocol.HTTP
|
|
87
|
+
: LoadBalancingProtocol.TCP));
|
|
88
|
+
this.listeners.push({
|
|
89
|
+
lbPort: listener.externalPort,
|
|
90
|
+
lbProtocol: protocol,
|
|
91
|
+
instancePort: instancePort,
|
|
92
|
+
instanceProtocol,
|
|
93
|
+
sslCertificateId: listener.sslCertificateArn,
|
|
94
|
+
});
|
|
95
|
+
// create a listener policy if there are any policy names
|
|
96
|
+
if (listener.policyNames && listener.policyNames.length > 0) {
|
|
97
|
+
new provider_aws_1.loadBalancerListenerPolicy.LoadBalancerListenerPolicy(this, `${listener.externalPort}Policy`, {
|
|
98
|
+
loadBalancerName: this.elb.name,
|
|
99
|
+
loadBalancerPort: listener.externalPort,
|
|
100
|
+
policyNames: listener.policyNames,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
const port = new ListenerPort(this.securityGroup, port_1.Port.tcp(listener.externalPort));
|
|
104
|
+
// Allow connections on the public port for all supplied peers (default: everyone)
|
|
105
|
+
ifUndefined(listener.allowConnectionsFrom, [peer_1.Peer.anyIpv4()]).forEach((peer) => {
|
|
106
|
+
port.connections.allowDefaultPortFrom(peer, `Default rule allow on ${listener.externalPort}`);
|
|
107
|
+
});
|
|
108
|
+
this.newInstancePort(instancePort);
|
|
109
|
+
// Keep track using array so user can get to them even if they were all supplied in the constructor
|
|
110
|
+
this.listenerPorts.push(port);
|
|
111
|
+
return port;
|
|
112
|
+
}
|
|
113
|
+
addTarget(target) {
|
|
114
|
+
target.attachToClassicLB(this);
|
|
115
|
+
this.newTarget(target);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* The name of the ELB
|
|
119
|
+
* @attribute
|
|
120
|
+
*/
|
|
121
|
+
get loadBalancerName() {
|
|
122
|
+
return this.elb.name;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* The canonical hosted zone ID of the ELB (to be used in a Route 53 Alias record)
|
|
126
|
+
*
|
|
127
|
+
* @attribute
|
|
128
|
+
*/
|
|
129
|
+
get loadBalancerCanonicalHostedZoneNameId() {
|
|
130
|
+
return this.elb.zoneId;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* The DNS name of the ELB
|
|
134
|
+
*
|
|
135
|
+
* @attribute
|
|
136
|
+
*/
|
|
137
|
+
get loadBalancerDnsName() {
|
|
138
|
+
return this.elb.dnsName;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* The ID of the security group that you can use as part of your inbound rules
|
|
142
|
+
* for your load balancer's back-end application instances.
|
|
143
|
+
*
|
|
144
|
+
* Only available on ELBs launched in a VPC.
|
|
145
|
+
*
|
|
146
|
+
* @attribute
|
|
147
|
+
*/
|
|
148
|
+
get loadBalancerSourceSecurityGroupId() {
|
|
149
|
+
return this.elb.sourceSecurityGroupId;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Allow connections to all existing targets on new instance port
|
|
153
|
+
*/
|
|
154
|
+
newInstancePort(instancePort) {
|
|
155
|
+
this.targets.forEach((t) => this.allowTargetConnection(instancePort, t));
|
|
156
|
+
// Keep track of port for future targets
|
|
157
|
+
this.instancePorts.push(instancePort);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Allow connections to target on all existing instance ports
|
|
161
|
+
*/
|
|
162
|
+
newTarget(target) {
|
|
163
|
+
this.instancePorts.forEach((p) => this.allowTargetConnection(p, target));
|
|
164
|
+
// Keep track of target for future listeners.
|
|
165
|
+
this.targets.push(target);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Allow connections for a single (port, target) pair
|
|
169
|
+
*/
|
|
170
|
+
allowTargetConnection(instancePort, target) {
|
|
171
|
+
this.connections.allowTo(target, port_1.Port.tcp(instancePort), `Port ${instancePort} LB to fleet`);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Add instance to the load balancer.
|
|
175
|
+
* @internal
|
|
176
|
+
*/
|
|
177
|
+
_addInstanceId(instanceId) {
|
|
178
|
+
this.instanceIds.push(instanceId);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
exports.LoadBalancer = LoadBalancer;
|
|
182
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
183
|
+
LoadBalancer[_a] = { fqn: "terraconstructs.aws.compute.LoadBalancer", version: "0.0.12" };
|
|
184
|
+
/**
|
|
185
|
+
* An EC2 instance that is the target for load balancing
|
|
186
|
+
*/
|
|
187
|
+
class ElbInstanceTarget {
|
|
188
|
+
/**
|
|
189
|
+
* Create a new Instance target.
|
|
190
|
+
*
|
|
191
|
+
* @param instance Instance to register to.
|
|
192
|
+
*/
|
|
193
|
+
constructor(instance) {
|
|
194
|
+
this.instance = instance;
|
|
195
|
+
this.connections = instance.connections;
|
|
196
|
+
}
|
|
197
|
+
attachToClassicLB(loadBalancer) {
|
|
198
|
+
loadBalancer._addInstanceId(this.instance.instanceId);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
exports.ElbInstanceTarget = ElbInstanceTarget;
|
|
202
|
+
_b = JSII_RTTI_SYMBOL_1;
|
|
203
|
+
ElbInstanceTarget[_b] = { fqn: "terraconstructs.aws.compute.ElbInstanceTarget", version: "0.0.12" };
|
|
204
|
+
/**
|
|
205
|
+
* Reference to a listener's port just created.
|
|
206
|
+
*
|
|
207
|
+
* This implements IConnectable with a default port (the port that an ELB
|
|
208
|
+
* listener was just created on) for a given security group so that it can be
|
|
209
|
+
* conveniently used just like any Connectable. E.g:
|
|
210
|
+
*
|
|
211
|
+
* const listener = elb.addListener(...);
|
|
212
|
+
*
|
|
213
|
+
* listener.connections.allowDefaultPortFromAnyIPv4();
|
|
214
|
+
* // or
|
|
215
|
+
* instance.connections.allowToDefaultPort(listener);
|
|
216
|
+
*/
|
|
217
|
+
class ListenerPort {
|
|
218
|
+
constructor(securityGroup, defaultPort) {
|
|
219
|
+
this.connections = new connections_1.Connections({
|
|
220
|
+
securityGroups: [securityGroup],
|
|
221
|
+
defaultPort,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
exports.ListenerPort = ListenerPort;
|
|
226
|
+
_c = JSII_RTTI_SYMBOL_1;
|
|
227
|
+
ListenerPort[_c] = { fqn: "terraconstructs.aws.compute.ListenerPort", version: "0.0.12" };
|
|
228
|
+
function wellKnownProtocol(port) {
|
|
229
|
+
const proto = tryWellKnownProtocol(port);
|
|
230
|
+
if (!proto) {
|
|
231
|
+
throw new Error(`Please supply protocol to go with port ${port}`);
|
|
232
|
+
}
|
|
233
|
+
return proto;
|
|
234
|
+
}
|
|
235
|
+
function tryWellKnownProtocol(port) {
|
|
236
|
+
if (port === 80) {
|
|
237
|
+
return LoadBalancingProtocol.HTTP;
|
|
238
|
+
}
|
|
239
|
+
if (port === 443) {
|
|
240
|
+
return LoadBalancingProtocol.HTTPS;
|
|
241
|
+
}
|
|
242
|
+
return undefined;
|
|
243
|
+
}
|
|
244
|
+
function isHttpProtocol(proto) {
|
|
245
|
+
return (proto === LoadBalancingProtocol.HTTPS ||
|
|
246
|
+
proto === LoadBalancingProtocol.HTTP);
|
|
247
|
+
}
|
|
248
|
+
function ifUndefined(x, def) {
|
|
249
|
+
return x != null ? x : def;
|
|
250
|
+
}
|
|
251
|
+
function ifUndefinedLazy(x, def) {
|
|
252
|
+
return x != null ? x : def();
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Turn health check parameters into a parameter blob for the LB
|
|
256
|
+
*/
|
|
257
|
+
function healthCheckToJSON(healthCheck) {
|
|
258
|
+
const protocol = ifUndefined(healthCheck.protocol, ifUndefined(tryWellKnownProtocol(healthCheck.port), LoadBalancingProtocol.TCP));
|
|
259
|
+
const path = protocol === LoadBalancingProtocol.HTTP ||
|
|
260
|
+
protocol === LoadBalancingProtocol.HTTPS
|
|
261
|
+
? ifUndefined(healthCheck.path, "/")
|
|
262
|
+
: "";
|
|
263
|
+
const target = `${protocol.toUpperCase()}:${healthCheck.port}${path}`;
|
|
264
|
+
return {
|
|
265
|
+
healthyThreshold: ifUndefined(healthCheck.healthyThreshold, 2),
|
|
266
|
+
interval: (healthCheck.interval || duration_1.Duration.seconds(30)).toSeconds(),
|
|
267
|
+
target,
|
|
268
|
+
timeout: (healthCheck.timeout || duration_1.Duration.seconds(5)).toSeconds(),
|
|
269
|
+
unhealthyThreshold: ifUndefined(healthCheck.unhealthyThreshold, 5),
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
function loadBalancerSubnets(props) {
|
|
273
|
+
if (props.subnetSelection !== undefined) {
|
|
274
|
+
return props.vpc.selectSubnets(props.subnetSelection);
|
|
275
|
+
}
|
|
276
|
+
else if (props.internetFacing) {
|
|
277
|
+
return props.vpc.selectSubnets({
|
|
278
|
+
subnetType: vpc_1.SubnetType.PUBLIC,
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
return props.vpc.selectSubnets({
|
|
283
|
+
subnetType: vpc_1.SubnetType.PRIVATE_WITH_EGRESS,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1iYWxhbmNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvY29tcHV0ZS9sb2FkLWJhbGFuY2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsa0hBQWtIO0FBRWxILHNEQUErRTtBQUMvRSxpQ0FBNkI7QUFFN0IsK0NBQTBEO0FBRTFELGlDQUE4QjtBQUM5QixpQ0FBOEI7QUFDOUIscURBQWlFO0FBQ2pFLCtCQUEyRTtBQUMzRSw2Q0FBMEM7QUFDMUMsb0RBQW9EO0FBcU5wRCxJQUFZLHFCQUtYO0FBTEQsV0FBWSxxQkFBcUI7SUFDL0Isb0NBQVcsQ0FBQTtJQUNYLG9DQUFXLENBQUE7SUFDWCxzQ0FBYSxDQUFBO0lBQ2Isd0NBQWUsQ0FBQTtBQUNqQixDQUFDLEVBTFcscUJBQXFCLHFDQUFyQixxQkFBcUIsUUFLaEM7QUErQkQ7Ozs7R0FJRztBQUNILE1BQWEsWUFBYSxTQUFRLGdDQUFnQjtJQUtoRCxJQUFXLG1CQUFtQjtRQUM1QixPQUFPO1lBQ0wsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtZQUN2QyxxQ0FBcUMsRUFDbkMsSUFBSSxDQUFDLHFDQUFxQztZQUM1QyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CO1lBQzdDLGlDQUFpQyxFQUFFLElBQUksQ0FBQyxpQ0FBaUM7U0FDMUUsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztJQWVELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBd0I7UUFDaEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQWRuQjs7V0FFRztRQUNhLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQUlsQyxjQUFTLEdBQXdCLEVBQUUsQ0FBQztRQUVwQyxrQkFBYSxHQUFhLEVBQUUsQ0FBQztRQUM3QixZQUFPLEdBQTBCLEVBQUUsQ0FBQztR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ay9ibG9iL3YyLjE3NS4xL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZy9saWIvbG9hZC1iYWxhbmNlci50c1xuXG5pbXBvcnQgeyBlbGIgYXMgdGZFbGIsIGxvYWRCYWxhbmNlckxpc3RlbmVyUG9saWN5IH0gZnJvbSBcIkBjZGt0Zi9wcm92aWRlci1hd3NcIjtcbmltcG9ydCB7IExhenkgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9ucywgSUNvbm5lY3RhYmxlIH0gZnJvbSBcIi4vY29ubmVjdGlvbnNcIjtcbmltcG9ydCB7IEluc3RhbmNlIH0gZnJvbSBcIi4vaW5zdGFuY2VcIjtcbmltcG9ydCB7IFBlZXIgfSBmcm9tIFwiLi9wZWVyXCI7XG5pbXBvcnQgeyBQb3J0IH0gZnJvbSBcIi4vcG9ydFwiO1xuaW1wb3J0IHsgU2VjdXJpdHlHcm91cCwgSVNlY3VyaXR5R3JvdXAgfSBmcm9tIFwiLi9zZWN1cml0eS1ncm91cFwiO1xuaW1wb3J0IHsgSVZwYywgU2VsZWN0ZWRTdWJuZXRzLCBTdWJuZXRTZWxlY3Rpb24sIFN1Ym5ldFR5cGUgfSBmcm9tIFwiLi92cGNcIjtcbmltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSBcIi4uLy4uL2R1cmF0aW9uXCI7XG5pbXBvcnQgeyBBd3NDb25zdHJ1Y3RCYXNlIH0gZnJvbSBcIi4uL2F3cy1jb25zdHJ1Y3RcIjtcblxuLyoqXG4gKiBDb25zdHJ1Y3Rpb24gcHJvcGVydGllcyBmb3IgYSBMb2FkQmFsYW5jZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FkQmFsYW5jZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBWUEMgbmV0d29yayBvZiB0aGUgZmxlZXQgaW5zdGFuY2VzXG4gICAqL1xuICByZWFkb25seSB2cGM6IElWcGM7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBpcyBhbiBpbnRlcm5ldC1mYWNpbmcgTG9hZCBCYWxhbmNlclxuICAgKlxuICAgKiBUaGlzIGNvbnRyb2xzIHdoZXRoZXIgdGhlIExCIGhhcyBhIHB1YmxpYyBJUCBhZGRyZXNzIGFzc2lnbmVkLiBJdCBkb2VzXG4gICAqIG5vdCBvcGVuIHVwIHRoZSBMb2FkIEJhbGFuY2VyJ3Mgc2VjdXJpdHkgZ3JvdXBzIHRvIHB1YmxpYyBpbnRlcm5ldCBhY2Nlc3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpbnRlcm5ldEZhY2luZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoYXQgbGlzdGVuZXJzIHRvIHNldCB1cCBmb3IgdGhlIGxvYWQgYmFsYW5jZXIuXG4gICAqXG4gICAqIENhbiBhbHNvIGJlIGFkZGVkIGJ5IC5hZGRMaXN0ZW5lcigpXG4gICAqXG4gICAqIEBkZWZhdWx0IC1cbiAgICovXG4gIHJlYWRvbmx5IGxpc3RlbmVycz86IExvYWRCYWxhbmNlckxpc3RlbmVyW107XG5cbiAgLyoqXG4gICAqIFdoYXQgdGFyZ2V0cyB0byBsb2FkIGJhbGFuY2UgdG8uXG4gICAqXG4gICAqIENhbiBhbHNvIGJlIGFkZGVkIGJ5IC5hZGRUYXJnZXQoKVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmUuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRzPzogSUxvYWRCYWxhbmNlclRhcmdldFtdO1xuXG4gIC8qKlxuICAgKiBIZWFsdGggY2hlY2sgc2V0dGluZ3MgZm9yIHRoZSBsb2FkIGJhbGFuY2luZyB0YXJnZXRzLlxuICAgKlxuICAgKiBOb3QgcmVxdWlyZWQgYnV0IHJlY29tbWVuZGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmUuXG4gICAqL1xuICByZWFkb25seSBoZWFsdGhDaGVjaz86IEVsYkhlYWx0aENoZWNrO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNyb3NzIHpvbmUgbG9hZCBiYWxhbmNpbmcgaXMgZW5hYmxlZFxuICAgKlxuICAgKiBUaGlzIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGxvYWQgYmFsYW5jZXIgZXZlbmx5IGRpc3RyaWJ1dGVzIHJlcXVlc3RzXG4gICAqIGFjcm9zcyBlYWNoIGF2YWlsYWJpbGl0eSB6b25lXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGNyb3NzWm9uZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoaWNoIHN1Ym5ldHMgdG8gZGVwbG95IHRoZSBsb2FkIGJhbGFuY2VyXG4gICAqXG4gICAqIENhbiBiZSB1c2VkIHRvIGRlZmluZSBhIHNwZWNpZmljIHNldCBvZiBzdWJuZXRzIHRvIGRlcGxveSB0aGUgbG9hZCBiYWxhbmNlciB0by5cbiAgICogVXNlZnVsIG11bHRpcGxlIHB1YmxpYyBvciBwcml2YXRlIHN1Ym5ldHMgYXJlIGNvdmVyaW5nIHRoZSBzYW1lIGF2YWlsYWJpbGl0eSB6b25lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFB1YmxpYyBzdWJuZXRzIGlmIGludGVybmV0RmFjaW5nLCBQcml2YXRlIHN1Ym5ldHMgb3RoZXJ3aXNlXG4gICAqL1xuICByZWFkb25seSBzdWJuZXRTZWxlY3Rpb24/OiBTdWJuZXRTZWxlY3Rpb247XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBMb2FkYmFsYW5jZXIgYWNjZXNzIGxvZ3NcbiAgICogQ2FuIGJlIHVzZWQgdG8gYXZvaWQgbWFudWFsIHdvcmsgYXMgYXdzIGNvbnNvbGVcbiAgICogUmVxdWlyZWQgUzMgYnVja2V0IG5hbWUgLCBlbmFibGVkIGZsYWdcbiAgICogQ2FuIGFkZCBpbnRlcnZhbCBmb3IgcHVzaGluZyBsb2dcbiAgICogQ2FuIHNldCBidWNrZXQgcHJlZml4IGluIG9yZGVyIHRvIHByb3ZpZGUgZm9sZGVyIG5hbWUgaW5zaWRlIGJ1Y2tldFxuICAgKiBAZGVmYXVsdCAtIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSBhY2Nlc3NMb2dnaW5nUG9saWN5PzogdGZFbGIuRWxiQWNjZXNzTG9ncztcbn1cblxuLyoqXG4gKiBEZXNjcmliZSB0aGUgaGVhbHRoIGNoZWNrIHRvIGEgbG9hZCBiYWxhbmNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVsYkhlYWx0aENoZWNrIHtcbiAgLyoqXG4gICAqIFdoYXQgcG9ydCBudW1iZXIgdG8gaGVhbHRoIGNoZWNrIG9uXG4gICAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoYXQgcHJvdG9jb2wgdG8gdXNlIGZvciBoZWFsdGggY2hlY2tpbmdcbiAgICpcbiAgICogVGhlIHByb3RvY29sIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCBmcm9tIHRoZSBwb3J0IGlmIGl0J3Mgbm90IHN1cHBsaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBdXRvbWF0aWNcbiAgICovXG4gIHJlYWRvbmx5IHByb3RvY29sPzogTG9hZEJhbGFuY2luZ1Byb3RvY29sO1xuXG4gIC8qKlxuICAgKiBXaGF0IHBhdGggdG8gdXNlIGZvciBIVFRQIG9yIEhUVFBTIGhlYWx0aCBjaGVjayAobXVzdCByZXR1cm4gMjAwKVxuICAgKlxuICAgKiBGb3IgU1NMIGFuZCBUQ1AgaGVhbHRoIGNoZWNrcywgYWNjZXB0aW5nIGNvbm5lY3Rpb25zIGlzIGVub3VnaCB0byBiZSBjb25zaWRlcmVkXG4gICAqIGhlYWx0aHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiL1wiXG4gICAqL1xuICByZWFkb25seSBwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZnRlciBob3cgbWFueSBzdWNjZXNzZnVsIGNoZWNrcyBpcyBhbiBpbnN0YW5jZSBjb25zaWRlcmVkIGhlYWx0aHlcbiAgICpcbiAgICogQGRlZmF1bHQgMlxuICAgKi9cbiAgcmVhZG9ubHkgaGVhbHRoeVRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICogQWZ0ZXIgaG93IG1hbnkgdW5zdWNjZXNzZnVsIGNoZWNrcyBpcyBhbiBpbnN0YW5jZSBjb25zaWRlcmVkIHVuaGVhbHRoeVxuICAgKlxuICAgKiBAZGVmYXVsdCA1XG4gICAqL1xuICByZWFkb25seSB1bmhlYWx0aHlUaHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gaGVhbHRoIGNoZWNrc1xuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5zZWNvbmRzKDMwKVxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogSGVhbHRoIGNoZWNrIHRpbWVvdXRcbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcyg1KVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IER1cmF0aW9uO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSB0aGF0IGlzIGdvaW5nIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNvbnN0cnVjdHMgdGhhdCB5b3UgY2FuIGxvYWQgYmFsYW5jZSB0b1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElMb2FkQmFsYW5jZXJUYXJnZXQgZXh0ZW5kcyBJQ29ubmVjdGFibGUge1xuICAvKipcbiAgICogQXR0YWNoIGxvYWQtYmFsYW5jZWQgdGFyZ2V0IHRvIGEgY2xhc3NpYyBFTEJcbiAgICogQHBhcmFtIGxvYWRCYWxhbmNlciBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXSBUaGUgbG9hZCBiYWxhbmNlciB0byBhdHRhY2ggdGhlIHRhcmdldCB0b1xuICAgKi9cbiAgYXR0YWNoVG9DbGFzc2ljTEIobG9hZEJhbGFuY2VyOiBMb2FkQmFsYW5jZXIpOiB2b2lkO1xufVxuXG4vKipcbiAqIEFkZCBhIGJhY2tlbmQgdG8gdGhlIGxvYWQgYmFsYW5jZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FkQmFsYW5jZXJMaXN0ZW5lciB7XG4gIC8qKlxuICAgKiBFeHRlcm5hbCBsaXN0ZW5pbmcgcG9ydFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZXJuYWxQb3J0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoYXQgcHVibGljIHByb3RvY29sIHRvIHVzZSBmb3IgbG9hZCBiYWxhbmNpbmdcbiAgICpcbiAgICogRWl0aGVyICd0Y3AnLCAnc3NsJywgJ2h0dHAnIG9yICdodHRwcycuXG4gICAqXG4gICAqIE1heSBiZSBvbWl0dGVkIGlmIHRoZSBleHRlcm5hbCBwb3J0IGlzIGVpdGhlciA4MCBvciA0NDMuXG4gICAqL1xuICByZWFkb25seSBleHRlcm5hbFByb3RvY29sPzogTG9hZEJhbGFuY2luZ1Byb3RvY29sO1xuXG4gIC8qKlxuICAgKiBJbnN0YW5jZSBsaXN0ZW5pbmcgcG9ydFxuICAgKlxuICAgKiBTYW1lIGFzIHRoZSBleHRlcm5hbFBvcnQgaWYgbm90IHNwZWNpZmllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZXh0ZXJuYWxQb3J0XG4gICAqL1xuICByZWFkb25seSBpbnRlcm5hbFBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoYXQgcHVibGljIHByb3RvY29sIHRvIHVzZSBmb3IgbG9hZCBiYWxhbmNpbmdcbiAgICpcbiAgICogRWl0aGVyICd0Y3AnLCAnc3NsJywgJ2h0dHAnIG9yICdodHRwcycuXG4gICAqXG4gICAqIE1heSBiZSBvbWl0dGVkIGlmIHRoZSBpbnRlcm5hbCBwb3J0IGlzIGVpdGhlciA4MCBvciA0NDMuXG4gICAqXG4gICAqIFRoZSBpbnN0YW5jZSBwcm90b2NvbCBpcyAndGNwJyBpZiB0aGUgZnJvbnQtZW5kIHByb3RvY29sXG4gICAqIGlzICd0Y3AnIG9yICdzc2wnLCB0aGUgaW5zdGFuY2UgcHJvdG9jb2wgaXMgJ2h0dHAnIGlmIHRoZVxuICAgKiBmcm9udC1lbmQgcHJvdG9jb2wgaXMgJ2h0dHBzJy5cbiAgICovXG4gIHJlYWRvbmx5IGludGVybmFsUHJvdG9jb2w/OiBMb2FkQmFsYW5jaW5nUHJvdG9jb2w7XG5cbiAgLyoqXG4gICAqIFNTTCBwb2xpY3kgbmFtZXNcbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWxhc3RpY2xvYWRiYWxhbmNpbmcvbGF0ZXN0L2NsYXNzaWMvZWxiLXNlY3VyaXR5LXBvbGljeS10YWJsZS5odG1sXG4gICAqL1xuICByZWFkb25seSBwb2xpY3lOYW1lcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiB0aGUgQVJOIG9mIHRoZSBTU0wgY2VydGlmaWNhdGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBzc2xDZXJ0aWZpY2F0ZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogQWxsb3cgY29ubmVjdGlvbnMgdG8gdGhlIGxvYWQgYmFsYW5jZXIgZnJvbSB0aGUgZ2l2ZW4gc2V0IG9mIGNvbm5lY3Rpb24gcGVlcnNcbiAgICpcbiAgICogQnkgZGVmYXVsdCwgY29ubmVjdGlvbnMgd2lsbCBiZSBhbGxvd2VkIGZyb20gYW55d2hlcmUuIFNldCB0aGlzIHRvIGFuIGVtcHR5IGxpc3RcbiAgICogdG8gZGVueSBjb25uZWN0aW9ucywgb3Igc3VwcGx5IGEgY3VzdG9tIGxpc3Qgb2YgcGVlcnMgdG8gYWxsb3cgY29ubmVjdGlvbnMgZnJvbVxuICAgKiAoSVAgcmFuZ2VzIG9yIHNlY3VyaXR5IGdyb3VwcykuXG4gICAqXG4gICAqIEBkZWZhdWx0IEFueXdoZXJlXG4gICAqL1xuICByZWFkb25seSBhbGxvd0Nvbm5lY3Rpb25zRnJvbT86IElDb25uZWN0YWJsZVtdO1xufVxuXG5leHBvcnQgZW51bSBMb2FkQmFsYW5jaW5nUHJvdG9jb2wge1xuICBUQ1AgPSBcInRjcFwiLFxuICBTU0wgPSBcInNzbFwiLFxuICBIVFRQID0gXCJodHRwXCIsXG4gIEhUVFBTID0gXCJodHRwc1wiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvYWRCYWxhbmNlck91dHB1dHMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIEVMQlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBsb2FkQmFsYW5jZXJOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY2Fub25pY2FsIGhvc3RlZCB6b25lIElEIG9mIHRoZSBFTEIgKHRvIGJlIHVzZWQgaW4gYSBSb3V0ZSA1MyBBbGlhcyByZWNvcmQpXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGxvYWRCYWxhbmNlckNhbm9uaWNhbEhvc3RlZFpvbmVOYW1lSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBETlMgbmFtZSBvZiB0aGUgRUxCXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGxvYWRCYWxhbmNlckRuc05hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgc2VjdXJpdHkgZ3JvdXAgdGhhdCB5b3UgY2FuIHVzZSBhcyBwYXJ0IG9mIHlvdXIgaW5ib3VuZCBydWxlc1xuICAgKiBmb3IgeW91ciBsb2FkIGJhbGFuY2VyJ3MgYmFjay1lbmQgYXBwbGljYXRpb24gaW5zdGFuY2VzLlxuICAgKlxuICAgKiBPbmx5IGF2YWlsYWJsZSBvbiBFTEJzIGxhdW5jaGVkIGluIGEgVlBDLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBsb2FkQmFsYW5jZXJTb3VyY2VTZWN1cml0eUdyb3VwSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGxvYWQgYmFsYW5jZXIgd2l0aCBhIHNpbmdsZSBsaXN0ZW5lclxuICpcbiAqIFJvdXRlcyB0byBhIGZsZWV0IG9mIG9mIGluc3RhbmNlcyBpbiBhIFZQQy5cbiAqL1xuZXhwb3J0IGNsYXNzIExvYWRCYWxhbmNlciBleHRlbmRzIEF3c0NvbnN0cnVjdEJhc2UgaW1wbGVtZW50cyBJQ29ubmVjdGFibGUge1xuICAvKipcbiAgICogQ29udHJvbCBhbGwgY29ubmVjdGlvbnMgZnJvbSBhbmQgdG8gdGhpcyBsb2FkIGJhbGFuY2VyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuICBwdWJsaWMgZ2V0IGxvYWRCYWxhbmNlck91dHB1dHMoKTogTG9hZEJhbGFuY2VyT3V0cHV0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvYWRCYWxhbmNlck5hbWU6IHRoaXMubG9hZEJhbGFuY2VyTmFtZSxcbiAgICAgIGxvYWRCYWxhbmNlckNhbm9uaWNhbEhvc3RlZFpvbmVOYW1lSWQ6XG4gICAgICAgIHRoaXMubG9hZEJhbGFuY2VyQ2Fub25pY2FsSG9zdGVkWm9uZU5hbWVJZCxcbiAgICAgIGxvYWRCYWxhbmNlckRuc05hbWU6IHRoaXMubG9hZEJhbGFuY2VyRG5zTmFtZSxcbiAgICAgIGxvYWRCYWxhbmNlclNvdXJjZVNlY3VyaXR5R3JvdXBJZDogdGhpcy5sb2FkQmFsYW5jZXJTb3VyY2VTZWN1cml0eUdyb3VwSWQsXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgZ2V0IG91dHB1dHMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMubG9hZEJhbGFuY2VyT3V0cHV0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBvYmplY3QgY29udHJvbGxpbmcgc3BlY2lmaWNhbGx5IHRoZSBjb25uZWN0aW9ucyBmb3IgZWFjaCBsaXN0ZW5lciBhZGRlZCB0byB0aGlzIGxvYWQgYmFsYW5jZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsaXN0ZW5lclBvcnRzOiBMaXN0ZW5lclBvcnRbXSA9IFtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZWxiOiB0ZkVsYi5FbGI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjdXJpdHlHcm91cDogU2VjdXJpdHlHcm91cDtcbiAgcHJpdmF0ZSByZWFkb25seSBsaXN0ZW5lcnM6IHRmRWxiLkVsYkxpc3RlbmVyW10gPSBbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGluc3RhbmNlUG9ydHM6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFyZ2V0czogSUxvYWRCYWxhbmNlclRhcmdldFtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFuY2VJZHM6IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IExvYWRCYWxhbmNlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuc2VjdXJpdHlHcm91cCA9IG5ldyBTZWN1cml0eUdyb3VwKHRoaXMsIFwiU2VjdXJpdHlHcm91cFwiLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGFsbG93QWxsT3V0Ym91bmQ6IGZhbHNlLFxuICAgIH0pO1xuICAgIHRoaXMuY29ubmVjdGlvbnMgPSBuZXcgQ29ubmVjdGlvbnMoe1xuICAgICAgc2VjdXJpdHlHcm91cHM6IFt0aGlzLnNlY3VyaXR5R3JvdXBdLFxuICAgIH0pO1xuICAgIC8vIERlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBFTEIgaGFzIHB1YmxpYyBvciBpbnRlcm5hbCBJUHMsIHBpY2sgdGhlIHJpZ2h0IGJhY2tlbmQgc3VibmV0c1xuICAgIGNvbnN0IHNlbGVjdGVkU3VibmV0czogU2VsZWN0ZWRTdWJuZXRzID0gbG9hZEJhbGFuY2VyU3VibmV0cyhwcm9wcyk7XG5cbiAgICB0aGlzLmVsYiA9IG5ldyB0ZkVsYi5FbGIodGhpcywgXCJSZXNvdXJjZVwiLCB7XG4gICAgICBzZWN1cml0eUdyb3VwczogW3RoaXMuc2VjdXJpdHlHcm91cC5zZWN1cml0eUdyb3VwSWRdLFxuICAgICAgc3VibmV0czogc2VsZWN0ZWRTdWJuZXRzLnN1Ym5ldElkcyxcbiAgICAgIGxpc3RlbmVyOiBMYXp5LmFueVZhbHVlKHsgcHJvZHVjZTogKCkgPT4gdGhpcy5saXN0ZW5lcnMgfSksXG4gICAgICBpbnN0YW5jZXM6IExhenkubGlzdFZhbHVlKFxuICAgICAgICB7IHByb2R1Y2U6ICgpID0+IHRoaXMuaW5zdGFuY2VJZHMgfSxcbiAgICAgICAgeyBvbWl0RW1wdHk6IHRydWUgfSxcbiAgICAgICksXG4gICAgICBpbnRlcm5hbDogIXByb3BzLmludGVybmV0RmFjaW5nLFxuICAgICAgaGVhbHRoQ2hlY2s6IHByb3BzLmhlYWx0aENoZWNrICYmIGhlYWx0aENoZWNrVG9KU09OKHByb3BzLmhlYWx0aENoZWNrKSxcbiAgICAgIGNyb3NzWm9uZUxvYWRCYWxhbmNpbmc6IHByb3BzLmNyb3NzWm9uZSA/PyB0cnVlLFxuICAgIH0pO1xuICAgIGlmIChwcm9wcy5pbnRlcm5ldEZhY2luZykge1xuICAgICAgdGhpcy5lbGIubm9kZS5hZGREZXBlbmRlbmN5KFxuICAgICAgICBzZWxlY3RlZFN1Ym5ldHMuaW50ZXJuZXRDb25uZWN0aXZpdHlFc3RhYmxpc2hlZCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmFjY2Vzc0xvZ2dpbmdQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lbGIucHV0QWNjZXNzTG9ncyhwcm9wcy5hY2Nlc3NMb2dnaW5nUG9saWN5KTtcbiAgICB9XG5cbiAgICBpZlVuZGVmaW5lZChwcm9wcy5saXN0ZW5lcnMsIFtdKS5mb3JFYWNoKChiKSA9PiB0aGlzLmFkZExpc3RlbmVyKGIpKTtcbiAgICBpZlVuZGVmaW5lZChwcm9wcy50YXJnZXRzLCBbXSkuZm9yRWFjaCgodCkgPT4gdGhpcy5hZGRUYXJnZXQodCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGJhY2tlbmQgdG8gdGhlIGxvYWQgYmFsYW5jZXJcbiAgICpcbiAgICogQHJldHVybnMgQSBMaXN0ZW5lclBvcnQgb2JqZWN0IHRoYXQgY29udHJvbHMgY29ubmVjdGlvbnMgdG8gdGhlIGxpc3RlbmVyIHBvcnRcbiAgICovXG4gIHB1YmxpYyBhZGRMaXN0ZW5lcihsaXN0ZW5lcjogTG9hZEJhbGFuY2VyTGlzdGVuZXIpOiBMaXN0ZW5lclBvcnQge1xuICAgIGNvbnN0IHByb3RvY29sID0gaWZVbmRlZmluZWRMYXp5KGxpc3RlbmVyLmV4dGVybmFsUHJvdG9jb2wsICgpID0+XG4gICAgICB3ZWxsS25vd25Qcm90b2NvbChsaXN0ZW5lci5leHRlcm5hbFBvcnQpLFxuICAgICk7XG4gICAgY29uc3QgaW5zdGFuY2VQb3J0ID0gbGlzdGVuZXIuaW50ZXJuYWxQb3J0IHx8IGxpc3RlbmVyLmV4dGVybmFsUG9ydDtcbiAgICBjb25zdCBpbnN0YW5jZVByb3RvY29sID0gaWZVbmRlZmluZWQoXG4gICAgICBsaXN0ZW5lci5pbnRlcm5hbFByb3RvY29sLFxuICAgICAgaWZVbmRlZmluZWQoXG4gICAgICAgIHRyeVdlbGxLbm93blByb3RvY29sKGluc3RhbmNlUG9ydCksXG4gICAgICAgIGlzSHR0cFByb3RvY29sKHByb3RvY29sKVxuICAgICAgICAgID8gTG9hZEJhbGFuY2luZ1Byb3RvY29sLkhUVFBcbiAgICAgICAgICA6IExvYWRCYWxhbmNpbmdQcm90b2NvbC5UQ1AsXG4gICAgICApLFxuICAgICk7XG5cbiAgICB0aGlzLmxpc3RlbmVycy5wdXNoKHtcbiAgICAgIGxiUG9ydDogbGlzdGVuZXIuZXh0ZXJuYWxQb3J0LFxuICAgICAgbGJQcm90b2NvbDogcHJvdG9jb2wsXG4gICAgICBpbnN0YW5jZVBvcnQ6IGluc3RhbmNlUG9ydCxcbiAgICAgIGluc3RhbmNlUHJvdG9jb2wsXG4gICAgICBzc2xDZXJ0aWZpY2F0ZUlkOiBsaXN0ZW5lci5zc2xDZXJ0aWZpY2F0ZUFybixcbiAgICB9KTtcblxuICAgIC8vIGNyZWF0ZSBhIGxpc3RlbmVyIHBvbGljeSBpZiB0aGVyZSBhcmUgYW55IHBvbGljeSBuYW1lc1xuICAgIGlmIChsaXN0ZW5lci5wb2xpY3lOYW1lcyAmJiBsaXN0ZW5lci5wb2xpY3lOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBuZXcgbG9hZEJhbGFuY2VyTGlzdGVuZXJQb2xpY3kuTG9hZEJhbGFuY2VyTGlzdGVuZXJQb2xpY3koXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke2xpc3RlbmVyLmV4dGVybmFsUG9ydH1Qb2xpY3lgLFxuICAgICAgICB7XG4gICAgICAgICAgbG9hZEJhbGFuY2VyTmFtZTogdGhpcy5lbGIubmFtZSxcbiAgICAgICAgICBsb2FkQmFsYW5jZXJQb3J0OiBsaXN0ZW5lci5leHRlcm5hbFBvcnQsXG4gICAgICAgICAgcG9saWN5TmFtZXM6IGxpc3RlbmVyLnBvbGljeU5hbWVzLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3J0ID0gbmV3IExpc3RlbmVyUG9ydChcbiAgICAgIHRoaXMuc2VjdXJpdHlHcm91cCxcbiAgICAgIFBvcnQudGNwKGxpc3RlbmVyLmV4dGVybmFsUG9ydCksXG4gICAgKTtcblxuICAgIC8vIEFsbG93IGNvbm5lY3Rpb25zIG9uIHRoZSBwdWJsaWMgcG9ydCBmb3IgYWxsIHN1cHBsaWVkIHBlZXJzIChkZWZhdWx0OiBldmVyeW9uZSlcbiAgICBpZlVuZGVmaW5lZChsaXN0ZW5lci5hbGxvd0Nvbm5lY3Rpb25zRnJvbSwgW1BlZXIuYW55SXB2NCgpXSkuZm9yRWFjaChcbiAgICAgIChwZWVyKSA9PiB7XG4gICAgICAgIHBvcnQuY29ubmVjdGlvbnMuYWxsb3dEZWZhdWx0UG9ydEZyb20oXG4gICAgICAgICAgcGVlcixcbiAgICAgICAgICBgRGVmYXVsdCBydWxlIGFsbG93IG9uICR7bGlzdGVuZXIuZXh0ZXJuYWxQb3J0fWAsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0aGlzLm5ld0luc3RhbmNlUG9ydChpbnN0YW5jZVBvcnQpO1xuXG4gICAgLy8gS2VlcCB0cmFjayB1c2luZyBhcnJheSBzbyB1c2VyIGNhbiBnZXQgdG8gdGhlbSBldmVuIGlmIHRoZXkgd2VyZSBhbGwgc3VwcGxpZWQgaW4gdGhlIGNvbnN0cnVjdG9yXG4gICAgdGhpcy5saXN0ZW5lclBvcnRzLnB1c2gocG9ydCk7XG5cbiAgICByZXR1cm4gcG9ydDtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUYXJnZXQodGFyZ2V0OiBJTG9hZEJhbGFuY2VyVGFyZ2V0KSB7XG4gICAgdGFyZ2V0LmF0dGFjaFRvQ2xhc3NpY0xCKHRoaXMpO1xuXG4gICAgdGhpcy5uZXdUYXJnZXQodGFyZ2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgRUxCXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyBnZXQgbG9hZEJhbGFuY2VyTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbGIubmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY2Fub25pY2FsIGhvc3RlZCB6b25lIElEIG9mIHRoZSBFTEIgKHRvIGJlIHVzZWQgaW4gYSBSb3V0ZSA1MyBBbGlhcyByZWNvcmQpXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyBnZXQgbG9hZEJhbGFuY2VyQ2Fub25pY2FsSG9zdGVkWm9uZU5hbWVJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbGIuem9uZUlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBETlMgbmFtZSBvZiB0aGUgRUxCXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyBnZXQgbG9hZEJhbGFuY2VyRG5zTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbGIuZG5zTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHNlY3VyaXR5IGdyb3VwIHRoYXQgeW91IGNhbiB1c2UgYXMgcGFydCBvZiB5b3VyIGluYm91bmQgcnVsZXNcbiAgICogZm9yIHlvdXIgbG9hZCBiYWxhbmNlcidzIGJhY2stZW5kIGFwcGxpY2F0aW9uIGluc3RhbmNlcy5cbiAgICpcbiAgICogT25seSBhdmFpbGFibGUgb24gRUxCcyBsYXVuY2hlZCBpbiBhIFZQQy5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIGdldCBsb2FkQmFsYW5jZXJTb3VyY2VTZWN1cml0eUdyb3VwSWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxiLnNvdXJjZVNlY3VyaXR5R3JvdXBJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyBjb25uZWN0aW9ucyB0byBhbGwgZXhpc3RpbmcgdGFyZ2V0cyBvbiBuZXcgaW5zdGFuY2UgcG9ydFxuICAgKi9cbiAgcHJpdmF0ZSBuZXdJbnN0YW5jZVBvcnQoaW5zdGFuY2VQb3J0OiBudW1iZXIpIHtcbiAgICB0aGlzLnRhcmdldHMuZm9yRWFjaCgodCkgPT4gdGhpcy5hbGxvd1RhcmdldENvbm5lY3Rpb24oaW5zdGFuY2VQb3J0LCB0KSk7XG5cbiAgICAvLyBLZWVwIHRyYWNrIG9mIHBvcnQgZm9yIGZ1dHVyZSB0YXJnZXRzXG4gICAgdGhpcy5pbnN0YW5jZVBvcnRzLnB1c2goaW5zdGFuY2VQb3J0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyBjb25uZWN0aW9ucyB0byB0YXJnZXQgb24gYWxsIGV4aXN0aW5nIGluc3RhbmNlIHBvcnRzXG4gICAqL1xuICBwcml2YXRlIG5ld1RhcmdldCh0YXJnZXQ6IElMb2FkQmFsYW5jZXJUYXJnZXQpIHtcbiAgICB0aGlzLmluc3RhbmNlUG9ydHMuZm9yRWFjaCgocCkgPT4gdGhpcy5hbGxvd1RhcmdldENvbm5lY3Rpb24ocCwgdGFyZ2V0KSk7XG5cbiAgICAvLyBLZWVwIHRyYWNrIG9mIHRhcmdldCBmb3IgZnV0dXJlIGxpc3RlbmVycy5cbiAgICB0aGlzLnRhcmdldHMucHVzaCh0YXJnZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IGNvbm5lY3Rpb25zIGZvciBhIHNpbmdsZSAocG9ydCwgdGFyZ2V0KSBwYWlyXG4gICAqL1xuICBwcml2YXRlIGFsbG93VGFyZ2V0Q29ubmVjdGlvbihcbiAgICBpbnN0YW5jZVBvcnQ6IG51bWJlcixcbiAgICB0YXJnZXQ6IElMb2FkQmFsYW5jZXJUYXJnZXQsXG4gICkge1xuICAgIHRoaXMuY29ubmVjdGlvbnMuYWxsb3dUbyhcbiAgICAgIHRhcmdldCxcbiAgICAgIFBvcnQudGNwKGluc3RhbmNlUG9ydCksXG4gICAgICBgUG9ydCAke2luc3RhbmNlUG9ydH0gTEIgdG8gZmxlZXRgLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGluc3RhbmNlIHRvIHRoZSBsb2FkIGJhbGFuY2VyLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfYWRkSW5zdGFuY2VJZChpbnN0YW5jZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmluc3RhbmNlSWRzLnB1c2goaW5zdGFuY2VJZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBFQzIgaW5zdGFuY2UgdGhhdCBpcyB0aGUgdGFyZ2V0IGZvciBsb2FkIGJhbGFuY2luZ1xuICovXG5leHBvcnQgY2xhc3MgRWxiSW5zdGFuY2VUYXJnZXQgaW1wbGVtZW50cyBJTG9hZEJhbGFuY2VyVGFyZ2V0IHtcbiAgcmVhZG9ubHkgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IEluc3RhbmNlIHRhcmdldC5cbiAgICpcbiAgICogQHBhcmFtIGluc3RhbmNlIEluc3RhbmNlIHRvIHJlZ2lzdGVyIHRvLlxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGluc3RhbmNlOiBJbnN0YW5jZSkge1xuICAgIHRoaXMuY29ubmVjdGlvbnMgPSBpbnN0YW5jZS5jb25uZWN0aW9ucztcbiAgfVxuXG4gIHB1YmxpYyBhdHRhY2hUb0NsYXNzaWNMQihsb2FkQmFsYW5jZXI6IExvYWRCYWxhbmNlcik6IHZvaWQge1xuICAgIGxvYWRCYWxhbmNlci5fYWRkSW5zdGFuY2VJZCh0aGlzLmluc3RhbmNlLmluc3RhbmNlSWQpO1xuICB9XG59XG5cbi8qKlxuICogUmVmZXJlbmNlIHRvIGEgbGlzdGVuZXIncyBwb3J0IGp1c3QgY3JlYXRlZC5cbiAqXG4gKiBUaGlzIGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHdpdGggYSBkZWZhdWx0IHBvcnQgKHRoZSBwb3J0IHRoYXQgYW4gRUxCXG4gKiBsaXN0ZW5lciB3YXMganVzdCBjcmVhdGVkIG9uKSBmb3IgYSBnaXZlbiBzZWN1cml0eSBncm91cCBzbyB0aGF0IGl0IGNhbiBiZVxuICogY29udmVuaWVudGx5IHVzZWQganVzdCBsaWtlIGFueSBDb25uZWN0YWJsZS4gRS5nOlxuICpcbiAqICAgIGNvbnN0IGxpc3RlbmVyID0gZWxiLmFkZExpc3RlbmVyKC4uLik7XG4gKlxuICogICAgbGlzdGVuZXIuY29ubmVjdGlvbnMuYWxsb3dEZWZhdWx0UG9ydEZyb21BbnlJUHY0KCk7XG4gKiAgICAvLyBvclxuICogICAgaW5zdGFuY2UuY29ubmVjdGlvbnMuYWxsb3dUb0RlZmF1bHRQb3J0KGxpc3RlbmVyKTtcbiAqL1xuZXhwb3J0IGNsYXNzIExpc3RlbmVyUG9ydCBpbXBsZW1lbnRzIElDb25uZWN0YWJsZSB7XG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uczogQ29ubmVjdGlvbnM7XG5cbiAgY29uc3RydWN0b3Ioc2VjdXJpdHlHcm91cDogSVNlY3VyaXR5R3JvdXAsIGRlZmF1bHRQb3J0OiBQb3J0KSB7XG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IG5ldyBDb25uZWN0aW9ucyh7XG4gICAgICBzZWN1cml0eUdyb3VwczogW3NlY3VyaXR5R3JvdXBdLFxuICAgICAgZGVmYXVsdFBvcnQsXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gd2VsbEtub3duUHJvdG9jb2wocG9ydDogbnVtYmVyKTogTG9hZEJhbGFuY2luZ1Byb3RvY29sIHtcbiAgY29uc3QgcHJvdG8gPSB0cnlXZWxsS25vd25Qcm90b2NvbChwb3J0KTtcbiAgaWYgKCFwcm90bykge1xuICAgIHRocm93IG5ldyBFcnJvcihgUGxlYXNlIHN1cHBseSBwcm90b2NvbCB0byBnbyB3aXRoIHBvcnQgJHtwb3J0fWApO1xuICB9XG4gIHJldHVybiBwcm90bztcbn1cblxuZnVuY3Rpb24gdHJ5V2VsbEtub3duUHJvdG9jb2wocG9ydDogbnVtYmVyKTogTG9hZEJhbGFuY2luZ1Byb3RvY29sIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHBvcnQgPT09IDgwKSB7XG4gICAgcmV0dXJuIExvYWRCYWxhbmNpbmdQcm90b2NvbC5IVFRQO1xuICB9XG4gIGlmIChwb3J0ID09PSA0NDMpIHtcbiAgICByZXR1cm4gTG9hZEJhbGFuY2luZ1Byb3RvY29sLkhUVFBTO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzSHR0cFByb3RvY29sKHByb3RvOiBMb2FkQmFsYW5jaW5nUHJvdG9jb2wpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBwcm90byA9PT0gTG9hZEJhbGFuY2luZ1Byb3RvY29sLkhUVFBTIHx8XG4gICAgcHJvdG8gPT09IExvYWRCYWxhbmNpbmdQcm90b2NvbC5IVFRQXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlmVW5kZWZpbmVkPFQ+KHg6IFQgfCB1bmRlZmluZWQsIGRlZjogVCk6IFQge1xuICByZXR1cm4geCAhPSBudWxsID8geCA6IGRlZjtcbn1cblxuZnVuY3Rpb24gaWZVbmRlZmluZWRMYXp5PFQ+KHg6IFQgfCB1bmRlZmluZWQsIGRlZjogKCkgPT4gVCk6IFQge1xuICByZXR1cm4geCAhPSBudWxsID8geCA6IGRlZigpO1xufVxuXG4vKipcbiAqIFR1cm4gaGVhbHRoIGNoZWNrIHBhcmFtZXRlcnMgaW50byBhIHBhcmFtZXRlciBibG9iIGZvciB0aGUgTEJcbiAqL1xuZnVuY3Rpb24gaGVhbHRoQ2hlY2tUb0pTT04oaGVhbHRoQ2hlY2s6IEVsYkhlYWx0aENoZWNrKTogdGZFbGIuRWxiSGVhbHRoQ2hlY2sge1xuICBjb25zdCBwcm90b2NvbCA9IGlmVW5kZWZpbmVkKFxuICAgIGhlYWx0aENoZWNrLnByb3RvY29sLFxuICAgIGlmVW5kZWZpbmVkKFxuICAgICAgdHJ5V2VsbEtub3duUHJvdG9jb2woaGVhbHRoQ2hlY2sucG9ydCksXG4gICAgICBMb2FkQmFsYW5jaW5nUHJvdG9jb2wuVENQLFxuICAgICksXG4gICk7XG5cbiAgY29uc3QgcGF0aCA9XG4gICAgcHJvdG9jb2wgPT09IExvYWRCYWxhbmNpbmdQcm90b2NvbC5IVFRQIHx8XG4gICAgcHJvdG9jb2wgPT09IExvYWRCYWxhbmNpbmdQcm90b2NvbC5IVFRQU1xuICAgICAgPyBpZlVuZGVmaW5lZChoZWFsdGhDaGVjay5wYXRoLCBcIi9cIilcbiAgICAgIDogXCJcIjtcblxuICBjb25zdCB0YXJnZXQgPSBgJHtwcm90b2NvbC50b1VwcGVyQ2FzZSgpfToke2hlYWx0aENoZWNrLnBvcnR9JHtwYXRofWA7XG5cbiAgcmV0dXJuIHtcbiAgICBoZWFsdGh5VGhyZXNob2xkOiBpZlVuZGVmaW5lZChoZWFsdGhDaGVjay5oZWFsdGh5VGhyZXNob2xkLCAyKSxcbiAgICBpbnRlcnZhbDogKGhlYWx0aENoZWNrLmludGVydmFsIHx8IER1cmF0aW9uLnNlY29uZHMoMzApKS50b1NlY29uZHMoKSxcbiAgICB0YXJnZXQsXG4gICAgdGltZW91dDogKGhlYWx0aENoZWNrLnRpbWVvdXQgfHwgRHVyYXRpb24uc2Vjb25kcyg1KSkudG9TZWNvbmRzKCksXG4gICAgdW5oZWFsdGh5VGhyZXNob2xkOiBpZlVuZGVmaW5lZChoZWFsdGhDaGVjay51bmhlYWx0aHlUaHJlc2hvbGQsIDUpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBsb2FkQmFsYW5jZXJTdWJuZXRzKHByb3BzOiBMb2FkQmFsYW5jZXJQcm9wcyk6IFNlbGVjdGVkU3VibmV0cyB7XG4gIGlmIChwcm9wcy5zdWJuZXRTZWxlY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBwcm9wcy52cGMuc2VsZWN0U3VibmV0cyhwcm9wcy5zdWJuZXRTZWxlY3Rpb24pO1xuICB9IGVsc2UgaWYgKHByb3BzLmludGVybmV0RmFjaW5nKSB7XG4gICAgcmV0dXJuIHByb3BzLnZwYy5zZWxlY3RTdWJuZXRzKHtcbiAgICAgIHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGUuUFVCTElDLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwcm9wcy52cGMuc2VsZWN0U3VibmV0cyh7XG4gICAgICBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1MsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|