@adstore/templates 2.1.9 → 2.1.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,516 +0,0 @@
1
- var resizeObservers = [];
2
- var hasActiveObservations = function() {
3
- return resizeObservers.some(function(ro) {
4
- return ro.activeTargets.length > 0;
5
- });
6
- };
7
- var hasSkippedObservations = function() {
8
- return resizeObservers.some(function(ro) {
9
- return ro.skippedTargets.length > 0;
10
- });
11
- };
12
- var msg = "ResizeObserver loop completed with undelivered notifications.";
13
- var deliverResizeLoopError = function() {
14
- var event;
15
- if (typeof ErrorEvent === "function") {
16
- event = new ErrorEvent("error", {
17
- message: msg
18
- });
19
- } else {
20
- event = document.createEvent("Event");
21
- event.initEvent("error", false, false);
22
- event.message = msg;
23
- }
24
- window.dispatchEvent(event);
25
- };
26
- var ResizeObserverBoxOptions;
27
- (function(ResizeObserverBoxOptions2) {
28
- ResizeObserverBoxOptions2["BORDER_BOX"] = "border-box";
29
- ResizeObserverBoxOptions2["CONTENT_BOX"] = "content-box";
30
- ResizeObserverBoxOptions2["DEVICE_PIXEL_CONTENT_BOX"] = "device-pixel-content-box";
31
- })(ResizeObserverBoxOptions || (ResizeObserverBoxOptions = {}));
32
- var freeze = function(obj) {
33
- return Object.freeze(obj);
34
- };
35
- var ResizeObserverSize = function() {
36
- function ResizeObserverSize2(inlineSize, blockSize) {
37
- this.inlineSize = inlineSize;
38
- this.blockSize = blockSize;
39
- freeze(this);
40
- }
41
- return ResizeObserverSize2;
42
- }();
43
- var DOMRectReadOnly = function() {
44
- function DOMRectReadOnly2(x, y, width, height) {
45
- this.x = x;
46
- this.y = y;
47
- this.width = width;
48
- this.height = height;
49
- this.top = this.y;
50
- this.left = this.x;
51
- this.bottom = this.top + this.height;
52
- this.right = this.left + this.width;
53
- return freeze(this);
54
- }
55
- DOMRectReadOnly2.prototype.toJSON = function() {
56
- var _a = this, x = _a.x, y = _a.y, top = _a.top, right = _a.right, bottom = _a.bottom, left = _a.left, width = _a.width, height = _a.height;
57
- return { x, y, top, right, bottom, left, width, height };
58
- };
59
- DOMRectReadOnly2.fromRect = function(rectangle) {
60
- return new DOMRectReadOnly2(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
61
- };
62
- return DOMRectReadOnly2;
63
- }();
64
- var isSVG = function(target) {
65
- return target instanceof SVGElement && "getBBox" in target;
66
- };
67
- var isHidden = function(target) {
68
- if (isSVG(target)) {
69
- var _a = target.getBBox(), width = _a.width, height = _a.height;
70
- return !width && !height;
71
- }
72
- var _b = target, offsetWidth = _b.offsetWidth, offsetHeight = _b.offsetHeight;
73
- return !(offsetWidth || offsetHeight || target.getClientRects().length);
74
- };
75
- var isElement = function(obj) {
76
- var _a;
77
- if (obj instanceof Element) {
78
- return true;
79
- }
80
- var scope = (_a = obj === null || obj === void 0 ? void 0 : obj.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView;
81
- return !!(scope && obj instanceof scope.Element);
82
- };
83
- var isReplacedElement = function(target) {
84
- switch (target.tagName) {
85
- case "INPUT":
86
- if (target.type !== "image") {
87
- break;
88
- }
89
- case "VIDEO":
90
- case "AUDIO":
91
- case "EMBED":
92
- case "OBJECT":
93
- case "CANVAS":
94
- case "IFRAME":
95
- case "IMG":
96
- return true;
97
- }
98
- return false;
99
- };
100
- var global = typeof window !== "undefined" ? window : {};
101
- var cache = /* @__PURE__ */ new WeakMap();
102
- var scrollRegexp = /auto|scroll/;
103
- var verticalRegexp = /^tb|vertical/;
104
- var IE = /msie|trident/i.test(global.navigator && global.navigator.userAgent);
105
- var parseDimension = function(pixel) {
106
- return parseFloat(pixel || "0");
107
- };
108
- var size = function(inlineSize, blockSize, switchSizes) {
109
- if (inlineSize === void 0) {
110
- inlineSize = 0;
111
- }
112
- if (blockSize === void 0) {
113
- blockSize = 0;
114
- }
115
- if (switchSizes === void 0) {
116
- switchSizes = false;
117
- }
118
- return new ResizeObserverSize((switchSizes ? blockSize : inlineSize) || 0, (switchSizes ? inlineSize : blockSize) || 0);
119
- };
120
- var zeroBoxes = freeze({
121
- devicePixelContentBoxSize: size(),
122
- borderBoxSize: size(),
123
- contentBoxSize: size(),
124
- contentRect: new DOMRectReadOnly(0, 0, 0, 0)
125
- });
126
- var calculateBoxSizes = function(target, forceRecalculation) {
127
- if (forceRecalculation === void 0) {
128
- forceRecalculation = false;
129
- }
130
- if (cache.has(target) && !forceRecalculation) {
131
- return cache.get(target);
132
- }
133
- if (isHidden(target)) {
134
- cache.set(target, zeroBoxes);
135
- return zeroBoxes;
136
- }
137
- var cs = getComputedStyle(target);
138
- var svg = isSVG(target) && target.ownerSVGElement && target.getBBox();
139
- var removePadding = !IE && cs.boxSizing === "border-box";
140
- var switchSizes = verticalRegexp.test(cs.writingMode || "");
141
- var canScrollVertically = !svg && scrollRegexp.test(cs.overflowY || "");
142
- var canScrollHorizontally = !svg && scrollRegexp.test(cs.overflowX || "");
143
- var paddingTop = svg ? 0 : parseDimension(cs.paddingTop);
144
- var paddingRight = svg ? 0 : parseDimension(cs.paddingRight);
145
- var paddingBottom = svg ? 0 : parseDimension(cs.paddingBottom);
146
- var paddingLeft = svg ? 0 : parseDimension(cs.paddingLeft);
147
- var borderTop = svg ? 0 : parseDimension(cs.borderTopWidth);
148
- var borderRight = svg ? 0 : parseDimension(cs.borderRightWidth);
149
- var borderBottom = svg ? 0 : parseDimension(cs.borderBottomWidth);
150
- var borderLeft = svg ? 0 : parseDimension(cs.borderLeftWidth);
151
- var horizontalPadding = paddingLeft + paddingRight;
152
- var verticalPadding = paddingTop + paddingBottom;
153
- var horizontalBorderArea = borderLeft + borderRight;
154
- var verticalBorderArea = borderTop + borderBottom;
155
- var horizontalScrollbarThickness = !canScrollHorizontally ? 0 : target.offsetHeight - verticalBorderArea - target.clientHeight;
156
- var verticalScrollbarThickness = !canScrollVertically ? 0 : target.offsetWidth - horizontalBorderArea - target.clientWidth;
157
- var widthReduction = removePadding ? horizontalPadding + horizontalBorderArea : 0;
158
- var heightReduction = removePadding ? verticalPadding + verticalBorderArea : 0;
159
- var contentWidth = svg ? svg.width : parseDimension(cs.width) - widthReduction - verticalScrollbarThickness;
160
- var contentHeight = svg ? svg.height : parseDimension(cs.height) - heightReduction - horizontalScrollbarThickness;
161
- var borderBoxWidth = contentWidth + horizontalPadding + verticalScrollbarThickness + horizontalBorderArea;
162
- var borderBoxHeight = contentHeight + verticalPadding + horizontalScrollbarThickness + verticalBorderArea;
163
- var boxes = freeze({
164
- devicePixelContentBoxSize: size(Math.round(contentWidth * devicePixelRatio), Math.round(contentHeight * devicePixelRatio), switchSizes),
165
- borderBoxSize: size(borderBoxWidth, borderBoxHeight, switchSizes),
166
- contentBoxSize: size(contentWidth, contentHeight, switchSizes),
167
- contentRect: new DOMRectReadOnly(paddingLeft, paddingTop, contentWidth, contentHeight)
168
- });
169
- cache.set(target, boxes);
170
- return boxes;
171
- };
172
- var calculateBoxSize = function(target, observedBox, forceRecalculation) {
173
- var _a = calculateBoxSizes(target, forceRecalculation), borderBoxSize = _a.borderBoxSize, contentBoxSize = _a.contentBoxSize, devicePixelContentBoxSize = _a.devicePixelContentBoxSize;
174
- switch (observedBox) {
175
- case ResizeObserverBoxOptions.DEVICE_PIXEL_CONTENT_BOX:
176
- return devicePixelContentBoxSize;
177
- case ResizeObserverBoxOptions.BORDER_BOX:
178
- return borderBoxSize;
179
- default:
180
- return contentBoxSize;
181
- }
182
- };
183
- var ResizeObserverEntry = function() {
184
- function ResizeObserverEntry2(target) {
185
- var boxes = calculateBoxSizes(target);
186
- this.target = target;
187
- this.contentRect = boxes.contentRect;
188
- this.borderBoxSize = freeze([boxes.borderBoxSize]);
189
- this.contentBoxSize = freeze([boxes.contentBoxSize]);
190
- this.devicePixelContentBoxSize = freeze([boxes.devicePixelContentBoxSize]);
191
- }
192
- return ResizeObserverEntry2;
193
- }();
194
- var calculateDepthForNode = function(node) {
195
- if (isHidden(node)) {
196
- return Infinity;
197
- }
198
- var depth = 0;
199
- var parent = node.parentNode;
200
- while (parent) {
201
- depth += 1;
202
- parent = parent.parentNode;
203
- }
204
- return depth;
205
- };
206
- var broadcastActiveObservations = function() {
207
- var shallowestDepth = Infinity;
208
- var callbacks2 = [];
209
- resizeObservers.forEach(function processObserver(ro) {
210
- if (ro.activeTargets.length === 0) {
211
- return;
212
- }
213
- var entries = [];
214
- ro.activeTargets.forEach(function processTarget(ot) {
215
- var entry = new ResizeObserverEntry(ot.target);
216
- var targetDepth = calculateDepthForNode(ot.target);
217
- entries.push(entry);
218
- ot.lastReportedSize = calculateBoxSize(ot.target, ot.observedBox);
219
- if (targetDepth < shallowestDepth) {
220
- shallowestDepth = targetDepth;
221
- }
222
- });
223
- callbacks2.push(function resizeObserverCallback() {
224
- ro.callback.call(ro.observer, entries, ro.observer);
225
- });
226
- ro.activeTargets.splice(0, ro.activeTargets.length);
227
- });
228
- for (var _i = 0, callbacks_1 = callbacks2; _i < callbacks_1.length; _i++) {
229
- var callback = callbacks_1[_i];
230
- callback();
231
- }
232
- return shallowestDepth;
233
- };
234
- var gatherActiveObservationsAtDepth = function(depth) {
235
- resizeObservers.forEach(function processObserver(ro) {
236
- ro.activeTargets.splice(0, ro.activeTargets.length);
237
- ro.skippedTargets.splice(0, ro.skippedTargets.length);
238
- ro.observationTargets.forEach(function processTarget(ot) {
239
- if (ot.isActive()) {
240
- if (calculateDepthForNode(ot.target) > depth) {
241
- ro.activeTargets.push(ot);
242
- } else {
243
- ro.skippedTargets.push(ot);
244
- }
245
- }
246
- });
247
- });
248
- };
249
- var process = function() {
250
- var depth = 0;
251
- gatherActiveObservationsAtDepth(depth);
252
- while (hasActiveObservations()) {
253
- depth = broadcastActiveObservations();
254
- gatherActiveObservationsAtDepth(depth);
255
- }
256
- if (hasSkippedObservations()) {
257
- deliverResizeLoopError();
258
- }
259
- return depth > 0;
260
- };
261
- var trigger;
262
- var callbacks = [];
263
- var notify = function() {
264
- return callbacks.splice(0).forEach(function(cb) {
265
- return cb();
266
- });
267
- };
268
- var queueMicroTask = function(callback) {
269
- if (!trigger) {
270
- var toggle_1 = 0;
271
- var el_1 = document.createTextNode("");
272
- var config = { characterData: true };
273
- new MutationObserver(function() {
274
- return notify();
275
- }).observe(el_1, config);
276
- trigger = function() {
277
- el_1.textContent = "".concat(toggle_1 ? toggle_1-- : toggle_1++);
278
- };
279
- }
280
- callbacks.push(callback);
281
- trigger();
282
- };
283
- var queueResizeObserver = function(cb) {
284
- queueMicroTask(function ResizeObserver2() {
285
- requestAnimationFrame(cb);
286
- });
287
- };
288
- var watching = 0;
289
- var isWatching = function() {
290
- return !!watching;
291
- };
292
- var CATCH_PERIOD = 250;
293
- var observerConfig = { attributes: true, characterData: true, childList: true, subtree: true };
294
- var events = [
295
- "resize",
296
- "load",
297
- "transitionend",
298
- "animationend",
299
- "animationstart",
300
- "animationiteration",
301
- "keyup",
302
- "keydown",
303
- "mouseup",
304
- "mousedown",
305
- "mouseover",
306
- "mouseout",
307
- "blur",
308
- "focus"
309
- ];
310
- var time = function(timeout) {
311
- if (timeout === void 0) {
312
- timeout = 0;
313
- }
314
- return Date.now() + timeout;
315
- };
316
- var scheduled = false;
317
- var Scheduler = function() {
318
- function Scheduler2() {
319
- var _this = this;
320
- this.stopped = true;
321
- this.listener = function() {
322
- return _this.schedule();
323
- };
324
- }
325
- Scheduler2.prototype.run = function(timeout) {
326
- var _this = this;
327
- if (timeout === void 0) {
328
- timeout = CATCH_PERIOD;
329
- }
330
- if (scheduled) {
331
- return;
332
- }
333
- scheduled = true;
334
- var until = time(timeout);
335
- queueResizeObserver(function() {
336
- var elementsHaveResized = false;
337
- try {
338
- elementsHaveResized = process();
339
- } finally {
340
- scheduled = false;
341
- timeout = until - time();
342
- if (!isWatching()) {
343
- return;
344
- }
345
- if (elementsHaveResized) {
346
- _this.run(1e3);
347
- } else if (timeout > 0) {
348
- _this.run(timeout);
349
- } else {
350
- _this.start();
351
- }
352
- }
353
- });
354
- };
355
- Scheduler2.prototype.schedule = function() {
356
- this.stop();
357
- this.run();
358
- };
359
- Scheduler2.prototype.observe = function() {
360
- var _this = this;
361
- var cb = function() {
362
- return _this.observer && _this.observer.observe(document.body, observerConfig);
363
- };
364
- document.body ? cb() : global.addEventListener("DOMContentLoaded", cb);
365
- };
366
- Scheduler2.prototype.start = function() {
367
- var _this = this;
368
- if (this.stopped) {
369
- this.stopped = false;
370
- this.observer = new MutationObserver(this.listener);
371
- this.observe();
372
- events.forEach(function(name) {
373
- return global.addEventListener(name, _this.listener, true);
374
- });
375
- }
376
- };
377
- Scheduler2.prototype.stop = function() {
378
- var _this = this;
379
- if (!this.stopped) {
380
- this.observer && this.observer.disconnect();
381
- events.forEach(function(name) {
382
- return global.removeEventListener(name, _this.listener, true);
383
- });
384
- this.stopped = true;
385
- }
386
- };
387
- return Scheduler2;
388
- }();
389
- var scheduler = new Scheduler();
390
- var updateCount = function(n) {
391
- !watching && n > 0 && scheduler.start();
392
- watching += n;
393
- !watching && scheduler.stop();
394
- };
395
- var skipNotifyOnElement = function(target) {
396
- return !isSVG(target) && !isReplacedElement(target) && getComputedStyle(target).display === "inline";
397
- };
398
- var ResizeObservation = function() {
399
- function ResizeObservation2(target, observedBox) {
400
- this.target = target;
401
- this.observedBox = observedBox || ResizeObserverBoxOptions.CONTENT_BOX;
402
- this.lastReportedSize = {
403
- inlineSize: 0,
404
- blockSize: 0
405
- };
406
- }
407
- ResizeObservation2.prototype.isActive = function() {
408
- var size2 = calculateBoxSize(this.target, this.observedBox, true);
409
- if (skipNotifyOnElement(this.target)) {
410
- this.lastReportedSize = size2;
411
- }
412
- if (this.lastReportedSize.inlineSize !== size2.inlineSize || this.lastReportedSize.blockSize !== size2.blockSize) {
413
- return true;
414
- }
415
- return false;
416
- };
417
- return ResizeObservation2;
418
- }();
419
- var ResizeObserverDetail = function() {
420
- function ResizeObserverDetail2(resizeObserver, callback) {
421
- this.activeTargets = [];
422
- this.skippedTargets = [];
423
- this.observationTargets = [];
424
- this.observer = resizeObserver;
425
- this.callback = callback;
426
- }
427
- return ResizeObserverDetail2;
428
- }();
429
- var observerMap = /* @__PURE__ */ new WeakMap();
430
- var getObservationIndex = function(observationTargets, target) {
431
- for (var i = 0; i < observationTargets.length; i += 1) {
432
- if (observationTargets[i].target === target) {
433
- return i;
434
- }
435
- }
436
- return -1;
437
- };
438
- var ResizeObserverController = function() {
439
- function ResizeObserverController2() {
440
- }
441
- ResizeObserverController2.connect = function(resizeObserver, callback) {
442
- var detail = new ResizeObserverDetail(resizeObserver, callback);
443
- observerMap.set(resizeObserver, detail);
444
- };
445
- ResizeObserverController2.observe = function(resizeObserver, target, options) {
446
- var detail = observerMap.get(resizeObserver);
447
- var firstObservation = detail.observationTargets.length === 0;
448
- if (getObservationIndex(detail.observationTargets, target) < 0) {
449
- firstObservation && resizeObservers.push(detail);
450
- detail.observationTargets.push(new ResizeObservation(target, options && options.box));
451
- updateCount(1);
452
- scheduler.schedule();
453
- }
454
- };
455
- ResizeObserverController2.unobserve = function(resizeObserver, target) {
456
- var detail = observerMap.get(resizeObserver);
457
- var index = getObservationIndex(detail.observationTargets, target);
458
- var lastObservation = detail.observationTargets.length === 1;
459
- if (index >= 0) {
460
- lastObservation && resizeObservers.splice(resizeObservers.indexOf(detail), 1);
461
- detail.observationTargets.splice(index, 1);
462
- updateCount(-1);
463
- }
464
- };
465
- ResizeObserverController2.disconnect = function(resizeObserver) {
466
- var _this = this;
467
- var detail = observerMap.get(resizeObserver);
468
- detail.observationTargets.slice().forEach(function(ot) {
469
- return _this.unobserve(resizeObserver, ot.target);
470
- });
471
- detail.activeTargets.splice(0, detail.activeTargets.length);
472
- };
473
- return ResizeObserverController2;
474
- }();
475
- var ResizeObserver = function() {
476
- function ResizeObserver2(callback) {
477
- if (arguments.length === 0) {
478
- throw new TypeError("Failed to construct 'ResizeObserver': 1 argument required, but only 0 present.");
479
- }
480
- if (typeof callback !== "function") {
481
- throw new TypeError("Failed to construct 'ResizeObserver': The callback provided as parameter 1 is not a function.");
482
- }
483
- ResizeObserverController.connect(this, callback);
484
- }
485
- ResizeObserver2.prototype.observe = function(target, options) {
486
- if (arguments.length === 0) {
487
- throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': 1 argument required, but only 0 present.");
488
- }
489
- if (!isElement(target)) {
490
- throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': parameter 1 is not of type 'Element");
491
- }
492
- ResizeObserverController.observe(this, target, options);
493
- };
494
- ResizeObserver2.prototype.unobserve = function(target) {
495
- if (arguments.length === 0) {
496
- throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': 1 argument required, but only 0 present.");
497
- }
498
- if (!isElement(target)) {
499
- throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': parameter 1 is not of type 'Element");
500
- }
501
- ResizeObserverController.unobserve(this, target);
502
- };
503
- ResizeObserver2.prototype.disconnect = function() {
504
- ResizeObserverController.disconnect(this);
505
- };
506
- ResizeObserver2.toString = function() {
507
- return "function ResizeObserver () { [polyfill code] }";
508
- };
509
- return ResizeObserver2;
510
- }();
511
- export {
512
- ResizeObserver,
513
- ResizeObserverEntry,
514
- ResizeObserverSize
515
- };
516
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLW9ic2VydmVyLTk2ZDU3MTVmLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQGp1Z2dsZS9yZXNpemUtb2JzZXJ2ZXIvbGliL3V0aWxzL3Jlc2l6ZU9ic2VydmVycy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AanVnZ2xlL3Jlc2l6ZS1vYnNlcnZlci9saWIvYWxnb3JpdGhtcy9oYXNBY3RpdmVPYnNlcnZhdGlvbnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQGp1Z2dsZS9yZXNpemUtb2JzZXJ2ZXIvbGliL2FsZ29yaXRobXMvaGFzU2tpcHBlZE9ic2VydmF0aW9ucy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AanVnZ2xlL3Jlc2l6ZS1vYnNlcnZlci9saWIvYWxnb3JpdGhtcy9kZWxpdmVyUmVzaXplTG9vcEVycm9yLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BqdWdnbGUvcmVzaXplLW9ic2VydmVyL2xpYi9SZXNpemVPYnNlcnZlckJveE9wdGlvbnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQGp1Z2dsZS9yZXNpemUtb2JzZXJ2ZXIvbGliL3V0aWxzL2ZyZWV6ZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AanVnZ2xlL3Jlc2l6ZS1vYnNlcnZlci9saWIvUmVzaXplT2JzZXJ2ZXJTaXplLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BqdWdnbGUvcmVzaXplLW9ic2VydmVyL2xpYi9ET01SZWN0UmVhZE9ubHkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQGp1Z2dsZS9yZXNpemUtb2JzZXJ2ZXIvbGliL3V0aWxzL2VsZW1lbnQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQGp1Z2dsZS9yZXNpemUtb2JzZXJ2ZXIvbGliL3V0aWxzL2dsb2JhbC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AanVnZ2xlL3Jlc2l6ZS1vYnNlcnZlci9saWIvYWxnb3JpdGhtcy9jYWxjdWxhdGVCb3hTaXplLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BqdWdnbGUvcmVzaXplLW9ic2VydmVyL2xpYi9SZXNpemVPYnNlcnZlckVudHJ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BqdWdnbGUvcmVzaXplLW9ic2VydmVyL2xpYi9hbGdvcml0aG1zL2NhbGN1bGF0ZURlcHRoRm9yTm9kZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AanVnZ2xlL3Jlc2l6ZS1vYnNlcnZlci9saWIvYWxnb3JpdGhtcy9icm9hZGNhc3RBY3RpdmVPYnNlcnZhdGlvbnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQGp1Z2dsZS9yZXNpemUtb2JzZXJ2ZXIvbGliL2FsZ29yaXRobXMvZ2F0aGVyQWN0aXZlT2JzZXJ2YXRpb25zQXREZXB0aC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AanVnZ2xlL3Jlc2l6ZS1vYnNlcnZlci9saWIvdXRpbHMvcHJvY2Vzcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AanVnZ2xlL3Jlc2l6ZS1vYnNlcnZlci9saWIvdXRpbHMvcXVldWVNaWNyb1Rhc2suanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQGp1Z2dsZS9yZXNpemUtb2JzZXJ2ZXIvbGliL3V0aWxzL3F1ZXVlUmVzaXplT2JzZXJ2ZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQGp1Z2dsZS9yZXNpemUtb2JzZXJ2ZXIvbGliL3V0aWxzL3NjaGVkdWxlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AanVnZ2xlL3Jlc2l6ZS1vYnNlcnZlci9saWIvUmVzaXplT2JzZXJ2YXRpb24uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQGp1Z2dsZS9yZXNpemUtb2JzZXJ2ZXIvbGliL1Jlc2l6ZU9ic2VydmVyRGV0YWlsLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BqdWdnbGUvcmVzaXplLW9ic2VydmVyL2xpYi9SZXNpemVPYnNlcnZlckNvbnRyb2xsZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQGp1Z2dsZS9yZXNpemUtb2JzZXJ2ZXIvbGliL1Jlc2l6ZU9ic2VydmVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciByZXNpemVPYnNlcnZlcnMgPSBbXTtcbmV4cG9ydCB7IHJlc2l6ZU9ic2VydmVycyB9O1xuIiwiaW1wb3J0IHsgcmVzaXplT2JzZXJ2ZXJzIH0gZnJvbSAnLi4vdXRpbHMvcmVzaXplT2JzZXJ2ZXJzJztcbnZhciBoYXNBY3RpdmVPYnNlcnZhdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJlc2l6ZU9ic2VydmVycy5zb21lKGZ1bmN0aW9uIChybykgeyByZXR1cm4gcm8uYWN0aXZlVGFyZ2V0cy5sZW5ndGggPiAwOyB9KTtcbn07XG5leHBvcnQgeyBoYXNBY3RpdmVPYnNlcnZhdGlvbnMgfTtcbiIsImltcG9ydCB7IHJlc2l6ZU9ic2VydmVycyB9IGZyb20gJy4uL3V0aWxzL3Jlc2l6ZU9ic2VydmVycyc7XG52YXIgaGFzU2tpcHBlZE9ic2VydmF0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcmVzaXplT2JzZXJ2ZXJzLnNvbWUoZnVuY3Rpb24gKHJvKSB7IHJldHVybiByby5za2lwcGVkVGFyZ2V0cy5sZW5ndGggPiAwOyB9KTtcbn07XG5leHBvcnQgeyBoYXNTa2lwcGVkT2JzZXJ2YXRpb25zIH07XG4iLCJ2YXIgbXNnID0gJ1Jlc2l6ZU9ic2VydmVyIGxvb3AgY29tcGxldGVkIHdpdGggdW5kZWxpdmVyZWQgbm90aWZpY2F0aW9ucy4nO1xudmFyIGRlbGl2ZXJSZXNpemVMb29wRXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV2ZW50O1xuICAgIGlmICh0eXBlb2YgRXJyb3JFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBldmVudCA9IG5ldyBFcnJvckV2ZW50KCdlcnJvcicsIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IG1zZ1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgICAgIGV2ZW50LmluaXRFdmVudCgnZXJyb3InLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICBldmVudC5tZXNzYWdlID0gbXNnO1xuICAgIH1cbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChldmVudCk7XG59O1xuZXhwb3J0IHsgZGVsaXZlclJlc2l6ZUxvb3BFcnJvciB9O1xuIiwidmFyIFJlc2l6ZU9ic2VydmVyQm94T3B0aW9ucztcbihmdW5jdGlvbiAoUmVzaXplT2JzZXJ2ZXJCb3hPcHRpb25zKSB7XG4gICAgUmVzaXplT2JzZXJ2ZXJCb3hPcHRpb25zW1wiQk9SREVSX0JPWFwiXSA9IFwiYm9yZGVyLWJveFwiO1xuICAgIFJlc2l6ZU9ic2VydmVyQm94T3B0aW9uc1tcIkNPTlRFTlRfQk9YXCJdID0gXCJjb250ZW50LWJveFwiO1xuICAgIFJlc2l6ZU9ic2VydmVyQm94T3B0aW9uc1tcIkRFVklDRV9QSVhFTF9DT05URU5UX0JPWFwiXSA9IFwiZGV2aWNlLXBpeGVsLWNvbnRlbnQtYm94XCI7XG59KShSZXNpemVPYnNlcnZlckJveE9wdGlvbnMgfHwgKFJlc2l6ZU9ic2VydmVyQm94T3B0aW9ucyA9IHt9KSk7XG5leHBvcnQgeyBSZXNpemVPYnNlcnZlckJveE9wdGlvbnMgfTtcbiIsImV4cG9ydCB2YXIgZnJlZXplID0gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gT2JqZWN0LmZyZWV6ZShvYmopOyB9O1xuIiwiaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi91dGlscy9mcmVlemUnO1xudmFyIFJlc2l6ZU9ic2VydmVyU2l6ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmVzaXplT2JzZXJ2ZXJTaXplKGlubGluZVNpemUsIGJsb2NrU2l6ZSkge1xuICAgICAgICB0aGlzLmlubGluZVNpemUgPSBpbmxpbmVTaXplO1xuICAgICAgICB0aGlzLmJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTtcbiAgICAgICAgZnJlZXplKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gUmVzaXplT2JzZXJ2ZXJTaXplO1xufSgpKTtcbmV4cG9ydCB7IFJlc2l6ZU9ic2VydmVyU2l6ZSB9O1xuIiwiaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi91dGlscy9mcmVlemUnO1xudmFyIERPTVJlY3RSZWFkT25seSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRE9NUmVjdFJlYWRPbmx5KHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGhpcy50b3AgPSB0aGlzLnk7XG4gICAgICAgIHRoaXMubGVmdCA9IHRoaXMueDtcbiAgICAgICAgdGhpcy5ib3R0b20gPSB0aGlzLnRvcCArIHRoaXMuaGVpZ2h0O1xuICAgICAgICB0aGlzLnJpZ2h0ID0gdGhpcy5sZWZ0ICsgdGhpcy53aWR0aDtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh0aGlzKTtcbiAgICB9XG4gICAgRE9NUmVjdFJlYWRPbmx5LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHggPSBfYS54LCB5ID0gX2EueSwgdG9wID0gX2EudG9wLCByaWdodCA9IF9hLnJpZ2h0LCBib3R0b20gPSBfYS5ib3R0b20sIGxlZnQgPSBfYS5sZWZ0LCB3aWR0aCA9IF9hLndpZHRoLCBoZWlnaHQgPSBfYS5oZWlnaHQ7XG4gICAgICAgIHJldHVybiB7IHg6IHgsIHk6IHksIHRvcDogdG9wLCByaWdodDogcmlnaHQsIGJvdHRvbTogYm90dG9tLCBsZWZ0OiBsZWZ0LCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG4gICAgfTtcbiAgICBET01SZWN0UmVhZE9ubHkuZnJvbVJlY3QgPSBmdW5jdGlvbiAocmVjdGFuZ2xlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRE9NUmVjdFJlYWRPbmx5KHJlY3RhbmdsZS54LCByZWN0YW5nbGUueSwgcmVjdGFuZ2xlLndpZHRoLCByZWN0YW5nbGUuaGVpZ2h0KTtcbiAgICB9O1xuICAgIHJldHVybiBET01SZWN0UmVhZE9ubHk7XG59KCkpO1xuZXhwb3J0IHsgRE9NUmVjdFJlYWRPbmx5IH07XG4iLCJ2YXIgaXNTVkcgPSBmdW5jdGlvbiAodGFyZ2V0KSB7IHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBTVkdFbGVtZW50ICYmICdnZXRCQm94JyBpbiB0YXJnZXQ7IH07XG52YXIgaXNIaWRkZW4gPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgaWYgKGlzU1ZHKHRhcmdldCkpIHtcbiAgICAgICAgdmFyIF9hID0gdGFyZ2V0LmdldEJCb3goKSwgd2lkdGggPSBfYS53aWR0aCwgaGVpZ2h0ID0gX2EuaGVpZ2h0O1xuICAgICAgICByZXR1cm4gIXdpZHRoICYmICFoZWlnaHQ7XG4gICAgfVxuICAgIHZhciBfYiA9IHRhcmdldCwgb2Zmc2V0V2lkdGggPSBfYi5vZmZzZXRXaWR0aCwgb2Zmc2V0SGVpZ2h0ID0gX2Iub2Zmc2V0SGVpZ2h0O1xuICAgIHJldHVybiAhKG9mZnNldFdpZHRoIHx8IG9mZnNldEhlaWdodCB8fCB0YXJnZXQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpO1xufTtcbnZhciBpc0VsZW1lbnQgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgc2NvcGUgPSAoX2EgPSBvYmogPT09IG51bGwgfHwgb2JqID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvYmoub3duZXJEb2N1bWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlZmF1bHRWaWV3O1xuICAgIHJldHVybiAhIShzY29wZSAmJiBvYmogaW5zdGFuY2VvZiBzY29wZS5FbGVtZW50KTtcbn07XG52YXIgaXNSZXBsYWNlZEVsZW1lbnQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgc3dpdGNoICh0YXJnZXQudGFnTmFtZSkge1xuICAgICAgICBjYXNlICdJTlBVVCc6XG4gICAgICAgICAgICBpZiAodGFyZ2V0LnR5cGUgIT09ICdpbWFnZScpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnVklERU8nOlxuICAgICAgICBjYXNlICdBVURJTyc6XG4gICAgICAgIGNhc2UgJ0VNQkVEJzpcbiAgICAgICAgY2FzZSAnT0JKRUNUJzpcbiAgICAgICAgY2FzZSAnQ0FOVkFTJzpcbiAgICAgICAgY2FzZSAnSUZSQU1FJzpcbiAgICAgICAgY2FzZSAnSU1HJzpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuZXhwb3J0IHsgaXNTVkcsIGlzSGlkZGVuLCBpc0VsZW1lbnQsIGlzUmVwbGFjZWRFbGVtZW50IH07XG4iLCJleHBvcnQgdmFyIGdsb2JhbCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDoge307XG4iLCJpbXBvcnQgeyBSZXNpemVPYnNlcnZlckJveE9wdGlvbnMgfSBmcm9tICcuLi9SZXNpemVPYnNlcnZlckJveE9wdGlvbnMnO1xuaW1wb3J0IHsgUmVzaXplT2JzZXJ2ZXJTaXplIH0gZnJvbSAnLi4vUmVzaXplT2JzZXJ2ZXJTaXplJztcbmltcG9ydCB7IERPTVJlY3RSZWFkT25seSB9IGZyb20gJy4uL0RPTVJlY3RSZWFkT25seSc7XG5pbXBvcnQgeyBpc1NWRywgaXNIaWRkZW4gfSBmcm9tICcuLi91dGlscy9lbGVtZW50JztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWxzL2ZyZWV6ZSc7XG5pbXBvcnQgeyBnbG9iYWwgfSBmcm9tICcuLi91dGlscy9nbG9iYWwnO1xudmFyIGNhY2hlID0gbmV3IFdlYWtNYXAoKTtcbnZhciBzY3JvbGxSZWdleHAgPSAvYXV0b3xzY3JvbGwvO1xudmFyIHZlcnRpY2FsUmVnZXhwID0gL150Ynx2ZXJ0aWNhbC87XG52YXIgSUUgPSAoL21zaWV8dHJpZGVudC9pKS50ZXN0KGdsb2JhbC5uYXZpZ2F0b3IgJiYgZ2xvYmFsLm5hdmlnYXRvci51c2VyQWdlbnQpO1xudmFyIHBhcnNlRGltZW5zaW9uID0gZnVuY3Rpb24gKHBpeGVsKSB7IHJldHVybiBwYXJzZUZsb2F0KHBpeGVsIHx8ICcwJyk7IH07XG52YXIgc2l6ZSA9IGZ1bmN0aW9uIChpbmxpbmVTaXplLCBibG9ja1NpemUsIHN3aXRjaFNpemVzKSB7XG4gICAgaWYgKGlubGluZVNpemUgPT09IHZvaWQgMCkgeyBpbmxpbmVTaXplID0gMDsgfVxuICAgIGlmIChibG9ja1NpemUgPT09IHZvaWQgMCkgeyBibG9ja1NpemUgPSAwOyB9XG4gICAgaWYgKHN3aXRjaFNpemVzID09PSB2b2lkIDApIHsgc3dpdGNoU2l6ZXMgPSBmYWxzZTsgfVxuICAgIHJldHVybiBuZXcgUmVzaXplT2JzZXJ2ZXJTaXplKChzd2l0Y2hTaXplcyA/IGJsb2NrU2l6ZSA6IGlubGluZVNpemUpIHx8IDAsIChzd2l0Y2hTaXplcyA/IGlubGluZVNpemUgOiBibG9ja1NpemUpIHx8IDApO1xufTtcbnZhciB6ZXJvQm94ZXMgPSBmcmVlemUoe1xuICAgIGRldmljZVBpeGVsQ29udGVudEJveFNpemU6IHNpemUoKSxcbiAgICBib3JkZXJCb3hTaXplOiBzaXplKCksXG4gICAgY29udGVudEJveFNpemU6IHNpemUoKSxcbiAgICBjb250ZW50UmVjdDogbmV3IERPTVJlY3RSZWFkT25seSgwLCAwLCAwLCAwKVxufSk7XG52YXIgY2FsY3VsYXRlQm94U2l6ZXMgPSBmdW5jdGlvbiAodGFyZ2V0LCBmb3JjZVJlY2FsY3VsYXRpb24pIHtcbiAgICBpZiAoZm9yY2VSZWNhbGN1bGF0aW9uID09PSB2b2lkIDApIHsgZm9yY2VSZWNhbGN1bGF0aW9uID0gZmFsc2U7IH1cbiAgICBpZiAoY2FjaGUuaGFzKHRhcmdldCkgJiYgIWZvcmNlUmVjYWxjdWxhdGlvbikge1xuICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KHRhcmdldCk7XG4gICAgfVxuICAgIGlmIChpc0hpZGRlbih0YXJnZXQpKSB7XG4gICAgICAgIGNhY2hlLnNldCh0YXJnZXQsIHplcm9Cb3hlcyk7XG4gICAgICAgIHJldHVybiB6ZXJvQm94ZXM7XG4gICAgfVxuICAgIHZhciBjcyA9IGdldENvbXB1dGVkU3R5bGUodGFyZ2V0KTtcbiAgICB2YXIgc3ZnID0gaXNTVkcodGFyZ2V0KSAmJiB0YXJnZXQub3duZXJTVkdFbGVtZW50ICYmIHRhcmdldC5nZXRCQm94KCk7XG4gICAgdmFyIHJlbW92ZVBhZGRpbmcgPSAhSUUgJiYgY3MuYm94U2l6aW5nID09PSAnYm9yZGVyLWJveCc7XG4gICAgdmFyIHN3aXRjaFNpemVzID0gdmVydGljYWxSZWdleHAudGVzdChjcy53cml0aW5nTW9kZSB8fCAnJyk7XG4gICAgdmFyIGNhblNjcm9sbFZlcnRpY2FsbHkgPSAhc3ZnICYmIHNjcm9sbFJlZ2V4cC50ZXN0KGNzLm92ZXJmbG93WSB8fCAnJyk7XG4gICAgdmFyIGNhblNjcm9sbEhvcml6b250YWxseSA9ICFzdmcgJiYgc2Nyb2xsUmVnZXhwLnRlc3QoY3Mub3ZlcmZsb3dYIHx8ICcnKTtcbiAgICB2YXIgcGFkZGluZ1RvcCA9IHN2ZyA/IDAgOiBwYXJzZURpbWVuc2lvbihjcy5wYWRkaW5nVG9wKTtcbiAgICB2YXIgcGFkZGluZ1JpZ2h0ID0gc3ZnID8gMCA6IHBhcnNlRGltZW5zaW9uKGNzLnBhZGRpbmdSaWdodCk7XG4gICAgdmFyIHBhZGRpbmdCb3R0b20gPSBzdmcgPyAwIDogcGFyc2VEaW1lbnNpb24oY3MucGFkZGluZ0JvdHRvbSk7XG4gICAgdmFyIHBhZGRpbmdMZWZ0ID0gc3ZnID8gMCA6IHBhcnNlRGltZW5zaW9uKGNzLnBhZGRpbmdMZWZ0KTtcbiAgICB2YXIgYm9yZGVyVG9wID0gc3ZnID8gMCA6IHBhcnNlRGltZW5zaW9uKGNzLmJvcmRlclRvcFdpZHRoKTtcbiAgICB2YXIgYm9yZGVyUmlnaHQgPSBzdmcgPyAwIDogcGFyc2VEaW1lbnNpb24oY3MuYm9yZGVyUmlnaHRXaWR0aCk7XG4gICAgdmFyIGJvcmRlckJvdHRvbSA9IHN2ZyA/IDAgOiBwYXJzZURpbWVuc2lvbihjcy5ib3JkZXJCb3R0b21XaWR0aCk7XG4gICAgdmFyIGJvcmRlckxlZnQgPSBzdmcgPyAwIDogcGFyc2VEaW1lbnNpb24oY3MuYm9yZGVyTGVmdFdpZHRoKTtcbiAgICB2YXIgaG9yaXpvbnRhbFBhZGRpbmcgPSBwYWRkaW5nTGVmdCArIHBhZGRpbmdSaWdodDtcbiAgICB2YXIgdmVydGljYWxQYWRkaW5nID0gcGFkZGluZ1RvcCArIHBhZGRpbmdCb3R0b207XG4gICAgdmFyIGhvcml6b250YWxCb3JkZXJBcmVhID0gYm9yZGVyTGVmdCArIGJvcmRlclJpZ2h0O1xuICAgIHZhciB2ZXJ0aWNhbEJvcmRlckFyZWEgPSBib3JkZXJUb3AgKyBib3JkZXJCb3R0b207XG4gICAgdmFyIGhvcml6b250YWxTY3JvbGxiYXJUaGlja25lc3MgPSAhY2FuU2Nyb2xsSG9yaXpvbnRhbGx5ID8gMCA6IHRhcmdldC5vZmZzZXRIZWlnaHQgLSB2ZXJ0aWNhbEJvcmRlckFyZWEgLSB0YXJnZXQuY2xpZW50SGVpZ2h0O1xuICAgIHZhciB2ZXJ0aWNhbFNjcm9sbGJhclRoaWNrbmVzcyA9ICFjYW5TY3JvbGxWZXJ0aWNhbGx5ID8gMCA6IHRhcmdldC5vZmZzZXRXaWR0aCAtIGhvcml6b250YWxCb3JkZXJBcmVhIC0gdGFyZ2V0LmNsaWVudFdpZHRoO1xuICAgIHZhciB3aWR0aFJlZHVjdGlvbiA9IHJlbW92ZVBhZGRpbmcgPyBob3Jpem9udGFsUGFkZGluZyArIGhvcml6b250YWxCb3JkZXJBcmVhIDogMDtcbiAgICB2YXIgaGVpZ2h0UmVkdWN0aW9uID0gcmVtb3ZlUGFkZGluZyA/IHZlcnRpY2FsUGFkZGluZyArIHZlcnRpY2FsQm9yZGVyQXJlYSA6IDA7XG4gICAgdmFyIGNvbnRlbnRXaWR0aCA9IHN2ZyA/IHN2Zy53aWR0aCA6IHBhcnNlRGltZW5zaW9uKGNzLndpZHRoKSAtIHdpZHRoUmVkdWN0aW9uIC0gdmVydGljYWxTY3JvbGxiYXJUaGlja25lc3M7XG4gICAgdmFyIGNvbnRlbnRIZWlnaHQgPSBzdmcgPyBzdmcuaGVpZ2h0IDogcGFyc2VEaW1lbnNpb24oY3MuaGVpZ2h0KSAtIGhlaWdodFJlZHVjdGlvbiAtIGhvcml6b250YWxTY3JvbGxiYXJUaGlja25lc3M7XG4gICAgdmFyIGJvcmRlckJveFdpZHRoID0gY29udGVudFdpZHRoICsgaG9yaXpvbnRhbFBhZGRpbmcgKyB2ZXJ0aWNhbFNjcm9sbGJhclRoaWNrbmVzcyArIGhvcml6b250YWxCb3JkZXJBcmVhO1xuICAgIHZhciBib3JkZXJCb3hIZWlnaHQgPSBjb250ZW50SGVpZ2h0ICsgdmVydGljYWxQYWRkaW5nICsgaG9yaXpvbnRhbFNjcm9sbGJhclRoaWNrbmVzcyArIHZlcnRpY2FsQm9yZGVyQXJlYTtcbiAgICB2YXIgYm94ZXMgPSBmcmVlemUoe1xuICAgICAgICBkZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplOiBzaXplKE1hdGgucm91bmQoY29udGVudFdpZHRoICogZGV2aWNlUGl4ZWxSYXRpbyksIE1hdGgucm91bmQoY29udGVudEhlaWdodCAqIGRldmljZVBpeGVsUmF0aW8pLCBzd2l0Y2hTaXplcyksXG4gICAgICAgIGJvcmRlckJveFNpemU6IHNpemUoYm9yZGVyQm94V2lkdGgsIGJvcmRlckJveEhlaWdodCwgc3dpdGNoU2l6ZXMpLFxuICAgICAgICBjb250ZW50Qm94U2l6ZTogc2l6ZShjb250ZW50V2lkdGgsIGNvbnRlbnRIZWlnaHQsIHN3aXRjaFNpemVzKSxcbiAgICAgICAgY29udGVudFJlY3Q6IG5ldyBET01SZWN0UmVhZE9ubHkocGFkZGluZ0xlZnQsIHBhZGRpbmdUb3AsIGNvbnRlbnRXaWR0aCwgY29udGVudEhlaWdodClcbiAgICB9KTtcbiAgICBjYWNoZS5zZXQodGFyZ2V0LCBib3hlcyk7XG4gICAgcmV0dXJuIGJveGVzO1xufTtcbnZhciBjYWxjdWxhdGVCb3hTaXplID0gZnVuY3Rpb24gKHRhcmdldCwgb2JzZXJ2ZWRCb3gsIGZvcmNlUmVjYWxjdWxhdGlvbikge1xuICAgIHZhciBfYSA9IGNhbGN1bGF0ZUJveFNpemVzKHRhcmdldCwgZm9yY2VSZWNhbGN1bGF0aW9uKSwgYm9yZGVyQm94U2l6ZSA9IF9hLmJvcmRlckJveFNpemUsIGNvbnRlbnRCb3hTaXplID0gX2EuY29udGVudEJveFNpemUsIGRldmljZVBpeGVsQ29udGVudEJveFNpemUgPSBfYS5kZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplO1xuICAgIHN3aXRjaCAob2JzZXJ2ZWRCb3gpIHtcbiAgICAgICAgY2FzZSBSZXNpemVPYnNlcnZlckJveE9wdGlvbnMuREVWSUNFX1BJWEVMX0NPTlRFTlRfQk9YOlxuICAgICAgICAgICAgcmV0dXJuIGRldmljZVBpeGVsQ29udGVudEJveFNpemU7XG4gICAgICAgIGNhc2UgUmVzaXplT2JzZXJ2ZXJCb3hPcHRpb25zLkJPUkRFUl9CT1g6XG4gICAgICAgICAgICByZXR1cm4gYm9yZGVyQm94U2l6ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50Qm94U2l6ZTtcbiAgICB9XG59O1xuZXhwb3J0IHsgY2FsY3VsYXRlQm94U2l6ZSwgY2FsY3VsYXRlQm94U2l6ZXMgfTtcbiIsImltcG9ydCB7IGNhbGN1bGF0ZUJveFNpemVzIH0gZnJvbSAnLi9hbGdvcml0aG1zL2NhbGN1bGF0ZUJveFNpemUnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi91dGlscy9mcmVlemUnO1xudmFyIFJlc2l6ZU9ic2VydmVyRW50cnkgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlc2l6ZU9ic2VydmVyRW50cnkodGFyZ2V0KSB7XG4gICAgICAgIHZhciBib3hlcyA9IGNhbGN1bGF0ZUJveFNpemVzKHRhcmdldCk7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICB0aGlzLmNvbnRlbnRSZWN0ID0gYm94ZXMuY29udGVudFJlY3Q7XG4gICAgICAgIHRoaXMuYm9yZGVyQm94U2l6ZSA9IGZyZWV6ZShbYm94ZXMuYm9yZGVyQm94U2l6ZV0pO1xuICAgICAgICB0aGlzLmNvbnRlbnRCb3hTaXplID0gZnJlZXplKFtib3hlcy5jb250ZW50Qm94U2l6ZV0pO1xuICAgICAgICB0aGlzLmRldmljZVBpeGVsQ29udGVudEJveFNpemUgPSBmcmVlemUoW2JveGVzLmRldmljZVBpeGVsQ29udGVudEJveFNpemVdKTtcbiAgICB9XG4gICAgcmV0dXJuIFJlc2l6ZU9ic2VydmVyRW50cnk7XG59KCkpO1xuZXhwb3J0IHsgUmVzaXplT2JzZXJ2ZXJFbnRyeSB9O1xuIiwiaW1wb3J0IHsgaXNIaWRkZW4gfSBmcm9tICcuLi91dGlscy9lbGVtZW50JztcbnZhciBjYWxjdWxhdGVEZXB0aEZvck5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmIChpc0hpZGRlbihub2RlKSkge1xuICAgICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgfVxuICAgIHZhciBkZXB0aCA9IDA7XG4gICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgIGRlcHRoICs9IDE7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlO1xuICAgIH1cbiAgICByZXR1cm4gZGVwdGg7XG59O1xuZXhwb3J0IHsgY2FsY3VsYXRlRGVwdGhGb3JOb2RlIH07XG4iLCJpbXBvcnQgeyByZXNpemVPYnNlcnZlcnMgfSBmcm9tICcuLi91dGlscy9yZXNpemVPYnNlcnZlcnMnO1xuaW1wb3J0IHsgUmVzaXplT2JzZXJ2ZXJFbnRyeSB9IGZyb20gJy4uL1Jlc2l6ZU9ic2VydmVyRW50cnknO1xuaW1wb3J0IHsgY2FsY3VsYXRlRGVwdGhGb3JOb2RlIH0gZnJvbSAnLi9jYWxjdWxhdGVEZXB0aEZvck5vZGUnO1xuaW1wb3J0IHsgY2FsY3VsYXRlQm94U2l6ZSB9IGZyb20gJy4vY2FsY3VsYXRlQm94U2l6ZSc7XG52YXIgYnJvYWRjYXN0QWN0aXZlT2JzZXJ2YXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzaGFsbG93ZXN0RGVwdGggPSBJbmZpbml0eTtcbiAgICB2YXIgY2FsbGJhY2tzID0gW107XG4gICAgcmVzaXplT2JzZXJ2ZXJzLmZvckVhY2goZnVuY3Rpb24gcHJvY2Vzc09ic2VydmVyKHJvKSB7XG4gICAgICAgIGlmIChyby5hY3RpdmVUYXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbnRyaWVzID0gW107XG4gICAgICAgIHJvLmFjdGl2ZVRhcmdldHMuZm9yRWFjaChmdW5jdGlvbiBwcm9jZXNzVGFyZ2V0KG90KSB7XG4gICAgICAgICAgICB2YXIgZW50cnkgPSBuZXcgUmVzaXplT2JzZXJ2ZXJFbnRyeShvdC50YXJnZXQpO1xuICAgICAgICAgICAgdmFyIHRhcmdldERlcHRoID0gY2FsY3VsYXRlRGVwdGhGb3JOb2RlKG90LnRhcmdldCk7XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgb3QubGFzdFJlcG9ydGVkU2l6ZSA9IGNhbGN1bGF0ZUJveFNpemUob3QudGFyZ2V0LCBvdC5vYnNlcnZlZEJveCk7XG4gICAgICAgICAgICBpZiAodGFyZ2V0RGVwdGggPCBzaGFsbG93ZXN0RGVwdGgpIHtcbiAgICAgICAgICAgICAgICBzaGFsbG93ZXN0RGVwdGggPSB0YXJnZXREZXB0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uIHJlc2l6ZU9ic2VydmVyQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICByby5jYWxsYmFjay5jYWxsKHJvLm9ic2VydmVyLCBlbnRyaWVzLCByby5vYnNlcnZlcik7XG4gICAgICAgIH0pO1xuICAgICAgICByby5hY3RpdmVUYXJnZXRzLnNwbGljZSgwLCByby5hY3RpdmVUYXJnZXRzLmxlbmd0aCk7XG4gICAgfSk7XG4gICAgZm9yICh2YXIgX2kgPSAwLCBjYWxsYmFja3NfMSA9IGNhbGxiYWNrczsgX2kgPCBjYWxsYmFja3NfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzXzFbX2ldO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgICByZXR1cm4gc2hhbGxvd2VzdERlcHRoO1xufTtcbmV4cG9ydCB7IGJyb2FkY2FzdEFjdGl2ZU9ic2VydmF0aW9ucyB9O1xuIiwiaW1wb3J0IHsgcmVzaXplT2JzZXJ2ZXJzIH0gZnJvbSAnLi4vdXRpbHMvcmVzaXplT2JzZXJ2ZXJzJztcbmltcG9ydCB7IGNhbGN1bGF0ZURlcHRoRm9yTm9kZSB9IGZyb20gJy4vY2FsY3VsYXRlRGVwdGhGb3JOb2RlJztcbnZhciBnYXRoZXJBY3RpdmVPYnNlcnZhdGlvbnNBdERlcHRoID0gZnVuY3Rpb24gKGRlcHRoKSB7XG4gICAgcmVzaXplT2JzZXJ2ZXJzLmZvckVhY2goZnVuY3Rpb24gcHJvY2Vzc09ic2VydmVyKHJvKSB7XG4gICAgICAgIHJvLmFjdGl2ZVRhcmdldHMuc3BsaWNlKDAsIHJvLmFjdGl2ZVRhcmdldHMubGVuZ3RoKTtcbiAgICAgICAgcm8uc2tpcHBlZFRhcmdldHMuc3BsaWNlKDAsIHJvLnNraXBwZWRUYXJnZXRzLmxlbmd0aCk7XG4gICAgICAgIHJvLm9ic2VydmF0aW9uVGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uIHByb2Nlc3NUYXJnZXQob3QpIHtcbiAgICAgICAgICAgIGlmIChvdC5pc0FjdGl2ZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGN1bGF0ZURlcHRoRm9yTm9kZShvdC50YXJnZXQpID4gZGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcm8uYWN0aXZlVGFyZ2V0cy5wdXNoKG90KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJvLnNraXBwZWRUYXJnZXRzLnB1c2gob3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuZXhwb3J0IHsgZ2F0aGVyQWN0aXZlT2JzZXJ2YXRpb25zQXREZXB0aCB9O1xuIiwiaW1wb3J0IHsgaGFzQWN0aXZlT2JzZXJ2YXRpb25zIH0gZnJvbSAnLi4vYWxnb3JpdGhtcy9oYXNBY3RpdmVPYnNlcnZhdGlvbnMnO1xuaW1wb3J0IHsgaGFzU2tpcHBlZE9ic2VydmF0aW9ucyB9IGZyb20gJy4uL2FsZ29yaXRobXMvaGFzU2tpcHBlZE9ic2VydmF0aW9ucyc7XG5pbXBvcnQgeyBkZWxpdmVyUmVzaXplTG9vcEVycm9yIH0gZnJvbSAnLi4vYWxnb3JpdGhtcy9kZWxpdmVyUmVzaXplTG9vcEVycm9yJztcbmltcG9ydCB7IGJyb2FkY2FzdEFjdGl2ZU9ic2VydmF0aW9ucyB9IGZyb20gJy4uL2FsZ29yaXRobXMvYnJvYWRjYXN0QWN0aXZlT2JzZXJ2YXRpb25zJztcbmltcG9ydCB7IGdhdGhlckFjdGl2ZU9ic2VydmF0aW9uc0F0RGVwdGggfSBmcm9tICcuLi9hbGdvcml0aG1zL2dhdGhlckFjdGl2ZU9ic2VydmF0aW9uc0F0RGVwdGgnO1xudmFyIHByb2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRlcHRoID0gMDtcbiAgICBnYXRoZXJBY3RpdmVPYnNlcnZhdGlvbnNBdERlcHRoKGRlcHRoKTtcbiAgICB3aGlsZSAoaGFzQWN0aXZlT2JzZXJ2YXRpb25zKCkpIHtcbiAgICAgICAgZGVwdGggPSBicm9hZGNhc3RBY3RpdmVPYnNlcnZhdGlvbnMoKTtcbiAgICAgICAgZ2F0aGVyQWN0aXZlT2JzZXJ2YXRpb25zQXREZXB0aChkZXB0aCk7XG4gICAgfVxuICAgIGlmIChoYXNTa2lwcGVkT2JzZXJ2YXRpb25zKCkpIHtcbiAgICAgICAgZGVsaXZlclJlc2l6ZUxvb3BFcnJvcigpO1xuICAgIH1cbiAgICByZXR1cm4gZGVwdGggPiAwO1xufTtcbmV4cG9ydCB7IHByb2Nlc3MgfTtcbiIsInZhciB0cmlnZ2VyO1xudmFyIGNhbGxiYWNrcyA9IFtdO1xudmFyIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNhbGxiYWNrcy5zcGxpY2UoMCkuZm9yRWFjaChmdW5jdGlvbiAoY2IpIHsgcmV0dXJuIGNiKCk7IH0pOyB9O1xudmFyIHF1ZXVlTWljcm9UYXNrID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0cmlnZ2VyKSB7XG4gICAgICAgIHZhciB0b2dnbGVfMSA9IDA7XG4gICAgICAgIHZhciBlbF8xID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgICAgICB2YXIgY29uZmlnID0geyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH07XG4gICAgICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5vdGlmeSgpOyB9KS5vYnNlcnZlKGVsXzEsIGNvbmZpZyk7XG4gICAgICAgIHRyaWdnZXIgPSBmdW5jdGlvbiAoKSB7IGVsXzEudGV4dENvbnRlbnQgPSBcIlwiLmNvbmNhdCh0b2dnbGVfMSA/IHRvZ2dsZV8xLS0gOiB0b2dnbGVfMSsrKTsgfTtcbiAgICB9XG4gICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIHRyaWdnZXIoKTtcbn07XG5leHBvcnQgeyBxdWV1ZU1pY3JvVGFzayB9O1xuIiwiaW1wb3J0IHsgcXVldWVNaWNyb1Rhc2sgfSBmcm9tICcuL3F1ZXVlTWljcm9UYXNrJztcbnZhciBxdWV1ZVJlc2l6ZU9ic2VydmVyID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgcXVldWVNaWNyb1Rhc2soZnVuY3Rpb24gUmVzaXplT2JzZXJ2ZXIoKSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShjYik7XG4gICAgfSk7XG59O1xuZXhwb3J0IHsgcXVldWVSZXNpemVPYnNlcnZlciB9O1xuIiwiaW1wb3J0IHsgcHJvY2VzcyB9IGZyb20gJy4vcHJvY2Vzcyc7XG5pbXBvcnQgeyBnbG9iYWwgfSBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgeyBxdWV1ZVJlc2l6ZU9ic2VydmVyIH0gZnJvbSAnLi9xdWV1ZVJlc2l6ZU9ic2VydmVyJztcbnZhciB3YXRjaGluZyA9IDA7XG52YXIgaXNXYXRjaGluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICEhd2F0Y2hpbmc7IH07XG52YXIgQ0FUQ0hfUEVSSU9EID0gMjUwO1xudmFyIG9ic2VydmVyQ29uZmlnID0geyBhdHRyaWJ1dGVzOiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlLCBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfTtcbnZhciBldmVudHMgPSBbXG4gICAgJ3Jlc2l6ZScsXG4gICAgJ2xvYWQnLFxuICAgICd0cmFuc2l0aW9uZW5kJyxcbiAgICAnYW5pbWF0aW9uZW5kJyxcbiAgICAnYW5pbWF0aW9uc3RhcnQnLFxuICAgICdhbmltYXRpb25pdGVyYXRpb24nLFxuICAgICdrZXl1cCcsXG4gICAgJ2tleWRvd24nLFxuICAgICdtb3VzZXVwJyxcbiAgICAnbW91c2Vkb3duJyxcbiAgICAnbW91c2VvdmVyJyxcbiAgICAnbW91c2VvdXQnLFxuICAgICdibHVyJyxcbiAgICAnZm9jdXMnXG5dO1xudmFyIHRpbWUgPSBmdW5jdGlvbiAodGltZW91dCkge1xuICAgIGlmICh0aW1lb3V0ID09PSB2b2lkIDApIHsgdGltZW91dCA9IDA7IH1cbiAgICByZXR1cm4gRGF0ZS5ub3coKSArIHRpbWVvdXQ7XG59O1xudmFyIHNjaGVkdWxlZCA9IGZhbHNlO1xudmFyIFNjaGVkdWxlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2NoZWR1bGVyKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnN0b3BwZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxpc3RlbmVyID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuc2NoZWR1bGUoKTsgfTtcbiAgICB9XG4gICAgU2NoZWR1bGVyLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAodGltZW91dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGltZW91dCA9PT0gdm9pZCAwKSB7IHRpbWVvdXQgPSBDQVRDSF9QRVJJT0Q7IH1cbiAgICAgICAgaWYgKHNjaGVkdWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNjaGVkdWxlZCA9IHRydWU7XG4gICAgICAgIHZhciB1bnRpbCA9IHRpbWUodGltZW91dCk7XG4gICAgICAgIHF1ZXVlUmVzaXplT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGVsZW1lbnRzSGF2ZVJlc2l6ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudHNIYXZlUmVzaXplZCA9IHByb2Nlc3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRpbWVvdXQgPSB1bnRpbCAtIHRpbWUoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzV2F0Y2hpbmcoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50c0hhdmVSZXNpemVkKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJ1bigxMDAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGltZW91dCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMucnVuKHRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuc3RhcnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU2NoZWR1bGVyLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgIHRoaXMucnVuKCk7XG4gICAgfTtcbiAgICBTY2hlZHVsZXIucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBjYiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLm9ic2VydmVyICYmIF90aGlzLm9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgb2JzZXJ2ZXJDb25maWcpOyB9O1xuICAgICAgICBkb2N1bWVudC5ib2R5ID8gY2IoKSA6IGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgY2IpO1xuICAgIH07XG4gICAgU2NoZWR1bGVyLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuc3RvcHBlZCkge1xuICAgICAgICAgICAgdGhpcy5zdG9wcGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5saXN0ZW5lcik7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmUoKTtcbiAgICAgICAgICAgIGV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBfdGhpcy5saXN0ZW5lciwgdHJ1ZSk7IH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTY2hlZHVsZXIucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICghdGhpcy5zdG9wcGVkKSB7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyICYmIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIGdsb2JhbC5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIF90aGlzLmxpc3RlbmVyLCB0cnVlKTsgfSk7XG4gICAgICAgICAgICB0aGlzLnN0b3BwZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gU2NoZWR1bGVyO1xufSgpKTtcbnZhciBzY2hlZHVsZXIgPSBuZXcgU2NoZWR1bGVyKCk7XG52YXIgdXBkYXRlQ291bnQgPSBmdW5jdGlvbiAobikge1xuICAgICF3YXRjaGluZyAmJiBuID4gMCAmJiBzY2hlZHVsZXIuc3RhcnQoKTtcbiAgICB3YXRjaGluZyArPSBuO1xuICAgICF3YXRjaGluZyAmJiBzY2hlZHVsZXIuc3RvcCgpO1xufTtcbmV4cG9ydCB7IHNjaGVkdWxlciwgdXBkYXRlQ291bnQgfTtcbiIsImltcG9ydCB7IFJlc2l6ZU9ic2VydmVyQm94T3B0aW9ucyB9IGZyb20gJy4vUmVzaXplT2JzZXJ2ZXJCb3hPcHRpb25zJztcbmltcG9ydCB7IGNhbGN1bGF0ZUJveFNpemUgfSBmcm9tICcuL2FsZ29yaXRobXMvY2FsY3VsYXRlQm94U2l6ZSc7XG5pbXBvcnQgeyBpc1NWRywgaXNSZXBsYWNlZEVsZW1lbnQgfSBmcm9tICcuL3V0aWxzL2VsZW1lbnQnO1xudmFyIHNraXBOb3RpZnlPbkVsZW1lbnQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgcmV0dXJuICFpc1NWRyh0YXJnZXQpXG4gICAgICAgICYmICFpc1JlcGxhY2VkRWxlbWVudCh0YXJnZXQpXG4gICAgICAgICYmIGdldENvbXB1dGVkU3R5bGUodGFyZ2V0KS5kaXNwbGF5ID09PSAnaW5saW5lJztcbn07XG52YXIgUmVzaXplT2JzZXJ2YXRpb24gPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlc2l6ZU9ic2VydmF0aW9uKHRhcmdldCwgb2JzZXJ2ZWRCb3gpIHtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMub2JzZXJ2ZWRCb3ggPSBvYnNlcnZlZEJveCB8fCBSZXNpemVPYnNlcnZlckJveE9wdGlvbnMuQ09OVEVOVF9CT1g7XG4gICAgICAgIHRoaXMubGFzdFJlcG9ydGVkU2l6ZSA9IHtcbiAgICAgICAgICAgIGlubGluZVNpemU6IDAsXG4gICAgICAgICAgICBibG9ja1NpemU6IDBcbiAgICAgICAgfTtcbiAgICB9XG4gICAgUmVzaXplT2JzZXJ2YXRpb24ucHJvdG90eXBlLmlzQWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2l6ZSA9IGNhbGN1bGF0ZUJveFNpemUodGhpcy50YXJnZXQsIHRoaXMub2JzZXJ2ZWRCb3gsIHRydWUpO1xuICAgICAgICBpZiAoc2tpcE5vdGlmeU9uRWxlbWVudCh0aGlzLnRhcmdldCkpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFJlcG9ydGVkU2l6ZSA9IHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubGFzdFJlcG9ydGVkU2l6ZS5pbmxpbmVTaXplICE9PSBzaXplLmlubGluZVNpemVcbiAgICAgICAgICAgIHx8IHRoaXMubGFzdFJlcG9ydGVkU2l6ZS5ibG9ja1NpemUgIT09IHNpemUuYmxvY2tTaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICByZXR1cm4gUmVzaXplT2JzZXJ2YXRpb247XG59KCkpO1xuZXhwb3J0IHsgUmVzaXplT2JzZXJ2YXRpb24gfTtcbiIsInZhciBSZXNpemVPYnNlcnZlckRldGFpbCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmVzaXplT2JzZXJ2ZXJEZXRhaWwocmVzaXplT2JzZXJ2ZXIsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlVGFyZ2V0cyA9IFtdO1xuICAgICAgICB0aGlzLnNraXBwZWRUYXJnZXRzID0gW107XG4gICAgICAgIHRoaXMub2JzZXJ2YXRpb25UYXJnZXRzID0gW107XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSByZXNpemVPYnNlcnZlcjtcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cbiAgICByZXR1cm4gUmVzaXplT2JzZXJ2ZXJEZXRhaWw7XG59KCkpO1xuZXhwb3J0IHsgUmVzaXplT2JzZXJ2ZXJEZXRhaWwgfTtcbiIsImltcG9ydCB7IHNjaGVkdWxlciwgdXBkYXRlQ291bnQgfSBmcm9tICcuL3V0aWxzL3NjaGVkdWxlcic7XG5pbXBvcnQgeyBSZXNpemVPYnNlcnZhdGlvbiB9IGZyb20gJy4vUmVzaXplT2JzZXJ2YXRpb24nO1xuaW1wb3J0IHsgUmVzaXplT2JzZXJ2ZXJEZXRhaWwgfSBmcm9tICcuL1Jlc2l6ZU9ic2VydmVyRGV0YWlsJztcbmltcG9ydCB7IHJlc2l6ZU9ic2VydmVycyB9IGZyb20gJy4vdXRpbHMvcmVzaXplT2JzZXJ2ZXJzJztcbnZhciBvYnNlcnZlck1hcCA9IG5ldyBXZWFrTWFwKCk7XG52YXIgZ2V0T2JzZXJ2YXRpb25JbmRleCA9IGZ1bmN0aW9uIChvYnNlcnZhdGlvblRhcmdldHMsIHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JzZXJ2YXRpb25UYXJnZXRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGlmIChvYnNlcnZhdGlvblRhcmdldHNbaV0udGFyZ2V0ID09PSB0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn07XG52YXIgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIoKSB7XG4gICAgfVxuICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5jb25uZWN0ID0gZnVuY3Rpb24gKHJlc2l6ZU9ic2VydmVyLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgZGV0YWlsID0gbmV3IFJlc2l6ZU9ic2VydmVyRGV0YWlsKHJlc2l6ZU9ic2VydmVyLCBjYWxsYmFjayk7XG4gICAgICAgIG9ic2VydmVyTWFwLnNldChyZXNpemVPYnNlcnZlciwgZGV0YWlsKTtcbiAgICB9O1xuICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5vYnNlcnZlID0gZnVuY3Rpb24gKHJlc2l6ZU9ic2VydmVyLCB0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGRldGFpbCA9IG9ic2VydmVyTWFwLmdldChyZXNpemVPYnNlcnZlcik7XG4gICAgICAgIHZhciBmaXJzdE9ic2VydmF0aW9uID0gZGV0YWlsLm9ic2VydmF0aW9uVGFyZ2V0cy5sZW5ndGggPT09IDA7XG4gICAgICAgIGlmIChnZXRPYnNlcnZhdGlvbkluZGV4KGRldGFpbC5vYnNlcnZhdGlvblRhcmdldHMsIHRhcmdldCkgPCAwKSB7XG4gICAgICAgICAgICBmaXJzdE9ic2VydmF0aW9uICYmIHJlc2l6ZU9ic2VydmVycy5wdXNoKGRldGFpbCk7XG4gICAgICAgICAgICBkZXRhaWwub2JzZXJ2YXRpb25UYXJnZXRzLnB1c2gobmV3IFJlc2l6ZU9ic2VydmF0aW9uKHRhcmdldCwgb3B0aW9ucyAmJiBvcHRpb25zLmJveCkpO1xuICAgICAgICAgICAgdXBkYXRlQ291bnQoMSk7XG4gICAgICAgICAgICBzY2hlZHVsZXIuc2NoZWR1bGUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnVub2JzZXJ2ZSA9IGZ1bmN0aW9uIChyZXNpemVPYnNlcnZlciwgdGFyZ2V0KSB7XG4gICAgICAgIHZhciBkZXRhaWwgPSBvYnNlcnZlck1hcC5nZXQocmVzaXplT2JzZXJ2ZXIpO1xuICAgICAgICB2YXIgaW5kZXggPSBnZXRPYnNlcnZhdGlvbkluZGV4KGRldGFpbC5vYnNlcnZhdGlvblRhcmdldHMsIHRhcmdldCk7XG4gICAgICAgIHZhciBsYXN0T2JzZXJ2YXRpb24gPSBkZXRhaWwub2JzZXJ2YXRpb25UYXJnZXRzLmxlbmd0aCA9PT0gMTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGxhc3RPYnNlcnZhdGlvbiAmJiByZXNpemVPYnNlcnZlcnMuc3BsaWNlKHJlc2l6ZU9ic2VydmVycy5pbmRleE9mKGRldGFpbCksIDEpO1xuICAgICAgICAgICAgZGV0YWlsLm9ic2VydmF0aW9uVGFyZ2V0cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdXBkYXRlQ291bnQoLTEpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIuZGlzY29ubmVjdCA9IGZ1bmN0aW9uIChyZXNpemVPYnNlcnZlcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZGV0YWlsID0gb2JzZXJ2ZXJNYXAuZ2V0KHJlc2l6ZU9ic2VydmVyKTtcbiAgICAgICAgZGV0YWlsLm9ic2VydmF0aW9uVGFyZ2V0cy5zbGljZSgpLmZvckVhY2goZnVuY3Rpb24gKG90KSB7IHJldHVybiBfdGhpcy51bm9ic2VydmUocmVzaXplT2JzZXJ2ZXIsIG90LnRhcmdldCk7IH0pO1xuICAgICAgICBkZXRhaWwuYWN0aXZlVGFyZ2V0cy5zcGxpY2UoMCwgZGV0YWlsLmFjdGl2ZVRhcmdldHMubGVuZ3RoKTtcbiAgICB9O1xuICAgIHJldHVybiBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXI7XG59KCkpO1xuZXhwb3J0IHsgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyIH07XG4iLCJpbXBvcnQgeyBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIgfSBmcm9tICcuL1Jlc2l6ZU9ic2VydmVyQ29udHJvbGxlcic7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tICcuL3V0aWxzL2VsZW1lbnQnO1xudmFyIFJlc2l6ZU9ic2VydmVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZXNpemVPYnNlcnZlcihjYWxsYmFjaykge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Jlc2l6ZU9ic2VydmVyJzogMSBhcmd1bWVudCByZXF1aXJlZCwgYnV0IG9ubHkgMCBwcmVzZW50LlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRmFpbGVkIHRvIGNvbnN0cnVjdCAnUmVzaXplT2JzZXJ2ZXInOiBUaGUgY2FsbGJhY2sgcHJvdmlkZWQgYXMgcGFyYW1ldGVyIDEgaXMgbm90IGEgZnVuY3Rpb24uXCIpO1xuICAgICAgICB9XG4gICAgICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5jb25uZWN0KHRoaXMsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgUmVzaXplT2JzZXJ2ZXIucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbiAodGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRmFpbGVkIHRvIGV4ZWN1dGUgJ29ic2VydmUnIG9uICdSZXNpemVPYnNlcnZlcic6IDEgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IDAgcHJlc2VudC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VsZW1lbnQodGFyZ2V0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZhaWxlZCB0byBleGVjdXRlICdvYnNlcnZlJyBvbiAnUmVzaXplT2JzZXJ2ZXInOiBwYXJhbWV0ZXIgMSBpcyBub3Qgb2YgdHlwZSAnRWxlbWVudFwiKTtcbiAgICAgICAgfVxuICAgICAgICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIub2JzZXJ2ZSh0aGlzLCB0YXJnZXQsIG9wdGlvbnMpO1xuICAgIH07XG4gICAgUmVzaXplT2JzZXJ2ZXIucHJvdG90eXBlLnVub2JzZXJ2ZSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGYWlsZWQgdG8gZXhlY3V0ZSAndW5vYnNlcnZlJyBvbiAnUmVzaXplT2JzZXJ2ZXInOiAxIGFyZ3VtZW50IHJlcXVpcmVkLCBidXQgb25seSAwIHByZXNlbnQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFbGVtZW50KHRhcmdldCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGYWlsZWQgdG8gZXhlY3V0ZSAndW5vYnNlcnZlJyBvbiAnUmVzaXplT2JzZXJ2ZXInOiBwYXJhbWV0ZXIgMSBpcyBub3Qgb2YgdHlwZSAnRWxlbWVudFwiKTtcbiAgICAgICAgfVxuICAgICAgICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIudW5vYnNlcnZlKHRoaXMsIHRhcmdldCk7XG4gICAgfTtcbiAgICBSZXNpemVPYnNlcnZlci5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLmRpc2Nvbm5lY3QodGhpcyk7XG4gICAgfTtcbiAgICBSZXNpemVPYnNlcnZlci50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICdmdW5jdGlvbiBSZXNpemVPYnNlcnZlciAoKSB7IFtwb2x5ZmlsbCBjb2RlXSB9JztcbiAgICB9O1xuICAgIHJldHVybiBSZXNpemVPYnNlcnZlcjtcbn0oKSk7XG5leHBvcnQgeyBSZXNpemVPYnNlcnZlciB9O1xuIl0sIm5hbWVzIjpbIlJlc2l6ZU9ic2VydmVyQm94T3B0aW9ucyIsIlJlc2l6ZU9ic2VydmVyU2l6ZSIsIkRPTVJlY3RSZWFkT25seSIsIlJlc2l6ZU9ic2VydmVyRW50cnkiLCJjYWxsYmFja3MiLCJSZXNpemVPYnNlcnZlciIsIlNjaGVkdWxlciIsIlJlc2l6ZU9ic2VydmF0aW9uIiwic2l6ZSIsIlJlc2l6ZU9ic2VydmVyRGV0YWlsIiwiUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJLGtCQUFrQixDQUFFO0FDQ3hCLElBQUksd0JBQXdCLFdBQVk7QUFDcEMsU0FBTyxnQkFBZ0IsS0FBSyxTQUFVLElBQUk7QUFBRSxXQUFPLEdBQUcsY0FBYyxTQUFTO0FBQUEsRUFBRSxDQUFFO0FBQ3JGO0FDRkEsSUFBSSx5QkFBeUIsV0FBWTtBQUNyQyxTQUFPLGdCQUFnQixLQUFLLFNBQVUsSUFBSTtBQUFFLFdBQU8sR0FBRyxlQUFlLFNBQVM7QUFBQSxFQUFFLENBQUU7QUFDdEY7QUNIQSxJQUFJLE1BQU07QUFDVixJQUFJLHlCQUF5QixXQUFZO0FBQ3JDLE1BQUk7QUFDSixNQUFJLE9BQU8sZUFBZSxZQUFZO0FBQ2xDLFlBQVEsSUFBSSxXQUFXLFNBQVM7QUFBQSxNQUM1QixTQUFTO0FBQUEsSUFDckIsQ0FBUztBQUFBLEVBQ0osT0FDSTtBQUNELFlBQVEsU0FBUyxZQUFZLE9BQU87QUFDcEMsVUFBTSxVQUFVLFNBQVMsT0FBTyxLQUFLO0FBQ3JDLFVBQU0sVUFBVTtBQUFBLEVBQ25CO0FBQ0QsU0FBTyxjQUFjLEtBQUs7QUFDOUI7QUNkQSxJQUFJO0FBQUEsQ0FDSCxTQUFVQSwyQkFBMEI7QUFDakMsRUFBQUEsMEJBQXlCLFlBQVksSUFBSTtBQUN6QyxFQUFBQSwwQkFBeUIsYUFBYSxJQUFJO0FBQzFDLEVBQUFBLDBCQUF5QiwwQkFBMEIsSUFBSTtBQUMzRCxHQUFHLDZCQUE2QiwyQkFBMkIsQ0FBQSxFQUFHO0FDTHZELElBQUksU0FBUyxTQUFVLEtBQUs7QUFBRSxTQUFPLE9BQU8sT0FB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QUFHO0FBQ3hCLFlBQU0sSUFBSSxVQUFVLGdGQUFnRjtBQUFBLElBQ3ZHO0FBQ0QsUUFBSSxPQUFPLGFBQWEsWUFBWTtBQUNoQyxZQUFNLElBQUksVUFBVSwrRkFBK0Y7QUFBQSxJQUN0SDtBQUNELDZCQUF5QixRQUFRLE1BQU0sUUFBUTtBQUFBLEVBQ2xEO0FBQ0QsRUFBQUEsZ0JBQWUsVUFBVSxVQUFVLFNBQVUsUUFBUSxTQUFTO0FBQzFELFFBQUksVUFBVSxXQUFXLEdBQUc7QUFDeEIsWUFBTSxJQUFJLFVBQVUsMkZBQTJGO0FBQUEsSUFDbEg7QUFDRCxRQUFJLENBQUMsVUFBVSxNQUFNLEdBQUc7QUFDcEIsWUFBTSxJQUFJLFVBQVUsc0ZBQXNGO0FBQUEsSUFDN0c7QUFDRCw2QkFBeUIsUUFBUSxNQUFNLFFBQVEsT0FBTztBQUFBLEVBQzlEO0FBQ0ksRUFBQUEsZ0JBQWUsVUFBVSxZQUFZLFNBQVUsUUFBUTtBQUNuRCxRQUFJLFVBQVUsV0FBVyxHQUFHO0FBQ3hCLFlBQU0sSUFBSSxVQUFVLDZGQUE2RjtBQUFBLElBQ3BIO0FBQ0QsUUFBSSxDQUFDLFVBQVUsTUFBTSxHQUFHO0FBQ3BCLFlBQU0sSUFBSSxVQUFVLHdGQUF3RjtBQUFBLElBQy9HO0FBQ0QsNkJBQXlCLFVBQVUsTUFBTSxNQUFNO0FBQUEsRUFDdkQ7QUFDSSxFQUFBQSxnQkFBZSxVQUFVLGFBQWEsV0FBWTtBQUM5Qyw2QkFBeUIsV0FBVyxJQUFJO0FBQUEsRUFDaEQ7QUFDSSxFQUFBQSxnQkFBZSxXQUFXLFdBQVk7QUFDbEMsV0FBTztBQUFBLEVBQ2Y7QUFDSSxTQUFPQTtBQUNYLEVBQUc7IiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjJdfQ==