gitlab-ci-local 4.65.1 → 4.66.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.
- package/README.md +20 -19
- package/dist/index.js +340 -0
- package/dist/index.js.map +480 -0
- package/package.json +26 -80
- package/src/argv.js +0 -307
- package/src/commander.js +0 -247
- package/src/data-expander.js +0 -220
- package/src/executor.js +0 -104
- package/src/git-data.js +0 -168
- package/src/gitlab-preset.js +0 -24
- package/src/global.js +0 -40
- package/src/handler.js +0 -119
- package/src/index.js +0 -364
- package/src/job.js +0 -1463
- package/src/mutex.js +0 -20
- package/src/parallel.js +0 -46
- package/src/parser-includes.js +0 -387
- package/src/parser.js +0 -357
- package/src/predefined-variables.js +0 -67
- package/src/producers.js +0 -42
- package/src/schema/index.js +0 -19
- package/src/schema/schema.js +0 -3190
- package/src/schema-error.js +0 -114
- package/src/state.js +0 -22
- package/src/utils.js +0 -485
- package/src/validator.js +0 -151
- package/src/variables-from-files.js +0 -143
- package/src/write-streams.js +0 -51
package/src/index.js
DELETED
|
@@ -1,364 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import chalk from "chalk-template";
|
|
3
|
-
import yargs from "yargs";
|
|
4
|
-
import { Parser } from "./parser.js";
|
|
5
|
-
import * as state from "./state.js";
|
|
6
|
-
import { WriteStreamsProcess, WriteStreamsMock } from "./write-streams.js";
|
|
7
|
-
import { handler } from "./handler.js";
|
|
8
|
-
import { Executor } from "./executor.js";
|
|
9
|
-
import { Argv } from "./argv.js";
|
|
10
|
-
import { AssertionError } from "assert";
|
|
11
|
-
import { cleanupJobResources } from "./job.js";
|
|
12
|
-
import { GitlabRunnerPresetValues } from "./gitlab-preset.js";
|
|
13
|
-
const jobs = [];
|
|
14
|
-
process.on("SIGINT", async (_, code) => {
|
|
15
|
-
await cleanupJobResources(jobs);
|
|
16
|
-
process.exit(code);
|
|
17
|
-
});
|
|
18
|
-
// Graceful shutdown for nodemon
|
|
19
|
-
process.on("SIGUSR2", async () => await cleanupJobResources(jobs));
|
|
20
|
-
(() => {
|
|
21
|
-
const yparser = yargs(process.argv.slice(2));
|
|
22
|
-
yparser.parserConfiguration({ "greedy-arrays": false })
|
|
23
|
-
.showHelpOnFail(false)
|
|
24
|
-
.version("4.65.1")
|
|
25
|
-
.wrap(yparser.terminalWidth?.())
|
|
26
|
-
.command({
|
|
27
|
-
handler: async (argv) => {
|
|
28
|
-
try {
|
|
29
|
-
await handler(argv, new WriteStreamsProcess(), jobs);
|
|
30
|
-
const failedJobs = Executor.getFailed(jobs);
|
|
31
|
-
process.exit(failedJobs.length > 0 ? 1 : 0);
|
|
32
|
-
}
|
|
33
|
-
catch (e) {
|
|
34
|
-
if (e instanceof AssertionError) {
|
|
35
|
-
process.stderr.write(chalk `{red ${e.message.trim()}}\n`);
|
|
36
|
-
}
|
|
37
|
-
else if (e instanceof AggregateError) {
|
|
38
|
-
e.errors.forEach((aggE) => process.stderr.write(chalk `{red ${aggE.stack ?? aggE}}\n`));
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
process.stderr.write(chalk `{red ${e.stack ?? e}}\n`);
|
|
42
|
-
}
|
|
43
|
-
await cleanupJobResources(jobs);
|
|
44
|
-
process.exit(1);
|
|
45
|
-
}
|
|
46
|
-
},
|
|
47
|
-
builder: (y) => {
|
|
48
|
-
return y
|
|
49
|
-
.positional("job", {
|
|
50
|
-
describe: "Jobname's to execute",
|
|
51
|
-
type: "string", // Type here is referring to each element of the positional args
|
|
52
|
-
})
|
|
53
|
-
// by default yargs's positional options (args) can be used as options (flags) so this coerce is solely for
|
|
54
|
-
// handling scenario when a single --job option flag is passed
|
|
55
|
-
// Once https://github.com/yargs/yargs/issues/2196 is implemented, we can probably remove this
|
|
56
|
-
.coerce("job", (args) => {
|
|
57
|
-
if (!Array.isArray(args))
|
|
58
|
-
return [args];
|
|
59
|
-
return args;
|
|
60
|
-
});
|
|
61
|
-
},
|
|
62
|
-
command: "$0 [job..]",
|
|
63
|
-
describe: "Runs the entire pipeline or job's",
|
|
64
|
-
})
|
|
65
|
-
.usage("Find more information at https://github.com/firecow/gitlab-ci-local.\nNote: To negate an option use '--no-(option)'.")
|
|
66
|
-
.strictOptions()
|
|
67
|
-
.env("GCL")
|
|
68
|
-
.option("manual", {
|
|
69
|
-
type: "array",
|
|
70
|
-
description: "One or more manual jobs to run during a pipeline",
|
|
71
|
-
requiresArg: true,
|
|
72
|
-
})
|
|
73
|
-
.option("list", {
|
|
74
|
-
type: "boolean",
|
|
75
|
-
description: "List job information, when:never excluded",
|
|
76
|
-
requiresArg: false,
|
|
77
|
-
})
|
|
78
|
-
.option("list-all", {
|
|
79
|
-
type: "boolean",
|
|
80
|
-
description: "List job information, when:never included",
|
|
81
|
-
requiresArg: false,
|
|
82
|
-
})
|
|
83
|
-
.option("list-json", {
|
|
84
|
-
type: "boolean",
|
|
85
|
-
description: "List job information in json format, when:never included",
|
|
86
|
-
requiresArg: false,
|
|
87
|
-
})
|
|
88
|
-
.option("list-csv", {
|
|
89
|
-
type: "boolean",
|
|
90
|
-
description: "List job information in csv format, when:never excluded",
|
|
91
|
-
requiresArg: false,
|
|
92
|
-
})
|
|
93
|
-
.option("list-csv-all", {
|
|
94
|
-
type: "boolean",
|
|
95
|
-
description: "List job information in csv format, when:never included",
|
|
96
|
-
requiresArg: false,
|
|
97
|
-
})
|
|
98
|
-
.option("validate-dependency-chain", {
|
|
99
|
-
type: "boolean",
|
|
100
|
-
description: "Validate that jobs needed or dependent by active jobs under specified conditions are also active without actually running the jobs. Uses fail-fast approach - stops at first validation error for both 'needs' and 'dependencies' keywords. If validation fails, use --list flag to see which jobs will run under specified conditions",
|
|
101
|
-
requiresArg: false,
|
|
102
|
-
})
|
|
103
|
-
.option("preview", {
|
|
104
|
-
type: "boolean",
|
|
105
|
-
description: "Print YML with defaults, includes, extends and reference's expanded",
|
|
106
|
-
requiresArg: false,
|
|
107
|
-
})
|
|
108
|
-
.option("cwd", {
|
|
109
|
-
type: "string",
|
|
110
|
-
description: "Path to a current working directory",
|
|
111
|
-
requiresArg: true,
|
|
112
|
-
})
|
|
113
|
-
.option("variables-file", {
|
|
114
|
-
type: "string",
|
|
115
|
-
description: "Path to the project file variables",
|
|
116
|
-
requiresArg: true,
|
|
117
|
-
default: Argv.default.variablesFile,
|
|
118
|
-
})
|
|
119
|
-
.option("completion", {
|
|
120
|
-
type: "boolean",
|
|
121
|
-
description: "Generate tab completion script",
|
|
122
|
-
requiresArg: false,
|
|
123
|
-
})
|
|
124
|
-
.option("evaluate-rule-changes", {
|
|
125
|
-
type: "boolean",
|
|
126
|
-
description: "Whether to evaluate rule:changes. If set to false, rules:changes will always evaluate to true",
|
|
127
|
-
requiresArg: false,
|
|
128
|
-
default: Argv.default.evaluateRuleChanges,
|
|
129
|
-
})
|
|
130
|
-
.option("needs", {
|
|
131
|
-
type: "boolean",
|
|
132
|
-
description: "Run needed jobs, when executing specific jobs",
|
|
133
|
-
requiresArg: false,
|
|
134
|
-
})
|
|
135
|
-
.option("only-needs", {
|
|
136
|
-
type: "boolean",
|
|
137
|
-
description: "Run needed jobs, except the specified jobs themselves",
|
|
138
|
-
requiresArg: false,
|
|
139
|
-
})
|
|
140
|
-
.option("stage", {
|
|
141
|
-
type: "string",
|
|
142
|
-
description: "Run all jobs in a specific stage",
|
|
143
|
-
requiresArg: false,
|
|
144
|
-
})
|
|
145
|
-
.option("variable", {
|
|
146
|
-
type: "array",
|
|
147
|
-
description: "Add variable to all executed jobs (--variable HELLO=world)",
|
|
148
|
-
requiresArg: false,
|
|
149
|
-
})
|
|
150
|
-
.option("unset-variable", {
|
|
151
|
-
type: "array",
|
|
152
|
-
description: "Unsets a variable (--unset-variable HELLO)",
|
|
153
|
-
requiresArg: false,
|
|
154
|
-
})
|
|
155
|
-
.option("remote-variables", {
|
|
156
|
-
type: "array",
|
|
157
|
-
description: "Fetch variables file from remote location",
|
|
158
|
-
requiresArg: false,
|
|
159
|
-
})
|
|
160
|
-
.option("state-dir", {
|
|
161
|
-
type: "string",
|
|
162
|
-
description: "Location of the .gitlab-ci-local state dir, relative to cwd, eg. (symfony/.gitlab-ci-local/)",
|
|
163
|
-
requiresArg: false,
|
|
164
|
-
})
|
|
165
|
-
.option("file", {
|
|
166
|
-
type: "string",
|
|
167
|
-
description: "Location of the .gitlab-ci.yml, relative to cwd, eg. (gitlab/.gitlab-ci.yml)",
|
|
168
|
-
requiresArg: false,
|
|
169
|
-
})
|
|
170
|
-
.option("home", {
|
|
171
|
-
type: "string",
|
|
172
|
-
description: "Location of the HOME .gitlab-ci-local folder ($HOME/.gitlab-ci-local/variables.yml)",
|
|
173
|
-
requiresArg: false,
|
|
174
|
-
})
|
|
175
|
-
.option("shell-isolation", {
|
|
176
|
-
type: "boolean",
|
|
177
|
-
description: "Enable artifact isolation for shell-executor jobs",
|
|
178
|
-
requiresArg: false,
|
|
179
|
-
})
|
|
180
|
-
.option("force-shell-executor", {
|
|
181
|
-
type: "boolean",
|
|
182
|
-
description: "Forces all jobs to be executed using the shell executor. (Only use this option for trusted job)",
|
|
183
|
-
requiresArg: false,
|
|
184
|
-
})
|
|
185
|
-
.option("shell-executor-no-image", {
|
|
186
|
-
type: "boolean",
|
|
187
|
-
description: "Whether to use shell executor when no image is specified.",
|
|
188
|
-
requiresArg: false,
|
|
189
|
-
})
|
|
190
|
-
.option("default-image", {
|
|
191
|
-
type: "string",
|
|
192
|
-
description: "When using --shell-executor-no-image=false which image to be used for the container. Defaults to docker.io/ruby:3.1 if not set.",
|
|
193
|
-
requiresArg: false,
|
|
194
|
-
})
|
|
195
|
-
.option("wait-image", {
|
|
196
|
-
type: "string",
|
|
197
|
-
description: "Which image to be used for the wait container. Defaults to docker.io/sumina46/wait-for-it:latest if not set.",
|
|
198
|
-
requiresArg: false,
|
|
199
|
-
})
|
|
200
|
-
.option("helper-image", {
|
|
201
|
-
type: "string",
|
|
202
|
-
description: "When using --shell-executor-no-image=false which image to be used for the utils container. Defaults to docker.io/firecow/gitlab-ci-local-util:latest if not set.",
|
|
203
|
-
requiresArg: false,
|
|
204
|
-
})
|
|
205
|
-
.option("mount-cache", {
|
|
206
|
-
type: "boolean",
|
|
207
|
-
description: "Enable docker mount based caching",
|
|
208
|
-
requiresArg: false,
|
|
209
|
-
})
|
|
210
|
-
.option("umask", {
|
|
211
|
-
type: "boolean",
|
|
212
|
-
description: "Sets docker user to 0:0",
|
|
213
|
-
requiresArg: false,
|
|
214
|
-
})
|
|
215
|
-
.option("userns", {
|
|
216
|
-
type: "string",
|
|
217
|
-
description: "Set docker executor userns option",
|
|
218
|
-
requiresArg: false,
|
|
219
|
-
})
|
|
220
|
-
.option("privileged", {
|
|
221
|
-
type: "boolean",
|
|
222
|
-
description: "Set docker executor to privileged mode",
|
|
223
|
-
requiresArg: false,
|
|
224
|
-
})
|
|
225
|
-
.option("device", {
|
|
226
|
-
type: "array",
|
|
227
|
-
description: "Add devices to docker executor",
|
|
228
|
-
requiresArg: false,
|
|
229
|
-
})
|
|
230
|
-
.option("ulimit", {
|
|
231
|
-
type: "number",
|
|
232
|
-
description: "Set docker executor ulimit",
|
|
233
|
-
requiresArg: false,
|
|
234
|
-
})
|
|
235
|
-
.option("network", {
|
|
236
|
-
type: "array",
|
|
237
|
-
description: "Add networks to docker executor",
|
|
238
|
-
requiresArg: false,
|
|
239
|
-
})
|
|
240
|
-
.option("volume", {
|
|
241
|
-
type: "array",
|
|
242
|
-
description: "Add volumes to docker executor",
|
|
243
|
-
requiresArg: false,
|
|
244
|
-
})
|
|
245
|
-
.option("extra-host", {
|
|
246
|
-
type: "array",
|
|
247
|
-
description: "Add extra docker host entries",
|
|
248
|
-
requiresArg: false,
|
|
249
|
-
})
|
|
250
|
-
.option("ca-file", {
|
|
251
|
-
type: "string",
|
|
252
|
-
description: "Path to custom CA certificate file to mount in containers",
|
|
253
|
-
requiresArg: false,
|
|
254
|
-
})
|
|
255
|
-
.option("pull-policy", {
|
|
256
|
-
type: "string",
|
|
257
|
-
description: "Set image pull-policy (always or if-not-present)",
|
|
258
|
-
requiresArg: false,
|
|
259
|
-
})
|
|
260
|
-
.option("fetch-includes", {
|
|
261
|
-
type: "boolean",
|
|
262
|
-
description: "Fetch all external includes one more time",
|
|
263
|
-
requiresArg: false,
|
|
264
|
-
})
|
|
265
|
-
.option("maximum-includes", {
|
|
266
|
-
type: "number",
|
|
267
|
-
description: "The maximum number of includes",
|
|
268
|
-
requiresArg: false,
|
|
269
|
-
})
|
|
270
|
-
.option("artifacts-to-source", {
|
|
271
|
-
type: "boolean",
|
|
272
|
-
description: "Copy the generated artifacts into cwd",
|
|
273
|
-
requiresArg: false,
|
|
274
|
-
})
|
|
275
|
-
.option("cleanup", {
|
|
276
|
-
type: "boolean",
|
|
277
|
-
description: "Remove docker resources after they've been used",
|
|
278
|
-
requiresArg: false,
|
|
279
|
-
})
|
|
280
|
-
.option("quiet", {
|
|
281
|
-
type: "boolean",
|
|
282
|
-
description: "Suppress all job output",
|
|
283
|
-
requiresArg: false,
|
|
284
|
-
})
|
|
285
|
-
.option("timestamps", {
|
|
286
|
-
type: "boolean",
|
|
287
|
-
description: "Show timestamps and job duration in the logs",
|
|
288
|
-
requiresArg: false,
|
|
289
|
-
})
|
|
290
|
-
.option("max-job-name-padding", {
|
|
291
|
-
type: "number",
|
|
292
|
-
description: "Maximum padding for job name (use <= 0 for no padding)",
|
|
293
|
-
requiresArg: false,
|
|
294
|
-
})
|
|
295
|
-
.option("json-schema-validation", {
|
|
296
|
-
type: "boolean",
|
|
297
|
-
description: "Whether to enable json schema validation",
|
|
298
|
-
requiresArg: false,
|
|
299
|
-
})
|
|
300
|
-
.option("ignore-schema-paths", {
|
|
301
|
-
type: "array",
|
|
302
|
-
requiresArg: false,
|
|
303
|
-
default: Argv.default.ignoreSchemaPaths,
|
|
304
|
-
description: "The json schema paths that will be ignored",
|
|
305
|
-
})
|
|
306
|
-
.option("ignore-predefined-vars", {
|
|
307
|
-
type: "string",
|
|
308
|
-
coerce: (v) => v.split(","),
|
|
309
|
-
requiresArg: false,
|
|
310
|
-
default: Argv.default.ignorePredefinedVars,
|
|
311
|
-
describe: "Comma-seperated list of predefined pipeline variables for which warnings should be suppressed",
|
|
312
|
-
})
|
|
313
|
-
.option("concurrency", {
|
|
314
|
-
type: "number",
|
|
315
|
-
description: "Limit the number of jobs that run simultaneously",
|
|
316
|
-
requiresArg: false,
|
|
317
|
-
})
|
|
318
|
-
.option("container-executable", {
|
|
319
|
-
type: "string",
|
|
320
|
-
description: "Command to start the container engine (docker or podman)",
|
|
321
|
-
requiresArg: false,
|
|
322
|
-
})
|
|
323
|
-
.option("container-mac-address", {
|
|
324
|
-
type: "string",
|
|
325
|
-
description: "Container MAC address (e.g., aa:bb:cc:dd:ee:ff)",
|
|
326
|
-
requiresArg: false,
|
|
327
|
-
})
|
|
328
|
-
.option("container-emulate", {
|
|
329
|
-
type: "string",
|
|
330
|
-
description: "The name, without the architecture, of a gitlab hosted runner to emulate. See here: https://docs.gitlab.com/ee/ci/runners/hosted_runners/linux.html#machine-types-available-for-linux---x86-64",
|
|
331
|
-
choices: GitlabRunnerPresetValues,
|
|
332
|
-
})
|
|
333
|
-
.option("color", {
|
|
334
|
-
requiresArg: false,
|
|
335
|
-
default: true,
|
|
336
|
-
description: "Enables color",
|
|
337
|
-
})
|
|
338
|
-
.option("registry", {
|
|
339
|
-
type: "boolean",
|
|
340
|
-
requiresArg: false,
|
|
341
|
-
description: "Start a local docker registry and configure gitlab-ci-local containers to use that by default",
|
|
342
|
-
})
|
|
343
|
-
.completion("completion", false, (current, yargsArgv, completionFilter, done) => {
|
|
344
|
-
try {
|
|
345
|
-
if (current.startsWith("-")) {
|
|
346
|
-
completionFilter();
|
|
347
|
-
}
|
|
348
|
-
else {
|
|
349
|
-
Argv.build({ ...yargsArgv, autoCompleting: true })
|
|
350
|
-
.then(argv => state.getPipelineIid(argv.cwd, argv.stateDir).then(pipelineIid => ({ argv, pipelineIid })))
|
|
351
|
-
.then(({ argv, pipelineIid }) => Parser.create(argv, new WriteStreamsMock(), pipelineIid, []))
|
|
352
|
-
.then((parser) => {
|
|
353
|
-
const jobNames = [...parser.jobs.values()].filter((j) => j.when != "never").map((j) => j.name);
|
|
354
|
-
done(jobNames);
|
|
355
|
-
});
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
catch {
|
|
359
|
-
return ["Parser-Failed!"];
|
|
360
|
-
}
|
|
361
|
-
})
|
|
362
|
-
.parse();
|
|
363
|
-
})();
|
|
364
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDbkMsT0FBTyxLQUFLLEtBQUssTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFDLG1CQUFtQixFQUFFLGdCQUFnQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDekUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNyQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDL0IsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUN0QyxPQUFPLEVBQU0sbUJBQW1CLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDbEQsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFNUQsTUFBTSxJQUFJLEdBQVUsRUFBRSxDQUFDO0FBRXZCLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFTLEVBQUUsSUFBWSxFQUFFLEVBQUU7SUFDbkQsTUFBTSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZCLENBQUMsQ0FBQyxDQUFDO0FBRUgsZ0NBQWdDO0FBQ2hDLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsTUFBTSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBRW5FLENBQUMsR0FBRyxFQUFFO0lBQ0YsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFD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QUFDO2dCQUNuQixDQUFDLENBQUMsQ0FBQztZQUNYLENBQUM7UUFDTCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ0wsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDOUIsQ0FBQztJQUVMLENBQUMsQ0FBQztTQUNELEtBQUssRUFBRSxDQUFDO0FBQ2pCLENBQUMsQ0FBQyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrLXRlbXBsYXRlXCI7XG5pbXBvcnQgeWFyZ3MgZnJvbSBcInlhcmdzXCI7XG5pbXBvcnQge1BhcnNlcn0gZnJvbSBcIi4vcGFyc2VyLmpzXCI7XG5pbXBvcnQgKiBhcyBzdGF0ZSBmcm9tIFwiLi9zdGF0ZS5qc1wiO1xuaW1wb3J0IHtXcml0ZVN0cmVhbXNQcm9jZXNzLCBXcml0ZVN0cmVhbXNNb2NrfSBmcm9tIFwiLi93cml0ZS1zdHJlYW1zLmpzXCI7XG5pbXBvcnQge2hhbmRsZXJ9IGZyb20gXCIuL2hhbmRsZXIuanNcIjtcbmltcG9ydCB7RXhlY3V0b3J9IGZyb20gXCIuL2V4ZWN1dG9yLmpzXCI7XG5pbXBvcnQge0FyZ3Z9IGZyb20gXCIuL2FyZ3YuanNcIjtcbmltcG9ydCB7QXNzZXJ0aW9uRXJyb3J9IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7Sm9iLCBjbGVhbnVwSm9iUmVzb3VyY2VzfSBmcm9tIFwiLi9qb2IuanNcIjtcbmltcG9ydCB7R2l0bGFiUnVubmVyUHJlc2V0VmFsdWVzfSBmcm9tIFwiLi9naXRsYWItcHJlc2V0LmpzXCI7XG5cbmNvbnN0IGpvYnM6IEpvYltdID0gW107XG5cbnByb2Nlc3Mub24oXCJTSUdJTlRcIiwgYXN5bmMgKF86IHN0cmluZywgY29kZTogbnVtYmVyKSA9PiB7XG4gICAgYXdhaXQgY2xlYW51cEpvYlJlc291cmNlcyhqb2JzKTtcbiAgICBwcm9jZXNzLmV4aXQoY29kZSk7XG59KTtcblxuLy8gR3JhY2VmdWwgc2h1dGRvd24gZm9yIG5vZGVtb25cbnByb2Nlc3Mub24oXCJTSUdVU1IyXCIsIGFzeW5jICgpID0+IGF3YWl0IGNsZWFudXBKb2JSZXNvdXJjZXMoam9icykpO1xuXG4oKCkgPT4ge1xuICAgIGNvbnN0IHlwYXJzZXIgPSB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpO1xuICAgIHlwYXJzZXIucGFyc2VyQ29uZmlndXJhdGlvbih7XCJncmVlZHktYXJyYXlzXCI6IGZhbHNlfSlcbiAgICAgICAgLnNob3dIZWxwT25GYWlsKGZhbHNlKVxuICAgICAgICAudmVyc2lvbihcIjQuNjUuMVwiKVxuICAgICAgICAud3JhcCh5cGFyc2VyLnRlcm1pbmFsV2lkdGg/LigpKVxuICAgICAgICAuY29tbWFuZCh7XG4gICAgICAgICAgICBoYW5kbGVyOiBhc3luYyAoYXJndikgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIoYXJndiwgbmV3IFdyaXRlU3RyZWFtc1Byb2Nlc3MoKSwgam9icyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZhaWxlZEpvYnMgPSBFeGVjdXRvci5nZXRGYWlsZWQoam9icyk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdChmYWlsZWRKb2JzLmxlbmd0aCA+IDAgPyAxIDogMCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQXNzZXJ0aW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGNoYWxrYHtyZWQgJHtlLm1lc3NhZ2UudHJpbSgpfX1cXG5gKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQWdncmVnYXRlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuZXJyb3JzLmZvckVhY2goKGFnZ0UpID0+IHByb2Nlc3Muc3RkZXJyLndyaXRlKGNoYWxrYHtyZWQgJHthZ2dFLnN0YWNrID8/IGFnZ0V9fVxcbmApKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGNoYWxrYHtyZWQgJHtlLnN0YWNrID8/IGV9fVxcbmApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsZWFudXBKb2JSZXNvdXJjZXMoam9icyk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYnVpbGRlcjogKHk6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB5XG4gICAgICAgICAgICAgICAgICAgIC5wb3NpdGlvbmFsKFwiam9iXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlOiBcIkpvYm5hbWUncyB0byBleGVjdXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLCAvLyBUeXBlIGhlcmUgaXMgcmVmZXJyaW5nIHRvIGVhY2ggZWxlbWVudCBvZiB0aGUgcG9zaXRpb25hbCBhcmdzXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC8vIGJ5IGRlZmF1bHQgeWFyZ3MncyBwb3NpdGlvbmFsIG9wdGlvbnMgKGFyZ3MpIGNhbiBiZSB1c2VkIGFzIG9wdGlvbnMgKGZsYWdzKSBzbyB0aGlzIGNvZXJjZSBpcyBzb2xlbHkgZm9yXG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsaW5nIHNjZW5hcmlvIHdoZW4gYSBzaW5nbGUgLS1qb2Igb3B0aW9uIGZsYWcgaXMgcGFzc2VkXG4gICAgICAgICAgICAgICAgICAgIC8vIE9uY2UgaHR0cHM6Ly9naXRodWIuY29tL3lhcmdzL3lhcmdzL2lzc3Vlcy8yMTk2IGlzIGltcGxlbWVudGVkLCB3ZSBjYW4gcHJvYmFibHkgcmVtb3ZlIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgLmNvZXJjZShcImpvYlwiLCAoYXJnczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcmdzKSkgcmV0dXJuIFthcmdzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmdzO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21tYW5kOiBcIiQwIFtqb2IuLl1cIixcbiAgICAgICAgICAgIGRlc2NyaWJlOiBcIlJ1bnMgdGhlIGVudGlyZSBwaXBlbGluZSBvciBqb2Inc1wiLFxuICAgICAgICB9KVxuICAgICAgICAudXNhZ2UoXCJGaW5kIG1vcmUgaW5mb3JtYXRpb24gYXQgaHR0cHM6Ly9naXRodWIuY29tL2ZpcmVjb3cvZ2l0bGFiLWNpLWxvY2FsLlxcbk5vdGU6IFRvIG5lZ2F0ZSBhbiBvcHRpb24gdXNlICctLW5vLShvcHRpb24pJy5cIilcbiAgICAgICAgLnN0cmljdE9wdGlvbnMoKVxuICAgICAgICAuZW52KFwiR0NMXCIpXG4gICAgICAgIC5vcHRpb24oXCJtYW51YWxcIiwge1xuICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiT25lIG9yIG1vcmUgbWFudWFsIGpvYnMgdG8gcnVuIGR1cmluZyBhIHBpcGVsaW5lXCIsXG4gICAgICAgICAgICByZXF1aXJlc0FyZzogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbihcImxpc3RcIiwge1xuICAgICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJMaXN0IGpvYiBpbmZvcm1hdGlvbiwgd2hlbjpuZXZlciBleGNsdWRlZFwiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uKFwibGlzdC1hbGxcIiwge1xuICAgICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJMaXN0IGpvYiBpbmZvcm1hdGlvbiwgd2hlbjpuZXZlciBpbmNsdWRlZFwiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uKFwibGlzdC1qc29uXCIsIHtcbiAgICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiTGlzdCBqb2IgaW5mb3JtYXRpb24gaW4ganNvbiBmb3JtYXQsIHdoZW46bmV2ZXIgaW5jbHVkZWRcIixcbiAgICAgICAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbihcImxpc3QtY3N2XCIsIHtcbiAgICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiTGlzdCBqb2IgaW5mb3JtYXRpb24gaW4gY3N2IGZvcm1hdCwgd2hlbjpuZXZlciBleGNsdWRlZFwiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uKFwibGlzdC1jc3YtYWxsXCIsIHtcbiAgICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiTGlzdCBqb2IgaW5mb3JtYXRpb24gaW4gY3N2IGZvcm1hdCwgd2hlbjpuZXZlciBpbmNsdWRlZFwiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uKFwidmFsaWRhdGUtZGVwZW5kZW5jeS1jaGFpblwiLCB7XG4gICAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlZhbGlkYXRlIHRoYXQgam9icyBuZWVkZWQgb3IgZGVwZW5kZW50IGJ5IGFjdGl2ZSBqb2JzIHVuZGVyIHNwZWNpZmllZCBjb25kaXRpb25zIGFyZSBhbHNvIGFjdGl2ZSB3aXRob3V0IGFjdHVhbGx5IHJ1bm5pbmcgdGhlIGpvYnMuIFVzZXMgZmFpbC1mYXN0IGFwcHJvYWNoIC0gc3RvcHMgYXQgZmlyc3QgdmFsaWRhdGlvbiBlcnJvciBmb3IgYm90aCAnbmVlZHMnIGFuZCAnZGVwZW5kZW5jaWVzJyBrZXl3b3Jkcy4gSWYgdmFsaWRhdGlvbiBmYWlscywgdXNlIC0tbGlzdCBmbGFnIHRvIHNlZSB3aGljaCBqb2JzIHdpbGwgcnVuIHVuZGVyIHNwZWNpZmllZCBjb25kaXRpb25zXCIsXG4gICAgICAgICAgICByZXF1aXJlc0FyZzogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb24oXCJwcmV2aWV3XCIsIHtcbiAgICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiUHJpbnQgWU1MIHdpdGggZGVmYXVsdHMsIGluY2x1ZGVzLCBleHRlbmRzIGFuZCByZWZlcmVuY2UncyBleHBhbmRlZFwiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uKFwiY3dkXCIsIHtcbiAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJQYXRoIHRvIGEgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeVwiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb24oXCJ2YXJpYWJsZXMtZmlsZVwiLCB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiUGF0aCB0byB0aGUgcHJvamVjdCBmaWxlIHZhcmlhYmxlc1wiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IHRydWUsXG4gICAgICAgICAgICBkZWZhdWx0OiBBcmd2LmRlZmF1bHQudmFyaWFibGVzRmlsZSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbihcImNvbXBsZXRpb25cIiwge1xuICAgICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJHZW5lcmF0ZSB0YWIgY29tcGxldGlvbiBzY3JpcHRcIixcbiAgICAgICAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbihcImV2YWx1YXRlLXJ1bGUtY2hhbmdlc1wiLCB7XG4gICAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIldoZXRoZXIgdG8gZXZhbHVhdGUgcnVsZTpjaGFuZ2VzLiBJZiBzZXQgdG8gZmFsc2UsIHJ1bGVzOmNoYW5nZXMgd2lsbCBhbHdheXMgZXZhbHVhdGUgdG8gdHJ1ZVwiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICAgICAgZGVmYXVsdDogQXJndi5kZWZhdWx0LmV2YWx1YXRlUnVsZUNoYW5nZXMsXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb24oXCJuZWVkc1wiLCB7XG4gICAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlJ1biBuZWVkZWQgam9icywgd2hlbiBleGVjdXRpbmcgc3BlY2lmaWMgam9ic1wiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uKFwib25seS1uZWVkc1wiLCB7XG4gICAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlJ1biBuZWVkZWQgam9icywgZXhjZXB0IHRoZSBzcGVjaWZpZWQgam9icyB0aGVtc2VsdmVzXCIsXG4gICAgICAgICAgICByZXF1aXJlc0FyZzogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb24oXCJzdGFnZVwiLCB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiUnVuIGFsbCBqb2JzIGluIGEgc3BlY2lmaWMgc3RhZ2VcIixcbiAgICAgICAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbihcInZhcmlhYmxlXCIsIHtcbiAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkFkZCB2YXJpYWJsZSB0byBhbGwgZXhlY3V0ZWQgam9icyAoLS12YXJpYWJsZSBIRUxMTz13b3JsZClcIixcbiAgICAgICAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbihcInVuc2V0LXZhcmlhYmxlXCIsIHtcbiAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlVuc2V0cyBhIHZhcmlhYmxlICgtLXVuc2V0LXZhcmlhYmxlIEhFTExPKVwiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uKFwicmVtb3RlLXZhcmlhYmxlc1wiLCB7XG4gICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJGZXRjaCB2YXJpYWJsZXMgZmlsZSBmcm9tIHJlbW90ZSBsb2NhdGlvblwiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uKFwic3RhdGUtZGlyXCIsIHtcbiAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJMb2NhdGlvbiBvZiB0aGUgLmdpdGxhYi1jaS1sb2NhbCBzdGF0ZSBkaXIsIHJlbGF0aXZlIHRvIGN3ZCwgZWcuIChzeW1mb255Ly5naXRsYWItY2ktbG9jYWwvKVwiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uKFwiZmlsZVwiLCB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiTG9jYXRpb24gb2YgdGhlIC5naXRsYWItY2kueW1sLCByZWxhdGl2ZSB0byBjd2QsIGVnLiAoZ2l0bGFiLy5naXRsYWItY2kueW1sKVwiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uKFwiaG9tZVwiLCB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiTG9jYXRpb24gb2YgdGhlIEhPTUUgLmdpdGxhYi1jaS1sb2NhbCBmb2xkZXIgKCRIT01FLy5naXRsYWItY2ktbG9jYWwvdmFyaWFibGVzLnltbClcIixcbiAgICAgICAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbihcInNoZWxsLWlzb2xhdGlvblwiLCB7XG4gICAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkVuYWJsZSBhcnRpZmFjdCBpc29sYXRpb24gZm9yIHNoZWxsLWV4ZWN1dG9yIGpvYnNcIixcbiAgICAgICAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbihcImZvcmNlLXNoZWxsLWV4ZWN1dG9yXCIsIHtcbiAgICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiRm9yY2VzIGFsbCBqb2JzIHRvIGJlIGV4ZWN1dGVkIHVzaW5nIHRoZSBzaGVsbCBleGVjdXRvci4gKE9ubHkgdXNlIHRoaXMgb3B0aW9uIGZvciB0cnVzdGVkIGpvYilcIixcbiAgICAgICAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbihcInNoZWxsLWV4ZWN1dG9yLW5vLWltYWdlXCIsIHtcbiAgICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiV2hldGhlciB0byB1c2Ugc2hlbGwgZXhlY3V0b3Igd2hlbiBubyBpbWFnZSBpcyBzcGVjaWZpZWQuXCIsXG4gICAgICAgICAgICByZXF1aXJlc0FyZzogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb24oXCJkZWZhdWx0LWltYWdlXCIsIHtcbiAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJXaGVuIHVzaW5nIC0tc2hlbGwtZXhlY3V0b3Itbm8taW1hZ2U9ZmFsc2Ugd2hpY2ggaW1hZ2UgdG8gYmUgdXNlZCBmb3IgdGhlIGNvbnRhaW5lci4gRGVmYXVsdHMgdG8gZG9ja2VyLmlvL3J1Ynk6My4xIGlmIG5vdCBzZXQuXCIsXG4gICAgICAgICAgICByZXF1aXJlc0FyZzogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb24oXCJ3YWl0LWltYWdlXCIsIHtcbiAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJXaGljaCBpbWFnZSB0byBiZSB1c2VkIGZvciB0aGUgd2FpdCBjb250YWluZXIuIERlZmF1bHRzIHRvIGRvY2tlci5pby9zdW1pbmE0Ni93YWl0LWZvci1pdDpsYXRlc3QgaWYgbm90IHNldC5cIixcbiAgICAgICAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbihcImhlbHBlci1pbWFnZVwiLCB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiV2hlbiB1c2luZyAtLXNoZWxsLWV4ZWN1dG9yLW5vLWltYWdlPWZhbHNlIHdoaWNoIGltYWdlIHRvIGJlIHVzZWQgZm9yIHRoZSB1dGlscyBjb250YWluZXIuIERlZmF1bHRzIHRvIGRvY2tlci5pby9maXJlY293L2dpdGxhYi1jaS1sb2NhbC11dGlsOmxhdGVzdCBpZiBub3Qgc2V0LlwiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uKFwibW91bnQtY2FjaGVcIiwge1xuICAgICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJFbmFibGUgZG9ja2VyIG1vdW50IGJhc2VkIGNhY2hpbmdcIixcbiAgICAgICAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbihcInVtYXNrXCIsIHtcbiAgICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiU2V0cyBkb2NrZXIgdXNlciB0byAwOjBcIixcbiAgICAgICAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbihcInVzZXJuc1wiLCB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiU2V0IGRvY2tlciBleGVjdXRvciB1c2VybnMgb3B0aW9uXCIsXG4gICAgICAgICAgICByZXF1aXJlc0FyZzogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb24oXCJwcml2aWxlZ2VkXCIsIHtcbiAgICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiU2V0IGRvY2tlciBleGVjdXRvciB0byBwcml2aWxlZ2VkIG1vZGVcIixcbiAgICAgICAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbihcImRldmljZVwiLCB7XG4gICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJBZGQgZGV2aWNlcyB0byBkb2NrZXIgZXhlY3V0b3JcIixcbiAgICAgICAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbihcInVsaW1pdFwiLCB7XG4gICAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiU2V0IGRvY2tlciBleGVjdXRvciB1bGltaXRcIixcbiAgICAgICAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbihcIm5ldHdvcmtcIiwge1xuICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiQWRkIG5ldHdvcmtzIHRvIGRvY2tlciBleGVjdXRvclwiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uKFwidm9sdW1lXCIsIHtcbiAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkFkZCB2b2x1bWVzIHRvIGRvY2tlciBleGVjdXRvclwiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uKFwiZXh0cmEtaG9zdFwiLCB7XG4gICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJBZGQgZXh0cmEgZG9ja2VyIGhvc3QgZW50cmllc1wiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uKFwiY2EtZmlsZVwiLCB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiUGF0aCB0byBjdXN0b20gQ0EgY2VydGlmaWNhdGUgZmlsZSB0byBtb3VudCBpbiBjb250YWluZXJzXCIsXG4gICAgICAgICAgICByZXF1aXJlc0FyZzogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb24oXCJwdWxsLXBvbGljeVwiLCB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiU2V0IGltYWdlIHB1bGwtcG9saWN5IChhbHdheXMgb3IgaWYtbm90LXByZXNlbnQpXCIsXG4gICAgICAgICAgICByZXF1aXJlc0FyZzogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb24oXCJmZXRjaC1pbmNsdWRlc1wiLCB7XG4gICAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkZldGNoIGFsbCBleHRlcm5hbCBpbmNsdWRlcyBvbmUgbW9yZSB0aW1lXCIsXG4gICAgICAgICAgICByZXF1aXJlc0FyZzogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb24oXCJtYXhpbXVtLWluY2x1ZGVzXCIsIHtcbiAgICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5jbHVkZXNcIixcbiAgICAgICAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbihcImFydGlmYWN0cy10by1zb3VyY2VcIiwge1xuICAgICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJDb3B5IHRoZSBnZW5lcmF0ZWQgYXJ0aWZhY3RzIGludG8gY3dkXCIsXG4gICAgICAgICAgICByZXF1aXJlc0FyZzogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb24oXCJjbGVhbnVwXCIsIHtcbiAgICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiUmVtb3ZlIGRvY2tlciByZXNvdXJjZXMgYWZ0ZXIgdGhleSd2ZSBiZWVuIHVzZWRcIixcbiAgICAgICAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbihcInF1aWV0XCIsIHtcbiAgICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiU3VwcHJlc3MgYWxsIGpvYiBvdXRwdXRcIixcbiAgICAgICAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbihcInRpbWVzdGFtcHNcIiwge1xuICAgICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJTaG93IHRpbWVzdGFtcHMgYW5kIGpvYiBkdXJhdGlvbiBpbiB0aGUgbG9nc1wiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uKFwibWF4LWpvYi1uYW1lLXBhZGRpbmdcIiwge1xuICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk1heGltdW0gcGFkZGluZyBmb3Igam9iIG5hbWUgKHVzZSA8PSAwIGZvciBubyBwYWRkaW5nKVwiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uKFwianNvbi1zY2hlbWEtdmFsaWRhdGlvblwiLCB7XG4gICAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIldoZXRoZXIgdG8gZW5hYmxlIGpzb24gc2NoZW1hIHZhbGlkYXRpb25cIixcbiAgICAgICAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbihcImlnbm9yZS1zY2hlbWEtcGF0aHNcIiwge1xuICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICAgICAgZGVmYXVsdDogQXJndi5kZWZhdWx0Lmlnbm9yZVNjaGVtYVBhdGhzLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGpzb24gc2NoZW1hIHBhdGhzIHRoYXQgd2lsbCBiZSBpZ25vcmVkXCIsXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb24oXCJpZ25vcmUtcHJlZGVmaW5lZC12YXJzXCIsIHtcbiAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBjb2VyY2U6ICh2KSA9PiB2LnNwbGl0KFwiLFwiKSxcbiAgICAgICAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICAgICAgICAgIGRlZmF1bHQ6IEFyZ3YuZGVmYXVsdC5pZ25vcmVQcmVkZWZpbmVkVmFycyxcbiAgICAgICAgICAgIGRlc2NyaWJlOiBcIkNvbW1hLXNlcGVyYXRlZCBsaXN0IG9mIHByZWRlZmluZWQgcGlwZWxpbmUgdmFyaWFibGVzIGZvciB3aGljaCB3YXJuaW5ncyBzaG91bGQgYmUgc3VwcHJlc3NlZFwiLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uKFwiY29uY3VycmVuY3lcIiwge1xuICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkxpbWl0IHRoZSBudW1iZXIgb2Ygam9icyB0aGF0IHJ1biBzaW11bHRhbmVvdXNseVwiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uKFwiY29udGFpbmVyLWV4ZWN1dGFibGVcIiwge1xuICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkNvbW1hbmQgdG8gc3RhcnQgdGhlIGNvbnRhaW5lciBlbmdpbmUgKGRvY2tlciBvciBwb2RtYW4pXCIsXG4gICAgICAgICAgICByZXF1aXJlc0FyZzogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb24oXCJjb250YWluZXItbWFjLWFkZHJlc3NcIiwge1xuICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkNvbnRhaW5lciBNQUMgYWRkcmVzcyAoZS5nLiwgYWE6YmI6Y2M6ZGQ6ZWU6ZmYpXCIsXG4gICAgICAgICAgICByZXF1aXJlc0FyZzogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb24oXCJjb250YWluZXItZW11bGF0ZVwiLCB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIG5hbWUsIHdpdGhvdXQgdGhlIGFyY2hpdGVjdHVyZSwgb2YgYSBnaXRsYWIgaG9zdGVkIHJ1bm5lciB0byBlbXVsYXRlLiBTZWUgaGVyZTogaHR0cHM6Ly9kb2NzLmdpdGxhYi5jb20vZWUvY2kvcnVubmVycy9ob3N0ZWRfcnVubmVycy9saW51eC5odG1sI21hY2hpbmUtdHlwZXMtYXZhaWxhYmxlLWZvci1saW51eC0tLXg4Ni02NFwiLFxuICAgICAgICAgICAgY2hvaWNlczogR2l0bGFiUnVubmVyUHJlc2V0VmFsdWVzLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uKFwiY29sb3JcIiwge1xuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkVuYWJsZXMgY29sb3JcIixcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbihcInJlZ2lzdHJ5XCIsIHtcbiAgICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiU3RhcnQgYSBsb2NhbCBkb2NrZXIgcmVnaXN0cnkgYW5kIGNvbmZpZ3VyZSBnaXRsYWItY2ktbG9jYWwgY29udGFpbmVycyB0byB1c2UgdGhhdCBieSBkZWZhdWx0XCIsXG4gICAgICAgIH0pXG4gICAgICAgIC5jb21wbGV0aW9uKFwiY29tcGxldGlvblwiLCBmYWxzZSwgKGN1cnJlbnQ6IHN0cmluZywgeWFyZ3NBcmd2OiBhbnksIGNvbXBsZXRpb25GaWx0ZXI6IGFueSwgZG9uZTogKGNvbXBsZXRpb25zOiBzdHJpbmdbXSkgPT4gYW55KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25GaWx0ZXIoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBBcmd2LmJ1aWxkKHsuLi55YXJnc0FyZ3YsIGF1dG9Db21wbGV0aW5nOiB0cnVlfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGFyZ3YgPT4gc3RhdGUuZ2V0UGlwZWxpbmVJaWQoYXJndi5jd2QsIGFyZ3Yuc3RhdGVEaXIpLnRoZW4ocGlwZWxpbmVJaWQgPT4gKHthcmd2LCBwaXBlbGluZUlpZH0pKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCh7YXJndiwgcGlwZWxpbmVJaWR9KSA9PiBQYXJzZXIuY3JlYXRlKGFyZ3YsIG5ldyBXcml0ZVN0cmVhbXNNb2NrKCksIHBpcGVsaW5lSWlkLCBbXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigocGFyc2VyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgam9iTmFtZXMgPSBbLi4ucGFyc2VyLmpvYnMudmFsdWVzKCldLmZpbHRlcigoaikgPT4gai53aGVuICE9IFwibmV2ZXJcIikubWFwKChqKSA9PiBqLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoam9iTmFtZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcIlBhcnNlci1GYWlsZWQhXCJdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pXG4gICAgICAgIC5wYXJzZSgpO1xufSkoKTtcbiJdfQ==
|