aws-delivlib 13.4.0 → 13.4.4

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 (63) hide show
  1. package/.gitattributes +22 -20
  2. package/cdk.out/{asset.663163693e04179c71265b44a325be7e6b8c4e90b081883a1b3f3393de2546ea → asset.7820644cf1fdec7cec290ed6fdd561e35f4015d4dcf03a20f8035dda3c0ac88a}/watcher-handler.d.ts +0 -0
  3. package/cdk.out/asset.7820644cf1fdec7cec290ed6fdd561e35f4015d4dcf03a20f8035dda3c0ac88a/watcher-handler.js +108 -0
  4. package/cdk.out/{asset.663163693e04179c71265b44a325be7e6b8c4e90b081883a1b3f3393de2546ea → asset.7820644cf1fdec7cec290ed6fdd561e35f4015d4dcf03a20f8035dda3c0ac88a}/watcher-handler.ts +0 -0
  5. package/cdk.out/asset.dc2e98009b027861f34e56eebb81faa5a3951ed9da80ce4a903a45de04268238/index.js +16465 -0
  6. package/cdk.out/cdk.out +1 -1
  7. package/cdk.out/delivlib-test.assets.json +9 -9
  8. package/cdk.out/delivlib-test.template.json +33 -28
  9. package/cdk.out/manifest.json +1840 -1840
  10. package/cdk.out/tree.json +442 -437
  11. package/lib/__tests__/build-spec.test.js +21 -2
  12. package/lib/__tests__/bump.test.js +21 -2
  13. package/lib/__tests__/canary.test.js +22 -3
  14. package/lib/__tests__/change-control-lambda/disable-transition.test.js +2 -1
  15. package/lib/__tests__/change-control-lambda/handler.test.js +23 -3
  16. package/lib/__tests__/chime-notifier.test.js +4 -3
  17. package/lib/__tests__/code-signing-cert.test.js +21 -2
  18. package/lib/__tests__/integ.delivlib.js +21 -2
  19. package/lib/__tests__/open-pgp-key-pair.test.js +21 -2
  20. package/lib/__tests__/pipeline.test.js +22 -3
  21. package/lib/__tests__/pr.test.js +21 -2
  22. package/lib/__tests__/publishing.test.js +21 -2
  23. package/lib/__tests__/registry-sync/ecr-mirror.test.js +21 -2
  24. package/lib/__tests__/registry-sync/mirror-source.test.js +21 -2
  25. package/lib/__tests__/shellable.test.js +22 -3
  26. package/lib/__tests__/test-stack.js +29 -9
  27. package/lib/change-control-lambda/disable-transition.js +21 -2
  28. package/lib/change-control-lambda/index.js +21 -2
  29. package/lib/change-controller.js +21 -2
  30. package/lib/chime-notifier/chime-notifier.js +22 -12
  31. package/lib/chime-notifier/chime-notifier.ts +1 -11
  32. package/lib/chime-notifier/{notifier-handler.d.ts → handler/notifier-handler.d.ts} +0 -0
  33. package/lib/chime-notifier/handler/notifier-handler.js +110 -0
  34. package/lib/chime-notifier/{notifier-handler.ts → handler/notifier-handler.ts} +4 -4
  35. package/lib/code-signing/certificate-signing-request.js +21 -2
  36. package/lib/code-signing/code-signing-certificate.js +21 -2
  37. package/lib/code-signing/private-key.js +21 -2
  38. package/lib/custom-resource-handlers/src/_cloud-formation.js +22 -3
  39. package/lib/custom-resource-handlers/src/_exec.js +22 -3
  40. package/lib/custom-resource-handlers/src/_rmrf.js +23 -4
  41. package/lib/custom-resource-handlers/src/certificate-signing-request.js +26 -7
  42. package/lib/custom-resource-handlers/src/certificate-signing-request.tsbuildinfo +1 -1
  43. package/lib/custom-resource-handlers/src/pgp-secret.js +27 -8
  44. package/lib/custom-resource-handlers/src/pgp-secret.tsbuildinfo +1 -1
  45. package/lib/custom-resource-handlers/src/private-key.js +26 -7
  46. package/lib/custom-resource-handlers/src/private-key.tsbuildinfo +1 -1
  47. package/lib/open-pgp-key-pair.js +21 -2
  48. package/lib/pipeline-notifications/chime.js +21 -2
  49. package/lib/pipeline-notifications/slack.js +21 -2
  50. package/lib/pipeline-watcher/handler/watcher-handler.js +21 -2
  51. package/lib/pipeline-watcher/watcher.js +21 -2
  52. package/lib/pipeline.js +21 -2
  53. package/lib/publishing/s3/publish.sh +2 -1
  54. package/lib/publishing.js +22 -3
  55. package/lib/pull-request/bump.js +21 -2
  56. package/lib/pull-request/merge-back.js +22 -3
  57. package/lib/pull-request/pr.js +21 -2
  58. package/lib/shellable.js +22 -3
  59. package/lib/util.js +23 -4
  60. package/package.json +35 -36
  61. package/cdk.out/asset.663163693e04179c71265b44a325be7e6b8c4e90b081883a1b3f3393de2546ea/watcher-handler.js +0 -89
  62. package/cdk.out/asset.d81bf2d4c389ecd69472cf4b27599e1ffbe0c1543104f45d035834e863f64ca7/index.js +0 -14129
  63. package/lib/chime-notifier/notifier-handler.js +0 -91
