@inizioevoke/evosynth 2.2.6 → 2.3.1

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.
@@ -7,11 +7,28 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
7
7
  return path;
8
8
  };
9
9
  import { readdir } from 'node:fs/promises';
10
+ import { createInterface } from 'node:readline';
10
11
  import { join, extname } from 'node:path';
11
12
  import { pathToFileURL } from 'node:url';
12
13
  import { register } from 'tsx/esm/api';
13
14
  import { runWebStaticServerlessApp } from './web-static-serverless.js';
15
+ function confirm(question) {
16
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
17
+ return new Promise((resolve) => {
18
+ rl.question(question, (answer) => {
19
+ rl.close();
20
+ resolve(answer.trim().toLowerCase() === 'y' || answer.trim().toLowerCase() === 'yes');
21
+ });
22
+ });
23
+ }
14
24
  export async function evosynth(cmd, env, props) {
25
+ if (cmd === 'destroy') {
26
+ const confirmed = await confirm(`Are you sure you want to destroy the "${env}" environment? (y/N) `);
27
+ if (!confirmed) {
28
+ console.log('Destroy cancelled.');
29
+ process.exit(0);
30
+ }
31
+ }
15
32
  const files = await readdir(process.cwd(), { withFileTypes: true });
16
33
  const configFiles = files
17
34
  .filter((dirent) => {
@@ -78,4 +95,4 @@ export async function evosynth(cmd, env, props) {
78
95
  console.error('evosynth config not found!');
79
96
  }
80
97
  }
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZvc3ludGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2V2b3N5bnRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV2QyxPQUFPLEVBQUUseUJBQXlCLEVBQWdDLE1BQU0sNEJBQTRCLENBQUM7QUFtQnJHLE1BQU0sQ0FBQyxLQUFLLFVBQVUsUUFBUSxDQUFDLEdBQWUsRUFBRSxHQUFXLEVBQUUsS0FBb0I7SUFDL0UsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFFcEUsTUFBTSxXQUFXLEdBQUcsS0FBSztTQUN0QixNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUNqQixJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sdUNBQXVDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRSxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUMsQ0FBQztTQUNELEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQ2QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzNELE9BQU87WUFDTCxJ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QU0sQ0FBQztRQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRkaXIgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGpvaW4sIGV4dG5hbWUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSAndHN4L2VzbS9hcGknO1xuaW1wb3J0IHR5cGUgeyBFdm9zeW50aFRhZ0tleSB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IHJ1bldlYlN0YXRpY1NlcnZlcmxlc3NBcHAsIFdlYlN0YXRpY1NlcnZlcmxlc3NBcHBDb25maWcgfSBmcm9tICcuL3dlYi1zdGF0aWMtc2VydmVybGVzcy5qcyc7XG5cbmV4cG9ydCB7IFdlYlN0YXRpY1NlcnZlcmxlc3NBcHBDb25maWcgfTtcblxuZXhwb3J0IHR5cGUgRW52aXJvbm1lbnRUeXBlID0gJ2RldicgfCAndGVzdCcgfCAnc3RhZ2UnIHwgJ3VhdCcgfCAncHJlcHJvZCcgIHwgJ3Byb2QnIHwgKHN0cmluZyAmIHt9KTtcbmV4cG9ydCB0eXBlIENka0NvbW1hbmQgPSAnZGVwbG95JyB8ICdkZXN0cm95JyB8ICdkaWZmJyB8ICdkcmlmdCcgfCAncm9sbGJhY2snIHwgJ3N5bnRoJzsgLy8gJ2Jvb3RzdHJhcCcgfCBcbmV4cG9ydCB0eXBlIEV2b3N5bnRoQXBwVHlwZSA9ICdzdHI4ci1jbG0nIHwgJ3dlYi1zdGF0aWMtc2VydmVybGVzcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZvc3ludGhBcHBDb25maWcge1xuICB0eXBlOiBFdm9zeW50aEFwcFR5cGU7XG4gIGVudlR5cGU/OiBFbnZpcm9ubWVudFR5cGU7XG4gIG5hbWU6IHN0cmluZztcbiAgcmVnaW9uOiAndXMtZWFzdC0xJyB8ICd1cy1lYXN0LTInIHwgJ3VzLXdlc3QtMScgfCAndXMtd2VzdC0yJyB8IChzdHJpbmcgJiB7fSk7XG4gIHRhZ3M/OiBSZWNvcmQ8RXZvc3ludGhUYWdLZXksIHN0cmluZz4sXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZvc3ludGhQcm9wcyB7XG4gIHByb2ZpbGU/OiBzdHJpbmc7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXZvc3ludGgoY21kOiBDZGtDb21tYW5kLCBlbnY6IHN0cmluZywgcHJvcHM6IEV2b3N5bnRoUHJvcHMpIHtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyKHByb2Nlc3MuY3dkKCksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuICBjb25zdCBjb25maWdGaWxlcyA9IGZpbGVzXG4gICAgLmZpbHRlcigoZGlyZW50KSA9PiB7XG4gICAgICBpZiAoZGlyZW50LmlzRmlsZSgpKSB7XG4gICAgICAgIHJldHVybiAvXlxcLmV2b3N5bnRoKC4qPylcXC4oPzpqc3xtanN8dHN8bXRzKSQvaS50ZXN0KGRpcmVudC5uYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KVxuICAgIC5tYXAoKGRpcmVudCkgPT4ge1xuICAgICAgY29uc3QgcGFydHMgPSBkaXJlbnQubmFtZS5zcGxpdCgnLicpLmZpbHRlcihwID0+IHAgIT09ICcnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGRpcmVudC5uYW1lLFxuICAgICAgICBlbnY6IHBhcnRzLmxlbmd0aCA+IDIgPyBwYXJ0c1sxXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZGlyOiBkaXJlbnQucGFyZW50UGF0aFxuICAgICAgfVxuICAgIH0pO1xuICBcbiAgbGV0IGNvbmZpZ0luZGV4ID0gY29uZmlnRmlsZXMuZmluZEluZGV4KGMgPT4gYy5lbnYgJiYgZW52ICYmIGMuZW52LnRvTG93ZXJDYXNlKCkgPT09IGVudi50b0xvd2VyQ2FzZSgpKTtcbiAgaWYgKGNvbmZpZ0luZGV4ID09PSAtMSkge1xuICAgIGNvbmZpZ0luZGV4ID0gY29uZmlnRmlsZXMuZmluZEluZGV4KGMgPT4gYy5lbnYgPT09IHVuZGVmaW5lZCk7XG4gIH1cbiAgaWYgKGNvbmZpZ0luZGV4ICE9IC0xKSB7XG4gICAgY29uc3QgY29uZmlnRmlsZSA9IGNvbmZpZ0ZpbGVzW2NvbmZpZ0luZGV4XTtcbiAgICBjb25zdCB0c3hVbnJlZ2lzdGVyID0gL15cXC5tP3RzJC8udGVzdChleHRuYW1lKGNvbmZpZ0ZpbGUubmFtZSkpID8gcmVnaXN0ZXIoKSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgbW9kdWxlOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIG1vZHVsZSA9IGF3YWl0IGltcG9ydChwYXRoVG9GaWxlVVJMKGpvaW4oY29uZmlnRmlsZS5kaXIsIGNvbmZpZ0ZpbGUubmFtZSkpLnRvU3RyaW5nKCkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGxvYWQgY29uZmlnIFwiJHtjb25maWdGaWxlLm5hbWV9XCI6YCwgKGVyciBhcyBFcnJvcikubWVzc2FnZSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRzeFVucmVnaXN0ZXI/LigpO1xuICAgIH1cbiAgICBsZXQgY29uZmlnOiBFdm9zeW50aEFwcENvbmZpZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoY29uZmlnRmlsZS5lbnYpIHtcbiAgICAgIGNvbmZpZyA9IGF3YWl0IG1vZHVsZS5kZWZhdWx0Py4oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnID0gYXdhaXQgbW9kdWxlW2Vudi50b0xvd2VyQ2FzZSgpXT8uKCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgaWYgKHByb3BzLnByb2ZpbGUpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuQVdTX1BST0ZJTEUgPSBwcm9wcy5wcm9maWxlO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChjb25maWcudHlwZSkge1xuICAgICAgICBjYXNlICd3ZWItc3RhdGljLXNlcnZlcmxlc3MnOlxuICAgICAgICAgIGF3YWl0IHJ1bldlYlN0YXRpY1NlcnZlcmxlc3NBcHAoY21kLCBjb25maWcgYXMgV2ViU3RhdGljU2VydmVybGVzc0FwcENvbmZpZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgVW5zdXBwb3J0ZWQgZXZvc3ludGggYXBwIHR5cGU6IFwiJHtjb25maWcudHlwZX1cImApO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihgQ29uZmlnIGVudmlyb25tZW50IFwiJHtlbnZ9XCIgbm90IGZvdW5kYCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIFxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2V2b3N5bnRoIGNvbmZpZyBub3QgZm91bmQhJyk7XG4gIH1cbn0iXX0=
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZvc3ludGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2V2b3N5bnRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXZDLE9BQU8sRUFBRSx5QkFBeUIsRUFBZ0MsTUFBTSw0QkFBNEIsQ0FBQztBQW1CckcsU0FBUyxPQUFPLENBQUMsUUFBZ0I7SUFDL0IsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzdFLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUM3QixFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQy9CLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLLENBQUMsQ0FBQztRQUN4RixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsUUFBUSxDQUFDLEdBQWUsRUFBRSxHQUFXLEVBQUUsS0FBb0I7SUFDL0UsSUFBSSxHQUFHLEtB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U0FBUyxDQUFDO1FBQ3RELElBQUksVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ25CLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQ3BDLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMvQyxDQUFDO1FBRUQsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQzFDLENBQUM7WUFDRCxRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDcEIsS0FBSyx1QkFBdUI7b0JBQzFCLE1BQU0seUJBQXlCLENBQUMsR0FBRyxFQUFFLE1BQXNDLENBQUMsQ0FBQztvQkFDN0UsTUFBTTtnQkFDUjtvQkFDRSxPQUFPLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztvQkFDakUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDaEIsTUFBTTtZQUNWLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEdBQUcsYUFBYSxDQUFDLENBQUM7WUFDdkQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDO0lBRUgsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLENBQUMsS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDOUMsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkZGlyIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBjcmVhdGVJbnRlcmZhY2UgfSBmcm9tICdub2RlOnJlYWRsaW5lJztcbmltcG9ydCB7IGpvaW4sIGV4dG5hbWUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSAndHN4L2VzbS9hcGknO1xuaW1wb3J0IHR5cGUgeyBFdm9zeW50aFRhZ0tleSB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IHJ1bldlYlN0YXRpY1NlcnZlcmxlc3NBcHAsIFdlYlN0YXRpY1NlcnZlcmxlc3NBcHBDb25maWcgfSBmcm9tICcuL3dlYi1zdGF0aWMtc2VydmVybGVzcy5qcyc7XG5cbmV4cG9ydCB7IFdlYlN0YXRpY1NlcnZlcmxlc3NBcHBDb25maWcgfTtcblxuZXhwb3J0IHR5cGUgRW52aXJvbm1lbnRUeXBlID0gJ2RldicgfCAndGVzdCcgfCAnc3RhZ2UnIHwgJ3VhdCcgfCAncHJlcHJvZCcgIHwgJ3Byb2QnIHwgKHN0cmluZyAmIHt9KTtcbmV4cG9ydCB0eXBlIENka0NvbW1hbmQgPSAnZGVwbG95JyB8ICdkZXN0cm95JyB8ICdkaWZmJyB8ICdkcmlmdCcgfCAncm9sbGJhY2snIHwgJ3N5bnRoJzsgLy8gJ2Jvb3RzdHJhcCcgfCBcbmV4cG9ydCB0eXBlIEV2b3N5bnRoQXBwVHlwZSA9ICdzdHI4ci1jbG0nIHwgJ3dlYi1zdGF0aWMtc2VydmVybGVzcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZvc3ludGhBcHBDb25maWcge1xuICB0eXBlOiBFdm9zeW50aEFwcFR5cGU7XG4gIGVudlR5cGU/OiBFbnZpcm9ubWVudFR5cGU7XG4gIG5hbWU6IHN0cmluZztcbiAgcmVnaW9uOiAndXMtZWFzdC0xJyB8ICd1cy1lYXN0LTInIHwgJ3VzLXdlc3QtMScgfCAndXMtd2VzdC0yJyB8IChzdHJpbmcgJiB7fSk7XG4gIHRhZ3M/OiBSZWNvcmQ8RXZvc3ludGhUYWdLZXksIHN0cmluZz4sXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZvc3ludGhQcm9wcyB7XG4gIHByb2ZpbGU/OiBzdHJpbmc7XG59XG5mdW5jdGlvbiBjb25maXJtKHF1ZXN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgcmwgPSBjcmVhdGVJbnRlcmZhY2UoeyBpbnB1dDogcHJvY2Vzcy5zdGRpbiwgb3V0cHV0OiBwcm9jZXNzLnN0ZG91dCB9KTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcmwucXVlc3Rpb24ocXVlc3Rpb24sIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKCk7XG4gICAgICByZXNvbHZlKGFuc3dlci50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gJ3knIHx8IGFuc3dlci50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gJ3llcycpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV2b3N5bnRoKGNtZDogQ2RrQ29tbWFuZCwgZW52OiBzdHJpbmcsIHByb3BzOiBFdm9zeW50aFByb3BzKSB7XG4gIGlmIChjbWQgPT09ICdkZXN0cm95Jykge1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IGNvbmZpcm0oYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZXN0cm95IHRoZSBcIiR7ZW52fVwiIGVudmlyb25tZW50PyAoeS9OKSBgKTtcbiAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgY29uc29sZS5sb2coJ0Rlc3Ryb3kgY2FuY2VsbGVkLicpO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cbiAgfVxuICBjb25zdCBmaWxlcyA9IGF3YWl0IHJlYWRkaXIocHJvY2Vzcy5jd2QoKSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGNvbmZpZ0ZpbGVzID0gZmlsZXNcbiAgICAuZmlsdGVyKChkaXJlbnQpID0+IHtcbiAgICAgIGlmIChkaXJlbnQuaXNGaWxlKCkpIHtcbiAgICAgICAgcmV0dXJuIC9eXFwuZXZvc3ludGgoLio/KVxcLig/OmpzfG1qc3x0c3xtdHMpJC9pLnRlc3QoZGlyZW50Lm5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pXG4gICAgLm1hcCgoZGlyZW50KSA9PiB7XG4gICAgICBjb25zdCBwYXJ0cyA9IGRpcmVudC5uYW1lLnNwbGl0KCcuJykuZmlsdGVyKHAgPT4gcCAhPT0gJycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZGlyZW50Lm5hbWUsXG4gICAgICAgIGVudjogcGFydHMubGVuZ3RoID4gMiA/IHBhcnRzWzFdIDogdW5kZWZpbmVkLFxuICAgICAgICBkaXI6IGRpcmVudC5wYXJlbnRQYXRoXG4gICAgICB9XG4gICAgfSk7XG4gIFxuICBsZXQgY29uZmlnSW5kZXggPSBjb25maWdGaWxlcy5maW5kSW5kZXgoYyA9PiBjLmVudiAmJiBlbnYgJiYgYy5lbnYudG9Mb3dlckNhc2UoKSA9PT0gZW52LnRvTG93ZXJDYXNlKCkpO1xuICBpZiAoY29uZmlnSW5kZXggPT09IC0xKSB7XG4gICAgY29uZmlnSW5kZXggPSBjb25maWdGaWxlcy5maW5kSW5kZXgoYyA9PiBjLmVudiA9PT0gdW5kZWZpbmVkKTtcbiAgfVxuICBpZiAoY29uZmlnSW5kZXggIT0gLTEpIHtcbiAgICBjb25zdCBjb25maWdGaWxlID0gY29uZmlnRmlsZXNbY29uZmlnSW5kZXhdO1xuICAgIGNvbnN0IHRzeFVucmVnaXN0ZXIgPSAvXlxcLm0/dHMkLy50ZXN0KGV4dG5hbWUoY29uZmlnRmlsZS5uYW1lKSkgPyByZWdpc3RlcigpIDogdW5kZWZpbmVkO1xuICAgIGxldCBtb2R1bGU6IGFueTtcbiAgICB0cnkge1xuICAgICAgbW9kdWxlID0gYXdhaXQgaW1wb3J0KHBhdGhUb0ZpbGVVUkwoam9pbihjb25maWdGaWxlLmRpciwgY29uZmlnRmlsZS5uYW1lKSkudG9TdHJpbmcoKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBjb25maWcgXCIke2NvbmZpZ0ZpbGUubmFtZX1cIjpgLCAoZXJyIGFzIEVycm9yKS5tZXNzYWdlKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHN4VW5yZWdpc3Rlcj8uKCk7XG4gICAgfVxuICAgIGxldCBjb25maWc6IEV2b3N5bnRoQXBwQ29uZmlnIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmIChjb25maWdGaWxlLmVudikge1xuICAgICAgY29uZmlnID0gYXdhaXQgbW9kdWxlLmRlZmF1bHQ/LigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcgPSBhd2FpdCBtb2R1bGVbZW52LnRvTG93ZXJDYXNlKCldPy4oKTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICBpZiAocHJvcHMucHJvZmlsZSkge1xuICAgICAgICBwcm9jZXNzLmVudi5BV1NfUFJPRklMRSA9IHByb3BzLnByb2ZpbGU7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGNvbmZpZy50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3dlYi1zdGF0aWMtc2VydmVybGVzcyc6XG4gICAgICAgICAgYXdhaXQgcnVuV2ViU3RhdGljU2VydmVybGVzc0FwcChjbWQsIGNvbmZpZyBhcyBXZWJTdGF0aWNTZXJ2ZXJsZXNzQXBwQ29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBVbnN1cHBvcnRlZCBldm9zeW50aCBhcHAgdHlwZTogXCIke2NvbmZpZy50eXBlfVwiYCk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBDb25maWcgZW52aXJvbm1lbnQgXCIke2Vudn1cIiBub3QgZm91bmRgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcignZXZvc3ludGggY29uZmlnIG5vdCBmb3VuZCEnKTtcbiAgfVxufSJdfQ==
@@ -3,7 +3,7 @@ import { IBuildImage } from 'aws-cdk-lib/aws-codebuild';
3
3
  import { CloudFrontErrorResponse, CloudFrontFunctionRedirects } from '../constructs/cloudfront.js';
4
4
  import { CodeBuildImageId, EcrBuildImage, CodeBuildSsmParameter, CodeBuildComputeType, CodeBuildNodeJs, EnvironmentVariables } from '../constructs/codebuild.ts';
5
5
  import type { EvosynthAppConfig, CdkCommand, EvosynthAppType } from './evosynth.ts';
6
- import type { CloudFrontFunctionEventType, CspHeaders, UUID, AWSManagedResponseHeadersPolicy } from '../types.d.ts';
6
+ import type { CloudFrontFunctionEventType, CspHeaders, CspSourceHeaders, UUID, AWSManagedResponseHeadersPolicy } from '../types.d.ts';
7
7
  import type { DeepPartial } from '../types.d.ts';
8
8
  export interface AppConfigDnsProps {
9
9
  record: string;
@@ -22,7 +22,7 @@ export interface AppConfigCloudFrontProps {
22
22
  responseHeaders?: AWSManagedResponseHeadersPolicy | UUID | false;
23
23
  responseHeadersParam?: string;
24
24
  responseHeadersPolicy?: ResponseHeadersPolicyProps;
25
- cspHeaders?: CspHeaders | string;
25
+ cspHeaders?: CspHeaders | CspSourceHeaders | string;
26
26
  redirects?: CloudFrontFunctionRedirects;
27
27
  function?: string | {
28
28
  code: string;
@@ -89,4 +89,4 @@ export async function runWebStaticServerlessApp(cmd, config) {
89
89
  break;
90
90
  }
91
91
  }
92
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLXN0YXRpYy1zZXJ2ZXJsZXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS93ZWItc3RhdGljLXNlcnZlcmxlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEtBQUssSUFBSSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQU8vQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSx3QkFBd0IsRUFBaUMsTUFBTSwwQ0FBMEMsQ0FBQztBQTREbkgsTUFBTSxVQUFVLFlBQVksQ0FBSSxHQUFHLE9BQXlCO0lBQzFELFNBQVMsU0FBUyxDQUFJLE1BQVMsRUFBRSxNQUFzQjtRQUNyRCxNQUFNLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUE2QixDQUFDO1FBQ3hELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFnQixDQUE0QixFQUFFLENBQUM7WUFDM0UsTUFBTSxNQUFNLEdBQUksTUFBa0MsQ0FBQyxHQUFhLENBQUMsQ0FBQztZQUNsRSxNQUFNLE1BQU0sR0FBSSxNQUFrQyxDQUFDLEdBQWEsQ0FBQyxDQUFDO1lBQ2xFLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQzttQkFDcEUsTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQy9FLE1BQU0sQ0FBQyxHQUFhLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLE1BQW9DLENBQUMsQ0FBQztZQUNsRixDQUFDO2lC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Z0JBQWdCLEdBQUc7b0JBQ3JDLFVBQVUsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVO29CQUM1QyxZQUFZLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsWUFBWTtvQkFDaEQsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCO29CQUN4RCxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUztvQkFDMUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVc7b0JBQzlDLGFBQWEsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxhQUFhO29CQUNsRCxhQUFhLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsYUFBYTtpQkFDbkQsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSx3QkFBd0IsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUUzRCxPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNyQixDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDWixvQkFBb0I7UUFDcEIsd0hBQXdIO1FBQ3hILFdBQVc7UUFDWCxLQUFLLFFBQVEsQ0FBQztRQUNkLEtBQUssU0FBUyxDQUFDO1FBQ2YsS0FBSyxNQUFNLENBQUM7UUFDWixLQUFLLE9BQU8sQ0FBQztRQUNiLEtBQUssVUFBVSxDQUFDO1FBQ2hCLEtBQUssT0FBTztZQUNWLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25CLE1BQU07SUFDVixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0ICogYXMgY29yZSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IFRvb2xraXQgfSBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgeyBSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZGZyb250JztcbmltcG9ydCB7IElCdWlsZEltYWdlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVidWlsZCc7XG5pbXBvcnQgeyBDbG91ZEZyb250RXJyb3JSZXNwb25zZSwgQ2xvdWRGcm9udEZ1bmN0aW9uUmVkaXJlY3RzIH0gZnJvbSAnLi4vY29uc3RydWN0cy9jbG91ZGZyb250LmpzJztcbmltcG9ydCB7IENvZGVCdWlsZEltYWdlSWQsIEVjckJ1aWxkSW1hZ2UsIENvZGVCdWlsZFNzbVBhcmFtZXRlciwgQ29kZUJ1aWxkQ29tcHV0ZVR5cGUsIENvZGVCdWlsZE5vZGVKcywgRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICcuLi9jb25zdHJ1Y3RzL2NvZGVidWlsZC50cyc7XG5pbXBvcnQgdHlwZSB7IEV2b3N5bnRoQXBwQ29uZmlnLCBDZGtDb21tYW5kLCBFdm9zeW50aEFwcFR5cGUgfSBmcm9tICcuL2V2b3N5bnRoLnRzJztcbmltcG9ydCB0eXBlIHsgQ2xvdWRGcm9udEZ1bmN0aW9uRXZlbnRUeXBlLCBDc3BIZWFkZXJzLCBVVUlELCBBV1NNYW5hZ2VkUmVzcG9uc2VIZWFkZXJzUG9saWN5IH0gZnJvbSAnLi4vdHlwZXMuZC50cyc7XG5pbXBvcnQgeyBnZXRFbnYgfSBmcm9tICcuLi9pbmRleC5qcyc7XG5pbXBvcnQgeyBXZWJTdGF0aWNTZXJ2ZXJsZXNzU3RhZ2UsIFdlYlN0YXRpY1NlcnZlcmxlc3NTdGFnZVByb3BzIH0gZnJvbSAnLi4vc3RhZ2VzL3dlYi1zdGF0aWMtc2VydmVybGVzcy1zdGFnZS5qcyc7XG5pbXBvcnQgdHlwZSB7IERlZXBQYXJ0aWFsIH0gZnJvbSAnLi4vdHlwZXMuZC50cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwQ29uZmlnRG5zUHJvcHMge1xuICByZWNvcmQ6IHN0cmluZztcbiAgem9uZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcENvbmZpZ1NlY3VyaXR5UHJvcHMge1xuICBiYXNpY0F1dGg/OiBzdHJpbmc7XG4gIGJhc2ljQXV0aFBhcmFtPzogc3RyaW5nO1xuICB3ZWJBY2w/OiBzdHJpbmcgfCBib29sZWFuO1xuICB3ZWJBY2xQYXJhbT86IHN0cmluZyB8IHsgcGF0aDogc3RyaW5nLCB2ZXJzaW9uPzogbnVtYmVyIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwQ29uZmlnQ2xvdWRGcm9udFByb3BzIHtcbiAgcmVzcG9uc2VIZWFkZXJzPzogQVdTTWFuYWdlZFJlc3BvbnNlSGVhZGVyc1BvbGljeSB8IFVVSUQgfCBmYWxzZTtcbiAgcmVzcG9uc2VIZWFkZXJzUGFyYW0/OiBzdHJpbmc7XG4gIHJlc3BvbnNlSGVhZGVyc1BvbGljeT86IFJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzO1xuICBjc3BIZWFkZXJzPzogQ3NwSGVhZGVycyB8IHN0cmluZztcbiAgcmVkaXJlY3RzPzogQ2xvdWRGcm9udEZ1bmN0aW9uUmVkaXJlY3RzO1xuICBmdW5jdGlvbj86IHN0cmluZyB8IHtcbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgZXZlbnRUeXBlOiBDbG91ZEZyb250RnVuY3Rpb25FdmVudFR5cGVbXTtcbiAgfSxcbiAgZXJyb3JSZXNwb25zZXM/OiBDbG91ZEZyb250RXJyb3JSZXNwb25zZVtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwQ29uZmlnUGlwZWxpbmVTb3VyY2VQcm9wcyB7XG4gIGNvZGVzdGFyQ29ubmVjdGlvbj86IHN0cmluZztcbiAgY29kZXN0YXJDb25uZWN0aW9uUGFyYW0/OiBzdHJpbmc7XG4gIG93bmVyOiAnZXZva2Vncm91cCcgfCAnbWVsdG1lZGlhJyB8IChzdHJpbmcgJiB7fSk7XG4gIHJlcG86IHN0cmluZztcbiAgYnJhbmNoOiBzdHJpbmc7XG4gIGZ1bGxDbG9uZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwQ29uZmlnUGlwZWxpbmVCdWlsZFByb3BzIHtcbiAgYnVpbGRTcGVjPzogc3RyaW5nIHwgb2JqZWN0O1xuICBidWlsZEltYWdlPzogSUJ1aWxkSW1hZ2U7XG4gIGJ1aWxkSW1hZ2VFY3I/OiBFY3JCdWlsZEltYWdlO1xuICBidWlsZEltYWdlTm9kZUpTPzogQ29kZUJ1aWxkTm9kZUpzO1xuICBidWlsZEltYWdlSWQ/OiBDb2RlQnVpbGRJbWFnZUlkO1xuICBjb21wdXRlVHlwZT86IENvZGVCdWlsZENvbXB1dGVUeXBlO1xuICBlbnZpcm9ubWVudFZhcmlhYmxlcz86IEVudmlyb25tZW50VmFyaWFibGVzO1xuICBzc21QYXJhbWV0ZXJzPzogQ29kZUJ1aWxkU3NtUGFyYW1ldGVyW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJTdGF0aWNTZXJ2ZXJsZXNzQXBwQ29uZmlnIGV4dGVuZHMgRXZvc3ludGhBcHBDb25maWcge1xuICB0eXBlOiBFeHRyYWN0PEV2b3N5bnRoQXBwVHlwZSwgJ3dlYi1zdGF0aWMtc2VydmVybGVzcyc+LFxuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBkbnM6IEFwcENvbmZpZ0Ruc1Byb3BzLFxuICBzZWN1cml0eT86IEFwcENvbmZpZ1NlY3VyaXR5UHJvcHMsXG4gIGNsb3VkZnJvbnQ/OiBBcHBDb25maWdDbG91ZEZyb250UHJvcHMsXG4gIHBpcGVsaW5lPzoge1xuICAgIHNvdXJjZTogQXBwQ29uZmlnUGlwZWxpbmVTb3VyY2VQcm9wcyxcbiAgICBidWlsZD86IEFwcENvbmZpZ1BpcGVsaW5lQnVpbGRQcm9wc1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNvbmZpZ3M8VD4oLi4uY29uZmlnczogRGVlcFBhcnRpYWw8VD5bXSk6IFQge1xuICBmdW5jdGlvbiBkZWVwTWVyZ2U8VT4odGFyZ2V0OiBVLCBzb3VyY2U6IERlZXBQYXJ0aWFsPFU+KTogVSB7XG4gICAgY29uc3QgcmVzdWx0ID0geyAuLi50YXJnZXQgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzb3VyY2UgYXMgb2JqZWN0KSBhcyAoa2V5b2YgdHlwZW9mIHNvdXJjZSlbXSkge1xuICAgICAgY29uc3Qgc3JjVmFsID0gKHNvdXJjZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5IGFzIHN0cmluZ107XG4gICAgICBjb25zdCB0Z3RWYWwgPSAodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXkgYXMgc3RyaW5nXTtcbiAgICAgIGlmIChzcmNWYWwgIT09IG51bGwgJiYgdHlwZW9mIHNyY1ZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoc3JjVmFsKVxuICAgICAgICAgICYmIHRndFZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdGd0VmFsID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh0Z3RWYWwpKSB7XG4gICAgICAgIHJlc3VsdFtrZXkgYXMgc3RyaW5nXSA9IGRlZXBNZXJnZSh0Z3RWYWwsIHNyY1ZhbCBhcyBEZWVwUGFydGlhbDx0eXBlb2YgdGd0VmFsPik7XG4gICAgICB9IGVsc2UgaWYgKHNyY1ZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc3VsdFtrZXkgYXMgc3RyaW5nXSA9IHNyY1ZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdCBhcyBVO1xuICB9XG5cbiAgcmV0dXJuIGNvbmZpZ3MucmVkdWNlPFQ+KFxuICAgIChhY2MsIGNvbmZpZykgPT4gZGVlcE1lcmdlKGFjYywgY29uZmlnKSxcbiAgICB7fSBhcyBUXG4gICkgYXMgVDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldlYlN0YXRpY1NlcnZlcmxlc3NBcHAoY21kOiBDZGtDb21tYW5kLCBjb25maWc6IFdlYlN0YXRpY1NlcnZlcmxlc3NBcHBDb25maWcpIHtcbiAgY29uc3QgY2RrID0gbmV3IFRvb2xraXQoKTtcbiAgY29uc3QgY3ggPSBhd2FpdCBjZGsuZnJvbUFzc2VtYmx5QnVpbGRlcihhc3luYyAocHJvcHMpID0+IHtcbiAgICBjb25zdCBhcHAgPSBuZXcgY29yZS5BcHAoe1xuICAgICAgb3V0ZGlyOiBqb2luKHByb2Nlc3MuY3dkKCksICcuZXZvc3ludGgnKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHN0YWdlUHJvcHM6IFdlYlN0YXRpY1NlcnZlcmxlc3NTdGFnZVByb3BzICYgY29yZS5TdGFnZVByb3BzID0ge1xuICAgICAgZW52OiBnZXRFbnYoY29uZmlnLnJlZ2lvbiksXG4gICAgICBzdGFnZU5hbWU6IGAke2NvbmZpZy5uYW1lfSR7Y29uZmlnLmVudlR5cGUgPyBgLSR7Y29uZmlnLmVudlR5cGV9YCA6ICcnfWAsXG4gICAgICB0YWdzOiBjb25maWcudGFncyxcbiAgICAgIGVudlR5cGU6IGNvbmZpZy5lbnZUeXBlID09PSAncHJvZCcgPyAnUFJPRCcgOiAnTk9UX1BST0QnLFxuICAgICAgZGVzY3JpcHRpb246IGAke2NvbmZpZy5kZXNjcmlwdGlvbn0ke2NvbmZpZy5lbnZUeXBlID8gYCAke2NvbmZpZy5lbnZUeXBlLnRvVXBwZXJDYXNlKCl9YCA6ICcnfWAsXG4gICAgICBob3N0ZWRab25lOiBjb25maWcuZG5zLnpvbmUsXG4gICAgICBkb21haW5OYW1lOiBgJHtjb25maWcuZG5zLnJlY29yZH0uJHtjb25maWcuZG5zLnpvbmV9YCxcbiAgICAgIGJhc2ljQXV0aDogY29uZmlnLnNlY3VyaXR5Py5iYXNpY0F1dGhQYXJhbSA/IHsgcGF0aDogY29uZmlnLnNlY3VyaXR5Py5iYXNpY0F1dGhQYXJhbSB9IDogY29uZmlnLnNlY3VyaXR5Py5iYXNpY0F1dGgsXG4gICAgICB3ZWJBY2w6IGNvbmZpZy5zZWN1cml0eT8ud2ViQWNsUGFyYW0gPyAoY29uZmlnLnNlY3VyaXR5LndlYkFjbFBhcmFtIGFzIGFueSkucGF0aCA/IGNvbmZpZy5zZWN1cml0eS53ZWJBY2xQYXJhbSA6IHsgcGF0aDogY29uZmlnLnNlY3VyaXR5LndlYkFjbFBhcmFtIGFzIHN0cmluZyB9IDogY29uZmlnLnNlY3VyaXR5Py53ZWJBY2wsXG4gICAgICByZWRpcmVjdHM6IGNvbmZpZy5jbG91ZGZyb250Py5yZWRpcmVjdHMsXG4gICAgICByZXNwb25zZUNzcEhlYWRlcnM6IGNvbmZpZy5jbG91ZGZyb250Py5jc3BIZWFkZXJzLFxuICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5OiBjb25maWcuY2xvdWRmcm9udD8ucmVzcG9uc2VIZWFkZXJzUGFyYW0gPyB7IHBhdGg6IGNvbmZpZy5jbG91ZGZyb250LnJlc3BvbnNlSGVhZGVyc1BhcmFtIH0gOiBjb25maWcuY2xvdWRmcm9udD8ucmVzcG9uc2VIZWFkZXJzLFxuICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHM6IGNvbmZpZy5jbG91ZGZyb250Py5yZXNwb25zZUhlYWRlcnNQb2xpY3ksXG4gICAgICBjbG91ZGZyb250RnVuY3Rpb246IGNvbmZpZy5jbG91ZGZyb250Py5mdW5jdGlvbiAmJiB0eXBlb2YgY29uZmlnLmNsb3VkZnJvbnQuZnVuY3Rpb24gPT0gJ3N0cmluZycgPyB7XG4gICAgICAgIGNvZGU6IGNvbmZpZy5jbG91ZGZyb250LmZ1bmN0aW9uLFxuICAgICAgICBldmVudFR5cGU6IFsnVklFV0VSX1JFUVVFU1QnLCdWSUVXRVJfUkVTUE9OU0UnXSxcbiAgICAgIH0gOiBjb25maWcuY2xvdWRmcm9udD8uZnVuY3Rpb24gYXMgYW55LFxuICAgICAgZXJyb3JSZXNwb25zZXM6IGNvbmZpZy5jbG91ZGZyb250Py5lcnJvclJlc3BvbnNlc1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnBpcGVsaW5lKSB7XG4gICAgICBzdGFnZVByb3BzLnBpcGVsaW5lID0ge1xuICAgICAgICBzb3VyY2VTdGFnZToge1xuICAgICAgICAgIGNvZGVzdGFyQ29ubmVjdGlvbjogY29uZmlnLnBpcGVsaW5lLnNvdXJjZS5jb2Rlc3RhckNvbm5lY3Rpb25QYXJhbSA/IHsgcGF0aDogY29uZmlnLnBpcGVsaW5lLnNvdXJjZS5jb2Rlc3RhckNvbm5lY3Rpb25QYXJhbSB9IDogY29uZmlnLnBpcGVsaW5lLnNvdXJjZS5jb2Rlc3RhckNvbm5lY3Rpb24gYXMgc3RyaW5nLFxuICAgICAgICAgIHJlcG9Pd25lcjogY29uZmlnLnBpcGVsaW5lLnNvdXJjZS5vd25lcixcbiAgICAgICAgICByZXBvOiBjb25maWcucGlwZWxpbmUuc291cmNlLnJlcG8sXG4gICAgICAgICAgYnJhbmNoOiBjb25maWcucGlwZWxpbmUuc291cmNlLmJyYW5jaCxcbiAgICAgICAgICBmdWxsQ2xvbmU6IGNvbmZpZy5waXBlbGluZS5zb3VyY2UuZnVsbENsb25lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcucGlwZWxpbmUuYnVpbGQpIHtcbiAgICAgICAgc3RhZ2VQcm9wcy5waXBlbGluZS5idWlsZFN0YWdlID0ge1xuICAgICAgICAgIGVudmlyb25tZW50VmFyaWFibGVzOiBjb25maWcucGlwZWxpbmUuYnVpbGQuZW52aXJvbm1lbnRWYXJpYWJsZXNcbiAgICAgICAgfTtcbiAgICAgICAgc3RhZ2VQcm9wcy5waXBlbGluZS5jb2RlQnVpbGRQcm9qZWN0ID0ge1xuICAgICAgICAgIGJ1aWxkSW1hZ2U6IGNvbmZpZy5waXBlbGluZS5idWlsZC5idWlsZEltYWdlLFxuICAgICAgICAgIGJ1aWxkSW1hZ2VJZDogY29uZmlnLnBpcGVsaW5lLmJ1aWxkLmJ1aWxkSW1hZ2VJZCxcbiAgICAgICAgICBidWlsZEltYWdlTm9kZUpTOiBjb25maWcucGlwZWxpbmUuYnVpbGQuYnVpbGRJbWFnZU5vZGVKUyxcbiAgICAgICAgICBidWlsZFNwZWM6IGNvbmZpZy5waXBlbGluZS5idWlsZC5idWlsZFNwZWMsXG4gICAgICAgICAgY29tcHV0ZVR5cGU6IGNvbmZpZy5waXBlbGluZS5idWlsZC5jb21wdXRlVHlwZSxcbiAgICAgICAgICBlY3JCdWlsZEltYWdlOiBjb25maWcucGlwZWxpbmUuYnVpbGQuYnVpbGRJbWFnZUVjcixcbiAgICAgICAgICBzc21QYXJhbWV0ZXJzOiBjb25maWcucGlwZWxpbmUuYnVpbGQuc3NtUGFyYW1ldGVyc1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIG5ldyBXZWJTdGF0aWNTZXJ2ZXJsZXNzU3RhZ2UoYXBwLCBjb25maWcudHlwZSwgc3RhZ2VQcm9wcyk7XG5cbiAgICByZXR1cm4gYXBwLnN5bnRoKCk7XG4gIH0pO1xuXG4gIHN3aXRjaCAoY21kKSB7XG4gICAgLy8gY2FzZSAnYm9vdHN0cmFwJzpcbiAgICAvLyAgIGF3YWl0IGNkay5ib290c3RyYXAoQm9vdHN0cmFwRW52aXJvbm1lbnRzLmZyb21MaXN0KFtgYXdzOi8vJHtwcm9jZXNzLmVudi5DREtfREVGQVVMVF9BQ0NPVU5UfS8ke2NvbmZpZy5yZWdpb259YF0pKTtcbiAgICAvLyAgIGJyZWFrO1xuICAgIGNhc2UgJ2RlcGxveSc6XG4gICAgY2FzZSAnZGVzdHJveSc6XG4gICAgY2FzZSAnZGlmZic6XG4gICAgY2FzZSAnZHJpZnQnOlxuICAgIGNhc2UgJ3JvbGxiYWNrJzpcbiAgICBjYXNlICdzeW50aCc6XG4gICAgICBhd2FpdCBjZGtbY21kXShjeCk7XG4gICAgICBicmVhaztcbiAgfVxufVxuIl19
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLXN0YXRpYy1zZXJ2ZXJsZXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS93ZWItc3RhdGljLXNlcnZlcmxlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEtBQUssSUFBSSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQU8vQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSx3QkFBd0IsRUFBaUMsTUFBTSwwQ0FBMEMsQ0FBQztBQTREbkgsTUFBTSxVQUFVLFlBQVksQ0FBSSxHQUFHLE9BQXlCO0lBQzFELFNBQVMsU0FBUyxDQUFJLE1BQVMsRUFBRSxNQUFzQjtRQUNyRCxNQUFNLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUE2QixDQUFDO1FBQ3hELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFnQixDQUE0QixFQUFFLENBQUM7WUFDM0UsTUFBTSxNQUFNLEdBQUksTUFBa0MsQ0FBQyxHQUFhLENBQUMsQ0FBQztZQUNsRSxNQUFNLE1BQU0sR0FBSSxNQUFrQyxDQUFDLEdBQWEsQ0FBQyxDQUFDO1lBQ2xFLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQzttQkFDcEUsTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQy9FLE1BQU0sQ0FBQyxHQUFhLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLE1BQW9DLENBQUMsQ0FBQztZQUNsRixDQUFDO2lCQUFNLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLENBQUMsR0FBYSxDQUFDLEdBQUcsTUFBTSxDQUFDO1lBQ2pDLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxNQUFXLENBQUM7SUFDckIsQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FDbkIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxFQUN2QyxFQUFPLENBQ0gsQ0FBQztBQUNULENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLHlCQUF5QixDQUFDLEdBQWUsRUFBRSxNQUFvQztJQUNuRyxNQUFNLEdBQUcsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzFCLE1BQU0sRUFBRSxHQUFHLE1BQU0sR0FBRyxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUN2RCxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDdkIsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsV0FBVyxDQUFDO1NBQ3pDLENBQUMsQ0FBQztRQUVILE1BQU0sVUFBVSxHQUFvRDtZQUNsRSxHQUFHLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDMUIsU0FBUyxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3hFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNqQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVTtZQUN4RCxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDL0YsVUFBVSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSTtZQUMzQixVQUFVLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRTtZQUNyRCxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsU0FBUztZQUNuSCxNQUFNLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNO1lBQzFMLFNBQVMsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLFNBQVM7WUFDdkMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxVQUFVO1lBQ2pELHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxlQUFlO1lBQ3RKLDBCQUEwQixFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUscUJBQXFCO1lBQ3BFLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxJQUFJLE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDakcsSUFBSSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUTtnQkFDaEMsU0FBUyxFQUFFLENBQUMsZ0JBQWdCLEVBQUMsaUJBQWlCLENBQUM7YUFDaEQsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxRQUFlO1lBQ3RDLGNBQWMsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLGNBQWM7U0FDbEQsQ0FBQTtRQUNELElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BCLFVBQVUsQ0FBQyxRQUFRLEdBQUc7Z0JBQ3BCLFdBQVcsRUFBRTtvQkFDWCxrQkFBa0IsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsa0JBQTRCO29CQUNuTCxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSztvQkFDdkMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUk7b0JBQ2pDLE1BQU0sRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNO29CQUNyQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUztpQkFDNUM7YUFDRixDQUFBO1lBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUMxQixVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsR0FBRztvQkFDL0Isb0JBQW9CLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsb0JBQW9CO2lCQUNqRSxDQUFDO2dCQUNGLFVBQVUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEdBQUc7b0JBQ3JDLFVBQVUsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVO29CQUM1QyxZQUFZLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsWUFBWTtvQkFDaEQsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCO29CQUN4RCxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUztvQkFDMUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVc7b0JBQzlDLGFBQWEsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxhQUFhO29CQUNsRCxhQUFhLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsYUFBYTtpQkFDbkQsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSx3QkFBd0IsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUUzRCxPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNyQixDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDWixvQkFBb0I7UUFDcEIsd0hBQXdIO1FBQ3hILFdBQVc7UUFDWCxLQUFLLFFBQVEsQ0FBQztRQUNkLEtBQUssU0FBUyxDQUFDO1FBQ2YsS0FBSyxNQUFNLENBQUM7UUFDWixLQUFLLE9BQU8sQ0FBQztRQUNiLEtBQUssVUFBVSxDQUFDO1FBQ2hCLEtBQUssT0FBTztZQUNWLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25CLE1BQU07SUFDVixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0ICogYXMgY29yZSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IFRvb2xraXQgfSBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgeyBSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZGZyb250JztcbmltcG9ydCB7IElCdWlsZEltYWdlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVidWlsZCc7XG5pbXBvcnQgeyBDbG91ZEZyb250RXJyb3JSZXNwb25zZSwgQ2xvdWRGcm9udEZ1bmN0aW9uUmVkaXJlY3RzIH0gZnJvbSAnLi4vY29uc3RydWN0cy9jbG91ZGZyb250LmpzJztcbmltcG9ydCB7IENvZGVCdWlsZEltYWdlSWQsIEVjckJ1aWxkSW1hZ2UsIENvZGVCdWlsZFNzbVBhcmFtZXRlciwgQ29kZUJ1aWxkQ29tcHV0ZVR5cGUsIENvZGVCdWlsZE5vZGVKcywgRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICcuLi9jb25zdHJ1Y3RzL2NvZGVidWlsZC50cyc7XG5pbXBvcnQgdHlwZSB7IEV2b3N5bnRoQXBwQ29uZmlnLCBDZGtDb21tYW5kLCBFdm9zeW50aEFwcFR5cGUgfSBmcm9tICcuL2V2b3N5bnRoLnRzJztcbmltcG9ydCB0eXBlIHsgQ2xvdWRGcm9udEZ1bmN0aW9uRXZlbnRUeXBlLCBDc3BIZWFkZXJzLCBDc3BTb3VyY2VIZWFkZXJzLCBVVUlELCBBV1NNYW5hZ2VkUmVzcG9uc2VIZWFkZXJzUG9saWN5IH0gZnJvbSAnLi4vdHlwZXMuZC50cyc7XG5pbXBvcnQgeyBnZXRFbnYgfSBmcm9tICcuLi9pbmRleC5qcyc7XG5pbXBvcnQgeyBXZWJTdGF0aWNTZXJ2ZXJsZXNzU3RhZ2UsIFdlYlN0YXRpY1NlcnZlcmxlc3NTdGFnZVByb3BzIH0gZnJvbSAnLi4vc3RhZ2VzL3dlYi1zdGF0aWMtc2VydmVybGVzcy1zdGFnZS5qcyc7XG5pbXBvcnQgdHlwZSB7IERlZXBQYXJ0aWFsIH0gZnJvbSAnLi4vdHlwZXMuZC50cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwQ29uZmlnRG5zUHJvcHMge1xuICByZWNvcmQ6IHN0cmluZztcbiAgem9uZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcENvbmZpZ1NlY3VyaXR5UHJvcHMge1xuICBiYXNpY0F1dGg/OiBzdHJpbmc7XG4gIGJhc2ljQXV0aFBhcmFtPzogc3RyaW5nO1xuICB3ZWJBY2w/OiBzdHJpbmcgfCBib29sZWFuO1xuICB3ZWJBY2xQYXJhbT86IHN0cmluZyB8IHsgcGF0aDogc3RyaW5nLCB2ZXJzaW9uPzogbnVtYmVyIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwQ29uZmlnQ2xvdWRGcm9udFByb3BzIHtcbiAgcmVzcG9uc2VIZWFkZXJzPzogQVdTTWFuYWdlZFJlc3BvbnNlSGVhZGVyc1BvbGljeSB8IFVVSUQgfCBmYWxzZTtcbiAgcmVzcG9uc2VIZWFkZXJzUGFyYW0/OiBzdHJpbmc7XG4gIHJlc3BvbnNlSGVhZGVyc1BvbGljeT86IFJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzO1xuICBjc3BIZWFkZXJzPzogQ3NwSGVhZGVycyB8IENzcFNvdXJjZUhlYWRlcnMgfCBzdHJpbmc7XG4gIHJlZGlyZWN0cz86IENsb3VkRnJvbnRGdW5jdGlvblJlZGlyZWN0cztcbiAgZnVuY3Rpb24/OiBzdHJpbmcgfCB7XG4gICAgY29kZTogc3RyaW5nO1xuICAgIGV2ZW50VHlwZTogQ2xvdWRGcm9udEZ1bmN0aW9uRXZlbnRUeXBlW107XG4gIH0sXG4gIGVycm9yUmVzcG9uc2VzPzogQ2xvdWRGcm9udEVycm9yUmVzcG9uc2VbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcENvbmZpZ1BpcGVsaW5lU291cmNlUHJvcHMge1xuICBjb2Rlc3RhckNvbm5lY3Rpb24/OiBzdHJpbmc7XG4gIGNvZGVzdGFyQ29ubmVjdGlvblBhcmFtPzogc3RyaW5nO1xuICBvd25lcjogJ2V2b2tlZ3JvdXAnIHwgJ21lbHRtZWRpYScgfCAoc3RyaW5nICYge30pO1xuICByZXBvOiBzdHJpbmc7XG4gIGJyYW5jaDogc3RyaW5nO1xuICBmdWxsQ2xvbmU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcENvbmZpZ1BpcGVsaW5lQnVpbGRQcm9wcyB7XG4gIGJ1aWxkU3BlYz86IHN0cmluZyB8IG9iamVjdDtcbiAgYnVpbGRJbWFnZT86IElCdWlsZEltYWdlO1xuICBidWlsZEltYWdlRWNyPzogRWNyQnVpbGRJbWFnZTtcbiAgYnVpbGRJbWFnZU5vZGVKUz86IENvZGVCdWlsZE5vZGVKcztcbiAgYnVpbGRJbWFnZUlkPzogQ29kZUJ1aWxkSW1hZ2VJZDtcbiAgY29tcHV0ZVR5cGU/OiBDb2RlQnVpbGRDb21wdXRlVHlwZTtcbiAgZW52aXJvbm1lbnRWYXJpYWJsZXM/OiBFbnZpcm9ubWVudFZhcmlhYmxlcztcbiAgc3NtUGFyYW1ldGVycz86IENvZGVCdWlsZFNzbVBhcmFtZXRlcltdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU3RhdGljU2VydmVybGVzc0FwcENvbmZpZyBleHRlbmRzIEV2b3N5bnRoQXBwQ29uZmlnIHtcbiAgdHlwZTogRXh0cmFjdDxFdm9zeW50aEFwcFR5cGUsICd3ZWItc3RhdGljLXNlcnZlcmxlc3MnPixcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgZG5zOiBBcHBDb25maWdEbnNQcm9wcyxcbiAgc2VjdXJpdHk/OiBBcHBDb25maWdTZWN1cml0eVByb3BzLFxuICBjbG91ZGZyb250PzogQXBwQ29uZmlnQ2xvdWRGcm9udFByb3BzLFxuICBwaXBlbGluZT86IHtcbiAgICBzb3VyY2U6IEFwcENvbmZpZ1BpcGVsaW5lU291cmNlUHJvcHMsXG4gICAgYnVpbGQ/OiBBcHBDb25maWdQaXBlbGluZUJ1aWxkUHJvcHNcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDb25maWdzPFQ+KC4uLmNvbmZpZ3M6IERlZXBQYXJ0aWFsPFQ+W10pOiBUIHtcbiAgZnVuY3Rpb24gZGVlcE1lcmdlPFU+KHRhcmdldDogVSwgc291cmNlOiBEZWVwUGFydGlhbDxVPik6IFUge1xuICAgIGNvbnN0IHJlc3VsdCA9IHsgLi4udGFyZ2V0IH0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc291cmNlIGFzIG9iamVjdCkgYXMgKGtleW9mIHR5cGVvZiBzb3VyY2UpW10pIHtcbiAgICAgIGNvbnN0IHNyY1ZhbCA9IChzb3VyY2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleSBhcyBzdHJpbmddO1xuICAgICAgY29uc3QgdGd0VmFsID0gKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5IGFzIHN0cmluZ107XG4gICAgICBpZiAoc3JjVmFsICE9PSBudWxsICYmIHR5cGVvZiBzcmNWYWwgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHNyY1ZhbClcbiAgICAgICAgICAmJiB0Z3RWYWwgIT09IG51bGwgJiYgdHlwZW9mIHRndFZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodGd0VmFsKSkge1xuICAgICAgICByZXN1bHRba2V5IGFzIHN0cmluZ10gPSBkZWVwTWVyZ2UodGd0VmFsLCBzcmNWYWwgYXMgRGVlcFBhcnRpYWw8dHlwZW9mIHRndFZhbD4pO1xuICAgICAgfSBlbHNlIGlmIChzcmNWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXN1bHRba2V5IGFzIHN0cmluZ10gPSBzcmNWYWw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQgYXMgVTtcbiAgfVxuXG4gIHJldHVybiBjb25maWdzLnJlZHVjZTxUPihcbiAgICAoYWNjLCBjb25maWcpID0+IGRlZXBNZXJnZShhY2MsIGNvbmZpZyksXG4gICAge30gYXMgVFxuICApIGFzIFQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XZWJTdGF0aWNTZXJ2ZXJsZXNzQXBwKGNtZDogQ2RrQ29tbWFuZCwgY29uZmlnOiBXZWJTdGF0aWNTZXJ2ZXJsZXNzQXBwQ29uZmlnKSB7XG4gIGNvbnN0IGNkayA9IG5ldyBUb29sa2l0KCk7XG4gIGNvbnN0IGN4ID0gYXdhaXQgY2RrLmZyb21Bc3NlbWJseUJ1aWxkZXIoYXN5bmMgKHByb3BzKSA9PiB7XG4gICAgY29uc3QgYXBwID0gbmV3IGNvcmUuQXBwKHtcbiAgICAgIG91dGRpcjogam9pbihwcm9jZXNzLmN3ZCgpLCAnLmV2b3N5bnRoJyksXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdGFnZVByb3BzOiBXZWJTdGF0aWNTZXJ2ZXJsZXNzU3RhZ2VQcm9wcyAmIGNvcmUuU3RhZ2VQcm9wcyA9IHtcbiAgICAgIGVudjogZ2V0RW52KGNvbmZpZy5yZWdpb24pLFxuICAgICAgc3RhZ2VOYW1lOiBgJHtjb25maWcubmFtZX0ke2NvbmZpZy5lbnZUeXBlID8gYC0ke2NvbmZpZy5lbnZUeXBlfWAgOiAnJ31gLFxuICAgICAgdGFnczogY29uZmlnLnRhZ3MsXG4gICAgICBlbnZUeXBlOiBjb25maWcuZW52VHlwZSA9PT0gJ3Byb2QnID8gJ1BST0QnIDogJ05PVF9QUk9EJyxcbiAgICAgIGRlc2NyaXB0aW9uOiBgJHtjb25maWcuZGVzY3JpcHRpb259JHtjb25maWcuZW52VHlwZSA/IGAgJHtjb25maWcuZW52VHlwZS50b1VwcGVyQ2FzZSgpfWAgOiAnJ31gLFxuICAgICAgaG9zdGVkWm9uZTogY29uZmlnLmRucy56b25lLFxuICAgICAgZG9tYWluTmFtZTogYCR7Y29uZmlnLmRucy5yZWNvcmR9LiR7Y29uZmlnLmRucy56b25lfWAsXG4gICAgICBiYXNpY0F1dGg6IGNvbmZpZy5zZWN1cml0eT8uYmFzaWNBdXRoUGFyYW0gPyB7IHBhdGg6IGNvbmZpZy5zZWN1cml0eT8uYmFzaWNBdXRoUGFyYW0gfSA6IGNvbmZpZy5zZWN1cml0eT8uYmFzaWNBdXRoLFxuICAgICAgd2ViQWNsOiBjb25maWcuc2VjdXJpdHk/LndlYkFjbFBhcmFtID8gKGNvbmZpZy5zZWN1cml0eS53ZWJBY2xQYXJhbSBhcyBhbnkpLnBhdGggPyBjb25maWcuc2VjdXJpdHkud2ViQWNsUGFyYW0gOiB7IHBhdGg6IGNvbmZpZy5zZWN1cml0eS53ZWJBY2xQYXJhbSBhcyBzdHJpbmcgfSA6IGNvbmZpZy5zZWN1cml0eT8ud2ViQWNsLFxuICAgICAgcmVkaXJlY3RzOiBjb25maWcuY2xvdWRmcm9udD8ucmVkaXJlY3RzLFxuICAgICAgcmVzcG9uc2VDc3BIZWFkZXJzOiBjb25maWcuY2xvdWRmcm9udD8uY3NwSGVhZGVycyxcbiAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeTogY29uZmlnLmNsb3VkZnJvbnQ/LnJlc3BvbnNlSGVhZGVyc1BhcmFtID8geyBwYXRoOiBjb25maWcuY2xvdWRmcm9udC5yZXNwb25zZUhlYWRlcnNQYXJhbSB9IDogY29uZmlnLmNsb3VkZnJvbnQ/LnJlc3BvbnNlSGVhZGVycyxcbiAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzOiBjb25maWcuY2xvdWRmcm9udD8ucmVzcG9uc2VIZWFkZXJzUG9saWN5LFxuICAgICAgY2xvdWRmcm9udEZ1bmN0aW9uOiBjb25maWcuY2xvdWRmcm9udD8uZnVuY3Rpb24gJiYgdHlwZW9mIGNvbmZpZy5jbG91ZGZyb250LmZ1bmN0aW9uID09ICdzdHJpbmcnID8ge1xuICAgICAgICBjb2RlOiBjb25maWcuY2xvdWRmcm9udC5mdW5jdGlvbixcbiAgICAgICAgZXZlbnRUeXBlOiBbJ1ZJRVdFUl9SRVFVRVNUJywnVklFV0VSX1JFU1BPTlNFJ10sXG4gICAgICB9IDogY29uZmlnLmNsb3VkZnJvbnQ/LmZ1bmN0aW9uIGFzIGFueSxcbiAgICAgIGVycm9yUmVzcG9uc2VzOiBjb25maWcuY2xvdWRmcm9udD8uZXJyb3JSZXNwb25zZXNcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5waXBlbGluZSkge1xuICAgICAgc3RhZ2VQcm9wcy5waXBlbGluZSA9IHtcbiAgICAgICAgc291cmNlU3RhZ2U6IHtcbiAgICAgICAgICBjb2Rlc3RhckNvbm5lY3Rpb246IGNvbmZpZy5waXBlbGluZS5zb3VyY2UuY29kZXN0YXJDb25uZWN0aW9uUGFyYW0gPyB7IHBhdGg6IGNvbmZpZy5waXBlbGluZS5zb3VyY2UuY29kZXN0YXJDb25uZWN0aW9uUGFyYW0gfSA6IGNvbmZpZy5waXBlbGluZS5zb3VyY2UuY29kZXN0YXJDb25uZWN0aW9uIGFzIHN0cmluZyxcbiAgICAgICAgICByZXBvT3duZXI6IGNvbmZpZy5waXBlbGluZS5zb3VyY2Uub3duZXIsXG4gICAgICAgICAgcmVwbzogY29uZmlnLnBpcGVsaW5lLnNvdXJjZS5yZXBvLFxuICAgICAgICAgIGJyYW5jaDogY29uZmlnLnBpcGVsaW5lLnNvdXJjZS5icmFuY2gsXG4gICAgICAgICAgZnVsbENsb25lOiBjb25maWcucGlwZWxpbmUuc291cmNlLmZ1bGxDbG9uZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLnBpcGVsaW5lLmJ1aWxkKSB7XG4gICAgICAgIHN0YWdlUHJvcHMucGlwZWxpbmUuYnVpbGRTdGFnZSA9IHtcbiAgICAgICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczogY29uZmlnLnBpcGVsaW5lLmJ1aWxkLmVudmlyb25tZW50VmFyaWFibGVzXG4gICAgICAgIH07XG4gICAgICAgIHN0YWdlUHJvcHMucGlwZWxpbmUuY29kZUJ1aWxkUHJvamVjdCA9IHtcbiAgICAgICAgICBidWlsZEltYWdlOiBjb25maWcucGlwZWxpbmUuYnVpbGQuYnVpbGRJbWFnZSxcbiAgICAgICAgICBidWlsZEltYWdlSWQ6IGNvbmZpZy5waXBlbGluZS5idWlsZC5idWlsZEltYWdlSWQsXG4gICAgICAgICAgYnVpbGRJbWFnZU5vZGVKUzogY29uZmlnLnBpcGVsaW5lLmJ1aWxkLmJ1aWxkSW1hZ2VOb2RlSlMsXG4gICAgICAgICAgYnVpbGRTcGVjOiBjb25maWcucGlwZWxpbmUuYnVpbGQuYnVpbGRTcGVjLFxuICAgICAgICAgIGNvbXB1dGVUeXBlOiBjb25maWcucGlwZWxpbmUuYnVpbGQuY29tcHV0ZVR5cGUsXG4gICAgICAgICAgZWNyQnVpbGRJbWFnZTogY29uZmlnLnBpcGVsaW5lLmJ1aWxkLmJ1aWxkSW1hZ2VFY3IsXG4gICAgICAgICAgc3NtUGFyYW1ldGVyczogY29uZmlnLnBpcGVsaW5lLmJ1aWxkLnNzbVBhcmFtZXRlcnNcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBuZXcgV2ViU3RhdGljU2VydmVybGVzc1N0YWdlKGFwcCwgY29uZmlnLnR5cGUsIHN0YWdlUHJvcHMpO1xuXG4gICAgcmV0dXJuIGFwcC5zeW50aCgpO1xuICB9KTtcblxuICBzd2l0Y2ggKGNtZCkge1xuICAgIC8vIGNhc2UgJ2Jvb3RzdHJhcCc6XG4gICAgLy8gICBhd2FpdCBjZGsuYm9vdHN0cmFwKEJvb3RzdHJhcEVudmlyb25tZW50cy5mcm9tTGlzdChbYGF3czovLyR7cHJvY2Vzcy5lbnYuQ0RLX0RFRkFVTFRfQUNDT1VOVH0vJHtjb25maWcucmVnaW9ufWBdKSk7XG4gICAgLy8gICBicmVhaztcbiAgICBjYXNlICdkZXBsb3knOlxuICAgIGNhc2UgJ2Rlc3Ryb3knOlxuICAgIGNhc2UgJ2RpZmYnOlxuICAgIGNhc2UgJ2RyaWZ0JzpcbiAgICBjYXNlICdyb2xsYmFjayc6XG4gICAgY2FzZSAnc3ludGgnOlxuICAgICAgYXdhaXQgY2RrW2NtZF0oY3gpO1xuICAgICAgYnJlYWs7XG4gIH1cbn1cbiJdfQ==
@@ -7,7 +7,7 @@ import { Bucket } from "aws-cdk-lib/aws-s3";
7
7
  import { CfnWebACL } from 'aws-cdk-lib/aws-wafv2';
8
8
  import { CloudFrontFunctionRedirects, CloudFrontErrorResponse } from '../../constructs/cloudfront.js';
9
9
  import type { SsmStringParameter } from '../../constructs/ssm.ts';
10
- import type { BasicAuthCredentials, CspHeaders, CloudFrontFunctionEventType, UUID, AWSManagedResponseHeadersPolicy } from '../../types.d.ts';
10
+ import type { BasicAuthCredentials, CspHeaders, CspSourceHeaders, CloudFrontFunctionEventType, UUID, AWSManagedResponseHeadersPolicy } from '../../types.d.ts';
11
11
  export interface WebGlobalStackProps {
12
12
  envType: 'NOT_PROD' | 'PROD';
13
13
  description?: string;
@@ -24,7 +24,7 @@ export interface WebGlobalStackProps {
24
24
  webAcl?: boolean | string | SsmStringParameter;
25
25
  responseHeadersPolicy?: false | AWSManagedResponseHeadersPolicy | UUID | SsmStringParameter;
26
26
  responseHeadersPolicyProps?: ResponseHeadersPolicyProps;
27
- responseCspHeaders?: CspHeaders | string;
27
+ responseCspHeaders?: CspHeaders | CspSourceHeaders | string;
28
28
  destroy?: boolean;
29
29
  tags?: Record<string, string>;
30
30
  errorResponses?: (CloudFrontErrorResponse | ErrorResponse)[];
@@ -86,16 +86,18 @@ export class WebGlobalStack extends Stack {
86
86
  let csp = '';
87
87
  if (typeof props.responseCspHeaders == 'string') {
88
88
  if (isCspCsv(props.responseCspHeaders)) {
89
- csp = cspHeadersToString(parseCspCsv(props.responseCspHeaders));
89
+ csp = cspHeadersToString(cspSourceHeadersToCspHeaders(parseCspCsv(props.responseCspHeaders)));
90
90
  }
91
91
  else {
92
92
  csp = props.responseCspHeaders;
93
93
  }
94
94
  }
95
95
  else {
96
- csp = Object.entries(props.responseCspHeaders).map(([directive, values]) => {
97
- return `${directive} ${values.join(' ')};`;
98
- }).join(' ');
96
+ const normalized = props.responseCspHeaders;
97
+ const headers = isCspSourceHeaders(normalized)
98
+ ? cspSourceHeadersToCspHeaders(normalized)
99
+ : normalized;
100
+ csp = cspHeadersToString(headers);
99
101
  }
100
102
  responseHeadersPolicy = new ResponseHeadersPolicy(this, 'response-headers-policy', {
101
103
  securityHeadersBehavior: {
@@ -220,41 +222,54 @@ function isCspCsv(str) {
220
222
  const headers = lines[0].split(',').map(h => h.trim().toLowerCase());
221
223
  return headers.indexOf('source') !== -1;
222
224
  }
225
+ function isCspSourceHeaders(headers) {
226
+ const CSP_DIRECTIVES = new Set(['connect-src', 'default-src', 'font-src', 'frame-src', 'img-src', 'media-src', 'object-src', 'script-src', 'style-src']);
227
+ return Object.keys(headers).some(k => !CSP_DIRECTIVES.has(k));
228
+ }
223
229
  function parseCspCsv(csv) {
224
230
  const lines = csv.trim().split('\n');
225
231
  if (lines.length < 1)
226
232
  return {};
227
- // Parse header row
228
233
  const headers = lines[0].split(',').map(h => h.trim().toLowerCase());
229
234
  const sourceIndex = headers.indexOf('source');
230
235
  if (sourceIndex === -1) {
231
236
  throw new Error('CSV must contain a "source" column');
232
237
  }
233
238
  const result = {};
234
- // Process data rows
235
239
  for (let i = 1; i < lines.length; i++) {
236
240
  const line = lines[i].trim();
237
241
  if (!line)
238
- continue; // Skip empty lines
242
+ continue;
239
243
  const values = line.split(',').map(v => v.trim());
240
244
  const source = values[sourceIndex];
241
245
  if (!source)
242
- continue; // Skip rows with no source
243
- // For each directive, add source if the value is marked with 'x'
246
+ continue;
244
247
  headers.forEach((header, colIndex) => {
245
248
  if (header !== 'source' && values[colIndex].toLowerCase() === 'x') {
246
- if (!result[header]) {
247
- result[header] = [];
249
+ if (!result[source]) {
250
+ result[source] = [];
248
251
  }
249
- result[header].push(source);
252
+ result[source].push(header);
250
253
  }
251
254
  });
252
255
  }
253
256
  return result;
254
257
  }
258
+ function cspSourceHeadersToCspHeaders(sourceHeaders) {
259
+ const result = {};
260
+ for (const [source, directives] of Object.entries(sourceHeaders)) {
261
+ for (const directive of directives) {
262
+ if (!result[directive]) {
263
+ result[directive] = [];
264
+ }
265
+ result[directive].push(source);
266
+ }
267
+ }
268
+ return result;
269
+ }
255
270
  function cspHeadersToString(headers) {
256
271
  return Object.entries(headers)
257
272
  .map(([directive, sources]) => `${directive} ${sources.join(' ')};`)
258
273
  .join(' ');
259
274
  }
260
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWdsb2JhbC1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zdGFja3Mvd2ViLXN0YXRpYy1zZXJ2ZXJsZXNzL3dlYi1nbG9iYWwtc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBYyxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJN0UsT0FBTyxFQUF5QyxpQkFBaUIsRUFBd0cscUJBQXFCLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUc5USxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3hFLE9BQU8sRUFBK0Isa0JBQWtCLEVBQUUsc0JBQXNCLEVBQTJCLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEosT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUEwQnBFLE1BQU0sT0FBTyxjQUFlLFNBQVEsS0FBSztJQUN2QixjQUFjLENBQWM7SUFDNUIsUUFBUSxDQUFTO0lBQ2pCLGtCQUFrQixDQUFXO0lBQzdCLHNCQUFzQixDQUFlO0lBQ3JDLE1BQU0sQ0FBd0I7SUFDOUIscUJBQXFCLENBQXFDO0lBQzFELE9BQU8sQ0FBVTtJQUNqQixVQUFVLENBQWE7SUFFdkMsWUFBWSxLQUFn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RSxDQUFDO2dCQUNsRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQTBCLENBQUMsRUFBRSxDQUFDO29CQUN4QyxNQUFNLENBQUMsTUFBMEIsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDMUMsQ0FBQztnQkFDQSxNQUFNLENBQUMsTUFBMEIsQ0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoRSxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsT0FBbUI7SUFDN0MsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztTQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxTQUFTLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1NBQ25FLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjaywgU3RhY2tQcm9wcywgUGh5c2ljYWxOYW1lLCBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbmltcG9ydCB7IENlcnRpZmljYXRlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXJcIjtcbmltcG9ydCB7IERpc3RyaWJ1dGlvbiwgRXJyb3JSZXNwb25zZSwgRnVuY3Rpb24sIEZ1bmN0aW9uRXZlbnRUeXBlLCBJUmVzcG9uc2VIZWFkZXJzUG9saWN5LCBSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcywgUmVzcG9uc2VTZWN1cml0eUhlYWRlcnNCZWhhdmlvciwgQmVoYXZpb3JPcHRpb25zLCBSZXNwb25zZUhlYWRlcnNQb2xpY3ksIEhlYWRlcnNGcmFtZU9wdGlvbiwgSGVhZGVyc1JlZmVycmVyUG9saWN5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0IHsgQVJlY29yZCwgQWFhYVJlY29yZCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1M1wiO1xuaW1wb3J0IHsgQnVja2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgeyBDZm5XZWJBQ0wgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtd2FmdjInO1xuXG5pbXBvcnQgeyBTU0xDZXJ0aWZpY2F0ZSB9IGZyb20gJy4uLy4uL2NvbnN0cnVjdHMvY2VydGlmaWNhdGVtYW5hZ2VyLmpzJztcbmltcG9ydCB7IENsb3VkRnJvbnRGdW5jdGlvblJlZGlyZWN0cywgQ2xvdWRGcm9udEZ1bmN0aW9uLCBDbG91ZEZyb250RGlzdHJpYnV0aW9uLCBDbG91ZEZyb250RXJyb3JSZXNwb25zZSB9IGZyb20gJy4uLy4uL2NvbnN0cnVjdHMvY2xvdWRmcm9udC5qcyc7XG5pbXBvcnQgeyBnZXRIb3N0ZWRab25lLCBDbG91ZEZyb250QWxpYXMgfSBmcm9tICcuLi8uLi9jb25zdHJ1Y3RzL3JvdXRlNTMuanMnO1xuaW1wb3J0IHsgUzNCdWNrZXQgfSBmcm9tICcuLi8uLi9jb25zdHJ1Y3RzL3MzLmpzJztcbmltcG9ydCB0eXBlIHsgU3NtU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vY29uc3RydWN0cy9zc20udHMnO1xuaW1wb3J0IHsgQ2xvdWRGcm9udFdlYkFjbCB9IGZyb20gJy4uLy4uL2NvbnN0cnVjdHMvd2FmLmpzJztcbmltcG9ydCB7IGRvbWFpbkFzSWQgfSBmcm9tICcuLi8uLi9saWIvdXRpbHMuanMnO1xuaW1wb3J0IHsgYWRkRXZvU3RhY2tUYWdzIH0gZnJvbSAnLi4vLi4vbGliL3RhZ3MudHMnO1xuaW1wb3J0IHsgUzNCdWNrZXRPcmlnaW4gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zJztcbmltcG9ydCB0eXBlIHsgQmFzaWNBdXRoQ3JlZGVudGlhbHMsIENzcEhlYWRlcnMsIENsb3VkRnJvbnRGdW5jdGlvbkV2ZW50VHlwZSwgVVVJRCwgQVdTTWFuYWdlZFJlc3BvbnNlSGVhZGVyc1BvbGljeSB9IGZyb20gJy4uLy4uL3R5cGVzLmQudHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdlYkdsb2JhbFN0YWNrUHJvcHMge1xuICBlbnZUeXBlOiAnTk9UX1BST0QnIHwgJ1BST0QnO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgYnVja2V0TmFtZT86IHN0cmluZztcbiAgaG9zdGVkWm9uZTogc3RyaW5nO1xuICBkb21haW5OYW1lOiBzdHJpbmc7XG4gIGJhc2ljQXV0aD86IHN0cmluZyB8IEJhc2ljQXV0aENyZWRlbnRpYWxzIHwgU3NtU3RyaW5nUGFyYW1ldGVyO1xuICBjbG91ZGZyb250RnVuY3Rpb24/OiB7XG4gICAgY29kZTogc3RyaW5nO1xuICAgIGV2ZW50VHlwZTogQ2xvdWRGcm9udEZ1bmN0aW9uRXZlbnRUeXBlW107XG4gIH1cbiAgcmVkaXJlY3RzPzogQ2xvdWRGcm9udEZ1bmN0aW9uUmVkaXJlY3RzO1xuICByZWRpcmVjdHNDc3ZQYXRoPzogc3RyaW5nO1xuICAvLyBhdHRhY2hXZWJBY2w/OiBib29sZWFuIHwgc3RyaW5nO1xuICB3ZWJBY2w/OiBib29sZWFuIHwgc3RyaW5nIHwgU3NtU3RyaW5nUGFyYW1ldGVyO1xuICByZXNwb25zZUhlYWRlcnNQb2xpY3k/OiBmYWxzZSB8IEFXU01hbmFnZWRSZXNwb25zZUhlYWRlcnNQb2xpY3kgfCBVVUlEIHwgU3NtU3RyaW5nUGFyYW1ldGVyO1xuICByZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcz86IFJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzO1xuICByZXNwb25zZUNzcEhlYWRlcnM/OiBDc3BIZWFkZXJzIHwgc3RyaW5nO1xuICBkZXN0cm95PzogYm9vbGVhbjtcbiAgdGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGVycm9yUmVzcG9uc2VzPzogKENsb3VkRnJvbnRFcnJvclJlc3BvbnNlIHwgRXJyb3JSZXNwb25zZSlbXTtcbn1cblxuZXhwb3J0IGNsYXNzIFdlYkdsb2JhbFN0YWNrIGV4dGVuZHMgU3RhY2sge1xuICBwdWJsaWMgcmVhZG9ubHkgc3NsQ2VydGlmaWNhdGU6IENlcnRpZmljYXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgczNCdWNrZXQ6IEJ1Y2tldDtcbiAgcHVibGljIHJlYWRvbmx5IGNsb3VkRnJvbnRGdW5jdGlvbjogRnVuY3Rpb247XG4gIHB1YmxpYyByZWFkb25seSBjbG91ZEZyb250RGlzdHJpYnV0aW9uOiBEaXN0cmlidXRpb247XG4gIHB1YmxpYyByZWFkb25seSB3ZWJBY2w6IENmbldlYkFDTCB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHJlYWRvbmx5IHJlc3BvbnNlSGVhZGVyc1BvbGljeTogSVJlc3BvbnNlSGVhZGVyc1BvbGljeSB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHJlYWRvbmx5IGFSZWNvcmQ6IEFSZWNvcmQ7XG4gIHB1YmxpYyByZWFkb25seSBhYWFhUmVjb3JkOiBBYWFhUmVjb3JkO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXZWJHbG9iYWxTdGFja1Byb3BzICYgU3RhY2tQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBkZXNjcmlwdGlvbjogYCR7cHJvcHMuZGVzY3JpcHRpb24gPz8gcHJvcHMuc3RhY2tOYW1lID8/ICcnfSBXZWIgR2xvYmFsIFN0YWNrYFxuICAgIH0pO1xuICAgIGFkZEV2b1N0YWNrVGFncyh0aGlzLCAnV2ViR2xvYmFsU3RhY2snKTtcblxuICAgIHByb3BzLmRlc2NyaXB0aW9uID0gcHJvcHMuZGVzY3JpcHRpb24gPz8gcHJvcHMuc3RhY2tOYW1lO1xuXG4gICAgY29uc3QgaG9zdGVkWm9uZSA9IGdldEhvc3RlZFpvbmUodGhpcywgJ2dldEhvc3RlZFpvbmUnLCBwcm9wcy5ob3N0ZWRab25lKTtcblxuICAgIGNvbnN0IF9zc2xDZXJ0ID0gbmV3IFNTTENlcnRpZmljYXRlKHRoaXMsICdTU0xDZXJ0aWZpY2F0ZScsIHtcbiAgICAgIGhvc3RlZFpvbmU6IGhvc3RlZFpvbmUsXG4gICAgICBkb21haW5OYW1lOiBwcm9wcy5kb21haW5OYW1lLFxuICAgICAgZGVzdHJveTogcHJvcHMuZGVzdHJveVxuICAgIH0pO1xuICAgIHRoaXMuc3NsQ2VydGlmaWNhdGUgPSBfc3NsQ2VydC5jZXJ0aWZpY2F0ZTtcblxuICAgIGNvbnN0IF9zM0J1Y2tldCA9IG5ldyBTM0J1Y2tldCh0aGlzLCAnUzNCdWNrZXQnLCB7XG4gICAgICBidWNrZXROYW1lOiBwcm9wcy5idWNrZXROYW1lID8/IFBoeXNpY2FsTmFtZS5HRU5FUkFURV9JRl9ORUVERUQsXG4gICAgICBkZXN0cm95OiBwcm9wcy5kZXN0cm95XG4gICAgfSk7XG4gICAgdGhpcy5zM0J1Y2tldCA9IF9zM0J1Y2tldC5idWNrZXQ7XG5cbiAgICBsZXQgcmVzcG9uc2VIZWFkZXJzUG9saWN5OiBJUmVzcG9uc2VIZWFkZXJzUG9saWN5IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmIChwcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3kpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5ID09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICgvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQvaS50ZXN0KHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeSkpIHtcbiAgICAgICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3kgPSBSZXNwb25zZUhlYWRlcnNQb2xpY3kuZnJvbVJlc3BvbnNlSGVhZGVyc1BvbGljeUlkKHRoaXMsICdyZXNwb25zZS1oZWFkZXJzLXBvbGljeS1ieS1pZCcsIHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5ID0gUmVzcG9uc2VIZWFkZXJzUG9saWN5W3Byb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeSBhcyBrZXlvZiB0eXBlb2YgUmVzcG9uc2VIZWFkZXJzUG9saWN5XSBhcyBJUmVzcG9uc2VIZWFkZXJzUG9saWN5ID8/IFJlc3BvbnNlSGVhZGVyc1BvbGljeS5TRUNVUklUWV9IRUFERVJTO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeS5wYXRoKSB7XG4gICAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeSA9IFJlc3BvbnNlSGVhZGVyc1BvbGljeS5mcm9tUmVzcG9uc2VIZWFkZXJzUG9saWN5SWQodGhpcywgJ3Jlc3BvbnNlLWhlYWRlcnMtcG9saWN5LWJ5LWlkJywgU3RyaW5nUGFyYW1ldGVyLnZhbHVlRm9yU3RyaW5nUGFyYW1ldGVyKHRoaXMsIHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeS5wYXRoLCBwcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3kudmVyc2lvbikpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBiYXNlSGVhZGVyc0JlaGF2aW9yOiBSZXNwb25zZVNlY3VyaXR5SGVhZGVyc0JlaGF2aW9yID0ge1xuICAgICAgICBzdHJpY3RUcmFuc3BvcnRTZWN1cml0eToge1xuICAgICAgICAgIG92ZXJyaWRlOiB0cnVlLFxuICAgICAgICAgIGFjY2Vzc0NvbnRyb2xNYXhBZ2U6IER1cmF0aW9uLnNlY29uZHMoMzE1MzYwMDApXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRlbnRUeXBlT3B0aW9uczoge1xuICAgICAgICAgIG92ZXJyaWRlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIGZyYW1lT3B0aW9uczoge1xuICAgICAgICAgIG92ZXJyaWRlOiB0cnVlLFxuICAgICAgICAgIGZyYW1lT3B0aW9uOiBIZWFkZXJzRnJhbWVPcHRpb24uU0FNRU9SSUdJTixcbiAgICAgICAgfSxcbiAgICAgICAgcmVmZXJyZXJQb2xpY3k6IHtcbiAgICAgICAgICBvdmVycmlkZTogdHJ1ZSxcbiAgICAgICAgICByZWZlcnJlclBvbGljeTogSGVhZGVyc1JlZmVycmVyUG9saWN5LlNUUklDVF9PUklHSU5fV0hFTl9DUk9TU19PUklHSU5cbiAgICAgICAgfSxcbiAgICAgICAgeHNzUHJvdGVjdGlvbjoge1xuICAgICAgICAgIG92ZXJyaWRlOiB0cnVlLFxuICAgICAgICAgIHByb3RlY3Rpb246IHRydWUsXG4gICAgICAgICAgbW9kZUJsb2NrOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVyc1BvbGljeU5hbWUgPSBgJHtkb21haW5Bc0lkKHByb3BzLmRvbWFpbk5hbWUpfS1yZXNwb25zZS1oZWFkZXJzLXBvbGljeWA7XG4gICAgICBcbiAgICAgIGlmIChwcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcykge1xuICAgICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3kgPSBuZXcgUmVzcG9uc2VIZWFkZXJzUG9saWN5KHRoaXMsICdyZXNwb25zZS1oZWFkZXJzLXBvbGljeScsIHtcbiAgICAgICAgICAuLi5iYXNlSGVhZGVyc0JlaGF2aW9yLFxuICAgICAgICAgIC4uLnByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLFxuICAgICAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeU5hbWU6IHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeU5hbWUgfHwgcmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAocHJvcHMucmVzcG9uc2VDc3BIZWFkZXJzKSB7XG4gICAgICAgIGxldCBjc3AgPSAnJztcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wcy5yZXNwb25zZUNzcEhlYWRlcnMgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAoaXNDc3BDc3YocHJvcHMucmVzcG9uc2VDc3BIZWFkZXJzKSkge1xuICAgICAgICAgICAgY3NwID0gY3NwSGVhZGVyc1RvU3RyaW5nKHBhcnNlQ3NwQ3N2KHByb3BzLnJlc3BvbnNlQ3NwSGVhZGVycykpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjc3AgPSBwcm9wcy5yZXNwb25zZUNzcEhlYWRlcnM7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNzcCA9IE9iamVjdC5lbnRyaWVzKHByb3BzLnJlc3BvbnNlQ3NwSGVhZGVycykubWFwKChbZGlyZWN0aXZlLCB2YWx1ZXNdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYCR7ZGlyZWN0aXZlfSAke3ZhbHVlcy5qb2luKCcgJyl9O2BcbiAgICAgICAgICB9KS5qb2luKCcgJylcbiAgICAgICAgfVxuICAgICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3kgPSBuZXcgUmVzcG9uc2VIZWFkZXJzUG9saWN5KHRoaXMsICdyZXNwb25zZS1oZWFkZXJzLXBvbGljeScsIHtcbiAgICAgICAgICBzZWN1cml0eUhlYWRlcnNCZWhhdmlvcjoge1xuICAgICAgICAgICAgLi4uYmFzZUhlYWRlcnNCZWhhdmlvcixcbiAgICAgICAgICAgIGNvbnRlbnRTZWN1cml0eVBvbGljeToge1xuICAgICAgICAgICAgICBvdmVycmlkZTogdHJ1ZSxcbiAgICAgICAgICAgICAgY29udGVudFNlY3VyaXR5UG9saWN5OiBjc3BcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3lOYW1lXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoeSB0aGUgdGhlIHBvbGljeSBpcyBub3QgZ2V0dGluZyB1cGRhdGVkIGluIHRoZSBDbG91ZEZyb250IGJlaGF2aW9yXG4gICAgdGhpcy5yZXNwb25zZUhlYWRlcnNQb2xpY3kgPSByZXNwb25zZUhlYWRlcnNQb2xpY3k7XG5cbiAgICBjb25zdCBkZWZhdWx0QmVoYXZpb3I6IEJlaGF2aW9yT3B0aW9ucyA9IHtcbiAgICAgIG9yaWdpbjogUzNCdWNrZXRPcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0NvbnRyb2wodGhpcy5zM0J1Y2tldCksXG4gICAgICBmdW5jdGlvbkFzc29jaWF0aW9uczogW10sXG4gICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3k6IHJlc3BvbnNlSGVhZGVyc1BvbGljeSA/PyAocHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5ICE9PSBmYWxzZSA/IFJlc3BvbnNlSGVhZGVyc1BvbGljeS5TRUNVUklUWV9IRUFERVJTIDogdW5kZWZpbmVkKVxuICAgIH07XG5cbiAgICBsZXQgY2ZmbjogQ2xvdWRGcm9udEZ1bmN0aW9uO1xuICAgIGlmIChwcm9wcy5iYXNpY0F1dGgpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMuYmFzaWNBdXRoICE9ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICgocHJvcHMuYmFzaWNBdXRoIGFzIEJhc2ljQXV0aENyZWRlbnRpYWxzKS51c2VyICYmIChwcm9wcy5iYXNpY0F1dGggYXMgQmFzaWNBdXRoQ3JlZGVudGlhbHMpLnBhc3N3b3JkKSB7XG4gICAgICAgICAgcHJvcHMuYmFzaWNBdXRoID0gQnVmZmVyLmZyb20oYCR7KHByb3BzLmJhc2ljQXV0aCBhcyBCYXNpY0F1dGhDcmVkZW50aWFscykudXNlcn06JHsocHJvcHMuYmFzaWNBdXRoIGFzIEJhc2ljQXV0aENyZWRlbnRpYWxzKS5wYXNzd29yZH1gKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgIH0gZWxzZSBpZiAoKHByb3BzLmJhc2ljQXV0aCBhcyBTc21TdHJpbmdQYXJhbWV0ZXIpLnBhdGgpIHtcbiAgICAgICAgICBwcm9wcy5iYXNpY0F1dGggPSBTdHJpbmdQYXJhbWV0ZXIudmFsdWVGb3JTdHJpbmdQYXJhbWV0ZXIodGhpcywgKHByb3BzLmJhc2ljQXV0aCBhcyBTc21TdHJpbmdQYXJhbWV0ZXIpLnBhdGgsIChwcm9wcy5iYXNpY0F1dGggYXMgU3NtU3RyaW5nUGFyYW1ldGVyKS52ZXJzaW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wcy5iYXNpY0F1dGggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByb3BzLmNsb3VkZnJvbnRGdW5jdGlvbikge1xuICAgICAgY2ZmbiA9IENsb3VkRnJvbnRGdW5jdGlvbi5jcmVhdGVGdW5jdGlvbih0aGlzLCBudWxsLCB7XG4gICAgICAgIGNyZWRlbnRpYWxzOiBwcm9wcy5iYXNpY0F1dGgsXG4gICAgICAgIHJlZGlyZWN0czogcHJvcHMucmVkaXJlY3RzLFxuICAgICAgICByZWRpcmVjdHNDc3ZQYXRoOiBwcm9wcy5yZWRpcmVjdHNDc3ZQYXRoLFxuICAgICAgICBjb2RlOiBwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24uY29kZSxcbiAgICAgICAgZGVzdHJveTogcHJvcHMuZGVzdHJveVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5iYXNpY0F1dGgpIHtcbiAgICAgIGNmZm4gPSBDbG91ZEZyb250RnVuY3Rpb24uY3JlYXRlQmFzaWNBdXRoRGVmYXVsdERvYyh0aGlzLCB7XG4gICAgICAgIGNyZWRlbnRpYWxzOiBwcm9wcy5iYXNpY0F1dGgsXG4gICAgICAgIHJlZGlyZWN0czogcHJvcHMucmVkaXJlY3RzLFxuICAgICAgICByZWRpcmVjdHNDc3ZQYXRoOiBwcm9wcy5yZWRpcmVjdHNDc3ZQYXRoLFxuICAgICAgICBkZXN0cm95OiBwcm9wcy5kZXN0cm95XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2ZmbiA9IENsb3VkRnJvbnRGdW5jdGlvbi5jcmVhdGVEZWZhdWx0RG9jKHRoaXMsIHtcbiAgICAgICAgcmVkaXJlY3RzOiBwcm9wcy5yZWRpcmVjdHMsXG4gICAgICAgIHJlZGlyZWN0c0NzdlBhdGg6IHByb3BzLnJlZGlyZWN0c0NzdlBhdGgsXG4gICAgICAgIGRlc3Ryb3k6IHByb3BzLmRlc3Ryb3lcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNsb3VkRnJvbnRGdW5jdGlvbiA9IGNmZm4uZm47XG5cbiAgICAvLyBjb25zdCBldmVudFR5cGVzOiBDbG91ZEZyb250RnVuY3Rpb25FdmVudFR5cGVbXSA9IHByb3BzLmNsb3VkZnJvbnRGdW5jdGlvbj8uZXZlbnRUeXBlICYmIHByb3BzLmNsb3VkZnJvbnRGdW5jdGlvbi5ldmVudFR5cGUubGVuZ3RoID4gMCA/IHByb3BzLmNsb3VkZnJvbnRGdW5jdGlvbi5ldmVudFR5cGUgOiBbJ1ZJRVdFUl9SRVFVRVNUJywgJ1ZJRVdFUl9SRVNQT05TRSddO1xuXG4gICAgbGV0IGV2ZW50VHlwZXM6IENsb3VkRnJvbnRGdW5jdGlvbkV2ZW50VHlwZVtdID0gWydWSUVXRVJfUkVRVUVTVCcsICdWSUVXRVJfUkVTUE9OU0UnXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24/LmV2ZW50VHlwZSkgJiYgcHJvcHMuY2xvdWRmcm9udEZ1bmN0aW9uLmV2ZW50VHlwZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBldHMgPSBwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24uZXZlbnRUeXBlXG4gICAgICAgIC5maWx0ZXIoKHYsIGksIGEpID0+IHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdHlwZW9mIHYgPT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICh2ID09PSAnVklFV0VSX1JFUVVFU1QnIHx8IHYgPT09ICdWSUVXRVJfUkVTUE9OU0UnKSAmJlxuICAgICAgICAgICAgYS5pbmRleE9mKHYpID09PSBpIC8vIGRlZHVwXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICBpZiAoZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXZlbnRUeXBlcyA9IGV0cztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50VHlwZSBvZiBldmVudFR5cGVzKSB7XG4gICAgICBkZWZhdWx0QmVoYXZpb3IuZnVuY3Rpb25Bc3NvY2lhdGlvbnMhLnB1c2goe1xuICAgICAgICBldmVudFR5cGU6IEZ1bmN0aW9uRXZlbnRUeXBlW2V2ZW50VHlwZV0sXG4gICAgICAgIGZ1bmN0aW9uOiB0aGlzLmNsb3VkRnJvbnRGdW5jdGlvblxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIGxldCB3ZWJBY2xJZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgcHJvcHMud2ViQWNsID09ICdzdHJpbmcnICYmIHByb3BzLndlYkFjbC5zdGFydHNXaXRoKCdhcm46YXdzJykpIHtcbiAgICAgIHdlYkFjbElkID0gcHJvcHMud2ViQWNsO1xuICAgIH0gZWxzZSBpZiAoKHByb3BzLndlYkFjbCBhcyBTc21TdHJpbmdQYXJhbWV0ZXIpLnBhdGgpIHtcbiAgICAgIHdlYkFjbElkID0gU3RyaW5nUGFyYW1ldGVyLnZhbHVlRm9yU3RyaW5nUGFyYW1ldGVyKHRoaXMsIChwcm9wcy53ZWJBY2wgYXMgU3NtU3RyaW5nUGFyYW1ldGVyKS5wYXRoLCAocHJvcHMud2ViQWNsIGFzIFNzbVN0cmluZ1BhcmFtZXRlcikudmVyc2lvbik7XG4gICAgfSBlbHNlIGlmIChwcm9wcy53ZWJBY2wgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHdhZiA9IG5ldyBDbG91ZEZyb250V2ViQWNsKHRoaXMsICdDbG91ZEZyb250V2ViQWNsJywge1xuICAgICAgICBuYW1lOiBgJHtkb21haW5Bc0lkKHByb3BzLmRvbWFpbk5hbWUpfWAsXG4gICAgICAgIGRlc3Ryb3k6IHByb3BzLmRlc3Ryb3lcbiAgICAgIH0pO1xuICAgICAgdGhpcy53ZWJBY2wgPSB3YWYuYWNsO1xuICAgICAgd2ViQWNsSWQgPSB3YWYuYWNsLmF0dHJBcm47XG4gICAgfVxuXG4gICAgY29uc3QgY2ZEaXN0cmlidXRpb24gPSBuZXcgQ2xvdWRGcm9udERpc3RyaWJ1dGlvbih0aGlzLCAnQ2xvdWRGcm9udERpc3RyaWJ1dGlvbicsIHtcbiAgICAgIGRvbWFpbk5hbWU6IHByb3BzLmRvbWFpbk5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24gPz8gcHJvcHMuZG9tYWluTmFtZSxcbiAgICAgIHByaWNlQ2xhc3M6IHByb3BzLmVudlR5cGUsXG4gICAgICBjZXJ0aWZpY2F0ZTogdGhpcy5zc2xDZXJ0aWZpY2F0ZSxcbiAgICAgIGRlZmF1bHRCZWhhdmlvcixcbiAgICAgIHdlYkFjbElkLFxuICAgICAgZXJyb3JSZXNwb25zZXM6IHByb3BzLmVycm9yUmVzcG9uc2VzXG4gICAgfSk7XG4gICAgdGhpcy5jbG91ZEZyb250RGlzdHJpYnV0aW9uID0gY2ZEaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uO1xuXG4gICAgY29uc3QgY2ZBbGlhcyA9IG5ldyBDbG91ZEZyb250QWxpYXModGhpcywgJ0Nsb3VkRnJvbnRBbGlhcycsIHtcbiAgICAgIGRpc3RyaWJ1dGlvbjogY2ZEaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uLFxuICAgICAgZG9tYWluTmFtZTogcHJvcHMuZG9tYWluTmFtZSxcbiAgICAgIGhvc3RlZFpvbmU6IGhvc3RlZFpvbmVcbiAgICB9KTtcbiAgICB0aGlzLmFSZWNvcmQgPSBjZkFsaWFzLmFSZWNvcmQ7XG4gICAgdGhpcy5hYWFhUmVjb3JkID0gY2ZBbGlhcy5hYWFhUmVjb3JkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ3NwQ3N2KHN0cjogc3RyaW5nKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGxpbmVzID0gc3RyLnRyaW0oKS5zcGxpdCgnXFxuJyk7XG4gIGlmIChsaW5lcy5sZW5ndGggPCAxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGhlYWRlcnMgPSBsaW5lc1swXS5zcGxpdCgnLCcpLm1hcChoID0+IGgudHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuICByZXR1cm4gaGVhZGVycy5pbmRleE9mKCdzb3VyY2UnKSAhPT0gLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ3NwQ3N2KGNzdjogc3RyaW5nKTogQ3NwSGVhZGVycyB7XG4gIGNvbnN0IGxpbmVzID0gY3N2LnRyaW0oKS5zcGxpdCgnXFxuJyk7XG4gIGlmIChsaW5lcy5sZW5ndGggPCAxKSByZXR1cm4ge307XG5cbiAgLy8gUGFyc2UgaGVhZGVyIHJvd1xuICBjb25zdCBoZWFkZXJzID0gbGluZXNbMF0uc3BsaXQoJywnKS5tYXAoaCA9PiBoLnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcbiAgY29uc3Qgc291cmNlSW5kZXggPSBoZWFkZXJzLmluZGV4T2YoJ3NvdXJjZScpO1xuXG4gIGlmIChzb3VyY2VJbmRleCA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NTViBtdXN0IGNvbnRhaW4gYSBcInNvdXJjZVwiIGNvbHVtbicpO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0OiBDc3BIZWFkZXJzID0ge307XG5cbiAgLy8gUHJvY2VzcyBkYXRhIHJvd3NcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXS50cmltKCk7XG4gICAgaWYgKCFsaW5lKSBjb250aW51ZTsgLy8gU2tpcCBlbXB0eSBsaW5lc1xuXG4gICAgY29uc3QgdmFsdWVzID0gbGluZS5zcGxpdCgnLCcpLm1hcCh2ID0+IHYudHJpbSgpKTtcbiAgICBjb25zdCBzb3VyY2UgPSB2YWx1ZXNbc291cmNlSW5kZXhdO1xuXG4gICAgaWYgKCFzb3VyY2UpIGNvbnRpbnVlOyAvLyBTa2lwIHJvd3Mgd2l0aCBubyBzb3VyY2VcblxuICAgIC8vIEZvciBlYWNoIGRpcmVjdGl2ZSwgYWRkIHNvdXJjZSBpZiB0aGUgdmFsdWUgaXMgbWFya2VkIHdpdGggJ3gnXG4gICAgaGVhZGVycy5mb3JFYWNoKChoZWFkZXIsIGNvbEluZGV4KSA9PiB7XG4gICAgICBpZiAoaGVhZGVyICE9PSAnc291cmNlJyAmJiB2YWx1ZXNbY29sSW5kZXhdLnRvTG93ZXJDYXNlKCkgPT09ICd4Jykge1xuICAgICAgICBpZiAoIXJlc3VsdFtoZWFkZXIgYXMga2V5b2YgQ3NwSGVhZGVyc10pIHtcbiAgICAgICAgICByZXN1bHRbaGVhZGVyIGFzIGtleW9mIENzcEhlYWRlcnNdID0gW107XG4gICAgICAgIH1cbiAgICAgICAgKHJlc3VsdFtoZWFkZXIgYXMga2V5b2YgQ3NwSGVhZGVyc10gYXMgc3RyaW5nW10pLnB1c2goc291cmNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGNzcEhlYWRlcnNUb1N0cmluZyhoZWFkZXJzOiBDc3BIZWFkZXJzKTogc3RyaW5nIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpXG4gICAgLm1hcCgoW2RpcmVjdGl2ZSwgc291cmNlc10pID0+IGAke2RpcmVjdGl2ZX0gJHtzb3VyY2VzLmpvaW4oJyAnKX07YClcbiAgICAuam9pbignICcpO1xufSJdfQ==
275
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWdsb2JhbC1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zdGFja3Mvd2ViLXN0YXRpYy1zZXJ2ZXJsZXNzL3dlYi1nbG9iYWwtc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBYyxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJN0UsT0FBTyxFQUF5QyxpQkFBaUIsRUFBd0cscUJBQXFCLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUc5USxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3hFLE9BQU8sRUFBK0Isa0JBQWtCLEVBQUUsc0JBQXNCLEVBQTJCLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEosT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUEwQnBFLE1BQU0sT0FBTyxjQUFlLFNBQVEsS0FBSztJQUN2QixjQUFjLENBQWM7SUFDNUIsUUFBUSxDQUFTO0lBQ2pCLGtCQUFrQixDQUFXO0lBQzdCLHNCQUFzQixDQUFlO0lBQ3JDLE1BQU0sQ0FBd0I7SUFDOUIscUJBQXFCLENBQXFDO0lBQzFELE9BQU8sQ0FBVTtJQUNqQixVQUFVLENBQWE7SUFFdkMsWUFBWSxLQUFn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QUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztTQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxTQUFTLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1NBQ25FLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjaywgU3RhY2tQcm9wcywgUGh5c2ljYWxOYW1lLCBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbmltcG9ydCB7IENlcnRpZmljYXRlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXJcIjtcbmltcG9ydCB7IERpc3RyaWJ1dGlvbiwgRXJyb3JSZXNwb25zZSwgRnVuY3Rpb24sIEZ1bmN0aW9uRXZlbnRUeXBlLCBJUmVzcG9uc2VIZWFkZXJzUG9saWN5LCBSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcywgUmVzcG9uc2VTZWN1cml0eUhlYWRlcnNCZWhhdmlvciwgQmVoYXZpb3JPcHRpb25zLCBSZXNwb25zZUhlYWRlcnNQb2xpY3ksIEhlYWRlcnNGcmFtZU9wdGlvbiwgSGVhZGVyc1JlZmVycmVyUG9saWN5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0IHsgQVJlY29yZCwgQWFhYVJlY29yZCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1M1wiO1xuaW1wb3J0IHsgQnVja2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgeyBDZm5XZWJBQ0wgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtd2FmdjInO1xuXG5pbXBvcnQgeyBTU0xDZXJ0aWZpY2F0ZSB9IGZyb20gJy4uLy4uL2NvbnN0cnVjdHMvY2VydGlmaWNhdGVtYW5hZ2VyLmpzJztcbmltcG9ydCB7IENsb3VkRnJvbnRGdW5jdGlvblJlZGlyZWN0cywgQ2xvdWRGcm9udEZ1bmN0aW9uLCBDbG91ZEZyb250RGlzdHJpYnV0aW9uLCBDbG91ZEZyb250RXJyb3JSZXNwb25zZSB9IGZyb20gJy4uLy4uL2NvbnN0cnVjdHMvY2xvdWRmcm9udC5qcyc7XG5pbXBvcnQgeyBnZXRIb3N0ZWRab25lLCBDbG91ZEZyb250QWxpYXMgfSBmcm9tICcuLi8uLi9jb25zdHJ1Y3RzL3JvdXRlNTMuanMnO1xuaW1wb3J0IHsgUzNCdWNrZXQgfSBmcm9tICcuLi8uLi9jb25zdHJ1Y3RzL3MzLmpzJztcbmltcG9ydCB0eXBlIHsgU3NtU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vY29uc3RydWN0cy9zc20udHMnO1xuaW1wb3J0IHsgQ2xvdWRGcm9udFdlYkFjbCB9IGZyb20gJy4uLy4uL2NvbnN0cnVjdHMvd2FmLmpzJztcbmltcG9ydCB7IGRvbWFpbkFzSWQgfSBmcm9tICcuLi8uLi9saWIvdXRpbHMuanMnO1xuaW1wb3J0IHsgYWRkRXZvU3RhY2tUYWdzIH0gZnJvbSAnLi4vLi4vbGliL3RhZ3MudHMnO1xuaW1wb3J0IHsgUzNCdWNrZXRPcmlnaW4gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zJztcbmltcG9ydCB0eXBlIHsgQmFzaWNBdXRoQ3JlZGVudGlhbHMsIENzcERpcmVjdGl2ZSwgQ3NwRGlyZWN0aXZlU291cmNlLCBDc3BIZWFkZXJzLCBDc3BTb3VyY2VIZWFkZXJzLCBDbG91ZEZyb250RnVuY3Rpb25FdmVudFR5cGUsIFVVSUQsIEFXU01hbmFnZWRSZXNwb25zZUhlYWRlcnNQb2xpY3kgfSBmcm9tICcuLi8uLi90eXBlcy5kLnRzJztcblxuZXhwb3J0IGludGVyZmFjZSBXZWJHbG9iYWxTdGFja1Byb3BzIHtcbiAgZW52VHlwZTogJ05PVF9QUk9EJyB8ICdQUk9EJztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGJ1Y2tldE5hbWU/OiBzdHJpbmc7XG4gIGhvc3RlZFpvbmU6IHN0cmluZztcbiAgZG9tYWluTmFtZTogc3RyaW5nO1xuICBiYXNpY0F1dGg/OiBzdHJpbmcgfCBCYXNpY0F1dGhDcmVkZW50aWFscyB8IFNzbVN0cmluZ1BhcmFtZXRlcjtcbiAgY2xvdWRmcm9udEZ1bmN0aW9uPzoge1xuICAgIGNvZGU6IHN0cmluZztcbiAgICBldmVudFR5cGU6IENsb3VkRnJvbnRGdW5jdGlvbkV2ZW50VHlwZVtdO1xuICB9XG4gIHJlZGlyZWN0cz86IENsb3VkRnJvbnRGdW5jdGlvblJlZGlyZWN0cztcbiAgcmVkaXJlY3RzQ3N2UGF0aD86IHN0cmluZztcbiAgLy8gYXR0YWNoV2ViQWNsPzogYm9vbGVhbiB8IHN0cmluZztcbiAgd2ViQWNsPzogYm9vbGVhbiB8IHN0cmluZyB8IFNzbVN0cmluZ1BhcmFtZXRlcjtcbiAgcmVzcG9uc2VIZWFkZXJzUG9saWN5PzogZmFsc2UgfCBBV1NNYW5hZ2VkUmVzcG9uc2VIZWFkZXJzUG9saWN5IHwgVVVJRCB8IFNzbVN0cmluZ1BhcmFtZXRlcjtcbiAgcmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHM/OiBSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcztcbiAgcmVzcG9uc2VDc3BIZWFkZXJzPzogQ3NwSGVhZGVycyB8IENzcFNvdXJjZUhlYWRlcnMgfCBzdHJpbmc7XG4gIGRlc3Ryb3k/OiBib29sZWFuO1xuICB0YWdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgZXJyb3JSZXNwb25zZXM/OiAoQ2xvdWRGcm9udEVycm9yUmVzcG9uc2UgfCBFcnJvclJlc3BvbnNlKVtdO1xufVxuXG5leHBvcnQgY2xhc3MgV2ViR2xvYmFsU3RhY2sgZXh0ZW5kcyBTdGFjayB7XG4gIHB1YmxpYyByZWFkb25seSBzc2xDZXJ0aWZpY2F0ZTogQ2VydGlmaWNhdGU7XG4gIHB1YmxpYyByZWFkb25seSBzM0J1Y2tldDogQnVja2V0O1xuICBwdWJsaWMgcmVhZG9ubHkgY2xvdWRGcm9udEZ1bmN0aW9uOiBGdW5jdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IGNsb3VkRnJvbnREaXN0cmlidXRpb246IERpc3RyaWJ1dGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IHdlYkFjbDogQ2ZuV2ViQUNMIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2VIZWFkZXJzUG9saWN5OiBJUmVzcG9uc2VIZWFkZXJzUG9saWN5IHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgcmVhZG9ubHkgYVJlY29yZDogQVJlY29yZDtcbiAgcHVibGljIHJlYWRvbmx5IGFhYWFSZWNvcmQ6IEFhYWFSZWNvcmQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdlYkdsb2JhbFN0YWNrUHJvcHMgJiBTdGFja1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGRlc2NyaXB0aW9uOiBgJHtwcm9wcy5kZXNjcmlwdGlvbiA/PyBwcm9wcy5zdGFja05hbWUgPz8gJyd9IFdlYiBHbG9iYWwgU3RhY2tgXG4gICAgfSk7XG4gICAgYWRkRXZvU3RhY2tUYWdzKHRoaXMsICdXZWJHbG9iYWxTdGFjaycpO1xuXG4gICAgcHJvcHMuZGVzY3JpcHRpb24gPSBwcm9wcy5kZXNjcmlwdGlvbiA/PyBwcm9wcy5zdGFja05hbWU7XG5cbiAgICBjb25zdCBob3N0ZWRab25lID0gZ2V0SG9zdGVkWm9uZSh0aGlzLCAnZ2V0SG9zdGVkWm9uZScsIHByb3BzLmhvc3RlZFpvbmUpO1xuXG4gICAgY29uc3QgX3NzbENlcnQgPSBuZXcgU1NMQ2VydGlmaWNhdGUodGhpcywgJ1NTTENlcnRpZmljYXRlJywge1xuICAgICAgaG9zdGVkWm9uZTogaG9zdGVkWm9uZSxcbiAgICAgIGRvbWFpbk5hbWU6IHByb3BzLmRvbWFpbk5hbWUsXG4gICAgICBkZXN0cm95OiBwcm9wcy5kZXN0cm95XG4gICAgfSk7XG4gICAgdGhpcy5zc2xDZXJ0aWZpY2F0ZSA9IF9zc2xDZXJ0LmNlcnRpZmljYXRlO1xuXG4gICAgY29uc3QgX3MzQnVja2V0ID0gbmV3IFMzQnVja2V0KHRoaXMsICdTM0J1Y2tldCcsIHtcbiAgICAgIGJ1Y2tldE5hbWU6IHByb3BzLmJ1Y2tldE5hbWUgPz8gUGh5c2ljYWxOYW1lLkdFTkVSQVRFX0lGX05FRURFRCxcbiAgICAgIGRlc3Ryb3k6IHByb3BzLmRlc3Ryb3lcbiAgICB9KTtcbiAgICB0aGlzLnMzQnVja2V0ID0gX3MzQnVja2V0LmJ1Y2tldDtcblxuICAgIGxldCByZXNwb25zZUhlYWRlcnNQb2xpY3k6IElSZXNwb25zZUhlYWRlcnNQb2xpY3kgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3kgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JC9pLnRlc3QocHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5KSkge1xuICAgICAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeSA9IFJlc3BvbnNlSGVhZGVyc1BvbGljeS5mcm9tUmVzcG9uc2VIZWFkZXJzUG9saWN5SWQodGhpcywgJ3Jlc3BvbnNlLWhlYWRlcnMtcG9saWN5LWJ5LWlkJywgcHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3kgPSBSZXNwb25zZUhlYWRlcnNQb2xpY3lbcHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5IGFzIGtleW9mIHR5cGVvZiBSZXNwb25zZUhlYWRlcnNQb2xpY3ldIGFzIElSZXNwb25zZUhlYWRlcnNQb2xpY3kgPz8gUmVzcG9uc2VIZWFkZXJzUG9saWN5LlNFQ1VSSVRZX0hFQURFUlM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5LnBhdGgpIHtcbiAgICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5ID0gUmVzcG9uc2VIZWFkZXJzUG9saWN5LmZyb21SZXNwb25zZUhlYWRlcnNQb2xpY3lJZCh0aGlzLCAncmVzcG9uc2UtaGVhZGVycy1wb2xpY3ktYnktaWQnLCBTdHJpbmdQYXJhbWV0ZXIudmFsdWVGb3JTdHJpbmdQYXJhbWV0ZXIodGhpcywgcHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5LnBhdGgsIHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeS52ZXJzaW9uKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJhc2VIZWFkZXJzQmVoYXZpb3I6IFJlc3BvbnNlU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3IgPSB7XG4gICAgICAgIHN0cmljdFRyYW5zcG9ydFNlY3VyaXR5OiB7XG4gICAgICAgICAgb3ZlcnJpZGU6IHRydWUsXG4gICAgICAgICAgYWNjZXNzQ29udHJvbE1heEFnZTogRHVyYXRpb24uc2Vjb25kcygzMTUzNjAwMClcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudFR5cGVPcHRpb25zOiB7XG4gICAgICAgICAgb3ZlcnJpZGU6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgZnJhbWVPcHRpb25zOiB7XG4gICAgICAgICAgb3ZlcnJpZGU6IHRydWUsXG4gICAgICAgICAgZnJhbWVPcHRpb246IEhlYWRlcnNGcmFtZU9wdGlvbi5TQU1FT1JJR0lOLFxuICAgICAgICB9LFxuICAgICAgICByZWZlcnJlclBvbGljeToge1xuICAgICAgICAgIG92ZXJyaWRlOiB0cnVlLFxuICAgICAgICAgIHJlZmVycmVyUG9saWN5OiBIZWFkZXJzUmVmZXJyZXJQb2xpY3kuU1RSSUNUX09SSUdJTl9XSEVOX0NST1NTX09SSUdJTlxuICAgICAgICB9LFxuICAgICAgICB4c3NQcm90ZWN0aW9uOiB7XG4gICAgICAgICAgb3ZlcnJpZGU6IHRydWUsXG4gICAgICAgICAgcHJvdGVjdGlvbjogdHJ1ZSxcbiAgICAgICAgICBtb2RlQmxvY2s6IHRydWVcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZSA9IGAke2RvbWFpbkFzSWQocHJvcHMuZG9tYWluTmFtZSl9LXJlc3BvbnNlLWhlYWRlcnMtcG9saWN5YDtcbiAgICAgIFxuICAgICAgaWYgKHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzKSB7XG4gICAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeSA9IG5ldyBSZXNwb25zZUhlYWRlcnNQb2xpY3kodGhpcywgJ3Jlc3BvbnNlLWhlYWRlcnMtcG9saWN5Jywge1xuICAgICAgICAgIC4uLmJhc2VIZWFkZXJzQmVoYXZpb3IsXG4gICAgICAgICAgLi4ucHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHMsXG4gICAgICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZTogcHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZSB8fCByZXNwb25zZUhlYWRlcnNQb2xpY3lOYW1lXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChwcm9wcy5yZXNwb25zZUNzcEhlYWRlcnMpIHtcbiAgICAgICAgbGV0IGNzcCA9ICcnO1xuICAgICAgICBpZiAodHlwZW9mIHByb3BzLnJlc3BvbnNlQ3NwSGVhZGVycyA9PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmIChpc0NzcENzdihwcm9wcy5yZXNwb25zZUNzcEhlYWRlcnMpKSB7XG4gICAgICAgICAgICBjc3AgPSBjc3BIZWFkZXJzVG9TdHJpbmcoY3NwU291cmNlSGVhZGVyc1RvQ3NwSGVhZGVycyhwYXJzZUNzcENzdihwcm9wcy5yZXNwb25zZUNzcEhlYWRlcnMpKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNzcCA9IHByb3BzLnJlc3BvbnNlQ3NwSGVhZGVycztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHByb3BzLnJlc3BvbnNlQ3NwSGVhZGVycyBhcyBDc3BIZWFkZXJzIHwgQ3NwU291cmNlSGVhZGVycztcbiAgICAgICAgICBjb25zdCBoZWFkZXJzID0gaXNDc3BTb3VyY2VIZWFkZXJzKG5vcm1hbGl6ZWQpXG4gICAgICAgICAgICA/IGNzcFNvdXJjZUhlYWRlcnNUb0NzcEhlYWRlcnMobm9ybWFsaXplZClcbiAgICAgICAgICAgIDogbm9ybWFsaXplZCBhcyBDc3BIZWFkZXJzO1xuICAgICAgICAgIGNzcCA9IGNzcEhlYWRlcnNUb1N0cmluZyhoZWFkZXJzKTtcbiAgICAgICAgfVxuICAgICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3kgPSBuZXcgUmVzcG9uc2VIZWFkZXJzUG9saWN5KHRoaXMsICdyZXNwb25zZS1oZWFkZXJzLXBvbGljeScsIHtcbiAgICAgICAgICBzZWN1cml0eUhlYWRlcnNCZWhhdmlvcjoge1xuICAgICAgICAgICAgLi4uYmFzZUhlYWRlcnNCZWhhdmlvcixcbiAgICAgICAgICAgIGNvbnRlbnRTZWN1cml0eVBvbGljeToge1xuICAgICAgICAgICAgICBvdmVycmlkZTogdHJ1ZSxcbiAgICAgICAgICAgICAgY29udGVudFNlY3VyaXR5UG9saWN5OiBjc3BcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3lOYW1lXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoeSB0aGUgdGhlIHBvbGljeSBpcyBub3QgZ2V0dGluZyB1cGRhdGVkIGluIHRoZSBDbG91ZEZyb250IGJlaGF2aW9yXG4gICAgdGhpcy5yZXNwb25zZUhlYWRlcnNQb2xpY3kgPSByZXNwb25zZUhlYWRlcnNQb2xpY3k7XG5cbiAgICBjb25zdCBkZWZhdWx0QmVoYXZpb3I6IEJlaGF2aW9yT3B0aW9ucyA9IHtcbiAgICAgIG9yaWdpbjogUzNCdWNrZXRPcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0NvbnRyb2wodGhpcy5zM0J1Y2tldCksXG4gICAgICBmdW5jdGlvbkFzc29jaWF0aW9uczogW10sXG4gICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3k6IHJlc3BvbnNlSGVhZGVyc1BvbGljeSA/PyAocHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5ICE9PSBmYWxzZSA/IFJlc3BvbnNlSGVhZGVyc1BvbGljeS5TRUNVUklUWV9IRUFERVJTIDogdW5kZWZpbmVkKVxuICAgIH07XG5cbiAgICBsZXQgY2ZmbjogQ2xvdWRGcm9udEZ1bmN0aW9uO1xuICAgIGlmIChwcm9wcy5iYXNpY0F1dGgpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMuYmFzaWNBdXRoICE9ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICgocHJvcHMuYmFzaWNBdXRoIGFzIEJhc2ljQXV0aENyZWRlbnRpYWxzKS51c2VyICYmIChwcm9wcy5iYXNpY0F1dGggYXMgQmFzaWNBdXRoQ3JlZGVudGlhbHMpLnBhc3N3b3JkKSB7XG4gICAgICAgICAgcHJvcHMuYmFzaWNBdXRoID0gQnVmZmVyLmZyb20oYCR7KHByb3BzLmJhc2ljQXV0aCBhcyBCYXNpY0F1dGhDcmVkZW50aWFscykudXNlcn06JHsocHJvcHMuYmFzaWNBdXRoIGFzIEJhc2ljQXV0aENyZWRlbnRpYWxzKS5wYXNzd29yZH1gKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgIH0gZWxzZSBpZiAoKHByb3BzLmJhc2ljQXV0aCBhcyBTc21TdHJpbmdQYXJhbWV0ZXIpLnBhdGgpIHtcbiAgICAgICAgICBwcm9wcy5iYXNpY0F1dGggPSBTdHJpbmdQYXJhbWV0ZXIudmFsdWVGb3JTdHJpbmdQYXJhbWV0ZXIodGhpcywgKHByb3BzLmJhc2ljQXV0aCBhcyBTc21TdHJpbmdQYXJhbWV0ZXIpLnBhdGgsIChwcm9wcy5iYXNpY0F1dGggYXMgU3NtU3RyaW5nUGFyYW1ldGVyKS52ZXJzaW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wcy5iYXNpY0F1dGggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByb3BzLmNsb3VkZnJvbnRGdW5jdGlvbikge1xuICAgICAgY2ZmbiA9IENsb3VkRnJvbnRGdW5jdGlvbi5jcmVhdGVGdW5jdGlvbih0aGlzLCBudWxsLCB7XG4gICAgICAgIGNyZWRlbnRpYWxzOiBwcm9wcy5iYXNpY0F1dGgsXG4gICAgICAgIHJlZGlyZWN0czogcHJvcHMucmVkaXJlY3RzLFxuICAgICAgICByZWRpcmVjdHNDc3ZQYXRoOiBwcm9wcy5yZWRpcmVjdHNDc3ZQYXRoLFxuICAgICAgICBjb2RlOiBwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24uY29kZSxcbiAgICAgICAgZGVzdHJveTogcHJvcHMuZGVzdHJveVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5iYXNpY0F1dGgpIHtcbiAgICAgIGNmZm4gPSBDbG91ZEZyb250RnVuY3Rpb24uY3JlYXRlQmFzaWNBdXRoRGVmYXVsdERvYyh0aGlzLCB7XG4gICAgICAgIGNyZWRlbnRpYWxzOiBwcm9wcy5iYXNpY0F1dGgsXG4gICAgICAgIHJlZGlyZWN0czogcHJvcHMucmVkaXJlY3RzLFxuICAgICAgICByZWRpcmVjdHNDc3ZQYXRoOiBwcm9wcy5yZWRpcmVjdHNDc3ZQYXRoLFxuICAgICAgICBkZXN0cm95OiBwcm9wcy5kZXN0cm95XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2ZmbiA9IENsb3VkRnJvbnRGdW5jdGlvbi5jcmVhdGVEZWZhdWx0RG9jKHRoaXMsIHtcbiAgICAgICAgcmVkaXJlY3RzOiBwcm9wcy5yZWRpcmVjdHMsXG4gICAgICAgIHJlZGlyZWN0c0NzdlBhdGg6IHByb3BzLnJlZGlyZWN0c0NzdlBhdGgsXG4gICAgICAgIGRlc3Ryb3k6IHByb3BzLmRlc3Ryb3lcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNsb3VkRnJvbnRGdW5jdGlvbiA9IGNmZm4uZm47XG5cbiAgICAvLyBjb25zdCBldmVudFR5cGVzOiBDbG91ZEZyb250RnVuY3Rpb25FdmVudFR5cGVbXSA9IHByb3BzLmNsb3VkZnJvbnRGdW5jdGlvbj8uZXZlbnRUeXBlICYmIHByb3BzLmNsb3VkZnJvbnRGdW5jdGlvbi5ldmVudFR5cGUubGVuZ3RoID4gMCA/IHByb3BzLmNsb3VkZnJvbnRGdW5jdGlvbi5ldmVudFR5cGUgOiBbJ1ZJRVdFUl9SRVFVRVNUJywgJ1ZJRVdFUl9SRVNQT05TRSddO1xuXG4gICAgbGV0IGV2ZW50VHlwZXM6IENsb3VkRnJvbnRGdW5jdGlvbkV2ZW50VHlwZVtdID0gWydWSUVXRVJfUkVRVUVTVCcsICdWSUVXRVJfUkVTUE9OU0UnXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24/LmV2ZW50VHlwZSkgJiYgcHJvcHMuY2xvdWRmcm9udEZ1bmN0aW9uLmV2ZW50VHlwZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBldHMgPSBwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24uZXZlbnRUeXBlXG4gICAgICAgIC5maWx0ZXIoKHYsIGksIGEpID0+IHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdHlwZW9mIHYgPT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICh2ID09PSAnVklFV0VSX1JFUVVFU1QnIHx8IHYgPT09ICdWSUVXRVJfUkVTUE9OU0UnKSAmJlxuICAgICAgICAgICAgYS5pbmRleE9mKHYpID09PSBpIC8vIGRlZHVwXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICBpZiAoZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXZlbnRUeXBlcyA9IGV0cztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50VHlwZSBvZiBldmVudFR5cGVzKSB7XG4gICAgICBkZWZhdWx0QmVoYXZpb3IuZnVuY3Rpb25Bc3NvY2lhdGlvbnMhLnB1c2goe1xuICAgICAgICBldmVudFR5cGU6IEZ1bmN0aW9uRXZlbnRUeXBlW2V2ZW50VHlwZV0sXG4gICAgICAgIGZ1bmN0aW9uOiB0aGlzLmNsb3VkRnJvbnRGdW5jdGlvblxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIGxldCB3ZWJBY2xJZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgcHJvcHMud2ViQWNsID09ICdzdHJpbmcnICYmIHByb3BzLndlYkFjbC5zdGFydHNXaXRoKCdhcm46YXdzJykpIHtcbiAgICAgIHdlYkFjbElkID0gcHJvcHMud2ViQWNsO1xuICAgIH0gZWxzZSBpZiAoKHByb3BzLndlYkFjbCBhcyBTc21TdHJpbmdQYXJhbWV0ZXIpLnBhdGgpIHtcbiAgICAgIHdlYkFjbElkID0gU3RyaW5nUGFyYW1ldGVyLnZhbHVlRm9yU3RyaW5nUGFyYW1ldGVyKHRoaXMsIChwcm9wcy53ZWJBY2wgYXMgU3NtU3RyaW5nUGFyYW1ldGVyKS5wYXRoLCAocHJvcHMud2ViQWNsIGFzIFNzbVN0cmluZ1BhcmFtZXRlcikudmVyc2lvbik7XG4gICAgfSBlbHNlIGlmIChwcm9wcy53ZWJBY2wgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHdhZiA9IG5ldyBDbG91ZEZyb250V2ViQWNsKHRoaXMsICdDbG91ZEZyb250V2ViQWNsJywge1xuICAgICAgICBuYW1lOiBgJHtkb21haW5Bc0lkKHByb3BzLmRvbWFpbk5hbWUpfWAsXG4gICAgICAgIGRlc3Ryb3k6IHByb3BzLmRlc3Ryb3lcbiAgICAgIH0pO1xuICAgICAgdGhpcy53ZWJBY2wgPSB3YWYuYWNsO1xuICAgICAgd2ViQWNsSWQgPSB3YWYuYWNsLmF0dHJBcm47XG4gICAgfVxuXG4gICAgY29uc3QgY2ZEaXN0cmlidXRpb24gPSBuZXcgQ2xvdWRGcm9udERpc3RyaWJ1dGlvbih0aGlzLCAnQ2xvdWRGcm9udERpc3RyaWJ1dGlvbicsIHtcbiAgICAgIGRvbWFpbk5hbWU6IHByb3BzLmRvbWFpbk5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24gPz8gcHJvcHMuZG9tYWluTmFtZSxcbiAgICAgIHByaWNlQ2xhc3M6IHByb3BzLmVudlR5cGUsXG4gICAgICBjZXJ0aWZpY2F0ZTogdGhpcy5zc2xDZXJ0aWZpY2F0ZSxcbiAgICAgIGRlZmF1bHRCZWhhdmlvcixcbiAgICAgIHdlYkFjbElkLFxuICAgICAgZXJyb3JSZXNwb25zZXM6IHByb3BzLmVycm9yUmVzcG9uc2VzXG4gICAgfSk7XG4gICAgdGhpcy5jbG91ZEZyb250RGlzdHJpYnV0aW9uID0gY2ZEaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uO1xuXG4gICAgY29uc3QgY2ZBbGlhcyA9IG5ldyBDbG91ZEZyb250QWxpYXModGhpcywgJ0Nsb3VkRnJvbnRBbGlhcycsIHtcbiAgICAgIGRpc3RyaWJ1dGlvbjogY2ZEaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uLFxuICAgICAgZG9tYWluTmFtZTogcHJvcHMuZG9tYWluTmFtZSxcbiAgICAgIGhvc3RlZFpvbmU6IGhvc3RlZFpvbmVcbiAgICB9KTtcbiAgICB0aGlzLmFSZWNvcmQgPSBjZkFsaWFzLmFSZWNvcmQ7XG4gICAgdGhpcy5hYWFhUmVjb3JkID0gY2ZBbGlhcy5hYWFhUmVjb3JkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ3NwQ3N2KHN0cjogc3RyaW5nKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGxpbmVzID0gc3RyLnRyaW0oKS5zcGxpdCgnXFxuJyk7XG4gIGlmIChsaW5lcy5sZW5ndGggPCAxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGhlYWRlcnMgPSBsaW5lc1swXS5zcGxpdCgnLCcpLm1hcChoID0+IGgudHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuICByZXR1cm4gaGVhZGVycy5pbmRleE9mKCdzb3VyY2UnKSAhPT0gLTE7XG59XG5cbmZ1bmN0aW9uIGlzQ3NwU291cmNlSGVhZGVycyhoZWFkZXJzOiBDc3BIZWFkZXJzIHwgQ3NwU291cmNlSGVhZGVycyk6IGhlYWRlcnMgaXMgQ3NwU291cmNlSGVhZGVycyB7XG4gIGNvbnN0IENTUF9ESVJFQ1RJVkVTID0gbmV3IFNldChbJ2Nvbm5lY3Qtc3JjJywgJ2RlZmF1bHQtc3JjJywgJ2ZvbnQtc3JjJywgJ2ZyYW1lLXNyYycsICdpbWctc3JjJywgJ21lZGlhLXNyYycsICdvYmplY3Qtc3JjJywgJ3NjcmlwdC1zcmMnLCAnc3R5bGUtc3JjJ10pO1xuICByZXR1cm4gT2JqZWN0LmtleXMoaGVhZGVycykuc29tZShrID0+ICFDU1BfRElSRUNUSVZFUy5oYXMoaykpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNzcENzdihjc3Y6IHN0cmluZyk6IENzcFNvdXJjZUhlYWRlcnMge1xuICBjb25zdCBsaW5lcyA9IGNzdi50cmltKCkuc3BsaXQoJ1xcbicpO1xuICBpZiAobGluZXMubGVuZ3RoIDwgMSkgcmV0dXJuIHt9O1xuXG4gIGNvbnN0IGhlYWRlcnMgPSBsaW5lc1swXS5zcGxpdCgnLCcpLm1hcChoID0+IGgudHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuICBjb25zdCBzb3VyY2VJbmRleCA9IGhlYWRlcnMuaW5kZXhPZignc291cmNlJyk7XG5cbiAgaWYgKHNvdXJjZUluZGV4ID09PSAtMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ1NWIG11c3QgY29udGFpbiBhIFwic291cmNlXCIgY29sdW1uJyk7XG4gIH1cblxuICBjb25zdCByZXN1bHQ6IENzcFNvdXJjZUhlYWRlcnMgPSB7fTtcblxuICBmb3IgKGxldCBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbGluZSA9IGxpbmVzW2ldLnRyaW0oKTtcbiAgICBpZiAoIWxpbmUpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgdmFsdWVzID0gbGluZS5zcGxpdCgnLCcpLm1hcCh2ID0+IHYudHJpbSgpKTtcbiAgICBjb25zdCBzb3VyY2UgPSB2YWx1ZXNbc291cmNlSW5kZXhdIGFzIENzcERpcmVjdGl2ZVNvdXJjZTtcblxuICAgIGlmICghc291cmNlKSBjb250aW51ZTtcblxuICAgIGhlYWRlcnMuZm9yRWFjaCgoaGVhZGVyLCBjb2xJbmRleCkgPT4ge1xuICAgICAgaWYgKGhlYWRlciAhPT0gJ3NvdXJjZScgJiYgdmFsdWVzW2NvbEluZGV4XS50b0xvd2VyQ2FzZSgpID09PSAneCcpIHtcbiAgICAgICAgaWYgKCFyZXN1bHRbc291cmNlXSkge1xuICAgICAgICAgIHJlc3VsdFtzb3VyY2VdID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W3NvdXJjZV0hLnB1c2goaGVhZGVyIGFzIENzcERpcmVjdGl2ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjc3BTb3VyY2VIZWFkZXJzVG9Dc3BIZWFkZXJzKHNvdXJjZUhlYWRlcnM6IENzcFNvdXJjZUhlYWRlcnMpOiBDc3BIZWFkZXJzIHtcbiAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVjb3JkPENzcERpcmVjdGl2ZSwgQ3NwRGlyZWN0aXZlU291cmNlW10+O1xuICBmb3IgKGNvbnN0IFtzb3VyY2UsIGRpcmVjdGl2ZXNdIG9mIE9iamVjdC5lbnRyaWVzKHNvdXJjZUhlYWRlcnMpIGFzIFtDc3BEaXJlY3RpdmVTb3VyY2UsIENzcERpcmVjdGl2ZVtdXVtdKSB7XG4gICAgZm9yIChjb25zdCBkaXJlY3RpdmUgb2YgZGlyZWN0aXZlcykge1xuICAgICAgaWYgKCFyZXN1bHRbZGlyZWN0aXZlXSkge1xuICAgICAgICByZXN1bHRbZGlyZWN0aXZlXSA9IFtdO1xuICAgICAgfVxuICAgICAgcmVzdWx0W2RpcmVjdGl2ZV0ucHVzaChzb3VyY2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjc3BIZWFkZXJzVG9TdHJpbmcoaGVhZGVyczogQ3NwSGVhZGVycyk6IHN0cmluZyB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhoZWFkZXJzKVxuICAgIC5tYXAoKFtkaXJlY3RpdmUsIHNvdXJjZXNdKSA9PiBgJHtkaXJlY3RpdmV9ICR7c291cmNlcy5qb2luKCcgJyl9O2ApXG4gICAgLmpvaW4oJyAnKTtcbn0iXX0=
package/dist/types.d.ts CHANGED
@@ -25,8 +25,9 @@ export interface BasicAuthCredentials {
25
25
  }
26
26
 
27
27
  export type CspDirective = 'connect-src' | 'default-src' | 'font-src' | 'frame-src' | 'img-src' | 'media-src' | 'object-src' | 'script-src' | 'style-src';
28
- export type CspDirectiveValue = "'self'" | "'none'" | "'unsafe-inline'" | "https:";
29
- export type CspHeaders = Partial<Record<CspDirective, CspDirectiveValue[] | string[]>>;
28
+ export type CspDirectiveSource = "'self'" | "'none'" | "'unsafe-inline'" | "https:" | (string & {});
29
+ export type CspHeaders = Partial<Record<CspDirective, CspDirectiveSource[]>>;
30
+ export type CspSourceHeaders = Partial<Record<CspDirectiveSource, CspDirective[]>>;
30
31
 
31
32
  export type AWSManagedResponseHeadersPolicy =
32
33
  'CORS_ALLOW_ALL_ORIGINS' |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inizioevoke/evosynth",
3
- "version": "2.2.6",
3
+ "version": "2.3.1",
4
4
  "author": "",
5
5
  "license": "ISC",
6
6
  "description": "",
package/readme.md CHANGED
@@ -91,7 +91,7 @@ export default async function(): Promise<WebStaticServerlessAppConfig> {
91
91
  ### Example config file - multiple environments
92
92
 
93
93
  ```typescript
94
- // .evosynth.dev.ts
94
+ // .evosynth.ts
95
95
  import { mergeConfigs, type WebStaticServerlessAppConfig, type DeepPartial } from '@inizioevoke/evosynth';
96
96
 
97
97
  const config: DeepPartial<WebStaticServerlessAppConfig> = {
package/samples/csp.ts CHANGED
@@ -1,6 +1,41 @@
1
- import type { CspHeaders } from '@inizioevoke/evosynth/types';
1
+ import type { CspHeaders, CspSourceHeaders } from '@inizioevoke/evosynth/types';
2
2
 
3
- const cspHeaders: CspHeaders = {
3
+ /**
4
+ * You can organize your CSP headers in two ways. Choose one or the other.
5
+ */
6
+
7
+ // Organized by source (like the CSV)
8
+ export const cspSourceHeaders: CspSourceHeaders = {
9
+ "'self'": [
10
+ "default-src",
11
+ "connect-src",
12
+ "font-src",
13
+ "img-src",
14
+ "script-src",
15
+ "style-src"
16
+ ],
17
+ "'unsafe-inline'": [
18
+ "style-src"
19
+ ],
20
+ "data:": [
21
+ "font-src"
22
+ ],
23
+ "p.typekit.net": [
24
+ "img-src",
25
+ "style-src"
26
+ ],
27
+ "performance.typekit.net": [
28
+ "connect-src"
29
+ ],
30
+ "use.typekit.net": [
31
+ "font-src",
32
+ "script-src",
33
+ "style-src"
34
+ ]
35
+ };
36
+
37
+ // Organized by directive (more like the actual header value)
38
+ export const cspHeaders: CspHeaders = {
4
39
  'default-src': [
5
40
  "'self'"
6
41
  ],
@@ -28,5 +63,3 @@ const cspHeaders: CspHeaders = {
28
63
  'use.typekit.net'
29
64
  ]
30
65
  };
31
-
32
- export default cspHeaders;
@@ -1,4 +1,5 @@
1
1
  import { readdir } from 'node:fs/promises';
2
+ import { createInterface } from 'node:readline';
2
3
  import { join, extname } from 'node:path';
3
4
  import { pathToFileURL } from 'node:url';
4
5
  import { register } from 'tsx/esm/api';
@@ -22,7 +23,24 @@ export interface EvosynthAppConfig {
22
23
  export interface EvosynthProps {
23
24
  profile?: string;
24
25
  }
26
+ function confirm(question: string): Promise<boolean> {
27
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
28
+ return new Promise((resolve) => {
29
+ rl.question(question, (answer) => {
30
+ rl.close();
31
+ resolve(answer.trim().toLowerCase() === 'y' || answer.trim().toLowerCase() === 'yes');
32
+ });
33
+ });
34
+ }
35
+
25
36
  export async function evosynth(cmd: CdkCommand, env: string, props: EvosynthProps) {
37
+ if (cmd === 'destroy') {
38
+ const confirmed = await confirm(`Are you sure you want to destroy the "${env}" environment? (y/N) `);
39
+ if (!confirmed) {
40
+ console.log('Destroy cancelled.');
41
+ process.exit(0);
42
+ }
43
+ }
26
44
  const files = await readdir(process.cwd(), { withFileTypes: true });
27
45
 
28
46
  const configFiles = files
@@ -6,7 +6,7 @@ import { IBuildImage } from 'aws-cdk-lib/aws-codebuild';
6
6
  import { CloudFrontErrorResponse, CloudFrontFunctionRedirects } from '../constructs/cloudfront.js';
7
7
  import { CodeBuildImageId, EcrBuildImage, CodeBuildSsmParameter, CodeBuildComputeType, CodeBuildNodeJs, EnvironmentVariables } from '../constructs/codebuild.ts';
8
8
  import type { EvosynthAppConfig, CdkCommand, EvosynthAppType } from './evosynth.ts';
9
- import type { CloudFrontFunctionEventType, CspHeaders, UUID, AWSManagedResponseHeadersPolicy } from '../types.d.ts';
9
+ import type { CloudFrontFunctionEventType, CspHeaders, CspSourceHeaders, UUID, AWSManagedResponseHeadersPolicy } from '../types.d.ts';
10
10
  import { getEnv } from '../index.js';
11
11
  import { WebStaticServerlessStage, WebStaticServerlessStageProps } from '../stages/web-static-serverless-stage.js';
12
12
  import type { DeepPartial } from '../types.d.ts';
@@ -27,7 +27,7 @@ export interface AppConfigCloudFrontProps {
27
27
  responseHeaders?: AWSManagedResponseHeadersPolicy | UUID | false;
28
28
  responseHeadersParam?: string;
29
29
  responseHeadersPolicy?: ResponseHeadersPolicyProps;
30
- cspHeaders?: CspHeaders | string;
30
+ cspHeaders?: CspHeaders | CspSourceHeaders | string;
31
31
  redirects?: CloudFrontFunctionRedirects;
32
32
  function?: string | {
33
33
  code: string;
@@ -17,7 +17,7 @@ import { CloudFrontWebAcl } from '../../constructs/waf.js';
17
17
  import { domainAsId } from '../../lib/utils.js';
18
18
  import { addEvoStackTags } from '../../lib/tags.ts';
19
19
  import { S3BucketOrigin } from 'aws-cdk-lib/aws-cloudfront-origins';
20
- import type { BasicAuthCredentials, CspHeaders, CloudFrontFunctionEventType, UUID, AWSManagedResponseHeadersPolicy } from '../../types.d.ts';
20
+ import type { BasicAuthCredentials, CspDirective, CspDirectiveSource, CspHeaders, CspSourceHeaders, CloudFrontFunctionEventType, UUID, AWSManagedResponseHeadersPolicy } from '../../types.d.ts';
21
21
 
22
22
  export interface WebGlobalStackProps {
23
23
  envType: 'NOT_PROD' | 'PROD';
@@ -36,7 +36,7 @@ export interface WebGlobalStackProps {
36
36
  webAcl?: boolean | string | SsmStringParameter;
37
37
  responseHeadersPolicy?: false | AWSManagedResponseHeadersPolicy | UUID | SsmStringParameter;
38
38
  responseHeadersPolicyProps?: ResponseHeadersPolicyProps;
39
- responseCspHeaders?: CspHeaders | string;
39
+ responseCspHeaders?: CspHeaders | CspSourceHeaders | string;
40
40
  destroy?: boolean;
41
41
  tags?: Record<string, string>;
42
42
  errorResponses?: (CloudFrontErrorResponse | ErrorResponse)[];
@@ -123,14 +123,16 @@ export class WebGlobalStack extends Stack {
123
123
  let csp = '';
124
124
  if (typeof props.responseCspHeaders == 'string') {
125
125
  if (isCspCsv(props.responseCspHeaders)) {
126
- csp = cspHeadersToString(parseCspCsv(props.responseCspHeaders));
126
+ csp = cspHeadersToString(cspSourceHeadersToCspHeaders(parseCspCsv(props.responseCspHeaders)));
127
127
  } else {
128
128
  csp = props.responseCspHeaders;
129
129
  }
130
130
  } else {
131
- csp = Object.entries(props.responseCspHeaders).map(([directive, values]) => {
132
- return `${directive} ${values.join(' ')};`
133
- }).join(' ')
131
+ const normalized = props.responseCspHeaders as CspHeaders | CspSourceHeaders;
132
+ const headers = isCspSourceHeaders(normalized)
133
+ ? cspSourceHeadersToCspHeaders(normalized)
134
+ : normalized as CspHeaders;
135
+ csp = cspHeadersToString(headers);
134
136
  }
135
137
  responseHeadersPolicy = new ResponseHeadersPolicy(this, 'response-headers-policy', {
136
138
  securityHeadersBehavior: {
@@ -260,11 +262,15 @@ function isCspCsv(str: string) {
260
262
  return headers.indexOf('source') !== -1;
261
263
  }
262
264
 
263
- function parseCspCsv(csv: string): CspHeaders {
265
+ function isCspSourceHeaders(headers: CspHeaders | CspSourceHeaders): headers is CspSourceHeaders {
266
+ const CSP_DIRECTIVES = new Set(['connect-src', 'default-src', 'font-src', 'frame-src', 'img-src', 'media-src', 'object-src', 'script-src', 'style-src']);
267
+ return Object.keys(headers).some(k => !CSP_DIRECTIVES.has(k));
268
+ }
269
+
270
+ function parseCspCsv(csv: string): CspSourceHeaders {
264
271
  const lines = csv.trim().split('\n');
265
272
  if (lines.length < 1) return {};
266
273
 
267
- // Parse header row
268
274
  const headers = lines[0].split(',').map(h => h.trim().toLowerCase());
269
275
  const sourceIndex = headers.indexOf('source');
270
276
 
@@ -272,25 +278,23 @@ function parseCspCsv(csv: string): CspHeaders {
272
278
  throw new Error('CSV must contain a "source" column');
273
279
  }
274
280
 
275
- const result: CspHeaders = {};
281
+ const result: CspSourceHeaders = {};
276
282
 
277
- // Process data rows
278
283
  for (let i = 1; i < lines.length; i++) {
279
284
  const line = lines[i].trim();
280
- if (!line) continue; // Skip empty lines
285
+ if (!line) continue;
281
286
 
282
287
  const values = line.split(',').map(v => v.trim());
283
- const source = values[sourceIndex];
288
+ const source = values[sourceIndex] as CspDirectiveSource;
284
289
 
285
- if (!source) continue; // Skip rows with no source
290
+ if (!source) continue;
286
291
 
287
- // For each directive, add source if the value is marked with 'x'
288
292
  headers.forEach((header, colIndex) => {
289
293
  if (header !== 'source' && values[colIndex].toLowerCase() === 'x') {
290
- if (!result[header as keyof CspHeaders]) {
291
- result[header as keyof CspHeaders] = [];
294
+ if (!result[source]) {
295
+ result[source] = [];
292
296
  }
293
- (result[header as keyof CspHeaders] as string[]).push(source);
297
+ result[source]!.push(header as CspDirective);
294
298
  }
295
299
  });
296
300
  }
@@ -298,6 +302,19 @@ function parseCspCsv(csv: string): CspHeaders {
298
302
  return result;
299
303
  }
300
304
 
305
+ function cspSourceHeadersToCspHeaders(sourceHeaders: CspSourceHeaders): CspHeaders {
306
+ const result = {} as Record<CspDirective, CspDirectiveSource[]>;
307
+ for (const [source, directives] of Object.entries(sourceHeaders) as [CspDirectiveSource, CspDirective[]][]) {
308
+ for (const directive of directives) {
309
+ if (!result[directive]) {
310
+ result[directive] = [];
311
+ }
312
+ result[directive].push(source);
313
+ }
314
+ }
315
+ return result;
316
+ }
317
+
301
318
  function cspHeadersToString(headers: CspHeaders): string {
302
319
  return Object.entries(headers)
303
320
  .map(([directive, sources]) => `${directive} ${sources.join(' ')};`)
package/src/types.d.ts CHANGED
@@ -25,8 +25,9 @@ export interface BasicAuthCredentials {
25
25
  }
26
26
 
27
27
  export type CspDirective = 'connect-src' | 'default-src' | 'font-src' | 'frame-src' | 'img-src' | 'media-src' | 'object-src' | 'script-src' | 'style-src';
28
- export type CspDirectiveValue = "'self'" | "'none'" | "'unsafe-inline'" | "https:";
29
- export type CspHeaders = Partial<Record<CspDirective, CspDirectiveValue[] | string[]>>;
28
+ export type CspDirectiveSource = "'self'" | "'none'" | "'unsafe-inline'" | "https:" | (string & {});
29
+ export type CspHeaders = Partial<Record<CspDirective, CspDirectiveSource[]>>;
30
+ export type CspSourceHeaders = Partial<Record<CspDirectiveSource, CspDirective[]>>;
30
31
 
31
32
  export type AWSManagedResponseHeadersPolicy =
32
33
  'CORS_ALLOW_ALL_ORIGINS' |