terraconstructs 0.0.8
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/.envrc +5 -0
- package/.jsii +79780 -0
- package/.mise.toml +8 -0
- package/.nvmrc +1 -0
- package/.terraform-version +1 -0
- package/.terraform.d/plugin-cache/.gitignore +5 -0
- package/LICENSE +674 -0
- package/NOTICE.txt +12 -0
- package/README.md +42 -0
- package/bun.lockb +0 -0
- package/go.mod +158 -0
- package/go.sum +1206 -0
- package/lib/aws/arn.d.ts +187 -0
- package/lib/aws/arn.js +383 -0
- package/lib/aws/aws-construct.d.ts +76 -0
- package/lib/aws/aws-construct.js +38 -0
- package/lib/aws/aws-stack.d.ts +201 -0
- package/lib/aws/aws-stack.js +303 -0
- package/lib/aws/cloudwatch/actions/ec2.d.ts +35 -0
- package/lib/aws/cloudwatch/actions/ec2.js +48 -0
- package/lib/aws/cloudwatch/actions/index.d.ts +2 -0
- package/lib/aws/cloudwatch/actions/index.js +24 -0
- package/lib/aws/cloudwatch/actions/lambda.d.ts +16 -0
- package/lib/aws/cloudwatch/actions/lambda.js +48 -0
- package/lib/aws/cloudwatch/alarm-action.d.ts +23 -0
- package/lib/aws/cloudwatch/alarm-action.js +4 -0
- package/lib/aws/cloudwatch/alarm-base.d.ts +84 -0
- package/lib/aws/cloudwatch/alarm-base.js +64 -0
- package/lib/aws/cloudwatch/alarm-rule.d.ts +61 -0
- package/lib/aws/cloudwatch/alarm-rule.js +116 -0
- package/lib/aws/cloudwatch/alarm-status-widget.d.ts +77 -0
- package/lib/aws/cloudwatch/alarm-status-widget.js +62 -0
- package/lib/aws/cloudwatch/alarm.d.ts +158 -0
- package/lib/aws/cloudwatch/alarm.js +410 -0
- package/lib/aws/cloudwatch/composite-alarm.d.ts +88 -0
- package/lib/aws/cloudwatch/composite-alarm.js +98 -0
- package/lib/aws/cloudwatch/dashboard.d.ts +137 -0
- package/lib/aws/cloudwatch/dashboard.js +141 -0
- package/lib/aws/cloudwatch/data-protection-policy.d.ts +184 -0
- package/lib/aws/cloudwatch/data-protection-policy.js +246 -0
- package/lib/aws/cloudwatch/graph.d.ts +792 -0
- package/lib/aws/cloudwatch/graph.js +537 -0
- package/lib/aws/cloudwatch/index.d.ts +26 -0
- package/lib/aws/cloudwatch/index.js +49 -0
- package/lib/aws/cloudwatch/layout.d.ts +89 -0
- package/lib/aws/cloudwatch/layout.js +147 -0
- package/lib/aws/cloudwatch/log-destinations/index.d.ts +2 -0
- package/lib/aws/cloudwatch/log-destinations/index.js +20 -0
- package/lib/aws/cloudwatch/log-destinations/kinesis.d.ts +29 -0
- package/lib/aws/cloudwatch/log-destinations/kinesis.js +52 -0
- package/lib/aws/cloudwatch/log-destinations/lambda.d.ts +22 -0
- package/lib/aws/cloudwatch/log-destinations/lambda.js +46 -0
- package/lib/aws/cloudwatch/log-group.d.ts +453 -0
- package/lib/aws/cloudwatch/log-group.js +350 -0
- package/lib/aws/cloudwatch/log-query.d.ts +91 -0
- package/lib/aws/cloudwatch/log-query.js +85 -0
- package/lib/aws/cloudwatch/log-stream.d.ts +57 -0
- package/lib/aws/cloudwatch/log-stream.js +57 -0
- package/lib/aws/cloudwatch/metric-filter.d.ts +30 -0
- package/lib/aws/cloudwatch/metric-filter.js +69 -0
- package/lib/aws/cloudwatch/metric-types.d.ts +407 -0
- package/lib/aws/cloudwatch/metric-types.js +151 -0
- package/lib/aws/cloudwatch/metric.d.ts +492 -0
- package/lib/aws/cloudwatch/metric.js +493 -0
- package/lib/aws/cloudwatch/pattern.d.ts +195 -0
- package/lib/aws/cloudwatch/pattern.js +412 -0
- package/lib/aws/cloudwatch/policy.d.ts +43 -0
- package/lib/aws/cloudwatch/policy.js +50 -0
- package/lib/aws/cloudwatch/private/drop-empty-object-at-the-end-of-an-array-token.d.ts +14 -0
- package/lib/aws/cloudwatch/private/drop-empty-object-at-the-end-of-an-array-token.js +37 -0
- package/lib/aws/cloudwatch/private/env-tokens.d.ts +8 -0
- package/lib/aws/cloudwatch/private/env-tokens.js +48 -0
- package/lib/aws/cloudwatch/private/metric-util.d.ts +60 -0
- package/lib/aws/cloudwatch/private/metric-util.js +132 -0
- package/lib/aws/cloudwatch/private/object.d.ts +1 -0
- package/lib/aws/cloudwatch/private/object.js +18 -0
- package/lib/aws/cloudwatch/private/rendering.d.ts +60 -0
- package/lib/aws/cloudwatch/private/rendering.js +181 -0
- package/lib/aws/cloudwatch/private/statistic.d.ts +51 -0
- package/lib/aws/cloudwatch/private/statistic.js +176 -0
- package/lib/aws/cloudwatch/query-definition.d.ts +150 -0
- package/lib/aws/cloudwatch/query-definition.js +114 -0
- package/lib/aws/cloudwatch/stats.d.ts +150 -0
- package/lib/aws/cloudwatch/stats.js +207 -0
- package/lib/aws/cloudwatch/subscription-filter.d.ts +75 -0
- package/lib/aws/cloudwatch/subscription-filter.js +51 -0
- package/lib/aws/cloudwatch/text.d.ts +52 -0
- package/lib/aws/cloudwatch/text.js +53 -0
- package/lib/aws/cloudwatch/variable.d.ts +156 -0
- package/lib/aws/cloudwatch/variable.js +156 -0
- package/lib/aws/cloudwatch/widget.d.ts +62 -0
- package/lib/aws/cloudwatch/widget.js +45 -0
- package/lib/aws/compute/activity.d.ts +81 -0
- package/lib/aws/compute/activity.js +132 -0
- package/lib/aws/compute/architecture.d.ts +33 -0
- package/lib/aws/compute/architecture.js +42 -0
- package/lib/aws/compute/chain.d.ts +52 -0
- package/lib/aws/compute/chain.js +68 -0
- package/lib/aws/compute/condition.d.ts +202 -0
- package/lib/aws/compute/condition.js +409 -0
- package/lib/aws/compute/event-invoke-config.d.ts +74 -0
- package/lib/aws/compute/event-invoke-config.js +63 -0
- package/lib/aws/compute/event-source-filter.d.ts +64 -0
- package/lib/aws/compute/event-source-filter.js +86 -0
- package/lib/aws/compute/event-source-mapping.d.ts +310 -0
- package/lib/aws/compute/event-source-mapping.js +267 -0
- package/lib/aws/compute/event-sources/index.d.ts +4 -0
- package/lib/aws/compute/event-sources/index.js +28 -0
- package/lib/aws/compute/event-sources/s3-onfailure-destination.d.ts +13 -0
- package/lib/aws/compute/event-sources/s3-onfailure-destination.js +26 -0
- package/lib/aws/compute/event-sources/s3.d.ts +24 -0
- package/lib/aws/compute/event-sources/s3.js +25 -0
- package/lib/aws/compute/event-sources/sqs-dlq.d.ts +13 -0
- package/lib/aws/compute/event-sources/sqs-dlq.js +26 -0
- package/lib/aws/compute/event-sources/sqs.d.ts +75 -0
- package/lib/aws/compute/event-sources/sqs.js +84 -0
- package/lib/aws/compute/fields.d.ts +367 -0
- package/lib/aws/compute/fields.js +546 -0
- package/lib/aws/compute/function-alias.d.ts +148 -0
- package/lib/aws/compute/function-alias.js +176 -0
- package/lib/aws/compute/function-base.d.ts +314 -0
- package/lib/aws/compute/function-base.js +421 -0
- package/lib/aws/compute/function-destination.d.ts +42 -0
- package/lib/aws/compute/function-destination.js +18 -0
- package/lib/aws/compute/function-destinations/event-bridge.d.ts +19 -0
- package/lib/aws/compute/function-destinations/event-bridge.js +46 -0
- package/lib/aws/compute/function-destinations/function.d.ts +34 -0
- package/lib/aws/compute/function-destinations/function.js +55 -0
- package/lib/aws/compute/function-destinations/index.d.ts +3 -0
- package/lib/aws/compute/function-destinations/index.js +22 -0
- package/lib/aws/compute/function-destinations/sqs.d.ts +14 -0
- package/lib/aws/compute/function-destinations/sqs.js +27 -0
- package/lib/aws/compute/function-nodejs.d.ts +55 -0
- package/lib/aws/compute/function-nodejs.js +70 -0
- package/lib/aws/compute/function-permission.d.ts +83 -0
- package/lib/aws/compute/function-permission.js +3 -0
- package/lib/aws/compute/function-url.d.ts +210 -0
- package/lib/aws/compute/function-url.js +148 -0
- package/lib/aws/compute/function-vpc-config.generated.d.ts +36 -0
- package/lib/aws/compute/function-vpc-config.generated.js +3 -0
- package/lib/aws/compute/function.d.ts +492 -0
- package/lib/aws/compute/function.js +692 -0
- package/lib/aws/compute/index.d.ts +42 -0
- package/lib/aws/compute/index.js +64 -0
- package/lib/aws/compute/private/intrinstics.d.ts +86 -0
- package/lib/aws/compute/private/intrinstics.js +220 -0
- package/lib/aws/compute/private/json-path.d.ts +57 -0
- package/lib/aws/compute/private/json-path.js +351 -0
- package/lib/aws/compute/private/util.d.ts +1 -0
- package/lib/aws/compute/private/util.js +38 -0
- package/lib/aws/compute/state-graph.d.ts +100 -0
- package/lib/aws/compute/state-graph.js +177 -0
- package/lib/aws/compute/state-machine-fragment.d.ts +61 -0
- package/lib/aws/compute/state-machine-fragment.js +56 -0
- package/lib/aws/compute/state-machine.d.ts +323 -0
- package/lib/aws/compute/state-machine.js +392 -0
- package/lib/aws/compute/states/choice.d.ts +94 -0
- package/lib/aws/compute/states/choice.js +81 -0
- package/lib/aws/compute/states/custom-state.d.ts +55 -0
- package/lib/aws/compute/states/custom-state.js +114 -0
- package/lib/aws/compute/states/distributed-map/item-batcher.d.ts +64 -0
- package/lib/aws/compute/states/distributed-map/item-batcher.js +58 -0
- package/lib/aws/compute/states/distributed-map/item-reader.d.ts +256 -0
- package/lib/aws/compute/states/distributed-map/item-reader.js +253 -0
- package/lib/aws/compute/states/distributed-map/result-writer.d.ts +41 -0
- package/lib/aws/compute/states/distributed-map/result-writer.js +66 -0
- package/lib/aws/compute/states/distributed-map.d.ts +153 -0
- package/lib/aws/compute/states/distributed-map.js +207 -0
- package/lib/aws/compute/states/fail.d.ts +74 -0
- package/lib/aws/compute/states/fail.js +83 -0
- package/lib/aws/compute/states/map-base.d.ts +145 -0
- package/lib/aws/compute/states/map-base.js +109 -0
- package/lib/aws/compute/states/map.d.ts +76 -0
- package/lib/aws/compute/states/map.js +110 -0
- package/lib/aws/compute/states/parallel.d.ts +113 -0
- package/lib/aws/compute/states/parallel.js +100 -0
- package/lib/aws/compute/states/pass.d.ts +122 -0
- package/lib/aws/compute/states/pass.js +99 -0
- package/lib/aws/compute/states/private/state-type.d.ts +13 -0
- package/lib/aws/compute/states/private/state-type.js +19 -0
- package/lib/aws/compute/states/state.d.ts +276 -0
- package/lib/aws/compute/states/state.js +482 -0
- package/lib/aws/compute/states/succeed.d.ts +51 -0
- package/lib/aws/compute/states/succeed.js +32 -0
- package/lib/aws/compute/states/task-base.d.ts +225 -0
- package/lib/aws/compute/states/task-base.js +160 -0
- package/lib/aws/compute/states/task.d.ts +127 -0
- package/lib/aws/compute/states/task.js +92 -0
- package/lib/aws/compute/states/wait.d.ts +78 -0
- package/lib/aws/compute/states/wait.js +90 -0
- package/lib/aws/compute/step-functions-task.d.ts +78 -0
- package/lib/aws/compute/step-functions-task.js +27 -0
- package/lib/aws/compute/task-credentials.d.ts +45 -0
- package/lib/aws/compute/task-credentials.js +52 -0
- package/lib/aws/compute/task-input.d.ts +86 -0
- package/lib/aws/compute/task-input.js +107 -0
- package/lib/aws/compute/tasks/aws-sdk/call-aws-service.d.ts +73 -0
- package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +69 -0
- package/lib/aws/compute/tasks/eventbridge/put-events.d.ts +74 -0
- package/lib/aws/compute/tasks/eventbridge/put-events.js +94 -0
- package/lib/aws/compute/tasks/http/invoke.d.ts +104 -0
- package/lib/aws/compute/tasks/http/invoke.js +117 -0
- package/lib/aws/compute/tasks/index.d.ts +7 -0
- package/lib/aws/compute/tasks/index.js +42 -0
- package/lib/aws/compute/tasks/lambda/invoke.d.ts +106 -0
- package/lib/aws/compute/tasks/lambda/invoke.js +125 -0
- package/lib/aws/compute/tasks/private/task-utils.d.ts +8 -0
- package/lib/aws/compute/tasks/private/task-utils.js +36 -0
- package/lib/aws/compute/tasks/resource-arn-suffix.d.ts +3 -0
- package/lib/aws/compute/tasks/resource-arn-suffix.js +25 -0
- package/lib/aws/compute/tasks/sqs/send-message.d.ts +62 -0
- package/lib/aws/compute/tasks/sqs/send-message.js +70 -0
- package/lib/aws/compute/tasks/stepfunctions/invoke-activity.d.ts +36 -0
- package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +45 -0
- package/lib/aws/compute/tasks/stepfunctions/start-execution.d.ts +63 -0
- package/lib/aws/compute/tasks/stepfunctions/start-execution.js +123 -0
- package/lib/aws/compute/types.d.ts +214 -0
- package/lib/aws/compute/types.js +103 -0
- package/lib/aws/compute/util.d.ts +12 -0
- package/lib/aws/compute/util.js +29 -0
- package/lib/aws/edge/certificate.d.ts +144 -0
- package/lib/aws/edge/certificate.js +191 -0
- package/lib/aws/edge/distribution.d.ts +505 -0
- package/lib/aws/edge/distribution.js +444 -0
- package/lib/aws/edge/dns-alias-record-targets.d.ts +29 -0
- package/lib/aws/edge/dns-alias-record-targets.js +46 -0
- package/lib/aws/edge/dns-record.d.ts +536 -0
- package/lib/aws/edge/dns-record.js +532 -0
- package/lib/aws/edge/dns-zone.d.ts +169 -0
- package/lib/aws/edge/dns-zone.js +149 -0
- package/lib/aws/edge/function.d.ts +185 -0
- package/lib/aws/edge/function.js +141 -0
- package/lib/aws/edge/index.d.ts +8 -0
- package/lib/aws/edge/index.js +25 -0
- package/lib/aws/edge/key-value-store.d.ts +162 -0
- package/lib/aws/edge/key-value-store.js +163 -0
- package/lib/aws/edge/origin.d.ts +160 -0
- package/lib/aws/edge/origin.js +245 -0
- package/lib/aws/encryption/alias.d.ts +137 -0
- package/lib/aws/encryption/alias.js +216 -0
- package/lib/aws/encryption/index.d.ts +4 -0
- package/lib/aws/encryption/index.js +21 -0
- package/lib/aws/encryption/key-lookup.d.ts +11 -0
- package/lib/aws/encryption/key-lookup.js +4 -0
- package/lib/aws/encryption/key.d.ts +461 -0
- package/lib/aws/encryption/key.js +586 -0
- package/lib/aws/encryption/private/perms.d.ts +5 -0
- package/lib/aws/encryption/private/perms.js +30 -0
- package/lib/aws/encryption/via-service-principal.d.ts +11 -0
- package/lib/aws/encryption/via-service-principal.js +39 -0
- package/lib/aws/iam/grant.d.ts +221 -0
- package/lib/aws/iam/grant.js +239 -0
- package/lib/aws/iam/identity-base.d.ts +20 -0
- package/lib/aws/iam/identity-base.js +3 -0
- package/lib/aws/iam/index.d.ts +16 -0
- package/lib/aws/iam/index.js +34 -0
- package/lib/aws/iam/managed-policy.d.ts +227 -0
- package/lib/aws/iam/managed-policy.js +237 -0
- package/lib/aws/iam/oidc-provider.d.ts +120 -0
- package/lib/aws/iam/oidc-provider.js +82 -0
- package/lib/aws/iam/policy-document-config.generated.d.ts +78 -0
- package/lib/aws/iam/policy-document-config.generated.js +3 -0
- package/lib/aws/iam/policy-document.d.ts +150 -0
- package/lib/aws/iam/policy-document.js +172 -0
- package/lib/aws/iam/policy-statement-props.generated.d.ts +55 -0
- package/lib/aws/iam/policy-statement-props.generated.js +3 -0
- package/lib/aws/iam/policy-statement.d.ts +451 -0
- package/lib/aws/iam/policy-statement.js +947 -0
- package/lib/aws/iam/policy.d.ts +122 -0
- package/lib/aws/iam/policy.js +192 -0
- package/lib/aws/iam/principals.d.ts +668 -0
- package/lib/aws/iam/principals.js +1032 -0
- package/lib/aws/iam/private/adapter.d.ts +21 -0
- package/lib/aws/iam/private/adapter.js +51 -0
- package/lib/aws/iam/private/assume-role-policy.d.ts +8 -0
- package/lib/aws/iam/private/assume-role-policy.js +27 -0
- package/lib/aws/iam/private/comparable-principal.d.ts +6 -0
- package/lib/aws/iam/private/comparable-principal.js +20 -0
- package/lib/aws/iam/private/immutable-role.d.ts +43 -0
- package/lib/aws/iam/private/immutable-role.js +76 -0
- package/lib/aws/iam/private/imported-role.d.ts +49 -0
- package/lib/aws/iam/private/imported-role.js +103 -0
- package/lib/aws/iam/private/merge-statements.d.ts +44 -0
- package/lib/aws/iam/private/merge-statements.js +214 -0
- package/lib/aws/iam/private/postprocess-policy-document.d.ts +15 -0
- package/lib/aws/iam/private/postprocess-policy-document.js +102 -0
- package/lib/aws/iam/private/util.d.ts +37 -0
- package/lib/aws/iam/private/util.js +87 -0
- package/lib/aws/iam/role.d.ts +425 -0
- package/lib/aws/iam/role.js +407 -0
- package/lib/aws/iam/saml-provider.d.ts +79 -0
- package/lib/aws/iam/saml-provider.js +79 -0
- package/lib/aws/iam/unknown-principal.d.ts +32 -0
- package/lib/aws/iam/unknown-principal.js +45 -0
- package/lib/aws/iam/utils.d.ts +12 -0
- package/lib/aws/iam/utils.js +41 -0
- package/lib/aws/index.d.ts +13 -0
- package/lib/aws/index.js +34 -0
- package/lib/aws/log-retention.d.ts +97 -0
- package/lib/aws/log-retention.js +103 -0
- package/lib/aws/network/index.d.ts +4 -0
- package/lib/aws/network/index.js +21 -0
- package/lib/aws/network/network.d.ts +77 -0
- package/lib/aws/network/network.js +3 -0
- package/lib/aws/network/simple-ipv4-vpc.d.ts +84 -0
- package/lib/aws/network/simple-ipv4-vpc.js +236 -0
- package/lib/aws/network/subnet-group.d.ts +42 -0
- package/lib/aws/network/subnet-group.js +72 -0
- package/lib/aws/network/subnet.d.ts +95 -0
- package/lib/aws/network/subnet.js +123 -0
- package/lib/aws/notify/archive.d.ts +77 -0
- package/lib/aws/notify/archive.js +62 -0
- package/lib/aws/notify/connection.d.ts +276 -0
- package/lib/aws/notify/connection.js +261 -0
- package/lib/aws/notify/event-bus.d.ts +298 -0
- package/lib/aws/notify/event-bus.js +326 -0
- package/lib/aws/notify/event-pattern.d.ts +220 -0
- package/lib/aws/notify/event-pattern.js +197 -0
- package/lib/aws/notify/index.d.ts +15 -0
- package/lib/aws/notify/index.js +35 -0
- package/lib/aws/notify/input.d.ts +126 -0
- package/lib/aws/notify/input.js +282 -0
- package/lib/aws/notify/kinesis-canned-metrics.generated.d.ts +68 -0
- package/lib/aws/notify/kinesis-canned-metrics.generated.js +103 -0
- package/lib/aws/notify/kinesis-fixed-canned-metrics.d.ts +195 -0
- package/lib/aws/notify/kinesis-fixed-canned-metrics.js +155 -0
- package/lib/aws/notify/kinesis-stream.d.ts +705 -0
- package/lib/aws/notify/kinesis-stream.js +541 -0
- package/lib/aws/notify/on-event-options.d.ts +54 -0
- package/lib/aws/notify/on-event-options.js +3 -0
- package/lib/aws/notify/queue-config.generated.d.ts +85 -0
- package/lib/aws/notify/queue-config.generated.js +3 -0
- package/lib/aws/notify/queue-policy.d.ts +35 -0
- package/lib/aws/notify/queue-policy.js +39 -0
- package/lib/aws/notify/queue.d.ts +355 -0
- package/lib/aws/notify/queue.js +305 -0
- package/lib/aws/notify/resource-policy.d.ts +41 -0
- package/lib/aws/notify/resource-policy.js +43 -0
- package/lib/aws/notify/rule.d.ts +153 -0
- package/lib/aws/notify/rule.js +227 -0
- package/lib/aws/notify/schedule.d.ts +83 -0
- package/lib/aws/notify/schedule.js +116 -0
- package/lib/aws/notify/target.d.ts +102 -0
- package/lib/aws/notify/target.js +3 -0
- package/lib/aws/notify/targets/event-bus.d.ts +39 -0
- package/lib/aws/notify/targets/event-bus.js +40 -0
- package/lib/aws/notify/targets/function.d.ts +31 -0
- package/lib/aws/notify/targets/function.js +36 -0
- package/lib/aws/notify/targets/index.d.ts +6 -0
- package/lib/aws/notify/targets/index.js +37 -0
- package/lib/aws/notify/targets/log-group.d.ts +89 -0
- package/lib/aws/notify/targets/log-group.js +110 -0
- package/lib/aws/notify/targets/sqs.d.ts +45 -0
- package/lib/aws/notify/targets/sqs.js +73 -0
- package/lib/aws/notify/targets/state-machine.d.ts +36 -0
- package/lib/aws/notify/targets/state-machine.js +39 -0
- package/lib/aws/notify/targets/util.d.ts +71 -0
- package/lib/aws/notify/targets/util.js +130 -0
- package/lib/aws/notify/util.d.ts +13 -0
- package/lib/aws/notify/util.js +69 -0
- package/lib/aws/provider-config.generated.d.ts +220 -0
- package/lib/aws/provider-config.generated.js +3 -0
- package/lib/aws/storage/bucket-destination.d.ts +41 -0
- package/lib/aws/storage/bucket-destination.js +13 -0
- package/lib/aws/storage/bucket-notifications.d.ts +58 -0
- package/lib/aws/storage/bucket-notifications.js +169 -0
- package/lib/aws/storage/bucket-perms.d.ts +9 -0
- package/lib/aws/storage/bucket-perms.js +33 -0
- package/lib/aws/storage/bucket-policy.d.ts +51 -0
- package/lib/aws/storage/bucket-policy.js +53 -0
- package/lib/aws/storage/bucket-source.d.ts +41 -0
- package/lib/aws/storage/bucket-source.js +79 -0
- package/lib/aws/storage/bucket.d.ts +941 -0
- package/lib/aws/storage/bucket.js +869 -0
- package/lib/aws/storage/cors-config.generated.d.ts +57 -0
- package/lib/aws/storage/cors-config.generated.js +3 -0
- package/lib/aws/storage/cors-rule-config.generated.d.ts +38 -0
- package/lib/aws/storage/cors-rule-config.generated.js +3 -0
- package/lib/aws/storage/index.d.ts +12 -0
- package/lib/aws/storage/index.js +31 -0
- package/lib/aws/storage/lifecycle-config.generated.d.ts +55 -0
- package/lib/aws/storage/lifecycle-config.generated.js +3 -0
- package/lib/aws/storage/notification-targets/function.d.ts +11 -0
- package/lib/aws/storage/notification-targets/function.js +48 -0
- package/lib/aws/storage/notification-targets/index.d.ts +2 -0
- package/lib/aws/storage/notification-targets/index.js +21 -0
- package/lib/aws/storage/notification-targets/queue.d.ts +15 -0
- package/lib/aws/storage/notification-targets/queue.js +58 -0
- package/lib/aws/storage/origin-access-identity.d.ts +91 -0
- package/lib/aws/storage/origin-access-identity.js +76 -0
- package/lib/aws/storage/util.d.ts +40 -0
- package/lib/aws/storage/util.js +85 -0
- package/lib/aws/storage/website-config.generated.d.ts +73 -0
- package/lib/aws/storage/website-config.generated.js +3 -0
- package/lib/aws/util.d.ts +4 -0
- package/lib/aws/util.js +25 -0
- package/lib/construct-base.d.ts +69 -0
- package/lib/construct-base.js +89 -0
- package/lib/duration.d.ts +160 -0
- package/lib/duration.js +327 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +24 -0
- package/lib/private/index.d.ts +2 -0
- package/lib/private/index.js +19 -0
- package/lib/private/terraform-dependables-aspect.d.ts +20 -0
- package/lib/private/terraform-dependables-aspect.js +95 -0
- package/lib/private/unique-resource-name.d.ts +9 -0
- package/lib/private/unique-resource-name.js +145 -0
- package/lib/size.d.ts +146 -0
- package/lib/size.js +220 -0
- package/lib/stack-base.d.ts +188 -0
- package/lib/stack-base.js +183 -0
- package/lib/token.d.ts +32 -0
- package/lib/token.js +54 -0
- package/node_modules/camel-case/LICENSE +21 -0
- package/node_modules/camel-case/README.md +47 -0
- package/node_modules/camel-case/dist/index.d.ts +5 -0
- package/node_modules/camel-case/dist/index.js +23 -0
- package/node_modules/camel-case/dist/index.js.map +1 -0
- package/node_modules/camel-case/dist/index.spec.d.ts +1 -0
- package/node_modules/camel-case/dist/index.spec.js +26 -0
- package/node_modules/camel-case/dist/index.spec.js.map +1 -0
- package/node_modules/camel-case/dist.es2015/index.d.ts +5 -0
- package/node_modules/camel-case/dist.es2015/index.js +17 -0
- package/node_modules/camel-case/dist.es2015/index.js.map +1 -0
- package/node_modules/camel-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/camel-case/dist.es2015/index.spec.js +24 -0
- package/node_modules/camel-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/camel-case/package.json +89 -0
- package/node_modules/capital-case/LICENSE +21 -0
- package/node_modules/capital-case/README.md +37 -0
- package/node_modules/capital-case/dist/index.d.ts +4 -0
- package/node_modules/capital-case/dist/index.js +16 -0
- package/node_modules/capital-case/dist/index.js.map +1 -0
- package/node_modules/capital-case/dist/index.spec.d.ts +1 -0
- package/node_modules/capital-case/dist/index.spec.js +24 -0
- package/node_modules/capital-case/dist/index.spec.js.map +1 -0
- package/node_modules/capital-case/dist.es2015/index.d.ts +4 -0
- package/node_modules/capital-case/dist.es2015/index.js +11 -0
- package/node_modules/capital-case/dist.es2015/index.js.map +1 -0
- package/node_modules/capital-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/capital-case/dist.es2015/index.spec.js +22 -0
- package/node_modules/capital-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/capital-case/package.json +90 -0
- package/node_modules/change-case/LICENSE +21 -0
- package/node_modules/change-case/README.md +44 -0
- package/node_modules/change-case/dist/index.d.ts +11 -0
- package/node_modules/change-case/dist/index.js +15 -0
- package/node_modules/change-case/dist/index.js.map +1 -0
- package/node_modules/change-case/dist/index.spec.d.ts +1 -0
- package/node_modules/change-case/dist/index.spec.js +9 -0
- package/node_modules/change-case/dist/index.spec.js.map +1 -0
- package/node_modules/change-case/dist.es2015/index.d.ts +11 -0
- package/node_modules/change-case/dist.es2015/index.js +12 -0
- package/node_modules/change-case/dist.es2015/index.js.map +1 -0
- package/node_modules/change-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/change-case/dist.es2015/index.spec.js +7 -0
- package/node_modules/change-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/change-case/package.json +101 -0
- package/node_modules/constant-case/LICENSE +21 -0
- package/node_modules/constant-case/README.md +37 -0
- package/node_modules/constant-case/dist/index.d.ts +3 -0
- package/node_modules/constant-case/dist/index.js +12 -0
- package/node_modules/constant-case/dist/index.js.map +1 -0
- package/node_modules/constant-case/dist/index.spec.d.ts +1 -0
- package/node_modules/constant-case/dist/index.spec.js +26 -0
- package/node_modules/constant-case/dist/index.spec.js.map +1 -0
- package/node_modules/constant-case/dist.es2015/index.d.ts +3 -0
- package/node_modules/constant-case/dist.es2015/index.js +8 -0
- package/node_modules/constant-case/dist.es2015/index.js.map +1 -0
- package/node_modules/constant-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/constant-case/dist.es2015/index.spec.js +24 -0
- package/node_modules/constant-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/constant-case/package.json +90 -0
- package/node_modules/dot-case/LICENSE +21 -0
- package/node_modules/dot-case/README.md +37 -0
- package/node_modules/dot-case/dist/index.d.ts +3 -0
- package/node_modules/dot-case/dist/index.js +11 -0
- package/node_modules/dot-case/dist/index.js.map +1 -0
- package/node_modules/dot-case/dist/index.spec.d.ts +1 -0
- package/node_modules/dot-case/dist/index.spec.js +26 -0
- package/node_modules/dot-case/dist/index.spec.js.map +1 -0
- package/node_modules/dot-case/dist.es2015/index.d.ts +3 -0
- package/node_modules/dot-case/dist.es2015/index.js +7 -0
- package/node_modules/dot-case/dist.es2015/index.js.map +1 -0
- package/node_modules/dot-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/dot-case/dist.es2015/index.spec.js +24 -0
- package/node_modules/dot-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/dot-case/package.json +89 -0
- package/node_modules/esbuild-wasm/LICENSE.md +21 -0
- package/node_modules/esbuild-wasm/README.md +3 -0
- package/node_modules/esbuild-wasm/bin/esbuild +91 -0
- package/node_modules/esbuild-wasm/esbuild.wasm +0 -0
- package/node_modules/esbuild-wasm/esm/browser.d.ts +705 -0
- package/node_modules/esbuild-wasm/esm/browser.js +2370 -0
- package/node_modules/esbuild-wasm/esm/browser.min.js +20 -0
- package/node_modules/esbuild-wasm/lib/browser.d.ts +705 -0
- package/node_modules/esbuild-wasm/lib/browser.js +2415 -0
- package/node_modules/esbuild-wasm/lib/browser.min.js +22 -0
- package/node_modules/esbuild-wasm/lib/main.d.ts +705 -0
- package/node_modules/esbuild-wasm/lib/main.js +2051 -0
- package/node_modules/esbuild-wasm/package.json +19 -0
- package/node_modules/esbuild-wasm/wasm_exec.js +561 -0
- package/node_modules/esbuild-wasm/wasm_exec_node.js +39 -0
- package/node_modules/header-case/LICENSE +21 -0
- package/node_modules/header-case/README.md +37 -0
- package/node_modules/header-case/dist/index.d.ts +3 -0
- package/node_modules/header-case/dist/index.js +11 -0
- package/node_modules/header-case/dist/index.js.map +1 -0
- package/node_modules/header-case/dist/index.spec.d.ts +1 -0
- package/node_modules/header-case/dist/index.spec.js +24 -0
- package/node_modules/header-case/dist/index.spec.js.map +1 -0
- package/node_modules/header-case/dist.es2015/index.d.ts +3 -0
- package/node_modules/header-case/dist.es2015/index.js +7 -0
- package/node_modules/header-case/dist.es2015/index.js.map +1 -0
- package/node_modules/header-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/header-case/dist.es2015/index.spec.js +22 -0
- package/node_modules/header-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/header-case/package.json +89 -0
- package/node_modules/lower-case/LICENSE +21 -0
- package/node_modules/lower-case/README.md +35 -0
- package/node_modules/lower-case/dist/index.d.ts +8 -0
- package/node_modules/lower-case/dist/index.js +53 -0
- package/node_modules/lower-case/dist/index.js.map +1 -0
- package/node_modules/lower-case/dist/index.spec.d.ts +1 -0
- package/node_modules/lower-case/dist/index.spec.js +36 -0
- package/node_modules/lower-case/dist/index.spec.js.map +1 -0
- package/node_modules/lower-case/dist.es2015/index.d.ts +8 -0
- package/node_modules/lower-case/dist.es2015/index.js +48 -0
- package/node_modules/lower-case/dist.es2015/index.js.map +1 -0
- package/node_modules/lower-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/lower-case/dist.es2015/index.spec.js +34 -0
- package/node_modules/lower-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/lower-case/package.json +87 -0
- package/node_modules/mime-db/HISTORY.md +507 -0
- package/node_modules/mime-db/LICENSE +23 -0
- package/node_modules/mime-db/README.md +100 -0
- package/node_modules/mime-db/db.json +8519 -0
- package/node_modules/mime-db/index.js +12 -0
- package/node_modules/mime-db/package.json +60 -0
- package/node_modules/mime-types/HISTORY.md +397 -0
- package/node_modules/mime-types/LICENSE +23 -0
- package/node_modules/mime-types/README.md +113 -0
- package/node_modules/mime-types/index.js +188 -0
- package/node_modules/mime-types/package.json +44 -0
- package/node_modules/no-case/LICENSE +21 -0
- package/node_modules/no-case/README.md +37 -0
- package/node_modules/no-case/dist/index.d.ts +10 -0
- package/node_modules/no-case/dist/index.js +35 -0
- package/node_modules/no-case/dist/index.js.map +1 -0
- package/node_modules/no-case/dist/index.spec.d.ts +1 -0
- package/node_modules/no-case/dist/index.spec.js +59 -0
- package/node_modules/no-case/dist/index.spec.js.map +1 -0
- package/node_modules/no-case/dist.es2015/index.d.ts +10 -0
- package/node_modules/no-case/dist.es2015/index.js +31 -0
- package/node_modules/no-case/dist.es2015/index.js.map +1 -0
- package/node_modules/no-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/no-case/dist.es2015/index.spec.js +57 -0
- package/node_modules/no-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/no-case/package.json +85 -0
- package/node_modules/param-case/LICENSE +21 -0
- package/node_modules/param-case/README.md +37 -0
- package/node_modules/param-case/dist/index.d.ts +3 -0
- package/node_modules/param-case/dist/index.js +11 -0
- package/node_modules/param-case/dist/index.js.map +1 -0
- package/node_modules/param-case/dist/index.spec.d.ts +1 -0
- package/node_modules/param-case/dist/index.spec.js +24 -0
- package/node_modules/param-case/dist/index.spec.js.map +1 -0
- package/node_modules/param-case/dist.es2015/index.d.ts +3 -0
- package/node_modules/param-case/dist.es2015/index.js +7 -0
- package/node_modules/param-case/dist.es2015/index.js.map +1 -0
- package/node_modules/param-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/param-case/dist.es2015/index.spec.js +22 -0
- package/node_modules/param-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/param-case/package.json +91 -0
- package/node_modules/pascal-case/LICENSE +21 -0
- package/node_modules/pascal-case/README.md +47 -0
- package/node_modules/pascal-case/dist/index.d.ts +5 -0
- package/node_modules/pascal-case/dist/index.js +24 -0
- package/node_modules/pascal-case/dist/index.js.map +1 -0
- package/node_modules/pascal-case/dist/index.spec.d.ts +1 -0
- package/node_modules/pascal-case/dist/index.spec.js +25 -0
- package/node_modules/pascal-case/dist/index.spec.js.map +1 -0
- package/node_modules/pascal-case/dist.es2015/index.d.ts +5 -0
- package/node_modules/pascal-case/dist.es2015/index.js +18 -0
- package/node_modules/pascal-case/dist.es2015/index.js.map +1 -0
- package/node_modules/pascal-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/pascal-case/dist.es2015/index.spec.js +23 -0
- package/node_modules/pascal-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/pascal-case/package.json +90 -0
- package/node_modules/path-case/LICENSE +21 -0
- package/node_modules/path-case/README.md +37 -0
- package/node_modules/path-case/dist/index.d.ts +3 -0
- package/node_modules/path-case/dist/index.js +11 -0
- package/node_modules/path-case/dist/index.js.map +1 -0
- package/node_modules/path-case/dist/index.spec.d.ts +1 -0
- package/node_modules/path-case/dist/index.spec.js +24 -0
- package/node_modules/path-case/dist/index.spec.js.map +1 -0
- package/node_modules/path-case/dist.es2015/index.d.ts +3 -0
- package/node_modules/path-case/dist.es2015/index.js +7 -0
- package/node_modules/path-case/dist.es2015/index.js.map +1 -0
- package/node_modules/path-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/path-case/dist.es2015/index.spec.js +22 -0
- package/node_modules/path-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/path-case/package.json +88 -0
- package/node_modules/sentence-case/LICENSE +21 -0
- package/node_modules/sentence-case/README.md +37 -0
- package/node_modules/sentence-case/dist/index.d.ts +4 -0
- package/node_modules/sentence-case/dist/index.js +19 -0
- package/node_modules/sentence-case/dist/index.js.map +1 -0
- package/node_modules/sentence-case/dist/index.spec.d.ts +1 -0
- package/node_modules/sentence-case/dist/index.spec.js +24 -0
- package/node_modules/sentence-case/dist/index.spec.js.map +1 -0
- package/node_modules/sentence-case/dist.es2015/index.d.ts +4 -0
- package/node_modules/sentence-case/dist.es2015/index.js +14 -0
- package/node_modules/sentence-case/dist.es2015/index.js.map +1 -0
- package/node_modules/sentence-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/sentence-case/dist.es2015/index.spec.js +22 -0
- package/node_modules/sentence-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/sentence-case/package.json +89 -0
- package/node_modules/snake-case/LICENSE +21 -0
- package/node_modules/snake-case/README.md +37 -0
- package/node_modules/snake-case/dist/index.d.ts +3 -0
- package/node_modules/snake-case/dist/index.js +11 -0
- package/node_modules/snake-case/dist/index.js.map +1 -0
- package/node_modules/snake-case/dist/index.spec.d.ts +1 -0
- package/node_modules/snake-case/dist/index.spec.js +25 -0
- package/node_modules/snake-case/dist/index.spec.js.map +1 -0
- package/node_modules/snake-case/dist.es2015/index.d.ts +3 -0
- package/node_modules/snake-case/dist.es2015/index.js +7 -0
- package/node_modules/snake-case/dist.es2015/index.js.map +1 -0
- package/node_modules/snake-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/snake-case/dist.es2015/index.spec.js +23 -0
- package/node_modules/snake-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/snake-case/package.json +90 -0
- package/node_modules/tslib/CopyrightNotice.txt +15 -0
- package/node_modules/tslib/LICENSE.txt +12 -0
- package/node_modules/tslib/README.md +164 -0
- package/node_modules/tslib/SECURITY.md +41 -0
- package/node_modules/tslib/modules/index.d.ts +37 -0
- package/node_modules/tslib/modules/index.js +68 -0
- package/node_modules/tslib/modules/package.json +3 -0
- package/node_modules/tslib/package.json +47 -0
- package/node_modules/tslib/tslib.d.ts +453 -0
- package/node_modules/tslib/tslib.es6.html +1 -0
- package/node_modules/tslib/tslib.es6.js +374 -0
- package/node_modules/tslib/tslib.es6.mjs +373 -0
- package/node_modules/tslib/tslib.html +1 -0
- package/node_modules/tslib/tslib.js +424 -0
- package/node_modules/upper-case/README.md +34 -0
- package/node_modules/upper-case/dist/index.d.ts +8 -0
- package/node_modules/upper-case/dist/index.js +49 -0
- package/node_modules/upper-case/dist/index.js.map +1 -0
- package/node_modules/upper-case/dist/index.spec.d.ts +1 -0
- package/node_modules/upper-case/dist/index.spec.js +34 -0
- package/node_modules/upper-case/dist/index.spec.js.map +1 -0
- package/node_modules/upper-case/dist.es2015/index.d.ts +8 -0
- package/node_modules/upper-case/dist.es2015/index.js +44 -0
- package/node_modules/upper-case/dist.es2015/index.js.map +1 -0
- package/node_modules/upper-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/upper-case/dist.es2015/index.spec.js +32 -0
- package/node_modules/upper-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/upper-case/package.json +86 -0
- package/node_modules/upper-case-first/LICENSE +21 -0
- package/node_modules/upper-case-first/README.md +32 -0
- package/node_modules/upper-case-first/dist/index.d.ts +4 -0
- package/node_modules/upper-case-first/dist/index.js +11 -0
- package/node_modules/upper-case-first/dist/index.js.map +1 -0
- package/node_modules/upper-case-first/dist/index.spec.d.ts +1 -0
- package/node_modules/upper-case-first/dist/index.spec.js +20 -0
- package/node_modules/upper-case-first/dist/index.spec.js.map +1 -0
- package/node_modules/upper-case-first/dist.es2015/index.d.ts +4 -0
- package/node_modules/upper-case-first/dist.es2015/index.js +7 -0
- package/node_modules/upper-case-first/dist.es2015/index.js.map +1 -0
- package/node_modules/upper-case-first/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/upper-case-first/dist.es2015/index.spec.js +18 -0
- package/node_modules/upper-case-first/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/upper-case-first/package.json +87 -0
- package/package.json +152 -0
- package/setup.js +2 -0
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.QualifiedFunctionBase = exports.LambdaFunctionBase = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
// source: https://github.com/cdktf-plus/cdktf-plus/blob/586aabad3ab2fb2a2e93e05ed33f94474ebe9397/packages/%40cdktf-plus/aws/lib/aws-lambda-function/index.ts\
|
|
7
|
+
// update to align with https://github.com/aws/aws-cdk/blob/v2.156.0/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts
|
|
8
|
+
const crypto = require("crypto");
|
|
9
|
+
const provider_aws_1 = require("@cdktf/provider-aws");
|
|
10
|
+
const cdktf_1 = require("cdktf");
|
|
11
|
+
const arn_1 = require("../arn");
|
|
12
|
+
const aws_construct_1 = require("../aws-construct");
|
|
13
|
+
const aws_stack_1 = require("../aws-stack");
|
|
14
|
+
const event_invoke_config_1 = require("./event-invoke-config");
|
|
15
|
+
const event_source_mapping_1 = require("./event-source-mapping");
|
|
16
|
+
const function_url_1 = require("./function-url");
|
|
17
|
+
const iam = require("../iam");
|
|
18
|
+
class LambdaFunctionBase extends aws_construct_1.AwsConstructBase {
|
|
19
|
+
constructor() {
|
|
20
|
+
super(...arguments);
|
|
21
|
+
/**
|
|
22
|
+
* Mapping of invocation principals to grants. Used to de-dupe `grantInvoke()` calls.
|
|
23
|
+
* @internal
|
|
24
|
+
*/
|
|
25
|
+
this._invocationGrants = {};
|
|
26
|
+
/**
|
|
27
|
+
* Mapping of fucntion URL invocation principals to grants. Used to de-dupe `grantInvokeUrl()` calls.
|
|
28
|
+
* @internal
|
|
29
|
+
*/
|
|
30
|
+
this._functionUrlInvocationGrants = {};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Adds a permission to the Lambda resource policy.
|
|
34
|
+
* @param id The id for the permission construct
|
|
35
|
+
* @param permission The permission to grant to this Lambda function. @see Permission for details.
|
|
36
|
+
*/
|
|
37
|
+
addPermission(id, permission) {
|
|
38
|
+
if (!this.canCreatePermissions) {
|
|
39
|
+
if (!this._skipPermissions) {
|
|
40
|
+
// TODO: revise this annotation
|
|
41
|
+
// Unclear Lambda Environment
|
|
42
|
+
cdktf_1.Annotations.of(this).addWarning([
|
|
43
|
+
`addPermission() has no effect on a Lambda Function with region=${this.env.region}, account=${this.env.account},`,
|
|
44
|
+
`in a Stack with region=${aws_stack_1.AwsStack.ofAwsConstruct(this).region}, account=${aws_stack_1.AwsStack.ofAwsConstruct(this).account}.`,
|
|
45
|
+
`Suppress this warning if this is is intentional, or pass sameEnvironment=true to fromFunctionAttributes()`,
|
|
46
|
+
`if you would like to add the permissions.`,
|
|
47
|
+
].join(" "));
|
|
48
|
+
}
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
let principal = this.parsePermissionPrincipal(permission.principal);
|
|
52
|
+
let { sourceArn, sourceAccount, principalOrgID } = this.validateConditionCombinations(permission.principal) ?? {};
|
|
53
|
+
const action = permission.action ?? "lambda:InvokeFunction";
|
|
54
|
+
const scope = permission.scope ?? this;
|
|
55
|
+
/**
|
|
56
|
+
* Do invokeFunction lambdas with unqualified function references apply to TF?
|
|
57
|
+
* A warning should be added to functions under the following conditions:
|
|
58
|
+
* - permissions that include `lambda:InvokeFunction` are added to the unqualified function.
|
|
59
|
+
* - function.currentVersion is invoked before or after the permission is created.
|
|
60
|
+
*
|
|
61
|
+
* This applies only to permissions on Lambda functions, not versions or aliases.
|
|
62
|
+
* This function is overridden as a noOp for QualifiedFunctionBase.
|
|
63
|
+
* https://github.com/aws/aws-cdk/blob/v2.160.0/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts#L332
|
|
64
|
+
*/
|
|
65
|
+
// [
|
|
66
|
+
// "AWS Lambda has changed their authorization strategy, which may cause client invocations using the 'Qualifier' parameter of the lambda function to fail with Access Denied errors.",
|
|
67
|
+
// "If you are using a lambda Version or Alias, make sure to call 'grantInvoke' or 'addPermission' on the Version or Alias, not the underlying Function",
|
|
68
|
+
// 'See: https://github.com/aws/aws-cdk/issues/19273',
|
|
69
|
+
// ].join('\n'));
|
|
70
|
+
new provider_aws_1.lambdaPermission.LambdaPermission(scope, id, {
|
|
71
|
+
action,
|
|
72
|
+
principal,
|
|
73
|
+
// qualifier: permission.qualifier,
|
|
74
|
+
functionName: this.functionArn,
|
|
75
|
+
eventSourceToken: permission.eventSourceToken,
|
|
76
|
+
sourceAccount: permission.sourceAccount ?? sourceAccount,
|
|
77
|
+
sourceArn: permission.sourceArn ?? sourceArn,
|
|
78
|
+
principalOrgId: permission.organizationId ?? principalOrgID,
|
|
79
|
+
functionUrlAuthType: permission.functionUrlAuthType,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Adds a statement to the IAM role assumed by the instance.
|
|
84
|
+
*/
|
|
85
|
+
addToRolePolicy(statement) {
|
|
86
|
+
if (!this.role) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
this.role.addToPrincipalPolicy(statement);
|
|
90
|
+
}
|
|
91
|
+
addEventSourceMapping(id, options) {
|
|
92
|
+
return new event_source_mapping_1.EventSourceMapping(this, id, {
|
|
93
|
+
target: this,
|
|
94
|
+
...options,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Grant the given identity permissions to invoke this Lambda
|
|
99
|
+
*/
|
|
100
|
+
grantInvoke(grantee) {
|
|
101
|
+
const hash = crypto
|
|
102
|
+
.createHash("sha256")
|
|
103
|
+
.update(JSON.stringify({
|
|
104
|
+
principal: grantee.grantPrincipal.toString(),
|
|
105
|
+
conditions: grantee.grantPrincipal.policyFragment.conditions,
|
|
106
|
+
}), "utf8")
|
|
107
|
+
.digest("base64");
|
|
108
|
+
const identifier = `Invoke${hash}`;
|
|
109
|
+
// Memoize the result so subsequent grantInvoke() calls are idempotent
|
|
110
|
+
let grant = this._invocationGrants[identifier];
|
|
111
|
+
if (!grant) {
|
|
112
|
+
grant = this.grant(grantee, identifier, "lambda:InvokeFunction", this.resourceArnsForGrantInvoke);
|
|
113
|
+
this._invocationGrants[identifier] = grant;
|
|
114
|
+
}
|
|
115
|
+
return grant;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Grant the given identity permissions to invoke the $LATEST version or
|
|
119
|
+
* unqualified version of this Lambda
|
|
120
|
+
*/
|
|
121
|
+
grantInvokeLatestVersion(grantee) {
|
|
122
|
+
return this.grantInvokeVersion(grantee, this.version);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Grant the given identity permissions to invoke the given version of this Lambda
|
|
126
|
+
*/
|
|
127
|
+
grantInvokeVersion(grantee, version) {
|
|
128
|
+
let grant;
|
|
129
|
+
if (cdktf_1.Token.isUnresolved(version)) {
|
|
130
|
+
// Identifier is set to "InvokeLatest"??
|
|
131
|
+
return this.grantInvoke(grantee);
|
|
132
|
+
}
|
|
133
|
+
// else, use version string in hash?
|
|
134
|
+
const hash = crypto
|
|
135
|
+
.createHash("sha256")
|
|
136
|
+
.update(JSON.stringify({
|
|
137
|
+
principal: grantee.grantPrincipal.toString(),
|
|
138
|
+
conditions: grantee.grantPrincipal.policyFragment.conditions,
|
|
139
|
+
version: version,
|
|
140
|
+
}), "utf8")
|
|
141
|
+
.digest("base64");
|
|
142
|
+
const identifier = `Invoke${hash}`;
|
|
143
|
+
// Memoize the result so subsequent grantInvoke() calls are idempotent
|
|
144
|
+
grant = this._invocationGrants[identifier];
|
|
145
|
+
if (!grant) {
|
|
146
|
+
let resouceArns = [`${this.functionArn}:${version}`];
|
|
147
|
+
if (version == this.version) {
|
|
148
|
+
resouceArns.push(this.functionArn);
|
|
149
|
+
}
|
|
150
|
+
grant = this.grant(grantee, identifier, "lambda:InvokeFunction", resouceArns);
|
|
151
|
+
this._invocationGrants[identifier] = grant;
|
|
152
|
+
}
|
|
153
|
+
return grant;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Grant the given identity permissions to invoke this Lambda Function URL
|
|
157
|
+
*/
|
|
158
|
+
grantInvokeUrl(grantee) {
|
|
159
|
+
const identifier = `InvokeFunctionUrl${grantee.grantPrincipal}`; // calls the .toString() of the principal
|
|
160
|
+
// Memoize the result so subsequent grantInvoke() calls are idempotent
|
|
161
|
+
let grant = this._functionUrlInvocationGrants[identifier];
|
|
162
|
+
if (!grant) {
|
|
163
|
+
grant = this.grant(grantee, identifier, "lambda:InvokeFunctionUrl", [this.functionArn], {
|
|
164
|
+
functionUrlAuthType: function_url_1.FunctionUrlAuthType.AWS_IAM,
|
|
165
|
+
});
|
|
166
|
+
this._functionUrlInvocationGrants[identifier] = grant;
|
|
167
|
+
}
|
|
168
|
+
return grant;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Grant multiple principals the ability to invoke this Lambda via CompositePrincipal
|
|
172
|
+
*/
|
|
173
|
+
grantInvokeCompositePrincipal(compositePrincipal) {
|
|
174
|
+
return compositePrincipal.principals.map((principal) => this.grantInvoke(principal));
|
|
175
|
+
}
|
|
176
|
+
addEventSource(source) {
|
|
177
|
+
source.bind(this);
|
|
178
|
+
}
|
|
179
|
+
configureAsyncInvoke(options) {
|
|
180
|
+
if (this.node.tryFindChild("EventInvokeConfig") !== undefined) {
|
|
181
|
+
throw new Error(`An EventInvokeConfig has already been configured for the function at ${this.node.path}`);
|
|
182
|
+
}
|
|
183
|
+
new event_invoke_config_1.EventInvokeConfig(this, "EventInvokeConfig", {
|
|
184
|
+
function: this,
|
|
185
|
+
...options,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* A function URL is a dedicated HTTP(S) endpoint for a Lambda function.
|
|
190
|
+
*/
|
|
191
|
+
addFunctionUrl(options) {
|
|
192
|
+
if (this.node.tryFindChild("FunctionUrl") !== undefined) {
|
|
193
|
+
throw new Error(`A FunctionUrl has already been configured for the function at ${this.node.path}`);
|
|
194
|
+
}
|
|
195
|
+
return new function_url_1.FunctionUrl(this, "FunctionUrl", {
|
|
196
|
+
function: this,
|
|
197
|
+
...options,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Returns the construct tree node that corresponds to the lambda function.
|
|
202
|
+
* For use internally for constructs, when the tree is set up in non-standard ways. Ex: SingletonFunction.
|
|
203
|
+
* @internal
|
|
204
|
+
*/
|
|
205
|
+
_functionNode() {
|
|
206
|
+
return this.node;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Given the function arn, check if the account id matches this account
|
|
210
|
+
*
|
|
211
|
+
* Function ARNs look like this:
|
|
212
|
+
*
|
|
213
|
+
* arn:aws:lambda:region:account-id:function:function-name
|
|
214
|
+
*
|
|
215
|
+
* ..which means that in order to extract the `account-id` component from the ARN, we can
|
|
216
|
+
* split the ARN using ":" and select the component in index 4.
|
|
217
|
+
*
|
|
218
|
+
* @returns true if account id of function matches the account specified on the stack, false otherwise.
|
|
219
|
+
*
|
|
220
|
+
* @internal
|
|
221
|
+
*/
|
|
222
|
+
_isStackAccount() {
|
|
223
|
+
if (cdktf_1.Token.isUnresolved(this.stack.account) ||
|
|
224
|
+
cdktf_1.Token.isUnresolved(this.functionArn)) {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
return (this.stack.splitArn(this.functionArn, arn_1.ArnFormat.SLASH_RESOURCE_NAME)
|
|
228
|
+
.account === this.stack.account);
|
|
229
|
+
}
|
|
230
|
+
grant(grantee, identifier, action, resourceArns, permissionOverrides) {
|
|
231
|
+
const grant = iam.Grant.addToPrincipalOrResource({
|
|
232
|
+
grantee,
|
|
233
|
+
actions: [action],
|
|
234
|
+
resourceArns,
|
|
235
|
+
// Fake resource-like object on which to call addToResourcePolicy(), which actually
|
|
236
|
+
// calls addPermission()
|
|
237
|
+
resource: {
|
|
238
|
+
addToResourcePolicy: (_statement) => {
|
|
239
|
+
// Couldn't add permissions to the principal, so add them locally.
|
|
240
|
+
this.addPermission(identifier, {
|
|
241
|
+
principal: grantee.grantPrincipal,
|
|
242
|
+
action: action,
|
|
243
|
+
...permissionOverrides,
|
|
244
|
+
});
|
|
245
|
+
const permissionNode = this._functionNode().tryFindChild(identifier);
|
|
246
|
+
if (!permissionNode && !this._skipPermissions) {
|
|
247
|
+
throw new Error("Cannot modify permission to lambda function. Function is either imported or $LATEST version.\n" +
|
|
248
|
+
"If the function is imported from the same account use `fromFunctionAttributes()` API with the `sameEnvironment` flag.\n" +
|
|
249
|
+
"If the function is imported from a different account and already has the correct permissions use `fromFunctionAttributes()` API with the `skipPermissions` flag.");
|
|
250
|
+
}
|
|
251
|
+
return { statementAdded: true, policyDependable: permissionNode };
|
|
252
|
+
},
|
|
253
|
+
node: this.node,
|
|
254
|
+
stack: this.stack,
|
|
255
|
+
env: this.env,
|
|
256
|
+
environmentName: this.environmentName,
|
|
257
|
+
gridUUID: this.gridUUID,
|
|
258
|
+
outputs: {},
|
|
259
|
+
},
|
|
260
|
+
});
|
|
261
|
+
return grant;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Translate IPrincipal to something we can pass to aws_lambda_permission
|
|
265
|
+
* https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html#lambda-AddPermission-request-Principal
|
|
266
|
+
* https://registry.terraform.io/providers/hashicorp/aws/5.68.0/docs/resources/lambda_permission#principal
|
|
267
|
+
*
|
|
268
|
+
* Do some nasty things because `Permission` supports a subset of what the
|
|
269
|
+
* full IAM principal language supports, and we may not be able to parse strings
|
|
270
|
+
* outright because they may be tokens.
|
|
271
|
+
*
|
|
272
|
+
* Try to recognize some specific Principal classes first, then try a generic
|
|
273
|
+
* fallback.
|
|
274
|
+
*/
|
|
275
|
+
parsePermissionPrincipal(principal) {
|
|
276
|
+
// Try some specific common classes first.
|
|
277
|
+
// use duck-typing, not instance of
|
|
278
|
+
if ("wrapped" in principal) {
|
|
279
|
+
// eslint-disable-next-line dot-notation
|
|
280
|
+
principal = principal["wrapped"];
|
|
281
|
+
}
|
|
282
|
+
if ("accountId" in principal) {
|
|
283
|
+
return principal.accountId;
|
|
284
|
+
}
|
|
285
|
+
if ("service" in principal) {
|
|
286
|
+
return principal.service;
|
|
287
|
+
}
|
|
288
|
+
if ("arn" in principal) {
|
|
289
|
+
return principal.arn;
|
|
290
|
+
}
|
|
291
|
+
const stringEquals = matchSingleCondition("StringEquals", principal.policyFragment.conditions);
|
|
292
|
+
if (stringEquals &&
|
|
293
|
+
stringEquals.length === 1 &&
|
|
294
|
+
stringEquals[0].variable === "aws:PrincipalOrgID") {
|
|
295
|
+
// we will move the organization id to the `principalOrgId` property of `Permissions`.
|
|
296
|
+
return "*";
|
|
297
|
+
}
|
|
298
|
+
// Try a best-effort approach to support simple principals that are not any of the predefined
|
|
299
|
+
// classes, but are simple enough that they will fit into the Lambda Permission model.
|
|
300
|
+
// Main target here: imported Roles, Users, Groups.
|
|
301
|
+
//
|
|
302
|
+
// The principal cannot have conditions and must have a single { AWS: [arn] } entry.
|
|
303
|
+
const principals = principal.policyFragment.principals.filter((p) => p.type === "AWS");
|
|
304
|
+
if (principal.policyFragment.conditions.length === 0 &&
|
|
305
|
+
principals.length === 1) {
|
|
306
|
+
if (principals[0].identifiers.length === 1) {
|
|
307
|
+
return principals[0].identifiers[0];
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
throw new Error(`Invalid principal type for Lambda permission statement: ${principal.constructor.name}. ` +
|
|
311
|
+
"Supported: AccountPrincipal, ArnPrincipal, ServicePrincipal, OrganizationPrincipal");
|
|
312
|
+
/**
|
|
313
|
+
* Returns the conditions for a certain test if it exists and if there are no other conditions. Otherwise,
|
|
314
|
+
* returns undefined.
|
|
315
|
+
*/
|
|
316
|
+
function matchSingleCondition(test, obj) {
|
|
317
|
+
if (obj.length !== 1) {
|
|
318
|
+
return undefined;
|
|
319
|
+
}
|
|
320
|
+
return obj.filter((c) => c.test === test);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
validateConditionCombinations(principal) {
|
|
324
|
+
const conditions = this.validateConditions(principal);
|
|
325
|
+
if (!conditions) {
|
|
326
|
+
return undefined;
|
|
327
|
+
}
|
|
328
|
+
// TODO: what if more than 1 identifier? Should any of these throw?
|
|
329
|
+
const sourcArnConditions = conditions.filter((c) => c.test === "ArnLike" && c.variable === "aws:SourceArn");
|
|
330
|
+
const sourceArn = sourcArnConditions.length > 0
|
|
331
|
+
? sourcArnConditions[0].values[0]
|
|
332
|
+
: undefined;
|
|
333
|
+
// requireString(
|
|
334
|
+
// requireObject(conditions.ArnLike)?.["aws:SourceArn"],
|
|
335
|
+
// );
|
|
336
|
+
const sourceAccountConditions = conditions.filter((c) => c.test === "StringEquals" && c.variable === "aws:SourceAccount");
|
|
337
|
+
const sourceAccount = sourceAccountConditions.length > 0
|
|
338
|
+
? sourceAccountConditions[0].values[0]
|
|
339
|
+
: undefined;
|
|
340
|
+
// requireString(
|
|
341
|
+
// requireObject(conditions.StringEquals)?.["aws:SourceAccount"],
|
|
342
|
+
// );
|
|
343
|
+
const principalOrgIDConditions = conditions.filter((c) => c.test === "StringEquals" && c.variable === "aws:PrincipalOrgID");
|
|
344
|
+
const principalOrgID = principalOrgIDConditions.length > 0
|
|
345
|
+
? principalOrgIDConditions[0].values[0]
|
|
346
|
+
: undefined;
|
|
347
|
+
// requireString(
|
|
348
|
+
// requireObject(conditions.StringEquals)?.["aws:PrincipalOrgID"],
|
|
349
|
+
// );
|
|
350
|
+
// PrincipalOrgID cannot be combined with any other conditions
|
|
351
|
+
if (principalOrgID && (sourceArn || sourceAccount)) {
|
|
352
|
+
throw new Error("PrincipalWithConditions had unsupported condition combinations for Lambda permission statement: principalOrgID cannot be set with other conditions.");
|
|
353
|
+
}
|
|
354
|
+
return {
|
|
355
|
+
sourceArn,
|
|
356
|
+
sourceAccount,
|
|
357
|
+
principalOrgID,
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
validateConditions(principal) {
|
|
361
|
+
if (this.isPrincipalWithConditions(principal)) {
|
|
362
|
+
const conditions = principal.policyFragment.conditions;
|
|
363
|
+
// These are all the supported conditions. Some combinations are not supported,
|
|
364
|
+
// like only 'aws:SourceArn' or 'aws:PrincipalOrgID' and 'aws:SourceAccount'.
|
|
365
|
+
// These will be validated through `this.validateConditionCombinations`.
|
|
366
|
+
const supportedPrincipalConditions = [
|
|
367
|
+
{
|
|
368
|
+
test: "ArnLike",
|
|
369
|
+
variable: "aws:SourceArn",
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
test: "StringEquals",
|
|
373
|
+
variable: "aws:SourceAccount",
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
test: "StringEquals",
|
|
377
|
+
variable: "aws:PrincipalOrgID",
|
|
378
|
+
},
|
|
379
|
+
];
|
|
380
|
+
const unsupportedConditions = conditions.filter((condition) => !supportedPrincipalConditions.some((supportedCondition) => supportedCondition.test === condition.test &&
|
|
381
|
+
supportedCondition.variable === condition.variable));
|
|
382
|
+
if (unsupportedConditions.length == 0) {
|
|
383
|
+
return conditions;
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
throw new Error(`PrincipalWithConditions had unsupported conditions for Lambda permission statement: ${JSON.stringify(unsupportedConditions)}. ` +
|
|
387
|
+
`Supported operator/condition pairs: ${JSON.stringify(supportedPrincipalConditions)}`);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return undefined;
|
|
391
|
+
}
|
|
392
|
+
isPrincipalWithConditions(principal) {
|
|
393
|
+
return principal.policyFragment.conditions.length > 0;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
exports.LambdaFunctionBase = LambdaFunctionBase;
|
|
397
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
398
|
+
LambdaFunctionBase[_a] = { fqn: "terraconstructs.aws.compute.LambdaFunctionBase", version: "0.0.8" };
|
|
399
|
+
class QualifiedFunctionBase extends LambdaFunctionBase {
|
|
400
|
+
constructor() {
|
|
401
|
+
super(...arguments);
|
|
402
|
+
this.permissionsNode = this.node;
|
|
403
|
+
}
|
|
404
|
+
get resourceArnsForGrantInvoke() {
|
|
405
|
+
return [this.functionArn];
|
|
406
|
+
}
|
|
407
|
+
configureAsyncInvoke(options) {
|
|
408
|
+
if (this.node.tryFindChild("EventInvokeConfig") !== undefined) {
|
|
409
|
+
throw new Error(`An EventInvokeConfig has already been configured for the qualified function at ${this.node.path}`);
|
|
410
|
+
}
|
|
411
|
+
new event_invoke_config_1.EventInvokeConfig(this, "EventInvokeConfig", {
|
|
412
|
+
function: this.lambda,
|
|
413
|
+
qualifier: this.version,
|
|
414
|
+
...options,
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
exports.QualifiedFunctionBase = QualifiedFunctionBase;
|
|
419
|
+
_b = JSII_RTTI_SYMBOL_1;
|
|
420
|
+
QualifiedFunctionBase[_b] = { fqn: "terraconstructs.aws.compute.QualifiedFunctionBase", version: "0.0.8" };
|
|
421
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24tYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvY29tcHV0ZS9mdW5jdGlvbi1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOEpBQThKO0FBQzlKLHlIQUF5SDtBQUN6SCxpQ0FBaUM7QUFDakMsc0RBQXVEO0FBQ3ZELGlDQUF3RDtBQUV4RCxnQ0FBbUM7QUFDbkMsb0RBQW1FO0FBQ25FLDRDQUF3QztBQUV4QywrREFHK0I7QUFDL0IsaUVBR2dDO0FBRWhDLGlEQUl3QjtBQUN4Qiw4QkFBOEI7QUF5SzlCLE1BQXNCLGtCQUNwQixTQUFRLGdDQUFnQjtJQUQxQjs7UUEyRUU7OztXQUdHO1FBQ08sc0JBQWlCLEdBQThCLEVBQUUsQ0FBQztRQUU1RDs7O1dBR0c7UUFDTyxpQ0FBNEIsR0FBOEIsRUFBRSxDQUFDO0tBdWZ4RTtJQXJmQzs7OztPQUlHO0lBQ0ksYUFBYSxDQUFDLEVBQVUsRUFBRSxVQUFzQjtRQUNyRCxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUMzQiwrQkFBK0I7Z0JBQy9CLDZCQUE2QjtnQkFDN0IsbUJBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUM3QjtvQkFDRSxrRUFBa0UsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLGFBQWEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUc7b0JBQ2pILDBCQUEwQixvQkFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLGFBQWEsb0JBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxHQUFHO29CQUNuSCwyR0FBMkc7b0JBQzNHLDJDQUEyQztpQkFDNUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQ1osQ0FBQztZQUNKLENBQUM7WUFDRCxP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QUMsV0FBVyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVNLG9CQUFvQixDQUFDLE9BQWlDO1FBQzNELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM5RCxNQUFNLElBQUksS0FBSyxDQUNiLGtGQUFrRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUNuRyxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksdUNBQWlCLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO1lBQy9DLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNyQixTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDdkIsR0FBRyxPQUFPO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF0Qkgsc0RBdUJDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gc291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vY2RrdGYtcGx1cy9jZGt0Zi1wbHVzL2Jsb2IvNTg2YWFiYWQzYWIyZmIyYTJlOTNlMDVlZDMzZjk0NDc0ZWJlOTM5Ny9wYWNrYWdlcy8lNDBjZGt0Zi1wbHVzL2F3cy9saWIvYXdzLWxhbWJkYS1mdW5jdGlvbi9pbmRleC50c1xcXG4vLyB1cGRhdGUgdG8gYWxpZ24gd2l0aCBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNTYuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtbGFtYmRhL2xpYi9mdW5jdGlvbi1iYXNlLnRzXG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHsgbGFtYmRhUGVybWlzc2lvbiB9IGZyb20gXCJAY2RrdGYvcHJvdmlkZXItYXdzXCI7XG5pbXBvcnQgeyBJUmVzb2x2YWJsZSwgQW5ub3RhdGlvbnMsIFRva2VuIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBOb2RlIH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEFybkZvcm1hdCB9IGZyb20gXCIuLi9hcm5cIjtcbmltcG9ydCB7IEF3c0NvbnN0cnVjdEJhc2UsIElBd3NDb25zdHJ1Y3QgfSBmcm9tIFwiLi4vYXdzLWNvbnN0cnVjdFwiO1xuaW1wb3J0IHsgQXdzU3RhY2sgfSBmcm9tIFwiLi4vYXdzLXN0YWNrXCI7XG5pbXBvcnQgeyBBcmNoaXRlY3R1cmUgfSBmcm9tIFwiLi9hcmNoaXRlY3R1cmVcIjtcbmltcG9ydCB7XG4gIEV2ZW50SW52b2tlQ29uZmlnLFxuICBFdmVudEludm9rZUNvbmZpZ09wdGlvbnMsXG59IGZyb20gXCIuL2V2ZW50LWludm9rZS1jb25maWdcIjtcbmltcG9ydCB7XG4gIEV2ZW50U291cmNlTWFwcGluZyxcbiAgRXZlbnRTb3VyY2VNYXBwaW5nT3B0aW9ucyxcbn0gZnJvbSBcIi4vZXZlbnQtc291cmNlLW1hcHBpbmdcIjtcbmltcG9ydCB7IFBlcm1pc3Npb24gfSBmcm9tIFwiLi9mdW5jdGlvbi1wZXJtaXNzaW9uXCI7XG5pbXBvcnQge1xuICBGdW5jdGlvblVybE9wdGlvbnMsXG4gIEZ1bmN0aW9uVXJsLFxuICBGdW5jdGlvblVybEF1dGhUeXBlLFxufSBmcm9tIFwiLi9mdW5jdGlvbi11cmxcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiLi4vaWFtXCI7XG5cbi8vIFRPRE86IHJlLWFkZCBlYzIuSUNvbm5lY3RhYmxlP1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBMYW1iZGEgZnVuY3Rpb24gZGVmaW5lZCBvdXRzaWRlIG9mIHRoaXMgc3RhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb25BdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIExhbWJkYSBmdW5jdGlvbi5cbiAgICpcbiAgICogRm9ybWF0OiBhcm46PHBhcnRpdGlvbj46bGFtYmRhOjxyZWdpb24+OjxhY2NvdW50LWlkPjpmdW5jdGlvbjo8ZnVuY3Rpb24tbmFtZT5cbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gZXhlY3V0aW9uIHJvbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24uXG4gICAqXG4gICAqIElmIHRoZSByb2xlIGlzIG5vdCBzcGVjaWZpZWQsIGFueSByb2xlLXJlbGF0ZWQgb3BlcmF0aW9ucyB3aWxsIG5vLW9wLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZT86IGlhbS5JUm9sZTtcblxuICAvKipcbiAgICogVGhlIHNlY3VyaXR5IGdyb3VwIG9mIHRoaXMgTGFtYmRhLCBpZiBpbiBhIFZQQy5cbiAgICpcbiAgICogVGhpcyBuZWVkcyB0byBiZSBnaXZlbiBpbiBvcmRlciB0byBzdXBwb3J0IGFsbG93aW5nIGNvbm5lY3Rpb25zXG4gICAqIHRvIHRoaXMgTGFtYmRhLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cD86IHN0cmluZyB8IElSZXNvbHZhYmxlOyAvLyBUT0RPOiBSZS1hZGQgc3VwcG9ydCBmb3IgRUMyIHNlY3VyaXR5IGdyb3Vwc1xuXG4gIC8qKlxuICAgKiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgaW5mb3JtcyB0aGUgQ0RLIHRoYXQgdGhlIGltcG9ydGVkIGZ1bmN0aW9uIGlzIGluIHRoZSBzYW1lIGVudmlyb25tZW50IGFzIHRoZSBzdGFjay5cbiAgICogVGhpcyBhZmZlY3RzIGNlcnRhaW4gYmVoYXZpb3VycyBzdWNoIGFzLCB3aGV0aGVyIHRoaXMgZnVuY3Rpb24ncyBwZXJtaXNzaW9uIGNhbiBiZSBtb2RpZmllZC5cbiAgICogV2hlbiBub3QgY29uZmlndXJlZCwgdGhlIENESyBhdHRlbXB0cyB0byBhdXRvLWRldGVybWluZSB0aGlzLiBGb3IgZW52aXJvbm1lbnQgYWdub3N0aWMgc3RhY2tzLCBpLmUuLCBzdGFja3NcbiAgICogd2hlcmUgdGhlIGFjY291bnQgaXMgbm90IHNwZWNpZmllZCB3aXRoIHRoZSBgZW52YCBwcm9wZXJ0eSwgdGhpcyBpcyBkZXRlcm1pbmVkIHRvIGJlIGZhbHNlLlxuICAgKlxuICAgKiBTZXQgdGhpcyB0byBwcm9wZXJ0eSAqT05MWSBJRiogdGhlIGltcG9ydGVkIGZ1bmN0aW9uIGlzIGluIHRoZSBzYW1lIGFjY291bnQgYXMgdGhlIHN0YWNrXG4gICAqIGl0J3MgaW1wb3J0ZWQgaW4uXG4gICAqIEBkZWZhdWx0IC0gZGVwZW5kczogdHJ1ZSwgaWYgdGhlIFN0YWNrIGlzIGNvbmZpZ3VyZWQgd2l0aCBhbiBleHBsaWNpdCBgZW52YCAoYWNjb3VudCBhbmQgcmVnaW9uKSBhbmQgdGhlIGFjY291bnQgaXMgdGhlIHNhbWUgYXMgdGhpcyBmdW5jdGlvbi5cbiAgICogRm9yIGVudmlyb25tZW50LWFnbm9zdGljIHN0YWNrcyB0aGlzIHdpbGwgZGVmYXVsdCB0byBgZmFsc2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2FtZUVudmlyb25tZW50PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0dGluZyB0aGlzIHByb3BlcnR5IGluZm9ybXMgdGhlIFRlcnJhQ29uc3RydWN0IHRoYXQgdGhlIGltcG9ydGVkIGZ1bmN0aW9uIEFMUkVBRFkgSEFTIHRoZSBuZWNlc3NhcnkgcGVybWlzc2lvbnNcbiAgICogZm9yIHdoYXQgeW91IGFyZSB0cnlpbmcgdG8gZG8uIFdoZW4gbm90IGNvbmZpZ3VyZWQsIEUuVCwgYXR0ZW1wdHMgdG8gYXV0by1kZXRlcm1pbmUgd2hldGhlciBvciBub3RcbiAgICogYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBhcmUgbmVjZXNzYXJ5IG9uIHRoZSBmdW5jdGlvbiB3aGVuIGdyYW50IEFQSXMgYXJlIHVzZWQuIElmIFRlcnJhQ29uc3RydWN0IHRyaWVkIHRvIGFkZFxuICAgKiBwZXJtaXNzaW9ucyBvbiBhbiBpbXBvcnRlZCBsYW1iZGEsIGl0IHdpbGwgZmFpbC5cbiAgICpcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgKk9OTFkgSUYqIHlvdSBhcmUgY29tbWl0dGluZyB0byBtYW5hZ2UgdGhlIGltcG9ydGVkIGZ1bmN0aW9uJ3MgcGVybWlzc2lvbnMgb3V0c2lkZSBvZlxuICAgKiB0aGlzIFRlcnJhQ29uc3RydWN0IHN0YWNrLiBZb3UgYXJlIGFja25vd2xlZGdpbmcgdGhhdCB5b3VyIFRlcnJhQ29uc3RydWN0IGNvZGUgYWxvbmUgd2lsbCBoYXZlIGluc3VmZmljaWVudCBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhlXG4gICAqIGltcG9ydGVkIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcFBlcm1pc3Npb25zPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGFyY2hpdGVjdHVyZSBvZiB0aGlzIExhbWJkYSBGdW5jdGlvbiAodGhpcyBpcyBhbiBvcHRpb25hbCBhdHRyaWJ1dGUgYW5kIGRlZmF1bHRzIHRvIFg4Nl82NCkuXG4gICAqIEBkZWZhdWx0IC0gQXJjaGl0ZWN0dXJlLlg4Nl82NFxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlO1xufVxuXG4vKipcbiAqIEEgTGFtYmRhIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElGdW5jdGlvbiBleHRlbmRzIElBd3NDb25zdHJ1Y3QsIGlhbS5JR3JhbnRhYmxlIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbkFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHJvbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSByb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBUaGUgY29uc3RydWN0IG5vZGUgd2hlcmUgcGVybWlzc2lvbnMgYXJlIGF0dGFjaGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGVybWlzc2lvbnNOb2RlOiBOb2RlO1xuXG4gIC8qKlxuICAgKiBUaGUgc3lzdGVtIGFyY2hpdGVjdHVyZXMgY29tcGF0aWJsZSB3aXRoIHRoaXMgbGFtYmRhIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmU7XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgc291cmNlIHRoYXQgbWFwcyB0byB0aGlzIEFXUyBMYW1iZGEgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSBpZCBjb25zdHJ1Y3QgSURcbiAgICogQHBhcmFtIG9wdGlvbnMgbWFwcGluZyBvcHRpb25zXG4gICAqL1xuICBhZGRFdmVudFNvdXJjZU1hcHBpbmcoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBFdmVudFNvdXJjZU1hcHBpbmdPcHRpb25zLFxuICApOiBFdmVudFNvdXJjZU1hcHBpbmc7XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgc291cmNlIHRvIHRoaXMgZnVuY3Rpb24uXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBhZGRzIGFuIFNRUyBRdWV1ZSBhcyBhbiBldmVudCBzb3VyY2U6XG4gICAqIGBgYFxuICAgKiBpbXBvcnQgeyBjb21wdXRlIH0gZnJvbSAndGVycmFjb25zdHJ1Y3RzJztcbiAgICogbXlGdW5jdGlvbi5hZGRFdmVudFNvdXJjZShuZXcgY29tcHV0ZS5TcXNFdmVudFNvdXJjZShteVF1ZXVlKSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRXZlbnRTb3VyY2Uoc291cmNlOiBJRXZlbnRTb3VyY2UpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgcGVybWlzc2lvbiB0byB0aGUgTGFtYmRhIHJlc291cmNlIHBvbGljeS5cbiAgICogQHBhcmFtIGlkIFRoZSBpZCBmb3IgdGhlIHBlcm1pc3Npb24gY29uc3RydWN0XG4gICAqIEBwYXJhbSBwZXJtaXNzaW9uIFRoZSBwZXJtaXNzaW9uIHRvIGdyYW50IHRvIHRoaXMgTGFtYmRhIGZ1bmN0aW9uLiBAc2VlIFBlcm1pc3Npb24gZm9yIGRldGFpbHMuXG4gICAqL1xuICBhZGRQZXJtaXNzaW9uKGlkOiBzdHJpbmcsIHBlcm1pc3Npb246IFBlcm1pc3Npb24pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgc3RhdGVtZW50IHRvIHRoZSBJQU0gcm9sZSBhc3N1bWVkIGJ5IHRoZSBpbnN0YW5jZS5cbiAgICovXG4gIGFkZFRvUm9sZVBvbGljeShzdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gaWRlbnRpdHkgcGVybWlzc2lvbnMgdG8gaW52b2tlIHRoaXMgTGFtYmRhXG4gICAqL1xuICBncmFudEludm9rZShpZGVudGl0eTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHRoZSBnaXZlbiBpZGVudGl0eSBwZXJtaXNzaW9ucyB0byBpbnZva2UgdGhlICRMQVRFU1QgdmVyc2lvbiBvclxuICAgKiB1bnF1YWxpZmllZCB2ZXJzaW9uIG9mIHRoaXMgTGFtYmRhXG4gICAqL1xuICBncmFudEludm9rZUxhdGVzdFZlcnNpb24oaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gaWRlbnRpdHkgcGVybWlzc2lvbnMgdG8gaW52b2tlIHRoZSBnaXZlbiAob3IgbGF0ZXN0KSB2ZXJzaW9uIG9mIHRoaXMgTGFtYmRhXG4gICAqL1xuICBncmFudEludm9rZVZlcnNpb24oaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLCB2ZXJzaW9uOiBzdHJpbmcpOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHRoZSBnaXZlbiBpZGVudGl0eSBwZXJtaXNzaW9ucyB0byBpbnZva2UgdGhpcyBMYW1iZGEgRnVuY3Rpb24gVVJMXG4gICAqL1xuICBncmFudEludm9rZVVybChpZGVudGl0eTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IG11bHRpcGxlIHByaW5jaXBhbHMgdGhlIGFiaWxpdHkgdG8gaW52b2tlIHRoaXMgTGFtYmRhIHZpYSBDb21wb3NpdGVQcmluY2lwYWxcbiAgICovXG4gIGdyYW50SW52b2tlQ29tcG9zaXRlUHJpbmNpcGFsKFxuICAgIGNvbXBvc2l0ZVByaW5jaXBhbDogaWFtLkNvbXBvc2l0ZVByaW5jaXBhbCxcbiAgKTogaWFtLkdyYW50W107XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgb3B0aW9ucyBmb3IgYXN5bmNocm9ub3VzIGludm9jYXRpb24uXG4gICAqL1xuICBjb25maWd1cmVBc3luY0ludm9rZShvcHRpb25zOiBFdmVudEludm9rZUNvbmZpZ09wdGlvbnMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgdXJsIHRvIHRoaXMgbGFtYmRhIGZ1bmN0aW9uLlxuICAgKi9cbiAgYWRkRnVuY3Rpb25Vcmwob3B0aW9ucz86IEZ1bmN0aW9uVXJsT3B0aW9ucyk6IEZ1bmN0aW9uVXJsO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTGFtYmRhRnVuY3Rpb25CYXNlXG4gIGV4dGVuZHMgQXdzQ29uc3RydWN0QmFzZVxuICBpbXBsZW1lbnRzIElGdW5jdGlvblxue1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJpbmNpcGFsIHRoaXMgTGFtYmRhIEZ1bmN0aW9uIGlzIHJ1bm5pbmcgYXNcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gZm8gdGhlIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBTaG91bGQgaW5jbHVkZSB2ZXJzaW9uIChpZiB2ZXJzaW9uaW5nIGlzIGVuYWJsZWQgdmlhIHB1Ymxpc2ggPSB0cnVlKVxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGZ1bmN0aW9uQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExhdGVzdCBwdWJsaXNoZWQgdmVyc2lvbiBvZiB5b3VyIExhbWJkYSBGdW5jdGlvbi5cbiAgICpcbiAgICogVXNlZCBhcyBxdWFsaWZpZXIgb2YgdGhlIHZlcnNpb24gb3IgYWxpYXMgb2YgdGhpcyBmdW5jdGlvbi5cbiAgICogQSBxdWFsaWZpZXIgaXMgdGhlIGlkZW50aWZpZXIgdGhhdCdzIGFwcGVuZGVkIHRvIGEgdmVyc2lvbiBvciBhbGlhcyBBUk4uXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvQVBJX0dldEZ1bmN0aW9uQ29uZmlndXJhdGlvbi5odG1sI0FQSV9HZXRGdW5jdGlvbkNvbmZpZ3VyYXRpb25fUmVxdWVzdFBhcmFtZXRlcnNcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBxdWFsaWZpZXIgb2YgdGhlIHZlcnNpb24gb3IgYWxpYXMgb2YgdGhpcyBmdW5jdGlvbi5cbiAgICogQSBxdWFsaWZpZXIgaXMgdGhlIGlkZW50aWZpZXIgdGhhdCdzIGFwcGVuZGVkIHRvIGEgdmVyc2lvbiBvciBhbGlhcyBBUk4uXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvQVBJX0dldEZ1bmN0aW9uQ29uZmlndXJhdGlvbi5odG1sI0FQSV9HZXRGdW5jdGlvbkNvbmZpZ3VyYXRpb25fUmVxdWVzdFBhcmFtZXRlcnNcbiAgICovXG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gcm9sZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBmdW5jdGlvbi5cbiAgICpcbiAgICogVW5kZWZpbmVkIGlmIHRoZSBmdW5jdGlvbiB3YXMgaW1wb3J0ZWQgd2l0aG91dCBhIHJvbGUuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgcm9sZT86IGlhbS5JUm9sZTtcblxuICAvKipcbiAgICogVGhlIGNvbnN0cnVjdCBub2RlIHdoZXJlIHBlcm1pc3Npb25zIGFyZSBhdHRhY2hlZC5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBwZXJtaXNzaW9uc05vZGU6IE5vZGU7XG5cbiAgLyoqXG4gICAqIFRoZSBhcmNoaXRlY3R1cmUgb2YgdGhpcyBMYW1iZGEgRnVuY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGFkZFBlcm1pc3Npb24oKSBjYWxsIGFkZHMgYW55IHBlcm1pc3Npb25zXG4gICAqXG4gICAqIFRydWUgZm9yIG5ldyBMYW1iZGFzLCBmYWxzZSBmb3IgdmVyc2lvbiAkTEFURVNUIGFuZCBpbXBvcnRlZCBMYW1iZGFzXG4gICAqIGZyb20gZGlmZmVyZW50IGFjY291bnRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IGNhbkNyZWF0ZVBlcm1pc3Npb25zOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOKHMpIHRvIHB1dCBpbnRvIHRoZSByZXNvdXJjZSBmaWVsZCBvZiB0aGUgZ2VuZXJhdGVkIElBTSBwb2xpY3kgZm9yIGdyYW50SW52b2tlKClcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSByZXNvdXJjZUFybnNGb3JHcmFudEludm9rZTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHVzZXIgZGVjaWRlcyB0byBza2lwIGFkZGluZyBwZXJtaXNzaW9ucy5cbiAgICogVGhlIG9ubHkgdXNlIGNhc2UgaXMgZm9yIGNyb3NzLWFjY291bnQsIGltcG9ydGVkIGxhbWJkYXNcbiAgICogd2hlcmUgdGhlIHVzZXIgY29tbWl0cyB0byBtb2RpZnlpbmcgdGhlIHBlcm1pc3NzaW9uc1xuICAgKiBvbiB0aGUgaW1wb3J0ZWQgbGFtYmRhIG91dHNpZGUgdGhpcyBUZXJyYUNvbnN0cnVjdCBTcGVjLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBfc2tpcFBlcm1pc3Npb25zPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTWFwcGluZyBvZiBpbnZvY2F0aW9uIHByaW5jaXBhbHMgdG8gZ3JhbnRzLiBVc2VkIHRvIGRlLWR1cGUgYGdyYW50SW52b2tlKClgIGNhbGxzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfaW52b2NhdGlvbkdyYW50czogUmVjb3JkPHN0cmluZywgaWFtLkdyYW50PiA9IHt9O1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIGZ1Y250aW9uIFVSTCBpbnZvY2F0aW9uIHByaW5jaXBhbHMgdG8gZ3JhbnRzLiBVc2VkIHRvIGRlLWR1cGUgYGdyYW50SW52b2tlVXJsKClgIGNhbGxzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfZnVuY3Rpb25VcmxJbnZvY2F0aW9uR3JhbnRzOiBSZWNvcmQ8c3RyaW5nLCBpYW0uR3JhbnQ+ID0ge307XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBwZXJtaXNzaW9uIHRvIHRoZSBMYW1iZGEgcmVzb3VyY2UgcG9saWN5LlxuICAgKiBAcGFyYW0gaWQgVGhlIGlkIGZvciB0aGUgcGVybWlzc2lvbiBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIHBlcm1pc3Npb24gVGhlIHBlcm1pc3Npb24gdG8gZ3JhbnQgdG8gdGhpcyBMYW1iZGEgZnVuY3Rpb24uIEBzZWUgUGVybWlzc2lvbiBmb3IgZGV0YWlscy5cbiAgICovXG4gIHB1YmxpYyBhZGRQZXJtaXNzaW9uKGlkOiBzdHJpbmcsIHBlcm1pc3Npb246IFBlcm1pc3Npb24pIHtcbiAgICBpZiAoIXRoaXMuY2FuQ3JlYXRlUGVybWlzc2lvbnMpIHtcbiAgICAgIGlmICghdGhpcy5fc2tpcFBlcm1pc3Npb25zKSB7XG4gICAgICAgIC8vIFRPRE86IHJldmlzZSB0aGlzIGFubm90YXRpb25cbiAgICAgICAgLy8gVW5jbGVhciBMYW1iZGEgRW52aXJvbm1lbnRcbiAgICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZyhcbiAgICAgICAgICBbXG4gICAgICAgICAgICBgYWRkUGVybWlzc2lvbigpIGhhcyBubyBlZmZlY3Qgb24gYSBMYW1iZGEgRnVuY3Rpb24gd2l0aCByZWdpb249JHt0aGlzLmVudi5yZWdpb259LCBhY2NvdW50PSR7dGhpcy5lbnYuYWNjb3VudH0sYCxcbiAgICAgICAgICAgIGBpbiBhIFN0YWNrIHdpdGggcmVnaW9uPSR7QXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3QodGhpcykucmVnaW9ufSwgYWNjb3VudD0ke0F3c1N0YWNrLm9mQXdzQ29uc3RydWN0KHRoaXMpLmFjY291bnR9LmAsXG4gICAgICAgICAgICBgU3VwcHJlc3MgdGhpcyB3YXJuaW5nIGlmIHRoaXMgaXMgaXMgaW50ZW50aW9uYWwsIG9yIHBhc3Mgc2FtZUVudmlyb25tZW50PXRydWUgdG8gZnJvbUZ1bmN0aW9uQXR0cmlidXRlcygpYCxcbiAgICAgICAgICAgIGBpZiB5b3Ugd291bGQgbGlrZSB0byBhZGQgdGhlIHBlcm1pc3Npb25zLmAsXG4gICAgICAgICAgXS5qb2luKFwiIFwiKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcHJpbmNpcGFsID0gdGhpcy5wYXJzZVBlcm1pc3Npb25QcmluY2lwYWwocGVybWlzc2lvbi5wcmluY2lwYWwpO1xuXG4gICAgbGV0IHsgc291cmNlQXJuLCBzb3VyY2VBY2NvdW50LCBwcmluY2lwYWxPcmdJRCB9ID1cbiAgICAgIHRoaXMudmFsaWRhdGVDb25kaXRpb25Db21iaW5hdGlvbnMocGVybWlzc2lvbi5wcmluY2lwYWwpID8/IHt9O1xuXG4gICAgY29uc3QgYWN0aW9uID0gcGVybWlzc2lvbi5hY3Rpb24gPz8gXCJsYW1iZGE6SW52b2tlRnVuY3Rpb25cIjtcbiAgICBjb25zdCBzY29wZSA9IHBlcm1pc3Npb24uc2NvcGUgPz8gdGhpcztcblxuICAgIC8qKlxuICAgICAqIERvIGludm9rZUZ1bmN0aW9uIGxhbWJkYXMgd2l0aCB1bnF1YWxpZmllZCBmdW5jdGlvbiByZWZlcmVuY2VzIGFwcGx5IHRvIFRGP1xuICAgICAqIEEgd2FybmluZyBzaG91bGQgYmUgYWRkZWQgdG8gZnVuY3Rpb25zIHVuZGVyIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAgICAgKiAtIHBlcm1pc3Npb25zIHRoYXQgaW5jbHVkZSBgbGFtYmRhOkludm9rZUZ1bmN0aW9uYCBhcmUgYWRkZWQgdG8gdGhlIHVucXVhbGlmaWVkIGZ1bmN0aW9uLlxuICAgICAqIC0gZnVuY3Rpb24uY3VycmVudFZlcnNpb24gaXMgaW52b2tlZCBiZWZvcmUgb3IgYWZ0ZXIgdGhlIHBlcm1pc3Npb24gaXMgY3JlYXRlZC5cbiAgICAgKlxuICAgICAqIFRoaXMgYXBwbGllcyBvbmx5IHRvIHBlcm1pc3Npb25zIG9uIExhbWJkYSBmdW5jdGlvbnMsIG5vdCB2ZXJzaW9ucyBvciBhbGlhc2VzLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgb3ZlcnJpZGRlbiBhcyBhIG5vT3AgZm9yIFF1YWxpZmllZEZ1bmN0aW9uQmFzZS5cbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNjAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtbGFtYmRhL2xpYi9mdW5jdGlvbi1iYXNlLnRzI0wzMzJcbiAgICAgKi9cbiAgICAvLyBbXG4gICAgLy8gICBcIkFXUyBMYW1iZGEgaGFzIGNoYW5nZWQgdGhlaXIgYXV0aG9yaXphdGlvbiBzdHJhdGVneSwgd2hpY2ggbWF5IGNhdXNlIGNsaWVudCBpbnZvY2F0aW9ucyB1c2luZyB0aGUgJ1F1YWxpZmllcicgcGFyYW1ldGVyIG9mIHRoZSBsYW1iZGEgZnVuY3Rpb24gdG8gZmFpbCB3aXRoIEFjY2VzcyBEZW5pZWQgZXJyb3JzLlwiLFxuICAgIC8vICAgXCJJZiB5b3UgYXJlIHVzaW5nIGEgbGFtYmRhIFZlcnNpb24gb3IgQWxpYXMsIG1ha2Ugc3VyZSB0byBjYWxsICdncmFudEludm9rZScgb3IgJ2FkZFBlcm1pc3Npb24nIG9uIHRoZSBWZXJzaW9uIG9yIEFsaWFzLCBub3QgdGhlIHVuZGVybHlpbmcgRnVuY3Rpb25cIixcbiAgICAvLyAgICdTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvMTkyNzMnLFxuICAgIC8vIF0uam9pbignXFxuJykpO1xuXG4gICAgbmV3IGxhbWJkYVBlcm1pc3Npb24uTGFtYmRhUGVybWlzc2lvbihzY29wZSwgaWQsIHtcbiAgICAgIGFjdGlvbixcbiAgICAgIHByaW5jaXBhbCxcbiAgICAgIC8vIHF1YWxpZmllcjogcGVybWlzc2lvbi5xdWFsaWZpZXIsXG4gICAgICBmdW5jdGlvbk5hbWU6IHRoaXMuZnVuY3Rpb25Bcm4sXG4gICAgICBldmVudFNvdXJjZVRva2VuOiBwZXJtaXNzaW9uLmV2ZW50U291cmNlVG9rZW4sXG4gICAgICBzb3VyY2VBY2NvdW50OiBwZXJtaXNzaW9uLnNvdXJjZUFjY291bnQgPz8gc291cmNlQWNjb3VudCxcbiAgICAgIHNvdXJjZUFybjogcGVybWlzc2lvbi5zb3VyY2VBcm4gPz8gc291cmNlQXJuLFxuICAgICAgcHJpbmNpcGFsT3JnSWQ6IHBlcm1pc3Npb24ub3JnYW5pemF0aW9uSWQgPz8gcHJpbmNpcGFsT3JnSUQsXG4gICAgICBmdW5jdGlvblVybEF1dGhUeXBlOiBwZXJtaXNzaW9uLmZ1bmN0aW9uVXJsQXV0aFR5cGUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHN0YXRlbWVudCB0byB0aGUgSUFNIHJvbGUgYXNzdW1lZCBieSB0aGUgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgYWRkVG9Sb2xlUG9saWN5KHN0YXRlbWVudDogaWFtLlBvbGljeVN0YXRlbWVudCkge1xuICAgIGlmICghdGhpcy5yb2xlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KHN0YXRlbWVudCk7XG4gIH1cblxuICBwdWJsaWMgYWRkRXZlbnRTb3VyY2VNYXBwaW5nKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRXZlbnRTb3VyY2VNYXBwaW5nT3B0aW9ucyxcbiAgKTogRXZlbnRTb3VyY2VNYXBwaW5nIHtcbiAgICByZXR1cm4gbmV3IEV2ZW50U291cmNlTWFwcGluZyh0aGlzLCBpZCwge1xuICAgICAgdGFyZ2V0OiB0aGlzLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gaWRlbnRpdHkgcGVybWlzc2lvbnMgdG8gaW52b2tlIHRoaXMgTGFtYmRhXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRJbnZva2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIGNvbnN0IGhhc2ggPSBjcnlwdG9cbiAgICAgIC5jcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgICAudXBkYXRlKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgcHJpbmNpcGFsOiBncmFudGVlLmdyYW50UHJpbmNpcGFsLnRvU3RyaW5nKCksXG4gICAgICAgICAgY29uZGl0aW9uczogZ3JhbnRlZS5ncmFudFByaW5jaXBhbC5wb2xpY3lGcmFnbWVudC5jb25kaXRpb25zLFxuICAgICAgICB9KSxcbiAgICAgICAgXCJ1dGY4XCIsXG4gICAgICApXG4gICAgICAuZGlnZXN0KFwiYmFzZTY0XCIpO1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSBgSW52b2tlJHtoYXNofWA7XG5cbiAgICAvLyBNZW1vaXplIHRoZSByZXN1bHQgc28gc3Vic2VxdWVudCBncmFudEludm9rZSgpIGNhbGxzIGFyZSBpZGVtcG90ZW50XG4gICAgbGV0IGdyYW50ID0gdGhpcy5faW52b2NhdGlvbkdyYW50c1tpZGVudGlmaWVyXTtcbiAgICBpZiAoIWdyYW50KSB7XG4gICAgICBncmFudCA9IHRoaXMuZ3JhbnQoXG4gICAgICAgIGdyYW50ZWUsXG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIFwibGFtYmRhOkludm9rZUZ1bmN0aW9uXCIsXG4gICAgICAgIHRoaXMucmVzb3VyY2VBcm5zRm9yR3JhbnRJbnZva2UsXG4gICAgICApO1xuICAgICAgdGhpcy5faW52b2NhdGlvbkdyYW50c1tpZGVudGlmaWVyXSA9IGdyYW50O1xuICAgIH1cbiAgICByZXR1cm4gZ3JhbnQ7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgdGhlIGdpdmVuIGlkZW50aXR5IHBlcm1pc3Npb25zIHRvIGludm9rZSB0aGUgJExBVEVTVCB2ZXJzaW9uIG9yXG4gICAqIHVucXVhbGlmaWVkIHZlcnNpb24gb2YgdGhpcyBMYW1iZGFcbiAgICovXG4gIHB1YmxpYyBncmFudEludm9rZUxhdGVzdFZlcnNpb24oZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdyYW50SW52b2tlVmVyc2lvbihncmFudGVlLCB0aGlzLnZlcnNpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHRoZSBnaXZlbiBpZGVudGl0eSBwZXJtaXNzaW9ucyB0byBpbnZva2UgdGhlIGdpdmVuIHZlcnNpb24gb2YgdGhpcyBMYW1iZGFcbiAgICovXG4gIHB1YmxpYyBncmFudEludm9rZVZlcnNpb24oXG4gICAgZ3JhbnRlZTogaWFtLklHcmFudGFibGUsXG4gICAgdmVyc2lvbjogc3RyaW5nLFxuICApOiBpYW0uR3JhbnQge1xuICAgIGxldCBncmFudDogaWFtLkdyYW50O1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQodmVyc2lvbikpIHtcbiAgICAgIC8vIElkZW50aWZpZXIgaXMgc2V0IHRvIFwiSW52b2tlTGF0ZXN0XCI/P1xuICAgICAgcmV0dXJuIHRoaXMuZ3JhbnRJbnZva2UoZ3JhbnRlZSk7XG4gICAgfVxuICAgIC8vIGVsc2UsIHVzZSB2ZXJzaW9uIHN0cmluZyBpbiBoYXNoP1xuICAgIGNvbnN0IGhhc2ggPSBjcnlwdG9cbiAgICAgIC5jcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgICAudXBkYXRlKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgcHJpbmNpcGFsOiBncmFudGVlLmdyYW50UHJpbmNpcGFsLnRvU3RyaW5nKCksXG4gICAgICAgICAgY29uZGl0aW9uczogZ3JhbnRlZS5ncmFudFByaW5jaXBhbC5wb2xpY3lGcmFnbWVudC5jb25kaXRpb25zLFxuICAgICAgICAgIHZlcnNpb246IHZlcnNpb24sXG4gICAgICAgIH0pLFxuICAgICAgICBcInV0ZjhcIixcbiAgICAgIClcbiAgICAgIC5kaWdlc3QoXCJiYXNlNjRcIik7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IGBJbnZva2Uke2hhc2h9YDtcblxuICAgIC8vIE1lbW9pemUgdGhlIHJlc3VsdCBzbyBzdWJzZXF1ZW50IGdyYW50SW52b2tlKCkgY2FsbHMgYXJlIGlkZW1wb3RlbnRcbiAgICBncmFudCA9IHRoaXMuX2ludm9jYXRpb25HcmFudHNbaWRlbnRpZmllcl07XG4gICAgaWYgKCFncmFudCkge1xuICAgICAgbGV0IHJlc291Y2VBcm5zID0gW2Ake3RoaXMuZnVuY3Rpb25Bcm59OiR7dmVyc2lvbn1gXTtcbiAgICAgIGlmICh2ZXJzaW9uID09IHRoaXMudmVyc2lvbikge1xuICAgICAgICByZXNvdWNlQXJucy5wdXNoKHRoaXMuZnVuY3Rpb25Bcm4pO1xuICAgICAgfVxuICAgICAgZ3JhbnQgPSB0aGlzLmdyYW50KFxuICAgICAgICBncmFudGVlLFxuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBcImxhbWJkYTpJbnZva2VGdW5jdGlvblwiLFxuICAgICAgICByZXNvdWNlQXJucyxcbiAgICAgICk7XG4gICAgICB0aGlzLl9pbnZvY2F0aW9uR3JhbnRzW2lkZW50aWZpZXJdID0gZ3JhbnQ7XG4gICAgfVxuICAgIHJldHVybiBncmFudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gaWRlbnRpdHkgcGVybWlzc2lvbnMgdG8gaW52b2tlIHRoaXMgTGFtYmRhIEZ1bmN0aW9uIFVSTFxuICAgKi9cbiAgcHVibGljIGdyYW50SW52b2tlVXJsKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gYEludm9rZUZ1bmN0aW9uVXJsJHtncmFudGVlLmdyYW50UHJpbmNpcGFsfWA7IC8vIGNhbGxzIHRoZSAudG9TdHJpbmcoKSBvZiB0aGUgcHJpbmNpcGFsXG5cbiAgICAvLyBNZW1vaXplIHRoZSByZXN1bHQgc28gc3Vic2VxdWVudCBncmFudEludm9rZSgpIGNhbGxzIGFyZSBpZGVtcG90ZW50XG4gICAgbGV0IGdyYW50ID0gdGhpcy5fZnVuY3Rpb25VcmxJbnZvY2F0aW9uR3JhbnRzW2lkZW50aWZpZXJdO1xuICAgIGlmICghZ3JhbnQpIHtcbiAgICAgIGdyYW50ID0gdGhpcy5ncmFudChcbiAgICAgICAgZ3JhbnRlZSxcbiAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgXCJsYW1iZGE6SW52b2tlRnVuY3Rpb25VcmxcIixcbiAgICAgICAgW3RoaXMuZnVuY3Rpb25Bcm5dLFxuICAgICAgICB7XG4gICAgICAgICAgZnVuY3Rpb25VcmxBdXRoVHlwZTogRnVuY3Rpb25VcmxBdXRoVHlwZS5BV1NfSUFNLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHRoaXMuX2Z1bmN0aW9uVXJsSW52b2NhdGlvbkdyYW50c1tpZGVudGlmaWVyXSA9IGdyYW50O1xuICAgIH1cbiAgICByZXR1cm4gZ3JhbnQ7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgbXVsdGlwbGUgcHJpbmNpcGFscyB0aGUgYWJpbGl0eSB0byBpbnZva2UgdGhpcyBMYW1iZGEgdmlhIENvbXBvc2l0ZVByaW5jaXBhbFxuICAgKi9cbiAgcHVibGljIGdyYW50SW52b2tlQ29tcG9zaXRlUHJpbmNpcGFsKFxuICAgIGNvbXBvc2l0ZVByaW5jaXBhbDogaWFtLkNvbXBvc2l0ZVByaW5jaXBhbCxcbiAgKTogaWFtLkdyYW50W10ge1xuICAgIHJldHVybiBjb21wb3NpdGVQcmluY2lwYWwucHJpbmNpcGFscy5tYXAoKHByaW5jaXBhbCkgPT5cbiAgICAgIHRoaXMuZ3JhbnRJbnZva2UocHJpbmNpcGFsKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFkZEV2ZW50U291cmNlKHNvdXJjZTogSUV2ZW50U291cmNlKSB7XG4gICAgc291cmNlLmJpbmQodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgY29uZmlndXJlQXN5bmNJbnZva2Uob3B0aW9uczogRXZlbnRJbnZva2VDb25maWdPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubm9kZS50cnlGaW5kQ2hpbGQoXCJFdmVudEludm9rZUNvbmZpZ1wiKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBbiBFdmVudEludm9rZUNvbmZpZyBoYXMgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQgZm9yIHRoZSBmdW5jdGlvbiBhdCAke3RoaXMubm9kZS5wYXRofWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIG5ldyBFdmVudEludm9rZUNvbmZpZyh0aGlzLCBcIkV2ZW50SW52b2tlQ29uZmlnXCIsIHtcbiAgICAgIGZ1bmN0aW9uOiB0aGlzLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIFVSTCBpcyBhIGRlZGljYXRlZCBIVFRQKFMpIGVuZHBvaW50IGZvciBhIExhbWJkYSBmdW5jdGlvbi5cbiAgICovXG4gIHB1YmxpYyBhZGRGdW5jdGlvblVybChvcHRpb25zPzogRnVuY3Rpb25VcmxPcHRpb25zKTogRnVuY3Rpb25Vcmwge1xuICAgIGlmICh0aGlzLm5vZGUudHJ5RmluZENoaWxkKFwiRnVuY3Rpb25VcmxcIikgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQSBGdW5jdGlvblVybCBoYXMgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQgZm9yIHRoZSBmdW5jdGlvbiBhdCAke3RoaXMubm9kZS5wYXRofWAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uVXJsKHRoaXMsIFwiRnVuY3Rpb25VcmxcIiwge1xuICAgICAgZnVuY3Rpb246IHRoaXMsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbnN0cnVjdCB0cmVlIG5vZGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbGFtYmRhIGZ1bmN0aW9uLlxuICAgKiBGb3IgdXNlIGludGVybmFsbHkgZm9yIGNvbnN0cnVjdHMsIHdoZW4gdGhlIHRyZWUgaXMgc2V0IHVwIGluIG5vbi1zdGFuZGFyZCB3YXlzLiBFeDogU2luZ2xldG9uRnVuY3Rpb24uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIF9mdW5jdGlvbk5vZGUoKTogTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiB0aGUgZnVuY3Rpb24gYXJuLCBjaGVjayBpZiB0aGUgYWNjb3VudCBpZCBtYXRjaGVzIHRoaXMgYWNjb3VudFxuICAgKlxuICAgKiBGdW5jdGlvbiBBUk5zIGxvb2sgbGlrZSB0aGlzOlxuICAgKlxuICAgKiAgIGFybjphd3M6bGFtYmRhOnJlZ2lvbjphY2NvdW50LWlkOmZ1bmN0aW9uOmZ1bmN0aW9uLW5hbWVcbiAgICpcbiAgICogLi53aGljaCBtZWFucyB0aGF0IGluIG9yZGVyIHRvIGV4dHJhY3QgdGhlIGBhY2NvdW50LWlkYCBjb21wb25lbnQgZnJvbSB0aGUgQVJOLCB3ZSBjYW5cbiAgICogc3BsaXQgdGhlIEFSTiB1c2luZyBcIjpcIiBhbmQgc2VsZWN0IHRoZSBjb21wb25lbnQgaW4gaW5kZXggNC5cbiAgICpcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBhY2NvdW50IGlkIG9mIGZ1bmN0aW9uIG1hdGNoZXMgdGhlIGFjY291bnQgc3BlY2lmaWVkIG9uIHRoZSBzdGFjaywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfaXNTdGFja0FjY291bnQoKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgVG9rZW4uaXNVbnJlc29sdmVkKHRoaXMuc3RhY2suYWNjb3VudCkgfHxcbiAgICAgIFRva2VuLmlzVW5yZXNvbHZlZCh0aGlzLmZ1bmN0aW9uQXJuKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zdGFjay5zcGxpdEFybih0aGlzLmZ1bmN0aW9uQXJuLCBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSlcbiAgICAgICAgLmFjY291bnQgPT09IHRoaXMuc3RhY2suYWNjb3VudFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdyYW50KFxuICAgIGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICBhY3Rpb246IHN0cmluZyxcbiAgICByZXNvdXJjZUFybnM6IHN0cmluZ1tdLFxuICAgIHBlcm1pc3Npb25PdmVycmlkZXM/OiBQYXJ0aWFsPFBlcm1pc3Npb24+LFxuICApOiBpYW0uR3JhbnQge1xuICAgIGNvbnN0IGdyYW50ID0gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsT3JSZXNvdXJjZSh7XG4gICAgICBncmFudGVlLFxuICAgICAgYWN0aW9uczogW2FjdGlvbl0sXG4gICAgICByZXNvdXJjZUFybnMsXG5cbiAgICAgIC8vIEZha2UgcmVzb3VyY2UtbGlrZSBvYmplY3Qgb24gd2hpY2ggdG8gY2FsbCBhZGRUb1Jlc291cmNlUG9saWN5KCksIHdoaWNoIGFjdHVhbGx5XG4gICAgICAvLyBjYWxscyBhZGRQZXJtaXNzaW9uKClcbiAgICAgIHJlc291cmNlOiB7XG4gICAgICAgIGFkZFRvUmVzb3VyY2VQb2xpY3k6IChfc3RhdGVtZW50KSA9PiB7XG4gICAgICAgICAgLy8gQ291bGRuJ3QgYWRkIHBlcm1pc3Npb25zIHRvIHRoZSBwcmluY2lwYWwsIHNvIGFkZCB0aGVtIGxvY2FsbHkuXG4gICAgICAgICAgdGhpcy5hZGRQZXJtaXNzaW9uKGlkZW50aWZpZXIsIHtcbiAgICAgICAgICAgIHByaW5jaXBhbDogZ3JhbnRlZS5ncmFudFByaW5jaXBhbCEsXG4gICAgICAgICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgICAgICAgIC4uLnBlcm1pc3Npb25PdmVycmlkZXMsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBwZXJtaXNzaW9uTm9kZSA9IHRoaXMuX2Z1bmN0aW9uTm9kZSgpLnRyeUZpbmRDaGlsZChpZGVudGlmaWVyKTtcbiAgICAgICAgICBpZiAoIXBlcm1pc3Npb25Ob2RlICYmICF0aGlzLl9za2lwUGVybWlzc2lvbnMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgXCJDYW5ub3QgbW9kaWZ5IHBlcm1pc3Npb24gdG8gbGFtYmRhIGZ1bmN0aW9uLiBGdW5jdGlvbiBpcyBlaXRoZXIgaW1wb3J0ZWQgb3IgJExBVEVTVCB2ZXJzaW9uLlxcblwiICtcbiAgICAgICAgICAgICAgICBcIklmIHRoZSBmdW5jdGlvbiBpcyBpbXBvcnRlZCBmcm9tIHRoZSBzYW1lIGFjY291bnQgdXNlIGBmcm9tRnVuY3Rpb25BdHRyaWJ1dGVzKClgIEFQSSB3aXRoIHRoZSBgc2FtZUVudmlyb25tZW50YCBmbGFnLlxcblwiICtcbiAgICAgICAgICAgICAgICBcIklmIHRoZSBmdW5jdGlvbiBpcyBpbXBvcnRlZCBmcm9tIGEgZGlmZmVyZW50IGFjY291bnQgYW5kIGFscmVhZHkgaGFzIHRoZSBjb3JyZWN0IHBlcm1pc3Npb25zIHVzZSBgZnJvbUZ1bmN0aW9uQXR0cmlidXRlcygpYCBBUEkgd2l0aCB0aGUgYHNraXBQZXJtaXNzaW9uc2AgZmxhZy5cIixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7IHN0YXRlbWVudEFkZGVkOiB0cnVlLCBwb2xpY3lEZXBlbmRhYmxlOiBwZXJtaXNzaW9uTm9kZSB9O1xuICAgICAgICB9LFxuICAgICAgICBub2RlOiB0aGlzLm5vZGUsXG4gICAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgICBlbnY6IHRoaXMuZW52LFxuICAgICAgICBlbnZpcm9ubWVudE5hbWU6IHRoaXMuZW52aXJvbm1lbnROYW1lLFxuICAgICAgICBncmlkVVVJRDogdGhpcy5ncmlkVVVJRCxcbiAgICAgICAgb3V0cHV0czoge30sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGdyYW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zbGF0ZSBJUHJpbmNpcGFsIHRvIHNvbWV0aGluZyB3ZSBjYW4gcGFzcyB0byBhd3NfbGFtYmRhX3Blcm1pc3Npb25cbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvYXBpL0FQSV9BZGRQZXJtaXNzaW9uLmh0bWwjbGFtYmRhLUFkZFBlcm1pc3Npb24tcmVxdWVzdC1QcmluY2lwYWxcbiAgICogaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS42OC4wL2RvY3MvcmVzb3VyY2VzL2xhbWJkYV9wZXJtaXNzaW9uI3ByaW5jaXBhbFxuICAgKlxuICAgKiBEbyBzb21lIG5hc3R5IHRoaW5ncyBiZWNhdXNlIGBQZXJtaXNzaW9uYCBzdXBwb3J0cyBhIHN1YnNldCBvZiB3aGF0IHRoZVxuICAgKiBmdWxsIElBTSBwcmluY2lwYWwgbGFuZ3VhZ2Ugc3VwcG9ydHMsIGFuZCB3ZSBtYXkgbm90IGJlIGFibGUgdG8gcGFyc2Ugc3RyaW5nc1xuICAgKiBvdXRyaWdodCBiZWNhdXNlIHRoZXkgbWF5IGJlIHRva2Vucy5cbiAgICpcbiAgICogVHJ5IHRvIHJlY29nbml6ZSBzb21lIHNwZWNpZmljIFByaW5jaXBhbCBjbGFzc2VzIGZpcnN0LCB0aGVuIHRyeSBhIGdlbmVyaWNcbiAgICogZmFsbGJhY2suXG4gICAqL1xuICBwcml2YXRlIHBhcnNlUGVybWlzc2lvblByaW5jaXBhbChcbiAgICBwcmluY2lwYWw6IGlhbS5JUHJpbmNpcGFsIHwgeyByZWFkb25seSB3cmFwcGVkOiBpYW0uSVByaW5jaXBhbCB9LFxuICApIHtcbiAgICAvLyBUcnkgc29tZSBzcGVjaWZpYyBjb21tb24gY2xhc3NlcyBmaXJzdC5cbiAgICAvLyB1c2UgZHVjay10eXBpbmcsIG5vdCBpbnN0YW5jZSBvZlxuICAgIGlmIChcIndyYXBwZWRcIiBpbiBwcmluY2lwYWwpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkb3Qtbm90YXRpb25cbiAgICAgIHByaW5jaXBhbCA9IHByaW5jaXBhbFtcIndyYXBwZWRcIl07XG4gICAgfVxuXG4gICAgaWYgKFwiYWNjb3VudElkXCIgaW4gcHJpbmNpcGFsKSB7XG4gICAgICByZXR1cm4gKHByaW5jaXBhbCBhcyBpYW0uQWNjb3VudFByaW5jaXBhbCkuYWNjb3VudElkO1xuICAgIH1cblxuICAgIGlmIChcInNlcnZpY2VcIiBpbiBwcmluY2lwYWwpIHtcbiAgICAgIHJldHVybiAocHJpbmNpcGFsIGFzIGlhbS5TZXJ2aWNlUHJpbmNpcGFsKS5zZXJ2aWNlO1xuICAgIH1cblxuICAgIGlmIChcImFyblwiIGluIHByaW5jaXBhbCkge1xuICAgICAgcmV0dXJuIChwcmluY2lwYWwgYXMgaWFtLkFyblByaW5jaXBhbCkuYXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cmluZ0VxdWFscyA9IG1hdGNoU2luZ2xlQ29uZGl0aW9uKFxuICAgICAgXCJTdHJpbmdFcXVhbHNcIixcbiAgICAgIHByaW5jaXBhbC5wb2xpY3lGcmFnbWVudC5jb25kaXRpb25zLFxuICAgICk7XG4gICAgaWYgKFxuICAgICAgc3RyaW5nRXF1YWxzICYmXG4gICAgICBzdHJpbmdFcXVhbHMubGVuZ3RoID09PSAxICYmXG4gICAgICBzdHJpbmdFcXVhbHNbMF0udmFyaWFibGUgPT09IFwiYXdzOlByaW5jaXBhbE9yZ0lEXCJcbiAgICApIHtcbiAgICAgIC8vIHdlIHdpbGwgbW92ZSB0aGUgb3JnYW5pemF0aW9uIGlkIHRvIHRoZSBgcHJpbmNpcGFsT3JnSWRgIHByb3BlcnR5IG9mIGBQZXJtaXNzaW9uc2AuXG4gICAgICByZXR1cm4gXCIqXCI7XG4gICAgfVxuXG4gICAgLy8gVHJ5IGEgYmVzdC1lZmZvcnQgYXBwcm9hY2ggdG8gc3VwcG9ydCBzaW1wbGUgcHJpbmNpcGFscyB0aGF0IGFyZSBub3QgYW55IG9mIHRoZSBwcmVkZWZpbmVkXG4gICAgLy8gY2xhc3NlcywgYnV0IGFyZSBzaW1wbGUgZW5vdWdoIHRoYXQgdGhleSB3aWxsIGZpdCBpbnRvIHRoZSBMYW1iZGEgUGVybWlzc2lvbiBtb2RlbC5cbiAgICAvLyBNYWluIHRhcmdldCBoZXJlOiBpbXBvcnRlZCBSb2xlcywgVXNlcnMsIEdyb3Vwcy5cbiAgICAvL1xuICAgIC8vIFRoZSBwcmluY2lwYWwgY2Fubm90IGhhdmUgY29uZGl0aW9ucyBhbmQgbXVzdCBoYXZlIGEgc2luZ2xlIHsgQVdTOiBbYXJuXSB9IGVudHJ5LlxuICAgIGNvbnN0IHByaW5jaXBhbHMgPSBwcmluY2lwYWwucG9saWN5RnJhZ21lbnQucHJpbmNpcGFscy5maWx0ZXIoXG4gICAgICAocCkgPT4gcC50eXBlID09PSBcIkFXU1wiLFxuICAgICk7XG4gICAgaWYgKFxuICAgICAgcHJpbmNpcGFsLnBvbGljeUZyYWdtZW50LmNvbmRpdGlvbnMubGVuZ3RoID09PSAwICYmXG4gICAgICBwcmluY2lwYWxzLmxlbmd0aCA9PT0gMVxuICAgICkge1xuICAgICAgaWYgKHByaW5jaXBhbHNbMF0uaWRlbnRpZmllcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBwcmluY2lwYWxzWzBdLmlkZW50aWZpZXJzWzBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIHByaW5jaXBhbCB0eXBlIGZvciBMYW1iZGEgcGVybWlzc2lvbiBzdGF0ZW1lbnQ6ICR7cHJpbmNpcGFsLmNvbnN0cnVjdG9yLm5hbWV9LiBgICtcbiAgICAgICAgXCJTdXBwb3J0ZWQ6IEFjY291bnRQcmluY2lwYWwsIEFyblByaW5jaXBhbCwgU2VydmljZVByaW5jaXBhbCwgT3JnYW5pemF0aW9uUHJpbmNpcGFsXCIsXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNvbmRpdGlvbnMgZm9yIGEgY2VydGFpbiB0ZXN0IGlmIGl0IGV4aXN0cyBhbmQgaWYgdGhlcmUgYXJlIG5vIG90aGVyIGNvbmRpdGlvbnMuIE90aGVyd2lzZSxcbiAgICAgKiByZXR1cm5zIHVuZGVmaW5lZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXRjaFNpbmdsZUNvbmRpdGlvbihcbiAgICAgIHRlc3Q6IHN0cmluZyxcbiAgICAgIG9iajogaWFtLkNvbmRpdGlvbnMsXG4gICAgKTogaWFtLkNvbmRpdGlvbnMgfCB1bmRlZmluZWQge1xuICAgICAgaWYgKG9iai5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9iai5maWx0ZXIoKGMpID0+IGMudGVzdCA9PT0gdGVzdCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNvbmRpdGlvbkNvbWJpbmF0aW9ucyhwcmluY2lwYWw6IGlhbS5JUHJpbmNpcGFsKTpcbiAgICB8IHtcbiAgICAgICAgc291cmNlQXJuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIHNvdXJjZUFjY291bnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgcHJpbmNpcGFsT3JnSUQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMudmFsaWRhdGVDb25kaXRpb25zKHByaW5jaXBhbCk7XG5cbiAgICBpZiAoIWNvbmRpdGlvbnMpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogd2hhdCBpZiBtb3JlIHRoYW4gMSBpZGVudGlmaWVyPyBTaG91bGQgYW55IG9mIHRoZXNlIHRocm93P1xuICAgIGNvbnN0IHNvdXJjQXJuQ29uZGl0aW9ucyA9IGNvbmRpdGlvbnMuZmlsdGVyKFxuICAgICAgKGMpID0+IGMudGVzdCA9PT0gXCJBcm5MaWtlXCIgJiYgYy52YXJpYWJsZSA9PT0gXCJhd3M6U291cmNlQXJuXCIsXG4gICAgKTtcbiAgICBjb25zdCBzb3VyY2VBcm4gPVxuICAgICAgc291cmNBcm5Db25kaXRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBzb3VyY0FybkNvbmRpdGlvbnNbMF0udmFsdWVzWzBdXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIC8vIHJlcXVpcmVTdHJpbmcoXG4gICAgLy8gICByZXF1aXJlT2JqZWN0KGNvbmRpdGlvbnMuQXJuTGlrZSk/LltcImF3czpTb3VyY2VBcm5cIl0sXG4gICAgLy8gKTtcbiAgICBjb25zdCBzb3VyY2VBY2NvdW50Q29uZGl0aW9ucyA9IGNvbmRpdGlvbnMuZmlsdGVyKFxuICAgICAgKGMpID0+IGMudGVzdCA9PT0gXCJTdHJpbmdFcXVhbHNcIiAmJiBjLnZhcmlhYmxlID09PSBcImF3czpTb3VyY2VBY2NvdW50XCIsXG4gICAgKTtcbiAgICBjb25zdCBzb3VyY2VBY2NvdW50ID1cbiAgICAgIHNvdXJjZUFjY291bnRDb25kaXRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBzb3VyY2VBY2NvdW50Q29uZGl0aW9uc1swXS52YWx1ZXNbMF1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgLy8gcmVxdWlyZVN0cmluZyhcbiAgICAvLyAgIHJlcXVpcmVPYmplY3QoY29uZGl0aW9ucy5TdHJpbmdFcXVhbHMpPy5bXCJhd3M6U291cmNlQWNjb3VudFwiXSxcbiAgICAvLyApO1xuICAgIGNvbnN0IHByaW5jaXBhbE9yZ0lEQ29uZGl0aW9ucyA9IGNvbmRpdGlvbnMuZmlsdGVyKFxuICAgICAgKGMpID0+IGMudGVzdCA9PT0gXCJTdHJpbmdFcXVhbHNcIiAmJiBjLnZhcmlhYmxlID09PSBcImF3czpQcmluY2lwYWxPcmdJRFwiLFxuICAgICk7XG4gICAgY29uc3QgcHJpbmNpcGFsT3JnSUQgPVxuICAgICAgcHJpbmNpcGFsT3JnSURDb25kaXRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBwcmluY2lwYWxPcmdJRENvbmRpdGlvbnNbMF0udmFsdWVzWzBdXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIC8vIHJlcXVpcmVTdHJpbmcoXG4gICAgLy8gICByZXF1aXJlT2JqZWN0KGNvbmRpdGlvbnMuU3RyaW5nRXF1YWxzKT8uW1wiYXdzOlByaW5jaXBhbE9yZ0lEXCJdLFxuICAgIC8vICk7XG5cbiAgICAvLyBQcmluY2lwYWxPcmdJRCBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgY29uZGl0aW9uc1xuICAgIGlmIChwcmluY2lwYWxPcmdJRCAmJiAoc291cmNlQXJuIHx8IHNvdXJjZUFjY291bnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiUHJpbmNpcGFsV2l0aENvbmRpdGlvbnMgaGFkIHVuc3VwcG9ydGVkIGNvbmRpdGlvbiBjb21iaW5hdGlvbnMgZm9yIExhbWJkYSBwZXJtaXNzaW9uIHN0YXRlbWVudDogcHJpbmNpcGFsT3JnSUQgY2Fubm90IGJlIHNldCB3aXRoIG90aGVyIGNvbmRpdGlvbnMuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzb3VyY2VBcm4sXG4gICAgICBzb3VyY2VBY2NvdW50LFxuICAgICAgcHJpbmNpcGFsT3JnSUQsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVDb25kaXRpb25zKFxuICAgIHByaW5jaXBhbDogaWFtLklQcmluY2lwYWwsXG4gICk6IGlhbS5Db25kaXRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5pc1ByaW5jaXBhbFdpdGhDb25kaXRpb25zKHByaW5jaXBhbCkpIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBwcmluY2lwYWwucG9saWN5RnJhZ21lbnQuY29uZGl0aW9ucztcbiAgICAgIC8vIFRoZXNlIGFyZSBhbGwgdGhlIHN1cHBvcnRlZCBjb25kaXRpb25zLiBTb21lIGNvbWJpbmF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCxcbiAgICAgIC8vIGxpa2Ugb25seSAnYXdzOlNvdXJjZUFybicgb3IgJ2F3czpQcmluY2lwYWxPcmdJRCcgYW5kICdhd3M6U291cmNlQWNjb3VudCcuXG4gICAgICAvLyBUaGVzZSB3aWxsIGJlIHZhbGlkYXRlZCB0aHJvdWdoIGB0aGlzLnZhbGlkYXRlQ29uZGl0aW9uQ29tYmluYXRpb25zYC5cbiAgICAgIGNvbnN0IHN1cHBvcnRlZFByaW5jaXBhbENvbmRpdGlvbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXN0OiBcIkFybkxpa2VcIixcbiAgICAgICAgICB2YXJpYWJsZTogXCJhd3M6U291cmNlQXJuXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXN0OiBcIlN0cmluZ0VxdWFsc1wiLFxuICAgICAgICAgIHZhcmlhYmxlOiBcImF3czpTb3VyY2VBY2NvdW50XCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXN0OiBcIlN0cmluZ0VxdWFsc1wiLFxuICAgICAgICAgIHZhcmlhYmxlOiBcImF3czpQcmluY2lwYWxPcmdJRFwiLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgdW5zdXBwb3J0ZWRDb25kaXRpb25zID0gY29uZGl0aW9ucy5maWx0ZXIoXG4gICAgICAgIChjb25kaXRpb24pID0+XG4gICAgICAgICAgIXN1cHBvcnRlZFByaW5jaXBhbENvbmRpdGlvbnMuc29tZShcbiAgICAgICAgICAgIChzdXBwb3J0ZWRDb25kaXRpb24pID0+XG4gICAgICAgICAgICAgIHN1cHBvcnRlZENvbmRpdGlvbi50ZXN0ID09PSBjb25kaXRpb24udGVzdCAmJlxuICAgICAgICAgICAgICBzdXBwb3J0ZWRDb25kaXRpb24udmFyaWFibGUgPT09IGNvbmRpdGlvbi52YXJpYWJsZSxcbiAgICAgICAgICApLFxuICAgICAgKTtcblxuICAgICAgaWYgKHVuc3VwcG9ydGVkQ29uZGl0aW9ucy5sZW5ndGggPT0gMCkge1xuICAgICAgICByZXR1cm4gY29uZGl0aW9ucztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUHJpbmNpcGFsV2l0aENvbmRpdGlvbnMgaGFkIHVuc3VwcG9ydGVkIGNvbmRpdGlvbnMgZm9yIExhbWJkYSBwZXJtaXNzaW9uIHN0YXRlbWVudDogJHtKU09OLnN0cmluZ2lmeSh1bnN1cHBvcnRlZENvbmRpdGlvbnMpfS4gYCArXG4gICAgICAgICAgICBgU3VwcG9ydGVkIG9wZXJhdG9yL2NvbmRpdGlvbiBwYWlyczogJHtKU09OLnN0cmluZ2lmeShzdXBwb3J0ZWRQcmluY2lwYWxDb25kaXRpb25zKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGlzUHJpbmNpcGFsV2l0aENvbmRpdGlvbnMocHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwcmluY2lwYWwucG9saWN5RnJhZ21lbnQuY29uZGl0aW9ucy5sZW5ndGggPiAwO1xuICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBRdWFsaWZpZWRGdW5jdGlvbkJhc2UgZXh0ZW5kcyBMYW1iZGFGdW5jdGlvbkJhc2Uge1xuICAvKiogVGhlIHVuZGVybHlpbmcgYElGdW5jdGlvbmAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGxhbWJkYTogSUZ1bmN0aW9uOyAvLyBUT0RPOiBWZXJpZnkgcHVibGlzaCBpcyBzZXQgdG8gdHJ1ZT9cblxuICBwdWJsaWMgcmVhZG9ubHkgcGVybWlzc2lvbnNOb2RlID0gdGhpcy5ub2RlO1xuXG4gIHB1YmxpYyBnZXQgcmVzb3VyY2VBcm5zRm9yR3JhbnRJbnZva2UoKSB7XG4gICAgcmV0dXJuIFt0aGlzLmZ1bmN0aW9uQXJuXTtcbiAgfVxuXG4gIHB1YmxpYyBjb25maWd1cmVBc3luY0ludm9rZShvcHRpb25zOiBFdmVudEludm9rZUNvbmZpZ09wdGlvbnMpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ub2RlLnRyeUZpbmRDaGlsZChcIkV2ZW50SW52b2tlQ29uZmlnXCIpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEFuIEV2ZW50SW52b2tlQ29uZmlnIGhhcyBhbHJlYWR5IGJlZW4gY29uZmlndXJlZCBmb3IgdGhlIHF1YWxpZmllZCBmdW5jdGlvbiBhdCAke3RoaXMubm9kZS5wYXRofWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIG5ldyBFdmVudEludm9rZUNvbmZpZyh0aGlzLCBcIkV2ZW50SW52b2tlQ29uZmlnXCIsIHtcbiAgICAgIGZ1bmN0aW9uOiB0aGlzLmxhbWJkYSxcbiAgICAgIHF1YWxpZmllcjogdGhpcy52ZXJzaW9uLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHJlcHJlc2VudHMgYW4gQVdTIExhbWJkYSBldmVudCBzb3VyY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV2ZW50U291cmNlIHtcbiAgLyoqXG4gICAqIENhbGxlZCBieSBgbGFtYmRhLmFkZEV2ZW50U291cmNlYCB0byBhbGxvdyB0aGUgZXZlbnQgc291cmNlIHRvIGJpbmQgdG8gdGhpc1xuICAgKiBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHRhcmdldCBUaGF0IGxhbWJkYSBmdW5jdGlvbiB0byBiaW5kIHRvLlxuICAgKi9cbiAgYmluZCh0YXJnZXQ6IElGdW5jdGlvbik6IHZvaWQ7XG59XG4iXX0=
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Construct } from "constructs";
|
|
2
|
+
import { IFunction } from "./function-base";
|
|
3
|
+
/**
|
|
4
|
+
* A destination configuration
|
|
5
|
+
*/
|
|
6
|
+
export interface DestinationConfig {
|
|
7
|
+
/**
|
|
8
|
+
* The Amazon Resource Name (ARN) of the destination resource
|
|
9
|
+
*/
|
|
10
|
+
readonly destination: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The type of destination
|
|
14
|
+
*/
|
|
15
|
+
export declare enum DestinationType {
|
|
16
|
+
/**
|
|
17
|
+
* Failure
|
|
18
|
+
*/
|
|
19
|
+
FAILURE = "Failure",
|
|
20
|
+
/**
|
|
21
|
+
* Success
|
|
22
|
+
*/
|
|
23
|
+
SUCCESS = "Success"
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Options when binding a destination to a function
|
|
27
|
+
*/
|
|
28
|
+
export interface DestinationOptions {
|
|
29
|
+
/**
|
|
30
|
+
* The destination type
|
|
31
|
+
*/
|
|
32
|
+
readonly type: DestinationType;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A Lambda destination
|
|
36
|
+
*/
|
|
37
|
+
export interface IDestination {
|
|
38
|
+
/**
|
|
39
|
+
* Binds this destination to the Lambda function
|
|
40
|
+
*/
|
|
41
|
+
bind(scope: Construct, fn: IFunction, options?: DestinationOptions): DestinationConfig;
|
|
42
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DestinationType = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* The type of destination
|
|
6
|
+
*/
|
|
7
|
+
var DestinationType;
|
|
8
|
+
(function (DestinationType) {
|
|
9
|
+
/**
|
|
10
|
+
* Failure
|
|
11
|
+
*/
|
|
12
|
+
DestinationType["FAILURE"] = "Failure";
|
|
13
|
+
/**
|
|
14
|
+
* Success
|
|
15
|
+
*/
|
|
16
|
+
DestinationType["SUCCESS"] = "Success";
|
|
17
|
+
})(DestinationType || (exports.DestinationType = DestinationType = {}));
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24tZGVzdGluYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzL2NvbXB1dGUvZnVuY3Rpb24tZGVzdGluYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBYUE7O0dBRUc7QUFDSCxJQUFZLGVBVVg7QUFWRCxXQUFZLGVBQWU7SUFDekI7O09BRUc7SUFDSCxzQ0FBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILHNDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFWVyxlQUFlLCtCQUFmLGVBQWUsUUFVMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgSUZ1bmN0aW9uIH0gZnJvbSBcIi4vZnVuY3Rpb24tYmFzZVwiO1xuXG4vKipcbiAqIEEgZGVzdGluYXRpb24gY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlc3RpbmF0aW9uQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgZGVzdGluYXRpb24gcmVzb3VyY2VcbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgZGVzdGluYXRpb25cbiAqL1xuZXhwb3J0IGVudW0gRGVzdGluYXRpb25UeXBlIHtcbiAgLyoqXG4gICAqIEZhaWx1cmVcbiAgICovXG4gIEZBSUxVUkUgPSBcIkZhaWx1cmVcIixcblxuICAvKipcbiAgICogU3VjY2Vzc1xuICAgKi9cbiAgU1VDQ0VTUyA9IFwiU3VjY2Vzc1wiLFxufVxuXG4vKipcbiAqIE9wdGlvbnMgd2hlbiBiaW5kaW5nIGEgZGVzdGluYXRpb24gdG8gYSBmdW5jdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlc3RpbmF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgZGVzdGluYXRpb24gdHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogRGVzdGluYXRpb25UeXBlO1xufVxuXG4vKipcbiAqIEEgTGFtYmRhIGRlc3RpbmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURlc3RpbmF0aW9uIHtcbiAgLyoqXG4gICAqIEJpbmRzIHRoaXMgZGVzdGluYXRpb24gdG8gdGhlIExhbWJkYSBmdW5jdGlvblxuICAgKi9cbiAgYmluZChcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGZuOiBJRnVuY3Rpb24sXG4gICAgb3B0aW9ucz86IERlc3RpbmF0aW9uT3B0aW9ucyxcbiAgKTogRGVzdGluYXRpb25Db25maWc7XG59XG4iXX0=
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Construct } from "constructs";
|
|
2
|
+
import * as compute from "../";
|
|
3
|
+
import * as notify from "../../notify";
|
|
4
|
+
/**
|
|
5
|
+
* Use an Event Bridge event bus as a Lambda destination.
|
|
6
|
+
*
|
|
7
|
+
* If no event bus is specified, the default event bus is used.
|
|
8
|
+
*/
|
|
9
|
+
export declare class EventBridgeDestination implements compute.IDestination {
|
|
10
|
+
private readonly eventBus?;
|
|
11
|
+
/**
|
|
12
|
+
* @default - use the default event bus
|
|
13
|
+
*/
|
|
14
|
+
constructor(eventBus?: notify.IEventBus | undefined);
|
|
15
|
+
/**
|
|
16
|
+
* Returns a destination configuration
|
|
17
|
+
*/
|
|
18
|
+
bind(_scope: Construct, fn: compute.IFunction, _options?: compute.DestinationOptions): compute.DestinationConfig;
|
|
19
|
+
}
|