@pipeline-builder/pipeline-manager 4.1.14 → 4.1.16
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/config.yml +16 -37
- package/dist/boilerplate.js +10 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +97 -79
- package/dist/commands/audit-stacks.js +3 -3
- package/dist/commands/create-pat.d.ts +2 -3
- package/dist/commands/create-pat.d.ts.map +1 -1
- package/dist/commands/create-pat.js +3 -4
- package/dist/commands/create-pipeline.d.ts.map +1 -1
- package/dist/commands/create-pipeline.js +198 -190
- package/dist/commands/list-pipelines.js +2 -2
- package/dist/commands/list-plugins.js +2 -2
- package/dist/commands/login.d.ts +2 -2
- package/dist/commands/login.js +3 -3
- package/dist/commands/new-plugin.d.ts +48 -5
- package/dist/commands/new-plugin.d.ts.map +1 -1
- package/dist/commands/new-plugin.js +261 -95
- package/dist/commands/plugin-lifecycle.d.ts +29 -0
- package/dist/commands/plugin-lifecycle.d.ts.map +1 -0
- package/dist/commands/plugin-lifecycle.js +147 -0
- package/dist/commands/provision.d.ts +42 -2
- package/dist/commands/provision.d.ts.map +1 -1
- package/dist/commands/provision.js +184 -147
- package/dist/commands/publish-plugin.d.ts +62 -0
- package/dist/commands/publish-plugin.d.ts.map +1 -0
- package/dist/commands/publish-plugin.js +224 -0
- package/dist/commands/redrive-events.d.ts +1 -1
- package/dist/commands/redrive-events.js +2 -2
- package/dist/commands/store-token.d.ts +46 -1
- package/dist/commands/store-token.d.ts.map +1 -1
- package/dist/commands/store-token.js +127 -102
- package/dist/commands/test-plugin.d.ts +72 -0
- package/dist/commands/test-plugin.d.ts.map +1 -0
- package/dist/commands/test-plugin.js +285 -0
- package/dist/commands/upload-plugin.d.ts +6 -7
- package/dist/commands/upload-plugin.d.ts.map +1 -1
- package/dist/commands/upload-plugin.js +127 -189
- package/dist/commands/validate-plugin.d.ts +37 -4
- package/dist/commands/validate-plugin.d.ts.map +1 -1
- package/dist/commands/validate-plugin.js +129 -144
- package/dist/commands/validate-templates.d.ts.map +1 -1
- package/dist/commands/validate-templates.js +8 -9
- package/dist/config/plugin-catalog-assets.d.ts +13 -0
- package/dist/config/plugin-catalog-assets.d.ts.map +1 -0
- package/dist/config/plugin-catalog-assets.js +21 -0
- package/dist/config.yml +16 -37
- package/dist/lambda/token-renew-handler.d.ts.map +1 -1
- package/dist/lambda/token-renew-handler.js +109 -154
- package/dist/types/config.d.ts +2 -6
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +1 -1
- package/dist/types/plugin.d.ts +21 -0
- package/dist/types/plugin.d.ts.map +1 -1
- package/dist/types/plugin.js +1 -1
- package/dist/utils/aws-env.d.ts +1 -2
- package/dist/utils/aws-env.d.ts.map +1 -1
- package/dist/utils/aws-env.js +2 -3
- package/dist/utils/catalog-prompt.d.ts +26 -0
- package/dist/utils/catalog-prompt.d.ts.map +1 -0
- package/dist/utils/catalog-prompt.js +113 -0
- package/dist/utils/command-utils.d.ts.map +1 -1
- package/dist/utils/command-utils.js +14 -3
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +4 -6
- package/dist/utils/credential-store.d.ts +16 -0
- package/dist/utils/credential-store.d.ts.map +1 -1
- package/dist/utils/credential-store.js +57 -2
- package/dist/utils/deploy-runner.d.ts.map +1 -1
- package/dist/utils/deploy-runner.js +7 -2
- package/dist/utils/pipeline-config.d.ts +1 -2
- package/dist/utils/pipeline-config.d.ts.map +1 -1
- package/dist/utils/pipeline-config.js +1 -1
- package/dist/utils/plugin-docker.d.ts +44 -0
- package/dist/utils/plugin-docker.d.ts.map +1 -0
- package/dist/utils/plugin-docker.js +71 -0
- package/dist/utils/plugin-package.d.ts +40 -0
- package/dist/utils/plugin-package.d.ts.map +1 -0
- package/dist/utils/plugin-package.js +159 -0
- package/dist/utils/plugin-resolver.d.ts.map +1 -1
- package/dist/utils/plugin-resolver.js +43 -29
- package/dist/utils/plugin-scan.d.ts +22 -0
- package/dist/utils/plugin-scan.d.ts.map +1 -0
- package/dist/utils/plugin-scan.js +52 -0
- package/dist/utils/plugin-zip.d.ts +15 -0
- package/dist/utils/plugin-zip.d.ts.map +1 -0
- package/dist/utils/plugin-zip.js +96 -0
- package/dist/utils/registry.d.ts +15 -0
- package/dist/utils/registry.d.ts.map +1 -1
- package/dist/utils/registry.js +17 -2
- package/dist/utils/service-account.d.ts.map +1 -1
- package/dist/utils/service-account.js +9 -10
- package/package.json +45 -8
|
@@ -30,7 +30,7 @@ const DEFAULT_RENEW_CRON = '0 0 * * *';
|
|
|
30
30
|
*
|
|
31
31
|
* A scoped key exchanges to a token with no permissions and no admin flags at
|
|
32
32
|
* all — only the one capability — so it is the shape every automation that does
|
|
33
|
-
* exactly one thing should hold
|
|
33
|
+
* exactly one thing should hold. The unscoped `platform` credential is the
|
|
34
34
|
* remaining full-privilege one: synth/deploy callbacks and the plugin-lookup
|
|
35
35
|
* Lambda call the ordinary API surface, which no single scope covers.
|
|
36
36
|
*/
|
|
@@ -86,7 +86,7 @@ async function deployRenewSchedule(opts) {
|
|
|
86
86
|
`RenewDays=${opts.days}`,
|
|
87
87
|
`ScheduleExpression=${scheduleExpression}`,
|
|
88
88
|
`NameSuffix=${nameSuffix}`,
|
|
89
|
-
// Recorded for provenance only — the rotator
|
|
89
|
+
// Recorded for provenance only — the rotator does not install the CLI at
|
|
90
90
|
// runtime (it speaks to the platform directly), but knowing which CLI
|
|
91
91
|
// deployed a stack is worth keeping.
|
|
92
92
|
`PipelineManagerVersion=${APP_VERSION}`,
|
|
@@ -133,13 +133,122 @@ async function previousKeyId(secretName, aws) {
|
|
|
133
133
|
return {};
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
|
+
/** Print the dry-run plan (JSON or human). Stays entirely offline. */
|
|
137
|
+
export function printDryRunPlan(plan, json) {
|
|
138
|
+
if (json) {
|
|
139
|
+
console.log(JSON.stringify({ success: true, dryRun: true, ...plan }, null, 2));
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
console.log('');
|
|
143
|
+
printSection('Dry Run — No Changes Made');
|
|
144
|
+
printKeyValue({
|
|
145
|
+
'Service Account': plan.serviceAccount,
|
|
146
|
+
'Roles': plan.roles,
|
|
147
|
+
'Key Scope': plan.scope,
|
|
148
|
+
'Secret Name': plan.secretName,
|
|
149
|
+
'Region': plan.region,
|
|
150
|
+
'Expires In': `${plan.expiresInDays} days`,
|
|
151
|
+
});
|
|
152
|
+
printSuccess('Dry run complete — no account, key or secret was created');
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* The Secrets Manager payload: `{ username: orgId, password: <pb_sa_ key>, ...metadata }`.
|
|
156
|
+
* - username/password satisfy CodeBuild's `secretsManagerCredentials` (HTTP
|
|
157
|
+
* Basic, sent to pipeline-image-registry's /token endpoint, which exchanges
|
|
158
|
+
* the opaque key like every other service does).
|
|
159
|
+
* - `password` is the canonical field: the plugin-lookup Lambda, the events
|
|
160
|
+
* Lambda and `--store-tokens` all read it.
|
|
161
|
+
* - keyId / serviceAccountId are what the rotation Lambda needs to retire the
|
|
162
|
+
* key it replaces.
|
|
163
|
+
*/
|
|
164
|
+
export function buildSecretValue(provisioned, platformUrl, expiresInSeconds) {
|
|
165
|
+
return JSON.stringify({
|
|
166
|
+
username: provisioned.organizationId,
|
|
167
|
+
password: provisioned.key,
|
|
168
|
+
platformUrl,
|
|
169
|
+
organizationId: provisioned.organizationId,
|
|
170
|
+
serviceAccountId: provisioned.serviceAccountId,
|
|
171
|
+
serviceAccountName: provisioned.serviceAccountName,
|
|
172
|
+
keyId: provisioned.keyId,
|
|
173
|
+
scope: provisioned.scope,
|
|
174
|
+
expiresIn: expiresInSeconds,
|
|
175
|
+
expiresAt: provisioned.expiresAt,
|
|
176
|
+
createdAt: new Date().toISOString(),
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Retire the credential this run replaced — AFTER the new one is stored, never
|
|
181
|
+
* before. A failure here leaves a superfluous key that expires on its own;
|
|
182
|
+
* doing it in the other order would leave the secret naming a revoked key if
|
|
183
|
+
* the write failed.
|
|
184
|
+
*/
|
|
185
|
+
export async function retirePreviousKey(client, password, provisioned, previous) {
|
|
186
|
+
if (!previous.keyId || previous.serviceAccountId !== provisioned.serviceAccountId)
|
|
187
|
+
return;
|
|
188
|
+
try {
|
|
189
|
+
await revokeServiceAccountKey(client, password, provisioned.organizationId, provisioned.serviceAccountId, previous.keyId);
|
|
190
|
+
printSuccess(`Retired the previous key (${previous.keyId})`);
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
printWarning(`Stored the new key, but could not revoke the previous one (${previous.keyId}): `
|
|
194
|
+
+ `${errorMessage(err)}. It expires on its own; revoke it from `
|
|
195
|
+
+ 'Settings → Service accounts if you want it gone now.');
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/** Print the stored key's summary (JSON or human) plus the next steps. */
|
|
199
|
+
export function printStoredKey(r) {
|
|
200
|
+
const { secretName, arn, region, accountName, provisioned, days, scheduleExpression } = r;
|
|
201
|
+
if (r.json) {
|
|
202
|
+
console.log(JSON.stringify({
|
|
203
|
+
success: true,
|
|
204
|
+
secretName,
|
|
205
|
+
secretArn: arn,
|
|
206
|
+
region,
|
|
207
|
+
serviceAccount: accountName,
|
|
208
|
+
serviceAccountId: provisioned.serviceAccountId,
|
|
209
|
+
keyId: provisioned.keyId,
|
|
210
|
+
scope: provisioned.scope,
|
|
211
|
+
expiresInDays: days,
|
|
212
|
+
expiresAt: provisioned.expiresAt,
|
|
213
|
+
schedule: scheduleExpression ?? null,
|
|
214
|
+
}, null, 2));
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
console.log('');
|
|
218
|
+
printSection('Key Stored');
|
|
219
|
+
printKeyValue({
|
|
220
|
+
'Secret Name': secretName,
|
|
221
|
+
'Secret ARN': arn,
|
|
222
|
+
'Region': region,
|
|
223
|
+
'Service Account': accountName,
|
|
224
|
+
'Key Scope': provisioned.scope ?? '(none — full platform credential)',
|
|
225
|
+
'Key Id': provisioned.keyId,
|
|
226
|
+
'Expires In': `${days} days`,
|
|
227
|
+
'Renew By': provisioned.expiresAt,
|
|
228
|
+
'Auto-Rotate': scheduleExpression ? `✓ ${scheduleExpression}` : 'off (pass --schedule to enable)',
|
|
229
|
+
'Status': '✓ Stored',
|
|
230
|
+
});
|
|
231
|
+
console.log('');
|
|
232
|
+
printSuccess('Key stored. To use with synth/deploy:');
|
|
233
|
+
printInfo(` export PLATFORM_SECRET_NAME=${secretName}`);
|
|
234
|
+
printInfo(' pipeline-manager pipeline synth --id <pipeline-id> --store-tokens');
|
|
235
|
+
console.log('');
|
|
236
|
+
if (scheduleExpression) {
|
|
237
|
+
printInfo(`Auto-rotation is active (${scheduleExpression}); the secret is replaced before ${provisioned.expiresAt}.`);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
printInfo(`Rotate before ${provisioned.expiresAt} with: pipeline-manager infra store-token --days ${days}`);
|
|
241
|
+
printInfo(' (or pass --schedule to install a daily auto-rotation stack)');
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
136
245
|
/**
|
|
137
246
|
* Registers the `store-token` command with the CLI program.
|
|
138
247
|
*
|
|
139
248
|
* Provisions the org's machine identity — a SERVICE ACCOUNT and one `pb_sa_…`
|
|
140
249
|
* key — and stores the key in AWS Secrets Manager for CDK deployments,
|
|
141
250
|
* CodeBuild's registry credentials, the plugin-lookup Lambda and the event
|
|
142
|
-
* ingestion Lambda
|
|
251
|
+
* ingestion Lambda. Nothing stored is tied to a person's session any
|
|
143
252
|
* more: the account outlives its creator, takes no seat, and every audit row it
|
|
144
253
|
* produces names the account.
|
|
145
254
|
*
|
|
@@ -210,30 +319,14 @@ export function storeToken(program) {
|
|
|
210
319
|
if (options.dryRun) {
|
|
211
320
|
// Dry run stays entirely OFFLINE — it must not create an account or
|
|
212
321
|
// burn a key just to show what it would do.
|
|
213
|
-
|
|
322
|
+
printDryRunPlan({
|
|
214
323
|
serviceAccount: accountName,
|
|
215
324
|
roles: scope ? 'none (scoped, least privilege)' : 'org admin',
|
|
216
325
|
scope: scope ?? '(none — full platform credential)',
|
|
217
326
|
secretName: process.env.PLATFORM_SECRET_NAME || `${secretNameForOrg('<orgId>', scope ? scopeSecretLeaf(scope) : 'platform')}`,
|
|
218
327
|
region,
|
|
219
328
|
expiresInDays: days,
|
|
220
|
-
};
|
|
221
|
-
if (options.json) {
|
|
222
|
-
console.log(JSON.stringify({ success: true, dryRun: true, ...plan }, null, 2));
|
|
223
|
-
}
|
|
224
|
-
else {
|
|
225
|
-
console.log('');
|
|
226
|
-
printSection('Dry Run — No Changes Made');
|
|
227
|
-
printKeyValue({
|
|
228
|
-
'Service Account': plan.serviceAccount,
|
|
229
|
-
'Roles': plan.roles,
|
|
230
|
-
'Key Scope': plan.scope,
|
|
231
|
-
'Secret Name': plan.secretName,
|
|
232
|
-
'Region': plan.region,
|
|
233
|
-
'Expires In': `${days} days`,
|
|
234
|
-
});
|
|
235
|
-
printSuccess('Dry run complete — no account, key or secret was created');
|
|
236
|
-
}
|
|
329
|
+
}, !!options.json);
|
|
237
330
|
return;
|
|
238
331
|
}
|
|
239
332
|
const keyName = `${accountName}-${new Date().toISOString().slice(0, 10)}`;
|
|
@@ -273,47 +366,12 @@ export function storeToken(program) {
|
|
|
273
366
|
// What this run is REPLACING, read before the write so the old key can be
|
|
274
367
|
// retired after the new one is safely stored.
|
|
275
368
|
const previous = await previousKeyId(secretName, aws);
|
|
276
|
-
|
|
277
|
-
// - username/password satisfy CodeBuild's `secretsManagerCredentials`
|
|
278
|
-
// (HTTP Basic, sent to pipeline-image-registry's /token endpoint, which
|
|
279
|
-
// exchanges the opaque key like every other service does)
|
|
280
|
-
// - `password` stays the canonical field: the plugin-lookup Lambda, the
|
|
281
|
-
// events Lambda and `--store-tokens` all read it. Only its VALUE changed,
|
|
282
|
-
// from a machine-session JWT to an opaque service-account key.
|
|
283
|
-
// - keyId / serviceAccountId are what the rotation Lambda needs to retire
|
|
284
|
-
// the key it replaces.
|
|
285
|
-
const secretValue = JSON.stringify({
|
|
286
|
-
username: provisioned.organizationId,
|
|
287
|
-
password: provisioned.key,
|
|
288
|
-
platformUrl: client.getBaseUrl(),
|
|
289
|
-
organizationId: provisioned.organizationId,
|
|
290
|
-
serviceAccountId: provisioned.serviceAccountId,
|
|
291
|
-
serviceAccountName: provisioned.serviceAccountName,
|
|
292
|
-
keyId: provisioned.keyId,
|
|
293
|
-
scope: provisioned.scope,
|
|
294
|
-
expiresIn: expiresInSeconds,
|
|
295
|
-
expiresAt: provisioned.expiresAt,
|
|
296
|
-
createdAt: new Date().toISOString(),
|
|
297
|
-
});
|
|
369
|
+
const secretValue = buildSecretValue(provisioned, client.getBaseUrl(), expiresInSeconds);
|
|
298
370
|
printSection('Store Key');
|
|
299
371
|
const description = `Pipeline Builder service-account key (${accountName}; renew by ${provisioned.expiresAt})`;
|
|
300
372
|
await upsertSecret(secretName, secretValue, description, aws);
|
|
301
373
|
const arn = await getSecretArn(secretName, aws);
|
|
302
|
-
|
|
303
|
-
// never before. A failure here leaves a superfluous key that expires on
|
|
304
|
-
// its own; doing it in the other order would leave the secret naming a
|
|
305
|
-
// revoked key if the write failed.
|
|
306
|
-
if (previous.keyId && previous.serviceAccountId === provisioned.serviceAccountId) {
|
|
307
|
-
try {
|
|
308
|
-
await revokeServiceAccountKey(client, password, provisioned.organizationId, provisioned.serviceAccountId, previous.keyId);
|
|
309
|
-
printSuccess(`Retired the previous key (${previous.keyId})`);
|
|
310
|
-
}
|
|
311
|
-
catch (err) {
|
|
312
|
-
printWarning(`Stored the new key, but could not revoke the previous one (${previous.keyId}): `
|
|
313
|
-
+ `${errorMessage(err)}. It expires on its own; revoke it from `
|
|
314
|
-
+ 'Settings → Service accounts if you want it gone now.');
|
|
315
|
-
}
|
|
316
|
-
}
|
|
374
|
+
await retirePreviousKey(client, password, provisioned, previous);
|
|
317
375
|
// Optionally install the once-a-day rotation stack so this key never lapses.
|
|
318
376
|
let scheduleExpression;
|
|
319
377
|
if (options.schedule) {
|
|
@@ -326,49 +384,16 @@ export function storeToken(program) {
|
|
|
326
384
|
profile: options.profile,
|
|
327
385
|
});
|
|
328
386
|
}
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
expiresInDays: days,
|
|
340
|
-
expiresAt: provisioned.expiresAt,
|
|
341
|
-
schedule: scheduleExpression ?? null,
|
|
342
|
-
}, null, 2));
|
|
343
|
-
}
|
|
344
|
-
else {
|
|
345
|
-
console.log('');
|
|
346
|
-
printSection('Key Stored');
|
|
347
|
-
printKeyValue({
|
|
348
|
-
'Secret Name': secretName,
|
|
349
|
-
'Secret ARN': arn,
|
|
350
|
-
'Region': region,
|
|
351
|
-
'Service Account': accountName,
|
|
352
|
-
'Key Scope': provisioned.scope ?? '(none — full platform credential)',
|
|
353
|
-
'Key Id': provisioned.keyId,
|
|
354
|
-
'Expires In': `${days} days`,
|
|
355
|
-
'Renew By': provisioned.expiresAt,
|
|
356
|
-
'Auto-Rotate': scheduleExpression ? `✓ ${scheduleExpression}` : 'off (pass --schedule to enable)',
|
|
357
|
-
'Status': '✓ Stored',
|
|
358
|
-
});
|
|
359
|
-
console.log('');
|
|
360
|
-
printSuccess('Key stored. To use with synth/deploy:');
|
|
361
|
-
printInfo(` export PLATFORM_SECRET_NAME=${secretName}`);
|
|
362
|
-
printInfo(' pipeline-manager pipeline synth --id <pipeline-id> --store-tokens');
|
|
363
|
-
console.log('');
|
|
364
|
-
if (scheduleExpression) {
|
|
365
|
-
printInfo(`Auto-rotation is active (${scheduleExpression}); the secret is replaced before ${provisioned.expiresAt}.`);
|
|
366
|
-
}
|
|
367
|
-
else {
|
|
368
|
-
printInfo(`Rotate before ${provisioned.expiresAt} with: pipeline-manager infra store-token --days ${days}`);
|
|
369
|
-
printInfo(' (or pass --schedule to install a daily auto-rotation stack)');
|
|
370
|
-
}
|
|
371
|
-
}
|
|
387
|
+
printStoredKey({
|
|
388
|
+
json: !!options.json,
|
|
389
|
+
secretName,
|
|
390
|
+
arn,
|
|
391
|
+
region,
|
|
392
|
+
accountName,
|
|
393
|
+
provisioned,
|
|
394
|
+
days,
|
|
395
|
+
scheduleExpression,
|
|
396
|
+
});
|
|
372
397
|
}
|
|
373
398
|
catch (error) {
|
|
374
399
|
handleError(error, ERROR_CODES.API_REQUEST, {
|
|
@@ -383,4 +408,4 @@ export function storeToken(program) {
|
|
|
383
408
|
}
|
|
384
409
|
});
|
|
385
410
|
}
|
|
386
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtdG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvc3RvcmUtdG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxZQUFZLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRixPQUFPLEVBQUUsOEJBQThCLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JLLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFB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QUFDLHFFQUFxRSxDQUFDLENBQUM7Z0JBQ2pGLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2hCLElBQUksa0JBQWtCLEVBQUUsQ0FBQztvQkFDdkIsU0FBUyxDQUFDLDRCQUE0QixrQkFBa0Isb0NBQW9DLFdBQVcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO2dCQUN4SCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sU0FBUyxDQUFDLGlCQUFpQixXQUFXLENBQUMsU0FBUyxvREFBb0QsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDNUcsU0FBUyxDQUFDLCtEQUErRCxDQUFDLENBQUM7Z0JBQzdFLENBQUM7WUFDSCxDQUFDO1FBRUgsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixXQUFXLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxXQUFXLEVBQUU7Z0JBQzFDLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSztnQkFDM0IsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsT0FBTyxFQUFFO29CQUNQLE9BQU8sRUFBRSxhQUFhO29CQUN0QixXQUFXO29CQUNYLFVBQVUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixJQUFJLHdCQUF3QjtpQkFDekU7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGV4ZWNGaWxlU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgTGFtYmRhQ2xpZW50LCBVcGRhdGVGdW5jdGlvbkNvZGVDb21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWxhbWJkYSc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IEFQUF9WRVJTSU9OLCB2YWxpZGF0ZU51bWJlciB9IGZyb20gJy4uL2NvbmZpZy9jbGkuY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGF1ZGl0TG9nIH0gZnJvbSAnLi4vdXRpbHMvYXVkaXQtbG9nLmpzJztcbmltcG9ydCB7IHJlc29sdmVBd3NSZWdpb24gfSBmcm9tICcuLi91dGlscy9hd3MtZW52LmpzJztcbmltcG9ydCB7IHVwc2VydFNlY3JldCwgZ2V0U2VjcmV0QXJuLCBnZXRTZWNyZXRWYWx1ZSB9IGZyb20gJy4uL3V0aWxzL2F3cy1zZWNyZXRzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnRBc3luYywgcHJpbnRDb21tYW5kSGVhZGVyLCBwcmludFNzbFdhcm5pbmcsIHdpdGhQcm9maWxlT3B0aW9uLCB3aXRoUmVnaW9uT3B0aW9uLCB3aXRoU3NsT3B0aW9ucyB9IGZyb20gJy4uL3V0aWxzL2NvbW1hbmQtdXRpbHMuanMnO1xuaW1wb3J0IHsgdG9FdmVudEJyaWRnZUNyb24gfSBmcm9tICcuLi91dGlscy9jcm9uLmpzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgcHJpbnRJbmZvLCBwcmludEtleVZhbHVlLCBwcmludFNlY3Rpb24sIHByaW50U3VjY2VzcywgcHJpbnRXYXJuaW5nIH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LXV0aWxzLmpzJztcbmltcG9ydCB7IGVuc3VyZVBsYXRmb3JtVG9rZW4sIHNjb3BlU2VjcmV0TGVhZiwgc2VjcmV0TmFtZUZvck9yZyB9IGZyb20gJy4uL3V0aWxzL3BsYXRmb3JtLXNlY3JldC5qcyc7XG5pbXBvcnQgeyBwcm92aXNpb25TZXJ2aWNlQWNjb3VudEtleSwgcmV2b2tlU2VydmljZUFjY291bnRLZXkgfSBmcm9tICcuLi91dGlscy9zZXJ2aWNlLWFjY291bnQuanMnO1xuXG4vLyBFU00gaGFzIG5vIF9fZGlybmFtZTsgZGVyaXZlIGl0IGZyb20gdGhpcyBtb2R1bGUncyBVUkwuXG5jb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcblxuY29uc3QgUkVORVdfU1RBQ0tfTkFNRSA9ICdwaXBlbGluZS1idWlsZGVyLXRva2VuLXJlbmV3Jztcbi8vIENGTi1tYW5hZ2VkIExhbWJkYSBmdW5jdGlvbiBuYW1lIOKAlCBrZWVwIGluIHN5bmMgd2l0aCB0b2tlbi1yZW5ldy1zdGFjay5qc29uLlxuY29uc3QgUkVORVdfTEFNQkRBX05BTUUgPSAncGlwZWxpbmUtYnVpbGRlci10b2tlbi1yZW5ldyc7XG4vLyBEZWZhdWx0IDUtZmllbGQgY3JvbiAoZGFpbHkgYXQgbWlkbmlnaHQpIHdoZW4gbmVpdGhlciAtLWNyb24gbm9yIFRPS0VOX1JFTkVXX1NDSEVEVUxFIGlzIHNldC5cbmNvbnN0IERFRkFVTFRfUkVORVdfQ1JPTiA9ICcwIDAgKiAqIConO1xuXG4vKipcbiAqIENhcGFiaWxpdHkgc2NvcGVzIGEgc3RvcmVkIGNyZWRlbnRpYWwgbWF5IGNhcnJ5LCBhbmQgd2hhdCBlYWNoIG9uZSBpcyBGT1IuXG4gKlxuICogQSBzY29wZWQga2V5IGV4Y2hhbmdlcyB0byBhIHRva2VuIHdpdGggbm8gcGVybWlzc2lvbnMgYW5kIG5vIGFkbWluIGZsYWdzIGF0XG4gKiBhbGwg4oCUIG9ubHkgdGhlIG9uZSBjYXBhYmlsaXR5IOKAlCBzbyBpdCBpcyB0aGUgc2hhcGUgZXZlcnkgYXV0b21hdGlvbiB0aGF0IGRvZXNcbiAqIGV4YWN0bHkgb25lIHRoaW5nIHNob3VsZCBob2xkICgjMTIpLiBUaGUgdW5zY29wZWQgYHBsYXRmb3JtYCBjcmVkZW50aWFsIGlzIHRoZVxuICogcmVtYWluaW5nIGZ1bGwtcHJpdmlsZWdlIG9uZTogc3ludGgvZGVwbG95IGNhbGxiYWNrcyBhbmQgdGhlIHBsdWdpbi1sb29rdXBcbiAqIExhbWJkYSBjYWxsIHRoZSBvcmRpbmFyeSBBUEkgc3VyZmFjZSwgd2hpY2ggbm8gc2luZ2xlIHNjb3BlIGNvdmVycy5cbiAqL1xuY29uc3QgU0NPUEVfQ0FUQUxPRzogUmVjb3JkPHN0cmluZywgeyBhY2NvdW50OiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfT4gPSB7XG4gICdyZXBvcnRpbmc6aW5nZXN0Jzoge1xuICAgIGFjY291bnQ6ICdyZXBvcnRpbmctaW5nZXN0JyxcbiAgICBkZXNjcmlwdGlvbjogJ0FXUyBwaXBlbGluZS1ldmVudCBpbmdlc3Rpb24gKHRoZSBldmVudHMgTGFtYmRhIFBPU1RzIC9yZXBvcnRzL2V2ZW50cyknLFxuICB9LFxuICAncmVnaXN0cnk6cHVzaCc6IHtcbiAgICBhY2NvdW50OiAncmVnaXN0cnktcHVzaCcsXG4gICAgZGVzY3JpcHRpb246ICdDSSBpbWFnZSBwdXNoZXMgaW50byB0aGlzIG9yZ+KAmXMgcmVnaXN0cnkgbmFtZXNwYWNlIChDb2RlQnVpbGQg4oaSIC90b2tlbiknLFxuICB9LFxufTtcblxuLyoqIFRoZSBhY2NvdW50IHRoYXQgaG9sZHMgdGhlIHVuc2NvcGVkLCBmdWxsLXByaXZpbGVnZSBzdG9yZWQgY3JlZGVudGlhbC4gKi9cbmNvbnN0IFBMQVRGT1JNX0FDQ09VTlQgPSB7XG4gIGFjY291bnQ6ICdwbGF0Zm9ybS1hdXRvbWF0aW9uJyxcbiAgZGVzY3JpcHRpb246ICdTdG9yZWQgcGxhdGZvcm0gY3JlZGVudGlhbCBmb3IgQ0RLIHN5bnRoL2RlcGxveSwgcGx1Z2luIGxvb2t1cCBhbmQgaW1hZ2UgcHVzaGVzJyxcbn07XG5cbi8qKlxuICogRGVwbG95IChvciB1cGRhdGUpIHRoZSBvbmNlLWEtZGF5IEtFWSBST1RBVElPTiBzdGFjazogYSBzY2hlZHVsZWQgTGFtYmRhIHRoYXRcbiAqIHJlcGxhY2VzIHRoZSBzZXJ2aWNlLWFjY291bnQga2V5IGluIHRoaXMgc2VjcmV0IGJlZm9yZSBpdCBleHBpcmVzLiBNaXJyb3JzXG4gKiBzZXR1cC1ldmVudHMg4oCUIGBhd3MgY2xvdWRmb3JtYXRpb24gZGVwbG95YCBmb3IgdGhlIGluZnJhLCB0aGVuIGEgZGlyZWN0XG4gKiBVcGRhdGVGdW5jdGlvbkNvZGUgd2l0aCB0aGUgcm90YXRvciBoYW5kbGVyIGNvbXBpbGVkIGFsb25nc2lkZSB0aGlzIENMSSAoc2VlXG4gKiBzcmMvbGFtYmRhL3Rva2VuLXJlbmV3LWhhbmRsZXIudHMpLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZXBsb3lSZW5ld1NjaGVkdWxlKG9wdHM6IHtcbiAgc2VjcmV0TmFtZTogc3RyaW5nO1xuICBkYXlzOiBudW1iZXI7XG4gIGZpdmVGaWVsZENyb246IHN0cmluZztcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIHByb2ZpbGU/OiBzdHJpbmc7XG59KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgc2NoZWR1bGVFeHByZXNzaW9uID0gdG9FdmVudEJyaWRnZUNyb24ob3B0cy5maXZlRmllbGRDcm9uKTsgLy8gdmFsaWRhdGVzICsgMTUtbWluIGd1YXJkXG5cbiAgLy8gTmFtZSByZW5ld2FsIHJlc291cmNlcyBwZXItc2VjcmV0IHNvIGEgc2NvcGVkLWNyZWRlbnRpYWwgc3RhY2sgKGUuZy4gdGhlXG4gIC8vIHJlcG9ydGluZy1pbmdlc3Qga2V5IHRoZSBldmVudCBMYW1iZGEgcmVhZHMpIGNvZXhpc3RzIHdpdGggdGhlXG4gIC8vIHBsYXRmb3JtLWNyZWRlbnRpYWwgc3RhY2sgaW5zdGVhZCBvZiBjb2xsaWRpbmcgb24gdGhlIChhY2NvdW50LWdsb2JhbCkgSUFNXG4gIC8vIHJvbGUgLyBMYW1iZGEgLyBydWxlIG5hbWVzLiBUaGUgcGxhdGZvcm0gc2VjcmV0IGtlZXBzIHRoZSBiYXJlIG5hbWVcbiAgLy8gKHN1ZmZpeCAnJykgc28gZXhpc3RpbmcgZGVwbG95bWVudHMnIHN0YWNrIGlzIHVwZGF0ZWQgaW4gcGxhY2UsIG5vdFxuICAvLyBkdXBsaWNhdGVkOyBhbnkgb3RoZXIgc2VjcmV0IGFwcGVuZHMgaXRzIHRyYWlsaW5nIHBhdGggc2VnbWVudC5cbiAgY29uc3Qgc2VjcmV0TGVhZiA9IG9wdHMuc2VjcmV0TmFtZS5yZXBsYWNlKC8uKlxcLy8sICcnKTsgLy8gJ3BsYXRmb3JtJyB8ICdyZXBvcnRpbmctaW5nZXN0JyB8IOKAplxuICBjb25zdCBuYW1lU3VmZml4ID0gc2VjcmV0TGVhZiA9PT0gJ3BsYXRmb3JtJyA/ICcnIDogYC0ke3NlY3JldExlYWYucmVwbGFjZSgvW15hLXowLTldKy9naSwgJy0nKX1gO1xuICBjb25zdCBzdGFja05hbWUgPSBgJHtSRU5FV19TVEFDS19OQU1FfSR7bmFtZVN1ZmZpeH1gO1xuICBjb25zdCBsYW1iZGFOYW1lID0gYCR7UkVORVdfTEFNQkRBX05BTUV9JHtuYW1lU3VmZml4fWA7XG5cbiAgcHJpbnRTZWN0aW9uKCdTY2hlZHVsZSBSb3RhdGlvbicpO1xuICBwcmludEluZm8oJ1BhcmFtZXRlcnMnLCB7XG4gICAgc3RhY2s6IHN0YWNrTmFtZSxcbiAgICBzY2hlZHVsZTogb3B0cy5maXZlRmllbGRDcm9uLFxuICAgIGV2ZW50YnJpZGdlOiBzY2hlZHVsZUV4cHJlc3Npb24sXG4gICAgcmVuZXdEYXlzOiBvcHRzLmRheXMsXG4gIH0pO1xuXG4gIC8vIFN0ZXAgMTogaW5mcmEgKExhbWJkYSBnZXRzIHBsYWNlaG9sZGVyIGNvZGUgb24gZmlyc3QgY3JlYXRlKS5cbiAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL3RlbXBsYXRlcy90b2tlbi1yZW5ldy1zdGFjay5qc29uJyk7XG4gIGNvbnN0IGNmbkFyZ3MgPSBbXG4gICAgJ2Nsb3VkZm9ybWF0aW9uJywgJ2RlcGxveScsXG4gICAgJy0tc3RhY2stbmFtZScsIHN0YWNrTmFtZSxcbiAgICAnLS10ZW1wbGF0ZS1maWxlJywgdGVtcGxhdGVQYXRoLFxuICAgICctLXBhcmFtZXRlci1vdmVycmlkZXMnLFxuICAgIGBQbGF0Zm9ybVNlY3JldE5hbWU9JHtvcHRzLnNlY3JldE5hbWV9YCxcbiAgICBgUmVuZXdEYXlzPSR7b3B0cy5kYXlzfWAsXG4gICAgYFNjaGVkdWxlRXhwcmVzc2lvbj0ke3NjaGVkdWxlRXhwcmVzc2lvbn1gLFxuICAgIGBOYW1lU3VmZml4PSR7bmFtZVN1ZmZpeH1gLFxuICAgIC8vIFJlY29yZGVkIGZvciBwcm92ZW5hbmNlIG9ubHkg4oCUIHRoZSByb3RhdG9yIG5vIGxvbmdlciBpbnN0YWxscyB0aGUgQ0xJIGF0XG4gICAgLy8gcnVudGltZSAoaXQgc3BlYWtzIHRvIHRoZSBwbGF0Zm9ybSBkaXJlY3RseSksIGJ1dCBrbm93aW5nIHdoaWNoIENMSVxuICAgIC8vIGRlcGxveWVkIGEgc3RhY2sgaXMgd29ydGgga2VlcGluZy5cbiAgICBgUGlwZWxpbmVNYW5hZ2VyVmVyc2lvbj0ke0FQUF9WRVJTSU9OfWAsXG4gICAgJy0tY2FwYWJpbGl0aWVzJywgJ0NBUEFCSUxJVFlfTkFNRURfSUFNJyxcbiAgICAnLS1uby1mYWlsLW9uLWVtcHR5LWNoYW5nZXNldCcsXG4gICAgJy0tcmVnaW9uJywgb3B0cy5yZWdpb24sXG4gIF07XG4gIGlmIChvcHRzLnByb2ZpbGUpIGNmbkFyZ3MucHVzaCgnLS1wcm9maWxlJywgb3B0cy5wcm9maWxlKTtcbiAgZXhlY0ZpbGVTeW5jKCdhd3MnLCBjZm5BcmdzLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG5cbiAgLy8gU3RlcCAyOiB1cGxvYWQgdGhlIHJlYWwgaGFuZGxlci4gSXQncyBFU00sIHNvIHRoZSB6aXAgZW50cnkgbXVzdCBiZSBpbmRleC5tanNcbiAgLy8gKEhhbmRsZXIgc3RheXMgaW5kZXguaGFuZGxlciDigJQgbm9kZWpzMjQueCByZXNvbHZlcyB0aGUgLm1qcyBleHRlbnNpb24pLlxuICBjb25zdCBoYW5kbGVyU3JjID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2xhbWJkYS90b2tlbi1yZW5ldy1oYW5kbGVyLmpzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhoYW5kbGVyU3JjKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVG9rZW4tcmVuZXcgaGFuZGxlciBub3QgZm91bmQgYXQgJHtoYW5kbGVyU3JjfSDigJQgd2FzIHRoZSBwYWNrYWdlIGJ1aWx0P2ApO1xuICB9XG4gIGNvbnN0IHRtcERpciA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3Rva2VuLXJlbmV3LScpKTtcbiAgdHJ5IHtcbiAgICBmcy5jb3B5RmlsZVN5bmMoaGFuZGxlclNyYywgcGF0aC5qb2luKHRtcERpciwgJ2luZGV4Lm1qcycpKTtcbiAgICBjb25zdCB6aXBQYXRoID0gcGF0aC5qb2luKHRtcERpciwgJ2luZGV4LnppcCcpO1xuICAgIGV4ZWNGaWxlU3luYygnemlwJywgWyctaicsIHppcFBhdGgsICdpbmRleC5tanMnXSwgeyBjd2Q6IHRtcERpciwgc3RkaW86ICdwaXBlJyB9KTtcblxuICAgIGNvbnN0IGxhbWJkYUNsaWVudCA9IG5ldyBMYW1iZGFDbGllbnQoeyByZWdpb246IG9wdHMucmVnaW9uIH0pO1xuICAgIGF3YWl0IGxhbWJkYUNsaWVudC5zZW5kKG5ldyBVcGRhdGVGdW5jdGlvbkNvZGVDb21tYW5kKHtcbiAgICAgIEZ1bmN0aW9uTmFtZTogbGFtYmRhTmFtZSxcbiAgICAgIFppcEZpbGU6IGZzLnJlYWRGaWxlU3luYyh6aXBQYXRoKSxcbiAgICB9KSk7XG4gIH0gZmluYWxseSB7XG4gICAgZnMucm1TeW5jKHRtcERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpbnRTdWNjZXNzKGBSb3RhdGlvbiBzY2hlZHVsZWQgKCR7c2NoZWR1bGVFeHByZXNzaW9ufSlgKTtcbiAgcmV0dXJuIHNjaGVkdWxlRXhwcmVzc2lvbjtcbn1cblxuLyoqIFJlYWQgdGhlIGtleSBpZCBhIHByZXZpb3VzIHJ1biBzdG9yZWQsIHNvIHRoaXMgcnVuIGNhbiByZXRpcmUgaXQuICovXG5hc3luYyBmdW5jdGlvbiBwcmV2aW91c0tleUlkKFxuICBzZWNyZXROYW1lOiBzdHJpbmcsXG4gIGF3czogeyByZWdpb246IHN0cmluZzsgcHJvZmlsZT86IHN0cmluZyB9LFxuKTogUHJvbWlzZTx7IGtleUlkPzogc3RyaW5nOyBzZXJ2aWNlQWNjb3VudElkPzogc3RyaW5nIH0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBhd2FpdCBnZXRTZWNyZXRWYWx1ZShzZWNyZXROYW1lLCBhd3MpO1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyB7IGtleUlkPzogc3RyaW5nOyBzZXJ2aWNlQWNjb3VudElkPzogc3RyaW5nIH07XG4gICAgcmV0dXJuIHsga2V5SWQ6IHBhcnNlZC5rZXlJZCwgc2VydmljZUFjY291bnRJZDogcGFyc2VkLnNlcnZpY2VBY2NvdW50SWQgfTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gc2VjcmV0IHlldCAoZmlyc3QgcnVuKSwgb3Igb25lIHdyaXR0ZW4gYmVmb3JlIHRoZSBzZXJ2aWNlLWFjY291bnRcbiAgICAvLyBjdXRvdmVyIChubyBrZXlJZCkuIEVpdGhlciB3YXkgdGhlcmUgaXMgbm90aGluZyB0aGlzIHJ1biBjYW4gcmV0aXJlLlxuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgYHN0b3JlLXRva2VuYCBjb21tYW5kIHdpdGggdGhlIENMSSBwcm9ncmFtLlxuICpcbiAqIFByb3Zpc2lvbnMgdGhlIG9yZydzIG1hY2hpbmUgaWRlbnRpdHkg4oCUIGEgU0VSVklDRSBBQ0NPVU5UIGFuZCBvbmUgYHBiX3NhX+KApmBcbiAqIGtleSDigJQgYW5kIHN0b3JlcyB0aGUga2V5IGluIEFXUyBTZWNyZXRzIE1hbmFnZXIgZm9yIENESyBkZXBsb3ltZW50cyxcbiAqIENvZGVCdWlsZCdzIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzLCB0aGUgcGx1Z2luLWxvb2t1cCBMYW1iZGEgYW5kIHRoZSBldmVudFxuICogaW5nZXN0aW9uIExhbWJkYSAoIzEyIC8gI04yKS4gTm90aGluZyBzdG9yZWQgaXMgdGllZCB0byBhIHBlcnNvbidzIHNlc3Npb24gYW55XG4gKiBtb3JlOiB0aGUgYWNjb3VudCBvdXRsaXZlcyBpdHMgY3JlYXRvciwgdGFrZXMgbm8gc2VhdCwgYW5kIGV2ZXJ5IGF1ZGl0IHJvdyBpdFxuICogcHJvZHVjZXMgbmFtZXMgdGhlIGFjY291bnQuXG4gKlxuICogQmVjYXVzZSBjcmVhdGluZyBhbiBhY2NvdW50IGFuZCBpc3N1aW5nIGl0cyBrZXkgYXJlIHN0ZXAtdXAgZ2F0ZWQsIHRoaXMgbmVlZHNcbiAqIHRoZSBvcGVyYXRvcidzIHBhc3N3b3JkIOKAlCBgLS1wYXNzd29yZGAsIG9yIHRoZSBgUExBVEZPUk1fUEFTU1dPUkRgIGVudiB2YXJcbiAqIChwcmVmZXJyZWQ6IGl0IGtlZXBzIHRoZSBwYXNzd29yZCBvdXQgb2Ygc2hlbGwgaGlzdG9yeSBhbmQgcGxhbiBvdXRwdXQpLlxuICpcbiAqIEJ5IGRlZmF1bHQgaXQgT05MWSB3cml0ZXMgdGhlIHNlY3JldC4gUGFzcyAtLXNjaGVkdWxlIHRvIGFsc28gZGVwbG95IHRoZSBkYWlseVxuICogS0VZIFJPVEFUSU9OIHN0YWNrIChhIExhbWJkYSB0aGF0IHJlcGxhY2VzIHRoZSBrZXkgYmVmb3JlIGl0IGV4cGlyZXMpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBiYXNoXG4gKiBQTEFURk9STV9QQVNTV09SRD0qKiogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXJlZ2lvbiB1cy1lYXN0LTFcbiAqIFBMQVRGT1JNX1BBU1NXT1JEPSoqKiBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuIC0tZGF5cyA5MCAtLXJlZ2lvbiB1cy1lYXN0LTFcbiAqIFBMQVRGT1JNX1BBU1NXT1JEPSoqKiBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuIC0tc2NoZWR1bGUgLS1yZWdpb24gdXMtZWFzdC0xICAgICAjICsgZGFpbHkgcm90YXRpb25cbiAqIFBMQVRGT1JNX1BBU1NXT1JEPSoqKiBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuIC0tc2NvcGUgcmVwb3J0aW5nOmluZ2VzdCAtLXNjaGVkdWxlXG4gKiBQTEFURk9STV9QQVNTV09SRD0qKiogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXNjb3BlIHJlZ2lzdHJ5OnB1c2ggLS1zY2hlZHVsZVxuICogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLWRyeS1ydW5cbiAqIHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW4gLXUgYWRtaW4gLXAgJyoqKicgLS1yZWdpb24gdXMtZWFzdC0xXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlVG9rZW4ocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICB3aXRoU3NsT3B0aW9ucyhcbiAgICB3aXRoUHJvZmlsZU9wdGlvbihcbiAgICAgIHdpdGhSZWdpb25PcHRpb24ocHJvZ3JhbVxuICAgICAgICAuY29tbWFuZCgnc3RvcmUtdG9rZW4nKVxuICAgICAgICAuZGVzY3JpcHRpb24oJ1Byb3Zpc2lvbiBhbiBvcmcgc2VydmljZS1hY2NvdW50IGtleSAoaXRzIG93biBtYWNoaW5lIGlkZW50aXR5KSBhbmQgc3RvcmUgaXQgaW4gQVdTIFNlY3JldHMgTWFuYWdlciBmb3IgQ0RLIGRlcGxveW1lbnRzJylcbiAgICAgICAgLm9wdGlvbignLXUsIC0taWRlbnRpZmllciA8aWRlbnRpZmllcj4nLCAnVXNlcm5hbWUgb3IgZW1haWwgKHNraXBzIFBMQVRGT1JNX1RPS0VOIHJlcXVpcmVtZW50KScpXG4gICAgICAgIC5vcHRpb24oJy1wLCAtLXBhc3N3b3JkIDxwYXNzd29yZD4nLCAnTG9naW4gcGFzc3dvcmQg4oCUIGFsc28gdXNlZCBmb3IgdGhlIHN0ZXAtdXAgZXZlcnkga2V5IHdyaXRlIHJlcXVpcmVzIChwcmVmZXIgUExBVEZPUk1fUEFTU1dPUkQpJylcbiAgICAgICAgLm9wdGlvbignLS1kYXlzIDxkYXlzPicsICdLZXkgbGlmZXRpbWUgaW4gZGF5cyAobWF4IDM2NSknLCAnMzAnKVxuICAgICAgICAub3B0aW9uKCctLXNjb3BlIDxzY29wZT4nLCBgUHJvdmlzaW9uIGEgbGVhc3QtcHJpdmlsZWdlIHNjb3BlZCBrZXkgaW5zdGVhZCBvZiB0aGUgZnVsbC1wcml2aWxlZ2UgcGxhdGZvcm0gb25lLiBPbmUgb2Y6ICR7T2JqZWN0LmtleXMoU0NPUEVfQ0FUQUxPRykuam9pbignLCAnKX1gKVxuICAgICAgICAub3B0aW9uKCctLWFjY291bnQgPG5hbWU+JywgJ092ZXJyaWRlIHRoZSBzZXJ2aWNlLWFjY291bnQgbmFtZSB0aGlzIGtleSBpcyBpc3N1ZWQgb24gKGRlZmF1bHQ6IGRlcml2ZWQgZnJvbSAtLXNjb3BlKScpXG4gICAgICAgIC5vcHRpb24oJy0tZHJ5LXJ1bicsICdTaG93IHdoYXQgd291bGQgYmUgcHJvdmlzaW9uZWQgd2l0aG91dCBjYWxsaW5nIHRoZSBwbGF0Zm9ybSBvciB3cml0aW5nIHRvIFNlY3JldHMgTWFuYWdlcicsIGZhbHNlKSksXG4gICAgKVxuICAgICAgLm9wdGlvbignLS1zY2hlZHVsZScsICdBbHNvIGRlcGxveSB0aGUgZGFpbHkga2V5LXJvdGF0aW9uIHN0YWNrIHRoYXQgcmVwbGFjZXMgdGhpcyBrZXkgYmVmb3JlIGl0IGV4cGlyZXMgKG9mZiBieSBkZWZhdWx0KScsIGZhbHNlKVxuICAgICAgLm9wdGlvbignLS1jcm9uIDxleHByPicsICdSb3RhdGlvbiBzY2hlZHVsZSBhcyBhIDUtZmllbGQgY3JvbiwgdXNlZCB3aXRoIC0tc2NoZWR1bGUgKGRlZmF1bHQ6IFRPS0VOX1JFTkVXX1NDSEVEVUxFIGVudiBvciBcIjAgMCAqICogKlwiOyBtaW4gZXZlcnkgMTUgbWludXRlcyknKVxuICAgICAgLm9wdGlvbignLS1qc29uJywgJ091dHB1dCByZXN1bHQgYXMgSlNPTicsIGZhbHNlKSxcbiAgKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbklkID0gcHJpbnRDb21tYW5kSGVhZGVyKCdTdG9yZSBUb2tlbicsIHVuZGVmaW5lZCwgeyBxdWlldDogb3B0aW9ucy5qc29uIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBwcmludFNzbFdhcm5pbmcob3B0aW9ucy52ZXJpZnlTc2wpO1xuXG4gICAgICAgIGNvbnN0IHJlZ2lvbiA9IHJlc29sdmVBd3NSZWdpb24ob3B0aW9ucy5yZWdpb24pO1xuICAgICAgICBjb25zdCBhd3MgPSB7IHJlZ2lvbiwgcHJvZmlsZTogb3B0aW9ucy5wcm9maWxlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCB9O1xuXG4gICAgICAgIGNvbnN0IGRheXMgPSB2YWxpZGF0ZU51bWJlcihvcHRpb25zLmRheXMsICdkYXlzJywgMSwgMzY1KTtcbiAgICAgICAgY29uc3QgZXhwaXJlc0luU2Vjb25kcyA9IGRheXMgKiAyNCAqIDYwICogNjA7XG5cbiAgICAgICAgY29uc3Qgc2NvcGUgPSBvcHRpb25zLnNjb3BlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgY2F0YWxvZ3VlZCA9IHNjb3BlID8gU0NPUEVfQ0FUQUxPR1tzY29wZV0gOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChzY29wZSAmJiAhY2F0YWxvZ3VlZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biAtLXNjb3BlIFwiJHtzY29wZX1cIi4gU3VwcG9ydGVkOiAke09iamVjdC5rZXlzKFNDT1BFX0NBVEFMT0cpLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2hpY2ggbWFjaGluZSBpZGVudGl0eSB0aGlzIGNyZWRlbnRpYWwgYmVsb25ncyB0bzogdGhlIHNjb3BlJ3Mgb3duXG4gICAgICAgIC8vIGFjY291bnQsIG9yIHRoZSBvcmcncyBzaW5nbGUgZnVsbC1wcml2aWxlZ2UgYXV0b21hdGlvbiBhY2NvdW50LlxuICAgICAgICBjb25zdCBpZGVudGl0eSA9IGNhdGFsb2d1ZWQgPz8gUExBVEZPUk1fQUNDT1VOVDtcbiAgICAgICAgY29uc3QgYWNjb3VudE5hbWUgPSAob3B0aW9ucy5hY2NvdW50IGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gaWRlbnRpdHkuYWNjb3VudDtcblxuICAgICAgICAvLyBTdGVwIDA6IGxvZyBpbiBmaXJzdCB3aGVuIGNyZWRzIGFyZSBhdmFpbGFibGUgYW5kIG5vIFBMQVRGT1JNX1RPS0VOIGlzXG4gICAgICAgIC8vIHNldCAoc2hhcmVkIHdpdGggc2V0dXAtZXZlbnRzKS4gQ3JlZHMgY29tZSBmcm9tIC0taWRlbnRpZmllci8tLXBhc3N3b3JkXG4gICAgICAgIC8vIE9SIHRoZSBlbnYgdmFycyBQTEFURk9STV9JREVOVElGSUVSL1BMQVRGT1JNX1BBU1NXT1JEIOKAlCB0aGUgZW52IHBhdGhcbiAgICAgICAgLy8gbGV0cyBjYWxsZXJzIGxpa2UgYHByb3Zpc2lvbiAtLXdpdGgtZXZlbnRzYCBwYXNzIHRoZW0gd2l0aG91dCBwdXR0aW5nXG4gICAgICAgIC8vIHRoZSBwYXNzd29yZCBvbiB0aGUgY29tbWFuZCBsaW5lICh3aGVyZSBpdCB3b3VsZCBzaG93IGluIHBsYW5zL2xvZ3MpLlxuICAgICAgICBhd2FpdCBlbnN1cmVQbGF0Zm9ybVRva2VuKG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIFRoZSBwYXNzd29yZCBpcyBBTFNPIHRoZSBzdGVwLXVwIGZhY3RvciBmb3IgYm90aCB3cml0ZXMgYmVsb3csIHNvIGl0IGlzXG4gICAgICAgIC8vIHJlcXVpcmVkIGV2ZW4gd2hlbiBQTEFURk9STV9UT0tFTiBpcyBhbHJlYWR5IHNldC4gU2F5IHRoYXQgcGxhaW5seVxuICAgICAgICAvLyByYXRoZXIgdGhhbiBmYWlsaW5nIHRocmVlIGNhbGxzIGxhdGVyIHdpdGggYSA0MDMuXG4gICAgICAgIGNvbnN0IHBhc3N3b3JkID0gKG9wdGlvbnMucGFzc3dvcmQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSB8fCBwcm9jZXNzLmVudi5QTEFURk9STV9QQVNTV09SRDtcbiAgICAgICAgaWYgKCFwYXNzd29yZCAmJiAhb3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnQSBwYXNzd29yZCBpcyByZXF1aXJlZDogY3JlYXRpbmcgYSBzZXJ2aWNlIGFjY291bnQgYW5kIGlzc3VpbmcgaXRzIGtleSBhcmUgYm90aCBzdGVwLXVwIGdhdGVkLiAnXG4gICAgICAgICAgICArICdTZXQgUExBVEZPUk1fUEFTU1dPUkQgKHByZWZlcnJlZCkgb3IgcGFzcyAtLXBhc3N3b3JkLicsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaW50U2VjdGlvbignUHJvdmlzaW9uIFNlcnZpY2UtQWNjb3VudCBLZXknKTtcblxuICAgICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50QXN5bmMob3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICAgICAgLy8gRHJ5IHJ1biBzdGF5cyBlbnRpcmVseSBPRkZMSU5FIOKAlCBpdCBtdXN0IG5vdCBjcmVhdGUgYW4gYWNjb3VudCBvclxuICAgICAgICAgIC8vIGJ1cm4gYSBrZXkganVzdCB0byBzaG93IHdoYXQgaXQgd291bGQgZG8uXG4gICAgICAgICAgY29uc3QgcGxhbiA9IHtcbiAgICAgICAgICAgIHNlcnZpY2VBY2NvdW50OiBhY2NvdW50TmFtZSxcbiAgICAgICAgICAgIHJvbGVzOiBzY29wZSA/ICdub25lIChzY29wZWQsIGxlYXN0IHByaXZpbGVnZSknIDogJ29yZyBhZG1pbicsXG4gICAgICAgICAgICBzY29wZTogc2NvcGUgPz8gJyhub25lIOKAlCBmdWxsIHBsYXRmb3JtIGNyZWRlbnRpYWwpJyxcbiAgICAgICAgICAgIHNlY3JldE5hbWU6IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFQ1JFVF9OQU1FIHx8IGAke3NlY3JldE5hbWVGb3JPcmcoJzxvcmdJZD4nLCBzY29wZSA/IHNjb3BlU2VjcmV0TGVhZihzY29wZSkgOiAncGxhdGZvcm0nKX1gLFxuICAgICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgICAgZXhwaXJlc0luRGF5czogZGF5cyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHsgc3VjY2VzczogdHJ1ZSwgZHJ5UnVuOiB0cnVlLCAuLi5wbGFuIH0sIG51bGwsIDIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICAgICAgcHJpbnRTZWN0aW9uKCdEcnkgUnVuIOKAlCBObyBDaGFuZ2VzIE1hZGUnKTtcbiAgICAgICAgICAgIHByaW50S2V5VmFsdWUoe1xuICAgICAgICAgICAgICAnU2VydmljZSBBY2NvdW50JzogcGxhbi5zZXJ2aWNlQWNjb3VudCxcbiAgICAgICAgICAgICAgJ1JvbGVzJzogcGxhbi5yb2xlcyxcbiAgICAgICAgICAgICAgJ0tleSBTY29wZSc6IHBsYW4uc2NvcGUsXG4gICAgICAgICAgICAgICdTZWNyZXQgTmFtZSc6IHBsYW4uc2VjcmV0TmFtZSxcbiAgICAgICAgICAgICAgJ1JlZ2lvbic6IHBsYW4ucmVnaW9uLFxuICAgICAgICAgICAgICAnRXhwaXJlcyBJbic6IGAke2RheXN9IGRheXNgLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcmludFN1Y2Nlc3MoJ0RyeSBydW4gY29tcGxldGUg4oCUIG5vIGFjY291bnQsIGtleSBvciBzZWNyZXQgd2FzIGNyZWF0ZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5TmFtZSA9IGAke2FjY291bnROYW1lfS0ke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCl9YDtcbiAgICAgICAgY29uc3QgcHJvdmlzaW9uZWQgPSBhd2FpdCBwcm92aXNpb25TZXJ2aWNlQWNjb3VudEtleSh7XG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCEsXG4gICAgICAgICAgYWNjb3VudE5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGlkZW50aXR5LmRlc2NyaXB0aW9uLFxuICAgICAgICAgIHJvbGVzOiBzY29wZSA/ICdub25lJyA6ICdhZG1pbicsXG4gICAgICAgICAgLi4uKHNjb3BlID8geyBzY29wZSB9IDoge30pLFxuICAgICAgICAgIGV4cGlyZXNJblNlY29uZHMsXG4gICAgICAgICAga2V5TmFtZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJpbnRTdWNjZXNzKGBLZXkgaXNzdWVkIG9uIHNlcnZpY2UgYWNjb3VudCAnJHthY2NvdW50TmFtZX0nIChleHBpcmVzICR7cHJvdmlzaW9uZWQuZXhwaXJlc0F0fSlgKTtcblxuICAgICAgICAvLyBBbiBleHBsaWNpdCBQTEFURk9STV9TRUNSRVRfTkFNRSBzdGlsbCB3aW5zICh0aGUgZXNjYXBlIGhhdGNoIGZvclxuICAgICAgICAvLyBoYW5kLW1hbmFnZWQgcGF0aHMpOyBvdGhlcndpc2UgZGVyaXZlIGl0IGZyb20gdGhlIG9yZyB0aGUgcGxhdGZvcm1cbiAgICAgICAgLy8gcmVwb3J0ZWQsIHdoaWNoIHdvcmtzIHdpdGggYW4gb3BhcXVlIGFjY2VzcyBrZXkgYXMgUExBVEZPUk1fVE9LRU4g4oCUXG4gICAgICAgIC8vIGEga2V5IGNhcnJpZXMgbm8gb3JnIGNsYWltIHRvIGRlY29kZS5cbiAgICAgICAgY29uc3Qgc2VjcmV0TmFtZSA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFQ1JFVF9OQU1FXG4gICAgICAgICAgfHwgc2VjcmV0TmFtZUZvck9yZyhwcm92aXNpb25lZC5vcmdhbml6YXRpb25JZCwgc2NvcGUgPyBzY29wZVNlY3JldExlYWYoc2NvcGUpIDogJ3BsYXRmb3JtJyk7XG5cbiAgICAgICAgYXVkaXRMb2coJ3N0b3JlLXRva2VuJywge1xuICAgICAgICAgIGV4ZWN1dGlvbklkLFxuICAgICAgICAgIHNlY3JldE5hbWUsXG4gICAgICAgICAgZGF5cyxcbiAgICAgICAgICBzZXJ2aWNlQWNjb3VudDogYWNjb3VudE5hbWUsXG4gICAgICAgICAgc2NvcGU6IHNjb3BlID8/IG51bGwsXG4gICAgICAgICAga2V5SWQ6IHByb3Zpc2lvbmVkLmtleUlkLFxuICAgICAgICB9KTtcblxuICAgICAgICBwcmludEluZm8oJ1BhcmFtZXRlcnMnLCB7XG4gICAgICAgICAgc2VjcmV0TmFtZSxcbiAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgc2VydmljZUFjY291bnQ6IGFjY291bnROYW1lLFxuICAgICAgICAgIHNjb3BlOiBzY29wZSA/PyAnKG5vbmUpJyxcbiAgICAgICAgICBkYXlzLFxuICAgICAgICAgIGV4cGlyZXNJbjogYCR7ZXhwaXJlc0luU2Vjb25kc31zYCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gV2hhdCB0aGlzIHJ1biBpcyBSRVBMQUNJTkcsIHJlYWQgYmVmb3JlIHRoZSB3cml0ZSBzbyB0aGUgb2xkIGtleSBjYW4gYmVcbiAgICAgICAgLy8gcmV0aXJlZCBhZnRlciB0aGUgbmV3IG9uZSBpcyBzYWZlbHkgc3RvcmVkLlxuICAgICAgICBjb25zdCBwcmV2aW91cyA9IGF3YWl0IHByZXZpb3VzS2V5SWQoc2VjcmV0TmFtZSwgYXdzKTtcblxuICAgICAgICAvLyBTY2hlbWE6IHsgdXNlcm5hbWU6IG9yZ0lkLCBwYXNzd29yZDogPHBiX3NhXyBrZXk+LCAuLi5tZXRhZGF0YSB9XG4gICAgICAgIC8vIC0gdXNlcm5hbWUvcGFzc3dvcmQgc2F0aXNmeSBDb2RlQnVpbGQncyBgc2VjcmV0c01hbmFnZXJDcmVkZW50aWFsc2BcbiAgICAgICAgLy8gICAoSFRUUCBCYXNpYywgc2VudCB0byBwaXBlbGluZS1pbWFnZS1yZWdpc3RyeSdzIC90b2tlbiBlbmRwb2ludCwgd2hpY2hcbiAgICAgICAgLy8gICBleGNoYW5nZXMgdGhlIG9wYXF1ZSBrZXkgbGlrZSBldmVyeSBvdGhlciBzZXJ2aWNlIGRvZXMpXG4gICAgICAgIC8vIC0gYHBhc3N3b3JkYCBzdGF5cyB0aGUgY2Fub25pY2FsIGZpZWxkOiB0aGUgcGx1Z2luLWxvb2t1cCBMYW1iZGEsIHRoZVxuICAgICAgICAvLyAgIGV2ZW50cyBMYW1iZGEgYW5kIGAtLXN0b3JlLXRva2Vuc2AgYWxsIHJlYWQgaXQuIE9ubHkgaXRzIFZBTFVFIGNoYW5nZWQsXG4gICAgICAgIC8vICAgZnJvbSBhIG1hY2hpbmUtc2Vzc2lvbiBKV1QgdG8gYW4gb3BhcXVlIHNlcnZpY2UtYWNjb3VudCBrZXkuXG4gICAgICAgIC8vIC0ga2V5SWQgLyBzZXJ2aWNlQWNjb3VudElkIGFyZSB3aGF0IHRoZSByb3RhdGlvbiBMYW1iZGEgbmVlZHMgdG8gcmV0aXJlXG4gICAgICAgIC8vICAgdGhlIGtleSBpdCByZXBsYWNlcy5cbiAgICAgICAgY29uc3Qgc2VjcmV0VmFsdWUgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgdXNlcm5hbWU6IHByb3Zpc2lvbmVkLm9yZ2FuaXphdGlvbklkLFxuICAgICAgICAgIHBhc3N3b3JkOiBwcm92aXNpb25lZC5rZXksXG4gICAgICAgICAgcGxhdGZvcm1Vcmw6IGNsaWVudC5nZXRCYXNlVXJsKCksXG4gICAgICAgICAgb3JnYW5pemF0aW9uSWQ6IHByb3Zpc2lvbmVkLm9yZ2FuaXphdGlvbklkLFxuICAgICAgICAgIHNlcnZpY2VBY2NvdW50SWQ6IHByb3Zpc2lvbmVkLnNlcnZpY2VBY2NvdW50SWQsXG4gICAgICAgICAgc2VydmljZUFjY291bnROYW1lOiBwcm92aXNpb25lZC5zZXJ2aWNlQWNjb3VudE5hbWUsXG4gICAgICAgICAga2V5SWQ6IHByb3Zpc2lvbmVkLmtleUlkLFxuICAgICAgICAgIHNjb3BlOiBwcm92aXNpb25lZC5zY29wZSxcbiAgICAgICAgICBleHBpcmVzSW46IGV4cGlyZXNJblNlY29uZHMsXG4gICAgICAgICAgZXhwaXJlc0F0OiBwcm92aXNpb25lZC5leHBpcmVzQXQsXG4gICAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHByaW50U2VjdGlvbignU3RvcmUgS2V5Jyk7XG5cbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBgUGlwZWxpbmUgQnVpbGRlciBzZXJ2aWNlLWFjY291bnQga2V5ICgke2FjY291bnROYW1lfTsgcmVuZXcgYnkgJHtwcm92aXNpb25lZC5leHBpcmVzQXR9KWA7XG4gICAgICAgIGF3YWl0IHVwc2VydFNlY3JldChzZWNyZXROYW1lLCBzZWNyZXRWYWx1ZSwgZGVzY3JpcHRpb24sIGF3cyk7XG5cbiAgICAgICAgY29uc3QgYXJuID0gYXdhaXQgZ2V0U2VjcmV0QXJuKHNlY3JldE5hbWUsIGF3cyk7XG5cbiAgICAgICAgLy8gUmV0aXJlIHRoZSBjcmVkZW50aWFsIHRoaXMgcnVuIHJlcGxhY2VkIOKAlCBBRlRFUiB0aGUgbmV3IG9uZSBpcyBzdG9yZWQsXG4gICAgICAgIC8vIG5ldmVyIGJlZm9yZS4gQSBmYWlsdXJlIGhlcmUgbGVhdmVzIGEgc3VwZXJmbHVvdXMga2V5IHRoYXQgZXhwaXJlcyBvblxuICAgICAgICAvLyBpdHMgb3duOyBkb2luZyBpdCBpbiB0aGUgb3RoZXIgb3JkZXIgd291bGQgbGVhdmUgdGhlIHNlY3JldCBuYW1pbmcgYVxuICAgICAgICAvLyByZXZva2VkIGtleSBpZiB0aGUgd3JpdGUgZmFpbGVkLlxuICAgICAgICBpZiAocHJldmlvdXMua2V5SWQgJiYgcHJldmlvdXMuc2VydmljZUFjY291bnRJZCA9PT0gcHJvdmlzaW9uZWQuc2VydmljZUFjY291bnRJZCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCByZXZva2VTZXJ2aWNlQWNjb3VudEtleShcbiAgICAgICAgICAgICAgY2xpZW50LCBwYXNzd29yZCEsIHByb3Zpc2lvbmVkLm9yZ2FuaXphdGlvbklkLCBwcm92aXNpb25lZC5zZXJ2aWNlQWNjb3VudElkLCBwcmV2aW91cy5rZXlJZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwcmludFN1Y2Nlc3MoYFJldGlyZWQgdGhlIHByZXZpb3VzIGtleSAoJHtwcmV2aW91cy5rZXlJZH0pYCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAgIGBTdG9yZWQgdGhlIG5ldyBrZXksIGJ1dCBjb3VsZCBub3QgcmV2b2tlIHRoZSBwcmV2aW91cyBvbmUgKCR7cHJldmlvdXMua2V5SWR9KTogYFxuICAgICAgICAgICAgICArIGAke2Vycm9yTWVzc2FnZShlcnIpfS4gSXQgZXhwaXJlcyBvbiBpdHMgb3duOyByZXZva2UgaXQgZnJvbSBgXG4gICAgICAgICAgICAgICsgJ1NldHRpbmdzIOKGkiBTZXJ2aWNlIGFjY291bnRzIGlmIHlvdSB3YW50IGl0IGdvbmUgbm93LicsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbmFsbHkgaW5zdGFsbCB0aGUgb25jZS1hLWRheSByb3RhdGlvbiBzdGFjayBzbyB0aGlzIGtleSBuZXZlciBsYXBzZXMuXG4gICAgICAgIGxldCBzY2hlZHVsZUV4cHJlc3Npb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKG9wdGlvbnMuc2NoZWR1bGUpIHtcbiAgICAgICAgICBjb25zdCBmaXZlRmllbGRDcm9uID0gb3B0aW9ucy5jcm9uIHx8IHByb2Nlc3MuZW52LlRPS0VOX1JFTkVXX1NDSEVEVUxFIHx8IERFRkFVTFRfUkVORVdfQ1JPTjtcbiAgICAgICAgICBzY2hlZHVsZUV4cHJlc3Npb24gPSBhd2FpdCBkZXBsb3lSZW5ld1NjaGVkdWxlKHtcbiAgICAgICAgICAgIHNlY3JldE5hbWUsXG4gICAgICAgICAgICBkYXlzLFxuICAgICAgICAgICAgZml2ZUZpZWxkQ3JvbixcbiAgICAgICAgICAgIHJlZ2lvbixcbiAgICAgICAgICAgIHByb2ZpbGU6IG9wdGlvbnMucHJvZmlsZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgc2VjcmV0TmFtZSxcbiAgICAgICAgICAgIHNlY3JldEFybjogYXJuLFxuICAgICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgICAgc2VydmljZUFjY291bnQ6IGFjY291bnROYW1lLFxuICAgICAgICAgICAgc2VydmljZUFjY291bnRJZDogcHJvdmlzaW9uZWQuc2VydmljZUFjY291bnRJZCxcbiAgICAgICAgICAgIGtleUlkOiBwcm92aXNpb25lZC5rZXlJZCxcbiAgICAgICAgICAgIHNjb3BlOiBwcm92aXNpb25lZC5zY29wZSxcbiAgICAgICAgICAgIGV4cGlyZXNJbkRheXM6IGRheXMsXG4gICAgICAgICAgICBleHBpcmVzQXQ6IHByb3Zpc2lvbmVkLmV4cGlyZXNBdCxcbiAgICAgICAgICAgIHNjaGVkdWxlOiBzY2hlZHVsZUV4cHJlc3Npb24gPz8gbnVsbCxcbiAgICAgICAgICB9LCBudWxsLCAyKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICAgIHByaW50U2VjdGlvbignS2V5IFN0b3JlZCcpO1xuXG4gICAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgICAnU2VjcmV0IE5hbWUnOiBzZWNyZXROYW1lLFxuICAgICAgICAgICAgJ1NlY3JldCBBUk4nOiBhcm4sXG4gICAgICAgICAgICAnUmVnaW9uJzogcmVnaW9uLFxuICAgICAgICAgICAgJ1NlcnZpY2UgQWNjb3VudCc6IGFjY291bnROYW1lLFxuICAgICAgICAgICAgJ0tleSBTY29wZSc6IHByb3Zpc2lvbmVkLnNjb3BlID8/ICcobm9uZSDigJQgZnVsbCBwbGF0Zm9ybSBjcmVkZW50aWFsKScsXG4gICAgICAgICAgICAnS2V5IElkJzogcHJvdmlzaW9uZWQua2V5SWQsXG4gICAgICAgICAgICAnRXhwaXJlcyBJbic6IGAke2RheXN9IGRheXNgLFxuICAgICAgICAgICAgJ1JlbmV3IEJ5JzogcHJvdmlzaW9uZWQuZXhwaXJlc0F0LFxuICAgICAgICAgICAgJ0F1dG8tUm90YXRlJzogc2NoZWR1bGVFeHByZXNzaW9uID8gYOKckyAke3NjaGVkdWxlRXhwcmVzc2lvbn1gIDogJ29mZiAocGFzcyAtLXNjaGVkdWxlIHRvIGVuYWJsZSknLFxuICAgICAgICAgICAgJ1N0YXR1cyc6ICfinJMgU3RvcmVkJyxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgICBwcmludFN1Y2Nlc3MoJ0tleSBzdG9yZWQuIFRvIHVzZSB3aXRoIHN5bnRoL2RlcGxveTonKTtcbiAgICAgICAgICBwcmludEluZm8oYCAgZXhwb3J0IFBMQVRGT1JNX1NFQ1JFVF9OQU1FPSR7c2VjcmV0TmFtZX1gKTtcbiAgICAgICAgICBwcmludEluZm8oJyAgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aCAtLWlkIDxwaXBlbGluZS1pZD4gLS1zdG9yZS10b2tlbnMnKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgaWYgKHNjaGVkdWxlRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgcHJpbnRJbmZvKGBBdXRvLXJvdGF0aW9uIGlzIGFjdGl2ZSAoJHtzY2hlZHVsZUV4cHJlc3Npb259KTsgdGhlIHNlY3JldCBpcyByZXBsYWNlZCBiZWZvcmUgJHtwcm92aXNpb25lZC5leHBpcmVzQXR9LmApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcmludEluZm8oYFJvdGF0ZSBiZWZvcmUgJHtwcm92aXNpb25lZC5leHBpcmVzQXR9IHdpdGg6IHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW4gLS1kYXlzICR7ZGF5c31gKTtcbiAgICAgICAgICAgIHByaW50SW5mbygnICAob3IgcGFzcyAtLXNjaGVkdWxlIHRvIGluc3RhbGwgYSBkYWlseSBhdXRvLXJvdGF0aW9uIHN0YWNrKScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuQVBJX1JFUVVFU1QsIHtcbiAgICAgICAgICBkZWJ1ZzogcHJvZ3JhbS5vcHRzKCkuZGVidWcsXG4gICAgICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICBjb21tYW5kOiAnc3RvcmUtdG9rZW4nLFxuICAgICAgICAgICAgZXhlY3V0aW9uSWQsXG4gICAgICAgICAgICBzZWNyZXROYW1lOiBwcm9jZXNzLmVudi5QTEFURk9STV9TRUNSRVRfTkFNRSB8fCAnKGRlcml2ZWQgZnJvbSB0aGUgb3JnKScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG59XG4iXX0=
|
|
411
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtdG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvc3RvcmUtdG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxZQUFZLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRixPQUFPLEVBQUUsOEJBQThCLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JLLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFB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QUFJO2dCQUNWLE9BQU8sRUFBRTtvQkFDUCxPQUFPLEVBQUUsYUFBYTtvQkFDdEIsV0FBVztvQkFDWCxVQUFVLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsSUFBSSx3QkFBd0I7aUJBQ3pFO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IExhbWJkYUNsaWVudCwgVXBkYXRlRnVuY3Rpb25Db2RlQ29tbWFuZCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1sYW1iZGEnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBBUFBfVkVSU0lPTiwgdmFsaWRhdGVOdW1iZXIgfSBmcm9tICcuLi9jb25maWcvY2xpLmNvbnN0YW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEFwaUNsaWVudCB9IGZyb20gJy4uL3V0aWxzL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHsgYXVkaXRMb2cgfSBmcm9tICcuLi91dGlscy9hdWRpdC1sb2cuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUF3c1JlZ2lvbiB9IGZyb20gJy4uL3V0aWxzL2F3cy1lbnYuanMnO1xuaW1wb3J0IHsgdXBzZXJ0U2VjcmV0LCBnZXRTZWNyZXRBcm4sIGdldFNlY3JldFZhbHVlIH0gZnJvbSAnLi4vdXRpbHMvYXdzLXNlY3JldHMuanMnO1xuaW1wb3J0IHsgY3JlYXRlQXV0aGVudGljYXRlZENsaWVudEFzeW5jLCBwcmludENvbW1hbmRIZWFkZXIsIHByaW50U3NsV2FybmluZywgd2l0aFByb2ZpbGVPcHRpb24sIHdpdGhSZWdpb25PcHRpb24sIHdpdGhTc2xPcHRpb25zIH0gZnJvbSAnLi4vdXRpbHMvY29tbWFuZC11dGlscy5qcyc7XG5pbXBvcnQgeyB0b0V2ZW50QnJpZGdlQ3JvbiB9IGZyb20gJy4uL3V0aWxzL2Nyb24uanMnO1xuaW1wb3J0IHsgRVJST1JfQ09ERVMsIGhhbmRsZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3ItaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBwcmludEluZm8sIHByaW50S2V5VmFsdWUsIHByaW50U2VjdGlvbiwgcHJpbnRTdWNjZXNzLCBwcmludFdhcm5pbmcgfSBmcm9tICcuLi91dGlscy9vdXRwdXQtdXRpbHMuanMnO1xuaW1wb3J0IHsgZW5zdXJlUGxhdGZvcm1Ub2tlbiwgc2NvcGVTZWNyZXRMZWFmLCBzZWNyZXROYW1lRm9yT3JnIH0gZnJvbSAnLi4vdXRpbHMvcGxhdGZvcm0tc2VjcmV0LmpzJztcbmltcG9ydCB7IHByb3Zpc2lvblNlcnZpY2VBY2NvdW50S2V5LCByZXZva2VTZXJ2aWNlQWNjb3VudEtleSwgdHlwZSBQcm92aXNpb25lZEtleSB9IGZyb20gJy4uL3V0aWxzL3NlcnZpY2UtYWNjb3VudC5qcyc7XG5cbi8vIEVTTSBoYXMgbm8gX19kaXJuYW1lOyBkZXJpdmUgaXQgZnJvbSB0aGlzIG1vZHVsZSdzIFVSTC5cbmNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuXG5jb25zdCBSRU5FV19TVEFDS19OQU1FID0gJ3BpcGVsaW5lLWJ1aWxkZXItdG9rZW4tcmVuZXcnO1xuLy8gQ0ZOLW1hbmFnZWQgTGFtYmRhIGZ1bmN0aW9uIG5hbWUg4oCUIGtlZXAgaW4gc3luYyB3aXRoIHRva2VuLXJlbmV3LXN0YWNrLmpzb24uXG5jb25zdCBSRU5FV19MQU1CREFfTkFNRSA9ICdwaXBlbGluZS1idWlsZGVyLXRva2VuLXJlbmV3Jztcbi8vIERlZmF1bHQgNS1maWVsZCBjcm9uIChkYWlseSBhdCBtaWRuaWdodCkgd2hlbiBuZWl0aGVyIC0tY3JvbiBub3IgVE9LRU5fUkVORVdfU0NIRURVTEUgaXMgc2V0LlxuY29uc3QgREVGQVVMVF9SRU5FV19DUk9OID0gJzAgMCAqICogKic7XG5cbi8qKlxuICogQ2FwYWJpbGl0eSBzY29wZXMgYSBzdG9yZWQgY3JlZGVudGlhbCBtYXkgY2FycnksIGFuZCB3aGF0IGVhY2ggb25lIGlzIEZPUi5cbiAqXG4gKiBBIHNjb3BlZCBrZXkgZXhjaGFuZ2VzIHRvIGEgdG9rZW4gd2l0aCBubyBwZXJtaXNzaW9ucyBhbmQgbm8gYWRtaW4gZmxhZ3MgYXRcbiAqIGFsbCDigJQgb25seSB0aGUgb25lIGNhcGFiaWxpdHkg4oCUIHNvIGl0IGlzIHRoZSBzaGFwZSBldmVyeSBhdXRvbWF0aW9uIHRoYXQgZG9lc1xuICogZXhhY3RseSBvbmUgdGhpbmcgc2hvdWxkIGhvbGQuIFRoZSB1bnNjb3BlZCBgcGxhdGZvcm1gIGNyZWRlbnRpYWwgaXMgdGhlXG4gKiByZW1haW5pbmcgZnVsbC1wcml2aWxlZ2Ugb25lOiBzeW50aC9kZXBsb3kgY2FsbGJhY2tzIGFuZCB0aGUgcGx1Z2luLWxvb2t1cFxuICogTGFtYmRhIGNhbGwgdGhlIG9yZGluYXJ5IEFQSSBzdXJmYWNlLCB3aGljaCBubyBzaW5nbGUgc2NvcGUgY292ZXJzLlxuICovXG5jb25zdCBTQ09QRV9DQVRBTE9HOiBSZWNvcmQ8c3RyaW5nLCB7IGFjY291bnQ6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZyB9PiA9IHtcbiAgJ3JlcG9ydGluZzppbmdlc3QnOiB7XG4gICAgYWNjb3VudDogJ3JlcG9ydGluZy1pbmdlc3QnLFxuICAgIGRlc2NyaXB0aW9uOiAnQVdTIHBpcGVsaW5lLWV2ZW50IGluZ2VzdGlvbiAodGhlIGV2ZW50cyBMYW1iZGEgUE9TVHMgL3JlcG9ydHMvZXZlbnRzKScsXG4gIH0sXG4gICdyZWdpc3RyeTpwdXNoJzoge1xuICAgIGFjY291bnQ6ICdyZWdpc3RyeS1wdXNoJyxcbiAgICBkZXNjcmlwdGlvbjogJ0NJIGltYWdlIHB1c2hlcyBpbnRvIHRoaXMgb3Jn4oCZcyByZWdpc3RyeSBuYW1lc3BhY2UgKENvZGVCdWlsZCDihpIgL3Rva2VuKScsXG4gIH0sXG59O1xuXG4vKiogVGhlIGFjY291bnQgdGhhdCBob2xkcyB0aGUgdW5zY29wZWQsIGZ1bGwtcHJpdmlsZWdlIHN0b3JlZCBjcmVkZW50aWFsLiAqL1xuY29uc3QgUExBVEZPUk1fQUNDT1VOVCA9IHtcbiAgYWNjb3VudDogJ3BsYXRmb3JtLWF1dG9tYXRpb24nLFxuICBkZXNjcmlwdGlvbjogJ1N0b3JlZCBwbGF0Zm9ybSBjcmVkZW50aWFsIGZvciBDREsgc3ludGgvZGVwbG95LCBwbHVnaW4gbG9va3VwIGFuZCBpbWFnZSBwdXNoZXMnLFxufTtcblxuLyoqXG4gKiBEZXBsb3kgKG9yIHVwZGF0ZSkgdGhlIG9uY2UtYS1kYXkgS0VZIFJPVEFUSU9OIHN0YWNrOiBhIHNjaGVkdWxlZCBMYW1iZGEgdGhhdFxuICogcmVwbGFjZXMgdGhlIHNlcnZpY2UtYWNjb3VudCBrZXkgaW4gdGhpcyBzZWNyZXQgYmVmb3JlIGl0IGV4cGlyZXMuIE1pcnJvcnNcbiAqIHNldHVwLWV2ZW50cyDigJQgYGF3cyBjbG91ZGZvcm1hdGlvbiBkZXBsb3lgIGZvciB0aGUgaW5mcmEsIHRoZW4gYSBkaXJlY3RcbiAqIFVwZGF0ZUZ1bmN0aW9uQ29kZSB3aXRoIHRoZSByb3RhdG9yIGhhbmRsZXIgY29tcGlsZWQgYWxvbmdzaWRlIHRoaXMgQ0xJIChzZWVcbiAqIHNyYy9sYW1iZGEvdG9rZW4tcmVuZXctaGFuZGxlci50cykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlcGxveVJlbmV3U2NoZWR1bGUob3B0czoge1xuICBzZWNyZXROYW1lOiBzdHJpbmc7XG4gIGRheXM6IG51bWJlcjtcbiAgZml2ZUZpZWxkQ3Jvbjogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgcHJvZmlsZT86IHN0cmluZztcbn0pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBzY2hlZHVsZUV4cHJlc3Npb24gPSB0b0V2ZW50QnJpZGdlQ3JvbihvcHRzLmZpdmVGaWVsZENyb24pOyAvLyB2YWxpZGF0ZXMgKyAxNS1taW4gZ3VhcmRcblxuICAvLyBOYW1lIHJlbmV3YWwgcmVzb3VyY2VzIHBlci1zZWNyZXQgc28gYSBzY29wZWQtY3JlZGVudGlhbCBzdGFjayAoZS5nLiB0aGVcbiAgLy8gcmVwb3J0aW5nLWluZ2VzdCBrZXkgdGhlIGV2ZW50IExhbWJkYSByZWFkcykgY29leGlzdHMgd2l0aCB0aGVcbiAgLy8gcGxhdGZvcm0tY3JlZGVudGlhbCBzdGFjayBpbnN0ZWFkIG9mIGNvbGxpZGluZyBvbiB0aGUgKGFjY291bnQtZ2xvYmFsKSBJQU1cbiAgLy8gcm9sZSAvIExhbWJkYSAvIHJ1bGUgbmFtZXMuIFRoZSBwbGF0Zm9ybSBzZWNyZXQga2VlcHMgdGhlIGJhcmUgbmFtZVxuICAvLyAoc3VmZml4ICcnKSBzbyBleGlzdGluZyBkZXBsb3ltZW50cycgc3RhY2sgaXMgdXBkYXRlZCBpbiBwbGFjZSwgbm90XG4gIC8vIGR1cGxpY2F0ZWQ7IGFueSBvdGhlciBzZWNyZXQgYXBwZW5kcyBpdHMgdHJhaWxpbmcgcGF0aCBzZWdtZW50LlxuICBjb25zdCBzZWNyZXRMZWFmID0gb3B0cy5zZWNyZXROYW1lLnJlcGxhY2UoLy4qXFwvLywgJycpOyAvLyAncGxhdGZvcm0nIHwgJ3JlcG9ydGluZy1pbmdlc3QnIHwg4oCmXG4gIGNvbnN0IG5hbWVTdWZmaXggPSBzZWNyZXRMZWFmID09PSAncGxhdGZvcm0nID8gJycgOiBgLSR7c2VjcmV0TGVhZi5yZXBsYWNlKC9bXmEtejAtOV0rL2dpLCAnLScpfWA7XG4gIGNvbnN0IHN0YWNrTmFtZSA9IGAke1JFTkVXX1NUQUNLX05BTUV9JHtuYW1lU3VmZml4fWA7XG4gIGNvbnN0IGxhbWJkYU5hbWUgPSBgJHtSRU5FV19MQU1CREFfTkFNRX0ke25hbWVTdWZmaXh9YDtcblxuICBwcmludFNlY3Rpb24oJ1NjaGVkdWxlIFJvdGF0aW9uJyk7XG4gIHByaW50SW5mbygnUGFyYW1ldGVycycsIHtcbiAgICBzdGFjazogc3RhY2tOYW1lLFxuICAgIHNjaGVkdWxlOiBvcHRzLmZpdmVGaWVsZENyb24sXG4gICAgZXZlbnRicmlkZ2U6IHNjaGVkdWxlRXhwcmVzc2lvbixcbiAgICByZW5ld0RheXM6IG9wdHMuZGF5cyxcbiAgfSk7XG5cbiAgLy8gU3RlcCAxOiBpbmZyYSAoTGFtYmRhIGdldHMgcGxhY2Vob2xkZXIgY29kZSBvbiBmaXJzdCBjcmVhdGUpLlxuICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vdGVtcGxhdGVzL3Rva2VuLXJlbmV3LXN0YWNrLmpzb24nKTtcbiAgY29uc3QgY2ZuQXJncyA9IFtcbiAgICAnY2xvdWRmb3JtYXRpb24nLCAnZGVwbG95JyxcbiAgICAnLS1zdGFjay1uYW1lJywgc3RhY2tOYW1lLFxuICAgICctLXRlbXBsYXRlLWZpbGUnLCB0ZW1wbGF0ZVBhdGgsXG4gICAgJy0tcGFyYW1ldGVyLW92ZXJyaWRlcycsXG4gICAgYFBsYXRmb3JtU2VjcmV0TmFtZT0ke29wdHMuc2VjcmV0TmFtZX1gLFxuICAgIGBSZW5ld0RheXM9JHtvcHRzLmRheXN9YCxcbiAgICBgU2NoZWR1bGVFeHByZXNzaW9uPSR7c2NoZWR1bGVFeHByZXNzaW9ufWAsXG4gICAgYE5hbWVTdWZmaXg9JHtuYW1lU3VmZml4fWAsXG4gICAgLy8gUmVjb3JkZWQgZm9yIHByb3ZlbmFuY2Ugb25seSDigJQgdGhlIHJvdGF0b3IgZG9lcyBub3QgaW5zdGFsbCB0aGUgQ0xJIGF0XG4gICAgLy8gcnVudGltZSAoaXQgc3BlYWtzIHRvIHRoZSBwbGF0Zm9ybSBkaXJlY3RseSksIGJ1dCBrbm93aW5nIHdoaWNoIENMSVxuICAgIC8vIGRlcGxveWVkIGEgc3RhY2sgaXMgd29ydGgga2VlcGluZy5cbiAgICBgUGlwZWxpbmVNYW5hZ2VyVmVyc2lvbj0ke0FQUF9WRVJTSU9OfWAsXG4gICAgJy0tY2FwYWJpbGl0aWVzJywgJ0NBUEFCSUxJVFlfTkFNRURfSUFNJyxcbiAgICAnLS1uby1mYWlsLW9uLWVtcHR5LWNoYW5nZXNldCcsXG4gICAgJy0tcmVnaW9uJywgb3B0cy5yZWdpb24sXG4gIF07XG4gIGlmIChvcHRzLnByb2ZpbGUpIGNmbkFyZ3MucHVzaCgnLS1wcm9maWxlJywgb3B0cy5wcm9maWxlKTtcbiAgZXhlY0ZpbGVTeW5jKCdhd3MnLCBjZm5BcmdzLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG5cbiAgLy8gU3RlcCAyOiB1cGxvYWQgdGhlIHJlYWwgaGFuZGxlci4gSXQncyBFU00sIHNvIHRoZSB6aXAgZW50cnkgbXVzdCBiZSBpbmRleC5tanNcbiAgLy8gKEhhbmRsZXIgc3RheXMgaW5kZXguaGFuZGxlciDigJQgbm9kZWpzMjQueCByZXNvbHZlcyB0aGUgLm1qcyBleHRlbnNpb24pLlxuICBjb25zdCBoYW5kbGVyU3JjID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2xhbWJkYS90b2tlbi1yZW5ldy1oYW5kbGVyLmpzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhoYW5kbGVyU3JjKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVG9rZW4tcmVuZXcgaGFuZGxlciBub3QgZm91bmQgYXQgJHtoYW5kbGVyU3JjfSDigJQgd2FzIHRoZSBwYWNrYWdlIGJ1aWx0P2ApO1xuICB9XG4gIGNvbnN0IHRtcERpciA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3Rva2VuLXJlbmV3LScpKTtcbiAgdHJ5IHtcbiAgICBmcy5jb3B5RmlsZVN5bmMoaGFuZGxlclNyYywgcGF0aC5qb2luKHRtcERpciwgJ2luZGV4Lm1qcycpKTtcbiAgICBjb25zdCB6aXBQYXRoID0gcGF0aC5qb2luKHRtcERpciwgJ2luZGV4LnppcCcpO1xuICAgIGV4ZWNGaWxlU3luYygnemlwJywgWyctaicsIHppcFBhdGgsICdpbmRleC5tanMnXSwgeyBjd2Q6IHRtcERpciwgc3RkaW86ICdwaXBlJyB9KTtcblxuICAgIGNvbnN0IGxhbWJkYUNsaWVudCA9IG5ldyBMYW1iZGFDbGllbnQoeyByZWdpb246IG9wdHMucmVnaW9uIH0pO1xuICAgIGF3YWl0IGxhbWJkYUNsaWVudC5zZW5kKG5ldyBVcGRhdGVGdW5jdGlvbkNvZGVDb21tYW5kKHtcbiAgICAgIEZ1bmN0aW9uTmFtZTogbGFtYmRhTmFtZSxcbiAgICAgIFppcEZpbGU6IGZzLnJlYWRGaWxlU3luYyh6aXBQYXRoKSxcbiAgICB9KSk7XG4gIH0gZmluYWxseSB7XG4gICAgZnMucm1TeW5jKHRtcERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpbnRTdWNjZXNzKGBSb3RhdGlvbiBzY2hlZHVsZWQgKCR7c2NoZWR1bGVFeHByZXNzaW9ufSlgKTtcbiAgcmV0dXJuIHNjaGVkdWxlRXhwcmVzc2lvbjtcbn1cblxuLyoqIFJlYWQgdGhlIGtleSBpZCBhIHByZXZpb3VzIHJ1biBzdG9yZWQsIHNvIHRoaXMgcnVuIGNhbiByZXRpcmUgaXQuICovXG5hc3luYyBmdW5jdGlvbiBwcmV2aW91c0tleUlkKFxuICBzZWNyZXROYW1lOiBzdHJpbmcsXG4gIGF3czogeyByZWdpb246IHN0cmluZzsgcHJvZmlsZT86IHN0cmluZyB9LFxuKTogUHJvbWlzZTx7IGtleUlkPzogc3RyaW5nOyBzZXJ2aWNlQWNjb3VudElkPzogc3RyaW5nIH0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBhd2FpdCBnZXRTZWNyZXRWYWx1ZShzZWNyZXROYW1lLCBhd3MpO1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyB7IGtleUlkPzogc3RyaW5nOyBzZXJ2aWNlQWNjb3VudElkPzogc3RyaW5nIH07XG4gICAgcmV0dXJuIHsga2V5SWQ6IHBhcnNlZC5rZXlJZCwgc2VydmljZUFjY291bnRJZDogcGFyc2VkLnNlcnZpY2VBY2NvdW50SWQgfTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gc2VjcmV0IHlldCAoZmlyc3QgcnVuKSwgb3Igb25lIHdyaXR0ZW4gYmVmb3JlIHRoZSBzZXJ2aWNlLWFjY291bnRcbiAgICAvLyBjdXRvdmVyIChubyBrZXlJZCkuIEVpdGhlciB3YXkgdGhlcmUgaXMgbm90aGluZyB0aGlzIHJ1biBjYW4gcmV0aXJlLlxuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG4vKiogV2hhdCBhIGRyeSBydW4gcmVwb3J0cyBpdCBXT1VMRCBwcm92aXNpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JlVG9rZW5QbGFuIHtcbiAgc2VydmljZUFjY291bnQ6IHN0cmluZztcbiAgcm9sZXM6IHN0cmluZztcbiAgc2NvcGU6IHN0cmluZztcbiAgc2VjcmV0TmFtZTogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgZXhwaXJlc0luRGF5czogbnVtYmVyO1xufVxuXG4vKiogUHJpbnQgdGhlIGRyeS1ydW4gcGxhbiAoSlNPTiBvciBodW1hbikuIFN0YXlzIGVudGlyZWx5IG9mZmxpbmUuICovXG5leHBvcnQgZnVuY3Rpb24gcHJpbnREcnlSdW5QbGFuKHBsYW46IFN0b3JlVG9rZW5QbGFuLCBqc29uOiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChqc29uKSB7XG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyBzdWNjZXNzOiB0cnVlLCBkcnlSdW46IHRydWUsIC4uLnBsYW4gfSwgbnVsbCwgMikpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLmxvZygnJyk7XG4gIHByaW50U2VjdGlvbignRHJ5IFJ1biDigJQgTm8gQ2hhbmdlcyBNYWRlJyk7XG4gIHByaW50S2V5VmFsdWUoe1xuICAgICdTZXJ2aWNlIEFjY291bnQnOiBwbGFuLnNlcnZpY2VBY2NvdW50LFxuICAgICdSb2xlcyc6IHBsYW4ucm9sZXMsXG4gICAgJ0tleSBTY29wZSc6IHBsYW4uc2NvcGUsXG4gICAgJ1NlY3JldCBOYW1lJzogcGxhbi5zZWNyZXROYW1lLFxuICAgICdSZWdpb24nOiBwbGFuLnJlZ2lvbixcbiAgICAnRXhwaXJlcyBJbic6IGAke3BsYW4uZXhwaXJlc0luRGF5c30gZGF5c2AsXG4gIH0pO1xuICBwcmludFN1Y2Nlc3MoJ0RyeSBydW4gY29tcGxldGUg4oCUIG5vIGFjY291bnQsIGtleSBvciBzZWNyZXQgd2FzIGNyZWF0ZWQnKTtcbn1cblxuLyoqXG4gKiBUaGUgU2VjcmV0cyBNYW5hZ2VyIHBheWxvYWQ6IGB7IHVzZXJuYW1lOiBvcmdJZCwgcGFzc3dvcmQ6IDxwYl9zYV8ga2V5PiwgLi4ubWV0YWRhdGEgfWAuXG4gKiAtIHVzZXJuYW1lL3Bhc3N3b3JkIHNhdGlzZnkgQ29kZUJ1aWxkJ3MgYHNlY3JldHNNYW5hZ2VyQ3JlZGVudGlhbHNgIChIVFRQXG4gKiAgIEJhc2ljLCBzZW50IHRvIHBpcGVsaW5lLWltYWdlLXJlZ2lzdHJ5J3MgL3Rva2VuIGVuZHBvaW50LCB3aGljaCBleGNoYW5nZXNcbiAqICAgdGhlIG9wYXF1ZSBrZXkgbGlrZSBldmVyeSBvdGhlciBzZXJ2aWNlIGRvZXMpLlxuICogLSBgcGFzc3dvcmRgIGlzIHRoZSBjYW5vbmljYWwgZmllbGQ6IHRoZSBwbHVnaW4tbG9va3VwIExhbWJkYSwgdGhlIGV2ZW50c1xuICogICBMYW1iZGEgYW5kIGAtLXN0b3JlLXRva2Vuc2AgYWxsIHJlYWQgaXQuXG4gKiAtIGtleUlkIC8gc2VydmljZUFjY291bnRJZCBhcmUgd2hhdCB0aGUgcm90YXRpb24gTGFtYmRhIG5lZWRzIHRvIHJldGlyZSB0aGVcbiAqICAga2V5IGl0IHJlcGxhY2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTZWNyZXRWYWx1ZShwcm92aXNpb25lZDogUHJvdmlzaW9uZWRLZXksIHBsYXRmb3JtVXJsOiBzdHJpbmcsIGV4cGlyZXNJblNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgdXNlcm5hbWU6IHByb3Zpc2lvbmVkLm9yZ2FuaXphdGlvbklkLFxuICAgIHBhc3N3b3JkOiBwcm92aXNpb25lZC5rZXksXG4gICAgcGxhdGZvcm1VcmwsXG4gICAgb3JnYW5pemF0aW9uSWQ6IHByb3Zpc2lvbmVkLm9yZ2FuaXphdGlvbklkLFxuICAgIHNlcnZpY2VBY2NvdW50SWQ6IHByb3Zpc2lvbmVkLnNlcnZpY2VBY2NvdW50SWQsXG4gICAgc2VydmljZUFjY291bnROYW1lOiBwcm92aXNpb25lZC5zZXJ2aWNlQWNjb3VudE5hbWUsXG4gICAga2V5SWQ6IHByb3Zpc2lvbmVkLmtleUlkLFxuICAgIHNjb3BlOiBwcm92aXNpb25lZC5zY29wZSxcbiAgICBleHBpcmVzSW46IGV4cGlyZXNJblNlY29uZHMsXG4gICAgZXhwaXJlc0F0OiBwcm92aXNpb25lZC5leHBpcmVzQXQsXG4gICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gIH0pO1xufVxuXG4vKipcbiAqIFJldGlyZSB0aGUgY3JlZGVudGlhbCB0aGlzIHJ1biByZXBsYWNlZCDigJQgQUZURVIgdGhlIG5ldyBvbmUgaXMgc3RvcmVkLCBuZXZlclxuICogYmVmb3JlLiBBIGZhaWx1cmUgaGVyZSBsZWF2ZXMgYSBzdXBlcmZsdW91cyBrZXkgdGhhdCBleHBpcmVzIG9uIGl0cyBvd247XG4gKiBkb2luZyBpdCBpbiB0aGUgb3RoZXIgb3JkZXIgd291bGQgbGVhdmUgdGhlIHNlY3JldCBuYW1pbmcgYSByZXZva2VkIGtleSBpZlxuICogdGhlIHdyaXRlIGZhaWxlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJldGlyZVByZXZpb3VzS2V5KFxuICBjbGllbnQ6IEFwaUNsaWVudCxcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgcHJvdmlzaW9uZWQ6IFByb3Zpc2lvbmVkS2V5LFxuICBwcmV2aW91czogeyBrZXlJZD86IHN0cmluZzsgc2VydmljZUFjY291bnRJZD86IHN0cmluZyB9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghcHJldmlvdXMua2V5SWQgfHwgcHJldmlvdXMuc2VydmljZUFjY291bnRJZCAhPT0gcHJvdmlzaW9uZWQuc2VydmljZUFjY291bnRJZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGF3YWl0IHJldm9rZVNlcnZpY2VBY2NvdW50S2V5KFxuICAgICAgY2xpZW50LCBwYXNzd29yZCwgcHJvdmlzaW9uZWQub3JnYW5pemF0aW9uSWQsIHByb3Zpc2lvbmVkLnNlcnZpY2VBY2NvdW50SWQsIHByZXZpb3VzLmtleUlkLFxuICAgICk7XG4gICAgcHJpbnRTdWNjZXNzKGBSZXRpcmVkIHRoZSBwcmV2aW91cyBrZXkgKCR7cHJldmlvdXMua2V5SWR9KWApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBwcmludFdhcm5pbmcoXG4gICAgICBgU3RvcmVkIHRoZSBuZXcga2V5LCBidXQgY291bGQgbm90IHJldm9rZSB0aGUgcHJldmlvdXMgb25lICgke3ByZXZpb3VzLmtleUlkfSk6IGBcbiAgICAgICsgYCR7ZXJyb3JNZXNzYWdlKGVycil9LiBJdCBleHBpcmVzIG9uIGl0cyBvd247IHJldm9rZSBpdCBmcm9tIGBcbiAgICAgICsgJ1NldHRpbmdzIOKGkiBTZXJ2aWNlIGFjY291bnRzIGlmIHlvdSB3YW50IGl0IGdvbmUgbm93LicsXG4gICAgKTtcbiAgfVxufVxuXG4vKiogUHJpbnQgdGhlIHN0b3JlZCBrZXkncyBzdW1tYXJ5IChKU09OIG9yIGh1bWFuKSBwbHVzIHRoZSBuZXh0IHN0ZXBzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RvcmVkS2V5KHI6IHtcbiAganNvbjogYm9vbGVhbjtcbiAgc2VjcmV0TmFtZTogc3RyaW5nO1xuICBhcm46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIGFjY291bnROYW1lOiBzdHJpbmc7XG4gIHByb3Zpc2lvbmVkOiBQcm92aXNpb25lZEtleTtcbiAgZGF5czogbnVtYmVyO1xuICBzY2hlZHVsZUV4cHJlc3Npb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn0pOiB2b2lkIHtcbiAgY29uc3QgeyBzZWNyZXROYW1lLCBhcm4sIHJlZ2lvbiwgYWNjb3VudE5hbWUsIHByb3Zpc2lvbmVkLCBkYXlzLCBzY2hlZHVsZUV4cHJlc3Npb24gfSA9IHI7XG4gIGlmIChyLmpzb24pIHtcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgc2VjcmV0TmFtZSxcbiAgICAgIHNlY3JldEFybjogYXJuLFxuICAgICAgcmVnaW9uLFxuICAgICAgc2VydmljZUFjY291bnQ6IGFjY291bnROYW1lLFxuICAgICAgc2VydmljZUFjY291bnRJZDogcHJvdmlzaW9uZWQuc2VydmljZUFjY291bnRJZCxcbiAgICAgIGtleUlkOiBwcm92aXNpb25lZC5rZXlJZCxcbiAgICAgIHNjb3BlOiBwcm92aXNpb25lZC5zY29wZSxcbiAgICAgIGV4cGlyZXNJbkRheXM6IGRheXMsXG4gICAgICBleHBpcmVzQXQ6IHByb3Zpc2lvbmVkLmV4cGlyZXNBdCxcbiAgICAgIHNjaGVkdWxlOiBzY2hlZHVsZUV4cHJlc3Npb24gPz8gbnVsbCxcbiAgICB9LCBudWxsLCAyKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coJycpO1xuICAgIHByaW50U2VjdGlvbignS2V5IFN0b3JlZCcpO1xuXG4gICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAnU2VjcmV0IE5hbWUnOiBzZWNyZXROYW1lLFxuICAgICAgJ1NlY3JldCBBUk4nOiBhcm4sXG4gICAgICAnUmVnaW9uJzogcmVnaW9uLFxuICAgICAgJ1NlcnZpY2UgQWNjb3VudCc6IGFjY291bnROYW1lLFxuICAgICAgJ0tleSBTY29wZSc6IHByb3Zpc2lvbmVkLnNjb3BlID8/ICcobm9uZSDigJQgZnVsbCBwbGF0Zm9ybSBjcmVkZW50aWFsKScsXG4gICAgICAnS2V5IElkJzogcHJvdmlzaW9uZWQua2V5SWQsXG4gICAgICAnRXhwaXJlcyBJbic6IGAke2RheXN9IGRheXNgLFxuICAgICAgJ1JlbmV3IEJ5JzogcHJvdmlzaW9uZWQuZXhwaXJlc0F0LFxuICAgICAgJ0F1dG8tUm90YXRlJzogc2NoZWR1bGVFeHByZXNzaW9uID8gYOKckyAke3NjaGVkdWxlRXhwcmVzc2lvbn1gIDogJ29mZiAocGFzcyAtLXNjaGVkdWxlIHRvIGVuYWJsZSknLFxuICAgICAgJ1N0YXR1cyc6ICfinJMgU3RvcmVkJyxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICBwcmludFN1Y2Nlc3MoJ0tleSBzdG9yZWQuIFRvIHVzZSB3aXRoIHN5bnRoL2RlcGxveTonKTtcbiAgICBwcmludEluZm8oYCAgZXhwb3J0IFBMQVRGT1JNX1NFQ1JFVF9OQU1FPSR7c2VjcmV0TmFtZX1gKTtcbiAgICBwcmludEluZm8oJyAgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aCAtLWlkIDxwaXBlbGluZS1pZD4gLS1zdG9yZS10b2tlbnMnKTtcbiAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgaWYgKHNjaGVkdWxlRXhwcmVzc2lvbikge1xuICAgICAgcHJpbnRJbmZvKGBBdXRvLXJvdGF0aW9uIGlzIGFjdGl2ZSAoJHtzY2hlZHVsZUV4cHJlc3Npb259KTsgdGhlIHNlY3JldCBpcyByZXBsYWNlZCBiZWZvcmUgJHtwcm92aXNpb25lZC5leHBpcmVzQXR9LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmludEluZm8oYFJvdGF0ZSBiZWZvcmUgJHtwcm92aXNpb25lZC5leHBpcmVzQXR9IHdpdGg6IHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW4gLS1kYXlzICR7ZGF5c31gKTtcbiAgICAgIHByaW50SW5mbygnICAob3IgcGFzcyAtLXNjaGVkdWxlIHRvIGluc3RhbGwgYSBkYWlseSBhdXRvLXJvdGF0aW9uIHN0YWNrKScpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgYHN0b3JlLXRva2VuYCBjb21tYW5kIHdpdGggdGhlIENMSSBwcm9ncmFtLlxuICpcbiAqIFByb3Zpc2lvbnMgdGhlIG9yZydzIG1hY2hpbmUgaWRlbnRpdHkg4oCUIGEgU0VSVklDRSBBQ0NPVU5UIGFuZCBvbmUgYHBiX3NhX+KApmBcbiAqIGtleSDigJQgYW5kIHN0b3JlcyB0aGUga2V5IGluIEFXUyBTZWNyZXRzIE1hbmFnZXIgZm9yIENESyBkZXBsb3ltZW50cyxcbiAqIENvZGVCdWlsZCdzIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzLCB0aGUgcGx1Z2luLWxvb2t1cCBMYW1iZGEgYW5kIHRoZSBldmVudFxuICogaW5nZXN0aW9uIExhbWJkYS4gTm90aGluZyBzdG9yZWQgaXMgdGllZCB0byBhIHBlcnNvbidzIHNlc3Npb24gYW55XG4gKiBtb3JlOiB0aGUgYWNjb3VudCBvdXRsaXZlcyBpdHMgY3JlYXRvciwgdGFrZXMgbm8gc2VhdCwgYW5kIGV2ZXJ5IGF1ZGl0IHJvdyBpdFxuICogcHJvZHVjZXMgbmFtZXMgdGhlIGFjY291bnQuXG4gKlxuICogQmVjYXVzZSBjcmVhdGluZyBhbiBhY2NvdW50IGFuZCBpc3N1aW5nIGl0cyBrZXkgYXJlIHN0ZXAtdXAgZ2F0ZWQsIHRoaXMgbmVlZHNcbiAqIHRoZSBvcGVyYXRvcidzIHBhc3N3b3JkIOKAlCBgLS1wYXNzd29yZGAsIG9yIHRoZSBgUExBVEZPUk1fUEFTU1dPUkRgIGVudiB2YXJcbiAqIChwcmVmZXJyZWQ6IGl0IGtlZXBzIHRoZSBwYXNzd29yZCBvdXQgb2Ygc2hlbGwgaGlzdG9yeSBhbmQgcGxhbiBvdXRwdXQpLlxuICpcbiAqIEJ5IGRlZmF1bHQgaXQgT05MWSB3cml0ZXMgdGhlIHNlY3JldC4gUGFzcyAtLXNjaGVkdWxlIHRvIGFsc28gZGVwbG95IHRoZSBkYWlseVxuICogS0VZIFJPVEFUSU9OIHN0YWNrIChhIExhbWJkYSB0aGF0IHJlcGxhY2VzIHRoZSBrZXkgYmVmb3JlIGl0IGV4cGlyZXMpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBiYXNoXG4gKiBQTEFURk9STV9QQVNTV09SRD0qKiogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXJlZ2lvbiB1cy1lYXN0LTFcbiAqIFBMQVRGT1JNX1BBU1NXT1JEPSoqKiBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuIC0tZGF5cyA5MCAtLXJlZ2lvbiB1cy1lYXN0LTFcbiAqIFBMQVRGT1JNX1BBU1NXT1JEPSoqKiBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuIC0tc2NoZWR1bGUgLS1yZWdpb24gdXMtZWFzdC0xICAgICAjICsgZGFpbHkgcm90YXRpb25cbiAqIFBMQVRGT1JNX1BBU1NXT1JEPSoqKiBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuIC0tc2NvcGUgcmVwb3J0aW5nOmluZ2VzdCAtLXNjaGVkdWxlXG4gKiBQTEFURk9STV9QQVNTV09SRD0qKiogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXNjb3BlIHJlZ2lzdHJ5OnB1c2ggLS1zY2hlZHVsZVxuICogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLWRyeS1ydW5cbiAqIHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW4gLXUgYWRtaW4gLXAgJyoqKicgLS1yZWdpb24gdXMtZWFzdC0xXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlVG9rZW4ocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICB3aXRoU3NsT3B0aW9ucyhcbiAgICB3aXRoUHJvZmlsZU9wdGlvbihcbiAgICAgIHdpdGhSZWdpb25PcHRpb24ocHJvZ3JhbVxuICAgICAgICAuY29tbWFuZCgnc3RvcmUtdG9rZW4nKVxuICAgICAgICAuZGVzY3JpcHRpb24oJ1Byb3Zpc2lvbiBhbiBvcmcgc2VydmljZS1hY2NvdW50IGtleSAoaXRzIG93biBtYWNoaW5lIGlkZW50aXR5KSBhbmQgc3RvcmUgaXQgaW4gQVdTIFNlY3JldHMgTWFuYWdlciBmb3IgQ0RLIGRlcGxveW1lbnRzJylcbiAgICAgICAgLm9wdGlvbignLXUsIC0taWRlbnRpZmllciA8aWRlbnRpZmllcj4nLCAnVXNlcm5hbWUgb3IgZW1haWwgKHNraXBzIFBMQVRGT1JNX1RPS0VOIHJlcXVpcmVtZW50KScpXG4gICAgICAgIC5vcHRpb24oJy1wLCAtLXBhc3N3b3JkIDxwYXNzd29yZD4nLCAnTG9naW4gcGFzc3dvcmQg4oCUIGFsc28gdXNlZCBmb3IgdGhlIHN0ZXAtdXAgZXZlcnkga2V5IHdyaXRlIHJlcXVpcmVzIChwcmVmZXIgUExBVEZPUk1fUEFTU1dPUkQpJylcbiAgICAgICAgLm9wdGlvbignLS1kYXlzIDxkYXlzPicsICdLZXkgbGlmZXRpbWUgaW4gZGF5cyAobWF4IDM2NSknLCAnMzAnKVxuICAgICAgICAub3B0aW9uKCctLXNjb3BlIDxzY29wZT4nLCBgUHJvdmlzaW9uIGEgbGVhc3QtcHJpdmlsZWdlIHNjb3BlZCBrZXkgaW5zdGVhZCBvZiB0aGUgZnVsbC1wcml2aWxlZ2UgcGxhdGZvcm0gb25lLiBPbmUgb2Y6ICR7T2JqZWN0LmtleXMoU0NPUEVfQ0FUQUxPRykuam9pbignLCAnKX1gKVxuICAgICAgICAub3B0aW9uKCctLWFjY291bnQgPG5hbWU+JywgJ092ZXJyaWRlIHRoZSBzZXJ2aWNlLWFjY291bnQgbmFtZSB0aGlzIGtleSBpcyBpc3N1ZWQgb24gKGRlZmF1bHQ6IGRlcml2ZWQgZnJvbSAtLXNjb3BlKScpXG4gICAgICAgIC5vcHRpb24oJy0tZHJ5LXJ1bicsICdTaG93IHdoYXQgd291bGQgYmUgcHJvdmlzaW9uZWQgd2l0aG91dCBjYWxsaW5nIHRoZSBwbGF0Zm9ybSBvciB3cml0aW5nIHRvIFNlY3JldHMgTWFuYWdlcicsIGZhbHNlKSksXG4gICAgKVxuICAgICAgLm9wdGlvbignLS1zY2hlZHVsZScsICdBbHNvIGRlcGxveSB0aGUgZGFpbHkga2V5LXJvdGF0aW9uIHN0YWNrIHRoYXQgcmVwbGFjZXMgdGhpcyBrZXkgYmVmb3JlIGl0IGV4cGlyZXMgKG9mZiBieSBkZWZhdWx0KScsIGZhbHNlKVxuICAgICAgLm9wdGlvbignLS1jcm9uIDxleHByPicsICdSb3RhdGlvbiBzY2hlZHVsZSBhcyBhIDUtZmllbGQgY3JvbiwgdXNlZCB3aXRoIC0tc2NoZWR1bGUgKGRlZmF1bHQ6IFRPS0VOX1JFTkVXX1NDSEVEVUxFIGVudiBvciBcIjAgMCAqICogKlwiOyBtaW4gZXZlcnkgMTUgbWludXRlcyknKVxuICAgICAgLm9wdGlvbignLS1qc29uJywgJ091dHB1dCByZXN1bHQgYXMgSlNPTicsIGZhbHNlKSxcbiAgKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbklkID0gcHJpbnRDb21tYW5kSGVhZGVyKCdTdG9yZSBUb2tlbicsIHVuZGVmaW5lZCwgeyBxdWlldDogb3B0aW9ucy5qc29uIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBwcmludFNzbFdhcm5pbmcob3B0aW9ucy52ZXJpZnlTc2wpO1xuXG4gICAgICAgIGNvbnN0IHJlZ2lvbiA9IHJlc29sdmVBd3NSZWdpb24ob3B0aW9ucy5yZWdpb24pO1xuICAgICAgICBjb25zdCBhd3MgPSB7IHJlZ2lvbiwgcHJvZmlsZTogb3B0aW9ucy5wcm9maWxlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCB9O1xuXG4gICAgICAgIGNvbnN0IGRheXMgPSB2YWxpZGF0ZU51bWJlcihvcHRpb25zLmRheXMsICdkYXlzJywgMSwgMzY1KTtcbiAgICAgICAgY29uc3QgZXhwaXJlc0luU2Vjb25kcyA9IGRheXMgKiAyNCAqIDYwICogNjA7XG5cbiAgICAgICAgY29uc3Qgc2NvcGUgPSBvcHRpb25zLnNjb3BlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgY2F0YWxvZ3VlZCA9IHNjb3BlID8gU0NPUEVfQ0FUQUxPR1tzY29wZV0gOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChzY29wZSAmJiAhY2F0YWxvZ3VlZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biAtLXNjb3BlIFwiJHtzY29wZX1cIi4gU3VwcG9ydGVkOiAke09iamVjdC5rZXlzKFNDT1BFX0NBVEFMT0cpLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2hpY2ggbWFjaGluZSBpZGVudGl0eSB0aGlzIGNyZWRlbnRpYWwgYmVsb25ncyB0bzogdGhlIHNjb3BlJ3Mgb3duXG4gICAgICAgIC8vIGFjY291bnQsIG9yIHRoZSBvcmcncyBzaW5nbGUgZnVsbC1wcml2aWxlZ2UgYXV0b21hdGlvbiBhY2NvdW50LlxuICAgICAgICBjb25zdCBpZGVudGl0eSA9IGNhdGFsb2d1ZWQgPz8gUExBVEZPUk1fQUNDT1VOVDtcbiAgICAgICAgY29uc3QgYWNjb3VudE5hbWUgPSAob3B0aW9ucy5hY2NvdW50IGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gaWRlbnRpdHkuYWNjb3VudDtcblxuICAgICAgICAvLyBTdGVwIDA6IGxvZyBpbiBmaXJzdCB3aGVuIGNyZWRzIGFyZSBhdmFpbGFibGUgYW5kIG5vIFBMQVRGT1JNX1RPS0VOIGlzXG4gICAgICAgIC8vIHNldCAoc2hhcmVkIHdpdGggc2V0dXAtZXZlbnRzKS4gQ3JlZHMgY29tZSBmcm9tIC0taWRlbnRpZmllci8tLXBhc3N3b3JkXG4gICAgICAgIC8vIE9SIHRoZSBlbnYgdmFycyBQTEFURk9STV9JREVOVElGSUVSL1BMQVRGT1JNX1BBU1NXT1JEIOKAlCB0aGUgZW52IHBhdGhcbiAgICAgICAgLy8gbGV0cyBjYWxsZXJzIGxpa2UgYHByb3Zpc2lvbiAtLXdpdGgtZXZlbnRzYCBwYXNzIHRoZW0gd2l0aG91dCBwdXR0aW5nXG4gICAgICAgIC8vIHRoZSBwYXNzd29yZCBvbiB0aGUgY29tbWFuZCBsaW5lICh3aGVyZSBpdCB3b3VsZCBzaG93IGluIHBsYW5zL2xvZ3MpLlxuICAgICAgICBhd2FpdCBlbnN1cmVQbGF0Zm9ybVRva2VuKG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIFRoZSBwYXNzd29yZCBpcyBBTFNPIHRoZSBzdGVwLXVwIGZhY3RvciBmb3IgYm90aCB3cml0ZXMgYmVsb3csIHNvIGl0IGlzXG4gICAgICAgIC8vIHJlcXVpcmVkIGV2ZW4gd2hlbiBQTEFURk9STV9UT0tFTiBpcyBhbHJlYWR5IHNldC4gU2F5IHRoYXQgcGxhaW5seVxuICAgICAgICAvLyByYXRoZXIgdGhhbiBmYWlsaW5nIHRocmVlIGNhbGxzIGxhdGVyIHdpdGggYSA0MDMuXG4gICAgICAgIGNvbnN0IHBhc3N3b3JkID0gKG9wdGlvbnMucGFzc3dvcmQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSB8fCBwcm9jZXNzLmVudi5QTEFURk9STV9QQVNTV09SRDtcbiAgICAgICAgaWYgKCFwYXNzd29yZCAmJiAhb3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnQSBwYXNzd29yZCBpcyByZXF1aXJlZDogY3JlYXRpbmcgYSBzZXJ2aWNlIGFjY291bnQgYW5kIGlzc3VpbmcgaXRzIGtleSBhcmUgYm90aCBzdGVwLXVwIGdhdGVkLiAnXG4gICAgICAgICAgICArICdTZXQgUExBVEZPUk1fUEFTU1dPUkQgKHByZWZlcnJlZCkgb3IgcGFzcyAtLXBhc3N3b3JkLicsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaW50U2VjdGlvbignUHJvdmlzaW9uIFNlcnZpY2UtQWNjb3VudCBLZXknKTtcblxuICAgICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50QXN5bmMob3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICAgICAgLy8gRHJ5IHJ1biBzdGF5cyBlbnRpcmVseSBPRkZMSU5FIOKAlCBpdCBtdXN0IG5vdCBjcmVhdGUgYW4gYWNjb3VudCBvclxuICAgICAgICAgIC8vIGJ1cm4gYSBrZXkganVzdCB0byBzaG93IHdoYXQgaXQgd291bGQgZG8uXG4gICAgICAgICAgcHJpbnREcnlSdW5QbGFuKHtcbiAgICAgICAgICAgIHNlcnZpY2VBY2NvdW50OiBhY2NvdW50TmFtZSxcbiAgICAgICAgICAgIHJvbGVzOiBzY29wZSA/ICdub25lIChzY29wZWQsIGxlYXN0IHByaXZpbGVnZSknIDogJ29yZyBhZG1pbicsXG4gICAgICAgICAgICBzY29wZTogc2NvcGUgPz8gJyhub25lIOKAlCBmdWxsIHBsYXRmb3JtIGNyZWRlbnRpYWwpJyxcbiAgICAgICAgICAgIHNlY3JldE5hbWU6IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFQ1JFVF9OQU1FIHx8IGAke3NlY3JldE5hbWVGb3JPcmcoJzxvcmdJZD4nLCBzY29wZSA/IHNjb3BlU2VjcmV0TGVhZihzY29wZSkgOiAncGxhdGZvcm0nKX1gLFxuICAgICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgICAgZXhwaXJlc0luRGF5czogZGF5cyxcbiAgICAgICAgICB9LCAhIW9wdGlvbnMuanNvbik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5TmFtZSA9IGAke2FjY291bnROYW1lfS0ke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCl9YDtcbiAgICAgICAgY29uc3QgcHJvdmlzaW9uZWQgPSBhd2FpdCBwcm92aXNpb25TZXJ2aWNlQWNjb3VudEtleSh7XG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCEsXG4gICAgICAgICAgYWNjb3VudE5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGlkZW50aXR5LmRlc2NyaXB0aW9uLFxuICAgICAgICAgIHJvbGVzOiBzY29wZSA/ICdub25lJyA6ICdhZG1pbicsXG4gICAgICAgICAgLi4uKHNjb3BlID8geyBzY29wZSB9IDoge30pLFxuICAgICAgICAgIGV4cGlyZXNJblNlY29uZHMsXG4gICAgICAgICAga2V5TmFtZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJpbnRTdWNjZXNzKGBLZXkgaXNzdWVkIG9uIHNlcnZpY2UgYWNjb3VudCAnJHthY2NvdW50TmFtZX0nIChleHBpcmVzICR7cHJvdmlzaW9uZWQuZXhwaXJlc0F0fSlgKTtcblxuICAgICAgICAvLyBBbiBleHBsaWNpdCBQTEFURk9STV9TRUNSRVRfTkFNRSBzdGlsbCB3aW5zICh0aGUgZXNjYXBlIGhhdGNoIGZvclxuICAgICAgICAvLyBoYW5kLW1hbmFnZWQgcGF0aHMpOyBvdGhlcndpc2UgZGVyaXZlIGl0IGZyb20gdGhlIG9yZyB0aGUgcGxhdGZvcm1cbiAgICAgICAgLy8gcmVwb3J0ZWQsIHdoaWNoIHdvcmtzIHdpdGggYW4gb3BhcXVlIGFjY2VzcyBrZXkgYXMgUExBVEZPUk1fVE9LRU4g4oCUXG4gICAgICAgIC8vIGEga2V5IGNhcnJpZXMgbm8gb3JnIGNsYWltIHRvIGRlY29kZS5cbiAgICAgICAgY29uc3Qgc2VjcmV0TmFtZSA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFQ1JFVF9OQU1FXG4gICAgICAgICAgfHwgc2VjcmV0TmFtZUZvck9yZyhwcm92aXNpb25lZC5vcmdhbml6YXRpb25JZCwgc2NvcGUgPyBzY29wZVNlY3JldExlYWYoc2NvcGUpIDogJ3BsYXRmb3JtJyk7XG5cbiAgICAgICAgYXVkaXRMb2coJ3N0b3JlLXRva2VuJywge1xuICAgICAgICAgIGV4ZWN1dGlvbklkLFxuICAgICAgICAgIHNlY3JldE5hbWUsXG4gICAgICAgICAgZGF5cyxcbiAgICAgICAgICBzZXJ2aWNlQWNjb3VudDogYWNjb3VudE5hbWUsXG4gICAgICAgICAgc2NvcGU6IHNjb3BlID8/IG51bGwsXG4gICAgICAgICAga2V5SWQ6IHByb3Zpc2lvbmVkLmtleUlkLFxuICAgICAgICB9KTtcblxuICAgICAgICBwcmludEluZm8oJ1BhcmFtZXRlcnMnLCB7XG4gICAgICAgICAgc2VjcmV0TmFtZSxcbiAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgc2VydmljZUFjY291bnQ6IGFjY291bnROYW1lLFxuICAgICAgICAgIHNjb3BlOiBzY29wZSA/PyAnKG5vbmUpJyxcbiAgICAgICAgICBkYXlzLFxuICAgICAgICAgIGV4cGlyZXNJbjogYCR7ZXhwaXJlc0luU2Vjb25kc31zYCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gV2hhdCB0aGlzIHJ1biBpcyBSRVBMQUNJTkcsIHJlYWQgYmVmb3JlIHRoZSB3cml0ZSBzbyB0aGUgb2xkIGtleSBjYW4gYmVcbiAgICAgICAgLy8gcmV0aXJlZCBhZnRlciB0aGUgbmV3IG9uZSBpcyBzYWZlbHkgc3RvcmVkLlxuICAgICAgICBjb25zdCBwcmV2aW91cyA9IGF3YWl0IHByZXZpb3VzS2V5SWQoc2VjcmV0TmFtZSwgYXdzKTtcblxuICAgICAgICBjb25zdCBzZWNyZXRWYWx1ZSA9IGJ1aWxkU2VjcmV0VmFsdWUocHJvdmlzaW9uZWQsIGNsaWVudC5nZXRCYXNlVXJsKCksIGV4cGlyZXNJblNlY29uZHMpO1xuXG4gICAgICAgIHByaW50U2VjdGlvbignU3RvcmUgS2V5Jyk7XG5cbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBgUGlwZWxpbmUgQnVpbGRlciBzZXJ2aWNlLWFjY291bnQga2V5ICgke2FjY291bnROYW1lfTsgcmVuZXcgYnkgJHtwcm92aXNpb25lZC5leHBpcmVzQXR9KWA7XG4gICAgICAgIGF3YWl0IHVwc2VydFNlY3JldChzZWNyZXROYW1lLCBzZWNyZXRWYWx1ZSwgZGVzY3JpcHRpb24sIGF3cyk7XG5cbiAgICAgICAgY29uc3QgYXJuID0gYXdhaXQgZ2V0U2VjcmV0QXJuKHNlY3JldE5hbWUsIGF3cyk7XG5cbiAgICAgICAgYXdhaXQgcmV0aXJlUHJldmlvdXNLZXkoY2xpZW50LCBwYXNzd29yZCEsIHByb3Zpc2lvbmVkLCBwcmV2aW91cyk7XG5cbiAgICAgICAgLy8gT3B0aW9uYWxseSBpbnN0YWxsIHRoZSBvbmNlLWEtZGF5IHJvdGF0aW9uIHN0YWNrIHNvIHRoaXMga2V5IG5ldmVyIGxhcHNlcy5cbiAgICAgICAgbGV0IHNjaGVkdWxlRXhwcmVzc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAob3B0aW9ucy5zY2hlZHVsZSkge1xuICAgICAgICAgIGNvbnN0IGZpdmVGaWVsZENyb24gPSBvcHRpb25zLmNyb24gfHwgcHJvY2Vzcy5lbnYuVE9LRU5fUkVORVdfU0NIRURVTEUgfHwgREVGQVVMVF9SRU5FV19DUk9OO1xuICAgICAgICAgIHNjaGVkdWxlRXhwcmVzc2lvbiA9IGF3YWl0IGRlcGxveVJlbmV3U2NoZWR1bGUoe1xuICAgICAgICAgICAgc2VjcmV0TmFtZSxcbiAgICAgICAgICAgIGRheXMsXG4gICAgICAgICAgICBmaXZlRmllbGRDcm9uLFxuICAgICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgICAgcHJvZmlsZTogb3B0aW9ucy5wcm9maWxlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpbnRTdG9yZWRLZXkoe1xuICAgICAgICAgIGpzb246ICEhb3B0aW9ucy5qc29uLFxuICAgICAgICAgIHNlY3JldE5hbWUsXG4gICAgICAgICAgYXJuLFxuICAgICAgICAgIHJlZ2lvbixcbiAgICAgICAgICBhY2NvdW50TmFtZSxcbiAgICAgICAgICBwcm92aXNpb25lZCxcbiAgICAgICAgICBkYXlzLFxuICAgICAgICAgIHNjaGVkdWxlRXhwcmVzc2lvbixcbiAgICAgICAgfSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5BUElfUkVRVUVTVCwge1xuICAgICAgICAgIGRlYnVnOiBwcm9ncmFtLm9wdHMoKS5kZWJ1ZyxcbiAgICAgICAgICBleGl0OiB0cnVlLFxuICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgIGNvbW1hbmQ6ICdzdG9yZS10b2tlbicsXG4gICAgICAgICAgICBleGVjdXRpb25JZCxcbiAgICAgICAgICAgIHNlY3JldE5hbWU6IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFQ1JFVF9OQU1FIHx8ICcoZGVyaXZlZCBmcm9tIHRoZSBvcmcpJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { type Exec } from '../utils/plugin-docker.js';
|
|
3
|
+
/** Mount point of the sample workspace inside the container (the step's source dir). */
|
|
4
|
+
export declare const CONTAINER_WORKSPACE = "/workspace";
|
|
5
|
+
export interface TestPluginOptions {
|
|
6
|
+
dir: string;
|
|
7
|
+
image?: string;
|
|
8
|
+
workspace?: string;
|
|
9
|
+
env?: string[];
|
|
10
|
+
metadata?: string[];
|
|
11
|
+
var?: string[];
|
|
12
|
+
keep?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/** A plugin run that failed: the step would be red in CodeBuild. */
|
|
15
|
+
export declare class PluginTestFailure extends Error {
|
|
16
|
+
constructor(message: string);
|
|
17
|
+
}
|
|
18
|
+
/** `KEY=VALUE` flags → a record (the value may itself contain `=`). */
|
|
19
|
+
export declare function parseKeyValues(pairs: string[] | undefined, flag: string): Record<string, string>;
|
|
20
|
+
/** What a run needs, resolved from the spec + flags (no side effects). */
|
|
21
|
+
export interface TestPlan {
|
|
22
|
+
name: string;
|
|
23
|
+
version: string;
|
|
24
|
+
failureBehavior: 'fail' | 'warn' | 'ignore';
|
|
25
|
+
/** Plain env passed as `-e KEY=VALUE`. */
|
|
26
|
+
env: Record<string, string>;
|
|
27
|
+
/** Secret NAMES passed as `-e NAME` (docker reads the value from this process's env). */
|
|
28
|
+
secretNames: string[];
|
|
29
|
+
missingOptionalSecrets: string[];
|
|
30
|
+
installScript: string;
|
|
31
|
+
buildScript: string;
|
|
32
|
+
primaryOutputDirectory: string | undefined;
|
|
33
|
+
smokeTest: string | undefined;
|
|
34
|
+
timeoutMs: number | undefined;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Resolve the spec the way the pipeline step does: `{{ … }}` templates against
|
|
38
|
+
* the given pipeline metadata/vars, env = spec env ← non-namespaced metadata ←
|
|
39
|
+
* `--env`, the step's WORKDIR bootstrap, and the build commands wrapped for the
|
|
40
|
+
* effective failureBehavior (a security-category plugin is always `fail`).
|
|
41
|
+
*/
|
|
42
|
+
export declare function planPluginTest(spec: Record<string, unknown>, flags: {
|
|
43
|
+
env?: Record<string, string>;
|
|
44
|
+
metadata?: Record<string, string>;
|
|
45
|
+
vars?: Record<string, string>;
|
|
46
|
+
}, hostEnv?: NodeJS.ProcessEnv): TestPlan;
|
|
47
|
+
/** `docker run` arguments for one phase (secret VALUES never appear here). */
|
|
48
|
+
export declare function dockerRunArgs(image: string, workspace: string, plan: Pick<TestPlan, 'env' | 'secretNames'>, script: string): string[];
|
|
49
|
+
/** Copy the sample workspace to a scratch dir the container's uid 1000 can write. */
|
|
50
|
+
export declare function prepareWorkspace(source: string | undefined): string;
|
|
51
|
+
/** Where the step's primary output lands on the host, honouring a relative WORKDIR. */
|
|
52
|
+
export declare function outputPath(workspace: string, plan: Pick<TestPlan, 'env' | 'primaryOutputDirectory'>): string | null;
|
|
53
|
+
/**
|
|
54
|
+
* Build (or take) the image, then run the plugin as its CodeBuild step would:
|
|
55
|
+
* install phase, build phase (failureBehavior applied), the primary output
|
|
56
|
+
* check, then the spec's smokeTest. Any failure throws — a step that can't run
|
|
57
|
+
* or that fails is red, never green.
|
|
58
|
+
*/
|
|
59
|
+
export declare function runPluginTest(options: TestPluginOptions, exec?: Exec): Promise<{
|
|
60
|
+
outputFiles: number | null;
|
|
61
|
+
}>;
|
|
62
|
+
/**
|
|
63
|
+
* Register `plugin test` — run a plugin's install + build commands locally in
|
|
64
|
+
* its image against a sample workspace, check its primary output, and run its
|
|
65
|
+
* smokeTest. Exits non-zero on any failure.
|
|
66
|
+
*
|
|
67
|
+
* Usage:
|
|
68
|
+
* pipeline-manager plugin test --dir ./my-linter --workspace ./sample-app
|
|
69
|
+
* pipeline-manager plugin test --dir ./my-linter --image my-linter:dev --metadata STAGE=dev
|
|
70
|
+
*/
|
|
71
|
+
export declare function testPlugin(program: Command): void;
|
|
72
|
+
//# sourceMappingURL=test-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-plugin.d.ts","sourceRoot":"","sources":["../../src/commands/test-plugin.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EACoF,KAAK,IAAI,EACnG,MAAM,2BAA2B,CAAC;AAGnC,wFAAwF;AACxF,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAEhD,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,oEAAoE;AACpE,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQhG;AAID,0EAA0E;AAC1E,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC5C,0CAA0C;IAC1C,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,yFAAyF;IACzF,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EACzG,OAAO,GAAE,MAAM,CAAC,UAAwB,GACvC,QAAQ,CAsDV;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAUrI;AAED,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAmBnE;AAED,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,wBAAwB,CAAC,GAAG,MAAM,GAAG,IAAI,CAOnH;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,iBAAiB,EAAE,IAAI,GAAE,IAAgB,GAAG,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CA4F/H;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwBjD"}
|