@inizioevoke/evosynth 1.7.0 → 1.8.0

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.
@@ -73,6 +73,10 @@ export class CodeBuildPipelineProject extends Construct {
73
73
  s3Bucket.grantReadWrite(this.project);
74
74
  }
75
75
  if (props.ssmParameters) {
76
+ // dedup
77
+ props.ssmParameters = props.ssmParameters.filter((v, i, a) => {
78
+ return a.findIndex(p => p.path === v.path) === i;
79
+ });
76
80
  for (const param of props.ssmParameters) {
77
81
  let strParam;
78
82
  if (param.encrypted) {
@@ -92,4 +96,4 @@ export class CodeBuildPipelineProject extends Construct {
92
96
  }
93
97
  }
94
98
  }
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZWJ1aWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0cnVjdHMvY29kZWJ1aWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2QyxPQUFPLEVBQWdDLFNBQVMsRUFBRSxXQUFXLEVBQWUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2hKLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBb0IsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFeEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBd0I3QyxNQUFNLE9BQU8sd0JBQXlCLFNBQVEsU0FBUztJQUNyQyxPQUFPLENBQWtCO0lBRXpDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBb0M7UUFDNUUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDaEMsS0FBSyxDQUFDLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMseUJBQXlCLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUM5RixLQUFLLENBQUMsb0JBQW9CLENBQUMsMEJBQTBCLEdBQUc7Z0JBQ3RELEtBQUssRUFBRSxLQUFLLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcs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QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlbW92YWxQb2xpY3kgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlVHlwZSwgQnVpbGRTcGVjLCBDb21wdXRlVHlwZSwgSUJ1aWxkSW1hZ2UsIExpbnV4QnVpbGRJbWFnZSwgUGlwZWxpbmVQcm9qZWN0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVidWlsZCc7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3JcIjtcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgQnVja2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IElTdHJpbmdQYXJhbWV0ZXIsIFN0cmluZ1BhcmFtZXRlciB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zc20nO1xuaW1wb3J0IHR5cGUgeyBTc21TdHJpbmdQYXJhbWV0ZXIgfSBmcm9tIFwiLi9zc20udHNcIjtcbmltcG9ydCB7IHRhZ1Jlc291cmNlIH0gZnJvbSBcIi4uL2xpYi90YWdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlUHJvcHMgfSBmcm9tIFwiLi4vdHlwZXMuZC50c1wiO1xuXG5leHBvcnQgdHlwZSBFbnZpcm9ubWVudFZhcmlhYmxlcyA9IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IGFueSwgdHlwZT86IEJ1aWxkRW52aXJvbm1lbnRWYXJpYWJsZVR5cGUgfT47XG5cbmludGVyZmFjZSBTc21QYXJhbWV0ZXIgZXh0ZW5kcyBTc21TdHJpbmdQYXJhbWV0ZXIge1xuICBlbmNyeXB0ZWQ/OiBib29sZWFuO1xufVxuZXhwb3J0IGludGVyZmFjZSBFY3JCdWlsZEltYWdlIHtcbiAgcmVwb3NpdG9yeTogc3RyaW5nO1xuICB0YWc6IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUJ1aWxkUGlwZWxpbmVQcm9qZWN0UHJvcHMgZXh0ZW5kcyBSZXNvdXJjZVByb3BzIHtcbiAgcHJvamVjdE5hbWU/OiBzdHJpbmc7XG4gIGJ1aWxkU3BlYz86IHN0cmluZyB8IG9iamVjdDtcbiAgYnVpbGRJbWFnZT86ICgnU1RBTkRBUkRfNV8wJyB8ICdTVEFOREFSRF82XzAnIHwgJ1NUQU5EQVJEXzdfMCcpIHwgSUJ1aWxkSW1hZ2U7XG4gIGVjckJ1aWxkSW1hZ2U/OiBFY3JCdWlsZEltYWdlLFxuICBjb21wdXRlVHlwZT86ICgnU01BTEwnIHwgJ01FRElVTScgfCAnTEFSR0UnIHwgJ1hfTEFSR0UnIHwgJ1gyX0xBUkdFJykgfCBzdHJpbmc7XG4gIGVudmlyb25tZW50VmFyaWFibGVzPzogRW52aXJvbm1lbnRWYXJpYWJsZXM7XG4gIGNsb3VkRnJvbnREaXN0cmlidXRpb25Bcm4/OiBzdHJpbmc7XG4gIHMzQnVja2V0TmFtZT86IHN0cmluZztcbiAgc3NtUGFyYW1ldGVycz86IFNzbVBhcmFtZXRlcltdO1xufVxuXG5leHBvcnQgY2xhc3MgQ29kZUJ1aWxkUGlwZWxpbmVQcm9qZWN0IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHByb2plY3Q6IFBpcGVsaW5lUHJvamVjdDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ29kZUJ1aWxkUGlwZWxpbmVQcm9qZWN0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgaWYgKCFwcm9wcy5lbnZpcm9ubWVudFZhcmlhYmxlcykge1xuICAgICAgcHJvcHMuZW52aXJvbm1lbnRWYXJpYWJsZXMgPSB7fTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmNsb3VkRnJvbnREaXN0cmlidXRpb25Bcm4gJiYgIXByb3BzLmVudmlyb25tZW50VmFyaWFibGVzLkNMT1VERlJPTlRfRElTVFJJQlVUSU9OX0lEKSB7XG4gICAgICBwcm9wcy5lbnZpcm9ubWVudFZhcmlhYmxlcy5DTE9VREZST05UX0RJU1RSSUJVVElPTl9JRCA9IHtcbiAgICAgICAgdmFsdWU6IHByb3BzLmNsb3VkRnJvbnREaXN0cmlidXRpb25Bcm4uc3BsaXQoJy8nKS5wb3AoKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuczNCdWNrZXROYW1lICYmICFwcm9wcy5lbnZpcm9ubWVudFZhcmlhYmxlcy5TM19CVUNLRVRfTkFNRSkge1xuICAgICAgcHJvcHMuZW52aXJvbm1lbnRWYXJpYWJsZXMuUzNfQlVDS0VUX05BTUUgPSB7XG4gICAgICAgIHZhbHVlOiBwcm9wcy5zM0J1Y2tldE5hbWVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IGJ1aWxkSW1hZ2U6IElCdWlsZEltYWdlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmIChwcm9wcy5lY3JCdWlsZEltYWdlKSB7XG4gICAgICBjb25zdCByZXBvc2l0b3J5ID0gcHJvcHMuZWNyQnVpbGRJbWFnZS5yZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2Fybjphd3MnKSA/IFxuICAgICAgICBSZXBvc2l0b3J5LmZyb21SZXBvc2l0b3J5QXJuKHRoaXMsICdFY3JSZXBvc2l0b3J5JywgcHJvcHMuZWNyQnVpbGRJbWFnZS5yZXBvc2l0b3J5KSA6XG4gICAgICAgIFJlcG9zaXRvcnkuZnJvbVJlcG9zaXRvcnlOYW1lKHRoaXMsICdFY3JSZXBvc2l0b3J5JywgcHJvcHMuZWNyQnVpbGRJbWFnZS5yZXBvc2l0b3J5KTtcbiAgICAgIGJ1aWxkSW1hZ2UgPSBMaW51eEJ1aWxkSW1hZ2UuZnJvbUVjclJlcG9zaXRvcnkocmVwb3NpdG9yeSwgcHJvcHMuZWNyQnVpbGRJbWFnZS50YWcpO1xuICAgIH0gZWxzZSBpZiAocHJvcHMuYnVpbGRJbWFnZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wcy5idWlsZEltYWdlID09ICdzdHJpbmcnKSB7XG4gICAgICAgIGJ1aWxkSW1hZ2UgPSBMaW51eEJ1aWxkSW1hZ2VbcHJvcHMuYnVpbGRJbWFnZSA/PyAnU1RBTkRBUkRfN18wJ11cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1aWxkSW1hZ2UgPSBwcm9wcy5idWlsZEltYWdlIGFzIElCdWlsZEltYWdlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucHJvamVjdCA9IG5ldyBQaXBlbGluZVByb2plY3QodGhpcywgJ0NvZGVCdWlsZFBpcGVsaW5lUHJvamVjdFByb3BzJywge1xuICAgICAgcHJvamVjdE5hbWU6IHByb3BzLnByb2plY3ROYW1lLFxuICAgICAgYnVpbGRTcGVjOiBwcm9wcy5idWlsZFNwZWMgPyB0eXBlb2YgcHJvcHMuYnVpbGRTcGVjID09ICdvYmplY3QnID8gQnVpbGRTcGVjLmZyb21PYmplY3RUb1lhbWwocHJvcHMuYnVpbGRTcGVjKSA6IEJ1aWxkU3BlYy5mcm9tU291cmNlRmlsZW5hbWUocHJvcHMuYnVpbGRTcGVjID8/ICdidWlsZHNwZWMueW1sJykgOiB1bmRlZmluZWQsXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBidWlsZEltYWdlOiBidWlsZEltYWdlID8/IExpbnV4QnVpbGRJbWFnZS5TVEFOREFSRF83XzAsXG4gICAgICAgIGNvbXB1dGVUeXBlOiBDb21wdXRlVHlwZVtwcm9wcy5jb21wdXRlVHlwZSBhcyAoa2V5b2YgdHlwZW9mIENvbXB1dGVUeXBlIHwgdW5kZWZpbmVkKSA/PyAnU01BTEwnXSxcbiAgICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IHByb3BzLmVudmlyb25tZW50VmFyaWFibGVzXG4gICAgICB9XG4gICAgfSk7XG4gICAgdGFnUmVzb3VyY2UodGhpcy5wcm9qZWN0LCBwcm9wcy50YWdzKTtcbiAgICBpZiAodHlwZW9mIHByb3BzLmRlc3Ryb3kgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aGlzLnByb2plY3QuYXBwbHlSZW1vdmFsUG9saWN5KHByb3BzLmRlc3Ryb3kgPyBSZW1vdmFsUG9saWN5LkRFU1RST1kgOiBSZW1vdmFsUG9saWN5LlJFVEFJTik7XG4gICAgfVxuXG4gICAgLy8gQWRkIENsb3VkV2F0Y2ggbG9nIHBlcm1pc3Npb25zXG4gICAgdGhpcy5wcm9qZWN0LmFkZFRvUm9sZVBvbGljeShuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgJ2xvZ3M6Q3JlYXRlTG9nR3JvdXAnLFxuICAgICAgICAnbG9nczpDcmVhdGVMb2dTdHJlYW0nLFxuICAgICAgICAnbG9nczpQdXRMb2dFdmVudHMnXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbdGhpcy5wcm9qZWN0LnByb2plY3RBcm5dXG4gICAgfSkpO1xuXG4gICAgLy8gQWxsb3cgdGhlIHByb2plY3QgdG8gY3JlYXRlIGFuIGludmFsaWRhdGlvblxuICAgIGlmIChwcm9wcy5jbG91ZEZyb250RGlzdHJpYnV0aW9uQXJuKSB7XG4gICAgICB0aGlzLnByb2plY3QuYWRkVG9Sb2xlUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbJ2Nsb3VkZnJvbnQ6Q3JlYXRlSW52YWxpZGF0aW9uJ10sXG4gICAgICAgIHJlc291cmNlczogW3Byb3BzLmNsb3VkRnJvbnREaXN0cmlidXRpb25Bcm5dXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8gQWxsb3cgdGhlIHByb2plY3QgdG8gc3luYyBmaWxlcyB0byBTM1xuICAgIGlmIChwcm9wcy5zM0J1Y2tldE5hbWUpIHtcbiAgICAgIGNvbnN0IHMzQnVja2V0ID0gQnVja2V0LmZyb21CdWNrZXROYW1lKHRoaXMsICdTM0J1Y2tldEJ5TmFtZScsIHByb3BzLnMzQnVja2V0TmFtZSk7XG4gICAgICBzM0J1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLnByb2plY3QpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5zc21QYXJhbWV0ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHByb3BzLnNzbVBhcmFtZXRlcnMpIHtcbiAgICAgICAgbGV0IHN0clBhcmFtOiBJU3RyaW5nUGFyYW1ldGVyO1xuICAgICAgICBpZiAocGFyYW0uZW5jcnlwdGVkKSB7XG4gICAgICAgICAgc3RyUGFyYW0gPSBTdHJpbmdQYXJhbWV0ZXIuZnJvbVNlY3VyZVN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXModGhpcywgcGFyYW0ucGF0aCwge1xuICAgICAgICAgICAgcGFyYW1ldGVyTmFtZTogcGFyYW0ucGF0aCxcbiAgICAgICAgICAgIHZlcnNpb246IHBhcmFtLnZlcnNpb25cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHJQYXJhbSA9IFN0cmluZ1BhcmFtZXRlci5mcm9tU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlcyh0aGlzLCBwYXJhbS5wYXRoLCB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJOYW1lOiBwYXJhbS5wYXRoLFxuICAgICAgICAgICAgdmVyc2lvbjogcGFyYW0udmVyc2lvblxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHN0clBhcmFtLmdyYW50UmVhZCh0aGlzLnByb2plY3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSJdfQ==
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZWJ1aWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0cnVjdHMvY29kZWJ1aWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2QyxPQUFPLEVBQWdDLFNBQVMsRUFBRSxXQUFXLEVBQWUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2hKLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBb0IsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFeEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBd0I3QyxNQUFNLE9BQU8sd0JBQXlCLFNBQVEsU0FBUztJQUNyQyxPQUFPLENBQWtCO0lBRXpDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBb0M7UUFDNUUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDaEMsS0FBSyxDQUFDLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMseUJBQXlCLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUM5RixLQUFLLENBQUMsb0JBQW9CLENBQUMsMEJBQTBCLEdBQUc7Z0JBQ3RELEtBQUssRUFBRSxLQUFLLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcs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TCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sUUFBUSxHQUFHLGVBQWUsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRTt3QkFDekUsYUFBYSxFQUFFLEtBQUssQ0FBQyxJQUFJO3dCQUN6QixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87cUJBQ3ZCLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUNELFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25DLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVtb3ZhbFBvbGljeSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBCdWlsZEVudmlyb25tZW50VmFyaWFibGVUeXBlLCBCdWlsZFNwZWMsIENvbXB1dGVUeXBlLCBJQnVpbGRJbWFnZSwgTGludXhCdWlsZEltYWdlLCBQaXBlbGluZVByb2plY3QgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29kZWJ1aWxkJztcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjclwiO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgSVN0cmluZ1BhcmFtZXRlciwgU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgdHlwZSB7IFNzbVN0cmluZ1BhcmFtZXRlciB9IGZyb20gXCIuL3NzbS50c1wiO1xuaW1wb3J0IHsgdGFnUmVzb3VyY2UgfSBmcm9tIFwiLi4vbGliL3RhZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VQcm9wcyB9IGZyb20gXCIuLi90eXBlcy5kLnRzXCI7XG5cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50VmFyaWFibGVzID0gUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogYW55LCB0eXBlPzogQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlVHlwZSB9PjtcblxuaW50ZXJmYWNlIFNzbVBhcmFtZXRlciBleHRlbmRzIFNzbVN0cmluZ1BhcmFtZXRlciB7XG4gIGVuY3J5cHRlZD86IGJvb2xlYW47XG59XG5leHBvcnQgaW50ZXJmYWNlIEVjckJ1aWxkSW1hZ2Uge1xuICByZXBvc2l0b3J5OiBzdHJpbmc7XG4gIHRhZzogc3RyaW5nO1xufVxuZXhwb3J0IGludGVyZmFjZSBDb2RlQnVpbGRQaXBlbGluZVByb2plY3RQcm9wcyBleHRlbmRzIFJlc291cmNlUHJvcHMge1xuICBwcm9qZWN0TmFtZT86IHN0cmluZztcbiAgYnVpbGRTcGVjPzogc3RyaW5nIHwgb2JqZWN0O1xuICBidWlsZEltYWdlPzogKCdTVEFOREFSRF81XzAnIHwgJ1NUQU5EQVJEXzZfMCcgfCAnU1RBTkRBUkRfN18wJykgfCBJQnVpbGRJbWFnZTtcbiAgZWNyQnVpbGRJbWFnZT86IEVjckJ1aWxkSW1hZ2UsXG4gIGNvbXB1dGVUeXBlPzogKCdTTUFMTCcgfCAnTUVESVVNJyB8ICdMQVJHRScgfCAnWF9MQVJHRScgfCAnWDJfTEFSR0UnKSB8IHN0cmluZztcbiAgZW52aXJvbm1lbnRWYXJpYWJsZXM/OiBFbnZpcm9ubWVudFZhcmlhYmxlcztcbiAgY2xvdWRGcm9udERpc3RyaWJ1dGlvbkFybj86IHN0cmluZztcbiAgczNCdWNrZXROYW1lPzogc3RyaW5nO1xuICBzc21QYXJhbWV0ZXJzPzogU3NtUGFyYW1ldGVyW107XG59XG5cbmV4cG9ydCBjbGFzcyBDb2RlQnVpbGRQaXBlbGluZVByb2plY3QgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvamVjdDogUGlwZWxpbmVQcm9qZWN0O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDb2RlQnVpbGRQaXBlbGluZVByb2plY3RQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAoIXByb3BzLmVudmlyb25tZW50VmFyaWFibGVzKSB7XG4gICAgICBwcm9wcy5lbnZpcm9ubWVudFZhcmlhYmxlcyA9IHt9O1xuICAgIH1cbiAgICBpZiAocHJvcHMuY2xvdWRGcm9udERpc3RyaWJ1dGlvbkFybiAmJiAhcHJvcHMuZW52aXJvbm1lbnRWYXJpYWJsZXMuQ0xPVURGUk9OVF9ESVNUUklCVVRJT05fSUQpIHtcbiAgICAgIHByb3BzLmVudmlyb25tZW50VmFyaWFibGVzLkNMT1VERlJPTlRfRElTVFJJQlVUSU9OX0lEID0ge1xuICAgICAgICB2YWx1ZTogcHJvcHMuY2xvdWRGcm9udERpc3RyaWJ1dGlvbkFybi5zcGxpdCgnLycpLnBvcCgpXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5zM0J1Y2tldE5hbWUgJiYgIXByb3BzLmVudmlyb25tZW50VmFyaWFibGVzLlMzX0JVQ0tFVF9OQU1FKSB7XG4gICAgICBwcm9wcy5lbnZpcm9ubWVudFZhcmlhYmxlcy5TM19CVUNLRVRfTkFNRSA9IHtcbiAgICAgICAgdmFsdWU6IHByb3BzLnMzQnVja2V0TmFtZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgYnVpbGRJbWFnZTogSUJ1aWxkSW1hZ2UgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHByb3BzLmVjckJ1aWxkSW1hZ2UpIHtcbiAgICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBwcm9wcy5lY3JCdWlsZEltYWdlLnJlcG9zaXRvcnkuc3RhcnRzV2l0aCgnYXJuOmF3cycpID8gXG4gICAgICAgIFJlcG9zaXRvcnkuZnJvbVJlcG9zaXRvcnlBcm4odGhpcywgJ0VjclJlcG9zaXRvcnknLCBwcm9wcy5lY3JCdWlsZEltYWdlLnJlcG9zaXRvcnkpIDpcbiAgICAgICAgUmVwb3NpdG9yeS5mcm9tUmVwb3NpdG9yeU5hbWUodGhpcywgJ0VjclJlcG9zaXRvcnknLCBwcm9wcy5lY3JCdWlsZEltYWdlLnJlcG9zaXRvcnkpO1xuICAgICAgYnVpbGRJbWFnZSA9IExpbnV4QnVpbGRJbWFnZS5mcm9tRWNyUmVwb3NpdG9yeShyZXBvc2l0b3J5LCBwcm9wcy5lY3JCdWlsZEltYWdlLnRhZyk7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5idWlsZEltYWdlKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BzLmJ1aWxkSW1hZ2UgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgYnVpbGRJbWFnZSA9IExpbnV4QnVpbGRJbWFnZVtwcm9wcy5idWlsZEltYWdlID8/ICdTVEFOREFSRF83XzAnXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVpbGRJbWFnZSA9IHByb3BzLmJ1aWxkSW1hZ2UgYXMgSUJ1aWxkSW1hZ2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wcm9qZWN0ID0gbmV3IFBpcGVsaW5lUHJvamVjdCh0aGlzLCAnQ29kZUJ1aWxkUGlwZWxpbmVQcm9qZWN0UHJvcHMnLCB7XG4gICAgICBwcm9qZWN0TmFtZTogcHJvcHMucHJvamVjdE5hbWUsXG4gICAgICBidWlsZFNwZWM6IHByb3BzLmJ1aWxkU3BlYyA/IHR5cGVvZiBwcm9wcy5idWlsZFNwZWMgPT0gJ29iamVjdCcgPyBCdWlsZFNwZWMuZnJvbU9iamVjdFRvWWFtbChwcm9wcy5idWlsZFNwZWMpIDogQnVpbGRTcGVjLmZyb21Tb3VyY2VGaWxlbmFtZShwcm9wcy5idWlsZFNwZWMgPz8gJ2J1aWxkc3BlYy55bWwnKSA6IHVuZGVmaW5lZCxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIGJ1aWxkSW1hZ2U6IGJ1aWxkSW1hZ2UgPz8gTGludXhCdWlsZEltYWdlLlNUQU5EQVJEXzdfMCxcbiAgICAgICAgY29tcHV0ZVR5cGU6IENvbXB1dGVUeXBlW3Byb3BzLmNvbXB1dGVUeXBlIGFzIChrZXlvZiB0eXBlb2YgQ29tcHV0ZVR5cGUgfCB1bmRlZmluZWQpID8/ICdTTUFMTCddLFxuICAgICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczogcHJvcHMuZW52aXJvbm1lbnRWYXJpYWJsZXNcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0YWdSZXNvdXJjZSh0aGlzLnByb2plY3QsIHByb3BzLnRhZ3MpO1xuICAgIGlmICh0eXBlb2YgcHJvcHMuZGVzdHJveSA9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRoaXMucHJvamVjdC5hcHBseVJlbW92YWxQb2xpY3kocHJvcHMuZGVzdHJveSA/IFJlbW92YWxQb2xpY3kuREVTVFJPWSA6IFJlbW92YWxQb2xpY3kuUkVUQUlOKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgQ2xvdWRXYXRjaCBsb2cgcGVybWlzc2lvbnNcbiAgICB0aGlzLnByb2plY3QuYWRkVG9Sb2xlUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICAnbG9nczpDcmVhdGVMb2dHcm91cCcsXG4gICAgICAgICdsb2dzOkNyZWF0ZUxvZ1N0cmVhbScsXG4gICAgICAgICdsb2dzOlB1dExvZ0V2ZW50cydcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZXM6IFt0aGlzLnByb2plY3QucHJvamVjdEFybl1cbiAgICB9KSk7XG5cbiAgICAvLyBBbGxvdyB0aGUgcHJvamVjdCB0byBjcmVhdGUgYW4gaW52YWxpZGF0aW9uXG4gICAgaWYgKHByb3BzLmNsb3VkRnJvbnREaXN0cmlidXRpb25Bcm4pIHtcbiAgICAgIHRoaXMucHJvamVjdC5hZGRUb1JvbGVQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFsnY2xvdWRmcm9udDpDcmVhdGVJbnZhbGlkYXRpb24nXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbcHJvcHMuY2xvdWRGcm9udERpc3RyaWJ1dGlvbkFybl1cbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvLyBBbGxvdyB0aGUgcHJvamVjdCB0byBzeW5jIGZpbGVzIHRvIFMzXG4gICAgaWYgKHByb3BzLnMzQnVja2V0TmFtZSkge1xuICAgICAgY29uc3QgczNCdWNrZXQgPSBCdWNrZXQuZnJvbUJ1Y2tldE5hbWUodGhpcywgJ1MzQnVja2V0QnlOYW1lJywgcHJvcHMuczNCdWNrZXROYW1lKTtcbiAgICAgIHMzQnVja2V0LmdyYW50UmVhZFdyaXRlKHRoaXMucHJvamVjdCk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnNzbVBhcmFtZXRlcnMpIHtcbiAgICAgIC8vIGRlZHVwXG4gICAgICBwcm9wcy5zc21QYXJhbWV0ZXJzID0gcHJvcHMuc3NtUGFyYW1ldGVycy5maWx0ZXIoKHYsIGksIGEpID0+IHtcbiAgICAgICAgcmV0dXJuIGEuZmluZEluZGV4KHAgPT4gcC5wYXRoID09PSB2LnBhdGgpID09PSBpO1xuICAgICAgfSk7XG4gICAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHByb3BzLnNzbVBhcmFtZXRlcnMpIHtcbiAgICAgICAgbGV0IHN0clBhcmFtOiBJU3RyaW5nUGFyYW1ldGVyO1xuICAgICAgICBpZiAocGFyYW0uZW5jcnlwdGVkKSB7XG4gICAgICAgICAgc3RyUGFyYW0gPSBTdHJpbmdQYXJhbWV0ZXIuZnJvbVNlY3VyZVN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXModGhpcywgcGFyYW0ucGF0aCwge1xuICAgICAgICAgICAgcGFyYW1ldGVyTmFtZTogcGFyYW0ucGF0aCxcbiAgICAgICAgICAgIHZlcnNpb246IHBhcmFtLnZlcnNpb25cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHJQYXJhbSA9IFN0cmluZ1BhcmFtZXRlci5mcm9tU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlcyh0aGlzLCBwYXJhbS5wYXRoLCB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJOYW1lOiBwYXJhbS5wYXRoLFxuICAgICAgICAgICAgdmVyc2lvbjogcGFyYW0udmVyc2lvblxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHN0clBhcmFtLmdyYW50UmVhZCh0aGlzLnByb2plY3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSJdfQ==
@@ -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 } from '../../constructs/cloudfront.js';
9
9
  import type { SsmStringParameter } from '../../constructs/ssm.ts';
10
- import type { BasicAuthCredentials } from '../../types.d.ts';
10
+ import type { BasicAuthCredentials, CspHeaders } from '../../types.d.ts';
11
11
  type AWSManagedResponseHeadersPolicy = 'CORS_ALLOW_ALL_ORIGINS' | 'CORS_ALLOW_ALL_ORIGINS_AND_SECURITY_HEADERS' | 'CORS_ALLOW_ALL_ORIGINS_WITH_PREFLIGHT' | 'CORS_ALLOW_ALL_ORIGINS_WITH_PREFLIGHT_AND_SECURITY_HEADERS' | 'SECURITY_HEADERS';
12
12
  type UUID = `${string}-${string}-${string}-${string}-${string}`;
13
13
  type CloudFrontFunctionEventType = keyof typeof FunctionEventType;
@@ -25,8 +25,9 @@ export interface WebGlobalStackProps {
25
25
  redirects?: CloudFrontFunctionRedirects;
26
26
  redirectsCsvPath?: string;
27
27
  webAcl?: boolean | string | SsmStringParameter;
28
- responseHeadersPolicy?: false | AWSManagedResponseHeadersPolicy | UUID | SsmStringParameter;
28
+ responseHeadersPolicy?: false | AWSManagedResponseHeadersPolicy | 'NONE' | UUID | SsmStringParameter;
29
29
  responseHeadersPolicyProps?: ResponseHeadersPolicyProps;
30
+ responseCspHeaders?: CspHeaders;
30
31
  destroy?: boolean;
31
32
  tags?: Record<string, string>;
32
33
  }
