aws-delivlib 13.4.2 → 13.4.6

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.
Files changed (72) hide show
  1. package/cdk.out/{asset.e12c7af9b638ac5f6e69012fdab4a414bd0c107b6a233304e64b443a621ecd20 → asset.1c4d00e8f9125a52b4db3e74494c950959ffa433738adcf5c9f7251e4d255451}/create-release.js +0 -0
  2. package/cdk.out/{asset.e12c7af9b638ac5f6e69012fdab4a414bd0c107b6a233304e64b443a621ecd20 → asset.1c4d00e8f9125a52b4db3e74494c950959ffa433738adcf5c9f7251e4d255451}/package-lock.json +100 -95
  3. package/cdk.out/{asset.e12c7af9b638ac5f6e69012fdab4a414bd0c107b6a233304e64b443a621ecd20 → asset.1c4d00e8f9125a52b4db3e74494c950959ffa433738adcf5c9f7251e4d255451}/package.json +0 -0
  4. package/cdk.out/{asset.e12c7af9b638ac5f6e69012fdab4a414bd0c107b6a233304e64b443a621ecd20 → asset.1c4d00e8f9125a52b4db3e74494c950959ffa433738adcf5c9f7251e4d255451}/publish.sh +0 -0
  5. package/cdk.out/{asset.e12c7af9b638ac5f6e69012fdab4a414bd0c107b6a233304e64b443a621ecd20 → asset.1c4d00e8f9125a52b4db3e74494c950959ffa433738adcf5c9f7251e4d255451}/sign-files.sh +0 -0
  6. package/cdk.out/{asset.e12c7af9b638ac5f6e69012fdab4a414bd0c107b6a233304e64b443a621ecd20 → asset.1c4d00e8f9125a52b4db3e74494c950959ffa433738adcf5c9f7251e4d255451}/with-signing-key.sh +0 -0
  7. package/cdk.out/{asset.dc2e98009b027861f34e56eebb81faa5a3951ed9da80ce4a903a45de04268238 → asset.3044256b9586ecb8a7709713aaca30ceb34f699e3f93c8858f633aaf2f0c7140}/index.js +17 -11
  8. package/cdk.out/delivlib-test.assets.json +8 -8
  9. package/cdk.out/delivlib-test.template.json +32 -27
  10. package/cdk.out/manifest.json +272 -272
  11. package/cdk.out/tree.json +442 -437
  12. package/lib/custom-resource-handlers/src/certificate-signing-request.tsbuildinfo +1 -1
  13. package/lib/custom-resource-handlers/src/pgp-secret.tsbuildinfo +1 -1
  14. package/lib/custom-resource-handlers/src/private-key.tsbuildinfo +1 -1
  15. package/lib/publishing/github/package-lock.json +100 -95
  16. package/package.json +17 -18
  17. package/lib/__tests__/auto-build.test.d.ts +0 -1
  18. package/lib/__tests__/auto-build.test.js +0 -119
  19. package/lib/__tests__/build-spec.test.d.ts +0 -1
  20. package/lib/__tests__/build-spec.test.js +0 -82
  21. package/lib/__tests__/bump.test.d.ts +0 -1
  22. package/lib/__tests__/bump.test.js +0 -284
  23. package/lib/__tests__/canary.test.d.ts +0 -1
  24. package/lib/__tests__/canary.test.js +0 -144
  25. package/lib/__tests__/change-control-lambda/disable-transition.test.d.ts +0 -1
  26. package/lib/__tests__/change-control-lambda/disable-transition.test.js +0 -64
  27. package/lib/__tests__/change-control-lambda/handler.test.d.ts +0 -1
  28. package/lib/__tests__/change-control-lambda/handler.test.js +0 -143
  29. package/lib/__tests__/change-control-lambda/time-window.test.d.ts +0 -1
  30. package/lib/__tests__/change-control-lambda/time-window.test.js +0 -131
  31. package/lib/__tests__/chime-notifier.test.d.ts +0 -6
  32. package/lib/__tests__/chime-notifier.test.js +0 -138
  33. package/lib/__tests__/code-signing-cert.test.d.ts +0 -1
  34. package/lib/__tests__/code-signing-cert.test.js +0 -72
  35. package/lib/__tests__/custom-resource-handlers/_cloud-formation.test.d.ts +0 -1
  36. package/lib/__tests__/custom-resource-handlers/_cloud-formation.test.js +0 -100
  37. package/lib/__tests__/custom-resource-handlers/_exec.test.d.ts +0 -1
  38. package/lib/__tests__/custom-resource-handlers/_exec.test.js +0 -9
  39. package/lib/__tests__/custom-resource-handlers/_rmrf.test.d.ts +0 -1
  40. package/lib/__tests__/custom-resource-handlers/_rmrf.test.js +0 -13
  41. package/lib/__tests__/custom-resource-handlers/certificate-signing-request.test.d.ts +0 -1
  42. package/lib/__tests__/custom-resource-handlers/certificate-signing-request.test.js +0 -171
  43. package/lib/__tests__/custom-resource-handlers/pgp-secret.test.d.ts +0 -1
  44. package/lib/__tests__/custom-resource-handlers/pgp-secret.test.js +0 -169
  45. package/lib/__tests__/custom-resource-handlers/private-key.test.d.ts +0 -1
  46. package/lib/__tests__/custom-resource-handlers/private-key.test.js +0 -164
  47. package/lib/__tests__/integ.delivlib.d.ts +0 -1
  48. package/lib/__tests__/integ.delivlib.js +0 -33
  49. package/lib/__tests__/open-pgp-key-pair.test.d.ts +0 -1
  50. package/lib/__tests__/open-pgp-key-pair.test.js +0 -130
  51. package/lib/__tests__/pipeline-notifications/chime.test.d.ts +0 -1
  52. package/lib/__tests__/pipeline-notifications/chime.test.js +0 -69
  53. package/lib/__tests__/pipeline-notifications/slack.test.d.ts +0 -1
  54. package/lib/__tests__/pipeline-notifications/slack.test.js +0 -82
  55. package/lib/__tests__/pipeline.test.d.ts +0 -1
  56. package/lib/__tests__/pipeline.test.js +0 -362
  57. package/lib/__tests__/pr.test.d.ts +0 -3
  58. package/lib/__tests__/pr.test.js +0 -88
  59. package/lib/__tests__/publishing.test.d.ts +0 -1
  60. package/lib/__tests__/publishing.test.js +0 -89
  61. package/lib/__tests__/registry-sync/ecr-mirror.test.d.ts +0 -1
  62. package/lib/__tests__/registry-sync/ecr-mirror.test.js +0 -313
  63. package/lib/__tests__/registry-sync/mirror-source.test.d.ts +0 -1
  64. package/lib/__tests__/registry-sync/mirror-source.test.js +0 -225
  65. package/lib/__tests__/shellable.test.d.ts +0 -1
  66. package/lib/__tests__/shellable.test.js +0 -479
  67. package/lib/__tests__/test-stack.d.ts +0 -4
  68. package/lib/__tests__/test-stack.js +0 -184
  69. package/lib/__tests__/watcher-handler.test.d.ts +0 -1
  70. package/lib/__tests__/watcher-handler.test.js +0 -190
  71. package/lib/__tests__/watcher.test.d.ts +0 -1
  72. package/lib/__tests__/watcher.test.js +0 -78