package/package.json CHANGED
@@ -6,26 +6,25 @@
6
6
  "url": "https://github.com/cdklabs/aws-delivlib.git"
7
7
  },
8
8
  "scripts": {
9
- "clobber": "npx projen clobber",
10
- "compile": "npx projen compile",
11
- "test:compile": "npx projen test:compile",
12
- "test": "npx projen test",
13
9
  "build": "npx projen build",
14
- "test:watch": "npx projen test:watch",
15
- "test:update": "npx projen test:update",
16
10
  "bump": "npx projen bump",
17
- "unbump": "npx projen unbump",
18
- "publish:github": "npx projen publish:github",
19
- "publish:npm": "npx projen publish:npm",
20
- "upgrade": "npx projen upgrade",
11
+ "clobber": "npx projen clobber",
12
+ "compile": "npx projen compile",
13
+ "compile:custom-resource-handlers": "npx projen compile:custom-resource-handlers",
21
14
  "default": "npx projen default",
22
- "watch": "npx projen watch",
23
- "package": "npx projen package",
24
15
  "eslint": "npx projen eslint",
25
16
  "integ:diff": "npx projen integ:diff",
26
17
  "integ:update": "npx projen integ:update",
27
- "compile:custom-resource-handlers": "npx projen compile:custom-resource-handlers",
18
+ "package": "npx projen package",
19
+ "post-compile": "npx projen post-compile",
20
+ "pre-compile": "npx projen pre-compile",
28
21
  "release": "npx projen release",
22
+ "test": "npx projen test",
23
+ "test:update": "npx projen test:update",
24
+ "test:watch": "npx projen test:watch",
25
+ "unbump": "npx projen unbump",
26
+ "upgrade": "npx projen upgrade",
27
+ "watch": "npx projen watch",
29
28
  "projen": "npx projen",
30
29
  "cdk": "npx cdk"
31
30
  },
@@ -35,36 +34,36 @@
35
34
  "organization": false
36
35
  },
