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,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b, _c;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.SubnetNetworkAclAssociation = exports.NetworkAclEntry = exports.TrafficDirection = exports.Action = exports.NetworkAcl = 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-ec2/lib/network-acl.ts
|
|
7
|
+
const provider_aws_1 = require("@cdktf/provider-aws");
|
|
8
|
+
const aws_construct_1 = require("../aws-construct");
|
|
9
|
+
// TODO: Use TagManager and tag-aspect instead
|
|
10
|
+
const aws_tags_1 = require("../aws-tags");
|
|
11
|
+
// import { Tags } from "../tag-aspect";
|
|
12
|
+
/**
|
|
13
|
+
* Name tag constant
|
|
14
|
+
*/
|
|
15
|
+
const NAME_TAG = "Name";
|
|
16
|
+
/**
|
|
17
|
+
* A NetworkAclBase that is not created in this template
|
|
18
|
+
*
|
|
19
|
+
*
|
|
20
|
+
*/
|
|
21
|
+
class NetworkAclBase extends aws_construct_1.AwsConstructBase {
|
|
22
|
+
get networkAclOutputs() {
|
|
23
|
+
return {
|
|
24
|
+
networkAclId: this.networkAclId,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
get outputs() {
|
|
28
|
+
return this.networkAclOutputs;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Add a new entry to the ACL
|
|
32
|
+
*/
|
|
33
|
+
addEntry(id, options) {
|
|
34
|
+
return new NetworkAclEntry(this, id, {
|
|
35
|
+
networkAcl: this,
|
|
36
|
+
...options,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Define a new custom network ACL
|
|
42
|
+
*
|
|
43
|
+
* By default, will deny all inbound and outbound traffic unless entries are
|
|
44
|
+
* added explicitly allowing it.
|
|
45
|
+
*
|
|
46
|
+
*
|
|
47
|
+
*/
|
|
48
|
+
class NetworkAcl extends NetworkAclBase {
|
|
49
|
+
/**
|
|
50
|
+
* Import an existing NetworkAcl into this app.
|
|
51
|
+
*/
|
|
52
|
+
static fromNetworkAclId(scope, id, networkAclId) {
|
|
53
|
+
class Import extends NetworkAclBase {
|
|
54
|
+
constructor() {
|
|
55
|
+
super(...arguments);
|
|
56
|
+
this.networkAclId = networkAclId;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return new Import(scope, id);
|
|
60
|
+
}
|
|
61
|
+
constructor(scope, id, props) {
|
|
62
|
+
super(scope, id);
|
|
63
|
+
this.vpc = props.vpc;
|
|
64
|
+
aws_tags_1.Tags.of(this).add(NAME_TAG, props.networkAclName || this.node.path);
|
|
65
|
+
this.networkAcl = new provider_aws_1.networkAcl.NetworkAcl(this, "Resource", {
|
|
66
|
+
vpcId: props.vpc.vpcId,
|
|
67
|
+
});
|
|
68
|
+
this.networkAclId = this.networkAcl.id;
|
|
69
|
+
this.networkAclVpcId = this.networkAcl.vpcId;
|
|
70
|
+
if (props.subnetSelection !== undefined) {
|
|
71
|
+
this.associateWithSubnet("DefaultAssociation", props.subnetSelection);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Associate the ACL with a given set of subnets
|
|
76
|
+
*/
|
|
77
|
+
associateWithSubnet(id, selection) {
|
|
78
|
+
const subnets = this.vpc.selectSubnets(selection);
|
|
79
|
+
for (const subnet of subnets.subnets) {
|
|
80
|
+
subnet.associateNetworkAcl(id, this);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.NetworkAcl = NetworkAcl;
|
|
85
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
86
|
+
NetworkAcl[_a] = { fqn: "terraconstructs.aws.compute.NetworkAcl", version: "0.0.12" };
|
|
87
|
+
/**
|
|
88
|
+
* What action to apply to traffic matching the ACL
|
|
89
|
+
*
|
|
90
|
+
*
|
|
91
|
+
*/
|
|
92
|
+
var Action;
|
|
93
|
+
(function (Action) {
|
|
94
|
+
/**
|
|
95
|
+
* Allow the traffic
|
|
96
|
+
*/
|
|
97
|
+
Action["ALLOW"] = "allow";
|
|
98
|
+
/**
|
|
99
|
+
* Deny the traffic
|
|
100
|
+
*/
|
|
101
|
+
Action["DENY"] = "deny";
|
|
102
|
+
})(Action || (exports.Action = Action = {}));
|
|
103
|
+
/**
|
|
104
|
+
* Base class for NetworkAclEntries
|
|
105
|
+
*
|
|
106
|
+
*
|
|
107
|
+
*/
|
|
108
|
+
class NetworkAclEntryBase extends aws_construct_1.AwsConstructBase {
|
|
109
|
+
get networkAclEntryOutputs() {
|
|
110
|
+
return {
|
|
111
|
+
networkAclId: this.networkAcl.networkAclId,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
get outputs() {
|
|
115
|
+
return this.networkAclEntryOutputs;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Direction of traffic the AclEntry applies to
|
|
120
|
+
*
|
|
121
|
+
*
|
|
122
|
+
*/
|
|
123
|
+
var TrafficDirection;
|
|
124
|
+
(function (TrafficDirection) {
|
|
125
|
+
/**
|
|
126
|
+
* Traffic leaving the subnet
|
|
127
|
+
*/
|
|
128
|
+
TrafficDirection[TrafficDirection["EGRESS"] = 0] = "EGRESS";
|
|
129
|
+
/**
|
|
130
|
+
* Traffic entering the subnet
|
|
131
|
+
*/
|
|
132
|
+
TrafficDirection[TrafficDirection["INGRESS"] = 1] = "INGRESS";
|
|
133
|
+
})(TrafficDirection || (exports.TrafficDirection = TrafficDirection = {}));
|
|
134
|
+
/**
|
|
135
|
+
* Define an entry in a Network ACL table
|
|
136
|
+
*
|
|
137
|
+
*
|
|
138
|
+
*/
|
|
139
|
+
class NetworkAclEntry extends NetworkAclEntryBase {
|
|
140
|
+
constructor(scope, id, props) {
|
|
141
|
+
super(scope, id, props);
|
|
142
|
+
// const networkAclEntryName =
|
|
143
|
+
// props.networkAclEntryName ||
|
|
144
|
+
// this.stack.uniqueResourceName(this, {
|
|
145
|
+
// prefix: this.gridUUID,
|
|
146
|
+
// });
|
|
147
|
+
this.networkAcl = props.networkAcl;
|
|
148
|
+
this.resource = new provider_aws_1.networkAclRule.NetworkAclRule(this, "Resource", {
|
|
149
|
+
networkAclId: this.networkAcl.networkAclId,
|
|
150
|
+
ruleNumber: props.ruleNumber,
|
|
151
|
+
ruleAction: props.ruleAction ?? Action.ALLOW,
|
|
152
|
+
egress: props.direction !== undefined
|
|
153
|
+
? props.direction === TrafficDirection.EGRESS
|
|
154
|
+
: undefined,
|
|
155
|
+
...props.traffic.toTfTrafficConfig(),
|
|
156
|
+
...props.cidr.toCidrConfig(),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
exports.NetworkAclEntry = NetworkAclEntry;
|
|
161
|
+
_b = JSII_RTTI_SYMBOL_1;
|
|
162
|
+
NetworkAclEntry[_b] = { fqn: "terraconstructs.aws.compute.NetworkAclEntry", version: "0.0.12" };
|
|
163
|
+
/**
|
|
164
|
+
* Associate a network ACL with a subnet
|
|
165
|
+
*
|
|
166
|
+
*
|
|
167
|
+
*/
|
|
168
|
+
class SubnetNetworkAclAssociationBase extends aws_construct_1.AwsConstructBase {
|
|
169
|
+
get subnetNetworkAclAssociationOutputs() {
|
|
170
|
+
return {
|
|
171
|
+
subnetNetworkAclAssociationAssociationId: this.subnetNetworkAclAssociationAssociationId,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
get outputs() {
|
|
175
|
+
return this.subnetNetworkAclAssociationOutputs;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
class SubnetNetworkAclAssociation extends SubnetNetworkAclAssociationBase {
|
|
179
|
+
static fromSubnetNetworkAclAssociationAssociationId(scope, id, subnetNetworkAclAssociationAssociationId) {
|
|
180
|
+
class Import extends SubnetNetworkAclAssociationBase {
|
|
181
|
+
constructor() {
|
|
182
|
+
super(...arguments);
|
|
183
|
+
this.subnetNetworkAclAssociationAssociationId = subnetNetworkAclAssociationAssociationId;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return new Import(scope, id);
|
|
187
|
+
}
|
|
188
|
+
constructor(scope, id, props) {
|
|
189
|
+
super(scope, id, props);
|
|
190
|
+
// const subnetNetworkAclAssociationName =
|
|
191
|
+
// props.subnetNetworkAclAssociationName ||
|
|
192
|
+
// this.stack.uniqueResourceName(this, {
|
|
193
|
+
// prefix: this.gridUUID,
|
|
194
|
+
// });
|
|
195
|
+
this.association = new provider_aws_1.networkAclAssociation.NetworkAclAssociation(this, "Resource", {
|
|
196
|
+
networkAclId: props.networkAcl.networkAclId,
|
|
197
|
+
subnetId: props.subnet.subnetId,
|
|
198
|
+
});
|
|
199
|
+
this.networkAcl = props.networkAcl;
|
|
200
|
+
this.subnet = props.subnet;
|
|
201
|
+
this.subnetNetworkAclAssociationAssociationId = this.association.id;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
exports.SubnetNetworkAclAssociation = SubnetNetworkAclAssociation;
|
|
205
|
+
_c = JSII_RTTI_SYMBOL_1;
|
|
206
|
+
SubnetNetworkAclAssociation[_c] = { fqn: "terraconstructs.aws.compute.SubnetNetworkAclAssociation", version: "0.0.12" };
|
|
207
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay1hY2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzL2NvbXB1dGUvbmV0d29yay1hY2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrRkFBK0Y7QUFFL0Ysc0RBSTZCO0FBSTdCLG9EQUkwQjtBQUMxQiw4Q0FBOEM7QUFDOUMsMENBQW1DO0FBQ25DLHdDQUF3QztBQUV4Qzs7R0FFRztBQUNILE1BQU0sUUFBUSxHQUFXLE1BQU0sQ0FBQztBQTRCaEM7Ozs7R0FJRztBQUNILE1BQWUsY0FBZSxTQUFRLGdDQUFnQjtJQUNwRCxJQUFXLGlCQUFpQjtRQUMxQixPQUFPO1lBQ0wsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1NBQ2hDLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7SUFHRDs7T0FFRztJQUNJLFFBQVEsQ0FDYixFQUFVLEVBQ1YsT0FBcUM7UUFFckMsT0FBTyxJQUFJLGVBQWUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFO1lBQ25DLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLEdBQUcsT0FBTztTQUNYLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWlDRDs7Ozs7OztHQU9HO0FBQ0gsTUFBYSxVQUFXLFNBQVEsY0FBYztJQUM1Qzs7T0FFRztJQUNJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FDNUIsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLFlBQW9CO1FBRXBCLE1BQU0sTUFBTyxTQUFRLGNBQWM7WUFBbkM7O2dCQUNrQixpQkFBWSxHQUFHLFlBQVksQ0FBQztZQUM5QyxDQUFDO1NBQUE7UUFFRCxPQUFPLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBbUJELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBc0I7UUFDOUQsS0FBSyxDQUFDLEtBQUssRUFB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UUFFRixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyx3Q0FBd0MsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztJQUN0RSxDQUFDOztBQXpESCxrRUEwREMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNzUuMS9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtZWMyL2xpYi9uZXR3b3JrLWFjbC50c1xuXG5pbXBvcnQge1xuICBuZXR3b3JrQWNsIGFzIHRmTmV0d29ya0FjbCxcbiAgbmV0d29ya0FjbFJ1bGUgYXMgdGZOZXR3b3JrQWNsUnVsZSxcbiAgbmV0d29ya0FjbEFzc29jaWF0aW9uIGFzIHRmTmV0d29ya0FjbEFzc29jaWF0aW9uLFxufSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF3c1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEFjbENpZHIsIEFjbFRyYWZmaWMgfSBmcm9tIFwiLi9uZXR3b3JrLWFjbC10eXBlc1wiO1xuaW1wb3J0IHsgSVN1Ym5ldCwgSVZwYywgU3VibmV0U2VsZWN0aW9uIH0gZnJvbSBcIi4vdnBjXCI7XG5pbXBvcnQge1xuICBJQXdzQ29uc3RydWN0LFxuICBBd3NDb25zdHJ1Y3RCYXNlLFxuICBBd3NDb25zdHJ1Y3RQcm9wcyxcbn0gZnJvbSBcIi4uL2F3cy1jb25zdHJ1Y3RcIjtcbi8vIFRPRE86IFVzZSBUYWdNYW5hZ2VyIGFuZCB0YWctYXNwZWN0IGluc3RlYWRcbmltcG9ydCB7IFRhZ3MgfSBmcm9tIFwiLi4vYXdzLXRhZ3NcIjtcbi8vIGltcG9ydCB7IFRhZ3MgfSBmcm9tIFwiLi4vdGFnLWFzcGVjdFwiO1xuXG4vKipcbiAqIE5hbWUgdGFnIGNvbnN0YW50XG4gKi9cbmNvbnN0IE5BTUVfVEFHOiBzdHJpbmcgPSBcIk5hbWVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrQWNsT3V0cHV0cyB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIE5ldHdvcmtBQ0xcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtBY2xJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgTmV0d29ya0FjbFxuICpcbiAqXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSU5ldHdvcmtBY2wgZXh0ZW5kcyBJQXdzQ29uc3RydWN0IHtcbiAgcmVhZG9ubHkgbmV0d29ya0FjbE91dHB1dHM6IE5ldHdvcmtBY2xPdXRwdXRzO1xuICAvKipcbiAgICogSUQgZm9yIHRoZSBjdXJyZW50IE5ldHdvcmsgQUNMXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtBY2xJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgZW50cnkgdG8gdGhlIEFDTFxuICAgKi9cbiAgYWRkRW50cnkoaWQ6IHN0cmluZywgb3B0aW9uczogQ29tbW9uTmV0d29ya0FjbEVudHJ5T3B0aW9ucyk6IE5ldHdvcmtBY2xFbnRyeTtcbn1cblxuLyoqXG4gKiBBIE5ldHdvcmtBY2xCYXNlIHRoYXQgaXMgbm90IGNyZWF0ZWQgaW4gdGhpcyB0ZW1wbGF0ZVxuICpcbiAqXG4gKi9cbmFic3RyYWN0IGNsYXNzIE5ldHdvcmtBY2xCYXNlIGV4dGVuZHMgQXdzQ29uc3RydWN0QmFzZSBpbXBsZW1lbnRzIElOZXR3b3JrQWNsIHtcbiAgcHVibGljIGdldCBuZXR3b3JrQWNsT3V0cHV0cygpOiBOZXR3b3JrQWNsT3V0cHV0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5ldHdvcmtBY2xJZDogdGhpcy5uZXR3b3JrQWNsSWQsXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgZ2V0IG91dHB1dHMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMubmV0d29ya0FjbE91dHB1dHM7XG4gIH1cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IG5ldHdvcmtBY2xJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgZW50cnkgdG8gdGhlIEFDTFxuICAgKi9cbiAgcHVibGljIGFkZEVudHJ5KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogQ29tbW9uTmV0d29ya0FjbEVudHJ5T3B0aW9ucyxcbiAgKTogTmV0d29ya0FjbEVudHJ5IHtcbiAgICByZXR1cm4gbmV3IE5ldHdvcmtBY2xFbnRyeSh0aGlzLCBpZCwge1xuICAgICAgbmV0d29ya0FjbDogdGhpcyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHRvIGNyZWF0ZSBOZXR3b3JrQWNsXG4gKlxuICpcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrQWNsUHJvcHMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIE5ldHdvcmtBY2wuXG4gICAqXG4gICAqIFNpbmNlIHRoZSBOZXR3b3JrQWNsIHJlc291cmNlIGRvZXNuJ3Qgc3VwcG9ydCBwcm92aWRpbmcgYSBwaHlzaWNhbCBuYW1lLCB0aGUgdmFsdWUgcHJvdmlkZWQgaGVyZSB3aWxsIGJlIHJlY29yZGVkIGluIHRoZSBgTmFtZWAgdGFnLlxuICAgKlxuICAgKiBAZGVmYXVsdCBDREsgZ2VuZXJhdGVkIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtBY2xOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVlBDIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgTmV0d29ya0FDTC5cbiAgICovXG4gIHJlYWRvbmx5IHZwYzogSVZwYztcblxuICAvKipcbiAgICogU3VibmV0cyBpbiB0aGUgZ2l2ZW4gVlBDIHRvIGFzc29jaWF0ZSB0aGUgQUNMIHdpdGhcbiAgICpcbiAgICogTW9yZSBzdWJuZXRzIGNhbiBhbHdheXMgYmUgYWRkZWQgbGF0ZXIgYnkgY2FsbGluZ1xuICAgKiBgYXNzb2NpYXRlV2l0aFN1Ym5ldHMoKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gc3VibmV0cyBhc3NvY2lhdGVkXG4gICAqL1xuICByZWFkb25seSBzdWJuZXRTZWxlY3Rpb24/OiBTdWJuZXRTZWxlY3Rpb247XG59XG5cbi8qKlxuICogRGVmaW5lIGEgbmV3IGN1c3RvbSBuZXR3b3JrIEFDTFxuICpcbiAqIEJ5IGRlZmF1bHQsIHdpbGwgZGVueSBhbGwgaW5ib3VuZCBhbmQgb3V0Ym91bmQgdHJhZmZpYyB1bmxlc3MgZW50cmllcyBhcmVcbiAqIGFkZGVkIGV4cGxpY2l0bHkgYWxsb3dpbmcgaXQuXG4gKlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIE5ldHdvcmtBY2wgZXh0ZW5kcyBOZXR3b3JrQWNsQmFzZSB7XG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZXhpc3RpbmcgTmV0d29ya0FjbCBpbnRvIHRoaXMgYXBwLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tTmV0d29ya0FjbElkKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuZXR3b3JrQWNsSWQ6IHN0cmluZyxcbiAgKTogSU5ldHdvcmtBY2wge1xuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIE5ldHdvcmtBY2xCYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBuZXR3b3JrQWNsSWQgPSBuZXR3b3JrQWNsSWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIE5ldHdvcmtBQ0xcbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5ldHdvcmtBY2xJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVlBDIElEIGZvciB0aGlzIE5ldHdvcmtBQ0xcbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5ldHdvcmtBY2xWcGNJZDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbmV0d29ya0FjbDogdGZOZXR3b3JrQWNsLk5ldHdvcmtBY2w7XG4gIHByaXZhdGUgcmVhZG9ubHkgdnBjOiBJVnBjO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOZXR3b3JrQWNsUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy52cGMgPSBwcm9wcy52cGM7XG5cbiAgICBUYWdzLm9mKHRoaXMpLmFkZChOQU1FX1RBRywgcHJvcHMubmV0d29ya0FjbE5hbWUgfHwgdGhpcy5ub2RlLnBhdGgpO1xuXG4gICAgdGhpcy5uZXR3b3JrQWNsID0gbmV3IHRmTmV0d29ya0FjbC5OZXR3b3JrQWNsKHRoaXMsIFwiUmVzb3VyY2VcIiwge1xuICAgICAgdnBjSWQ6IHByb3BzLnZwYy52cGNJZCxcbiAgICB9KTtcblxuICAgIHRoaXMubmV0d29ya0FjbElkID0gdGhpcy5uZXR3b3JrQWNsLmlkO1xuICAgIHRoaXMubmV0d29ya0FjbFZwY0lkID0gdGhpcy5uZXR3b3JrQWNsLnZwY0lkO1xuXG4gICAgaWYgKHByb3BzLnN1Ym5ldFNlbGVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmFzc29jaWF0ZVdpdGhTdWJuZXQoXCJEZWZhdWx0QXNzb2NpYXRpb25cIiwgcHJvcHMuc3VibmV0U2VsZWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXNzb2NpYXRlIHRoZSBBQ0wgd2l0aCBhIGdpdmVuIHNldCBvZiBzdWJuZXRzXG4gICAqL1xuICBwdWJsaWMgYXNzb2NpYXRlV2l0aFN1Ym5ldChpZDogc3RyaW5nLCBzZWxlY3Rpb246IFN1Ym5ldFNlbGVjdGlvbikge1xuICAgIGNvbnN0IHN1Ym5ldHMgPSB0aGlzLnZwYy5zZWxlY3RTdWJuZXRzKHNlbGVjdGlvbik7XG4gICAgZm9yIChjb25zdCBzdWJuZXQgb2Ygc3VibmV0cy5zdWJuZXRzKSB7XG4gICAgICBzdWJuZXQuYXNzb2NpYXRlTmV0d29ya0FjbChpZCwgdGhpcyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogV2hhdCBhY3Rpb24gdG8gYXBwbHkgdG8gdHJhZmZpYyBtYXRjaGluZyB0aGUgQUNMXG4gKlxuICpcbiAqL1xuZXhwb3J0IGVudW0gQWN0aW9uIHtcbiAgLyoqXG4gICAqIEFsbG93IHRoZSB0cmFmZmljXG4gICAqL1xuICBBTExPVyA9IFwiYWxsb3dcIixcblxuICAvKipcbiAgICogRGVueSB0aGUgdHJhZmZpY1xuICAgKi9cbiAgREVOWSA9IFwiZGVueVwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtBY2xFbnRyeU91dHB1dHMge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBOZXR3b3JrQUNMXG4gICAqL1xuICByZWFkb25seSBuZXR3b3JrQWNsSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIE5ldHdvcmtBY2xFbnRyeVxuICpcbiAqXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSU5ldHdvcmtBY2xFbnRyeSBleHRlbmRzIElBd3NDb25zdHJ1Y3Qge1xuICByZWFkb25seSBuZXR3b3JrQWNsRW50cnlPdXRwdXRzOiBOZXR3b3JrQWNsRW50cnlPdXRwdXRzO1xuICAvKipcbiAgICogVGhlIG5ldHdvcmsgQUNMLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya0FjbDogSU5ldHdvcmtBY2w7XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgTmV0d29ya0FjbEVudHJpZXNcbiAqXG4gKlxuICovXG5hYnN0cmFjdCBjbGFzcyBOZXR3b3JrQWNsRW50cnlCYXNlXG4gIGV4dGVuZHMgQXdzQ29uc3RydWN0QmFzZVxuICBpbXBsZW1lbnRzIElOZXR3b3JrQWNsRW50cnlcbntcbiAgcHVibGljIGdldCBuZXR3b3JrQWNsRW50cnlPdXRwdXRzKCk6IE5ldHdvcmtBY2xFbnRyeU91dHB1dHMge1xuICAgIHJldHVybiB7XG4gICAgICBuZXR3b3JrQWNsSWQ6IHRoaXMubmV0d29ya0FjbC5uZXR3b3JrQWNsSWQsXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgZ2V0IG91dHB1dHMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMubmV0d29ya0FjbEVudHJ5T3V0cHV0cztcbiAgfVxuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgbmV0d29ya0FjbDogSU5ldHdvcmtBY2w7XG59XG5cbi8qKlxuICogRGlyZWN0aW9uIG9mIHRyYWZmaWMgdGhlIEFjbEVudHJ5IGFwcGxpZXMgdG9cbiAqXG4gKlxuICovXG5leHBvcnQgZW51bSBUcmFmZmljRGlyZWN0aW9uIHtcbiAgLyoqXG4gICAqIFRyYWZmaWMgbGVhdmluZyB0aGUgc3VibmV0XG4gICAqL1xuICBFR1JFU1MsXG5cbiAgLyoqXG4gICAqIFRyYWZmaWMgZW50ZXJpbmcgdGhlIHN1Ym5ldFxuICAgKi9cbiAgSU5HUkVTUyxcbn1cblxuLyoqXG4gKiBCYXNpYyBOZXR3b3JrQUNMIGVudHJ5IHByb3BzXG4gKlxuICpcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tb25OZXR3b3JrQWNsRW50cnlPcHRpb25zIHtcbiAgLy8gLyoqXG4gIC8vICAqIFRoZSBuYW1lIG9mIHRoZSBOZXR3b3JrQWNsRW50cnkuXG4gIC8vICAqXG4gIC8vICAqIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byB1c2UgYW4gZXhwbGljaXQgZ3JvdXAgbmFtZS5cbiAgLy8gICpcbiAgLy8gICogQGRlZmF1bHQgSWYgeW91IGRvbid0IHNwZWNpZnkgYSBOZXR3b3JrQWNsTmFtZSwgQVdTIENsb3VkRm9ybWF0aW9uIGdlbmVyYXRlcyBhXG4gIC8vICAqIHVuaXF1ZSBwaHlzaWNhbCBJRCBhbmQgdXNlcyB0aGF0IElEIGZvciB0aGUgZ3JvdXAgbmFtZS5cbiAgLy8gICovXG4gIC8vIHJlYWRvbmx5IG5ldHdvcmtBY2xFbnRyeU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBDSURSIHJhbmdlIHRvIGFsbG93IG9yIGRlbnkuXG4gICAqL1xuICByZWFkb25seSBjaWRyOiBBY2xDaWRyO1xuXG4gIC8qKlxuICAgKiBXaGF0IGtpbmQgb2YgdHJhZmZpYyB0aGlzIEFDTCBydWxlIGFwcGxpZXMgdG9cbiAgICovXG4gIHJlYWRvbmx5IHRyYWZmaWM6IEFjbFRyYWZmaWM7XG5cbiAgLyoqXG4gICAqIFRyYWZmaWMgZGlyZWN0aW9uLCB3aXRoIHJlc3BlY3QgdG8gdGhlIHN1Ym5ldCwgdGhpcyBydWxlIGFwcGxpZXMgdG9cbiAgICpcbiAgICogQGRlZmF1bHQgVHJhZmZpY0RpcmVjdGlvbi5JTkdSRVNTXG4gICAqL1xuICByZWFkb25seSBkaXJlY3Rpb24/OiBUcmFmZmljRGlyZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IG9yIGRlbnkgdHJhZmZpYyB0aGF0IG1hdGNoZXMgdGhlIHJ1bGU7IHZhbGlkIHZhbHVlcyBhcmUgXCJhbGxvd1wiIG9yIFwiZGVueVwiLlxuICAgKlxuICAgKiBBbnkgdHJhZmZpYyB0aGF0IGlzIG5vdCBleHBsaWNpdGx5IGFsbG93ZWQgaXMgYXV0b21hdGljYWxseSBkZW5pZWQgaW4gYSBjdXN0b21cbiAgICogQUNMLCBhbGwgdHJhZmZpYyBpcyBhdXRvbWF0aWNhbGx5IGFsbG93ZWQgaW4gYSBkZWZhdWx0IEFDTC5cbiAgICpcbiAgICogQGRlZmF1bHQgQUxMT1dcbiAgICovXG4gIHJlYWRvbmx5IHJ1bGVBY3Rpb24/OiBBY3Rpb247XG5cbiAgLyoqXG4gICAqIFJ1bGUgbnVtYmVyIHRvIGFzc2lnbiB0byB0aGUgZW50cnksIHN1Y2ggYXMgMTAwLiBBQ0wgZW50cmllcyBhcmUgcHJvY2Vzc2VkIGluIGFzY2VuZGluZyBvcmRlciBieSBydWxlIG51bWJlci5cbiAgICogRW50cmllcyBjYW4ndCB1c2UgdGhlIHNhbWUgcnVsZSBudW1iZXIgdW5sZXNzIG9uZSBpcyBhbiBlZ3Jlc3MgcnVsZSBhbmQgdGhlIG90aGVyIGlzIGFuIGluZ3Jlc3MgcnVsZS5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bGVOdW1iZXI6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHRvIGNyZWF0ZSBOZXR3b3JrQWNsRW50cnlcbiAqXG4gKlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtBY2xFbnRyeVByb3BzXG4gIGV4dGVuZHMgQ29tbW9uTmV0d29ya0FjbEVudHJ5T3B0aW9ucyxcbiAgICBBd3NDb25zdHJ1Y3RQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmV0d29yayBBQ0wgdGhpcyBlbnRyeSBhcHBsaWVzIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya0FjbDogSU5ldHdvcmtBY2w7XG59XG5cbi8qKlxuICogRGVmaW5lIGFuIGVudHJ5IGluIGEgTmV0d29yayBBQ0wgdGFibGVcbiAqXG4gKlxuICovXG5leHBvcnQgY2xhc3MgTmV0d29ya0FjbEVudHJ5IGV4dGVuZHMgTmV0d29ya0FjbEVudHJ5QmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBuZXR3b3JrQWNsOiBJTmV0d29ya0FjbDtcbiAgcHVibGljIHJlc291cmNlOiB0Zk5ldHdvcmtBY2xSdWxlLk5ldHdvcmtBY2xSdWxlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOZXR3b3JrQWNsRW50cnlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIC8vIGNvbnN0IG5ldHdvcmtBY2xFbnRyeU5hbWUgPVxuICAgIC8vICAgcHJvcHMubmV0d29ya0FjbEVudHJ5TmFtZSB8fFxuICAgIC8vICAgdGhpcy5zdGFjay51bmlxdWVSZXNvdXJjZU5hbWUodGhpcywge1xuICAgIC8vICAgICBwcmVmaXg6IHRoaXMuZ3JpZFVVSUQsXG4gICAgLy8gICB9KTtcblxuICAgIHRoaXMubmV0d29ya0FjbCA9IHByb3BzLm5ldHdvcmtBY2w7XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IHRmTmV0d29ya0FjbFJ1bGUuTmV0d29ya0FjbFJ1bGUodGhpcywgXCJSZXNvdXJjZVwiLCB7XG4gICAgICBuZXR3b3JrQWNsSWQ6IHRoaXMubmV0d29ya0FjbC5uZXR3b3JrQWNsSWQsXG4gICAgICBydWxlTnVtYmVyOiBwcm9wcy5ydWxlTnVtYmVyLFxuICAgICAgcnVsZUFjdGlvbjogcHJvcHMucnVsZUFjdGlvbiA/PyBBY3Rpb24uQUxMT1csXG4gICAgICBlZ3Jlc3M6XG4gICAgICAgIHByb3BzLmRpcmVjdGlvbiAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBwcm9wcy5kaXJlY3Rpb24gPT09IFRyYWZmaWNEaXJlY3Rpb24uRUdSRVNTXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAuLi5wcm9wcy50cmFmZmljLnRvVGZUcmFmZmljQ29uZmlnKCksXG4gICAgICAuLi5wcm9wcy5jaWRyLnRvQ2lkckNvbmZpZygpLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uT3V0cHV0cyB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFN1Ym5ldE5ldHdvcmtBY2xBc3NvY2lhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uQXNzb2NpYXRpb25JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgU3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uXG4gKlxuICpcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uIGV4dGVuZHMgSUF3c0NvbnN0cnVjdCB7XG4gIHJlYWRvbmx5IHN1Ym5ldE5ldHdvcmtBY2xBc3NvY2lhdGlvbk91dHB1dHM6IFN1Ym5ldE5ldHdvcmtBY2xBc3NvY2lhdGlvbk91dHB1dHM7XG4gIC8qKlxuICAgKiBJRCBmb3IgdGhlIGN1cnJlbnQgU3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldE5ldHdvcmtBY2xBc3NvY2lhdGlvbkFzc29jaWF0aW9uSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHRvIGNyZWF0ZSBhIFN1Ym5ldE5ldHdvcmtBY2xBc3NvY2lhdGlvblxuICpcbiAqXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uUHJvcHMgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RQcm9wcyB7XG4gIC8vIC8qKlxuICAvLyAgKiBUaGUgbmFtZSBvZiB0aGUgU3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uLlxuICAvLyAgKlxuICAvLyAgKiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gdXNlIGFuIGV4cGxpY2l0IG5hbWUuXG4gIC8vICAqXG4gIC8vICAqIEBkZWZhdWx0IElmIHlvdSBkb24ndCBzcGVjaWZ5IGEgU3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uTmFtZSwgQVdTIENsb3VkRm9ybWF0aW9uIGdlbmVyYXRlcyBhXG4gIC8vICAqIHVuaXF1ZSBwaHlzaWNhbCBJRCBhbmQgdXNlcyB0aGF0IElEIGZvciB0aGUgZ3JvdXAgbmFtZS5cbiAgLy8gICovXG4gIC8vIHJlYWRvbmx5IHN1Ym5ldE5ldHdvcmtBY2xBc3NvY2lhdGlvbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBOZXR3b3JrIEFDTCB0aGlzIGFzc29jaWF0aW9uIGlzIGRlZmluZWQgZm9yXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtBY2w6IElOZXR3b3JrQWNsO1xuXG4gIC8qKlxuICAgKiBJRCBvZiB0aGUgU3VibmV0XG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldDogSVN1Ym5ldDtcbn1cblxuLyoqXG4gKiBBc3NvY2lhdGUgYSBuZXR3b3JrIEFDTCB3aXRoIGEgc3VibmV0XG4gKlxuICpcbiAqL1xuYWJzdHJhY3QgY2xhc3MgU3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uQmFzZVxuICBleHRlbmRzIEF3c0NvbnN0cnVjdEJhc2VcbiAgaW1wbGVtZW50cyBJU3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uXG57XG4gIHB1YmxpYyBnZXQgc3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uT3V0cHV0cygpOiBTdWJuZXROZXR3b3JrQWNsQXNzb2NpYXRpb25PdXRwdXRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uQXNzb2NpYXRpb25JZDpcbiAgICAgICAgdGhpcy5zdWJuZXROZXR3b3JrQWNsQXNzb2NpYXRpb25Bc3NvY2lhdGlvbklkLFxuICAgIH07XG4gIH1cbiAgcHVibGljIGdldCBvdXRwdXRzKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB0aGlzLnN1Ym5ldE5ldHdvcmtBY2xBc3NvY2lhdGlvbk91dHB1dHM7XG4gIH1cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHN1Ym5ldE5ldHdvcmtBY2xBc3NvY2lhdGlvbkFzc29jaWF0aW9uSWQ6IHN0cmluZztcbn1cbmV4cG9ydCBjbGFzcyBTdWJuZXROZXR3b3JrQWNsQXNzb2NpYXRpb24gZXh0ZW5kcyBTdWJuZXROZXR3b3JrQWNsQXNzb2NpYXRpb25CYXNlIHtcbiAgcHVibGljIHN0YXRpYyBmcm9tU3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uQXNzb2NpYXRpb25JZChcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uQXNzb2NpYXRpb25JZDogc3RyaW5nLFxuICApOiBJU3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uIHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBTdWJuZXROZXR3b3JrQWNsQXNzb2NpYXRpb25CYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBzdWJuZXROZXR3b3JrQWNsQXNzb2NpYXRpb25Bc3NvY2lhdGlvbklkID1cbiAgICAgICAgc3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uQXNzb2NpYXRpb25JZDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQpO1xuICB9XG4gIC8qKlxuICAgKiBJRCBmb3IgdGhlIGN1cnJlbnQgU3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdWJuZXROZXR3b3JrQWNsQXNzb2NpYXRpb25Bc3NvY2lhdGlvbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElEIGZvciB0aGUgY3VycmVudCBOZXR3b3JrIEFDTFxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmV0d29ya0FjbDogSU5ldHdvcmtBY2w7XG5cbiAgLyoqXG4gICAqIElEIG9mIHRoZSBTdWJuZXRcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN1Ym5ldDogSVN1Ym5ldDtcblxuICBwcml2YXRlIGFzc29jaWF0aW9uOiB0Zk5ldHdvcmtBY2xBc3NvY2lhdGlvbi5OZXR3b3JrQWNsQXNzb2NpYXRpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBTdWJuZXROZXR3b3JrQWNsQXNzb2NpYXRpb25Qcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgLy8gY29uc3Qgc3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uTmFtZSA9XG4gICAgLy8gICBwcm9wcy5zdWJuZXROZXR3b3JrQWNsQXNzb2NpYXRpb25OYW1lIHx8XG4gICAgLy8gICB0aGlzLnN0YWNrLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7XG4gICAgLy8gICAgIHByZWZpeDogdGhpcy5ncmlkVVVJRCxcbiAgICAvLyAgIH0pO1xuXG4gICAgdGhpcy5hc3NvY2lhdGlvbiA9IG5ldyB0Zk5ldHdvcmtBY2xBc3NvY2lhdGlvbi5OZXR3b3JrQWNsQXNzb2NpYXRpb24oXG4gICAgICB0aGlzLFxuICAgICAgXCJSZXNvdXJjZVwiLFxuICAgICAge1xuICAgICAgICBuZXR3b3JrQWNsSWQ6IHByb3BzLm5ldHdvcmtBY2wubmV0d29ya0FjbElkLFxuICAgICAgICBzdWJuZXRJZDogcHJvcHMuc3VibmV0LnN1Ym5ldElkLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5uZXR3b3JrQWNsID0gcHJvcHMubmV0d29ya0FjbDtcbiAgICB0aGlzLnN1Ym5ldCA9IHByb3BzLnN1Ym5ldDtcbiAgICB0aGlzLnN1Ym5ldE5ldHdvcmtBY2xBc3NvY2lhdGlvbkFzc29jaWF0aW9uSWQgPSB0aGlzLmFzc29jaWF0aW9uLmlkO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InvalidCidrRangeError is thrown when attempting to perform operations on a CIDR
|
|
3
|
+
* range that is either not valid, or outside of the VPC size limits.
|
|
4
|
+
*/
|
|
5
|
+
export declare class InvalidCidrRangeError extends Error {
|
|
6
|
+
constructor(cidr: string);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* NetworkUtils contains helpers to work with network constructs (subnets/ranges)
|
|
10
|
+
*/
|
|
11
|
+
export declare class NetworkUtils {
|
|
12
|
+
/**
|
|
13
|
+
* Validates an IPv4 string
|
|
14
|
+
*
|
|
15
|
+
* returns true of the string contains 4 numbers between 0-255 delimited by
|
|
16
|
+
* a `.` character
|
|
17
|
+
*/
|
|
18
|
+
static validIp(ipAddress: string): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Converts a string IPv4 to a number
|
|
21
|
+
*
|
|
22
|
+
* takes an IP Address (e.g. 174.66.173.168) and converts to a number
|
|
23
|
+
* (e.g 2923605416); currently only supports IPv4
|
|
24
|
+
*
|
|
25
|
+
* Uses the formula:
|
|
26
|
+
* (first octet * 256³) + (second octet * 256²) + (third octet * 256) +
|
|
27
|
+
* (fourth octet)
|
|
28
|
+
*
|
|
29
|
+
* @param {string} the IP address (e.g. 174.66.173.168)
|
|
30
|
+
* @returns {number} the integer value of the IP address (e.g 2923605416)
|
|
31
|
+
*/
|
|
32
|
+
static ipToNum(ipAddress: string): number;
|
|
33
|
+
/**
|
|
34
|
+
* Takes number and converts it to IPv4 address string
|
|
35
|
+
*
|
|
36
|
+
* Takes a number (e.g 2923605416) and converts it to an IPv4 address string
|
|
37
|
+
* currently only supports IPv4
|
|
38
|
+
*
|
|
39
|
+
* @param {number} the integer value of the IP address (e.g 2923605416)
|
|
40
|
+
* @returns {string} the IPv4 address (e.g. 174.66.173.168)
|
|
41
|
+
*/
|
|
42
|
+
static numToIp(ipNum: number): string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Creates a network based on a CIDR Block to build contained subnets
|
|
46
|
+
*/
|
|
47
|
+
export declare class NetworkBuilder {
|
|
48
|
+
/**
|
|
49
|
+
* The CIDR range used when creating the network
|
|
50
|
+
*/
|
|
51
|
+
readonly networkCidr: CidrBlock;
|
|
52
|
+
/**
|
|
53
|
+
* The list of CIDR blocks for subnets within this network
|
|
54
|
+
*/
|
|
55
|
+
private readonly subnetCidrs;
|
|
56
|
+
/**
|
|
57
|
+
* The next available IP address as a number
|
|
58
|
+
*/
|
|
59
|
+
private nextAvailableIp;
|
|
60
|
+
/**
|
|
61
|
+
* Create a network using the provided CIDR block
|
|
62
|
+
*
|
|
63
|
+
* No subnets are allocated in the constructor, the maxIpConsumed is set one
|
|
64
|
+
* less than the first IP in the network
|
|
65
|
+
*
|
|
66
|
+
*/
|
|
67
|
+
constructor(cidr: string);
|
|
68
|
+
/**
|
|
69
|
+
* Add a subnet to the network and update the maxIpConsumed
|
|
70
|
+
*/
|
|
71
|
+
addSubnet(mask: number): string;
|
|
72
|
+
/**
|
|
73
|
+
* Add {count} number of subnets to the network and update the maxIpConsumed
|
|
74
|
+
*/
|
|
75
|
+
addSubnets(mask: number, count?: number): string[];
|
|
76
|
+
/**
|
|
77
|
+
* return the CIDR notation strings for all subnets in the network
|
|
78
|
+
*/
|
|
79
|
+
get cidrStrings(): string[];
|
|
80
|
+
/**
|
|
81
|
+
* Calculates the largest subnet to create of the given count from the
|
|
82
|
+
* remaining IP space
|
|
83
|
+
*/
|
|
84
|
+
maskForRemainingSubnets(subnetCount: number): number;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* A block of IP address space with a given bit prefix
|
|
88
|
+
*/
|
|
89
|
+
export declare class CidrBlock {
|
|
90
|
+
/**
|
|
91
|
+
* Calculates the netmask for a given CIDR mask
|
|
92
|
+
*
|
|
93
|
+
* For example:
|
|
94
|
+
* CidrBlock.calculateNetmask(24) returns '255.255.255.0'
|
|
95
|
+
*/
|
|
96
|
+
static calculateNetmask(mask: number): string;
|
|
97
|
+
/**
|
|
98
|
+
* Calculates the number IP addresses in a CIDR Mask
|
|
99
|
+
*
|
|
100
|
+
* For example:
|
|
101
|
+
* CidrBlock.calculateNetsize(24) returns 256
|
|
102
|
+
*/
|
|
103
|
+
static calculateNetsize(mask: number): number;
|
|
104
|
+
readonly cidr: string;
|
|
105
|
+
readonly mask: number;
|
|
106
|
+
readonly networkSize: number;
|
|
107
|
+
private readonly networkAddress;
|
|
108
|
+
constructor(cidr: string);
|
|
109
|
+
constructor(ipAddress: number, mask: number);
|
|
110
|
+
maxIp(): string;
|
|
111
|
+
minIp(): string;
|
|
112
|
+
minAddress(): number;
|
|
113
|
+
maxAddress(): number;
|
|
114
|
+
nextBlock(): CidrBlock;
|
|
115
|
+
containsCidr(other: CidrBlock): boolean;
|
|
116
|
+
}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// https://github.com/aws/aws-cdk/blob/v2.175.1/packages/aws-cdk-lib/aws-ec2/lib/network-util.ts
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.CidrBlock = exports.NetworkBuilder = exports.NetworkUtils = exports.InvalidCidrRangeError = void 0;
|
|
5
|
+
// TODO: Fix duplicates from https://github.com/aws/aws-cdk/blob/v2.175.1/packages/@aws-cdk/aws-ec2-alpha/lib/util.ts
|
|
6
|
+
// classes overlap and seem identical: CidrBlock, NetworkUtils in ./util.ts
|
|
7
|
+
/**
|
|
8
|
+
* InvalidCidrRangeError is thrown when attempting to perform operations on a CIDR
|
|
9
|
+
* range that is either not valid, or outside of the VPC size limits.
|
|
10
|
+
*/
|
|
11
|
+
class InvalidCidrRangeError extends Error {
|
|
12
|
+
constructor(cidr) {
|
|
13
|
+
super(cidr +
|
|
14
|
+
" is not a valid VPC CIDR range. VPCs must be between /16 and /28 and the minimum subnet size is /28.");
|
|
15
|
+
// The following line is required for type checking of custom errors, and must be called right after super()
|
|
16
|
+
// https://stackoverflow.com/questions/31626231/custom-error-class-in-typescript
|
|
17
|
+
Object.setPrototypeOf(this, InvalidCidrRangeError.prototype);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.InvalidCidrRangeError = InvalidCidrRangeError;
|
|
21
|
+
/**
|
|
22
|
+
* NetworkUtils contains helpers to work with network constructs (subnets/ranges)
|
|
23
|
+
*/
|
|
24
|
+
class NetworkUtils {
|
|
25
|
+
/**
|
|
26
|
+
* Validates an IPv4 string
|
|
27
|
+
*
|
|
28
|
+
* returns true of the string contains 4 numbers between 0-255 delimited by
|
|
29
|
+
* a `.` character
|
|
30
|
+
*/
|
|
31
|
+
static validIp(ipAddress) {
|
|
32
|
+
const octets = ipAddress.split(".");
|
|
33
|
+
if (octets.length !== 4) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
return (octets
|
|
37
|
+
.map((octet) => parseInt(octet, 10))
|
|
38
|
+
.filter((octet) => octet >= 0 && octet <= 255).length === 4);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Converts a string IPv4 to a number
|
|
42
|
+
*
|
|
43
|
+
* takes an IP Address (e.g. 174.66.173.168) and converts to a number
|
|
44
|
+
* (e.g 2923605416); currently only supports IPv4
|
|
45
|
+
*
|
|
46
|
+
* Uses the formula:
|
|
47
|
+
* (first octet * 256³) + (second octet * 256²) + (third octet * 256) +
|
|
48
|
+
* (fourth octet)
|
|
49
|
+
*
|
|
50
|
+
* @param {string} the IP address (e.g. 174.66.173.168)
|
|
51
|
+
* @returns {number} the integer value of the IP address (e.g 2923605416)
|
|
52
|
+
*/
|
|
53
|
+
static ipToNum(ipAddress) {
|
|
54
|
+
if (!this.validIp(ipAddress)) {
|
|
55
|
+
throw new Error(`${ipAddress} is not valid`);
|
|
56
|
+
}
|
|
57
|
+
return ipAddress
|
|
58
|
+
.split(".")
|
|
59
|
+
.reduce((p, c, i) => p + parseInt(c, 10) * 256 ** (3 - i), 0);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Takes number and converts it to IPv4 address string
|
|
63
|
+
*
|
|
64
|
+
* Takes a number (e.g 2923605416) and converts it to an IPv4 address string
|
|
65
|
+
* currently only supports IPv4
|
|
66
|
+
*
|
|
67
|
+
* @param {number} the integer value of the IP address (e.g 2923605416)
|
|
68
|
+
* @returns {string} the IPv4 address (e.g. 174.66.173.168)
|
|
69
|
+
*/
|
|
70
|
+
static numToIp(ipNum) {
|
|
71
|
+
// this all because bitwise math is signed
|
|
72
|
+
let remaining = ipNum;
|
|
73
|
+
const address = new Array();
|
|
74
|
+
for (let i = 0; i < 4; i++) {
|
|
75
|
+
if (remaining !== 0) {
|
|
76
|
+
address.push(Math.floor(remaining / 256 ** (3 - i)));
|
|
77
|
+
remaining = remaining % 256 ** (3 - i);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
address.push(0);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const ipAddress = address.join(".");
|
|
84
|
+
if (!this.validIp(ipAddress)) {
|
|
85
|
+
throw new Error(`${ipAddress} is not a valid IP Address`);
|
|
86
|
+
}
|
|
87
|
+
return ipAddress;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.NetworkUtils = NetworkUtils;
|
|
91
|
+
/**
|
|
92
|
+
* Creates a network based on a CIDR Block to build contained subnets
|
|
93
|
+
*/
|
|
94
|
+
class NetworkBuilder {
|
|
95
|
+
/**
|
|
96
|
+
* Create a network using the provided CIDR block
|
|
97
|
+
*
|
|
98
|
+
* No subnets are allocated in the constructor, the maxIpConsumed is set one
|
|
99
|
+
* less than the first IP in the network
|
|
100
|
+
*
|
|
101
|
+
*/
|
|
102
|
+
constructor(cidr) {
|
|
103
|
+
/**
|
|
104
|
+
* The list of CIDR blocks for subnets within this network
|
|
105
|
+
*/
|
|
106
|
+
this.subnetCidrs = [];
|
|
107
|
+
this.networkCidr = new CidrBlock(cidr);
|
|
108
|
+
this.subnetCidrs = [];
|
|
109
|
+
this.nextAvailableIp = this.networkCidr.minAddress();
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Add a subnet to the network and update the maxIpConsumed
|
|
113
|
+
*/
|
|
114
|
+
addSubnet(mask) {
|
|
115
|
+
return this.addSubnets(mask, 1)[0];
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Add {count} number of subnets to the network and update the maxIpConsumed
|
|
119
|
+
*/
|
|
120
|
+
addSubnets(mask, count = 1) {
|
|
121
|
+
if (mask < 16 || mask > 28) {
|
|
122
|
+
throw new InvalidCidrRangeError(`x.x.x.x/${mask}`);
|
|
123
|
+
}
|
|
124
|
+
const maxIp = this.nextAvailableIp + CidrBlock.calculateNetsize(mask) * count;
|
|
125
|
+
if (this.networkCidr.maxAddress() < maxIp - 1) {
|
|
126
|
+
throw new Error(`${count} of /${mask} exceeds remaining space of ${this.networkCidr.cidr}`);
|
|
127
|
+
}
|
|
128
|
+
const subnets = [];
|
|
129
|
+
for (let i = 0; i < count; i++) {
|
|
130
|
+
const subnet = new CidrBlock(this.nextAvailableIp, mask);
|
|
131
|
+
this.nextAvailableIp = subnet.nextBlock().minAddress();
|
|
132
|
+
this.subnetCidrs.push(subnet);
|
|
133
|
+
subnets.push(subnet);
|
|
134
|
+
}
|
|
135
|
+
return subnets.map((subnet) => subnet.cidr);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* return the CIDR notation strings for all subnets in the network
|
|
139
|
+
*/
|
|
140
|
+
get cidrStrings() {
|
|
141
|
+
return this.subnetCidrs.map((subnet) => subnet.cidr);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Calculates the largest subnet to create of the given count from the
|
|
145
|
+
* remaining IP space
|
|
146
|
+
*/
|
|
147
|
+
maskForRemainingSubnets(subnetCount) {
|
|
148
|
+
const remaining = this.networkCidr.maxAddress() - this.nextAvailableIp + 1;
|
|
149
|
+
const ipsPerSubnet = Math.floor(remaining / subnetCount);
|
|
150
|
+
return 32 - Math.floor(Math.log2(ipsPerSubnet));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
exports.NetworkBuilder = NetworkBuilder;
|
|
154
|
+
/**
|
|
155
|
+
* A block of IP address space with a given bit prefix
|
|
156
|
+
*/
|
|
157
|
+
class CidrBlock {
|
|
158
|
+
/**
|
|
159
|
+
* Calculates the netmask for a given CIDR mask
|
|
160
|
+
*
|
|
161
|
+
* For example:
|
|
162
|
+
* CidrBlock.calculateNetmask(24) returns '255.255.255.0'
|
|
163
|
+
*/
|
|
164
|
+
static calculateNetmask(mask) {
|
|
165
|
+
return NetworkUtils.numToIp(2 ** 32 - 2 ** (32 - mask));
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Calculates the number IP addresses in a CIDR Mask
|
|
169
|
+
*
|
|
170
|
+
* For example:
|
|
171
|
+
* CidrBlock.calculateNetsize(24) returns 256
|
|
172
|
+
*/
|
|
173
|
+
static calculateNetsize(mask) {
|
|
174
|
+
return 2 ** (32 - mask);
|
|
175
|
+
}
|
|
176
|
+
constructor(ipAddressOrCidr, mask) {
|
|
177
|
+
if (typeof ipAddressOrCidr === "string") {
|
|
178
|
+
this.mask = parseInt(ipAddressOrCidr.split("/")[1], 10);
|
|
179
|
+
this.networkAddress =
|
|
180
|
+
NetworkUtils.ipToNum(ipAddressOrCidr.split("/")[0]) +
|
|
181
|
+
CidrBlock.calculateNetsize(this.mask) -
|
|
182
|
+
1;
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
if (typeof mask === "number") {
|
|
186
|
+
this.mask = mask;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
// this should be impossible
|
|
190
|
+
this.mask = 16;
|
|
191
|
+
}
|
|
192
|
+
this.networkAddress =
|
|
193
|
+
ipAddressOrCidr + CidrBlock.calculateNetsize(this.mask) - 1;
|
|
194
|
+
this.networkSize = 2 ** (32 - this.mask);
|
|
195
|
+
}
|
|
196
|
+
this.networkSize = 2 ** (32 - this.mask);
|
|
197
|
+
this.cidr = `${this.minIp()}/${this.mask}`;
|
|
198
|
+
}
|
|
199
|
+
/*
|
|
200
|
+
* The maximum IP in the CIDR Block e.g. '10.0.8.255'
|
|
201
|
+
*/
|
|
202
|
+
maxIp() {
|
|
203
|
+
// min + (2^(32-mask)) - 1 [zero needs to count]
|
|
204
|
+
return NetworkUtils.numToIp(this.maxAddress());
|
|
205
|
+
}
|
|
206
|
+
/*
|
|
207
|
+
* The minimum IP in the CIDR Block e.g. '10.0.0.0'
|
|
208
|
+
*/
|
|
209
|
+
minIp() {
|
|
210
|
+
return NetworkUtils.numToIp(this.minAddress());
|
|
211
|
+
}
|
|
212
|
+
/*
|
|
213
|
+
* Returns the number representation for the minimum IPv4 address
|
|
214
|
+
*/
|
|
215
|
+
minAddress() {
|
|
216
|
+
const div = this.networkAddress % this.networkSize;
|
|
217
|
+
return this.networkAddress - div;
|
|
218
|
+
}
|
|
219
|
+
/*
|
|
220
|
+
* Returns the number representation for the maximum IPv4 address
|
|
221
|
+
*/
|
|
222
|
+
maxAddress() {
|
|
223
|
+
// min + (2^(32-mask)) - 1 [zero needs to count]
|
|
224
|
+
return this.minAddress() + this.networkSize - 1;
|
|
225
|
+
}
|
|
226
|
+
/*
|
|
227
|
+
* Returns the next CIDR Block of the same mask size
|
|
228
|
+
*/
|
|
229
|
+
nextBlock() {
|
|
230
|
+
return new CidrBlock(this.maxAddress() + 1, this.mask);
|
|
231
|
+
}
|
|
232
|
+
/*
|
|
233
|
+
* Returns true if this CidrBlock fully contains the provided CidrBlock
|
|
234
|
+
*/
|
|
235
|
+
containsCidr(other) {
|
|
236
|
+
return (this.maxAddress() >= other.maxAddress() &&
|
|
237
|
+
this.minAddress() <= other.minAddress());
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
exports.CidrBlock = CidrBlock;
|
|
241
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay11dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F3cy9jb21wdXRlL25ldHdvcmstdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsZ0dBQWdHOzs7QUFFaEcscUhBQXFIO0FBQ3JILDJFQUEyRTtBQUUzRTs7O0dBR0c7QUFDSCxNQUFhLHFCQUFzQixTQUFRLEtBQUs7SUFDOUMsWUFBWSxJQUFZO1FBQ3RCLEtBQUssQ0FDSCxJQUFJO1lBQ0Ysc0dBQXNHLENBQ3pHLENBQUM7UUFDRiw0R0FBNEc7UUFDNUcsZ0ZBQWdGO1FBQ2hGLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7Q0FDRjtBQVZELHNEQVVDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLFlBQVk7SUFDdkI7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQWlCO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEMsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE9BQU8sQ0FDTCxNQUFNO2FBQ0gsR0FBRyxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQzNDLE1BQU0sQ0FBQyxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FDdEUsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQWlCO1FBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFNBQVMsZUFBZSxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELE9BQU8sU0FBUzthQUNiLEtBQUssQ0FBQyxHQUFHLENBQUM7YUFDVixNQUFNLENBQ0wsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQ2xDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDdEMsQ0FBQyxDQUNGLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQWE7UUFDakMsMENBQTBDO1FBQzFDLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN0QixNQUFNLE9BQU8sR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQ3BDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQixJQUFJLFNBQVMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDcEIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxTQUFTLEdBQUcsU0FBUyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN6QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQixDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFXLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsU0FBUyw0QkFBNEIsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0NBQ0Y7QUF6RUQsb0NBeUVDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLGNBQWM7SUFnQnpCOzs7Ozs7T0FNRztJQUNILFlBQVksSUFBWTtRQWpCeEI7O1dBRUc7UUFDYyxnQkFBVyxHQUFnQixFQUFFLENBQUM7UUFlN0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUyxDQUFDLElBQVk7UUFDM0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVLENBQUMsSUFBWSxFQUFFLFFBQWdCLENBQUM7UUFDL0MsSUFBSSxJQUFJLEdBQUcsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUkscUJBQXFCLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFDRCxNQUFNLEtBQUssR0FDVCxJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDbEUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxHQUFHLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM5QyxNQUFNLElBQUksS0FBSyxDQUNiLEdBQUcsS0FBSyxRQUFRLElBQUksK0JBQStCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQzNFLENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQWdCLEVBQUUsQ0FBQztRQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0IsTUFBTSxNQUFNLEdBQWMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN2RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7O09BR0c7SUFDSSx1QkFBdUIsQ0FBQyxXQUFtQjtRQUNoRCxNQUFNLFNBQVMsR0FDYixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQzNELE1BQU0sWUFBWSxHQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Q0FDRjtBQTdFRCx3Q0E2RUM7QUFFRDs7R0FFRztBQUNILE1BQWEsU0FBUztJQUNwQjs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFZO1FBQ3pDLE9BQU8sWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFZO1FBQ3pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFvQ0QsWUFBWSxlQUFnQyxFQUFFLElBQWE7UUFDekQsSUFBSSxPQUFPLGVBQWUsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxjQUFjO2dCQUNqQixZQUFZLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ25ELFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNyQyxDQUFDLENBQUM7UUFDTixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ25CLENBQUM7aUJBQU0sQ0FBQztnQkFDTiw0QkFBNEI7Z0JBQzVCLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLENBQUM7WUFDRCxJQUFJLENBQUMsY0FBYztnQkFDakIsZUFBZSxHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUs7UUFDVixnREFBZ0Q7UUFDaEQsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUs7UUFDVixPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksVUFBVTtRQUNmLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNuRCxPQUFPLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVU7UUFDZixnREFBZ0Q7UUFDaEQsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUztRQUNkLE9BQU8sSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWSxDQUFDLEtBQWdCO1FBQ2xDLE9BQU8sQ0FDTCxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRTtZQUN2QyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUN4QyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBNUhELDhCQTRIQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE3NS4xL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1lYzIvbGliL25ldHdvcmstdXRpbC50c1xuXG4vLyBUT0RPOiBGaXggZHVwbGljYXRlcyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE3NS4xL3BhY2thZ2VzL0Bhd3MtY2RrL2F3cy1lYzItYWxwaGEvbGliL3V0aWwudHNcbi8vIGNsYXNzZXMgb3ZlcmxhcCBhbmQgc2VlbSBpZGVudGljYWw6IENpZHJCbG9jaywgTmV0d29ya1V0aWxzIGluIC4vdXRpbC50c1xuXG4vKipcbiAqIEludmFsaWRDaWRyUmFuZ2VFcnJvciBpcyB0aHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHBlcmZvcm0gb3BlcmF0aW9ucyBvbiBhIENJRFJcbiAqIHJhbmdlIHRoYXQgaXMgZWl0aGVyIG5vdCB2YWxpZCwgb3Igb3V0c2lkZSBvZiB0aGUgVlBDIHNpemUgbGltaXRzLlxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZENpZHJSYW5nZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihjaWRyOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIGNpZHIgK1xuICAgICAgICBcIiBpcyBub3QgYSB2YWxpZCBWUEMgQ0lEUiByYW5nZS4gVlBDcyBtdXN0IGJlIGJldHdlZW4gLzE2IGFuZCAvMjggYW5kIHRoZSBtaW5pbXVtIHN1Ym5ldCBzaXplIGlzIC8yOC5cIixcbiAgICApO1xuICAgIC8vIFRoZSBmb2xsb3dpbmcgbGluZSBpcyByZXF1aXJlZCBmb3IgdHlwZSBjaGVja2luZyBvZiBjdXN0b20gZXJyb3JzLCBhbmQgbXVzdCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgc3VwZXIoKVxuICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzMxNjI2MjMxL2N1c3RvbS1lcnJvci1jbGFzcy1pbi10eXBlc2NyaXB0XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEludmFsaWRDaWRyUmFuZ2VFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogTmV0d29ya1V0aWxzIGNvbnRhaW5zIGhlbHBlcnMgdG8gd29yayB3aXRoIG5ldHdvcmsgY29uc3RydWN0cyAoc3VibmV0cy9yYW5nZXMpXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXR3b3JrVXRpbHMge1xuICAvKipcbiAgICogVmFsaWRhdGVzIGFuIElQdjQgc3RyaW5nXG4gICAqXG4gICAqIHJldHVybnMgdHJ1ZSBvZiB0aGUgc3RyaW5nIGNvbnRhaW5zIDQgbnVtYmVycyBiZXR3ZWVuIDAtMjU1IGRlbGltaXRlZCBieVxuICAgKiBhIGAuYCBjaGFyYWN0ZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmFsaWRJcChpcEFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG9jdGV0cyA9IGlwQWRkcmVzcy5zcGxpdChcIi5cIik7XG4gICAgaWYgKG9jdGV0cy5sZW5ndGggIT09IDQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIG9jdGV0c1xuICAgICAgICAubWFwKChvY3RldDogc3RyaW5nKSA9PiBwYXJzZUludChvY3RldCwgMTApKVxuICAgICAgICAuZmlsdGVyKChvY3RldDogbnVtYmVyKSA9PiBvY3RldCA+PSAwICYmIG9jdGV0IDw9IDI1NSkubGVuZ3RoID09PSA0XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHN0cmluZyBJUHY0IHRvIGEgbnVtYmVyXG4gICAqXG4gICAqIHRha2VzIGFuIElQIEFkZHJlc3MgKGUuZy4gMTc0LjY2LjE3My4xNjgpIGFuZCBjb252ZXJ0cyB0byBhIG51bWJlclxuICAgKiAoZS5nIDI5MjM2MDU0MTYpOyBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBJUHY0XG4gICAqXG4gICAqIFVzZXMgdGhlIGZvcm11bGE6XG4gICAqIChmaXJzdCBvY3RldCAqIDI1NsKzKSArIChzZWNvbmQgb2N0ZXQgKiAyNTbCsikgKyAodGhpcmQgb2N0ZXQgKiAyNTYpICtcbiAgICogKGZvdXJ0aCBvY3RldClcbiAgICpcbiAgICogQHBhcmFtICB7c3RyaW5nfSB0aGUgSVAgYWRkcmVzcyAoZS5nLiAxNzQuNjYuMTczLjE2OClcbiAgICogQHJldHVybnMge251bWJlcn0gdGhlIGludGVnZXIgdmFsdWUgb2YgdGhlIElQIGFkZHJlc3MgKGUuZyAyOTIzNjA1NDE2KVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpcFRvTnVtKGlwQWRkcmVzczogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMudmFsaWRJcChpcEFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7aXBBZGRyZXNzfSBpcyBub3QgdmFsaWRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXBBZGRyZXNzXG4gICAgICAuc3BsaXQoXCIuXCIpXG4gICAgICAucmVkdWNlKFxuICAgICAgICAocDogbnVtYmVyLCBjOiBzdHJpbmcsIGk6IG51bWJlcikgPT5cbiAgICAgICAgICBwICsgcGFyc2VJbnQoYywgMTApICogMjU2ICoqICgzIC0gaSksXG4gICAgICAgIDAsXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIG51bWJlciBhbmQgY29udmVydHMgaXQgdG8gSVB2NCBhZGRyZXNzIHN0cmluZ1xuICAgKlxuICAgKiBUYWtlcyBhIG51bWJlciAoZS5nIDI5MjM2MDU0MTYpIGFuZCBjb252ZXJ0cyBpdCB0byBhbiBJUHY0IGFkZHJlc3Mgc3RyaW5nXG4gICAqIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIElQdjRcbiAgICpcbiAgICogQHBhcmFtICB7bnVtYmVyfSB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGUgSVAgYWRkcmVzcyAoZS5nIDI5MjM2MDU0MTYpXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBJUHY0IGFkZHJlc3MgKGUuZy4gMTc0LjY2LjE3My4xNjgpXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG51bVRvSXAoaXBOdW06IG51bWJlcik6IHN0cmluZyB7XG4gICAgLy8gdGhpcyBhbGwgYmVjYXVzZSBiaXR3aXNlIG1hdGggaXMgc2lnbmVkXG4gICAgbGV0IHJlbWFpbmluZyA9IGlwTnVtO1xuICAgIGNvbnN0IGFkZHJlc3MgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICBpZiAocmVtYWluaW5nICE9PSAwKSB7XG4gICAgICAgIGFkZHJlc3MucHVzaChNYXRoLmZsb29yKHJlbWFpbmluZyAvIDI1NiAqKiAoMyAtIGkpKSk7XG4gICAgICAgIHJlbWFpbmluZyA9IHJlbWFpbmluZyAlIDI1NiAqKiAoMyAtIGkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkcmVzcy5wdXNoKDApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpcEFkZHJlc3M6IHN0cmluZyA9IGFkZHJlc3Muam9pbihcIi5cIik7XG4gICAgaWYgKCF0aGlzLnZhbGlkSXAoaXBBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2lwQWRkcmVzc30gaXMgbm90IGEgdmFsaWQgSVAgQWRkcmVzc2ApO1xuICAgIH1cbiAgICByZXR1cm4gaXBBZGRyZXNzO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldHdvcmsgYmFzZWQgb24gYSBDSURSIEJsb2NrIHRvIGJ1aWxkIGNvbnRhaW5lZCBzdWJuZXRzXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXR3b3JrQnVpbGRlciB7XG4gIC8qKlxuICAgKiBUaGUgQ0lEUiByYW5nZSB1c2VkIHdoZW4gY3JlYXRpbmcgdGhlIG5ldHdvcmtcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuZXR3b3JrQ2lkcjogQ2lkckJsb2NrO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBDSURSIGJsb2NrcyBmb3Igc3VibmV0cyB3aXRoaW4gdGhpcyBuZXR3b3JrXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN1Ym5ldENpZHJzOiBDaWRyQmxvY2tbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV4dCBhdmFpbGFibGUgSVAgYWRkcmVzcyBhcyBhIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBuZXh0QXZhaWxhYmxlSXA6IG51bWJlcjtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV0d29yayB1c2luZyB0aGUgcHJvdmlkZWQgQ0lEUiBibG9ja1xuICAgKlxuICAgKiBObyBzdWJuZXRzIGFyZSBhbGxvY2F0ZWQgaW4gdGhlIGNvbnN0cnVjdG9yLCB0aGUgbWF4SXBDb25zdW1lZCBpcyBzZXQgb25lXG4gICAqIGxlc3MgdGhhbiB0aGUgZmlyc3QgSVAgaW4gdGhlIG5ldHdvcmtcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNpZHI6IHN0cmluZykge1xuICAgIHRoaXMubmV0d29ya0NpZHIgPSBuZXcgQ2lkckJsb2NrKGNpZHIpO1xuICAgIHRoaXMuc3VibmV0Q2lkcnMgPSBbXTtcbiAgICB0aGlzLm5leHRBdmFpbGFibGVJcCA9IHRoaXMubmV0d29ya0NpZHIubWluQWRkcmVzcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHN1Ym5ldCB0byB0aGUgbmV0d29yayBhbmQgdXBkYXRlIHRoZSBtYXhJcENvbnN1bWVkXG4gICAqL1xuICBwdWJsaWMgYWRkU3VibmV0KG1hc2s6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkU3VibmV0cyhtYXNrLCAxKVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQge2NvdW50fSBudW1iZXIgb2Ygc3VibmV0cyB0byB0aGUgbmV0d29yayBhbmQgdXBkYXRlIHRoZSBtYXhJcENvbnN1bWVkXG4gICAqL1xuICBwdWJsaWMgYWRkU3VibmV0cyhtYXNrOiBudW1iZXIsIGNvdW50OiBudW1iZXIgPSAxKTogc3RyaW5nW10ge1xuICAgIGlmIChtYXNrIDwgMTYgfHwgbWFzayA+IDI4KSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZENpZHJSYW5nZUVycm9yKGB4LngueC54LyR7bWFza31gKTtcbiAgICB9XG4gICAgY29uc3QgbWF4SXAgPVxuICAgICAgdGhpcy5uZXh0QXZhaWxhYmxlSXAgKyBDaWRyQmxvY2suY2FsY3VsYXRlTmV0c2l6ZShtYXNrKSAqIGNvdW50O1xuICAgIGlmICh0aGlzLm5ldHdvcmtDaWRyLm1heEFkZHJlc3MoKSA8IG1heElwIC0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtjb3VudH0gb2YgLyR7bWFza30gZXhjZWVkcyByZW1haW5pbmcgc3BhY2Ugb2YgJHt0aGlzLm5ldHdvcmtDaWRyLmNpZHJ9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHN1Ym5ldHM6IENpZHJCbG9ja1tdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBzdWJuZXQ6IENpZHJCbG9jayA9IG5ldyBDaWRyQmxvY2sodGhpcy5uZXh0QXZhaWxhYmxlSXAsIG1hc2spO1xuICAgICAgdGhpcy5uZXh0QXZhaWxhYmxlSXAgPSBzdWJuZXQubmV4dEJsb2NrKCkubWluQWRkcmVzcygpO1xuICAgICAgdGhpcy5zdWJuZXRDaWRycy5wdXNoKHN1Ym5ldCk7XG4gICAgICBzdWJuZXRzLnB1c2goc3VibmV0KTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Ym5ldHMubWFwKChzdWJuZXQpID0+IHN1Ym5ldC5jaWRyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gdGhlIENJRFIgbm90YXRpb24gc3RyaW5ncyBmb3IgYWxsIHN1Ym5ldHMgaW4gdGhlIG5ldHdvcmtcbiAgICovXG4gIHB1YmxpYyBnZXQgY2lkclN0cmluZ3MoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnN1Ym5ldENpZHJzLm1hcCgoc3VibmV0KSA9PiBzdWJuZXQuY2lkcik7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgbGFyZ2VzdCBzdWJuZXQgdG8gY3JlYXRlIG9mIHRoZSBnaXZlbiBjb3VudCBmcm9tIHRoZVxuICAgKiByZW1haW5pbmcgSVAgc3BhY2VcbiAgICovXG4gIHB1YmxpYyBtYXNrRm9yUmVtYWluaW5nU3VibmV0cyhzdWJuZXRDb3VudDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCByZW1haW5pbmc6IG51bWJlciA9XG4gICAgICB0aGlzLm5ldHdvcmtDaWRyLm1heEFkZHJlc3MoKSAtIHRoaXMubmV4dEF2YWlsYWJsZUlwICsgMTtcbiAgICBjb25zdCBpcHNQZXJTdWJuZXQ6IG51bWJlciA9IE1hdGguZmxvb3IocmVtYWluaW5nIC8gc3VibmV0Q291bnQpO1xuICAgIHJldHVybiAzMiAtIE1hdGguZmxvb3IoTWF0aC5sb2cyKGlwc1BlclN1Ym5ldCkpO1xuICB9XG59XG5cbi8qKlxuICogQSBibG9jayBvZiBJUCBhZGRyZXNzIHNwYWNlIHdpdGggYSBnaXZlbiBiaXQgcHJlZml4XG4gKi9cbmV4cG9ydCBjbGFzcyBDaWRyQmxvY2sge1xuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgbmV0bWFzayBmb3IgYSBnaXZlbiBDSURSIG1hc2tcbiAgICpcbiAgICogRm9yIGV4YW1wbGU6XG4gICAqIENpZHJCbG9jay5jYWxjdWxhdGVOZXRtYXNrKDI0KSByZXR1cm5zICcyNTUuMjU1LjI1NS4wJ1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjYWxjdWxhdGVOZXRtYXNrKG1hc2s6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIE5ldHdvcmtVdGlscy5udW1Ub0lwKDIgKiogMzIgLSAyICoqICgzMiAtIG1hc2spKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBudW1iZXIgSVAgYWRkcmVzc2VzIGluIGEgQ0lEUiBNYXNrXG4gICAqXG4gICAqIEZvciBleGFtcGxlOlxuICAgKiBDaWRyQmxvY2suY2FsY3VsYXRlTmV0c2l6ZSgyNCkgcmV0dXJucyAyNTZcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY2FsY3VsYXRlTmV0c2l6ZShtYXNrOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiAyICoqICgzMiAtIG1hc2spO1xuICB9XG5cbiAgLypcbiAgICogVGhlIENJRFIgQmxvY2sgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcgZS5nLiAnMTAuMC4wLjAvMjEnXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2lkcjogc3RyaW5nO1xuXG4gIC8qXG4gICAqIFRoZSBDSURSIG1hc2sgZS5nLiBmb3IgQ0lEUiAnMTAuMC4wLjAvMjEnIHJldHVybnMgMjFcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtYXNrOiBudW1iZXI7XG5cbiAgLypcbiAgICogVGhlIHRvdGFsIG51bWJlciBvZiBJUCBhZGRyZXNzZXMgaW4gdGhlIENJRFJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuZXR3b3JrU2l6ZTogbnVtYmVyO1xuXG4gIC8qXG4gICAqIFRoZSBuZXR3b3JrIGFkZHJlc3MgcHJvdmlkZWQgaW4gQ0lEUiBjcmVhdGlvbiBvZmZzZXQgYnkgdGhlIE5ldHNpemUgLTFcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbmV0d29ya0FkZHJlc3M6IG51bWJlcjtcblxuICAvKlxuICAgKiBQYXJzZXMgZWl0aGVyIENJRFIgbm90YXRpb24gU3RyaW5nIG9yIHR3byBudW1iZXJzIHJlcHJlc2VudGluZyB0aGUgSVBcbiAgICogc3BhY2VcbiAgICpcbiAgICogY2lkciBleHBlY3RzIGEgc3RyaW5nICcxMC4wLjAuMC8xNidcbiAgICogaXBBZGRyZXNzIGV4cGVjdHMgYSBudW1iZXJcbiAgICogbWFzayBleHBlY3RzIGEgbnVtYmVyXG4gICAqXG4gICAqIElmIHRoZSBnaXZlbiBgY2lkcmAgb3IgYGlwQWRkcmVzc2AgaXMgbm90IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJsb2NrLFxuICAgKiB0aGVuIHRoZSBuZXh0IGF2YWlsYWJsZSBibG9jayB3aWxsIGJlIHJldHVybmVkLiBGb3IgZXhhbXBsZSwgaWZcbiAgICogYDEwLjAuMy4xLzI4YCBpcyBnaXZlbiB0aGUgcmV0dXJuZWQgYmxvY2sgd2lsbCByZXByZXNlbnQgYDEwLjAuMy4xNi8yOGAuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjaWRyOiBzdHJpbmcpO1xuICBjb25zdHJ1Y3RvcihpcEFkZHJlc3M6IG51bWJlciwgbWFzazogbnVtYmVyKTtcbiAgY29uc3RydWN0b3IoaXBBZGRyZXNzT3JDaWRyOiBzdHJpbmcgfCBudW1iZXIsIG1hc2s/OiBudW1iZXIpIHtcbiAgICBpZiAodHlwZW9mIGlwQWRkcmVzc09yQ2lkciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhpcy5tYXNrID0gcGFyc2VJbnQoaXBBZGRyZXNzT3JDaWRyLnNwbGl0KFwiL1wiKVsxXSwgMTApO1xuICAgICAgdGhpcy5uZXR3b3JrQWRkcmVzcyA9XG4gICAgICAgIE5ldHdvcmtVdGlscy5pcFRvTnVtKGlwQWRkcmVzc09yQ2lkci5zcGxpdChcIi9cIilbMF0pICtcbiAgICAgICAgQ2lkckJsb2NrLmNhbGN1bGF0ZU5ldHNpemUodGhpcy5tYXNrKSAtXG4gICAgICAgIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgbWFzayA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICB0aGlzLm1hc2sgPSBtYXNrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGhpcyBzaG91bGQgYmUgaW1wb3NzaWJsZVxuICAgICAgICB0aGlzLm1hc2sgPSAxNjtcbiAgICAgIH1cbiAgICAgIHRoaXMubmV0d29ya0FkZHJlc3MgPVxuICAgICAgICBpcEFkZHJlc3NPckNpZHIgKyBDaWRyQmxvY2suY2FsY3VsYXRlTmV0c2l6ZSh0aGlzLm1hc2spIC0gMTtcbiAgICAgIHRoaXMubmV0d29ya1NpemUgPSAyICoqICgzMiAtIHRoaXMubWFzayk7XG4gICAgfVxuICAgIHRoaXMubmV0d29ya1NpemUgPSAyICoqICgzMiAtIHRoaXMubWFzayk7XG4gICAgdGhpcy5jaWRyID0gYCR7dGhpcy5taW5JcCgpfS8ke3RoaXMubWFza31gO1xuICB9XG5cbiAgLypcbiAgICogVGhlIG1heGltdW0gSVAgaW4gdGhlIENJRFIgQmxvY2sgZS5nLiAnMTAuMC44LjI1NSdcbiAgICovXG4gIHB1YmxpYyBtYXhJcCgpOiBzdHJpbmcge1xuICAgIC8vIG1pbiArICgyXigzMi1tYXNrKSkgLSAxIFt6ZXJvIG5lZWRzIHRvIGNvdW50XVxuICAgIHJldHVybiBOZXR3b3JrVXRpbHMubnVtVG9JcCh0aGlzLm1heEFkZHJlc3MoKSk7XG4gIH1cblxuICAvKlxuICAgKiBUaGUgbWluaW11bSBJUCBpbiB0aGUgQ0lEUiBCbG9jayBlLmcuICcxMC4wLjAuMCdcbiAgICovXG4gIHB1YmxpYyBtaW5JcCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBOZXR3b3JrVXRpbHMubnVtVG9JcCh0aGlzLm1pbkFkZHJlc3MoKSk7XG4gIH1cblxuICAvKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBtaW5pbXVtIElQdjQgYWRkcmVzc1xuICAgKi9cbiAgcHVibGljIG1pbkFkZHJlc3MoKTogbnVtYmVyIHtcbiAgICBjb25zdCBkaXYgPSB0aGlzLm5ldHdvcmtBZGRyZXNzICUgdGhpcy5uZXR3b3JrU2l6ZTtcbiAgICByZXR1cm4gdGhpcy5uZXR3b3JrQWRkcmVzcyAtIGRpdjtcbiAgfVxuXG4gIC8qXG4gICAqIFJldHVybnMgdGhlIG51bWJlciByZXByZXNlbnRhdGlvbiBmb3IgdGhlIG1heGltdW0gSVB2NCBhZGRyZXNzXG4gICAqL1xuICBwdWJsaWMgbWF4QWRkcmVzcygpOiBudW1iZXIge1xuICAgIC8vIG1pbiArICgyXigzMi1tYXNrKSkgLSAxIFt6ZXJvIG5lZWRzIHRvIGNvdW50XVxuICAgIHJldHVybiB0aGlzLm1pbkFkZHJlc3MoKSArIHRoaXMubmV0d29ya1NpemUgLSAxO1xuICB9XG5cbiAgLypcbiAgICogUmV0dXJucyB0aGUgbmV4dCBDSURSIEJsb2NrIG9mIHRoZSBzYW1lIG1hc2sgc2l6ZVxuICAgKi9cbiAgcHVibGljIG5leHRCbG9jaygpOiBDaWRyQmxvY2sge1xuICAgIHJldHVybiBuZXcgQ2lkckJsb2NrKHRoaXMubWF4QWRkcmVzcygpICsgMSwgdGhpcy5tYXNrKTtcbiAgfVxuXG4gIC8qXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIENpZHJCbG9jayBmdWxseSBjb250YWlucyB0aGUgcHJvdmlkZWQgQ2lkckJsb2NrXG4gICAqL1xuICBwdWJsaWMgY29udGFpbnNDaWRyKG90aGVyOiBDaWRyQmxvY2spOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5tYXhBZGRyZXNzKCkgPj0gb3RoZXIubWF4QWRkcmVzcygpICYmXG4gICAgICB0aGlzLm1pbkFkZHJlc3MoKSA8PSBvdGhlci5taW5BZGRyZXNzKClcbiAgICApO1xuICB9XG59XG4iXX0=
|