@pipeline-builder/pipeline-manager 3.4.70 → 3.4.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -2
- package/dist/agent/ai.d.ts +55 -0
- package/dist/agent/ai.d.ts.map +1 -0
- package/dist/agent/ai.js +130 -0
- package/dist/agent/executor.d.ts +24 -0
- package/dist/agent/executor.d.ts.map +1 -0
- package/dist/agent/executor.js +54 -0
- package/dist/agent/health.d.ts +22 -0
- package/dist/agent/health.d.ts.map +1 -0
- package/dist/agent/health.js +55 -0
- package/dist/agent/prereqs.d.ts +16 -0
- package/dist/agent/prereqs.d.ts.map +1 -0
- package/dist/agent/prereqs.js +73 -0
- package/dist/agent/targets.d.ts +83 -0
- package/dist/agent/targets.d.ts.map +1 -0
- package/dist/agent/targets.js +142 -0
- package/dist/agent/troubleshoot.d.ts +30 -0
- package/dist/agent/troubleshoot.d.ts.map +1 -0
- package/dist/agent/troubleshoot.js +87 -0
- package/dist/boilerplate.js +8 -13
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +114 -116
- package/dist/commands/audit-stacks.js +22 -24
- package/dist/commands/audit-tokens.js +25 -27
- package/dist/commands/bootstrap.js +29 -37
- package/dist/commands/create-pipeline.js +55 -92
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +58 -62
- package/dist/commands/get-pipeline.js +24 -28
- package/dist/commands/get-plugin.js +24 -28
- package/dist/commands/list-pipelines.js +30 -31
- package/dist/commands/list-plugins.js +32 -33
- package/dist/commands/login.js +44 -49
- package/dist/commands/org-export.js +22 -60
- package/dist/commands/provision.d.ts +12 -0
- package/dist/commands/provision.d.ts.map +1 -0
- package/dist/commands/provision.js +362 -0
- package/dist/commands/register.js +29 -30
- package/dist/commands/setup-events.d.ts.map +1 -1
- package/dist/commands/setup-events.js +42 -77
- package/dist/commands/status.js +20 -25
- package/dist/commands/store-token.js +44 -82
- package/dist/commands/synth.d.ts.map +1 -1
- package/dist/commands/synth.js +36 -35
- package/dist/commands/upload-plugin.js +59 -96
- package/dist/commands/validate-templates.d.ts.map +1 -1
- package/dist/commands/validate-templates.js +23 -29
- package/dist/commands/version.js +42 -47
- package/dist/config/cli.constants.d.ts.map +1 -1
- package/dist/config/cli.constants.js +24 -31
- package/dist/types/config.js +2 -3
- package/dist/types/error.js +3 -7
- package/dist/types/index.d.ts +4 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +5 -21
- package/dist/types/pipeline.js +2 -3
- package/dist/types/plugin.js +2 -3
- package/dist/utils/api-client.d.ts +1 -1
- package/dist/utils/api-client.d.ts.map +1 -1
- package/dist/utils/api-client.js +23 -28
- package/dist/utils/audit-log.js +16 -22
- package/dist/utils/auth-guard.js +2 -5
- package/dist/utils/aws-secrets.js +17 -23
- package/dist/utils/banner.js +16 -23
- package/dist/utils/cdk-utils.js +14 -24
- package/dist/utils/command-utils.d.ts +1 -1
- package/dist/utils/command-utils.d.ts.map +1 -1
- package/dist/utils/command-utils.js +32 -44
- package/dist/utils/config-loader.d.ts +1 -1
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +24 -58
- package/dist/utils/error-handler.d.ts +1 -1
- package/dist/utils/error-handler.d.ts.map +1 -1
- package/dist/utils/error-handler.js +16 -24
- package/dist/utils/list-command-utils.js +15 -20
- package/dist/utils/output-utils.d.ts +1 -1
- package/dist/utils/output-utils.d.ts.map +1 -1
- package/dist/utils/output-utils.js +35 -55
- package/dist/utils/plugin-resolver.d.ts +1 -1
- package/dist/utils/plugin-resolver.d.ts.map +1 -1
- package/dist/utils/plugin-resolver.js +6 -8
- package/dist/utils/rate-limiter.js +11 -19
- package/dist/utils/registry.js +16 -22
- package/package.json +26 -17
|
@@ -1,66 +1,28 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
3
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
16
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
17
|
-
}) : function(o, v) {
|
|
18
|
-
o["default"] = v;
|
|
19
|
-
});
|
|
20
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
21
|
-
var ownKeys = function(o) {
|
|
22
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
23
|
-
var ar = [];
|
|
24
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
25
|
-
return ar;
|
|
26
|
-
};
|
|
27
|
-
return ownKeys(o);
|
|
28
|
-
};
|
|
29
|
-
return function (mod) {
|
|
30
|
-
if (mod && mod.__esModule) return mod;
|
|
31
|
-
var result = {};
|
|
32
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
33
|
-
__setModuleDefault(result, mod);
|
|
34
|
-
return result;
|
|
35
|
-
};
|
|
36
|
-
})();
|
|
37
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
38
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
39
|
-
};
|
|
40
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
-
exports.storeToken = storeToken;
|
|
42
|
-
const pipeline_core_1 = require("@pipeline-builder/pipeline-core");
|
|
43
|
-
const axios_1 = __importDefault(require("axios"));
|
|
44
|
-
const cli_constants_1 = require("../config/cli.constants");
|
|
45
|
-
const audit_log_1 = require("../utils/audit-log");
|
|
46
|
-
const auth_guard_1 = require("../utils/auth-guard");
|
|
47
|
-
const aws_secrets_1 = require("../utils/aws-secrets");
|
|
48
|
-
const command_utils_1 = require("../utils/command-utils");
|
|
49
|
-
const config_loader_1 = require("../utils/config-loader");
|
|
50
|
-
const error_handler_1 = require("../utils/error-handler");
|
|
51
|
-
const output_utils_1 = require("../utils/output-utils");
|
|
3
|
+
import { CoreConstants } from '@pipeline-builder/pipeline-core';
|
|
4
|
+
import axios from 'axios';
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { validateNumber } from '../config/cli.constants.js';
|
|
7
|
+
import { auditLog } from '../utils/audit-log.js';
|
|
8
|
+
import { decodeTokenPayload } from '../utils/auth-guard.js';
|
|
9
|
+
import { upsertSecret, getSecretArn } from '../utils/aws-secrets.js';
|
|
10
|
+
import { createAuthenticatedClientAsync, printCommandHeader, printSslWarning } from '../utils/command-utils.js';
|
|
11
|
+
import { getConfigWithOptions } from '../utils/config-loader.js';
|
|
12
|
+
import { ERROR_CODES, handleError } from '../utils/error-handler.js';
|
|
13
|
+
import { printInfo, printKeyValue, printSection, printSuccess } from '../utils/output-utils.js';
|
|
52
14
|
/**
|
|
53
15
|
* Build the secret name from the JWT token's organizationId.
|
|
54
16
|
* Pattern: {SECRETS_PATH_PREFIX}/{orgId}/platform
|
|
55
17
|
* @throws Error if organizationId is not present in the token
|
|
56
18
|
*/
|
|
57
19
|
function resolveSecretName(token) {
|
|
58
|
-
const payload =
|
|
20
|
+
const payload = decodeTokenPayload(token);
|
|
59
21
|
const orgId = payload?.organizationId;
|
|
60
22
|
if (!orgId) {
|
|
61
23
|
throw new Error('Token does not contain organizationId — cannot derive secret name. Use --secret-name to specify explicitly.');
|
|
62
24
|
}
|
|
63
|
-
return `${
|
|
25
|
+
return `${CoreConstants.SECRETS_PATH_PREFIX}/${orgId}/platform`;
|
|
64
26
|
}
|
|
65
27
|
/**
|
|
66
28
|
* Registers the `store-token` command with the CLI program.
|
|
@@ -79,7 +41,7 @@ function resolveSecretName(token) {
|
|
|
79
41
|
* pipeline-manager store-token -e admin -p '***' --region us-east-1
|
|
80
42
|
* ```
|
|
81
43
|
*/
|
|
82
|
-
function storeToken(program) {
|
|
44
|
+
export function storeToken(program) {
|
|
83
45
|
program
|
|
84
46
|
.command('store-token')
|
|
85
47
|
.description('Generate JWT token and store in AWS Secrets Manager for CDK deployments')
|
|
@@ -94,24 +56,24 @@ function storeToken(program) {
|
|
|
94
56
|
.option('--verify-ssl', 'Enable SSL certificate verification')
|
|
95
57
|
.option('--no-verify-ssl', 'Disable SSL certificate verification')
|
|
96
58
|
.action(async (options) => {
|
|
97
|
-
const executionId =
|
|
59
|
+
const executionId = printCommandHeader('Store Token');
|
|
98
60
|
try {
|
|
99
|
-
|
|
61
|
+
printSslWarning(options.verifySsl);
|
|
100
62
|
const region = options.region || process.env.AWS_REGION || process.env.CDK_DEFAULT_REGION || 'us-east-1';
|
|
101
|
-
const days =
|
|
63
|
+
const days = validateNumber(options.days, 'days', 1, 365);
|
|
102
64
|
const expiresInSeconds = days * 24 * 60 * 60;
|
|
103
65
|
// Step 0: If --email/--password provided and no PLATFORM_TOKEN, login first
|
|
104
66
|
if (options.email && options.password && !process.env.PLATFORM_TOKEN) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const config =
|
|
67
|
+
printSection('Login');
|
|
68
|
+
printInfo('Authenticating with email/password...');
|
|
69
|
+
const config = getConfigWithOptions(options);
|
|
108
70
|
const loginUrl = `${config.api.baseUrl}/api/auth/login`;
|
|
109
|
-
const loginResponse = await
|
|
71
|
+
const loginResponse = await axios.post(loginUrl, {
|
|
110
72
|
email: options.email,
|
|
111
73
|
password: options.password,
|
|
112
74
|
}, {
|
|
113
75
|
httpsAgent: config.api.rejectUnauthorized === false
|
|
114
|
-
? new (await
|
|
76
|
+
? new (await import('https')).Agent({ rejectUnauthorized: false })
|
|
115
77
|
: undefined,
|
|
116
78
|
});
|
|
117
79
|
const loginData = loginResponse.data?.data ?? loginResponse.data;
|
|
@@ -120,22 +82,22 @@ function storeToken(program) {
|
|
|
120
82
|
throw new Error('Login failed — no access token in response');
|
|
121
83
|
}
|
|
122
84
|
process.env.PLATFORM_TOKEN = loginToken;
|
|
123
|
-
|
|
85
|
+
printSuccess('Login successful');
|
|
124
86
|
}
|
|
125
87
|
// Step 1: Authenticate and generate long-lived token
|
|
126
|
-
|
|
127
|
-
const client = await
|
|
88
|
+
printSection('Generate Token');
|
|
89
|
+
const client = await createAuthenticatedClientAsync(options);
|
|
128
90
|
// Resolve secret name from token's organizationId (unless --secret-name was explicitly set)
|
|
129
91
|
const secretName = options.secretName || resolveSecretName(process.env.PLATFORM_TOKEN);
|
|
130
|
-
|
|
131
|
-
|
|
92
|
+
auditLog('store-token', { executionId, secretName, days: options.days, dryRun: options.dryRun });
|
|
93
|
+
printInfo('Parameters', {
|
|
132
94
|
secretName,
|
|
133
95
|
region,
|
|
134
96
|
days,
|
|
135
97
|
expiresIn: `${expiresInSeconds}s`,
|
|
136
98
|
dryRun: options.dryRun,
|
|
137
99
|
});
|
|
138
|
-
|
|
100
|
+
printInfo('Requesting token', { expiresIn: `${expiresInSeconds}s (${days} days)` });
|
|
139
101
|
const tokenResponse = await client.post('/api/user/generate-token', { expiresIn: expiresInSeconds });
|
|
140
102
|
const tokenData = tokenResponse?.data ?? tokenResponse;
|
|
141
103
|
const accessToken = tokenData?.accessToken;
|
|
@@ -144,7 +106,7 @@ function storeToken(program) {
|
|
|
144
106
|
if (!accessToken) {
|
|
145
107
|
throw new Error('Token generation failed — no access token in response');
|
|
146
108
|
}
|
|
147
|
-
|
|
109
|
+
printSuccess(`Token generated (expires in ${actualExpiresIn}s)`);
|
|
148
110
|
const expiresAt = new Date(Date.now() + actualExpiresIn * 1000).toISOString();
|
|
149
111
|
// Schema: { username: orgId, password: JWT, ...metadata }
|
|
150
112
|
// - username/password fields satisfy CodeBuild's `secretsManagerCredentials`
|
|
@@ -159,7 +121,7 @@ function storeToken(program) {
|
|
|
159
121
|
// rejects a registry credential whose `username` field is empty with
|
|
160
122
|
// "AuthorizationData is malformed, empty field" — so username must always
|
|
161
123
|
// be a non-empty value.
|
|
162
|
-
const payload =
|
|
124
|
+
const payload = decodeTokenPayload(accessToken);
|
|
163
125
|
const orgId = payload?.organizationId?.trim() || 'unknown-org';
|
|
164
126
|
const secretValue = JSON.stringify({
|
|
165
127
|
username: orgId,
|
|
@@ -186,8 +148,8 @@ function storeToken(program) {
|
|
|
186
148
|
}
|
|
187
149
|
else {
|
|
188
150
|
console.log('');
|
|
189
|
-
|
|
190
|
-
|
|
151
|
+
printSection('Dry Run — No Changes Made');
|
|
152
|
+
printKeyValue({
|
|
191
153
|
'Secret Name': secretName,
|
|
192
154
|
'Region': region,
|
|
193
155
|
'Expires In': `${days} days`,
|
|
@@ -195,15 +157,15 @@ function storeToken(program) {
|
|
|
195
157
|
'Token Length': `${accessToken.length} chars`,
|
|
196
158
|
'Has Refresh Token': refreshToken ? 'Yes' : 'No',
|
|
197
159
|
});
|
|
198
|
-
|
|
160
|
+
printSuccess('Dry run complete — no secret was created or updated');
|
|
199
161
|
}
|
|
200
162
|
return;
|
|
201
163
|
}
|
|
202
164
|
// Step 2: Store token in Secrets Manager
|
|
203
|
-
|
|
165
|
+
printSection('Store Token');
|
|
204
166
|
const description = `Platform JWT token (renew by ${expiresAt})`;
|
|
205
|
-
await
|
|
206
|
-
const arn = await
|
|
167
|
+
await upsertSecret(secretName, secretValue, description, { region, profile: options.profile });
|
|
168
|
+
const arn = await getSecretArn(secretName, { region, profile: options.profile });
|
|
207
169
|
if (options.json) {
|
|
208
170
|
console.log(JSON.stringify({
|
|
209
171
|
success: true,
|
|
@@ -216,8 +178,8 @@ function storeToken(program) {
|
|
|
216
178
|
}
|
|
217
179
|
else {
|
|
218
180
|
console.log('');
|
|
219
|
-
|
|
220
|
-
|
|
181
|
+
printSection('Token Stored');
|
|
182
|
+
printKeyValue({
|
|
221
183
|
'Secret Name': secretName,
|
|
222
184
|
'Secret ARN': arn,
|
|
223
185
|
'Region': region,
|
|
@@ -226,15 +188,15 @@ function storeToken(program) {
|
|
|
226
188
|
'Status': '✓ Stored',
|
|
227
189
|
});
|
|
228
190
|
console.log('');
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
191
|
+
printSuccess('Token stored. To use with synth/deploy:');
|
|
192
|
+
printInfo(` export PLATFORM_SECRET_NAME=${secretName}`);
|
|
193
|
+
printInfo(' pipeline-manager synth --id <pipeline-id> --store-tokens');
|
|
232
194
|
console.log('');
|
|
233
|
-
|
|
195
|
+
printInfo(`Renew before ${expiresAt} with: pipeline-manager store-token --days ${days}`);
|
|
234
196
|
}
|
|
235
197
|
}
|
|
236
198
|
catch (error) {
|
|
237
|
-
|
|
199
|
+
handleError(error, ERROR_CODES.API_REQUEST, {
|
|
238
200
|
debug: program.opts().debug,
|
|
239
201
|
exit: true,
|
|
240
202
|
context: {
|
|
@@ -246,4 +208,4 @@ function storeToken(program) {
|
|
|
246
208
|
}
|
|
247
209
|
});
|
|
248
210
|
}
|
|
249
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtdG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvc3RvcmUtdG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkN0QyxnQ0FvTUM7QUEvT0QsbUVBQWdFO0FBQ2hFLGtEQUEwQjtBQUUxQiwyREFBeUQ7QUFDekQsa0RBQThDO0FBQzlDLG9EQUF5RDtBQUN6RCxzREFBa0U7QUFDbEUsMERBQTZHO0FBQzdHLDBEQUE4RDtBQUM5RCwwREFBa0U7QUFDbEUsd0RBQTZGO0FBRTdGOzs7O0dBSUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQWE7SUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBQSwrQkFBa0IsRUFBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLEtBQUssR0FBRyxPQUFPLEVBQUUsY0FBYyxDQUFDO0lBQ3RDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsNkdBQTZHLENBQUMsQ0FBQztJQUNqSSxDQUFDO0lBQ0QsT0FBTyxHQUFHLDZCQUFhLENBQUMsbUJBQW1CLElBQUksS0FBSyxXQUFXLENBQUM7QUFDbEUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsU0FBZ0IsVUFBVSxDQUFDLE9BQWdCO0lBQ3pDLE9BQU87U0FDSixPQUFPLENBQUMsYUFBYSxDQUFDO1NBQ3RCLFdBQVcsQ0FBQyx5RUFBeUUsQ0FBQztTQUN0RixNQUFNLENBQUMscUJBQXFCLEVBQUUsZ0RBQWdELENBQUM7U0FDL0UsTUFBTSxDQUFDLDJCQUEyQixFQUFFLG9DQUFvQyxDQUFDO1NBQ3pFLE1BQU0sQ0FBQyxlQUFlLEVBQUUsd0JBQXdCLEVBQUUsSUFBSSxDQUFDO1NBQ3ZELE1BQU0sQ0FBQyxXQUFXLEVBQUUsOERBQThELEVBQUUsS0FB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QUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IENvcmVDb25zdGFudHMgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IHZhbGlkYXRlTnVtYmVyIH0gZnJvbSAnLi4vY29uZmlnL2NsaS5jb25zdGFudHMnO1xuaW1wb3J0IHsgYXVkaXRMb2cgfSBmcm9tICcuLi91dGlscy9hdWRpdC1sb2cnO1xuaW1wb3J0IHsgZGVjb2RlVG9rZW5QYXlsb2FkIH0gZnJvbSAnLi4vdXRpbHMvYXV0aC1ndWFyZCc7XG5pbXBvcnQgeyB1cHNlcnRTZWNyZXQsIGdldFNlY3JldEFybiB9IGZyb20gJy4uL3V0aWxzL2F3cy1zZWNyZXRzJztcbmltcG9ydCB7IGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnRBc3luYywgcHJpbnRDb21tYW5kSGVhZGVyLCBwcmludFNzbFdhcm5pbmcgfSBmcm9tICcuLi91dGlscy9jb21tYW5kLXV0aWxzJztcbmltcG9ydCB7IGdldENvbmZpZ1dpdGhPcHRpb25zIH0gZnJvbSAnLi4vdXRpbHMvY29uZmlnLWxvYWRlcic7XG5pbXBvcnQgeyBFUlJPUl9DT0RFUywgaGFuZGxlRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvci1oYW5kbGVyJztcbmltcG9ydCB7IHByaW50SW5mbywgcHJpbnRLZXlWYWx1ZSwgcHJpbnRTZWN0aW9uLCBwcmludFN1Y2Nlc3MgfSBmcm9tICcuLi91dGlscy9vdXRwdXQtdXRpbHMnO1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBzZWNyZXQgbmFtZSBmcm9tIHRoZSBKV1QgdG9rZW4ncyBvcmdhbml6YXRpb25JZC5cbiAqIFBhdHRlcm46IHtTRUNSRVRTX1BBVEhfUFJFRklYfS97b3JnSWR9L3BsYXRmb3JtXG4gKiBAdGhyb3dzIEVycm9yIGlmIG9yZ2FuaXphdGlvbklkIGlzIG5vdCBwcmVzZW50IGluIHRoZSB0b2tlblxuICovXG5mdW5jdGlvbiByZXNvbHZlU2VjcmV0TmFtZSh0b2tlbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGF5bG9hZCA9IGRlY29kZVRva2VuUGF5bG9hZCh0b2tlbik7XG4gIGNvbnN0IG9yZ0lkID0gcGF5bG9hZD8ub3JnYW5pemF0aW9uSWQ7XG4gIGlmICghb3JnSWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rva2VuIGRvZXMgbm90IGNvbnRhaW4gb3JnYW5pemF0aW9uSWQg4oCUIGNhbm5vdCBkZXJpdmUgc2VjcmV0IG5hbWUuIFVzZSAtLXNlY3JldC1uYW1lIHRvIHNwZWNpZnkgZXhwbGljaXRseS4nKTtcbiAgfVxuICByZXR1cm4gYCR7Q29yZUNvbnN0YW50cy5TRUNSRVRTX1BBVEhfUFJFRklYfS8ke29yZ0lkfS9wbGF0Zm9ybWA7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHRoZSBgc3RvcmUtdG9rZW5gIGNvbW1hbmQgd2l0aCB0aGUgQ0xJIHByb2dyYW0uXG4gKlxuICogR2VuZXJhdGVzIGEgbG9uZy1saXZlZCBKV1QgdG9rZW4gdmlhIHRoZSBwbGF0Zm9ybSBBUEkgYW5kIHN0b3JlcyBpdFxuICogaW4gQVdTIFNlY3JldHMgTWFuYWdlciBmb3IgdXNlIGJ5IHRoZSBzeW50aC9kZXBsb3kgLS1zdG9yZS10b2tlbnMgZmxhZy5cbiAqXG4gKiBSZXF1aXJlcyBQTEFURk9STV9UT0tFTiB0byBiZSBzZXQsIG9yIHVzZSAtLWVtYWlsLy0tcGFzc3dvcmQgdG8gbG9naW4gaW5saW5lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBiYXNoXG4gKiBwaXBlbGluZS1tYW5hZ2VyIHN0b3JlLXRva2VuIC0tcmVnaW9uIHVzLWVhc3QtMVxuICogcGlwZWxpbmUtbWFuYWdlciBzdG9yZS10b2tlbiAtLWRheXMgOTAgLS1yZWdpb24gdXMtZWFzdC0xXG4gKiBwaXBlbGluZS1tYW5hZ2VyIHN0b3JlLXRva2VuIC0tZGF5cyA3IC0tc2VjcmV0LW5hbWUgbXktY3VzdG9tLXNlY3JldCAtLW5vLXZlcmlmeS1zc2xcbiAqIHBpcGVsaW5lLW1hbmFnZXIgc3RvcmUtdG9rZW4gLS1kcnktcnVuXG4gKiBwaXBlbGluZS1tYW5hZ2VyIHN0b3JlLXRva2VuIC1lIGFkbWluIC1wICcqKionIC0tcmVnaW9uIHVzLWVhc3QtMVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdG9yZVRva2VuKHByb2dyYW06IENvbW1hbmQpOiB2b2lkIHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKCdzdG9yZS10b2tlbicpXG4gICAgLmRlc2NyaXB0aW9uKCdHZW5lcmF0ZSBKV1QgdG9rZW4gYW5kIHN0b3JlIGluIEFXUyBTZWNyZXRzIE1hbmFnZXIgZm9yIENESyBkZXBsb3ltZW50cycpXG4gICAgLm9wdGlvbignLWUsIC0tZW1haWwgPGVtYWlsPicsICdMb2dpbiBlbWFpbCAoc2tpcHMgUExBVEZPUk1fVE9LRU4gcmVxdWlyZW1lbnQpJylcbiAgICAub3B0aW9uKCctcCwgLS1wYXNzd29yZCA8cGFzc3dvcmQ+JywgJ0xvZ2luIHBhc3N3b3JkICh1c2VkIHdpdGggLS1lbWFpbCknKVxuICAgIC5vcHRpb24oJy0tZGF5cyA8ZGF5cz4nLCAnVG9rZW4gbGlmZXRpbWUgaW4gZGF5cycsICczMCcpXG4gICAgLm9wdGlvbignLS1kcnktcnVuJywgJ1Nob3cgd2hhdCB3b3VsZCBiZSBzdG9yZWQgd2l0aG91dCB3cml0aW5nIHRvIFNlY3JldHMgTWFuYWdlcicsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tc2VjcmV0LW5hbWUgPG5hbWU+JywgJ1NlY3JldHMgTWFuYWdlciBzZWNyZXQgbmFtZSAoZGVmYXVsdDogZGVyaXZlZCBmcm9tIHRva2VuIG9yZyknKVxuICAgIC5vcHRpb24oJy0tcmVnaW9uIDxyZWdpb24+JywgJ0FXUyByZWdpb24gKGRlZmF1bHRzIHRvIEFXU19SRUdJT04gZW52KScpXG4gICAgLm9wdGlvbignLS1wcm9maWxlIDxwcm9maWxlPicsICdBV1MgQ0xJIHByb2ZpbGUnLCAnZGVmYXVsdCcpXG4gICAgLm9wdGlvbignLS1qc29uJywgJ091dHB1dCByZXN1bHQgYXMgSlNPTicsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tdmVyaWZ5LXNzbCcsICdFbmFibGUgU1NMIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbicpXG4gICAgLm9wdGlvbignLS1uby12ZXJpZnktc3NsJywgJ0Rpc2FibGUgU1NMIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbicpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgZXhlY3V0aW9uSWQgPSBwcmludENvbW1hbmRIZWFkZXIoJ1N0b3JlIFRva2VuJyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHByaW50U3NsV2FybmluZyhvcHRpb25zLnZlcmlmeVNzbCk7XG5cbiAgICAgICAgY29uc3QgcmVnaW9uID0gb3B0aW9ucy5yZWdpb24gfHwgcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiB8fCBwcm9jZXNzLmVudi5DREtfREVGQVVMVF9SRUdJT04gfHwgJ3VzLWVhc3QtMSc7XG5cbiAgICAgICAgY29uc3QgZGF5cyA9IHZhbGlkYXRlTnVtYmVyKG9wdGlvbnMuZGF5cywgJ2RheXMnLCAxLCAzNjUpO1xuICAgICAgICBjb25zdCBleHBpcmVzSW5TZWNvbmRzID0gZGF5cyAqIDI0ICogNjAgKiA2MDtcblxuICAgICAgICAvLyBTdGVwIDA6IElmIC0tZW1haWwvLS1wYXNzd29yZCBwcm92aWRlZCBhbmQgbm8gUExBVEZPUk1fVE9LRU4sIGxvZ2luIGZpcnN0XG4gICAgICAgIGlmIChvcHRpb25zLmVtYWlsICYmIG9wdGlvbnMucGFzc3dvcmQgJiYgIXByb2Nlc3MuZW52LlBMQVRGT1JNX1RPS0VOKSB7XG4gICAgICAgICAgcHJpbnRTZWN0aW9uKCdMb2dpbicpO1xuICAgICAgICAgIHByaW50SW5mbygnQXV0aGVudGljYXRpbmcgd2l0aCBlbWFpbC9wYXNzd29yZC4uLicpO1xuXG4gICAgICAgICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnV2l0aE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgICAgY29uc3QgbG9naW5VcmwgPSBgJHtjb25maWcuYXBpLmJhc2VVcmx9L2FwaS9hdXRoL2xvZ2luYDtcblxuICAgICAgICAgIGNvbnN0IGxvZ2luUmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wb3N0KGxvZ2luVXJsLCB7XG4gICAgICAgICAgICBlbWFpbDogb3B0aW9ucy5lbWFpbCxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBvcHRpb25zLnBhc3N3b3JkLFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGh0dHBzQWdlbnQ6IGNvbmZpZy5hcGkucmVqZWN0VW5hdXRob3JpemVkID09PSBmYWxzZVxuICAgICAgICAgICAgICA/IG5ldyAoYXdhaXQgaW1wb3J0KCdodHRwcycpKS5BZ2VudCh7IHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2UgfSlcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBsb2dpbkRhdGEgPSBsb2dpblJlc3BvbnNlLmRhdGE/LmRhdGEgPz8gbG9naW5SZXNwb25zZS5kYXRhO1xuICAgICAgICAgIGNvbnN0IGxvZ2luVG9rZW4gPSBsb2dpbkRhdGE/LmFjY2Vzc1Rva2VuO1xuXG4gICAgICAgICAgaWYgKCFsb2dpblRva2VuIHx8IHR5cGVvZiBsb2dpblRva2VuICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2dpbiBmYWlsZWQg4oCUIG5vIGFjY2VzcyB0b2tlbiBpbiByZXNwb25zZScpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHByb2Nlc3MuZW52LlBMQVRGT1JNX1RPS0VOID0gbG9naW5Ub2tlbjtcbiAgICAgICAgICBwcmludFN1Y2Nlc3MoJ0xvZ2luIHN1Y2Nlc3NmdWwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgMTogQXV0aGVudGljYXRlIGFuZCBnZW5lcmF0ZSBsb25nLWxpdmVkIHRva2VuXG4gICAgICAgIHByaW50U2VjdGlvbignR2VuZXJhdGUgVG9rZW4nKTtcblxuICAgICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50QXN5bmMob3B0aW9ucyk7XG5cbiAgICAgICAgLy8gUmVzb2x2ZSBzZWNyZXQgbmFtZSBmcm9tIHRva2VuJ3Mgb3JnYW5pemF0aW9uSWQgKHVubGVzcyAtLXNlY3JldC1uYW1lIHdhcyBleHBsaWNpdGx5IHNldClcbiAgICAgICAgY29uc3Qgc2VjcmV0TmFtZSA9IG9wdGlvbnMuc2VjcmV0TmFtZSB8fCByZXNvbHZlU2VjcmV0TmFtZShwcm9jZXNzLmVudi5QTEFURk9STV9UT0tFTiEpO1xuXG4gICAgICAgIGF1ZGl0TG9nKCdzdG9yZS10b2tlbicsIHsgZXhlY3V0aW9uSWQsIHNlY3JldE5hbWUsIGRheXM6IG9wdGlvbnMuZGF5cywgZHJ5UnVuOiBvcHRpb25zLmRyeVJ1biB9KTtcblxuICAgICAgICBwcmludEluZm8oJ1BhcmFtZXRlcnMnLCB7XG4gICAgICAgICAgc2VjcmV0TmFtZSxcbiAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgZGF5cyxcbiAgICAgICAgICBleHBpcmVzSW46IGAke2V4cGlyZXNJblNlY29uZHN9c2AsXG4gICAgICAgICAgZHJ5UnVuOiBvcHRpb25zLmRyeVJ1bixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJpbnRJbmZvKCdSZXF1ZXN0aW5nIHRva2VuJywgeyBleHBpcmVzSW46IGAke2V4cGlyZXNJblNlY29uZHN9cyAoJHtkYXlzfSBkYXlzKWAgfSk7XG5cbiAgICAgICAgY29uc3QgdG9rZW5SZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICAgICAgICAnL2FwaS91c2VyL2dlbmVyYXRlLXRva2VuJyxcbiAgICAgICAgICB7IGV4cGlyZXNJbjogZXhwaXJlc0luU2Vjb25kcyB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHRva2VuRGF0YSA9ICh0b2tlblJlc3BvbnNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KT8uZGF0YSA/PyB0b2tlblJlc3BvbnNlO1xuICAgICAgICBjb25zdCBhY2Nlc3NUb2tlbiA9ICh0b2tlbkRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy5hY2Nlc3NUb2tlbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9ICh0b2tlbkRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy5yZWZyZXNoVG9rZW4gYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBhY3R1YWxFeHBpcmVzSW4gPSAoKHRva2VuRGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik/LmV4cGlyZXNJbiBhcyBudW1iZXIpID8/IGV4cGlyZXNJblNlY29uZHM7XG5cbiAgICAgICAgaWYgKCFhY2Nlc3NUb2tlbikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVG9rZW4gZ2VuZXJhdGlvbiBmYWlsZWQg4oCUIG5vIGFjY2VzcyB0b2tlbiBpbiByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpbnRTdWNjZXNzKGBUb2tlbiBnZW5lcmF0ZWQgKGV4cGlyZXMgaW4gJHthY3R1YWxFeHBpcmVzSW59cylgKTtcblxuICAgICAgICBjb25zdCBleHBpcmVzQXQgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgYWN0dWFsRXhwaXJlc0luICogMTAwMCkudG9JU09TdHJpbmcoKTtcblxuICAgICAgICAvLyBTY2hlbWE6IHsgdXNlcm5hbWU6IG9yZ0lkLCBwYXNzd29yZDogSldULCAuLi5tZXRhZGF0YSB9XG4gICAgICAgIC8vIC0gdXNlcm5hbWUvcGFzc3dvcmQgZmllbGRzIHNhdGlzZnkgQ29kZUJ1aWxkJ3MgYHNlY3JldHNNYW5hZ2VyQ3JlZGVudGlhbHNgXG4gICAgICAgIC8vICAgKEhUVFAgQmFzaWMsIHNlbnQgdG8gcGlwZWxpbmUtaW1hZ2UtcmVnaXN0cnkncyAvdG9rZW4gZW5kcG9pbnQpXG4gICAgICAgIC8vIC0gVGhlIHNhbWUgSldUIGlzIGNvbnN1bWVkIGJ5IHRoZSBwbHVnaW4tbG9va3VwIExhbWJkYSBieSByZWFkaW5nXG4gICAgICAgIC8vICAgdGhlIGBwYXNzd29yZGAgZmllbGRcbiAgICAgICAgLy8gLSBPbmUgU2VjcmV0IHBlciBjdXN0b21lciBhY2NvdW50IHJlcGxhY2VzIHRoZSBwcmV2aW91cyB0d28tc2VjcmV0IG1vZGVsXG4gICAgICAgIC8vIERlY29kZSBKV1QgZm9yIG9yZ0lkIOKAlCBpdCdzIGEgc3RhYmxlIGlkZW50aWZpZXIgZm9yIHRoZSB1c2VybmFtZSBmaWVsZDtcbiAgICAgICAgLy8gdGhlIGFjdHVhbCBhdXRoIHVzZXMgdGhlIHBhc3N3b3JkIChKV1QpIHdoaWNoIHRoZSB0b2tlbiBzZXJ2aWNlIHZlcmlmaWVzLlxuICAgICAgICAvLyBgfHxgIChub3QgYD8/YCk6IGFuIEVNUFRZLXN0cmluZyBvcmdhbml6YXRpb25JZCBtdXN0IGFsc28gZmFsbCBiYWNrLiBBXG4gICAgICAgIC8vIHN5c2FkbWluL3N5c3RlbSB0b2tlbiBvZnRlbiBjYXJyaWVzIG9yZ2FuaXphdGlvbklkPVwiXCIsIGFuZCBDb2RlQnVpbGRcbiAgICAgICAgLy8gcmVqZWN0cyBhIHJlZ2lzdHJ5IGNyZWRlbnRpYWwgd2hvc2UgYHVzZXJuYW1lYCBmaWVsZCBpcyBlbXB0eSB3aXRoXG4gICAgICAgIC8vIFwiQXV0aG9yaXphdGlvbkRhdGEgaXMgbWFsZm9ybWVkLCBlbXB0eSBmaWVsZFwiIOKAlCBzbyB1c2VybmFtZSBtdXN0IGFsd2F5c1xuICAgICAgICAvLyBiZSBhIG5vbi1lbXB0eSB2YWx1ZS5cbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IGRlY29kZVRva2VuUGF5bG9hZChhY2Nlc3NUb2tlbik7XG4gICAgICAgIGNvbnN0IG9yZ0lkID0gcGF5bG9hZD8ub3JnYW5pemF0aW9uSWQ/LnRyaW0oKSB8fCAndW5rbm93bi1vcmcnO1xuXG4gICAgICAgIGNvbnN0IHNlY3JldFZhbHVlID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIHVzZXJuYW1lOiBvcmdJZCxcbiAgICAgICAgICBwYXNzd29yZDogYWNjZXNzVG9rZW4sXG4gICAgICAgICAgLi4uKHJlZnJlc2hUb2tlbiAmJiB7IHJlZnJlc2hUb2tlbiB9KSxcbiAgICAgICAgICBwbGF0Zm9ybVVybDogY2xpZW50LmdldEJhc2VVcmwoKSxcbiAgICAgICAgICBleHBpcmVzSW46IGFjdHVhbEV4cGlyZXNJbixcbiAgICAgICAgICBleHBpcmVzQXQsXG4gICAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERyeS1ydW46IHNob3cgd2hhdCB3b3VsZCBiZSBzdG9yZWRcbiAgICAgICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuanNvbikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICBkcnlSdW46IHRydWUsXG4gICAgICAgICAgICAgIHNlY3JldE5hbWUsXG4gICAgICAgICAgICAgIHJlZ2lvbixcbiAgICAgICAgICAgICAgZXhwaXJlc0luRGF5czogZGF5cyxcbiAgICAgICAgICAgICAgZXhwaXJlc0F0LFxuICAgICAgICAgICAgICB0b2tlbkxlbmd0aDogYWNjZXNzVG9rZW4ubGVuZ3RoLFxuICAgICAgICAgICAgICBoYXNSZWZyZXNoVG9rZW46ICEhcmVmcmVzaFRva2VuLFxuICAgICAgICAgICAgfSwgbnVsbCwgMikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgICBwcmludFNlY3Rpb24oJ0RyeSBSdW4g4oCUIE5vIENoYW5nZXMgTWFkZScpO1xuICAgICAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgICAgICdTZWNyZXQgTmFtZSc6IHNlY3JldE5hbWUsXG4gICAgICAgICAgICAgICdSZWdpb24nOiByZWdpb24sXG4gICAgICAgICAgICAgICdFeHBpcmVzIEluJzogYCR7ZGF5c30gZGF5c2AsXG4gICAgICAgICAgICAgICdSZW5ldyBCeSc6IGV4cGlyZXNBdCxcbiAgICAgICAgICAgICAgJ1Rva2VuIExlbmd0aCc6IGAke2FjY2Vzc1Rva2VuLmxlbmd0aH0gY2hhcnNgLFxuICAgICAgICAgICAgICAnSGFzIFJlZnJlc2ggVG9rZW4nOiByZWZyZXNoVG9rZW4gPyAnWWVzJyA6ICdObycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHByaW50U3VjY2VzcygnRHJ5IHJ1biBjb21wbGV0ZSDigJQgbm8gc2VjcmV0IHdhcyBjcmVhdGVkIG9yIHVwZGF0ZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RlcCAyOiBTdG9yZSB0b2tlbiBpbiBTZWNyZXRzIE1hbmFnZXJcbiAgICAgICAgcHJpbnRTZWN0aW9uKCdTdG9yZSBUb2tlbicpO1xuXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gYFBsYXRmb3JtIEpXVCB0b2tlbiAocmVuZXcgYnkgJHtleHBpcmVzQXR9KWA7XG4gICAgICAgIGF3YWl0IHVwc2VydFNlY3JldChzZWNyZXROYW1lLCBzZWNyZXRWYWx1ZSwgZGVzY3JpcHRpb24sIHsgcmVnaW9uLCBwcm9maWxlOiBvcHRpb25zLnByb2ZpbGUgfSk7XG5cbiAgICAgICAgY29uc3QgYXJuID0gYXdhaXQgZ2V0U2VjcmV0QXJuKHNlY3JldE5hbWUsIHsgcmVnaW9uLCBwcm9maWxlOiBvcHRpb25zLnByb2ZpbGUgfSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuanNvbikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBzZWNyZXROYW1lLFxuICAgICAgICAgICAgc2VjcmV0QXJuOiBhcm4sXG4gICAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgICBleHBpcmVzSW5EYXlzOiBkYXlzLFxuICAgICAgICAgICAgZXhwaXJlc0F0LFxuICAgICAgICAgIH0sIG51bGwsIDIpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgcHJpbnRTZWN0aW9uKCdUb2tlbiBTdG9yZWQnKTtcblxuICAgICAgICAgIHByaW50S2V5VmFsdWUoe1xuICAgICAgICAgICAgJ1NlY3JldCBOYW1lJzogc2VjcmV0TmFtZSxcbiAgICAgICAgICAgICdTZWNyZXQgQVJOJzogYXJuLFxuICAgICAgICAgICAgJ1JlZ2lvbic6IHJlZ2lvbixcbiAgICAgICAgICAgICdFeHBpcmVzIEluJzogYCR7ZGF5c30gZGF5c2AsXG4gICAgICAgICAgICAnUmVuZXcgQnknOiBleHBpcmVzQXQsXG4gICAgICAgICAgICAnU3RhdHVzJzogJ+KckyBTdG9yZWQnLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICAgIHByaW50U3VjY2VzcygnVG9rZW4gc3RvcmVkLiBUbyB1c2Ugd2l0aCBzeW50aC9kZXBsb3k6Jyk7XG4gICAgICAgICAgcHJpbnRJbmZvKGAgIGV4cG9ydCBQTEFURk9STV9TRUNSRVRfTkFNRT0ke3NlY3JldE5hbWV9YCk7XG4gICAgICAgICAgcHJpbnRJbmZvKCcgIHBpcGVsaW5lLW1hbmFnZXIgc3ludGggLS1pZCA8cGlwZWxpbmUtaWQ+IC0tc3RvcmUtdG9rZW5zJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICAgIHByaW50SW5mbyhgUmVuZXcgYmVmb3JlICR7ZXhwaXJlc0F0fSB3aXRoOiBwaXBlbGluZS1tYW5hZ2VyIHN0b3JlLXRva2VuIC0tZGF5cyAke2RheXN9YCk7XG4gICAgICAgIH1cblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkFQSV9SRVFVRVNULCB7XG4gICAgICAgICAgZGVidWc6IHByb2dyYW0ub3B0cygpLmRlYnVnLFxuICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgY29tbWFuZDogJ3N0b3JlLXRva2VuJyxcbiAgICAgICAgICAgIGV4ZWN1dGlvbklkLFxuICAgICAgICAgICAgc2VjcmV0TmFtZTogb3B0aW9ucy5zZWNyZXROYW1lIHx8ICcoZGVyaXZlZCBmcm9tIHRva2VuKScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG59XG4iXX0=
|
|
211
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtdG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvc3RvcmUtdG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoSCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVoRzs7OztHQUlHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxLQUFhO0lBQ3RDLE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLE1BQU0sS0FBSyxHQUFHLE9BQU8sRUFBRSxjQUFjLENBQUM7SUFDdEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyw2R0FBNkcsQ0FBQyxDQUFDO0lBQ2pJLENBQUM7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QUUsV0FBVyxDQUFDLFdBQVcsRUFBRTtnQkFDMUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLO2dCQUMzQixJQUFJLEVBQUUsSUFBSTtnQkFDVixPQUFPLEVBQUU7b0JBQ1AsT0FBTyxFQUFFLGFBQWE7b0JBQ3RCLFdBQVc7b0JBQ1gsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLElBQUksc0JBQXNCO2lCQUN6RDthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgQ29yZUNvbnN0YW50cyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgdmFsaWRhdGVOdW1iZXIgfSBmcm9tICcuLi9jb25maWcvY2xpLmNvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBhdWRpdExvZyB9IGZyb20gJy4uL3V0aWxzL2F1ZGl0LWxvZy5qcyc7XG5pbXBvcnQgeyBkZWNvZGVUb2tlblBheWxvYWQgfSBmcm9tICcuLi91dGlscy9hdXRoLWd1YXJkLmpzJztcbmltcG9ydCB7IHVwc2VydFNlY3JldCwgZ2V0U2VjcmV0QXJuIH0gZnJvbSAnLi4vdXRpbHMvYXdzLXNlY3JldHMuanMnO1xuaW1wb3J0IHsgY3JlYXRlQXV0aGVudGljYXRlZENsaWVudEFzeW5jLCBwcmludENvbW1hbmRIZWFkZXIsIHByaW50U3NsV2FybmluZyB9IGZyb20gJy4uL3V0aWxzL2NvbW1hbmQtdXRpbHMuanMnO1xuaW1wb3J0IHsgZ2V0Q29uZmlnV2l0aE9wdGlvbnMgfSBmcm9tICcuLi91dGlscy9jb25maWctbG9hZGVyLmpzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgcHJpbnRJbmZvLCBwcmludEtleVZhbHVlLCBwcmludFNlY3Rpb24sIHByaW50U3VjY2VzcyB9IGZyb20gJy4uL3V0aWxzL291dHB1dC11dGlscy5qcyc7XG5cbi8qKlxuICogQnVpbGQgdGhlIHNlY3JldCBuYW1lIGZyb20gdGhlIEpXVCB0b2tlbidzIG9yZ2FuaXphdGlvbklkLlxuICogUGF0dGVybjoge1NFQ1JFVFNfUEFUSF9QUkVGSVh9L3tvcmdJZH0vcGxhdGZvcm1cbiAqIEB0aHJvd3MgRXJyb3IgaWYgb3JnYW5pemF0aW9uSWQgaXMgbm90IHByZXNlbnQgaW4gdGhlIHRva2VuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTZWNyZXROYW1lKHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXlsb2FkID0gZGVjb2RlVG9rZW5QYXlsb2FkKHRva2VuKTtcbiAgY29uc3Qgb3JnSWQgPSBwYXlsb2FkPy5vcmdhbml6YXRpb25JZDtcbiAgaWYgKCFvcmdJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVG9rZW4gZG9lcyBub3QgY29udGFpbiBvcmdhbml6YXRpb25JZCDigJQgY2Fubm90IGRlcml2ZSBzZWNyZXQgbmFtZS4gVXNlIC0tc2VjcmV0LW5hbWUgdG8gc3BlY2lmeSBleHBsaWNpdGx5LicpO1xuICB9XG4gIHJldHVybiBgJHtDb3JlQ29uc3RhbnRzLlNFQ1JFVFNfUEFUSF9QUkVGSVh9LyR7b3JnSWR9L3BsYXRmb3JtYDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGBzdG9yZS10b2tlbmAgY29tbWFuZCB3aXRoIHRoZSBDTEkgcHJvZ3JhbS5cbiAqXG4gKiBHZW5lcmF0ZXMgYSBsb25nLWxpdmVkIEpXVCB0b2tlbiB2aWEgdGhlIHBsYXRmb3JtIEFQSSBhbmQgc3RvcmVzIGl0XG4gKiBpbiBBV1MgU2VjcmV0cyBNYW5hZ2VyIGZvciB1c2UgYnkgdGhlIHN5bnRoL2RlcGxveSAtLXN0b3JlLXRva2VucyBmbGFnLlxuICpcbiAqIFJlcXVpcmVzIFBMQVRGT1JNX1RPS0VOIHRvIGJlIHNldCwgb3IgdXNlIC0tZW1haWwvLS1wYXNzd29yZCB0byBsb2dpbiBpbmxpbmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGJhc2hcbiAqIHBpcGVsaW5lLW1hbmFnZXIgc3RvcmUtdG9rZW4gLS1yZWdpb24gdXMtZWFzdC0xXG4gKiBwaXBlbGluZS1tYW5hZ2VyIHN0b3JlLXRva2VuIC0tZGF5cyA5MCAtLXJlZ2lvbiB1cy1lYXN0LTFcbiAqIHBpcGVsaW5lLW1hbmFnZXIgc3RvcmUtdG9rZW4gLS1kYXlzIDcgLS1zZWNyZXQtbmFtZSBteS1jdXN0b20tc2VjcmV0IC0tbm8tdmVyaWZ5LXNzbFxuICogcGlwZWxpbmUtbWFuYWdlciBzdG9yZS10b2tlbiAtLWRyeS1ydW5cbiAqIHBpcGVsaW5lLW1hbmFnZXIgc3RvcmUtdG9rZW4gLWUgYWRtaW4gLXAgJyoqKicgLS1yZWdpb24gdXMtZWFzdC0xXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlVG9rZW4ocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoJ3N0b3JlLXRva2VuJylcbiAgICAuZGVzY3JpcHRpb24oJ0dlbmVyYXRlIEpXVCB0b2tlbiBhbmQgc3RvcmUgaW4gQVdTIFNlY3JldHMgTWFuYWdlciBmb3IgQ0RLIGRlcGxveW1lbnRzJylcbiAgICAub3B0aW9uKCctZSwgLS1lbWFpbCA8ZW1haWw+JywgJ0xvZ2luIGVtYWlsIChza2lwcyBQTEFURk9STV9UT0tFTiByZXF1aXJlbWVudCknKVxuICAgIC5vcHRpb24oJy1wLCAtLXBhc3N3b3JkIDxwYXNzd29yZD4nLCAnTG9naW4gcGFzc3dvcmQgKHVzZWQgd2l0aCAtLWVtYWlsKScpXG4gICAgLm9wdGlvbignLS1kYXlzIDxkYXlzPicsICdUb2tlbiBsaWZldGltZSBpbiBkYXlzJywgJzMwJylcbiAgICAub3B0aW9uKCctLWRyeS1ydW4nLCAnU2hvdyB3aGF0IHdvdWxkIGJlIHN0b3JlZCB3aXRob3V0IHdyaXRpbmcgdG8gU2VjcmV0cyBNYW5hZ2VyJywgZmFsc2UpXG4gICAgLm9wdGlvbignLS1zZWNyZXQtbmFtZSA8bmFtZT4nLCAnU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBuYW1lIChkZWZhdWx0OiBkZXJpdmVkIGZyb20gdG9rZW4gb3JnKScpXG4gICAgLm9wdGlvbignLS1yZWdpb24gPHJlZ2lvbj4nLCAnQVdTIHJlZ2lvbiAoZGVmYXVsdHMgdG8gQVdTX1JFR0lPTiBlbnYpJylcbiAgICAub3B0aW9uKCctLXByb2ZpbGUgPHByb2ZpbGU+JywgJ0FXUyBDTEkgcHJvZmlsZScsICdkZWZhdWx0JylcbiAgICAub3B0aW9uKCctLWpzb24nLCAnT3V0cHV0IHJlc3VsdCBhcyBKU09OJywgZmFsc2UpXG4gICAgLm9wdGlvbignLS12ZXJpZnktc3NsJywgJ0VuYWJsZSBTU0wgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uJylcbiAgICAub3B0aW9uKCctLW5vLXZlcmlmeS1zc2wnLCAnRGlzYWJsZSBTU0wgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uJylcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBleGVjdXRpb25JZCA9IHByaW50Q29tbWFuZEhlYWRlcignU3RvcmUgVG9rZW4nKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcHJpbnRTc2xXYXJuaW5nKG9wdGlvbnMudmVyaWZ5U3NsKTtcblxuICAgICAgICBjb25zdCByZWdpb24gPSBvcHRpb25zLnJlZ2lvbiB8fCBwcm9jZXNzLmVudi5BV1NfUkVHSU9OIHx8IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX1JFR0lPTiB8fCAndXMtZWFzdC0xJztcblxuICAgICAgICBjb25zdCBkYXlzID0gdmFsaWRhdGVOdW1iZXIob3B0aW9ucy5kYXlzLCAnZGF5cycsIDEsIDM2NSk7XG4gICAgICAgIGNvbnN0IGV4cGlyZXNJblNlY29uZHMgPSBkYXlzICogMjQgKiA2MCAqIDYwO1xuXG4gICAgICAgIC8vIFN0ZXAgMDogSWYgLS1lbWFpbC8tLXBhc3N3b3JkIHByb3ZpZGVkIGFuZCBubyBQTEFURk9STV9UT0tFTiwgbG9naW4gZmlyc3RcbiAgICAgICAgaWYgKG9wdGlvbnMuZW1haWwgJiYgb3B0aW9ucy5wYXNzd29yZCAmJiAhcHJvY2Vzcy5lbnYuUExBVEZPUk1fVE9LRU4pIHtcbiAgICAgICAgICBwcmludFNlY3Rpb24oJ0xvZ2luJyk7XG4gICAgICAgICAgcHJpbnRJbmZvKCdBdXRoZW50aWNhdGluZyB3aXRoIGVtYWlsL3Bhc3N3b3JkLi4uJyk7XG5cbiAgICAgICAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWdXaXRoT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgICBjb25zdCBsb2dpblVybCA9IGAke2NvbmZpZy5hcGkuYmFzZVVybH0vYXBpL2F1dGgvbG9naW5gO1xuXG4gICAgICAgICAgY29uc3QgbG9naW5SZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3QobG9naW5VcmwsIHtcbiAgICAgICAgICAgIGVtYWlsOiBvcHRpb25zLmVtYWlsLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IG9wdGlvbnMucGFzc3dvcmQsXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgaHR0cHNBZ2VudDogY29uZmlnLmFwaS5yZWplY3RVbmF1dGhvcml6ZWQgPT09IGZhbHNlXG4gICAgICAgICAgICAgID8gbmV3IChhd2FpdCBpbXBvcnQoJ2h0dHBzJykpLkFnZW50KHsgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSB9KVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IGxvZ2luRGF0YSA9IGxvZ2luUmVzcG9uc2UuZGF0YT8uZGF0YSA/PyBsb2dpblJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgY29uc3QgbG9naW5Ub2tlbiA9IGxvZ2luRGF0YT8uYWNjZXNzVG9rZW47XG5cbiAgICAgICAgICBpZiAoIWxvZ2luVG9rZW4gfHwgdHlwZW9mIGxvZ2luVG9rZW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvZ2luIGZhaWxlZCDigJQgbm8gYWNjZXNzIHRva2VuIGluIHJlc3BvbnNlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHJvY2Vzcy5lbnYuUExBVEZPUk1fVE9LRU4gPSBsb2dpblRva2VuO1xuICAgICAgICAgIHByaW50U3VjY2VzcygnTG9naW4gc3VjY2Vzc2Z1bCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RlcCAxOiBBdXRoZW50aWNhdGUgYW5kIGdlbmVyYXRlIGxvbmctbGl2ZWQgdG9rZW5cbiAgICAgICAgcHJpbnRTZWN0aW9uKCdHZW5lcmF0ZSBUb2tlbicpO1xuXG4gICAgICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnRBc3luYyhvcHRpb25zKTtcblxuICAgICAgICAvLyBSZXNvbHZlIHNlY3JldCBuYW1lIGZyb20gdG9rZW4ncyBvcmdhbml6YXRpb25JZCAodW5sZXNzIC0tc2VjcmV0LW5hbWUgd2FzIGV4cGxpY2l0bHkgc2V0KVxuICAgICAgICBjb25zdCBzZWNyZXROYW1lID0gb3B0aW9ucy5zZWNyZXROYW1lIHx8IHJlc29sdmVTZWNyZXROYW1lKHByb2Nlc3MuZW52LlBMQVRGT1JNX1RPS0VOISk7XG5cbiAgICAgICAgYXVkaXRMb2coJ3N0b3JlLXRva2VuJywgeyBleGVjdXRpb25JZCwgc2VjcmV0TmFtZSwgZGF5czogb3B0aW9ucy5kYXlzLCBkcnlSdW46IG9wdGlvbnMuZHJ5UnVuIH0pO1xuXG4gICAgICAgIHByaW50SW5mbygnUGFyYW1ldGVycycsIHtcbiAgICAgICAgICBzZWNyZXROYW1lLFxuICAgICAgICAgIHJlZ2lvbixcbiAgICAgICAgICBkYXlzLFxuICAgICAgICAgIGV4cGlyZXNJbjogYCR7ZXhwaXJlc0luU2Vjb25kc31zYCxcbiAgICAgICAgICBkcnlSdW46IG9wdGlvbnMuZHJ5UnVuLFxuICAgICAgICB9KTtcblxuICAgICAgICBwcmludEluZm8oJ1JlcXVlc3RpbmcgdG9rZW4nLCB7IGV4cGlyZXNJbjogYCR7ZXhwaXJlc0luU2Vjb25kc31zICgke2RheXN9IGRheXMpYCB9KTtcblxuICAgICAgICBjb25zdCB0b2tlblJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3Q8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgICAgICAgICcvYXBpL3VzZXIvZ2VuZXJhdGUtdG9rZW4nLFxuICAgICAgICAgIHsgZXhwaXJlc0luOiBleHBpcmVzSW5TZWNvbmRzIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgdG9rZW5EYXRhID0gKHRva2VuUmVzcG9uc2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy5kYXRhID8/IHRva2VuUmVzcG9uc2U7XG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gKHRva2VuRGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik/LmFjY2Vzc1Rva2VuIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgcmVmcmVzaFRva2VuID0gKHRva2VuRGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik/LnJlZnJlc2hUb2tlbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGFjdHVhbEV4cGlyZXNJbiA9ICgodG9rZW5EYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KT8uZXhwaXJlc0luIGFzIG51bWJlcikgPz8gZXhwaXJlc0luU2Vjb25kcztcblxuICAgICAgICBpZiAoIWFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBnZW5lcmF0aW9uIGZhaWxlZCDigJQgbm8gYWNjZXNzIHRva2VuIGluIHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBwcmludFN1Y2Nlc3MoYFRva2VuIGdlbmVyYXRlZCAoZXhwaXJlcyBpbiAke2FjdHVhbEV4cGlyZXNJbn1zKWApO1xuXG4gICAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBhY3R1YWxFeHBpcmVzSW4gKiAxMDAwKS50b0lTT1N0cmluZygpO1xuXG4gICAgICAgIC8vIFNjaGVtYTogeyB1c2VybmFtZTogb3JnSWQsIHBhc3N3b3JkOiBKV1QsIC4uLm1ldGFkYXRhIH1cbiAgICAgICAgLy8gLSB1c2VybmFtZS9wYXNzd29yZCBmaWVsZHMgc2F0aXNmeSBDb2RlQnVpbGQncyBgc2VjcmV0c01hbmFnZXJDcmVkZW50aWFsc2BcbiAgICAgICAgLy8gICAoSFRUUCBCYXNpYywgc2VudCB0byBwaXBlbGluZS1pbWFnZS1yZWdpc3RyeSdzIC90b2tlbiBlbmRwb2ludClcbiAgICAgICAgLy8gLSBUaGUgc2FtZSBKV1QgaXMgY29uc3VtZWQgYnkgdGhlIHBsdWdpbi1sb29rdXAgTGFtYmRhIGJ5IHJlYWRpbmdcbiAgICAgICAgLy8gICB0aGUgYHBhc3N3b3JkYCBmaWVsZFxuICAgICAgICAvLyAtIE9uZSBTZWNyZXQgcGVyIGN1c3RvbWVyIGFjY291bnQgcmVwbGFjZXMgdGhlIHByZXZpb3VzIHR3by1zZWNyZXQgbW9kZWxcbiAgICAgICAgLy8gRGVjb2RlIEpXVCBmb3Igb3JnSWQg4oCUIGl0J3MgYSBzdGFibGUgaWRlbnRpZmllciBmb3IgdGhlIHVzZXJuYW1lIGZpZWxkO1xuICAgICAgICAvLyB0aGUgYWN0dWFsIGF1dGggdXNlcyB0aGUgcGFzc3dvcmQgKEpXVCkgd2hpY2ggdGhlIHRva2VuIHNlcnZpY2UgdmVyaWZpZXMuXG4gICAgICAgIC8vIGB8fGAgKG5vdCBgPz9gKTogYW4gRU1QVFktc3RyaW5nIG9yZ2FuaXphdGlvbklkIG11c3QgYWxzbyBmYWxsIGJhY2suIEFcbiAgICAgICAgLy8gc3lzYWRtaW4vc3lzdGVtIHRva2VuIG9mdGVuIGNhcnJpZXMgb3JnYW5pemF0aW9uSWQ9XCJcIiwgYW5kIENvZGVCdWlsZFxuICAgICAgICAvLyByZWplY3RzIGEgcmVnaXN0cnkgY3JlZGVudGlhbCB3aG9zZSBgdXNlcm5hbWVgIGZpZWxkIGlzIGVtcHR5IHdpdGhcbiAgICAgICAgLy8gXCJBdXRob3JpemF0aW9uRGF0YSBpcyBtYWxmb3JtZWQsIGVtcHR5IGZpZWxkXCIg4oCUIHNvIHVzZXJuYW1lIG11c3QgYWx3YXlzXG4gICAgICAgIC8vIGJlIGEgbm9uLWVtcHR5IHZhbHVlLlxuICAgICAgICBjb25zdCBwYXlsb2FkID0gZGVjb2RlVG9rZW5QYXlsb2FkKGFjY2Vzc1Rva2VuKTtcbiAgICAgICAgY29uc3Qgb3JnSWQgPSBwYXlsb2FkPy5vcmdhbml6YXRpb25JZD8udHJpbSgpIHx8ICd1bmtub3duLW9yZyc7XG5cbiAgICAgICAgY29uc3Qgc2VjcmV0VmFsdWUgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgdXNlcm5hbWU6IG9yZ0lkLFxuICAgICAgICAgIHBhc3N3b3JkOiBhY2Nlc3NUb2tlbixcbiAgICAgICAgICAuLi4ocmVmcmVzaFRva2VuICYmIHsgcmVmcmVzaFRva2VuIH0pLFxuICAgICAgICAgIHBsYXRmb3JtVXJsOiBjbGllbnQuZ2V0QmFzZVVybCgpLFxuICAgICAgICAgIGV4cGlyZXNJbjogYWN0dWFsRXhwaXJlc0luLFxuICAgICAgICAgIGV4cGlyZXNBdCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRHJ5LXJ1bjogc2hvdyB3aGF0IHdvdWxkIGJlIHN0b3JlZFxuICAgICAgICBpZiAob3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgIGRyeVJ1bjogdHJ1ZSxcbiAgICAgICAgICAgICAgc2VjcmV0TmFtZSxcbiAgICAgICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgICAgICBleHBpcmVzSW5EYXlzOiBkYXlzLFxuICAgICAgICAgICAgICBleHBpcmVzQXQsXG4gICAgICAgICAgICAgIHRva2VuTGVuZ3RoOiBhY2Nlc3NUb2tlbi5sZW5ndGgsXG4gICAgICAgICAgICAgIGhhc1JlZnJlc2hUb2tlbjogISFyZWZyZXNoVG9rZW4sXG4gICAgICAgICAgICB9LCBudWxsLCAyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgICAgIHByaW50U2VjdGlvbignRHJ5IFJ1biDigJQgTm8gQ2hhbmdlcyBNYWRlJyk7XG4gICAgICAgICAgICBwcmludEtleVZhbHVlKHtcbiAgICAgICAgICAgICAgJ1NlY3JldCBOYW1lJzogc2VjcmV0TmFtZSxcbiAgICAgICAgICAgICAgJ1JlZ2lvbic6IHJlZ2lvbixcbiAgICAgICAgICAgICAgJ0V4cGlyZXMgSW4nOiBgJHtkYXlzfSBkYXlzYCxcbiAgICAgICAgICAgICAgJ1JlbmV3IEJ5JzogZXhwaXJlc0F0LFxuICAgICAgICAgICAgICAnVG9rZW4gTGVuZ3RoJzogYCR7YWNjZXNzVG9rZW4ubGVuZ3RofSBjaGFyc2AsXG4gICAgICAgICAgICAgICdIYXMgUmVmcmVzaCBUb2tlbic6IHJlZnJlc2hUb2tlbiA/ICdZZXMnIDogJ05vJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcHJpbnRTdWNjZXNzKCdEcnkgcnVuIGNvbXBsZXRlIOKAlCBubyBzZWNyZXQgd2FzIGNyZWF0ZWQgb3IgdXBkYXRlZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDI6IFN0b3JlIHRva2VuIGluIFNlY3JldHMgTWFuYWdlclxuICAgICAgICBwcmludFNlY3Rpb24oJ1N0b3JlIFRva2VuJyk7XG5cbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBgUGxhdGZvcm0gSldUIHRva2VuIChyZW5ldyBieSAke2V4cGlyZXNBdH0pYDtcbiAgICAgICAgYXdhaXQgdXBzZXJ0U2VjcmV0KHNlY3JldE5hbWUsIHNlY3JldFZhbHVlLCBkZXNjcmlwdGlvbiwgeyByZWdpb24sIHByb2ZpbGU6IG9wdGlvbnMucHJvZmlsZSB9KTtcblxuICAgICAgICBjb25zdCBhcm4gPSBhd2FpdCBnZXRTZWNyZXRBcm4oc2VjcmV0TmFtZSwgeyByZWdpb24sIHByb2ZpbGU6IG9wdGlvbnMucHJvZmlsZSB9KTtcblxuICAgICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIHNlY3JldE5hbWUsXG4gICAgICAgICAgICBzZWNyZXRBcm46IGFybixcbiAgICAgICAgICAgIHJlZ2lvbixcbiAgICAgICAgICAgIGV4cGlyZXNJbkRheXM6IGRheXMsXG4gICAgICAgICAgICBleHBpcmVzQXQsXG4gICAgICAgICAgfSwgbnVsbCwgMikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgICBwcmludFNlY3Rpb24oJ1Rva2VuIFN0b3JlZCcpO1xuXG4gICAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgICAnU2VjcmV0IE5hbWUnOiBzZWNyZXROYW1lLFxuICAgICAgICAgICAgJ1NlY3JldCBBUk4nOiBhcm4sXG4gICAgICAgICAgICAnUmVnaW9uJzogcmVnaW9uLFxuICAgICAgICAgICAgJ0V4cGlyZXMgSW4nOiBgJHtkYXlzfSBkYXlzYCxcbiAgICAgICAgICAgICdSZW5ldyBCeSc6IGV4cGlyZXNBdCxcbiAgICAgICAgICAgICdTdGF0dXMnOiAn4pyTIFN0b3JlZCcsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgcHJpbnRTdWNjZXNzKCdUb2tlbiBzdG9yZWQuIFRvIHVzZSB3aXRoIHN5bnRoL2RlcGxveTonKTtcbiAgICAgICAgICBwcmludEluZm8oYCAgZXhwb3J0IFBMQVRGT1JNX1NFQ1JFVF9OQU1FPSR7c2VjcmV0TmFtZX1gKTtcbiAgICAgICAgICBwcmludEluZm8oJyAgcGlwZWxpbmUtbWFuYWdlciBzeW50aCAtLWlkIDxwaXBlbGluZS1pZD4gLS1zdG9yZS10b2tlbnMnKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgcHJpbnRJbmZvKGBSZW5ldyBiZWZvcmUgJHtleHBpcmVzQXR9IHdpdGg6IHBpcGVsaW5lLW1hbmFnZXIgc3RvcmUtdG9rZW4gLS1kYXlzICR7ZGF5c31gKTtcbiAgICAgICAgfVxuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuQVBJX1JFUVVFU1QsIHtcbiAgICAgICAgICBkZWJ1ZzogcHJvZ3JhbS5vcHRzKCkuZGVidWcsXG4gICAgICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICBjb21tYW5kOiAnc3RvcmUtdG9rZW4nLFxuICAgICAgICAgICAgZXhlY3V0aW9uSWQsXG4gICAgICAgICAgICBzZWNyZXROYW1lOiBvcHRpb25zLnNlY3JldE5hbWUgfHwgJyhkZXJpdmVkIGZyb20gdG9rZW4pJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"synth.d.ts","sourceRoot":"","sources":["../../src/commands/synth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"synth.d.ts","sourceRoot":"","sources":["../../src/commands/synth.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuDpC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsG5C"}
|
package/dist/commands/synth.js
CHANGED
|
@@ -1,26 +1,28 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
3
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
3
|
+
import { dirname } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { assertShellSafe } from '../config/cli.constants.js';
|
|
7
|
+
import { auditLog } from '../utils/audit-log.js';
|
|
8
|
+
import { ensureCdkAvailable, executeCdkShellCommand, resolveBoilerplatePath } from '../utils/cdk-utils.js';
|
|
9
|
+
import { createAuthenticatedClientAsync, printCommandHeader, printSslWarning } from '../utils/command-utils.js';
|
|
10
|
+
import { ERROR_CODES, handleError } from '../utils/error-handler.js';
|
|
11
|
+
import { extractSingleResponse, printError, printInfo, printKeyValue, printSection, printSuccess, printWarning } from '../utils/output-utils.js';
|
|
12
|
+
import { resolvePluginsForProps } from '../utils/plugin-resolver.js';
|
|
13
|
+
// ESM has no __dirname; derive it from this module's URL.
|
|
14
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
13
15
|
/**
|
|
14
16
|
* Fetch pipeline config and set PIPELINE_PROPS env var for the boilerplate app.
|
|
15
17
|
* Uses createAuthenticatedClientAsync which supports all three auth methods.
|
|
16
18
|
*/
|
|
17
19
|
async function fetchPipelineConfig(pipelineId, options) {
|
|
18
|
-
const client = await
|
|
20
|
+
const client = await createAuthenticatedClientAsync(options);
|
|
19
21
|
const config = client.getConfig();
|
|
20
22
|
const response = await client.get(`${config.api.pipelineUrl}/${pipelineId}`);
|
|
21
|
-
const pipeline =
|
|
23
|
+
const pipeline = extractSingleResponse(response, 'pipeline', 'props');
|
|
22
24
|
if (!pipeline?.props) {
|
|
23
|
-
|
|
25
|
+
printError('Pipeline has no props', { id: pipelineId });
|
|
24
26
|
throw new Error(`Failed to retrieve pipeline props for ID: ${pipelineId}`);
|
|
25
27
|
}
|
|
26
28
|
const propsWithIds = {
|
|
@@ -33,13 +35,13 @@ async function fetchPipelineConfig(pipelineId, options) {
|
|
|
33
35
|
// ships with real CodeBuild image URIs baked in. Without this, CDK falls
|
|
34
36
|
// back to standard:7.0 because the deploy-time custom resource attribute
|
|
35
37
|
// is unresolvable at synth time.
|
|
36
|
-
const resolvedPlugins = await
|
|
38
|
+
const resolvedPlugins = await resolvePluginsForProps(client, propsWithIds);
|
|
37
39
|
if (Object.keys(resolvedPlugins).length > 0) {
|
|
38
40
|
propsWithIds.resolvedPlugins = resolvedPlugins;
|
|
39
|
-
|
|
41
|
+
printInfo('Pre-resolved plugins', { count: Object.keys(resolvedPlugins).length });
|
|
40
42
|
}
|
|
41
43
|
process.env.PIPELINE_PROPS = Buffer.from(JSON.stringify(propsWithIds)).toString('base64');
|
|
42
|
-
|
|
44
|
+
printSuccess('Pipeline configuration loaded');
|
|
43
45
|
}
|
|
44
46
|
/**
|
|
45
47
|
* Registers the `synth` command with the CLI program.
|
|
@@ -59,7 +61,7 @@ async function fetchPipelineConfig(pipelineId, options) {
|
|
|
59
61
|
* pipeline-manager synth --quiet --no-notices # CodePipeline (uses env vars)
|
|
60
62
|
* ```
|
|
61
63
|
*/
|
|
62
|
-
function synth(program) {
|
|
64
|
+
export function synth(program) {
|
|
63
65
|
program
|
|
64
66
|
.command('synth')
|
|
65
67
|
.description('Run CDK synthesis using pipeline configuration')
|
|
@@ -76,7 +78,7 @@ function synth(program) {
|
|
|
76
78
|
.option('--no-verify-ssl', 'Disable SSL certificate verification')
|
|
77
79
|
.option('--show-resolved', 'Print the resolved pipeline config (with {{ ... }} templates expanded) and exit without running CDK', false)
|
|
78
80
|
.action(async (options) => {
|
|
79
|
-
const executionId =
|
|
81
|
+
const executionId = printCommandHeader('CDK Synthesis');
|
|
80
82
|
try {
|
|
81
83
|
const pipelineId = options.id || process.env.PIPELINE_ID;
|
|
82
84
|
// --show-resolved: preview templates and exit
|
|
@@ -84,29 +86,29 @@ function synth(program) {
|
|
|
84
86
|
await showResolvedPipeline(pipelineId, options);
|
|
85
87
|
return;
|
|
86
88
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
+
auditLog('synth', { executionId, pipelineId, output: options.output, profile: options.profile });
|
|
90
|
+
printSslWarning(options.verifySsl);
|
|
89
91
|
// Propagate to process.env so CDK constructs (Lambda, CodeBuild) inherit it
|
|
90
92
|
if (options.verifySsl === false) {
|
|
91
93
|
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
|
|
92
94
|
}
|
|
93
95
|
// Fetch pipeline config if ID is available and PIPELINE_PROPS not already set
|
|
94
96
|
if (pipelineId && !process.env.PIPELINE_PROPS) {
|
|
95
|
-
|
|
97
|
+
printInfo('Fetching pipeline configuration', { id: pipelineId });
|
|
96
98
|
await fetchPipelineConfig(pipelineId, options);
|
|
97
99
|
}
|
|
98
100
|
else if (!pipelineId && !process.env.PIPELINE_PROPS) {
|
|
99
|
-
|
|
101
|
+
printWarning('No pipeline ID or PIPELINE_PROPS set');
|
|
100
102
|
throw new Error('Pipeline ID is required. Use --id <id> or set PIPELINE_ID env var.');
|
|
101
103
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
+
ensureCdkAvailable();
|
|
105
|
+
printSuccess('AWS CDK is available');
|
|
104
106
|
// Build cdk synth command
|
|
105
107
|
if (options.output)
|
|
106
|
-
|
|
108
|
+
assertShellSafe(options.output, 'output');
|
|
107
109
|
if (options.profile)
|
|
108
|
-
|
|
109
|
-
const boilerplatePath =
|
|
110
|
+
assertShellSafe(options.profile, 'profile');
|
|
111
|
+
const boilerplatePath = resolveBoilerplatePath(__dirname);
|
|
110
112
|
const parts = [
|
|
111
113
|
'cdk synth',
|
|
112
114
|
`--app="node ${boilerplatePath}"`,
|
|
@@ -121,13 +123,13 @@ function synth(program) {
|
|
|
121
123
|
if (options.verbose)
|
|
122
124
|
parts.push('--verbose');
|
|
123
125
|
const command = parts.join(' ');
|
|
124
|
-
|
|
126
|
+
printInfo('Executing', { command: (command.split('--app')[0] ?? '').trim() + ' ...' });
|
|
125
127
|
console.log('');
|
|
126
|
-
const result =
|
|
128
|
+
const result = executeCdkShellCommand(command, {
|
|
127
129
|
showOutput: !options.quiet,
|
|
128
130
|
});
|
|
129
131
|
console.log('');
|
|
130
|
-
|
|
132
|
+
printSection('Synthesis Complete');
|
|
131
133
|
if (result.success) {
|
|
132
134
|
if (options.json) {
|
|
133
135
|
console.log(JSON.stringify({
|
|
@@ -138,7 +140,7 @@ function synth(program) {
|
|
|
138
140
|
}, null, 2));
|
|
139
141
|
}
|
|
140
142
|
else {
|
|
141
|
-
|
|
143
|
+
printKeyValue({
|
|
142
144
|
'Execution ID': executionId,
|
|
143
145
|
'Duration': `${result.duration}ms`,
|
|
144
146
|
'Output': options.output,
|
|
@@ -148,7 +150,7 @@ function synth(program) {
|
|
|
148
150
|
}
|
|
149
151
|
}
|
|
150
152
|
catch (error) {
|
|
151
|
-
|
|
153
|
+
handleError(error, ERROR_CODES.API_REQUEST, {
|
|
152
154
|
debug: program.opts().debug,
|
|
153
155
|
exit: true,
|
|
154
156
|
context: { command: 'synth', executionId, pipelineId: options.id },
|
|
@@ -172,8 +174,7 @@ async function showResolvedPipeline(pipelineId, options) {
|
|
|
172
174
|
throw new Error('Failed to fetch pipeline configuration');
|
|
173
175
|
const decoded = JSON.parse(Buffer.from(encoded, 'base64').toString('utf-8'));
|
|
174
176
|
// Lazy import to avoid pulling pipeline-core into every CLI invocation
|
|
175
|
-
|
|
176
|
-
const { resolveSelfReferencing } = require('@pipeline-builder/pipeline-core');
|
|
177
|
+
const { resolveSelfReferencing } = await import('@pipeline-builder/pipeline-core');
|
|
177
178
|
const scope = { metadata: decoded.metadata ?? {}, vars: decoded.vars ?? {} };
|
|
178
179
|
const isTemplatable = (f) => f === 'projectName' || f.startsWith('metadata.') || f.startsWith('vars.');
|
|
179
180
|
const fieldToScope = (f) => isTemplatable(f) ? f : null;
|
|
@@ -187,4 +188,4 @@ async function showResolvedPipeline(pipelineId, options) {
|
|
|
187
188
|
}
|
|
188
189
|
console.log(JSON.stringify(decoded, null, 2));
|
|
189
190
|
}
|
|
190
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ludGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvc3ludGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7O0FBd0V0QyxzQkFzR0M7QUEzS0QsMkRBQTBEO0FBRTFELGtEQUE4QztBQUM5QyxrREFBd0c7QUFDeEcsMERBQTZHO0FBQzdHLDBEQUFrRTtBQUNsRSx3REFBOEk7QUFDOUksOERBQWtFO0FBRWxFOzs7R0FHRztBQUNILEtBQUssVUFBVSxtQkFBbUIsQ0FDaEMsVUFBa0IsRUFDbEIsT0FBMEY7SUFFMUYsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLDhDQUE4QixFQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUVsQyxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQy9CLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksVUFBVSxFQUFFLENBQzFDLENBQUM7SUFFRixNQUFNLFFBQVEsR0FBRyxJQUFBLG9DQUFxQixFQUFXLFFBQVEsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFaEYsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNyQixJQUFBLHlCQUFVLEVBQUMsdUJBQXVCLEVBQUUsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUN4RCxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxNQUFNLFlBQVksR0FBNEI7UUFDNUMsR0FBRyxRQUFRLENBQUMsS0FBZ0M7UUFDNUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxFQUFFLElBQUksVUFBVTtLQUN0QyxDQUFDO0lBQ0YsSUFBSSxRQUFRLENBQUMsS0FBSztRQUFFLFlBQVksQ0FBQyxLQUFL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NiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBhc3NlcnRTaGVsbFNhZmUgfSBmcm9tICcuLi9jb25maWcvY2xpLmNvbnN0YW50cyc7XG5pbXBvcnQgdHlwZSB7IFBpcGVsaW5lIH0gZnJvbSAnLi4vdHlwZXMvcGlwZWxpbmUnO1xuaW1wb3J0IHsgYXVkaXRMb2cgfSBmcm9tICcuLi91dGlscy9hdWRpdC1sb2cnO1xuaW1wb3J0IHsgZW5zdXJlQ2RrQXZhaWxhYmxlLCBleGVjdXRlQ2RrU2hlbGxDb21tYW5kLCByZXNvbHZlQm9pbGVycGxhdGVQYXRoIH0gZnJvbSAnLi4vdXRpbHMvY2RrLXV0aWxzJztcbmltcG9ydCB7IGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnRBc3luYywgcHJpbnRDb21tYW5kSGVhZGVyLCBwcmludFNzbFdhcm5pbmcgfSBmcm9tICcuLi91dGlscy9jb21tYW5kLXV0aWxzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yLWhhbmRsZXInO1xuaW1wb3J0IHsgZXh0cmFjdFNpbmdsZVJlc3BvbnNlLCBwcmludEVycm9yLCBwcmludEluZm8sIHByaW50S2V5VmFsdWUsIHByaW50U2VjdGlvbiwgcHJpbnRTdWNjZXNzLCBwcmludFdhcm5pbmcgfSBmcm9tICcuLi91dGlscy9vdXRwdXQtdXRpbHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVBsdWdpbnNGb3JQcm9wcyB9IGZyb20gJy4uL3V0aWxzL3BsdWdpbi1yZXNvbHZlcic7XG5cbi8qKlxuICogRmV0Y2ggcGlwZWxpbmUgY29uZmlnIGFuZCBzZXQgUElQRUxJTkVfUFJPUFMgZW52IHZhciBmb3IgdGhlIGJvaWxlcnBsYXRlIGFwcC5cbiAqIFVzZXMgY3JlYXRlQXV0aGVudGljYXRlZENsaWVudEFzeW5jIHdoaWNoIHN1cHBvcnRzIGFsbCB0aHJlZSBhdXRoIG1ldGhvZHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUGlwZWxpbmVDb25maWcoXG4gIHBpcGVsaW5lSWQ6IHN0cmluZyxcbiAgb3B0aW9uczogeyBzdG9yZVRva2Vucz86IGJvb2xlYW47IHZlcmlmeVNzbD86IGJvb2xlYW47IHJlZ2lvbj86IHN0cmluZzsgcHJvZmlsZT86IHN0cmluZyB9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNsaWVudCA9IGF3YWl0IGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnRBc3luYyhvcHRpb25zKTtcbiAgY29uc3QgY29uZmlnID0gY2xpZW50LmdldENvbmZpZygpO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgYCR7Y29uZmlnLmFwaS5waXBlbGluZVVybH0vJHtwaXBlbGluZUlkfWAsXG4gICk7XG5cbiAgY29uc3QgcGlwZWxpbmUgPSBleHRyYWN0U2luZ2xlUmVzcG9uc2U8UGlwZWxpbmU+KHJlc3BvbnNlLCAncGlwZWxpbmUnLCAncHJvcHMnKTtcblxuICBpZiAoIXBpcGVsaW5lPy5wcm9wcykge1xuICAgIHByaW50RXJyb3IoJ1BpcGVsaW5lIGhhcyBubyBwcm9wcycsIHsgaWQ6IHBpcGVsaW5lSWQgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmV0cmlldmUgcGlwZWxpbmUgcHJvcHMgZm9yIElEOiAke3BpcGVsaW5lSWR9YCk7XG4gIH1cblxuICBjb25zdCBwcm9wc1dpdGhJZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIC4uLnBpcGVsaW5lLnByb3BzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHBpcGVsaW5lSWQ6IHBpcGVsaW5lLmlkIHx8IHBpcGVsaW5lSWQsXG4gIH07XG4gIGlmIChwaXBlbGluZS5vcmdJZCkgcHJvcHNXaXRoSWRzLm9yZ0lkID0gcGlwZWxpbmUub3JnSWQ7XG5cbiAgLy8gUHJlLXJlc29sdmUgcGx1Z2lucyBmcm9tIHRoZSBwbGF0Zm9ybSBBUEkgc28gdGhlIHN5bnRoZXNpemVkIHRlbXBsYXRlXG4gIC8vIHNoaXBzIHdpdGggcmVhbCBDb2RlQnVpbGQgaW1hZ2UgVVJJcyBiYWtlZCBpbi4gV2l0aG91dCB0aGlzLCBDREsgZmFsbHNcbiAgLy8gYmFjayB0byBzdGFuZGFyZDo3LjAgYmVjYXVzZSB0aGUgZGVwbG95LXRpbWUgY3VzdG9tIHJlc291cmNlIGF0dHJpYnV0ZVxuICAvLyBpcyB1bnJlc29sdmFibGUgYXQgc3ludGggdGltZS5cbiAgY29uc3QgcmVzb2x2ZWRQbHVnaW5zID0gYXdhaXQgcmVzb2x2ZVBsdWdpbnNGb3JQcm9wcyhjbGllbnQsIHByb3BzV2l0aElkcyk7XG4gIGlmIChPYmplY3Qua2V5cyhyZXNvbHZlZFBsdWdpbnMpLmxlbmd0aCA+IDApIHtcbiAgICBwcm9wc1dpdGhJZHMucmVzb2x2ZWRQbHVnaW5zID0gcmVzb2x2ZWRQbHVnaW5zO1xuICAgIHByaW50SW5mbygnUHJlLXJlc29sdmVkIHBsdWdpbnMnLCB7IGNvdW50OiBPYmplY3Qua2V5cyhyZXNvbHZlZFBsdWdpbnMpLmxlbmd0aCB9KTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52LlBJUEVMSU5FX1BST1BTID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkocHJvcHNXaXRoSWRzKSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICBwcmludFN1Y2Nlc3MoJ1BpcGVsaW5lIGNvbmZpZ3VyYXRpb24gbG9hZGVkJyk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHRoZSBgc3ludGhgIGNvbW1hbmQgd2l0aCB0aGUgQ0xJIHByb2dyYW0uXG4gKlxuICogUnVucyBDREsgc3ludGhlc2lzIHVzaW5nIHRoZSBib2lsZXJwbGF0ZSBhcHAuIFBpcGVsaW5lIGNvbmZpZyBpcyByZXNvbHZlZCBmcm9tOlxuICogMS4gLS1pZCBmbGFnIG9yIFBJUEVMSU5FX0lEIGVudiB2YXIg4oaSIGZldGNoZXMgY29uZmlnIGZyb20gcGxhdGZvcm0gQVBJXG4gKiAyLiBQSVBFTElORV9QUk9QUyBlbnYgdmFyIChwcmUtZW5jb2RlZCwgZnJvbSBkZXBsb3kgY29tbWFuZClcbiAqXG4gKiBBdXRoZW50aWNhdGlvbiBtZXRob2RzIChpbiBwcmlvcml0eSBvcmRlcik6XG4gKiAtIFBMQVRGT1JNX1RPS0VOIGVudiB2YXJcbiAqIC0gLS1zdG9yZS10b2tlbnMg4oaSIGZldGNoIGZyb20gQVdTIFNlY3JldHMgTWFuYWdlclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBiYXNoXG4gKiBwaXBlbGluZS1tYW5hZ2VyIHN5bnRoIC0taWQgPHBpcGVsaW5lLWlkPiAtLW5vLXZlcmlmeS1zc2xcbiAqIHBpcGVsaW5lLW1hbmFnZXIgc3ludGggLS1pZCA8cGlwZWxpbmUtaWQ+IC0tc3RvcmUtdG9rZW5zXG4gKiBwaXBlbGluZS1tYW5hZ2VyIHN5bnRoIC0tcXVpZXQgLS1uby1ub3RpY2VzICAgICAgICAgICMgQ29kZVBpcGVsaW5lICh1c2VzIGVudiB2YXJzKVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzeW50aChwcm9ncmFtOiBDb21tYW5kKTogdm9pZCB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZCgnc3ludGgnKVxuICAgIC5kZXNjcmlwdGlvbignUnVuIENESyBzeW50aGVzaXMgdXNpbmcgcGlwZWxpbmUgY29uZmlndXJhdGlvbicpXG4gICAgLm9wdGlvbignLWksIC0taWQgPGlkPicsICdQaXBlbGluZSBJRCAob3Igc2V0IFBJUEVMSU5FX0lEIGVudiB2YXIpJylcbiAgICAub3B0aW9uKCctLXN0b3JlLXRva2VucycsICdBdXRoZW50aWNhdGUgdXNpbmcgdG9rZW4gZnJvbSBBV1MgU2VjcmV0cyBNYW5hZ2VyIChyZXF1aXJlcyBQTEFURk9STV9TRUNSRVRfTkFNRSBlbnYgdmFyKScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tb3V0cHV0IDxkaXI+JywgJ0NESyBvdXRwdXQgZGlyZWN0b3J5JywgJ2Nkay5vdXQnKVxuICAgIC5vcHRpb24oJy0tcHJvZmlsZSA8cHJvZmlsZT4nLCAnQVdTIHByb2ZpbGUnKVxuICAgIC5vcHRpb24oJy0tcmVnaW9uIDxyZWdpb24+JywgJ0FXUyByZWdpb24gKGZvciAtLXN0b3JlLXRva2VucyknKVxuICAgIC5vcHRpb24oJy0tcXVpZXQnLCAnU3VwcHJlc3MgQ0RLIG91dHB1dCcsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tbm8tbm90aWNlcycsICdTdXBwcmVzcyBDREsgbm90aWNlcycpXG4gICAgLm9wdGlvbignLS12ZXJib3NlJywgJ1Nob3cgdmVyYm9zZSBDREsgb3V0cHV0JywgZmFsc2UpXG4gICAgLm9wdGlvbignLS1qc29uJywgJ091dHB1dCByZXN1bHQgYXMgSlNPTicsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tdmVyaWZ5LXNzbCcsICdFbmFibGUgU1NMIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbicpXG4gICAgLm9wdGlvbignLS1uby12ZXJpZnktc3NsJywgJ0Rpc2FibGUgU1NMIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbicpXG4gICAgLm9wdGlvbignLS1zaG93LXJlc29sdmVkJywgJ1ByaW50IHRoZSByZXNvbHZlZCBwaXBlbGluZSBjb25maWcgKHdpdGgge3sgLi4uIH19IHRlbXBsYXRlcyBleHBhbmRlZCkgYW5kIGV4aXQgd2l0aG91dCBydW5uaW5nIENESycsIGZhbHNlKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbklkID0gcHJpbnRDb21tYW5kSGVhZGVyKCdDREsgU3ludGhlc2lzJyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBpcGVsaW5lSWQgPSBvcHRpb25zLmlkIHx8IHByb2Nlc3MuZW52LlBJUEVMSU5FX0lEO1xuXG4gICAgICAgIC8vIC0tc2hvdy1yZXNvbHZlZDogcHJldmlldyB0ZW1wbGF0ZXMgYW5kIGV4aXRcbiAgICAgICAgaWYgKG9wdGlvbnMuc2hvd1Jlc29sdmVkKSB7XG4gICAgICAgICAgYXdhaXQgc2hvd1Jlc29sdmVkUGlwZWxpbmUocGlwZWxpbmVJZCwgb3B0aW9ucyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYXVkaXRMb2coJ3N5bnRoJywgeyBleGVjdXRpb25JZCwgcGlwZWxpbmVJZCwgb3V0cHV0OiBvcHRpb25zLm91dHB1dCwgcHJvZmlsZTogb3B0aW9ucy5wcm9maWxlIH0pO1xuICAgICAgICBwcmludFNzbFdhcm5pbmcob3B0aW9ucy52ZXJpZnlTc2wpO1xuXG4gICAgICAgIC8vIFByb3BhZ2F0ZSB0byBwcm9jZXNzLmVudiBzbyBDREsgY29uc3RydWN0cyAoTGFtYmRhLCBDb2RlQnVpbGQpIGluaGVyaXQgaXRcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyaWZ5U3NsID09PSBmYWxzZSkge1xuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfVExTX1JFSkVDVF9VTkFVVEhPUklaRUQgPSAnMCc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGZXRjaCBwaXBlbGluZSBjb25maWcgaWYgSUQgaXMgYXZhaWxhYmxlIGFuZCBQSVBFTElORV9QUk9QUyBub3QgYWxyZWFkeSBzZXRcbiAgICAgICAgaWYgKHBpcGVsaW5lSWQgJiYgIXByb2Nlc3MuZW52LlBJUEVMSU5FX1BST1BTKSB7XG4gICAgICAgICAgcHJpbnRJbmZvKCdGZXRjaGluZyBwaXBlbGluZSBjb25maWd1cmF0aW9uJywgeyBpZDogcGlwZWxpbmVJZCB9KTtcbiAgICAgICAgICBhd2FpdCBmZXRjaFBpcGVsaW5lQ29uZmlnKHBpcGVsaW5lSWQsIG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKCFwaXBlbGluZUlkICYmICFwcm9jZXNzLmVudi5QSVBFTElORV9QUk9QUykge1xuICAgICAgICAgIHByaW50V2FybmluZygnTm8gcGlwZWxpbmUgSUQgb3IgUElQRUxJTkVfUFJPUFMgc2V0Jyk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQaXBlbGluZSBJRCBpcyByZXF1aXJlZC4gVXNlIC0taWQgPGlkPiBvciBzZXQgUElQRUxJTkVfSUQgZW52IHZhci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVuc3VyZUNka0F2YWlsYWJsZSgpO1xuICAgICAgICBwcmludFN1Y2Nlc3MoJ0FXUyBDREsgaXMgYXZhaWxhYmxlJyk7XG5cbiAgICAgICAgLy8gQnVpbGQgY2RrIHN5bnRoIGNvbW1hbmRcbiAgICAgICAgaWYgKG9wdGlvbnMub3V0cHV0KSBhc3NlcnRTaGVsbFNhZmUob3B0aW9ucy5vdXRwdXQsICdvdXRwdXQnKTtcbiAgICAgICAgaWYgKG9wdGlvbnMucHJvZmlsZSkgYXNzZXJ0U2hlbGxTYWZlKG9wdGlvbnMucHJvZmlsZSwgJ3Byb2ZpbGUnKTtcblxuICAgICAgICBjb25zdCBib2lsZXJwbGF0ZVBhdGggPSByZXNvbHZlQm9pbGVycGxhdGVQYXRoKF9fZGlybmFtZSk7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gW1xuICAgICAgICAgICdjZGsgc3ludGgnLFxuICAgICAgICAgIGAtLWFwcD1cIm5vZGUgJHtib2lsZXJwbGF0ZVBhdGh9XCJgLFxuICAgICAgICAgIGAtLW91dHB1dD0ke29wdGlvbnMub3V0cHV0fWAsXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucHJvZmlsZSkgcGFydHMucHVzaChgLS1wcm9maWxlPSR7b3B0aW9ucy5wcm9maWxlfWApO1xuICAgICAgICBpZiAob3B0aW9ucy5xdWlldCkgcGFydHMucHVzaCgnLS1xdWlldCcpO1xuICAgICAgICBpZiAob3B0aW9ucy5ub3RpY2VzID09PSBmYWxzZSkgcGFydHMucHVzaCgnLS1uby1ub3RpY2VzJyk7XG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHBhcnRzLnB1c2goJy0tdmVyYm9zZScpO1xuXG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSBwYXJ0cy5qb2luKCcgJyk7XG5cbiAgICAgICAgcHJpbnRJbmZvKCdFeGVjdXRpbmcnLCB7IGNvbW1hbmQ6IChjb21tYW5kLnNwbGl0KCctLWFwcCcpWzBdID8/ICcnKS50cmltKCkgKyAnIC4uLicgfSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleGVjdXRlQ2RrU2hlbGxDb21tYW5kKGNvbW1hbmQsIHtcbiAgICAgICAgICBzaG93T3V0cHV0OiAhb3B0aW9ucy5xdWlldCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBwcmludFNlY3Rpb24oJ1N5bnRoZXNpcyBDb21wbGV0ZScpO1xuXG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgZXhlY3V0aW9uSWQsXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiByZXN1bHQuZHVyYXRpb24sXG4gICAgICAgICAgICAgIG91dHB1dDogb3B0aW9ucy5vdXRwdXQsXG4gICAgICAgICAgICB9LCBudWxsLCAyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByaW50S2V5VmFsdWUoe1xuICAgICAgICAgICAgICAnRXhlY3V0aW9uIElEJzogZXhlY3V0aW9uSWQsXG4gICAgICAgICAgICAgICdEdXJhdGlvbic6IGAke3Jlc3VsdC5kdXJhdGlvbn1tc2AsXG4gICAgICAgICAgICAgICdPdXRwdXQnOiBvcHRpb25zLm91dHB1dCxcbiAgICAgICAgICAgICAgJ1N0YXR1cyc6ICfinJMgU3VjY2VzcycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkFQSV9SRVFVRVNULCB7XG4gICAgICAgICAgZGVidWc6IHByb2dyYW0ub3B0cygpLmRlYnVnLFxuICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgY29udGV4dDogeyBjb21tYW5kOiAnc3ludGgnLCBleGVjdXRpb25JZCwgcGlwZWxpbmVJZDogb3B0aW9ucy5pZCB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBGZXRjaCB0aGUgcGlwZWxpbmUgYnkgSUQsIGFwcGx5IHBhc3MtMSBzZWxmLXJlZmVyZW5jaW5nIHRlbXBsYXRlXG4gKiByZXNvbHV0aW9uLCBhbmQgcHJpbnQgaXQgdG8gc3Rkb3V0LiBVc2VkIGJ5IGBzeW50aCAtLXNob3ctcmVzb2x2ZWRgXG4gKiBhbmQgYGRlcGxveSAtLXNob3ctcmVzb2x2ZWRgIHRvIHByZXZpZXcgc3Vic3RpdHV0aW9uIGJlZm9yZSBydW5uaW5nIENESy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2hvd1Jlc29sdmVkUGlwZWxpbmUoXG4gIHBpcGVsaW5lSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogeyBwcm9maWxlPzogc3RyaW5nOyByZWdpb24/OiBzdHJpbmc7IHN0b3JlVG9rZW5zPzogYm9vbGVhbjsgdmVyaWZ5U3NsPzogYm9vbGVhbiB9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghcGlwZWxpbmVJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignLS1zaG93LXJlc29sdmVkIHJlcXVpcmVzIC0taWQgb3IgUElQRUxJTkVfSUQgZW52IHZhcicpO1xuICB9XG4gIGF3YWl0IGZldGNoUGlwZWxpbmVDb25maWcocGlwZWxpbmVJZCwgb3B0aW9ucyk7XG4gIC8vIGZldGNoUGlwZWxpbmVDb25maWcgd3JpdGVzIFBJUEVMSU5FX1BST1BTIGJhc2U2NC1lbmNvZGVkIG9uIHN1Y2Nlc3NcbiAgY29uc3QgZW5jb2RlZCA9IHByb2Nlc3MuZW52LlBJUEVMSU5FX1BST1BTO1xuICBpZiAoIWVuY29kZWQpIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZldGNoIHBpcGVsaW5lIGNvbmZpZ3VyYXRpb24nKTtcbiAgY29uc3QgZGVjb2RlZCA9IEpTT04ucGFyc2UoQnVmZmVyLmZyb20oZW5jb2RlZCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCd1dGYtOCcpKTtcblxuICAvLyBMYXp5IGltcG9ydCB0byBhdm9pZCBwdWxsaW5nIHBpcGVsaW5lLWNvcmUgaW50byBldmVyeSBDTEkgaW52b2NhdGlvblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCB7IHJlc29sdmVTZWxmUmVmZXJlbmNpbmcgfSA9IHJlcXVpcmUoJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnKTtcbiAgY29uc3Qgc2NvcGUgPSB7IG1ldGFkYXRhOiBkZWNvZGVkLm1ldGFkYXRhID8/IHt9LCB2YXJzOiBkZWNvZGVkLnZhcnMgPz8ge30gfTtcbiAgY29uc3QgaXNUZW1wbGF0YWJsZSA9IChmOiBzdHJpbmcpID0+XG4gICAgZiA9PT0gJ3Byb2plY3ROYW1lJyB8fCBmLnN0YXJ0c1dpdGgoJ21ldGFkYXRhLicpIHx8IGYuc3RhcnRzV2l0aCgndmFycy4nKTtcbiAgY29uc3QgZmllbGRUb1Njb3BlID0gKGY6IHN0cmluZykgPT4gaXNUZW1wbGF0YWJsZShmKSA/IGYgOiBudWxsO1xuICBjb25zdCByZXN1bHQgPSByZXNvbHZlU2VsZlJlZmVyZW5jaW5nKGRlY29kZWQsIHNjb3BlLCBpc1RlbXBsYXRhYmxlLCBmaWVsZFRvU2NvcGUsICdwaXBlbGluZScpO1xuXG4gIGlmIChyZXN1bHQuZXJyb3JzLmxlbmd0aCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1Jlc29sdXRpb24gZXJyb3JzOicpO1xuICAgIGZvciAoY29uc3QgZSBvZiByZXN1bHQuZXJyb3JzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGAgIFske2UuZmllbGQgPz8gJz8nfV0gJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShkZWNvZGVkLCBudWxsLCAyKSk7XG59XG4iXX0=
|
|
191
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ludGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvc3ludGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNHLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoSCxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2pKLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRXJFLDBEQUEwRDtBQUMxRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUUxRDs7O0dBR0c7QUFDSCxLQUFLLFVBQVUsbUJBQW1CLENBQ2hDLFVBQWtCLEVBQ2xCLE9BQTBGO0lBRTFGLE1BQU0sTUFBTSxHQUFHLE1BQU0sOEJBQThCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBRWxDLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FDL0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxVQUFVLEVBQUUsQ0FDMUMsQ0FBQztJQUVGLE1BQU0sUUFBUSxHQUFHLHFCQUFxQixDQUFXLFFBQVEsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFaEYsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNyQixVQUFVLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUN4RCxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxNQUFNLFlBQVksR0FBNEI7UUFDNUMsR0FBRyxRQUFRLENBQUMsS0FBZ0M7UUFDNUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxFQUFFLElBQUksVUFBVTtLQUN0QyxDQUFDO0lBQ0YsSUFBSSxRQUFRLENBQUMsS0FBSztRQUFFLFlBQVksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUV4RCx3RUFBd0U7SUFDeEUseUVBQXlFO0lBQ3pFLHlFQUF5RTtJQUN6RSxpQ0FBaUM7SUFDakMsTUFBTSxlQUFlLEdBQUcsTUFBTSxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDM0UsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1QyxZQUFZLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztRQUMvQyxTQUFTLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUYsWUFBWSxDQUFDLCtCQUErQixDQUFDLENBQUM7QUFDaEQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sVUFBVSxLQUFLLENBQUMsT0FBZ0I7SUFDcEMsT0FBTztTQUNKLE9BQU8sQ0FBQyxPQUFPLENBQUM7U0FDaEIsV0FBVyxDQUFDLGdEQUFnRCxDQUFDO1NBQzdELE1BQU0sQ0FBQyxlQUFlLEVBQUUsMENBQTBDLENBQUM7U0FDbkUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLDJGQUEyRixFQUFFLEtBQUssQ0FBQztTQUM1SCxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsc0JBQXNCLEVBQUUsU0FBUyxDQUFDO1NBQzNELE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxhQUFhLENBQUM7U0FDNUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLGlDQUFpQyxDQUFDO1NBQzlELE1BQU0sQ0FBQyxTQUFTLEVBQUUscUJBQXFCLEVBQUUsS0FBSyxDQUFDO1NBQy9DLE1BQU0sQ0FBQyxjQUFjLEVBQUUsc0JBQXNCLENBQUM7U0FDOUMsTUFBTSxDQUFDLFdBQVcsRUFBRSx5QkFBeUIsRUFBRSxLQUFLLENBQUM7U0FDckQsTUFBTSxDQUFDLFFBQVEsRUFBRSx1QkFBdUIsRUFBRSxLQUFLLENBQUM7U0FDaEQsTUFBTSxDQUFDLGNBQWMsRUFBRSxxQ0FBcUMsQ0FBQztTQUM3RCxNQUFNLENBQUMsaUJBQWlCLEVBQUUsc0NBQXNDLENBQUM7U0FDakUsTUFBTSxDQUFDLGlCQUFpQixFQUFFLHFHQUFxRyxFQUFFLEtBQUssQ0FBQztTQUN2SSxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ3hCLE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRXhELElBQUksQ0FBQztZQUNILE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7WUFFekQsOENBQThDO1lBQzlDLElBQUksT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN6QixNQUFNLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDaEQsT0FBTztZQUNULENBQUM7WUFFRCxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDakcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUVuQyw0RUFBNEU7WUFDNUUsSUFBSSxPQUFPLENBQUMsU0FBUyxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixHQUFHLEdBQUcsQ0FBQztZQUNqRCxDQUFDO1lBRUQsOEVBQThFO1lBQzlFLElBQUksVUFBVSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDOUMsU0FBUyxDQUFDLGlDQUFpQyxFQUFFLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7Z0JBQ2pFLE1BQU0sbUJBQW1CLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2pELENBQUM7aUJBQU0sSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RELFlBQVksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO2dCQUNyRCxNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7WUFDeEYsQ0FBQztZQUVELGtCQUFrQixFQUFFLENBQUM7WUFDckIsWUFBWSxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFFckMsMEJBQTBCO1lBQzFCLElBQUksT0FBTyxDQUFDLE1BQU07Z0JBQUUsZUFBZSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDOUQsSUFBSSxPQUFPLENBQUMsT0FBTztnQkFBRSxlQUFlLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVqRSxNQUFNLGVBQWUsR0FBRyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxRCxNQUFNLEtBQUssR0FBRztnQkFDWixXQUFXO2dCQUNYLGVBQWUsZUFBZSxHQUFHO2dCQUNqQyxZQUFZLE9BQU8sQ0FBQyxNQUFNLEVBQUU7YUFDN0IsQ0FBQztZQUVGLElBQUksT0FBTyxDQUFDLE9BQU87Z0JBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2hFLElBQUksT0FBTyxDQUFDLEtBQUs7Z0JBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN6QyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssS0FBSztnQkFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzFELElBQUksT0FBTyxDQUFDLE9BQU87Z0JBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUU3QyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRWhDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDdkYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUVoQixNQUFNLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUU7Z0JBQzdDLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLO2FBQzNCLENBQUMsQ0FBQztZQUVILE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEIsWUFBWSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFFbkMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ25CLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ3pCLE9BQU8sRUFBRSxJQUFJO3dCQUNiLFdBQVc7d0JBQ1gsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO3dCQUN6QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07cUJBQ3ZCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGFBQWEsQ0FBQzt3QkFDWixjQUFjLEVBQUUsV0FBVzt3QkFDM0IsVUFBVSxFQUFFLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSTt3QkFDbEMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNO3dCQUN4QixRQUFRLEVBQUUsV0FBVztxQkFDdEIsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1FBRUgsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixXQUFXLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxXQUFXLEVBQUU7Z0JBQzFDLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSztnQkFDM0IsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUU7YUFDbkUsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsb0JBQW9CLENBQ2pDLFVBQThCLEVBQzlCLE9BQTBGO0lBRTFGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELE1BQU0sbUJBQW1CLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLHNFQUFzRTtJQUN0RSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQztJQUMzQyxJQUFJLENBQUMsT0FBTztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztJQUN4RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRTdFLHVFQUF1RTtJQUN2RSxNQUFNLEVBQUUsc0JBQXNCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0lBQ25GLE1BQU0sS0FBSyxHQUFHLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDO0lBQzdFLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FDbEMsQ0FBQyxLQUFLLGFBQWEsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcsc0JBQXNCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRS9GLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN6QixPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDcEMsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDOUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBhc3NlcnRTaGVsbFNhZmUgfSBmcm9tICcuLi9jb25maWcvY2xpLmNvbnN0YW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBpcGVsaW5lIH0gZnJvbSAnLi4vdHlwZXMvcGlwZWxpbmUuanMnO1xuaW1wb3J0IHsgYXVkaXRMb2cgfSBmcm9tICcuLi91dGlscy9hdWRpdC1sb2cuanMnO1xuaW1wb3J0IHsgZW5zdXJlQ2RrQXZhaWxhYmxlLCBleGVjdXRlQ2RrU2hlbGxDb21tYW5kLCByZXNvbHZlQm9pbGVycGxhdGVQYXRoIH0gZnJvbSAnLi4vdXRpbHMvY2RrLXV0aWxzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnRBc3luYywgcHJpbnRDb21tYW5kSGVhZGVyLCBwcmludFNzbFdhcm5pbmcgfSBmcm9tICcuLi91dGlscy9jb21tYW5kLXV0aWxzLmpzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgZXh0cmFjdFNpbmdsZVJlc3BvbnNlLCBwcmludEVycm9yLCBwcmludEluZm8sIHByaW50S2V5VmFsdWUsIHByaW50U2VjdGlvbiwgcHJpbnRTdWNjZXNzLCBwcmludFdhcm5pbmcgfSBmcm9tICcuLi91dGlscy9vdXRwdXQtdXRpbHMuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVBsdWdpbnNGb3JQcm9wcyB9IGZyb20gJy4uL3V0aWxzL3BsdWdpbi1yZXNvbHZlci5qcyc7XG5cbi8vIEVTTSBoYXMgbm8gX19kaXJuYW1lOyBkZXJpdmUgaXQgZnJvbSB0aGlzIG1vZHVsZSdzIFVSTC5cbmNvbnN0IF9fZGlybmFtZSA9IGRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcblxuLyoqXG4gKiBGZXRjaCBwaXBlbGluZSBjb25maWcgYW5kIHNldCBQSVBFTElORV9QUk9QUyBlbnYgdmFyIGZvciB0aGUgYm9pbGVycGxhdGUgYXBwLlxuICogVXNlcyBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50QXN5bmMgd2hpY2ggc3VwcG9ydHMgYWxsIHRocmVlIGF1dGggbWV0aG9kcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hQaXBlbGluZUNvbmZpZyhcbiAgcGlwZWxpbmVJZDogc3RyaW5nLFxuICBvcHRpb25zOiB7IHN0b3JlVG9rZW5zPzogYm9vbGVhbjsgdmVyaWZ5U3NsPzogYm9vbGVhbjsgcmVnaW9uPzogc3RyaW5nOyBwcm9maWxlPzogc3RyaW5nIH0sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2xpZW50ID0gYXdhaXQgY3JlYXRlQXV0aGVudGljYXRlZENsaWVudEFzeW5jKG9wdGlvbnMpO1xuICBjb25zdCBjb25maWcgPSBjbGllbnQuZ2V0Q29uZmlnKCk7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICBgJHtjb25maWcuYXBpLnBpcGVsaW5lVXJsfS8ke3BpcGVsaW5lSWR9YCxcbiAgKTtcblxuICBjb25zdCBwaXBlbGluZSA9IGV4dHJhY3RTaW5nbGVSZXNwb25zZTxQaXBlbGluZT4ocmVzcG9uc2UsICdwaXBlbGluZScsICdwcm9wcycpO1xuXG4gIGlmICghcGlwZWxpbmU/LnByb3BzKSB7XG4gICAgcHJpbnRFcnJvcignUGlwZWxpbmUgaGFzIG5vIHByb3BzJywgeyBpZDogcGlwZWxpbmVJZCB9KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZXRyaWV2ZSBwaXBlbGluZSBwcm9wcyBmb3IgSUQ6ICR7cGlwZWxpbmVJZH1gKTtcbiAgfVxuXG4gIGNvbnN0IHByb3BzV2l0aElkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgLi4ucGlwZWxpbmUucHJvcHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgcGlwZWxpbmVJZDogcGlwZWxpbmUuaWQgfHwgcGlwZWxpbmVJZCxcbiAgfTtcbiAgaWYgKHBpcGVsaW5lLm9yZ0lkKSBwcm9wc1dpdGhJZHMub3JnSWQgPSBwaXBlbGluZS5vcmdJZDtcblxuICAvLyBQcmUtcmVzb2x2ZSBwbHVnaW5zIGZyb20gdGhlIHBsYXRmb3JtIEFQSSBzbyB0aGUgc3ludGhlc2l6ZWQgdGVtcGxhdGVcbiAgLy8gc2hpcHMgd2l0aCByZWFsIENvZGVCdWlsZCBpbWFnZSBVUklzIGJha2VkIGluLiBXaXRob3V0IHRoaXMsIENESyBmYWxsc1xuICAvLyBiYWNrIHRvIHN0YW5kYXJkOjcuMCBiZWNhdXNlIHRoZSBkZXBsb3ktdGltZSBjdXN0b20gcmVzb3VyY2UgYXR0cmlidXRlXG4gIC8vIGlzIHVucmVzb2x2YWJsZSBhdCBzeW50aCB0aW1lLlxuICBjb25zdCByZXNvbHZlZFBsdWdpbnMgPSBhd2FpdCByZXNvbHZlUGx1Z2luc0ZvclByb3BzKGNsaWVudCwgcHJvcHNXaXRoSWRzKTtcbiAgaWYgKE9iamVjdC5rZXlzKHJlc29sdmVkUGx1Z2lucykubGVuZ3RoID4gMCkge1xuICAgIHByb3BzV2l0aElkcy5yZXNvbHZlZFBsdWdpbnMgPSByZXNvbHZlZFBsdWdpbnM7XG4gICAgcHJpbnRJbmZvKCdQcmUtcmVzb2x2ZWQgcGx1Z2lucycsIHsgY291bnQ6IE9iamVjdC5rZXlzKHJlc29sdmVkUGx1Z2lucykubGVuZ3RoIH0pO1xuICB9XG5cbiAgcHJvY2Vzcy5lbnYuUElQRUxJTkVfUFJPUFMgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShwcm9wc1dpdGhJZHMpKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIHByaW50U3VjY2VzcygnUGlwZWxpbmUgY29uZmlndXJhdGlvbiBsb2FkZWQnKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGBzeW50aGAgY29tbWFuZCB3aXRoIHRoZSBDTEkgcHJvZ3JhbS5cbiAqXG4gKiBSdW5zIENESyBzeW50aGVzaXMgdXNpbmcgdGhlIGJvaWxlcnBsYXRlIGFwcC4gUGlwZWxpbmUgY29uZmlnIGlzIHJlc29sdmVkIGZyb206XG4gKiAxLiAtLWlkIGZsYWcgb3IgUElQRUxJTkVfSUQgZW52IHZhciDihpIgZmV0Y2hlcyBjb25maWcgZnJvbSBwbGF0Zm9ybSBBUElcbiAqIDIuIFBJUEVMSU5FX1BST1BTIGVudiB2YXIgKHByZS1lbmNvZGVkLCBmcm9tIGRlcGxveSBjb21tYW5kKVxuICpcbiAqIEF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgKGluIHByaW9yaXR5IG9yZGVyKTpcbiAqIC0gUExBVEZPUk1fVE9LRU4gZW52IHZhclxuICogLSAtLXN0b3JlLXRva2VucyDihpIgZmV0Y2ggZnJvbSBBV1MgU2VjcmV0cyBNYW5hZ2VyXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGJhc2hcbiAqIHBpcGVsaW5lLW1hbmFnZXIgc3ludGggLS1pZCA8cGlwZWxpbmUtaWQ+IC0tbm8tdmVyaWZ5LXNzbFxuICogcGlwZWxpbmUtbWFuYWdlciBzeW50aCAtLWlkIDxwaXBlbGluZS1pZD4gLS1zdG9yZS10b2tlbnNcbiAqIHBpcGVsaW5lLW1hbmFnZXIgc3ludGggLS1xdWlldCAtLW5vLW5vdGljZXMgICAgICAgICAgIyBDb2RlUGlwZWxpbmUgKHVzZXMgZW52IHZhcnMpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN5bnRoKHByb2dyYW06IENvbW1hbmQpOiB2b2lkIHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKCdzeW50aCcpXG4gICAgLmRlc2NyaXB0aW9uKCdSdW4gQ0RLIHN5bnRoZXNpcyB1c2luZyBwaXBlbGluZSBjb25maWd1cmF0aW9uJylcbiAgICAub3B0aW9uKCctaSwgLS1pZCA8aWQ+JywgJ1BpcGVsaW5lIElEIChvciBzZXQgUElQRUxJTkVfSUQgZW52IHZhciknKVxuICAgIC5vcHRpb24oJy0tc3RvcmUtdG9rZW5zJywgJ0F1dGhlbnRpY2F0ZSB1c2luZyB0b2tlbiBmcm9tIEFXUyBTZWNyZXRzIE1hbmFnZXIgKHJlcXVpcmVzIFBMQVRGT1JNX1NFQ1JFVF9OQU1FIGVudiB2YXIpJywgZmFsc2UpXG4gICAgLm9wdGlvbignLS1vdXRwdXQgPGRpcj4nLCAnQ0RLIG91dHB1dCBkaXJlY3RvcnknLCAnY2RrLm91dCcpXG4gICAgLm9wdGlvbignLS1wcm9maWxlIDxwcm9maWxlPicsICdBV1MgcHJvZmlsZScpXG4gICAgLm9wdGlvbignLS1yZWdpb24gPHJlZ2lvbj4nLCAnQVdTIHJlZ2lvbiAoZm9yIC0tc3RvcmUtdG9rZW5zKScpXG4gICAgLm9wdGlvbignLS1xdWlldCcsICdTdXBwcmVzcyBDREsgb3V0cHV0JywgZmFsc2UpXG4gICAgLm9wdGlvbignLS1uby1ub3RpY2VzJywgJ1N1cHByZXNzIENESyBub3RpY2VzJylcbiAgICAub3B0aW9uKCctLXZlcmJvc2UnLCAnU2hvdyB2ZXJib3NlIENESyBvdXRwdXQnLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLWpzb24nLCAnT3V0cHV0IHJlc3VsdCBhcyBKU09OJywgZmFsc2UpXG4gICAgLm9wdGlvbignLS12ZXJpZnktc3NsJywgJ0VuYWJsZSBTU0wgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uJylcbiAgICAub3B0aW9uKCctLW5vLXZlcmlmeS1zc2wnLCAnRGlzYWJsZSBTU0wgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uJylcbiAgICAub3B0aW9uKCctLXNob3ctcmVzb2x2ZWQnLCAnUHJpbnQgdGhlIHJlc29sdmVkIHBpcGVsaW5lIGNvbmZpZyAod2l0aCB7eyAuLi4gfX0gdGVtcGxhdGVzIGV4cGFuZGVkKSBhbmQgZXhpdCB3aXRob3V0IHJ1bm5pbmcgQ0RLJywgZmFsc2UpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgZXhlY3V0aW9uSWQgPSBwcmludENvbW1hbmRIZWFkZXIoJ0NESyBTeW50aGVzaXMnKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGlwZWxpbmVJZCA9IG9wdGlvbnMuaWQgfHwgcHJvY2Vzcy5lbnYuUElQRUxJTkVfSUQ7XG5cbiAgICAgICAgLy8gLS1zaG93LXJlc29sdmVkOiBwcmV2aWV3IHRlbXBsYXRlcyBhbmQgZXhpdFxuICAgICAgICBpZiAob3B0aW9ucy5zaG93UmVzb2x2ZWQpIHtcbiAgICAgICAgICBhd2FpdCBzaG93UmVzb2x2ZWRQaXBlbGluZShwaXBlbGluZUlkLCBvcHRpb25zKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhdWRpdExvZygnc3ludGgnLCB7IGV4ZWN1dGlvbklkLCBwaXBlbGluZUlkLCBvdXRwdXQ6IG9wdGlvbnMub3V0cHV0LCBwcm9maWxlOiBvcHRpb25zLnByb2ZpbGUgfSk7XG4gICAgICAgIHByaW50U3NsV2FybmluZyhvcHRpb25zLnZlcmlmeVNzbCk7XG5cbiAgICAgICAgLy8gUHJvcGFnYXRlIHRvIHByb2Nlc3MuZW52IHNvIENESyBjb25zdHJ1Y3RzIChMYW1iZGEsIENvZGVCdWlsZCkgaW5oZXJpdCBpdFxuICAgICAgICBpZiAob3B0aW9ucy52ZXJpZnlTc2wgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRCA9ICcwJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZldGNoIHBpcGVsaW5lIGNvbmZpZyBpZiBJRCBpcyBhdmFpbGFibGUgYW5kIFBJUEVMSU5FX1BST1BTIG5vdCBhbHJlYWR5IHNldFxuICAgICAgICBpZiAocGlwZWxpbmVJZCAmJiAhcHJvY2Vzcy5lbnYuUElQRUxJTkVfUFJPUFMpIHtcbiAgICAgICAgICBwcmludEluZm8oJ0ZldGNoaW5nIHBpcGVsaW5lIGNvbmZpZ3VyYXRpb24nLCB7IGlkOiBwaXBlbGluZUlkIH0pO1xuICAgICAgICAgIGF3YWl0IGZldGNoUGlwZWxpbmVDb25maWcocGlwZWxpbmVJZCwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBpcGVsaW5lSWQgJiYgIXByb2Nlc3MuZW52LlBJUEVMSU5FX1BST1BTKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKCdObyBwaXBlbGluZSBJRCBvciBQSVBFTElORV9QUk9QUyBzZXQnKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BpcGVsaW5lIElEIGlzIHJlcXVpcmVkLiBVc2UgLS1pZCA8aWQ+IG9yIHNldCBQSVBFTElORV9JRCBlbnYgdmFyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZW5zdXJlQ2RrQXZhaWxhYmxlKCk7XG4gICAgICAgIHByaW50U3VjY2VzcygnQVdTIENESyBpcyBhdmFpbGFibGUnKTtcblxuICAgICAgICAvLyBCdWlsZCBjZGsgc3ludGggY29tbWFuZFxuICAgICAgICBpZiAob3B0aW9ucy5vdXRwdXQpIGFzc2VydFNoZWxsU2FmZShvcHRpb25zLm91dHB1dCwgJ291dHB1dCcpO1xuICAgICAgICBpZiAob3B0aW9ucy5wcm9maWxlKSBhc3NlcnRTaGVsbFNhZmUob3B0aW9ucy5wcm9maWxlLCAncHJvZmlsZScpO1xuXG4gICAgICAgIGNvbnN0IGJvaWxlcnBsYXRlUGF0aCA9IHJlc29sdmVCb2lsZXJwbGF0ZVBhdGgoX19kaXJuYW1lKTtcbiAgICAgICAgY29uc3QgcGFydHMgPSBbXG4gICAgICAgICAgJ2NkayBzeW50aCcsXG4gICAgICAgICAgYC0tYXBwPVwibm9kZSAke2JvaWxlcnBsYXRlUGF0aH1cImAsXG4gICAgICAgICAgYC0tb3V0cHV0PSR7b3B0aW9ucy5vdXRwdXR9YCxcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAob3B0aW9ucy5wcm9maWxlKSBwYXJ0cy5wdXNoKGAtLXByb2ZpbGU9JHtvcHRpb25zLnByb2ZpbGV9YCk7XG4gICAgICAgIGlmIChvcHRpb25zLnF1aWV0KSBwYXJ0cy5wdXNoKCctLXF1aWV0Jyk7XG4gICAgICAgIGlmIChvcHRpb25zLm5vdGljZXMgPT09IGZhbHNlKSBwYXJ0cy5wdXNoKCctLW5vLW5vdGljZXMnKTtcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkgcGFydHMucHVzaCgnLS12ZXJib3NlJyk7XG5cbiAgICAgICAgY29uc3QgY29tbWFuZCA9IHBhcnRzLmpvaW4oJyAnKTtcblxuICAgICAgICBwcmludEluZm8oJ0V4ZWN1dGluZycsIHsgY29tbWFuZDogKGNvbW1hbmQuc3BsaXQoJy0tYXBwJylbMF0gPz8gJycpLnRyaW0oKSArICcgLi4uJyB9KTtcbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4ZWN1dGVDZGtTaGVsbENvbW1hbmQoY29tbWFuZCwge1xuICAgICAgICAgIHNob3dPdXRwdXQ6ICFvcHRpb25zLnF1aWV0LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgIHByaW50U2VjdGlvbignU3ludGhlc2lzIENvbXBsZXRlJyk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuanNvbikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICBleGVjdXRpb25JZCxcbiAgICAgICAgICAgICAgZHVyYXRpb246IHJlc3VsdC5kdXJhdGlvbixcbiAgICAgICAgICAgICAgb3V0cHV0OiBvcHRpb25zLm91dHB1dCxcbiAgICAgICAgICAgIH0sIG51bGwsIDIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgICAgICdFeGVjdXRpb24gSUQnOiBleGVjdXRpb25JZCxcbiAgICAgICAgICAgICAgJ0R1cmF0aW9uJzogYCR7cmVzdWx0LmR1cmF0aW9ufW1zYCxcbiAgICAgICAgICAgICAgJ091dHB1dCc6IG9wdGlvbnMub3V0cHV0LFxuICAgICAgICAgICAgICAnU3RhdHVzJzogJ+KckyBTdWNjZXNzJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuQVBJX1JFUVVFU1QsIHtcbiAgICAgICAgICBkZWJ1ZzogcHJvZ3JhbS5vcHRzKCkuZGVidWcsXG4gICAgICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgICAgICBjb250ZXh0OiB7IGNvbW1hbmQ6ICdzeW50aCcsIGV4ZWN1dGlvbklkLCBwaXBlbGluZUlkOiBvcHRpb25zLmlkIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xufVxuXG4vKipcbiAqIEZldGNoIHRoZSBwaXBlbGluZSBieSBJRCwgYXBwbHkgcGFzcy0xIHNlbGYtcmVmZXJlbmNpbmcgdGVtcGxhdGVcbiAqIHJlc29sdXRpb24sIGFuZCBwcmludCBpdCB0byBzdGRvdXQuIFVzZWQgYnkgYHN5bnRoIC0tc2hvdy1yZXNvbHZlZGBcbiAqIGFuZCBgZGVwbG95IC0tc2hvdy1yZXNvbHZlZGAgdG8gcHJldmlldyBzdWJzdGl0dXRpb24gYmVmb3JlIHJ1bm5pbmcgQ0RLLlxuICovXG5hc3luYyBmdW5jdGlvbiBzaG93UmVzb2x2ZWRQaXBlbGluZShcbiAgcGlwZWxpbmVJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zOiB7IHByb2ZpbGU/OiBzdHJpbmc7IHJlZ2lvbj86IHN0cmluZzsgc3RvcmVUb2tlbnM/OiBib29sZWFuOyB2ZXJpZnlTc2w/OiBib29sZWFuIH0sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFwaXBlbGluZUlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCctLXNob3ctcmVzb2x2ZWQgcmVxdWlyZXMgLS1pZCBvciBQSVBFTElORV9JRCBlbnYgdmFyJyk7XG4gIH1cbiAgYXdhaXQgZmV0Y2hQaXBlbGluZUNvbmZpZyhwaXBlbGluZUlkLCBvcHRpb25zKTtcbiAgLy8gZmV0Y2hQaXBlbGluZUNvbmZpZyB3cml0ZXMgUElQRUxJTkVfUFJPUFMgYmFzZTY0LWVuY29kZWQgb24gc3VjY2Vzc1xuICBjb25zdCBlbmNvZGVkID0gcHJvY2Vzcy5lbnYuUElQRUxJTkVfUFJPUFM7XG4gIGlmICghZW5jb2RlZCkgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggcGlwZWxpbmUgY29uZmlndXJhdGlvbicpO1xuICBjb25zdCBkZWNvZGVkID0gSlNPTi5wYXJzZShCdWZmZXIuZnJvbShlbmNvZGVkLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0Zi04JykpO1xuXG4gIC8vIExhenkgaW1wb3J0IHRvIGF2b2lkIHB1bGxpbmcgcGlwZWxpbmUtY29yZSBpbnRvIGV2ZXJ5IENMSSBpbnZvY2F0aW9uXG4gIGNvbnN0IHsgcmVzb2x2ZVNlbGZSZWZlcmVuY2luZyB9ID0gYXdhaXQgaW1wb3J0KCdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlJyk7XG4gIGNvbnN0IHNjb3BlID0geyBtZXRhZGF0YTogZGVjb2RlZC5tZXRhZGF0YSA/PyB7fSwgdmFyczogZGVjb2RlZC52YXJzID8/IHt9IH07XG4gIGNvbnN0IGlzVGVtcGxhdGFibGUgPSAoZjogc3RyaW5nKSA9PlxuICAgIGYgPT09ICdwcm9qZWN0TmFtZScgfHwgZi5zdGFydHNXaXRoKCdtZXRhZGF0YS4nKSB8fCBmLnN0YXJ0c1dpdGgoJ3ZhcnMuJyk7XG4gIGNvbnN0IGZpZWxkVG9TY29wZSA9IChmOiBzdHJpbmcpID0+IGlzVGVtcGxhdGFibGUoZikgPyBmIDogbnVsbDtcbiAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZVNlbGZSZWZlcmVuY2luZyhkZWNvZGVkLCBzY29wZSwgaXNUZW1wbGF0YWJsZSwgZmllbGRUb1Njb3BlLCAncGlwZWxpbmUnKTtcblxuICBpZiAocmVzdWx0LmVycm9ycy5sZW5ndGgpIHtcbiAgICBjb25zb2xlLmVycm9yKCdSZXNvbHV0aW9uIGVycm9yczonKTtcbiAgICBmb3IgKGNvbnN0IGUgb2YgcmVzdWx0LmVycm9ycykge1xuICAgICAgY29uc29sZS5lcnJvcihgICBbJHtlLmZpZWxkID8/ICc/J31dICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZGVjb2RlZCwgbnVsbCwgMikpO1xufVxuIl19
|