@mavogel/cdk-vscode-server 0.0.61 → 0.0.63

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 (99) hide show
  1. package/.jsii +117 -178
  2. package/API.md +96 -199
  3. package/CLAUDE.md +214 -57
  4. package/README.md +39 -1
  5. package/assets/idle-monitor-enabler/idle-monitor-enabler.lambda/index.js +67 -0
  6. package/assets/installer/installer.lambda/index.js +67 -30
  7. package/awslint.json +5 -0
  8. package/examples/git-repo/main.ts +30 -0
  9. package/integ-tests/integ.al2023.ts.snapshot/IntegSetupVSCodeOnAl2023DefaultTestDeployAssert74D8F645.assets.json +2 -2
  10. package/integ-tests/integ.al2023.ts.snapshot/IntegSetupVSCodeOnAl2023DefaultTestDeployAssert74D8F645.template.json +1 -1
  11. package/integ-tests/integ.al2023.ts.snapshot/IntegTestStackAl2023.assets.json +8 -8
  12. package/integ-tests/integ.al2023.ts.snapshot/IntegTestStackAl2023.template.json +257 -94
  13. package/integ-tests/{integ.stop-on-idle.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.al2023.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
  14. package/integ-tests/{integ.ubuntu.ts.snapshot/asset.0ad50fc42afd768c3d0bfdd4701e43284fb077a25f19eea1e8c51a5ca36ebfe4 → integ.al2023.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9}/index.js +50 -25
  15. package/integ-tests/integ.al2023.ts.snapshot/integ.json +1 -1
  16. package/integ-tests/integ.al2023.ts.snapshot/manifest.json +19 -3
  17. package/integ-tests/integ.al2023.ts.snapshot/tree.json +1 -1
  18. package/integ-tests/integ.custom-domain.ts.snapshot/IntegSetupVSCodeOnCustomDomainDefaultTestDeployAssert6982D514.assets.json +2 -2
  19. package/integ-tests/integ.custom-domain.ts.snapshot/IntegSetupVSCodeOnCustomDomainDefaultTestDeployAssert6982D514.template.json +1 -1
  20. package/integ-tests/integ.custom-domain.ts.snapshot/IntegTestStackCustomDomain.assets.json +8 -8
  21. package/integ-tests/integ.custom-domain.ts.snapshot/IntegTestStackCustomDomain.template.json +270 -94
  22. package/integ-tests/{integ.ubuntu.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.custom-domain.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
  23. package/integ-tests/{integ.al2023.ts.snapshot/asset.0ad50fc42afd768c3d0bfdd4701e43284fb077a25f19eea1e8c51a5ca36ebfe4 → integ.custom-domain.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9}/index.js +50 -25
  24. package/integ-tests/integ.custom-domain.ts.snapshot/integ.json +1 -1
  25. package/integ-tests/integ.custom-domain.ts.snapshot/manifest.json +19 -3
  26. package/integ-tests/integ.custom-domain.ts.snapshot/tree.json +1 -1
  27. package/integ-tests/integ.stop-on-idle.ts +1 -4
  28. package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegStopOnIdleFunctionalityDefaultTestDeployAssertEECF3FC0.assets.json +2 -2
  29. package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegStopOnIdleFunctionalityDefaultTestDeployAssertEECF3FC0.template.json +4 -4
  30. package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegTestStackStopOnIdle.assets.json +23 -9
  31. package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegTestStackStopOnIdle.template.json +755 -194
  32. package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.22c8a6c357b704e370bef317ae1b52c59f684aa7640422a3d1dfe813d1f77853.lambda/index.js +67 -0
  33. package/integ-tests/{integ.custom-domain.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.stop-on-idle.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
  34. package/integ-tests/integ.stop-on-idle.ts.snapshot/manifest.json +353 -72
  35. package/integ-tests/integ.stop-on-idle.ts.snapshot/tree.json +1 -1
  36. package/integ-tests/integ.ubuntu.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.assets.json +2 -2
  37. package/integ-tests/integ.ubuntu.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.template.json +1 -1
  38. package/integ-tests/integ.ubuntu.ts.snapshot/IntegTestStackUbuntu22.assets.json +8 -8
  39. package/integ-tests/integ.ubuntu.ts.snapshot/IntegTestStackUbuntu22.template.json +270 -94
  40. package/integ-tests/{integ.al2023.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.ubuntu.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
  41. package/integ-tests/{integ.custom-domain.ts.snapshot/asset.0ad50fc42afd768c3d0bfdd4701e43284fb077a25f19eea1e8c51a5ca36ebfe4 → integ.ubuntu.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9}/index.js +50 -25
  42. package/integ-tests/integ.ubuntu.ts.snapshot/integ.json +1 -1
  43. package/integ-tests/integ.ubuntu.ts.snapshot/manifest.json +19 -3
  44. package/integ-tests/integ.ubuntu.ts.snapshot/tree.json +1 -1
  45. package/integ-tests/integ.ubuntu24.ts +69 -0
  46. package/integ-tests/integ.ubuntu24.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.assets.json +33 -0
  47. package/integ-tests/integ.ubuntu24.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.template.json +337 -0
  48. package/integ-tests/integ.ubuntu24.ts.snapshot/IntegTestStackUbuntu24.assets.json +118 -0
  49. package/integ-tests/integ.ubuntu24.ts.snapshot/IntegTestStackUbuntu24.template.json +2725 -0
  50. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.2819175352ad1ce0dae768e83fc328fb70fb5f10b4a8ff0ccbcb791f02b0716d/index.js +1 -0
  51. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda/index.js +180 -0
  52. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.530055f7515b3f0a47900f5df37e729ba40ca977b2d07b952bdefa2b8f883f42.bundle/index.js +30676 -0
  53. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.781ab0ab74634cdaf61539ab208ab777829ef07097ac21f95b9e15a3b1eedc1b.lambda/index.js +57 -0
  54. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.7fa1e366ee8a9ded01fc355f704cff92bfd179574e6f9cfee800a3541df1b200/__entrypoint__.js +1 -0
  55. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.7fa1e366ee8a9ded01fc355f704cff92bfd179574e6f9cfee800a3541df1b200/index.js +1 -0
  56. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.9d043014be736e8162bcc7ec5590cc6d2ff24fd0d9c73a5c5d595151c5fdad00/index.js +1 -0
  57. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/cfn-response.js +1 -0
  58. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/consts.js +1 -0
  59. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/framework.js +3 -0
  60. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/outbound.js +1 -0
  61. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/util.js +1 -0
  62. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9/index.js +6017 -0
  63. package/integ-tests/integ.ubuntu24.ts.snapshot/integ.json +23 -0
  64. package/integ-tests/integ.ubuntu24.ts.snapshot/manifest.json +1473 -0
  65. package/integ-tests/integ.ubuntu24.ts.snapshot/tree.json +1 -0
  66. package/lib/idle-monitor/idle-monitor-function.js +2 -2
  67. package/lib/idle-monitor/idle-monitor.js +5 -2
  68. package/lib/idle-monitor-enabler/idle-monitor-enabler-function.d.ts +13 -0
  69. package/lib/idle-monitor-enabler/idle-monitor-enabler-function.js +22 -0
  70. package/lib/idle-monitor-enabler/idle-monitor-enabler.d.ts +25 -0
  71. package/lib/idle-monitor-enabler/idle-monitor-enabler.js +76 -0
  72. package/lib/idle-monitor-enabler/idle-monitor-enabler.lambda.d.ts +9 -0
  73. package/lib/idle-monitor-enabler/idle-monitor-enabler.lambda.js +48 -0
  74. package/lib/index.d.ts +0 -1
  75. package/lib/index.js +1 -2
  76. package/lib/installer/installer-function.js +2 -2
  77. package/lib/installer/installer.d.ts +100 -0
  78. package/lib/installer/installer.js +658 -301
  79. package/lib/installer/installer.lambda.js +64 -30
  80. package/lib/secret-retriever/secret-retriever-function.js +2 -2
  81. package/lib/vscode-server.d.ts +40 -0
  82. package/lib/vscode-server.js +27 -4
  83. package/package.json +12 -12
  84. package/.claude/hooks/file_checker.sh +0 -178
  85. package/.qlty/.gitignore +0 -7
  86. package/.qlty/configs/.yamllint.yaml +0 -21
  87. package/.qlty/qlty.toml +0 -115
  88. package/assets/status-check/status-check.lambda/index.js +0 -123
  89. package/integ-tests/integ.al2023.ts.snapshot/cdk.out +0 -1
  90. package/integ-tests/integ.al2023.ts.snapshot/read.13497.1.lock +0 -1
  91. package/integ-tests/integ.custom-domain.ts.snapshot/read.13497.1.lock +0 -1
  92. package/integ-tests/integ.ubuntu.ts.snapshot/cdk.out +0 -1
  93. package/integ-tests/integ.ubuntu.ts.snapshot/read.13497.1.lock +0 -1
  94. package/lib/status-check/status-check-function.d.ts +0 -13
  95. package/lib/status-check/status-check-function.js +0 -22
  96. package/lib/status-check/status-check.d.ts +0 -36
  97. package/lib/status-check/status-check.js +0 -109
  98. package/lib/status-check/status-check.lambda.d.ts +0 -2
  99. package/lib/status-check/status-check.lambda.js +0 -104
@@ -1,104 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.handler = void 0;
4
- const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
5
- const client_ec2_1 = require("@aws-sdk/client-ec2");
6
- const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
7
- const ec2 = new client_ec2_1.EC2Client({});
8
- const ddbClient = new client_dynamodb_1.DynamoDBClient({});
9
- const ddb = lib_dynamodb_1.DynamoDBDocumentClient.from(ddbClient);
10
- const TABLE_NAME = process.env.TABLE_NAME;
11
- const handler = async (event) => {
12
- console.log('StatusCheck/Start triggered', { event });
13
- const instanceId = event.pathParameters?.instanceId;
14
- const isStartRequest = event.resource?.includes('/start') && event.httpMethod === 'POST';
15
- if (!instanceId) {
16
- return {
17
- statusCode: 400,
18
- headers: {
19
- 'Content-Type': 'application/json',
20
- 'Access-Control-Allow-Origin': '*',
21
- },
22
- body: JSON.stringify({ error: 'Missing instanceId' }),
23
- };
24
- }
25
- try {
26
- // Handle POST /status/{instanceId}/start - Start instance
27
- if (isStartRequest) {
28
- console.log('Starting instance:', instanceId);
29
- const startCommand = new client_ec2_1.StartInstancesCommand({
30
- InstanceIds: [instanceId],
31
- });
32
- await ec2.send(startCommand);
33
- // Update DynamoDB state
34
- await ddb.send(new lib_dynamodb_1.UpdateCommand({
35
- TableName: TABLE_NAME,
36
- Key: { instanceId },
37
- UpdateExpression: 'SET instanceState = :state, lastActivityTime = :time',
38
- ExpressionAttributeValues: {
39
- ':state': 'starting',
40
- ':time': new Date().toISOString(),
41
- },
42
- }));
43
- return {
44
- statusCode: 200,
45
- headers: {
46
- 'Content-Type': 'application/json',
47
- 'Access-Control-Allow-Origin': '*',
48
- },
49
- body: JSON.stringify({
50
- message: 'Instance start initiated',
51
- state: 'starting',
52
- instanceId,
53
- }),
54
- };
55
- }
56
- // Handle GET /status/{instanceId} - Check status
57
- const statusCommand = new client_ec2_1.DescribeInstanceStatusCommand({
58
- InstanceIds: [instanceId],
59
- IncludeAllInstances: true,
60
- });
61
- const statusResponse = await ec2.send(statusCommand);
62
- const instanceStatus = statusResponse.InstanceStatuses?.[0];
63
- const state = instanceStatus?.InstanceState?.Name || 'unknown';
64
- console.log('Instance state:', state);
65
- // If running, update DynamoDB
66
- if (state === 'running') {
67
- await ddb.send(new lib_dynamodb_1.UpdateCommand({
68
- TableName: TABLE_NAME,
69
- Key: { instanceId },
70
- UpdateExpression: 'SET instanceState = :state, lastActivityTime = :time',
71
- ExpressionAttributeValues: {
72
- ':state': 'running',
73
- ':time': new Date().toISOString(),
74
- },
75
- }));
76
- }
77
- return {
78
- statusCode: 200,
79
- headers: {
80
- 'Content-Type': 'application/json',
81
- 'Access-Control-Allow-Origin': '*',
82
- 'Cache-Control': 'no-cache, no-store, must-revalidate',
83
- },
84
- body: JSON.stringify({
85
- state,
86
- ready: state === 'running',
87
- instanceId,
88
- }),
89
- };
90
- }
91
- catch (error) {
92
- console.error('Error in status check/start:', error);
93
- return {
94
- statusCode: 500,
95
- headers: {
96
- 'Content-Type': 'application/json',
97
- 'Access-Control-Allow-Origin': '*',
98
- },
99
- body: JSON.stringify({ error: 'Internal server error' }),
100
- };
101
- }
102
- };
103
- exports.handler = handler;
104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHVzLWNoZWNrLmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdGF0dXMtY2hlY2svc3RhdHVzLWNoZWNrLmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw4REFBMEQ7QUFDMUQsb0RBQXNHO0FBQ3RHLHdEQUE4RTtBQUc5RSxNQUFNLEdBQUcsR0FBRyxJQUFJLHNCQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDOUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxnQ0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3pDLE1BQU0sR0FBRyxHQUFHLHFDQUFzQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUVuRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVcsQ0FBQztBQUVwQyxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQzFCLEtBQTJCLEVBQ0ssRUFBRTtJQUNsQyxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUV0RCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQztJQUNwRCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQztJQUV6RixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsT0FBTztZQUNMLFVBQVUsRUFBRSxHQUFHO1lBQ2YsT0FBTyxFQUFFO2dCQUNQLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLDZCQUE2QixFQUFFLEdBQUc7YUFDbkM7WUFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxDQUFDO1NBQ3RELENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsMERBQTBE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QUMsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQztTQUN6RCxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMsQ0FBQztBQXpHVyxRQUFBLE9BQU8sV0F5R2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHluYW1vREJDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtZHluYW1vZGInO1xuaW1wb3J0IHsgRUMyQ2xpZW50LCBEZXNjcmliZUluc3RhbmNlU3RhdHVzQ29tbWFuZCwgU3RhcnRJbnN0YW5jZXNDb21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWVjMic7XG5pbXBvcnQgeyBEeW5hbW9EQkRvY3VtZW50Q2xpZW50LCBVcGRhdGVDb21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvbGliLWR5bmFtb2RiJztcbmltcG9ydCB0eXBlIHsgQVBJR2F0ZXdheVByb3h5RXZlbnQsIEFQSUdhdGV3YXlQcm94eVJlc3VsdCB9IGZyb20gJ2F3cy1sYW1iZGEnO1xuXG5jb25zdCBlYzIgPSBuZXcgRUMyQ2xpZW50KHt9KTtcbmNvbnN0IGRkYkNsaWVudCA9IG5ldyBEeW5hbW9EQkNsaWVudCh7fSk7XG5jb25zdCBkZGIgPSBEeW5hbW9EQkRvY3VtZW50Q2xpZW50LmZyb20oZGRiQ2xpZW50KTtcblxuY29uc3QgVEFCTEVfTkFNRSA9IHByb2Nlc3MuZW52LlRBQkxFX05BTUUhO1xuXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IGFzeW5jIChcbiAgZXZlbnQ6IEFQSUdhdGV3YXlQcm94eUV2ZW50LFxuKTogUHJvbWlzZTxBUElHYXRld2F5UHJveHlSZXN1bHQ+ID0+IHtcbiAgY29uc29sZS5sb2coJ1N0YXR1c0NoZWNrL1N0YXJ0IHRyaWdnZXJlZCcsIHsgZXZlbnQgfSk7XG5cbiAgY29uc3QgaW5zdGFuY2VJZCA9IGV2ZW50LnBhdGhQYXJhbWV0ZXJzPy5pbnN0YW5jZUlkO1xuICBjb25zdCBpc1N0YXJ0UmVxdWVzdCA9IGV2ZW50LnJlc291cmNlPy5pbmNsdWRlcygnL3N0YXJ0JykgJiYgZXZlbnQuaHR0cE1ldGhvZCA9PT0gJ1BPU1QnO1xuXG4gIGlmICghaW5zdGFuY2VJZCkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXNDb2RlOiA0MDAsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nOiAnKicsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBlcnJvcjogJ01pc3NpbmcgaW5zdGFuY2VJZCcgfSksXG4gICAgfTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gSGFuZGxlIFBPU1QgL3N0YXR1cy97aW5zdGFuY2VJZH0vc3RhcnQgLSBTdGFydCBpbnN0YW5jZVxuICAgIGlmIChpc1N0YXJ0UmVxdWVzdCkge1xuICAgICAgY29uc29sZS5sb2coJ1N0YXJ0aW5nIGluc3RhbmNlOicsIGluc3RhbmNlSWQpO1xuXG4gICAgICBjb25zdCBzdGFydENvbW1hbmQgPSBuZXcgU3RhcnRJbnN0YW5jZXNDb21tYW5kKHtcbiAgICAgICAgSW5zdGFuY2VJZHM6IFtpbnN0YW5jZUlkXSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBlYzIuc2VuZChzdGFydENvbW1hbmQpO1xuXG4gICAgICAvLyBVcGRhdGUgRHluYW1vREIgc3RhdGVcbiAgICAgIGF3YWl0IGRkYi5zZW5kKG5ldyBVcGRhdGVDb21tYW5kKHtcbiAgICAgICAgVGFibGVOYW1lOiBUQUJMRV9OQU1FLFxuICAgICAgICBLZXk6IHsgaW5zdGFuY2VJZCB9LFxuICAgICAgICBVcGRhdGVFeHByZXNzaW9uOiAnU0VUIGluc3RhbmNlU3RhdGUgPSA6c3RhdGUsIGxhc3RBY3Rpdml0eVRpbWUgPSA6dGltZScsXG4gICAgICAgIEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgICAnOnN0YXRlJzogJ3N0YXJ0aW5nJyxcbiAgICAgICAgICAnOnRpbWUnOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbic6ICcqJyxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIG1lc3NhZ2U6ICdJbnN0YW5jZSBzdGFydCBpbml0aWF0ZWQnLFxuICAgICAgICAgIHN0YXRlOiAnc3RhcnRpbmcnLFxuICAgICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgR0VUIC9zdGF0dXMve2luc3RhbmNlSWR9IC0gQ2hlY2sgc3RhdHVzXG4gICAgY29uc3Qgc3RhdHVzQ29tbWFuZCA9IG5ldyBEZXNjcmliZUluc3RhbmNlU3RhdHVzQ29tbWFuZCh7XG4gICAgICBJbnN0YW5jZUlkczogW2luc3RhbmNlSWRdLFxuICAgICAgSW5jbHVkZUFsbEluc3RhbmNlczogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHN0YXR1c1Jlc3BvbnNlID0gYXdhaXQgZWMyLnNlbmQoc3RhdHVzQ29tbWFuZCk7XG4gICAgY29uc3QgaW5zdGFuY2VTdGF0dXMgPSBzdGF0dXNSZXNwb25zZS5JbnN0YW5jZVN0YXR1c2VzPy5bMF07XG4gICAgY29uc3Qgc3RhdGUgPSBpbnN0YW5jZVN0YXR1cz8uSW5zdGFuY2VTdGF0ZT8uTmFtZSB8fCAndW5rbm93bic7XG5cbiAgICBjb25zb2xlLmxvZygnSW5zdGFuY2Ugc3RhdGU6Jywgc3RhdGUpO1xuXG4gICAgLy8gSWYgcnVubmluZywgdXBkYXRlIER5bmFtb0RCXG4gICAgaWYgKHN0YXRlID09PSAncnVubmluZycpIHtcbiAgICAgIGF3YWl0IGRkYi5zZW5kKG5ldyBVcGRhdGVDb21tYW5kKHtcbiAgICAgICAgVGFibGVOYW1lOiBUQUJMRV9OQU1FLFxuICAgICAgICBLZXk6IHsgaW5zdGFuY2VJZCB9LFxuICAgICAgICBVcGRhdGVFeHByZXNzaW9uOiAnU0VUIGluc3RhbmNlU3RhdGUgPSA6c3RhdGUsIGxhc3RBY3Rpdml0eVRpbWUgPSA6dGltZScsXG4gICAgICAgIEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgICAnOnN0YXRlJzogJ3J1bm5pbmcnLFxuICAgICAgICAgICc6dGltZSc6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogJyonLFxuICAgICAgICAnQ2FjaGUtQ29udHJvbCc6ICduby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZScsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBzdGF0ZSxcbiAgICAgICAgcmVhZHk6IHN0YXRlID09PSAncnVubmluZycsXG4gICAgICAgIGluc3RhbmNlSWQsXG4gICAgICB9KSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIHN0YXR1cyBjaGVjay9zdGFydDonLCBlcnJvcik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzQ29kZTogNTAwLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogJyonLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZXJyb3I6ICdJbnRlcm5hbCBzZXJ2ZXIgZXJyb3InIH0pLFxuICAgIH07XG4gIH1cbn07XG4iXX0=