37
36
  "devDependencies": {
38
- "@monocdk-experiment/assert": "^1.123.0",
39
- "@types/aws-lambda": "^8.10.83",
40
- "@types/jest": "^27.0.2",
37
+ "@monocdk-experiment/assert": "^1.135.0",
38
+ "@types/aws-lambda": "^8.10.87",
39
+ "@types/jest": "^27.0.3",
41
40
  "@types/node": "^14.17.0",
42
- "@typescript-eslint/eslint-plugin": "^4.31.1",
43
- "@typescript-eslint/parser": "^4.31.1",
44
- "aws-cdk": "^1.123.0",
45
- "aws-sdk": "^2.991.0",
46
- "constructs": "^3.3.147",
47
- "esbuild": "^0.12.28",
48
- "eslint": "^7.32.0",
41
+ "@typescript-eslint/eslint-plugin": "^5",
42
+ "@typescript-eslint/parser": "^5",
43
+ "aws-cdk": "^1.135.0",
44
+ "aws-sdk": "^2.1046.0",
45
+ "constructs": "^3.3.165",
46
+ "esbuild": "^0.14.3",
47
+ "eslint": "^8",
49
48
  "eslint-import-resolver-node": "^0.3.6",
50
49
  "eslint-import-resolver-typescript": "^2.5.0",
51
- "eslint-plugin-import": "^2.24.2",
52
- "jest": "^27.3.1",
50
+ "eslint-plugin-import": "^2.25.3",
51
+ "jest": "^27.4.4",
53
52
  "jest-create-mock-instance": "^2.0.0",
54
- "jest-junit": "^12",
55
- "json-schema": "^0.3.0",
56
- "monocdk": "^1.123.0",
57
- "node-ical": "^0.13.0",
58
- "npm-check-updates": "^11",
59
- "projen": "^0.28.19",
53
+ "jest-junit": "^13",
54
+ "json-schema": "^0.4.0",
55
+ "monocdk": "^1.135.0",
56
+ "node-ical": "^0.14.1",
57
+ "npm-check-updates": "^12",
58
+ "projen": "^0.40.9",
60
59
  "rrule": "^2.6.8",
61
60
  "standard-version": "^9",
62
- "ts-jest": "^27.0.7",
63
- "typescript": "^4.4.3"
61
+ "ts-jest": "^27.1.1",
62
+ "typescript": "~4.5.3"
64
63
  },
65
64
  "peerDependencies": {
66
- "constructs": "^3.3.147",
67
- "monocdk": "^1.123.0"
65
+ "constructs": "^3.3.165",
66
+ "monocdk": "^1.135.0"
68
67
  },
69
68
  "dependencies": {
70
69
  "changelog-parser": "^2.8.0"
@@ -78,7 +77,7 @@
78
77
  ],
79
78
  "main": "lib/index.js",
80
79
  "license": "Apache-2.0",
