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,947 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.validateConditionObject = exports.toConditionJson = exports.toConditions = exports.fromConditionJson = exports.isStringOrArrayOfStrings = exports.deriveEstimateSizeOptions = exports.Effect = exports.PolicyStatement = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const cdktf_1 = require("cdktf");
|
|
7
|
+
const principals_1 = require("./principals");
|
|
8
|
+
/**
|
|
9
|
+
* An estimate on how long ARNs typically are
|
|
10
|
+
*
|
|
11
|
+
* This is used to decide when to start splitting statements into new Managed Policies.
|
|
12
|
+
* Because we often can't know the length of an ARN (it may be a token and only
|
|
13
|
+
* available at deployment time) we'll have to estimate it.
|
|
14
|
+
*/
|
|
15
|
+
const DEFAULT_ARN_SIZE_ESTIMATE = 150;
|
|
16
|
+
/**
|
|
17
|
+
* Represents a statement in an IAM policy document.
|
|
18
|
+
*/
|
|
19
|
+
class PolicyStatement {
|
|
20
|
+
/**
|
|
21
|
+
* Creates a new Terraform PolicyStatement based on the AWS IAM Policy Statement format.
|
|
22
|
+
* This will accept an object created from the `.toStatementJson()` call
|
|
23
|
+
*
|
|
24
|
+
* @param obj the PolicyStatement in object form.
|
|
25
|
+
*/
|
|
26
|
+
static fromJson(obj) {
|
|
27
|
+
// TODO: What if obj is/has a Token(s)?
|
|
28
|
+
const ret = new PolicyStatement({
|
|
29
|
+
sid: obj.Sid,
|
|
30
|
+
actions: ensureArrayOrUndefined(obj.Action),
|
|
31
|
+
resources: ensureArrayOrUndefined(obj.Resource),
|
|
32
|
+
condition: fromConditionJson(obj.Condition),
|
|
33
|
+
effect: obj.Effect,
|
|
34
|
+
notActions: ensureArrayOrUndefined(obj.NotAction),
|
|
35
|
+
notResources: ensureArrayOrUndefined(obj.NotResource),
|
|
36
|
+
principals: obj.Principal
|
|
37
|
+
? [new JsonPrincipal(obj.Principal)]
|
|
38
|
+
: undefined,
|
|
39
|
+
notPrincipals: obj.NotPrincipal
|
|
40
|
+
? [new JsonPrincipal(obj.NotPrincipal)]
|
|
41
|
+
: undefined,
|
|
42
|
+
});
|
|
43
|
+
// validate that the PolicyStatement has the correct shape
|
|
44
|
+
const errors = ret.validateForAnyPolicy();
|
|
45
|
+
if (errors.length > 0) {
|
|
46
|
+
throw new Error("Incorrect Policy Statement: " + errors.join("\n"));
|
|
47
|
+
}
|
|
48
|
+
return ret;
|
|
49
|
+
}
|
|
50
|
+
constructor(props = {}) {
|
|
51
|
+
this._action = new OrderedSet();
|
|
52
|
+
this._notAction = new OrderedSet();
|
|
53
|
+
this._principal = [];
|
|
54
|
+
this._notPrincipal = [];
|
|
55
|
+
this._resource = new OrderedSet();
|
|
56
|
+
this._notResource = new OrderedSet();
|
|
57
|
+
this._conditionMap = {};
|
|
58
|
+
// Hold on to those principals
|
|
59
|
+
this._principals = new OrderedSet();
|
|
60
|
+
this._notPrincipals = new OrderedSet();
|
|
61
|
+
this._frozen = false;
|
|
62
|
+
this._sid = props.sid;
|
|
63
|
+
this._effect = props.effect || Effect.ALLOW;
|
|
64
|
+
this.addActions(...(props.actions || []));
|
|
65
|
+
this.addNotActions(...(props.notActions || []));
|
|
66
|
+
this.addPrincipals(...(props.principals || []));
|
|
67
|
+
this.addNotPrincipals(...(props.notPrincipals || []));
|
|
68
|
+
this.addResources(...(props.resources || []));
|
|
69
|
+
this.addNotResources(...(props.notResources || []));
|
|
70
|
+
// TODO: Handle IResolvable condition?
|
|
71
|
+
if (props.condition !== undefined) {
|
|
72
|
+
this.addConditions(...props.condition);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Statement ID for this statement
|
|
77
|
+
*/
|
|
78
|
+
get sid() {
|
|
79
|
+
return this._sid;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Set Statement ID for this statement
|
|
83
|
+
*/
|
|
84
|
+
set sid(sid) {
|
|
85
|
+
this.assertNotFrozen("sid");
|
|
86
|
+
this._sid = sid;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Whether to allow or deny the actions in this statement
|
|
90
|
+
*/
|
|
91
|
+
get effect() {
|
|
92
|
+
return this._effect;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Set effect for this statement
|
|
96
|
+
*/
|
|
97
|
+
set effect(effect) {
|
|
98
|
+
this.assertNotFrozen("effect");
|
|
99
|
+
this._effect = effect;
|
|
100
|
+
}
|
|
101
|
+
//
|
|
102
|
+
// Actions
|
|
103
|
+
//
|
|
104
|
+
/**
|
|
105
|
+
* Specify allowed actions into the "Action" section of the policy statement.
|
|
106
|
+
*
|
|
107
|
+
* @see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_action.html
|
|
108
|
+
*
|
|
109
|
+
* @param actions actions that will be allowed.
|
|
110
|
+
*/
|
|
111
|
+
addActions(...actions) {
|
|
112
|
+
this.assertNotFrozen("addActions");
|
|
113
|
+
if (actions.length > 0 && this._notAction.length > 0) {
|
|
114
|
+
throw new Error("Cannot add 'Actions' to policy statement if 'NotActions' have been added");
|
|
115
|
+
}
|
|
116
|
+
this.validatePolicyActions(actions);
|
|
117
|
+
this._action.push(...actions);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Explicitly allow all actions except the specified list of actions into the "NotAction" section
|
|
121
|
+
* of the policy document.
|
|
122
|
+
*
|
|
123
|
+
* @see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notaction.html
|
|
124
|
+
*
|
|
125
|
+
* @param notActions actions that will be denied. All other actions will be permitted.
|
|
126
|
+
*/
|
|
127
|
+
addNotActions(...notActions) {
|
|
128
|
+
this.assertNotFrozen("addNotActions");
|
|
129
|
+
if (notActions.length > 0 && this._action.length > 0) {
|
|
130
|
+
throw new Error("Cannot add 'NotActions' to policy statement if 'Actions' have been added");
|
|
131
|
+
}
|
|
132
|
+
this.validatePolicyActions(notActions);
|
|
133
|
+
this._notAction.push(...notActions);
|
|
134
|
+
}
|
|
135
|
+
//
|
|
136
|
+
// Principal
|
|
137
|
+
//
|
|
138
|
+
/**
|
|
139
|
+
* Indicates if this permission has a "Principal" section.
|
|
140
|
+
*/
|
|
141
|
+
get hasPrincipal() {
|
|
142
|
+
return this._principals.length + this._notPrincipals.length > 0;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Adds principals to the "Principal" section of a policy statement.
|
|
146
|
+
*
|
|
147
|
+
* @see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html
|
|
148
|
+
*
|
|
149
|
+
* @param principals IAM principals that will be added
|
|
150
|
+
*/
|
|
151
|
+
addPrincipals(...principals) {
|
|
152
|
+
this.assertNotFrozen("addPrincipals");
|
|
153
|
+
if (principals.length > 0 && this._notPrincipals.length > 0) {
|
|
154
|
+
throw new Error("Cannot add 'Principals' to policy statement if 'NotPrincipals' have been added");
|
|
155
|
+
}
|
|
156
|
+
// TODO: AWSCDK only ensures Principal is not instanceof Group
|
|
157
|
+
// for (const principal of principals) {
|
|
158
|
+
// this.validatePolicyPrincipal(principal);
|
|
159
|
+
// }
|
|
160
|
+
const added = this._principals.push(...principals);
|
|
161
|
+
for (const principal of added) {
|
|
162
|
+
const fragment = principal.policyFragment;
|
|
163
|
+
(0, principals_1.mergePrincipal)(this._principal, fragment.principals);
|
|
164
|
+
this.addPrincipalConditions(...fragment.conditions);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Specify principals that is not allowed or denied access to the "NotPrincipal" section of
|
|
169
|
+
* a policy statement.
|
|
170
|
+
*
|
|
171
|
+
* @see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notprincipal.html
|
|
172
|
+
*
|
|
173
|
+
* @param notPrincipals IAM principals that will be denied access
|
|
174
|
+
*/
|
|
175
|
+
addNotPrincipals(...notPrincipals) {
|
|
176
|
+
this.assertNotFrozen("addNotPrincipals");
|
|
177
|
+
if (notPrincipals.length > 0 && this._principals.length > 0) {
|
|
178
|
+
throw new Error("Cannot add 'NotPrincipals' to policy statement if 'Principals' have been added");
|
|
179
|
+
}
|
|
180
|
+
// for (const notPrincipal of notPrincipals) {
|
|
181
|
+
// this.validatePolicyPrincipal(notPrincipal);
|
|
182
|
+
// }
|
|
183
|
+
const added = this._notPrincipals.push(...notPrincipals);
|
|
184
|
+
for (const notPrincipal of added) {
|
|
185
|
+
const fragment = notPrincipal.policyFragment;
|
|
186
|
+
(0, principals_1.mergePrincipal)(this._notPrincipal, fragment.principals);
|
|
187
|
+
this.addPrincipalConditions(...fragment.conditions);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
validatePolicyActions(actions) {
|
|
191
|
+
// In case of an unresolved list of actions return early
|
|
192
|
+
if (cdktf_1.Token.isUnresolved(actions))
|
|
193
|
+
return;
|
|
194
|
+
for (const action of actions || []) {
|
|
195
|
+
if (!cdktf_1.Token.isUnresolved(action) &&
|
|
196
|
+
!/^(\*|[a-zA-Z0-9-]+:[a-zA-Z0-9*]+)$/.test(action)) {
|
|
197
|
+
throw new Error(`Action '${action}' is invalid. An action string consists of a service namespace, a colon, and the name of an action. Action names can include wildcards.`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Specify AWS account ID as the principal entity to the "Principal" section of a policy statement.
|
|
203
|
+
*/
|
|
204
|
+
addAwsAccountPrincipal(accountId) {
|
|
205
|
+
this.addPrincipals(new principals_1.AccountPrincipal(accountId));
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Specify a principal using the ARN identifier of the principal.
|
|
209
|
+
* You cannot specify IAM groups and instance profiles as principals.
|
|
210
|
+
*
|
|
211
|
+
* @param arn ARN identifier of AWS account, IAM user, or IAM role (i.e. arn:aws:iam::123456789012:user/user-name)
|
|
212
|
+
*/
|
|
213
|
+
addArnPrincipal(arn) {
|
|
214
|
+
this.addPrincipals(new principals_1.ArnPrincipal(arn));
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Adds a service principal to this policy statement.
|
|
218
|
+
*
|
|
219
|
+
* @param service the service name for which a service principal is requested (e.g: `s3.amazonaws.com`).
|
|
220
|
+
* @param opts options for adding the service principal (such as specifying a principal in a different region)
|
|
221
|
+
*/
|
|
222
|
+
addServicePrincipal(service, opts) {
|
|
223
|
+
this.addPrincipals(new principals_1.ServicePrincipal(service, opts));
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Adds a federated identity provider such as Amazon Cognito to this policy statement.
|
|
227
|
+
*
|
|
228
|
+
* @param federated federated identity provider (i.e. 'cognito-identity.amazonaws.com')
|
|
229
|
+
* @param conditions The conditions under which the policy is in effect.
|
|
230
|
+
* See [the IAM documentation](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html).
|
|
231
|
+
*/
|
|
232
|
+
addFederatedPrincipal(federated, conditions) {
|
|
233
|
+
this.addPrincipals(new principals_1.FederatedPrincipal(federated, conditions));
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Adds an AWS account root user principal to this policy statement
|
|
237
|
+
*/
|
|
238
|
+
addAccountRootPrincipal() {
|
|
239
|
+
this.addPrincipals(new principals_1.AccountRootPrincipal());
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Adds a canonical user ID principal to this policy document
|
|
243
|
+
*
|
|
244
|
+
* @param canonicalUserId unique identifier assigned by AWS for every account
|
|
245
|
+
*/
|
|
246
|
+
addCanonicalUserPrincipal(canonicalUserId) {
|
|
247
|
+
this.addPrincipals(new principals_1.CanonicalUserPrincipal(canonicalUserId));
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Adds all identities in all accounts ("*") to this policy statement
|
|
251
|
+
*/
|
|
252
|
+
addAnyPrincipal() {
|
|
253
|
+
this.addPrincipals(new principals_1.AnyPrincipal());
|
|
254
|
+
}
|
|
255
|
+
//
|
|
256
|
+
// Resources
|
|
257
|
+
//
|
|
258
|
+
/**
|
|
259
|
+
* Specify resources that this policy statement applies into the "Resource" section of
|
|
260
|
+
* this policy statement.
|
|
261
|
+
*
|
|
262
|
+
* @see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_resource.html
|
|
263
|
+
*
|
|
264
|
+
* @param arns Amazon Resource Names (ARNs) of the resources that this policy statement applies to
|
|
265
|
+
*/
|
|
266
|
+
addResources(...arns) {
|
|
267
|
+
this.assertNotFrozen("addResources");
|
|
268
|
+
if (arns.length > 0 && this._notResource.length > 0) {
|
|
269
|
+
throw new Error("Cannot add 'Resources' to policy statement if 'NotResources' have been added");
|
|
270
|
+
}
|
|
271
|
+
this._resource.push(...arns);
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Specify resources that this policy statement will not apply to in the "NotResource" section
|
|
275
|
+
* of this policy statement. All resources except the specified list will be matched.
|
|
276
|
+
*
|
|
277
|
+
* @see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notresource.html
|
|
278
|
+
*
|
|
279
|
+
* @param arns Amazon Resource Names (ARNs) of the resources that this policy statement does not apply to
|
|
280
|
+
*/
|
|
281
|
+
addNotResources(...arns) {
|
|
282
|
+
this.assertNotFrozen("addNotResources");
|
|
283
|
+
if (arns.length > 0 && this._resource.length > 0) {
|
|
284
|
+
throw new Error("Cannot add 'NotResources' to policy statement if 'Resources' have been added");
|
|
285
|
+
}
|
|
286
|
+
this._notResource.push(...arns);
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Adds a ``"*"`` resource to this statement.
|
|
290
|
+
*/
|
|
291
|
+
addAllResources() {
|
|
292
|
+
this.addResources("*");
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Indicates if this permission has at least one resource associated with it.
|
|
296
|
+
*/
|
|
297
|
+
get hasResource() {
|
|
298
|
+
return this._resource && this._resource.length > 0;
|
|
299
|
+
}
|
|
300
|
+
//
|
|
301
|
+
// Condition
|
|
302
|
+
//
|
|
303
|
+
/**
|
|
304
|
+
* Add a condition to the Policy
|
|
305
|
+
*
|
|
306
|
+
* If multiple calls are made to add a condition with the same test and variable, only
|
|
307
|
+
* the last one wins. For example:
|
|
308
|
+
*
|
|
309
|
+
* ```ts
|
|
310
|
+
* declare const stmt: iam.PolicyStatement;
|
|
311
|
+
*
|
|
312
|
+
* stmt.addCondition({ test: 'StringEquals', variable: 'aws:SomeField', values: ['1'] });
|
|
313
|
+
* stmt.addCondition({ test: 'StringEquals', variable: 'aws:SomeField', values: ['2'] });
|
|
314
|
+
* ```
|
|
315
|
+
*
|
|
316
|
+
* Will end up with the single condition
|
|
317
|
+
*
|
|
318
|
+
* ```ts
|
|
319
|
+
* {
|
|
320
|
+
* test: 'StringEquals',
|
|
321
|
+
* variable: 'aws:SomeField',
|
|
322
|
+
* values: ['2'],
|
|
323
|
+
* }
|
|
324
|
+
* ```.
|
|
325
|
+
*
|
|
326
|
+
* If you meant to add a condition to say that the field can be *either* `1` or `2`, write
|
|
327
|
+
* this:
|
|
328
|
+
*
|
|
329
|
+
* ```ts
|
|
330
|
+
* declare const stmt: iam.PolicyStatement;
|
|
331
|
+
*
|
|
332
|
+
* stmt.addCondition({ test: 'StringEquals', variable: 'aws:SomeField', values: ['1', '2'] });
|
|
333
|
+
* ```
|
|
334
|
+
*/
|
|
335
|
+
addCondition(condition) {
|
|
336
|
+
this.assertNotFrozen("addCondition");
|
|
337
|
+
if (!this._conditionMap[condition.test]) {
|
|
338
|
+
this._conditionMap[condition.test] = {};
|
|
339
|
+
}
|
|
340
|
+
const existingCondition = this._conditionMap[condition.test][condition.variable];
|
|
341
|
+
if (existingCondition) {
|
|
342
|
+
this._conditionMap[condition.test][condition.variable] = {
|
|
343
|
+
...existingCondition,
|
|
344
|
+
...condition,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
this._conditionMap[condition.test][condition.variable] = condition;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Add a condition to the Policy
|
|
353
|
+
*
|
|
354
|
+
* If multiple calls are made to add a condition with the same operator and field, only
|
|
355
|
+
* the last one wins. For example:
|
|
356
|
+
*
|
|
357
|
+
* ```ts
|
|
358
|
+
* declare const stmt: iam.PolicyStatement;
|
|
359
|
+
*
|
|
360
|
+
* stmt.addCondition('StringEquals', { 'aws:SomeField': '1' });
|
|
361
|
+
* stmt.addCondition('StringEquals', { 'aws:SomeField': '2' });
|
|
362
|
+
* ```
|
|
363
|
+
*
|
|
364
|
+
* Will end up with the single condition `StringEquals: { 'aws:SomeField': '2' }`.
|
|
365
|
+
*
|
|
366
|
+
* If you meant to add a condition to say that the field can be *either* `1` or `2`, write
|
|
367
|
+
* this:
|
|
368
|
+
*
|
|
369
|
+
* ```ts
|
|
370
|
+
* declare const stmt: iam.PolicyStatement;
|
|
371
|
+
*
|
|
372
|
+
* stmt.addCondition('StringEquals', { 'aws:SomeField': ['1', '2'] });
|
|
373
|
+
* ```
|
|
374
|
+
*/
|
|
375
|
+
addConditionObject(key, value) {
|
|
376
|
+
this.assertNotFrozen("addCondition");
|
|
377
|
+
validateConditionObject(value);
|
|
378
|
+
for (const [k, v] of Object.entries(value)) {
|
|
379
|
+
if (!isStringOrArrayOfStrings(v)) {
|
|
380
|
+
throw new Error(`Fields must be either a string or an array of strings. Got ${v} for key ${k}`);
|
|
381
|
+
}
|
|
382
|
+
this.addCondition({
|
|
383
|
+
test: key,
|
|
384
|
+
variable: k,
|
|
385
|
+
values: Array.isArray(v) ? v : [v],
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Add multiple conditions to the Policy
|
|
391
|
+
*
|
|
392
|
+
* See the `addCondition` function for a caveat on calling this method multiple times.
|
|
393
|
+
*/
|
|
394
|
+
addConditions(...conditions) {
|
|
395
|
+
conditions.map((c) => {
|
|
396
|
+
this.addCondition(c);
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Add multiple conditionObjects to the Policy
|
|
401
|
+
*
|
|
402
|
+
* See the `addConditionObject` function for a caveat on calling this method multiple times.
|
|
403
|
+
*/
|
|
404
|
+
addConditionObjects(conditions) {
|
|
405
|
+
for (const [key, value] of Object.entries(conditions)) {
|
|
406
|
+
this.addConditionObject(key, value);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Add a `StringEquals` condition that limits to a given account from `sts:ExternalId`.
|
|
411
|
+
*
|
|
412
|
+
* This method can only be called once: subsequent calls will overwrite earlier calls.
|
|
413
|
+
*
|
|
414
|
+
* @see https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html
|
|
415
|
+
*/
|
|
416
|
+
addAccountCondition(...accountIds) {
|
|
417
|
+
this.addCondition({
|
|
418
|
+
test: "StringEquals",
|
|
419
|
+
variable: "sts:ExternalId",
|
|
420
|
+
values: accountIds,
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Add an `StringEquals` condition that limits to a given account from `aws:SourceAccount`.
|
|
425
|
+
*
|
|
426
|
+
* This method can only be called once: subsequent calls will overwrite earlier calls.
|
|
427
|
+
*
|
|
428
|
+
* @see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount
|
|
429
|
+
*/
|
|
430
|
+
addSourceAccountCondition(...accountIds) {
|
|
431
|
+
this.addCondition({
|
|
432
|
+
test: "StringEquals",
|
|
433
|
+
variable: "aws:SourceAccount",
|
|
434
|
+
values: accountIds,
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Add an `ArnEquals` condition that limits to a given resource arn from `aws:SourceArn`.
|
|
439
|
+
*
|
|
440
|
+
* This method can only be called once: subsequent calls will overwrite earlier calls.
|
|
441
|
+
*
|
|
442
|
+
* @see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn
|
|
443
|
+
*/
|
|
444
|
+
addSourceArnCondition(...arns) {
|
|
445
|
+
this.addCondition({
|
|
446
|
+
test: "ArnEquals",
|
|
447
|
+
variable: "aws:SourceArn",
|
|
448
|
+
values: arns,
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Create a new `PolicyStatement` with the same exact properties
|
|
453
|
+
* as this one, except for the overrides
|
|
454
|
+
*/
|
|
455
|
+
copy(overrides = {}) {
|
|
456
|
+
return new PolicyStatement({
|
|
457
|
+
sid: overrides.sid ?? this.sid,
|
|
458
|
+
effect: overrides.effect ?? this.effect,
|
|
459
|
+
actions: overrides.actions ?? this.actions,
|
|
460
|
+
notActions: overrides.notActions ?? this.notActions,
|
|
461
|
+
principals: overrides.principals ?? this.principals,
|
|
462
|
+
notPrincipals: overrides.notPrincipals ?? this.notPrincipals,
|
|
463
|
+
resources: overrides.resources ?? this.resources,
|
|
464
|
+
notResources: overrides.notResources ?? this.notResources,
|
|
465
|
+
condition: overrides.condition ?? this.conditions,
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Get AWS IAM Policy statement JSON
|
|
470
|
+
*/
|
|
471
|
+
toStatementJson() {
|
|
472
|
+
return normalizeStatement({
|
|
473
|
+
Action: this._action.direct(),
|
|
474
|
+
NotAction: this._notAction.direct(),
|
|
475
|
+
Condition: toConditionJson(...toConditions(this._conditionMap)),
|
|
476
|
+
Effect: this.effect,
|
|
477
|
+
Principal: (0, principals_1.toPrincipalJson)(...this._principal),
|
|
478
|
+
NotPrincipal: (0, principals_1.toPrincipalJson)(...this._notPrincipal),
|
|
479
|
+
Resource: this._resource.direct(),
|
|
480
|
+
NotResource: this._notResource.direct(),
|
|
481
|
+
Sid: this.sid,
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* String representation of this policy statement
|
|
486
|
+
*/
|
|
487
|
+
toString() {
|
|
488
|
+
return cdktf_1.Token.asString(this, {
|
|
489
|
+
displayHint: "PolicyStatement",
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* JSON-ify the statement
|
|
494
|
+
*
|
|
495
|
+
* Used when JSON.stringify() is called
|
|
496
|
+
*/
|
|
497
|
+
toJSON() {
|
|
498
|
+
const principals = this.principals.flatMap((p) => p.policyFragment.principals);
|
|
499
|
+
const notPrincipals = this.notPrincipals.flatMap((p) => p.policyFragment.principals);
|
|
500
|
+
return {
|
|
501
|
+
sid: this.sid,
|
|
502
|
+
actions: this.actions.length > 0 ? this.actions : undefined,
|
|
503
|
+
notActions: this.notActions.length > 0 ? this.notActions : undefined,
|
|
504
|
+
principals: principals.length > 0 ? principals : undefined,
|
|
505
|
+
notPrincipals: notPrincipals.length > 0 ? notPrincipals : undefined,
|
|
506
|
+
resources: this.resources.length > 0 ? this.resources : undefined,
|
|
507
|
+
notResources: this.notResources.length > 0 ? this.notResources : undefined,
|
|
508
|
+
condition: this.conditions.length > 0 ? this.conditions : undefined,
|
|
509
|
+
effect: this.effect,
|
|
510
|
+
};
|
|
511
|
+
}
|
|
512
|
+
/**
|
|
513
|
+
* Add a principal's conditions
|
|
514
|
+
*
|
|
515
|
+
* For convenience, principals have been modeled as both a principal
|
|
516
|
+
* and a set of conditions. This makes it possible to have a single
|
|
517
|
+
* object represent e.g. an "SNS Topic" (SNS service principal + aws:SourcArn
|
|
518
|
+
* condition) or an Organization member (* + aws:OrgId condition).
|
|
519
|
+
*
|
|
520
|
+
* However, when using multiple principals in the same policy statement,
|
|
521
|
+
* they must all have the same conditions or the OR samentics
|
|
522
|
+
* implied by a list of principals cannot be guaranteed (user needs to
|
|
523
|
+
* add multiple statements in that case).
|
|
524
|
+
*/
|
|
525
|
+
addPrincipalConditions(...conditions) {
|
|
526
|
+
// Stringifying the conditions is an easy way to do deep equality
|
|
527
|
+
const theseConditions = JSON.stringify(conditions);
|
|
528
|
+
if (this.principalConditionsJson === undefined) {
|
|
529
|
+
// First principal, anything goes
|
|
530
|
+
this.principalConditionsJson = theseConditions;
|
|
531
|
+
}
|
|
532
|
+
else {
|
|
533
|
+
if (this.principalConditionsJson !== theseConditions) {
|
|
534
|
+
throw new Error(`All principals in a PolicyStatement must have the same Conditions (got '${this.principalConditionsJson}' and '${theseConditions}'). Use multiple statements instead.`);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
this.addConditions(...conditions);
|
|
538
|
+
}
|
|
539
|
+
/**
|
|
540
|
+
* Validate that the policy statement satisfies base requirements for a policy.
|
|
541
|
+
*
|
|
542
|
+
* @returns An array of validation error messages, or an empty array if the statement is valid.
|
|
543
|
+
*/
|
|
544
|
+
validateForAnyPolicy() {
|
|
545
|
+
const errors = new Array();
|
|
546
|
+
if (this._action.length === 0 && this._notAction.length === 0) {
|
|
547
|
+
errors.push("A PolicyStatement must specify at least one 'action' or 'notAction'.");
|
|
548
|
+
}
|
|
549
|
+
return errors;
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* Validate that the policy statement satisfies all requirements for a resource-based policy.
|
|
553
|
+
*
|
|
554
|
+
* @returns An array of validation error messages, or an empty array if the statement is valid.
|
|
555
|
+
*/
|
|
556
|
+
validateForResourcePolicy() {
|
|
557
|
+
const errors = this.validateForAnyPolicy();
|
|
558
|
+
if (this._principals.length === 0 && this._notPrincipals.length === 0) {
|
|
559
|
+
errors.push("A PolicyStatement used in a resource-based policy must specify at least one IAM principal.");
|
|
560
|
+
}
|
|
561
|
+
return errors;
|
|
562
|
+
}
|
|
563
|
+
/**
|
|
564
|
+
* Validate that the policy statement satisfies all requirements for an identity-based policy.
|
|
565
|
+
*
|
|
566
|
+
* @returns An array of validation error messages, or an empty array if the statement is valid.
|
|
567
|
+
*/
|
|
568
|
+
validateForIdentityPolicy() {
|
|
569
|
+
const errors = this.validateForAnyPolicy();
|
|
570
|
+
if (this._principals.length > 0 || this._notPrincipals.length > 0) {
|
|
571
|
+
errors.push("A PolicyStatement used in an identity-based policy cannot specify any IAM principals.");
|
|
572
|
+
}
|
|
573
|
+
if (this._resource.length === 0 && this._notResource.length === 0) {
|
|
574
|
+
errors.push("A PolicyStatement used in an identity-based policy must specify at least one resource.");
|
|
575
|
+
}
|
|
576
|
+
return errors;
|
|
577
|
+
}
|
|
578
|
+
/**
|
|
579
|
+
* The Actions added to this statement
|
|
580
|
+
*/
|
|
581
|
+
get actions() {
|
|
582
|
+
return this._action.copy();
|
|
583
|
+
}
|
|
584
|
+
/**
|
|
585
|
+
* The NotActions added to this statement
|
|
586
|
+
*/
|
|
587
|
+
get notActions() {
|
|
588
|
+
return this._notAction.copy();
|
|
589
|
+
}
|
|
590
|
+
/**
|
|
591
|
+
* The Principals added to this statement
|
|
592
|
+
*/
|
|
593
|
+
get principals() {
|
|
594
|
+
return this._principals.copy();
|
|
595
|
+
}
|
|
596
|
+
/**
|
|
597
|
+
* The NotPrincipals added to this statement
|
|
598
|
+
*/
|
|
599
|
+
get notPrincipals() {
|
|
600
|
+
return this._notPrincipals.copy();
|
|
601
|
+
}
|
|
602
|
+
/**
|
|
603
|
+
* The Resources added to this statement
|
|
604
|
+
*/
|
|
605
|
+
get resources() {
|
|
606
|
+
return this._resource.copy();
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* The NotResources added to this statement
|
|
610
|
+
*/
|
|
611
|
+
get notResources() {
|
|
612
|
+
return this._notResource.copy();
|
|
613
|
+
}
|
|
614
|
+
/**
|
|
615
|
+
* The conditions added to this statement
|
|
616
|
+
*/
|
|
617
|
+
get conditions() {
|
|
618
|
+
return toConditions(this._conditionMap);
|
|
619
|
+
}
|
|
620
|
+
/**
|
|
621
|
+
* Make the PolicyStatement immutable
|
|
622
|
+
*
|
|
623
|
+
* After calling this, any of the `addXxx()` methods will throw an exception.
|
|
624
|
+
*
|
|
625
|
+
* Libraries that lazily generate statement bodies can override this method to
|
|
626
|
+
* fill the actual PolicyStatement fields. Be aware that this method may be called
|
|
627
|
+
* multiple times.
|
|
628
|
+
*/
|
|
629
|
+
freeze() {
|
|
630
|
+
this._frozen = true;
|
|
631
|
+
return this;
|
|
632
|
+
}
|
|
633
|
+
/**
|
|
634
|
+
* Whether the PolicyStatement has been frozen
|
|
635
|
+
*
|
|
636
|
+
* The statement object is frozen when `freeze()` is called.
|
|
637
|
+
*/
|
|
638
|
+
get frozen() {
|
|
639
|
+
return this._frozen;
|
|
640
|
+
}
|
|
641
|
+
/**
|
|
642
|
+
* Estimate the size of this policy statement
|
|
643
|
+
*
|
|
644
|
+
* By necessity, this will not be accurate. We'll do our best to overestimate
|
|
645
|
+
* so we won't have nasty surprises.
|
|
646
|
+
*
|
|
647
|
+
* @internal
|
|
648
|
+
*/
|
|
649
|
+
_estimateSize(options) {
|
|
650
|
+
let ret = 0;
|
|
651
|
+
const { actionEstimate, arnEstimate } = options;
|
|
652
|
+
ret += `"Effect": "${this.effect}",`.length;
|
|
653
|
+
count("Action", this.actions, actionEstimate);
|
|
654
|
+
count("NotAction", this.notActions, actionEstimate);
|
|
655
|
+
count("Resource", this.resources, arnEstimate);
|
|
656
|
+
count("NotResource", this.notResources, arnEstimate);
|
|
657
|
+
ret += this.principals.length * arnEstimate;
|
|
658
|
+
ret += this.notPrincipals.length * arnEstimate;
|
|
659
|
+
ret += JSON.stringify(toConditionJson(...this.conditions)).length;
|
|
660
|
+
return ret;
|
|
661
|
+
function count(key, values, tokenSize) {
|
|
662
|
+
if (values.length > 0) {
|
|
663
|
+
ret +=
|
|
664
|
+
key.length +
|
|
665
|
+
5 /* quotes, colon, brackets */ +
|
|
666
|
+
sum(values.map((v) => (cdktf_1.Token.isUnresolved(v) ? tokenSize : v.length) +
|
|
667
|
+
3 /* quotes, separator */));
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
/**
|
|
672
|
+
* Throw an exception when the object is frozen
|
|
673
|
+
*/
|
|
674
|
+
assertNotFrozen(method) {
|
|
675
|
+
if (this._frozen) {
|
|
676
|
+
throw new Error(`${method}: freeze() has been called on this PolicyStatement previously, so it can no longer be modified`);
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
exports.PolicyStatement = PolicyStatement;
|
|
681
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
682
|
+
PolicyStatement[_a] = { fqn: "terraconstructs.aws.iam.PolicyStatement", version: "0.0.8" };
|
|
683
|
+
/**
|
|
684
|
+
* The Effect element of an IAM policy
|
|
685
|
+
*
|
|
686
|
+
* @see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_effect.html
|
|
687
|
+
*/
|
|
688
|
+
var Effect;
|
|
689
|
+
(function (Effect) {
|
|
690
|
+
/**
|
|
691
|
+
* Allows access to a resource in an IAM policy statement. By default, access to resources are denied.
|
|
692
|
+
*/
|
|
693
|
+
Effect["ALLOW"] = "Allow";
|
|
694
|
+
/**
|
|
695
|
+
* Explicitly deny access to a resource. By default, all requests are denied implicitly.
|
|
696
|
+
*
|
|
697
|
+
* @see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html
|
|
698
|
+
*/
|
|
699
|
+
Effect["DENY"] = "Deny";
|
|
700
|
+
})(Effect || (exports.Effect = Effect = {}));
|
|
701
|
+
// TODO: Support IResolvable Condition?
|
|
702
|
+
class JsonPrincipal extends principals_1.PrincipalBase {
|
|
703
|
+
constructor(json = {}) {
|
|
704
|
+
super();
|
|
705
|
+
this.principals = [];
|
|
706
|
+
this.policyFragment = principals_1.PrincipalPolicyFragment.fromJson(json);
|
|
707
|
+
}
|
|
708
|
+
dedupeString() {
|
|
709
|
+
return JSON.stringify(this.policyFragment);
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
/**
|
|
713
|
+
* Derive the size estimation options from context
|
|
714
|
+
*
|
|
715
|
+
* @internal
|
|
716
|
+
*/
|
|
717
|
+
function deriveEstimateSizeOptions(_scope) {
|
|
718
|
+
const actionEstimate = 20;
|
|
719
|
+
const arnEstimate = DEFAULT_ARN_SIZE_ESTIMATE;
|
|
720
|
+
return { actionEstimate, arnEstimate };
|
|
721
|
+
}
|
|
722
|
+
exports.deriveEstimateSizeOptions = deriveEstimateSizeOptions;
|
|
723
|
+
/**
|
|
724
|
+
* A class that behaves both as a set and an array
|
|
725
|
+
*
|
|
726
|
+
* Used for the elements of a PolicyStatement. In practice they behave as sets,
|
|
727
|
+
* but we have thousands of snapshot tests in existence that will rely on a
|
|
728
|
+
* particular order so we can't just change the type to `Set<>` wholesale without
|
|
729
|
+
* causing a lot of churn.
|
|
730
|
+
*/
|
|
731
|
+
class OrderedSet {
|
|
732
|
+
constructor() {
|
|
733
|
+
this.set = new Set();
|
|
734
|
+
this.array = new Array();
|
|
735
|
+
}
|
|
736
|
+
/**
|
|
737
|
+
* Add new elements to the set
|
|
738
|
+
*
|
|
739
|
+
* @param xs the elements to be added
|
|
740
|
+
*
|
|
741
|
+
* @returns the elements actually added
|
|
742
|
+
*/
|
|
743
|
+
push(...xs) {
|
|
744
|
+
const ret = new Array();
|
|
745
|
+
for (const x of xs) {
|
|
746
|
+
if (this.set.has(x)) {
|
|
747
|
+
continue;
|
|
748
|
+
}
|
|
749
|
+
this.set.add(x);
|
|
750
|
+
this.array.push(x);
|
|
751
|
+
ret.push(x);
|
|
752
|
+
}
|
|
753
|
+
return ret;
|
|
754
|
+
}
|
|
755
|
+
get length() {
|
|
756
|
+
return this.array.length;
|
|
757
|
+
}
|
|
758
|
+
copy() {
|
|
759
|
+
return [...this.array];
|
|
760
|
+
}
|
|
761
|
+
/**
|
|
762
|
+
* Direct (read-only) access to the underlying array
|
|
763
|
+
*
|
|
764
|
+
* (Saves a copy)
|
|
765
|
+
*/
|
|
766
|
+
direct() {
|
|
767
|
+
return this.array;
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
function sum(xs) {
|
|
771
|
+
return xs.reduce((a, b) => a + b, 0);
|
|
772
|
+
}
|
|
773
|
+
function normalizeStatement(s) {
|
|
774
|
+
return noUndef({
|
|
775
|
+
Action: _norm(s.Action, { unique: true }),
|
|
776
|
+
NotAction: _norm(s.NotAction, { unique: true }),
|
|
777
|
+
Condition: _norm(s.Condition),
|
|
778
|
+
Effect: _norm(s.Effect),
|
|
779
|
+
Principal: _normPrincipal(s.Principal),
|
|
780
|
+
NotPrincipal: _normPrincipal(s.NotPrincipal),
|
|
781
|
+
Resource: _norm(s.Resource, { unique: true }),
|
|
782
|
+
NotResource: _norm(s.NotResource, { unique: true }),
|
|
783
|
+
Sid: _norm(s.Sid),
|
|
784
|
+
});
|
|
785
|
+
function _norm(values, { unique = false } = { unique: false }) {
|
|
786
|
+
if (values == null) {
|
|
787
|
+
return undefined;
|
|
788
|
+
}
|
|
789
|
+
if (cdktf_1.Token.isUnresolved(values)) {
|
|
790
|
+
return values;
|
|
791
|
+
}
|
|
792
|
+
if (Array.isArray(values)) {
|
|
793
|
+
if (!values || values.length === 0) {
|
|
794
|
+
return undefined;
|
|
795
|
+
}
|
|
796
|
+
if (values.length === 1) {
|
|
797
|
+
return values[0];
|
|
798
|
+
}
|
|
799
|
+
return unique ? Array.from(new Set(values)) : values;
|
|
800
|
+
}
|
|
801
|
+
if (values && typeof values === "object") {
|
|
802
|
+
if (Object.keys(values).length === 0) {
|
|
803
|
+
return undefined;
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
return values;
|
|
807
|
+
}
|
|
808
|
+
function _normPrincipal(principal) {
|
|
809
|
+
if (!principal) {
|
|
810
|
+
return undefined;
|
|
811
|
+
}
|
|
812
|
+
if (typeof principal === "string") {
|
|
813
|
+
return principal;
|
|
814
|
+
}
|
|
815
|
+
if (Array.isArray(principal) || typeof principal !== "object") {
|
|
816
|
+
return undefined;
|
|
817
|
+
}
|
|
818
|
+
const keys = Object.keys(principal);
|
|
819
|
+
if (keys.length === 0) {
|
|
820
|
+
return undefined;
|
|
821
|
+
}
|
|
822
|
+
const result = {};
|
|
823
|
+
for (const key of keys) {
|
|
824
|
+
const normVal = _norm(principal[key]);
|
|
825
|
+
if (normVal) {
|
|
826
|
+
result[key] = normVal;
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
return result;
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
function noUndef(x) {
|
|
833
|
+
const ret = {};
|
|
834
|
+
for (const [key, value] of Object.entries(x)) {
|
|
835
|
+
if (value !== undefined) {
|
|
836
|
+
ret[key] = value;
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
return ret;
|
|
840
|
+
}
|
|
841
|
+
function ensureArrayOrUndefined(field) {
|
|
842
|
+
if (field === undefined) {
|
|
843
|
+
return undefined;
|
|
844
|
+
}
|
|
845
|
+
if (typeof field !== "string" && !Array.isArray(field)) {
|
|
846
|
+
throw new Error("Fields must be either a string or an array of strings");
|
|
847
|
+
}
|
|
848
|
+
if (Array.isArray(field) && !!field.find((f) => typeof f !== "string")) {
|
|
849
|
+
throw new Error("Fields must be either a string or an array of strings");
|
|
850
|
+
}
|
|
851
|
+
return Array.isArray(field) ? field : [field];
|
|
852
|
+
}
|
|
853
|
+
function isStringOrArrayOfStrings(value) {
|
|
854
|
+
if (typeof value === "string") {
|
|
855
|
+
return true;
|
|
856
|
+
}
|
|
857
|
+
if (Array.isArray(value) && value.every((item) => typeof item === "string")) {
|
|
858
|
+
return true;
|
|
859
|
+
}
|
|
860
|
+
return false;
|
|
861
|
+
}
|
|
862
|
+
exports.isStringOrArrayOfStrings = isStringOrArrayOfStrings;
|
|
863
|
+
/**
|
|
864
|
+
* Convert a condition JSON object to a list of Terraform AWS Policy Statement Conditions
|
|
865
|
+
*
|
|
866
|
+
* JSON object is specified in the following structure:
|
|
867
|
+
*
|
|
868
|
+
* `{ "Operator": { "keyInRequestContext": "value" } }`
|
|
869
|
+
*
|
|
870
|
+
* The value can be either a single string value or an array of string values.
|
|
871
|
+
*
|
|
872
|
+
* For more information, including which operators are supported, see [the IAM
|
|
873
|
+
* documentation](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html).
|
|
874
|
+
* @param conditionJson The condition JSON object
|
|
875
|
+
* @returns The list of Terraform condition objects
|
|
876
|
+
*/
|
|
877
|
+
function fromConditionJson(conditionJson) {
|
|
878
|
+
if (!conditionJson) {
|
|
879
|
+
return undefined;
|
|
880
|
+
}
|
|
881
|
+
const result = new Array();
|
|
882
|
+
for (const [test, variables] of Object.entries(conditionJson)) {
|
|
883
|
+
if (Array.isArray(variables)) {
|
|
884
|
+
throw new Error(`Invalid event pattern field { ${test}: ${JSON.stringify(variables)} }. All fields must be objects`);
|
|
885
|
+
}
|
|
886
|
+
for (const [variable, value] of Object.entries(variables)) {
|
|
887
|
+
result.push({
|
|
888
|
+
test,
|
|
889
|
+
variable,
|
|
890
|
+
values: Array.isArray(value) ? value : [value],
|
|
891
|
+
});
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
return result;
|
|
895
|
+
}
|
|
896
|
+
exports.fromConditionJson = fromConditionJson;
|
|
897
|
+
/**
|
|
898
|
+
* flatten Conditions mapped by test and variable to an array of Terraform AWS Policy Statement Conditions
|
|
899
|
+
* @param conditionMap The condition map
|
|
900
|
+
* @returns The list of Terraform condition objects
|
|
901
|
+
*/
|
|
902
|
+
function toConditions(conditionMap) {
|
|
903
|
+
return Object.values(conditionMap).flatMap((variables) => Object.values(variables));
|
|
904
|
+
// const conditions: Conditions = [];
|
|
905
|
+
// for (const variablesMap of Object.values(conditionMap)) {
|
|
906
|
+
// for (const condition of Object.values(variablesMap)) {
|
|
907
|
+
// conditions.push(condition);
|
|
908
|
+
// }
|
|
909
|
+
// }
|
|
910
|
+
// return conditions;
|
|
911
|
+
}
|
|
912
|
+
exports.toConditions = toConditions;
|
|
913
|
+
/**
|
|
914
|
+
* Convert a list of Terraform AWS Policy Statement condition objects back to a condition JSON object
|
|
915
|
+
* @param conditions The list of Terraform condition objects
|
|
916
|
+
* @returns The condition JSON object
|
|
917
|
+
*/
|
|
918
|
+
function toConditionJson(...conditions) {
|
|
919
|
+
const conditionJson = {};
|
|
920
|
+
for (const condition of conditions) {
|
|
921
|
+
const { test, variable, values } = condition;
|
|
922
|
+
if (!conditionJson[test]) {
|
|
923
|
+
conditionJson[test] = {};
|
|
924
|
+
}
|
|
925
|
+
if (values.length === 1) {
|
|
926
|
+
conditionJson[test][variable] = values[0];
|
|
927
|
+
}
|
|
928
|
+
else {
|
|
929
|
+
conditionJson[test][variable] = values;
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
return conditionJson;
|
|
933
|
+
}
|
|
934
|
+
exports.toConditionJson = toConditionJson;
|
|
935
|
+
/**
|
|
936
|
+
* Validate that the given value is a valid Json Condition object
|
|
937
|
+
*
|
|
938
|
+
* AWS CDK IAM library relies on being able to pass in a `Json` instance for
|
|
939
|
+
* a `Condition`.
|
|
940
|
+
*/
|
|
941
|
+
function validateConditionObject(x) {
|
|
942
|
+
if (!x || typeof x !== "object" || Array.isArray(x)) {
|
|
943
|
+
throw new Error("A Condition should be represented as a map of operator to value");
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
exports.validateConditionObject = validateConditionObject;
|
|
947
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9saWN5LXN0YXRlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvaWFtL3BvbGljeS1zdGF0ZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSxpQ0FBOEI7QUFHOUIsNkNBZXNCO0FBRXRCOzs7Ozs7R0FNRztBQUNILE1BQU0seUJBQXlCLEdBQUcsR0FBRyxDQUFDO0FBTXRDOztHQUVHO0FBQ0gsTUFBYSxlQUFlO0lBQzFCOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFRO1FBQzdCLHVDQUF1QztRQUN2QyxNQUFNLEdBQUcsR0FBRyxJQUFJLGVBQWUsQ0FBQztZQUM5QixHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUc7WUFDWixPQUFPLEVBQUUsc0JBQXNCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUMzQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUMvQyxTQUFTLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztZQUMzQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU07WUFDbEIsVUFBVSxFQUFFLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7WUFDakQsWUFBWSxFQUFFLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7WUFDckQsVUFBVSxFQUFFLEdBQUcsQ0FBQyxTQUFTO2dCQUN2QixDQUFDLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3BDLENBQUMsQ0FBQyxTQUFTO1lBQ2IsYUFBYSxFQUFFLEdBQUcsQ0FBQyxZQUFZO2dCQUM3QixDQUFDLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3ZDLENBQUMsQ0FBQyxTQUFTO1NBQ2QsQ0FBQyxDQUFDO1FBRUgsMERBQTBEO1FBQzFELE1B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QUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sYUFBYSxDQUFDO0FBQ3ZCLENBQUM7QUFwQkQsMENBb0JDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQix1QkFBdUIsQ0FDckMsQ0FBVTtJQUVWLElBQUksQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRCxNQUFNLElBQUksS0FBSyxDQUNiLGlFQUFpRSxDQUNsRSxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFSRCwwREFRQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWlhbS9saWIvcG9saWN5LXN0YXRlbWVudC50c1xuaW1wb3J0IHsgZGF0YUF3c0lhbVBvbGljeURvY3VtZW50IH0gZnJvbSBcIkBjZGt0Zi9wcm92aWRlci1hd3NcIjtcbmltcG9ydCB7IFRva2VuIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudFByb3BzIH0gZnJvbSBcIi4vcG9saWN5LXN0YXRlbWVudC1wcm9wcy5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIEFjY291bnRQcmluY2lwYWwsXG4gIEFjY291bnRSb290UHJpbmNpcGFsLFxuICBBbnlQcmluY2lwYWwsXG4gIEFyblByaW5jaXBhbCxcbiAgQ2Fub25pY2FsVXNlclByaW5jaXBhbCxcbiAgRmVkZXJhdGVkUHJpbmNpcGFsLFxuICBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCxcbiAgU2VydmljZVByaW5jaXBhbCxcbiAgU2VydmljZVByaW5jaXBhbE9wdHMsXG4gIElQcmluY2lwYWwsXG4gIFByaW5jaXBhbFByb3BzLFxuICBtZXJnZVByaW5jaXBhbCxcbiAgdG9QcmluY2lwYWxKc29uLFxuICBQcmluY2lwYWxCYXNlLFxufSBmcm9tIFwiLi9wcmluY2lwYWxzXCI7XG5cbi8qKlxuICogQW4gZXN0aW1hdGUgb24gaG93IGxvbmcgQVJOcyB0eXBpY2FsbHkgYXJlXG4gKlxuICogVGhpcyBpcyB1c2VkIHRvIGRlY2lkZSB3aGVuIHRvIHN0YXJ0IHNwbGl0dGluZyBzdGF0ZW1lbnRzIGludG8gbmV3IE1hbmFnZWQgUG9saWNpZXMuXG4gKiBCZWNhdXNlIHdlIG9mdGVuIGNhbid0IGtub3cgdGhlIGxlbmd0aCBvZiBhbiBBUk4gKGl0IG1heSBiZSBhIHRva2VuIGFuZCBvbmx5XG4gKiBhdmFpbGFibGUgYXQgZGVwbG95bWVudCB0aW1lKSB3ZSdsbCBoYXZlIHRvIGVzdGltYXRlIGl0LlxuICovXG5jb25zdCBERUZBVUxUX0FSTl9TSVpFX0VTVElNQVRFID0gMTUwO1xuXG5leHBvcnQgdHlwZSBDb25kaXRpb25NYXAgPSB7XG4gIFt0ZXN0OiBzdHJpbmddOiB7IFt2YXJpYWJsZTogc3RyaW5nXTogQ29uZGl0aW9uIH07XG59O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzdGF0ZW1lbnQgaW4gYW4gSUFNIHBvbGljeSBkb2N1bWVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBvbGljeVN0YXRlbWVudCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFRlcnJhZm9ybSBQb2xpY3lTdGF0ZW1lbnQgYmFzZWQgb24gdGhlIEFXUyBJQU0gUG9saWN5IFN0YXRlbWVudCBmb3JtYXQuXG4gICAqIFRoaXMgd2lsbCBhY2NlcHQgYW4gb2JqZWN0IGNyZWF0ZWQgZnJvbSB0aGUgYC50b1N0YXRlbWVudEpzb24oKWAgY2FsbFxuICAgKlxuICAgKiBAcGFyYW0gb2JqIHRoZSBQb2xpY3lTdGF0ZW1lbnQgaW4gb2JqZWN0IGZvcm0uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Kc29uKG9iajogYW55KSB7XG4gICAgLy8gVE9ETzogV2hhdCBpZiBvYmogaXMvaGFzIGEgVG9rZW4ocyk/XG4gICAgY29uc3QgcmV0ID0gbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6IG9iai5TaWQsXG4gICAgICBhY3Rpb25zOiBlbnN1cmVBcnJheU9yVW5kZWZpbmVkKG9iai5BY3Rpb24pLFxuICAgICAgcmVzb3VyY2VzOiBlbnN1cmVBcnJheU9yVW5kZWZpbmVkKG9iai5SZXNvdXJjZSksXG4gICAgICBjb25kaXRpb246IGZyb21Db25kaXRpb25Kc29uKG9iai5Db25kaXRpb24pLFxuICAgICAgZWZmZWN0OiBvYmouRWZmZWN0LFxuICAgICAgbm90QWN0aW9uczogZW5zdXJlQXJyYXlPclVuZGVmaW5lZChvYmouTm90QWN0aW9uKSxcbiAgICAgIG5vdFJlc291cmNlczogZW5zdXJlQXJyYXlPclVuZGVmaW5lZChvYmouTm90UmVzb3VyY2UpLFxuICAgICAgcHJpbmNpcGFsczogb2JqLlByaW5jaXBhbFxuICAgICAgICA/IFtuZXcgSnNvblByaW5jaXBhbChvYmouUHJpbmNpcGFsKV1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBub3RQcmluY2lwYWxzOiBvYmouTm90UHJpbmNpcGFsXG4gICAgICAgID8gW25ldyBKc29uUHJpbmNpcGFsKG9iai5Ob3RQcmluY2lwYWwpXVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIC8vIHZhbGlkYXRlIHRoYXQgdGhlIFBvbGljeVN0YXRlbWVudCBoYXMgdGhlIGNvcnJlY3Qgc2hhcGVcbiAgICBjb25zdCBlcnJvcnMgPSByZXQudmFsaWRhdGVGb3JBbnlQb2xpY3koKTtcbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkluY29ycmVjdCBQb2xpY3kgU3RhdGVtZW50OiBcIiArIGVycm9ycy5qb2luKFwiXFxuXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfYWN0aW9uID0gbmV3IE9yZGVyZWRTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9ub3RBY3Rpb24gPSBuZXcgT3JkZXJlZFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ByaW5jaXBhbDogUHJpbmNpcGFsUHJvcHNbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IF9ub3RQcmluY2lwYWw6IFByaW5jaXBhbFByb3BzW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVzb3VyY2UgPSBuZXcgT3JkZXJlZFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX25vdFJlc291cmNlID0gbmV3IE9yZGVyZWRTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jb25kaXRpb25NYXA6IENvbmRpdGlvbk1hcCA9IHt9O1xuICBwcml2YXRlIF9zaWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2VmZmVjdDogRWZmZWN0O1xuICBwcml2YXRlIHByaW5jaXBhbENvbmRpdGlvbnNKc29uPzogc3RyaW5nO1xuXG4gIC8vIEhvbGQgb24gdG8gdGhvc2UgcHJpbmNpcGFsc1xuICBwcml2YXRlIHJlYWRvbmx5IF9wcmluY2lwYWxzID0gbmV3IE9yZGVyZWRTZXQ8SVByaW5jaXBhbD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbm90UHJpbmNpcGFscyA9IG5ldyBPcmRlcmVkU2V0PElQcmluY2lwYWw+KCk7XG4gIHByaXZhdGUgX2Zyb3plbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBQb2xpY3lTdGF0ZW1lbnRQcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5fc2lkID0gcHJvcHMuc2lkO1xuICAgIHRoaXMuX2VmZmVjdCA9IHByb3BzLmVmZmVjdCB8fCBFZmZlY3QuQUxMT1c7XG5cbiAgICB0aGlzLmFkZEFjdGlvbnMoLi4uKHByb3BzLmFjdGlvbnMgfHwgW10pKTtcbiAgICB0aGlzLmFkZE5vdEFjdGlvbnMoLi4uKHByb3BzLm5vdEFjdGlvbnMgfHwgW10pKTtcbiAgICB0aGlzLmFkZFByaW5jaXBhbHMoLi4uKHByb3BzLnByaW5jaXBhbHMgfHwgW10pKTtcbiAgICB0aGlzLmFkZE5vdFByaW5jaXBhbHMoLi4uKHByb3BzLm5vdFByaW5jaXBhbHMgfHwgW10pKTtcbiAgICB0aGlzLmFkZFJlc291cmNlcyguLi4ocHJvcHMucmVzb3VyY2VzIHx8IFtdKSk7XG4gICAgdGhpcy5hZGROb3RSZXNvdXJjZXMoLi4uKHByb3BzLm5vdFJlc291cmNlcyB8fCBbXSkpO1xuICAgIC8vIFRPRE86IEhhbmRsZSBJUmVzb2x2YWJsZSBjb25kaXRpb24/XG4gICAgaWYgKHByb3BzLmNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmFkZENvbmRpdGlvbnMoLi4ucHJvcHMuY29uZGl0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RhdGVtZW50IElEIGZvciB0aGlzIHN0YXRlbWVudFxuICAgKi9cbiAgcHVibGljIGdldCBzaWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBTdGF0ZW1lbnQgSUQgZm9yIHRoaXMgc3RhdGVtZW50XG4gICAqL1xuICBwdWJsaWMgc2V0IHNpZChzaWQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuYXNzZXJ0Tm90RnJvemVuKFwic2lkXCIpO1xuICAgIHRoaXMuX3NpZCA9IHNpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IG9yIGRlbnkgdGhlIGFjdGlvbnMgaW4gdGhpcyBzdGF0ZW1lbnRcbiAgICovXG4gIHB1YmxpYyBnZXQgZWZmZWN0KCk6IEVmZmVjdCB7XG4gICAgcmV0dXJuIHRoaXMuX2VmZmVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZWZmZWN0IGZvciB0aGlzIHN0YXRlbWVudFxuICAgKi9cbiAgcHVibGljIHNldCBlZmZlY3QoZWZmZWN0OiBFZmZlY3QpIHtcbiAgICB0aGlzLmFzc2VydE5vdEZyb3plbihcImVmZmVjdFwiKTtcbiAgICB0aGlzLl9lZmZlY3QgPSBlZmZlY3Q7XG4gIH1cblxuICAvL1xuICAvLyBBY3Rpb25zXG4gIC8vXG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYWxsb3dlZCBhY3Rpb25zIGludG8gdGhlIFwiQWN0aW9uXCIgc2VjdGlvbiBvZiB0aGUgcG9saWN5IHN0YXRlbWVudC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2FjdGlvbi5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBhY3Rpb25zIGFjdGlvbnMgdGhhdCB3aWxsIGJlIGFsbG93ZWQuXG4gICAqL1xuICBwdWJsaWMgYWRkQWN0aW9ucyguLi5hY3Rpb25zOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuYXNzZXJ0Tm90RnJvemVuKFwiYWRkQWN0aW9uc1wiKTtcbiAgICBpZiAoYWN0aW9ucy5sZW5ndGggPiAwICYmIHRoaXMuX25vdEFjdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ2Fubm90IGFkZCAnQWN0aW9ucycgdG8gcG9saWN5IHN0YXRlbWVudCBpZiAnTm90QWN0aW9ucycgaGF2ZSBiZWVuIGFkZGVkXCIsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlUG9saWN5QWN0aW9ucyhhY3Rpb25zKTtcbiAgICB0aGlzLl9hY3Rpb24ucHVzaCguLi5hY3Rpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBsaWNpdGx5IGFsbG93IGFsbCBhY3Rpb25zIGV4Y2VwdCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgYWN0aW9ucyBpbnRvIHRoZSBcIk5vdEFjdGlvblwiIHNlY3Rpb25cbiAgICogb2YgdGhlIHBvbGljeSBkb2N1bWVudC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX25vdGFjdGlvbi5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBub3RBY3Rpb25zIGFjdGlvbnMgdGhhdCB3aWxsIGJlIGRlbmllZC4gQWxsIG90aGVyIGFjdGlvbnMgd2lsbCBiZSBwZXJtaXR0ZWQuXG4gICAqL1xuICBwdWJsaWMgYWRkTm90QWN0aW9ucyguLi5ub3RBY3Rpb25zOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuYXNzZXJ0Tm90RnJvemVuKFwiYWRkTm90QWN0aW9uc1wiKTtcbiAgICBpZiAobm90QWN0aW9ucy5sZW5ndGggPiAwICYmIHRoaXMuX2FjdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ2Fubm90IGFkZCAnTm90QWN0aW9ucycgdG8gcG9saWN5IHN0YXRlbWVudCBpZiAnQWN0aW9ucycgaGF2ZSBiZWVuIGFkZGVkXCIsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlUG9saWN5QWN0aW9ucyhub3RBY3Rpb25zKTtcbiAgICB0aGlzLl9ub3RBY3Rpb24ucHVzaCguLi5ub3RBY3Rpb25zKTtcbiAgfVxuXG4gIC8vXG4gIC8vIFByaW5jaXBhbFxuICAvL1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBwZXJtaXNzaW9uIGhhcyBhIFwiUHJpbmNpcGFsXCIgc2VjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzUHJpbmNpcGFsKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmluY2lwYWxzLmxlbmd0aCArIHRoaXMuX25vdFByaW5jaXBhbHMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHByaW5jaXBhbHMgdG8gdGhlIFwiUHJpbmNpcGFsXCIgc2VjdGlvbiBvZiBhIHBvbGljeSBzdGF0ZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19wcmluY2lwYWwuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gcHJpbmNpcGFscyBJQU0gcHJpbmNpcGFscyB0aGF0IHdpbGwgYmUgYWRkZWRcbiAgICovXG4gIHB1YmxpYyBhZGRQcmluY2lwYWxzKC4uLnByaW5jaXBhbHM6IElQcmluY2lwYWxbXSkge1xuICAgIHRoaXMuYXNzZXJ0Tm90RnJvemVuKFwiYWRkUHJpbmNpcGFsc1wiKTtcbiAgICBpZiAocHJpbmNpcGFscy5sZW5ndGggPiAwICYmIHRoaXMuX25vdFByaW5jaXBhbHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkNhbm5vdCBhZGQgJ1ByaW5jaXBhbHMnIHRvIHBvbGljeSBzdGF0ZW1lbnQgaWYgJ05vdFByaW5jaXBhbHMnIGhhdmUgYmVlbiBhZGRlZFwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gVE9ETzogQVdTQ0RLIG9ubHkgZW5zdXJlcyBQcmluY2lwYWwgaXMgbm90IGluc3RhbmNlb2YgR3JvdXBcbiAgICAvLyBmb3IgKGNvbnN0IHByaW5jaXBhbCBvZiBwcmluY2lwYWxzKSB7XG4gICAgLy8gICB0aGlzLnZhbGlkYXRlUG9saWN5UHJpbmNpcGFsKHByaW5jaXBhbCk7XG4gICAgLy8gfVxuXG4gICAgY29uc3QgYWRkZWQgPSB0aGlzLl9wcmluY2lwYWxzLnB1c2goLi4ucHJpbmNpcGFscyk7XG4gICAgZm9yIChjb25zdCBwcmluY2lwYWwgb2YgYWRkZWQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gcHJpbmNpcGFsLnBvbGljeUZyYWdtZW50O1xuICAgICAgbWVyZ2VQcmluY2lwYWwodGhpcy5fcHJpbmNpcGFsLCBmcmFnbWVudC5wcmluY2lwYWxzKTtcbiAgICAgIHRoaXMuYWRkUHJpbmNpcGFsQ29uZGl0aW9ucyguLi5mcmFnbWVudC5jb25kaXRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSBwcmluY2lwYWxzIHRoYXQgaXMgbm90IGFsbG93ZWQgb3IgZGVuaWVkIGFjY2VzcyB0byB0aGUgXCJOb3RQcmluY2lwYWxcIiBzZWN0aW9uIG9mXG4gICAqIGEgcG9saWN5IHN0YXRlbWVudC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX25vdHByaW5jaXBhbC5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBub3RQcmluY2lwYWxzIElBTSBwcmluY2lwYWxzIHRoYXQgd2lsbCBiZSBkZW5pZWQgYWNjZXNzXG4gICAqL1xuICBwdWJsaWMgYWRkTm90UHJpbmNpcGFscyguLi5ub3RQcmluY2lwYWxzOiBJUHJpbmNpcGFsW10pIHtcbiAgICB0aGlzLmFzc2VydE5vdEZyb3plbihcImFkZE5vdFByaW5jaXBhbHNcIik7XG4gICAgaWYgKG5vdFByaW5jaXBhbHMubGVuZ3RoID4gMCAmJiB0aGlzLl9wcmluY2lwYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgYWRkICdOb3RQcmluY2lwYWxzJyB0byBwb2xpY3kgc3RhdGVtZW50IGlmICdQcmluY2lwYWxzJyBoYXZlIGJlZW4gYWRkZWRcIixcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIGZvciAoY29uc3Qgbm90UHJpbmNpcGFsIG9mIG5vdFByaW5jaXBhbHMpIHtcbiAgICAvLyAgIHRoaXMudmFsaWRhdGVQb2xpY3lQcmluY2lwYWwobm90UHJpbmNpcGFsKTtcbiAgICAvLyB9XG5cbiAgICBjb25zdCBhZGRlZCA9IHRoaXMuX25vdFByaW5jaXBhbHMucHVzaCguLi5ub3RQcmluY2lwYWxzKTtcbiAgICBmb3IgKGNvbnN0IG5vdFByaW5jaXBhbCBvZiBhZGRlZCkge1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSBub3RQcmluY2lwYWwucG9saWN5RnJhZ21lbnQ7XG4gICAgICBtZXJnZVByaW5jaXBhbCh0aGlzLl9ub3RQcmluY2lwYWwsIGZyYWdtZW50LnByaW5jaXBhbHMpO1xuICAgICAgdGhpcy5hZGRQcmluY2lwYWxDb25kaXRpb25zKC4uLmZyYWdtZW50LmNvbmRpdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVQb2xpY3lBY3Rpb25zKGFjdGlvbnM6IHN0cmluZ1tdKSB7XG4gICAgLy8gSW4gY2FzZSBvZiBhbiB1bnJlc29sdmVkIGxpc3Qgb2YgYWN0aW9ucyByZXR1cm4gZWFybHlcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKGFjdGlvbnMpKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucyB8fCBbXSkge1xuICAgICAgaWYgKFxuICAgICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKGFjdGlvbikgJiZcbiAgICAgICAgIS9eKFxcKnxbYS16QS1aMC05LV0rOlthLXpBLVowLTkqXSspJC8udGVzdChhY3Rpb24pXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBBY3Rpb24gJyR7YWN0aW9ufScgaXMgaW52YWxpZC4gQW4gYWN0aW9uIHN0cmluZyBjb25zaXN0cyBvZiBhIHNlcnZpY2UgbmFtZXNwYWNlLCBhIGNvbG9uLCBhbmQgdGhlIG5hbWUgb2YgYW4gYWN0aW9uLiBBY3Rpb24gbmFtZXMgY2FuIGluY2x1ZGUgd2lsZGNhcmRzLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgQVdTIGFjY291bnQgSUQgYXMgdGhlIHByaW5jaXBhbCBlbnRpdHkgdG8gdGhlIFwiUHJpbmNpcGFsXCIgc2VjdGlvbiBvZiBhIHBvbGljeSBzdGF0ZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgYWRkQXdzQWNjb3VudFByaW5jaXBhbChhY2NvdW50SWQ6IHN0cmluZykge1xuICAgIHRoaXMuYWRkUHJpbmNpcGFscyhuZXcgQWNjb3VudFByaW5jaXBhbChhY2NvdW50SWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGEgcHJpbmNpcGFsIHVzaW5nIHRoZSBBUk4gIGlkZW50aWZpZXIgb2YgdGhlIHByaW5jaXBhbC5cbiAgICogWW91IGNhbm5vdCBzcGVjaWZ5IElBTSBncm91cHMgYW5kIGluc3RhbmNlIHByb2ZpbGVzIGFzIHByaW5jaXBhbHMuXG4gICAqXG4gICAqIEBwYXJhbSBhcm4gQVJOIGlkZW50aWZpZXIgb2YgQVdTIGFjY291bnQsIElBTSB1c2VyLCBvciBJQU0gcm9sZSAoaS5lLiBhcm46YXdzOmlhbTo6MTIzNDU2Nzg5MDEyOnVzZXIvdXNlci1uYW1lKVxuICAgKi9cbiAgcHVibGljIGFkZEFyblByaW5jaXBhbChhcm46IHN0cmluZykge1xuICAgIHRoaXMuYWRkUHJpbmNpcGFscyhuZXcgQXJuUHJpbmNpcGFsKGFybikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzZXJ2aWNlIHByaW5jaXBhbCB0byB0aGlzIHBvbGljeSBzdGF0ZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlIHRoZSBzZXJ2aWNlIG5hbWUgZm9yIHdoaWNoIGEgc2VydmljZSBwcmluY2lwYWwgaXMgcmVxdWVzdGVkIChlLmc6IGBzMy5hbWF6b25hd3MuY29tYCkuXG4gICAqIEBwYXJhbSBvcHRzICAgIG9wdGlvbnMgZm9yIGFkZGluZyB0aGUgc2VydmljZSBwcmluY2lwYWwgKHN1Y2ggYXMgc3BlY2lmeWluZyBhIHByaW5jaXBhbCBpbiBhIGRpZmZlcmVudCByZWdpb24pXG4gICAqL1xuICBwdWJsaWMgYWRkU2VydmljZVByaW5jaXBhbChzZXJ2aWNlOiBzdHJpbmcsIG9wdHM/OiBTZXJ2aWNlUHJpbmNpcGFsT3B0cykge1xuICAgIHRoaXMuYWRkUHJpbmNpcGFscyhuZXcgU2VydmljZVByaW5jaXBhbChzZXJ2aWNlLCBvcHRzKSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGZlZGVyYXRlZCBpZGVudGl0eSBwcm92aWRlciBzdWNoIGFzIEFtYXpvbiBDb2duaXRvIHRvIHRoaXMgcG9saWN5IHN0YXRlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGZlZGVyYXRlZCBmZWRlcmF0ZWQgaWRlbnRpdHkgcHJvdmlkZXIgKGkuZS4gJ2NvZ25pdG8taWRlbnRpdHkuYW1hem9uYXdzLmNvbScpXG4gICAqIEBwYXJhbSBjb25kaXRpb25zIFRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZSBwb2xpY3kgaXMgaW4gZWZmZWN0LlxuICAgKiAgIFNlZSBbdGhlIElBTSBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbi5odG1sKS5cbiAgICovXG4gIHB1YmxpYyBhZGRGZWRlcmF0ZWRQcmluY2lwYWwoZmVkZXJhdGVkOiBhbnksIGNvbmRpdGlvbnM6IENvbmRpdGlvbnMpIHtcbiAgICB0aGlzLmFkZFByaW5jaXBhbHMobmV3IEZlZGVyYXRlZFByaW5jaXBhbChmZWRlcmF0ZWQsIGNvbmRpdGlvbnMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIEFXUyBhY2NvdW50IHJvb3QgdXNlciBwcmluY2lwYWwgdG8gdGhpcyBwb2xpY3kgc3RhdGVtZW50XG4gICAqL1xuICBwdWJsaWMgYWRkQWNjb3VudFJvb3RQcmluY2lwYWwoKSB7XG4gICAgdGhpcy5hZGRQcmluY2lwYWxzKG5ldyBBY2NvdW50Um9vdFByaW5jaXBhbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2Fub25pY2FsIHVzZXIgSUQgcHJpbmNpcGFsIHRvIHRoaXMgcG9saWN5IGRvY3VtZW50XG4gICAqXG4gICAqIEBwYXJhbSBjYW5vbmljYWxVc2VySWQgdW5pcXVlIGlkZW50aWZpZXIgYXNzaWduZWQgYnkgQVdTIGZvciBldmVyeSBhY2NvdW50XG4gICAqL1xuICBwdWJsaWMgYWRkQ2Fub25pY2FsVXNlclByaW5jaXBhbChjYW5vbmljYWxVc2VySWQ6IHN0cmluZykge1xuICAgIHRoaXMuYWRkUHJpbmNpcGFscyhuZXcgQ2Fub25pY2FsVXNlclByaW5jaXBhbChjYW5vbmljYWxVc2VySWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFsbCBpZGVudGl0aWVzIGluIGFsbCBhY2NvdW50cyAoXCIqXCIpIHRvIHRoaXMgcG9saWN5IHN0YXRlbWVudFxuICAgKi9cbiAgcHVibGljIGFkZEFueVByaW5jaXBhbCgpIHtcbiAgICB0aGlzLmFkZFByaW5jaXBhbHMobmV3IEFueVByaW5jaXBhbCgpKTtcbiAgfVxuXG4gIC8vXG4gIC8vIFJlc291cmNlc1xuICAvL1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHJlc291cmNlcyB0aGF0IHRoaXMgcG9saWN5IHN0YXRlbWVudCBhcHBsaWVzIGludG8gdGhlIFwiUmVzb3VyY2VcIiBzZWN0aW9uIG9mXG4gICAqIHRoaXMgcG9saWN5IHN0YXRlbWVudC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX3Jlc291cmNlLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGFybnMgQW1hem9uIFJlc291cmNlIE5hbWVzIChBUk5zKSBvZiB0aGUgcmVzb3VyY2VzIHRoYXQgdGhpcyBwb2xpY3kgc3RhdGVtZW50IGFwcGxpZXMgdG9cbiAgICovXG4gIHB1YmxpYyBhZGRSZXNvdXJjZXMoLi4uYXJuczogc3RyaW5nW10pIHtcbiAgICB0aGlzLmFzc2VydE5vdEZyb3plbihcImFkZFJlc291cmNlc1wiKTtcbiAgICBpZiAoYXJucy5sZW5ndGggPiAwICYmIHRoaXMuX25vdFJlc291cmNlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgYWRkICdSZXNvdXJjZXMnIHRvIHBvbGljeSBzdGF0ZW1lbnQgaWYgJ05vdFJlc291cmNlcycgaGF2ZSBiZWVuIGFkZGVkXCIsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9yZXNvdXJjZS5wdXNoKC4uLmFybnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgcmVzb3VyY2VzIHRoYXQgdGhpcyBwb2xpY3kgc3RhdGVtZW50IHdpbGwgbm90IGFwcGx5IHRvIGluIHRoZSBcIk5vdFJlc291cmNlXCIgc2VjdGlvblxuICAgKiBvZiB0aGlzIHBvbGljeSBzdGF0ZW1lbnQuIEFsbCByZXNvdXJjZXMgZXhjZXB0IHRoZSBzcGVjaWZpZWQgbGlzdCB3aWxsIGJlIG1hdGNoZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19ub3RyZXNvdXJjZS5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBhcm5zIEFtYXpvbiBSZXNvdXJjZSBOYW1lcyAoQVJOcykgb2YgdGhlIHJlc291cmNlcyB0aGF0IHRoaXMgcG9saWN5IHN0YXRlbWVudCBkb2VzIG5vdCBhcHBseSB0b1xuICAgKi9cbiAgcHVibGljIGFkZE5vdFJlc291cmNlcyguLi5hcm5zOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuYXNzZXJ0Tm90RnJvemVuKFwiYWRkTm90UmVzb3VyY2VzXCIpO1xuICAgIGlmIChhcm5zLmxlbmd0aCA+IDAgJiYgdGhpcy5fcmVzb3VyY2UubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkNhbm5vdCBhZGQgJ05vdFJlc291cmNlcycgdG8gcG9saWN5IHN0YXRlbWVudCBpZiAnUmVzb3VyY2VzJyBoYXZlIGJlZW4gYWRkZWRcIixcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuX25vdFJlc291cmNlLnB1c2goLi4uYXJucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGBgXCIqXCJgYCByZXNvdXJjZSB0byB0aGlzIHN0YXRlbWVudC5cbiAgICovXG4gIHB1YmxpYyBhZGRBbGxSZXNvdXJjZXMoKSB7XG4gICAgdGhpcy5hZGRSZXNvdXJjZXMoXCIqXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGlzIHBlcm1pc3Npb24gaGFzIGF0IGxlYXN0IG9uZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggaXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc1Jlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZSAmJiB0aGlzLl9yZXNvdXJjZS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLy9cbiAgLy8gQ29uZGl0aW9uXG4gIC8vXG5cbiAgLyoqXG4gICAqIEFkZCBhIGNvbmRpdGlvbiB0byB0aGUgUG9saWN5XG4gICAqXG4gICAqIElmIG11bHRpcGxlIGNhbGxzIGFyZSBtYWRlIHRvIGFkZCBhIGNvbmRpdGlvbiB3aXRoIHRoZSBzYW1lIHRlc3QgYW5kIHZhcmlhYmxlLCBvbmx5XG4gICAqIHRoZSBsYXN0IG9uZSB3aW5zLiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogZGVjbGFyZSBjb25zdCBzdG10OiBpYW0uUG9saWN5U3RhdGVtZW50O1xuICAgKlxuICAgKiBzdG10LmFkZENvbmRpdGlvbih7IHRlc3Q6ICdTdHJpbmdFcXVhbHMnLCB2YXJpYWJsZTogJ2F3czpTb21lRmllbGQnLCB2YWx1ZXM6IFsnMSddIH0pO1xuICAgKiBzdG10LmFkZENvbmRpdGlvbih7IHRlc3Q6ICdTdHJpbmdFcXVhbHMnLCB2YXJpYWJsZTogJ2F3czpTb21lRmllbGQnLCB2YWx1ZXM6IFsnMiddIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogV2lsbCBlbmQgdXAgd2l0aCB0aGUgc2luZ2xlIGNvbmRpdGlvblxuICAgKlxuICAgKiBgYGB0c1xuICAgKiB7XG4gICAqICAgdGVzdDogJ1N0cmluZ0VxdWFscycsXG4gICAqICAgdmFyaWFibGU6ICdhd3M6U29tZUZpZWxkJyxcbiAgICogICB2YWx1ZXM6IFsnMiddLFxuICAgKiB9XG4gICAqIGBgYC5cbiAgICpcbiAgICogSWYgeW91IG1lYW50IHRvIGFkZCBhIGNvbmRpdGlvbiB0byBzYXkgdGhhdCB0aGUgZmllbGQgY2FuIGJlICplaXRoZXIqIGAxYCBvciBgMmAsIHdyaXRlXG4gICAqIHRoaXM6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGRlY2xhcmUgY29uc3Qgc3RtdDogaWFtLlBvbGljeVN0YXRlbWVudDtcbiAgICpcbiAgICogc3RtdC5hZGRDb25kaXRpb24oeyB0ZXN0OiAnU3RyaW5nRXF1YWxzJywgdmFyaWFibGU6ICdhd3M6U29tZUZpZWxkJywgdmFsdWVzOiBbJzEnLCAnMiddIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhZGRDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb24pIHtcbiAgICB0aGlzLmFzc2VydE5vdEZyb3plbihcImFkZENvbmRpdGlvblwiKTtcblxuICAgIGlmICghdGhpcy5fY29uZGl0aW9uTWFwW2NvbmRpdGlvbi50ZXN0XSkge1xuICAgICAgdGhpcy5fY29uZGl0aW9uTWFwW2NvbmRpdGlvbi50ZXN0XSA9IHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nQ29uZGl0aW9uID1cbiAgICAgIHRoaXMuX2NvbmRpdGlvbk1hcFtjb25kaXRpb24udGVzdF1bY29uZGl0aW9uLnZhcmlhYmxlXTtcbiAgICBpZiAoZXhpc3RpbmdDb25kaXRpb24pIHtcbiAgICAgIHRoaXMuX2NvbmRpdGlvbk1hcFtjb25kaXRpb24udGVzdF1bY29uZGl0aW9uLnZhcmlhYmxlXSA9IHtcbiAgICAgICAgLi4uZXhpc3RpbmdDb25kaXRpb24sXG4gICAgICAgIC4uLmNvbmRpdGlvbixcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NvbmRpdGlvbk1hcFtjb25kaXRpb24udGVzdF1bY29uZGl0aW9uLnZhcmlhYmxlXSA9IGNvbmRpdGlvbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY29uZGl0aW9uIHRvIHRoZSBQb2xpY3lcbiAgICpcbiAgICogSWYgbXVsdGlwbGUgY2FsbHMgYXJlIG1hZGUgdG8gYWRkIGEgY29uZGl0aW9uIHdpdGggdGhlIHNhbWUgb3BlcmF0b3IgYW5kIGZpZWxkLCBvbmx5XG4gICAqIHRoZSBsYXN0IG9uZSB3aW5zLiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogZGVjbGFyZSBjb25zdCBzdG10OiBpYW0uUG9saWN5U3RhdGVtZW50O1xuICAgKlxuICAgKiBzdG10LmFkZENvbmRpdGlvbignU3RyaW5nRXF1YWxzJywgeyAnYXdzOlNvbWVGaWVsZCc6ICcxJyB9KTtcbiAgICogc3RtdC5hZGRDb25kaXRpb24oJ1N0cmluZ0VxdWFscycsIHsgJ2F3czpTb21lRmllbGQnOiAnMicgfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBXaWxsIGVuZCB1cCB3aXRoIHRoZSBzaW5nbGUgY29uZGl0aW9uIGBTdHJpbmdFcXVhbHM6IHsgJ2F3czpTb21lRmllbGQnOiAnMicgfWAuXG4gICAqXG4gICAqIElmIHlvdSBtZWFudCB0byBhZGQgYSBjb25kaXRpb24gdG8gc2F5IHRoYXQgdGhlIGZpZWxkIGNhbiBiZSAqZWl0aGVyKiBgMWAgb3IgYDJgLCB3cml0ZVxuICAgKiB0aGlzOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBkZWNsYXJlIGNvbnN0IHN0bXQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQ7XG4gICAqXG4gICAqIHN0bXQuYWRkQ29uZGl0aW9uKCdTdHJpbmdFcXVhbHMnLCB7ICdhd3M6U29tZUZpZWxkJzogWycxJywgJzInXSB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuYXNzZXJ0Tm90RnJvemVuKFwiYWRkQ29uZGl0aW9uXCIpO1xuICAgIHZhbGlkYXRlQ29uZGl0aW9uT2JqZWN0KHZhbHVlKTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIGlmICghaXNTdHJpbmdPckFycmF5T2ZTdHJpbmdzKHYpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmllbGRzIG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MuIEdvdCAke3Z9IGZvciBrZXkgJHtrfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmFkZENvbmRpdGlvbih7XG4gICAgICAgIHRlc3Q6IGtleSxcbiAgICAgICAgdmFyaWFibGU6IGssXG4gICAgICAgIHZhbHVlczogQXJyYXkuaXNBcnJheSh2KSA/IHYgOiBbdl0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIG11bHRpcGxlIGNvbmRpdGlvbnMgdG8gdGhlIFBvbGljeVxuICAgKlxuICAgKiBTZWUgdGhlIGBhZGRDb25kaXRpb25gIGZ1bmN0aW9uIGZvciBhIGNhdmVhdCBvbiBjYWxsaW5nIHRoaXMgbWV0aG9kIG11bHRpcGxlIHRpbWVzLlxuICAgKi9cbiAgcHVibGljIGFkZENvbmRpdGlvbnMoLi4uY29uZGl0aW9uczogQ29uZGl0aW9uW10pIHtcbiAgICBjb25kaXRpb25zLm1hcCgoYykgPT4ge1xuICAgICAgdGhpcy5hZGRDb25kaXRpb24oYyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIG11bHRpcGxlIGNvbmRpdGlvbk9iamVjdHMgdG8gdGhlIFBvbGljeVxuICAgKlxuICAgKiBTZWUgdGhlIGBhZGRDb25kaXRpb25PYmplY3RgIGZ1bmN0aW9uIGZvciBhIGNhdmVhdCBvbiBjYWxsaW5nIHRoaXMgbWV0aG9kIG11bHRpcGxlIHRpbWVzLlxuICAgKi9cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHMoY29uZGl0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb25kaXRpb25zKSkge1xuICAgICAgdGhpcy5hZGRDb25kaXRpb25PYmplY3Qoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGBTdHJpbmdFcXVhbHNgIGNvbmRpdGlvbiB0aGF0IGxpbWl0cyB0byBhIGdpdmVuIGFjY291bnQgZnJvbSBgc3RzOkV4dGVybmFsSWRgLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgb25jZTogc3Vic2VxdWVudCBjYWxscyB3aWxsIG92ZXJ3cml0ZSBlYXJsaWVyIGNhbGxzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9pZF9yb2xlc19jcmVhdGVfZm9yLXVzZXJfZXh0ZXJuYWxpZC5odG1sXG4gICAqL1xuICBwdWJsaWMgYWRkQWNjb3VudENvbmRpdGlvbiguLi5hY2NvdW50SWRzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuYWRkQ29uZGl0aW9uKHtcbiAgICAgIHRlc3Q6IFwiU3RyaW5nRXF1YWxzXCIsXG4gICAgICB2YXJpYWJsZTogXCJzdHM6RXh0ZXJuYWxJZFwiLFxuICAgICAgdmFsdWVzOiBhY2NvdW50SWRzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBgU3RyaW5nRXF1YWxzYCBjb25kaXRpb24gdGhhdCBsaW1pdHMgdG8gYSBnaXZlbiBhY2NvdW50IGZyb20gYGF3czpTb3VyY2VBY2NvdW50YC5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2U6IHN1YnNlcXVlbnQgY2FsbHMgd2lsbCBvdmVyd3JpdGUgZWFybGllciBjYWxscy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtc291cmNlYWNjb3VudFxuICAgKi9cbiAgcHVibGljIGFkZFNvdXJjZUFjY291bnRDb25kaXRpb24oLi4uYWNjb3VudElkczogc3RyaW5nW10pIHtcbiAgICB0aGlzLmFkZENvbmRpdGlvbih7XG4gICAgICB0ZXN0OiBcIlN0cmluZ0VxdWFsc1wiLFxuICAgICAgdmFyaWFibGU6IFwiYXdzOlNvdXJjZUFjY291bnRcIixcbiAgICAgIHZhbHVlczogYWNjb3VudElkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gYEFybkVxdWFsc2AgY29uZGl0aW9uIHRoYXQgbGltaXRzIHRvIGEgZ2l2ZW4gcmVzb3VyY2UgYXJuIGZyb20gYGF3czpTb3VyY2VBcm5gLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgb25jZTogc3Vic2VxdWVudCBjYWxscyB3aWxsIG92ZXJ3cml0ZSBlYXJsaWVyIGNhbGxzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfY29uZGl0aW9uLWtleXMuaHRtbCNjb25kaXRpb24ta2V5cy1zb3VyY2Vhcm5cbiAgICovXG4gIHB1YmxpYyBhZGRTb3VyY2VBcm5Db25kaXRpb24oLi4uYXJuczogc3RyaW5nW10pIHtcbiAgICB0aGlzLmFkZENvbmRpdGlvbih7XG4gICAgICB0ZXN0OiBcIkFybkVxdWFsc1wiLFxuICAgICAgdmFyaWFibGU6IFwiYXdzOlNvdXJjZUFyblwiLFxuICAgICAgdmFsdWVzOiBhcm5zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBgUG9saWN5U3RhdGVtZW50YCB3aXRoIHRoZSBzYW1lIGV4YWN0IHByb3BlcnRpZXNcbiAgICogYXMgdGhpcyBvbmUsIGV4Y2VwdCBmb3IgdGhlIG92ZXJyaWRlc1xuICAgKi9cbiAgcHVibGljIGNvcHkob3ZlcnJpZGVzOiBQb2xpY3lTdGF0ZW1lbnRQcm9wcyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiBvdmVycmlkZXMuc2lkID8/IHRoaXMuc2lkLFxuICAgICAgZWZmZWN0OiBvdmVycmlkZXMuZWZmZWN0ID8/IHRoaXMuZWZmZWN0LFxuICAgICAgYWN0aW9uczogb3ZlcnJpZGVzLmFjdGlvbnMgPz8gdGhpcy5hY3Rpb25zLFxuICAgICAgbm90QWN0aW9uczogb3ZlcnJpZGVzLm5vdEFjdGlvbnMgPz8gdGhpcy5ub3RBY3Rpb25zLFxuXG4gICAgICBwcmluY2lwYWxzOiBvdmVycmlkZXMucHJpbmNpcGFscyA/PyB0aGlzLnByaW5jaXBhbHMsXG4gICAgICBub3RQcmluY2lwYWxzOiBvdmVycmlkZXMubm90UHJpbmNpcGFscyA/PyB0aGlzLm5vdFByaW5jaXBhbHMsXG5cbiAgICAgIHJlc291cmNlczogb3ZlcnJpZGVzLnJlc291cmNlcyA/PyB0aGlzLnJlc291cmNlcyxcbiAgICAgIG5vdFJlc291cmNlczogb3ZlcnJpZGVzLm5vdFJlc291cmNlcyA/PyB0aGlzLm5vdFJlc291cmNlcyxcblxuICAgICAgY29uZGl0aW9uOiBvdmVycmlkZXMuY29uZGl0aW9uID8/IHRoaXMuY29uZGl0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgQVdTIElBTSBQb2xpY3kgc3RhdGVtZW50IEpTT05cbiAgICovXG4gIHB1YmxpYyB0b1N0YXRlbWVudEpzb24oKTogYW55IHtcbiAgICByZXR1cm4gbm9ybWFsaXplU3RhdGVtZW50KHtcbiAgICAgIEFjdGlvbjogdGhpcy5fYWN0aW9uLmRpcmVjdCgpLFxuICAgICAgTm90QWN0aW9uOiB0aGlzLl9ub3RBY3Rpb24uZGlyZWN0KCksXG4gICAgICBDb25kaXRpb246IHRvQ29uZGl0aW9uSnNvbiguLi50b0NvbmRpdGlvbnModGhpcy5fY29uZGl0aW9uTWFwKSksXG4gICAgICBFZmZlY3Q6IHRoaXMuZWZmZWN0LFxuICAgICAgUHJpbmNpcGFsOiB0b1ByaW5jaXBhbEpzb24oLi4udGhpcy5fcHJpbmNpcGFsKSxcbiAgICAgIE5vdFByaW5jaXBhbDogdG9QcmluY2lwYWxKc29uKC4uLnRoaXMuX25vdFByaW5jaXBhbCksXG4gICAgICBSZXNvdXJjZTogdGhpcy5fcmVzb3VyY2UuZGlyZWN0KCksXG4gICAgICBOb3RSZXNvdXJjZTogdGhpcy5fbm90UmVzb3VyY2UuZGlyZWN0KCksXG4gICAgICBTaWQ6IHRoaXMuc2lkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBvbGljeSBzdGF0ZW1lbnRcbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gVG9rZW4uYXNTdHJpbmcodGhpcywge1xuICAgICAgZGlzcGxheUhpbnQ6IFwiUG9saWN5U3RhdGVtZW50XCIsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi1pZnkgdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBVc2VkIHdoZW4gSlNPTi5zdHJpbmdpZnkoKSBpcyBjYWxsZWRcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKTogZGF0YUF3c0lhbVBvbGljeURvY3VtZW50LkRhdGFBd3NJYW1Qb2xpY3lEb2N1bWVudFN0YXRlbWVudCB7XG4gICAgY29uc3QgcHJpbmNpcGFscyA9IHRoaXMucHJpbmNpcGFscy5mbGF0TWFwKFxuICAgICAgKHApID0+IHAucG9saWN5RnJhZ21lbnQucHJpbmNpcGFscyxcbiAgICApO1xuICAgIGNvbnN0IG5vdFByaW5jaXBhbHMgPSB0aGlzLm5vdFByaW5jaXBhbHMuZmxhdE1hcChcbiAgICAgIChwKSA9PiBwLnBvbGljeUZyYWdtZW50LnByaW5jaXBhbHMsXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzaWQ6IHRoaXMuc2lkLFxuICAgICAgYWN0aW9uczogdGhpcy5hY3Rpb25zLmxlbmd0aCA+IDAgPyB0aGlzLmFjdGlvbnMgOiB1bmRlZmluZWQsXG4gICAgICBub3RBY3Rpb25zOiB0aGlzLm5vdEFjdGlvbnMubGVuZ3RoID4gMCA/IHRoaXMubm90QWN0aW9ucyA6IHVuZGVmaW5lZCxcbiAgICAgIHByaW5jaXBhbHM6IHByaW5jaXBhbHMubGVuZ3RoID4gMCA/IHByaW5jaXBhbHMgOiB1bmRlZmluZWQsXG4gICAgICBub3RQcmluY2lwYWxzOiBub3RQcmluY2lwYWxzLmxlbmd0aCA+IDAgPyBub3RQcmluY2lwYWxzIDogdW5kZWZpbmVkLFxuICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlcy5sZW5ndGggPiAwID8gdGhpcy5yZXNvdXJjZXMgOiB1bmRlZmluZWQsXG4gICAgICBub3RSZXNvdXJjZXM6XG4gICAgICAgIHRoaXMubm90UmVzb3VyY2VzLmxlbmd0aCA+IDAgPyB0aGlzLm5vdFJlc291cmNlcyA6IHVuZGVmaW5lZCxcbiAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb25zLmxlbmd0aCA+IDAgPyB0aGlzLmNvbmRpdGlvbnMgOiB1bmRlZmluZWQsXG4gICAgICBlZmZlY3Q6IHRoaXMuZWZmZWN0LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcHJpbmNpcGFsJ3MgY29uZGl0aW9uc1xuICAgKlxuICAgKiBGb3IgY29udmVuaWVuY2UsIHByaW5jaXBhbHMgaGF2ZSBiZWVuIG1vZGVsZWQgYXMgYm90aCBhIHByaW5jaXBhbFxuICAgKiBhbmQgYSBzZXQgb2YgY29uZGl0aW9ucy4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBoYXZlIGEgc2luZ2xlXG4gICAqIG9iamVjdCByZXByZXNlbnQgZS5nLiBhbiBcIlNOUyBUb3BpY1wiIChTTlMgc2VydmljZSBwcmluY2lwYWwgKyBhd3M6U291cmNBcm5cbiAgICogY29uZGl0aW9uKSBvciBhbiBPcmdhbml6YXRpb24gbWVtYmVyICgqICsgYXdzOk9yZ0lkIGNvbmRpdGlvbikuXG4gICAqXG4gICAqIEhvd2V2ZXIsIHdoZW4gdXNpbmcgbXVsdGlwbGUgcHJpbmNpcGFscyBpbiB0aGUgc2FtZSBwb2xpY3kgc3RhdGVtZW50LFxuICAgKiB0aGV5IG11c3QgYWxsIGhhdmUgdGhlIHNhbWUgY29uZGl0aW9ucyBvciB0aGUgT1Igc2FtZW50aWNzXG4gICAqIGltcGxpZWQgYnkgYSBsaXN0IG9mIHByaW5jaXBhbHMgY2Fubm90IGJlIGd1YXJhbnRlZWQgKHVzZXIgbmVlZHMgdG9cbiAgICogYWRkIG11bHRpcGxlIHN0YXRlbWVudHMgaW4gdGhhdCBjYXNlKS5cbiAgICovXG4gIHByaXZhdGUgYWRkUHJpbmNpcGFsQ29uZGl0aW9ucyhcbiAgICAuLi5jb25kaXRpb25zOiBkYXRhQXdzSWFtUG9saWN5RG9jdW1lbnQuRGF0YUF3c0lhbVBvbGljeURvY3VtZW50U3RhdGVtZW50Q29uZGl0aW9uW11cbiAgKSB7XG4gICAgLy8gU3RyaW5naWZ5aW5nIHRoZSBjb25kaXRpb25zIGlzIGFuIGVhc3kgd2F5IHRvIGRvIGRlZXAgZXF1YWxpdHlcbiAgICBjb25zdCB0aGVzZUNvbmRpdGlvbnMgPSBKU09OLnN0cmluZ2lmeShjb25kaXRpb25zKTtcbiAgICBpZiAodGhpcy5wcmluY2lwYWxDb25kaXRpb25zSnNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBGaXJzdCBwcmluY2lwYWwsIGFueXRoaW5nIGdvZXNcbiAgICAgIHRoaXMucHJpbmNpcGFsQ29uZGl0aW9uc0pzb24gPSB0aGVzZUNvbmRpdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnByaW5jaXBhbENvbmRpdGlvbnNKc29uICE9PSB0aGVzZUNvbmRpdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBBbGwgcHJpbmNpcGFscyBpbiBhIFBvbGljeVN0YXRlbWVudCBtdXN0IGhhdmUgdGhlIHNhbWUgQ29uZGl0aW9ucyAoZ290ICcke3RoaXMucHJpbmNpcGFsQ29uZGl0aW9uc0pzb259JyBhbmQgJyR7dGhlc2VDb25kaXRpb25zfScpLiBVc2UgbXVsdGlwbGUgc3RhdGVtZW50cyBpbnN0ZWFkLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWRkQ29uZGl0aW9ucyguLi5jb25kaXRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGF0IHRoZSBwb2xpY3kgc3RhdGVtZW50IHNhdGlzZmllcyBiYXNlIHJlcXVpcmVtZW50cyBmb3IgYSBwb2xpY3kuXG4gICAqXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIHRoZSBzdGF0ZW1lbnQgaXMgdmFsaWQuXG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGVGb3JBbnlQb2xpY3koKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGVycm9ycyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgaWYgKHRoaXMuX2FjdGlvbi5sZW5ndGggPT09IDAgJiYgdGhpcy5fbm90QWN0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIFwiQSBQb2xpY3lTdGF0ZW1lbnQgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSAnYWN0aW9uJyBvciAnbm90QWN0aW9uJy5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCB0aGUgcG9saWN5IHN0YXRlbWVudCBzYXRpc2ZpZXMgYWxsIHJlcXVpcmVtZW50cyBmb3IgYSByZXNvdXJjZS1iYXNlZCBwb2xpY3kuXG4gICAqXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIHRoZSBzdGF0ZW1lbnQgaXMgdmFsaWQuXG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGVGb3JSZXNvdXJjZVBvbGljeSgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXJyb3JzID0gdGhpcy52YWxpZGF0ZUZvckFueVBvbGljeSgpO1xuICAgIGlmICh0aGlzLl9wcmluY2lwYWxzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLl9ub3RQcmluY2lwYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIFwiQSBQb2xpY3lTdGF0ZW1lbnQgdXNlZCBpbiBhIHJlc291cmNlLWJhc2VkIHBvbGljeSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIElBTSBwcmluY2lwYWwuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoYXQgdGhlIHBvbGljeSBzdGF0ZW1lbnQgc2F0aXNmaWVzIGFsbCByZXF1aXJlbWVudHMgZm9yIGFuIGlkZW50aXR5LWJhc2VkIHBvbGljeS5cbiAgICpcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcywgb3IgYW4gZW1wdHkgYXJyYXkgaWYgdGhlIHN0YXRlbWVudCBpcyB2YWxpZC5cbiAgICovXG4gIHB1YmxpYyB2YWxpZGF0ZUZvcklkZW50aXR5UG9saWN5KCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBlcnJvcnMgPSB0aGlzLnZhbGlkYXRlRm9yQW55UG9saWN5KCk7XG4gICAgaWYgKHRoaXMuX3ByaW5jaXBhbHMubGVuZ3RoID4gMCB8fCB0aGlzLl9ub3RQcmluY2lwYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICBcIkEgUG9saWN5U3RhdGVtZW50IHVzZWQgaW4gYW4gaWRlbnRpdHktYmFzZWQgcG9saWN5IGNhbm5vdCBzcGVjaWZ5IGFueSBJQU0gcHJpbmNpcGFscy5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZXNvdXJjZS5sZW5ndGggPT09IDAgJiYgdGhpcy5fbm90UmVzb3VyY2UubGVuZ3RoID09PSAwKSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgXCJBIFBvbGljeVN0YXRlbWVudCB1c2VkIGluIGFuIGlkZW50aXR5LWJhc2VkIHBvbGljeSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIHJlc291cmNlLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGVycm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgQWN0aW9ucyBhZGRlZCB0byB0aGlzIHN0YXRlbWVudFxuICAgKi9cbiAgcHVibGljIGdldCBhY3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3Rpb24uY29weSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBOb3RBY3Rpb25zIGFkZGVkIHRvIHRoaXMgc3RhdGVtZW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IG5vdEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25vdEFjdGlvbi5jb3B5KCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIFByaW5jaXBhbHMgYWRkZWQgdG8gdGhpcyBzdGF0ZW1lbnRcbiAgICovXG4gIHB1YmxpYyBnZXQgcHJpbmNpcGFscygpOiBJUHJpbmNpcGFsW10ge1xuICAgIHJldHVybiB0aGlzLl9wcmluY2lwYWxzLmNvcHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgTm90UHJpbmNpcGFscyBhZGRlZCB0byB0aGlzIHN0YXRlbWVudFxuICAgKi9cbiAgcHVibGljIGdldCBub3RQcmluY2lwYWxzKCk6IElQcmluY2lwYWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuX25vdFByaW5jaXBhbHMuY29weSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBSZXNvdXJjZXMgYWRkZWQgdG8gdGhpcyBzdGF0ZW1lbnRcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVzb3VyY2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZS5jb3B5KCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIE5vdFJlc291cmNlcyBhZGRlZCB0byB0aGlzIHN0YXRlbWVudFxuICAgKi9cbiAgcHVibGljIGdldCBub3RSZXNvdXJjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25vdFJlc291cmNlLmNvcHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29uZGl0aW9ucyBhZGRlZCB0byB0aGlzIHN0YXRlbWVudFxuICAgKi9cbiAgcHVibGljIGdldCBjb25kaXRpb25zKCk6IENvbmRpdGlvbnMge1xuICAgIHJldHVybiB0b0NvbmRpdGlvbnModGhpcy5fY29uZGl0aW9uTWFwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIHRoZSBQb2xpY3lTdGF0ZW1lbnQgaW1tdXRhYmxlXG4gICAqXG4gICAqIEFmdGVyIGNhbGxpbmcgdGhpcywgYW55IG9mIHRoZSBgYWRkWHh4KClgIG1ldGhvZHMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uXG4gICAqXG4gICAqIExpYnJhcmllcyB0aGF0IGxhemlseSBnZW5lcmF0ZSBzdGF0ZW1lbnQgYm9kaWVzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0b1xuICAgKiBmaWxsIHRoZSBhY3R1YWwgUG9saWN5U3RhdGVtZW50IGZpZWxkcy4gQmUgYXdhcmUgdGhhdCB0aGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkXG4gICAqIG11bHRpcGxlIHRpbWVzLlxuICAgKi9cbiAgcHVibGljIGZyZWV6ZSgpOiBQb2xpY3lTdGF0ZW1lbnQge1xuICAgIHRoaXMuX2Zyb3plbiA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgUG9saWN5U3RhdGVtZW50IGhhcyBiZWVuIGZyb3plblxuICAgKlxuICAgKiBUaGUgc3RhdGVtZW50IG9iamVjdCBpcyBmcm96ZW4gd2hlbiBgZnJlZXplKClgIGlzIGNhbGxlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgZnJvemVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9mcm96ZW47XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGUgdGhlIHNpemUgb2YgdGhpcyBwb2xpY3kgc3RhdGVtZW50XG4gICAqXG4gICAqIEJ5IG5lY2Vzc2l0eSwgdGhpcyB3aWxsIG5vdCBiZSBhY2N1cmF0ZS4gV2UnbGwgZG8gb3VyIGJlc3QgdG8gb3ZlcmVzdGltYXRlXG4gICAqIHNvIHdlIHdvbid0IGhhdmUgbmFzdHkgc3VycHJpc2VzLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfZXN0aW1hdGVTaXplKG9wdGlvbnM6IEVzdGltYXRlU2l6ZU9wdGlvbnMpOiBudW1iZXIge1xuICAgIGxldCByZXQgPSAwO1xuXG4gICAgY29uc3QgeyBhY3Rpb25Fc3RpbWF0ZSwgYXJuRXN0aW1hdGUgfSA9IG9wdGlvbnM7XG5cbiAgICByZXQgKz0gYFwiRWZmZWN0XCI6IFwiJHt0aGlzLmVmZmVjdH1cIixgLmxlbmd0aDtcblxuICAgIGNvdW50KFwiQWN0aW9uXCIsIHRoaXMuYWN0aW9ucywgYWN0aW9uRXN0aW1hdGUpO1xuICAgIGNvdW50KFwiTm90QWN0aW9uXCIsIHRoaXMubm90QWN0aW9ucywgYWN0aW9uRXN0aW1hdGUpO1xuICAgIGNvdW50KFwiUmVzb3VyY2VcIiwgdGhpcy5yZXNvdXJjZXMsIGFybkVzdGltYXRlKTtcbiAgICBjb3VudChcIk5vdFJlc291cmNlXCIsIHRoaXMubm90UmVzb3VyY2VzLCBhcm5Fc3RpbWF0ZSk7XG5cbiAgICByZXQgKz0gdGhpcy5wcmluY2lwYWxzLmxlbmd0aCAqIGFybkVzdGltYXRlO1xuICAgIHJldCArPSB0aGlzLm5vdFByaW5jaXBhbHMubGVuZ3RoICogYXJuRXN0aW1hdGU7XG5cbiAgICByZXQgKz0gSlNPTi5zdHJpbmdpZnkodG9Db25kaXRpb25Kc29uKC4uLnRoaXMuY29uZGl0aW9ucykpLmxlbmd0aDtcbiAgICByZXR1cm4gcmV0O1xuXG4gICAgZnVuY3Rpb24gY291bnQoa2V5OiBzdHJpbmcsIHZhbHVlczogc3RyaW5nW10sIHRva2VuU2l6ZTogbnVtYmVyKSB7XG4gICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0ICs9XG4gICAgICAgICAga2V5Lmxlbmd0aCArXG4gICAgICAgICAgNSAvKiBxdW90ZXMsIGNvbG9uLCBicmFja2V0cyAqLyArXG4gICAgICAgICAgc3VtKFxuICAgICAgICAgICAgdmFsdWVzLm1hcChcbiAgICAgICAgICAgICAgKHYpID0+XG4gICAgICAgICAgICAgICAgKFRva2VuLmlzVW5yZXNvbHZlZCh2KSA/IHRva2VuU2l6ZSA6IHYubGVuZ3RoKSArXG4gICAgICAgICAgICAgICAgMyAvKiBxdW90ZXMsIHNlcGFyYXRvciAqLyxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4gdGhlIG9iamVjdCBpcyBmcm96ZW5cbiAgICovXG4gIHByaXZhdGUgYXNzZXJ0Tm90RnJvemVuKG1ldGhvZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX2Zyb3plbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHttZXRob2R9OiBmcmVlemUoKSBoYXMgYmVlbiBjYWxsZWQgb24gdGhpcyBQb2xpY3lTdGF0ZW1lbnQgcHJldmlvdXNseSwgc28gaXQgY2FuIG5vIGxvbmdlciBiZSBtb2RpZmllZGAsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoZSBFZmZlY3QgZWxlbWVudCBvZiBhbiBJQU0gcG9saWN5XG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2VmZmVjdC5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIEVmZmVjdCB7XG4gIC8qKlxuICAgKiBBbGxvd3MgYWNjZXNzIHRvIGEgcmVzb3VyY2UgaW4gYW4gSUFNIHBvbGljeSBzdGF0ZW1lbnQuIEJ5IGRlZmF1bHQsIGFjY2VzcyB0byByZXNvdXJjZXMgYXJlIGRlbmllZC5cbiAgICovXG4gIEFMTE9XID0gXCJBbGxvd1wiLFxuXG4gIC8qKlxuICAgKiBFeHBsaWNpdGx5IGRlbnkgYWNjZXNzIHRvIGEgcmVzb3VyY2UuIEJ5IGRlZmF1bHQsIGFsbCByZXF1ZXN0cyBhcmUgZGVuaWVkIGltcGxpY2l0bHkuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19ldmFsdWF0aW9uLWxvZ2ljLmh0bWxcbiAgICovXG4gIERFTlkgPSBcIkRlbnlcIixcbn1cblxuLyoqXG4gKiBDb25kaXRpb24gZm9yIHdoZW4gYW4gSUFNIHBvbGljeSBpcyBpbiBlZmZlY3QuIE1hcHMgZnJvbSB0aGUga2V5cyBpbiBhIHJlcXVlc3QncyBjb250ZXh0IHRvXG4gKiBhIHN0cmluZyB2YWx1ZSBvciBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBTZWUgdGhlIENvbmRpdGlvbnMgaW50ZXJmYWNlIGZvciBtb3JlIGRldGFpbHMuXG4gKi9cbmV4cG9ydCB0eXBlIENvbmRpdGlvbiA9XG4gIGRhdGFBd3NJYW1Qb2xpY3lEb2N1bWVudC5EYXRhQXdzSWFtUG9saWN5RG9jdW1lbnRTdGF0ZW1lbnRDb25kaXRpb247XG5cbi8qKlxuICogQ29uZGl0aW9ucyBmb3Igd2hlbiBhbiBJQU0gUG9saWN5IGlzIGluIGVmZmVjdCwgc3BlY2lmaWVkIGluIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOlxuICpcbiAqIGB7IFwiT3BlcmF0b3JcIjogeyBcImtleUluUmVxdWVzdENvbnRleHRcIjogXCJ2YWx1ZVwiIH0gfWBcbiAqXG4gKiBUaGUgdmFsdWUgY2FuIGJlIGVpdGhlciBhIHNpbmdsZSBzdHJpbmcgdmFsdWUgb3IgYW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcy5cbiAqXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIHdoaWNoIG9wZXJhdG9ycyBhcmUgc3VwcG9ydGVkLCBzZWUgW3RoZSBJQU1cbiAqIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uLmh0bWwpLlxuICovXG5leHBvcnQgdHlwZSBDb25kaXRpb25zID0gQXJyYXk8Q29uZGl0aW9uPjtcbi8vIFRPRE86IFN1cHBvcnQgSVJlc29sdmFibGUgQ29uZGl0aW9uP1xuXG5jbGFzcyBKc29uUHJpbmNpcGFsIGV4dGVuZHMgUHJpbmNpcGFsQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBwb2xpY3lGcmFnbWVudDogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQ7XG4gIHB1YmxpYyByZWFkb25seSBwcmluY2lwYWxzOiBQcmluY2lwYWxQcm9wc1tdID0gW107XG5cbiAgY29uc3RydWN0b3IoanNvbjogYW55ID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucG9saWN5RnJhZ21lbnQgPSBQcmluY2lwYWxQb2xpY3lGcmFnbWVudC5mcm9tSnNvbihqc29uKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWR1cGVTdHJpbmcoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5wb2xpY3lGcmFnbWVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBfZXN0aW1hdGVTaXplXG4gKlxuICogVGhlc2UgY2FuIG9wdGlvbmFsbHkgY29tZSBmcm9tIGNvbnRleHQsIGJ1dCBpdCdzIHRvbyBleHBlbnNpdmUgdG8gbG9va1xuICogdGhlbSB1cCBldmVyeSB0aW1lIHNvIHdlIGJ1bmRsZSB0aGVtIGludG8gYSBzdHJ1Y3QgZmlyc3QuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXN0aW1hdGVTaXplT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBFc3RpbWF0ZWQgc2l6ZSBvZiBhbiB1bnJlc29sdmVkIEFSTlxuICAgKi9cbiAgcmVhZG9ubHkgYXJuRXN0aW1hdGU6IG51bWJlcjtcblxuICAvKipcbiAgICogRXN0aW1hdGVkIHNpemUgb2YgYW4gdW5yZXNvbHZlZCBhY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbkVzdGltYXRlOiBudW1iZXI7XG59XG5cbi8qKlxuICogRGVyaXZlIHRoZSBzaXplIGVzdGltYXRpb24gb3B0aW9ucyBmcm9tIGNvbnRleHRcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcml2ZUVzdGltYXRlU2l6ZU9wdGlvbnMoXG4gIF9zY29wZTogSUNvbnN0cnVjdCxcbik6IEVzdGltYXRlU2l6ZU9wdGlvbnMge1xuICBjb25zdCBhY3Rpb25Fc3RpbWF0ZSA9IDIwO1xuICBjb25zdCBhcm5Fc3RpbWF0ZSA9IERFRkFVTFRfQVJOX1NJWkVfRVNUSU1BVEU7XG4gIHJldHVybiB7IGFjdGlvbkVzdGltYXRlLCBhcm5Fc3RpbWF0ZSB9O1xufVxuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBiZWhhdmVzIGJvdGggYXMgYSBzZXQgYW5kIGFuIGFycmF5XG4gKlxuICogVXNlZCBmb3IgdGhlIGVsZW1lbnRzIG9mIGEgUG9saWN5U3RhdGVtZW50LiBJbiBwcmFjdGljZSB0aGV5IGJlaGF2ZSBhcyBzZXRzLFxuICogYnV0IHdlIGhhdmUgdGhvdXNhbmRzIG9mIHNuYXBzaG90IHRlc3RzIGluIGV4aXN0ZW5jZSB0aGF0IHdpbGwgcmVseSBvbiBhXG4gKiBwYXJ0aWN1bGFyIG9yZGVyIHNvIHdlIGNhbid0IGp1c3QgY2hhbmdlIHRoZSB0eXBlIHRvIGBTZXQ8PmAgd2hvbGVzYWxlIHdpdGhvdXRcbiAqIGNhdXNpbmcgYSBsb3Qgb2YgY2h1cm4uXG4gKi9cbmNsYXNzIE9yZGVyZWRTZXQ8QT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IHNldCA9IG5ldyBTZXQ8QT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhcnJheSA9IG5ldyBBcnJheTxBPigpO1xuXG4gIC8qKlxuICAgKiBBZGQgbmV3IGVsZW1lbnRzIHRvIHRoZSBzZXRcbiAgICpcbiAgICogQHBhcmFtIHhzIHRoZSBlbGVtZW50cyB0byBiZSBhZGRlZFxuICAgKlxuICAgKiBAcmV0dXJucyB0aGUgZWxlbWVudHMgYWN0dWFsbHkgYWRkZWRcbiAgICovXG4gIHB1YmxpYyBwdXNoKC4uLnhzOiByZWFkb25seSBBW10pOiBBW10ge1xuICAgIGNvbnN0IHJldCA9IG5ldyBBcnJheTxBPigpO1xuICAgIGZvciAoY29uc3QgeCBvZiB4cykge1xuICAgICAgaWYgKHRoaXMuc2V0Lmhhcyh4KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0LmFkZCh4KTtcbiAgICAgIHRoaXMuYXJyYXkucHVzaCh4KTtcbiAgICAgIHJldC5wdXNoKHgpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHVibGljIGdldCBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIGNvcHkoKTogQVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuYXJyYXldO1xuICB9XG5cbiAgLyoqXG4gICAqIERpcmVjdCAocmVhZC1vbmx5KSBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgYXJyYXlcbiAgICpcbiAgICogKFNhdmVzIGEgY29weSlcbiAgICovXG4gIHB1YmxpYyBkaXJlY3QoKTogcmVhZG9ubHkgQVtdIHtcbiAgICByZXR1cm4gdGhpcy5hcnJheTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdW0oeHM6IG51bWJlcltdKSB7XG4gIHJldHVybiB4cy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbn1cblxuLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNjAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtaWFtL2xpYi9wcml2YXRlXG5cbi8vIEFuIElBTSB2YWx1ZSBpcyBhIHN0cmluZyBvciBhbiBpbnRyaW5zaWMgdmFsdWVcbmV4cG9ydCB0eXBlIElhbVZhbHVlID1cbiAgfCBzdHJpbmdcbiAgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIHwgQXJyYXk8c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55Pj47XG5cbmludGVyZmFjZSBTdGF0ZW1lbnRTY2hlbWEge1xuICByZWFkb25seSBTaWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IEVmZmVjdD86IHN0cmluZztcbiAgcmVhZG9ubHkgUHJpbmNpcGFsPzogc3RyaW5nIHwgc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBJYW1WYWx1ZT47XG4gIHJlYWRvbmx5IE5vdFByaW5jaXBhbD86IHN0cmluZyB8IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgSWFtVmFsdWU+O1xuICByZWFkb25seSBSZXNvdXJjZT86IElhbVZhbHVlO1xuICByZWFkb25seSBOb3RSZXNvdXJjZT86IElhbVZhbHVlO1xuICByZWFkb25seSBBY3Rpb24/OiBJYW1WYWx1ZTtcbiAgcmVhZG9ubHkgTm90QWN0aW9uPzogSWFtVmFsdWU7XG4gIHJlYWRvbmx5IENvbmRpdGlvbj86IHVua25vd247XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0YXRlbWVudChzOiBTdGF0ZW1lbnRTY2hlbWEpIHtcbiAgcmV0dXJuIG5vVW5kZWYoe1xuICAgIEFjdGlvbjogX25vcm0ocy5BY3Rpb24sIHsgdW5pcXVlOiB0cnVlIH0pLFxuICAgIE5vdEFjdGlvbjogX25vcm0ocy5Ob3RBY3Rpb24sIHsgdW5pcXVlOiB0cnVlIH0pLFxuICAgIENvbmRpdGlvbjogX25vcm0ocy5Db25kaXRpb24pLFxuICAgIEVmZmVjdDogX25vcm0ocy5FZmZlY3QpLFxuICAgIFByaW5jaXBhbDogX25vcm1QcmluY2lwYWwocy5QcmluY2lwYWwpLFxuICAgIE5vdFByaW5jaXBhbDogX25vcm1QcmluY2lwYWwocy5Ob3RQcmluY2lwYWwpLFxuICAgIFJlc291cmNlOiBfbm9ybShzLlJlc291cmNlLCB7IHVuaXF1ZTogdHJ1ZSB9KSxcbiAgICBOb3RSZXNvdXJjZTogX25vcm0ocy5Ob3RSZXNvdXJjZSwgeyB1bmlxdWU6IHRydWUgfSksXG4gICAgU2lkOiBfbm9ybShzLlNpZCksXG4gIH0pO1xuXG4gIGZ1bmN0aW9uIF9ub3JtKFxuICAgIHZhbHVlczogYW55LFxuICAgIHsgdW5pcXVlID0gZmFsc2UgfTogeyB1bmlxdWU6IGJvb2xlYW4gfSA9IHsgdW5pcXVlOiBmYWxzZSB9LFxuICApIHtcbiAgICBpZiAodmFsdWVzID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZCh2YWx1ZXMpKSB7XG4gICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgIGlmICghdmFsdWVzIHx8IHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlc1swXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVuaXF1ZSA/IEFycmF5LmZyb20obmV3IFNldCh2YWx1ZXMpKSA6IHZhbHVlcztcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzICYmIHR5cGVvZiB2YWx1ZXMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh2YWx1ZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBmdW5jdGlvbiBfbm9ybVByaW5jaXBhbChcbiAgICBwcmluY2lwYWw/OiBzdHJpbmcgfCBzdHJpbmdbXSB8IHsgW2tleTogc3RyaW5nXTogYW55IH0sXG4gICkge1xuICAgIGlmICghcHJpbmNpcGFsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHByaW5jaXBhbCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHByaW5jaXBhbDtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJpbmNpcGFsKSB8fCB0eXBlb2YgcHJpbmNpcGFsICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJpbmNpcGFsKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBub3JtVmFsID0gX25vcm0ocHJpbmNpcGFsW2tleV0pO1xuICAgICAgaWYgKG5vcm1WYWwpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBub3JtVmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vVW5kZWYoeDogYW55KTogYW55IHtcbiAgY29uc3QgcmV0OiBhbnkgPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoeCkpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZW5zdXJlQXJyYXlPclVuZGVmaW5lZChmaWVsZDogYW55KSB7XG4gIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAodHlwZW9mIGZpZWxkICE9PSBcInN0cmluZ1wiICYmICFBcnJheS5pc0FycmF5KGZpZWxkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkZpZWxkcyBtdXN0IGJlIGVpdGhlciBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzXCIpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGZpZWxkKSAmJiAhIWZpZWxkLmZpbmQoKGY6IGFueSkgPT4gdHlwZW9mIGYgIT09IFwic3RyaW5nXCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRmllbGRzIG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3NcIik7XG4gIH1cbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZmllbGQpID8gZmllbGQgOiBbZmllbGRdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdPckFycmF5T2ZTdHJpbmdzKFxuICB2YWx1ZTogdW5rbm93bixcbik6IHZhbHVlIGlzIHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBjb25kaXRpb24gSlNPTiBvYmplY3QgdG8gYSBsaXN0IG9mIFRlcnJhZm9ybSBBV1MgUG9saWN5IFN0YXRlbWVudCBDb25kaXRpb25zXG4gKlxuICogSlNPTiBvYmplY3QgaXMgc3BlY2lmaWVkIGluIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOlxuICpcbiAqIGB7IFwiT3BlcmF0b3JcIjogeyBcImtleUluUmVxdWVzdENvbnRleHRcIjogXCJ2YWx1ZVwiIH0gfWBcbiAqXG4gKiBUaGUgdmFsdWUgY2FuIGJlIGVpdGhlciBhIHNpbmdsZSBzdHJpbmcgdmFsdWUgb3IgYW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcy5cbiAqXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIHdoaWNoIG9wZXJhdG9ycyBhcmUgc3VwcG9ydGVkLCBzZWUgW3RoZSBJQU1cbiAqIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uLmh0bWwpLlxuICogQHBhcmFtIGNvbmRpdGlvbkpzb24gVGhlIGNvbmRpdGlvbiBKU09OIG9iamVjdFxuICogQHJldHVybnMgVGhlIGxpc3Qgb2YgVGVycmFmb3JtIGNvbmRpdGlvbiBvYmplY3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tQ29uZGl0aW9uSnNvbihcbiAgY29uZGl0aW9uSnNvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4pOiBDb25kaXRpb25zIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25kaXRpb25Kc29uKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8Q29uZGl0aW9uPigpO1xuXG4gIGZvciAoY29uc3QgW3Rlc3QsIHZhcmlhYmxlc10gb2YgT2JqZWN0LmVudHJpZXMoY29uZGl0aW9uSnNvbikpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YXJpYWJsZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGV2ZW50IHBhdHRlcm4gZmllbGQgeyAke3Rlc3R9OiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHZhcmlhYmxlcyxcbiAgICAgICAgKX0gfS4gQWxsIGZpZWxkcyBtdXN0IGJlIG9iamVjdHNgLFxuICAgICAgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbdmFyaWFibGUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YXJpYWJsZXMgYXMgYW55KSkge1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICB0ZXN0LFxuICAgICAgICB2YXJpYWJsZSxcbiAgICAgICAgdmFsdWVzOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogZmxhdHRlbiBDb25kaXRpb25zIG1hcHBlZCBieSB0ZXN0IGFuZCB2YXJpYWJsZSB0byBhbiBhcnJheSBvZiBUZXJyYWZvcm0gQVdTIFBvbGljeSBTdGF0ZW1lbnQgQ29uZGl0aW9uc1xuICogQHBhcmFtIGNvbmRpdGlvbk1hcCBUaGUgY29uZGl0aW9uIG1hcFxuICogQHJldHVybnMgVGhlIGxpc3Qgb2YgVGVycmFmb3JtIGNvbmRpdGlvbiBvYmplY3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0NvbmRpdGlvbnMoY29uZGl0aW9uTWFwOiBDb25kaXRpb25NYXApOiBDb25kaXRpb25zIHtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoY29uZGl0aW9uTWFwKS5mbGF0TWFwKCh2YXJpYWJsZXMpID0+XG4gICAgT2JqZWN0LnZhbHVlcyh2YXJpYWJsZXMpLFxuICApO1xuICAvLyBjb25zdCBjb25kaXRpb25zOiBDb25kaXRpb25zID0gW107XG4gIC8vIGZvciAoY29uc3QgdmFyaWFibGVzTWFwIG9mIE9iamVjdC52YWx1ZXMoY29uZGl0aW9uTWFwKSkge1xuICAvLyAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIE9iamVjdC52YWx1ZXModmFyaWFibGVzTWFwKSkge1xuICAvLyAgICAgY29uZGl0aW9ucy5wdXNoKGNvbmRpdGlvbik7XG4gIC8vICAgfVxuICAvLyB9XG4gIC8vIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBsaXN0IG9mIFRlcnJhZm9ybSBBV1MgUG9saWN5IFN0YXRlbWVudCBjb25kaXRpb24gb2JqZWN0cyBiYWNrIHRvIGEgY29uZGl0aW9uIEpTT04gb2JqZWN0XG4gKiBAcGFyYW0gY29uZGl0aW9ucyBUaGUgbGlzdCBvZiBUZXJyYWZvcm0gY29uZGl0aW9uIG9iamVjdHNcbiAqIEByZXR1cm5zIFRoZSBjb25kaXRpb24gSlNPTiBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ29uZGl0aW9uSnNvbihcbiAgLi4uY29uZGl0aW9uczogQ29uZGl0aW9uc1xuKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGNvbnN0IGNvbmRpdGlvbkpzb246IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG4gICAgY29uc3QgeyB0ZXN0LCB2YXJpYWJsZSwgdmFsdWVzIH0gPSBjb25kaXRpb247XG5cbiAgICBpZiAoIWNvbmRpdGlvbkpzb25bdGVzdF0pIHtcbiAgICAgIGNvbmRpdGlvbkpzb25bdGVzdF0gPSB7fTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uZGl0aW9uSnNvblt0ZXN0XVt2YXJpYWJsZV0gPSB2YWx1ZXNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmRpdGlvbkpzb25bdGVzdF1bdmFyaWFibGVdID0gdmFsdWVzO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25kaXRpb25Kc29uO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgdGhlIGdpdmVuIHZhbHVlIGlzIGEgdmFsaWQgSnNvbiBDb25kaXRpb24gb2JqZWN0XG4gKlxuICogQVdTIENESyBJQU0gbGlicmFyeSByZWxpZXMgb24gYmVpbmcgYWJsZSB0byBwYXNzIGluIGEgYEpzb25gIGluc3RhbmNlIGZvclxuICogYSBgQ29uZGl0aW9uYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ29uZGl0aW9uT2JqZWN0KFxuICB4OiB1bmtub3duLFxuKTogYXNzZXJ0cyB4IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKCF4IHx8IHR5cGVvZiB4ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIkEgQ29uZGl0aW9uIHNob3VsZCBiZSByZXByZXNlbnRlZCBhcyBhIG1hcCBvZiBvcGVyYXRvciB0byB2YWx1ZVwiLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|