UNPKG

aws-cdk

Version:

CDK Toolkit, the command line tool for CDK apps

156 lines 22.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.HotswapMockSdkProvider = exports.stackSummaryOf = exports.addTemplateToCloudFormationLookupMock = exports.setCurrentCfnStackTemplate = exports.pushNestedStackResourceSummaries = exports.pushStackResourceSummaries = exports.cdkStackArtifactOf = exports.setupHotswapNestedStackTests = exports.setupHotswapTests = exports.STACK_ID = void 0; const deployments = require("../../../lib/api/hotswap-deployments"); const cloudformation_1 = require("../../../lib/api/util/cloudformation"); const util_1 = require("../../util"); const mock_sdk_1 = require("../../util/mock-sdk"); const fake_cloudformation_stack_1 = require("../fake-cloudformation-stack"); const STACK_NAME = 'withouterrors'; exports.STACK_ID = 'stackId'; let hotswapMockSdkProvider; let currentCfnStack; const currentCfnStackResources = []; let stackTemplates; let currentNestedCfnStackResources; function setupHotswapTests() { jest.resetAllMocks(); // clear the array currentCfnStackResources.splice(0); hotswapMockSdkProvider = new HotswapMockSdkProvider(); currentCfnStack = new fake_cloudformation_stack_1.FakeCloudformationStack({ stackName: STACK_NAME, stackId: exports.STACK_ID, }); cloudformation_1.CloudFormationStack.lookup = async (_, _stackName) => { return currentCfnStack; }; return hotswapMockSdkProvider; } exports.setupHotswapTests = setupHotswapTests; function setupHotswapNestedStackTests(rootStackName) { jest.resetAllMocks(); currentNestedCfnStackResources = {}; hotswapMockSdkProvider = new HotswapMockSdkProvider(rootStackName); currentCfnStack = new fake_cloudformation_stack_1.FakeCloudformationStack({ stackName: rootStackName, stackId: exports.STACK_ID, }); stackTemplates = {}; cloudformation_1.CloudFormationStack.lookup = async (_, stackName) => { currentCfnStack.template = async () => stackTemplates[stackName]; return currentCfnStack; }; return hotswapMockSdkProvider; } exports.setupHotswapNestedStackTests = setupHotswapNestedStackTests; function cdkStackArtifactOf(testStackArtifact = {}) { return (0, util_1.testStack)({ stackName: STACK_NAME, ...testStackArtifact, }); } exports.cdkStackArtifactOf = cdkStackArtifactOf; function pushStackResourceSummaries(...items) { currentCfnStackResources.push(...items); } exports.pushStackResourceSummaries = pushStackResourceSummaries; function pushNestedStackResourceSummaries(stackName, ...items) { if (!currentNestedCfnStackResources[stackName]) { currentNestedCfnStackResources[stackName] = []; } currentNestedCfnStackResources[stackName].push(...items); } exports.pushNestedStackResourceSummaries = pushNestedStackResourceSummaries; function setCurrentCfnStackTemplate(template) { const templateDeepCopy = JSON.parse(JSON.stringify(template)); // deep copy the template, so our tests can mutate one template instead of creating two currentCfnStack.setTemplate(templateDeepCopy); } exports.setCurrentCfnStackTemplate = setCurrentCfnStackTemplate; function addTemplateToCloudFormationLookupMock(stackArtifact) { const templateDeepCopy = JSON.parse(JSON.stringify(stackArtifact.template)); // deep copy the template, so our tests can mutate one template instead of creating two stackTemplates[stackArtifact.stackName] = templateDeepCopy; } exports.addTemplateToCloudFormationLookupMock = addTemplateToCloudFormationLookupMock; function stackSummaryOf(logicalId, resourceType, physicalResourceId) { return { LogicalResourceId: logicalId, PhysicalResourceId: physicalResourceId, ResourceType: resourceType, ResourceStatus: 'CREATE_COMPLETE', LastUpdatedTimestamp: new Date(), }; } exports.stackSummaryOf = stackSummaryOf; class HotswapMockSdkProvider { constructor(rootStackName) { this.mockSdkProvider = new mock_sdk_1.MockSdkProvider({ realSdk: false }); this.mockSdkProvider.stubCloudFormation({ listStackResources: ({ StackName: stackName }) => { if (rootStackName) { const knownStackNames = Object.keys(currentNestedCfnStackResources); if (stackName !== rootStackName && !knownStackNames.includes(stackName)) { throw new Error(`Expected Stack name in listStackResources() call to be a member of ['${rootStackName}, ${knownStackNames}'], but received: '${stackName}'`); } } else if (stackName !== STACK_NAME) { throw new Error(`Expected Stack name in listStackResources() call to be: '${STACK_NAME}', but received: '${stackName}'`); } return { StackResourceSummaries: rootStackName ? currentNestedCfnStackResources[stackName] : currentCfnStackResources, }; }, }); } setUpdateStateMachineMock(mockUpdateMachineDefinition) { this.mockSdkProvider.stubStepFunctions({ updateStateMachine: mockUpdateMachineDefinition, }); } stubLambda(stubs, serviceStubs, additionalProperties = {}) { this.mockSdkProvider.stubLambda(stubs, { api: { waiters: {}, }, makeRequest() { return { promise: () => Promise.resolve({}), response: {}, addListeners: () => { }, }; }, ...serviceStubs, ...additionalProperties, }); } getLambdaApiWaiters() { return this.mockSdkProvider.sdk.lambda().api.waiters; } setUpdateProjectMock(mockUpdateProject) { this.mockSdkProvider.stubCodeBuild({ updateProject: mockUpdateProject, }); } stubAppSync(stubs) { this.mockSdkProvider.stubAppSync(stubs); } setInvokeLambdaMock(mockInvokeLambda) { this.mockSdkProvider.stubLambda({ invoke: mockInvokeLambda, }); } stubEcs(stubs, additionalProperties = {}) { this.mockSdkProvider.stubEcs(stubs, additionalProperties); } stubGetEndpointSuffix(stub) { this.mockSdkProvider.stubGetEndpointSuffix(stub); } stubS3(stubs) { this.mockSdkProvider.stubS3(stubs); } tryHotswapDeployment(hotswapMode, stackArtifact, assetParams = {}) { return deployments.tryHotswapDeployment(this.mockSdkProvider, assetParams, currentCfnStack, stackArtifact, hotswapMode); } } exports.HotswapMockSdkProvider = HotswapMockSdkProvider; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90c3dhcC10ZXN0LXNldHVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaG90c3dhcC10ZXN0LXNldHVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVFBLG9FQUFvRTtBQUNwRSx5RUFBcUY7QUFDckYscUNBQTBEO0FBQzFELGtEQUEyRTtBQUMzRSw0RUFBdUU7QUFFdkUsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDO0FBQ3RCLFFBQUEsUUFBUSxHQUFHLFNBQVMsQ0FBQztBQUVsQyxJQUFJLHNCQUE4QyxDQUFDO0FBQ25ELElBQUksZUFBd0MsQ0FBQztBQUM3QyxNQUFNLHdCQUF3QixHQUE4QyxFQUFFLENBQUM7QUFDL0UsSUFBSSxjQUE0QyxDQUFDO0FBQ2pELElBQUksOEJBQWtHLENBQUM7QUFFdkcsU0FBZ0IsaUJBQWlCO0lBQy9CLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNyQixrQkFBa0I7SUFDbEIsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLHNCQUFzQixHQUFHLElBQUksc0JBQXNCLEVBQUUsQ0FBQztJQUN0RCxlQUFlLEdBQUcsSUFBSSxtREFBdUIsQ0FBQztRQUM1QyxTQUFTLEVBQUUsVUFBVTtRQUNyQixPQUFPLEVBQUUsZ0JBQVE7S0FDbEIsQ0FBQyxDQUFDO0lBQ0gsb0NBQW1CLENBQUMsTUFBTSxHQUFHLEtBQUssRUFBRSxDQUFxQixFQUFFLFVBQWtCLEVBQUUsRUFBRTtRQUMvRSxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDLENBQUM7SUFFRixPQUFPLHNCQUFzQixDQUFDO0FBQ2hDLENBQUM7QUFkRCw4Q0FjQztBQUVELFNBQWdCLDRCQUE0QixDQUFDLGFBQXFCO0lBQ2hFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNyQiw4QkFBOEIsR0FBRyxFQUFFLENBQUM7SUFDcEMsc0JBQXNCLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNuRSxl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QUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQztZQUNqQyxhQUFhLEVBQUUsaUJBQWlCO1NBQ2pDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxXQUFXLENBQUMsS0FBdUM7UUFDeEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVNLG1CQUFtQixDQUFDLGdCQUFnRjtRQUN6RyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQztZQUM5QixNQUFNLEVBQUUsZ0JBQWdCO1NBQ3pCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxPQUFPLENBQUMsS0FBbUMsRUFBRSx1QkFBK0MsRUFBRTtRQUNuRyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU0scUJBQXFCLENBQUMsSUFBa0I7UUFDN0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRU0sTUFBTSxDQUFDLEtBQWtDO1FBQzlDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSxvQkFBb0IsQ0FDekIsV0FBd0IsRUFDeEIsYUFBZ0QsRUFDaEQsY0FBeUMsRUFBRTtRQUUzQyxPQUFPLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzFILENBQUM7Q0FDRjtBQTNGRCx3REEyRkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvb3JkZXIgKi9cbmltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgKiBhcyBBV1MgZnJvbSAnYXdzLXNkayc7XG5pbXBvcnQgKiBhcyBjb2RlYnVpbGQgZnJvbSAnYXdzLXNkay9jbGllbnRzL2NvZGVidWlsZCc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLXNkay9jbGllbnRzL2xhbWJkYSc7XG5pbXBvcnQgKiBhcyBzdGVwZnVuY3Rpb25zIGZyb20gJ2F3cy1zZGsvY2xpZW50cy9zdGVwZnVuY3Rpb25zJztcbmltcG9ydCB7IERlcGxveVN0YWNrUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vbGliL2FwaSc7XG5pbXBvcnQgeyBIb3Rzd2FwTW9kZSB9IGZyb20gJy4uLy4uLy4uL2xpYi9hcGkvaG90c3dhcC9jb21tb24nO1xuaW1wb3J0ICogYXMgZGVwbG95bWVudHMgZnJvbSAnLi4vLi4vLi4vbGliL2FwaS9ob3Rzd2FwLWRlcGxveW1lbnRzJztcbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uU3RhY2ssIFRlbXBsYXRlIH0gZnJvbSAnLi4vLi4vLi4vbGliL2FwaS91dGlsL2Nsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IHRlc3RTdGFjaywgVGVzdFN0YWNrQXJ0aWZhY3QgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IE1vY2tTZGtQcm92aWRlciwgU3luY0hhbmRsZXJTdWJzZXRPZiB9IGZyb20gJy4uLy4uL3V0aWwvbW9jay1zZGsnO1xuaW1wb3J0IHsgRmFrZUNsb3VkZm9ybWF0aW9uU3RhY2sgfSBmcm9tICcuLi9mYWtlLWNsb3VkZm9ybWF0aW9uLXN0YWNrJztcblxuY29uc3QgU1RBQ0tfTkFNRSA9ICd3aXRob3V0ZXJyb3JzJztcbmV4cG9ydCBjb25zdCBTVEFDS19JRCA9ICdzdGFja0lkJztcblxubGV0IGhvdHN3YXBNb2NrU2RrUHJvdmlkZXI6IEhvdHN3YXBNb2NrU2RrUHJvdmlkZXI7XG5sZXQgY3VycmVudENmblN0YWNrOiBGYWtlQ2xvdWRmb3JtYXRpb25TdGFjaztcbmNvbnN0IGN1cnJlbnRDZm5TdGFja1Jlc291cmNlczogQVdTLkNsb3VkRm9ybWF0aW9uLlN0YWNrUmVzb3VyY2VTdW1tYXJ5W10gPSBbXTtcbmxldCBzdGFja1RlbXBsYXRlczogeyBbc3RhY2tOYW1lOiBzdHJpbmddOiBhbnkgfTtcbmxldCBjdXJyZW50TmVzdGVkQ2ZuU3RhY2tSZXNvdXJjZXM6IHsgW3N0YWNrTmFtZTogc3RyaW5nXTogQVdTLkNsb3VkRm9ybWF0aW9uLlN0YWNrUmVzb3VyY2VTdW1tYXJ5W10gfTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwSG90c3dhcFRlc3RzKCk6IEhvdHN3YXBNb2NrU2RrUHJvdmlkZXIge1xuICBqZXN0LnJlc2V0QWxsTW9ja3MoKTtcbiAgLy8gY2xlYXIgdGhlIGFycmF5XG4gIGN1cnJlbnRDZm5TdGFja1Jlc291cmNlcy5zcGxpY2UoMCk7XG4gIGhvdHN3YXBNb2NrU2RrUHJvdmlkZXIgPSBuZXcgSG90c3dhcE1vY2tTZGtQcm92aWRlcigpO1xuICBjdXJyZW50Q2ZuU3RhY2sgPSBuZXcgRmFrZUNsb3VkZm9ybWF0aW9uU3RhY2soe1xuICAgIHN0YWNrTmFtZTogU1RBQ0tfTkFNRSxcbiAgICBzdGFja0lkOiBTVEFDS19JRCxcbiAgfSk7XG4gIENsb3VkRm9ybWF0aW9uU3RhY2subG9va3VwID0gYXN5bmMgKF86IEFXUy5DbG91ZEZvcm1hdGlvbiwgX3N0YWNrTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIGN1cnJlbnRDZm5TdGFjaztcbiAgfTtcblxuICByZXR1cm4gaG90c3dhcE1vY2tTZGtQcm92aWRlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwSG90c3dhcE5lc3RlZFN0YWNrVGVzdHMocm9vdFN0YWNrTmFtZTogc3RyaW5nKSB7XG4gIGplc3QucmVzZXRBbGxNb2NrcygpO1xuICBjdXJyZW50TmVzdGVkQ2ZuU3RhY2tSZXNvdXJjZXMgPSB7fTtcbiAgaG90c3dhcE1vY2tTZGtQcm92aWRlciA9IG5ldyBIb3Rzd2FwTW9ja1Nka1Byb3ZpZGVyKHJvb3RTdGFja05hbWUpO1xuICBjdXJyZW50Q2ZuU3RhY2sgPSBuZXcgRmFrZUNsb3VkZm9ybWF0aW9uU3RhY2soe1xuICAgIHN0YWNrTmFtZTogcm9vdFN0YWNrTmFtZSxcbiAgICBzdGFja0lkOiBTVEFDS19JRCxcbiAgfSk7XG4gIHN0YWNrVGVtcGxhdGVzID0ge307XG4gIENsb3VkRm9ybWF0aW9uU3RhY2subG9va3VwID0gYXN5bmMgKF86IEFXUy5DbG91ZEZvcm1hdGlvbiwgc3RhY2tOYW1lOiBzdHJpbmcpID0+IHtcbiAgICBjdXJyZW50Q2ZuU3RhY2sudGVtcGxhdGUgPSBhc3luYyAoKSA9PiBzdGFja1RlbXBsYXRlc1tzdGFja05hbWVdO1xuICAgIHJldHVybiBjdXJyZW50Q2ZuU3RhY2s7XG4gIH07XG5cbiAgcmV0dXJuIGhvdHN3YXBNb2NrU2RrUHJvdmlkZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjZGtTdGFja0FydGlmYWN0T2YodGVzdFN0YWNrQXJ0aWZhY3Q6IFBhcnRpYWw8VGVzdFN0YWNrQXJ0aWZhY3Q+ID0ge30pOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Qge1xuICByZXR1cm4gdGVzdFN0YWNrKHtcbiAgICBzdGFja05hbWU6IFNUQUNLX05BTUUsXG4gICAgLi4udGVzdFN0YWNrQXJ0aWZhY3QsXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHVzaFN0YWNrUmVzb3VyY2VTdW1tYXJpZXMoLi4uaXRlbXM6IEFXUy5DbG91ZEZvcm1hdGlvbi5TdGFja1Jlc291cmNlU3VtbWFyeVtdKSB7XG4gIGN1cnJlbnRDZm5TdGFja1Jlc291cmNlcy5wdXNoKC4uLml0ZW1zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHB1c2hOZXN0ZWRTdGFja1Jlc291cmNlU3VtbWFyaWVzKHN0YWNrTmFtZTogc3RyaW5nLCAuLi5pdGVtczogQVdTLkNsb3VkRm9ybWF0aW9uLlN0YWNrUmVzb3VyY2VTdW1tYXJ5W10pIHtcbiAgaWYgKCFjdXJyZW50TmVzdGVkQ2ZuU3RhY2tSZXNvdXJjZXNbc3RhY2tOYW1lXSkge1xuICAgIGN1cnJlbnROZXN0ZWRDZm5TdGFja1Jlc291cmNlc1tzdGFja05hbWVdID0gW107XG4gIH1cbiAgY3VycmVudE5lc3RlZENmblN0YWNrUmVzb3VyY2VzW3N0YWNrTmFtZV0ucHVzaCguLi5pdGVtcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDdXJyZW50Q2ZuU3RhY2tUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGUpIHtcbiAgY29uc3QgdGVtcGxhdGVEZWVwQ29weSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGVtcGxhdGUpKTsgLy8gZGVlcCBjb3B5IHRoZSB0ZW1wbGF0ZSwgc28gb3VyIHRlc3RzIGNhbiBtdXRhdGUgb25lIHRlbXBsYXRlIGluc3RlYWQgb2YgY3JlYXRpbmcgdHdvXG4gIGN1cnJlbnRDZm5TdGFjay5zZXRUZW1wbGF0ZSh0ZW1wbGF0ZURlZXBDb3B5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFRlbXBsYXRlVG9DbG91ZEZvcm1hdGlvbkxvb2t1cE1vY2soc3RhY2tBcnRpZmFjdDogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0KSB7XG4gIGNvbnN0IHRlbXBsYXRlRGVlcENvcHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHN0YWNrQXJ0aWZhY3QudGVtcGxhdGUpKTsgLy8gZGVlcCBjb3B5IHRoZSB0ZW1wbGF0ZSwgc28gb3VyIHRlc3RzIGNhbiBtdXRhdGUgb25lIHRlbXBsYXRlIGluc3RlYWQgb2YgY3JlYXRpbmcgdHdvXG4gIHN0YWNrVGVtcGxhdGVzW3N0YWNrQXJ0aWZhY3Quc3RhY2tOYW1lXSA9IHRlbXBsYXRlRGVlcENvcHk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFja1N1bW1hcnlPZihsb2dpY2FsSWQ6IHN0cmluZywgcmVzb3VyY2VUeXBlOiBzdHJpbmcsIHBoeXNpY2FsUmVzb3VyY2VJZDogc3RyaW5nKTogQVdTLkNsb3VkRm9ybWF0aW9uLlN0YWNrUmVzb3VyY2VTdW1tYXJ5IHtcbiAgcmV0dXJuIHtcbiAgICBMb2dpY2FsUmVzb3VyY2VJZDogbG9naWNhbElkLFxuICAgIFBoeXNpY2FsUmVzb3VyY2VJZDogcGh5c2ljYWxSZXNvdXJjZUlkLFxuICAgIFJlc291cmNlVHlwZTogcmVzb3VyY2VUeXBlLFxuICAgIFJlc291cmNlU3RhdHVzOiAnQ1JFQVRFX0NPTVBMRVRFJyxcbiAgICBMYXN0VXBkYXRlZFRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEhvdHN3YXBNb2NrU2RrUHJvdmlkZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgbW9ja1Nka1Byb3ZpZGVyOiBNb2NrU2RrUHJvdmlkZXI7XG5cbiAgY29uc3RydWN0b3Iocm9vdFN0YWNrTmFtZT86IHN0cmluZykge1xuICAgIHRoaXMubW9ja1Nka1Byb3ZpZGVyID0gbmV3IE1vY2tTZGtQcm92aWRlcih7IHJlYWxTZGs6IGZhbHNlIH0pO1xuXG4gICAgdGhpcy5tb2NrU2RrUHJvdmlkZXIuc3R1YkNsb3VkRm9ybWF0aW9uKHtcbiAgICAgIGxpc3RTdGFja1Jlc291cmNlczogKHsgU3RhY2tOYW1lOiBzdGFja05hbWUgfSkgPT4ge1xuICAgICAgICBpZiAocm9vdFN0YWNrTmFtZSkge1xuICAgICAgICAgIGNvbnN0IGtub3duU3RhY2tOYW1lcyA9IE9iamVjdC5rZXlzKGN1cnJlbnROZXN0ZWRDZm5TdGFja1Jlc291cmNlcyk7XG4gICAgICAgICAgaWYgKHN0YWNrTmFtZSAhPT0gcm9vdFN0YWNrTmFtZSAmJiAha25vd25TdGFja05hbWVzLmluY2x1ZGVzKHN0YWNrTmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgU3RhY2sgbmFtZSBpbiBsaXN0U3RhY2tSZXNvdXJjZXMoKSBjYWxsIHRvIGJlIGEgbWVtYmVyIG9mIFsnJHtyb290U3RhY2tOYW1lfSwgJHtrbm93blN0YWNrTmFtZXN9J10sIGJ1dCByZWNlaXZlZDogJyR7c3RhY2tOYW1lfSdgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhY2tOYW1lICE9PSBTVEFDS19OQU1FKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBTdGFjayBuYW1lIGluIGxpc3RTdGFja1Jlc291cmNlcygpIGNhbGwgdG8gYmU6ICcke1NUQUNLX05BTUV9JywgYnV0IHJlY2VpdmVkOiAnJHtzdGFja05hbWV9J2ApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgU3RhY2tSZXNvdXJjZVN1bW1hcmllczogcm9vdFN0YWNrTmFtZSA/IGN1cnJlbnROZXN0ZWRDZm5TdGFja1Jlc291cmNlc1tzdGFja05hbWVdIDogY3VycmVudENmblN0YWNrUmVzb3VyY2VzLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRVcGRhdGVTdGF0ZU1hY2hpbmVNb2NrKFxuICAgIG1vY2tVcGRhdGVNYWNoaW5lRGVmaW5pdGlvbjogKGlucHV0OiBzdGVwZnVuY3Rpb25zLlVwZGF0ZVN0YXRlTWFjaGluZUlucHV0KSA9PiBzdGVwZnVuY3Rpb25zLlVwZGF0ZVN0YXRlTWFjaGluZU91dHB1dCxcbiAgKSB7XG4gICAgdGhpcy5tb2NrU2RrUHJvdmlkZXIuc3R1YlN0ZXBGdW5jdGlvbnMoe1xuICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lOiBtb2NrVXBkYXRlTWFjaGluZURlZmluaXRpb24sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3R1YkxhbWJkYShcbiAgICBzdHViczogU3luY0hhbmRsZXJTdWJzZXRPZjxBV1MuTGFtYmRhPixcbiAgICBzZXJ2aWNlU3R1YnM/OiBTeW5jSGFuZGxlclN1YnNldE9mPEFXUy5TZXJ2aWNlPixcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9LFxuICApOiB2b2lkIHtcbiAgICB0aGlzLm1vY2tTZGtQcm92aWRlci5zdHViTGFtYmRhKHN0dWJzLCB7XG4gICAgICBhcGk6IHtcbiAgICAgICAgd2FpdGVyczoge30sXG4gICAgICB9LFxuICAgICAgbWFrZVJlcXVlc3QoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcHJvbWlzZTogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHt9KSxcbiAgICAgICAgICByZXNwb25zZToge30sXG4gICAgICAgICAgYWRkTGlzdGVuZXJzOiAoKSA9PiB7fSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICAuLi5zZXJ2aWNlU3R1YnMsXG4gICAgICAuLi5hZGRpdGlvbmFsUHJvcGVydGllcyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMYW1iZGFBcGlXYWl0ZXJzKCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICAgIHJldHVybiAodGhpcy5tb2NrU2RrUHJvdmlkZXIuc2RrLmxhbWJkYSgpIGFzIGFueSkuYXBpLndhaXRlcnM7XG4gIH1cblxuICBwdWJsaWMgc2V0VXBkYXRlUHJvamVjdE1vY2sobW9ja1VwZGF0ZVByb2plY3Q6IChpbnB1dDogY29kZWJ1aWxkLlVwZGF0ZVByb2plY3RJbnB1dCkgPT4gY29kZWJ1aWxkLlVwZGF0ZVByb2plY3RPdXRwdXQpIHtcbiAgICB0aGlzLm1vY2tTZGtQcm92aWRlci5zdHViQ29kZUJ1aWxkKHtcbiAgICAgIHVwZGF0ZVByb2plY3Q6IG1vY2tVcGRhdGVQcm9qZWN0LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0dWJBcHBTeW5jKHN0dWJzOiBTeW5jSGFuZGxlclN1YnNldE9mPEFXUy5BcHBTeW5jPikge1xuICAgIHRoaXMubW9ja1Nka1Byb3ZpZGVyLnN0dWJBcHBTeW5jKHN0dWJzKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRJbnZva2VMYW1iZGFNb2NrKG1vY2tJbnZva2VMYW1iZGE6IChpbnB1dDogbGFtYmRhLkludm9jYXRpb25SZXF1ZXN0KSA9PiBsYW1iZGEuSW52b2NhdGlvblJlc3BvbnNlKSB7XG4gICAgdGhpcy5tb2NrU2RrUHJvdmlkZXIuc3R1YkxhbWJkYSh7XG4gICAgICBpbnZva2U6IG1vY2tJbnZva2VMYW1iZGEsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3R1YkVjcyhzdHViczogU3luY0hhbmRsZXJTdWJzZXRPZjxBV1MuRUNTPiwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fSk6IHZvaWQge1xuICAgIHRoaXMubW9ja1Nka1Byb3ZpZGVyLnN0dWJFY3Moc3R1YnMsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIHB1YmxpYyBzdHViR2V0RW5kcG9pbnRTdWZmaXgoc3R1YjogKCkgPT4gc3RyaW5nKSB7XG4gICAgdGhpcy5tb2NrU2RrUHJvdmlkZXIuc3R1YkdldEVuZHBvaW50U3VmZml4KHN0dWIpO1xuICB9XG5cbiAgcHVibGljIHN0dWJTMyhzdHViczogU3luY0hhbmRsZXJTdWJzZXRPZjxBV1MuUzM+KSB7XG4gICAgdGhpcy5tb2NrU2RrUHJvdmlkZXIuc3R1YlMzKHN0dWJzKTtcbiAgfVxuXG4gIHB1YmxpYyB0cnlIb3Rzd2FwRGVwbG95bWVudChcbiAgICBob3Rzd2FwTW9kZTogSG90c3dhcE1vZGUsXG4gICAgc3RhY2tBcnRpZmFjdDogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LFxuICAgIGFzc2V0UGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge30sXG4gICk6IFByb21pc2U8RGVwbG95U3RhY2tSZXN1bHQgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gZGVwbG95bWVudHMudHJ5SG90c3dhcERlcGxveW1lbnQodGhpcy5tb2NrU2RrUHJvdmlkZXIsIGFzc2V0UGFyYW1zLCBjdXJyZW50Q2ZuU3RhY2ssIHN0YWNrQXJ0aWZhY3QsIGhvdHN3YXBNb2RlKTtcbiAgfVxufVxuIl19