81
- "version": "13.4.0",
80
+ "version": "13.4.4",
82
81
  "jest": {
83
82
  "testMatch": [
84
83
  "**/lib/__tests__/**/?(*.)+(spec|test).js?(x)"
@@ -1,89 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.handler = exports.cloudwatch = void 0;
4
- // eslint-disable-next-line import/no-extraneous-dependencies
5
- const AWS = require("aws-sdk");
6
- // export for tests
7
- exports.cloudwatch = new AWS.CloudWatch();
8
- const logger = {
9
- log: (line) => process.stdout.write(line),
10
- };
11
- /**
12
- * Lambda function that reacts to an Amazon EventBridge event triggered by a 'CodePipeline Action Execution State Change'.
13
- * The handler reads the event and sends off metrics to CloudWatch.
14
- */
15
- async function handler(event) {
16
- logger.log(`Received event: ${JSON.stringify(event)}`);
17
- switch (event['detail-type']) {
18
- case 'CodePipeline Pipeline Execution State Change':
19
- await handleExecutionChange(event);
20
- break;
21
- case 'CodePipeline Action Execution State Change':
22
- await handleActionChange(event);
23
- break;
24
- default: throw new Error(`Unhandled detail type ${event['detaill-type']}`);
25
- }
26
- }
27
- exports.handler = handler;
28
- async function handleExecutionChange(event) {
29
- const pipelineName = event.detail.pipeline;
30
- const state = event.detail.state;
31
- let value;
32
- switch (state) {
33
- case 'FAILED':
34
- value = 1;
35
- break;
36
- case 'SUCCEEDED':
37
- value = 0;
38
- break;
39
- default: throw new Error(`Unsupported state: ${state}. Only FAILED and SUCCEEDED states are supported. ` +
40
- 'Others must be filtered out prior to this function.');
41
- }
42
- await putMetric(event, value, [
43
- { Name: 'Pipeline', Value: pipelineName },
44
- ]);
45
- logger.log('Done');
46
- }
47
- async function handleActionChange(event) {
48
- const pipelineName = event.detail.pipeline;
49
- const action = event.detail.action;
50
- const state = event.detail.state;
51
- let value;
52
- switch (state) {
53
- case 'FAILED':
54
- value = 1;
55
- break;
56
- case 'SUCCEEDED':
57
- value = 0;
58
- break;
59
- default: throw new Error(`Unsupported state: ${state}. Only FAILED and SUCCEEDED states are supported. ` +
60
- 'Others must be filtered out prior to this function.');
61
- }
62
- await putMetric(event, value, [
63
- { Name: 'Pipeline', Value: pipelineName },
64
- { Name: 'Action', Value: action },
65
- ]);
66
- logger.log('Done');
67
- }
68
- async function putMetric(event, value, dimensions) {
69
- const metricNamespace = process.env.METRIC_NAMESPACE;
70
- const metricName = process.env.METRIC_NAME;
71
- const time = new Date(event.time);
72
- if (!metricNamespace || !metricName) {
73
- throw new Error('Both METRIC_NAMESPACE and METRIC_NAME environment variables must be set.');
74
- }
75
- const input = {
76
- Namespace: metricNamespace,
77
- MetricData: [
78
- {
79
- MetricName: metricName,
80
- Value: value,
81
- Dimensions: dimensions,
82
- Timestamp: time,
83
- },
84
- ],
85
- };
86
- logger.log(`Calling PutMetricData with payload: ${JSON.stringify(input)}`);
87
- await exports.cloudwatch.putMetricData(input).promise();
88
- }
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid2F0Y2hlci1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZEQUE2RDtBQUM3RCwrQkFBK0I7QUFtQi9CLG1CQUFtQjtBQUNOLFFBQUEsVUFBVSxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQy9DLE1BQU0sTUFBTSxHQUFHO0lBQ2IsR0FBRyxFQUFFLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7Q0FDbEQsQ0FBQztBQUVGOzs7R0FHRztBQUNJLEtBQUssVUFBVSxPQUFPLENBQUMsS0FBZ0I7SUFDNUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFdkQsUUFBUSxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQUU7UUFDNUIsS0FBSyw4Q0FBOEM7WUFBRSxNQUFNLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQUMsTUFBTTtRQUMvRixLQUFLLDRDQUE0QztZQUFFLE1BQU0sa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFBQyxNQUFNO1FBQzFGLE9BQU8sQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDNUU7QUFDSCxDQUFDO0FBUkQsMEJBUUM7QUFFRCxLQUFLLFVBQVUscUJBQXFCLENBQUMsS0FBc0M7SUFDekUsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDM0MsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFFakMsSUFBSSxLQUFhLENBQUM7SUFDbEIsUUFBUSxLQUFLLEVBQUU7UUFDYixLQUFLLFFBQVE7WUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQUMsTUFBTTtRQUNoQyxLQUFLLFdBQVc7WUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQUMsTUFBTTtRQUNuQyxPQUFPLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixLQUFLLG9EQUFvRDtZQUN4RyxxREFBcUQsQ0FBQyxDQUFDO0tBQ3hEO0lBRUQsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRTtRQUM1QixFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRTtLQUMxQyxDQUFDLENBQUM7SUFFSCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3JCLENBQUM7QUFHRCxLQUFLLFVBQVUsa0JBQWtCLENBQUMsS0FBbUM7SUFDbkUsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDM0MsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbkMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFFakMsSUFBSSxLQUFhLENBQUM7SUFDbEIsUUFBUSxLQUFLLEVBQUU7UUFDYixLQUFLLFFBQVE7WUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQUMsTUFBTTtRQUNoQyxLQUFLLFdBQVc7WUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQUMsTUFBTTtRQUNuQyxPQUFPLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixLQUFLLG9EQUFvRDtZQUN4RyxxREFBcUQsQ0FBQyxDQUFDO0tBQ3hEO0lBRUQsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRTtRQUM1QixFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRTtRQUN6QyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtLQUNsQyxDQUFDLENBQUM7SUFFSCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxLQUFLLFVBQVUsU0FBUyxDQUFDLEtBQWdCLEVBQUUsS0FBYSxFQUFFLFVBQXFDO0lBQzdGLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUM7SUFDckQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7SUFDM0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRWxDLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxVQUFVLEVBQUU7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQywwRUFBMEUsQ0FBQyxDQUFDO0tBQzdGO0lBRUQsTUFBTSxLQUFLLEdBQXNDO1FBQy9DLFNBQVMsRUFBRSxlQUFlO1FBQzFCLFVBQVUsRUFBRTtZQUNWO2dCQUNFLFVBQVUsRUFBRSxVQUFVO2dCQUN0QixLQUFLLEVBQUUsS0FBSztnQkFDWixVQUFVLEVBQUUsVUFBVTtnQkFDdEIsU0FBUyxFQUFFLElBQUk7YUFDaEI7U0FDRjtLQUNGLENBQUM7SUFFRixNQUFNLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUUzRSxNQUFNLGtCQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ2xELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgKiBhcyBBV1MgZnJvbSAnYXdzLXNkayc7XG5cbi8vIFBhcnRpYWwgdHlwZSBmb3IgdGhlICdkZXRhaWwnIHNlY3Rpb24gb2YgYW4gZXZlbnQgZnJvbSBBbWF6b24gRXZlbnRCcmlkZ2UgZm9yICdDb2RlUGlwZWxpbmUgRXhlY3V0aW9uIFN0YXRlIENoYW5nZSdcbi8vIFNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZXZlbnRicmlkZ2UvbGF0ZXN0L3VzZXJndWlkZS9ldmVudC10eXBlcy5odG1sI2NvZGVwaXBlbGluZS1ldmVudC10eXBlXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvblN0YXRlQ2hhbmdlRXZlbnQge1xuICByZWFkb25seSBwaXBlbGluZTogc3RyaW5nO1xuICByZWFkb25seSBzdGF0ZTogJ1NUQVJURUQnIHwgJ0NBTkNFTEVEJyB8ICdGQUlMRUQnIHwgJ1NVQ0NFRURFRCc7XG59XG5cbi8vIFBhcnRpYWwgdHlwZSBmb3IgdGhlICdkZXRhaWwnIHNlY3Rpb24gb2YgYW4gZXZlbnQgZnJvbSBBbWF6b24gRXZlbnRCcmlkZ2UgZm9yICdDb2RlUGlwZWxpbmUgQWN0aW9uIEV4ZWN1dGlvbiBTdGF0ZSBDaGFuZ2UnXG4vLyBTZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2V2ZW50YnJpZGdlL2xhdGVzdC91c2VyZ3VpZGUvZXZlbnQtdHlwZXMuaHRtbCNjb2RlcGlwZWxpbmUtZXZlbnQtdHlwZVxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25TdGF0ZUNoYW5nZUV2ZW50IGV4dGVuZHMgRXhlY3V0aW9uU3RhdGVDaGFuZ2VFdmVudCB7XG4gIHJlYWRvbmx5IGFjdGlvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBMYW1iZGFFeGVjdXRpb25TdGF0ZUNoYW5nZUV2ZW50ID0gQVdTTGFtYmRhLkV2ZW50QnJpZGdlRXZlbnQ8J0NvZGVQaXBlbGluZSBQaXBlbGluZSBFeGVjdXRpb24gU3RhdGUgQ2hhbmdlJywgRXhlY3V0aW9uU3RhdGVDaGFuZ2VFdmVudD47XG5leHBvcnQgdHlwZSBMYW1iZGFBY3Rpb25TdGF0ZUNoYW5nZUV2ZW50ID0gQVdTTGFtYmRhLkV2ZW50QnJpZGdlRXZlbnQ8J0NvZGVQaXBlbGluZSBBY3Rpb24gRXhlY3V0aW9uIFN0YXRlIENoYW5nZScsIEFjdGlvblN0YXRlQ2hhbmdlRXZlbnQ+O1xuZXhwb3J0IHR5cGUgRXZlbnRUeXBlID0gTGFtYmRhRXhlY3V0aW9uU3RhdGVDaGFuZ2VFdmVudCB8IExhbWJkYUFjdGlvblN0YXRlQ2hhbmdlRXZlbnQ7XG5cbi8vIGV4cG9ydCBmb3IgdGVzdHNcbmV4cG9ydCBjb25zdCBjbG91ZHdhdGNoID0gbmV3IEFXUy5DbG91ZFdhdGNoKCk7XG5jb25zdCBsb2dnZXIgPSB7XG4gIGxvZzogKGxpbmU6IHN0cmluZykgPT4gcHJvY2Vzcy5zdGRvdXQud3JpdGUobGluZSksXG59O1xuXG4vKipcbiAqIExhbWJkYSBmdW5jdGlvbiB0aGF0IHJlYWN0cyB0byBhbiBBbWF6b24gRXZlbnRCcmlkZ2UgZXZlbnQgdHJpZ2dlcmVkIGJ5IGEgJ0NvZGVQaXBlbGluZSBBY3Rpb24gRXhlY3V0aW9uIFN0YXRlIENoYW5nZScuXG4gKiBUaGUgaGFuZGxlciByZWFkcyB0aGUgZXZlbnQgYW5kIHNlbmRzIG9mZiBtZXRyaWNzIHRvIENsb3VkV2F0Y2guXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50OiBFdmVudFR5cGUpIHtcbiAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgZXZlbnQ6ICR7SlNPTi5zdHJpbmdpZnkoZXZlbnQpfWApO1xuXG4gIHN3aXRjaCAoZXZlbnRbJ2RldGFpbC10eXBlJ10pIHtcbiAgICBjYXNlICdDb2RlUGlwZWxpbmUgUGlwZWxpbmUgRXhlY3V0aW9uIFN0YXRlIENoYW5nZSc6IGF3YWl0IGhhbmRsZUV4ZWN1dGlvbkNoYW5nZShldmVudCk7IGJyZWFrO1xuICAgIGNhc2UgJ0NvZGVQaXBlbGluZSBBY3Rpb24gRXhlY3V0aW9uIFN0YXRlIENoYW5nZSc6IGF3YWl0IGhhbmRsZUFjdGlvbkNoYW5nZShldmVudCk7IGJyZWFrO1xuICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIGRldGFpbCB0eXBlICR7ZXZlbnRbJ2RldGFpbGwtdHlwZSddfWApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUV4ZWN1dGlvbkNoYW5nZShldmVudDogTGFtYmRhRXhlY3V0aW9uU3RhdGVDaGFuZ2VFdmVudCkge1xuICBjb25zdCBwaXBlbGluZU5hbWUgPSBldmVudC5kZXRhaWwucGlwZWxpbmU7XG4gIGNvbnN0IHN0YXRlID0gZXZlbnQuZGV0YWlsLnN0YXRlO1xuXG4gIGxldCB2YWx1ZTogbnVtYmVyO1xuICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgY2FzZSAnRkFJTEVEJzogdmFsdWUgPSAxOyBicmVhaztcbiAgICBjYXNlICdTVUNDRUVERUQnOiB2YWx1ZSA9IDA7IGJyZWFrO1xuICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc3RhdGU6ICR7c3RhdGV9LiBPbmx5IEZBSUxFRCBhbmQgU1VDQ0VFREVEIHN0YXRlcyBhcmUgc3VwcG9ydGVkLiBgICtcbiAgICAnT3RoZXJzIG11c3QgYmUgZmlsdGVyZWQgb3V0IHByaW9yIHRvIHRoaXMgZnVuY3Rpb24uJyk7XG4gIH1cblxuICBhd2FpdCBwdXRNZXRyaWMoZXZlbnQsIHZhbHVlLCBbXG4gICAgeyBOYW1lOiAnUGlwZWxpbmUnLCBWYWx1ZTogcGlwZWxpbmVOYW1lIH0sXG4gIF0pO1xuXG4gIGxvZ2dlci5sb2coJ0RvbmUnKTtcbn1cblxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVBY3Rpb25DaGFuZ2UoZXZlbnQ6IExhbWJkYUFjdGlvblN0YXRlQ2hhbmdlRXZlbnQpIHtcbiAgY29uc3QgcGlwZWxpbmVOYW1lID0gZXZlbnQuZGV0YWlsLnBpcGVsaW5lO1xuICBjb25zdCBhY3Rpb24gPSBldmVudC5kZXRhaWwuYWN0aW9uO1xuICBjb25zdCBzdGF0ZSA9IGV2ZW50LmRldGFpbC5zdGF0ZTtcblxuICBsZXQgdmFsdWU6IG51bWJlcjtcbiAgc3dpdGNoIChzdGF0ZSkge1xuICAgIGNhc2UgJ0ZBSUxFRCc6IHZhbHVlID0gMTsgYnJlYWs7XG4gICAgY2FzZSAnU1VDQ0VFREVEJzogdmFsdWUgPSAwOyBicmVhaztcbiAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHN0YXRlOiAke3N0YXRlfS4gT25seSBGQUlMRUQgYW5kIFNVQ0NFRURFRCBzdGF0ZXMgYXJlIHN1cHBvcnRlZC4gYCArXG4gICAgJ090aGVycyBtdXN0IGJlIGZpbHRlcmVkIG91dCBwcmlvciB0byB0aGlzIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgYXdhaXQgcHV0TWV0cmljKGV2ZW50LCB2YWx1ZSwgW1xuICAgIHsgTmFtZTogJ1BpcGVsaW5lJywgVmFsdWU6IHBpcGVsaW5lTmFtZSB9LFxuICAgIHsgTmFtZTogJ0FjdGlvbicsIFZhbHVlOiBhY3Rpb24gfSxcbiAgXSk7XG5cbiAgbG9nZ2VyLmxvZygnRG9uZScpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwdXRNZXRyaWMoZXZlbnQ6IEV2ZW50VHlwZSwgdmFsdWU6IG51bWJlciwgZGltZW5zaW9uczogQVdTLkNsb3VkV2F0Y2guRGltZW5zaW9ucykge1xuICBjb25zdCBtZXRyaWNOYW1lc3BhY2UgPSBwcm9jZXNzLmVudi5NRVRSSUNfTkFNRVNQQUNFO1xuICBjb25zdCBtZXRyaWNOYW1lID0gcHJvY2Vzcy5lbnYuTUVUUklDX05BTUU7XG4gIGNvbnN0IHRpbWUgPSBuZXcgRGF0ZShldmVudC50aW1lKTtcblxuICBpZiAoIW1ldHJpY05hbWVzcGFjZSB8fCAhbWV0cmljTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQm90aCBNRVRSSUNfTkFNRVNQQUNFIGFuZCBNRVRSSUNfTkFNRSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbXVzdCBiZSBzZXQuJyk7XG4gIH1cblxuICBjb25zdCBpbnB1dDogQVdTLkNsb3VkV2F0Y2guUHV0TWV0cmljRGF0YUlucHV0ID0ge1xuICAgIE5hbWVzcGFjZTogbWV0cmljTmFtZXNwYWNlLFxuICAgIE1ldHJpY0RhdGE6IFtcbiAgICAgIHtcbiAgICAgICAgTWV0cmljTmFtZTogbWV0cmljTmFtZSxcbiAgICAgICAgVmFsdWU6IHZhbHVlLFxuICAgICAgICBEaW1lbnNpb25zOiBkaW1lbnNpb25zLFxuICAgICAgICBUaW1lc3RhbXA6IHRpbWUsXG4gICAgICB9LFxuICAgIF0sXG4gIH07XG5cbiAgbG9nZ2VyLmxvZyhgQ2FsbGluZyBQdXRNZXRyaWNEYXRhIHdpdGggcGF5bG9hZDogJHtKU09OLnN0cmluZ2lmeShpbnB1dCl9YCk7XG5cbiAgYXdhaXQgY2xvdWR3YXRjaC5wdXRNZXRyaWNEYXRhKGlucHV0KS5wcm9taXNlKCk7XG59Il19