aws-cdk 0.0.0
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/CONTRIBUTING.md +276 -0
- package/LICENSE +202 -0
- package/NOTICE +16 -0
- package/README.md +1274 -0
- package/THIRD_PARTY_LICENSES +26821 -0
- package/bin/cdk +6 -0
- package/build-info.json +4 -0
- package/db.json.gz +0 -0
- package/generate.sh +25 -0
- package/images/garbage-collection.png +0 -0
- package/lib/api/aws-auth/account-cache.d.ts +39 -0
- package/lib/api/aws-auth/account-cache.js +102 -0
- package/lib/api/aws-auth/awscli-compatible.d.ts +42 -0
- package/lib/api/aws-auth/awscli-compatible.js +264 -0
- package/lib/api/aws-auth/cached.d.ts +11 -0
- package/lib/api/aws-auth/cached.js +26 -0
- package/lib/api/aws-auth/credential-plugins.d.ts +36 -0
- package/lib/api/aws-auth/credential-plugins.js +153 -0
- package/lib/api/aws-auth/index.d.ts +3 -0
- package/lib/api/aws-auth/index.js +20 -0
- package/lib/api/aws-auth/provider-caching.d.ts +13 -0
- package/lib/api/aws-auth/provider-caching.js +24 -0
- package/lib/api/aws-auth/sdk-logger.d.ts +69 -0
- package/lib/api/aws-auth/sdk-logger.js +130 -0
- package/lib/api/aws-auth/sdk-provider.d.ts +207 -0
- package/lib/api/aws-auth/sdk-provider.js +359 -0
- package/lib/api/aws-auth/sdk.d.ts +223 -0
- package/lib/api/aws-auth/sdk.js +366 -0
- package/lib/api/aws-auth/tracing.d.ts +11 -0
- package/lib/api/aws-auth/tracing.js +61 -0
- package/lib/api/aws-auth/user-agent.d.ts +7 -0
- package/lib/api/aws-auth/user-agent.js +21 -0
- package/lib/api/aws-auth/util.d.ts +6 -0
- package/lib/api/aws-auth/util.js +23 -0
- package/lib/api/bootstrap/bootstrap-environment.d.ts +33 -0
- package/lib/api/bootstrap/bootstrap-environment.js +322 -0
- package/lib/api/bootstrap/bootstrap-props.d.ts +130 -0
- package/lib/api/bootstrap/bootstrap-props.js +14 -0
- package/lib/api/bootstrap/bootstrap-template.yaml +692 -0
- package/lib/api/bootstrap/deploy-bootstrap.d.ts +37 -0
- package/lib/api/bootstrap/deploy-bootstrap.js +143 -0
- package/lib/api/bootstrap/index.d.ts +2 -0
- package/lib/api/bootstrap/index.js +19 -0
- package/lib/api/bootstrap/legacy-template.d.ts +2 -0
- package/lib/api/bootstrap/legacy-template.js +82 -0
- package/lib/api/context.d.ts +40 -0
- package/lib/api/context.js +82 -0
- package/lib/api/cxapp/cloud-assembly.d.ts +150 -0
- package/lib/api/cxapp/cloud-assembly.js +305 -0
- package/lib/api/cxapp/cloud-executable.d.ts +44 -0
- package/lib/api/cxapp/cloud-executable.js +90 -0
- package/lib/api/cxapp/environments.d.ts +9 -0
- package/lib/api/cxapp/environments.js +66 -0
- package/lib/api/cxapp/exec.d.ts +56 -0
- package/lib/api/cxapp/exec.js +275 -0
- package/lib/api/deployments/asset-manifest-builder.d.ts +8 -0
- package/lib/api/deployments/asset-manifest-builder.js +35 -0
- package/lib/api/deployments/asset-publishing.d.ts +77 -0
- package/lib/api/deployments/asset-publishing.js +163 -0
- package/lib/api/deployments/assets.d.ts +10 -0
- package/lib/api/deployments/assets.js +111 -0
- package/lib/api/deployments/checks.d.ts +8 -0
- package/lib/api/deployments/checks.js +73 -0
- package/lib/api/deployments/cloudformation.d.ts +235 -0
- package/lib/api/deployments/cloudformation.js +598 -0
- package/lib/api/deployments/deploy-stack.d.ts +177 -0
- package/lib/api/deployments/deploy-stack.js +484 -0
- package/lib/api/deployments/deployment-method.d.ts +24 -0
- package/lib/api/deployments/deployment-method.js +3 -0
- package/lib/api/deployments/deployment-result.d.ts +21 -0
- package/lib/api/deployments/deployment-result.js +10 -0
- package/lib/api/deployments/deployments.d.ts +340 -0
- package/lib/api/deployments/deployments.js +369 -0
- package/lib/api/deployments/hotswap-deployments.d.ts +14 -0
- package/lib/api/deployments/hotswap-deployments.js +357 -0
- package/lib/api/deployments/index.d.ts +6 -0
- package/lib/api/deployments/index.js +23 -0
- package/lib/api/deployments/nested-stack-helpers.d.ts +25 -0
- package/lib/api/deployments/nested-stack-helpers.js +88 -0
- package/lib/api/environment-access.d.ts +138 -0
- package/lib/api/environment-access.js +203 -0
- package/lib/api/environment-resources.d.ts +73 -0
- package/lib/api/environment-resources.js +208 -0
- package/lib/api/evaluate-cloudformation-template.d.ts +84 -0
- package/lib/api/evaluate-cloudformation-template.js +443 -0
- package/lib/api/garbage-collection/garbage-collector.d.ts +152 -0
- package/lib/api/garbage-collection/garbage-collector.js +607 -0
- package/lib/api/garbage-collection/progress-printer.d.ts +21 -0
- package/lib/api/garbage-collection/progress-printer.js +69 -0
- package/lib/api/garbage-collection/stack-refresh.d.ts +44 -0
- package/lib/api/garbage-collection/stack-refresh.js +154 -0
- package/lib/api/hotswap/appsync-mapping-templates.d.ts +3 -0
- package/lib/api/hotswap/appsync-mapping-templates.js +157 -0
- package/lib/api/hotswap/code-build-projects.d.ts +3 -0
- package/lib/api/hotswap/code-build-projects.js +55 -0
- package/lib/api/hotswap/common.d.ts +126 -0
- package/lib/api/hotswap/common.js +170 -0
- package/lib/api/hotswap/ecs-services.d.ts +3 -0
- package/lib/api/hotswap/ecs-services.js +140 -0
- package/lib/api/hotswap/lambda-functions.d.ts +3 -0
- package/lib/api/hotswap/lambda-functions.js +309 -0
- package/lib/api/hotswap/s3-bucket-deployments.d.ts +9 -0
- package/lib/api/hotswap/s3-bucket-deployments.js +112 -0
- package/lib/api/hotswap/stepfunctions-state-machines.d.ts +3 -0
- package/lib/api/hotswap/stepfunctions-state-machines.js +42 -0
- package/lib/api/index.d.ts +5 -0
- package/lib/api/index.js +22 -0
- package/lib/api/logs/find-cloudwatch-logs.d.ts +24 -0
- package/lib/api/logs/find-cloudwatch-logs.js +97 -0
- package/lib/api/logs/logs-monitor.d.ts +53 -0
- package/lib/api/logs/logs-monitor.js +169 -0
- package/lib/api/plugin/context-provider-plugin.d.ts +6 -0
- package/lib/api/plugin/context-provider-plugin.js +7 -0
- package/lib/api/plugin/index.d.ts +3 -0
- package/lib/api/plugin/index.js +20 -0
- package/lib/api/plugin/mode.d.ts +4 -0
- package/lib/api/plugin/mode.js +9 -0
- package/lib/api/plugin/plugin.d.ts +63 -0
- package/lib/api/plugin/plugin.js +106 -0
- package/lib/api/settings.d.ts +29 -0
- package/lib/api/settings.js +141 -0
- package/lib/api/tags.d.ts +9 -0
- package/lib/api/tags.js +10 -0
- package/lib/api/toolkit-info.d.ts +51 -0
- package/lib/api/toolkit-info.js +156 -0
- package/lib/api/util/cloudformation/stack-activity-monitor.d.ts +237 -0
- package/lib/api/util/cloudformation/stack-activity-monitor.js +550 -0
- package/lib/api/util/cloudformation/stack-event-poller.d.ts +63 -0
- package/lib/api/util/cloudformation/stack-event-poller.js +129 -0
- package/lib/api/util/cloudformation/stack-status.d.ts +42 -0
- package/lib/api/util/cloudformation/stack-status.js +88 -0
- package/lib/api/util/display.d.ts +13 -0
- package/lib/api/util/display.js +80 -0
- package/lib/api/util/placeholders.d.ts +10 -0
- package/lib/api/util/placeholders.js +24 -0
- package/lib/api/util/rwlock.d.ts +65 -0
- package/lib/api/util/rwlock.js +179 -0
- package/lib/api/util/string-manipulation.d.ts +10 -0
- package/lib/api/util/string-manipulation.js +33 -0
- package/lib/api/util/template-body-parameter.d.ts +21 -0
- package/lib/api/util/template-body-parameter.js +104 -0
- package/lib/cli/cdk-toolkit.d.ts +594 -0
- package/lib/cli/cdk-toolkit.js +1019 -0
- package/lib/cli/cli-config.d.ts +10 -0
- package/lib/cli/cli-config.js +406 -0
- package/lib/cli/cli.d.ts +4 -0
- package/lib/cli/cli.js +538 -0
- package/lib/cli/convert-to-user-input.d.ts +3 -0
- package/lib/cli/convert-to-user-input.js +434 -0
- package/lib/cli/parse-command-line-arguments.d.ts +1 -0
- package/lib/cli/parse-command-line-arguments.js +806 -0
- package/lib/cli/platform-warnings.d.ts +2 -0
- package/lib/cli/platform-warnings.js +45 -0
- package/lib/cli/user-configuration.d.ts +90 -0
- package/lib/cli/user-configuration.js +272 -0
- package/lib/cli/user-input.d.ts +1163 -0
- package/lib/cli/user-input.js +3 -0
- package/lib/cli/util/console-formatters.d.ts +18 -0
- package/lib/cli/util/console-formatters.js +42 -0
- package/lib/cli/util/npm.d.ts +1 -0
- package/lib/cli/util/npm.js +22 -0
- package/lib/cli/util/yargs-helpers.d.ts +22 -0
- package/lib/cli/util/yargs-helpers.js +49 -0
- package/lib/cli/version.d.ts +13 -0
- package/lib/cli/version.js +120 -0
- package/lib/commands/context.d.ts +35 -0
- package/lib/commands/context.js +156 -0
- package/lib/commands/docs.d.ts +13 -0
- package/lib/commands/docs.js +32 -0
- package/lib/commands/doctor.d.ts +1 -0
- package/lib/commands/doctor.js +69 -0
- package/lib/commands/migrate.d.ts +327 -0
- package/lib/commands/migrate.js +804 -0
- package/lib/context-providers/ami.d.ts +11 -0
- package/lib/context-providers/ami.js +50 -0
- package/lib/context-providers/availability-zones.d.ts +11 -0
- package/lib/context-providers/availability-zones.js +27 -0
- package/lib/context-providers/endpoint-service-availability-zones.d.ts +11 -0
- package/lib/context-providers/endpoint-service-availability-zones.js +33 -0
- package/lib/context-providers/hosted-zones.d.ts +10 -0
- package/lib/context-providers/hosted-zones.js +67 -0
- package/lib/context-providers/index.d.ts +30 -0
- package/lib/context-providers/index.js +109 -0
- package/lib/context-providers/keys.d.ts +11 -0
- package/lib/context-providers/keys.js +52 -0
- package/lib/context-providers/load-balancers.d.ts +20 -0
- package/lib/context-providers/load-balancers.js +159 -0
- package/lib/context-providers/security-groups.d.ts +9 -0
- package/lib/context-providers/security-groups.js +70 -0
- package/lib/context-providers/ssm-parameters.d.ts +23 -0
- package/lib/context-providers/ssm-parameters.js +59 -0
- package/lib/context-providers/vpcs.d.ts +11 -0
- package/lib/context-providers/vpcs.js +288 -0
- package/lib/diff.d.ts +28 -0
- package/lib/diff.js +165 -0
- package/lib/import.d.ts +182 -0
- package/lib/import.js +335 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.js +348304 -0
- package/lib/index_bg.wasm +0 -0
- package/lib/init-hooks.d.ts +40 -0
- package/lib/init-hooks.js +64 -0
- package/lib/init-templates/.init-version.json +1 -0
- package/lib/init-templates/.no-packagejson-validator +0 -0
- package/lib/init-templates/.recommended-feature-flags.json +68 -0
- package/lib/init-templates/LICENSE +16 -0
- package/lib/init-templates/app/csharp/.template.gitignore +342 -0
- package/lib/init-templates/app/csharp/README.md +14 -0
- package/lib/init-templates/app/csharp/cdk.template.json +15 -0
- package/lib/init-templates/app/csharp/src/%name.PascalCased%/%name.PascalCased%.template.csproj +20 -0
- package/lib/init-templates/app/csharp/src/%name.PascalCased%/%name.PascalCased%Stack.template.cs +13 -0
- package/lib/init-templates/app/csharp/src/%name.PascalCased%/GlobalSuppressions.cs +1 -0
- package/lib/init-templates/app/csharp/src/%name.PascalCased%/Program.template.cs +44 -0
- package/lib/init-templates/app/csharp/src/%name.PascalCased%.template.sln +18 -0
- package/lib/init-templates/app/fsharp/.template.gitignore +342 -0
- package/lib/init-templates/app/fsharp/README.md +18 -0
- package/lib/init-templates/app/fsharp/cdk.template.json +14 -0
- package/lib/init-templates/app/fsharp/src/%name.PascalCased%/%name.PascalCased%.template.fsproj +25 -0
- package/lib/init-templates/app/fsharp/src/%name.PascalCased%/%name.PascalCased%Stack.template.fs +8 -0
- package/lib/init-templates/app/fsharp/src/%name.PascalCased%/Program.template.fs +11 -0
- package/lib/init-templates/app/fsharp/src/%name.PascalCased%.template.sln +18 -0
- package/lib/init-templates/app/go/%name%.template.go +70 -0
- package/lib/init-templates/app/go/%name%_test.template.go +26 -0
- package/lib/init-templates/app/go/.template.gitignore +19 -0
- package/lib/init-templates/app/go/README.md +12 -0
- package/lib/init-templates/app/go/cdk.template.json +13 -0
- package/lib/init-templates/app/go/go.template.mod +9 -0
- package/lib/init-templates/app/info.json +4 -0
- package/lib/init-templates/app/java/.template.gitignore +13 -0
- package/lib/init-templates/app/java/README.md +18 -0
- package/lib/init-templates/app/java/cdk.json +13 -0
- package/lib/init-templates/app/java/pom.xml +60 -0
- package/lib/init-templates/app/java/src/main/java/com/myorg/%name.PascalCased%App.template.java +42 -0
- package/lib/init-templates/app/java/src/main/java/com/myorg/%name.PascalCased%Stack.template.java +24 -0
- package/lib/init-templates/app/java/src/test/java/com/myorg/%name.PascalCased%Test.template.java +26 -0
- package/lib/init-templates/app/javascript/.template.gitignore +5 -0
- package/lib/init-templates/app/javascript/.template.npmignore +3 -0
- package/lib/init-templates/app/javascript/README.md +12 -0
- package/lib/init-templates/app/javascript/bin/%name%.template.js +21 -0
- package/lib/init-templates/app/javascript/cdk.template.json +15 -0
- package/lib/init-templates/app/javascript/jest.config.js +3 -0
- package/lib/init-templates/app/javascript/lib/%name%-stack.template.js +23 -0
- package/lib/init-templates/app/javascript/package.json +20 -0
- package/lib/init-templates/app/javascript/test/%name%.test.template.js +17 -0
- package/lib/init-templates/app/python/%name.PythonModule%/%name.PythonModule%_stack.template.py +19 -0
- package/lib/init-templates/app/python/%name.PythonModule%/__init__.py +0 -0
- package/lib/init-templates/app/python/.template.gitignore +10 -0
- package/lib/init-templates/app/python/README.template.md +58 -0
- package/lib/init-templates/app/python/app.template.py +28 -0
- package/lib/init-templates/app/python/cdk.template.json +15 -0
- package/lib/init-templates/app/python/requirements-dev.txt +1 -0
- package/lib/init-templates/app/python/requirements.txt +2 -0
- package/lib/init-templates/app/python/source.bat +13 -0
- package/lib/init-templates/app/python/tests/__init__.py +0 -0
- package/lib/init-templates/app/python/tests/unit/__init__.py +0 -0
- package/lib/init-templates/app/python/tests/unit/test_%name.PythonModule%_stack.template.py +15 -0
- package/lib/init-templates/app/typescript/.template.gitignore +8 -0
- package/lib/init-templates/app/typescript/.template.npmignore +6 -0
- package/lib/init-templates/app/typescript/README.md +14 -0
- package/lib/init-templates/app/typescript/bin/%name%.template.ts +20 -0
- package/lib/init-templates/app/typescript/cdk.template.json +17 -0
- package/lib/init-templates/app/typescript/jest.config.js +8 -0
- package/lib/init-templates/app/typescript/lib/%name%-stack.template.ts +16 -0
- package/lib/init-templates/app/typescript/package.json +26 -0
- package/lib/init-templates/app/typescript/test/%name%.test.template.ts +17 -0
- package/lib/init-templates/app/typescript/tsconfig.json +31 -0
- package/lib/init-templates/lib/info.json +4 -0
- package/lib/init-templates/lib/typescript/.template.gitignore +8 -0
- package/lib/init-templates/lib/typescript/.template.npmignore +6 -0
- package/lib/init-templates/lib/typescript/README.template.md +12 -0
- package/lib/init-templates/lib/typescript/jest.config.js +8 -0
- package/lib/init-templates/lib/typescript/lib/index.template.ts +21 -0
- package/lib/init-templates/lib/typescript/package.json +24 -0
- package/lib/init-templates/lib/typescript/test/%name%.test.template.ts +18 -0
- package/lib/init-templates/lib/typescript/tsconfig.json +31 -0
- package/lib/init-templates/sample-app/csharp/.template.gitignore +342 -0
- package/lib/init-templates/sample-app/csharp/README.template.md +19 -0
- package/lib/init-templates/sample-app/csharp/cdk.template.json +15 -0
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/%name.PascalCased%.template.csproj +20 -0
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/%name.PascalCased%Stack.template.cs +24 -0
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/GlobalSuppressions.cs +1 -0
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/Program.template.cs +15 -0
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%.template.sln +18 -0
- package/lib/init-templates/sample-app/fsharp/.template.gitignore +342 -0
- package/lib/init-templates/sample-app/fsharp/README.template.md +20 -0
- package/lib/init-templates/sample-app/fsharp/cdk.template.json +14 -0
- package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%/%name.PascalCased%.template.fsproj +25 -0
- package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%/%name.PascalCased%Stack.template.fs +14 -0
- package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%/Program.template.fs +11 -0
- package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%.template.sln +18 -0
- package/lib/init-templates/sample-app/go/%name%.template.go +73 -0
- package/lib/init-templates/sample-app/go/%name%_test.template.go +25 -0
- package/lib/init-templates/sample-app/go/.template.gitignore +19 -0
- package/lib/init-templates/sample-app/go/README.md +12 -0
- package/lib/init-templates/sample-app/go/cdk.template.json +13 -0
- package/lib/init-templates/sample-app/go/go.template.mod +9 -0
- package/lib/init-templates/sample-app/info.json +4 -0
- package/lib/init-templates/sample-app/java/.template.gitignore +13 -0
- package/lib/init-templates/sample-app/java/README.template.md +19 -0
- package/lib/init-templates/sample-app/java/cdk.json +13 -0
- package/lib/init-templates/sample-app/java/pom.xml +55 -0
- package/lib/init-templates/sample-app/java/src/main/java/com/myorg/%name.PascalCased%App.template.java +13 -0
- package/lib/init-templates/sample-app/java/src/main/java/com/myorg/%name.PascalCased%Stack.template.java +29 -0
- package/lib/init-templates/sample-app/java/src/test/java/com/myorg/%name.PascalCased%StackTest.template.java +27 -0
- package/lib/init-templates/sample-app/javascript/.template.gitignore +5 -0
- package/lib/init-templates/sample-app/javascript/.template.npmignore +3 -0
- package/lib/init-templates/sample-app/javascript/README.template.md +13 -0
- package/lib/init-templates/sample-app/javascript/bin/%name%.template.js +6 -0
- package/lib/init-templates/sample-app/javascript/cdk.template.json +15 -0
- package/lib/init-templates/sample-app/javascript/jest.config.js +3 -0
- package/lib/init-templates/sample-app/javascript/lib/%name%-stack.template.js +25 -0
- package/lib/init-templates/sample-app/javascript/package.json +20 -0
- package/lib/init-templates/sample-app/javascript/test/%name%.test.template.js +16 -0
- package/lib/init-templates/sample-app/javascript/tsconfig.json +34 -0
- package/lib/init-templates/sample-app/python/%name.PythonModule%/%name.PythonModule%_stack.template.py +26 -0
- package/lib/init-templates/sample-app/python/%name.PythonModule%/__init__.py +0 -0
- package/lib/init-templates/sample-app/python/.template.gitignore +22 -0
- package/lib/init-templates/sample-app/python/README.template.md +65 -0
- package/lib/init-templates/sample-app/python/app.template.py +11 -0
- package/lib/init-templates/sample-app/python/cdk.template.json +15 -0
- package/lib/init-templates/sample-app/python/requirements-dev.txt +1 -0
- package/lib/init-templates/sample-app/python/requirements.txt +2 -0
- package/lib/init-templates/sample-app/python/source.bat +13 -0
- package/lib/init-templates/sample-app/python/tests/__init__.py +0 -0
- package/lib/init-templates/sample-app/python/tests/unit/__init__.py +0 -0
- package/lib/init-templates/sample-app/python/tests/unit/test_%name.PythonModule%_stack.template.py +21 -0
- package/lib/init-templates/sample-app/typescript/.template.gitignore +8 -0
- package/lib/init-templates/sample-app/typescript/.template.npmignore +6 -0
- package/lib/init-templates/sample-app/typescript/README.template.md +15 -0
- package/lib/init-templates/sample-app/typescript/bin/%name%.template.ts +6 -0
- package/lib/init-templates/sample-app/typescript/cdk.template.json +17 -0
- package/lib/init-templates/sample-app/typescript/jest.config.js +8 -0
- package/lib/init-templates/sample-app/typescript/lib/%name%-stack.template.ts +19 -0
- package/lib/init-templates/sample-app/typescript/package.json +26 -0
- package/lib/init-templates/sample-app/typescript/test/%name%.test.template.ts +17 -0
- package/lib/init-templates/sample-app/typescript/tsconfig.json +31 -0
- package/lib/init.d.ts +52 -0
- package/lib/init.js +430 -0
- package/lib/legacy-exports-source.d.ts +27 -0
- package/lib/legacy-exports-source.js +88 -0
- package/lib/legacy-exports.d.ts +10 -0
- package/lib/legacy-exports.js +28 -0
- package/lib/legacy-logging-source.d.ts +32 -0
- package/lib/legacy-logging-source.js +107 -0
- package/lib/list-stacks.d.ts +22 -0
- package/lib/list-stacks.js +23 -0
- package/lib/logging.d.ts +109 -0
- package/lib/logging.js +159 -0
- package/lib/migrator.d.ts +25 -0
- package/lib/migrator.js +67 -0
- package/lib/notices.d.ts +156 -0
- package/lib/notices.js +373 -0
- package/lib/os.d.ts +7 -0
- package/lib/os.js +92 -0
- package/lib/serialize.d.ts +27 -0
- package/lib/serialize.js +86 -0
- package/lib/toolkit/cli-io-host.d.ts +208 -0
- package/lib/toolkit/cli-io-host.js +282 -0
- package/lib/toolkit/error.d.ts +44 -0
- package/lib/toolkit/error.js +78 -0
- package/lib/tree.d.ts +31 -0
- package/lib/tree.js +40 -0
- package/lib/util/archive.d.ts +1 -0
- package/lib/util/archive.js +86 -0
- package/lib/util/arrays.d.ts +14 -0
- package/lib/util/arrays.js +36 -0
- package/lib/util/bool.d.ts +7 -0
- package/lib/util/bool.js +13 -0
- package/lib/util/bytes.d.ts +8 -0
- package/lib/util/bytes.js +21 -0
- package/lib/util/content-hash.d.ts +5 -0
- package/lib/util/content-hash.js +43 -0
- package/lib/util/directories.d.ts +23 -0
- package/lib/util/directories.js +57 -0
- package/lib/util/error.d.ts +9 -0
- package/lib/util/error.js +22 -0
- package/lib/util/index.d.ts +5 -0
- package/lib/util/index.js +22 -0
- package/lib/util/objects.d.ts +52 -0
- package/lib/util/objects.js +183 -0
- package/lib/util/parallel.d.ts +6 -0
- package/lib/util/parallel.js +44 -0
- package/lib/util/tables.d.ts +1 -0
- package/lib/util/tables.js +10 -0
- package/lib/util/type-brands.d.ts +39 -0
- package/lib/util/type-brands.js +38 -0
- package/lib/util/types.d.ts +27 -0
- package/lib/util/types.js +25 -0
- package/lib/util/validate-notification-arn.d.ts +4 -0
- package/lib/util/validate-notification-arn.js +10 -0
- package/lib/util/version-range.d.ts +2 -0
- package/lib/util/version-range.js +36 -0
- package/lib/util/work-graph-builder.d.ts +32 -0
- package/lib/util/work-graph-builder.js +167 -0
- package/lib/util/work-graph-types.d.ts +50 -0
- package/lib/util/work-graph-types.js +14 -0
- package/lib/util/work-graph.d.ts +70 -0
- package/lib/util/work-graph.js +344 -0
- package/lib/util/yaml-cfn.d.ts +15 -0
- package/lib/util/yaml-cfn.js +56 -0
- package/package.json +197 -0
- package/scripts/user-input-gen +2 -0
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isHotswappableLambdaFunctionChange = isHotswappableLambdaFunctionChange;
|
|
4
|
+
const stream_1 = require("stream");
|
|
5
|
+
const common_1 = require("./common");
|
|
6
|
+
const error_1 = require("../../toolkit/error");
|
|
7
|
+
const util_1 = require("../../util");
|
|
8
|
+
const evaluate_cloudformation_template_1 = require("../evaluate-cloudformation-template");
|
|
9
|
+
// namespace object imports won't work in the bundle for function exports
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
11
|
+
const archiver = require('archiver');
|
|
12
|
+
async function isHotswappableLambdaFunctionChange(logicalId, change, evaluateCfnTemplate) {
|
|
13
|
+
var _a;
|
|
14
|
+
// if the change is for a Lambda Version,
|
|
15
|
+
// ignore it by returning an empty hotswap operation -
|
|
16
|
+
// we will publish a new version when we get to hotswapping the actual Function this Version points to, below
|
|
17
|
+
// (Versions can't be changed in CloudFormation anyway, they're immutable)
|
|
18
|
+
if (change.newValue.Type === 'AWS::Lambda::Version') {
|
|
19
|
+
return [
|
|
20
|
+
{
|
|
21
|
+
hotswappable: true,
|
|
22
|
+
resourceType: 'AWS::Lambda::Version',
|
|
23
|
+
resourceNames: [],
|
|
24
|
+
propsChanged: [],
|
|
25
|
+
service: 'lambda',
|
|
26
|
+
apply: async (_sdk) => { },
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
|
+
// we handle Aliases specially too
|
|
31
|
+
if (change.newValue.Type === 'AWS::Lambda::Alias') {
|
|
32
|
+
return classifyAliasChanges(change);
|
|
33
|
+
}
|
|
34
|
+
if (change.newValue.Type !== 'AWS::Lambda::Function') {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
const ret = [];
|
|
38
|
+
const classifiedChanges = (0, common_1.classifyChanges)(change, ['Code', 'Environment', 'Description']);
|
|
39
|
+
classifiedChanges.reportNonHotswappablePropertyChanges(ret);
|
|
40
|
+
const functionName = await evaluateCfnTemplate.establishResourcePhysicalName(logicalId, (_a = change.newValue.Properties) === null || _a === void 0 ? void 0 : _a.FunctionName);
|
|
41
|
+
const namesOfHotswappableChanges = Object.keys(classifiedChanges.hotswappableProps);
|
|
42
|
+
if (namesOfHotswappableChanges.length > 0) {
|
|
43
|
+
ret.push({
|
|
44
|
+
hotswappable: true,
|
|
45
|
+
resourceType: change.newValue.Type,
|
|
46
|
+
propsChanged: namesOfHotswappableChanges,
|
|
47
|
+
service: 'lambda',
|
|
48
|
+
resourceNames: [
|
|
49
|
+
`Lambda Function '${functionName}'`,
|
|
50
|
+
// add Version here if we're publishing a new one
|
|
51
|
+
...(await renderVersions(logicalId, evaluateCfnTemplate, [`Lambda Version for Function '${functionName}'`])),
|
|
52
|
+
// add any Aliases that we are hotswapping here
|
|
53
|
+
...(await renderAliases(logicalId, evaluateCfnTemplate, async (alias) => `Lambda Alias '${alias}' for Function '${functionName}'`)),
|
|
54
|
+
],
|
|
55
|
+
apply: async (sdk) => {
|
|
56
|
+
var _a;
|
|
57
|
+
const lambdaCodeChange = await evaluateLambdaFunctionProps(classifiedChanges.hotswappableProps, (_a = change.newValue.Properties) === null || _a === void 0 ? void 0 : _a.Runtime, evaluateCfnTemplate);
|
|
58
|
+
if (lambdaCodeChange === undefined) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (!functionName) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const { versionsReferencingFunction, aliasesNames } = await versionsAndAliases(logicalId, evaluateCfnTemplate);
|
|
65
|
+
const lambda = sdk.lambda();
|
|
66
|
+
const operations = [];
|
|
67
|
+
if (lambdaCodeChange.code !== undefined || lambdaCodeChange.configurations !== undefined) {
|
|
68
|
+
if (lambdaCodeChange.code !== undefined) {
|
|
69
|
+
const updateFunctionCodeResponse = await lambda.updateFunctionCode({
|
|
70
|
+
FunctionName: functionName,
|
|
71
|
+
S3Bucket: lambdaCodeChange.code.s3Bucket,
|
|
72
|
+
S3Key: lambdaCodeChange.code.s3Key,
|
|
73
|
+
ImageUri: lambdaCodeChange.code.imageUri,
|
|
74
|
+
ZipFile: lambdaCodeChange.code.functionCodeZip,
|
|
75
|
+
S3ObjectVersion: lambdaCodeChange.code.s3ObjectVersion,
|
|
76
|
+
});
|
|
77
|
+
await waitForLambdasPropertiesUpdateToFinish(updateFunctionCodeResponse, lambda, functionName);
|
|
78
|
+
}
|
|
79
|
+
if (lambdaCodeChange.configurations !== undefined) {
|
|
80
|
+
const updateRequest = {
|
|
81
|
+
FunctionName: functionName,
|
|
82
|
+
};
|
|
83
|
+
if (lambdaCodeChange.configurations.description !== undefined) {
|
|
84
|
+
updateRequest.Description = lambdaCodeChange.configurations.description;
|
|
85
|
+
}
|
|
86
|
+
if (lambdaCodeChange.configurations.environment !== undefined) {
|
|
87
|
+
updateRequest.Environment = lambdaCodeChange.configurations.environment;
|
|
88
|
+
}
|
|
89
|
+
const updateFunctionCodeResponse = await lambda.updateFunctionConfiguration(updateRequest);
|
|
90
|
+
await waitForLambdasPropertiesUpdateToFinish(updateFunctionCodeResponse, lambda, functionName);
|
|
91
|
+
}
|
|
92
|
+
// only if the code changed is there any point in publishing a new Version
|
|
93
|
+
if (versionsReferencingFunction.length > 0) {
|
|
94
|
+
const publishVersionPromise = lambda.publishVersion({
|
|
95
|
+
FunctionName: functionName,
|
|
96
|
+
});
|
|
97
|
+
if (aliasesNames.length > 0) {
|
|
98
|
+
// we need to wait for the Version to finish publishing
|
|
99
|
+
const versionUpdate = await publishVersionPromise;
|
|
100
|
+
for (const alias of aliasesNames) {
|
|
101
|
+
operations.push(lambda.updateAlias({
|
|
102
|
+
FunctionName: functionName,
|
|
103
|
+
Name: alias,
|
|
104
|
+
FunctionVersion: versionUpdate.Version,
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
operations.push(publishVersionPromise);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// run all of our updates in parallel
|
|
114
|
+
// Limited set of updates per function
|
|
115
|
+
// eslint-disable-next-line @cdklabs/promiseall-no-unbounded-parallelism
|
|
116
|
+
await Promise.all(operations);
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return ret;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Determines which changes to this Alias are hotswappable or not
|
|
124
|
+
*/
|
|
125
|
+
function classifyAliasChanges(change) {
|
|
126
|
+
const ret = [];
|
|
127
|
+
const classifiedChanges = (0, common_1.classifyChanges)(change, ['FunctionVersion']);
|
|
128
|
+
classifiedChanges.reportNonHotswappablePropertyChanges(ret);
|
|
129
|
+
const namesOfHotswappableChanges = Object.keys(classifiedChanges.hotswappableProps);
|
|
130
|
+
if (namesOfHotswappableChanges.length > 0) {
|
|
131
|
+
ret.push({
|
|
132
|
+
hotswappable: true,
|
|
133
|
+
resourceType: change.newValue.Type,
|
|
134
|
+
propsChanged: [],
|
|
135
|
+
service: 'lambda',
|
|
136
|
+
resourceNames: [],
|
|
137
|
+
apply: async (_sdk) => { },
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return ret;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Evaluates the hotswappable properties of an AWS::Lambda::Function and
|
|
144
|
+
* Returns a `LambdaFunctionChange` if the change is hotswappable.
|
|
145
|
+
* Returns `undefined` if the change is not hotswappable.
|
|
146
|
+
*/
|
|
147
|
+
async function evaluateLambdaFunctionProps(hotswappablePropChanges, runtime, evaluateCfnTemplate) {
|
|
148
|
+
/*
|
|
149
|
+
* At first glance, we would want to initialize these using the "previous" values (change.oldValue),
|
|
150
|
+
* in case only one of them changed, like the key, and the Bucket stayed the same.
|
|
151
|
+
* However, that actually fails for old-style synthesis, which uses CFN Parameters!
|
|
152
|
+
* Because the names of the Parameters depend on the hash of the Asset,
|
|
153
|
+
* the Parameters used for the "old" values no longer exist in `assetParams` at this point,
|
|
154
|
+
* which means we don't have the correct values available to evaluate the CFN expression with.
|
|
155
|
+
* Fortunately, the diff will always include both the s3Bucket and s3Key parts of the Lambda's Code property,
|
|
156
|
+
* even if only one of them was actually changed,
|
|
157
|
+
* which means we don't need the "old" values at all, and we can safely initialize these with just `''`.
|
|
158
|
+
*/
|
|
159
|
+
let code = undefined;
|
|
160
|
+
let description = undefined;
|
|
161
|
+
let environment = undefined;
|
|
162
|
+
for (const updatedPropName in hotswappablePropChanges) {
|
|
163
|
+
const updatedProp = hotswappablePropChanges[updatedPropName];
|
|
164
|
+
switch (updatedPropName) {
|
|
165
|
+
case 'Code':
|
|
166
|
+
let s3Bucket, s3Key, s3ObjectVersion, imageUri, functionCodeZip;
|
|
167
|
+
for (const newPropName in updatedProp.newValue) {
|
|
168
|
+
switch (newPropName) {
|
|
169
|
+
case 'S3Bucket':
|
|
170
|
+
s3Bucket = await evaluateCfnTemplate.evaluateCfnExpression(updatedProp.newValue[newPropName]);
|
|
171
|
+
break;
|
|
172
|
+
case 'S3Key':
|
|
173
|
+
s3Key = await evaluateCfnTemplate.evaluateCfnExpression(updatedProp.newValue[newPropName]);
|
|
174
|
+
break;
|
|
175
|
+
case 'S3ObjectVersion':
|
|
176
|
+
s3ObjectVersion = await evaluateCfnTemplate.evaluateCfnExpression(updatedProp.newValue[newPropName]);
|
|
177
|
+
break;
|
|
178
|
+
case 'ImageUri':
|
|
179
|
+
imageUri = await evaluateCfnTemplate.evaluateCfnExpression(updatedProp.newValue[newPropName]);
|
|
180
|
+
break;
|
|
181
|
+
case 'ZipFile':
|
|
182
|
+
// We must create a zip package containing a file with the inline code
|
|
183
|
+
const functionCode = await evaluateCfnTemplate.evaluateCfnExpression(updatedProp.newValue[newPropName]);
|
|
184
|
+
const functionRuntime = await evaluateCfnTemplate.evaluateCfnExpression(runtime);
|
|
185
|
+
if (!functionRuntime) {
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
// file extension must be chosen depending on the runtime
|
|
189
|
+
const codeFileExt = determineCodeFileExtFromRuntime(functionRuntime);
|
|
190
|
+
functionCodeZip = await zipString(`index.${codeFileExt}`, functionCode);
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
code = {
|
|
195
|
+
s3Bucket,
|
|
196
|
+
s3Key,
|
|
197
|
+
s3ObjectVersion,
|
|
198
|
+
imageUri,
|
|
199
|
+
functionCodeZip,
|
|
200
|
+
};
|
|
201
|
+
break;
|
|
202
|
+
case 'Description':
|
|
203
|
+
description = await evaluateCfnTemplate.evaluateCfnExpression(updatedProp.newValue);
|
|
204
|
+
break;
|
|
205
|
+
case 'Environment':
|
|
206
|
+
environment = await evaluateCfnTemplate.evaluateCfnExpression(updatedProp.newValue);
|
|
207
|
+
break;
|
|
208
|
+
default:
|
|
209
|
+
// we will never get here, but just in case we do throw an error
|
|
210
|
+
throw new error_1.ToolkitError('while apply()ing, found a property that cannot be hotswapped. Please report this at github.com/aws/aws-cdk/issues/new/choose');
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
const configurations = description || environment ? { description, environment } : undefined;
|
|
214
|
+
return code || configurations ? { code, configurations } : undefined;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Compress a string as a file, returning a promise for the zip buffer
|
|
218
|
+
* https://github.com/archiverjs/node-archiver/issues/342
|
|
219
|
+
*/
|
|
220
|
+
function zipString(fileName, rawString) {
|
|
221
|
+
return new Promise((resolve, reject) => {
|
|
222
|
+
const buffers = [];
|
|
223
|
+
const converter = new stream_1.Writable();
|
|
224
|
+
converter._write = (chunk, _, callback) => {
|
|
225
|
+
buffers.push(chunk);
|
|
226
|
+
process.nextTick(callback);
|
|
227
|
+
};
|
|
228
|
+
converter.on('finish', () => {
|
|
229
|
+
resolve(Buffer.concat(buffers));
|
|
230
|
+
});
|
|
231
|
+
const archive = archiver('zip');
|
|
232
|
+
archive.on('error', (err) => {
|
|
233
|
+
reject(err);
|
|
234
|
+
});
|
|
235
|
+
archive.pipe(converter);
|
|
236
|
+
archive.append(rawString, {
|
|
237
|
+
name: fileName,
|
|
238
|
+
date: new Date('1980-01-01T00:00:00.000Z'), // Add date to make resulting zip file deterministic
|
|
239
|
+
});
|
|
240
|
+
void archive.finalize();
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* After a Lambda Function is updated, it cannot be updated again until the
|
|
245
|
+
* `State=Active` and the `LastUpdateStatus=Successful`.
|
|
246
|
+
*
|
|
247
|
+
* Depending on the configuration of the Lambda Function this could happen relatively quickly
|
|
248
|
+
* or very slowly. For example, Zip based functions _not_ in a VPC can take ~1 second whereas VPC
|
|
249
|
+
* or Container functions can take ~25 seconds (and 'idle' VPC functions can take minutes).
|
|
250
|
+
*/
|
|
251
|
+
async function waitForLambdasPropertiesUpdateToFinish(currentFunctionConfiguration, lambda, functionName) {
|
|
252
|
+
var _a;
|
|
253
|
+
const functionIsInVpcOrUsesDockerForCode = ((_a = currentFunctionConfiguration.VpcConfig) === null || _a === void 0 ? void 0 : _a.VpcId) || currentFunctionConfiguration.PackageType === 'Image';
|
|
254
|
+
// if the function is deployed in a VPC or if it is a container image function
|
|
255
|
+
// then the update will take much longer and we can wait longer between checks
|
|
256
|
+
// otherwise, the update will be quick, so a 1-second delay is fine
|
|
257
|
+
const delaySeconds = functionIsInVpcOrUsesDockerForCode ? 5 : 1;
|
|
258
|
+
await lambda.waitUntilFunctionUpdated(delaySeconds, {
|
|
259
|
+
FunctionName: functionName,
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Get file extension from Lambda runtime string.
|
|
264
|
+
* We use this extension to create a deployment package from Lambda inline code.
|
|
265
|
+
*/
|
|
266
|
+
function determineCodeFileExtFromRuntime(runtime) {
|
|
267
|
+
if (runtime.startsWith('node')) {
|
|
268
|
+
return 'js';
|
|
269
|
+
}
|
|
270
|
+
if (runtime.startsWith('python')) {
|
|
271
|
+
return 'py';
|
|
272
|
+
}
|
|
273
|
+
// Currently inline code only supports Node.js and Python, ignoring other runtimes.
|
|
274
|
+
// https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html#aws-properties-lambda-function-code-properties
|
|
275
|
+
throw new evaluate_cloudformation_template_1.CfnEvaluationException(`runtime ${runtime} is unsupported, only node.js and python runtimes are currently supported.`);
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Finds all Versions that reference an AWS::Lambda::Function with logical ID `logicalId`
|
|
279
|
+
* and Aliases that reference those Versions.
|
|
280
|
+
*/
|
|
281
|
+
async function versionsAndAliases(logicalId, evaluateCfnTemplate) {
|
|
282
|
+
// find all Lambda Versions that reference this Function
|
|
283
|
+
const versionsReferencingFunction = evaluateCfnTemplate
|
|
284
|
+
.findReferencesTo(logicalId)
|
|
285
|
+
.filter((r) => r.Type === 'AWS::Lambda::Version');
|
|
286
|
+
// find all Lambda Aliases that reference the above Versions
|
|
287
|
+
const aliasesReferencingVersions = (0, util_1.flatMap)(versionsReferencingFunction, v => evaluateCfnTemplate.findReferencesTo(v.LogicalId));
|
|
288
|
+
// Limited set of updates per function
|
|
289
|
+
// eslint-disable-next-line @cdklabs/promiseall-no-unbounded-parallelism
|
|
290
|
+
const aliasesNames = await Promise.all(aliasesReferencingVersions.map(a => { var _a; return evaluateCfnTemplate.evaluateCfnExpression((_a = a.Properties) === null || _a === void 0 ? void 0 : _a.Name); }));
|
|
291
|
+
return { versionsReferencingFunction, aliasesNames };
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Renders the string used in displaying Alias resource names that reference the specified Lambda Function
|
|
295
|
+
*/
|
|
296
|
+
async function renderAliases(logicalId, evaluateCfnTemplate, callbackfn) {
|
|
297
|
+
const aliasesNames = (await versionsAndAliases(logicalId, evaluateCfnTemplate)).aliasesNames;
|
|
298
|
+
// Limited set of updates per function
|
|
299
|
+
// eslint-disable-next-line @cdklabs/promiseall-no-unbounded-parallelism
|
|
300
|
+
return Promise.all(aliasesNames.map(callbackfn));
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Renders the string used in displaying Version resource names that reference the specified Lambda Function
|
|
304
|
+
*/
|
|
305
|
+
async function renderVersions(logicalId, evaluateCfnTemplate, versionString) {
|
|
306
|
+
const versions = (await versionsAndAliases(logicalId, evaluateCfnTemplate)).versionsReferencingFunction;
|
|
307
|
+
return versions.length > 0 ? versionString : [];
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLWZ1bmN0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImxhbWJkYS1mdW5jdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFZQSxnRkF3SUM7QUFwSkQsbUNBQWtDO0FBRWxDLHFDQUFrSDtBQUNsSCwrQ0FBbUQ7QUFDbkQscUNBQXFDO0FBRXJDLDBGQUFrSDtBQUVsSCx5RUFBeUU7QUFDekUsaUVBQWlFO0FBQ2pFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUU5QixLQUFLLFVBQVUsa0NBQWtDLENBQ3RELFNBQWlCLEVBQ2pCLE1BQW1DLEVBQ25DLG1CQUFtRDs7SUFFbkQseUNBQXlDO0lBQ3pDLHNEQUFzRDtJQUN0RCw2R0FBNkc7SUFDN0csMEVBQTBFO0lBQzFFLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssc0JBQXNCLEVBQUUsQ0FBQztRQUNwRCxPQUFPO1lBQ0w7Z0JBQ0UsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFlBQVksRUFBRSxzQkFBc0I7Z0JBQ3BDLGFBQWEsRUFBRSxFQUFFO2dCQUNqQixZQUFZLEVBQUUsRUFBRTtnQkFDaEIsT0FBTyxFQUFFLFFBQVE7Z0JBQ2pCLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBUyxFQUFFLEVBQUUsR0FBRSxDQUFDO2FBQy9CO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxrQ0FBa0M7SUFDbEMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxvQkFBb0IsRUFBRSxDQUFDO1FBQ2xELE9BQU8sb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssdUJBQXVCLEVBQUUsQ0FBQztRQUNyRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBd0IsRUFBRSxDQUFDO0lBQ3BDLE1BQU0saUJBQWlCLEdB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cG9ydCB7IHR5cGUgRnVuY3Rpb25Db25maWd1cmF0aW9uLCB0eXBlIFVwZGF0ZUZ1bmN0aW9uQ29uZmlndXJhdGlvbkNvbW1hbmRJbnB1dCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1sYW1iZGEnO1xuaW1wb3J0IHsgdHlwZSBDaGFuZ2VIb3Rzd2FwUmVzdWx0LCBjbGFzc2lmeUNoYW5nZXMsIHR5cGUgSG90c3dhcHBhYmxlQ2hhbmdlQ2FuZGlkYXRlLCBQcm9wRGlmZnMgfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi90b29sa2l0L2Vycm9yJztcbmltcG9ydCB7IGZsYXRNYXAgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB0eXBlIHsgSUxhbWJkYUNsaWVudCwgU0RLIH0gZnJvbSAnLi4vYXdzLWF1dGgnO1xuaW1wb3J0IHsgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbiwgdHlwZSBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUgfSBmcm9tICcuLi9ldmFsdWF0ZS1jbG91ZGZvcm1hdGlvbi10ZW1wbGF0ZSc7XG5cbi8vIG5hbWVzcGFjZSBvYmplY3QgaW1wb3J0cyB3b24ndCB3b3JrIGluIHRoZSBidW5kbGUgZm9yIGZ1bmN0aW9uIGV4cG9ydHNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5jb25zdCBhcmNoaXZlciA9IHJlcXVpcmUoJ2FyY2hpdmVyJyk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0hvdHN3YXBwYWJsZUxhbWJkYUZ1bmN0aW9uQ2hhbmdlKFxuICBsb2dpY2FsSWQ6IHN0cmluZyxcbiAgY2hhbmdlOiBIb3Rzd2FwcGFibGVDaGFuZ2VDYW5kaWRhdGUsXG4gIGV2YWx1YXRlQ2ZuVGVtcGxhdGU6IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSxcbik6IFByb21pc2U8Q2hhbmdlSG90c3dhcFJlc3VsdD4ge1xuICAvLyBpZiB0aGUgY2hhbmdlIGlzIGZvciBhIExhbWJkYSBWZXJzaW9uLFxuICAvLyBpZ25vcmUgaXQgYnkgcmV0dXJuaW5nIGFuIGVtcHR5IGhvdHN3YXAgb3BlcmF0aW9uIC1cbiAgLy8gd2Ugd2lsbCBwdWJsaXNoIGEgbmV3IHZlcnNpb24gd2hlbiB3ZSBnZXQgdG8gaG90c3dhcHBpbmcgdGhlIGFjdHVhbCBGdW5jdGlvbiB0aGlzIFZlcnNpb24gcG9pbnRzIHRvLCBiZWxvd1xuICAvLyAoVmVyc2lvbnMgY2FuJ3QgYmUgY2hhbmdlZCBpbiBDbG91ZEZvcm1hdGlvbiBhbnl3YXksIHRoZXkncmUgaW1tdXRhYmxlKVxuICBpZiAoY2hhbmdlLm5ld1ZhbHVlLlR5cGUgPT09ICdBV1M6OkxhbWJkYTo6VmVyc2lvbicpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBob3Rzd2FwcGFibGU6IHRydWUsXG4gICAgICAgIHJlc291cmNlVHlwZTogJ0FXUzo6TGFtYmRhOjpWZXJzaW9uJyxcbiAgICAgICAgcmVzb3VyY2VOYW1lczogW10sXG4gICAgICAgIHByb3BzQ2hhbmdlZDogW10sXG4gICAgICAgIHNlcnZpY2U6ICdsYW1iZGEnLFxuICAgICAgICBhcHBseTogYXN5bmMgKF9zZGs6IFNESykgPT4ge30sXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICAvLyB3ZSBoYW5kbGUgQWxpYXNlcyBzcGVjaWFsbHkgdG9vXG4gIGlmIChjaGFuZ2UubmV3VmFsdWUuVHlwZSA9PT0gJ0FXUzo6TGFtYmRhOjpBbGlhcycpIHtcbiAgICByZXR1cm4gY2xhc3NpZnlBbGlhc0NoYW5nZXMoY2hhbmdlKTtcbiAgfVxuXG4gIGlmIChjaGFuZ2UubmV3VmFsdWUuVHlwZSAhPT0gJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCByZXQ6IENoYW5nZUhvdHN3YXBSZXN1bHQgPSBbXTtcbiAgY29uc3QgY2xhc3NpZmllZENoYW5nZXMgPSBjbGFzc2lmeUNoYW5nZXMoY2hhbmdlLCBbJ0NvZGUnLCAnRW52aXJvbm1lbnQnLCAnRGVzY3JpcHRpb24nXSk7XG4gIGNsYXNzaWZpZWRDaGFuZ2VzLnJlcG9ydE5vbkhvdHN3YXBwYWJsZVByb3BlcnR5Q2hhbmdlcyhyZXQpO1xuXG4gIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGF3YWl0IGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZXN0YWJsaXNoUmVzb3VyY2VQaHlzaWNhbE5hbWUoXG4gICAgbG9naWNhbElkLFxuICAgIGNoYW5nZS5uZXdWYWx1ZS5Qcm9wZXJ0aWVzPy5GdW5jdGlvbk5hbWUsXG4gICk7XG4gIGNvbnN0IG5hbWVzT2ZIb3Rzd2FwcGFibGVDaGFuZ2VzID0gT2JqZWN0LmtleXMoY2xhc3NpZmllZENoYW5nZXMuaG90c3dhcHBhYmxlUHJvcHMpO1xuICBpZiAobmFtZXNPZkhvdHN3YXBwYWJsZUNoYW5nZXMubGVuZ3RoID4gMCkge1xuICAgIHJldC5wdXNoKHtcbiAgICAgIGhvdHN3YXBwYWJsZTogdHJ1ZSxcbiAgICAgIHJlc291cmNlVHlwZTogY2hhbmdlLm5ld1ZhbHVlLlR5cGUsXG4gICAgICBwcm9wc0NoYW5nZWQ6IG5hbWVzT2ZIb3Rzd2FwcGFibGVDaGFuZ2VzLFxuICAgICAgc2VydmljZTogJ2xhbWJkYScsXG4gICAgICByZXNvdXJjZU5hbWVzOiBbXG4gICAgICAgIGBMYW1iZGEgRnVuY3Rpb24gJyR7ZnVuY3Rpb25OYW1lfSdgLFxuICAgICAgICAvLyBhZGQgVmVyc2lvbiBoZXJlIGlmIHdlJ3JlIHB1Ymxpc2hpbmcgYSBuZXcgb25lXG4gICAgICAgIC4uLihhd2FpdCByZW5kZXJWZXJzaW9ucyhsb2dpY2FsSWQsIGV2YWx1YXRlQ2ZuVGVtcGxhdGUsIFtgTGFtYmRhIFZlcnNpb24gZm9yIEZ1bmN0aW9uICcke2Z1bmN0aW9uTmFtZX0nYF0pKSxcbiAgICAgICAgLy8gYWRkIGFueSBBbGlhc2VzIHRoYXQgd2UgYXJlIGhvdHN3YXBwaW5nIGhlcmVcbiAgICAgICAgLi4uKGF3YWl0IHJlbmRlckFsaWFzZXMoXG4gICAgICAgICAgbG9naWNhbElkLFxuICAgICAgICAgIGV2YWx1YXRlQ2ZuVGVtcGxhdGUsXG4gICAgICAgICAgYXN5bmMgKGFsaWFzKSA9PiBgTGFtYmRhIEFsaWFzICcke2FsaWFzfScgZm9yIEZ1bmN0aW9uICcke2Z1bmN0aW9uTmFtZX0nYCxcbiAgICAgICAgKSksXG4gICAgICBdLFxuICAgICAgYXBwbHk6IGFzeW5jIChzZGs6IFNESykgPT4ge1xuICAgICAgICBjb25zdCBsYW1iZGFDb2RlQ2hhbmdlID0gYXdhaXQgZXZhbHVhdGVMYW1iZGFGdW5jdGlvblByb3BzKFxuICAgICAgICAgIGNsYXNzaWZpZWRDaGFuZ2VzLmhvdHN3YXBwYWJsZVByb3BzLFxuICAgICAgICAgIGNoYW5nZS5uZXdWYWx1ZS5Qcm9wZXJ0aWVzPy5SdW50aW1lLFxuICAgICAgICAgIGV2YWx1YXRlQ2ZuVGVtcGxhdGUsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW1iZGFDb2RlQ2hhbmdlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZ1bmN0aW9uTmFtZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgdmVyc2lvbnNSZWZlcmVuY2luZ0Z1bmN0aW9uLCBhbGlhc2VzTmFtZXMgfSA9IGF3YWl0IHZlcnNpb25zQW5kQWxpYXNlcyhsb2dpY2FsSWQsIGV2YWx1YXRlQ2ZuVGVtcGxhdGUpO1xuICAgICAgICBjb25zdCBsYW1iZGEgPSBzZGsubGFtYmRhKCk7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbnM6IFByb21pc2U8YW55PltdID0gW107XG5cbiAgICAgICAgaWYgKGxhbWJkYUNvZGVDaGFuZ2UuY29kZSAhPT0gdW5kZWZpbmVkIHx8IGxhbWJkYUNvZGVDaGFuZ2UuY29uZmlndXJhdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChsYW1iZGFDb2RlQ2hhbmdlLmNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlRnVuY3Rpb25Db2RlUmVzcG9uc2UgPSBhd2FpdCBsYW1iZGEudXBkYXRlRnVuY3Rpb25Db2RlKHtcbiAgICAgICAgICAgICAgRnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICAgIFMzQnVja2V0OiBsYW1iZGFDb2RlQ2hhbmdlLmNvZGUuczNCdWNrZXQsXG4gICAgICAgICAgICAgIFMzS2V5OiBsYW1iZGFDb2RlQ2hhbmdlLmNvZGUuczNLZXksXG4gICAgICAgICAgICAgIEltYWdlVXJpOiBsYW1iZGFDb2RlQ2hhbmdlLmNvZGUuaW1hZ2VVcmksXG4gICAgICAgICAgICAgIFppcEZpbGU6IGxhbWJkYUNvZGVDaGFuZ2UuY29kZS5mdW5jdGlvbkNvZGVaaXAsXG4gICAgICAgICAgICAgIFMzT2JqZWN0VmVyc2lvbjogbGFtYmRhQ29kZUNoYW5nZS5jb2RlLnMzT2JqZWN0VmVyc2lvbixcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBhd2FpdCB3YWl0Rm9yTGFtYmRhc1Byb3BlcnRpZXNVcGRhdGVUb0ZpbmlzaCh1cGRhdGVGdW5jdGlvbkNvZGVSZXNwb25zZSwgbGFtYmRhLCBmdW5jdGlvbk5hbWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChsYW1iZGFDb2RlQ2hhbmdlLmNvbmZpZ3VyYXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZVJlcXVlc3Q6IFVwZGF0ZUZ1bmN0aW9uQ29uZmlndXJhdGlvbkNvbW1hbmRJbnB1dCA9IHtcbiAgICAgICAgICAgICAgRnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGxhbWJkYUNvZGVDaGFuZ2UuY29uZmlndXJhdGlvbnMuZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB1cGRhdGVSZXF1ZXN0LkRlc2NyaXB0aW9uID0gbGFtYmRhQ29kZUNoYW5nZS5jb25maWd1cmF0aW9ucy5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsYW1iZGFDb2RlQ2hhbmdlLmNvbmZpZ3VyYXRpb25zLmVudmlyb25tZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdXBkYXRlUmVxdWVzdC5FbnZpcm9ubWVudCA9IGxhbWJkYUNvZGVDaGFuZ2UuY29uZmlndXJhdGlvbnMuZW52aXJvbm1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVGdW5jdGlvbkNvZGVSZXNwb25zZSA9IGF3YWl0IGxhbWJkYS51cGRhdGVGdW5jdGlvbkNvbmZpZ3VyYXRpb24odXBkYXRlUmVxdWVzdCk7XG4gICAgICAgICAgICBhd2FpdCB3YWl0Rm9yTGFtYmRhc1Byb3BlcnRpZXNVcGRhdGVUb0ZpbmlzaCh1cGRhdGVGdW5jdGlvbkNvZGVSZXNwb25zZSwgbGFtYmRhLCBmdW5jdGlvbk5hbWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIG9ubHkgaWYgdGhlIGNvZGUgY2hhbmdlZCBpcyB0aGVyZSBhbnkgcG9pbnQgaW4gcHVibGlzaGluZyBhIG5ldyBWZXJzaW9uXG4gICAgICAgICAgaWYgKHZlcnNpb25zUmVmZXJlbmNpbmdGdW5jdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBwdWJsaXNoVmVyc2lvblByb21pc2UgPSBsYW1iZGEucHVibGlzaFZlcnNpb24oe1xuICAgICAgICAgICAgICBGdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoYWxpYXNlc05hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgVmVyc2lvbiB0byBmaW5pc2ggcHVibGlzaGluZ1xuICAgICAgICAgICAgICBjb25zdCB2ZXJzaW9uVXBkYXRlID0gYXdhaXQgcHVibGlzaFZlcnNpb25Qcm9taXNlO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFsaWFzIG9mIGFsaWFzZXNOYW1lcykge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICAgIGxhbWJkYS51cGRhdGVBbGlhcyh7XG4gICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgICAgICAgICBOYW1lOiBhbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25WZXJzaW9uOiB2ZXJzaW9uVXBkYXRlLlZlcnNpb24sXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvcGVyYXRpb25zLnB1c2gocHVibGlzaFZlcnNpb25Qcm9taXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBydW4gYWxsIG9mIG91ciB1cGRhdGVzIGluIHBhcmFsbGVsXG4gICAgICAgIC8vIExpbWl0ZWQgc2V0IG9mIHVwZGF0ZXMgcGVyIGZ1bmN0aW9uXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAY2RrbGFicy9wcm9taXNlYWxsLW5vLXVuYm91bmRlZC1wYXJhbGxlbGlzbVxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChvcGVyYXRpb25zKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hpY2ggY2hhbmdlcyB0byB0aGlzIEFsaWFzIGFyZSBob3Rzd2FwcGFibGUgb3Igbm90XG4gKi9cbmZ1bmN0aW9uIGNsYXNzaWZ5QWxpYXNDaGFuZ2VzKGNoYW5nZTogSG90c3dhcHBhYmxlQ2hhbmdlQ2FuZGlkYXRlKTogQ2hhbmdlSG90c3dhcFJlc3VsdCB7XG4gIGNvbnN0IHJldDogQ2hhbmdlSG90c3dhcFJlc3VsdCA9IFtdO1xuICBjb25zdCBjbGFzc2lmaWVkQ2hhbmdlcyA9IGNsYXNzaWZ5Q2hhbmdlcyhjaGFuZ2UsIFsnRnVuY3Rpb25WZXJzaW9uJ10pO1xuICBjbGFzc2lmaWVkQ2hhbmdlcy5yZXBvcnROb25Ib3Rzd2FwcGFibGVQcm9wZXJ0eUNoYW5nZXMocmV0KTtcblxuICBjb25zdCBuYW1lc09mSG90c3dhcHBhYmxlQ2hhbmdlcyA9IE9iamVjdC5rZXlzKGNsYXNzaWZpZWRDaGFuZ2VzLmhvdHN3YXBwYWJsZVByb3BzKTtcbiAgaWYgKG5hbWVzT2ZIb3Rzd2FwcGFibGVDaGFuZ2VzLmxlbmd0aCA+IDApIHtcbiAgICByZXQucHVzaCh7XG4gICAgICBob3Rzd2FwcGFibGU6IHRydWUsXG4gICAgICByZXNvdXJjZVR5cGU6IGNoYW5nZS5uZXdWYWx1ZS5UeXBlLFxuICAgICAgcHJvcHNDaGFuZ2VkOiBbXSxcbiAgICAgIHNlcnZpY2U6ICdsYW1iZGEnLFxuICAgICAgcmVzb3VyY2VOYW1lczogW10sXG4gICAgICBhcHBseTogYXN5bmMgKF9zZGs6IFNESykgPT4ge30sXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIEV2YWx1YXRlcyB0aGUgaG90c3dhcHBhYmxlIHByb3BlcnRpZXMgb2YgYW4gQVdTOjpMYW1iZGE6OkZ1bmN0aW9uIGFuZFxuICogUmV0dXJucyBhIGBMYW1iZGFGdW5jdGlvbkNoYW5nZWAgaWYgdGhlIGNoYW5nZSBpcyBob3Rzd2FwcGFibGUuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSBjaGFuZ2UgaXMgbm90IGhvdHN3YXBwYWJsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXZhbHVhdGVMYW1iZGFGdW5jdGlvblByb3BzKFxuICBob3Rzd2FwcGFibGVQcm9wQ2hhbmdlczogUHJvcERpZmZzLFxuICBydW50aW1lOiBzdHJpbmcsXG4gIGV2YWx1YXRlQ2ZuVGVtcGxhdGU6IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSxcbik6IFByb21pc2U8TGFtYmRhRnVuY3Rpb25DaGFuZ2UgfCB1bmRlZmluZWQ+IHtcbiAgLypcbiAgICogQXQgZmlyc3QgZ2xhbmNlLCB3ZSB3b3VsZCB3YW50IHRvIGluaXRpYWxpemUgdGhlc2UgdXNpbmcgdGhlIFwicHJldmlvdXNcIiB2YWx1ZXMgKGNoYW5nZS5vbGRWYWx1ZSksXG4gICAqIGluIGNhc2Ugb25seSBvbmUgb2YgdGhlbSBjaGFuZ2VkLCBsaWtlIHRoZSBrZXksIGFuZCB0aGUgQnVja2V0IHN0YXllZCB0aGUgc2FtZS5cbiAgICogSG93ZXZlciwgdGhhdCBhY3R1YWxseSBmYWlscyBmb3Igb2xkLXN0eWxlIHN5bnRoZXNpcywgd2hpY2ggdXNlcyBDRk4gUGFyYW1ldGVycyFcbiAgICogQmVjYXVzZSB0aGUgbmFtZXMgb2YgdGhlIFBhcmFtZXRlcnMgZGVwZW5kIG9uIHRoZSBoYXNoIG9mIHRoZSBBc3NldCxcbiAgICogdGhlIFBhcmFtZXRlcnMgdXNlZCBmb3IgdGhlIFwib2xkXCIgdmFsdWVzIG5vIGxvbmdlciBleGlzdCBpbiBgYXNzZXRQYXJhbXNgIGF0IHRoaXMgcG9pbnQsXG4gICAqIHdoaWNoIG1lYW5zIHdlIGRvbid0IGhhdmUgdGhlIGNvcnJlY3QgdmFsdWVzIGF2YWlsYWJsZSB0byBldmFsdWF0ZSB0aGUgQ0ZOIGV4cHJlc3Npb24gd2l0aC5cbiAgICogRm9ydHVuYXRlbHksIHRoZSBkaWZmIHdpbGwgYWx3YXlzIGluY2x1ZGUgYm90aCB0aGUgczNCdWNrZXQgYW5kIHMzS2V5IHBhcnRzIG9mIHRoZSBMYW1iZGEncyBDb2RlIHByb3BlcnR5LFxuICAgKiBldmVuIGlmIG9ubHkgb25lIG9mIHRoZW0gd2FzIGFjdHVhbGx5IGNoYW5nZWQsXG4gICAqIHdoaWNoIG1lYW5zIHdlIGRvbid0IG5lZWQgdGhlIFwib2xkXCIgdmFsdWVzIGF0IGFsbCwgYW5kIHdlIGNhbiBzYWZlbHkgaW5pdGlhbGl6ZSB0aGVzZSB3aXRoIGp1c3QgYCcnYC5cbiAgICovXG4gIGxldCBjb2RlOiBMYW1iZGFGdW5jdGlvbkNvZGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIGxldCBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBsZXQgZW52aXJvbm1lbnQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCB1cGRhdGVkUHJvcE5hbWUgaW4gaG90c3dhcHBhYmxlUHJvcENoYW5nZXMpIHtcbiAgICBjb25zdCB1cGRhdGVkUHJvcCA9IGhvdHN3YXBwYWJsZVByb3BDaGFuZ2VzW3VwZGF0ZWRQcm9wTmFtZV07XG5cbiAgICBzd2l0Y2ggKHVwZGF0ZWRQcm9wTmFtZSkge1xuICAgICAgY2FzZSAnQ29kZSc6XG4gICAgICAgIGxldCBzM0J1Y2tldCwgczNLZXksIHMzT2JqZWN0VmVyc2lvbiwgaW1hZ2VVcmksIGZ1bmN0aW9uQ29kZVppcDtcblxuICAgICAgICBmb3IgKGNvbnN0IG5ld1Byb3BOYW1lIGluIHVwZGF0ZWRQcm9wLm5ld1ZhbHVlKSB7XG4gICAgICAgICAgc3dpdGNoIChuZXdQcm9wTmFtZSkge1xuICAgICAgICAgICAgY2FzZSAnUzNCdWNrZXQnOlxuICAgICAgICAgICAgICBzM0J1Y2tldCA9IGF3YWl0IGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZXZhbHVhdGVDZm5FeHByZXNzaW9uKHVwZGF0ZWRQcm9wLm5ld1ZhbHVlW25ld1Byb3BOYW1lXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnUzNLZXknOlxuICAgICAgICAgICAgICBzM0tleSA9IGF3YWl0IGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZXZhbHVhdGVDZm5FeHByZXNzaW9uKHVwZGF0ZWRQcm9wLm5ld1ZhbHVlW25ld1Byb3BOYW1lXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnUzNPYmplY3RWZXJzaW9uJzpcbiAgICAgICAgICAgICAgczNPYmplY3RWZXJzaW9uID0gYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5ldmFsdWF0ZUNmbkV4cHJlc3Npb24odXBkYXRlZFByb3AubmV3VmFsdWVbbmV3UHJvcE5hbWVdKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdJbWFnZVVyaSc6XG4gICAgICAgICAgICAgIGltYWdlVXJpID0gYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5ldmFsdWF0ZUNmbkV4cHJlc3Npb24odXBkYXRlZFByb3AubmV3VmFsdWVbbmV3UHJvcE5hbWVdKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdaaXBGaWxlJzpcbiAgICAgICAgICAgICAgLy8gV2UgbXVzdCBjcmVhdGUgYSB6aXAgcGFja2FnZSBjb250YWluaW5nIGEgZmlsZSB3aXRoIHRoZSBpbmxpbmUgY29kZVxuICAgICAgICAgICAgICBjb25zdCBmdW5jdGlvbkNvZGUgPSBhd2FpdCBldmFsdWF0ZUNmblRlbXBsYXRlLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbih1cGRhdGVkUHJvcC5uZXdWYWx1ZVtuZXdQcm9wTmFtZV0pO1xuICAgICAgICAgICAgICBjb25zdCBmdW5jdGlvblJ1bnRpbWUgPSBhd2FpdCBldmFsdWF0ZUNmblRlbXBsYXRlLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihydW50aW1lKTtcbiAgICAgICAgICAgICAgaWYgKCFmdW5jdGlvblJ1bnRpbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIGZpbGUgZXh0ZW5zaW9uIG11c3QgYmUgY2hvc2VuIGRlcGVuZGluZyBvbiB0aGUgcnVudGltZVxuICAgICAgICAgICAgICBjb25zdCBjb2RlRmlsZUV4dCA9IGRldGVybWluZUNvZGVGaWxlRXh0RnJvbVJ1bnRpbWUoZnVuY3Rpb25SdW50aW1lKTtcbiAgICAgICAgICAgICAgZnVuY3Rpb25Db2RlWmlwID0gYXdhaXQgemlwU3RyaW5nKGBpbmRleC4ke2NvZGVGaWxlRXh0fWAsIGZ1bmN0aW9uQ29kZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb2RlID0ge1xuICAgICAgICAgIHMzQnVja2V0LFxuICAgICAgICAgIHMzS2V5LFxuICAgICAgICAgIHMzT2JqZWN0VmVyc2lvbixcbiAgICAgICAgICBpbWFnZVVyaSxcbiAgICAgICAgICBmdW5jdGlvbkNvZGVaaXAsXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRGVzY3JpcHRpb24nOlxuICAgICAgICBkZXNjcmlwdGlvbiA9IGF3YWl0IGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZXZhbHVhdGVDZm5FeHByZXNzaW9uKHVwZGF0ZWRQcm9wLm5ld1ZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFbnZpcm9ubWVudCc6XG4gICAgICAgIGVudmlyb25tZW50ID0gYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5ldmFsdWF0ZUNmbkV4cHJlc3Npb24odXBkYXRlZFByb3AubmV3VmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIHdlIHdpbGwgbmV2ZXIgZ2V0IGhlcmUsIGJ1dCBqdXN0IGluIGNhc2Ugd2UgZG8gdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihcbiAgICAgICAgICAnd2hpbGUgYXBwbHkoKWluZywgZm91bmQgYSBwcm9wZXJ0eSB0aGF0IGNhbm5vdCBiZSBob3Rzd2FwcGVkLiBQbGVhc2UgcmVwb3J0IHRoaXMgYXQgZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvbmV3L2Nob29zZScsXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29uZmlndXJhdGlvbnMgPSBkZXNjcmlwdGlvbiB8fCBlbnZpcm9ubWVudCA/IHsgZGVzY3JpcHRpb24sIGVudmlyb25tZW50IH0gOiB1bmRlZmluZWQ7XG4gIHJldHVybiBjb2RlIHx8IGNvbmZpZ3VyYXRpb25zID8geyBjb2RlLCBjb25maWd1cmF0aW9ucyB9IDogdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgTGFtYmRhRnVuY3Rpb25Db2RlIHtcbiAgcmVhZG9ubHkgczNCdWNrZXQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHMzS2V5Pzogc3RyaW5nO1xuICByZWFkb25seSBzM09iamVjdFZlcnNpb24/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGltYWdlVXJpPzogc3RyaW5nO1xuICByZWFkb25seSBmdW5jdGlvbkNvZGVaaXA/OiBCdWZmZXI7XG59XG5cbmludGVyZmFjZSBMYW1iZGFGdW5jdGlvbkNvbmZpZ3VyYXRpb25zIHtcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudmlyb25tZW50PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuaW50ZXJmYWNlIExhbWJkYUZ1bmN0aW9uQ2hhbmdlIHtcbiAgcmVhZG9ubHkgY29kZT86IExhbWJkYUZ1bmN0aW9uQ29kZTtcbiAgcmVhZG9ubHkgY29uZmlndXJhdGlvbnM/OiBMYW1iZGFGdW5jdGlvbkNvbmZpZ3VyYXRpb25zO1xufVxuXG4vKipcbiAqIENvbXByZXNzIGEgc3RyaW5nIGFzIGEgZmlsZSwgcmV0dXJuaW5nIGEgcHJvbWlzZSBmb3IgdGhlIHppcCBidWZmZXJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcmNoaXZlcmpzL25vZGUtYXJjaGl2ZXIvaXNzdWVzLzM0MlxuICovXG5mdW5jdGlvbiB6aXBTdHJpbmcoZmlsZU5hbWU6IHN0cmluZywgcmF3U3RyaW5nOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGJ1ZmZlcnM6IEJ1ZmZlcltdID0gW107XG5cbiAgICBjb25zdCBjb252ZXJ0ZXIgPSBuZXcgV3JpdGFibGUoKTtcblxuICAgIGNvbnZlcnRlci5fd3JpdGUgPSAoY2h1bms6IEJ1ZmZlciwgXzogc3RyaW5nLCBjYWxsYmFjazogKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgYnVmZmVycy5wdXNoKGNodW5rKTtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spO1xuICAgIH07XG5cbiAgICBjb252ZXJ0ZXIub24oJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgIHJlc29sdmUoQnVmZmVyLmNvbmNhdChidWZmZXJzKSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhcmNoaXZlID0gYXJjaGl2ZXIoJ3ppcCcpO1xuXG4gICAgYXJjaGl2ZS5vbignZXJyb3InLCAoZXJyOiBhbnkpID0+IHtcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH0pO1xuXG4gICAgYXJjaGl2ZS5waXBlKGNvbnZlcnRlcik7XG5cbiAgICBhcmNoaXZlLmFwcGVuZChyYXdTdHJpbmcsIHtcbiAgICAgIG5hbWU6IGZpbGVOYW1lLFxuICAgICAgZGF0ZTogbmV3IERhdGUoJzE5ODAtMDEtMDFUMDA6MDA6MDAuMDAwWicpLCAvLyBBZGQgZGF0ZSB0byBtYWtlIHJlc3VsdGluZyB6aXAgZmlsZSBkZXRlcm1pbmlzdGljXG4gICAgfSk7XG5cbiAgICB2b2lkIGFyY2hpdmUuZmluYWxpemUoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQWZ0ZXIgYSBMYW1iZGEgRnVuY3Rpb24gaXMgdXBkYXRlZCwgaXQgY2Fubm90IGJlIHVwZGF0ZWQgYWdhaW4gdW50aWwgdGhlXG4gKiBgU3RhdGU9QWN0aXZlYCBhbmQgdGhlIGBMYXN0VXBkYXRlU3RhdHVzPVN1Y2Nlc3NmdWxgLlxuICpcbiAqIERlcGVuZGluZyBvbiB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgTGFtYmRhIEZ1bmN0aW9uIHRoaXMgY291bGQgaGFwcGVuIHJlbGF0aXZlbHkgcXVpY2tseVxuICogb3IgdmVyeSBzbG93bHkuIEZvciBleGFtcGxlLCBaaXAgYmFzZWQgZnVuY3Rpb25zIF9ub3RfIGluIGEgVlBDIGNhbiB0YWtlIH4xIHNlY29uZCB3aGVyZWFzIFZQQ1xuICogb3IgQ29udGFpbmVyIGZ1bmN0aW9ucyBjYW4gdGFrZSB+MjUgc2Vjb25kcyAoYW5kICdpZGxlJyBWUEMgZnVuY3Rpb25zIGNhbiB0YWtlIG1pbnV0ZXMpLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yTGFtYmRhc1Byb3BlcnRpZXNVcGRhdGVUb0ZpbmlzaChcbiAgY3VycmVudEZ1bmN0aW9uQ29uZmlndXJhdGlvbjogRnVuY3Rpb25Db25maWd1cmF0aW9uLFxuICBsYW1iZGE6IElMYW1iZGFDbGllbnQsXG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZ1bmN0aW9uSXNJblZwY09yVXNlc0RvY2tlckZvckNvZGUgPVxuICAgIGN1cnJlbnRGdW5jdGlvbkNvbmZpZ3VyYXRpb24uVnBjQ29uZmlnPy5WcGNJZCB8fCBjdXJyZW50RnVuY3Rpb25Db25maWd1cmF0aW9uLlBhY2thZ2VUeXBlID09PSAnSW1hZ2UnO1xuXG4gIC8vIGlmIHRoZSBmdW5jdGlvbiBpcyBkZXBsb3llZCBpbiBhIFZQQyBvciBpZiBpdCBpcyBhIGNvbnRhaW5lciBpbWFnZSBmdW5jdGlvblxuICAvLyB0aGVuIHRoZSB1cGRhdGUgd2lsbCB0YWtlIG11Y2ggbG9uZ2VyIGFuZCB3ZSBjYW4gd2FpdCBsb25nZXIgYmV0d2VlbiBjaGVja3NcbiAgLy8gb3RoZXJ3aXNlLCB0aGUgdXBkYXRlIHdpbGwgYmUgcXVpY2ssIHNvIGEgMS1zZWNvbmQgZGVsYXkgaXMgZmluZVxuICBjb25zdCBkZWxheVNlY29uZHMgPSBmdW5jdGlvbklzSW5WcGNPclVzZXNEb2NrZXJGb3JDb2RlID8gNSA6IDE7XG5cbiAgYXdhaXQgbGFtYmRhLndhaXRVbnRpbEZ1bmN0aW9uVXBkYXRlZChkZWxheVNlY29uZHMsIHtcbiAgICBGdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IGZpbGUgZXh0ZW5zaW9uIGZyb20gTGFtYmRhIHJ1bnRpbWUgc3RyaW5nLlxuICogV2UgdXNlIHRoaXMgZXh0ZW5zaW9uIHRvIGNyZWF0ZSBhIGRlcGxveW1lbnQgcGFja2FnZSBmcm9tIExhbWJkYSBpbmxpbmUgY29kZS5cbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5lQ29kZUZpbGVFeHRGcm9tUnVudGltZShydW50aW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAocnVudGltZS5zdGFydHNXaXRoKCdub2RlJykpIHtcbiAgICByZXR1cm4gJ2pzJztcbiAgfVxuICBpZiAocnVudGltZS5zdGFydHNXaXRoKCdweXRob24nKSkge1xuICAgIHJldHVybiAncHknO1xuICB9XG4gIC8vIEN1cnJlbnRseSBpbmxpbmUgY29kZSBvbmx5IHN1cHBvcnRzIE5vZGUuanMgYW5kIFB5dGhvbiwgaWdub3Jpbmcgb3RoZXIgcnVudGltZXMuXG4gIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWxhbWJkYS1mdW5jdGlvbi1jb2RlLmh0bWwjYXdzLXByb3BlcnRpZXMtbGFtYmRhLWZ1bmN0aW9uLWNvZGUtcHJvcGVydGllc1xuICB0aHJvdyBuZXcgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbihcbiAgICBgcnVudGltZSAke3J1bnRpbWV9IGlzIHVuc3VwcG9ydGVkLCBvbmx5IG5vZGUuanMgYW5kIHB5dGhvbiBydW50aW1lcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC5gLFxuICApO1xufVxuXG4vKipcbiAqIEZpbmRzIGFsbCBWZXJzaW9ucyB0aGF0IHJlZmVyZW5jZSBhbiBBV1M6OkxhbWJkYTo6RnVuY3Rpb24gd2l0aCBsb2dpY2FsIElEIGBsb2dpY2FsSWRgXG4gKiBhbmQgQWxpYXNlcyB0aGF0IHJlZmVyZW5jZSB0aG9zZSBWZXJzaW9ucy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdmVyc2lvbnNBbmRBbGlhc2VzKGxvZ2ljYWxJZDogc3RyaW5nLCBldmFsdWF0ZUNmblRlbXBsYXRlOiBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUpIHtcbiAgLy8gZmluZCBhbGwgTGFtYmRhIFZlcnNpb25zIHRoYXQgcmVmZXJlbmNlIHRoaXMgRnVuY3Rpb25cbiAgY29uc3QgdmVyc2lvbnNSZWZlcmVuY2luZ0Z1bmN0aW9uID0gZXZhbHVhdGVDZm5UZW1wbGF0ZVxuICAgIC5maW5kUmVmZXJlbmNlc1RvKGxvZ2ljYWxJZClcbiAgICAuZmlsdGVyKChyKSA9PiByLlR5cGUgPT09ICdBV1M6OkxhbWJkYTo6VmVyc2lvbicpO1xuICAvLyBmaW5kIGFsbCBMYW1iZGEgQWxpYXNlcyB0aGF0IHJlZmVyZW5jZSB0aGUgYWJvdmUgVmVyc2lvbnNcbiAgY29uc3QgYWxpYXNlc1JlZmVyZW5jaW5nVmVyc2lvbnMgPSBmbGF0TWFwKHZlcnNpb25zUmVmZXJlbmNpbmdGdW5jdGlvbiwgdiA9PlxuICAgIGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZmluZFJlZmVyZW5jZXNUbyh2LkxvZ2ljYWxJZCkpO1xuICAvLyBMaW1pdGVkIHNldCBvZiB1cGRhdGVzIHBlciBmdW5jdGlvblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGNka2xhYnMvcHJvbWlzZWFsbC1uby11bmJvdW5kZWQtcGFyYWxsZWxpc21cbiAgY29uc3QgYWxpYXNlc05hbWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoYWxpYXNlc1JlZmVyZW5jaW5nVmVyc2lvbnMubWFwKGEgPT5cbiAgICBldmFsdWF0ZUNmblRlbXBsYXRlLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihhLlByb3BlcnRpZXM/Lk5hbWUpKSk7XG5cbiAgcmV0dXJuIHsgdmVyc2lvbnNSZWZlcmVuY2luZ0Z1bmN0aW9uLCBhbGlhc2VzTmFtZXMgfTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIHRoZSBzdHJpbmcgdXNlZCBpbiBkaXNwbGF5aW5nIEFsaWFzIHJlc291cmNlIG5hbWVzIHRoYXQgcmVmZXJlbmNlIHRoZSBzcGVjaWZpZWQgTGFtYmRhIEZ1bmN0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlbmRlckFsaWFzZXMoXG4gIGxvZ2ljYWxJZDogc3RyaW5nLFxuICBldmFsdWF0ZUNmblRlbXBsYXRlOiBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUsXG4gIGNhbGxiYWNrZm46ICh2YWx1ZTogYW55LCBpbmRleDogbnVtYmVyLCBhcnJheTogYW55W10pID0+IFByb21pc2U8c3RyaW5nPixcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgYWxpYXNlc05hbWVzID0gKGF3YWl0IHZlcnNpb25zQW5kQWxpYXNlcyhsb2dpY2FsSWQsIGV2YWx1YXRlQ2ZuVGVtcGxhdGUpKS5hbGlhc2VzTmFtZXM7XG5cbiAgLy8gTGltaXRlZCBzZXQgb2YgdXBkYXRlcyBwZXIgZnVuY3Rpb25cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBjZGtsYWJzL3Byb21pc2VhbGwtbm8tdW5ib3VuZGVkLXBhcmFsbGVsaXNtXG4gIHJldHVybiBQcm9taXNlLmFsbChhbGlhc2VzTmFtZXMubWFwKGNhbGxiYWNrZm4pKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIHRoZSBzdHJpbmcgdXNlZCBpbiBkaXNwbGF5aW5nIFZlcnNpb24gcmVzb3VyY2UgbmFtZXMgdGhhdCByZWZlcmVuY2UgdGhlIHNwZWNpZmllZCBMYW1iZGEgRnVuY3Rpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVuZGVyVmVyc2lvbnMoXG4gIGxvZ2ljYWxJZDogc3RyaW5nLFxuICBldmFsdWF0ZUNmblRlbXBsYXRlOiBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUsXG4gIHZlcnNpb25TdHJpbmc6IHN0cmluZ1tdLFxuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCB2ZXJzaW9ucyA9IChhd2FpdCB2ZXJzaW9uc0FuZEFsaWFzZXMobG9naWNhbElkLCBldmFsdWF0ZUNmblRlbXBsYXRlKSkudmVyc2lvbnNSZWZlcmVuY2luZ0Z1bmN0aW9uO1xuXG4gIHJldHVybiB2ZXJzaW9ucy5sZW5ndGggPiAwID8gdmVyc2lvblN0cmluZyA6IFtdO1xufVxuIl19
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ChangeHotswapResult, HotswappableChangeCandidate } from './common';
|
|
2
|
+
import type { EvaluateCloudFormationTemplate } from '../evaluate-cloudformation-template';
|
|
3
|
+
/**
|
|
4
|
+
* This means that the value is required to exist by CloudFormation's Custom Resource API (or our S3 Bucket Deployment Lambda's API)
|
|
5
|
+
* but the actual value specified is irrelevant
|
|
6
|
+
*/
|
|
7
|
+
export declare const REQUIRED_BY_CFN = "required-to-be-present-by-cfn";
|
|
8
|
+
export declare function isHotswappableS3BucketDeploymentChange(_logicalId: string, change: HotswappableChangeCandidate, evaluateCfnTemplate: EvaluateCloudFormationTemplate): Promise<ChangeHotswapResult>;
|
|
9
|
+
export declare function skipChangeForS3DeployCustomResourcePolicy(iamPolicyLogicalId: string, change: HotswappableChangeCandidate, evaluateCfnTemplate: EvaluateCloudFormationTemplate): Promise<boolean>;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.REQUIRED_BY_CFN = void 0;
|
|
4
|
+
exports.isHotswappableS3BucketDeploymentChange = isHotswappableS3BucketDeploymentChange;
|
|
5
|
+
exports.skipChangeForS3DeployCustomResourcePolicy = skipChangeForS3DeployCustomResourcePolicy;
|
|
6
|
+
/**
|
|
7
|
+
* This means that the value is required to exist by CloudFormation's Custom Resource API (or our S3 Bucket Deployment Lambda's API)
|
|
8
|
+
* but the actual value specified is irrelevant
|
|
9
|
+
*/
|
|
10
|
+
exports.REQUIRED_BY_CFN = 'required-to-be-present-by-cfn';
|
|
11
|
+
async function isHotswappableS3BucketDeploymentChange(_logicalId, change, evaluateCfnTemplate) {
|
|
12
|
+
// In old-style synthesis, the policy used by the lambda to copy assets Ref's the assets directly,
|
|
13
|
+
// meaning that the changes made to the Policy are artifacts that can be safely ignored
|
|
14
|
+
const ret = [];
|
|
15
|
+
if (change.newValue.Type !== 'Custom::CDKBucketDeployment') {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
// no classification to be done here; all the properties of this custom resource thing are hotswappable
|
|
19
|
+
const customResourceProperties = await evaluateCfnTemplate.evaluateCfnExpression({
|
|
20
|
+
...change.newValue.Properties,
|
|
21
|
+
ServiceToken: undefined,
|
|
22
|
+
});
|
|
23
|
+
ret.push({
|
|
24
|
+
hotswappable: true,
|
|
25
|
+
resourceType: change.newValue.Type,
|
|
26
|
+
propsChanged: ['*'],
|
|
27
|
+
service: 'custom-s3-deployment',
|
|
28
|
+
resourceNames: [`Contents of S3 Bucket '${customResourceProperties.DestinationBucketName}'`],
|
|
29
|
+
apply: async (sdk) => {
|
|
30
|
+
var _a;
|
|
31
|
+
// note that this gives the ARN of the lambda, not the name. This is fine though, the invoke() sdk call will take either
|
|
32
|
+
const functionName = await evaluateCfnTemplate.evaluateCfnExpression((_a = change.newValue.Properties) === null || _a === void 0 ? void 0 : _a.ServiceToken);
|
|
33
|
+
if (!functionName) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
await sdk.lambda().invokeCommand({
|
|
37
|
+
FunctionName: functionName,
|
|
38
|
+
// Lambda refuses to take a direct JSON object and requires it to be stringify()'d
|
|
39
|
+
Payload: JSON.stringify({
|
|
40
|
+
RequestType: 'Update',
|
|
41
|
+
ResponseURL: exports.REQUIRED_BY_CFN,
|
|
42
|
+
PhysicalResourceId: exports.REQUIRED_BY_CFN,
|
|
43
|
+
StackId: exports.REQUIRED_BY_CFN,
|
|
44
|
+
RequestId: exports.REQUIRED_BY_CFN,
|
|
45
|
+
LogicalResourceId: exports.REQUIRED_BY_CFN,
|
|
46
|
+
ResourceProperties: stringifyObject(customResourceProperties), // JSON.stringify() doesn't turn the actual objects to strings, but the lambda expects strings
|
|
47
|
+
}),
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
return ret;
|
|
52
|
+
}
|
|
53
|
+
async function skipChangeForS3DeployCustomResourcePolicy(iamPolicyLogicalId, change, evaluateCfnTemplate) {
|
|
54
|
+
var _a;
|
|
55
|
+
if (change.newValue.Type !== 'AWS::IAM::Policy') {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
const roles = (_a = change.newValue.Properties) === null || _a === void 0 ? void 0 : _a.Roles;
|
|
59
|
+
// If no roles are referenced, the policy is definitely not used for a S3Deployment
|
|
60
|
+
if (!roles || !roles.length) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
// Check if every role this policy is referenced by is only used for a S3Deployment
|
|
64
|
+
for (const role of roles) {
|
|
65
|
+
const roleArn = await evaluateCfnTemplate.evaluateCfnExpression(role);
|
|
66
|
+
const roleLogicalId = await evaluateCfnTemplate.findLogicalIdForPhysicalName(roleArn);
|
|
67
|
+
// We must assume this role is used for something else, because we can't check it
|
|
68
|
+
if (!roleLogicalId) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
// Find all interesting reference to the role
|
|
72
|
+
const roleRefs = evaluateCfnTemplate
|
|
73
|
+
.findReferencesTo(roleLogicalId)
|
|
74
|
+
// we are not interested in the reference from the original policy - it always exists
|
|
75
|
+
.filter((roleRef) => !(roleRef.Type == 'AWS::IAM::Policy' && roleRef.LogicalId === iamPolicyLogicalId));
|
|
76
|
+
// Check if the role is only used for S3Deployment
|
|
77
|
+
// We know this is the case, if S3Deployment -> Lambda -> Role is satisfied for every reference
|
|
78
|
+
// And we have at least one reference.
|
|
79
|
+
const isRoleOnlyForS3Deployment = roleRefs.length >= 1 &&
|
|
80
|
+
roleRefs.every((roleRef) => {
|
|
81
|
+
if (roleRef.Type === 'AWS::Lambda::Function') {
|
|
82
|
+
const lambdaRefs = evaluateCfnTemplate.findReferencesTo(roleRef.LogicalId);
|
|
83
|
+
// Every reference must be to the custom resource and at least one reference must be present
|
|
84
|
+
return (lambdaRefs.length >= 1 && lambdaRefs.every((lambdaRef) => lambdaRef.Type === 'Custom::CDKBucketDeployment'));
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
});
|
|
88
|
+
// We have determined this role is used for something else, so we can't skip the change
|
|
89
|
+
if (!isRoleOnlyForS3Deployment) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// We have checked that any use of this policy is only for S3Deployment and we can safely skip it
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
function stringifyObject(obj) {
|
|
97
|
+
if (obj == null) {
|
|
98
|
+
return obj;
|
|
99
|
+
}
|
|
100
|
+
if (Array.isArray(obj)) {
|
|
101
|
+
return obj.map(stringifyObject);
|
|
102
|
+
}
|
|
103
|
+
if (typeof obj !== 'object') {
|
|
104
|
+
return obj.toString();
|
|
105
|
+
}
|
|
106
|
+
const ret = {};
|
|
107
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
108
|
+
ret[k] = stringifyObject(v);
|
|
109
|
+
}
|
|
110
|
+
return ret;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiczMtYnVja2V0LWRlcGxveW1lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiczMtYnVja2V0LWRlcGxveW1lbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVVBLHdGQWlEQztBQUVELDhGQXVEQztBQWhIRDs7O0dBR0c7QUFDVSxRQUFBLGVBQWUsR0FBRywrQkFBK0IsQ0FBQztBQUV4RCxLQUFLLFVBQVUsc0NBQXNDLENBQzFELFVBQWtCLEVBQ2xCLE1BQW1DLEVBQ25DLG1CQUFtRDtJQUVuRCxrR0FBa0c7SUFDbEcsdUZBQXVGO0lBQ3ZGLE1BQU0sR0FBRyxHQUF3QixFQUFFLENBQUM7SUFFcEMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyw2QkFBNkIsRUFBRSxDQUFDO1FBQzNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELHVHQUF1RztJQUN2RyxNQUFNLHdCQUF3QixHQUFHLE1BQU0sbUJBQW1CLENBQUMscUJBQXFCLENBQUM7UUFDL0UsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVU7UUFDN0IsWUFBWSxFQUFFLFNBQVM7S0FDeEIsQ0FBQyxDQUFDO0lBRUgsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNQLFlBQVksRUFBRSxJQUFJO1FBQ2xCLFlBQVksRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUk7UUFDbEMsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ25CLE9BQU8sRUFBRSxzQkFBc0I7UUFDL0IsYUFBYSxFQUFFLENBQUMsMEJBQTBCLHdCQUF3QixDQUFDLHFCQUFxQixHQUFHLENBQUM7UUFDNUYsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFRLEVBQUUsRUFBRTs7WUFDeEIsd0hBQXdIO1lBQ3hILE1BQU0sWUFBWSxHQUFHLE1BQU0sbUJBQW1CLENBQUMscUJBQXFCLENBQUMsTUFBQSxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsMENBQUUsWUFBWSxDQUFDLENBQUM7WUFDL0cs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Q0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEdBQVE7SUFDL0IsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDaEIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdkIsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzVCLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBeUIsRUFBRSxDQUFDO0lBQ3JDLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDekMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDaGFuZ2VIb3Rzd2FwUmVzdWx0LCBIb3Rzd2FwcGFibGVDaGFuZ2VDYW5kaWRhdGUgfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7IFNESyB9IGZyb20gJy4uL2F3cy1hdXRoJztcbmltcG9ydCB0eXBlIHsgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlIH0gZnJvbSAnLi4vZXZhbHVhdGUtY2xvdWRmb3JtYXRpb24tdGVtcGxhdGUnO1xuXG4vKipcbiAqIFRoaXMgbWVhbnMgdGhhdCB0aGUgdmFsdWUgaXMgcmVxdWlyZWQgdG8gZXhpc3QgYnkgQ2xvdWRGb3JtYXRpb24ncyBDdXN0b20gUmVzb3VyY2UgQVBJIChvciBvdXIgUzMgQnVja2V0IERlcGxveW1lbnQgTGFtYmRhJ3MgQVBJKVxuICogYnV0IHRoZSBhY3R1YWwgdmFsdWUgc3BlY2lmaWVkIGlzIGlycmVsZXZhbnRcbiAqL1xuZXhwb3J0IGNvbnN0IFJFUVVJUkVEX0JZX0NGTiA9ICdyZXF1aXJlZC10by1iZS1wcmVzZW50LWJ5LWNmbic7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0hvdHN3YXBwYWJsZVMzQnVja2V0RGVwbG95bWVudENoYW5nZShcbiAgX2xvZ2ljYWxJZDogc3RyaW5nLFxuICBjaGFuZ2U6IEhvdHN3YXBwYWJsZUNoYW5nZUNhbmRpZGF0ZSxcbiAgZXZhbHVhdGVDZm5UZW1wbGF0ZTogRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlLFxuKTogUHJvbWlzZTxDaGFuZ2VIb3Rzd2FwUmVzdWx0PiB7XG4gIC8vIEluIG9sZC1zdHlsZSBzeW50aGVzaXMsIHRoZSBwb2xpY3kgdXNlZCBieSB0aGUgbGFtYmRhIHRvIGNvcHkgYXNzZXRzIFJlZidzIHRoZSBhc3NldHMgZGlyZWN0bHksXG4gIC8vIG1lYW5pbmcgdGhhdCB0aGUgY2hhbmdlcyBtYWRlIHRvIHRoZSBQb2xpY3kgYXJlIGFydGlmYWN0cyB0aGF0IGNhbiBiZSBzYWZlbHkgaWdub3JlZFxuICBjb25zdCByZXQ6IENoYW5nZUhvdHN3YXBSZXN1bHQgPSBbXTtcblxuICBpZiAoY2hhbmdlLm5ld1ZhbHVlLlR5cGUgIT09ICdDdXN0b206OkNES0J1Y2tldERlcGxveW1lbnQnKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8gbm8gY2xhc3NpZmljYXRpb24gdG8gYmUgZG9uZSBoZXJlOyBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBjdXN0b20gcmVzb3VyY2UgdGhpbmcgYXJlIGhvdHN3YXBwYWJsZVxuICBjb25zdCBjdXN0b21SZXNvdXJjZVByb3BlcnRpZXMgPSBhd2FpdCBldmFsdWF0ZUNmblRlbXBsYXRlLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbih7XG4gICAgLi4uY2hhbmdlLm5ld1ZhbHVlLlByb3BlcnRpZXMsXG4gICAgU2VydmljZVRva2VuOiB1bmRlZmluZWQsXG4gIH0pO1xuXG4gIHJldC5wdXNoKHtcbiAgICBob3Rzd2FwcGFibGU6IHRydWUsXG4gICAgcmVzb3VyY2VUeXBlOiBjaGFuZ2UubmV3VmFsdWUuVHlwZSxcbiAgICBwcm9wc0NoYW5nZWQ6IFsnKiddLFxuICAgIHNlcnZpY2U6ICdjdXN0b20tczMtZGVwbG95bWVudCcsXG4gICAgcmVzb3VyY2VOYW1lczogW2BDb250ZW50cyBvZiBTMyBCdWNrZXQgJyR7Y3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzLkRlc3RpbmF0aW9uQnVja2V0TmFtZX0nYF0sXG4gICAgYXBwbHk6IGFzeW5jIChzZGs6IFNESykgPT4ge1xuICAgICAgLy8gbm90ZSB0aGF0IHRoaXMgZ2l2ZXMgdGhlIEFSTiBvZiB0aGUgbGFtYmRhLCBub3QgdGhlIG5hbWUuIFRoaXMgaXMgZmluZSB0aG91Z2gsIHRoZSBpbnZva2UoKSBzZGsgY2FsbCB3aWxsIHRha2UgZWl0aGVyXG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBhd2FpdCBldmFsdWF0ZUNmblRlbXBsYXRlLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihjaGFuZ2UubmV3VmFsdWUuUHJvcGVydGllcz8uU2VydmljZVRva2VuKTtcbiAgICAgIGlmICghZnVuY3Rpb25OYW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgc2RrLmxhbWJkYSgpLmludm9rZUNvbW1hbmQoe1xuICAgICAgICBGdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgLy8gTGFtYmRhIHJlZnVzZXMgdG8gdGFrZSBhIGRpcmVjdCBKU09OIG9iamVjdCBhbmQgcmVxdWlyZXMgaXQgdG8gYmUgc3RyaW5naWZ5KCknZFxuICAgICAgICBQYXlsb2FkOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgUmVxdWVzdFR5cGU6ICdVcGRhdGUnLFxuICAgICAgICAgIFJlc3BvbnNlVVJMOiBSRVFVSVJFRF9CWV9DRk4sXG4gICAgICAgICAgUGh5c2ljYWxSZXNvdXJjZUlkOiBSRVFVSVJFRF9CWV9DRk4sXG4gICAgICAgICAgU3RhY2tJZDogUkVRVUlSRURfQllfQ0ZOLFxuICAgICAgICAgIFJlcXVlc3RJZDogUkVRVUlSRURfQllfQ0ZOLFxuICAgICAgICAgIExvZ2ljYWxSZXNvdXJjZUlkOiBSRVFVSVJFRF9CWV9DRk4sXG4gICAgICAgICAgUmVzb3VyY2VQcm9wZXJ0aWVzOiBzdHJpbmdpZnlPYmplY3QoY3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzKSwgLy8gSlNPTi5zdHJpbmdpZnkoKSBkb2Vzbid0IHR1cm4gdGhlIGFjdHVhbCBvYmplY3RzIHRvIHN0cmluZ3MsIGJ1dCB0aGUgbGFtYmRhIGV4cGVjdHMgc3RyaW5nc1xuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiByZXQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBza2lwQ2hhbmdlRm9yUzNEZXBsb3lDdXN0b21SZXNvdXJjZVBvbGljeShcbiAgaWFtUG9saWN5TG9naWNhbElkOiBzdHJpbmcsXG4gIGNoYW5nZTogSG90c3dhcHBhYmxlQ2hhbmdlQ2FuZGlkYXRlLFxuICBldmFsdWF0ZUNmblRlbXBsYXRlOiBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUsXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGNoYW5nZS5uZXdWYWx1ZS5UeXBlICE9PSAnQVdTOjpJQU06OlBvbGljeScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3Qgcm9sZXM6IHN0cmluZ1tdID0gY2hhbmdlLm5ld1ZhbHVlLlByb3BlcnRpZXM/LlJvbGVzO1xuXG4gIC8vIElmIG5vIHJvbGVzIGFyZSByZWZlcmVuY2VkLCB0aGUgcG9saWN5IGlzIGRlZmluaXRlbHkgbm90IHVzZWQgZm9yIGEgUzNEZXBsb3ltZW50XG4gIGlmICghcm9sZXMgfHwgIXJvbGVzLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGV2ZXJ5IHJvbGUgdGhpcyBwb2xpY3kgaXMgcmVmZXJlbmNlZCBieSBpcyBvbmx5IHVzZWQgZm9yIGEgUzNEZXBsb3ltZW50XG4gIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlcykge1xuICAgIGNvbnN0IHJvbGVBcm4gPSBhd2FpdCBldmFsdWF0ZUNmblRlbXBsYXRlLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihyb2xlKTtcbiAgICBjb25zdCByb2xlTG9naWNhbElkID0gYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5maW5kTG9naWNhbElkRm9yUGh5c2ljYWxOYW1lKHJvbGVBcm4pO1xuXG4gICAgLy8gV2UgbXVzdCBhc3N1bWUgdGhpcyByb2xlIGlzIHVzZWQgZm9yIHNvbWV0aGluZyBlbHNlLCBiZWNhdXNlIHdlIGNhbid0IGNoZWNrIGl0XG4gICAgaWYgKCFyb2xlTG9naWNhbElkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gRmluZCBhbGwgaW50ZXJlc3RpbmcgcmVmZXJlbmNlIHRvIHRoZSByb2xlXG4gICAgY29uc3Qgcm9sZVJlZnMgPSBldmFsdWF0ZUNmblRlbXBsYXRlXG4gICAgICAuZmluZFJlZmVyZW5jZXNUbyhyb2xlTG9naWNhbElkKVxuICAgICAgLy8gd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgb3JpZ2luYWwgcG9saWN5IC0gaXQgYWx3YXlzIGV4aXN0c1xuICAgICAgLmZpbHRlcigocm9sZVJlZikgPT4gIShyb2xlUmVmLlR5cGUgPT0gJ0FXUzo6SUFNOjpQb2xpY3knICYmIHJvbGVSZWYuTG9naWNhbElkID09PSBpYW1Qb2xpY3lMb2dpY2FsSWQpKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSByb2xlIGlzIG9ubHkgdXNlZCBmb3IgUzNEZXBsb3ltZW50XG4gICAgLy8gV2Uga25vdyB0aGlzIGlzIHRoZSBjYXNlLCBpZiBTM0RlcGxveW1lbnQgLT4gTGFtYmRhIC0+IFJvbGUgaXMgc2F0aXNmaWVkIGZvciBldmVyeSByZWZlcmVuY2VcbiAgICAvLyBBbmQgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgcmVmZXJlbmNlLlxuICAgIGNvbnN0IGlzUm9sZU9ubHlGb3JTM0RlcGxveW1lbnQgPVxuICAgICAgcm9sZVJlZnMubGVuZ3RoID49IDEgJiZcbiAgICAgIHJvbGVSZWZzLmV2ZXJ5KChyb2xlUmVmKSA9PiB7XG4gICAgICAgIGlmIChyb2xlUmVmLlR5cGUgPT09ICdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc3QgbGFtYmRhUmVmcyA9IGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZmluZFJlZmVyZW5jZXNUbyhyb2xlUmVmLkxvZ2ljYWxJZCk7XG4gICAgICAgICAgLy8gRXZlcnkgcmVmZXJlbmNlIG11c3QgYmUgdG8gdGhlIGN1c3RvbSByZXNvdXJjZSBhbmQgYXQgbGVhc3Qgb25lIHJlZmVyZW5jZSBtdXN0IGJlIHByZXNlbnRcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgbGFtYmRhUmVmcy5sZW5ndGggPj0gMSAmJiBsYW1iZGFSZWZzLmV2ZXJ5KChsYW1iZGFSZWYpID0+IGxhbWJkYVJlZi5UeXBlID09PSAnQ3VzdG9tOjpDREtCdWNrZXREZXBsb3ltZW50JylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgLy8gV2UgaGF2ZSBkZXRlcm1pbmVkIHRoaXMgcm9sZSBpcyB1c2VkIGZvciBzb21ldGhpbmcgZWxzZSwgc28gd2UgY2FuJ3Qgc2tpcCB0aGUgY2hhbmdlXG4gICAgaWYgKCFpc1JvbGVPbmx5Rm9yUzNEZXBsb3ltZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gV2UgaGF2ZSBjaGVja2VkIHRoYXQgYW55IHVzZSBvZiB0aGlzIHBvbGljeSBpcyBvbmx5IGZvciBTM0RlcGxveW1lbnQgYW5kIHdlIGNhbiBzYWZlbHkgc2tpcCBpdFxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0KG9iajogYW55KTogYW55IHtcbiAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIG9iai5tYXAoc3RyaW5naWZ5T2JqZWN0KTtcbiAgfVxuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gb2JqLnRvU3RyaW5nKCk7XG4gIH1cblxuICBjb25zdCByZXQ6IHsgW2s6IHN0cmluZ106IGFueSB9ID0ge307XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICByZXRba10gPSBzdHJpbmdpZnlPYmplY3Qodik7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { type ChangeHotswapResult, type HotswappableChangeCandidate } from './common';
|
|
2
|
+
import type { EvaluateCloudFormationTemplate } from '../evaluate-cloudformation-template';
|
|
3
|
+
export declare function isHotswappableStateMachineChange(logicalId: string, change: HotswappableChangeCandidate, evaluateCfnTemplate: EvaluateCloudFormationTemplate): Promise<ChangeHotswapResult>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isHotswappableStateMachineChange = isHotswappableStateMachineChange;
|
|
4
|
+
const common_1 = require("./common");
|
|
5
|
+
async function isHotswappableStateMachineChange(logicalId, change, evaluateCfnTemplate) {
|
|
6
|
+
var _a, _b;
|
|
7
|
+
if (change.newValue.Type !== 'AWS::StepFunctions::StateMachine') {
|
|
8
|
+
return [];
|
|
9
|
+
}
|
|
10
|
+
const ret = [];
|
|
11
|
+
const classifiedChanges = (0, common_1.classifyChanges)(change, ['DefinitionString']);
|
|
12
|
+
classifiedChanges.reportNonHotswappablePropertyChanges(ret);
|
|
13
|
+
const namesOfHotswappableChanges = Object.keys(classifiedChanges.hotswappableProps);
|
|
14
|
+
if (namesOfHotswappableChanges.length > 0) {
|
|
15
|
+
const stateMachineNameInCfnTemplate = (_b = (_a = change.newValue) === null || _a === void 0 ? void 0 : _a.Properties) === null || _b === void 0 ? void 0 : _b.StateMachineName;
|
|
16
|
+
const stateMachineArn = stateMachineNameInCfnTemplate
|
|
17
|
+
? await evaluateCfnTemplate.evaluateCfnExpression({
|
|
18
|
+
'Fn::Sub': 'arn:${AWS::Partition}:states:${AWS::Region}:${AWS::AccountId}:stateMachine:' +
|
|
19
|
+
stateMachineNameInCfnTemplate,
|
|
20
|
+
})
|
|
21
|
+
: await evaluateCfnTemplate.findPhysicalNameFor(logicalId);
|
|
22
|
+
ret.push({
|
|
23
|
+
hotswappable: true,
|
|
24
|
+
resourceType: change.newValue.Type,
|
|
25
|
+
propsChanged: namesOfHotswappableChanges,
|
|
26
|
+
service: 'stepfunctions-service',
|
|
27
|
+
resourceNames: [`${change.newValue.Type} '${stateMachineArn === null || stateMachineArn === void 0 ? void 0 : stateMachineArn.split(':')[6]}'`],
|
|
28
|
+
apply: async (sdk) => {
|
|
29
|
+
if (!stateMachineArn) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// not passing the optional properties leaves them unchanged
|
|
33
|
+
await sdk.stepFunctions().updateStateMachine({
|
|
34
|
+
stateMachineArn,
|
|
35
|
+
definition: await evaluateCfnTemplate.evaluateCfnExpression(change.propertyUpdates.DefinitionString.newValue),
|
|
36
|
+
});
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return ret;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcGZ1bmN0aW9ucy1zdGF0ZS1tYWNoaW5lcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN0ZXBmdW5jdGlvbnMtc3RhdGUtbWFjaGluZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFJQSw0RUEyQ0M7QUEvQ0QscUNBQXVHO0FBSWhHLEtBQUssVUFBVSxnQ0FBZ0MsQ0FDcEQsU0FBaUIsRUFDakIsTUFBbUMsRUFDbkMsbUJBQW1EOztJQUVuRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLGtDQUFrQyxFQUFFLENBQUM7UUFDaEUsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsTUFBTSxHQUFHLEdBQXdCLEVBQUUsQ0FBQztJQUNwQyxNQUFNLGlCQUFpQixHQUFHLElBQUEsd0JBQWUsRUFBQyxNQUFNLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7SUFDeEUsaUJBQWlCLENBQUMsb0NBQW9DLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFNUQsTUFBTSwwQkFBMEIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDcEYsSUFBSSwwQkFBMEIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUMsTUFBTSw2QkFBNkIsR0FBRyxNQUFBLE1BQUEsTUFBTSxDQUFDLFFBQVEsMENBQUUsVUFBVSwwQ0FBRSxnQkFBZ0IsQ0FBQztRQUNwRixNQUFNLGVBQWUsR0FBRyw2QkFBNkI7WUFDbkQsQ0FBQyxDQUFDLE1BQU0sbUJBQW1CLENBQUMscUJBQXFCLENBQUM7Z0JBQ2hELFNBQVMsRUFDTCw2RUFBNkU7b0JBQzdFLDZCQUE2QjthQUNsQyxDQUFDO1lBQ0YsQ0FBQyxDQUFDLE1BQU0sbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0QsR0FBRyxDQUFDLElBQUksQ0FBQztZQUNQLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFlBQVksRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUk7WUFDbEMsWUFBWSxFQUFFLDBCQUEwQjtZQUN4QyxPQUFPLEVBQUUsdUJBQXVCO1lBQ2hDLGFBQWEsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssZUFBZSxhQUFmLGVBQWUsdUJBQWYsZUFBZSxDQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUM5RSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQVEsRUFBRSxFQUFFO2dCQUN4QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3JCLE9BQU87Z0JBQ1QsQ0FBQztnQkFFRCw0REFBNEQ7Z0JBQzVELE1BQU0sR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLGtCQUFrQixDQUFDO29CQUMzQyxlQUFlO29CQUNmLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO2lCQUM5RyxDQUFDLENBQUM7WUFDTCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgQ2hhbmdlSG90c3dhcFJlc3VsdCwgY2xhc3NpZnlDaGFuZ2VzLCB0eXBlIEhvdHN3YXBwYWJsZUNoYW5nZUNhbmRpZGF0ZSB9IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB0eXBlIHsgU0RLIH0gZnJvbSAnLi4vYXdzLWF1dGgnO1xuaW1wb3J0IHR5cGUgeyBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUgfSBmcm9tICcuLi9ldmFsdWF0ZS1jbG91ZGZvcm1hdGlvbi10ZW1wbGF0ZSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0hvdHN3YXBwYWJsZVN0YXRlTWFjaGluZUNoYW5nZShcbiAgbG9naWNhbElkOiBzdHJpbmcsXG4gIGNoYW5nZTogSG90c3dhcHBhYmxlQ2hhbmdlQ2FuZGlkYXRlLFxuICBldmFsdWF0ZUNmblRlbXBsYXRlOiBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUsXG4pOiBQcm9taXNlPENoYW5nZUhvdHN3YXBSZXN1bHQ+IHtcbiAgaWYgKGNoYW5nZS5uZXdWYWx1ZS5UeXBlICE9PSAnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHJldDogQ2hhbmdlSG90c3dhcFJlc3VsdCA9IFtdO1xuICBjb25zdCBjbGFzc2lmaWVkQ2hhbmdlcyA9IGNsYXNzaWZ5Q2hhbmdlcyhjaGFuZ2UsIFsnRGVmaW5pdGlvblN0cmluZyddKTtcbiAgY2xhc3NpZmllZENoYW5nZXMucmVwb3J0Tm9uSG90c3dhcHBhYmxlUHJvcGVydHlDaGFuZ2VzKHJldCk7XG5cbiAgY29uc3QgbmFtZXNPZkhvdHN3YXBwYWJsZUNoYW5nZXMgPSBPYmplY3Qua2V5cyhjbGFzc2lmaWVkQ2hhbmdlcy5ob3Rzd2FwcGFibGVQcm9wcyk7XG4gIGlmIChuYW1lc09mSG90c3dhcHBhYmxlQ2hhbmdlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgc3RhdGVNYWNoaW5lTmFtZUluQ2ZuVGVtcGxhdGUgPSBjaGFuZ2UubmV3VmFsdWU/LlByb3BlcnRpZXM/LlN0YXRlTWFjaGluZU5hbWU7XG4gICAgY29uc3Qgc3RhdGVNYWNoaW5lQXJuID0gc3RhdGVNYWNoaW5lTmFtZUluQ2ZuVGVtcGxhdGVcbiAgICAgID8gYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5ldmFsdWF0ZUNmbkV4cHJlc3Npb24oe1xuICAgICAgICAnRm46OlN1Yic6XG4gICAgICAgICAgICAnYXJuOiR7QVdTOjpQYXJ0aXRpb259OnN0YXRlczoke0FXUzo6UmVnaW9ufToke0FXUzo6QWNjb3VudElkfTpzdGF0ZU1hY2hpbmU6JyArXG4gICAgICAgICAgICBzdGF0ZU1hY2hpbmVOYW1lSW5DZm5UZW1wbGF0ZSxcbiAgICAgIH0pXG4gICAgICA6IGF3YWl0IGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZmluZFBoeXNpY2FsTmFtZUZvcihsb2dpY2FsSWQpO1xuICAgIHJldC5wdXNoKHtcbiAgICAgIGhvdHN3YXBwYWJsZTogdHJ1ZSxcbiAgICAgIHJlc291cmNlVHlwZTogY2hhbmdlLm5ld1ZhbHVlLlR5cGUsXG4gICAgICBwcm9wc0NoYW5nZWQ6IG5hbWVzT2ZIb3Rzd2FwcGFibGVDaGFuZ2VzLFxuICAgICAgc2VydmljZTogJ3N0ZXBmdW5jdGlvbnMtc2VydmljZScsXG4gICAgICByZXNvdXJjZU5hbWVzOiBbYCR7Y2hhbmdlLm5ld1ZhbHVlLlR5cGV9ICcke3N0YXRlTWFjaGluZUFybj8uc3BsaXQoJzonKVs2XX0nYF0sXG4gICAgICBhcHBseTogYXN5bmMgKHNkazogU0RLKSA9PiB7XG4gICAgICAgIGlmICghc3RhdGVNYWNoaW5lQXJuKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm90IHBhc3NpbmcgdGhlIG9wdGlvbmFsIHByb3BlcnRpZXMgbGVhdmVzIHRoZW0gdW5jaGFuZ2VkXG4gICAgICAgIGF3YWl0IHNkay5zdGVwRnVuY3Rpb25zKCkudXBkYXRlU3RhdGVNYWNoaW5lKHtcbiAgICAgICAgICBzdGF0ZU1hY2hpbmVBcm4sXG4gICAgICAgICAgZGVmaW5pdGlvbjogYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5ldmFsdWF0ZUNmbkV4cHJlc3Npb24oY2hhbmdlLnByb3BlcnR5VXBkYXRlcy5EZWZpbml0aW9uU3RyaW5nLm5ld1ZhbHVlKSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cbiJdfQ==
|
package/lib/api/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./bootstrap"), exports);
|
|
18
|
+
__exportStar(require("./garbage-collection/garbage-collector"), exports);
|
|
19
|
+
__exportStar(require("./deployments"), exports);
|
|
20
|
+
__exportStar(require("./toolkit-info"), exports);
|
|
21
|
+
__exportStar(require("./aws-auth"), exports);
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsOENBQTRCO0FBQzVCLHlFQUF1RDtBQUN2RCxnREFBOEI7QUFDOUIsaURBQStCO0FBQy9CLDZDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYm9vdHN0cmFwJztcbmV4cG9ydCAqIGZyb20gJy4vZ2FyYmFnZS1jb2xsZWN0aW9uL2dhcmJhZ2UtY29sbGVjdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vZGVwbG95bWVudHMnO1xuZXhwb3J0ICogZnJvbSAnLi90b29sa2l0LWluZm8nO1xuZXhwb3J0ICogZnJvbSAnLi9hd3MtYXV0aCc7XG4iXX0=
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { CloudFormationStackArtifact, Environment } from '@aws-cdk/cx-api';
|
|
2
|
+
import type { SDK, SdkProvider } from '../aws-auth';
|
|
3
|
+
/**
|
|
4
|
+
* Configuration needed to monitor CloudWatch Log Groups
|
|
5
|
+
* found in a given CloudFormation Stack
|
|
6
|
+
*/
|
|
7
|
+
export interface FoundLogGroupsResult {
|
|
8
|
+
/**
|
|
9
|
+
* The resolved environment (account/region) that the log
|
|
10
|
+
* groups are deployed in
|
|
11
|
+
*/
|
|
12
|
+
readonly env: Environment;
|
|
13
|
+
/**
|
|
14
|
+
* The SDK that can be used to read events from the CloudWatch
|
|
15
|
+
* Log Groups in the given environment
|
|
16
|
+
*/
|
|
17
|
+
readonly sdk: SDK;
|
|
18
|
+
/**
|
|
19
|
+
* The names of the relevant CloudWatch Log Groups
|
|
20
|
+
* in the given CloudFormation template
|
|
21
|
+
*/
|
|
22
|
+
readonly logGroupNames: string[];
|
|
23
|
+
}
|
|
24
|
+
export declare function findCloudWatchLogGroups(sdkProvider: SdkProvider, stackArtifact: CloudFormationStackArtifact): Promise<FoundLogGroupsResult>;
|