@appium/support 2.55.0 → 2.55.4

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.
@@ -0,0 +1,537 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ require("source-map-support/register");
6
+
7
+ var _lib = require("../lib");
8
+
9
+ var _bluebird = _interopRequireDefault(require("bluebird"));
10
+
11
+ var _sinon = _interopRequireDefault(require("sinon"));
12
+
13
+ var _os = _interopRequireDefault(require("os"));
14
+
15
+ var _path = _interopRequireDefault(require("path"));
16
+
17
+ var _lodash = _interopRequireDefault(require("lodash"));
18
+
19
+ const {
20
+ W3C_WEB_ELEMENT_IDENTIFIER
21
+ } = _lib.util;
22
+ describe('util', function () {
23
+ describe('hasValue', function () {
24
+ it('should exist', function () {
25
+ should.exist(_lib.util.hasValue);
26
+ });
27
+ it('should handle undefined', function () {
28
+ _lib.util.hasValue(undefined).should.be.false;
29
+ });
30
+ it('should handle not a number', function () {
31
+ _lib.util.hasValue(NaN).should.be.false;
32
+ });
33
+ it('should handle null', function () {
34
+ _lib.util.hasValue(null).should.be.false;
35
+ });
36
+ it('should handle functions', function () {
37
+ _lib.util.hasValue(function () {}).should.be.true;
38
+ });
39
+ it('should handle empty arrays', function () {
40
+ _lib.util.hasValue({}).should.be.true;
41
+ });
42
+ it('should handle zero', function () {
43
+ _lib.util.hasValue(0).should.be.true;
44
+ });
45
+ it('should handle simple string', function () {
46
+ _lib.util.hasValue('string').should.be.true;
47
+ });
48
+ it('should handle booleans', function () {
49
+ _lib.util.hasValue(false).should.be.true;
50
+ });
51
+ it('should handle empty strings', function () {
52
+ _lib.util.hasValue('').should.be.true;
53
+ });
54
+ });
55
+ describe('hasContent', function () {
56
+ it('should exist', function () {
57
+ should.exist(_lib.util.hasContent);
58
+ });
59
+ it('should handle undefined', function () {
60
+ _lib.util.hasContent(undefined).should.be.false;
61
+ });
62
+ it('should handle not a number', function () {
63
+ _lib.util.hasContent(NaN).should.be.false;
64
+ });
65
+ it('should handle null', function () {
66
+ _lib.util.hasContent(null).should.be.false;
67
+ });
68
+ it('should handle functions', function () {
69
+ _lib.util.hasContent(function () {}).should.be.false;
70
+ });
71
+ it('should handle empty arrays', function () {
72
+ _lib.util.hasContent({}).should.be.false;
73
+ });
74
+ it('should handle zero', function () {
75
+ _lib.util.hasContent(0).should.be.false;
76
+ });
77
+ it('should handle simple string', function () {
78
+ _lib.util.hasContent('string').should.be.true;
79
+ });
80
+ it('should handle booleans', function () {
81
+ _lib.util.hasContent(false).should.be.false;
82
+ });
83
+ it('should handle empty strings', function () {
84
+ _lib.util.hasContent('').should.be.false;
85
+ });
86
+ });
87
+ describe('escapeSpace', function () {
88
+ it('should do nothing to a string without space', function () {
89
+ let actual = 'appium';
90
+ let expected = 'appium';
91
+
92
+ _lib.util.escapeSpace(actual).should.equal(expected);
93
+ });
94
+ it('should do escape spaces', function () {
95
+ let actual = '/Applications/ Xcode 6.1.1.app/Contents/Developer';
96
+ let expected = '/Applications/\\ Xcode\\ 6.1.1.app/Contents/Developer';
97
+
98
+ _lib.util.escapeSpace(actual).should.equal(expected);
99
+ });
100
+ it('should escape consecutive spaces', function () {
101
+ let actual = 'appium space';
102
+ let expected = 'appium\\ \\ \\ space';
103
+
104
+ _lib.util.escapeSpace(actual).should.equal(expected);
105
+ });
106
+ });
107
+ describe('localIp', function () {
108
+ it('should find a local ip address', function () {
109
+ let ifConfigOut = {
110
+ lo0: [{
111
+ address: '::1',
112
+ netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
113
+ family: 'IPv6',
114
+ mac: '00:00:00:00:00:00',
115
+ scopeid: 0,
116
+ internal: true
117
+ }, {
118
+ address: '127.0.0.1',
119
+ netmask: '255.0.0.0',
120
+ family: 'IPv4',
121
+ mac: '00:00:00:00:00:00',
122
+ internal: true
123
+ }, {
124
+ address: 'fe80::1',
125
+ netmask: 'ffff:ffff:ffff:ffff::',
126
+ family: 'IPv6',
127
+ mac: '00:00:00:00:00:00',
128
+ scopeid: 1,
129
+ internal: true
130
+ }],
131
+ en0: [{
132
+ address: 'xxx',
133
+ netmask: 'ffff:ffff:ffff:ffff::',
134
+ family: 'IPv6',
135
+ mac: 'd0:e1:40:93:56:9a',
136
+ scopeid: 4,
137
+ internal: false
138
+ }, {
139
+ address: '123.123.123.123',
140
+ netmask: '255.255.254.0',
141
+ family: 'IPv4',
142
+ mac: 'xxx',
143
+ internal: false
144
+ }],
145
+ awdl0: [{
146
+ address: 'xxx',
147
+ netmask: 'ffff:ffff:ffff:ffff::',
148
+ family: 'IPv6',
149
+ mac: 'xxx',
150
+ scopeid: 7,
151
+ internal: false
152
+ }]
153
+ };
154
+
155
+ let osMock = _sinon.default.mock(_os.default);
156
+
157
+ osMock.expects('networkInterfaces').returns(ifConfigOut);
158
+ ifConfigOut = '';
159
+
160
+ let ip = _lib.util.localIp();
161
+
162
+ ip.should.eql('123.123.123.123');
163
+ osMock.verify();
164
+ });
165
+ });
166
+ describe('cancellableDelay', function () {
167
+ it('should delay', async function () {
168
+ await _lib.util.cancellableDelay('10');
169
+ });
170
+ it('cancel should work', async function () {
171
+ let delay = _lib.util.cancellableDelay('1000');
172
+
173
+ await _bluebird.default.delay(10);
174
+ delay.cancel();
175
+ await delay.should.eventually.be.rejectedWith(/cancellation error/);
176
+ });
177
+ });
178
+ describe('safeJsonParse', function () {
179
+ it('should pass object through', function () {
180
+ const obj = {
181
+ a: 'a',
182
+ b: 'b'
183
+ };
184
+
185
+ _lib.util.safeJsonParse(obj).should.equal(obj);
186
+ });
187
+ it('should correctly parse json string', function () {
188
+ const obj = {
189
+ a: 'a',
190
+ b: 'b'
191
+ };
192
+
193
+ _lib.util.safeJsonParse(JSON.stringify(obj)).should.eql(obj);
194
+ });
195
+ it('should pass an array through', function () {
196
+ const arr = ['a', 'b'];
197
+
198
+ _lib.util.safeJsonParse(arr).should.eql(arr);
199
+ });
200
+ it('should correctly parse json array', function () {
201
+ const arr = ['a', 'b'];
202
+
203
+ _lib.util.safeJsonParse(JSON.stringify(arr)).should.eql(arr);
204
+ });
205
+ it('should pass null through', function () {
206
+ const obj = null;
207
+ _lodash.default.isNull(_lib.util.safeJsonParse(obj)).should.be.true;
208
+ });
209
+ it('should pass simple string through', function () {
210
+ const str = 'str';
211
+
212
+ _lib.util.safeJsonParse(str).should.eql(str);
213
+ });
214
+ it('should pass a number through', function () {
215
+ const num = 42;
216
+
217
+ _lib.util.safeJsonParse(num).should.eql(num);
218
+ });
219
+ it('should make a number from a string representation', function () {
220
+ const num = 42;
221
+
222
+ _lib.util.safeJsonParse(String(num)).should.eql(num);
223
+ });
224
+ });
225
+ describe('jsonStringify', function () {
226
+ it('should use JSON.stringify if no Buffer involved', function () {
227
+ const obj = {
228
+ k1: 'v1',
229
+ k2: 'v2',
230
+ k3: 'v3'
231
+ };
232
+ const jsonString = JSON.stringify(obj, null, 2);
233
+
234
+ _lib.util.jsonStringify(obj).should.eql(jsonString);
235
+ });
236
+ it('should serialize a Buffer', function () {
237
+ const obj = {
238
+ k1: 'v1',
239
+ k2: 'v2',
240
+ k3: Buffer.from('hi how are you today')
241
+ };
242
+
243
+ _lib.util.jsonStringify(obj).should.include('hi how are you today');
244
+ });
245
+ it('should use the replacer function on non-buffer values', function () {
246
+ const obj = {
247
+ k1: 'v1',
248
+ k2: 'v2',
249
+ k3: 'v3'
250
+ };
251
+
252
+ function replacer(key, value) {
253
+ return _lodash.default.isString(value) ? value.toUpperCase() : value;
254
+ }
255
+
256
+ const jsonString = _lib.util.jsonStringify(obj, replacer);
257
+
258
+ jsonString.should.include('V1');
259
+ jsonString.should.include('V2');
260
+ jsonString.should.include('V3');
261
+ });
262
+ it('should use the replacer function on buffers', function () {
263
+ const obj = {
264
+ k1: 'v1',
265
+ k2: 'v2',
266
+ k3: Buffer.from('hi how are you today')
267
+ };
268
+
269
+ function replacer(key, value) {
270
+ return _lodash.default.isString(value) ? value.toUpperCase() : value;
271
+ }
272
+
273
+ const jsonString = _lib.util.jsonStringify(obj, replacer);
274
+
275
+ jsonString.should.include('V1');
276
+ jsonString.should.include('V2');
277
+ jsonString.should.include('HI HOW ARE YOU TODAY');
278
+ });
279
+ it('should use the replacer function recursively', function () {
280
+ const obj = {
281
+ k1: 'v1',
282
+ k2: 'v2',
283
+ k3: Buffer.from('hi how are you today'),
284
+ k4: {
285
+ k5: 'v5'
286
+ }
287
+ };
288
+
289
+ function replacer(key, value) {
290
+ return _lodash.default.isString(value) ? value.toUpperCase() : value;
291
+ }
292
+
293
+ const jsonString = _lib.util.jsonStringify(obj, replacer);
294
+
295
+ jsonString.should.include('V1');
296
+ jsonString.should.include('V2');
297
+ jsonString.should.include('HI HOW ARE YOU TODAY');
298
+ jsonString.should.include('V5');
299
+ });
300
+ });
301
+ describe('unwrapElement', function () {
302
+ it('should pass through an unwrapped element', function () {
303
+ let el = 4;
304
+
305
+ _lib.util.unwrapElement(el).should.equal(el);
306
+ });
307
+ it('should pass through an element that is an object', function () {
308
+ let el = {
309
+ RANDOM: 4
310
+ };
311
+
312
+ _lib.util.unwrapElement(el).should.equal(el);
313
+ });
314
+ it('should unwrap a wrapped element', function () {
315
+ let el = {
316
+ ELEMENT: 4
317
+ };
318
+
319
+ _lib.util.unwrapElement(el).should.eql(4);
320
+ });
321
+ it('should unwrap a wrapped element that uses W3C element identifier', function () {
322
+ let el = {
323
+ [W3C_WEB_ELEMENT_IDENTIFIER]: 5
324
+ };
325
+
326
+ _lib.util.unwrapElement(el).should.eql(5);
327
+ });
328
+ it('should unwrap a wrapped element and prioritize W3C element identifier', function () {
329
+ let el = {
330
+ ELEMENT: 7,
331
+ [W3C_WEB_ELEMENT_IDENTIFIER]: 6
332
+ };
333
+
334
+ _lib.util.unwrapElement(el).should.eql(6);
335
+ });
336
+ });
337
+ describe('wrapElement', function () {
338
+ it('should include ELEMENT and w3c element', function () {
339
+ _lib.util.wrapElement(123).should.eql({
340
+ [_lib.util.W3C_WEB_ELEMENT_IDENTIFIER]: 123,
341
+ ELEMENT: 123
342
+ });
343
+ });
344
+ });
345
+ describe('toReadableSizeString', function () {
346
+ it('should fail if cannot convert to Bytes', function () {
347
+ (() => _lib.util.toReadableSizeString('asdasd')).should.throw(/Cannot convert/);
348
+ });
349
+ it('should properly convert to Bytes', function () {
350
+ _lib.util.toReadableSizeString(0).should.equal('0 B');
351
+ });
352
+ it('should properly convert to KBytes', function () {
353
+ _lib.util.toReadableSizeString(2048 + 12).should.equal('2.01 KB');
354
+ });
355
+ it('should properly convert to MBytes', function () {
356
+ _lib.util.toReadableSizeString(1024 * 1024 * 3 + 1024 * 10).should.equal('3.01 MB');
357
+ });
358
+ it('should properly convert to GBytes', function () {
359
+ _lib.util.toReadableSizeString(1024 * 1024 * 1024 * 5).should.equal('5.00 GB');
360
+ });
361
+ });
362
+ describe('filterObject', function () {
363
+ describe('with undefined predicate', function () {
364
+ it('should filter out undefineds', function () {
365
+ let obj = {
366
+ a: 'a',
367
+ b: 'b',
368
+ c: undefined
369
+ };
370
+
371
+ _lib.util.filterObject(obj).should.eql({
372
+ a: 'a',
373
+ b: 'b'
374
+ });
375
+ });
376
+ it('should leave nulls alone', function () {
377
+ let obj = {
378
+ a: 'a',
379
+ b: 'b',
380
+ c: null
381
+ };
382
+
383
+ _lib.util.filterObject(obj).should.eql({
384
+ a: 'a',
385
+ b: 'b',
386
+ c: null
387
+ });
388
+ });
389
+ });
390
+ describe('with value predicate', function () {
391
+ it('should filter elements by their value', function () {
392
+ let obj = {
393
+ a: 'a',
394
+ b: 'b',
395
+ c: 'c',
396
+ d: 'a'
397
+ };
398
+
399
+ _lib.util.filterObject(obj, 'a').should.eql({
400
+ a: 'a',
401
+ d: 'a'
402
+ });
403
+ });
404
+ });
405
+ describe('with function predicate', function () {
406
+ it('should filter elements', function () {
407
+ let obj = {
408
+ a: 'a',
409
+ b: 'b',
410
+ c: 'c'
411
+ };
412
+
413
+ _lib.util.filterObject(obj, v => v === 'a' || v === 'c').should.eql({
414
+ a: 'a',
415
+ c: 'c'
416
+ });
417
+ });
418
+ });
419
+ });
420
+ describe('isSubPath', function () {
421
+ it('should detect simple subpath', function () {
422
+ _lib.util.isSubPath('/root/some', '/root').should.be.true;
423
+ });
424
+ it('should detect complex subpath', function () {
425
+ _lib.util.isSubPath('/root/some/other/../../.', '/root').should.be.true;
426
+ });
427
+ it('should detect subpath ending with a slash', function () {
428
+ _lib.util.isSubPath('/root/some/', '/root').should.be.true;
429
+ });
430
+ it('should detect if a path is not a subpath', function () {
431
+ _lib.util.isSubPath('/root/some//../..', '/root').should.be.false;
432
+ });
433
+ it('should throw if any of the given paths is not absolute', function () {
434
+ should.throw(() => _lib.util.isSubPath('some/..', '/root'), /absolute/);
435
+ });
436
+ });
437
+ describe('isSameDestination', function () {
438
+ let path1;
439
+ let path2;
440
+ let tmpDir;
441
+ before(async function () {
442
+ tmpDir = await _lib.tempDir.openDir();
443
+ path1 = _path.default.resolve(tmpDir, 'path1.txt');
444
+ path2 = _path.default.resolve(tmpDir, 'path2.txt');
445
+
446
+ for (const p of [path1, path2]) {
447
+ await _lib.fs.writeFile(p, p, 'utf8');
448
+ }
449
+ });
450
+ after(async function () {
451
+ await _lib.fs.rimraf(tmpDir);
452
+ });
453
+ it('should match paths to the same file/folder', async function () {
454
+ (await _lib.util.isSameDestination(path1, _path.default.resolve(tmpDir, '..', _path.default.basename(tmpDir), _path.default.basename(path1)))).should.be.true;
455
+ });
456
+ it('should not match paths if they point to non existing items', async function () {
457
+ (await _lib.util.isSameDestination(path1, 'blabla')).should.be.false;
458
+ });
459
+ it('should not match paths to different files', async function () {
460
+ (await _lib.util.isSameDestination(path1, path2)).should.be.false;
461
+ });
462
+ });
463
+ describe('compareVersions', function () {
464
+ it('should compare two correct version numbers', function () {
465
+ _lib.util.compareVersions('10.0', '<', '11.0').should.eql(true);
466
+
467
+ _lib.util.compareVersions('11.0', '>=', '11.0').should.eql(true);
468
+
469
+ _lib.util.compareVersions('11.0', '==', '11.0').should.eql(true);
470
+
471
+ _lib.util.compareVersions('13.10', '>', '13.5').should.eql(true);
472
+
473
+ _lib.util.compareVersions('11.1', '!=', '11.10').should.eql(true);
474
+
475
+ _lib.util.compareVersions('12.0', '<', 10).should.eql(false);
476
+ });
477
+ it('should throw if any of version arguments is invalid', function () {
478
+ should.throw(() => _lib.util.compareVersions(undefined, '<', '11.0'));
479
+ should.throw(() => _lib.util.compareVersions('11.0', '==', null));
480
+ });
481
+ it('should throw if comparison operator is unsupported', function () {
482
+ should.throw(() => _lib.util.compareVersions('12.0', 'abc', 10));
483
+ });
484
+ });
485
+ describe('quote', function () {
486
+ it('should quote a string with a space', function () {
487
+ _lib.util.quote(['a', 'b', 'c d']).should.eql('a b \'c d\'');
488
+ });
489
+ it('should escape double quotes', function () {
490
+ _lib.util.quote(['a', 'b', `it's a "neat thing"`]).should.eql(`a b "it's a \\"neat thing\\""`);
491
+ });
492
+ it("should escape $ ` and '", function () {
493
+ _lib.util.quote(['$', '`', `'`]).should.eql('\\$ \\` "\'"');
494
+ });
495
+ it('should handle empty array', function () {
496
+ _lib.util.quote([]).should.eql('');
497
+ });
498
+ it('should quote a string with newline', function () {
499
+ _lib.util.quote(['a\nb']).should.eql(`'a\nb'`);
500
+ });
501
+ it('should stringify booleans', function () {
502
+ _lib.util.quote(['a', 1, true, false]).should.eql('a 1 true false');
503
+ });
504
+ it('should stringify null and undefined', function () {
505
+ _lib.util.quote(['a', 1, null, undefined]).should.eql('a 1 null undefined');
506
+ });
507
+ });
508
+ describe('unleakString', function () {
509
+ it('should unleak a string', function () {
510
+ _lib.util.unleakString('yolo').should.eql('yolo');
511
+ });
512
+ it('should unleak a multiline string', function () {
513
+ _lib.util.unleakString(' yolo\nbolo ').should.eql(' yolo\nbolo ');
514
+ });
515
+ it('should convert an object to a string', function () {
516
+ for (const obj of [{}, null, undefined, [], 0]) {
517
+ _lib.util.unleakString(obj).should.eql(`${obj}`);
518
+ }
519
+ });
520
+ });
521
+ describe('pluralize', function () {
522
+ it('should pluralize a string', function () {
523
+ _lib.util.pluralize('word', 2).should.eql('words');
524
+ });
525
+ it('should pluralize a string and prepend the number through boolean', function () {
526
+ _lib.util.pluralize('word', 2, true).should.eql('2 words');
527
+ });
528
+ it('should pluralize a string and prepend the number through options', function () {
529
+ _lib.util.pluralize('word', 2, {
530
+ inclusive: true
531
+ }).should.eql('2 words');
532
+ });
533
+ });
534
+ });require('source-map-support').install();
535
+
536
+
537
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvdXRpbC1zcGVjcy5qcyJdLCJuYW1lcyI6WyJXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUiIsInV0aWwiLCJkZXNjcmliZSIsIml0Iiwic2hvdWxkIiwiZXhpc3QiLCJoYXNWYWx1ZSIsInVuZGVmaW5lZCIsImJlIiwiZmFsc2UiLCJOYU4iLCJ0cnVlIiwiaGFzQ29udGVudCIsImFjdHVhbCIsImV4cGVjdGVkIiwiZXNjYXBlU3BhY2UiLCJlcXVhbCIsImlmQ29uZmlnT3V0IiwibG8wIiwiYWRkcmVzcyIsIm5ldG1hc2siLCJmYW1pbHkiLCJtYWMiLCJzY29wZWlkIiwiaW50ZXJuYWwiLCJlbjAiLCJhd2RsMCIsIm9zTW9jayIsInNpbm9uIiwibW9jayIsIm9zIiwiZXhwZWN0cyIsInJldHVybnMiLCJpcCIsImxvY2FsSXAiLCJlcWwiLCJ2ZXJpZnkiLCJjYW5jZWxsYWJsZURlbGF5IiwiZGVsYXkiLCJCIiwiY2FuY2VsIiwiZXZlbnR1YWxseSIsInJlamVjdGVkV2l0aCIsIm9iaiIsImEiLCJiIiwic2FmZUpzb25QYXJzZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJhcnIiLCJfIiwiaXNOdWxsIiwic3RyIiwibnVtIiwiU3RyaW5nIiwiazEiLCJrMiIsImszIiwianNvblN0cmluZyIsImpzb25TdHJpbmdpZnkiLCJCdWZmZXIiLCJmcm9tIiwiaW5jbHVkZSIsInJlcGxhY2VyIiwia2V5IiwidmFsdWUiLCJpc1N0cmluZyIsInRvVXBwZXJDYXNlIiwiazQiLCJrNSIsImVsIiwidW53cmFwRWxlbWVudCIsIlJBTkRPTSIsIkVMRU1FTlQiLCJ3cmFwRWxlbWVudCIsInRvUmVhZGFibGVTaXplU3RyaW5nIiwidGhyb3ciLCJjIiwiZmlsdGVyT2JqZWN0IiwiZCIsInYiLCJpc1N1YlBhdGgiLCJwYXRoMSIsInBhdGgyIiwidG1wRGlyIiwiYmVmb3JlIiwidGVtcERpciIsIm9wZW5EaXIiLCJwYXRoIiwicmVzb2x2ZSIsInAiLCJmcyIsIndyaXRlRmlsZSIsImFmdGVyIiwicmltcmFmIiwiaXNTYW1lRGVzdGluYXRpb24iLCJiYXNlbmFtZSIsImNvbXBhcmVWZXJzaW9ucyIsInF1b3RlIiwidW5sZWFrU3RyaW5nIiwicGx1cmFsaXplIiwiaW5jbHVzaXZlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNO0FBQUNBLEVBQUFBO0FBQUQsSUFBK0JDLFNBQXJDO0FBSUFDLFFBQVEsQ0FBQyxNQUFELEVBQVMsWUFBWTtBQUMzQkEsRUFBQUEsUUFBUSxDQUFDLFVBQUQsRUFBYSxZQUFZO0FBQy9CQyxJQUFBQSxFQUFFLENBQUMsY0FBRCxFQUFpQixZQUFZO0FBQzdCQyxNQUFBQSxNQUFNLENBQUNDLEtBQVAsQ0FBYUosVUFBS0ssUUFBbEI7QUFDRCxLQUZDLENBQUY7QUFJQUgsSUFBQUEsRUFBRSxDQUFDLHlCQUFELEVBQTRCLFlBQVk7QUFDeENGLGdCQUFLSyxRQUFMLENBQWNDLFNBQWQsRUFBeUJILE1BQXpCLENBQWdDSSxFQUFoQyxDQUFtQ0MsS0FBbkM7QUFDRCxLQUZDLENBQUY7QUFJQU4sSUFBQUEsRUFBRSxDQUFDLDRCQUFELEVBQStCLFlBQVk7QUFDM0NGLGdCQUFLSyxRQUFMLENBQWNJLEdBQWQsRUFBbUJOLE1BQW5CLENBQTBCSSxFQUExQixDQUE2QkMsS0FBN0I7QUFDRCxLQUZDLENBQUY7QUFJQU4sSUFBQUEsRUFBRSxDQUFDLG9CQUFELEVBQXVCLFlBQVk7QUFDbkNGLGdCQUFLSyxRQUFMLENBQWMsSUFBZCxFQUFvQkYsTUFBcEIsQ0FBMkJJLEVBQTNCLENBQThCQyxLQUE5QjtBQUNELEtBRkMsQ0FBRjtBQUlBTixJQUFBQSxFQUFFLENBQUMseUJBQUQsRUFBNEIsWUFBWTtBQUN4Q0YsZ0JBQUtLLFFBQUwsQ0FBYyxZQUFZLENBQUUsQ0FBNUIsRUFBOEJGLE1BQTlCLENBQXFDSSxFQUFyQyxDQUF3Q0csSUFBeEM7QUFDRCxLQUZDLENBQUY7QUFJQVIsSUFBQUEsRUFBRSxDQUFD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cG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5jb25zdCB7VzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVJ9ID0gdXRpbDtcblxuXG5cbmRlc2NyaWJlKCd1dGlsJywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnaGFzVmFsdWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBleGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5leGlzdCh1dGlsLmhhc1ZhbHVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHVuZGVmaW5lZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaGFzVmFsdWUodW5kZWZpbmVkKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBub3QgYSBudW1iZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmhhc1ZhbHVlKE5hTikuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbnVsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaGFzVmFsdWUobnVsbCkuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZnVuY3Rpb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5oYXNWYWx1ZShmdW5jdGlvbiAoKSB7fSkuc2hvdWxkLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSBhcnJheXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmhhc1ZhbHVlKHt9KS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHplcm8nLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmhhc1ZhbHVlKDApLnNob3VsZC5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgc2ltcGxlIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaGFzVmFsdWUoJ3N0cmluZycpLnNob3VsZC5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgYm9vbGVhbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmhhc1ZhbHVlKGZhbHNlKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGVtcHR5IHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmhhc1ZhbHVlKCcnKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2hhc0NvbnRlbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBleGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5leGlzdCh1dGlsLmhhc0NvbnRlbnQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgdW5kZWZpbmVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5oYXNDb250ZW50KHVuZGVmaW5lZCkuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbm90IGEgbnVtYmVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5oYXNDb250ZW50KE5hTikuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbnVsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaGFzQ29udGVudChudWxsKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBmdW5jdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmhhc0NvbnRlbnQoZnVuY3Rpb24gKCkge30pLnNob3VsZC5iZS5mYWxzZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGVtcHR5IGFycmF5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaGFzQ29udGVudCh7fSkuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgemVybycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaGFzQ29udGVudCgwKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBzaW1wbGUgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5oYXNDb250ZW50KCdzdHJpbmcnKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGJvb2xlYW5zJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5oYXNDb250ZW50KGZhbHNlKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSBzdHJpbmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5oYXNDb250ZW50KCcnKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlc2NhcGVTcGFjZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGRvIG5vdGhpbmcgdG8gYSBzdHJpbmcgd2l0aG91dCBzcGFjZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBhY3R1YWwgPSAnYXBwaXVtJztcbiAgICAgIGxldCBleHBlY3RlZCA9ICdhcHBpdW0nO1xuICAgICAgdXRpbC5lc2NhcGVTcGFjZShhY3R1YWwpLnNob3VsZC5lcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRvIGVzY2FwZSBzcGFjZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgYWN0dWFsID0gJy9BcHBsaWNhdGlvbnMvIFhjb2RlIDYuMS4xLmFwcC9Db250ZW50cy9EZXZlbG9wZXInO1xuICAgICAgbGV0IGV4cGVjdGVkID0gJy9BcHBsaWNhdGlvbnMvXFxcXCBYY29kZVxcXFwgNi4xLjEuYXBwL0NvbnRlbnRzL0RldmVsb3Blcic7XG4gICAgICB1dGlsLmVzY2FwZVNwYWNlKGFjdHVhbCkuc2hvdWxkLmVxdWFsKGV4cGVjdGVkKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXNjYXBlIGNvbnNlY3V0aXZlIHNwYWNlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBhY3R1YWwgPSAnYXBwaXVtICAgc3BhY2UnO1xuICAgICAgbGV0IGV4cGVjdGVkID0gJ2FwcGl1bVxcXFwgXFxcXCBcXFxcIHNwYWNlJztcbiAgICAgIHV0aWwuZXNjYXBlU3BhY2UoYWN0dWFsKS5zaG91bGQuZXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbG9jYWxJcCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGZpbmQgYSBsb2NhbCBpcCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGlmQ29uZmlnT3V0ID0ge1xuICAgICAgICBsbzA6XG4gICAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnOjoxJyxcbiAgICAgICAgICAgICAgbmV0bWFzazogJ2ZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZicsXG4gICAgICAgICAgICAgIGZhbWlseTogJ0lQdjYnLFxuICAgICAgICAgICAgICBtYWM6ICcwMDowMDowMDowMDowMDowMCcsXG4gICAgICAgICAgICAgIHNjb3BlaWQ6IDAsXG4gICAgICAgICAgICAgIGludGVybmFsOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogJzEyNy4wLjAuMScsXG4gICAgICAgICAgICAgIG5ldG1hc2s6ICcyNTUuMC4wLjAnLFxuICAgICAgICAgICAgICBmYW1pbHk6ICdJUHY0JyxcbiAgICAgICAgICAgICAgbWFjOiAnMDA6MDA6MDA6MDA6MDA6MDAnLFxuICAgICAgICAgICAgICBpbnRlcm5hbDogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICdmZTgwOjoxJyxcbiAgICAgICAgICAgICAgbmV0bWFzazogJ2ZmZmY6ZmZmZjpmZmZmOmZmZmY6OicsXG4gICAgICAgICAgICAgIGZhbWlseTogJ0lQdjYnLFxuICAgICAgICAgICAgICBtYWM6ICcwMDowMDowMDowMDowMDowMCcsXG4gICAgICAgICAgICAgIHNjb3BlaWQ6IDEsXG4gICAgICAgICAgICAgIGludGVybmFsOiB0cnVlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgIGVuMDpcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICd4eHgnLFxuICAgICAgICAgICAgICBuZXRtYXNrOiAnZmZmZjpmZmZmOmZmZmY6ZmZmZjo6JyxcbiAgICAgICAgICAgICAgZmFtaWx5OiAnSVB2NicsXG4gICAgICAgICAgICAgIG1hYzogJ2QwOmUxOjQwOjkzOjU2OjlhJyxcbiAgICAgICAgICAgICAgc2NvcGVpZDogNCxcbiAgICAgICAgICAgICAgaW50ZXJuYWw6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogJzEyMy4xMjMuMTIzLjEyMycsXG4gICAgICAgICAgICAgIG5ldG1hc2s6ICcyNTUuMjU1LjI1NC4wJyxcbiAgICAgICAgICAgICAgZmFtaWx5OiAnSVB2NCcsXG4gICAgICAgICAgICAgIG1hYzogJ3h4eCcsXG4gICAgICAgICAgICAgIGludGVybmFsOiBmYWxzZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICBhd2RsMDpcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICd4eHgnLFxuICAgICAgICAgICAgICBuZXRtYXNrOiAnZmZmZjpmZmZmOmZmZmY6ZmZmZjo6JyxcbiAgICAgICAgICAgICAgZmFtaWx5OiAnSVB2NicsXG4gICAgICAgICAgICAgIG1hYzogJ3h4eCcsXG4gICAgICAgICAgICAgIHNjb3BlaWQ6IDcsXG4gICAgICAgICAgICAgIGludGVybmFsOiBmYWxzZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGxldCBvc01vY2sgPSBzaW5vbi5tb2NrKG9zKTtcbiAgICAgIG9zTW9jay5leHBlY3RzKCduZXR3b3JrSW50ZXJmYWNlcycpLnJldHVybnMoaWZDb25maWdPdXQpO1xuICAgICAgaWZDb25maWdPdXQgPSAnJztcbiAgICAgIGxldCBpcCA9IHV0aWwubG9jYWxJcCgpO1xuICAgICAgaXAuc2hvdWxkLmVxbCgnMTIzLjEyMy4xMjMuMTIzJyk7XG4gICAgICBvc01vY2sudmVyaWZ5KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjYW5jZWxsYWJsZURlbGF5JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZGVsYXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB1dGlsLmNhbmNlbGxhYmxlRGVsYXkoJzEwJyk7XG4gICAgfSk7XG4gICAgaXQoJ2NhbmNlbCBzaG91bGQgd29yaycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBkZWxheSA9IHV0aWwuY2FuY2VsbGFibGVEZWxheSgnMTAwMCcpO1xuICAgICAgYXdhaXQgQi5kZWxheSgxMCk7XG4gICAgICBkZWxheS5jYW5jZWwoKTtcbiAgICAgIGF3YWl0IGRlbGF5LnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aCgvY2FuY2VsbGF0aW9uIGVycm9yLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzYWZlSnNvblBhcnNlJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcGFzcyBvYmplY3QgdGhyb3VnaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9iaiA9IHthOiAnYScsIGI6ICdiJ307XG4gICAgICB1dGlsLnNhZmVKc29uUGFyc2Uob2JqKS5zaG91bGQuZXF1YWwob2JqKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBwYXJzZSBqc29uIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9iaiA9IHthOiAnYScsIGI6ICdiJ307XG4gICAgICB1dGlsLnNhZmVKc29uUGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSkuc2hvdWxkLmVxbChvYmopO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcGFzcyBhbiBhcnJheSB0aHJvdWdoJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYXJyID0gWydhJywgJ2InXTtcbiAgICAgIHV0aWwuc2FmZUpzb25QYXJzZShhcnIpLnNob3VsZC5lcWwoYXJyKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBwYXJzZSBqc29uIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYXJyID0gWydhJywgJ2InXTtcbiAgICAgIHV0aWwuc2FmZUpzb25QYXJzZShKU09OLnN0cmluZ2lmeShhcnIpKS5zaG91bGQuZXFsKGFycik7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwYXNzIG51bGwgdGhyb3VnaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9iaiA9IG51bGw7XG4gICAgICBfLmlzTnVsbCh1dGlsLnNhZmVKc29uUGFyc2Uob2JqKSkuc2hvdWxkLmJlLnRydWU7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwYXNzIHNpbXBsZSBzdHJpbmcgdGhyb3VnaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0ciA9ICdzdHInO1xuICAgICAgdXRpbC5zYWZlSnNvblBhcnNlKHN0cikuc2hvdWxkLmVxbChzdHIpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcGFzcyBhIG51bWJlciB0aHJvdWdoJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbnVtID0gNDI7XG4gICAgICB1dGlsLnNhZmVKc29uUGFyc2UobnVtKS5zaG91bGQuZXFsKG51bSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBtYWtlIGEgbnVtYmVyIGZyb20gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBudW0gPSA0MjtcbiAgICAgIHV0aWwuc2FmZUpzb25QYXJzZShTdHJpbmcobnVtKSkuc2hvdWxkLmVxbChudW0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnanNvblN0cmluZ2lmeScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHVzZSBKU09OLnN0cmluZ2lmeSBpZiBubyBCdWZmZXIgaW52b2x2ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvYmogPSB7XG4gICAgICAgIGsxOiAndjEnLFxuICAgICAgICBrMjogJ3YyJyxcbiAgICAgICAgazM6ICd2MycsXG4gICAgICB9O1xuICAgICAgY29uc3QganNvblN0cmluZyA9IEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMik7XG4gICAgICB1dGlsLmpzb25TdHJpbmdpZnkob2JqKS5zaG91bGQuZXFsKGpzb25TdHJpbmcpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgc2VyaWFsaXplIGEgQnVmZmVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb2JqID0ge1xuICAgICAgICBrMTogJ3YxJyxcbiAgICAgICAgazI6ICd2MicsXG4gICAgICAgIGszOiBCdWZmZXIuZnJvbSgnaGkgaG93IGFyZSB5b3UgdG9kYXknKSxcbiAgICAgIH07XG4gICAgICB1dGlsLmpzb25TdHJpbmdpZnkob2JqKS5zaG91bGQuaW5jbHVkZSgnaGkgaG93IGFyZSB5b3UgdG9kYXknKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHVzZSB0aGUgcmVwbGFjZXIgZnVuY3Rpb24gb24gbm9uLWJ1ZmZlciB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvYmogPSB7XG4gICAgICAgIGsxOiAndjEnLFxuICAgICAgICBrMjogJ3YyJyxcbiAgICAgICAgazM6ICd2MycsXG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gcmVwbGFjZXIgKGtleSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF8uaXNTdHJpbmcodmFsdWUpID8gdmFsdWUudG9VcHBlckNhc2UoKSA6IHZhbHVlO1xuICAgICAgfVxuICAgICAgY29uc3QganNvblN0cmluZyA9IHV0aWwuanNvblN0cmluZ2lmeShvYmosIHJlcGxhY2VyKTtcbiAgICAgIGpzb25TdHJpbmcuc2hvdWxkLmluY2x1ZGUoJ1YxJyk7XG4gICAgICBqc29uU3RyaW5nLnNob3VsZC5pbmNsdWRlKCdWMicpO1xuICAgICAganNvblN0cmluZy5zaG91bGQuaW5jbHVkZSgnVjMnKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHVzZSB0aGUgcmVwbGFjZXIgZnVuY3Rpb24gb24gYnVmZmVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgICAgazE6ICd2MScsXG4gICAgICAgIGsyOiAndjInLFxuICAgICAgICBrMzogQnVmZmVyLmZyb20oJ2hpIGhvdyBhcmUgeW91IHRvZGF5JyksXG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gcmVwbGFjZXIgKGtleSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF8uaXNTdHJpbmcodmFsdWUpID8gdmFsdWUudG9VcHBlckNhc2UoKSA6IHZhbHVlO1xuICAgICAgfVxuICAgICAgY29uc3QganNvblN0cmluZyA9IHV0aWwuanNvblN0cmluZ2lmeShvYmosIHJlcGxhY2VyKTtcbiAgICAgIGpzb25TdHJpbmcuc2hvdWxkLmluY2x1ZGUoJ1YxJyk7XG4gICAgICBqc29uU3RyaW5nLnNob3VsZC5pbmNsdWRlKCdWMicpO1xuICAgICAganNvblN0cmluZy5zaG91bGQuaW5jbHVkZSgnSEkgSE9XIEFSRSBZT1UgVE9EQVknKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHVzZSB0aGUgcmVwbGFjZXIgZnVuY3Rpb24gcmVjdXJzaXZlbHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvYmogPSB7XG4gICAgICAgIGsxOiAndjEnLFxuICAgICAgICBrMjogJ3YyJyxcbiAgICAgICAgazM6IEJ1ZmZlci5mcm9tKCdoaSBob3cgYXJlIHlvdSB0b2RheScpLFxuICAgICAgICBrNDoge1xuICAgICAgICAgIGs1OiAndjUnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGZ1bmN0aW9uIHJlcGxhY2VyIChrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfLmlzU3RyaW5nKHZhbHVlKSA/IHZhbHVlLnRvVXBwZXJDYXNlKCkgOiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSB1dGlsLmpzb25TdHJpbmdpZnkob2JqLCByZXBsYWNlcik7XG4gICAgICBqc29uU3RyaW5nLnNob3VsZC5pbmNsdWRlKCdWMScpO1xuICAgICAganNvblN0cmluZy5zaG91bGQuaW5jbHVkZSgnVjInKTtcbiAgICAgIGpzb25TdHJpbmcuc2hvdWxkLmluY2x1ZGUoJ0hJIEhPVyBBUkUgWU9VIFRPREFZJyk7XG4gICAgICBqc29uU3RyaW5nLnNob3VsZC5pbmNsdWRlKCdWNScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndW53cmFwRWxlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHBhc3MgdGhyb3VnaCBhbiB1bndyYXBwZWQgZWxlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBlbCA9IDQ7XG4gICAgICB1dGlsLnVud3JhcEVsZW1lbnQoZWwpLnNob3VsZC5lcXVhbChlbCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwYXNzIHRocm91Z2ggYW4gZWxlbWVudCB0aGF0IGlzIGFuIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBlbCA9IHtSQU5ET006IDR9O1xuICAgICAgdXRpbC51bndyYXBFbGVtZW50KGVsKS5zaG91bGQuZXF1YWwoZWwpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdW53cmFwIGEgd3JhcHBlZCBlbGVtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGVsID0ge0VMRU1FTlQ6IDR9O1xuICAgICAgdXRpbC51bndyYXBFbGVtZW50KGVsKS5zaG91bGQuZXFsKDQpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdW53cmFwIGEgd3JhcHBlZCBlbGVtZW50IHRoYXQgdXNlcyBXM0MgZWxlbWVudCBpZGVudGlmaWVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGVsID0ge1xuICAgICAgICBbVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVJdOiA1XG4gICAgICB9O1xuICAgICAgdXRpbC51bndyYXBFbGVtZW50KGVsKS5zaG91bGQuZXFsKDUpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdW53cmFwIGEgd3JhcHBlZCBlbGVtZW50IGFuZCBwcmlvcml0aXplIFczQyBlbGVtZW50IGlkZW50aWZpZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgZWwgPSB7XG4gICAgICAgIEVMRU1FTlQ6IDcsXG4gICAgICAgIFtXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUl06IDYsXG4gICAgICB9O1xuICAgICAgdXRpbC51bndyYXBFbGVtZW50KGVsKS5zaG91bGQuZXFsKDYpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnd3JhcEVsZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBpbmNsdWRlIEVMRU1FTlQgYW5kIHczYyBlbGVtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC53cmFwRWxlbWVudCgxMjMpLnNob3VsZC5lcWwoe1xuICAgICAgICBbdXRpbC5XM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUl06IDEyMyxcbiAgICAgICAgRUxFTUVOVDogMTIzLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd0b1JlYWRhYmxlU2l6ZVN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGZhaWwgaWYgY2Fubm90IGNvbnZlcnQgdG8gQnl0ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAoKCkgPT4gdXRpbC50b1JlYWRhYmxlU2l6ZVN0cmluZygnYXNkYXNkJykpLnNob3VsZC50aHJvdygvQ2Fubm90IGNvbnZlcnQvKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHByb3Blcmx5IGNvbnZlcnQgdG8gQnl0ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnRvUmVhZGFibGVTaXplU3RyaW5nKDApLnNob3VsZC5lcXVhbCgnMCBCJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwcm9wZXJseSBjb252ZXJ0IHRvIEtCeXRlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwudG9SZWFkYWJsZVNpemVTdHJpbmcoMjA0OCArIDEyKS5zaG91bGQuZXF1YWwoJzIuMDEgS0InKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHByb3Blcmx5IGNvbnZlcnQgdG8gTUJ5dGVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC50b1JlYWRhYmxlU2l6ZVN0cmluZygxMDI0ICogMTAyNCAqIDMgKyAxMDI0ICogMTApLnNob3VsZC5lcXVhbCgnMy4wMSBNQicpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcHJvcGVybHkgY29udmVydCB0byBHQnl0ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnRvUmVhZGFibGVTaXplU3RyaW5nKDEwMjQgKiAxMDI0ICogMTAyNCAqIDUpLnNob3VsZC5lcXVhbCgnNS4wMCBHQicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZmlsdGVyT2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgIGRlc2NyaWJlKCd3aXRoIHVuZGVmaW5lZCBwcmVkaWNhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGZpbHRlciBvdXQgdW5kZWZpbmVkcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICBhOiAnYScsXG4gICAgICAgICAgYjogJ2InLFxuICAgICAgICAgIGM6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgICAgdXRpbC5maWx0ZXJPYmplY3Qob2JqKS5zaG91bGQuZXFsKHtcbiAgICAgICAgICBhOiAnYScsXG4gICAgICAgICAgYjogJ2InLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBsZWF2ZSBudWxscyBhbG9uZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICBhOiAnYScsXG4gICAgICAgICAgYjogJ2InLFxuICAgICAgICAgIGM6IG51bGwsXG4gICAgICAgIH07XG4gICAgICAgIHV0aWwuZmlsdGVyT2JqZWN0KG9iaikuc2hvdWxkLmVxbCh7XG4gICAgICAgICAgYTogJ2EnLFxuICAgICAgICAgIGI6ICdiJyxcbiAgICAgICAgICBjOiBudWxsLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCd3aXRoIHZhbHVlIHByZWRpY2F0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgZmlsdGVyIGVsZW1lbnRzIGJ5IHRoZWlyIHZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgIGE6ICdhJyxcbiAgICAgICAgICBiOiAnYicsXG4gICAgICAgICAgYzogJ2MnLFxuICAgICAgICAgIGQ6ICdhJyxcbiAgICAgICAgfTtcbiAgICAgICAgdXRpbC5maWx0ZXJPYmplY3Qob2JqLCAnYScpLnNob3VsZC5lcWwoe1xuICAgICAgICAgIGE6ICdhJyxcbiAgICAgICAgICBkOiAnYScsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJ3dpdGggZnVuY3Rpb24gcHJlZGljYXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBmaWx0ZXIgZWxlbWVudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgYTogJ2EnLFxuICAgICAgICAgIGI6ICdiJyxcbiAgICAgICAgICBjOiAnYycsXG4gICAgICAgIH07XG4gICAgICAgIHV0aWwuZmlsdGVyT2JqZWN0KG9iaiwgKHYpID0+IHYgPT09ICdhJyB8fCB2ID09PSAnYycpLnNob3VsZC5lcWwoe1xuICAgICAgICAgIGE6ICdhJyxcbiAgICAgICAgICBjOiAnYycsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1N1YlBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBkZXRlY3Qgc2ltcGxlIHN1YnBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmlzU3ViUGF0aCgnL3Jvb3Qvc29tZScsICcvcm9vdCcpLnNob3VsZC5iZS50cnVlO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZGV0ZWN0IGNvbXBsZXggc3VicGF0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaXNTdWJQYXRoKCcvcm9vdC9zb21lL290aGVyLy4uLy4uLy4nLCAnL3Jvb3QnKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGRldGVjdCBzdWJwYXRoIGVuZGluZyB3aXRoIGEgc2xhc2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmlzU3ViUGF0aCgnL3Jvb3Qvc29tZS8nLCAnL3Jvb3QnKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGRldGVjdCBpZiBhIHBhdGggaXMgbm90IGEgc3VicGF0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaXNTdWJQYXRoKCcvcm9vdC9zb21lLy8uLi8uLicsICcvcm9vdCcpLnNob3VsZC5iZS5mYWxzZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGFueSBvZiB0aGUgZ2l2ZW4gcGF0aHMgaXMgbm90IGFic29sdXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLnRocm93KCgpID0+IHV0aWwuaXNTdWJQYXRoKCdzb21lLy4uJywgJy9yb290JyksIC9hYnNvbHV0ZS8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNTYW1lRGVzdGluYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHBhdGgxO1xuICAgIGxldCBwYXRoMjtcbiAgICBsZXQgdG1wRGlyO1xuICAgIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICB0bXBEaXIgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICAgIHBhdGgxID0gcGF0aC5yZXNvbHZlKHRtcERpciwgJ3BhdGgxLnR4dCcpO1xuICAgICAgcGF0aDIgPSBwYXRoLnJlc29sdmUodG1wRGlyLCAncGF0aDIudHh0Jyk7XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgW3BhdGgxLCBwYXRoMl0pIHtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHAsIHAsICd1dGY4Jyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgYWZ0ZXIoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcERpcik7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBtYXRjaCBwYXRocyB0byB0aGUgc2FtZSBmaWxlL2ZvbGRlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIChhd2FpdCB1dGlsLmlzU2FtZURlc3RpbmF0aW9uKHBhdGgxLCBwYXRoLnJlc29sdmUodG1wRGlyLCAnLi4nLCBwYXRoLmJhc2VuYW1lKHRtcERpciksIHBhdGguYmFzZW5hbWUocGF0aDEpKSkpXG4gICAgICAgIC5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG5vdCBtYXRjaCBwYXRocyBpZiB0aGV5IHBvaW50IHRvIG5vbiBleGlzdGluZyBpdGVtcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIChhd2FpdCB1dGlsLmlzU2FtZURlc3RpbmF0aW9uKHBhdGgxLCAnYmxhYmxhJykpLnNob3VsZC5iZS5mYWxzZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG5vdCBtYXRjaCBwYXRocyB0byBkaWZmZXJlbnQgZmlsZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAoYXdhaXQgdXRpbC5pc1NhbWVEZXN0aW5hdGlvbihwYXRoMSwgcGF0aDIpKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb21wYXJlVmVyc2lvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjb21wYXJlIHR3byBjb3JyZWN0IHZlcnNpb24gbnVtYmVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuY29tcGFyZVZlcnNpb25zKCcxMC4wJywgJzwnLCAnMTEuMCcpLnNob3VsZC5lcWwodHJ1ZSk7XG4gICAgICB1dGlsLmNvbXBhcmVWZXJzaW9ucygnMTEuMCcsICc+PScsICcxMS4wJykuc2hvdWxkLmVxbCh0cnVlKTtcbiAgICAgIHV0aWwuY29tcGFyZVZlcnNpb25zKCcxMS4wJywgJz09JywgJzExLjAnKS5zaG91bGQuZXFsKHRydWUpO1xuICAgICAgdXRpbC5jb21wYXJlVmVyc2lvbnMoJzEzLjEwJywgJz4nLCAnMTMuNScpLnNob3VsZC5lcWwodHJ1ZSk7XG4gICAgICB1dGlsLmNvbXBhcmVWZXJzaW9ucygnMTEuMScsICchPScsICcxMS4xMCcpLnNob3VsZC5lcWwodHJ1ZSk7XG4gICAgICB1dGlsLmNvbXBhcmVWZXJzaW9ucygnMTIuMCcsICc8JywgMTApLnNob3VsZC5lcWwoZmFsc2UpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgYW55IG9mIHZlcnNpb24gYXJndW1lbnRzIGlzIGludmFsaWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQudGhyb3coKCkgPT4gdXRpbC5jb21wYXJlVmVyc2lvbnModW5kZWZpbmVkLCAnPCcsICcxMS4wJykpO1xuICAgICAgc2hvdWxkLnRocm93KCgpID0+IHV0aWwuY29tcGFyZVZlcnNpb25zKCcxMS4wJywgJz09JywgbnVsbCkpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgY29tcGFyaXNvbiBvcGVyYXRvciBpcyB1bnN1cHBvcnRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC50aHJvdygoKSA9PiB1dGlsLmNvbXBhcmVWZXJzaW9ucygnMTIuMCcsICdhYmMnLCAxMCkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncXVvdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBxdW90ZSBhIHN0cmluZyB3aXRoIGEgc3BhY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnF1b3RlKFsnYScsICdiJywgJ2MgZCddKS5zaG91bGQuZXFsKCdhIGIgXFwnYyBkXFwnJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBlc2NhcGUgZG91YmxlIHF1b3RlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwucXVvdGUoWydhJywgJ2InLCBgaXQncyBhIFwibmVhdCB0aGluZ1wiYF0pLnNob3VsZC5lcWwoYGEgYiBcIml0J3MgYSBcXFxcXCJuZWF0IHRoaW5nXFxcXFwiXCJgKTtcbiAgICB9KTtcbiAgICBpdChcInNob3VsZCBlc2NhcGUgJCBgIGFuZCAnXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwucXVvdGUoWyckJywgJ2AnLCBgJ2BdKS5zaG91bGQuZXFsKCdcXFxcJCBcXFxcYCBcIlxcJ1wiJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZW1wdHkgYXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnF1b3RlKFtdKS5zaG91bGQuZXFsKCcnKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHF1b3RlIGEgc3RyaW5nIHdpdGggbmV3bGluZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwucXVvdGUoWydhXFxuYiddKS5zaG91bGQuZXFsKGAnYVxcbmInYCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBzdHJpbmdpZnkgYm9vbGVhbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnF1b3RlKFsnYScsIDEsIHRydWUsIGZhbHNlXSkuc2hvdWxkLmVxbCgnYSAxIHRydWUgZmFsc2UnKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHN0cmluZ2lmeSBudWxsIGFuZCB1bmRlZmluZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnF1b3RlKFsnYScsIDEsIG51bGwsIHVuZGVmaW5lZF0pLnNob3VsZC5lcWwoJ2EgMSBudWxsIHVuZGVmaW5lZCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndW5sZWFrU3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdW5sZWFrIGEgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC51bmxlYWtTdHJpbmcoJ3lvbG8nKS5zaG91bGQuZXFsKCd5b2xvJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB1bmxlYWsgYSBtdWx0aWxpbmUgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC51bmxlYWtTdHJpbmcoJyB5b2xvXFxuYm9sbyAnKS5zaG91bGQuZXFsKCcgeW9sb1xcbmJvbG8gJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IGFuIG9iamVjdCB0byBhIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3Qgb2JqIG9mIFt7fSwgbnVsbCwgdW5kZWZpbmVkLCBbXSwgMF0pIHtcbiAgICAgICAgdXRpbC51bmxlYWtTdHJpbmcob2JqKS5zaG91bGQuZXFsKGAke29ian1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3BsdXJhbGl6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAvKlxuICAgICAqIFRoZSBwbHVyYWxpemUgbGlicmFyeSAoaHR0cHM6Ly9naXRodWIuY29tL2JsYWtlZW1icmV5L3BsdXJhbGl6ZSlcbiAgICAgKiBoYXMgYSByb2J1c3Qgc2V0IG9mIHRlc3RzLiBIZXJlIHdlIGp1c3QgbmVlZCB0byB2ZXJpZnkgdGhhdCBpdFxuICAgICAqIGlzIHVzYWJsZSB0aHJvdWdoIHRoZSBleHBvcnRlZCBwYWNrYWdlLCBhbmQgdGhlIGFyZ3VtZW50cyBhcmUgY29ycmVjdFxuICAgICAqL1xuICAgIGl0KCdzaG91bGQgcGx1cmFsaXplIGEgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5wbHVyYWxpemUoJ3dvcmQnLCAyKS5zaG91bGQuZXFsKCd3b3JkcycpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcGx1cmFsaXplIGEgc3RyaW5nIGFuZCBwcmVwZW5kIHRoZSBudW1iZXIgdGhyb3VnaCBib29sZWFuJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5wbHVyYWxpemUoJ3dvcmQnLCAyLCB0cnVlKS5zaG91bGQuZXFsKCcyIHdvcmRzJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwbHVyYWxpemUgYSBzdHJpbmcgYW5kIHByZXBlbmQgdGhlIG51bWJlciB0aHJvdWdoIG9wdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnBsdXJhbGl6ZSgnd29yZCcsIDIsIHtpbmNsdXNpdmU6IHRydWV9KS5zaG91bGQuZXFsKCcyIHdvcmRzJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvdXRpbC1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9