@@ -34,24 +34,69 @@ export class WebGlobalStack extends Stack {
34
34
  });
35
35
  this.s3Bucket = _s3Bucket.bucket;
36
36
  let responseHeadersPolicy = undefined;
37
- if (props.responseHeadersPolicy) {
38
- if (typeof props.responseHeadersPolicy == 'string') {
39
- if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(props.responseHeadersPolicy)) {
40
- responseHeadersPolicy = ResponseHeadersPolicy.fromResponseHeadersPolicyId(this, 'response-headers-policy-by-id', props.responseHeadersPolicy);
37
+ if (props.responseHeadersPolicy !== 'NONE') { // I don't know why you would want to not have the policy but just in case
38
+ if (props.responseHeadersPolicy) {
39
+ if (typeof props.responseHeadersPolicy == 'string') {
40
+ if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(props.responseHeadersPolicy)) {
41
+ responseHeadersPolicy = ResponseHeadersPolicy.fromResponseHeadersPolicyId(this, 'response-headers-policy-by-id', props.responseHeadersPolicy);
42
+ }
43
+ else {
44
+ responseHeadersPolicy = ResponseHeadersPolicy[props.responseHeadersPolicy] ?? ResponseHeadersPolicy.SECURITY_HEADERS;
45
+ }
41
46
  }
42
- else {
43
- responseHeadersPolicy = ResponseHeadersPolicy[props.responseHeadersPolicy] ?? ResponseHeadersPolicy.SECURITY_HEADERS;
47
+ else if (props.responseHeadersPolicy.path) {
48
+ responseHeadersPolicy = ResponseHeadersPolicy.fromResponseHeadersPolicyId(this, 'response-headers-policy-by-id', StringParameter.valueForStringParameter(this, props.responseHeadersPolicy.path, props.responseHeadersPolicy.version));
44
49
  }
45
50
  }
46
- else if (props.responseHeadersPolicy.path) {
47
- responseHeadersPolicy = ResponseHeadersPolicy.fromResponseHeadersPolicyId(this, 'response-headers-policy-by-id', StringParameter.valueForStringParameter(this, props.responseHeadersPolicy.path, props.responseHeadersPolicy.version));
51
+ if (!responseHeadersPolicy) {
52
+ // const baseHeadersBehavior: ResponseSecurityHeadersBehavior = {
53
+ // strictTransportSecurity: {
54
+ // override: true,
55
+ // accessControlMaxAge: Duration.seconds(31536000)
56
+ // },
57
+ // contentTypeOptions: {
58
+ // override: true
59
+ // },
60
+ // frameOptions: {
61
+ // override: true,
62
+ // frameOption: HeadersFrameOption.SAMEORIGIN,
63
+ // },
64
+ // referrerPolicy: {
65
+ // override: true,
66
+ // referrerPolicy: HeadersReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN
67
+ // },
68
+ // xssProtection: {
69
+ // override: true,
70
+ // protection: true,
71
+ // modeBlock: true
72
+ // }
73
+ // };
74
+ const responseHeadersPolicyName = `${domainAsId(props.domainName)}-response-headers-policy`;
75
+ if (props.responseHeadersPolicyProps) {
76
+ responseHeadersPolicy = new ResponseHeadersPolicy(this, 'response-headers-policy', {
77
+ ...ResponseHeadersPolicy.SECURITY_HEADERS,
78
+ ...props.responseHeadersPolicyProps,
79
+ responseHeadersPolicyName: props.responseHeadersPolicyProps.responseHeadersPolicyName || responseHeadersPolicyName
80
+ });
81
+ }
82
+ else if (props.responseCspHeaders) {
83
+ responseHeadersPolicy = new ResponseHeadersPolicy(this, 'response-headers-policy', {
84
+ securityHeadersBehavior: {
85
+ ...ResponseHeadersPolicy.SECURITY_HEADERS,
86
+ contentSecurityPolicy: {
87
+ override: true,
88
+ contentSecurityPolicy: Object.entries(props.responseCspHeaders).map(([directive, values]) => {
89
+ return `${directive} ${values.join(' ')};`;
90
+ }).join(' ')
91
+ },
92
+ },
93
+ responseHeadersPolicyName
94
+ });
95
+ }
96
+ else {
97
+ responseHeadersPolicy = ResponseHeadersPolicy.SECURITY_HEADERS;
98
+ }
48
99
  }
49
- }
50
- if (!responseHeadersPolicy && props.responseHeadersPolicyProps) {
51
- responseHeadersPolicy = new ResponseHeadersPolicy(this, 'response-headers-policy', {
52
- ...props.responseHeadersPolicyProps,
53
- responseHeadersPolicyName: props.responseHeadersPolicyProps.responseHeadersPolicyName || `${domainAsId(props.domainName)}-response-headers-policy`
54
- });
55
100
  this.responseHeadersPolicy = responseHeadersPolicy;
56
101
  }
57
102
  const defaultBehavior = {
@@ -98,7 +143,20 @@ export class WebGlobalStack extends Stack {
98
143
  });
99
144
  }
100
145
  this.cloudFrontFunction = cffn.fn;
101
- const eventTypes = props.cloudfrontFunction?.eventType && props.cloudfrontFunction.eventType.length > 0 ? props.cloudfrontFunction.eventType : ['VIEWER_REQUEST', 'VIEWER_RESPONSE'];
146
+ // const eventTypes: CloudFrontFunctionEventType[] = props.cloudfrontFunction?.eventType && props.cloudfrontFunction.eventType.length > 0 ? props.cloudfrontFunction.eventType : ['VIEWER_REQUEST', 'VIEWER_RESPONSE'];
147
+ let eventTypes = ['VIEWER_REQUEST', 'VIEWER_RESPONSE'];
148
+ if (Array.isArray(props.cloudfrontFunction?.eventType) && props.cloudfrontFunction.eventType.length > 0) {
149
+ const ets = props.cloudfrontFunction.eventType
150
+ .filter((v, i, a) => {
151
+ return (typeof v == 'string' &&
152
+ (v === 'VIEWER_REQUEST' || v === 'VIEWER_RESPONSE') &&
153
+ a.indexOf(v) === i // dedup
154
+ );
155
+ });
156
+ if (ets.length > 0) {
157
+ eventTypes = ets;
158
+ }
159
+ }
102
160
  for (const eventType of eventTypes) {
103
161
  defaultBehavior.functionAssociations.push({
104
162
  eventType: FunctionEventType[eventType],
@@ -138,4 +196,4 @@ export class WebGlobalStack extends Stack {
138
196
  this.aaaaRecord = cfAlias.aaaaRecord;
139
197
  }
140
198
  }
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWdsb2JhbC1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zdGFja3Mvd2ViLXN0YXRpYy1zZXJ2ZXJsZXNzL3dlYi1nbG9iYWwtc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBYyxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUluRSxPQUFPLEVBQTBCLGlCQUFpQixFQUF1RSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBR25MLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUd0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDeEUsT0FBTyxFQUErQixrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pILE9BQU8sRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWxELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBbUNwRSxNQUFNLE9BQU8sY0FBZSxTQUFRLEtBQUs7SUFDdkIsY0FBYyxDQUFjO0lBQzVCLFFBQVEsQ0FBUztJQUNqQixrQkFBa0IsQ0FBVztJQUM3QixzQkFBc0IsQ0FBZTtJQUNyQyxNQUFNLENBQXdCO0lBQzlCLHFCQUFxQixDQUFxQztJQUMxRCxPQUFPLENBQVU7SUFDakIsVUFBVSxDQUFhO0lBRXZDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBdUM7UUFDL0UsS0FBSyxD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QVksRUFBRSxjQUFjLENBQUMsWUFBWTtZQUN6QyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsVUFBVSxFQUFFLFVBQVU7U0FDdkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztJQUN2QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjaywgU3RhY2tQcm9wcywgUGh5c2ljYWxOYW1lIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuaW1wb3J0IHsgQ2VydGlmaWNhdGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiO1xuaW1wb3J0IHsgRGlzdHJpYnV0aW9uLCBGdW5jdGlvbiwgRnVuY3Rpb25FdmVudFR5cGUsIElSZXNwb25zZUhlYWRlcnNQb2xpY3ksIFJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLCBCZWhhdmlvck9wdGlvbnMsIFJlc3BvbnNlSGVhZGVyc1BvbGljeSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZGZyb250JztcbmltcG9ydCB7IEFSZWNvcmQsIEFhYWFSZWNvcmQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCB7IEJ1Y2tldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IFN0cmluZ1BhcmFtZXRlciB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zc20nO1xuaW1wb3J0IHsgQ2ZuV2ViQUNMIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXdhZnYyJztcblxuaW1wb3J0IHsgU1NMQ2VydGlmaWNhdGUgfSBmcm9tICcuLi8uLi9jb25zdHJ1Y3RzL2NlcnRpZmljYXRlbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBDbG91ZEZyb250RnVuY3Rpb25SZWRpcmVjdHMsIENsb3VkRnJvbnRGdW5jdGlvbiwgQ2xvdWRGcm9udERpc3RyaWJ1dGlvbiB9IGZyb20gJy4uLy4uL2NvbnN0cnVjdHMvY2xvdWRmcm9udC5qcyc7XG5pbXBvcnQgeyBnZXRIb3N0ZWRab25lLCBDbG91ZEZyb250QWxpYXMgfSBmcm9tICcuLi8uLi9jb25zdHJ1Y3RzL3JvdXRlNTMuanMnO1xuaW1wb3J0IHsgUzNCdWNrZXQgfSBmcm9tICcuLi8uLi9jb25zdHJ1Y3RzL3MzLmpzJztcbmltcG9ydCB0eXBlIHsgU3NtU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vY29uc3RydWN0cy9zc20udHMnO1xuaW1wb3J0IHsgQ2xvdWRGcm9udFdlYkFjbCB9IGZyb20gJy4uLy4uL2NvbnN0cnVjdHMvd2FmLmpzJztcbmltcG9ydCB7IGRvbWFpbkFzSWQgfSBmcm9tICcuLi8uLi9saWIvdXRpbHMuanMnO1xuaW1wb3J0IHsgYWRkRXZvU3RhY2tUYWdzIH0gZnJvbSAnLi4vLi4vbGliL3RhZ3MudHMnO1xuaW1wb3J0IHsgUzNCdWNrZXRPcmlnaW4gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zJztcbmltcG9ydCB0eXBlIHsgQmFzaWNBdXRoQ3JlZGVudGlhbHMgfSBmcm9tICcuLi8uLi90eXBlcy5kLnRzJztcblxuXG50eXBlIEFXU01hbmFnZWRSZXNwb25zZUhlYWRlcnNQb2xpY3kgPSBcbiAgJ0NPUlNfQUxMT1dfQUxMX09SSUdJTlMnIHxcbiAgJ0NPUlNfQUxMT1dfQUxMX09SSUdJTlNfQU5EX1NFQ1VSSVRZX0hFQURFUlMnIHxcbiAgJ0NPUlNfQUxMT1dfQUxMX09SSUdJTlNfV0lUSF9QUkVGTElHSFQnIHxcbiAgJ0NPUlNfQUxMT1dfQUxMX09SSUdJTlNfV0lUSF9QUkVGTElHSFRfQU5EX1NFQ1VSSVRZX0hFQURFUlMnIHxcbiAgJ1NFQ1VSSVRZX0hFQURFUlMnO1xuXG50eXBlIFVVSUQgPSBgJHtzdHJpbmd9LSR7c3RyaW5nfS0ke3N0cmluZ30tJHtzdHJpbmd9LSR7c3RyaW5nfWA7XG50eXBlIENsb3VkRnJvbnRGdW5jdGlvbkV2ZW50VHlwZSA9IGtleW9mIHR5cGVvZiBGdW5jdGlvbkV2ZW50VHlwZTtcblxuZXhwb3J0IGludGVyZmFjZSBXZWJHbG9iYWxTdGFja1Byb3BzIHtcbiAgZW52VHlwZTogJ05PVF9QUk9EJyB8ICdQUk9EJztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGJ1Y2tldE5hbWU/OiBzdHJpbmc7XG4gIGhvc3RlZFpvbmU6IHN0cmluZztcbiAgZG9tYWluTmFtZTogc3RyaW5nO1xuICBiYXNpY0F1dGg/OiBzdHJpbmcgfCBCYXNpY0F1dGhDcmVkZW50aWFscyB8IFNzbVN0cmluZ1BhcmFtZXRlcjtcbiAgY2xvdWRmcm9udEZ1bmN0aW9uPzoge1xuICAgIGV2ZW50VHlwZTogQ2xvdWRGcm9udEZ1bmN0aW9uRXZlbnRUeXBlW107XG4gICAgY29kZTogc3RyaW5nO1xuICB9XG4gIHJlZGlyZWN0cz86IENsb3VkRnJvbnRGdW5jdGlvblJlZGlyZWN0cztcbiAgcmVkaXJlY3RzQ3N2UGF0aD86IHN0cmluZztcbiAgLy8gYXR0YWNoV2ViQWNsPzogYm9vbGVhbiB8IHN0cmluZztcbiAgd2ViQWNsPzogYm9vbGVhbiB8IHN0cmluZyB8IFNzbVN0cmluZ1BhcmFtZXRlcjtcbiAgcmVzcG9uc2VIZWFkZXJzUG9saWN5PzogZmFsc2UgfCBBV1NNYW5hZ2VkUmVzcG9uc2VIZWFkZXJzUG9saWN5IHwgVVVJRCB8IFNzbVN0cmluZ1BhcmFtZXRlcjtcbiAgcmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHM/OiBSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcztcbiAgZGVzdHJveT86IGJvb2xlYW47XG4gIHRhZ3M/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG5leHBvcnQgY2xhc3MgV2ViR2xvYmFsU3RhY2sgZXh0ZW5kcyBTdGFjayB7XG4gIHB1YmxpYyByZWFkb25seSBzc2xDZXJ0aWZpY2F0ZTogQ2VydGlmaWNhdGU7XG4gIHB1YmxpYyByZWFkb25seSBzM0J1Y2tldDogQnVja2V0O1xuICBwdWJsaWMgcmVhZG9ubHkgY2xvdWRGcm9udEZ1bmN0aW9uOiBGdW5jdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IGNsb3VkRnJvbnREaXN0cmlidXRpb246IERpc3RyaWJ1dGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IHdlYkFjbDogQ2ZuV2ViQUNMIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2VIZWFkZXJzUG9saWN5OiBJUmVzcG9uc2VIZWFkZXJzUG9saWN5IHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgcmVhZG9ubHkgYVJlY29yZDogQVJlY29yZDtcbiAgcHVibGljIHJlYWRvbmx5IGFhYWFSZWNvcmQ6IEFhYWFSZWNvcmQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdlYkdsb2JhbFN0YWNrUHJvcHMgJiBTdGFja1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgYWRkRXZvU3RhY2tUYWdzKHRoaXMsICdXZWJHbG9iYWxTdGFjaycpO1xuXG4gICAgY29uc3QgaG9zdGVkWm9uZSA9IGdldEhvc3RlZFpvbmUodGhpcywgJ2dldEhvc3RlZFpvbmUnLCBwcm9wcy5ob3N0ZWRab25lKTtcblxuICAgIGNvbnN0IF9zc2xDZXJ0ID0gbmV3IFNTTENlcnRpZmljYXRlKHRoaXMsICdTU0xDZXJ0aWZpY2F0ZScsIHtcbiAgICAgIGhvc3RlZFpvbmU6IGhvc3RlZFpvbmUsXG4gICAgICBkb21haW5OYW1lOiBwcm9wcy5kb21haW5OYW1lLFxuICAgICAgZGVzdHJveTogcHJvcHMuZGVzdHJveVxuICAgIH0pO1xuICAgIHRoaXMuc3NsQ2VydGlmaWNhdGUgPSBfc3NsQ2VydC5jZXJ0aWZpY2F0ZTtcblxuICAgIGNvbnN0IF9zM0J1Y2tldCA9IG5ldyBTM0J1Y2tldCh0aGlzLCAnUzNCdWNrZXQnLCB7XG4gICAgICBidWNrZXROYW1lOiBwcm9wcy5idWNrZXROYW1lID8/IFBoeXNpY2FsTmFtZS5HRU5FUkFURV9JRl9ORUVERUQsXG4gICAgICBkZXN0cm95OiBwcm9wcy5kZXN0cm95XG4gICAgfSk7XG4gICAgdGhpcy5zM0J1Y2tldCA9IF9zM0J1Y2tldC5idWNrZXQ7XG5cbiAgICBsZXQgcmVzcG9uc2VIZWFkZXJzUG9saWN5OiBJUmVzcG9uc2VIZWFkZXJzUG9saWN5IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmIChwcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3kpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5ID09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICgvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQvaS50ZXN0KHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeSkpIHtcbiAgICAgICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3kgPSBSZXNwb25zZUhlYWRlcnNQb2xpY3kuZnJvbVJlc3BvbnNlSGVhZGVyc1BvbGljeUlkKHRoaXMsICdyZXNwb25zZS1oZWFkZXJzLXBvbGljeS1ieS1pZCcsIHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5ID0gUmVzcG9uc2VIZWFkZXJzUG9saWN5W3Byb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeSBhcyBrZXlvZiB0eXBlb2YgUmVzcG9uc2VIZWFkZXJzUG9saWN5XSBhcyBJUmVzcG9uc2VIZWFkZXJzUG9saWN5ID8/IFJlc3BvbnNlSGVhZGVyc1BvbGljeS5TRUNVUklUWV9IRUFERVJTO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeS5wYXRoKSB7XG4gICAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeSA9IFJlc3BvbnNlSGVhZGVyc1BvbGljeS5mcm9tUmVzcG9uc2VIZWFkZXJzUG9saWN5SWQodGhpcywgJ3Jlc3BvbnNlLWhlYWRlcnMtcG9saWN5LWJ5LWlkJywgU3RyaW5nUGFyYW1ldGVyLnZhbHVlRm9yU3RyaW5nUGFyYW1ldGVyKHRoaXMsIHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeS5wYXRoLCBwcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3kudmVyc2lvbikpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlSGVhZGVyc1BvbGljeSAmJiBwcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcykge1xuICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5ID0gbmV3IFJlc3BvbnNlSGVhZGVyc1BvbGljeSh0aGlzLCAncmVzcG9uc2UtaGVhZGVycy1wb2xpY3knLCB7XG4gICAgICAgIC4uLnByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLFxuICAgICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3lOYW1lOiBwcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3lOYW1lIHx8IGAke2RvbWFpbkFzSWQocHJvcHMuZG9tYWluTmFtZSl9LXJlc3BvbnNlLWhlYWRlcnMtcG9saWN5YFxuICAgICAgfSk7XG4gICAgICB0aGlzLnJlc3BvbnNlSGVhZGVyc1BvbGljeSA9IHJlc3BvbnNlSGVhZGVyc1BvbGljeTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0QmVoYXZpb3I6IEJlaGF2aW9yT3B0aW9ucyA9IHtcbiAgICAgIG9yaWdpbjogUzNCdWNrZXRPcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0NvbnRyb2wodGhpcy5zM0J1Y2tldCksXG4gICAgICBmdW5jdGlvbkFzc29jaWF0aW9uczogW10sXG4gICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3k6IHJlc3BvbnNlSGVhZGVyc1BvbGljeSA/PyBwcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3kgIT09IGZhbHNlID8gUmVzcG9uc2VIZWFkZXJzUG9saWN5LlNFQ1VSSVRZX0hFQURFUlMgOiB1bmRlZmluZWRcbiAgICB9O1xuXG4gICAgbGV0IGNmZm46IENsb3VkRnJvbnRGdW5jdGlvbjtcbiAgICBpZiAocHJvcHMuYmFzaWNBdXRoKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BzLmJhc2ljQXV0aCAhPSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoKHByb3BzLmJhc2ljQXV0aCBhcyBCYXNpY0F1dGhDcmVkZW50aWFscykudXNlciAmJiAocHJvcHMuYmFzaWNBdXRoIGFzIEJhc2ljQXV0aENyZWRlbnRpYWxzKS5wYXNzd29yZCkge1xuICAgICAgICAgIHByb3BzLmJhc2ljQXV0aCA9IEJ1ZmZlci5mcm9tKGAkeyhwcm9wcy5iYXNpY0F1dGggYXMgQmFzaWNBdXRoQ3JlZGVudGlhbHMpLnVzZXJ9OiR7KHByb3BzLmJhc2ljQXV0aCBhcyBCYXNpY0F1dGhDcmVkZW50aWFscykucGFzc3dvcmR9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICB9IGVsc2UgaWYgKChwcm9wcy5iYXNpY0F1dGggYXMgU3NtU3RyaW5nUGFyYW1ldGVyKS5wYXRoKSB7XG4gICAgICAgICAgcHJvcHMuYmFzaWNBdXRoID0gU3RyaW5nUGFyYW1ldGVyLnZhbHVlRm9yU3RyaW5nUGFyYW1ldGVyKHRoaXMsIChwcm9wcy5iYXNpY0F1dGggYXMgU3NtU3RyaW5nUGFyYW1ldGVyKS5wYXRoLCAocHJvcHMuYmFzaWNBdXRoIGFzIFNzbVN0cmluZ1BhcmFtZXRlcikudmVyc2lvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcHMuYmFzaWNBdXRoID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24pIHtcbiAgICAgIGNmZm4gPSBDbG91ZEZyb250RnVuY3Rpb24uY3JlYXRlRnVuY3Rpb24odGhpcywgbnVsbCwge1xuICAgICAgICBjcmVkZW50aWFsczogcHJvcHMuYmFzaWNBdXRoLFxuICAgICAgICByZWRpcmVjdHM6IHByb3BzLnJlZGlyZWN0cyxcbiAgICAgICAgcmVkaXJlY3RzQ3N2UGF0aDogcHJvcHMucmVkaXJlY3RzQ3N2UGF0aCxcbiAgICAgICAgY29kZTogcHJvcHMuY2xvdWRmcm9udEZ1bmN0aW9uLmNvZGUsXG4gICAgICAgIGRlc3Ryb3k6IHByb3BzLmRlc3Ryb3lcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAocHJvcHMuYmFzaWNBdXRoKSB7XG4gICAgICBjZmZuID0gQ2xvdWRGcm9udEZ1bmN0aW9uLmNyZWF0ZUJhc2ljQXV0aERlZmF1bHREb2ModGhpcywge1xuICAgICAgICBjcmVkZW50aWFsczogcHJvcHMuYmFzaWNBdXRoLFxuICAgICAgICByZWRpcmVjdHM6IHByb3BzLnJlZGlyZWN0cyxcbiAgICAgICAgcmVkaXJlY3RzQ3N2UGF0aDogcHJvcHMucmVkaXJlY3RzQ3N2UGF0aCxcbiAgICAgICAgZGVzdHJveTogcHJvcHMuZGVzdHJveVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNmZm4gPSBDbG91ZEZyb250RnVuY3Rpb24uY3JlYXRlRGVmYXVsdERvYyh0aGlzLCB7XG4gICAgICAgIHJlZGlyZWN0czogcHJvcHMucmVkaXJlY3RzLFxuICAgICAgICByZWRpcmVjdHNDc3ZQYXRoOiBwcm9wcy5yZWRpcmVjdHNDc3ZQYXRoLFxuICAgICAgICBkZXN0cm95OiBwcm9wcy5kZXN0cm95XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jbG91ZEZyb250RnVuY3Rpb24gPSBjZmZuLmZuO1xuXG4gICAgY29uc3QgZXZlbnRUeXBlczogQ2xvdWRGcm9udEZ1bmN0aW9uRXZlbnRUeXBlW10gPSBwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24/LmV2ZW50VHlwZSAmJiBwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24uZXZlbnRUeXBlLmxlbmd0aCA+IDAgPyBwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24uZXZlbnRUeXBlIDogWydWSUVXRVJfUkVRVUVTVCcsICdWSUVXRVJfUkVTUE9OU0UnXTtcblxuICAgIGZvciAoY29uc3QgZXZlbnRUeXBlIG9mIGV2ZW50VHlwZXMpIHtcbiAgICAgIGRlZmF1bHRCZWhhdmlvci5mdW5jdGlvbkFzc29jaWF0aW9ucyEucHVzaCh7XG4gICAgICAgIGV2ZW50VHlwZTogRnVuY3Rpb25FdmVudFR5cGVbZXZlbnRUeXBlXSxcbiAgICAgICAgZnVuY3Rpb246IHRoaXMuY2xvdWRGcm9udEZ1bmN0aW9uXG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgbGV0IHdlYkFjbElkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBwcm9wcy53ZWJBY2wgPT0gJ3N0cmluZycgJiYgcHJvcHMud2ViQWNsLnN0YXJ0c1dpdGgoJ2Fybjphd3MnKSkge1xuICAgICAgd2ViQWNsSWQgPSBwcm9wcy53ZWJBY2w7XG4gICAgfSBlbHNlIGlmICgocHJvcHMud2ViQWNsIGFzIFNzbVN0cmluZ1BhcmFtZXRlcikucGF0aCkge1xuICAgICAgd2ViQWNsSWQgPSBTdHJpbmdQYXJhbWV0ZXIudmFsdWVGb3JTdHJpbmdQYXJhbWV0ZXIodGhpcywgKHByb3BzLndlYkFjbCBhcyBTc21TdHJpbmdQYXJhbWV0ZXIpLnBhdGgsIChwcm9wcy53ZWJBY2wgYXMgU3NtU3RyaW5nUGFyYW1ldGVyKS52ZXJzaW9uKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLndlYkFjbCA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgd2FmID0gbmV3IENsb3VkRnJvbnRXZWJBY2wodGhpcywgJ0Nsb3VkRnJvbnRXZWJBY2wnLCB7XG4gICAgICAgIG5hbWU6IGAke2RvbWFpbkFzSWQocHJvcHMuZG9tYWluTmFtZSl9YCxcbiAgICAgICAgZGVzdHJveTogcHJvcHMuZGVzdHJveVxuICAgICAgfSk7XG4gICAgICB0aGlzLndlYkFjbCA9IHdhZi5hY2w7XG4gICAgICB3ZWJBY2xJZCA9IHdhZi5hY2wuYXR0ckFybjtcbiAgICB9XG5cbiAgICBjb25zdCBjZkRpc3RyaWJ1dGlvbiA9IG5ldyBDbG91ZEZyb250RGlzdHJpYnV0aW9uKHRoaXMsICdDbG91ZEZyb250RGlzdHJpYnV0aW9uJywge1xuICAgICAgZG9tYWluTmFtZTogcHJvcHMuZG9tYWluTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbiA/PyBwcm9wcy5kb21haW5OYW1lLFxuICAgICAgcHJpY2VDbGFzczogcHJvcHMuZW52VHlwZSxcbiAgICAgIGNlcnRpZmljYXRlOiB0aGlzLnNzbENlcnRpZmljYXRlLFxuICAgICAgZGVmYXVsdEJlaGF2aW9yLFxuICAgICAgd2ViQWNsSWRcbiAgICB9KTtcbiAgICB0aGlzLmNsb3VkRnJvbnREaXN0cmlidXRpb24gPSBjZkRpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb247XG5cbiAgICBjb25zdCBjZkFsaWFzID0gbmV3IENsb3VkRnJvbnRBbGlhcyh0aGlzLCAnQ2xvdWRGcm9udEFsaWFzJywge1xuICAgICAgZGlzdHJpYnV0aW9uOiBjZkRpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb24sXG4gICAgICBkb21haW5OYW1lOiBwcm9wcy5kb21haW5OYW1lLFxuICAgICAgaG9zdGVkWm9uZTogaG9zdGVkWm9uZVxuICAgIH0pO1xuICAgIHRoaXMuYVJlY29yZCA9IGNmQWxpYXMuYVJlY29yZDtcbiAgICB0aGlzLmFhYWFSZWNvcmQgPSBjZkFsaWFzLmFhYWFSZWNvcmQ7XG4gIH1cbn0iXX0=
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWdsb2JhbC1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zdGFja3Mvd2ViLXN0YXRpYy1zZXJ2ZXJsZXNzL3dlYi1nbG9iYWwtc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBYyxZQUFZLEVBQVksTUFBTSxrQkFBa0IsQ0FBQztBQUk3RSxPQUFPLEVBQTBCLGlCQUFpQixFQUF3RyxxQkFBcUIsRUFBNkMsTUFBTSw0QkFBNEIsQ0FBQztBQUcvUCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3hFLE9BQU8sRUFBK0Isa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6SCxPQUFPLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVsRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQW9DcEUsTUFBTSxPQUFPLGNBQWUsU0FBUSxLQUFLO0lBQ3ZCLGNBQWMsQ0FBYztJQUM1QixRQUFRLENBQVM7SUFDakIsa0JBQWtCLENBQVc7SUFDN0Isc0JBQXNCLENBQWU7SUFDckMsTUFBTSxDQUF3QjtJQUM5QixxQkFBcUIsQ0FBcUM7SUFDMUQsT0FBTyxDQUFVO0lBQ2pCLFVBQVUsQ0FBYTtJQUV2QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXVDO1FBQy9FLEtBQUss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O2FBQ3ZCLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUN0QixRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDN0IsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksc0JBQXNCLENBQUMsSUFBSSxFQUFFLHdCQUF3QixFQUFFO1lBQ2hGLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsVUFBVTtZQUNsRCxVQUFVLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDekIsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQ2hDLGVBQWU7WUFDZixRQUFRO1NBQ1QsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHNCQUFzQixHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUM7UUFFMUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFO1lBQzNELFlBQVksRUFBRSxjQUFjLENBQUMsWUFBWTtZQUN6QyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsVUFBVSxFQUFFLFVBQVU7U0FDdkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztJQUN2QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjaywgU3RhY2tQcm9wcywgUGh5c2ljYWxOYW1lLCBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbmltcG9ydCB7IENlcnRpZmljYXRlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXJcIjtcbmltcG9ydCB7IERpc3RyaWJ1dGlvbiwgRnVuY3Rpb24sIEZ1bmN0aW9uRXZlbnRUeXBlLCBJUmVzcG9uc2VIZWFkZXJzUG9saWN5LCBSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcywgUmVzcG9uc2VTZWN1cml0eUhlYWRlcnNCZWhhdmlvciwgQmVoYXZpb3JPcHRpb25zLCBSZXNwb25zZUhlYWRlcnNQb2xpY3ksIEhlYWRlcnNGcmFtZU9wdGlvbiwgSGVhZGVyc1JlZmVycmVyUG9saWN5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0IHsgQVJlY29yZCwgQWFhYVJlY29yZCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1M1wiO1xuaW1wb3J0IHsgQnVja2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgeyBDZm5XZWJBQ0wgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtd2FmdjInO1xuXG5pbXBvcnQgeyBTU0xDZXJ0aWZpY2F0ZSB9IGZyb20gJy4uLy4uL2NvbnN0cnVjdHMvY2VydGlmaWNhdGVtYW5hZ2VyLmpzJztcbmltcG9ydCB7IENsb3VkRnJvbnRGdW5jdGlvblJlZGlyZWN0cywgQ2xvdWRGcm9udEZ1bmN0aW9uLCBDbG91ZEZyb250RGlzdHJpYnV0aW9uIH0gZnJvbSAnLi4vLi4vY29uc3RydWN0cy9jbG91ZGZyb250LmpzJztcbmltcG9ydCB7IGdldEhvc3RlZFpvbmUsIENsb3VkRnJvbnRBbGlhcyB9IGZyb20gJy4uLy4uL2NvbnN0cnVjdHMvcm91dGU1My5qcyc7XG5pbXBvcnQgeyBTM0J1Y2tldCB9IGZyb20gJy4uLy4uL2NvbnN0cnVjdHMvczMuanMnO1xuaW1wb3J0IHR5cGUgeyBTc21TdHJpbmdQYXJhbWV0ZXIgfSBmcm9tICcuLi8uLi9jb25zdHJ1Y3RzL3NzbS50cyc7XG5pbXBvcnQgeyBDbG91ZEZyb250V2ViQWNsIH0gZnJvbSAnLi4vLi4vY29uc3RydWN0cy93YWYuanMnO1xuaW1wb3J0IHsgZG9tYWluQXNJZCB9IGZyb20gJy4uLy4uL2xpYi91dGlscy5qcyc7XG5pbXBvcnQgeyBhZGRFdm9TdGFja1RhZ3MgfSBmcm9tICcuLi8uLi9saWIvdGFncy50cyc7XG5pbXBvcnQgeyBTM0J1Y2tldE9yaWdpbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZGZyb250LW9yaWdpbnMnO1xuaW1wb3J0IHR5cGUgeyBCYXNpY0F1dGhDcmVkZW50aWFscywgQ3NwSGVhZGVycyB9IGZyb20gJy4uLy4uL3R5cGVzLmQudHMnO1xuXG5cbnR5cGUgQVdTTWFuYWdlZFJlc3BvbnNlSGVhZGVyc1BvbGljeSA9IFxuICAnQ09SU19BTExPV19BTExfT1JJR0lOUycgfFxuICAnQ09SU19BTExPV19BTExfT1JJR0lOU19BTkRfU0VDVVJJVFlfSEVBREVSUycgfFxuICAnQ09SU19BTExPV19BTExfT1JJR0lOU19XSVRIX1BSRUZMSUdIVCcgfFxuICAnQ09SU19BTExPV19BTExfT1JJR0lOU19XSVRIX1BSRUZMSUdIVF9BTkRfU0VDVVJJVFlfSEVBREVSUycgfFxuICAnU0VDVVJJVFlfSEVBREVSUyc7XG5cbnR5cGUgVVVJRCA9IGAke3N0cmluZ30tJHtzdHJpbmd9LSR7c3RyaW5nfS0ke3N0cmluZ30tJHtzdHJpbmd9YDtcbnR5cGUgQ2xvdWRGcm9udEZ1bmN0aW9uRXZlbnRUeXBlID0ga2V5b2YgdHlwZW9mIEZ1bmN0aW9uRXZlbnRUeXBlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdlYkdsb2JhbFN0YWNrUHJvcHMge1xuICBlbnZUeXBlOiAnTk9UX1BST0QnIHwgJ1BST0QnO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgYnVja2V0TmFtZT86IHN0cmluZztcbiAgaG9zdGVkWm9uZTogc3RyaW5nO1xuICBkb21haW5OYW1lOiBzdHJpbmc7XG4gIGJhc2ljQXV0aD86IHN0cmluZyB8IEJhc2ljQXV0aENyZWRlbnRpYWxzIHwgU3NtU3RyaW5nUGFyYW1ldGVyO1xuICBjbG91ZGZyb250RnVuY3Rpb24/OiB7XG4gICAgZXZlbnRUeXBlOiBDbG91ZEZyb250RnVuY3Rpb25FdmVudFR5cGVbXTtcbiAgICBjb2RlOiBzdHJpbmc7XG4gIH1cbiAgcmVkaXJlY3RzPzogQ2xvdWRGcm9udEZ1bmN0aW9uUmVkaXJlY3RzO1xuICByZWRpcmVjdHNDc3ZQYXRoPzogc3RyaW5nO1xuICAvLyBhdHRhY2hXZWJBY2w/OiBib29sZWFuIHwgc3RyaW5nO1xuICB3ZWJBY2w/OiBib29sZWFuIHwgc3RyaW5nIHwgU3NtU3RyaW5nUGFyYW1ldGVyO1xuICByZXNwb25zZUhlYWRlcnNQb2xpY3k/OiBmYWxzZSB8IEFXU01hbmFnZWRSZXNwb25zZUhlYWRlcnNQb2xpY3kgfCAnTk9ORScgfCBVVUlEIHwgU3NtU3RyaW5nUGFyYW1ldGVyO1xuICByZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcz86IFJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzO1xuICByZXNwb25zZUNzcEhlYWRlcnM/OiBDc3BIZWFkZXJzO1xuICBkZXN0cm95PzogYm9vbGVhbjtcbiAgdGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmV4cG9ydCBjbGFzcyBXZWJHbG9iYWxTdGFjayBleHRlbmRzIFN0YWNrIHtcbiAgcHVibGljIHJlYWRvbmx5IHNzbENlcnRpZmljYXRlOiBDZXJ0aWZpY2F0ZTtcbiAgcHVibGljIHJlYWRvbmx5IHMzQnVja2V0OiBCdWNrZXQ7XG4gIHB1YmxpYyByZWFkb25seSBjbG91ZEZyb250RnVuY3Rpb246IEZ1bmN0aW9uO1xuICBwdWJsaWMgcmVhZG9ubHkgY2xvdWRGcm9udERpc3RyaWJ1dGlvbjogRGlzdHJpYnV0aW9uO1xuICBwdWJsaWMgcmVhZG9ubHkgd2ViQWNsOiBDZm5XZWJBQ0wgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyByZWFkb25seSByZXNwb25zZUhlYWRlcnNQb2xpY3k6IElSZXNwb25zZUhlYWRlcnNQb2xpY3kgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyByZWFkb25seSBhUmVjb3JkOiBBUmVjb3JkO1xuICBwdWJsaWMgcmVhZG9ubHkgYWFhYVJlY29yZDogQWFhYVJlY29yZDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogV2ViR2xvYmFsU3RhY2tQcm9wcyAmIFN0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICBhZGRFdm9TdGFja1RhZ3ModGhpcywgJ1dlYkdsb2JhbFN0YWNrJyk7XG5cbiAgICBjb25zdCBob3N0ZWRab25lID0gZ2V0SG9zdGVkWm9uZSh0aGlzLCAnZ2V0SG9zdGVkWm9uZScsIHByb3BzLmhvc3RlZFpvbmUpO1xuXG4gICAgY29uc3QgX3NzbENlcnQgPSBuZXcgU1NMQ2VydGlmaWNhdGUodGhpcywgJ1NTTENlcnRpZmljYXRlJywge1xuICAgICAgaG9zdGVkWm9uZTogaG9zdGVkWm9uZSxcbiAgICAgIGRvbWFpbk5hbWU6IHByb3BzLmRvbWFpbk5hbWUsXG4gICAgICBkZXN0cm95OiBwcm9wcy5kZXN0cm95XG4gICAgfSk7XG4gICAgdGhpcy5zc2xDZXJ0aWZpY2F0ZSA9IF9zc2xDZXJ0LmNlcnRpZmljYXRlO1xuXG4gICAgY29uc3QgX3MzQnVja2V0ID0gbmV3IFMzQnVja2V0KHRoaXMsICdTM0J1Y2tldCcsIHtcbiAgICAgIGJ1Y2tldE5hbWU6IHByb3BzLmJ1Y2tldE5hbWUgPz8gUGh5c2ljYWxOYW1lLkdFTkVSQVRFX0lGX05FRURFRCxcbiAgICAgIGRlc3Ryb3k6IHByb3BzLmRlc3Ryb3lcbiAgICB9KTtcbiAgICB0aGlzLnMzQnVja2V0ID0gX3MzQnVja2V0LmJ1Y2tldDtcblxuICAgIGxldCByZXNwb25zZUhlYWRlcnNQb2xpY3k6IElSZXNwb25zZUhlYWRlcnNQb2xpY3kgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeSAhPT0gJ05PTkUnKSB7IC8vIEkgZG9uJ3Qga25vdyB3aHkgeW91IHdvdWxkIHdhbnQgdG8gbm90IGhhdmUgdGhlIHBvbGljeSBidXQganVzdCBpbiBjYXNlXG4gICAgICBpZiAocHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5KSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5ID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaWYgKC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JC9pLnRlc3QocHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5KSkge1xuICAgICAgICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5ID0gUmVzcG9uc2VIZWFkZXJzUG9saWN5LmZyb21SZXNwb25zZUhlYWRlcnNQb2xpY3lJZCh0aGlzLCAncmVzcG9uc2UtaGVhZGVycy1wb2xpY3ktYnktaWQnLCBwcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3kpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3kgPSBSZXNwb25zZUhlYWRlcnNQb2xpY3lbcHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5IGFzIGtleW9mIHR5cGVvZiBSZXNwb25zZUhlYWRlcnNQb2xpY3ldIGFzIElSZXNwb25zZUhlYWRlcnNQb2xpY3kgPz8gUmVzcG9uc2VIZWFkZXJzUG9saWN5LlNFQ1VSSVRZX0hFQURFUlM7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeS5wYXRoKSB7XG4gICAgICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5ID0gUmVzcG9uc2VIZWFkZXJzUG9saWN5LmZyb21SZXNwb25zZUhlYWRlcnNQb2xpY3lJZCh0aGlzLCAncmVzcG9uc2UtaGVhZGVycy1wb2xpY3ktYnktaWQnLCBTdHJpbmdQYXJhbWV0ZXIudmFsdWVGb3JTdHJpbmdQYXJhbWV0ZXIodGhpcywgcHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5LnBhdGgsIHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeS52ZXJzaW9uKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghcmVzcG9uc2VIZWFkZXJzUG9saWN5KSB7XG4gICAgICAgIC8vIGNvbnN0IGJhc2VIZWFkZXJzQmVoYXZpb3I6IFJlc3BvbnNlU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3IgPSB7XG4gICAgICAgIC8vICAgc3RyaWN0VHJhbnNwb3J0U2VjdXJpdHk6IHtcbiAgICAgICAgLy8gICAgIG92ZXJyaWRlOiB0cnVlLFxuICAgICAgICAvLyAgICAgYWNjZXNzQ29udHJvbE1heEFnZTogRHVyYXRpb24uc2Vjb25kcygzMTUzNjAwMClcbiAgICAgICAgLy8gICB9LFxuICAgICAgICAvLyAgIGNvbnRlbnRUeXBlT3B0aW9uczoge1xuICAgICAgICAvLyAgICAgb3ZlcnJpZGU6IHRydWVcbiAgICAgICAgLy8gICB9LFxuICAgICAgICAvLyAgIGZyYW1lT3B0aW9uczoge1xuICAgICAgICAvLyAgICAgb3ZlcnJpZGU6IHRydWUsXG4gICAgICAgIC8vICAgICBmcmFtZU9wdGlvbjogSGVhZGVyc0ZyYW1lT3B0aW9uLlNBTUVPUklHSU4sXG4gICAgICAgIC8vICAgfSxcbiAgICAgICAgLy8gICByZWZlcnJlclBvbGljeToge1xuICAgICAgICAvLyAgICAgb3ZlcnJpZGU6IHRydWUsXG4gICAgICAgIC8vICAgICByZWZlcnJlclBvbGljeTogSGVhZGVyc1JlZmVycmVyUG9saWN5LlNUUklDVF9PUklHSU5fV0hFTl9DUk9TU19PUklHSU5cbiAgICAgICAgLy8gICB9LFxuICAgICAgICAvLyAgIHhzc1Byb3RlY3Rpb246IHtcbiAgICAgICAgLy8gICAgIG92ZXJyaWRlOiB0cnVlLFxuICAgICAgICAvLyAgICAgcHJvdGVjdGlvbjogdHJ1ZSxcbiAgICAgICAgLy8gICAgIG1vZGVCbG9jazogdHJ1ZVxuICAgICAgICAvLyAgIH1cbiAgICAgICAgLy8gfTtcblxuICAgICAgICBjb25zdCByZXNwb25zZUhlYWRlcnNQb2xpY3lOYW1lID0gYCR7ZG9tYWluQXNJZChwcm9wcy5kb21haW5OYW1lKX0tcmVzcG9uc2UtaGVhZGVycy1wb2xpY3lgO1xuICAgICAgICBcbiAgICAgICAgaWYgKHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzKSB7XG4gICAgICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5ID0gbmV3IFJlc3BvbnNlSGVhZGVyc1BvbGljeSh0aGlzLCAncmVzcG9uc2UtaGVhZGVycy1wb2xpY3knLCB7XG4gICAgICAgICAgICAuLi5SZXNwb25zZUhlYWRlcnNQb2xpY3kuU0VDVVJJVFlfSEVBREVSUyxcbiAgICAgICAgICAgIC4uLnByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLFxuICAgICAgICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZTogcHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZSB8fCByZXNwb25zZUhlYWRlcnNQb2xpY3lOYW1lXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvcHMucmVzcG9uc2VDc3BIZWFkZXJzKSB7XG4gICAgICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5ID0gbmV3IFJlc3BvbnNlSGVhZGVyc1BvbGljeSh0aGlzLCAncmVzcG9uc2UtaGVhZGVycy1wb2xpY3knLCB7XG4gICAgICAgICAgICBzZWN1cml0eUhlYWRlcnNCZWhhdmlvcjoge1xuICAgICAgICAgICAgICAuLi5SZXNwb25zZUhlYWRlcnNQb2xpY3kuU0VDVVJJVFlfSEVBREVSUyxcbiAgICAgICAgICAgICAgY29udGVudFNlY3VyaXR5UG9saWN5OiB7XG4gICAgICAgICAgICAgICAgb3ZlcnJpZGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29udGVudFNlY3VyaXR5UG9saWN5OiBPYmplY3QuZW50cmllcyhwcm9wcy5yZXNwb25zZUNzcEhlYWRlcnMpLm1hcCgoW2RpcmVjdGl2ZSwgdmFsdWVzXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2RpcmVjdGl2ZX0gJHt2YWx1ZXMuam9pbignICcpfTtgXG4gICAgICAgICAgICAgICAgfSkuam9pbignICcpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeSA9IFJlc3BvbnNlSGVhZGVyc1BvbGljeS5TRUNVUklUWV9IRUFERVJTO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnJlc3BvbnNlSGVhZGVyc1BvbGljeSA9IHJlc3BvbnNlSGVhZGVyc1BvbGljeTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0QmVoYXZpb3I6IEJlaGF2aW9yT3B0aW9ucyA9IHtcbiAgICAgIG9yaWdpbjogUzNCdWNrZXRPcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0NvbnRyb2wodGhpcy5zM0J1Y2tldCksXG4gICAgICBmdW5jdGlvbkFzc29jaWF0aW9uczogW10sXG4gICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3k6IHJlc3BvbnNlSGVhZGVyc1BvbGljeSA/PyBwcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3kgIT09IGZhbHNlID8gUmVzcG9uc2VIZWFkZXJzUG9saWN5LlNFQ1VSSVRZX0hFQURFUlMgOiB1bmRlZmluZWRcbiAgICB9O1xuXG4gICAgbGV0IGNmZm46IENsb3VkRnJvbnRGdW5jdGlvbjtcbiAgICBpZiAocHJvcHMuYmFzaWNBdXRoKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BzLmJhc2ljQXV0aCAhPSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoKHByb3BzLmJhc2ljQXV0aCBhcyBCYXNpY0F1dGhDcmVkZW50aWFscykudXNlciAmJiAocHJvcHMuYmFzaWNBdXRoIGFzIEJhc2ljQXV0aENyZWRlbnRpYWxzKS5wYXNzd29yZCkge1xuICAgICAgICAgIHByb3BzLmJhc2ljQXV0aCA9IEJ1ZmZlci5mcm9tKGAkeyhwcm9wcy5iYXNpY0F1dGggYXMgQmFzaWNBdXRoQ3JlZGVudGlhbHMpLnVzZXJ9OiR7KHByb3BzLmJhc2ljQXV0aCBhcyBCYXNpY0F1dGhDcmVkZW50aWFscykucGFzc3dvcmR9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICB9IGVsc2UgaWYgKChwcm9wcy5iYXNpY0F1dGggYXMgU3NtU3RyaW5nUGFyYW1ldGVyKS5wYXRoKSB7XG4gICAgICAgICAgcHJvcHMuYmFzaWNBdXRoID0gU3RyaW5nUGFyYW1ldGVyLnZhbHVlRm9yU3RyaW5nUGFyYW1ldGVyKHRoaXMsIChwcm9wcy5iYXNpY0F1dGggYXMgU3NtU3RyaW5nUGFyYW1ldGVyKS5wYXRoLCAocHJvcHMuYmFzaWNBdXRoIGFzIFNzbVN0cmluZ1BhcmFtZXRlcikudmVyc2lvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcHMuYmFzaWNBdXRoID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24pIHtcbiAgICAgIGNmZm4gPSBDbG91ZEZyb250RnVuY3Rpb24uY3JlYXRlRnVuY3Rpb24odGhpcywgbnVsbCwge1xuICAgICAgICBjcmVkZW50aWFsczogcHJvcHMuYmFzaWNBdXRoLFxuICAgICAgICByZWRpcmVjdHM6IHByb3BzLnJlZGlyZWN0cyxcbiAgICAgICAgcmVkaXJlY3RzQ3N2UGF0aDogcHJvcHMucmVkaXJlY3RzQ3N2UGF0aCxcbiAgICAgICAgY29kZTogcHJvcHMuY2xvdWRmcm9udEZ1bmN0aW9uLmNvZGUsXG4gICAgICAgIGRlc3Ryb3k6IHByb3BzLmRlc3Ryb3lcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAocHJvcHMuYmFzaWNBdXRoKSB7XG4gICAgICBjZmZuID0gQ2xvdWRGcm9udEZ1bmN0aW9uLmNyZWF0ZUJhc2ljQXV0aERlZmF1bHREb2ModGhpcywge1xuICAgICAgICBjcmVkZW50aWFsczogcHJvcHMuYmFzaWNBdXRoLFxuICAgICAgICByZWRpcmVjdHM6IHByb3BzLnJlZGlyZWN0cyxcbiAgICAgICAgcmVkaXJlY3RzQ3N2UGF0aDogcHJvcHMucmVkaXJlY3RzQ3N2UGF0aCxcbiAgICAgICAgZGVzdHJveTogcHJvcHMuZGVzdHJveVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNmZm4gPSBDbG91ZEZyb250RnVuY3Rpb24uY3JlYXRlRGVmYXVsdERvYyh0aGlzLCB7XG4gICAgICAgIHJlZGlyZWN0czogcHJvcHMucmVkaXJlY3RzLFxuICAgICAgICByZWRpcmVjdHNDc3ZQYXRoOiBwcm9wcy5yZWRpcmVjdHNDc3ZQYXRoLFxuICAgICAgICBkZXN0cm95OiBwcm9wcy5kZXN0cm95XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jbG91ZEZyb250RnVuY3Rpb24gPSBjZmZuLmZuO1xuXG4gICAgLy8gY29uc3QgZXZlbnRUeXBlczogQ2xvdWRGcm9udEZ1bmN0aW9uRXZlbnRUeXBlW10gPSBwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24/LmV2ZW50VHlwZSAmJiBwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24uZXZlbnRUeXBlLmxlbmd0aCA+IDAgPyBwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24uZXZlbnRUeXBlIDogWydWSUVXRVJfUkVRVUVTVCcsICdWSUVXRVJfUkVTUE9OU0UnXTtcblxuICAgIGxldCBldmVudFR5cGVzOiBDbG91ZEZyb250RnVuY3Rpb25FdmVudFR5cGVbXSA9IFsnVklFV0VSX1JFUVVFU1QnLCAnVklFV0VSX1JFU1BPTlNFJ107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcHMuY2xvdWRmcm9udEZ1bmN0aW9uPy5ldmVudFR5cGUpICYmIHByb3BzLmNsb3VkZnJvbnRGdW5jdGlvbi5ldmVudFR5cGUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZXRzID0gcHJvcHMuY2xvdWRmcm9udEZ1bmN0aW9uLmV2ZW50VHlwZVxuICAgICAgICAuZmlsdGVyKCh2LCBpLCBhKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHR5cGVvZiB2ID09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAodiA9PT0gJ1ZJRVdFUl9SRVFVRVNUJyB8fCB2ID09PSAnVklFV0VSX1JFU1BPTlNFJykgJiZcbiAgICAgICAgICAgIGEuaW5kZXhPZih2KSA9PT0gaSAvLyBkZWR1cFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgaWYgKGV0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGV2ZW50VHlwZXMgPSBldHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBldmVudFR5cGUgb2YgZXZlbnRUeXBlcykge1xuICAgICAgZGVmYXVsdEJlaGF2aW9yLmZ1bmN0aW9uQXNzb2NpYXRpb25zIS5wdXNoKHtcbiAgICAgICAgZXZlbnRUeXBlOiBGdW5jdGlvbkV2ZW50VHlwZVtldmVudFR5cGVdLFxuICAgICAgICBmdW5jdGlvbjogdGhpcy5jbG91ZEZyb250RnVuY3Rpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICBsZXQgd2ViQWNsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHByb3BzLndlYkFjbCA9PSAnc3RyaW5nJyAmJiBwcm9wcy53ZWJBY2wuc3RhcnRzV2l0aCgnYXJuOmF3cycpKSB7XG4gICAgICB3ZWJBY2xJZCA9IHByb3BzLndlYkFjbDtcbiAgICB9IGVsc2UgaWYgKChwcm9wcy53ZWJBY2wgYXMgU3NtU3RyaW5nUGFyYW1ldGVyKS5wYXRoKSB7XG4gICAgICB3ZWJBY2xJZCA9IFN0cmluZ1BhcmFtZXRlci52YWx1ZUZvclN0cmluZ1BhcmFtZXRlcih0aGlzLCAocHJvcHMud2ViQWNsIGFzIFNzbVN0cmluZ1BhcmFtZXRlcikucGF0aCwgKHByb3BzLndlYkFjbCBhcyBTc21TdHJpbmdQYXJhbWV0ZXIpLnZlcnNpb24pO1xuICAgIH0gZWxzZSBpZiAocHJvcHMud2ViQWNsID09PSB0cnVlKSB7XG4gICAgICBjb25zdCB3YWYgPSBuZXcgQ2xvdWRGcm9udFdlYkFjbCh0aGlzLCAnQ2xvdWRGcm9udFdlYkFjbCcsIHtcbiAgICAgICAgbmFtZTogYCR7ZG9tYWluQXNJZChwcm9wcy5kb21haW5OYW1lKX1gLFxuICAgICAgICBkZXN0cm95OiBwcm9wcy5kZXN0cm95XG4gICAgICB9KTtcbiAgICAgIHRoaXMud2ViQWNsID0gd2FmLmFjbDtcbiAgICAgIHdlYkFjbElkID0gd2FmLmFjbC5hdHRyQXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNmRGlzdHJpYnV0aW9uID0gbmV3IENsb3VkRnJvbnREaXN0cmlidXRpb24odGhpcywgJ0Nsb3VkRnJvbnREaXN0cmlidXRpb24nLCB7XG4gICAgICBkb21haW5OYW1lOiBwcm9wcy5kb21haW5OYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uID8/IHByb3BzLmRvbWFpbk5hbWUsXG4gICAgICBwcmljZUNsYXNzOiBwcm9wcy5lbnZUeXBlLFxuICAgICAgY2VydGlmaWNhdGU6IHRoaXMuc3NsQ2VydGlmaWNhdGUsXG4gICAgICBkZWZhdWx0QmVoYXZpb3IsXG4gICAgICB3ZWJBY2xJZFxuICAgIH0pO1xuICAgIHRoaXMuY2xvdWRGcm9udERpc3RyaWJ1dGlvbiA9IGNmRGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbjtcblxuICAgIGNvbnN0IGNmQWxpYXMgPSBuZXcgQ2xvdWRGcm9udEFsaWFzKHRoaXMsICdDbG91ZEZyb250QWxpYXMnLCB7XG4gICAgICBkaXN0cmlidXRpb246IGNmRGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbixcbiAgICAgIGRvbWFpbk5hbWU6IHByb3BzLmRvbWFpbk5hbWUsXG4gICAgICBob3N0ZWRab25lOiBob3N0ZWRab25lXG4gICAgfSk7XG4gICAgdGhpcy5hUmVjb3JkID0gY2ZBbGlhcy5hUmVjb3JkO1xuICAgIHRoaXMuYWFhYVJlY29yZCA9IGNmQWxpYXMuYWFhYVJlY29yZDtcbiAgfVxufSJdfQ==
package/dist/types.d.ts CHANGED
@@ -14,4 +14,8 @@ export interface ResourceProps {
14
14
  export interface BasicAuthCredentials {
15
15
  user: string;
16
16
  password: string;
17
- }
17
+ }
18
+
19
+ export type CspDirective = 'connect-src' | 'default-src' | 'font-src' | 'frame-src' | 'img-src' | 'media-src' | 'object-src' | 'script-src' | 'style-src';
20
+ export type CspDirectiveValue = "'self'" | "'none'" | "'unsafe-inline'" | "https:";
21
+ export type CspHeaders = Partial<Record<CspDirective, CspDirectiveValue[] | string[]>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inizioevoke/evosynth",
3
- "version": "1.7.0",
3
+ "version": "1.8.0",
4
4
  "author": "",
5
5
  "license": "ISC",
6
6
  "description": "",
package/samples/app.ts CHANGED
@@ -6,6 +6,7 @@ import { WebStaticServerlessStage } from '@inizioevoke/evosynth/stages/web-stati
6
6
  import { AddSourceStageParams } from '@inizioevoke/evosynth/constructs/codepipeline';
7
7
  import type { SsmStringParameter } from '@inizioevoke/evosynth/constructs/ssm';
8
8
  // import { BasicAuthCredentials } from '@inizioevoke/evosynth/types';
9
+ // import cspHeaders from './csp';
9
10
 
10
11
  const app = new cdk.App();
11
12
 
@@ -55,6 +56,20 @@ new WebStaticServerlessStage(app, 'dev', {
55
56
  domainName: `${appName}.evodev.net`,
56
57
  basicAuth,
57
58
  webAcl,
59
+
60
+ // responseHeadersPolicyProps: { /* full CDK policy */},
61
+ // responseHeadersPolicy: 'SECURITY_HEADERS', // AWS managed policy
62
+ // responseHeadersPolicy: 'NONE', // Not recommended
63
+ // responseHeadersPolicy: '[UUID from CloudFront > Policies > Response headers]',
64
+ // responseHeadersPolicy: { path: '/evosynth/web/security/response-headers' }, // UUID from Parameter Store
65
+ // responseCspHeaders: { // just CSP headers, extends ResponseHeadersPolicy.SECURITY_HEADERS
66
+ // 'default-src': [
67
+ // "'self'"
68
+ // ]
69
+ // },
70
+ // responseCspHeaders: cspHeaders // imported from another file
71
+ // If no response header policy is specified, default will be the AWS managed ResponseHeadersPolicy.SECURITY_HEADERS
72
+
58
73
  // Use a custom CloudFront Viewer Request/Response function
59
74
  // viewerRequestResponseFn: 'function handler(event) { /* do something */ }',
60
75
 
package/samples/csp.ts ADDED
@@ -0,0 +1,9 @@
1
+ import type { CspHeaders } from '@inizioevoke/evosynth/types';
2
+
3
+ const cspHeaders: CspHeaders = {
4
+ 'default-src': [
5
+ "'self'"
6
+ ]
7
+ }
8
+
9
+ export default cspHeaders;
@@ -104,6 +104,10 @@ export class CodeBuildPipelineProject extends Construct {
104
104
  }
105
105
 
106
106
  if (props.ssmParameters) {
107
+ // dedup
108
+ props.ssmParameters = props.ssmParameters.filter((v, i, a) => {
109
+ return a.findIndex(p => p.path === v.path) === i;
110
+ });
107
111
  for (const param of props.ssmParameters) {
108
112
  let strParam: IStringParameter;
109
113
  if (param.encrypted) {
@@ -1,8 +1,8 @@
1
- import { Stack, StackProps, PhysicalName } from 'aws-cdk-lib/core';
1
+ import { Stack, StackProps, PhysicalName, Duration } from 'aws-cdk-lib/core';
2
2
  import { Construct } from 'constructs';
3
3
 
4
4
  import { Certificate } from "aws-cdk-lib/aws-certificatemanager";
5
- import { Distribution, Function, FunctionEventType, IResponseHeadersPolicy, ResponseHeadersPolicyProps, BehaviorOptions, ResponseHeadersPolicy } from 'aws-cdk-lib/aws-cloudfront';
5
+ import { Distribution, Function, FunctionEventType, IResponseHeadersPolicy, ResponseHeadersPolicyProps, ResponseSecurityHeadersBehavior, BehaviorOptions, ResponseHeadersPolicy, HeadersFrameOption, HeadersReferrerPolicy } from 'aws-cdk-lib/aws-cloudfront';
6
6
  import { ARecord, AaaaRecord } from "aws-cdk-lib/aws-route53";
7
7
  import { Bucket } from "aws-cdk-lib/aws-s3";
8
8
  import { StringParameter } from 'aws-cdk-lib/aws-ssm';
@@ -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 } from '../../types.d.ts';
20
+ import type { BasicAuthCredentials, CspHeaders } from '../../types.d.ts';
21
21
 
22
22
 
23
23
  type AWSManagedResponseHeadersPolicy =
@@ -45,8 +45,9 @@ export interface WebGlobalStackProps {
45
45
  redirectsCsvPath?: string;
46
46
  // attachWebAcl?: boolean | string;
47
47
  webAcl?: boolean | string | SsmStringParameter;
48
- responseHeadersPolicy?: false | AWSManagedResponseHeadersPolicy | UUID | SsmStringParameter;
48
+ responseHeadersPolicy?: false | AWSManagedResponseHeadersPolicy | 'NONE' | UUID | SsmStringParameter;
49
49
  responseHeadersPolicyProps?: ResponseHeadersPolicyProps;
50
+ responseCspHeaders?: CspHeaders;
50
51
  destroy?: boolean;
51
52
  tags?: Record<string, string>;
52
53
  }
@@ -81,22 +82,67 @@ export class WebGlobalStack extends Stack {
81
82
  this.s3Bucket = _s3Bucket.bucket;
82
83
 
83
84
  let responseHeadersPolicy: IResponseHeadersPolicy | undefined = undefined;
84
- if (props.responseHeadersPolicy) {
85
- if (typeof props.responseHeadersPolicy == 'string') {
86
- if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(props.responseHeadersPolicy)) {
87
- responseHeadersPolicy = ResponseHeadersPolicy.fromResponseHeadersPolicyId(this, 'response-headers-policy-by-id', props.responseHeadersPolicy);
85
+ if (props.responseHeadersPolicy !== 'NONE') { // I don't know why you would want to not have the policy but just in case
86
+ if (props.responseHeadersPolicy) {
87
+ if (typeof props.responseHeadersPolicy == 'string') {
88
+ if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(props.responseHeadersPolicy)) {
89
+ responseHeadersPolicy = ResponseHeadersPolicy.fromResponseHeadersPolicyId(this, 'response-headers-policy-by-id', props.responseHeadersPolicy);
90
+ } else {
91
+ responseHeadersPolicy = ResponseHeadersPolicy[props.responseHeadersPolicy as keyof typeof ResponseHeadersPolicy] as IResponseHeadersPolicy ?? ResponseHeadersPolicy.SECURITY_HEADERS;
92
+ }
93
+ } else if (props.responseHeadersPolicy.path) {
94
+ responseHeadersPolicy = ResponseHeadersPolicy.fromResponseHeadersPolicyId(this, 'response-headers-policy-by-id', StringParameter.valueForStringParameter(this, props.responseHeadersPolicy.path, props.responseHeadersPolicy.version));
95
+ }
96
+ }
97
+ if (!responseHeadersPolicy) {
98
+ // const baseHeadersBehavior: ResponseSecurityHeadersBehavior = {
99
+ // strictTransportSecurity: {
100
+ // override: true,
101
+ // accessControlMaxAge: Duration.seconds(31536000)
102
+ // },
103
+ // contentTypeOptions: {
104
+ // override: true
105
+ // },
106
+ // frameOptions: {
107
+ // override: true,
108
+ // frameOption: HeadersFrameOption.SAMEORIGIN,
109
+ // },
110
+ // referrerPolicy: {
111
+ // override: true,
112
+ // referrerPolicy: HeadersReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN
113
+ // },
114
+ // xssProtection: {
115
+ // override: true,
116
+ // protection: true,
117
+ // modeBlock: true
118
+ // }
119
+ // };
120
+
121
+ const responseHeadersPolicyName = `${domainAsId(props.domainName)}-response-headers-policy`;
122
+
123
+ if (props.responseHeadersPolicyProps) {
124
+ responseHeadersPolicy = new ResponseHeadersPolicy(this, 'response-headers-policy', {
125
+ ...ResponseHeadersPolicy.SECURITY_HEADERS,
126
+ ...props.responseHeadersPolicyProps,
127
+ responseHeadersPolicyName: props.responseHeadersPolicyProps.responseHeadersPolicyName || responseHeadersPolicyName
128
+ });
129
+ } else if (props.responseCspHeaders) {
130
+ responseHeadersPolicy = new ResponseHeadersPolicy(this, 'response-headers-policy', {
131
+ securityHeadersBehavior: {
132
+ ...ResponseHeadersPolicy.SECURITY_HEADERS,
133
+ contentSecurityPolicy: {
134
+ override: true,
135
+ contentSecurityPolicy: Object.entries(props.responseCspHeaders).map(([directive, values]) => {
136
+ return `${directive} ${values.join(' ')};`
137
+ }).join(' ')
138
+ },
139
+ },
140
+ responseHeadersPolicyName
141
+ });
88
142
  } else {
89
- responseHeadersPolicy = ResponseHeadersPolicy[props.responseHeadersPolicy as keyof typeof ResponseHeadersPolicy] as IResponseHeadersPolicy ?? ResponseHeadersPolicy.SECURITY_HEADERS;
143
+ responseHeadersPolicy = ResponseHeadersPolicy.SECURITY_HEADERS;
90
144
  }
91
- } else if (props.responseHeadersPolicy.path) {
92
- responseHeadersPolicy = ResponseHeadersPolicy.fromResponseHeadersPolicyId(this, 'response-headers-policy-by-id', StringParameter.valueForStringParameter(this, props.responseHeadersPolicy.path, props.responseHeadersPolicy.version));
93
145
  }
94
- }
95
- if (!responseHeadersPolicy && props.responseHeadersPolicyProps) {
96
- responseHeadersPolicy = new ResponseHeadersPolicy(this, 'response-headers-policy', {
97
- ...props.responseHeadersPolicyProps,
98
- responseHeadersPolicyName: props.responseHeadersPolicyProps.responseHeadersPolicyName || `${domainAsId(props.domainName)}-response-headers-policy`
99
- });
100
146
  this.responseHeadersPolicy = responseHeadersPolicy;
101
147
  }
102
148
 
@@ -142,7 +188,22 @@ export class WebGlobalStack extends Stack {
142
188
  }
143
189
  this.cloudFrontFunction = cffn.fn;
144
190
 
145
- const eventTypes: CloudFrontFunctionEventType[] = props.cloudfrontFunction?.eventType && props.cloudfrontFunction.eventType.length > 0 ? props.cloudfrontFunction.eventType : ['VIEWER_REQUEST', 'VIEWER_RESPONSE'];
191
+ // const eventTypes: CloudFrontFunctionEventType[] = props.cloudfrontFunction?.eventType && props.cloudfrontFunction.eventType.length > 0 ? props.cloudfrontFunction.eventType : ['VIEWER_REQUEST', 'VIEWER_RESPONSE'];
192
+
193
+ let eventTypes: CloudFrontFunctionEventType[] = ['VIEWER_REQUEST', 'VIEWER_RESPONSE'];
194
+ if (Array.isArray(props.cloudfrontFunction?.eventType) && props.cloudfrontFunction.eventType.length > 0) {
195
+ const ets = props.cloudfrontFunction.eventType
196
+ .filter((v, i, a) => {
197
+ return (
198
+ typeof v == 'string' &&
199
+ (v === 'VIEWER_REQUEST' || v === 'VIEWER_RESPONSE') &&
200
+ a.indexOf(v) === i // dedup
201
+ );
202
+ });
203
+ if (ets.length > 0) {
204
+ eventTypes = ets;
205
+ }
206
+ }
146
207
 
147
208
  for (const eventType of eventTypes) {
148
209
  defaultBehavior.functionAssociations!.push({
package/src/types.d.ts CHANGED
@@ -14,4 +14,8 @@ export interface ResourceProps {
14
14
  export interface BasicAuthCredentials {
15
15
  user: string;
16
16
  password: string;
17
- }
17
+ }
18
+
19
+ export type CspDirective = 'connect-src' | 'default-src' | 'font-src' | 'frame-src' | 'img-src' | 'media-src' | 'object-src' | 'script-src' | 'style-src';
20
+ export type CspDirectiveValue = "'self'" | "'none'" | "'unsafe-inline'" | "https:";
21
+ export type CspHeaders = Partial<Record<CspDirective, CspDirectiveValue[] | string[]>>;