@cichol/logger 5.4.5 → 6.0.1
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/dists/index.js +38 -36
- package/package.json +9 -17
- package/dists/index.cjs +0 -558
- package/dists/index.d.cts +0 -208
package/dists/index.cjs
DELETED
|
@@ -1,558 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var _Object$fromEntries = require('core-js-pure/features/object/from-entries.js');
|
|
4
|
-
var _filterInstanceProperty = require('core-js-pure/features/instance/filter.js');
|
|
5
|
-
var _mapInstanceProperty = require('core-js-pure/features/instance/map.js');
|
|
6
|
-
var _trimInstanceProperty = require('core-js-pure/features/instance/trim.js');
|
|
7
|
-
var _Reflect$construct = require('core-js-pure/features/reflect/construct.js');
|
|
8
|
-
var http$1 = require('http');
|
|
9
|
-
var stream = require('stream');
|
|
10
|
-
var util = require('util');
|
|
11
|
-
var morgan = require('morgan');
|
|
12
|
-
var winston = require('winston');
|
|
13
|
-
var _findInstanceProperty = require('core-js-pure/features/instance/find.js');
|
|
14
|
-
var _Reflect$apply = require('core-js-pure/features/reflect/apply.js');
|
|
15
|
-
var chalk = require('chalk');
|
|
16
|
-
var rTracer = require('cls-rtracer');
|
|
17
|
-
var luxon = require('luxon');
|
|
18
|
-
var _Map = require('core-js-pure/features/map/index.js');
|
|
19
|
-
var process = require('process');
|
|
20
|
-
var _Symbol$for = require('core-js-pure/features/symbol/for.js');
|
|
21
|
-
var _indexOfInstanceProperty = require('core-js-pure/features/instance/index-of.js');
|
|
22
|
-
var _sliceInstanceProperty = require('core-js-pure/features/instance/slice.js');
|
|
23
|
-
var _startsWithInstanceProperty = require('core-js-pure/features/instance/starts-with.js');
|
|
24
|
-
var _includesInstanceProperty = require('core-js-pure/features/instance/includes.js');
|
|
25
|
-
var _lastIndexOfInstanceProperty = require('core-js-pure/features/instance/last-index-of.js');
|
|
26
|
-
var path = require('path');
|
|
27
|
-
var cliHighlight = require('cli-highlight');
|
|
28
|
-
var prettyBytes = require('pretty-bytes');
|
|
29
|
-
var prettyMs = require('pretty-ms');
|
|
30
|
-
var cluster = require('cluster');
|
|
31
|
-
require('worker_threads');
|
|
32
|
-
|
|
33
|
-
function _interopNamespaceDefault(e) {
|
|
34
|
-
var n = Object.create(null);
|
|
35
|
-
if (e) {
|
|
36
|
-
Object.keys(e).forEach(function (k) {
|
|
37
|
-
if (k !== 'default') {
|
|
38
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
39
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
40
|
-
enumerable: true,
|
|
41
|
-
get: function () { return e[k]; }
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
n.default = e;
|
|
47
|
-
return Object.freeze(n);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
var winston__namespace = /*#__PURE__*/_interopNamespaceDefault(winston);
|
|
51
|
-
|
|
52
|
-
const LoggingLevel = {
|
|
53
|
-
// Critical levels. (It will crash the process)
|
|
54
|
-
Fatal: 0,
|
|
55
|
-
Error: 1,
|
|
56
|
-
// Warning levels. (It just report warning information, not crash the process)
|
|
57
|
-
Warning: 2,
|
|
58
|
-
// Regular level and aliases.
|
|
59
|
-
Notice: 3,
|
|
60
|
-
Info: 3,
|
|
61
|
-
// Maybe sensitive levels. (In general, does not useful)
|
|
62
|
-
Http: 4,
|
|
63
|
-
Query: 4,
|
|
64
|
-
// Loud levels.
|
|
65
|
-
Verbose: 5,
|
|
66
|
-
Debug: 5
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
// Constants.
|
|
70
|
-
const colorizerMap = new _Map();
|
|
71
|
-
|
|
72
|
-
// Helpers.
|
|
73
|
-
function createScheme(options) {
|
|
74
|
-
const nextIndex = colorizerMap.size;
|
|
75
|
-
const colorizer = chalk.bgHex(options.background).hex(options.foreground);
|
|
76
|
-
colorizerMap.set(nextIndex, colorizer);
|
|
77
|
-
return nextIndex;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Color definitions.
|
|
81
|
-
const ColorValue = {
|
|
82
|
-
// Basic colors.
|
|
83
|
-
White: '#FFFFFF',
|
|
84
|
-
Gray: '#808080',
|
|
85
|
-
Black: '#000000',
|
|
86
|
-
// Specialized colors.
|
|
87
|
-
Critical: '#D63031',
|
|
88
|
-
Warning: '#FDCB6E',
|
|
89
|
-
Regular: '#0984E3',
|
|
90
|
-
Http: '#6AB04C',
|
|
91
|
-
Query: '#399AF3'
|
|
92
|
-
};
|
|
93
|
-
const ColorScheme = {
|
|
94
|
-
Critical: createScheme({
|
|
95
|
-
background: ColorValue.Critical,
|
|
96
|
-
foreground: ColorValue.Black
|
|
97
|
-
}),
|
|
98
|
-
Warning: createScheme({
|
|
99
|
-
background: ColorValue.Warning,
|
|
100
|
-
foreground: ColorValue.Black
|
|
101
|
-
}),
|
|
102
|
-
Regular: createScheme({
|
|
103
|
-
background: ColorValue.Regular,
|
|
104
|
-
foreground: ColorValue.White
|
|
105
|
-
}),
|
|
106
|
-
Http: createScheme({
|
|
107
|
-
background: ColorValue.Http,
|
|
108
|
-
foreground: ColorValue.Black
|
|
109
|
-
}),
|
|
110
|
-
Query: createScheme({
|
|
111
|
-
background: ColorValue.Query,
|
|
112
|
-
foreground: ColorValue.Black
|
|
113
|
-
}),
|
|
114
|
-
Loud: createScheme({
|
|
115
|
-
background: ColorValue.Black,
|
|
116
|
-
foreground: ColorValue.Gray
|
|
117
|
-
})
|
|
118
|
-
};
|
|
119
|
-
function getChalkOf(colorSet) {
|
|
120
|
-
return colorizerMap.get(colorSet) ?? chalk;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// Node.js built-in APIs.
|
|
124
|
-
|
|
125
|
-
// Constants.
|
|
126
|
-
const {
|
|
127
|
-
isTTY
|
|
128
|
-
} = process.stdout;
|
|
129
|
-
const isNotOnCLI = !isTTY;
|
|
130
|
-
function decorateLabel(label, scheme) {
|
|
131
|
-
if (isNotOnCLI) return label;
|
|
132
|
-
const chalk = getChalkOf(scheme);
|
|
133
|
-
const decoratedLabel = chalk.bold(` ${label} `);
|
|
134
|
-
return decoratedLabel;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// Type definitions.
|
|
138
|
-
|
|
139
|
-
// Constants.
|
|
140
|
-
const rootPath = process.cwd();
|
|
141
|
-
const conjunction = ` ${chalk.blue('──')} `;
|
|
142
|
-
const splat = _Symbol$for('splat');
|
|
143
|
-
|
|
144
|
-
// Handler metadata.
|
|
145
|
-
const name$8 = 'error';
|
|
146
|
-
const level$8 = LoggingLevel.Error;
|
|
147
|
-
const label$8 = decorateLabel('ERROR', ColorScheme.Critical);
|
|
148
|
-
function simplifyDataURI(dataURI) {
|
|
149
|
-
const [, actualContent] = dataURI.split(':');
|
|
150
|
-
const pivot = _indexOfInstanceProperty(actualContent).call(actualContent, ',') + 1;
|
|
151
|
-
const mimeIndicator = _sliceInstanceProperty(actualContent).call(actualContent, 0, pivot);
|
|
152
|
-
const contentPrefix = _sliceInstanceProperty(actualContent).call(actualContent, pivot, pivot + 4);
|
|
153
|
-
const contentSuffix = _sliceInstanceProperty(actualContent).call(actualContent, -4);
|
|
154
|
-
return `data:${mimeIndicator + contentPrefix}...${contentSuffix}`;
|
|
155
|
-
}
|
|
156
|
-
function isDataURI(filename) {
|
|
157
|
-
return _startsWithInstanceProperty(filename).call(filename, 'data:');
|
|
158
|
-
}
|
|
159
|
-
function isAbsoluteOrDataURI(filename) {
|
|
160
|
-
return path.isAbsolute(filename) || isDataURI(filename);
|
|
161
|
-
}
|
|
162
|
-
function mapLocationOfErrorThrown(filename) {
|
|
163
|
-
let target = path.relative(rootPath, filename);
|
|
164
|
-
if (isDataURI(filename)) {
|
|
165
|
-
target = chalk.gray(simplifyDataURI(filename));
|
|
166
|
-
} else if (_includesInstanceProperty(target).call(target, 'node_modules')) {
|
|
167
|
-
target = chalk.gray(_sliceInstanceProperty(target).call(target, _lastIndexOfInstanceProperty(target).call(target, 'node_modules'))).replace(/node_modules[\\/]((?:@[^\\/]+[\\/])?[^\\/]+)(.*)/, (_, moduleName, trailing) => `node_modules${path.sep}${chalk.bold.underline(moduleName)}${chalk.gray(trailing)}`);
|
|
168
|
-
} else {
|
|
169
|
-
target = `${chalk.gray(path.dirname(target) + path.sep)}${chalk.bold.underline(path.basename(target))}`;
|
|
170
|
-
}
|
|
171
|
-
return target;
|
|
172
|
-
}
|
|
173
|
-
function handle$1(data) {
|
|
174
|
-
var _context, _context2, _context3;
|
|
175
|
-
const {
|
|
176
|
-
[splat]: [error] = []
|
|
177
|
-
} = data;
|
|
178
|
-
if (!(error instanceof Error)) {
|
|
179
|
-
return undefined;
|
|
180
|
-
}
|
|
181
|
-
const {
|
|
182
|
-
name: errorName,
|
|
183
|
-
message,
|
|
184
|
-
stack: rawStack = ''
|
|
185
|
-
} = error;
|
|
186
|
-
const stack = _mapInstanceProperty(_context = _mapInstanceProperty(_context2 = _mapInstanceProperty(_context3 = _sliceInstanceProperty(rawStack).call(rawStack, errorName.length + message.length + 3).split('\n')).call(_context3, line => line.replace(/^\s+at /g, ''))).call(_context2, line => isAbsoluteOrDataURI(line) ? `<anonymous>${conjunction}${mapLocationOfErrorThrown(line)}` : line)).call(_context, line => line.replace(/^(.+) \((.+)\)$/, (_, contextName, rawLocation) => {
|
|
187
|
-
let location = '';
|
|
188
|
-
switch (true) {
|
|
189
|
-
case rawLocation === '<anonymous>':
|
|
190
|
-
{
|
|
191
|
-
location = chalk.gray(rawLocation);
|
|
192
|
-
break;
|
|
193
|
-
}
|
|
194
|
-
case isDataURI(rawLocation):
|
|
195
|
-
{
|
|
196
|
-
location = chalk.gray(simplifyDataURI(rawLocation));
|
|
197
|
-
break;
|
|
198
|
-
}
|
|
199
|
-
case _startsWithInstanceProperty(rawLocation).call(rawLocation, 'node:'):
|
|
200
|
-
{
|
|
201
|
-
const [filename, occurredLine] = _sliceInstanceProperty(rawLocation).call(rawLocation, 5).split(':');
|
|
202
|
-
location = chalk.gray(`https://github.com/${chalk.bold.underline('nodejs')}/node/blob/${process.version}/lib/${filename}.js#L${occurredLine}`);
|
|
203
|
-
break;
|
|
204
|
-
}
|
|
205
|
-
default:
|
|
206
|
-
{
|
|
207
|
-
const [filename, occurredLine, occurredColumn] = rawLocation.split(':');
|
|
208
|
-
if (!path.isAbsolute(filename)) break;
|
|
209
|
-
const target = mapLocationOfErrorThrown(path.relative(rootPath, filename));
|
|
210
|
-
const trailing = chalk.gray(`:${occurredLine}:${occurredColumn}`);
|
|
211
|
-
location = target + trailing;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
return `${contextName}${conjunction}${location}`;
|
|
215
|
-
})).join('\n');
|
|
216
|
-
const decoratedLabel = decorateLabel(errorName, ColorScheme.Critical);
|
|
217
|
-
const payload = `${message}\n\n${stack}\n`;
|
|
218
|
-
return {
|
|
219
|
-
label: decoratedLabel,
|
|
220
|
-
payload
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
var ErrorHandler = /*#__PURE__*/Object.freeze({
|
|
225
|
-
__proto__: null,
|
|
226
|
-
default: handle$1,
|
|
227
|
-
label: label$8,
|
|
228
|
-
level: level$8,
|
|
229
|
-
name: name$8
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
// Local helpers.
|
|
233
|
-
|
|
234
|
-
// Handler metadata.
|
|
235
|
-
const name$7 = 'fatal';
|
|
236
|
-
const level$7 = LoggingLevel.Fatal;
|
|
237
|
-
const label$7 = decorateLabel('FATAL', ColorScheme.Critical);
|
|
238
|
-
// eslint-disable-line no-restricted-exports
|
|
239
|
-
|
|
240
|
-
var FatalHandler = /*#__PURE__*/Object.freeze({
|
|
241
|
-
__proto__: null,
|
|
242
|
-
default: handle$1,
|
|
243
|
-
label: label$7,
|
|
244
|
-
level: level$7,
|
|
245
|
-
name: name$7
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
// Local helpers.
|
|
249
|
-
|
|
250
|
-
// Handler metadata.
|
|
251
|
-
const name$6 = 'warning';
|
|
252
|
-
const level$6 = LoggingLevel.Warning;
|
|
253
|
-
const label$6 = decorateLabel('WARNING', ColorScheme.Warning);
|
|
254
|
-
var warning = null;
|
|
255
|
-
|
|
256
|
-
var WarningHandler = /*#__PURE__*/Object.freeze({
|
|
257
|
-
__proto__: null,
|
|
258
|
-
default: warning,
|
|
259
|
-
label: label$6,
|
|
260
|
-
level: level$6,
|
|
261
|
-
name: name$6
|
|
262
|
-
});
|
|
263
|
-
|
|
264
|
-
// Local helpers.
|
|
265
|
-
|
|
266
|
-
// Handler metadata.
|
|
267
|
-
const name$5 = 'notice';
|
|
268
|
-
const level$5 = LoggingLevel.Notice;
|
|
269
|
-
const label$5 = decorateLabel('NOTICE', ColorScheme.Regular);
|
|
270
|
-
var notice = null;
|
|
271
|
-
|
|
272
|
-
var NoticeHandler = /*#__PURE__*/Object.freeze({
|
|
273
|
-
__proto__: null,
|
|
274
|
-
default: notice,
|
|
275
|
-
label: label$5,
|
|
276
|
-
level: level$5,
|
|
277
|
-
name: name$5
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
// Local helpers.
|
|
281
|
-
|
|
282
|
-
// Handler metadata.
|
|
283
|
-
const name$4 = 'info';
|
|
284
|
-
const level$4 = LoggingLevel.Info;
|
|
285
|
-
const label$4 = decorateLabel('INFO', ColorScheme.Regular);
|
|
286
|
-
var info = null;
|
|
287
|
-
|
|
288
|
-
var InfoHandler = /*#__PURE__*/Object.freeze({
|
|
289
|
-
__proto__: null,
|
|
290
|
-
default: info,
|
|
291
|
-
label: label$4,
|
|
292
|
-
level: level$4,
|
|
293
|
-
name: name$4
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
// Local helpers.
|
|
297
|
-
|
|
298
|
-
// Handler metadata.
|
|
299
|
-
const name$3 = 'http';
|
|
300
|
-
const level$3 = LoggingLevel.Http;
|
|
301
|
-
const label$3 = decorateLabel('HTTP', ColorScheme.Http);
|
|
302
|
-
var http = null;
|
|
303
|
-
|
|
304
|
-
var HttpHandler = /*#__PURE__*/Object.freeze({
|
|
305
|
-
__proto__: null,
|
|
306
|
-
default: http,
|
|
307
|
-
label: label$3,
|
|
308
|
-
level: level$3,
|
|
309
|
-
name: name$3
|
|
310
|
-
});
|
|
311
|
-
|
|
312
|
-
// Highlight.js
|
|
313
|
-
|
|
314
|
-
// Type definitions.
|
|
315
|
-
|
|
316
|
-
// Handler metadata.
|
|
317
|
-
const name$2 = 'query';
|
|
318
|
-
const level$2 = LoggingLevel.Query;
|
|
319
|
-
const label$2 = decorateLabel('QUERY', ColorScheme.Query);
|
|
320
|
-
function handle(data) {
|
|
321
|
-
const payload = cliHighlight.highlight(data.message, {
|
|
322
|
-
language: 'sql'
|
|
323
|
-
});
|
|
324
|
-
return {
|
|
325
|
-
label: label$2,
|
|
326
|
-
payload
|
|
327
|
-
};
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
var QueryHandler = /*#__PURE__*/Object.freeze({
|
|
331
|
-
__proto__: null,
|
|
332
|
-
default: handle,
|
|
333
|
-
label: label$2,
|
|
334
|
-
level: level$2,
|
|
335
|
-
name: name$2
|
|
336
|
-
});
|
|
337
|
-
|
|
338
|
-
// Local helpers.
|
|
339
|
-
|
|
340
|
-
// Handler metadata.
|
|
341
|
-
const name$1 = 'verbose';
|
|
342
|
-
const level$1 = LoggingLevel.Verbose;
|
|
343
|
-
const label$1 = decorateLabel('VERBOSE', ColorScheme.Loud);
|
|
344
|
-
var verbose = null;
|
|
345
|
-
|
|
346
|
-
var VerboseHandler = /*#__PURE__*/Object.freeze({
|
|
347
|
-
__proto__: null,
|
|
348
|
-
default: verbose,
|
|
349
|
-
label: label$1,
|
|
350
|
-
level: level$1,
|
|
351
|
-
name: name$1
|
|
352
|
-
});
|
|
353
|
-
|
|
354
|
-
// Local helpers.
|
|
355
|
-
|
|
356
|
-
// Handler metadata.
|
|
357
|
-
const name = 'debug';
|
|
358
|
-
const level = LoggingLevel.Debug;
|
|
359
|
-
const label = decorateLabel('DEBUG', ColorScheme.Loud);
|
|
360
|
-
var debug = null;
|
|
361
|
-
|
|
362
|
-
var DebugHandler = /*#__PURE__*/Object.freeze({
|
|
363
|
-
__proto__: null,
|
|
364
|
-
default: debug,
|
|
365
|
-
label: label,
|
|
366
|
-
level: level,
|
|
367
|
-
name: name
|
|
368
|
-
});
|
|
369
|
-
|
|
370
|
-
// Handler implementations.
|
|
371
|
-
const handlers = [FatalHandler, ErrorHandler, WarningHandler, NoticeHandler, InfoHandler, HttpHandler, QueryHandler, VerboseHandler, DebugHandler];
|
|
372
|
-
|
|
373
|
-
var formatForCLI = winston.format.printf(data => {
|
|
374
|
-
const timestamp = chalk.gray(luxon.DateTime.now().toISO({
|
|
375
|
-
includeOffset: true
|
|
376
|
-
}));
|
|
377
|
-
const handler = _findInstanceProperty(handlers).call(handlers, ({
|
|
378
|
-
name
|
|
379
|
-
}) => name === data.level);
|
|
380
|
-
const fallback = {
|
|
381
|
-
label: handler?.label,
|
|
382
|
-
payload: data.message
|
|
383
|
-
};
|
|
384
|
-
const performHandle = handler?.default ?? (() => fallback);
|
|
385
|
-
|
|
386
|
-
// Execute handler and then, get decorated payload.
|
|
387
|
-
const {
|
|
388
|
-
label,
|
|
389
|
-
payload
|
|
390
|
-
} = _Reflect$apply(performHandle, undefined, [data]) ?? fallback;
|
|
391
|
-
let extraFingerprint;
|
|
392
|
-
if (handler?.level === LoggingLevel.Http) {
|
|
393
|
-
extraFingerprint = data.transactionId ? `(Transaction-ID = ${data.transactionId})` : `(Request-ID = ${rTracer.id()})`;
|
|
394
|
-
}
|
|
395
|
-
return `${label} ${timestamp}${extraFingerprint ? ` ${extraFingerprint}` : ''}\n${payload}`;
|
|
396
|
-
});
|
|
397
|
-
|
|
398
|
-
// Node.js built-in APIs.
|
|
399
|
-
|
|
400
|
-
// Type definitions.
|
|
401
|
-
const ExecutionMode = {
|
|
402
|
-
DevelopmentMode: 'development',
|
|
403
|
-
ProductionMode: 'production'
|
|
404
|
-
};
|
|
405
|
-
const ClusteringMode = {
|
|
406
|
-
MasterProcess: 0,
|
|
407
|
-
WorkerProcess: 1
|
|
408
|
-
};
|
|
409
|
-
// Exportings.
|
|
410
|
-
const executionMode = process.env.NODE_ENV ?? ExecutionMode.DevelopmentMode;
|
|
411
|
-
cluster.isPrimary ?? cluster.isMaster ? ClusteringMode.MasterProcess : ClusteringMode.WorkerProcess;
|
|
412
|
-
|
|
413
|
-
// Node.js built-in APIs.
|
|
414
|
-
|
|
415
|
-
// Type definitions.
|
|
416
|
-
|
|
417
|
-
// Helpers.
|
|
418
|
-
function decorateStatusCode(statusCode) {
|
|
419
|
-
const groupOfCode = Math.floor(Number(statusCode) / 100) * 100;
|
|
420
|
-
const baseMessage = `${statusCode} ${http$1.STATUS_CODES[statusCode]}`;
|
|
421
|
-
switch (groupOfCode) {
|
|
422
|
-
case 200:
|
|
423
|
-
{
|
|
424
|
-
return chalk.green(baseMessage);
|
|
425
|
-
}
|
|
426
|
-
case 300:
|
|
427
|
-
{
|
|
428
|
-
return chalk.magenta(baseMessage);
|
|
429
|
-
}
|
|
430
|
-
case 400:
|
|
431
|
-
case 500:
|
|
432
|
-
{
|
|
433
|
-
return chalk.red(baseMessage);
|
|
434
|
-
}
|
|
435
|
-
default:
|
|
436
|
-
{
|
|
437
|
-
return chalk.gray(baseMessage);
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
function formatForMorgan(tokens, request, response) {
|
|
442
|
-
function _(token, ...subArgs) {
|
|
443
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
444
|
-
return tokens[token](request, response, ...subArgs);
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
// Raw values.
|
|
448
|
-
const method = _('method');
|
|
449
|
-
const URL = _('url');
|
|
450
|
-
const httpVersion = `HTTP/${_('http-version')}`;
|
|
451
|
-
const statusCode = Number(_('status'));
|
|
452
|
-
const contentLength = Number(_('res', 'content-length') ?? -1);
|
|
453
|
-
const responseTime = Number(_('response-time') ?? -1);
|
|
454
|
-
|
|
455
|
-
// Decorated values.
|
|
456
|
-
const $method = chalk.bold(method);
|
|
457
|
-
const $version = chalk.rgb(98, 177, 255)(httpVersion);
|
|
458
|
-
const $statusCode = decorateStatusCode(statusCode);
|
|
459
|
-
const $contentLength = contentLength >= 0 ? prettyBytes(contentLength) : '? B';
|
|
460
|
-
const $responseTime = responseTime >= 0 ? prettyMs(responseTime) : '';
|
|
461
|
-
|
|
462
|
-
// Additional information.
|
|
463
|
-
const metadata = `(${$contentLength}, ${$responseTime})`;
|
|
464
|
-
return [`→ ${$method} ${URL} ${$version}`, `← ${$version} ${$statusCode} ${metadata}`].join('\n');
|
|
465
|
-
}
|
|
466
|
-
var formatForMorgan$1 = executionMode === ExecutionMode.DevelopmentMode ? formatForMorgan : morgan.combined;
|
|
467
|
-
|
|
468
|
-
var _context;
|
|
469
|
-
|
|
470
|
-
// Type definitions.
|
|
471
|
-
|
|
472
|
-
// Transports.
|
|
473
|
-
const {
|
|
474
|
-
Console: ConsoleTransport
|
|
475
|
-
} = winston__namespace.transports;
|
|
476
|
-
class Logger {
|
|
477
|
-
static #instance;
|
|
478
|
-
#logger = winston__namespace.createLogger({
|
|
479
|
-
levels: _Object$fromEntries(_filterInstanceProperty(_context = _mapInstanceProperty(handlers).call(handlers, ({
|
|
480
|
-
name,
|
|
481
|
-
level
|
|
482
|
-
}) => [name, level])).call(_context, ([, level]) => typeof level === 'number')),
|
|
483
|
-
level: executionMode === ExecutionMode.ProductionMode ? 'http' : 'verbose',
|
|
484
|
-
transports: [new ConsoleTransport({
|
|
485
|
-
format: formatForCLI
|
|
486
|
-
})],
|
|
487
|
-
exitOnError: false
|
|
488
|
-
});
|
|
489
|
-
#morgan = morgan(formatForMorgan$1, {
|
|
490
|
-
stream: new stream.PassThrough({
|
|
491
|
-
objectMode: true
|
|
492
|
-
}).on('data', data => {
|
|
493
|
-
this.log('http', _trimInstanceProperty(data).call(data));
|
|
494
|
-
})
|
|
495
|
-
});
|
|
496
|
-
constructor() {
|
|
497
|
-
if (new.target !== Logger) {
|
|
498
|
-
throw new ReferenceError('Logger class is not inheritable');
|
|
499
|
-
}
|
|
500
|
-
if (Logger.#instance) {
|
|
501
|
-
throw new ReferenceError('Logger class cannot be constructed in directly');
|
|
502
|
-
}
|
|
503
|
-
Logger.#instance = this;
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
/**
|
|
507
|
-
* Logging message with specific level.
|
|
508
|
-
*
|
|
509
|
-
* @param level
|
|
510
|
-
* @param message
|
|
511
|
-
* @param args Additional metadata.
|
|
512
|
-
*/
|
|
513
|
-
|
|
514
|
-
/**
|
|
515
|
-
* Logging HTTP I/O.
|
|
516
|
-
*
|
|
517
|
-
* @param request Node.js built-in `IncomingMessage` instance from `http` module.
|
|
518
|
-
* @param response Node.js built-in `ServerResponse` instance from `http` module.
|
|
519
|
-
*/
|
|
520
|
-
|
|
521
|
-
/**
|
|
522
|
-
* Logging errors in detail.
|
|
523
|
-
*
|
|
524
|
-
* @param error
|
|
525
|
-
*/
|
|
526
|
-
|
|
527
|
-
log(...args) {
|
|
528
|
-
const logger = this.#logger;
|
|
529
|
-
const format = this.#morgan;
|
|
530
|
-
switch (true) {
|
|
531
|
-
case args.length >= 2 && args[0] instanceof http$1.IncomingMessage && args[1] instanceof http$1.ServerResponse:
|
|
532
|
-
{
|
|
533
|
-
const [request, response] = args;
|
|
534
|
-
return util.promisify(format)(request, response);
|
|
535
|
-
}
|
|
536
|
-
case args.length >= 1 && args[0] instanceof Error:
|
|
537
|
-
{
|
|
538
|
-
const [error, ...data] = args;
|
|
539
|
-
|
|
540
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
541
|
-
logger.log('error', error.message, error, ...data);
|
|
542
|
-
return undefined;
|
|
543
|
-
}
|
|
544
|
-
default:
|
|
545
|
-
{
|
|
546
|
-
const [level, message, ...data] = args;
|
|
547
|
-
|
|
548
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
549
|
-
logger.log(level, message, ...data);
|
|
550
|
-
return undefined;
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
var logger = _Reflect$construct(Logger, [], Logger);
|
|
556
|
-
|
|
557
|
-
module.exports = logger;
|
|
558
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY2pzIiwic291cmNlcyI6WyIuLi9zb3VyY2VzL2hlbHBlcnMvbG9nZ2luZy1sZXZlbC50cyIsIi4uL3NvdXJjZXMvaGVscGVycy9jb2xvci1zY2hlbWUudHMiLCIuLi9zb3VyY2VzL2hlbHBlcnMvbGFiZWwtZGVjb3JhdG9yLnRzIiwiLi4vc291cmNlcy9oYW5kbGVycy9lcnJvci50cyIsIi4uL3NvdXJjZXMvaGFuZGxlcnMvZmF0YWwudHMiLCIuLi9zb3VyY2VzL2hhbmRsZXJzL3dhcm5pbmcudHMiLCIuLi9zb3VyY2VzL2hhbmRsZXJzL25vdGljZS50cyIsIi4uL3NvdXJjZXMvaGFuZGxlcnMvaW5mby50cyIsIi4uL3NvdXJjZXMvaGFuZGxlcnMvaHR0cC50cyIsIi4uL3NvdXJjZXMvaGFuZGxlcnMvcXVlcnkudHMiLCIuLi9zb3VyY2VzL2hhbmRsZXJzL3ZlcmJvc2UudHMiLCIuLi9zb3VyY2VzL2hhbmRsZXJzL2RlYnVnLnRzIiwiLi4vc291cmNlcy9oYW5kbGVycy9pbmRleC50cyIsIi4uL3NvdXJjZXMvZm9ybWF0dGVycy9jb21tYW5kLWxpbmUudHMiLCIuLi9zb3VyY2VzL2hlbHBlcnMvY29uc3RhbnRzLnRzIiwiLi4vc291cmNlcy9mb3JtYXR0ZXJzL21vcmdhbi50cyIsIi4uL3NvdXJjZXMvY2xhc3Nlcy9sb2dnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgTG9nZ2luZ0xldmVsID0ge1xuXHQvLyBDcml0aWNhbCBsZXZlbHMuIChJdCB3aWxsIGNyYXNoIHRoZSBwcm9jZXNzKVxuXHRGYXRhbDogMCxcblx0RXJyb3I6IDEsXG5cblx0Ly8gV2FybmluZyBsZXZlbHMuIChJdCBqdXN0IHJlcG9ydCB3YXJuaW5nIGluZm9ybWF0aW9uLCBub3QgY3Jhc2ggdGhlIHByb2Nlc3MpXG5cdFdhcm5pbmc6IDIsXG5cblx0Ly8gUmVndWxhciBsZXZlbCBhbmQgYWxpYXNlcy5cblx0Tm90aWNlOiAzLFxuXHRJbmZvOiAzLFxuXG5cdC8vIE1heWJlIHNlbnNpdGl2ZSBsZXZlbHMuIChJbiBnZW5lcmFsLCBkb2VzIG5vdCB1c2VmdWwpXG5cdEh0dHA6IDQsXG5cdFF1ZXJ5OiA0LFxuXG5cdC8vIExvdWQgbGV2ZWxzLlxuXHRWZXJib3NlOiA1LFxuXHREZWJ1ZzogNSxcbn0gYXMgY29uc3RcblxudHlwZSBMb2dnaW5nTGV2ZWwgPSB0eXBlb2YgTG9nZ2luZ0xldmVsW2tleW9mIHR5cGVvZiBMb2dnaW5nTGV2ZWxdXG5cbmV4cG9ydCBkZWZhdWx0IExvZ2dpbmdMZXZlbFxuIiwiLy8gVGhpcmQtcGFydHkgbW9kdWxlcy5cbmltcG9ydCBjaGFsaywgeyB0eXBlIENoYWxrSW5zdGFuY2UgfSBmcm9tICdjaGFsaydcblxuLy8gQ29uc3RhbnRzLlxuY29uc3QgY29sb3JpemVyTWFwID0gbmV3IE1hcDxudW1iZXIsIENoYWxrSW5zdGFuY2U+KClcblxuLy8gSGVscGVycy5cbmZ1bmN0aW9uIGNyZWF0ZVNjaGVtZShvcHRpb25zOiB7IGJhY2tncm91bmQ6IENvbG9yVmFsdWUsIGZvcmVncm91bmQ6IENvbG9yVmFsdWUgfSk6IG51bWJlciB7XG5cdGNvbnN0IG5leHRJbmRleCA9IGNvbG9yaXplck1hcC5zaXplXG5cdGNvbnN0IGNvbG9yaXplciA9IGNoYWxrLmJnSGV4KG9wdGlvbnMuYmFja2dyb3VuZCkuaGV4KG9wdGlvbnMuZm9yZWdyb3VuZClcblxuXHRjb2xvcml6ZXJNYXAuc2V0KG5leHRJbmRleCwgY29sb3JpemVyKVxuXG5cdHJldHVybiBuZXh0SW5kZXhcbn1cblxuLy8gQ29sb3IgZGVmaW5pdGlvbnMuXG5jb25zdCBDb2xvclZhbHVlID0ge1xuXHQvLyBCYXNpYyBjb2xvcnMuXG5cdFdoaXRlOiAnI0ZGRkZGRicsXG5cdEdyYXk6ICcjODA4MDgwJyxcblx0QmxhY2s6ICcjMDAwMDAwJyxcblxuXHQvLyBTcGVjaWFsaXplZCBjb2xvcnMuXG5cdENyaXRpY2FsOiAnI0Q2MzAzMScsXG5cdFdhcm5pbmc6ICcjRkRDQjZFJyxcblx0UmVndWxhcjogJyMwOTg0RTMnLFxuXHRIdHRwOiAnIzZBQjA0QycsXG5cdFF1ZXJ5OiAnIzM5OUFGMycsXG59IGFzIGNvbnN0XG5cbnR5cGUgQ29sb3JWYWx1ZSA9IHR5cGVvZiBDb2xvclZhbHVlW2tleW9mIHR5cGVvZiBDb2xvclZhbHVlXVxuXG5jb25zdCBDb2xvclNjaGVtZSA9IHtcblx0Q3JpdGljYWw6IGNyZWF0ZVNjaGVtZSh7XG5cdFx0YmFja2dyb3VuZDogQ29sb3JWYWx1ZS5Dcml0aWNhbCxcblx0XHRmb3JlZ3JvdW5kOiBDb2xvclZhbHVlLkJsYWNrLFxuXHR9KSxcblxuXHRXYXJuaW5nOiBjcmVhdGVTY2hlbWUoe1xuXHRcdGJhY2tncm91bmQ6IENvbG9yVmFsdWUuV2FybmluZyxcblx0XHRmb3JlZ3JvdW5kOiBDb2xvclZhbHVlLkJsYWNrLFxuXHR9KSxcblxuXHRSZWd1bGFyOiBjcmVhdGVTY2hlbWUoe1xuXHRcdGJhY2tncm91bmQ6IENvbG9yVmFsdWUuUmVndWxhcixcblx0XHRmb3JlZ3JvdW5kOiBDb2xvclZhbHVlLldoaXRlLFxuXHR9KSxcblxuXHRIdHRwOiBjcmVhdGVTY2hlbWUoe1xuXHRcdGJhY2tncm91bmQ6IENvbG9yVmFsdWUuSHR0cCxcblx0XHRmb3JlZ3JvdW5kOiBDb2xvclZhbHVlLkJsYWNrLFxuXHR9KSxcblxuXHRRdWVyeTogY3JlYXRlU2NoZW1lKHtcblx0XHRiYWNrZ3JvdW5kOiBDb2xvclZhbHVlLlF1ZXJ5LFxuXHRcdGZvcmVncm91bmQ6IENvbG9yVmFsdWUuQmxhY2ssXG5cdH0pLFxuXG5cdExvdWQ6IGNyZWF0ZVNjaGVtZSh7XG5cdFx0YmFja2dyb3VuZDogQ29sb3JWYWx1ZS5CbGFjayxcblx0XHRmb3JlZ3JvdW5kOiBDb2xvclZhbHVlLkdyYXksXG5cdH0pLFxufSBhcyBjb25zdFxuXG50eXBlIENvbG9yU2NoZW1lID0gdHlwZW9mIENvbG9yU2NoZW1lW2tleW9mIHR5cGVvZiBDb2xvclNjaGVtZV1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENoYWxrT2YoY29sb3JTZXQ6IENvbG9yU2NoZW1lKTogQ2hhbGtJbnN0YW5jZSB7XG5cdHJldHVybiBjb2xvcml6ZXJNYXAuZ2V0KGNvbG9yU2V0KSA/PyBjaGFsa1xufVxuXG5leHBvcnQgZGVmYXVsdCBDb2xvclNjaGVtZVxuIiwiLy8gTm9kZS5qcyBidWlsdC1pbiBBUElzLlxuaW1wb3J0IHByb2Nlc3MgZnJvbSAncHJvY2VzcydcblxuLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCBDb2xvclNjaGVtZSwgeyBnZXRDaGFsa09mIH0gZnJvbSAnLi9jb2xvci1zY2hlbWUnXG5cbi8vIENvbnN0YW50cy5cbmNvbnN0IHsgaXNUVFkgfSA9IHByb2Nlc3Muc3Rkb3V0XG5jb25zdCBpc05vdE9uQ0xJID0gIWlzVFRZXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlY29yYXRlTGFiZWw8VCBleHRlbmRzIHN0cmluZz4obGFiZWw6IFQsIHNjaGVtZTogQ29sb3JTY2hlbWUpOiBUIHtcblx0aWYgKGlzTm90T25DTEkpIHJldHVybiBsYWJlbFxuXG5cdGNvbnN0IGNoYWxrID0gZ2V0Q2hhbGtPZihzY2hlbWUpXG5cdGNvbnN0IGRlY29yYXRlZExhYmVsID0gY2hhbGsuYm9sZChgICR7bGFiZWx9IGApXG5cblx0cmV0dXJuIGRlY29yYXRlZExhYmVsIGFzIFRcbn1cbiIsIi8vIE5vZGUuanMgYnVpbHQtaW4gQVBJcy5cbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgcHJvY2VzcywgeyB2ZXJzaW9uIH0gZnJvbSAncHJvY2VzcydcblxuLy8gVGhpcmQtcGFydHkgbW9kdWxlcy5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcblxuLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCBMb2dnaW5nTGV2ZWwgZnJvbSAnLi4vaGVscGVycy9sb2dnaW5nLWxldmVsJ1xuaW1wb3J0IENvbG9yU2NoZW1lIGZyb20gJy4uL2hlbHBlcnMvY29sb3Itc2NoZW1lJ1xuaW1wb3J0IGRlY29yYXRlTGFiZWwgZnJvbSAnLi4vaGVscGVycy9sYWJlbC1kZWNvcmF0b3InXG5cbi8vIFR5cGUgZGVmaW5pdGlvbnMuXG50eXBlIExvZ2dpbmdEYXRhID0geyBsZXZlbDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcgfSAmIFJlY29yZDxQcm9wZXJ0eUtleSwgYW55PlxudHlwZSBIYW5kbGVkRGF0YSA9IHsgbGFiZWw6IHN0cmluZywgcGF5bG9hZDogc3RyaW5nIH1cblxuLy8gQ29uc3RhbnRzLlxuY29uc3Qgcm9vdFBhdGggPSBwcm9jZXNzLmN3ZCgpXG5jb25zdCBjb25qdW5jdGlvbiA9IGAgJHtjaGFsay5ibHVlKCfilIDilIAnKX0gYFxuY29uc3Qgc3BsYXQ6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2wuZm9yKCdzcGxhdCcpXG5cbi8vIEhhbmRsZXIgbWV0YWRhdGEuXG5leHBvcnQgY29uc3QgbmFtZSA9ICdlcnJvcidcbmV4cG9ydCBjb25zdCBsZXZlbCA9IExvZ2dpbmdMZXZlbC5FcnJvclxuZXhwb3J0IGNvbnN0IGxhYmVsID0gZGVjb3JhdGVMYWJlbCgnRVJST1InLCBDb2xvclNjaGVtZS5Dcml0aWNhbClcblxuZnVuY3Rpb24gc2ltcGxpZnlEYXRhVVJJKGRhdGFVUkk6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IFsgLCBhY3R1YWxDb250ZW50IF0gPSBkYXRhVVJJLnNwbGl0KCc6Jylcblx0Y29uc3QgcGl2b3QgPSBhY3R1YWxDb250ZW50LmluZGV4T2YoJywnKSArIDFcblx0Y29uc3QgbWltZUluZGljYXRvciA9IGFjdHVhbENvbnRlbnQuc2xpY2UoMCwgcGl2b3QpXG5cdGNvbnN0IGNvbnRlbnRQcmVmaXggPSBhY3R1YWxDb250ZW50LnNsaWNlKHBpdm90LCBwaXZvdCArIDQpXG5cdGNvbnN0IGNvbnRlbnRTdWZmaXggPSBhY3R1YWxDb250ZW50LnNsaWNlKC00KVxuXG5cdHJldHVybiBgZGF0YToke21pbWVJbmRpY2F0b3IgKyBjb250ZW50UHJlZml4fS4uLiR7Y29udGVudFN1ZmZpeH1gXG59XG5cbmZ1bmN0aW9uIGlzRGF0YVVSSShmaWxlbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdHJldHVybiBmaWxlbmFtZS5zdGFydHNXaXRoKCdkYXRhOicpXG59XG5cbmZ1bmN0aW9uIGlzQWJzb2x1dGVPckRhdGFVUkkoZmlsZW5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gcGF0aC5pc0Fic29sdXRlKGZpbGVuYW1lKSB8fCBpc0RhdGFVUkkoZmlsZW5hbWUpXG59XG5cbmZ1bmN0aW9uIG1hcExvY2F0aW9uT2ZFcnJvclRocm93bihmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcblx0bGV0IHRhcmdldCA9IHBhdGgucmVsYXRpdmUocm9vdFBhdGgsIGZpbGVuYW1lKVxuXG5cdGlmIChpc0RhdGFVUkkoZmlsZW5hbWUpKSB7XG5cdFx0dGFyZ2V0ID0gY2hhbGsuZ3JheShzaW1wbGlmeURhdGFVUkkoZmlsZW5hbWUpKVxuXHR9IGVsc2UgaWYgKHRhcmdldC5pbmNsdWRlcygnbm9kZV9tb2R1bGVzJykpIHtcblx0XHR0YXJnZXQgPSBjaGFsay5ncmF5KFxuXHRcdFx0dGFyZ2V0LnNsaWNlKHRhcmdldC5sYXN0SW5kZXhPZignbm9kZV9tb2R1bGVzJykpLFxuXHRcdCkucmVwbGFjZShcblx0XHRcdC9ub2RlX21vZHVsZXNbXFxcXC9dKCg/OkBbXlxcXFwvXStbXFxcXC9dKT9bXlxcXFwvXSspKC4qKS8sXG5cdFx0XHQoXywgbW9kdWxlTmFtZTogc3RyaW5nLCB0cmFpbGluZzogc3RyaW5nKSA9PiAoXG5cdFx0XHRcdGBub2RlX21vZHVsZXMke3BhdGguc2VwfSR7Y2hhbGsuYm9sZC51bmRlcmxpbmUobW9kdWxlTmFtZSl9JHtjaGFsay5ncmF5KHRyYWlsaW5nKX1gXG5cdFx0XHQpLFxuXHRcdClcblx0fSBlbHNlIHtcblx0XHR0YXJnZXQgPSBgJHtjaGFsay5ncmF5KHBhdGguZGlybmFtZSh0YXJnZXQpICsgcGF0aC5zZXApfSR7Y2hhbGsuYm9sZC51bmRlcmxpbmUocGF0aC5iYXNlbmFtZSh0YXJnZXQpKX1gXG5cdH1cblxuXHRyZXR1cm4gdGFyZ2V0XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGhhbmRsZShkYXRhOiBMb2dnaW5nRGF0YSk6IEhhbmRsZWREYXRhIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgeyBbc3BsYXRdOiBbIGVycm9yIF0gPSBbXSB9ID0gZGF0YSBhcyBhbnlcblxuXHRpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuXHRcdHJldHVybiB1bmRlZmluZWRcblx0fVxuXG5cdGNvbnN0IHsgbmFtZTogZXJyb3JOYW1lLCBtZXNzYWdlLCBzdGFjazogcmF3U3RhY2sgPSAnJyB9ID0gZXJyb3JcblxuXHRjb25zdCBzdGFjayA9IHJhd1N0YWNrXG5cdFx0LnNsaWNlKGVycm9yTmFtZS5sZW5ndGggKyBtZXNzYWdlLmxlbmd0aCArIDMpXG5cdFx0LnNwbGl0KCdcXG4nKVxuXHRcdC5tYXAobGluZSA9PiBsaW5lLnJlcGxhY2UoL15cXHMrYXQgL2csICcnKSlcblx0XHQubWFwKGxpbmUgPT4gKGlzQWJzb2x1dGVPckRhdGFVUkkobGluZSkgPyBgPGFub255bW91cz4ke2Nvbmp1bmN0aW9ufSR7bWFwTG9jYXRpb25PZkVycm9yVGhyb3duKGxpbmUpfWAgOiBsaW5lKSlcblx0XHQubWFwKGxpbmUgPT4gbGluZS5yZXBsYWNlKC9eKC4rKSBcXCgoLispXFwpJC8sIChfLCBjb250ZXh0TmFtZTogc3RyaW5nLCByYXdMb2NhdGlvbjogc3RyaW5nKSA9PiB7XG5cdFx0XHRsZXQgbG9jYXRpb24gPSAnJ1xuXG5cdFx0XHRzd2l0Y2ggKHRydWUpIHtcblx0XHRcdGNhc2UgKHJhd0xvY2F0aW9uID09PSAnPGFub255bW91cz4nKToge1xuXHRcdFx0XHRsb2NhdGlvbiA9IGNoYWxrLmdyYXkocmF3TG9jYXRpb24pXG5cblx0XHRcdFx0YnJlYWtcblx0XHRcdH1cblxuXHRcdFx0Y2FzZSAoaXNEYXRhVVJJKHJhd0xvY2F0aW9uKSk6IHtcblx0XHRcdFx0bG9jYXRpb24gPSBjaGFsay5ncmF5KHNpbXBsaWZ5RGF0YVVSSShyYXdMb2NhdGlvbikpXG5cblx0XHRcdFx0YnJlYWtcblx0XHRcdH1cblxuXHRcdFx0Y2FzZSAocmF3TG9jYXRpb24uc3RhcnRzV2l0aCgnbm9kZTonKSk6IHtcblx0XHRcdFx0Y29uc3QgWyBmaWxlbmFtZSwgb2NjdXJyZWRMaW5lIF0gPSByYXdMb2NhdGlvbi5zbGljZSg1KS5zcGxpdCgnOicpXG5cblx0XHRcdFx0bG9jYXRpb24gPSBjaGFsay5ncmF5KGBodHRwczovL2dpdGh1Yi5jb20vJHtjaGFsay5ib2xkLnVuZGVybGluZSgnbm9kZWpzJyl9L25vZGUvYmxvYi8ke3ZlcnNpb259L2xpYi8ke2ZpbGVuYW1lfS5qcyNMJHtvY2N1cnJlZExpbmV9YClcblxuXHRcdFx0XHRicmVha1xuXHRcdFx0fVxuXG5cdFx0XHRkZWZhdWx0OiB7XG5cdFx0XHRcdGNvbnN0IFsgZmlsZW5hbWUsIG9jY3VycmVkTGluZSwgb2NjdXJyZWRDb2x1bW4gXSA9IHJhd0xvY2F0aW9uLnNwbGl0KCc6JylcblxuXHRcdFx0XHRpZiAoIXBhdGguaXNBYnNvbHV0ZShmaWxlbmFtZSkpIGJyZWFrXG5cblx0XHRcdFx0Y29uc3QgdGFyZ2V0ID0gbWFwTG9jYXRpb25PZkVycm9yVGhyb3duKHBhdGgucmVsYXRpdmUocm9vdFBhdGgsIGZpbGVuYW1lKSlcblx0XHRcdFx0Y29uc3QgdHJhaWxpbmcgPSBjaGFsay5ncmF5KGA6JHtvY2N1cnJlZExpbmV9OiR7b2NjdXJyZWRDb2x1bW59YClcblxuXHRcdFx0XHRsb2NhdGlvbiA9IHRhcmdldCArIHRyYWlsaW5nXG5cdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBgJHtjb250ZXh0TmFtZX0ke2Nvbmp1bmN0aW9ufSR7bG9jYXRpb259YFxuXHRcdH0pKVxuXHRcdC5qb2luKCdcXG4nKVxuXG5cdGNvbnN0IGRlY29yYXRlZExhYmVsID0gZGVjb3JhdGVMYWJlbChlcnJvck5hbWUsIENvbG9yU2NoZW1lLkNyaXRpY2FsKVxuXHRjb25zdCBwYXlsb2FkID0gYCR7bWVzc2FnZX1cXG5cXG4ke3N0YWNrfVxcbmBcblxuXHRyZXR1cm4geyBsYWJlbDogZGVjb3JhdGVkTGFiZWwsIHBheWxvYWQgfVxufVxuIiwiLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCBMb2dnaW5nTGV2ZWwgZnJvbSAnLi4vaGVscGVycy9sb2dnaW5nLWxldmVsJ1xuaW1wb3J0IENvbG9yU2NoZW1lIGZyb20gJy4uL2hlbHBlcnMvY29sb3Itc2NoZW1lJ1xuaW1wb3J0IGRlY29yYXRlTGFiZWwgZnJvbSAnLi4vaGVscGVycy9sYWJlbC1kZWNvcmF0b3InXG5cbi8vIEhhbmRsZXIgbWV0YWRhdGEuXG5leHBvcnQgY29uc3QgbmFtZSA9ICdmYXRhbCdcbmV4cG9ydCBjb25zdCBsZXZlbCA9IExvZ2dpbmdMZXZlbC5GYXRhbFxuZXhwb3J0IGNvbnN0IGxhYmVsID0gZGVjb3JhdGVMYWJlbCgnRkFUQUwnLCBDb2xvclNjaGVtZS5Dcml0aWNhbClcblxuZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJy4vZXJyb3InIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1leHBvcnRzXG4iLCIvLyBMb2NhbCBoZWxwZXJzLlxuaW1wb3J0IExvZ2dpbmdMZXZlbCBmcm9tICcuLi9oZWxwZXJzL2xvZ2dpbmctbGV2ZWwnXG5pbXBvcnQgQ29sb3JTY2hlbWUgZnJvbSAnLi4vaGVscGVycy9jb2xvci1zY2hlbWUnXG5pbXBvcnQgZGVjb3JhdGVMYWJlbCBmcm9tICcuLi9oZWxwZXJzL2xhYmVsLWRlY29yYXRvcidcblxuLy8gSGFuZGxlciBtZXRhZGF0YS5cbmV4cG9ydCBjb25zdCBuYW1lID0gJ3dhcm5pbmcnXG5leHBvcnQgY29uc3QgbGV2ZWwgPSBMb2dnaW5nTGV2ZWwuV2FybmluZ1xuZXhwb3J0IGNvbnN0IGxhYmVsID0gZGVjb3JhdGVMYWJlbCgnV0FSTklORycsIENvbG9yU2NoZW1lLldhcm5pbmcpXG5cbmV4cG9ydCBkZWZhdWx0IG51bGxcbiIsIi8vIExvY2FsIGhlbHBlcnMuXG5pbXBvcnQgTG9nZ2luZ0xldmVsIGZyb20gJy4uL2hlbHBlcnMvbG9nZ2luZy1sZXZlbCdcbmltcG9ydCBDb2xvclNjaGVtZSBmcm9tICcuLi9oZWxwZXJzL2NvbG9yLXNjaGVtZSdcbmltcG9ydCBkZWNvcmF0ZUxhYmVsIGZyb20gJy4uL2hlbHBlcnMvbGFiZWwtZGVjb3JhdG9yJ1xuXG4vLyBIYW5kbGVyIG1ldGFkYXRhLlxuZXhwb3J0IGNvbnN0IG5hbWUgPSAnbm90aWNlJ1xuZXhwb3J0IGNvbnN0IGxldmVsID0gTG9nZ2luZ0xldmVsLk5vdGljZVxuZXhwb3J0IGNvbnN0IGxhYmVsID0gZGVjb3JhdGVMYWJlbCgnTk9USUNFJywgQ29sb3JTY2hlbWUuUmVndWxhcilcblxuZXhwb3J0IGRlZmF1bHQgbnVsbFxuIiwiLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCBMb2dnaW5nTGV2ZWwgZnJvbSAnLi4vaGVscGVycy9sb2dnaW5nLWxldmVsJ1xuaW1wb3J0IENvbG9yU2NoZW1lIGZyb20gJy4uL2hlbHBlcnMvY29sb3Itc2NoZW1lJ1xuaW1wb3J0IGRlY29yYXRlTGFiZWwgZnJvbSAnLi4vaGVscGVycy9sYWJlbC1kZWNvcmF0b3InXG5cbi8vIEhhbmRsZXIgbWV0YWRhdGEuXG5leHBvcnQgY29uc3QgbmFtZSA9ICdpbmZvJ1xuZXhwb3J0IGNvbnN0IGxldmVsID0gTG9nZ2luZ0xldmVsLkluZm9cbmV4cG9ydCBjb25zdCBsYWJlbCA9IGRlY29yYXRlTGFiZWwoJ0lORk8nLCBDb2xvclNjaGVtZS5SZWd1bGFyKVxuXG5leHBvcnQgZGVmYXVsdCBudWxsXG4iLCIvLyBMb2NhbCBoZWxwZXJzLlxuaW1wb3J0IExvZ2dpbmdMZXZlbCBmcm9tICcuLi9oZWxwZXJzL2xvZ2dpbmctbGV2ZWwnXG5pbXBvcnQgQ29sb3JTY2hlbWUgZnJvbSAnLi4vaGVscGVycy9jb2xvci1zY2hlbWUnXG5pbXBvcnQgZGVjb3JhdGVMYWJlbCBmcm9tICcuLi9oZWxwZXJzL2xhYmVsLWRlY29yYXRvcidcblxuLy8gSGFuZGxlciBtZXRhZGF0YS5cbmV4cG9ydCBjb25zdCBuYW1lID0gJ2h0dHAnXG5leHBvcnQgY29uc3QgbGV2ZWwgPSBMb2dnaW5nTGV2ZWwuSHR0cFxuZXhwb3J0IGNvbnN0IGxhYmVsID0gZGVjb3JhdGVMYWJlbCgnSFRUUCcsIENvbG9yU2NoZW1lLkh0dHApXG5cbmV4cG9ydCBkZWZhdWx0IG51bGxcbiIsIi8vIEhpZ2hsaWdodC5qc1xuaW1wb3J0IHsgaGlnaGxpZ2h0IH0gZnJvbSAnY2xpLWhpZ2hsaWdodCdcblxuLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCBMb2dnaW5nTGV2ZWwgZnJvbSAnLi4vaGVscGVycy9sb2dnaW5nLWxldmVsJ1xuaW1wb3J0IENvbG9yU2NoZW1lIGZyb20gJy4uL2hlbHBlcnMvY29sb3Itc2NoZW1lJ1xuaW1wb3J0IGRlY29yYXRlTGFiZWwgZnJvbSAnLi4vaGVscGVycy9sYWJlbC1kZWNvcmF0b3InXG5cbi8vIFR5cGUgZGVmaW5pdGlvbnMuXG50eXBlIExvZ2dpbmdEYXRhID0geyBsZXZlbDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcgfSAmIFJlY29yZDxQcm9wZXJ0eUtleSwgYW55PlxudHlwZSBIYW5kbGVkRGF0YSA9IHsgbGFiZWw6IHN0cmluZywgcGF5bG9hZDogc3RyaW5nIH1cblxuLy8gSGFuZGxlciBtZXRhZGF0YS5cbmV4cG9ydCBjb25zdCBuYW1lID0gJ3F1ZXJ5J1xuZXhwb3J0IGNvbnN0IGxldmVsID0gTG9nZ2luZ0xldmVsLlF1ZXJ5XG5leHBvcnQgY29uc3QgbGFiZWwgPSBkZWNvcmF0ZUxhYmVsKCdRVUVSWScsIENvbG9yU2NoZW1lLlF1ZXJ5KVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBoYW5kbGUoZGF0YTogTG9nZ2luZ0RhdGEpOiBIYW5kbGVkRGF0YSB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IHBheWxvYWQgPSBoaWdobGlnaHQoZGF0YS5tZXNzYWdlLCB7IGxhbmd1YWdlOiAnc3FsJyB9KVxuXG5cdHJldHVybiB7IGxhYmVsLCBwYXlsb2FkIH1cbn1cbiIsIi8vIExvY2FsIGhlbHBlcnMuXG5pbXBvcnQgTG9nZ2luZ0xldmVsIGZyb20gJy4uL2hlbHBlcnMvbG9nZ2luZy1sZXZlbCdcbmltcG9ydCBDb2xvclNjaGVtZSBmcm9tICcuLi9oZWxwZXJzL2NvbG9yLXNjaGVtZSdcbmltcG9ydCBkZWNvcmF0ZUxhYmVsIGZyb20gJy4uL2hlbHBlcnMvbGFiZWwtZGVjb3JhdG9yJ1xuXG4vLyBIYW5kbGVyIG1ldGFkYXRhLlxuZXhwb3J0IGNvbnN0IG5hbWUgPSAndmVyYm9zZSdcbmV4cG9ydCBjb25zdCBsZXZlbCA9IExvZ2dpbmdMZXZlbC5WZXJib3NlXG5leHBvcnQgY29uc3QgbGFiZWwgPSBkZWNvcmF0ZUxhYmVsKCdWRVJCT1NFJywgQ29sb3JTY2hlbWUuTG91ZClcblxuZXhwb3J0IGRlZmF1bHQgbnVsbFxuIiwiLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCBMb2dnaW5nTGV2ZWwgZnJvbSAnLi4vaGVscGVycy9sb2dnaW5nLWxldmVsJ1xuaW1wb3J0IENvbG9yU2NoZW1lIGZyb20gJy4uL2hlbHBlcnMvY29sb3Itc2NoZW1lJ1xuaW1wb3J0IGRlY29yYXRlTGFiZWwgZnJvbSAnLi4vaGVscGVycy9sYWJlbC1kZWNvcmF0b3InXG5cbi8vIEhhbmRsZXIgbWV0YWRhdGEuXG5leHBvcnQgY29uc3QgbmFtZSA9ICdkZWJ1ZydcbmV4cG9ydCBjb25zdCBsZXZlbCA9IExvZ2dpbmdMZXZlbC5EZWJ1Z1xuZXhwb3J0IGNvbnN0IGxhYmVsID0gZGVjb3JhdGVMYWJlbCgnREVCVUcnLCBDb2xvclNjaGVtZS5Mb3VkKVxuXG5leHBvcnQgZGVmYXVsdCBudWxsXG4iLCIvLyBIYW5kbGVyIGltcGxlbWVudGF0aW9ucy5cbmltcG9ydCAqIGFzIEZhdGFsSGFuZGxlciBmcm9tICcuL2ZhdGFsJ1xuaW1wb3J0ICogYXMgRXJyb3JIYW5kbGVyIGZyb20gJy4vZXJyb3InXG5pbXBvcnQgKiBhcyBXYXJuaW5nSGFuZGxlciBmcm9tICcuL3dhcm5pbmcnXG5pbXBvcnQgKiBhcyBOb3RpY2VIYW5kbGVyIGZyb20gJy4vbm90aWNlJ1xuaW1wb3J0ICogYXMgSW5mb0hhbmRsZXIgZnJvbSAnLi9pbmZvJ1xuaW1wb3J0ICogYXMgSHR0cEhhbmRsZXIgZnJvbSAnLi9odHRwJ1xuaW1wb3J0ICogYXMgUXVlcnlIYW5kbGVyIGZyb20gJy4vcXVlcnknXG5pbXBvcnQgKiBhcyBWZXJib3NlSGFuZGxlciBmcm9tICcuL3ZlcmJvc2UnXG5pbXBvcnQgKiBhcyBEZWJ1Z0hhbmRsZXIgZnJvbSAnLi9kZWJ1ZydcblxuY29uc3QgaGFuZGxlcnMgPSBbXG5cdEZhdGFsSGFuZGxlcixcblx0RXJyb3JIYW5kbGVyLFxuXHRXYXJuaW5nSGFuZGxlcixcblx0Tm90aWNlSGFuZGxlcixcblx0SW5mb0hhbmRsZXIsXG5cdEh0dHBIYW5kbGVyLFxuXHRRdWVyeUhhbmRsZXIsXG5cdFZlcmJvc2VIYW5kbGVyLFxuXHREZWJ1Z0hhbmRsZXIsXG5dXG5cbmV4cG9ydCB0eXBlIExvZ2dpbmdMZXZlbE5hbWUgPSAodHlwZW9mIGhhbmRsZXJzIGV4dGVuZHMgKGluZmVyIFQpW10gPyBUIDogbmV2ZXIpWyduYW1lJ11cbmV4cG9ydCBkZWZhdWx0IGhhbmRsZXJzXG4iLCIvLyBUaGlyZC1wYXJ0eSBtb2R1bGVzLlxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuaW1wb3J0IHJUcmFjZXIgZnJvbSAnY2xzLXJ0cmFjZXInXG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gJ2x1eG9uJ1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnd2luc3RvbidcblxuLy8gTG9jYWwgaGVscGVycy5cbmltcG9ydCBMb2dnaW5nTGV2ZWwgZnJvbSAnLi4vaGVscGVycy9sb2dnaW5nLWxldmVsJ1xuXG4vLyBIYW5kbGVyIGltcGxlbWVudGF0aW9ucy5cbmltcG9ydCBoYW5kbGVycyBmcm9tICcuLi9oYW5kbGVycydcblxuZXhwb3J0IGRlZmF1bHQgZm9ybWF0LnByaW50ZihkYXRhID0+IHtcblx0Y29uc3QgdGltZXN0YW1wID0gY2hhbGsuZ3JheShEYXRlVGltZS5ub3coKS50b0lTTyh7IGluY2x1ZGVPZmZzZXQ6IHRydWUgfSkpXG5cdGNvbnN0IGhhbmRsZXIgPSBoYW5kbGVycy5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gZGF0YS5sZXZlbClcblx0Y29uc3QgZmFsbGJhY2sgPSB7IGxhYmVsOiBoYW5kbGVyPy5sYWJlbCwgcGF5bG9hZDogZGF0YS5tZXNzYWdlIH1cblx0Y29uc3QgcGVyZm9ybUhhbmRsZSA9IGhhbmRsZXI/LmRlZmF1bHQgPz8gKCgpOiB0eXBlb2YgZmFsbGJhY2sgPT4gZmFsbGJhY2spXG5cblx0Ly8gRXhlY3V0ZSBoYW5kbGVyIGFuZCB0aGVuLCBnZXQgZGVjb3JhdGVkIHBheWxvYWQuXG5cdGNvbnN0IHsgbGFiZWwsIHBheWxvYWQgfSA9IFJlZmxlY3QuYXBwbHkocGVyZm9ybUhhbmRsZSwgdW5kZWZpbmVkLCBbIGRhdGEgXSkgPz8gZmFsbGJhY2tcblxuXHRsZXQgZXh0cmFGaW5nZXJwcmludDogc3RyaW5nIHwgdW5kZWZpbmVkXG5cblx0aWYgKGhhbmRsZXI/LmxldmVsID09PSBMb2dnaW5nTGV2ZWwuSHR0cCkge1xuXHRcdGV4dHJhRmluZ2VycHJpbnQgPSBkYXRhLnRyYW5zYWN0aW9uSWRcblx0XHRcdD8gYChUcmFuc2FjdGlvbi1JRCA9ICR7ZGF0YS50cmFuc2FjdGlvbklkIGFzIHN0cmluZ30pYFxuXHRcdFx0OiBgKFJlcXVlc3QtSUQgPSAke3JUcmFjZXIuaWQoKSBhcyBzdHJpbmd9KWBcblx0fVxuXG5cdHJldHVybiBgJHtsYWJlbCBhcyBzdHJpbmd9ICR7dGltZXN0YW1wfSR7ZXh0cmFGaW5nZXJwcmludCA/IGAgJHtleHRyYUZpbmdlcnByaW50fWAgOiAnJ31cXG4ke3BheWxvYWQgYXMgc3RyaW5nfWBcbn0pXG4iLCIvLyBOb2RlLmpzIGJ1aWx0LWluIEFQSXMuXG5pbXBvcnQgY2x1c3RlciBmcm9tICdjbHVzdGVyJ1xuaW1wb3J0IHsgZW52IGFzIGVudmlyb25tZW50cyB9IGZyb20gJ3Byb2Nlc3MnXG5pbXBvcnQgeyBpc01haW5UaHJlYWQgfSBmcm9tICd3b3JrZXJfdGhyZWFkcydcblxuLy8gVHlwZSBkZWZpbml0aW9ucy5cbmV4cG9ydCBjb25zdCBFeGVjdXRpb25Nb2RlID0ge1xuXHREZXZlbG9wbWVudE1vZGU6ICdkZXZlbG9wbWVudCcsXG5cdFByb2R1Y3Rpb25Nb2RlOiAncHJvZHVjdGlvbicsXG59IGFzIGNvbnN0XG5cbmV4cG9ydCBjb25zdCBDbHVzdGVyaW5nTW9kZSA9IHtcblx0TWFzdGVyUHJvY2VzczogMCxcblx0V29ya2VyUHJvY2VzczogMSxcbn0gYXMgY29uc3RcblxuZXhwb3J0IGNvbnN0IFRocmVhZGluZ01vZGUgPSB7XG5cdE1haW5UaHJlYWQ6IDAsXG5cdFdvcmtlclRocmVhZDogMSxcbn0gYXMgY29uc3RcblxuZXhwb3J0IHR5cGUgRXhlY3V0aW9uTW9kZSA9IHR5cGVvZiBFeGVjdXRpb25Nb2RlW2tleW9mIHR5cGVvZiBFeGVjdXRpb25Nb2RlXVxuZXhwb3J0IHR5cGUgQ2x1c3RlcmluZ01vZGUgPSB0eXBlb2YgQ2x1c3RlcmluZ01vZGVba2V5b2YgdHlwZW9mIENsdXN0ZXJpbmdNb2RlXVxuZXhwb3J0IHR5cGUgVGhyZWFkaW5nTW9kZSA9IHR5cGVvZiBUaHJlYWRpbmdNb2RlW2tleW9mIHR5cGVvZiBUaHJlYWRpbmdNb2RlXVxuXG4vLyBFeHBvcnRpbmdzLlxuZXhwb3J0IGNvbnN0IGV4ZWN1dGlvbk1vZGUgPSBlbnZpcm9ubWVudHMuTk9ERV9FTlYgYXMgRXhlY3V0aW9uTW9kZSA/PyBFeGVjdXRpb25Nb2RlLkRldmVsb3BtZW50TW9kZVxuXG5leHBvcnQgY29uc3QgY2x1c3RlcmluZ01vZGU6IENsdXN0ZXJpbmdNb2RlID0gY2x1c3Rlci5pc1ByaW1hcnkgPz8gY2x1c3Rlci5pc01hc3RlclxuXHQ/IENsdXN0ZXJpbmdNb2RlLk1hc3RlclByb2Nlc3Ncblx0OiBDbHVzdGVyaW5nTW9kZS5Xb3JrZXJQcm9jZXNzXG5cbmV4cG9ydCBjb25zdCB0aHJlYWRpbmdNb2RlOiBUaHJlYWRpbmdNb2RlID0gaXNNYWluVGhyZWFkXG5cdD8gVGhyZWFkaW5nTW9kZS5NYWluVGhyZWFkXG5cdDogVGhyZWFkaW5nTW9kZS5Xb3JrZXJUaHJlYWRcbiIsIi8vIE5vZGUuanMgYnVpbHQtaW4gQVBJcy5cbmltcG9ydCB7XG5cdFNUQVRVU19DT0RFUyxcblx0SW5jb21pbmdNZXNzYWdlIGFzIEh0dHBSZXF1ZXN0LFxuXHRTZXJ2ZXJSZXNwb25zZSBhcyBIdHRwUmVzcG9uc2UsXG59IGZyb20gJ2h0dHAnXG5cbi8vIFRoaXJkLXBhcnR5IG1vZHVsZXMuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgbW9yZ2FuIGZyb20gJ21vcmdhbidcbmltcG9ydCBwcmV0dHlCeXRlcyBmcm9tICdwcmV0dHktYnl0ZXMnXG5pbXBvcnQgcHJldHR5TXMgZnJvbSAncHJldHR5LW1zJ1xuXG4vLyBMb2NhbCBoZWxwZXJzLlxuaW1wb3J0IHsgRXhlY3V0aW9uTW9kZSwgZXhlY3V0aW9uTW9kZSB9IGZyb20gJy4uL2hlbHBlcnMvY29uc3RhbnRzJ1xuXG4vLyBUeXBlIGRlZmluaXRpb25zLlxuZGVjbGFyZSBtb2R1bGUgJ21vcmdhbicge1xuXHRjb25zdCBjb21iaW5lZDogbW9yZ2FuLkZvcm1hdEZuXG59XG5cbmludGVyZmFjZSBUb2tlbkluZGV4ZXIge1xuXHRbdG9rZW5OYW1lOiBzdHJpbmddOiAoXG5cdFx0cmVxdWVzdDogSHR0cFJlcXVlc3QsXG5cdFx0cmVzcG9uc2U6IEh0dHBSZXNwb25zZSxcblx0XHQuLi5hcmdzOiBhbnlbXVxuXHQpID0+IHN0cmluZyB8IHVuZGVmaW5lZFxufVxuXG4vLyBIZWxwZXJzLlxuZnVuY3Rpb24gZGVjb3JhdGVTdGF0dXNDb2RlKHN0YXR1c0NvZGU6IGtleW9mIHR5cGVvZiBTVEFUVVNfQ09ERVMpOiBzdHJpbmcge1xuXHRjb25zdCBncm91cE9mQ29kZSA9IE1hdGguZmxvb3IoTnVtYmVyKHN0YXR1c0NvZGUpIC8gMTAwKSAqIDEwMFxuXHRjb25zdCBiYXNlTWVzc2FnZSA9IGAke3N0YXR1c0NvZGV9ICR7U1RBVFVTX0NPREVTW3N0YXR1c0NvZGVdIGFzIHN0cmluZ31gXG5cblx0c3dpdGNoIChncm91cE9mQ29kZSkge1xuXHRjYXNlIDIwMDoge1xuXHRcdHJldHVybiBjaGFsay5ncmVlbihiYXNlTWVzc2FnZSlcblx0fVxuXG5cdGNhc2UgMzAwOiB7XG5cdFx0cmV0dXJuIGNoYWxrLm1hZ2VudGEoYmFzZU1lc3NhZ2UpXG5cdH1cblx0Y2FzZSA0MDA6XG5cdGNhc2UgNTAwOiB7XG5cdFx0cmV0dXJuIGNoYWxrLnJlZChiYXNlTWVzc2FnZSlcblx0fVxuXG5cdGRlZmF1bHQ6IHtcblx0XHRyZXR1cm4gY2hhbGsuZ3JheShiYXNlTWVzc2FnZSlcblx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEZvck1vcmdhbih0b2tlbnM6IGFueSwgcmVxdWVzdDogSHR0cFJlcXVlc3QsIHJlc3BvbnNlOiBIdHRwUmVzcG9uc2UpOiBzdHJpbmcge1xuXHRmdW5jdGlvbiBfKHRva2VuOiBzdHJpbmcsIC4uLnN1YkFyZ3M6IGFueVtdKTogc3RyaW5nIHwgdm9pZCB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnRcblx0XHRyZXR1cm4gKHRva2VucyBhcyBUb2tlbkluZGV4ZXIpW3Rva2VuXShyZXF1ZXN0LCByZXNwb25zZSwgLi4uc3ViQXJncylcblx0fVxuXG5cdC8vIFJhdyB2YWx1ZXMuXG5cdGNvbnN0IG1ldGhvZCA9IF8oJ21ldGhvZCcpXG5cdGNvbnN0IFVSTCA9IF8oJ3VybCcpXG5cdGNvbnN0IGh0dHBWZXJzaW9uID0gYEhUVFAvJHtfKCdodHRwLXZlcnNpb24nKSBhcyBzdHJpbmd9YFxuXHRjb25zdCBzdGF0dXNDb2RlID0gTnVtYmVyKF8oJ3N0YXR1cycpKVxuXHRjb25zdCBjb250ZW50TGVuZ3RoID0gTnVtYmVyKF8oJ3JlcycsICdjb250ZW50LWxlbmd0aCcpID8/IC0xKVxuXHRjb25zdCByZXNwb25zZVRpbWUgPSBOdW1iZXIoXygncmVzcG9uc2UtdGltZScpID8/IC0xKVxuXG5cdC8vIERlY29yYXRlZCB2YWx1ZXMuXG5cdGNvbnN0ICRtZXRob2QgPSBjaGFsay5ib2xkKG1ldGhvZClcblx0Y29uc3QgJHZlcnNpb24gPSBjaGFsay5yZ2IoOTgsIDE3NywgMjU1KShodHRwVmVyc2lvbilcblx0Y29uc3QgJHN0YXR1c0NvZGUgPSBkZWNvcmF0ZVN0YXR1c0NvZGUoc3RhdHVzQ29kZSlcblx0Y29uc3QgJGNvbnRlbnRMZW5ndGggPSBjb250ZW50TGVuZ3RoID49IDAgPyBwcmV0dHlCeXRlcyhjb250ZW50TGVuZ3RoKSA6ICc/IEInXG5cdGNvbnN0ICRyZXNwb25zZVRpbWUgPSByZXNwb25zZVRpbWUgPj0gMCA/IHByZXR0eU1zKHJlc3BvbnNlVGltZSkgOiAnJ1xuXG5cdC8vIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG5cdGNvbnN0IG1ldGFkYXRhID0gYCgkeyRjb250ZW50TGVuZ3RofSwgJHskcmVzcG9uc2VUaW1lfSlgXG5cblx0cmV0dXJuIFtcblx0XHRg4oaSICR7JG1ldGhvZH0gJHtVUkwgYXMgc3RyaW5nfSAkeyR2ZXJzaW9ufWAsXG5cdFx0YOKGkCAkeyR2ZXJzaW9ufSAkeyRzdGF0dXNDb2RlfSAke21ldGFkYXRhfWAsXG5cdF0uam9pbignXFxuJylcbn1cblxuZXhwb3J0IGRlZmF1bHQgZXhlY3V0aW9uTW9kZSA9PT0gRXhlY3V0aW9uTW9kZS5EZXZlbG9wbWVudE1vZGUgPyBmb3JtYXRGb3JNb3JnYW4gOiBtb3JnYW4uY29tYmluZWRcbiIsIi8vIE5vZGUuanMgYnVpbHQtaW4gQVBJcy5cbmltcG9ydCB7IEluY29taW5nTWVzc2FnZSBhcyBIdHRwUmVxdWVzdCwgU2VydmVyUmVzcG9uc2UgYXMgSHR0cFJlc3BvbnNlIH0gZnJvbSAnaHR0cCdcbmltcG9ydCB7IFBhc3NUaHJvdWdoIH0gZnJvbSAnc3RyZWFtJ1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAndXRpbCdcblxuLy8gVGhpcmQtcGFydHkgbW9kdWxlcy5cbmltcG9ydCBtb3JnYW4gZnJvbSAnbW9yZ2FuJ1xuaW1wb3J0ICogYXMgd2luc3RvbiBmcm9tICd3aW5zdG9uJ1xuaW1wb3J0IHR5cGUgeyBsZXZlbCBhcyBMb2dnaW5nTGV2ZWwsIExvZ2dlciBhcyBCYXNlTG9nZ2VyIH0gZnJvbSAnd2luc3RvbidcblxuLy8gRm9ybWF0dGVycy5cbmltcG9ydCBmb3JtYXRGb3JDTEkgZnJvbSAnLi4vZm9ybWF0dGVycy9jb21tYW5kLWxpbmUnXG5pbXBvcnQgZm9ybWF0Rm9yTW9yZ2FuIGZyb20gJy4uL2Zvcm1hdHRlcnMvbW9yZ2FuJ1xuXG4vLyBMb2NhbCBoZWxwZXJzLlxuaW1wb3J0IHsgRXhlY3V0aW9uTW9kZSwgZXhlY3V0aW9uTW9kZSB9IGZyb20gJy4uL2hlbHBlcnMvY29uc3RhbnRzJ1xuXG4vLyBIYW5kbGVyIGltcGxlbWVudGF0aW9ucy5cbmltcG9ydCB0eXBlIHsgTG9nZ2luZ0xldmVsTmFtZSB9IGZyb20gJy4uL2hhbmRsZXJzJ1xuaW1wb3J0IGhhbmRsZXJzIGZyb20gJy4uL2hhbmRsZXJzJ1xuXG4vLyBUeXBlIGRlZmluaXRpb25zLlxudHlwZSBNb3JnYW4gPSAocmVxOiBIdHRwUmVxdWVzdCwgcmVzOiBIdHRwUmVzcG9uc2UsIG5leHQ6IChlcnJvcj86IEVycm9yKSA9PiB2b2lkKSA9PiB2b2lkXG5cbi8vIFRyYW5zcG9ydHMuXG5jb25zdCB7IENvbnNvbGU6IENvbnNvbGVUcmFuc3BvcnQgfSA9IHdpbnN0b24udHJhbnNwb3J0c1xuXG5jbGFzcyBMb2dnZXIge1xuXHRzdGF0aWMgI2luc3RhbmNlPzogTG9nZ2VyXG5cblx0I2xvZ2dlcjogQmFzZUxvZ2dlciA9IHdpbnN0b24uY3JlYXRlTG9nZ2VyKHtcblx0XHRsZXZlbHM6IE9iamVjdC5mcm9tRW50cmllcyhcblx0XHRcdGhhbmRsZXJzXG5cdFx0XHRcdC5tYXAoKHsgbmFtZSwgbGV2ZWwgfSkgPT4gWyBuYW1lLCBsZXZlbCBdIGFzIGNvbnN0KVxuXHRcdFx0XHQuZmlsdGVyKChbICwgbGV2ZWwgXSkgPT4gdHlwZW9mIGxldmVsID09PSAnbnVtYmVyJyksXG5cdFx0KSxcblxuXHRcdGxldmVsOiAoZXhlY3V0aW9uTW9kZSA9PT0gRXhlY3V0aW9uTW9kZS5Qcm9kdWN0aW9uTW9kZSA/ICdodHRwJyA6ICd2ZXJib3NlJykgYXMgdHlwZW9mIExvZ2dpbmdMZXZlbCxcblxuXHRcdHRyYW5zcG9ydHM6IFtcblx0XHRcdG5ldyBDb25zb2xlVHJhbnNwb3J0KHsgZm9ybWF0OiBmb3JtYXRGb3JDTEkgfSksXG5cdFx0XSxcblxuXHRcdGV4aXRPbkVycm9yOiBmYWxzZSxcblx0fSlcblxuXHQjbW9yZ2FuOiBNb3JnYW4gPSBtb3JnYW4oZm9ybWF0Rm9yTW9yZ2FuLCB7XG5cdFx0c3RyZWFtOiBuZXcgUGFzc1Rocm91Z2goeyBvYmplY3RNb2RlOiB0cnVlIH0pLm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuXHRcdFx0dGhpcy5sb2coJ2h0dHAnLCBkYXRhLnRyaW0oKSlcblx0XHR9KSxcblx0fSkgYXMgTW9yZ2FuXG5cblx0cHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcblx0XHRpZiAobmV3LnRhcmdldCAhPT0gTG9nZ2VyKSB7XG5cdFx0XHR0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoJ0xvZ2dlciBjbGFzcyBpcyBub3QgaW5oZXJpdGFibGUnKVxuXHRcdH1cblxuXHRcdGlmIChMb2dnZXIuI2luc3RhbmNlKSB7XG5cdFx0XHR0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoJ0xvZ2dlciBjbGFzcyBjYW5ub3QgYmUgY29uc3RydWN0ZWQgaW4gZGlyZWN0bHknKVxuXHRcdH1cblxuXHRcdExvZ2dlci4jaW5zdGFuY2UgPSB0aGlzXG5cdH1cblxuXHQvKipcblx0ICogTG9nZ2luZyBtZXNzYWdlIHdpdGggc3BlY2lmaWMgbGV2ZWwuXG5cdCAqXG5cdCAqIEBwYXJhbSBsZXZlbFxuXHQgKiBAcGFyYW0gbWVzc2FnZVxuXHQgKiBAcGFyYW0gYXJncyBBZGRpdGlvbmFsIG1ldGFkYXRhLlxuXHQgKi9cblx0cHVibGljIGxvZyhsZXZlbDogTG9nZ2luZ0xldmVsTmFtZSwgbWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWRcblxuXHQvKipcblx0ICogTG9nZ2luZyBIVFRQIEkvTy5cblx0ICpcblx0ICogQHBhcmFtIHJlcXVlc3QgTm9kZS5qcyBidWlsdC1pbiBgSW5jb21pbmdNZXNzYWdlYCBpbnN0YW5jZSBmcm9tIGBodHRwYCBtb2R1bGUuXG5cdCAqIEBwYXJhbSByZXNwb25zZSBOb2RlLmpzIGJ1aWx0LWluIGBTZXJ2ZXJSZXNwb25zZWAgaW5zdGFuY2UgZnJvbSBgaHR0cGAgbW9kdWxlLlxuXHQgKi9cblx0cHVibGljIGxvZyhyZXF1ZXN0OiBIdHRwUmVxdWVzdCwgcmVzcG9uc2U6IEh0dHBSZXNwb25zZSk6IFByb21pc2U8dm9pZD5cblxuXHQvKipcblx0ICogTG9nZ2luZyBlcnJvcnMgaW4gZGV0YWlsLlxuXHQgKlxuXHQgKiBAcGFyYW0gZXJyb3Jcblx0ICovXG5cdHB1YmxpYyBsb2coZXJyb3I6IEVycm9yKTogdm9pZFxuXG5cdHB1YmxpYyBsb2coLi4uYXJnczogYW55W10pOiB2b2lkIHwgUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgbG9nZ2VyID0gdGhpcy4jbG9nZ2VyXG5cdFx0Y29uc3QgZm9ybWF0ID0gdGhpcy4jbW9yZ2FuXG5cblx0XHRzd2l0Y2ggKHRydWUpIHtcblx0XHRjYXNlIChhcmdzLmxlbmd0aCA+PSAyICYmIGFyZ3NbMF0gaW5zdGFuY2VvZiBIdHRwUmVxdWVzdCAmJiBhcmdzWzFdIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKToge1xuXHRcdFx0Y29uc3QgWyByZXF1ZXN0LCByZXNwb25zZSBdID0gYXJncyBhcyBbIEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2UgXVxuXG5cdFx0XHRyZXR1cm4gcHJvbWlzaWZ5KGZvcm1hdCkocmVxdWVzdCwgcmVzcG9uc2UpXG5cdFx0fVxuXG5cdFx0Y2FzZSAoYXJncy5sZW5ndGggPj0gMSAmJiBhcmdzWzBdIGluc3RhbmNlb2YgRXJyb3IpOiB7XG5cdFx0XHRjb25zdCBbIGVycm9yLCAuLi5kYXRhIF0gPSBhcmdzIGFzIFsgRXJyb3IsIC4uLmFueVtdIF1cblxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnRcblx0XHRcdGxvZ2dlci5sb2coJ2Vycm9yJywgZXJyb3IubWVzc2FnZSwgZXJyb3IsIC4uLmRhdGEpXG5cblx0XHRcdHJldHVybiB1bmRlZmluZWRcblx0XHR9XG5cblx0XHRkZWZhdWx0OiB7XG5cdFx0XHRjb25zdCBbIGxldmVsLCBtZXNzYWdlLCAuLi5kYXRhIF0gPSBhcmdzIGFzIFsgdHlwZW9mIExvZ2dpbmdMZXZlbCwgc3RyaW5nLCAuLi5hbnlbXSBdXG5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50XG5cdFx0XHRsb2dnZXIubG9nKGxldmVsLCBtZXNzYWdlLCAuLi5kYXRhKVxuXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkXG5cdFx0fVxuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBSZWZsZWN0LmNvbnN0cnVjdChMb2dnZXIsIFtdLCBMb2dnZXIpIGFzIExvZ2dlclxuIl0sIm5hbWVzIjpbIkxvZ2dpbmdMZXZlbCIsIkZhdGFsIiwiRXJyb3IiLCJXYXJuaW5nIiwiTm90aWNlIiwiSW5mbyIsIkh0dHAiLCJRdWVyeSIsIlZlcmJvc2UiLCJEZWJ1ZyIsImNvbG9yaXplck1hcCIsIl9NYXAiLCJjcmVhdGVTY2hlbWUiLCJvcHRpb25zIiwibmV4dEluZGV4Iiwic2l6ZSIsImNvbG9yaXplciIsImNoYWxrIiwiYmdIZXgiLCJiYWNrZ3JvdW5kIiwiaGV4IiwiZm9yZWdyb3VuZCIsInNldCIsIkNvbG9yVmFsdWUiLCJXaGl0ZSIsIkdyYXkiLCJCbGFjayIsIkNyaXRpY2FsIiwiUmVndWxhciIsIkNvbG9yU2NoZW1lIiwiTG91ZCIsImdldENoYWxrT2YiLCJjb2xvclNldCIsImdldCIsImlzVFRZIiwicHJvY2VzcyIsInN0ZG91dCIsImlzTm90T25DTEkiLCJkZWNvcmF0ZUxhYmVsIiwibGFiZWwiLCJzY2hlbWUiLCJkZWNvcmF0ZWRMYWJlbCIsImJvbGQiLCJyb290UGF0aCIsImN3ZCIsImNvbmp1bmN0aW9uIiwiYmx1ZSIsInNwbGF0IiwiX1N5bWJvbCRmb3IiLCJuYW1lIiwibGV2ZWwiLCJzaW1wbGlmeURhdGFVUkkiLCJkYXRhVVJJIiwiYWN0dWFsQ29udGVudCIsInNwbGl0IiwicGl2b3QiLCJfaW5kZXhPZkluc3RhbmNlUHJvcGVydHkiLCJjYWxsIiwibWltZUluZGljYXRvciIsIl9zbGljZUluc3RhbmNlUHJvcGVydHkiLCJjb250ZW50UHJlZml4IiwiY29udGVudFN1ZmZpeCIsImlzRGF0YVVSSSIsImZpbGVuYW1lIiwiX3N0YXJ0c1dpdGhJbnN0YW5jZVByb3BlcnR5IiwiaXNBYnNvbHV0ZU9yRGF0YVVSSSIsInBhdGgiLCJpc0Fic29sdXRlIiwibWFwTG9jYXRpb25PZkVycm9yVGhyb3duIiwidGFyZ2V0IiwicmVsYXRpdmUiLCJncmF5IiwiX2luY2x1ZGVzSW5zdGFuY2VQcm9wZXJ0eSIsIl9sYXN0SW5kZXhPZkluc3RhbmNlUHJvcGVydHkiLCJyZXBsYWNlIiwiXyIsIm1vZHVsZU5hbWUiLCJ0cmFpbGluZyIsInNlcCIsInVuZGVybGluZSIsImRpcm5hbWUiLCJiYXNlbmFtZSIsImhhbmRsZSIsImRhdGEiLCJfY29udGV4dCIsIl9jb250ZXh0MiIsIl9jb250ZXh0MyIsImVycm9yIiwidW5kZWZpbmVkIiwiZXJyb3JOYW1lIiwibWVzc2FnZSIsInN0YWNrIiwicmF3U3RhY2siLCJfbWFwSW5zdGFuY2VQcm9wZXJ0eSIsImxlbmd0aCIsImxpbmUiLCJjb250ZXh0TmFtZSIsInJhd0xvY2F0aW9uIiwibG9jYXRpb24iLCJvY2N1cnJlZExpbmUiLCJ2ZXJzaW9uIiwib2NjdXJyZWRDb2x1bW4iLCJqb2luIiwicGF5bG9hZCIsImhpZ2hsaWdodCIsImxhbmd1YWdlIiwiaGFuZGxlcnMiLCJGYXRhbEhhbmRsZXIiLCJFcnJvckhhbmRsZXIiLCJXYXJuaW5nSGFuZGxlciIsIk5vdGljZUhhbmRsZXIiLCJJbmZvSGFuZGxlciIsIkh0dHBIYW5kbGVyIiwiUXVlcnlIYW5kbGVyIiwiVmVyYm9zZUhhbmRsZXIiLCJEZWJ1Z0hhbmRsZXIiLCJmb3JtYXQiLCJwcmludGYiLCJ0aW1lc3RhbXAiLCJEYXRlVGltZSIsIm5vdyIsInRvSVNPIiwiaW5jbHVkZU9mZnNldCIsImhhbmRsZXIiLCJfZmluZEluc3RhbmNlUHJvcGVydHkiLCJmYWxsYmFjayIsInBlcmZvcm1IYW5kbGUiLCJkZWZhdWx0IiwiX1JlZmxlY3QkYXBwbHkiLCJleHRyYUZpbmdlcnByaW50IiwidHJhbnNhY3Rpb25JZCIsInJUcmFjZXIiLCJpZCIsIkV4ZWN1dGlvbk1vZGUiLCJEZXZlbG9wbWVudE1vZGUiLCJQcm9kdWN0aW9uTW9kZSIsIkNsdXN0ZXJpbmdNb2RlIiwiTWFzdGVyUHJvY2VzcyIsIldvcmtlclByb2Nlc3MiLCJleGVjdXRpb25Nb2RlIiwiZW52aXJvbm1lbnRzIiwiTk9ERV9FTlYiLCJjbHVzdGVyIiwiaXNQcmltYXJ5IiwiaXNNYXN0ZXIiLCJkZWNvcmF0ZVN0YXR1c0NvZGUiLCJzdGF0dXNDb2RlIiwiZ3JvdXBPZkNvZGUiLCJNYXRoIiwiZmxvb3IiLCJOdW1iZXIiLCJiYXNlTWVzc2FnZSIsIlNUQVRVU19DT0RFUyIsImdyZWVuIiwibWFnZW50YSIsInJlZCIsImZvcm1hdEZvck1vcmdhbiIsInRva2VucyIsInJlcXVlc3QiLCJyZXNwb25zZSIsInRva2VuIiwic3ViQXJncyIsIm1ldGhvZCIsIlVSTCIsImh0dHBWZXJzaW9uIiwiY29udGVudExlbmd0aCIsInJlc3BvbnNlVGltZSIsIiRtZXRob2QiLCIkdmVyc2lvbiIsInJnYiIsIiRzdGF0dXNDb2RlIiwiJGNvbnRlbnRMZW5ndGgiLCJwcmV0dHlCeXRlcyIsIiRyZXNwb25zZVRpbWUiLCJwcmV0dHlNcyIsIm1ldGFkYXRhIiwibW9yZ2FuIiwiY29tYmluZWQiLCJDb25zb2xlIiwiQ29uc29sZVRyYW5zcG9ydCIsIndpbnN0b24iLCJ0cmFuc3BvcnRzIiwiTG9nZ2VyIiwiY3JlYXRlTG9nZ2VyIiwibGV2ZWxzIiwiX09iamVjdCRmcm9tRW50cmllcyIsIl9maWx0ZXJJbnN0YW5jZVByb3BlcnR5IiwiZm9ybWF0Rm9yQ0xJIiwiZXhpdE9uRXJyb3IiLCJzdHJlYW0iLCJQYXNzVGhyb3VnaCIsIm9iamVjdE1vZGUiLCJvbiIsImxvZyIsIl90cmltSW5zdGFuY2VQcm9wZXJ0eSIsImNvbnN0cnVjdG9yIiwibmV3IiwiUmVmZXJlbmNlRXJyb3IiLCJhcmdzIiwibG9nZ2VyIiwiSHR0cFJlcXVlc3QiLCJIdHRwUmVzcG9uc2UiLCJwcm9taXNpZnkiLCJfUmVmbGVjdCRjb25zdHJ1Y3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE1BQU1BLFlBQVksR0FBRztBQUNwQjtBQUNBQyxFQUFBQSxLQUFLLEVBQUUsQ0FBQztBQUNSQyxFQUFBQSxLQUFLLEVBQUUsQ0FBQztBQUVSO0FBQ0FDLEVBQUFBLE9BQU8sRUFBRSxDQUFDO0FBRVY7QUFDQUMsRUFBQUEsTUFBTSxFQUFFLENBQUM7QUFDVEMsRUFBQUEsSUFBSSxFQUFFLENBQUM7QUFFUDtBQUNBQyxFQUFBQSxJQUFJLEVBQUUsQ0FBQztBQUNQQyxFQUFBQSxLQUFLLEVBQUUsQ0FBQztBQUVSO0FBQ0FDLEVBQUFBLE9BQU8sRUFBRSxDQUFDO0FBQ1ZDLEVBQUFBLEtBQUssRUFBRTtBQUNSLENBQVU7O0FDaEJWO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLElBQUFDLElBQUEsRUFBZ0M7O0FBRXJEO0FBQ0EsU0FBU0MsWUFBWUEsQ0FBQ0MsT0FBMkQsRUFBVTtBQUMxRixFQUFBLE1BQU1D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
|