cdk-ecr-deployment 4.1.5 → 4.2.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/.jsii +4 -4
- package/.jsii.tabl.json +1 -1
- package/README.md +13 -0
- package/lambda-bin/bootstrap +0 -0
- package/lib/index.js +50 -4
- package/package.json +1 -1
package/.jsii
CHANGED
|
@@ -3468,7 +3468,7 @@
|
|
|
3468
3468
|
},
|
|
3469
3469
|
"name": "cdk-ecr-deployment",
|
|
3470
3470
|
"readme": {
|
|
3471
|
-
"markdown": "# cdk-ecr-deployment\n\n[](https://github.com/cdklabs/cdk-ecr-deployment/actions/workflows/release.yml)\n[](https://www.npmjs.com/package/cdk-ecr-deployment)\n[](https://pypi.org/project/cdk-ecr-deployment)\n[](https://www.npmjs.com/package/cdk-ecr-deployment)\n[](https://pypi.org/project/cdk-ecr-deployment)\n\nCDK construct to synchronize single docker image between docker registries.\n\n> [!IMPORTANT]\n>\n> Please use the latest version of this package, which is `v4`.\n>\n> (Older versions are no longer supported).\n\n## Features\n\n- Copy image or multi-architecture image index from ECR/external registry to (another) ECR/external registry\n- Copy an archive tarball image from s3 to ECR/external registry\n\n## Examples\n\n```ts\nimport { DockerImageAsset } from 'aws-cdk-lib/aws-ecr-assets';\n\nconst image = new DockerImageAsset(this, 'CDKDockerImage', {\n directory: path.join(__dirname, 'docker'),\n});\n\n// Copy from cdk docker image asset to another ECR.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage1', {\n src: new ecrdeploy.DockerImageName(image.imageUri),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest`),\n});\n\n// Copy from docker registry to ECR.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage2', {\n src: new ecrdeploy.DockerImageName('nginx:latest'),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx2:latest`),\n});\n\n// Copy from private docker registry to ECR.\n// The format of secret in aws secrets manager must be either:\n// - plain text in format <username>:<password>\n// - json in format {\"username\":\"<username>\",\"password\":\"<password>\"}\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage3', {\n src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'username:password'),\n // src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'aws-secrets-manager-secret-name'),\n // src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'arn:aws:secretsmanager:us-west-2:000000000000:secret:id'),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx3:latest`),\n}).addToPrincipalPolicy(new iam.PolicyStatement({\n effect: iam.Effect.ALLOW,\n actions: [\n 'secretsmanager:GetSecretValue',\n ],\n resources: ['*'],\n}));\n\n// Copy multi-architecture image index (manifest) with all architectures.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage4', {\n src: new ecrdeploy.DockerImageName('public.ecr.aws/nginx/nginx:latest'),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx4:manifest`),\n copyImageIndex: true,\n archImageTags: {\n amd64: 'my-nginx-amd64',\n arm64: 'my-nginx-arm64',\n },\n});\n```\n\n## Sample: [test/example.ecr-deployment.ts](./test/example.ecr-deployment.ts)\n\nAfter cloning the repository, install dependencies and run a full build:\n\n```console\nyarn --frozen-lockfile --check-files\nyarn build\n```\n\nThen run the example like this:\n\n```shell\n# Run the following command to try the sample.\nnpx cdk deploy -a \"npx ts-node -P tsconfig.dev.json --prefer-ts-exts test/example.ecr-deployment.ts\"\n```\n\nTo run the DockerHub example you will first need to setup a Secret in AWS Secrets Manager to provide DockerHub credentials.\nReplace `username:access-token` with your credentials.\n**Please note that Secrets will occur a cost.**\n\n```console\naws secretsmanager create-secret --name DockerHubCredentials --secret-string \"username:access-token\"\n```\n\nFrom the output, copy the ARN of your new secret and export it as env variable\n\n```console\nexport DOCKERHUB_SECRET_ARN=\"<ARN>\"\n```\n\nFinally run:\n\n```shell\n# Run the following command to try the sample.\nnpx cdk deploy -a \"npx ts-node -P tsconfig.dev.json --prefer-ts-exts test/dockerhub-example.ecr-deployment.ts\"\n```\n\nIf your Secret is encrypted, you might have to adjust the example to also grant decrypt permissions.\n\n## [API](./API.md)\n\n## Tech Details & Contribution\n\nThe core of this project relies on [containers/image](https://github.com/containers/image) which is used by [Skopeo](https://github.com/containers/skopeo).\nPlease take a look at those projects before contribution.\n\nTo support a new docker image source(like docker tarball in s3), you need to implement [image transport interface](https://github.com/containers/image/blob/master/types/types.go). You could take a look at [docker-archive](https://github.com/containers/image/blob/ccb87a8d0f45cf28846e307eb0ec2b9d38a458c2/docker/archive/transport.go) transport for a good start.\n\nAny error in the custom resource provider will show up in the CloudFormation error log as `Invalid PhysicalResourceId`, because of this: <https://github.com/aws/aws-lambda-go/issues/107>. You need to go into the CloudWatch Log Group to find the real error.\n"
|
|
3471
|
+
"markdown": "# cdk-ecr-deployment\n\n[](https://github.com/cdklabs/cdk-ecr-deployment/actions/workflows/release.yml)\n[](https://www.npmjs.com/package/cdk-ecr-deployment)\n[](https://pypi.org/project/cdk-ecr-deployment)\n[](https://www.npmjs.com/package/cdk-ecr-deployment)\n[](https://pypi.org/project/cdk-ecr-deployment)\n\nCDK construct to synchronize single docker image between docker registries.\n\n> [!IMPORTANT]\n>\n> Please use the latest version of this package, which is `v4`.\n>\n> (Older versions are no longer supported).\n\n## Features\n\n- Copy image or multi-architecture image index from ECR/external registry to (another) ECR/external registry\n- Copy an archive tarball image from s3 to ECR/external registry\n\n## Examples\n\n```ts\nimport { DockerImageAsset } from 'aws-cdk-lib/aws-ecr-assets';\n\nconst image = new DockerImageAsset(this, 'CDKDockerImage', {\n directory: path.join(__dirname, 'docker'),\n});\n\n// Copy from cdk docker image asset to another ECR.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage1', {\n src: new ecrdeploy.DockerImageName(image.imageUri),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest`),\n});\n\n// Copy from docker registry to ECR.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage2', {\n src: new ecrdeploy.DockerImageName('nginx:latest'),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx2:latest`),\n});\n\n// Copy from private docker registry to ECR.\n// The format of secret in aws secrets manager must be either:\n// - plain text in format <username>:<password>\n// - json in format {\"username\":\"<username>\",\"password\":\"<password>\"}\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage3', {\n src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'username:password'),\n // src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'aws-secrets-manager-secret-name'),\n // src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'arn:aws:secretsmanager:us-west-2:000000000000:secret:id'),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx3:latest`),\n}).addToPrincipalPolicy(new iam.PolicyStatement({\n effect: iam.Effect.ALLOW,\n actions: [\n 'secretsmanager:GetSecretValue',\n ],\n resources: ['*'],\n}));\n\n// Copy multi-architecture image index (manifest) with all architectures.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage4', {\n src: new ecrdeploy.DockerImageName('public.ecr.aws/nginx/nginx:latest'),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx4:manifest`),\n copyImageIndex: true,\n archImageTags: {\n amd64: 'my-nginx-amd64',\n arm64: 'my-nginx-arm64',\n },\n});\n\n// Copy image to a public ECR registry.\n// The required ecr-public and sts permissions are automatically attached\n// when the destination is a public.ecr.aws URI.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage5', {\n src: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest`),\n dest: new ecrdeploy.DockerImageName('public.ecr.aws/your-alias/your-repo:latest'),\n copyImageIndex: true,\n archImageTags: {\n amd64: 'latest-amd64',\n arm64: 'latest-arm64',\n },\n});\n```\n\n## Sample: [test/example.ecr-deployment.ts](./test/example.ecr-deployment.ts)\n\nAfter cloning the repository, install dependencies and run a full build:\n\n```console\nyarn --frozen-lockfile --check-files\nyarn build\n```\n\nThen run the example like this:\n\n```shell\n# Run the following command to try the sample.\nnpx cdk deploy -a \"npx ts-node -P tsconfig.dev.json --prefer-ts-exts test/example.ecr-deployment.ts\"\n```\n\nTo run the DockerHub example you will first need to setup a Secret in AWS Secrets Manager to provide DockerHub credentials.\nReplace `username:access-token` with your credentials.\n**Please note that Secrets will occur a cost.**\n\n```console\naws secretsmanager create-secret --name DockerHubCredentials --secret-string \"username:access-token\"\n```\n\nFrom the output, copy the ARN of your new secret and export it as env variable\n\n```console\nexport DOCKERHUB_SECRET_ARN=\"<ARN>\"\n```\n\nFinally run:\n\n```shell\n# Run the following command to try the sample.\nnpx cdk deploy -a \"npx ts-node -P tsconfig.dev.json --prefer-ts-exts test/dockerhub-example.ecr-deployment.ts\"\n```\n\nIf your Secret is encrypted, you might have to adjust the example to also grant decrypt permissions.\n\n## [API](./API.md)\n\n## Tech Details & Contribution\n\nThe core of this project relies on [containers/image](https://github.com/containers/image) which is used by [Skopeo](https://github.com/containers/skopeo).\nPlease take a look at those projects before contribution.\n\nTo support a new docker image source(like docker tarball in s3), you need to implement [image transport interface](https://github.com/containers/image/blob/master/types/types.go). You could take a look at [docker-archive](https://github.com/containers/image/blob/ccb87a8d0f45cf28846e307eb0ec2b9d38a458c2/docker/archive/transport.go) transport for a good start.\n\nAny error in the custom resource provider will show up in the CloudFormation error log as `Invalid PhysicalResourceId`, because of this: <https://github.com/aws/aws-lambda-go/issues/107>. You need to go into the CloudWatch Log Group to find the real error.\n"
|
|
3472
3472
|
},
|
|
3473
3473
|
"repository": {
|
|
3474
3474
|
"type": "git",
|
|
@@ -3631,7 +3631,7 @@
|
|
|
3631
3631
|
},
|
|
3632
3632
|
"locationInModule": {
|
|
3633
3633
|
"filename": "src/index.ts",
|
|
3634
|
-
"line":
|
|
3634
|
+
"line": 289
|
|
3635
3635
|
},
|
|
3636
3636
|
"name": "addToPrincipalPolicy",
|
|
3637
3637
|
"parameters": [
|
|
@@ -4033,6 +4033,6 @@
|
|
|
4033
4033
|
"symbolId": "src/index:S3ArchiveName"
|
|
4034
4034
|
}
|
|
4035
4035
|
},
|
|
4036
|
-
"version": "4.
|
|
4037
|
-
"fingerprint": "
|
|
4036
|
+
"version": "4.2.0",
|
|
4037
|
+
"fingerprint": "fkJ+VdmAJ0lY/B9v5idlLUinkGTvxxXzDtvmrOBlwDs="
|
|
4038
4038
|
}
|
package/.jsii.tabl.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":"2","toolVersion":"5.9.39","snippets":{"2c9d92f1126c55cfce28304eeea97dcfb46c01e51c787db6d2acd957b5155bd0":{"translations":{"python":{"source":"from aws_cdk.aws_ecr_assets import DockerImageAsset\n\n\nimage = DockerImageAsset(self, \"CDKDockerImage\",\n directory=path.join(__dirname, \"docker\")\n)\n\n# Copy from cdk docker image asset to another ECR.\necrdeploy.ECRDeployment(self, \"DeployDockerImage1\",\n src=ecrdeploy.DockerImageName(image.image_uri),\n dest=ecrdeploy.DockerImageName(f\"{cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest\")\n)\n\n# Copy from docker registry to ECR.\necrdeploy.ECRDeployment(self, \"DeployDockerImage2\",\n src=ecrdeploy.DockerImageName(\"nginx:latest\"),\n dest=ecrdeploy.DockerImageName(f\"{cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx2:latest\")\n)\n\n# Copy from private docker registry to ECR.\n# The format of secret in aws secrets manager must be either:\n# - plain text in format <username>:<password>\n# - json in format {\"username\":\"<username>\",\"password\":\"<password>\"}\necrdeploy.ECRDeployment(self, \"DeployDockerImage3\",\n src=ecrdeploy.DockerImageName(\"javacs3/nginx:latest\", \"username:password\"),\n # src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'aws-secrets-manager-secret-name'),\n # src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'arn:aws:secretsmanager:us-west-2:000000000000:secret:id'),\n dest=ecrdeploy.DockerImageName(f\"{cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx3:latest\")\n).add_to_principal_policy(iam.PolicyStatement(\n effect=iam.Effect.ALLOW,\n actions=[\"secretsmanager:GetSecretValue\"\n ],\n resources=[\"*\"]\n))\n\n# Copy multi-architecture image index (manifest) with all architectures.\necrdeploy.ECRDeployment(self, \"DeployDockerImage4\",\n src=ecrdeploy.DockerImageName(\"public.ecr.aws/nginx/nginx:latest\"),\n dest=ecrdeploy.DockerImageName(f\"{cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx4:manifest\"),\n copy_image_index=True,\n arch_image_tags={\n \"amd64\": \"my-nginx-amd64\",\n \"arm64\": \"my-nginx-arm64\"\n }\n)","version":"2"},"csharp":{"source":"using Amazon.CDK.AWS.Ecr.Assets;\n\n\nvar image = new DockerImageAsset(this, \"CDKDockerImage\", new DockerImageAssetProps {\n Directory = Join(__dirname, \"docker\")\n});\n\n// Copy from cdk docker image asset to another ECR.\n// Copy from cdk docker image asset to another ECR.\nnew ECRDeployment(this, \"DeployDockerImage1\", new ECRDeploymentProps {\n Src = new DockerImageName(image.ImageUri),\n Dest = new DockerImageName($\"{cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest\")\n});\n\n// Copy from docker registry to ECR.\n// Copy from docker registry to ECR.\nnew ECRDeployment(this, \"DeployDockerImage2\", new ECRDeploymentProps {\n Src = new DockerImageName(\"nginx:latest\"),\n Dest = new DockerImageName($\"{cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx2:latest\")\n});\n\n// Copy from private docker registry to ECR.\n// The format of secret in aws secrets manager must be either:\n// - plain text in format <username>:<password>\n// - json in format {\"username\":\"<username>\",\"password\":\"<password>\"}\n// Copy from private docker registry to ECR.\n// The format of secret in aws secrets manager must be either:\n// - plain text in format <username>:<password>\n// - json in format {\"username\":\"<username>\",\"password\":\"<password>\"}\nnew ECRDeployment(this, \"DeployDockerImage3\", new ECRDeploymentProps {\n Src = new DockerImageName(\"javacs3/nginx:latest\", \"username:password\"),\n // src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'aws-secrets-manager-secret-name'),\n // src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'arn:aws:secretsmanager:us-west-2:000000000000:secret:id'),\n Dest = new DockerImageName($\"{cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx3:latest\")\n}).AddToPrincipalPolicy(new PolicyStatement(new PolicyStatementProps {\n Effect = Effect.ALLOW,\n Actions = new [] { \"secretsmanager:GetSecretValue\" },\n Resources = new [] { \"*\" }\n}));\n\n// Copy multi-architecture image index (manifest) with all architectures.\n// Copy multi-architecture image index (manifest) with all architectures.\nnew ECRDeployment(this, \"DeployDockerImage4\", new ECRDeploymentProps {\n Src = new DockerImageName(\"public.ecr.aws/nginx/nginx:latest\"),\n Dest = new DockerImageName($\"{cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx4:manifest\"),\n CopyImageIndex = true,\n ArchImageTags = new Dictionary<string, string> {\n { \"amd64\", \"my-nginx-amd64\" },\n { \"arm64\", \"my-nginx-arm64\" }\n }\n});","version":"1"},"java":{"source":"import software.amazon.awscdk.services.ecr.assets.DockerImageAsset;\n\n\nDockerImageAsset image = DockerImageAsset.Builder.create(this, \"CDKDockerImage\")\n .directory(join(__dirname, \"docker\"))\n .build();\n\n// Copy from cdk docker image asset to another ECR.\n// Copy from cdk docker image asset to another ECR.\nECRDeployment.Builder.create(this, \"DeployDockerImage1\")\n .src(new DockerImageName(image.getImageUri()))\n .dest(new DockerImageName(String.format(\"%s.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest\", Aws.ACCOUNT_ID)))\n .build();\n\n// Copy from docker registry to ECR.\n// Copy from docker registry to ECR.\nECRDeployment.Builder.create(this, \"DeployDockerImage2\")\n .src(new DockerImageName(\"nginx:latest\"))\n .dest(new DockerImageName(String.format(\"%s.dkr.ecr.us-west-2.amazonaws.com/my-nginx2:latest\", Aws.ACCOUNT_ID)))\n .build();\n\n// Copy from private docker registry to ECR.\n// The format of secret in aws secrets manager must be either:\n// - plain text in format <username>:<password>\n// - json in format {\"username\":\"<username>\",\"password\":\"<password>\"}\n// Copy from private docker registry to ECR.\n// The format of secret in aws secrets manager must be either:\n// - plain text in format <username>:<password>\n// - json in format {\"username\":\"<username>\",\"password\":\"<password>\"}\nECRDeployment.Builder.create(this, \"DeployDockerImage3\")\n .src(new DockerImageName(\"javacs3/nginx:latest\", \"username:password\"))\n // src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'aws-secrets-manager-secret-name'),\n // src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'arn:aws:secretsmanager:us-west-2:000000000000:secret:id'),\n .dest(new DockerImageName(String.format(\"%s.dkr.ecr.us-west-2.amazonaws.com/my-nginx3:latest\", Aws.ACCOUNT_ID)))\n .build().addToPrincipalPolicy(PolicyStatement.Builder.create()\n .effect(Effect.ALLOW)\n .actions(List.of(\"secretsmanager:GetSecretValue\"))\n .resources(List.of(\"*\"))\n .build());\n\n// Copy multi-architecture image index (manifest) with all architectures.\n// Copy multi-architecture image index (manifest) with all architectures.\nECRDeployment.Builder.create(this, \"DeployDockerImage4\")\n .src(new DockerImageName(\"public.ecr.aws/nginx/nginx:latest\"))\n .dest(new DockerImageName(String.format(\"%s.dkr.ecr.us-west-2.amazonaws.com/my-nginx4:manifest\", Aws.ACCOUNT_ID)))\n .copyImageIndex(true)\n .archImageTags(Map.of(\n \"amd64\", \"my-nginx-amd64\",\n \"arm64\", \"my-nginx-arm64\"))\n .build();","version":"1"},"go":{"source":"import \"github.com/aws/aws-cdk-go/awscdk\"\n\n\nimage := awscdk.NewDockerImageAsset(this, jsii.String(\"CDKDockerImage\"), &DockerImageAssetProps{\n\tDirectory: path.join(__dirname, jsii.String(\"docker\")),\n})\n\n// Copy from cdk docker image asset to another ECR.\n// Copy from cdk docker image asset to another ECR.\necrdeploy.NewECRDeployment(this, jsii.String(\"DeployDockerImage1\"), &ECRDeploymentProps{\n\tSrc: ecrdeploy.NewDockerImageName(image.ImageUri),\n\tDest: ecrdeploy.NewDockerImageName(fmt.Sprintf(\"%v.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest\", cdk.Aws_ACCOUNT_ID())),\n})\n\n// Copy from docker registry to ECR.\n// Copy from docker registry to ECR.\necrdeploy.NewECRDeployment(this, jsii.String(\"DeployDockerImage2\"), &ECRDeploymentProps{\n\tSrc: ecrdeploy.NewDockerImageName(jsii.String(\"nginx:latest\")),\n\tDest: ecrdeploy.NewDockerImageName(fmt.Sprintf(\"%v.dkr.ecr.us-west-2.amazonaws.com/my-nginx2:latest\", cdk.Aws_ACCOUNT_ID())),\n})\n\n// Copy from private docker registry to ECR.\n// The format of secret in aws secrets manager must be either:\n// - plain text in format <username>:<password>\n// - json in format {\"username\":\"<username>\",\"password\":\"<password>\"}\n// Copy from private docker registry to ECR.\n// The format of secret in aws secrets manager must be either:\n// - plain text in format <username>:<password>\n// - json in format {\"username\":\"<username>\",\"password\":\"<password>\"}\necrdeploy.NewECRDeployment(this, jsii.String(\"DeployDockerImage3\"), &ECRDeploymentProps{\n\tSrc: ecrdeploy.NewDockerImageName(jsii.String(\"javacs3/nginx:latest\"), jsii.String(\"username:password\")),\n\t// src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'aws-secrets-manager-secret-name'),\n\t// src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'arn:aws:secretsmanager:us-west-2:000000000000:secret:id'),\n\tDest: ecrdeploy.NewDockerImageName(fmt.Sprintf(\"%v.dkr.ecr.us-west-2.amazonaws.com/my-nginx3:latest\", cdk.Aws_ACCOUNT_ID())),\n}).AddToPrincipalPolicy(awscdk.Aws_iam.NewPolicyStatement(&PolicyStatementProps{\n\tEffect: awscdk.*Aws_iam.Effect_ALLOW,\n\tActions: []*string{\n\t\tjsii.String(\"secretsmanager:GetSecretValue\"),\n\t},\n\tResources: []*string{\n\t\tjsii.String(\"*\"),\n\t},\n}))\n\n// Copy multi-architecture image index (manifest) with all architectures.\n// Copy multi-architecture image index (manifest) with all architectures.\necrdeploy.NewECRDeployment(this, jsii.String(\"DeployDockerImage4\"), &ECRDeploymentProps{\n\tSrc: ecrdeploy.NewDockerImageName(jsii.String(\"public.ecr.aws/nginx/nginx:latest\")),\n\tDest: ecrdeploy.NewDockerImageName(fmt.Sprintf(\"%v.dkr.ecr.us-west-2.amazonaws.com/my-nginx4:manifest\", cdk.Aws_ACCOUNT_ID())),\n\tCopyImageIndex: jsii.Boolean(true),\n\tArchImageTags: map[string]*string{\n\t\t\"amd64\": jsii.String(\"my-nginx-amd64\"),\n\t\t\"arm64\": jsii.String(\"my-nginx-arm64\"),\n\t},\n})","version":"1"},"$":{"source":"import { DockerImageAsset } from 'aws-cdk-lib/aws-ecr-assets';\n\nconst image = new DockerImageAsset(this, 'CDKDockerImage', {\n directory: path.join(__dirname, 'docker'),\n});\n\n// Copy from cdk docker image asset to another ECR.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage1', {\n src: new ecrdeploy.DockerImageName(image.imageUri),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest`),\n});\n\n// Copy from docker registry to ECR.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage2', {\n src: new ecrdeploy.DockerImageName('nginx:latest'),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx2:latest`),\n});\n\n// Copy from private docker registry to ECR.\n// The format of secret in aws secrets manager must be either:\n// - plain text in format <username>:<password>\n// - json in format {\"username\":\"<username>\",\"password\":\"<password>\"}\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage3', {\n src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'username:password'),\n // src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'aws-secrets-manager-secret-name'),\n // src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'arn:aws:secretsmanager:us-west-2:000000000000:secret:id'),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx3:latest`),\n}).addToPrincipalPolicy(new iam.PolicyStatement({\n effect: iam.Effect.ALLOW,\n actions: [\n 'secretsmanager:GetSecretValue',\n ],\n resources: ['*'],\n}));\n\n// Copy multi-architecture image index (manifest) with all architectures.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage4', {\n src: new ecrdeploy.DockerImageName('public.ecr.aws/nginx/nginx:latest'),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx4:manifest`),\n copyImageIndex: true,\n archImageTags: {\n amd64: 'my-nginx-amd64',\n arm64: 'my-nginx-arm64',\n },\n});","version":"0"}},"location":{"api":{"api":"moduleReadme","moduleFqn":"cdk-ecr-deployment"},"field":{"field":"markdown","line":24}},"didCompile":true,"fqnsReferenced":["aws-cdk-lib.aws_ecr_assets.DockerImageAsset","aws-cdk-lib.aws_ecr_assets.DockerImageAsset#imageUri","aws-cdk-lib.aws_ecr_assets.DockerImageAssetProps","aws-cdk-lib.aws_iam.Effect","aws-cdk-lib.aws_iam.Effect#ALLOW","aws-cdk-lib.aws_iam.PolicyStatement","aws-cdk-lib.aws_iam.PolicyStatementProps","cdk-ecr-deployment.DockerImageName","cdk-ecr-deployment.ECRDeployment","cdk-ecr-deployment.ECRDeployment#addToPrincipalPolicy","cdk-ecr-deployment.ECRDeploymentProps","cdk-ecr-deployment.IImageName"],"fullSource":"// Hoisted imports begin after !show marker below\n/// !show\nimport { DockerImageAsset } from 'aws-cdk-lib/aws-ecr-assets';\n/// !hide\n// Hoisted imports ended before !hide marker above\n// Fixture with packages imported, but nothing else\nimport * as path from 'node:path';\nimport { Construct } from 'constructs';\n import * as ecrdeploy from 'cdk-ecr-deployment';\nimport {\n Stack,\n aws_iam as iam,\n} from 'aws-cdk-lib';\nimport * as cdk from 'aws-cdk-lib';\n\nclass Fixture extends Stack {\n constructor(scope: Construct, id: string) {\n super(scope, id);\n\n // Code snippet begins after !show marker below\n/// !show\n\n\nconst image = new DockerImageAsset(this, 'CDKDockerImage', {\n directory: path.join(__dirname, 'docker'),\n});\n\n// Copy from cdk docker image asset to another ECR.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage1', {\n src: new ecrdeploy.DockerImageName(image.imageUri),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest`),\n});\n\n// Copy from docker registry to ECR.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage2', {\n src: new ecrdeploy.DockerImageName('nginx:latest'),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx2:latest`),\n});\n\n// Copy from private docker registry to ECR.\n// The format of secret in aws secrets manager must be either:\n// - plain text in format <username>:<password>\n// - json in format {\"username\":\"<username>\",\"password\":\"<password>\"}\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage3', {\n src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'username:password'),\n // src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'aws-secrets-manager-secret-name'),\n // src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'arn:aws:secretsmanager:us-west-2:000000000000:secret:id'),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx3:latest`),\n}).addToPrincipalPolicy(new iam.PolicyStatement({\n effect: iam.Effect.ALLOW,\n actions: [\n 'secretsmanager:GetSecretValue',\n ],\n resources: ['*'],\n}));\n\n// Copy multi-architecture image index (manifest) with all architectures.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage4', {\n src: new ecrdeploy.DockerImageName('public.ecr.aws/nginx/nginx:latest'),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx4:manifest`),\n copyImageIndex: true,\n archImageTags: {\n amd64: 'my-nginx-amd64',\n arm64: 'my-nginx-arm64',\n },\n});\n/// !hide\n// Code snippet ended before !hide marker above\n }\n}","syntaxKindCounter":{"11":15,"16":4,"18":4,"80":66,"110":5,"112":1,"210":2,"211":7,"212":26,"214":2,"215":14,"229":4,"240":4,"244":1,"245":4,"261":1,"262":1,"273":1,"274":1,"276":1,"277":1,"304":16,"308":1},"fqnsFingerprint":"60d904326eb7fc376ddf3a23dec394e6db945cfdcef3658d7d8533e147d498e1"}}}
|
|
1
|
+
{"version":"2","toolVersion":"5.9.39","snippets":{"1a63afbad29c13d877453ab9195cf89f5784d89ce12c277c157913069c9f8736":{"translations":{"python":{"source":"from aws_cdk.aws_ecr_assets import DockerImageAsset\n\n\nimage = DockerImageAsset(self, \"CDKDockerImage\",\n directory=path.join(__dirname, \"docker\")\n)\n\n# Copy from cdk docker image asset to another ECR.\necrdeploy.ECRDeployment(self, \"DeployDockerImage1\",\n src=ecrdeploy.DockerImageName(image.image_uri),\n dest=ecrdeploy.DockerImageName(f\"{cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest\")\n)\n\n# Copy from docker registry to ECR.\necrdeploy.ECRDeployment(self, \"DeployDockerImage2\",\n src=ecrdeploy.DockerImageName(\"nginx:latest\"),\n dest=ecrdeploy.DockerImageName(f\"{cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx2:latest\")\n)\n\n# Copy from private docker registry to ECR.\n# The format of secret in aws secrets manager must be either:\n# - plain text in format <username>:<password>\n# - json in format {\"username\":\"<username>\",\"password\":\"<password>\"}\necrdeploy.ECRDeployment(self, \"DeployDockerImage3\",\n src=ecrdeploy.DockerImageName(\"javacs3/nginx:latest\", \"username:password\"),\n # src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'aws-secrets-manager-secret-name'),\n # src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'arn:aws:secretsmanager:us-west-2:000000000000:secret:id'),\n dest=ecrdeploy.DockerImageName(f\"{cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx3:latest\")\n).add_to_principal_policy(iam.PolicyStatement(\n effect=iam.Effect.ALLOW,\n actions=[\"secretsmanager:GetSecretValue\"\n ],\n resources=[\"*\"]\n))\n\n# Copy multi-architecture image index (manifest) with all architectures.\necrdeploy.ECRDeployment(self, \"DeployDockerImage4\",\n src=ecrdeploy.DockerImageName(\"public.ecr.aws/nginx/nginx:latest\"),\n dest=ecrdeploy.DockerImageName(f\"{cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx4:manifest\"),\n copy_image_index=True,\n arch_image_tags={\n \"amd64\": \"my-nginx-amd64\",\n \"arm64\": \"my-nginx-arm64\"\n }\n)\n\n# Copy image to a public ECR registry.\n# The required ecr-public and sts permissions are automatically attached\n# when the destination is a public.ecr.aws URI.\necrdeploy.ECRDeployment(self, \"DeployDockerImage5\",\n src=ecrdeploy.DockerImageName(f\"{cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest\"),\n dest=ecrdeploy.DockerImageName(\"public.ecr.aws/your-alias/your-repo:latest\"),\n copy_image_index=True,\n arch_image_tags={\n \"amd64\": \"latest-amd64\",\n \"arm64\": \"latest-arm64\"\n }\n)","version":"2"},"csharp":{"source":"using Amazon.CDK.AWS.Ecr.Assets;\n\n\nvar image = new DockerImageAsset(this, \"CDKDockerImage\", new DockerImageAssetProps {\n Directory = Join(__dirname, \"docker\")\n});\n\n// Copy from cdk docker image asset to another ECR.\n// Copy from cdk docker image asset to another ECR.\nnew ECRDeployment(this, \"DeployDockerImage1\", new ECRDeploymentProps {\n Src = new DockerImageName(image.ImageUri),\n Dest = new DockerImageName($\"{cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest\")\n});\n\n// Copy from docker registry to ECR.\n// Copy from docker registry to ECR.\nnew ECRDeployment(this, \"DeployDockerImage2\", new ECRDeploymentProps {\n Src = new DockerImageName(\"nginx:latest\"),\n Dest = new DockerImageName($\"{cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx2:latest\")\n});\n\n// Copy from private docker registry to ECR.\n// The format of secret in aws secrets manager must be either:\n// - plain text in format <username>:<password>\n// - json in format {\"username\":\"<username>\",\"password\":\"<password>\"}\n// Copy from private docker registry to ECR.\n// The format of secret in aws secrets manager must be either:\n// - plain text in format <username>:<password>\n// - json in format {\"username\":\"<username>\",\"password\":\"<password>\"}\nnew ECRDeployment(this, \"DeployDockerImage3\", new ECRDeploymentProps {\n Src = new DockerImageName(\"javacs3/nginx:latest\", \"username:password\"),\n // src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'aws-secrets-manager-secret-name'),\n // src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'arn:aws:secretsmanager:us-west-2:000000000000:secret:id'),\n Dest = new DockerImageName($\"{cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx3:latest\")\n}).AddToPrincipalPolicy(new PolicyStatement(new PolicyStatementProps {\n Effect = Effect.ALLOW,\n Actions = new [] { \"secretsmanager:GetSecretValue\" },\n Resources = new [] { \"*\" }\n}));\n\n// Copy multi-architecture image index (manifest) with all architectures.\n// Copy multi-architecture image index (manifest) with all architectures.\nnew ECRDeployment(this, \"DeployDockerImage4\", new ECRDeploymentProps {\n Src = new DockerImageName(\"public.ecr.aws/nginx/nginx:latest\"),\n Dest = new DockerImageName($\"{cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx4:manifest\"),\n CopyImageIndex = true,\n ArchImageTags = new Dictionary<string, string> {\n { \"amd64\", \"my-nginx-amd64\" },\n { \"arm64\", \"my-nginx-arm64\" }\n }\n});\n\n// Copy image to a public ECR registry.\n// The required ecr-public and sts permissions are automatically attached\n// when the destination is a public.ecr.aws URI.\n// Copy image to a public ECR registry.\n// The required ecr-public and sts permissions are automatically attached\n// when the destination is a public.ecr.aws URI.\nnew ECRDeployment(this, \"DeployDockerImage5\", new ECRDeploymentProps {\n Src = new DockerImageName($\"{cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest\"),\n Dest = new DockerImageName(\"public.ecr.aws/your-alias/your-repo:latest\"),\n CopyImageIndex = true,\n ArchImageTags = new Dictionary<string, string> {\n { \"amd64\", \"latest-amd64\" },\n { \"arm64\", \"latest-arm64\" }\n }\n});","version":"1"},"java":{"source":"import software.amazon.awscdk.services.ecr.assets.DockerImageAsset;\n\n\nDockerImageAsset image = DockerImageAsset.Builder.create(this, \"CDKDockerImage\")\n .directory(join(__dirname, \"docker\"))\n .build();\n\n// Copy from cdk docker image asset to another ECR.\n// Copy from cdk docker image asset to another ECR.\nECRDeployment.Builder.create(this, \"DeployDockerImage1\")\n .src(new DockerImageName(image.getImageUri()))\n .dest(new DockerImageName(String.format(\"%s.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest\", Aws.ACCOUNT_ID)))\n .build();\n\n// Copy from docker registry to ECR.\n// Copy from docker registry to ECR.\nECRDeployment.Builder.create(this, \"DeployDockerImage2\")\n .src(new DockerImageName(\"nginx:latest\"))\n .dest(new DockerImageName(String.format(\"%s.dkr.ecr.us-west-2.amazonaws.com/my-nginx2:latest\", Aws.ACCOUNT_ID)))\n .build();\n\n// Copy from private docker registry to ECR.\n// The format of secret in aws secrets manager must be either:\n// - plain text in format <username>:<password>\n// - json in format {\"username\":\"<username>\",\"password\":\"<password>\"}\n// Copy from private docker registry to ECR.\n// The format of secret in aws secrets manager must be either:\n// - plain text in format <username>:<password>\n// - json in format {\"username\":\"<username>\",\"password\":\"<password>\"}\nECRDeployment.Builder.create(this, \"DeployDockerImage3\")\n .src(new DockerImageName(\"javacs3/nginx:latest\", \"username:password\"))\n // src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'aws-secrets-manager-secret-name'),\n // src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'arn:aws:secretsmanager:us-west-2:000000000000:secret:id'),\n .dest(new DockerImageName(String.format(\"%s.dkr.ecr.us-west-2.amazonaws.com/my-nginx3:latest\", Aws.ACCOUNT_ID)))\n .build().addToPrincipalPolicy(PolicyStatement.Builder.create()\n .effect(Effect.ALLOW)\n .actions(List.of(\"secretsmanager:GetSecretValue\"))\n .resources(List.of(\"*\"))\n .build());\n\n// Copy multi-architecture image index (manifest) with all architectures.\n// Copy multi-architecture image index (manifest) with all architectures.\nECRDeployment.Builder.create(this, \"DeployDockerImage4\")\n .src(new DockerImageName(\"public.ecr.aws/nginx/nginx:latest\"))\n .dest(new DockerImageName(String.format(\"%s.dkr.ecr.us-west-2.amazonaws.com/my-nginx4:manifest\", Aws.ACCOUNT_ID)))\n .copyImageIndex(true)\n .archImageTags(Map.of(\n \"amd64\", \"my-nginx-amd64\",\n \"arm64\", \"my-nginx-arm64\"))\n .build();\n\n// Copy image to a public ECR registry.\n// The required ecr-public and sts permissions are automatically attached\n// when the destination is a public.ecr.aws URI.\n// Copy image to a public ECR registry.\n// The required ecr-public and sts permissions are automatically attached\n// when the destination is a public.ecr.aws URI.\nECRDeployment.Builder.create(this, \"DeployDockerImage5\")\n .src(new DockerImageName(String.format(\"%s.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest\", Aws.ACCOUNT_ID)))\n .dest(new DockerImageName(\"public.ecr.aws/your-alias/your-repo:latest\"))\n .copyImageIndex(true)\n .archImageTags(Map.of(\n \"amd64\", \"latest-amd64\",\n \"arm64\", \"latest-arm64\"))\n .build();","version":"1"},"go":{"source":"import \"github.com/aws/aws-cdk-go/awscdk\"\n\n\nimage := awscdk.NewDockerImageAsset(this, jsii.String(\"CDKDockerImage\"), &DockerImageAssetProps{\n\tDirectory: path.join(__dirname, jsii.String(\"docker\")),\n})\n\n// Copy from cdk docker image asset to another ECR.\n// Copy from cdk docker image asset to another ECR.\necrdeploy.NewECRDeployment(this, jsii.String(\"DeployDockerImage1\"), &ECRDeploymentProps{\n\tSrc: ecrdeploy.NewDockerImageName(image.ImageUri),\n\tDest: ecrdeploy.NewDockerImageName(fmt.Sprintf(\"%v.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest\", cdk.Aws_ACCOUNT_ID())),\n})\n\n// Copy from docker registry to ECR.\n// Copy from docker registry to ECR.\necrdeploy.NewECRDeployment(this, jsii.String(\"DeployDockerImage2\"), &ECRDeploymentProps{\n\tSrc: ecrdeploy.NewDockerImageName(jsii.String(\"nginx:latest\")),\n\tDest: ecrdeploy.NewDockerImageName(fmt.Sprintf(\"%v.dkr.ecr.us-west-2.amazonaws.com/my-nginx2:latest\", cdk.Aws_ACCOUNT_ID())),\n})\n\n// Copy from private docker registry to ECR.\n// The format of secret in aws secrets manager must be either:\n// - plain text in format <username>:<password>\n// - json in format {\"username\":\"<username>\",\"password\":\"<password>\"}\n// Copy from private docker registry to ECR.\n// The format of secret in aws secrets manager must be either:\n// - plain text in format <username>:<password>\n// - json in format {\"username\":\"<username>\",\"password\":\"<password>\"}\necrdeploy.NewECRDeployment(this, jsii.String(\"DeployDockerImage3\"), &ECRDeploymentProps{\n\tSrc: ecrdeploy.NewDockerImageName(jsii.String(\"javacs3/nginx:latest\"), jsii.String(\"username:password\")),\n\t// src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'aws-secrets-manager-secret-name'),\n\t// src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'arn:aws:secretsmanager:us-west-2:000000000000:secret:id'),\n\tDest: ecrdeploy.NewDockerImageName(fmt.Sprintf(\"%v.dkr.ecr.us-west-2.amazonaws.com/my-nginx3:latest\", cdk.Aws_ACCOUNT_ID())),\n}).AddToPrincipalPolicy(awscdk.Aws_iam.NewPolicyStatement(&PolicyStatementProps{\n\tEffect: awscdk.*Aws_iam.Effect_ALLOW,\n\tActions: []*string{\n\t\tjsii.String(\"secretsmanager:GetSecretValue\"),\n\t},\n\tResources: []*string{\n\t\tjsii.String(\"*\"),\n\t},\n}))\n\n// Copy multi-architecture image index (manifest) with all architectures.\n// Copy multi-architecture image index (manifest) with all architectures.\necrdeploy.NewECRDeployment(this, jsii.String(\"DeployDockerImage4\"), &ECRDeploymentProps{\n\tSrc: ecrdeploy.NewDockerImageName(jsii.String(\"public.ecr.aws/nginx/nginx:latest\")),\n\tDest: ecrdeploy.NewDockerImageName(fmt.Sprintf(\"%v.dkr.ecr.us-west-2.amazonaws.com/my-nginx4:manifest\", cdk.Aws_ACCOUNT_ID())),\n\tCopyImageIndex: jsii.Boolean(true),\n\tArchImageTags: map[string]*string{\n\t\t\"amd64\": jsii.String(\"my-nginx-amd64\"),\n\t\t\"arm64\": jsii.String(\"my-nginx-arm64\"),\n\t},\n})\n\n// Copy image to a public ECR registry.\n// The required ecr-public and sts permissions are automatically attached\n// when the destination is a public.ecr.aws URI.\n// Copy image to a public ECR registry.\n// The required ecr-public and sts permissions are automatically attached\n// when the destination is a public.ecr.aws URI.\necrdeploy.NewECRDeployment(this, jsii.String(\"DeployDockerImage5\"), &ECRDeploymentProps{\n\tSrc: ecrdeploy.NewDockerImageName(fmt.Sprintf(\"%v.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest\", cdk.Aws_ACCOUNT_ID())),\n\tDest: ecrdeploy.NewDockerImageName(jsii.String(\"public.ecr.aws/your-alias/your-repo:latest\")),\n\tCopyImageIndex: jsii.Boolean(true),\n\tArchImageTags: map[string]*string{\n\t\t\"amd64\": jsii.String(\"latest-amd64\"),\n\t\t\"arm64\": jsii.String(\"latest-arm64\"),\n\t},\n})","version":"1"},"$":{"source":"import { DockerImageAsset } from 'aws-cdk-lib/aws-ecr-assets';\n\nconst image = new DockerImageAsset(this, 'CDKDockerImage', {\n directory: path.join(__dirname, 'docker'),\n});\n\n// Copy from cdk docker image asset to another ECR.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage1', {\n src: new ecrdeploy.DockerImageName(image.imageUri),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest`),\n});\n\n// Copy from docker registry to ECR.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage2', {\n src: new ecrdeploy.DockerImageName('nginx:latest'),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx2:latest`),\n});\n\n// Copy from private docker registry to ECR.\n// The format of secret in aws secrets manager must be either:\n// - plain text in format <username>:<password>\n// - json in format {\"username\":\"<username>\",\"password\":\"<password>\"}\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage3', {\n src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'username:password'),\n // src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'aws-secrets-manager-secret-name'),\n // src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'arn:aws:secretsmanager:us-west-2:000000000000:secret:id'),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx3:latest`),\n}).addToPrincipalPolicy(new iam.PolicyStatement({\n effect: iam.Effect.ALLOW,\n actions: [\n 'secretsmanager:GetSecretValue',\n ],\n resources: ['*'],\n}));\n\n// Copy multi-architecture image index (manifest) with all architectures.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage4', {\n src: new ecrdeploy.DockerImageName('public.ecr.aws/nginx/nginx:latest'),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx4:manifest`),\n copyImageIndex: true,\n archImageTags: {\n amd64: 'my-nginx-amd64',\n arm64: 'my-nginx-arm64',\n },\n});\n\n// Copy image to a public ECR registry.\n// The required ecr-public and sts permissions are automatically attached\n// when the destination is a public.ecr.aws URI.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage5', {\n src: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest`),\n dest: new ecrdeploy.DockerImageName('public.ecr.aws/your-alias/your-repo:latest'),\n copyImageIndex: true,\n archImageTags: {\n amd64: 'latest-amd64',\n arm64: 'latest-arm64',\n },\n});","version":"0"}},"location":{"api":{"api":"moduleReadme","moduleFqn":"cdk-ecr-deployment"},"field":{"field":"markdown","line":24}},"didCompile":true,"fqnsReferenced":["aws-cdk-lib.aws_ecr_assets.DockerImageAsset","aws-cdk-lib.aws_ecr_assets.DockerImageAsset#imageUri","aws-cdk-lib.aws_ecr_assets.DockerImageAssetProps","aws-cdk-lib.aws_iam.Effect","aws-cdk-lib.aws_iam.Effect#ALLOW","aws-cdk-lib.aws_iam.PolicyStatement","aws-cdk-lib.aws_iam.PolicyStatementProps","cdk-ecr-deployment.DockerImageName","cdk-ecr-deployment.ECRDeployment","cdk-ecr-deployment.ECRDeployment#addToPrincipalPolicy","cdk-ecr-deployment.ECRDeploymentProps","cdk-ecr-deployment.IImageName"],"fullSource":"// Hoisted imports begin after !show marker below\n/// !show\nimport { DockerImageAsset } from 'aws-cdk-lib/aws-ecr-assets';\n/// !hide\n// Hoisted imports ended before !hide marker above\n// Fixture with packages imported, but nothing else\nimport * as path from 'node:path';\nimport { Construct } from 'constructs';\n import * as ecrdeploy from 'cdk-ecr-deployment';\nimport {\n Stack,\n aws_iam as iam,\n} from 'aws-cdk-lib';\nimport * as cdk from 'aws-cdk-lib';\n\nclass Fixture extends Stack {\n constructor(scope: Construct, id: string) {\n super(scope, id);\n\n // Code snippet begins after !show marker below\n/// !show\n\n\nconst image = new DockerImageAsset(this, 'CDKDockerImage', {\n directory: path.join(__dirname, 'docker'),\n});\n\n// Copy from cdk docker image asset to another ECR.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage1', {\n src: new ecrdeploy.DockerImageName(image.imageUri),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest`),\n});\n\n// Copy from docker registry to ECR.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage2', {\n src: new ecrdeploy.DockerImageName('nginx:latest'),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx2:latest`),\n});\n\n// Copy from private docker registry to ECR.\n// The format of secret in aws secrets manager must be either:\n// - plain text in format <username>:<password>\n// - json in format {\"username\":\"<username>\",\"password\":\"<password>\"}\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage3', {\n src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'username:password'),\n // src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'aws-secrets-manager-secret-name'),\n // src: new ecrdeploy.DockerImageName('javacs3/nginx:latest', 'arn:aws:secretsmanager:us-west-2:000000000000:secret:id'),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx3:latest`),\n}).addToPrincipalPolicy(new iam.PolicyStatement({\n effect: iam.Effect.ALLOW,\n actions: [\n 'secretsmanager:GetSecretValue',\n ],\n resources: ['*'],\n}));\n\n// Copy multi-architecture image index (manifest) with all architectures.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage4', {\n src: new ecrdeploy.DockerImageName('public.ecr.aws/nginx/nginx:latest'),\n dest: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx4:manifest`),\n copyImageIndex: true,\n archImageTags: {\n amd64: 'my-nginx-amd64',\n arm64: 'my-nginx-arm64',\n },\n});\n\n// Copy image to a public ECR registry.\n// The required ecr-public and sts permissions are automatically attached\n// when the destination is a public.ecr.aws URI.\nnew ecrdeploy.ECRDeployment(this, 'DeployDockerImage5', {\n src: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest`),\n dest: new ecrdeploy.DockerImageName('public.ecr.aws/your-alias/your-repo:latest'),\n copyImageIndex: true,\n archImageTags: {\n amd64: 'latest-amd64',\n arm64: 'latest-arm64',\n },\n});\n/// !hide\n// Code snippet ended before !hide marker above\n }\n}","syntaxKindCounter":{"11":19,"16":5,"18":5,"80":81,"110":6,"112":2,"210":2,"211":9,"212":31,"214":2,"215":17,"229":5,"240":5,"244":1,"245":5,"261":1,"262":1,"273":1,"274":1,"276":1,"277":1,"304":22,"308":1},"fqnsFingerprint":"60d904326eb7fc376ddf3a23dec394e6db945cfdcef3658d7d8533e147d498e1"}}}
|
package/README.md
CHANGED
|
@@ -67,6 +67,19 @@ new ecrdeploy.ECRDeployment(this, 'DeployDockerImage4', {
|
|
|
67
67
|
arm64: 'my-nginx-arm64',
|
|
68
68
|
},
|
|
69
69
|
});
|
|
70
|
+
|
|
71
|
+
// Copy image to a public ECR registry.
|
|
72
|
+
// The required ecr-public and sts permissions are automatically attached
|
|
73
|
+
// when the destination is a public.ecr.aws URI.
|
|
74
|
+
new ecrdeploy.ECRDeployment(this, 'DeployDockerImage5', {
|
|
75
|
+
src: new ecrdeploy.DockerImageName(`${cdk.Aws.ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com/my-nginx:latest`),
|
|
76
|
+
dest: new ecrdeploy.DockerImageName('public.ecr.aws/your-alias/your-repo:latest'),
|
|
77
|
+
copyImageIndex: true,
|
|
78
|
+
archImageTags: {
|
|
79
|
+
amd64: 'latest-amd64',
|
|
80
|
+
arm64: 'latest-arm64',
|
|
81
|
+
},
|
|
82
|
+
});
|
|
70
83
|
```
|
|
71
84
|
|
|
72
85
|
## Sample: [test/example.ecr-deployment.ts](./test/example.ecr-deployment.ts)
|
package/lambda-bin/bootstrap
CHANGED
|
Binary file
|
package/lib/index.js
CHANGED
|
@@ -25,7 +25,7 @@ class DockerImageName {
|
|
|
25
25
|
}
|
|
26
26
|
exports.DockerImageName = DockerImageName;
|
|
27
27
|
_a = JSII_RTTI_SYMBOL_1;
|
|
28
|
-
DockerImageName[_a] = { fqn: "cdk-ecr-deployment.DockerImageName", version: "4.
|
|
28
|
+
DockerImageName[_a] = { fqn: "cdk-ecr-deployment.DockerImageName", version: "4.2.0" };
|
|
29
29
|
class S3ArchiveName {
|
|
30
30
|
/**
|
|
31
31
|
* @param p - the S3 bucket name and path of the archive (a S3 URI without the s3://)
|
|
@@ -46,7 +46,7 @@ class S3ArchiveName {
|
|
|
46
46
|
}
|
|
47
47
|
exports.S3ArchiveName = S3ArchiveName;
|
|
48
48
|
_b = JSII_RTTI_SYMBOL_1;
|
|
49
|
-
S3ArchiveName[_b] = { fqn: "cdk-ecr-deployment.S3ArchiveName", version: "4.
|
|
49
|
+
S3ArchiveName[_b] = { fqn: "cdk-ecr-deployment.S3ArchiveName", version: "4.2.0" };
|
|
50
50
|
class ECRDeployment extends constructs_1.Construct {
|
|
51
51
|
constructor(scope, id, props) {
|
|
52
52
|
super(scope, id);
|
|
@@ -96,6 +96,52 @@ class ECRDeployment extends constructs_1.Construct {
|
|
|
96
96
|
],
|
|
97
97
|
resources: ['*'],
|
|
98
98
|
}));
|
|
99
|
+
// Auto-attach public ECR permissions when the destination is a public ECR registry.
|
|
100
|
+
// When dest is public ECR, the auth token permissions also cover source-side auth
|
|
101
|
+
// if the source happens to be public ECR too.
|
|
102
|
+
if (props.dest.uri.includes('public.ecr.aws')) {
|
|
103
|
+
handlerRole.addToPrincipalPolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
|
|
104
|
+
effect: aws_cdk_lib_1.aws_iam.Effect.ALLOW,
|
|
105
|
+
actions: [
|
|
106
|
+
'ecr-public:GetAuthorizationToken',
|
|
107
|
+
'sts:GetServiceBearerToken',
|
|
108
|
+
],
|
|
109
|
+
resources: ['*'],
|
|
110
|
+
}));
|
|
111
|
+
handlerRole.addToPrincipalPolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
|
|
112
|
+
effect: aws_cdk_lib_1.aws_iam.Effect.ALLOW,
|
|
113
|
+
actions: [
|
|
114
|
+
'ecr-public:BatchCheckLayerAvailability',
|
|
115
|
+
'ecr-public:InitiateLayerUpload',
|
|
116
|
+
'ecr-public:UploadLayerPart',
|
|
117
|
+
'ecr-public:CompleteLayerUpload',
|
|
118
|
+
'ecr-public:PutImage',
|
|
119
|
+
],
|
|
120
|
+
resources: [
|
|
121
|
+
// Public ECR is only available in the 'aws' partition (not aws-cn or aws-us-gov)
|
|
122
|
+
aws_cdk_lib_1.Arn.format({
|
|
123
|
+
partition: 'aws',
|
|
124
|
+
service: 'ecr-public',
|
|
125
|
+
region: '',
|
|
126
|
+
account: aws_cdk_lib_1.Aws.ACCOUNT_ID,
|
|
127
|
+
resource: 'repository',
|
|
128
|
+
resourceName: '*',
|
|
129
|
+
}, aws_cdk_lib_1.Stack.of(this)),
|
|
130
|
+
],
|
|
131
|
+
}));
|
|
132
|
+
}
|
|
133
|
+
else if (props.src.uri.includes('public.ecr.aws')) {
|
|
134
|
+
// When reading from public ECR, the Lambda still authenticates via
|
|
135
|
+
// ecr-public:GetAuthorizationToken. Grant the minimal read-auth permissions.
|
|
136
|
+
handlerRole.addToPrincipalPolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
|
|
137
|
+
effect: aws_cdk_lib_1.aws_iam.Effect.ALLOW,
|
|
138
|
+
actions: [
|
|
139
|
+
'ecr-public:GetAuthorizationToken',
|
|
140
|
+
'sts:GetServiceBearerToken',
|
|
141
|
+
],
|
|
142
|
+
resources: ['*'],
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
99
145
|
if (props.imageArch && props.copyImageIndex) {
|
|
100
146
|
throw new Error('imageArch and copyImageIndex cannot both be set');
|
|
101
147
|
}
|
|
@@ -145,5 +191,5 @@ class ECRDeployment extends constructs_1.Construct {
|
|
|
145
191
|
}
|
|
146
192
|
exports.ECRDeployment = ECRDeployment;
|
|
147
193
|
_c = JSII_RTTI_SYMBOL_1;
|
|
148
|
-
ECRDeployment[_c] = { fqn: "cdk-ecr-deployment.ECRDeployment", version: "4.
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxRUFBcUU7QUFDckUsc0NBQXNDO0FBRXRDLDZCQUE2QjtBQUM3Qiw2Q0FBb0g7QUFFcEgsdURBQXVEO0FBQ3ZELDJDQUF1QztBQXlIdkMsTUFBYSxlQUFlO0lBQzFCOzs7Ozs7T0FNRztJQUNILFlBQTJCLElBQVksRUFBUyxLQUFjO1FBQW5DLFNBQUksR0FBSixJQUFJLENBQVE7UUFBUyxVQUFLLEdBQUwsS0FBSyxDQUFTO0lBQUksQ0FBQztJQUNuRSxJQUFXLEdBQUcsS0FBYSxPQUFPLFlBQVksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzs7QUFUOUQsMENBVUM7OztBQUVELE1BQWEsYUFBYTtJQUd4Qjs7Ozs7OztPQU9HO0lBQ0gsWUFBbUIsQ0FBUyxFQUFFLEdBQVksRUFBUyxLQUFjO1FBQWQsVUFBSyxHQUFMLEtBQUssQ0FBUztRQUMvRCxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFXLEdBQUcsS0FBYSxPQUFPLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzs7QUFqQjFELHNDQWtCQzs7O0FBRUQsTUFBYSxhQUFjLFNBQVEsc0JBQVM7SUFHMUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF5QjtRQUNqRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDO1FBQzdDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSx3QkFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUks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LEdBQUcsc0NBQXNDLENBQUM7UUFFbEQsMEVBQTBFO1FBQzFFLDJFQUEyRTtRQUMzRSw0Q0FBNEM7UUFDNUMsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLG1CQUFLLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsbUhBQW1ILENBQUMsQ0FBQztZQUN2SSxDQUFDO1lBRUQsSUFBSSxJQUFJLElBQUksV0FBVyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUM7UUFDMUMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7QUF2R0gsc0NBd0dDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgYXdzX2VjMiBhcyBlYzIsIGF3c19pYW0gYXMgaWFtLCBhd3NfbGFtYmRhIGFzIGxhbWJkYSwgRHVyYXRpb24sIEN1c3RvbVJlc291cmNlLCBUb2tlbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCwgQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IFJ1bnRpbWVGYW1pbHkgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVDUkRlcGxveW1lbnRQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlIG9mIHRoZSBkb2NrZXIgaW1hZ2UuXG4gICAqL1xuICByZWFkb25seSBzcmM6IElJbWFnZU5hbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgZG9ja2VyIGltYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdDogSUltYWdlTmFtZTtcblxuICAvKipcbiAgICogVGhlIGltYWdlIGFyY2hpdGVjdHVyZSB0byBiZSBjb3BpZWQuXG4gICAqXG4gICAqIFRoZSAnYW1kNjQnIGFyY2hpdGVjdHVyZSB3aWxsIGJlIGNvcGllZCBieSBkZWZhdWx0LiBTcGVjaWZ5IHRoZVxuICAgKiBhcmNoaXRlY3R1cmUgb3IgYXJjaGl0ZWN0dXJlcyB0byBjb3B5IGhlcmUuXG4gICAqXG4gICAqIEl0IGlzIGN1cnJlbnRseSBub3QgcG9zc2libGUgdG8gY29weSBtb3JlIHRoYW4gb25lIGFyY2hpdGVjdHVyZVxuICAgKiBhdCBhIHRpbWU6IHRoZSBhcnJheSB5b3Ugc3BlY2lmeSBtdXN0IGNvbnRhaW4gZXhhY3RseSBvbmUgc3RyaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbJ2FtZDY0J11cbiAgICovXG4gIHJlYWRvbmx5IGltYWdlQXJjaD86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGNvcHkgYSBzb3VyY2UgZG9ja2VyIGltYWdlIGluZGV4IChtdWx0aS1hcmNoIG1hbmlmZXN0KSB0byB0aGUgZGVzdGluYXRpb24uXG4gICAqXG4gICAqIFdoZW4gdHJ1ZSwgY29waWVzIHRoZSBpbWFnZSBpbmRleCBhbmQgYWxsIHVuZGVybHlpbmcgYXJjaGl0ZWN0dXJlLXNwZWNpZmljXG4gICAqIGltYWdlcyBpbiBhIHNpbmdsZSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IEZhbHNlXG4gICAqL1xuICByZWFkb25seSBjb3B5SW1hZ2VJbmRleD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRhZ3MgdG8gYXBwbHkgdG8gaW5kaXZpZHVhbCBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgaW1hZ2VzIHdoZW5cbiAgICogY29weUltYWdlSW5kZXggaXMgdHJ1ZS5cbiAgICpcbiAgICogQ2FuIG9ubHkgYmUgc3BlY2lmaWVkIHdoZW4gY29weUltYWdlSW5kZXggaXMgdHJ1ZS4gTWFwcyBhcmNoaXRlY3R1cmUgbmFtZXMgdG9cbiAgICogdGhlaXIgcmVzcGVjdGl2ZSB0YWdzLiBUaGlzIG1ha2VzIGluZGl2aWR1YWwgYXJjaGl0ZWN0dXJlcyBkaXNjb3ZlcmFibGVcbiAgICogYnkgaHVtYW4tcmVhZGFibGUgdGFncyBpbiBhZGRpdGlvbiB0byB0aGUgaW1hZ2UgaW5kZXggdGFnLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgeyAnYXJtNjQnOiAnaW1hZ2UtYXJtNjQnLCAnYW1kNjQnOiAnaW1hZ2UtYW1kNjQnIH0uXG4gICAqL1xuICByZWFkb25seSBhcmNoSW1hZ2VUYWdzPzogeyBbYXJjaGl0ZWN0dXJlOiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogUmV0cnkgY29uZmlndXJhdGlvbiB0byBhcHBseSB0byB3aGVuIGNvcHlpbmcgaW1hZ2VzIHN1Y2ggYXMgdGhlIG51bWJlciBvZiByZXRyeSBhdHRlbXRwcyxcbiAgICogdGhlIGJhc2UgYW1vdW50IG9mIGRlbGF5IChpbiBzZWNvbmRzKSBiZXR3ZWVuIGVhY2ggcmV0cnksIGFuZCB0aGUgbWF4IGFtb3VudCBvZiBkZWxheSAoaW4gc2Vjb25kcylcbiAgICogYmV0d2VlbiBlYWNoIHJldHJ5LlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgeyAnbnVtQXR0ZW1wdHMnOiAzLCAnYmFzZURlbGF5JzogMSwgJ21heERlbGF5JzogNSB9XG4gICAqL1xuICByZWFkb25seSByZXRyeUNvbmZpZ3M/OiB7IFtmaWVsZHM6IHN0cmluZ106IG51bWJlciB9O1xuXG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IG9mIG1lbW9yeSAoaW4gTWlCKSB0byBhbGxvY2F0ZSB0byB0aGUgQVdTIExhbWJkYSBmdW5jdGlvbiB3aGljaFxuICAgKiByZXBsaWNhdGVzIHRoZSBmaWxlcyBmcm9tIHRoZSBDREsgYnVja2V0IHRvIHRoZSBkZXN0aW5hdGlvbiBidWNrZXQuXG4gICAqXG4gICAqIElmIHlvdSBhcmUgZGVwbG95aW5nIGxhcmdlIGZpbGVzLCB5b3Ugd2lsbCBuZWVkIHRvIGluY3JlYXNlIHRoaXMgbnVtYmVyXG4gICAqIGFjY29yZGluZ2x5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIDUxMlxuICAgKi9cbiAgcmVhZG9ubHkgbWVtb3J5TGltaXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGlvbiByb2xlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQSByb2xlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZT86IGlhbS5JUm9sZTtcblxuICAvKipcbiAgICogVGhlIFZQQyBuZXR3b3JrIHRvIHBsYWNlIHRoZSBkZXBsb3ltZW50IGxhbWJkYSBoYW5kbGVyIGluLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IHZwYz86IGVjMi5JVnBjO1xuXG4gIC8qKlxuICAgKiBXaGVyZSBpbiB0aGUgVlBDIHRvIHBsYWNlIHRoZSBkZXBsb3ltZW50IGxhbWJkYSBoYW5kbGVyLlxuICAgKiBPbmx5IHVzZWQgaWYgJ3ZwYycgaXMgc3VwcGxpZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIFZwYyBkZWZhdWx0IHN0cmF0ZWd5IGlmIG5vdCBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHZwY1N1Ym5ldHM/OiBlYzIuU3VibmV0U2VsZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBzZWN1cml0eSBncm91cHMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIExhbWJkYSdzIG5ldHdvcmsgaW50ZXJmYWNlcy5cbiAgICpcbiAgICogT25seSB1c2VkIGlmICd2cGMnIGlzIHN1cHBsaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIHRoZSBmdW5jdGlvbiBpcyBwbGFjZWQgd2l0aGluIGEgVlBDIGFuZCBhIHNlY3VyaXR5IGdyb3VwIGlzXG4gICAqIG5vdCBzcGVjaWZpZWQsIGVpdGhlciBieSB0aGlzIG9yIHNlY3VyaXR5R3JvdXAgcHJvcCwgYSBkZWRpY2F0ZWQgc2VjdXJpdHlcbiAgICogZ3JvdXAgd2lsbCBiZSBjcmVhdGVkIGZvciB0aGlzIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cHM/OiBlYzIuU2VjdXJpdHlHcm91cFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElJbWFnZU5hbWUge1xuICAvKipcbiAgICogIFRoZSB1cmkgb2YgdGhlIGRvY2tlciBpbWFnZS5cbiAgICpcbiAgICogIFRoZSB1cmkgc3BlYyBmb2xsb3dzIGh0dHBzOi8vZ2l0aHViLmNvbS9jb250YWluZXJzL3Nrb3Blb1xuICAgKi9cbiAgcmVhZG9ubHkgdXJpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjcmVkZW50aWFscyBvZiB0aGUgZG9ja2VyIGltYWdlLiBGb3JtYXQgYHVzZXI6cGFzc3dvcmRgIG9yIGBBV1MgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBhcm5gIG9yIGBBV1MgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBuYW1lYC5cbiAgICpcbiAgICogSWYgc3BlY2lmeWluZyBhbiBBV1MgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCwgdGhlIGZvcm1hdCBvZiB0aGUgc2VjcmV0IHNob3VsZCBiZSBlaXRoZXIgcGxhaW4gdGV4dCAoYHVzZXI6cGFzc3dvcmRgKSBvclxuICAgKiBKU09OIChge1widXNlcm5hbWVcIjpcIjx1c2VybmFtZT5cIixcInBhc3N3b3JkXCI6XCI8cGFzc3dvcmQ+XCJ9YCkuXG4gICAqXG4gICAqIEZvciBtb3JlIGRldGFpbHMgb24gSlNPTiBmb3JtYXQsIHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9wcml2YXRlLWF1dGguaHRtbFxuICAgKi9cbiAgY3JlZHM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBEb2NrZXJJbWFnZU5hbWUgaW1wbGVtZW50cyBJSW1hZ2VOYW1lIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGltYWdlLCBlLmcuIHJldHJpZXZlZCBmcm9tIGBEb2NrZXJJbWFnZUFzc2V0LmltYWdlVXJpYFxuICAgKiBAcGFyYW0gY3JlZHMgLSBUaGUgY3JlZGVudGlhbHMgb2YgdGhlIGRvY2tlciBpbWFnZS4gRm9ybWF0IGB1c2VyOnBhc3N3b3JkYCBvciBgQVdTIFNlY3JldHMgTWFuYWdlciBzZWNyZXQgYXJuYCBvciBgQVdTIFNlY3JldHMgTWFuYWdlciBzZWNyZXQgbmFtZWAuXG4gICAqICAgICBJZiBzcGVjaWZ5aW5nIGFuIEFXUyBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0LCB0aGUgZm9ybWF0IG9mIHRoZSBzZWNyZXQgc2hvdWxkIGJlIGVpdGhlciBwbGFpbiB0ZXh0IChgdXNlcjpwYXNzd29yZGApIG9yXG4gICAqICAgICBKU09OIChge1widXNlcm5hbWVcIjpcIjx1c2VybmFtZT5cIixcInBhc3N3b3JkXCI6XCI8cGFzc3dvcmQ+XCJ9YCkuXG4gICAqICAgICBGb3IgbW9yZSBkZXRhaWxzIG9uIEpTT04gZm9ybWF0LCBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvcHJpdmF0ZS1hdXRoLmh0bWxcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG5hbWU6IHN0cmluZywgcHVibGljIGNyZWRzPzogc3RyaW5nKSB7IH1cbiAgcHVibGljIGdldCB1cmkoKTogc3RyaW5nIHsgcmV0dXJuIGBkb2NrZXI6Ly8ke3RoaXMubmFtZX1gOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBTM0FyY2hpdmVOYW1lIGltcGxlbWVudHMgSUltYWdlTmFtZSB7XG4gIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gcCAtIHRoZSBTMyBidWNrZXQgbmFtZSBhbmQgcGF0aCBvZiB0aGUgYXJjaGl2ZSAoYSBTMyBVUkkgd2l0aG91dCB0aGUgczM6Ly8pXG4gICAqIEBwYXJhbSByZWYgLSBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBuYW1lIHdpdGggYSBgOmAsIGUuZy4gYDpsYXRlc3RgXG4gICAqIEBwYXJhbSBjcmVkcyAtIFRoZSBjcmVkZW50aWFscyBvZiB0aGUgZG9ja2VyIGltYWdlLiBGb3JtYXQgYHVzZXI6cGFzc3dvcmRgIG9yIGBBV1MgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBhcm5gIG9yIGBBV1MgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBuYW1lYC5cbiAgICogICAgIElmIHNwZWNpZnlpbmcgYW4gQVdTIFNlY3JldHMgTWFuYWdlciBzZWNyZXQsIHRoZSBmb3JtYXQgb2YgdGhlIHNlY3JldCBzaG91bGQgYmUgZWl0aGVyIHBsYWluIHRleHQgKGB1c2VyOnBhc3N3b3JkYCkgb3JcbiAgICogICAgIEpTT04gKGB7XCJ1c2VybmFtZVwiOlwiPHVzZXJuYW1lPlwiLFwicGFzc3dvcmRcIjpcIjxwYXNzd29yZD5cIn1gKS5cbiAgICogICAgIEZvciBtb3JlIGRldGFpbHMgb24gSlNPTiBmb3JtYXQsIHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9wcml2YXRlLWF1dGguaHRtbFxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHA6IHN0cmluZywgcmVmPzogc3RyaW5nLCBwdWJsaWMgY3JlZHM/OiBzdHJpbmcpIHtcbiAgICB0aGlzLm5hbWUgPSBwO1xuICAgIGlmIChyZWYpIHtcbiAgICAgIHRoaXMubmFtZSArPSAnOicgKyByZWY7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgdXJpKCk6IHN0cmluZyB7IHJldHVybiBgczM6Ly8ke3RoaXMubmFtZX1gOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBFQ1JEZXBsb3ltZW50IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHJpdmF0ZSBoYW5kbGVyOiBsYW1iZGEuU2luZ2xldG9uRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEVDUkRlcGxveW1lbnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgY29uc3QgbWVtb3J5TGltaXQgPSBwcm9wcy5tZW1vcnlMaW1pdCA/PyA1MTI7XG4gICAgdGhpcy5oYW5kbGVyID0gbmV3IGxhbWJkYS5TaW5nbGV0b25GdW5jdGlvbih0aGlzLCAnQ3VzdG9tUmVzb3VyY2VIYW5kbGVyJywge1xuICAgICAgdXVpZDogdGhpcy5yZW5kZXJTaW5nbGV0b25VdWlkKG1lbW9yeUxpbWl0KSxcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vbGFtYmRhLWJpbicpKSxcbiAgICAgIHJ1bnRpbWU6IG5ldyBsYW1iZGEuUnVudGltZSgncHJvdmlkZWQuYWwyMDIzJywgUnVudGltZUZhbWlseS5PVEhFUiksIC8vIG5vdCB1c2luZyBSdW50aW1lLlBST1ZJREVEX0FMMjAyMyB0byBzdXBwb3J0IG9sZGVyIENESyB2ZXJzaW9ucyAoPCAyLjEwNS4wKVxuICAgICAgaGFuZGxlcjogJ2Jvb3RzdHJhcCcsXG4gICAgICBsYW1iZGFQdXJwb3NlOiAnQ3VzdG9tOjpDREtFQ1JEZXBsb3ltZW50JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ3VzdG9tIHJlc291cmNlIGhhbmRsZXIgZm9yIGNvcHlpbmcgRG9ja2VyIGltYWdlcyBiZXR3ZWVuIGRvY2tlciByZWdpc3RyaWVzLicsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDE1KSxcbiAgICAgIHJvbGU6IHByb3BzLnJvbGUsXG4gICAgICBtZW1vcnlTaXplOiBtZW1vcnlMaW1pdCxcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgdnBjU3VibmV0czogcHJvcHMudnBjU3VibmV0cyxcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiBwcm9wcy5zZWN1cml0eUdyb3VwcyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGhhbmRsZXJSb2xlID0gdGhpcy5oYW5kbGVyLnJvbGU7XG4gICAgaWYgKCFoYW5kbGVyUm9sZSkgeyB0aHJvdyBuZXcgRXJyb3IoJ2xhbWJkYS5TaW5nbGV0b25GdW5jdGlvbiBzaG91bGQgaGF2ZSBjcmVhdGVkIGEgUm9sZScpOyB9XG5cbiAgICBoYW5kbGVyUm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2VjcjpHZXRBdXRob3JpemF0aW9uVG9rZW4nLFxuICAgICAgICAgICdlY3I6QmF0Y2hDaGVja0xheWVyQXZhaWxhYmlsaXR5JyxcbiAgICAgICAgICAnZWNyOkdldERvd25sb2FkVXJsRm9yTGF5ZXInLFxuICAgICAgICAgICdlY3I6R2V0UmVwb3NpdG9yeVBvbGljeScsXG4gICAgICAgICAgJ2VjcjpEZXNjcmliZVJlcG9zaXRvcmllcycsXG4gICAgICAgICAgJ2VjcjpMaXN0SW1hZ2VzJyxcbiAgICAgICAgICAnZWNyOkRlc2NyaWJlSW1hZ2VzJyxcbiAgICAgICAgICAnZWNyOkJhdGNoR2V0SW1hZ2UnLFxuICAgICAgICAgICdlY3I6TGlzdFRhZ3NGb3JSZXNvdXJjZScsXG4gICAgICAgICAgJ2VjcjpEZXNjcmliZUltYWdlU2NhbkZpbmRpbmdzJyxcbiAgICAgICAgICAnZWNyOkluaXRpYXRlTGF5ZXJVcGxvYWQnLFxuICAgICAgICAgICdlY3I6VXBsb2FkTGF5ZXJQYXJ0JyxcbiAgICAgICAgICAnZWNyOkNvbXBsZXRlTGF5ZXJVcGxvYWQnLFxuICAgICAgICAgICdlY3I6UHV0SW1hZ2UnLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgfSkpO1xuICAgIGhhbmRsZXJSb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgJ3MzOkdldE9iamVjdCcsXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICB9KSk7XG5cbiAgICBpZiAocHJvcHMuaW1hZ2VBcmNoICYmIHByb3BzLmNvcHlJbWFnZUluZGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ltYWdlQXJjaCBhbmQgY29weUltYWdlSW5kZXggY2Fubm90IGJvdGggYmUgc2V0Jyk7XG4gICAgfVxuICAgIGlmICghcHJvcHMuY29weUltYWdlSW5kZXggJiYgcHJvcHMuYXJjaEltYWdlVGFncykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhcmNoSW1hZ2VUYWdzIGNhbiBvbmx5IGJlIHNwZWNpZmllZCB3aGVuIGNvcHlJbWFnZUluZGV4IGlzIHRydWUnKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmltYWdlQXJjaCAmJiBwcm9wcy5pbWFnZUFyY2gubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGltYWdlQXJjaCBtdXN0IGNvbnRhaW4gZXhhY3RseSAxIGVsZW1lbnQsIGdvdCAke0pTT04uc3RyaW5naWZ5KHByb3BzLmltYWdlQXJjaCl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGltYWdlQXJjaCA9IHByb3BzLmltYWdlQXJjaCA/IHByb3BzLmltYWdlQXJjaFswXSA6ICcnO1xuXG4gICAgbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsICdDdXN0b21SZXNvdXJjZScsIHtcbiAgICAgIHNlcnZpY2VUb2tlbjogdGhpcy5oYW5kbGVyLmZ1bmN0aW9uQXJuLFxuICAgICAgLy8gVGhpcyBoYXMgYmVlbiBjb3B5L3Bhc3RlZCBhbmQgaXMgYSBwdXJlIGxpZSwgYnV0IGNoYW5naW5nIGl0IGlzIGdvaW5nIHRvIGNoYW5nZSBwZW9wbGUncyBpbmZyYSEhIFgoXG4gICAgICByZXNvdXJjZVR5cGU6ICdDdXN0b206OkNES0VDUkRlcGxveW1lbnQnLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBTcmNJbWFnZTogcHJvcHMuc3JjLnVyaSxcbiAgICAgICAgU3JjQ3JlZHM6IHByb3BzLnNyYy5jcmVkcyxcbiAgICAgICAgRGVzdEltYWdlOiBwcm9wcy5kZXN0LnVyaSxcbiAgICAgICAgRGVzdENyZWRzOiBwcm9wcy5kZXN0LmNyZWRzLFxuICAgICAgICAuLi5pbWFnZUFyY2ggPyB7IEltYWdlQXJjaDogaW1hZ2VBcmNoIH0gOiB7fSxcbiAgICAgICAgLi4ucHJvcHMuY29weUltYWdlSW5kZXggPyB7IENvcHlJbWFnZUluZGV4OiBwcm9wcy5jb3B5SW1hZ2VJbmRleCB9IDoge30sXG4gICAgICAgIC4uLnByb3BzLmFyY2hJbWFnZVRhZ3MgPyB7IEFyY2hJbWFnZVRhZ3M6IEpTT04uc3RyaW5naWZ5KHByb3BzLmFyY2hJbWFnZVRhZ3MpIH0gOiB7fSxcbiAgICAgICAgLi4ucHJvcHMucmV0cnlDb25maWdzID8geyBSZXRyeUNvbmZpZ3M6IEpTT04uc3RyaW5naWZ5KHByb3BzLnJldHJ5Q29uZmlncykgfSA6IHt9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCk6IEFkZFRvUHJpbmNpcGFsUG9saWN5UmVzdWx0IHtcbiAgICBjb25zdCBoYW5kbGVyUm9sZSA9IHRoaXMuaGFuZGxlci5yb2xlO1xuICAgIGlmICghaGFuZGxlclJvbGUpIHsgdGhyb3cgbmV3IEVycm9yKCdsYW1iZGEuU2luZ2xldG9uRnVuY3Rpb24gc2hvdWxkIGhhdmUgY3JlYXRlZCBhIFJvbGUnKTsgfVxuXG4gICAgcmV0dXJuIGhhbmRsZXJSb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KHN0YXRlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclNpbmdsZXRvblV1aWQobWVtb3J5TGltaXQ/OiBudW1iZXIpIHtcbiAgICBsZXQgdXVpZCA9ICdiZDA3YzkzMC1lZGI5LTQxMTItYTIwZi0wM2YwOTZmNTM2NjYnO1xuXG4gICAgLy8gaWYgdXNlciBzcGVjaWZ5IGEgY3VzdG9tIG1lbW9yeSBsaW1pdCwgZGVmaW5lIGFub3RoZXIgc2luZ2xldG9uIGhhbmRsZXJcbiAgICAvLyB3aXRoIHRoaXMgY29uZmlndXJhdGlvbi4gb3RoZXJ3aXNlLCBpdCB3b24ndCBiZSBwb3NzaWJsZSB0byB1c2UgbXVsdGlwbGVcbiAgICAvLyBjb25maWd1cmF0aW9ucyBzaW5jZSB3ZSBoYXZlIGEgc2luZ2xldG9uLlxuICAgIGlmIChtZW1vcnlMaW1pdCkge1xuICAgICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChtZW1vcnlMaW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IHVzZSB0b2tlbnMgd2hlbiBzcGVjaWZ5aW5nIFwibWVtb3J5TGltaXRcIiBzaW5jZSB3ZSB1c2UgaXQgdG8gaWRlbnRpZnkgdGhlIHNpbmdsZXRvbiBjdXN0b20gcmVzb3VyY2UgaGFuZGxlcicpO1xuICAgICAgfVxuXG4gICAgICB1dWlkICs9IGAtJHttZW1vcnlMaW1pdC50b1N0cmluZygpfU1pQmA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHV1aWQ7XG4gIH1cbn1cbiJdfQ==
|
|
194
|
+
ECRDeployment[_c] = { fqn: "cdk-ecr-deployment.ECRDeployment", version: "4.2.0" };
|
|
195
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxRUFBcUU7QUFDckUsc0NBQXNDO0FBRXRDLDZCQUE2QjtBQUM3Qiw2Q0FBcUk7QUFFckksdURBQXVEO0FBQ3ZELDJDQUF1QztBQXlIdkMsTUFBYSxlQUFlO0lBQzFCOzs7Ozs7T0FNRztJQUNILFlBQTJCLElBQVksRUFBUyxLQUFjO1FBQW5DLFNBQUksR0FBSixJQUFJLENBQVE7UUFBUyxVQUFLLEdBQUwsS0FBSyxDQUFTO0lBQUksQ0FBQztJQUNuRSxJQUFXLEdBQUcsS0FBYSxPQUFPLFlBQVksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzs7QUFUOUQsMENBVUM7OztBQUVELE1BQWEsYUFBYTtJQUd4Qjs7Ozs7OztPQU9HO0lBQ0gsWUFBbUIsQ0FBUyxFQUFFLEdBQVksRUFBUyxLQUFjO1FBQWQsVUFBSyxHQUFMLEtBQUssQ0FBUztRQUMvRCxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFXLEdBQUcsS0FBYSxPQUFPLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzs7QUFqQjFELHNDQWtCQzs7O0FBRUQsTUFBYSxhQUFjLFNBQVEsc0JBQVM7SUFHMUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF5QjtRQUNqRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDO1FBQzdDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSx3QkFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUks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LElBQUksQ0FBQztRQUN0QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFBQyxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7UUFBQyxDQUFDO1FBRTdGLE9BQU8sV0FBVyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxXQUFvQjtRQUM5QyxJQUFJLElBQUksR0FBRyxzQ0FBc0MsQ0FBQztRQUVsRCwwRUFBMEU7UUFDMUUsMkVBQTJFO1FBQzNFLDRDQUE0QztRQUM1QyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLElBQUksbUJBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtSEFBbUgsQ0FBQyxDQUFDO1lBQ3ZJLENBQUM7WUFFRCxJQUFJLElBQUksSUFBSSxXQUFXLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQztRQUMxQyxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOztBQXRKSCxzQ0F1SkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBhd3NfZWMyIGFzIGVjMiwgYXdzX2lhbSBhcyBpYW0sIGF3c19sYW1iZGEgYXMgbGFtYmRhLCBBcm4sIEF3cywgRHVyYXRpb24sIEN1c3RvbVJlc291cmNlLCBTdGFjaywgVG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQsIEFkZFRvUHJpbmNpcGFsUG9saWN5UmVzdWx0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBSdW50aW1lRmFtaWx5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuZXhwb3J0IGludGVyZmFjZSBFQ1JEZXBsb3ltZW50UHJvcHMge1xuICAvKipcbiAgICogVGhlIHNvdXJjZSBvZiB0aGUgZG9ja2VyIGltYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgc3JjOiBJSW1hZ2VOYW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzdGluYXRpb24gb2YgdGhlIGRvY2tlciBpbWFnZS5cbiAgICovXG4gIHJlYWRvbmx5IGRlc3Q6IElJbWFnZU5hbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBhcmNoaXRlY3R1cmUgdG8gYmUgY29waWVkLlxuICAgKlxuICAgKiBUaGUgJ2FtZDY0JyBhcmNoaXRlY3R1cmUgd2lsbCBiZSBjb3BpZWQgYnkgZGVmYXVsdC4gU3BlY2lmeSB0aGVcbiAgICogYXJjaGl0ZWN0dXJlIG9yIGFyY2hpdGVjdHVyZXMgdG8gY29weSBoZXJlLlxuICAgKlxuICAgKiBJdCBpcyBjdXJyZW50bHkgbm90IHBvc3NpYmxlIHRvIGNvcHkgbW9yZSB0aGFuIG9uZSBhcmNoaXRlY3R1cmVcbiAgICogYXQgYSB0aW1lOiB0aGUgYXJyYXkgeW91IHNwZWNpZnkgbXVzdCBjb250YWluIGV4YWN0bHkgb25lIHN0cmluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgWydhbWQ2NCddXG4gICAqL1xuICByZWFkb25seSBpbWFnZUFyY2g/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBjb3B5IGEgc291cmNlIGRvY2tlciBpbWFnZSBpbmRleCAobXVsdGktYXJjaCBtYW5pZmVzdCkgdG8gdGhlIGRlc3RpbmF0aW9uLlxuICAgKlxuICAgKiBXaGVuIHRydWUsIGNvcGllcyB0aGUgaW1hZ2UgaW5kZXggYW5kIGFsbCB1bmRlcmx5aW5nIGFyY2hpdGVjdHVyZS1zcGVjaWZpY1xuICAgKiBpbWFnZXMgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBGYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgY29weUltYWdlSW5kZXg/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUYWdzIHRvIGFwcGx5IHRvIGluZGl2aWR1YWwgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGltYWdlcyB3aGVuXG4gICAqIGNvcHlJbWFnZUluZGV4IGlzIHRydWUuXG4gICAqXG4gICAqIENhbiBvbmx5IGJlIHNwZWNpZmllZCB3aGVuIGNvcHlJbWFnZUluZGV4IGlzIHRydWUuIE1hcHMgYXJjaGl0ZWN0dXJlIG5hbWVzIHRvXG4gICAqIHRoZWlyIHJlc3BlY3RpdmUgdGFncy4gVGhpcyBtYWtlcyBpbmRpdmlkdWFsIGFyY2hpdGVjdHVyZXMgZGlzY292ZXJhYmxlXG4gICAqIGJ5IGh1bWFuLXJlYWRhYmxlIHRhZ3MgaW4gYWRkaXRpb24gdG8gdGhlIGltYWdlIGluZGV4IHRhZy5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIHsgJ2FybTY0JzogJ2ltYWdlLWFybTY0JywgJ2FtZDY0JzogJ2ltYWdlLWFtZDY0JyB9LlxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaEltYWdlVGFncz86IHsgW2FyY2hpdGVjdHVyZTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIFJldHJ5IGNvbmZpZ3VyYXRpb24gdG8gYXBwbHkgdG8gd2hlbiBjb3B5aW5nIGltYWdlcyBzdWNoIGFzIHRoZSBudW1iZXIgb2YgcmV0cnkgYXR0ZW10cHMsXG4gICAqIHRoZSBiYXNlIGFtb3VudCBvZiBkZWxheSAoaW4gc2Vjb25kcykgYmV0d2VlbiBlYWNoIHJldHJ5LCBhbmQgdGhlIG1heCBhbW91bnQgb2YgZGVsYXkgKGluIHNlY29uZHMpXG4gICAqIGJldHdlZW4gZWFjaCByZXRyeS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIHsgJ251bUF0dGVtcHRzJzogMywgJ2Jhc2VEZWxheSc6IDEsICdtYXhEZWxheSc6IDUgfVxuICAgKi9cbiAgcmVhZG9ubHkgcmV0cnlDb25maWdzPzogeyBbZmllbGRzOiBzdHJpbmddOiBudW1iZXIgfTtcblxuICAvKipcbiAgICogVGhlIGFtb3VudCBvZiBtZW1vcnkgKGluIE1pQikgdG8gYWxsb2NhdGUgdG8gdGhlIEFXUyBMYW1iZGEgZnVuY3Rpb24gd2hpY2hcbiAgICogcmVwbGljYXRlcyB0aGUgZmlsZXMgZnJvbSB0aGUgQ0RLIGJ1Y2tldCB0byB0aGUgZGVzdGluYXRpb24gYnVja2V0LlxuICAgKlxuICAgKiBJZiB5b3UgYXJlIGRlcGxveWluZyBsYXJnZSBmaWxlcywgeW91IHdpbGwgbmVlZCB0byBpbmNyZWFzZSB0aGlzIG51bWJlclxuICAgKiBhY2NvcmRpbmdseS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSA1MTJcbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeUxpbWl0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBFeGVjdXRpb24gcm9sZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBmdW5jdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEEgcm9sZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgbmV0d29yayB0byBwbGFjZSB0aGUgZGVwbG95bWVudCBsYW1iZGEgaGFuZGxlciBpbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lXG4gICAqL1xuICByZWFkb25seSB2cGM/OiBlYzIuSVZwYztcblxuICAvKipcbiAgICogV2hlcmUgaW4gdGhlIFZQQyB0byBwbGFjZSB0aGUgZGVwbG95bWVudCBsYW1iZGEgaGFuZGxlci5cbiAgICogT25seSB1c2VkIGlmICd2cGMnIGlzIHN1cHBsaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBWcGMgZGVmYXVsdCBzdHJhdGVneSBpZiBub3Qgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSB2cGNTdWJuZXRzPzogZWMyLlN1Ym5ldFNlbGVjdGlvbjtcblxuICAvKipcbiAgICogVGhlIGxpc3Qgb2Ygc2VjdXJpdHkgZ3JvdXBzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBMYW1iZGEncyBuZXR3b3JrIGludGVyZmFjZXMuXG4gICAqXG4gICAqIE9ubHkgdXNlZCBpZiAndnBjJyBpcyBzdXBwbGllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiB0aGUgZnVuY3Rpb24gaXMgcGxhY2VkIHdpdGhpbiBhIFZQQyBhbmQgYSBzZWN1cml0eSBncm91cCBpc1xuICAgKiBub3Qgc3BlY2lmaWVkLCBlaXRoZXIgYnkgdGhpcyBvciBzZWN1cml0eUdyb3VwIHByb3AsIGEgZGVkaWNhdGVkIHNlY3VyaXR5XG4gICAqIGdyb3VwIHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhpcyBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBzPzogZWMyLlNlY3VyaXR5R3JvdXBbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSW1hZ2VOYW1lIHtcbiAgLyoqXG4gICAqICBUaGUgdXJpIG9mIHRoZSBkb2NrZXIgaW1hZ2UuXG4gICAqXG4gICAqICBUaGUgdXJpIHNwZWMgZm9sbG93cyBodHRwczovL2dpdGh1Yi5jb20vY29udGFpbmVycy9za29wZW9cbiAgICovXG4gIHJlYWRvbmx5IHVyaTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY3JlZGVudGlhbHMgb2YgdGhlIGRvY2tlciBpbWFnZS4gRm9ybWF0IGB1c2VyOnBhc3N3b3JkYCBvciBgQVdTIFNlY3JldHMgTWFuYWdlciBzZWNyZXQgYXJuYCBvciBgQVdTIFNlY3JldHMgTWFuYWdlciBzZWNyZXQgbmFtZWAuXG4gICAqXG4gICAqIElmIHNwZWNpZnlpbmcgYW4gQVdTIFNlY3JldHMgTWFuYWdlciBzZWNyZXQsIHRoZSBmb3JtYXQgb2YgdGhlIHNlY3JldCBzaG91bGQgYmUgZWl0aGVyIHBsYWluIHRleHQgKGB1c2VyOnBhc3N3b3JkYCkgb3JcbiAgICogSlNPTiAoYHtcInVzZXJuYW1lXCI6XCI8dXNlcm5hbWU+XCIsXCJwYXNzd29yZFwiOlwiPHBhc3N3b3JkPlwifWApLlxuICAgKlxuICAgKiBGb3IgbW9yZSBkZXRhaWxzIG9uIEpTT04gZm9ybWF0LCBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvcHJpdmF0ZS1hdXRoLmh0bWxcbiAgICovXG4gIGNyZWRzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgRG9ja2VySW1hZ2VOYW1lIGltcGxlbWVudHMgSUltYWdlTmFtZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBpbWFnZSwgZS5nLiByZXRyaWV2ZWQgZnJvbSBgRG9ja2VySW1hZ2VBc3NldC5pbWFnZVVyaWBcbiAgICogQHBhcmFtIGNyZWRzIC0gVGhlIGNyZWRlbnRpYWxzIG9mIHRoZSBkb2NrZXIgaW1hZ2UuIEZvcm1hdCBgdXNlcjpwYXNzd29yZGAgb3IgYEFXUyBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IGFybmAgb3IgYEFXUyBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IG5hbWVgLlxuICAgKiAgICAgSWYgc3BlY2lmeWluZyBhbiBBV1MgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCwgdGhlIGZvcm1hdCBvZiB0aGUgc2VjcmV0IHNob3VsZCBiZSBlaXRoZXIgcGxhaW4gdGV4dCAoYHVzZXI6cGFzc3dvcmRgKSBvclxuICAgKiAgICAgSlNPTiAoYHtcInVzZXJuYW1lXCI6XCI8dXNlcm5hbWU+XCIsXCJwYXNzd29yZFwiOlwiPHBhc3N3b3JkPlwifWApLlxuICAgKiAgICAgRm9yIG1vcmUgZGV0YWlscyBvbiBKU09OIGZvcm1hdCwgc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3ByaXZhdGUtYXV0aC5odG1sXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBuYW1lOiBzdHJpbmcsIHB1YmxpYyBjcmVkcz86IHN0cmluZykgeyB9XG4gIHB1YmxpYyBnZXQgdXJpKCk6IHN0cmluZyB7IHJldHVybiBgZG9ja2VyOi8vJHt0aGlzLm5hbWV9YDsgfVxufVxuXG5leHBvcnQgY2xhc3MgUzNBcmNoaXZlTmFtZSBpbXBsZW1lbnRzIElJbWFnZU5hbWUge1xuICBwcml2YXRlIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQHBhcmFtIHAgLSB0aGUgUzMgYnVja2V0IG5hbWUgYW5kIHBhdGggb2YgdGhlIGFyY2hpdmUgKGEgUzMgVVJJIHdpdGhvdXQgdGhlIHMzOi8vKVxuICAgKiBAcGFyYW0gcmVmIC0gYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgbmFtZSB3aXRoIGEgYDpgLCBlLmcuIGA6bGF0ZXN0YFxuICAgKiBAcGFyYW0gY3JlZHMgLSBUaGUgY3JlZGVudGlhbHMgb2YgdGhlIGRvY2tlciBpbWFnZS4gRm9ybWF0IGB1c2VyOnBhc3N3b3JkYCBvciBgQVdTIFNlY3JldHMgTWFuYWdlciBzZWNyZXQgYXJuYCBvciBgQVdTIFNlY3JldHMgTWFuYWdlciBzZWNyZXQgbmFtZWAuXG4gICAqICAgICBJZiBzcGVjaWZ5aW5nIGFuIEFXUyBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0LCB0aGUgZm9ybWF0IG9mIHRoZSBzZWNyZXQgc2hvdWxkIGJlIGVpdGhlciBwbGFpbiB0ZXh0IChgdXNlcjpwYXNzd29yZGApIG9yXG4gICAqICAgICBKU09OIChge1widXNlcm5hbWVcIjpcIjx1c2VybmFtZT5cIixcInBhc3N3b3JkXCI6XCI8cGFzc3dvcmQ+XCJ9YCkuXG4gICAqICAgICBGb3IgbW9yZSBkZXRhaWxzIG9uIEpTT04gZm9ybWF0LCBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvcHJpdmF0ZS1hdXRoLmh0bWxcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwOiBzdHJpbmcsIHJlZj86IHN0cmluZywgcHVibGljIGNyZWRzPzogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gcDtcbiAgICBpZiAocmVmKSB7XG4gICAgICB0aGlzLm5hbWUgKz0gJzonICsgcmVmO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IHVyaSgpOiBzdHJpbmcgeyByZXR1cm4gYHMzOi8vJHt0aGlzLm5hbWV9YDsgfVxufVxuXG5leHBvcnQgY2xhc3MgRUNSRGVwbG95bWVudCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHByaXZhdGUgaGFuZGxlcjogbGFtYmRhLlNpbmdsZXRvbkZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBFQ1JEZXBsb3ltZW50UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIGNvbnN0IG1lbW9yeUxpbWl0ID0gcHJvcHMubWVtb3J5TGltaXQgPz8gNTEyO1xuICAgIHRoaXMuaGFuZGxlciA9IG5ldyBsYW1iZGEuU2luZ2xldG9uRnVuY3Rpb24odGhpcywgJ0N1c3RvbVJlc291cmNlSGFuZGxlcicsIHtcbiAgICAgIHV1aWQ6IHRoaXMucmVuZGVyU2luZ2xldG9uVXVpZChtZW1vcnlMaW1pdCksXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2xhbWJkYS1iaW4nKSksXG4gICAgICBydW50aW1lOiBuZXcgbGFtYmRhLlJ1bnRpbWUoJ3Byb3ZpZGVkLmFsMjAyMycsIFJ1bnRpbWVGYW1pbHkuT1RIRVIpLCAvLyBub3QgdXNpbmcgUnVudGltZS5QUk9WSURFRF9BTDIwMjMgdG8gc3VwcG9ydCBvbGRlciBDREsgdmVyc2lvbnMgKDwgMi4xMDUuMClcbiAgICAgIGhhbmRsZXI6ICdib290c3RyYXAnLFxuICAgICAgbGFtYmRhUHVycG9zZTogJ0N1c3RvbTo6Q0RLRUNSRGVwbG95bWVudCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0N1c3RvbSByZXNvdXJjZSBoYW5kbGVyIGZvciBjb3B5aW5nIERvY2tlciBpbWFnZXMgYmV0d2VlbiBkb2NrZXIgcmVnaXN0cmllcy4nLFxuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxNSksXG4gICAgICByb2xlOiBwcm9wcy5yb2xlLFxuICAgICAgbWVtb3J5U2l6ZTogbWVtb3J5TGltaXQsXG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIHZwY1N1Ym5ldHM6IHByb3BzLnZwY1N1Ym5ldHMsXG4gICAgICBzZWN1cml0eUdyb3VwczogcHJvcHMuc2VjdXJpdHlHcm91cHMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBoYW5kbGVyUm9sZSA9IHRoaXMuaGFuZGxlci5yb2xlO1xuICAgIGlmICghaGFuZGxlclJvbGUpIHsgdGhyb3cgbmV3IEVycm9yKCdsYW1iZGEuU2luZ2xldG9uRnVuY3Rpb24gc2hvdWxkIGhhdmUgY3JlYXRlZCBhIFJvbGUnKTsgfVxuXG4gICAgaGFuZGxlclJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdlY3I6R2V0QXV0aG9yaXphdGlvblRva2VuJyxcbiAgICAgICAgICAnZWNyOkJhdGNoQ2hlY2tMYXllckF2YWlsYWJpbGl0eScsXG4gICAgICAgICAgJ2VjcjpHZXREb3dubG9hZFVybEZvckxheWVyJyxcbiAgICAgICAgICAnZWNyOkdldFJlcG9zaXRvcnlQb2xpY3knLFxuICAgICAgICAgICdlY3I6RGVzY3JpYmVSZXBvc2l0b3JpZXMnLFxuICAgICAgICAgICdlY3I6TGlzdEltYWdlcycsXG4gICAgICAgICAgJ2VjcjpEZXNjcmliZUltYWdlcycsXG4gICAgICAgICAgJ2VjcjpCYXRjaEdldEltYWdlJyxcbiAgICAgICAgICAnZWNyOkxpc3RUYWdzRm9yUmVzb3VyY2UnLFxuICAgICAgICAgICdlY3I6RGVzY3JpYmVJbWFnZVNjYW5GaW5kaW5ncycsXG4gICAgICAgICAgJ2VjcjpJbml0aWF0ZUxheWVyVXBsb2FkJyxcbiAgICAgICAgICAnZWNyOlVwbG9hZExheWVyUGFydCcsXG4gICAgICAgICAgJ2VjcjpDb21wbGV0ZUxheWVyVXBsb2FkJyxcbiAgICAgICAgICAnZWNyOlB1dEltYWdlJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIH0pKTtcbiAgICBoYW5kbGVyUm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgICdzMzpHZXRPYmplY3QnLFxuICAgICAgXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSkpO1xuXG4gICAgLy8gQXV0by1hdHRhY2ggcHVibGljIEVDUiBwZXJtaXNzaW9ucyB3aGVuIHRoZSBkZXN0aW5hdGlvbiBpcyBhIHB1YmxpYyBFQ1IgcmVnaXN0cnkuXG4gICAgLy8gV2hlbiBkZXN0IGlzIHB1YmxpYyBFQ1IsIHRoZSBhdXRoIHRva2VuIHBlcm1pc3Npb25zIGFsc28gY292ZXIgc291cmNlLXNpZGUgYXV0aFxuICAgIC8vIGlmIHRoZSBzb3VyY2UgaGFwcGVucyB0byBiZSBwdWJsaWMgRUNSIHRvby5cbiAgICBpZiAocHJvcHMuZGVzdC51cmkuaW5jbHVkZXMoJ3B1YmxpYy5lY3IuYXdzJykpIHtcbiAgICAgIGhhbmRsZXJSb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2Vjci1wdWJsaWM6R2V0QXV0aG9yaXphdGlvblRva2VuJyxcbiAgICAgICAgICAnc3RzOkdldFNlcnZpY2VCZWFyZXJUb2tlbicsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICB9KSk7XG5cbiAgICAgIGhhbmRsZXJSb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2Vjci1wdWJsaWM6QmF0Y2hDaGVja0xheWVyQXZhaWxhYmlsaXR5JyxcbiAgICAgICAgICAnZWNyLXB1YmxpYzpJbml0aWF0ZUxheWVyVXBsb2FkJyxcbiAgICAgICAgICAnZWNyLXB1YmxpYzpVcGxvYWRMYXllclBhcnQnLFxuICAgICAgICAgICdlY3ItcHVibGljOkNvbXBsZXRlTGF5ZXJVcGxvYWQnLFxuICAgICAgICAgICdlY3ItcHVibGljOlB1dEltYWdlJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgLy8gUHVibGljIEVDUiBpcyBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgJ2F3cycgcGFydGl0aW9uIChub3QgYXdzLWNuIG9yIGF3cy11cy1nb3YpXG4gICAgICAgICAgQXJuLmZvcm1hdCh7XG4gICAgICAgICAgICBwYXJ0aXRpb246ICdhd3MnLFxuICAgICAgICAgICAgc2VydmljZTogJ2Vjci1wdWJsaWMnLFxuICAgICAgICAgICAgcmVnaW9uOiAnJyxcbiAgICAgICAgICAgIGFjY291bnQ6IEF3cy5BQ0NPVU5UX0lELFxuICAgICAgICAgICAgcmVzb3VyY2U6ICdyZXBvc2l0b3J5JyxcbiAgICAgICAgICAgIHJlc291cmNlTmFtZTogJyonLFxuICAgICAgICAgIH0sIFN0YWNrLm9mKHRoaXMpKSxcbiAgICAgICAgXSxcbiAgICAgIH0pKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLnNyYy51cmkuaW5jbHVkZXMoJ3B1YmxpYy5lY3IuYXdzJykpIHtcbiAgICAgIC8vIFdoZW4gcmVhZGluZyBmcm9tIHB1YmxpYyBFQ1IsIHRoZSBMYW1iZGEgc3RpbGwgYXV0aGVudGljYXRlcyB2aWFcbiAgICAgIC8vIGVjci1wdWJsaWM6R2V0QXV0aG9yaXphdGlvblRva2VuLiBHcmFudCB0aGUgbWluaW1hbCByZWFkLWF1dGggcGVybWlzc2lvbnMuXG4gICAgICBoYW5kbGVyUm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdlY3ItcHVibGljOkdldEF1dGhvcml6YXRpb25Ub2tlbicsXG4gICAgICAgICAgJ3N0czpHZXRTZXJ2aWNlQmVhcmVyVG9rZW4nLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5pbWFnZUFyY2ggJiYgcHJvcHMuY29weUltYWdlSW5kZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW1hZ2VBcmNoIGFuZCBjb3B5SW1hZ2VJbmRleCBjYW5ub3QgYm90aCBiZSBzZXQnKTtcbiAgICB9XG4gICAgaWYgKCFwcm9wcy5jb3B5SW1hZ2VJbmRleCAmJiBwcm9wcy5hcmNoSW1hZ2VUYWdzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FyY2hJbWFnZVRhZ3MgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIHdoZW4gY29weUltYWdlSW5kZXggaXMgdHJ1ZScpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuaW1hZ2VBcmNoICYmIHByb3BzLmltYWdlQXJjaC5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW1hZ2VBcmNoIG11c3QgY29udGFpbiBleGFjdGx5IDEgZWxlbWVudCwgZ290ICR7SlNPTi5zdHJpbmdpZnkocHJvcHMuaW1hZ2VBcmNoKX1gKTtcbiAgICB9XG4gICAgY29uc3QgaW1hZ2VBcmNoID0gcHJvcHMuaW1hZ2VBcmNoID8gcHJvcHMuaW1hZ2VBcmNoWzBdIDogJyc7XG5cbiAgICBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgJ0N1c3RvbVJlc291cmNlJywge1xuICAgICAgc2VydmljZVRva2VuOiB0aGlzLmhhbmRsZXIuZnVuY3Rpb25Bcm4sXG4gICAgICAvLyBUaGlzIGhhcyBiZWVuIGNvcHkvcGFzdGVkIGFuZCBpcyBhIHB1cmUgbGllLCBidXQgY2hhbmdpbmcgaXQgaXMgZ29pbmcgdG8gY2hhbmdlIHBlb3BsZSdzIGluZnJhISEgWChcbiAgICAgIHJlc291cmNlVHlwZTogJ0N1c3RvbTo6Q0RLRUNSRGVwbG95bWVudCcsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFNyY0ltYWdlOiBwcm9wcy5zcmMudXJpLFxuICAgICAgICBTcmNDcmVkczogcHJvcHMuc3JjLmNyZWRzLFxuICAgICAgICBEZXN0SW1hZ2U6IHByb3BzLmRlc3QudXJpLFxuICAgICAgICBEZXN0Q3JlZHM6IHByb3BzLmRlc3QuY3JlZHMsXG4gICAgICAgIC4uLmltYWdlQXJjaCA/IHsgSW1hZ2VBcmNoOiBpbWFnZUFyY2ggfSA6IHt9LFxuICAgICAgICAuLi5wcm9wcy5jb3B5SW1hZ2VJbmRleCA/IHsgQ29weUltYWdlSW5kZXg6IHByb3BzLmNvcHlJbWFnZUluZGV4IH0gOiB7fSxcbiAgICAgICAgLi4ucHJvcHMuYXJjaEltYWdlVGFncyA/IHsgQXJjaEltYWdlVGFnczogSlNPTi5zdHJpbmdpZnkocHJvcHMuYXJjaEltYWdlVGFncykgfSA6IHt9LFxuICAgICAgICAuLi5wcm9wcy5yZXRyeUNvbmZpZ3MgPyB7IFJldHJ5Q29uZmlnczogSlNPTi5zdHJpbmdpZnkocHJvcHMucmV0cnlDb25maWdzKSB9IDoge30sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFkZFRvUHJpbmNpcGFsUG9saWN5KHN0YXRlbWVudDogUG9saWN5U3RhdGVtZW50KTogQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQge1xuICAgIGNvbnN0IGhhbmRsZXJSb2xlID0gdGhpcy5oYW5kbGVyLnJvbGU7XG4gICAgaWYgKCFoYW5kbGVyUm9sZSkgeyB0aHJvdyBuZXcgRXJyb3IoJ2xhbWJkYS5TaW5nbGV0b25GdW5jdGlvbiBzaG91bGQgaGF2ZSBjcmVhdGVkIGEgUm9sZScpOyB9XG5cbiAgICByZXR1cm4gaGFuZGxlclJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3koc3RhdGVtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyU2luZ2xldG9uVXVpZChtZW1vcnlMaW1pdD86IG51bWJlcikge1xuICAgIGxldCB1dWlkID0gJ2JkMDdjOTMwLWVkYjktNDExMi1hMjBmLTAzZjA5NmY1MzY2Nic7XG5cbiAgICAvLyBpZiB1c2VyIHNwZWNpZnkgYSBjdXN0b20gbWVtb3J5IGxpbWl0LCBkZWZpbmUgYW5vdGhlciBzaW5nbGV0b24gaGFuZGxlclxuICAgIC8vIHdpdGggdGhpcyBjb25maWd1cmF0aW9uLiBvdGhlcndpc2UsIGl0IHdvbid0IGJlIHBvc3NpYmxlIHRvIHVzZSBtdWx0aXBsZVxuICAgIC8vIGNvbmZpZ3VyYXRpb25zIHNpbmNlIHdlIGhhdmUgYSBzaW5nbGV0b24uXG4gICAgaWYgKG1lbW9yeUxpbWl0KSB7XG4gICAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKG1lbW9yeUxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgdXNlIHRva2VucyB3aGVuIHNwZWNpZnlpbmcgXCJtZW1vcnlMaW1pdFwiIHNpbmNlIHdlIHVzZSBpdCB0byBpZGVudGlmeSB0aGUgc2luZ2xldG9uIGN1c3RvbSByZXNvdXJjZSBoYW5kbGVyJyk7XG4gICAgICB9XG5cbiAgICAgIHV1aWQgKz0gYC0ke21lbW9yeUxpbWl0LnRvU3RyaW5nKCl9TWlCYDtcbiAgICB9XG5cbiAgICByZXR1cm4gdXVpZDtcbiAgfVxufVxuIl19
|