projen-pipelines 0.0.16 → 0.0.18

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.
package/lib/pipeline.js DELETED
@@ -1,277 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CDKPipeline = exports.DeploymentType = exports.PipelineEngine = void 0;
4
- const projen_1 = require("projen");
5
- const common_1 = require("projen/lib/common");
6
- const engine_1 = require("./engine");
7
- /**
8
- * The CI/CD tooling used to run your pipeline.
9
- * The component will render workflows for the given system
10
- */
11
- var PipelineEngine;
12
- (function (PipelineEngine) {
13
- /** Create GitHub actions */
14
- PipelineEngine[PipelineEngine["GITHUB"] = 0] = "GITHUB";
15
- /** Create a .gitlab-ci.yaml file */
16
- PipelineEngine[PipelineEngine["GITLAB"] = 1] = "GITLAB";
17
- // /** Create AWS CodeCatalyst workflows */
18
- // CODE_CATALYST,
19
- })(PipelineEngine || (exports.PipelineEngine = PipelineEngine = {}));
20
- /**
21
- * Describes the type of pipeline that will be created
22
- */
23
- var DeploymentType;
24
- (function (DeploymentType) {
25
- /** Deploy every commit as far as possible; hopefully into production */
26
- DeploymentType[DeploymentType["CONTINUOUS_DEPLOYMENT"] = 0] = "CONTINUOUS_DEPLOYMENT";
27
- /** Build every commit and prepare all assets for a later deployment */
28
- DeploymentType[DeploymentType["CONTINUOUS_DELIVERY"] = 1] = "CONTINUOUS_DELIVERY";
29
- })(DeploymentType || (exports.DeploymentType = DeploymentType = {}));
30
- /**
31
- * The CDKPipeline class extends the Component class and sets up the necessary configuration for deploying AWS CDK (Cloud Development Kit) applications across multiple stages.
32
- * It also manages tasks such as publishing CDK assets, bumping version based on git tags, and cleaning up conflicting tasks.
33
- */
34
- class CDKPipeline extends projen_1.Component {
35
- constructor(app, props) {
36
- var _a, _b, _c;
37
- super(app);
38
- this.app = app;
39
- this.props = props;
40
- // Add development dependencies
41
- this.app.addDevDeps('@types/standard-version', 'standard-version', 'cdk-assets');
42
- // this.app.addDeps(
43
- // );
44
- this.stackPrefix = (_a = props.stackPrefix) !== null && _a !== void 0 ? _a : app.name;
45
- // Create engine instance to use
46
- switch (props.engine) {
47
- case PipelineEngine.GITHUB:
48
- this.engine = new engine_1.GitHubEngine(app, props, this);
49
- break;
50
- default:
51
- throw new Error('Invalid engine');
52
- }
53
- // Removes the compiled cloud assembly before each synth
54
- (_b = this.project.tasks.tryFind('synth')) === null || _b === void 0 ? void 0 : _b.prependExec(`rm -rf ${this.app.cdkConfig.cdkout}`);
55
- (_c = this.project.tasks.tryFind('synth:silent')) === null || _c === void 0 ? void 0 : _c.prependExec(`rm -rf ${this.app.cdkConfig.cdkout}`);
56
- // Remove tasks that might conflict with the pipeline process
57
- this.project.removeTask('deploy');
58
- this.project.removeTask('diff');
59
- this.project.removeTask('destroy');
60
- this.project.removeTask('watch');
61
- this.createSynthStage();
62
- // Creates different deployment stages
63
- if (props.personalStage) {
64
- this.createPersonalStage();
65
- }
66
- if (props.featureStages) {
67
- this.createFeatureStage();
68
- }
69
- for (const stage of props.stages) {
70
- this.createPipelineStage(stage);
71
- }
72
- // Creates tasks to handle the release process
73
- this.createReleaseTasks();
74
- // Creates a specialized CDK App class
75
- this.createApplicationEntrypoint();
76
- }
77
- createSynthStage() {
78
- var _a, _b, _c, _d;
79
- this.engine.createSynth({
80
- commands: [
81
- ...((_a = this.props.preInstallCommands) !== null && _a !== void 0 ? _a : []),
82
- `npx projen ${this.app.package.installCiTask.name}`,
83
- ...((_b = this.props.preSynthCommands) !== null && _b !== void 0 ? _b : []),
84
- 'npx projen build',
85
- ...((_c = this.props.postSynthCommands) !== null && _c !== void 0 ? _c : []),
86
- ],
87
- });
88
- this.engine.createAssetUpload({
89
- commands: [
90
- ...((_d = this.props.preInstallCommands) !== null && _d !== void 0 ? _d : []),
91
- `npx projen ${this.app.package.installCiTask.name}`,
92
- 'npx projen publish:assets',
93
- ...(this.engine.needsVersionedArtifacts ? [
94
- 'npx projen bump',
95
- 'npx projen release:push-assembly',
96
- ] : []),
97
- ],
98
- });
99
- }
100
- /**
101
- * This method generates the entry point for the application, including interfaces and classes
102
- * necessary to set up the pipeline and define the AWS CDK stacks for different environments.
103
- */
104
- createApplicationEntrypoint() {
105
- let propsCode = '';
106
- let appCode = '';
107
- if (this.props.personalStage) {
108
- propsCode += ` /** This function will be used to generate a personal stack. */
109
- providePersonalStack: (app: App, stackId: string, props: PipelineAppStackProps) => Stack;
110
- `;
111
- appCode += ` // If the environment variable USER is set and a function is provided for creating a personal stack, it is called with necessary arguments.
112
- if (props.providePersonalStack && process.env.USER) {
113
- const stageName = 'personal-' + process.env.USER.toLowerCase().replace(/\\\//g, '-');
114
- props.providePersonalStack(this, '${this.stackPrefix}-personal', { env: ${JSON.stringify(this.props.personalStage.env)}, stackName: \`${this.stackPrefix}-\${stageName}\`, stageName });
115
- }
116
- `;
117
- }
118
- if (this.props.featureStages) {
119
- propsCode += ` /** This function will be used to generate a feature stack. */
120
- provideFeatureStack: (app: App, stackId: string, props: PipelineAppStackProps) => Stack;
121
- `;
122
- appCode += ` // If the environment variable BRANCH is set and a function is provided for creating a feature stack, it is called with necessary arguments.
123
- if (props.provideFeatureStack && process.env.BRANCH) {
124
- const stageName = 'feature-' + process.env.BRANCH.toLowerCase().replace(/\\\//g, '-');
125
- props.provideFeatureStack(this, '${this.stackPrefix}-feature', { env: ${JSON.stringify(this.props.featureStages.env)}, stackName: \`${this.stackPrefix}-\${stageName}\`, stageName });
126
- }
127
- `;
128
- }
129
- for (const stage of this.props.stages) {
130
- const nameUpperFirst = `${stage.name.charAt(0).toUpperCase()}${stage.name.substring(1)}`;
131
- propsCode += ` /** This function will be used to generate a ${stage.name} stack. */
132
- provide${nameUpperFirst}Stack: (app: App, stackId: string, props: PipelineAppStackProps) => Stack;
133
- `;
134
- appCode += ` // If a function is provided for creating a ${stage.name} stack, it is called with necessary arguments.
135
- if (props.provide${nameUpperFirst}Stack) {
136
- props.provide${nameUpperFirst}Stack(this, '${this.stackPrefix}-${stage.name}', { env: ${JSON.stringify(stage.env)}, stackName: '${this.stackPrefix}-${stage.name}', stageName: '${stage.name}' });
137
- }
138
- `;
139
- }
140
- const appFile = new projen_1.TextFile(this.project, `${this.app.srcdir}/app.ts`);
141
- appFile.addLine(`// ${common_1.PROJEN_MARKER}
142
- /* eslint-disable */
143
- import { App, AppProps, Stack, StackProps } from 'aws-cdk-lib';
144
-
145
- /**
146
- * PipelineAppProps is an extension of AppProps, which is part of the AWS CDK core.
147
- * It includes optional functions to provide AWS Stacks for different stages.
148
- *
149
- * Use these functions to instantiate your application stacks with the parameters for
150
- * each stage
151
- */
152
- export interface PipelineAppProps extends AppProps {
153
- ${propsCode}
154
- }
155
-
156
- /**
157
- * PipelineAppStackProps is an extension of StackProps, which is part of the AWS CDK core.
158
- * It includes an additional property to specify the stage name.
159
- */
160
- export interface PipelineAppStackProps extends StackProps {
161
- stageName: string;
162
- }
163
-
164
- /**
165
- * The PipelineApp class extends the App class from AWS CDK and overrides the constructor to support
166
- * different stages of the application (development, production, personal, feature) by invoking the provided
167
- * stack-providing functions from the props.
168
- */
169
- export class PipelineApp extends App {
170
- constructor(props: PipelineAppProps) {
171
- super(props);
172
-
173
- ${appCode}
174
-
175
- }
176
- }
177
- `);
178
- }
179
- /**
180
- * This method sets up tasks to publish CDK assets to all accounts and handle versioning, including bumping the version
181
- * based on the latest git tag and pushing the CDK assembly to the package repository.
182
- */
183
- createReleaseTasks() {
184
- // Task to publish the CDK assets to all accounts
185
- this.project.addTask('publish:assets', {
186
- steps: this.props.stages.map(stage => ({
187
- exec: `npx cdk-assets -p ${this.app.cdkConfig.cdkout}/${this.stackPrefix}-${stage.name}.assets.json publish`,
188
- })),
189
- });
190
- this.project.addTask('bump', {
191
- description: 'Bumps version based on latest git tag',
192
- steps: [
193
- {
194
- exec: 'pipelines-release bump',
195
- },
196
- {
197
- exec: 'git push --tags',
198
- },
199
- ],
200
- });
201
- this.project.addTask('release:push-assembly', {
202
- steps: [
203
- {
204
- exec: `pipelines-release create-manifest "${this.app.cdkConfig.cdkout}" "${this.props.pkgNamespace}"`,
205
- },
206
- {
207
- cwd: this.app.cdkConfig.cdkout,
208
- exec: 'npm version --no-git-tag-version from-git',
209
- },
210
- {
211
- cwd: this.app.cdkConfig.cdkout,
212
- exec: 'npm publish',
213
- },
214
- ],
215
- });
216
- }
217
- /**
218
- * This method sets up tasks for the personal deployment stage, including deployment, watching for changes,
219
- * comparing changes (diff), and destroying the stack when no longer needed.
220
- */
221
- createPersonalStage() {
222
- this.project.addTask('deploy:personal', {
223
- exec: `cdk deploy ${this.stackPrefix}-personal`,
224
- });
225
- this.project.addTask('watch:personal', {
226
- exec: `cdk deploy --watch --hotswap ${this.stackPrefix}-personal`,
227
- });
228
- this.project.addTask('diff:personal', {
229
- exec: `cdk diff ${this.stackPrefix}-personal`,
230
- });
231
- this.project.addTask('destroy:personal', {
232
- exec: `cdk destroy ${this.stackPrefix}-personal`,
233
- });
234
- }
235
- /**
236
- * This method sets up tasks for the feature deployment stage, including deployment, comparing changes (diff),
237
- * and destroying the stack when no longer needed.
238
- */
239
- createFeatureStage() {
240
- this.project.addTask('deploy:feature', {
241
- exec: `cdk --progress events --require-approval never deploy ${this.stackPrefix}-feature`,
242
- });
243
- this.project.addTask('diff:feature', {
244
- exec: `cdk diff ${this.stackPrefix}-feature`,
245
- });
246
- this.project.addTask('destroy:feature', {
247
- exec: `cdk destroy ${this.stackPrefix}-feature`,
248
- });
249
- }
250
- /**
251
- * This method sets up tasks for the general pipeline stages (dev, prod), including deployment and comparing changes (diff).
252
- * @param {DeployStageOptions} stage - The stage to create
253
- */
254
- createPipelineStage(stage) {
255
- var _a;
256
- this.project.addTask(`deploy:${stage.name}`, {
257
- exec: `cdk --app ${this.app.cdkConfig.cdkout} --progress events --require-approval never deploy ${this.stackPrefix}-${stage.name}`,
258
- });
259
- this.project.addTask(`diff:${stage.name}`, {
260
- exec: `cdk --app ${this.app.cdkConfig.cdkout} diff ${this.stackPrefix}-${stage.name}`,
261
- });
262
- this.engine.createDeployment({
263
- config: stage,
264
- installCommands: [
265
- ...((_a = this.props.preInstallCommands) !== null && _a !== void 0 ? _a : []),
266
- `npx projen ${this.app.package.installCiTask.name}`,
267
- ],
268
- deployCommands: [
269
- // TODO pre deploy steps
270
- `npx projen deploy:${stage.name}`,
271
- // TODO post deploy steps
272
- ],
273
- });
274
- }
275
- }
276
- exports.CDKPipeline = CDKPipeline;
277
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQXFEO0FBQ3JELDhDQUFrRDtBQUNsRCxxQ0FBd0U7QUF1QnhFOzs7R0FHRztBQUNILElBQVksY0FPWDtBQVBELFdBQVksY0FBYztJQUN4Qiw0QkFBNEI7SUFDNUIsdURBQU0sQ0FBQTtJQUNOLG9DQUFvQztJQUNwQyx1REFBTSxDQUFBO0lBQ04sMkNBQTJDO0lBQzNDLGlCQUFpQjtBQUNuQixDQUFDLEVBUFcsY0FBYyw4QkFBZCxjQUFjLFFBT3pCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLGNBS1g7QUFMRCxXQUFZLGNBQWM7SUFDeEIsd0VBQXdFO0lBQ3hFLHFGQUFxQixDQUFBO0lBQ3JCLHVFQUF1RTtJQUN2RSxpRkFBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTFcsY0FBYyw4QkFBZCxjQUFjLFFBS3pCO0FBa0VEOzs7R0FHRztBQUNILE1BQWEsV0FBWSxTQUFRLGtCQUFTO0lBS3hDLFlBQW9CLEdBQStCLEVBQVUsS0FBeUI7O1FBQ3BGLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQURPLFFBQUcsR0FBSCxHQUFHLENBQTRCO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBb0I7UUFHcEYsK0JBQStCO1FBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUNqQix5QkFBeUIsRUFDekIsa0JBQWtCLEVBQ2xCLFlBQVksQ0FDYixDQUFDO1FBQ0Ysb0JBQW9CO1FBQ3BCLEtBQUs7UUFFTCxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQUEsS0FBSyxDQUFDLFdBQVcsbUNBQUksR0FBRyxDQUFDLElBQUksQ0FBQztRQUVqRCxnQ0FBZ0M7UUFDaEMsUUFBUSxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ3BCLEtBQUssY0FBYyxDQUFDLE1BQU07Z0JBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxxQkFBWSxD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QyxXQUFXLFVBQVU7U0FDaEQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLG1CQUFtQixDQUFDLEtBQXNCOztRQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMzQyxJQUFJLEVBQUUsYUFBYSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLHNEQUFzRCxJQUFJLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUU7U0FDbkksQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDekMsSUFBSSxFQUFFLGFBQWEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxTQUFTLElBQUksQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLElBQUksRUFBRTtTQUN0RixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1lBQzNCLE1BQU0sRUFBRSxLQUFLO1lBQ2IsZUFBZSxFQUFFO2dCQUNmLEdBQUcsQ0FBQyxNQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLG1DQUFJLEVBQUUsQ0FBQztnQkFDeEMsY0FBYyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFO2FBQ3BEO1lBQ0QsY0FBYyxFQUFFO2dCQUNkLHdCQUF3QjtnQkFDeEIscUJBQXFCLEtBQUssQ0FBQyxJQUFJLEVBQUU7Z0JBQ2pDLHlCQUF5QjthQUMxQjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTNRRCxrQ0EyUUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIFRleHRGaWxlLCBhd3NjZGsgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgUFJPSkVOX01BUktFUiB9IGZyb20gJ3Byb2plbi9saWIvY29tbW9uJztcbmltcG9ydCB7IEJhc2VFbmdpbmUsIEdpdEh1YkVuZ2luZSwgR2l0aHViRW5naW5lQ29uZmlnIH0gZnJvbSAnLi9lbmdpbmUnO1xuXG4vKipcbiAqIFRoZSBFbnZpcm9ubWVudCBpbnRlcmZhY2UgaXMgZGVzaWduZWQgdG8gaG9sZCBBV1MgcmVsYXRlZCBpbmZvcm1hdGlvblxuICogZm9yIGEgc3BlY2lmaWMgZGVwbG95bWVudCBlbnZpcm9ubWVudCB3aXRoaW4geW91ciBpbmZyYXN0cnVjdHVyZS5cbiAqIEVhY2ggZW52aXJvbm1lbnQgcmVxdWlyZXMgYSBzcGVjaWZpYyBhY2NvdW50IGFuZCByZWdpb24gZm9yIGl0cyByZXNvdXJjZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW52aXJvbm1lbnQge1xuICAvKipcbiAgICogVGhlIEFXUyBBY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW52aXJvbm1lbnQuIEl0J3MgaW1wb3J0YW50IGJlY2F1c2VcbiAgICogZGlmZmVyZW50IHNlcnZpY2VzIG9yIGZlYXR1cmVzIGNvdWxkIGhhdmUgZGlzdGluY3QgcGVybWlzc2lvbnMgYW5kIHNldHRpbmdzXG4gICAqIGluIGRpZmZlcmVudCBhY2NvdW50cy5cbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFXUyBSZWdpb24gZm9yIHRoZSBlbnZpcm9ubWVudC4gVGhpcyBkZXRlcm1pbmVzIHdoZXJlIHlvdXIgcmVzb3VyY2VzXG4gICAqIGFyZSBjcmVhdGVkIGFuZCB3aGVyZSB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgcnVuLiBJdCBjYW4gYWZmZWN0IGxhdGVuY3ksXG4gICAqIGF2YWlsYWJpbGl0eSwgYW5kIHByaWNpbmcuXG4gICAqL1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgQ0kvQ0QgdG9vbGluZyB1c2VkIHRvIHJ1biB5b3VyIHBpcGVsaW5lLlxuICogVGhlIGNvbXBvbmVudCB3aWxsIHJlbmRlciB3b3JrZmxvd3MgZm9yIHRoZSBnaXZlbiBzeXN0ZW1cbiAqL1xuZXhwb3J0IGVudW0gUGlwZWxpbmVFbmdpbmUge1xuICAvKiogQ3JlYXRlIEdpdEh1YiBhY3Rpb25zICovXG4gIEdJVEhVQixcbiAgLyoqIENyZWF0ZSBhIC5naXRsYWItY2kueWFtbCBmaWxlICovXG4gIEdJVExBQixcbiAgLy8gLyoqIENyZWF0ZSBBV1MgQ29kZUNhdGFseXN0IHdvcmtmbG93cyAqL1xuICAvLyBDT0RFX0NBVEFMWVNULFxufVxuXG4vKipcbiAqIERlc2NyaWJlcyB0aGUgdHlwZSBvZiBwaXBlbGluZSB0aGF0IHdpbGwgYmUgY3JlYXRlZFxuICovXG5leHBvcnQgZW51bSBEZXBsb3ltZW50VHlwZSB7XG4gIC8qKiBEZXBsb3kgZXZlcnkgY29tbWl0IGFzIGZhciBhcyBwb3NzaWJsZTsgaG9wZWZ1bGx5IGludG8gcHJvZHVjdGlvbiAqL1xuICBDT05USU5VT1VTX0RFUExPWU1FTlQsXG4gIC8qKiBCdWlsZCBldmVyeSBjb21taXQgYW5kIHByZXBhcmUgYWxsIGFzc2V0cyBmb3IgYSBsYXRlciBkZXBsb3ltZW50ICovXG4gIENPTlRJTlVPVVNfREVMSVZFUlksXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVwbG95bWVudFN0YWdlIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBlbnY6IEVudmlyb25tZW50O1xuICByZWFkb25seSBtYW51YWxBcHByb3ZhbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIENES1BpcGVsaW5lT3B0aW9ucyBpbnRlcmZhY2UgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBjb25maWd1cmF0aW9uXG4gKiBvcHRpb25zIGZvciBhIENESyAoQ2xvdWQgRGV2ZWxvcG1lbnQgS2l0KSBwaXBlbGluZS4gSXQgYWxsb3dzIHRoZSBkZWZpbml0aW9uXG4gKiBvZiBzZXR0aW5ncyBzdWNoIGFzIHRoZSBzdGFjayBwcmVmaXggYW5kIHBhY2thZ2UgbmFtZXNwYWNlIHRvIGJlIHVzZWQgaW4gdGhlXG4gKiBBV1Mgc3RhY2ssIGFsb25nIHdpdGggdGhlIGVudmlyb25tZW50cyBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ0RLUGlwZWxpbmVPcHRpb25zIHtcblxuICAvKipcbiAgICogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGRlZmluZSBhIHByZWZpeCBmb3IgdGhlIEFXUyBTdGFjayByZXNvdXJjZXMgY3JlYXRlZFxuICAgKiBkdXJpbmcgdGhlIHBpcGVsaW5lJ3Mgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBwcm9qZWN0IG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrUHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGlzIGZpZWxkIGRldGVybWluZXMgdGhlIE5QTSBuYW1lc3BhY2UgdG8gYmUgdXNlZCB3aGVuIHBhY2thZ2luZyBDREsgY2xvdWRcbiAgICogYXNzZW1ibGllcy4gQSBuYW1lc3BhY2UgaGVscHMgZ3JvdXAgcmVsYXRlZCByZXNvdXJjZXMgdG9nZXRoZXIsIHByb3ZpZGluZ1xuICAgKiBiZXR0ZXIgb3JnYW5pemF0aW9uIGFuZCBlYXNlIG9mIG1hbmFnZW1lbnQuXG4gICAqL1xuICByZWFkb25seSBwa2dOYW1lc3BhY2U6IHN0cmluZztcblxuICByZWFkb25seSBzdGFnZXM6IERlcGxveW1lbnRTdGFnZVtdO1xuXG4gIHJlYWRvbmx5IHBlcnNvbmFsU3RhZ2U/OiB7XG4gICAgcmVhZG9ubHkgZW52OiBFbnZpcm9ubWVudDtcbiAgfTtcblxuICByZWFkb25seSBmZWF0dXJlU3RhZ2VzPzoge1xuICAgIHJlYWRvbmx5IGVudjogRW52aXJvbm1lbnQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoaXMgZmllbGQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHBpcGVsaW5lIHRvIGNyZWF0ZS4gSWYgc2V0IHRvIENPTlRJTlVPVVNfREVQTE9ZTUVOVCxcbiAgICogZXZlcnkgY29tbWl0IGlzIGRlcGxveWVkIGFzIGZhciBhcyBwb3NzaWJsZSwgaG9wZWZ1bGx5IGludG8gcHJvZHVjdGlvbi4gSWYgc2V0IHRvXG4gICAqIENPTlRJTlVPVVNfREVMSVZFUlksIGV2ZXJ5IGNvbW1pdCBpcyBidWlsdCBhbmQgYWxsIGFzc2V0cyBhcmUgcHJlcGFyZWQgZm9yIGEgbGF0ZXIgZGVwbG95bWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgQ09OVElOVU9VU19ERUxJVkVSWVxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudFR5cGU/OiBEZXBsb3ltZW50VHlwZTtcblxuICAvKipcbiAgICogVGhpcyBmaWVsZCBkZXRlcm1pbmVzIHRoZSBDSS9DRCB0b29saW5nIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJ1biB0aGUgcGlwZWxpbmUuIFRoZSBjb21wb25lbnRcbiAgICogd2lsbCByZW5kZXIgd29ya2Zsb3dzIGZvciB0aGUgZ2l2ZW4gc3lzdGVtLiBPcHRpb25zIGluY2x1ZGUgR2l0SHViIGFuZCBHaXRMYWIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdHJpZXMgdG8gZGVyaXZlIGl0IGZyb20gdGhlIHByb2plY3RzIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuZ2luZT86IFBpcGVsaW5lRW5naW5lO1xuXG4gIHJlYWRvbmx5IGdpdGh1YkNvbmZpZz86IEdpdGh1YkVuZ2luZUNvbmZpZztcblxuICByZWFkb25seSBwcmVJbnN0YWxsQ29tbWFuZHM/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgcHJlU3ludGhDb21tYW5kcz86IHN0cmluZ1tdO1xuICByZWFkb25seSBwb3N0U3ludGhDb21tYW5kcz86IHN0cmluZ1tdO1xuXG59XG5cbi8qKlxuICogVGhlIENES1BpcGVsaW5lIGNsYXNzIGV4dGVuZHMgdGhlIENvbXBvbmVudCBjbGFzcyBhbmQgc2V0cyB1cCB0aGUgbmVjZXNzYXJ5IGNvbmZpZ3VyYXRpb24gZm9yIGRlcGxveWluZyBBV1MgQ0RLIChDbG91ZCBEZXZlbG9wbWVudCBLaXQpIGFwcGxpY2F0aW9ucyBhY3Jvc3MgbXVsdGlwbGUgc3RhZ2VzLlxuICogSXQgYWxzbyBtYW5hZ2VzIHRhc2tzIHN1Y2ggYXMgcHVibGlzaGluZyBDREsgYXNzZXRzLCBidW1waW5nIHZlcnNpb24gYmFzZWQgb24gZ2l0IHRhZ3MsIGFuZCBjbGVhbmluZyB1cCBjb25mbGljdGluZyB0YXNrcy5cbiAqL1xuZXhwb3J0IGNsYXNzIENES1BpcGVsaW5lIGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICBwdWJsaWMgcmVhZG9ubHkgc3RhY2tQcmVmaXg6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGVuZ2luZTogQmFzZUVuZ2luZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwcDogYXdzY2RrLkF3c0Nka1R5cGVTY3JpcHRBcHAsIHByaXZhdGUgcHJvcHM6IENES1BpcGVsaW5lT3B0aW9ucykge1xuICAgIHN1cGVyKGFwcCk7XG5cbiAgICAvLyBBZGQgZGV2ZWxvcG1lbnQgZGVwZW5kZW5jaWVzXG4gICAgdGhpcy5hcHAuYWRkRGV2RGVwcyhcbiAgICAgICdAdHlwZXMvc3RhbmRhcmQtdmVyc2lvbicsXG4gICAgICAnc3RhbmRhcmQtdmVyc2lvbicsXG4gICAgICAnY2RrLWFzc2V0cycsXG4gICAgKTtcbiAgICAvLyB0aGlzLmFwcC5hZGREZXBzKFxuICAgIC8vICk7XG5cbiAgICB0aGlzLnN0YWNrUHJlZml4ID0gcHJvcHMuc3RhY2tQcmVmaXggPz8gYXBwLm5hbWU7XG5cbiAgICAvLyBDcmVhdGUgZW5naW5lIGluc3RhbmNlIHRvIHVzZVxuICAgIHN3aXRjaCAocHJvcHMuZW5naW5lKSB7XG4gICAgICBjYXNlIFBpcGVsaW5lRW5naW5lLkdJVEhVQjpcbiAgICAgICAgdGhpcy5lbmdpbmUgPSBuZXcgR2l0SHViRW5naW5lKGFwcCwgcHJvcHMsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbmdpbmUnKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmVzIHRoZSBjb21waWxlZCBjbG91ZCBhc3NlbWJseSBiZWZvcmUgZWFjaCBzeW50aFxuICAgIHRoaXMucHJvamVjdC50YXNrcy50cnlGaW5kKCdzeW50aCcpPy5wcmVwZW5kRXhlYyhgcm0gLXJmICR7dGhpcy5hcHAuY2RrQ29uZmlnLmNka291dH1gKTtcbiAgICB0aGlzLnByb2plY3QudGFza3MudHJ5RmluZCgnc3ludGg6c2lsZW50Jyk/LnByZXBlbmRFeGVjKGBybSAtcmYgJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fWApO1xuXG4gICAgLy8gUmVtb3ZlIHRhc2tzIHRoYXQgbWlnaHQgY29uZmxpY3Qgd2l0aCB0aGUgcGlwZWxpbmUgcHJvY2Vzc1xuICAgIHRoaXMucHJvamVjdC5yZW1vdmVUYXNrKCdkZXBsb3knKTtcbiAgICB0aGlzLnByb2plY3QucmVtb3ZlVGFzaygnZGlmZicpO1xuICAgIHRoaXMucHJvamVjdC5yZW1vdmVUYXNrKCdkZXN0cm95Jyk7XG4gICAgdGhpcy5wcm9qZWN0LnJlbW92ZVRhc2soJ3dhdGNoJyk7XG5cbiAgICB0aGlzLmNyZWF0ZVN5bnRoU3RhZ2UoKTtcblxuICAgIC8vIENyZWF0ZXMgZGlmZmVyZW50IGRlcGxveW1lbnQgc3RhZ2VzXG4gICAgaWYgKHByb3BzLnBlcnNvbmFsU3RhZ2UpIHtcbiAgICAgIHRoaXMuY3JlYXRlUGVyc29uYWxTdGFnZSgpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZmVhdHVyZVN0YWdlcykge1xuICAgICAgdGhpcy5jcmVhdGVGZWF0dXJlU3RhZ2UoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdGFnZSBvZiBwcm9wcy5zdGFnZXMpIHtcbiAgICAgIHRoaXMuY3JlYXRlUGlwZWxpbmVTdGFnZShzdGFnZSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlcyB0YXNrcyB0byBoYW5kbGUgdGhlIHJlbGVhc2UgcHJvY2Vzc1xuICAgIHRoaXMuY3JlYXRlUmVsZWFzZVRhc2tzKCk7XG5cbiAgICAvLyBDcmVhdGVzIGEgc3BlY2lhbGl6ZWQgQ0RLIEFwcCBjbGFzc1xuICAgIHRoaXMuY3JlYXRlQXBwbGljYXRpb25FbnRyeXBvaW50KCk7XG5cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3ludGhTdGFnZSgpIHtcbiAgICB0aGlzLmVuZ2luZS5jcmVhdGVTeW50aCh7XG4gICAgICBjb21tYW5kczogW1xuICAgICAgICAuLi4odGhpcy5wcm9wcy5wcmVJbnN0YWxsQ29tbWFuZHMgPz8gW10pLFxuICAgICAgICBgbnB4IHByb2plbiAke3RoaXMuYXBwLnBhY2thZ2UuaW5zdGFsbENpVGFzay5uYW1lfWAsXG4gICAgICAgIC4uLih0aGlzLnByb3BzLnByZVN5bnRoQ29tbWFuZHMgPz8gW10pLFxuICAgICAgICAnbnB4IHByb2plbiBidWlsZCcsXG4gICAgICAgIC4uLih0aGlzLnByb3BzLnBvc3RTeW50aENvbW1hbmRzID8/IFtdKSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgdGhpcy5lbmdpbmUuY3JlYXRlQXNzZXRVcGxvYWQoe1xuICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgLi4uKHRoaXMucHJvcHMucHJlSW5zdGFsbENvbW1hbmRzID8/IFtdKSxcbiAgICAgICAgYG5weCBwcm9qZW4gJHt0aGlzLmFwcC5wYWNrYWdlLmluc3RhbGxDaVRhc2submFtZX1gLFxuICAgICAgICAnbnB4IHByb2plbiBwdWJsaXNoOmFzc2V0cycsXG4gICAgICAgIC4uLih0aGlzLmVuZ2luZS5uZWVkc1ZlcnNpb25lZEFydGlmYWN0cyA/IFtcbiAgICAgICAgICAnbnB4IHByb2plbiBidW1wJyxcbiAgICAgICAgICAnbnB4IHByb2plbiByZWxlYXNlOnB1c2gtYXNzZW1ibHknLFxuICAgICAgICBdIDogW10pLFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBnZW5lcmF0ZXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgYXBwbGljYXRpb24sIGluY2x1ZGluZyBpbnRlcmZhY2VzIGFuZCBjbGFzc2VzXG4gICAqIG5lY2Vzc2FyeSB0byBzZXQgdXAgdGhlIHBpcGVsaW5lIGFuZCBkZWZpbmUgdGhlIEFXUyBDREsgc3RhY2tzIGZvciBkaWZmZXJlbnQgZW52aXJvbm1lbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBcHBsaWNhdGlvbkVudHJ5cG9pbnQoKSB7XG4gICAgbGV0IHByb3BzQ29kZSA9ICcnO1xuICAgIGxldCBhcHBDb2RlID0gJyc7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5wZXJzb25hbFN0YWdlKSB7XG4gICAgICBwcm9wc0NvZGUgKz0gYCAgLyoqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgcGVyc29uYWwgc3RhY2suICovXG4gIHByb3ZpZGVQZXJzb25hbFN0YWNrOiAoYXBwOiBBcHAsIHN0YWNrSWQ6IHN0cmluZywgcHJvcHM6IFBpcGVsaW5lQXBwU3RhY2tQcm9wcykgPT4gU3RhY2s7XG5gO1xuICAgICAgYXBwQ29kZSArPSBgICAgIC8vIElmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBVU0VSIGlzIHNldCBhbmQgYSBmdW5jdGlvbiBpcyBwcm92aWRlZCBmb3IgY3JlYXRpbmcgYSBwZXJzb25hbCBzdGFjaywgaXQgaXMgY2FsbGVkIHdpdGggbmVjZXNzYXJ5IGFyZ3VtZW50cy5cbiAgICBpZiAocHJvcHMucHJvdmlkZVBlcnNvbmFsU3RhY2sgJiYgcHJvY2Vzcy5lbnYuVVNFUikge1xuICAgICAgY29uc3Qgc3RhZ2VOYW1lID0gJ3BlcnNvbmFsLScgKyBwcm9jZXNzLmVudi5VU0VSLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxcXFxcLy9nLCAnLScpO1xuICAgICAgcHJvcHMucHJvdmlkZVBlcnNvbmFsU3RhY2sodGhpcywgJyR7dGhpcy5zdGFja1ByZWZpeH0tcGVyc29uYWwnLCB7IGVudjogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnByb3BzLnBlcnNvbmFsU3RhZ2UuZW52KX0sIHN0YWNrTmFtZTogXFxgJHt0aGlzLnN0YWNrUHJlZml4fS1cXCR7c3RhZ2VOYW1lfVxcYCwgc3RhZ2VOYW1lIH0pO1xuICAgIH1cbmA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMuZmVhdHVyZVN0YWdlcykge1xuICAgICAgcHJvcHNDb2RlICs9IGAgIC8qKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBhIGZlYXR1cmUgc3RhY2suICovXG4gIHByb3ZpZGVGZWF0dXJlU3RhY2s6IChhcHA6IEFwcCwgc3RhY2tJZDogc3RyaW5nLCBwcm9wczogUGlwZWxpbmVBcHBTdGFja1Byb3BzKSA9PiBTdGFjaztcbmA7XG4gICAgICBhcHBDb2RlICs9IGAgICAgLy8gSWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEJSQU5DSCBpcyBzZXQgYW5kIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGNyZWF0aW5nIGEgZmVhdHVyZSBzdGFjaywgaXQgaXMgY2FsbGVkIHdpdGggbmVjZXNzYXJ5IGFyZ3VtZW50cy5cbiAgICBpZiAocHJvcHMucHJvdmlkZUZlYXR1cmVTdGFjayAmJiBwcm9jZXNzLmVudi5CUkFOQ0gpIHtcbiAgICAgIGNvbnN0IHN0YWdlTmFtZSA9ICdmZWF0dXJlLScgKyBwcm9jZXNzLmVudi5CUkFOQ0gudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXFxcXFwvL2csICctJyk7XG4gICAgICBwcm9wcy5wcm92aWRlRmVhdHVyZVN0YWNrKHRoaXMsICcke3RoaXMuc3RhY2tQcmVmaXh9LWZlYXR1cmUnLCB7IGVudjogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnByb3BzLmZlYXR1cmVTdGFnZXMuZW52KX0sIHN0YWNrTmFtZTogXFxgJHt0aGlzLnN0YWNrUHJlZml4fS1cXCR7c3RhZ2VOYW1lfVxcYCwgc3RhZ2VOYW1lIH0pO1xuICAgIH1cbmA7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzdGFnZSBvZiB0aGlzLnByb3BzLnN0YWdlcykge1xuICAgICAgY29uc3QgbmFtZVVwcGVyRmlyc3QgPSBgJHtzdGFnZS5uYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7c3RhZ2UubmFtZS5zdWJzdHJpbmcoMSl9YDtcblxuICAgICAgcHJvcHNDb2RlICs9IGAgIC8qKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBhICR7c3RhZ2UubmFtZX0gc3RhY2suICovXG4gIHByb3ZpZGUke25hbWVVcHBlckZpcnN0fVN0YWNrOiAoYXBwOiBBcHAsIHN0YWNrSWQ6IHN0cmluZywgcHJvcHM6IFBpcGVsaW5lQXBwU3RhY2tQcm9wcykgPT4gU3RhY2s7XG5gO1xuICAgICAgYXBwQ29kZSArPSBgICAgIC8vIElmIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGNyZWF0aW5nIGEgJHtzdGFnZS5uYW1lfSBzdGFjaywgaXQgaXMgY2FsbGVkIHdpdGggbmVjZXNzYXJ5IGFyZ3VtZW50cy5cbiAgICBpZiAocHJvcHMucHJvdmlkZSR7bmFtZVVwcGVyRmlyc3R9U3RhY2spIHtcbiAgICAgIHByb3BzLnByb3ZpZGUke25hbWVVcHBlckZpcnN0fVN0YWNrKHRoaXMsICcke3RoaXMuc3RhY2tQcmVmaXh9LSR7c3RhZ2UubmFtZX0nLCB7IGVudjogJHtKU09OLnN0cmluZ2lmeShzdGFnZS5lbnYpfSwgc3RhY2tOYW1lOiAnJHt0aGlzLnN0YWNrUHJlZml4fS0ke3N0YWdlLm5hbWV9Jywgc3RhZ2VOYW1lOiAnJHtzdGFnZS5uYW1lfScgfSk7XG4gICAgfVxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBhcHBGaWxlID0gbmV3IFRleHRGaWxlKHRoaXMucHJvamVjdCwgYCR7dGhpcy5hcHAuc3JjZGlyfS9hcHAudHNgKTtcbiAgICBhcHBGaWxlLmFkZExpbmUoYC8vICR7UFJPSkVOX01BUktFUn1cbi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgeyBBcHAsIEFwcFByb3BzLCBTdGFjaywgU3RhY2tQcm9wcyB9IGZyb20gJ2F3cy1jZGstbGliJztcblxuLyoqXG4gKiBQaXBlbGluZUFwcFByb3BzIGlzIGFuIGV4dGVuc2lvbiBvZiBBcHBQcm9wcywgd2hpY2ggaXMgcGFydCBvZiB0aGUgQVdTIENESyBjb3JlLlxuICogSXQgaW5jbHVkZXMgb3B0aW9uYWwgZnVuY3Rpb25zIHRvIHByb3ZpZGUgQVdTIFN0YWNrcyBmb3IgZGlmZmVyZW50IHN0YWdlcy5cbiAqXG4gKiBVc2UgdGhlc2UgZnVuY3Rpb25zIHRvIGluc3RhbnRpYXRlIHlvdXIgYXBwbGljYXRpb24gc3RhY2tzIHdpdGggdGhlIHBhcmFtZXRlcnMgZm9yXG4gKiBlYWNoIHN0YWdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVBcHBQcm9wcyBleHRlbmRzIEFwcFByb3BzIHtcbiR7cHJvcHNDb2RlfVxufVxuXG4vKipcbiAqIFBpcGVsaW5lQXBwU3RhY2tQcm9wcyBpcyBhbiBleHRlbnNpb24gb2YgU3RhY2tQcm9wcywgd2hpY2ggaXMgcGFydCBvZiB0aGUgQVdTIENESyBjb3JlLlxuICogSXQgaW5jbHVkZXMgYW4gYWRkaXRpb25hbCBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBzdGFnZSBuYW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lQXBwU3RhY2tQcm9wcyBleHRlbmRzIFN0YWNrUHJvcHMge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgUGlwZWxpbmVBcHAgY2xhc3MgZXh0ZW5kcyB0aGUgQXBwIGNsYXNzIGZyb20gQVdTIENESyBhbmQgb3ZlcnJpZGVzIHRoZSBjb25zdHJ1Y3RvciB0byBzdXBwb3J0XG4gKiBkaWZmZXJlbnQgc3RhZ2VzIG9mIHRoZSBhcHBsaWNhdGlvbiAoZGV2ZWxvcG1lbnQsIHByb2R1Y3Rpb24sIHBlcnNvbmFsLCBmZWF0dXJlKSBieSBpbnZva2luZyB0aGUgcHJvdmlkZWRcbiAqIHN0YWNrLXByb3ZpZGluZyBmdW5jdGlvbnMgZnJvbSB0aGUgcHJvcHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQaXBlbGluZUFwcCBleHRlbmRzIEFwcCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBQaXBlbGluZUFwcFByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4ke2FwcENvZGV9XG5cbiAgfVxufVxuYCk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgc2V0cyB1cCB0YXNrcyB0byBwdWJsaXNoIENESyBhc3NldHMgdG8gYWxsIGFjY291bnRzIGFuZCBoYW5kbGUgdmVyc2lvbmluZywgaW5jbHVkaW5nIGJ1bXBpbmcgdGhlIHZlcnNpb25cbiAgICogYmFzZWQgb24gdGhlIGxhdGVzdCBnaXQgdGFnIGFuZCBwdXNoaW5nIHRoZSBDREsgYXNzZW1ibHkgdG8gdGhlIHBhY2thZ2UgcmVwb3NpdG9yeS5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUmVsZWFzZVRhc2tzKCkge1xuICAgIC8vIFRhc2sgdG8gcHVibGlzaCB0aGUgQ0RLIGFzc2V0cyB0byBhbGwgYWNjb3VudHNcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygncHVibGlzaDphc3NldHMnLCB7XG4gICAgICBzdGVwczogdGhpcy5wcm9wcy5zdGFnZXMubWFwKHN0YWdlID0+ICh7XG4gICAgICAgIGV4ZWM6IGBucHggY2RrLWFzc2V0cyAtcCAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9LyR7dGhpcy5zdGFja1ByZWZpeH0tJHtzdGFnZS5uYW1lfS5hc3NldHMuanNvbiBwdWJsaXNoYCxcbiAgICAgIH0pKSxcbiAgICB9KTtcblxuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdidW1wJywge1xuICAgICAgZGVzY3JpcHRpb246ICdCdW1wcyB2ZXJzaW9uIGJhc2VkIG9uIGxhdGVzdCBnaXQgdGFnJyxcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBleGVjOiAncGlwZWxpbmVzLXJlbGVhc2UgYnVtcCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBleGVjOiAnZ2l0IHB1c2ggLS10YWdzJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ3JlbGVhc2U6cHVzaC1hc3NlbWJseScsIHtcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBleGVjOiBgcGlwZWxpbmVzLXJlbGVhc2UgY3JlYXRlLW1hbmlmZXN0IFwiJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fVwiICBcIiR7dGhpcy5wcm9wcy5wa2dOYW1lc3BhY2V9XCJgLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY3dkOiB0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0LFxuICAgICAgICAgIGV4ZWM6ICducG0gdmVyc2lvbiAtLW5vLWdpdC10YWctdmVyc2lvbiBmcm9tLWdpdCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjd2Q6IHRoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXQsXG4gICAgICAgICAgZXhlYzogJ25wbSBwdWJsaXNoJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgc2V0cyB1cCB0YXNrcyBmb3IgdGhlIHBlcnNvbmFsIGRlcGxveW1lbnQgc3RhZ2UsIGluY2x1ZGluZyBkZXBsb3ltZW50LCB3YXRjaGluZyBmb3IgY2hhbmdlcyxcbiAgICogY29tcGFyaW5nIGNoYW5nZXMgKGRpZmYpLCBhbmQgZGVzdHJveWluZyB0aGUgc3RhY2sgd2hlbiBubyBsb25nZXIgbmVlZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVQZXJzb25hbFN0YWdlKCkge1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdkZXBsb3k6cGVyc29uYWwnLCB7XG4gICAgICBleGVjOiBgY2RrIGRlcGxveSAke3RoaXMuc3RhY2tQcmVmaXh9LXBlcnNvbmFsYCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygnd2F0Y2g6cGVyc29uYWwnLCB7XG4gICAgICBleGVjOiBgY2RrIGRlcGxveSAtLXdhdGNoIC0taG90c3dhcCAke3RoaXMuc3RhY2tQcmVmaXh9LXBlcnNvbmFsYCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygnZGlmZjpwZXJzb25hbCcsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGlmZiAke3RoaXMuc3RhY2tQcmVmaXh9LXBlcnNvbmFsYCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygnZGVzdHJveTpwZXJzb25hbCcsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGVzdHJveSAke3RoaXMuc3RhY2tQcmVmaXh9LXBlcnNvbmFsYCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBzZXRzIHVwIHRhc2tzIGZvciB0aGUgZmVhdHVyZSBkZXBsb3ltZW50IHN0YWdlLCBpbmNsdWRpbmcgZGVwbG95bWVudCwgY29tcGFyaW5nIGNoYW5nZXMgKGRpZmYpLFxuICAgKiBhbmQgZGVzdHJveWluZyB0aGUgc3RhY2sgd2hlbiBubyBsb25nZXIgbmVlZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVGZWF0dXJlU3RhZ2UoKSB7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2RlcGxveTpmZWF0dXJlJywge1xuICAgICAgZXhlYzogYGNkayAtLXByb2dyZXNzIGV2ZW50cyAtLXJlcXVpcmUtYXBwcm92YWwgbmV2ZXIgZGVwbG95ICR7dGhpcy5zdGFja1ByZWZpeH0tZmVhdHVyZWAsXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2RpZmY6ZmVhdHVyZScsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGlmZiAke3RoaXMuc3RhY2tQcmVmaXh9LWZlYXR1cmVgLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdkZXN0cm95OmZlYXR1cmUnLCB7XG4gICAgICBleGVjOiBgY2RrIGRlc3Ryb3kgJHt0aGlzLnN0YWNrUHJlZml4fS1mZWF0dXJlYCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBzZXRzIHVwIHRhc2tzIGZvciB0aGUgZ2VuZXJhbCBwaXBlbGluZSBzdGFnZXMgKGRldiwgcHJvZCksIGluY2x1ZGluZyBkZXBsb3ltZW50IGFuZCBjb21wYXJpbmcgY2hhbmdlcyAoZGlmZikuXG4gICAqIEBwYXJhbSB7RGVwbG95U3RhZ2VPcHRpb25zfSBzdGFnZSAtIFRoZSBzdGFnZSB0byBjcmVhdGVcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUGlwZWxpbmVTdGFnZShzdGFnZTogRGVwbG95bWVudFN0YWdlKSB7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soYGRlcGxveToke3N0YWdlLm5hbWV9YCwge1xuICAgICAgZXhlYzogYGNkayAtLWFwcCAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9IC0tcHJvZ3Jlc3MgZXZlbnRzIC0tcmVxdWlyZS1hcHByb3ZhbCBuZXZlciBkZXBsb3kgJHt0aGlzLnN0YWNrUHJlZml4fS0ke3N0YWdlLm5hbWV9YCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzayhgZGlmZjoke3N0YWdlLm5hbWV9YCwge1xuICAgICAgZXhlYzogYGNkayAtLWFwcCAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9IGRpZmYgJHt0aGlzLnN0YWNrUHJlZml4fS0ke3N0YWdlLm5hbWV9YCxcbiAgICB9KTtcblxuICAgIHRoaXMuZW5naW5lLmNyZWF0ZURlcGxveW1lbnQoe1xuICAgICAgY29uZmlnOiBzdGFnZSxcbiAgICAgIGluc3RhbGxDb21tYW5kczogW1xuICAgICAgICAuLi4odGhpcy5wcm9wcy5wcmVJbnN0YWxsQ29tbWFuZHMgPz8gW10pLFxuICAgICAgICBgbnB4IHByb2plbiAke3RoaXMuYXBwLnBhY2thZ2UuaW5zdGFsbENpVGFzay5uYW1lfWAsXG4gICAgICBdLFxuICAgICAgZGVwbG95Q29tbWFuZHM6IFtcbiAgICAgICAgLy8gVE9ETyBwcmUgZGVwbG95IHN0ZXBzXG4gICAgICAgIGBucHggcHJvamVuIGRlcGxveToke3N0YWdlLm5hbWV9YCxcbiAgICAgICAgLy8gVE9ETyBwb3N0IGRlcGxveSBzdGVwc1xuICAgICAgXSxcbiAgICB9KTtcbiAgfVxufSJdfQ==
File without changes