projen 0.46.2 → 0.47.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.
Files changed (124) hide show
  1. package/.jsii +398 -408
  2. package/API.md +138 -76
  3. package/bin/projen +0 -0
  4. package/changelog.md +2 -0
  5. package/lib/awscdk/auto-discover.js +1 -1
  6. package/lib/awscdk/awscdk-app-ts.js +3 -3
  7. package/lib/awscdk/awscdk-construct.js +2 -2
  8. package/lib/awscdk/awscdk-deps.js +1 -1
  9. package/lib/awscdk/cdk-config.d.ts +1 -1
  10. package/lib/awscdk/cdk-config.js +2 -2
  11. package/lib/awscdk/cdk-tasks.d.ts +6 -0
  12. package/lib/awscdk/cdk-tasks.js +7 -3
  13. package/lib/awscdk/integration-test.js +1 -1
  14. package/lib/awscdk/java-app.js +1 -1
  15. package/lib/awscdk/lambda-function.js +2 -2
  16. package/lib/build/build-workflow.d.ts +18 -16
  17. package/lib/build/build-workflow.js +121 -121
  18. package/lib/cdk/construct-lib.js +1 -1
  19. package/lib/cdk/jsii-docgen.js +1 -1
  20. package/lib/cdk/jsii-project.d.ts +1 -0
  21. package/lib/cdk/jsii-project.js +44 -29
  22. package/lib/cdk8s/cdk8s-app-ts.js +1 -1
  23. package/lib/cdk8s/cdk8s-construct.js +1 -1
  24. package/lib/cdktf/cdktf-construct.js +1 -1
  25. package/lib/cli/cmds/new.js +2 -3
  26. package/lib/component.js +1 -1
  27. package/lib/dependencies.js +1 -1
  28. package/lib/dev-env.js +1 -1
  29. package/lib/docker-compose.js +2 -2
  30. package/lib/file.js +1 -1
  31. package/lib/gitattributes.js +1 -1
  32. package/lib/github/auto-approve.d.ts +3 -2
  33. package/lib/github/auto-approve.js +7 -6
  34. package/lib/github/auto-merge.js +1 -1
  35. package/lib/github/constants.d.ts +5 -5
  36. package/lib/github/constants.js +7 -17
  37. package/lib/github/dependabot.js +1 -1
  38. package/lib/github/github-project.d.ts +10 -0
  39. package/lib/github/github-project.js +3 -2
  40. package/lib/github/github.d.ts +16 -0
  41. package/lib/github/github.js +6 -5
  42. package/lib/github/mergify.js +1 -1
  43. package/lib/github/pr-template.js +1 -1
  44. package/lib/github/pull-request-lint.js +1 -1
  45. package/lib/github/stale.js +1 -1
  46. package/lib/github/task-workflow.js +4 -3
  47. package/lib/github/workflow-actions.d.ts +59 -0
  48. package/lib/github/workflow-actions.js +82 -0
  49. package/lib/github/workflows.d.ts +6 -0
  50. package/lib/github/workflows.js +3 -2
  51. package/lib/gitpod.js +1 -1
  52. package/lib/ignore-file.js +1 -1
  53. package/lib/ini.js +1 -1
  54. package/lib/java/java-project.js +1 -1
  55. package/lib/java/junit.js +1 -1
  56. package/lib/java/maven-compile.js +1 -1
  57. package/lib/java/maven-packaging.js +1 -1
  58. package/lib/java/maven-sample.js +1 -1
  59. package/lib/java/pom.js +1 -1
  60. package/lib/java/projenrc.js +1 -1
  61. package/lib/javascript/bundler.js +1 -1
  62. package/lib/javascript/eslint.js +1 -1
  63. package/lib/javascript/jest.js +7 -7
  64. package/lib/javascript/node-package.d.ts +12 -0
  65. package/lib/javascript/node-package.js +6 -2
  66. package/lib/javascript/node-project.d.ts +2 -22
  67. package/lib/javascript/node-project.js +26 -29
  68. package/lib/javascript/npm-config.js +1 -1
  69. package/lib/javascript/projenrc.js +1 -1
  70. package/lib/javascript/typescript-config.js +1 -1
  71. package/lib/javascript/upgrade-dependencies.d.ts +0 -14
  72. package/lib/javascript/upgrade-dependencies.js +23 -89
  73. package/lib/json.js +1 -1
  74. package/lib/license.js +1 -1
  75. package/lib/logger.js +1 -1
  76. package/lib/makefile.js +1 -1
  77. package/lib/object-file.js +1 -1
  78. package/lib/project-build.js +1 -1
  79. package/lib/project.js +1 -1
  80. package/lib/projects.js +1 -1
  81. package/lib/projenrc-json.js +1 -1
  82. package/lib/python/pip.js +1 -1
  83. package/lib/python/poetry.js +2 -2
  84. package/lib/python/projenrc.js +1 -1
  85. package/lib/python/pytest.js +1 -1
  86. package/lib/python/python-project.js +1 -1
  87. package/lib/python/python-sample.js +1 -1
  88. package/lib/python/requirements-file.js +1 -1
  89. package/lib/python/setuppy.js +1 -1
  90. package/lib/python/setuptools.js +1 -1
  91. package/lib/python/venv.js +1 -1
  92. package/lib/readme.js +1 -1
  93. package/lib/release/publisher.js +4 -4
  94. package/lib/release/release-trigger.js +1 -1
  95. package/lib/release/release.d.ts +0 -8
  96. package/lib/release/release.js +12 -14
  97. package/lib/sample-file.js +2 -2
  98. package/lib/semver.js +1 -1
  99. package/lib/source-code.js +1 -1
  100. package/lib/task-runtime.js +1 -1
  101. package/lib/task.js +1 -1
  102. package/lib/tasks.js +1 -1
  103. package/lib/testing.js +1 -1
  104. package/lib/textfile.js +1 -1
  105. package/lib/toml.js +1 -1
  106. package/lib/typescript/projenrc.js +1 -1
  107. package/lib/typescript/typescript-typedoc.js +1 -1
  108. package/lib/typescript/typescript.js +3 -3
  109. package/lib/version.js +1 -1
  110. package/lib/vscode/devcontainer.js +1 -1
  111. package/lib/vscode/launch-config.js +1 -1
  112. package/lib/vscode/vscode.js +1 -1
  113. package/lib/web/next.js +3 -3
  114. package/lib/web/postcss.js +1 -1
  115. package/lib/web/react.js +4 -4
  116. package/lib/web/tailwind.js +1 -1
  117. package/lib/xmlfile.js +1 -1
  118. package/lib/yaml.js +1 -1
  119. package/package.json +2 -2
  120. package/releasetag.txt +1 -0
  121. package/version.txt +1 -0
  122. package/dist/changelog.md +0 -2
  123. package/dist/releasetag.txt +0 -1
  124. package/dist/version.txt +0 -1
@@ -6,12 +6,15 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  const component_1 = require("../component");
7
7
  const github_1 = require("../github");
8
8
  const constants_1 = require("../github/constants");
9
+ const workflow_actions_1 = require("../github/workflow-actions");
9
10
  const workflows_model_1 = require("../github/workflows-model");
10
- const BRANCH_REF = '${{ github.event.pull_request.head.ref }}';
11
- const REPO_REF = '${{ github.event.pull_request.head.repo.full_name }}';
12
- const PRIMARY_JOB_ID = 'build';
11
+ const PULL_REQUEST_REF = '${{ github.event.pull_request.head.ref }}';
12
+ const PULL_REQUEST_REPOSITORY = '${{ github.event.pull_request.head.repo.full_name }}';
13
+ const BUILD_JOBID = 'build';
13
14
  const SELF_MUTATION_STEP = 'self_mutation';
14
- const SELF_MUTATION_COMMIT = 'self_mutation_commit';
15
+ const SELF_MUTATION_HAPPENED_OUTPUT = 'self_mutation_happened';
16
+ const IS_FORK = 'github.event.pull_request.head.repo.full_name != github.repository';
17
+ const NOT_FORK = `!(${IS_FORK})`;
15
18
  /**
16
19
  * @experimental
17
20
  */
