UNPKG

738 kBHTMLView Raw
1<!doctype html><html><head><meta charset="utf-8"></head><body><pre id="__testling_output"></pre><script>(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
2(function (process){
3'use strict';
4
5var defined = require('defined');
6var createDefaultStream = require('./lib/default_stream');
7var Test = require('./lib/test');
8var createResult = require('./lib/results');
9var through = require('through');
10
11var canEmitExit = typeof process !== 'undefined' && process
12 && typeof process.on === 'function' && process.browser !== true;
13var canExit = typeof process !== 'undefined' && process
14 && typeof process.exit === 'function';
15
16module.exports = (function () {
17 var wait = false;
18 var harness;
19
20 function getHarness(opts) {
21 if (!opts) { opts = {}; }
22 opts.autoclose = !canEmitExit;
23 // this override is here since tests fail via nyc if createHarness is moved upwards
24 // eslint-disable-next-line no-use-before-define
25 if (!harness) { harness = createExitHarness(opts, wait); }
26 return harness;
27 }
28
29 function lazyLoad() {
30 // eslint-disable-next-line no-invalid-this
31 return getHarness().apply(this, arguments);
32 }
33
34 lazyLoad.wait = function () {
35 wait = true;
36 };
37
38 lazyLoad.run = function () {
39 var run = getHarness().run;
40
41 if (run) { run(); }
42 };
43
44 lazyLoad.only = function () {
45 return getHarness().only.apply(this, arguments);
46 };
47
48 lazyLoad.createStream = function (opts) {
49 var options = opts || {};
50 if (!harness) {
51 var output = through();
52 getHarness({ stream: output, objectMode: options.objectMode });
53 return output;
54 }
55 return harness.createStream(options);
56 };
57
58 lazyLoad.onFinish = function () {
59 return getHarness().onFinish.apply(this, arguments);
60 };
61
62 lazyLoad.onFailure = function () {
63 return getHarness().onFailure.apply(this, arguments);
64 };
65
66 lazyLoad.getHarness = getHarness;
67
68 return lazyLoad;
69}());
70
71function createHarness(conf_) {
72 var results = createResult();
73 if (!conf_ || conf_.autoclose !== false) {
74 results.once('done', function () { results.close(); });
75 }
76
77 function test(name, conf, cb) {
78 var t = new Test(name, conf, cb);
79 test._tests.push(t);
80
81 (function inspectCode(st) {
82 st.on('test', function sub(st_) {
83 inspectCode(st_);
84 });
85 st.on('result', function (r) {
86 if (!r.todo && !r.ok && typeof r !== 'string') { test._exitCode = 1; }
87 });
88 }(t));
89
90 results.push(t);
91 return t;
92 }
93 test._results = results;
94
95 test._tests = [];
96
97 test.createStream = function (opts) {
98 return results.createStream(opts);
99 };
100
101 test.onFinish = function (cb) {
102 results.on('done', cb);
103 };
104
105 test.onFailure = function (cb) {
106 results.on('fail', cb);
107 };
108
109 var only = false;
110 test.only = function () {
111 if (only) { throw new Error('there can only be one only test'); }
112 if (conf_.noOnly) { throw new Error('`only` tests are prohibited'); }
113 only = true;
114 var t = test.apply(null, arguments);
115 results.only(t);
116 return t;
117 };
118 test._exitCode = 0;
119
120 test.close = function () { results.close(); };
121
122 return test;
123}
124
125function createExitHarness(conf, wait) {
126 var config = conf || {};
127 var harness = createHarness({
128 autoclose: defined(config.autoclose, false),
129 noOnly: defined(conf.noOnly, defined(process.env.NODE_TAPE_NO_ONLY_TEST, false))
130 });
131 var running = false;
132 var ended = false;
133
134 function run() {
135 if (running) { return; }
136 running = true;
137 var stream = harness.createStream({ objectMode: config.objectMode });
138 var es = stream.pipe(config.stream || createDefaultStream());
139 if (canEmitExit && es) { // in node v0.4, `es` is `undefined`
140 // TODO: use `err` arg?
141 // eslint-disable-next-line no-unused-vars
142 es.on('error', function (err) { harness._exitCode = 1; });
143 }
144 stream.on('end', function () { ended = true; });
145 }
146
147 if (wait) {
148 harness.run = run;
149 } else {
150 run();
151 }
152
153 if (config.exit === false) { return harness; }
154 if (!canEmitExit || !canExit) { return harness; }
155
156 process.on('exit', function (code) {
157 // let the process exit cleanly.
158 if (typeof code === 'number' && code !== 0) {
159 return;
160 }
161
162 if (!ended) {
163 var only = harness._results._only;
164 for (var i = 0; i < harness._tests.length; i++) {
165 var t = harness._tests[i];
166 if (!only || t === only) {
167 t._exit();
168 }
169 }
170 }
171 harness.close();
172
173 process.removeAllListeners('exit'); // necessary for node v0.6
174 process.exit(code || harness._exitCode); // eslint-disable-line no-process-exit
175 });
176
177 return harness;
178}
179
180module.exports.createHarness = createHarness;
181module.exports.Test = Test;
182module.exports.test = module.exports; // tap compat
183module.exports.test.skip = Test.skip;
184
185}).call(this,require("KliubH"))
186},{"./lib/default_stream":2,"./lib/results":3,"./lib/test":4,"KliubH":91,"defined":14,"through":79}],2:[function(require,module,exports){
187(function (process){
188'use strict';
189
190var through = require('through');
191var fs = require('fs');
192
193module.exports = function () {
194 var line = '';
195 var stream = through(write, flush);
196 return stream;
197
198 function write(buf) {
199 for (var i = 0; i < buf.length; i++) {
200 var c = typeof buf === 'string'
201 ? buf.charAt(i)
202 : String.fromCharCode(buf[i]);
203 if (c === '\n') {
204 flush();
205 } else {
206 line += c;
207 }
208 }
209 }
210
211 function flush() {
212 if (fs.writeSync && (/^win/).test(process.platform)) {
213 try {
214 fs.writeSync(1, line + '\n');
215 } catch (e) {
216 stream.emit('error', e);
217 }
218 } else {
219 try {
220 console.log(line); // eslint-disable-line no-console
221 } catch (e) {
222 stream.emit('error', e);
223 }
224 }
225 line = '';
226 }
227};
228
229}).call(this,require("KliubH"))
230},{"KliubH":91,"fs":85,"through":79}],3:[function(require,module,exports){
231(function (process){
232'use strict';
233
234var defined = require('defined');
235var EventEmitter = require('events').EventEmitter;
236var inherits = require('inherits');
237var through = require('through');
238var resumer = require('resumer');
239var inspect = require('object-inspect');
240var callBound = require('call-bind/callBound');
241var has = require('has');
242var $exec = callBound('RegExp.prototype.exec');
243var $split = callBound('String.prototype.split');
244var $replace = callBound('String.prototype.replace');
245var $shift = callBound('Array.prototype.shift');
246var $push = callBound('Array.prototype.push');
247var yamlIndicators = /:|-|\?/;
248var nextTick = typeof setImmediate !== 'undefined'
249 ? setImmediate
250 : process.nextTick;
251
252function coalesceWhiteSpaces(str) {
253 return $replace(String(str), /\s+/g, ' ');
254}
255
256function getNextTest(results) {
257 if (!results._only) {
258 return $shift(results.tests);
259 }
260
261 do {
262 var t = $shift(results.tests);
263 if (t && results._only === t) {
264 return t;
265 }
266 } while (results.tests.length !== 0);
267
268 return void undefined;
269}
270
271function invalidYaml(str) {
272 return $exec(yamlIndicators, str) !== null;
273}
274
275function encodeResult(res, count) {
276 var output = '';
277 output += (res.ok ? 'ok ' : 'not ok ') + count;
278 output += res.name ? ' ' + coalesceWhiteSpaces(res.name) : '';
279
280 if (res.skip) {
281 output += ' # SKIP' + (typeof res.skip === 'string' ? ' ' + coalesceWhiteSpaces(res.skip) : '');
282 } else if (res.todo) {
283 output += ' # TODO' + (typeof res.todo === 'string' ? ' ' + coalesceWhiteSpaces(res.todo) : '');
284 }
285
286 output += '\n';
287 if (res.ok) { return output; }
288
289 var outer = ' ';
290 var inner = outer + ' ';
291 output += outer + '---\n';
292 output += inner + 'operator: ' + res.operator + '\n';
293
294 if (has(res, 'expected') || has(res, 'actual')) {
295 var ex = inspect(res.expected, { depth: res.objectPrintDepth });
296 var ac = inspect(res.actual, { depth: res.objectPrintDepth });
297
298 if (Math.max(ex.length, ac.length) > 65 || invalidYaml(ex) || invalidYaml(ac)) {
299 output += inner + 'expected: |-\n' + inner + ' ' + ex + '\n';
300 output += inner + 'actual: |-\n' + inner + ' ' + ac + '\n';
301 } else {
302 output += inner + 'expected: ' + ex + '\n';
303 output += inner + 'actual: ' + ac + '\n';
304 }
305 }
306 if (res.at) {
307 output += inner + 'at: ' + res.at + '\n';
308 }
309
310 var actualStack = res.actual && (typeof res.actual === 'object' || typeof res.actual === 'function') ? res.actual.stack : undefined;
311 var errorStack = res.error && res.error.stack;
312 var stack = defined(actualStack, errorStack);
313 if (stack) {
314 var lines = $split(String(stack), '\n');
315 output += inner + 'stack: |-\n';
316 for (var i = 0; i < lines.length; i++) {
317 output += inner + ' ' + lines[i] + '\n';
318 }
319 }
320
321 output += outer + '...\n';
322 return output;
323}
324
325function Results() {
326 if (!(this instanceof Results)) { return new Results(); }
327 this.count = 0;
328 this.fail = 0;
329 this.pass = 0;
330 this.todo = 0;
331 this._stream = through();
332 this.tests = [];
333 this._only = null;
334 this._isRunning = false;
335}
336
337inherits(Results, EventEmitter);
338
339Results.prototype.createStream = function (opts) {
340 if (!opts) { opts = {}; }
341 var self = this;
342 var output;
343 var testId = 0;
344 if (opts.objectMode) {
345 output = through();
346 self.on('_push', function ontest(t, extra) {
347 if (!extra) { extra = {}; }
348 var id = testId++;
349 t.once('prerun', function () {
350 var row = {
351 type: 'test',
352 name: t.name,
353 id: id,
354 skip: t._skip,
355 todo: t._todo
356 };
357 if (has(extra, 'parent')) {
358 row.parent = extra.parent;
359 }
360 output.queue(row);
361 });
362 t.on('test', function (st) {
363 ontest(st, { parent: id });
364 });
365 t.on('result', function (res) {
366 if (res && typeof res === 'object') {
367 res.test = id;
368 res.type = 'assert';
369 }
370 output.queue(res);
371 });
372 t.on('end', function () {
373 output.queue({ type: 'end', test: id });
374 });
375 });
376 self.on('done', function () { output.queue(null); });
377 } else {
378 output = resumer();
379 output.queue('TAP version 13\n');
380 self._stream.pipe(output);
381 }
382
383 if (!this._isRunning) {
384 this._isRunning = true;
385 nextTick(function next() {
386 var t;
387 while (t = getNextTest(self)) {
388 t.run();
389 if (!t.ended) {
390 t.once('end', function () { nextTick(next); });
391 return;
392 }
393 }
394 self.emit('done');
395 });
396 }
397
398 return output;
399};
400
401Results.prototype.push = function (t) {
402 var self = this;
403 $push(self.tests, t);
404 self._watch(t);
405 self.emit('_push', t);
406};
407
408Results.prototype.only = function (t) {
409 this._only = t;
410};
411
412Results.prototype._watch = function (t) {
413 var self = this;
414 function write(s) { self._stream.queue(s); }
415
416 t.once('prerun', function () {
417 var premsg = '';
418 if (t._skip) {
419 premsg = 'SKIP ';
420 } else if (t._todo) {
421 premsg = 'TODO ';
422 }
423 write('# ' + premsg + coalesceWhiteSpaces(t.name) + '\n');
424 });
425
426 t.on('result', function (res) {
427 if (typeof res === 'string') {
428 write('# ' + res + '\n');
429 return;
430 }
431 write(encodeResult(res, self.count + 1));
432 self.count++;
433
434 if (res.ok || res.todo) {
435 self.pass++;
436 } else {
437 self.fail++;
438 self.emit('fail');
439 }
440 });
441
442 t.on('test', function (st) { self._watch(st); });
443};
444
445Results.prototype.close = function () {
446 var self = this;
447 if (self.closed) { self._stream.emit('error', new Error('ALREADY CLOSED')); }
448 self.closed = true;
449
450 function write(s) { self._stream.queue(s); }
451
452 write('\n1..' + self.count + '\n');
453 write('# tests ' + self.count + '\n');
454 write('# pass ' + (self.pass + self.todo) + '\n');
455 if (self.todo) { write('# todo ' + self.todo + '\n'); }
456 if (self.fail) {
457 write('# fail ' + self.fail + '\n');
458 } else {
459 write('\n# ok\n');
460 }
461
462 self._stream.queue(null);
463};
464
465module.exports = Results;
466
467}).call(this,require("KliubH"))
468},{"KliubH":91,"call-bind/callBound":10,"defined":14,"events":87,"has":39,"inherits":40,"object-inspect":56,"resumer":73,"through":79}],4:[function(require,module,exports){
469(function (process,__dirname){
470'use strict';
471
472var deepEqual = require('deep-equal');
473var defined = require('defined');
474var path = require('path');
475var inherits = require('inherits');
476var EventEmitter = require('events').EventEmitter;
477var has = require('has');
478var isRegExp = require('is-regex');
479var trim = require('string.prototype.trim');
480var callBound = require('call-bind/callBound');
481var forEach = require('for-each');
482var inspect = require('object-inspect');
483var is = require('object-is');
484var objectKeys = require('object-keys');
485var every = require('array.prototype.every');
486
487var isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
488var toLowerCase = callBound('String.prototype.toLowerCase');
489var isProto = callBound('Object.prototype.isPrototypeOf');
490var $exec = callBound('RegExp.prototype.exec');
491var objectToString = callBound('Object.prototype.toString');
492var $split = callBound('String.prototype.split');
493var $replace = callBound('String.prototype.replace');
494var $strSlice = callBound('String.prototype.slice');
495var $push = callBound('Array.prototype.push');
496var $shift = callBound('Array.prototype.shift');
497
498var nextTick = typeof setImmediate !== 'undefined'
499 ? setImmediate
500 : process.nextTick;
501var safeSetTimeout = setTimeout;
502var safeClearTimeout = clearTimeout;
503
504// eslint-disable-next-line no-unused-vars
505function getTestArgs(name_, opts_, cb_) {
506 var name = '(anonymous)';
507 var opts = {};
508 var cb;
509
510 for (var i = 0; i < arguments.length; i++) {
511 var arg = arguments[i];
512 var t = typeof arg;
513 if (t === 'string') {
514 name = arg;
515 } else if (t === 'object') {
516 opts = arg || opts;
517 } else if (t === 'function') {
518 cb = arg;
519 }
520 }
521 return {
522 name: name,
523 opts: opts,
524 cb: cb
525 };
526}
527
528function Test(name_, opts_, cb_) {
529 if (!(this instanceof Test)) {
530 return new Test(name_, opts_, cb_);
531 }
532
533 var args = getTestArgs(name_, opts_, cb_);
534
535 this.readable = true;
536 this.name = args.name || '(anonymous)';
537 this.assertCount = 0;
538 this.pendingCount = 0;
539 this._skip = args.opts.skip || false;
540 this._todo = args.opts.todo || false;
541 this._timeout = args.opts.timeout;
542 this._plan = undefined;
543 this._cb = args.cb;
544 this._progeny = [];
545 this._teardown = [];
546 this._ok = true;
547 var depthEnvVar = process.env.NODE_TAPE_OBJECT_PRINT_DEPTH;
548 if (args.opts.objectPrintDepth) {
549 this._objectPrintDepth = args.opts.objectPrintDepth;
550 } else if (depthEnvVar) {
551 if (toLowerCase(depthEnvVar) === 'infinity') {
552 this._objectPrintDepth = Infinity;
553 } else {
554 this._objectPrintDepth = depthEnvVar;
555 }
556 } else {
557 this._objectPrintDepth = 5;
558 }
559
560 for (var prop in this) {
561 this[prop] = (function bind(self, val) {
562 if (typeof val === 'function') {
563 return function bound() {
564 return val.apply(self, arguments);
565 };
566 }
567 return val;
568 }(this, this[prop]));
569 }
570}
571
572inherits(Test, EventEmitter);
573
574Test.prototype.run = function run() {
575 this.emit('prerun');
576 if (!this._cb || this._skip) {
577 this._end();
578 return;
579 }
580 if (this._timeout != null) {
581 this.timeoutAfter(this._timeout);
582 }
583
584 var callbackReturn = this._cb(this);
585
586 if (
587 typeof Promise === 'function'
588 && callbackReturn
589 && typeof callbackReturn.then === 'function'
590 ) {
591 var self = this;
592 Promise.resolve(callbackReturn).then(function onResolve() {
593 if (!self.calledEnd) {
594 self.end();
595 }
596 })['catch'](function onError(err) {
597 if (err instanceof Error || objectToString(err) === '[object Error]') {
598 self.ifError(err);
599 } else {
600 self.fail(err);
601 }
602 self.end();
603 });
604 return;
605 }
606
607 this.emit('run');
608};
609
610Test.prototype.test = function test(name, opts, cb) {
611 var self = this;
612 var t = new Test(name, opts, cb);
613 $push(this._progeny, t);
614 this.pendingCount++;
615 this.emit('test', t);
616 t.on('prerun', function () {
617 self.assertCount++;
618 });
619
620 if (!self._pendingAsserts()) {
621 nextTick(function () {
622 self._end();
623 });
624 }
625
626 nextTick(function () {
627 if (!self._plan && self.pendingCount == self._progeny.length) {
628 self._end();
629 }
630 });
631};
632
633Test.prototype.comment = function comment(msg) {
634 var that = this;
635 forEach($split(trim(msg), '\n'), function (aMsg) {
636 that.emit('result', $replace(trim(aMsg), /^#\s*/, ''));
637 });
638};
639
640Test.prototype.plan = function plan(n) {
641 this._plan = n;
642 this.emit('plan', n);
643};
644
645Test.prototype.timeoutAfter = function timeoutAfter(ms) {
646 if (!ms) { throw new Error('timeoutAfter requires a timespan'); }
647 var self = this;
648 var timeout = safeSetTimeout(function () {
649 self.fail(self.name + ' timed out after ' + ms + 'ms');
650 self.end();
651 }, ms);
652 this.once('end', function () {
653 safeClearTimeout(timeout);
654 });
655};
656
657Test.prototype.end = function end(err) {
658 if (arguments.length >= 1 && !!err) {
659 this.ifError(err);
660 }
661
662 if (this.calledEnd) {
663 this.fail('.end() already called');
664 }
665 this.calledEnd = true;
666 this._end();
667};
668
669Test.prototype.teardown = function teardown(fn) {
670 if (typeof fn !== 'function') {
671 this.fail('teardown: ' + inspect(fn) + ' is not a function');
672 } else {
673 this._teardown.push(fn);
674 }
675};
676
677Test.prototype._end = function _end(err) {
678 var self = this;
679
680 if (!this._cb && !this._todo && !this._skip) {
681 this.fail('# TODO ' + this.name);
682 }
683
684 if (this._progeny.length) {
685 var t = $shift(this._progeny);
686 t.on('end', function () { self._end(); });
687 t.run();
688 return;
689 }
690
691 function completeEnd() {
692 if (!self.ended) { self.emit('end'); }
693 var pendingAsserts = self._pendingAsserts();
694 if (!self._planError && self._plan !== undefined && pendingAsserts) {
695 self._planError = true;
696 self.fail('plan != count', {
697 expected: self._plan,
698 actual: self.assertCount
699 });
700 }
701 self.ended = true;
702 }
703
704 function next() {
705 if (self._teardown.length === 0) {
706 completeEnd();
707 return;
708 }
709 var fn = self._teardown.shift();
710 var res;
711 try {
712 res = fn();
713 } catch (e) {
714 self.fail(e);
715 }
716 if (res && typeof res.then === 'function') {
717 res.then(next, function (_err) {
718 // TODO: wth?
719 err = err || _err;
720 });
721 } else {
722 next();
723 }
724 }
725
726 next();
727};
728
729Test.prototype._exit = function _exit() {
730 if (this._plan !== undefined && !this._planError && this.assertCount !== this._plan) {
731 this._planError = true;
732 this.fail('plan != count', {
733 expected: this._plan,
734 actual: this.assertCount,
735 exiting: true
736 });
737 } else if (!this.ended) {
738 this.fail('test exited without ending: ' + this.name, {
739 exiting: true
740 });
741 }
742};
743
744Test.prototype._pendingAsserts = function _pendingAsserts() {
745 if (this._plan === undefined) {
746 return 1;
747 }
748 return this._plan - (this._progeny.length + this.assertCount);
749};
750
751Test.prototype._assert = function assert(ok, opts) {
752 var self = this;
753 var extra = opts.extra || {};
754
755 ok = !!ok || !!extra.skip;
756
757 var name = defined(extra.message, opts.message, '(unnamed assert)');
758 if (this.calledEnd && opts.operator !== 'fail') {
759 this.fail('.end() already called: ' + name);
760 return;
761 }
762
763 var res = {
764 id: self.assertCount++,
765 ok: ok,
766 skip: defined(extra.skip, opts.skip),
767 todo: defined(extra.todo, opts.todo, self._todo),
768 name: name,
769 operator: defined(extra.operator, opts.operator),
770 objectPrintDepth: self._objectPrintDepth
771 };
772 if (has(opts, 'actual') || has(extra, 'actual')) {
773 res.actual = defined(extra.actual, opts.actual);
774 }
775 if (has(opts, 'expected') || has(extra, 'expected')) {
776 res.expected = defined(extra.expected, opts.expected);
777 }
778 this._ok = !!(this._ok && ok);
779
780 if (!ok && !res.todo) {
781 res.error = defined(extra.error, opts.error, new Error(res.name));
782 }
783
784 if (!ok) {
785 var e = new Error('exception');
786 var err = $split(e.stack || '', '\n');
787 var dir = __dirname + path.sep;
788
789 for (var i = 0; i < err.length; i++) {
790 /*
791 Stack trace lines may resemble one of the following. We need
792 to correctly extract a function name (if any) and path / line
793 number for each line.
794
795 at myFunction (/path/to/file.js:123:45)
796 at myFunction (/path/to/file.other-ext:123:45)
797 at myFunction (/path to/file.js:123:45)
798 at myFunction (C:\path\to\file.js:123:45)
799 at myFunction (/path/to/file.js:123)
800 at Test.<anonymous> (/path/to/file.js:123:45)
801 at Test.bound [as run] (/path/to/file.js:123:45)
802 at /path/to/file.js:123:45
803
804 Regex has three parts. First is non-capturing group for 'at '
805 (plus anything preceding it).
806
807 /^(?:[^\s]*\s*\bat\s+)/
808
809 Second captures function call description (optional). This is
810 not necessarily a valid JS function name, but just what the
811 stack trace is using to represent a function call. It may look
812 like `<anonymous>` or 'Test.bound [as run]'.
813
814 For our purposes, we assume that, if there is a function
815 name, it's everything leading up to the first open
816 parentheses (trimmed) before our pathname.
817
818 /(?:(.*)\s+\()?/
819
820 Last part captures file path plus line no (and optional
821 column no).
822
823 /((?:\/|[a-zA-Z]:\\)[^:\)]+:(\d+)(?::(\d+))?)\)?/
824 */
825 var re = /^(?:[^\s]*\s*\bat\s+)(?:(.*)\s+\()?((?:\/|[a-zA-Z]:\\)[^:)]+:(\d+)(?::(\d+))?)\)?$/;
826 var lineWithTokens = $replace($replace(err[i], process.cwd(), '/$CWD'), __dirname, '/$TEST');
827 var m = re.exec(lineWithTokens);
828
829 if (!m) {
830 continue;
831 }
832
833 var callDescription = m[1] || '<anonymous>';
834 var filePath = $replace($replace(m[2], '/$CWD', process.cwd()), '/$TEST', __dirname);
835
836 if ($strSlice(filePath, 0, dir.length) === dir) {
837 continue;
838 }
839
840 // Function call description may not (just) be a function name.
841 // Try to extract function name by looking at first "word" only.
842 res.functionName = $split(callDescription, /\s+/)[0];
843 res.file = filePath;
844 res.line = Number(m[3]);
845 if (m[4]) { res.column = Number(m[4]); }
846
847 res.at = callDescription + ' (' + filePath + ')';
848 break;
849 }
850 }
851
852 self.emit('result', res);
853
854 var pendingAsserts = self._pendingAsserts();
855 if (!pendingAsserts) {
856 if (extra.exiting) {
857 self._end();
858 } else {
859 nextTick(function () {
860 self._end();
861 });
862 }
863 }
864
865 if (!self._planError && pendingAsserts < 0) {
866 self._planError = true;
867 self.fail('plan != count', {
868 expected: self._plan,
869 actual: self._plan - pendingAsserts
870 });
871 }
872};
873
874Test.prototype.fail = function fail(msg, extra) {
875 this._assert(false, {
876 message: msg,
877 operator: 'fail',
878 extra: extra
879 });
880};
881
882Test.prototype.pass = function pass(msg, extra) {
883 this._assert(true, {
884 message: msg,
885 operator: 'pass',
886 extra: extra
887 });
888};
889
890Test.prototype.skip = function skip(msg, extra) {
891 this._assert(true, {
892 message: msg,
893 operator: 'skip',
894 skip: true,
895 extra: extra
896 });
897};
898
899var testAssert = function assert(value, msg, extra) { // eslint-disable-line func-style
900 this._assert(value, {
901 message: defined(msg, 'should be truthy'),
902 operator: 'ok',
903 expected: true,
904 actual: value,
905 extra: extra
906 });
907};
908Test.prototype.ok
909= Test.prototype['true']
910= Test.prototype.assert
911= testAssert;
912
913function notOK(value, msg, extra) {
914 this._assert(!value, {
915 message: defined(msg, 'should be falsy'),
916 operator: 'notOk',
917 expected: false,
918 actual: value,
919 extra: extra
920 });
921}
922Test.prototype.notOk
923= Test.prototype['false']
924= Test.prototype.notok
925= notOK;
926
927function error(err, msg, extra) {
928 this._assert(!err, {
929 message: defined(msg, String(err)),
930 operator: 'error',
931 error: err,
932 extra: extra
933 });
934}
935Test.prototype.error
936= Test.prototype.ifError
937= Test.prototype.ifErr
938= Test.prototype.iferror
939= error;
940
941function strictEqual(a, b, msg, extra) {
942 if (arguments.length < 2) {
943 throw new TypeError('two arguments must be provided to compare');
944 }
945 this._assert(is(a, b), {
946 message: defined(msg, 'should be strictly equal'),
947 operator: 'equal',
948 actual: a,
949 expected: b,
950 extra: extra
951 });
952}
953Test.prototype.equal
954= Test.prototype.equals
955= Test.prototype.isEqual
956= Test.prototype.strictEqual
957= Test.prototype.strictEquals
958= Test.prototype.is
959= strictEqual;
960
961function notStrictEqual(a, b, msg, extra) {
962 if (arguments.length < 2) {
963 throw new TypeError('two arguments must be provided to compare');
964 }
965 this._assert(!is(a, b), {
966 message: defined(msg, 'should not be strictly equal'),
967 operator: 'notEqual',
968 actual: a,
969 expected: b,
970 extra: extra
971 });
972}
973
974Test.prototype.notEqual
975= Test.prototype.notEquals
976= Test.prototype.isNotEqual
977= Test.prototype.doesNotEqual
978= Test.prototype.isInequal
979= Test.prototype.notStrictEqual
980= Test.prototype.notStrictEquals
981= Test.prototype.isNot
982= Test.prototype.not
983= notStrictEqual;
984
985function looseEqual(a, b, msg, extra) {
986 if (arguments.length < 2) {
987 throw new TypeError('two arguments must be provided to compare');
988 }
989 this._assert(a == b, {
990 message: defined(msg, 'should be loosely equal'),
991 operator: 'looseEqual',
992 actual: a,
993 expected: b,
994 extra: extra
995 });
996}
997
998Test.prototype.looseEqual
999= Test.prototype.looseEquals
1000= looseEqual;
1001
1002function notLooseEqual(a, b, msg, extra) {
1003 if (arguments.length < 2) {
1004 throw new TypeError('two arguments must be provided to compare');
1005 }
1006 this._assert(a != b, {
1007 message: defined(msg, 'should not be loosely equal'),
1008 operator: 'notLooseEqual',
1009 actual: a,
1010 expected: b,
1011 extra: extra
1012 });
1013}
1014Test.prototype.notLooseEqual
1015= Test.prototype.notLooseEquals
1016= notLooseEqual;
1017
1018function tapeDeepEqual(a, b, msg, extra) {
1019 if (arguments.length < 2) {
1020 throw new TypeError('two arguments must be provided to compare');
1021 }
1022 this._assert(deepEqual(a, b, { strict: true }), {
1023 message: defined(msg, 'should be deeply equivalent'),
1024 operator: 'deepEqual',
1025 actual: a,
1026 expected: b,
1027 extra: extra
1028 });
1029}
1030Test.prototype.deepEqual
1031= Test.prototype.deepEquals
1032= Test.prototype.isEquivalent
1033= Test.prototype.same
1034= tapeDeepEqual;
1035
1036function notDeepEqual(a, b, msg, extra) {
1037 if (arguments.length < 2) {
1038 throw new TypeError('two arguments must be provided to compare');
1039 }
1040 this._assert(!deepEqual(a, b, { strict: true }), {
1041 message: defined(msg, 'should not be deeply equivalent'),
1042 operator: 'notDeepEqual',
1043 actual: a,
1044 expected: b,
1045 extra: extra
1046 });
1047}
1048Test.prototype.notDeepEqual
1049= Test.prototype.notDeepEquals
1050= Test.prototype.notEquivalent
1051= Test.prototype.notDeeply
1052= Test.prototype.notSame
1053= Test.prototype.isNotDeepEqual
1054= Test.prototype.isNotDeeply
1055= Test.prototype.isNotEquivalent
1056= Test.prototype.isInequivalent
1057= notDeepEqual;
1058
1059function deepLooseEqual(a, b, msg, extra) {
1060 if (arguments.length < 2) {
1061 throw new TypeError('two arguments must be provided to compare');
1062 }
1063 this._assert(deepEqual(a, b), {
1064 message: defined(msg, 'should be loosely deeply equivalent'),
1065 operator: 'deepLooseEqual',
1066 actual: a,
1067 expected: b,
1068 extra: extra
1069 });
1070}
1071
1072Test.prototype.deepLooseEqual
1073= deepLooseEqual;
1074
1075function notDeepLooseEqual(a, b, msg, extra) {
1076 if (arguments.length < 2) {
1077 throw new TypeError('two arguments must be provided to compare');
1078 }
1079 this._assert(!deepEqual(a, b), {
1080 message: defined(msg, 'should not be loosely deeply equivalent'),
1081 operator: 'notDeepLooseEqual',
1082 actual: a,
1083 expected: b,
1084 extra: extra
1085 });
1086}
1087Test.prototype.notDeepLooseEqual
1088= notDeepLooseEqual;
1089
1090Test.prototype['throws'] = function (fn, expected, msg, extra) {
1091 if (typeof expected === 'string') {
1092 msg = expected;
1093 expected = undefined;
1094 }
1095
1096 var caught;
1097
1098 try {
1099 fn();
1100 } catch (err) {
1101 caught = { error: err };
1102 if (Object(err) === err && (!isEnumerable(err, 'message') || !has(err, 'message'))) {
1103 var message = err.message;
1104 delete err.message;
1105 err.message = message;
1106 }
1107 }
1108
1109 var passed = caught;
1110
1111 if (caught) {
1112 if (typeof expected === 'string' && caught.error && caught.error.message === expected) {
1113 throw new TypeError('The "error/message" argument is ambiguous. The error message ' + inspect(expected) + ' is identical to the message.');
1114 }
1115 if (typeof expected === 'function') {
1116 if (typeof expected.prototype !== 'undefined' && caught.error instanceof expected) {
1117 passed = true;
1118 } else if (isProto(Error, expected)) {
1119 passed = false;
1120 } else {
1121 passed = expected.call({}, caught.error) === true;
1122 }
1123 } else if (isRegExp(expected)) {
1124 passed = $exec(expected, caught.error) !== null;
1125 expected = inspect(expected);
1126 } else if (expected && typeof expected === 'object') { // Handle validation objects.
1127 var keys = objectKeys(expected);
1128 // Special handle errors to make sure the name and the message are compared as well.
1129 if (expected instanceof Error) {
1130 $push(keys, 'name', 'message');
1131 } else if (keys.length === 0) {
1132 throw new TypeError('`throws` validation object must not be empty');
1133 }
1134 passed = every(keys, function (key) {
1135 if (typeof caught.error[key] === 'string' && isRegExp(expected[key]) && $exec(expected[key], caught.error[key]) !== null) {
1136 return true;
1137 }
1138 if (key in caught.error && deepEqual(caught.error[key], expected[key], { strict: true })) {
1139 return true;
1140 }
1141 return false;
1142 });
1143 }
1144 }
1145
1146 this._assert(!!passed, {
1147 message: defined(msg, 'should throw'),
1148 operator: 'throws',
1149 actual: caught && caught.error,
1150 expected: expected,
1151 error: !passed && caught && caught.error,
1152 extra: extra
1153 });
1154};
1155
1156Test.prototype.doesNotThrow = function doesNotThrow(fn, expected, msg, extra) {
1157 if (typeof expected === 'string') {
1158 msg = expected;
1159 expected = undefined;
1160 }
1161 var caught;
1162 try {
1163 fn();
1164 } catch (err) {
1165 caught = { error: err };
1166 }
1167 this._assert(!caught, {
1168 message: defined(msg, 'should not throw'),
1169 operator: 'throws',
1170 actual: caught && caught.error,
1171 expected: expected,
1172 error: caught && caught.error,
1173 extra: extra
1174 });
1175};
1176
1177Test.prototype.match = function match(string, regexp, msg, extra) {
1178 if (!isRegExp(regexp)) {
1179 this._assert(false, {
1180 message: defined(msg, 'The "regexp" argument must be an instance of RegExp. Received type ' + typeof regexp + ' (' + inspect(regexp) + ')'),
1181 operator: 'match',
1182 actual: objectToString(regexp),
1183 expected: '[object RegExp]',
1184 extra: extra
1185 });
1186 } else if (typeof string !== 'string') {
1187 this._assert(false, {
1188 message: defined(msg, 'The "string" argument must be of type string. Received type ' + typeof string + ' (' + inspect(string) + ')'),
1189 operator: 'match',
1190 actual: string === null ? null : typeof string,
1191 expected: 'string',
1192 extra: extra
1193 });
1194 } else {
1195 var matches = $exec(regexp, string) !== null;
1196 var message = defined(
1197 msg,
1198 'The input ' + (matches ? 'matched' : 'did not match') + ' the regular expression ' + inspect(regexp) + '. Input: ' + inspect(string)
1199 );
1200 this._assert(matches, {
1201 message: message,
1202 operator: 'match',
1203 actual: string,
1204 expected: regexp,
1205 extra: extra
1206 });
1207 }
1208};
1209
1210Test.prototype.doesNotMatch = function doesNotMatch(string, regexp, msg, extra) {
1211 if (!isRegExp(regexp)) {
1212 this._assert(false, {
1213 message: defined(msg, 'The "regexp" argument must be an instance of RegExp. Received type ' + typeof regexp + ' (' + inspect(regexp) + ')'),
1214 operator: 'doesNotMatch',
1215 actual: objectToString(regexp),
1216 expected: '[object RegExp]',
1217 extra: extra
1218 });
1219 } else if (typeof string !== 'string') {
1220 this._assert(false, {
1221 message: defined(msg, 'The "string" argument must be of type string. Received type ' + typeof string + ' (' + inspect(string) + ')'),
1222 operator: 'doesNotMatch',
1223 actual: string === null ? null : typeof string,
1224 expected: 'string',
1225 extra: extra
1226 });
1227 } else {
1228 var matches = $exec(regexp, string) !== null;
1229 var message = defined(
1230 msg,
1231 'The input ' + (matches ? 'was expected to not match' : 'did not match') + ' the regular expression ' + inspect(regexp) + '. Input: ' + inspect(string)
1232 );
1233 this._assert(!matches, {
1234 message: message,
1235 operator: 'doesNotMatch',
1236 actual: string,
1237 expected: regexp,
1238 extra: extra
1239 });
1240 }
1241};
1242
1243// eslint-disable-next-line no-unused-vars
1244Test.skip = function skip(name_, _opts, _cb) {
1245 var args = getTestArgs.apply(null, arguments);
1246 args.opts.skip = true;
1247 return new Test(args.name, args.opts, args.cb);
1248};
1249
1250module.exports = Test;
1251
1252// vim: set softtabstop=4 shiftwidth=4:
1253
1254}).call(this,require("KliubH"),"/../../lib")
1255},{"KliubH":91,"array.prototype.every":6,"call-bind/callBound":10,"deep-equal":12,"defined":14,"events":87,"for-each":29,"has":39,"inherits":40,"is-regex":48,"object-inspect":56,"object-is":59,"object-keys":63,"path":90,"string.prototype.trim":76}],5:[function(require,module,exports){
1256'use strict';
1257
1258var IsCallable = require('es-abstract/2021/IsCallable');
1259var ToObject = require('es-abstract/2021/ToObject');
1260var ToUint32 = require('es-abstract/2021/ToUint32');
1261var callBound = require('call-bind/callBound');
1262var isString = require('is-string');
1263
1264// Check failure of by-index access of string characters (IE < 9) and failure of `0 in boxedString` (Rhino)
1265var boxedString = Object('a');
1266var splitString = boxedString[0] !== 'a' || !(0 in boxedString);
1267
1268var $split = callBound('String.prototype.split');
1269
1270module.exports = function every(callbackfn) {
1271 var O = ToObject(this);
1272 var self = splitString && isString(O) ? $split(O, '') : O;
1273 var len = ToUint32(self.length);
1274 var T;
1275 if (arguments.length > 1) {
1276 T = arguments[1];
1277 }
1278
1279 // If no callback function or if callback is not a callable function
1280 if (!IsCallable(callbackfn)) {
1281 throw new TypeError('Array.prototype.every callback must be a function');
1282 }
1283
1284 for (var i = 0; i < len; i++) {
1285 if (i in self && !(typeof T === 'undefined' ? callbackfn(self[i], i, O) : callbackfn.call(T, self[i], i, O))) {
1286 return false;
1287 }
1288 }
1289 return true;
1290};
1291
1292},{"call-bind/callBound":10,"es-abstract/2021/IsCallable":15,"es-abstract/2021/ToObject":18,"es-abstract/2021/ToUint32":21,"is-string":50}],6:[function(require,module,exports){
1293'use strict';
1294
1295var define = require('define-properties');
1296var RequireObjectCoercible = require('es-abstract/2021/RequireObjectCoercible');
1297var callBound = require('call-bind/callBound');
1298
1299var implementation = require('./implementation');
1300var getPolyfill = require('./polyfill');
1301var polyfill = getPolyfill();
1302var shim = require('./shim');
1303
1304var $slice = callBound('Array.prototype.slice');
1305
1306// eslint-disable-next-line no-unused-vars
1307var boundEveryShim = function every(array, callbackfn) {
1308 RequireObjectCoercible(array);
1309 return polyfill.apply(array, $slice(arguments, 1));
1310};
1311define(boundEveryShim, {
1312 getPolyfill: getPolyfill,
1313 implementation: implementation,
1314 shim: shim
1315});
1316
1317module.exports = boundEveryShim;
1318
1319},{"./implementation":5,"./polyfill":7,"./shim":8,"call-bind/callBound":10,"define-properties":13,"es-abstract/2021/RequireObjectCoercible":16}],7:[function(require,module,exports){
1320var implementation = require('./implementation');
1321
1322module.exports = function getPolyfill() {
1323 if (typeof Array.prototype.every === 'function') {
1324 var hasPrimitiveContextInStrict = [1].every(function () {
1325 'use strict';
1326
1327 return typeof this === 'string' && this === 'x';
1328 }, 'x');
1329 if (hasPrimitiveContextInStrict) {
1330 return Array.prototype.every;
1331 }
1332 }
1333 return implementation;
1334};
1335
1336},{"./implementation":5}],8:[function(require,module,exports){
1337'use strict';
1338
1339var define = require('define-properties');
1340var getPolyfill = require('./polyfill');
1341
1342module.exports = function shimArrayPrototypeEvery() {
1343 var polyfill = getPolyfill();
1344 define(
1345 Array.prototype,
1346 { every: polyfill },
1347 { every: function () { return Array.prototype.every !== polyfill; } }
1348 );
1349 return polyfill;
1350};
1351
1352},{"./polyfill":7,"define-properties":13}],9:[function(require,module,exports){
1353(function (global){
1354'use strict';
1355
1356var possibleNames = [
1357 'BigInt64Array',
1358 'BigUint64Array',
1359 'Float32Array',
1360 'Float64Array',
1361 'Int16Array',
1362 'Int32Array',
1363 'Int8Array',
1364 'Uint16Array',
1365 'Uint32Array',
1366 'Uint8Array',
1367 'Uint8ClampedArray'
1368];
1369
1370var g = typeof globalThis === 'undefined' ? global : globalThis;
1371
1372module.exports = function availableTypedArrays() {
1373 var out = [];
1374 for (var i = 0; i < possibleNames.length; i++) {
1375 if (typeof g[possibleNames[i]] === 'function') {
1376 out[out.length] = possibleNames[i];
1377 }
1378 }
1379 return out;
1380};
1381
1382}).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
1383},{}],10:[function(require,module,exports){
1384'use strict';
1385
1386var GetIntrinsic = require('get-intrinsic');
1387
1388var callBind = require('./');
1389
1390var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));
1391
1392module.exports = function callBoundIntrinsic(name, allowMissing) {
1393 var intrinsic = GetIntrinsic(name, !!allowMissing);
1394 if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {
1395 return callBind(intrinsic);
1396 }
1397 return intrinsic;
1398};
1399
1400},{"./":11,"get-intrinsic":33}],11:[function(require,module,exports){
1401'use strict';
1402
1403var bind = require('function-bind');
1404var GetIntrinsic = require('get-intrinsic');
1405
1406var $apply = GetIntrinsic('%Function.prototype.apply%');
1407var $call = GetIntrinsic('%Function.prototype.call%');
1408var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);
1409
1410var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true);
1411var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);
1412var $max = GetIntrinsic('%Math.max%');
1413
1414if ($defineProperty) {
1415 try {
1416 $defineProperty({}, 'a', { value: 1 });
1417 } catch (e) {
1418 // IE 8 has a broken defineProperty
1419 $defineProperty = null;
1420 }
1421}
1422
1423module.exports = function callBind(originalFunction) {
1424 var func = $reflectApply(bind, $call, arguments);
1425 if ($gOPD && $defineProperty) {
1426 var desc = $gOPD(func, 'length');
1427 if (desc.configurable) {
1428 // original length, plus the receiver, minus any additional arguments (after the receiver)
1429 $defineProperty(
1430 func,
1431 'length',
1432 { value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) }
1433 );
1434 }
1435 }
1436 return func;
1437};
1438
1439var applyBind = function applyBind() {
1440 return $reflectApply(bind, $apply, arguments);
1441};
1442
1443if ($defineProperty) {
1444 $defineProperty(module.exports, 'apply', { value: applyBind });
1445} else {
1446 module.exports.apply = applyBind;
1447}
1448
1449},{"function-bind":31,"get-intrinsic":33}],12:[function(require,module,exports){
1450'use strict';
1451
1452var objectKeys = require('object-keys');
1453var isArguments = require('is-arguments');
1454var is = require('object-is');
1455var isRegex = require('is-regex');
1456var flags = require('regexp.prototype.flags');
1457var isArray = require('isarray');
1458var isDate = require('is-date-object');
1459var whichBoxedPrimitive = require('which-boxed-primitive');
1460var GetIntrinsic = require('get-intrinsic');
1461var callBound = require('call-bind/callBound');
1462var whichCollection = require('which-collection');
1463var getIterator = require('es-get-iterator');
1464var getSideChannel = require('side-channel');
1465var whichTypedArray = require('which-typed-array');
1466var assign = require('object.assign');
1467
1468var $getTime = callBound('Date.prototype.getTime');
1469var gPO = Object.getPrototypeOf;
1470var $objToString = callBound('Object.prototype.toString');
1471
1472var $Set = GetIntrinsic('%Set%', true);
1473var $mapHas = callBound('Map.prototype.has', true);
1474var $mapGet = callBound('Map.prototype.get', true);
1475var $mapSize = callBound('Map.prototype.size', true);
1476var $setAdd = callBound('Set.prototype.add', true);
1477var $setDelete = callBound('Set.prototype.delete', true);
1478var $setHas = callBound('Set.prototype.has', true);
1479var $setSize = callBound('Set.prototype.size', true);
1480
1481// taken from https://github.com/browserify/commonjs-assert/blob/bba838e9ba9e28edf3127ce6974624208502f6bc/internal/util/comparisons.js#L401-L414
1482function setHasEqualElement(set, val1, opts, channel) {
1483 var i = getIterator(set);
1484 var result;
1485 while ((result = i.next()) && !result.done) {
1486 if (internalDeepEqual(val1, result.value, opts, channel)) { // eslint-disable-line no-use-before-define
1487 // Remove the matching element to make sure we do not check that again.
1488 $setDelete(set, result.value);
1489 return true;
1490 }
1491 }
1492
1493 return false;
1494}
1495
1496// taken from https://github.com/browserify/commonjs-assert/blob/bba838e9ba9e28edf3127ce6974624208502f6bc/internal/util/comparisons.js#L416-L439
1497function findLooseMatchingPrimitives(prim) {
1498 if (typeof prim === 'undefined') {
1499 return null;
1500 }
1501 if (typeof prim === 'object') { // Only pass in null as object!
1502 return void 0;
1503 }
1504 if (typeof prim === 'symbol') {
1505 return false;
1506 }
1507 if (typeof prim === 'string' || typeof prim === 'number') {
1508 // Loose equal entries exist only if the string is possible to convert to a regular number and not NaN.
1509 return +prim === +prim; // eslint-disable-line no-implicit-coercion
1510 }
1511 return true;
1512}
1513
1514// taken from https://github.com/browserify/commonjs-assert/blob/bba838e9ba9e28edf3127ce6974624208502f6bc/internal/util/comparisons.js#L449-L460
1515function mapMightHaveLoosePrim(a, b, prim, item, opts, channel) {
1516 var altValue = findLooseMatchingPrimitives(prim);
1517 if (altValue != null) {
1518 return altValue;
1519 }
1520 var curB = $mapGet(b, altValue);
1521 var looseOpts = assign({}, opts, { strict: false });
1522 if (
1523 (typeof curB === 'undefined' && !$mapHas(b, altValue))
1524 // eslint-disable-next-line no-use-before-define
1525 || !internalDeepEqual(item, curB, looseOpts, channel)
1526 ) {
1527 return false;
1528 }
1529 // eslint-disable-next-line no-use-before-define
1530 return !$mapHas(a, altValue) && internalDeepEqual(item, curB, looseOpts, channel);
1531}
1532
1533// taken from https://github.com/browserify/commonjs-assert/blob/bba838e9ba9e28edf3127ce6974624208502f6bc/internal/util/comparisons.js#L441-L447
1534function setMightHaveLoosePrim(a, b, prim) {
1535 var altValue = findLooseMatchingPrimitives(prim);
1536 if (altValue != null) {
1537 return altValue;
1538 }
1539
1540 return $setHas(b, altValue) && !$setHas(a, altValue);
1541}
1542
1543// taken from https://github.com/browserify/commonjs-assert/blob/bba838e9ba9e28edf3127ce6974624208502f6bc/internal/util/comparisons.js#L518-L533
1544function mapHasEqualEntry(set, map, key1, item1, opts, channel) {
1545 var i = getIterator(set);
1546 var result;
1547 var key2;
1548 while ((result = i.next()) && !result.done) {
1549 key2 = result.value;
1550 if (
1551 // eslint-disable-next-line no-use-before-define
1552 internalDeepEqual(key1, key2, opts, channel)
1553 // eslint-disable-next-line no-use-before-define
1554 && internalDeepEqual(item1, $mapGet(map, key2), opts, channel)
1555 ) {
1556 $setDelete(set, key2);
1557 return true;
1558 }
1559 }
1560
1561 return false;
1562}
1563
1564function internalDeepEqual(actual, expected, options, channel) {
1565 var opts = options || {};
1566
1567 // 7.1. All identical values are equivalent, as determined by ===.
1568 if (opts.strict ? is(actual, expected) : actual === expected) {
1569 return true;
1570 }
1571
1572 var actualBoxed = whichBoxedPrimitive(actual);
1573 var expectedBoxed = whichBoxedPrimitive(expected);
1574 if (actualBoxed !== expectedBoxed) {
1575 return false;
1576 }
1577
1578 // 7.3. Other pairs that do not both pass typeof value == 'object', equivalence is determined by ==.
1579 if (!actual || !expected || (typeof actual !== 'object' && typeof expected !== 'object')) {
1580 return opts.strict ? is(actual, expected) : actual == expected; // eslint-disable-line eqeqeq
1581 }
1582
1583 /*
1584 * 7.4. For all other Object pairs, including Array objects, equivalence is
1585 * determined by having the same number of owned properties (as verified
1586 * with Object.prototype.hasOwnProperty.call), the same set of keys
1587 * (although not necessarily the same order), equivalent values for every
1588 * corresponding key, and an identical 'prototype' property. Note: this
1589 * accounts for both named and indexed properties on Arrays.
1590 */
1591 // see https://github.com/nodejs/node/commit/d3aafd02efd3a403d646a3044adcf14e63a88d32 for memos/channel inspiration
1592
1593 var hasActual = channel.has(actual);
1594 var hasExpected = channel.has(expected);
1595 var sentinel;
1596 if (hasActual && hasExpected) {
1597 if (channel.get(actual) === channel.get(expected)) {
1598 return true;
1599 }
1600 } else {
1601 sentinel = {};
1602 }
1603 if (!hasActual) { channel.set(actual, sentinel); }
1604 if (!hasExpected) { channel.set(expected, sentinel); }
1605
1606 // eslint-disable-next-line no-use-before-define
1607 return objEquiv(actual, expected, opts, channel);
1608}
1609
1610function isBuffer(x) {
1611 if (!x || typeof x !== 'object' || typeof x.length !== 'number') {
1612 return false;
1613 }
1614 if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {
1615 return false;
1616 }
1617 if (x.length > 0 && typeof x[0] !== 'number') {
1618 return false;
1619 }
1620
1621 return !!(x.constructor && x.constructor.isBuffer && x.constructor.isBuffer(x));
1622}
1623
1624function setEquiv(a, b, opts, channel) {
1625 if ($setSize(a) !== $setSize(b)) {
1626 return false;
1627 }
1628 var iA = getIterator(a);
1629 var iB = getIterator(b);
1630 var resultA;
1631 var resultB;
1632 var set;
1633 while ((resultA = iA.next()) && !resultA.done) {
1634 if (resultA.value && typeof resultA.value === 'object') {
1635 if (!set) { set = new $Set(); }
1636 $setAdd(set, resultA.value);
1637 } else if (!$setHas(b, resultA.value)) {
1638 if (opts.strict) { return false; }
1639 if (!setMightHaveLoosePrim(a, b, resultA.value)) {
1640 return false;
1641 }
1642 if (!set) { set = new $Set(); }
1643 $setAdd(set, resultA.value);
1644 }
1645 }
1646 if (set) {
1647 while ((resultB = iB.next()) && !resultB.done) {
1648 // We have to check if a primitive value is already matching and only if it's not, go hunting for it.
1649 if (resultB.value && typeof resultB.value === 'object') {
1650 if (!setHasEqualElement(set, resultB.value, opts.strict, channel)) {
1651 return false;
1652 }
1653 } else if (
1654 !opts.strict
1655 && !$setHas(a, resultB.value)
1656 && !setHasEqualElement(set, resultB.value, opts.strict, channel)
1657 ) {
1658 return false;
1659 }
1660 }
1661 return $setSize(set) === 0;
1662 }
1663 return true;
1664}
1665
1666function mapEquiv(a, b, opts, channel) {
1667 if ($mapSize(a) !== $mapSize(b)) {
1668 return false;
1669 }
1670 var iA = getIterator(a);
1671 var iB = getIterator(b);
1672 var resultA;
1673 var resultB;
1674 var set;
1675 var key;
1676 var item1;
1677 var item2;
1678 while ((resultA = iA.next()) && !resultA.done) {
1679 key = resultA.value[0];
1680 item1 = resultA.value[1];
1681 if (key && typeof key === 'object') {
1682 if (!set) { set = new $Set(); }
1683 $setAdd(set, key);
1684 } else {
1685 item2 = $mapGet(b, key);
1686 if ((typeof item2 === 'undefined' && !$mapHas(b, key)) || !internalDeepEqual(item1, item2, opts, channel)) {
1687 if (opts.strict) {
1688 return false;
1689 }
1690 if (!mapMightHaveLoosePrim(a, b, key, item1, opts, channel)) {
1691 return false;
1692 }
1693 if (!set) { set = new $Set(); }
1694 $setAdd(set, key);
1695 }
1696 }
1697 }
1698
1699 if (set) {
1700 while ((resultB = iB.next()) && !resultB.done) {
1701 key = resultB.value[0];
1702 item2 = resultB.value[1];
1703 if (key && typeof key === 'object') {
1704 if (!mapHasEqualEntry(set, a, key, item2, opts, channel)) {
1705 return false;
1706 }
1707 } else if (
1708 !opts.strict
1709 && (!a.has(key) || !internalDeepEqual($mapGet(a, key), item2, opts, channel))
1710 && !mapHasEqualEntry(set, a, key, item2, assign({}, opts, { strict: false }), channel)
1711 ) {
1712 return false;
1713 }
1714 }
1715 return $setSize(set) === 0;
1716 }
1717 return true;
1718}
1719
1720function objEquiv(a, b, opts, channel) {
1721 /* eslint max-statements: [2, 100], max-lines-per-function: [2, 120], max-depth: [2, 5] */
1722 var i, key;
1723
1724 if (typeof a !== typeof b) { return false; }
1725 if (a == null || b == null) { return false; }
1726
1727 if ($objToString(a) !== $objToString(b)) { return false; }
1728
1729 if (isArguments(a) !== isArguments(b)) { return false; }
1730
1731 var aIsArray = isArray(a);
1732 var bIsArray = isArray(b);
1733 if (aIsArray !== bIsArray) { return false; }
1734
1735 // TODO: replace when a cross-realm brand check is available
1736 var aIsError = a instanceof Error;
1737 var bIsError = b instanceof Error;
1738 if (aIsError !== bIsError) { return false; }
1739 if (aIsError || bIsError) {
1740 if (a.name !== b.name || a.message !== b.message) { return false; }
1741 }
1742
1743 var aIsRegex = isRegex(a);
1744 var bIsRegex = isRegex(b);
1745 if (aIsRegex !== bIsRegex) { return false; }
1746 if ((aIsRegex || bIsRegex) && (a.source !== b.source || flags(a) !== flags(b))) {
1747 return false;
1748 }
1749
1750 var aIsDate = isDate(a);
1751 var bIsDate = isDate(b);
1752 if (aIsDate !== bIsDate) { return false; }
1753 if (aIsDate || bIsDate) { // && would work too, because both are true or both false here
1754 if ($getTime(a) !== $getTime(b)) { return false; }
1755 }
1756 if (opts.strict && gPO && gPO(a) !== gPO(b)) { return false; }
1757
1758 if (whichTypedArray(a) !== whichTypedArray(b)) {
1759 return false;
1760 }
1761
1762 var aIsBuffer = isBuffer(a);
1763 var bIsBuffer = isBuffer(b);
1764 if (aIsBuffer !== bIsBuffer) { return false; }
1765 if (aIsBuffer || bIsBuffer) { // && would work too, because both are true or both false here
1766 if (a.length !== b.length) { return false; }
1767 for (i = 0; i < a.length; i++) {
1768 if (a[i] !== b[i]) { return false; }
1769 }
1770 return true;
1771 }
1772
1773 if (typeof a !== typeof b) { return false; }
1774
1775 var ka = objectKeys(a);
1776 var kb = objectKeys(b);
1777 // having the same number of owned properties (keys incorporates hasOwnProperty)
1778 if (ka.length !== kb.length) { return false; }
1779
1780 // the same set of keys (although not necessarily the same order),
1781 ka.sort();
1782 kb.sort();
1783 // ~~~cheap key test
1784 for (i = ka.length - 1; i >= 0; i--) {
1785 if (ka[i] != kb[i]) { return false; } // eslint-disable-line eqeqeq
1786 }
1787
1788 // equivalent values for every corresponding key, and ~~~possibly expensive deep test
1789 for (i = ka.length - 1; i >= 0; i--) {
1790 key = ka[i];
1791 if (!internalDeepEqual(a[key], b[key], opts, channel)) { return false; }
1792 }
1793
1794 var aCollection = whichCollection(a);
1795 var bCollection = whichCollection(b);
1796 if (aCollection !== bCollection) {
1797 return false;
1798 }
1799 if (aCollection === 'Set' || bCollection === 'Set') { // aCollection === bCollection
1800 return setEquiv(a, b, opts, channel);
1801 }
1802 if (aCollection === 'Map') { // aCollection === bCollection
1803 return mapEquiv(a, b, opts, channel);
1804 }
1805
1806 return true;
1807}
1808
1809module.exports = function deepEqual(a, b, opts) {
1810 return internalDeepEqual(a, b, opts, getSideChannel());
1811};
1812
1813},{"call-bind/callBound":10,"es-get-iterator":26,"get-intrinsic":33,"is-arguments":41,"is-date-object":45,"is-regex":48,"isarray":55,"object-is":59,"object-keys":63,"object.assign":66,"regexp.prototype.flags":70,"side-channel":74,"which-boxed-primitive":80,"which-collection":81,"which-typed-array":82}],13:[function(require,module,exports){
1814'use strict';
1815
1816var keys = require('object-keys');
1817var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';
1818
1819var toStr = Object.prototype.toString;
1820var concat = Array.prototype.concat;
1821var origDefineProperty = Object.defineProperty;
1822
1823var isFunction = function (fn) {
1824 return typeof fn === 'function' && toStr.call(fn) === '[object Function]';
1825};
1826
1827var hasPropertyDescriptors = require('has-property-descriptors')();
1828
1829var supportsDescriptors = origDefineProperty && hasPropertyDescriptors;
1830
1831var defineProperty = function (object, name, value, predicate) {
1832 if (name in object && (!isFunction(predicate) || !predicate())) {
1833 return;
1834 }
1835 if (supportsDescriptors) {
1836 origDefineProperty(object, name, {
1837 configurable: true,
1838 enumerable: false,
1839 value: value,
1840 writable: true
1841 });
1842 } else {
1843 object[name] = value; // eslint-disable-line no-param-reassign
1844 }
1845};
1846
1847var defineProperties = function (object, map) {
1848 var predicates = arguments.length > 2 ? arguments[2] : {};
1849 var props = keys(map);
1850 if (hasSymbols) {
1851 props = concat.call(props, Object.getOwnPropertySymbols(map));
1852 }
1853 for (var i = 0; i < props.length; i += 1) {
1854 defineProperty(object, props[i], map[props[i]], predicates[props[i]]);
1855 }
1856};
1857
1858defineProperties.supportsDescriptors = !!supportsDescriptors;
1859
1860module.exports = defineProperties;
1861
1862},{"has-property-descriptors":35,"object-keys":63}],14:[function(require,module,exports){
1863module.exports = function () {
1864 for (var i = 0; i < arguments.length; i++) {
1865 if (arguments[i] !== undefined) return arguments[i];
1866 }
1867};
1868
1869},{}],15:[function(require,module,exports){
1870'use strict';
1871
1872// http://262.ecma-international.org/5.1/#sec-9.11
1873
1874module.exports = require('is-callable');
1875
1876},{"is-callable":44}],16:[function(require,module,exports){
1877'use strict';
1878
1879module.exports = require('../5/CheckObjectCoercible');
1880
1881},{"../5/CheckObjectCoercible":22}],17:[function(require,module,exports){
1882'use strict';
1883
1884var GetIntrinsic = require('get-intrinsic');
1885
1886var $TypeError = GetIntrinsic('%TypeError%');
1887var $Number = GetIntrinsic('%Number%');
1888var $RegExp = GetIntrinsic('%RegExp%');
1889var $parseInteger = GetIntrinsic('%parseInt%');
1890
1891var callBound = require('call-bind/callBound');
1892var regexTester = require('../helpers/regexTester');
1893var isPrimitive = require('../helpers/isPrimitive');
1894
1895var $strSlice = callBound('String.prototype.slice');
1896var isBinary = regexTester(/^0b[01]+$/i);
1897var isOctal = regexTester(/^0o[0-7]+$/i);
1898var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
1899var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
1900var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
1901var hasNonWS = regexTester(nonWSregex);
1902
1903// whitespace from: https://es5.github.io/#x15.5.4.20
1904// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
1905var ws = [
1906 '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
1907 '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
1908 '\u2029\uFEFF'
1909].join('');
1910var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
1911var $replace = callBound('String.prototype.replace');
1912var $trim = function (value) {
1913 return $replace(value, trimRegex, '');
1914};
1915
1916var ToPrimitive = require('./ToPrimitive');
1917
1918// https://ecma-international.org/ecma-262/6.0/#sec-tonumber
1919
1920module.exports = function ToNumber(argument) {
1921 var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
1922 if (typeof value === 'symbol') {
1923 throw new $TypeError('Cannot convert a Symbol value to a number');
1924 }
1925 if (typeof value === 'bigint') {
1926 throw new $TypeError('Conversion from \'BigInt\' to \'number\' is not allowed.');
1927 }
1928 if (typeof value === 'string') {
1929 if (isBinary(value)) {
1930 return ToNumber($parseInteger($strSlice(value, 2), 2));
1931 } else if (isOctal(value)) {
1932 return ToNumber($parseInteger($strSlice(value, 2), 8));
1933 } else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
1934 return NaN;
1935 }
1936 var trimmed = $trim(value);
1937 if (trimmed !== value) {
1938 return ToNumber(trimmed);
1939 }
1940
1941 }
1942 return $Number(value);
1943};
1944
1945},{"../helpers/isPrimitive":24,"../helpers/regexTester":25,"./ToPrimitive":19,"call-bind/callBound":10,"get-intrinsic":33}],18:[function(require,module,exports){
1946'use strict';
1947
1948var GetIntrinsic = require('get-intrinsic');
1949
1950var $Object = GetIntrinsic('%Object%');
1951
1952var RequireObjectCoercible = require('./RequireObjectCoercible');
1953
1954// https://ecma-international.org/ecma-262/6.0/#sec-toobject
1955
1956module.exports = function ToObject(value) {
1957 RequireObjectCoercible(value);
1958 return $Object(value);
1959};
1960
1961},{"./RequireObjectCoercible":16,"get-intrinsic":33}],19:[function(require,module,exports){
1962'use strict';
1963
1964var toPrimitive = require('es-to-primitive/es2015');
1965
1966// https://ecma-international.org/ecma-262/6.0/#sec-toprimitive
1967
1968module.exports = function ToPrimitive(input) {
1969 if (arguments.length > 1) {
1970 return toPrimitive(input, arguments[1]);
1971 }
1972 return toPrimitive(input);
1973};
1974
1975},{"es-to-primitive/es2015":27}],20:[function(require,module,exports){
1976'use strict';
1977
1978var GetIntrinsic = require('get-intrinsic');
1979
1980var $String = GetIntrinsic('%String%');
1981var $TypeError = GetIntrinsic('%TypeError%');
1982
1983// https://ecma-international.org/ecma-262/6.0/#sec-tostring
1984
1985module.exports = function ToString(argument) {
1986 if (typeof argument === 'symbol') {
1987 throw new $TypeError('Cannot convert a Symbol value to a string');
1988 }
1989 return $String(argument);
1990};
1991
1992},{"get-intrinsic":33}],21:[function(require,module,exports){
1993'use strict';
1994
1995var ToNumber = require('./ToNumber');
1996
1997// http://262.ecma-international.org/5.1/#sec-9.6
1998
1999module.exports = function ToUint32(x) {
2000 return ToNumber(x) >>> 0;
2001};
2002
2003},{"./ToNumber":17}],22:[function(require,module,exports){
2004'use strict';
2005
2006var GetIntrinsic = require('get-intrinsic');
2007
2008var $TypeError = GetIntrinsic('%TypeError%');
2009
2010// http://262.ecma-international.org/5.1/#sec-9.10
2011
2012module.exports = function CheckObjectCoercible(value, optMessage) {
2013 if (value == null) {
2014 throw new $TypeError(optMessage || ('Cannot call method on ' + value));
2015 }
2016 return value;
2017};
2018
2019},{"get-intrinsic":33}],23:[function(require,module,exports){
2020'use strict';
2021
2022var GetIntrinsic = require('get-intrinsic');
2023
2024var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true);
2025if ($gOPD) {
2026 try {
2027 $gOPD([], 'length');
2028 } catch (e) {
2029 // IE 8 has a broken gOPD
2030 $gOPD = null;
2031 }
2032}
2033
2034module.exports = $gOPD;
2035
2036},{"get-intrinsic":33}],24:[function(require,module,exports){
2037'use strict';
2038
2039module.exports = function isPrimitive(value) {
2040 return value === null || (typeof value !== 'function' && typeof value !== 'object');
2041};
2042
2043},{}],25:[function(require,module,exports){
2044'use strict';
2045
2046var callBound = require('call-bind/callBound');
2047
2048var $exec = callBound('RegExp.prototype.exec');
2049
2050module.exports = function regexTester(regex) {
2051 return function test(s) { return $exec(regex, s) !== null; };
2052};
2053
2054},{"call-bind/callBound":10}],26:[function(require,module,exports){
2055(function (process){
2056'use strict';
2057
2058/* eslint global-require: 0 */
2059// the code is structured this way so that bundlers can
2060// alias out `has-symbols` to `() => true` or `() => false` if your target
2061// environments' Symbol capabilities are known, and then use
2062// dead code elimination on the rest of this module.
2063//
2064// Similarly, `isarray` can be aliased to `Array.isArray` if
2065// available in all target environments.
2066
2067var isArguments = require('is-arguments');
2068
2069if (require('has-symbols')() || require('has-symbols/shams')()) {
2070 var $iterator = Symbol.iterator;
2071 // Symbol is available natively or shammed
2072 // natively:
2073 // - Chrome >= 38
2074 // - Edge 12-14?, Edge >= 15 for sure
2075 // - FF >= 36
2076 // - Safari >= 9
2077 // - node >= 0.12
2078 module.exports = function getIterator(iterable) {
2079 // alternatively, `iterable[$iterator]?.()`
2080 if (iterable != null && typeof iterable[$iterator] !== 'undefined') {
2081 return iterable[$iterator]();
2082 }
2083 if (isArguments(iterable)) {
2084 // arguments objects lack Symbol.iterator
2085 // - node 0.12
2086 return Array.prototype[$iterator].call(iterable);
2087 }
2088 };
2089} else {
2090 // Symbol is not available, native or shammed
2091 var isArray = require('isarray');
2092 var isString = require('is-string');
2093 var GetIntrinsic = require('get-intrinsic');
2094 var $Map = GetIntrinsic('%Map%', true);
2095 var $Set = GetIntrinsic('%Set%', true);
2096 var callBound = require('call-bind/callBound');
2097 var $arrayPush = callBound('Array.prototype.push');
2098 var $charCodeAt = callBound('String.prototype.charCodeAt');
2099 var $stringSlice = callBound('String.prototype.slice');
2100
2101 var advanceStringIndex = function advanceStringIndex(S, index) {
2102 var length = S.length;
2103 if ((index + 1) >= length) {
2104 return index + 1;
2105 }
2106
2107 var first = $charCodeAt(S, index);
2108 if (first < 0xD800 || first > 0xDBFF) {
2109 return index + 1;
2110 }
2111
2112 var second = $charCodeAt(S, index + 1);
2113 if (second < 0xDC00 || second > 0xDFFF) {
2114 return index + 1;
2115 }
2116
2117 return index + 2;
2118 };
2119
2120 var getArrayIterator = function getArrayIterator(arraylike) {
2121 var i = 0;
2122 return {
2123 next: function next() {
2124 var done = i >= arraylike.length;
2125 var value;
2126 if (!done) {
2127 value = arraylike[i];
2128 i += 1;
2129 }
2130 return {
2131 done: done,
2132 value: value
2133 };
2134 }
2135 };
2136 };
2137
2138 var getNonCollectionIterator = function getNonCollectionIterator(iterable, noPrimordialCollections) {
2139 if (isArray(iterable) || isArguments(iterable)) {
2140 return getArrayIterator(iterable);
2141 }
2142 if (isString(iterable)) {
2143 var i = 0;
2144 return {
2145 next: function next() {
2146 var nextIndex = advanceStringIndex(iterable, i);
2147 var value = $stringSlice(iterable, i, nextIndex);
2148 i = nextIndex;
2149 return {
2150 done: nextIndex > iterable.length,
2151 value: value
2152 };
2153 }
2154 };
2155 }
2156
2157 // es6-shim and es-shims' es-map use a string "_es6-shim iterator_" property on different iterables, such as MapIterator.
2158 if (noPrimordialCollections && typeof iterable['_es6-shim iterator_'] !== 'undefined') {
2159 return iterable['_es6-shim iterator_']();
2160 }
2161 };
2162
2163 if (!$Map && !$Set) {
2164 // the only language iterables are Array, String, arguments
2165 // - Safari <= 6.0
2166 // - Chrome < 38
2167 // - node < 0.12
2168 // - FF < 13
2169 // - IE < 11
2170 // - Edge < 11
2171
2172 module.exports = function getIterator(iterable) {
2173 if (iterable != null) {
2174 return getNonCollectionIterator(iterable, true);
2175 }
2176 };
2177 } else {
2178 // either Map or Set are available, but Symbol is not
2179 // - es6-shim on an ES5 browser
2180 // - Safari 6.2 (maybe 6.1?)
2181 // - FF v[13, 36)
2182 // - IE 11
2183 // - Edge 11
2184 // - Safari v[6, 9)
2185
2186 var isMap = require('is-map');
2187 var isSet = require('is-set');
2188
2189 // Firefox >= 27, IE 11, Safari 6.2 - 9, Edge 11, es6-shim in older envs, all have forEach
2190 var $mapForEach = callBound('Map.prototype.forEach', true);
2191 var $setForEach = callBound('Set.prototype.forEach', true);
2192 if (typeof process === 'undefined' || !process.versions || !process.versions.node) { // "if is not node"
2193
2194 // Firefox 17 - 26 has `.iterator()`, whose iterator `.next()` either
2195 // returns a value, or throws a StopIteration object. These browsers
2196 // do not have any other mechanism for iteration.
2197 var $mapIterator = callBound('Map.prototype.iterator', true);
2198 var $setIterator = callBound('Set.prototype.iterator', true);
2199 var getStopIterationIterator = function (iterator) {
2200 var done = false;
2201 return {
2202 next: function next() {
2203 try {
2204 return {
2205 done: done,
2206 value: done ? undefined : iterator.next()
2207 };
2208 } catch (e) {
2209 done = true;
2210 return {
2211 done: true,
2212 value: undefined
2213 };
2214 }
2215 }
2216 };
2217 };
2218 }
2219 // Firefox 27-35, and some older es6-shim versions, use a string "@@iterator" property
2220 // this returns a proper iterator object, so we should use it instead of forEach.
2221 // newer es6-shim versions use a string "_es6-shim iterator_" property.
2222 var $mapAtAtIterator = callBound('Map.prototype.@@iterator', true) || callBound('Map.prototype._es6-shim iterator_', true);
2223 var $setAtAtIterator = callBound('Set.prototype.@@iterator', true) || callBound('Set.prototype._es6-shim iterator_', true);
2224
2225 var getCollectionIterator = function getCollectionIterator(iterable) {
2226 if (isMap(iterable)) {
2227 if ($mapIterator) {
2228 return getStopIterationIterator($mapIterator(iterable));
2229 }
2230 if ($mapAtAtIterator) {
2231 return $mapAtAtIterator(iterable);
2232 }
2233 if ($mapForEach) {
2234 var entries = [];
2235 $mapForEach(iterable, function (v, k) {
2236 $arrayPush(entries, [k, v]);
2237 });
2238 return getArrayIterator(entries);
2239 }
2240 }
2241 if (isSet(iterable)) {
2242 if ($setIterator) {
2243 return getStopIterationIterator($setIterator(iterable));
2244 }
2245 if ($setAtAtIterator) {
2246 return $setAtAtIterator(iterable);
2247 }
2248 if ($setForEach) {
2249 var values = [];
2250 $setForEach(iterable, function (v) {
2251 $arrayPush(values, v);
2252 });
2253 return getArrayIterator(values);
2254 }
2255 }
2256 };
2257
2258 module.exports = function getIterator(iterable) {
2259 return getCollectionIterator(iterable) || getNonCollectionIterator(iterable);
2260 };
2261 }
2262}
2263
2264}).call(this,require("KliubH"))
2265},{"KliubH":91,"call-bind/callBound":10,"get-intrinsic":33,"has-symbols":36,"has-symbols/shams":37,"is-arguments":41,"is-map":46,"is-set":49,"is-string":50,"isarray":55}],27:[function(require,module,exports){
2266'use strict';
2267
2268var hasSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
2269
2270var isPrimitive = require('./helpers/isPrimitive');
2271var isCallable = require('is-callable');
2272var isDate = require('is-date-object');
2273var isSymbol = require('is-symbol');
2274
2275var ordinaryToPrimitive = function OrdinaryToPrimitive(O, hint) {
2276 if (typeof O === 'undefined' || O === null) {
2277 throw new TypeError('Cannot call method on ' + O);
2278 }
2279 if (typeof hint !== 'string' || (hint !== 'number' && hint !== 'string')) {
2280 throw new TypeError('hint must be "string" or "number"');
2281 }
2282 var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
2283 var method, result, i;
2284 for (i = 0; i < methodNames.length; ++i) {
2285 method = O[methodNames[i]];
2286 if (isCallable(method)) {
2287 result = method.call(O);
2288 if (isPrimitive(result)) {
2289 return result;
2290 }
2291 }
2292 }
2293 throw new TypeError('No default value');
2294};
2295
2296var GetMethod = function GetMethod(O, P) {
2297 var func = O[P];
2298 if (func !== null && typeof func !== 'undefined') {
2299 if (!isCallable(func)) {
2300 throw new TypeError(func + ' returned for property ' + P + ' of object ' + O + ' is not a function');
2301 }
2302 return func;
2303 }
2304 return void 0;
2305};
2306
2307// http://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive
2308module.exports = function ToPrimitive(input) {
2309 if (isPrimitive(input)) {
2310 return input;
2311 }
2312 var hint = 'default';
2313 if (arguments.length > 1) {
2314 if (arguments[1] === String) {
2315 hint = 'string';
2316 } else if (arguments[1] === Number) {
2317 hint = 'number';
2318 }
2319 }
2320
2321 var exoticToPrim;
2322 if (hasSymbols) {
2323 if (Symbol.toPrimitive) {
2324 exoticToPrim = GetMethod(input, Symbol.toPrimitive);
2325 } else if (isSymbol(input)) {
2326 exoticToPrim = Symbol.prototype.valueOf;
2327 }
2328 }
2329 if (typeof exoticToPrim !== 'undefined') {
2330 var result = exoticToPrim.call(input, hint);
2331 if (isPrimitive(result)) {
2332 return result;
2333 }
2334 throw new TypeError('unable to convert exotic object to primitive');
2335 }
2336 if (hint === 'default' && (isDate(input) || isSymbol(input))) {
2337 hint = 'string';
2338 }
2339 return ordinaryToPrimitive(input, hint === 'default' ? 'number' : hint);
2340};
2341
2342},{"./helpers/isPrimitive":28,"is-callable":44,"is-date-object":45,"is-symbol":51}],28:[function(require,module,exports){
2343module.exports=require(24)
2344},{}],29:[function(require,module,exports){
2345'use strict';
2346
2347var isCallable = require('is-callable');
2348
2349var toStr = Object.prototype.toString;
2350var hasOwnProperty = Object.prototype.hasOwnProperty;
2351
2352var forEachArray = function forEachArray(array, iterator, receiver) {
2353 for (var i = 0, len = array.length; i < len; i++) {
2354 if (hasOwnProperty.call(array, i)) {
2355 if (receiver == null) {
2356 iterator(array[i], i, array);
2357 } else {
2358 iterator.call(receiver, array[i], i, array);
2359 }
2360 }
2361 }
2362};
2363
2364var forEachString = function forEachString(string, iterator, receiver) {
2365 for (var i = 0, len = string.length; i < len; i++) {
2366 // no such thing as a sparse string.
2367 if (receiver == null) {
2368 iterator(string.charAt(i), i, string);
2369 } else {
2370 iterator.call(receiver, string.charAt(i), i, string);
2371 }
2372 }
2373};
2374
2375var forEachObject = function forEachObject(object, iterator, receiver) {
2376 for (var k in object) {
2377 if (hasOwnProperty.call(object, k)) {
2378 if (receiver == null) {
2379 iterator(object[k], k, object);
2380 } else {
2381 iterator.call(receiver, object[k], k, object);
2382 }
2383 }
2384 }
2385};
2386
2387var forEach = function forEach(list, iterator, thisArg) {
2388 if (!isCallable(iterator)) {
2389 throw new TypeError('iterator must be a function');
2390 }
2391
2392 var receiver;
2393 if (arguments.length >= 3) {
2394 receiver = thisArg;
2395 }
2396
2397 if (toStr.call(list) === '[object Array]') {
2398 forEachArray(list, iterator, receiver);
2399 } else if (typeof list === 'string') {
2400 forEachString(list, iterator, receiver);
2401 } else {
2402 forEachObject(list, iterator, receiver);
2403 }
2404};
2405
2406module.exports = forEach;
2407
2408},{"is-callable":44}],30:[function(require,module,exports){
2409'use strict';
2410
2411/* eslint no-invalid-this: 1 */
2412
2413var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
2414var slice = Array.prototype.slice;
2415var toStr = Object.prototype.toString;
2416var funcType = '[object Function]';
2417
2418module.exports = function bind(that) {
2419 var target = this;
2420 if (typeof target !== 'function' || toStr.call(target) !== funcType) {
2421 throw new TypeError(ERROR_MESSAGE + target);
2422 }
2423 var args = slice.call(arguments, 1);
2424
2425 var bound;
2426 var binder = function () {
2427 if (this instanceof bound) {
2428 var result = target.apply(
2429 this,
2430 args.concat(slice.call(arguments))
2431 );
2432 if (Object(result) === result) {
2433 return result;
2434 }
2435 return this;
2436 } else {
2437 return target.apply(
2438 that,
2439 args.concat(slice.call(arguments))
2440 );
2441 }
2442 };
2443
2444 var boundLength = Math.max(0, target.length - args.length);
2445 var boundArgs = [];
2446 for (var i = 0; i < boundLength; i++) {
2447 boundArgs.push('$' + i);
2448 }
2449
2450 bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);
2451
2452 if (target.prototype) {
2453 var Empty = function Empty() {};
2454 Empty.prototype = target.prototype;
2455 bound.prototype = new Empty();
2456 Empty.prototype = null;
2457 }
2458
2459 return bound;
2460};
2461
2462},{}],31:[function(require,module,exports){
2463'use strict';
2464
2465var implementation = require('./implementation');
2466
2467module.exports = Function.prototype.bind || implementation;
2468
2469},{"./implementation":30}],32:[function(require,module,exports){
2470'use strict';
2471
2472var functionsHaveNames = function functionsHaveNames() {
2473 return typeof function f() {}.name === 'string';
2474};
2475
2476var gOPD = Object.getOwnPropertyDescriptor;
2477if (gOPD) {
2478 try {
2479 gOPD([], 'length');
2480 } catch (e) {
2481 // IE 8 has a broken gOPD
2482 gOPD = null;
2483 }
2484}
2485
2486functionsHaveNames.functionsHaveConfigurableNames = function functionsHaveConfigurableNames() {
2487 if (!functionsHaveNames() || !gOPD) {
2488 return false;
2489 }
2490 var desc = gOPD(function () {}, 'name');
2491 return !!desc && !!desc.configurable;
2492};
2493
2494var $bind = Function.prototype.bind;
2495
2496functionsHaveNames.boundFunctionsHaveNames = function boundFunctionsHaveNames() {
2497 return functionsHaveNames() && typeof $bind === 'function' && function f() {}.bind().name !== '';
2498};
2499
2500module.exports = functionsHaveNames;
2501
2502},{}],33:[function(require,module,exports){
2503'use strict';
2504
2505var undefined;
2506
2507var $SyntaxError = SyntaxError;
2508var $Function = Function;
2509var $TypeError = TypeError;
2510
2511// eslint-disable-next-line consistent-return
2512var getEvalledConstructor = function (expressionSyntax) {
2513 try {
2514 return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')();
2515 } catch (e) {}
2516};
2517
2518var $gOPD = Object.getOwnPropertyDescriptor;
2519if ($gOPD) {
2520 try {
2521 $gOPD({}, '');
2522 } catch (e) {
2523 $gOPD = null; // this is IE 8, which has a broken gOPD
2524 }
2525}
2526
2527var throwTypeError = function () {
2528 throw new $TypeError();
2529};
2530var ThrowTypeError = $gOPD
2531 ? (function () {
2532 try {
2533 // eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties
2534 arguments.callee; // IE 8 does not throw here
2535 return throwTypeError;
2536 } catch (calleeThrows) {
2537 try {
2538 // IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')
2539 return $gOPD(arguments, 'callee').get;
2540 } catch (gOPDthrows) {
2541 return throwTypeError;
2542 }
2543 }
2544 }())
2545 : throwTypeError;
2546
2547var hasSymbols = require('has-symbols')();
2548
2549var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto
2550
2551var needsEval = {};
2552
2553var TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);
2554
2555var INTRINSICS = {
2556 '%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,
2557 '%Array%': Array,
2558 '%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,
2559 '%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,
2560 '%AsyncFromSyncIteratorPrototype%': undefined,
2561 '%AsyncFunction%': needsEval,
2562 '%AsyncGenerator%': needsEval,
2563 '%AsyncGeneratorFunction%': needsEval,
2564 '%AsyncIteratorPrototype%': needsEval,
2565 '%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,
2566 '%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,
2567 '%Boolean%': Boolean,
2568 '%DataView%': typeof DataView === 'undefined' ? undefined : DataView,
2569 '%Date%': Date,
2570 '%decodeURI%': decodeURI,
2571 '%decodeURIComponent%': decodeURIComponent,
2572 '%encodeURI%': encodeURI,
2573 '%encodeURIComponent%': encodeURIComponent,
2574 '%Error%': Error,
2575 '%eval%': eval, // eslint-disable-line no-eval
2576 '%EvalError%': EvalError,
2577 '%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,
2578 '%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,
2579 '%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,
2580 '%Function%': $Function,
2581 '%GeneratorFunction%': needsEval,
2582 '%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,
2583 '%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,
2584 '%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,
2585 '%isFinite%': isFinite,
2586 '%isNaN%': isNaN,
2587 '%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,
2588 '%JSON%': typeof JSON === 'object' ? JSON : undefined,
2589 '%Map%': typeof Map === 'undefined' ? undefined : Map,
2590 '%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),
2591 '%Math%': Math,
2592 '%Number%': Number,
2593 '%Object%': Object,
2594 '%parseFloat%': parseFloat,
2595 '%parseInt%': parseInt,
2596 '%Promise%': typeof Promise === 'undefined' ? undefined : Promise,
2597 '%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,
2598 '%RangeError%': RangeError,
2599 '%ReferenceError%': ReferenceError,
2600 '%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,
2601 '%RegExp%': RegExp,
2602 '%Set%': typeof Set === 'undefined' ? undefined : Set,
2603 '%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),
2604 '%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,
2605 '%String%': String,
2606 '%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,
2607 '%Symbol%': hasSymbols ? Symbol : undefined,
2608 '%SyntaxError%': $SyntaxError,
2609 '%ThrowTypeError%': ThrowTypeError,
2610 '%TypedArray%': TypedArray,
2611 '%TypeError%': $TypeError,
2612 '%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,
2613 '%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,
2614 '%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,
2615 '%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,
2616 '%URIError%': URIError,
2617 '%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,
2618 '%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,
2619 '%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet
2620};
2621
2622var doEval = function doEval(name) {
2623 var value;
2624 if (name === '%AsyncFunction%') {
2625 value = getEvalledConstructor('async function () {}');
2626 } else if (name === '%GeneratorFunction%') {
2627 value = getEvalledConstructor('function* () {}');
2628 } else if (name === '%AsyncGeneratorFunction%') {
2629 value = getEvalledConstructor('async function* () {}');
2630 } else if (name === '%AsyncGenerator%') {
2631 var fn = doEval('%AsyncGeneratorFunction%');
2632 if (fn) {
2633 value = fn.prototype;
2634 }
2635 } else if (name === '%AsyncIteratorPrototype%') {
2636 var gen = doEval('%AsyncGenerator%');
2637 if (gen) {
2638 value = getProto(gen.prototype);
2639 }
2640 }
2641
2642 INTRINSICS[name] = value;
2643
2644 return value;
2645};
2646
2647var LEGACY_ALIASES = {
2648 '%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],
2649 '%ArrayPrototype%': ['Array', 'prototype'],
2650 '%ArrayProto_entries%': ['Array', 'prototype', 'entries'],
2651 '%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],
2652 '%ArrayProto_keys%': ['Array', 'prototype', 'keys'],
2653 '%ArrayProto_values%': ['Array', 'prototype', 'values'],
2654 '%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],
2655 '%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],
2656 '%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],
2657 '%BooleanPrototype%': ['Boolean', 'prototype'],
2658 '%DataViewPrototype%': ['DataView', 'prototype'],
2659 '%DatePrototype%': ['Date', 'prototype'],
2660 '%ErrorPrototype%': ['Error', 'prototype'],
2661 '%EvalErrorPrototype%': ['EvalError', 'prototype'],
2662 '%Float32ArrayPrototype%': ['Float32Array', 'prototype'],
2663 '%Float64ArrayPrototype%': ['Float64Array', 'prototype'],
2664 '%FunctionPrototype%': ['Function', 'prototype'],
2665 '%Generator%': ['GeneratorFunction', 'prototype'],
2666 '%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],
2667 '%Int8ArrayPrototype%': ['Int8Array', 'prototype'],
2668 '%Int16ArrayPrototype%': ['Int16Array', 'prototype'],
2669 '%Int32ArrayPrototype%': ['Int32Array', 'prototype'],
2670 '%JSONParse%': ['JSON', 'parse'],
2671 '%JSONStringify%': ['JSON', 'stringify'],
2672 '%MapPrototype%': ['Map', 'prototype'],
2673 '%NumberPrototype%': ['Number', 'prototype'],
2674 '%ObjectPrototype%': ['Object', 'prototype'],
2675 '%ObjProto_toString%': ['Object', 'prototype', 'toString'],
2676 '%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],
2677 '%PromisePrototype%': ['Promise', 'prototype'],
2678 '%PromiseProto_then%': ['Promise', 'prototype', 'then'],
2679 '%Promise_all%': ['Promise', 'all'],
2680 '%Promise_reject%': ['Promise', 'reject'],
2681 '%Promise_resolve%': ['Promise', 'resolve'],
2682 '%RangeErrorPrototype%': ['RangeError', 'prototype'],
2683 '%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],
2684 '%RegExpPrototype%': ['RegExp', 'prototype'],
2685 '%SetPrototype%': ['Set', 'prototype'],
2686 '%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],
2687 '%StringPrototype%': ['String', 'prototype'],
2688 '%SymbolPrototype%': ['Symbol', 'prototype'],
2689 '%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],
2690 '%TypedArrayPrototype%': ['TypedArray', 'prototype'],
2691 '%TypeErrorPrototype%': ['TypeError', 'prototype'],
2692 '%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],
2693 '%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],
2694 '%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],
2695 '%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],
2696 '%URIErrorPrototype%': ['URIError', 'prototype'],
2697 '%WeakMapPrototype%': ['WeakMap', 'prototype'],
2698 '%WeakSetPrototype%': ['WeakSet', 'prototype']
2699};
2700
2701var bind = require('function-bind');
2702var hasOwn = require('has');
2703var $concat = bind.call(Function.call, Array.prototype.concat);
2704var $spliceApply = bind.call(Function.apply, Array.prototype.splice);
2705var $replace = bind.call(Function.call, String.prototype.replace);
2706var $strSlice = bind.call(Function.call, String.prototype.slice);
2707
2708/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */
2709var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g;
2710var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */
2711var stringToPath = function stringToPath(string) {
2712 var first = $strSlice(string, 0, 1);
2713 var last = $strSlice(string, -1);
2714 if (first === '%' && last !== '%') {
2715 throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`');
2716 } else if (last === '%' && first !== '%') {
2717 throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`');
2718 }
2719 var result = [];
2720 $replace(string, rePropName, function (match, number, quote, subString) {
2721 result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;
2722 });
2723 return result;
2724};
2725/* end adaptation */
2726
2727var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {
2728 var intrinsicName = name;
2729 var alias;
2730 if (hasOwn(LEGACY_ALIASES, intrinsicName)) {
2731 alias = LEGACY_ALIASES[intrinsicName];
2732 intrinsicName = '%' + alias[0] + '%';
2733 }
2734
2735 if (hasOwn(INTRINSICS, intrinsicName)) {
2736 var value = INTRINSICS[intrinsicName];
2737 if (value === needsEval) {
2738 value = doEval(intrinsicName);
2739 }
2740 if (typeof value === 'undefined' && !allowMissing) {
2741 throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');
2742 }
2743
2744 return {
2745 alias: alias,
2746 name: intrinsicName,
2747 value: value
2748 };
2749 }
2750
2751 throw new $SyntaxError('intrinsic ' + name + ' does not exist!');
2752};
2753
2754module.exports = function GetIntrinsic(name, allowMissing) {
2755 if (typeof name !== 'string' || name.length === 0) {
2756 throw new $TypeError('intrinsic name must be a non-empty string');
2757 }
2758 if (arguments.length > 1 && typeof allowMissing !== 'boolean') {
2759 throw new $TypeError('"allowMissing" argument must be a boolean');
2760 }
2761
2762 var parts = stringToPath(name);
2763 var intrinsicBaseName = parts.length > 0 ? parts[0] : '';
2764
2765 var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);
2766 var intrinsicRealName = intrinsic.name;
2767 var value = intrinsic.value;
2768 var skipFurtherCaching = false;
2769
2770 var alias = intrinsic.alias;
2771 if (alias) {
2772 intrinsicBaseName = alias[0];
2773 $spliceApply(parts, $concat([0, 1], alias));
2774 }
2775
2776 for (var i = 1, isOwn = true; i < parts.length; i += 1) {
2777 var part = parts[i];
2778 var first = $strSlice(part, 0, 1);
2779 var last = $strSlice(part, -1);
2780 if (
2781 (
2782 (first === '"' || first === "'" || first === '`')
2783 || (last === '"' || last === "'" || last === '`')
2784 )
2785 && first !== last
2786 ) {
2787 throw new $SyntaxError('property names with quotes must have matching quotes');
2788 }
2789 if (part === 'constructor' || !isOwn) {
2790 skipFurtherCaching = true;
2791 }
2792
2793 intrinsicBaseName += '.' + part;
2794 intrinsicRealName = '%' + intrinsicBaseName + '%';
2795
2796 if (hasOwn(INTRINSICS, intrinsicRealName)) {
2797 value = INTRINSICS[intrinsicRealName];
2798 } else if (value != null) {
2799 if (!(part in value)) {
2800 if (!allowMissing) {
2801 throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');
2802 }
2803 return void undefined;
2804 }
2805 if ($gOPD && (i + 1) >= parts.length) {
2806 var desc = $gOPD(value, part);
2807 isOwn = !!desc;
2808
2809 // By convention, when a data property is converted to an accessor
2810 // property to emulate a data property that does not suffer from
2811 // the override mistake, that accessor's getter is marked with
2812 // an `originalValue` property. Here, when we detect this, we
2813 // uphold the illusion by pretending to see that original data
2814 // property, i.e., returning the value rather than the getter
2815 // itself.
2816 if (isOwn && 'get' in desc && !('originalValue' in desc.get)) {
2817 value = desc.get;
2818 } else {
2819 value = value[part];
2820 }
2821 } else {
2822 isOwn = hasOwn(value, part);
2823 value = value[part];
2824 }
2825
2826 if (isOwn && !skipFurtherCaching) {
2827 INTRINSICS[intrinsicRealName] = value;
2828 }
2829 }
2830 }
2831 return value;
2832};
2833
2834},{"function-bind":31,"has":39,"has-symbols":36}],34:[function(require,module,exports){
2835'use strict';
2836
2837var $BigInt = typeof BigInt !== 'undefined' && BigInt;
2838
2839module.exports = function hasNativeBigInts() {
2840 return typeof $BigInt === 'function'
2841 && typeof BigInt === 'function'
2842 && typeof $BigInt(42) === 'bigint' // eslint-disable-line no-magic-numbers
2843 && typeof BigInt(42) === 'bigint'; // eslint-disable-line no-magic-numbers
2844};
2845
2846},{}],35:[function(require,module,exports){
2847'use strict';
2848
2849var GetIntrinsic = require('get-intrinsic');
2850
2851var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);
2852
2853var hasPropertyDescriptors = function hasPropertyDescriptors() {
2854 if ($defineProperty) {
2855 try {
2856 $defineProperty({}, 'a', { value: 1 });
2857 return true;
2858 } catch (e) {
2859 // IE 8 has a broken defineProperty
2860 return false;
2861 }
2862 }
2863 return false;
2864};
2865
2866hasPropertyDescriptors.hasArrayLengthDefineBug = function hasArrayLengthDefineBug() {
2867 // node v0.6 has a bug where array lengths can be Set but not Defined
2868 if (!hasPropertyDescriptors()) {
2869 return null;
2870 }
2871 try {
2872 return $defineProperty([], 'length', { value: 1 }).length !== 1;
2873 } catch (e) {
2874 // In Firefox 4-22, defining length on an array throws an exception.
2875 return true;
2876 }
2877};
2878
2879module.exports = hasPropertyDescriptors;
2880
2881},{"get-intrinsic":33}],36:[function(require,module,exports){
2882'use strict';
2883
2884var origSymbol = typeof Symbol !== 'undefined' && Symbol;
2885var hasSymbolSham = require('./shams');
2886
2887module.exports = function hasNativeSymbols() {
2888 if (typeof origSymbol !== 'function') { return false; }
2889 if (typeof Symbol !== 'function') { return false; }
2890 if (typeof origSymbol('foo') !== 'symbol') { return false; }
2891 if (typeof Symbol('bar') !== 'symbol') { return false; }
2892
2893 return hasSymbolSham();
2894};
2895
2896},{"./shams":37}],37:[function(require,module,exports){
2897'use strict';
2898
2899/* eslint complexity: [2, 18], max-statements: [2, 33] */
2900module.exports = function hasSymbols() {
2901 if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
2902 if (typeof Symbol.iterator === 'symbol') { return true; }
2903
2904 var obj = {};
2905 var sym = Symbol('test');
2906 var symObj = Object(sym);
2907 if (typeof sym === 'string') { return false; }
2908
2909 if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
2910 if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }
2911
2912 // temp disabled per https://github.com/ljharb/object.assign/issues/17
2913 // if (sym instanceof Symbol) { return false; }
2914 // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
2915 // if (!(symObj instanceof Symbol)) { return false; }
2916
2917 // if (typeof Symbol.prototype.toString !== 'function') { return false; }
2918 // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }
2919
2920 var symVal = 42;
2921 obj[sym] = symVal;
2922 for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop
2923 if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }
2924
2925 if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }
2926
2927 var syms = Object.getOwnPropertySymbols(obj);
2928 if (syms.length !== 1 || syms[0] !== sym) { return false; }
2929
2930 if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }
2931
2932 if (typeof Object.getOwnPropertyDescriptor === 'function') {
2933 var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
2934 if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
2935 }
2936
2937 return true;
2938};
2939
2940},{}],38:[function(require,module,exports){
2941'use strict';
2942
2943var hasSymbols = require('has-symbols/shams');
2944
2945module.exports = function hasToStringTagShams() {
2946 return hasSymbols() && !!Symbol.toStringTag;
2947};
2948
2949},{"has-symbols/shams":37}],39:[function(require,module,exports){
2950'use strict';
2951
2952var bind = require('function-bind');
2953
2954module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);
2955
2956},{"function-bind":31}],40:[function(require,module,exports){
2957if (typeof Object.create === 'function') {
2958 // implementation from standard node.js 'util' module
2959 module.exports = function inherits(ctor, superCtor) {
2960 if (superCtor) {
2961 ctor.super_ = superCtor
2962 ctor.prototype = Object.create(superCtor.prototype, {
2963 constructor: {
2964 value: ctor,
2965 enumerable: false,
2966 writable: true,
2967 configurable: true
2968 }
2969 })
2970 }
2971 };
2972} else {
2973 // old school shim for old browsers
2974 module.exports = function inherits(ctor, superCtor) {
2975 if (superCtor) {
2976 ctor.super_ = superCtor
2977 var TempCtor = function () {}
2978 TempCtor.prototype = superCtor.prototype
2979 ctor.prototype = new TempCtor()
2980 ctor.prototype.constructor = ctor
2981 }
2982 }
2983}
2984
2985},{}],41:[function(require,module,exports){
2986'use strict';
2987
2988var hasToStringTag = require('has-tostringtag/shams')();
2989var callBound = require('call-bind/callBound');
2990
2991var $toString = callBound('Object.prototype.toString');
2992
2993var isStandardArguments = function isArguments(value) {
2994 if (hasToStringTag && value && typeof value === 'object' && Symbol.toStringTag in value) {
2995 return false;
2996 }
2997 return $toString(value) === '[object Arguments]';
2998};
2999
3000var isLegacyArguments = function isArguments(value) {
3001 if (isStandardArguments(value)) {
3002 return true;
3003 }
3004 return value !== null &&
3005 typeof value === 'object' &&
3006 typeof value.length === 'number' &&
3007 value.length >= 0 &&
3008 $toString(value) !== '[object Array]' &&
3009 $toString(value.callee) === '[object Function]';
3010};
3011
3012var supportsStandardArguments = (function () {
3013 return isStandardArguments(arguments);
3014}());
3015
3016isStandardArguments.isLegacyArguments = isLegacyArguments; // for tests
3017
3018module.exports = supportsStandardArguments ? isStandardArguments : isLegacyArguments;
3019
3020},{"call-bind/callBound":10,"has-tostringtag/shams":38}],42:[function(require,module,exports){
3021'use strict';
3022
3023var hasBigInts = require('has-bigints')();
3024
3025if (hasBigInts) {
3026 var bigIntValueOf = BigInt.prototype.valueOf;
3027 var tryBigInt = function tryBigIntObject(value) {
3028 try {
3029 bigIntValueOf.call(value);
3030 return true;
3031 } catch (e) {
3032 }
3033 return false;
3034 };
3035
3036 module.exports = function isBigInt(value) {
3037 if (
3038 value === null
3039 || typeof value === 'undefined'
3040 || typeof value === 'boolean'
3041 || typeof value === 'string'
3042 || typeof value === 'number'
3043 || typeof value === 'symbol'
3044 || typeof value === 'function'
3045 ) {
3046 return false;
3047 }
3048 if (typeof value === 'bigint') {
3049 return true;
3050 }
3051
3052 return tryBigInt(value);
3053 };
3054} else {
3055 module.exports = function isBigInt(value) {
3056 return false && value;
3057 };
3058}
3059
3060},{"has-bigints":34}],43:[function(require,module,exports){
3061'use strict';
3062
3063var callBound = require('call-bind/callBound');
3064var $boolToStr = callBound('Boolean.prototype.toString');
3065var $toString = callBound('Object.prototype.toString');
3066
3067var tryBooleanObject = function booleanBrandCheck(value) {
3068 try {
3069 $boolToStr(value);
3070 return true;
3071 } catch (e) {
3072 return false;
3073 }
3074};
3075var boolClass = '[object Boolean]';
3076var hasToStringTag = require('has-tostringtag/shams')();
3077
3078module.exports = function isBoolean(value) {
3079 if (typeof value === 'boolean') {
3080 return true;
3081 }
3082 if (value === null || typeof value !== 'object') {
3083 return false;
3084 }
3085 return hasToStringTag && Symbol.toStringTag in value ? tryBooleanObject(value) : $toString(value) === boolClass;
3086};
3087
3088},{"call-bind/callBound":10,"has-tostringtag/shams":38}],44:[function(require,module,exports){
3089'use strict';
3090
3091var fnToStr = Function.prototype.toString;
3092var reflectApply = typeof Reflect === 'object' && Reflect !== null && Reflect.apply;
3093var badArrayLike;
3094var isCallableMarker;
3095if (typeof reflectApply === 'function' && typeof Object.defineProperty === 'function') {
3096 try {
3097 badArrayLike = Object.defineProperty({}, 'length', {
3098 get: function () {
3099 throw isCallableMarker;
3100 }
3101 });
3102 isCallableMarker = {};
3103 // eslint-disable-next-line no-throw-literal
3104 reflectApply(function () { throw 42; }, null, badArrayLike);
3105 } catch (_) {
3106 if (_ !== isCallableMarker) {
3107 reflectApply = null;
3108 }
3109 }
3110} else {
3111 reflectApply = null;
3112}
3113
3114var constructorRegex = /^\s*class\b/;
3115var isES6ClassFn = function isES6ClassFunction(value) {
3116 try {
3117 var fnStr = fnToStr.call(value);
3118 return constructorRegex.test(fnStr);
3119 } catch (e) {
3120 return false; // not a function
3121 }
3122};
3123
3124var tryFunctionObject = function tryFunctionToStr(value) {
3125 try {
3126 if (isES6ClassFn(value)) { return false; }
3127 fnToStr.call(value);
3128 return true;
3129 } catch (e) {
3130 return false;
3131 }
3132};
3133var toStr = Object.prototype.toString;
3134var fnClass = '[object Function]';
3135var genClass = '[object GeneratorFunction]';
3136var hasToStringTag = typeof Symbol === 'function' && !!Symbol.toStringTag; // better: use `has-tostringtag`
3137/* globals document: false */
3138var documentDotAll = typeof document === 'object' && typeof document.all === 'undefined' && document.all !== undefined ? document.all : {};
3139
3140module.exports = reflectApply
3141 ? function isCallable(value) {
3142 if (value === documentDotAll) { return true; }
3143 if (!value) { return false; }
3144 if (typeof value !== 'function' && typeof value !== 'object') { return false; }
3145 if (typeof value === 'function' && !value.prototype) { return true; }
3146 try {
3147 reflectApply(value, null, badArrayLike);
3148 } catch (e) {
3149 if (e !== isCallableMarker) { return false; }
3150 }
3151 return !isES6ClassFn(value);
3152 }
3153 : function isCallable(value) {
3154 if (value === documentDotAll) { return true; }
3155 if (!value) { return false; }
3156 if (typeof value !== 'function' && typeof value !== 'object') { return false; }
3157 if (typeof value === 'function' && !value.prototype) { return true; }
3158 if (hasToStringTag) { return tryFunctionObject(value); }
3159 if (isES6ClassFn(value)) { return false; }
3160 var strClass = toStr.call(value);
3161 return strClass === fnClass || strClass === genClass;
3162 };
3163
3164},{}],45:[function(require,module,exports){
3165'use strict';
3166
3167var getDay = Date.prototype.getDay;
3168var tryDateObject = function tryDateGetDayCall(value) {
3169 try {
3170 getDay.call(value);
3171 return true;
3172 } catch (e) {
3173 return false;
3174 }
3175};
3176
3177var toStr = Object.prototype.toString;
3178var dateClass = '[object Date]';
3179var hasToStringTag = require('has-tostringtag/shams')();
3180
3181module.exports = function isDateObject(value) {
3182 if (typeof value !== 'object' || value === null) {
3183 return false;
3184 }
3185 return hasToStringTag ? tryDateObject(value) : toStr.call(value) === dateClass;
3186};
3187
3188},{"has-tostringtag/shams":38}],46:[function(require,module,exports){
3189'use strict';
3190
3191var $Map = typeof Map === 'function' && Map.prototype ? Map : null;
3192var $Set = typeof Set === 'function' && Set.prototype ? Set : null;
3193
3194var exported;
3195
3196if (!$Map) {
3197 // eslint-disable-next-line no-unused-vars
3198 exported = function isMap(x) {
3199 // `Map` is not present in this environment.
3200 return false;
3201 };
3202}
3203
3204var $mapHas = $Map ? Map.prototype.has : null;
3205var $setHas = $Set ? Set.prototype.has : null;
3206if (!exported && !$mapHas) {
3207 // eslint-disable-next-line no-unused-vars
3208 exported = function isMap(x) {
3209 // `Map` does not have a `has` method
3210 return false;
3211 };
3212}
3213
3214module.exports = exported || function isMap(x) {
3215 if (!x || typeof x !== 'object') {
3216 return false;
3217 }
3218 try {
3219 $mapHas.call(x);
3220 if ($setHas) {
3221 try {
3222 $setHas.call(x);
3223 } catch (e) {
3224 return true;
3225 }
3226 }
3227 return x instanceof $Map; // core-js workaround, pre-v2.5.0
3228 } catch (e) {}
3229 return false;
3230};
3231
3232},{}],47:[function(require,module,exports){
3233'use strict';
3234
3235var numToStr = Number.prototype.toString;
3236var tryNumberObject = function tryNumberObject(value) {
3237 try {
3238 numToStr.call(value);
3239 return true;
3240 } catch (e) {
3241 return false;
3242 }
3243};
3244var toStr = Object.prototype.toString;
3245var numClass = '[object Number]';
3246var hasToStringTag = require('has-tostringtag/shams')();
3247
3248module.exports = function isNumberObject(value) {
3249 if (typeof value === 'number') {
3250 return true;
3251 }
3252 if (typeof value !== 'object') {
3253 return false;
3254 }
3255 return hasToStringTag ? tryNumberObject(value) : toStr.call(value) === numClass;
3256};
3257
3258},{"has-tostringtag/shams":38}],48:[function(require,module,exports){
3259'use strict';
3260
3261var callBound = require('call-bind/callBound');
3262var hasToStringTag = require('has-tostringtag/shams')();
3263var has;
3264var $exec;
3265var isRegexMarker;
3266var badStringifier;
3267
3268if (hasToStringTag) {
3269 has = callBound('Object.prototype.hasOwnProperty');
3270 $exec = callBound('RegExp.prototype.exec');
3271 isRegexMarker = {};
3272
3273 var throwRegexMarker = function () {
3274 throw isRegexMarker;
3275 };
3276 badStringifier = {
3277 toString: throwRegexMarker,
3278 valueOf: throwRegexMarker
3279 };
3280
3281 if (typeof Symbol.toPrimitive === 'symbol') {
3282 badStringifier[Symbol.toPrimitive] = throwRegexMarker;
3283 }
3284}
3285
3286var $toString = callBound('Object.prototype.toString');
3287var gOPD = Object.getOwnPropertyDescriptor;
3288var regexClass = '[object RegExp]';
3289
3290module.exports = hasToStringTag
3291 // eslint-disable-next-line consistent-return
3292 ? function isRegex(value) {
3293 if (!value || typeof value !== 'object') {
3294 return false;
3295 }
3296
3297 var descriptor = gOPD(value, 'lastIndex');
3298 var hasLastIndexDataProperty = descriptor && has(descriptor, 'value');
3299 if (!hasLastIndexDataProperty) {
3300 return false;
3301 }
3302
3303 try {
3304 $exec(value, badStringifier);
3305 } catch (e) {
3306 return e === isRegexMarker;
3307 }
3308 }
3309 : function isRegex(value) {
3310 // In older browsers, typeof regex incorrectly returns 'function'
3311 if (!value || (typeof value !== 'object' && typeof value !== 'function')) {
3312 return false;
3313 }
3314
3315 return $toString(value) === regexClass;
3316 };
3317
3318},{"call-bind/callBound":10,"has-tostringtag/shams":38}],49:[function(require,module,exports){
3319'use strict';
3320
3321var $Map = typeof Map === 'function' && Map.prototype ? Map : null;
3322var $Set = typeof Set === 'function' && Set.prototype ? Set : null;
3323
3324var exported;
3325
3326if (!$Set) {
3327 // eslint-disable-next-line no-unused-vars
3328 exported = function isSet(x) {
3329 // `Set` is not present in this environment.
3330 return false;
3331 };
3332}
3333
3334var $mapHas = $Map ? Map.prototype.has : null;
3335var $setHas = $Set ? Set.prototype.has : null;
3336if (!exported && !$setHas) {
3337 // eslint-disable-next-line no-unused-vars
3338 exported = function isSet(x) {
3339 // `Set` does not have a `has` method
3340 return false;
3341 };
3342}
3343
3344module.exports = exported || function isSet(x) {
3345 if (!x || typeof x !== 'object') {
3346 return false;
3347 }
3348 try {
3349 $setHas.call(x);
3350 if ($mapHas) {
3351 try {
3352 $mapHas.call(x);
3353 } catch (e) {
3354 return true;
3355 }
3356 }
3357 return x instanceof $Set; // core-js workaround, pre-v2.5.0
3358 } catch (e) {}
3359 return false;
3360};
3361
3362},{}],50:[function(require,module,exports){
3363'use strict';
3364
3365var strValue = String.prototype.valueOf;
3366var tryStringObject = function tryStringObject(value) {
3367 try {
3368 strValue.call(value);
3369 return true;
3370 } catch (e) {
3371 return false;
3372 }
3373};
3374var toStr = Object.prototype.toString;
3375var strClass = '[object String]';
3376var hasToStringTag = require('has-tostringtag/shams')();
3377
3378module.exports = function isString(value) {
3379 if (typeof value === 'string') {
3380 return true;
3381 }
3382 if (typeof value !== 'object') {
3383 return false;
3384 }
3385 return hasToStringTag ? tryStringObject(value) : toStr.call(value) === strClass;
3386};
3387
3388},{"has-tostringtag/shams":38}],51:[function(require,module,exports){
3389'use strict';
3390
3391var toStr = Object.prototype.toString;
3392var hasSymbols = require('has-symbols')();
3393
3394if (hasSymbols) {
3395 var symToStr = Symbol.prototype.toString;
3396 var symStringRegex = /^Symbol\(.*\)$/;
3397 var isSymbolObject = function isRealSymbolObject(value) {
3398 if (typeof value.valueOf() !== 'symbol') {
3399 return false;
3400 }
3401 return symStringRegex.test(symToStr.call(value));
3402 };
3403
3404 module.exports = function isSymbol(value) {
3405 if (typeof value === 'symbol') {
3406 return true;
3407 }
3408 if (toStr.call(value) !== '[object Symbol]') {
3409 return false;
3410 }
3411 try {
3412 return isSymbolObject(value);
3413 } catch (e) {
3414 return false;
3415 }
3416 };
3417} else {
3418
3419 module.exports = function isSymbol(value) {
3420 // this environment does not support Symbols.
3421 return false && value;
3422 };
3423}
3424
3425},{"has-symbols":36}],52:[function(require,module,exports){
3426(function (global){
3427'use strict';
3428
3429var forEach = require('for-each');
3430var availableTypedArrays = require('available-typed-arrays');
3431var callBound = require('call-bind/callBound');
3432
3433var $toString = callBound('Object.prototype.toString');
3434var hasToStringTag = require('has-tostringtag/shams')();
3435
3436var g = typeof globalThis === 'undefined' ? global : globalThis;
3437var typedArrays = availableTypedArrays();
3438
3439var $indexOf = callBound('Array.prototype.indexOf', true) || function indexOf(array, value) {
3440 for (var i = 0; i < array.length; i += 1) {
3441 if (array[i] === value) {
3442 return i;
3443 }
3444 }
3445 return -1;
3446};
3447var $slice = callBound('String.prototype.slice');
3448var toStrTags = {};
3449var gOPD = require('es-abstract/helpers/getOwnPropertyDescriptor');
3450var getPrototypeOf = Object.getPrototypeOf; // require('getprototypeof');
3451if (hasToStringTag && gOPD && getPrototypeOf) {
3452 forEach(typedArrays, function (typedArray) {
3453 var arr = new g[typedArray]();
3454 if (Symbol.toStringTag in arr) {
3455 var proto = getPrototypeOf(arr);
3456 var descriptor = gOPD(proto, Symbol.toStringTag);
3457 if (!descriptor) {
3458 var superProto = getPrototypeOf(proto);
3459 descriptor = gOPD(superProto, Symbol.toStringTag);
3460 }
3461 toStrTags[typedArray] = descriptor.get;
3462 }
3463 });
3464}
3465
3466var tryTypedArrays = function tryAllTypedArrays(value) {
3467 var anyTrue = false;
3468 forEach(toStrTags, function (getter, typedArray) {
3469 if (!anyTrue) {
3470 try {
3471 anyTrue = getter.call(value) === typedArray;
3472 } catch (e) { /**/ }
3473 }
3474 });
3475 return anyTrue;
3476};
3477
3478module.exports = function isTypedArray(value) {
3479 if (!value || typeof value !== 'object') { return false; }
3480 if (!hasToStringTag || !(Symbol.toStringTag in value)) {
3481 var tag = $slice($toString(value), 8, -1);
3482 return $indexOf(typedArrays, tag) > -1;
3483 }
3484 if (!gOPD) { return false; }
3485 return tryTypedArrays(value);
3486};
3487
3488}).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
3489},{"available-typed-arrays":9,"call-bind/callBound":10,"es-abstract/helpers/getOwnPropertyDescriptor":23,"for-each":29,"has-tostringtag/shams":38}],53:[function(require,module,exports){
3490'use strict';
3491
3492var $WeakMap = typeof WeakMap === 'function' && WeakMap.prototype ? WeakMap : null;
3493var $WeakSet = typeof WeakSet === 'function' && WeakSet.prototype ? WeakSet : null;
3494
3495var exported;
3496
3497if (!$WeakMap) {
3498 // eslint-disable-next-line no-unused-vars
3499 exported = function isWeakMap(x) {
3500 // `WeakMap` is not present in this environment.
3501 return false;
3502 };
3503}
3504
3505var $mapHas = $WeakMap ? $WeakMap.prototype.has : null;
3506var $setHas = $WeakSet ? $WeakSet.prototype.has : null;
3507if (!exported && !$mapHas) {
3508 // eslint-disable-next-line no-unused-vars
3509 exported = function isWeakMap(x) {
3510 // `WeakMap` does not have a `has` method
3511 return false;
3512 };
3513}
3514
3515module.exports = exported || function isWeakMap(x) {
3516 if (!x || typeof x !== 'object') {
3517 return false;
3518 }
3519 try {
3520 $mapHas.call(x, $mapHas);
3521 if ($setHas) {
3522 try {
3523 $setHas.call(x, $setHas);
3524 } catch (e) {
3525 return true;
3526 }
3527 }
3528 return x instanceof $WeakMap; // core-js workaround, pre-v3
3529 } catch (e) {}
3530 return false;
3531};
3532
3533},{}],54:[function(require,module,exports){
3534'use strict';
3535
3536var GetIntrinsic = require('get-intrinsic');
3537var callBound = require('call-bind/callBound');
3538
3539var $WeakSet = GetIntrinsic('%WeakSet%', true);
3540
3541var $setHas = callBound('WeakSet.prototype.has', true);
3542
3543if ($setHas) {
3544 var $mapHas = callBound('WeakMap.prototype.has', true);
3545
3546 module.exports = function isWeakSet(x) {
3547 if (!x || typeof x !== 'object') {
3548 return false;
3549 }
3550 try {
3551 $setHas(x, $setHas);
3552 if ($mapHas) {
3553 try {
3554 $mapHas(x, $mapHas);
3555 } catch (e) {
3556 return true;
3557 }
3558 }
3559 return x instanceof $WeakSet; // core-js workaround, pre-v3
3560 } catch (e) {}
3561 return false;
3562 };
3563} else {
3564 // eslint-disable-next-line no-unused-vars
3565 module.exports = function isWeakSet(x) {
3566 // `WeakSet` does not exist, or does not have a `has` method
3567 return false;
3568 };
3569}
3570
3571},{"call-bind/callBound":10,"get-intrinsic":33}],55:[function(require,module,exports){
3572var toString = {}.toString;
3573
3574module.exports = Array.isArray || function (arr) {
3575 return toString.call(arr) == '[object Array]';
3576};
3577
3578},{}],56:[function(require,module,exports){
3579var hasMap = typeof Map === 'function' && Map.prototype;
3580var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null;
3581var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null;
3582var mapForEach = hasMap && Map.prototype.forEach;
3583var hasSet = typeof Set === 'function' && Set.prototype;
3584var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null;
3585var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null;
3586var setForEach = hasSet && Set.prototype.forEach;
3587var hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype;
3588var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null;
3589var hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype;
3590var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null;
3591var hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype;
3592var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null;
3593var booleanValueOf = Boolean.prototype.valueOf;
3594var objectToString = Object.prototype.toString;
3595var functionToString = Function.prototype.toString;
3596var $match = String.prototype.match;
3597var $slice = String.prototype.slice;
3598var $replace = String.prototype.replace;
3599var $toUpperCase = String.prototype.toUpperCase;
3600var $toLowerCase = String.prototype.toLowerCase;
3601var $test = RegExp.prototype.test;
3602var $concat = Array.prototype.concat;
3603var $join = Array.prototype.join;
3604var $arrSlice = Array.prototype.slice;
3605var $floor = Math.floor;
3606var bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null;
3607var gOPS = Object.getOwnPropertySymbols;
3608var symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null;
3609var hasShammedSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'object';
3610// ie, `has-tostringtag/shams
3611var toStringTag = typeof Symbol === 'function' && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? 'object' : 'symbol')
3612 ? Symbol.toStringTag
3613 : null;
3614var isEnumerable = Object.prototype.propertyIsEnumerable;
3615
3616var gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || (
3617 [].__proto__ === Array.prototype // eslint-disable-line no-proto
3618 ? function (O) {
3619 return O.__proto__; // eslint-disable-line no-proto
3620 }
3621 : null
3622);
3623
3624function addNumericSeparator(num, str) {
3625 if (
3626 num === Infinity
3627 || num === -Infinity
3628 || num !== num
3629 || (num && num > -1000 && num < 1000)
3630 || $test.call(/e/, str)
3631 ) {
3632 return str;
3633 }
3634 var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;
3635 if (typeof num === 'number') {
3636 var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num)
3637 if (int !== num) {
3638 var intStr = String(int);
3639 var dec = $slice.call(str, intStr.length + 1);
3640 return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, '');
3641 }
3642 }
3643 return $replace.call(str, sepRegex, '$&_');
3644}
3645
3646var utilInspect = require('./util.inspect');
3647var inspectCustom = utilInspect.custom;
3648var inspectSymbol = isSymbol(inspectCustom) ? inspectCustom : null;
3649
3650module.exports = function inspect_(obj, options, depth, seen) {
3651 var opts = options || {};
3652
3653 if (has(opts, 'quoteStyle') && (opts.quoteStyle !== 'single' && opts.quoteStyle !== 'double')) {
3654 throw new TypeError('option "quoteStyle" must be "single" or "double"');
3655 }
3656 if (
3657 has(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number'
3658 ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity
3659 : opts.maxStringLength !== null
3660 )
3661 ) {
3662 throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');
3663 }
3664 var customInspect = has(opts, 'customInspect') ? opts.customInspect : true;
3665 if (typeof customInspect !== 'boolean' && customInspect !== 'symbol') {
3666 throw new TypeError('option "customInspect", if provided, must be `true`, `false`, or `\'symbol\'`');
3667 }
3668
3669 if (
3670 has(opts, 'indent')
3671 && opts.indent !== null
3672 && opts.indent !== '\t'
3673 && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0)
3674 ) {
3675 throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');
3676 }
3677 if (has(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') {
3678 throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');
3679 }
3680 var numericSeparator = opts.numericSeparator;
3681
3682 if (typeof obj === 'undefined') {
3683 return 'undefined';
3684 }
3685 if (obj === null) {
3686 return 'null';
3687 }
3688 if (typeof obj === 'boolean') {
3689 return obj ? 'true' : 'false';
3690 }
3691
3692 if (typeof obj === 'string') {
3693 return inspectString(obj, opts);
3694 }
3695 if (typeof obj === 'number') {
3696 if (obj === 0) {
3697 return Infinity / obj > 0 ? '0' : '-0';
3698 }
3699 var str = String(obj);
3700 return numericSeparator ? addNumericSeparator(obj, str) : str;
3701 }
3702 if (typeof obj === 'bigint') {
3703 var bigIntStr = String(obj) + 'n';
3704 return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr;
3705 }
3706
3707 var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth;
3708 if (typeof depth === 'undefined') { depth = 0; }
3709 if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') {
3710 return isArray(obj) ? '[Array]' : '[Object]';
3711 }
3712
3713 var indent = getIndent(opts, depth);
3714
3715 if (typeof seen === 'undefined') {
3716 seen = [];
3717 } else if (indexOf(seen, obj) >= 0) {
3718 return '[Circular]';
3719 }
3720
3721 function inspect(value, from, noIndent) {
3722 if (from) {
3723 seen = $arrSlice.call(seen);
3724 seen.push(from);
3725 }
3726 if (noIndent) {
3727 var newOpts = {
3728 depth: opts.depth
3729 };
3730 if (has(opts, 'quoteStyle')) {
3731 newOpts.quoteStyle = opts.quoteStyle;
3732 }
3733 return inspect_(value, newOpts, depth + 1, seen);
3734 }
3735 return inspect_(value, opts, depth + 1, seen);
3736 }
3737
3738 if (typeof obj === 'function' && !isRegExp(obj)) { // in older engines, regexes are callable
3739 var name = nameOf(obj);
3740 var keys = arrObjKeys(obj, inspect);
3741 return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : '');
3742 }
3743 if (isSymbol(obj)) {
3744 var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, '$1') : symToString.call(obj);
3745 return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString;
3746 }
3747 if (isElement(obj)) {
3748 var s = '<' + $toLowerCase.call(String(obj.nodeName));
3749 var attrs = obj.attributes || [];
3750 for (var i = 0; i < attrs.length; i++) {
3751 s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts);
3752 }
3753 s += '>';
3754 if (obj.childNodes && obj.childNodes.length) { s += '...'; }
3755 s += '</' + $toLowerCase.call(String(obj.nodeName)) + '>';
3756 return s;
3757 }
3758 if (isArray(obj)) {
3759 if (obj.length === 0) { return '[]'; }
3760 var xs = arrObjKeys(obj, inspect);
3761 if (indent && !singleLineValues(xs)) {
3762 return '[' + indentedJoin(xs, indent) + ']';
3763 }
3764 return '[ ' + $join.call(xs, ', ') + ' ]';
3765 }
3766 if (isError(obj)) {
3767 var parts = arrObjKeys(obj, inspect);
3768 if (!('cause' in Error.prototype) && 'cause' in obj && !isEnumerable.call(obj, 'cause')) {
3769 return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }';
3770 }
3771 if (parts.length === 0) { return '[' + String(obj) + ']'; }
3772 return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }';
3773 }
3774 if (typeof obj === 'object' && customInspect) {
3775 if (inspectSymbol && typeof obj[inspectSymbol] === 'function' && utilInspect) {
3776 return utilInspect(obj, { depth: maxDepth - depth });
3777 } else if (customInspect !== 'symbol' && typeof obj.inspect === 'function') {
3778 return obj.inspect();
3779 }
3780 }
3781 if (isMap(obj)) {
3782 var mapParts = [];
3783 mapForEach.call(obj, function (value, key) {
3784 mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj));
3785 });
3786 return collectionOf('Map', mapSize.call(obj), mapParts, indent);
3787 }
3788 if (isSet(obj)) {
3789 var setParts = [];
3790 setForEach.call(obj, function (value) {
3791 setParts.push(inspect(value, obj));
3792 });
3793 return collectionOf('Set', setSize.call(obj), setParts, indent);
3794 }
3795 if (isWeakMap(obj)) {
3796 return weakCollectionOf('WeakMap');
3797 }
3798 if (isWeakSet(obj)) {
3799 return weakCollectionOf('WeakSet');
3800 }
3801 if (isWeakRef(obj)) {
3802 return weakCollectionOf('WeakRef');
3803 }
3804 if (isNumber(obj)) {
3805 return markBoxed(inspect(Number(obj)));
3806 }
3807 if (isBigInt(obj)) {
3808 return markBoxed(inspect(bigIntValueOf.call(obj)));
3809 }
3810 if (isBoolean(obj)) {
3811 return markBoxed(booleanValueOf.call(obj));
3812 }
3813 if (isString(obj)) {
3814 return markBoxed(inspect(String(obj)));
3815 }
3816 if (!isDate(obj) && !isRegExp(obj)) {
3817 var ys = arrObjKeys(obj, inspect);
3818 var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object;
3819 var protoTag = obj instanceof Object ? '' : 'null prototype';
3820 var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : '';
3821 var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : '';
3822 var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : '');
3823 if (ys.length === 0) { return tag + '{}'; }
3824 if (indent) {
3825 return tag + '{' + indentedJoin(ys, indent) + '}';
3826 }
3827 return tag + '{ ' + $join.call(ys, ', ') + ' }';
3828 }
3829 return String(obj);
3830};
3831
3832function wrapQuotes(s, defaultStyle, opts) {
3833 var quoteChar = (opts.quoteStyle || defaultStyle) === 'double' ? '"' : "'";
3834 return quoteChar + s + quoteChar;
3835}
3836
3837function quote(s) {
3838 return $replace.call(String(s), /"/g, '&quot;');
3839}
3840
3841function isArray(obj) { return toStr(obj) === '[object Array]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
3842function isDate(obj) { return toStr(obj) === '[object Date]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
3843function isRegExp(obj) { return toStr(obj) === '[object RegExp]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
3844function isError(obj) { return toStr(obj) === '[object Error]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
3845function isString(obj) { return toStr(obj) === '[object String]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
3846function isNumber(obj) { return toStr(obj) === '[object Number]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
3847function isBoolean(obj) { return toStr(obj) === '[object Boolean]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
3848
3849// Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives
3850function isSymbol(obj) {
3851 if (hasShammedSymbols) {
3852 return obj && typeof obj === 'object' && obj instanceof Symbol;
3853 }
3854 if (typeof obj === 'symbol') {
3855 return true;
3856 }
3857 if (!obj || typeof obj !== 'object' || !symToString) {
3858 return false;
3859 }
3860 try {
3861 symToString.call(obj);
3862 return true;
3863 } catch (e) {}
3864 return false;
3865}
3866
3867function isBigInt(obj) {
3868 if (!obj || typeof obj !== 'object' || !bigIntValueOf) {
3869 return false;
3870 }
3871 try {
3872 bigIntValueOf.call(obj);
3873 return true;
3874 } catch (e) {}
3875 return false;
3876}
3877
3878var hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; };
3879function has(obj, key) {
3880 return hasOwn.call(obj, key);
3881}
3882
3883function toStr(obj) {
3884 return objectToString.call(obj);
3885}
3886
3887function nameOf(f) {
3888 if (f.name) { return f.name; }
3889 var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/);
3890 if (m) { return m[1]; }
3891 return null;
3892}
3893
3894function indexOf(xs, x) {
3895 if (xs.indexOf) { return xs.indexOf(x); }
3896 for (var i = 0, l = xs.length; i < l; i++) {
3897 if (xs[i] === x) { return i; }
3898 }
3899 return -1;
3900}
3901
3902function isMap(x) {
3903 if (!mapSize || !x || typeof x !== 'object') {
3904 return false;
3905 }
3906 try {
3907 mapSize.call(x);
3908 try {
3909 setSize.call(x);
3910 } catch (s) {
3911 return true;
3912 }
3913 return x instanceof Map; // core-js workaround, pre-v2.5.0
3914 } catch (e) {}
3915 return false;
3916}
3917
3918function isWeakMap(x) {
3919 if (!weakMapHas || !x || typeof x !== 'object') {
3920 return false;
3921 }
3922 try {
3923 weakMapHas.call(x, weakMapHas);
3924 try {
3925 weakSetHas.call(x, weakSetHas);
3926 } catch (s) {
3927 return true;
3928 }
3929 return x instanceof WeakMap; // core-js workaround, pre-v2.5.0
3930 } catch (e) {}
3931 return false;
3932}
3933
3934function isWeakRef(x) {
3935 if (!weakRefDeref || !x || typeof x !== 'object') {
3936 return false;
3937 }
3938 try {
3939 weakRefDeref.call(x);
3940 return true;
3941 } catch (e) {}
3942 return false;
3943}
3944
3945function isSet(x) {
3946 if (!setSize || !x || typeof x !== 'object') {
3947 return false;
3948 }
3949 try {
3950 setSize.call(x);
3951 try {
3952 mapSize.call(x);
3953 } catch (m) {
3954 return true;
3955 }
3956 return x instanceof Set; // core-js workaround, pre-v2.5.0
3957 } catch (e) {}
3958 return false;
3959}
3960
3961function isWeakSet(x) {
3962 if (!weakSetHas || !x || typeof x !== 'object') {
3963 return false;
3964 }
3965 try {
3966 weakSetHas.call(x, weakSetHas);
3967 try {
3968 weakMapHas.call(x, weakMapHas);
3969 } catch (s) {
3970 return true;
3971 }
3972 return x instanceof WeakSet; // core-js workaround, pre-v2.5.0
3973 } catch (e) {}
3974 return false;
3975}
3976
3977function isElement(x) {
3978 if (!x || typeof x !== 'object') { return false; }
3979 if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) {
3980 return true;
3981 }
3982 return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function';
3983}
3984
3985function inspectString(str, opts) {
3986 if (str.length > opts.maxStringLength) {
3987 var remaining = str.length - opts.maxStringLength;
3988 var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : '');
3989 return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer;
3990 }
3991 // eslint-disable-next-line no-control-regex
3992 var s = $replace.call($replace.call(str, /(['\\])/g, '\\$1'), /[\x00-\x1f]/g, lowbyte);
3993 return wrapQuotes(s, 'single', opts);
3994}
3995
3996function lowbyte(c) {
3997 var n = c.charCodeAt(0);
3998 var x = {
3999 8: 'b',
4000 9: 't',
4001 10: 'n',
4002 12: 'f',
4003 13: 'r'
4004 }[n];
4005 if (x) { return '\\' + x; }
4006 return '\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16));
4007}
4008
4009function markBoxed(str) {
4010 return 'Object(' + str + ')';
4011}
4012
4013function weakCollectionOf(type) {
4014 return type + ' { ? }';
4015}
4016
4017function collectionOf(type, size, entries, indent) {
4018 var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', ');
4019 return type + ' (' + size + ') {' + joinedEntries + '}';
4020}
4021
4022function singleLineValues(xs) {
4023 for (var i = 0; i < xs.length; i++) {
4024 if (indexOf(xs[i], '\n') >= 0) {
4025 return false;
4026 }
4027 }
4028 return true;
4029}
4030
4031function getIndent(opts, depth) {
4032 var baseIndent;
4033 if (opts.indent === '\t') {
4034 baseIndent = '\t';
4035 } else if (typeof opts.indent === 'number' && opts.indent > 0) {
4036 baseIndent = $join.call(Array(opts.indent + 1), ' ');
4037 } else {
4038 return null;
4039 }
4040 return {
4041 base: baseIndent,
4042 prev: $join.call(Array(depth + 1), baseIndent)
4043 };
4044}
4045
4046function indentedJoin(xs, indent) {
4047 if (xs.length === 0) { return ''; }
4048 var lineJoiner = '\n' + indent.prev + indent.base;
4049 return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\n' + indent.prev;
4050}
4051
4052function arrObjKeys(obj, inspect) {
4053 var isArr = isArray(obj);
4054 var xs = [];
4055 if (isArr) {
4056 xs.length = obj.length;
4057 for (var i = 0; i < obj.length; i++) {
4058 xs[i] = has(obj, i) ? inspect(obj[i], obj) : '';
4059 }
4060 }
4061 var syms = typeof gOPS === 'function' ? gOPS(obj) : [];
4062 var symMap;
4063 if (hasShammedSymbols) {
4064 symMap = {};
4065 for (var k = 0; k < syms.length; k++) {
4066 symMap['$' + syms[k]] = syms[k];
4067 }
4068 }
4069
4070 for (var key in obj) { // eslint-disable-line no-restricted-syntax
4071 if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue
4072 if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue
4073 if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) {
4074 // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section
4075 continue; // eslint-disable-line no-restricted-syntax, no-continue
4076 } else if ($test.call(/[^\w$]/, key)) {
4077 xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj));
4078 } else {
4079 xs.push(key + ': ' + inspect(obj[key], obj));
4080 }
4081 }
4082 if (typeof gOPS === 'function') {
4083 for (var j = 0; j < syms.length; j++) {
4084 if (isEnumerable.call(obj, syms[j])) {
4085 xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj));
4086 }
4087 }
4088 }
4089 return xs;
4090}
4091
4092},{"./util.inspect":57}],57:[function(require,module,exports){
4093module.exports = require('util').inspect;
4094
4095},{"util":102}],58:[function(require,module,exports){
4096'use strict';
4097
4098var numberIsNaN = function (value) {
4099 return value !== value;
4100};
4101
4102module.exports = function is(a, b) {
4103 if (a === 0 && b === 0) {
4104 return 1 / a === 1 / b;
4105 }
4106 if (a === b) {
4107 return true;
4108 }
4109 if (numberIsNaN(a) && numberIsNaN(b)) {
4110 return true;
4111 }
4112 return false;
4113};
4114
4115
4116},{}],59:[function(require,module,exports){
4117'use strict';
4118
4119var define = require('define-properties');
4120var callBind = require('call-bind');
4121
4122var implementation = require('./implementation');
4123var getPolyfill = require('./polyfill');
4124var shim = require('./shim');
4125
4126var polyfill = callBind(getPolyfill(), Object);
4127
4128define(polyfill, {
4129 getPolyfill: getPolyfill,
4130 implementation: implementation,
4131 shim: shim
4132});
4133
4134module.exports = polyfill;
4135
4136},{"./implementation":58,"./polyfill":60,"./shim":61,"call-bind":11,"define-properties":13}],60:[function(require,module,exports){
4137'use strict';
4138
4139var implementation = require('./implementation');
4140
4141module.exports = function getPolyfill() {
4142 return typeof Object.is === 'function' ? Object.is : implementation;
4143};
4144
4145},{"./implementation":58}],61:[function(require,module,exports){
4146'use strict';
4147
4148var getPolyfill = require('./polyfill');
4149var define = require('define-properties');
4150
4151module.exports = function shimObjectIs() {
4152 var polyfill = getPolyfill();
4153 define(Object, { is: polyfill }, {
4154 is: function testObjectIs() {
4155 return Object.is !== polyfill;
4156 }
4157 });
4158 return polyfill;
4159};
4160
4161},{"./polyfill":60,"define-properties":13}],62:[function(require,module,exports){
4162'use strict';
4163
4164var keysShim;
4165if (!Object.keys) {
4166 // modified from https://github.com/es-shims/es5-shim
4167 var has = Object.prototype.hasOwnProperty;
4168 var toStr = Object.prototype.toString;
4169 var isArgs = require('./isArguments'); // eslint-disable-line global-require
4170 var isEnumerable = Object.prototype.propertyIsEnumerable;
4171 var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
4172 var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
4173 var dontEnums = [
4174 'toString',
4175 'toLocaleString',
4176 'valueOf',
4177 'hasOwnProperty',
4178 'isPrototypeOf',
4179 'propertyIsEnumerable',
4180 'constructor'
4181 ];
4182 var equalsConstructorPrototype = function (o) {
4183 var ctor = o.constructor;
4184 return ctor && ctor.prototype === o;
4185 };
4186 var excludedKeys = {
4187 $applicationCache: true,
4188 $console: true,
4189 $external: true,
4190 $frame: true,
4191 $frameElement: true,
4192 $frames: true,
4193 $innerHeight: true,
4194 $innerWidth: true,
4195 $onmozfullscreenchange: true,
4196 $onmozfullscreenerror: true,
4197 $outerHeight: true,
4198 $outerWidth: true,
4199 $pageXOffset: true,
4200 $pageYOffset: true,
4201 $parent: true,
4202 $scrollLeft: true,
4203 $scrollTop: true,
4204 $scrollX: true,
4205 $scrollY: true,
4206 $self: true,
4207 $webkitIndexedDB: true,
4208 $webkitStorageInfo: true,
4209 $window: true
4210 };
4211 var hasAutomationEqualityBug = (function () {
4212 /* global window */
4213 if (typeof window === 'undefined') { return false; }
4214 for (var k in window) {
4215 try {
4216 if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
4217 try {
4218 equalsConstructorPrototype(window[k]);
4219 } catch (e) {
4220 return true;
4221 }
4222 }
4223 } catch (e) {
4224 return true;
4225 }
4226 }
4227 return false;
4228 }());
4229 var equalsConstructorPrototypeIfNotBuggy = function (o) {
4230 /* global window */
4231 if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
4232 return equalsConstructorPrototype(o);
4233 }
4234 try {
4235 return equalsConstructorPrototype(o);
4236 } catch (e) {
4237 return false;
4238 }
4239 };
4240
4241 keysShim = function keys(object) {
4242 var isObject = object !== null && typeof object === 'object';
4243 var isFunction = toStr.call(object) === '[object Function]';
4244 var isArguments = isArgs(object);
4245 var isString = isObject && toStr.call(object) === '[object String]';
4246 var theKeys = [];
4247
4248 if (!isObject && !isFunction && !isArguments) {
4249 throw new TypeError('Object.keys called on a non-object');
4250 }
4251
4252 var skipProto = hasProtoEnumBug && isFunction;
4253 if (isString && object.length > 0 && !has.call(object, 0)) {
4254 for (var i = 0; i < object.length; ++i) {
4255 theKeys.push(String(i));
4256 }
4257 }
4258
4259 if (isArguments && object.length > 0) {
4260 for (var j = 0; j < object.length; ++j) {
4261 theKeys.push(String(j));
4262 }
4263 } else {
4264 for (var name in object) {
4265 if (!(skipProto && name === 'prototype') && has.call(object, name)) {
4266 theKeys.push(String(name));
4267 }
4268 }
4269 }
4270
4271 if (hasDontEnumBug) {
4272 var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
4273
4274 for (var k = 0; k < dontEnums.length; ++k) {
4275 if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
4276 theKeys.push(dontEnums[k]);
4277 }
4278 }
4279 }
4280 return theKeys;
4281 };
4282}
4283module.exports = keysShim;
4284
4285},{"./isArguments":64}],63:[function(require,module,exports){
4286'use strict';
4287
4288var slice = Array.prototype.slice;
4289var isArgs = require('./isArguments');
4290
4291var origKeys = Object.keys;
4292var keysShim = origKeys ? function keys(o) { return origKeys(o); } : require('./implementation');
4293
4294var originalKeys = Object.keys;
4295
4296keysShim.shim = function shimObjectKeys() {
4297 if (Object.keys) {
4298 var keysWorksWithArguments = (function () {
4299 // Safari 5.0 bug
4300 var args = Object.keys(arguments);
4301 return args && args.length === arguments.length;
4302 }(1, 2));
4303 if (!keysWorksWithArguments) {
4304 Object.keys = function keys(object) { // eslint-disable-line func-name-matching
4305 if (isArgs(object)) {
4306 return originalKeys(slice.call(object));
4307 }
4308 return originalKeys(object);
4309 };
4310 }
4311 } else {
4312 Object.keys = keysShim;
4313 }
4314 return Object.keys || keysShim;
4315};
4316
4317module.exports = keysShim;
4318
4319},{"./implementation":62,"./isArguments":64}],64:[function(require,module,exports){
4320'use strict';
4321
4322var toStr = Object.prototype.toString;
4323
4324module.exports = function isArguments(value) {
4325 var str = toStr.call(value);
4326 var isArgs = str === '[object Arguments]';
4327 if (!isArgs) {
4328 isArgs = str !== '[object Array]' &&
4329 value !== null &&
4330 typeof value === 'object' &&
4331 typeof value.length === 'number' &&
4332 value.length >= 0 &&
4333 toStr.call(value.callee) === '[object Function]';
4334 }
4335 return isArgs;
4336};
4337
4338},{}],65:[function(require,module,exports){
4339'use strict';
4340
4341// modified from https://github.com/es-shims/es6-shim
4342var objectKeys = require('object-keys');
4343var hasSymbols = require('has-symbols/shams')();
4344var callBound = require('call-bind/callBound');
4345var toObject = Object;
4346var $push = callBound('Array.prototype.push');
4347var $propIsEnumerable = callBound('Object.prototype.propertyIsEnumerable');
4348var originalGetSymbols = hasSymbols ? Object.getOwnPropertySymbols : null;
4349
4350// eslint-disable-next-line no-unused-vars
4351module.exports = function assign(target, source1) {
4352 if (target == null) { throw new TypeError('target must be an object'); }
4353 var to = toObject(target); // step 1
4354 if (arguments.length === 1) {
4355 return to; // step 2
4356 }
4357 for (var s = 1; s < arguments.length; ++s) {
4358 var from = toObject(arguments[s]); // step 3.a.i
4359
4360 // step 3.a.ii:
4361 var keys = objectKeys(from);
4362 var getSymbols = hasSymbols && (Object.getOwnPropertySymbols || originalGetSymbols);
4363 if (getSymbols) {
4364 var syms = getSymbols(from);
4365 for (var j = 0; j < syms.length; ++j) {
4366 var key = syms[j];
4367 if ($propIsEnumerable(from, key)) {
4368 $push(keys, key);
4369 }
4370 }
4371 }
4372
4373 // step 3.a.iii:
4374 for (var i = 0; i < keys.length; ++i) {
4375 var nextKey = keys[i];
4376 if ($propIsEnumerable(from, nextKey)) { // step 3.a.iii.2
4377 var propValue = from[nextKey]; // step 3.a.iii.2.a
4378 to[nextKey] = propValue; // step 3.a.iii.2.b
4379 }
4380 }
4381 }
4382
4383 return to; // step 4
4384};
4385
4386},{"call-bind/callBound":10,"has-symbols/shams":37,"object-keys":63}],66:[function(require,module,exports){
4387'use strict';
4388
4389var defineProperties = require('define-properties');
4390var callBind = require('call-bind');
4391
4392var implementation = require('./implementation');
4393var getPolyfill = require('./polyfill');
4394var shim = require('./shim');
4395
4396var polyfill = callBind.apply(getPolyfill());
4397// eslint-disable-next-line no-unused-vars
4398var bound = function assign(target, source1) {
4399 return polyfill(Object, arguments);
4400};
4401
4402defineProperties(bound, {
4403 getPolyfill: getPolyfill,
4404 implementation: implementation,
4405 shim: shim
4406});
4407
4408module.exports = bound;
4409
4410},{"./implementation":65,"./polyfill":67,"./shim":68,"call-bind":11,"define-properties":13}],67:[function(require,module,exports){
4411'use strict';
4412
4413var implementation = require('./implementation');
4414
4415var lacksProperEnumerationOrder = function () {
4416 if (!Object.assign) {
4417 return false;
4418 }
4419 /*
4420 * v8, specifically in node 4.x, has a bug with incorrect property enumeration order
4421 * note: this does not detect the bug unless there's 20 characters
4422 */
4423 var str = 'abcdefghijklmnopqrst';
4424 var letters = str.split('');
4425 var map = {};
4426 for (var i = 0; i < letters.length; ++i) {
4427 map[letters[i]] = letters[i];
4428 }
4429 var obj = Object.assign({}, map);
4430 var actual = '';
4431 for (var k in obj) {
4432 actual += k;
4433 }
4434 return str !== actual;
4435};
4436
4437var assignHasPendingExceptions = function () {
4438 if (!Object.assign || !Object.preventExtensions) {
4439 return false;
4440 }
4441 /*
4442 * Firefox 37 still has "pending exception" logic in its Object.assign implementation,
4443 * which is 72% slower than our shim, and Firefox 40's native implementation.
4444 */
4445 var thrower = Object.preventExtensions({ 1: 2 });
4446 try {
4447 Object.assign(thrower, 'xy');
4448 } catch (e) {
4449 return thrower[1] === 'y';
4450 }
4451 return false;
4452};
4453
4454module.exports = function getPolyfill() {
4455 if (!Object.assign) {
4456 return implementation;
4457 }
4458 if (lacksProperEnumerationOrder()) {
4459 return implementation;
4460 }
4461 if (assignHasPendingExceptions()) {
4462 return implementation;
4463 }
4464 return Object.assign;
4465};
4466
4467},{"./implementation":65}],68:[function(require,module,exports){
4468'use strict';
4469
4470var define = require('define-properties');
4471var getPolyfill = require('./polyfill');
4472
4473module.exports = function shimAssign() {
4474 var polyfill = getPolyfill();
4475 define(
4476 Object,
4477 { assign: polyfill },
4478 { assign: function () { return Object.assign !== polyfill; } }
4479 );
4480 return polyfill;
4481};
4482
4483},{"./polyfill":67,"define-properties":13}],69:[function(require,module,exports){
4484'use strict';
4485
4486var functionsHaveConfigurableNames = require('functions-have-names').functionsHaveConfigurableNames();
4487
4488var $Object = Object;
4489var $TypeError = TypeError;
4490
4491module.exports = function flags() {
4492 if (this != null && this !== $Object(this)) {
4493 throw new $TypeError('RegExp.prototype.flags getter called on non-object');
4494 }
4495 var result = '';
4496 if (this.hasIndices) {
4497 result += 'd';
4498 }
4499 if (this.global) {
4500 result += 'g';
4501 }
4502 if (this.ignoreCase) {
4503 result += 'i';
4504 }
4505 if (this.multiline) {
4506 result += 'm';
4507 }
4508 if (this.dotAll) {
4509 result += 's';
4510 }
4511 if (this.unicode) {
4512 result += 'u';
4513 }
4514 if (this.sticky) {
4515 result += 'y';
4516 }
4517 return result;
4518};
4519
4520if (functionsHaveConfigurableNames && Object.defineProperty) {
4521 Object.defineProperty(module.exports, 'name', { value: 'get flags' });
4522}
4523
4524},{"functions-have-names":32}],70:[function(require,module,exports){
4525'use strict';
4526
4527var define = require('define-properties');
4528var callBind = require('call-bind');
4529
4530var implementation = require('./implementation');
4531var getPolyfill = require('./polyfill');
4532var shim = require('./shim');
4533
4534var flagsBound = callBind(getPolyfill());
4535
4536define(flagsBound, {
4537 getPolyfill: getPolyfill,
4538 implementation: implementation,
4539 shim: shim
4540});
4541
4542module.exports = flagsBound;
4543
4544},{"./implementation":69,"./polyfill":71,"./shim":72,"call-bind":11,"define-properties":13}],71:[function(require,module,exports){
4545'use strict';
4546
4547var implementation = require('./implementation');
4548
4549var supportsDescriptors = require('define-properties').supportsDescriptors;
4550var $gOPD = Object.getOwnPropertyDescriptor;
4551
4552module.exports = function getPolyfill() {
4553 if (supportsDescriptors && (/a/mig).flags === 'gim') {
4554 var descriptor = $gOPD(RegExp.prototype, 'flags');
4555 if (
4556 descriptor
4557 && typeof descriptor.get === 'function'
4558 && typeof RegExp.prototype.dotAll === 'boolean'
4559 && typeof RegExp.prototype.hasIndices === 'boolean'
4560 ) {
4561 /* eslint getter-return: 0 */
4562 var calls = '';
4563 var o = {};
4564 Object.defineProperty(o, 'hasIndices', {
4565 get: function () {
4566 calls += 'd';
4567 }
4568 });
4569 Object.defineProperty(o, 'sticky', {
4570 get: function () {
4571 calls += 'y';
4572 }
4573 });
4574 if (calls === 'dy') {
4575 return descriptor.get;
4576 }
4577 }
4578 }
4579 return implementation;
4580};
4581
4582},{"./implementation":69,"define-properties":13}],72:[function(require,module,exports){
4583'use strict';
4584
4585var supportsDescriptors = require('define-properties').supportsDescriptors;
4586var getPolyfill = require('./polyfill');
4587var gOPD = Object.getOwnPropertyDescriptor;
4588var defineProperty = Object.defineProperty;
4589var TypeErr = TypeError;
4590var getProto = Object.getPrototypeOf;
4591var regex = /a/;
4592
4593module.exports = function shimFlags() {
4594 if (!supportsDescriptors || !getProto) {
4595 throw new TypeErr('RegExp.prototype.flags requires a true ES5 environment that supports property descriptors');
4596 }
4597 var polyfill = getPolyfill();
4598 var proto = getProto(regex);
4599 var descriptor = gOPD(proto, 'flags');
4600 if (!descriptor || descriptor.get !== polyfill) {
4601 defineProperty(proto, 'flags', {
4602 configurable: true,
4603 enumerable: false,
4604 get: polyfill
4605 });
4606 }
4607 return polyfill;
4608};
4609
4610},{"./polyfill":71,"define-properties":13}],73:[function(require,module,exports){
4611(function (process){
4612var through = require('through');
4613var nextTick = typeof setImmediate !== 'undefined'
4614 ? setImmediate
4615 : process.nextTick
4616;
4617
4618module.exports = function (write, end) {
4619 var tr = through(write, end);
4620 tr.pause();
4621 var resume = tr.resume;
4622 var pause = tr.pause;
4623 var paused = false;
4624
4625 tr.pause = function () {
4626 paused = true;
4627 return pause.apply(this, arguments);
4628 };
4629
4630 tr.resume = function () {
4631 paused = false;
4632 return resume.apply(this, arguments);
4633 };
4634
4635 nextTick(function () {
4636 if (!paused) tr.resume();
4637 });
4638
4639 return tr;
4640};
4641
4642}).call(this,require("KliubH"))
4643},{"KliubH":91,"through":79}],74:[function(require,module,exports){
4644'use strict';
4645
4646var GetIntrinsic = require('get-intrinsic');
4647var callBound = require('call-bind/callBound');
4648var inspect = require('object-inspect');
4649
4650var $TypeError = GetIntrinsic('%TypeError%');
4651var $WeakMap = GetIntrinsic('%WeakMap%', true);
4652var $Map = GetIntrinsic('%Map%', true);
4653
4654var $weakMapGet = callBound('WeakMap.prototype.get', true);
4655var $weakMapSet = callBound('WeakMap.prototype.set', true);
4656var $weakMapHas = callBound('WeakMap.prototype.has', true);
4657var $mapGet = callBound('Map.prototype.get', true);
4658var $mapSet = callBound('Map.prototype.set', true);
4659var $mapHas = callBound('Map.prototype.has', true);
4660
4661/*
4662 * This function traverses the list returning the node corresponding to the
4663 * given key.
4664 *
4665 * That node is also moved to the head of the list, so that if it's accessed
4666 * again we don't need to traverse the whole list. By doing so, all the recently
4667 * used nodes can be accessed relatively quickly.
4668 */
4669var listGetNode = function (list, key) { // eslint-disable-line consistent-return
4670 for (var prev = list, curr; (curr = prev.next) !== null; prev = curr) {
4671 if (curr.key === key) {
4672 prev.next = curr.next;
4673 curr.next = list.next;
4674 list.next = curr; // eslint-disable-line no-param-reassign
4675 return curr;
4676 }
4677 }
4678};
4679
4680var listGet = function (objects, key) {
4681 var node = listGetNode(objects, key);
4682 return node && node.value;
4683};
4684var listSet = function (objects, key, value) {
4685 var node = listGetNode(objects, key);
4686 if (node) {
4687 node.value = value;
4688 } else {
4689 // Prepend the new node to the beginning of the list
4690 objects.next = { // eslint-disable-line no-param-reassign
4691 key: key,
4692 next: objects.next,
4693 value: value
4694 };
4695 }
4696};
4697var listHas = function (objects, key) {
4698 return !!listGetNode(objects, key);
4699};
4700
4701module.exports = function getSideChannel() {
4702 var $wm;
4703 var $m;
4704 var $o;
4705 var channel = {
4706 assert: function (key) {
4707 if (!channel.has(key)) {
4708 throw new $TypeError('Side channel does not contain ' + inspect(key));
4709 }
4710 },
4711 get: function (key) { // eslint-disable-line consistent-return
4712 if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
4713 if ($wm) {
4714 return $weakMapGet($wm, key);
4715 }
4716 } else if ($Map) {
4717 if ($m) {
4718 return $mapGet($m, key);
4719 }
4720 } else {
4721 if ($o) { // eslint-disable-line no-lonely-if
4722 return listGet($o, key);
4723 }
4724 }
4725 },
4726 has: function (key) {
4727 if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
4728 if ($wm) {
4729 return $weakMapHas($wm, key);
4730 }
4731 } else if ($Map) {
4732 if ($m) {
4733 return $mapHas($m, key);
4734 }
4735 } else {
4736 if ($o) { // eslint-disable-line no-lonely-if
4737 return listHas($o, key);
4738 }
4739 }
4740 return false;
4741 },
4742 set: function (key, value) {
4743 if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
4744 if (!$wm) {
4745 $wm = new $WeakMap();
4746 }
4747 $weakMapSet($wm, key, value);
4748 } else if ($Map) {
4749 if (!$m) {
4750 $m = new $Map();
4751 }
4752 $mapSet($m, key, value);
4753 } else {
4754 if (!$o) {
4755 /*
4756 * Initialize the linked list as an empty node, so that we don't have
4757 * to special-case handling of the first node: we can always refer to
4758 * it as (previous node).next, instead of something like (list).head
4759 */
4760 $o = { key: {}, next: null };
4761 }
4762 listSet($o, key, value);
4763 }
4764 }
4765 };
4766 return channel;
4767};
4768
4769},{"call-bind/callBound":10,"get-intrinsic":33,"object-inspect":56}],75:[function(require,module,exports){
4770'use strict';
4771
4772var RequireObjectCoercible = require('es-abstract/2021/RequireObjectCoercible');
4773var ToString = require('es-abstract/2021/ToString');
4774var callBound = require('call-bind/callBound');
4775var $replace = callBound('String.prototype.replace');
4776
4777var mvsIsWS = (/^\s$/).test('\u180E');
4778/* eslint-disable no-control-regex */
4779var leftWhitespace = mvsIsWS
4780 ? /^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+/
4781 : /^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+/;
4782var rightWhitespace = mvsIsWS
4783 ? /[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+$/
4784 : /[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+$/;
4785/* eslint-enable no-control-regex */
4786
4787module.exports = function trim() {
4788 var S = ToString(RequireObjectCoercible(this));
4789 return $replace($replace(S, leftWhitespace, ''), rightWhitespace, '');
4790};
4791
4792},{"call-bind/callBound":10,"es-abstract/2021/RequireObjectCoercible":16,"es-abstract/2021/ToString":20}],76:[function(require,module,exports){
4793'use strict';
4794
4795var callBind = require('call-bind');
4796var define = require('define-properties');
4797var RequireObjectCoercible = require('es-abstract/2021/RequireObjectCoercible');
4798
4799var implementation = require('./implementation');
4800var getPolyfill = require('./polyfill');
4801var shim = require('./shim');
4802
4803var bound = callBind(getPolyfill());
4804var boundMethod = function trim(receiver) {
4805 RequireObjectCoercible(receiver);
4806 return bound(receiver);
4807};
4808
4809define(boundMethod, {
4810 getPolyfill: getPolyfill,
4811 implementation: implementation,
4812 shim: shim
4813});
4814
4815module.exports = boundMethod;
4816
4817},{"./implementation":75,"./polyfill":77,"./shim":78,"call-bind":11,"define-properties":13,"es-abstract/2021/RequireObjectCoercible":16}],77:[function(require,module,exports){
4818'use strict';
4819
4820var implementation = require('./implementation');
4821
4822var zeroWidthSpace = '\u200b';
4823var mongolianVowelSeparator = '\u180E';
4824
4825module.exports = function getPolyfill() {
4826 if (
4827 String.prototype.trim
4828 && zeroWidthSpace.trim() === zeroWidthSpace
4829 && mongolianVowelSeparator.trim() === mongolianVowelSeparator
4830 && ('_' + mongolianVowelSeparator).trim() === ('_' + mongolianVowelSeparator)
4831 && (mongolianVowelSeparator + '_').trim() === (mongolianVowelSeparator + '_')
4832 ) {
4833 return String.prototype.trim;
4834 }
4835 return implementation;
4836};
4837
4838},{"./implementation":75}],78:[function(require,module,exports){
4839'use strict';
4840
4841var define = require('define-properties');
4842var getPolyfill = require('./polyfill');
4843
4844module.exports = function shimStringTrim() {
4845 var polyfill = getPolyfill();
4846 define(String.prototype, { trim: polyfill }, {
4847 trim: function testTrim() {
4848 return String.prototype.trim !== polyfill;
4849 }
4850 });
4851 return polyfill;
4852};
4853
4854},{"./polyfill":77,"define-properties":13}],79:[function(require,module,exports){
4855(function (process){
4856var Stream = require('stream')
4857
4858// through
4859//
4860// a stream that does nothing but re-emit the input.
4861// useful for aggregating a series of changing but not ending streams into one stream)
4862
4863exports = module.exports = through
4864through.through = through
4865
4866//create a readable writable stream.
4867
4868function through (write, end, opts) {
4869 write = write || function (data) { this.queue(data) }
4870 end = end || function () { this.queue(null) }
4871
4872 var ended = false, destroyed = false, buffer = [], _ended = false
4873 var stream = new Stream()
4874 stream.readable = stream.writable = true
4875 stream.paused = false
4876
4877// stream.autoPause = !(opts && opts.autoPause === false)
4878 stream.autoDestroy = !(opts && opts.autoDestroy === false)
4879
4880 stream.write = function (data) {
4881 write.call(this, data)
4882 return !stream.paused
4883 }
4884
4885 function drain() {
4886 while(buffer.length && !stream.paused) {
4887 var data = buffer.shift()
4888 if(null === data)
4889 return stream.emit('end')
4890 else
4891 stream.emit('data', data)
4892 }
4893 }
4894
4895 stream.queue = stream.push = function (data) {
4896// console.error(ended)
4897 if(_ended) return stream
4898 if(data === null) _ended = true
4899 buffer.push(data)
4900 drain()
4901 return stream
4902 }
4903
4904 //this will be registered as the first 'end' listener
4905 //must call destroy next tick, to make sure we're after any
4906 //stream piped from here.
4907 //this is only a problem if end is not emitted synchronously.
4908 //a nicer way to do this is to make sure this is the last listener for 'end'
4909
4910 stream.on('end', function () {
4911 stream.readable = false
4912 if(!stream.writable && stream.autoDestroy)
4913 process.nextTick(function () {
4914 stream.destroy()
4915 })
4916 })
4917
4918 function _end () {
4919 stream.writable = false
4920 end.call(stream)
4921 if(!stream.readable && stream.autoDestroy)
4922 stream.destroy()
4923 }
4924
4925 stream.end = function (data) {
4926 if(ended) return
4927 ended = true
4928 if(arguments.length) stream.write(data)
4929 _end() // will emit or queue
4930 return stream
4931 }
4932
4933 stream.destroy = function () {
4934 if(destroyed) return
4935 destroyed = true
4936 ended = true
4937 buffer.length = 0
4938 stream.writable = stream.readable = false
4939 stream.emit('close')
4940 return stream
4941 }
4942
4943 stream.pause = function () {
4944 if(stream.paused) return
4945 stream.paused = true
4946 return stream
4947 }
4948
4949 stream.resume = function () {
4950 if(stream.paused) {
4951 stream.paused = false
4952 stream.emit('resume')
4953 }
4954 drain()
4955 //may have become paused again,
4956 //as drain emits 'data'.
4957 if(!stream.paused)
4958 stream.emit('drain')
4959 return stream
4960 }
4961 return stream
4962}
4963
4964
4965}).call(this,require("KliubH"))
4966},{"KliubH":91,"stream":93}],80:[function(require,module,exports){
4967'use strict';
4968
4969var isString = require('is-string');
4970var isNumber = require('is-number-object');
4971var isBoolean = require('is-boolean-object');
4972var isSymbol = require('is-symbol');
4973var isBigInt = require('is-bigint');
4974
4975// eslint-disable-next-line consistent-return
4976module.exports = function whichBoxedPrimitive(value) {
4977 // eslint-disable-next-line eqeqeq
4978 if (value == null || (typeof value !== 'object' && typeof value !== 'function')) {
4979 return null;
4980 }
4981 if (isString(value)) {
4982 return 'String';
4983 }
4984 if (isNumber(value)) {
4985 return 'Number';
4986 }
4987 if (isBoolean(value)) {
4988 return 'Boolean';
4989 }
4990 if (isSymbol(value)) {
4991 return 'Symbol';
4992 }
4993 if (isBigInt(value)) {
4994 return 'BigInt';
4995 }
4996};
4997
4998},{"is-bigint":42,"is-boolean-object":43,"is-number-object":47,"is-string":50,"is-symbol":51}],81:[function(require,module,exports){
4999'use strict';
5000
5001var isMap = require('is-map');
5002var isSet = require('is-set');
5003var isWeakMap = require('is-weakmap');
5004var isWeakSet = require('is-weakset');
5005
5006module.exports = function whichCollection(value) {
5007 if (value && typeof value === 'object') {
5008 if (isMap(value)) {
5009 return 'Map';
5010 }
5011 if (isSet(value)) {
5012 return 'Set';
5013 }
5014 if (isWeakMap(value)) {
5015 return 'WeakMap';
5016 }
5017 if (isWeakSet(value)) {
5018 return 'WeakSet';
5019 }
5020 }
5021 return false;
5022};
5023
5024},{"is-map":46,"is-set":49,"is-weakmap":53,"is-weakset":54}],82:[function(require,module,exports){
5025(function (global){
5026'use strict';
5027
5028var forEach = require('for-each');
5029var availableTypedArrays = require('available-typed-arrays');
5030var callBound = require('call-bind/callBound');
5031
5032var $toString = callBound('Object.prototype.toString');
5033var hasToStringTag = require('has-tostringtag/shams')();
5034
5035var g = typeof globalThis === 'undefined' ? global : globalThis;
5036var typedArrays = availableTypedArrays();
5037
5038var $slice = callBound('String.prototype.slice');
5039var toStrTags = {};
5040var gOPD = require('es-abstract/helpers/getOwnPropertyDescriptor');
5041var getPrototypeOf = Object.getPrototypeOf; // require('getprototypeof');
5042if (hasToStringTag && gOPD && getPrototypeOf) {
5043 forEach(typedArrays, function (typedArray) {
5044 if (typeof g[typedArray] === 'function') {
5045 var arr = new g[typedArray]();
5046 if (Symbol.toStringTag in arr) {
5047 var proto = getPrototypeOf(arr);
5048 var descriptor = gOPD(proto, Symbol.toStringTag);
5049 if (!descriptor) {
5050 var superProto = getPrototypeOf(proto);
5051 descriptor = gOPD(superProto, Symbol.toStringTag);
5052 }
5053 toStrTags[typedArray] = descriptor.get;
5054 }
5055 }
5056 });
5057}
5058
5059var tryTypedArrays = function tryAllTypedArrays(value) {
5060 var foundName = false;
5061 forEach(toStrTags, function (getter, typedArray) {
5062 if (!foundName) {
5063 try {
5064 var name = getter.call(value);
5065 if (name === typedArray) {
5066 foundName = name;
5067 }
5068 } catch (e) {}
5069 }
5070 });
5071 return foundName;
5072};
5073
5074var isTypedArray = require('is-typed-array');
5075
5076module.exports = function whichTypedArray(value) {
5077 if (!isTypedArray(value)) { return false; }
5078 if (!hasToStringTag || !(Symbol.toStringTag in value)) { return $slice($toString(value), 8, -1); }
5079 return tryTypedArrays(value);
5080};
5081
5082}).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
5083},{"available-typed-arrays":9,"call-bind/callBound":10,"es-abstract/helpers/getOwnPropertyDescriptor":23,"for-each":29,"has-tostringtag/shams":38,"is-typed-array":52}],83:[function(require,module,exports){
5084'use strict';
5085
5086var test = require('../../');
5087
5088test(function (t) {
5089 t.plan(4);
5090 t.ok(true);
5091 t.equal(3, 1 + 2);
5092 t.deepEqual([1, 2, [3, 4]], [1, 2, [3, 4]]);
5093 t.notDeepEqual([1, 2, [3, 4, 5]], [1, 2, [3, 4]]);
5094});
5095
5096},{"../../":1}],84:[function(require,module,exports){
5097var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
5098
5099;(function (exports) {
5100 'use strict';
5101
5102 var Arr = (typeof Uint8Array !== 'undefined')
5103 ? Uint8Array
5104 : Array
5105
5106 var PLUS = '+'.charCodeAt(0)
5107 var SLASH = '/'.charCodeAt(0)
5108 var NUMBER = '0'.charCodeAt(0)
5109 var LOWER = 'a'.charCodeAt(0)
5110 var UPPER = 'A'.charCodeAt(0)
5111 var PLUS_URL_SAFE = '-'.charCodeAt(0)
5112 var SLASH_URL_SAFE = '_'.charCodeAt(0)
5113
5114 function decode (elt) {
5115 var code = elt.charCodeAt(0)
5116 if (code === PLUS ||
5117 code === PLUS_URL_SAFE)
5118 return 62 // '+'
5119 if (code === SLASH ||
5120 code === SLASH_URL_SAFE)
5121 return 63 // '/'
5122 if (code < NUMBER)
5123 return -1 //no match
5124 if (code < NUMBER + 10)
5125 return code - NUMBER + 26 + 26
5126 if (code < UPPER + 26)
5127 return code - UPPER
5128 if (code < LOWER + 26)
5129 return code - LOWER + 26
5130 }
5131
5132 function b64ToByteArray (b64) {
5133 var i, j, l, tmp, placeHolders, arr
5134
5135 if (b64.length % 4 > 0) {
5136 throw new Error('Invalid string. Length must be a multiple of 4')
5137 }
5138
5139 // the number of equal signs (place holders)
5140 // if there are two placeholders, than the two characters before it
5141 // represent one byte
5142 // if there is only one, then the three characters before it represent 2 bytes
5143 // this is just a cheap hack to not do indexOf twice
5144 var len = b64.length
5145 placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0
5146
5147 // base64 is 4/3 + up to two characters of the original data
5148 arr = new Arr(b64.length * 3 / 4 - placeHolders)
5149
5150 // if there are placeholders, only get up to the last complete 4 chars
5151 l = placeHolders > 0 ? b64.length - 4 : b64.length
5152
5153 var L = 0
5154
5155 function push (v) {
5156 arr[L++] = v
5157 }
5158
5159 for (i = 0, j = 0; i < l; i += 4, j += 3) {
5160 tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
5161 push((tmp & 0xFF0000) >> 16)
5162 push((tmp & 0xFF00) >> 8)
5163 push(tmp & 0xFF)
5164 }
5165
5166 if (placeHolders === 2) {
5167 tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
5168 push(tmp & 0xFF)
5169 } else if (placeHolders === 1) {
5170 tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
5171 push((tmp >> 8) & 0xFF)
5172 push(tmp & 0xFF)
5173 }
5174
5175 return arr
5176 }
5177
5178 function uint8ToBase64 (uint8) {
5179 var i,
5180 extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
5181 output = "",
5182 temp, length
5183
5184 function encode (num) {
5185 return lookup.charAt(num)
5186 }
5187
5188 function tripletToBase64 (num) {
5189 return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
5190 }
5191
5192 // go through the array every three bytes, we'll deal with trailing stuff later
5193 for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
5194 temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
5195 output += tripletToBase64(temp)
5196 }
5197
5198 // pad the end with zeros, but make sure to not forget the extra bytes
5199 switch (extraBytes) {
5200 case 1:
5201 temp = uint8[uint8.length - 1]
5202 output += encode(temp >> 2)
5203 output += encode((temp << 4) & 0x3F)
5204 output += '=='
5205 break
5206 case 2:
5207 temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
5208 output += encode(temp >> 10)
5209 output += encode((temp >> 4) & 0x3F)
5210 output += encode((temp << 2) & 0x3F)
5211 output += '='
5212 break
5213 }
5214
5215 return output
5216 }
5217
5218 exports.toByteArray = b64ToByteArray
5219 exports.fromByteArray = uint8ToBase64
5220}(typeof exports === 'undefined' ? (this.base64js = {}) : exports))
5221
5222},{}],85:[function(require,module,exports){
5223
5224},{}],86:[function(require,module,exports){
5225/*!
5226 * The buffer module from node.js, for the browser.
5227 *
5228 * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
5229 * @license MIT
5230 */
5231
5232var base64 = require('base64-js')
5233var ieee754 = require('ieee754')
5234
5235exports.Buffer = Buffer
5236exports.SlowBuffer = Buffer
5237exports.INSPECT_MAX_BYTES = 50
5238Buffer.poolSize = 8192
5239
5240/**
5241 * If `Buffer._useTypedArrays`:
5242 * === true Use Uint8Array implementation (fastest)
5243 * === false Use Object implementation (compatible down to IE6)
5244 */
5245Buffer._useTypedArrays = (function () {
5246 // Detect if browser supports Typed Arrays. Supported browsers are IE 10+, Firefox 4+,
5247 // Chrome 7+, Safari 5.1+, Opera 11.6+, iOS 4.2+. If the browser does not support adding
5248 // properties to `Uint8Array` instances, then that's the same as no `Uint8Array` support
5249 // because we need to be able to add all the node Buffer API methods. This is an issue
5250 // in Firefox 4-29. Now fixed: https://bugzilla.mozilla.org/show_bug.cgi?id=695438
5251 try {
5252 var buf = new ArrayBuffer(0)
5253 var arr = new Uint8Array(buf)
5254 arr.foo = function () { return 42 }
5255 return 42 === arr.foo() &&
5256 typeof arr.subarray === 'function' // Chrome 9-10 lack `subarray`
5257 } catch (e) {
5258 return false
5259 }
5260})()
5261
5262/**
5263 * Class: Buffer
5264 * =============
5265 *
5266 * The Buffer constructor returns instances of `Uint8Array` that are augmented
5267 * with function properties for all the node `Buffer` API functions. We use
5268 * `Uint8Array` so that square bracket notation works as expected -- it returns
5269 * a single octet.
5270 *
5271 * By augmenting the instances, we can avoid modifying the `Uint8Array`
5272 * prototype.
5273 */
5274function Buffer (subject, encoding, noZero) {
5275 if (!(this instanceof Buffer))
5276 return new Buffer(subject, encoding, noZero)
5277
5278 var type = typeof subject
5279
5280 // Workaround: node's base64 implementation allows for non-padded strings
5281 // while base64-js does not.
5282 if (encoding === 'base64' && type === 'string') {
5283 subject = stringtrim(subject)
5284 while (subject.length % 4 !== 0) {
5285 subject = subject + '='
5286 }
5287 }
5288
5289 // Find the length
5290 var length
5291 if (type === 'number')
5292 length = coerce(subject)
5293 else if (type === 'string')
5294 length = Buffer.byteLength(subject, encoding)
5295 else if (type === 'object')
5296 length = coerce(subject.length) // assume that object is array-like
5297 else
5298 throw new Error('First argument needs to be a number, array or string.')
5299
5300 var buf
5301 if (Buffer._useTypedArrays) {
5302 // Preferred: Return an augmented `Uint8Array` instance for best performance
5303 buf = Buffer._augment(new Uint8Array(length))
5304 } else {
5305 // Fallback: Return THIS instance of Buffer (created by `new`)
5306 buf = this
5307 buf.length = length
5308 buf._isBuffer = true
5309 }
5310
5311 var i
5312 if (Buffer._useTypedArrays && typeof subject.byteLength === 'number') {
5313 // Speed optimization -- use set if we're copying from a typed array
5314 buf._set(subject)
5315 } else if (isArrayish(subject)) {
5316 // Treat array-ish objects as a byte array
5317 for (i = 0; i < length; i++) {
5318 if (Buffer.isBuffer(subject))
5319 buf[i] = subject.readUInt8(i)
5320 else
5321 buf[i] = subject[i]
5322 }
5323 } else if (type === 'string') {
5324 buf.write(subject, 0, encoding)
5325 } else if (type === 'number' && !Buffer._useTypedArrays && !noZero) {
5326 for (i = 0; i < length; i++) {
5327 buf[i] = 0
5328 }
5329 }
5330
5331 return buf
5332}
5333
5334// STATIC METHODS
5335// ==============
5336
5337Buffer.isEncoding = function (encoding) {
5338 switch (String(encoding).toLowerCase()) {
5339 case 'hex':
5340 case 'utf8':
5341 case 'utf-8':
5342 case 'ascii':
5343 case 'binary':
5344 case 'base64':
5345 case 'raw':
5346 case 'ucs2':
5347 case 'ucs-2':
5348 case 'utf16le':
5349 case 'utf-16le':
5350 return true
5351 default:
5352 return false
5353 }
5354}
5355
5356Buffer.isBuffer = function (b) {
5357 return !!(b !== null && b !== undefined && b._isBuffer)
5358}
5359
5360Buffer.byteLength = function (str, encoding) {
5361 var ret
5362 str = str + ''
5363 switch (encoding || 'utf8') {
5364 case 'hex':
5365 ret = str.length / 2
5366 break
5367 case 'utf8':
5368 case 'utf-8':
5369 ret = utf8ToBytes(str).length
5370 break
5371 case 'ascii':
5372 case 'binary':
5373 case 'raw':
5374 ret = str.length
5375 break
5376 case 'base64':
5377 ret = base64ToBytes(str).length
5378 break
5379 case 'ucs2':
5380 case 'ucs-2':
5381 case 'utf16le':
5382 case 'utf-16le':
5383 ret = str.length * 2
5384 break
5385 default:
5386 throw new Error('Unknown encoding')
5387 }
5388 return ret
5389}
5390
5391Buffer.concat = function (list, totalLength) {
5392 assert(isArray(list), 'Usage: Buffer.concat(list, [totalLength])\n' +
5393 'list should be an Array.')
5394
5395 if (list.length === 0) {
5396 return new Buffer(0)
5397 } else if (list.length === 1) {
5398 return list[0]
5399 }
5400
5401 var i
5402 if (typeof totalLength !== 'number') {
5403 totalLength = 0
5404 for (i = 0; i < list.length; i++) {
5405 totalLength += list[i].length
5406 }
5407 }
5408
5409 var buf = new Buffer(totalLength)
5410 var pos = 0
5411 for (i = 0; i < list.length; i++) {
5412 var item = list[i]
5413 item.copy(buf, pos)
5414 pos += item.length
5415 }
5416 return buf
5417}
5418
5419// BUFFER INSTANCE METHODS
5420// =======================
5421
5422function _hexWrite (buf, string, offset, length) {
5423 offset = Number(offset) || 0
5424 var remaining = buf.length - offset
5425 if (!length) {
5426 length = remaining
5427 } else {
5428 length = Number(length)
5429 if (length > remaining) {
5430 length = remaining
5431 }
5432 }
5433
5434 // must be an even number of digits
5435 var strLen = string.length
5436 assert(strLen % 2 === 0, 'Invalid hex string')
5437
5438 if (length > strLen / 2) {
5439 length = strLen / 2
5440 }
5441 for (var i = 0; i < length; i++) {
5442 var byte = parseInt(string.substr(i * 2, 2), 16)
5443 assert(!isNaN(byte), 'Invalid hex string')
5444 buf[offset + i] = byte
5445 }
5446 Buffer._charsWritten = i * 2
5447 return i
5448}
5449
5450function _utf8Write (buf, string, offset, length) {
5451 var charsWritten = Buffer._charsWritten =
5452 blitBuffer(utf8ToBytes(string), buf, offset, length)
5453 return charsWritten
5454}
5455
5456function _asciiWrite (buf, string, offset, length) {
5457 var charsWritten = Buffer._charsWritten =
5458 blitBuffer(asciiToBytes(string), buf, offset, length)
5459 return charsWritten
5460}
5461
5462function _binaryWrite (buf, string, offset, length) {
5463 return _asciiWrite(buf, string, offset, length)
5464}
5465
5466function _base64Write (buf, string, offset, length) {
5467 var charsWritten = Buffer._charsWritten =
5468 blitBuffer(base64ToBytes(string), buf, offset, length)
5469 return charsWritten
5470}
5471
5472function _utf16leWrite (buf, string, offset, length) {
5473 var charsWritten = Buffer._charsWritten =
5474 blitBuffer(utf16leToBytes(string), buf, offset, length)
5475 return charsWritten
5476}
5477
5478Buffer.prototype.write = function (string, offset, length, encoding) {
5479 // Support both (string, offset, length, encoding)
5480 // and the legacy (string, encoding, offset, length)
5481 if (isFinite(offset)) {
5482 if (!isFinite(length)) {
5483 encoding = length
5484 length = undefined
5485 }
5486 } else { // legacy
5487 var swap = encoding
5488 encoding = offset
5489 offset = length
5490 length = swap
5491 }
5492
5493 offset = Number(offset) || 0
5494 var remaining = this.length - offset
5495 if (!length) {
5496 length = remaining
5497 } else {
5498 length = Number(length)
5499 if (length > remaining) {
5500 length = remaining
5501 }
5502 }
5503 encoding = String(encoding || 'utf8').toLowerCase()
5504
5505 var ret
5506 switch (encoding) {
5507 case 'hex':
5508 ret = _hexWrite(this, string, offset, length)
5509 break
5510 case 'utf8':
5511 case 'utf-8':
5512 ret = _utf8Write(this, string, offset, length)
5513 break
5514 case 'ascii':
5515 ret = _asciiWrite(this, string, offset, length)
5516 break
5517 case 'binary':
5518 ret = _binaryWrite(this, string, offset, length)
5519 break
5520 case 'base64':
5521 ret = _base64Write(this, string, offset, length)
5522 break
5523 case 'ucs2':
5524 case 'ucs-2':
5525 case 'utf16le':
5526 case 'utf-16le':
5527 ret = _utf16leWrite(this, string, offset, length)
5528 break
5529 default:
5530 throw new Error('Unknown encoding')
5531 }
5532 return ret
5533}
5534
5535Buffer.prototype.toString = function (encoding, start, end) {
5536 var self = this
5537
5538 encoding = String(encoding || 'utf8').toLowerCase()
5539 start = Number(start) || 0
5540 end = (end !== undefined)
5541 ? Number(end)
5542 : end = self.length
5543
5544 // Fastpath empty strings
5545 if (end === start)
5546 return ''
5547
5548 var ret
5549 switch (encoding) {
5550 case 'hex':
5551 ret = _hexSlice(self, start, end)
5552 break
5553 case 'utf8':
5554 case 'utf-8':
5555 ret = _utf8Slice(self, start, end)
5556 break
5557 case 'ascii':
5558 ret = _asciiSlice(self, start, end)
5559 break
5560 case 'binary':
5561 ret = _binarySlice(self, start, end)
5562 break
5563 case 'base64':
5564 ret = _base64Slice(self, start, end)
5565 break
5566 case 'ucs2':
5567 case 'ucs-2':
5568 case 'utf16le':
5569 case 'utf-16le':
5570 ret = _utf16leSlice(self, start, end)
5571 break
5572 default:
5573 throw new Error('Unknown encoding')
5574 }
5575 return ret
5576}
5577
5578Buffer.prototype.toJSON = function () {
5579 return {
5580 type: 'Buffer',
5581 data: Array.prototype.slice.call(this._arr || this, 0)
5582 }
5583}
5584
5585// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
5586Buffer.prototype.copy = function (target, target_start, start, end) {
5587 var source = this
5588
5589 if (!start) start = 0
5590 if (!end && end !== 0) end = this.length
5591 if (!target_start) target_start = 0
5592
5593 // Copy 0 bytes; we're done
5594 if (end === start) return
5595 if (target.length === 0 || source.length === 0) return
5596
5597 // Fatal error conditions
5598 assert(end >= start, 'sourceEnd < sourceStart')
5599 assert(target_start >= 0 && target_start < target.length,
5600 'targetStart out of bounds')
5601 assert(start >= 0 && start < source.length, 'sourceStart out of bounds')
5602 assert(end >= 0 && end <= source.length, 'sourceEnd out of bounds')
5603
5604 // Are we oob?
5605 if (end > this.length)
5606 end = this.length
5607 if (target.length - target_start < end - start)
5608 end = target.length - target_start + start
5609
5610 var len = end - start
5611
5612 if (len < 100 || !Buffer._useTypedArrays) {
5613 for (var i = 0; i < len; i++)
5614 target[i + target_start] = this[i + start]
5615 } else {
5616 target._set(this.subarray(start, start + len), target_start)
5617 }
5618}
5619
5620function _base64Slice (buf, start, end) {
5621 if (start === 0 && end === buf.length) {
5622 return base64.fromByteArray(buf)
5623 } else {
5624 return base64.fromByteArray(buf.slice(start, end))
5625 }
5626}
5627
5628function _utf8Slice (buf, start, end) {
5629 var res = ''
5630 var tmp = ''
5631 end = Math.min(buf.length, end)
5632
5633 for (var i = start; i < end; i++) {
5634 if (buf[i] <= 0x7F) {
5635 res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i])
5636 tmp = ''
5637 } else {
5638 tmp += '%' + buf[i].toString(16)
5639 }
5640 }
5641
5642 return res + decodeUtf8Char(tmp)
5643}
5644
5645function _asciiSlice (buf, start, end) {
5646 var ret = ''
5647 end = Math.min(buf.length, end)
5648
5649 for (var i = start; i < end; i++)
5650 ret += String.fromCharCode(buf[i])
5651 return ret
5652}
5653
5654function _binarySlice (buf, start, end) {
5655 return _asciiSlice(buf, start, end)
5656}
5657
5658function _hexSlice (buf, start, end) {
5659 var len = buf.length
5660
5661 if (!start || start < 0) start = 0
5662 if (!end || end < 0 || end > len) end = len
5663
5664 var out = ''
5665 for (var i = start; i < end; i++) {
5666 out += toHex(buf[i])
5667 }
5668 return out
5669}
5670
5671function _utf16leSlice (buf, start, end) {
5672 var bytes = buf.slice(start, end)
5673 var res = ''
5674 for (var i = 0; i < bytes.length; i += 2) {
5675 res += String.fromCharCode(bytes[i] + bytes[i+1] * 256)
5676 }
5677 return res
5678}
5679
5680Buffer.prototype.slice = function (start, end) {
5681 var len = this.length
5682 start = clamp(start, len, 0)
5683 end = clamp(end, len, len)
5684
5685 if (Buffer._useTypedArrays) {
5686 return Buffer._augment(this.subarray(start, end))
5687 } else {
5688 var sliceLen = end - start
5689 var newBuf = new Buffer(sliceLen, undefined, true)
5690 for (var i = 0; i < sliceLen; i++) {
5691 newBuf[i] = this[i + start]
5692 }
5693 return newBuf
5694 }
5695}
5696
5697// `get` will be removed in Node 0.13+
5698Buffer.prototype.get = function (offset) {
5699 console.log('.get() is deprecated. Access using array indexes instead.')
5700 return this.readUInt8(offset)
5701}
5702
5703// `set` will be removed in Node 0.13+
5704Buffer.prototype.set = function (v, offset) {
5705 console.log('.set() is deprecated. Access using array indexes instead.')
5706 return this.writeUInt8(v, offset)
5707}
5708
5709Buffer.prototype.readUInt8 = function (offset, noAssert) {
5710 if (!noAssert) {
5711 assert(offset !== undefined && offset !== null, 'missing offset')
5712 assert(offset < this.length, 'Trying to read beyond buffer length')
5713 }
5714
5715 if (offset >= this.length)
5716 return
5717
5718 return this[offset]
5719}
5720
5721function _readUInt16 (buf, offset, littleEndian, noAssert) {
5722 if (!noAssert) {
5723 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
5724 assert(offset !== undefined && offset !== null, 'missing offset')
5725 assert(offset + 1 < buf.length, 'Trying to read beyond buffer length')
5726 }
5727
5728 var len = buf.length
5729 if (offset >= len)
5730 return
5731
5732 var val
5733 if (littleEndian) {
5734 val = buf[offset]
5735 if (offset + 1 < len)
5736 val |= buf[offset + 1] << 8
5737 } else {
5738 val = buf[offset] << 8
5739 if (offset + 1 < len)
5740 val |= buf[offset + 1]
5741 }
5742 return val
5743}
5744
5745Buffer.prototype.readUInt16LE = function (offset, noAssert) {
5746 return _readUInt16(this, offset, true, noAssert)
5747}
5748
5749Buffer.prototype.readUInt16BE = function (offset, noAssert) {
5750 return _readUInt16(this, offset, false, noAssert)
5751}
5752
5753function _readUInt32 (buf, offset, littleEndian, noAssert) {
5754 if (!noAssert) {
5755 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
5756 assert(offset !== undefined && offset !== null, 'missing offset')
5757 assert(offset + 3 < buf.length, 'Trying to read beyond buffer length')
5758 }
5759
5760 var len = buf.length
5761 if (offset >= len)
5762 return
5763
5764 var val
5765 if (littleEndian) {
5766 if (offset + 2 < len)
5767 val = buf[offset + 2] << 16
5768 if (offset + 1 < len)
5769 val |= buf[offset + 1] << 8
5770 val |= buf[offset]
5771 if (offset + 3 < len)
5772 val = val + (buf[offset + 3] << 24 >>> 0)
5773 } else {
5774 if (offset + 1 < len)
5775 val = buf[offset + 1] << 16
5776 if (offset + 2 < len)
5777 val |= buf[offset + 2] << 8
5778 if (offset + 3 < len)
5779 val |= buf[offset + 3]
5780 val = val + (buf[offset] << 24 >>> 0)
5781 }
5782 return val
5783}
5784
5785Buffer.prototype.readUInt32LE = function (offset, noAssert) {
5786 return _readUInt32(this, offset, true, noAssert)
5787}
5788
5789Buffer.prototype.readUInt32BE = function (offset, noAssert) {
5790 return _readUInt32(this, offset, false, noAssert)
5791}
5792
5793Buffer.prototype.readInt8 = function (offset, noAssert) {
5794 if (!noAssert) {
5795 assert(offset !== undefined && offset !== null,
5796 'missing offset')
5797 assert(offset < this.length, 'Trying to read beyond buffer length')
5798 }
5799
5800 if (offset >= this.length)
5801 return
5802
5803 var neg = this[offset] & 0x80
5804 if (neg)
5805 return (0xff - this[offset] + 1) * -1
5806 else
5807 return this[offset]
5808}
5809
5810function _readInt16 (buf, offset, littleEndian, noAssert) {
5811 if (!noAssert) {
5812 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
5813 assert(offset !== undefined && offset !== null, 'missing offset')
5814 assert(offset + 1 < buf.length, 'Trying to read beyond buffer length')
5815 }
5816
5817 var len = buf.length
5818 if (offset >= len)
5819 return
5820
5821 var val = _readUInt16(buf, offset, littleEndian, true)
5822 var neg = val & 0x8000
5823 if (neg)
5824 return (0xffff - val + 1) * -1
5825 else
5826 return val
5827}
5828
5829Buffer.prototype.readInt16LE = function (offset, noAssert) {
5830 return _readInt16(this, offset, true, noAssert)
5831}
5832
5833Buffer.prototype.readInt16BE = function (offset, noAssert) {
5834 return _readInt16(this, offset, false, noAssert)
5835}
5836
5837function _readInt32 (buf, offset, littleEndian, noAssert) {
5838 if (!noAssert) {
5839 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
5840 assert(offset !== undefined && offset !== null, 'missing offset')
5841 assert(offset + 3 < buf.length, 'Trying to read beyond buffer length')
5842 }
5843
5844 var len = buf.length
5845 if (offset >= len)
5846 return
5847
5848 var val = _readUInt32(buf, offset, littleEndian, true)
5849 var neg = val & 0x80000000
5850 if (neg)
5851 return (0xffffffff - val + 1) * -1
5852 else
5853 return val
5854}
5855
5856Buffer.prototype.readInt32LE = function (offset, noAssert) {
5857 return _readInt32(this, offset, true, noAssert)
5858}
5859
5860Buffer.prototype.readInt32BE = function (offset, noAssert) {
5861 return _readInt32(this, offset, false, noAssert)
5862}
5863
5864function _readFloat (buf, offset, littleEndian, noAssert) {
5865 if (!noAssert) {
5866 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
5867 assert(offset + 3 < buf.length, 'Trying to read beyond buffer length')
5868 }
5869
5870 return ieee754.read(buf, offset, littleEndian, 23, 4)
5871}
5872
5873Buffer.prototype.readFloatLE = function (offset, noAssert) {
5874 return _readFloat(this, offset, true, noAssert)
5875}
5876
5877Buffer.prototype.readFloatBE = function (offset, noAssert) {
5878 return _readFloat(this, offset, false, noAssert)
5879}
5880
5881function _readDouble (buf, offset, littleEndian, noAssert) {
5882 if (!noAssert) {
5883 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
5884 assert(offset + 7 < buf.length, 'Trying to read beyond buffer length')
5885 }
5886
5887 return ieee754.read(buf, offset, littleEndian, 52, 8)
5888}
5889
5890Buffer.prototype.readDoubleLE = function (offset, noAssert) {
5891 return _readDouble(this, offset, true, noAssert)
5892}
5893
5894Buffer.prototype.readDoubleBE = function (offset, noAssert) {
5895 return _readDouble(this, offset, false, noAssert)
5896}
5897
5898Buffer.prototype.writeUInt8 = function (value, offset, noAssert) {
5899 if (!noAssert) {
5900 assert(value !== undefined && value !== null, 'missing value')
5901 assert(offset !== undefined && offset !== null, 'missing offset')
5902 assert(offset < this.length, 'trying to write beyond buffer length')
5903 verifuint(value, 0xff)
5904 }
5905
5906 if (offset >= this.length) return
5907
5908 this[offset] = value
5909}
5910
5911function _writeUInt16 (buf, value, offset, littleEndian, noAssert) {
5912 if (!noAssert) {
5913 assert(value !== undefined && value !== null, 'missing value')
5914 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
5915 assert(offset !== undefined && offset !== null, 'missing offset')
5916 assert(offset + 1 < buf.length, 'trying to write beyond buffer length')
5917 verifuint(value, 0xffff)
5918 }
5919
5920 var len = buf.length
5921 if (offset >= len)
5922 return
5923
5924 for (var i = 0, j = Math.min(len - offset, 2); i < j; i++) {
5925 buf[offset + i] =
5926 (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
5927 (littleEndian ? i : 1 - i) * 8
5928 }
5929}
5930
5931Buffer.prototype.writeUInt16LE = function (value, offset, noAssert) {
5932 _writeUInt16(this, value, offset, true, noAssert)
5933}
5934
5935Buffer.prototype.writeUInt16BE = function (value, offset, noAssert) {
5936 _writeUInt16(this, value, offset, false, noAssert)
5937}
5938
5939function _writeUInt32 (buf, value, offset, littleEndian, noAssert) {
5940 if (!noAssert) {
5941 assert(value !== undefined && value !== null, 'missing value')
5942 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
5943 assert(offset !== undefined && offset !== null, 'missing offset')
5944 assert(offset + 3 < buf.length, 'trying to write beyond buffer length')
5945 verifuint(value, 0xffffffff)
5946 }
5947
5948 var len = buf.length
5949 if (offset >= len)
5950 return
5951
5952 for (var i = 0, j = Math.min(len - offset, 4); i < j; i++) {
5953 buf[offset + i] =
5954 (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
5955 }
5956}
5957
5958Buffer.prototype.writeUInt32LE = function (value, offset, noAssert) {
5959 _writeUInt32(this, value, offset, true, noAssert)
5960}
5961
5962Buffer.prototype.writeUInt32BE = function (value, offset, noAssert) {
5963 _writeUInt32(this, value, offset, false, noAssert)
5964}
5965
5966Buffer.prototype.writeInt8 = function (value, offset, noAssert) {
5967 if (!noAssert) {
5968 assert(value !== undefined && value !== null, 'missing value')
5969 assert(offset !== undefined && offset !== null, 'missing offset')
5970 assert(offset < this.length, 'Trying to write beyond buffer length')
5971 verifsint(value, 0x7f, -0x80)
5972 }
5973
5974 if (offset >= this.length)
5975 return
5976
5977 if (value >= 0)
5978 this.writeUInt8(value, offset, noAssert)
5979 else
5980 this.writeUInt8(0xff + value + 1, offset, noAssert)
5981}
5982
5983function _writeInt16 (buf, value, offset, littleEndian, noAssert) {
5984 if (!noAssert) {
5985 assert(value !== undefined && value !== null, 'missing value')
5986 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
5987 assert(offset !== undefined && offset !== null, 'missing offset')
5988 assert(offset + 1 < buf.length, 'Trying to write beyond buffer length')
5989 verifsint(value, 0x7fff, -0x8000)
5990 }
5991
5992 var len = buf.length
5993 if (offset >= len)
5994 return
5995
5996 if (value >= 0)
5997 _writeUInt16(buf, value, offset, littleEndian, noAssert)
5998 else
5999 _writeUInt16(buf, 0xffff + value + 1, offset, littleEndian, noAssert)
6000}
6001
6002Buffer.prototype.writeInt16LE = function (value, offset, noAssert) {
6003 _writeInt16(this, value, offset, true, noAssert)
6004}
6005
6006Buffer.prototype.writeInt16BE = function (value, offset, noAssert) {
6007 _writeInt16(this, value, offset, false, noAssert)
6008}
6009
6010function _writeInt32 (buf, value, offset, littleEndian, noAssert) {
6011 if (!noAssert) {
6012 assert(value !== undefined && value !== null, 'missing value')
6013 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
6014 assert(offset !== undefined && offset !== null, 'missing offset')
6015 assert(offset + 3 < buf.length, 'Trying to write beyond buffer length')
6016 verifsint(value, 0x7fffffff, -0x80000000)
6017 }
6018
6019 var len = buf.length
6020 if (offset >= len)
6021 return
6022
6023 if (value >= 0)
6024 _writeUInt32(buf, value, offset, littleEndian, noAssert)
6025 else
6026 _writeUInt32(buf, 0xffffffff + value + 1, offset, littleEndian, noAssert)
6027}
6028
6029Buffer.prototype.writeInt32LE = function (value, offset, noAssert) {
6030 _writeInt32(this, value, offset, true, noAssert)
6031}
6032
6033Buffer.prototype.writeInt32BE = function (value, offset, noAssert) {
6034 _writeInt32(this, value, offset, false, noAssert)
6035}
6036
6037function _writeFloat (buf, value, offset, littleEndian, noAssert) {
6038 if (!noAssert) {
6039 assert(value !== undefined && value !== null, 'missing value')
6040 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
6041 assert(offset !== undefined && offset !== null, 'missing offset')
6042 assert(offset + 3 < buf.length, 'Trying to write beyond buffer length')
6043 verifIEEE754(value, 3.4028234663852886e+38, -3.4028234663852886e+38)
6044 }
6045
6046 var len = buf.length
6047 if (offset >= len)
6048 return
6049
6050 ieee754.write(buf, value, offset, littleEndian, 23, 4)
6051}
6052
6053Buffer.prototype.writeFloatLE = function (value, offset, noAssert) {
6054 _writeFloat(this, value, offset, true, noAssert)
6055}
6056
6057Buffer.prototype.writeFloatBE = function (value, offset, noAssert) {
6058 _writeFloat(this, value, offset, false, noAssert)
6059}
6060
6061function _writeDouble (buf, value, offset, littleEndian, noAssert) {
6062 if (!noAssert) {
6063 assert(value !== undefined && value !== null, 'missing value')
6064 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
6065 assert(offset !== undefined && offset !== null, 'missing offset')
6066 assert(offset + 7 < buf.length,
6067 'Trying to write beyond buffer length')
6068 verifIEEE754(value, 1.7976931348623157E+308, -1.7976931348623157E+308)
6069 }
6070
6071 var len = buf.length
6072 if (offset >= len)
6073 return
6074
6075 ieee754.write(buf, value, offset, littleEndian, 52, 8)
6076}
6077
6078Buffer.prototype.writeDoubleLE = function (value, offset, noAssert) {
6079 _writeDouble(this, value, offset, true, noAssert)
6080}
6081
6082Buffer.prototype.writeDoubleBE = function (value, offset, noAssert) {
6083 _writeDouble(this, value, offset, false, noAssert)
6084}
6085
6086// fill(value, start=0, end=buffer.length)
6087Buffer.prototype.fill = function (value, start, end) {
6088 if (!value) value = 0
6089 if (!start) start = 0
6090 if (!end) end = this.length
6091
6092 if (typeof value === 'string') {
6093 value = value.charCodeAt(0)
6094 }
6095
6096 assert(typeof value === 'number' && !isNaN(value), 'value is not a number')
6097 assert(end >= start, 'end < start')
6098
6099 // Fill 0 bytes; we're done
6100 if (end === start) return
6101 if (this.length === 0) return
6102
6103 assert(start >= 0 && start < this.length, 'start out of bounds')
6104 assert(end >= 0 && end <= this.length, 'end out of bounds')
6105
6106 for (var i = start; i < end; i++) {
6107 this[i] = value
6108 }
6109}
6110
6111Buffer.prototype.inspect = function () {
6112 var out = []
6113 var len = this.length
6114 for (var i = 0; i < len; i++) {
6115 out[i] = toHex(this[i])
6116 if (i === exports.INSPECT_MAX_BYTES) {
6117 out[i + 1] = '...'
6118 break
6119 }
6120 }
6121 return '<Buffer ' + out.join(' ') + '>'
6122}
6123
6124/**
6125 * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.
6126 * Added in Node 0.12. Only available in browsers that support ArrayBuffer.
6127 */
6128Buffer.prototype.toArrayBuffer = function () {
6129 if (typeof Uint8Array !== 'undefined') {
6130 if (Buffer._useTypedArrays) {
6131 return (new Buffer(this)).buffer
6132 } else {
6133 var buf = new Uint8Array(this.length)
6134 for (var i = 0, len = buf.length; i < len; i += 1)
6135 buf[i] = this[i]
6136 return buf.buffer
6137 }
6138 } else {
6139 throw new Error('Buffer.toArrayBuffer not supported in this browser')
6140 }
6141}
6142
6143// HELPER FUNCTIONS
6144// ================
6145
6146function stringtrim (str) {
6147 if (str.trim) return str.trim()
6148 return str.replace(/^\s+|\s+$/g, '')
6149}
6150
6151var BP = Buffer.prototype
6152
6153/**
6154 * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
6155 */
6156Buffer._augment = function (arr) {
6157 arr._isBuffer = true
6158
6159 // save reference to original Uint8Array get/set methods before overwriting
6160 arr._get = arr.get
6161 arr._set = arr.set
6162
6163 // deprecated, will be removed in node 0.13+
6164 arr.get = BP.get
6165 arr.set = BP.set
6166
6167 arr.write = BP.write
6168 arr.toString = BP.toString
6169 arr.toLocaleString = BP.toString
6170 arr.toJSON = BP.toJSON
6171 arr.copy = BP.copy
6172 arr.slice = BP.slice
6173 arr.readUInt8 = BP.readUInt8
6174 arr.readUInt16LE = BP.readUInt16LE
6175 arr.readUInt16BE = BP.readUInt16BE
6176 arr.readUInt32LE = BP.readUInt32LE
6177 arr.readUInt32BE = BP.readUInt32BE
6178 arr.readInt8 = BP.readInt8
6179 arr.readInt16LE = BP.readInt16LE
6180 arr.readInt16BE = BP.readInt16BE
6181 arr.readInt32LE = BP.readInt32LE
6182 arr.readInt32BE = BP.readInt32BE
6183 arr.readFloatLE = BP.readFloatLE
6184 arr.readFloatBE = BP.readFloatBE
6185 arr.readDoubleLE = BP.readDoubleLE
6186 arr.readDoubleBE = BP.readDoubleBE
6187 arr.writeUInt8 = BP.writeUInt8
6188 arr.writeUInt16LE = BP.writeUInt16LE
6189 arr.writeUInt16BE = BP.writeUInt16BE
6190 arr.writeUInt32LE = BP.writeUInt32LE
6191 arr.writeUInt32BE = BP.writeUInt32BE
6192 arr.writeInt8 = BP.writeInt8
6193 arr.writeInt16LE = BP.writeInt16LE
6194 arr.writeInt16BE = BP.writeInt16BE
6195 arr.writeInt32LE = BP.writeInt32LE
6196 arr.writeInt32BE = BP.writeInt32BE
6197 arr.writeFloatLE = BP.writeFloatLE
6198 arr.writeFloatBE = BP.writeFloatBE
6199 arr.writeDoubleLE = BP.writeDoubleLE
6200 arr.writeDoubleBE = BP.writeDoubleBE
6201 arr.fill = BP.fill
6202 arr.inspect = BP.inspect
6203 arr.toArrayBuffer = BP.toArrayBuffer
6204
6205 return arr
6206}
6207
6208// slice(start, end)
6209function clamp (index, len, defaultValue) {
6210 if (typeof index !== 'number') return defaultValue
6211 index = ~~index; // Coerce to integer.
6212 if (index >= len) return len
6213 if (index >= 0) return index
6214 index += len
6215 if (index >= 0) return index
6216 return 0
6217}
6218
6219function coerce (length) {
6220 // Coerce length to a number (possibly NaN), round up
6221 // in case it's fractional (e.g. 123.456) then do a
6222 // double negate to coerce a NaN to 0. Easy, right?
6223 length = ~~Math.ceil(+length)
6224 return length < 0 ? 0 : length
6225}
6226
6227function isArray (subject) {
6228 return (Array.isArray || function (subject) {
6229 return Object.prototype.toString.call(subject) === '[object Array]'
6230 })(subject)
6231}
6232
6233function isArrayish (subject) {
6234 return isArray(subject) || Buffer.isBuffer(subject) ||
6235 subject && typeof subject === 'object' &&
6236 typeof subject.length === 'number'
6237}
6238
6239function toHex (n) {
6240 if (n < 16) return '0' + n.toString(16)
6241 return n.toString(16)
6242}
6243
6244function utf8ToBytes (str) {
6245 var byteArray = []
6246 for (var i = 0; i < str.length; i++) {
6247 var b = str.charCodeAt(i)
6248 if (b <= 0x7F)
6249 byteArray.push(str.charCodeAt(i))
6250 else {
6251 var start = i
6252 if (b >= 0xD800 && b <= 0xDFFF) i++
6253 var h = encodeURIComponent(str.slice(start, i+1)).substr(1).split('%')
6254 for (var j = 0; j < h.length; j++)
6255 byteArray.push(parseInt(h[j], 16))
6256 }
6257 }
6258 return byteArray
6259}
6260
6261function asciiToBytes (str) {
6262 var byteArray = []
6263 for (var i = 0; i < str.length; i++) {
6264 // Node's code seems to be doing this and not & 0x7F..
6265 byteArray.push(str.charCodeAt(i) & 0xFF)
6266 }
6267 return byteArray
6268}
6269
6270function utf16leToBytes (str) {
6271 var c, hi, lo
6272 var byteArray = []
6273 for (var i = 0; i < str.length; i++) {
6274 c = str.charCodeAt(i)
6275 hi = c >> 8
6276 lo = c % 256
6277 byteArray.push(lo)
6278 byteArray.push(hi)
6279 }
6280
6281 return byteArray
6282}
6283
6284function base64ToBytes (str) {
6285 return base64.toByteArray(str)
6286}
6287
6288function blitBuffer (src, dst, offset, length) {
6289 var pos
6290 for (var i = 0; i < length; i++) {
6291 if ((i + offset >= dst.length) || (i >= src.length))
6292 break
6293 dst[i + offset] = src[i]
6294 }
6295 return i
6296}
6297
6298function decodeUtf8Char (str) {
6299 try {
6300 return decodeURIComponent(str)
6301 } catch (err) {
6302 return String.fromCharCode(0xFFFD) // UTF 8 invalid char
6303 }
6304}
6305
6306/*
6307 * We have to make sure that the value is a valid integer. This means that it
6308 * is non-negative. It has no fractional component and that it does not
6309 * exceed the maximum allowed value.
6310 */
6311function verifuint (value, max) {
6312 assert(typeof value === 'number', 'cannot write a non-number as a number')
6313 assert(value >= 0, 'specified a negative value for writing an unsigned value')
6314 assert(value <= max, 'value is larger than maximum value for type')
6315 assert(Math.floor(value) === value, 'value has a fractional component')
6316}
6317
6318function verifsint (value, max, min) {
6319 assert(typeof value === 'number', 'cannot write a non-number as a number')
6320 assert(value <= max, 'value larger than maximum allowed value')
6321 assert(value >= min, 'value smaller than minimum allowed value')
6322 assert(Math.floor(value) === value, 'value has a fractional component')
6323}
6324
6325function verifIEEE754 (value, max, min) {
6326 assert(typeof value === 'number', 'cannot write a non-number as a number')
6327 assert(value <= max, 'value larger than maximum allowed value')
6328 assert(value >= min, 'value smaller than minimum allowed value')
6329}
6330
6331function assert (test, message) {
6332 if (!test) throw new Error(message || 'Failed assertion')
6333}
6334
6335},{"base64-js":84,"ieee754":88}],87:[function(require,module,exports){
6336// Copyright Joyent, Inc. and other Node contributors.
6337//
6338// Permission is hereby granted, free of charge, to any person obtaining a
6339// copy of this software and associated documentation files (the
6340// "Software"), to deal in the Software without restriction, including
6341// without limitation the rights to use, copy, modify, merge, publish,
6342// distribute, sublicense, and/or sell copies of the Software, and to permit
6343// persons to whom the Software is furnished to do so, subject to the
6344// following conditions:
6345//
6346// The above copyright notice and this permission notice shall be included
6347// in all copies or substantial portions of the Software.
6348//
6349// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
6350// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
6351// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
6352// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
6353// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
6354// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
6355// USE OR OTHER DEALINGS IN THE SOFTWARE.
6356
6357function EventEmitter() {
6358 this._events = this._events || {};
6359 this._maxListeners = this._maxListeners || undefined;
6360}
6361module.exports = EventEmitter;
6362
6363// Backwards-compat with node 0.10.x
6364EventEmitter.EventEmitter = EventEmitter;
6365
6366EventEmitter.prototype._events = undefined;
6367EventEmitter.prototype._maxListeners = undefined;
6368
6369// By default EventEmitters will print a warning if more than 10 listeners are
6370// added to it. This is a useful default which helps finding memory leaks.
6371EventEmitter.defaultMaxListeners = 10;
6372
6373// Obviously not all Emitters should be limited to 10. This function allows
6374// that to be increased. Set to zero for unlimited.
6375EventEmitter.prototype.setMaxListeners = function(n) {
6376 if (!isNumber(n) || n < 0 || isNaN(n))
6377 throw TypeError('n must be a positive number');
6378 this._maxListeners = n;
6379 return this;
6380};
6381
6382EventEmitter.prototype.emit = function(type) {
6383 var er, handler, len, args, i, listeners;
6384
6385 if (!this._events)
6386 this._events = {};
6387
6388 // If there is no 'error' event listener then throw.
6389 if (type === 'error') {
6390 if (!this._events.error ||
6391 (isObject(this._events.error) && !this._events.error.length)) {
6392 er = arguments[1];
6393 if (er instanceof Error) {
6394 throw er; // Unhandled 'error' event
6395 }
6396 throw TypeError('Uncaught, unspecified "error" event.');
6397 }
6398 }
6399
6400 handler = this._events[type];
6401
6402 if (isUndefined(handler))
6403 return false;
6404
6405 if (isFunction(handler)) {
6406 switch (arguments.length) {
6407 // fast cases
6408 case 1:
6409 handler.call(this);
6410 break;
6411 case 2:
6412 handler.call(this, arguments[1]);
6413 break;
6414 case 3:
6415 handler.call(this, arguments[1], arguments[2]);
6416 break;
6417 // slower
6418 default:
6419 len = arguments.length;
6420 args = new Array(len - 1);
6421 for (i = 1; i < len; i++)
6422 args[i - 1] = arguments[i];
6423 handler.apply(this, args);
6424 }
6425 } else if (isObject(handler)) {
6426 len = arguments.length;
6427 args = new Array(len - 1);
6428 for (i = 1; i < len; i++)
6429 args[i - 1] = arguments[i];
6430
6431 listeners = handler.slice();
6432 len = listeners.length;
6433 for (i = 0; i < len; i++)
6434 listeners[i].apply(this, args);
6435 }
6436
6437 return true;
6438};
6439
6440EventEmitter.prototype.addListener = function(type, listener) {
6441 var m;
6442
6443 if (!isFunction(listener))
6444 throw TypeError('listener must be a function');
6445
6446 if (!this._events)
6447 this._events = {};
6448
6449 // To avoid recursion in the case that type === "newListener"! Before
6450 // adding it to the listeners, first emit "newListener".
6451 if (this._events.newListener)
6452 this.emit('newListener', type,
6453 isFunction(listener.listener) ?
6454 listener.listener : listener);
6455
6456 if (!this._events[type])
6457 // Optimize the case of one listener. Don't need the extra array object.
6458 this._events[type] = listener;
6459 else if (isObject(this._events[type]))
6460 // If we've already got an array, just append.
6461 this._events[type].push(listener);
6462 else
6463 // Adding the second element, need to change to array.
6464 this._events[type] = [this._events[type], listener];
6465
6466 // Check for listener leak
6467 if (isObject(this._events[type]) && !this._events[type].warned) {
6468 var m;
6469 if (!isUndefined(this._maxListeners)) {
6470 m = this._maxListeners;
6471 } else {
6472 m = EventEmitter.defaultMaxListeners;
6473 }
6474
6475 if (m && m > 0 && this._events[type].length > m) {
6476 this._events[type].warned = true;
6477 console.error('(node) warning: possible EventEmitter memory ' +
6478 'leak detected. %d listeners added. ' +
6479 'Use emitter.setMaxListeners() to increase limit.',
6480 this._events[type].length);
6481 if (typeof console.trace === 'function') {
6482 // not supported in IE 10
6483 console.trace();
6484 }
6485 }
6486 }
6487
6488 return this;
6489};
6490
6491EventEmitter.prototype.on = EventEmitter.prototype.addListener;
6492
6493EventEmitter.prototype.once = function(type, listener) {
6494 if (!isFunction(listener))
6495 throw TypeError('listener must be a function');
6496
6497 var fired = false;
6498
6499 function g() {
6500 this.removeListener(type, g);
6501
6502 if (!fired) {
6503 fired = true;
6504 listener.apply(this, arguments);
6505 }
6506 }
6507
6508 g.listener = listener;
6509 this.on(type, g);
6510
6511 return this;
6512};
6513
6514// emits a 'removeListener' event iff the listener was removed
6515EventEmitter.prototype.removeListener = function(type, listener) {
6516 var list, position, length, i;
6517
6518 if (!isFunction(listener))
6519 throw TypeError('listener must be a function');
6520
6521 if (!this._events || !this._events[type])
6522 return this;
6523
6524 list = this._events[type];
6525 length = list.length;
6526 position = -1;
6527
6528 if (list === listener ||
6529 (isFunction(list.listener) && list.listener === listener)) {
6530 delete this._events[type];
6531 if (this._events.removeListener)
6532 this.emit('removeListener', type, listener);
6533
6534 } else if (isObject(list)) {
6535 for (i = length; i-- > 0;) {
6536 if (list[i] === listener ||
6537 (list[i].listener && list[i].listener === listener)) {
6538 position = i;
6539 break;
6540 }
6541 }
6542
6543 if (position < 0)
6544 return this;
6545
6546 if (list.length === 1) {
6547 list.length = 0;
6548 delete this._events[type];
6549 } else {
6550 list.splice(position, 1);
6551 }
6552
6553 if (this._events.removeListener)
6554 this.emit('removeListener', type, listener);
6555 }
6556
6557 return this;
6558};
6559
6560EventEmitter.prototype.removeAllListeners = function(type) {
6561 var key, listeners;
6562
6563 if (!this._events)
6564 return this;
6565
6566 // not listening for removeListener, no need to emit
6567 if (!this._events.removeListener) {
6568 if (arguments.length === 0)
6569 this._events = {};
6570 else if (this._events[type])
6571 delete this._events[type];
6572 return this;
6573 }
6574
6575 // emit removeListener for all listeners on all events
6576 if (arguments.length === 0) {
6577 for (key in this._events) {
6578 if (key === 'removeListener') continue;
6579 this.removeAllListeners(key);
6580 }
6581 this.removeAllListeners('removeListener');
6582 this._events = {};
6583 return this;
6584 }
6585
6586 listeners = this._events[type];
6587
6588 if (isFunction(listeners)) {
6589 this.removeListener(type, listeners);
6590 } else {
6591 // LIFO order
6592 while (listeners.length)
6593 this.removeListener(type, listeners[listeners.length - 1]);
6594 }
6595 delete this._events[type];
6596
6597 return this;
6598};
6599
6600EventEmitter.prototype.listeners = function(type) {
6601 var ret;
6602 if (!this._events || !this._events[type])
6603 ret = [];
6604 else if (isFunction(this._events[type]))
6605 ret = [this._events[type]];
6606 else
6607 ret = this._events[type].slice();
6608 return ret;
6609};
6610
6611EventEmitter.listenerCount = function(emitter, type) {
6612 var ret;
6613 if (!emitter._events || !emitter._events[type])
6614 ret = 0;
6615 else if (isFunction(emitter._events[type]))
6616 ret = 1;
6617 else
6618 ret = emitter._events[type].length;
6619 return ret;
6620};
6621
6622function isFunction(arg) {
6623 return typeof arg === 'function';
6624}
6625
6626function isNumber(arg) {
6627 return typeof arg === 'number';
6628}
6629
6630function isObject(arg) {
6631 return typeof arg === 'object' && arg !== null;
6632}
6633
6634function isUndefined(arg) {
6635 return arg === void 0;
6636}
6637
6638},{}],88:[function(require,module,exports){
6639exports.read = function (buffer, offset, isLE, mLen, nBytes) {
6640 var e, m
6641 var eLen = (nBytes * 8) - mLen - 1
6642 var eMax = (1 << eLen) - 1
6643 var eBias = eMax >> 1
6644 var nBits = -7
6645 var i = isLE ? (nBytes - 1) : 0
6646 var d = isLE ? -1 : 1
6647 var s = buffer[offset + i]
6648
6649 i += d
6650
6651 e = s & ((1 << (-nBits)) - 1)
6652 s >>= (-nBits)
6653 nBits += eLen
6654 for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
6655
6656 m = e & ((1 << (-nBits)) - 1)
6657 e >>= (-nBits)
6658 nBits += mLen
6659 for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
6660
6661 if (e === 0) {
6662 e = 1 - eBias
6663 } else if (e === eMax) {
6664 return m ? NaN : ((s ? -1 : 1) * Infinity)
6665 } else {
6666 m = m + Math.pow(2, mLen)
6667 e = e - eBias
6668 }
6669 return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
6670}
6671
6672exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
6673 var e, m, c
6674 var eLen = (nBytes * 8) - mLen - 1
6675 var eMax = (1 << eLen) - 1
6676 var eBias = eMax >> 1
6677 var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
6678 var i = isLE ? 0 : (nBytes - 1)
6679 var d = isLE ? 1 : -1
6680 var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
6681
6682 value = Math.abs(value)
6683
6684 if (isNaN(value) || value === Infinity) {
6685 m = isNaN(value) ? 1 : 0
6686 e = eMax
6687 } else {
6688 e = Math.floor(Math.log(value) / Math.LN2)
6689 if (value * (c = Math.pow(2, -e)) < 1) {
6690 e--
6691 c *= 2
6692 }
6693 if (e + eBias >= 1) {
6694 value += rt / c
6695 } else {
6696 value += rt * Math.pow(2, 1 - eBias)
6697 }
6698 if (value * c >= 2) {
6699 e++
6700 c /= 2
6701 }
6702
6703 if (e + eBias >= eMax) {
6704 m = 0
6705 e = eMax
6706 } else if (e + eBias >= 1) {
6707 m = ((value * c) - 1) * Math.pow(2, mLen)
6708 e = e + eBias
6709 } else {
6710 m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
6711 e = 0
6712 }
6713 }
6714
6715 for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
6716
6717 e = (e << mLen) | m
6718 eLen += mLen
6719 for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
6720
6721 buffer[offset + i - d] |= s * 128
6722}
6723
6724},{}],89:[function(require,module,exports){
6725module.exports=require(40)
6726},{}],90:[function(require,module,exports){
6727(function (process){
6728// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1,
6729// backported and transplited with Babel, with backwards-compat fixes
6730
6731// Copyright Joyent, Inc. and other Node contributors.
6732//
6733// Permission is hereby granted, free of charge, to any person obtaining a
6734// copy of this software and associated documentation files (the
6735// "Software"), to deal in the Software without restriction, including
6736// without limitation the rights to use, copy, modify, merge, publish,
6737// distribute, sublicense, and/or sell copies of the Software, and to permit
6738// persons to whom the Software is furnished to do so, subject to the
6739// following conditions:
6740//
6741// The above copyright notice and this permission notice shall be included
6742// in all copies or substantial portions of the Software.
6743//
6744// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
6745// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
6746// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
6747// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
6748// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
6749// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
6750// USE OR OTHER DEALINGS IN THE SOFTWARE.
6751
6752// resolves . and .. elements in a path array with directory names there
6753// must be no slashes, empty elements, or device names (c:\) in the array
6754// (so also no leading and trailing slashes - it does not distinguish
6755// relative and absolute paths)
6756function normalizeArray(parts, allowAboveRoot) {
6757 // if the path tries to go above the root, `up` ends up > 0
6758 var up = 0;
6759 for (var i = parts.length - 1; i >= 0; i--) {
6760 var last = parts[i];
6761 if (last === '.') {
6762 parts.splice(i, 1);
6763 } else if (last === '..') {
6764 parts.splice(i, 1);
6765 up++;
6766 } else if (up) {
6767 parts.splice(i, 1);
6768 up--;
6769 }
6770 }
6771
6772 // if the path is allowed to go above the root, restore leading ..s
6773 if (allowAboveRoot) {
6774 for (; up--; up) {
6775 parts.unshift('..');
6776 }
6777 }
6778
6779 return parts;
6780}
6781
6782// path.resolve([from ...], to)
6783// posix version
6784exports.resolve = function() {
6785 var resolvedPath = '',
6786 resolvedAbsolute = false;
6787
6788 for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
6789 var path = (i >= 0) ? arguments[i] : process.cwd();
6790
6791 // Skip empty and invalid entries
6792 if (typeof path !== 'string') {
6793 throw new TypeError('Arguments to path.resolve must be strings');
6794 } else if (!path) {
6795 continue;
6796 }
6797
6798 resolvedPath = path + '/' + resolvedPath;
6799 resolvedAbsolute = path.charAt(0) === '/';
6800 }
6801
6802 // At this point the path should be resolved to a full absolute path, but
6803 // handle relative paths to be safe (might happen when process.cwd() fails)
6804
6805 // Normalize the path
6806 resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
6807 return !!p;
6808 }), !resolvedAbsolute).join('/');
6809
6810 return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
6811};
6812
6813// path.normalize(path)
6814// posix version
6815exports.normalize = function(path) {
6816 var isAbsolute = exports.isAbsolute(path),
6817 trailingSlash = substr(path, -1) === '/';
6818
6819 // Normalize the path
6820 path = normalizeArray(filter(path.split('/'), function(p) {
6821 return !!p;
6822 }), !isAbsolute).join('/');
6823
6824 if (!path && !isAbsolute) {
6825 path = '.';
6826 }
6827 if (path && trailingSlash) {
6828 path += '/';
6829 }
6830
6831 return (isAbsolute ? '/' : '') + path;
6832};
6833
6834// posix version
6835exports.isAbsolute = function(path) {
6836 return path.charAt(0) === '/';
6837};
6838
6839// posix version
6840exports.join = function() {
6841 var paths = Array.prototype.slice.call(arguments, 0);
6842 return exports.normalize(filter(paths, function(p, index) {
6843 if (typeof p !== 'string') {
6844 throw new TypeError('Arguments to path.join must be strings');
6845 }
6846 return p;
6847 }).join('/'));
6848};
6849
6850
6851// path.relative(from, to)
6852// posix version
6853exports.relative = function(from, to) {
6854 from = exports.resolve(from).substr(1);
6855 to = exports.resolve(to).substr(1);
6856
6857 function trim(arr) {
6858 var start = 0;
6859 for (; start < arr.length; start++) {
6860 if (arr[start] !== '') break;
6861 }
6862
6863 var end = arr.length - 1;
6864 for (; end >= 0; end--) {
6865 if (arr[end] !== '') break;
6866 }
6867
6868 if (start > end) return [];
6869 return arr.slice(start, end - start + 1);
6870 }
6871
6872 var fromParts = trim(from.split('/'));
6873 var toParts = trim(to.split('/'));
6874
6875 var length = Math.min(fromParts.length, toParts.length);
6876 var samePartsLength = length;
6877 for (var i = 0; i < length; i++) {
6878 if (fromParts[i] !== toParts[i]) {
6879 samePartsLength = i;
6880 break;
6881 }
6882 }
6883
6884 var outputParts = [];
6885 for (var i = samePartsLength; i < fromParts.length; i++) {
6886 outputParts.push('..');
6887 }
6888
6889 outputParts = outputParts.concat(toParts.slice(samePartsLength));
6890
6891 return outputParts.join('/');
6892};
6893
6894exports.sep = '/';
6895exports.delimiter = ':';
6896
6897exports.dirname = function (path) {
6898 if (typeof path !== 'string') path = path + '';
6899 if (path.length === 0) return '.';
6900 var code = path.charCodeAt(0);
6901 var hasRoot = code === 47 /*/*/;
6902 var end = -1;
6903 var matchedSlash = true;
6904 for (var i = path.length - 1; i >= 1; --i) {
6905 code = path.charCodeAt(i);
6906 if (code === 47 /*/*/) {
6907 if (!matchedSlash) {
6908 end = i;
6909 break;
6910 }
6911 } else {
6912 // We saw the first non-path separator
6913 matchedSlash = false;
6914 }
6915 }
6916
6917 if (end === -1) return hasRoot ? '/' : '.';
6918 if (hasRoot && end === 1) {
6919 // return '//';
6920 // Backwards-compat fix:
6921 return '/';
6922 }
6923 return path.slice(0, end);
6924};
6925
6926function basename(path) {
6927 if (typeof path !== 'string') path = path + '';
6928
6929 var start = 0;
6930 var end = -1;
6931 var matchedSlash = true;
6932 var i;
6933
6934 for (i = path.length - 1; i >= 0; --i) {
6935 if (path.charCodeAt(i) === 47 /*/*/) {
6936 // If we reached a path separator that was not part of a set of path
6937 // separators at the end of the string, stop now
6938 if (!matchedSlash) {
6939 start = i + 1;
6940 break;
6941 }
6942 } else if (end === -1) {
6943 // We saw the first non-path separator, mark this as the end of our
6944 // path component
6945 matchedSlash = false;
6946 end = i + 1;
6947 }
6948 }
6949
6950 if (end === -1) return '';
6951 return path.slice(start, end);
6952}
6953
6954// Uses a mixed approach for backwards-compatibility, as ext behavior changed
6955// in new Node.js versions, so only basename() above is backported here
6956exports.basename = function (path, ext) {
6957 var f = basename(path);
6958 if (ext && f.substr(-1 * ext.length) === ext) {
6959 f = f.substr(0, f.length - ext.length);
6960 }
6961 return f;
6962};
6963
6964exports.extname = function (path) {
6965 if (typeof path !== 'string') path = path + '';
6966 var startDot = -1;
6967 var startPart = 0;
6968 var end = -1;
6969 var matchedSlash = true;
6970 // Track the state of characters (if any) we see before our first dot and
6971 // after any path separator we find
6972 var preDotState = 0;
6973 for (var i = path.length - 1; i >= 0; --i) {
6974 var code = path.charCodeAt(i);
6975 if (code === 47 /*/*/) {
6976 // If we reached a path separator that was not part of a set of path
6977 // separators at the end of the string, stop now
6978 if (!matchedSlash) {
6979 startPart = i + 1;
6980 break;
6981 }
6982 continue;
6983 }
6984 if (end === -1) {
6985 // We saw the first non-path separator, mark this as the end of our
6986 // extension
6987 matchedSlash = false;
6988 end = i + 1;
6989 }
6990 if (code === 46 /*.*/) {
6991 // If this is our first dot, mark it as the start of our extension
6992 if (startDot === -1)
6993 startDot = i;
6994 else if (preDotState !== 1)
6995 preDotState = 1;
6996 } else if (startDot !== -1) {
6997 // We saw a non-dot and non-path separator before our dot, so we should
6998 // have a good chance at having a non-empty extension
6999 preDotState = -1;
7000 }
7001 }
7002
7003 if (startDot === -1 || end === -1 ||
7004 // We saw a non-dot character immediately before the dot
7005 preDotState === 0 ||
7006 // The (right-most) trimmed path component is exactly '..'
7007 preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
7008 return '';
7009 }
7010 return path.slice(startDot, end);
7011};
7012
7013function filter (xs, f) {
7014 if (xs.filter) return xs.filter(f);
7015 var res = [];
7016 for (var i = 0; i < xs.length; i++) {
7017 if (f(xs[i], i, xs)) res.push(xs[i]);
7018 }
7019 return res;
7020}
7021
7022// String.prototype.substr - negative index don't work in IE8
7023var substr = 'ab'.substr(-1) === 'b'
7024 ? function (str, start, len) { return str.substr(start, len) }
7025 : function (str, start, len) {
7026 if (start < 0) start = str.length + start;
7027 return str.substr(start, len);
7028 }
7029;
7030
7031}).call(this,require("KliubH"))
7032},{"KliubH":91}],91:[function(require,module,exports){
7033// shim for using process in browser
7034
7035var process = module.exports = {};
7036
7037process.nextTick = (function () {
7038 var canSetImmediate = typeof window !== 'undefined'
7039 && window.setImmediate;
7040 var canPost = typeof window !== 'undefined'
7041 && window.postMessage && window.addEventListener
7042 ;
7043
7044 if (canSetImmediate) {
7045 return function (f) { return window.setImmediate(f) };
7046 }
7047
7048 if (canPost) {
7049 var queue = [];
7050 window.addEventListener('message', function (ev) {
7051 var source = ev.source;
7052 if ((source === window || source === null) && ev.data === 'process-tick') {
7053 ev.stopPropagation();
7054 if (queue.length > 0) {
7055 var fn = queue.shift();
7056 fn();
7057 }
7058 }
7059 }, true);
7060
7061 return function nextTick(fn) {
7062 queue.push(fn);
7063 window.postMessage('process-tick', '*');
7064 };
7065 }
7066
7067 return function nextTick(fn) {
7068 setTimeout(fn, 0);
7069 };
7070})();
7071
7072process.title = 'browser';
7073process.browser = true;
7074process.env = {};
7075process.argv = [];
7076
7077function noop() {}
7078
7079process.on = noop;
7080process.addListener = noop;
7081process.once = noop;
7082process.off = noop;
7083process.removeListener = noop;
7084process.removeAllListeners = noop;
7085process.emit = noop;
7086
7087process.binding = function (name) {
7088 throw new Error('process.binding is not supported');
7089}
7090
7091// TODO(shtylman)
7092process.cwd = function () { return '/' };
7093process.chdir = function (dir) {
7094 throw new Error('process.chdir is not supported');
7095};
7096
7097},{}],92:[function(require,module,exports){
7098// Copyright Joyent, Inc. and other Node contributors.
7099//
7100// Permission is hereby granted, free of charge, to any person obtaining a
7101// copy of this software and associated documentation files (the
7102// "Software"), to deal in the Software without restriction, including
7103// without limitation the rights to use, copy, modify, merge, publish,
7104// distribute, sublicense, and/or sell copies of the Software, and to permit
7105// persons to whom the Software is furnished to do so, subject to the
7106// following conditions:
7107//
7108// The above copyright notice and this permission notice shall be included
7109// in all copies or substantial portions of the Software.
7110//
7111// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
7112// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
7113// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
7114// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
7115// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
7116// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
7117// USE OR OTHER DEALINGS IN THE SOFTWARE.
7118
7119// a duplex stream is just a stream that is both readable and writable.
7120// Since JS doesn't have multiple prototypal inheritance, this class
7121// prototypally inherits from Readable, and then parasitically from
7122// Writable.
7123
7124module.exports = Duplex;
7125var inherits = require('inherits');
7126var setImmediate = require('process/browser.js').nextTick;
7127var Readable = require('./readable.js');
7128var Writable = require('./writable.js');
7129
7130inherits(Duplex, Readable);
7131
7132Duplex.prototype.write = Writable.prototype.write;
7133Duplex.prototype.end = Writable.prototype.end;
7134Duplex.prototype._write = Writable.prototype._write;
7135
7136function Duplex(options) {
7137 if (!(this instanceof Duplex))
7138 return new Duplex(options);
7139
7140 Readable.call(this, options);
7141 Writable.call(this, options);
7142
7143 if (options && options.readable === false)
7144 this.readable = false;
7145
7146 if (options && options.writable === false)
7147 this.writable = false;
7148
7149 this.allowHalfOpen = true;
7150 if (options && options.allowHalfOpen === false)
7151 this.allowHalfOpen = false;
7152
7153 this.once('end', onend);
7154}
7155
7156// the no-half-open enforcer
7157function onend() {
7158 // if we allow half-open state, or if the writable side ended,
7159 // then we're ok.
7160 if (this.allowHalfOpen || this._writableState.ended)
7161 return;
7162
7163 // no more data can be written.
7164 // But allow more writes to happen in this tick.
7165 var self = this;
7166 setImmediate(function () {
7167 self.end();
7168 });
7169}
7170
7171},{"./readable.js":96,"./writable.js":98,"inherits":89,"process/browser.js":94}],93:[function(require,module,exports){
7172// Copyright Joyent, Inc. and other Node contributors.
7173//
7174// Permission is hereby granted, free of charge, to any person obtaining a
7175// copy of this software and associated documentation files (the
7176// "Software"), to deal in the Software without restriction, including
7177// without limitation the rights to use, copy, modify, merge, publish,
7178// distribute, sublicense, and/or sell copies of the Software, and to permit
7179// persons to whom the Software is furnished to do so, subject to the
7180// following conditions:
7181//
7182// The above copyright notice and this permission notice shall be included
7183// in all copies or substantial portions of the Software.
7184//
7185// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
7186// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
7187// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
7188// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
7189// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
7190// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
7191// USE OR OTHER DEALINGS IN THE SOFTWARE.
7192
7193module.exports = Stream;
7194
7195var EE = require('events').EventEmitter;
7196var inherits = require('inherits');
7197
7198inherits(Stream, EE);
7199Stream.Readable = require('./readable.js');
7200Stream.Writable = require('./writable.js');
7201Stream.Duplex = require('./duplex.js');
7202Stream.Transform = require('./transform.js');
7203Stream.PassThrough = require('./passthrough.js');
7204
7205// Backwards-compat with node 0.4.x
7206Stream.Stream = Stream;
7207
7208
7209
7210// old-style streams. Note that the pipe method (the only relevant
7211// part of this class) is overridden in the Readable class.
7212
7213function Stream() {
7214 EE.call(this);
7215}
7216
7217Stream.prototype.pipe = function(dest, options) {
7218 var source = this;
7219
7220 function ondata(chunk) {
7221 if (dest.writable) {
7222 if (false === dest.write(chunk) && source.pause) {
7223 source.pause();
7224 }
7225 }
7226 }
7227
7228 source.on('data', ondata);
7229
7230 function ondrain() {
7231 if (source.readable && source.resume) {
7232 source.resume();
7233 }
7234 }
7235
7236 dest.on('drain', ondrain);
7237
7238 // If the 'end' option is not supplied, dest.end() will be called when
7239 // source gets the 'end' or 'close' events. Only dest.end() once.
7240 if (!dest._isStdio && (!options || options.end !== false)) {
7241 source.on('end', onend);
7242 source.on('close', onclose);
7243 }
7244
7245 var didOnEnd = false;
7246 function onend() {
7247 if (didOnEnd) return;
7248 didOnEnd = true;
7249
7250 dest.end();
7251 }
7252
7253
7254 function onclose() {
7255 if (didOnEnd) return;
7256 didOnEnd = true;
7257
7258 if (typeof dest.destroy === 'function') dest.destroy();
7259 }
7260
7261 // don't leave dangling pipes when there are errors.
7262 function onerror(er) {
7263 cleanup();
7264 if (EE.listenerCount(this, 'error') === 0) {
7265 throw er; // Unhandled stream error in pipe.
7266 }
7267 }
7268
7269 source.on('error', onerror);
7270 dest.on('error', onerror);
7271
7272 // remove all the event listeners that were added.
7273 function cleanup() {
7274 source.removeListener('data', ondata);
7275 dest.removeListener('drain', ondrain);
7276
7277 source.removeListener('end', onend);
7278 source.removeListener('close', onclose);
7279
7280 source.removeListener('error', onerror);
7281 dest.removeListener('error', onerror);
7282
7283 source.removeListener('end', cleanup);
7284 source.removeListener('close', cleanup);
7285
7286 dest.removeListener('close', cleanup);
7287 }
7288
7289 source.on('end', cleanup);
7290 source.on('close', cleanup);
7291
7292 dest.on('close', cleanup);
7293
7294 dest.emit('pipe', source);
7295
7296 // Allow for unix-like usage: A.pipe(B).pipe(C)
7297 return dest;
7298};
7299
7300},{"./duplex.js":92,"./passthrough.js":95,"./readable.js":96,"./transform.js":97,"./writable.js":98,"events":87,"inherits":89}],94:[function(require,module,exports){
7301// shim for using process in browser
7302
7303var process = module.exports = {};
7304
7305process.nextTick = (function () {
7306 var canSetImmediate = typeof window !== 'undefined'
7307 && window.setImmediate;
7308 var canPost = typeof window !== 'undefined'
7309 && window.postMessage && window.addEventListener
7310 ;
7311
7312 if (canSetImmediate) {
7313 return function (f) { return window.setImmediate(f) };
7314 }
7315
7316 if (canPost) {
7317 var queue = [];
7318 window.addEventListener('message', function (ev) {
7319 var source = ev.source;
7320 if ((source === window || source === null) && ev.data === 'process-tick') {
7321 ev.stopPropagation();
7322 if (queue.length > 0) {
7323 var fn = queue.shift();
7324 fn();
7325 }
7326 }
7327 }, true);
7328
7329 return function nextTick(fn) {
7330 queue.push(fn);
7331 window.postMessage('process-tick', '*');
7332 };
7333 }
7334
7335 return function nextTick(fn) {
7336 setTimeout(fn, 0);
7337 };
7338})();
7339
7340process.title = 'browser';
7341process.browser = true;
7342process.env = {};
7343process.argv = [];
7344
7345process.binding = function (name) {
7346 throw new Error('process.binding is not supported');
7347}
7348
7349// TODO(shtylman)
7350process.cwd = function () { return '/' };
7351process.chdir = function (dir) {
7352 throw new Error('process.chdir is not supported');
7353};
7354
7355},{}],95:[function(require,module,exports){
7356// Copyright Joyent, Inc. and other Node contributors.
7357//
7358// Permission is hereby granted, free of charge, to any person obtaining a
7359// copy of this software and associated documentation files (the
7360// "Software"), to deal in the Software without restriction, including
7361// without limitation the rights to use, copy, modify, merge, publish,
7362// distribute, sublicense, and/or sell copies of the Software, and to permit
7363// persons to whom the Software is furnished to do so, subject to the
7364// following conditions:
7365//
7366// The above copyright notice and this permission notice shall be included
7367// in all copies or substantial portions of the Software.
7368//
7369// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
7370// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
7371// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
7372// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
7373// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
7374// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
7375// USE OR OTHER DEALINGS IN THE SOFTWARE.
7376
7377// a passthrough stream.
7378// basically just the most minimal sort of Transform stream.
7379// Every written chunk gets output as-is.
7380
7381module.exports = PassThrough;
7382
7383var Transform = require('./transform.js');
7384var inherits = require('inherits');
7385inherits(PassThrough, Transform);
7386
7387function PassThrough(options) {
7388 if (!(this instanceof PassThrough))
7389 return new PassThrough(options);
7390
7391 Transform.call(this, options);
7392}
7393
7394PassThrough.prototype._transform = function(chunk, encoding, cb) {
7395 cb(null, chunk);
7396};
7397
7398},{"./transform.js":97,"inherits":89}],96:[function(require,module,exports){
7399(function (process){
7400// Copyright Joyent, Inc. and other Node contributors.
7401//
7402// Permission is hereby granted, free of charge, to any person obtaining a
7403// copy of this software and associated documentation files (the
7404// "Software"), to deal in the Software without restriction, including
7405// without limitation the rights to use, copy, modify, merge, publish,
7406// distribute, sublicense, and/or sell copies of the Software, and to permit
7407// persons to whom the Software is furnished to do so, subject to the
7408// following conditions:
7409//
7410// The above copyright notice and this permission notice shall be included
7411// in all copies or substantial portions of the Software.
7412//
7413// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
7414// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
7415// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
7416// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
7417// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
7418// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
7419// USE OR OTHER DEALINGS IN THE SOFTWARE.
7420
7421module.exports = Readable;
7422Readable.ReadableState = ReadableState;
7423
7424var EE = require('events').EventEmitter;
7425var Stream = require('./index.js');
7426var Buffer = require('buffer').Buffer;
7427var setImmediate = require('process/browser.js').nextTick;
7428var StringDecoder;
7429
7430var inherits = require('inherits');
7431inherits(Readable, Stream);
7432
7433function ReadableState(options, stream) {
7434 options = options || {};
7435
7436 // the point at which it stops calling _read() to fill the buffer
7437 // Note: 0 is a valid value, means "don't call _read preemptively ever"
7438 var hwm = options.highWaterMark;
7439 this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024;
7440
7441 // cast to ints.
7442 this.highWaterMark = ~~this.highWaterMark;
7443
7444 this.buffer = [];
7445 this.length = 0;
7446 this.pipes = null;
7447 this.pipesCount = 0;
7448 this.flowing = false;
7449 this.ended = false;
7450 this.endEmitted = false;
7451 this.reading = false;
7452
7453 // In streams that never have any data, and do push(null) right away,
7454 // the consumer can miss the 'end' event if they do some I/O before
7455 // consuming the stream. So, we don't emit('end') until some reading
7456 // happens.
7457 this.calledRead = false;
7458
7459 // a flag to be able to tell if the onwrite cb is called immediately,
7460 // or on a later tick. We set this to true at first, becuase any
7461 // actions that shouldn't happen until "later" should generally also
7462 // not happen before the first write call.
7463 this.sync = true;
7464
7465 // whenever we return null, then we set a flag to say
7466 // that we're awaiting a 'readable' event emission.
7467 this.needReadable = false;
7468 this.emittedReadable = false;
7469 this.readableListening = false;
7470
7471
7472 // object stream flag. Used to make read(n) ignore n and to
7473 // make all the buffer merging and length checks go away
7474 this.objectMode = !!options.objectMode;
7475
7476 // Crypto is kind of old and crusty. Historically, its default string
7477 // encoding is 'binary' so we have to make this configurable.
7478 // Everything else in the universe uses 'utf8', though.
7479 this.defaultEncoding = options.defaultEncoding || 'utf8';
7480
7481 // when piping, we only care about 'readable' events that happen
7482 // after read()ing all the bytes and not getting any pushback.
7483 this.ranOut = false;
7484
7485 // the number of writers that are awaiting a drain event in .pipe()s
7486 this.awaitDrain = 0;
7487
7488 // if true, a maybeReadMore has been scheduled
7489 this.readingMore = false;
7490
7491 this.decoder = null;
7492 this.encoding = null;
7493 if (options.encoding) {
7494 if (!StringDecoder)
7495 StringDecoder = require('string_decoder').StringDecoder;
7496 this.decoder = new StringDecoder(options.encoding);
7497 this.encoding = options.encoding;
7498 }
7499}
7500
7501function Readable(options) {
7502 if (!(this instanceof Readable))
7503 return new Readable(options);
7504
7505 this._readableState = new ReadableState(options, this);
7506
7507 // legacy
7508 this.readable = true;
7509
7510 Stream.call(this);
7511}
7512
7513// Manually shove something into the read() buffer.
7514// This returns true if the highWaterMark has not been hit yet,
7515// similar to how Writable.write() returns true if you should
7516// write() some more.
7517Readable.prototype.push = function(chunk, encoding) {
7518 var state = this._readableState;
7519
7520 if (typeof chunk === 'string' && !state.objectMode) {
7521 encoding = encoding || state.defaultEncoding;
7522 if (encoding !== state.encoding) {
7523 chunk = new Buffer(chunk, encoding);
7524 encoding = '';
7525 }
7526 }
7527
7528 return readableAddChunk(this, state, chunk, encoding, false);
7529};
7530
7531// Unshift should *always* be something directly out of read()
7532Readable.prototype.unshift = function(chunk) {
7533 var state = this._readableState;
7534 return readableAddChunk(this, state, chunk, '', true);
7535};
7536
7537function readableAddChunk(stream, state, chunk, encoding, addToFront) {
7538 var er = chunkInvalid(state, chunk);
7539 if (er) {
7540 stream.emit('error', er);
7541 } else if (chunk === null || chunk === undefined) {
7542 state.reading = false;
7543 if (!state.ended)
7544 onEofChunk(stream, state);
7545 } else if (state.objectMode || chunk && chunk.length > 0) {
7546 if (state.ended && !addToFront) {
7547 var e = new Error('stream.push() after EOF');
7548 stream.emit('error', e);
7549 } else if (state.endEmitted && addToFront) {
7550 var e = new Error('stream.unshift() after end event');
7551 stream.emit('error', e);
7552 } else {
7553 if (state.decoder && !addToFront && !encoding)
7554 chunk = state.decoder.write(chunk);
7555
7556 // update the buffer info.
7557 state.length += state.objectMode ? 1 : chunk.length;
7558 if (addToFront) {
7559 state.buffer.unshift(chunk);
7560 } else {
7561 state.reading = false;
7562 state.buffer.push(chunk);
7563 }
7564
7565 if (state.needReadable)
7566 emitReadable(stream);
7567
7568 maybeReadMore(stream, state);
7569 }
7570 } else if (!addToFront) {
7571 state.reading = false;
7572 }
7573
7574 return needMoreData(state);
7575}
7576
7577
7578
7579// if it's past the high water mark, we can push in some more.
7580// Also, if we have no data yet, we can stand some
7581// more bytes. This is to work around cases where hwm=0,
7582// such as the repl. Also, if the push() triggered a
7583// readable event, and the user called read(largeNumber) such that
7584// needReadable was set, then we ought to push more, so that another
7585// 'readable' event will be triggered.
7586function needMoreData(state) {
7587 return !state.ended &&
7588 (state.needReadable ||
7589 state.length < state.highWaterMark ||
7590 state.length === 0);
7591}
7592
7593// backwards compatibility.
7594Readable.prototype.setEncoding = function(enc) {
7595 if (!StringDecoder)
7596 StringDecoder = require('string_decoder').StringDecoder;
7597 this._readableState.decoder = new StringDecoder(enc);
7598 this._readableState.encoding = enc;
7599};
7600
7601// Don't raise the hwm > 128MB
7602var MAX_HWM = 0x800000;
7603function roundUpToNextPowerOf2(n) {
7604 if (n >= MAX_HWM) {
7605 n = MAX_HWM;
7606 } else {
7607 // Get the next highest power of 2
7608 n--;
7609 for (var p = 1; p < 32; p <<= 1) n |= n >> p;
7610 n++;
7611 }
7612 return n;
7613}
7614
7615function howMuchToRead(n, state) {
7616 if (state.length === 0 && state.ended)
7617 return 0;
7618
7619 if (state.objectMode)
7620 return n === 0 ? 0 : 1;
7621
7622 if (isNaN(n) || n === null) {
7623 // only flow one buffer at a time
7624 if (state.flowing && state.buffer.length)
7625 return state.buffer[0].length;
7626 else
7627 return state.length;
7628 }
7629
7630 if (n <= 0)
7631 return 0;
7632
7633 // If we're asking for more than the target buffer level,
7634 // then raise the water mark. Bump up to the next highest
7635 // power of 2, to prevent increasing it excessively in tiny
7636 // amounts.
7637 if (n > state.highWaterMark)
7638 state.highWaterMark = roundUpToNextPowerOf2(n);
7639
7640 // don't have that much. return null, unless we've ended.
7641 if (n > state.length) {
7642 if (!state.ended) {
7643 state.needReadable = true;
7644 return 0;
7645 } else
7646 return state.length;
7647 }
7648
7649 return n;
7650}
7651
7652// you can override either this method, or the async _read(n) below.
7653Readable.prototype.read = function(n) {
7654 var state = this._readableState;
7655 state.calledRead = true;
7656 var nOrig = n;
7657
7658 if (typeof n !== 'number' || n > 0)
7659 state.emittedReadable = false;
7660
7661 // if we're doing read(0) to trigger a readable event, but we
7662 // already have a bunch of data in the buffer, then just trigger
7663 // the 'readable' event and move on.
7664 if (n === 0 &&
7665 state.needReadable &&
7666 (state.length >= state.highWaterMark || state.ended)) {
7667 emitReadable(this);
7668 return null;
7669 }
7670
7671 n = howMuchToRead(n, state);
7672
7673 // if we've ended, and we're now clear, then finish it up.
7674 if (n === 0 && state.ended) {
7675 if (state.length === 0)
7676 endReadable(this);
7677 return null;
7678 }
7679
7680 // All the actual chunk generation logic needs to be
7681 // *below* the call to _read. The reason is that in certain
7682 // synthetic stream cases, such as passthrough streams, _read
7683 // may be a completely synchronous operation which may change
7684 // the state of the read buffer, providing enough data when
7685 // before there was *not* enough.
7686 //
7687 // So, the steps are:
7688 // 1. Figure out what the state of things will be after we do
7689 // a read from the buffer.
7690 //
7691 // 2. If that resulting state will trigger a _read, then call _read.
7692 // Note that this may be asynchronous, or synchronous. Yes, it is
7693 // deeply ugly to write APIs this way, but that still doesn't mean
7694 // that the Readable class should behave improperly, as streams are
7695 // designed to be sync/async agnostic.
7696 // Take note if the _read call is sync or async (ie, if the read call
7697 // has returned yet), so that we know whether or not it's safe to emit
7698 // 'readable' etc.
7699 //
7700 // 3. Actually pull the requested chunks out of the buffer and return.
7701
7702 // if we need a readable event, then we need to do some reading.
7703 var doRead = state.needReadable;
7704
7705 // if we currently have less than the highWaterMark, then also read some
7706 if (state.length - n <= state.highWaterMark)
7707 doRead = true;
7708
7709 // however, if we've ended, then there's no point, and if we're already
7710 // reading, then it's unnecessary.
7711 if (state.ended || state.reading)
7712 doRead = false;
7713
7714 if (doRead) {
7715 state.reading = true;
7716 state.sync = true;
7717 // if the length is currently zero, then we *need* a readable event.
7718 if (state.length === 0)
7719 state.needReadable = true;
7720 // call internal read method
7721 this._read(state.highWaterMark);
7722 state.sync = false;
7723 }
7724
7725 // If _read called its callback synchronously, then `reading`
7726 // will be false, and we need to re-evaluate how much data we
7727 // can return to the user.
7728 if (doRead && !state.reading)
7729 n = howMuchToRead(nOrig, state);
7730
7731 var ret;
7732 if (n > 0)
7733 ret = fromList(n, state);
7734 else
7735 ret = null;
7736
7737 if (ret === null) {
7738 state.needReadable = true;
7739 n = 0;
7740 }
7741
7742 state.length -= n;
7743
7744 // If we have nothing in the buffer, then we want to know
7745 // as soon as we *do* get something into the buffer.
7746 if (state.length === 0 && !state.ended)
7747 state.needReadable = true;
7748
7749 // If we happened to read() exactly the remaining amount in the
7750 // buffer, and the EOF has been seen at this point, then make sure
7751 // that we emit 'end' on the very next tick.
7752 if (state.ended && !state.endEmitted && state.length === 0)
7753 endReadable(this);
7754
7755 return ret;
7756};
7757
7758function chunkInvalid(state, chunk) {
7759 var er = null;
7760 if (!Buffer.isBuffer(chunk) &&
7761 'string' !== typeof chunk &&
7762 chunk !== null &&
7763 chunk !== undefined &&
7764 !state.objectMode &&
7765 !er) {
7766 er = new TypeError('Invalid non-string/buffer chunk');
7767 }
7768 return er;
7769}
7770
7771
7772function onEofChunk(stream, state) {
7773 if (state.decoder && !state.ended) {
7774 var chunk = state.decoder.end();
7775 if (chunk && chunk.length) {
7776 state.buffer.push(chunk);
7777 state.length += state.objectMode ? 1 : chunk.length;
7778 }
7779 }
7780 state.ended = true;
7781
7782 // if we've ended and we have some data left, then emit
7783 // 'readable' now to make sure it gets picked up.
7784 if (state.length > 0)
7785 emitReadable(stream);
7786 else
7787 endReadable(stream);
7788}
7789
7790// Don't emit readable right away in sync mode, because this can trigger
7791// another read() call => stack overflow. This way, it might trigger
7792// a nextTick recursion warning, but that's not so bad.
7793function emitReadable(stream) {
7794 var state = stream._readableState;
7795 state.needReadable = false;
7796 if (state.emittedReadable)
7797 return;
7798
7799 state.emittedReadable = true;
7800 if (state.sync)
7801 setImmediate(function() {
7802 emitReadable_(stream);
7803 });
7804 else
7805 emitReadable_(stream);
7806}
7807
7808function emitReadable_(stream) {
7809 stream.emit('readable');
7810}
7811
7812
7813// at this point, the user has presumably seen the 'readable' event,
7814// and called read() to consume some data. that may have triggered
7815// in turn another _read(n) call, in which case reading = true if
7816// it's in progress.
7817// However, if we're not ended, or reading, and the length < hwm,
7818// then go ahead and try to read some more preemptively.
7819function maybeReadMore(stream, state) {
7820 if (!state.readingMore) {
7821 state.readingMore = true;
7822 setImmediate(function() {
7823 maybeReadMore_(stream, state);
7824 });
7825 }
7826}
7827
7828function maybeReadMore_(stream, state) {
7829 var len = state.length;
7830 while (!state.reading && !state.flowing && !state.ended &&
7831 state.length < state.highWaterMark) {
7832 stream.read(0);
7833 if (len === state.length)
7834 // didn't get any data, stop spinning.
7835 break;
7836 else
7837 len = state.length;
7838 }
7839 state.readingMore = false;
7840}
7841
7842// abstract method. to be overridden in specific implementation classes.
7843// call cb(er, data) where data is <= n in length.
7844// for virtual (non-string, non-buffer) streams, "length" is somewhat
7845// arbitrary, and perhaps not very meaningful.
7846Readable.prototype._read = function(n) {
7847 this.emit('error', new Error('not implemented'));
7848};
7849
7850Readable.prototype.pipe = function(dest, pipeOpts) {
7851 var src = this;
7852 var state = this._readableState;
7853
7854 switch (state.pipesCount) {
7855 case 0:
7856 state.pipes = dest;
7857 break;
7858 case 1:
7859 state.pipes = [state.pipes, dest];
7860 break;
7861 default:
7862 state.pipes.push(dest);
7863 break;
7864 }
7865 state.pipesCount += 1;
7866
7867 var doEnd = (!pipeOpts || pipeOpts.end !== false) &&
7868 dest !== process.stdout &&
7869 dest !== process.stderr;
7870
7871 var endFn = doEnd ? onend : cleanup;
7872 if (state.endEmitted)
7873 setImmediate(endFn);
7874 else
7875 src.once('end', endFn);
7876
7877 dest.on('unpipe', onunpipe);
7878 function onunpipe(readable) {
7879 if (readable !== src) return;
7880 cleanup();
7881 }
7882
7883 function onend() {
7884 dest.end();
7885 }
7886
7887 // when the dest drains, it reduces the awaitDrain counter
7888 // on the source. This would be more elegant with a .once()
7889 // handler in flow(), but adding and removing repeatedly is
7890 // too slow.
7891 var ondrain = pipeOnDrain(src);
7892 dest.on('drain', ondrain);
7893
7894 function cleanup() {
7895 // cleanup event handlers once the pipe is broken
7896 dest.removeListener('close', onclose);
7897 dest.removeListener('finish', onfinish);
7898 dest.removeListener('drain', ondrain);
7899 dest.removeListener('error', onerror);
7900 dest.removeListener('unpipe', onunpipe);
7901 src.removeListener('end', onend);
7902 src.removeListener('end', cleanup);
7903
7904 // if the reader is waiting for a drain event from this
7905 // specific writer, then it would cause it to never start
7906 // flowing again.
7907 // So, if this is awaiting a drain, then we just call it now.
7908 // If we don't know, then assume that we are waiting for one.
7909 if (!dest._writableState || dest._writableState.needDrain)
7910 ondrain();
7911 }
7912
7913 // if the dest has an error, then stop piping into it.
7914 // however, don't suppress the throwing behavior for this.
7915 // check for listeners before emit removes one-time listeners.
7916 var errListeners = EE.listenerCount(dest, 'error');
7917 function onerror(er) {
7918 unpipe();
7919 if (errListeners === 0 && EE.listenerCount(dest, 'error') === 0)
7920 dest.emit('error', er);
7921 }
7922 dest.once('error', onerror);
7923
7924 // Both close and finish should trigger unpipe, but only once.
7925 function onclose() {
7926 dest.removeListener('finish', onfinish);
7927 unpipe();
7928 }
7929 dest.once('close', onclose);
7930 function onfinish() {
7931 dest.removeListener('close', onclose);
7932 unpipe();
7933 }
7934 dest.once('finish', onfinish);
7935
7936 function unpipe() {
7937 src.unpipe(dest);
7938 }
7939
7940 // tell the dest that it's being piped to
7941 dest.emit('pipe', src);
7942
7943 // start the flow if it hasn't been started already.
7944 if (!state.flowing) {
7945 // the handler that waits for readable events after all
7946 // the data gets sucked out in flow.
7947 // This would be easier to follow with a .once() handler
7948 // in flow(), but that is too slow.
7949 this.on('readable', pipeOnReadable);
7950
7951 state.flowing = true;
7952 setImmediate(function() {
7953 flow(src);
7954 });
7955 }
7956
7957 return dest;
7958};
7959
7960function pipeOnDrain(src) {
7961 return function() {
7962 var dest = this;
7963 var state = src._readableState;
7964 state.awaitDrain--;
7965 if (state.awaitDrain === 0)
7966 flow(src);
7967 };
7968}
7969
7970function flow(src) {
7971 var state = src._readableState;
7972 var chunk;
7973 state.awaitDrain = 0;
7974
7975 function write(dest, i, list) {
7976 var written = dest.write(chunk);
7977 if (false === written) {
7978 state.awaitDrain++;
7979 }
7980 }
7981
7982 while (state.pipesCount && null !== (chunk = src.read())) {
7983
7984 if (state.pipesCount === 1)
7985 write(state.pipes, 0, null);
7986 else
7987 forEach(state.pipes, write);
7988
7989 src.emit('data', chunk);
7990
7991 // if anyone needs a drain, then we have to wait for that.
7992 if (state.awaitDrain > 0)
7993 return;
7994 }
7995
7996 // if every destination was unpiped, either before entering this
7997 // function, or in the while loop, then stop flowing.
7998 //
7999 // NB: This is a pretty rare edge case.
8000 if (state.pipesCount === 0) {
8001 state.flowing = false;
8002
8003 // if there were data event listeners added, then switch to old mode.
8004 if (EE.listenerCount(src, 'data') > 0)
8005 emitDataEvents(src);
8006 return;
8007 }
8008
8009 // at this point, no one needed a drain, so we just ran out of data
8010 // on the next readable event, start it over again.
8011 state.ranOut = true;
8012}
8013
8014function pipeOnReadable() {
8015 if (this._readableState.ranOut) {
8016 this._readableState.ranOut = false;
8017 flow(this);
8018 }
8019}
8020
8021
8022Readable.prototype.unpipe = function(dest) {
8023 var state = this._readableState;
8024
8025 // if we're not piping anywhere, then do nothing.
8026 if (state.pipesCount === 0)
8027 return this;
8028
8029 // just one destination. most common case.
8030 if (state.pipesCount === 1) {
8031 // passed in one, but it's not the right one.
8032 if (dest && dest !== state.pipes)
8033 return this;
8034
8035 if (!dest)
8036 dest = state.pipes;
8037
8038 // got a match.
8039 state.pipes = null;
8040 state.pipesCount = 0;
8041 this.removeListener('readable', pipeOnReadable);
8042 state.flowing = false;
8043 if (dest)
8044 dest.emit('unpipe', this);
8045 return this;
8046 }
8047
8048 // slow case. multiple pipe destinations.
8049
8050 if (!dest) {
8051 // remove all.
8052 var dests = state.pipes;
8053 var len = state.pipesCount;
8054 state.pipes = null;
8055 state.pipesCount = 0;
8056 this.removeListener('readable', pipeOnReadable);
8057 state.flowing = false;
8058
8059 for (var i = 0; i < len; i++)
8060 dests[i].emit('unpipe', this);
8061 return this;
8062 }
8063
8064 // try to find the right one.
8065 var i = indexOf(state.pipes, dest);
8066 if (i === -1)
8067 return this;
8068
8069 state.pipes.splice(i, 1);
8070 state.pipesCount -= 1;
8071 if (state.pipesCount === 1)
8072 state.pipes = state.pipes[0];
8073
8074 dest.emit('unpipe', this);
8075
8076 return this;
8077};
8078
8079// set up data events if they are asked for
8080// Ensure readable listeners eventually get something
8081Readable.prototype.on = function(ev, fn) {
8082 var res = Stream.prototype.on.call(this, ev, fn);
8083
8084 if (ev === 'data' && !this._readableState.flowing)
8085 emitDataEvents(this);
8086
8087 if (ev === 'readable' && this.readable) {
8088 var state = this._readableState;
8089 if (!state.readableListening) {
8090 state.readableListening = true;
8091 state.emittedReadable = false;
8092 state.needReadable = true;
8093 if (!state.reading) {
8094 this.read(0);
8095 } else if (state.length) {
8096 emitReadable(this, state);
8097 }
8098 }
8099 }
8100
8101 return res;
8102};
8103Readable.prototype.addListener = Readable.prototype.on;
8104
8105// pause() and resume() are remnants of the legacy readable stream API
8106// If the user uses them, then switch into old mode.
8107Readable.prototype.resume = function() {
8108 emitDataEvents(this);
8109 this.read(0);
8110 this.emit('resume');
8111};
8112
8113Readable.prototype.pause = function() {
8114 emitDataEvents(this, true);
8115 this.emit('pause');
8116};
8117
8118function emitDataEvents(stream, startPaused) {
8119 var state = stream._readableState;
8120
8121 if (state.flowing) {
8122 // https://github.com/isaacs/readable-stream/issues/16
8123 throw new Error('Cannot switch to old mode now.');
8124 }
8125
8126 var paused = startPaused || false;
8127 var readable = false;
8128
8129 // convert to an old-style stream.
8130 stream.readable = true;
8131 stream.pipe = Stream.prototype.pipe;
8132 stream.on = stream.addListener = Stream.prototype.on;
8133
8134 stream.on('readable', function() {
8135 readable = true;
8136
8137 var c;
8138 while (!paused && (null !== (c = stream.read())))
8139 stream.emit('data', c);
8140
8141 if (c === null) {
8142 readable = false;
8143 stream._readableState.needReadable = true;
8144 }
8145 });
8146
8147 stream.pause = function() {
8148 paused = true;
8149 this.emit('pause');
8150 };
8151
8152 stream.resume = function() {
8153 paused = false;
8154 if (readable)
8155 setImmediate(function() {
8156 stream.emit('readable');
8157 });
8158 else
8159 this.read(0);
8160 this.emit('resume');
8161 };
8162
8163 // now make it start, just in case it hadn't already.
8164 stream.emit('readable');
8165}
8166
8167// wrap an old-style stream as the async data source.
8168// This is *not* part of the readable stream interface.
8169// It is an ugly unfortunate mess of history.
8170Readable.prototype.wrap = function(stream) {
8171 var state = this._readableState;
8172 var paused = false;
8173
8174 var self = this;
8175 stream.on('end', function() {
8176 if (state.decoder && !state.ended) {
8177 var chunk = state.decoder.end();
8178 if (chunk && chunk.length)
8179 self.push(chunk);
8180 }
8181
8182 self.push(null);
8183 });
8184
8185 stream.on('data', function(chunk) {
8186 if (state.decoder)
8187 chunk = state.decoder.write(chunk);
8188 if (!chunk || !state.objectMode && !chunk.length)
8189 return;
8190
8191 var ret = self.push(chunk);
8192 if (!ret) {
8193 paused = true;
8194 stream.pause();
8195 }
8196 });
8197
8198 // proxy all the other methods.
8199 // important when wrapping filters and duplexes.
8200 for (var i in stream) {
8201 if (typeof stream[i] === 'function' &&
8202 typeof this[i] === 'undefined') {
8203 this[i] = function(method) { return function() {
8204 return stream[method].apply(stream, arguments);
8205 }}(i);
8206 }
8207 }
8208
8209 // proxy certain important events.
8210 var events = ['error', 'close', 'destroy', 'pause', 'resume'];
8211 forEach(events, function(ev) {
8212 stream.on(ev, function (x) {
8213 return self.emit.apply(self, ev, x);
8214 });
8215 });
8216
8217 // when we try to consume some more bytes, simply unpause the
8218 // underlying stream.
8219 self._read = function(n) {
8220 if (paused) {
8221 paused = false;
8222 stream.resume();
8223 }
8224 };
8225
8226 return self;
8227};
8228
8229
8230
8231// exposed for testing purposes only.
8232Readable._fromList = fromList;
8233
8234// Pluck off n bytes from an array of buffers.
8235// Length is the combined lengths of all the buffers in the list.
8236function fromList(n, state) {
8237 var list = state.buffer;
8238 var length = state.length;
8239 var stringMode = !!state.decoder;
8240 var objectMode = !!state.objectMode;
8241 var ret;
8242
8243 // nothing in the list, definitely empty.
8244 if (list.length === 0)
8245 return null;
8246
8247 if (length === 0)
8248 ret = null;
8249 else if (objectMode)
8250 ret = list.shift();
8251 else if (!n || n >= length) {
8252 // read it all, truncate the array.
8253 if (stringMode)
8254 ret = list.join('');
8255 else
8256 ret = Buffer.concat(list, length);
8257 list.length = 0;
8258 } else {
8259 // read just some of it.
8260 if (n < list[0].length) {
8261 // just take a part of the first list item.
8262 // slice is the same for buffers and strings.
8263 var buf = list[0];
8264 ret = buf.slice(0, n);
8265 list[0] = buf.slice(n);
8266 } else if (n === list[0].length) {
8267 // first list is a perfect match
8268 ret = list.shift();
8269 } else {
8270 // complex case.
8271 // we have enough to cover it, but it spans past the first buffer.
8272 if (stringMode)
8273 ret = '';
8274 else
8275 ret = new Buffer(n);
8276
8277 var c = 0;
8278 for (var i = 0, l = list.length; i < l && c < n; i++) {
8279 var buf = list[0];
8280 var cpy = Math.min(n - c, buf.length);
8281
8282 if (stringMode)
8283 ret += buf.slice(0, cpy);
8284 else
8285 buf.copy(ret, c, 0, cpy);
8286
8287 if (cpy < buf.length)
8288 list[0] = buf.slice(cpy);
8289 else
8290 list.shift();
8291
8292 c += cpy;
8293 }
8294 }
8295 }
8296
8297 return ret;
8298}
8299
8300function endReadable(stream) {
8301 var state = stream._readableState;
8302
8303 // If we get here before consuming all the bytes, then that is a
8304 // bug in node. Should never happen.
8305 if (state.length > 0)
8306 throw new Error('endReadable called on non-empty stream');
8307
8308 if (!state.endEmitted && state.calledRead) {
8309 state.ended = true;
8310 setImmediate(function() {
8311 // Check that we didn't get one last unshift.
8312 if (!state.endEmitted && state.length === 0) {
8313 state.endEmitted = true;
8314 stream.readable = false;
8315 stream.emit('end');
8316 }
8317 });
8318 }
8319}
8320
8321function forEach (xs, f) {
8322 for (var i = 0, l = xs.length; i < l; i++) {
8323 f(xs[i], i);
8324 }
8325}
8326
8327function indexOf (xs, x) {
8328 for (var i = 0, l = xs.length; i < l; i++) {
8329 if (xs[i] === x) return i;
8330 }
8331 return -1;
8332}
8333
8334}).call(this,require("KliubH"))
8335},{"./index.js":93,"KliubH":91,"buffer":86,"events":87,"inherits":89,"process/browser.js":94,"string_decoder":99}],97:[function(require,module,exports){
8336// Copyright Joyent, Inc. and other Node contributors.
8337//
8338// Permission is hereby granted, free of charge, to any person obtaining a
8339// copy of this software and associated documentation files (the
8340// "Software"), to deal in the Software without restriction, including
8341// without limitation the rights to use, copy, modify, merge, publish,
8342// distribute, sublicense, and/or sell copies of the Software, and to permit
8343// persons to whom the Software is furnished to do so, subject to the
8344// following conditions:
8345//
8346// The above copyright notice and this permission notice shall be included
8347// in all copies or substantial portions of the Software.
8348//
8349// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
8350// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
8351// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
8352// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
8353// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
8354// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
8355// USE OR OTHER DEALINGS IN THE SOFTWARE.
8356
8357// a transform stream is a readable/writable stream where you do
8358// something with the data. Sometimes it's called a "filter",
8359// but that's not a great name for it, since that implies a thing where
8360// some bits pass through, and others are simply ignored. (That would
8361// be a valid example of a transform, of course.)
8362//
8363// While the output is causally related to the input, it's not a
8364// necessarily symmetric or synchronous transformation. For example,
8365// a zlib stream might take multiple plain-text writes(), and then
8366// emit a single compressed chunk some time in the future.
8367//
8368// Here's how this works:
8369//
8370// The Transform stream has all the aspects of the readable and writable
8371// stream classes. When you write(chunk), that calls _write(chunk,cb)
8372// internally, and returns false if there's a lot of pending writes
8373// buffered up. When you call read(), that calls _read(n) until
8374// there's enough pending readable data buffered up.
8375//
8376// In a transform stream, the written data is placed in a buffer. When
8377// _read(n) is called, it transforms the queued up data, calling the
8378// buffered _write cb's as it consumes chunks. If consuming a single
8379// written chunk would result in multiple output chunks, then the first
8380// outputted bit calls the readcb, and subsequent chunks just go into
8381// the read buffer, and will cause it to emit 'readable' if necessary.
8382//
8383// This way, back-pressure is actually determined by the reading side,
8384// since _read has to be called to start processing a new chunk. However,
8385// a pathological inflate type of transform can cause excessive buffering
8386// here. For example, imagine a stream where every byte of input is
8387// interpreted as an integer from 0-255, and then results in that many
8388// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
8389// 1kb of data being output. In this case, you could write a very small
8390// amount of input, and end up with a very large amount of output. In
8391// such a pathological inflating mechanism, there'd be no way to tell
8392// the system to stop doing the transform. A single 4MB write could
8393// cause the system to run out of memory.
8394//
8395// However, even in such a pathological case, only a single written chunk
8396// would be consumed, and then the rest would wait (un-transformed) until
8397// the results of the previous transformed chunk were consumed.
8398
8399module.exports = Transform;
8400
8401var Duplex = require('./duplex.js');
8402var inherits = require('inherits');
8403inherits(Transform, Duplex);
8404
8405
8406function TransformState(options, stream) {
8407 this.afterTransform = function(er, data) {
8408 return afterTransform(stream, er, data);
8409 };
8410
8411 this.needTransform = false;
8412 this.transforming = false;
8413 this.writecb = null;
8414 this.writechunk = null;
8415}
8416
8417function afterTransform(stream, er, data) {
8418 var ts = stream._transformState;
8419 ts.transforming = false;
8420
8421 var cb = ts.writecb;
8422
8423 if (!cb)
8424 return stream.emit('error', new Error('no writecb in Transform class'));
8425
8426 ts.writechunk = null;
8427 ts.writecb = null;
8428
8429 if (data !== null && data !== undefined)
8430 stream.push(data);
8431
8432 if (cb)
8433 cb(er);
8434
8435 var rs = stream._readableState;
8436 rs.reading = false;
8437 if (rs.needReadable || rs.length < rs.highWaterMark) {
8438 stream._read(rs.highWaterMark);
8439 }
8440}
8441
8442
8443function Transform(options) {
8444 if (!(this instanceof Transform))
8445 return new Transform(options);
8446
8447 Duplex.call(this, options);
8448
8449 var ts = this._transformState = new TransformState(options, this);
8450
8451 // when the writable side finishes, then flush out anything remaining.
8452 var stream = this;
8453
8454 // start out asking for a readable event once data is transformed.
8455 this._readableState.needReadable = true;
8456
8457 // we have implemented the _read method, and done the other things
8458 // that Readable wants before the first _read call, so unset the
8459 // sync guard flag.
8460 this._readableState.sync = false;
8461
8462 this.once('finish', function() {
8463 if ('function' === typeof this._flush)
8464 this._flush(function(er) {
8465 done(stream, er);
8466 });
8467 else
8468 done(stream);
8469 });
8470}
8471
8472Transform.prototype.push = function(chunk, encoding) {
8473 this._transformState.needTransform = false;
8474 return Duplex.prototype.push.call(this, chunk, encoding);
8475};
8476
8477// This is the part where you do stuff!
8478// override this function in implementation classes.
8479// 'chunk' is an input chunk.
8480//
8481// Call `push(newChunk)` to pass along transformed output
8482// to the readable side. You may call 'push' zero or more times.
8483//
8484// Call `cb(err)` when you are done with this chunk. If you pass
8485// an error, then that'll put the hurt on the whole operation. If you
8486// never call cb(), then you'll never get another chunk.
8487Transform.prototype._transform = function(chunk, encoding, cb) {
8488 throw new Error('not implemented');
8489};
8490
8491Transform.prototype._write = function(chunk, encoding, cb) {
8492 var ts = this._transformState;
8493 ts.writecb = cb;
8494 ts.writechunk = chunk;
8495 ts.writeencoding = encoding;
8496 if (!ts.transforming) {
8497 var rs = this._readableState;
8498 if (ts.needTransform ||
8499 rs.needReadable ||
8500 rs.length < rs.highWaterMark)
8501 this._read(rs.highWaterMark);
8502 }
8503};
8504
8505// Doesn't matter what the args are here.
8506// _transform does all the work.
8507// That we got here means that the readable side wants more data.
8508Transform.prototype._read = function(n) {
8509 var ts = this._transformState;
8510
8511 if (ts.writechunk && ts.writecb && !ts.transforming) {
8512 ts.transforming = true;
8513 this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
8514 } else {
8515 // mark that we need a transform, so that any data that comes in
8516 // will get processed, now that we've asked for it.
8517 ts.needTransform = true;
8518 }
8519};
8520
8521
8522function done(stream, er) {
8523 if (er)
8524 return stream.emit('error', er);
8525
8526 // if there's nothing in the write buffer, then that means
8527 // that nothing more will ever be provided
8528 var ws = stream._writableState;
8529 var rs = stream._readableState;
8530 var ts = stream._transformState;
8531
8532 if (ws.length)
8533 throw new Error('calling transform done when ws.length != 0');
8534
8535 if (ts.transforming)
8536 throw new Error('calling transform done when still transforming');
8537
8538 return stream.push(null);
8539}
8540
8541},{"./duplex.js":92,"inherits":89}],98:[function(require,module,exports){
8542// Copyright Joyent, Inc. and other Node contributors.
8543//
8544// Permission is hereby granted, free of charge, to any person obtaining a
8545// copy of this software and associated documentation files (the
8546// "Software"), to deal in the Software without restriction, including
8547// without limitation the rights to use, copy, modify, merge, publish,
8548// distribute, sublicense, and/or sell copies of the Software, and to permit
8549// persons to whom the Software is furnished to do so, subject to the
8550// following conditions:
8551//
8552// The above copyright notice and this permission notice shall be included
8553// in all copies or substantial portions of the Software.
8554//
8555// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
8556// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
8557// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
8558// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
8559// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
8560// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
8561// USE OR OTHER DEALINGS IN THE SOFTWARE.
8562
8563// A bit simpler than readable streams.
8564// Implement an async ._write(chunk, cb), and it'll handle all
8565// the drain event emission and buffering.
8566
8567module.exports = Writable;
8568Writable.WritableState = WritableState;
8569
8570var isUint8Array = typeof Uint8Array !== 'undefined'
8571 ? function (x) { return x instanceof Uint8Array }
8572 : function (x) {
8573 return x && x.constructor && x.constructor.name === 'Uint8Array'
8574 }
8575;
8576var isArrayBuffer = typeof ArrayBuffer !== 'undefined'
8577 ? function (x) { return x instanceof ArrayBuffer }
8578 : function (x) {
8579 return x && x.constructor && x.constructor.name === 'ArrayBuffer'
8580 }
8581;
8582
8583var inherits = require('inherits');
8584var Stream = require('./index.js');
8585var setImmediate = require('process/browser.js').nextTick;
8586var Buffer = require('buffer').Buffer;
8587
8588inherits(Writable, Stream);
8589
8590function WriteReq(chunk, encoding, cb) {
8591 this.chunk = chunk;
8592 this.encoding = encoding;
8593 this.callback = cb;
8594}
8595
8596function WritableState(options, stream) {
8597 options = options || {};
8598
8599 // the point at which write() starts returning false
8600 // Note: 0 is a valid value, means that we always return false if
8601 // the entire buffer is not flushed immediately on write()
8602 var hwm = options.highWaterMark;
8603 this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024;
8604
8605 // object stream flag to indicate whether or not this stream
8606 // contains buffers or objects.
8607 this.objectMode = !!options.objectMode;
8608
8609 // cast to ints.
8610 this.highWaterMark = ~~this.highWaterMark;
8611
8612 this.needDrain = false;
8613 // at the start of calling end()
8614 this.ending = false;
8615 // when end() has been called, and returned
8616 this.ended = false;
8617 // when 'finish' is emitted
8618 this.finished = false;
8619
8620 // should we decode strings into buffers before passing to _write?
8621 // this is here so that some node-core streams can optimize string
8622 // handling at a lower level.
8623 var noDecode = options.decodeStrings === false;
8624 this.decodeStrings = !noDecode;
8625
8626 // Crypto is kind of old and crusty. Historically, its default string
8627 // encoding is 'binary' so we have to make this configurable.
8628 // Everything else in the universe uses 'utf8', though.
8629 this.defaultEncoding = options.defaultEncoding || 'utf8';
8630
8631 // not an actual buffer we keep track of, but a measurement
8632 // of how much we're waiting to get pushed to some underlying
8633 // socket or file.
8634 this.length = 0;
8635
8636 // a flag to see when we're in the middle of a write.
8637 this.writing = false;
8638
8639 // a flag to be able to tell if the onwrite cb is called immediately,
8640 // or on a later tick. We set this to true at first, becuase any
8641 // actions that shouldn't happen until "later" should generally also
8642 // not happen before the first write call.
8643 this.sync = true;
8644
8645 // a flag to know if we're processing previously buffered items, which
8646 // may call the _write() callback in the same tick, so that we don't
8647 // end up in an overlapped onwrite situation.
8648 this.bufferProcessing = false;
8649
8650 // the callback that's passed to _write(chunk,cb)
8651 this.onwrite = function(er) {
8652 onwrite(stream, er);
8653 };
8654
8655 // the callback that the user supplies to write(chunk,encoding,cb)
8656 this.writecb = null;
8657
8658 // the amount that is being written when _write is called.
8659 this.writelen = 0;
8660
8661 this.buffer = [];
8662}
8663
8664function Writable(options) {
8665 // Writable ctor is applied to Duplexes, though they're not
8666 // instanceof Writable, they're instanceof Readable.
8667 if (!(this instanceof Writable) && !(this instanceof Stream.Duplex))
8668 return new Writable(options);
8669
8670 this._writableState = new WritableState(options, this);
8671
8672 // legacy.
8673 this.writable = true;
8674
8675 Stream.call(this);
8676}
8677
8678// Otherwise people can pipe Writable streams, which is just wrong.
8679Writable.prototype.pipe = function() {
8680 this.emit('error', new Error('Cannot pipe. Not readable.'));
8681};
8682
8683
8684function writeAfterEnd(stream, state, cb) {
8685 var er = new Error('write after end');
8686 // TODO: defer error events consistently everywhere, not just the cb
8687 stream.emit('error', er);
8688 setImmediate(function() {
8689 cb(er);
8690 });
8691}
8692
8693// If we get something that is not a buffer, string, null, or undefined,
8694// and we're not in objectMode, then that's an error.
8695// Otherwise stream chunks are all considered to be of length=1, and the
8696// watermarks determine how many objects to keep in the buffer, rather than
8697// how many bytes or characters.
8698function validChunk(stream, state, chunk, cb) {
8699 var valid = true;
8700 if (!Buffer.isBuffer(chunk) &&
8701 'string' !== typeof chunk &&
8702 chunk !== null &&
8703 chunk !== undefined &&
8704 !state.objectMode) {
8705 var er = new TypeError('Invalid non-string/buffer chunk');
8706 stream.emit('error', er);
8707 setImmediate(function() {
8708 cb(er);
8709 });
8710 valid = false;
8711 }
8712 return valid;
8713}
8714
8715Writable.prototype.write = function(chunk, encoding, cb) {
8716 var state = this._writableState;
8717 var ret = false;
8718
8719 if (typeof encoding === 'function') {
8720 cb = encoding;
8721 encoding = null;
8722 }
8723
8724 if (!Buffer.isBuffer(chunk) && isUint8Array(chunk))
8725 chunk = new Buffer(chunk);
8726 if (isArrayBuffer(chunk) && typeof Uint8Array !== 'undefined')
8727 chunk = new Buffer(new Uint8Array(chunk));
8728
8729 if (Buffer.isBuffer(chunk))
8730 encoding = 'buffer';
8731 else if (!encoding)
8732 encoding = state.defaultEncoding;
8733
8734 if (typeof cb !== 'function')
8735 cb = function() {};
8736
8737 if (state.ended)
8738 writeAfterEnd(this, state, cb);
8739 else if (validChunk(this, state, chunk, cb))
8740 ret = writeOrBuffer(this, state, chunk, encoding, cb);
8741
8742 return ret;
8743};
8744
8745function decodeChunk(state, chunk, encoding) {
8746 if (!state.objectMode &&
8747 state.decodeStrings !== false &&
8748 typeof chunk === 'string') {
8749 chunk = new Buffer(chunk, encoding);
8750 }
8751 return chunk;
8752}
8753
8754// if we're already writing something, then just put this
8755// in the queue, and wait our turn. Otherwise, call _write
8756// If we return false, then we need a drain event, so set that flag.
8757function writeOrBuffer(stream, state, chunk, encoding, cb) {
8758 chunk = decodeChunk(state, chunk, encoding);
8759 var len = state.objectMode ? 1 : chunk.length;
8760
8761 state.length += len;
8762
8763 var ret = state.length < state.highWaterMark;
8764 state.needDrain = !ret;
8765
8766 if (state.writing)
8767 state.buffer.push(new WriteReq(chunk, encoding, cb));
8768 else
8769 doWrite(stream, state, len, chunk, encoding, cb);
8770
8771 return ret;
8772}
8773
8774function doWrite(stream, state, len, chunk, encoding, cb) {
8775 state.writelen = len;
8776 state.writecb = cb;
8777 state.writing = true;
8778 state.sync = true;
8779 stream._write(chunk, encoding, state.onwrite);
8780 state.sync = false;
8781}
8782
8783function onwriteError(stream, state, sync, er, cb) {
8784 if (sync)
8785 setImmediate(function() {
8786 cb(er);
8787 });
8788 else
8789 cb(er);
8790
8791 stream.emit('error', er);
8792}
8793
8794function onwriteStateUpdate(state) {
8795 state.writing = false;
8796 state.writecb = null;
8797 state.length -= state.writelen;
8798 state.writelen = 0;
8799}
8800
8801function onwrite(stream, er) {
8802 var state = stream._writableState;
8803 var sync = state.sync;
8804 var cb = state.writecb;
8805
8806 onwriteStateUpdate(state);
8807
8808 if (er)
8809 onwriteError(stream, state, sync, er, cb);
8810 else {
8811 // Check if we're actually ready to finish, but don't emit yet
8812 var finished = needFinish(stream, state);
8813
8814 if (!finished && !state.bufferProcessing && state.buffer.length)
8815 clearBuffer(stream, state);
8816
8817 if (sync) {
8818 setImmediate(function() {
8819 afterWrite(stream, state, finished, cb);
8820 });
8821 } else {
8822 afterWrite(stream, state, finished, cb);
8823 }
8824 }
8825}
8826
8827function afterWrite(stream, state, finished, cb) {
8828 if (!finished)
8829 onwriteDrain(stream, state);
8830 cb();
8831 if (finished)
8832 finishMaybe(stream, state);
8833}
8834
8835// Must force callback to be called on nextTick, so that we don't
8836// emit 'drain' before the write() consumer gets the 'false' return
8837// value, and has a chance to attach a 'drain' listener.
8838function onwriteDrain(stream, state) {
8839 if (state.length === 0 && state.needDrain) {
8840 state.needDrain = false;
8841 stream.emit('drain');
8842 }
8843}
8844
8845
8846// if there's something in the buffer waiting, then process it
8847function clearBuffer(stream, state) {
8848 state.bufferProcessing = true;
8849
8850 for (var c = 0; c < state.buffer.length; c++) {
8851 var entry = state.buffer[c];
8852 var chunk = entry.chunk;
8853 var encoding = entry.encoding;
8854 var cb = entry.callback;
8855 var len = state.objectMode ? 1 : chunk.length;
8856
8857 doWrite(stream, state, len, chunk, encoding, cb);
8858
8859 // if we didn't call the onwrite immediately, then
8860 // it means that we need to wait until it does.
8861 // also, that means that the chunk and cb are currently
8862 // being processed, so move the buffer counter past them.
8863 if (state.writing) {
8864 c++;
8865 break;
8866 }
8867 }
8868
8869 state.bufferProcessing = false;
8870 if (c < state.buffer.length)
8871 state.buffer = state.buffer.slice(c);
8872 else
8873 state.buffer.length = 0;
8874}
8875
8876Writable.prototype._write = function(chunk, encoding, cb) {
8877 cb(new Error('not implemented'));
8878};
8879
8880Writable.prototype.end = function(chunk, encoding, cb) {
8881 var state = this._writableState;
8882
8883 if (typeof chunk === 'function') {
8884 cb = chunk;
8885 chunk = null;
8886 encoding = null;
8887 } else if (typeof encoding === 'function') {
8888 cb = encoding;
8889 encoding = null;
8890 }
8891
8892 if (typeof chunk !== 'undefined' && chunk !== null)
8893 this.write(chunk, encoding);
8894
8895 // ignore unnecessary end() calls.
8896 if (!state.ending && !state.finished)
8897 endWritable(this, state, cb);
8898};
8899
8900
8901function needFinish(stream, state) {
8902 return (state.ending &&
8903 state.length === 0 &&
8904 !state.finished &&
8905 !state.writing);
8906}
8907
8908function finishMaybe(stream, state) {
8909 var need = needFinish(stream, state);
8910 if (need) {
8911 state.finished = true;
8912 stream.emit('finish');
8913 }
8914 return need;
8915}
8916
8917function endWritable(stream, state, cb) {
8918 state.ending = true;
8919 finishMaybe(stream, state);
8920 if (cb) {
8921 if (state.finished)
8922 setImmediate(cb);
8923 else
8924 stream.once('finish', cb);
8925 }
8926 state.ended = true;
8927}
8928
8929},{"./index.js":93,"buffer":86,"inherits":89,"process/browser.js":94}],99:[function(require,module,exports){
8930// Copyright Joyent, Inc. and other Node contributors.
8931//
8932// Permission is hereby granted, free of charge, to any person obtaining a
8933// copy of this software and associated documentation files (the
8934// "Software"), to deal in the Software without restriction, including
8935// without limitation the rights to use, copy, modify, merge, publish,
8936// distribute, sublicense, and/or sell copies of the Software, and to permit
8937// persons to whom the Software is furnished to do so, subject to the
8938// following conditions:
8939//
8940// The above copyright notice and this permission notice shall be included
8941// in all copies or substantial portions of the Software.
8942//
8943// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
8944// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
8945// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
8946// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
8947// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
8948// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
8949// USE OR OTHER DEALINGS IN THE SOFTWARE.
8950
8951var Buffer = require('buffer').Buffer;
8952
8953function assertEncoding(encoding) {
8954 if (encoding && !Buffer.isEncoding(encoding)) {
8955 throw new Error('Unknown encoding: ' + encoding);
8956 }
8957}
8958
8959var StringDecoder = exports.StringDecoder = function(encoding) {
8960 this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');
8961 assertEncoding(encoding);
8962 switch (this.encoding) {
8963 case 'utf8':
8964 // CESU-8 represents each of Surrogate Pair by 3-bytes
8965 this.surrogateSize = 3;
8966 break;
8967 case 'ucs2':
8968 case 'utf16le':
8969 // UTF-16 represents each of Surrogate Pair by 2-bytes
8970 this.surrogateSize = 2;
8971 this.detectIncompleteChar = utf16DetectIncompleteChar;
8972 break;
8973 case 'base64':
8974 // Base-64 stores 3 bytes in 4 chars, and pads the remainder.
8975 this.surrogateSize = 3;
8976 this.detectIncompleteChar = base64DetectIncompleteChar;
8977 break;
8978 default:
8979 this.write = passThroughWrite;
8980 return;
8981 }
8982
8983 this.charBuffer = new Buffer(6);
8984 this.charReceived = 0;
8985 this.charLength = 0;
8986};
8987
8988
8989StringDecoder.prototype.write = function(buffer) {
8990 var charStr = '';
8991 var offset = 0;
8992
8993 // if our last write ended with an incomplete multibyte character
8994 while (this.charLength) {
8995 // determine how many remaining bytes this buffer has to offer for this char
8996 var i = (buffer.length >= this.charLength - this.charReceived) ?
8997 this.charLength - this.charReceived :
8998 buffer.length;
8999
9000 // add the new bytes to the char buffer
9001 buffer.copy(this.charBuffer, this.charReceived, offset, i);
9002 this.charReceived += (i - offset);
9003 offset = i;
9004
9005 if (this.charReceived < this.charLength) {
9006 // still not enough chars in this buffer? wait for more ...
9007 return '';
9008 }
9009
9010 // get the character that was split
9011 charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);
9012
9013 // lead surrogate (D800-DBFF) is also the incomplete character
9014 var charCode = charStr.charCodeAt(charStr.length - 1);
9015 if (charCode >= 0xD800 && charCode <= 0xDBFF) {
9016 this.charLength += this.surrogateSize;
9017 charStr = '';
9018 continue;
9019 }
9020 this.charReceived = this.charLength = 0;
9021
9022 // if there are no more bytes in this buffer, just emit our char
9023 if (i == buffer.length) return charStr;
9024
9025 // otherwise cut off the characters end from the beginning of this buffer
9026 buffer = buffer.slice(i, buffer.length);
9027 break;
9028 }
9029
9030 var lenIncomplete = this.detectIncompleteChar(buffer);
9031
9032 var end = buffer.length;
9033 if (this.charLength) {
9034 // buffer the incomplete character bytes we got
9035 buffer.copy(this.charBuffer, 0, buffer.length - lenIncomplete, end);
9036 this.charReceived = lenIncomplete;
9037 end -= lenIncomplete;
9038 }
9039
9040 charStr += buffer.toString(this.encoding, 0, end);
9041
9042 var end = charStr.length - 1;
9043 var charCode = charStr.charCodeAt(end);
9044 // lead surrogate (D800-DBFF) is also the incomplete character
9045 if (charCode >= 0xD800 && charCode <= 0xDBFF) {
9046 var size = this.surrogateSize;
9047 this.charLength += size;
9048 this.charReceived += size;
9049 this.charBuffer.copy(this.charBuffer, size, 0, size);
9050 this.charBuffer.write(charStr.charAt(charStr.length - 1), this.encoding);
9051 return charStr.substring(0, end);
9052 }
9053
9054 // or just emit the charStr
9055 return charStr;
9056};
9057
9058StringDecoder.prototype.detectIncompleteChar = function(buffer) {
9059 // determine how many bytes we have to check at the end of this buffer
9060 var i = (buffer.length >= 3) ? 3 : buffer.length;
9061
9062 // Figure out if one of the last i bytes of our buffer announces an
9063 // incomplete char.
9064 for (; i > 0; i--) {
9065 var c = buffer[buffer.length - i];
9066
9067 // See http://en.wikipedia.org/wiki/UTF-8#Description
9068
9069 // 110XXXXX
9070 if (i == 1 && c >> 5 == 0x06) {
9071 this.charLength = 2;
9072 break;
9073 }
9074
9075 // 1110XXXX
9076 if (i <= 2 && c >> 4 == 0x0E) {
9077 this.charLength = 3;
9078 break;
9079 }
9080
9081 // 11110XXX
9082 if (i <= 3 && c >> 3 == 0x1E) {
9083 this.charLength = 4;
9084 break;
9085 }
9086 }
9087
9088 return i;
9089};
9090
9091StringDecoder.prototype.end = function(buffer) {
9092 var res = '';
9093 if (buffer && buffer.length)
9094 res = this.write(buffer);
9095
9096 if (this.charReceived) {
9097 var cr = this.charReceived;
9098 var buf = this.charBuffer;
9099 var enc = this.encoding;
9100 res += buf.slice(0, cr).toString(enc);
9101 }
9102
9103 return res;
9104};
9105
9106function passThroughWrite(buffer) {
9107 return buffer.toString(this.encoding);
9108}
9109
9110function utf16DetectIncompleteChar(buffer) {
9111 var incomplete = this.charReceived = buffer.length % 2;
9112 this.charLength = incomplete ? 2 : 0;
9113 return incomplete;
9114}
9115
9116function base64DetectIncompleteChar(buffer) {
9117 var incomplete = this.charReceived = buffer.length % 3;
9118 this.charLength = incomplete ? 3 : 0;
9119 return incomplete;
9120}
9121
9122},{"buffer":86}],100:[function(require,module,exports){
9123if (typeof Object.create === 'function') {
9124 // implementation from standard node.js 'util' module
9125 module.exports = function inherits(ctor, superCtor) {
9126 ctor.super_ = superCtor
9127 ctor.prototype = Object.create(superCtor.prototype, {
9128 constructor: {
9129 value: ctor,
9130 enumerable: false,
9131 writable: true,
9132 configurable: true
9133 }
9134 });
9135 };
9136} else {
9137 // old school shim for old browsers
9138 module.exports = function inherits(ctor, superCtor) {
9139 ctor.super_ = superCtor
9140 var TempCtor = function () {}
9141 TempCtor.prototype = superCtor.prototype
9142 ctor.prototype = new TempCtor()
9143 ctor.prototype.constructor = ctor
9144 }
9145}
9146
9147},{}],101:[function(require,module,exports){
9148module.exports = function isBuffer(arg) {
9149 return arg && typeof arg === 'object'
9150 && typeof arg.copy === 'function'
9151 && typeof arg.fill === 'function'
9152 && typeof arg.readUInt8 === 'function';
9153}
9154},{}],102:[function(require,module,exports){
9155(function (process,global){
9156// Copyright Joyent, Inc. and other Node contributors.
9157//
9158// Permission is hereby granted, free of charge, to any person obtaining a
9159// copy of this software and associated documentation files (the
9160// "Software"), to deal in the Software without restriction, including
9161// without limitation the rights to use, copy, modify, merge, publish,
9162// distribute, sublicense, and/or sell copies of the Software, and to permit
9163// persons to whom the Software is furnished to do so, subject to the
9164// following conditions:
9165//
9166// The above copyright notice and this permission notice shall be included
9167// in all copies or substantial portions of the Software.
9168//
9169// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
9170// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
9171// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
9172// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
9173// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
9174// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
9175// USE OR OTHER DEALINGS IN THE SOFTWARE.
9176
9177var formatRegExp = /%[sdj%]/g;
9178exports.format = function(f) {
9179 if (!isString(f)) {
9180 var objects = [];
9181 for (var i = 0; i < arguments.length; i++) {
9182 objects.push(inspect(arguments[i]));
9183 }
9184 return objects.join(' ');
9185 }
9186
9187 var i = 1;
9188 var args = arguments;
9189 var len = args.length;
9190 var str = String(f).replace(formatRegExp, function(x) {
9191 if (x === '%%') return '%';
9192 if (i >= len) return x;
9193 switch (x) {
9194 case '%s': return String(args[i++]);
9195 case '%d': return Number(args[i++]);
9196 case '%j':
9197 try {
9198 return JSON.stringify(args[i++]);
9199 } catch (_) {
9200 return '[Circular]';
9201 }
9202 default:
9203 return x;
9204 }
9205 });
9206 for (var x = args[i]; i < len; x = args[++i]) {
9207 if (isNull(x) || !isObject(x)) {
9208 str += ' ' + x;
9209 } else {
9210 str += ' ' + inspect(x);
9211 }
9212 }
9213 return str;
9214};
9215
9216
9217// Mark that a method should not be used.
9218// Returns a modified function which warns once by default.
9219// If --no-deprecation is set, then it is a no-op.
9220exports.deprecate = function(fn, msg) {
9221 // Allow for deprecating things in the process of starting up.
9222 if (isUndefined(global.process)) {
9223 return function() {
9224 return exports.deprecate(fn, msg).apply(this, arguments);
9225 };
9226 }
9227
9228 if (process.noDeprecation === true) {
9229 return fn;
9230 }
9231
9232 var warned = false;
9233 function deprecated() {
9234 if (!warned) {
9235 if (process.throwDeprecation) {
9236 throw new Error(msg);
9237 } else if (process.traceDeprecation) {
9238 console.trace(msg);
9239 } else {
9240 console.error(msg);
9241 }
9242 warned = true;
9243 }
9244 return fn.apply(this, arguments);
9245 }
9246
9247 return deprecated;
9248};
9249
9250
9251var debugs = {};
9252var debugEnviron;
9253exports.debuglog = function(set) {
9254 if (isUndefined(debugEnviron))
9255 debugEnviron = process.env.NODE_DEBUG || '';
9256 set = set.toUpperCase();
9257 if (!debugs[set]) {
9258 if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
9259 var pid = process.pid;
9260 debugs[set] = function() {
9261 var msg = exports.format.apply(exports, arguments);
9262 console.error('%s %d: %s', set, pid, msg);
9263 };
9264 } else {
9265 debugs[set] = function() {};
9266 }
9267 }
9268 return debugs[set];
9269};
9270
9271
9272/**
9273 * Echos the value of a value. Trys to print the value out
9274 * in the best way possible given the different types.
9275 *
9276 * @param {Object} obj The object to print out.
9277 * @param {Object} opts Optional options object that alters the output.
9278 */
9279/* legacy: obj, showHidden, depth, colors*/
9280function inspect(obj, opts) {
9281 // default options
9282 var ctx = {
9283 seen: [],
9284 stylize: stylizeNoColor
9285 };
9286 // legacy...
9287 if (arguments.length >= 3) ctx.depth = arguments[2];
9288 if (arguments.length >= 4) ctx.colors = arguments[3];
9289 if (isBoolean(opts)) {
9290 // legacy...
9291 ctx.showHidden = opts;
9292 } else if (opts) {
9293 // got an "options" object
9294 exports._extend(ctx, opts);
9295 }
9296 // set default options
9297 if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
9298 if (isUndefined(ctx.depth)) ctx.depth = 2;
9299 if (isUndefined(ctx.colors)) ctx.colors = false;
9300 if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
9301 if (ctx.colors) ctx.stylize = stylizeWithColor;
9302 return formatValue(ctx, obj, ctx.depth);
9303}
9304exports.inspect = inspect;
9305
9306
9307// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
9308inspect.colors = {
9309 'bold' : [1, 22],
9310 'italic' : [3, 23],
9311 'underline' : [4, 24],
9312 'inverse' : [7, 27],
9313 'white' : [37, 39],
9314 'grey' : [90, 39],
9315 'black' : [30, 39],
9316 'blue' : [34, 39],
9317 'cyan' : [36, 39],
9318 'green' : [32, 39],
9319 'magenta' : [35, 39],
9320 'red' : [31, 39],
9321 'yellow' : [33, 39]
9322};
9323
9324// Don't use 'blue' not visible on cmd.exe
9325inspect.styles = {
9326 'special': 'cyan',
9327 'number': 'yellow',
9328 'boolean': 'yellow',
9329 'undefined': 'grey',
9330 'null': 'bold',
9331 'string': 'green',
9332 'date': 'magenta',
9333 // "name": intentionally not styling
9334 'regexp': 'red'
9335};
9336
9337
9338function stylizeWithColor(str, styleType) {
9339 var style = inspect.styles[styleType];
9340
9341 if (style) {
9342 return '\u001b[' + inspect.colors[style][0] + 'm' + str +
9343 '\u001b[' + inspect.colors[style][1] + 'm';
9344 } else {
9345 return str;
9346 }
9347}
9348
9349
9350function stylizeNoColor(str, styleType) {
9351 return str;
9352}
9353
9354
9355function arrayToHash(array) {
9356 var hash = {};
9357
9358 array.forEach(function(val, idx) {
9359 hash[val] = true;
9360 });
9361
9362 return hash;
9363}
9364
9365
9366function formatValue(ctx, value, recurseTimes) {
9367 // Provide a hook for user-specified inspect functions.
9368 // Check that value is an object with an inspect function on it
9369 if (ctx.customInspect &&
9370 value &&
9371 isFunction(value.inspect) &&
9372 // Filter out the util module, it's inspect function is special
9373 value.inspect !== exports.inspect &&
9374 // Also filter out any prototype objects using the circular check.
9375 !(value.constructor && value.constructor.prototype === value)) {
9376 var ret = value.inspect(recurseTimes, ctx);
9377 if (!isString(ret)) {
9378 ret = formatValue(ctx, ret, recurseTimes);
9379 }
9380 return ret;
9381 }
9382
9383 // Primitive types cannot have properties
9384 var primitive = formatPrimitive(ctx, value);
9385 if (primitive) {
9386 return primitive;
9387 }
9388
9389 // Look up the keys of the object.
9390 var keys = Object.keys(value);
9391 var visibleKeys = arrayToHash(keys);
9392
9393 if (ctx.showHidden) {
9394 keys = Object.getOwnPropertyNames(value);
9395 }
9396
9397 // IE doesn't make error fields non-enumerable
9398 // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
9399 if (isError(value)
9400 && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
9401 return formatError(value);
9402 }
9403
9404 // Some type of object without properties can be shortcutted.
9405 if (keys.length === 0) {
9406 if (isFunction(value)) {
9407 var name = value.name ? ': ' + value.name : '';
9408 return ctx.stylize('[Function' + name + ']', 'special');
9409 }
9410 if (isRegExp(value)) {
9411 return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
9412 }
9413 if (isDate(value)) {
9414 return ctx.stylize(Date.prototype.toString.call(value), 'date');
9415 }
9416 if (isError(value)) {
9417 return formatError(value);
9418 }
9419 }
9420
9421 var base = '', array = false, braces = ['{', '}'];
9422
9423 // Make Array say that they are Array
9424 if (isArray(value)) {
9425 array = true;
9426 braces = ['[', ']'];
9427 }
9428
9429 // Make functions say that they are functions
9430 if (isFunction(value)) {
9431 var n = value.name ? ': ' + value.name : '';
9432 base = ' [Function' + n + ']';
9433 }
9434
9435 // Make RegExps say that they are RegExps
9436 if (isRegExp(value)) {
9437 base = ' ' + RegExp.prototype.toString.call(value);
9438 }
9439
9440 // Make dates with properties first say the date
9441 if (isDate(value)) {
9442 base = ' ' + Date.prototype.toUTCString.call(value);
9443 }
9444
9445 // Make error with message first say the error
9446 if (isError(value)) {
9447 base = ' ' + formatError(value);
9448 }
9449
9450 if (keys.length === 0 && (!array || value.length == 0)) {
9451 return braces[0] + base + braces[1];
9452 }
9453
9454 if (recurseTimes < 0) {
9455 if (isRegExp(value)) {
9456 return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
9457 } else {
9458 return ctx.stylize('[Object]', 'special');
9459 }
9460 }
9461
9462 ctx.seen.push(value);
9463
9464 var output;
9465 if (array) {
9466 output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
9467 } else {
9468 output = keys.map(function(key) {
9469 return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
9470 });
9471 }
9472
9473 ctx.seen.pop();
9474
9475 return reduceToSingleString(output, base, braces);
9476}
9477
9478
9479function formatPrimitive(ctx, value) {
9480 if (isUndefined(value))
9481 return ctx.stylize('undefined', 'undefined');
9482 if (isString(value)) {
9483 var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
9484 .replace(/'/g, "\\'")
9485 .replace(/\\"/g, '"') + '\'';
9486 return ctx.stylize(simple, 'string');
9487 }
9488 if (isNumber(value))
9489 return ctx.stylize('' + value, 'number');
9490 if (isBoolean(value))
9491 return ctx.stylize('' + value, 'boolean');
9492 // For some reason typeof null is "object", so special case here.
9493 if (isNull(value))
9494 return ctx.stylize('null', 'null');
9495}
9496
9497
9498function formatError(value) {
9499 return '[' + Error.prototype.toString.call(value) + ']';
9500}
9501
9502
9503function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
9504 var output = [];
9505 for (var i = 0, l = value.length; i < l; ++i) {
9506 if (hasOwnProperty(value, String(i))) {
9507 output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
9508 String(i), true));
9509 } else {
9510 output.push('');
9511 }
9512 }
9513 keys.forEach(function(key) {
9514 if (!key.match(/^\d+$/)) {
9515 output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
9516 key, true));
9517 }
9518 });
9519 return output;
9520}
9521
9522
9523function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
9524 var name, str, desc;
9525 desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
9526 if (desc.get) {
9527 if (desc.set) {
9528 str = ctx.stylize('[Getter/Setter]', 'special');
9529 } else {
9530 str = ctx.stylize('[Getter]', 'special');
9531 }
9532 } else {
9533 if (desc.set) {
9534 str = ctx.stylize('[Setter]', 'special');
9535 }
9536 }
9537 if (!hasOwnProperty(visibleKeys, key)) {
9538 name = '[' + key + ']';
9539 }
9540 if (!str) {
9541 if (ctx.seen.indexOf(desc.value) < 0) {
9542 if (isNull(recurseTimes)) {
9543 str = formatValue(ctx, desc.value, null);
9544 } else {
9545 str = formatValue(ctx, desc.value, recurseTimes - 1);
9546 }
9547 if (str.indexOf('\n') > -1) {
9548 if (array) {
9549 str = str.split('\n').map(function(line) {
9550 return ' ' + line;
9551 }).join('\n').substr(2);
9552 } else {
9553 str = '\n' + str.split('\n').map(function(line) {
9554 return ' ' + line;
9555 }).join('\n');
9556 }
9557 }
9558 } else {
9559 str = ctx.stylize('[Circular]', 'special');
9560 }
9561 }
9562 if (isUndefined(name)) {
9563 if (array && key.match(/^\d+$/)) {
9564 return str;
9565 }
9566 name = JSON.stringify('' + key);
9567 if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
9568 name = name.substr(1, name.length - 2);
9569 name = ctx.stylize(name, 'name');
9570 } else {
9571 name = name.replace(/'/g, "\\'")
9572 .replace(/\\"/g, '"')
9573 .replace(/(^"|"$)/g, "'");
9574 name = ctx.stylize(name, 'string');
9575 }
9576 }
9577
9578 return name + ': ' + str;
9579}
9580
9581
9582function reduceToSingleString(output, base, braces) {
9583 var numLinesEst = 0;
9584 var length = output.reduce(function(prev, cur) {
9585 numLinesEst++;
9586 if (cur.indexOf('\n') >= 0) numLinesEst++;
9587 return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
9588 }, 0);
9589
9590 if (length > 60) {
9591 return braces[0] +
9592 (base === '' ? '' : base + '\n ') +
9593 ' ' +
9594 output.join(',\n ') +
9595 ' ' +
9596 braces[1];
9597 }
9598
9599 return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
9600}
9601
9602
9603// NOTE: These type checking functions intentionally don't use `instanceof`
9604// because it is fragile and can be easily faked with `Object.create()`.
9605function isArray(ar) {
9606 return Array.isArray(ar);
9607}
9608exports.isArray = isArray;
9609
9610function isBoolean(arg) {
9611 return typeof arg === 'boolean';
9612}
9613exports.isBoolean = isBoolean;
9614
9615function isNull(arg) {
9616 return arg === null;
9617}
9618exports.isNull = isNull;
9619
9620function isNullOrUndefined(arg) {
9621 return arg == null;
9622}
9623exports.isNullOrUndefined = isNullOrUndefined;
9624
9625function isNumber(arg) {
9626 return typeof arg === 'number';
9627}
9628exports.isNumber = isNumber;
9629
9630function isString(arg) {
9631 return typeof arg === 'string';
9632}
9633exports.isString = isString;
9634
9635function isSymbol(arg) {
9636 return typeof arg === 'symbol';
9637}
9638exports.isSymbol = isSymbol;
9639
9640function isUndefined(arg) {
9641 return arg === void 0;
9642}
9643exports.isUndefined = isUndefined;
9644
9645function isRegExp(re) {
9646 return isObject(re) && objectToString(re) === '[object RegExp]';
9647}
9648exports.isRegExp = isRegExp;
9649
9650function isObject(arg) {
9651 return typeof arg === 'object' && arg !== null;
9652}
9653exports.isObject = isObject;
9654
9655function isDate(d) {
9656 return isObject(d) && objectToString(d) === '[object Date]';
9657}
9658exports.isDate = isDate;
9659
9660function isError(e) {
9661 return isObject(e) &&
9662 (objectToString(e) === '[object Error]' || e instanceof Error);
9663}
9664exports.isError = isError;
9665
9666function isFunction(arg) {
9667 return typeof arg === 'function';
9668}
9669exports.isFunction = isFunction;
9670
9671function isPrimitive(arg) {
9672 return arg === null ||
9673 typeof arg === 'boolean' ||
9674 typeof arg === 'number' ||
9675 typeof arg === 'string' ||
9676 typeof arg === 'symbol' || // ES6 symbol
9677 typeof arg === 'undefined';
9678}
9679exports.isPrimitive = isPrimitive;
9680
9681exports.isBuffer = require('./support/isBuffer');
9682
9683function objectToString(o) {
9684 return Object.prototype.toString.call(o);
9685}
9686
9687
9688function pad(n) {
9689 return n < 10 ? '0' + n.toString(10) : n.toString(10);
9690}
9691
9692
9693var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
9694 'Oct', 'Nov', 'Dec'];
9695
9696// 26 Feb 16:19:34
9697function timestamp() {
9698 var d = new Date();
9699 var time = [pad(d.getHours()),
9700 pad(d.getMinutes()),
9701 pad(d.getSeconds())].join(':');
9702 return [d.getDate(), months[d.getMonth()], time].join(' ');
9703}
9704
9705
9706// log is just a thin wrapper to console.log that prepends a timestamp
9707exports.log = function() {
9708 console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
9709};
9710
9711
9712/**
9713 * Inherit the prototype methods from one constructor into another.
9714 *
9715 * The Function.prototype.inherits from lang.js rewritten as a standalone
9716 * function (not on Function.prototype). NOTE: If this file is to be loaded
9717 * during bootstrapping this function needs to be rewritten using some native
9718 * functions as prototype setup using normal JavaScript does not work as
9719 * expected during bootstrapping (see mirror.js in r114903).
9720 *
9721 * @param {function} ctor Constructor function which needs to inherit the
9722 * prototype.
9723 * @param {function} superCtor Constructor function to inherit prototype from.
9724 */
9725exports.inherits = require('inherits');
9726
9727exports._extend = function(origin, add) {
9728 // Don't do anything if add isn't an object
9729 if (!add || !isObject(add)) return origin;
9730
9731 var keys = Object.keys(add);
9732 var i = keys.length;
9733 while (i--) {
9734 origin[keys[i]] = add[keys[i]];
9735 }
9736 return origin;
9737};
9738
9739function hasOwnProperty(obj, prop) {
9740 return Object.prototype.hasOwnProperty.call(obj, prop);
9741}
9742
9743}).call(this,require("KliubH"),typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
9744},{"./support/isBuffer":101,"KliubH":91,"inherits":100}]},{},[83])
9745//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3Rlc3RsaW5nLmdpdC9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9saWIvZGVmYXVsdF9zdHJlYW0uanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9saWIvcmVzdWx0cy5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L2xpYi90ZXN0LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2FycmF5LnByb3RvdHlwZS5ldmVyeS9pbXBsZW1lbnRhdGlvbi5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9hcnJheS5wcm90b3R5cGUuZXZlcnkvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvYXJyYXkucHJvdG90eXBlLmV2ZXJ5L3BvbHlmaWxsLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2FycmF5LnByb3RvdHlwZS5ldmVyeS9zaGltLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2F2YWlsYWJsZS10eXBlZC1hcnJheXMvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvY2FsbC1iaW5kL2NhbGxCb3VuZC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9jYWxsLWJpbmQvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvZGVlcC1lcXVhbC9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9kZWZpbmUtcHJvcGVydGllcy9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9kZWZpbmVkL2luZGV4LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0LzIwMjEvSXNDYWxsYWJsZS5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC8yMDIxL1JlcXVpcmVPYmplY3RDb2VyY2libGUuanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvMjAyMS9Ub051bWJlci5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC8yMDIxL1RvT2JqZWN0LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0LzIwMjEvVG9QcmltaXRpdmUuanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvMjAyMS9Ub1N0cmluZy5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC8yMDIxL1RvVWludDMyLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0LzUvQ2hlY2tPYmplY3RDb2VyY2libGUuanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvaGVscGVycy9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvaGVscGVycy9pc1ByaW1pdGl2ZS5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9oZWxwZXJzL3JlZ2V4VGVzdGVyLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2VzLWdldC1pdGVyYXRvci9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9lcy10by1wcmltaXRpdmUvZXMyMDE1LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2Zvci1lYWNoL2luZGV4LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW1wbGVtZW50YXRpb24uanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvZnVuY3Rpb24tYmluZC9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9mdW5jdGlvbnMtaGF2ZS1uYW1lcy9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9nZXQtaW50cmluc2ljL2luZGV4LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2hhcy1iaWdpbnRzL2luZGV4LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2hhcy1wcm9wZXJ0eS1kZXNjcmlwdG9ycy9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9zaGFtcy5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9oYXMtdG9zdHJpbmd0YWcvc2hhbXMuanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvaGFzL3NyYy9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2lzLWFyZ3VtZW50cy9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9pcy1iaWdpbnQvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvaXMtYm9vbGVhbi1vYmplY3QvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvaXMtY2FsbGFibGUvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvaXMtZGF0ZS1vYmplY3QvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvaXMtbWFwL2luZGV4LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2lzLW51bWJlci1vYmplY3QvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvaXMtcmVnZXgvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvaXMtc2V0L2luZGV4LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2lzLXN0cmluZy9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9pcy1zeW1ib2wvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvaXMtdHlwZWQtYXJyYXkvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvaXMtd2Vha21hcC9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9pcy13ZWFrc2V0L2luZGV4LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvb2JqZWN0LWluc3BlY3QvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvb2JqZWN0LWluc3BlY3QvdXRpbC5pbnNwZWN0LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL29iamVjdC1pcy9pbXBsZW1lbnRhdGlvbi5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9vYmplY3QtaXMvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvb2JqZWN0LWlzL3BvbHlmaWxsLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL29iamVjdC1pcy9zaGltLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL29iamVjdC1rZXlzL2ltcGxlbWVudGF0aW9uLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL29iamVjdC1rZXlzL2luZGV4LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL29iamVjdC1rZXlzL2lzQXJndW1lbnRzLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL29iamVjdC5hc3NpZ24vaW1wbGVtZW50YXRpb24uanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvb2JqZWN0LmFzc2lnbi9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9vYmplY3QuYXNzaWduL3BvbHlmaWxsLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL29iamVjdC5hc3NpZ24vc2hpbS5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9yZWdleHAucHJvdG90eXBlLmZsYWdzL2ltcGxlbWVudGF0aW9uLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL3JlZ2V4cC5wcm90b3R5cGUuZmxhZ3MvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvcmVnZXhwLnByb3RvdHlwZS5mbGFncy9wb2x5ZmlsbC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9yZWdleHAucHJvdG90eXBlLmZsYWdzL3NoaW0uanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvcmVzdW1lci9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9zaWRlLWNoYW5uZWwvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvc3RyaW5nLnByb3RvdHlwZS50cmltL2ltcGxlbWVudGF0aW9uLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGFwZS5naXQvbm9kZV9tb2R1bGVzL3N0cmluZy5wcm90b3R5cGUudHJpbS9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy9zdHJpbmcucHJvdG90eXBlLnRyaW0vcG9seWZpbGwuanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvc3RyaW5nLnByb3RvdHlwZS50cmltL3NoaW0uanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvdGhyb3VnaC9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy93aGljaC1ib3hlZC1wcmltaXRpdmUvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90YXBlLmdpdC9ub2RlX21vZHVsZXMvd2hpY2gtY29sbGVjdGlvbi9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L25vZGVfbW9kdWxlcy93aGljaC10eXBlZC1hcnJheS9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3RhcGUuZ2l0L3Rlc3QvYnJvd3Nlci9hc3NlcnRzLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGVzdGxpbmcuZ2l0L25vZGVfbW9kdWxlcy9iYXNlNjQtanMvbGliL2I2NC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3Rlc3RsaW5nLmdpdC9ub2RlX21vZHVsZXMvYnJvd3Nlci1yZXNvbHZlL2VtcHR5LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGVzdGxpbmcuZ2l0L25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90ZXN0bGluZy5naXQvbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90ZXN0bGluZy5naXQvbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90ZXN0bGluZy5naXQvbm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3Rlc3RsaW5nLmdpdC9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGVzdGxpbmcuZ2l0L25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9kdXBsZXguanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90ZXN0bGluZy5naXQvbm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L2luZGV4LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGVzdGxpbmcuZ2l0L25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGVzdGxpbmcuZ2l0L25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9wYXNzdGhyb3VnaC5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3Rlc3RsaW5nLmdpdC9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvcmVhZGFibGUuanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90ZXN0bGluZy5naXQvbm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L3RyYW5zZm9ybS5qcyIsIi9Vc2Vycy9samhhcmIvRHJvcGJveC9naXQvbGpoYXJiL3Rlc3RsaW5nLmdpdC9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvd3JpdGFibGUuanMiLCIvVXNlcnMvbGpoYXJiL0Ryb3Bib3gvZ2l0L2xqaGFyYi90ZXN0bGluZy5naXQvbm9kZV9tb2R1bGVzL3N0cmluZ19kZWNvZGVyL2luZGV4LmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGVzdGxpbmcuZ2l0L25vZGVfbW9kdWxlcy91dGlsL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGVzdGxpbmcuZ2l0L25vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwiL1VzZXJzL2xqaGFyYi9Ecm9wYm94L2dpdC9samhhcmIvdGVzdGxpbmcuZ2l0L25vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2p4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoZ0JBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVIQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcmxDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdjZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3Rocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIil9dmFyIGY9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGYuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sZixmLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnZGVmaW5lZCcpO1xudmFyIGNyZWF0ZURlZmF1bHRTdHJlYW0gPSByZXF1aXJlKCcuL2xpYi9kZWZhdWx0X3N0cmVhbScpO1xudmFyIFRlc3QgPSByZXF1aXJlKCcuL2xpYi90ZXN0Jyk7XG52YXIgY3JlYXRlUmVzdWx0ID0gcmVxdWlyZSgnLi9saWIvcmVzdWx0cycpO1xudmFyIHRocm91Z2ggPSByZXF1aXJlKCd0aHJvdWdoJyk7XG5cbnZhciBjYW5FbWl0RXhpdCA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzXG4gICAgJiYgdHlwZW9mIHByb2Nlc3Mub24gPT09ICdmdW5jdGlvbicgJiYgcHJvY2Vzcy5icm93c2VyICE9PSB0cnVlO1xudmFyIGNhbkV4aXQgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzc1xuICAgICYmIHR5cGVvZiBwcm9jZXNzLmV4aXQgPT09ICdmdW5jdGlvbic7XG5cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uICgpIHtcblx0dmFyIHdhaXQgPSBmYWxzZTtcblx0dmFyIGhhcm5lc3M7XG5cblx0ZnVuY3Rpb24gZ2V0SGFybmVzcyhvcHRzKSB7XG5cdFx0aWYgKCFvcHRzKSB7IG9wdHMgPSB7fTsgfVxuXHRcdG9wdHMuYXV0b2Nsb3NlID0gIWNhbkVtaXRFeGl0O1xuXHRcdC8vIHRoaXMgb3ZlcnJpZGUgaXMgaGVyZSBzaW5jZSB0ZXN0cyBmYWlsIHZpYSBueWMgaWYgY3JlYXRlSGFybmVzcyBpcyBtb3ZlZCB1cHdhcmRzXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG5cdFx0aWYgKCFoYXJuZXNzKSB7IGhhcm5lc3MgPSBjcmVhdGVFeGl0SGFybmVzcyhvcHRzLCB3YWl0KTsgfVxuXHRcdHJldHVybiBoYXJuZXNzO1xuXHR9XG5cblx0ZnVuY3Rpb24gbGF6eUxvYWQoKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWludmFsaWQtdGhpc1xuXHRcdHJldHVybiBnZXRIYXJuZXNzKCkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0fVxuXG5cdGxhenlMb2FkLndhaXQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0d2FpdCA9IHRydWU7XG5cdH07XG5cblx0bGF6eUxvYWQucnVuID0gZnVuY3Rpb24gKCkge1xuXHRcdHZhciBydW4gPSBnZXRIYXJuZXNzKCkucnVuO1xuXG5cdFx0aWYgKHJ1bikgeyBydW4oKTsgfVxuXHR9O1xuXG5cdGxhenlMb2FkLm9ubHkgPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIGdldEhhcm5lc3MoKS5vbmx5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdH07XG5cblx0bGF6eUxvYWQuY3JlYXRlU3RyZWFtID0gZnVuY3Rpb24gKG9wdHMpIHtcblx0XHR2YXIgb3B0aW9ucyA9IG9wdHMgfHwge307XG5cdFx0aWYgKCFoYXJuZXNzKSB7XG5cdFx0XHR2YXIgb3V0cHV0ID0gdGhyb3VnaCgpO1xuXHRcdFx0Z2V0SGFybmVzcyh7IHN0cmVhbTogb3V0cHV0LCBvYmplY3RNb2RlOiBvcHRpb25zLm9iamVjdE1vZGUgfSk7XG5cdFx0XHRyZXR1cm4gb3V0cHV0O1xuXHRcdH1cblx0XHRyZXR1cm4gaGFybmVzcy5jcmVhdGVTdHJlYW0ob3B0aW9ucyk7XG5cdH07XG5cblx0bGF6eUxvYWQub25GaW5pc2ggPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIGdldEhhcm5lc3MoKS5vbkZpbmlzaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHR9O1xuXG5cdGxhenlMb2FkLm9uRmFpbHVyZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gZ2V0SGFybmVzcygpLm9uRmFpbHVyZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHR9O1xuXG5cdGxhenlMb2FkLmdldEhhcm5lc3MgPSBnZXRIYXJuZXNzO1xuXG5cdHJldHVybiBsYXp5TG9hZDtcbn0oKSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUhhcm5lc3MoY29uZl8pIHtcblx0dmFyIHJlc3VsdHMgPSBjcmVhdGVSZXN1bHQoKTtcblx0aWYgKCFjb25mXyB8fCBjb25mXy5hdXRvY2xvc2UgIT09IGZhbHNlKSB7XG5cdFx0cmVzdWx0cy5vbmNlKCdkb25lJywgZnVuY3Rpb24gKCkgeyByZXN1bHRzLmNsb3NlKCk7IH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gdGVzdChuYW1lLCBjb25mLCBjYikge1xuXHRcdHZhciB0ID0gbmV3IFRlc3QobmFtZSwgY29uZiwgY2IpO1xuXHRcdHRlc3QuX3Rlc3RzLnB1c2godCk7XG5cblx0XHQoZnVuY3Rpb24gaW5zcGVjdENvZGUoc3QpIHtcblx0XHRcdHN0Lm9uKCd0ZXN0JywgZnVuY3Rpb24gc3ViKHN0Xykge1xuXHRcdFx0XHRpbnNwZWN0Q29kZShzdF8pO1xuXHRcdFx0fSk7XG5cdFx0XHRzdC5vbigncmVzdWx0JywgZnVuY3Rpb24gKHIpIHtcblx0XHRcdFx0aWYgKCFyLnRvZG8gJiYgIXIub2sgJiYgdHlwZW9mIHIgIT09ICdzdHJpbmcnKSB7IHRlc3QuX2V4aXRDb2RlID0gMTsgfVxuXHRcdFx0fSk7XG5cdFx0fSh0KSk7XG5cblx0XHRyZXN1bHRzLnB1c2godCk7XG5cdFx0cmV0dXJuIHQ7XG5cdH1cblx0dGVzdC5fcmVzdWx0cyA9IHJlc3VsdHM7XG5cblx0dGVzdC5fdGVzdHMgPSBbXTtcblxuXHR0ZXN0LmNyZWF0ZVN0cmVhbSA9IGZ1bmN0aW9uIChvcHRzKSB7XG5cdFx0cmV0dXJuIHJlc3VsdHMuY3JlYXRlU3RyZWFtKG9wdHMpO1xuXHR9O1xuXG5cdHRlc3Qub25GaW5pc2ggPSBmdW5jdGlvbiAoY2IpIHtcblx0XHRyZXN1bHRzLm9uKCdkb25lJywgY2IpO1xuXHR9O1xuXG5cdHRlc3Qub25GYWlsdXJlID0gZnVuY3Rpb24gKGNiKSB7XG5cdFx0cmVzdWx0cy5vbignZmFpbCcsIGNiKTtcblx0fTtcblxuXHR2YXIgb25seSA9IGZhbHNlO1xuXHR0ZXN0Lm9ubHkgPSBmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKG9ubHkpIHsgdGhyb3cgbmV3IEVycm9yKCd0aGVyZSBjYW4gb25seSBiZSBvbmUgb25seSB0ZXN0Jyk7IH1cblx0XHRpZiAoY29uZl8ubm9Pbmx5KSB7IHRocm93IG5ldyBFcnJvcignYG9ubHlgIHRlc3RzIGFyZSBwcm9oaWJpdGVkJyk7IH1cblx0XHRvbmx5ID0gdHJ1ZTtcblx0XHR2YXIgdCA9IHRlc3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcblx0XHRyZXN1bHRzLm9ubHkodCk7XG5cdFx0cmV0dXJuIHQ7XG5cdH07XG5cdHRlc3QuX2V4aXRDb2RlID0gMDtcblxuXHR0ZXN0LmNsb3NlID0gZnVuY3Rpb24gKCkgeyByZXN1bHRzLmNsb3NlKCk7IH07XG5cblx0cmV0dXJuIHRlc3Q7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUV4aXRIYXJuZXNzKGNvbmYsIHdhaXQpIHtcblx0dmFyIGNvbmZpZyA9IGNvbmYgfHwge307XG5cdHZhciBoYXJuZXNzID0gY3JlYXRlSGFybmVzcyh7XG5cdFx0YXV0b2Nsb3NlOiBkZWZpbmVkKGNvbmZpZy5hdXRvY2xvc2UsIGZhbHNlKSxcblx0XHRub09ubHk6IGRlZmluZWQoY29uZi5ub09ubHksIGRlZmluZWQocHJvY2Vzcy5lbnYuTk9ERV9UQVBFX05PX09OTFlfVEVTVCwgZmFsc2UpKVxuXHR9KTtcblx0dmFyIHJ1bm5pbmcgPSBmYWxzZTtcblx0dmFyIGVuZGVkID0gZmFsc2U7XG5cblx0ZnVuY3Rpb24gcnVuKCkge1xuXHRcdGlmIChydW5uaW5nKSB7IHJldHVybjsgfVxuXHRcdHJ1bm5pbmcgPSB0cnVlO1xuXHRcdHZhciBzdHJlYW0gPSBoYXJuZXNzLmNyZWF0ZVN0cmVhbSh7IG9iamVjdE1vZGU6IGNvbmZpZy5vYmplY3RNb2RlIH0pO1xuXHRcdHZhciBlcyA9IHN0cmVhbS5waXBlKGNvbmZpZy5zdHJlYW0gfHwgY3JlYXRlRGVmYXVsdFN0cmVhbSgpKTtcblx0XHRpZiAoY2FuRW1pdEV4aXQgJiYgZXMpIHsgLy8gaW4gbm9kZSB2MC40LCBgZXNgIGlzIGB1bmRlZmluZWRgXG5cdFx0XHQvLyBUT0RPOiB1c2UgYGVycmAgYXJnP1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5cdFx0XHRlcy5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7IGhhcm5lc3MuX2V4aXRDb2RlID0gMTsgfSk7XG5cdFx0fVxuXHRcdHN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCkgeyBlbmRlZCA9IHRydWU7IH0pO1xuXHR9XG5cblx0aWYgKHdhaXQpIHtcblx0XHRoYXJuZXNzLnJ1biA9IHJ1bjtcblx0fSBlbHNlIHtcblx0XHRydW4oKTtcblx0fVxuXG5cdGlmIChjb25maWcuZXhpdCA9PT0gZmFsc2UpIHsgcmV0dXJuIGhhcm5lc3M7IH1cblx0aWYgKCFjYW5FbWl0RXhpdCB8fCAhY2FuRXhpdCkgeyByZXR1cm4gaGFybmVzczsgfVxuXG5cdHByb2Nlc3Mub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkge1xuXHRcdC8vIGxldCB0aGUgcHJvY2VzcyBleGl0IGNsZWFubHkuXG5cdFx0aWYgKHR5cGVvZiBjb2RlID09PSAnbnVtYmVyJyAmJiBjb2RlICE9PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCFlbmRlZCkge1xuXHRcdFx0dmFyIG9ubHkgPSBoYXJuZXNzLl9yZXN1bHRzLl9vbmx5O1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBoYXJuZXNzLl90ZXN0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHR2YXIgdCA9IGhhcm5lc3MuX3Rlc3RzW2ldO1xuXHRcdFx0XHRpZiAoIW9ubHkgfHwgdCA9PT0gb25seSkge1xuXHRcdFx0XHRcdHQuX2V4aXQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRoYXJuZXNzLmNsb3NlKCk7XG5cblx0XHRwcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycygnZXhpdCcpOyAvLyBuZWNlc3NhcnkgZm9yIG5vZGUgdjAuNlxuXHRcdHByb2Nlc3MuZXhpdChjb2RlIHx8IGhhcm5lc3MuX2V4aXRDb2RlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm9jZXNzLWV4aXRcblx0fSk7XG5cblx0cmV0dXJuIGhhcm5lc3M7XG59XG5cbm1vZHVsZS5leHBvcnRzLmNyZWF0ZUhhcm5lc3MgPSBjcmVhdGVIYXJuZXNzO1xubW9kdWxlLmV4cG9ydHMuVGVzdCA9IFRlc3Q7XG5tb2R1bGUuZXhwb3J0cy50ZXN0ID0gbW9kdWxlLmV4cG9ydHM7IC8vIHRhcCBjb21wYXRcbm1vZHVsZS5leHBvcnRzLnRlc3Quc2tpcCA9IFRlc3Quc2tpcDtcblxufSkuY2FsbCh0aGlzLHJlcXVpcmUoXCJLbGl1YkhcIikpIiwiKGZ1bmN0aW9uIChwcm9jZXNzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIHRocm91Z2ggPSByZXF1aXJlKCd0aHJvdWdoJyk7XG52YXIgZnMgPSByZXF1aXJlKCdmcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGxpbmUgPSAnJztcblx0dmFyIHN0cmVhbSA9IHRocm91Z2god3JpdGUsIGZsdXNoKTtcblx0cmV0dXJuIHN0cmVhbTtcblxuXHRmdW5jdGlvbiB3cml0ZShidWYpIHtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGMgPSB0eXBlb2YgYnVmID09PSAnc3RyaW5nJ1xuXHRcdFx0XHQ/IGJ1Zi5jaGFyQXQoaSlcblx0XHRcdFx0OiBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XG5cdFx0XHRpZiAoYyA9PT0gJ1xcbicpIHtcblx0XHRcdFx0Zmx1c2goKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGxpbmUgKz0gYztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBmbHVzaCgpIHtcblx0XHRpZiAoZnMud3JpdGVTeW5jICYmICgvXndpbi8pLnRlc3QocHJvY2Vzcy5wbGF0Zm9ybSkpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGZzLndyaXRlU3luYygxLCBsaW5lICsgJ1xcbicpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc29sZS5sb2cobGluZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bGluZSA9ICcnO1xuXHR9XG59O1xuXG59KS5jYWxsKHRoaXMscmVxdWlyZShcIktsaXViSFwiKSkiLCIoZnVuY3Rpb24gKHByb2Nlc3Mpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJ2RlZmluZWQnKTtcbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xudmFyIHRocm91Z2ggPSByZXF1aXJlKCd0aHJvdWdoJyk7XG52YXIgcmVzdW1lciA9IHJlcXVpcmUoJ3Jlc3VtZXInKTtcbnZhciBpbnNwZWN0ID0gcmVxdWlyZSgnb2JqZWN0LWluc3BlY3QnKTtcbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJpbmQvY2FsbEJvdW5kJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnaGFzJyk7XG52YXIgJGV4ZWMgPSBjYWxsQm91bmQoJ1JlZ0V4cC5wcm90b3R5cGUuZXhlYycpO1xudmFyICRzcGxpdCA9IGNhbGxCb3VuZCgnU3RyaW5nLnByb3RvdHlwZS5zcGxpdCcpO1xudmFyICRyZXBsYWNlID0gY2FsbEJvdW5kKCdTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UnKTtcbnZhciAkc2hpZnQgPSBjYWxsQm91bmQoJ0FycmF5LnByb3RvdHlwZS5zaGlmdCcpO1xudmFyICRwdXNoID0gY2FsbEJvdW5kKCdBcnJheS5wcm90b3R5cGUucHVzaCcpO1xudmFyIHlhbWxJbmRpY2F0b3JzID0gLzp8LXxcXD8vO1xudmFyIG5leHRUaWNrID0gdHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCdcblx0PyBzZXRJbW1lZGlhdGVcblx0OiBwcm9jZXNzLm5leHRUaWNrO1xuXG5mdW5jdGlvbiBjb2FsZXNjZVdoaXRlU3BhY2VzKHN0cikge1xuXHRyZXR1cm4gJHJlcGxhY2UoU3RyaW5nKHN0ciksIC9cXHMrL2csICcgJyk7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRUZXN0KHJlc3VsdHMpIHtcblx0aWYgKCFyZXN1bHRzLl9vbmx5KSB7XG5cdFx0cmV0dXJuICRzaGlmdChyZXN1bHRzLnRlc3RzKTtcblx0fVxuXG5cdGRvIHtcblx0XHR2YXIgdCA9ICRzaGlmdChyZXN1bHRzLnRlc3RzKTtcblx0XHRpZiAodCAmJiByZXN1bHRzLl9vbmx5ID09PSB0KSB7XG5cdFx0XHRyZXR1cm4gdDtcblx0XHR9XG5cdH0gd2hpbGUgKHJlc3VsdHMudGVzdHMubGVuZ3RoICE9PSAwKTtcblxuXHRyZXR1cm4gdm9pZCB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGludmFsaWRZYW1sKHN0cikge1xuXHRyZXR1cm4gJGV4ZWMoeWFtbEluZGljYXRvcnMsIHN0cikgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIGVuY29kZVJlc3VsdChyZXMsIGNvdW50KSB7XG5cdHZhciBvdXRwdXQgPSAnJztcblx0b3V0cHV0ICs9IChyZXMub2sgPyAnb2sgJyA6ICdub3Qgb2sgJykgKyBjb3VudDtcblx0b3V0cHV0ICs9IHJlcy5uYW1lID8gJyAnICsgY29hbGVzY2VXaGl0ZVNwYWNlcyhyZXMubmFtZSkgOiAnJztcblxuXHRpZiAocmVzLnNraXApIHtcblx0XHRvdXRwdXQgKz0gJyAjIFNLSVAnICsgKHR5cGVvZiByZXMuc2tpcCA9PT0gJ3N0cmluZycgPyAnICcgKyBjb2FsZXNjZVdoaXRlU3BhY2VzKHJlcy5za2lwKSA6ICcnKTtcblx0fSBlbHNlIGlmIChyZXMudG9kbykge1xuXHRcdG91dHB1dCArPSAnICMgVE9ETycgKyAodHlwZW9mIHJlcy50b2RvID09PSAnc3RyaW5nJyA/ICcgJyArIGNvYWxlc2NlV2hpdGVTcGFjZXMocmVzLnRvZG8pIDogJycpO1xuXHR9XG5cblx0b3V0cHV0ICs9ICdcXG4nO1xuXHRpZiAocmVzLm9rKSB7IHJldHVybiBvdXRwdXQ7IH1cblxuXHR2YXIgb3V0ZXIgPSAnICAnO1xuXHR2YXIgaW5uZXIgPSBvdXRlciArICcgICc7XG5cdG91dHB1dCArPSBvdXRlciArICctLS1cXG4nO1xuXHRvdXRwdXQgKz0gaW5uZXIgKyAnb3BlcmF0b3I6ICcgKyByZXMub3BlcmF0b3IgKyAnXFxuJztcblxuXHRpZiAoaGFzKHJlcywgJ2V4cGVjdGVkJykgfHwgaGFzKHJlcywgJ2FjdHVhbCcpKSB7XG5cdFx0dmFyIGV4ID0gaW5zcGVjdChyZXMuZXhwZWN0ZWQsIHsgZGVwdGg6IHJlcy5vYmplY3RQcmludERlcHRoIH0pO1xuXHRcdHZhciBhYyA9IGluc3BlY3QocmVzLmFjdHVhbCwgeyBkZXB0aDogcmVzLm9iamVjdFByaW50RGVwdGggfSk7XG5cblx0XHRpZiAoTWF0aC5tYXgoZXgubGVuZ3RoLCBhYy5sZW5ndGgpID4gNjUgfHwgaW52YWxpZFlhbWwoZXgpIHx8IGludmFsaWRZYW1sKGFjKSkge1xuXHRcdFx0b3V0cHV0ICs9IGlubmVyICsgJ2V4cGVjdGVkOiB8LVxcbicgKyBpbm5lciArICcgICcgKyBleCArICdcXG4nO1xuXHRcdFx0b3V0cHV0ICs9IGlubmVyICsgJ2FjdHVhbDogfC1cXG4nICsgaW5uZXIgKyAnICAnICsgYWMgKyAnXFxuJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0b3V0cHV0ICs9IGlubmVyICsgJ2V4cGVjdGVkOiAnICsgZXggKyAnXFxuJztcblx0XHRcdG91dHB1dCArPSBpbm5lciArICdhY3R1YWw6ICAgJyArIGFjICsgJ1xcbic7XG5cdFx0fVxuXHR9XG5cdGlmIChyZXMuYXQpIHtcblx0XHRvdXRwdXQgKz0gaW5uZXIgKyAnYXQ6ICcgKyByZXMuYXQgKyAnXFxuJztcblx0fVxuXG5cdHZhciBhY3R1YWxTdGFjayA9IHJlcy5hY3R1YWwgJiYgKHR5cGVvZiByZXMuYWN0dWFsID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgcmVzLmFjdHVhbCA9PT0gJ2Z1bmN0aW9uJykgPyByZXMuYWN0dWFsLnN0YWNrIDogdW5kZWZpbmVkO1xuXHR2YXIgZXJyb3JTdGFjayA9IHJlcy5lcnJvciAmJiByZXMuZXJyb3Iuc3RhY2s7XG5cdHZhciBzdGFjayA9IGRlZmluZWQoYWN0dWFsU3RhY2ssIGVycm9yU3RhY2spO1xuXHRpZiAoc3RhY2spIHtcblx0XHR2YXIgbGluZXMgPSAkc3BsaXQoU3RyaW5nKHN0YWNrKSwgJ1xcbicpO1xuXHRcdG91dHB1dCArPSBpbm5lciArICdzdGFjazogfC1cXG4nO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdG91dHB1dCArPSBpbm5lciArICcgICcgKyBsaW5lc1tpXSArICdcXG4nO1xuXHRcdH1cblx0fVxuXG5cdG91dHB1dCArPSBvdXRlciArICcuLi5cXG4nO1xuXHRyZXR1cm4gb3V0cHV0O1xufVxuXG5mdW5jdGlvbiBSZXN1bHRzKCkge1xuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVzdWx0cykpIHsgcmV0dXJuIG5ldyBSZXN1bHRzKCk7IH1cblx0dGhpcy5jb3VudCA9IDA7XG5cdHRoaXMuZmFpbCA9IDA7XG5cdHRoaXMucGFzcyA9IDA7XG5cdHRoaXMudG9kbyA9IDA7XG5cdHRoaXMuX3N0cmVhbSA9IHRocm91Z2goKTtcblx0dGhpcy50ZXN0cyA9IFtdO1xuXHR0aGlzLl9vbmx5ID0gbnVsbDtcblx0dGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XG59XG5cbmluaGVyaXRzKFJlc3VsdHMsIEV2ZW50RW1pdHRlcik7XG5cblJlc3VsdHMucHJvdG90eXBlLmNyZWF0ZVN0cmVhbSA9IGZ1bmN0aW9uIChvcHRzKSB7XG5cdGlmICghb3B0cykgeyBvcHRzID0ge307IH1cblx0dmFyIHNlbGYgPSB0aGlzO1xuXHR2YXIgb3V0cHV0O1xuXHR2YXIgdGVzdElkID0gMDtcblx0aWYgKG9wdHMub2JqZWN0TW9kZSkge1xuXHRcdG91dHB1dCA9IHRocm91Z2goKTtcblx0XHRzZWxmLm9uKCdfcHVzaCcsIGZ1bmN0aW9uIG9udGVzdCh0LCBleHRyYSkge1xuXHRcdFx0aWYgKCFleHRyYSkgeyBleHRyYSA9IHt9OyB9XG5cdFx0XHR2YXIgaWQgPSB0ZXN0SWQrKztcblx0XHRcdHQub25jZSgncHJlcnVuJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgcm93ID0ge1xuXHRcdFx0XHRcdHR5cGU6ICd0ZXN0Jyxcblx0XHRcdFx0XHRuYW1lOiB0Lm5hbWUsXG5cdFx0XHRcdFx0aWQ6IGlkLFxuXHRcdFx0XHRcdHNraXA6IHQuX3NraXAsXG5cdFx0XHRcdFx0dG9kbzogdC5fdG9kb1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAoaGFzKGV4dHJhLCAncGFyZW50JykpIHtcblx0XHRcdFx0XHRyb3cucGFyZW50ID0gZXh0cmEucGFyZW50O1xuXHRcdFx0XHR9XG5cdFx0XHRcdG91dHB1dC5xdWV1ZShyb3cpO1xuXHRcdFx0fSk7XG5cdFx0XHR0Lm9uKCd0ZXN0JywgZnVuY3Rpb24gKHN0KSB7XG5cdFx0XHRcdG9udGVzdChzdCwgeyBwYXJlbnQ6IGlkIH0pO1xuXHRcdFx0fSk7XG5cdFx0XHR0Lm9uKCdyZXN1bHQnLCBmdW5jdGlvbiAocmVzKSB7XG5cdFx0XHRcdGlmIChyZXMgJiYgdHlwZW9mIHJlcyA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0XHRyZXMudGVzdCA9IGlkO1xuXHRcdFx0XHRcdHJlcy50eXBlID0gJ2Fzc2VydCc7XG5cdFx0XHRcdH1cblx0XHRcdFx0b3V0cHV0LnF1ZXVlKHJlcyk7XG5cdFx0XHR9KTtcblx0XHRcdHQub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0b3V0cHV0LnF1ZXVlKHsgdHlwZTogJ2VuZCcsIHRlc3Q6IGlkIH0pO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdFx0c2VsZi5vbignZG9uZScsIGZ1bmN0aW9uICgpIHsgb3V0cHV0LnF1ZXVlKG51bGwpOyB9KTtcblx0fSBlbHNlIHtcblx0XHRvdXRwdXQgPSByZXN1bWVyKCk7XG5cdFx0b3V0cHV0LnF1ZXVlKCdUQVAgdmVyc2lvbiAxM1xcbicpO1xuXHRcdHNlbGYuX3N0cmVhbS5waXBlKG91dHB1dCk7XG5cdH1cblxuXHRpZiAoIXRoaXMuX2lzUnVubmluZykge1xuXHRcdHRoaXMuX2lzUnVubmluZyA9IHRydWU7XG5cdFx0bmV4dFRpY2soZnVuY3Rpb24gbmV4dCgpIHtcblx0XHRcdHZhciB0O1xuXHRcdFx0d2hpbGUgKHQgPSBnZXROZXh0VGVzdChzZWxmKSkge1xuXHRcdFx0XHR0LnJ1bigpO1xuXHRcdFx0XHRpZiAoIXQuZW5kZWQpIHtcblx0XHRcdFx0XHR0Lm9uY2UoJ2VuZCcsIGZ1bmN0aW9uICgpIHsgbmV4dFRpY2sobmV4dCk7IH0pO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0c2VsZi5lbWl0KCdkb25lJyk7XG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gb3V0cHV0O1xufTtcblxuUmVzdWx0cy5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICh0KSB7XG5cdHZhciBzZWxmID0gdGhpcztcblx0JHB1c2goc2VsZi50ZXN0cywgdCk7XG5cdHNlbGYuX3dhdGNoKHQpO1xuXHRzZWxmLmVtaXQoJ19wdXNoJywgdCk7XG59O1xuXG5SZXN1bHRzLnByb3RvdHlwZS5vbmx5ID0gZnVuY3Rpb24gKHQpIHtcblx0dGhpcy5fb25seSA9IHQ7XG59O1xuXG5SZXN1bHRzLnByb3RvdHlwZS5fd2F0Y2ggPSBmdW5jdGlvbiAodCkge1xuXHR2YXIgc2VsZiA9IHRoaXM7XG5cdGZ1bmN0aW9uIHdyaXRlKHMpIHsgc2VsZi5fc3RyZWFtLnF1ZXVlKHMpOyB9XG5cblx0dC5vbmNlKCdwcmVydW4nLCBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHByZW1zZyA9ICcnO1xuXHRcdGlmICh0Ll9za2lwKSB7XG5cdFx0XHRwcmVtc2cgPSAnU0tJUCAnO1xuXHRcdH0gZWxzZSBpZiAodC5fdG9kbykge1xuXHRcdFx0cHJlbXNnID0gJ1RPRE8gJztcblx0XHR9XG5cdFx0d3JpdGUoJyMgJyArIHByZW1zZyArIGNvYWxlc2NlV2hpdGVTcGFjZXModC5uYW1lKSArICdcXG4nKTtcblx0fSk7XG5cblx0dC5vbigncmVzdWx0JywgZnVuY3Rpb24gKHJlcykge1xuXHRcdGlmICh0eXBlb2YgcmVzID09PSAnc3RyaW5nJykge1xuXHRcdFx0d3JpdGUoJyMgJyArIHJlcyArICdcXG4nKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0d3JpdGUoZW5jb2RlUmVzdWx0KHJlcywgc2VsZi5jb3VudCArIDEpKTtcblx0XHRzZWxmLmNvdW50Kys7XG5cblx0XHRpZiAocmVzLm9rIHx8IHJlcy50b2RvKSB7XG5cdFx0XHRzZWxmLnBhc3MrKztcblx0XHR9IGVsc2Uge1xuXHRcdFx0c2VsZi5mYWlsKys7XG5cdFx0XHRzZWxmLmVtaXQoJ2ZhaWwnKTtcblx0XHR9XG5cdH0pO1xuXG5cdHQub24oJ3Rlc3QnLCBmdW5jdGlvbiAoc3QpIHsgc2VsZi5fd2F0Y2goc3QpOyB9KTtcbn07XG5cblJlc3VsdHMucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc2VsZiA9IHRoaXM7XG5cdGlmIChzZWxmLmNsb3NlZCkgeyBzZWxmLl9zdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0FMUkVBRFkgQ0xPU0VEJykpOyB9XG5cdHNlbGYuY2xvc2VkID0gdHJ1ZTtcblxuXHRmdW5jdGlvbiB3cml0ZShzKSB7IHNlbGYuX3N0cmVhbS5xdWV1ZShzKTsgfVxuXG5cdHdyaXRlKCdcXG4xLi4nICsgc2VsZi5jb3VudCArICdcXG4nKTtcblx0d3JpdGUoJyMgdGVzdHMgJyArIHNlbGYuY291bnQgKyAnXFxuJyk7XG5cdHdyaXRlKCcjIHBhc3MgICcgKyAoc2VsZi5wYXNzICsgc2VsZi50b2RvKSArICdcXG4nKTtcblx0aWYgKHNlbGYudG9kbykgeyB3cml0ZSgnIyB0b2RvICAnICsgc2VsZi50b2RvICsgJ1xcbicpOyB9XG5cdGlmIChzZWxmLmZhaWwpIHtcblx0XHR3cml0ZSgnIyBmYWlsICAnICsgc2VsZi5mYWlsICsgJ1xcbicpO1xuXHR9IGVsc2Uge1xuXHRcdHdyaXRlKCdcXG4jIG9rXFxuJyk7XG5cdH1cblxuXHRzZWxmLl9zdHJlYW0ucXVldWUobnVsbCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlc3VsdHM7XG5cbn0pLmNhbGwodGhpcyxyZXF1aXJlKFwiS2xpdWJIXCIpKSIsIihmdW5jdGlvbiAocHJvY2VzcyxfX2Rpcm5hbWUpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVlcEVxdWFsID0gcmVxdWlyZSgnZGVlcC1lcXVhbCcpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCdkZWZpbmVkJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xudmFyIGhhcyA9IHJlcXVpcmUoJ2hhcycpO1xudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnaXMtcmVnZXgnKTtcbnZhciB0cmltID0gcmVxdWlyZSgnc3RyaW5nLnByb3RvdHlwZS50cmltJyk7XG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xudmFyIGZvckVhY2ggPSByZXF1aXJlKCdmb3ItZWFjaCcpO1xudmFyIGluc3BlY3QgPSByZXF1aXJlKCdvYmplY3QtaW5zcGVjdCcpO1xudmFyIGlzID0gcmVxdWlyZSgnb2JqZWN0LWlzJyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJ29iamVjdC1rZXlzJyk7XG52YXIgZXZlcnkgPSByZXF1aXJlKCdhcnJheS5wcm90b3R5cGUuZXZlcnknKTtcblxudmFyIGlzRW51bWVyYWJsZSA9IGNhbGxCb3VuZCgnT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZScpO1xudmFyIHRvTG93ZXJDYXNlID0gY2FsbEJvdW5kKCdTdHJpbmcucHJvdG90eXBlLnRvTG93ZXJDYXNlJyk7XG52YXIgaXNQcm90byA9IGNhbGxCb3VuZCgnT2JqZWN0LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mJyk7XG52YXIgJGV4ZWMgPSBjYWxsQm91bmQoJ1JlZ0V4cC5wcm90b3R5cGUuZXhlYycpO1xudmFyIG9iamVjdFRvU3RyaW5nID0gY2FsbEJvdW5kKCdPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nJyk7XG52YXIgJHNwbGl0ID0gY2FsbEJvdW5kKCdTdHJpbmcucHJvdG90eXBlLnNwbGl0Jyk7XG52YXIgJHJlcGxhY2UgPSBjYWxsQm91bmQoJ1N0cmluZy5wcm90b3R5cGUucmVwbGFjZScpO1xudmFyICRzdHJTbGljZSA9IGNhbGxCb3VuZCgnU3RyaW5nLnByb3RvdHlwZS5zbGljZScpO1xudmFyICRwdXNoID0gY2FsbEJvdW5kKCdBcnJheS5wcm90b3R5cGUucHVzaCcpO1xudmFyICRzaGlmdCA9IGNhbGxCb3VuZCgnQXJyYXkucHJvdG90eXBlLnNoaWZ0Jyk7XG5cbnZhciBuZXh0VGljayA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnXG5cdD8gc2V0SW1tZWRpYXRlXG5cdDogcHJvY2Vzcy5uZXh0VGljaztcbnZhciBzYWZlU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG52YXIgc2FmZUNsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5mdW5jdGlvbiBnZXRUZXN0QXJncyhuYW1lXywgb3B0c18sIGNiXykge1xuXHR2YXIgbmFtZSA9ICcoYW5vbnltb3VzKSc7XG5cdHZhciBvcHRzID0ge307XG5cdHZhciBjYjtcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBhcmcgPSBhcmd1bWVudHNbaV07XG5cdFx0dmFyIHQgPSB0eXBlb2YgYXJnO1xuXHRcdGlmICh0ID09PSAnc3RyaW5nJykge1xuXHRcdFx0bmFtZSA9IGFyZztcblx0XHR9IGVsc2UgaWYgKHQgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRvcHRzID0gYXJnIHx8IG9wdHM7XG5cdFx0fSBlbHNlIGlmICh0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRjYiA9IGFyZztcblx0XHR9XG5cdH1cblx0cmV0dXJuIHtcblx0XHRuYW1lOiBuYW1lLFxuXHRcdG9wdHM6IG9wdHMsXG5cdFx0Y2I6IGNiXG5cdH07XG59XG5cbmZ1bmN0aW9uIFRlc3QobmFtZV8sIG9wdHNfLCBjYl8pIHtcblx0aWYgKCEodGhpcyBpbnN0YW5jZW9mIFRlc3QpKSB7XG5cdFx0cmV0dXJuIG5ldyBUZXN0KG5hbWVfLCBvcHRzXywgY2JfKTtcblx0fVxuXG5cdHZhciBhcmdzID0gZ2V0VGVzdEFyZ3MobmFtZV8sIG9wdHNfLCBjYl8pO1xuXG5cdHRoaXMucmVhZGFibGUgPSB0cnVlO1xuXHR0aGlzLm5hbWUgPSBhcmdzLm5hbWUgfHwgJyhhbm9ueW1vdXMpJztcblx0dGhpcy5hc3NlcnRDb3VudCA9IDA7XG5cdHRoaXMucGVuZGluZ0NvdW50ID0gMDtcblx0dGhpcy5fc2tpcCA9IGFyZ3Mub3B0cy5za2lwIHx8IGZhbHNlO1xuXHR0aGlzLl90b2RvID0gYXJncy5vcHRzLnRvZG8gfHwgZmFsc2U7XG5cdHRoaXMuX3RpbWVvdXQgPSBhcmdzLm9wdHMudGltZW91dDtcblx0dGhpcy5fcGxhbiA9IHVuZGVmaW5lZDtcblx0dGhpcy5fY2IgPSBhcmdzLmNiO1xuXHR0aGlzLl9wcm9nZW55ID0gW107XG5cdHRoaXMuX3RlYXJkb3duID0gW107XG5cdHRoaXMuX29rID0gdHJ1ZTtcblx0dmFyIGRlcHRoRW52VmFyID0gcHJvY2Vzcy5lbnYuTk9ERV9UQVBFX09CSkVDVF9QUklOVF9ERVBUSDtcblx0aWYgKGFyZ3Mub3B0cy5vYmplY3RQcmludERlcHRoKSB7XG5cdFx0dGhpcy5fb2JqZWN0UHJpbnREZXB0aCA9IGFyZ3Mub3B0cy5vYmplY3RQcmludERlcHRoO1xuXHR9IGVsc2UgaWYgKGRlcHRoRW52VmFyKSB7XG5cdFx0aWYgKHRvTG93ZXJDYXNlKGRlcHRoRW52VmFyKSA9PT0gJ2luZmluaXR5Jykge1xuXHRcdFx0dGhpcy5fb2JqZWN0UHJpbnREZXB0aCA9IEluZmluaXR5O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9vYmplY3RQcmludERlcHRoID0gZGVwdGhFbnZWYXI7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHRoaXMuX29iamVjdFByaW50RGVwdGggPSA1O1xuXHR9XG5cblx0Zm9yICh2YXIgcHJvcCBpbiB0aGlzKSB7XG5cdFx0dGhpc1twcm9wXSA9IChmdW5jdGlvbiBiaW5kKHNlbGYsIHZhbCkge1xuXHRcdFx0aWYgKHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGJvdW5kKCkge1xuXHRcdFx0XHRcdHJldHVybiB2YWwuYXBwbHkoc2VsZiwgYXJndW1lbnRzKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB2YWw7XG5cdFx0fSh0aGlzLCB0aGlzW3Byb3BdKSk7XG5cdH1cbn1cblxuaW5oZXJpdHMoVGVzdCwgRXZlbnRFbWl0dGVyKTtcblxuVGVzdC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gcnVuKCkge1xuXHR0aGlzLmVtaXQoJ3ByZXJ1bicpO1xuXHRpZiAoIXRoaXMuX2NiIHx8IHRoaXMuX3NraXApIHtcblx0XHR0aGlzLl9lbmQoKTtcblx0XHRyZXR1cm47XG5cdH1cblx0aWYgKHRoaXMuX3RpbWVvdXQgIT0gbnVsbCkge1xuXHRcdHRoaXMudGltZW91dEFmdGVyKHRoaXMuX3RpbWVvdXQpO1xuXHR9XG5cblx0dmFyIGNhbGxiYWNrUmV0dXJuID0gdGhpcy5fY2IodGhpcyk7XG5cblx0aWYgKFxuXHRcdHR5cGVvZiBQcm9taXNlID09PSAnZnVuY3Rpb24nXG4gICAgICAgICYmIGNhbGxiYWNrUmV0dXJuXG4gICAgICAgICYmIHR5cGVvZiBjYWxsYmFja1JldHVybi50aGVuID09PSAnZnVuY3Rpb24nXG5cdCkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblx0XHRQcm9taXNlLnJlc29sdmUoY2FsbGJhY2tSZXR1cm4pLnRoZW4oZnVuY3Rpb24gb25SZXNvbHZlKCkge1xuXHRcdFx0aWYgKCFzZWxmLmNhbGxlZEVuZCkge1xuXHRcdFx0XHRzZWxmLmVuZCgpO1xuXHRcdFx0fVxuXHRcdH0pWydjYXRjaCddKGZ1bmN0aW9uIG9uRXJyb3IoZXJyKSB7XG5cdFx0XHRpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgfHwgb2JqZWN0VG9TdHJpbmcoZXJyKSA9PT0gJ1tvYmplY3QgRXJyb3JdJykge1xuXHRcdFx0XHRzZWxmLmlmRXJyb3IoZXJyKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuZmFpbChlcnIpO1xuXHRcdFx0fVxuXHRcdFx0c2VsZi5lbmQoKTtcblx0XHR9KTtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR0aGlzLmVtaXQoJ3J1bicpO1xufTtcblxuVGVzdC5wcm90b3R5cGUudGVzdCA9IGZ1bmN0aW9uIHRlc3QobmFtZSwgb3B0cywgY2IpIHtcblx0dmFyIHNlbGYgPSB0aGlzO1xuXHR2YXIgdCA9IG5ldyBUZXN0KG5hbWUsIG9wdHMsIGNiKTtcblx0JHB1c2godGhpcy5fcHJvZ2VueSwgdCk7XG5cdHRoaXMucGVuZGluZ0NvdW50Kys7XG5cdHRoaXMuZW1pdCgndGVzdCcsIHQpO1xuXHR0Lm9uKCdwcmVydW4nLCBmdW5jdGlvbiAoKSB7XG5cdFx0c2VsZi5hc3NlcnRDb3VudCsrO1xuXHR9KTtcblxuXHRpZiAoIXNlbGYuX3BlbmRpbmdBc3NlcnRzKCkpIHtcblx0XHRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG5cdFx0XHRzZWxmLl9lbmQoKTtcblx0XHR9KTtcblx0fVxuXG5cdG5leHRUaWNrKGZ1bmN0aW9uICgpIHtcblx0XHRpZiAoIXNlbGYuX3BsYW4gJiYgc2VsZi5wZW5kaW5nQ291bnQgPT0gc2VsZi5fcHJvZ2VueS5sZW5ndGgpIHtcblx0XHRcdHNlbGYuX2VuZCgpO1xuXHRcdH1cblx0fSk7XG59O1xuXG5UZXN0LnByb3RvdHlwZS5jb21tZW50ID0gZnVuY3Rpb24gY29tbWVudChtc2cpIHtcblx0dmFyIHRoYXQgPSB0aGlzO1xuXHRmb3JFYWNoKCRzcGxpdCh0cmltKG1zZyksICdcXG4nKSwgZnVuY3Rpb24gKGFNc2cpIHtcblx0XHR0aGF0LmVtaXQoJ3Jlc3VsdCcsICRyZXBsYWNlKHRyaW0oYU1zZyksIC9eI1xccyovLCAnJykpO1xuXHR9KTtcbn07XG5cblRlc3QucHJvdG90eXBlLnBsYW4gPSBmdW5jdGlvbiBwbGFuKG4pIHtcblx0dGhpcy5fcGxhbiA9IG47XG5cdHRoaXMuZW1pdCgncGxhbicsIG4pO1xufTtcblxuVGVzdC5wcm90b3R5cGUudGltZW91dEFmdGVyID0gZnVuY3Rpb24gdGltZW91dEFmdGVyKG1zKSB7XG5cdGlmICghbXMpIHsgdGhyb3cgbmV3IEVycm9yKCd0aW1lb3V0QWZ0ZXIgcmVxdWlyZXMgYSB0aW1lc3BhbicpOyB9XG5cdHZhciBzZWxmID0gdGhpcztcblx0dmFyIHRpbWVvdXQgPSBzYWZlU2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0c2VsZi5mYWlsKHNlbGYubmFtZSArICcgdGltZWQgb3V0IGFmdGVyICcgKyBtcyArICdtcycpO1xuXHRcdHNlbGYuZW5kKCk7XG5cdH0sIG1zKTtcblx0dGhpcy5vbmNlKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG5cdFx0c2FmZUNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0fSk7XG59O1xuXG5UZXN0LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiBlbmQoZXJyKSB7XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID49IDEgJiYgISFlcnIpIHtcblx0XHR0aGlzLmlmRXJyb3IoZXJyKTtcblx0fVxuXG5cdGlmICh0aGlzLmNhbGxlZEVuZCkge1xuXHRcdHRoaXMuZmFpbCgnLmVuZCgpIGFscmVhZHkgY2FsbGVkJyk7XG5cdH1cblx0dGhpcy5jYWxsZWRFbmQgPSB0cnVlO1xuXHR0aGlzLl9lbmQoKTtcbn07XG5cblRlc3QucHJvdG90eXBlLnRlYXJkb3duID0gZnVuY3Rpb24gdGVhcmRvd24oZm4pIHtcblx0aWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdHRoaXMuZmFpbCgndGVhcmRvd246ICcgKyBpbnNwZWN0KGZuKSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcblx0fSBlbHNlIHtcblx0XHR0aGlzLl90ZWFyZG93bi5wdXNoKGZuKTtcblx0fVxufTtcblxuVGVzdC5wcm90b3R5cGUuX2VuZCA9IGZ1bmN0aW9uIF9lbmQoZXJyKSB7XG5cdHZhciBzZWxmID0gdGhpcztcblxuXHRpZiAoIXRoaXMuX2NiICYmICF0aGlzLl90b2RvICYmICF0aGlzLl9za2lwKSB7XG5cdFx0dGhpcy5mYWlsKCcjIFRPRE8gJyArIHRoaXMubmFtZSk7XG5cdH1cblxuXHRpZiAodGhpcy5fcHJvZ2VueS5sZW5ndGgpIHtcblx0XHR2YXIgdCA9ICRzaGlmdCh0aGlzLl9wcm9nZW55KTtcblx0XHR0Lm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7IHNlbGYuX2VuZCgpOyB9KTtcblx0XHR0LnJ1bigpO1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGZ1bmN0aW9uIGNvbXBsZXRlRW5kKCkge1xuXHRcdGlmICghc2VsZi5lbmRlZCkgeyBzZWxmLmVtaXQoJ2VuZCcpOyB9XG5cdFx0dmFyIHBlbmRpbmdBc3NlcnRzID0gc2VsZi5fcGVuZGluZ0Fzc2VydHMoKTtcblx0XHRpZiAoIXNlbGYuX3BsYW5FcnJvciAmJiBzZWxmLl9wbGFuICE9PSB1bmRlZmluZWQgJiYgcGVuZGluZ0Fzc2VydHMpIHtcblx0XHRcdHNlbGYuX3BsYW5FcnJvciA9IHRydWU7XG5cdFx0XHRzZWxmLmZhaWwoJ3BsYW4gIT0gY291bnQnLCB7XG5cdFx0XHRcdGV4cGVjdGVkOiBzZWxmLl9wbGFuLFxuXHRcdFx0XHRhY3R1YWw6IHNlbGYuYXNzZXJ0Q291bnRcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRzZWxmLmVuZGVkID0gdHJ1ZTtcblx0fVxuXG5cdGZ1bmN0aW9uIG5leHQoKSB7XG5cdFx0aWYgKHNlbGYuX3RlYXJkb3duLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Y29tcGxldGVFbmQoKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dmFyIGZuID0gc2VsZi5fdGVhcmRvd24uc2hpZnQoKTtcblx0XHR2YXIgcmVzO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXMgPSBmbigpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHNlbGYuZmFpbChlKTtcblx0XHR9XG5cdFx0aWYgKHJlcyAmJiB0eXBlb2YgcmVzLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHJlcy50aGVuKG5leHQsIGZ1bmN0aW9uIChfZXJyKSB7XG5cdFx0XHRcdC8vIFRPRE86IHd0aD9cblx0XHRcdFx0ZXJyID0gZXJyIHx8IF9lcnI7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdG5leHQoKTtcbn07XG5cblRlc3QucHJvdG90eXBlLl9leGl0ID0gZnVuY3Rpb24gX2V4aXQoKSB7XG5cdGlmICh0aGlzLl9wbGFuICE9PSB1bmRlZmluZWQgJiYgIXRoaXMuX3BsYW5FcnJvciAmJiB0aGlzLmFzc2VydENvdW50ICE9PSB0aGlzLl9wbGFuKSB7XG5cdFx0dGhpcy5fcGxhbkVycm9yID0gdHJ1ZTtcblx0XHR0aGlzLmZhaWwoJ3BsYW4gIT0gY291bnQnLCB7XG5cdFx0XHRleHBlY3RlZDogdGhpcy5fcGxhbixcblx0XHRcdGFjdHVhbDogdGhpcy5hc3NlcnRDb3VudCxcblx0XHRcdGV4aXRpbmc6IHRydWVcblx0XHR9KTtcblx0fSBlbHNlIGlmICghdGhpcy5lbmRlZCkge1xuXHRcdHRoaXMuZmFpbCgndGVzdCBleGl0ZWQgd2l0aG91dCBlbmRpbmc6ICcgKyB0aGlzLm5hbWUsIHtcblx0XHRcdGV4aXRpbmc6IHRydWVcblx0XHR9KTtcblx0fVxufTtcblxuVGVzdC5wcm90b3R5cGUuX3BlbmRpbmdBc3NlcnRzID0gZnVuY3Rpb24gX3BlbmRpbmdBc3NlcnRzKCkge1xuXHRpZiAodGhpcy5fcGxhbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblx0cmV0dXJuIHRoaXMuX3BsYW4gLSAodGhpcy5fcHJvZ2VueS5sZW5ndGggKyB0aGlzLmFzc2VydENvdW50KTtcbn07XG5cblRlc3QucHJvdG90eXBlLl9hc3NlcnQgPSBmdW5jdGlvbiBhc3NlcnQob2ssIG9wdHMpIHtcblx0dmFyIHNlbGYgPSB0aGlzO1xuXHR2YXIgZXh0cmEgPSBvcHRzLmV4dHJhIHx8IHt9O1xuXG5cdG9rID0gISFvayB8fCAhIWV4dHJhLnNraXA7XG5cblx0dmFyIG5hbWUgPSBkZWZpbmVkKGV4dHJhLm1lc3NhZ2UsIG9wdHMubWVzc2FnZSwgJyh1bm5hbWVkIGFzc2VydCknKTtcblx0aWYgKHRoaXMuY2FsbGVkRW5kICYmIG9wdHMub3BlcmF0b3IgIT09ICdmYWlsJykge1xuXHRcdHRoaXMuZmFpbCgnLmVuZCgpIGFscmVhZHkgY2FsbGVkOiAnICsgbmFtZSk7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dmFyIHJlcyA9IHtcblx0XHRpZDogc2VsZi5hc3NlcnRDb3VudCsrLFxuXHRcdG9rOiBvayxcblx0XHRza2lwOiBkZWZpbmVkKGV4dHJhLnNraXAsIG9wdHMuc2tpcCksXG5cdFx0dG9kbzogZGVmaW5lZChleHRyYS50b2RvLCBvcHRzLnRvZG8sIHNlbGYuX3RvZG8pLFxuXHRcdG5hbWU6IG5hbWUsXG5cdFx0b3BlcmF0b3I6IGRlZmluZWQoZXh0cmEub3BlcmF0b3IsIG9wdHMub3BlcmF0b3IpLFxuXHRcdG9iamVjdFByaW50RGVwdGg6IHNlbGYuX29iamVjdFByaW50RGVwdGhcblx0fTtcblx0aWYgKGhhcyhvcHRzLCAnYWN0dWFsJykgfHwgaGFzKGV4dHJhLCAnYWN0dWFsJykpIHtcblx0XHRyZXMuYWN0dWFsID0gZGVmaW5lZChleHRyYS5hY3R1YWwsIG9wdHMuYWN0dWFsKTtcblx0fVxuXHRpZiAoaGFzKG9wdHMsICdleHBlY3RlZCcpIHx8IGhhcyhleHRyYSwgJ2V4cGVjdGVkJykpIHtcblx0XHRyZXMuZXhwZWN0ZWQgPSBkZWZpbmVkKGV4dHJhLmV4cGVjdGVkLCBvcHRzLmV4cGVjdGVkKTtcblx0fVxuXHR0aGlzLl9vayA9ICEhKHRoaXMuX29rICYmIG9rKTtcblxuXHRpZiAoIW9rICYmICFyZXMudG9kbykge1xuXHRcdHJlcy5lcnJvciA9IGRlZmluZWQoZXh0cmEuZXJyb3IsIG9wdHMuZXJyb3IsIG5ldyBFcnJvcihyZXMubmFtZSkpO1xuXHR9XG5cblx0aWYgKCFvaykge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKCdleGNlcHRpb24nKTtcblx0XHR2YXIgZXJyID0gJHNwbGl0KGUuc3RhY2sgfHwgJycsICdcXG4nKTtcblx0XHR2YXIgZGlyID0gX19kaXJuYW1lICsgcGF0aC5zZXA7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGVyci5sZW5ndGg7IGkrKykge1xuXHRcdFx0LypcbiAgICAgICAgICAgICAgICBTdGFjayB0cmFjZSBsaW5lcyBtYXkgcmVzZW1ibGUgb25lIG9mIHRoZSBmb2xsb3dpbmcuIFdlIG5lZWRcbiAgICAgICAgICAgICAgICB0byBjb3JyZWN0bHkgZXh0cmFjdCBhIGZ1bmN0aW9uIG5hbWUgKGlmIGFueSkgYW5kIHBhdGggLyBsaW5lXG4gICAgICAgICAgICAgICAgbnVtYmVyIGZvciBlYWNoIGxpbmUuXG5cbiAgICAgICAgICAgICAgICAgICAgYXQgbXlGdW5jdGlvbiAoL3BhdGgvdG8vZmlsZS5qczoxMjM6NDUpXG4gICAgICAgICAgICAgICAgICAgIGF0IG15RnVuY3Rpb24gKC9wYXRoL3RvL2ZpbGUub3RoZXItZXh0OjEyMzo0NSlcbiAgICAgICAgICAgICAgICAgICAgYXQgbXlGdW5jdGlvbiAoL3BhdGggdG8vZmlsZS5qczoxMjM6NDUpXG4gICAgICAgICAgICAgICAgICAgIGF0IG15RnVuY3Rpb24gKEM6XFxwYXRoXFx0b1xcZmlsZS5qczoxMjM6NDUpXG4gICAgICAgICAgICAgICAgICAgIGF0IG15RnVuY3Rpb24gKC9wYXRoL3RvL2ZpbGUuanM6MTIzKVxuICAgICAgICAgICAgICAgICAgICBhdCBUZXN0Ljxhbm9ueW1vdXM+ICgvcGF0aC90by9maWxlLmpzOjEyMzo0NSlcbiAgICAgICAgICAgICAgICAgICAgYXQgVGVzdC5ib3VuZCBbYXMgcnVuXSAoL3BhdGgvdG8vZmlsZS5qczoxMjM6NDUpXG4gICAgICAgICAgICAgICAgICAgIGF0IC9wYXRoL3RvL2ZpbGUuanM6MTIzOjQ1XG5cbiAgICAgICAgICAgICAgICBSZWdleCBoYXMgdGhyZWUgcGFydHMuIEZpcnN0IGlzIG5vbi1jYXB0dXJpbmcgZ3JvdXAgZm9yICdhdCAnXG4gICAgICAgICAgICAgICAgKHBsdXMgYW55dGhpbmcgcHJlY2VkaW5nIGl0KS5cblxuICAgICAgICAgICAgICAgICAgICAvXig/OlteXFxzXSpcXHMqXFxiYXRcXHMrKS9cblxuICAgICAgICAgICAgICAgIFNlY29uZCBjYXB0dXJlcyBmdW5jdGlvbiBjYWxsIGRlc2NyaXB0aW9uIChvcHRpb25hbCkuIFRoaXMgaXNcbiAgICAgICAgICAgICAgICBub3QgbmVjZXNzYXJpbHkgYSB2YWxpZCBKUyBmdW5jdGlvbiBuYW1lLCBidXQganVzdCB3aGF0IHRoZVxuICAgICAgICAgICAgICAgIHN0YWNrIHRyYWNlIGlzIHVzaW5nIHRvIHJlcHJlc2VudCBhIGZ1bmN0aW9uIGNhbGwuIEl0IG1heSBsb29rXG4gICAgICAgICAgICAgICAgbGlrZSBgPGFub255bW91cz5gIG9yICdUZXN0LmJvdW5kIFthcyBydW5dJy5cblxuICAgICAgICAgICAgICAgIEZvciBvdXIgcHVycG9zZXMsIHdlIGFzc3VtZSB0aGF0LCBpZiB0aGVyZSBpcyBhIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgbmFtZSwgaXQncyBldmVyeXRoaW5nIGxlYWRpbmcgdXAgdG8gdGhlIGZpcnN0IG9wZW5cbiAgICAgICAgICAgICAgICBwYXJlbnRoZXNlcyAodHJpbW1lZCkgYmVmb3JlIG91ciBwYXRobmFtZS5cblxuICAgICAgICAgICAgICAgICAgICAvKD86KC4qKVxccytcXCgpPy9cblxuICAgICAgICAgICAgICAgIExhc3QgcGFydCBjYXB0dXJlcyBmaWxlIHBhdGggcGx1cyBsaW5lIG5vIChhbmQgb3B0aW9uYWxcbiAgICAgICAgICAgICAgICBjb2x1bW4gbm8pLlxuXG4gICAgICAgICAgICAgICAgICAgIC8oKD86XFwvfFthLXpBLVpdOlxcXFwpW146XFwpXSs6KFxcZCspKD86OihcXGQrKSk/KVxcKT8vXG4gICAgICAgICAgICAqL1xuXHRcdFx0dmFyIHJlID0gL14oPzpbXlxcc10qXFxzKlxcYmF0XFxzKykoPzooLiopXFxzK1xcKCk/KCg/OlxcL3xbYS16QS1aXTpcXFxcKVteOildKzooXFxkKykoPzo6KFxcZCspKT8pXFwpPyQvO1xuXHRcdFx0dmFyIGxpbmVXaXRoVG9rZW5zID0gJHJlcGxhY2UoJHJlcGxhY2UoZXJyW2ldLCBwcm9jZXNzLmN3ZCgpLCAnLyRDV0QnKSwgX19kaXJuYW1lLCAnLyRURVNUJyk7XG5cdFx0XHR2YXIgbSA9IHJlLmV4ZWMobGluZVdpdGhUb2tlbnMpO1xuXG5cdFx0XHRpZiAoIW0pIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBjYWxsRGVzY3JpcHRpb24gPSBtWzFdIHx8ICc8YW5vbnltb3VzPic7XG5cdFx0XHR2YXIgZmlsZVBhdGggPSAkcmVwbGFjZSgkcmVwbGFjZShtWzJdLCAnLyRDV0QnLCBwcm9jZXNzLmN3ZCgpKSwgJy8kVEVTVCcsIF9fZGlybmFtZSk7XG5cblx0XHRcdGlmICgkc3RyU2xpY2UoZmlsZVBhdGgsIDAsIGRpci5sZW5ndGgpID09PSBkaXIpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZ1bmN0aW9uIGNhbGwgZGVzY3JpcHRpb24gbWF5IG5vdCAoanVzdCkgYmUgYSBmdW5jdGlvbiBuYW1lLlxuXHRcdFx0Ly8gVHJ5IHRvIGV4dHJhY3QgZnVuY3Rpb24gbmFtZSBieSBsb29raW5nIGF0IGZpcnN0IFwid29yZFwiIG9ubHkuXG5cdFx0XHRyZXMuZnVuY3Rpb25OYW1lID0gJHNwbGl0KGNhbGxEZXNjcmlwdGlvbiwgL1xccysvKVswXTtcblx0XHRcdHJlcy5maWxlID0gZmlsZVBhdGg7XG5cdFx0XHRyZXMubGluZSA9IE51bWJlcihtWzNdKTtcblx0XHRcdGlmIChtWzRdKSB7IHJlcy5jb2x1bW4gPSBOdW1iZXIobVs0XSk7IH1cblxuXHRcdFx0cmVzLmF0ID0gY2FsbERlc2NyaXB0aW9uICsgJyAoJyArIGZpbGVQYXRoICsgJyknO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0c2VsZi5lbWl0KCdyZXN1bHQnLCByZXMpO1xuXG5cdHZhciBwZW5kaW5nQXNzZXJ0cyA9IHNlbGYuX3BlbmRpbmdBc3NlcnRzKCk7XG5cdGlmICghcGVuZGluZ0Fzc2VydHMpIHtcblx0XHRpZiAoZXh0cmEuZXhpdGluZykge1xuXHRcdFx0c2VsZi5fZW5kKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5leHRUaWNrKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0c2VsZi5fZW5kKCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRpZiAoIXNlbGYuX3BsYW5FcnJvciAmJiBwZW5kaW5nQXNzZXJ0cyA8IDApIHtcblx0XHRzZWxmLl9wbGFuRXJyb3IgPSB0cnVlO1xuXHRcdHNlbGYuZmFpbCgncGxhbiAhPSBjb3VudCcsIHtcblx0XHRcdGV4cGVjdGVkOiBzZWxmLl9wbGFuLFxuXHRcdFx0YWN0dWFsOiBzZWxmLl9wbGFuIC0gcGVuZGluZ0Fzc2VydHNcblx0XHR9KTtcblx0fVxufTtcblxuVGVzdC5wcm90b3R5cGUuZmFpbCA9IGZ1bmN0aW9uIGZhaWwobXNnLCBleHRyYSkge1xuXHR0aGlzLl9hc3NlcnQoZmFsc2UsIHtcblx0XHRtZXNzYWdlOiBtc2csXG5cdFx0b3BlcmF0b3I6ICdmYWlsJyxcblx0XHRleHRyYTogZXh0cmFcblx0fSk7XG59O1xuXG5UZXN0LnByb3RvdHlwZS5wYXNzID0gZnVuY3Rpb24gcGFzcyhtc2csIGV4dHJhKSB7XG5cdHRoaXMuX2Fzc2VydCh0cnVlLCB7XG5cdFx0bWVzc2FnZTogbXNnLFxuXHRcdG9wZXJhdG9yOiAncGFzcycsXG5cdFx0ZXh0cmE6IGV4dHJhXG5cdH0pO1xufTtcblxuVGVzdC5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uIHNraXAobXNnLCBleHRyYSkge1xuXHR0aGlzLl9hc3NlcnQodHJ1ZSwge1xuXHRcdG1lc3NhZ2U6IG1zZyxcblx0XHRvcGVyYXRvcjogJ3NraXAnLFxuXHRcdHNraXA6IHRydWUsXG5cdFx0ZXh0cmE6IGV4dHJhXG5cdH0pO1xufTtcblxudmFyIHRlc3RBc3NlcnQgPSBmdW5jdGlvbiBhc3NlcnQodmFsdWUsIG1zZywgZXh0cmEpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBmdW5jLXN0eWxlXG5cdHRoaXMuX2Fzc2VydCh2YWx1ZSwge1xuXHRcdG1lc3NhZ2U6IGRlZmluZWQobXNnLCAnc2hvdWxkIGJlIHRydXRoeScpLFxuXHRcdG9wZXJhdG9yOiAnb2snLFxuXHRcdGV4cGVjdGVkOiB0cnVlLFxuXHRcdGFjdHVhbDogdmFsdWUsXG5cdFx0ZXh0cmE6IGV4dHJhXG5cdH0pO1xufTtcblRlc3QucHJvdG90eXBlLm9rXG49IFRlc3QucHJvdG90eXBlWyd0cnVlJ11cbj0gVGVzdC5wcm90b3R5cGUuYXNzZXJ0XG49IHRlc3RBc3NlcnQ7XG5cbmZ1bmN0aW9uIG5vdE9LKHZhbHVlLCBtc2csIGV4dHJhKSB7XG5cdHRoaXMuX2Fzc2VydCghdmFsdWUsIHtcblx0XHRtZXNzYWdlOiBkZWZpbmVkKG1zZywgJ3Nob3VsZCBiZSBmYWxzeScpLFxuXHRcdG9wZXJhdG9yOiAnbm90T2snLFxuXHRcdGV4cGVjdGVkOiBmYWxzZSxcblx0XHRhY3R1YWw6IHZhbHVlLFxuXHRcdGV4dHJhOiBleHRyYVxuXHR9KTtcbn1cblRlc3QucHJvdG90eXBlLm5vdE9rXG49IFRlc3QucHJvdG90eXBlWydmYWxzZSddXG49IFRlc3QucHJvdG90eXBlLm5vdG9rXG49IG5vdE9LO1xuXG5mdW5jdGlvbiBlcnJvcihlcnIsIG1zZywgZXh0cmEpIHtcblx0dGhpcy5fYXNzZXJ0KCFlcnIsIHtcblx0XHRtZXNzYWdlOiBkZWZpbmVkKG1zZywgU3RyaW5nKGVycikpLFxuXHRcdG9wZXJhdG9yOiAnZXJyb3InLFxuXHRcdGVycm9yOiBlcnIsXG5cdFx0ZXh0cmE6IGV4dHJhXG5cdH0pO1xufVxuVGVzdC5wcm90b3R5cGUuZXJyb3Jcbj0gVGVzdC5wcm90b3R5cGUuaWZFcnJvclxuPSBUZXN0LnByb3RvdHlwZS5pZkVyclxuPSBUZXN0LnByb3RvdHlwZS5pZmVycm9yXG49IGVycm9yO1xuXG5mdW5jdGlvbiBzdHJpY3RFcXVhbChhLCBiLCBtc2csIGV4dHJhKSB7XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3R3byBhcmd1bWVudHMgbXVzdCBiZSBwcm92aWRlZCB0byBjb21wYXJlJyk7XG5cdH1cblx0dGhpcy5fYXNzZXJ0KGlzKGEsIGIpLCB7XG5cdFx0bWVzc2FnZTogZGVmaW5lZChtc2csICdzaG91bGQgYmUgc3RyaWN0bHkgZXF1YWwnKSxcblx0XHRvcGVyYXRvcjogJ2VxdWFsJyxcblx0XHRhY3R1YWw6IGEsXG5cdFx0ZXhwZWN0ZWQ6IGIsXG5cdFx0ZXh0cmE6IGV4dHJhXG5cdH0pO1xufVxuVGVzdC5wcm90b3R5cGUuZXF1YWxcbj0gVGVzdC5wcm90b3R5cGUuZXF1YWxzXG49IFRlc3QucHJvdG90eXBlLmlzRXF1YWxcbj0gVGVzdC5wcm90b3R5cGUuc3RyaWN0RXF1YWxcbj0gVGVzdC5wcm90b3R5cGUuc3RyaWN0RXF1YWxzXG49IFRlc3QucHJvdG90eXBlLmlzXG49IHN0cmljdEVxdWFsO1xuXG5mdW5jdGlvbiBub3RTdHJpY3RFcXVhbChhLCBiLCBtc2csIGV4dHJhKSB7XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3R3byBhcmd1bWVudHMgbXVzdCBiZSBwcm92aWRlZCB0byBjb21wYXJlJyk7XG5cdH1cblx0dGhpcy5fYXNzZXJ0KCFpcyhhLCBiKSwge1xuXHRcdG1lc3NhZ2U6IGRlZmluZWQobXNnLCAnc2hvdWxkIG5vdCBiZSBzdHJpY3RseSBlcXVhbCcpLFxuXHRcdG9wZXJhdG9yOiAnbm90RXF1YWwnLFxuXHRcdGFjdHVhbDogYSxcblx0XHRleHBlY3RlZDogYixcblx0XHRleHRyYTogZXh0cmFcblx0fSk7XG59XG5cblRlc3QucHJvdG90eXBlLm5vdEVxdWFsXG49IFRlc3QucHJvdG90eXBlLm5vdEVxdWFsc1xuPSBUZXN0LnByb3RvdHlwZS5pc05vdEVxdWFsXG49IFRlc3QucHJvdG90eXBlLmRvZXNOb3RFcXVhbFxuPSBUZXN0LnByb3RvdHlwZS5pc0luZXF1YWxcbj0gVGVzdC5wcm90b3R5cGUubm90U3RyaWN0RXF1YWxcbj0gVGVzdC5wcm90b3R5cGUubm90U3RyaWN0RXF1YWxzXG49IFRlc3QucHJvdG90eXBlLmlzTm90XG49IFRlc3QucHJvdG90eXBlLm5vdFxuPSBub3RTdHJpY3RFcXVhbDtcblxuZnVuY3Rpb24gbG9vc2VFcXVhbChhLCBiLCBtc2csIGV4dHJhKSB7XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3R3byBhcmd1bWVudHMgbXVzdCBiZSBwcm92aWRlZCB0byBjb21wYXJlJyk7XG5cdH1cblx0dGhpcy5fYXNzZXJ0KGEgPT0gYiwge1xuXHRcdG1lc3NhZ2U6IGRlZmluZWQobXNnLCAnc2hvdWxkIGJlIGxvb3NlbHkgZXF1YWwnKSxcblx0XHRvcGVyYXRvcjogJ2xvb3NlRXF1YWwnLFxuXHRcdGFjdHVhbDogYSxcblx0XHRleHBlY3RlZDogYixcblx0XHRleHRyYTogZXh0cmFcblx0fSk7XG59XG5cblRlc3QucHJvdG90eXBlLmxvb3NlRXF1YWxcbj0gVGVzdC5wcm90b3R5cGUubG9vc2VFcXVhbHNcbj0gbG9vc2VFcXVhbDtcblxuZnVuY3Rpb24gbm90TG9vc2VFcXVhbChhLCBiLCBtc2csIGV4dHJhKSB7XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3R3byBhcmd1bWVudHMgbXVzdCBiZSBwcm92aWRlZCB0byBjb21wYXJlJyk7XG5cdH1cblx0dGhpcy5fYXNzZXJ0KGEgIT0gYiwge1xuXHRcdG1lc3NhZ2U6IGRlZmluZWQobXNnLCAnc2hvdWxkIG5vdCBiZSBsb29zZWx5IGVxdWFsJyksXG5cdFx0b3BlcmF0b3I6ICdub3RMb29zZUVxdWFsJyxcblx0XHRhY3R1YWw6IGEsXG5cdFx0ZXhwZWN0ZWQ6IGIsXG5cdFx0ZXh0cmE6IGV4dHJhXG5cdH0pO1xufVxuVGVzdC5wcm90b3R5cGUubm90TG9vc2VFcXVhbFxuPSBUZXN0LnByb3RvdHlwZS5ub3RMb29zZUVxdWFsc1xuPSBub3RMb29zZUVxdWFsO1xuXG5mdW5jdGlvbiB0YXBlRGVlcEVxdWFsKGEsIGIsIG1zZywgZXh0cmEpIHtcblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcigndHdvIGFyZ3VtZW50cyBtdXN0IGJlIHByb3ZpZGVkIHRvIGNvbXBhcmUnKTtcblx0fVxuXHR0aGlzLl9hc3NlcnQoZGVlcEVxdWFsKGEsIGIsIHsgc3RyaWN0OiB0cnVlIH0pLCB7XG5cdFx0bWVzc2FnZTogZGVmaW5lZChtc2csICdzaG91bGQgYmUgZGVlcGx5IGVxdWl2YWxlbnQnKSxcblx0XHRvcGVyYXRvcjogJ2RlZXBFcXVhbCcsXG5cdFx0YWN0dWFsOiBhLFxuXHRcdGV4cGVjdGVkOiBiLFxuXHRcdGV4dHJhOiBleHRyYVxuXHR9KTtcbn1cblRlc3QucHJvdG90eXBlLmRlZXBFcXVhbFxuPSBUZXN0LnByb3RvdHlwZS5kZWVwRXF1YWxzXG49IFRlc3QucHJvdG90eXBlLmlzRXF1aXZhbGVudFxuPSBUZXN0LnByb3RvdHlwZS5zYW1lXG49IHRhcGVEZWVwRXF1YWw7XG5cbmZ1bmN0aW9uIG5vdERlZXBFcXVhbChhLCBiLCBtc2csIGV4dHJhKSB7XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3R3byBhcmd1bWVudHMgbXVzdCBiZSBwcm92aWRlZCB0byBjb21wYXJlJyk7XG5cdH1cblx0dGhpcy5fYXNzZXJ0KCFkZWVwRXF1YWwoYSwgYiwgeyBzdHJpY3Q6IHRydWUgfSksIHtcblx0XHRtZXNzYWdlOiBkZWZpbmVkKG1zZywgJ3Nob3VsZCBub3QgYmUgZGVlcGx5IGVxdWl2YWxlbnQnKSxcblx0XHRvcGVyYXRvcjogJ25vdERlZXBFcXVhbCcsXG5cdFx0YWN0dWFsOiBhLFxuXHRcdGV4cGVjdGVkOiBiLFxuXHRcdGV4dHJhOiBleHRyYVxuXHR9KTtcbn1cblRlc3QucHJvdG90eXBlLm5vdERlZXBFcXVhbFxuPSBUZXN0LnByb3RvdHlwZS5ub3REZWVwRXF1YWxzXG49IFRlc3QucHJvdG90eXBlLm5vdEVxdWl2YWxlbnRcbj0gVGVzdC5wcm90b3R5cGUubm90RGVlcGx5XG49IFRlc3QucHJvdG90eXBlLm5vdFNhbWVcbj0gVGVzdC5wcm90b3R5cGUuaXNOb3REZWVwRXF1YWxcbj0gVGVzdC5wcm90b3R5cGUuaXNOb3REZWVwbHlcbj0gVGVzdC5wcm90b3R5cGUuaXNOb3RFcXVpdmFsZW50XG49IFRlc3QucHJvdG90eXBlLmlzSW5lcXVpdmFsZW50XG49IG5vdERlZXBFcXVhbDtcblxuZnVuY3Rpb24gZGVlcExvb3NlRXF1YWwoYSwgYiwgbXNnLCBleHRyYSkge1xuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCd0d28gYXJndW1lbnRzIG11c3QgYmUgcHJvdmlkZWQgdG8gY29tcGFyZScpO1xuXHR9XG5cdHRoaXMuX2Fzc2VydChkZWVwRXF1YWwoYSwgYiksIHtcblx0XHRtZXNzYWdlOiBkZWZpbmVkKG1zZywgJ3Nob3VsZCBiZSBsb29zZWx5IGRlZXBseSBlcXVpdmFsZW50JyksXG5cdFx0b3BlcmF0b3I6ICdkZWVwTG9vc2VFcXVhbCcsXG5cdFx0YWN0dWFsOiBhLFxuXHRcdGV4cGVjdGVkOiBiLFxuXHRcdGV4dHJhOiBleHRyYVxuXHR9KTtcbn1cblxuVGVzdC5wcm90b3R5cGUuZGVlcExvb3NlRXF1YWxcbj0gZGVlcExvb3NlRXF1YWw7XG5cbmZ1bmN0aW9uIG5vdERlZXBMb29zZUVxdWFsKGEsIGIsIG1zZywgZXh0cmEpIHtcblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcigndHdvIGFyZ3VtZW50cyBtdXN0IGJlIHByb3ZpZGVkIHRvIGNvbXBhcmUnKTtcblx0fVxuXHR0aGlzLl9hc3NlcnQoIWRlZXBFcXVhbChhLCBiKSwge1xuXHRcdG1lc3NhZ2U6IGRlZmluZWQobXNnLCAnc2hvdWxkIG5vdCBiZSBsb29zZWx5IGRlZXBseSBlcXVpdmFsZW50JyksXG5cdFx0b3BlcmF0b3I6ICdub3REZWVwTG9vc2VFcXVhbCcsXG5cdFx0YWN0dWFsOiBhLFxuXHRcdGV4cGVjdGVkOiBiLFxuXHRcdGV4dHJhOiBleHRyYVxuXHR9KTtcbn1cblRlc3QucHJvdG90eXBlLm5vdERlZXBMb29zZUVxdWFsXG49IG5vdERlZXBMb29zZUVxdWFsO1xuXG5UZXN0LnByb3RvdHlwZVsndGhyb3dzJ10gPSBmdW5jdGlvbiAoZm4sIGV4cGVjdGVkLCBtc2csIGV4dHJhKSB7XG5cdGlmICh0eXBlb2YgZXhwZWN0ZWQgPT09ICdzdHJpbmcnKSB7XG5cdFx0bXNnID0gZXhwZWN0ZWQ7XG5cdFx0ZXhwZWN0ZWQgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHR2YXIgY2F1Z2h0O1xuXG5cdHRyeSB7XG5cdFx0Zm4oKTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Y2F1Z2h0ID0geyBlcnJvcjogZXJyIH07XG5cdFx0aWYgKE9iamVjdChlcnIpID09PSBlcnIgJiYgKCFpc0VudW1lcmFibGUoZXJyLCAnbWVzc2FnZScpIHx8ICFoYXMoZXJyLCAnbWVzc2FnZScpKSkge1xuXHRcdFx0dmFyIG1lc3NhZ2UgPSBlcnIubWVzc2FnZTtcblx0XHRcdGRlbGV0ZSBlcnIubWVzc2FnZTtcblx0XHRcdGVyci5tZXNzYWdlID0gbWVzc2FnZTtcblx0XHR9XG5cdH1cblxuXHR2YXIgcGFzc2VkID0gY2F1Z2h0O1xuXG5cdGlmIChjYXVnaHQpIHtcblx0XHRpZiAodHlwZW9mIGV4cGVjdGVkID09PSAnc3RyaW5nJyAmJiBjYXVnaHQuZXJyb3IgJiYgY2F1Z2h0LmVycm9yLm1lc3NhZ2UgPT09IGV4cGVjdGVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJlcnJvci9tZXNzYWdlXCIgYXJndW1lbnQgaXMgYW1iaWd1b3VzLiBUaGUgZXJyb3IgbWVzc2FnZSAnICsgaW5zcGVjdChleHBlY3RlZCkgKyAnIGlzIGlkZW50aWNhbCB0byB0aGUgbWVzc2FnZS4nKTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiBleHBlY3RlZCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0aWYgKHR5cGVvZiBleHBlY3RlZC5wcm90b3R5cGUgIT09ICd1bmRlZmluZWQnICYmIGNhdWdodC5lcnJvciBpbnN0YW5jZW9mIGV4cGVjdGVkKSB7XG5cdFx0XHRcdHBhc3NlZCA9IHRydWU7XG5cdFx0XHR9IGVsc2UgaWYgKGlzUHJvdG8oRXJyb3IsIGV4cGVjdGVkKSkge1xuXHRcdFx0XHRwYXNzZWQgPSBmYWxzZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHBhc3NlZCA9IGV4cGVjdGVkLmNhbGwoe30sIGNhdWdodC5lcnJvcikgPT09IHRydWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChpc1JlZ0V4cChleHBlY3RlZCkpIHtcblx0XHRcdHBhc3NlZCA9ICRleGVjKGV4cGVjdGVkLCBjYXVnaHQuZXJyb3IpICE9PSBudWxsO1xuXHRcdFx0ZXhwZWN0ZWQgPSBpbnNwZWN0KGV4cGVjdGVkKTtcblx0XHR9IGVsc2UgaWYgKGV4cGVjdGVkICYmIHR5cGVvZiBleHBlY3RlZCA9PT0gJ29iamVjdCcpIHsgLy8gSGFuZGxlIHZhbGlkYXRpb24gb2JqZWN0cy5cblx0XHRcdHZhciBrZXlzID0gb2JqZWN0S2V5cyhleHBlY3RlZCk7XG5cdFx0XHQvLyBTcGVjaWFsIGhhbmRsZSBlcnJvcnMgdG8gbWFrZSBzdXJlIHRoZSBuYW1lIGFuZCB0aGUgbWVzc2FnZSBhcmUgY29tcGFyZWQgYXMgd2VsbC5cblx0XHRcdGlmIChleHBlY3RlZCBpbnN0YW5jZW9mIEVycm9yKSB7XG5cdFx0XHRcdCRwdXNoKGtleXMsICduYW1lJywgJ21lc3NhZ2UnKTtcblx0XHRcdH0gZWxzZSBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignYHRocm93c2AgdmFsaWRhdGlvbiBvYmplY3QgbXVzdCBub3QgYmUgZW1wdHknKTtcblx0XHRcdH1cblx0XHRcdHBhc3NlZCA9IGV2ZXJ5KGtleXMsIGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiBjYXVnaHQuZXJyb3Jba2V5XSA9PT0gJ3N0cmluZycgJiYgaXNSZWdFeHAoZXhwZWN0ZWRba2V5XSkgJiYgJGV4ZWMoZXhwZWN0ZWRba2V5XSwgY2F1Z2h0LmVycm9yW2tleV0pICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGtleSBpbiBjYXVnaHQuZXJyb3IgJiYgZGVlcEVxdWFsKGNhdWdodC5lcnJvcltrZXldLCBleHBlY3RlZFtrZXldLCB7IHN0cmljdDogdHJ1ZSB9KSkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdHRoaXMuX2Fzc2VydCghIXBhc3NlZCwge1xuXHRcdG1lc3NhZ2U6IGRlZmluZWQobXNnLCAnc2hvdWxkIHRocm93JyksXG5cdFx0b3BlcmF0b3I6ICd0aHJvd3MnLFxuXHRcdGFjdHVhbDogY2F1Z2h0ICYmIGNhdWdodC5lcnJvcixcblx0XHRleHBlY3RlZDogZXhwZWN0ZWQsXG5cdFx0ZXJyb3I6ICFwYXNzZWQgJiYgY2F1Z2h0ICYmIGNhdWdodC5lcnJvcixcblx0XHRleHRyYTogZXh0cmFcblx0fSk7XG59O1xuXG5UZXN0LnByb3RvdHlwZS5kb2VzTm90VGhyb3cgPSBmdW5jdGlvbiBkb2VzTm90VGhyb3coZm4sIGV4cGVjdGVkLCBtc2csIGV4dHJhKSB7XG5cdGlmICh0eXBlb2YgZXhwZWN0ZWQgPT09ICdzdHJpbmcnKSB7XG5cdFx0bXNnID0gZXhwZWN0ZWQ7XG5cdFx0ZXhwZWN0ZWQgPSB1bmRlZmluZWQ7XG5cdH1cblx0dmFyIGNhdWdodDtcblx0dHJ5IHtcblx0XHRmbigpO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRjYXVnaHQgPSB7IGVycm9yOiBlcnIgfTtcblx0fVxuXHR0aGlzLl9hc3NlcnQoIWNhdWdodCwge1xuXHRcdG1lc3NhZ2U6IGRlZmluZWQobXNnLCAnc2hvdWxkIG5vdCB0aHJvdycpLFxuXHRcdG9wZXJhdG9yOiAndGhyb3dzJyxcblx0XHRhY3R1YWw6IGNhdWdodCAmJiBjYXVnaHQuZXJyb3IsXG5cdFx0ZXhwZWN0ZWQ6IGV4cGVjdGVkLFxuXHRcdGVycm9yOiBjYXVnaHQgJiYgY2F1Z2h0LmVycm9yLFxuXHRcdGV4dHJhOiBleHRyYVxuXHR9KTtcbn07XG5cblRlc3QucHJvdG90eXBlLm1hdGNoID0gZnVuY3Rpb24gbWF0Y2goc3RyaW5nLCByZWdleHAsIG1zZywgZXh0cmEpIHtcblx0aWYgKCFpc1JlZ0V4cChyZWdleHApKSB7XG5cdFx0dGhpcy5fYXNzZXJ0KGZhbHNlLCB7XG5cdFx0XHRtZXNzYWdlOiBkZWZpbmVkKG1zZywgJ1RoZSBcInJlZ2V4cFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgUmVnRXhwLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgcmVnZXhwICsgJyAoJyArIGluc3BlY3QocmVnZXhwKSArICcpJyksXG5cdFx0XHRvcGVyYXRvcjogJ21hdGNoJyxcblx0XHRcdGFjdHVhbDogb2JqZWN0VG9TdHJpbmcocmVnZXhwKSxcblx0XHRcdGV4cGVjdGVkOiAnW29iamVjdCBSZWdFeHBdJyxcblx0XHRcdGV4dHJhOiBleHRyYVxuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhpcy5fYXNzZXJ0KGZhbHNlLCB7XG5cdFx0XHRtZXNzYWdlOiBkZWZpbmVkKG1zZywgJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBzdHJpbmcgKyAnICgnICsgaW5zcGVjdChzdHJpbmcpICsgJyknKSxcblx0XHRcdG9wZXJhdG9yOiAnbWF0Y2gnLFxuXHRcdFx0YWN0dWFsOiBzdHJpbmcgPT09IG51bGwgPyBudWxsIDogdHlwZW9mIHN0cmluZyxcblx0XHRcdGV4cGVjdGVkOiAnc3RyaW5nJyxcblx0XHRcdGV4dHJhOiBleHRyYVxuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHZhciBtYXRjaGVzID0gJGV4ZWMocmVnZXhwLCBzdHJpbmcpICE9PSBudWxsO1xuXHRcdHZhciBtZXNzYWdlID0gZGVmaW5lZChcblx0XHRcdG1zZyxcblx0XHRcdCdUaGUgaW5wdXQgJyArIChtYXRjaGVzID8gJ21hdGNoZWQnIDogJ2RpZCBub3QgbWF0Y2gnKSArICcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiAnICsgaW5zcGVjdChyZWdleHApICsgJy4gSW5wdXQ6ICcgKyBpbnNwZWN0KHN0cmluZylcblx0XHQpO1xuXHRcdHRoaXMuX2Fzc2VydChtYXRjaGVzLCB7XG5cdFx0XHRtZXNzYWdlOiBtZXNzYWdlLFxuXHRcdFx0b3BlcmF0b3I6ICdtYXRjaCcsXG5cdFx0XHRhY3R1YWw6IHN0cmluZyxcblx0XHRcdGV4cGVjdGVkOiByZWdleHAsXG5cdFx0XHRleHRyYTogZXh0cmFcblx0XHR9KTtcblx0fVxufTtcblxuVGVzdC5wcm90b3R5cGUuZG9lc05vdE1hdGNoID0gZnVuY3Rpb24gZG9lc05vdE1hdGNoKHN0cmluZywgcmVnZXhwLCBtc2csIGV4dHJhKSB7XG5cdGlmICghaXNSZWdFeHAocmVnZXhwKSkge1xuXHRcdHRoaXMuX2Fzc2VydChmYWxzZSwge1xuXHRcdFx0bWVzc2FnZTogZGVmaW5lZChtc2csICdUaGUgXCJyZWdleHBcIiBhcmd1bWVudCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFJlZ0V4cC4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHJlZ2V4cCArICcgKCcgKyBpbnNwZWN0KHJlZ2V4cCkgKyAnKScpLFxuXHRcdFx0b3BlcmF0b3I6ICdkb2VzTm90TWF0Y2gnLFxuXHRcdFx0YWN0dWFsOiBvYmplY3RUb1N0cmluZyhyZWdleHApLFxuXHRcdFx0ZXhwZWN0ZWQ6ICdbb2JqZWN0IFJlZ0V4cF0nLFxuXHRcdFx0ZXh0cmE6IGV4dHJhXG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcblx0XHR0aGlzLl9hc3NlcnQoZmFsc2UsIHtcblx0XHRcdG1lc3NhZ2U6IGRlZmluZWQobXNnLCAnVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHN0cmluZyArICcgKCcgKyBpbnNwZWN0KHN0cmluZykgKyAnKScpLFxuXHRcdFx0b3BlcmF0b3I6ICdkb2VzTm90TWF0Y2gnLFxuXHRcdFx0YWN0dWFsOiBzdHJpbmcgPT09IG51bGwgPyBudWxsIDogdHlwZW9mIHN0cmluZyxcblx0XHRcdGV4cGVjdGVkOiAnc3RyaW5nJyxcblx0XHRcdGV4dHJhOiBleHRyYVxuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHZhciBtYXRjaGVzID0gJGV4ZWMocmVnZXhwLCBzdHJpbmcpICE9PSBudWxsO1xuXHRcdHZhciBtZXNzYWdlID0gZGVmaW5lZChcblx0XHRcdG1zZyxcblx0XHRcdCdUaGUgaW5wdXQgJyArIChtYXRjaGVzID8gJ3dhcyBleHBlY3RlZCB0byBub3QgbWF0Y2gnIDogJ2RpZCBub3QgbWF0Y2gnKSArICcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiAnICsgaW5zcGVjdChyZWdleHApICsgJy4gSW5wdXQ6ICcgKyBpbnNwZWN0KHN0cmluZylcblx0XHQpO1xuXHRcdHRoaXMuX2Fzc2VydCghbWF0Y2hlcywge1xuXHRcdFx0bWVzc2FnZTogbWVzc2FnZSxcblx0XHRcdG9wZXJhdG9yOiAnZG9lc05vdE1hdGNoJyxcblx0XHRcdGFjdHVhbDogc3RyaW5nLFxuXHRcdFx0ZXhwZWN0ZWQ6IHJlZ2V4cCxcblx0XHRcdGV4dHJhOiBleHRyYVxuXHRcdH0pO1xuXHR9XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcblRlc3Quc2tpcCA9IGZ1bmN0aW9uIHNraXAobmFtZV8sIF9vcHRzLCBfY2IpIHtcblx0dmFyIGFyZ3MgPSBnZXRUZXN0QXJncy5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuXHRhcmdzLm9wdHMuc2tpcCA9IHRydWU7XG5cdHJldHVybiBuZXcgVGVzdChhcmdzLm5hbWUsIGFyZ3Mub3B0cywgYXJncy5jYik7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRlc3Q7XG5cbi8vIHZpbTogc2V0IHNvZnR0YWJzdG9wPTQgc2hpZnR3aWR0aD00OlxuXG59KS5jYWxsKHRoaXMscmVxdWlyZShcIktsaXViSFwiKSxcIi8uLi8uLi9saWJcIikiLCIndXNlIHN0cmljdCc7XG5cbnZhciBJc0NhbGxhYmxlID0gcmVxdWlyZSgnZXMtYWJzdHJhY3QvMjAyMS9Jc0NhbGxhYmxlJyk7XG52YXIgVG9PYmplY3QgPSByZXF1aXJlKCdlcy1hYnN0cmFjdC8yMDIxL1RvT2JqZWN0Jyk7XG52YXIgVG9VaW50MzIgPSByZXF1aXJlKCdlcy1hYnN0cmFjdC8yMDIxL1RvVWludDMyJyk7XG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xudmFyIGlzU3RyaW5nID0gcmVxdWlyZSgnaXMtc3RyaW5nJyk7XG5cbi8vIENoZWNrIGZhaWx1cmUgb2YgYnktaW5kZXggYWNjZXNzIG9mIHN0cmluZyBjaGFyYWN0ZXJzIChJRSA8IDkpIGFuZCBmYWlsdXJlIG9mIGAwIGluIGJveGVkU3RyaW5nYCAoUmhpbm8pXG52YXIgYm94ZWRTdHJpbmcgPSBPYmplY3QoJ2EnKTtcbnZhciBzcGxpdFN0cmluZyA9IGJveGVkU3RyaW5nWzBdICE9PSAnYScgfHwgISgwIGluIGJveGVkU3RyaW5nKTtcblxudmFyICRzcGxpdCA9IGNhbGxCb3VuZCgnU3RyaW5nLnByb3RvdHlwZS5zcGxpdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGV2ZXJ5KGNhbGxiYWNrZm4pIHtcblx0dmFyIE8gPSBUb09iamVjdCh0aGlzKTtcblx0dmFyIHNlbGYgPSBzcGxpdFN0cmluZyAmJiBpc1N0cmluZyhPKSA/ICRzcGxpdChPLCAnJykgOiBPO1xuXHR2YXIgbGVuID0gVG9VaW50MzIoc2VsZi5sZW5ndGgpO1xuXHR2YXIgVDtcblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdFx0VCA9IGFyZ3VtZW50c1sxXTtcblx0fVxuXG5cdC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uXG5cdGlmICghSXNDYWxsYWJsZShjYWxsYmFja2ZuKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LnByb3RvdHlwZS5ldmVyeSBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblx0fVxuXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRpZiAoaSBpbiBzZWxmICYmICEodHlwZW9mIFQgPT09ICd1bmRlZmluZWQnID8gY2FsbGJhY2tmbihzZWxmW2ldLCBpLCBPKSA6IGNhbGxiYWNrZm4uY2FsbChULCBzZWxmW2ldLCBpLCBPKSkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHRydWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnZXMtYWJzdHJhY3QvMjAyMS9SZXF1aXJlT2JqZWN0Q29lcmNpYmxlJyk7XG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xudmFyIHNoaW0gPSByZXF1aXJlKCcuL3NoaW0nKTtcblxudmFyICRzbGljZSA9IGNhbGxCb3VuZCgnQXJyYXkucHJvdG90eXBlLnNsaWNlJyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xudmFyIGJvdW5kRXZlcnlTaGltID0gZnVuY3Rpb24gZXZlcnkoYXJyYXksIGNhbGxiYWNrZm4pIHtcblx0UmVxdWlyZU9iamVjdENvZXJjaWJsZShhcnJheSk7XG5cdHJldHVybiBwb2x5ZmlsbC5hcHBseShhcnJheSwgJHNsaWNlKGFyZ3VtZW50cywgMSkpO1xufTtcbmRlZmluZShib3VuZEV2ZXJ5U2hpbSwge1xuXHRnZXRQb2x5ZmlsbDogZ2V0UG9seWZpbGwsXG5cdGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvbixcblx0c2hpbTogc2hpbVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gYm91bmRFdmVyeVNoaW07XG4iLCJ2YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0UG9seWZpbGwoKSB7XG5cdGlmICh0eXBlb2YgQXJyYXkucHJvdG90eXBlLmV2ZXJ5ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0dmFyIGhhc1ByaW1pdGl2ZUNvbnRleHRJblN0cmljdCA9IFsxXS5ldmVyeShmdW5jdGlvbiAoKSB7XG5cdFx0XHQndXNlIHN0cmljdCc7XG5cblx0XHRcdHJldHVybiB0eXBlb2YgdGhpcyA9PT0gJ3N0cmluZycgJiYgdGhpcyA9PT0gJ3gnO1xuXHRcdH0sICd4Jyk7XG5cdFx0aWYgKGhhc1ByaW1pdGl2ZUNvbnRleHRJblN0cmljdCkge1xuXHRcdFx0cmV0dXJuIEFycmF5LnByb3RvdHlwZS5ldmVyeTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGltcGxlbWVudGF0aW9uO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmluZSA9IHJlcXVpcmUoJ2RlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hpbUFycmF5UHJvdG90eXBlRXZlcnkoKSB7XG5cdHZhciBwb2x5ZmlsbCA9IGdldFBvbHlmaWxsKCk7XG5cdGRlZmluZShcblx0XHRBcnJheS5wcm90b3R5cGUsXG5cdFx0eyBldmVyeTogcG9seWZpbGwgfSxcblx0XHR7IGV2ZXJ5OiBmdW5jdGlvbiAoKSB7IHJldHVybiBBcnJheS5wcm90b3R5cGUuZXZlcnkgIT09IHBvbHlmaWxsOyB9IH1cblx0KTtcblx0cmV0dXJuIHBvbHlmaWxsO1xufTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIHBvc3NpYmxlTmFtZXMgPSBbXG5cdCdCaWdJbnQ2NEFycmF5Jyxcblx0J0JpZ1VpbnQ2NEFycmF5Jyxcblx0J0Zsb2F0MzJBcnJheScsXG5cdCdGbG9hdDY0QXJyYXknLFxuXHQnSW50MTZBcnJheScsXG5cdCdJbnQzMkFycmF5Jyxcblx0J0ludDhBcnJheScsXG5cdCdVaW50MTZBcnJheScsXG5cdCdVaW50MzJBcnJheScsXG5cdCdVaW50OEFycmF5Jyxcblx0J1VpbnQ4Q2xhbXBlZEFycmF5J1xuXTtcblxudmFyIGcgPSB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiBnbG9iYWxUaGlzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGF2YWlsYWJsZVR5cGVkQXJyYXlzKCkge1xuXHR2YXIgb3V0ID0gW107XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgcG9zc2libGVOYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdGlmICh0eXBlb2YgZ1twb3NzaWJsZU5hbWVzW2ldXSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0b3V0W291dC5sZW5ndGhdID0gcG9zc2libGVOYW1lc1tpXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG91dDtcbn07XG5cbn0pLmNhbGwodGhpcyx0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge30pIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCcuLycpO1xuXG52YXIgJGluZGV4T2YgPSBjYWxsQmluZChHZXRJbnRyaW5zaWMoJ1N0cmluZy5wcm90b3R5cGUuaW5kZXhPZicpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQm91bmRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWMgPSBHZXRJbnRyaW5zaWMobmFtZSwgISFhbGxvd01pc3NpbmcpO1xuXHRpZiAodHlwZW9mIGludHJpbnNpYyA9PT0gJ2Z1bmN0aW9uJyAmJiAkaW5kZXhPZihuYW1lLCAnLnByb3RvdHlwZS4nKSA+IC0xKSB7XG5cdFx0cmV0dXJuIGNhbGxCaW5kKGludHJpbnNpYyk7XG5cdH1cblx0cmV0dXJuIGludHJpbnNpYztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcblxudmFyICRhcHBseSA9IEdldEludHJpbnNpYygnJUZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseSUnKTtcbnZhciAkY2FsbCA9IEdldEludHJpbnNpYygnJUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsJScpO1xudmFyICRyZWZsZWN0QXBwbHkgPSBHZXRJbnRyaW5zaWMoJyVSZWZsZWN0LmFwcGx5JScsIHRydWUpIHx8IGJpbmQuY2FsbCgkY2FsbCwgJGFwcGx5KTtcblxudmFyICRnT1BEID0gR2V0SW50cmluc2ljKCclT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciUnLCB0cnVlKTtcbnZhciAkZGVmaW5lUHJvcGVydHkgPSBHZXRJbnRyaW5zaWMoJyVPYmplY3QuZGVmaW5lUHJvcGVydHklJywgdHJ1ZSk7XG52YXIgJG1heCA9IEdldEludHJpbnNpYygnJU1hdGgubWF4JScpO1xuXG5pZiAoJGRlZmluZVByb3BlcnR5KSB7XG5cdHRyeSB7XG5cdFx0JGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgdmFsdWU6IDEgfSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJRSA4IGhhcyBhIGJyb2tlbiBkZWZpbmVQcm9wZXJ0eVxuXHRcdCRkZWZpbmVQcm9wZXJ0eSA9IG51bGw7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQmluZChvcmlnaW5hbEZ1bmN0aW9uKSB7XG5cdHZhciBmdW5jID0gJHJlZmxlY3RBcHBseShiaW5kLCAkY2FsbCwgYXJndW1lbnRzKTtcblx0aWYgKCRnT1BEICYmICRkZWZpbmVQcm9wZXJ0eSkge1xuXHRcdHZhciBkZXNjID0gJGdPUEQoZnVuYywgJ2xlbmd0aCcpO1xuXHRcdGlmIChkZXNjLmNvbmZpZ3VyYWJsZSkge1xuXHRcdFx0Ly8gb3JpZ2luYWwgbGVuZ3RoLCBwbHVzIHRoZSByZWNlaXZlciwgbWludXMgYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIChhZnRlciB0aGUgcmVjZWl2ZXIpXG5cdFx0XHQkZGVmaW5lUHJvcGVydHkoXG5cdFx0XHRcdGZ1bmMsXG5cdFx0XHRcdCdsZW5ndGgnLFxuXHRcdFx0XHR7IHZhbHVlOiAxICsgJG1heCgwLCBvcmlnaW5hbEZ1bmN0aW9uLmxlbmd0aCAtIChhcmd1bWVudHMubGVuZ3RoIC0gMSkpIH1cblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmdW5jO1xufTtcblxudmFyIGFwcGx5QmluZCA9IGZ1bmN0aW9uIGFwcGx5QmluZCgpIHtcblx0cmV0dXJuICRyZWZsZWN0QXBwbHkoYmluZCwgJGFwcGx5LCBhcmd1bWVudHMpO1xufTtcblxuaWYgKCRkZWZpbmVQcm9wZXJ0eSkge1xuXHQkZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdhcHBseScsIHsgdmFsdWU6IGFwcGx5QmluZCB9KTtcbn0gZWxzZSB7XG5cdG1vZHVsZS5leHBvcnRzLmFwcGx5ID0gYXBwbHlCaW5kO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJ29iamVjdC1rZXlzJyk7XG52YXIgaXNBcmd1bWVudHMgPSByZXF1aXJlKCdpcy1hcmd1bWVudHMnKTtcbnZhciBpcyA9IHJlcXVpcmUoJ29iamVjdC1pcycpO1xudmFyIGlzUmVnZXggPSByZXF1aXJlKCdpcy1yZWdleCcpO1xudmFyIGZsYWdzID0gcmVxdWlyZSgncmVnZXhwLnByb3RvdHlwZS5mbGFncycpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5Jyk7XG52YXIgaXNEYXRlID0gcmVxdWlyZSgnaXMtZGF0ZS1vYmplY3QnKTtcbnZhciB3aGljaEJveGVkUHJpbWl0aXZlID0gcmVxdWlyZSgnd2hpY2gtYm94ZWQtcHJpbWl0aXZlJyk7XG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJ2NhbGwtYmluZC9jYWxsQm91bmQnKTtcbnZhciB3aGljaENvbGxlY3Rpb24gPSByZXF1aXJlKCd3aGljaC1jb2xsZWN0aW9uJyk7XG52YXIgZ2V0SXRlcmF0b3IgPSByZXF1aXJlKCdlcy1nZXQtaXRlcmF0b3InKTtcbnZhciBnZXRTaWRlQ2hhbm5lbCA9IHJlcXVpcmUoJ3NpZGUtY2hhbm5lbCcpO1xudmFyIHdoaWNoVHlwZWRBcnJheSA9IHJlcXVpcmUoJ3doaWNoLXR5cGVkLWFycmF5Jyk7XG52YXIgYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LmFzc2lnbicpO1xuXG52YXIgJGdldFRpbWUgPSBjYWxsQm91bmQoJ0RhdGUucHJvdG90eXBlLmdldFRpbWUnKTtcbnZhciBnUE8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG52YXIgJG9ialRvU3RyaW5nID0gY2FsbEJvdW5kKCdPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nJyk7XG5cbnZhciAkU2V0ID0gR2V0SW50cmluc2ljKCclU2V0JScsIHRydWUpO1xudmFyICRtYXBIYXMgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuaGFzJywgdHJ1ZSk7XG52YXIgJG1hcEdldCA9IGNhbGxCb3VuZCgnTWFwLnByb3RvdHlwZS5nZXQnLCB0cnVlKTtcbnZhciAkbWFwU2l6ZSA9IGNhbGxCb3VuZCgnTWFwLnByb3RvdHlwZS5zaXplJywgdHJ1ZSk7XG52YXIgJHNldEFkZCA9IGNhbGxCb3VuZCgnU2V0LnByb3RvdHlwZS5hZGQnLCB0cnVlKTtcbnZhciAkc2V0RGVsZXRlID0gY2FsbEJvdW5kKCdTZXQucHJvdG90eXBlLmRlbGV0ZScsIHRydWUpO1xudmFyICRzZXRIYXMgPSBjYWxsQm91bmQoJ1NldC5wcm90b3R5cGUuaGFzJywgdHJ1ZSk7XG52YXIgJHNldFNpemUgPSBjYWxsQm91bmQoJ1NldC5wcm90b3R5cGUuc2l6ZScsIHRydWUpO1xuXG4vLyB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9icm93c2VyaWZ5L2NvbW1vbmpzLWFzc2VydC9ibG9iL2JiYTgzOGU5YmE5ZTI4ZWRmMzEyN2NlNjk3NDYyNDIwODUwMmY2YmMvaW50ZXJuYWwvdXRpbC9jb21wYXJpc29ucy5qcyNMNDAxLUw0MTRcbmZ1bmN0aW9uIHNldEhhc0VxdWFsRWxlbWVudChzZXQsIHZhbDEsIG9wdHMsIGNoYW5uZWwpIHtcbiAgdmFyIGkgPSBnZXRJdGVyYXRvcihzZXQpO1xuICB2YXIgcmVzdWx0O1xuICB3aGlsZSAoKHJlc3VsdCA9IGkubmV4dCgpKSAmJiAhcmVzdWx0LmRvbmUpIHtcbiAgICBpZiAoaW50ZXJuYWxEZWVwRXF1YWwodmFsMSwgcmVzdWx0LnZhbHVlLCBvcHRzLCBjaGFubmVsKSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAvLyBSZW1vdmUgdGhlIG1hdGNoaW5nIGVsZW1lbnQgdG8gbWFrZSBzdXJlIHdlIGRvIG5vdCBjaGVjayB0aGF0IGFnYWluLlxuICAgICAgJHNldERlbGV0ZShzZXQsIHJlc3VsdC52YWx1ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2Jyb3dzZXJpZnkvY29tbW9uanMtYXNzZXJ0L2Jsb2IvYmJhODM4ZTliYTllMjhlZGYzMTI3Y2U2OTc0NjI0MjA4NTAyZjZiYy9pbnRlcm5hbC91dGlsL2NvbXBhcmlzb25zLmpzI0w0MTYtTDQzOVxuZnVuY3Rpb24gZmluZExvb3NlTWF0Y2hpbmdQcmltaXRpdmVzKHByaW0pIHtcbiAgaWYgKHR5cGVvZiBwcmltID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICh0eXBlb2YgcHJpbSA9PT0gJ29iamVjdCcpIHsgLy8gT25seSBwYXNzIGluIG51bGwgYXMgb2JqZWN0IVxuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgaWYgKHR5cGVvZiBwcmltID09PSAnc3ltYm9sJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIHByaW0gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwcmltID09PSAnbnVtYmVyJykge1xuICAgIC8vIExvb3NlIGVxdWFsIGVudHJpZXMgZXhpc3Qgb25seSBpZiB0aGUgc3RyaW5nIGlzIHBvc3NpYmxlIHRvIGNvbnZlcnQgdG8gYSByZWd1bGFyIG51bWJlciBhbmQgbm90IE5hTi5cbiAgICByZXR1cm4gK3ByaW0gPT09ICtwcmltOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWltcGxpY2l0LWNvZXJjaW9uXG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2Jyb3dzZXJpZnkvY29tbW9uanMtYXNzZXJ0L2Jsb2IvYmJhODM4ZTliYTllMjhlZGYzMTI3Y2U2OTc0NjI0MjA4NTAyZjZiYy9pbnRlcm5hbC91dGlsL2NvbXBhcmlzb25zLmpzI0w0NDktTDQ2MFxuZnVuY3Rpb24gbWFwTWlnaHRIYXZlTG9vc2VQcmltKGEsIGIsIHByaW0sIGl0ZW0sIG9wdHMsIGNoYW5uZWwpIHtcbiAgdmFyIGFsdFZhbHVlID0gZmluZExvb3NlTWF0Y2hpbmdQcmltaXRpdmVzKHByaW0pO1xuICBpZiAoYWx0VmFsdWUgIT0gbnVsbCkge1xuICAgIHJldHVybiBhbHRWYWx1ZTtcbiAgfVxuICB2YXIgY3VyQiA9ICRtYXBHZXQoYiwgYWx0VmFsdWUpO1xuICB2YXIgbG9vc2VPcHRzID0gYXNzaWduKHt9LCBvcHRzLCB7IHN0cmljdDogZmFsc2UgfSk7XG4gIGlmIChcbiAgICAodHlwZW9mIGN1ckIgPT09ICd1bmRlZmluZWQnICYmICEkbWFwSGFzKGIsIGFsdFZhbHVlKSlcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICB8fCAhaW50ZXJuYWxEZWVwRXF1YWwoaXRlbSwgY3VyQiwgbG9vc2VPcHRzLCBjaGFubmVsKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gIHJldHVybiAhJG1hcEhhcyhhLCBhbHRWYWx1ZSkgJiYgaW50ZXJuYWxEZWVwRXF1YWwoaXRlbSwgY3VyQiwgbG9vc2VPcHRzLCBjaGFubmVsKTtcbn1cblxuLy8gdGFrZW4gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYnJvd3NlcmlmeS9jb21tb25qcy1hc3NlcnQvYmxvYi9iYmE4MzhlOWJhOWUyOGVkZjMxMjdjZTY5NzQ2MjQyMDg1MDJmNmJjL2ludGVybmFsL3V0aWwvY29tcGFyaXNvbnMuanMjTDQ0MS1MNDQ3XG5mdW5jdGlvbiBzZXRNaWdodEhhdmVMb29zZVByaW0oYSwgYiwgcHJpbSkge1xuICB2YXIgYWx0VmFsdWUgPSBmaW5kTG9vc2VNYXRjaGluZ1ByaW1pdGl2ZXMocHJpbSk7XG4gIGlmIChhbHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIGFsdFZhbHVlO1xuICB9XG5cbiAgcmV0dXJuICRzZXRIYXMoYiwgYWx0VmFsdWUpICYmICEkc2V0SGFzKGEsIGFsdFZhbHVlKTtcbn1cblxuLy8gdGFrZW4gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYnJvd3NlcmlmeS9jb21tb25qcy1hc3NlcnQvYmxvYi9iYmE4MzhlOWJhOWUyOGVkZjMxMjdjZTY5NzQ2MjQyMDg1MDJmNmJjL2ludGVybmFsL3V0aWwvY29tcGFyaXNvbnMuanMjTDUxOC1MNTMzXG5mdW5jdGlvbiBtYXBIYXNFcXVhbEVudHJ5KHNldCwgbWFwLCBrZXkxLCBpdGVtMSwgb3B0cywgY2hhbm5lbCkge1xuICB2YXIgaSA9IGdldEl0ZXJhdG9yKHNldCk7XG4gIHZhciByZXN1bHQ7XG4gIHZhciBrZXkyO1xuICB3aGlsZSAoKHJlc3VsdCA9IGkubmV4dCgpKSAmJiAhcmVzdWx0LmRvbmUpIHtcbiAgICBrZXkyID0gcmVzdWx0LnZhbHVlO1xuICAgIGlmIChcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgaW50ZXJuYWxEZWVwRXF1YWwoa2V5MSwga2V5Miwgb3B0cywgY2hhbm5lbClcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgJiYgaW50ZXJuYWxEZWVwRXF1YWwoaXRlbTEsICRtYXBHZXQobWFwLCBrZXkyKSwgb3B0cywgY2hhbm5lbClcbiAgICApIHtcbiAgICAgICRzZXREZWxldGUoc2V0LCBrZXkyKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaW50ZXJuYWxEZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgb3B0aW9ucywgY2hhbm5lbCkge1xuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gNy4xLiBBbGwgaWRlbnRpY2FsIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4gIGlmIChvcHRzLnN0cmljdCA/IGlzKGFjdHVhbCwgZXhwZWN0ZWQpIDogYWN0dWFsID09PSBleHBlY3RlZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIGFjdHVhbEJveGVkID0gd2hpY2hCb3hlZFByaW1pdGl2ZShhY3R1YWwpO1xuICB2YXIgZXhwZWN0ZWRCb3hlZCA9IHdoaWNoQm94ZWRQcmltaXRpdmUoZXhwZWN0ZWQpO1xuICBpZiAoYWN0dWFsQm94ZWQgIT09IGV4cGVjdGVkQm94ZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyA3LjMuIE90aGVyIHBhaXJzIHRoYXQgZG8gbm90IGJvdGggcGFzcyB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcsIGVxdWl2YWxlbmNlIGlzIGRldGVybWluZWQgYnkgPT0uXG4gIGlmICghYWN0dWFsIHx8ICFleHBlY3RlZCB8fCAodHlwZW9mIGFjdHVhbCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIGV4cGVjdGVkICE9PSAnb2JqZWN0JykpIHtcbiAgICByZXR1cm4gb3B0cy5zdHJpY3QgPyBpcyhhY3R1YWwsIGV4cGVjdGVkKSA6IGFjdHVhbCA9PSBleHBlY3RlZDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgfVxuXG4gIC8qXG4gICAqIDcuNC4gRm9yIGFsbCBvdGhlciBPYmplY3QgcGFpcnMsIGluY2x1ZGluZyBBcnJheSBvYmplY3RzLCBlcXVpdmFsZW5jZSBpc1xuICAgKiBkZXRlcm1pbmVkIGJ5IGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoYXMgdmVyaWZpZWRcbiAgICogd2l0aCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwpLCB0aGUgc2FtZSBzZXQgb2Yga2V5c1xuICAgKiAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSwgZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5XG4gICAqIGNvcnJlc3BvbmRpbmcga2V5LCBhbmQgYW4gaWRlbnRpY2FsICdwcm90b3R5cGUnIHByb3BlcnR5LiBOb3RlOiB0aGlzXG4gICAqIGFjY291bnRzIGZvciBib3RoIG5hbWVkIGFuZCBpbmRleGVkIHByb3BlcnRpZXMgb24gQXJyYXlzLlxuICAgKi9cbiAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9jb21taXQvZDNhYWZkMDJlZmQzYTQwM2Q2NDZhMzA0NGFkY2YxNGU2M2E4OGQzMiBmb3IgbWVtb3MvY2hhbm5lbCBpbnNwaXJhdGlvblxuXG4gIHZhciBoYXNBY3R1YWwgPSBjaGFubmVsLmhhcyhhY3R1YWwpO1xuICB2YXIgaGFzRXhwZWN0ZWQgPSBjaGFubmVsLmhhcyhleHBlY3RlZCk7XG4gIHZhciBzZW50aW5lbDtcbiAgaWYgKGhhc0FjdHVhbCAmJiBoYXNFeHBlY3RlZCkge1xuICAgIGlmIChjaGFubmVsLmdldChhY3R1YWwpID09PSBjaGFubmVsLmdldChleHBlY3RlZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzZW50aW5lbCA9IHt9O1xuICB9XG4gIGlmICghaGFzQWN0dWFsKSB7IGNoYW5uZWwuc2V0KGFjdHVhbCwgc2VudGluZWwpOyB9XG4gIGlmICghaGFzRXhwZWN0ZWQpIHsgY2hhbm5lbC5zZXQoZXhwZWN0ZWQsIHNlbnRpbmVsKTsgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICByZXR1cm4gb2JqRXF1aXYoYWN0dWFsLCBleHBlY3RlZCwgb3B0cywgY2hhbm5lbCk7XG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyKHgpIHtcbiAgaWYgKCF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgeC5sZW5ndGggIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgeC5jb3B5ICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiB4LnNsaWNlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh4Lmxlbmd0aCA+IDAgJiYgdHlwZW9mIHhbMF0gIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuICEhKHguY29uc3RydWN0b3IgJiYgeC5jb25zdHJ1Y3Rvci5pc0J1ZmZlciAmJiB4LmNvbnN0cnVjdG9yLmlzQnVmZmVyKHgpKTtcbn1cblxuZnVuY3Rpb24gc2V0RXF1aXYoYSwgYiwgb3B0cywgY2hhbm5lbCkge1xuICBpZiAoJHNldFNpemUoYSkgIT09ICRzZXRTaXplKGIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBpQSA9IGdldEl0ZXJhdG9yKGEpO1xuICB2YXIgaUIgPSBnZXRJdGVyYXRvcihiKTtcbiAgdmFyIHJlc3VsdEE7XG4gIHZhciByZXN1bHRCO1xuICB2YXIgc2V0O1xuICB3aGlsZSAoKHJlc3VsdEEgPSBpQS5uZXh0KCkpICYmICFyZXN1bHRBLmRvbmUpIHtcbiAgICBpZiAocmVzdWx0QS52YWx1ZSAmJiB0eXBlb2YgcmVzdWx0QS52YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICghc2V0KSB7IHNldCA9IG5ldyAkU2V0KCk7IH1cbiAgICAgICRzZXRBZGQoc2V0LCByZXN1bHRBLnZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKCEkc2V0SGFzKGIsIHJlc3VsdEEudmFsdWUpKSB7XG4gICAgICBpZiAob3B0cy5zdHJpY3QpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICBpZiAoIXNldE1pZ2h0SGF2ZUxvb3NlUHJpbShhLCBiLCByZXN1bHRBLnZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIXNldCkgeyBzZXQgPSBuZXcgJFNldCgpOyB9XG4gICAgICAkc2V0QWRkKHNldCwgcmVzdWx0QS52YWx1ZSk7XG4gICAgfVxuICB9XG4gIGlmIChzZXQpIHtcbiAgICB3aGlsZSAoKHJlc3VsdEIgPSBpQi5uZXh0KCkpICYmICFyZXN1bHRCLmRvbmUpIHtcbiAgICAgIC8vIFdlIGhhdmUgdG8gY2hlY2sgaWYgYSBwcmltaXRpdmUgdmFsdWUgaXMgYWxyZWFkeSBtYXRjaGluZyBhbmQgb25seSBpZiBpdCdzIG5vdCwgZ28gaHVudGluZyBmb3IgaXQuXG4gICAgICBpZiAocmVzdWx0Qi52YWx1ZSAmJiB0eXBlb2YgcmVzdWx0Qi52YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKCFzZXRIYXNFcXVhbEVsZW1lbnQoc2V0LCByZXN1bHRCLnZhbHVlLCBvcHRzLnN0cmljdCwgY2hhbm5lbCkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICFvcHRzLnN0cmljdFxuICAgICAgICAmJiAhJHNldEhhcyhhLCByZXN1bHRCLnZhbHVlKVxuICAgICAgICAmJiAhc2V0SGFzRXF1YWxFbGVtZW50KHNldCwgcmVzdWx0Qi52YWx1ZSwgb3B0cy5zdHJpY3QsIGNoYW5uZWwpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJHNldFNpemUoc2V0KSA9PT0gMDtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbWFwRXF1aXYoYSwgYiwgb3B0cywgY2hhbm5lbCkge1xuICBpZiAoJG1hcFNpemUoYSkgIT09ICRtYXBTaXplKGIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBpQSA9IGdldEl0ZXJhdG9yKGEpO1xuICB2YXIgaUIgPSBnZXRJdGVyYXRvcihiKTtcbiAgdmFyIHJlc3VsdEE7XG4gIHZhciByZXN1bHRCO1xuICB2YXIgc2V0O1xuICB2YXIga2V5O1xuICB2YXIgaXRlbTE7XG4gIHZhciBpdGVtMjtcbiAgd2hpbGUgKChyZXN1bHRBID0gaUEubmV4dCgpKSAmJiAhcmVzdWx0QS5kb25lKSB7XG4gICAga2V5ID0gcmVzdWx0QS52YWx1ZVswXTtcbiAgICBpdGVtMSA9IHJlc3VsdEEudmFsdWVbMV07XG4gICAgaWYgKGtleSAmJiB0eXBlb2Yga2V5ID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKCFzZXQpIHsgc2V0ID0gbmV3ICRTZXQoKTsgfVxuICAgICAgJHNldEFkZChzZXQsIGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW0yID0gJG1hcEdldChiLCBrZXkpO1xuICAgICAgaWYgKCh0eXBlb2YgaXRlbTIgPT09ICd1bmRlZmluZWQnICYmICEkbWFwSGFzKGIsIGtleSkpIHx8ICFpbnRlcm5hbERlZXBFcXVhbChpdGVtMSwgaXRlbTIsIG9wdHMsIGNoYW5uZWwpKSB7XG4gICAgICAgIGlmIChvcHRzLnN0cmljdCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1hcE1pZ2h0SGF2ZUxvb3NlUHJpbShhLCBiLCBrZXksIGl0ZW0xLCBvcHRzLCBjaGFubmVsKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNldCkgeyBzZXQgPSBuZXcgJFNldCgpOyB9XG4gICAgICAgICRzZXRBZGQoc2V0LCBrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChzZXQpIHtcbiAgICB3aGlsZSAoKHJlc3VsdEIgPSBpQi5uZXh0KCkpICYmICFyZXN1bHRCLmRvbmUpIHtcbiAgICAgIGtleSA9IHJlc3VsdEIudmFsdWVbMF07XG4gICAgICBpdGVtMiA9IHJlc3VsdEIudmFsdWVbMV07XG4gICAgICBpZiAoa2V5ICYmIHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmICghbWFwSGFzRXF1YWxFbnRyeShzZXQsIGEsIGtleSwgaXRlbTIsIG9wdHMsIGNoYW5uZWwpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAhb3B0cy5zdHJpY3RcbiAgICAgICAgJiYgKCFhLmhhcyhrZXkpIHx8ICFpbnRlcm5hbERlZXBFcXVhbCgkbWFwR2V0KGEsIGtleSksIGl0ZW0yLCBvcHRzLCBjaGFubmVsKSlcbiAgICAgICAgJiYgIW1hcEhhc0VxdWFsRW50cnkoc2V0LCBhLCBrZXksIGl0ZW0yLCBhc3NpZ24oe30sIG9wdHMsIHsgc3RyaWN0OiBmYWxzZSB9KSwgY2hhbm5lbClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAkc2V0U2l6ZShzZXQpID09PSAwO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBvYmpFcXVpdihhLCBiLCBvcHRzLCBjaGFubmVsKSB7XG4gIC8qIGVzbGludCBtYXgtc3RhdGVtZW50czogWzIsIDEwMF0sIG1heC1saW5lcy1wZXItZnVuY3Rpb246IFsyLCAxMjBdLCBtYXgtZGVwdGg6IFsyLCA1XSAqL1xuICB2YXIgaSwga2V5O1xuXG4gIGlmICh0eXBlb2YgYSAhPT0gdHlwZW9mIGIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIGlmICgkb2JqVG9TdHJpbmcoYSkgIT09ICRvYmpUb1N0cmluZyhiKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuICBpZiAoaXNBcmd1bWVudHMoYSkgIT09IGlzQXJndW1lbnRzKGIpKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIHZhciBhSXNBcnJheSA9IGlzQXJyYXkoYSk7XG4gIHZhciBiSXNBcnJheSA9IGlzQXJyYXkoYik7XG4gIGlmIChhSXNBcnJheSAhPT0gYklzQXJyYXkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgLy8gVE9ETzogcmVwbGFjZSB3aGVuIGEgY3Jvc3MtcmVhbG0gYnJhbmQgY2hlY2sgaXMgYXZhaWxhYmxlXG4gIHZhciBhSXNFcnJvciA9IGEgaW5zdGFuY2VvZiBFcnJvcjtcbiAgdmFyIGJJc0Vycm9yID0gYiBpbnN0YW5jZW9mIEVycm9yO1xuICBpZiAoYUlzRXJyb3IgIT09IGJJc0Vycm9yKSB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAoYUlzRXJyb3IgfHwgYklzRXJyb3IpIHtcbiAgICBpZiAoYS5uYW1lICE9PSBiLm5hbWUgfHwgYS5tZXNzYWdlICE9PSBiLm1lc3NhZ2UpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIH1cblxuICB2YXIgYUlzUmVnZXggPSBpc1JlZ2V4KGEpO1xuICB2YXIgYklzUmVnZXggPSBpc1JlZ2V4KGIpO1xuICBpZiAoYUlzUmVnZXggIT09IGJJc1JlZ2V4KSB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAoKGFJc1JlZ2V4IHx8IGJJc1JlZ2V4KSAmJiAoYS5zb3VyY2UgIT09IGIuc291cmNlIHx8IGZsYWdzKGEpICE9PSBmbGFncyhiKSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgYUlzRGF0ZSA9IGlzRGF0ZShhKTtcbiAgdmFyIGJJc0RhdGUgPSBpc0RhdGUoYik7XG4gIGlmIChhSXNEYXRlICE9PSBiSXNEYXRlKSB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAoYUlzRGF0ZSB8fCBiSXNEYXRlKSB7IC8vICYmIHdvdWxkIHdvcmsgdG9vLCBiZWNhdXNlIGJvdGggYXJlIHRydWUgb3IgYm90aCBmYWxzZSBoZXJlXG4gICAgaWYgKCRnZXRUaW1lKGEpICE9PSAkZ2V0VGltZShiKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgfVxuICBpZiAob3B0cy5zdHJpY3QgJiYgZ1BPICYmIGdQTyhhKSAhPT0gZ1BPKGIpKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIGlmICh3aGljaFR5cGVkQXJyYXkoYSkgIT09IHdoaWNoVHlwZWRBcnJheShiKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBhSXNCdWZmZXIgPSBpc0J1ZmZlcihhKTtcbiAgdmFyIGJJc0J1ZmZlciA9IGlzQnVmZmVyKGIpO1xuICBpZiAoYUlzQnVmZmVyICE9PSBiSXNCdWZmZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChhSXNCdWZmZXIgfHwgYklzQnVmZmVyKSB7IC8vICYmIHdvdWxkIHdvcmsgdG9vLCBiZWNhdXNlIGJvdGggYXJlIHRydWUgb3IgYm90aCBmYWxzZSBoZXJlXG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgeyByZXR1cm4gZmFsc2U7IH1cblxuICB2YXIga2EgPSBvYmplY3RLZXlzKGEpO1xuICB2YXIga2IgPSBvYmplY3RLZXlzKGIpO1xuICAvLyBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGtleXMgaW5jb3Jwb3JhdGVzIGhhc093blByb3BlcnR5KVxuICBpZiAoa2EubGVuZ3RoICE9PSBrYi5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgLy8gdGhlIHNhbWUgc2V0IG9mIGtleXMgKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksXG4gIGthLnNvcnQoKTtcbiAga2Iuc29ydCgpO1xuICAvLyB+fn5jaGVhcCBrZXkgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPSBrYltpXSkgeyByZXR1cm4gZmFsc2U7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgfVxuXG4gIC8vIGVxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeSBjb3JyZXNwb25kaW5nIGtleSwgYW5kIH5+fnBvc3NpYmx5IGV4cGVuc2l2ZSBkZWVwIHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBrZXkgPSBrYVtpXTtcbiAgICBpZiAoIWludGVybmFsRGVlcEVxdWFsKGFba2V5XSwgYltrZXldLCBvcHRzLCBjaGFubmVsKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgfVxuXG4gIHZhciBhQ29sbGVjdGlvbiA9IHdoaWNoQ29sbGVjdGlvbihhKTtcbiAgdmFyIGJDb2xsZWN0aW9uID0gd2hpY2hDb2xsZWN0aW9uKGIpO1xuICBpZiAoYUNvbGxlY3Rpb24gIT09IGJDb2xsZWN0aW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChhQ29sbGVjdGlvbiA9PT0gJ1NldCcgfHwgYkNvbGxlY3Rpb24gPT09ICdTZXQnKSB7IC8vIGFDb2xsZWN0aW9uID09PSBiQ29sbGVjdGlvblxuICAgIHJldHVybiBzZXRFcXVpdihhLCBiLCBvcHRzLCBjaGFubmVsKTtcbiAgfVxuICBpZiAoYUNvbGxlY3Rpb24gPT09ICdNYXAnKSB7IC8vIGFDb2xsZWN0aW9uID09PSBiQ29sbGVjdGlvblxuICAgIHJldHVybiBtYXBFcXVpdihhLCBiLCBvcHRzLCBjaGFubmVsKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlZXBFcXVhbChhLCBiLCBvcHRzKSB7XG4gIHJldHVybiBpbnRlcm5hbERlZXBFcXVhbChhLCBiLCBvcHRzLCBnZXRTaWRlQ2hhbm5lbCgpKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBrZXlzID0gcmVxdWlyZSgnb2JqZWN0LWtleXMnKTtcbnZhciBoYXNTeW1ib2xzID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sKCdmb28nKSA9PT0gJ3N5bWJvbCc7XG5cbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgY29uY2F0ID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdDtcbnZhciBvcmlnRGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbnZhciBpc0Z1bmN0aW9uID0gZnVuY3Rpb24gKGZuKSB7XG5cdHJldHVybiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgJiYgdG9TdHIuY2FsbChmbikgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59O1xuXG52YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9ycyA9IHJlcXVpcmUoJ2hhcy1wcm9wZXJ0eS1kZXNjcmlwdG9ycycpKCk7XG5cbnZhciBzdXBwb3J0c0Rlc2NyaXB0b3JzID0gb3JpZ0RlZmluZVByb3BlcnR5ICYmIGhhc1Byb3BlcnR5RGVzY3JpcHRvcnM7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWUsIHZhbHVlLCBwcmVkaWNhdGUpIHtcblx0aWYgKG5hbWUgaW4gb2JqZWN0ICYmICghaXNGdW5jdGlvbihwcmVkaWNhdGUpIHx8ICFwcmVkaWNhdGUoKSkpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0aWYgKHN1cHBvcnRzRGVzY3JpcHRvcnMpIHtcblx0XHRvcmlnRGVmaW5lUHJvcGVydHkob2JqZWN0LCBuYW1lLCB7XG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdHdyaXRhYmxlOiB0cnVlXG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0b2JqZWN0W25hbWVdID0gdmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0fVxufTtcblxudmFyIGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiAob2JqZWN0LCBtYXApIHtcblx0dmFyIHByZWRpY2F0ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXHR2YXIgcHJvcHMgPSBrZXlzKG1hcCk7XG5cdGlmIChoYXNTeW1ib2xzKSB7XG5cdFx0cHJvcHMgPSBjb25jYXQuY2FsbChwcm9wcywgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhtYXApKTtcblx0fVxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0ZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wc1tpXSwgbWFwW3Byb3BzW2ldXSwgcHJlZGljYXRlc1twcm9wc1tpXV0pO1xuXHR9XG59O1xuXG5kZWZpbmVQcm9wZXJ0aWVzLnN1cHBvcnRzRGVzY3JpcHRvcnMgPSAhIXN1cHBvcnRzRGVzY3JpcHRvcnM7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lUHJvcGVydGllcztcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHNbaV0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGFyZ3VtZW50c1tpXTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBodHRwOi8vMjYyLmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvNS4xLyNzZWMtOS4xMVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2lzLWNhbGxhYmxlJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vNS9DaGVja09iamVjdENvZXJjaWJsZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgJFR5cGVFcnJvciA9IEdldEludHJpbnNpYygnJVR5cGVFcnJvciUnKTtcbnZhciAkTnVtYmVyID0gR2V0SW50cmluc2ljKCclTnVtYmVyJScpO1xudmFyICRSZWdFeHAgPSBHZXRJbnRyaW5zaWMoJyVSZWdFeHAlJyk7XG52YXIgJHBhcnNlSW50ZWdlciA9IEdldEludHJpbnNpYygnJXBhcnNlSW50JScpO1xuXG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xudmFyIHJlZ2V4VGVzdGVyID0gcmVxdWlyZSgnLi4vaGVscGVycy9yZWdleFRlc3RlcicpO1xudmFyIGlzUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaGVscGVycy9pc1ByaW1pdGl2ZScpO1xuXG52YXIgJHN0clNsaWNlID0gY2FsbEJvdW5kKCdTdHJpbmcucHJvdG90eXBlLnNsaWNlJyk7XG52YXIgaXNCaW5hcnkgPSByZWdleFRlc3RlcigvXjBiWzAxXSskL2kpO1xudmFyIGlzT2N0YWwgPSByZWdleFRlc3RlcigvXjBvWzAtN10rJC9pKTtcbnZhciBpc0ludmFsaWRIZXhMaXRlcmFsID0gcmVnZXhUZXN0ZXIoL15bLStdMHhbMC05YS1mXSskL2kpO1xudmFyIG5vbldTID0gWydcXHUwMDg1JywgJ1xcdTIwMGInLCAnXFx1ZmZmZSddLmpvaW4oJycpO1xudmFyIG5vbldTcmVnZXggPSBuZXcgJFJlZ0V4cCgnWycgKyBub25XUyArICddJywgJ2cnKTtcbnZhciBoYXNOb25XUyA9IHJlZ2V4VGVzdGVyKG5vbldTcmVnZXgpO1xuXG4vLyB3aGl0ZXNwYWNlIGZyb206IGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjUuNC4yMFxuLy8gaW1wbGVtZW50YXRpb24gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW0vYmxvYi92My40LjAvZXM1LXNoaW0uanMjTDEzMDQtTDEzMjRcbnZhciB3cyA9IFtcblx0J1xceDA5XFx4MEFcXHgwQlxceDBDXFx4MERcXHgyMFxceEEwXFx1MTY4MFxcdTE4MEVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzJyxcblx0J1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDJGXFx1MjA1RlxcdTMwMDBcXHUyMDI4Jyxcblx0J1xcdTIwMjlcXHVGRUZGJ1xuXS5qb2luKCcnKTtcbnZhciB0cmltUmVnZXggPSBuZXcgUmVnRXhwKCcoXlsnICsgd3MgKyAnXSspfChbJyArIHdzICsgJ10rJCknLCAnZycpO1xudmFyICRyZXBsYWNlID0gY2FsbEJvdW5kKCdTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UnKTtcbnZhciAkdHJpbSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRyZXR1cm4gJHJlcGxhY2UodmFsdWUsIHRyaW1SZWdleCwgJycpO1xufTtcblxudmFyIFRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9Ub1ByaW1pdGl2ZScpO1xuXG4vLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtdG9udW1iZXJcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBUb051bWJlcihhcmd1bWVudCkge1xuXHR2YXIgdmFsdWUgPSBpc1ByaW1pdGl2ZShhcmd1bWVudCkgPyBhcmd1bWVudCA6IFRvUHJpbWl0aXZlKGFyZ3VtZW50LCAkTnVtYmVyKTtcblx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCcpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgYSBTeW1ib2wgdmFsdWUgdG8gYSBudW1iZXInKTtcblx0fVxuXHRpZiAodHlwZW9mIHZhbHVlID09PSAnYmlnaW50Jykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdDb252ZXJzaW9uIGZyb20gXFwnQmlnSW50XFwnIHRvIFxcJ251bWJlclxcJyBpcyBub3QgYWxsb3dlZC4nKTtcblx0fVxuXHRpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuXHRcdGlmIChpc0JpbmFyeSh2YWx1ZSkpIHtcblx0XHRcdHJldHVybiBUb051bWJlcigkcGFyc2VJbnRlZ2VyKCRzdHJTbGljZSh2YWx1ZSwgMiksIDIpKTtcblx0XHR9IGVsc2UgaWYgKGlzT2N0YWwodmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gVG9OdW1iZXIoJHBhcnNlSW50ZWdlcigkc3RyU2xpY2UodmFsdWUsIDIpLCA4KSk7XG5cdFx0fSBlbHNlIGlmIChoYXNOb25XUyh2YWx1ZSkgfHwgaXNJbnZhbGlkSGV4TGl0ZXJhbCh2YWx1ZSkpIHtcblx0XHRcdHJldHVybiBOYU47XG5cdFx0fVxuXHRcdHZhciB0cmltbWVkID0gJHRyaW0odmFsdWUpO1xuXHRcdGlmICh0cmltbWVkICE9PSB2YWx1ZSkge1xuXHRcdFx0cmV0dXJuIFRvTnVtYmVyKHRyaW1tZWQpO1xuXHRcdH1cblxuXHR9XG5cdHJldHVybiAkTnVtYmVyKHZhbHVlKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG5cbnZhciAkT2JqZWN0ID0gR2V0SW50cmluc2ljKCclT2JqZWN0JScpO1xuXG52YXIgUmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4vUmVxdWlyZU9iamVjdENvZXJjaWJsZScpO1xuXG4vLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtdG9vYmplY3RcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBUb09iamVjdCh2YWx1ZSkge1xuXHRSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHZhbHVlKTtcblx0cmV0dXJuICRPYmplY3QodmFsdWUpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnZXMtdG8tcHJpbWl0aXZlL2VzMjAxNScpO1xuXG4vLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtdG9wcmltaXRpdmVcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBUb1ByaW1pdGl2ZShpbnB1dCkge1xuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcblx0XHRyZXR1cm4gdG9QcmltaXRpdmUoaW5wdXQsIGFyZ3VtZW50c1sxXSk7XG5cdH1cblx0cmV0dXJuIHRvUHJpbWl0aXZlKGlucHV0KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG5cbnZhciAkU3RyaW5nID0gR2V0SW50cmluc2ljKCclU3RyaW5nJScpO1xudmFyICRUeXBlRXJyb3IgPSBHZXRJbnRyaW5zaWMoJyVUeXBlRXJyb3IlJyk7XG5cbi8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy10b3N0cmluZ1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIFRvU3RyaW5nKGFyZ3VtZW50KSB7XG5cdGlmICh0eXBlb2YgYXJndW1lbnQgPT09ICdzeW1ib2wnKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGEgU3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nJyk7XG5cdH1cblx0cmV0dXJuICRTdHJpbmcoYXJndW1lbnQpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFRvTnVtYmVyID0gcmVxdWlyZSgnLi9Ub051bWJlcicpO1xuXG4vLyBodHRwOi8vMjYyLmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvNS4xLyNzZWMtOS42XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gVG9VaW50MzIoeCkge1xuXHRyZXR1cm4gVG9OdW1iZXIoeCkgPj4+IDA7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgJFR5cGVFcnJvciA9IEdldEludHJpbnNpYygnJVR5cGVFcnJvciUnKTtcblxuLy8gaHR0cDovLzI2Mi5lY21hLWludGVybmF0aW9uYWwub3JnLzUuMS8jc2VjLTkuMTBcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBDaGVja09iamVjdENvZXJjaWJsZSh2YWx1ZSwgb3B0TWVzc2FnZSkge1xuXHRpZiAodmFsdWUgPT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKG9wdE1lc3NhZ2UgfHwgKCdDYW5ub3QgY2FsbCBtZXRob2Qgb24gJyArIHZhbHVlKSk7XG5cdH1cblx0cmV0dXJuIHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcblxudmFyICRnT1BEID0gR2V0SW50cmluc2ljKCclT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciUnLCB0cnVlKTtcbmlmICgkZ09QRCkge1xuXHR0cnkge1xuXHRcdCRnT1BEKFtdLCAnbGVuZ3RoJyk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJRSA4IGhhcyBhIGJyb2tlbiBnT1BEXG5cdFx0JGdPUEQgPSBudWxsO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gJGdPUEQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNQcmltaXRpdmUodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlID09PSBudWxsIHx8ICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xuXG52YXIgJGV4ZWMgPSBjYWxsQm91bmQoJ1JlZ0V4cC5wcm90b3R5cGUuZXhlYycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlZ2V4VGVzdGVyKHJlZ2V4KSB7XG5cdHJldHVybiBmdW5jdGlvbiB0ZXN0KHMpIHsgcmV0dXJuICRleGVjKHJlZ2V4LCBzKSAhPT0gbnVsbDsgfTtcbn07XG4iLCIoZnVuY3Rpb24gKHByb2Nlc3Mpe1xuJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQgZ2xvYmFsLXJlcXVpcmU6IDAgKi9cbi8vIHRoZSBjb2RlIGlzIHN0cnVjdHVyZWQgdGhpcyB3YXkgc28gdGhhdCBidW5kbGVycyBjYW5cbi8vIGFsaWFzIG91dCBgaGFzLXN5bWJvbHNgIHRvIGAoKSA9PiB0cnVlYCBvciBgKCkgPT4gZmFsc2VgIGlmIHlvdXIgdGFyZ2V0XG4vLyBlbnZpcm9ubWVudHMnIFN5bWJvbCBjYXBhYmlsaXRpZXMgYXJlIGtub3duLCBhbmQgdGhlbiB1c2Vcbi8vIGRlYWQgY29kZSBlbGltaW5hdGlvbiBvbiB0aGUgcmVzdCBvZiB0aGlzIG1vZHVsZS5cbi8vXG4vLyBTaW1pbGFybHksIGBpc2FycmF5YCBjYW4gYmUgYWxpYXNlZCB0byBgQXJyYXkuaXNBcnJheWAgaWZcbi8vIGF2YWlsYWJsZSBpbiBhbGwgdGFyZ2V0IGVudmlyb25tZW50cy5cblxudmFyIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnaXMtYXJndW1lbnRzJyk7XG5cbmlmIChyZXF1aXJlKCdoYXMtc3ltYm9scycpKCkgfHwgcmVxdWlyZSgnaGFzLXN5bWJvbHMvc2hhbXMnKSgpKSB7XG5cdHZhciAkaXRlcmF0b3IgPSBTeW1ib2wuaXRlcmF0b3I7XG5cdC8vIFN5bWJvbCBpcyBhdmFpbGFibGUgbmF0aXZlbHkgb3Igc2hhbW1lZFxuXHQvLyBuYXRpdmVseTpcblx0Ly8gIC0gQ2hyb21lID49IDM4XG5cdC8vICAtIEVkZ2UgMTItMTQ/LCBFZGdlID49IDE1IGZvciBzdXJlXG5cdC8vICAtIEZGID49IDM2XG5cdC8vICAtIFNhZmFyaSA+PSA5XG5cdC8vICAtIG5vZGUgPj0gMC4xMlxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldEl0ZXJhdG9yKGl0ZXJhYmxlKSB7XG5cdFx0Ly8gYWx0ZXJuYXRpdmVseSwgYGl0ZXJhYmxlWyRpdGVyYXRvcl0/LigpYFxuXHRcdGlmIChpdGVyYWJsZSAhPSBudWxsICYmIHR5cGVvZiBpdGVyYWJsZVskaXRlcmF0b3JdICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuIGl0ZXJhYmxlWyRpdGVyYXRvcl0oKTtcblx0XHR9XG5cdFx0aWYgKGlzQXJndW1lbnRzKGl0ZXJhYmxlKSkge1xuXHRcdFx0Ly8gYXJndW1lbnRzIG9iamVjdHMgbGFjayBTeW1ib2wuaXRlcmF0b3Jcblx0XHRcdC8vIC0gbm9kZSAwLjEyXG5cdFx0XHRyZXR1cm4gQXJyYXkucHJvdG90eXBlWyRpdGVyYXRvcl0uY2FsbChpdGVyYWJsZSk7XG5cdFx0fVxuXHR9O1xufSBlbHNlIHtcblx0Ly8gU3ltYm9sIGlzIG5vdCBhdmFpbGFibGUsIG5hdGl2ZSBvciBzaGFtbWVkXG5cdHZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpO1xuXHR2YXIgaXNTdHJpbmcgPSByZXF1aXJlKCdpcy1zdHJpbmcnKTtcblx0dmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcblx0dmFyICRNYXAgPSBHZXRJbnRyaW5zaWMoJyVNYXAlJywgdHJ1ZSk7XG5cdHZhciAkU2V0ID0gR2V0SW50cmluc2ljKCclU2V0JScsIHRydWUpO1xuXHR2YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xuXHR2YXIgJGFycmF5UHVzaCA9IGNhbGxCb3VuZCgnQXJyYXkucHJvdG90eXBlLnB1c2gnKTtcblx0dmFyICRjaGFyQ29kZUF0ID0gY2FsbEJvdW5kKCdTdHJpbmcucHJvdG90eXBlLmNoYXJDb2RlQXQnKTtcblx0dmFyICRzdHJpbmdTbGljZSA9IGNhbGxCb3VuZCgnU3RyaW5nLnByb3RvdHlwZS5zbGljZScpO1xuXG5cdHZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSBmdW5jdGlvbiBhZHZhbmNlU3RyaW5nSW5kZXgoUywgaW5kZXgpIHtcblx0XHR2YXIgbGVuZ3RoID0gUy5sZW5ndGg7XG5cdFx0aWYgKChpbmRleCArIDEpID49IGxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGluZGV4ICsgMTtcblx0XHR9XG5cblx0XHR2YXIgZmlyc3QgPSAkY2hhckNvZGVBdChTLCBpbmRleCk7XG5cdFx0aWYgKGZpcnN0IDwgMHhEODAwIHx8IGZpcnN0ID4gMHhEQkZGKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXggKyAxO1xuXHRcdH1cblxuXHRcdHZhciBzZWNvbmQgPSAkY2hhckNvZGVBdChTLCBpbmRleCArIDEpO1xuXHRcdGlmIChzZWNvbmQgPCAweERDMDAgfHwgc2Vjb25kID4gMHhERkZGKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXggKyAxO1xuXHRcdH1cblxuXHRcdHJldHVybiBpbmRleCArIDI7XG5cdH07XG5cblx0dmFyIGdldEFycmF5SXRlcmF0b3IgPSBmdW5jdGlvbiBnZXRBcnJheUl0ZXJhdG9yKGFycmF5bGlrZSkge1xuXHRcdHZhciBpID0gMDtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcblx0XHRcdFx0dmFyIGRvbmUgPSBpID49IGFycmF5bGlrZS5sZW5ndGg7XG5cdFx0XHRcdHZhciB2YWx1ZTtcblx0XHRcdFx0aWYgKCFkb25lKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBhcnJheWxpa2VbaV07XG5cdFx0XHRcdFx0aSArPSAxO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0ZG9uZTogZG9uZSxcblx0XHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9O1xuXHR9O1xuXG5cdHZhciBnZXROb25Db2xsZWN0aW9uSXRlcmF0b3IgPSBmdW5jdGlvbiBnZXROb25Db2xsZWN0aW9uSXRlcmF0b3IoaXRlcmFibGUsIG5vUHJpbW9yZGlhbENvbGxlY3Rpb25zKSB7XG5cdFx0aWYgKGlzQXJyYXkoaXRlcmFibGUpIHx8IGlzQXJndW1lbnRzKGl0ZXJhYmxlKSkge1xuXHRcdFx0cmV0dXJuIGdldEFycmF5SXRlcmF0b3IoaXRlcmFibGUpO1xuXHRcdH1cblx0XHRpZiAoaXNTdHJpbmcoaXRlcmFibGUpKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuXHRcdFx0XHRcdHZhciBuZXh0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoaXRlcmFibGUsIGkpO1xuXHRcdFx0XHRcdHZhciB2YWx1ZSA9ICRzdHJpbmdTbGljZShpdGVyYWJsZSwgaSwgbmV4dEluZGV4KTtcblx0XHRcdFx0XHRpID0gbmV4dEluZGV4O1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRkb25lOiBuZXh0SW5kZXggPiBpdGVyYWJsZS5sZW5ndGgsXG5cdFx0XHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIGVzNi1zaGltIGFuZCBlcy1zaGltcycgZXMtbWFwIHVzZSBhIHN0cmluZyBcIl9lczYtc2hpbSBpdGVyYXRvcl9cIiBwcm9wZXJ0eSBvbiBkaWZmZXJlbnQgaXRlcmFibGVzLCBzdWNoIGFzIE1hcEl0ZXJhdG9yLlxuXHRcdGlmIChub1ByaW1vcmRpYWxDb2xsZWN0aW9ucyAmJiB0eXBlb2YgaXRlcmFibGVbJ19lczYtc2hpbSBpdGVyYXRvcl8nXSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHJldHVybiBpdGVyYWJsZVsnX2VzNi1zaGltIGl0ZXJhdG9yXyddKCk7XG5cdFx0fVxuXHR9O1xuXG5cdGlmICghJE1hcCAmJiAhJFNldCkge1xuXHRcdC8vIHRoZSBvbmx5IGxhbmd1YWdlIGl0ZXJhYmxlcyBhcmUgQXJyYXksIFN0cmluZywgYXJndW1lbnRzXG5cdFx0Ly8gLSBTYWZhcmkgPD0gNi4wXG5cdFx0Ly8gLSBDaHJvbWUgPCAzOFxuXHRcdC8vIC0gbm9kZSA8IDAuMTJcblx0XHQvLyAtIEZGIDwgMTNcblx0XHQvLyAtIElFIDwgMTFcblx0XHQvLyAtIEVkZ2UgPCAxMVxuXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRJdGVyYXRvcihpdGVyYWJsZSkge1xuXHRcdFx0aWYgKGl0ZXJhYmxlICE9IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuIGdldE5vbkNvbGxlY3Rpb25JdGVyYXRvcihpdGVyYWJsZSwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHQvLyBlaXRoZXIgTWFwIG9yIFNldCBhcmUgYXZhaWxhYmxlLCBidXQgU3ltYm9sIGlzIG5vdFxuXHRcdC8vIC0gZXM2LXNoaW0gb24gYW4gRVM1IGJyb3dzZXJcblx0XHQvLyAtIFNhZmFyaSA2LjIgKG1heWJlIDYuMT8pXG5cdFx0Ly8gLSBGRiB2WzEzLCAzNilcblx0XHQvLyAtIElFIDExXG5cdFx0Ly8gLSBFZGdlIDExXG5cdFx0Ly8gLSBTYWZhcmkgdls2LCA5KVxuXG5cdFx0dmFyIGlzTWFwID0gcmVxdWlyZSgnaXMtbWFwJyk7XG5cdFx0dmFyIGlzU2V0ID0gcmVxdWlyZSgnaXMtc2V0Jyk7XG5cblx0XHQvLyBGaXJlZm94ID49IDI3LCBJRSAxMSwgU2FmYXJpIDYuMiAtIDksIEVkZ2UgMTEsIGVzNi1zaGltIGluIG9sZGVyIGVudnMsIGFsbCBoYXZlIGZvckVhY2hcblx0XHR2YXIgJG1hcEZvckVhY2ggPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuZm9yRWFjaCcsIHRydWUpO1xuXHRcdHZhciAkc2V0Rm9yRWFjaCA9IGNhbGxCb3VuZCgnU2V0LnByb3RvdHlwZS5mb3JFYWNoJywgdHJ1ZSk7XG5cdFx0aWYgKHR5cGVvZiBwcm9jZXNzID09PSAndW5kZWZpbmVkJyB8fCAhcHJvY2Vzcy52ZXJzaW9ucyB8fCAhcHJvY2Vzcy52ZXJzaW9ucy5ub2RlKSB7IC8vIFwiaWYgaXMgbm90IG5vZGVcIlxuXG5cdFx0XHQvLyBGaXJlZm94IDE3IC0gMjYgaGFzIGAuaXRlcmF0b3IoKWAsIHdob3NlIGl0ZXJhdG9yIGAubmV4dCgpYCBlaXRoZXJcblx0XHRcdC8vIHJldHVybnMgYSB2YWx1ZSwgb3IgdGhyb3dzIGEgU3RvcEl0ZXJhdGlvbiBvYmplY3QuIFRoZXNlIGJyb3dzZXJzXG5cdFx0XHQvLyBkbyBub3QgaGF2ZSBhbnkgb3RoZXIgbWVjaGFuaXNtIGZvciBpdGVyYXRpb24uXG5cdFx0XHR2YXIgJG1hcEl0ZXJhdG9yID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLml0ZXJhdG9yJywgdHJ1ZSk7XG5cdFx0XHR2YXIgJHNldEl0ZXJhdG9yID0gY2FsbEJvdW5kKCdTZXQucHJvdG90eXBlLml0ZXJhdG9yJywgdHJ1ZSk7XG5cdFx0XHR2YXIgZ2V0U3RvcEl0ZXJhdGlvbkl0ZXJhdG9yID0gZnVuY3Rpb24gKGl0ZXJhdG9yKSB7XG5cdFx0XHRcdHZhciBkb25lID0gZmFsc2U7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0bmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0ZG9uZTogZG9uZSxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogZG9uZSA/IHVuZGVmaW5lZCA6IGl0ZXJhdG9yLm5leHQoKVxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdFx0XHRkb25lID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRkb25lOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXHRcdH1cblx0XHQvLyBGaXJlZm94IDI3LTM1LCBhbmQgc29tZSBvbGRlciBlczYtc2hpbSB2ZXJzaW9ucywgdXNlIGEgc3RyaW5nIFwiQEBpdGVyYXRvclwiIHByb3BlcnR5XG5cdFx0Ly8gdGhpcyByZXR1cm5zIGEgcHJvcGVyIGl0ZXJhdG9yIG9iamVjdCwgc28gd2Ugc2hvdWxkIHVzZSBpdCBpbnN0ZWFkIG9mIGZvckVhY2guXG5cdFx0Ly8gbmV3ZXIgZXM2LXNoaW0gdmVyc2lvbnMgdXNlIGEgc3RyaW5nIFwiX2VzNi1zaGltIGl0ZXJhdG9yX1wiIHByb3BlcnR5LlxuXHRcdHZhciAkbWFwQXRBdEl0ZXJhdG9yID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLkBAaXRlcmF0b3InLCB0cnVlKSB8fCBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuX2VzNi1zaGltIGl0ZXJhdG9yXycsIHRydWUpO1xuXHRcdHZhciAkc2V0QXRBdEl0ZXJhdG9yID0gY2FsbEJvdW5kKCdTZXQucHJvdG90eXBlLkBAaXRlcmF0b3InLCB0cnVlKSB8fCBjYWxsQm91bmQoJ1NldC5wcm90b3R5cGUuX2VzNi1zaGltIGl0ZXJhdG9yXycsIHRydWUpO1xuXG5cdFx0dmFyIGdldENvbGxlY3Rpb25JdGVyYXRvciA9IGZ1bmN0aW9uIGdldENvbGxlY3Rpb25JdGVyYXRvcihpdGVyYWJsZSkge1xuXHRcdFx0aWYgKGlzTWFwKGl0ZXJhYmxlKSkge1xuXHRcdFx0XHRpZiAoJG1hcEl0ZXJhdG9yKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGdldFN0b3BJdGVyYXRpb25JdGVyYXRvcigkbWFwSXRlcmF0b3IoaXRlcmFibGUpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoJG1hcEF0QXRJdGVyYXRvcikge1xuXHRcdFx0XHRcdHJldHVybiAkbWFwQXRBdEl0ZXJhdG9yKGl0ZXJhYmxlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoJG1hcEZvckVhY2gpIHtcblx0XHRcdFx0XHR2YXIgZW50cmllcyA9IFtdO1xuXHRcdFx0XHRcdCRtYXBGb3JFYWNoKGl0ZXJhYmxlLCBmdW5jdGlvbiAodiwgaykge1xuXHRcdFx0XHRcdFx0JGFycmF5UHVzaChlbnRyaWVzLCBbaywgdl0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJldHVybiBnZXRBcnJheUl0ZXJhdG9yKGVudHJpZXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoaXNTZXQoaXRlcmFibGUpKSB7XG5cdFx0XHRcdGlmICgkc2V0SXRlcmF0b3IpIHtcblx0XHRcdFx0XHRyZXR1cm4gZ2V0U3RvcEl0ZXJhdGlvbkl0ZXJhdG9yKCRzZXRJdGVyYXRvcihpdGVyYWJsZSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICgkc2V0QXRBdEl0ZXJhdG9yKSB7XG5cdFx0XHRcdFx0cmV0dXJuICRzZXRBdEF0SXRlcmF0b3IoaXRlcmFibGUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICgkc2V0Rm9yRWFjaCkge1xuXHRcdFx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblx0XHRcdFx0XHQkc2V0Rm9yRWFjaChpdGVyYWJsZSwgZnVuY3Rpb24gKHYpIHtcblx0XHRcdFx0XHRcdCRhcnJheVB1c2godmFsdWVzLCB2KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRyZXR1cm4gZ2V0QXJyYXlJdGVyYXRvcih2YWx1ZXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0SXRlcmF0b3IoaXRlcmFibGUpIHtcblx0XHRcdHJldHVybiBnZXRDb2xsZWN0aW9uSXRlcmF0b3IoaXRlcmFibGUpIHx8IGdldE5vbkNvbGxlY3Rpb25JdGVyYXRvcihpdGVyYWJsZSk7XG5cdFx0fTtcblx0fVxufVxuXG59KS5jYWxsKHRoaXMscmVxdWlyZShcIktsaXViSFwiKSkiLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNTeW1ib2xzID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnc3ltYm9sJztcblxudmFyIGlzUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzUHJpbWl0aXZlJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJ2lzLWNhbGxhYmxlJyk7XG52YXIgaXNEYXRlID0gcmVxdWlyZSgnaXMtZGF0ZS1vYmplY3QnKTtcbnZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJ2lzLXN5bWJvbCcpO1xuXG52YXIgb3JkaW5hcnlUb1ByaW1pdGl2ZSA9IGZ1bmN0aW9uIE9yZGluYXJ5VG9QcmltaXRpdmUoTywgaGludCkge1xuXHRpZiAodHlwZW9mIE8gPT09ICd1bmRlZmluZWQnIHx8IE8gPT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBtZXRob2Qgb24gJyArIE8pO1xuXHR9XG5cdGlmICh0eXBlb2YgaGludCAhPT0gJ3N0cmluZycgfHwgKGhpbnQgIT09ICdudW1iZXInICYmIGhpbnQgIT09ICdzdHJpbmcnKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ2hpbnQgbXVzdCBiZSBcInN0cmluZ1wiIG9yIFwibnVtYmVyXCInKTtcblx0fVxuXHR2YXIgbWV0aG9kTmFtZXMgPSBoaW50ID09PSAnc3RyaW5nJyA/IFsndG9TdHJpbmcnLCAndmFsdWVPZiddIDogWyd2YWx1ZU9mJywgJ3RvU3RyaW5nJ107XG5cdHZhciBtZXRob2QsIHJlc3VsdCwgaTtcblx0Zm9yIChpID0gMDsgaSA8IG1ldGhvZE5hbWVzLmxlbmd0aDsgKytpKSB7XG5cdFx0bWV0aG9kID0gT1ttZXRob2ROYW1lc1tpXV07XG5cdFx0aWYgKGlzQ2FsbGFibGUobWV0aG9kKSkge1xuXHRcdFx0cmVzdWx0ID0gbWV0aG9kLmNhbGwoTyk7XG5cdFx0XHRpZiAoaXNQcmltaXRpdmUocmVzdWx0KSkge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHR0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBkZWZhdWx0IHZhbHVlJyk7XG59O1xuXG52YXIgR2V0TWV0aG9kID0gZnVuY3Rpb24gR2V0TWV0aG9kKE8sIFApIHtcblx0dmFyIGZ1bmMgPSBPW1BdO1xuXHRpZiAoZnVuYyAhPT0gbnVsbCAmJiB0eXBlb2YgZnVuYyAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRpZiAoIWlzQ2FsbGFibGUoZnVuYykpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoZnVuYyArICcgcmV0dXJuZWQgZm9yIHByb3BlcnR5ICcgKyBQICsgJyBvZiBvYmplY3QgJyArIE8gKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG5cdFx0fVxuXHRcdHJldHVybiBmdW5jO1xuXHR9XG5cdHJldHVybiB2b2lkIDA7XG59O1xuXG4vLyBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtdG9wcmltaXRpdmVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gVG9QcmltaXRpdmUoaW5wdXQpIHtcblx0aWYgKGlzUHJpbWl0aXZlKGlucHV0KSkge1xuXHRcdHJldHVybiBpbnB1dDtcblx0fVxuXHR2YXIgaGludCA9ICdkZWZhdWx0Jztcblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdFx0aWYgKGFyZ3VtZW50c1sxXSA9PT0gU3RyaW5nKSB7XG5cdFx0XHRoaW50ID0gJ3N0cmluZyc7XG5cdFx0fSBlbHNlIGlmIChhcmd1bWVudHNbMV0gPT09IE51bWJlcikge1xuXHRcdFx0aGludCA9ICdudW1iZXInO1xuXHRcdH1cblx0fVxuXG5cdHZhciBleG90aWNUb1ByaW07XG5cdGlmIChoYXNTeW1ib2xzKSB7XG5cdFx0aWYgKFN5bWJvbC50b1ByaW1pdGl2ZSkge1xuXHRcdFx0ZXhvdGljVG9QcmltID0gR2V0TWV0aG9kKGlucHV0LCBTeW1ib2wudG9QcmltaXRpdmUpO1xuXHRcdH0gZWxzZSBpZiAoaXNTeW1ib2woaW5wdXQpKSB7XG5cdFx0XHRleG90aWNUb1ByaW0gPSBTeW1ib2wucHJvdG90eXBlLnZhbHVlT2Y7XG5cdFx0fVxuXHR9XG5cdGlmICh0eXBlb2YgZXhvdGljVG9QcmltICE9PSAndW5kZWZpbmVkJykge1xuXHRcdHZhciByZXN1bHQgPSBleG90aWNUb1ByaW0uY2FsbChpbnB1dCwgaGludCk7XG5cdFx0aWYgKGlzUHJpbWl0aXZlKHJlc3VsdCkpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3VuYWJsZSB0byBjb252ZXJ0IGV4b3RpYyBvYmplY3QgdG8gcHJpbWl0aXZlJyk7XG5cdH1cblx0aWYgKGhpbnQgPT09ICdkZWZhdWx0JyAmJiAoaXNEYXRlKGlucHV0KSB8fCBpc1N5bWJvbChpbnB1dCkpKSB7XG5cdFx0aGludCA9ICdzdHJpbmcnO1xuXHR9XG5cdHJldHVybiBvcmRpbmFyeVRvUHJpbWl0aXZlKGlucHV0LCBoaW50ID09PSAnZGVmYXVsdCcgPyAnbnVtYmVyJyA6IGhpbnQpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCdpcy1jYWxsYWJsZScpO1xuXG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIGZvckVhY2hBcnJheSA9IGZ1bmN0aW9uIGZvckVhY2hBcnJheShhcnJheSwgaXRlcmF0b3IsIHJlY2VpdmVyKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCBpKSkge1xuICAgICAgICAgICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpdGVyYXRvcihhcnJheVtpXSwgaSwgYXJyYXkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdGVyYXRvci5jYWxsKHJlY2VpdmVyLCBhcnJheVtpXSwgaSwgYXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxudmFyIGZvckVhY2hTdHJpbmcgPSBmdW5jdGlvbiBmb3JFYWNoU3RyaW5nKHN0cmluZywgaXRlcmF0b3IsIHJlY2VpdmVyKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0cmluZy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAvLyBubyBzdWNoIHRoaW5nIGFzIGEgc3BhcnNlIHN0cmluZy5cbiAgICAgICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yKHN0cmluZy5jaGFyQXQoaSksIGksIHN0cmluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdGVyYXRvci5jYWxsKHJlY2VpdmVyLCBzdHJpbmcuY2hhckF0KGkpLCBpLCBzdHJpbmcpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxudmFyIGZvckVhY2hPYmplY3QgPSBmdW5jdGlvbiBmb3JFYWNoT2JqZWN0KG9iamVjdCwgaXRlcmF0b3IsIHJlY2VpdmVyKSB7XG4gICAgZm9yICh2YXIgayBpbiBvYmplY3QpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrKSkge1xuICAgICAgICAgICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpdGVyYXRvcihvYmplY3Rba10sIGssIG9iamVjdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwocmVjZWl2ZXIsIG9iamVjdFtrXSwgaywgb2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cbnZhciBmb3JFYWNoID0gZnVuY3Rpb24gZm9yRWFjaChsaXN0LCBpdGVyYXRvciwgdGhpc0FyZykge1xuICAgIGlmICghaXNDYWxsYWJsZShpdGVyYXRvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaXRlcmF0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgdmFyIHJlY2VpdmVyO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIHtcbiAgICAgICAgcmVjZWl2ZXIgPSB0aGlzQXJnO1xuICAgIH1cblxuICAgIGlmICh0b1N0ci5jYWxsKGxpc3QpID09PSAnW29iamVjdCBBcnJheV0nKSB7XG4gICAgICAgIGZvckVhY2hBcnJheShsaXN0LCBpdGVyYXRvciwgcmVjZWl2ZXIpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGZvckVhY2hTdHJpbmcobGlzdCwgaXRlcmF0b3IsIHJlY2VpdmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3JFYWNoT2JqZWN0KGxpc3QsIGl0ZXJhdG9yLCByZWNlaXZlcik7XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmb3JFYWNoO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQgbm8taW52YWxpZC10aGlzOiAxICovXG5cbnZhciBFUlJPUl9NRVNTQUdFID0gJ0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgJztcbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgZnVuY1R5cGUgPSAnW29iamVjdCBGdW5jdGlvbl0nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJpbmQodGhhdCkge1xuICAgIHZhciB0YXJnZXQgPSB0aGlzO1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnZnVuY3Rpb24nIHx8IHRvU3RyLmNhbGwodGFyZ2V0KSAhPT0gZnVuY1R5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJPUl9NRVNTQUdFICsgdGFyZ2V0KTtcbiAgICB9XG4gICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG5cbiAgICB2YXIgYm91bmQ7XG4gICAgdmFyIGJpbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBib3VuZCkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRhcmdldC5hcHBseShcbiAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgIGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoT2JqZWN0KHJlc3VsdCkgPT09IHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICAgICAgdGhhdCxcbiAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBib3VuZExlbmd0aCA9IE1hdGgubWF4KDAsIHRhcmdldC5sZW5ndGggLSBhcmdzLmxlbmd0aCk7XG4gICAgdmFyIGJvdW5kQXJncyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm91bmRMZW5ndGg7IGkrKykge1xuICAgICAgICBib3VuZEFyZ3MucHVzaCgnJCcgKyBpKTtcbiAgICB9XG5cbiAgICBib3VuZCA9IEZ1bmN0aW9uKCdiaW5kZXInLCAncmV0dXJuIGZ1bmN0aW9uICgnICsgYm91bmRBcmdzLmpvaW4oJywnKSArICcpeyByZXR1cm4gYmluZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsgfScpKGJpbmRlcik7XG5cbiAgICBpZiAodGFyZ2V0LnByb3RvdHlwZSkge1xuICAgICAgICB2YXIgRW1wdHkgPSBmdW5jdGlvbiBFbXB0eSgpIHt9O1xuICAgICAgICBFbXB0eS5wcm90b3R5cGUgPSB0YXJnZXQucHJvdG90eXBlO1xuICAgICAgICBib3VuZC5wcm90b3R5cGUgPSBuZXcgRW1wdHkoKTtcbiAgICAgICAgRW1wdHkucHJvdG90eXBlID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gYm91bmQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgfHwgaW1wbGVtZW50YXRpb247XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBmdW5jdGlvbnNIYXZlTmFtZXMgPSBmdW5jdGlvbiBmdW5jdGlvbnNIYXZlTmFtZXMoKSB7XG5cdHJldHVybiB0eXBlb2YgZnVuY3Rpb24gZigpIHt9Lm5hbWUgPT09ICdzdHJpbmcnO1xufTtcblxudmFyIGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuaWYgKGdPUEQpIHtcblx0dHJ5IHtcblx0XHRnT1BEKFtdLCAnbGVuZ3RoJyk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJRSA4IGhhcyBhIGJyb2tlbiBnT1BEXG5cdFx0Z09QRCA9IG51bGw7XG5cdH1cbn1cblxuZnVuY3Rpb25zSGF2ZU5hbWVzLmZ1bmN0aW9uc0hhdmVDb25maWd1cmFibGVOYW1lcyA9IGZ1bmN0aW9uIGZ1bmN0aW9uc0hhdmVDb25maWd1cmFibGVOYW1lcygpIHtcblx0aWYgKCFmdW5jdGlvbnNIYXZlTmFtZXMoKSB8fCAhZ09QRCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHR2YXIgZGVzYyA9IGdPUEQoZnVuY3Rpb24gKCkge30sICduYW1lJyk7XG5cdHJldHVybiAhIWRlc2MgJiYgISFkZXNjLmNvbmZpZ3VyYWJsZTtcbn07XG5cbnZhciAkYmluZCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kO1xuXG5mdW5jdGlvbnNIYXZlTmFtZXMuYm91bmRGdW5jdGlvbnNIYXZlTmFtZXMgPSBmdW5jdGlvbiBib3VuZEZ1bmN0aW9uc0hhdmVOYW1lcygpIHtcblx0cmV0dXJuIGZ1bmN0aW9uc0hhdmVOYW1lcygpICYmIHR5cGVvZiAkYmluZCA9PT0gJ2Z1bmN0aW9uJyAmJiBmdW5jdGlvbiBmKCkge30uYmluZCgpLm5hbWUgIT09ICcnO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbnNIYXZlTmFtZXM7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1bmRlZmluZWQ7XG5cbnZhciAkU3ludGF4RXJyb3IgPSBTeW50YXhFcnJvcjtcbnZhciAkRnVuY3Rpb24gPSBGdW5jdGlvbjtcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbnZhciBnZXRFdmFsbGVkQ29uc3RydWN0b3IgPSBmdW5jdGlvbiAoZXhwcmVzc2lvblN5bnRheCkge1xuXHR0cnkge1xuXHRcdHJldHVybiAkRnVuY3Rpb24oJ1widXNlIHN0cmljdFwiOyByZXR1cm4gKCcgKyBleHByZXNzaW9uU3ludGF4ICsgJykuY29uc3RydWN0b3I7JykoKTtcblx0fSBjYXRjaCAoZSkge31cbn07XG5cbnZhciAkZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5pZiAoJGdPUEQpIHtcblx0dHJ5IHtcblx0XHQkZ09QRCh7fSwgJycpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0JGdPUEQgPSBudWxsOyAvLyB0aGlzIGlzIElFIDgsIHdoaWNoIGhhcyBhIGJyb2tlbiBnT1BEXG5cdH1cbn1cblxudmFyIHRocm93VHlwZUVycm9yID0gZnVuY3Rpb24gKCkge1xuXHR0aHJvdyBuZXcgJFR5cGVFcnJvcigpO1xufTtcbnZhciBUaHJvd1R5cGVFcnJvciA9ICRnT1BEXG5cdD8gKGZ1bmN0aW9uICgpIHtcblx0XHR0cnkge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9ucywgbm8tY2FsbGVyLCBuby1yZXN0cmljdGVkLXByb3BlcnRpZXNcblx0XHRcdGFyZ3VtZW50cy5jYWxsZWU7IC8vIElFIDggZG9lcyBub3QgdGhyb3cgaGVyZVxuXHRcdFx0cmV0dXJuIHRocm93VHlwZUVycm9yO1xuXHRcdH0gY2F0Y2ggKGNhbGxlZVRocm93cykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Ly8gSUUgOCB0aHJvd3Mgb24gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhcmd1bWVudHMsICcnKVxuXHRcdFx0XHRyZXR1cm4gJGdPUEQoYXJndW1lbnRzLCAnY2FsbGVlJykuZ2V0O1xuXHRcdFx0fSBjYXRjaCAoZ09QRHRocm93cykge1xuXHRcdFx0XHRyZXR1cm4gdGhyb3dUeXBlRXJyb3I7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KCkpXG5cdDogdGhyb3dUeXBlRXJyb3I7XG5cbnZhciBoYXNTeW1ib2xzID0gcmVxdWlyZSgnaGFzLXN5bWJvbHMnKSgpO1xuXG52YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHguX19wcm90b19fOyB9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvXG5cbnZhciBuZWVkc0V2YWwgPSB7fTtcblxudmFyIFR5cGVkQXJyYXkgPSB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBnZXRQcm90byhVaW50OEFycmF5KTtcblxudmFyIElOVFJJTlNJQ1MgPSB7XG5cdCclQWdncmVnYXRlRXJyb3IlJzogdHlwZW9mIEFnZ3JlZ2F0ZUVycm9yID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEFnZ3JlZ2F0ZUVycm9yLFxuXHQnJUFycmF5JSc6IEFycmF5LFxuXHQnJUFycmF5QnVmZmVyJSc6IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBcnJheUJ1ZmZlcixcblx0JyVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgPyBnZXRQcm90byhbXVtTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkLFxuXHQnJUFzeW5jRnJvbVN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiB1bmRlZmluZWQsXG5cdCclQXN5bmNGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNHZW5lcmF0b3IlJzogbmVlZHNFdmFsLFxuXHQnJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lJzogbmVlZHNFdmFsLFxuXHQnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJzogbmVlZHNFdmFsLFxuXHQnJUF0b21pY3MlJzogdHlwZW9mIEF0b21pY3MgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQXRvbWljcyxcblx0JyVCaWdJbnQlJzogdHlwZW9mIEJpZ0ludCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBCaWdJbnQsXG5cdCclQm9vbGVhbiUnOiBCb29sZWFuLFxuXHQnJURhdGFWaWV3JSc6IHR5cGVvZiBEYXRhVmlldyA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBEYXRhVmlldyxcblx0JyVEYXRlJSc6IERhdGUsXG5cdCclZGVjb2RlVVJJJSc6IGRlY29kZVVSSSxcblx0JyVkZWNvZGVVUklDb21wb25lbnQlJzogZGVjb2RlVVJJQ29tcG9uZW50LFxuXHQnJWVuY29kZVVSSSUnOiBlbmNvZGVVUkksXG5cdCclZW5jb2RlVVJJQ29tcG9uZW50JSc6IGVuY29kZVVSSUNvbXBvbmVudCxcblx0JyVFcnJvciUnOiBFcnJvcixcblx0JyVldmFsJSc6IGV2YWwsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXZhbFxuXHQnJUV2YWxFcnJvciUnOiBFdmFsRXJyb3IsXG5cdCclRmxvYXQzMkFycmF5JSc6IHR5cGVvZiBGbG9hdDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmxvYXQzMkFycmF5LFxuXHQnJUZsb2F0NjRBcnJheSUnOiB0eXBlb2YgRmxvYXQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0NjRBcnJheSxcblx0JyVGaW5hbGl6YXRpb25SZWdpc3RyeSUnOiB0eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmluYWxpemF0aW9uUmVnaXN0cnksXG5cdCclRnVuY3Rpb24lJzogJEZ1bmN0aW9uLFxuXHQnJUdlbmVyYXRvckZ1bmN0aW9uJSc6IG5lZWRzRXZhbCxcblx0JyVJbnQ4QXJyYXklJzogdHlwZW9mIEludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQ4QXJyYXksXG5cdCclSW50MTZBcnJheSUnOiB0eXBlb2YgSW50MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQxNkFycmF5LFxuXHQnJUludDMyQXJyYXklJzogdHlwZW9mIEludDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MzJBcnJheSxcblx0JyVpc0Zpbml0ZSUnOiBpc0Zpbml0ZSxcblx0JyVpc05hTiUnOiBpc05hTixcblx0JyVJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzID8gZ2V0UHJvdG8oZ2V0UHJvdG8oW11bU3ltYm9sLml0ZXJhdG9yXSgpKSkgOiB1bmRlZmluZWQsXG5cdCclSlNPTiUnOiB0eXBlb2YgSlNPTiA9PT0gJ29iamVjdCcgPyBKU09OIDogdW5kZWZpbmVkLFxuXHQnJU1hcCUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IE1hcCxcblx0JyVNYXBJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyA/IHVuZGVmaW5lZCA6IGdldFByb3RvKG5ldyBNYXAoKVtTeW1ib2wuaXRlcmF0b3JdKCkpLFxuXHQnJU1hdGglJzogTWF0aCxcblx0JyVOdW1iZXIlJzogTnVtYmVyLFxuXHQnJU9iamVjdCUnOiBPYmplY3QsXG5cdCclcGFyc2VGbG9hdCUnOiBwYXJzZUZsb2F0LFxuXHQnJXBhcnNlSW50JSc6IHBhcnNlSW50LFxuXHQnJVByb21pc2UlJzogdHlwZW9mIFByb21pc2UgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUHJvbWlzZSxcblx0JyVQcm94eSUnOiB0eXBlb2YgUHJveHkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUHJveHksXG5cdCclUmFuZ2VFcnJvciUnOiBSYW5nZUVycm9yLFxuXHQnJVJlZmVyZW5jZUVycm9yJSc6IFJlZmVyZW5jZUVycm9yLFxuXHQnJVJlZmxlY3QlJzogdHlwZW9mIFJlZmxlY3QgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUmVmbGVjdCxcblx0JyVSZWdFeHAlJzogUmVnRXhwLFxuXHQnJVNldCUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFNldCxcblx0JyVTZXRJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyA/IHVuZGVmaW5lZCA6IGdldFByb3RvKG5ldyBTZXQoKVtTeW1ib2wuaXRlcmF0b3JdKCkpLFxuXHQnJVNoYXJlZEFycmF5QnVmZmVyJSc6IHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTaGFyZWRBcnJheUJ1ZmZlcixcblx0JyVTdHJpbmclJzogU3RyaW5nLFxuXHQnJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgPyBnZXRQcm90bygnJ1tTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkLFxuXHQnJVN5bWJvbCUnOiBoYXNTeW1ib2xzID8gU3ltYm9sIDogdW5kZWZpbmVkLFxuXHQnJVN5bnRheEVycm9yJSc6ICRTeW50YXhFcnJvcixcblx0JyVUaHJvd1R5cGVFcnJvciUnOiBUaHJvd1R5cGVFcnJvcixcblx0JyVUeXBlZEFycmF5JSc6IFR5cGVkQXJyYXksXG5cdCclVHlwZUVycm9yJSc6ICRUeXBlRXJyb3IsXG5cdCclVWludDhBcnJheSUnOiB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OEFycmF5LFxuXHQnJVVpbnQ4Q2xhbXBlZEFycmF5JSc6IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OENsYW1wZWRBcnJheSxcblx0JyVVaW50MTZBcnJheSUnOiB0eXBlb2YgVWludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDE2QXJyYXksXG5cdCclVWludDMyQXJyYXklJzogdHlwZW9mIFVpbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQzMkFycmF5LFxuXHQnJVVSSUVycm9yJSc6IFVSSUVycm9yLFxuXHQnJVdlYWtNYXAlJzogdHlwZW9mIFdlYWtNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha01hcCxcblx0JyVXZWFrUmVmJSc6IHR5cGVvZiBXZWFrUmVmID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtSZWYsXG5cdCclV2Vha1NldCUnOiB0eXBlb2YgV2Vha1NldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrU2V0XG59O1xuXG52YXIgZG9FdmFsID0gZnVuY3Rpb24gZG9FdmFsKG5hbWUpIHtcblx0dmFyIHZhbHVlO1xuXHRpZiAobmFtZSA9PT0gJyVBc3luY0Z1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24gKCkge30nKTtcblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUdlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvciUnKSB7XG5cdFx0dmFyIGZuID0gZG9FdmFsKCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnKTtcblx0XHRpZiAoZm4pIHtcblx0XHRcdHZhbHVlID0gZm4ucHJvdG90eXBlO1xuXHRcdH1cblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJykge1xuXHRcdHZhciBnZW4gPSBkb0V2YWwoJyVBc3luY0dlbmVyYXRvciUnKTtcblx0XHRpZiAoZ2VuKSB7XG5cdFx0XHR2YWx1ZSA9IGdldFByb3RvKGdlbi5wcm90b3R5cGUpO1xuXHRcdH1cblx0fVxuXG5cdElOVFJJTlNJQ1NbbmFtZV0gPSB2YWx1ZTtcblxuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgTEVHQUNZX0FMSUFTRVMgPSB7XG5cdCclQXJyYXlCdWZmZXJQcm90b3R5cGUlJzogWydBcnJheUJ1ZmZlcicsICdwcm90b3R5cGUnXSxcblx0JyVBcnJheVByb3RvdHlwZSUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUFycmF5UHJvdG9fZW50cmllcyUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICdlbnRyaWVzJ10sXG5cdCclQXJyYXlQcm90b19mb3JFYWNoJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ2ZvckVhY2gnXSxcblx0JyVBcnJheVByb3RvX2tleXMlJzogWydBcnJheScsICdwcm90b3R5cGUnLCAna2V5cyddLFxuXHQnJUFycmF5UHJvdG9fdmFsdWVzJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ3ZhbHVlcyddLFxuXHQnJUFzeW5jRnVuY3Rpb25Qcm90b3R5cGUlJzogWydBc3luY0Z1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFzeW5jR2VuZXJhdG9yJSc6IFsnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVBc3luY0dlbmVyYXRvclByb3RvdHlwZSUnOiBbJ0FzeW5jR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJywgJ3Byb3RvdHlwZSddLFxuXHQnJUJvb2xlYW5Qcm90b3R5cGUlJzogWydCb29sZWFuJywgJ3Byb3RvdHlwZSddLFxuXHQnJURhdGFWaWV3UHJvdG90eXBlJSc6IFsnRGF0YVZpZXcnLCAncHJvdG90eXBlJ10sXG5cdCclRGF0ZVByb3RvdHlwZSUnOiBbJ0RhdGUnLCAncHJvdG90eXBlJ10sXG5cdCclRXJyb3JQcm90b3R5cGUlJzogWydFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVFdmFsRXJyb3JQcm90b3R5cGUlJzogWydFdmFsRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclRmxvYXQzMkFycmF5UHJvdG90eXBlJSc6IFsnRmxvYXQzMkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUZsb2F0NjRBcnJheVByb3RvdHlwZSUnOiBbJ0Zsb2F0NjRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVGdW5jdGlvblByb3RvdHlwZSUnOiBbJ0Z1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUdlbmVyYXRvciUnOiBbJ0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUdlbmVyYXRvclByb3RvdHlwZSUnOiBbJ0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQ4QXJyYXlQcm90b3R5cGUlJzogWydJbnQ4QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSW50MTZBcnJheVByb3RvdHlwZSUnOiBbJ0ludDE2QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSW50MzJBcnJheVByb3RvdHlwZSUnOiBbJ0ludDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSlNPTlBhcnNlJSc6IFsnSlNPTicsICdwYXJzZSddLFxuXHQnJUpTT05TdHJpbmdpZnklJzogWydKU09OJywgJ3N0cmluZ2lmeSddLFxuXHQnJU1hcFByb3RvdHlwZSUnOiBbJ01hcCcsICdwcm90b3R5cGUnXSxcblx0JyVOdW1iZXJQcm90b3R5cGUlJzogWydOdW1iZXInLCAncHJvdG90eXBlJ10sXG5cdCclT2JqZWN0UHJvdG90eXBlJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZSddLFxuXHQnJU9ialByb3RvX3RvU3RyaW5nJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZScsICd0b1N0cmluZyddLFxuXHQnJU9ialByb3RvX3ZhbHVlT2YlJzogWydPYmplY3QnLCAncHJvdG90eXBlJywgJ3ZhbHVlT2YnXSxcblx0JyVQcm9taXNlUHJvdG90eXBlJSc6IFsnUHJvbWlzZScsICdwcm90b3R5cGUnXSxcblx0JyVQcm9taXNlUHJvdG9fdGhlbiUnOiBbJ1Byb21pc2UnLCAncHJvdG90eXBlJywgJ3RoZW4nXSxcblx0JyVQcm9taXNlX2FsbCUnOiBbJ1Byb21pc2UnLCAnYWxsJ10sXG5cdCclUHJvbWlzZV9yZWplY3QlJzogWydQcm9taXNlJywgJ3JlamVjdCddLFxuXHQnJVByb21pc2VfcmVzb2x2ZSUnOiBbJ1Byb21pc2UnLCAncmVzb2x2ZSddLFxuXHQnJVJhbmdlRXJyb3JQcm90b3R5cGUlJzogWydSYW5nZUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVJlZmVyZW5jZUVycm9yUHJvdG90eXBlJSc6IFsnUmVmZXJlbmNlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclUmVnRXhwUHJvdG90eXBlJSc6IFsnUmVnRXhwJywgJ3Byb3RvdHlwZSddLFxuXHQnJVNldFByb3RvdHlwZSUnOiBbJ1NldCcsICdwcm90b3R5cGUnXSxcblx0JyVTaGFyZWRBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiBbJ1NoYXJlZEFycmF5QnVmZmVyJywgJ3Byb3RvdHlwZSddLFxuXHQnJVN0cmluZ1Byb3RvdHlwZSUnOiBbJ1N0cmluZycsICdwcm90b3R5cGUnXSxcblx0JyVTeW1ib2xQcm90b3R5cGUlJzogWydTeW1ib2wnLCAncHJvdG90eXBlJ10sXG5cdCclU3ludGF4RXJyb3JQcm90b3R5cGUlJzogWydTeW50YXhFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVUeXBlZEFycmF5UHJvdG90eXBlJSc6IFsnVHlwZWRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVUeXBlRXJyb3JQcm90b3R5cGUlJzogWydUeXBlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclVWludDhBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQ4QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUlJzogWydVaW50OENsYW1wZWRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVaW50MTZBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQxNkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQzMkFycmF5UHJvdG90eXBlJSc6IFsnVWludDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVVJJRXJyb3JQcm90b3R5cGUlJzogWydVUklFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVXZWFrTWFwUHJvdG90eXBlJSc6IFsnV2Vha01hcCcsICdwcm90b3R5cGUnXSxcblx0JyVXZWFrU2V0UHJvdG90eXBlJSc6IFsnV2Vha1NldCcsICdwcm90b3R5cGUnXVxufTtcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnaGFzJyk7XG52YXIgJGNvbmNhdCA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBBcnJheS5wcm90b3R5cGUuY29uY2F0KTtcbnZhciAkc3BsaWNlQXBwbHkgPSBiaW5kLmNhbGwoRnVuY3Rpb24uYXBwbHksIEFycmF5LnByb3RvdHlwZS5zcGxpY2UpO1xudmFyICRyZXBsYWNlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSk7XG52YXIgJHN0clNsaWNlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFN0cmluZy5wcm90b3R5cGUuc2xpY2UpO1xuXG4vKiBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi80LjE3LjE1L2Rpc3QvbG9kYXNoLmpzI0w2NzM1LUw2NzQ0ICovXG52YXIgcmVQcm9wTmFtZSA9IC9bXiUuW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JSQpKS9nO1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nOyAvKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBmdW5jdGlvbiBzdHJpbmdUb1BhdGgoc3RyaW5nKSB7XG5cdHZhciBmaXJzdCA9ICRzdHJTbGljZShzdHJpbmcsIDAsIDEpO1xuXHR2YXIgbGFzdCA9ICRzdHJTbGljZShzdHJpbmcsIC0xKTtcblx0aWYgKGZpcnN0ID09PSAnJScgJiYgbGFzdCAhPT0gJyUnKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBjbG9zaW5nIGAlYCcpO1xuXHR9IGVsc2UgaWYgKGxhc3QgPT09ICclJyAmJiBmaXJzdCAhPT0gJyUnKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBvcGVuaW5nIGAlYCcpO1xuXHR9XG5cdHZhciByZXN1bHQgPSBbXTtcblx0JHJlcGxhY2Uoc3RyaW5nLCByZVByb3BOYW1lLCBmdW5jdGlvbiAobWF0Y2gsIG51bWJlciwgcXVvdGUsIHN1YlN0cmluZykge1xuXHRcdHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHF1b3RlID8gJHJlcGxhY2Uoc3ViU3RyaW5nLCByZUVzY2FwZUNoYXIsICckMScpIDogbnVtYmVyIHx8IG1hdGNoO1xuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG4vKiBlbmQgYWRhcHRhdGlvbiAqL1xuXG52YXIgZ2V0QmFzZUludHJpbnNpYyA9IGZ1bmN0aW9uIGdldEJhc2VJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWNOYW1lID0gbmFtZTtcblx0dmFyIGFsaWFzO1xuXHRpZiAoaGFzT3duKExFR0FDWV9BTElBU0VTLCBpbnRyaW5zaWNOYW1lKSkge1xuXHRcdGFsaWFzID0gTEVHQUNZX0FMSUFTRVNbaW50cmluc2ljTmFtZV07XG5cdFx0aW50cmluc2ljTmFtZSA9ICclJyArIGFsaWFzWzBdICsgJyUnO1xuXHR9XG5cblx0aWYgKGhhc093bihJTlRSSU5TSUNTLCBpbnRyaW5zaWNOYW1lKSkge1xuXHRcdHZhciB2YWx1ZSA9IElOVFJJTlNJQ1NbaW50cmluc2ljTmFtZV07XG5cdFx0aWYgKHZhbHVlID09PSBuZWVkc0V2YWwpIHtcblx0XHRcdHZhbHVlID0gZG9FdmFsKGludHJpbnNpY05hbWUpO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyAmJiAhYWxsb3dNaXNzaW5nKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignaW50cmluc2ljICcgKyBuYW1lICsgJyBleGlzdHMsIGJ1dCBpcyBub3QgYXZhaWxhYmxlLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZSEnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0YWxpYXM6IGFsaWFzLFxuXHRcdFx0bmFtZTogaW50cmluc2ljTmFtZSxcblx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdH07XG5cdH1cblxuXHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdpbnRyaW5zaWMgJyArIG5hbWUgKyAnIGRvZXMgbm90IGV4aXN0IScpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBHZXRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignaW50cmluc2ljIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcblx0fVxuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdHlwZW9mIGFsbG93TWlzc2luZyAhPT0gJ2Jvb2xlYW4nKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1wiYWxsb3dNaXNzaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBhIGJvb2xlYW4nKTtcblx0fVxuXG5cdHZhciBwYXJ0cyA9IHN0cmluZ1RvUGF0aChuYW1lKTtcblx0dmFyIGludHJpbnNpY0Jhc2VOYW1lID0gcGFydHMubGVuZ3RoID4gMCA/IHBhcnRzWzBdIDogJyc7XG5cblx0dmFyIGludHJpbnNpYyA9IGdldEJhc2VJbnRyaW5zaWMoJyUnICsgaW50cmluc2ljQmFzZU5hbWUgKyAnJScsIGFsbG93TWlzc2luZyk7XG5cdHZhciBpbnRyaW5zaWNSZWFsTmFtZSA9IGludHJpbnNpYy5uYW1lO1xuXHR2YXIgdmFsdWUgPSBpbnRyaW5zaWMudmFsdWU7XG5cdHZhciBza2lwRnVydGhlckNhY2hpbmcgPSBmYWxzZTtcblxuXHR2YXIgYWxpYXMgPSBpbnRyaW5zaWMuYWxpYXM7XG5cdGlmIChhbGlhcykge1xuXHRcdGludHJpbnNpY0Jhc2VOYW1lID0gYWxpYXNbMF07XG5cdFx0JHNwbGljZUFwcGx5KHBhcnRzLCAkY29uY2F0KFswLCAxXSwgYWxpYXMpKTtcblx0fVxuXG5cdGZvciAodmFyIGkgPSAxLCBpc093biA9IHRydWU7IGkgPCBwYXJ0cy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdHZhciBwYXJ0ID0gcGFydHNbaV07XG5cdFx0dmFyIGZpcnN0ID0gJHN0clNsaWNlKHBhcnQsIDAsIDEpO1xuXHRcdHZhciBsYXN0ID0gJHN0clNsaWNlKHBhcnQsIC0xKTtcblx0XHRpZiAoXG5cdFx0XHQoXG5cdFx0XHRcdChmaXJzdCA9PT0gJ1wiJyB8fCBmaXJzdCA9PT0gXCInXCIgfHwgZmlyc3QgPT09ICdgJylcblx0XHRcdFx0fHwgKGxhc3QgPT09ICdcIicgfHwgbGFzdCA9PT0gXCInXCIgfHwgbGFzdCA9PT0gJ2AnKVxuXHRcdFx0KVxuXHRcdFx0JiYgZmlyc3QgIT09IGxhc3Rcblx0XHQpIHtcblx0XHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ3Byb3BlcnR5IG5hbWVzIHdpdGggcXVvdGVzIG11c3QgaGF2ZSBtYXRjaGluZyBxdW90ZXMnKTtcblx0XHR9XG5cdFx0aWYgKHBhcnQgPT09ICdjb25zdHJ1Y3RvcicgfHwgIWlzT3duKSB7XG5cdFx0XHRza2lwRnVydGhlckNhY2hpbmcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGludHJpbnNpY0Jhc2VOYW1lICs9ICcuJyArIHBhcnQ7XG5cdFx0aW50cmluc2ljUmVhbE5hbWUgPSAnJScgKyBpbnRyaW5zaWNCYXNlTmFtZSArICclJztcblxuXHRcdGlmIChoYXNPd24oSU5UUklOU0lDUywgaW50cmluc2ljUmVhbE5hbWUpKSB7XG5cdFx0XHR2YWx1ZSA9IElOVFJJTlNJQ1NbaW50cmluc2ljUmVhbE5hbWVdO1xuXHRcdH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0aWYgKCEocGFydCBpbiB2YWx1ZSkpIHtcblx0XHRcdFx0aWYgKCFhbGxvd01pc3NpbmcpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYmFzZSBpbnRyaW5zaWMgZm9yICcgKyBuYW1lICsgJyBleGlzdHMsIGJ1dCB0aGUgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZS4nKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdm9pZCB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoJGdPUEQgJiYgKGkgKyAxKSA+PSBwYXJ0cy5sZW5ndGgpIHtcblx0XHRcdFx0dmFyIGRlc2MgPSAkZ09QRCh2YWx1ZSwgcGFydCk7XG5cdFx0XHRcdGlzT3duID0gISFkZXNjO1xuXG5cdFx0XHRcdC8vIEJ5IGNvbnZlbnRpb24sIHdoZW4gYSBkYXRhIHByb3BlcnR5IGlzIGNvbnZlcnRlZCB0byBhbiBhY2Nlc3NvclxuXHRcdFx0XHQvLyBwcm9wZXJ0eSB0byBlbXVsYXRlIGEgZGF0YSBwcm9wZXJ0eSB0aGF0IGRvZXMgbm90IHN1ZmZlciBmcm9tXG5cdFx0XHRcdC8vIHRoZSBvdmVycmlkZSBtaXN0YWtlLCB0aGF0IGFjY2Vzc29yJ3MgZ2V0dGVyIGlzIG1hcmtlZCB3aXRoXG5cdFx0XHRcdC8vIGFuIGBvcmlnaW5hbFZhbHVlYCBwcm9wZXJ0eS4gSGVyZSwgd2hlbiB3ZSBkZXRlY3QgdGhpcywgd2Vcblx0XHRcdFx0Ly8gdXBob2xkIHRoZSBpbGx1c2lvbiBieSBwcmV0ZW5kaW5nIHRvIHNlZSB0aGF0IG9yaWdpbmFsIGRhdGFcblx0XHRcdFx0Ly8gcHJvcGVydHksIGkuZS4sIHJldHVybmluZyB0aGUgdmFsdWUgcmF0aGVyIHRoYW4gdGhlIGdldHRlclxuXHRcdFx0XHQvLyBpdHNlbGYuXG5cdFx0XHRcdGlmIChpc093biAmJiAnZ2V0JyBpbiBkZXNjICYmICEoJ29yaWdpbmFsVmFsdWUnIGluIGRlc2MuZ2V0KSkge1xuXHRcdFx0XHRcdHZhbHVlID0gZGVzYy5nZXQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZVtwYXJ0XTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aXNPd24gPSBoYXNPd24odmFsdWUsIHBhcnQpO1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlW3BhcnRdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXNPd24gJiYgIXNraXBGdXJ0aGVyQ2FjaGluZykge1xuXHRcdFx0XHRJTlRSSU5TSUNTW2ludHJpbnNpY1JlYWxOYW1lXSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgJEJpZ0ludCA9IHR5cGVvZiBCaWdJbnQgIT09ICd1bmRlZmluZWQnICYmIEJpZ0ludDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNOYXRpdmVCaWdJbnRzKCkge1xuXHRyZXR1cm4gdHlwZW9mICRCaWdJbnQgPT09ICdmdW5jdGlvbidcblx0XHQmJiB0eXBlb2YgQmlnSW50ID09PSAnZnVuY3Rpb24nXG5cdFx0JiYgdHlwZW9mICRCaWdJbnQoNDIpID09PSAnYmlnaW50JyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW1hZ2ljLW51bWJlcnNcblx0XHQmJiB0eXBlb2YgQmlnSW50KDQyKSA9PT0gJ2JpZ2ludCc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IEdldEludHJpbnNpYygnJU9iamVjdC5kZWZpbmVQcm9wZXJ0eSUnLCB0cnVlKTtcblxudmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvcnMgPSBmdW5jdGlvbiBoYXNQcm9wZXJ0eURlc2NyaXB0b3JzKCkge1xuXHRpZiAoJGRlZmluZVByb3BlcnR5KSB7XG5cdFx0dHJ5IHtcblx0XHRcdCRkZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IHZhbHVlOiAxIH0pO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0Ly8gSUUgOCBoYXMgYSBicm9rZW4gZGVmaW5lUHJvcGVydHlcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufTtcblxuaGFzUHJvcGVydHlEZXNjcmlwdG9ycy5oYXNBcnJheUxlbmd0aERlZmluZUJ1ZyA9IGZ1bmN0aW9uIGhhc0FycmF5TGVuZ3RoRGVmaW5lQnVnKCkge1xuXHQvLyBub2RlIHYwLjYgaGFzIGEgYnVnIHdoZXJlIGFycmF5IGxlbmd0aHMgY2FuIGJlIFNldCBidXQgbm90IERlZmluZWRcblx0aWYgKCFoYXNQcm9wZXJ0eURlc2NyaXB0b3JzKCkpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHR0cnkge1xuXHRcdHJldHVybiAkZGVmaW5lUHJvcGVydHkoW10sICdsZW5ndGgnLCB7IHZhbHVlOiAxIH0pLmxlbmd0aCAhPT0gMTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIEluIEZpcmVmb3ggNC0yMiwgZGVmaW5pbmcgbGVuZ3RoIG9uIGFuIGFycmF5IHRocm93cyBhbiBleGNlcHRpb24uXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzUHJvcGVydHlEZXNjcmlwdG9ycztcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG9yaWdTeW1ib2wgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2w7XG52YXIgaGFzU3ltYm9sU2hhbSA9IHJlcXVpcmUoJy4vc2hhbXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNOYXRpdmVTeW1ib2xzKCkge1xuXHRpZiAodHlwZW9mIG9yaWdTeW1ib2wgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIG9yaWdTeW1ib2woJ2ZvbycpICE9PSAnc3ltYm9sJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2woJ2JhcicpICE9PSAnc3ltYm9sJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRyZXR1cm4gaGFzU3ltYm9sU2hhbSgpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IGNvbXBsZXhpdHk6IFsyLCAxOF0sIG1heC1zdGF0ZW1lbnRzOiBbMiwgMzNdICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhhc1N5bWJvbHMoKSB7XG5cdGlmICh0eXBlb2YgU3ltYm9sICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ3N5bWJvbCcpIHsgcmV0dXJuIHRydWU7IH1cblxuXHR2YXIgb2JqID0ge307XG5cdHZhciBzeW0gPSBTeW1ib2woJ3Rlc3QnKTtcblx0dmFyIHN5bU9iaiA9IE9iamVjdChzeW0pO1xuXHRpZiAodHlwZW9mIHN5bSA9PT0gJ3N0cmluZycpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW0pICE9PSAnW29iamVjdCBTeW1ib2xdJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW1PYmopICE9PSAnW29iamVjdCBTeW1ib2xdJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHQvLyB0ZW1wIGRpc2FibGVkIHBlciBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL29iamVjdC5hc3NpZ24vaXNzdWVzLzE3XG5cdC8vIGlmIChzeW0gaW5zdGFuY2VvZiBTeW1ib2wpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdC8vIHRlbXAgZGlzYWJsZWQgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJSZWZsZWN0aW9uL2dldC1vd24tcHJvcGVydHktc3ltYm9scy9pc3N1ZXMvNFxuXHQvLyBpZiAoIShzeW1PYmogaW5zdGFuY2VvZiBTeW1ib2wpKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdC8vIGlmICh0eXBlb2YgU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0Ly8gaWYgKFN0cmluZyhzeW0pICE9PSBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHR2YXIgc3ltVmFsID0gNDI7XG5cdG9ialtzeW1dID0gc3ltVmFsO1xuXHRmb3IgKHN5bSBpbiBvYmopIHsgcmV0dXJuIGZhbHNlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLXVucmVhY2hhYmxlLWxvb3Bcblx0aWYgKHR5cGVvZiBPYmplY3Qua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCAhPT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzID09PSAnZnVuY3Rpb24nICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubGVuZ3RoICE9PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHZhciBzeW1zID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmopO1xuXHRpZiAoc3ltcy5sZW5ndGggIT09IDEgfHwgc3ltc1swXSAhPT0gc3ltKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iaiwgc3ltKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPT09ICdmdW5jdGlvbicpIHtcblx0XHR2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBzeW0pO1xuXHRcdGlmIChkZXNjcmlwdG9yLnZhbHVlICE9PSBzeW1WYWwgfHwgZGVzY3JpcHRvci5lbnVtZXJhYmxlICE9PSB0cnVlKSB7IHJldHVybiBmYWxzZTsgfVxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzL3NoYW1zJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzVG9TdHJpbmdUYWdTaGFtcygpIHtcblx0cmV0dXJuIGhhc1N5bWJvbHMoKSAmJiAhIVN5bWJvbC50b1N0cmluZ1RhZztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcbiIsImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgICB9XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhc1RvU3RyaW5nVGFnID0gcmVxdWlyZSgnaGFzLXRvc3RyaW5ndGFnL3NoYW1zJykoKTtcbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJpbmQvY2FsbEJvdW5kJyk7XG5cbnZhciAkdG9TdHJpbmcgPSBjYWxsQm91bmQoJ09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcnKTtcblxudmFyIGlzU3RhbmRhcmRBcmd1bWVudHMgPSBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuXHRpZiAoaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0cmV0dXJuICR0b1N0cmluZyh2YWx1ZSkgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xufTtcblxudmFyIGlzTGVnYWN5QXJndW1lbnRzID0gZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUpIHtcblx0aWYgKGlzU3RhbmRhcmRBcmd1bWVudHModmFsdWUpKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIHZhbHVlICE9PSBudWxsICYmXG5cdFx0dHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuXHRcdHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICdudW1iZXInICYmXG5cdFx0dmFsdWUubGVuZ3RoID49IDAgJiZcblx0XHQkdG9TdHJpbmcodmFsdWUpICE9PSAnW29iamVjdCBBcnJheV0nICYmXG5cdFx0JHRvU3RyaW5nKHZhbHVlLmNhbGxlZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59O1xuXG52YXIgc3VwcG9ydHNTdGFuZGFyZEFyZ3VtZW50cyA9IChmdW5jdGlvbiAoKSB7XG5cdHJldHVybiBpc1N0YW5kYXJkQXJndW1lbnRzKGFyZ3VtZW50cyk7XG59KCkpO1xuXG5pc1N0YW5kYXJkQXJndW1lbnRzLmlzTGVnYWN5QXJndW1lbnRzID0gaXNMZWdhY3lBcmd1bWVudHM7IC8vIGZvciB0ZXN0c1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN1cHBvcnRzU3RhbmRhcmRBcmd1bWVudHMgPyBpc1N0YW5kYXJkQXJndW1lbnRzIDogaXNMZWdhY3lBcmd1bWVudHM7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNCaWdJbnRzID0gcmVxdWlyZSgnaGFzLWJpZ2ludHMnKSgpO1xuXG5pZiAoaGFzQmlnSW50cykge1xuXHR2YXIgYmlnSW50VmFsdWVPZiA9IEJpZ0ludC5wcm90b3R5cGUudmFsdWVPZjtcblx0dmFyIHRyeUJpZ0ludCA9IGZ1bmN0aW9uIHRyeUJpZ0ludE9iamVjdCh2YWx1ZSkge1xuXHRcdHRyeSB7XG5cdFx0XHRiaWdJbnRWYWx1ZU9mLmNhbGwodmFsdWUpO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0JpZ0ludCh2YWx1ZSkge1xuXHRcdGlmIChcblx0XHRcdHZhbHVlID09PSBudWxsXG5cdFx0XHR8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnXG5cdFx0XHR8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJ1xuXHRcdFx0fHwgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuXHRcdFx0fHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJ1xuXHRcdFx0fHwgdHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJ1xuXHRcdFx0fHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ5QmlnSW50KHZhbHVlKTtcblx0fTtcbn0gZWxzZSB7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCaWdJbnQodmFsdWUpIHtcblx0XHRyZXR1cm4gZmFsc2UgJiYgdmFsdWU7XG5cdH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJpbmQvY2FsbEJvdW5kJyk7XG52YXIgJGJvb2xUb1N0ciA9IGNhbGxCb3VuZCgnQm9vbGVhbi5wcm90b3R5cGUudG9TdHJpbmcnKTtcbnZhciAkdG9TdHJpbmcgPSBjYWxsQm91bmQoJ09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcnKTtcblxudmFyIHRyeUJvb2xlYW5PYmplY3QgPSBmdW5jdGlvbiBib29sZWFuQnJhbmRDaGVjayh2YWx1ZSkge1xuXHR0cnkge1xuXHRcdCRib29sVG9TdHIodmFsdWUpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xudmFyIGJvb2xDbGFzcyA9ICdbb2JqZWN0IEJvb2xlYW5dJztcbnZhciBoYXNUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJ2hhcy10b3N0cmluZ3RhZy9zaGFtcycpKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlKSB7XG5cdGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHJldHVybiBoYXNUb1N0cmluZ1RhZyAmJiBTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUgPyB0cnlCb29sZWFuT2JqZWN0KHZhbHVlKSA6ICR0b1N0cmluZyh2YWx1ZSkgPT09IGJvb2xDbGFzcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBmblRvU3RyID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIHJlZmxlY3RBcHBseSA9IHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0ICE9PSBudWxsICYmIFJlZmxlY3QuYXBwbHk7XG52YXIgYmFkQXJyYXlMaWtlO1xudmFyIGlzQ2FsbGFibGVNYXJrZXI7XG5pZiAodHlwZW9mIHJlZmxlY3RBcHBseSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG5cdHRyeSB7XG5cdFx0YmFkQXJyYXlMaWtlID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnbGVuZ3RoJywge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHRocm93IGlzQ2FsbGFibGVNYXJrZXI7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0aXNDYWxsYWJsZU1hcmtlciA9IHt9O1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsXG5cdFx0cmVmbGVjdEFwcGx5KGZ1bmN0aW9uICgpIHsgdGhyb3cgNDI7IH0sIG51bGwsIGJhZEFycmF5TGlrZSk7XG5cdH0gY2F0Y2ggKF8pIHtcblx0XHRpZiAoXyAhPT0gaXNDYWxsYWJsZU1hcmtlcikge1xuXHRcdFx0cmVmbGVjdEFwcGx5ID0gbnVsbDtcblx0XHR9XG5cdH1cbn0gZWxzZSB7XG5cdHJlZmxlY3RBcHBseSA9IG51bGw7XG59XG5cbnZhciBjb25zdHJ1Y3RvclJlZ2V4ID0gL15cXHMqY2xhc3NcXGIvO1xudmFyIGlzRVM2Q2xhc3NGbiA9IGZ1bmN0aW9uIGlzRVM2Q2xhc3NGdW5jdGlvbih2YWx1ZSkge1xuXHR0cnkge1xuXHRcdHZhciBmblN0ciA9IGZuVG9TdHIuY2FsbCh2YWx1ZSk7XG5cdFx0cmV0dXJuIGNvbnN0cnVjdG9yUmVnZXgudGVzdChmblN0cik7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7IC8vIG5vdCBhIGZ1bmN0aW9uXG5cdH1cbn07XG5cbnZhciB0cnlGdW5jdGlvbk9iamVjdCA9IGZ1bmN0aW9uIHRyeUZ1bmN0aW9uVG9TdHIodmFsdWUpIHtcblx0dHJ5IHtcblx0XHRpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRmblRvU3RyLmNhbGwodmFsdWUpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBmbkNsYXNzID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbnZhciBnZW5DbGFzcyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmICEhU3ltYm9sLnRvU3RyaW5nVGFnOyAvLyBiZXR0ZXI6IHVzZSBgaGFzLXRvc3RyaW5ndGFnYFxuLyogZ2xvYmFscyBkb2N1bWVudDogZmFsc2UgKi9cbnZhciBkb2N1bWVudERvdEFsbCA9IHR5cGVvZiBkb2N1bWVudCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGRvY3VtZW50LmFsbCA9PT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuYWxsICE9PSB1bmRlZmluZWQgPyBkb2N1bWVudC5hbGwgOiB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSByZWZsZWN0QXBwbHlcblx0PyBmdW5jdGlvbiBpc0NhbGxhYmxlKHZhbHVlKSB7XG5cdFx0aWYgKHZhbHVlID09PSBkb2N1bWVudERvdEFsbCkgeyByZXR1cm4gdHJ1ZTsgfVxuXHRcdGlmICghdmFsdWUpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgJiYgIXZhbHVlLnByb3RvdHlwZSkgeyByZXR1cm4gdHJ1ZTsgfVxuXHRcdHRyeSB7XG5cdFx0XHRyZWZsZWN0QXBwbHkodmFsdWUsIG51bGwsIGJhZEFycmF5TGlrZSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0aWYgKGUgIT09IGlzQ2FsbGFibGVNYXJrZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0fVxuXHRcdHJldHVybiAhaXNFUzZDbGFzc0ZuKHZhbHVlKTtcblx0fVxuXHQ6IGZ1bmN0aW9uIGlzQ2FsbGFibGUodmFsdWUpIHtcblx0XHRpZiAodmFsdWUgPT09IGRvY3VtZW50RG90QWxsKSB7IHJldHVybiB0cnVlOyB9XG5cdFx0aWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhdmFsdWUucHJvdG90eXBlKSB7IHJldHVybiB0cnVlOyB9XG5cdFx0aWYgKGhhc1RvU3RyaW5nVGFnKSB7IHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7IH1cblx0XHRpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHR2YXIgc3RyQ2xhc3MgPSB0b1N0ci5jYWxsKHZhbHVlKTtcblx0XHRyZXR1cm4gc3RyQ2xhc3MgPT09IGZuQ2xhc3MgfHwgc3RyQ2xhc3MgPT09IGdlbkNsYXNzO1xuXHR9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZ2V0RGF5ID0gRGF0ZS5wcm90b3R5cGUuZ2V0RGF5O1xudmFyIHRyeURhdGVPYmplY3QgPSBmdW5jdGlvbiB0cnlEYXRlR2V0RGF5Q2FsbCh2YWx1ZSkge1xuXHR0cnkge1xuXHRcdGdldERheS5jYWxsKHZhbHVlKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBkYXRlQ2xhc3MgPSAnW29iamVjdCBEYXRlXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSByZXF1aXJlKCdoYXMtdG9zdHJpbmd0YWcvc2hhbXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRGF0ZU9iamVjdCh2YWx1ZSkge1xuXHRpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRyZXR1cm4gaGFzVG9TdHJpbmdUYWcgPyB0cnlEYXRlT2JqZWN0KHZhbHVlKSA6IHRvU3RyLmNhbGwodmFsdWUpID09PSBkYXRlQ2xhc3M7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgJE1hcCA9IHR5cGVvZiBNYXAgPT09ICdmdW5jdGlvbicgJiYgTWFwLnByb3RvdHlwZSA/IE1hcCA6IG51bGw7XG52YXIgJFNldCA9IHR5cGVvZiBTZXQgPT09ICdmdW5jdGlvbicgJiYgU2V0LnByb3RvdHlwZSA/IFNldCA6IG51bGw7XG5cbnZhciBleHBvcnRlZDtcblxuaWYgKCEkTWFwKSB7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuXHRleHBvcnRlZCA9IGZ1bmN0aW9uIGlzTWFwKHgpIHtcblx0XHQvLyBgTWFwYCBpcyBub3QgcHJlc2VudCBpbiB0aGlzIGVudmlyb25tZW50LlxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn1cblxudmFyICRtYXBIYXMgPSAkTWFwID8gTWFwLnByb3RvdHlwZS5oYXMgOiBudWxsO1xudmFyICRzZXRIYXMgPSAkU2V0ID8gU2V0LnByb3RvdHlwZS5oYXMgOiBudWxsO1xuaWYgKCFleHBvcnRlZCAmJiAhJG1hcEhhcykge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcblx0ZXhwb3J0ZWQgPSBmdW5jdGlvbiBpc01hcCh4KSB7XG5cdFx0Ly8gYE1hcGAgZG9lcyBub3QgaGF2ZSBhIGBoYXNgIG1ldGhvZFxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRlZCB8fCBmdW5jdGlvbiBpc01hcCh4KSB7XG5cdGlmICgheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0dHJ5IHtcblx0XHQkbWFwSGFzLmNhbGwoeCk7XG5cdFx0aWYgKCRzZXRIYXMpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdCRzZXRIYXMuY2FsbCh4KTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB4IGluc3RhbmNlb2YgJE1hcDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG5cdH0gY2F0Y2ggKGUpIHt9XG5cdHJldHVybiBmYWxzZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBudW1Ub1N0ciA9IE51bWJlci5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgdHJ5TnVtYmVyT2JqZWN0ID0gZnVuY3Rpb24gdHJ5TnVtYmVyT2JqZWN0KHZhbHVlKSB7XG5cdHRyeSB7XG5cdFx0bnVtVG9TdHIuY2FsbCh2YWx1ZSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIG51bUNsYXNzID0gJ1tvYmplY3QgTnVtYmVyXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSByZXF1aXJlKCdoYXMtdG9zdHJpbmd0YWcvc2hhbXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzTnVtYmVyT2JqZWN0KHZhbHVlKSB7XG5cdGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0cmV0dXJuIGhhc1RvU3RyaW5nVGFnID8gdHJ5TnVtYmVyT2JqZWN0KHZhbHVlKSA6IHRvU3RyLmNhbGwodmFsdWUpID09PSBudW1DbGFzcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJpbmQvY2FsbEJvdW5kJyk7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSByZXF1aXJlKCdoYXMtdG9zdHJpbmd0YWcvc2hhbXMnKSgpO1xudmFyIGhhcztcbnZhciAkZXhlYztcbnZhciBpc1JlZ2V4TWFya2VyO1xudmFyIGJhZFN0cmluZ2lmaWVyO1xuXG5pZiAoaGFzVG9TdHJpbmdUYWcpIHtcblx0aGFzID0gY2FsbEJvdW5kKCdPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5Jyk7XG5cdCRleGVjID0gY2FsbEJvdW5kKCdSZWdFeHAucHJvdG90eXBlLmV4ZWMnKTtcblx0aXNSZWdleE1hcmtlciA9IHt9O1xuXG5cdHZhciB0aHJvd1JlZ2V4TWFya2VyID0gZnVuY3Rpb24gKCkge1xuXHRcdHRocm93IGlzUmVnZXhNYXJrZXI7XG5cdH07XG5cdGJhZFN0cmluZ2lmaWVyID0ge1xuXHRcdHRvU3RyaW5nOiB0aHJvd1JlZ2V4TWFya2VyLFxuXHRcdHZhbHVlT2Y6IHRocm93UmVnZXhNYXJrZXJcblx0fTtcblxuXHRpZiAodHlwZW9mIFN5bWJvbC50b1ByaW1pdGl2ZSA9PT0gJ3N5bWJvbCcpIHtcblx0XHRiYWRTdHJpbmdpZmllcltTeW1ib2wudG9QcmltaXRpdmVdID0gdGhyb3dSZWdleE1hcmtlcjtcblx0fVxufVxuXG52YXIgJHRvU3RyaW5nID0gY2FsbEJvdW5kKCdPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nJyk7XG52YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgcmVnZXhDbGFzcyA9ICdbb2JqZWN0IFJlZ0V4cF0nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1RvU3RyaW5nVGFnXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuXHQ/IGZ1bmN0aW9uIGlzUmVnZXgodmFsdWUpIHtcblx0XHRpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR2YXIgZGVzY3JpcHRvciA9IGdPUEQodmFsdWUsICdsYXN0SW5kZXgnKTtcblx0XHR2YXIgaGFzTGFzdEluZGV4RGF0YVByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBoYXMoZGVzY3JpcHRvciwgJ3ZhbHVlJyk7XG5cdFx0aWYgKCFoYXNMYXN0SW5kZXhEYXRhUHJvcGVydHkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0JGV4ZWModmFsdWUsIGJhZFN0cmluZ2lmaWVyKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gZSA9PT0gaXNSZWdleE1hcmtlcjtcblx0XHR9XG5cdH1cblx0OiBmdW5jdGlvbiBpc1JlZ2V4KHZhbHVlKSB7XG5cdFx0Ly8gSW4gb2xkZXIgYnJvd3NlcnMsIHR5cGVvZiByZWdleCBpbmNvcnJlY3RseSByZXR1cm5zICdmdW5jdGlvbidcblx0XHRpZiAoIXZhbHVlIHx8ICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gJHRvU3RyaW5nKHZhbHVlKSA9PT0gcmVnZXhDbGFzcztcblx0fTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyICRNYXAgPSB0eXBlb2YgTWFwID09PSAnZnVuY3Rpb24nICYmIE1hcC5wcm90b3R5cGUgPyBNYXAgOiBudWxsO1xudmFyICRTZXQgPSB0eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nICYmIFNldC5wcm90b3R5cGUgPyBTZXQgOiBudWxsO1xuXG52YXIgZXhwb3J0ZWQ7XG5cbmlmICghJFNldCkge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcblx0ZXhwb3J0ZWQgPSBmdW5jdGlvbiBpc1NldCh4KSB7XG5cdFx0Ly8gYFNldGAgaXMgbm90IHByZXNlbnQgaW4gdGhpcyBlbnZpcm9ubWVudC5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbnZhciAkbWFwSGFzID0gJE1hcCA/IE1hcC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbnZhciAkc2V0SGFzID0gJFNldCA/IFNldC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbmlmICghZXhwb3J0ZWQgJiYgISRzZXRIYXMpIHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5cdGV4cG9ydGVkID0gZnVuY3Rpb24gaXNTZXQoeCkge1xuXHRcdC8vIGBTZXRgIGRvZXMgbm90IGhhdmUgYSBgaGFzYCBtZXRob2Rcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0ZWQgfHwgZnVuY3Rpb24gaXNTZXQoeCkge1xuXHRpZiAoIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHRyeSB7XG5cdFx0JHNldEhhcy5jYWxsKHgpO1xuXHRcdGlmICgkbWFwSGFzKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHQkbWFwSGFzLmNhbGwoeCk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4geCBpbnN0YW5jZW9mICRTZXQ7IC8vIGNvcmUtanMgd29ya2Fyb3VuZCwgcHJlLXYyLjUuMFxuXHR9IGNhdGNoIChlKSB7fVxuXHRyZXR1cm4gZmFsc2U7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3RyVmFsdWUgPSBTdHJpbmcucHJvdG90eXBlLnZhbHVlT2Y7XG52YXIgdHJ5U3RyaW5nT2JqZWN0ID0gZnVuY3Rpb24gdHJ5U3RyaW5nT2JqZWN0KHZhbHVlKSB7XG5cdHRyeSB7XG5cdFx0c3RyVmFsdWUuY2FsbCh2YWx1ZSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIHN0ckNsYXNzID0gJ1tvYmplY3QgU3RyaW5nXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSByZXF1aXJlKCdoYXMtdG9zdHJpbmd0YWcvc2hhbXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG5cdGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0cmV0dXJuIGhhc1RvU3RyaW5nVGFnID8gdHJ5U3RyaW5nT2JqZWN0KHZhbHVlKSA6IHRvU3RyLmNhbGwodmFsdWUpID09PSBzdHJDbGFzcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzJykoKTtcblxuaWYgKGhhc1N5bWJvbHMpIHtcblx0dmFyIHN5bVRvU3RyID0gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZztcblx0dmFyIHN5bVN0cmluZ1JlZ2V4ID0gL15TeW1ib2xcXCguKlxcKSQvO1xuXHR2YXIgaXNTeW1ib2xPYmplY3QgPSBmdW5jdGlvbiBpc1JlYWxTeW1ib2xPYmplY3QodmFsdWUpIHtcblx0XHRpZiAodHlwZW9mIHZhbHVlLnZhbHVlT2YoKSAhPT0gJ3N5bWJvbCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHN5bVN0cmluZ1JlZ2V4LnRlc3Qoc3ltVG9TdHIuY2FsbCh2YWx1ZSkpO1xuXHR9O1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGlmICh0b1N0ci5jYWxsKHZhbHVlKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBpc1N5bWJvbE9iamVjdCh2YWx1ZSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fTtcbn0gZWxzZSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuXHRcdC8vIHRoaXMgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCBTeW1ib2xzLlxuXHRcdHJldHVybiBmYWxzZSAmJiB2YWx1ZTtcblx0fTtcbn1cbiIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGZvckVhY2ggPSByZXF1aXJlKCdmb3ItZWFjaCcpO1xudmFyIGF2YWlsYWJsZVR5cGVkQXJyYXlzID0gcmVxdWlyZSgnYXZhaWxhYmxlLXR5cGVkLWFycmF5cycpO1xudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJ2NhbGwtYmluZC9jYWxsQm91bmQnKTtcblxudmFyICR0b1N0cmluZyA9IGNhbGxCb3VuZCgnT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZycpO1xudmFyIGhhc1RvU3RyaW5nVGFnID0gcmVxdWlyZSgnaGFzLXRvc3RyaW5ndGFnL3NoYW1zJykoKTtcblxudmFyIGcgPSB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiBnbG9iYWxUaGlzO1xudmFyIHR5cGVkQXJyYXlzID0gYXZhaWxhYmxlVHlwZWRBcnJheXMoKTtcblxudmFyICRpbmRleE9mID0gY2FsbEJvdW5kKCdBcnJheS5wcm90b3R5cGUuaW5kZXhPZicsIHRydWUpIHx8IGZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlKSB7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRpZiAoYXJyYXlbaV0gPT09IHZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gaTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIC0xO1xufTtcbnZhciAkc2xpY2UgPSBjYWxsQm91bmQoJ1N0cmluZy5wcm90b3R5cGUuc2xpY2UnKTtcbnZhciB0b1N0clRhZ3MgPSB7fTtcbnZhciBnT1BEID0gcmVxdWlyZSgnZXMtYWJzdHJhY3QvaGVscGVycy9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsgLy8gcmVxdWlyZSgnZ2V0cHJvdG90eXBlb2YnKTtcbmlmIChoYXNUb1N0cmluZ1RhZyAmJiBnT1BEICYmIGdldFByb3RvdHlwZU9mKSB7XG5cdGZvckVhY2godHlwZWRBcnJheXMsIGZ1bmN0aW9uICh0eXBlZEFycmF5KSB7XG5cdFx0dmFyIGFyciA9IG5ldyBnW3R5cGVkQXJyYXldKCk7XG5cdFx0aWYgKFN5bWJvbC50b1N0cmluZ1RhZyBpbiBhcnIpIHtcblx0XHRcdHZhciBwcm90byA9IGdldFByb3RvdHlwZU9mKGFycik7XG5cdFx0XHR2YXIgZGVzY3JpcHRvciA9IGdPUEQocHJvdG8sIFN5bWJvbC50b1N0cmluZ1RhZyk7XG5cdFx0XHRpZiAoIWRlc2NyaXB0b3IpIHtcblx0XHRcdFx0dmFyIHN1cGVyUHJvdG8gPSBnZXRQcm90b3R5cGVPZihwcm90byk7XG5cdFx0XHRcdGRlc2NyaXB0b3IgPSBnT1BEKHN1cGVyUHJvdG8sIFN5bWJvbC50b1N0cmluZ1RhZyk7XG5cdFx0XHR9XG5cdFx0XHR0b1N0clRhZ3NbdHlwZWRBcnJheV0gPSBkZXNjcmlwdG9yLmdldDtcblx0XHR9XG5cdH0pO1xufVxuXG52YXIgdHJ5VHlwZWRBcnJheXMgPSBmdW5jdGlvbiB0cnlBbGxUeXBlZEFycmF5cyh2YWx1ZSkge1xuXHR2YXIgYW55VHJ1ZSA9IGZhbHNlO1xuXHRmb3JFYWNoKHRvU3RyVGFncywgZnVuY3Rpb24gKGdldHRlciwgdHlwZWRBcnJheSkge1xuXHRcdGlmICghYW55VHJ1ZSkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YW55VHJ1ZSA9IGdldHRlci5jYWxsKHZhbHVlKSA9PT0gdHlwZWRBcnJheTtcblx0XHRcdH0gY2F0Y2ggKGUpIHsgLyoqLyB9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGFueVRydWU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzVHlwZWRBcnJheSh2YWx1ZSkge1xuXHRpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICghaGFzVG9TdHJpbmdUYWcgfHwgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUpKSB7XG5cdFx0dmFyIHRhZyA9ICRzbGljZSgkdG9TdHJpbmcodmFsdWUpLCA4LCAtMSk7XG5cdFx0cmV0dXJuICRpbmRleE9mKHR5cGVkQXJyYXlzLCB0YWcpID4gLTE7XG5cdH1cblx0aWYgKCFnT1BEKSB7IHJldHVybiBmYWxzZTsgfVxuXHRyZXR1cm4gdHJ5VHlwZWRBcnJheXModmFsdWUpO1xufTtcblxufSkuY2FsbCh0aGlzLHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSkiLCIndXNlIHN0cmljdCc7XG5cbnZhciAkV2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nICYmIFdlYWtNYXAucHJvdG90eXBlID8gV2Vha01hcCA6IG51bGw7XG52YXIgJFdlYWtTZXQgPSB0eXBlb2YgV2Vha1NldCA9PT0gJ2Z1bmN0aW9uJyAmJiBXZWFrU2V0LnByb3RvdHlwZSA/IFdlYWtTZXQgOiBudWxsO1xuXG52YXIgZXhwb3J0ZWQ7XG5cbmlmICghJFdlYWtNYXApIHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5cdGV4cG9ydGVkID0gZnVuY3Rpb24gaXNXZWFrTWFwKHgpIHtcblx0XHQvLyBgV2Vha01hcGAgaXMgbm90IHByZXNlbnQgaW4gdGhpcyBlbnZpcm9ubWVudC5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbnZhciAkbWFwSGFzID0gJFdlYWtNYXAgPyAkV2Vha01hcC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbnZhciAkc2V0SGFzID0gJFdlYWtTZXQgPyAkV2Vha1NldC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbmlmICghZXhwb3J0ZWQgJiYgISRtYXBIYXMpIHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5cdGV4cG9ydGVkID0gZnVuY3Rpb24gaXNXZWFrTWFwKHgpIHtcblx0XHQvLyBgV2Vha01hcGAgZG9lcyBub3QgaGF2ZSBhIGBoYXNgIG1ldGhvZFxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRlZCB8fCBmdW5jdGlvbiBpc1dlYWtNYXAoeCkge1xuXHRpZiAoIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHRyeSB7XG5cdFx0JG1hcEhhcy5jYWxsKHgsICRtYXBIYXMpO1xuXHRcdGlmICgkc2V0SGFzKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHQkc2V0SGFzLmNhbGwoeCwgJHNldEhhcyk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4geCBpbnN0YW5jZW9mICRXZWFrTWFwOyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12M1xuXHR9IGNhdGNoIChlKSB7fVxuXHRyZXR1cm4gZmFsc2U7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJ2NhbGwtYmluZC9jYWxsQm91bmQnKTtcblxudmFyICRXZWFrU2V0ID0gR2V0SW50cmluc2ljKCclV2Vha1NldCUnLCB0cnVlKTtcblxudmFyICRzZXRIYXMgPSBjYWxsQm91bmQoJ1dlYWtTZXQucHJvdG90eXBlLmhhcycsIHRydWUpO1xuXG5pZiAoJHNldEhhcykge1xuXHR2YXIgJG1hcEhhcyA9IGNhbGxCb3VuZCgnV2Vha01hcC5wcm90b3R5cGUuaGFzJywgdHJ1ZSk7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1dlYWtTZXQoeCkge1xuXHRcdGlmICgheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdCRzZXRIYXMoeCwgJHNldEhhcyk7XG5cdFx0XHRpZiAoJG1hcEhhcykge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdCRtYXBIYXMoeCwgJG1hcEhhcyk7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHggaW5zdGFuY2VvZiAkV2Vha1NldDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjNcblx0XHR9IGNhdGNoIChlKSB7fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn0gZWxzZSB7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzV2Vha1NldCh4KSB7XG5cdFx0Ly8gYFdlYWtTZXRgIGRvZXMgbm90IGV4aXN0LCBvciBkb2VzIG5vdCBoYXZlIGEgYGhhc2AgbWV0aG9kXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xufVxuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFycikgPT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG4iLCJ2YXIgaGFzTWFwID0gdHlwZW9mIE1hcCA9PT0gJ2Z1bmN0aW9uJyAmJiBNYXAucHJvdG90eXBlO1xudmFyIG1hcFNpemVEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiBoYXNNYXAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE1hcC5wcm90b3R5cGUsICdzaXplJykgOiBudWxsO1xudmFyIG1hcFNpemUgPSBoYXNNYXAgJiYgbWFwU2l6ZURlc2NyaXB0b3IgJiYgdHlwZW9mIG1hcFNpemVEZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJyA/IG1hcFNpemVEZXNjcmlwdG9yLmdldCA6IG51bGw7XG52YXIgbWFwRm9yRWFjaCA9IGhhc01hcCAmJiBNYXAucHJvdG90eXBlLmZvckVhY2g7XG52YXIgaGFzU2V0ID0gdHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJyAmJiBTZXQucHJvdG90eXBlO1xudmFyIHNldFNpemVEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiBoYXNTZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFNldC5wcm90b3R5cGUsICdzaXplJykgOiBudWxsO1xudmFyIHNldFNpemUgPSBoYXNTZXQgJiYgc2V0U2l6ZURlc2NyaXB0b3IgJiYgdHlwZW9mIHNldFNpemVEZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFNpemVEZXNjcmlwdG9yLmdldCA6IG51bGw7XG52YXIgc2V0Rm9yRWFjaCA9IGhhc1NldCAmJiBTZXQucHJvdG90eXBlLmZvckVhY2g7XG52YXIgaGFzV2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nICYmIFdlYWtNYXAucHJvdG90eXBlO1xudmFyIHdlYWtNYXBIYXMgPSBoYXNXZWFrTWFwID8gV2Vha01hcC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbnZhciBoYXNXZWFrU2V0ID0gdHlwZW9mIFdlYWtTZXQgPT09ICdmdW5jdGlvbicgJiYgV2Vha1NldC5wcm90b3R5cGU7XG52YXIgd2Vha1NldEhhcyA9IGhhc1dlYWtTZXQgPyBXZWFrU2V0LnByb3RvdHlwZS5oYXMgOiBudWxsO1xudmFyIGhhc1dlYWtSZWYgPSB0eXBlb2YgV2Vha1JlZiA9PT0gJ2Z1bmN0aW9uJyAmJiBXZWFrUmVmLnByb3RvdHlwZTtcbnZhciB3ZWFrUmVmRGVyZWYgPSBoYXNXZWFrUmVmID8gV2Vha1JlZi5wcm90b3R5cGUuZGVyZWYgOiBudWxsO1xudmFyIGJvb2xlYW5WYWx1ZU9mID0gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZjtcbnZhciBvYmplY3RUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgZnVuY3Rpb25Ub1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbnZhciAkbWF0Y2ggPSBTdHJpbmcucHJvdG90eXBlLm1hdGNoO1xudmFyICRzbGljZSA9IFN0cmluZy5wcm90b3R5cGUuc2xpY2U7XG52YXIgJHJlcGxhY2UgPSBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2U7XG52YXIgJHRvVXBwZXJDYXNlID0gU3RyaW5nLnByb3RvdHlwZS50b1VwcGVyQ2FzZTtcbnZhciAkdG9Mb3dlckNhc2UgPSBTdHJpbmcucHJvdG90eXBlLnRvTG93ZXJDYXNlO1xudmFyICR0ZXN0ID0gUmVnRXhwLnByb3RvdHlwZS50ZXN0O1xudmFyICRjb25jYXQgPSBBcnJheS5wcm90b3R5cGUuY29uY2F0O1xudmFyICRqb2luID0gQXJyYXkucHJvdG90eXBlLmpvaW47XG52YXIgJGFyclNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyICRmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgYmlnSW50VmFsdWVPZiA9IHR5cGVvZiBCaWdJbnQgPT09ICdmdW5jdGlvbicgPyBCaWdJbnQucHJvdG90eXBlLnZhbHVlT2YgOiBudWxsO1xudmFyIGdPUFMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIHN5bVRvU3RyaW5nID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnc3ltYm9sJyA/IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcgOiBudWxsO1xudmFyIGhhc1NoYW1tZWRTeW1ib2xzID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnb2JqZWN0Jztcbi8vIGllLCBgaGFzLXRvc3RyaW5ndGFnL3NoYW1zXG52YXIgdG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC50b1N0cmluZ1RhZyAmJiAodHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyA9PT0gaGFzU2hhbW1lZFN5bWJvbHMgPyAnb2JqZWN0JyA6ICdzeW1ib2wnKVxuICAgID8gU3ltYm9sLnRvU3RyaW5nVGFnXG4gICAgOiBudWxsO1xudmFyIGlzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbnZhciBnUE8gPSAodHlwZW9mIFJlZmxlY3QgPT09ICdmdW5jdGlvbicgPyBSZWZsZWN0LmdldFByb3RvdHlwZU9mIDogT2JqZWN0LmdldFByb3RvdHlwZU9mKSB8fCAoXG4gICAgW10uX19wcm90b19fID09PSBBcnJheS5wcm90b3R5cGUgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b1xuICAgICAgICA/IGZ1bmN0aW9uIChPKSB7XG4gICAgICAgICAgICByZXR1cm4gTy5fX3Byb3RvX187IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG9cbiAgICAgICAgfVxuICAgICAgICA6IG51bGxcbik7XG5cbmZ1bmN0aW9uIGFkZE51bWVyaWNTZXBhcmF0b3IobnVtLCBzdHIpIHtcbiAgICBpZiAoXG4gICAgICAgIG51bSA9PT0gSW5maW5pdHlcbiAgICAgICAgfHwgbnVtID09PSAtSW5maW5pdHlcbiAgICAgICAgfHwgbnVtICE9PSBudW1cbiAgICAgICAgfHwgKG51bSAmJiBudW0gPiAtMTAwMCAmJiBudW0gPCAxMDAwKVxuICAgICAgICB8fCAkdGVzdC5jYWxsKC9lLywgc3RyKVxuICAgICkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICB2YXIgc2VwUmVnZXggPSAvWzAtOV0oPz0oPzpbMC05XXszfSkrKD8hWzAtOV0pKS9nO1xuICAgIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJykge1xuICAgICAgICB2YXIgaW50ID0gbnVtIDwgMCA/IC0kZmxvb3IoLW51bSkgOiAkZmxvb3IobnVtKTsgLy8gdHJ1bmMobnVtKVxuICAgICAgICBpZiAoaW50ICE9PSBudW0pIHtcbiAgICAgICAgICAgIHZhciBpbnRTdHIgPSBTdHJpbmcoaW50KTtcbiAgICAgICAgICAgIHZhciBkZWMgPSAkc2xpY2UuY2FsbChzdHIsIGludFN0ci5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKGludFN0ciwgc2VwUmVnZXgsICckJl8nKSArICcuJyArICRyZXBsYWNlLmNhbGwoJHJlcGxhY2UuY2FsbChkZWMsIC8oWzAtOV17M30pL2csICckJl8nKSwgL18kLywgJycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKHN0ciwgc2VwUmVnZXgsICckJl8nKTtcbn1cblxudmFyIHV0aWxJbnNwZWN0ID0gcmVxdWlyZSgnLi91dGlsLmluc3BlY3QnKTtcbnZhciBpbnNwZWN0Q3VzdG9tID0gdXRpbEluc3BlY3QuY3VzdG9tO1xudmFyIGluc3BlY3RTeW1ib2wgPSBpc1N5bWJvbChpbnNwZWN0Q3VzdG9tKSA/IGluc3BlY3RDdXN0b20gOiBudWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluc3BlY3RfKG9iaiwgb3B0aW9ucywgZGVwdGgsIHNlZW4pIHtcbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBpZiAoaGFzKG9wdHMsICdxdW90ZVN0eWxlJykgJiYgKG9wdHMucXVvdGVTdHlsZSAhPT0gJ3NpbmdsZScgJiYgb3B0cy5xdW90ZVN0eWxlICE9PSAnZG91YmxlJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwicXVvdGVTdHlsZVwiIG11c3QgYmUgXCJzaW5nbGVcIiBvciBcImRvdWJsZVwiJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICAgaGFzKG9wdHMsICdtYXhTdHJpbmdMZW5ndGgnKSAmJiAodHlwZW9mIG9wdHMubWF4U3RyaW5nTGVuZ3RoID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgPyBvcHRzLm1heFN0cmluZ0xlbmd0aCA8IDAgJiYgb3B0cy5tYXhTdHJpbmdMZW5ndGggIT09IEluZmluaXR5XG4gICAgICAgICAgICA6IG9wdHMubWF4U3RyaW5nTGVuZ3RoICE9PSBudWxsXG4gICAgICAgIClcbiAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwibWF4U3RyaW5nTGVuZ3RoXCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgSW5maW5pdHksIG9yIGBudWxsYCcpO1xuICAgIH1cbiAgICB2YXIgY3VzdG9tSW5zcGVjdCA9IGhhcyhvcHRzLCAnY3VzdG9tSW5zcGVjdCcpID8gb3B0cy5jdXN0b21JbnNwZWN0IDogdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGN1c3RvbUluc3BlY3QgIT09ICdib29sZWFuJyAmJiBjdXN0b21JbnNwZWN0ICE9PSAnc3ltYm9sJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJjdXN0b21JbnNwZWN0XCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGB0cnVlYCwgYGZhbHNlYCwgb3IgYFxcJ3N5bWJvbFxcJ2AnKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAgIGhhcyhvcHRzLCAnaW5kZW50JylcbiAgICAgICAgJiYgb3B0cy5pbmRlbnQgIT09IG51bGxcbiAgICAgICAgJiYgb3B0cy5pbmRlbnQgIT09ICdcXHQnXG4gICAgICAgICYmICEocGFyc2VJbnQob3B0cy5pbmRlbnQsIDEwKSA9PT0gb3B0cy5pbmRlbnQgJiYgb3B0cy5pbmRlbnQgPiAwKVxuICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJpbmRlbnRcIiBtdXN0IGJlIFwiXFxcXHRcIiwgYW4gaW50ZWdlciA+IDAsIG9yIGBudWxsYCcpO1xuICAgIH1cbiAgICBpZiAoaGFzKG9wdHMsICdudW1lcmljU2VwYXJhdG9yJykgJiYgdHlwZW9mIG9wdHMubnVtZXJpY1NlcGFyYXRvciAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcIm51bWVyaWNTZXBhcmF0b3JcIiwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYHRydWVgIG9yIGBmYWxzZWAnKTtcbiAgICB9XG4gICAgdmFyIG51bWVyaWNTZXBhcmF0b3IgPSBvcHRzLm51bWVyaWNTZXBhcmF0b3I7XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIG9iaiA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpbnNwZWN0U3RyaW5nKG9iaiwgb3B0cyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAob2JqID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gSW5maW5pdHkgLyBvYmogPiAwID8gJzAnIDogJy0wJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RyID0gU3RyaW5nKG9iaik7XG4gICAgICAgIHJldHVybiBudW1lcmljU2VwYXJhdG9yID8gYWRkTnVtZXJpY1NlcGFyYXRvcihvYmosIHN0cikgOiBzdHI7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYmlnaW50Jykge1xuICAgICAgICB2YXIgYmlnSW50U3RyID0gU3RyaW5nKG9iaikgKyAnbic7XG4gICAgICAgIHJldHVybiBudW1lcmljU2VwYXJhdG9yID8gYWRkTnVtZXJpY1NlcGFyYXRvcihvYmosIGJpZ0ludFN0cikgOiBiaWdJbnRTdHI7XG4gICAgfVxuXG4gICAgdmFyIG1heERlcHRoID0gdHlwZW9mIG9wdHMuZGVwdGggPT09ICd1bmRlZmluZWQnID8gNSA6IG9wdHMuZGVwdGg7XG4gICAgaWYgKHR5cGVvZiBkZXB0aCA9PT0gJ3VuZGVmaW5lZCcpIHsgZGVwdGggPSAwOyB9XG4gICAgaWYgKGRlcHRoID49IG1heERlcHRoICYmIG1heERlcHRoID4gMCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gaXNBcnJheShvYmopID8gJ1tBcnJheV0nIDogJ1tPYmplY3RdJztcbiAgICB9XG5cbiAgICB2YXIgaW5kZW50ID0gZ2V0SW5kZW50KG9wdHMsIGRlcHRoKTtcblxuICAgIGlmICh0eXBlb2Ygc2VlbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2VlbiA9IFtdO1xuICAgIH0gZWxzZSBpZiAoaW5kZXhPZihzZWVuLCBvYmopID49IDApIHtcbiAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnNwZWN0KHZhbHVlLCBmcm9tLCBub0luZGVudCkge1xuICAgICAgICBpZiAoZnJvbSkge1xuICAgICAgICAgICAgc2VlbiA9ICRhcnJTbGljZS5jYWxsKHNlZW4pO1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub0luZGVudCkge1xuICAgICAgICAgICAgdmFyIG5ld09wdHMgPSB7XG4gICAgICAgICAgICAgICAgZGVwdGg6IG9wdHMuZGVwdGhcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoaGFzKG9wdHMsICdxdW90ZVN0eWxlJykpIHtcbiAgICAgICAgICAgICAgICBuZXdPcHRzLnF1b3RlU3R5bGUgPSBvcHRzLnF1b3RlU3R5bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW5zcGVjdF8odmFsdWUsIG5ld09wdHMsIGRlcHRoICsgMSwgc2Vlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3BlY3RfKHZhbHVlLCBvcHRzLCBkZXB0aCArIDEsIHNlZW4pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nICYmICFpc1JlZ0V4cChvYmopKSB7IC8vIGluIG9sZGVyIGVuZ2luZXMsIHJlZ2V4ZXMgYXJlIGNhbGxhYmxlXG4gICAgICAgIHZhciBuYW1lID0gbmFtZU9mKG9iaik7XG4gICAgICAgIHZhciBrZXlzID0gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpO1xuICAgICAgICByZXR1cm4gJ1tGdW5jdGlvbicgKyAobmFtZSA/ICc6ICcgKyBuYW1lIDogJyAoYW5vbnltb3VzKScpICsgJ10nICsgKGtleXMubGVuZ3RoID4gMCA/ICcgeyAnICsgJGpvaW4uY2FsbChrZXlzLCAnLCAnKSArICcgfScgOiAnJyk7XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbChvYmopKSB7XG4gICAgICAgIHZhciBzeW1TdHJpbmcgPSBoYXNTaGFtbWVkU3ltYm9scyA/ICRyZXBsYWNlLmNhbGwoU3RyaW5nKG9iaiksIC9eKFN5bWJvbFxcKC4qXFwpKV9bXildKiQvLCAnJDEnKSA6IHN5bVRvU3RyaW5nLmNhbGwob2JqKTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmICFoYXNTaGFtbWVkU3ltYm9scyA/IG1hcmtCb3hlZChzeW1TdHJpbmcpIDogc3ltU3RyaW5nO1xuICAgIH1cbiAgICBpZiAoaXNFbGVtZW50KG9iaikpIHtcbiAgICAgICAgdmFyIHMgPSAnPCcgKyAkdG9Mb3dlckNhc2UuY2FsbChTdHJpbmcob2JqLm5vZGVOYW1lKSk7XG4gICAgICAgIHZhciBhdHRycyA9IG9iai5hdHRyaWJ1dGVzIHx8IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzICs9ICcgJyArIGF0dHJzW2ldLm5hbWUgKyAnPScgKyB3cmFwUXVvdGVzKHF1b3RlKGF0dHJzW2ldLnZhbHVlKSwgJ2RvdWJsZScsIG9wdHMpO1xuICAgICAgICB9XG4gICAgICAgIHMgKz0gJz4nO1xuICAgICAgICBpZiAob2JqLmNoaWxkTm9kZXMgJiYgb2JqLmNoaWxkTm9kZXMubGVuZ3RoKSB7IHMgKz0gJy4uLic7IH1cbiAgICAgICAgcyArPSAnPC8nICsgJHRvTG93ZXJDYXNlLmNhbGwoU3RyaW5nKG9iai5ub2RlTmFtZSkpICsgJz4nO1xuICAgICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgICBpZiAob2JqLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJ1tdJzsgfVxuICAgICAgICB2YXIgeHMgPSBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCk7XG4gICAgICAgIGlmIChpbmRlbnQgJiYgIXNpbmdsZUxpbmVWYWx1ZXMoeHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1snICsgaW5kZW50ZWRKb2luKHhzLCBpbmRlbnQpICsgJ10nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnWyAnICsgJGpvaW4uY2FsbCh4cywgJywgJykgKyAnIF0nO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcihvYmopKSB7XG4gICAgICAgIHZhciBwYXJ0cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgaWYgKCEoJ2NhdXNlJyBpbiBFcnJvci5wcm90b3R5cGUpICYmICdjYXVzZScgaW4gb2JqICYmICFpc0VudW1lcmFibGUuY2FsbChvYmosICdjYXVzZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3sgWycgKyBTdHJpbmcob2JqKSArICddICcgKyAkam9pbi5jYWxsKCRjb25jYXQuY2FsbCgnW2NhdXNlXTogJyArIGluc3BlY3Qob2JqLmNhdXNlKSwgcGFydHMpLCAnLCAnKSArICcgfSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJ1snICsgU3RyaW5nKG9iaikgKyAnXSc7IH1cbiAgICAgICAgcmV0dXJuICd7IFsnICsgU3RyaW5nKG9iaikgKyAnXSAnICsgJGpvaW4uY2FsbChwYXJ0cywgJywgJykgKyAnIH0nO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgY3VzdG9tSW5zcGVjdCkge1xuICAgICAgICBpZiAoaW5zcGVjdFN5bWJvbCAmJiB0eXBlb2Ygb2JqW2luc3BlY3RTeW1ib2xdID09PSAnZnVuY3Rpb24nICYmIHV0aWxJbnNwZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdXRpbEluc3BlY3Qob2JqLCB7IGRlcHRoOiBtYXhEZXB0aCAtIGRlcHRoIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGN1c3RvbUluc3BlY3QgIT09ICdzeW1ib2wnICYmIHR5cGVvZiBvYmouaW5zcGVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIG9iai5pbnNwZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzTWFwKG9iaikpIHtcbiAgICAgICAgdmFyIG1hcFBhcnRzID0gW107XG4gICAgICAgIG1hcEZvckVhY2guY2FsbChvYmosIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICBtYXBQYXJ0cy5wdXNoKGluc3BlY3Qoa2V5LCBvYmosIHRydWUpICsgJyA9PiAnICsgaW5zcGVjdCh2YWx1ZSwgb2JqKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbk9mKCdNYXAnLCBtYXBTaXplLmNhbGwob2JqKSwgbWFwUGFydHMsIGluZGVudCk7XG4gICAgfVxuICAgIGlmIChpc1NldChvYmopKSB7XG4gICAgICAgIHZhciBzZXRQYXJ0cyA9IFtdO1xuICAgICAgICBzZXRGb3JFYWNoLmNhbGwob2JqLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHNldFBhcnRzLnB1c2goaW5zcGVjdCh2YWx1ZSwgb2JqKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbk9mKCdTZXQnLCBzZXRTaXplLmNhbGwob2JqKSwgc2V0UGFydHMsIGluZGVudCk7XG4gICAgfVxuICAgIGlmIChpc1dlYWtNYXAob2JqKSkge1xuICAgICAgICByZXR1cm4gd2Vha0NvbGxlY3Rpb25PZignV2Vha01hcCcpO1xuICAgIH1cbiAgICBpZiAoaXNXZWFrU2V0KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHdlYWtDb2xsZWN0aW9uT2YoJ1dlYWtTZXQnKTtcbiAgICB9XG4gICAgaWYgKGlzV2Vha1JlZihvYmopKSB7XG4gICAgICAgIHJldHVybiB3ZWFrQ29sbGVjdGlvbk9mKCdXZWFrUmVmJyk7XG4gICAgfVxuICAgIGlmIChpc051bWJlcihvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoaW5zcGVjdChOdW1iZXIob2JqKSkpO1xuICAgIH1cbiAgICBpZiAoaXNCaWdJbnQob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGluc3BlY3QoYmlnSW50VmFsdWVPZi5jYWxsKG9iaikpKTtcbiAgICB9XG4gICAgaWYgKGlzQm9vbGVhbihvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoYm9vbGVhblZhbHVlT2YuY2FsbChvYmopKTtcbiAgICB9XG4gICAgaWYgKGlzU3RyaW5nKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChpbnNwZWN0KFN0cmluZyhvYmopKSk7XG4gICAgfVxuICAgIGlmICghaXNEYXRlKG9iaikgJiYgIWlzUmVnRXhwKG9iaikpIHtcbiAgICAgICAgdmFyIHlzID0gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpO1xuICAgICAgICB2YXIgaXNQbGFpbk9iamVjdCA9IGdQTyA/IGdQTyhvYmopID09PSBPYmplY3QucHJvdG90eXBlIDogb2JqIGluc3RhbmNlb2YgT2JqZWN0IHx8IG9iai5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0O1xuICAgICAgICB2YXIgcHJvdG9UYWcgPSBvYmogaW5zdGFuY2VvZiBPYmplY3QgPyAnJyA6ICdudWxsIHByb3RvdHlwZSc7XG4gICAgICAgIHZhciBzdHJpbmdUYWcgPSAhaXNQbGFpbk9iamVjdCAmJiB0b1N0cmluZ1RhZyAmJiBPYmplY3Qob2JqKSA9PT0gb2JqICYmIHRvU3RyaW5nVGFnIGluIG9iaiA/ICRzbGljZS5jYWxsKHRvU3RyKG9iaiksIDgsIC0xKSA6IHByb3RvVGFnID8gJ09iamVjdCcgOiAnJztcbiAgICAgICAgdmFyIGNvbnN0cnVjdG9yVGFnID0gaXNQbGFpbk9iamVjdCB8fCB0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yICE9PSAnZnVuY3Rpb24nID8gJycgOiBvYmouY29uc3RydWN0b3IubmFtZSA/IG9iai5jb25zdHJ1Y3Rvci5uYW1lICsgJyAnIDogJyc7XG4gICAgICAgIHZhciB0YWcgPSBjb25zdHJ1Y3RvclRhZyArIChzdHJpbmdUYWcgfHwgcHJvdG9UYWcgPyAnWycgKyAkam9pbi5jYWxsKCRjb25jYXQuY2FsbChbXSwgc3RyaW5nVGFnIHx8IFtdLCBwcm90b1RhZyB8fCBbXSksICc6ICcpICsgJ10gJyA6ICcnKTtcbiAgICAgICAgaWYgKHlzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gdGFnICsgJ3t9JzsgfVxuICAgICAgICBpZiAoaW5kZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFnICsgJ3snICsgaW5kZW50ZWRKb2luKHlzLCBpbmRlbnQpICsgJ30nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YWcgKyAneyAnICsgJGpvaW4uY2FsbCh5cywgJywgJykgKyAnIH0nO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKG9iaik7XG59O1xuXG5mdW5jdGlvbiB3cmFwUXVvdGVzKHMsIGRlZmF1bHRTdHlsZSwgb3B0cykge1xuICAgIHZhciBxdW90ZUNoYXIgPSAob3B0cy5xdW90ZVN0eWxlIHx8IGRlZmF1bHRTdHlsZSkgPT09ICdkb3VibGUnID8gJ1wiJyA6IFwiJ1wiO1xuICAgIHJldHVybiBxdW90ZUNoYXIgKyBzICsgcXVvdGVDaGFyO1xufVxuXG5mdW5jdGlvbiBxdW90ZShzKSB7XG4gICAgcmV0dXJuICRyZXBsYWNlLmNhbGwoU3RyaW5nKHMpLCAvXCIvZywgJyZxdW90OycpO1xufVxuXG5mdW5jdGlvbiBpc0FycmF5KG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgQXJyYXldJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cbmZ1bmN0aW9uIGlzRGF0ZShvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IERhdGVdJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cbmZ1bmN0aW9uIGlzUmVnRXhwKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgUmVnRXhwXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc0Vycm9yKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cbmZ1bmN0aW9uIGlzU3RyaW5nKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgU3RyaW5nXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc051bWJlcihvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNCb29sZWFuKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgQm9vbGVhbl0nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuXG4vLyBTeW1ib2wgYW5kIEJpZ0ludCBkbyBoYXZlIFN5bWJvbC50b1N0cmluZ1RhZyBieSBzcGVjLCBzbyB0aGF0IGNhbid0IGJlIHVzZWQgdG8gZWxpbWluYXRlIGZhbHNlIHBvc2l0aXZlc1xuZnVuY3Rpb24gaXNTeW1ib2wob2JqKSB7XG4gICAgaWYgKGhhc1NoYW1tZWRTeW1ib2xzKSB7XG4gICAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqIGluc3RhbmNlb2YgU3ltYm9sO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8ICFzeW1Ub1N0cmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHN5bVRvU3RyaW5nLmNhbGwob2JqKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzQmlnSW50KG9iaikge1xuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8ICFiaWdJbnRWYWx1ZU9mKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgYmlnSW50VmFsdWVPZi5jYWxsKG9iaik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSB8fCBmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgaW4gdGhpczsgfTtcbmZ1bmN0aW9uIGhhcyhvYmosIGtleSkge1xuICAgIHJldHVybiBoYXNPd24uY2FsbChvYmosIGtleSk7XG59XG5cbmZ1bmN0aW9uIHRvU3RyKG9iaikge1xuICAgIHJldHVybiBvYmplY3RUb1N0cmluZy5jYWxsKG9iaik7XG59XG5cbmZ1bmN0aW9uIG5hbWVPZihmKSB7XG4gICAgaWYgKGYubmFtZSkgeyByZXR1cm4gZi5uYW1lOyB9XG4gICAgdmFyIG0gPSAkbWF0Y2guY2FsbChmdW5jdGlvblRvU3RyaW5nLmNhbGwoZiksIC9eZnVuY3Rpb25cXHMqKFtcXHckXSspLyk7XG4gICAgaWYgKG0pIHsgcmV0dXJuIG1bMV07IH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gaW5kZXhPZih4cywgeCkge1xuICAgIGlmICh4cy5pbmRleE9mKSB7IHJldHVybiB4cy5pbmRleE9mKHgpOyB9XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKHhzW2ldID09PSB4KSB7IHJldHVybiBpOyB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gaXNNYXAoeCkge1xuICAgIGlmICghbWFwU2l6ZSB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBtYXBTaXplLmNhbGwoeCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZXRTaXplLmNhbGwoeCk7XG4gICAgICAgIH0gY2F0Y2ggKHMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4IGluc3RhbmNlb2YgTWFwOyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNXZWFrTWFwKHgpIHtcbiAgICBpZiAoIXdlYWtNYXBIYXMgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgd2Vha01hcEhhcy5jYWxsKHgsIHdlYWtNYXBIYXMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2Vha1NldEhhcy5jYWxsKHgsIHdlYWtTZXRIYXMpO1xuICAgICAgICB9IGNhdGNoIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIFdlYWtNYXA7IC8vIGNvcmUtanMgd29ya2Fyb3VuZCwgcHJlLXYyLjUuMFxuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1dlYWtSZWYoeCkge1xuICAgIGlmICghd2Vha1JlZkRlcmVmIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHdlYWtSZWZEZXJlZi5jYWxsKHgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNTZXQoeCkge1xuICAgIGlmICghc2V0U2l6ZSB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBzZXRTaXplLmNhbGwoeCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBtYXBTaXplLmNhbGwoeCk7XG4gICAgICAgIH0gY2F0Y2ggKG0pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4IGluc3RhbmNlb2YgU2V0OyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNXZWFrU2V0KHgpIHtcbiAgICBpZiAoIXdlYWtTZXRIYXMgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgd2Vha1NldEhhcy5jYWxsKHgsIHdlYWtTZXRIYXMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2Vha01hcEhhcy5jYWxsKHgsIHdlYWtNYXBIYXMpO1xuICAgICAgICB9IGNhdGNoIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIFdlYWtTZXQ7IC8vIGNvcmUtanMgd29ya2Fyb3VuZCwgcHJlLXYyLjUuMFxuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc0VsZW1lbnQoeCkge1xuICAgIGlmICgheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaWYgKHR5cGVvZiBIVE1MRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgeCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIHgubm9kZU5hbWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB4LmdldEF0dHJpYnV0ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gaW5zcGVjdFN0cmluZyhzdHIsIG9wdHMpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA+IG9wdHMubWF4U3RyaW5nTGVuZ3RoKSB7XG4gICAgICAgIHZhciByZW1haW5pbmcgPSBzdHIubGVuZ3RoIC0gb3B0cy5tYXhTdHJpbmdMZW5ndGg7XG4gICAgICAgIHZhciB0cmFpbGVyID0gJy4uLiAnICsgcmVtYWluaW5nICsgJyBtb3JlIGNoYXJhY3RlcicgKyAocmVtYWluaW5nID4gMSA/ICdzJyA6ICcnKTtcbiAgICAgICAgcmV0dXJuIGluc3BlY3RTdHJpbmcoJHNsaWNlLmNhbGwoc3RyLCAwLCBvcHRzLm1heFN0cmluZ0xlbmd0aCksIG9wdHMpICsgdHJhaWxlcjtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbiAgICB2YXIgcyA9ICRyZXBsYWNlLmNhbGwoJHJlcGxhY2UuY2FsbChzdHIsIC8oWydcXFxcXSkvZywgJ1xcXFwkMScpLCAvW1xceDAwLVxceDFmXS9nLCBsb3dieXRlKTtcbiAgICByZXR1cm4gd3JhcFF1b3RlcyhzLCAnc2luZ2xlJywgb3B0cyk7XG59XG5cbmZ1bmN0aW9uIGxvd2J5dGUoYykge1xuICAgIHZhciBuID0gYy5jaGFyQ29kZUF0KDApO1xuICAgIHZhciB4ID0ge1xuICAgICAgICA4OiAnYicsXG4gICAgICAgIDk6ICd0JyxcbiAgICAgICAgMTA6ICduJyxcbiAgICAgICAgMTI6ICdmJyxcbiAgICAgICAgMTM6ICdyJ1xuICAgIH1bbl07XG4gICAgaWYgKHgpIHsgcmV0dXJuICdcXFxcJyArIHg7IH1cbiAgICByZXR1cm4gJ1xcXFx4JyArIChuIDwgMHgxMCA/ICcwJyA6ICcnKSArICR0b1VwcGVyQ2FzZS5jYWxsKG4udG9TdHJpbmcoMTYpKTtcbn1cblxuZnVuY3Rpb24gbWFya0JveGVkKHN0cikge1xuICAgIHJldHVybiAnT2JqZWN0KCcgKyBzdHIgKyAnKSc7XG59XG5cbmZ1bmN0aW9uIHdlYWtDb2xsZWN0aW9uT2YodHlwZSkge1xuICAgIHJldHVybiB0eXBlICsgJyB7ID8gfSc7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3Rpb25PZih0eXBlLCBzaXplLCBlbnRyaWVzLCBpbmRlbnQpIHtcbiAgICB2YXIgam9pbmVkRW50cmllcyA9IGluZGVudCA/IGluZGVudGVkSm9pbihlbnRyaWVzLCBpbmRlbnQpIDogJGpvaW4uY2FsbChlbnRyaWVzLCAnLCAnKTtcbiAgICByZXR1cm4gdHlwZSArICcgKCcgKyBzaXplICsgJykgeycgKyBqb2luZWRFbnRyaWVzICsgJ30nO1xufVxuXG5mdW5jdGlvbiBzaW5nbGVMaW5lVmFsdWVzKHhzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaW5kZXhPZih4c1tpXSwgJ1xcbicpID49IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5kZW50KG9wdHMsIGRlcHRoKSB7XG4gICAgdmFyIGJhc2VJbmRlbnQ7XG4gICAgaWYgKG9wdHMuaW5kZW50ID09PSAnXFx0Jykge1xuICAgICAgICBiYXNlSW5kZW50ID0gJ1xcdCc7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0cy5pbmRlbnQgPT09ICdudW1iZXInICYmIG9wdHMuaW5kZW50ID4gMCkge1xuICAgICAgICBiYXNlSW5kZW50ID0gJGpvaW4uY2FsbChBcnJheShvcHRzLmluZGVudCArIDEpLCAnICcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBiYXNlOiBiYXNlSW5kZW50LFxuICAgICAgICBwcmV2OiAkam9pbi5jYWxsKEFycmF5KGRlcHRoICsgMSksIGJhc2VJbmRlbnQpXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gaW5kZW50ZWRKb2luKHhzLCBpbmRlbnQpIHtcbiAgICBpZiAoeHMubGVuZ3RoID09PSAwKSB7IHJldHVybiAnJzsgfVxuICAgIHZhciBsaW5lSm9pbmVyID0gJ1xcbicgKyBpbmRlbnQucHJldiArIGluZGVudC5iYXNlO1xuICAgIHJldHVybiBsaW5lSm9pbmVyICsgJGpvaW4uY2FsbCh4cywgJywnICsgbGluZUpvaW5lcikgKyAnXFxuJyArIGluZGVudC5wcmV2O1xufVxuXG5mdW5jdGlvbiBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCkge1xuICAgIHZhciBpc0FyciA9IGlzQXJyYXkob2JqKTtcbiAgICB2YXIgeHMgPSBbXTtcbiAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgeHMubGVuZ3RoID0gb2JqLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHhzW2ldID0gaGFzKG9iaiwgaSkgPyBpbnNwZWN0KG9ialtpXSwgb2JqKSA6ICcnO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBzeW1zID0gdHlwZW9mIGdPUFMgPT09ICdmdW5jdGlvbicgPyBnT1BTKG9iaikgOiBbXTtcbiAgICB2YXIgc3ltTWFwO1xuICAgIGlmIChoYXNTaGFtbWVkU3ltYm9scykge1xuICAgICAgICBzeW1NYXAgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBzeW1zLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBzeW1NYXBbJyQnICsgc3ltc1trXV0gPSBzeW1zW2tdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIga2V5IGluIG9iaikgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICAgIGlmICghaGFzKG9iaiwga2V5KSkgeyBjb250aW51ZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby1jb250aW51ZVxuICAgICAgICBpZiAoaXNBcnIgJiYgU3RyaW5nKE51bWJlcihrZXkpKSA9PT0ga2V5ICYmIGtleSA8IG9iai5sZW5ndGgpIHsgY29udGludWU7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCwgbm8tY29udGludWVcbiAgICAgICAgaWYgKGhhc1NoYW1tZWRTeW1ib2xzICYmIHN5bU1hcFsnJCcgKyBrZXldIGluc3RhbmNlb2YgU3ltYm9sKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIHRvIHByZXZlbnQgc2hhbW1lZCBTeW1ib2xzLCB3aGljaCBhcmUgc3RvcmVkIGFzIHN0cmluZ3MsIGZyb20gYmVpbmcgaW5jbHVkZWQgaW4gdGhlIHN0cmluZyBrZXkgc2VjdGlvblxuICAgICAgICAgICAgY29udGludWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLWNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoJHRlc3QuY2FsbCgvW15cXHckXS8sIGtleSkpIHtcbiAgICAgICAgICAgIHhzLnB1c2goaW5zcGVjdChrZXksIG9iaikgKyAnOiAnICsgaW5zcGVjdChvYmpba2V5XSwgb2JqKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB4cy5wdXNoKGtleSArICc6ICcgKyBpbnNwZWN0KG9ialtrZXldLCBvYmopKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGdPUFMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzeW1zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoaXNFbnVtZXJhYmxlLmNhbGwob2JqLCBzeW1zW2pdKSkge1xuICAgICAgICAgICAgICAgIHhzLnB1c2goJ1snICsgaW5zcGVjdChzeW1zW2pdKSArICddOiAnICsgaW5zcGVjdChvYmpbc3ltc1tqXV0sIG9iaikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB4cztcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgndXRpbCcpLmluc3BlY3Q7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBudW1iZXJJc05hTiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpcyhhLCBiKSB7XG5cdGlmIChhID09PSAwICYmIGIgPT09IDApIHtcblx0XHRyZXR1cm4gMSAvIGEgPT09IDEgLyBiO1xuXHR9XG5cdGlmIChhID09PSBiKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0aWYgKG51bWJlcklzTmFOKGEpICYmIG51bWJlcklzTmFOKGIpKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufTtcblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBjYWxsQmluZCA9IHJlcXVpcmUoJ2NhbGwtYmluZCcpO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgc2hpbSA9IHJlcXVpcmUoJy4vc2hpbScpO1xuXG52YXIgcG9seWZpbGwgPSBjYWxsQmluZChnZXRQb2x5ZmlsbCgpLCBPYmplY3QpO1xuXG5kZWZpbmUocG9seWZpbGwsIHtcblx0Z2V0UG9seWZpbGw6IGdldFBvbHlmaWxsLFxuXHRpbXBsZW1lbnRhdGlvbjogaW1wbGVtZW50YXRpb24sXG5cdHNoaW06IHNoaW1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBvbHlmaWxsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0UG9seWZpbGwoKSB7XG5cdHJldHVybiB0eXBlb2YgT2JqZWN0LmlzID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LmlzIDogaW1wbGVtZW50YXRpb247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGltT2JqZWN0SXMoKSB7XG5cdHZhciBwb2x5ZmlsbCA9IGdldFBvbHlmaWxsKCk7XG5cdGRlZmluZShPYmplY3QsIHsgaXM6IHBvbHlmaWxsIH0sIHtcblx0XHRpczogZnVuY3Rpb24gdGVzdE9iamVjdElzKCkge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5pcyAhPT0gcG9seWZpbGw7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHBvbHlmaWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGtleXNTaGltO1xuaWYgKCFPYmplY3Qua2V5cykge1xuXHQvLyBtb2RpZmllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbVxuXHR2YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblx0dmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblx0dmFyIGlzQXJncyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBnbG9iYWwtcmVxdWlyZVxuXHR2YXIgaXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblx0dmFyIGhhc0RvbnRFbnVtQnVnID0gIWlzRW51bWVyYWJsZS5jYWxsKHsgdG9TdHJpbmc6IG51bGwgfSwgJ3RvU3RyaW5nJyk7XG5cdHZhciBoYXNQcm90b0VudW1CdWcgPSBpc0VudW1lcmFibGUuY2FsbChmdW5jdGlvbiAoKSB7fSwgJ3Byb3RvdHlwZScpO1xuXHR2YXIgZG9udEVudW1zID0gW1xuXHRcdCd0b1N0cmluZycsXG5cdFx0J3RvTG9jYWxlU3RyaW5nJyxcblx0XHQndmFsdWVPZicsXG5cdFx0J2hhc093blByb3BlcnR5Jyxcblx0XHQnaXNQcm90b3R5cGVPZicsXG5cdFx0J3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcblx0XHQnY29uc3RydWN0b3InXG5cdF07XG5cdHZhciBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZSA9IGZ1bmN0aW9uIChvKSB7XG5cdFx0dmFyIGN0b3IgPSBvLmNvbnN0cnVjdG9yO1xuXHRcdHJldHVybiBjdG9yICYmIGN0b3IucHJvdG90eXBlID09PSBvO1xuXHR9O1xuXHR2YXIgZXhjbHVkZWRLZXlzID0ge1xuXHRcdCRhcHBsaWNhdGlvbkNhY2hlOiB0cnVlLFxuXHRcdCRjb25zb2xlOiB0cnVlLFxuXHRcdCRleHRlcm5hbDogdHJ1ZSxcblx0XHQkZnJhbWU6IHRydWUsXG5cdFx0JGZyYW1lRWxlbWVudDogdHJ1ZSxcblx0XHQkZnJhbWVzOiB0cnVlLFxuXHRcdCRpbm5lckhlaWdodDogdHJ1ZSxcblx0XHQkaW5uZXJXaWR0aDogdHJ1ZSxcblx0XHQkb25tb3pmdWxsc2NyZWVuY2hhbmdlOiB0cnVlLFxuXHRcdCRvbm1vemZ1bGxzY3JlZW5lcnJvcjogdHJ1ZSxcblx0XHQkb3V0ZXJIZWlnaHQ6IHRydWUsXG5cdFx0JG91dGVyV2lkdGg6IHRydWUsXG5cdFx0JHBhZ2VYT2Zmc2V0OiB0cnVlLFxuXHRcdCRwYWdlWU9mZnNldDogdHJ1ZSxcblx0XHQkcGFyZW50OiB0cnVlLFxuXHRcdCRzY3JvbGxMZWZ0OiB0cnVlLFxuXHRcdCRzY3JvbGxUb3A6IHRydWUsXG5cdFx0JHNjcm9sbFg6IHRydWUsXG5cdFx0JHNjcm9sbFk6IHRydWUsXG5cdFx0JHNlbGY6IHRydWUsXG5cdFx0JHdlYmtpdEluZGV4ZWREQjogdHJ1ZSxcblx0XHQkd2Via2l0U3RvcmFnZUluZm86IHRydWUsXG5cdFx0JHdpbmRvdzogdHJ1ZVxuXHR9O1xuXHR2YXIgaGFzQXV0b21hdGlvbkVxdWFsaXR5QnVnID0gKGZ1bmN0aW9uICgpIHtcblx0XHQvKiBnbG9iYWwgd2luZG93ICovXG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdGZvciAodmFyIGsgaW4gd2luZG93KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoIWV4Y2x1ZGVkS2V5c1snJCcgKyBrXSAmJiBoYXMuY2FsbCh3aW5kb3csIGspICYmIHdpbmRvd1trXSAhPT0gbnVsbCAmJiB0eXBlb2Ygd2luZG93W2tdID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZSh3aW5kb3dba10pO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KCkpO1xuXHR2YXIgZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGVJZk5vdEJ1Z2d5ID0gZnVuY3Rpb24gKG8pIHtcblx0XHQvKiBnbG9iYWwgd2luZG93ICovXG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFoYXNBdXRvbWF0aW9uRXF1YWxpdHlCdWcpIHtcblx0XHRcdHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9O1xuXG5cdGtleXNTaGltID0gZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcblx0XHR2YXIgaXNPYmplY3QgPSBvYmplY3QgIT09IG51bGwgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCc7XG5cdFx0dmFyIGlzRnVuY3Rpb24gPSB0b1N0ci5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cdFx0dmFyIGlzQXJndW1lbnRzID0gaXNBcmdzKG9iamVjdCk7XG5cdFx0dmFyIGlzU3RyaW5nID0gaXNPYmplY3QgJiYgdG9TdHIuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBTdHJpbmddJztcblx0XHR2YXIgdGhlS2V5cyA9IFtdO1xuXG5cdFx0aWYgKCFpc09iamVjdCAmJiAhaXNGdW5jdGlvbiAmJiAhaXNBcmd1bWVudHMpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QnKTtcblx0XHR9XG5cblx0XHR2YXIgc2tpcFByb3RvID0gaGFzUHJvdG9FbnVtQnVnICYmIGlzRnVuY3Rpb247XG5cdFx0aWYgKGlzU3RyaW5nICYmIG9iamVjdC5sZW5ndGggPiAwICYmICFoYXMuY2FsbChvYmplY3QsIDApKSB7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdC5sZW5ndGg7ICsraSkge1xuXHRcdFx0XHR0aGVLZXlzLnB1c2goU3RyaW5nKGkpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaXNBcmd1bWVudHMgJiYgb2JqZWN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgb2JqZWN0Lmxlbmd0aDsgKytqKSB7XG5cdFx0XHRcdHRoZUtleXMucHVzaChTdHJpbmcoaikpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKHZhciBuYW1lIGluIG9iamVjdCkge1xuXHRcdFx0XHRpZiAoIShza2lwUHJvdG8gJiYgbmFtZSA9PT0gJ3Byb3RvdHlwZScpICYmIGhhcy5jYWxsKG9iamVjdCwgbmFtZSkpIHtcblx0XHRcdFx0XHR0aGVLZXlzLnB1c2goU3RyaW5nKG5hbWUpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChoYXNEb250RW51bUJ1Zykge1xuXHRcdFx0dmFyIHNraXBDb25zdHJ1Y3RvciA9IGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlSWZOb3RCdWdneShvYmplY3QpO1xuXG5cdFx0XHRmb3IgKHZhciBrID0gMDsgayA8IGRvbnRFbnVtcy5sZW5ndGg7ICsraykge1xuXHRcdFx0XHRpZiAoIShza2lwQ29uc3RydWN0b3IgJiYgZG9udEVudW1zW2tdID09PSAnY29uc3RydWN0b3InKSAmJiBoYXMuY2FsbChvYmplY3QsIGRvbnRFbnVtc1trXSkpIHtcblx0XHRcdFx0XHR0aGVLZXlzLnB1c2goZG9udEVudW1zW2tdKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGhlS2V5cztcblx0fTtcbn1cbm1vZHVsZS5leHBvcnRzID0ga2V5c1NoaW07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciBpc0FyZ3MgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyk7XG5cbnZhciBvcmlnS2V5cyA9IE9iamVjdC5rZXlzO1xudmFyIGtleXNTaGltID0gb3JpZ0tleXMgPyBmdW5jdGlvbiBrZXlzKG8pIHsgcmV0dXJuIG9yaWdLZXlzKG8pOyB9IDogcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG52YXIgb3JpZ2luYWxLZXlzID0gT2JqZWN0LmtleXM7XG5cbmtleXNTaGltLnNoaW0gPSBmdW5jdGlvbiBzaGltT2JqZWN0S2V5cygpIHtcblx0aWYgKE9iamVjdC5rZXlzKSB7XG5cdFx0dmFyIGtleXNXb3Jrc1dpdGhBcmd1bWVudHMgPSAoZnVuY3Rpb24gKCkge1xuXHRcdFx0Ly8gU2FmYXJpIDUuMCBidWdcblx0XHRcdHZhciBhcmdzID0gT2JqZWN0LmtleXMoYXJndW1lbnRzKTtcblx0XHRcdHJldHVybiBhcmdzICYmIGFyZ3MubGVuZ3RoID09PSBhcmd1bWVudHMubGVuZ3RoO1xuXHRcdH0oMSwgMikpO1xuXHRcdGlmICgha2V5c1dvcmtzV2l0aEFyZ3VtZW50cykge1xuXHRcdFx0T2JqZWN0LmtleXMgPSBmdW5jdGlvbiBrZXlzKG9iamVjdCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuXHRcdFx0XHRpZiAoaXNBcmdzKG9iamVjdCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb3JpZ2luYWxLZXlzKHNsaWNlLmNhbGwob2JqZWN0KSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG9yaWdpbmFsS2V5cyhvYmplY3QpO1xuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0T2JqZWN0LmtleXMgPSBrZXlzU2hpbTtcblx0fVxuXHRyZXR1cm4gT2JqZWN0LmtleXMgfHwga2V5c1NoaW07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXNTaGltO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG5cdHZhciBzdHIgPSB0b1N0ci5jYWxsKHZhbHVlKTtcblx0dmFyIGlzQXJncyA9IHN0ciA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG5cdGlmICghaXNBcmdzKSB7XG5cdFx0aXNBcmdzID0gc3RyICE9PSAnW29iamVjdCBBcnJheV0nICYmXG5cdFx0XHR2YWx1ZSAhPT0gbnVsbCAmJlxuXHRcdFx0dHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuXHRcdFx0dHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ251bWJlcicgJiZcblx0XHRcdHZhbHVlLmxlbmd0aCA+PSAwICYmXG5cdFx0XHR0b1N0ci5jYWxsKHZhbHVlLmNhbGxlZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cdH1cblx0cmV0dXJuIGlzQXJncztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIG1vZGlmaWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNi1zaGltXG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJ29iamVjdC1rZXlzJyk7XG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzL3NoYW1zJykoKTtcbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJpbmQvY2FsbEJvdW5kJyk7XG52YXIgdG9PYmplY3QgPSBPYmplY3Q7XG52YXIgJHB1c2ggPSBjYWxsQm91bmQoJ0FycmF5LnByb3RvdHlwZS5wdXNoJyk7XG52YXIgJHByb3BJc0VudW1lcmFibGUgPSBjYWxsQm91bmQoJ09iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUnKTtcbnZhciBvcmlnaW5hbEdldFN5bWJvbHMgPSBoYXNTeW1ib2xzID8gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA6IG51bGw7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UxKSB7XG5cdGlmICh0YXJnZXQgPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCd0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3QnKTsgfVxuXHR2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpOyAvLyBzdGVwIDFcblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcblx0XHRyZXR1cm4gdG87IC8vIHN0ZXAgMlxuXHR9XG5cdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgKytzKSB7XG5cdFx0dmFyIGZyb20gPSB0b09iamVjdChhcmd1bWVudHNbc10pOyAvLyBzdGVwIDMuYS5pXG5cblx0XHQvLyBzdGVwIDMuYS5paTpcblx0XHR2YXIga2V5cyA9IG9iamVjdEtleXMoZnJvbSk7XG5cdFx0dmFyIGdldFN5bWJvbHMgPSBoYXNTeW1ib2xzICYmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzIHx8IG9yaWdpbmFsR2V0U3ltYm9scyk7XG5cdFx0aWYgKGdldFN5bWJvbHMpIHtcblx0XHRcdHZhciBzeW1zID0gZ2V0U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgc3ltcy5sZW5ndGg7ICsraikge1xuXHRcdFx0XHR2YXIga2V5ID0gc3ltc1tqXTtcblx0XHRcdFx0aWYgKCRwcm9wSXNFbnVtZXJhYmxlKGZyb20sIGtleSkpIHtcblx0XHRcdFx0XHQkcHVzaChrZXlzLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gc3RlcCAzLmEuaWlpOlxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuXHRcdFx0dmFyIG5leHRLZXkgPSBrZXlzW2ldO1xuXHRcdFx0aWYgKCRwcm9wSXNFbnVtZXJhYmxlKGZyb20sIG5leHRLZXkpKSB7IC8vIHN0ZXAgMy5hLmlpaS4yXG5cdFx0XHRcdHZhciBwcm9wVmFsdWUgPSBmcm9tW25leHRLZXldOyAvLyBzdGVwIDMuYS5paWkuMi5hXG5cdFx0XHRcdHRvW25leHRLZXldID0gcHJvcFZhbHVlOyAvLyBzdGVwIDMuYS5paWkuMi5iXG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvOyAvLyBzdGVwIDRcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBkZWZpbmVQcm9wZXJ0aWVzID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBjYWxsQmluZCA9IHJlcXVpcmUoJ2NhbGwtYmluZCcpO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgc2hpbSA9IHJlcXVpcmUoJy4vc2hpbScpO1xuXG52YXIgcG9seWZpbGwgPSBjYWxsQmluZC5hcHBseShnZXRQb2x5ZmlsbCgpKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xudmFyIGJvdW5kID0gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlMSkge1xuXHRyZXR1cm4gcG9seWZpbGwoT2JqZWN0LCBhcmd1bWVudHMpO1xufTtcblxuZGVmaW5lUHJvcGVydGllcyhib3VuZCwge1xuXHRnZXRQb2x5ZmlsbDogZ2V0UG9seWZpbGwsXG5cdGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvbixcblx0c2hpbTogc2hpbVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gYm91bmQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxudmFyIGxhY2tzUHJvcGVyRW51bWVyYXRpb25PcmRlciA9IGZ1bmN0aW9uICgpIHtcblx0aWYgKCFPYmplY3QuYXNzaWduKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdC8qXG5cdCAqIHY4LCBzcGVjaWZpY2FsbHkgaW4gbm9kZSA0LngsIGhhcyBhIGJ1ZyB3aXRoIGluY29ycmVjdCBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlclxuXHQgKiBub3RlOiB0aGlzIGRvZXMgbm90IGRldGVjdCB0aGUgYnVnIHVubGVzcyB0aGVyZSdzIDIwIGNoYXJhY3RlcnNcblx0ICovXG5cdHZhciBzdHIgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnO1xuXHR2YXIgbGV0dGVycyA9IHN0ci5zcGxpdCgnJyk7XG5cdHZhciBtYXAgPSB7fTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsZXR0ZXJzLmxlbmd0aDsgKytpKSB7XG5cdFx0bWFwW2xldHRlcnNbaV1dID0gbGV0dGVyc1tpXTtcblx0fVxuXHR2YXIgb2JqID0gT2JqZWN0LmFzc2lnbih7fSwgbWFwKTtcblx0dmFyIGFjdHVhbCA9ICcnO1xuXHRmb3IgKHZhciBrIGluIG9iaikge1xuXHRcdGFjdHVhbCArPSBrO1xuXHR9XG5cdHJldHVybiBzdHIgIT09IGFjdHVhbDtcbn07XG5cbnZhciBhc3NpZ25IYXNQZW5kaW5nRXhjZXB0aW9ucyA9IGZ1bmN0aW9uICgpIHtcblx0aWYgKCFPYmplY3QuYXNzaWduIHx8ICFPYmplY3QucHJldmVudEV4dGVuc2lvbnMpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0Lypcblx0ICogRmlyZWZveCAzNyBzdGlsbCBoYXMgXCJwZW5kaW5nIGV4Y2VwdGlvblwiIGxvZ2ljIGluIGl0cyBPYmplY3QuYXNzaWduIGltcGxlbWVudGF0aW9uLFxuXHQgKiB3aGljaCBpcyA3MiUgc2xvd2VyIHRoYW4gb3VyIHNoaW0sIGFuZCBGaXJlZm94IDQwJ3MgbmF0aXZlIGltcGxlbWVudGF0aW9uLlxuXHQgKi9cblx0dmFyIHRocm93ZXIgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoeyAxOiAyIH0pO1xuXHR0cnkge1xuXHRcdE9iamVjdC5hc3NpZ24odGhyb3dlciwgJ3h5Jyk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gdGhyb3dlclsxXSA9PT0gJ3knO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0UG9seWZpbGwoKSB7XG5cdGlmICghT2JqZWN0LmFzc2lnbikge1xuXHRcdHJldHVybiBpbXBsZW1lbnRhdGlvbjtcblx0fVxuXHRpZiAobGFja3NQcm9wZXJFbnVtZXJhdGlvbk9yZGVyKCkpIHtcblx0XHRyZXR1cm4gaW1wbGVtZW50YXRpb247XG5cdH1cblx0aWYgKGFzc2lnbkhhc1BlbmRpbmdFeGNlcHRpb25zKCkpIHtcblx0XHRyZXR1cm4gaW1wbGVtZW50YXRpb247XG5cdH1cblx0cmV0dXJuIE9iamVjdC5hc3NpZ247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBnZXRQb2x5ZmlsbCA9IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGltQXNzaWduKCkge1xuXHR2YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xuXHRkZWZpbmUoXG5cdFx0T2JqZWN0LFxuXHRcdHsgYXNzaWduOiBwb2x5ZmlsbCB9LFxuXHRcdHsgYXNzaWduOiBmdW5jdGlvbiAoKSB7IHJldHVybiBPYmplY3QuYXNzaWduICE9PSBwb2x5ZmlsbDsgfSB9XG5cdCk7XG5cdHJldHVybiBwb2x5ZmlsbDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBmdW5jdGlvbnNIYXZlQ29uZmlndXJhYmxlTmFtZXMgPSByZXF1aXJlKCdmdW5jdGlvbnMtaGF2ZS1uYW1lcycpLmZ1bmN0aW9uc0hhdmVDb25maWd1cmFibGVOYW1lcygpO1xuXG52YXIgJE9iamVjdCA9IE9iamVjdDtcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZsYWdzKCkge1xuXHRpZiAodGhpcyAhPSBudWxsICYmIHRoaXMgIT09ICRPYmplY3QodGhpcykpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignUmVnRXhwLnByb3RvdHlwZS5mbGFncyBnZXR0ZXIgY2FsbGVkIG9uIG5vbi1vYmplY3QnKTtcblx0fVxuXHR2YXIgcmVzdWx0ID0gJyc7XG5cdGlmICh0aGlzLmhhc0luZGljZXMpIHtcblx0XHRyZXN1bHQgKz0gJ2QnO1xuXHR9XG5cdGlmICh0aGlzLmdsb2JhbCkge1xuXHRcdHJlc3VsdCArPSAnZyc7XG5cdH1cblx0aWYgKHRoaXMuaWdub3JlQ2FzZSkge1xuXHRcdHJlc3VsdCArPSAnaSc7XG5cdH1cblx0aWYgKHRoaXMubXVsdGlsaW5lKSB7XG5cdFx0cmVzdWx0ICs9ICdtJztcblx0fVxuXHRpZiAodGhpcy5kb3RBbGwpIHtcblx0XHRyZXN1bHQgKz0gJ3MnO1xuXHR9XG5cdGlmICh0aGlzLnVuaWNvZGUpIHtcblx0XHRyZXN1bHQgKz0gJ3UnO1xuXHR9XG5cdGlmICh0aGlzLnN0aWNreSkge1xuXHRcdHJlc3VsdCArPSAneSc7XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cbmlmIChmdW5jdGlvbnNIYXZlQ29uZmlndXJhYmxlTmFtZXMgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ25hbWUnLCB7IHZhbHVlOiAnZ2V0IGZsYWdzJyB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmluZSA9IHJlcXVpcmUoJ2RlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCdjYWxsLWJpbmQnKTtcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xudmFyIGdldFBvbHlmaWxsID0gcmVxdWlyZSgnLi9wb2x5ZmlsbCcpO1xudmFyIHNoaW0gPSByZXF1aXJlKCcuL3NoaW0nKTtcblxudmFyIGZsYWdzQm91bmQgPSBjYWxsQmluZChnZXRQb2x5ZmlsbCgpKTtcblxuZGVmaW5lKGZsYWdzQm91bmQsIHtcblx0Z2V0UG9seWZpbGw6IGdldFBvbHlmaWxsLFxuXHRpbXBsZW1lbnRhdGlvbjogaW1wbGVtZW50YXRpb24sXG5cdHNoaW06IHNoaW1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZsYWdzQm91bmQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxudmFyIHN1cHBvcnRzRGVzY3JpcHRvcnMgPSByZXF1aXJlKCdkZWZpbmUtcHJvcGVydGllcycpLnN1cHBvcnRzRGVzY3JpcHRvcnM7XG52YXIgJGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFBvbHlmaWxsKCkge1xuXHRpZiAoc3VwcG9ydHNEZXNjcmlwdG9ycyAmJiAoL2EvbWlnKS5mbGFncyA9PT0gJ2dpbScpIHtcblx0XHR2YXIgZGVzY3JpcHRvciA9ICRnT1BEKFJlZ0V4cC5wcm90b3R5cGUsICdmbGFncycpO1xuXHRcdGlmIChcblx0XHRcdGRlc2NyaXB0b3Jcblx0XHRcdCYmIHR5cGVvZiBkZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJ1xuXHRcdFx0JiYgdHlwZW9mIFJlZ0V4cC5wcm90b3R5cGUuZG90QWxsID09PSAnYm9vbGVhbidcblx0XHRcdCYmIHR5cGVvZiBSZWdFeHAucHJvdG90eXBlLmhhc0luZGljZXMgPT09ICdib29sZWFuJ1xuXHRcdCkge1xuXHRcdFx0LyogZXNsaW50IGdldHRlci1yZXR1cm46IDAgKi9cblx0XHRcdHZhciBjYWxscyA9ICcnO1xuXHRcdFx0dmFyIG8gPSB7fTtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCAnaGFzSW5kaWNlcycsIHtcblx0XHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Y2FsbHMgKz0gJ2QnO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCAnc3RpY2t5Jywge1xuXHRcdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRjYWxscyArPSAneSc7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0aWYgKGNhbGxzID09PSAnZHknKSB7XG5cdFx0XHRcdHJldHVybiBkZXNjcmlwdG9yLmdldDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIGltcGxlbWVudGF0aW9uO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHN1cHBvcnRzRGVzY3JpcHRvcnMgPSByZXF1aXJlKCdkZWZpbmUtcHJvcGVydGllcycpLnN1cHBvcnRzRGVzY3JpcHRvcnM7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgVHlwZUVyciA9IFR5cGVFcnJvcjtcbnZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciByZWdleCA9IC9hLztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGltRmxhZ3MoKSB7XG5cdGlmICghc3VwcG9ydHNEZXNjcmlwdG9ycyB8fCAhZ2V0UHJvdG8pIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycignUmVnRXhwLnByb3RvdHlwZS5mbGFncyByZXF1aXJlcyBhIHRydWUgRVM1IGVudmlyb25tZW50IHRoYXQgc3VwcG9ydHMgcHJvcGVydHkgZGVzY3JpcHRvcnMnKTtcblx0fVxuXHR2YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xuXHR2YXIgcHJvdG8gPSBnZXRQcm90byhyZWdleCk7XG5cdHZhciBkZXNjcmlwdG9yID0gZ09QRChwcm90bywgJ2ZsYWdzJyk7XG5cdGlmICghZGVzY3JpcHRvciB8fCBkZXNjcmlwdG9yLmdldCAhPT0gcG9seWZpbGwpIHtcblx0XHRkZWZpbmVQcm9wZXJ0eShwcm90bywgJ2ZsYWdzJywge1xuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0XHRnZXQ6IHBvbHlmaWxsXG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHBvbHlmaWxsO1xufTtcbiIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG52YXIgdGhyb3VnaCA9IHJlcXVpcmUoJ3Rocm91Z2gnKTtcbnZhciBuZXh0VGljayA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnXG4gICAgPyBzZXRJbW1lZGlhdGVcbiAgICA6IHByb2Nlc3MubmV4dFRpY2tcbjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAod3JpdGUsIGVuZCkge1xuICAgIHZhciB0ciA9IHRocm91Z2god3JpdGUsIGVuZCk7XG4gICAgdHIucGF1c2UoKTtcbiAgICB2YXIgcmVzdW1lID0gdHIucmVzdW1lO1xuICAgIHZhciBwYXVzZSA9IHRyLnBhdXNlO1xuICAgIHZhciBwYXVzZWQgPSBmYWxzZTtcbiAgICBcbiAgICB0ci5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHBhdXNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICBcbiAgICB0ci5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHBhdXNlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gcmVzdW1lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICBcbiAgICBuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghcGF1c2VkKSB0ci5yZXN1bWUoKTtcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gdHI7XG59O1xuXG59KS5jYWxsKHRoaXMscmVxdWlyZShcIktsaXViSFwiKSkiLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xudmFyIGluc3BlY3QgPSByZXF1aXJlKCdvYmplY3QtaW5zcGVjdCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IEdldEludHJpbnNpYygnJVR5cGVFcnJvciUnKTtcbnZhciAkV2Vha01hcCA9IEdldEludHJpbnNpYygnJVdlYWtNYXAlJywgdHJ1ZSk7XG52YXIgJE1hcCA9IEdldEludHJpbnNpYygnJU1hcCUnLCB0cnVlKTtcblxudmFyICR3ZWFrTWFwR2V0ID0gY2FsbEJvdW5kKCdXZWFrTWFwLnByb3RvdHlwZS5nZXQnLCB0cnVlKTtcbnZhciAkd2Vha01hcFNldCA9IGNhbGxCb3VuZCgnV2Vha01hcC5wcm90b3R5cGUuc2V0JywgdHJ1ZSk7XG52YXIgJHdlYWtNYXBIYXMgPSBjYWxsQm91bmQoJ1dlYWtNYXAucHJvdG90eXBlLmhhcycsIHRydWUpO1xudmFyICRtYXBHZXQgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuZ2V0JywgdHJ1ZSk7XG52YXIgJG1hcFNldCA9IGNhbGxCb3VuZCgnTWFwLnByb3RvdHlwZS5zZXQnLCB0cnVlKTtcbnZhciAkbWFwSGFzID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLmhhcycsIHRydWUpO1xuXG4vKlxuICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIGxpc3QgcmV0dXJuaW5nIHRoZSBub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlXG4gKiBnaXZlbiBrZXkuXG4gKlxuICogVGhhdCBub2RlIGlzIGFsc28gbW92ZWQgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QsIHNvIHRoYXQgaWYgaXQncyBhY2Nlc3NlZFxuICogYWdhaW4gd2UgZG9uJ3QgbmVlZCB0byB0cmF2ZXJzZSB0aGUgd2hvbGUgbGlzdC4gQnkgZG9pbmcgc28sIGFsbCB0aGUgcmVjZW50bHlcbiAqIHVzZWQgbm9kZXMgY2FuIGJlIGFjY2Vzc2VkIHJlbGF0aXZlbHkgcXVpY2tseS5cbiAqL1xudmFyIGxpc3RHZXROb2RlID0gZnVuY3Rpb24gKGxpc3QsIGtleSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG5cdGZvciAodmFyIHByZXYgPSBsaXN0LCBjdXJyOyAoY3VyciA9IHByZXYubmV4dCkgIT09IG51bGw7IHByZXYgPSBjdXJyKSB7XG5cdFx0aWYgKGN1cnIua2V5ID09PSBrZXkpIHtcblx0XHRcdHByZXYubmV4dCA9IGN1cnIubmV4dDtcblx0XHRcdGN1cnIubmV4dCA9IGxpc3QubmV4dDtcblx0XHRcdGxpc3QubmV4dCA9IGN1cnI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0XHRcdHJldHVybiBjdXJyO1xuXHRcdH1cblx0fVxufTtcblxudmFyIGxpc3RHZXQgPSBmdW5jdGlvbiAob2JqZWN0cywga2V5KSB7XG5cdHZhciBub2RlID0gbGlzdEdldE5vZGUob2JqZWN0cywga2V5KTtcblx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZTtcbn07XG52YXIgbGlzdFNldCA9IGZ1bmN0aW9uIChvYmplY3RzLCBrZXksIHZhbHVlKSB7XG5cdHZhciBub2RlID0gbGlzdEdldE5vZGUob2JqZWN0cywga2V5KTtcblx0aWYgKG5vZGUpIHtcblx0XHRub2RlLnZhbHVlID0gdmFsdWU7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gUHJlcGVuZCB0aGUgbmV3IG5vZGUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdFxuXHRcdG9iamVjdHMubmV4dCA9IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuXHRcdFx0a2V5OiBrZXksXG5cdFx0XHRuZXh0OiBvYmplY3RzLm5leHQsXG5cdFx0XHR2YWx1ZTogdmFsdWVcblx0XHR9O1xuXHR9XG59O1xudmFyIGxpc3RIYXMgPSBmdW5jdGlvbiAob2JqZWN0cywga2V5KSB7XG5cdHJldHVybiAhIWxpc3RHZXROb2RlKG9iamVjdHMsIGtleSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFNpZGVDaGFubmVsKCkge1xuXHR2YXIgJHdtO1xuXHR2YXIgJG07XG5cdHZhciAkbztcblx0dmFyIGNoYW5uZWwgPSB7XG5cdFx0YXNzZXJ0OiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRpZiAoIWNoYW5uZWwuaGFzKGtleSkpIHtcblx0XHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1NpZGUgY2hhbm5lbCBkb2VzIG5vdCBjb250YWluICcgKyBpbnNwZWN0KGtleSkpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Z2V0OiBmdW5jdGlvbiAoa2V5KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY29uc2lzdGVudC1yZXR1cm5cblx0XHRcdGlmICgkV2Vha01hcCAmJiBrZXkgJiYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdGlmICgkd20pIHtcblx0XHRcdFx0XHRyZXR1cm4gJHdlYWtNYXBHZXQoJHdtLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKCRNYXApIHtcblx0XHRcdFx0aWYgKCRtKSB7XG5cdFx0XHRcdFx0cmV0dXJuICRtYXBHZXQoJG0sIGtleSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICgkbykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWxvbmVseS1pZlxuXHRcdFx0XHRcdHJldHVybiBsaXN0R2V0KCRvLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRoYXM6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdGlmICgkV2Vha01hcCAmJiBrZXkgJiYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdGlmICgkd20pIHtcblx0XHRcdFx0XHRyZXR1cm4gJHdlYWtNYXBIYXMoJHdtLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKCRNYXApIHtcblx0XHRcdFx0aWYgKCRtKSB7XG5cdFx0XHRcdFx0cmV0dXJuICRtYXBIYXMoJG0sIGtleSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICgkbykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWxvbmVseS1pZlxuXHRcdFx0XHRcdHJldHVybiBsaXN0SGFzKCRvLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG5cdFx0XHRpZiAoJFdlYWtNYXAgJiYga2V5ICYmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0XHRpZiAoISR3bSkge1xuXHRcdFx0XHRcdCR3bSA9IG5ldyAkV2Vha01hcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCR3ZWFrTWFwU2V0KCR3bSwga2V5LCB2YWx1ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKCRNYXApIHtcblx0XHRcdFx0aWYgKCEkbSkge1xuXHRcdFx0XHRcdCRtID0gbmV3ICRNYXAoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQkbWFwU2V0KCRtLCBrZXksIHZhbHVlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICghJG8pIHtcblx0XHRcdFx0XHQvKlxuXHRcdFx0XHRcdCAqIEluaXRpYWxpemUgdGhlIGxpbmtlZCBsaXN0IGFzIGFuIGVtcHR5IG5vZGUsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZVxuXHRcdFx0XHRcdCAqIHRvIHNwZWNpYWwtY2FzZSBoYW5kbGluZyBvZiB0aGUgZmlyc3Qgbm9kZTogd2UgY2FuIGFsd2F5cyByZWZlciB0b1xuXHRcdFx0XHRcdCAqIGl0IGFzIChwcmV2aW91cyBub2RlKS5uZXh0LCBpbnN0ZWFkIG9mIHNvbWV0aGluZyBsaWtlIChsaXN0KS5oZWFkXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0JG8gPSB7IGtleToge30sIG5leHQ6IG51bGwgfTtcblx0XHRcdFx0fVxuXHRcdFx0XHRsaXN0U2V0KCRvLCBrZXksIHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdHJldHVybiBjaGFubmVsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCdlcy1hYnN0cmFjdC8yMDIxL1JlcXVpcmVPYmplY3RDb2VyY2libGUnKTtcbnZhciBUb1N0cmluZyA9IHJlcXVpcmUoJ2VzLWFic3RyYWN0LzIwMjEvVG9TdHJpbmcnKTtcbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJpbmQvY2FsbEJvdW5kJyk7XG52YXIgJHJlcGxhY2UgPSBjYWxsQm91bmQoJ1N0cmluZy5wcm90b3R5cGUucmVwbGFjZScpO1xuXG52YXIgbXZzSXNXUyA9ICgvXlxccyQvKS50ZXN0KCdcXHUxODBFJyk7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG52YXIgbGVmdFdoaXRlc3BhY2UgPSBtdnNJc1dTXG5cdD8gL15bXFx4MDlcXHgwQVxceDBCXFx4MENcXHgwRFxceDIwXFx4QTBcXHUxNjgwXFx1MTgwRVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBBXFx1MjAyRlxcdTIwNUZcXHUzMDAwXFx1MjAyOFxcdTIwMjlcXHVGRUZGXSsvXG5cdDogL15bXFx4MDlcXHgwQVxceDBCXFx4MENcXHgwRFxceDIwXFx4QTBcXHUxNjgwXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDJGXFx1MjA1RlxcdTMwMDBcXHUyMDI4XFx1MjAyOVxcdUZFRkZdKy87XG52YXIgcmlnaHRXaGl0ZXNwYWNlID0gbXZzSXNXU1xuXHQ/IC9bXFx4MDlcXHgwQVxceDBCXFx4MENcXHgwRFxceDIwXFx4QTBcXHUxNjgwXFx1MTgwRVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBBXFx1MjAyRlxcdTIwNUZcXHUzMDAwXFx1MjAyOFxcdTIwMjlcXHVGRUZGXSskL1xuXHQ6IC9bXFx4MDlcXHgwQVxceDBCXFx4MENcXHgwRFxceDIwXFx4QTBcXHUxNjgwXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDJGXFx1MjA1RlxcdTMwMDBcXHUyMDI4XFx1MjAyOVxcdUZFRkZdKyQvO1xuLyogZXNsaW50LWVuYWJsZSBuby1jb250cm9sLXJlZ2V4ICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdHJpbSgpIHtcblx0dmFyIFMgPSBUb1N0cmluZyhSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTtcblx0cmV0dXJuICRyZXBsYWNlKCRyZXBsYWNlKFMsIGxlZnRXaGl0ZXNwYWNlLCAnJyksIHJpZ2h0V2hpdGVzcGFjZSwgJycpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNhbGxCaW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kJyk7XG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnZXMtYWJzdHJhY3QvMjAyMS9SZXF1aXJlT2JqZWN0Q29lcmNpYmxlJyk7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcbnZhciBnZXRQb2x5ZmlsbCA9IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcbnZhciBzaGltID0gcmVxdWlyZSgnLi9zaGltJyk7XG5cbnZhciBib3VuZCA9IGNhbGxCaW5kKGdldFBvbHlmaWxsKCkpO1xudmFyIGJvdW5kTWV0aG9kID0gZnVuY3Rpb24gdHJpbShyZWNlaXZlcikge1xuXHRSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHJlY2VpdmVyKTtcblx0cmV0dXJuIGJvdW5kKHJlY2VpdmVyKTtcbn07XG5cbmRlZmluZShib3VuZE1ldGhvZCwge1xuXHRnZXRQb2x5ZmlsbDogZ2V0UG9seWZpbGwsXG5cdGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvbixcblx0c2hpbTogc2hpbVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gYm91bmRNZXRob2Q7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxudmFyIHplcm9XaWR0aFNwYWNlID0gJ1xcdTIwMGInO1xudmFyIG1vbmdvbGlhblZvd2VsU2VwYXJhdG9yID0gJ1xcdTE4MEUnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFBvbHlmaWxsKCkge1xuXHRpZiAoXG5cdFx0U3RyaW5nLnByb3RvdHlwZS50cmltXG5cdFx0JiYgemVyb1dpZHRoU3BhY2UudHJpbSgpID09PSB6ZXJvV2lkdGhTcGFjZVxuXHRcdCYmIG1vbmdvbGlhblZvd2VsU2VwYXJhdG9yLnRyaW0oKSA9PT0gbW9uZ29saWFuVm93ZWxTZXBhcmF0b3Jcblx0XHQmJiAoJ18nICsgbW9uZ29saWFuVm93ZWxTZXBhcmF0b3IpLnRyaW0oKSA9PT0gKCdfJyArIG1vbmdvbGlhblZvd2VsU2VwYXJhdG9yKVxuXHRcdCYmIChtb25nb2xpYW5Wb3dlbFNlcGFyYXRvciArICdfJykudHJpbSgpID09PSAobW9uZ29saWFuVm93ZWxTZXBhcmF0b3IgKyAnXycpXG5cdCkge1xuXHRcdHJldHVybiBTdHJpbmcucHJvdG90eXBlLnRyaW07XG5cdH1cblx0cmV0dXJuIGltcGxlbWVudGF0aW9uO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmluZSA9IHJlcXVpcmUoJ2RlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hpbVN0cmluZ1RyaW0oKSB7XG5cdHZhciBwb2x5ZmlsbCA9IGdldFBvbHlmaWxsKCk7XG5cdGRlZmluZShTdHJpbmcucHJvdG90eXBlLCB7IHRyaW06IHBvbHlmaWxsIH0sIHtcblx0XHR0cmltOiBmdW5jdGlvbiB0ZXN0VHJpbSgpIHtcblx0XHRcdHJldHVybiBTdHJpbmcucHJvdG90eXBlLnRyaW0gIT09IHBvbHlmaWxsO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBwb2x5ZmlsbDtcbn07XG4iLCIoZnVuY3Rpb24gKHByb2Nlc3Mpe1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5cbi8vIHRocm91Z2hcbi8vXG4vLyBhIHN0cmVhbSB0aGF0IGRvZXMgbm90aGluZyBidXQgcmUtZW1pdCB0aGUgaW5wdXQuXG4vLyB1c2VmdWwgZm9yIGFnZ3JlZ2F0aW5nIGEgc2VyaWVzIG9mIGNoYW5naW5nIGJ1dCBub3QgZW5kaW5nIHN0cmVhbXMgaW50byBvbmUgc3RyZWFtKVxuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSB0aHJvdWdoXG50aHJvdWdoLnRocm91Z2ggPSB0aHJvdWdoXG5cbi8vY3JlYXRlIGEgcmVhZGFibGUgd3JpdGFibGUgc3RyZWFtLlxuXG5mdW5jdGlvbiB0aHJvdWdoICh3cml0ZSwgZW5kLCBvcHRzKSB7XG4gIHdyaXRlID0gd3JpdGUgfHwgZnVuY3Rpb24gKGRhdGEpIHsgdGhpcy5xdWV1ZShkYXRhKSB9XG4gIGVuZCA9IGVuZCB8fCBmdW5jdGlvbiAoKSB7IHRoaXMucXVldWUobnVsbCkgfVxuXG4gIHZhciBlbmRlZCA9IGZhbHNlLCBkZXN0cm95ZWQgPSBmYWxzZSwgYnVmZmVyID0gW10sIF9lbmRlZCA9IGZhbHNlXG4gIHZhciBzdHJlYW0gPSBuZXcgU3RyZWFtKClcbiAgc3RyZWFtLnJlYWRhYmxlID0gc3RyZWFtLndyaXRhYmxlID0gdHJ1ZVxuICBzdHJlYW0ucGF1c2VkID0gZmFsc2VcblxuLy8gIHN0cmVhbS5hdXRvUGF1c2UgICA9ICEob3B0cyAmJiBvcHRzLmF1dG9QYXVzZSAgID09PSBmYWxzZSlcbiAgc3RyZWFtLmF1dG9EZXN0cm95ID0gIShvcHRzICYmIG9wdHMuYXV0b0Rlc3Ryb3kgPT09IGZhbHNlKVxuXG4gIHN0cmVhbS53cml0ZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgd3JpdGUuY2FsbCh0aGlzLCBkYXRhKVxuICAgIHJldHVybiAhc3RyZWFtLnBhdXNlZFxuICB9XG5cbiAgZnVuY3Rpb24gZHJhaW4oKSB7XG4gICAgd2hpbGUoYnVmZmVyLmxlbmd0aCAmJiAhc3RyZWFtLnBhdXNlZCkge1xuICAgICAgdmFyIGRhdGEgPSBidWZmZXIuc2hpZnQoKVxuICAgICAgaWYobnVsbCA9PT0gZGF0YSlcbiAgICAgICAgcmV0dXJuIHN0cmVhbS5lbWl0KCdlbmQnKVxuICAgICAgZWxzZVxuICAgICAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGRhdGEpXG4gICAgfVxuICB9XG5cbiAgc3RyZWFtLnF1ZXVlID0gc3RyZWFtLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSkge1xuLy8gICAgY29uc29sZS5lcnJvcihlbmRlZClcbiAgICBpZihfZW5kZWQpIHJldHVybiBzdHJlYW1cbiAgICBpZihkYXRhID09PSBudWxsKSBfZW5kZWQgPSB0cnVlXG4gICAgYnVmZmVyLnB1c2goZGF0YSlcbiAgICBkcmFpbigpXG4gICAgcmV0dXJuIHN0cmVhbVxuICB9XG5cbiAgLy90aGlzIHdpbGwgYmUgcmVnaXN0ZXJlZCBhcyB0aGUgZmlyc3QgJ2VuZCcgbGlzdGVuZXJcbiAgLy9tdXN0IGNhbGwgZGVzdHJveSBuZXh0IHRpY2ssIHRvIG1ha2Ugc3VyZSB3ZSdyZSBhZnRlciBhbnlcbiAgLy9zdHJlYW0gcGlwZWQgZnJvbSBoZXJlLlxuICAvL3RoaXMgaXMgb25seSBhIHByb2JsZW0gaWYgZW5kIGlzIG5vdCBlbWl0dGVkIHN5bmNocm9ub3VzbHkuXG4gIC8vYSBuaWNlciB3YXkgdG8gZG8gdGhpcyBpcyB0byBtYWtlIHN1cmUgdGhpcyBpcyB0aGUgbGFzdCBsaXN0ZW5lciBmb3IgJ2VuZCdcblxuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZVxuICAgIGlmKCFzdHJlYW0ud3JpdGFibGUgJiYgc3RyZWFtLmF1dG9EZXN0cm95KVxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHN0cmVhbS5kZXN0cm95KClcbiAgICAgIH0pXG4gIH0pXG5cbiAgZnVuY3Rpb24gX2VuZCAoKSB7XG4gICAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2VcbiAgICBlbmQuY2FsbChzdHJlYW0pXG4gICAgaWYoIXN0cmVhbS5yZWFkYWJsZSAmJiBzdHJlYW0uYXV0b0Rlc3Ryb3kpXG4gICAgICBzdHJlYW0uZGVzdHJveSgpXG4gIH1cblxuICBzdHJlYW0uZW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBpZihlbmRlZCkgcmV0dXJuXG4gICAgZW5kZWQgPSB0cnVlXG4gICAgaWYoYXJndW1lbnRzLmxlbmd0aCkgc3RyZWFtLndyaXRlKGRhdGEpXG4gICAgX2VuZCgpIC8vIHdpbGwgZW1pdCBvciBxdWV1ZVxuICAgIHJldHVybiBzdHJlYW1cbiAgfVxuXG4gIHN0cmVhbS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKGRlc3Ryb3llZCkgcmV0dXJuXG4gICAgZGVzdHJveWVkID0gdHJ1ZVxuICAgIGVuZGVkID0gdHJ1ZVxuICAgIGJ1ZmZlci5sZW5ndGggPSAwXG4gICAgc3RyZWFtLndyaXRhYmxlID0gc3RyZWFtLnJlYWRhYmxlID0gZmFsc2VcbiAgICBzdHJlYW0uZW1pdCgnY2xvc2UnKVxuICAgIHJldHVybiBzdHJlYW1cbiAgfVxuXG4gIHN0cmVhbS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZihzdHJlYW0ucGF1c2VkKSByZXR1cm5cbiAgICBzdHJlYW0ucGF1c2VkID0gdHJ1ZVxuICAgIHJldHVybiBzdHJlYW1cbiAgfVxuXG4gIHN0cmVhbS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYoc3RyZWFtLnBhdXNlZCkge1xuICAgICAgc3RyZWFtLnBhdXNlZCA9IGZhbHNlXG4gICAgICBzdHJlYW0uZW1pdCgncmVzdW1lJylcbiAgICB9XG4gICAgZHJhaW4oKVxuICAgIC8vbWF5IGhhdmUgYmVjb21lIHBhdXNlZCBhZ2FpbixcbiAgICAvL2FzIGRyYWluIGVtaXRzICdkYXRhJy5cbiAgICBpZighc3RyZWFtLnBhdXNlZClcbiAgICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpXG4gICAgcmV0dXJuIHN0cmVhbVxuICB9XG4gIHJldHVybiBzdHJlYW1cbn1cblxuXG59KS5jYWxsKHRoaXMscmVxdWlyZShcIktsaXViSFwiKSkiLCIndXNlIHN0cmljdCc7XG5cbnZhciBpc1N0cmluZyA9IHJlcXVpcmUoJ2lzLXN0cmluZycpO1xudmFyIGlzTnVtYmVyID0gcmVxdWlyZSgnaXMtbnVtYmVyLW9iamVjdCcpO1xudmFyIGlzQm9vbGVhbiA9IHJlcXVpcmUoJ2lzLWJvb2xlYW4tb2JqZWN0Jyk7XG52YXIgaXNTeW1ib2wgPSByZXF1aXJlKCdpcy1zeW1ib2wnKTtcbnZhciBpc0JpZ0ludCA9IHJlcXVpcmUoJ2lzLWJpZ2ludCcpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gd2hpY2hCb3hlZFByaW1pdGl2ZSh2YWx1ZSkge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdGlmICh2YWx1ZSA9PSBudWxsIHx8ICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHRpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG5cdFx0cmV0dXJuICdTdHJpbmcnO1xuXHR9XG5cdGlmIChpc051bWJlcih2YWx1ZSkpIHtcblx0XHRyZXR1cm4gJ051bWJlcic7XG5cdH1cblx0aWYgKGlzQm9vbGVhbih2YWx1ZSkpIHtcblx0XHRyZXR1cm4gJ0Jvb2xlYW4nO1xuXHR9XG5cdGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcblx0XHRyZXR1cm4gJ1N5bWJvbCc7XG5cdH1cblx0aWYgKGlzQmlnSW50KHZhbHVlKSkge1xuXHRcdHJldHVybiAnQmlnSW50Jztcblx0fVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGlzTWFwID0gcmVxdWlyZSgnaXMtbWFwJyk7XG52YXIgaXNTZXQgPSByZXF1aXJlKCdpcy1zZXQnKTtcbnZhciBpc1dlYWtNYXAgPSByZXF1aXJlKCdpcy13ZWFrbWFwJyk7XG52YXIgaXNXZWFrU2V0ID0gcmVxdWlyZSgnaXMtd2Vha3NldCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHdoaWNoQ29sbGVjdGlvbih2YWx1ZSkge1xuXHRpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuXHRcdGlmIChpc01hcCh2YWx1ZSkpIHtcblx0XHRcdHJldHVybiAnTWFwJztcblx0XHR9XG5cdFx0aWYgKGlzU2V0KHZhbHVlKSkge1xuXHRcdFx0cmV0dXJuICdTZXQnO1xuXHRcdH1cblx0XHRpZiAoaXNXZWFrTWFwKHZhbHVlKSkge1xuXHRcdFx0cmV0dXJuICdXZWFrTWFwJztcblx0XHR9XG5cdFx0aWYgKGlzV2Vha1NldCh2YWx1ZSkpIHtcblx0XHRcdHJldHVybiAnV2Vha1NldCc7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmYWxzZTtcbn07XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBmb3JFYWNoID0gcmVxdWlyZSgnZm9yLWVhY2gnKTtcbnZhciBhdmFpbGFibGVUeXBlZEFycmF5cyA9IHJlcXVpcmUoJ2F2YWlsYWJsZS10eXBlZC1hcnJheXMnKTtcbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJpbmQvY2FsbEJvdW5kJyk7XG5cbnZhciAkdG9TdHJpbmcgPSBjYWxsQm91bmQoJ09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcnKTtcbnZhciBoYXNUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJ2hhcy10b3N0cmluZ3RhZy9zaGFtcycpKCk7XG5cbnZhciBnID0gdHlwZW9mIGdsb2JhbFRoaXMgPT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogZ2xvYmFsVGhpcztcbnZhciB0eXBlZEFycmF5cyA9IGF2YWlsYWJsZVR5cGVkQXJyYXlzKCk7XG5cbnZhciAkc2xpY2UgPSBjYWxsQm91bmQoJ1N0cmluZy5wcm90b3R5cGUuc2xpY2UnKTtcbnZhciB0b1N0clRhZ3MgPSB7fTtcbnZhciBnT1BEID0gcmVxdWlyZSgnZXMtYWJzdHJhY3QvaGVscGVycy9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsgLy8gcmVxdWlyZSgnZ2V0cHJvdG90eXBlb2YnKTtcbmlmIChoYXNUb1N0cmluZ1RhZyAmJiBnT1BEICYmIGdldFByb3RvdHlwZU9mKSB7XG5cdGZvckVhY2godHlwZWRBcnJheXMsIGZ1bmN0aW9uICh0eXBlZEFycmF5KSB7XG5cdFx0aWYgKHR5cGVvZiBnW3R5cGVkQXJyYXldID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHR2YXIgYXJyID0gbmV3IGdbdHlwZWRBcnJheV0oKTtcblx0XHRcdGlmIChTeW1ib2wudG9TdHJpbmdUYWcgaW4gYXJyKSB7XG5cdFx0XHRcdHZhciBwcm90byA9IGdldFByb3RvdHlwZU9mKGFycik7XG5cdFx0XHRcdHZhciBkZXNjcmlwdG9yID0gZ09QRChwcm90bywgU3ltYm9sLnRvU3RyaW5nVGFnKTtcblx0XHRcdFx0aWYgKCFkZXNjcmlwdG9yKSB7XG5cdFx0XHRcdFx0dmFyIHN1cGVyUHJvdG8gPSBnZXRQcm90b3R5cGVPZihwcm90byk7XG5cdFx0XHRcdFx0ZGVzY3JpcHRvciA9IGdPUEQoc3VwZXJQcm90bywgU3ltYm9sLnRvU3RyaW5nVGFnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0b1N0clRhZ3NbdHlwZWRBcnJheV0gPSBkZXNjcmlwdG9yLmdldDtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG52YXIgdHJ5VHlwZWRBcnJheXMgPSBmdW5jdGlvbiB0cnlBbGxUeXBlZEFycmF5cyh2YWx1ZSkge1xuXHR2YXIgZm91bmROYW1lID0gZmFsc2U7XG5cdGZvckVhY2godG9TdHJUYWdzLCBmdW5jdGlvbiAoZ2V0dGVyLCB0eXBlZEFycmF5KSB7XG5cdFx0aWYgKCFmb3VuZE5hbWUpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHZhciBuYW1lID0gZ2V0dGVyLmNhbGwodmFsdWUpO1xuXHRcdFx0XHRpZiAobmFtZSA9PT0gdHlwZWRBcnJheSkge1xuXHRcdFx0XHRcdGZvdW5kTmFtZSA9IG5hbWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGZvdW5kTmFtZTtcbn07XG5cbnZhciBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCdpcy10eXBlZC1hcnJheScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHdoaWNoVHlwZWRBcnJheSh2YWx1ZSkge1xuXHRpZiAoIWlzVHlwZWRBcnJheSh2YWx1ZSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICghaGFzVG9TdHJpbmdUYWcgfHwgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUpKSB7IHJldHVybiAkc2xpY2UoJHRvU3RyaW5nKHZhbHVlKSwgOCwgLTEpOyB9XG5cdHJldHVybiB0cnlUeXBlZEFycmF5cyh2YWx1ZSk7XG59O1xuXG59KS5jYWxsKHRoaXMsdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KSIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRlc3QgPSByZXF1aXJlKCcuLi8uLi8nKTtcblxudGVzdChmdW5jdGlvbiAodCkge1xuXHR0LnBsYW4oNCk7XG5cdHQub2sodHJ1ZSk7XG5cdHQuZXF1YWwoMywgMSArIDIpO1xuXHR0LmRlZXBFcXVhbChbMSwgMiwgWzMsIDRdXSwgWzEsIDIsIFszLCA0XV0pO1xuXHR0Lm5vdERlZXBFcXVhbChbMSwgMiwgWzMsIDQsIDVdXSwgWzEsIDIsIFszLCA0XV0pO1xufSk7XG4iLCJ2YXIgbG9va3VwID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXG47KGZ1bmN0aW9uIChleHBvcnRzKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuICB2YXIgQXJyID0gKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJylcbiAgICA/IFVpbnQ4QXJyYXlcbiAgICA6IEFycmF5XG5cblx0dmFyIFBMVVMgICA9ICcrJy5jaGFyQ29kZUF0KDApXG5cdHZhciBTTEFTSCAgPSAnLycuY2hhckNvZGVBdCgwKVxuXHR2YXIgTlVNQkVSID0gJzAnLmNoYXJDb2RlQXQoMClcblx0dmFyIExPV0VSICA9ICdhJy5jaGFyQ29kZUF0KDApXG5cdHZhciBVUFBFUiAgPSAnQScuY2hhckNvZGVBdCgwKVxuXHR2YXIgUExVU19VUkxfU0FGRSA9ICctJy5jaGFyQ29kZUF0KDApXG5cdHZhciBTTEFTSF9VUkxfU0FGRSA9ICdfJy5jaGFyQ29kZUF0KDApXG5cblx0ZnVuY3Rpb24gZGVjb2RlIChlbHQpIHtcblx0XHR2YXIgY29kZSA9IGVsdC5jaGFyQ29kZUF0KDApXG5cdFx0aWYgKGNvZGUgPT09IFBMVVMgfHxcblx0XHQgICAgY29kZSA9PT0gUExVU19VUkxfU0FGRSlcblx0XHRcdHJldHVybiA2MiAvLyAnKydcblx0XHRpZiAoY29kZSA9PT0gU0xBU0ggfHxcblx0XHQgICAgY29kZSA9PT0gU0xBU0hfVVJMX1NBRkUpXG5cdFx0XHRyZXR1cm4gNjMgLy8gJy8nXG5cdFx0aWYgKGNvZGUgPCBOVU1CRVIpXG5cdFx0XHRyZXR1cm4gLTEgLy9ubyBtYXRjaFxuXHRcdGlmIChjb2RlIDwgTlVNQkVSICsgMTApXG5cdFx0XHRyZXR1cm4gY29kZSAtIE5VTUJFUiArIDI2ICsgMjZcblx0XHRpZiAoY29kZSA8IFVQUEVSICsgMjYpXG5cdFx0XHRyZXR1cm4gY29kZSAtIFVQUEVSXG5cdFx0aWYgKGNvZGUgPCBMT1dFUiArIDI2KVxuXHRcdFx0cmV0dXJuIGNvZGUgLSBMT1dFUiArIDI2XG5cdH1cblxuXHRmdW5jdGlvbiBiNjRUb0J5dGVBcnJheSAoYjY0KSB7XG5cdFx0dmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnJcblxuXHRcdGlmIChiNjQubGVuZ3RoICUgNCA+IDApIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG5cdFx0fVxuXG5cdFx0Ly8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcblx0XHQvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG5cdFx0Ly8gcmVwcmVzZW50IG9uZSBieXRlXG5cdFx0Ly8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG5cdFx0Ly8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuXHRcdHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cdFx0cGxhY2VIb2xkZXJzID0gJz0nID09PSBiNjQuY2hhckF0KGxlbiAtIDIpID8gMiA6ICc9JyA9PT0gYjY0LmNoYXJBdChsZW4gLSAxKSA/IDEgOiAwXG5cblx0XHQvLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcblx0XHRhcnIgPSBuZXcgQXJyKGI2NC5sZW5ndGggKiAzIC8gNCAtIHBsYWNlSG9sZGVycylcblxuXHRcdC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcblx0XHRsID0gcGxhY2VIb2xkZXJzID4gMCA/IGI2NC5sZW5ndGggLSA0IDogYjY0Lmxlbmd0aFxuXG5cdFx0dmFyIEwgPSAwXG5cblx0XHRmdW5jdGlvbiBwdXNoICh2KSB7XG5cdFx0XHRhcnJbTCsrXSA9IHZcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGw7IGkgKz0gNCwgaiArPSAzKSB7XG5cdFx0XHR0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDE4KSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpIDw8IDEyKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMikpIDw8IDYpIHwgZGVjb2RlKGI2NC5jaGFyQXQoaSArIDMpKVxuXHRcdFx0cHVzaCgodG1wICYgMHhGRjAwMDApID4+IDE2KVxuXHRcdFx0cHVzaCgodG1wICYgMHhGRjAwKSA+PiA4KVxuXHRcdFx0cHVzaCh0bXAgJiAweEZGKVxuXHRcdH1cblxuXHRcdGlmIChwbGFjZUhvbGRlcnMgPT09IDIpIHtcblx0XHRcdHRtcCA9IChkZWNvZGUoYjY0LmNoYXJBdChpKSkgPDwgMikgfCAoZGVjb2RlKGI2NC5jaGFyQXQoaSArIDEpKSA+PiA0KVxuXHRcdFx0cHVzaCh0bXAgJiAweEZGKVxuXHRcdH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG5cdFx0XHR0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDEwKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpIDw8IDQpIHwgKGRlY29kZShiNjQuY2hhckF0KGkgKyAyKSkgPj4gMilcblx0XHRcdHB1c2goKHRtcCA+PiA4KSAmIDB4RkYpXG5cdFx0XHRwdXNoKHRtcCAmIDB4RkYpXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFyclxuXHR9XG5cblx0ZnVuY3Rpb24gdWludDhUb0Jhc2U2NCAodWludDgpIHtcblx0XHR2YXIgaSxcblx0XHRcdGV4dHJhQnl0ZXMgPSB1aW50OC5sZW5ndGggJSAzLCAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuXHRcdFx0b3V0cHV0ID0gXCJcIixcblx0XHRcdHRlbXAsIGxlbmd0aFxuXG5cdFx0ZnVuY3Rpb24gZW5jb2RlIChudW0pIHtcblx0XHRcdHJldHVybiBsb29rdXAuY2hhckF0KG51bSlcblx0XHR9XG5cblx0XHRmdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuXHRcdFx0cmV0dXJuIGVuY29kZShudW0gPj4gMTggJiAweDNGKSArIGVuY29kZShudW0gPj4gMTIgJiAweDNGKSArIGVuY29kZShudW0gPj4gNiAmIDB4M0YpICsgZW5jb2RlKG51bSAmIDB4M0YpXG5cdFx0fVxuXG5cdFx0Ly8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuXHRcdGZvciAoaSA9IDAsIGxlbmd0aCA9IHVpbnQ4Lmxlbmd0aCAtIGV4dHJhQnl0ZXM7IGkgPCBsZW5ndGg7IGkgKz0gMykge1xuXHRcdFx0dGVtcCA9ICh1aW50OFtpXSA8PCAxNikgKyAodWludDhbaSArIDFdIDw8IDgpICsgKHVpbnQ4W2kgKyAyXSlcblx0XHRcdG91dHB1dCArPSB0cmlwbGV0VG9CYXNlNjQodGVtcClcblx0XHR9XG5cblx0XHQvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG5cdFx0c3dpdGNoIChleHRyYUJ5dGVzKSB7XG5cdFx0XHRjYXNlIDE6XG5cdFx0XHRcdHRlbXAgPSB1aW50OFt1aW50OC5sZW5ndGggLSAxXVxuXHRcdFx0XHRvdXRwdXQgKz0gZW5jb2RlKHRlbXAgPj4gMilcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSgodGVtcCA8PCA0KSAmIDB4M0YpXG5cdFx0XHRcdG91dHB1dCArPSAnPT0nXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHRjYXNlIDI6XG5cdFx0XHRcdHRlbXAgPSAodWludDhbdWludDgubGVuZ3RoIC0gMl0gPDwgOCkgKyAodWludDhbdWludDgubGVuZ3RoIC0gMV0pXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUodGVtcCA+PiAxMClcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSgodGVtcCA+PiA0KSAmIDB4M0YpXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUoKHRlbXAgPDwgMikgJiAweDNGKVxuXHRcdFx0XHRvdXRwdXQgKz0gJz0nXG5cdFx0XHRcdGJyZWFrXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG91dHB1dFxuXHR9XG5cblx0ZXhwb3J0cy50b0J5dGVBcnJheSA9IGI2NFRvQnl0ZUFycmF5XG5cdGV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IHVpbnQ4VG9CYXNlNjRcbn0odHlwZW9mIGV4cG9ydHMgPT09ICd1bmRlZmluZWQnID8gKHRoaXMuYmFzZTY0anMgPSB7fSkgOiBleHBvcnRzKSlcbiIsbnVsbCwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuXG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnYmFzZTY0LWpzJylcbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuQnVmZmVyLnBvb2xTaXplID0gODE5MlxuXG4vKipcbiAqIElmIGBCdWZmZXIuX3VzZVR5cGVkQXJyYXlzYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKGNvbXBhdGlibGUgZG93biB0byBJRTYpXG4gKi9cbkJ1ZmZlci5fdXNlVHlwZWRBcnJheXMgPSAoZnVuY3Rpb24gKCkge1xuICAvLyBEZXRlY3QgaWYgYnJvd3NlciBzdXBwb3J0cyBUeXBlZCBBcnJheXMuIFN1cHBvcnRlZCBicm93c2VycyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLFxuICAvLyBDaHJvbWUgNyssIFNhZmFyaSA1LjErLCBPcGVyYSAxMS42KywgaU9TIDQuMisuIElmIHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgYWRkaW5nXG4gIC8vIHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcywgdGhlbiB0aGF0J3MgdGhlIHNhbWUgYXMgbm8gYFVpbnQ4QXJyYXlgIHN1cHBvcnRcbiAgLy8gYmVjYXVzZSB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gYWRkIGFsbCB0aGUgbm9kZSBCdWZmZXIgQVBJIG1ldGhvZHMuIFRoaXMgaXMgYW4gaXNzdWVcbiAgLy8gaW4gRmlyZWZveCA0LTI5LiBOb3cgZml4ZWQ6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOFxuICB0cnkge1xuICAgIHZhciBidWYgPSBuZXcgQXJyYXlCdWZmZXIoMClcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYnVmKVxuICAgIGFyci5mb28gPSBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9XG4gICAgcmV0dXJuIDQyID09PSBhcnIuZm9vKCkgJiZcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAvLyBDaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59KSgpXG5cbi8qKlxuICogQ2xhc3M6IEJ1ZmZlclxuICogPT09PT09PT09PT09PVxuICpcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgYXJlIGF1Z21lbnRlZFxuICogd2l0aCBmdW5jdGlvbiBwcm9wZXJ0aWVzIGZvciBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgQVBJIGZ1bmN0aW9ucy4gV2UgdXNlXG4gKiBgVWludDhBcnJheWAgc28gdGhhdCBzcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdCByZXR1cm5zXG4gKiBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBCeSBhdWdtZW50aW5nIHRoZSBpbnN0YW5jZXMsIHdlIGNhbiBhdm9pZCBtb2RpZnlpbmcgdGhlIGBVaW50OEFycmF5YFxuICogcHJvdG90eXBlLlxuICovXG5mdW5jdGlvbiBCdWZmZXIgKHN1YmplY3QsIGVuY29kaW5nLCBub1plcm8pIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpXG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoc3ViamVjdCwgZW5jb2RpbmcsIG5vWmVybylcblxuICB2YXIgdHlwZSA9IHR5cGVvZiBzdWJqZWN0XG5cbiAgLy8gV29ya2Fyb3VuZDogbm9kZSdzIGJhc2U2NCBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgc3RyaW5nc1xuICAvLyB3aGlsZSBiYXNlNjQtanMgZG9lcyBub3QuXG4gIGlmIChlbmNvZGluZyA9PT0gJ2Jhc2U2NCcgJiYgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBzdWJqZWN0ID0gc3RyaW5ndHJpbShzdWJqZWN0KVxuICAgIHdoaWxlIChzdWJqZWN0Lmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICAgIHN1YmplY3QgPSBzdWJqZWN0ICsgJz0nXG4gICAgfVxuICB9XG5cbiAgLy8gRmluZCB0aGUgbGVuZ3RoXG4gIHZhciBsZW5ndGhcbiAgaWYgKHR5cGUgPT09ICdudW1iZXInKVxuICAgIGxlbmd0aCA9IGNvZXJjZShzdWJqZWN0KVxuICBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJylcbiAgICBsZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChzdWJqZWN0LCBlbmNvZGluZylcbiAgZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpXG4gICAgbGVuZ3RoID0gY29lcmNlKHN1YmplY3QubGVuZ3RoKSAvLyBhc3N1bWUgdGhhdCBvYmplY3QgaXMgYXJyYXktbGlrZVxuICBlbHNlXG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCBuZWVkcyB0byBiZSBhIG51bWJlciwgYXJyYXkgb3Igc3RyaW5nLicpXG5cbiAgdmFyIGJ1ZlxuICBpZiAoQnVmZmVyLl91c2VUeXBlZEFycmF5cykge1xuICAgIC8vIFByZWZlcnJlZDogUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICBidWYgPSBCdWZmZXIuX2F1Z21lbnQobmV3IFVpbnQ4QXJyYXkobGVuZ3RoKSlcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIFRISVMgaW5zdGFuY2Ugb2YgQnVmZmVyIChjcmVhdGVkIGJ5IGBuZXdgKVxuICAgIGJ1ZiA9IHRoaXNcbiAgICBidWYubGVuZ3RoID0gbGVuZ3RoXG4gICAgYnVmLl9pc0J1ZmZlciA9IHRydWVcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChCdWZmZXIuX3VzZVR5cGVkQXJyYXlzICYmIHR5cGVvZiBzdWJqZWN0LmJ5dGVMZW5ndGggPT09ICdudW1iZXInKSB7XG4gICAgLy8gU3BlZWQgb3B0aW1pemF0aW9uIC0tIHVzZSBzZXQgaWYgd2UncmUgY29weWluZyBmcm9tIGEgdHlwZWQgYXJyYXlcbiAgICBidWYuX3NldChzdWJqZWN0KVxuICB9IGVsc2UgaWYgKGlzQXJyYXlpc2goc3ViamVjdCkpIHtcbiAgICAvLyBUcmVhdCBhcnJheS1pc2ggb2JqZWN0cyBhcyBhIGJ5dGUgYXJyYXlcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoc3ViamVjdCkpXG4gICAgICAgIGJ1ZltpXSA9IHN1YmplY3QucmVhZFVJbnQ4KGkpXG4gICAgICBlbHNlXG4gICAgICAgIGJ1ZltpXSA9IHN1YmplY3RbaV1cbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBidWYud3JpdGUoc3ViamVjdCwgMCwgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgIUJ1ZmZlci5fdXNlVHlwZWRBcnJheXMgJiYgIW5vWmVybykge1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgYnVmW2ldID0gMFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBidWZcbn1cblxuLy8gU1RBVElDIE1FVEhPRFNcbi8vID09PT09PT09PT09PT09XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICdyYXcnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiAoYikge1xuICByZXR1cm4gISEoYiAhPT0gbnVsbCAmJiBiICE9PSB1bmRlZmluZWQgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gZnVuY3Rpb24gKHN0ciwgZW5jb2RpbmcpIHtcbiAgdmFyIHJldFxuICBzdHIgPSBzdHIgKyAnJ1xuICBzd2l0Y2ggKGVuY29kaW5nIHx8ICd1dGY4Jykge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgICByZXQgPSBzdHIubGVuZ3RoIC8gMlxuICAgICAgYnJlYWtcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgICByZXQgPSB1dGY4VG9CeXRlcyhzdHIpLmxlbmd0aFxuICAgICAgYnJlYWtcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdyYXcnOlxuICAgICAgcmV0ID0gc3RyLmxlbmd0aFxuICAgICAgYnJlYWtcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgcmV0ID0gYmFzZTY0VG9CeXRlcyhzdHIpLmxlbmd0aFxuICAgICAgYnJlYWtcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0ID0gc3RyLmxlbmd0aCAqIDJcbiAgICAgIGJyZWFrXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBlbmNvZGluZycpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gKGxpc3QsIHRvdGFsTGVuZ3RoKSB7XG4gIGFzc2VydChpc0FycmF5KGxpc3QpLCAnVXNhZ2U6IEJ1ZmZlci5jb25jYXQobGlzdCwgW3RvdGFsTGVuZ3RoXSlcXG4nICtcbiAgICAgICdsaXN0IHNob3VsZCBiZSBhbiBBcnJheS4nKVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKDApXG4gIH0gZWxzZSBpZiAobGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gbGlzdFswXVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB0b3RhbExlbmd0aCAhPT0gJ251bWJlcicpIHtcbiAgICB0b3RhbExlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgdG90YWxMZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmID0gbmV3IEJ1ZmZlcih0b3RhbExlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV1cbiAgICBpdGVtLmNvcHkoYnVmLCBwb3MpXG4gICAgcG9zICs9IGl0ZW0ubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG4vLyBCVUZGRVIgSU5TVEFOQ0UgTUVUSE9EU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gX2hleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgLy8gbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZiBkaWdpdHNcbiAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcbiAgYXNzZXJ0KHN0ckxlbiAlIDIgPT09IDAsICdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYnl0ZSA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNilcbiAgICBhc3NlcnQoIWlzTmFOKGJ5dGUpLCAnSW52YWxpZCBoZXggc3RyaW5nJylcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBieXRlXG4gIH1cbiAgQnVmZmVyLl9jaGFyc1dyaXR0ZW4gPSBpICogMlxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBfdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgdmFyIGNoYXJzV3JpdHRlbiA9IEJ1ZmZlci5fY2hhcnNXcml0dGVuID1cbiAgICBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG4gIHJldHVybiBjaGFyc1dyaXR0ZW5cbn1cblxuZnVuY3Rpb24gX2FzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICB2YXIgY2hhcnNXcml0dGVuID0gQnVmZmVyLl9jaGFyc1dyaXR0ZW4gPVxuICAgIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG4gIHJldHVybiBjaGFyc1dyaXR0ZW5cbn1cblxuZnVuY3Rpb24gX2JpbmFyeVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIF9hc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gX2Jhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgdmFyIGNoYXJzV3JpdHRlbiA9IEJ1ZmZlci5fY2hhcnNXcml0dGVuID1cbiAgICBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbiAgcmV0dXJuIGNoYXJzV3JpdHRlblxufVxuXG5mdW5jdGlvbiBfdXRmMTZsZVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgdmFyIGNoYXJzV3JpdHRlbiA9IEJ1ZmZlci5fY2hhcnNXcml0dGVuID1cbiAgICBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG4gIHJldHVybiBjaGFyc1dyaXR0ZW5cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBTdXBwb3J0IGJvdGggKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKVxuICAvLyBhbmQgdGhlIGxlZ2FjeSAoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpXG4gIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgaWYgKCFpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICB9IGVsc2UgeyAgLy8gbGVnYWN5XG4gICAgdmFyIHN3YXAgPSBlbmNvZGluZ1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgb2Zmc2V0ID0gbGVuZ3RoXG4gICAgbGVuZ3RoID0gc3dhcFxuICB9XG5cbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKClcblxuICB2YXIgcmV0XG4gIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgICAgcmV0ID0gX2hleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG4gICAgICBicmVha1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIHJldCA9IF91dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnYXNjaWknOlxuICAgICAgcmV0ID0gX2FzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgIHJldCA9IF9iaW5hcnlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuICAgICAgYnJlYWtcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgcmV0ID0gX2Jhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG4gICAgICBicmVha1xuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXQgPSBfdXRmMTZsZVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2RpbmcnKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKClcbiAgc3RhcnQgPSBOdW1iZXIoc3RhcnQpIHx8IDBcbiAgZW5kID0gKGVuZCAhPT0gdW5kZWZpbmVkKVxuICAgID8gTnVtYmVyKGVuZClcbiAgICA6IGVuZCA9IHNlbGYubGVuZ3RoXG5cbiAgLy8gRmFzdHBhdGggZW1wdHkgc3RyaW5nc1xuICBpZiAoZW5kID09PSBzdGFydClcbiAgICByZXR1cm4gJydcblxuICB2YXIgcmV0XG4gIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgICAgcmV0ID0gX2hleFNsaWNlKHNlbGYsIHN0YXJ0LCBlbmQpXG4gICAgICBicmVha1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIHJldCA9IF91dGY4U2xpY2Uoc2VsZiwgc3RhcnQsIGVuZClcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnYXNjaWknOlxuICAgICAgcmV0ID0gX2FzY2lpU2xpY2Uoc2VsZiwgc3RhcnQsIGVuZClcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgIHJldCA9IF9iaW5hcnlTbGljZShzZWxmLCBzdGFydCwgZW5kKVxuICAgICAgYnJlYWtcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgcmV0ID0gX2Jhc2U2NFNsaWNlKHNlbGYsIHN0YXJ0LCBlbmQpXG4gICAgICBicmVha1xuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXQgPSBfdXRmMTZsZVNsaWNlKHNlbGYsIHN0YXJ0LCBlbmQpXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2RpbmcnKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKHRhcmdldCwgdGFyZ2V0X3N0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIHZhciBzb3VyY2UgPSB0aGlzXG5cbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKCF0YXJnZXRfc3RhcnQpIHRhcmdldF9zdGFydCA9IDBcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVyblxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCBzb3VyY2UubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGFzc2VydChlbmQgPj0gc3RhcnQsICdzb3VyY2VFbmQgPCBzb3VyY2VTdGFydCcpXG4gIGFzc2VydCh0YXJnZXRfc3RhcnQgPj0gMCAmJiB0YXJnZXRfc3RhcnQgPCB0YXJnZXQubGVuZ3RoLFxuICAgICAgJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBhc3NlcnQoc3RhcnQgPj0gMCAmJiBzdGFydCA8IHNvdXJjZS5sZW5ndGgsICdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgYXNzZXJ0KGVuZCA+PSAwICYmIGVuZCA8PSBzb3VyY2UubGVuZ3RoLCAnc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aClcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldF9zdGFydCA8IGVuZCAtIHN0YXJ0KVxuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRfc3RhcnQgKyBzdGFydFxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuXG4gIGlmIChsZW4gPCAxMDAgfHwgIUJ1ZmZlci5fdXNlVHlwZWRBcnJheXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRfc3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0Ll9zZXQodGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLCB0YXJnZXRfc3RhcnQpXG4gIH1cbn1cblxuZnVuY3Rpb24gX2Jhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiBfdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJlcyA9ICcnXG4gIHZhciB0bXAgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICBpZiAoYnVmW2ldIDw9IDB4N0YpIHtcbiAgICAgIHJlcyArPSBkZWNvZGVVdGY4Q2hhcih0bXApICsgU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gICAgICB0bXAgPSAnJ1xuICAgIH0gZWxzZSB7XG4gICAgICB0bXAgKz0gJyUnICsgYnVmW2ldLnRvU3RyaW5nKDE2KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXMgKyBkZWNvZGVVdGY4Q2hhcih0bXApXG59XG5cbmZ1bmN0aW9uIF9hc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKylcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gX2JpbmFyeVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIF9hc2NpaVNsaWNlKGJ1Ziwgc3RhcnQsIGVuZClcbn1cblxuZnVuY3Rpb24gX2hleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gX3V0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSsxXSAqIDI1NilcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSBjbGFtcChzdGFydCwgbGVuLCAwKVxuICBlbmQgPSBjbGFtcChlbmQsIGxlbiwgbGVuKVxuXG4gIGlmIChCdWZmZXIuX3VzZVR5cGVkQXJyYXlzKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5fYXVnbWVudCh0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpKVxuICB9IGVsc2Uge1xuICAgIHZhciBzbGljZUxlbiA9IGVuZCAtIHN0YXJ0XG4gICAgdmFyIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZCwgdHJ1ZSlcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyBpKyspIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgICByZXR1cm4gbmV3QnVmXG4gIH1cbn1cblxuLy8gYGdldGAgd2lsbCBiZSByZW1vdmVkIGluIE5vZGUgMC4xMytcbkJ1ZmZlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG9mZnNldCkge1xuICBjb25zb2xlLmxvZygnLmdldCgpIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB1c2luZyBhcnJheSBpbmRleGVzIGluc3RlYWQuJylcbiAgcmV0dXJuIHRoaXMucmVhZFVJbnQ4KG9mZnNldClcbn1cblxuLy8gYHNldGAgd2lsbCBiZSByZW1vdmVkIGluIE5vZGUgMC4xMytcbkJ1ZmZlci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHYsIG9mZnNldCkge1xuICBjb25zb2xlLmxvZygnLnNldCgpIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB1c2luZyBhcnJheSBpbmRleGVzIGluc3RlYWQuJylcbiAgcmV0dXJuIHRoaXMud3JpdGVVSW50OCh2LCBvZmZzZXQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGFzc2VydChvZmZzZXQgIT09IHVuZGVmaW5lZCAmJiBvZmZzZXQgIT09IG51bGwsICdtaXNzaW5nIG9mZnNldCcpXG4gICAgYXNzZXJ0KG9mZnNldCA8IHRoaXMubGVuZ3RoLCAnVHJ5aW5nIHRvIHJlYWQgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxuICB9XG5cbiAgaWYgKG9mZnNldCA+PSB0aGlzLmxlbmd0aClcbiAgICByZXR1cm5cblxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbmZ1bmN0aW9uIF9yZWFkVUludDE2IChidWYsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBsaXR0bGVFbmRpYW4gPT09ICdib29sZWFuJywgJ21pc3Npbmcgb3IgaW52YWxpZCBlbmRpYW4nKVxuICAgIGFzc2VydChvZmZzZXQgIT09IHVuZGVmaW5lZCAmJiBvZmZzZXQgIT09IG51bGwsICdtaXNzaW5nIG9mZnNldCcpXG4gICAgYXNzZXJ0KG9mZnNldCArIDEgPCBidWYubGVuZ3RoLCAnVHJ5aW5nIHRvIHJlYWQgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxuICB9XG5cbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcbiAgaWYgKG9mZnNldCA+PSBsZW4pXG4gICAgcmV0dXJuXG5cbiAgdmFyIHZhbFxuICBpZiAobGl0dGxlRW5kaWFuKSB7XG4gICAgdmFsID0gYnVmW29mZnNldF1cbiAgICBpZiAob2Zmc2V0ICsgMSA8IGxlbilcbiAgICAgIHZhbCB8PSBidWZbb2Zmc2V0ICsgMV0gPDwgOFxuICB9IGVsc2Uge1xuICAgIHZhbCA9IGJ1ZltvZmZzZXRdIDw8IDhcbiAgICBpZiAob2Zmc2V0ICsgMSA8IGxlbilcbiAgICAgIHZhbCB8PSBidWZbb2Zmc2V0ICsgMV1cbiAgfVxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIF9yZWFkVUludDE2KHRoaXMsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIF9yZWFkVUludDE2KHRoaXMsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiBfcmVhZFVJbnQzMiAoYnVmLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGFzc2VydCh0eXBlb2YgbGl0dGxlRW5kaWFuID09PSAnYm9vbGVhbicsICdtaXNzaW5nIG9yIGludmFsaWQgZW5kaWFuJylcbiAgICBhc3NlcnQob2Zmc2V0ICE9PSB1bmRlZmluZWQgJiYgb2Zmc2V0ICE9PSBudWxsLCAnbWlzc2luZyBvZmZzZXQnKVxuICAgIGFzc2VydChvZmZzZXQgKyAzIDwgYnVmLmxlbmd0aCwgJ1RyeWluZyB0byByZWFkIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbiAgfVxuXG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG4gIGlmIChvZmZzZXQgPj0gbGVuKVxuICAgIHJldHVyblxuXG4gIHZhciB2YWxcbiAgaWYgKGxpdHRsZUVuZGlhbikge1xuICAgIGlmIChvZmZzZXQgKyAyIDwgbGVuKVxuICAgICAgdmFsID0gYnVmW29mZnNldCArIDJdIDw8IDE2XG4gICAgaWYgKG9mZnNldCArIDEgPCBsZW4pXG4gICAgICB2YWwgfD0gYnVmW29mZnNldCArIDFdIDw8IDhcbiAgICB2YWwgfD0gYnVmW29mZnNldF1cbiAgICBpZiAob2Zmc2V0ICsgMyA8IGxlbilcbiAgICAgIHZhbCA9IHZhbCArIChidWZbb2Zmc2V0ICsgM10gPDwgMjQgPj4+IDApXG4gIH0gZWxzZSB7XG4gICAgaWYgKG9mZnNldCArIDEgPCBsZW4pXG4gICAgICB2YWwgPSBidWZbb2Zmc2V0ICsgMV0gPDwgMTZcbiAgICBpZiAob2Zmc2V0ICsgMiA8IGxlbilcbiAgICAgIHZhbCB8PSBidWZbb2Zmc2V0ICsgMl0gPDwgOFxuICAgIGlmIChvZmZzZXQgKyAzIDwgbGVuKVxuICAgICAgdmFsIHw9IGJ1ZltvZmZzZXQgKyAzXVxuICAgIHZhbCA9IHZhbCArIChidWZbb2Zmc2V0XSA8PCAyNCA+Pj4gMClcbiAgfVxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIF9yZWFkVUludDMyKHRoaXMsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIF9yZWFkVUludDMyKHRoaXMsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGFzc2VydChvZmZzZXQgIT09IHVuZGVmaW5lZCAmJiBvZmZzZXQgIT09IG51bGwsXG4gICAgICAgICdtaXNzaW5nIG9mZnNldCcpXG4gICAgYXNzZXJ0KG9mZnNldCA8IHRoaXMubGVuZ3RoLCAnVHJ5aW5nIHRvIHJlYWQgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxuICB9XG5cbiAgaWYgKG9mZnNldCA+PSB0aGlzLmxlbmd0aClcbiAgICByZXR1cm5cblxuICB2YXIgbmVnID0gdGhpc1tvZmZzZXRdICYgMHg4MFxuICBpZiAobmVnKVxuICAgIHJldHVybiAoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTFcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuZnVuY3Rpb24gX3JlYWRJbnQxNiAoYnVmLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGFzc2VydCh0eXBlb2YgbGl0dGxlRW5kaWFuID09PSAnYm9vbGVhbicsICdtaXNzaW5nIG9yIGludmFsaWQgZW5kaWFuJylcbiAgICBhc3NlcnQob2Zmc2V0ICE9PSB1bmRlZmluZWQgJiYgb2Zmc2V0ICE9PSBudWxsLCAnbWlzc2luZyBvZmZzZXQnKVxuICAgIGFzc2VydChvZmZzZXQgKyAxIDwgYnVmLmxlbmd0aCwgJ1RyeWluZyB0byByZWFkIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbiAgfVxuXG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG4gIGlmIChvZmZzZXQgPj0gbGVuKVxuICAgIHJldHVyblxuXG4gIHZhciB2YWwgPSBfcmVhZFVJbnQxNihidWYsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCB0cnVlKVxuICB2YXIgbmVnID0gdmFsICYgMHg4MDAwXG4gIGlmIChuZWcpXG4gICAgcmV0dXJuICgweGZmZmYgLSB2YWwgKyAxKSAqIC0xXG4gIGVsc2VcbiAgICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiAob2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gX3JlYWRJbnQxNih0aGlzLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIF9yZWFkSW50MTYodGhpcywgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIF9yZWFkSW50MzIgKGJ1Ziwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGxpdHRsZUVuZGlhbiA9PT0gJ2Jvb2xlYW4nLCAnbWlzc2luZyBvciBpbnZhbGlkIGVuZGlhbicpXG4gICAgYXNzZXJ0KG9mZnNldCAhPT0gdW5kZWZpbmVkICYmIG9mZnNldCAhPT0gbnVsbCwgJ21pc3Npbmcgb2Zmc2V0JylcbiAgICBhc3NlcnQob2Zmc2V0ICsgMyA8IGJ1Zi5sZW5ndGgsICdUcnlpbmcgdG8gcmVhZCBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG4gIH1cblxuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuICBpZiAob2Zmc2V0ID49IGxlbilcbiAgICByZXR1cm5cblxuICB2YXIgdmFsID0gX3JlYWRVSW50MzIoYnVmLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgdHJ1ZSlcbiAgdmFyIG5lZyA9IHZhbCAmIDB4ODAwMDAwMDBcbiAgaWYgKG5lZylcbiAgICByZXR1cm4gKDB4ZmZmZmZmZmYgLSB2YWwgKyAxKSAqIC0xXG4gIGVsc2VcbiAgICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiAob2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gX3JlYWRJbnQzMih0aGlzLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIF9yZWFkSW50MzIodGhpcywgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIF9yZWFkRmxvYXQgKGJ1Ziwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGxpdHRsZUVuZGlhbiA9PT0gJ2Jvb2xlYW4nLCAnbWlzc2luZyBvciBpbnZhbGlkIGVuZGlhbicpXG4gICAgYXNzZXJ0KG9mZnNldCArIDMgPCBidWYubGVuZ3RoLCAnVHJ5aW5nIHRvIHJlYWQgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxuICB9XG5cbiAgcmV0dXJuIGllZWU3NTQucmVhZChidWYsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiBfcmVhZEZsb2F0KHRoaXMsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiAob2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gX3JlYWRGbG9hdCh0aGlzLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gX3JlYWREb3VibGUgKGJ1Ziwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGxpdHRsZUVuZGlhbiA9PT0gJ2Jvb2xlYW4nLCAnbWlzc2luZyBvciBpbnZhbGlkIGVuZGlhbicpXG4gICAgYXNzZXJ0KG9mZnNldCArIDcgPCBidWYubGVuZ3RoLCAnVHJ5aW5nIHRvIHJlYWQgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxuICB9XG5cbiAgcmV0dXJuIGllZWU3NTQucmVhZChidWYsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiAob2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gX3JlYWREb3VibGUodGhpcywgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiAob2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gX3JlYWREb3VibGUodGhpcywgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgYXNzZXJ0KHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwsICdtaXNzaW5nIHZhbHVlJylcbiAgICBhc3NlcnQob2Zmc2V0ICE9PSB1bmRlZmluZWQgJiYgb2Zmc2V0ICE9PSBudWxsLCAnbWlzc2luZyBvZmZzZXQnKVxuICAgIGFzc2VydChvZmZzZXQgPCB0aGlzLmxlbmd0aCwgJ3RyeWluZyB0byB3cml0ZSBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG4gICAgdmVyaWZ1aW50KHZhbHVlLCAweGZmKVxuICB9XG5cbiAgaWYgKG9mZnNldCA+PSB0aGlzLmxlbmd0aCkgcmV0dXJuXG5cbiAgdGhpc1tvZmZzZXRdID0gdmFsdWVcbn1cblxuZnVuY3Rpb24gX3dyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGFzc2VydCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsLCAnbWlzc2luZyB2YWx1ZScpXG4gICAgYXNzZXJ0KHR5cGVvZiBsaXR0bGVFbmRpYW4gPT09ICdib29sZWFuJywgJ21pc3Npbmcgb3IgaW52YWxpZCBlbmRpYW4nKVxuICAgIGFzc2VydChvZmZzZXQgIT09IHVuZGVmaW5lZCAmJiBvZmZzZXQgIT09IG51bGwsICdtaXNzaW5nIG9mZnNldCcpXG4gICAgYXNzZXJ0KG9mZnNldCArIDEgPCBidWYubGVuZ3RoLCAndHJ5aW5nIHRvIHdyaXRlIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbiAgICB2ZXJpZnVpbnQodmFsdWUsIDB4ZmZmZilcbiAgfVxuXG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG4gIGlmIChvZmZzZXQgPj0gbGVuKVxuICAgIHJldHVyblxuXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4obGVuIC0gb2Zmc2V0LCAyKTsgaSA8IGo7IGkrKykge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9XG4gICAgICAgICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAgICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgX3dyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgX3dyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gX3dyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGFzc2VydCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsLCAnbWlzc2luZyB2YWx1ZScpXG4gICAgYXNzZXJ0KHR5cGVvZiBsaXR0bGVFbmRpYW4gPT09ICdib29sZWFuJywgJ21pc3Npbmcgb3IgaW52YWxpZCBlbmRpYW4nKVxuICAgIGFzc2VydChvZmZzZXQgIT09IHVuZGVmaW5lZCAmJiBvZmZzZXQgIT09IG51bGwsICdtaXNzaW5nIG9mZnNldCcpXG4gICAgYXNzZXJ0KG9mZnNldCArIDMgPCBidWYubGVuZ3RoLCAndHJ5aW5nIHRvIHdyaXRlIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbiAgICB2ZXJpZnVpbnQodmFsdWUsIDB4ZmZmZmZmZmYpXG4gIH1cblxuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuICBpZiAob2Zmc2V0ID49IGxlbilcbiAgICByZXR1cm5cblxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGxlbiAtIG9mZnNldCwgNCk7IGkgPCBqOyBpKyspIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPVxuICAgICAgICAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIF93cml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIF93cml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBhc3NlcnQodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCwgJ21pc3NpbmcgdmFsdWUnKVxuICAgIGFzc2VydChvZmZzZXQgIT09IHVuZGVmaW5lZCAmJiBvZmZzZXQgIT09IG51bGwsICdtaXNzaW5nIG9mZnNldCcpXG4gICAgYXNzZXJ0KG9mZnNldCA8IHRoaXMubGVuZ3RoLCAnVHJ5aW5nIHRvIHdyaXRlIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbiAgICB2ZXJpZnNpbnQodmFsdWUsIDB4N2YsIC0weDgwKVxuICB9XG5cbiAgaWYgKG9mZnNldCA+PSB0aGlzLmxlbmd0aClcbiAgICByZXR1cm5cblxuICBpZiAodmFsdWUgPj0gMClcbiAgICB0aGlzLndyaXRlVUludDgodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpXG4gIGVsc2VcbiAgICB0aGlzLndyaXRlVUludDgoMHhmZiArIHZhbHVlICsgMSwgb2Zmc2V0LCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gX3dyaXRlSW50MTYgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgYXNzZXJ0KHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwsICdtaXNzaW5nIHZhbHVlJylcbiAgICBhc3NlcnQodHlwZW9mIGxpdHRsZUVuZGlhbiA9PT0gJ2Jvb2xlYW4nLCAnbWlzc2luZyBvciBpbnZhbGlkIGVuZGlhbicpXG4gICAgYXNzZXJ0KG9mZnNldCAhPT0gdW5kZWZpbmVkICYmIG9mZnNldCAhPT0gbnVsbCwgJ21pc3Npbmcgb2Zmc2V0JylcbiAgICBhc3NlcnQob2Zmc2V0ICsgMSA8IGJ1Zi5sZW5ndGgsICdUcnlpbmcgdG8gd3JpdGUgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxuICAgIHZlcmlmc2ludCh2YWx1ZSwgMHg3ZmZmLCAtMHg4MDAwKVxuICB9XG5cbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcbiAgaWYgKG9mZnNldCA+PSBsZW4pXG4gICAgcmV0dXJuXG5cbiAgaWYgKHZhbHVlID49IDApXG4gICAgX3dyaXRlVUludDE2KGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydClcbiAgZWxzZVxuICAgIF93cml0ZVVJbnQxNihidWYsIDB4ZmZmZiArIHZhbHVlICsgMSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICBfd3JpdGVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgX3dyaXRlSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiBfd3JpdGVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBhc3NlcnQodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCwgJ21pc3NpbmcgdmFsdWUnKVxuICAgIGFzc2VydCh0eXBlb2YgbGl0dGxlRW5kaWFuID09PSAnYm9vbGVhbicsICdtaXNzaW5nIG9yIGludmFsaWQgZW5kaWFuJylcbiAgICBhc3NlcnQob2Zmc2V0ICE9PSB1bmRlZmluZWQgJiYgb2Zmc2V0ICE9PSBudWxsLCAnbWlzc2luZyBvZmZzZXQnKVxuICAgIGFzc2VydChvZmZzZXQgKyAzIDwgYnVmLmxlbmd0aCwgJ1RyeWluZyB0byB3cml0ZSBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG4gICAgdmVyaWZzaW50KHZhbHVlLCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgfVxuXG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG4gIGlmIChvZmZzZXQgPj0gbGVuKVxuICAgIHJldHVyblxuXG4gIGlmICh2YWx1ZSA+PSAwKVxuICAgIF93cml0ZVVJbnQzMihidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpXG4gIGVsc2VcbiAgICBfd3JpdGVVSW50MzIoYnVmLCAweGZmZmZmZmZmICsgdmFsdWUgKyAxLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIF93cml0ZUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICBfd3JpdGVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIF93cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGFzc2VydCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsLCAnbWlzc2luZyB2YWx1ZScpXG4gICAgYXNzZXJ0KHR5cGVvZiBsaXR0bGVFbmRpYW4gPT09ICdib29sZWFuJywgJ21pc3Npbmcgb3IgaW52YWxpZCBlbmRpYW4nKVxuICAgIGFzc2VydChvZmZzZXQgIT09IHVuZGVmaW5lZCAmJiBvZmZzZXQgIT09IG51bGwsICdtaXNzaW5nIG9mZnNldCcpXG4gICAgYXNzZXJ0KG9mZnNldCArIDMgPCBidWYubGVuZ3RoLCAnVHJ5aW5nIHRvIHdyaXRlIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbiAgICB2ZXJpZklFRUU3NTQodmFsdWUsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG5cbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcbiAgaWYgKG9mZnNldCA+PSBsZW4pXG4gICAgcmV0dXJuXG5cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIF93cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICBfd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIF93cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBhc3NlcnQodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCwgJ21pc3NpbmcgdmFsdWUnKVxuICAgIGFzc2VydCh0eXBlb2YgbGl0dGxlRW5kaWFuID09PSAnYm9vbGVhbicsICdtaXNzaW5nIG9yIGludmFsaWQgZW5kaWFuJylcbiAgICBhc3NlcnQob2Zmc2V0ICE9PSB1bmRlZmluZWQgJiYgb2Zmc2V0ICE9PSBudWxsLCAnbWlzc2luZyBvZmZzZXQnKVxuICAgIGFzc2VydChvZmZzZXQgKyA3IDwgYnVmLmxlbmd0aCxcbiAgICAgICAgJ1RyeWluZyB0byB3cml0ZSBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG4gICAgdmVyaWZJRUVFNzU0KHZhbHVlLCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG5cbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcbiAgaWYgKG9mZnNldCA+PSBsZW4pXG4gICAgcmV0dXJuXG5cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICBfd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICBfd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBmaWxsKHZhbHVlLCBzdGFydD0wLCBlbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uICh2YWx1ZSwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXZhbHVlKSB2YWx1ZSA9IDBcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kKSBlbmQgPSB0aGlzLmxlbmd0aFxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5jaGFyQ29kZUF0KDApXG4gIH1cblxuICBhc3NlcnQodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsdWUpLCAndmFsdWUgaXMgbm90IGEgbnVtYmVyJylcbiAgYXNzZXJ0KGVuZCA+PSBzdGFydCwgJ2VuZCA8IHN0YXJ0JylcblxuICAvLyBGaWxsIDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVyblxuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gIGFzc2VydChzdGFydCA+PSAwICYmIHN0YXJ0IDwgdGhpcy5sZW5ndGgsICdzdGFydCBvdXQgb2YgYm91bmRzJylcbiAgYXNzZXJ0KGVuZCA+PSAwICYmIGVuZCA8PSB0aGlzLmxlbmd0aCwgJ2VuZCBvdXQgb2YgYm91bmRzJylcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgIHRoaXNbaV0gPSB2YWx1ZVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG91dCA9IFtdXG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgb3V0W2ldID0gdG9IZXgodGhpc1tpXSlcbiAgICBpZiAoaSA9PT0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUykge1xuICAgICAgb3V0W2kgKyAxXSA9ICcuLi4nXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICByZXR1cm4gJzxCdWZmZXIgJyArIG91dC5qb2luKCcgJykgKyAnPidcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGBBcnJheUJ1ZmZlcmAgd2l0aCB0aGUgKmNvcGllZCogbWVtb3J5IG9mIHRoZSBidWZmZXIgaW5zdGFuY2UuXG4gKiBBZGRlZCBpbiBOb2RlIDAuMTIuIE9ubHkgYXZhaWxhYmxlIGluIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBBcnJheUJ1ZmZlci5cbiAqL1xuQnVmZmVyLnByb3RvdHlwZS50b0FycmF5QnVmZmVyID0gZnVuY3Rpb24gKCkge1xuICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKEJ1ZmZlci5fdXNlVHlwZWRBcnJheXMpIHtcbiAgICAgIHJldHVybiAobmV3IEJ1ZmZlcih0aGlzKSkuYnVmZmVyXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheSh0aGlzLmxlbmd0aClcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBidWYubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpXG4gICAgICAgIGJ1ZltpXSA9IHRoaXNbaV1cbiAgICAgIHJldHVybiBidWYuYnVmZmVyXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyLnRvQXJyYXlCdWZmZXIgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXInKVxuICB9XG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxudmFyIEJQID0gQnVmZmVyLnByb3RvdHlwZVxuXG4vKipcbiAqIEF1Z21lbnQgYSBVaW50OEFycmF5ICppbnN0YW5jZSogKG5vdCB0aGUgVWludDhBcnJheSBjbGFzcyEpIHdpdGggQnVmZmVyIG1ldGhvZHNcbiAqL1xuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gKGFycikge1xuICBhcnIuX2lzQnVmZmVyID0gdHJ1ZVxuXG4gIC8vIHNhdmUgcmVmZXJlbmNlIHRvIG9yaWdpbmFsIFVpbnQ4QXJyYXkgZ2V0L3NldCBtZXRob2RzIGJlZm9yZSBvdmVyd3JpdGluZ1xuICBhcnIuX2dldCA9IGFyci5nZXRcbiAgYXJyLl9zZXQgPSBhcnIuc2V0XG5cbiAgLy8gZGVwcmVjYXRlZCwgd2lsbCBiZSByZW1vdmVkIGluIG5vZGUgMC4xMytcbiAgYXJyLmdldCA9IEJQLmdldFxuICBhcnIuc2V0ID0gQlAuc2V0XG5cbiAgYXJyLndyaXRlID0gQlAud3JpdGVcbiAgYXJyLnRvU3RyaW5nID0gQlAudG9TdHJpbmdcbiAgYXJyLnRvTG9jYWxlU3RyaW5nID0gQlAudG9TdHJpbmdcbiAgYXJyLnRvSlNPTiA9IEJQLnRvSlNPTlxuICBhcnIuY29weSA9IEJQLmNvcHlcbiAgYXJyLnNsaWNlID0gQlAuc2xpY2VcbiAgYXJyLnJlYWRVSW50OCA9IEJQLnJlYWRVSW50OFxuICBhcnIucmVhZFVJbnQxNkxFID0gQlAucmVhZFVJbnQxNkxFXG4gIGFyci5yZWFkVUludDE2QkUgPSBCUC5yZWFkVUludDE2QkVcbiAgYXJyLnJlYWRVSW50MzJMRSA9IEJQLnJlYWRVSW50MzJMRVxuICBhcnIucmVhZFVJbnQzMkJFID0gQlAucmVhZFVJbnQzMkJFXG4gIGFyci5yZWFkSW50OCA9IEJQLnJlYWRJbnQ4XG4gIGFyci5yZWFkSW50MTZMRSA9IEJQLnJlYWRJbnQxNkxFXG4gIGFyci5yZWFkSW50MTZCRSA9IEJQLnJlYWRJbnQxNkJFXG4gIGFyci5yZWFkSW50MzJMRSA9IEJQLnJlYWRJbnQzMkxFXG4gIGFyci5yZWFkSW50MzJCRSA9IEJQLnJlYWRJbnQzMkJFXG4gIGFyci5yZWFkRmxvYXRMRSA9IEJQLnJlYWRGbG9hdExFXG4gIGFyci5yZWFkRmxvYXRCRSA9IEJQLnJlYWRGbG9hdEJFXG4gIGFyci5yZWFkRG91YmxlTEUgPSBCUC5yZWFkRG91YmxlTEVcbiAgYXJyLnJlYWREb3VibGVCRSA9IEJQLnJlYWREb3VibGVCRVxuICBhcnIud3JpdGVVSW50OCA9IEJQLndyaXRlVUludDhcbiAgYXJyLndyaXRlVUludDE2TEUgPSBCUC53cml0ZVVJbnQxNkxFXG4gIGFyci53cml0ZVVJbnQxNkJFID0gQlAud3JpdGVVSW50MTZCRVxuICBhcnIud3JpdGVVSW50MzJMRSA9IEJQLndyaXRlVUludDMyTEVcbiAgYXJyLndyaXRlVUludDMyQkUgPSBCUC53cml0ZVVJbnQzMkJFXG4gIGFyci53cml0ZUludDggPSBCUC53cml0ZUludDhcbiAgYXJyLndyaXRlSW50MTZMRSA9IEJQLndyaXRlSW50MTZMRVxuICBhcnIud3JpdGVJbnQxNkJFID0gQlAud3JpdGVJbnQxNkJFXG4gIGFyci53cml0ZUludDMyTEUgPSBCUC53cml0ZUludDMyTEVcbiAgYXJyLndyaXRlSW50MzJCRSA9IEJQLndyaXRlSW50MzJCRVxuICBhcnIud3JpdGVGbG9hdExFID0gQlAud3JpdGVGbG9hdExFXG4gIGFyci53cml0ZUZsb2F0QkUgPSBCUC53cml0ZUZsb2F0QkVcbiAgYXJyLndyaXRlRG91YmxlTEUgPSBCUC53cml0ZURvdWJsZUxFXG4gIGFyci53cml0ZURvdWJsZUJFID0gQlAud3JpdGVEb3VibGVCRVxuICBhcnIuZmlsbCA9IEJQLmZpbGxcbiAgYXJyLmluc3BlY3QgPSBCUC5pbnNwZWN0XG4gIGFyci50b0FycmF5QnVmZmVyID0gQlAudG9BcnJheUJ1ZmZlclxuXG4gIHJldHVybiBhcnJcbn1cblxuLy8gc2xpY2Uoc3RhcnQsIGVuZClcbmZ1bmN0aW9uIGNsYW1wIChpbmRleCwgbGVuLCBkZWZhdWx0VmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBpbmRleCAhPT0gJ251bWJlcicpIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgaW5kZXggPSB+fmluZGV4OyAgLy8gQ29lcmNlIHRvIGludGVnZXIuXG4gIGlmIChpbmRleCA+PSBsZW4pIHJldHVybiBsZW5cbiAgaWYgKGluZGV4ID49IDApIHJldHVybiBpbmRleFxuICBpbmRleCArPSBsZW5cbiAgaWYgKGluZGV4ID49IDApIHJldHVybiBpbmRleFxuICByZXR1cm4gMFxufVxuXG5mdW5jdGlvbiBjb2VyY2UgKGxlbmd0aCkge1xuICAvLyBDb2VyY2UgbGVuZ3RoIHRvIGEgbnVtYmVyIChwb3NzaWJseSBOYU4pLCByb3VuZCB1cFxuICAvLyBpbiBjYXNlIGl0J3MgZnJhY3Rpb25hbCAoZS5nLiAxMjMuNDU2KSB0aGVuIGRvIGFcbiAgLy8gZG91YmxlIG5lZ2F0ZSB0byBjb2VyY2UgYSBOYU4gdG8gMC4gRWFzeSwgcmlnaHQ/XG4gIGxlbmd0aCA9IH5+TWF0aC5jZWlsKCtsZW5ndGgpXG4gIHJldHVybiBsZW5ndGggPCAwID8gMCA6IGxlbmd0aFxufVxuXG5mdW5jdGlvbiBpc0FycmF5IChzdWJqZWN0KSB7XG4gIHJldHVybiAoQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ViamVjdCkgPT09ICdbb2JqZWN0IEFycmF5XSdcbiAgfSkoc3ViamVjdClcbn1cblxuZnVuY3Rpb24gaXNBcnJheWlzaCAoc3ViamVjdCkge1xuICByZXR1cm4gaXNBcnJheShzdWJqZWN0KSB8fCBCdWZmZXIuaXNCdWZmZXIoc3ViamVjdCkgfHxcbiAgICAgIHN1YmplY3QgJiYgdHlwZW9mIHN1YmplY3QgPT09ICdvYmplY3QnICYmXG4gICAgICB0eXBlb2Ygc3ViamVjdC5sZW5ndGggPT09ICdudW1iZXInXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYiA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaWYgKGIgPD0gMHg3RilcbiAgICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpKVxuICAgIGVsc2Uge1xuICAgICAgdmFyIHN0YXJ0ID0gaVxuICAgICAgaWYgKGIgPj0gMHhEODAwICYmIGIgPD0gMHhERkZGKSBpKytcbiAgICAgIHZhciBoID0gZW5jb2RlVVJJQ29tcG9uZW50KHN0ci5zbGljZShzdGFydCwgaSsxKSkuc3Vic3RyKDEpLnNwbGl0KCclJylcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaC5sZW5ndGg7IGorKylcbiAgICAgICAgYnl0ZUFycmF5LnB1c2gocGFyc2VJbnQoaFtqXSwgMTYpKVxuICAgIH1cbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShzdHIpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICB2YXIgcG9zXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpXG4gICAgICBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIGRlY29kZVV0ZjhDaGFyIChzdHIpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cilcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoMHhGRkZEKSAvLyBVVEYgOCBpbnZhbGlkIGNoYXJcbiAgfVxufVxuXG4vKlxuICogV2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWUgaXMgYSB2YWxpZCBpbnRlZ2VyLiBUaGlzIG1lYW5zIHRoYXQgaXRcbiAqIGlzIG5vbi1uZWdhdGl2ZS4gSXQgaGFzIG5vIGZyYWN0aW9uYWwgY29tcG9uZW50IGFuZCB0aGF0IGl0IGRvZXMgbm90XG4gKiBleGNlZWQgdGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gdmVyaWZ1aW50ICh2YWx1ZSwgbWF4KSB7XG4gIGFzc2VydCh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLCAnY2Fubm90IHdyaXRlIGEgbm9uLW51bWJlciBhcyBhIG51bWJlcicpXG4gIGFzc2VydCh2YWx1ZSA+PSAwLCAnc3BlY2lmaWVkIGEgbmVnYXRpdmUgdmFsdWUgZm9yIHdyaXRpbmcgYW4gdW5zaWduZWQgdmFsdWUnKVxuICBhc3NlcnQodmFsdWUgPD0gbWF4LCAndmFsdWUgaXMgbGFyZ2VyIHRoYW4gbWF4aW11bSB2YWx1ZSBmb3IgdHlwZScpXG4gIGFzc2VydChNYXRoLmZsb29yKHZhbHVlKSA9PT0gdmFsdWUsICd2YWx1ZSBoYXMgYSBmcmFjdGlvbmFsIGNvbXBvbmVudCcpXG59XG5cbmZ1bmN0aW9uIHZlcmlmc2ludCAodmFsdWUsIG1heCwgbWluKSB7XG4gIGFzc2VydCh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLCAnY2Fubm90IHdyaXRlIGEgbm9uLW51bWJlciBhcyBhIG51bWJlcicpXG4gIGFzc2VydCh2YWx1ZSA8PSBtYXgsICd2YWx1ZSBsYXJnZXIgdGhhbiBtYXhpbXVtIGFsbG93ZWQgdmFsdWUnKVxuICBhc3NlcnQodmFsdWUgPj0gbWluLCAndmFsdWUgc21hbGxlciB0aGFuIG1pbmltdW0gYWxsb3dlZCB2YWx1ZScpXG4gIGFzc2VydChNYXRoLmZsb29yKHZhbHVlKSA9PT0gdmFsdWUsICd2YWx1ZSBoYXMgYSBmcmFjdGlvbmFsIGNvbXBvbmVudCcpXG59XG5cbmZ1bmN0aW9uIHZlcmlmSUVFRTc1NCAodmFsdWUsIG1heCwgbWluKSB7XG4gIGFzc2VydCh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLCAnY2Fubm90IHdyaXRlIGEgbm9uLW51bWJlciBhcyBhIG51bWJlcicpXG4gIGFzc2VydCh2YWx1ZSA8PSBtYXgsICd2YWx1ZSBsYXJnZXIgdGhhbiBtYXhpbXVtIGFsbG93ZWQgdmFsdWUnKVxuICBhc3NlcnQodmFsdWUgPj0gbWluLCAndmFsdWUgc21hbGxlciB0aGFuIG1pbmltdW0gYWxsb3dlZCB2YWx1ZScpXG59XG5cbmZ1bmN0aW9uIGFzc2VydCAodGVzdCwgbWVzc2FnZSkge1xuICBpZiAoIXRlc3QpIHRocm93IG5ldyBFcnJvcihtZXNzYWdlIHx8ICdGYWlsZWQgYXNzZXJ0aW9uJylcbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxuRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24obikge1xuICBpZiAoIWlzTnVtYmVyKG4pIHx8IG4gPCAwIHx8IGlzTmFOKG4pKVxuICAgIHRocm93IFR5cGVFcnJvcignbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgZXIsIGhhbmRsZXIsIGxlbiwgYXJncywgaSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50cy5lcnJvciB8fFxuICAgICAgICAoaXNPYmplY3QodGhpcy5fZXZlbnRzLmVycm9yKSAmJiAhdGhpcy5fZXZlbnRzLmVycm9yLmxlbmd0aCkpIHtcbiAgICAgIGVyID0gYXJndW1lbnRzWzFdO1xuICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgICB9XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQuJyk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNVbmRlZmluZWQoaGFuZGxlcikpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAvLyBmYXN0IGNhc2VzXG4gICAgICBjYXNlIDE6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBzbG93ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBsZW47IGkrKylcbiAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgaGFuZGxlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoaGFuZGxlcikpIHtcbiAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKVxuICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG5cbiAgICBsaXN0ZW5lcnMgPSBoYW5kbGVyLnNsaWNlKCk7XG4gICAgbGVuID0gbGlzdGVuZXJzLmxlbmd0aDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkodGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICBpZiAodGhpcy5fZXZlbnRzLm5ld0xpc3RlbmVyKVxuICAgIHRoaXMuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICBpc0Z1bmN0aW9uKGxpc3RlbmVyLmxpc3RlbmVyKSA/XG4gICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICBlbHNlIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2VcbiAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBbdGhpcy5fZXZlbnRzW3R5cGVdLCBsaXN0ZW5lcl07XG5cbiAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkgJiYgIXRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQpIHtcbiAgICB2YXIgbTtcbiAgICBpZiAoIWlzVW5kZWZpbmVkKHRoaXMuX21heExpc3RlbmVycykpIHtcbiAgICAgIG0gPSB0aGlzLl9tYXhMaXN0ZW5lcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgICB9XG5cbiAgICBpZiAobSAmJiBtID4gMCAmJiB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoID4gbSkge1xuICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKCcobm9kZSkgd2FybmluZzogcG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2xlYWsgZGV0ZWN0ZWQuICVkIGxpc3RlbmVycyBhZGRlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC4nLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoKTtcbiAgICAgIGlmICh0eXBlb2YgY29uc29sZS50cmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIGluIElFIDEwXG4gICAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgdmFyIGZpcmVkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZygpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGcpO1xuXG4gICAgaWYgKCFmaXJlZCkge1xuICAgICAgZmlyZWQgPSB0cnVlO1xuICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICBnLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHRoaXMub24odHlwZSwgZyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBlbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWZmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZFxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBsaXN0LCBwb3NpdGlvbiwgbGVuZ3RoLCBpO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIGxpc3QgPSB0aGlzLl9ldmVudHNbdHlwZV07XG4gIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICBwb3NpdGlvbiA9IC0xO1xuXG4gIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fFxuICAgICAgKGlzRnVuY3Rpb24obGlzdC5saXN0ZW5lcikgJiYgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcblxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGxpc3QpKSB7XG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gPiAwOykge1xuICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8XG4gICAgICAgICAgKGxpc3RbaV0ubGlzdGVuZXIgJiYgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICBsaXN0Lmxlbmd0aCA9IDA7XG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0LnNwbGljZShwb3NpdGlvbiwgMSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIga2V5LCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICBpZiAoIXRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcikge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgZWxzZSBpZiAodGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGZvciAoa2V5IGluIHRoaXMuX2V2ZW50cykge1xuICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNGdW5jdGlvbihsaXN0ZW5lcnMpKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICB9IGVsc2Uge1xuICAgIC8vIExJRk8gb3JkZXJcbiAgICB3aGlsZSAobGlzdGVuZXJzLmxlbmd0aClcbiAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2xpc3RlbmVycy5sZW5ndGggLSAxXSk7XG4gIH1cbiAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgcmV0O1xuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldCA9IFtdO1xuICBlbHNlIGlmIChpc0Z1bmN0aW9uKHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgcmV0ID0gW3RoaXMuX2V2ZW50c1t0eXBlXV07XG4gIGVsc2VcbiAgICByZXQgPSB0aGlzLl9ldmVudHNbdHlwZV0uc2xpY2UoKTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICB2YXIgcmV0O1xuICBpZiAoIWVtaXR0ZXIuX2V2ZW50cyB8fCAhZW1pdHRlci5fZXZlbnRzW3R5cGVdKVxuICAgIHJldCA9IDA7XG4gIGVsc2UgaWYgKGlzRnVuY3Rpb24oZW1pdHRlci5fZXZlbnRzW3R5cGVdKSlcbiAgICByZXQgPSAxO1xuICBlbHNlXG4gICAgcmV0ID0gZW1pdHRlci5fZXZlbnRzW3R5cGVdLmxlbmd0aDtcbiAgcmV0dXJuIHJldDtcbn07XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbiIsImV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gKGUgKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gKG0gKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAoKHZhbHVlICogYykgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4vLyAuZGlybmFtZSwgLmJhc2VuYW1lLCBhbmQgLmV4dG5hbWUgbWV0aG9kcyBhcmUgZXh0cmFjdGVkIGZyb20gTm9kZS5qcyB2OC4xMS4xLFxuLy8gYmFja3BvcnRlZCBhbmQgdHJhbnNwbGl0ZWQgd2l0aCBCYWJlbCwgd2l0aCBiYWNrd2FyZHMtY29tcGF0IGZpeGVzXG5cbi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyByZXNvbHZlcyAuIGFuZCAuLiBlbGVtZW50cyBpbiBhIHBhdGggYXJyYXkgd2l0aCBkaXJlY3RvcnkgbmFtZXMgdGhlcmVcbi8vIG11c3QgYmUgbm8gc2xhc2hlcywgZW1wdHkgZWxlbWVudHMsIG9yIGRldmljZSBuYW1lcyAoYzpcXCkgaW4gdGhlIGFycmF5XG4vLyAoc28gYWxzbyBubyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzIC0gaXQgZG9lcyBub3QgZGlzdGluZ3Vpc2hcbi8vIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZSBwYXRocylcbmZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5KHBhcnRzLCBhbGxvd0Fib3ZlUm9vdCkge1xuICAvLyBpZiB0aGUgcGF0aCB0cmllcyB0byBnbyBhYm92ZSB0aGUgcm9vdCwgYHVwYCBlbmRzIHVwID4gMFxuICB2YXIgdXAgPSAwO1xuICBmb3IgKHZhciBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgbGFzdCA9IHBhcnRzW2ldO1xuICAgIGlmIChsYXN0ID09PSAnLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCkge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXAtLTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgcGF0aCBpcyBhbGxvd2VkIHRvIGdvIGFib3ZlIHRoZSByb290LCByZXN0b3JlIGxlYWRpbmcgLi5zXG4gIGlmIChhbGxvd0Fib3ZlUm9vdCkge1xuICAgIGZvciAoOyB1cC0tOyB1cCkge1xuICAgICAgcGFydHMudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFydHM7XG59XG5cbi8vIHBhdGgucmVzb2x2ZShbZnJvbSAuLi5dLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzb2x2ZWRQYXRoID0gJycsXG4gICAgICByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHtcbiAgICB2YXIgcGF0aCA9IChpID49IDApID8gYXJndW1lbnRzW2ldIDogcHJvY2Vzcy5jd2QoKTtcblxuICAgIC8vIFNraXAgZW1wdHkgYW5kIGludmFsaWQgZW50cmllc1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfSBlbHNlIGlmICghcGF0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmVzb2x2ZWRQYXRoID0gcGF0aCArICcvJyArIHJlc29sdmVkUGF0aDtcbiAgICByZXNvbHZlZEFic29sdXRlID0gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbiAgfVxuXG4gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLCBidXRcbiAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpXG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihyZXNvbHZlZFBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhcmVzb2x2ZWRBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIHJldHVybiAoKHJlc29sdmVkQWJzb2x1dGUgPyAnLycgOiAnJykgKyByZXNvbHZlZFBhdGgpIHx8ICcuJztcbn07XG5cbi8vIHBhdGgubm9ybWFsaXplKHBhdGgpXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIGlzQWJzb2x1dGUgPSBleHBvcnRzLmlzQWJzb2x1dGUocGF0aCksXG4gICAgICB0cmFpbGluZ1NsYXNoID0gc3Vic3RyKHBhdGgsIC0xKSA9PT0gJy8nO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICBwYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhaXNBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIGlmICghcGF0aCAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHBhdGggPSAnLic7XG4gIH1cbiAgaWYgKHBhdGggJiYgdHJhaWxpbmdTbGFzaCkge1xuICAgIHBhdGggKz0gJy8nO1xuICB9XG5cbiAgcmV0dXJuIChpc0Fic29sdXRlID8gJy8nIDogJycpICsgcGF0aDtcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLyc7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmpvaW4gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHBhdGhzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgcmV0dXJuIGV4cG9ydHMubm9ybWFsaXplKGZpbHRlcihwYXRocywgZnVuY3Rpb24ocCwgaW5kZXgpIHtcbiAgICBpZiAodHlwZW9mIHAgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5qb2luIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfSkuam9pbignLycpKTtcbn07XG5cblxuLy8gcGF0aC5yZWxhdGl2ZShmcm9tLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVsYXRpdmUgPSBmdW5jdGlvbihmcm9tLCB0bykge1xuICBmcm9tID0gZXhwb3J0cy5yZXNvbHZlKGZyb20pLnN1YnN0cigxKTtcbiAgdG8gPSBleHBvcnRzLnJlc29sdmUodG8pLnN1YnN0cigxKTtcblxuICBmdW5jdGlvbiB0cmltKGFycikge1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgZm9yICg7IHN0YXJ0IDwgYXJyLmxlbmd0aDsgc3RhcnQrKykge1xuICAgICAgaWYgKGFycltzdGFydF0gIT09ICcnKSBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZW5kID0gYXJyLmxlbmd0aCAtIDE7XG4gICAgZm9yICg7IGVuZCA+PSAwOyBlbmQtLSkge1xuICAgICAgaWYgKGFycltlbmRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGFyci5zbGljZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTtcbiAgfVxuXG4gIHZhciBmcm9tUGFydHMgPSB0cmltKGZyb20uc3BsaXQoJy8nKSk7XG4gIHZhciB0b1BhcnRzID0gdHJpbSh0by5zcGxpdCgnLycpKTtcblxuICB2YXIgbGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCwgdG9QYXJ0cy5sZW5ndGgpO1xuICB2YXIgc2FtZVBhcnRzTGVuZ3RoID0gbGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZyb21QYXJ0c1tpXSAhPT0gdG9QYXJ0c1tpXSkge1xuICAgICAgc2FtZVBhcnRzTGVuZ3RoID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBvdXRwdXRQYXJ0cyA9IFtdO1xuICBmb3IgKHZhciBpID0gc2FtZVBhcnRzTGVuZ3RoOyBpIDwgZnJvbVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0UGFydHMucHVzaCgnLi4nKTtcbiAgfVxuXG4gIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7XG5cbiAgcmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJy8nKTtcbn07XG5cbmV4cG9ydHMuc2VwID0gJy8nO1xuZXhwb3J0cy5kZWxpbWl0ZXIgPSAnOic7XG5cbmV4cG9ydHMuZGlybmFtZSA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHBhdGggPSBwYXRoICsgJyc7XG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcuJztcbiAgdmFyIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoMCk7XG4gIHZhciBoYXNSb290ID0gY29kZSA9PT0gNDcgLyovKi87XG4gIHZhciBlbmQgPSAtMTtcbiAgdmFyIG1hdGNoZWRTbGFzaCA9IHRydWU7XG4gIGZvciAodmFyIGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gMTsgLS1pKSB7XG4gICAgY29kZSA9IHBhdGguY2hhckNvZGVBdChpKTtcbiAgICBpZiAoY29kZSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHtcbiAgICAgICAgICBlbmQgPSBpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3JcbiAgICAgIG1hdGNoZWRTbGFzaCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChlbmQgPT09IC0xKSByZXR1cm4gaGFzUm9vdCA/ICcvJyA6ICcuJztcbiAgaWYgKGhhc1Jvb3QgJiYgZW5kID09PSAxKSB7XG4gICAgLy8gcmV0dXJuICcvLyc7XG4gICAgLy8gQmFja3dhcmRzLWNvbXBhdCBmaXg6XG4gICAgcmV0dXJuICcvJztcbiAgfVxuICByZXR1cm4gcGF0aC5zbGljZSgwLCBlbmQpO1xufTtcblxuZnVuY3Rpb24gYmFzZW5hbWUocGF0aCkge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSBwYXRoID0gcGF0aCArICcnO1xuXG4gIHZhciBzdGFydCA9IDA7XG4gIHZhciBlbmQgPSAtMTtcbiAgdmFyIG1hdGNoZWRTbGFzaCA9IHRydWU7XG4gIHZhciBpO1xuXG4gIGZvciAoaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICBpZiAocGF0aC5jaGFyQ29kZUF0KGkpID09PSA0NyAvKi8qLykge1xuICAgICAgICAvLyBJZiB3ZSByZWFjaGVkIGEgcGF0aCBzZXBhcmF0b3IgdGhhdCB3YXMgbm90IHBhcnQgb2YgYSBzZXQgb2YgcGF0aFxuICAgICAgICAvLyBzZXBhcmF0b3JzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgc3RvcCBub3dcbiAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHtcbiAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yLCBtYXJrIHRoaXMgYXMgdGhlIGVuZCBvZiBvdXJcbiAgICAgIC8vIHBhdGggY29tcG9uZW50XG4gICAgICBtYXRjaGVkU2xhc2ggPSBmYWxzZTtcbiAgICAgIGVuZCA9IGkgKyAxO1xuICAgIH1cbiAgfVxuXG4gIGlmIChlbmQgPT09IC0xKSByZXR1cm4gJyc7XG4gIHJldHVybiBwYXRoLnNsaWNlKHN0YXJ0LCBlbmQpO1xufVxuXG4vLyBVc2VzIGEgbWl4ZWQgYXBwcm9hY2ggZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LCBhcyBleHQgYmVoYXZpb3IgY2hhbmdlZFxuLy8gaW4gbmV3IE5vZGUuanMgdmVyc2lvbnMsIHNvIG9ubHkgYmFzZW5hbWUoKSBhYm92ZSBpcyBiYWNrcG9ydGVkIGhlcmVcbmV4cG9ydHMuYmFzZW5hbWUgPSBmdW5jdGlvbiAocGF0aCwgZXh0KSB7XG4gIHZhciBmID0gYmFzZW5hbWUocGF0aCk7XG4gIGlmIChleHQgJiYgZi5zdWJzdHIoLTEgKiBleHQubGVuZ3RoKSA9PT0gZXh0KSB7XG4gICAgZiA9IGYuc3Vic3RyKDAsIGYubGVuZ3RoIC0gZXh0Lmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIGY7XG59O1xuXG5leHBvcnRzLmV4dG5hbWUgPSBmdW5jdGlvbiAocGF0aCkge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSBwYXRoID0gcGF0aCArICcnO1xuICB2YXIgc3RhcnREb3QgPSAtMTtcbiAgdmFyIHN0YXJ0UGFydCA9IDA7XG4gIHZhciBlbmQgPSAtMTtcbiAgdmFyIG1hdGNoZWRTbGFzaCA9IHRydWU7XG4gIC8vIFRyYWNrIHRoZSBzdGF0ZSBvZiBjaGFyYWN0ZXJzIChpZiBhbnkpIHdlIHNlZSBiZWZvcmUgb3VyIGZpcnN0IGRvdCBhbmRcbiAgLy8gYWZ0ZXIgYW55IHBhdGggc2VwYXJhdG9yIHdlIGZpbmRcbiAgdmFyIHByZURvdFN0YXRlID0gMDtcbiAgZm9yICh2YXIgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICB2YXIgY29kZSA9IHBhdGguY2hhckNvZGVBdChpKTtcbiAgICBpZiAoY29kZSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIHBhdGggc2VwYXJhdG9yIHRoYXQgd2FzIG5vdCBwYXJ0IG9mIGEgc2V0IG9mIHBhdGhcbiAgICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93XG4gICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7XG4gICAgICAgICAgc3RhcnRQYXJ0ID0gaSArIDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yLCBtYXJrIHRoaXMgYXMgdGhlIGVuZCBvZiBvdXJcbiAgICAgIC8vIGV4dGVuc2lvblxuICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7XG4gICAgICBlbmQgPSBpICsgMTtcbiAgICB9XG4gICAgaWYgKGNvZGUgPT09IDQ2IC8qLiovKSB7XG4gICAgICAgIC8vIElmIHRoaXMgaXMgb3VyIGZpcnN0IGRvdCwgbWFyayBpdCBhcyB0aGUgc3RhcnQgb2Ygb3VyIGV4dGVuc2lvblxuICAgICAgICBpZiAoc3RhcnREb3QgPT09IC0xKVxuICAgICAgICAgIHN0YXJ0RG90ID0gaTtcbiAgICAgICAgZWxzZSBpZiAocHJlRG90U3RhdGUgIT09IDEpXG4gICAgICAgICAgcHJlRG90U3RhdGUgPSAxO1xuICAgIH0gZWxzZSBpZiAoc3RhcnREb3QgIT09IC0xKSB7XG4gICAgICAvLyBXZSBzYXcgYSBub24tZG90IGFuZCBub24tcGF0aCBzZXBhcmF0b3IgYmVmb3JlIG91ciBkb3QsIHNvIHdlIHNob3VsZFxuICAgICAgLy8gaGF2ZSBhIGdvb2QgY2hhbmNlIGF0IGhhdmluZyBhIG5vbi1lbXB0eSBleHRlbnNpb25cbiAgICAgIHByZURvdFN0YXRlID0gLTE7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXJ0RG90ID09PSAtMSB8fCBlbmQgPT09IC0xIHx8XG4gICAgICAvLyBXZSBzYXcgYSBub24tZG90IGNoYXJhY3RlciBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGRvdFxuICAgICAgcHJlRG90U3RhdGUgPT09IDAgfHxcbiAgICAgIC8vIFRoZSAocmlnaHQtbW9zdCkgdHJpbW1lZCBwYXRoIGNvbXBvbmVudCBpcyBleGFjdGx5ICcuLidcbiAgICAgIHByZURvdFN0YXRlID09PSAxICYmIHN0YXJ0RG90ID09PSBlbmQgLSAxICYmIHN0YXJ0RG90ID09PSBzdGFydFBhcnQgKyAxKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIHJldHVybiBwYXRoLnNsaWNlKHN0YXJ0RG90LCBlbmQpO1xufTtcblxuZnVuY3Rpb24gZmlsdGVyICh4cywgZikge1xuICAgIGlmICh4cy5maWx0ZXIpIHJldHVybiB4cy5maWx0ZXIoZik7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGYoeHNbaV0sIGksIHhzKSkgcmVzLnB1c2goeHNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuXG4vLyBTdHJpbmcucHJvdG90eXBlLnN1YnN0ciAtIG5lZ2F0aXZlIGluZGV4IGRvbid0IHdvcmsgaW4gSUU4XG52YXIgc3Vic3RyID0gJ2FiJy5zdWJzdHIoLTEpID09PSAnYidcbiAgICA/IGZ1bmN0aW9uIChzdHIsIHN0YXJ0LCBsZW4pIHsgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbikgfVxuICAgIDogZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikge1xuICAgICAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IHN0ci5sZW5ndGggKyBzdGFydDtcbiAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbik7XG4gICAgfVxuO1xuXG59KS5jYWxsKHRoaXMscmVxdWlyZShcIktsaXViSFwiKSkiLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcblxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG5wcm9jZXNzLm5leHRUaWNrID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2FuU2V0SW1tZWRpYXRlID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCdcbiAgICAmJiB3aW5kb3cuc2V0SW1tZWRpYXRlO1xuICAgIHZhciBjYW5Qb3N0ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCdcbiAgICAmJiB3aW5kb3cucG9zdE1lc3NhZ2UgJiYgd2luZG93LmFkZEV2ZW50TGlzdGVuZXJcbiAgICA7XG5cbiAgICBpZiAoY2FuU2V0SW1tZWRpYXRlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZikgeyByZXR1cm4gd2luZG93LnNldEltbWVkaWF0ZShmKSB9O1xuICAgIH1cblxuICAgIGlmIChjYW5Qb3N0KSB7XG4gICAgICAgIHZhciBxdWV1ZSA9IFtdO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGV2LnNvdXJjZTtcbiAgICAgICAgICAgIGlmICgoc291cmNlID09PSB3aW5kb3cgfHwgc291cmNlID09PSBudWxsKSAmJiBldi5kYXRhID09PSAncHJvY2Vzcy10aWNrJykge1xuICAgICAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGZuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0cnVlKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2goZm4pO1xuICAgICAgICAgICAgd2luZG93LnBvc3RNZXNzYWdlKCdwcm9jZXNzLXRpY2snLCAnKicpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0VGljayhmbikge1xuICAgICAgICBzZXRUaW1lb3V0KGZuLCAwKTtcbiAgICB9O1xufSkoKTtcblxucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59XG5cbi8vIFRPRE8oc2h0eWxtYW4pXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UsIHRoaXMgY2xhc3Ncbi8vIHByb3RvdHlwYWxseSBpbmhlcml0cyBmcm9tIFJlYWRhYmxlLCBhbmQgdGhlbiBwYXJhc2l0aWNhbGx5IGZyb21cbi8vIFdyaXRhYmxlLlxuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG52YXIgc2V0SW1tZWRpYXRlID0gcmVxdWlyZSgncHJvY2Vzcy9icm93c2VyLmpzJykubmV4dFRpY2s7XG52YXIgUmVhZGFibGUgPSByZXF1aXJlKCcuL3JlYWRhYmxlLmpzJyk7XG52YXIgV3JpdGFibGUgPSByZXF1aXJlKCcuL3dyaXRhYmxlLmpzJyk7XG5cbmluaGVyaXRzKER1cGxleCwgUmVhZGFibGUpO1xuXG5EdXBsZXgucHJvdG90eXBlLndyaXRlID0gV3JpdGFibGUucHJvdG90eXBlLndyaXRlO1xuRHVwbGV4LnByb3RvdHlwZS5lbmQgPSBXcml0YWJsZS5wcm90b3R5cGUuZW5kO1xuRHVwbGV4LnByb3RvdHlwZS5fd3JpdGUgPSBXcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlO1xuXG5mdW5jdGlvbiBEdXBsZXgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSlcbiAgICByZXR1cm4gbmV3IER1cGxleChvcHRpb25zKTtcblxuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmVhZGFibGUgPT09IGZhbHNlKVxuICAgIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLndyaXRhYmxlID09PSBmYWxzZSlcbiAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG5cbiAgdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSlcbiAgICB0aGlzLmFsbG93SGFsZk9wZW4gPSBmYWxzZTtcblxuICB0aGlzLm9uY2UoJ2VuZCcsIG9uZW5kKTtcbn1cblxuLy8gdGhlIG5vLWhhbGYtb3BlbiBlbmZvcmNlclxuZnVuY3Rpb24gb25lbmQoKSB7XG4gIC8vIGlmIHdlIGFsbG93IGhhbGYtb3BlbiBzdGF0ZSwgb3IgaWYgdGhlIHdyaXRhYmxlIHNpZGUgZW5kZWQsXG4gIC8vIHRoZW4gd2UncmUgb2suXG4gIGlmICh0aGlzLmFsbG93SGFsZk9wZW4gfHwgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZClcbiAgICByZXR1cm47XG5cbiAgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgIHNlbGYuZW5kKCk7XG4gIH0pO1xufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbm1vZHVsZS5leHBvcnRzID0gU3RyZWFtO1xuXG52YXIgRUUgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5pbmhlcml0cyhTdHJlYW0sIEVFKTtcblN0cmVhbS5SZWFkYWJsZSA9IHJlcXVpcmUoJy4vcmVhZGFibGUuanMnKTtcblN0cmVhbS5Xcml0YWJsZSA9IHJlcXVpcmUoJy4vd3JpdGFibGUuanMnKTtcblN0cmVhbS5EdXBsZXggPSByZXF1aXJlKCcuL2R1cGxleC5qcycpO1xuU3RyZWFtLlRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vdHJhbnNmb3JtLmpzJyk7XG5TdHJlYW0uUGFzc1Rocm91Z2ggPSByZXF1aXJlKCcuL3Bhc3N0aHJvdWdoLmpzJyk7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuNC54XG5TdHJlYW0uU3RyZWFtID0gU3RyZWFtO1xuXG5cblxuLy8gb2xkLXN0eWxlIHN0cmVhbXMuICBOb3RlIHRoYXQgdGhlIHBpcGUgbWV0aG9kICh0aGUgb25seSByZWxldmFudFxuLy8gcGFydCBvZiB0aGlzIGNsYXNzKSBpcyBvdmVycmlkZGVuIGluIHRoZSBSZWFkYWJsZSBjbGFzcy5cblxuZnVuY3Rpb24gU3RyZWFtKCkge1xuICBFRS5jYWxsKHRoaXMpO1xufVxuXG5TdHJlYW0ucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbihkZXN0LCBvcHRpb25zKSB7XG4gIHZhciBzb3VyY2UgPSB0aGlzO1xuXG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGlmIChkZXN0LndyaXRhYmxlKSB7XG4gICAgICBpZiAoZmFsc2UgPT09IGRlc3Qud3JpdGUoY2h1bmspICYmIHNvdXJjZS5wYXVzZSkge1xuICAgICAgICBzb3VyY2UucGF1c2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzb3VyY2Uub24oJ2RhdGEnLCBvbmRhdGEpO1xuXG4gIGZ1bmN0aW9uIG9uZHJhaW4oKSB7XG4gICAgaWYgKHNvdXJjZS5yZWFkYWJsZSAmJiBzb3VyY2UucmVzdW1lKSB7XG4gICAgICBzb3VyY2UucmVzdW1lKCk7XG4gICAgfVxuICB9XG5cbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICAvLyBJZiB0aGUgJ2VuZCcgb3B0aW9uIGlzIG5vdCBzdXBwbGllZCwgZGVzdC5lbmQoKSB3aWxsIGJlIGNhbGxlZCB3aGVuXG4gIC8vIHNvdXJjZSBnZXRzIHRoZSAnZW5kJyBvciAnY2xvc2UnIGV2ZW50cy4gIE9ubHkgZGVzdC5lbmQoKSBvbmNlLlxuICBpZiAoIWRlc3QuX2lzU3RkaW8gJiYgKCFvcHRpb25zIHx8IG9wdGlvbnMuZW5kICE9PSBmYWxzZSkpIHtcbiAgICBzb3VyY2Uub24oJ2VuZCcsIG9uZW5kKTtcbiAgICBzb3VyY2Uub24oJ2Nsb3NlJywgb25jbG9zZSk7XG4gIH1cblxuICB2YXIgZGlkT25FbmQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm47XG4gICAgZGlkT25FbmQgPSB0cnVlO1xuXG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBpZiAoZGlkT25FbmQpIHJldHVybjtcbiAgICBkaWRPbkVuZCA9IHRydWU7XG5cbiAgICBpZiAodHlwZW9mIGRlc3QuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgZGVzdC5kZXN0cm95KCk7XG4gIH1cblxuICAvLyBkb24ndCBsZWF2ZSBkYW5nbGluZyBwaXBlcyB3aGVuIHRoZXJlIGFyZSBlcnJvcnMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBjbGVhbnVwKCk7XG4gICAgaWYgKEVFLmxpc3RlbmVyQ291bnQodGhpcywgJ2Vycm9yJykgPT09IDApIHtcbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgc3RyZWFtIGVycm9yIGluIHBpcGUuXG4gICAgfVxuICB9XG5cbiAgc291cmNlLm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuICBkZXN0Lm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIHJlbW92ZSBhbGwgdGhlIGV2ZW50IGxpc3RlbmVycyB0aGF0IHdlcmUgYWRkZWQuXG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG5cbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBjbGVhbnVwKTtcblxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgY2xlYW51cCk7XG4gIH1cblxuICBzb3VyY2Uub24oJ2VuZCcsIGNsZWFudXApO1xuICBzb3VyY2Uub24oJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgZGVzdC5vbignY2xvc2UnLCBjbGVhbnVwKTtcblxuICBkZXN0LmVtaXQoJ3BpcGUnLCBzb3VyY2UpO1xuXG4gIC8vIEFsbG93IGZvciB1bml4LWxpa2UgdXNhZ2U6IEEucGlwZShCKS5waXBlKEMpXG4gIHJldHVybiBkZXN0O1xufTtcbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbnByb2Nlc3MubmV4dFRpY2sgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjYW5TZXRJbW1lZGlhdGUgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICYmIHdpbmRvdy5zZXRJbW1lZGlhdGU7XG4gICAgdmFyIGNhblBvc3QgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICYmIHdpbmRvdy5wb3N0TWVzc2FnZSAmJiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lclxuICAgIDtcblxuICAgIGlmIChjYW5TZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChmKSB7IHJldHVybiB3aW5kb3cuc2V0SW1tZWRpYXRlKGYpIH07XG4gICAgfVxuXG4gICAgaWYgKGNhblBvc3QpIHtcbiAgICAgICAgdmFyIHF1ZXVlID0gW107XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgc291cmNlID0gZXYuc291cmNlO1xuICAgICAgICAgICAgaWYgKChzb3VyY2UgPT09IHdpbmRvdyB8fCBzb3VyY2UgPT09IG51bGwpICYmIGV2LmRhdGEgPT09ICdwcm9jZXNzLXRpY2snKSB7XG4gICAgICAgICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZuID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBuZXh0VGljayhmbikge1xuICAgICAgICAgICAgcXVldWUucHVzaChmbik7XG4gICAgICAgICAgICB3aW5kb3cucG9zdE1lc3NhZ2UoJ3Byb2Nlc3MtdGljaycsICcqJyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHRUaWNrKGZuKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZm4sIDApO1xuICAgIH07XG59KSgpO1xuXG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59XG5cbi8vIFRPRE8oc2h0eWxtYW4pXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIHBhc3N0aHJvdWdoIHN0cmVhbS5cbi8vIGJhc2ljYWxseSBqdXN0IHRoZSBtb3N0IG1pbmltYWwgc29ydCBvZiBUcmFuc2Zvcm0gc3RyZWFtLlxuLy8gRXZlcnkgd3JpdHRlbiBjaHVuayBnZXRzIG91dHB1dCBhcy1pcy5cblxubW9kdWxlLmV4cG9ydHMgPSBQYXNzVGhyb3VnaDtcblxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vdHJhbnNmb3JtLmpzJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuaW5oZXJpdHMoUGFzc1Rocm91Z2gsIFRyYW5zZm9ybSk7XG5cbmZ1bmN0aW9uIFBhc3NUaHJvdWdoKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhc3NUaHJvdWdoKSlcbiAgICByZXR1cm4gbmV3IFBhc3NUaHJvdWdoKG9wdGlvbnMpO1xuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5QYXNzVGhyb3VnaC5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspO1xufTtcbiIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4vLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFkYWJsZTtcblJlYWRhYmxlLlJlYWRhYmxlU3RhdGUgPSBSZWFkYWJsZVN0YXRlO1xuXG52YXIgRUUgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi9pbmRleC5qcycpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbnZhciBzZXRJbW1lZGlhdGUgPSByZXF1aXJlKCdwcm9jZXNzL2Jyb3dzZXIuanMnKS5uZXh0VGljaztcbnZhciBTdHJpbmdEZWNvZGVyO1xuXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuaW5oZXJpdHMoUmVhZGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCBpdCBzdG9wcyBjYWxsaW5nIF9yZWFkKCkgdG8gZmlsbCB0aGUgYnVmZmVyXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgXCJkb24ndCBjYWxsIF9yZWFkIHByZWVtcHRpdmVseSBldmVyXCJcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gKGh3bSB8fCBod20gPT09IDApID8gaHdtIDogMTYgKiAxMDI0O1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfn50aGlzLmhpZ2hXYXRlck1hcms7XG5cbiAgdGhpcy5idWZmZXIgPSBbXTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgdGhpcy5waXBlc0NvdW50ID0gMDtcbiAgdGhpcy5mbG93aW5nID0gZmFsc2U7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuXG4gIC8vIEluIHN0cmVhbXMgdGhhdCBuZXZlciBoYXZlIGFueSBkYXRhLCBhbmQgZG8gcHVzaChudWxsKSByaWdodCBhd2F5LFxuICAvLyB0aGUgY29uc3VtZXIgY2FuIG1pc3MgdGhlICdlbmQnIGV2ZW50IGlmIHRoZXkgZG8gc29tZSBJL08gYmVmb3JlXG4gIC8vIGNvbnN1bWluZyB0aGUgc3RyZWFtLiAgU28sIHdlIGRvbid0IGVtaXQoJ2VuZCcpIHVudGlsIHNvbWUgcmVhZGluZ1xuICAvLyBoYXBwZW5zLlxuICB0aGlzLmNhbGxlZFJlYWQgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjdWFzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyB3aGVuZXZlciB3ZSByZXR1cm4gbnVsbCwgdGhlbiB3ZSBzZXQgYSBmbGFnIHRvIHNheVxuICAvLyB0aGF0IHdlJ3JlIGF3YWl0aW5nIGEgJ3JlYWRhYmxlJyBldmVudCBlbWlzc2lvbi5cbiAgdGhpcy5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5yZWFkYWJsZUxpc3RlbmluZyA9IGZhbHNlO1xuXG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnLiBVc2VkIHRvIG1ha2UgcmVhZChuKSBpZ25vcmUgbiBhbmQgdG9cbiAgLy8gbWFrZSBhbGwgdGhlIGJ1ZmZlciBtZXJnaW5nIGFuZCBsZW5ndGggY2hlY2tzIGdvIGF3YXlcbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gd2hlbiBwaXBpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCAncmVhZGFibGUnIGV2ZW50cyB0aGF0IGhhcHBlblxuICAvLyBhZnRlciByZWFkKClpbmcgYWxsIHRoZSBieXRlcyBhbmQgbm90IGdldHRpbmcgYW55IHB1c2hiYWNrLlxuICB0aGlzLnJhbk91dCA9IGZhbHNlO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG5cbiAgdGhpcy5kZWNvZGVyID0gbnVsbDtcbiAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgaWYgKCFTdHJpbmdEZWNvZGVyKVxuICAgICAgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyJykuU3RyaW5nRGVjb2RlcjtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKTtcbiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBSZWFkYWJsZShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpXG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKTtcblxuICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbmV3IFJlYWRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgaWYgKGVuY29kaW5nICE9PSBzdGF0ZS5lbmNvZGluZykge1xuICAgICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gICAgICBlbmNvZGluZyA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGZhbHNlKTtcbn07XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpXG5SZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uKGNodW5rKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgJycsIHRydWUpO1xufTtcblxuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgdmFyIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIGlmIChjaHVuayA9PT0gbnVsbCB8fCBjaHVuayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIGlmICghc3RhdGUuZW5kZWQpXG4gICAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2UgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkge1xuICAgIGlmIChzdGF0ZS5lbmRlZCAmJiAhYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZEVtaXR0ZWQgJiYgYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Jyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIWFkZFRvRnJvbnQgJiYgIWVuY29kaW5nKVxuICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgICAgaWYgKGFkZFRvRnJvbnQpIHtcbiAgICAgICAgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpXG4gICAgICAgIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuXG4gICAgICBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghYWRkVG9Gcm9udCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBuZWVkTW9yZURhdGEoc3RhdGUpO1xufVxuXG5cblxuLy8gaWYgaXQncyBwYXN0IHRoZSBoaWdoIHdhdGVyIG1hcmssIHdlIGNhbiBwdXNoIGluIHNvbWUgbW9yZS5cbi8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lXG4vLyBtb3JlIGJ5dGVzLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCxcbi8vIHN1Y2ggYXMgdGhlIHJlcGwuICBBbHNvLCBpZiB0aGUgcHVzaCgpIHRyaWdnZXJlZCBhXG4vLyByZWFkYWJsZSBldmVudCwgYW5kIHRoZSB1c2VyIGNhbGxlZCByZWFkKGxhcmdlTnVtYmVyKSBzdWNoIHRoYXRcbi8vIG5lZWRSZWFkYWJsZSB3YXMgc2V0LCB0aGVuIHdlIG91Z2h0IHRvIHB1c2ggbW9yZSwgc28gdGhhdCBhbm90aGVyXG4vLyAncmVhZGFibGUnIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKSB7XG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiZcbiAgICAgICAgIChzdGF0ZS5uZWVkUmVhZGFibGUgfHxcbiAgICAgICAgICBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8XG4gICAgICAgICAgc3RhdGUubGVuZ3RoID09PSAwKTtcbn1cblxuLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG5SZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBmdW5jdGlvbihlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKVxuICAgIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2RlcicpLlN0cmluZ0RlY29kZXI7XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKGVuYyk7XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2RpbmcgPSBlbmM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gMTI4TUJcbnZhciBNQVhfSFdNID0gMHg4MDAwMDA7XG5mdW5jdGlvbiByb3VuZFVwVG9OZXh0UG93ZXJPZjIobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMlxuICAgIG4tLTtcbiAgICBmb3IgKHZhciBwID0gMTsgcCA8IDMyOyBwIDw8PSAxKSBuIHw9IG4gPj4gcDtcbiAgICBuKys7XG4gIH1cbiAgcmV0dXJuIG47XG59XG5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZClcbiAgICByZXR1cm4gMDtcblxuICBpZiAoc3RhdGUub2JqZWN0TW9kZSlcbiAgICByZXR1cm4gbiA9PT0gMCA/IDAgOiAxO1xuXG4gIGlmIChpc05hTihuKSB8fCBuID09PSBudWxsKSB7XG4gICAgLy8gb25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUuYnVmZmVyLmxlbmd0aClcbiAgICAgIHJldHVybiBzdGF0ZS5idWZmZXJbMF0ubGVuZ3RoO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH1cblxuICBpZiAobiA8PSAwKVxuICAgIHJldHVybiAwO1xuXG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSB0YXJnZXQgYnVmZmVyIGxldmVsLFxuICAvLyB0aGVuIHJhaXNlIHRoZSB3YXRlciBtYXJrLiAgQnVtcCB1cCB0byB0aGUgbmV4dCBoaWdoZXN0XG4gIC8vIHBvd2VyIG9mIDIsIHRvIHByZXZlbnQgaW5jcmVhc2luZyBpdCBleGNlc3NpdmVseSBpbiB0aW55XG4gIC8vIGFtb3VudHMuXG4gIGlmIChuID4gc3RhdGUuaGlnaFdhdGVyTWFyaylcbiAgICBzdGF0ZS5oaWdoV2F0ZXJNYXJrID0gcm91bmRVcFRvTmV4dFBvd2VyT2YyKG4pO1xuXG4gIC8vIGRvbid0IGhhdmUgdGhhdCBtdWNoLiAgcmV0dXJuIG51bGwsIHVubGVzcyB3ZSd2ZSBlbmRlZC5cbiAgaWYgKG4gPiBzdGF0ZS5sZW5ndGgpIHtcbiAgICBpZiAoIXN0YXRlLmVuZGVkKSB7XG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlXG4gICAgICByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIG47XG59XG5cbi8vIHlvdSBjYW4gb3ZlcnJpZGUgZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYXN5bmMgX3JlYWQobikgYmVsb3cuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKG4pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUuY2FsbGVkUmVhZCA9IHRydWU7XG4gIHZhciBuT3JpZyA9IG47XG5cbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuID4gMClcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcblxuICAvLyBpZiB3ZSdyZSBkb2luZyByZWFkKDApIHRvIHRyaWdnZXIgYSByZWFkYWJsZSBldmVudCwgYnV0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhIGJ1bmNoIG9mIGRhdGEgaW4gdGhlIGJ1ZmZlciwgdGhlbiBqdXN0IHRyaWdnZXJcbiAgLy8gdGhlICdyZWFkYWJsZScgZXZlbnQgYW5kIG1vdmUgb24uXG4gIGlmIChuID09PSAwICYmXG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgJiZcbiAgICAgIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApXG4gICAgICBlbmRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEFsbCB0aGUgYWN0dWFsIGNodW5rIGdlbmVyYXRpb24gbG9naWMgbmVlZHMgdG8gYmVcbiAgLy8gKmJlbG93KiB0aGUgY2FsbCB0byBfcmVhZC4gIFRoZSByZWFzb24gaXMgdGhhdCBpbiBjZXJ0YWluXG4gIC8vIHN5bnRoZXRpYyBzdHJlYW0gY2FzZXMsIHN1Y2ggYXMgcGFzc3Rocm91Z2ggc3RyZWFtcywgX3JlYWRcbiAgLy8gbWF5IGJlIGEgY29tcGxldGVseSBzeW5jaHJvbm91cyBvcGVyYXRpb24gd2hpY2ggbWF5IGNoYW5nZVxuICAvLyB0aGUgc3RhdGUgb2YgdGhlIHJlYWQgYnVmZmVyLCBwcm92aWRpbmcgZW5vdWdoIGRhdGEgd2hlblxuICAvLyBiZWZvcmUgdGhlcmUgd2FzICpub3QqIGVub3VnaC5cbiAgLy9cbiAgLy8gU28sIHRoZSBzdGVwcyBhcmU6XG4gIC8vIDEuIEZpZ3VyZSBvdXQgd2hhdCB0aGUgc3RhdGUgb2YgdGhpbmdzIHdpbGwgYmUgYWZ0ZXIgd2UgZG9cbiAgLy8gYSByZWFkIGZyb20gdGhlIGJ1ZmZlci5cbiAgLy9cbiAgLy8gMi4gSWYgdGhhdCByZXN1bHRpbmcgc3RhdGUgd2lsbCB0cmlnZ2VyIGEgX3JlYWQsIHRoZW4gY2FsbCBfcmVhZC5cbiAgLy8gTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGFzeW5jaHJvbm91cywgb3Igc3luY2hyb25vdXMuICBZZXMsIGl0IGlzXG4gIC8vIGRlZXBseSB1Z2x5IHRvIHdyaXRlIEFQSXMgdGhpcyB3YXksIGJ1dCB0aGF0IHN0aWxsIGRvZXNuJ3QgbWVhblxuICAvLyB0aGF0IHRoZSBSZWFkYWJsZSBjbGFzcyBzaG91bGQgYmVoYXZlIGltcHJvcGVybHksIGFzIHN0cmVhbXMgYXJlXG4gIC8vIGRlc2lnbmVkIHRvIGJlIHN5bmMvYXN5bmMgYWdub3N0aWMuXG4gIC8vIFRha2Ugbm90ZSBpZiB0aGUgX3JlYWQgY2FsbCBpcyBzeW5jIG9yIGFzeW5jIChpZSwgaWYgdGhlIHJlYWQgY2FsbFxuICAvLyBoYXMgcmV0dXJuZWQgeWV0KSwgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgb3Igbm90IGl0J3Mgc2FmZSB0byBlbWl0XG4gIC8vICdyZWFkYWJsZScgZXRjLlxuICAvL1xuICAvLyAzLiBBY3R1YWxseSBwdWxsIHRoZSByZXF1ZXN0ZWQgY2h1bmtzIG91dCBvZiB0aGUgYnVmZmVyIGFuZCByZXR1cm4uXG5cbiAgLy8gaWYgd2UgbmVlZCBhIHJlYWRhYmxlIGV2ZW50LCB0aGVuIHdlIG5lZWQgdG8gZG8gc29tZSByZWFkaW5nLlxuICB2YXIgZG9SZWFkID0gc3RhdGUubmVlZFJlYWRhYmxlO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoIC0gbiA8PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrKVxuICAgIGRvUmVhZCA9IHRydWU7XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZylcbiAgICBkb1JlYWQgPSBmYWxzZTtcblxuICBpZiAoZG9SZWFkKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IHRydWU7XG4gICAgc3RhdGUuc3luYyA9IHRydWU7XG4gICAgLy8gaWYgdGhlIGxlbmd0aCBpcyBjdXJyZW50bHkgemVybywgdGhlbiB3ZSAqbmVlZCogYSByZWFkYWJsZSBldmVudC5cbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKVxuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gIH1cblxuICAvLyBJZiBfcmVhZCBjYWxsZWQgaXRzIGNhbGxiYWNrIHN5bmNocm9ub3VzbHksIHRoZW4gYHJlYWRpbmdgXG4gIC8vIHdpbGwgYmUgZmFsc2UsIGFuZCB3ZSBuZWVkIHRvIHJlLWV2YWx1YXRlIGhvdyBtdWNoIGRhdGEgd2VcbiAgLy8gY2FuIHJldHVybiB0byB0aGUgdXNlci5cbiAgaWYgKGRvUmVhZCAmJiAhc3RhdGUucmVhZGluZylcbiAgICBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMClcbiAgICByZXQgPSBmcm9tTGlzdChuLCBzdGF0ZSk7XG4gIGVsc2VcbiAgICByZXQgPSBudWxsO1xuXG4gIGlmIChyZXQgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9XG5cbiAgc3RhdGUubGVuZ3RoIC09IG47XG5cbiAgLy8gSWYgd2UgaGF2ZSBub3RoaW5nIGluIHRoZSBidWZmZXIsIHRoZW4gd2Ugd2FudCB0byBrbm93XG4gIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuZW5kZWQpXG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyBJZiB3ZSBoYXBwZW5lZCB0byByZWFkKCkgZXhhY3RseSB0aGUgcmVtYWluaW5nIGFtb3VudCBpbiB0aGVcbiAgLy8gYnVmZmVyLCBhbmQgdGhlIEVPRiBoYXMgYmVlbiBzZWVuIGF0IHRoaXMgcG9pbnQsIHRoZW4gbWFrZSBzdXJlXG4gIC8vIHRoYXQgd2UgZW1pdCAnZW5kJyBvbiB0aGUgdmVyeSBuZXh0IHRpY2suXG4gIGlmIChzdGF0ZS5lbmRlZCAmJiAhc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApXG4gICAgZW5kUmVhZGFibGUodGhpcyk7XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbmZ1bmN0aW9uIGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspIHtcbiAgdmFyIGVyID0gbnVsbDtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoY2h1bmspICYmXG4gICAgICAnc3RyaW5nJyAhPT0gdHlwZW9mIGNodW5rICYmXG4gICAgICBjaHVuayAhPT0gbnVsbCAmJlxuICAgICAgY2h1bmsgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgIXN0YXRlLm9iamVjdE1vZGUgJiZcbiAgICAgICFlcikge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG4gIHJldHVybiBlcjtcbn1cblxuXG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCBhbmQgd2UgaGF2ZSBzb21lIGRhdGEgbGVmdCwgdGhlbiBlbWl0XG4gIC8vICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgaWYgKHN0YXRlLmxlbmd0aCA+IDApXG4gICAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG4gIGVsc2VcbiAgICBlbmRSZWFkYWJsZShzdHJlYW0pO1xufVxuXG4vLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICBpZiAoc3RhdGUuZW1pdHRlZFJlYWRhYmxlKVxuICAgIHJldHVybjtcblxuICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlO1xuICBpZiAoc3RhdGUuc3luYylcbiAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICBlbWl0UmVhZGFibGVfKHN0cmVhbSk7XG4gICAgfSk7XG4gIGVsc2VcbiAgICBlbWl0UmVhZGFibGVfKHN0cmVhbSk7XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xufVxuXG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkge1xuICAgICAgbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLmVuZGVkICYmXG4gICAgICAgICBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgaWYgKGxlbiA9PT0gc3RhdGUubGVuZ3RoKVxuICAgICAgLy8gZGlkbid0IGdldCBhbnkgZGF0YSwgc3RvcCBzcGlubmluZy5cbiAgICAgIGJyZWFrO1xuICAgIGVsc2VcbiAgICAgIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKG4pIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbihkZXN0LCBwaXBlT3B0cykge1xuICB2YXIgc3JjID0gdGhpcztcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBzd2l0Y2ggKHN0YXRlLnBpcGVzQ291bnQpIHtcbiAgICBjYXNlIDA6XG4gICAgICBzdGF0ZS5waXBlcyA9IGRlc3Q7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6XG4gICAgICBzdGF0ZS5waXBlcyA9IFtzdGF0ZS5waXBlcywgZGVzdF07XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgc3RhdGUucGlwZXMucHVzaChkZXN0KTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHN0YXRlLnBpcGVzQ291bnQgKz0gMTtcblxuICB2YXIgZG9FbmQgPSAoIXBpcGVPcHRzIHx8IHBpcGVPcHRzLmVuZCAhPT0gZmFsc2UpICYmXG4gICAgICAgICAgICAgIGRlc3QgIT09IHByb2Nlc3Muc3Rkb3V0ICYmXG4gICAgICAgICAgICAgIGRlc3QgIT09IHByb2Nlc3Muc3RkZXJyO1xuXG4gIHZhciBlbmRGbiA9IGRvRW5kID8gb25lbmQgOiBjbGVhbnVwO1xuICBpZiAoc3RhdGUuZW5kRW1pdHRlZClcbiAgICBzZXRJbW1lZGlhdGUoZW5kRm4pO1xuICBlbHNlXG4gICAgc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKTtcblxuICBkZXN0Lm9uKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gIGZ1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlKSB7XG4gICAgaWYgKHJlYWRhYmxlICE9PSBzcmMpIHJldHVybjtcbiAgICBjbGVhbnVwKCk7XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIC8vIGNsZWFudXAgZXZlbnQgaGFuZGxlcnMgb25jZSB0aGUgcGlwZSBpcyBicm9rZW5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xlYW51cCk7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbilcbiAgICAgIG9uZHJhaW4oKTtcbiAgfVxuXG4gIC8vIGlmIHRoZSBkZXN0IGhhcyBhbiBlcnJvciwgdGhlbiBzdG9wIHBpcGluZyBpbnRvIGl0LlxuICAvLyBob3dldmVyLCBkb24ndCBzdXBwcmVzcyB0aGUgdGhyb3dpbmcgYmVoYXZpb3IgZm9yIHRoaXMuXG4gIC8vIGNoZWNrIGZvciBsaXN0ZW5lcnMgYmVmb3JlIGVtaXQgcmVtb3ZlcyBvbmUtdGltZSBsaXN0ZW5lcnMuXG4gIHZhciBlcnJMaXN0ZW5lcnMgPSBFRS5saXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpO1xuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgdW5waXBlKCk7XG4gICAgaWYgKGVyckxpc3RlbmVycyA9PT0gMCAmJiBFRS5saXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpID09PSAwKVxuICAgICAgZGVzdC5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2Vycm9yJywgb25lcnJvcik7XG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpO1xuXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBzcmMudW5waXBlKGRlc3QpO1xuICB9XG5cbiAgLy8gdGVsbCB0aGUgZGVzdCB0aGF0IGl0J3MgYmVpbmcgcGlwZWQgdG9cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKTtcblxuICAvLyBzdGFydCB0aGUgZmxvdyBpZiBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkIGFscmVhZHkuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIC8vIHRoZSBoYW5kbGVyIHRoYXQgd2FpdHMgZm9yIHJlYWRhYmxlIGV2ZW50cyBhZnRlciBhbGxcbiAgICAvLyB0aGUgZGF0YSBnZXRzIHN1Y2tlZCBvdXQgaW4gZmxvdy5cbiAgICAvLyBUaGlzIHdvdWxkIGJlIGVhc2llciB0byBmb2xsb3cgd2l0aCBhIC5vbmNlKCkgaGFuZGxlclxuICAgIC8vIGluIGZsb3coKSwgYnV0IHRoYXQgaXMgdG9vIHNsb3cuXG4gICAgdGhpcy5vbigncmVhZGFibGUnLCBwaXBlT25SZWFkYWJsZSk7XG5cbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRlc3QgPSB0aGlzO1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBzdGF0ZS5hd2FpdERyYWluLS07XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDApXG4gICAgICBmbG93KHNyYyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZsb3coc3JjKSB7XG4gIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIGNodW5rO1xuICBzdGF0ZS5hd2FpdERyYWluID0gMDtcblxuICBmdW5jdGlvbiB3cml0ZShkZXN0LCBpLCBsaXN0KSB7XG4gICAgdmFyIHdyaXR0ZW4gPSBkZXN0LndyaXRlKGNodW5rKTtcbiAgICBpZiAoZmFsc2UgPT09IHdyaXR0ZW4pIHtcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICB9XG4gIH1cblxuICB3aGlsZSAoc3RhdGUucGlwZXNDb3VudCAmJiBudWxsICE9PSAoY2h1bmsgPSBzcmMucmVhZCgpKSkge1xuXG4gICAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpXG4gICAgICB3cml0ZShzdGF0ZS5waXBlcywgMCwgbnVsbCk7XG4gICAgZWxzZVxuICAgICAgZm9yRWFjaChzdGF0ZS5waXBlcywgd3JpdGUpO1xuXG4gICAgc3JjLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG5cbiAgICAvLyBpZiBhbnlvbmUgbmVlZHMgYSBkcmFpbiwgdGhlbiB3ZSBoYXZlIHRvIHdhaXQgZm9yIHRoYXQuXG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPiAwKVxuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gaWYgZXZlcnkgZGVzdGluYXRpb24gd2FzIHVucGlwZWQsIGVpdGhlciBiZWZvcmUgZW50ZXJpbmcgdGhpc1xuICAvLyBmdW5jdGlvbiwgb3IgaW4gdGhlIHdoaWxlIGxvb3AsIHRoZW4gc3RvcCBmbG93aW5nLlxuICAvL1xuICAvLyBOQjogVGhpcyBpcyBhIHByZXR0eSByYXJlIGVkZ2UgY2FzZS5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDApIHtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICAvLyBpZiB0aGVyZSB3ZXJlIGRhdGEgZXZlbnQgbGlzdGVuZXJzIGFkZGVkLCB0aGVuIHN3aXRjaCB0byBvbGQgbW9kZS5cbiAgICBpZiAoRUUubGlzdGVuZXJDb3VudChzcmMsICdkYXRhJykgPiAwKVxuICAgICAgZW1pdERhdGFFdmVudHMoc3JjKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBhdCB0aGlzIHBvaW50LCBubyBvbmUgbmVlZGVkIGEgZHJhaW4sIHNvIHdlIGp1c3QgcmFuIG91dCBvZiBkYXRhXG4gIC8vIG9uIHRoZSBuZXh0IHJlYWRhYmxlIGV2ZW50LCBzdGFydCBpdCBvdmVyIGFnYWluLlxuICBzdGF0ZS5yYW5PdXQgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBwaXBlT25SZWFkYWJsZSgpIHtcbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUucmFuT3V0KSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5yYW5PdXQgPSBmYWxzZTtcbiAgICBmbG93KHRoaXMpO1xuICB9XG59XG5cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uKGRlc3QpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIGp1c3Qgb25lIGRlc3RpbmF0aW9uLiAgbW9zdCBjb21tb24gY2FzZS5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHtcbiAgICAvLyBwYXNzZWQgaW4gb25lLCBidXQgaXQncyBub3QgdGhlIHJpZ2h0IG9uZS5cbiAgICBpZiAoZGVzdCAmJiBkZXN0ICE9PSBzdGF0ZS5waXBlcylcbiAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFkZXN0KVxuICAgICAgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ3JlYWRhYmxlJywgcGlwZU9uUmVhZGFibGUpO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdClcbiAgICAgIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzbG93IGNhc2UuIG11bHRpcGxlIHBpcGUgZGVzdGluYXRpb25zLlxuXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgdmFyIGRlc3RzID0gc3RhdGUucGlwZXM7XG4gICAgdmFyIGxlbiA9IHN0YXRlLnBpcGVzQ291bnQ7XG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ3JlYWRhYmxlJywgcGlwZU9uUmVhZGFibGUpO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICBkZXN0c1tpXS5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpID09PSAtMSlcbiAgICByZXR1cm4gdGhpcztcblxuICBzdGF0ZS5waXBlcy5zcGxpY2UoaSwgMSk7XG4gIHN0YXRlLnBpcGVzQ291bnQgLT0gMTtcbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpXG4gICAgc3RhdGUucGlwZXMgPSBzdGF0ZS5waXBlc1swXTtcblxuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gc2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmdcblJlYWRhYmxlLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgaWYgKGV2ID09PSAnZGF0YScgJiYgIXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZylcbiAgICBlbWl0RGF0YUV2ZW50cyh0aGlzKTtcblxuICBpZiAoZXYgPT09ICdyZWFkYWJsZScgJiYgdGhpcy5yZWFkYWJsZSkge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKCFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHRoaXMucmVhZCgwKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGVuZ3RoKSB7XG4gICAgICAgIGVtaXRSZWFkYWJsZSh0aGlzLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5SZWFkYWJsZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBSZWFkYWJsZS5wcm90b3R5cGUub247XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbigpIHtcbiAgZW1pdERhdGFFdmVudHModGhpcyk7XG4gIHRoaXMucmVhZCgwKTtcbiAgdGhpcy5lbWl0KCdyZXN1bWUnKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICBlbWl0RGF0YUV2ZW50cyh0aGlzLCB0cnVlKTtcbiAgdGhpcy5lbWl0KCdwYXVzZScpO1xufTtcblxuZnVuY3Rpb24gZW1pdERhdGFFdmVudHMoc3RyZWFtLCBzdGFydFBhdXNlZCkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cbiAgaWYgKHN0YXRlLmZsb3dpbmcpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL3JlYWRhYmxlLXN0cmVhbS9pc3N1ZXMvMTZcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzd2l0Y2ggdG8gb2xkIG1vZGUgbm93LicpO1xuICB9XG5cbiAgdmFyIHBhdXNlZCA9IHN0YXJ0UGF1c2VkIHx8IGZhbHNlO1xuICB2YXIgcmVhZGFibGUgPSBmYWxzZTtcblxuICAvLyBjb252ZXJ0IHRvIGFuIG9sZC1zdHlsZSBzdHJlYW0uXG4gIHN0cmVhbS5yZWFkYWJsZSA9IHRydWU7XG4gIHN0cmVhbS5waXBlID0gU3RyZWFtLnByb3RvdHlwZS5waXBlO1xuICBzdHJlYW0ub24gPSBzdHJlYW0uYWRkTGlzdGVuZXIgPSBTdHJlYW0ucHJvdG90eXBlLm9uO1xuXG4gIHN0cmVhbS5vbigncmVhZGFibGUnLCBmdW5jdGlvbigpIHtcbiAgICByZWFkYWJsZSA9IHRydWU7XG5cbiAgICB2YXIgYztcbiAgICB3aGlsZSAoIXBhdXNlZCAmJiAobnVsbCAhPT0gKGMgPSBzdHJlYW0ucmVhZCgpKSkpXG4gICAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGMpO1xuXG4gICAgaWYgKGMgPT09IG51bGwpIHtcbiAgICAgIHJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBzdHJlYW0uX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHN0cmVhbS5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICAgIHBhdXNlZCA9IHRydWU7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9O1xuXG4gIHN0cmVhbS5yZXN1bWUgPSBmdW5jdGlvbigpIHtcbiAgICBwYXVzZWQgPSBmYWxzZTtcbiAgICBpZiAocmVhZGFibGUpXG4gICAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICAgIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICAgICAgfSk7XG4gICAgZWxzZVxuICAgICAgdGhpcy5yZWFkKDApO1xuICAgIHRoaXMuZW1pdCgncmVzdW1lJyk7XG4gIH07XG5cbiAgLy8gbm93IG1ha2UgaXQgc3RhcnQsIGp1c3QgaW4gY2FzZSBpdCBoYWRuJ3QgYWxyZWFkeS5cbiAgc3RyZWFtLmVtaXQoJ3JlYWRhYmxlJyk7XG59XG5cbi8vIHdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24oc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBwYXVzZWQgPSBmYWxzZTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24oKSB7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aClcbiAgICAgICAgc2VsZi5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBzZWxmLnB1c2gobnVsbCk7XG4gIH0pO1xuXG4gIHN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uKGNodW5rKSB7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpXG4gICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuICAgIGlmICghY2h1bmsgfHwgIXN0YXRlLm9iamVjdE1vZGUgJiYgIWNodW5rLmxlbmd0aClcbiAgICAgIHJldHVybjtcblxuICAgIHZhciByZXQgPSBzZWxmLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0eXBlb2Ygc3RyZWFtW2ldID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHR5cGVvZiB0aGlzW2ldID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uKG1ldGhvZCkgeyByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sIGFyZ3VtZW50cyk7XG4gICAgICB9fShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIHZhciBldmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG4gIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbihldikge1xuICAgIHN0cmVhbS5vbihldiwgZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBzZWxmLmVtaXQuYXBwbHkoc2VsZiwgZXYsIHgpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyB3aGVuIHdlIHRyeSB0byBjb25zdW1lIHNvbWUgbW9yZSBieXRlcywgc2ltcGx5IHVucGF1c2UgdGhlXG4gIC8vIHVuZGVybHlpbmcgc3RyZWFtLlxuICBzZWxmLl9yZWFkID0gZnVuY3Rpb24obikge1xuICAgIGlmIChwYXVzZWQpIHtcbiAgICAgIHBhdXNlZCA9IGZhbHNlO1xuICAgICAgc3RyZWFtLnJlc3VtZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gc2VsZjtcbn07XG5cblxuXG4vLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdDtcblxuLy8gUGx1Y2sgb2ZmIG4gYnl0ZXMgZnJvbSBhbiBhcnJheSBvZiBidWZmZXJzLlxuLy8gTGVuZ3RoIGlzIHRoZSBjb21iaW5lZCBsZW5ndGhzIG9mIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgbGlzdC5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIHZhciBsaXN0ID0gc3RhdGUuYnVmZmVyO1xuICB2YXIgbGVuZ3RoID0gc3RhdGUubGVuZ3RoO1xuICB2YXIgc3RyaW5nTW9kZSA9ICEhc3RhdGUuZGVjb2RlcjtcbiAgdmFyIG9iamVjdE1vZGUgPSAhIXN0YXRlLm9iamVjdE1vZGU7XG4gIHZhciByZXQ7XG5cbiAgLy8gbm90aGluZyBpbiB0aGUgbGlzdCwgZGVmaW5pdGVseSBlbXB0eS5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiBudWxsO1xuXG4gIGlmIChsZW5ndGggPT09IDApXG4gICAgcmV0ID0gbnVsbDtcbiAgZWxzZSBpZiAob2JqZWN0TW9kZSlcbiAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gIGVsc2UgaWYgKCFuIHx8IG4gPj0gbGVuZ3RoKSB7XG4gICAgLy8gcmVhZCBpdCBhbGwsIHRydW5jYXRlIHRoZSBhcnJheS5cbiAgICBpZiAoc3RyaW5nTW9kZSlcbiAgICAgIHJldCA9IGxpc3Quam9pbignJyk7XG4gICAgZWxzZVxuICAgICAgcmV0ID0gQnVmZmVyLmNvbmNhdChsaXN0LCBsZW5ndGgpO1xuICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIGp1c3Qgc29tZSBvZiBpdC5cbiAgICBpZiAobiA8IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBqdXN0IHRha2UgYSBwYXJ0IG9mIHRoZSBmaXJzdCBsaXN0IGl0ZW0uXG4gICAgICAvLyBzbGljZSBpcyB0aGUgc2FtZSBmb3IgYnVmZmVycyBhbmQgc3RyaW5ncy5cbiAgICAgIHZhciBidWYgPSBsaXN0WzBdO1xuICAgICAgcmV0ID0gYnVmLnNsaWNlKDAsIG4pO1xuICAgICAgbGlzdFswXSA9IGJ1Zi5zbGljZShuKTtcbiAgICB9IGVsc2UgaWYgKG4gPT09IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBmaXJzdCBsaXN0IGlzIGEgcGVyZmVjdCBtYXRjaFxuICAgICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb21wbGV4IGNhc2UuXG4gICAgICAvLyB3ZSBoYXZlIGVub3VnaCB0byBjb3ZlciBpdCwgYnV0IGl0IHNwYW5zIHBhc3QgdGhlIGZpcnN0IGJ1ZmZlci5cbiAgICAgIGlmIChzdHJpbmdNb2RlKVxuICAgICAgICByZXQgPSAnJztcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0ID0gbmV3IEJ1ZmZlcihuKTtcblxuICAgICAgdmFyIGMgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGwgJiYgYyA8IG47IGkrKykge1xuICAgICAgICB2YXIgYnVmID0gbGlzdFswXTtcbiAgICAgICAgdmFyIGNweSA9IE1hdGgubWluKG4gLSBjLCBidWYubGVuZ3RoKTtcblxuICAgICAgICBpZiAoc3RyaW5nTW9kZSlcbiAgICAgICAgICByZXQgKz0gYnVmLnNsaWNlKDAsIGNweSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBidWYuY29weShyZXQsIGMsIDAsIGNweSk7XG5cbiAgICAgICAgaWYgKGNweSA8IGJ1Zi5sZW5ndGgpXG4gICAgICAgICAgbGlzdFswXSA9IGJ1Zi5zbGljZShjcHkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgbGlzdC5zaGlmdCgpO1xuXG4gICAgICAgIGMgKz0gY3B5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gSWYgd2UgZ2V0IGhlcmUgYmVmb3JlIGNvbnN1bWluZyBhbGwgdGhlIGJ5dGVzLCB0aGVuIHRoYXQgaXMgYVxuICAvLyBidWcgaW4gbm9kZS4gIFNob3VsZCBuZXZlciBoYXBwZW4uXG4gIGlmIChzdGF0ZS5sZW5ndGggPiAwKVxuICAgIHRocm93IG5ldyBFcnJvcignZW5kUmVhZGFibGUgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtcblxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUuY2FsbGVkUmVhZCkge1xuICAgIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgICAgIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaCAoeHMsIGYpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmKHhzW2ldLCBpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmRleE9mICh4cywgeCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmICh4c1tpXSA9PT0geCkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG59KS5jYWxsKHRoaXMscmVxdWlyZShcIktsaXViSFwiKSkiLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSB0cmFuc2Zvcm0gc3RyZWFtIGlzIGEgcmVhZGFibGUvd3JpdGFibGUgc3RyZWFtIHdoZXJlIHlvdSBkb1xuLy8gc29tZXRoaW5nIHdpdGggdGhlIGRhdGEuICBTb21ldGltZXMgaXQncyBjYWxsZWQgYSBcImZpbHRlclwiLFxuLy8gYnV0IHRoYXQncyBub3QgYSBncmVhdCBuYW1lIGZvciBpdCwgc2luY2UgdGhhdCBpbXBsaWVzIGEgdGhpbmcgd2hlcmVcbi8vIHNvbWUgYml0cyBwYXNzIHRocm91Z2gsIGFuZCBvdGhlcnMgYXJlIHNpbXBseSBpZ25vcmVkLiAgKFRoYXQgd291bGRcbi8vIGJlIGEgdmFsaWQgZXhhbXBsZSBvZiBhIHRyYW5zZm9ybSwgb2YgY291cnNlLilcbi8vXG4vLyBXaGlsZSB0aGUgb3V0cHV0IGlzIGNhdXNhbGx5IHJlbGF0ZWQgdG8gdGhlIGlucHV0LCBpdCdzIG5vdCBhXG4vLyBuZWNlc3NhcmlseSBzeW1tZXRyaWMgb3Igc3luY2hyb25vdXMgdHJhbnNmb3JtYXRpb24uICBGb3IgZXhhbXBsZSxcbi8vIGEgemxpYiBzdHJlYW0gbWlnaHQgdGFrZSBtdWx0aXBsZSBwbGFpbi10ZXh0IHdyaXRlcygpLCBhbmQgdGhlblxuLy8gZW1pdCBhIHNpbmdsZSBjb21wcmVzc2VkIGNodW5rIHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlLlxuLy9cbi8vIEhlcmUncyBob3cgdGhpcyB3b3Jrczpcbi8vXG4vLyBUaGUgVHJhbnNmb3JtIHN0cmVhbSBoYXMgYWxsIHRoZSBhc3BlY3RzIG9mIHRoZSByZWFkYWJsZSBhbmQgd3JpdGFibGVcbi8vIHN0cmVhbSBjbGFzc2VzLiAgV2hlbiB5b3Ugd3JpdGUoY2h1bmspLCB0aGF0IGNhbGxzIF93cml0ZShjaHVuayxjYilcbi8vIGludGVybmFsbHksIGFuZCByZXR1cm5zIGZhbHNlIGlmIHRoZXJlJ3MgYSBsb3Qgb2YgcGVuZGluZyB3cml0ZXNcbi8vIGJ1ZmZlcmVkIHVwLiAgV2hlbiB5b3UgY2FsbCByZWFkKCksIHRoYXQgY2FsbHMgX3JlYWQobikgdW50aWxcbi8vIHRoZXJlJ3MgZW5vdWdoIHBlbmRpbmcgcmVhZGFibGUgZGF0YSBidWZmZXJlZCB1cC5cbi8vXG4vLyBJbiBhIHRyYW5zZm9ybSBzdHJlYW0sIHRoZSB3cml0dGVuIGRhdGEgaXMgcGxhY2VkIGluIGEgYnVmZmVyLiAgV2hlblxuLy8gX3JlYWQobikgaXMgY2FsbGVkLCBpdCB0cmFuc2Zvcm1zIHRoZSBxdWV1ZWQgdXAgZGF0YSwgY2FsbGluZyB0aGVcbi8vIGJ1ZmZlcmVkIF93cml0ZSBjYidzIGFzIGl0IGNvbnN1bWVzIGNodW5rcy4gIElmIGNvbnN1bWluZyBhIHNpbmdsZVxuLy8gd3JpdHRlbiBjaHVuayB3b3VsZCByZXN1bHQgaW4gbXVsdGlwbGUgb3V0cHV0IGNodW5rcywgdGhlbiB0aGUgZmlyc3Rcbi8vIG91dHB1dHRlZCBiaXQgY2FsbHMgdGhlIHJlYWRjYiwgYW5kIHN1YnNlcXVlbnQgY2h1bmtzIGp1c3QgZ28gaW50b1xuLy8gdGhlIHJlYWQgYnVmZmVyLCBhbmQgd2lsbCBjYXVzZSBpdCB0byBlbWl0ICdyZWFkYWJsZScgaWYgbmVjZXNzYXJ5LlxuLy9cbi8vIFRoaXMgd2F5LCBiYWNrLXByZXNzdXJlIGlzIGFjdHVhbGx5IGRldGVybWluZWQgYnkgdGhlIHJlYWRpbmcgc2lkZSxcbi8vIHNpbmNlIF9yZWFkIGhhcyB0byBiZSBjYWxsZWQgdG8gc3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBjaHVuay4gIEhvd2V2ZXIsXG4vLyBhIHBhdGhvbG9naWNhbCBpbmZsYXRlIHR5cGUgb2YgdHJhbnNmb3JtIGNhbiBjYXVzZSBleGNlc3NpdmUgYnVmZmVyaW5nXG4vLyBoZXJlLiAgRm9yIGV4YW1wbGUsIGltYWdpbmUgYSBzdHJlYW0gd2hlcmUgZXZlcnkgYnl0ZSBvZiBpbnB1dCBpc1xuLy8gaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlciBmcm9tIDAtMjU1LCBhbmQgdGhlbiByZXN1bHRzIGluIHRoYXQgbWFueVxuLy8gYnl0ZXMgb2Ygb3V0cHV0LiAgV3JpdGluZyB0aGUgNCBieXRlcyB7ZmYsZmYsZmYsZmZ9IHdvdWxkIHJlc3VsdCBpblxuLy8gMWtiIG9mIGRhdGEgYmVpbmcgb3V0cHV0LiAgSW4gdGhpcyBjYXNlLCB5b3UgY291bGQgd3JpdGUgYSB2ZXJ5IHNtYWxsXG4vLyBhbW91bnQgb2YgaW5wdXQsIGFuZCBlbmQgdXAgd2l0aCBhIHZlcnkgbGFyZ2UgYW1vdW50IG9mIG91dHB1dC4gIEluXG4vLyBzdWNoIGEgcGF0aG9sb2dpY2FsIGluZmxhdGluZyBtZWNoYW5pc20sIHRoZXJlJ2QgYmUgbm8gd2F5IHRvIHRlbGxcbi8vIHRoZSBzeXN0ZW0gdG8gc3RvcCBkb2luZyB0aGUgdHJhbnNmb3JtLiAgQSBzaW5nbGUgNE1CIHdyaXRlIGNvdWxkXG4vLyBjYXVzZSB0aGUgc3lzdGVtIHRvIHJ1biBvdXQgb2YgbWVtb3J5LlxuLy9cbi8vIEhvd2V2ZXIsIGV2ZW4gaW4gc3VjaCBhIHBhdGhvbG9naWNhbCBjYXNlLCBvbmx5IGEgc2luZ2xlIHdyaXR0ZW4gY2h1bmtcbi8vIHdvdWxkIGJlIGNvbnN1bWVkLCBhbmQgdGhlbiB0aGUgcmVzdCB3b3VsZCB3YWl0ICh1bi10cmFuc2Zvcm1lZCkgdW50aWxcbi8vIHRoZSByZXN1bHRzIG9mIHRoZSBwcmV2aW91cyB0cmFuc2Zvcm1lZCBjaHVuayB3ZXJlIGNvbnN1bWVkLlxuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxudmFyIER1cGxleCA9IHJlcXVpcmUoJy4vZHVwbGV4LmpzJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuaW5oZXJpdHMoVHJhbnNmb3JtLCBEdXBsZXgpO1xuXG5cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICB0aGlzLmFmdGVyVHJhbnNmb3JtID0gZnVuY3Rpb24oZXIsIGRhdGEpIHtcbiAgICByZXR1cm4gYWZ0ZXJUcmFuc2Zvcm0oc3RyZWFtLCBlciwgZGF0YSk7XG4gIH07XG5cbiAgdGhpcy5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHRoaXMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG4gIHRoaXMud3JpdGVjaHVuayA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpIHtcbiAgdmFyIHRzID0gc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG5cbiAgdmFyIGNiID0gdHMud3JpdGVjYjtcblxuICBpZiAoIWNiKVxuICAgIHJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vIHdyaXRlY2IgaW4gVHJhbnNmb3JtIGNsYXNzJykpO1xuXG4gIHRzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0cy53cml0ZWNiID0gbnVsbDtcblxuICBpZiAoZGF0YSAhPT0gbnVsbCAmJiBkYXRhICE9PSB1bmRlZmluZWQpXG4gICAgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgaWYgKGNiKVxuICAgIGNiKGVyKTtcblxuICB2YXIgcnMgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHJzLnJlYWRpbmcgPSBmYWxzZTtcbiAgaWYgKHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgc3RyZWFtLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59XG5cblxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpXG4gICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm0ob3B0aW9ucyk7XG5cbiAgRHVwbGV4LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGUgPSBuZXcgVHJhbnNmb3JtU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gd2hlbiB0aGUgd3JpdGFibGUgc2lkZSBmaW5pc2hlcywgdGhlbiBmbHVzaCBvdXQgYW55dGhpbmcgcmVtYWluaW5nLlxuICB2YXIgc3RyZWFtID0gdGhpcztcblxuICAvLyBzdGFydCBvdXQgYXNraW5nIGZvciBhIHJlYWRhYmxlIGV2ZW50IG9uY2UgZGF0YSBpcyB0cmFuc2Zvcm1lZC5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIHdlIGhhdmUgaW1wbGVtZW50ZWQgdGhlIF9yZWFkIG1ldGhvZCwgYW5kIGRvbmUgdGhlIG90aGVyIHRoaW5nc1xuICAvLyB0aGF0IFJlYWRhYmxlIHdhbnRzIGJlZm9yZSB0aGUgZmlyc3QgX3JlYWQgY2FsbCwgc28gdW5zZXQgdGhlXG4gIC8vIHN5bmMgZ3VhcmQgZmxhZy5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2U7XG5cbiAgdGhpcy5vbmNlKCdmaW5pc2gnLCBmdW5jdGlvbigpIHtcbiAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHRoaXMuX2ZsdXNoKVxuICAgICAgdGhpcy5fZmx1c2goZnVuY3Rpb24oZXIpIHtcbiAgICAgICAgZG9uZShzdHJlYW0sIGVyKTtcbiAgICAgIH0pO1xuICAgIGVsc2VcbiAgICAgIGRvbmUoc3RyZWFtKTtcbiAgfSk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZykge1xuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHJldHVybiBEdXBsZXgucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZW5jb2RpbmcpO1xufTtcblxuLy8gVGhpcyBpcyB0aGUgcGFydCB3aGVyZSB5b3UgZG8gc3R1ZmYhXG4vLyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGluIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyAnY2h1bmsnIGlzIGFuIGlucHV0IGNodW5rLlxuLy9cbi8vIENhbGwgYHB1c2gobmV3Q2h1bmspYCB0byBwYXNzIGFsb25nIHRyYW5zZm9ybWVkIG91dHB1dFxuLy8gdG8gdGhlIHJlYWRhYmxlIHNpZGUuICBZb3UgbWF5IGNhbGwgJ3B1c2gnIHplcm8gb3IgbW9yZSB0aW1lcy5cbi8vXG4vLyBDYWxsIGBjYihlcnIpYCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgY2h1bmsuICBJZiB5b3UgcGFzc1xuLy8gYW4gZXJyb3IsIHRoZW4gdGhhdCdsbCBwdXQgdGhlIGh1cnQgb24gdGhlIHdob2xlIG9wZXJhdGlvbi4gIElmIHlvdVxuLy8gbmV2ZXIgY2FsbCBjYigpLCB0aGVuIHlvdSdsbCBuZXZlciBnZXQgYW5vdGhlciBjaHVuay5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMud3JpdGVjYiA9IGNiO1xuICB0cy53cml0ZWNodW5rID0gY2h1bms7XG4gIHRzLndyaXRlZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8XG4gICAgICAgIHJzLm5lZWRSZWFkYWJsZSB8fFxuICAgICAgICBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKVxuICAgICAgdGhpcy5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufTtcblxuLy8gRG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgYXJncyBhcmUgaGVyZS5cbi8vIF90cmFuc2Zvcm0gZG9lcyBhbGwgdGhlIHdvcmsuXG4vLyBUaGF0IHdlIGdvdCBoZXJlIG1lYW5zIHRoYXQgdGhlIHJlYWRhYmxlIHNpZGUgd2FudHMgbW9yZSBkYXRhLlxuVHJhbnNmb3JtLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKG4pIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHRzLndyaXRlY2h1bmsgJiYgdHMud3JpdGVjYiAmJiAhdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdHMudHJhbnNmb3JtaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl90cmFuc2Zvcm0odHMud3JpdGVjaHVuaywgdHMud3JpdGVlbmNvZGluZywgdHMuYWZ0ZXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG1hcmsgdGhhdCB3ZSBuZWVkIGEgdHJhbnNmb3JtLCBzbyB0aGF0IGFueSBkYXRhIHRoYXQgY29tZXMgaW5cbiAgICAvLyB3aWxsIGdldCBwcm9jZXNzZWQsIG5vdyB0aGF0IHdlJ3ZlIGFza2VkIGZvciBpdC5cbiAgICB0cy5uZWVkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgfVxufTtcblxuXG5mdW5jdGlvbiBkb25lKHN0cmVhbSwgZXIpIHtcbiAgaWYgKGVyKVxuICAgIHJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG5cbiAgLy8gaWYgdGhlcmUncyBub3RoaW5nIGluIHRoZSB3cml0ZSBidWZmZXIsIHRoZW4gdGhhdCBtZWFuc1xuICAvLyB0aGF0IG5vdGhpbmcgbW9yZSB3aWxsIGV2ZXIgYmUgcHJvdmlkZWRcbiAgdmFyIHdzID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgcnMgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHdzLmxlbmd0aClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCcpO1xuXG4gIGlmICh0cy50cmFuc2Zvcm1pbmcpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nJyk7XG5cbiAgcmV0dXJuIHN0cmVhbS5wdXNoKG51bGwpO1xufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIEEgYml0IHNpbXBsZXIgdGhhbiByZWFkYWJsZSBzdHJlYW1zLlxuLy8gSW1wbGVtZW50IGFuIGFzeW5jIC5fd3JpdGUoY2h1bmssIGNiKSwgYW5kIGl0J2xsIGhhbmRsZSBhbGxcbi8vIHRoZSBkcmFpbiBldmVudCBlbWlzc2lvbiBhbmQgYnVmZmVyaW5nLlxuXG5tb2R1bGUuZXhwb3J0cyA9IFdyaXRhYmxlO1xuV3JpdGFibGUuV3JpdGFibGVTdGF0ZSA9IFdyaXRhYmxlU3RhdGU7XG5cbnZhciBpc1VpbnQ4QXJyYXkgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCdcbiAgPyBmdW5jdGlvbiAoeCkgeyByZXR1cm4geCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfVxuICA6IGZ1bmN0aW9uICh4KSB7XG4gICAgcmV0dXJuIHggJiYgeC5jb25zdHJ1Y3RvciAmJiB4LmNvbnN0cnVjdG9yLm5hbWUgPT09ICdVaW50OEFycmF5J1xuICB9XG47XG52YXIgaXNBcnJheUJ1ZmZlciA9IHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCdcbiAgPyBmdW5jdGlvbiAoeCkgeyByZXR1cm4geCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIH1cbiAgOiBmdW5jdGlvbiAoeCkge1xuICAgIHJldHVybiB4ICYmIHguY29uc3RydWN0b3IgJiYgeC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnQXJyYXlCdWZmZXInXG4gIH1cbjtcblxudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2luZGV4LmpzJyk7XG52YXIgc2V0SW1tZWRpYXRlID0gcmVxdWlyZSgncHJvY2Vzcy9icm93c2VyLmpzJykubmV4dFRpY2s7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG5pbmhlcml0cyhXcml0YWJsZSwgU3RyZWFtKTtcblxuZnVuY3Rpb24gV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aGlzLmNodW5rID0gY2h1bms7XG4gIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgdGhpcy5jYWxsYmFjayA9IGNiO1xufVxuXG5mdW5jdGlvbiBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKClcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gKGh3bSB8fCBod20gPT09IDApID8gaHdtIDogMTYgKiAxMDI0O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIHN0cmVhbVxuICAvLyBjb250YWlucyBidWZmZXJzIG9yIG9iamVjdHMuXG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfn50aGlzLmhpZ2hXYXRlck1hcms7XG5cbiAgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgLy8gYXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcbiAgdGhpcy5lbmRpbmcgPSBmYWxzZTtcbiAgLy8gd2hlbiBlbmQoKSBoYXMgYmVlbiBjYWxsZWQsIGFuZCByZXR1cm5lZFxuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIC8vIHdoZW4gJ2ZpbmlzaCcgaXMgZW1pdHRlZFxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gc2hvdWxkIHdlIGRlY29kZSBzdHJpbmdzIGludG8gYnVmZmVycyBiZWZvcmUgcGFzc2luZyB0byBfd3JpdGU/XG4gIC8vIHRoaXMgaXMgaGVyZSBzbyB0aGF0IHNvbWUgbm9kZS1jb3JlIHN0cmVhbXMgY2FuIG9wdGltaXplIHN0cmluZ1xuICAvLyBoYW5kbGluZyBhdCBhIGxvd2VyIGxldmVsLlxuICB2YXIgbm9EZWNvZGUgPSBvcHRpb25zLmRlY29kZVN0cmluZ3MgPT09IGZhbHNlO1xuICB0aGlzLmRlY29kZVN0cmluZ3MgPSAhbm9EZWNvZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gbm90IGFuIGFjdHVhbCBidWZmZXIgd2Uga2VlcCB0cmFjayBvZiwgYnV0IGEgbWVhc3VyZW1lbnRcbiAgLy8gb2YgaG93IG11Y2ggd2UncmUgd2FpdGluZyB0byBnZXQgcHVzaGVkIHRvIHNvbWUgdW5kZXJseWluZ1xuICAvLyBzb2NrZXQgb3IgZmlsZS5cbiAgdGhpcy5sZW5ndGggPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWN1YXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIGEgZmxhZyB0byBrbm93IGlmIHdlJ3JlIHByb2Nlc3NpbmcgcHJldmlvdXNseSBidWZmZXJlZCBpdGVtcywgd2hpY2hcbiAgLy8gbWF5IGNhbGwgdGhlIF93cml0ZSgpIGNhbGxiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIHRoYXQgd2UgZG9uJ3RcbiAgLy8gZW5kIHVwIGluIGFuIG92ZXJsYXBwZWQgb253cml0ZSBzaXR1YXRpb24uXG4gIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuayxjYilcbiAgdGhpcy5vbndyaXRlID0gZnVuY3Rpb24oZXIpIHtcbiAgICBvbndyaXRlKHN0cmVhbSwgZXIpO1xuICB9O1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0IHRoZSB1c2VyIHN1cHBsaWVzIHRvIHdyaXRlKGNodW5rLGVuY29kaW5nLGNiKVxuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuXG4gIC8vIHRoZSBhbW91bnQgdGhhdCBpcyBiZWluZyB3cml0dGVuIHdoZW4gX3dyaXRlIGlzIGNhbGxlZC5cbiAgdGhpcy53cml0ZWxlbiA9IDA7XG5cbiAgdGhpcy5idWZmZXIgPSBbXTtcbn1cblxuZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucykge1xuICAvLyBXcml0YWJsZSBjdG9yIGlzIGFwcGxpZWQgdG8gRHVwbGV4ZXMsIHRob3VnaCB0aGV5J3JlIG5vdFxuICAvLyBpbnN0YW5jZW9mIFdyaXRhYmxlLCB0aGV5J3JlIGluc3RhbmNlb2YgUmVhZGFibGUuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXcml0YWJsZSkgJiYgISh0aGlzIGluc3RhbmNlb2YgU3RyZWFtLkR1cGxleCkpXG4gICAgcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKTtcblxuICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5LlxuICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignQ2Fubm90IHBpcGUuIE5vdCByZWFkYWJsZS4nKSk7XG59O1xuXG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgdmFyIGVyID0gbmV3IEVycm9yKCd3cml0ZSBhZnRlciBlbmQnKTtcbiAgLy8gVE9ETzogZGVmZXIgZXJyb3IgZXZlbnRzIGNvbnNpc3RlbnRseSBldmVyeXdoZXJlLCBub3QganVzdCB0aGUgY2JcbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgY2IoZXIpO1xuICB9KTtcbn1cblxuLy8gSWYgd2UgZ2V0IHNvbWV0aGluZyB0aGF0IGlzIG5vdCBhIGJ1ZmZlciwgc3RyaW5nLCBudWxsLCBvciB1bmRlZmluZWQsXG4vLyBhbmQgd2UncmUgbm90IGluIG9iamVjdE1vZGUsIHRoZW4gdGhhdCdzIGFuIGVycm9yLlxuLy8gT3RoZXJ3aXNlIHN0cmVhbSBjaHVua3MgYXJlIGFsbCBjb25zaWRlcmVkIHRvIGJlIG9mIGxlbmd0aD0xLCBhbmQgdGhlXG4vLyB3YXRlcm1hcmtzIGRldGVybWluZSBob3cgbWFueSBvYmplY3RzIHRvIGtlZXAgaW4gdGhlIGJ1ZmZlciwgcmF0aGVyIHRoYW5cbi8vIGhvdyBtYW55IGJ5dGVzIG9yIGNoYXJhY3RlcnMuXG5mdW5jdGlvbiB2YWxpZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBjYikge1xuICB2YXIgdmFsaWQgPSB0cnVlO1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykgJiZcbiAgICAgICdzdHJpbmcnICE9PSB0eXBlb2YgY2h1bmsgJiZcbiAgICAgIGNodW5rICE9PSBudWxsICYmXG4gICAgICBjaHVuayAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIHZhciBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkge1xuICAgICAgY2IoZXIpO1xuICAgIH0pO1xuICAgIHZhbGlkID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHZhbGlkO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciByZXQgPSBmYWxzZTtcblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykgJiYgaXNVaW50OEFycmF5KGNodW5rKSlcbiAgICBjaHVuayA9IG5ldyBCdWZmZXIoY2h1bmspO1xuICBpZiAoaXNBcnJheUJ1ZmZlcihjaHVuaykgJiYgdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKVxuICAgIGNodW5rID0gbmV3IEJ1ZmZlcihuZXcgVWludDhBcnJheShjaHVuaykpO1xuICBcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpXG4gICAgZW5jb2RpbmcgPSAnYnVmZmVyJztcbiAgZWxzZSBpZiAoIWVuY29kaW5nKVxuICAgIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuXG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpXG4gICAgY2IgPSBmdW5jdGlvbigpIHt9O1xuXG4gIGlmIChzdGF0ZS5lbmRlZClcbiAgICB3cml0ZUFmdGVyRW5kKHRoaXMsIHN0YXRlLCBjYik7XG4gIGVsc2UgaWYgKHZhbGlkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBjYikpXG4gICAgcmV0ID0gd3JpdGVPckJ1ZmZlcih0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYik7XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbmZ1bmN0aW9uIGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpIHtcbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmXG4gICAgICBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJlxuICAgICAgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGNodW5rID0gbmV3IEJ1ZmZlcihjaHVuaywgZW5jb2RpbmcpO1xuICB9XG4gIHJldHVybiBjaHVuaztcbn1cblxuLy8gaWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cbmZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjaHVuayA9IGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpO1xuICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgc3RhdGUubGVuZ3RoICs9IGxlbjtcblxuICB2YXIgcmV0ID0gc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgc3RhdGUubmVlZERyYWluID0gIXJldDtcblxuICBpZiAoc3RhdGUud3JpdGluZylcbiAgICBzdGF0ZS5idWZmZXIucHVzaChuZXcgV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYikpO1xuICBlbHNlXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHN0YXRlLndyaXRlbGVuID0gbGVuO1xuICBzdGF0ZS53cml0ZWNiID0gY2I7XG4gIHN0YXRlLndyaXRpbmcgPSB0cnVlO1xuICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgc3RyZWFtLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIHN0YXRlLm9ud3JpdGUpO1xuICBzdGF0ZS5zeW5jID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpIHtcbiAgaWYgKHN5bmMpXG4gICAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkge1xuICAgICAgY2IoZXIpO1xuICAgIH0pO1xuICBlbHNlXG4gICAgY2IoZXIpO1xuXG4gIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbn1cblxuZnVuY3Rpb24gb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKSB7XG4gIHN0YXRlLndyaXRpbmcgPSBmYWxzZTtcbiAgc3RhdGUud3JpdGVjYiA9IG51bGw7XG4gIHN0YXRlLmxlbmd0aCAtPSBzdGF0ZS53cml0ZWxlbjtcbiAgc3RhdGUud3JpdGVsZW4gPSAwO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlKHN0cmVhbSwgZXIpIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgc3luYyA9IHN0YXRlLnN5bmM7XG4gIHZhciBjYiA9IHN0YXRlLndyaXRlY2I7XG5cbiAgb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKTtcblxuICBpZiAoZXIpXG4gICAgb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYik7XG4gIGVsc2Uge1xuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGFjdHVhbGx5IHJlYWR5IHRvIGZpbmlzaCwgYnV0IGRvbid0IGVtaXQgeWV0XG4gICAgdmFyIGZpbmlzaGVkID0gbmVlZEZpbmlzaChzdHJlYW0sIHN0YXRlKTtcblxuICAgIGlmICghZmluaXNoZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyLmxlbmd0aClcbiAgICAgIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpO1xuXG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIHNldEltbWVkaWF0ZShmdW5jdGlvbigpIHtcbiAgICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZClcbiAgICBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSk7XG4gIGNiKCk7XG4gIGlmIChmaW5pc2hlZClcbiAgICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuLy8gTXVzdCBmb3JjZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgb24gbmV4dFRpY2ssIHNvIHRoYXQgd2UgZG9uJ3Rcbi8vIGVtaXQgJ2RyYWluJyBiZWZvcmUgdGhlIHdyaXRlKCkgY29uc3VtZXIgZ2V0cyB0aGUgJ2ZhbHNlJyByZXR1cm5cbi8vIHZhbHVlLCBhbmQgaGFzIGEgY2hhbmNlIHRvIGF0dGFjaCBhICdkcmFpbicgbGlzdGVuZXIuXG5mdW5jdGlvbiBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLm5lZWREcmFpbikge1xuICAgIHN0YXRlLm5lZWREcmFpbiA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpO1xuICB9XG59XG5cblxuLy8gaWYgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nLCB0aGVuIHByb2Nlc3MgaXRcbmZ1bmN0aW9uIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IHRydWU7XG5cbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBzdGF0ZS5idWZmZXIubGVuZ3RoOyBjKyspIHtcbiAgICB2YXIgZW50cnkgPSBzdGF0ZS5idWZmZXJbY107XG4gICAgdmFyIGNodW5rID0gZW50cnkuY2h1bms7XG4gICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7XG4gICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuXG4gICAgLy8gaWYgd2UgZGlkbid0IGNhbGwgdGhlIG9ud3JpdGUgaW1tZWRpYXRlbHksIHRoZW5cbiAgICAvLyBpdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdCBkb2VzLlxuICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAvLyBiZWluZyBwcm9jZXNzZWQsIHNvIG1vdmUgdGhlIGJ1ZmZlciBjb3VudGVyIHBhc3QgdGhlbS5cbiAgICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgICAgYysrO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuICBpZiAoYyA8IHN0YXRlLmJ1ZmZlci5sZW5ndGgpXG4gICAgc3RhdGUuYnVmZmVyID0gc3RhdGUuYnVmZmVyLnNsaWNlKGMpO1xuICBlbHNlXG4gICAgc3RhdGUuYnVmZmVyLmxlbmd0aCA9IDA7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3VuZGVmaW5lZCcgJiYgY2h1bmsgIT09IG51bGwpXG4gICAgdGhpcy53cml0ZShjaHVuaywgZW5jb2RpbmcpO1xuXG4gIC8vIGlnbm9yZSB1bm5lY2Vzc2FyeSBlbmQoKSBjYWxscy5cbiAgaWYgKCFzdGF0ZS5lbmRpbmcgJiYgIXN0YXRlLmZpbmlzaGVkKVxuICAgIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5cbmZ1bmN0aW9uIG5lZWRGaW5pc2goc3RyZWFtLCBzdGF0ZSkge1xuICByZXR1cm4gKHN0YXRlLmVuZGluZyAmJlxuICAgICAgICAgIHN0YXRlLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICFzdGF0ZS5maW5pc2hlZCAmJlxuICAgICAgICAgICFzdGF0ZS53cml0aW5nKTtcbn1cblxuZnVuY3Rpb24gZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbmVlZCA9IG5lZWRGaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChuZWVkKSB7XG4gICAgc3RhdGUuZmluaXNoZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgfVxuICByZXR1cm4gbmVlZDtcbn1cblxuZnVuY3Rpb24gZW5kV3JpdGFibGUoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgc3RhdGUuZW5kaW5nID0gdHJ1ZTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChjYikge1xuICAgIGlmIChzdGF0ZS5maW5pc2hlZClcbiAgICAgIHNldEltbWVkaWF0ZShjYik7XG4gICAgZWxzZVxuICAgICAgc3RyZWFtLm9uY2UoJ2ZpbmlzaCcsIGNiKTtcbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxuZnVuY3Rpb24gYXNzZXJ0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgaWYgKGVuY29kaW5nICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIH1cbn1cblxudmFyIFN0cmluZ0RlY29kZXIgPSBleHBvcnRzLlN0cmluZ0RlY29kZXIgPSBmdW5jdGlvbihlbmNvZGluZykge1xuICB0aGlzLmVuY29kaW5nID0gKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywgJycpO1xuICBhc3NlcnRFbmNvZGluZyhlbmNvZGluZyk7XG4gIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgLy8gQ0VTVS04IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAzLWJ5dGVzXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICAvLyBVVEYtMTYgcmVwcmVzZW50cyBlYWNoIG9mIFN1cnJvZ2F0ZSBQYWlyIGJ5IDItYnl0ZXNcbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDI7XG4gICAgICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyID0gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAvLyBCYXNlLTY0IHN0b3JlcyAzIGJ5dGVzIGluIDQgY2hhcnMsIGFuZCBwYWRzIHRoZSByZW1haW5kZXIuXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMud3JpdGUgPSBwYXNzVGhyb3VnaFdyaXRlO1xuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5jaGFyQnVmZmVyID0gbmV3IEJ1ZmZlcig2KTtcbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSAwO1xuICB0aGlzLmNoYXJMZW5ndGggPSAwO1xufTtcblxuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgY2hhclN0ciA9ICcnO1xuICB2YXIgb2Zmc2V0ID0gMDtcblxuICAvLyBpZiBvdXIgbGFzdCB3cml0ZSBlbmRlZCB3aXRoIGFuIGluY29tcGxldGUgbXVsdGlieXRlIGNoYXJhY3RlclxuICB3aGlsZSAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IHJlbWFpbmluZyBieXRlcyB0aGlzIGJ1ZmZlciBoYXMgdG8gb2ZmZXIgZm9yIHRoaXMgY2hhclxuICAgIHZhciBpID0gKGJ1ZmZlci5sZW5ndGggPj0gdGhpcy5jaGFyTGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQpID9cbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCA6XG4gICAgICAgICAgICAgICAgYnVmZmVyLmxlbmd0aDtcblxuICAgIC8vIGFkZCB0aGUgbmV3IGJ5dGVzIHRvIHRoZSBjaGFyIGJ1ZmZlclxuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgdGhpcy5jaGFyUmVjZWl2ZWQsIG9mZnNldCwgaSk7XG4gICAgdGhpcy5jaGFyUmVjZWl2ZWQgKz0gKGkgLSBvZmZzZXQpO1xuICAgIG9mZnNldCA9IGk7XG5cbiAgICBpZiAodGhpcy5jaGFyUmVjZWl2ZWQgPCB0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAgIC8vIHN0aWxsIG5vdCBlbm91Z2ggY2hhcnMgaW4gdGhpcyBidWZmZXI/IHdhaXQgZm9yIG1vcmUgLi4uXG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHRoZSBjaGFyYWN0ZXIgdGhhdCB3YXMgc3BsaXRcbiAgICBjaGFyU3RyID0gdGhpcy5jaGFyQnVmZmVyLnNsaWNlKDAsIHRoaXMuY2hhckxlbmd0aCkudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG5cbiAgICAvLyBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuICAgIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChjaGFyU3RyLmxlbmd0aCAtIDEpO1xuICAgIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggKz0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgICAgY2hhclN0ciA9ICcnO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRoaXMuY2hhclJlY2VpdmVkID0gdGhpcy5jaGFyTGVuZ3RoID0gMDtcblxuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGJ5dGVzIGluIHRoaXMgYnVmZmVyLCBqdXN0IGVtaXQgb3VyIGNoYXJcbiAgICBpZiAoaSA9PSBidWZmZXIubGVuZ3RoKSByZXR1cm4gY2hhclN0cjtcblxuICAgIC8vIG90aGVyd2lzZSBjdXQgb2ZmIHRoZSBjaGFyYWN0ZXJzIGVuZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBidWZmZXJcbiAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoaSwgYnVmZmVyLmxlbmd0aCk7XG4gICAgYnJlYWs7XG4gIH1cblxuICB2YXIgbGVuSW5jb21wbGV0ZSA9IHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKTtcblxuICB2YXIgZW5kID0gYnVmZmVyLmxlbmd0aDtcbiAgaWYgKHRoaXMuY2hhckxlbmd0aCkge1xuICAgIC8vIGJ1ZmZlciB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXIgYnl0ZXMgd2UgZ290XG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoIC0gbGVuSW5jb21wbGV0ZSwgZW5kKTtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCA9IGxlbkluY29tcGxldGU7XG4gICAgZW5kIC09IGxlbkluY29tcGxldGU7XG4gIH1cblxuICBjaGFyU3RyICs9IGJ1ZmZlci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCBlbmQpO1xuXG4gIHZhciBlbmQgPSBjaGFyU3RyLmxlbmd0aCAtIDE7XG4gIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChlbmQpO1xuICAvLyBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuICBpZiAoY2hhckNvZGUgPj0gMHhEODAwICYmIGNoYXJDb2RlIDw9IDB4REJGRikge1xuICAgIHZhciBzaXplID0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgIHRoaXMuY2hhckxlbmd0aCArPSBzaXplO1xuICAgIHRoaXMuY2hhclJlY2VpdmVkICs9IHNpemU7XG4gICAgdGhpcy5jaGFyQnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCBzaXplLCAwLCBzaXplKTtcbiAgICB0aGlzLmNoYXJCdWZmZXIud3JpdGUoY2hhclN0ci5jaGFyQXQoY2hhclN0ci5sZW5ndGggLSAxKSwgdGhpcy5lbmNvZGluZyk7XG4gICAgcmV0dXJuIGNoYXJTdHIuc3Vic3RyaW5nKDAsIGVuZCk7XG4gIH1cblxuICAvLyBvciBqdXN0IGVtaXQgdGhlIGNoYXJTdHJcbiAgcmV0dXJuIGNoYXJTdHI7XG59O1xuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAvLyBkZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgd2UgaGF2ZSB0byBjaGVjayBhdCB0aGUgZW5kIG9mIHRoaXMgYnVmZmVyXG4gIHZhciBpID0gKGJ1ZmZlci5sZW5ndGggPj0gMykgPyAzIDogYnVmZmVyLmxlbmd0aDtcblxuICAvLyBGaWd1cmUgb3V0IGlmIG9uZSBvZiB0aGUgbGFzdCBpIGJ5dGVzIG9mIG91ciBidWZmZXIgYW5ub3VuY2VzIGFuXG4gIC8vIGluY29tcGxldGUgY2hhci5cbiAgZm9yICg7IGkgPiAwOyBpLS0pIHtcbiAgICB2YXIgYyA9IGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gaV07XG5cbiAgICAvLyBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtOCNEZXNjcmlwdGlvblxuXG4gICAgLy8gMTEwWFhYWFhcbiAgICBpZiAoaSA9PSAxICYmIGMgPj4gNSA9PSAweDA2KSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAyO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMFhYWFhcbiAgICBpZiAoaSA8PSAyICYmIGMgPj4gNCA9PSAweDBFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAzO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMTBYWFhcbiAgICBpZiAoaSA8PSAzICYmIGMgPj4gMyA9PSAweDFFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSA0O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGk7XG59O1xuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBpZiAoYnVmZmVyICYmIGJ1ZmZlci5sZW5ndGgpXG4gICAgcmVzID0gdGhpcy53cml0ZShidWZmZXIpO1xuXG4gIGlmICh0aGlzLmNoYXJSZWNlaXZlZCkge1xuICAgIHZhciBjciA9IHRoaXMuY2hhclJlY2VpdmVkO1xuICAgIHZhciBidWYgPSB0aGlzLmNoYXJCdWZmZXI7XG4gICAgdmFyIGVuYyA9IHRoaXMuZW5jb2Rpbmc7XG4gICAgcmVzICs9IGJ1Zi5zbGljZSgwLCBjcikudG9TdHJpbmcoZW5jKTtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuXG5mdW5jdGlvbiBwYXNzVGhyb3VnaFdyaXRlKGJ1ZmZlcikge1xuICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xufVxuXG5mdW5jdGlvbiB1dGYxNkRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB2YXIgaW5jb21wbGV0ZSA9IHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDI7XG4gIHRoaXMuY2hhckxlbmd0aCA9IGluY29tcGxldGUgPyAyIDogMDtcbiAgcmV0dXJuIGluY29tcGxldGU7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB2YXIgaW5jb21wbGV0ZSA9IHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDM7XG4gIHRoaXMuY2hhckxlbmd0aCA9IGluY29tcGxldGUgPyAzIDogMDtcbiAgcmV0dXJuIGluY29tcGxldGU7XG59XG4iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCdWZmZXIoYXJnKSB7XG4gIHJldHVybiBhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCdcbiAgICAmJiB0eXBlb2YgYXJnLmNvcHkgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLmZpbGwgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLnJlYWRVSW50OCA9PT0gJ2Z1bmN0aW9uJztcbn0iLCIoZnVuY3Rpb24gKHByb2Nlc3MsZ2xvYmFsKXtcbi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxufSkuY2FsbCh0aGlzLHJlcXVpcmUoXCJLbGl1YkhcIiksdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KSJdfQ==
9746</script></body></html>