aws-cdk
Version:
CDK Toolkit, the command line tool for CDK apps
121 lines • 18.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
const checks_1 = require("../../../lib/api/deployments/checks");
const mock_sdk_1 = require("../../util/mock-sdk");
describe('determineAllowCrossAccountAssetPublishing', () => {
it('should return true when hasStagingBucket is false', async () => {
const mockSDK = new mock_sdk_1.MockSdk();
mock_sdk_1.mockCloudFormationClient.on(client_cloudformation_1.DescribeStacksCommand).resolves({
Stacks: [{
StackName: 'foo',
CreationTime: new Date(),
StackStatus: client_cloudformation_1.StackStatus.CREATE_COMPLETE,
Outputs: [{ OutputKey: 'BootstrapVersion', OutputValue: '1' }],
}],
});
const result = await (0, checks_1.determineAllowCrossAccountAssetPublishing)(mockSDK);
expect(result).toBe(true);
});
it.each(['', '-', '*', '---'])('should return true when the bucket output does not look like a real bucket', async (notABucketName) => {
const mockSDK = new mock_sdk_1.MockSdk();
mock_sdk_1.mockCloudFormationClient.on(client_cloudformation_1.DescribeStacksCommand).resolves({
Stacks: [{
StackName: 'foo',
CreationTime: new Date(),
StackStatus: client_cloudformation_1.StackStatus.CREATE_COMPLETE,
Outputs: [
{ OutputKey: 'BootstrapVersion', OutputValue: '1' },
{ OutputKey: 'BucketName', OutputValue: notABucketName },
],
}],
});
const result = await (0, checks_1.determineAllowCrossAccountAssetPublishing)(mockSDK);
expect(result).toBe(true);
});
it('should return true when bootstrap version is >= 21', async () => {
const mockSDK = new mock_sdk_1.MockSdk();
mock_sdk_1.mockCloudFormationClient.on(client_cloudformation_1.DescribeStacksCommand).resolves({
Stacks: [{
StackName: 'foo',
CreationTime: new Date(),
StackStatus: client_cloudformation_1.StackStatus.CREATE_COMPLETE,
Outputs: [
{ OutputKey: 'BootstrapVersion', OutputValue: '21' },
{ OutputKey: 'BucketName', OutputValue: 'some-bucket' },
],
}],
});
const result = await (0, checks_1.determineAllowCrossAccountAssetPublishing)(mockSDK);
expect(result).toBe(true);
});
it('should return true if looking up the bootstrap stack fails', async () => {
const mockSDK = new mock_sdk_1.MockSdk();
mock_sdk_1.mockCloudFormationClient.on(client_cloudformation_1.DescribeStacksCommand).rejects(new Error('Could not read bootstrap stack'));
const result = await (0, checks_1.determineAllowCrossAccountAssetPublishing)(mockSDK);
expect(result).toBe(true);
});
it('should return true if looking up the bootstrap stack fails', async () => {
const mockSDK = new mock_sdk_1.MockSdk();
mock_sdk_1.mockCloudFormationClient.on(client_cloudformation_1.DescribeStacksCommand).rejects(new Error('Could not read bootstrap stack'));
const result = await (0, checks_1.determineAllowCrossAccountAssetPublishing)(mockSDK);
expect(result).toBe(true);
});
it('should return false for other scenarios', async () => {
const mockSDK = new mock_sdk_1.MockSdk();
mock_sdk_1.mockCloudFormationClient.on(client_cloudformation_1.DescribeStacksCommand).resolves({
Stacks: [{
StackName: 'foo',
CreationTime: new Date(),
StackStatus: client_cloudformation_1.StackStatus.CREATE_COMPLETE,
Outputs: [
{ OutputKey: 'BootstrapVersion', OutputValue: '20' },
{ OutputKey: 'BucketName', OutputValue: 'some-bucket' },
],
}],
});
const result = await (0, checks_1.determineAllowCrossAccountAssetPublishing)(mockSDK);
expect(result).toBe(false);
});
});
describe('getBootstrapStackInfo', () => {
it('should return correct BootstrapStackInfo', async () => {
const mockSDK = new mock_sdk_1.MockSdk();
mock_sdk_1.mockCloudFormationClient.on(client_cloudformation_1.DescribeStacksCommand).resolves({
Stacks: [{
StackName: 'foo',
CreationTime: new Date(),
StackStatus: client_cloudformation_1.StackStatus.CREATE_COMPLETE,
Outputs: [
{ OutputKey: 'BootstrapVersion', OutputValue: '21' },
{ OutputKey: 'BucketName', OutputValue: 'some-bucket' },
],
}],
});
const result = await (0, checks_1.getBootstrapStackInfo)(mockSDK, 'CDKToolkit');
expect(result).toEqual({
hasStagingBucket: true,
bootstrapVersion: 21,
});
});
it('should throw error when stack is not found', async () => {
const mockSDK = new mock_sdk_1.MockSdk();
mock_sdk_1.mockCloudFormationClient.on(client_cloudformation_1.DescribeStacksCommand).resolves({
Stacks: [],
});
await expect((0, checks_1.getBootstrapStackInfo)(mockSDK, 'CDKToolkit')).rejects.toThrow('Toolkit stack CDKToolkit not found');
});
it('should throw error when BootstrapVersion output is missing', async () => {
const mockSDK = new mock_sdk_1.MockSdk();
mock_sdk_1.mockCloudFormationClient.on(client_cloudformation_1.DescribeStacksCommand).resolves({
Stacks: [{
StackName: 'foo',
CreationTime: new Date(),
StackStatus: client_cloudformation_1.StackStatus.CREATE_COMPLETE,
Outputs: [],
}],
});
await expect((0, checks_1.getBootstrapStackInfo)(mockSDK, 'CDKToolkit')).rejects.toThrow('Unable to find BootstrapVersion output in the toolkit stack CDKToolkit');
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjaGVja3MudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBFQUFvRjtBQUNwRixnRUFBdUg7QUFDdkgsa0RBQXdFO0FBRXhFLFFBQVEsQ0FBQywyQ0FBMkMsRUFBRSxHQUFHLEVBQUU7SUFDekQsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2pFLE1BQU0sT0FBTyxHQUFHLElBQUksa0JBQU8sRUFBRSxDQUFDO1FBQzlCLG1DQUF3QixDQUFDLEVBQUUsQ0FBQyw2Q0FBcUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUMxRCxNQUFNLEVBQUUsQ0FBQztvQkFDUCxTQUFTLEVBQUUsS0FBSztvQkFDaEIsWUFBWSxFQUFFLElBQUksSUFBSSxFQUFFO29CQUN4QixXQUFXLEVBQUUsbUNBQVcsQ0FBQyxlQUFlO29CQUN4QyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUM7aUJBQy9ELENBQUM7U0FDSCxDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsa0RBQXlDLEVBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLDRFQUE0RSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsRUFBRTtRQUNwSSxNQUFNLE9BQU8sR0FBRyxJQUFJLGtCQUFPLEVBQUUsQ0FBQztRQUM5QixtQ0FBd0IsQ0FBQyxFQUFFLENBQUMsNkNBQXFCLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDMUQsTUFBTSxFQUFFLENBQUM7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LENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzFELE1BQU0sT0FBTyxHQUFHLElBQUksa0JBQU8sRUFBRSxDQUFDO1FBRTlCLG1DQUF3QixDQUFDLEVBQUUsQ0FBQyw2Q0FBcUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUMxRCxNQUFNLEVBQUUsRUFBRTtTQUNYLENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxDQUFDLElBQUEsOEJBQXFCLEVBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQ25ILENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDREQUE0RCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzFFLE1BQU0sT0FBTyxHQUFHLElBQUksa0JBQU8sRUFBRSxDQUFDO1FBRTlCLG1DQUF3QixDQUFDLEVBQUUsQ0FBQyw2Q0FBcUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUMxRCxNQUFNLEVBQUUsQ0FBQztvQkFDUCxTQUFTLEVBQUUsS0FBSztvQkFDaEIsWUFBWSxFQUFFLElBQUksSUFBSSxFQUFFO29CQUN4QixXQUFXLEVBQUUsbUNBQVcsQ0FBQyxlQUFlO29CQUN4QyxPQUFPLEVBQUUsRUFBRTtpQkFDWixDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBRUgsTUFBTSxNQUFNLENBQUMsSUFBQSw4QkFBcUIsRUFBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLHdFQUF3RSxDQUFDLENBQUM7SUFDdkosQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc2NyaWJlU3RhY2tzQ29tbWFuZCwgU3RhY2tTdGF0dXMgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgZGV0ZXJtaW5lQWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmcsIGdldEJvb3RzdHJhcFN0YWNrSW5mbyB9IGZyb20gJy4uLy4uLy4uL2xpYi9hcGkvZGVwbG95bWVudHMvY2hlY2tzJztcbmltcG9ydCB7IG1vY2tDbG91ZEZvcm1hdGlvbkNsaWVudCwgTW9ja1NkayB9IGZyb20gJy4uLy4uL3V0aWwvbW9jay1zZGsnO1xuXG5kZXNjcmliZSgnZGV0ZXJtaW5lQWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmcnLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBoYXNTdGFnaW5nQnVja2V0IGlzIGZhbHNlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1vY2tTREsgPSBuZXcgTW9ja1NkaygpO1xuICAgIG1vY2tDbG91ZEZvcm1hdGlvbkNsaWVudC5vbihEZXNjcmliZVN0YWNrc0NvbW1hbmQpLnJlc29sdmVzKHtcbiAgICAgIFN0YWNrczogW3tcbiAgICAgICAgU3RhY2tOYW1lOiAnZm9vJyxcbiAgICAgICAgQ3JlYXRpb25UaW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICBTdGFja1N0YXR1czogU3RhY2tTdGF0dXMuQ1JFQVRFX0NPTVBMRVRFLFxuICAgICAgICBPdXRwdXRzOiBbeyBPdXRwdXRLZXk6ICdCb290c3RyYXBWZXJzaW9uJywgT3V0cHV0VmFsdWU6ICcxJyB9XSxcbiAgICAgIH1dLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGV0ZXJtaW5lQWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmcobW9ja1NESyk7XG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgfSk7XG5cbiAgaXQuZWFjaChbJycsICctJywgJyonLCAnLS0tJ10pKCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiB0aGUgYnVja2V0IG91dHB1dCBkb2VzIG5vdCBsb29rIGxpa2UgYSByZWFsIGJ1Y2tldCcsIGFzeW5jIChub3RBQnVja2V0TmFtZSkgPT4ge1xuICAgIGNvbnN0IG1vY2tTREsgPSBuZXcgTW9ja1NkaygpO1xuICAgIG1vY2tDbG91ZEZvcm1hdGlvbkNsaWVudC5vbihEZXNjcmliZVN0YWNrc0NvbW1hbmQpLnJlc29sdmVzKHtcbiAgICAgIFN0YWNrczogW3tcbiAgICAgICAgU3RhY2tOYW1lOiAnZm9vJyxcbiAgICAgICAgQ3JlYXRpb25UaW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICBTdGFja1N0YXR1czogU3RhY2tTdGF0dXMuQ1JFQVRFX0NPTVBMRVRFLFxuICAgICAgICBPdXRwdXRzOiBbXG4gICAgICAgICAgeyBPdXRwdXRLZXk6ICdCb290c3RyYXBWZXJzaW9uJywgT3V0cHV0VmFsdWU6ICcxJyB9LFxuICAgICAgICAgIHsgT3V0cHV0S2V5OiAnQnVja2V0TmFtZScsIE91dHB1dFZhbHVlOiBub3RBQnVja2V0TmFtZSB9LFxuICAgICAgICBdLFxuICAgICAgfV0sXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZXRlcm1pbmVBbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZyhtb2NrU0RLKTtcbiAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYm9vdHN0cmFwIHZlcnNpb24gaXMgPj0gMjEnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbW9ja1NESyA9IG5ldyBNb2NrU2RrKCk7XG5cbiAgICBtb2NrQ2xvdWRGb3JtYXRpb25DbGllbnQub24oRGVzY3JpYmVTdGFja3NDb21tYW5kKS5yZXNvbHZlcyh7XG4gICAgICBTdGFja3M6IFt7XG4gICAgICAgIFN0YWNrTmFtZTogJ2ZvbycsXG4gICAgICAgIENyZWF0aW9uVGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgU3RhY2tTdGF0dXM6IFN0YWNrU3RhdHVzLkNSRUFURV9DT01QTEVURSxcbiAgICAgICAgT3V0cHV0czogW1xuICAgICAgICAgIHsgT3V0cHV0S2V5OiAnQm9vdHN0cmFwVmVyc2lvbicsIE91dHB1dFZhbHVlOiAnMjEnIH0sXG4gICAgICAgICAgeyBPdXRwdXRLZXk6ICdCdWNrZXROYW1lJywgT3V0cHV0VmFsdWU6ICdzb21lLWJ1Y2tldCcgfSxcbiAgICAgICAgXSxcbiAgICAgIH1dLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGV0ZXJtaW5lQWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmcobW9ja1NESyk7XG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZSh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBpZiBsb29raW5nIHVwIHRoZSBib290c3RyYXAgc3RhY2sgZmFpbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbW9ja1NESyA9IG5ldyBNb2NrU2RrKCk7XG4gICAgbW9ja0Nsb3VkRm9ybWF0aW9uQ2xpZW50Lm9uKERlc2NyaWJlU3RhY2tzQ29tbWFuZCkucmVqZWN0cyhuZXcgRXJyb3IoJ0NvdWxkIG5vdCByZWFkIGJvb3RzdHJhcCBzdGFjaycpKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRldGVybWluZUFsbG93Q3Jvc3NBY2NvdW50QXNzZXRQdWJsaXNoaW5nKG1vY2tTREspO1xuICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgaWYgbG9va2luZyB1cCB0aGUgYm9vdHN0cmFwIHN0YWNrIGZhaWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1vY2tTREsgPSBuZXcgTW9ja1NkaygpO1xuICAgIG1vY2tDbG91ZEZvcm1hdGlvbkNsaWVudC5vbihEZXNjcmliZVN0YWNrc0NvbW1hbmQpLnJlamVjdHMobmV3IEVycm9yKCdDb3VsZCBub3QgcmVhZCBib290c3RyYXAgc3RhY2snKSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZXRlcm1pbmVBbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZyhtb2NrU0RLKTtcbiAgICBleHBlY3QocmVzdWx0KS50b0JlKHRydWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSBmb3Igb3RoZXIgc2NlbmFyaW9zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1vY2tTREsgPSBuZXcgTW9ja1NkaygpO1xuICAgIG1vY2tDbG91ZEZvcm1hdGlvbkNsaWVudC5vbihEZXNjcmliZVN0YWNrc0NvbW1hbmQpLnJlc29sdmVzKHtcbiAgICAgIFN0YWNrczogW3tcbiAgICAgICAgU3RhY2tOYW1lOiAnZm9vJyxcbiAgICAgICAgQ3JlYXRpb25UaW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICBTdGFja1N0YXR1czogU3RhY2tTdGF0dXMuQ1JFQVRFX0NPTVBMRVRFLFxuICAgICAgICBPdXRwdXRzOiBbXG4gICAgICAgICAgeyBPdXRwdXRLZXk6ICdCb290c3RyYXBWZXJzaW9uJywgT3V0cHV0VmFsdWU6ICcyMCcgfSxcbiAgICAgICAgICB7IE91dHB1dEtleTogJ0J1Y2tldE5hbWUnLCBPdXRwdXRWYWx1ZTogJ3NvbWUtYnVja2V0JyB9LFxuICAgICAgICBdLFxuICAgICAgfV0sXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZXRlcm1pbmVBbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZyhtb2NrU0RLKTtcbiAgICBleHBlY3QocmVzdWx0KS50b0JlKGZhbHNlKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2dldEJvb3RzdHJhcFN0YWNrSW5mbycsICgpID0+IHtcbiAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBCb290c3RyYXBTdGFja0luZm8nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbW9ja1NESyA9IG5ldyBNb2NrU2RrKCk7XG5cbiAgICBtb2NrQ2xvdWRGb3JtYXRpb25DbGllbnQub24oRGVzY3JpYmVTdGFja3NDb21tYW5kKS5yZXNvbHZlcyh7XG4gICAgICBTdGFja3M6IFt7XG4gICAgICAgIFN0YWNrTmFtZTogJ2ZvbycsXG4gICAgICAgIENyZWF0aW9uVGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgU3RhY2tTdGF0dXM6IFN0YWNrU3RhdHVzLkNSRUFURV9DT01QTEVURSxcbiAgICAgICAgT3V0cHV0czogW1xuICAgICAgICAgIHsgT3V0cHV0S2V5OiAnQm9vdHN0cmFwVmVyc2lvbicsIE91dHB1dFZhbHVlOiAnMjEnIH0sXG4gICAgICAgICAgeyBPdXRwdXRLZXk6ICdCdWNrZXROYW1lJywgT3V0cHV0VmFsdWU6ICdzb21lLWJ1Y2tldCcgfSxcbiAgICAgICAgXSxcbiAgICAgIH1dLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0Qm9vdHN0cmFwU3RhY2tJbmZvKG1vY2tTREssICdDREtUb29sa2l0Jyk7XG4gICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICBoYXNTdGFnaW5nQnVja2V0OiB0cnVlLFxuICAgICAgYm9vdHN0cmFwVmVyc2lvbjogMjEsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiBzdGFjayBpcyBub3QgZm91bmQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbW9ja1NESyA9IG5ldyBNb2NrU2RrKCk7XG5cbiAgICBtb2NrQ2xvdWRGb3JtYXRpb25DbGllbnQub24oRGVzY3JpYmVTdGFja3NDb21tYW5kKS5yZXNvbHZlcyh7XG4gICAgICBTdGFja3M6IFtdLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgZXhwZWN0KGdldEJvb3RzdHJhcFN0YWNrSW5mbyhtb2NrU0RLLCAnQ0RLVG9vbGtpdCcpKS5yZWplY3RzLnRvVGhyb3coJ1Rvb2xraXQgc3RhY2sgQ0RLVG9vbGtpdCBub3QgZm91bmQnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIEJvb3RzdHJhcFZlcnNpb24gb3V0cHV0IGlzIG1pc3NpbmcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbW9ja1NESyA9IG5ldyBNb2NrU2RrKCk7XG5cbiAgICBtb2NrQ2xvdWRGb3JtYXRpb25DbGllbnQub24oRGVzY3JpYmVTdGFja3NDb21tYW5kKS5yZXNvbHZlcyh7XG4gICAgICBTdGFja3M6IFt7XG4gICAgICAgIFN0YWNrTmFtZTogJ2ZvbycsXG4gICAgICAgIENyZWF0aW9uVGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgU3RhY2tTdGF0dXM6IFN0YWNrU3RhdHVzLkNSRUFURV9DT01QTEVURSxcbiAgICAgICAgT3V0cHV0czogW10sXG4gICAgICB9XSxcbiAgICB9KTtcblxuICAgIGF3YWl0IGV4cGVjdChnZXRCb290c3RyYXBTdGFja0luZm8obW9ja1NESywgJ0NES1Rvb2xraXQnKSkucmVqZWN0cy50b1Rocm93KCdVbmFibGUgdG8gZmluZCBCb290c3RyYXBWZXJzaW9uIG91dHB1dCBpbiB0aGUgdG9vbGtpdCBzdGFjayBDREtUb29sa2l0Jyk7XG4gIH0pO1xufSk7XG4iXX0=