@@ -1,82 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
- Object.defineProperty(o, "default", { enumerable: true, value: v });
11
- }) : function(o, v) {
12
- o["default"] = v;
13
- });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
21
- Object.defineProperty(exports, "__esModule", { value: true });
22
- const delivlib = __importStar(require("../../lib"));
23
- test('buildspec single artifact goes to "artifacts"', () => {
24
- const bs = delivlib.BuildSpec.simple({
25
- build: ['echo hello > foo/file.txt'],
26
- artifactDirectory: 'foo',
27
- });
28
- const rendered = bs.render();
29
- expect(rendered).toEqual({
30
- artifacts: {
31
- 'base-directory': 'foo',
32
- 'files': [
33
- '**/*',
34
- ],
35
- },
36
- phases: {
37
- build: {
38
- commands: [
39
- 'echo hello > foo/file.txt',
40
- ],
41
- },
42
- },
43
- version: '0.2',
44
- });
45
- });
46
- test('buildspec multiple artifacts all go into "secondary-artifacts"', () => {
47
- const bs = delivlib.BuildSpec.simple({
48
- build: ['echo hello > foo/file.txt'],
49
- artifactDirectory: 'foo',
50
- additionalArtifactDirectories: {
51
- artifact2: 'boo',
52
- },
53
- });
54
- const rendered = bs.render({ primaryArtifactName: 'primrose' });
55
- expect(rendered).toEqual({
56
- artifacts: {
57
- 'secondary-artifacts': {
58
- primrose: {
59
- 'base-directory': 'foo',
60
- 'files': [
61
- '**/*',
62
- ],
63
- },
64
- artifact2: {
65
- 'base-directory': 'boo',
66
- 'files': [
67
- '**/*',
68
- ],
69
- },
70
- },
71
- },
72
- phases: {
73
- build: {
74
- commands: [
75
- 'echo hello > foo/file.txt',
76
- ],
77
- },
78
- },
79
- version: '0.2',
80
- });
81
- });
82
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtc3BlYy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYnVpbGQtc3BlYy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUFzQztBQUd0QyxJQUFJLENBQUMsK0NBQStDLEVBQUUsR0FBRyxFQUFFO0lBQ3pELE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQ25DLEtBQUssRUFBRSxDQUFDLDJCQUEyQixDQUFDO1FBQ3BDLGlCQUFpQixFQUFFLEtBQUs7S0FDekIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBRTdCLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDdkIsU0FBUyxFQUFFO1lBQ1QsZ0JBQWdCLEVBQUUsS0FBSztZQUN2QixPQUFPLEVBQUU7Z0JBQ1AsTUFBTTthQUNQO1NBQ0Y7UUFDRCxNQUFNLEVBQUU7WUFDTixLQUFLLEVBQUU7Z0JBQ0wsUUFBUSxFQUFFO29CQUNSLDJCQUEyQjtpQkFDNUI7YUFDRjtTQUNGO1FBQ0QsT0FBTyxFQUFFLEtBQUs7S0FDZixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVILElBQUksQ0FBQyxnRUFBZ0UsRUFBRSxHQUFHLEVBQUU7SUFDMUUsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDbkMsS0FBSyxFQUFFLENBQUMsMkJBQTJCLENBQUM7UUFDcEMsaUJBQWlCLEVBQUUsS0FBSztRQUN4Qiw2QkFBNkIsRUFBRTtZQUM3QixTQUFTLEVBQUUsS0FBSztTQUNqQjtLQUNGLENBQUMsQ0FBQztJQUVILE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBRWhFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDdkIsU0FBUyxFQUFFO1lBQ1QscUJBQXFCLEVBQUU7Z0JBQ3JCLFFBQVEsRUFBRTtvQkFDUixnQkFBZ0IsRUFBRSxLQUFLO29CQUN2QixPQUFPLEVBQUU7d0JBQ1AsTUFBTTtxQkFDUDtpQkFDRjtnQkFDRCxTQUFTLEVBQUU7b0JBQ1QsZ0JBQWdCLEVBQUUsS0FBSztvQkFDdkIsT0FBTyxFQUFFO3dCQUNQLE1BQU07cUJBQ1A7aUJBQ0Y7YUFDRjtTQUNGO1FBQ0QsTUFBTSxFQUFFO1lBQ04sS0FBSyxFQUFFO2dCQUNMLFFBQVEsRUFBRTtvQkFDUiwyQkFBMkI7aUJBQzVCO2FBQ0Y7U0FDRjtRQUNELE9BQU8sRUFBRSxLQUFLO0tBQ2YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBkZWxpdmxpYiBmcm9tICcuLi8uLi9saWInO1xuXG5cbnRlc3QoJ2J1aWxkc3BlYyBzaW5nbGUgYXJ0aWZhY3QgZ29lcyB0byBcImFydGlmYWN0c1wiJywgKCkgPT4ge1xuICBjb25zdCBicyA9IGRlbGl2bGliLkJ1aWxkU3BlYy5zaW1wbGUoe1xuICAgIGJ1aWxkOiBbJ2VjaG8gaGVsbG8gPiBmb28vZmlsZS50eHQnXSxcbiAgICBhcnRpZmFjdERpcmVjdG9yeTogJ2ZvbycsXG4gIH0pO1xuXG4gIGNvbnN0IHJlbmRlcmVkID0gYnMucmVuZGVyKCk7XG5cbiAgZXhwZWN0KHJlbmRlcmVkKS50b0VxdWFsKHtcbiAgICBhcnRpZmFjdHM6IHtcbiAgICAgICdiYXNlLWRpcmVjdG9yeSc6ICdmb28nLFxuICAgICAgJ2ZpbGVzJzogW1xuICAgICAgICAnKiovKicsXG4gICAgICBdLFxuICAgIH0sXG4gICAgcGhhc2VzOiB7XG4gICAgICBidWlsZDoge1xuICAgICAgICBjb21tYW5kczogW1xuICAgICAgICAgICdlY2hvIGhlbGxvID4gZm9vL2ZpbGUudHh0JyxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB2ZXJzaW9uOiAnMC4yJyxcbiAgfSk7XG59KTtcblxudGVzdCgnYnVpbGRzcGVjIG11bHRpcGxlIGFydGlmYWN0cyBhbGwgZ28gaW50byBcInNlY29uZGFyeS1hcnRpZmFjdHNcIicsICgpID0+IHtcbiAgY29uc3QgYnMgPSBkZWxpdmxpYi5CdWlsZFNwZWMuc2ltcGxlKHtcbiAgICBidWlsZDogWydlY2hvIGhlbGxvID4gZm9vL2ZpbGUudHh0J10sXG4gICAgYXJ0aWZhY3REaXJlY3Rvcnk6ICdmb28nLFxuICAgIGFkZGl0aW9uYWxBcnRpZmFjdERpcmVjdG9yaWVzOiB7XG4gICAgICBhcnRpZmFjdDI6ICdib28nLFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IHJlbmRlcmVkID0gYnMucmVuZGVyKHsgcHJpbWFyeUFydGlmYWN0TmFtZTogJ3ByaW1yb3NlJyB9KTtcblxuICBleHBlY3QocmVuZGVyZWQpLnRvRXF1YWwoe1xuICAgIGFydGlmYWN0czoge1xuICAgICAgJ3NlY29uZGFyeS1hcnRpZmFjdHMnOiB7XG4gICAgICAgIHByaW1yb3NlOiB7XG4gICAgICAgICAgJ2Jhc2UtZGlyZWN0b3J5JzogJ2ZvbycsXG4gICAgICAgICAgJ2ZpbGVzJzogW1xuICAgICAgICAgICAgJyoqLyonLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGFydGlmYWN0Mjoge1xuICAgICAgICAgICdiYXNlLWRpcmVjdG9yeSc6ICdib28nLFxuICAgICAgICAgICdmaWxlcyc6IFtcbiAgICAgICAgICAgICcqKi8qJyxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHBoYXNlczoge1xuICAgICAgYnVpbGQ6IHtcbiAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAnZWNobyBoZWxsbyA+IGZvby9maWxlLnR4dCcsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgdmVyc2lvbjogJzAuMicsXG4gIH0pO1xufSk7Il19
@@ -1 +0,0 @@
1
- import '@monocdk-experiment/assert/jest';
@@ -1,284 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
- Object.defineProperty(o, "default", { enumerable: true, value: v });
11
- }) : function(o, v) {
12
- o["default"] = v;
13
- });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
21
- Object.defineProperty(exports, "__esModule", { value: true });
22
- // tslint:disable: max-line-length
23
- const cdk = __importStar(require("monocdk"));
24
- const lib_1 = require("../../lib");
25
- require("@monocdk-experiment/assert/jest");
26
- const Stack = cdk.Stack;
27
- const MOCK_REPO = new lib_1.WritableGitHubRepo({
28
- sshKeySecret: { secretArn: 'ssh-key-secret-arn' },
29
- commitUsername: 'user',
30
- commitEmail: 'email@email',
31
- repository: 'owner/repo',
32
- tokenSecretArn: 'token-secret-arn',
33
- });
34
- test('autoBump', () => {
35
- // GIVEN
36
- const stack = new Stack(new cdk.App(), 'TestStack');
37
- // WHEN
38
- new lib_1.AutoBump(stack, 'MyAutoBump', {
39
- repo: MOCK_REPO,
40
- });
41
- // THEN
42
- // build project
43
- expect(stack).toHaveResource('AWS::CodeBuild::Project', {
44
- Triggers: {
45
- Webhook: false,
46
- },
47
- Source: {
48
- Type: 'GITHUB',
49
- GitCloneDepth: 0,
50
- Location: 'https://github.com/owner/repo.git',
51
- ReportBuildStatus: false,
52
- BuildSpec: JSON.stringify({
53
- version: '0.2',
54
- phases: {
55
- pre_build: {
56
- commands: [
57
- 'git config --global user.email "email@email"',
58
- 'git config --global user.name "user"',
59
- ],
60
- },
61
- build: {
62
- commands: [
63
- 'export SKIP=false',
64
- '$SKIP || { aws secretsmanager get-secret-value --secret-id "ssh-key-secret-arn" --output=text --query=SecretString > ~/.ssh/id_rsa ; }',
65
- '$SKIP || { mkdir -p ~/.ssh ; }',
66
- '$SKIP || { chmod 0600 ~/.ssh/id_rsa ~/.ssh/config ; }',
67
- '$SKIP || { ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts ; }',
68
- '$SKIP || { ls .git && { echo ".git directory exists"; } || { echo ".git directory doesnot exist - cloning..." && git init . && git remote add origin git@github.com:owner/repo.git && git fetch && git reset --hard origin/master && git branch -M master && git clean -fqdx; } ; }',
69
- "$SKIP || { git describe --exact-match master && { echo 'Skip condition is met, skipping...' && export SKIP=true; } || { echo 'Skip condition is not met, continuing...' && export SKIP=false; } ; }",
70
- '$SKIP || { export GITHUB_TOKEN=$(aws secretsmanager get-secret-value --secret-id "token-secret-arn" --output=text --query=SecretString) ; }',
71
- '$SKIP || { git rev-parse --verify origin/bump/$VERSION && { git checkout bump/$VERSION && git merge master && /bin/sh ./bump.sh && export VERSION=$(git describe) && echo Finished running user commands; } || { git checkout master && git checkout -b temp && /bin/sh ./bump.sh && export VERSION=$(git describe) && echo Finished running user commands && git branch -M bump/$VERSION; } ; }',
72
- '$SKIP || { git merge-base --is-ancestor bump/$VERSION origin/master && { echo "Skipping: bump/$VERSION is an ancestor of origin/master"; export SKIP=true; } || { echo "Pushing: bump/$VERSION is ahead of origin/master"; export SKIP=false; } ; }',
73
- '$SKIP || { git remote add origin_ssh git@github.com:owner/repo.git ; }',
74
- '$SKIP || { git push --atomic --follow-tags origin_ssh bump/$VERSION:bump/$VERSION ; }',
75
- "$SKIP || { curl --fail -X POST -o pr.json --header \"Authorization: token $GITHUB_TOKEN\" --header \"Content-Type: application/json\" -d \"{\\\"title\\\":\\\"chore(release): $VERSION\\\",\\\"base\\\":\\\"master\\\",\\\"head\\\":\\\"bump/$VERSION\\\"}\" https://api.github.com/repos/owner/repo/pulls && export PR_NUMBER=$(node -p 'require(\"./pr.json\").number') ; }",
76
- '$SKIP || { curl --fail -X PATCH --header "Authorization: token $GITHUB_TOKEN" --header "Content-Type: application/json" -d "{\\"body\\":\\"See [CHANGELOG](https://github.com/owner/repo/blob/bump/$VERSION/CHANGELOG.md)\\"}" https://api.github.com/repos/owner/repo/pulls/$PR_NUMBER ; }',
77
- ],
78
- },
79
- },
80
- }, undefined, 2),
81
- },
82
- });
83
- });
84
- test('autoBump with schedule', () => {
85
- const stack = new Stack(new cdk.App(), 'TestStack');
86
- // WHEN
87
- new lib_1.AutoBump(stack, 'MyAutoBump', {
88
- repo: MOCK_REPO,
89
- scheduleExpression: 'cron(0 12 * * ? *)',
90
- });
91
- // default schedule
92
- expect(stack).toHaveResource('AWS::Events::Rule', {
93
- ScheduleExpression: 'cron(0 12 * * ? *)',
94
- });
95
- });
96
- test('autoBump with custom cloneDepth', () => {
97
- // GIVEN
98
- const stack = new Stack(new cdk.App(), 'TestStack');
99
- // WHEN
100
- new lib_1.AutoBump(stack, 'MyAutoBump', {
101
- repo: MOCK_REPO,
102
- cloneDepth: 10,
103
- });
104
- // THEN
105
- // build project
106
- expect(stack).toHaveResource('AWS::CodeBuild::Project', {
107
- Triggers: {
108
- Webhook: false,
109
- },
110
- Source: {
111
- Type: 'GITHUB',
112
- GitCloneDepth: 10,
113
- Location: 'https://github.com/owner/repo.git',
114
- ReportBuildStatus: false,
115
- BuildSpec: JSON.stringify({
116
- version: '0.2',
117
- phases: {
118
- pre_build: {
119
- commands: [
120
- 'git config --global user.email "email@email"',
121
- 'git config --global user.name "user"',
122
- ],
123
- },
124
- build: {
125
- commands: [
126
- 'export SKIP=false',
127
- '$SKIP || { aws secretsmanager get-secret-value --secret-id "ssh-key-secret-arn" --output=text --query=SecretString > ~/.ssh/id_rsa ; }',
128
- '$SKIP || { mkdir -p ~/.ssh ; }',
129
- '$SKIP || { chmod 0600 ~/.ssh/id_rsa ~/.ssh/config ; }',
130
- '$SKIP || { ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts ; }',
131
- '$SKIP || { ls .git && { echo ".git directory exists"; } || { echo ".git directory doesnot exist - cloning..." && git init . && git remote add origin git@github.com:owner/repo.git && git fetch && git reset --hard origin/master && git branch -M master && git clean -fqdx; } ; }',
132
- "$SKIP || { git describe --exact-match master && { echo 'Skip condition is met, skipping...' && export SKIP=true; } || { echo 'Skip condition is not met, continuing...' && export SKIP=false; } ; }",
133
- '$SKIP || { export GITHUB_TOKEN=$(aws secretsmanager get-secret-value --secret-id "token-secret-arn" --output=text --query=SecretString) ; }',
134
- '$SKIP || { git rev-parse --verify origin/bump/$VERSION && { git checkout bump/$VERSION && git merge master && /bin/sh ./bump.sh && export VERSION=$(git describe) && echo Finished running user commands; } || { git checkout master && git checkout -b temp && /bin/sh ./bump.sh && export VERSION=$(git describe) && echo Finished running user commands && git branch -M bump/$VERSION; } ; }',
135
- '$SKIP || { git merge-base --is-ancestor bump/$VERSION origin/master && { echo "Skipping: bump/$VERSION is an ancestor of origin/master"; export SKIP=true; } || { echo "Pushing: bump/$VERSION is ahead of origin/master"; export SKIP=false; } ; }',
136
- '$SKIP || { git remote add origin_ssh git@github.com:owner/repo.git ; }',
137
- '$SKIP || { git push --atomic --follow-tags origin_ssh bump/$VERSION:bump/$VERSION ; }',
138
- "$SKIP || { curl --fail -X POST -o pr.json --header \"Authorization: token $GITHUB_TOKEN\" --header \"Content-Type: application/json\" -d \"{\\\"title\\\":\\\"chore(release): $VERSION\\\",\\\"base\\\":\\\"master\\\",\\\"head\\\":\\\"bump/$VERSION\\\"}\" https://api.github.com/repos/owner/repo/pulls && export PR_NUMBER=$(node -p 'require(\"./pr.json\").number') ; }",
139
- '$SKIP || { curl --fail -X PATCH --header "Authorization: token $GITHUB_TOKEN" --header "Content-Type: application/json" -d "{\\"body\\":\\"See [CHANGELOG](https://github.com/owner/repo/blob/bump/$VERSION/CHANGELOG.md)\\"}" https://api.github.com/repos/owner/repo/pulls/$PR_NUMBER ; }',
140
- ],
141
- },
142
- },
143
- }, undefined, 2),
144
- },
145
- });
146
- });
147
- test('autoBump with schedule disabled', () => {
148
- // GIVEN
149
- const stack = new Stack(new cdk.App(), 'TestStack');
150
- // WHEN
151
- new lib_1.AutoBump(stack, 'MyAutoBump', {
152
- repo: MOCK_REPO,
153
- scheduleExpression: 'disable',
154
- });
155
- // THEN
156
- expect(stack).not.toHaveResource('AWS::Events::Rule', {
157
- ScheduleExpression: 'cron(0 12 * * ? *)',
158
- });
159
- });
160
- test('autoBump with push only', () => {
161
- // GIVEN
162
- const stack = new Stack(new cdk.App(), 'TestStack');
163
- const repo = new lib_1.WritableGitHubRepo({
164
- sshKeySecret: { secretArn: 'ssh-key-secret-arn' },
165
- commitUsername: 'user',
166
- commitEmail: 'email@email',
167
- repository: 'owner/repo',
168
- tokenSecretArn: 'token-secret-arn',
169
- });
170
- // WHEN
171
- new lib_1.AutoBump(stack, 'MyAutoBump', {
172
- repo,
173
- pushOnly: true,
174
- });
175
- // THEN
176
- // build project
177
- expect(stack).toHaveResource('AWS::CodeBuild::Project', {
178
- Triggers: {
179
- Webhook: false,
180
- },
181
- Source: {
182
- Type: 'GITHUB',
183
- GitCloneDepth: 0,
184
- Location: 'https://github.com/owner/repo.git',
185
- ReportBuildStatus: false,
186
- BuildSpec: JSON.stringify({
187
- version: '0.2',
188
- phases: {
189
- pre_build: {
190
- commands: [
191
- 'git config --global user.email "email@email"',
192
- 'git config --global user.name "user"',
193
- ],
194
- },
195
- build: {
196
- commands: [
197
- 'export SKIP=false',
198
- '$SKIP || { aws secretsmanager get-secret-value --secret-id "ssh-key-secret-arn" --output=text --query=SecretString > ~/.ssh/id_rsa ; }',
199
- '$SKIP || { mkdir -p ~/.ssh ; }',
200
- '$SKIP || { chmod 0600 ~/.ssh/id_rsa ~/.ssh/config ; }',
201
- '$SKIP || { ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts ; }',
202
- '$SKIP || { ls .git && { echo ".git directory exists"; } || { echo ".git directory doesnot exist - cloning..." && git init . && git remote add origin git@github.com:owner/repo.git && git fetch && git reset --hard origin/master && git branch -M master && git clean -fqdx; } ; }',
203
- "$SKIP || { git describe --exact-match master && { echo 'Skip condition is met, skipping...' && export SKIP=true; } || { echo 'Skip condition is not met, continuing...' && export SKIP=false; } ; }",
204
- '$SKIP || { git rev-parse --verify origin/bump/$VERSION && { git checkout bump/$VERSION && git merge master && /bin/sh ./bump.sh && export VERSION=$(git describe) && echo Finished running user commands; } || { git checkout master && git checkout -b temp && /bin/sh ./bump.sh && export VERSION=$(git describe) && echo Finished running user commands && git branch -M bump/$VERSION; } ; }',
205
- '$SKIP || { git merge-base --is-ancestor bump/$VERSION origin/master && { echo "Skipping: bump/$VERSION is an ancestor of origin/master"; export SKIP=true; } || { echo "Pushing: bump/$VERSION is ahead of origin/master"; export SKIP=false; } ; }',
206
- '$SKIP || { git remote add origin_ssh git@github.com:owner/repo.git ; }',
207
- '$SKIP || { git push --atomic --follow-tags origin_ssh bump/$VERSION:bump/$VERSION ; }',
208
- ],
209
- },
210
- },
211
- }, undefined, 2),
212
- },
213
- });
214
- });
215
- test('autoBump with pull request with custom options', () => {
216
- // GIVEN
217
- const stack = new Stack(new cdk.App(), 'TestStack');
218
- // WHEN
219
- new lib_1.AutoBump(stack, 'MyAutoBump', {
220
- repo: MOCK_REPO,
221
- title: 'custom title',
222
- body: 'custom body',
223
- base: {
224
- name: 'release',
225
- },
226
- });
227
- // THEN
228
- // build project
229
- expect(stack).toHaveResource('AWS::CodeBuild::Project', {
230
- Triggers: {
231
- Webhook: false,
232
- },
233
- Source: {
234
- Type: 'GITHUB',
235
- GitCloneDepth: 0,
236
- Location: 'https://github.com/owner/repo.git',
237
- ReportBuildStatus: false,
238
- BuildSpec: JSON.stringify({
239
- version: '0.2',
240
- phases: {
241
- pre_build: {
242
- commands: [
243
- 'git config --global user.email "email@email"',
244
- 'git config --global user.name "user"',
245
- ],
246
- },
247
- build: {
248
- commands: [
249
- 'export SKIP=false',
250
- '$SKIP || { aws secretsmanager get-secret-value --secret-id "ssh-key-secret-arn" --output=text --query=SecretString > ~/.ssh/id_rsa ; }',
251
- '$SKIP || { mkdir -p ~/.ssh ; }',
252
- '$SKIP || { chmod 0600 ~/.ssh/id_rsa ~/.ssh/config ; }',
253
- '$SKIP || { ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts ; }',
254
- '$SKIP || { ls .git && { echo ".git directory exists"; } || { echo ".git directory doesnot exist - cloning..." && git init . && git remote add origin git@github.com:owner/repo.git && git fetch && git reset --hard origin/release && git branch -M release && git clean -fqdx; } ; }',
255
- "$SKIP || { git describe --exact-match release && { echo 'Skip condition is met, skipping...' && export SKIP=true; } || { echo 'Skip condition is not met, continuing...' && export SKIP=false; } ; }",
256
- '$SKIP || { export GITHUB_TOKEN=$(aws secretsmanager get-secret-value --secret-id "token-secret-arn" --output=text --query=SecretString) ; }',
257
- '$SKIP || { git rev-parse --verify origin/bump/$VERSION && { git checkout bump/$VERSION && git merge release && /bin/sh ./bump.sh && export VERSION=$(git describe) && echo Finished running user commands; } || { git checkout release && git checkout -b temp && /bin/sh ./bump.sh && export VERSION=$(git describe) && echo Finished running user commands && git branch -M bump/$VERSION; } ; }',
258
- '$SKIP || { git merge-base --is-ancestor bump/$VERSION origin/release && { echo "Skipping: bump/$VERSION is an ancestor of origin/release"; export SKIP=true; } || { echo "Pushing: bump/$VERSION is ahead of origin/release"; export SKIP=false; } ; }',
259
- '$SKIP || { git remote add origin_ssh git@github.com:owner/repo.git ; }',
260
- '$SKIP || { git push --atomic --follow-tags origin_ssh bump/$VERSION:bump/$VERSION ; }',
261
- "$SKIP || { curl --fail -X POST -o pr.json --header \"Authorization: token $GITHUB_TOKEN\" --header \"Content-Type: application/json\" -d \"{\\\"title\\\":\\\"custom title\\\",\\\"base\\\":\\\"release\\\",\\\"head\\\":\\\"bump/$VERSION\\\"}\" https://api.github.com/repos/owner/repo/pulls && export PR_NUMBER=$(node -p 'require(\"./pr.json\").number') ; }",
262
- '$SKIP || { curl --fail -X PATCH --header "Authorization: token $GITHUB_TOKEN" --header "Content-Type: application/json" -d "{\\"body\\":\\"custom body\\"}" https://api.github.com/repos/owner/repo/pulls/$PR_NUMBER ; }',
263
- ],
264
- },
265
- },
266
- }, undefined, 2),
267
- },
268
- });
269
- });
270
- test('autoBump with pull request fails when head=base', () => {
271
- // GIVEN
272
- const stack = new Stack(new cdk.App(), 'TestStack');
273
- // WHEN
274
- expect(() => new lib_1.AutoBump(stack, 'MyAutoBump', {
275
- repo: MOCK_REPO,
276
- base: {
277
- name: 'master',
278
- },
279
- head: {
280
- name: 'master',
281
- },
282
- })).toThrow();
283
- });
284
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVtcC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYnVtcC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtDQUFrQztBQUNsQyw2Q0FBK0I7QUFDL0IsbUNBQXlEO0FBQ3pELDJDQUF5QztBQUV6QyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO0FBRXhCLE1BQU0sU0FBUyxHQUFHLElBQUksd0JBQWtCLENBQUM7SUFDdkMsWUFBWSxFQUFFLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFO0lBQ2pELGNBQWMsRUFBRSxNQUFNO0lBQ3RCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLGNBQWMsRUFBRSxrQkFBa0I7Q0FDbkMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7SUFDcEIsUUFBUTtJQUNSLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRXBELE9BQU87SUFDUCxJQUFJLGNBQVEsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFO1FBQ2hDLElBQUksRUFBRSxTQUFTO0tBQ2hCLENBQUMsQ0FBQztJQUVILE9BQU87SUFFUCxnQkFBZ0I7SUFDaEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyx5QkFBeUIsRUFBRTtRQUN0RCxRQUFRLEVBQUU7WUFDUixPQUFPLEVBQUUsS0FBSztTQUNmO1FBQ0QsTUFBTSxFQUFFO1lBQ04sSUFBSSxFQUFFLFFBQVE7WUFDZCxhQUFhLEVBQUUsQ0FBQztZQUNoQixRQUFRLEVBQUUsbUNBQW1DO1lBQzdDLGlCQUFpQixFQUFFLEtBQUs7WUFDeEIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ3hCLE9BQU8sRUFBRSxLQUFLO2dCQUNkLE1BQU0sRUFB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QUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDeEIsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsTUFBTSxFQUFFO29CQUNOLFNBQVMsRUFBRTt3QkFDVCxRQUFRLEVBQUU7NEJBQ1IsOENBQThDOzRCQUM5QyxzQ0FBc0M7eUJBQ3ZDO3FCQUNGO29CQUNELEtBQUssRUFBRTt3QkFDTCxRQUFRLEVBQUU7NEJBQ1IsbUJBQW1COzRCQUNuQix3SUFBd0k7NEJBQ3hJLGdDQUFnQzs0QkFDaEMsdURBQXVEOzRCQUN2RCxvRUFBb0U7NEJBQ3BFLHdSQUF3Ujs0QkFDeFIsc01BQXNNOzRCQUN0TSw2SUFBNkk7NEJBQzdJLHFZQUFxWTs0QkFDclksd1BBQXdQOzRCQUN4UCx3RUFBd0U7NEJBQ3hFLHVGQUF1Rjs0QkFDdkYsb1dBQW9XOzRCQUNwVywwTkFBME47eUJBQzNOO3FCQUNGO2lCQUNGO2FBQ0YsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1NBQ2pCO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsaURBQWlELEVBQUUsR0FBRyxFQUFFO0lBQzNELFFBQVE7SUFDUixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUVwRCxPQUFPO0lBQ1AsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksY0FBUSxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUU7UUFDN0MsSUFBSSxFQUFFLFNBQVM7UUFDZixJQUFJLEVBQUU7WUFDSixJQUFJLEVBQUUsUUFBUTtTQUNmO1FBQ0QsSUFBSSxFQUFFO1lBQ0osSUFBSSxFQUFFLFFBQVE7U0FDZjtLQUNGLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ2hCLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHNsaW50OmRpc2FibGU6IG1heC1saW5lLWxlbmd0aFxuaW1wb3J0ICogYXMgY2RrIGZyb20gJ21vbm9jZGsnO1xuaW1wb3J0IHsgQXV0b0J1bXAsIFdyaXRhYmxlR2l0SHViUmVwbyB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgJ0Btb25vY2RrLWV4cGVyaW1lbnQvYXNzZXJ0L2plc3QnO1xuXG5jb25zdCBTdGFjayA9IGNkay5TdGFjaztcblxuY29uc3QgTU9DS19SRVBPID0gbmV3IFdyaXRhYmxlR2l0SHViUmVwbyh7XG4gIHNzaEtleVNlY3JldDogeyBzZWNyZXRBcm46ICdzc2gta2V5LXNlY3JldC1hcm4nIH0sXG4gIGNvbW1pdFVzZXJuYW1lOiAndXNlcicsXG4gIGNvbW1pdEVtYWlsOiAnZW1haWxAZW1haWwnLFxuICByZXBvc2l0b3J5OiAnb3duZXIvcmVwbycsXG4gIHRva2VuU2VjcmV0QXJuOiAndG9rZW4tc2VjcmV0LWFybicsXG59KTtcblxudGVzdCgnYXV0b0J1bXAnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBjZGsuQXBwKCksICdUZXN0U3RhY2snKTtcblxuICAvLyBXSEVOXG4gIG5ldyBBdXRvQnVtcChzdGFjaywgJ015QXV0b0J1bXAnLCB7XG4gICAgcmVwbzogTU9DS19SRVBPLFxuICB9KTtcblxuICAvLyBUSEVOXG5cbiAgLy8gYnVpbGQgcHJvamVjdFxuICBleHBlY3Qoc3RhY2spLnRvSGF2ZVJlc291cmNlKCdBV1M6OkNvZGVCdWlsZDo6UHJvamVjdCcsIHtcbiAgICBUcmlnZ2Vyczoge1xuICAgICAgV2ViaG9vazogZmFsc2UsXG4gICAgfSxcbiAgICBTb3VyY2U6IHtcbiAgICAgIFR5cGU6ICdHSVRIVUInLFxuICAgICAgR2l0Q2xvbmVEZXB0aDogMCxcbiAgICAgIExvY2F0aW9uOiAnaHR0cHM6Ly9naXRodWIuY29tL293bmVyL3JlcG8uZ2l0JyxcbiAgICAgIFJlcG9ydEJ1aWxkU3RhdHVzOiBmYWxzZSxcbiAgICAgIEJ1aWxkU3BlYzogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB2ZXJzaW9uOiAnMC4yJyxcbiAgICAgICAgcGhhc2VzOiB7XG4gICAgICAgICAgcHJlX2J1aWxkOiB7XG4gICAgICAgICAgICBjb21tYW5kczogW1xuICAgICAgICAgICAgICAnZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLmVtYWlsIFwiZW1haWxAZW1haWxcIicsXG4gICAgICAgICAgICAgICdnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIubmFtZSBcInVzZXJcIicsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYnVpbGQ6IHtcbiAgICAgICAgICAgIGNvbW1hbmRzOiBbXG4gICAgICAgICAgICAgICdleHBvcnQgU0tJUD1mYWxzZScsXG4gICAgICAgICAgICAgICckU0tJUCB8fCB7IGF3cyBzZWNyZXRzbWFuYWdlciBnZXQtc2VjcmV0LXZhbHVlIC0tc2VjcmV0LWlkIFwic3NoLWtleS1zZWNyZXQtYXJuXCIgLS1vdXRwdXQ9dGV4dCAtLXF1ZXJ5PVNlY3JldFN0cmluZyA+IH4vLnNzaC9pZF9yc2EgOyB9JyxcbiAgICAgICAgICAgICAgJyRTS0lQIHx8IHsgbWtkaXIgLXAgfi8uc3NoIDsgfScsXG4gICAgICAgICAgICAgICckU0tJUCB8fCB7IGNobW9kIDA2MDAgfi8uc3NoL2lkX3JzYSB+Ly5zc2gvY29uZmlnIDsgfScsXG4gICAgICAgICAgICAgICckU0tJUCB8fCB7IHNzaC1rZXlzY2FuIC10IHJzYSBnaXRodWIuY29tID4+IH4vLnNzaC9rbm93bl9ob3N0cyA7IH0nLFxuICAgICAgICAgICAgICAnJFNLSVAgfHwgeyBscyAuZ2l0ICYmIHsgZWNobyBcIi5naXQgZGlyZWN0b3J5IGV4aXN0c1wiOyAgfSB8fCB7IGVjaG8gXCIuZ2l0IGRpcmVjdG9yeSBkb2Vzbm90IGV4aXN0IC0gY2xvbmluZy4uLlwiICYmIGdpdCBpbml0IC4gJiYgZ2l0IHJlbW90ZSBhZGQgb3JpZ2luIGdpdEBnaXRodWIuY29tOm93bmVyL3JlcG8uZ2l0ICYmIGdpdCBmZXRjaCAmJiBnaXQgcmVzZXQgLS1oYXJkIG9yaWdpbi9tYXN0ZXIgJiYgZ2l0IGJyYW5jaCAtTSBtYXN0ZXIgJiYgZ2l0IGNsZWFuIC1mcWR4OyB9IDsgfScsXG4gICAgICAgICAgICAgIFwiJFNLSVAgfHwgeyBnaXQgZGVzY3JpYmUgLS1leGFjdC1tYXRjaCBtYXN0ZXIgJiYgeyBlY2hvICdTa2lwIGNvbmRpdGlvbiBpcyBtZXQsIHNraXBwaW5nLi4uJyAmJiBleHBvcnQgU0tJUD10cnVlOyB9IHx8IHsgZWNobyAnU2tpcCBjb25kaXRpb24gaXMgbm90IG1ldCwgY29udGludWluZy4uLicgJiYgZXhwb3J0IFNLSVA9ZmFsc2U7IH0gOyB9XCIsXG4gICAgICAgICAgICAgICckU0tJUCB8fCB7IGV4cG9ydCBHSVRIVUJfVE9LRU49JChhd3Mgc2VjcmV0c21hbmFnZXIgZ2V0LXNlY3JldC12YWx1ZSAtLXNlY3JldC1pZCBcInRva2VuLXNlY3JldC1hcm5cIiAtLW91dHB1dD10ZXh0IC0tcXVlcnk9U2VjcmV0U3RyaW5nKSA7IH0nLFxuICAgICAgICAgICAgICAnJFNLSVAgfHwgeyBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IG9yaWdpbi9idW1wLyRWRVJTSU9OICYmIHsgZ2l0IGNoZWNrb3V0IGJ1bXAvJFZFUlNJT04gJiYgZ2l0IG1lcmdlIG1hc3RlciAmJiAvYmluL3NoIC4vYnVtcC5zaCAmJiBleHBvcnQgVkVSU0lPTj0kKGdpdCBkZXNjcmliZSkgJiYgZWNobyBGaW5pc2hlZCBydW5uaW5nIHVzZXIgY29tbWFuZHM7ICB9IHx8IHsgZ2l0IGNoZWNrb3V0IG1hc3RlciAmJiBnaXQgY2hlY2tvdXQgLWIgdGVtcCAmJiAvYmluL3NoIC4vYnVtcC5zaCAmJiBleHBvcnQgVkVSU0lPTj0kKGdpdCBkZXNjcmliZSkgJiYgZWNobyBGaW5pc2hlZCBydW5uaW5nIHVzZXIgY29tbWFuZHMgJiYgZ2l0IGJyYW5jaCAtTSBidW1wLyRWRVJTSU9OOyB9IDsgfScsXG4gICAgICAgICAgICAgICckU0tJUCB8fCB7IGdpdCBtZXJnZS1iYXNlIC0taXMtYW5jZXN0b3IgYnVtcC8kVkVSU0lPTiBvcmlnaW4vbWFzdGVyICYmIHsgZWNobyBcIlNraXBwaW5nOiBidW1wLyRWRVJTSU9OIGlzIGFuIGFuY2VzdG9yIG9mIG9yaWdpbi9tYXN0ZXJcIjsgZXhwb3J0IFNLSVA9dHJ1ZTsgfSB8fCB7IGVjaG8gXCJQdXNoaW5nOiBidW1wLyRWRVJTSU9OIGlzIGFoZWFkIG9mIG9yaWdpbi9tYXN0ZXJcIjsgZXhwb3J0IFNLSVA9ZmFsc2U7IH0gOyB9JyxcbiAgICAgICAgICAgICAgJyRTS0lQIHx8IHsgZ2l0IHJlbW90ZSBhZGQgb3JpZ2luX3NzaCBnaXRAZ2l0aHViLmNvbTpvd25lci9yZXBvLmdpdCA7IH0nLFxuICAgICAgICAgICAgICAnJFNLSVAgfHwgeyBnaXQgcHVzaCAtLWF0b21pYyAtLWZvbGxvdy10YWdzIG9yaWdpbl9zc2ggYnVtcC8kVkVSU0lPTjpidW1wLyRWRVJTSU9OIDsgfScsXG4gICAgICAgICAgICAgIFwiJFNLSVAgfHwgeyBjdXJsIC0tZmFpbCAtWCBQT1NUIC1vIHByLmpzb24gLS1oZWFkZXIgXFxcIkF1dGhvcml6YXRpb246IHRva2VuICRHSVRIVUJfVE9LRU5cXFwiIC0taGVhZGVyIFxcXCJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cXFwiIC1kIFxcXCJ7XFxcXFxcXCJ0aXRsZVxcXFxcXFwiOlxcXFxcXFwiY2hvcmUocmVsZWFzZSk6ICRWRVJTSU9OXFxcXFxcXCIsXFxcXFxcXCJiYXNlXFxcXFxcXCI6XFxcXFxcXCJtYXN0ZXJcXFxcXFxcIixcXFxcXFxcImhlYWRcXFxcXFxcIjpcXFxcXFxcImJ1bXAvJFZFUlNJT05cXFxcXFxcIn1cXFwiIGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvb3duZXIvcmVwby9wdWxscyAmJiBleHBvcnQgUFJfTlVNQkVSPSQobm9kZSAtcCAncmVxdWlyZShcXFwiLi9wci5qc29uXFxcIikubnVtYmVyJykgOyB9XCIsXG4gICAgICAgICAgICAgICckU0tJUCB8fCB7IGN1cmwgLS1mYWlsIC1YIFBBVENIIC0taGVhZGVyIFwiQXV0aG9yaXphdGlvbjogdG9rZW4gJEdJVEhVQl9UT0tFTlwiIC0taGVhZGVyIFwiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXCIgLWQgXCJ7XFxcXFwiYm9keVxcXFxcIjpcXFxcXCJTZWUgW0NIQU5HRUxPR10oaHR0cHM6Ly9naXRodWIuY29tL293bmVyL3JlcG8vYmxvYi9idW1wLyRWRVJTSU9OL0NIQU5HRUxPRy5tZClcXFxcXCJ9XCIgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9vd25lci9yZXBvL3B1bGxzLyRQUl9OVU1CRVIgOyB9JyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sIHVuZGVmaW5lZCwgMiksXG4gICAgfSxcbiAgfSk7XG5cbn0pO1xuXG50ZXN0KCdhdXRvQnVtcCB3aXRoIHNjaGVkdWxlJywgKCkgPT4ge1xuXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBjZGsuQXBwKCksICdUZXN0U3RhY2snKTtcblxuICAvLyBXSEVOXG4gIG5ldyBBdXRvQnVtcChzdGFjaywgJ015QXV0b0J1bXAnLCB7XG4gICAgcmVwbzogTU9DS19SRVBPLFxuICAgIHNjaGVkdWxlRXhwcmVzc2lvbjogJ2Nyb24oMCAxMiAqICogPyAqKScsXG4gIH0pO1xuXG4gIC8vIGRlZmF1bHQgc2NoZWR1bGVcbiAgZXhwZWN0KHN0YWNrKS50b0hhdmVSZXNvdXJjZSgnQVdTOjpFdmVudHM6OlJ1bGUnLCB7XG4gICAgU2NoZWR1bGVFeHByZXNzaW9uOiAnY3JvbigwIDEyICogKiA/ICopJyxcbiAgfSk7XG5cbn0pO1xuXG50ZXN0KCdhdXRvQnVtcCB3aXRoIGN1c3RvbSBjbG9uZURlcHRoJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhuZXcgY2RrLkFwcCgpLCAnVGVzdFN0YWNrJyk7XG5cbiAgLy8gV0hFTlxuICBuZXcgQXV0b0J1bXAoc3RhY2ssICdNeUF1dG9CdW1wJywge1xuICAgIHJlcG86IE1PQ0tfUkVQTyxcbiAgICBjbG9uZURlcHRoOiAxMCxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuXG4gIC8vIGJ1aWxkIHByb2plY3RcbiAgZXhwZWN0KHN0YWNrKS50b0hhdmVSZXNvdXJjZSgnQVdTOjpDb2RlQnVpbGQ6OlByb2plY3QnLCB7XG4gICAgVHJpZ2dlcnM6IHtcbiAgICAgIFdlYmhvb2s6IGZhbHNlLFxuICAgIH0sXG4gICAgU291cmNlOiB7XG4gICAgICBUeXBlOiAnR0lUSFVCJyxcbiAgICAgIEdpdENsb25lRGVwdGg6IDEwLFxuICAgICAgTG9jYXRpb246ICdodHRwczovL2dpdGh1Yi5jb20vb3duZXIvcmVwby5naXQnLFxuICAgICAgUmVwb3J0QnVpbGRTdGF0dXM6IGZhbHNlLFxuICAgICAgQnVpbGRTcGVjOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHZlcnNpb246ICcwLjInLFxuICAgICAgICBwaGFzZXM6IHtcbiAgICAgICAgICBwcmVfYnVpbGQ6IHtcbiAgICAgICAgICAgIGNvbW1hbmRzOiBbXG4gICAgICAgICAgICAgICdnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgXCJlbWFpbEBlbWFpbFwiJyxcbiAgICAgICAgICAgICAgJ2dpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lIFwidXNlclwiJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBidWlsZDoge1xuICAgICAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAgICAgJ2V4cG9ydCBTS0lQPWZhbHNlJyxcbiAgICAgICAgICAgICAgJyRTS0lQIHx8IHsgYXdzIHNlY3JldHNtYW5hZ2VyIGdldC1zZWNyZXQtdmFsdWUgLS1zZWNyZXQtaWQgXCJzc2gta2V5LXNlY3JldC1hcm5cIiAtLW91dHB1dD10ZXh0IC0tcXVlcnk9U2VjcmV0U3RyaW5nID4gfi8uc3NoL2lkX3JzYSA7IH0nLFxuICAgICAgICAgICAgICAnJFNLSVAgfHwgeyBta2RpciAtcCB+Ly5zc2ggOyB9JyxcbiAgICAgICAgICAgICAgJyRTS0lQIHx8IHsgY2htb2QgMDYwMCB+Ly5zc2gvaWRfcnNhIH4vLnNzaC9jb25maWcgOyB9JyxcbiAgICAgICAgICAgICAgJyRTS0lQIHx8IHsgc3NoLWtleXNjYW4gLXQgcnNhIGdpdGh1Yi5jb20gPj4gfi8uc3NoL2tub3duX2hvc3RzIDsgfScsXG4gICAgICAgICAgICAgICckU0tJUCB8fCB7IGxzIC5naXQgJiYgeyBlY2hvIFwiLmdpdCBkaXJlY3RvcnkgZXhpc3RzXCI7ICB9IHx8IHsgZWNobyBcIi5naXQgZGlyZWN0b3J5IGRvZXNub3QgZXhpc3QgLSBjbG9uaW5nLi4uXCIgJiYgZ2l0IGluaXQgLiAmJiBnaXQgcmVtb3RlIGFkZCBvcmlnaW4gZ2l0QGdpdGh1Yi5jb206b3duZXIvcmVwby5naXQgJiYgZ2l0IGZldGNoICYmIGdpdCByZXNldCAtLWhhcmQgb3JpZ2luL21hc3RlciAmJiBnaXQgYnJhbmNoIC1NIG1hc3RlciAmJiBnaXQgY2xlYW4gLWZxZHg7IH0gOyB9JyxcbiAgICAgICAgICAgICAgXCIkU0tJUCB8fCB7IGdpdCBkZXNjcmliZSAtLWV4YWN0LW1hdGNoIG1hc3RlciAmJiB7IGVjaG8gJ1NraXAgY29uZGl0aW9uIGlzIG1ldCwgc2tpcHBpbmcuLi4nICYmIGV4cG9ydCBTS0lQPXRydWU7IH0gfHwgeyBlY2hvICdTa2lwIGNvbmRpdGlvbiBpcyBub3QgbWV0LCBjb250aW51aW5nLi4uJyAmJiBleHBvcnQgU0tJUD1mYWxzZTsgfSA7IH1cIixcbiAgICAgICAgICAgICAgJyRTS0lQIHx8IHsgZXhwb3J0IEdJVEhVQl9UT0tFTj0kKGF3cyBzZWNyZXRzbWFuYWdlciBnZXQtc2VjcmV0LXZhbHVlIC0tc2VjcmV0LWlkIFwidG9rZW4tc2VjcmV0LWFyblwiIC0tb3V0cHV0PXRleHQgLS1xdWVyeT1TZWNyZXRTdHJpbmcpIDsgfScsXG4gICAgICAgICAgICAgICckU0tJUCB8fCB7IGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgb3JpZ2luL2J1bXAvJFZFUlNJT04gJiYgeyBnaXQgY2hlY2tvdXQgYnVtcC8kVkVSU0lPTiAmJiBnaXQgbWVyZ2UgbWFzdGVyICYmIC9iaW4vc2ggLi9idW1wLnNoICYmIGV4cG9ydCBWRVJTSU9OPSQoZ2l0IGRlc2NyaWJlKSAmJiBlY2hvIEZpbmlzaGVkIHJ1bm5pbmcgdXNlciBjb21tYW5kczsgIH0gfHwgeyBnaXQgY2hlY2tvdXQgbWFzdGVyICYmIGdpdCBjaGVja291dCAtYiB0ZW1wICYmIC9iaW4vc2ggLi9idW1wLnNoICYmIGV4cG9ydCBWRVJTSU9OPSQoZ2l0IGRlc2NyaWJlKSAmJiBlY2hvIEZpbmlzaGVkIHJ1bm5pbmcgdXNlciBjb21tYW5kcyAmJiBnaXQgYnJhbmNoIC1NIGJ1bXAvJFZFUlNJT047IH0gOyB9JyxcbiAgICAgICAgICAgICAgJyRTS0lQIHx8IHsgZ2l0IG1lcmdlLWJhc2UgLS1pcy1hbmNlc3RvciBidW1wLyRWRVJTSU9OIG9yaWdpbi9tYXN0ZXIgJiYgeyBlY2hvIFwiU2tpcHBpbmc6IGJ1bXAvJFZFUlNJT04gaXMgYW4gYW5jZXN0b3Igb2Ygb3JpZ2luL21hc3RlclwiOyBleHBvcnQgU0tJUD10cnVlOyB9IHx8IHsgZWNobyBcIlB1c2hpbmc6IGJ1bXAvJFZFUlNJT04gaXMgYWhlYWQgb2Ygb3JpZ2luL21hc3RlclwiOyBleHBvcnQgU0tJUD1mYWxzZTsgfSA7IH0nLFxuICAgICAgICAgICAgICAnJFNLSVAgfHwgeyBnaXQgcmVtb3RlIGFkZCBvcmlnaW5fc3NoIGdpdEBnaXRodWIuY29tOm93bmVyL3JlcG8uZ2l0IDsgfScsXG4gICAgICAgICAgICAgICckU0tJUCB8fCB7IGdpdCBwdXNoIC0tYXRvbWljIC0tZm9sbG93LXRhZ3Mgb3JpZ2luX3NzaCBidW1wLyRWRVJTSU9OOmJ1bXAvJFZFUlNJT04gOyB9JyxcbiAgICAgICAgICAgICAgXCIkU0tJUCB8fCB7IGN1cmwgLS1mYWlsIC1YIFBPU1QgLW8gcHIuanNvbiAtLWhlYWRlciBcXFwiQXV0aG9yaXphdGlvbjogdG9rZW4gJEdJVEhVQl9UT0tFTlxcXCIgLS1oZWFkZXIgXFxcIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxcXCIgLWQgXFxcIntcXFxcXFxcInRpdGxlXFxcXFxcXCI6XFxcXFxcXCJjaG9yZShyZWxlYXNlKTogJFZFUlNJT05cXFxcXFxcIixcXFxcXFxcImJhc2VcXFxcXFxcIjpcXFxcXFxcIm1hc3RlclxcXFxcXFwiLFxcXFxcXFwiaGVhZFxcXFxcXFwiOlxcXFxcXFwiYnVtcC8kVkVSU0lPTlxcXFxcXFwifVxcXCIgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9vd25lci9yZXBvL3B1bGxzICYmIGV4cG9ydCBQUl9OVU1CRVI9JChub2RlIC1wICdyZXF1aXJlKFxcXCIuL3ByLmpzb25cXFwiKS5udW1iZXInKSA7IH1cIixcbiAgICAgICAgICAgICAgJyRTS0lQIHx8IHsgY3VybCAtLWZhaWwgLVggUEFUQ0ggLS1oZWFkZXIgXCJBdXRob3JpemF0aW9uOiB0b2tlbiAkR0lUSFVCX1RPS0VOXCIgLS1oZWFkZXIgXCJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cIiAtZCBcIntcXFxcXCJib2R5XFxcXFwiOlxcXFxcIlNlZSBbQ0hBTkdFTE9HXShodHRwczovL2dpdGh1Yi5jb20vb3duZXIvcmVwby9ibG9iL2J1bXAvJFZFUlNJT04vQ0hBTkdFTE9HLm1kKVxcXFxcIn1cIiBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL293bmVyL3JlcG8vcHVsbHMvJFBSX05VTUJFUiA7IH0nLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSwgdW5kZWZpbmVkLCAyKSxcbiAgICB9LFxuICB9KTtcbn0pO1xuXG50ZXN0KCdhdXRvQnVtcCB3aXRoIHNjaGVkdWxlIGRpc2FibGVkJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhuZXcgY2RrLkFwcCgpLCAnVGVzdFN0YWNrJyk7XG5cbiAgLy8gV0hFTlxuICBuZXcgQXV0b0J1bXAoc3RhY2ssICdNeUF1dG9CdW1wJywge1xuICAgIHJlcG86IE1PQ0tfUkVQTyxcbiAgICBzY2hlZHVsZUV4cHJlc3Npb246ICdkaXNhYmxlJyxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBleHBlY3Qoc3RhY2spLm5vdC50b0hhdmVSZXNvdXJjZSgnQVdTOjpFdmVudHM6OlJ1bGUnLCB7XG4gICAgU2NoZWR1bGVFeHByZXNzaW9uOiAnY3JvbigwIDEyICogKiA/ICopJyxcbiAgfSk7XG59KTtcblxudGVzdCgnYXV0b0J1bXAgd2l0aCBwdXNoIG9ubHknLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBjZGsuQXBwKCksICdUZXN0U3RhY2snKTtcbiAgY29uc3QgcmVwbyA9IG5ldyBXcml0YWJsZUdpdEh1YlJlcG8oe1xuICAgIHNzaEtleVNlY3JldDogeyBzZWNyZXRBcm46ICdzc2gta2V5LXNlY3JldC1hcm4nIH0sXG4gICAgY29tbWl0VXNlcm5hbWU6ICd1c2VyJyxcbiAgICBjb21taXRFbWFpbDogJ2VtYWlsQGVtYWlsJyxcbiAgICByZXBvc2l0b3J5OiAnb3duZXIvcmVwbycsXG4gICAgdG9rZW5TZWNyZXRBcm46ICd0b2tlbi1zZWNyZXQtYXJuJyxcbiAgfSk7XG5cbiAgLy8gV0hFTlxuICBuZXcgQXV0b0J1bXAoc3RhY2ssICdNeUF1dG9CdW1wJywge1xuICAgIHJlcG8sXG4gICAgcHVzaE9ubHk6IHRydWUsXG4gIH0pO1xuXG4gIC8vIFRIRU5cblxuICAvLyBidWlsZCBwcm9qZWN0XG4gIGV4cGVjdChzdGFjaykudG9IYXZlUmVzb3VyY2UoJ0FXUzo6Q29kZUJ1aWxkOjpQcm9qZWN0Jywge1xuICAgIFRyaWdnZXJzOiB7XG4gICAgICBXZWJob29rOiBmYWxzZSxcbiAgICB9LFxuICAgIFNvdXJjZToge1xuICAgICAgVHlwZTogJ0dJVEhVQicsXG4gICAgICBHaXRDbG9uZURlcHRoOiAwLFxuICAgICAgTG9jYXRpb246ICdodHRwczovL2dpdGh1Yi5jb20vb3duZXIvcmVwby5naXQnLFxuICAgICAgUmVwb3J0QnVpbGRTdGF0dXM6IGZhbHNlLFxuICAgICAgQnVpbGRTcGVjOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHZlcnNpb246ICcwLjInLFxuICAgICAgICBwaGFzZXM6IHtcbiAgICAgICAgICBwcmVfYnVpbGQ6IHtcbiAgICAgICAgICAgIGNvbW1hbmRzOiBbXG4gICAgICAgICAgICAgICdnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgXCJlbWFpbEBlbWFpbFwiJyxcbiAgICAgICAgICAgICAgJ2dpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lIFwidXNlclwiJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBidWlsZDoge1xuICAgICAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAgICAgJ2V4cG9ydCBTS0lQPWZhbHNlJyxcbiAgICAgICAgICAgICAgJyRTS0lQIHx8IHsgYXdzIHNlY3JldHNtYW5hZ2VyIGdldC1zZWNyZXQtdmFsdWUgLS1zZWNyZXQtaWQgXCJzc2gta2V5LXNlY3JldC1hcm5cIiAtLW91dHB1dD10ZXh0IC0tcXVlcnk9U2VjcmV0U3RyaW5nID4gfi8uc3NoL2lkX3JzYSA7IH0nLFxuICAgICAgICAgICAgICAnJFNLSVAgfHwgeyBta2RpciAtcCB+Ly5zc2ggOyB9JyxcbiAgICAgICAgICAgICAgJyRTS0lQIHx8IHsgY2htb2QgMDYwMCB+Ly5zc2gvaWRfcnNhIH4vLnNzaC9jb25maWcgOyB9JyxcbiAgICAgICAgICAgICAgJyRTS0lQIHx8IHsgc3NoLWtleXNjYW4gLXQgcnNhIGdpdGh1Yi5jb20gPj4gfi8uc3NoL2tub3duX2hvc3RzIDsgfScsXG4gICAgICAgICAgICAgICckU0tJUCB8fCB7IGxzIC5naXQgJiYgeyBlY2hvIFwiLmdpdCBkaXJlY3RvcnkgZXhpc3RzXCI7ICB9IHx8IHsgZWNobyBcIi5naXQgZGlyZWN0b3J5IGRvZXNub3QgZXhpc3QgLSBjbG9uaW5nLi4uXCIgJiYgZ2l0IGluaXQgLiAmJiBnaXQgcmVtb3RlIGFkZCBvcmlnaW4gZ2l0QGdpdGh1Yi5jb206b3duZXIvcmVwby5naXQgJiYgZ2l0IGZldGNoICYmIGdpdCByZXNldCAtLWhhcmQgb3JpZ2luL21hc3RlciAmJiBnaXQgYnJhbmNoIC1NIG1hc3RlciAmJiBnaXQgY2xlYW4gLWZxZHg7IH0gOyB9JyxcbiAgICAgICAgICAgICAgXCIkU0tJUCB8fCB7IGdpdCBkZXNjcmliZSAtLWV4YWN0LW1hdGNoIG1hc3RlciAmJiB7IGVjaG8gJ1NraXAgY29uZGl0aW9uIGlzIG1ldCwgc2tpcHBpbmcuLi4nICYmIGV4cG9ydCBTS0lQPXRydWU7IH0gfHwgeyBlY2hvICdTa2lwIGNvbmRpdGlvbiBpcyBub3QgbWV0LCBjb250aW51aW5nLi4uJyAmJiBleHBvcnQgU0tJUD1mYWxzZTsgfSA7IH1cIixcbiAgICAgICAgICAgICAgJyRTS0lQIHx8IHsgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBvcmlnaW4vYnVtcC8kVkVSU0lPTiAmJiB7IGdpdCBjaGVja291dCBidW1wLyRWRVJTSU9OICYmIGdpdCBtZXJnZSBtYXN0ZXIgJiYgL2Jpbi9zaCAuL2J1bXAuc2ggJiYgZXhwb3J0IFZFUlNJT049JChnaXQgZGVzY3JpYmUpICYmIGVjaG8gRmluaXNoZWQgcnVubmluZyB1c2VyIGNvbW1hbmRzOyAgfSB8fCB7IGdpdCBjaGVja291dCBtYXN0ZXIgJiYgZ2l0IGNoZWNrb3V0IC1iIHRlbXAgJiYgL2Jpbi9zaCAuL2J1bXAuc2ggJiYgZXhwb3J0IFZFUlNJT049JChnaXQgZGVzY3JpYmUpICYmIGVjaG8gRmluaXNoZWQgcnVubmluZyB1c2VyIGNvbW1hbmRzICYmIGdpdCBicmFuY2ggLU0gYnVtcC8kVkVSU0lPTjsgfSA7IH0nLFxuICAgICAgICAgICAgICAnJFNLSVAgfHwgeyBnaXQgbWVyZ2UtYmFzZSAtLWlzLWFuY2VzdG9yIGJ1bXAvJFZFUlNJT04gb3JpZ2luL21hc3RlciAmJiB7IGVjaG8gXCJTa2lwcGluZzogYnVtcC8kVkVSU0lPTiBpcyBhbiBhbmNlc3RvciBvZiBvcmlnaW4vbWFzdGVyXCI7IGV4cG9ydCBTS0lQPXRydWU7IH0gfHwgeyBlY2hvIFwiUHVzaGluZzogYnVtcC8kVkVSU0lPTiBpcyBhaGVhZCBvZiBvcmlnaW4vbWFzdGVyXCI7IGV4cG9ydCBTS0lQPWZhbHNlOyB9IDsgfScsXG4gICAgICAgICAgICAgICckU0tJUCB8fCB7IGdpdCByZW1vdGUgYWRkIG9yaWdpbl9zc2ggZ2l0QGdpdGh1Yi5jb206b3duZXIvcmVwby5naXQgOyB9JyxcbiAgICAgICAgICAgICAgJyRTS0lQIHx8IHsgZ2l0IHB1c2ggLS1hdG9taWMgLS1mb2xsb3ctdGFncyBvcmlnaW5fc3NoIGJ1bXAvJFZFUlNJT046YnVtcC8kVkVSU0lPTiA7IH0nLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSwgdW5kZWZpbmVkLCAyKSxcbiAgICB9LFxuICB9KTtcbn0pO1xuXG50ZXN0KCdhdXRvQnVtcCB3aXRoIHB1bGwgcmVxdWVzdCB3aXRoIGN1c3RvbSBvcHRpb25zJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhuZXcgY2RrLkFwcCgpLCAnVGVzdFN0YWNrJyk7XG5cbiAgLy8gV0hFTlxuICBuZXcgQXV0b0J1bXAoc3RhY2ssICdNeUF1dG9CdW1wJywge1xuICAgIHJlcG86IE1PQ0tfUkVQTyxcblxuICAgIHRpdGxlOiAnY3VzdG9tIHRpdGxlJyxcbiAgICBib2R5OiAnY3VzdG9tIGJvZHknLFxuICAgIGJhc2U6IHtcbiAgICAgIG5hbWU6ICdyZWxlYXNlJyxcbiAgICB9LFxuXG4gIH0pO1xuXG4gIC8vIFRIRU5cblxuICAvLyBidWlsZCBwcm9qZWN0XG4gIGV4cGVjdChzdGFjaykudG9IYXZlUmVzb3VyY2UoJ0FXUzo6Q29kZUJ1aWxkOjpQcm9qZWN0Jywge1xuICAgIFRyaWdnZXJzOiB7XG4gICAgICBXZWJob29rOiBmYWxzZSxcbiAgICB9LFxuICAgIFNvdXJjZToge1xuICAgICAgVHlwZTogJ0dJVEhVQicsXG4gICAgICBHaXRDbG9uZURlcHRoOiAwLFxuICAgICAgTG9jYXRpb246ICdodHRwczovL2dpdGh1Yi5jb20vb3duZXIvcmVwby5naXQnLFxuICAgICAgUmVwb3J0QnVpbGRTdGF0dXM6IGZhbHNlLFxuICAgICAgQnVpbGRTcGVjOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHZlcnNpb246ICcwLjInLFxuICAgICAgICBwaGFzZXM6IHtcbiAgICAgICAgICBwcmVfYnVpbGQ6IHtcbiAgICAgICAgICAgIGNvbW1hbmRzOiBbXG4gICAgICAgICAgICAgICdnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgXCJlbWFpbEBlbWFpbFwiJyxcbiAgICAgICAgICAgICAgJ2dpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lIFwidXNlclwiJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBidWlsZDoge1xuICAgICAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAgICAgJ2V4cG9ydCBTS0lQPWZhbHNlJyxcbiAgICAgICAgICAgICAgJyRTS0lQIHx8IHsgYXdzIHNlY3JldHNtYW5hZ2VyIGdldC1zZWNyZXQtdmFsdWUgLS1zZWNyZXQtaWQgXCJzc2gta2V5LXNlY3JldC1hcm5cIiAtLW91dHB1dD10ZXh0IC0tcXVlcnk9U2VjcmV0U3RyaW5nID4gfi8uc3NoL2lkX3JzYSA7IH0nLFxuICAgICAgICAgICAgICAnJFNLSVAgfHwgeyBta2RpciAtcCB+Ly5zc2ggOyB9JyxcbiAgICAgICAgICAgICAgJyRTS0lQIHx8IHsgY2htb2QgMDYwMCB+Ly5zc2gvaWRfcnNhIH4vLnNzaC9jb25maWcgOyB9JyxcbiAgICAgICAgICAgICAgJyRTS0lQIHx8IHsgc3NoLWtleXNjYW4gLXQgcnNhIGdpdGh1Yi5jb20gPj4gfi8uc3NoL2tub3duX2hvc3RzIDsgfScsXG4gICAgICAgICAgICAgICckU0tJUCB8fCB7IGxzIC5naXQgJiYgeyBlY2hvIFwiLmdpdCBkaXJlY3RvcnkgZXhpc3RzXCI7ICB9IHx8IHsgZWNobyBcIi5naXQgZGlyZWN0b3J5IGRvZXNub3QgZXhpc3QgLSBjbG9uaW5nLi4uXCIgJiYgZ2l0IGluaXQgLiAmJiBnaXQgcmVtb3RlIGFkZCBvcmlnaW4gZ2l0QGdpdGh1Yi5jb206b3duZXIvcmVwby5naXQgJiYgZ2l0IGZldGNoICYmIGdpdCByZXNldCAtLWhhcmQgb3JpZ2luL3JlbGVhc2UgJiYgZ2l0IGJyYW5jaCAtTSByZWxlYXNlICYmIGdpdCBjbGVhbiAtZnFkeDsgfSA7IH0nLFxuICAgICAgICAgICAgICBcIiRTS0lQIHx8IHsgZ2l0IGRlc2NyaWJlIC0tZXhhY3QtbWF0Y2ggcmVsZWFzZSAmJiB7IGVjaG8gJ1NraXAgY29uZGl0aW9uIGlzIG1ldCwgc2tpcHBpbmcuLi4nICYmIGV4cG9ydCBTS0lQPXRydWU7IH0gfHwgeyBlY2hvICdTa2lwIGNvbmRpdGlvbiBpcyBub3QgbWV0LCBjb250aW51aW5nLi4uJyAmJiBleHBvcnQgU0tJUD1mYWxzZTsgfSA7IH1cIixcbiAgICAgICAgICAgICAgJyRTS0lQIHx8IHsgZXhwb3J0IEdJVEhVQl9UT0tFTj0kKGF3cyBzZWNyZXRzbWFuYWdlciBnZXQtc2VjcmV0LXZhbHVlIC0tc2VjcmV0LWlkIFwidG9rZW4tc2VjcmV0LWFyblwiIC0tb3V0cHV0PXRleHQgLS1xdWVyeT1TZWNyZXRTdHJpbmcpIDsgfScsXG4gICAgICAgICAgICAgICckU0tJUCB8fCB7IGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgb3JpZ2luL2J1bXAvJFZFUlNJT04gJiYgeyBnaXQgY2hlY2tvdXQgYnVtcC8kVkVSU0lPTiAmJiBnaXQgbWVyZ2UgcmVsZWFzZSAmJiAvYmluL3NoIC4vYnVtcC5zaCAmJiBleHBvcnQgVkVSU0lPTj0kKGdpdCBkZXNjcmliZSkgJiYgZWNobyBGaW5pc2hlZCBydW5uaW5nIHVzZXIgY29tbWFuZHM7ICB9IHx8IHsgZ2l0IGNoZWNrb3V0IHJlbGVhc2UgJiYgZ2l0IGNoZWNrb3V0IC1iIHRlbXAgJiYgL2Jpbi9zaCAuL2J1bXAuc2ggJiYgZXhwb3J0IFZFUlNJT049JChnaXQgZGVzY3JpYmUpICYmIGVjaG8gRmluaXNoZWQgcnVubmluZyB1c2VyIGNvbW1hbmRzICYmIGdpdCBicmFuY2ggLU0gYnVtcC8kVkVSU0lPTjsgfSA7IH0nLFxuICAgICAgICAgICAgICAnJFNLSVAgfHwgeyBnaXQgbWVyZ2UtYmFzZSAtLWlzLWFuY2VzdG9yIGJ1bXAvJFZFUlNJT04gb3JpZ2luL3JlbGVhc2UgJiYgeyBlY2hvIFwiU2tpcHBpbmc6IGJ1bXAvJFZFUlNJT04gaXMgYW4gYW5jZXN0b3Igb2Ygb3JpZ2luL3JlbGVhc2VcIjsgZXhwb3J0IFNLSVA9dHJ1ZTsgfSB8fCB7IGVjaG8gXCJQdXNoaW5nOiBidW1wLyRWRVJTSU9OIGlzIGFoZWFkIG9mIG9yaWdpbi9yZWxlYXNlXCI7IGV4cG9ydCBTS0lQPWZhbHNlOyB9IDsgfScsXG4gICAgICAgICAgICAgICckU0tJUCB8fCB7IGdpdCByZW1vdGUgYWRkIG9yaWdpbl9zc2ggZ2l0QGdpdGh1Yi5jb206b3duZXIvcmVwby5naXQgOyB9JyxcbiAgICAgICAgICAgICAgJyRTS0lQIHx8IHsgZ2l0IHB1c2ggLS1hdG9taWMgLS1mb2xsb3ctdGFncyBvcmlnaW5fc3NoIGJ1bXAvJFZFUlNJT046YnVtcC8kVkVSU0lPTiA7IH0nLFxuICAgICAgICAgICAgICBcIiRTS0lQIHx8IHsgY3VybCAtLWZhaWwgLVggUE9TVCAtbyBwci5qc29uIC0taGVhZGVyIFxcXCJBdXRob3JpemF0aW9uOiB0b2tlbiAkR0lUSFVCX1RPS0VOXFxcIiAtLWhlYWRlciBcXFwiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXFxcIiAtZCBcXFwie1xcXFxcXFwidGl0bGVcXFxcXFxcIjpcXFxcXFxcImN1c3RvbSB0aXRsZVxcXFxcXFwiLFxcXFxcXFwiYmFzZVxcXFxcXFwiOlxcXFxcXFwicmVsZWFzZVxcXFxcXFwiLFxcXFxcXFwiaGVhZFxcXFxcXFwiOlxcXFxcXFwiYnVtcC8kVkVSU0lPTlxcXFxcXFwifVxcXCIgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9vd25lci9yZXBvL3B1bGxzICYmIGV4cG9ydCBQUl9OVU1CRVI9JChub2RlIC1wICdyZXF1aXJlKFxcXCIuL3ByLmpzb25cXFwiKS5udW1iZXInKSA7IH1cIixcbiAgICAgICAgICAgICAgJyRTS0lQIHx8IHsgY3VybCAtLWZhaWwgLVggUEFUQ0ggLS1oZWFkZXIgXCJBdXRob3JpemF0aW9uOiB0b2tlbiAkR0lUSFVCX1RPS0VOXCIgLS1oZWFkZXIgXCJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cIiAtZCBcIntcXFxcXCJib2R5XFxcXFwiOlxcXFxcImN1c3RvbSBib2R5XFxcXFwifVwiIGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvb3duZXIvcmVwby9wdWxscy8kUFJfTlVNQkVSIDsgfScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LCB1bmRlZmluZWQsIDIpLFxuICAgIH0sXG4gIH0pO1xufSk7XG5cbnRlc3QoJ2F1dG9CdW1wIHdpdGggcHVsbCByZXF1ZXN0IGZhaWxzIHdoZW4gaGVhZD1iYXNlJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhuZXcgY2RrLkFwcCgpLCAnVGVzdFN0YWNrJyk7XG5cbiAgLy8gV0hFTlxuICBleHBlY3QoKCkgPT4gbmV3IEF1dG9CdW1wKHN0YWNrLCAnTXlBdXRvQnVtcCcsIHtcbiAgICByZXBvOiBNT0NLX1JFUE8sXG4gICAgYmFzZToge1xuICAgICAgbmFtZTogJ21hc3RlcicsXG4gICAgfSxcbiAgICBoZWFkOiB7XG4gICAgICBuYW1lOiAnbWFzdGVyJyxcbiAgICB9LFxuICB9KSkudG9UaHJvdygpO1xufSk7XG4iXX0=
@@ -1 +0,0 @@
1
- export {};
@@ -1,144 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
- Object.defineProperty(o, "default", { enumerable: true, value: v });
11
- }) : function(o, v) {
12
- o["default"] = v;
13
- });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
21
- Object.defineProperty(exports, "__esModule", { value: true });
22
- const path = __importStar(require("path"));
23
- const assert = __importStar(require("@monocdk-experiment/assert"));
24
- const monocdk_1 = require("monocdk");
25
- const lib_1 = require("../../lib");
26
- const testDir = path.join(__dirname, 'delivlib-tests', 'linux');
27
- test('correctly creates canary', () => {
28
- // GIVEN
29
- const stack = new monocdk_1.Stack(new monocdk_1.App(), 'TestStack');
30
- // WHEN
31
- new lib_1.Canary(stack, 'Canary', {
32
- schedule: monocdk_1.aws_events.Schedule.expression('rate(1 minute)'),
33
- scriptDirectory: testDir,
34
- entrypoint: 'test.sh',
35
- });
36
- // THEN
37
- assert.expect(stack).to(assert.haveResourceLike('AWS::CloudWatch::Alarm', {
38
- ComparisonOperator: 'GreaterThanOrEqualToThreshold',
39
- EvaluationPeriods: 1,
40
- Threshold: 1,
41
- Dimensions: [{
42
- Name: 'ProjectName',
43
- Value: {
44
- Ref: 'CanaryShellableA135E79C',
45
- },
46
- }],
47
- MetricName: 'FailedBuilds',
48
- Namespace: 'AWS/CodeBuild',
49
- Statistic: 'Sum',
50
- TreatMissingData: 'ignore',
51
- Period: 300,
52
- }));
53
- assert.expect(stack).to(assert.haveResourceLike('AWS::Events::Rule', {
54
- ScheduleExpression: 'rate(1 minute)',
55
- State: 'ENABLED',
56
- Targets: [{
57
- Arn: {
58
- 'Fn::GetAtt': [
59
- 'CanaryShellableA135E79C',
60
- 'Arn',
61
- ],
62
- },
63
- RoleArn: {
64
- 'Fn::GetAtt': [
65
- 'CanaryShellableEventsRoleC4030D0D',
66
- 'Arn',
67
- ],
68
- },
69
- }],
70
- }));
71
- assert.expect(stack).to(assert.haveResourceLike('AWS::CodeBuild::Project', {
72
- Artifacts: {
73
- Type: 'NO_ARTIFACTS',
74
- },
75
- Environment: {
76
- ComputeType: 'BUILD_GENERAL1_MEDIUM',
77
- Image: 'aws/codebuild/standard:4.0',
78
- PrivilegedMode: false,
79
- Type: 'LINUX_CONTAINER',
80
- EnvironmentVariables: [
81
- {
82
- Name: 'SCRIPT_S3_BUCKET',
83
- Type: 'PLAINTEXT',
84
- Value: {
85
- Ref: 'AssetParameters3d34b07ba871989d030649c646b3096ba7c78ca531897bcdb0670774d2f9d3e4S3BucketDA91EFBC',
86
- },
87
- },
88
- {
89
- Name: 'SCRIPT_S3_KEY',
90
- Type: 'PLAINTEXT',
91
- Value: {
92
- 'Fn::Join': [
93
- '',
94
- [
95
- {
96
- 'Fn::Select': [
97
- 0,
98
- {
99
- 'Fn::Split': [
100
- '||',
101
- {
102
- Ref: 'AssetParameters3d34b07ba871989d030649c646b3096ba7c78ca531897bcdb0670774d2f9d3e4S3VersionKeyF3F83F76',
103
- },
104
- ],
105
- },
106
- ],
107
- },
108
- {
109
- 'Fn::Select': [
110
- 1,
111
- {
112
- 'Fn::Split': [
113
- '||',
114
- {
115
- Ref: 'AssetParameters3d34b07ba871989d030649c646b3096ba7c78ca531897bcdb0670774d2f9d3e4S3VersionKeyF3F83F76',
116
- },
117
- ],
118
- },
119
- ],
120
- },
121
- ],
122
- ],
123
- },
124
- },
125
- {
126
- Name: 'IS_CANARY',
127
- Type: 'PLAINTEXT',
128
- Value: 'true',
129
- },
130
- ],
131
- },
132
- ServiceRole: {
133
- 'Fn::GetAtt': [
134
- 'CanaryShellableRole063BC07D',
135
- 'Arn',
136
- ],
137
- },
138
- Source: {
139
- // tslint:disable-next-line:max-line-length
140
- BuildSpec: '{\n "version": "0.2",\n "phases": {\n "pre_build": {\n "commands": [\n "echo \\"Downloading scripts from s3://${SCRIPT_S3_BUCKET}/${SCRIPT_S3_KEY}\\"",\n "aws s3 cp s3://${SCRIPT_S3_BUCKET}/${SCRIPT_S3_KEY} /tmp",\n "mkdir -p /tmp/scriptdir",\n "unzip /tmp/$(basename $SCRIPT_S3_KEY) -d /tmp/scriptdir"\n ]\n },\n "build": {\n "commands": [\n "export SCRIPT_DIR=/tmp/scriptdir",\n "echo \\"Running test.sh\\"",\n "/bin/bash /tmp/scriptdir/test.sh"\n ]\n }\n }\n}',
141
- },
142
- }));
143
- });
144
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuYXJ5LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjYW5hcnkudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFDN0IsbUVBQXFEO0FBQ3JELHFDQUEyRDtBQUMzRCxtQ0FBbUM7QUFHbkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFFaEUsSUFBSSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRTtJQUNwQyxRQUFRO0lBQ1IsTUFBTSxLQUFLLEdBQUcsSUFBSSxlQUFLLENBQUMsSUFBSSxhQUFHLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoRCxPQUFPO0lBQ1AsSUFBSSxZQUFNLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRTtRQUMxQixRQUFRLEVBQUUsb0JBQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDO1FBQ3RELGVBQWUsRUFBRSxPQUFPO1FBQ3hCLFVBQVUsRUFBRSxTQUFTO0tBQ3RCLENBQUMsQ0FBQztJQUNILE9BQU87SUFDUCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsd0JBQXdCLEVBQUU7UUFDeEUsa0JBQWtCLEVBQUUsK0JBQStCO1FBQ25ELGlCQUFpQixFQUFFLENBQUM7UUFDcEIsU0FBUyxFQUFFLENBQUM7UUFDWixVQUFVLEVBQUUsQ0FBQztnQkFDWCxJQUFJLEVBQUUsYUFBYTtnQkFDbkIsS0FBSyxFQUFFO29CQUNMLEdBQUcsRUFBRSx5QkFBeUI7aUJBQy9CO2FBQ0YsQ0FBQztRQUNGLFVBQVUsRUFBRSxjQUFjO1FBQzFCLFNBQVMsRUFBRSxlQUFlO1FBQzFCLFNBQVMsRUFBRSxLQUFLO1FBQ2hCLGdCQUFnQixFQUFFLFFBQVE7UUFDMUIsTUFBTSxFQUFFLEdBQUc7S0FDWixDQUFDLENBQUMsQ0FBQztJQUVKLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsRUFBRTtRQUNuRSxrQkFBa0IsRUFBRSxnQkFBZ0I7UUFDcEMsS0FBSyxFQUFFLFNBQVM7UUFDaEIsT0FBTyxFQUFFLENBQUM7Z0JBQ1IsR0FBRyxFQUFFO29CQUNILFlBQVksRUFBRTt3QkFDWix5QkFBeUI7d0JBQ3pCLEtBQUs7cUJBQ047aUJBQ0Y7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLFlBQVksRUFBRTt3QkFDWixtQ0FBbUM7d0JBQ25DLEtBQUs7cUJBQ047aUJBQ0Y7YUFDRixDQUFDO0tBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMseUJBQXlCLEVBQUU7UUFDekUsU0FBUyxFQUFFO1lBQ1QsSUFBSSxFQUFFLGNBQWM7U0FDckI7UUFDRCxXQUFXLEVBQUU7WUFDWCxXQUFXLEVBQUUsdUJBQXVCO1lBQ3BDLEtBQUssRUFBRSw0QkFBNEI7WUFDbkMsY0FBYyxFQUFFLEtBQUs7WUFDckIsSUFBSSxFQUFFLGlCQUFpQjtZQUN2QixvQkFBb0IsRUFBRTtnQkFDcEI7b0JBQ0UsSUFBSSxFQUFFLGtCQUFrQjtvQkFDeEIsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLEtBQUssRUFBRTt3QkFDTCxHQUFHLEVBQUUsaUdBQWlHO3FCQUN2RztpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsZUFBZTtvQkFDckIsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLEtBQUssRUFBRTt3QkFDTCxVQUFVLEVBQUU7NEJBQ1YsRUFBRTs0QkFDRjtnQ0FDRTtvQ0FDRSxZQUFZLEVBQUU7d0NBQ1osQ0FBQzt3Q0FDRDs0Q0FDRSxXQUFXLEVBQUU7Z0RBQ1gsSUFBSTtnREFDSjtvREFDRSxHQUFHLEVBQUUscUdBQXFHO2lEQUMzRzs2Q0FDRjt5Q0FDRjtxQ0FDRjtpQ0FDRjtnQ0FDRDtvQ0FDRSxZQUFZLEVBQUU7d0NBQ1osQ0FBQzt3Q0FDRDs0Q0FDRSxXQUFXLEVBQUU7Z0RBQ1gsSUFBSTtnREFDSjtvREFDRSxHQUFHLEVBQUUscUdBQXFHO2lEQUMzRzs2Q0FDRjt5Q0FDRjtxQ0FDRjtpQ0FDRjs2QkFDRjt5QkFDRjtxQkFDRjtpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsV0FBVztvQkFDakIsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLEtBQUssRUFBRSxNQUFNO2lCQUNkO2FBQ0Y7U0FDRjtRQUNELFdBQVcsRUFBRTtZQUNYLFlBQVksRUFBRTtnQkFDWiw2QkFBNkI7Z0JBQzdCLEtBQUs7YUFDTjtTQUNGO1FBQ0QsTUFBTSxFQUFFO1lBQ04sMkNBQTJDO1lBQzNDLFNBQVMsRUFBRSxvaUJBQW9pQjtTQUNoakI7S0FDRixDQUFDLENBQUMsQ0FBQztBQUNOLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdAbW9ub2Nkay1leHBlcmltZW50L2Fzc2VydCc7XG5pbXBvcnQgeyBBcHAsIFN0YWNrLCBhd3NfZXZlbnRzIGFzIGV2ZW50cyB9IGZyb20gJ21vbm9jZGsnO1xuaW1wb3J0IHsgQ2FuYXJ5IH0gZnJvbSAnLi4vLi4vbGliJztcblxuXG5jb25zdCB0ZXN0RGlyID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ2RlbGl2bGliLXRlc3RzJywgJ2xpbnV4Jyk7XG5cbnRlc3QoJ2NvcnJlY3RseSBjcmVhdGVzIGNhbmFyeScsICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCAnVGVzdFN0YWNrJyk7XG4gIC8vIFdIRU5cbiAgbmV3IENhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICBzY2hlZHVsZTogZXZlbnRzLlNjaGVkdWxlLmV4cHJlc3Npb24oJ3JhdGUoMSBtaW51dGUpJyksXG4gICAgc2NyaXB0RGlyZWN0b3J5OiB0ZXN0RGlyLFxuICAgIGVudHJ5cG9pbnQ6ICd0ZXN0LnNoJyxcbiAgfSk7XG4gIC8vIFRIRU5cbiAgYXNzZXJ0LmV4cGVjdChzdGFjaykudG8oYXNzZXJ0LmhhdmVSZXNvdXJjZUxpa2UoJ0FXUzo6Q2xvdWRXYXRjaDo6QWxhcm0nLCB7XG4gICAgQ29tcGFyaXNvbk9wZXJhdG9yOiAnR3JlYXRlclRoYW5PckVxdWFsVG9UaHJlc2hvbGQnLFxuICAgIEV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgIFRocmVzaG9sZDogMSxcbiAgICBEaW1lbnNpb25zOiBbe1xuICAgICAgTmFtZTogJ1Byb2plY3ROYW1lJyxcbiAgICAgIFZhbHVlOiB7XG4gICAgICAgIFJlZjogJ0NhbmFyeVNoZWxsYWJsZUExMzVFNzlDJyxcbiAgICAgIH0sXG4gICAgfV0sXG4gICAgTWV0cmljTmFtZTogJ0ZhaWxlZEJ1aWxkcycsXG4gICAgTmFtZXNwYWNlOiAnQVdTL0NvZGVCdWlsZCcsXG4gICAgU3RhdGlzdGljOiAnU3VtJyxcbiAgICBUcmVhdE1pc3NpbmdEYXRhOiAnaWdub3JlJyxcbiAgICBQZXJpb2Q6IDMwMCxcbiAgfSkpO1xuXG4gIGFzc2VydC5leHBlY3Qoc3RhY2spLnRvKGFzc2VydC5oYXZlUmVzb3VyY2VMaWtlKCdBV1M6OkV2ZW50czo6UnVsZScsIHtcbiAgICBTY2hlZHVsZUV4cHJlc3Npb246ICdyYXRlKDEgbWludXRlKScsXG4gICAgU3RhdGU6ICdFTkFCTEVEJyxcbiAgICBUYXJnZXRzOiBbe1xuICAgICAgQXJuOiB7XG4gICAgICAgICdGbjo6R2V0QXR0JzogW1xuICAgICAgICAgICdDYW5hcnlTaGVsbGFibGVBMTM1RTc5QycsXG4gICAgICAgICAgJ0FybicsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgUm9sZUFybjoge1xuICAgICAgICAnRm46OkdldEF0dCc6IFtcbiAgICAgICAgICAnQ2FuYXJ5U2hlbGxhYmxlRXZlbnRzUm9sZUM0MDMwRDBEJyxcbiAgICAgICAgICAnQXJuJyxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfV0sXG4gIH0pKTtcblxuICBhc3NlcnQuZXhwZWN0KHN0YWNrKS50byhhc3NlcnQuaGF2ZVJlc291cmNlTGlrZSgnQVdTOjpDb2RlQnVpbGQ6OlByb2plY3QnLCB7XG4gICAgQXJ0aWZhY3RzOiB7XG4gICAgICBUeXBlOiAnTk9fQVJUSUZBQ1RTJyxcbiAgICB9LFxuICAgIEVudmlyb25tZW50OiB7XG4gICAgICBDb21wdXRlVHlwZTogJ0JVSUxEX0dFTkVSQUwxX01FRElVTScsXG4gICAgICBJbWFnZTogJ2F3cy9jb2RlYnVpbGQvc3RhbmRhcmQ6NC4wJyxcbiAgICAgIFByaXZpbGVnZWRNb2RlOiBmYWxzZSxcbiAgICAgIFR5cGU6ICdMSU5VWF9DT05UQUlORVInLFxuICAgICAgRW52aXJvbm1lbnRWYXJpYWJsZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIE5hbWU6ICdTQ1JJUFRfUzNfQlVDS0VUJyxcbiAgICAgICAgICBUeXBlOiAnUExBSU5URVhUJyxcbiAgICAgICAgICBWYWx1ZToge1xuICAgICAgICAgICAgUmVmOiAnQXNzZXRQYXJhbWV0ZXJzM2QzNGIwN2JhODcxOTg5ZDAzMDY0OWM2NDZiMzA5NmJhN2M3OGNhNTMxODk3YmNkYjA2NzA3NzRkMmY5ZDNlNFMzQnVja2V0REE5MUVGQkMnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBOYW1lOiAnU0NSSVBUX1MzX0tFWScsXG4gICAgICAgICAgVHlwZTogJ1BMQUlOVEVYVCcsXG4gICAgICAgICAgVmFsdWU6IHtcbiAgICAgICAgICAgICdGbjo6Sm9pbic6IFtcbiAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAnRm46OlNlbGVjdCc6IFtcbiAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICdGbjo6U3BsaXQnOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAnfHwnLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBSZWY6ICdBc3NldFBhcmFtZXRlcnMzZDM0YjA3YmE4NzE5ODlkMDMwNjQ5YzY0NmIzMDk2YmE3Yzc4Y2E1MzE4OTdiY2RiMDY3MDc3NGQyZjlkM2U0UzNWZXJzaW9uS2V5RjNGODNGNzYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICdGbjo6U2VsZWN0JzogW1xuICAgICAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgJ0ZuOjpTcGxpdCc6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICd8fCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJlZjogJ0Fzc2V0UGFyYW1ldGVyczNkMzRiMDdiYTg3MTk4OWQwMzA2NDljNjQ2YjMwOTZiYTdjNzhjYTUzMTg5N2JjZGIwNjcwNzc0ZDJmOWQzZTRTM1ZlcnNpb25LZXlGM0Y4M0Y3NicsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBOYW1lOiAnSVNfQ0FOQVJZJyxcbiAgICAgICAgICBUeXBlOiAnUExBSU5URVhUJyxcbiAgICAgICAgICBWYWx1ZTogJ3RydWUnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIFNlcnZpY2VSb2xlOiB7XG4gICAgICAnRm46OkdldEF0dCc6IFtcbiAgICAgICAgJ0NhbmFyeVNoZWxsYWJsZVJvbGUwNjNCQzA3RCcsXG4gICAgICAgICdBcm4nLFxuICAgICAgXSxcbiAgICB9LFxuICAgIFNvdXJjZToge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgQnVpbGRTcGVjOiAne1xcbiAgXCJ2ZXJzaW9uXCI6IFwiMC4yXCIsXFxuICBcInBoYXNlc1wiOiB7XFxuICAgIFwicHJlX2J1aWxkXCI6IHtcXG4gICAgICBcImNvbW1hbmRzXCI6IFtcXG4gICAgICAgIFwiZWNobyBcXFxcXCJEb3dubG9hZGluZyBzY3JpcHRzIGZyb20gczM6Ly8ke1NDUklQVF9TM19CVUNLRVR9LyR7U0NSSVBUX1MzX0tFWX1cXFxcXCJcIixcXG4gICAgICAgIFwiYXdzIHMzIGNwIHMzOi8vJHtTQ1JJUFRfUzNfQlVDS0VUfS8ke1NDUklQVF9TM19LRVl9IC90bXBcIixcXG4gICAgICAgIFwibWtkaXIgLXAgL3RtcC9zY3JpcHRkaXJcIixcXG4gICAgICAgIFwidW56aXAgL3RtcC8kKGJhc2VuYW1lICRTQ1JJUFRfUzNfS0VZKSAtZCAvdG1wL3NjcmlwdGRpclwiXFxuICAgICAgXVxcbiAgICB9LFxcbiAgICBcImJ1aWxkXCI6IHtcXG4gICAgICBcImNvbW1hbmRzXCI6IFtcXG4gICAgICAgIFwiZXhwb3J0IFNDUklQVF9ESVI9L3RtcC9zY3JpcHRkaXJcIixcXG4gICAgICAgIFwiZWNobyBcXFxcXCJSdW5uaW5nIHRlc3Quc2hcXFxcXCJcIixcXG4gICAgICAgIFwiL2Jpbi9iYXNoIC90bXAvc2NyaXB0ZGlyL3Rlc3Quc2hcIlxcbiAgICAgIF1cXG4gICAgfVxcbiAgfVxcbn0nLFxuICAgIH0sXG4gIH0pKTtcbn0pO1xuIl19