UNPKG

@cdklabs/cdk-ecs-codedeploy

Version:

CDK Constructs for performing ECS Deployments with CodeDeploy

109 lines 18.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DeploymentStatus = void 0; exports.handler = handler; const client_codedeploy_1 = require("@aws-sdk/client-codedeploy"); const logger_1 = require("./logger"); var DeploymentStatus; (function (DeploymentStatus) { DeploymentStatus["CREATED"] = "Created"; DeploymentStatus["QUEUED"] = "Queued"; DeploymentStatus["IN_PROGRESS"] = "InProgress"; DeploymentStatus["BAKING"] = "Baking"; DeploymentStatus["SUCCEEDED"] = "Succeeded"; DeploymentStatus["FAILED"] = "Failed"; DeploymentStatus["STOPPED"] = "Stopped"; DeploymentStatus["READY"] = "Ready"; })(DeploymentStatus || (exports.DeploymentStatus = DeploymentStatus = {})); /** * The lambda function called from CloudFormation for this custom resource. * * @param event * @returns whether the deployment is complete */ async function handler(event) { const logger = new logger_1.Logger(); const codedeployClient = new client_codedeploy_1.CodeDeployClient({}); try { const resp = await codedeployClient.send(new client_codedeploy_1.GetDeploymentCommand({ deploymentId: event.PhysicalResourceId })); let rollbackResp = {}; if (resp.deploymentInfo?.rollbackInfo?.rollbackDeploymentId) { rollbackResp = await codedeployClient.send(new client_codedeploy_1.GetDeploymentCommand({ deploymentId: resp.deploymentInfo?.rollbackInfo?.rollbackDeploymentId })); } logger.appendKeys({ stackEvent: event.RequestType, deploymentId: event.PhysicalResourceId, deploymentStatus: resp.deploymentInfo?.status, rollbackStatus: rollbackResp?.deploymentInfo?.status, }); logger.info('Checking deployment'); // check if deployment id is complete switch (event.RequestType) { case 'Create': case 'Update': switch (resp.deploymentInfo?.status) { case DeploymentStatus.SUCCEEDED: logger.info('Deployment finished successfully', { complete: true }); return { IsComplete: true }; case DeploymentStatus.FAILED: case DeploymentStatus.STOPPED: if (rollbackResp.deploymentInfo?.status) { if (rollbackResp.deploymentInfo?.status == DeploymentStatus.SUCCEEDED || rollbackResp.deploymentInfo?.status == DeploymentStatus.FAILED || rollbackResp.deploymentInfo?.status == DeploymentStatus.STOPPED) { const errInfo = resp.deploymentInfo.errorInformation; const error = new Error(`Deployment ${resp.deploymentInfo.status}: [${errInfo?.code}] ${errInfo?.message}`); logger.error('Deployment failed', { complete: true, error }); throw error; } logger.info('Waiting for final status from a rollback', { complete: false }); return { IsComplete: false }; // waiting for final status from rollback } else { const errInfo = resp.deploymentInfo.errorInformation; const error = new Error(`Deployment ${resp.deploymentInfo.status}: [${errInfo?.code}] ${errInfo?.message}`); logger.error('No rollback to wait for', { complete: true, error }); throw error; } default: logger.info('Waiting for final status from deployment', { complete: false }); return { IsComplete: false }; } case 'Delete': switch (resp.deploymentInfo?.status) { case DeploymentStatus.SUCCEEDED: logger.info('Deployment finished successfully - nothing to delete', { complete: true }); return { IsComplete: true }; case DeploymentStatus.FAILED: case DeploymentStatus.STOPPED: if (rollbackResp.deploymentInfo?.status) { if (rollbackResp.deploymentInfo?.status == DeploymentStatus.SUCCEEDED || rollbackResp.deploymentInfo?.status == DeploymentStatus.FAILED || rollbackResp.deploymentInfo?.status == DeploymentStatus.STOPPED) { logger.info('Rollback in final status', { complete: true }); return { IsComplete: true }; // rollback finished, we're deleted } logger.info('Waiting for final status from a rollback', { complete: false }); return { IsComplete: false }; // waiting for rollback } logger.info('No rollback to wait for', { complete: true }); return { IsComplete: true }; default: logger.info('Waiting for final status from deployment', { complete: false }); return { IsComplete: false }; } default: logger.error('Unknown request type'); throw new Error(`Unknown request type: ${event.RequestType}`); } } catch (e) { logger.error('Unable to determine deployment status', { error: e }); if (event.RequestType === 'Delete') { logger.warn('Ignoring error - nothing to do', { complete: true }); return { IsComplete: true }; } throw e; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtY29tcGxldGUubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vjcy1kZXBsb3ltZW50LXByb3ZpZGVyL2lzLWNvbXBsZXRlLmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE2Q0EsMEJBNEZDO0FBeklELGtFQUF5RztBQUN6RyxxQ0FBa0M7QUFFbEMsSUFBWSxnQkFTWDtBQVRELFdBQVksZ0JBQWdCO0lBQzFCLHVDQUFtQixDQUFBO0lBQ25CLHFDQUFpQixDQUFBO0lBQ2pCLDhDQUEwQixDQUFBO0lBQzFCLHFDQUFpQixDQUFBO0lBQ2pCLDJDQUF1QixDQUFBO0lBQ3ZCLHFDQUFpQixDQUFBO0lBQ2pCLHVDQUFtQixDQUFBO0lBQ25CLG1DQUFlLENBQUE7QUFDakIsQ0FBQyxFQVRXLGdCQUFnQixnQ0FBaEIsZ0JBQWdCLFFBUzNCO0FBMkJEOzs7OztHQUtHO0FBQ0ksS0FBSyxVQUFVLE9BQU8sQ0FBQyxLQUF3QjtJQUNwRCxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQU0sRUFBRSxDQUFDO0lBQzVCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxvQ0FBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsRCxJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLHdDQUFvQixDQUFDLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvRyxJQUFJLFlBQVksR0FBd0IsRUFBRSxDQUFDO1FBQzNDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztZQUM1RCxZQUFZLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSx3Q0FBb0IsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxDQUFD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Q0FBQztZQUNIO2dCQUNFLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztnQkFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDbEUsQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1gsTUFBTSxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLElBQUksS0FBSyxDQUFDLFdBQVcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFFbEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM5QixDQUFDO1FBQ0QsTUFBTSxDQUFDLENBQUM7SUFDVixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvZGVEZXBsb3lDbGllbnQsIEdldERlcGxveW1lbnRDb21tYW5kLCBHZXREZXBsb3ltZW50T3V0cHV0IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNvZGVkZXBsb3knO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuXG5leHBvcnQgZW51bSBEZXBsb3ltZW50U3RhdHVzIHtcbiAgQ1JFQVRFRCA9ICdDcmVhdGVkJyxcbiAgUVVFVUVEID0gJ1F1ZXVlZCcsXG4gIElOX1BST0dSRVNTID0gJ0luUHJvZ3Jlc3MnLFxuICBCQUtJTkcgPSAnQmFraW5nJyxcbiAgU1VDQ0VFREVEID0gJ1N1Y2NlZWRlZCcsXG4gIEZBSUxFRCA9ICdGYWlsZWQnLFxuICBTVE9QUEVEID0gJ1N0b3BwZWQnLFxuICBSRUFEWSA9ICdSZWFkeScsXG59XG5cbi8qKlxuICogVGhlIHJlcXVlc3Qgb2JqZWN0IHRoYXQgdGhlIGN1c3RvbSByZXNvdXJjZSBsYW1iYSBmdW5jdGlvbiByZWNlaXZlcyBmcm9tIENsb3VkRm9ybWF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzQ29tcGxldGVSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIENsb3VkRm9ybWF0aW9uIHJlcXVlc3QgKGUuZy4gJ0NyZWF0ZScsICdVcGRhdGUnLCBvciAnRGVsZXRlJylcbiAgICovXG4gIFJlcXVlc3RUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwaHlzaWNhbCByZXNvdXJjZSBpZC5cbiAgICovXG4gIFBoeXNpY2FsUmVzb3VyY2VJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSByZXNwb25zZSBvYmplY3QgdGhhdCB0aGUgY3VzdG9tIHJlc291cmNlIGxhbWJkYSBmdW5jdGlvbiByZXR1cm5zIHRvIENsb3VkRm9ybWF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzQ29tcGxldGVSZXNwb25zZSB7XG4gIC8qKlxuICAgKiBUcnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBkZXBsb3ltZW50IGlzIGluIGEgZmluYWwgc3RhdGUuXG4gICAqL1xuICBJc0NvbXBsZXRlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBsYW1iZGEgZnVuY3Rpb24gY2FsbGVkIGZyb20gQ2xvdWRGb3JtYXRpb24gZm9yIHRoaXMgY3VzdG9tIHJlc291cmNlLlxuICpcbiAqIEBwYXJhbSBldmVudFxuICogQHJldHVybnMgd2hldGhlciB0aGUgZGVwbG95bWVudCBpcyBjb21wbGV0ZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcihldmVudDogSXNDb21wbGV0ZVJlcXVlc3QpOiBQcm9taXNlPElzQ29tcGxldGVSZXNwb25zZT4ge1xuICBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4gIGNvbnN0IGNvZGVkZXBsb3lDbGllbnQgPSBuZXcgQ29kZURlcGxveUNsaWVudCh7fSk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGNvZGVkZXBsb3lDbGllbnQuc2VuZChuZXcgR2V0RGVwbG95bWVudENvbW1hbmQoeyBkZXBsb3ltZW50SWQ6IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCB9KSk7XG4gICAgbGV0IHJvbGxiYWNrUmVzcDogR2V0RGVwbG95bWVudE91dHB1dCA9IHt9O1xuICAgIGlmIChyZXNwLmRlcGxveW1lbnRJbmZvPy5yb2xsYmFja0luZm8/LnJvbGxiYWNrRGVwbG95bWVudElkKSB7XG4gICAgICByb2xsYmFja1Jlc3AgPSBhd2FpdCBjb2RlZGVwbG95Q2xpZW50LnNlbmQobmV3IEdldERlcGxveW1lbnRDb21tYW5kKHsgZGVwbG95bWVudElkOiByZXNwLmRlcGxveW1lbnRJbmZvPy5yb2xsYmFja0luZm8/LnJvbGxiYWNrRGVwbG95bWVudElkIH0pKTtcbiAgICB9XG4gICAgbG9nZ2VyLmFwcGVuZEtleXMoe1xuICAgICAgc3RhY2tFdmVudDogZXZlbnQuUmVxdWVzdFR5cGUsXG4gICAgICBkZXBsb3ltZW50SWQ6IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCxcbiAgICAgIGRlcGxveW1lbnRTdGF0dXM6IHJlc3AuZGVwbG95bWVudEluZm8/LnN0YXR1cyxcbiAgICAgIHJvbGxiYWNrU3RhdHVzOiByb2xsYmFja1Jlc3A/LmRlcGxveW1lbnRJbmZvPy5zdGF0dXMsXG4gICAgfSk7XG4gICAgbG9nZ2VyLmluZm8oJ0NoZWNraW5nIGRlcGxveW1lbnQnKTtcblxuICAgIC8vIGNoZWNrIGlmIGRlcGxveW1lbnQgaWQgaXMgY29tcGxldGVcbiAgICBzd2l0Y2ggKGV2ZW50LlJlcXVlc3RUeXBlKSB7XG4gICAgICBjYXNlICdDcmVhdGUnOlxuICAgICAgY2FzZSAnVXBkYXRlJzpcbiAgICAgICAgc3dpdGNoIChyZXNwLmRlcGxveW1lbnRJbmZvPy5zdGF0dXMpIHtcbiAgICAgICAgICBjYXNlIERlcGxveW1lbnRTdGF0dXMuU1VDQ0VFREVEOlxuICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0RlcGxveW1lbnQgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5JywgeyBjb21wbGV0ZTogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgSXNDb21wbGV0ZTogdHJ1ZSB9O1xuICAgICAgICAgIGNhc2UgRGVwbG95bWVudFN0YXR1cy5GQUlMRUQ6XG4gICAgICAgICAgY2FzZSBEZXBsb3ltZW50U3RhdHVzLlNUT1BQRUQ6XG4gICAgICAgICAgICBpZiAocm9sbGJhY2tSZXNwLmRlcGxveW1lbnRJbmZvPy5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgaWYgKHJvbGxiYWNrUmVzcC5kZXBsb3ltZW50SW5mbz8uc3RhdHVzID09IERlcGxveW1lbnRTdGF0dXMuU1VDQ0VFREVEIHx8XG4gICAgICAgICAgICAgICAgcm9sbGJhY2tSZXNwLmRlcGxveW1lbnRJbmZvPy5zdGF0dXMgPT0gRGVwbG95bWVudFN0YXR1cy5GQUlMRUQgfHxcbiAgICAgICAgICAgICAgICByb2xsYmFja1Jlc3AuZGVwbG95bWVudEluZm8/LnN0YXR1cyA9PSBEZXBsb3ltZW50U3RhdHVzLlNUT1BQRUQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJJbmZvID0gcmVzcC5kZXBsb3ltZW50SW5mby5lcnJvckluZm9ybWF0aW9uO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBEZXBsb3ltZW50ICR7cmVzcC5kZXBsb3ltZW50SW5mby5zdGF0dXN9OiBbJHtlcnJJbmZvPy5jb2RlfV0gJHtlcnJJbmZvPy5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRGVwbG95bWVudCBmYWlsZWQnLCB7IGNvbXBsZXRlOiB0cnVlLCBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnV2FpdGluZyBmb3IgZmluYWwgc3RhdHVzIGZyb20gYSByb2xsYmFjaycsIHsgY29tcGxldGU6IGZhbHNlIH0pO1xuXG4gICAgICAgICAgICAgIHJldHVybiB7IElzQ29tcGxldGU6IGZhbHNlIH07IC8vIHdhaXRpbmcgZm9yIGZpbmFsIHN0YXR1cyBmcm9tIHJvbGxiYWNrXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBlcnJJbmZvID0gcmVzcC5kZXBsb3ltZW50SW5mby5lcnJvckluZm9ybWF0aW9uO1xuICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgRGVwbG95bWVudCAke3Jlc3AuZGVwbG95bWVudEluZm8uc3RhdHVzfTogWyR7ZXJySW5mbz8uY29kZX1dICR7ZXJySW5mbz8ubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdObyByb2xsYmFjayB0byB3YWl0IGZvcicsIHsgY29tcGxldGU6IHRydWUsIGVycm9yIH0pO1xuICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1dhaXRpbmcgZm9yIGZpbmFsIHN0YXR1cyBmcm9tIGRlcGxveW1lbnQnLCB7IGNvbXBsZXRlOiBmYWxzZSB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgSXNDb21wbGV0ZTogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnRGVsZXRlJzpcbiAgICAgICAgc3dpdGNoIChyZXNwLmRlcGxveW1lbnRJbmZvPy5zdGF0dXMpIHtcbiAgICAgICAgICBjYXNlIERlcGxveW1lbnRTdGF0dXMuU1VDQ0VFREVEOlxuICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0RlcGxveW1lbnQgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5IC0gbm90aGluZyB0byBkZWxldGUnLCB7IGNvbXBsZXRlOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4geyBJc0NvbXBsZXRlOiB0cnVlIH07XG4gICAgICAgICAgY2FzZSBEZXBsb3ltZW50U3RhdHVzLkZBSUxFRDpcbiAgICAgICAgICBjYXNlIERlcGxveW1lbnRTdGF0dXMuU1RPUFBFRDpcbiAgICAgICAgICAgIGlmIChyb2xsYmFja1Jlc3AuZGVwbG95bWVudEluZm8/LnN0YXR1cykge1xuICAgICAgICAgICAgICBpZiAocm9sbGJhY2tSZXNwLmRlcGxveW1lbnRJbmZvPy5zdGF0dXMgPT0gRGVwbG95bWVudFN0YXR1cy5TVUNDRUVERUQgfHxcbiAgICAgICAgICAgICAgICByb2xsYmFja1Jlc3AuZGVwbG95bWVudEluZm8/LnN0YXR1cyA9PSBEZXBsb3ltZW50U3RhdHVzLkZBSUxFRCB8fFxuICAgICAgICAgICAgICAgIHJvbGxiYWNrUmVzcC5kZXBsb3ltZW50SW5mbz8uc3RhdHVzID09IERlcGxveW1lbnRTdGF0dXMuU1RPUFBFRCkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdSb2xsYmFjayBpbiBmaW5hbCBzdGF0dXMnLCB7IGNvbXBsZXRlOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgSXNDb21wbGV0ZTogdHJ1ZSB9OyAvLyByb2xsYmFjayBmaW5pc2hlZCwgd2UncmUgZGVsZXRlZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdXYWl0aW5nIGZvciBmaW5hbCBzdGF0dXMgZnJvbSBhIHJvbGxiYWNrJywgeyBjb21wbGV0ZTogZmFsc2UgfSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHsgSXNDb21wbGV0ZTogZmFsc2UgfTsgLy8gd2FpdGluZyBmb3Igcm9sbGJhY2tcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdObyByb2xsYmFjayB0byB3YWl0IGZvcicsIHsgY29tcGxldGU6IHRydWUgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7IElzQ29tcGxldGU6IHRydWUgfTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1dhaXRpbmcgZm9yIGZpbmFsIHN0YXR1cyBmcm9tIGRlcGxveW1lbnQnLCB7IGNvbXBsZXRlOiBmYWxzZSB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgSXNDb21wbGV0ZTogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdVbmtub3duIHJlcXVlc3QgdHlwZScpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmVxdWVzdCB0eXBlOiAke2V2ZW50LlJlcXVlc3RUeXBlfWApO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5lcnJvcignVW5hYmxlIHRvIGRldGVybWluZSBkZXBsb3ltZW50IHN0YXR1cycsIHsgZXJyb3I6IGUgYXMgRXJyb3IgfSk7XG4gICAgaWYgKGV2ZW50LlJlcXVlc3RUeXBlID09PSAnRGVsZXRlJykge1xuICAgICAgbG9nZ2VyLndhcm4oJ0lnbm9yaW5nIGVycm9yIC0gbm90aGluZyB0byBkbycsIHsgY29tcGxldGU6IHRydWUgfSk7XG5cbiAgICAgIHJldHVybiB7IElzQ29tcGxldGU6IHRydWUgfTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxufSJdfQ==