@pipeline-builder/pipeline-manager 3.4.70 → 3.4.72
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 +43 -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/bootstrap.d.ts +54 -0
- package/dist/agent/bootstrap.d.ts.map +1 -0
- package/dist/agent/bootstrap.js +76 -0
- package/dist/agent/executor.d.ts +27 -0
- package/dist/agent/executor.d.ts.map +1 -0
- package/dist/agent/executor.js +57 -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/post-steps.d.ts +55 -0
- package/dist/agent/post-steps.d.ts.map +1 -0
- package/dist/agent/post-steps.js +73 -0
- package/dist/agent/prereqs.d.ts +25 -0
- package/dist/agent/prereqs.d.ts.map +1 -0
- package/dist/agent/prereqs.js +100 -0
- package/dist/agent/targets.d.ts +122 -0
- package/dist/agent/targets.d.ts.map +1 -0
- package/dist/agent/targets.js +180 -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 +123 -118
- 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 +13 -0
- package/dist/commands/provision.d.ts.map +1 -0
- package/dist/commands/provision.js +489 -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,31 +1,11 @@
|
|
|
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
|
-
exports.printWarning = printWarning;
|
|
11
|
-
exports.printError = printError;
|
|
12
|
-
exports.printDebug = printDebug;
|
|
13
|
-
exports.outputData = outputData;
|
|
14
|
-
exports.formatTable = formatTable;
|
|
15
|
-
exports.ensureOutputDirectory = ensureOutputDirectory;
|
|
16
|
-
exports.fileExists = fileExists;
|
|
17
|
-
exports.printSection = printSection;
|
|
18
|
-
exports.printKeyValue = printKeyValue;
|
|
19
|
-
exports.printDivider = printDivider;
|
|
20
|
-
exports.unwrapEnvelope = unwrapEnvelope;
|
|
21
|
-
exports.extractSingleResponse = extractSingleResponse;
|
|
22
|
-
exports.extractListResponse = extractListResponse;
|
|
23
|
-
const node_fs_1 = __importDefault(require("node:fs"));
|
|
24
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
25
|
-
const picocolors_1 = __importDefault(require("picocolors"));
|
|
26
|
-
const yaml_1 = __importDefault(require("yaml"));
|
|
27
|
-
const cli_constants_1 = require("../config/cli.constants");
|
|
28
|
-
const { bold, cyan, green, yellow, red, dim, magenta, white } = picocolors_1.default;
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import pico from 'picocolors';
|
|
6
|
+
import YAML from 'yaml';
|
|
7
|
+
import { formatFileSize, TABLE_OPTIONS, } from '../config/cli.constants.js';
|
|
8
|
+
const { bold, cyan, green, yellow, red, dim, magenta, white } = pico;
|
|
29
9
|
// --- Logging functions ---
|
|
30
10
|
function logOutput(level, message, data) {
|
|
31
11
|
const colors = { info: cyan, success: green, warn: yellow, error: red, debug: magenta };
|
|
@@ -56,11 +36,11 @@ function formatDataForLog(data) {
|
|
|
56
36
|
}
|
|
57
37
|
return JSON.stringify(data, null, 2);
|
|
58
38
|
}
|
|
59
|
-
function printSuccess(message, data) { logOutput('success', message, data); }
|
|
60
|
-
function printInfo(message, data) { logOutput('info', message, data); }
|
|
61
|
-
function printWarning(message, data) { logOutput('warn', message, data); }
|
|
62
|
-
function printError(message, data) { logOutput('error', message, data); }
|
|
63
|
-
function printDebug(message, data) {
|
|
39
|
+
export function printSuccess(message, data) { logOutput('success', message, data); }
|
|
40
|
+
export function printInfo(message, data) { logOutput('info', message, data); }
|
|
41
|
+
export function printWarning(message, data) { logOutput('warn', message, data); }
|
|
42
|
+
export function printError(message, data) { logOutput('error', message, data); }
|
|
43
|
+
export function printDebug(message, data) {
|
|
64
44
|
if (process.env.DEBUG === 'true')
|
|
65
45
|
logOutput('debug', message, data);
|
|
66
46
|
}
|
|
@@ -68,7 +48,7 @@ function printDebug(message, data) {
|
|
|
68
48
|
/**
|
|
69
49
|
* Output data in specified format (console or file)
|
|
70
50
|
*/
|
|
71
|
-
function outputData(data, options = {}) {
|
|
51
|
+
export function outputData(data, options = {}) {
|
|
72
52
|
const { format = 'json', file, pretty = true, silent = false, append = false } = options;
|
|
73
53
|
let output;
|
|
74
54
|
switch (format) {
|
|
@@ -93,7 +73,7 @@ function outputData(data, options = {}) {
|
|
|
93
73
|
case 'yaml':
|
|
94
74
|
if (!silent)
|
|
95
75
|
printInfo('Rendering as YAML');
|
|
96
|
-
output =
|
|
76
|
+
output = YAML.stringify(data);
|
|
97
77
|
break;
|
|
98
78
|
case 'json':
|
|
99
79
|
default:
|
|
@@ -110,7 +90,7 @@ function outputData(data, options = {}) {
|
|
|
110
90
|
}
|
|
111
91
|
}
|
|
112
92
|
// --- Table formatting ---
|
|
113
|
-
function formatTable(data, columns) {
|
|
93
|
+
export function formatTable(data, columns) {
|
|
114
94
|
if (!Array.isArray(data) || data.length === 0)
|
|
115
95
|
return dim('(No data to display)');
|
|
116
96
|
const firstItem = data[0];
|
|
@@ -129,7 +109,7 @@ function formatTable(data, columns) {
|
|
|
129
109
|
}));
|
|
130
110
|
return Math.max(headerWidth, dataWidth, 3);
|
|
131
111
|
});
|
|
132
|
-
const { border } =
|
|
112
|
+
const { border } = TABLE_OPTIONS;
|
|
133
113
|
const horizontalLine = (left, middle, right) => left + colWidths.map(w => border.bodyJoin.repeat((w ?? 0) + 2)).join(middle) + right;
|
|
134
114
|
const topLine = horizontalLine(border.topLeft, border.topJoin, border.topRight);
|
|
135
115
|
const midLine = horizontalLine(border.joinLeft, border.joinJoin, border.joinRight);
|
|
@@ -190,9 +170,9 @@ function escapeCsvValue(value) {
|
|
|
190
170
|
* Prevents path traversal attacks (e.g., --output ../../etc/passwd).
|
|
191
171
|
*/
|
|
192
172
|
function validateOutputPath(filePath) {
|
|
193
|
-
const resolved =
|
|
194
|
-
const cwd =
|
|
195
|
-
if (!resolved.startsWith(cwd +
|
|
173
|
+
const resolved = path.resolve(filePath);
|
|
174
|
+
const cwd = path.resolve(process.cwd());
|
|
175
|
+
if (!resolved.startsWith(cwd + path.sep) && resolved !== cwd) {
|
|
196
176
|
throw new Error(`Path traversal rejected: "${filePath}" resolves outside the current directory`);
|
|
197
177
|
}
|
|
198
178
|
return resolved;
|
|
@@ -200,17 +180,17 @@ function validateOutputPath(filePath) {
|
|
|
200
180
|
function writeToFile(filePath, content, format, append = false) {
|
|
201
181
|
try {
|
|
202
182
|
const safePath = validateOutputPath(filePath);
|
|
203
|
-
const dir =
|
|
183
|
+
const dir = path.dirname(safePath);
|
|
204
184
|
if (dir !== '.')
|
|
205
185
|
ensureOutputDirectory(dir);
|
|
206
186
|
if (append) {
|
|
207
|
-
|
|
187
|
+
fs.appendFileSync(safePath, content + '\n', 'utf-8');
|
|
208
188
|
printSuccess('Output appended to file', { path: safePath, format });
|
|
209
189
|
}
|
|
210
190
|
else {
|
|
211
|
-
|
|
212
|
-
const stats =
|
|
213
|
-
printSuccess('Output saved to file', { path: safePath, format, size:
|
|
191
|
+
fs.writeFileSync(safePath, content, 'utf-8');
|
|
192
|
+
const stats = fs.statSync(safePath);
|
|
193
|
+
printSuccess('Output saved to file', { path: safePath, format, size: formatFileSize(stats.size) });
|
|
214
194
|
}
|
|
215
195
|
}
|
|
216
196
|
catch (error) {
|
|
@@ -221,11 +201,11 @@ function writeToFile(filePath, content, format, append = false) {
|
|
|
221
201
|
throw error;
|
|
222
202
|
}
|
|
223
203
|
}
|
|
224
|
-
function ensureOutputDirectory(outputPath) {
|
|
225
|
-
if (
|
|
204
|
+
export function ensureOutputDirectory(outputPath) {
|
|
205
|
+
if (fs.existsSync(outputPath))
|
|
226
206
|
return;
|
|
227
207
|
try {
|
|
228
|
-
|
|
208
|
+
fs.mkdirSync(outputPath, { recursive: true });
|
|
229
209
|
printDebug('Directory created', { path: outputPath });
|
|
230
210
|
}
|
|
231
211
|
catch (error) {
|
|
@@ -236,11 +216,11 @@ function ensureOutputDirectory(outputPath) {
|
|
|
236
216
|
throw error;
|
|
237
217
|
}
|
|
238
218
|
}
|
|
239
|
-
function fileExists(filePath) {
|
|
240
|
-
return
|
|
219
|
+
export function fileExists(filePath) {
|
|
220
|
+
return fs.existsSync(filePath);
|
|
241
221
|
}
|
|
242
222
|
// --- Display helpers ---
|
|
243
|
-
function printSection(title, subtitle) {
|
|
223
|
+
export function printSection(title, subtitle) {
|
|
244
224
|
const width = process.stdout.columns || 80;
|
|
245
225
|
console.log('');
|
|
246
226
|
console.log(cyan('═'.repeat(width)));
|
|
@@ -249,7 +229,7 @@ function printSection(title, subtitle) {
|
|
|
249
229
|
console.log(dim(subtitle));
|
|
250
230
|
console.log(cyan('═'.repeat(width)));
|
|
251
231
|
}
|
|
252
|
-
function printKeyValue(data, options = {}) {
|
|
232
|
+
export function printKeyValue(data, options = {}) {
|
|
253
233
|
const { indent = 0, separator = '│' } = options;
|
|
254
234
|
const maxKeyLength = Math.max(...Object.keys(data).map(k => k.length));
|
|
255
235
|
const indentStr = ' '.repeat(indent);
|
|
@@ -260,7 +240,7 @@ function printKeyValue(data, options = {}) {
|
|
|
260
240
|
console.log(`${indentStr}${dim(paddedKey)} ${cyan(separator)} ${white(formattedValue)}`);
|
|
261
241
|
});
|
|
262
242
|
}
|
|
263
|
-
function printDivider(char = '─', width) {
|
|
243
|
+
export function printDivider(char = '─', width) {
|
|
264
244
|
const effectiveWidth = width || process.stdout.columns || 80;
|
|
265
245
|
console.log(dim(char.repeat(effectiveWidth)));
|
|
266
246
|
}
|
|
@@ -269,7 +249,7 @@ function printDivider(char = '─', width) {
|
|
|
269
249
|
* Unwrap a sendSuccess API envelope: { success, statusCode, data: { ... } }
|
|
270
250
|
* Returns the inner `data` object, or the original response if not wrapped.
|
|
271
251
|
*/
|
|
272
|
-
function unwrapEnvelope(response) {
|
|
252
|
+
export function unwrapEnvelope(response) {
|
|
273
253
|
if (response && typeof response === 'object') {
|
|
274
254
|
const obj = response;
|
|
275
255
|
if ('success' in obj && 'data' in obj && obj.data && typeof obj.data === 'object') {
|
|
@@ -283,7 +263,7 @@ function unwrapEnvelope(response) {
|
|
|
283
263
|
* Extract a single entity from an API response, handling envelope formats.
|
|
284
264
|
* Tries: payload[entityKey], payload directly (if identifierKey exists), or undefined.
|
|
285
265
|
*/
|
|
286
|
-
function extractSingleResponse(response, entityKey, identifierKey) {
|
|
266
|
+
export function extractSingleResponse(response, entityKey, identifierKey) {
|
|
287
267
|
const payload = unwrapEnvelope(response);
|
|
288
268
|
// Direct entity: payload has the identifier (e.g. payload.id, payload.props, payload.name)
|
|
289
269
|
if (identifierKey in payload)
|
|
@@ -298,7 +278,7 @@ function extractSingleResponse(response, entityKey, identifierKey) {
|
|
|
298
278
|
* Extract items from an API list response, handling multiple response formats.
|
|
299
279
|
* Supports: `{ <key>: T[] }`, `{ items: T[] }`, `T[]`, or invalid formats.
|
|
300
280
|
*/
|
|
301
|
-
function extractListResponse(response, itemsKey) {
|
|
281
|
+
export function extractListResponse(response, itemsKey) {
|
|
302
282
|
if (Array.isArray(response)) {
|
|
303
283
|
return { items: response, total: undefined, hasMore: false };
|
|
304
284
|
}
|
|
@@ -322,4 +302,4 @@ function extractListResponse(response, itemsKey) {
|
|
|
322
302
|
printError('Invalid response format from API');
|
|
323
303
|
throw new Error('Unexpected API response format');
|
|
324
304
|
}
|
|
325
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL291dHB1dC11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQzs7Ozs7QUF1RXRDLG9DQUE0RztBQUM1Ryw4QkFBc0c7QUFDdEcsb0NBQXlHO0FBQ3pHLGdDQUF3RztBQUV4RyxnQ0FFQztBQU9ELGdDQXVDQztBQUlELGtDQTBEQztBQWdFRCxzREFZQztBQUVELGdDQUVDO0FBSUQsb0NBT0M7QUFFRCxzQ0FjQztBQUVELG9DQUdDO0FBUUQsd0NBU0M7QUFNRCxzREFRQztBQVlELGtEQTZCQztBQWhYRCxzREFBeUI7QUFDekIsMERBQTZCO0FBQzdCLDREQUE4QjtBQUM5QixnREFBd0I7QUFDeEIsMkRBSWlDO0FBRWpDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsb0JBQUksQ0FBQztBQTBCckUsNEJBQTRCO0FBRTVCLFNBQVMsU0FBUyxDQUFDLEtBQWUsRUFBRSxPQUFlLEVBQUUsSUFBYztJQUNqRSxNQUFNLE1BQU0sR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3hGLE1BQU0sUUFBUSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDaEYsTUFBTSxPQUFPLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FB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TUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFVBQWlELENBQUM7UUFDekUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQXVCLENBQUM7UUFDckUsTUFBTSxPQUFPLEdBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQWEsSUFBSSxLQUFLLENBQUM7UUFFM0UsZ0RBQWdEO1FBQ2hELElBQUksUUFBUSxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDcEQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3pELENBQUM7UUFFRCwwQkFBMEI7UUFDMUIsSUFBSSxPQUFPLElBQUksR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0MsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBWSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNyRCxDQUFDO1FBRUQsWUFBWSxDQUFDLGtEQUFrRCxDQUFDLENBQUM7UUFDakUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDekQsQ0FBQztJQUVELFVBQVUsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztBQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcGljbyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCBZQU1MIGZyb20gJ3lhbWwnO1xuaW1wb3J0IHtcbiAgT3V0cHV0Rm9ybWF0LFxuICBmb3JtYXRGaWxlU2l6ZSxcbiAgVEFCTEVfT1BUSU9OUyxcbn0gZnJvbSAnLi4vY29uZmlnL2NsaS5jb25zdGFudHMnO1xuXG5jb25zdCB7IGJvbGQsIGN5YW4sIGdyZWVuLCB5ZWxsb3csIHJlZCwgZGltLCBtYWdlbnRhLCB3aGl0ZSB9ID0gcGljbztcblxudHlwZSBMb2dMZXZlbCA9ICdpbmZvJyB8ICdzdWNjZXNzJyB8ICd3YXJuJyB8ICdlcnJvcicgfCAnZGVidWcnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIG91dHB1dERhdGEgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdXRwdXRPcHRpb25zIHtcbiAgZm9ybWF0PzogT3V0cHV0Rm9ybWF0O1xuICBmaWxlPzogc3RyaW5nO1xuICBwcmV0dHk/OiBib29sZWFuO1xuICBzaWxlbnQ/OiBib29sZWFuO1xuICBhcHBlbmQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRhYmxlIGNvbHVtbiBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVDb2x1bW4ge1xuICBoZWFkZXI6IHN0cmluZztcbiAga2V5OiBzdHJpbmc7XG4gIHdpZHRoPzogbnVtYmVyO1xuICBhbGlnbj86ICdsZWZ0JyB8ICdjZW50ZXInIHwgJ3JpZ2h0JztcbiAgZm9ybWF0dGVyPzogKHZhbHVlOiB1bmtub3duKSA9PiBzdHJpbmc7XG59XG5cbi8vIC0tLSBMb2dnaW5nIGZ1bmN0aW9ucyAtLS1cblxuZnVuY3Rpb24gbG9nT3V0cHV0KGxldmVsOiBMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bik6IHZvaWQge1xuICBjb25zdCBjb2xvcnMgPSB7IGluZm86IGN5YW4sIHN1Y2Nlc3M6IGdyZWVuLCB3YXJuOiB5ZWxsb3csIGVycm9yOiByZWQsIGRlYnVnOiBtYWdlbnRhIH07XG4gIGNvbnN0IHByZWZpeGVzID0geyBpbmZvOiAn4oS5Jywgc3VjY2VzczogJ+KckycsIHdhcm46ICfimqAnLCBlcnJvcjogJ+KclycsIGRlYnVnOiAn4pePJyB9O1xuICBjb25zdCB3cml0ZXJzID0geyBlcnJvcjogY29uc29sZS5lcnJvciwgd2FybjogY29uc29sZS53YXJuLCBpbmZvOiBjb25zb2xlLmxvZywgc3VjY2VzczogY29uc29sZS5sb2csIGRlYnVnOiBjb25zb2xlLmxvZyB9O1xuXG4gIC8vIEZhbGwgYmFjayB0byBjb25zb2xlLmxvZyArIHJhdyBtZXNzYWdlIGlmIGEgY2FsbGVyIGxlYWtzIGFuIHVua25vd24gbGV2ZWxcbiAgLy8gKGUuZy4gYW4gYGFzIExvZ0xldmVsYCBjYXN0IG9uIHVzZXIgaW5wdXQpLiBUaGUgd2hvbGUgcG9pbnQgb2YgdGhlIGxvZ2dlclxuICAvLyBpcyB0byBzdXJmYWNlIGVycm9ycyDigJQgZmFpbGluZyBpbnNpZGUgdGhlIGxvZ2dlciBhbmQgbWFza2luZyB0aGUgcmVhbFxuICAvLyBlcnJvciB3aXRoIGEgVHlwZUVycm9yIGRlZmVhdHMgaXQuXG4gIGNvbnN0IGNvbG9yID0gY29sb3JzW2xldmVsXSA/PyAoKHM6IHN0cmluZykgPT4gcyk7XG4gIGNvbnN0IHByZWZpeCA9IHByZWZpeGVzW2xldmVsXSA/PyAnPyc7XG4gIGNvbnN0IHdyaXRlID0gd3JpdGVyc1tsZXZlbF0gPz8gY29uc29sZS5sb2c7XG5cbiAgd3JpdGUoYCR7Y29sb3IocHJlZml4KX0gJHttZXNzYWdlfWApO1xuICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkKSB3cml0ZShkaW0oZm9ybWF0RGF0YUZvckxvZyhkYXRhKSkpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXREYXRhRm9yTG9nKGRhdGE6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSByZXR1cm4gZGF0YTtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiBkYXRhICE9PSBudWxsKSB7XG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGRhdGEpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA8PSA1KSB7XG4gICAgICByZXR1cm4gJ1xcbicgKyBlbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlU3RyID0gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KHZhbHVlKSA6IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBgICAke2tleX06ICR7dmFsdWVTdHJ9YDtcbiAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN1Y2Nlc3MobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bik6IHZvaWQgeyBsb2dPdXRwdXQoJ3N1Y2Nlc3MnLCBtZXNzYWdlLCBkYXRhKTsgfVxuZXhwb3J0IGZ1bmN0aW9uIHByaW50SW5mbyhtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKTogdm9pZCB7IGxvZ091dHB1dCgnaW5mbycsIG1lc3NhZ2UsIGRhdGEpOyB9XG5leHBvcnQgZnVuY3Rpb24gcHJpbnRXYXJuaW5nKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pOiB2b2lkIHsgbG9nT3V0cHV0KCd3YXJuJywgbWVzc2FnZSwgZGF0YSk7IH1cbmV4cG9ydCBmdW5jdGlvbiBwcmludEVycm9yKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pOiB2b2lkIHsgbG9nT3V0cHV0KCdlcnJvcicsIG1lc3NhZ2UsIGRhdGEpOyB9XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludERlYnVnKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKHByb2Nlc3MuZW52LkRFQlVHID09PSAndHJ1ZScpIGxvZ091dHB1dCgnZGVidWcnLCBtZXNzYWdlLCBkYXRhKTtcbn1cblxuLy8gLS0tIERhdGEgb3V0cHV0IC0tLVxuXG4vKipcbiAqIE91dHB1dCBkYXRhIGluIHNwZWNpZmllZCBmb3JtYXQgKGNvbnNvbGUgb3IgZmlsZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG91dHB1dERhdGEoZGF0YTogdW5rbm93biwgb3B0aW9uczogT3V0cHV0T3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gIGNvbnN0IHsgZm9ybWF0ID0gJ2pzb24nLCBmaWxlLCBwcmV0dHkgPSB0cnVlLCBzaWxlbnQgPSBmYWxzZSwgYXBwZW5kID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgbGV0IG91dHB1dDogc3RyaW5nO1xuXG4gIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgY2FzZSAndGFibGUnOlxuICAgICAgaWYgKCFzaWxlbnQpIHByaW50SW5mbygnUmVuZGVyaW5nIGFzIHRhYmxlJyk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSAmJiBkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coZm9ybWF0VGFibGUoZGF0YSkpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zb2xlLmxvZyhmb3JtYXRUYWJsZShbZGF0YV0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUudGFibGUoQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuXG4gICAgY2FzZSAnY3N2JzpcbiAgICAgIGlmICghc2lsZW50KSBwcmludEluZm8oJ1JlbmRlcmluZyBhcyBDU1YnKTtcbiAgICAgIG91dHB1dCA9IGZvcm1hdENzdihkYXRhKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAneWFtbCc6XG4gICAgICBpZiAoIXNpbGVudCkgcHJpbnRJbmZvKCdSZW5kZXJpbmcgYXMgWUFNTCcpO1xuICAgICAgb3V0cHV0ID0gWUFNTC5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2pzb24nOlxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAoIXNpbGVudCkgcHJpbnRJbmZvKCdSZW5kZXJpbmcgYXMgSlNPTicpO1xuICAgICAgb3V0cHV0ID0gcHJldHR5ID8gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMikgOiBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgaWYgKGZpbGUpIHtcbiAgICB3cml0ZVRvRmlsZShmaWxlLCBvdXRwdXQsIGZvcm1hdCwgYXBwZW5kKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhvdXRwdXQpO1xuICB9XG59XG5cbi8vIC0tLSBUYWJsZSBmb3JtYXR0aW5nIC0tLVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VGFibGUoZGF0YTogdW5rbm93bltdLCBjb2x1bW5zPzogVGFibGVDb2x1bW5bXSk6IHN0cmluZyB7XG4gIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGRpbSgnKE5vIGRhdGEgdG8gZGlzcGxheSknKTtcblxuICBjb25zdCBmaXJzdEl0ZW0gPSBkYXRhWzBdO1xuICBpZiAodHlwZW9mIGZpcnN0SXRlbSAhPT0gJ29iamVjdCcgfHwgZmlyc3RJdGVtID09PSBudWxsKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMik7XG5cbiAgY29uc3QgY29sczogVGFibGVDb2x1bW5bXSA9IGNvbHVtbnMgfHwgT2JqZWN0LmtleXMoZmlyc3RJdGVtKS5tYXAoa2V5ID0+ICh7IGhlYWRlcjoga2V5LCBrZXkgfSkpO1xuXG4gIGNvbnN0IGNvbFdpZHRoczogbnVtYmVyW10gPSBjb2xzLm1hcChjb2wgPT4ge1xuICAgIGlmIChjb2wud2lkdGgpIHJldHVybiBjb2wud2lkdGg7XG4gICAgY29uc3QgaGVhZGVyV2lkdGggPSBjb2wuaGVhZGVyLmxlbmd0aDtcbiAgICBjb25zdCBkYXRhV2lkdGggPSBNYXRoLm1heCguLi5kYXRhLm1hcChpdGVtID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29sLmZvcm1hdHRlclxuICAgICAgICA/IGNvbC5mb3JtYXR0ZXIoKGl0ZW0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2NvbC5rZXldKVxuICAgICAgICA6IFN0cmluZygoaXRlbSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbY29sLmtleV0gPz8gJycpO1xuICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aDtcbiAgICB9KSk7XG4gICAgcmV0dXJuIE1hdGgubWF4KGhlYWRlcldpZHRoLCBkYXRhV2lkdGgsIDMpO1xuICB9KTtcblxuICBjb25zdCB7IGJvcmRlciB9ID0gVEFCTEVfT1BUSU9OUztcblxuICBjb25zdCBob3Jpem9udGFsTGluZSA9IChsZWZ0OiBzdHJpbmcsIG1pZGRsZTogc3RyaW5nLCByaWdodDogc3RyaW5nKSA9PlxuICAgIGxlZnQgKyBjb2xXaWR0aHMubWFwKHcgPT4gYm9yZGVyLmJvZHlKb2luLnJlcGVhdCgodyA/PyAwKSArIDIpKS5qb2luKG1pZGRsZSkgKyByaWdodDtcblxuICBjb25zdCB0b3BMaW5lID0gaG9yaXpvbnRhbExpbmUoYm9yZGVyLnRvcExlZnQsIGJvcmRlci50b3BKb2luLCBib3JkZXIudG9wUmlnaHQpO1xuICBjb25zdCBtaWRMaW5lID0gaG9yaXpvbnRhbExpbmUoYm9yZGVyLmpvaW5MZWZ0LCBib3JkZXIuam9pbkpvaW4sIGJvcmRlci5qb2luUmlnaHQpO1xuICBjb25zdCBib3R0b21MaW5lID0gaG9yaXpvbnRhbExpbmUoYm9yZGVyLmJvdHRvbUxlZnQsIGJvcmRlci5ib3R0b21Kb2luLCBib3JkZXIuYm90dG9tUmlnaHQpO1xuXG4gIGNvbnN0IGZvcm1hdENlbGwgPSAodmFsdWU6IHN0cmluZywgd2lkdGg6IG51bWJlciwgYWxpZ246ICdsZWZ0JyB8ICdjZW50ZXInIHwgJ3JpZ2h0JyA9ICdsZWZ0Jyk6IHN0cmluZyA9PiB7XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA+IHdpZHRoKSByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDAsIHdpZHRoIC0gMykgKyAnLi4uJztcbiAgICBpZiAoYWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICBjb25zdCBsZWZ0UGFkID0gTWF0aC5mbG9vcigod2lkdGggLSB2YWx1ZS5sZW5ndGgpIC8gMik7XG4gICAgICByZXR1cm4gJyAnLnJlcGVhdChsZWZ0UGFkKSArIHZhbHVlICsgJyAnLnJlcGVhdCh3aWR0aCAtIHZhbHVlLmxlbmd0aCAtIGxlZnRQYWQpO1xuICAgIH1cbiAgICByZXR1cm4gYWxpZ24gPT09ICdyaWdodCcgPyB2YWx1ZS5wYWRTdGFydCh3aWR0aCkgOiB2YWx1ZS5wYWRFbmQod2lkdGgpO1xuICB9O1xuXG4gIGNvbnN0IGhlYWRlclJvdyA9IGJvcmRlci5ib2R5TGVmdCArICcgJyArXG4gICAgY29scy5tYXAoKGNvbCwgaSkgPT4gY3lhbihib2xkKGZvcm1hdENlbGwoY29sLmhlYWRlciwgY29sV2lkdGhzW2ldID8/IDApKSkpLmpvaW4oYCAke2JvcmRlci5ib2R5Sm9pbn0gYCkgK1xuICAgIGAgJHtib3JkZXIuYm9keVJpZ2h0fWA7XG5cbiAgbGV0IHRhYmxlID0gY3lhbih0b3BMaW5lKSArICdcXG4nICsgaGVhZGVyUm93ICsgJ1xcbicgKyBjeWFuKG1pZExpbmUpICsgJ1xcbic7XG5cbiAgZGF0YS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgIGNvbnN0IHJvdyA9IGJvcmRlci5ib2R5TGVmdCArICcgJyArXG4gICAgICBjb2xzLm1hcCgoY29sLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29sLmZvcm1hdHRlclxuICAgICAgICAgID8gY29sLmZvcm1hdHRlcigoaXRlbSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbY29sLmtleV0pXG4gICAgICAgICAgOiBTdHJpbmcoKGl0ZW0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2NvbC5rZXldID8/ICcnKTtcbiAgICAgICAgcmV0dXJuIGZvcm1hdENlbGwodmFsdWUsIGNvbFdpZHRoc1tpXSA/PyAwLCBjb2wuYWxpZ24pO1xuICAgICAgfSkuam9pbihgICR7Ym9yZGVyLmJvZHlKb2lufSBgKSArXG4gICAgICBgICR7Ym9yZGVyLmJvZHlSaWdodH1gO1xuICAgIHRhYmxlICs9IHJvdyArICdcXG4nO1xuICB9KTtcblxuICB0YWJsZSArPSBjeWFuKGJvdHRvbUxpbmUpO1xuICByZXR1cm4gdGFibGU7XG59XG5cbi8vIC0tLSBDU1YgZm9ybWF0dGluZyAtLS1cblxuZnVuY3Rpb24gZm9ybWF0Q3N2KGRhdGE6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgZGF0YS5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgY29uc3QgZmlyc3RJdGVtID0gZGF0YVswXTtcbiAgaWYgKHR5cGVvZiBmaXJzdEl0ZW0gIT09ICdvYmplY3QnIHx8IGZpcnN0SXRlbSA9PT0gbnVsbCkgcmV0dXJuIGRhdGEuam9pbignLCcpO1xuXG4gIGNvbnN0IGhlYWRlcnMgPSBPYmplY3Qua2V5cyhmaXJzdEl0ZW0pO1xuICBjb25zdCByb3dzOiBzdHJpbmdbXSA9IFtoZWFkZXJzLm1hcChoID0+IGVzY2FwZUNzdlZhbHVlKGgpKS5qb2luKCcsJyldO1xuICBkYXRhLmZvckVhY2goaXRlbSA9PiB7XG4gICAgcm93cy5wdXNoKGhlYWRlcnMubWFwKGggPT4gZXNjYXBlQ3N2VmFsdWUoKGl0ZW0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2hdKSkuam9pbignLCcpKTtcbiAgfSk7XG4gIHJldHVybiByb3dzLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVDc3ZWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJyc7XG4gIGNvbnN0IHN0ciA9IFN0cmluZyh2YWx1ZSk7XG4gIGlmIChzdHIuaW5jbHVkZXMoJywnKSB8fCBzdHIuaW5jbHVkZXMoJ1wiJykgfHwgc3RyLmluY2x1ZGVzKCdcXG4nKSkge1xuICAgIHJldHVybiBgXCIke3N0ci5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYDtcbiAgfVxuICByZXR1cm4gc3RyO1xufVxuXG4vLyAtLS0gRmlsZSBvcGVyYXRpb25zIC0tLVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgYSBmaWxlIHBhdGggcmVzb2x2ZXMgd2l0aGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LlxuICogUHJldmVudHMgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrcyAoZS5nLiwgLS1vdXRwdXQgLi4vLi4vZXRjL3Bhc3N3ZCkuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlT3V0cHV0UGF0aChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpO1xuICBjb25zdCBjd2QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSk7XG4gIGlmICghcmVzb2x2ZWQuc3RhcnRzV2l0aChjd2QgKyBwYXRoLnNlcCkgJiYgcmVzb2x2ZWQgIT09IGN3ZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCB0cmF2ZXJzYWwgcmVqZWN0ZWQ6IFwiJHtmaWxlUGF0aH1cIiByZXNvbHZlcyBvdXRzaWRlIHRoZSBjdXJyZW50IGRpcmVjdG9yeWApO1xuICB9XG4gIHJldHVybiByZXNvbHZlZDtcbn1cblxuZnVuY3Rpb24gd3JpdGVUb0ZpbGUoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmb3JtYXQ6IE91dHB1dEZvcm1hdCwgYXBwZW5kOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzYWZlUGF0aCA9IHZhbGlkYXRlT3V0cHV0UGF0aChmaWxlUGF0aCk7XG4gICAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKHNhZmVQYXRoKTtcbiAgICBpZiAoZGlyICE9PSAnLicpIGVuc3VyZU91dHB1dERpcmVjdG9yeShkaXIpO1xuXG4gICAgaWYgKGFwcGVuZCkge1xuICAgICAgZnMuYXBwZW5kRmlsZVN5bmMoc2FmZVBhdGgsIGNvbnRlbnQgKyAnXFxuJywgJ3V0Zi04Jyk7XG4gICAgICBwcmludFN1Y2Nlc3MoJ091dHB1dCBhcHBlbmRlZCB0byBmaWxlJywgeyBwYXRoOiBzYWZlUGF0aCwgZm9ybWF0IH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKHNhZmVQYXRoLCBjb250ZW50LCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IHN0YXRzID0gZnMuc3RhdFN5bmMoc2FmZVBhdGgpO1xuICAgICAgcHJpbnRTdWNjZXNzKCdPdXRwdXQgc2F2ZWQgdG8gZmlsZScsIHsgcGF0aDogc2FmZVBhdGgsIGZvcm1hdCwgc2l6ZTogZm9ybWF0RmlsZVNpemUoc3RhdHMuc2l6ZSkgfSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHByaW50RXJyb3IoJ0ZhaWxlZCB0byB3cml0ZSBmaWxlJywge1xuICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgIH0pO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVPdXRwdXREaXJlY3Rvcnkob3V0cHV0UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChmcy5leGlzdHNTeW5jKG91dHB1dFBhdGgpKSByZXR1cm47XG4gIHRyeSB7XG4gICAgZnMubWtkaXJTeW5jKG91dHB1dFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHByaW50RGVidWcoJ0RpcmVjdG9yeSBjcmVhdGVkJywgeyBwYXRoOiBvdXRwdXRQYXRoIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHByaW50RXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5Jywge1xuICAgICAgcGF0aDogb3V0cHV0UGF0aCxcbiAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgfSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbGVFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCk7XG59XG5cbi8vIC0tLSBEaXNwbGF5IGhlbHBlcnMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFNlY3Rpb24odGl0bGU6IHN0cmluZywgc3VidGl0bGU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qgd2lkdGggPSBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zIHx8IDgwO1xuICBjb25zb2xlLmxvZygnJyk7XG4gIGNvbnNvbGUubG9nKGN5YW4oJ+KVkCcucmVwZWF0KHdpZHRoKSkpO1xuICBjb25zb2xlLmxvZyhjeWFuKGJvbGQodGl0bGUpKSk7XG4gIGlmIChzdWJ0aXRsZSkgY29uc29sZS5sb2coZGltKHN1YnRpdGxlKSk7XG4gIGNvbnNvbGUubG9nKGN5YW4oJ+KVkCcucmVwZWF0KHdpZHRoKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRLZXlWYWx1ZShcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG9wdGlvbnM6IHsgaW5kZW50PzogbnVtYmVyOyBzZXBhcmF0b3I/OiBzdHJpbmcgfSA9IHt9LFxuKTogdm9pZCB7XG4gIGNvbnN0IHsgaW5kZW50ID0gMCwgc2VwYXJhdG9yID0gJ+KUgicgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IG1heEtleUxlbmd0aCA9IE1hdGgubWF4KC4uLk9iamVjdC5rZXlzKGRhdGEpLm1hcChrID0+IGsubGVuZ3RoKSk7XG4gIGNvbnN0IGluZGVudFN0ciA9ICcgJy5yZXBlYXQoaW5kZW50KTtcblxuICBPYmplY3QuZW50cmllcyhkYXRhKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBwYWRkZWRLZXkgPSBrZXkucGFkRW5kKG1heEtleUxlbmd0aCk7XG4gICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsXG4gICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbHVlKSA6IFN0cmluZyh2YWx1ZSk7XG4gICAgY29uc29sZS5sb2coYCR7aW5kZW50U3RyfSR7ZGltKHBhZGRlZEtleSl9ICR7Y3lhbihzZXBhcmF0b3IpfSAke3doaXRlKGZvcm1hdHRlZFZhbHVlKX1gKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludERpdmlkZXIoY2hhcjogc3RyaW5nID0gJ+KUgCcsIHdpZHRoPzogbnVtYmVyKTogdm9pZCB7XG4gIGNvbnN0IGVmZmVjdGl2ZVdpZHRoID0gd2lkdGggfHwgcHJvY2Vzcy5zdGRvdXQuY29sdW1ucyB8fCA4MDtcbiAgY29uc29sZS5sb2coZGltKGNoYXIucmVwZWF0KGVmZmVjdGl2ZVdpZHRoKSkpO1xufVxuXG4vLyAtLS0gUmVzcG9uc2UgcGFyc2luZyAtLS1cblxuLyoqXG4gKiBVbndyYXAgYSBzZW5kU3VjY2VzcyBBUEkgZW52ZWxvcGU6IHsgc3VjY2Vzcywgc3RhdHVzQ29kZSwgZGF0YTogeyAuLi4gfSB9XG4gKiBSZXR1cm5zIHRoZSBpbm5lciBgZGF0YWAgb2JqZWN0LCBvciB0aGUgb3JpZ2luYWwgcmVzcG9uc2UgaWYgbm90IHdyYXBwZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXBFbnZlbG9wZShyZXNwb25zZTogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKHJlc3BvbnNlICYmIHR5cGVvZiByZXNwb25zZSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBvYmogPSByZXNwb25zZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoJ3N1Y2Nlc3MnIGluIG9iaiAmJiAnZGF0YScgaW4gb2JqICYmIG9iai5kYXRhICYmIHR5cGVvZiBvYmouZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBvYmouZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICByZXR1cm4ge307XG59XG5cbi8qKlxuICogRXh0cmFjdCBhIHNpbmdsZSBlbnRpdHkgZnJvbSBhbiBBUEkgcmVzcG9uc2UsIGhhbmRsaW5nIGVudmVsb3BlIGZvcm1hdHMuXG4gKiBUcmllczogcGF5bG9hZFtlbnRpdHlLZXldLCBwYXlsb2FkIGRpcmVjdGx5IChpZiBpZGVudGlmaWVyS2V5IGV4aXN0cyksIG9yIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RTaW5nbGVSZXNwb25zZTxUPihyZXNwb25zZTogdW5rbm93biwgZW50aXR5S2V5OiBzdHJpbmcsIGlkZW50aWZpZXJLZXk6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXlsb2FkID0gdW53cmFwRW52ZWxvcGUocmVzcG9uc2UpO1xuICAvLyBEaXJlY3QgZW50aXR5OiBwYXlsb2FkIGhhcyB0aGUgaWRlbnRpZmllciAoZS5nLiBwYXlsb2FkLmlkLCBwYXlsb2FkLnByb3BzLCBwYXlsb2FkLm5hbWUpXG4gIGlmIChpZGVudGlmaWVyS2V5IGluIHBheWxvYWQpIHJldHVybiBwYXlsb2FkIGFzIHVua25vd24gYXMgVDtcbiAgLy8gTmVzdGVkIHVuZGVyIGVudGl0eSBrZXk6IHBheWxvYWQucGlwZWxpbmUsIHBheWxvYWQucGx1Z2luXG4gIGNvbnN0IG5lc3RlZCA9IHBheWxvYWRbZW50aXR5S2V5XSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgaWYgKG5lc3RlZCAmJiB0eXBlb2YgbmVzdGVkID09PSAnb2JqZWN0JyAmJiBpZGVudGlmaWVyS2V5IGluIG5lc3RlZCkgcmV0dXJuIG5lc3RlZCBhcyB1bmtub3duIGFzIFQ7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFJlc3BvbnNlUmVzdWx0PFQ+IHtcbiAgaXRlbXM6IFRbXTtcbiAgdG90YWw/OiBudW1iZXI7XG4gIGhhc01vcmU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRXh0cmFjdCBpdGVtcyBmcm9tIGFuIEFQSSBsaXN0IHJlc3BvbnNlLCBoYW5kbGluZyBtdWx0aXBsZSByZXNwb25zZSBmb3JtYXRzLlxuICogU3VwcG9ydHM6IGB7IDxrZXk+OiBUW10gfWAsIGB7IGl0ZW1zOiBUW10gfWAsIGBUW11gLCBvciBpbnZhbGlkIGZvcm1hdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TGlzdFJlc3BvbnNlPFQ+KHJlc3BvbnNlOiB1bmtub3duLCBpdGVtc0tleTogc3RyaW5nKTogTGlzdFJlc3BvbnNlUmVzdWx0PFQ+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocmVzcG9uc2UpKSB7XG4gICAgcmV0dXJuIHsgaXRlbXM6IHJlc3BvbnNlLCB0b3RhbDogdW5kZWZpbmVkLCBoYXNNb3JlOiBmYWxzZSB9O1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlICYmIHR5cGVvZiByZXNwb25zZSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBvYmogPSB1bndyYXBFbnZlbG9wZShyZXNwb25zZSk7XG5cbiAgICAvLyBFeHRyYWN0IHBhZ2luYXRpb24gbWV0YWRhdGEgaWYgcHJlc2VudFxuICAgIGNvbnN0IHBhZ2luYXRpb24gPSBvYmoucGFnaW5hdGlvbiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB0b3RhbCA9IChwYWdpbmF0aW9uPy50b3RhbCA/PyBvYmoudG90YWwpIGFzIG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBoYXNNb3JlID0gKChwYWdpbmF0aW9uPy5oYXNNb3JlID8/IG9iai5oYXNNb3JlKSBhcyBib29sZWFuKSB8fCBmYWxzZTtcblxuICAgIC8vIFRyeSBwcmltYXJ5IGtleSAoZS5nLiAncGlwZWxpbmVzJywgJ3BsdWdpbnMnKVxuICAgIGlmIChpdGVtc0tleSBpbiBvYmogJiYgQXJyYXkuaXNBcnJheShvYmpbaXRlbXNLZXldKSkge1xuICAgICAgcmV0dXJuIHsgaXRlbXM6IG9ialtpdGVtc0tleV0gYXMgVFtdLCB0b3RhbCwgaGFzTW9yZSB9O1xuICAgIH1cblxuICAgIC8vIFRyeSBnZW5lcmljICdpdGVtcycga2V5XG4gICAgaWYgKCdpdGVtcycgaW4gb2JqICYmIEFycmF5LmlzQXJyYXkob2JqLml0ZW1zKSkge1xuICAgICAgcmV0dXJuIHsgaXRlbXM6IG9iai5pdGVtcyBhcyBUW10sIHRvdGFsLCBoYXNNb3JlIH07XG4gICAgfVxuXG4gICAgcHJpbnRXYXJuaW5nKCdVbmV4cGVjdGVkIHJlc3BvbnNlIGZvcm1hdCwgYXR0ZW1wdGluZyB0byBoYW5kbGUnKTtcbiAgICByZXR1cm4geyBpdGVtczogW10sIHRvdGFsOiB1bmRlZmluZWQsIGhhc01vcmU6IGZhbHNlIH07XG4gIH1cblxuICBwcmludEVycm9yKCdJbnZhbGlkIHJlc3BvbnNlIGZvcm1hdCBmcm9tIEFQSScpO1xuICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgQVBJIHJlc3BvbnNlIGZvcm1hdCcpO1xufVxuIl19
|
|
305
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL291dHB1dC11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6QixPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxJQUFJLE1BQU0sWUFBWSxDQUFDO0FBQzlCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEVBRUwsY0FBYyxFQUNkLGFBQWEsR0FDZCxNQUFNLDRCQUE0QixDQUFDO0FBRXBDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBMEJyRSw0QkFBNEI7QUFFNUIsU0FBUyxTQUFTLENBQUMsS0FBZSxFQUFFLE9BQWUsRUFBRSxJQUFjO0lBQ2pFLE1BQU0sTUFBTSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDeEYsTUFBTSxRQUFRLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNoRixNQUFNLE9BQU8sR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxF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LENBQUM7UUFDekUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQXVCLENBQUM7UUFDckUsTUFBTSxPQUFPLEdBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQWEsSUFBSSxLQUFLLENBQUM7UUFFM0UsZ0RBQWdEO1FBQ2hELElBQUksUUFBUSxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDcEQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3pELENBQUM7UUFFRCwwQkFBMEI7UUFDMUIsSUFBSSxPQUFPLElBQUksR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0MsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBWSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNyRCxDQUFDO1FBRUQsWUFBWSxDQUFDLGtEQUFrRCxDQUFDLENBQUM7UUFDakUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDekQsQ0FBQztJQUVELFVBQVUsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztBQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcGljbyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCBZQU1MIGZyb20gJ3lhbWwnO1xuaW1wb3J0IHtcbiAgdHlwZSBPdXRwdXRGb3JtYXQsXG4gIGZvcm1hdEZpbGVTaXplLFxuICBUQUJMRV9PUFRJT05TLFxufSBmcm9tICcuLi9jb25maWcvY2xpLmNvbnN0YW50cy5qcyc7XG5cbmNvbnN0IHsgYm9sZCwgY3lhbiwgZ3JlZW4sIHllbGxvdywgcmVkLCBkaW0sIG1hZ2VudGEsIHdoaXRlIH0gPSBwaWNvO1xuXG50eXBlIExvZ0xldmVsID0gJ2luZm8nIHwgJ3N1Y2Nlc3MnIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdkZWJ1Zyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igb3V0cHV0RGF0YSBmdW5jdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE91dHB1dE9wdGlvbnMge1xuICBmb3JtYXQ/OiBPdXRwdXRGb3JtYXQ7XG4gIGZpbGU/OiBzdHJpbmc7XG4gIHByZXR0eT86IGJvb2xlYW47XG4gIHNpbGVudD86IGJvb2xlYW47XG4gIGFwcGVuZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGFibGUgY29sdW1uIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWJsZUNvbHVtbiB7XG4gIGhlYWRlcjogc3RyaW5nO1xuICBrZXk6IHN0cmluZztcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGFsaWduPzogJ2xlZnQnIHwgJ2NlbnRlcicgfCAncmlnaHQnO1xuICBmb3JtYXR0ZXI/OiAodmFsdWU6IHVua25vd24pID0+IHN0cmluZztcbn1cblxuLy8gLS0tIExvZ2dpbmcgZnVuY3Rpb25zIC0tLVxuXG5mdW5jdGlvbiBsb2dPdXRwdXQobGV2ZWw6IExvZ0xldmVsLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKTogdm9pZCB7XG4gIGNvbnN0IGNvbG9ycyA9IHsgaW5mbzogY3lhbiwgc3VjY2VzczogZ3JlZW4sIHdhcm46IHllbGxvdywgZXJyb3I6IHJlZCwgZGVidWc6IG1hZ2VudGEgfTtcbiAgY29uc3QgcHJlZml4ZXMgPSB7IGluZm86ICfihLknLCBzdWNjZXNzOiAn4pyTJywgd2FybjogJ+KaoCcsIGVycm9yOiAn4pyXJywgZGVidWc6ICfil48nIH07XG4gIGNvbnN0IHdyaXRlcnMgPSB7IGVycm9yOiBjb25zb2xlLmVycm9yLCB3YXJuOiBjb25zb2xlLndhcm4sIGluZm86IGNvbnNvbGUubG9nLCBzdWNjZXNzOiBjb25zb2xlLmxvZywgZGVidWc6IGNvbnNvbGUubG9nIH07XG5cbiAgLy8gRmFsbCBiYWNrIHRvIGNvbnNvbGUubG9nICsgcmF3IG1lc3NhZ2UgaWYgYSBjYWxsZXIgbGVha3MgYW4gdW5rbm93biBsZXZlbFxuICAvLyAoZS5nLiBhbiBgYXMgTG9nTGV2ZWxgIGNhc3Qgb24gdXNlciBpbnB1dCkuIFRoZSB3aG9sZSBwb2ludCBvZiB0aGUgbG9nZ2VyXG4gIC8vIGlzIHRvIHN1cmZhY2UgZXJyb3JzIOKAlCBmYWlsaW5nIGluc2lkZSB0aGUgbG9nZ2VyIGFuZCBtYXNraW5nIHRoZSByZWFsXG4gIC8vIGVycm9yIHdpdGggYSBUeXBlRXJyb3IgZGVmZWF0cyBpdC5cbiAgY29uc3QgY29sb3IgPSBjb2xvcnNbbGV2ZWxdID8/ICgoczogc3RyaW5nKSA9PiBzKTtcbiAgY29uc3QgcHJlZml4ID0gcHJlZml4ZXNbbGV2ZWxdID8/ICc/JztcbiAgY29uc3Qgd3JpdGUgPSB3cml0ZXJzW2xldmVsXSA/PyBjb25zb2xlLmxvZztcblxuICB3cml0ZShgJHtjb2xvcihwcmVmaXgpfSAke21lc3NhZ2V9YCk7XG4gIGlmIChkYXRhICE9PSB1bmRlZmluZWQpIHdyaXRlKGRpbShmb3JtYXREYXRhRm9yTG9nKGRhdGEpKSk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdERhdGFGb3JMb2coZGF0YTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHJldHVybiBkYXRhO1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmIGRhdGEgIT09IG51bGwpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZGF0YSk7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoIDw9IDUpIHtcbiAgICAgIHJldHVybiAnXFxuJyArIGVudHJpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWVTdHIgPSB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpIDogU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGAgICR7a2V5fTogJHt2YWx1ZVN0cn1gO1xuICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3VjY2VzcyhtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKTogdm9pZCB7IGxvZ091dHB1dCgnc3VjY2VzcycsIG1lc3NhZ2UsIGRhdGEpOyB9XG5leHBvcnQgZnVuY3Rpb24gcHJpbnRJbmZvKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pOiB2b2lkIHsgbG9nT3V0cHV0KCdpbmZvJywgbWVzc2FnZSwgZGF0YSk7IH1cbmV4cG9ydCBmdW5jdGlvbiBwcmludFdhcm5pbmcobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bik6IHZvaWQgeyBsb2dPdXRwdXQoJ3dhcm4nLCBtZXNzYWdlLCBkYXRhKTsgfVxuZXhwb3J0IGZ1bmN0aW9uIHByaW50RXJyb3IobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bik6IHZvaWQgeyBsb2dPdXRwdXQoJ2Vycm9yJywgbWVzc2FnZSwgZGF0YSk7IH1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50RGVidWcobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bik6IHZvaWQge1xuICBpZiAocHJvY2Vzcy5lbnYuREVCVUcgPT09ICd0cnVlJykgbG9nT3V0cHV0KCdkZWJ1ZycsIG1lc3NhZ2UsIGRhdGEpO1xufVxuXG4vLyAtLS0gRGF0YSBvdXRwdXQgLS0tXG5cbi8qKlxuICogT3V0cHV0IGRhdGEgaW4gc3BlY2lmaWVkIGZvcm1hdCAoY29uc29sZSBvciBmaWxlKVxuICovXG5leHBvcnQgZnVuY3Rpb24gb3V0cHV0RGF0YShkYXRhOiB1bmtub3duLCBvcHRpb25zOiBPdXRwdXRPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgY29uc3QgeyBmb3JtYXQgPSAnanNvbicsIGZpbGUsIHByZXR0eSA9IHRydWUsIHNpbGVudCA9IGZhbHNlLCBhcHBlbmQgPSBmYWxzZSB9ID0gb3B0aW9ucztcblxuICBsZXQgb3V0cHV0OiBzdHJpbmc7XG5cbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlICd0YWJsZSc6XG4gICAgICBpZiAoIXNpbGVudCkgcHJpbnRJbmZvKCdSZW5kZXJpbmcgYXMgdGFibGUnKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpICYmIGRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhmb3JtYXRUYWJsZShkYXRhKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiBkYXRhICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGZvcm1hdFRhYmxlKFtkYXRhXSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS50YWJsZShBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG5cbiAgICBjYXNlICdjc3YnOlxuICAgICAgaWYgKCFzaWxlbnQpIHByaW50SW5mbygnUmVuZGVyaW5nIGFzIENTVicpO1xuICAgICAgb3V0cHV0ID0gZm9ybWF0Q3N2KGRhdGEpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd5YW1sJzpcbiAgICAgIGlmICghc2lsZW50KSBwcmludEluZm8oJ1JlbmRlcmluZyBhcyBZQU1MJyk7XG4gICAgICBvdXRwdXQgPSBZQU1MLnN0cmluZ2lmeShkYXRhKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnanNvbic6XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICghc2lsZW50KSBwcmludEluZm8oJ1JlbmRlcmluZyBhcyBKU09OJyk7XG4gICAgICBvdXRwdXQgPSBwcmV0dHkgPyBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKSA6IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICBpZiAoZmlsZSkge1xuICAgIHdyaXRlVG9GaWxlKGZpbGUsIG91dHB1dCwgZm9ybWF0LCBhcHBlbmQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKG91dHB1dCk7XG4gIH1cbn1cblxuLy8gLS0tIFRhYmxlIGZvcm1hdHRpbmcgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRUYWJsZShkYXRhOiB1bmtub3duW10sIGNvbHVtbnM/OiBUYWJsZUNvbHVtbltdKTogc3RyaW5nIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpIHx8IGRhdGEubGVuZ3RoID09PSAwKSByZXR1cm4gZGltKCcoTm8gZGF0YSB0byBkaXNwbGF5KScpO1xuXG4gIGNvbnN0IGZpcnN0SXRlbSA9IGRhdGFbMF07XG4gIGlmICh0eXBlb2YgZmlyc3RJdGVtICE9PSAnb2JqZWN0JyB8fCBmaXJzdEl0ZW0gPT09IG51bGwpIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTtcblxuICBjb25zdCBjb2xzOiBUYWJsZUNvbHVtbltdID0gY29sdW1ucyB8fCBPYmplY3Qua2V5cyhmaXJzdEl0ZW0pLm1hcChrZXkgPT4gKHsgaGVhZGVyOiBrZXksIGtleSB9KSk7XG5cbiAgY29uc3QgY29sV2lkdGhzOiBudW1iZXJbXSA9IGNvbHMubWFwKGNvbCA9PiB7XG4gICAgaWYgKGNvbC53aWR0aCkgcmV0dXJuIGNvbC53aWR0aDtcbiAgICBjb25zdCBoZWFkZXJXaWR0aCA9IGNvbC5oZWFkZXIubGVuZ3RoO1xuICAgIGNvbnN0IGRhdGFXaWR0aCA9IE1hdGgubWF4KC4uLmRhdGEubWFwKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb2wuZm9ybWF0dGVyXG4gICAgICAgID8gY29sLmZvcm1hdHRlcigoaXRlbSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbY29sLmtleV0pXG4gICAgICAgIDogU3RyaW5nKChpdGVtIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtjb2wua2V5XSA/PyAnJyk7XG4gICAgICByZXR1cm4gdmFsdWUubGVuZ3RoO1xuICAgIH0pKTtcbiAgICByZXR1cm4gTWF0aC5tYXgoaGVhZGVyV2lkdGgsIGRhdGFXaWR0aCwgMyk7XG4gIH0pO1xuXG4gIGNvbnN0IHsgYm9yZGVyIH0gPSBUQUJMRV9PUFRJT05TO1xuXG4gIGNvbnN0IGhvcml6b250YWxMaW5lID0gKGxlZnQ6IHN0cmluZywgbWlkZGxlOiBzdHJpbmcsIHJpZ2h0OiBzdHJpbmcpID0+XG4gICAgbGVmdCArIGNvbFdpZHRocy5tYXAodyA9PiBib3JkZXIuYm9keUpvaW4ucmVwZWF0KCh3ID8/IDApICsgMikpLmpvaW4obWlkZGxlKSArIHJpZ2h0O1xuXG4gIGNvbnN0IHRvcExpbmUgPSBob3Jpem9udGFsTGluZShib3JkZXIudG9wTGVmdCwgYm9yZGVyLnRvcEpvaW4sIGJvcmRlci50b3BSaWdodCk7XG4gIGNvbnN0IG1pZExpbmUgPSBob3Jpem9udGFsTGluZShib3JkZXIuam9pbkxlZnQsIGJvcmRlci5qb2luSm9pbiwgYm9yZGVyLmpvaW5SaWdodCk7XG4gIGNvbnN0IGJvdHRvbUxpbmUgPSBob3Jpem9udGFsTGluZShib3JkZXIuYm90dG9tTGVmdCwgYm9yZGVyLmJvdHRvbUpvaW4sIGJvcmRlci5ib3R0b21SaWdodCk7XG5cbiAgY29uc3QgZm9ybWF0Q2VsbCA9ICh2YWx1ZTogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBhbGlnbjogJ2xlZnQnIHwgJ2NlbnRlcicgfCAncmlnaHQnID0gJ2xlZnQnKTogc3RyaW5nID0+IHtcbiAgICBpZiAodmFsdWUubGVuZ3RoID4gd2lkdGgpIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoMCwgd2lkdGggLSAzKSArICcuLi4nO1xuICAgIGlmIChhbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgIGNvbnN0IGxlZnRQYWQgPSBNYXRoLmZsb29yKCh3aWR0aCAtIHZhbHVlLmxlbmd0aCkgLyAyKTtcbiAgICAgIHJldHVybiAnICcucmVwZWF0KGxlZnRQYWQpICsgdmFsdWUgKyAnICcucmVwZWF0KHdpZHRoIC0gdmFsdWUubGVuZ3RoIC0gbGVmdFBhZCk7XG4gICAgfVxuICAgIHJldHVybiBhbGlnbiA9PT0gJ3JpZ2h0JyA/IHZhbHVlLnBhZFN0YXJ0KHdpZHRoKSA6IHZhbHVlLnBhZEVuZCh3aWR0aCk7XG4gIH07XG5cbiAgY29uc3QgaGVhZGVyUm93ID0gYm9yZGVyLmJvZHlMZWZ0ICsgJyAnICtcbiAgICBjb2xzLm1hcCgoY29sLCBpKSA9PiBjeWFuKGJvbGQoZm9ybWF0Q2VsbChjb2wuaGVhZGVyLCBjb2xXaWR0aHNbaV0gPz8gMCkpKSkuam9pbihgICR7Ym9yZGVyLmJvZHlKb2lufSBgKSArXG4gICAgYCAke2JvcmRlci5ib2R5UmlnaHR9YDtcblxuICBsZXQgdGFibGUgPSBjeWFuKHRvcExpbmUpICsgJ1xcbicgKyBoZWFkZXJSb3cgKyAnXFxuJyArIGN5YW4obWlkTGluZSkgKyAnXFxuJztcblxuICBkYXRhLmZvckVhY2goaXRlbSA9PiB7XG4gICAgY29uc3Qgcm93ID0gYm9yZGVyLmJvZHlMZWZ0ICsgJyAnICtcbiAgICAgIGNvbHMubWFwKChjb2wsIGkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb2wuZm9ybWF0dGVyXG4gICAgICAgICAgPyBjb2wuZm9ybWF0dGVyKChpdGVtIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtjb2wua2V5XSlcbiAgICAgICAgICA6IFN0cmluZygoaXRlbSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbY29sLmtleV0gPz8gJycpO1xuICAgICAgICByZXR1cm4gZm9ybWF0Q2VsbCh2YWx1ZSwgY29sV2lkdGhzW2ldID8/IDAsIGNvbC5hbGlnbik7XG4gICAgICB9KS5qb2luKGAgJHtib3JkZXIuYm9keUpvaW59IGApICtcbiAgICAgIGAgJHtib3JkZXIuYm9keVJpZ2h0fWA7XG4gICAgdGFibGUgKz0gcm93ICsgJ1xcbic7XG4gIH0pO1xuXG4gIHRhYmxlICs9IGN5YW4oYm90dG9tTGluZSk7XG4gIHJldHVybiB0YWJsZTtcbn1cblxuLy8gLS0tIENTViBmb3JtYXR0aW5nIC0tLVxuXG5mdW5jdGlvbiBmb3JtYXRDc3YoZGF0YTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICBjb25zdCBmaXJzdEl0ZW0gPSBkYXRhWzBdO1xuICBpZiAodHlwZW9mIGZpcnN0SXRlbSAhPT0gJ29iamVjdCcgfHwgZmlyc3RJdGVtID09PSBudWxsKSByZXR1cm4gZGF0YS5qb2luKCcsJyk7XG5cbiAgY29uc3QgaGVhZGVycyA9IE9iamVjdC5rZXlzKGZpcnN0SXRlbSk7XG4gIGNvbnN0IHJvd3M6IHN0cmluZ1tdID0gW2hlYWRlcnMubWFwKGggPT4gZXNjYXBlQ3N2VmFsdWUoaCkpLmpvaW4oJywnKV07XG4gIGRhdGEuZm9yRWFjaChpdGVtID0+IHtcbiAgICByb3dzLnB1c2goaGVhZGVycy5tYXAoaCA9PiBlc2NhcGVDc3ZWYWx1ZSgoaXRlbSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbaF0pKS5qb2luKCcsJykpO1xuICB9KTtcbiAgcmV0dXJuIHJvd3Muam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZUNzdlZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiAnJztcbiAgY29uc3Qgc3RyID0gU3RyaW5nKHZhbHVlKTtcbiAgaWYgKHN0ci5pbmNsdWRlcygnLCcpIHx8IHN0ci5pbmNsdWRlcygnXCInKSB8fCBzdHIuaW5jbHVkZXMoJ1xcbicpKSB7XG4gICAgcmV0dXJuIGBcIiR7c3RyLnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCJgO1xuICB9XG4gIHJldHVybiBzdHI7XG59XG5cbi8vIC0tLSBGaWxlIG9wZXJhdGlvbnMgLS0tXG5cbi8qKlxuICogVmFsaWRhdGUgdGhhdCBhIGZpbGUgcGF0aCByZXNvbHZlcyB3aXRoaW4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuXG4gKiBQcmV2ZW50cyBwYXRoIHRyYXZlcnNhbCBhdHRhY2tzIChlLmcuLCAtLW91dHB1dCAuLi8uLi9ldGMvcGFzc3dkKS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVPdXRwdXRQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZXNvbHZlZCA9IHBhdGgucmVzb2x2ZShmaWxlUGF0aCk7XG4gIGNvbnN0IGN3ZCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpKTtcbiAgaWYgKCFyZXNvbHZlZC5zdGFydHNXaXRoKGN3ZCArIHBhdGguc2VwKSAmJiByZXNvbHZlZCAhPT0gY3dkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoIHRyYXZlcnNhbCByZWplY3RlZDogXCIke2ZpbGVQYXRofVwiIHJlc29sdmVzIG91dHNpZGUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5YCk7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG5mdW5jdGlvbiB3cml0ZVRvRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGZvcm1hdDogT3V0cHV0Rm9ybWF0LCBhcHBlbmQ6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICB0cnkge1xuICAgIGNvbnN0IHNhZmVQYXRoID0gdmFsaWRhdGVPdXRwdXRQYXRoKGZpbGVQYXRoKTtcbiAgICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoc2FmZVBhdGgpO1xuICAgIGlmIChkaXIgIT09ICcuJykgZW5zdXJlT3V0cHV0RGlyZWN0b3J5KGRpcik7XG5cbiAgICBpZiAoYXBwZW5kKSB7XG4gICAgICBmcy5hcHBlbmRGaWxlU3luYyhzYWZlUGF0aCwgY29udGVudCArICdcXG4nLCAndXRmLTgnKTtcbiAgICAgIHByaW50U3VjY2VzcygnT3V0cHV0IGFwcGVuZGVkIHRvIGZpbGUnLCB7IHBhdGg6IHNhZmVQYXRoLCBmb3JtYXQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2FmZVBhdGgsIGNvbnRlbnQsICd1dGYtOCcpO1xuICAgICAgY29uc3Qgc3RhdHMgPSBmcy5zdGF0U3luYyhzYWZlUGF0aCk7XG4gICAgICBwcmludFN1Y2Nlc3MoJ091dHB1dCBzYXZlZCB0byBmaWxlJywgeyBwYXRoOiBzYWZlUGF0aCwgZm9ybWF0LCBzaXplOiBmb3JtYXRGaWxlU2l6ZShzdGF0cy5zaXplKSB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcHJpbnRFcnJvcignRmFpbGVkIHRvIHdyaXRlIGZpbGUnLCB7XG4gICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgfSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZU91dHB1dERpcmVjdG9yeShvdXRwdXRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGZzLmV4aXN0c1N5bmMob3V0cHV0UGF0aCkpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBmcy5ta2RpclN5bmMob3V0cHV0UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgcHJpbnREZWJ1ZygnRGlyZWN0b3J5IGNyZWF0ZWQnLCB7IHBhdGg6IG91dHB1dFBhdGggfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcHJpbnRFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBkaXJlY3RvcnknLCB7XG4gICAgICBwYXRoOiBvdXRwdXRQYXRoLFxuICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICB9KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsZUV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKTtcbn1cblxuLy8gLS0tIERpc3BsYXkgaGVscGVycyAtLS1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U2VjdGlvbih0aXRsZTogc3RyaW5nLCBzdWJ0aXRsZT86IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCB3aWR0aCA9IHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnMgfHwgODA7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgY29uc29sZS5sb2coY3lhbign4pWQJy5yZXBlYXQod2lkdGgpKSk7XG4gIGNvbnNvbGUubG9nKGN5YW4oYm9sZCh0aXRsZSkpKTtcbiAgaWYgKHN1YnRpdGxlKSBjb25zb2xlLmxvZyhkaW0oc3VidGl0bGUpKTtcbiAgY29uc29sZS5sb2coY3lhbign4pWQJy5yZXBlYXQod2lkdGgpKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEtleVZhbHVlKFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgb3B0aW9uczogeyBpbmRlbnQ/OiBudW1iZXI7IHNlcGFyYXRvcj86IHN0cmluZyB9ID0ge30sXG4pOiB2b2lkIHtcbiAgY29uc3QgeyBpbmRlbnQgPSAwLCBzZXBhcmF0b3IgPSAn4pSCJyB9ID0gb3B0aW9ucztcbiAgY29uc3QgbWF4S2V5TGVuZ3RoID0gTWF0aC5tYXgoLi4uT2JqZWN0LmtleXMoZGF0YSkubWFwKGsgPT4gay5sZW5ndGgpKTtcbiAgY29uc3QgaW5kZW50U3RyID0gJyAnLnJlcGVhdChpbmRlbnQpO1xuXG4gIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IHBhZGRlZEtleSA9IGtleS5wYWRFbmQobWF4S2V5TGVuZ3RoKTtcbiAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGxcbiAgICAgID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpIDogU3RyaW5nKHZhbHVlKTtcbiAgICBjb25zb2xlLmxvZyhgJHtpbmRlbnRTdHJ9JHtkaW0ocGFkZGVkS2V5KX0gJHtjeWFuKHNlcGFyYXRvcil9ICR7d2hpdGUoZm9ybWF0dGVkVmFsdWUpfWApO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50RGl2aWRlcihjaGFyOiBzdHJpbmcgPSAn4pSAJywgd2lkdGg/OiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3QgZWZmZWN0aXZlV2lkdGggPSB3aWR0aCB8fCBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zIHx8IDgwO1xuICBjb25zb2xlLmxvZyhkaW0oY2hhci5yZXBlYXQoZWZmZWN0aXZlV2lkdGgpKSk7XG59XG5cbi8vIC0tLSBSZXNwb25zZSBwYXJzaW5nIC0tLVxuXG4vKipcbiAqIFVud3JhcCBhIHNlbmRTdWNjZXNzIEFQSSBlbnZlbG9wZTogeyBzdWNjZXNzLCBzdGF0dXNDb2RlLCBkYXRhOiB7IC4uLiB9IH1cbiAqIFJldHVybnMgdGhlIGlubmVyIGBkYXRhYCBvYmplY3QsIG9yIHRoZSBvcmlnaW5hbCByZXNwb25zZSBpZiBub3Qgd3JhcHBlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVud3JhcEVudmVsb3BlKHJlc3BvbnNlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAocmVzcG9uc2UgJiYgdHlwZW9mIHJlc3BvbnNlID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IG9iaiA9IHJlc3BvbnNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmICgnc3VjY2VzcycgaW4gb2JqICYmICdkYXRhJyBpbiBvYmogJiYgb2JqLmRhdGEgJiYgdHlwZW9mIG9iai5kYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIG9iai5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIHJldHVybiB7fTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IGEgc2luZ2xlIGVudGl0eSBmcm9tIGFuIEFQSSByZXNwb25zZSwgaGFuZGxpbmcgZW52ZWxvcGUgZm9ybWF0cy5cbiAqIFRyaWVzOiBwYXlsb2FkW2VudGl0eUtleV0sIHBheWxvYWQgZGlyZWN0bHkgKGlmIGlkZW50aWZpZXJLZXkgZXhpc3RzKSwgb3IgdW5kZWZpbmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFNpbmdsZVJlc3BvbnNlPFQ+KHJlc3BvbnNlOiB1bmtub3duLCBlbnRpdHlLZXk6IHN0cmluZywgaWRlbnRpZmllcktleTogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBheWxvYWQgPSB1bndyYXBFbnZlbG9wZShyZXNwb25zZSk7XG4gIC8vIERpcmVjdCBlbnRpdHk6IHBheWxvYWQgaGFzIHRoZSBpZGVudGlmaWVyIChlLmcuIHBheWxvYWQuaWQsIHBheWxvYWQucHJvcHMsIHBheWxvYWQubmFtZSlcbiAgaWYgKGlkZW50aWZpZXJLZXkgaW4gcGF5bG9hZCkgcmV0dXJuIHBheWxvYWQgYXMgdW5rbm93biBhcyBUO1xuICAvLyBOZXN0ZWQgdW5kZXIgZW50aXR5IGtleTogcGF5bG9hZC5waXBlbGluZSwgcGF5bG9hZC5wbHVnaW5cbiAgY29uc3QgbmVzdGVkID0gcGF5bG9hZFtlbnRpdHlLZXldIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBpZiAobmVzdGVkICYmIHR5cGVvZiBuZXN0ZWQgPT09ICdvYmplY3QnICYmIGlkZW50aWZpZXJLZXkgaW4gbmVzdGVkKSByZXR1cm4gbmVzdGVkIGFzIHVua25vd24gYXMgVDtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0UmVzcG9uc2VSZXN1bHQ8VD4ge1xuICBpdGVtczogVFtdO1xuICB0b3RhbD86IG51bWJlcjtcbiAgaGFzTW9yZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IGl0ZW1zIGZyb20gYW4gQVBJIGxpc3QgcmVzcG9uc2UsIGhhbmRsaW5nIG11bHRpcGxlIHJlc3BvbnNlIGZvcm1hdHMuXG4gKiBTdXBwb3J0czogYHsgPGtleT46IFRbXSB9YCwgYHsgaXRlbXM6IFRbXSB9YCwgYFRbXWAsIG9yIGludmFsaWQgZm9ybWF0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RMaXN0UmVzcG9uc2U8VD4ocmVzcG9uc2U6IHVua25vd24sIGl0ZW1zS2V5OiBzdHJpbmcpOiBMaXN0UmVzcG9uc2VSZXN1bHQ8VD4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZSkpIHtcbiAgICByZXR1cm4geyBpdGVtczogcmVzcG9uc2UsIHRvdGFsOiB1bmRlZmluZWQsIGhhc01vcmU6IGZhbHNlIH07XG4gIH1cblxuICBpZiAocmVzcG9uc2UgJiYgdHlwZW9mIHJlc3BvbnNlID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IG9iaiA9IHVud3JhcEVudmVsb3BlKHJlc3BvbnNlKTtcblxuICAgIC8vIEV4dHJhY3QgcGFnaW5hdGlvbiBtZXRhZGF0YSBpZiBwcmVzZW50XG4gICAgY29uc3QgcGFnaW5hdGlvbiA9IG9iai5wYWdpbmF0aW9uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRvdGFsID0gKHBhZ2luYXRpb24/LnRvdGFsID8/IG9iai50b3RhbCkgYXMgbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGhhc01vcmUgPSAoKHBhZ2luYXRpb24/Lmhhc01vcmUgPz8gb2JqLmhhc01vcmUpIGFzIGJvb2xlYW4pIHx8IGZhbHNlO1xuXG4gICAgLy8gVHJ5IHByaW1hcnkga2V5IChlLmcuICdwaXBlbGluZXMnLCAncGx1Z2lucycpXG4gICAgaWYgKGl0ZW1zS2V5IGluIG9iaiAmJiBBcnJheS5pc0FycmF5KG9ialtpdGVtc0tleV0pKSB7XG4gICAgICByZXR1cm4geyBpdGVtczogb2JqW2l0ZW1zS2V5XSBhcyBUW10sIHRvdGFsLCBoYXNNb3JlIH07XG4gICAgfVxuXG4gICAgLy8gVHJ5IGdlbmVyaWMgJ2l0ZW1zJyBrZXlcbiAgICBpZiAoJ2l0ZW1zJyBpbiBvYmogJiYgQXJyYXkuaXNBcnJheShvYmouaXRlbXMpKSB7XG4gICAgICByZXR1cm4geyBpdGVtczogb2JqLml0ZW1zIGFzIFRbXSwgdG90YWwsIGhhc01vcmUgfTtcbiAgICB9XG5cbiAgICBwcmludFdhcm5pbmcoJ1VuZXhwZWN0ZWQgcmVzcG9uc2UgZm9ybWF0LCBhdHRlbXB0aW5nIHRvIGhhbmRsZScpO1xuICAgIHJldHVybiB7IGl0ZW1zOiBbXSwgdG90YWw6IHVuZGVmaW5lZCwgaGFzTW9yZTogZmFsc2UgfTtcbiAgfVxuXG4gIHByaW50RXJyb3IoJ0ludmFsaWQgcmVzcG9uc2UgZm9ybWF0IGZyb20gQVBJJyk7XG4gIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBBUEkgcmVzcG9uc2UgZm9ybWF0Jyk7XG59XG4iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/plugin-resolver.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"plugin-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/plugin-resolver.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAoD5C;;;;;;;;;;;;;GAaG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA8BlC"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
3
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const output_utils_1 = require("./output-utils");
|
|
3
|
+
import { ApiClient } from './api-client.js';
|
|
4
|
+
import { printWarning } from './output-utils.js';
|
|
7
5
|
/**
|
|
8
6
|
* Cache key matching `PluginLookup.normalize()`: explicit alias when set,
|
|
9
7
|
* otherwise `${name}-alias`. Must stay in sync with the consumers in
|
|
@@ -57,7 +55,7 @@ function collectPluginRefs(props) {
|
|
|
57
55
|
*
|
|
58
56
|
* Keyed by `alias || name` to match `PluginLookup.plugin()`.
|
|
59
57
|
*/
|
|
60
|
-
async function resolvePluginsForProps(client, props) {
|
|
58
|
+
export async function resolvePluginsForProps(client, props) {
|
|
61
59
|
const refs = collectPluginRefs(props);
|
|
62
60
|
if (refs.length === 0)
|
|
63
61
|
return {};
|
|
@@ -78,14 +76,14 @@ async function resolvePluginsForProps(client, props) {
|
|
|
78
76
|
resolved[key] = plugin;
|
|
79
77
|
}
|
|
80
78
|
else {
|
|
81
|
-
|
|
79
|
+
printWarning(`Plugin "${ref.name}" lookup returned no record — falling back to deploy-time resolution`);
|
|
82
80
|
}
|
|
83
81
|
}
|
|
84
82
|
catch (err) {
|
|
85
83
|
const msg = err instanceof Error ? err.message : String(err);
|
|
86
|
-
|
|
84
|
+
printWarning(`Plugin "${ref.name}" pre-resolution failed (${msg}) — falling back to deploy-time resolution`);
|
|
87
85
|
}
|
|
88
86
|
}));
|
|
89
87
|
return resolved;
|
|
90
88
|
}
|
|
91
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BsdWdpbi1yZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFTakQ7Ozs7R0FJRztBQUNILFNBQVMsUUFBUSxDQUFDLEdBQWM7SUFDOUIsT0FBTyxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDO0FBQzFDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBOEI7SUFDdkQsTUFBTSxJQUFJLEdBQWdCLEVBQUUsQ0FBQztJQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRS9CLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBWSxFQUFRLEVBQUU7UUFDbEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1lBQUUsT0FBTztRQUM1QyxNQUFNLENBQUMsR0FBRyxHQUFnQixDQUFDO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUFFLE9BQU87UUFDcEIsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPO1FBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBRUYsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQXlDLENBQUM7SUFDOUQsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUVwQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBb0UsQ0FBQztJQUMxRixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNqQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHNCQUFzQixDQUMxQyxNQUFpQixFQUNqQixLQUE4QjtJQUU5QixNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBRWpDLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEYsTUFBTSxRQUFRLEdBQTRCLEVBQUUsQ0FBQztJQUU3QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDdkMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQVUscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzFFLHVFQUF1RTtZQUN2RSw4REFBOEQ7WUFDOUQsNkRBQTZEO1lBQzdELE1BQU0sTUFBTSxHQUFJLEdBQTRCLENBQUMsTUFBTTttQkFDN0MsR0FBMEIsQ0FBQyxJQUFJO21CQUNoQyxHQUFHLENBQUM7WUFDVCxJQUFJLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUssTUFBNEIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDL0UsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUN6QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sWUFBWSxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksc0VBQXNFLENBQUMsQ0FBQztZQUMxRyxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLEdBQUcsR0FBRyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0QsWUFBWSxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksNEJBQTRCLEdBQUcsNENBQTRDLENBQUMsQ0FBQztRQUMvRyxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVKLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgQXBpQ2xpZW50IH0gZnJvbSAnLi9hcGktY2xpZW50LmpzJztcbmltcG9ydCB7IHByaW50V2FybmluZyB9IGZyb20gJy4vb3V0cHV0LXV0aWxzLmpzJztcblxuLyoqIE1pbmltYWwgcGx1Z2luIHJlZmVyZW5jZSBzaGFwZSDigJQgbWF0Y2hlcyBQbHVnaW5PcHRpb25zIGZyb20gcGlwZWxpbmUtY29yZS4gKi9cbmludGVyZmFjZSBQbHVnaW5SZWYge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFsaWFzPzogc3RyaW5nO1xuICBmaWx0ZXI/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBDYWNoZSBrZXkgbWF0Y2hpbmcgYFBsdWdpbkxvb2t1cC5ub3JtYWxpemUoKWA6IGV4cGxpY2l0IGFsaWFzIHdoZW4gc2V0LFxuICogb3RoZXJ3aXNlIGAke25hbWV9LWFsaWFzYC4gTXVzdCBzdGF5IGluIHN5bmMgd2l0aCB0aGUgY29uc3VtZXJzIGluXG4gKiBwaXBlbGluZS1jb3JlL3BsdWdpbi1sb29rdXAudHMgYW5kIHBpcGVsaW5lLWJ1aWxkZXIudHMgdGhhdCByZWFkIHRoaXMgbWFwLlxuICovXG5mdW5jdGlvbiBjYWNoZUtleShyZWY6IFBsdWdpblJlZik6IHN0cmluZyB7XG4gIHJldHVybiByZWYuYWxpYXMgfHwgYCR7cmVmLm5hbWV9LWFsaWFzYDtcbn1cblxuLyoqXG4gKiBXYWxrIHRoZSBwaXBlbGluZSBwcm9wcyB0cmVlIHRvIGNvbGxlY3QgZXZlcnkgcGx1Z2luIHJlZmVyZW5jZS4gUGx1Z2luc1xuICogYXBwZWFyIGF0IGBzeW50aC5wbHVnaW5gIGFuZCBhdCBgc3RhZ2VzW10uc3RlcHNbXS5wbHVnaW5gLiBFbnRyaWVzIGFyZVxuICogZGUtZHVwbGljYXRlZCBieSBgY2FjaGVLZXkoKWAg4oCUIHRoZSBzYW1lIGtleSBgUGx1Z2luTG9va3VwLnBsdWdpbigpYCB1c2VzLFxuICogc28gdGhlIHJlc29sdmVkLXBsdWdpbnMgbWFwIGxvb2t1cHMgbWF0Y2ggZG93bnN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFBsdWdpblJlZnMocHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUGx1Z2luUmVmW10ge1xuICBjb25zdCByZWZzOiBQbHVnaW5SZWZbXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3QgcHVzaCA9IChyYXc6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuICAgIGNvbnN0IHIgPSByYXcgYXMgUGx1Z2luUmVmO1xuICAgIGlmICghci5uYW1lKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gY2FjaGVLZXkocik7XG4gICAgaWYgKHNlZW4uaGFzKGtleSkpIHJldHVybjtcbiAgICBzZWVuLmFkZChrZXkpO1xuICAgIHJlZnMucHVzaChyKTtcbiAgfTtcblxuICBjb25zdCBzeW50aCA9IHByb3BzLnN5bnRoIGFzIHsgcGx1Z2luPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICBwdXNoKHN5bnRoPy5wbHVnaW4pO1xuXG4gIGNvbnN0IHN0YWdlcyA9IHByb3BzLnN0YWdlcyBhcyBBcnJheTx7IHN0ZXBzPzogQXJyYXk8eyBwbHVnaW4/OiB1bmtub3duIH0+IH0+IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHN0YWdlIG9mIHN0YWdlcyA/PyBbXSkge1xuICAgIGZvciAoY29uc3Qgc3RlcCBvZiBzdGFnZS5zdGVwcyA/PyBbXSkge1xuICAgICAgcHVzaChzdGVwLnBsdWdpbik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlZnM7XG59XG5cbi8qKlxuICogUHJlLXJlc29sdmUgcGx1Z2lucyBieSBjYWxsaW5nIHRoZSBzYW1lIGBQT1NUIC9hcGkvcGx1Z2lucy9sb29rdXBgIGVuZHBvaW50XG4gKiB0aGUgZGVwbG95LXRpbWUgY3VzdG9tIHJlc291cmNlIExhbWJkYSB1c2VzLiBSZXR1cm5pbmcgdGhlIGZ1bGwgUGx1Z2luXG4gKiByZWNvcmQgYXQgc3ludGggdGltZSBpcyB3aGF0IGFsbG93cyB0aGUgcmVzdWx0aW5nIENGTiB0ZW1wbGF0ZSB0byBzaGlwXG4gKiB3aXRoIHJlYWwgQ29kZUJ1aWxkIGltYWdlIFVSSXMgKGA8aG9zdD4vPG5zPi88bmFtZT46PHZlcnNpb24+YCkgcmF0aGVyIHRoYW5cbiAqIHRoZSBgYXdzL2NvZGVidWlsZC9zdGFuZGFyZDo3LjBgIGZhbGxiYWNrIHRoYXQgdGhlIHN5bnRoLXRpbWUgdG9rZW4gcGF0aFxuICogZm9yY2VzLlxuICpcbiAqIEZhaWx1cmVzIGFyZSBub24tZmF0YWw6IGEgbWlzc2luZyBwbHVnaW4gb3IgdW5yZWFjaGFibGUgQVBJIGxvZ3MgYSB3YXJuaW5nXG4gKiBhbmQgZmFsbHMgdGhyb3VnaCB0byB0aGUgZGVwbG95LXRpbWUgY3VzdG9tIHJlc291cmNlIHBhdGggc28gcGFydGlhbFxuICogcGxhdGZvcm0gb3V0YWdlcyBkb24ndCBibG9jayBzeW50aC9kZXBsb3kuXG4gKlxuICogS2V5ZWQgYnkgYGFsaWFzIHx8IG5hbWVgIHRvIG1hdGNoIGBQbHVnaW5Mb29rdXAucGx1Z2luKClgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVBsdWdpbnNGb3JQcm9wcyhcbiAgY2xpZW50OiBBcGlDbGllbnQsXG4gIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgcmVmcyA9IGNvbGxlY3RQbHVnaW5SZWZzKHByb3BzKTtcbiAgaWYgKHJlZnMubGVuZ3RoID09PSAwKSByZXR1cm4ge307XG5cbiAgY29uc3QgZGVmYXVsdEZpbHRlciA9IChuYW1lOiBzdHJpbmcpID0+ICh7IG5hbWUsIGlzQWN0aXZlOiB0cnVlLCBpc0RlZmF1bHQ6IHRydWUgfSk7XG4gIGNvbnN0IHJlc29sdmVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKHJlZnMubWFwKGFzeW5jIChyZWYpID0+IHtcbiAgICBjb25zdCBrZXkgPSBjYWNoZUtleShyZWYpO1xuICAgIGNvbnN0IGZpbHRlciA9IHJlZi5maWx0ZXIgPz8gZGVmYXVsdEZpbHRlcihyZWYubmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5wb3N0PHVua25vd24+KCcvYXBpL3BsdWdpbnMvbG9va3VwJywgeyBmaWx0ZXIgfSk7XG4gICAgICAvLyBMYW1iZGEncyBoYW5kbGVyIGNhbGxzIGBhcGkucG9zdDxQbHVnaW4+KC4uLilgIGFuZCBjb25zdW1lcyB0aGUgYm9keVxuICAgICAgLy8gZGlyZWN0bHk7IHRoZSBwbGF0Zm9ybSBtYXkgd3JhcCBpdCBhcyBgeyBkYXRhOiBQbHVnaW4gfWAgb3JcbiAgICAgIC8vIGB7IHBsdWdpbjogUGx1Z2luIH1gIGRlcGVuZGluZyBvbiB0aGUgcmVzcG9uc2UgbWlkZGxld2FyZS5cbiAgICAgIGNvbnN0IHBsdWdpbiA9IChyZXMgYXMgeyBwbHVnaW4/OiB1bmtub3duIH0pLnBsdWdpblxuICAgICAgICA/PyAocmVzIGFzIHsgZGF0YT86IHVua25vd24gfSkuZGF0YVxuICAgICAgICA/PyByZXM7XG4gICAgICBpZiAocGx1Z2luICYmIHR5cGVvZiBwbHVnaW4gPT09ICdvYmplY3QnICYmIChwbHVnaW4gYXMgeyBuYW1lPzogc3RyaW5nIH0pLm5hbWUpIHtcbiAgICAgICAgcmVzb2x2ZWRba2V5XSA9IHBsdWdpbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByaW50V2FybmluZyhgUGx1Z2luIFwiJHtyZWYubmFtZX1cIiBsb29rdXAgcmV0dXJuZWQgbm8gcmVjb3JkIOKAlCBmYWxsaW5nIGJhY2sgdG8gZGVwbG95LXRpbWUgcmVzb2x1dGlvbmApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgcHJpbnRXYXJuaW5nKGBQbHVnaW4gXCIke3JlZi5uYW1lfVwiIHByZS1yZXNvbHV0aW9uIGZhaWxlZCAoJHttc2d9KSDigJQgZmFsbGluZyBiYWNrIHRvIGRlcGxveS10aW1lIHJlc29sdXRpb25gKTtcbiAgICB9XG4gIH0pKTtcblxuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG4iXX0=
|
|
@@ -1,28 +1,20 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
3
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.checkAuthRateLimit = checkAuthRateLimit;
|
|
9
|
-
exports.recordAuthSuccess = recordAuthSuccess;
|
|
10
|
-
exports.recordAuthFailure = recordAuthFailure;
|
|
11
|
-
const fs_1 = __importDefault(require("fs"));
|
|
12
|
-
const os_1 = __importDefault(require("os"));
|
|
13
|
-
const path_1 = __importDefault(require("path"));
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import os from 'os';
|
|
5
|
+
import path from 'path';
|
|
14
6
|
/**
|
|
15
7
|
* Simple file-based rate limiter for auth operations.
|
|
16
8
|
* Tracks failed attempts and enforces a cooldown period after too many failures.
|
|
17
9
|
* State is persisted in a temp file so it survives across CLI invocations.
|
|
18
10
|
*/
|
|
19
|
-
const STATE_FILE =
|
|
11
|
+
const STATE_FILE = path.join(os.tmpdir(), '.pipeline-manager-auth-state.json');
|
|
20
12
|
const MAX_FAILURES = 5;
|
|
21
13
|
const COOLDOWN_MS = 60_000; // 1 minute
|
|
22
14
|
function readState() {
|
|
23
15
|
try {
|
|
24
|
-
if (
|
|
25
|
-
return JSON.parse(
|
|
16
|
+
if (fs.existsSync(STATE_FILE)) {
|
|
17
|
+
return JSON.parse(fs.readFileSync(STATE_FILE, 'utf-8'));
|
|
26
18
|
}
|
|
27
19
|
}
|
|
28
20
|
catch { /* ignore corrupt state */ }
|
|
@@ -30,7 +22,7 @@ function readState() {
|
|
|
30
22
|
}
|
|
31
23
|
function writeState(state) {
|
|
32
24
|
try {
|
|
33
|
-
|
|
25
|
+
fs.writeFileSync(STATE_FILE, JSON.stringify(state), { mode: 0o600 });
|
|
34
26
|
}
|
|
35
27
|
catch { /* best-effort */ }
|
|
36
28
|
}
|
|
@@ -38,7 +30,7 @@ function writeState(state) {
|
|
|
38
30
|
* Check if auth attempts are currently rate-limited.
|
|
39
31
|
* @returns null if allowed, or a message string if blocked.
|
|
40
32
|
*/
|
|
41
|
-
function checkAuthRateLimit() {
|
|
33
|
+
export function checkAuthRateLimit() {
|
|
42
34
|
const state = readState();
|
|
43
35
|
const now = Date.now();
|
|
44
36
|
if (state.lockedUntil > now) {
|
|
@@ -54,13 +46,13 @@ function checkAuthRateLimit() {
|
|
|
54
46
|
/**
|
|
55
47
|
* Record a successful auth — resets the failure counter.
|
|
56
48
|
*/
|
|
57
|
-
function recordAuthSuccess() {
|
|
49
|
+
export function recordAuthSuccess() {
|
|
58
50
|
writeState({ failures: 0, lastFailure: 0, lockedUntil: 0 });
|
|
59
51
|
}
|
|
60
52
|
/**
|
|
61
53
|
* Record a failed auth attempt. After MAX_FAILURES, locks out for COOLDOWN_MS.
|
|
62
54
|
*/
|
|
63
|
-
function recordAuthFailure() {
|
|
55
|
+
export function recordAuthFailure() {
|
|
64
56
|
const state = readState();
|
|
65
57
|
const now = Date.now();
|
|
66
58
|
state.failures += 1;
|
|
@@ -70,4 +62,4 @@ function recordAuthFailure() {
|
|
|
70
62
|
}
|
|
71
63
|
writeState(state);
|
|
72
64
|
}
|
|
73
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZS1saW1pdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3JhdGUtbGltaXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRXhCOzs7O0dBSUc7QUFFSCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO0FBQy9FLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQztBQUN2QixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxXQUFXO0FBUXZDLFNBQVMsU0FBUztJQUNoQixJQUFJLENBQUM7UUFDSCxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQWMsQ0FBQztRQUN2RSxDQUFDO0lBQ0gsQ0FBQztJQUFDLE1BQU0sQ0FBQyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDdEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDekQsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLEtBQWdCO0lBQ2xDLElBQUksQ0FBQztRQUNILEVBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQUMsTUFBTSxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQjtJQUNoQyxNQUFNLEtBQUssR0FBRyxTQUFTLEVBQUUsQ0FBQztJQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFdkIsSUFBSSxLQUFLLENBQUMsV0FBVyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzVELE9BQU8sZ0RBQWdELE9BQU8sSUFBSSxDQUFDO0lBQ3JFLENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLFdBQVcsR0FBRyxXQUFXLEVBQUUsQ0FBQztRQUMxQyxVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQjtJQUMvQixVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQjtJQUMvQixNQUFNLEtBQUssR0FBRyxTQUFTLEVBQUUsQ0FBQztJQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDdkIsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUM7SUFDcEIsS0FBSyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7SUFFeEIsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ25DLEtBQUssQ0FBQyxXQUFXLEdBQUcsR0FBRyxHQUFHLFdBQVcsQ0FBQztJQUN4QyxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuLyoqXG4gKiBTaW1wbGUgZmlsZS1iYXNlZCByYXRlIGxpbWl0ZXIgZm9yIGF1dGggb3BlcmF0aW9ucy5cbiAqIFRyYWNrcyBmYWlsZWQgYXR0ZW1wdHMgYW5kIGVuZm9yY2VzIGEgY29vbGRvd24gcGVyaW9kIGFmdGVyIHRvbyBtYW55IGZhaWx1cmVzLlxuICogU3RhdGUgaXMgcGVyc2lzdGVkIGluIGEgdGVtcCBmaWxlIHNvIGl0IHN1cnZpdmVzIGFjcm9zcyBDTEkgaW52b2NhdGlvbnMuXG4gKi9cblxuY29uc3QgU1RBVEVfRklMRSA9IHBhdGguam9pbihvcy50bXBkaXIoKSwgJy5waXBlbGluZS1tYW5hZ2VyLWF1dGgtc3RhdGUuanNvbicpO1xuY29uc3QgTUFYX0ZBSUxVUkVTID0gNTtcbmNvbnN0IENPT0xET1dOX01TID0gNjBfMDAwOyAvLyAxIG1pbnV0ZVxuXG5pbnRlcmZhY2UgQXV0aFN0YXRlIHtcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgbGFzdEZhaWx1cmU6IG51bWJlcjtcbiAgbG9ja2VkVW50aWw6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gcmVhZFN0YXRlKCk6IEF1dGhTdGF0ZSB7XG4gIHRyeSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoU1RBVEVfRklMRSkpIHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhTVEFURV9GSUxFLCAndXRmLTgnKSkgYXMgQXV0aFN0YXRlO1xuICAgIH1cbiAgfSBjYXRjaCB7IC8qIGlnbm9yZSBjb3JydXB0IHN0YXRlICovIH1cbiAgcmV0dXJuIHsgZmFpbHVyZXM6IDAsIGxhc3RGYWlsdXJlOiAwLCBsb2NrZWRVbnRpbDogMCB9O1xufVxuXG5mdW5jdGlvbiB3cml0ZVN0YXRlKHN0YXRlOiBBdXRoU3RhdGUpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKFNUQVRFX0ZJTEUsIEpTT04uc3RyaW5naWZ5KHN0YXRlKSwgeyBtb2RlOiAwbzYwMCB9KTtcbiAgfSBjYXRjaCB7IC8qIGJlc3QtZWZmb3J0ICovIH1cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhdXRoIGF0dGVtcHRzIGFyZSBjdXJyZW50bHkgcmF0ZS1saW1pdGVkLlxuICogQHJldHVybnMgbnVsbCBpZiBhbGxvd2VkLCBvciBhIG1lc3NhZ2Ugc3RyaW5nIGlmIGJsb2NrZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0F1dGhSYXRlTGltaXQoKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHN0YXRlID0gcmVhZFN0YXRlKCk7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgaWYgKHN0YXRlLmxvY2tlZFVudGlsID4gbm93KSB7XG4gICAgY29uc3Qgd2FpdFNlYyA9IE1hdGguY2VpbCgoc3RhdGUubG9ja2VkVW50aWwgLSBub3cpIC8gMTAwMCk7XG4gICAgcmV0dXJuIGBUb28gbWFueSBmYWlsZWQgbG9naW4gYXR0ZW1wdHMuIFRyeSBhZ2FpbiBpbiAke3dhaXRTZWN9cy5gO1xuICB9XG5cbiAgLy8gUmVzZXQgaWYgY29vbGRvd24gaGFzIHBhc3NlZFxuICBpZiAobm93IC0gc3RhdGUubGFzdEZhaWx1cmUgPiBDT09MRE9XTl9NUykge1xuICAgIHdyaXRlU3RhdGUoeyBmYWlsdXJlczogMCwgbGFzdEZhaWx1cmU6IDAsIGxvY2tlZFVudGlsOiAwIH0pO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmVjb3JkIGEgc3VjY2Vzc2Z1bCBhdXRoIOKAlCByZXNldHMgdGhlIGZhaWx1cmUgY291bnRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEF1dGhTdWNjZXNzKCk6IHZvaWQge1xuICB3cml0ZVN0YXRlKHsgZmFpbHVyZXM6IDAsIGxhc3RGYWlsdXJlOiAwLCBsb2NrZWRVbnRpbDogMCB9KTtcbn1cblxuLyoqXG4gKiBSZWNvcmQgYSBmYWlsZWQgYXV0aCBhdHRlbXB0LiBBZnRlciBNQVhfRkFJTFVSRVMsIGxvY2tzIG91dCBmb3IgQ09PTERPV05fTVMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBdXRoRmFpbHVyZSgpOiB2b2lkIHtcbiAgY29uc3Qgc3RhdGUgPSByZWFkU3RhdGUoKTtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgc3RhdGUuZmFpbHVyZXMgKz0gMTtcbiAgc3RhdGUubGFzdEZhaWx1cmUgPSBub3c7XG5cbiAgaWYgKHN0YXRlLmZhaWx1cmVzID49IE1BWF9GQUlMVVJFUykge1xuICAgIHN0YXRlLmxvY2tlZFVudGlsID0gbm93ICsgQ09PTERPV05fTVM7XG4gIH1cblxuICB3cml0ZVN0YXRlKHN0YXRlKTtcbn1cbiJdfQ==
|