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,469 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.RouteTable = exports.Route = exports.RouteTargetType = exports.VPCPeeringConnection = exports.NatGateway = exports.VPNGatewayV2 = exports.InternetGateway = exports.EgressOnlyInternetGateway = exports.NatConnectivityType = 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/aws-ec2-alpha/lib/route.ts
|
|
7
|
+
const provider_aws_1 = require("@cdktf/provider-aws");
|
|
8
|
+
const cdktf_1 = require("cdktf");
|
|
9
|
+
const vpc_1 = require("./vpc");
|
|
10
|
+
const vpc_endpoint_1 = require("./vpc-endpoint");
|
|
11
|
+
const aws_construct_1 = require("../aws-construct");
|
|
12
|
+
// TODO: Use TagManager and tag-aspect instead
|
|
13
|
+
const aws_tags_1 = require("../aws-tags");
|
|
14
|
+
// import { Tags } from "../tag-aspect";
|
|
15
|
+
const ec2_util_1 = require("./ec2-util");
|
|
16
|
+
const ec2_util_v2_1 = require("./ec2-util-v2");
|
|
17
|
+
/**
|
|
18
|
+
* Indicates whether the NAT gateway supports public or private connectivity.
|
|
19
|
+
* The default is public connectivity.
|
|
20
|
+
* See: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html#cfn-ec2-natgateway-connectivitytype
|
|
21
|
+
*/
|
|
22
|
+
var NatConnectivityType;
|
|
23
|
+
(function (NatConnectivityType) {
|
|
24
|
+
/**
|
|
25
|
+
* Sets Connectivity type to PUBLIC
|
|
26
|
+
*/
|
|
27
|
+
NatConnectivityType["PUBLIC"] = "public";
|
|
28
|
+
/**
|
|
29
|
+
* Sets Connectivity type to PRIVATE
|
|
30
|
+
*/
|
|
31
|
+
NatConnectivityType["PRIVATE"] = "private";
|
|
32
|
+
})(NatConnectivityType || (exports.NatConnectivityType = NatConnectivityType = {}));
|
|
33
|
+
/**
|
|
34
|
+
* Name tag constant
|
|
35
|
+
*/
|
|
36
|
+
const NAME_TAG = "Name";
|
|
37
|
+
/**
|
|
38
|
+
* Creates an egress-only internet gateway
|
|
39
|
+
* @resource aws_egress_only_internet_gateway
|
|
40
|
+
*/
|
|
41
|
+
class EgressOnlyInternetGateway extends aws_construct_1.AwsConstructBase {
|
|
42
|
+
get routeTargetOutputs() {
|
|
43
|
+
return {
|
|
44
|
+
routerType: this.routerType,
|
|
45
|
+
routerTargetId: this.routerTargetId,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
get outputs() {
|
|
49
|
+
return this.routeTargetOutputs;
|
|
50
|
+
}
|
|
51
|
+
constructor(scope, id, props) {
|
|
52
|
+
super(scope, id);
|
|
53
|
+
if (props.egressOnlyInternetGatewayName) {
|
|
54
|
+
aws_tags_1.Tags.of(this).add(NAME_TAG, props.egressOnlyInternetGatewayName);
|
|
55
|
+
}
|
|
56
|
+
this.routerType = vpc_1.RouterType.EGRESS_ONLY_INTERNET_GATEWAY;
|
|
57
|
+
this.resource = new provider_aws_1.egressOnlyInternetGateway.EgressOnlyInternetGateway(this, "EIGW", {
|
|
58
|
+
vpcId: props.vpc.vpcId,
|
|
59
|
+
});
|
|
60
|
+
this.node.defaultChild = this.resource;
|
|
61
|
+
this.routerTargetId = this.resource.id;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.EgressOnlyInternetGateway = EgressOnlyInternetGateway;
|
|
65
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
66
|
+
EgressOnlyInternetGateway[_a] = { fqn: "terraconstructs.aws.compute.alpha.EgressOnlyInternetGateway", version: "0.0.12" };
|
|
67
|
+
/**
|
|
68
|
+
* Creates an internet gateway
|
|
69
|
+
* @resource AWS::EC2::InternetGateway
|
|
70
|
+
*/
|
|
71
|
+
class InternetGateway extends aws_construct_1.AwsConstructBase {
|
|
72
|
+
get routeTargetOutputs() {
|
|
73
|
+
return {
|
|
74
|
+
routerType: this.routerType,
|
|
75
|
+
routerTargetId: this.routerTargetId,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
get outputs() {
|
|
79
|
+
return this.routeTargetOutputs;
|
|
80
|
+
}
|
|
81
|
+
constructor(scope, id, props) {
|
|
82
|
+
super(scope, id);
|
|
83
|
+
this.routerType = vpc_1.RouterType.GATEWAY;
|
|
84
|
+
this.resource = new provider_aws_1.internetGateway.InternetGateway(this, "IGW", {});
|
|
85
|
+
this.node.defaultChild = this.resource;
|
|
86
|
+
this.routerTargetId = this.resource.id;
|
|
87
|
+
this.vpcId = props.vpc.vpcId;
|
|
88
|
+
if (props.internetGatewayName) {
|
|
89
|
+
aws_tags_1.Tags.of(this).add(NAME_TAG, props.internetGatewayName);
|
|
90
|
+
}
|
|
91
|
+
new provider_aws_1.internetGatewayAttachment.InternetGatewayAttachment(this, "GWAttachment", {
|
|
92
|
+
vpcId: this.vpcId,
|
|
93
|
+
internetGatewayId: this.routerTargetId,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.InternetGateway = InternetGateway;
|
|
98
|
+
_b = JSII_RTTI_SYMBOL_1;
|
|
99
|
+
InternetGateway[_b] = { fqn: "terraconstructs.aws.compute.alpha.InternetGateway", version: "0.0.12" };
|
|
100
|
+
/**
|
|
101
|
+
* Creates a virtual private gateway
|
|
102
|
+
* @resource AWS::EC2::VPNGateway
|
|
103
|
+
*/
|
|
104
|
+
class VPNGatewayV2 extends aws_construct_1.AwsConstructBase {
|
|
105
|
+
get routeTargetOutputs() {
|
|
106
|
+
return {
|
|
107
|
+
routerType: this.routerType,
|
|
108
|
+
routerTargetId: this.routerTargetId,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
get outputs() {
|
|
112
|
+
return this.routeTargetOutputs;
|
|
113
|
+
}
|
|
114
|
+
constructor(scope, id, props) {
|
|
115
|
+
super(scope, id, props);
|
|
116
|
+
/**
|
|
117
|
+
* The VPN Gateway Route Propagation
|
|
118
|
+
*/
|
|
119
|
+
this._routePropagation = [];
|
|
120
|
+
const vpnGatewayName = props.vpnGatewayName ||
|
|
121
|
+
this.stack.uniqueResourceName(this, {
|
|
122
|
+
prefix: this.gridUUID,
|
|
123
|
+
});
|
|
124
|
+
this.routerType = vpc_1.RouterType.GATEWAY;
|
|
125
|
+
this.resource = new provider_aws_1.vpnGateway.VpnGateway(this, "IGW", {
|
|
126
|
+
amazonSideAsn: props.amazonSideAsn !== undefined
|
|
127
|
+
? props.amazonSideAsn.toString()
|
|
128
|
+
: undefined,
|
|
129
|
+
});
|
|
130
|
+
this.node.defaultChild = this.resource;
|
|
131
|
+
this.routerTargetId = this.resource.id;
|
|
132
|
+
this.vpcId = props.vpc.vpcId;
|
|
133
|
+
this._attachment = new provider_aws_1.vpnGatewayAttachment.VpnGatewayAttachment(this, "VPCVPNGW", {
|
|
134
|
+
vpcId: this.vpcId,
|
|
135
|
+
vpnGatewayId: this.resource.id,
|
|
136
|
+
});
|
|
137
|
+
if (props.vpnGatewayName) {
|
|
138
|
+
aws_tags_1.Tags.of(this).add(NAME_TAG, vpnGatewayName);
|
|
139
|
+
}
|
|
140
|
+
// Propagate routes on route tables associated with the right subnets
|
|
141
|
+
const vpnRoutePropagation = props.vpnRoutePropagation ?? [];
|
|
142
|
+
const subnets = vpnRoutePropagation
|
|
143
|
+
.map((s) => props.vpc.selectSubnets(s).subnets)
|
|
144
|
+
.flat();
|
|
145
|
+
const routeTableIds = (0, ec2_util_1.allRouteTableIds)(subnets);
|
|
146
|
+
if (routeTableIds.length === 0) {
|
|
147
|
+
// "@aws-cdk:aws-ec2-elpha:enableVpnGatewayV2",
|
|
148
|
+
cdktf_1.Annotations.of(scope).addWarning(`No subnets matching selection: '${JSON.stringify(vpnRoutePropagation)}'. Select other subnets to add routes to.`);
|
|
149
|
+
}
|
|
150
|
+
for (let i = 0; i < subnets.length; i++) {
|
|
151
|
+
const routePropagation = new provider_aws_1.vpnGatewayRoutePropagation.VpnGatewayRoutePropagation(this, `RoutePropagation${i}`, {
|
|
152
|
+
routeTableId: subnets[i].routeTable.routeTableId,
|
|
153
|
+
vpnGatewayId: this.routerTargetId,
|
|
154
|
+
});
|
|
155
|
+
// The AWS::EC2::VPNGatewayRoutePropagation resource cannot use the VPN gateway
|
|
156
|
+
// until it has successfully attached to the VPC.
|
|
157
|
+
// See https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-gatewayrouteprop.html
|
|
158
|
+
routePropagation.node.addDependency(this._attachment);
|
|
159
|
+
this._routePropagation.push(routePropagation);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
exports.VPNGatewayV2 = VPNGatewayV2;
|
|
164
|
+
_c = JSII_RTTI_SYMBOL_1;
|
|
165
|
+
VPNGatewayV2[_c] = { fqn: "terraconstructs.aws.compute.alpha.VPNGatewayV2", version: "0.0.12" };
|
|
166
|
+
/**
|
|
167
|
+
* Creates a network address translation (NAT) gateway
|
|
168
|
+
* @resource AWS::EC2::NatGateway
|
|
169
|
+
*/
|
|
170
|
+
class NatGateway extends aws_construct_1.AwsConstructBase {
|
|
171
|
+
get routeTargetOutputs() {
|
|
172
|
+
return {
|
|
173
|
+
routerType: this.routerType,
|
|
174
|
+
routerTargetId: this.routerTargetId,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
get outputs() {
|
|
178
|
+
return this.routeTargetOutputs;
|
|
179
|
+
}
|
|
180
|
+
constructor(scope, id, props) {
|
|
181
|
+
super(scope, id);
|
|
182
|
+
this.routerType = vpc_1.RouterType.NAT_GATEWAY;
|
|
183
|
+
this.connectivityType =
|
|
184
|
+
props.connectivityType || NatConnectivityType.PUBLIC;
|
|
185
|
+
this.maxDrainDuration = props.maxDrainDuration;
|
|
186
|
+
if (this.connectivityType === NatConnectivityType.PUBLIC) {
|
|
187
|
+
if (!props.vpc && !props.allocationId) {
|
|
188
|
+
throw new Error("Either provide vpc or allocationId");
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (props.natGatewayName) {
|
|
192
|
+
aws_tags_1.Tags.of(this).add(NAME_TAG, props?.natGatewayName);
|
|
193
|
+
}
|
|
194
|
+
// If user does not provide EIP, generate one for them
|
|
195
|
+
var aId;
|
|
196
|
+
if (this.connectivityType === NatConnectivityType.PUBLIC) {
|
|
197
|
+
if (!props.allocationId) {
|
|
198
|
+
let eip = new provider_aws_1.eip.Eip(this, "EIP", {
|
|
199
|
+
domain: props.vpc?.vpcId,
|
|
200
|
+
});
|
|
201
|
+
aId = eip.allocationId;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
aId = props.allocationId;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
this.resource = new provider_aws_1.natGateway.NatGateway(this, "NATGateway", {
|
|
208
|
+
subnetId: props.subnet.subnetId,
|
|
209
|
+
allocationId: aId,
|
|
210
|
+
privateIp: props.privateIpAddress,
|
|
211
|
+
// ...props,
|
|
212
|
+
connectivityType: props.connectivityType,
|
|
213
|
+
secondaryAllocationIds: props.secondaryAllocationIds,
|
|
214
|
+
secondaryPrivateIpAddressCount: props.secondaryPrivateIpAddressCount,
|
|
215
|
+
secondaryPrivateIpAddresses: props.secondaryPrivateIpAddresses,
|
|
216
|
+
// https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html#cfn-ec2-natgateway-maxdraindurationseconds
|
|
217
|
+
// https://registry.terraform.io/providers/hashicorp/aws/5.68.0/docs/resources/nat_gateway#timeouts
|
|
218
|
+
...(this.maxDrainDuration
|
|
219
|
+
? {
|
|
220
|
+
timeouts: {
|
|
221
|
+
delete: this.maxDrainDuration.toSeconds().toString(),
|
|
222
|
+
},
|
|
223
|
+
}
|
|
224
|
+
: {}),
|
|
225
|
+
});
|
|
226
|
+
this.natGatewayId = this.resource.id;
|
|
227
|
+
this.routerTargetId = this.resource.id;
|
|
228
|
+
this.node.defaultChild = this.resource;
|
|
229
|
+
this.node.addDependency(props.subnet.internetConnectivityEstablished);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
exports.NatGateway = NatGateway;
|
|
233
|
+
_d = JSII_RTTI_SYMBOL_1;
|
|
234
|
+
NatGateway[_d] = { fqn: "terraconstructs.aws.compute.alpha.NatGateway", version: "0.0.12" };
|
|
235
|
+
/**
|
|
236
|
+
* Creates a peering connection between two VPCs
|
|
237
|
+
* @resource AWS::EC2::VPCPeeringConnection
|
|
238
|
+
*/
|
|
239
|
+
class VPCPeeringConnection extends aws_construct_1.AwsConstructBase {
|
|
240
|
+
get routeTargetOutputs() {
|
|
241
|
+
return {
|
|
242
|
+
routerType: this.routerType,
|
|
243
|
+
routerTargetId: this.routerTargetId,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
get outputs() {
|
|
247
|
+
return this.routeTargetOutputs;
|
|
248
|
+
}
|
|
249
|
+
constructor(scope, id, props) {
|
|
250
|
+
super(scope, id);
|
|
251
|
+
this.routerType = vpc_1.RouterType.VPC_PEERING_CONNECTION;
|
|
252
|
+
// const isCrossAccount =
|
|
253
|
+
// props.requestorVpc.ownerAccountId !== props.acceptorVpc.ownerAccountId;
|
|
254
|
+
// if (!isCrossAccount && props.peerRoleArn) {
|
|
255
|
+
// throw new Error("peerRoleArn is not needed for same account peering");
|
|
256
|
+
// }
|
|
257
|
+
// if (isCrossAccount && !props.peerRoleArn) {
|
|
258
|
+
// throw new Error("Cross account VPC peering requires peerRoleArn");
|
|
259
|
+
// }
|
|
260
|
+
const overlap = this.validateVpcCidrOverlap(props.requestorVpc, props.acceptorVpc);
|
|
261
|
+
if (overlap) {
|
|
262
|
+
throw new Error("CIDR block should not overlap with each other for establishing a peering connection");
|
|
263
|
+
}
|
|
264
|
+
if (props.vpcPeeringConnectionName) {
|
|
265
|
+
aws_tags_1.Tags.of(this).add(NAME_TAG, props.vpcPeeringConnectionName);
|
|
266
|
+
}
|
|
267
|
+
this.resource = new provider_aws_1.vpcPeeringConnection.VpcPeeringConnection(this, "VPCPeeringConnection", {
|
|
268
|
+
vpcId: props.requestorVpc.vpcId,
|
|
269
|
+
peerVpcId: props.acceptorVpc.vpcId,
|
|
270
|
+
peerOwnerId: props.acceptorVpc.ownerAccountId,
|
|
271
|
+
peerRegion: props.acceptorVpc.region, // autoAccept must be false
|
|
272
|
+
// TODO: handle crossAccount TF Provider for vpc_peering_connection_accepter
|
|
273
|
+
// peerRoleArn: isCrossAccount ? props.peerRoleArn : undefined,
|
|
274
|
+
});
|
|
275
|
+
// TODO: Add aws_vpc_peering_connection_accepter to manage Accepter Side?
|
|
276
|
+
this.routerTargetId = this.resource.id;
|
|
277
|
+
this.node.defaultChild = this.resource;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Validates if the provided IPv4 CIDR block overlaps with existing subnet CIDR blocks within the given VPC.
|
|
281
|
+
*
|
|
282
|
+
* @param requestorVpc The VPC of the requestor.
|
|
283
|
+
* @param acceptorVpc The VPC of the acceptor.
|
|
284
|
+
* @returns True if the IPv4 CIDR block overlaps with each other for two VPCs, false otherwise.
|
|
285
|
+
* @internal
|
|
286
|
+
*/
|
|
287
|
+
validateVpcCidrOverlap(requestorVpc, acceptorVpc) {
|
|
288
|
+
const requestorCidrs = [requestorVpc.ipv4CidrBlock];
|
|
289
|
+
const acceptorCidrs = [acceptorVpc.ipv4CidrBlock];
|
|
290
|
+
if (requestorVpc.secondaryCidrBlock) {
|
|
291
|
+
requestorCidrs.push(...requestorVpc.secondaryCidrBlock
|
|
292
|
+
.map((block) => block.cidrBlock)
|
|
293
|
+
.filter((cidr) => cidr !== undefined));
|
|
294
|
+
}
|
|
295
|
+
if (acceptorVpc.secondaryCidrBlock) {
|
|
296
|
+
acceptorCidrs.push(...acceptorVpc.secondaryCidrBlock
|
|
297
|
+
.map((block) => block.cidrBlock)
|
|
298
|
+
.filter((cidr) => cidr !== undefined));
|
|
299
|
+
}
|
|
300
|
+
for (const requestorCidr of requestorCidrs) {
|
|
301
|
+
const requestorRange = new ec2_util_v2_1.CidrBlock(requestorCidr);
|
|
302
|
+
const requestorIpRange = [
|
|
303
|
+
requestorRange.minIp(),
|
|
304
|
+
requestorRange.maxIp(),
|
|
305
|
+
];
|
|
306
|
+
for (const acceptorCidr of acceptorCidrs) {
|
|
307
|
+
const acceptorRange = new ec2_util_v2_1.CidrBlock(acceptorCidr);
|
|
308
|
+
const acceptorIpRange = [
|
|
309
|
+
acceptorRange.minIp(),
|
|
310
|
+
acceptorRange.maxIp(),
|
|
311
|
+
];
|
|
312
|
+
if (requestorRange.rangesOverlap(acceptorIpRange, requestorIpRange)) {
|
|
313
|
+
return true;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return false;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
exports.VPCPeeringConnection = VPCPeeringConnection;
|
|
321
|
+
_e = JSII_RTTI_SYMBOL_1;
|
|
322
|
+
VPCPeeringConnection[_e] = { fqn: "terraconstructs.aws.compute.alpha.VPCPeeringConnection", version: "0.0.12" };
|
|
323
|
+
/**
|
|
324
|
+
* The gateway or endpoint targeted by the route.
|
|
325
|
+
*/
|
|
326
|
+
class RouteTargetType {
|
|
327
|
+
constructor(props) {
|
|
328
|
+
if ((props.gateway && props.endpoint) ||
|
|
329
|
+
(!props.gateway && !props.endpoint)) {
|
|
330
|
+
throw new Error("Exactly one of `gateway` or `endpoint` must be specified.");
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
this.gateway = props.gateway;
|
|
334
|
+
this.endpoint = props.endpoint;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
exports.RouteTargetType = RouteTargetType;
|
|
339
|
+
_f = JSII_RTTI_SYMBOL_1;
|
|
340
|
+
RouteTargetType[_f] = { fqn: "terraconstructs.aws.compute.alpha.RouteTargetType", version: "0.0.12" };
|
|
341
|
+
/**
|
|
342
|
+
* Creates a new route with added functionality.
|
|
343
|
+
* @resource AWS::EC2::Route
|
|
344
|
+
*/
|
|
345
|
+
class Route extends aws_construct_1.AwsConstructBase {
|
|
346
|
+
get routeOutputs() {
|
|
347
|
+
return {
|
|
348
|
+
routeTable: this.routeTable.routeTableId,
|
|
349
|
+
destination: this.destination,
|
|
350
|
+
target: this.target.endpoint
|
|
351
|
+
? this.target.endpoint.vpcEndpointOutputs
|
|
352
|
+
: this.target.gateway.routeTargetOutputs,
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
get outputs() {
|
|
356
|
+
return this.routeOutputs;
|
|
357
|
+
}
|
|
358
|
+
constructor(scope, id, props) {
|
|
359
|
+
super(scope, id);
|
|
360
|
+
this.target = props.target;
|
|
361
|
+
this.routeTable = props.routeTable;
|
|
362
|
+
this.destination = props.destination;
|
|
363
|
+
const isDestinationIpv4 = ec2_util_v2_1.NetworkUtils.validIp(props.destination);
|
|
364
|
+
if (!isDestinationIpv4) {
|
|
365
|
+
//TODO Validate for IPv6 CIDR range
|
|
366
|
+
this.destinationIpv6Cidr = props.destination;
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
this.destinationIpv4Cidr = props.destination;
|
|
370
|
+
}
|
|
371
|
+
if (this.target.gateway?.routerType ===
|
|
372
|
+
vpc_1.RouterType.EGRESS_ONLY_INTERNET_GATEWAY &&
|
|
373
|
+
isDestinationIpv4) {
|
|
374
|
+
throw new Error("Egress only internet gateway does not support IPv4 routing");
|
|
375
|
+
}
|
|
376
|
+
this.targetRouterType = this.target.gateway
|
|
377
|
+
? this.target.gateway.routerType
|
|
378
|
+
: vpc_1.RouterType.VPC_ENDPOINT;
|
|
379
|
+
// Gateway generates route automatically via its RouteTable, thus we don't need to generate the resource for it
|
|
380
|
+
if (!(this.target.endpoint instanceof vpc_endpoint_1.GatewayVpcEndpoint)) {
|
|
381
|
+
this.resource = new provider_aws_1.route.Route(this, "Route", {
|
|
382
|
+
routeTableId: this.routeTable.routeTableId,
|
|
383
|
+
destinationCidrBlock: this.destinationIpv4Cidr,
|
|
384
|
+
destinationIpv6CidrBlock: this.destinationIpv6Cidr,
|
|
385
|
+
[routerTypeToPropName(this.targetRouterType)]: this.target.gateway
|
|
386
|
+
? this.target.gateway.routerTargetId
|
|
387
|
+
: this.target.endpoint
|
|
388
|
+
? this.target.endpoint.vpcEndpointId
|
|
389
|
+
: null,
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
this.node.defaultChild = this.resource;
|
|
393
|
+
//Create a route only after target gateway or endpoint is created
|
|
394
|
+
if (this.target.gateway) {
|
|
395
|
+
this.node.addDependency(this.target.gateway);
|
|
396
|
+
}
|
|
397
|
+
if (this.target.endpoint) {
|
|
398
|
+
this.node.addDependency(this.target.endpoint);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
exports.Route = Route;
|
|
403
|
+
_g = JSII_RTTI_SYMBOL_1;
|
|
404
|
+
Route[_g] = { fqn: "terraconstructs.aws.compute.alpha.Route", version: "0.0.12" };
|
|
405
|
+
/**
|
|
406
|
+
* Creates a route table for the specified VPC
|
|
407
|
+
* @resource aws_route_table
|
|
408
|
+
*/
|
|
409
|
+
class RouteTable extends aws_construct_1.AwsConstructBase {
|
|
410
|
+
get routeTableOutputs() {
|
|
411
|
+
return {
|
|
412
|
+
routeTableId: this.routeTableId,
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
get outputs() {
|
|
416
|
+
return this.routeTableOutputs;
|
|
417
|
+
}
|
|
418
|
+
constructor(scope, id, props) {
|
|
419
|
+
super(scope, id);
|
|
420
|
+
this.resource = new provider_aws_1.routeTable.RouteTable(this, "RouteTable", {
|
|
421
|
+
vpcId: props.vpc.vpcId,
|
|
422
|
+
});
|
|
423
|
+
if (props.routeTableName) {
|
|
424
|
+
aws_tags_1.Tags.of(this).add(NAME_TAG, props.routeTableName);
|
|
425
|
+
}
|
|
426
|
+
this.node.defaultChild = this.resource;
|
|
427
|
+
this.routeTableId = this.resource.id;
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Adds a new custom route to the route table.
|
|
431
|
+
*
|
|
432
|
+
* @param destination The IPv4 or IPv6 CIDR block used for the destination match.
|
|
433
|
+
* @param target The gateway or endpoint targeted by the route.
|
|
434
|
+
* @param routeName The resource name of the route.
|
|
435
|
+
*/
|
|
436
|
+
addRoute(id, destination, target, routeName) {
|
|
437
|
+
new Route(this, id, {
|
|
438
|
+
routeTable: this,
|
|
439
|
+
destination: destination,
|
|
440
|
+
target: target,
|
|
441
|
+
routeName: routeName,
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
exports.RouteTable = RouteTable;
|
|
446
|
+
_h = JSII_RTTI_SYMBOL_1;
|
|
447
|
+
RouteTable[_h] = { fqn: "terraconstructs.aws.compute.alpha.RouteTable", version: "0.0.12" };
|
|
448
|
+
/**
|
|
449
|
+
* inverse of
|
|
450
|
+
* https://github.com/hashicorp/terraform-provider-aws/blob/v5.87.0/internal/service/ec2/vpc_route.go#L219-L239
|
|
451
|
+
*/
|
|
452
|
+
function routerTypeToPropName(routerType) {
|
|
453
|
+
const lookupMap = {
|
|
454
|
+
[vpc_1.RouterType.CARRIER_GATEWAY]: "carrierGatewayId",
|
|
455
|
+
[vpc_1.RouterType.EGRESS_ONLY_INTERNET_GATEWAY]: "egressOnlyGatewayId",
|
|
456
|
+
[vpc_1.RouterType.GATEWAY]: "gatewayId",
|
|
457
|
+
// terraform-provider-aws is missing switch case for InstanceId
|
|
458
|
+
// https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateRoute.html
|
|
459
|
+
// [RouterType.INSTANCE]: "instanceId",
|
|
460
|
+
[vpc_1.RouterType.LOCAL_GATEWAY]: "localGatewayId",
|
|
461
|
+
[vpc_1.RouterType.NAT_GATEWAY]: "natGatewayId",
|
|
462
|
+
[vpc_1.RouterType.NETWORK_INTERFACE]: "networkInterfaceId",
|
|
463
|
+
[vpc_1.RouterType.TRANSIT_GATEWAY]: "transitGatewayId",
|
|
464
|
+
[vpc_1.RouterType.VPC_PEERING_CONNECTION]: "vpcPeeringConnectionId",
|
|
465
|
+
[vpc_1.RouterType.VPC_ENDPOINT]: "vpcEndpointId",
|
|
466
|
+
};
|
|
467
|
+
return lookupMap[routerType];
|
|
468
|
+
}
|
|
469
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzL2NvbXB1dGUvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw0RkFBNEY7QUFFNUYsc0RBWTZCO0FBQzdCLGlDQUFvQztBQUVwQywrQkFBbUU7QUFDbkUsaURBSXdCO0FBRXhCLG9EQUkwQjtBQUMxQiw4Q0FBOEM7QUFDOUMsMENBQW1DO0FBQ25DLHdDQUF3QztBQUN4Qyx5Q0FBOEM7QUFDOUMsK0NBQXdEO0FBSXhEOzs7O0dBSUc7QUFDSCxJQUFZLG1CQVNYO0FBVEQsV0FBWSxtQkFBbUI7SUFDN0I7O09BRUc7SUFDSCx3Q0FBaUIsQ0FBQTtJQUNqQjs7T0FFRztJQUNILDBDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFUVyxtQkFBbUIsbUNBQW5CLG1CQUFtQixRQVM5QjtBQXNORDs7R0FFRztBQUNILE1BQU0sUUFBUSxHQUFXLE1BQU0sQ0FBQztBQUVoQzs7O0dBR0c7QUFDSCxNQUFhLHlCQUNYLFNBQVEsZ0NBQWdCO0lBR3hCLElBQVcsa0JBQWtCO1FBQzNCLE9BQU87WUFDTCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO1NBQ3BDLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ2pDLENBQUM7SUFnQkQsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBcUM7UUFFckMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLEtBQUssQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO1lBQ3hDLGVBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVB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b0JBQW9CLENBQUMsVUFBc0I7SUFDbEQsTUFBTSxTQUFTLEdBQWtEO1FBQy9ELENBQUMsZ0JBQVUsQ0FBQyxlQUFlLENBQUMsRUFBRSxrQkFBa0I7UUFDaEQsQ0FBQyxnQkFBVSxDQUFDLDRCQUE0QixDQUFDLEVBQUUscUJBQXFCO1FBQ2hFLENBQUMsZ0JBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxXQUFXO1FBQ2pDLCtEQUErRDtRQUMvRCw4RUFBOEU7UUFDOUUsdUNBQXVDO1FBQ3ZDLENBQUMsZ0JBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRSxnQkFBZ0I7UUFDNUMsQ0FBQyxnQkFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFLGNBQWM7UUFDeEMsQ0FBQyxnQkFBVSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsb0JBQW9CO1FBQ3BELENBQUMsZ0JBQVUsQ0FBQyxlQUFlLENBQUMsRUFBRSxrQkFBa0I7UUFDaEQsQ0FBQyxnQkFBVSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsd0JBQXdCO1FBQzdELENBQUMsZ0JBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxlQUFlO0tBQzNDLENBQUM7SUFDRixPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTc1LjEvcGFja2FnZXMvQGF3cy1jZGsvYXdzLWVjMi1hbHBoYS9saWIvcm91dGUudHNcblxuaW1wb3J0IHtcbiAgZWlwIGFzIHRmRWlwLFxuICBlZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5IGFzIHRmRWdyZXNzT25seUludGVybmV0R2F0ZXdheSxcbiAgaW50ZXJuZXRHYXRld2F5IGFzIHRmSW50ZXJuZXRHYXRld2F5LFxuICBuYXRHYXRld2F5IGFzIHRmTmF0R2F0ZXdheSxcbiAgdnBjUGVlcmluZ0Nvbm5lY3Rpb24gYXMgdGZWcGNQZWVyaW5nQ29ubmVjdGlvbixcbiAgcm91dGUgYXMgdGZSb3V0ZSxcbiAgcm91dGVUYWJsZSBhcyB0ZlJvdXRlVGFibGUsXG4gIHZwbkdhdGV3YXlBdHRhY2htZW50IGFzIHRmVnBuR2F0ZXdheUF0dGFjaG1lbnQsXG4gIGludGVybmV0R2F0ZXdheUF0dGFjaG1lbnQgYXMgdGZJbnRlcm5ldEdhdGV3YXlBdHRhY2htZW50LFxuICB2cG5HYXRld2F5IGFzIHRmVnBuR2F0ZXdheSxcbiAgdnBuR2F0ZXdheVJvdXRlUHJvcGFnYXRpb24gYXMgdGZWcG5HYXRld2F5Um91dGVQcm9wYWdhdGlvbixcbn0gZnJvbSBcIkBjZGt0Zi9wcm92aWRlci1hd3NcIjtcbmltcG9ydCB7IEFubm90YXRpb25zIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElEZXBlbmRhYmxlIH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IElSb3V0ZVRhYmxlLCBSb3V0ZXJUeXBlLCBSb3V0ZVRhYmxlT3V0cHV0cyB9IGZyb20gXCIuL3ZwY1wiO1xuaW1wb3J0IHtcbiAgR2F0ZXdheVZwY0VuZHBvaW50LFxuICBJVnBjRW5kcG9pbnQsXG4gIFZwY0VuZHBvaW50T3V0cHV0cyxcbn0gZnJvbSBcIi4vdnBjLWVuZHBvaW50XCI7XG5pbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCIuLi8uLi9kdXJhdGlvblwiO1xuaW1wb3J0IHtcbiAgQXdzQ29uc3RydWN0QmFzZSxcbiAgQXdzQ29uc3RydWN0UHJvcHMsXG4gIElBd3NDb25zdHJ1Y3QsXG59IGZyb20gXCIuLi9hd3MtY29uc3RydWN0XCI7XG4vLyBUT0RPOiBVc2UgVGFnTWFuYWdlciBhbmQgdGFnLWFzcGVjdCBpbnN0ZWFkXG5pbXBvcnQgeyBUYWdzIH0gZnJvbSBcIi4uL2F3cy10YWdzXCI7XG4vLyBpbXBvcnQgeyBUYWdzIH0gZnJvbSBcIi4uL3RhZy1hc3BlY3RcIjtcbmltcG9ydCB7IGFsbFJvdXRlVGFibGVJZHMgfSBmcm9tIFwiLi9lYzItdXRpbFwiO1xuaW1wb3J0IHsgTmV0d29ya1V0aWxzLCBDaWRyQmxvY2sgfSBmcm9tIFwiLi9lYzItdXRpbC12MlwiO1xuaW1wb3J0IHsgSVN1Ym5ldFYyIH0gZnJvbSBcIi4vc3VibmV0LXYyXCI7XG5pbXBvcnQgeyBJVnBjVjIsIFZQTkdhdGV3YXlWMk9wdGlvbnMgfSBmcm9tIFwiLi92cGMtdjItYmFzZVwiO1xuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBOQVQgZ2F0ZXdheSBzdXBwb3J0cyBwdWJsaWMgb3IgcHJpdmF0ZSBjb25uZWN0aXZpdHkuXG4gKiBUaGUgZGVmYXVsdCBpcyBwdWJsaWMgY29ubmVjdGl2aXR5LlxuICogU2VlOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtZWMyLW5hdGdhdGV3YXkuaHRtbCNjZm4tZWMyLW5hdGdhdGV3YXktY29ubmVjdGl2aXR5dHlwZVxuICovXG5leHBvcnQgZW51bSBOYXRDb25uZWN0aXZpdHlUeXBlIHtcbiAgLyoqXG4gICAqIFNldHMgQ29ubmVjdGl2aXR5IHR5cGUgdG8gUFVCTElDXG4gICAqL1xuICBQVUJMSUMgPSBcInB1YmxpY1wiLFxuICAvKipcbiAgICogU2V0cyBDb25uZWN0aXZpdHkgdHlwZSB0byBQUklWQVRFXG4gICAqL1xuICBQUklWQVRFID0gXCJwcml2YXRlXCIsXG59XG5cbi8qKlxuICogT3V0cHV0cyB3aGljaCBtYXkgYmUgcmVnaXN0ZXJlZCBmb3Igb3V0cHV0IHZpYSB0aGUgR3JpZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb3V0ZVRhcmdldE91dHB1dHMge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygcm91dGVyIHVzZWQgaW4gdGhlIHJvdXRlLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSByb3V0ZXJUeXBlOiBSb3V0ZXJUeXBlO1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSByb3V0ZSB0YXJnZXQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlclRhcmdldElkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIHRvIGRlZmluZSBhIHJvdXRpbmcgdGFyZ2V0LCBzdWNoIGFzIGFuXG4gKiBlZ3Jlc3Mtb25seSBpbnRlcm5ldCBnYXRld2F5IG9yIFZQQyBlbmRwb2ludC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUm91dGVUYXJnZXQgZXh0ZW5kcyBJRGVwZW5kYWJsZSB7XG4gIC8qKlxuICAgKiBUaGUgb3V0cHV0cyBvZiB0aGUgcm91dGUgdGFyZ2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVUYXJnZXRPdXRwdXRzOiBSb3V0ZVRhcmdldE91dHB1dHM7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHJvdXRlciB1c2VkIGluIHRoZSByb3V0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlclR5cGU6IFJvdXRlclR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFyZ2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVyVGFyZ2V0SWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHRvIGRlZmluZSBhbiBlZ3Jlc3Mtb25seSBpbnRlcm5ldCBnYXRld2F5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXlQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFZQQyBmb3Igd2hpY2ggdG8gY3JlYXRlIHRoZSBlZ3Jlc3Mtb25seSBpbnRlcm5ldCBnYXRld2F5LlxuICAgKi9cbiAgcmVhZG9ubHkgdnBjOiBJVnBjVjI7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBuYW1lIG9mIHRoZSBlZ3Jlc3Mtb25seSBpbnRlcm5ldCBnYXRld2F5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHByb3Zpc2lvbmVkIHdpdGhvdXQgYSByZXNvdXJjZSBuYW1lXG4gICAqL1xuICByZWFkb25seSBlZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5TmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHRvIGRlZmluZSBhbiBpbnRlcm5ldCBnYXRld2F5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVybmV0R2F0ZXdheVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgVlBDIGZvciB3aGljaCB0byBjcmVhdGUgdGhlIGludGVybmV0IGdhdGV3YXkuXG4gICAqL1xuICByZWFkb25seSB2cGM6IElWcGNWMjtcblxuICAvKipcbiAgICogVGhlIHJlc291cmNlIG5hbWUgb2YgdGhlIGludGVybmV0IGdhdGV3YXkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcHJvdmlzaW9uZWQgd2l0aG91dCBhIHJlc291cmNlIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGludGVybmV0R2F0ZXdheU5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyB0byBkZWZpbmUgYSBWUE4gZ2F0ZXdheS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWUE5HYXRld2F5VjJQcm9wc1xuICBleHRlbmRzIFZQTkdhdGV3YXlWMk9wdGlvbnMsXG4gICAgQXdzQ29uc3RydWN0UHJvcHMge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBWUEMgZm9yIHdoaWNoIHRvIGNyZWF0ZSB0aGUgVlBOIGdhdGV3YXkuXG4gICAqL1xuICByZWFkb25seSB2cGM6IElWcGNWMjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIHRvIGRlZmluZSBhIE5BVCBnYXRld2F5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hdEdhdGV3YXlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBzdWJuZXQgaW4gd2hpY2ggdGhlIE5BVCBnYXRld2F5IGlzIGxvY2F0ZWQuXG4gICAqL1xuICByZWFkb25seSBzdWJuZXQ6IElTdWJuZXRWMjtcblxuICAvKipcbiAgICogQWxsb2NhdGlvbklEIG9mIEVsYXN0aWMgSVAgYWRkcmVzcyB0aGF0J3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBOQVQgZ2F0ZXdheS4gVGhpcyBwcm9wZXJ0eSBpcyByZXF1aXJlZCBmb3IgYSBwdWJsaWMgTkFUXG4gICAqIGdhdGV3YXkgYW5kIGNhbm5vdCBiZSBzcGVjaWZpZWQgd2l0aCBhIHByaXZhdGUgTkFUIGdhdGV3YXkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXR0ci5hbGxvY2F0aW9uSUQgb2YgYSBuZXcgRWxhc3RpYyBJUCBjcmVhdGVkIGJ5IGRlZmF1bHRcbiAgICogLy9UT0RPOiBBREQgTDIgZm9yIGVsYXN0aWMgaXBcbiAgICovXG4gIHJlYWRvbmx5IGFsbG9jYXRpb25JZD86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIE5BVCBnYXRld2F5IHN1cHBvcnRzIHB1YmxpYyBvciBwcml2YXRlIGNvbm5lY3Rpdml0eS5cbiAgICpcbiAgICogQGRlZmF1bHQgTmF0Q29ubmVjdGl2aXR5VHlwZS5QdWJsaWNcbiAgICovXG4gIHJlYWRvbmx5IGNvbm5lY3Rpdml0eVR5cGU/OiBOYXRDb25uZWN0aXZpdHlUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byB3YWl0IGJlZm9yZSBmb3JjaWJseSByZWxlYXNpbmcgdGhlXG4gICAqIElQIGFkZHJlc3NlcyBpZiBjb25uZWN0aW9ucyBhcmUgc3RpbGwgaW4gcHJvZ3Jlc3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IDM1MHNlY29uZHNcbiAgICovXG4gIHJlYWRvbmx5IG1heERyYWluRHVyYXRpb24/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIHByaXZhdGUgSVB2NCBhZGRyZXNzIHRvIGFzc2lnbiB0byB0aGUgTkFUIGdhdGV3YXkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gSWYgeW91IGRvbid0IHByb3ZpZGUgYW4gYWRkcmVzcywgYSBwcml2YXRlIElQdjQgYWRkcmVzcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQuXG4gICAqL1xuICByZWFkb25seSBwcml2YXRlSXBBZGRyZXNzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZWNvbmRhcnkgRUlQIGFsbG9jYXRpb24gSURzLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS92cGMtbmF0LWdhdGV3YXkuaHRtbCNuYXQtZ2F0ZXdheS1jcmVhdGluZ1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHNlY29uZGFyeSBhbGxvY2F0aW9uIElEcyBhdHRhY2hlZCB0byBOQVRHV1xuICAgKlxuICAgKi9cbiAgcmVhZG9ubHkgc2Vjb25kYXJ5QWxsb2NhdGlvbklkcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHNlY29uZGFyeSBwcml2YXRlIElQdjQgYWRkcmVzc2VzIHlvdVxuICAgKiB3YW50IHRvIGFzc2lnbiB0byB0aGUgTkFUIGdhdGV3YXkuXG4gICAqXG4gICAqIGBTZWNvbmRhcnlQcml2YXRlSXBBZGRyZXNzQ291bnRgIGFuZCBgU2Vjb25kYXJ5UHJpdmF0ZUlwQWRkcmVzc2VzYCBjYW5ub3QgYmVcbiAgICogc2V0IGF0IHRoZSBzYW1lIHRpbWUuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvdXNlcmd1aWRlL3ZwYy1uYXQtZ2F0ZXdheS5odG1sI25hdC1nYXRld2F5LWNyZWF0aW5nXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gc2Vjb25kYXJ5IGFsbG9jYXRpb24gSURzIGFzc29jaWF0ZWQgd2l0aCBOQVRHV1xuICAgKi9cbiAgcmVhZG9ubHkgc2Vjb25kYXJ5UHJpdmF0ZUlwQWRkcmVzc0NvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTZWNvbmRhcnkgcHJpdmF0ZSBJUHY0IGFkZHJlc3Nlcy5cbiAgICpcbiAgICogYFNlY29uZGFyeVByaXZhdGVJcEFkZHJlc3NDb3VudGAgYW5kIGBTZWNvbmRhcnlQcml2YXRlSXBBZGRyZXNzZXNgIGNhbm5vdCBiZVxuICAgKiBzZXQgYXQgdGhlIHNhbWUgdGltZS5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBjL2xhdGVzdC91c2VyZ3VpZGUvdnBjLW5hdC1nYXRld2F5Lmh0bWwjbmF0LWdhdGV3YXktY3JlYXRpbmdcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBzZWNvbmRhcnkgcHJpdmF0ZSBJcEFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggTkFUR1dcbiAgICovXG4gIHJlYWRvbmx5IHNlY29uZGFyeVByaXZhdGVJcEFkZHJlc3Nlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUgTkFUIGdhdGV3YXkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTkFUR1cgcHJvdmlzaW9uZWQgd2l0aG91dCBhbnkgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmF0R2F0ZXdheU5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyB0byBkZWZpbmUgYSBOQVQgZ2F0ZXdheS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOYXRHYXRld2F5UHJvcHMgZXh0ZW5kcyBOYXRHYXRld2F5T3B0aW9ucywgQXdzQ29uc3RydWN0UHJvcHMge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBWUEMgaW4gd2hpY2ggdGhlIE5BVCBnYXRld2F5IGlzIGxvY2F0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZWxhc3RpYyBpcCBhc3NvY2lhdGVkLCByZXF1aXJlZCBpbiBjYXNlIG9mIHB1YmxpYyBjb25uZWN0aXZpdHkgaWYgYEFsbG9jYXRpb25JZGAgaXMgbm90IGRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IHZwYz86IElWcGNWMjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIHRvIGRlZmluZSBhIFZQQyBwZWVyaW5nIGNvbm5lY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVlBDUGVlcmluZ0Nvbm5lY3Rpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBWUEMgdGhhdCBpcyBhY2NlcHRpbmcgdGhlIHBlZXJpbmcgY29ubmVjdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFjY2VwdG9yVnBjOiBJVnBjVjI7XG5cbiAgLy8gVE9ETzogaGFuZGxlIGNyb3NzQWNjb3VudCBURiBQcm92aWRlciBmb3IgdnBjX3BlZXJpbmdfY29ubmVjdGlvbl9hY2NlcHRlclxuICAvLyAvKipcbiAgLy8gICogVGhlIHJvbGUgYXJuIGNyZWF0ZWQgaW4gdGhlIGFjY2VwdG9yIGFjY291bnQuXG4gIC8vICAqXG4gIC8vICAqIEBkZWZhdWx0IC0gbm8gcGVlclJvbGVBcm4gbmVlZGVkIGlmIG5vdCBjcm9zcyBhY2NvdW50IGNvbm5lY3Rpb25cbiAgLy8gICovXG4gIC8vIHJlYWRvbmx5IHBlZXJSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUgcGVlcmluZyBjb25uZWN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHBlZXJpbmcgY29ubmVjdGlvbiBwcm92aXNpb25lZCB3aXRob3V0IGFueSBuYW1lXG4gICAqL1xuICByZWFkb25seSB2cGNQZWVyaW5nQ29ubmVjdGlvbk5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyB0byBkZWZpbmUgYSBWUEMgcGVlcmluZyBjb25uZWN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZQQ1BlZXJpbmdDb25uZWN0aW9uUHJvcHMgZXh0ZW5kcyBWUENQZWVyaW5nQ29ubmVjdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIFZQQyB0aGF0IGlzIHJlcXVlc3RpbmcgdGhlIHBlZXJpbmcgY29ubmVjdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHJlcXVlc3RvclZwYzogSVZwY1YyO1xufVxuXG4vKipcbiAqIE5hbWUgdGFnIGNvbnN0YW50XG4gKi9cbmNvbnN0IE5BTUVfVEFHOiBzdHJpbmcgPSBcIk5hbWVcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVncmVzcy1vbmx5IGludGVybmV0IGdhdGV3YXlcbiAqIEByZXNvdXJjZSBhd3NfZWdyZXNzX29ubHlfaW50ZXJuZXRfZ2F0ZXdheVxuICovXG5leHBvcnQgY2xhc3MgRWdyZXNzT25seUludGVybmV0R2F0ZXdheVxuICBleHRlbmRzIEF3c0NvbnN0cnVjdEJhc2VcbiAgaW1wbGVtZW50cyBJUm91dGVUYXJnZXRcbntcbiAgcHVibGljIGdldCByb3V0ZVRhcmdldE91dHB1dHMoKTogUm91dGVUYXJnZXRPdXRwdXRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgcm91dGVyVHlwZTogdGhpcy5yb3V0ZXJUeXBlLFxuICAgICAgcm91dGVyVGFyZ2V0SWQ6IHRoaXMucm91dGVyVGFyZ2V0SWQsXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgZ2V0IG91dHB1dHMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMucm91dGVUYXJnZXRPdXRwdXRzO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiByb3V0ZXIgdXNlZCBpbiB0aGUgcm91dGUuXG4gICAqL1xuICByZWFkb25seSByb3V0ZXJUeXBlOiBSb3V0ZXJUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHJvdXRlIHRhcmdldC5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlclRhcmdldElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlZ3Jlc3Mtb25seSBpbnRlcm5ldCBnYXRld2F5IENGTiByZXNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogdGZFZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5LkVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBFZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5UHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAocHJvcHMuZWdyZXNzT25seUludGVybmV0R2F0ZXdheU5hbWUpIHtcbiAgICAgIFRhZ3Mub2YodGhpcykuYWRkKE5BTUVfVEFHLCBwcm9wcy5lZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5TmFtZSk7XG4gICAgfVxuICAgIHRoaXMucm91dGVyVHlwZSA9IFJvdXRlclR5cGUuRUdSRVNTX09OTFlfSU5URVJORVRfR0FURVdBWTtcblxuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgdGZFZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5LkVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXkoXG4gICAgICB0aGlzLFxuICAgICAgXCJFSUdXXCIsXG4gICAgICB7XG4gICAgICAgIHZwY0lkOiBwcm9wcy52cGMudnBjSWQsXG4gICAgICB9LFxuICAgICk7XG4gICAgdGhpcy5ub2RlLmRlZmF1bHRDaGlsZCA9IHRoaXMucmVzb3VyY2U7XG5cbiAgICB0aGlzLnJvdXRlclRhcmdldElkID0gdGhpcy5yZXNvdXJjZS5pZDtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gaW50ZXJuZXQgZ2F0ZXdheVxuICogQHJlc291cmNlIEFXUzo6RUMyOjpJbnRlcm5ldEdhdGV3YXlcbiAqL1xuZXhwb3J0IGNsYXNzIEludGVybmV0R2F0ZXdheSBleHRlbmRzIEF3c0NvbnN0cnVjdEJhc2UgaW1wbGVtZW50cyBJUm91dGVUYXJnZXQge1xuICBwdWJsaWMgZ2V0IHJvdXRlVGFyZ2V0T3V0cHV0cygpOiBSb3V0ZVRhcmdldE91dHB1dHMge1xuICAgIHJldHVybiB7XG4gICAgICByb3V0ZXJUeXBlOiB0aGlzLnJvdXRlclR5cGUsXG4gICAgICByb3V0ZXJUYXJnZXRJZDogdGhpcy5yb3V0ZXJUYXJnZXRJZCxcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBnZXQgb3V0cHV0cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5yb3V0ZVRhcmdldE91dHB1dHM7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHJvdXRlciB1c2VkIGluIHRoZSByb3V0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlclR5cGU6IFJvdXRlclR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFyZ2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVyVGFyZ2V0SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBWUEMgZm9yIHdoaWNoIHRvIGNyZWF0ZSB0aGUgaW50ZXJuZXQgZ2F0ZXdheS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2cGNJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJuZXQgZ2F0ZXdheSBDRk4gcmVzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2U6IHRmSW50ZXJuZXRHYXRld2F5LkludGVybmV0R2F0ZXdheTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSW50ZXJuZXRHYXRld2F5UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5yb3V0ZXJUeXBlID0gUm91dGVyVHlwZS5HQVRFV0FZO1xuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyB0ZkludGVybmV0R2F0ZXdheS5JbnRlcm5ldEdhdGV3YXkodGhpcywgXCJJR1dcIiwge30pO1xuICAgIHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgPSB0aGlzLnJlc291cmNlO1xuXG4gICAgdGhpcy5yb3V0ZXJUYXJnZXRJZCA9IHRoaXMucmVzb3VyY2UuaWQ7XG4gICAgdGhpcy52cGNJZCA9IHByb3BzLnZwYy52cGNJZDtcblxuICAgIGlmIChwcm9wcy5pbnRlcm5ldEdhdGV3YXlOYW1lKSB7XG4gICAgICBUYWdzLm9mKHRoaXMpLmFkZChOQU1FX1RBRywgcHJvcHMuaW50ZXJuZXRHYXRld2F5TmFtZSk7XG4gICAgfVxuXG4gICAgbmV3IHRmSW50ZXJuZXRHYXRld2F5QXR0YWNobWVudC5JbnRlcm5ldEdhdGV3YXlBdHRhY2htZW50KFxuICAgICAgdGhpcyxcbiAgICAgIFwiR1dBdHRhY2htZW50XCIsXG4gICAgICB7XG4gICAgICAgIHZwY0lkOiB0aGlzLnZwY0lkLFxuICAgICAgICBpbnRlcm5ldEdhdGV3YXlJZDogdGhpcy5yb3V0ZXJUYXJnZXRJZCxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB2aXJ0dWFsIHByaXZhdGUgZ2F0ZXdheVxuICogQHJlc291cmNlIEFXUzo6RUMyOjpWUE5HYXRld2F5XG4gKi9cbmV4cG9ydCBjbGFzcyBWUE5HYXRld2F5VjIgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RCYXNlIGltcGxlbWVudHMgSVJvdXRlVGFyZ2V0IHtcbiAgcHVibGljIGdldCByb3V0ZVRhcmdldE91dHB1dHMoKTogUm91dGVUYXJnZXRPdXRwdXRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgcm91dGVyVHlwZTogdGhpcy5yb3V0ZXJUeXBlLFxuICAgICAgcm91dGVyVGFyZ2V0SWQ6IHRoaXMucm91dGVyVGFyZ2V0SWQsXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgZ2V0IG91dHB1dHMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMucm91dGVUYXJnZXRPdXRwdXRzO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiByb3V0ZXIgdXNlZCBpbiB0aGUgcm91dGUuXG4gICAqL1xuICByZWFkb25seSByb3V0ZXJUeXBlOiBSb3V0ZXJUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHJvdXRlIHRhcmdldC5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlclRhcmdldElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgVlBDIGZvciB3aGljaCB0byBjcmVhdGUgdGhlIFZQTiBnYXRld2F5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZwY0lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBWUE4gZ2F0ZXdheSBDRk4gcmVzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2U6IHRmVnBuR2F0ZXdheS5WcG5HYXRld2F5O1xuXG4gIC8qKlxuICAgKiBUaGUgVlBOIEdhdGV3YXkgQXR0YWNobWVudFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfYXR0YWNobWVudDogdGZWcG5HYXRld2F5QXR0YWNobWVudC5WcG5HYXRld2F5QXR0YWNobWVudDtcblxuICAvKipcbiAgICogVGhlIFZQTiBHYXRld2F5IFJvdXRlIFByb3BhZ2F0aW9uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9yb3V0ZVByb3BhZ2F0aW9uOiB0ZlZwbkdhdGV3YXlSb3V0ZVByb3BhZ2F0aW9uLlZwbkdhdGV3YXlSb3V0ZVByb3BhZ2F0aW9uW10gPVxuICAgIFtdO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBWUE5HYXRld2F5VjJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIGNvbnN0IHZwbkdhdGV3YXlOYW1lID1cbiAgICAgIHByb3BzLnZwbkdhdGV3YXlOYW1lIHx8XG4gICAgICB0aGlzLnN0YWNrLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7XG4gICAgICAgIHByZWZpeDogdGhpcy5ncmlkVVVJRCxcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yb3V0ZXJUeXBlID0gUm91dGVyVHlwZS5HQVRFV0FZO1xuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyB0ZlZwbkdhdGV3YXkuVnBuR2F0ZXdheSh0aGlzLCBcIklHV1wiLCB7XG4gICAgICBhbWF6b25TaWRlQXNuOlxuICAgICAgICBwcm9wcy5hbWF6b25TaWRlQXNuICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHByb3BzLmFtYXpvblNpZGVBc24udG9TdHJpbmcoKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICAgIHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgPSB0aGlzLnJlc291cmNlO1xuXG4gICAgdGhpcy5yb3V0ZXJUYXJnZXRJZCA9IHRoaXMucmVzb3VyY2UuaWQ7XG5cbiAgICB0aGlzLnZwY0lkID0gcHJvcHMudnBjLnZwY0lkO1xuICAgIHRoaXMuX2F0dGFjaG1lbnQgPSBuZXcgdGZWcG5HYXRld2F5QXR0YWNobWVudC5WcG5HYXRld2F5QXR0YWNobWVudChcbiAgICAgIHRoaXMsXG4gICAgICBcIlZQQ1ZQTkdXXCIsXG4gICAgICB7XG4gICAgICAgIHZwY0lkOiB0aGlzLnZwY0lkLFxuICAgICAgICB2cG5HYXRld2F5SWQ6IHRoaXMucmVzb3VyY2UuaWQsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpZiAocHJvcHMudnBuR2F0ZXdheU5hbWUpIHtcbiAgICAgIFRhZ3Mub2YodGhpcykuYWRkKE5BTUVfVEFHLCB2cG5HYXRld2F5TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gUHJvcGFnYXRlIHJvdXRlcyBvbiByb3V0ZSB0YWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByaWdodCBzdWJuZXRzXG4gICAgY29uc3QgdnBuUm91dGVQcm9wYWdhdGlvbiA9IHByb3BzLnZwblJvdXRlUHJvcGFnYXRpb24gPz8gW107XG4gICAgY29uc3Qgc3VibmV0cyA9IHZwblJvdXRlUHJvcGFnYXRpb25cbiAgICAgIC5tYXAoKHMpID0+IHByb3BzLnZwYy5zZWxlY3RTdWJuZXRzKHMpLnN1Ym5ldHMpXG4gICAgICAuZmxhdCgpO1xuICAgIGNvbnN0IHJvdXRlVGFibGVJZHMgPSBhbGxSb3V0ZVRhYmxlSWRzKHN1Ym5ldHMpO1xuXG4gICAgaWYgKHJvdXRlVGFibGVJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBcIkBhd3MtY2RrOmF3cy1lYzItZWxwaGE6ZW5hYmxlVnBuR2F0ZXdheVYyXCIsXG4gICAgICBBbm5vdGF0aW9ucy5vZihzY29wZSkuYWRkV2FybmluZyhcbiAgICAgICAgYE5vIHN1Ym5ldHMgbWF0Y2hpbmcgc2VsZWN0aW9uOiAnJHtKU09OLnN0cmluZ2lmeSh2cG5Sb3V0ZVByb3BhZ2F0aW9uKX0nLiBTZWxlY3Qgb3RoZXIgc3VibmV0cyB0byBhZGQgcm91dGVzIHRvLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3VibmV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgcm91dGVQcm9wYWdhdGlvbiA9XG4gICAgICAgIG5ldyB0ZlZwbkdhdGV3YXlSb3V0ZVByb3BhZ2F0aW9uLlZwbkdhdGV3YXlSb3V0ZVByb3BhZ2F0aW9uKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYFJvdXRlUHJvcGFnYXRpb24ke2l9YCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICByb3V0ZVRhYmxlSWQ6IHN1Ym5ldHNbaV0ucm91dGVUYWJsZS5yb3V0ZVRhYmxlSWQsXG4gICAgICAgICAgICB2cG5HYXRld2F5SWQ6IHRoaXMucm91dGVyVGFyZ2V0SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcblxuICAgICAgLy8gVGhlIEFXUzo6RUMyOjpWUE5HYXRld2F5Um91dGVQcm9wYWdhdGlvbiByZXNvdXJjZSBjYW5ub3QgdXNlIHRoZSBWUE4gZ2F0ZXdheVxuICAgICAgLy8gdW50aWwgaXQgaGFzIHN1Y2Nlc3NmdWxseSBhdHRhY2hlZCB0byB0aGUgVlBDLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItdnBuLWdhdGV3YXlyb3V0ZXByb3AuaHRtbFxuICAgICAgcm91dGVQcm9wYWdhdGlvbi5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5fYXR0YWNobWVudCk7XG4gICAgICB0aGlzLl9yb3V0ZVByb3BhZ2F0aW9uLnB1c2gocm91dGVQcm9wYWdhdGlvbik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldHdvcmsgYWRkcmVzcyB0cmFuc2xhdGlvbiAoTkFUKSBnYXRld2F5XG4gKiBAcmVzb3VyY2UgQVdTOjpFQzI6Ok5hdEdhdGV3YXlcbiAqL1xuZXhwb3J0IGNsYXNzIE5hdEdhdGV3YXkgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RCYXNlIGltcGxlbWVudHMgSVJvdXRlVGFyZ2V0IHtcbiAgcHVibGljIGdldCByb3V0ZVRhcmdldE91dHB1dHMoKTogUm91dGVUYXJnZXRPdXRwdXRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgcm91dGVyVHlwZTogdGhpcy5yb3V0ZXJUeXBlLFxuICAgICAgcm91dGVyVGFyZ2V0SWQ6IHRoaXMucm91dGVyVGFyZ2V0SWQsXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgZ2V0IG91dHB1dHMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMucm91dGVUYXJnZXRPdXRwdXRzO1xuICB9XG4gIC8qKlxuICAgKiBJZCBvZiB0aGUgTmF0R2F0ZXdheVxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmF0R2F0ZXdheUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHJvdXRlciB1c2VkIGluIHRoZSByb3V0ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByb3V0ZXJUeXBlOiBSb3V0ZXJUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHJvdXRlIHRhcmdldC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByb3V0ZXJUYXJnZXRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgTkFUIGdhdGV3YXkgc3VwcG9ydHMgcHVibGljIG9yIHByaXZhdGUgY29ubmVjdGl2aXR5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBwdWJsaWNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0aXZpdHlUeXBlPzogTmF0Q29ubmVjdGl2aXR5VHlwZTtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdG8gd2FpdCBiZWZvcmUgZm9yY2libHkgcmVsZWFzaW5nIHRoZVxuICAgKiBJUCBhZGRyZXNzZXMgaWYgY29ubmVjdGlvbnMgYXJlIHN0aWxsIGluIHByb2dyZXNzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnMzAgbWludXRlcydcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtYXhEcmFpbkR1cmF0aW9uPzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBOQVQgZ2F0ZXdheSBDRk4gcmVzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2U6IHRmTmF0R2F0ZXdheS5OYXRHYXRld2F5O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOYXRHYXRld2F5UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5yb3V0ZXJUeXBlID0gUm91dGVyVHlwZS5OQVRfR0FURVdBWTtcblxuICAgIHRoaXMuY29ubmVjdGl2aXR5VHlwZSA9XG4gICAgICBwcm9wcy5jb25uZWN0aXZpdHlUeXBlIHx8IE5hdENvbm5lY3Rpdml0eVR5cGUuUFVCTElDO1xuICAgIHRoaXMubWF4RHJhaW5EdXJhdGlvbiA9IHByb3BzLm1heERyYWluRHVyYXRpb247XG5cbiAgICBpZiAodGhpcy5jb25uZWN0aXZpdHlUeXBlID09PSBOYXRDb25uZWN0aXZpdHlUeXBlLlBVQkxJQykge1xuICAgICAgaWYgKCFwcm9wcy52cGMgJiYgIXByb3BzLmFsbG9jYXRpb25JZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFaXRoZXIgcHJvdmlkZSB2cGMgb3IgYWxsb2NhdGlvbklkXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcm9wcy5uYXRHYXRld2F5TmFtZSkge1xuICAgICAgVGFncy5vZih0aGlzKS5hZGQoTkFNRV9UQUcsIHByb3BzPy5uYXRHYXRld2F5TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdXNlciBkb2VzIG5vdCBwcm92aWRlIEVJUCwgZ2VuZXJhdGUgb25lIGZvciB0aGVtXG4gICAgdmFyIGFJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpdml0eVR5cGUgPT09IE5hdENvbm5lY3Rpdml0eVR5cGUuUFVCTElDKSB7XG4gICAgICBpZiAoIXByb3BzLmFsbG9jYXRpb25JZCkge1xuICAgICAgICBsZXQgZWlwID0gbmV3IHRmRWlwLkVpcCh0aGlzLCBcIkVJUFwiLCB7XG4gICAgICAgICAgZG9tYWluOiBwcm9wcy52cGM/LnZwY0lkLFxuICAgICAgICB9KTtcbiAgICAgICAgYUlkID0gZWlwLmFsbG9jYXRpb25JZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFJZCA9IHByb3BzLmFsbG9jYXRpb25JZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IHRmTmF0R2F0ZXdheS5OYXRHYXRld2F5KHRoaXMsIFwiTkFUR2F0ZXdheVwiLCB7XG4gICAgICBzdWJuZXRJZDogcHJvcHMuc3VibmV0LnN1Ym5ldElkLFxuICAgICAgYWxsb2NhdGlvbklkOiBhSWQsXG4gICAgICBwcml2YXRlSXA6IHByb3BzLnByaXZhdGVJcEFkZHJlc3MsXG4gICAgICAvLyAuLi5wcm9wcyxcbiAgICAgIGNvbm5lY3Rpdml0eVR5cGU6IHByb3BzLmNvbm5lY3Rpdml0eVR5cGUsXG4gICAgICBzZWNvbmRhcnlBbGxvY2F0aW9uSWRzOiBwcm9wcy5zZWNvbmRhcnlBbGxvY2F0aW9uSWRzLFxuICAgICAgc2Vjb25kYXJ5UHJpdmF0ZUlwQWRkcmVzc0NvdW50OiBwcm9wcy5zZWNvbmRhcnlQcml2YXRlSXBBZGRyZXNzQ291bnQsXG4gICAgICBzZWNvbmRhcnlQcml2YXRlSXBBZGRyZXNzZXM6IHByb3BzLnNlY29uZGFyeVByaXZhdGVJcEFkZHJlc3NlcyxcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItbmF0Z2F0ZXdheS5odG1sI2Nmbi1lYzItbmF0Z2F0ZXdheS1tYXhkcmFpbmR1cmF0aW9uc2Vjb25kc1xuICAgICAgLy8gaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS42OC4wL2RvY3MvcmVzb3VyY2VzL25hdF9nYXRld2F5I3RpbWVvdXRzXG4gICAgICAuLi4odGhpcy5tYXhEcmFpbkR1cmF0aW9uXG4gICAgICAgID8ge1xuICAgICAgICAgICAgdGltZW91dHM6IHtcbiAgICAgICAgICAgICAgZGVsZXRlOiB0aGlzLm1heERyYWluRHVyYXRpb24udG9TZWNvbmRzKCkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICB9KTtcbiAgICB0aGlzLm5hdEdhdGV3YXlJZCA9IHRoaXMucmVzb3VyY2UuaWQ7XG5cbiAgICB0aGlzLnJvdXRlclRhcmdldElkID0gdGhpcy5yZXNvdXJjZS5pZDtcbiAgICB0aGlzLm5vZGUuZGVmYXVsdENoaWxkID0gdGhpcy5yZXNvdXJjZTtcbiAgICB0aGlzLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5zdWJuZXQuaW50ZXJuZXRDb25uZWN0aXZpdHlFc3RhYmxpc2hlZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcGVlcmluZyBjb25uZWN0aW9uIGJldHdlZW4gdHdvIFZQQ3NcbiAqIEByZXNvdXJjZSBBV1M6OkVDMjo6VlBDUGVlcmluZ0Nvbm5lY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFZQQ1BlZXJpbmdDb25uZWN0aW9uXG4gIGV4dGVuZHMgQXdzQ29uc3RydWN0QmFzZVxuICBpbXBsZW1lbnRzIElSb3V0ZVRhcmdldFxue1xuICBwdWJsaWMgZ2V0IHJvdXRlVGFyZ2V0T3V0cHV0cygpOiBSb3V0ZVRhcmdldE91dHB1dHMge1xuICAgIHJldHVybiB7XG4gICAgICByb3V0ZXJUeXBlOiB0aGlzLnJvdXRlclR5cGUsXG4gICAgICByb3V0ZXJUYXJnZXRJZDogdGhpcy5yb3V0ZXJUYXJnZXRJZCxcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBnZXQgb3V0cHV0cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5yb3V0ZVRhcmdldE91dHB1dHM7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHJvdXRlciB1c2VkIGluIHRoZSByb3V0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlclR5cGU6IFJvdXRlclR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFyZ2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVyVGFyZ2V0SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFZQQyBwZWVyaW5nIGNvbm5lY3Rpb24gQ0ZOIHJlc291cmNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlOiB0ZlZwY1BlZXJpbmdDb25uZWN0aW9uLlZwY1BlZXJpbmdDb25uZWN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBWUENQZWVyaW5nQ29ubmVjdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMucm91dGVyVHlwZSA9IFJvdXRlclR5cGUuVlBDX1BFRVJJTkdfQ09OTkVDVElPTjtcblxuICAgIC8vIGNvbnN0IGlzQ3Jvc3NBY2NvdW50ID1cbiAgICAvLyAgIHByb3BzLnJlcXVlc3RvclZwYy5vd25lckFjY291bnRJZCAhPT0gcHJvcHMuYWNjZXB0b3JWcGMub3duZXJBY2NvdW50SWQ7XG5cbiAgICAvLyBpZiAoIWlzQ3Jvc3NBY2NvdW50ICYmIHByb3BzLnBlZXJSb2xlQXJuKSB7XG4gICAgLy8gICB0aHJvdyBuZXcgRXJyb3IoXCJwZWVyUm9sZUFybiBpcyBub3QgbmVlZGVkIGZvciBzYW1lIGFjY291bnQgcGVlcmluZ1wiKTtcbiAgICAvLyB9XG5cbiAgICAvLyBpZiAoaXNDcm9zc0FjY291bnQgJiYgIXByb3BzLnBlZXJSb2xlQXJuKSB7XG4gICAgLy8gICB0aHJvdyBuZXcgRXJyb3IoXCJDcm9zcyBhY2NvdW50IFZQQyBwZWVyaW5nIHJlcXVpcmVzIHBlZXJSb2xlQXJuXCIpO1xuICAgIC8vIH1cblxuICAgIGNvbnN0IG92ZXJsYXAgPSB0aGlzLnZhbGlkYXRlVnBjQ2lkck92ZXJsYXAoXG4gICAgICBwcm9wcy5yZXF1ZXN0b3JWcGMsXG4gICAgICBwcm9wcy5hY2NlcHRvclZwYyxcbiAgICApO1xuICAgIGlmIChvdmVybGFwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ0lEUiBibG9jayBzaG91bGQgbm90IG92ZXJsYXAgd2l0aCBlYWNoIG90aGVyIGZvciBlc3RhYmxpc2hpbmcgYSBwZWVyaW5nIGNvbm5lY3Rpb25cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChwcm9wcy52cGNQZWVyaW5nQ29ubmVjdGlvbk5hbWUpIHtcbiAgICAgIFRhZ3Mub2YodGhpcykuYWRkKE5BTUVfVEFHLCBwcm9wcy52cGNQZWVyaW5nQ29ubmVjdGlvbk5hbWUpO1xuICAgIH1cblxuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgdGZWcGNQZWVyaW5nQ29ubmVjdGlvbi5WcGNQZWVyaW5nQ29ubmVjdGlvbihcbiAgICAgIHRoaXMsXG4gICAgICBcIlZQQ1BlZXJpbmdDb25uZWN0aW9uXCIsXG4gICAgICB7XG4gICAgICAgIHZwY0lkOiBwcm9wcy5yZXF1ZXN0b3JWcGMudnBjSWQsXG4gICAgICAgIHBlZXJWcGNJZDogcHJvcHMuYWNjZXB0b3JWcGMudnBjSWQsXG4gICAgICAgIHBlZXJPd25lcklkOiBwcm9wcy5hY2NlcHRvclZwYy5vd25lckFjY291bnRJZCxcbiAgICAgICAgcGVlclJlZ2lvbjogcHJvcHMuYWNjZXB0b3JWcGMucmVnaW9uLCAvLyBhdXRvQWNjZXB0IG11c3QgYmUgZmFsc2VcbiAgICAgICAgLy8gVE9ETzogaGFuZGxlIGNyb3NzQWNjb3VudCBURiBQcm92aWRlciBmb3IgdnBjX3BlZXJpbmdfY29ubmVjdGlvbl9hY2NlcHRlclxuICAgICAgICAvLyBwZWVyUm9sZUFybjogaXNDcm9zc0FjY291bnQgPyBwcm9wcy5wZWVyUm9sZUFybiA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgKTtcbiAgICAvLyBUT0RPOiBBZGQgYXdzX3ZwY19wZWVyaW5nX2Nvbm5lY3Rpb25fYWNjZXB0ZXIgdG8gbWFuYWdlIEFjY2VwdGVyIFNpZGU/XG5cbiAgICB0aGlzLnJvdXRlclRhcmdldElkID0gdGhpcy5yZXNvdXJjZS5pZDtcbiAgICB0aGlzLm5vZGUuZGVmYXVsdENoaWxkID0gdGhpcy5yZXNvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgaWYgdGhlIHByb3ZpZGVkIElQdjQgQ0lEUiBibG9jayBvdmVybGFwcyB3aXRoIGV4aXN0aW5nIHN1Ym5ldCBDSURSIGJsb2NrcyB3aXRoaW4gdGhlIGdpdmVuIFZQQy5cbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3RvclZwYyBUaGUgVlBDIG9mIHRoZSByZXF1ZXN0b3IuXG4gICAqIEBwYXJhbSBhY2NlcHRvclZwYyBUaGUgVlBDIG9mIHRoZSBhY2NlcHRvci5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgSVB2NCBDSURSIGJsb2NrIG92ZXJsYXBzIHdpdGggZWFjaCBvdGhlciBmb3IgdHdvIFZQQ3MsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVnBjQ2lkck92ZXJsYXAoXG4gICAgcmVxdWVzdG9yVnBjOiBJVnBjVjIsXG4gICAgYWNjZXB0b3JWcGM6IElWcGNWMixcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVxdWVzdG9yQ2lkcnMgPSBbcmVxdWVzdG9yVnBjLmlwdjRDaWRyQmxvY2tdO1xuICAgIGNvbnN0IGFjY2VwdG9yQ2lkcnMgPSBbYWNjZXB0b3JWcGMuaXB2NENpZHJCbG9ja107XG5cbiAgICBpZiAocmVxdWVzdG9yVnBjLnNlY29uZGFyeUNpZHJCbG9jaykge1xuICAgICAgcmVxdWVzdG9yQ2lkcnMucHVzaChcbiAgICAgICAgLi4ucmVxdWVzdG9yVnBjLnNlY29uZGFyeUNpZHJCbG9ja1xuICAgICAgICAgIC5tYXAoKGJsb2NrKSA9PiBibG9jay5jaWRyQmxvY2spXG4gICAgICAgICAgLmZpbHRlcigoY2lkcik6IGNpZHIgaXMgc3RyaW5nID0+IGNpZHIgIT09IHVuZGVmaW5lZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhY2NlcHRvclZwYy5zZWNvbmRhcnlDaWRyQmxvY2spIHtcbiAgICAgIGFjY2VwdG9yQ2lkcnMucHVzaChcbiAgICAgICAgLi4uYWNjZXB0b3JWcGMuc2Vjb25kYXJ5Q2lkckJsb2NrXG4gICAgICAgICAgLm1hcCgoYmxvY2spID0+IGJsb2NrLmNpZHJCbG9jaylcbiAgICAgICAgICAuZmlsdGVyKChjaWRyKTogY2lkciBpcyBzdHJpbmcgPT4gY2lkciAhPT0gdW5kZWZpbmVkKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZXF1ZXN0b3JDaWRyIG9mIHJlcXVlc3RvckNpZHJzKSB7XG4gICAgICBjb25zdCByZXF1ZXN0b3JSYW5nZSA9IG5ldyBDaWRyQmxvY2socmVxdWVzdG9yQ2lkcik7XG4gICAgICBjb25zdCByZXF1ZXN0b3JJcFJhbmdlOiBbc3RyaW5nLCBzdHJpbmddID0gW1xuICAgICAgICByZXF1ZXN0b3JSYW5nZS5taW5JcCgpLFxuICAgICAgICByZXF1ZXN0b3JSYW5nZS5tYXhJcCgpLFxuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCBhY2NlcHRvckNpZHIgb2YgYWNjZXB0b3JDaWRycykge1xuICAgICAgICBjb25zdCBhY2NlcHRvclJhbmdlID0gbmV3IENpZHJCbG9jayhhY2NlcHRvckNpZHIpO1xuICAgICAgICBjb25zdCBhY2NlcHRvcklwUmFuZ2U6IFtzdHJpbmcsIHN0cmluZ10gPSBbXG4gICAgICAgICAgYWNjZXB0b3JSYW5nZS5taW5JcCgpLFxuICAgICAgICAgIGFjY2VwdG9yUmFuZ2UubWF4SXAoKSxcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAocmVxdWVzdG9yUmFuZ2UucmFuZ2VzT3ZlcmxhcChhY2NlcHRvcklwUmFuZ2UsIHJlcXVlc3RvcklwUmFuZ2UpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBlbmRwb2ludCBvciBnYXRld2F5IGJlaW5nIHRhcmdldGVkIGJ5IHRoZSByb3V0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb3V0ZVRhcmdldFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBnYXRld2F5IHJvdXRlIHRhcmdldC4gVGhpcyBpcyB1c2VkIGZvciB0YXJnZXRzIHN1Y2ggYXNcbiAgICogZWdyZXNzLW9ubHkgaW50ZXJuZXQgZ2F0ZXdheSBvciBWUEMgcGVlcmluZyBjb25uZWN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRhcmdldCBpcyBub3Qgc2V0IHRvIGEgZ2F0ZXdheSwgaW4gdGhpcyBjYXNlIGFuIGVuZHBvaW50IGlzIG5lZWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGdhdGV3YXk/OiBJUm91dGVUYXJnZXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBlbmRwb2ludCByb3V0ZSB0YXJnZXQuIFRoaXMgaXMgdXNlZCBmb3IgdGFyZ2V0cyBzdWNoIGFzXG4gICAqIFZQQyBlbmRwb2ludHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGFyZ2V0IGlzIG5vdCBzZXQgdG8gYW4gZW5kcG9pbnQsIGluIHRoaXMgY2FzZSBhIGdhdGV3YXkgaXMgbmVlZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnQ/OiBJVnBjRW5kcG9pbnQ7XG59XG5cbi8qKlxuICogVGhlIGdhdGV3YXkgb3IgZW5kcG9pbnQgdGFyZ2V0ZWQgYnkgdGhlIHJvdXRlLlxuICovXG5leHBvcnQgY2xhc3MgUm91dGVUYXJnZXRUeXBlIHtcbiAgLyoqXG4gICAqIFRoZSBnYXRld2F5IHJvdXRlIHRhcmdldC4gVGhpcyBpcyB1c2VkIGZvciB0YXJnZXRzIHN1Y2ggYXNcbiAgICogZWdyZXNzLW9ubHkgaW50ZXJuZXQgZ2F0ZXdheSBvciBWUEMgcGVlcmluZyBjb25uZWN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRhcmdldCBpcyBub3Qgc2V0IHRvIGEgZ2F0ZXdheSwgaW4gdGhpcyBjYXNlIGFuIGVuZHBvaW50IGlzIG5lZWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGdhdGV3YXk/OiBJUm91dGVUYXJnZXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBlbmRwb2ludCByb3V0ZSB0YXJnZXQuIFRoaXMgaXMgdXNlZCBmb3IgdGFyZ2V0cyBzdWNoIGFzXG4gICAqIFZQQyBlbmRwb2ludHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGFyZ2V0IGlzIG5vdCBzZXQgdG8gYW4gZW5kcG9pbnQsIGluIHRoaXMgY2FzZSBhIGdhdGV3YXkgaXMgbmVlZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnQ/OiBJVnBjRW5kcG9pbnQ7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFJvdXRlVGFyZ2V0UHJvcHMpIHtcbiAgICBpZiAoXG4gICAgICAocHJvcHMuZ2F0ZXdheSAmJiBwcm9wcy5lbmRwb2ludCkgfHxcbiAgICAgICghcHJvcHMuZ2F0ZXdheSAmJiAhcHJvcHMuZW5kcG9pbnQpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiRXhhY3RseSBvbmUgb2YgYGdhdGV3YXlgIG9yIGBlbmRwb2ludGAgbXVzdCBiZSBzcGVjaWZpZWQuXCIsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdhdGV3YXkgPSBwcm9wcy5nYXRld2F5O1xuICAgICAgdGhpcy5lbmRwb2ludCA9IHByb3BzLmVuZHBvaW50O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIE91dHB1dHMgd2hpY2ggbWF5IGJlIHJlZ2lzdGVyZWQgZm9yIG91dHB1dCB2aWEgdGhlIEdyaWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVPdXRwdXRzIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFibGUgZm9yIHRoZSByb3V0ZS5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVUYWJsZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSVB2NCBvciBJUHY2IENJRFIgYmxvY2sgdXNlZCBmb3IgdGhlIGRlc3RpbmF0aW9uIG1hdGNoLlxuICAgKlxuICAgKiBSb3V0aW5nIGRlY2lzaW9ucyBhcmUgYmFzZWQgb24gdGhlIG1vc3Qgc3BlY2lmaWMgbWF0Y2guXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBnYXRld2F5IG9yIGVuZHBvaW50IHRhcmdldGVkIGJ5IHRoZSByb3V0ZS5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0OiBSb3V0ZVRhcmdldE91dHB1dHMgfCBWcGNFbmRwb2ludE91dHB1dHM7XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIHRvIGRlZmluZSBhIHJvdXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElSb3V0ZVYyIGV4dGVuZHMgSUF3c0NvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgb3V0cHV0cyBvZiB0aGUgcm91dGUuXG4gICAqL1xuICByZWFkb25seSByb3V0ZU91dHB1dHM6IFJvdXRlT3V0cHV0cztcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFibGUgZm9yIHRoZSByb3V0ZS5cbiAgICogQGF0dHJpYnV0ZSByb3V0ZVRhYmxlXG4gICAqL1xuICByZWFkb25seSByb3V0ZVRhYmxlOiBJUm91dGVUYWJsZTtcblxuICAvKipcbiAgICogVGhlIElQdjQgb3IgSVB2NiBDSURSIGJsb2NrIHVzZWQgZm9yIHRoZSBkZXN0aW5hdGlvbiBtYXRjaC5cbiAgICpcbiAgICogUm91dGluZyBkZWNpc2lvbnMgYXJlIGJhc2VkIG9uIHRoZSBtb3N0IHNwZWNpZmljIG1hdGNoLlxuICAgKiBUT0RPOiBMb29rIGZvciBzdHJvbmcgSVAgdHlwZSBpbXBsZW1lbnRhdGlvbiBoZXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGdhdGV3YXkgb3IgZW5kcG9pbnQgdGFyZ2V0ZWQgYnkgdGhlIHJvdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0OiBSb3V0ZVRhcmdldFR5cGU7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyB0byBkZWZpbmUgYSByb3V0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb3V0ZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFibGUgZm9yIHRoZSByb3V0ZS5cbiAgICpcbiAgICogQGF0dHJpYnV0ZSByb3V0ZVRhYmxlXG4gICAqL1xuICByZWFkb25seSByb3V0ZVRhYmxlOiBJUm91dGVUYWJsZTtcblxuICAvKipcbiAgICogVGhlIElQdjQgb3IgSVB2NiBDSURSIGJsb2NrIHVzZWQgZm9yIHRoZSBkZXN0aW5hdGlvbiBtYXRjaC5cbiAgICpcbiAgICogUm91dGluZyBkZWNpc2lvbnMgYXJlIGJhc2VkIG9uIHRoZSBtb3N0IHNwZWNpZmljIG1hdGNoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGdhdGV3YXkgb3IgZW5kcG9pbnQgdGFyZ2V0ZWQgYnkgdGhlIHJvdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0OiBSb3V0ZVRhcmdldFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBuYW1lIG9mIHRoZSByb3V0ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBwcm92aXNpb25lZCB3aXRob3V0IGEgcm91dGUgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcm91dGUgd2l0aCBhZGRlZCBmdW5jdGlvbmFsaXR5LlxuICogQHJlc291cmNlIEFXUzo6RUMyOjpSb3V0ZVxuICovXG5leHBvcnQgY2xhc3MgUm91dGUgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RCYXNlIGltcGxlbWVudHMgSVJvdXRlVjIge1xuICBwdWJsaWMgZ2V0IHJvdXRlT3V0cHV0cygpOiBSb3V0ZU91dHB1dHMge1xuICAgIHJldHVybiB7XG4gICAgICByb3V0ZVRhYmxlOiB0aGlzLnJvdXRlVGFibGUucm91dGVUYWJsZUlkLFxuICAgICAgZGVzdGluYXRpb246IHRoaXMuZGVzdGluYXRpb24sXG4gICAgICB0YXJnZXQ6IHRoaXMudGFyZ2V0LmVuZHBvaW50XG4gICAgICAgID8gdGhpcy50YXJnZXQuZW5kcG9pbnQudnBjRW5kcG9pbnRPdXRwdXRzXG4gICAgICAgIDogdGhpcy50YXJnZXQuZ2F0ZXdheSEucm91dGVUYXJnZXRPdXRwdXRzLFxuICAgIH07XG4gIH1cbiAgcHVibGljIGdldCBvdXRwdXRzKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJvdXRlT3V0cHV0cztcbiAgfVxuICAvKipcbiAgICogVGhlIElQdjQgb3IgSVB2NiBDSURSIGJsb2NrIHVzZWQgZm9yIHRoZSBkZXN0aW5hdGlvbiBtYXRjaC5cbiAgICpcbiAgICogUm91dGluZyBkZWNpc2lvbnMgYXJlIGJhc2VkIG9uIHRoZSBtb3N0IHNwZWNpZmljIG1hdGNoLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlc3RpbmF0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBnYXRld2F5IG9yIGVuZHBvaW50IHRhcmdldGVkIGJ5IHRoZSByb3V0ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0YXJnZXQ6IFJvdXRlVGFyZ2V0VHlwZTtcblxuICAvKipcbiAgICogVGhlIHJvdXRlIHRhYmxlIGZvciB0aGUgcm91dGUuXG4gICAqIEBhdHRyaWJ1dGUgcm91dGVUYWJsZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvdXRlVGFibGU6IElSb3V0ZVRhYmxlO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiByb3V0ZXIgdGhlIHJvdXRlIGlzIHRhcmdldGluZ1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhcmdldFJvdXRlclR5cGU6IFJvdXRlclR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSByb3V0ZSBDRk4gcmVzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2U/OiB0ZlJvdXRlLlJvdXRlO1xuXG4gIC8qKlxuICAgKiBEZXN0aW5hdGlvbiBjaWRyIGJsb2NrIGZvciBpcHY2XG4gICAqL1xuICBwcml2YXRlIGRlc3RpbmF0aW9uSXB2NkNpZHI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlc3RpbmF0aW9uIGNpZHIgYmxvY2sgZm9yIGlwdjRcbiAgICovXG4gIHByaXZhdGUgZGVzdGluYXRpb25JcHY0Q2lkcj86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUm91dGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLnRhcmdldCA9IHByb3BzLnRhcmdldDtcbiAgICB0aGlzLnJvdXRlVGFibGUgPSBwcm9wcy5yb3V0ZVRhYmxlO1xuICAgIHRoaXMuZGVzdGluYXRpb24gPSBwcm9wcy5kZXN0aW5hdGlvbjtcbiAgICBjb25zdCBpc0Rlc3RpbmF0aW9uSXB2NCA9IE5ldHdvcmtVdGlscy52YWxpZElwKHByb3BzLmRlc3RpbmF0aW9uKTtcbiAgICBpZiAoIWlzRGVzdGluYXRpb25JcHY0KSB7XG4gICAgICAvL1RPRE8gVmFsaWRhdGUgZm9yIElQdjYgQ0lEUiByYW5nZVxuICAgICAgdGhpcy5kZXN0aW5hdGlvbklwdjZDaWRyID0gcHJvcHMuZGVzdGluYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVzdGluYXRpb25JcHY0Q2lkciA9IHByb3BzLmRlc3RpbmF0aW9uO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMudGFyZ2V0LmdhdGV3YXk/LnJvdXRlclR5cGUgPT09XG4gICAgICAgIFJvdXRlclR5cGUuRUdSRVNTX09OTFlfSU5URVJORVRfR0FURVdBWSAmJlxuICAgICAgaXNEZXN0aW5hdGlvbklwdjRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJFZ3Jlc3Mgb25seSBpbnRlcm5ldCBnYXRld2F5IGRvZXMgbm90IHN1cHBvcnQgSVB2NCByb3V0aW5nXCIsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnRhcmdldFJvdXRlclR5cGUgPSB0aGlzLnRhcmdldC5nYXRld2F5XG4gICAgICA/IHRoaXMudGFyZ2V0LmdhdGV3YXkucm91dGVyVHlwZVxuICAgICAgOiBSb3V0ZXJUeXBlLlZQQ19FTkRQT0lOVDtcbiAgICAvLyBHYXRld2F5IGdlbmVyYXRlcyByb3V0ZSBhdXRvbWF0aWNhbGx5IHZpYSBpdHMgUm91dGVUYWJsZSwgdGh1cyB3ZSBkb24ndCBuZWVkIHRvIGdlbmVyYXRlIHRoZSByZXNvdXJjZSBmb3IgaXRcbiAgICBpZiAoISh0aGlzLnRhcmdldC5lbmRwb2ludCBpbnN0YW5jZW9mIEdhdGV3YXlWcGNFbmRwb2ludCkpIHtcbiAgICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgdGZSb3V0ZS5Sb3V0ZSh0aGlzLCBcIlJvdXRlXCIsIHtcbiAgICAgICAgcm91dGVUYWJsZUlkOiB0aGlzLnJvdXRlVGFibGUucm91dGVUYWJsZUlkLFxuICAgICAgICBkZXN0aW5hdGlvbkNpZHJCbG9jazogdGhpcy5kZXN0aW5hdGlvbklwdjRDaWRyLFxuICAgICAgICBkZXN0aW5hdGlvbklwdjZDaWRyQmxvY2s6IHRoaXMuZGVzdGluYXRpb25JcHY2Q2lkcixcbiAgICAgICAgW3JvdXRlclR5cGVUb1Byb3BOYW1lKHRoaXMudGFyZ2V0Um91dGVyVHlwZSldOiB0aGlzLnRhcmdldC5nYXRld2F5XG4gICAgICAgICAgPyB0aGlzLnRhcmdldC5nYXRld2F5LnJvdXRlclRhcmdldElkXG4gICAgICAgICAgOiB0aGlzLnRhcmdldC5lbmRwb2ludFxuICAgICAgICAgICAgPyB0aGlzLnRhcmdldC5lbmRwb2ludC52cGNFbmRwb2ludElkXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5ub2RlLmRlZmF1bHRDaGlsZCA9IHRoaXMucmVzb3VyY2U7XG5cbiAgICAvL0NyZWF0ZSBhIHJvdXRlIG9ubHkgYWZ0ZXIgdGFyZ2V0IGdhdGV3YXkgb3IgZW5kcG9pbnQgaXMgY3JlYXRlZFxuICAgIGlmICh0aGlzLnRhcmdldC5nYXRld2F5KSB7XG4gICAgICB0aGlzLm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLnRhcmdldC5nYXRld2F5KTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGFyZ2V0LmVuZHBvaW50KSB7XG4gICAgICB0aGlzLm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLnRhcmdldC5lbmRwb2ludCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUHJvcGVydGllcyB0byBkZWZpbmUgYSByb3V0ZSB0YWJsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb3V0ZVRhYmxlUHJvcHMge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBWUEMuXG4gICAqL1xuICByZWFkb25seSB2cGM6IElWcGNWMjtcblxuICAvKipcbiAgICogVGhlIHJlc291cmNlIG5hbWUgb2YgdGhlIHJvdXRlIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHByb3Zpc2lvbmVkIHdpdGhvdXQgYSByb3V0ZSB0YWJsZSBuYW1lXG4gICAqL1xuICByZWFkb25seSByb3V0ZVRhYmxlTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcm91dGUgdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgVlBDXG4gKiBAcmVzb3VyY2UgYXdzX3JvdXRlX3RhYmxlXG4gKi9cbmV4cG9ydCBjbGFzcyBSb3V0ZVRhYmxlIGV4dGVuZHMgQXdzQ29uc3RydWN0QmFzZSBpbXBsZW1lbnRzIElSb3V0ZVRhYmxlIHtcbiAgcHVibGljIGdldCByb3V0ZVRhYmxlT3V0cHV0cygpOiBSb3V0ZVRhYmxlT3V0cHV0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJvdXRlVGFibGVJZDogdGhpcy5yb3V0ZVRhYmxlSWQsXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgZ2V0IG91dHB1dHMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMucm91dGVUYWJsZU91dHB1dHM7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm91dGUgdGFibGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm91dGVUYWJsZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByb3V0ZSB0YWJsZSBDRk4gcmVzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2U6IHRmUm91dGVUYWJsZS5Sb3V0ZVRhYmxlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBSb3V0ZVRhYmxlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyB0ZlJvdXRlVGFibGUuUm91dGVUYWJsZSh0aGlzLCBcIlJvdXRlVGFibGVcIiwge1xuICAgICAgdnBjSWQ6IHByb3BzLnZwYy52cGNJZCxcbiAgICB9KTtcbiAgICBpZiAocHJvcHMucm91dGVUYWJsZU5hbWUpIHtcbiAgICAgIFRhZ3Mub2YodGhpcykuYWRkKE5BTUVfVEFHLCBwcm9wcy5yb3V0ZVRhYmxlTmFtZSk7XG4gICAgfVxuICAgIHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgPSB0aGlzLnJlc291cmNlO1xuXG4gICAgdGhpcy5yb3V0ZVRhYmxlSWQgPSB0aGlzLnJlc291cmNlLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcgY3VzdG9tIHJvdXRlIHRvIHRoZSByb3V0ZSB0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIGRlc3RpbmF0aW9uIFRoZSBJUHY0IG9yIElQdjYgQ0lEUiBibG9jayB1c2VkIGZvciB0aGUgZGVzdGluYXRpb24gbWF0Y2guXG4gICAqIEBwYXJhbSB0YXJnZXQgVGhlIGdhdGV3YXkgb3IgZW5kcG9pbnQgdGFyZ2V0ZWQgYnkgdGhlIHJvdXRlLlxuICAgKiBAcGFyYW0gcm91dGVOYW1lIFRoZSByZXNvdXJjZSBuYW1lIG9mIHRoZSByb3V0ZS5cbiAgICovXG4gIHB1YmxpYyBhZGRSb3V0ZShcbiAgICBpZDogc3RyaW5nLFxuICAgIGRlc3RpbmF0aW9uOiBzdHJpbmcsXG4gICAgdGFyZ2V0OiBSb3V0ZVRhcmdldFR5cGUsXG4gICAgcm91dGVOYW1lPzogc3RyaW5nLFxuICApIHtcbiAgICBuZXcgUm91dGUodGhpcywgaWQsIHtcbiAgICAgIHJvdXRlVGFibGU6IHRoaXMsXG4gICAgICBkZXN0aW5hdGlvbjogZGVzdGluYXRpb24sXG4gICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgIHJvdXRlTmFtZTogcm91dGVOYW1lLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogaW52ZXJzZSBvZlxuICogaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tcHJvdmlkZXItYXdzL2Jsb2IvdjUuODcuMC9pbnRlcm5hbC9zZXJ2aWNlL2VjMi92cGNfcm91dGUuZ28jTDIxOS1MMjM5XG4gKi9cbmZ1bmN0aW9uIHJvdXRlclR5cGVUb1Byb3BOYW1lKHJvdXRlclR5cGU6IFJvdXRlclR5cGUpIHtcbiAgY29uc3QgbG9va3VwTWFwOiBSZWNvcmQ8Um91dGVyVHlwZSwga2V5b2YgdGZSb3V0ZS5Sb3V0ZUNvbmZpZz4gPSB7XG4gICAgW1JvdXRlclR5cGUuQ0FSUklFUl9HQVRFV0FZXTogXCJjYXJyaWVyR2F0ZXdheUlkXCIsXG4gICAgW1JvdXRlclR5cGUuRUdSRVNTX09OTFlfSU5URVJORVRfR0FURVdBWV06IFwiZWdyZXNzT25seUdhdGV3YXlJZFwiLFxuICAgIFtSb3V0ZXJUeXBlLkdBVEVXQVldOiBcImdhdGV3YXlJZFwiLFxuICAgIC8vIHRlcnJhZm9ybS1wcm92aWRlci1hd3MgaXMgbWlzc2luZyBzd2l0Y2ggY2FzZSBmb3IgSW5zdGFuY2VJZFxuICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlUm91dGUuaHRtbFxuICAgIC8vIFtSb3V0ZXJUeXBlLklOU1RBTkNFXTogXCJpbnN0YW5jZUlkXCIsXG4gICAgW1JvdXRlclR5cGUuTE9DQUxfR0FURVdBWV06IFwibG9jYWxHYXRld2F5SWRcIixcbiAgICBbUm91dGVyVHlwZS5OQVRfR0FURVdBWV06IFwibmF0R2F0ZXdheUlkXCIsXG4gICAgW1JvdXRlclR5cGUuTkVUV09SS19JTlRFUkZBQ0VdOiBcIm5ldHdvcmtJbnRlcmZhY2VJZFwiLFxuICAgIFtSb3V0ZXJUeXBlLlRSQU5TSVRfR0FURVdBWV06IFwidHJhbnNpdEdhdGV3YXlJZFwiLFxuICAgIFtSb3V0ZXJUeXBlLlZQQ19QRUVSSU5HX0NPTk5FQ1RJT05dOiBcInZwY1BlZXJpbmdDb25uZWN0aW9uSWRcIixcbiAgICBbUm91dGVyVHlwZS5WUENfRU5EUE9JTlRdOiBcInZwY0VuZHBvaW50SWRcIixcbiAgfTtcbiAgcmV0dXJuIGxvb2t1cE1hcFtyb3V0ZXJUeXBlXTtcbn1cbiJdfQ==
|