@@ -20,8 +23,9 @@ class BuildWorkflow extends component_1.Component {
20
23
  * @experimental
21
24
  */
22
25
  constructor(project, options) {
23
- var _b, _c, _d, _e, _f, _g;
26
+ var _b, _c, _d, _e;
24
27
  super(project);
28
+ this._postBuildJobs = [];
25
29
  const github = github_1.GitHub.of(project);
26
30
  if (!github) {
27
31
  throw new Error('BuildWorkflow is currently only supported for GitHub projects');
@@ -29,24 +33,23 @@ class BuildWorkflow extends component_1.Component {
29
33
  this.github = github;
30
34
  this.preBuildSteps = (_b = options.preBuildSteps) !== null && _b !== void 0 ? _b : [];
31
35
  this.postBuildSteps = (_c = options.postBuildSteps) !== null && _c !== void 0 ? _c : [];
32
- this.mutableBuilds = (_d = options.mutableBuild) !== null && _d !== void 0 ? _d : true;
33
- this.gitIdentity = (_e = options.gitIdentity) !== null && _e !== void 0 ? _e : constants_1.DEFAULT_GITHUB_ACTIONS_USER;
36
+ this.gitIdentity = (_d = options.gitIdentity) !== null && _d !== void 0 ? _d : constants_1.DEFAULT_GITHUB_ACTIONS_USER;
34
37
  this.buildTask = options.buildTask;
35
38
  this.artifactsDirectory = options.artifactsDirectory;
36
- const antitamper = (_f = options.antitamper) !== null && _f !== void 0 ? _f : true;
37
- // disable anti-tamper if build workflow is mutable
38
- this.antitamperSteps = ((_g = !this.mutableBuilds) !== null && _g !== void 0 ? _g : antitamper) ? [{
39
- // anti-tamper check (fails if there were changes to committed files)
40
- // this will identify any non-committed files generated during build (e.g. test snapshots)
41
- name: 'Anti-tamper check',
42
- run: 'git diff --ignore-space-at-eol --exit-code',
43
- }] : [];
39
+ const mutableBuilds = (_e = options.mutableBuild) !== null && _e !== void 0 ? _e : true;
44
40
  this.workflow = new github_1.GithubWorkflow(github, 'build');
45
41
  this.workflow.on({
46
42
  pullRequest: {},
47
43
  workflowDispatch: {},
48
44
  });
49
- this.workflow.addJob(PRIMARY_JOB_ID, {
45
+ this.addBuildJob(options);
46
+ this.addAntiTamperJob({ onlyForks: mutableBuilds });
47
+ if (mutableBuilds) {
48
+ this.addSelfMutationJob();
49
+ }
50
+ }
51
+ addBuildJob(options) {
52
+ this.workflow.addJob(BUILD_JOBID, {
50
53
  runsOn: ['ubuntu-latest'],
51
54
  container: options.containerImage ? { image: options.containerImage } : undefined,
52
55
  env: {
@@ -56,58 +59,13 @@ class BuildWorkflow extends component_1.Component {
56
59
  permissions: {
57
60
  contents: workflows_model_1.JobPermission.WRITE,
58
61
  },
62
+ steps: (() => this.renderBuildSteps()),
59
63
  outputs: {
60
- [SELF_MUTATION_COMMIT]: {
64
+ [SELF_MUTATION_HAPPENED_OUTPUT]: {
61
65
  stepId: SELF_MUTATION_STEP,
62
- outputName: SELF_MUTATION_COMMIT,
66
+ outputName: SELF_MUTATION_HAPPENED_OUTPUT,
63
67
  },
64
68
  },
65
- steps: (() => this.renderSteps()),
66
- });
67
- this.primaryJobId = PRIMARY_JOB_ID;
68
- this._buildJobIds = [PRIMARY_JOB_ID];
69
- this.workflow.addJob('update-status', {
70
- runsOn: ['ubuntu-latest'],
71
- permissions: {
72
- checks: workflows_model_1.JobPermission.WRITE,
73
- actions: workflows_model_1.JobPermission.WRITE,
74
- },
75
- needs: (() => this._buildJobIds),
76
- if: `\${{ needs.${this.primaryJobId}.outputs.${SELF_MUTATION_COMMIT} }}`,
77
- steps: [
78
- // if we pushed changes, we need to manually update the status check so
79
- // that the PR will be green (we won't get here for forks with updates
80
- // because the push would have failed).
81
- {
82
- name: 'Update status check (if changed)',
83
- run: [
84
- 'gh api',
85
- '-X POST',
86
- `/repos/${REPO_REF}/check-runs`,
87
- `-F name="${PRIMARY_JOB_ID}"`,
88
- `-F head_sha="\${{ needs.${this.primaryJobId}.outputs.${SELF_MUTATION_COMMIT} }}"`,
89
- '-F status="completed"',
90
- '-F conclusion="success"',
91
- ].join(' '),
92
- env: {
93
- GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}',
94
- },
95
- },
96
- // if we pushed changes, we need to mark the current commit as failed, so
97
- // that GitHub auto-merge does not risk merging this commit before the
98
- // event for the new commit has registered.
99
- {
100
- name: 'Cancel workflow (if changed)',
101
- run: [
102
- 'gh api',
103
- '-X POST',
104
- `/repos/${REPO_REF}/actions/runs/\${{ github.run_id }}/cancel`,
105
- ].join(' '),
106
- env: {
107
- GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}',
108
- },
109
- },
110
- ],
111
69
  });
112
70
  }
113
71
  /**
@@ -116,7 +74,7 @@ class BuildWorkflow extends component_1.Component {
116
74
  * @experimental
117
75
  */
118
76
  get buildJobIds() {
119
- return [...this._buildJobIds];
77
+ return [BUILD_JOBID, ...this._postBuildJobs];
120
78
  }
121
79
  /**
122
80
  * (experimental) Adds steps that are executed after the build.
@@ -130,6 +88,10 @@ class BuildWorkflow extends component_1.Component {
130
88
  /**
131
89
  * (experimental) Adds another job to the build workflow which is executed after the build job succeeded.
132
90
  *
91
+ * Jobs are executed _only_ if the build did NOT self mutate. If the build
92
+ * self-mutate, the branch will either be updated or the build will fail (in
93
+ * forks), so there is no point in executing the post-build job.
94
+ *
133
95
  * @param id The id of the new job.
134
96
  * @param job The job specification.
135
97
  * @experimental
@@ -137,81 +99,119 @@ class BuildWorkflow extends component_1.Component {
137
99
  addPostBuildJob(id, job) {
138
100
  const steps = [];
139
101
  if (this.artifactsDirectory) {
140
- const artfiactName = 'build-artifact';
141
- // add a step at the end of the build workflow which will upload the
142
- // artifact so we can download it in each post-build job (do it once).
143
- if (!this.uploadArtitactSteps) {
144
- this.uploadArtitactSteps = [{
145
- name: 'Upload artifact',
146
- uses: 'actions/upload-artifact@v2.1.1',
147
- // Setting to always will ensure that this step will run even if
148
- // the previous ones have failed (e.g. coverage report, internal logs, etc)
149
- if: 'always()',
150
- with: {
151
- name: artfiactName,
152
- path: this.artifactsDirectory,
153
- },
154
- }];
155
- }
156
102
  steps.push({
157
103
  name: 'Download build artifacts',
158
104
  uses: 'actions/download-artifact@v2',
159
105
  with: {
160
- name: artfiactName,
106
+ name: constants_1.BUILD_ARTIFACT_NAME,
161
107
  path: this.artifactsDirectory,
162
108
  },
163
109
  });
164
110
  }
165
111
  steps.push(...job.steps);
166
112
  this.workflow.addJob(id, {
167
- needs: [this.primaryJobId],
113
+ needs: [BUILD_JOBID],
114
+ // only run if build did not self-mutate
115
+ if: `\${{ ! needs.${BUILD_JOBID}.outputs.${SELF_MUTATION_HAPPENED_OUTPUT} }}`,
168
116
  ...job,
169
117
  steps: steps,
170
118
  });
171
119
  // add to the list of build job IDs
172
- this._buildJobIds.push(id);
120
+ this._postBuildJobs.push(id);
121
+ }
122
+ addSelfMutationJob() {
123
+ this.workflow.addJob('self-mutation', {
124
+ runsOn: ['ubuntu-latest'],
125
+ permissions: {
126
+ contents: workflows_model_1.JobPermission.WRITE,
127
+ },
128
+ needs: [BUILD_JOBID],
129
+ if: `\${{ needs.${BUILD_JOBID}.outputs.${SELF_MUTATION_HAPPENED_OUTPUT} && ${NOT_FORK} }}`,
130
+ steps: [
131
+ ...workflow_actions_1.WorkflowActions.checkoutWithPatch({
132
+ // we need to use a PAT so that our push will trigger the build workflow
133
+ token: `\${{ secrets.${this.workflow.projenTokenSecret} }}`,
134
+ ref: PULL_REQUEST_REF,
135
+ repository: PULL_REQUEST_REPOSITORY,
136
+ }),
137
+ ...workflow_actions_1.WorkflowActions.setGitIdentity(this.gitIdentity),
138
+ {
139
+ name: 'Push changes',
140
+ run: [
141
+ ' git add .',
142
+ ' git commit -m "chore: self mutation"',
143
+ ` git push origin HEAD:${PULL_REQUEST_REF}`,
144
+ ].join('\n'),
145
+ },
146
+ ],
147
+ });
173
148
  }
174
149
  /**
175
- * Called (lazily) during synth to render the build job steps.
150
+ * Adds a job that fails if there were file changes.
176
151
  */
177
- renderSteps() {
178
- const steps = new Array();
179
- steps.push({
180
- name: 'Checkout',
181
- uses: 'actions/checkout@v2',
182
- with: this.mutableBuilds ? {
183
- ref: BRANCH_REF,
184
- repository: REPO_REF,
185
- } : undefined,
186
- });
187
- steps.push(constants_1.setGitIdentityStep(this.gitIdentity));
188
- steps.push(...this.antitamperSteps);
189
- steps.push(...this.preBuildSteps);
190
- steps.push({
191
- name: this.buildTask.name,
192
- run: this.github.project.runTaskCommand(this.buildTask),
193
- });
194
- steps.push(...this.postBuildSteps);
195
- steps.push(...this.antitamperSteps);
196
- steps.push({
197
- name: 'Self mutation',
198
- id: SELF_MUTATION_STEP,
199
- run: [
200
- 'if ! git diff --exit-code; then',
201
- ' git add .',
202
- ' git commit -m "chore: self mutation"',
203
- ` git push origin HEAD:${BRANCH_REF}`,
204
- ` echo "::set-output name=${SELF_MUTATION_COMMIT}::$(git rev-parse HEAD)"`,
205
- 'fi',
206
- ].join('\n'),
152
+ addAntiTamperJob(options) {
153
+ const antitamperCondition = options.onlyForks
154
+ ? `\${{ needs.${BUILD_JOBID}.outputs.${SELF_MUTATION_HAPPENED_OUTPUT} && ${IS_FORK} }}`
155
+ : `\${{ needs.${BUILD_JOBID}.outputs.${SELF_MUTATION_HAPPENED_OUTPUT} }}`;
156
+ this.workflow.addJob('anti-tamper', {
157
+ runsOn: ['ubuntu-latest'],
158
+ if: antitamperCondition,
159
+ permissions: {},
160
+ needs: [BUILD_JOBID],
161
+ steps: [
162
+ ...workflow_actions_1.WorkflowActions.checkoutWithPatch({
163
+ repository: PULL_REQUEST_REPOSITORY,
164
+ ref: PULL_REQUEST_REF,
165
+ }),
166
+ {
167
+ name: 'Found diff after build (update your branch)',
168
+ run: 'git diff --exit-code',
169
+ },
170
+ ],
207
171
  });
208
- if (this.uploadArtitactSteps) {
209
- steps.push(...this.uploadArtitactSteps);
210
- }
211
- return steps;
172
+ }
173
+ /**
174
+ * Called (lazily) during synth to render the build job steps.
175
+ */
176
+ renderBuildSteps() {
177
+ return [
178
+ {
179
+ name: 'Checkout',
180
+ uses: 'actions/checkout@v2',
181
+ with: {
182
+ ref: PULL_REQUEST_REF,
183
+ repository: PULL_REQUEST_REPOSITORY,
184
+ },
185
+ },
186
+ ...this.preBuildSteps,
187
+ {
188
+ name: this.buildTask.name,
189
+ run: this.github.project.runTaskCommand(this.buildTask),
190
+ },
191
+ ...this.postBuildSteps,
192
+ {
193
+ name: 'Check self-mutation',
194
+ id: SELF_MUTATION_STEP,
195
+ run: `git diff --exit-code || echo "::set-output name=${SELF_MUTATION_HAPPENED_OUTPUT}::true"`,
196
+ },
197
+ ...workflow_actions_1.WorkflowActions.createUploadGitPatch({
198
+ if: `\${{ steps.${SELF_MUTATION_STEP}.outputs.${SELF_MUTATION_HAPPENED_OUTPUT} }}`,
199
+ }),
200
+ // upload the build artifact only if we have post-build jobs and only if
201
+ // there we NO self mutation.
202
+ ...(this._postBuildJobs.length == 0 ? [] : [{
203
+ name: 'Upload artifact',
204
+ uses: 'actions/upload-artifact@v2.1.1',
205
+ if: `\${{ ! steps.${SELF_MUTATION_STEP}.outputs.${SELF_MUTATION_HAPPENED_OUTPUT} }}`,
206
+ with: {
207
+ name: constants_1.BUILD_ARTIFACT_NAME,
208
+ path: this.artifactsDirectory,
209
+ },
210
+ }]),
211
+ ];
212
212
  }
213
213
  }
214
214
  exports.BuildWorkflow = BuildWorkflow;
215
215
  _a = JSII_RTTI_SYMBOL_1;
216
- BuildWorkflow[_a] = { fqn: "projen.build.BuildWorkflow", version: "0.46.2" };
217
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtd29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYnVpbGQvYnVpbGQtd29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSw0Q0FBeUM7QUFDekMsc0NBQWdFO0FBQ2hFLG1EQUFzRjtBQUN0RiwrREFBd0U7QUFHeEUsTUFBTSxVQUFVLEdBQUcsMkNBQTJDLENBQUM7QUFDL0QsTUFBTSxRQUFRLEdBQUcsc0RBQXNELENBQUM7QUFDeEUsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDO0FBQy9CLE1BQU0sa0JBQWtCLEdBQUcsZUFBZSxDQUFDO0FBQzNDLE1BQU0sb0JBQW9CLEdBQUcsc0JBQXNCLENBQUM7Ozs7QUErQnBELE1BQWEsYUFBYyxTQUFRLHFCQUFTOzs7O0lBZTFDLFlBQVksT0FBZ0IsRUFBRSxPQUE2Qjs7UUFDekQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWYsTUFBTSxNQUFNLEdBQUcsZUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1NBQ2xGO1FBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFFckIsSUFBSSxDQUFDLGFBQWEsU0FBRyxPQUFPLENBQUMsYUFBYSxtQ0FBSSxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLGNBQWMsU0FBRyxPQUFPLENBQUMsY0FBYyxtQ0FBSSxFQUFFLENBQUM7UUFDbkQsSUFBSSxDQUFDLGFBQWEsU0FBRyxPQUFPLENBQUMsWUFBWSxtQ0FBSSxJQUFJLENBQUM7UUFDbEQsSUFBSSxDQUFDLFdBQVcsU0FBRyxPQUFPLENBQUMsV0FBVyxtQ0FBSSx1Q0FBMkIsQ0FBQztRQUN0RSxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDbkMsSUFBSSxDQUFDLGtC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QUFlLENBQUMsQ0FBQztRQUVwQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ1QsSUFBSSxFQUFFLGVBQWU7WUFDckIsRUFBRSxFQUFFLGtCQUFrQjtZQUN0QixHQUFHLEVBQUU7Z0JBQ0gsaUNBQWlDO2dCQUNqQyxhQUFhO2dCQUNiLHdDQUF3QztnQkFDeEMsMEJBQTBCLFVBQVUsRUFBRTtnQkFDdEMsNkJBQTZCLG9CQUFvQiwwQkFBMEI7Z0JBQzNFLElBQUk7YUFDTCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDYixDQUFDLENBQUM7UUFFSCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUM1QixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDekM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7O0FBek5ILHNDQTBOQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRhc2sgfSBmcm9tICcuLic7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQnO1xuaW1wb3J0IHsgR2l0SHViLCBHaXRodWJXb3JrZmxvdywgR2l0SWRlbnRpdHkgfSBmcm9tICcuLi9naXRodWInO1xuaW1wb3J0IHsgREVGQVVMVF9HSVRIVUJfQUNUSU9OU19VU0VSLCBzZXRHaXRJZGVudGl0eVN0ZXAgfSBmcm9tICcuLi9naXRodWIvY29uc3RhbnRzJztcbmltcG9ydCB7IEpvYiwgSm9iUGVybWlzc2lvbiwgSm9iU3RlcCB9IGZyb20gJy4uL2dpdGh1Yi93b3JrZmxvd3MtbW9kZWwnO1xuaW1wb3J0IHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QnO1xuXG5jb25zdCBCUkFOQ0hfUkVGID0gJyR7eyBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmhlYWQucmVmIH19JztcbmNvbnN0IFJFUE9fUkVGID0gJyR7eyBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmhlYWQucmVwby5mdWxsX25hbWUgfX0nO1xuY29uc3QgUFJJTUFSWV9KT0JfSUQgPSAnYnVpbGQnO1xuY29uc3QgU0VMRl9NVVRBVElPTl9TVEVQID0gJ3NlbGZfbXV0YXRpb24nO1xuY29uc3QgU0VMRl9NVVRBVElPTl9DT01NSVQgPSAnc2VsZl9tdXRhdGlvbl9jb21taXQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkV29ya2Zsb3dPcHRpb25zIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgYnVpbGRUYXNrOiBUYXNrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgYXJ0aWZhY3RzRGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBjb250YWluZXJJbWFnZT86IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IG11dGFibGVCdWlsZD86IGJvb2xlYW47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHByZUJ1aWxkU3RlcHM/OiBKb2JTdGVwW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBwb3N0QnVpbGRTdGVwcz86IEpvYlN0ZXBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGdpdElkZW50aXR5PzogR2l0SWRlbnRpdHk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGVudj86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBhbnRpdGFtcGVyPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIEJ1aWxkV29ya2Zsb3cgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHBvc3RCdWlsZFN0ZXBzOiBKb2JTdGVwW107XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlQnVpbGRTdGVwczogSm9iU3RlcFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGFudGl0YW1wZXJTdGVwczogSm9iU3RlcFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IG11dGFibGVCdWlsZHM6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2l0SWRlbnRpdHk6IEdpdElkZW50aXR5O1xuICBwcml2YXRlIHJlYWRvbmx5IGJ1aWxkVGFzazogVGFzaztcbiAgcHJpdmF0ZSByZWFkb25seSBnaXRodWI6IEdpdEh1YjtcbiAgcHJpdmF0ZSByZWFkb25seSB3b3JrZmxvdzogR2l0aHViV29ya2Zsb3c7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJpbWFyeUpvYklkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJ0aWZhY3RzRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2J1aWxkSm9iSWRzOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSB1cGxvYWRBcnRpdGFjdFN0ZXBzPzogSm9iU3RlcFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIG9wdGlvbnM6IEJ1aWxkV29ya2Zsb3dPcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICBjb25zdCBnaXRodWIgPSBHaXRIdWIub2YocHJvamVjdCk7XG4gICAgaWYgKCFnaXRodWIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQnVpbGRXb3JrZmxvdyBpcyBjdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgZm9yIEdpdEh1YiBwcm9qZWN0cycpO1xuICAgIH1cblxuICAgIHRoaXMuZ2l0aHViID0gZ2l0aHViO1xuXG4gICAgdGhpcy5wcmVCdWlsZFN0ZXBzID0gb3B0aW9ucy5wcmVCdWlsZFN0ZXBzID8/IFtdO1xuICAgIHRoaXMucG9zdEJ1aWxkU3RlcHMgPSBvcHRpb25zLnBvc3RCdWlsZFN0ZXBzID8/IFtdO1xuICAgIHRoaXMubXV0YWJsZUJ1aWxkcyA9IG9wdGlvbnMubXV0YWJsZUJ1aWxkID8/IHRydWU7XG4gICAgdGhpcy5naXRJZGVudGl0eSA9IG9wdGlvbnMuZ2l0SWRlbnRpdHkgPz8gREVGQVVMVF9HSVRIVUJfQUNUSU9OU19VU0VSO1xuICAgIHRoaXMuYnVpbGRUYXNrID0gb3B0aW9ucy5idWlsZFRhc2s7XG4gICAgdGhpcy5hcnRpZmFjdHNEaXJlY3RvcnkgPSBvcHRpb25zLmFydGlmYWN0c0RpcmVjdG9yeTtcblxuICAgIGNvbnN0IGFudGl0YW1wZXIgPSBvcHRpb25zLmFudGl0YW1wZXIgPz8gdHJ1ZTtcblxuICAgIC8vIGRpc2FibGUgYW50aS10YW1wZXIgaWYgYnVpbGQgd29ya2Zsb3cgaXMgbXV0YWJsZVxuICAgIHRoaXMuYW50aXRhbXBlclN0ZXBzID0gKCF0aGlzLm11dGFibGVCdWlsZHMgPz8gYW50aXRhbXBlcikgPyBbe1xuICAgICAgLy8gYW50aS10YW1wZXIgY2hlY2sgKGZhaWxzIGlmIHRoZXJlIHdlcmUgY2hhbmdlcyB0byBjb21taXR0ZWQgZmlsZXMpXG4gICAgICAvLyB0aGlzIHdpbGwgaWRlbnRpZnkgYW55IG5vbi1jb21taXR0ZWQgZmlsZXMgZ2VuZXJhdGVkIGR1cmluZyBidWlsZCAoZS5nLiB0ZXN0IHNuYXBzaG90cylcbiAgICAgIG5hbWU6ICdBbnRpLXRhbXBlciBjaGVjaycsXG4gICAgICBydW46ICdnaXQgZGlmZiAtLWlnbm9yZS1zcGFjZS1hdC1lb2wgLS1leGl0LWNvZGUnLFxuICAgIH1dIDogW107XG5cbiAgICB0aGlzLndvcmtmbG93ID0gbmV3IEdpdGh1YldvcmtmbG93KGdpdGh1YiwgJ2J1aWxkJyk7XG5cbiAgICB0aGlzLndvcmtmbG93Lm9uKHtcbiAgICAgIHB1bGxSZXF1ZXN0OiB7fSxcbiAgICAgIHdvcmtmbG93RGlzcGF0Y2g6IHt9LCAvLyBhbGxvdyBtYW51YWwgdHJpZ2dlcmluZ1xuICAgIH0pO1xuXG4gICAgdGhpcy53b3JrZmxvdy5hZGRKb2IoUFJJTUFSWV9KT0JfSUQsIHtcbiAgICAgIHJ1bnNPbjogWyd1YnVudHUtbGF0ZXN0J10sXG4gICAgICBjb250YWluZXI6IG9wdGlvbnMuY29udGFpbmVySW1hZ2UgPyB7IGltYWdlOiBvcHRpb25zLmNvbnRhaW5lckltYWdlIH0gOiB1bmRlZmluZWQsXG4gICAgICBlbnY6IHtcbiAgICAgICAgQ0k6ICd0cnVlJyxcbiAgICAgICAgLi4ub3B0aW9ucy5lbnYsXG4gICAgICB9LFxuICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgY29udGVudHM6IEpvYlBlcm1pc3Npb24uV1JJVEUsXG4gICAgICB9LFxuICAgICAgb3V0cHV0czoge1xuICAgICAgICBbU0VMRl9NVVRBVElPTl9DT01NSVRdOiB7XG4gICAgICAgICAgc3RlcElkOiBTRUxGX01VVEFUSU9OX1NURVAsXG4gICAgICAgICAgb3V0cHV0TmFtZTogU0VMRl9NVVRBVElPTl9DT01NSVQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc3RlcHM6ICgoKSA9PiB0aGlzLnJlbmRlclN0ZXBzKCkpIGFzIGFueSxcbiAgICB9KTtcblxuICAgIHRoaXMucHJpbWFyeUpvYklkID0gUFJJTUFSWV9KT0JfSUQ7XG5cbiAgICB0aGlzLl9idWlsZEpvYklkcyA9IFtQUklNQVJZX0pPQl9JRF07XG5cbiAgICB0aGlzLndvcmtmbG93LmFkZEpvYigndXBkYXRlLXN0YXR1cycsIHtcbiAgICAgIHJ1bnNPbjogWyd1YnVudHUtbGF0ZXN0J10sXG4gICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICBjaGVja3M6IEpvYlBlcm1pc3Npb24uV1JJVEUsXG4gICAgICAgIGFjdGlvbnM6IEpvYlBlcm1pc3Npb24uV1JJVEUsXG4gICAgICB9LFxuICAgICAgbmVlZHM6ICgoKSA9PiB0aGlzLl9idWlsZEpvYklkcykgYXMgYW55LCAvLyB3YWl0IGZvciBhbGwgYnVpbGQgam9icyB0byBmaW5pc2hcbiAgICAgIGlmOiBgXFwke3sgbmVlZHMuJHt0aGlzLnByaW1hcnlKb2JJZH0ub3V0cHV0cy4ke1NFTEZfTVVUQVRJT05fQ09NTUlUfSB9fWAsXG4gICAgICBzdGVwczogW1xuICAgICAgLy8gaWYgd2UgcHVzaGVkIGNoYW5nZXMsIHdlIG5lZWQgdG8gbWFudWFsbHkgdXBkYXRlIHRoZSBzdGF0dXMgY2hlY2sgc29cbiAgICAgIC8vIHRoYXQgdGhlIFBSIHdpbGwgYmUgZ3JlZW4gKHdlIHdvbid0IGdldCBoZXJlIGZvciBmb3JrcyB3aXRoIHVwZGF0ZXNcbiAgICAgIC8vIGJlY2F1c2UgdGhlIHB1c2ggd291bGQgaGF2ZSBmYWlsZWQpLlxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ1VwZGF0ZSBzdGF0dXMgY2hlY2sgKGlmIGNoYW5nZWQpJyxcbiAgICAgICAgICBydW46IFtcbiAgICAgICAgICAgICdnaCBhcGknLFxuICAgICAgICAgICAgJy1YIFBPU1QnLFxuICAgICAgICAgICAgYC9yZXBvcy8ke1JFUE9fUkVGfS9jaGVjay1ydW5zYCxcbiAgICAgICAgICAgIGAtRiBuYW1lPVwiJHtQUklNQVJZX0pPQl9JRH1cImAsXG4gICAgICAgICAgICBgLUYgaGVhZF9zaGE9XCJcXCR7eyBuZWVkcy4ke3RoaXMucHJpbWFyeUpvYklkfS5vdXRwdXRzLiR7U0VMRl9NVVRBVElPTl9DT01NSVR9IH19XCJgLFxuICAgICAgICAgICAgJy1GIHN0YXR1cz1cImNvbXBsZXRlZFwiJyxcbiAgICAgICAgICAgICctRiBjb25jbHVzaW9uPVwic3VjY2Vzc1wiJyxcbiAgICAgICAgICBdLmpvaW4oJyAnKSxcbiAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgIEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBpZiB3ZSBwdXNoZWQgY2hhbmdlcywgd2UgbmVlZCB0byBtYXJrIHRoZSBjdXJyZW50IGNvbW1pdCBhcyBmYWlsZWQsIHNvXG4gICAgICAgIC8vIHRoYXQgR2l0SHViIGF1dG8tbWVyZ2UgZG9lcyBub3QgcmlzayBtZXJnaW5nIHRoaXMgY29tbWl0IGJlZm9yZSB0aGVcbiAgICAgICAgLy8gZXZlbnQgZm9yIHRoZSBuZXcgY29tbWl0IGhhcyByZWdpc3RlcmVkLlxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0NhbmNlbCB3b3JrZmxvdyAoaWYgY2hhbmdlZCknLFxuICAgICAgICAgIHJ1bjogW1xuICAgICAgICAgICAgJ2doIGFwaScsXG4gICAgICAgICAgICAnLVggUE9TVCcsXG4gICAgICAgICAgICBgL3JlcG9zLyR7UkVQT19SRUZ9L2FjdGlvbnMvcnVucy9cXCR7eyBnaXRodWIucnVuX2lkIH19L2NhbmNlbGAsXG4gICAgICAgICAgXS5qb2luKCcgJyksXG4gICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICBHSVRIVUJfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcHVibGljIGdldCBidWlsZEpvYklkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9idWlsZEpvYklkc107XG4gIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBwdWJsaWMgYWRkUG9zdEJ1aWxkU3RlcHMoLi4uc3RlcHM6IEpvYlN0ZXBbXSk6IHZvaWQge1xuICAgIHRoaXMucG9zdEJ1aWxkU3RlcHMucHVzaCguLi5zdGVwcyk7XG4gIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcHVibGljIGFkZFBvc3RCdWlsZEpvYihpZDogc3RyaW5nLCBqb2I6IEpvYikge1xuICAgIGNvbnN0IHN0ZXBzID0gW107XG5cbiAgICBpZiAodGhpcy5hcnRpZmFjdHNEaXJlY3RvcnkpIHtcbiAgICAgIGNvbnN0IGFydGZpYWN0TmFtZSA9ICdidWlsZC1hcnRpZmFjdCc7XG5cbiAgICAgIC8vIGFkZCBhIHN0ZXAgYXQgdGhlIGVuZCBvZiB0aGUgYnVpbGQgd29ya2Zsb3cgd2hpY2ggd2lsbCB1cGxvYWQgdGhlXG4gICAgICAvLyBhcnRpZmFjdCBzbyB3ZSBjYW4gZG93bmxvYWQgaXQgaW4gZWFjaCBwb3N0LWJ1aWxkIGpvYiAoZG8gaXQgb25jZSkuXG4gICAgICBpZiAoIXRoaXMudXBsb2FkQXJ0aXRhY3RTdGVwcykge1xuICAgICAgICB0aGlzLnVwbG9hZEFydGl0YWN0U3RlcHMgPSBbe1xuICAgICAgICAgIG5hbWU6ICdVcGxvYWQgYXJ0aWZhY3QnLFxuICAgICAgICAgIHVzZXM6ICdhY3Rpb25zL3VwbG9hZC1hcnRpZmFjdEB2Mi4xLjEnLFxuICAgICAgICAgIC8vIFNldHRpbmcgdG8gYWx3YXlzIHdpbGwgZW5zdXJlIHRoYXQgdGhpcyBzdGVwIHdpbGwgcnVuIGV2ZW4gaWZcbiAgICAgICAgICAvLyB0aGUgcHJldmlvdXMgb25lcyBoYXZlIGZhaWxlZCAoZS5nLiBjb3ZlcmFnZSByZXBvcnQsIGludGVybmFsIGxvZ3MsIGV0YylcbiAgICAgICAgICBpZjogJ2Fsd2F5cygpJyxcbiAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICBuYW1lOiBhcnRmaWFjdE5hbWUsXG4gICAgICAgICAgICBwYXRoOiB0aGlzLmFydGlmYWN0c0RpcmVjdG9yeSxcbiAgICAgICAgICB9LFxuICAgICAgICB9XTtcbiAgICAgIH1cblxuICAgICAgc3RlcHMucHVzaCh7XG4gICAgICAgIG5hbWU6ICdEb3dubG9hZCBidWlsZCBhcnRpZmFjdHMnLFxuICAgICAgICB1c2VzOiAnYWN0aW9ucy9kb3dubG9hZC1hcnRpZmFjdEB2MicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICBuYW1lOiBhcnRmaWFjdE5hbWUsXG4gICAgICAgICAgcGF0aDogdGhpcy5hcnRpZmFjdHNEaXJlY3RvcnksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGVwcy5wdXNoKC4uLmpvYi5zdGVwcyk7XG5cbiAgICB0aGlzLndvcmtmbG93LmFkZEpvYihpZCwge1xuICAgICAgbmVlZHM6IFt0aGlzLnByaW1hcnlKb2JJZF0sXG4gICAgICAuLi5qb2IsXG4gICAgICBzdGVwczogc3RlcHMsXG4gICAgfSk7XG5cbiAgICAvLyBhZGQgdG8gdGhlIGxpc3Qgb2YgYnVpbGQgam9iIElEc1xuICAgIHRoaXMuX2J1aWxkSm9iSWRzLnB1c2goaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCAobGF6aWx5KSBkdXJpbmcgc3ludGggdG8gcmVuZGVyIHRoZSBidWlsZCBqb2Igc3RlcHMuXG4gICAqL1xuICBwcml2YXRlIHJlbmRlclN0ZXBzKCk6IEpvYlN0ZXBbXSB7XG4gICAgY29uc3Qgc3RlcHMgPSBuZXcgQXJyYXk8Sm9iU3RlcD4oKTtcblxuICAgIHN0ZXBzLnB1c2goe1xuICAgICAgbmFtZTogJ0NoZWNrb3V0JyxcbiAgICAgIHVzZXM6ICdhY3Rpb25zL2NoZWNrb3V0QHYyJyxcbiAgICAgIHdpdGg6IHRoaXMubXV0YWJsZUJ1aWxkcyA/IHtcbiAgICAgICAgcmVmOiBCUkFOQ0hfUkVGLFxuICAgICAgICByZXBvc2l0b3J5OiBSRVBPX1JFRixcbiAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICBzdGVwcy5wdXNoKHNldEdpdElkZW50aXR5U3RlcCh0aGlzLmdpdElkZW50aXR5KSk7XG5cbiAgICBzdGVwcy5wdXNoKC4uLnRoaXMuYW50aXRhbXBlclN0ZXBzKTtcbiAgICBzdGVwcy5wdXNoKC4uLnRoaXMucHJlQnVpbGRTdGVwcyk7XG4gICAgc3RlcHMucHVzaCh7XG4gICAgICBuYW1lOiB0aGlzLmJ1aWxkVGFzay5uYW1lLFxuICAgICAgcnVuOiB0aGlzLmdpdGh1Yi5wcm9qZWN0LnJ1blRhc2tDb21tYW5kKHRoaXMuYnVpbGRUYXNrKSxcbiAgICB9KTtcbiAgICBzdGVwcy5wdXNoKC4uLnRoaXMucG9zdEJ1aWxkU3RlcHMpO1xuICAgIHN0ZXBzLnB1c2goLi4udGhpcy5hbnRpdGFtcGVyU3RlcHMpO1xuXG4gICAgc3RlcHMucHVzaCh7XG4gICAgICBuYW1lOiAnU2VsZiBtdXRhdGlvbicsXG4gICAgICBpZDogU0VMRl9NVVRBVElPTl9TVEVQLFxuICAgICAgcnVuOiBbXG4gICAgICAgICdpZiAhIGdpdCBkaWZmIC0tZXhpdC1jb2RlOyB0aGVuJyxcbiAgICAgICAgJyAgZ2l0IGFkZCAuJyxcbiAgICAgICAgJyAgZ2l0IGNvbW1pdCAtbSBcImNob3JlOiBzZWxmIG11dGF0aW9uXCInLFxuICAgICAgICBgICBnaXQgcHVzaCBvcmlnaW4gSEVBRDoke0JSQU5DSF9SRUZ9YCxcbiAgICAgICAgYCAgZWNobyBcIjo6c2V0LW91dHB1dCBuYW1lPSR7U0VMRl9NVVRBVElPTl9DT01NSVR9OjokKGdpdCByZXYtcGFyc2UgSEVBRClcImAsXG4gICAgICAgICdmaScsXG4gICAgICBdLmpvaW4oJ1xcbicpLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMudXBsb2FkQXJ0aXRhY3RTdGVwcykge1xuICAgICAgc3RlcHMucHVzaCguLi50aGlzLnVwbG9hZEFydGl0YWN0U3RlcHMpO1xuICAgIH1cblxuICAgIHJldHVybiBzdGVwcztcbiAgfVxufSJdfQ==
216
+ BuildWorkflow[_a] = { fqn: "projen.build.BuildWorkflow", version: "0.47.1" };
217
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtd29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYnVpbGQvYnVpbGQtd29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSw0Q0FBeUM7QUFDekMsc0NBQWdFO0FBQ2hFLG1EQUF1RjtBQUN2RixpRUFBNkQ7QUFDN0QsK0RBQXdFO0FBR3hFLE1BQU0sZ0JBQWdCLEdBQUcsMkNBQTJDLENBQUM7QUFDckUsTUFBTSx1QkFBdUIsR0FBRyxzREFBc0QsQ0FBQztBQUN2RixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUM7QUFDNUIsTUFBTSxrQkFBa0IsR0FBRyxlQUFlLENBQUM7QUFDM0MsTUFBTSw2QkFBNkIsR0FBRyx3QkFBd0IsQ0FBQztBQUMvRCxNQUFNLE9BQU8sR0FBRyxvRUFBb0UsQ0FBQztBQUNyRixNQUFNLFFBQVEsR0FBRyxLQUFLLE9BQU8sR0FBRyxDQUFDOzs7O0FBNEJqQyxNQUFhLGFBQWMsU0FBUSxxQkFBUzs7OztJQVcxQyxZQUFZLE9BQWdCLEVBQUUsT0FBNkI7O1FBQ3pELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUhBLG1CQUFjLEdBQWEsRUFBRSxDQUFDO1FBSzdDLE1BQU0sTUFBTSxHQUFHLGVBQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsK0RBQStELENBQUMsQ0FBQztTQUNsRjtRQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxhQUFhLFNBQUcsT0FBTyxDQUFDLGFBQWEsbUNBQUksRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxjQUFjLFNBQUcsT0FBTyxDQUFDLGNBQWMsbUNBQUksRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxXQUFXLFNBQUcsT0FBTyxDQUFDLFdBQVcsbUNBQUksdUNBQTJCLENBQUM7UUFD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Q0FBZ0M7b0JBQ3RDLEVBQUUsRUFBRSxnQkFBZ0Isa0JBQWtCLFlBQVksNkJBQTZCLEtBQUs7b0JBQ3BGLElBQUksRUFBRTt3QkFDSixJQUFJLEVBQUUsK0JBQW1CO3dCQUN6QixJQUFJLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtxQkFDOUI7aUJBQ0YsQ0FBQyxDQUFDO1NBQ0osQ0FBQztJQUNKLENBQUM7O0FBeE1ILHNDQXlNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRhc2sgfSBmcm9tICcuLic7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQnO1xuaW1wb3J0IHsgR2l0SHViLCBHaXRodWJXb3JrZmxvdywgR2l0SWRlbnRpdHkgfSBmcm9tICcuLi9naXRodWInO1xuaW1wb3J0IHsgQlVJTERfQVJUSUZBQ1RfTkFNRSwgREVGQVVMVF9HSVRIVUJfQUNUSU9OU19VU0VSIH0gZnJvbSAnLi4vZ2l0aHViL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBXb3JrZmxvd0FjdGlvbnMgfSBmcm9tICcuLi9naXRodWIvd29ya2Zsb3ctYWN0aW9ucyc7XG5pbXBvcnQgeyBKb2IsIEpvYlBlcm1pc3Npb24sIEpvYlN0ZXAgfSBmcm9tICcuLi9naXRodWIvd29ya2Zsb3dzLW1vZGVsJztcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0JztcblxuY29uc3QgUFVMTF9SRVFVRVNUX1JFRiA9ICcke3sgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5oZWFkLnJlZiB9fSc7XG5jb25zdCBQVUxMX1JFUVVFU1RfUkVQT1NJVE9SWSA9ICcke3sgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5oZWFkLnJlcG8uZnVsbF9uYW1lIH19JztcbmNvbnN0IEJVSUxEX0pPQklEID0gJ2J1aWxkJztcbmNvbnN0IFNFTEZfTVVUQVRJT05fU1RFUCA9ICdzZWxmX211dGF0aW9uJztcbmNvbnN0IFNFTEZfTVVUQVRJT05fSEFQUEVORURfT1VUUFVUID0gJ3NlbGZfbXV0YXRpb25faGFwcGVuZWQnO1xuY29uc3QgSVNfRk9SSyA9ICdnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmhlYWQucmVwby5mdWxsX25hbWUgIT0gZ2l0aHViLnJlcG9zaXRvcnknO1xuY29uc3QgTk9UX0ZPUksgPSBgISgke0lTX0ZPUkt9KWA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRXb3JrZmxvd09wdGlvbnMge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBidWlsZFRhc2s6IFRhc2s7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBhcnRpZmFjdHNEaXJlY3Rvcnk6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGNvbnRhaW5lckltYWdlPzogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgbXV0YWJsZUJ1aWxkPzogYm9vbGVhbjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgcHJlQnVpbGRTdGVwcz86IEpvYlN0ZXBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHBvc3RCdWlsZFN0ZXBzPzogSm9iU3RlcFtdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgZ2l0SWRlbnRpdHk/OiBHaXRJZGVudGl0eTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgZW52PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEJ1aWxkV29ya2Zsb3cgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHBvc3RCdWlsZFN0ZXBzOiBKb2JTdGVwW107XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlQnVpbGRTdGVwczogSm9iU3RlcFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGdpdElkZW50aXR5OiBHaXRJZGVudGl0eTtcbiAgcHJpdmF0ZSByZWFkb25seSBidWlsZFRhc2s6IFRhc2s7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2l0aHViOiBHaXRIdWI7XG4gIHByaXZhdGUgcmVhZG9ubHkgd29ya2Zsb3c6IEdpdGh1YldvcmtmbG93O1xuICBwcml2YXRlIHJlYWRvbmx5IGFydGlmYWN0c0RpcmVjdG9yeT86IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IF9wb3N0QnVpbGRKb2JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIG9wdGlvbnM6IEJ1aWxkV29ya2Zsb3dPcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICBjb25zdCBnaXRodWIgPSBHaXRIdWIub2YocHJvamVjdCk7XG4gICAgaWYgKCFnaXRodWIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQnVpbGRXb3JrZmxvdyBpcyBjdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgZm9yIEdpdEh1YiBwcm9qZWN0cycpO1xuICAgIH1cblxuICAgIHRoaXMuZ2l0aHViID0gZ2l0aHViO1xuICAgIHRoaXMucHJlQnVpbGRTdGVwcyA9IG9wdGlvbnMucHJlQnVpbGRTdGVwcyA/PyBbXTtcbiAgICB0aGlzLnBvc3RCdWlsZFN0ZXBzID0gb3B0aW9ucy5wb3N0QnVpbGRTdGVwcyA/PyBbXTtcbiAgICB0aGlzLmdpdElkZW50aXR5ID0gb3B0aW9ucy5naXRJZGVudGl0eSA/PyBERUZBVUxUX0dJVEhVQl9BQ1RJT05TX1VTRVI7XG4gICAgdGhpcy5idWlsZFRhc2sgPSBvcHRpb25zLmJ1aWxkVGFzaztcbiAgICB0aGlzLmFydGlmYWN0c0RpcmVjdG9yeSA9IG9wdGlvbnMuYXJ0aWZhY3RzRGlyZWN0b3J5O1xuICAgIGNvbnN0IG11dGFibGVCdWlsZHMgPSBvcHRpb25zLm11dGFibGVCdWlsZCA/PyB0cnVlO1xuXG4gICAgdGhpcy53b3JrZmxvdyA9IG5ldyBHaXRodWJXb3JrZmxvdyhnaXRodWIsICdidWlsZCcpO1xuICAgIHRoaXMud29ya2Zsb3cub24oe1xuICAgICAgcHVsbFJlcXVlc3Q6IHt9LFxuICAgICAgd29ya2Zsb3dEaXNwYXRjaDoge30sIC8vIGFsbG93IG1hbnVhbCB0cmlnZ2VyaW5nXG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZEJ1aWxkSm9iKG9wdGlvbnMpO1xuICAgIHRoaXMuYWRkQW50aVRhbXBlckpvYih7IG9ubHlGb3JrczogbXV0YWJsZUJ1aWxkcyB9KTtcbiAgICBpZiAobXV0YWJsZUJ1aWxkcykge1xuICAgICAgdGhpcy5hZGRTZWxmTXV0YXRpb25Kb2IoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZEJ1aWxkSm9iKG9wdGlvbnM6IEJ1aWxkV29ya2Zsb3dPcHRpb25zKSB7XG4gICAgdGhpcy53b3JrZmxvdy5hZGRKb2IoQlVJTERfSk9CSUQsIHtcbiAgICAgIHJ1bnNPbjogWyd1YnVudHUtbGF0ZXN0J10sXG4gICAgICBjb250YWluZXI6IG9wdGlvbnMuY29udGFpbmVySW1hZ2UgPyB7IGltYWdlOiBvcHRpb25zLmNvbnRhaW5lckltYWdlIH0gOiB1bmRlZmluZWQsXG4gICAgICBlbnY6IHtcbiAgICAgICAgQ0k6ICd0cnVlJyxcbiAgICAgICAgLi4ub3B0aW9ucy5lbnYsXG4gICAgICB9LFxuICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgY29udGVudHM6IEpvYlBlcm1pc3Npb24uV1JJVEUsXG4gICAgICB9LFxuICAgICAgc3RlcHM6ICgoKSA9PiB0aGlzLnJlbmRlckJ1aWxkU3RlcHMoKSkgYXMgYW55LFxuICAgICAgb3V0cHV0czoge1xuICAgICAgICBbU0VMRl9NVVRBVElPTl9IQVBQRU5FRF9PVVRQVVRdOiB7XG4gICAgICAgICAgc3RlcElkOiBTRUxGX01VVEFUSU9OX1NURVAsXG4gICAgICAgICAgb3V0cHV0TmFtZTogU0VMRl9NVVRBVElPTl9IQVBQRU5FRF9PVVRQVVQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcHVibGljIGdldCBidWlsZEpvYklkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtCVUlMRF9KT0JJRCwgLi4udGhpcy5fcG9zdEJ1aWxkSm9ic107XG4gIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBwdWJsaWMgYWRkUG9zdEJ1aWxkU3RlcHMoLi4uc3RlcHM6IEpvYlN0ZXBbXSk6IHZvaWQge1xuICAgIHRoaXMucG9zdEJ1aWxkU3RlcHMucHVzaCguLi5zdGVwcyk7XG4gIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyBhZGRQb3N0QnVpbGRKb2IoaWQ6IHN0cmluZywgam9iOiBKb2IpIHtcbiAgICBjb25zdCBzdGVwcyA9IFtdO1xuXG4gICAgaWYgKHRoaXMuYXJ0aWZhY3RzRGlyZWN0b3J5KSB7XG4gICAgICBzdGVwcy5wdXNoKHtcbiAgICAgICAgbmFtZTogJ0Rvd25sb2FkIGJ1aWxkIGFydGlmYWN0cycsXG4gICAgICAgIHVzZXM6ICdhY3Rpb25zL2Rvd25sb2FkLWFydGlmYWN0QHYyJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgIG5hbWU6IEJVSUxEX0FSVElGQUNUX05BTUUsXG4gICAgICAgICAgcGF0aDogdGhpcy5hcnRpZmFjdHNEaXJlY3RvcnksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGVwcy5wdXNoKC4uLmpvYi5zdGVwcyk7XG5cbiAgICB0aGlzLndvcmtmbG93LmFkZEpvYihpZCwge1xuICAgICAgbmVlZHM6IFtCVUlMRF9KT0JJRF0sXG4gICAgICAvLyBvbmx5IHJ1biBpZiBidWlsZCBkaWQgbm90IHNlbGYtbXV0YXRlXG4gICAgICBpZjogYFxcJHt7ICEgbmVlZHMuJHtCVUlMRF9KT0JJRH0ub3V0cHV0cy4ke1NFTEZfTVVUQVRJT05fSEFQUEVORURfT1VUUFVUfSB9fWAsXG4gICAgICAuLi5qb2IsXG4gICAgICBzdGVwczogc3RlcHMsXG4gICAgfSk7XG5cbiAgICAvLyBhZGQgdG8gdGhlIGxpc3Qgb2YgYnVpbGQgam9iIElEc1xuICAgIHRoaXMuX3Bvc3RCdWlsZEpvYnMucHVzaChpZCk7XG4gIH1cblxuXG4gIHByaXZhdGUgYWRkU2VsZk11dGF0aW9uSm9iKCkge1xuICAgIHRoaXMud29ya2Zsb3cuYWRkSm9iKCdzZWxmLW11dGF0aW9uJywge1xuICAgICAgcnVuc09uOiBbJ3VidW50dS1sYXRlc3QnXSxcbiAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIGNvbnRlbnRzOiBKb2JQZXJtaXNzaW9uLldSSVRFLFxuICAgICAgfSxcbiAgICAgIG5lZWRzOiBbQlVJTERfSk9CSURdLFxuICAgICAgaWY6IGBcXCR7eyBuZWVkcy4ke0JVSUxEX0pPQklEfS5vdXRwdXRzLiR7U0VMRl9NVVRBVElPTl9IQVBQRU5FRF9PVVRQVVR9ICYmICR7Tk9UX0ZPUkt9IH19YCxcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIC4uLldvcmtmbG93QWN0aW9ucy5jaGVja291dFdpdGhQYXRjaCh7XG4gICAgICAgICAgLy8gd2UgbmVlZCB0byB1c2UgYSBQQVQgc28gdGhhdCBvdXIgcHVzaCB3aWxsIHRyaWdnZXIgdGhlIGJ1aWxkIHdvcmtmbG93XG4gICAgICAgICAgdG9rZW46IGBcXCR7eyBzZWNyZXRzLiR7dGhpcy53b3JrZmxvdy5wcm9qZW5Ub2tlblNlY3JldH0gfX1gLFxuICAgICAgICAgIHJlZjogUFVMTF9SRVFVRVNUX1JFRixcbiAgICAgICAgICByZXBvc2l0b3J5OiBQVUxMX1JFUVVFU1RfUkVQT1NJVE9SWSxcbiAgICAgICAgfSksXG4gICAgICAgIC4uLldvcmtmbG93QWN0aW9ucy5zZXRHaXRJZGVudGl0eSh0aGlzLmdpdElkZW50aXR5KSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdQdXNoIGNoYW5nZXMnLFxuICAgICAgICAgIHJ1bjogW1xuICAgICAgICAgICAgJyAgZ2l0IGFkZCAuJyxcbiAgICAgICAgICAgICcgIGdpdCBjb21taXQgLW0gXCJjaG9yZTogc2VsZiBtdXRhdGlvblwiJyxcbiAgICAgICAgICAgIGAgIGdpdCBwdXNoIG9yaWdpbiBIRUFEOiR7UFVMTF9SRVFVRVNUX1JFRn1gLFxuICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBqb2IgdGhhdCBmYWlscyBpZiB0aGVyZSB3ZXJlIGZpbGUgY2hhbmdlcy5cbiAgICovXG4gIHByaXZhdGUgYWRkQW50aVRhbXBlckpvYihvcHRpb25zOiB7IG9ubHlGb3JrczogYm9vbGVhbiB9KSB7XG4gICAgY29uc3QgYW50aXRhbXBlckNvbmRpdGlvbiA9IG9wdGlvbnMub25seUZvcmtzXG4gICAgICA/IGBcXCR7eyBuZWVkcy4ke0JVSUxEX0pPQklEfS5vdXRwdXRzLiR7U0VMRl9NVVRBVElPTl9IQVBQRU5FRF9PVVRQVVR9ICYmICR7SVNfRk9SS30gfX1gXG4gICAgICA6IGBcXCR7eyBuZWVkcy4ke0JVSUxEX0pPQklEfS5vdXRwdXRzLiR7U0VMRl9NVVRBVElPTl9IQVBQRU5FRF9PVVRQVVR9IH19YDtcblxuICAgIHRoaXMud29ya2Zsb3cuYWRkSm9iKCdhbnRpLXRhbXBlcicsIHtcbiAgICAgIHJ1bnNPbjogWyd1YnVudHUtbGF0ZXN0J10sXG4gICAgICBpZjogYW50aXRhbXBlckNvbmRpdGlvbixcbiAgICAgIHBlcm1pc3Npb25zOiB7fSxcbiAgICAgIG5lZWRzOiBbQlVJTERfSk9CSURdLFxuICAgICAgc3RlcHM6IFtcbiAgICAgICAgLi4uV29ya2Zsb3dBY3Rpb25zLmNoZWNrb3V0V2l0aFBhdGNoKHtcbiAgICAgICAgICByZXBvc2l0b3J5OiBQVUxMX1JFUVVFU1RfUkVQT1NJVE9SWSxcbiAgICAgICAgICByZWY6IFBVTExfUkVRVUVTVF9SRUYsXG4gICAgICAgIH0pLFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0ZvdW5kIGRpZmYgYWZ0ZXIgYnVpbGQgKHVwZGF0ZSB5b3VyIGJyYW5jaCknLFxuICAgICAgICAgIHJ1bjogJ2dpdCBkaWZmIC0tZXhpdC1jb2RlJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIChsYXppbHkpIGR1cmluZyBzeW50aCB0byByZW5kZXIgdGhlIGJ1aWxkIGpvYiBzdGVwcy5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQnVpbGRTdGVwcygpOiBKb2JTdGVwW10ge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdDaGVja291dCcsXG4gICAgICAgIHVzZXM6ICdhY3Rpb25zL2NoZWNrb3V0QHYyJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgIHJlZjogUFVMTF9SRVFVRVNUX1JFRixcbiAgICAgICAgICByZXBvc2l0b3J5OiBQVUxMX1JFUVVFU1RfUkVQT1NJVE9SWSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIC4uLnRoaXMucHJlQnVpbGRTdGVwcyxcblxuICAgICAge1xuICAgICAgICBuYW1lOiB0aGlzLmJ1aWxkVGFzay5uYW1lLFxuICAgICAgICBydW46IHRoaXMuZ2l0aHViLnByb2plY3QucnVuVGFza0NvbW1hbmQodGhpcy5idWlsZFRhc2spLFxuICAgICAgfSxcblxuICAgICAgLi4udGhpcy5wb3N0QnVpbGRTdGVwcyxcblxuICAgICAge1xuICAgICAgICBuYW1lOiAnQ2hlY2sgc2VsZi1tdXRhdGlvbicsXG4gICAgICAgIGlkOiBTRUxGX01VVEFUSU9OX1NURVAsXG4gICAgICAgIHJ1bjogYGdpdCBkaWZmIC0tZXhpdC1jb2RlIHx8IGVjaG8gXCI6OnNldC1vdXRwdXQgbmFtZT0ke1NFTEZfTVVUQVRJT05fSEFQUEVORURfT1VUUFVUfTo6dHJ1ZVwiYCxcbiAgICAgIH0sXG5cbiAgICAgIC4uLldvcmtmbG93QWN0aW9ucy5jcmVhdGVVcGxvYWRHaXRQYXRjaCh7XG4gICAgICAgIGlmOiBgXFwke3sgc3RlcHMuJHtTRUxGX01VVEFUSU9OX1NURVB9Lm91dHB1dHMuJHtTRUxGX01VVEFUSU9OX0hBUFBFTkVEX09VVFBVVH0gfX1gLFxuICAgICAgfSksXG5cbiAgICAgIC8vIHVwbG9hZCB0aGUgYnVpbGQgYXJ0aWZhY3Qgb25seSBpZiB3ZSBoYXZlIHBvc3QtYnVpbGQgam9icyBhbmQgb25seSBpZlxuICAgICAgLy8gdGhlcmUgd2UgTk8gc2VsZiBtdXRhdGlvbi5cbiAgICAgIC4uLih0aGlzLl9wb3N0QnVpbGRKb2JzLmxlbmd0aCA9PSAwID8gW10gOiBbe1xuICAgICAgICBuYW1lOiAnVXBsb2FkIGFydGlmYWN0JyxcbiAgICAgICAgdXNlczogJ2FjdGlvbnMvdXBsb2FkLWFydGlmYWN0QHYyLjEuMScsXG4gICAgICAgIGlmOiBgXFwke3sgISBzdGVwcy4ke1NFTEZfTVVUQVRJT05fU1RFUH0ub3V0cHV0cy4ke1NFTEZfTVVUQVRJT05fSEFQUEVORURfT1VUUFVUfSB9fWAsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICBuYW1lOiBCVUlMRF9BUlRJRkFDVF9OQU1FLFxuICAgICAgICAgIHBhdGg6IHRoaXMuYXJ0aWZhY3RzRGlyZWN0b3J5LFxuICAgICAgICB9LFxuICAgICAgfV0pLFxuICAgIF07XG4gIH1cbn1cbiJdfQ==
@@ -26,5 +26,5 @@ class ConstructLibrary extends jsii_project_1.JsiiProject {
26
26
  }
27
27
  exports.ConstructLibrary = ConstructLibrary;
28
28
  _a = JSII_RTTI_SYMBOL_1;
29
- ConstructLibrary[_a] = { fqn: "projen.cdk.ConstructLibrary", version: "0.46.2" };
29
+ ConstructLibrary[_a] = { fqn: "projen.cdk.ConstructLibrary", version: "0.47.1" };
30
30
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RydWN0LWxpYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jZGsvY29uc3RydWN0LWxpYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGlEQUFpRTs7Ozs7O0FBZ0JqRSxNQUFzQixnQkFBaUIsU0FBUSwwQkFBVzs7OztJQUN4RCxZQUFZLE9BQWdDO1FBQzFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVmLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyx5QkFBeUI7UUFDbEQsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRTtnQkFDaEMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTztnQkFDaEMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUTthQUNuQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7O0FBWEgsNENBWUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBKc2lpUHJvamVjdCwgSnNpaVByb2plY3RPcHRpb25zIH0gZnJvbSAnLi9qc2lpLXByb2plY3QnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnN0cnVjdExpYnJhcnlPcHRpb25zIGV4dGVuZHMgSnNpaVByb2plY3RPcHRpb25zIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGNhdGFsb2c/OiBDYXRhbG9nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhdGFsb2cge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSB0d2l0dGVyPzogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBhbm5vdW5jZT86IGJvb2xlYW47XG59XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb25zdHJ1Y3RMaWJyYXJ5IGV4dGVuZHMgSnNpaVByb2plY3Qge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDb25zdHJ1Y3RMaWJyYXJ5T3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgdGhpcy5hZGRLZXl3b3JkcygnY2RrJyk7IC8vIHB1Ymxpc2ggdG8gdGhlIGNhdGFsb2dcbiAgICBpZiAob3B0aW9ucy5jYXRhbG9nKSB7XG4gICAgICB0aGlzLnBhY2thZ2UuYWRkRmllbGQoJ2F3c2Nka2lvJywge1xuICAgICAgICB0d2l0dGVyOiBvcHRpb25zLmNhdGFsb2cudHdpdHRlcixcbiAgICAgICAgYW5ub3VuY2U6IG9wdGlvbnMuY2F0YWxvZy5hbm5vdW5jZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -25,5 +25,5 @@ class JsiiDocgen {
25
25
  }
26
26
  exports.JsiiDocgen = JsiiDocgen;
27
27
  _a = JSII_RTTI_SYMBOL_1;
28
- JsiiDocgen[_a] = { fqn: "projen.cdk.JsiiDocgen", version: "0.46.2" };
28
+ JsiiDocgen[_a] = { fqn: "projen.cdk.JsiiDocgen", version: "0.47.1" };
29
29
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNpaS1kb2NnZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2RrL2pzaWktZG9jZ2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFHQSxNQUFhLFVBQVU7Ozs7SUFDckIsWUFBWSxPQUFvQjtRQUM5QixPQUFPLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRWxDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO1lBQ3ZDLFdBQVcsRUFBRSxxQ0FBcUM7WUFDbEQsSUFBSSxFQUFFLGFBQWE7U0FDcEIsQ0FBQyxDQUFDO1FBRUgsZ0VBQWdFO1FBQ2hFLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7O0FBWkgsZ0NBYUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBKc2lpUHJvamVjdCB9IGZyb20gJy4vanNpaS1wcm9qZWN0JztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuZXhwb3J0IGNsYXNzIEpzaWlEb2NnZW4ge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBKc2lpUHJvamVjdCkge1xuICAgIHByb2plY3QuYWRkRGV2RGVwcygnanNpaS1kb2NnZW4nKTtcblxuICAgIGNvbnN0IGRvY2dlbiA9IHByb2plY3QuYWRkVGFzaygnZG9jZ2VuJywge1xuICAgICAgZGVzY3JpcHRpb246ICdHZW5lcmF0ZSBBUEkubWQgZnJvbSAuanNpaSBtYW5pZmVzdCcsXG4gICAgICBleGVjOiAnanNpaS1kb2NnZW4nLFxuICAgIH0pO1xuXG4gICAgLy8gc3Bhd24gZG9jZ2VuIGFmdGVyIGNvbXBpbGF0aW9uIChyZXF1aXJlcyB0aGUgLmpzaWkgbWFuaWZlc3QpLlxuICAgIHByb2plY3QucG9zdENvbXBpbGVUYXNrLnNwYXduKGRvY2dlbik7XG4gICAgcHJvamVjdC5naXRpZ25vcmUuaW5jbHVkZSgnL0FQSS5tZCcpO1xuICB9XG59Il19
@@ -200,5 +200,6 @@ export declare class JsiiProject extends TypeScriptProject {
200
200
  * @returns
201
201
  */
202
202
  private addPackagingTarget;
203
+ private addPackagingTask;
203
204
  private pacmakForLanguage;
204
205
  }