@cloudsnorkel/cdk-github-runners 0.9.4 → 0.9.5

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 (93) hide show
  1. package/.gitattributes +3 -3
  2. package/.jsii +315 -267
  3. package/API.md +43 -7
  4. package/README.md +15 -2
  5. package/assets/{providers/image-builders → image-builders}/aws-image-builder/delete-ami.lambda/index.js +2 -2
  6. package/assets/{providers/image-builders → image-builders}/aws-image-builder/filter-failed-builds.lambda/index.js +1 -1
  7. package/assets/{providers/image-builders → image-builders}/aws-image-builder/versioner.lambda/index.js +2 -2
  8. package/lib/access.js +1 -1
  9. package/lib/image-builders/api.js +47 -0
  10. package/lib/{providers/image-builders → image-builders}/aws-image-builder/ami.d.ts +2 -3
  11. package/lib/image-builders/aws-image-builder/ami.js +93 -0
  12. package/lib/{providers/image-builders → image-builders}/aws-image-builder/builder.d.ts +9 -2
  13. package/lib/image-builders/aws-image-builder/builder.js +529 -0
  14. package/lib/image-builders/aws-image-builder/common.js +46 -0
  15. package/lib/{providers/image-builders → image-builders}/aws-image-builder/container.d.ts +1 -1
  16. package/lib/image-builders/aws-image-builder/container.js +63 -0
  17. package/lib/{providers/image-builders → image-builders}/aws-image-builder/delete-ami-function.d.ts +1 -1
  18. package/lib/image-builders/aws-image-builder/delete-ami-function.js +23 -0
  19. package/lib/image-builders/aws-image-builder/delete-ami.lambda.js +87 -0
  20. package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/ami.d.ts +2 -2
  21. package/lib/image-builders/aws-image-builder/deprecated/ami.js +240 -0
  22. package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/common.d.ts +1 -1
  23. package/lib/image-builders/aws-image-builder/deprecated/common.js +144 -0
  24. package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/container.d.ts +1 -1
  25. package/lib/image-builders/aws-image-builder/deprecated/container.js +222 -0
  26. package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/index.js +1 -1
  27. package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/linux-components.d.ts +1 -1
  28. package/lib/image-builders/aws-image-builder/deprecated/linux-components.js +172 -0
  29. package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/windows-components.d.ts +1 -1
  30. package/lib/image-builders/aws-image-builder/deprecated/windows-components.js +126 -0
  31. package/lib/{providers/image-builders → image-builders}/aws-image-builder/filter-failed-builds-function.d.ts +1 -1
  32. package/lib/image-builders/aws-image-builder/filter-failed-builds-function.js +23 -0
  33. package/lib/image-builders/aws-image-builder/filter-failed-builds.lambda.js +18 -0
  34. package/lib/{providers/image-builders → image-builders}/aws-image-builder/index.js +1 -1
  35. package/lib/{providers/image-builders → image-builders}/aws-image-builder/versioner-function.d.ts +1 -1
  36. package/lib/image-builders/aws-image-builder/versioner-function.js +23 -0
  37. package/lib/image-builders/aws-image-builder/versioner.lambda.js +96 -0
  38. package/lib/{providers/image-builders → image-builders}/codebuild-deprecated.d.ts +2 -2
  39. package/lib/image-builders/codebuild-deprecated.js +373 -0
  40. package/lib/{providers/image-builders → image-builders}/codebuild.d.ts +2 -2
  41. package/lib/image-builders/codebuild.js +287 -0
  42. package/lib/{providers/image-builders → image-builders}/common.d.ts +4 -2
  43. package/lib/image-builders/common.js +61 -0
  44. package/lib/{providers/image-builders → image-builders}/components.d.ts +8 -2
  45. package/lib/image-builders/components.js +568 -0
  46. package/lib/{providers/image-builders → image-builders}/index.js +1 -1
  47. package/lib/{providers/image-builders → image-builders}/static.d.ts +1 -1
  48. package/lib/image-builders/static.js +58 -0
  49. package/lib/providers/codebuild.d.ts +1 -1
  50. package/lib/providers/codebuild.js +4 -4
  51. package/lib/providers/common.js +3 -3
  52. package/lib/providers/ec2.d.ts +1 -1
  53. package/lib/providers/ec2.js +4 -4
  54. package/lib/providers/ecs.d.ts +1 -1
  55. package/lib/providers/ecs.js +3 -3
  56. package/lib/providers/fargate.d.ts +1 -1
  57. package/lib/providers/fargate.js +4 -4
  58. package/lib/providers/index.d.ts +1 -1
  59. package/lib/providers/index.js +2 -2
  60. package/lib/providers/lambda.d.ts +1 -1
  61. package/lib/providers/lambda.js +4 -4
  62. package/lib/runner.js +1 -1
  63. package/lib/secrets.js +1 -1
  64. package/package.json +10 -10
  65. package/lib/providers/image-builders/api.js +0 -47
  66. package/lib/providers/image-builders/aws-image-builder/ami.js +0 -81
  67. package/lib/providers/image-builders/aws-image-builder/builder.js +0 -520
  68. package/lib/providers/image-builders/aws-image-builder/common.js +0 -46
  69. package/lib/providers/image-builders/aws-image-builder/container.js +0 -63
  70. package/lib/providers/image-builders/aws-image-builder/delete-ami-function.js +0 -23
  71. package/lib/providers/image-builders/aws-image-builder/delete-ami.lambda.js +0 -87
  72. package/lib/providers/image-builders/aws-image-builder/deprecated/ami.js +0 -240
  73. package/lib/providers/image-builders/aws-image-builder/deprecated/common.js +0 -144
  74. package/lib/providers/image-builders/aws-image-builder/deprecated/container.js +0 -222
  75. package/lib/providers/image-builders/aws-image-builder/deprecated/linux-components.js +0 -172
  76. package/lib/providers/image-builders/aws-image-builder/deprecated/windows-components.js +0 -129
  77. package/lib/providers/image-builders/aws-image-builder/filter-failed-builds-function.js +0 -23
  78. package/lib/providers/image-builders/aws-image-builder/filter-failed-builds.lambda.js +0 -18
  79. package/lib/providers/image-builders/aws-image-builder/versioner-function.js +0 -23
  80. package/lib/providers/image-builders/aws-image-builder/versioner.lambda.js +0 -96
  81. package/lib/providers/image-builders/codebuild-deprecated.js +0 -373
  82. package/lib/providers/image-builders/codebuild.js +0 -287
  83. package/lib/providers/image-builders/common.js +0 -61
  84. package/lib/providers/image-builders/components.js +0 -535
  85. package/lib/providers/image-builders/static.js +0 -58
  86. /package/lib/{providers/image-builders → image-builders}/api.d.ts +0 -0
  87. /package/lib/{providers/image-builders → image-builders}/aws-image-builder/common.d.ts +0 -0
  88. /package/lib/{providers/image-builders → image-builders}/aws-image-builder/delete-ami.lambda.d.ts +0 -0
  89. /package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/index.d.ts +0 -0
  90. /package/lib/{providers/image-builders → image-builders}/aws-image-builder/filter-failed-builds.lambda.d.ts +0 -0
  91. /package/lib/{providers/image-builders → image-builders}/aws-image-builder/index.d.ts +0 -0
  92. /package/lib/{providers/image-builders → image-builders}/aws-image-builder/versioner.lambda.d.ts +0 -0
  93. /package/lib/{providers/image-builders → image-builders}/index.d.ts +0 -0
@@ -1,535 +0,0 @@
1
- "use strict";
2
- var _a;
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.RunnerImageComponent = void 0;
5
- const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
- const path = require("path");
7
- const aws_cdk_lib_1 = require("aws-cdk-lib");
8
- const aws_image_builder_1 = require("./aws-image-builder");
9
- const common_1 = require("../common");
10
- /**
11
- * Components are used to build runner images. They can run commands in the image, copy files into the image, and run some Docker commands.
12
- */
13
- class RunnerImageComponent {
14
- /**
15
- * Define a custom component that can run commands in the image, copy files into the image, and run some Docker commands.
16
- *
17
- * The order of operations is (1) assets (2) commands (3) docker commands.
18
- *
19
- * Use this to customize the image for the runner.
20
- *
21
- * **WARNING:** Docker commands are not guaranteed to be included before the next component
22
- */
23
- static custom(props) {
24
- return new class extends RunnerImageComponent {
25
- get name() {
26
- if (props.name && !props.name.match(/[a-zA-Z0-9\-]/)) {
27
- throw new Error(`Invalid component name: ${props.name}. Name must only contain alphanumeric characters and dashes.`);
28
- }
29
- return `Custom-${props.name ?? 'Undefined'}`;
30
- }
31
- getCommands(_os, _architecture) {
32
- return props.commands ?? [];
33
- }
34
- getAssets(_os, _architecture) {
35
- return props.assets ?? [];
36
- }
37
- getDockerCommands(_os, _architecture) {
38
- return props.dockerCommands ?? [];
39
- }
40
- }();
41
- }
42
- /**
43
- * A component to install the required packages for the runner.
44
- */
45
- static requiredPackages() {
46
- return new class extends RunnerImageComponent {
47
- constructor() {
48
- super(...arguments);
49
- this.name = 'RequiredPackages';
50
- }
51
- getCommands(os, architecture) {
52
- if (os.is(common_1.Os.LINUX_UBUNTU)) {
53
- let archUrl;
54
- if (architecture.is(common_1.Architecture.X86_64)) {
55
- archUrl = 'amd64';
56
- }
57
- else if (architecture.is(common_1.Architecture.ARM64)) {
58
- archUrl = 'arm64';
59
- }
60
- else {
61
- throw new Error(`Unsupported architecture for required packages: ${architecture.name}`);
62
- }
63
- return [
64
- 'apt-get update',
65
- 'DEBIAN_FRONTEND=noninteractive apt-get upgrade -y',
66
- 'DEBIAN_FRONTEND=noninteractive apt-get install -y curl sudo jq bash zip unzip iptables software-properties-common ca-certificates',
67
- `curl -sfLo /tmp/amazon-cloudwatch-agent.deb https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/${archUrl}/latest/amazon-cloudwatch-agent.deb`,
68
- 'dpkg -i -E /tmp/amazon-cloudwatch-agent.deb',
69
- 'rm /tmp/amazon-cloudwatch-agent.deb',
70
- ];
71
- }
72
- else if (os.is(common_1.Os.LINUX_AMAZON_2)) {
73
- return [
74
- 'yum update -y',
75
- 'yum install -y jq tar gzip bzip2 which binutils zip unzip sudo shadow-utils',
76
- ];
77
- }
78
- else if (os.is(common_1.Os.WINDOWS)) {
79
- return [
80
- 'Start-Process msiexec.exe -Wait -ArgumentList \'/i https://s3.amazonaws.com/amazoncloudwatch-agent/windows/amd64/latest/amazon-cloudwatch-agent.msi /qn\'',
81
- ];
82
- }
83
- throw new Error(`Unsupported OS for required packages: ${os.name}`);
84
- }
85
- };
86
- }
87
- /**
88
- * A component to prepare the required runner user.
89
- */
90
- static runnerUser() {
91
- return new class extends RunnerImageComponent {
92
- constructor() {
93
- super(...arguments);
94
- this.name = 'RunnerUser';
95
- }
96
- getCommands(os, _architecture) {
97
- if (os.is(common_1.Os.LINUX_UBUNTU)) {
98
- return [
99
- 'addgroup runner',
100
- 'adduser --system --disabled-password --home /home/runner --ingroup runner runner',
101
- 'usermod -aG sudo runner',
102
- 'echo "%sudo ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/runner',
103
- ];
104
- }
105
- else if (os.is(common_1.Os.LINUX_AMAZON_2)) {
106
- return [
107
- '/usr/sbin/groupadd runner',
108
- '/usr/sbin/useradd --system --shell /usr/sbin/nologin --home-dir /home/runner --gid runner runner',
109
- 'mkdir -p /home/runner',
110
- 'chown runner /home/runner',
111
- 'echo "%runner ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/runner',
112
- ];
113
- }
114
- else if (os.is(common_1.Os.WINDOWS)) {
115
- return [];
116
- }
117
- throw new Error(`Unsupported OS for runner user: ${os.name}`);
118
- }
119
- };
120
- }
121
- /**
122
- * A component to install the AWS CLI.
123
- */
124
- static awsCli() {
125
- return new class extends RunnerImageComponent {
126
- constructor() {
127
- super(...arguments);
128
- this.name = 'AwsCli';
129
- }
130
- getCommands(os, architecture) {
131
- if (os.is(common_1.Os.LINUX_UBUNTU) || os.is(common_1.Os.LINUX_AMAZON_2)) {
132
- let archUrl;
133
- if (architecture.is(common_1.Architecture.X86_64)) {
134
- archUrl = 'x86_64';
135
- }
136
- else if (architecture.is(common_1.Architecture.ARM64)) {
137
- archUrl = 'aarch64';
138
- }
139
- else {
140
- throw new Error(`Unsupported architecture for awscli: ${architecture.name}`);
141
- }
142
- return [
143
- `curl -fsSL "https://awscli.amazonaws.com/awscli-exe-linux-${archUrl}.zip" -o awscliv2.zip`,
144
- 'unzip -q awscliv2.zip',
145
- './aws/install',
146
- 'rm -rf awscliv2.zip aws',
147
- ];
148
- }
149
- else if (os.is(common_1.Os.WINDOWS)) {
150
- return [
151
- 'Start-Process msiexec.exe -Wait -ArgumentList \'/i https://awscli.amazonaws.com/AWSCLIV2.msi /qn\'',
152
- ];
153
- }
154
- throw new Error(`Unknown os/architecture combo for awscli: ${os.name}/${architecture.name}`);
155
- }
156
- }();
157
- }
158
- /**
159
- * A component to install the GitHub CLI.
160
- */
161
- static githubCli() {
162
- return new class extends RunnerImageComponent {
163
- constructor() {
164
- super(...arguments);
165
- this.name = 'GithubCli';
166
- }
167
- getCommands(os, architecture) {
168
- if (os.is(common_1.Os.LINUX_UBUNTU)) {
169
- return [
170
- 'curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg',
171
- 'echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] ' +
172
- ' https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null',
173
- 'apt-get update',
174
- 'DEBIAN_FRONTEND=noninteractive apt-get install -y gh',
175
- ];
176
- }
177
- else if (os.is(common_1.Os.LINUX_AMAZON_2)) {
178
- return [
179
- 'curl -fsSSL https://cli.github.com/packages/rpm/gh-cli.repo -o /etc/yum.repos.d/gh-cli.repo',
180
- 'yum install -y gh',
181
- ];
182
- }
183
- else if (os.is(common_1.Os.WINDOWS)) {
184
- return [
185
- 'cmd /c curl -w "%{redirect_url}" -fsS https://github.com/cli/cli/releases/latest > $Env:TEMP\\latest-gh',
186
- '$LatestUrl = Get-Content $Env:TEMP\\latest-gh',
187
- '$GH_VERSION = ($LatestUrl -Split \'/\')[-1].substring(1)',
188
- 'Invoke-WebRequest -UseBasicParsing -Uri "https://github.com/cli/cli/releases/download/v${GH_VERSION}/gh_${GH_VERSION}_windows_amd64.msi" -OutFile gh.msi',
189
- 'Start-Process msiexec.exe -Wait -ArgumentList \'/i gh.msi /qn\'',
190
- 'del gh.msi',
191
- ];
192
- }
193
- throw new Error(`Unknown os/architecture combo for github cli: ${os.name}/${architecture.name}`);
194
- }
195
- }();
196
- }
197
- /**
198
- * A component to install the GitHub CLI.
199
- */
200
- static git() {
201
- return new class extends RunnerImageComponent {
202
- constructor() {
203
- super(...arguments);
204
- this.name = 'Git';
205
- }
206
- getCommands(os, architecture) {
207
- if (os.is(common_1.Os.LINUX_UBUNTU)) {
208
- return [
209
- 'add-apt-repository ppa:git-core/ppa',
210
- 'apt-get update',
211
- 'DEBIAN_FRONTEND=noninteractive apt-get install -y git',
212
- ];
213
- }
214
- else if (os.is(common_1.Os.LINUX_AMAZON_2)) {
215
- return [
216
- 'yum install -y git',
217
- ];
218
- }
219
- else if (os.is(common_1.Os.WINDOWS)) {
220
- return [
221
- 'cmd /c curl -w "%{redirect_url}" -fsS https://github.com/git-for-windows/git/releases/latest > $Env:TEMP\\latest-git',
222
- '$LatestUrl = Get-Content $Env:TEMP\\latest-git',
223
- '$GIT_VERSION = ($LatestUrl -Split \'/\')[-1].substring(1)',
224
- '$GIT_VERSION_SHORT = ($GIT_VERSION -Split \'.windows.\')[0]',
225
- '$GIT_REVISION = ($GIT_VERSION -Split \'.windows.\')[1]',
226
- 'If ($GIT_REVISION -gt 1) {$GIT_VERSION_SHORT = "$GIT_VERSION_SHORT.$GIT_REVISION"}',
227
- 'Invoke-WebRequest -UseBasicParsing -Uri https://github.com/git-for-windows/git/releases/download/v${GIT_VERSION}/Git-${GIT_VERSION_SHORT}-64-bit.exe -OutFile git-setup.exe',
228
- 'Start-Process git-setup.exe -Wait -ArgumentList \'/VERYSILENT\'',
229
- 'del git-setup.exe',
230
- ];
231
- }
232
- throw new Error(`Unknown os/architecture combo for git: ${os.name}/${architecture.name}`);
233
- }
234
- }();
235
- }
236
- /**
237
- * A component to install the GitHub Actions Runner. This is the actual executable that connects to GitHub to ask for jobs and then execute them.
238
- *
239
- * @param runnerVersion The version of the runner to install. Usually you would set this to latest.
240
- */
241
- static githubRunner(runnerVersion) {
242
- return new class extends RunnerImageComponent {
243
- constructor() {
244
- super(...arguments);
245
- this.name = 'GithubRunner';
246
- }
247
- getCommands(os, architecture) {
248
- if (os.is(common_1.Os.LINUX_UBUNTU) || os.is(common_1.Os.LINUX_AMAZON_2)) {
249
- let versionCommand;
250
- if (runnerVersion.is(common_1.RunnerVersion.latest())) {
251
- versionCommand = 'RUNNER_VERSION=`curl -w "%{redirect_url}" -fsS https://github.com/actions/runner/releases/latest | grep -oE "[^/v]+$"`';
252
- }
253
- else {
254
- versionCommand = `RUNNER_VERSION='${runnerVersion.version}'`;
255
- }
256
- let archUrl;
257
- if (architecture.is(common_1.Architecture.X86_64)) {
258
- archUrl = 'x64';
259
- }
260
- else if (architecture.is(common_1.Architecture.ARM64)) {
261
- archUrl = 'arm64';
262
- }
263
- else {
264
- throw new Error(`Unsupported architecture for GitHub Runner: ${architecture.name}`);
265
- }
266
- let commands = [
267
- versionCommand,
268
- `curl -fsSLO "https://github.com/actions/runner/releases/download/v\${RUNNER_VERSION}/actions-runner-linux-${archUrl}-\${RUNNER_VERSION}.tar.gz"`,
269
- `tar -C /home/runner -xzf "actions-runner-linux-${archUrl}-\${RUNNER_VERSION}.tar.gz"`,
270
- `rm actions-runner-linux-${archUrl}-\${RUNNER_VERSION}.tar.gz`,
271
- `echo -n ${runnerVersion.version} > /home/runner/RUNNER_VERSION`,
272
- ];
273
- if (os.is(common_1.Os.LINUX_UBUNTU)) {
274
- commands.push('/home/runner/bin/installdependencies.sh');
275
- }
276
- else if (os.is(common_1.Os.LINUX_AMAZON_2)) {
277
- commands.push('yum install -y openssl-libs krb5-libs zlib libicu60');
278
- }
279
- return commands;
280
- }
281
- else if (os.is(common_1.Os.WINDOWS)) {
282
- let runnerCommands;
283
- if (runnerVersion.is(common_1.RunnerVersion.latest())) {
284
- runnerCommands = [
285
- 'cmd /c curl -w "%{redirect_url}" -fsS https://github.com/actions/runner/releases/latest > $Env:TEMP\\latest-gha',
286
- '$LatestUrl = Get-Content $Env:TEMP\\latest-gha',
287
- '$RUNNER_VERSION = ($LatestUrl -Split \'/\')[-1].substring(1)',
288
- ];
289
- }
290
- else {
291
- runnerCommands = [`$RUNNER_VERSION = '${runnerVersion.version}'`];
292
- }
293
- return runnerCommands.concat([
294
- 'Invoke-WebRequest -UseBasicParsing -Uri "https://github.com/actions/runner/releases/download/v${RUNNER_VERSION}/actions-runner-win-x64-${RUNNER_VERSION}.zip" -OutFile actions.zip',
295
- 'Expand-Archive actions.zip -DestinationPath C:\\actions',
296
- 'del actions.zip',
297
- `echo ${runnerVersion.version} | Out-File -Encoding ASCII -NoNewline C:\\actions\\RUNNER_VERSION`,
298
- ]);
299
- }
300
- throw new Error(`Unknown os/architecture combo for github runner: ${os.name}/${architecture.name}`);
301
- }
302
- getDockerCommands(_os, _architecture) {
303
- return [
304
- `ENV RUNNER_VERSION=${runnerVersion.version}`,
305
- ];
306
- }
307
- }();
308
- }
309
- /**
310
- * A component to install Docker. On Windows this installs Docker Desktop.
311
- */
312
- static docker() {
313
- return new class extends RunnerImageComponent {
314
- constructor() {
315
- super(...arguments);
316
- this.name = 'Docker';
317
- }
318
- getCommands(os, architecture) {
319
- if (os.is(common_1.Os.LINUX_UBUNTU)) {
320
- return [
321
- 'curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg',
322
- 'echo ' +
323
- ' "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu ' +
324
- ' $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null',
325
- 'apt-get update',
326
- 'DEBIAN_FRONTEND=noninteractive apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin',
327
- 'usermod -aG docker runner',
328
- 'ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/bin/docker-compose',
329
- ];
330
- }
331
- else if (os.is(common_1.Os.LINUX_AMAZON_2)) {
332
- return [
333
- 'yum install -y docker',
334
- ];
335
- }
336
- else if (os.is(common_1.Os.WINDOWS)) {
337
- return [
338
- 'Invoke-WebRequest -UseBasicParsing -Uri https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe -OutFile docker-setup.exe',
339
- 'Start-Process \'docker-setup.exe\' -Wait -ArgumentList \'/install --quiet --accept-license\'',
340
- 'del docker-setup.exe',
341
- 'cmd /c curl -w "%{redirect_url}" -fsS https://github.com/docker/compose/releases/latest > $Env:TEMP\\latest-docker-compose',
342
- '$LatestUrl = Get-Content $Env:TEMP\\latest-docker-compose',
343
- '$LatestDockerCompose = ($LatestUrl -Split \'/\')[-1]',
344
- 'Invoke-WebRequest -UseBasicParsing -Uri "https://github.com/docker/compose/releases/download/${LatestDockerCompose}/docker-compose-Windows-x86_64.exe" -OutFile $Env:ProgramFiles\\Docker\\docker-compose.exe',
345
- 'copy $Env:ProgramFiles\\Docker\\docker-compose.exe $Env:ProgramFiles\\Docker\\cli-plugins\\docker-compose.exe',
346
- ];
347
- }
348
- throw new Error(`Unknown os/architecture combo for docker: ${os.name}/${architecture.name}`);
349
- }
350
- }();
351
- }
352
- /**
353
- * A component to install Docker-in-Docker.
354
- */
355
- static dockerInDocker() {
356
- return new class extends RunnerImageComponent {
357
- constructor() {
358
- super(...arguments);
359
- this.name = 'Docker-in-Docker';
360
- }
361
- getCommands(os, architecture) {
362
- if (os.is(common_1.Os.LINUX_UBUNTU) || os.is(common_1.Os.LINUX_AMAZON_2)) {
363
- let archUrl;
364
- if (architecture.is(common_1.Architecture.X86_64)) {
365
- archUrl = 'x86_64';
366
- }
367
- else if (architecture.is(common_1.Architecture.ARM64)) {
368
- archUrl = 'aarch64';
369
- }
370
- else {
371
- throw new Error(`Unsupported architecture for Docker-in-Docker: ${architecture.name}`);
372
- }
373
- return [
374
- os.is(common_1.Os.LINUX_UBUNTU) ? 'DEBIAN_FRONTEND=noninteractive apt-get install -y socat' : 'yum install -y socat',
375
- 'DOCKER_CHANNEL="stable"',
376
- 'DIND_COMMIT="42b1175eda071c0e9121e1d64345928384a93df1"',
377
- 'DOCKER_VERSION="20.10.18"',
378
- 'DOCKER_COMPOSE_VERSION="2.11.0"',
379
- `curl -fsSL "https://download.docker.com/linux/static/\${DOCKER_CHANNEL}/${archUrl}/docker-\${DOCKER_VERSION}.tgz" -o docker.tgz`,
380
- 'tar --strip-components 1 -C /usr/local/bin/ -xzf docker.tgz',
381
- 'rm docker.tgz',
382
- '# set up subuid/subgid so that "--userns-remap=default" works out-of-the box',
383
- 'addgroup dockremap',
384
- 'useradd -g dockremap dockremap',
385
- 'echo \'dockremap:165536:65536\' >> /etc/subuid',
386
- 'echo \'dockremap:165536:65536\' >> /etc/subgid',
387
- 'curl -fsSL "https://raw.githubusercontent.com/docker/docker/${DIND_COMMIT}/hack/dind" -o /usr/local/bin/dind',
388
- `curl -fsSL https://github.com/docker/compose/releases/download/v\${DOCKER_COMPOSE_VERSION}/docker-compose-linux-${archUrl} -o /usr/local/bin/docker-compose`,
389
- 'mkdir -p /home/runner/.docker/cli-plugins && ln -s /usr/local/bin/docker-compose /home/runner/.docker/cli-plugins/docker-compose',
390
- 'chown -R runner /home/runner/.docker',
391
- 'chmod +x /usr/local/bin/dind /usr/local/bin/docker-compose',
392
- 'addgroup docker && usermod -aG docker runner',
393
- ];
394
- }
395
- throw new Error(`Unknown os/architecture combo for Docker-in-Docker: ${os.name}/${architecture.name}`);
396
- }
397
- }();
398
- }
399
- /**
400
- * A component to add a trusted certificate authority. This can be used to support GitHub Enterprise Server with self-signed certificate.
401
- *
402
- * @param source path to certificate file in PEM format
403
- * @param name unique certificate name to be used on runner file system
404
- */
405
- static extraCertificates(source, name) {
406
- return new class extends RunnerImageComponent {
407
- constructor() {
408
- super(...arguments);
409
- this.name = `Extra-Certificates-${name}`;
410
- }
411
- getCommands(os, architecture) {
412
- if (!name.match(/^[a-zA-Z0-9_-]+$/)) {
413
- throw new Error(`Invalid certificate name: ${name}. Name must only contain alphanumeric characters, dashes and underscores.`);
414
- }
415
- if (os.is(common_1.Os.LINUX_UBUNTU)) {
416
- return [
417
- 'update-ca-certificates',
418
- ];
419
- }
420
- else if (os.is(common_1.Os.LINUX_AMAZON_2)) {
421
- return [
422
- 'update-ca-trust',
423
- ];
424
- }
425
- else if (os.is(common_1.Os.WINDOWS)) {
426
- return [
427
- `Import-Certificate -FilePath C:\\${name}.crt -CertStoreLocation Cert:\\LocalMachine\\Root`,
428
- `Remove-Item C:\\${name}.crt`,
429
- ];
430
- }
431
- throw new Error(`Unknown os/architecture combo for extra certificates: ${os.name}/${architecture.name}`);
432
- }
433
- getAssets(os, _architecture) {
434
- if (os.is(common_1.Os.LINUX_UBUNTU)) {
435
- return [
436
- { source, target: `/usr/local/share/ca-certificates/${name}.crt` },
437
- ];
438
- }
439
- else if (os.is(common_1.Os.LINUX_AMAZON_2)) {
440
- return [
441
- { source, target: `/etc/pki/ca-trust/source/anchors/${name}.crt` },
442
- ];
443
- }
444
- else if (os.is(common_1.Os.WINDOWS)) {
445
- return [
446
- { source, target: `C:\\${name}.crt` },
447
- ];
448
- }
449
- throw new Error(`Unsupported OS for extra certificates: ${os.name}`);
450
- }
451
- }();
452
- }
453
- /**
454
- * A component to set up the required Lambda entrypoint for Lambda runners.
455
- */
456
- static lambdaEntrypoint() {
457
- return new class extends RunnerImageComponent {
458
- constructor() {
459
- super(...arguments);
460
- this.name = 'Lambda-Entrypoint';
461
- }
462
- getCommands(os, _architecture) {
463
- if (!os.is(common_1.Os.LINUX_AMAZON_2) && !os.is(common_1.Os.LINUX_UBUNTU)) {
464
- throw new Error(`Unsupported OS for Lambda entrypoint: ${os.name}`);
465
- }
466
- return [];
467
- }
468
- getAssets(_os, _architecture) {
469
- return [
470
- {
471
- source: path.join(__dirname, '..', 'docker-images', 'lambda', 'linux-x64', 'runner.js'),
472
- target: '${LAMBDA_TASK_ROOT}/runner.js',
473
- },
474
- {
475
- source: path.join(__dirname, '..', 'docker-images', 'lambda', 'linux-x64', 'runner.sh'),
476
- target: '${LAMBDA_TASK_ROOT}/runner.sh',
477
- },
478
- ];
479
- }
480
- getDockerCommands(_os, _architecture) {
481
- return [
482
- 'WORKDIR ${LAMBDA_TASK_ROOT}',
483
- 'CMD ["runner.handler"]',
484
- ];
485
- }
486
- };
487
- }
488
- /**
489
- * Returns assets to copy into the built image. Can be used to copy files into the image.
490
- */
491
- getAssets(_os, _architecture) {
492
- return [];
493
- }
494
- /**
495
- * Returns Docker commands to run to in built image. Can be used to add commands like `VOLUME`, `ENTRYPOINT`, `CMD`, etc.
496
- *
497
- * Docker commands are added after assets and normal commands.
498
- */
499
- getDockerCommands(_os, _architecture) {
500
- return [];
501
- }
502
- /**
503
- * Convert component to an AWS Image Builder component.
504
- *
505
- * @internal
506
- */
507
- _asAwsImageBuilderComponent(scope, id, os, architecture) {
508
- let platform;
509
- if (os.is(common_1.Os.LINUX_UBUNTU) || os.is(common_1.Os.LINUX_AMAZON_2)) {
510
- platform = 'Linux';
511
- }
512
- else if (os.is(common_1.Os.WINDOWS)) {
513
- platform = 'Windows';
514
- }
515
- else {
516
- throw new Error(`Unknown os/architecture combo for image builder component: ${os.name}/${architecture.name}`);
517
- }
518
- return new aws_image_builder_1.ImageBuilderComponent(scope, id, {
519
- platform: platform,
520
- commands: this.getCommands(os, architecture),
521
- assets: this.getAssets(os, architecture).map((asset, index) => {
522
- return {
523
- asset: new aws_cdk_lib_1.aws_s3_assets.Asset(scope, `${id} asset ${index}`, { path: asset.source }),
524
- path: asset.target,
525
- };
526
- }),
527
- displayName: id,
528
- description: id,
529
- });
530
- }
531
- }
532
- _a = JSII_RTTI_SYMBOL_1;
533
- RunnerImageComponent[_a] = { fqn: "@cloudsnorkel/cdk-github-runners.RunnerImageComponent", version: "0.9.4" };
534
- exports.RunnerImageComponent = RunnerImageComponent;
535
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcm92aWRlcnMvaW1hZ2UtYnVpbGRlcnMvY29tcG9uZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZCQUE2QjtBQUM3Qiw2Q0FBeUQ7QUFFekQsMkRBQTREO0FBRTVELHNDQUE0RDtBQThCNUQ7O0dBRUc7QUFDSCxNQUFzQixvQkFBb0I7SUFDeEM7Ozs7Ozs7O09BUUc7SUFDSCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQXNDO1FBQ2xELE9BQU8sSUFBSSxLQUFNLFNBQVEsb0JBQW9CO1lBQzNDLElBQUksSUFBSTtnQkFDTixJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRTtvQkFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsS0FBSyxDQUFDLElBQUksOERBQThELENBQUMsQ0FBQztpQkFDdEg7Z0JBQ0QsT0FBTyxVQUFVLEtBQUssQ0FBQyxJQUFJLElBQUksV0FBVyxFQUFFLENBQUM7WUFDL0MsQ0FBQztZQUVELFdBQVcsQ0FBQyxHQUFPLEVBQUUsYUFBMkI7Z0JBQzlDLE9BQU8sS0FBSyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDOUIsQ0FBQztZQUNELFNBQVMsQ0FBQyxHQUFPLEVBQUUsYUFBMkI7Z0JBQzVDLE9BQU8sS0FBSyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFDNUIsQ0FBQztZQUVELGlCQUFpQixDQUFDLEdBQU8sRUFBRSxhQUEyQjtnQkFDcEQsT0FBTyxLQUFLLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQztZQUNwQyxDQUFDO1NBQ0YsRUFBRSxDQUFDO0lBQ04sQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGdCQUFnQjtRQUNyQixPQUFPLElBQUksS0FBTSxTQUFRLG9CQUFvQjtZQUFsQzs7Z0JBQ1QsU0FBSSxHQUFHLGtCQUFrQixDQUFDO1lBa0M1QixDQUFDO1lBaENDLFdBQVcsQ0FBQyxFQUFNLEVBQUUsWUFBMEI7Z0JBQzVDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFFLENBQUMsWUFBWSxDQUFDLEVBQUU7b0JBQzFCLElBQUksT0FBTyxDQUFDO29CQUNaLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxxQkFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFO3dCQUN4QyxPQUFPLEdBQUcsT0FBTyxDQUFDO3FCQUNuQjt5QkFBTSxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMscUJBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTt3QkFDOUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztxQkFDbkI7eUJBQU07d0JBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7cUJBQ3pGO29CQUVELE9BQU87d0JBQ0wsZ0JBQWdCO3dCQUNoQixtREFBbUQ7d0JBQ25ELG1JQUFtSTt3QkFDbkksc0dBQXNHLE9BQU8scUNBQXFDO3dCQUNsSiw2Q0FBNkM7d0JBQzdDLHFDQUFxQztxQkFDdEMsQ0FBQztpQkFDSDtxQkFBTSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFO29CQUNuQyxPQUFPO3dCQUNMLGVBQWU7d0JBQ2YsNkVBQTZFO3FCQUM5RSxDQUFDO2lCQUNIO3FCQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFFLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQzVCLE9BQU87d0JBQ0wsMkpBQTJKO3FCQUM1SixDQUFDO2lCQUNIO2dCQUVELE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFVBQVU7UUFDZixPQUFPLElBQUksS0FBTSxTQUFRLG9CQUFvQjtZQUFsQzs7Z0JBQ1QsU0FBSSxHQUFHLFlBQVksQ0FBQztZQXdCdEIsQ0FBQztZQXRCQyxXQUFXLENBQUMsRUFBTSxFQUFFLGFBQTJCO2dCQUM3QyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBRSxDQUFDLFlBQVksQ0FBQyxFQUFFO29CQUMxQixPQUFPO3dCQUNMLGlCQUFpQjt3QkFDakIsa0ZBQWtGO3dCQUNsRix5QkFBeUI7d0JBQ3pCLG9FQUFvRTtxQkFDckUsQ0FBQztpQkFDSDtxQkFBTSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFO29CQUNuQyxPQUFPO3dCQUNMLDJCQUEyQjt3QkFDM0Isa0dBQWtHO3dCQUNsRyx1QkFBdUI7d0JBQ3ZCLDJCQUEyQjt3QkFDM0Isc0VBQXNFO3FCQUN2RSxDQUFDO2lCQUNIO3FCQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFFLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQzVCLE9BQU8sRUFBRSxDQUFDO2lCQUNYO2dCQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2hFLENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLE1BQU07UUFDWCxPQUFPLElBQUksS0FBTSxTQUFRLG9CQUFvQjtZQUFsQzs7Z0JBQ1QsU0FBSSxHQUFHLFFBQVEsQ0FBQztZQTJCbEIsQ0FBQztZQXpCQyxXQUFXLENBQUMsRUFBTSxFQUFFLFlBQTBCO2dCQUM1QyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFO29CQUN0RCxJQUFJLE9BQWUsQ0FBQztvQkFDcEIsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLHFCQUFZLENBQUMsTUFBTSxDQUFDLEVBQUU7d0JBQ3hDLE9BQU8sR0FBRyxRQUFRLENBQUM7cUJBQ3BCO3lCQUFNLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxxQkFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFO3dCQUM5QyxPQUFPLEdBQUcsU0FBUyxDQUFDO3FCQUNyQjt5QkFBTTt3QkFDTCxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztxQkFDOUU7b0JBRUQsT0FBTzt3QkFDTCw2REFBNkQsT0FBTyx1QkFBdUI7d0JBQzNGLHVCQUF1Qjt3QkFDdkIsZUFBZTt3QkFDZix5QkFBeUI7cUJBQzFCLENBQUM7aUJBQ0g7cUJBQU0sSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDNUIsT0FBTzt3QkFDTCxvR0FBb0c7cUJBQ3JHLENBQUM7aUJBQ0g7Z0JBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsRUFBRSxDQUFDLElBQUksSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMvRixDQUFDO1NBQ0YsRUFBRSxDQUFDO0lBQ04sQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFNBQVM7UUFDZCxPQUFPLElBQUksS0FBTSxTQUFRLG9CQUFvQjtZQUFsQzs7Z0JBQ1QsU0FBSSxHQUFHLFdBQVcsQ0FBQztZQTZCckIsQ0FBQztZQTNCQyxXQUFXLENBQUMsRUFBTSxFQUFFLFlBQTBCO2dCQUM1QyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBRSxDQUFDLFlBQVksQ0FBQyxFQUFFO29CQUMxQixPQUFPO3dCQUNMLHlJQUF5STt3QkFDekksNEdBQTRHOzRCQUM1RywrR0FBK0c7d0JBQy9HLGdCQUFnQjt3QkFDaEIsc0RBQXNEO3FCQUN2RCxDQUFDO2lCQUNIO3FCQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFFLENBQUMsY0FBYyxDQUFDLEVBQUU7b0JBQ25DLE9BQU87d0JBQ0wsNkZBQTZGO3dCQUM3RixtQkFBbUI7cUJBQ3BCLENBQUM7aUJBQ0g7cUJBQU0sSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDNUIsT0FBTzt3QkFDTCx5R0FBeUc7d0JBQ3pHLCtDQUErQzt3QkFDL0MsMERBQTBEO3dCQUMxRCwwSkFBMEo7d0JBQzFKLGlFQUFpRTt3QkFDakUsWUFBWTtxQkFDYixDQUFDO2lCQUNIO2dCQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELEVBQUUsQ0FBQyxJQUFJLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbkcsQ0FBQztTQUNGLEVBQUUsQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxHQUFHO1FBQ1IsT0FBTyxJQUFJLEtBQU0sU0FBUSxvQkFBb0I7WUFBbEM7O2dCQUNULFNBQUksR0FBRyxLQUFLLENBQUM7WUE2QmYsQ0FBQztZQTNCQyxXQUFXLENBQUMsRUFBTSxFQUFFLFlBQTBCO2dCQUM1QyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBRSxDQUFDLFlBQVksQ0FBQyxFQUFFO29CQUMxQixPQUFPO3dCQUNMLHFDQUFxQzt3QkFDckMsZ0JBQWdCO3dCQUNoQix1REFBdUQ7cUJBQ3hELENBQUM7aUJBQ0g7cUJBQU0sSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRTtvQkFDbkMsT0FBTzt3QkFDTCxvQkFBb0I7cUJBQ3JCLENBQUM7aUJBQ0g7cUJBQU0sSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDNUIsT0FBTzt3QkFDTCxzSEFBc0g7d0JBQ3RILGdEQUFnRDt3QkFDaEQsMkRBQTJEO3dCQUMzRCw2REFBNkQ7d0JBQzdELHdEQUF3RDt3QkFDeEQsb0ZBQW9GO3dCQUNwRiw2S0FBNks7d0JBQzdLLGlFQUFpRTt3QkFDakUsbUJBQW1CO3FCQUNwQixDQUFDO2lCQUNIO2dCQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLEVBQUUsQ0FBQyxJQUFJLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDNUYsQ0FBQztTQUNGLEVBQUUsQ0FBQztJQUNOLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFlBQVksQ0FBQyxhQUE0QjtRQUM5QyxPQUFPLElBQUksS0FBTSxTQUFRLG9CQUFvQjtZQUFsQzs7Z0JBQ1QsU0FBSSxHQUFHLGNBQWMsQ0FBQztZQStEeEIsQ0FBQztZQTdEQyxXQUFXLENBQUMsRUFBTSxFQUFFLFlBQTBCO2dCQUM1QyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFO29CQUN0RCxJQUFJLGNBQXNCLENBQUM7b0JBQzNCLElBQUksYUFBYSxDQUFDLEVBQUUsQ0FBQyxzQkFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7d0JBQzVDLGNBQWMsR0FBRyx3SEFBd0gsQ0FBQztxQkFDM0k7eUJBQU07d0JBQ0wsY0FBYyxHQUFHLG1CQUFtQixhQUFhLENBQUMsT0FBTyxHQUFHLENBQUM7cUJBQzlEO29CQUVELElBQUksT0FBTyxDQUFDO29CQUNaLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxxQkFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFO3dCQUN4QyxPQUFPLEdBQUcsS0FBSyxDQUFDO3FCQUNqQjt5QkFBTSxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMscUJBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTt3QkFDOUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztxQkFDbkI7eUJBQU07d0JBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7cUJBQ3JGO29CQUVELElBQUksUUFBUSxHQUFHO3dCQUNiLGNBQWM7d0JBQ2QsNkdBQTZHLE9BQU8sNkJBQTZCO3dCQUNqSixrREFBa0QsT0FBTyw2QkFBNkI7d0JBQ3RGLDJCQUEyQixPQUFPLDRCQUE0Qjt3QkFDOUQsV0FBVyxhQUFhLENBQUMsT0FBTyxnQ0FBZ0M7cUJBQ2pFLENBQUM7b0JBRUYsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRTt3QkFDMUIsUUFBUSxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO3FCQUMxRDt5QkFBTSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFO3dCQUNuQyxRQUFRLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxDQUFDLENBQUM7cUJBQ3RFO29CQUVELE9BQU8sUUFBUSxDQUFDO2lCQUNqQjtxQkFBTSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUM1QixJQUFJLGNBQXdCLENBQUM7b0JBQzdCLElBQUksYUFBYSxDQUFDLEVBQUUsQ0FBQyxzQkFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7d0JBQzVDLGNBQWMsR0FBRzs0QkFDZixpSEFBaUg7NEJBQ2pILGdEQUFnRDs0QkFDaEQsOERBQThEO3lCQUMvRCxDQUFDO3FCQUNIO3lCQUFNO3dCQUNMLGNBQWMsR0FBRyxDQUFDLHNCQUFzQixhQUFhLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztxQkFDbkU7b0JBRUQsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDO3dCQUMzQixvTEFBb0w7d0JBQ3BMLHlEQUF5RDt3QkFDekQsaUJBQWlCO3dCQUNqQixRQUFRLGFBQWEsQ0FBQyxPQUFPLG9FQUFvRTtxQkFDbEcsQ0FBQyxDQUFDO2lCQUNKO2dCQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELEVBQUUsQ0FBQyxJQUFJLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdEcsQ0FBQztZQUVELGlCQUFpQixDQUFDLEdBQU8sRUFBRSxhQUEyQjtnQkFDcEQsT0FBTztvQkFDTCxzQkFBc0IsYUFBYSxDQUFDLE9BQU8sRUFBRTtpQkFDOUMsQ0FBQztZQUNKLENBQUM7U0FDRixFQUFFLENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsTUFBTTtRQUNYLE9BQU8sSUFBSSxLQUFNLFNBQVEsb0JBQW9CO1lBQWxDOztnQkFDVCxTQUFJLEdBQUcsUUFBUSxDQUFDO1lBaUNsQixDQUFDO1lBL0JDLFdBQVcsQ0FBQyxFQUFNLEVBQUUsWUFBMEI7Z0JBQzVDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFFLENBQUMsWUFBWSxDQUFDLEVBQUU7b0JBQzFCLE9BQU87d0JBQ0wsZ0hBQWdIO3dCQUNoSCxPQUFPOzRCQUNILCtIQUErSDs0QkFDL0gseUZBQXlGO3dCQUM3RixnQkFBZ0I7d0JBQ2hCLCtHQUErRzt3QkFDL0csMkJBQTJCO3dCQUMzQiw4RUFBOEU7cUJBQy9FLENBQUM7aUJBQ0g7cUJBQU0sSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRTtvQkFDbkMsT0FBTzt3QkFDTCx1QkFBdUI7cUJBQ3hCLENBQUM7aUJBQ0g7cUJBQU0sSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDNUIsT0FBTzt3QkFDTCw4SUFBOEk7d0JBQzlJLDhGQUE4Rjt3QkFDOUYsc0JBQXNCO3dCQUN0Qiw0SEFBNEg7d0JBQzVILDJEQUEyRDt3QkFDM0Qsc0RBQXNEO3dCQUN0RCxnTkFBZ047d0JBQ2hOLCtHQUErRztxQkFDaEgsQ0FBQztpQkFDSDtnQkFFRCxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxFQUFFLENBQUMsSUFBSSxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQy9GLENBQUM7U0FDRixFQUFFLENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsY0FBYztRQUNuQixPQUFPLElBQUksS0FBTSxTQUFRLG9CQUFvQjtZQUFsQzs7Z0JBQ1QsU0FBSSxHQUFHLGtCQUFrQixDQUFDO1lBc0M1QixDQUFDO1lBcENDLFdBQVcsQ0FBQyxFQUFNLEVBQUUsWUFBMEI7Z0JBQzVDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFFLENBQUMsY0FBYyxDQUFDLEVBQUU7b0JBQ3RELElBQUksT0FBZSxDQUFDO29CQUNwQixJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMscUJBQVksQ0FBQyxNQUFNLENBQUMsRUFBRTt3QkFDeEMsT0FBTyxHQUFHLFFBQVEsQ0FBQztxQkFDcEI7eUJBQU0sSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLHFCQUFZLENBQUMsS0FBSyxDQUFDLEVBQUU7d0JBQzlDLE9BQU8sR0FBRyxTQUFTLENBQUM7cUJBQ3JCO3lCQUFNO3dCQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO3FCQUN4RjtvQkFFRCxPQUFPO3dCQUNMLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyx5REFBeUQsQ0FBQyxDQUFDLENBQUMsc0JBQXNCO3dCQUMzRyx5QkFBeUI7d0JBQ3pCLHdEQUF3RDt3QkFDeEQsMkJBQTJCO3dCQUMzQixpQ0FBaUM7d0JBQ2pDLDJFQUEyRSxPQUFPLCtDQUErQzt3QkFDakksNkRBQTZEO3dCQUM3RCxlQUFlO3dCQUNmLDhFQUE4RTt3QkFDOUUsb0JBQW9CO3dCQUNwQixnQ0FBZ0M7d0JBQ2hDLGdEQUFnRDt3QkFDaEQsZ0RBQWdEO3dCQUNoRCw4R0FBOEc7d0JBQzlHLG1IQUFtSCxPQUFPLG1DQUFtQzt3QkFDN0osa0lBQWtJO3dCQUNsSSxzQ0FBc0M7d0JBQ3RDLDREQUE0RDt3QkFDNUQsOENBQThDO3FCQUMvQyxDQUFDO2lCQUNIO2dCQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELEVBQUUsQ0FBQyxJQUFJLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDekcsQ0FBQztTQUNGLEVBQUUsQ0FBQztJQUNOLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxNQUFjLEVBQUUsSUFBWTtRQUNuRCxPQUFPLElBQUksS0FBTSxTQUFRLG9CQUFvQjtZQUFsQzs7Z0JBQ1QsU0FBSSxHQUFHLHNCQUFzQixJQUFJLEVBQUUsQ0FBQztZQTBDdEMsQ0FBQztZQXhDQyxXQUFXLENBQUMsRUFBTSxFQUFFLFlBQTBCO2dCQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFO29CQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixJQUFJLDJFQUEyRSxDQUFDLENBQUM7aUJBQy9IO2dCQUVELElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFFLENBQUMsWUFBWSxDQUFDLEVBQUU7b0JBQzFCLE9BQU87d0JBQ0wsd0JBQXdCO3FCQUN6QixDQUFDO2lCQUNIO3FCQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFFLENBQUMsY0FBYyxDQUFDLEVBQUU7b0JBQ25DLE9BQU87d0JBQ0wsaUJBQWlCO3FCQUNsQixDQUFDO2lCQUNIO3FCQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFFLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQzVCLE9BQU87d0JBQ0wsb0NBQW9DLElBQUksbURBQW1EO3dCQUMzRixtQkFBbUIsSUFBSSxNQUFNO3FCQUM5QixDQUFDO2lCQUNIO2dCQUVELE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELEVBQUUsQ0FBQyxJQUFJLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDM0csQ0FBQztZQUVELFNBQVMsQ0FBQyxFQUFNLEVBQUUsYUFBMkI7Z0JBQzNDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFFLENBQUMsWUFBWSxDQUFDLEVBQUU7b0JBQzFCLE9BQU87d0JBQ0wsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLG9DQUFvQyxJQUFJLE1BQU0sRUFBRTtxQkFDbkUsQ0FBQztpQkFDSDtxQkFBTSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFO29CQUNuQyxPQUFPO3dCQUNMLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxvQ0FBb0MsSUFBSSxNQUFNLEVBQUU7cUJBQ25FLENBQUM7aUJBQ0g7cUJBQU0sSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDNUIsT0FBTzt3QkFDTCxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLE1BQU0sRUFBRTtxQkFDdEMsQ0FBQztpQkFDSDtnQkFFRCxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN2RSxDQUFDO1NBQ0YsRUFBRSxDQUFDO0lBQ04sQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGdCQUFnQjtRQUNyQixPQUFPLElBQUksS0FBTSxTQUFRLG9CQUFvQjtZQUFsQzs7Z0JBQ1QsU0FBSSxHQUFHLG1CQUFtQixDQUFDO1lBNkI3QixDQUFDO1lBM0JDLFdBQVcsQ0FBQyxFQUFNLEVBQUUsYUFBMkI7Z0JBQzdDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBRSxDQUFDLFlBQVksQ0FBQyxFQUFFO29CQUN4RCxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDckU7Z0JBRUQsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDO1lBRUQsU0FBUyxDQUFDLEdBQU8sRUFBRSxhQUEyQjtnQkFDNUMsT0FBTztvQkFDTDt3QkFDRSxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQzt3QkFDdkYsTUFBTSxFQUFFLCtCQUErQjtxQkFDeEM7b0JBQ0Q7d0JBQ0UsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUM7d0JBQ3ZGLE1BQU0sRUFBRSwrQkFBK0I7cUJBQ3hDO2lCQUNGLENBQUM7WUFDSixDQUFDO1lBRUQsaUJBQWlCLENBQUMsR0FBTyxFQUFFLGFBQTJCO2dCQUNwRCxPQUFPO29CQUNMLDZCQUE2QjtvQkFDN0Isd0JBQXdCO2lCQUN6QixDQUFDO1lBQ0osQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0lBY0Q7O09BRUc7SUFDSCxTQUFTLENBQUMsR0FBTyxFQUFFLGFBQTJCO1FBQzVDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxpQkFBaUIsQ0FBQyxHQUFPLEVBQUUsYUFBMkI7UUFDcEQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILDJCQUEyQixDQUFDLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEVBQU0sRUFBRSxZQUEwQjtRQUMxRixJQUFJLFFBQTZCLENBQUM7UUFDbEMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUN0RCxRQUFRLEdBQUcsT0FBTyxDQUFDO1NBQ3BCO2FBQU0sSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUM1QixRQUFRLEdBQUcsU0FBUyxDQUFDO1NBQ3RCO2FBQU07WUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxFQUFFLENBQUMsSUFBSSxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQy9HO1FBRUQsT0FBTyxJQUFJLHlDQUFxQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDMUMsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQztZQUM1QyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUM1RCxPQUFPO29CQUNMLEtBQUssRUFBRSxJQUFJLDJCQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsVUFBVSxLQUFLLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ2pGLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTTtpQkFDbkIsQ0FBQztZQUNKLENBQUMsQ0FBQztZQUNGLFdBQVcsRUFBRSxFQUFFO1lBQ2YsV0FBVyxFQUFFLEVBQUU7U0FDaEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7OztBQXhnQm1CLG9EQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBhd3NfczNfYXNzZXRzIGFzIHMzX2Fzc2V0cyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSW1hZ2VCdWlsZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9hd3MtaW1hZ2UtYnVpbGRlcic7XG5pbXBvcnQgeyBSdW5uZXJJbWFnZUFzc2V0IH0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgQXJjaGl0ZWN0dXJlLCBPcywgUnVubmVyVmVyc2lvbiB9IGZyb20gJy4uL2NvbW1vbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVubmVySW1hZ2VDb21wb25lbnRDdXN0b21Qcm9wcyB7XG4gIC8qKlxuICAgKiBDb21wb25lbnQgbmFtZSB1c2VkIGZvciAoMSkgaW1hZ2UgYnVpbGQgbG9nZ2luZyBhbmQgKDIpIGlkZW50aWZpZXIgZm9yIHtAbGluayBJbWFnZVJ1bm5lckJ1aWxkZXIucmVtb3ZlQ29tcG9uZW50fS5cbiAgICpcbiAgICogTmFtZSBtdXN0IG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgZGFzaGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQ29tbWFuZHMgdG8gcnVuIGluIHRoZSBidWlsdCBpbWFnZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbW1hbmRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEFzc2V0cyB0byBjb3B5IGludG8gdGhlIGJ1aWx0IGltYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXRzPzogUnVubmVySW1hZ2VBc3NldFtdO1xuXG4gIC8qKlxuICAgKiBEb2NrZXIgY29tbWFuZHMgdG8gcnVuIGluIHRoZSBidWlsdCBpbWFnZS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGU6IGBbJ0VOViBmb289YmFyJywgJ1JVTiBlY2hvICRmb28nXWBcbiAgICpcbiAgICogVGhlc2UgY29tbWFuZHMgYXJlIGlnbm9yZWQgd2hlbiBidWlsZGluZyBBTUlzLlxuICAgKi9cbiAgcmVhZG9ubHkgZG9ja2VyQ29tbWFuZHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnRzIGFyZSB1c2VkIHRvIGJ1aWxkIHJ1bm5lciBpbWFnZXMuIFRoZXkgY2FuIHJ1biBjb21tYW5kcyBpbiB0aGUgaW1hZ2UsIGNvcHkgZmlsZXMgaW50byB0aGUgaW1hZ2UsIGFuZCBydW4gc29tZSBEb2NrZXIgY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSdW5uZXJJbWFnZUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBEZWZpbmUgYSBjdXN0b20gY29tcG9uZW50IHRoYXQgY2FuIHJ1biBjb21tYW5kcyBpbiB0aGUgaW1hZ2UsIGNvcHkgZmlsZXMgaW50byB0aGUgaW1hZ2UsIGFuZCBydW4gc29tZSBEb2NrZXIgY29tbWFuZHMuXG4gICAqXG4gICAqIFRoZSBvcmRlciBvZiBvcGVyYXRpb25zIGlzICgxKSBhc3NldHMgKDIpIGNvbW1hbmRzICgzKSBkb2NrZXIgY29tbWFuZHMuXG4gICAqXG4gICAqIFVzZSB0aGlzIHRvIGN1c3RvbWl6ZSB0aGUgaW1hZ2UgZm9yIHRoZSBydW5uZXIuXG4gICAqXG4gICAqICoqV0FSTklORzoqKiBEb2NrZXIgY29tbWFuZHMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIGluY2x1ZGVkIGJlZm9yZSB0aGUgbmV4dCBjb21wb25lbnRcbiAgICovXG4gIHN0YXRpYyBjdXN0b20ocHJvcHM6IFJ1bm5lckltYWdlQ29tcG9uZW50Q3VzdG9tUHJvcHMpOiBSdW5uZXJJbWFnZUNvbXBvbmVudCB7XG4gICAgcmV0dXJuIG5ldyBjbGFzcyBleHRlbmRzIFJ1bm5lckltYWdlQ29tcG9uZW50IHtcbiAgICAgIGdldCBuYW1lKCkge1xuICAgICAgICBpZiAocHJvcHMubmFtZSAmJiAhcHJvcHMubmFtZS5tYXRjaCgvW2EtekEtWjAtOVxcLV0vKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb21wb25lbnQgbmFtZTogJHtwcm9wcy5uYW1lfS4gTmFtZSBtdXN0IG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgZGFzaGVzLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgQ3VzdG9tLSR7cHJvcHMubmFtZSA/PyAnVW5kZWZpbmVkJ31gO1xuICAgICAgfVxuXG4gICAgICBnZXRDb21tYW5kcyhfb3M6IE9zLCBfYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUpIHtcbiAgICAgICAgcmV0dXJuIHByb3BzLmNvbW1hbmRzID8/IFtdO1xuICAgICAgfVxuICAgICAgZ2V0QXNzZXRzKF9vczogT3MsIF9hcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZSkge1xuICAgICAgICByZXR1cm4gcHJvcHMuYXNzZXRzID8/IFtdO1xuICAgICAgfVxuXG4gICAgICBnZXREb2NrZXJDb21tYW5kcyhfb3M6IE9zLCBfYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUpIHtcbiAgICAgICAgcmV0dXJuIHByb3BzLmRvY2tlckNvbW1hbmRzID8/IFtdO1xuICAgICAgfVxuICAgIH0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNvbXBvbmVudCB0byBpbnN0YWxsIHRoZSByZXF1aXJlZCBwYWNrYWdlcyBmb3IgdGhlIHJ1bm5lci5cbiAgICovXG4gIHN0YXRpYyByZXF1aXJlZFBhY2thZ2VzKCk6IFJ1bm5lckltYWdlQ29tcG9uZW50IHtcbiAgICByZXR1cm4gbmV3IGNsYXNzIGV4dGVuZHMgUnVubmVySW1hZ2VDb21wb25lbnQge1xuICAgICAgbmFtZSA9ICdSZXF1aXJlZFBhY2thZ2VzJztcblxuICAgICAgZ2V0Q29tbWFuZHMob3M6IE9zLCBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZSk6IHN0cmluZ1tdIHtcbiAgICAgICAgaWYgKG9zLmlzKE9zLkxJTlVYX1VCVU5UVSkpIHtcbiAgICAgICAgICBsZXQgYXJjaFVybDtcbiAgICAgICAgICBpZiAoYXJjaGl0ZWN0dXJlLmlzKEFyY2hpdGVjdHVyZS5YODZfNjQpKSB7XG4gICAgICAgICAgICBhcmNoVXJsID0gJ2FtZDY0JztcbiAgICAgICAgICB9IGVsc2UgaWYgKGFyY2hpdGVjdHVyZS5pcyhBcmNoaXRlY3R1cmUuQVJNNjQpKSB7XG4gICAgICAgICAgICBhcmNoVXJsID0gJ2FybTY0JztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgZm9yIHJlcXVpcmVkIHBhY2thZ2VzOiAke2FyY2hpdGVjdHVyZS5uYW1lfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnYXB0LWdldCB1cGRhdGUnLFxuICAgICAgICAgICAgJ0RFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IHVwZ3JhZGUgLXknLFxuICAgICAgICAgICAgJ0RFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IGluc3RhbGwgLXkgY3VybCBzdWRvIGpxIGJhc2ggemlwIHVuemlwIGlwdGFibGVzIHNvZnR3YXJlLXByb3BlcnRpZXMtY29tbW9uIGNhLWNlcnRpZmljYXRlcycsXG4gICAgICAgICAgICBgY3VybCAtc2ZMbyAvdG1wL2FtYXpvbi1jbG91ZHdhdGNoLWFnZW50LmRlYiBodHRwczovL3MzLmFtYXpvbmF3cy5jb20vYW1hem9uY2xvdWR3YXRjaC1hZ2VudC91YnVudHUvJHthcmNoVXJsfS9sYXRlc3QvYW1hem9uLWNsb3Vkd2F0Y2gtYWdlbnQuZGViYCxcbiAgICAgICAgICAgICdkcGtnIC1pIC1FIC90bXAvYW1hem9uLWNsb3Vkd2F0Y2gtYWdlbnQuZGViJyxcbiAgICAgICAgICAgICdybSAvdG1wL2FtYXpvbi1jbG91ZHdhdGNoLWFnZW50LmRlYicsXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIGlmIChvcy5pcyhPcy5MSU5VWF9BTUFaT05fMikpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ3l1bSB1cGRhdGUgLXknLFxuICAgICAgICAgICAgJ3l1bSBpbnN0YWxsIC15IGpxIHRhciBnemlwIGJ6aXAyIHdoaWNoIGJpbnV0aWxzIHppcCB1bnppcCBzdWRvIHNoYWRvdy11dGlscycsXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIGlmIChvcy5pcyhPcy5XSU5ET1dTKSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnU3RhcnQtUHJvY2VzcyBtc2lleGVjLmV4ZSAtV2FpdCAtQXJndW1lbnRMaXN0IFxcJy9pIGh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9hbWF6b25jbG91ZHdhdGNoLWFnZW50L3dpbmRvd3MvYW1kNjQvbGF0ZXN0L2FtYXpvbi1jbG91ZHdhdGNoLWFnZW50Lm1zaSAvcW5cXCcnLFxuICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIE9TIGZvciByZXF1aXJlZCBwYWNrYWdlczogJHtvcy5uYW1lfWApO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQSBjb21wb25lbnQgdG8gcHJlcGFyZSB0aGUgcmVxdWlyZWQgcnVubmVyIHVzZXIuXG4gICAqL1xuICBzdGF0aWMgcnVubmVyVXNlcigpOiBSdW5uZXJJbWFnZUNvbXBvbmVudCB7XG4gICAgcmV0dXJuIG5ldyBjbGFzcyBleHRlbmRzIFJ1bm5lckltYWdlQ29tcG9uZW50IHtcbiAgICAgIG5hbWUgPSAnUnVubmVyVXNlcic7XG5cbiAgICAgIGdldENvbW1hbmRzKG9zOiBPcywgX2FyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlKTogc3RyaW5nW10ge1xuICAgICAgICBpZiAob3MuaXMoT3MuTElOVVhfVUJVTlRVKSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnYWRkZ3JvdXAgcnVubmVyJyxcbiAgICAgICAgICAgICdhZGR1c2VyIC0tc3lzdGVtIC0tZGlzYWJsZWQtcGFzc3dvcmQgLS1ob21lIC9ob21lL3J1bm5lciAtLWluZ3JvdXAgcnVubmVyIHJ1bm5lcicsXG4gICAgICAgICAgICAndXNlcm1vZCAtYUcgc3VkbyBydW5uZXInLFxuICAgICAgICAgICAgJ2VjaG8gXCIlc3VkbyAgIEFMTD0oQUxMOkFMTCkgTk9QQVNTV0Q6IEFMTFwiID4gL2V0Yy9zdWRvZXJzLmQvcnVubmVyJyxcbiAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2UgaWYgKG9zLmlzKE9zLkxJTlVYX0FNQVpPTl8yKSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnL3Vzci9zYmluL2dyb3VwYWRkIHJ1bm5lcicsXG4gICAgICAgICAgICAnL3Vzci9zYmluL3VzZXJhZGQgLS1zeXN0ZW0gLS1zaGVsbCAvdXNyL3NiaW4vbm9sb2dpbiAtLWhvbWUtZGlyIC9ob21lL3J1bm5lciAtLWdpZCBydW5uZXIgcnVubmVyJyxcbiAgICAgICAgICAgICdta2RpciAtcCAvaG9tZS9ydW5uZXInLFxuICAgICAgICAgICAgJ2Nob3duIHJ1bm5lciAvaG9tZS9ydW5uZXInLFxuICAgICAgICAgICAgJ2VjaG8gXCIlcnVubmVyICAgQUxMPShBTEw6QUxMKSBOT1BBU1NXRDogQUxMXCIgPiAvZXRjL3N1ZG9lcnMuZC9ydW5uZXInLFxuICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSBpZiAob3MuaXMoT3MuV0lORE9XUykpIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIE9TIGZvciBydW5uZXIgdXNlcjogJHtvcy5uYW1lfWApO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQSBjb21wb25lbnQgdG8gaW5zdGFsbCB0aGUgQVdTIENMSS5cbiAgICovXG4gIHN0YXRpYyBhd3NDbGkoKTogUnVubmVySW1hZ2VDb21wb25lbnQge1xuICAgIHJldHVybiBuZXcgY2xhc3MgZXh0ZW5kcyBSdW5uZXJJbWFnZUNvbXBvbmVudCB7XG4gICAgICBuYW1lID0gJ0F3c0NsaSc7XG5cbiAgICAgIGdldENvbW1hbmRzKG9zOiBPcywgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUpIHtcbiAgICAgICAgaWYgKG9zLmlzKE9zLkxJTlVYX1VCVU5UVSkgfHwgb3MuaXMoT3MuTElOVVhfQU1BWk9OXzIpKSB7XG4gICAgICAgICAgbGV0IGFyY2hVcmw6IHN0cmluZztcbiAgICAgICAgICBpZiAoYXJjaGl0ZWN0dXJlLmlzKEFyY2hpdGVjdHVyZS5YODZfNjQpKSB7XG4gICAgICAgICAgICBhcmNoVXJsID0gJ3g4Nl82NCc7XG4gICAgICAgICAgfSBlbHNlIGlmIChhcmNoaXRlY3R1cmUuaXMoQXJjaGl0ZWN0dXJlLkFSTTY0KSkge1xuICAgICAgICAgICAgYXJjaFVybCA9ICdhYXJjaDY0JztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgZm9yIGF3c2NsaTogJHthcmNoaXRlY3R1cmUubmFtZX1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgYGN1cmwgLWZzU0wgXCJodHRwczovL2F3c2NsaS5hbWF6b25hd3MuY29tL2F3c2NsaS1leGUtbGludXgtJHthcmNoVXJsfS56aXBcIiAtbyBhd3NjbGl2Mi56aXBgLFxuICAgICAgICAgICAgJ3VuemlwIC1xIGF3c2NsaXYyLnppcCcsXG4gICAgICAgICAgICAnLi9hd3MvaW5zdGFsbCcsXG4gICAgICAgICAgICAncm0gLXJmIGF3c2NsaXYyLnppcCBhd3MnLFxuICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSBpZiAob3MuaXMoT3MuV0lORE9XUykpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ1N0YXJ0LVByb2Nlc3MgbXNpZXhlYy5leGUgLVdhaXQgLUFyZ3VtZW50TGlzdCBcXCcvaSBodHRwczovL2F3c2NsaS5hbWF6b25hd3MuY29tL0FXU0NMSVYyLm1zaSAvcW5cXCcnLFxuICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gb3MvYXJjaGl0ZWN0dXJlIGNvbWJvIGZvciBhd3NjbGk6ICR7b3MubmFtZX0vJHthcmNoaXRlY3R1cmUubmFtZX1gKTtcbiAgICAgIH1cbiAgICB9KCk7XG4gIH1cblxuICAvKipcbiAgICogQSBjb21wb25lbnQgdG8gaW5zdGFsbCB0aGUgR2l0SHViIENMSS5cbiAgICovXG4gIHN0YXRpYyBnaXRodWJDbGkoKTogUnVubmVySW1hZ2VDb21wb25lbnQge1xuICAgIHJldHVybiBuZXcgY2xhc3MgZXh0ZW5kcyBSdW5uZXJJbWFnZUNvbXBvbmVudCB7XG4gICAgICBuYW1lID0gJ0dpdGh1YkNsaSc7XG5cbiAgICAgIGdldENvbW1hbmRzKG9zOiBPcywgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUpIHtcbiAgICAgICAgaWYgKG9zLmlzKE9zLkxJTlVYX1VCVU5UVSkpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2N1cmwgLWZzU0wgaHR0cHM6Ly9jbGkuZ2l0aHViLmNvbS9wYWNrYWdlcy9naXRodWJjbGktYXJjaGl2ZS1rZXlyaW5nLmdwZyB8IHN1ZG8gZGQgb2Y9L3Vzci9zaGFyZS9rZXlyaW5ncy9naXRodWJjbGktYXJjaGl2ZS1rZXlyaW5nLmdwZycsXG4gICAgICAgICAgICAnZWNobyBcImRlYiBbYXJjaD0kKGRwa2cgLS1wcmludC1hcmNoaXRlY3R1cmUpIHNpZ25lZC1ieT0vdXNyL3NoYXJlL2tleXJpbmdzL2dpdGh1YmNsaS1hcmNoaXZlLWtleXJpbmcuZ3BnXSAnICtcbiAgICAgICAgICAgICcgIGh0dHBzOi8vY2xpLmdpdGh1Yi5jb20vcGFja2FnZXMgc3RhYmxlIG1haW5cIiB8IHN1ZG8gdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2dpdGh1Yi1jbGkubGlzdCA+IC9kZXYvbnVsbCcsXG4gICAgICAgICAgICAnYXB0LWdldCB1cGRhdGUnLFxuICAgICAgICAgICAgJ0RFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IGluc3RhbGwgLXkgZ2gnLFxuICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSBpZiAob3MuaXMoT3MuTElOVVhfQU1BWk9OXzIpKSB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICdjdXJsIC1mc1NTTCBodHRwczovL2NsaS5naXRodWIuY29tL3BhY2thZ2VzL3JwbS9naC1jbGkucmVwbyAtbyAvZXRjL3l1bS5yZXBvcy5kL2doLWNsaS5yZXBvJyxcbiAgICAgICAgICAgICd5dW0gaW5zdGFsbCAteSBnaCcsXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIGlmIChvcy5pcyhPcy5XSU5ET1dTKSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnY21kIC9jIGN1cmwgLXcgXCIle3JlZGlyZWN0X3VybH1cIiAtZnNTIGh0dHBzOi8vZ2l0aHViLmNvbS9jbGkvY2xpL3JlbGVhc2VzL2xhdGVzdCA+ICRFbnY6VEVNUFxcXFxsYXRlc3QtZ2gnLFxuICAgICAgICAgICAgJyRMYXRlc3RVcmwgPSBHZXQtQ29udGVudCAkRW52OlRFTVBcXFxcbGF0ZXN0LWdoJyxcbiAgICAgICAgICAgICckR0hfVkVSU0lPTiA9ICgkTGF0ZXN0VXJsIC1TcGxpdCBcXCcvXFwnKVstMV0uc3Vic3RyaW5nKDEpJyxcbiAgICAgICAgICAgICdJbnZva2UtV2ViUmVxdWVzdCAtVXNlQmFzaWNQYXJzaW5nIC1VcmkgXCJodHRwczovL2dpdGh1Yi5jb20vY2xpL2NsaS9yZWxlYXNlcy9kb3dubG9hZC92JHtHSF9WRVJTSU9OfS9naF8ke0dIX1ZFUlNJT059X3dpbmRvd3NfYW1kNjQubXNpXCIgLU91dEZpbGUgZ2gubXNpJyxcbiAgICAgICAgICAgICdTdGFydC1Qcm9jZXNzIG1zaWV4ZWMuZXhlIC1XYWl0IC1Bcmd1bWVudExpc3QgXFwnL2kgZ2gubXNpIC9xblxcJycsXG4gICAgICAgICAgICAnZGVsIGdoLm1zaScsXG4gICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBvcy9hcmNoaXRlY3R1cmUgY29tYm8gZm9yIGdpdGh1YiBjbGk6ICR7b3MubmFtZX0vJHthcmNoaXRlY3R1cmUubmFtZX1gKTtcbiAgICAgIH1cbiAgICB9KCk7XG4gIH1cblxuICAvKipcbiAgICogQSBjb21wb25lbnQgdG8gaW5zdGFsbCB0aGUgR2l0SHViIENMSS5cbiAgICovXG4gIHN0YXRpYyBnaXQoKTogUnVubmVySW1hZ2VDb21wb25lbnQge1xuICAgIHJldHVybiBuZXcgY2xhc3MgZXh0ZW5kcyBSdW5uZXJJbWFnZUNvbXBvbmVudCB7XG4gICAgICBuYW1lID0gJ0dpdCc7XG5cbiAgICAgIGdldENvbW1hbmRzKG9zOiBPcywgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUpIHtcbiAgICAgICAgaWYgKG9zLmlzKE9zLkxJTlVYX1VCVU5UVSkpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2FkZC1hcHQtcmVwb3NpdG9yeSBwcGE6Z2l0LWNvcmUvcHBhJyxcbiAgICAgICAgICAgICdhcHQtZ2V0IHVwZGF0ZScsXG4gICAgICAgICAgICAnREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgaW5zdGFsbCAteSBnaXQnLFxuICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSBpZiAob3MuaXMoT3MuTElOVVhfQU1BWk9OXzIpKSB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICd5dW0gaW5zdGFsbCAteSBnaXQnLFxuICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSBpZiAob3MuaXMoT3MuV0lORE9XUykpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2NtZCAvYyBjdXJsIC13IFwiJXtyZWRpcmVjdF91cmx9XCIgLWZzUyBodHRwczovL2dpdGh1Yi5jb20vZ2l0LWZvci13aW5kb3dzL2dpdC9yZWxlYXNlcy9sYXRlc3QgPiAkRW52OlRFTVBcXFxcbGF0ZXN0LWdpdCcsXG4gICAgICAgICAgICAnJExhdGVzdFVybCA9IEdldC1Db250ZW50ICRFbnY6VEVNUFxcXFxsYXRlc3QtZ2l0JyxcbiAgICAgICAgICAgICckR0lUX1ZFUlNJT04gPSAoJExhdGVzdFVybCAtU3BsaXQgXFwnL1xcJylbLTFdLnN1YnN0cmluZygxKScsXG4gICAgICAgICAgICAnJEdJVF9WRVJTSU9OX1NIT1JUID0gKCRHSVRfVkVSU0lPTiAtU3BsaXQgXFwnLndpbmRvd3MuXFwnKVswXScsXG4gICAgICAgICAgICAnJEdJVF9SRVZJU0lPTiA9ICgkR0lUX1ZFUlNJT04gLVNwbGl0IFxcJy53aW5kb3dzLlxcJylbMV0nLFxuICAgICAgICAgICAgJ0lmICgkR0lUX1JFVklTSU9OIC1ndCAxKSB7JEdJVF9WRVJTSU9OX1NIT1JUID0gXCIkR0lUX1ZFUlNJT05fU0hPUlQuJEdJVF9SRVZJU0lPTlwifScsXG4gICAgICAgICAgICAnSW52b2tlLVdlYlJlcXVlc3QgLVVzZUJhc2ljUGFyc2luZyAtVXJpIGh0dHBzOi8vZ2l0aHViLmNvbS9naXQtZm9yLXdpbmRvd3MvZ2l0L3JlbGVhc2VzL2Rvd25sb2FkL3Yke0dJVF9WRVJTSU9OfS9HaXQtJHtHSVRfVkVSU0lPTl9TSE9SVH0tNjQtYml0LmV4ZSAtT3V0RmlsZSBnaXQtc2V0dXAuZXhlJyxcbiAgICAgICAgICAgICdTdGFydC1Qcm9jZXNzIGdpdC1zZXR1cC5leGUgLVdhaXQgLUFyZ3VtZW50TGlzdCBcXCcvVkVSWVNJTEVOVFxcJycsXG4gICAgICAgICAgICAnZGVsIGdpdC1zZXR1cC5leGUnLFxuICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gb3MvYXJjaGl0ZWN0dXJlIGNvbWJvIGZvciBnaXQ6ICR7b3MubmFtZX0vJHthcmNoaXRlY3R1cmUubmFtZX1gKTtcbiAgICAgIH1cbiAgICB9KCk7XG4gIH1cblxuICAvKipcbiAgICogQSBjb21wb25lbnQgdG8gaW5zdGFsbCB0aGUgR2l0SHViIEFjdGlvbnMgUnVubmVyLiBUaGlzIGlzIHRoZSBhY3R1YWwgZXhlY3V0YWJsZSB0aGF0IGNvbm5lY3RzIHRvIEdpdEh1YiB0byBhc2sgZm9yIGpvYnMgYW5kIHRoZW4gZXhlY3V0ZSB0aGVtLlxuICAgKlxuICAgKiBAcGFyYW0gcnVubmVyVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgcnVubmVyIHRvIGluc3RhbGwuIFVzdWFsbHkgeW91IHdvdWxkIHNldCB0aGlzIHRvIGxhdGVzdC5cbiAgICovXG4gIHN0YXRpYyBnaXRodWJSdW5uZXIocnVubmVyVmVyc2lvbjogUnVubmVyVmVyc2lvbik6IFJ1bm5lckltYWdlQ29tcG9uZW50IHtcbiAgICByZXR1cm4gbmV3IGNsYXNzIGV4dGVuZHMgUnVubmVySW1hZ2VDb21wb25lbnQge1xuICAgICAgbmFtZSA9ICdHaXRodWJSdW5uZXInO1xuXG4gICAgICBnZXRDb21tYW5kcyhvczogT3MsIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlKSB7XG4gICAgICAgIGlmIChvcy5pcyhPcy5MSU5VWF9VQlVOVFUpIHx8IG9zLmlzKE9zLkxJTlVYX0FNQVpPTl8yKSkge1xuICAgICAgICAgIGxldCB2ZXJzaW9uQ29tbWFuZDogc3RyaW5nO1xuICAgICAgICAgIGlmIChydW5uZXJWZXJzaW9uLmlzKFJ1bm5lclZlcnNpb24ubGF0ZXN0KCkpKSB7XG4gICAgICAgICAgICB2ZXJzaW9uQ29tbWFuZCA9ICdSVU5ORVJfVkVSU0lPTj1gY3VybCAtdyBcIiV7cmVkaXJlY3RfdXJsfVwiIC1mc1MgaHR0cHM6Ly9naXRodWIuY29tL2FjdGlvbnMvcnVubmVyL3JlbGVhc2VzL2xhdGVzdCB8IGdyZXAgLW9FIFwiW14vdl0rJFwiYCc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZlcnNpb25Db21tYW5kID0gYFJVTk5FUl9WRVJTSU9OPScke3J1bm5lclZlcnNpb24udmVyc2lvbn0nYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgYXJjaFVybDtcbiAgICAgICAgICBpZiAoYXJjaGl0ZWN0dXJlLmlzKEFyY2hpdGVjdHVyZS5YODZfNjQpKSB7XG4gICAgICAgICAgICBhcmNoVXJsID0gJ3g2NCc7XG4gICAgICAgICAgfSBlbHNlIGlmIChhcmNoaXRlY3R1cmUuaXMoQXJjaGl0ZWN0dXJlLkFSTTY0KSkge1xuICAgICAgICAgICAgYXJjaFVybCA9ICdhcm02NCc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIGZvciBHaXRIdWIgUnVubmVyOiAke2FyY2hpdGVjdHVyZS5uYW1lfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBjb21tYW5kcyA9IFtcbiAgICAgICAgICAgIHZlcnNpb25Db21tYW5kLFxuICAgICAgICAgICAgYGN1cmwgLWZzU0xPIFwiaHR0cHM6Ly9naXRodWIuY29tL2FjdGlvbnMvcnVubmVyL3JlbGVhc2VzL2Rvd25sb2FkL3ZcXCR7UlVOTkVSX1ZFUlNJT059L2FjdGlvbnMtcnVubmVyLWxpbnV4LSR7YXJjaFVybH0tXFwke1JVTk5FUl9WRVJTSU9OfS50YXIuZ3pcImAsXG4gICAgICAgICAgICBgdGFyIC1DIC9ob21lL3J1bm5lciAteHpmIFwiYWN0aW9ucy1ydW5uZXItbGludXgtJHthcmNoVXJsfS1cXCR7UlVOTkVSX1ZFUlNJT059LnRhci5nelwiYCxcbiAgICAgICAgICAgIGBybSBhY3Rpb25zLXJ1bm5lci1saW51eC0ke2FyY2hVcmx9LVxcJHtSVU5ORVJfVkVSU0lPTn0udGFyLmd6YCxcbiAgICAgICAgICAgIGBlY2hvIC1uICR7cnVubmVyVmVyc2lvbi52ZXJzaW9ufSA+IC9ob21lL3J1bm5lci9SVU5ORVJfVkVSU0lPTmAsXG4gICAgICAgICAgXTtcblxuICAgICAgICAgIGlmIChvcy5pcyhPcy5MSU5VWF9VQlVOVFUpKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKCcvaG9tZS9ydW5uZXIvYmluL2luc3RhbGxkZXBlbmRlbmNpZXMuc2gnKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9zLmlzKE9zLkxJTlVYX0FNQVpPTl8yKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCgneXVtIGluc3RhbGwgLXkgb3BlbnNzbC1saWJzIGtyYjUtbGlicyB6bGliIGxpYmljdTYwJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbW1hbmRzO1xuICAgICAgICB9IGVsc2UgaWYgKG9zLmlzKE9zLldJTkRPV1MpKSB7XG4gICAgICAgICAgbGV0IHJ1bm5lckNvbW1hbmRzOiBzdHJpbmdbXTtcbiAgICAgICAgICBpZiAocnVubmVyVmVyc2lvbi5pcyhSdW5uZXJWZXJzaW9uLmxhdGVzdCgpKSkge1xuICAgICAgICAgICAgcnVubmVyQ29tbWFuZHMgPSBbXG4gICAgICAgICAgICAgICdjbWQgL2MgY3VybCAtdyBcIiV7cmVkaXJlY3RfdXJsfVwiIC1mc1MgaHR0cHM6Ly9naXRodWIuY29tL2FjdGlvbnMvcnVubmVyL3JlbGVhc2VzL2xhdGVzdCA+ICRFbnY6VEVNUFxcXFxsYXRlc3QtZ2hhJyxcbiAgICAgICAgICAgICAgJyRMYXRlc3RVcmwgPSBHZXQtQ29udGVudCAkRW52OlRFTVBcXFxcbGF0ZXN0LWdoYScsXG4gICAgICAgICAgICAgICckUlVOTkVSX1ZFUlNJT04gPSAoJExhdGVzdFVybCAtU3BsaXQgXFwnL1xcJylbLTFdLnN1YnN0cmluZygxKScsXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBydW5uZXJDb21tYW5kcyA9IFtgJFJVTk5FUl9WRVJTSU9OID0gJyR7cnVubmVyVmVyc2lvbi52ZXJzaW9ufSdgXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcnVubmVyQ29tbWFuZHMuY29uY2F0KFtcbiAgICAgICAgICAgICdJbnZva2UtV2ViUmVxdWVzdCAtVXNlQmFzaWNQYXJzaW5nIC1VcmkgXCJodHRwczovL2dpdGh1Yi5jb20vYWN0aW9ucy9ydW5uZXIvcmVsZWFzZXMvZG93bmxvYWQvdiR7UlVOTkVSX1ZFUlNJT059L2FjdGlvbnMtcnVubmVyLXdpbi14NjQtJHtSVU5ORVJfVkVSU0lPTn0uemlwXCIgLU91dEZpbGUgYWN0aW9ucy56aXAnLFxuICAgICAgICAgICAgJ0V4cGFuZC1BcmNoaXZlIGFjdGlvbnMuemlwIC1EZXN0aW5hdGlvblBhdGggQzpcXFxcYWN0aW9ucycsXG4gICAgICAgICAgICAnZGVsIGFjdGlvbnMuemlwJyxcbiAgICAgICAgICAgIGBlY2hvICR7cnVubmVyVmVyc2lvbi52ZXJzaW9ufSB8IE91dC1GaWxlIC1FbmNvZGluZyBBU0NJSSAtTm9OZXdsaW5lIEM6XFxcXGFjdGlvbnNcXFxcUlVOTkVSX1ZFUlNJT05gLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG9zL2FyY2hpdGVjdHVyZSBjb21ibyBmb3IgZ2l0aHViIHJ1bm5lcjogJHtvcy5uYW1lfS8ke2FyY2hpdGVjdHVyZS5uYW1lfWApO1xuICAgICAgfVxuXG4gICAgICBnZXREb2NrZXJDb21tYW5kcyhfb3M6IE9zLCBfYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgYEVOViBSVU5ORVJfVkVSU0lPTj0ke3J1bm5lclZlcnNpb24udmVyc2lvbn1gLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNvbXBvbmVudCB0byBpbnN0YWxsIERvY2tlci4gT24gV2luZG93cyB0aGlzIGluc3RhbGxzIERvY2tlciBEZXNrdG9wLlxuICAgKi9cbiAgc3RhdGljIGRvY2tlcigpOiBSdW5uZXJJbWFnZUNvbXBvbmVudCB7XG4gICAgcmV0dXJuIG5ldyBjbGFzcyBleHRlbmRzIFJ1bm5lckltYWdlQ29tcG9uZW50IHtcbiAgICAgIG5hbWUgPSAnRG9ja2VyJztcblxuICAgICAgZ2V0Q29tbWFuZHMob3M6IE9zLCBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZSkge1xuICAgICAgICBpZiAob3MuaXMoT3MuTElOVVhfVUJVTlRVKSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnY3VybCAtZnNTTCBodHRwczovL2Rvd25sb2FkLmRvY2tlci5jb20vbGludXgvdWJ1bnR1L2dwZyB8IHN1ZG8gZ3BnIC0tZGVhcm1vciAtbyAvdXNyL3NoYXJlL2tleXJpbmdzL2RvY2tlci5ncGcnLFxuICAgICAgICAgICAgJ2VjaG8gJyArXG4gICAgICAgICAgICAgICAgJyAgXCJkZWIgW2FyY2g9JChkcGtnIC0tcHJpbnQtYXJjaGl0ZWN0dXJlKSBzaWduZWQtYnk9L3Vzci9zaGFyZS9rZXlyaW5ncy9kb2NrZXIuZ3BnXSBodHRwczovL2Rvd25sb2FkLmRvY2tlci5jb20vbGludXgvdWJ1bnR1ICcgK1xuICAgICAgICAgICAgICAgICcgICQobHNiX3JlbGVhc2UgLWNzKSBzdGFibGVcIiB8IHN1ZG8gdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RvY2tlci5saXN0ID4gL2Rldi9udWxsJyxcbiAgICAgICAgICAgICdhcHQtZ2V0IHVwZGF0ZScsXG4gICAgICAgICAgICAnREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgaW5zdGFsbCAteSBkb2NrZXItY2UgZG9ja2VyLWNlLWNsaSBjb250YWluZXJkLmlvIGRvY2tlci1jb21wb3NlLXBsdWdpbicsXG4gICAgICAgICAgICAndXNlcm1vZCAtYUcgZG9ja2VyIHJ1bm5lcicsXG4gICAgICAgICAgICAnbG4gLXMgL3Vzci9saWJleGVjL2RvY2tlci9jbGktcGx1Z2lucy9kb2NrZXItY29tcG9zZSAvdXNyL2Jpbi9kb2NrZXItY29tcG9zZScsXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIGlmIChvcy5pcyhPcy5MSU5VWF9BTUFaT05fMikpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ3l1bSBpbnN0YWxsIC15IGRvY2tlcicsXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIGlmIChvcy5pcyhPcy5XSU5ET1dTKSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnSW52b2tlLVdlYlJlcXVlc3QgLVVzZUJhc2ljUGFyc2luZyAtVXJpIGh0dHBzOi8vZGVza3RvcC5kb2NrZXIuY29tL3dpbi9tYWluL2FtZDY0L0RvY2tlciUyMERlc2t0b3AlMjBJbnN0YWxsZXIuZXhlIC1PdXRGaWxlIGRvY2tlci1zZXR1cC5leGUnLFxuICAgICAgICAgICAgJ1N0YXJ0LVByb2Nlc3MgXFwnZG9ja2VyLXNldHVwLmV4ZVxcJyAtV2FpdCAtQXJndW1lbnRMaXN0IFxcJy9pbnN0YWxsIC0tcXVpZXQgLS1hY2NlcHQtbGljZW5zZVxcJycsXG4gICAgICAgICAgICAnZGVsIGRvY2tlci1zZXR1cC5leGUnLFxuICAgICAgICAgICAgJ2NtZCAvYyBjdXJsIC13IFwiJXtyZWRpcmVjdF91cmx9XCIgLWZzUyBodHRwczovL2dpdGh1Yi5jb20vZG9ja2VyL2NvbXBvc2UvcmVsZWFzZXMvbGF0ZXN0ID4gJEVudjpURU1QXFxcXGxhdGVzdC1kb2NrZXItY29tcG9zZScsXG4gICAgICAgICAgICAnJExhdGVzdFVybCA9IEdldC1Db250ZW50ICRFbnY6VEVNUFxcXFxsYXRlc3QtZG9ja2VyLWNvbXBvc2UnLFxuICAgICAgICAgICAgJyRMYXRlc3REb2NrZXJDb21wb3NlID0gKCRMYXRlc3RVcmwgLVNwbGl0IFxcJy9cXCcpWy0xXScsXG4gICAgICAgICAgICAnSW52b2tlLVdlYlJlcXVlc3QgLVVzZUJhc2ljUGFyc2luZyAtVXJpICBcImh0dHBzOi8vZ2l0aHViLmNvbS9kb2NrZXIvY29tcG9zZS9yZWxlYXNlcy9kb3dubG9hZC8ke0xhdGVzdERvY2tlckNvbXBvc2V9L2RvY2tlci1jb21wb3NlLVdpbmRvd3MteDg2XzY0LmV4ZVwiIC1PdXRGaWxlICRFbnY6UHJvZ3JhbUZpbGVzXFxcXERvY2tlclxcXFxkb2NrZXItY29tcG9zZS5leGUnLFxuICAgICAgICAgICAgJ2NvcHkgJEVudjpQcm9ncmFtRmlsZXNcXFxcRG9ja2VyXFxcXGRvY2tlci1jb21wb3NlLmV4ZSAkRW52OlByb2dyYW1GaWxlc1xcXFxEb2NrZXJcXFxcY2xpLXBsdWdpbnNcXFxcZG9ja2VyLWNvbXBvc2UuZXhlJyxcbiAgICAgICAgICBdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG9zL2FyY2hpdGVjdHVyZSBjb21ibyBmb3IgZG9ja2VyOiAke29zLm5hbWV9LyR7YXJjaGl0ZWN0dXJlLm5hbWV9YCk7XG4gICAgICB9XG4gICAgfSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgY29tcG9uZW50IHRvIGluc3RhbGwgRG9ja2VyLWluLURvY2tlci5cbiAgICovXG4gIHN0YXRpYyBkb2NrZXJJbkRvY2tlcigpOiBSdW5uZXJJbWFnZUNvbXBvbmVudCB7XG4gICAgcmV0dXJuIG5ldyBjbGFzcyBleHRlbmRzIFJ1bm5lckltYWdlQ29tcG9uZW50IHtcbiAgICAgIG5hbWUgPSAnRG9ja2VyLWluLURvY2tlcic7XG5cbiAgICAgIGdldENvbW1hbmRzKG9zOiBPcywgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUpIHtcbiAgICAgICAgaWYgKG9zLmlzKE9zLkxJTlVYX1VCVU5UVSkgfHwgb3MuaXMoT3MuTElOVVhfQU1BWk9OXzIpKSB7XG4gICAgICAgICAgbGV0IGFyY2hVcmw6IHN0cmluZztcbiAgICAgICAgICBpZiAoYXJjaGl0ZWN0dXJlLmlzKEFyY2hpdGVjdHVyZS5YODZfNjQpKSB7XG4gICAgICAgICAgICBhcmNoVXJsID0gJ3g4Nl82NCc7XG4gICAgICAgICAgfSBlbHNlIGlmIChhcmNoaXRlY3R1cmUuaXMoQXJjaGl0ZWN0dXJlLkFSTTY0KSkge1xuICAgICAgICAgICAgYXJjaFVybCA9ICdhYXJjaDY0JztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgZm9yIERvY2tlci1pbi1Eb2NrZXI6ICR7YXJjaGl0ZWN0dXJlLm5hbWV9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG9zLmlzKE9zLkxJTlVYX1VCVU5UVSkgPyAnREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgaW5zdGFsbCAteSBzb2NhdCcgOiAneXVtIGluc3RhbGwgLXkgc29jYXQnLCAvLyBmb3IgRUNTXG4gICAgICAgICAgICAnRE9DS0VSX0NIQU5ORUw9XCJzdGFibGVcIicsXG4gICAgICAgICAgICAnRElORF9DT01NSVQ9XCI0MmIxMTc1ZWRhMDcxYzBlOTEyMWUxZDY0MzQ1OTI4Mzg0YTkzZGYxXCInLFxuICAgICAgICAgICAgJ0RPQ0tFUl9WRVJTSU9OPVwiMjAuMTAuMThcIicsXG4gICAgICAgICAgICAnRE9DS0VSX0NPTVBPU0VfVkVSU0lPTj1cIjIuMTEuMFwiJyxcbiAgICAgICAgICAgIGBjdXJsIC1mc1NMIFwiaHR0cHM6Ly9kb3dubG9hZC5kb2NrZXIuY29tL2xpbnV4L3N0YXRpYy9cXCR7RE9DS0VSX0NIQU5ORUx9LyR7YXJjaFVybH0vZG9ja2VyLVxcJHtET0NLRVJfVkVSU0lPTn0udGd6XCIgLW8gZG9ja2VyLnRnemAsXG4gICAgICAgICAgICAndGFyIC0tc3RyaXAtY29tcG9uZW50cyAxIC1DIC91c3IvbG9jYWwvYmluLyAteHpmIGRvY2tlci50Z3onLFxuICAgICAgICAgICAgJ3JtIGRvY2tlci50Z3onLFxuICAgICAgICAgICAgJyMgc2V0IHVwIHN1YnVpZC9zdWJnaWQgc28gdGhhdCBcIi0tdXNlcm5zLXJlbWFwPWRlZmF1bHRcIiB3b3JrcyBvdXQtb2YtdGhlIGJveCcsXG4gICAgICAgICAgICAnYWRkZ3JvdXAgZG9ja3JlbWFwJyxcbiAgICAgICAgICAgICd1c2VyYWRkIC1nIGRvY2tyZW1hcCBkb2NrcmVtYXAnLFxuICAgICAgICAgICAgJ2VjaG8gXFwnZG9ja3JlbWFwOjE2NTUzNjo2NTUzNlxcJyA+PiAvZXRjL3N1YnVpZCcsXG4gICAgICAgICAgICAnZWNobyBcXCdkb2NrcmVtYXA6MTY1NTM2OjY1NTM2XFwnID4+IC9ldGMvc3ViZ2lkJyxcbiAgICAgICAgICAgICdjdXJsIC1mc1NMIFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2RvY2tlci9kb2NrZXIvJHtESU5EX0NPTU1JVH0vaGFjay9kaW5kXCIgLW8gL3Vzci9sb2NhbC9iaW4vZGluZCcsXG4gICAgICAgICAgICBgY3VybCAtZnNTTCBodHRwczovL2dpdGh1Yi5jb20vZG9ja2VyL2NvbXBvc2UvcmVsZWFzZXMvZG93bmxvYWQvdlxcJHtET0NLRVJfQ09NUE9TRV9WRVJTSU9OfS9kb2NrZXItY29tcG9zZS1saW51eC0ke2FyY2hVcmx9IC1vIC91c3IvbG9jYWwvYmluL2RvY2tlci1jb21wb3NlYCxcbiAgICAgICAgICAgICdta2RpciAtcCAvaG9tZS9ydW5uZXIvLmRvY2tlci9jbGktcGx1Z2lucyAmJiBsbiAtcyAvdXNyL2xvY2FsL2Jpbi9kb2NrZXItY29tcG9zZSAvaG9tZS9ydW5uZXIvLmRvY2tlci9jbGktcGx1Z2lucy9kb2NrZXItY29tcG9zZScsXG4gICAgICAgICAgICAnY2hvd24gLVIgcnVubmVyIC9ob21lL3J1bm5lci8uZG9ja2VyJyxcbiAgICAgICAgICAgICdjaG1vZCAreCAvdXNyL2xvY2FsL2Jpbi9kaW5kIC91c3IvbG9jYWwvYmluL2RvY2tlci1jb21wb3NlJyxcbiAgICAgICAgICAgICdhZGRncm91cCBkb2NrZXIgJiYgdXNlcm1vZCAtYUcgZG9ja2VyIHJ1bm5lcicsXG4gICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBvcy9hcmNoaXRlY3R1cmUgY29tYm8gZm9yIERvY2tlci1pbi1Eb2NrZXI6ICR7b3MubmFtZX0vJHthcmNoaXRlY3R1cmUubmFtZX1gKTtcbiAgICAgIH1cbiAgICB9KCk7XG4gIH1cblxuICAvKipcbiAgICogQSBjb21wb25lbnQgdG8gYWRkIGEgdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkuIFRoaXMgY2FuIGJlIHVzZWQgdG8gc3VwcG9ydCBHaXRIdWIgRW50ZXJwcmlzZSBTZXJ2ZXIgd2l0aCBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZS5cbiAgICpcbiAgICogQHBhcmFtIHNvdXJjZSBwYXRoIHRvIGNlcnRpZmljYXRlIGZpbGUgaW4gUEVNIGZvcm1hdFxuICAgKiBAcGFyYW0gbmFtZSB1bmlxdWUgY2VydGlmaWNhdGUgbmFtZSB0byBiZSB1c2VkIG9uIHJ1bm5lciBmaWxlIHN5c3RlbVxuICAgKi9cbiAgc3RhdGljIGV4dHJhQ2VydGlmaWNhdGVzKHNvdXJjZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBSdW5uZXJJbWFnZUNvbXBvbmVudCB7XG4gICAgcmV0dXJuIG5ldyBjbGFzcyBleHRlbmRzIFJ1bm5lckltYWdlQ29tcG9uZW50IHtcbiAgICAgIG5hbWUgPSBgRXh0cmEtQ2VydGlmaWNhdGVzLSR7bmFtZX1gO1xuXG4gICAgICBnZXRDb21tYW5kcyhvczogT3MsIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlKSB7XG4gICAgICAgIGlmICghbmFtZS5tYXRjaCgvXlthLXpBLVowLTlfLV0rJC8pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNlcnRpZmljYXRlIG5hbWU6ICR7bmFtZX0uIE5hbWUgbXVzdCBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGRhc2hlcyBhbmQgdW5kZXJzY29yZXMuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3MuaXMoT3MuTElOVVhfVUJVTlRVKSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAndXBkYXRlLWNhLWNlcnRpZmljYXRlcycsXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIGlmIChvcy5pcyhPcy5MSU5VWF9BTUFaT05fMikpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ3VwZGF0ZS1jYS10cnVzdCcsXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIGlmIChvcy5pcyhPcy5XSU5ET1dTKSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBgSW1wb3J0LUNlcnRpZmljYXRlIC1GaWxlUGF0aCBDOlxcXFwke25hbWV9LmNydCAtQ2VydFN0b3JlTG9jYXRpb24gQ2VydDpcXFxcTG9jYWxNYWNoaW5lXFxcXFJvb3RgLFxuICAgICAgICAgICAgYFJlbW92ZS1JdGVtIEM6XFxcXCR7bmFtZX0uY3J0YCxcbiAgICAgICAgICBdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG9zL2FyY2hpdGVjdHVyZSBjb21ibyBmb3IgZXh0cmEgY2VydGlmaWNhdGVzOiAke29zLm5hbWV9LyR7YXJjaGl0ZWN0dXJlLm5hbWV9YCk7XG4gICAgICB9XG5cbiAgICAgIGdldEFzc2V0cyhvczogT3MsIF9hcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZSk6IFJ1bm5lckltYWdlQXNzZXRbXSB7XG4gICAgICAgIGlmIChvcy5pcyhPcy5MSU5VWF9VQlVOVFUpKSB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHsgc291cmNlLCB0YXJnZXQ6IGAvdXNyL2xvY2FsL3NoYXJlL2NhLWNlcnRpZmljYXRlcy8ke25hbWV9LmNydGAgfSxcbiAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2UgaWYgKG9zLmlzKE9zLkxJTlVYX0FNQVpPTl8yKSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7IHNvdXJjZSwgdGFyZ2V0OiBgL2V0Yy9wa2kvY2EtdHJ1c3Qvc291cmNlL2FuY2hvcnMvJHtuYW1lfS5jcnRgIH0sXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIGlmIChvcy5pcyhPcy5XSU5ET1dTKSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7IHNvdXJjZSwgdGFyZ2V0OiBgQzpcXFxcJHtuYW1lfS5jcnRgIH0sXG4gICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgT1MgZm9yIGV4dHJhIGNlcnRpZmljYXRlczogJHtvcy5uYW1lfWApO1xuICAgICAgfVxuICAgIH0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNvbXBvbmVudCB0byBzZXQgdXAgdGhlIHJlcXVpcmVkIExhbWJkYSBlbnRyeXBvaW50IGZvciBMYW1iZGEgcnVubmVycy5cbiAgICovXG4gIHN0YXRpYyBsYW1iZGFFbnRyeXBvaW50KCk6IFJ1bm5lckltYWdlQ29tcG9uZW50IHtcbiAgICByZXR1cm4gbmV3IGNsYXNzIGV4dGVuZHMgUnVubmVySW1hZ2VDb21wb25lbnQge1xuICAgICAgbmFtZSA9ICdMYW1iZGEtRW50cnlwb2ludCc7XG5cbiAgICAgIGdldENvbW1hbmRzKG9zOiBPcywgX2FyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlKSB7XG4gICAgICAgIGlmICghb3MuaXMoT3MuTElOVVhfQU1BWk9OXzIpICYmICFvcy5pcyhPcy5MSU5VWF9VQlVOVFUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBPUyBmb3IgTGFtYmRhIGVudHJ5cG9pbnQ6ICR7b3MubmFtZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgZ2V0QXNzZXRzKF9vczogT3MsIF9hcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZSk6IFJ1bm5lckltYWdlQXNzZXRbXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc291cmNlOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnZG9ja2VyLWltYWdlcycsICdsYW1iZGEnLCAnbGludXgteDY0JywgJ3J1bm5lci5qcycpLFxuICAgICAgICAgICAgdGFyZ2V0OiAnJHtMQU1CREFfVEFTS19ST09UfS9ydW5uZXIuanMnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgc291cmNlOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnZG9ja2VyLWltYWdlcycsICdsYW1iZGEnLCAnbGludXgteDY0JywgJ3J1bm5lci5zaCcpLFxuICAgICAgICAgICAgdGFyZ2V0OiAnJHtMQU1CREFfVEFTS19ST09UfS9ydW5uZXIuc2gnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9XG5cbiAgICAgIGdldERvY2tlckNvbW1hbmRzKF9vczogT3MsIF9hcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZSk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAnV09SS0RJUiAke0xBTUJEQV9UQVNLX1JPT1R9JyxcbiAgICAgICAgICAnQ01EIFtcInJ1bm5lci5oYW5kbGVyXCJdJyxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lLlxuICAgKlxuICAgKiBVc2VkIHRvIGlkZW50aWZ5IGNvbXBvbmVudCBpbiBpbWFnZSBidWlsZCBsb2dzLCBhbmQgZm9yIHtAbGluayBSdW5uZXJJbWFnZUJ1aWxkZXIucmVtb3ZlQ29tcG9uZW50fVxuICAgKi9cbiAgYWJzdHJhY3QgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGNvbW1hbmRzIHRvIHJ1biB0byBpbiBidWlsdCBpbWFnZS4gQ2FuIGJlIHVzZWQgdG8gaW5zdGFsbCBwYWNrYWdlcywgc2V0dXAgYnVpbGQgcHJlcmVxdWlzaXRlcywgZXRjLlxuICAgKi9cbiAgYWJzdHJhY3QgZ2V0Q29tbWFuZHMoX29zOiBPcywgX2FyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYXNzZXRzIHRvIGNvcHkgaW50byB0aGUgYnVpbHQgaW1hZ2UuIENhbiBiZSB1c2VkIHRvIGNvcHkgZmlsZXMgaW50byB0aGUgaW1hZ2UuXG4gICAqL1xuICBnZXRBc3NldHMoX29zOiBPcywgX2FyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlKTogUnVubmVySW1hZ2VBc3NldFtdIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBEb2NrZXIgY29tbWFuZHMgdG8gcnVuIHRvIGluIGJ1aWx0IGltYWdlLiBDYW4gYmUgdXNlZCB0byBhZGQgY29tbWFuZHMgbGlrZSBgVk9MVU1FYCwgYEVOVFJZUE9JTlRgLCBgQ01EYCwgZXRjLlxuICAgKlxuICAgKiBEb2NrZXIgY29tbWFuZHMgYXJlIGFkZGVkIGFmdGVyIGFzc2V0cyBhbmQgbm9ybWFsIGNvbW1hbmRzLlxuICAgKi9cbiAgZ2V0RG9ja2VyQ29tbWFuZHMoX29zOiBPcywgX2FyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGNvbXBvbmVudCB0byBhbiBBV1MgSW1hZ2UgQnVpbGRlciBjb21wb25lbnQuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2FzQXdzSW1hZ2VCdWlsZGVyQ29tcG9uZW50KHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIG9zOiBPcywgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUpIHtcbiAgICBsZXQgcGxhdGZvcm06ICdMaW51eCcgfCAnV2luZG93cyc7XG4gICAgaWYgKG9zLmlzKE9zLkxJTlVYX1VCVU5UVSkgfHwgb3MuaXMoT3MuTElOVVhfQU1BWk9OXzIpKSB7XG4gICAgICBwbGF0Zm9ybSA9ICdMaW51eCc7XG4gICAgfSBlbHNlIGlmIChvcy5pcyhPcy5XSU5ET1dTKSkge1xuICAgICAgcGxhdGZvcm0gPSAnV2luZG93cyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBvcy9hcmNoaXRlY3R1cmUgY29tYm8gZm9yIGltYWdlIGJ1aWxkZXIgY29tcG9uZW50OiAke29zLm5hbWV9LyR7YXJjaGl0ZWN0dXJlLm5hbWV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbWFnZUJ1aWxkZXJDb21wb25lbnQoc2NvcGUsIGlkLCB7XG4gICAgICBwbGF0Zm9ybTogcGxhdGZvcm0sXG4gICAgICBjb21tYW5kczogdGhpcy5nZXRDb21tYW5kcyhvcywgYXJjaGl0ZWN0dXJlKSxcbiAgICAgIGFzc2V0czogdGhpcy5nZXRBc3NldHMob3MsIGFyY2hpdGVjdHVyZSkubWFwKChhc3NldCwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhc3NldDogbmV3IHMzX2Fzc2V0cy5Bc3NldChzY29wZSwgYCR7aWR9IGFzc2V0ICR7aW5kZXh9YCwgeyBwYXRoOiBhc3NldC5zb3VyY2UgfSksXG4gICAgICAgICAgcGF0aDogYXNzZXQudGFyZ2V0LFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgICBkaXNwbGF5TmFtZTogaWQsXG4gICAgICBkZXNjcmlwdGlvbjogaWQsXG4gICAgfSk7XG4gIH1cbn1cblxuIl19