@libs-ui/services-grid-layout 0.2.357-20 → 0.2.357-22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/canvas/grid-layout-canvas.component.d.ts +112 -4
- package/defines/collision.define.d.ts +56 -0
- package/drag-controller.d.ts +34 -0
- package/esm2022/canvas/grid-layout-canvas.component.mjs +387 -8
- package/esm2022/defines/collision.define.mjs +329 -0
- package/esm2022/defines/gridster-config.define.mjs +4 -5
- package/esm2022/drag-controller.mjs +89 -0
- package/esm2022/grid-layout.service.mjs +245 -3
- package/esm2022/index.mjs +3 -1
- package/esm2022/interfaces/grid-layout.interface.mjs +1 -1
- package/esm2022/tree.service.mjs +20 -1
- package/fesm2022/libs-ui-services-grid-layout.mjs +1066 -14
- package/fesm2022/libs-ui-services-grid-layout.mjs.map +1 -1
- package/grid-layout.service.d.ts +100 -0
- package/index.d.ts +2 -0
- package/interfaces/grid-layout.interface.d.ts +108 -0
- package/package.json +3 -3
- package/tree.service.d.ts +4 -0
|
@@ -2,6 +2,7 @@ import { DestroyRef, Injectable, inject, signal } from '@angular/core';
|
|
|
2
2
|
import { cloneDeep } from '@libs-ui/utils';
|
|
3
3
|
import { take } from 'rxjs';
|
|
4
4
|
import { gridLayoutNestedConfig, gridLayoutRootConfig } from './defines/gridster-config.define';
|
|
5
|
+
import { findNodeRecursive, findParentRecursive } from './defines/collision.define';
|
|
5
6
|
import { LibsUiGridLayoutTreeService } from './tree.service';
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
7
8
|
/**
|
|
@@ -22,6 +23,13 @@ export class LibsUiGridLayoutService {
|
|
|
22
23
|
treeService = new LibsUiGridLayoutTreeService();
|
|
23
24
|
/** Lượt tải component đang chờ, theo id khối — để huỷ khi khối bị gỡ giữa chừng. */
|
|
24
25
|
pendingLoads = new Map();
|
|
26
|
+
/**
|
|
27
|
+
* Bộ theo dõi bề rộng của từng lưới LỒNG, để ngắt khi service bị huỷ.
|
|
28
|
+
*
|
|
29
|
+
* 🔴 Giữ tham chiếu là BẮT BUỘC: `ResizeObserver` không tự tắt theo vòng đời component. Không dọn
|
|
30
|
+
* thì mỗi lần nạp lại bố cục (đổi tab) lại chồng thêm một bộ, và chúng vẫn chạy trên DOM đã gỡ.
|
|
31
|
+
*/
|
|
32
|
+
nestedResizeObservers = new Set();
|
|
25
33
|
constructor() {
|
|
26
34
|
// 🔴 Service khai trong `providers` của component nên Angular huỷ nó cùng component — thư viện
|
|
27
35
|
// tự dọn ở đây, nơi dùng KHÔNG phải gọi `destroy()` trong `ngOnDestroy` (người dùng chốt
|
|
@@ -34,6 +42,7 @@ export class LibsUiGridLayoutService {
|
|
|
34
42
|
editMode = signal(false);
|
|
35
43
|
/** tăng mỗi lần cây đổi — component con đọc để biết phải tính lại */
|
|
36
44
|
version = signal(0);
|
|
45
|
+
zoomLevel = signal(1);
|
|
37
46
|
/**
|
|
38
47
|
* Signal chỉ đọc để nơi dùng theo dõi.
|
|
39
48
|
*
|
|
@@ -45,6 +54,7 @@ export class LibsUiGridLayoutService {
|
|
|
45
54
|
IsEditMode = this.editMode.asReadonly();
|
|
46
55
|
/** tăng mỗi lần cây hoặc cấu hình đổi */
|
|
47
56
|
Version = this.version.asReadonly();
|
|
57
|
+
Zoom = this.zoomLevel.asReadonly();
|
|
48
58
|
/**
|
|
49
59
|
* trần số cấp container lồng nhau — canvas đọc để biết có cho chuyển thành container không */
|
|
50
60
|
maxContainerDepth() {
|
|
@@ -71,6 +81,24 @@ export class LibsUiGridLayoutService {
|
|
|
71
81
|
// toàn `undefined`).
|
|
72
82
|
this.rootNode.set(this.shallowCloneTree(config.data));
|
|
73
83
|
this.editMode.set(config.isEditMode ?? false);
|
|
84
|
+
let initialZoom = config.initialZoom ?? 1;
|
|
85
|
+
if (config.storageKey && typeof localStorage !== 'undefined') {
|
|
86
|
+
try {
|
|
87
|
+
const saved = localStorage.getItem(config.storageKey);
|
|
88
|
+
if (saved) {
|
|
89
|
+
const parsed = parseFloat(saved);
|
|
90
|
+
const min = config.zoomMin ?? 0.4;
|
|
91
|
+
const max = config.zoomMax ?? 1.5;
|
|
92
|
+
if (!isNaN(parsed) && parsed >= min && parsed <= max) {
|
|
93
|
+
initialZoom = parsed;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// ignore localStorage access error
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
this.zoomLevel.set(initialZoom);
|
|
74
102
|
this.version.update((v) => v + 1);
|
|
75
103
|
}
|
|
76
104
|
setEditMode(value) {
|
|
@@ -122,8 +150,11 @@ export class LibsUiGridLayoutService {
|
|
|
122
150
|
const canOverlap = isFreeMode || (config.allowOverlap ?? false);
|
|
123
151
|
return {
|
|
124
152
|
...base,
|
|
153
|
+
scale: this.zoomLevel(),
|
|
125
154
|
...(config.cols ? { minCols: config.cols, maxCols: config.cols, maxItemCols: config.cols } : {}),
|
|
126
155
|
...(config.rowHeight && depth === 0 ? { fixedRowHeight: config.rowHeight } : {}),
|
|
156
|
+
...(depth === 0 && config.minRows !== undefined ? { minRows: config.minRows } : {}),
|
|
157
|
+
...(depth > 0 && config.nestedMinRows !== undefined ? { minRows: config.nestedMinRows } : {}),
|
|
127
158
|
// Khe và chiều cao hàng khác nhau theo cấp: lưới trang thoáng, lưới lồng khít.
|
|
128
159
|
...(depth === 0 && config.margin !== undefined ? { margin: config.margin } : {}),
|
|
129
160
|
...(depth > 0 && config.nestedMargin !== undefined ? { margin: config.nestedMargin } : {}),
|
|
@@ -147,6 +178,7 @@ export class LibsUiGridLayoutService {
|
|
|
147
178
|
// 28/08/2026: "bật chồng khối nhưng khi kéo thì các khối vẫn di chuyển theo").
|
|
148
179
|
// Cho chồng thì phải TẮT đẩy khối, nếu không khối bị dạt đi trước khi kịp đè lên nhau.
|
|
149
180
|
...(canOverlap ? { pushItems: false, pushResizeItems: false, swap: false, swapWhileDragging: false } : {}),
|
|
181
|
+
...this.buildNestedResizeHooks(base, depth),
|
|
150
182
|
itemChangeCallback: (item) => {
|
|
151
183
|
// 🔴 Khối vừa thao tác phải lên LỚP TRÊN CÙNG.
|
|
152
184
|
// `layerIndex` gán một lần theo thứ tự cây lúc khởi tạo, nên khối kéo lên chỉ nổi TRONG LÚC
|
|
@@ -161,6 +193,60 @@ export class LibsUiGridLayoutService {
|
|
|
161
193
|
},
|
|
162
194
|
};
|
|
163
195
|
}
|
|
196
|
+
/**
|
|
197
|
+
* Bắt lưới LỒNG đo lại NGAY khi khung chứa nó đổi bề rộng — dùng lúc người dùng kéo mép khối cha.
|
|
198
|
+
*
|
|
199
|
+
* Gridster có sẵn đường tự đo (`resize$`), nhưng luồng đó là `switchMap(() => timer(100))`: mỗi
|
|
200
|
+
* lần phát lại huỷ timer trước, mà kéo chuột bắn dày hơn 100ms nên timer không bao giờ tới đích.
|
|
201
|
+
* Đo được (11/09/2026): kéo mép nhóm thì lưới con co theo cha từng khung hình (234 → 384 px) còn
|
|
202
|
+
* THẺ con đứng im ở 106 px suốt cú kéo, chỉ nhảy đúng sau khi thả tay.
|
|
203
|
+
*
|
|
204
|
+
* Giữ CẢ HAI đường: `itemResizeCallback` bắn đồng bộ ngay khi gridster ghi bề rộng mới lên khối
|
|
205
|
+
* (sớm hơn `ResizeObserver` một khung hình) lo độ tức thì; `ResizeObserver` lo những lần khung đổi
|
|
206
|
+
* vì lý do khác — đổi zoom, thu gọn cột bên trái.
|
|
207
|
+
*
|
|
208
|
+
* Tắt bằng `config.autoResizeNestedGrids: false`.
|
|
209
|
+
*/
|
|
210
|
+
buildNestedResizeHooks(base, depth) {
|
|
211
|
+
if (this.config?.autoResizeNestedGrids === false) {
|
|
212
|
+
return {};
|
|
213
|
+
}
|
|
214
|
+
const gocItemResize = base.itemResizeCallback;
|
|
215
|
+
const gocInit = base.initCallback;
|
|
216
|
+
return {
|
|
217
|
+
itemResizeCallback: (item, itemComponent) => {
|
|
218
|
+
gocItemResize?.(item, itemComponent);
|
|
219
|
+
const el = itemComponent?.el;
|
|
220
|
+
el?.querySelectorAll('gridster').forEach((nested) => this.resizeGridsterElement(nested));
|
|
221
|
+
},
|
|
222
|
+
...(depth > 0
|
|
223
|
+
? { initCallback: (gridster) => this.registerNestedGrid(gridster, gocInit) }
|
|
224
|
+
: {}),
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
/** Gọi `resize()` của một thẻ `<gridster>` qua chính instance mà nó tự gắn lên phần tử. */
|
|
228
|
+
resizeGridsterElement(nested) {
|
|
229
|
+
const giuInstance = nested;
|
|
230
|
+
giuInstance.__gridsterInstance?.options?.api?.resize?.();
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Gắn instance lên chính phần tử `<gridster>` rồi theo dõi bề rộng của nó.
|
|
234
|
+
*
|
|
235
|
+
* Phải gắn ngược lên DOM vì `itemResizeCallback` của khối CHA chỉ cầm được `HTMLElement`, không có
|
|
236
|
+
* đường nào khác đi từ đó về instance của lưới lồng bên trong.
|
|
237
|
+
*/
|
|
238
|
+
registerNestedGrid(gridster, goc) {
|
|
239
|
+
goc?.(gridster);
|
|
240
|
+
const instance = gridster;
|
|
241
|
+
const el = instance?.el;
|
|
242
|
+
if (!el || typeof ResizeObserver === 'undefined') {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
el.__gridsterInstance = instance;
|
|
246
|
+
const theoDoi = new ResizeObserver(() => instance?.options?.api?.resize?.());
|
|
247
|
+
theoDoi.observe(el);
|
|
248
|
+
this.nestedResizeObservers.add(theoDoi);
|
|
249
|
+
}
|
|
164
250
|
/**
|
|
165
251
|
*
|
|
166
252
|
* Gắn component của nơi dùng lên một khối.
|
|
@@ -221,8 +307,12 @@ export class LibsUiGridLayoutService {
|
|
|
221
307
|
for (const ref of this.componentRefs.values()) {
|
|
222
308
|
ref.destroy();
|
|
223
309
|
}
|
|
310
|
+
for (const observer of this.nestedResizeObservers) {
|
|
311
|
+
observer.disconnect();
|
|
312
|
+
}
|
|
224
313
|
this.pendingLoads.clear();
|
|
225
314
|
this.componentRefs.clear();
|
|
315
|
+
this.nestedResizeObservers.clear();
|
|
226
316
|
this.config = undefined;
|
|
227
317
|
}
|
|
228
318
|
// ─────────────────────────────────────────────────────────────────────────────────────────
|
|
@@ -349,6 +439,32 @@ export class LibsUiGridLayoutService {
|
|
|
349
439
|
}
|
|
350
440
|
return added;
|
|
351
441
|
}
|
|
442
|
+
/**
|
|
443
|
+
* Thêm một khối tại toạ độ (col, row) cụ thể và tự động đẩy các khối va chạm xuống dưới.
|
|
444
|
+
*/
|
|
445
|
+
insertBlockWithCollision(item, targetCol = 0, targetRow = 0, parentId) {
|
|
446
|
+
const root = this.rootNode();
|
|
447
|
+
const added = root
|
|
448
|
+
? this.treeService.insertWithCollision(root, parentId ?? root.id, item, targetCol, targetRow)
|
|
449
|
+
: undefined;
|
|
450
|
+
if (added) {
|
|
451
|
+
this.refresh();
|
|
452
|
+
}
|
|
453
|
+
return added;
|
|
454
|
+
}
|
|
455
|
+
activeDragPayload = signal(undefined);
|
|
456
|
+
/** Đặt payload khi bắt đầu kéo từ bên ngoài vào (ví dụ: palette, drawer) */
|
|
457
|
+
setDragPayload(payload) {
|
|
458
|
+
this.activeDragPayload.set(payload);
|
|
459
|
+
}
|
|
460
|
+
/** Lấy payload đang kéo */
|
|
461
|
+
getDragPayload() {
|
|
462
|
+
return this.activeDragPayload();
|
|
463
|
+
}
|
|
464
|
+
/** Xoá payload khi kết thúc kéo */
|
|
465
|
+
clearDragPayload() {
|
|
466
|
+
this.activeDragPayload.set(undefined);
|
|
467
|
+
}
|
|
352
468
|
/** Xoá một khối. Xoá container là xoá cả ruột. Trả `false` khi không xoá được (vd khối gốc). */
|
|
353
469
|
removeBlock(id) {
|
|
354
470
|
const root = this.rootNode();
|
|
@@ -358,10 +474,72 @@ export class LibsUiGridLayoutService {
|
|
|
358
474
|
}
|
|
359
475
|
return done;
|
|
360
476
|
}
|
|
477
|
+
/**
|
|
478
|
+
* Số cột thật của lưới cấp trang.
|
|
479
|
+
*
|
|
480
|
+
* 🔴 Mặc định phải TRÙNG `minCols/maxCols` của `gridLayoutRootConfig()`. Trước đây chỗ này trả 24
|
|
481
|
+
* trong khi lưới vẽ 12: nơi dùng không truyền `cols` thì va chạm, `toContainer` và `compact` tính
|
|
482
|
+
* theo 24 cột còn màn hình chỉ có 12 — khối rơi ra ngoài mép phải mà không ai hiểu vì sao.
|
|
483
|
+
*/
|
|
484
|
+
get totalColumns() {
|
|
485
|
+
return this.config?.cols ?? gridLayoutRootConfig().maxCols ?? 12;
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Đổi số cột / số hàng của một khối rồi vẽ lại.
|
|
489
|
+
*
|
|
490
|
+
* Kéo `cols` rộng quá mép phải thì dịch khối sang trái cho vừa, thay vì để nó tràn ra ngoài lưới.
|
|
491
|
+
*/
|
|
492
|
+
resizeBlock(id, size) {
|
|
493
|
+
const node = this.findBlock(id);
|
|
494
|
+
if (!node) {
|
|
495
|
+
return false;
|
|
496
|
+
}
|
|
497
|
+
if (size.cols !== undefined) {
|
|
498
|
+
node.cols = size.cols;
|
|
499
|
+
if (node.x + size.cols > this.totalColumns) {
|
|
500
|
+
node.x = Math.max(0, this.totalColumns - size.cols);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
if (size.rows !== undefined) {
|
|
504
|
+
node.rows = size.rows;
|
|
505
|
+
}
|
|
506
|
+
this.refresh();
|
|
507
|
+
return true;
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Nhân bản một khối — đặt kế bên phải nếu còn chỗ, không thì xuống dòng dưới.
|
|
511
|
+
*
|
|
512
|
+
* `transformData` để nơi dùng đổi phần dữ liệu riêng của mình (vd nối thêm "(Bản sao)" vào tiêu
|
|
513
|
+
* đề); thư viện không tự đoán trường nào là tiêu đề.
|
|
514
|
+
*/
|
|
515
|
+
duplicateBlock(id, transformData) {
|
|
516
|
+
const root = this.rootNode();
|
|
517
|
+
const node = root ? findNodeRecursive(root, id) : undefined;
|
|
518
|
+
if (!root || !node) {
|
|
519
|
+
return undefined;
|
|
520
|
+
}
|
|
521
|
+
const parent = findParentRecursive(root, id);
|
|
522
|
+
const isNested = Boolean(parent && parent.id !== root.id);
|
|
523
|
+
const clonedData = cloneDeep(node.data);
|
|
524
|
+
let targetX = node.x + node.cols;
|
|
525
|
+
let targetY = node.y;
|
|
526
|
+
if (targetX + node.cols > this.totalColumns) {
|
|
527
|
+
targetX = 0;
|
|
528
|
+
targetY = node.y + node.rows;
|
|
529
|
+
}
|
|
530
|
+
return this.addBlock({
|
|
531
|
+
x: targetX,
|
|
532
|
+
y: targetY,
|
|
533
|
+
cols: node.cols,
|
|
534
|
+
rows: node.rows,
|
|
535
|
+
data: transformData ? transformData(clonedData) : clonedData,
|
|
536
|
+
getComponentOutlet: node.getComponentOutlet,
|
|
537
|
+
}, isNested ? parent?.id : undefined);
|
|
538
|
+
}
|
|
361
539
|
/** Biến khối đơn thành CONTAINER — nội dung cũ thành khối con đầu tiên, không mất dữ liệu. */
|
|
362
540
|
toContainer(id) {
|
|
363
541
|
const root = this.rootNode();
|
|
364
|
-
const done = root ? this.treeService.toContainer(root, id, this.
|
|
542
|
+
const done = root ? this.treeService.toContainer(root, id, this.totalColumns) : false;
|
|
365
543
|
if (done) {
|
|
366
544
|
this.refresh();
|
|
367
545
|
}
|
|
@@ -382,7 +560,7 @@ export class LibsUiGridLayoutService {
|
|
|
382
560
|
if (!root) {
|
|
383
561
|
return;
|
|
384
562
|
}
|
|
385
|
-
this.treeService.compact(root, this.
|
|
563
|
+
this.treeService.compact(root, this.totalColumns);
|
|
386
564
|
this.refresh();
|
|
387
565
|
}
|
|
388
566
|
/**
|
|
@@ -407,6 +585,63 @@ export class LibsUiGridLayoutService {
|
|
|
407
585
|
const root = this.rootNode();
|
|
408
586
|
return root ? this.treeService.findParent(root, id) : undefined;
|
|
409
587
|
}
|
|
588
|
+
/**
|
|
589
|
+
* Đặt tỷ lệ thu phóng của canvas (kẹp giữa min và max).
|
|
590
|
+
*
|
|
591
|
+
* @param value Tỷ lệ (0.4 = 40%, 1.0 = 100%, 1.5 = 150%)
|
|
592
|
+
* @param persistKey Khóa localStorage để lưu lại (bỏ trống thì lấy từ config)
|
|
593
|
+
*/
|
|
594
|
+
setZoom(value, persistKey) {
|
|
595
|
+
const min = this.config?.zoomMin ?? 0.4;
|
|
596
|
+
const max = this.config?.zoomMax ?? 1.5;
|
|
597
|
+
const clamped = Math.min(max, Math.max(min, Math.round(value * 100) / 100));
|
|
598
|
+
this.zoomLevel.set(clamped);
|
|
599
|
+
const storageKey = persistKey ?? this.config?.storageKey;
|
|
600
|
+
if (storageKey && typeof localStorage !== 'undefined') {
|
|
601
|
+
try {
|
|
602
|
+
localStorage.setItem(storageKey, String(clamped));
|
|
603
|
+
}
|
|
604
|
+
catch {
|
|
605
|
+
// ignore localStorage access error
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
this.version.update((v) => v + 1);
|
|
609
|
+
}
|
|
610
|
+
/** Phóng to thêm một bước (mặc định 0.05 tức 5%) */
|
|
611
|
+
zoomIn(step, persistKey) {
|
|
612
|
+
const s = step ?? this.config?.zoomStep ?? 0.05;
|
|
613
|
+
this.setZoom(this.zoomLevel() + s, persistKey);
|
|
614
|
+
}
|
|
615
|
+
/** Thu nhỏ bớt một bước (mặc định 0.05 tức 5%) */
|
|
616
|
+
zoomOut(step, persistKey) {
|
|
617
|
+
const s = step ?? this.config?.zoomStep ?? 0.05;
|
|
618
|
+
this.setZoom(this.zoomLevel() - s, persistKey);
|
|
619
|
+
}
|
|
620
|
+
/** Đặt lại tỷ lệ thu phóng gốc 100% (1.0) */
|
|
621
|
+
resetZoom(persistKey) {
|
|
622
|
+
this.setZoom(1.0, persistKey);
|
|
623
|
+
}
|
|
624
|
+
/**
|
|
625
|
+
* Tự động tính toán và đặt tỷ lệ thu phóng để canvas vừa vặn với chiều rộng container.
|
|
626
|
+
*
|
|
627
|
+
* @param containerWidth Chiều rộng container đo được (px)
|
|
628
|
+
* @param stageWidth Chiều rộng chuẩn của canvas (mặc định 1668px)
|
|
629
|
+
* @param padding Khoảng cách lề hai bên (mặc định 48px)
|
|
630
|
+
* @param persistKey Khóa localStorage
|
|
631
|
+
* @returns Tỷ lệ thu phóng vừa tính
|
|
632
|
+
*/
|
|
633
|
+
fitToScreen(containerWidth, stageWidth, padding = 48, persistKey) {
|
|
634
|
+
const targetWidth = stageWidth ?? this.config?.stageWidth ?? 1668;
|
|
635
|
+
const min = this.config?.zoomMin ?? 0.4;
|
|
636
|
+
const max = 1.25;
|
|
637
|
+
const ratio = Math.min(max, Math.max(min, Math.round(((containerWidth - padding) / targetWidth) * 100) / 100));
|
|
638
|
+
this.setZoom(ratio, persistKey);
|
|
639
|
+
return ratio;
|
|
640
|
+
}
|
|
641
|
+
/** Kiểm tra tính năng thu phóng có được cấu hình bật không */
|
|
642
|
+
isZoomConfigured() {
|
|
643
|
+
return Boolean(this.config?.enableZoom);
|
|
644
|
+
}
|
|
410
645
|
/**
|
|
411
646
|
* Cổng DUY NHẤT cho canvas của thư viện. Nơi dùng KHÔNG gọi tới đây.
|
|
412
647
|
*
|
|
@@ -418,6 +653,13 @@ export class LibsUiGridLayoutService {
|
|
|
418
653
|
return {
|
|
419
654
|
maxContainerDepth: () => this.maxContainerDepth(),
|
|
420
655
|
containerPadding: () => this.containerPadding(),
|
|
656
|
+
isZoomEnabled: () => this.isZoomConfigured(),
|
|
657
|
+
zoom: () => this.zoomLevel(),
|
|
658
|
+
setZoom: (v, key) => this.setZoom(v, key),
|
|
659
|
+
zoomIn: (step, key) => this.zoomIn(step, key),
|
|
660
|
+
zoomOut: (step, key) => this.zoomOut(step, key),
|
|
661
|
+
resetZoom: (key) => this.resetZoom(key),
|
|
662
|
+
fitToScreen: (cW, sW, pad, key) => this.fitToScreen(cW, sW, pad, key),
|
|
421
663
|
gridsterOptions: (depth, cb) => this.buildGridsterOptions(depth, cb),
|
|
422
664
|
attachNode: (node, depth, host) => this.attachNode(node, depth, host),
|
|
423
665
|
detachNode: (nodeId) => this.detachNode(nodeId),
|
|
@@ -435,4 +677,4 @@ export class LibsUiGridLayoutService {
|
|
|
435
677
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiGridLayoutService, decorators: [{
|
|
436
678
|
type: Injectable
|
|
437
679
|
}], ctorParameters: () => [] });
|
|
438
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1sYXlvdXQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvc2VydmljZXMvZ3JpZC1sYXlvdXQvc3JjL2dyaWQtbGF5b3V0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixVQUFVLEVBQUUsVUFBVSxFQUFvQixNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQWdCLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNoRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFTN0Q7Ozs7Ozs7Ozs7R0FVRztBQUVILE1BQU0sT0FBTyx1QkFBdUI7SUFDbEMsNkZBQTZGO0lBQzdGLHdGQUF3RjtJQUN4RixtRkFBbUY7SUFDbEUsV0FBVyxHQUFHLElBQUksMkJBQTJCLEVBQUUsQ0FBQztJQUNqRSxvRkFBb0Y7SUFDbkUsWUFBWSxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO0lBRWhFO1FBQ0UsK0ZBQStGO1FBQy9GLHlGQUF5RjtRQUN6RiwrRkFBK0Y7UUFDL0YsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRU8sTUFBTSxDQUF1QjtJQUNwQixhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQWlDLENBQUM7SUFFekQsUUFBUSxHQUFHLE1BQU0sQ0FBZ0MsU0FBUyxDQUFDLENBQUM7SUFDNUQsUUFBUSxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUNuRCxxRUFBcUU7SUFDcEQsT0FBTyxH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QUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTztZQUNMLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUNqRCxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDL0MsZUFBZSxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQWUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDekYsVUFBVSxFQUFFLENBQUMsSUFBdUIsRUFBRSxLQUFhLEVBQUUsSUFBc0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQztZQUNsSCxVQUFVLEVBQUUsQ0FBQyxNQUFjLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1NBQ3hELENBQUM7SUFDSixDQUFDO0lBRU8sV0FBVyxDQUFDLEdBQTBCLEVBQUUsSUFBdUIsRUFBRSxLQUFhO1FBQ3BGLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzQixHQUFHLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUM1QyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO3dHQXhmVSx1QkFBdUI7NEdBQXZCLHVCQUF1Qjs7NEZBQXZCLHVCQUF1QjtrQkFEbkMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudFJlZiwgRGVzdHJveVJlZiwgSW5qZWN0YWJsZSwgVmlld0NvbnRhaW5lclJlZiwgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEdyaWRzdGVyQ29uZmlnLCBHcmlkc3Rlckl0ZW0gfSBmcm9tICdncmlkc3RlcjE4JztcbmltcG9ydCB7IGNsb25lRGVlcCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgdGFrZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZ3JpZExheW91dE5lc3RlZENvbmZpZywgZ3JpZExheW91dFJvb3RDb25maWcgfSBmcm9tICcuL2RlZmluZXMvZ3JpZHN0ZXItY29uZmlnLmRlZmluZSc7XG5pbXBvcnQgeyBMaWJzVWlHcmlkTGF5b3V0VHJlZVNlcnZpY2UgfSBmcm9tICcuL3RyZWUuc2VydmljZSc7XG5pbXBvcnQge1xuICBFX2dyaWRMYXlvdXRfbW9kZV9zdHJpbmcsXG4gIFRfZ3JpZExheW91dF9jaGFuZ2VFdmVudCxcbiAgVF9ncmlkTGF5b3V0X25ld05vZGUsXG4gIFRfZ3JpZExheW91dF9jb25maWcsXG4gIFRfZ3JpZExheW91dF9ub2RlLFxufSBmcm9tICcuL2ludGVyZmFjZXMvZ3JpZC1sYXlvdXQuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBE4buxbmcgbeG7mXQgbeG6t3QgcGjhurNuZyBrw6lvIHRo4bqjIHbDoCB04buxIGfhuq9uIGNvbXBvbmVudCBj4bunYSBuxqFpIGTDuW5nIGzDqm4gdOG7q25nIGto4buRaS5cbiAqXG4gKiBOxqFpIGTDuW5nIGNo4buJIGPhuqduIMSRxrBhIHbDoG86IGxv4bqhaSBjb21wb25lbnQgbXXhu5FuIGThu7FuZ1xuICogKGBub2RlQ29tcG9uZW50VHlwZWApIHbDoCBjw6J5IGThu68gbGnhu4d1IChgZGF0YWApLiBUb8OgbiBi4buZIHZp4buHYyB24bq9IGzGsOG7m2ksIGvDqW8gdGjhuqMsIMSR4buVaSBrw61jaCB0aMaw4bubYyxcbiAqIGzhu5NuZyBjb250YWluZXIgdsOgIGThu41uIGThurlwIGRvIHRoxrAgdmnhu4duIGxvLlxuICpcbiAqIPCflLQgxJDDonkgbMOgIHNlcnZpY2UgdGhlbyBU4buqTkcgbeG6t3QgcGjhurNuZywgS0jDlE5HIGBwcm92aWRlZEluOiAncm9vdCdgLiBLaGFpIHRyb25nIGBwcm92aWRlcnNgIGPhu6dhXG4gKiBjb21wb25lbnQgZMO5bmcgbsOzOyBoYWkgbeG6t3QgcGjhurNuZyB0csOqbiBjw7luZyBt4buZdCBtw6BuIHBo4bqjaSBsw6AgaGFpIHRo4buxYyB0aOG7gyByacOqbmcsIGTDuW5nIGNodW5nIHRow6xcbiAqIGBjb21wb25lbnRSZWZzYCBj4bunYSBt4bq3dCBwaOG6s25nIG7DoHkgYuG7iyBt4bq3dCBwaOG6s25nIGtpYSBk4buNbiBt4bqldC5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIExpYnNVaUdyaWRMYXlvdXRTZXJ2aWNlIHtcbiAgLy8g8J+UtCBU4buwIFThuqBPLCBraMO0bmcgYGluamVjdGAuIE7GoWkgZMO5bmcgY2jhu4kgcGjhuqNpIHZp4bq/dCBgcHJvdmlkZXJzOiBbTGlic1VpR3JpZExheW91dFNlcnZpY2VdYCDigJRcbiAgLy8ga2jDtG5nIHBo4bqjaSBiaeG6v3QgYsOqbiB0cm9uZyB0aMawIHZp4buHbiBjw7JuIHNlcnZpY2UgbsOgbyBraMOhYyAobmfGsOG7nWkgZMO5bmcgY2jhu5F0IDI4LzA4LzIwMjYpLlxuICAvLyBgVHJlZVNlcnZpY2VgIGtow7RuZyBnaeG7ryB0cuG6oW5nIHRow6FpIGTDuW5nIGNodW5nIG7Dqm4gbeG7l2kgbeG6t3QgcGjhurNuZyBt4buZdCBi4bqjbiBsw6AgxJHDum5nLlxuICBwcml2YXRlIHJlYWRvbmx5IHRyZWVTZXJ2aWNlID0gbmV3IExpYnNVaUdyaWRMYXlvdXRUcmVlU2VydmljZSgpO1xuICAvKiogTMaw4bujdCB04bqjaSBjb21wb25lbnQgxJFhbmcgY2jhu50sIHRoZW8gaWQga2jhu5FpIOKAlCDEkeG7gyBodeG7tyBraGkga2jhu5FpIGLhu4sgZ+G7oSBnaeG7r2EgY2jhu6tuZy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nTG9hZHMgPSBuZXcgTWFwPHN0cmluZywgU3Vic2NyaXB0aW9uPigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIPCflLQgU2VydmljZSBraGFpIHRyb25nIGBwcm92aWRlcnNgIGPhu6dhIGNvbXBvbmVudCBuw6puIEFuZ3VsYXIgaHXhu7cgbsOzIGPDuW5nIGNvbXBvbmVudCDigJQgdGjGsCB2aeG7h25cbiAgICAvLyB04buxIGThu41uIOG7nyDEkcOieSwgbsahaSBkw7luZyBLSMOUTkcgcGjhuqNpIGfhu41pIGBkZXN0cm95KClgIHRyb25nIGBuZ09uRGVzdHJveWAgKG5nxrDhu51pIGTDuW5nIGNo4buRdFxuICAgIC8vIDI4LzA4LzIwMjYpLiBC4bqvdCBuaOG7myBt4buZdCBixrDhu5tjIGThu41uIGThurlwIGzDoCBraeG7g3UgQVBJIGThu4UgcXXDqm4sIHbDoCBxdcOqbiB0aMOsIHLDsiBy4buJIGLhu5kgbmjhu5sgaW0gbOG6t25nLlxuICAgIGluamVjdChEZXN0cm95UmVmKS5vbkRlc3Ryb3koKCkgPT4gdGhpcy5kZXN0cm95KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25maWc/OiBUX2dyaWRMYXlvdXRfY29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbXBvbmVudFJlZnMgPSBuZXcgTWFwPHN0cmluZywgQ29tcG9uZW50UmVmPHVua25vd24+PigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcm9vdE5vZGUgPSBzaWduYWw8VF9ncmlkTGF5b3V0X25vZGUgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWRpdE1vZGUgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogdMSDbmcgbeG7l2kgbOG6p24gY8OieSDEkeG7lWkg4oCUIGNvbXBvbmVudCBjb24gxJHhu41jIMSR4buDIGJp4bq/dCBwaOG6o2kgdMOtbmggbOG6oWkgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB2ZXJzaW9uID0gc2lnbmFsPG51bWJlcj4oMCk7XG5cbiAgLyoqXG4gICAqIFNpZ25hbCBjaOG7iSDEkeG7jWMgxJHhu4MgbsahaSBkw7luZyB0aGVvIGTDtWkuXG4gICAqXG4gICAqIPCflLQgTMOgIFRIVeG7mEMgVMONTkgsIGtow7RuZyBwaOG6o2kgZ2V0dGVyLiBHZXR0ZXIgdHLhuqMgc2lnbmFsIHRow6wgY2jhu5cgxJHhu41jIHBo4bqjaSB2aeG6v3QgYFZlcnNpb24oKSgpYCDigJRcbiAgICogcXXDqm4gY+G6t3Agbmdv4bq3YyB0aOG7qSBoYWkgbMOgIGNvbXB1dGVkIEtIw5RORyBwaOG7pSB0aHXhu5ljIHbDoG8gbsOzLCBjw6J5IMSR4buVaSBtw6AgbMaw4bubaSDEkeG7qW5nIGltLCB2w6BcbiAgICogVHlwZVNjcmlwdCBraMO0bmcgaOG7gSBiw6FvIGzhu5dpICjEkW8gMjgvMDgvMjAyNjogdGjDqm0ga2jhu5FpIGtow7RuZyBoaeG7h24sIHPhuq9wIGfhu41uIGtow7RuZyBuaMO6YyBuaMOtY2gpLlxuICAgKi9cbiAgcmVhZG9ubHkgUm9vdCA9IHRoaXMucm9vdE5vZGUuYXNSZWFkb25seSgpO1xuICByZWFkb25seSBJc0VkaXRNb2RlID0gdGhpcy5lZGl0TW9kZS5hc1JlYWRvbmx5KCk7XG4gIC8qKiB0xINuZyBt4buXaSBs4bqnbiBjw6J5IGhv4bq3YyBj4bqldSBow6xuaCDEkeG7lWkgKi9cbiAgcmVhZG9ubHkgVmVyc2lvbiA9IHRoaXMudmVyc2lvbi5hc1JlYWRvbmx5KCk7XG5cbiAgLyoqXG4gICAqIHRy4bqnbiBz4buRIGPhuqVwIGNvbnRhaW5lciBs4buTbmcgbmhhdSDigJQgY2FudmFzIMSR4buNYyDEkeG7gyBiaeG6v3QgY8OzIGNobyBjaHV54buDbiB0aMOgbmggY29udGFpbmVyIGtow7RuZyAqL1xuICBwcml2YXRlIG1heENvbnRhaW5lckRlcHRoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnPy5tYXhDb250YWluZXJEZXB0aCA/PyAxO1xuICB9XG5cbiAgLyoqXG4gICAqIGzhu4EgdHJvbmcgY+G7p2EgY29udGFpbmVyLCBweCDigJQgY2FudmFzIMSR4buNYyDEkeG7gyDEkeG6t3QgcGFkZGluZyBsw6puIHbhu48gY29udGFpbmVyICovXG4gIHByaXZhdGUgY29udGFpbmVyUGFkZGluZygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZz8uY29udGFpbmVyUGFkZGluZyA/PyAxMjtcbiAgfVxuXG4gIC8qKiBLaOG7n2kgdOG6oW8gbeG6t3QgcGjhurNuZy4gR+G7jWkgbOG6oWkgc+G6vSBk4buNbiBz4bqhY2ggY29tcG9uZW50IGPFqSBy4buTaSBk4buxbmcgbOG6oWkgdOG7qyDEkeG6p3UuICovXG4gIGluaXQoY29uZmlnOiBUX2dyaWRMYXlvdXRfY29uZmlnKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgLy8g8J+UtCBC4buRIGPhu6VjIMSQw4MgTMavVSBraMO0bmcgxJFpIHF1YSBsdeG6rXQgY2jhurduIG7DoG8gY+G7p2EgZ2lhbyBkaeG7h246IGLhuqNuIGzGsHUgY8WpIChzaW5oIHRyxrDhu5tjIGtoaSBjw7MgdHLhuqduLFxuICAgIC8vIGhv4bq3YyBkbyB0aGFvIHTDoWMgbOG7l2kpIHbhuqtuIG1hbmcgY29udGFpbmVyIGzhu5NuZyBjb250YWluZXIuIFRy4bqnbiBgbWF4Q29udGFpbmVyRGVwdGhgIGNo4buJIOG6qW4gTsOaVFxuICAgIC8vIHRyw6puIGNhbnZhcyDigJQgbsOzIGtow7RuZyBz4butYSBk4buvIGxp4buHdSwgbsOqbiB0aGnhur91IGTDsm5nIG7DoHkgbMOgIHbhur0gcmEgxJHDum5nIGPDonkgcXXDoSBzw6J1IMSRw7MuXG4gICAgLy8gTsahaSBkw7luZyBLSMOUTkcgdOG7sSBn4buNaSDEkcaw4bujYzogYExpYnNVaUdyaWRMYXlvdXRUcmVlU2VydmljZWAgY+G7kSDDvSBraMO0bmcgeHXhuqV0LlxuICAgIHRoaXMudHJlZVNlcnZpY2UuZmxhdHRlbk92ZXJEZXB0aENvbnRhaW5lcnMoY29uZmlnLmRhdGEsIHRoaXMubWF4Q29udGFpbmVyRGVwdGgoKSk7XG4gICAgdGhpcy5hc3NpZ25PdmVybGFwTGF5ZXJzKGNvbmZpZy5kYXRhKTtcbiAgICAvLyDwn5S0IE5ow6JuIGLhuqNuIG5oxrAgYHJlZnJlc2goKWA6IGBpbml0KClgIGzhuqFpICjEkeG7lWkgY2jhur8gxJHhu5ksIGLhuq10L3Thuq90IGNo4buTbmcga2jhu5FpKSB0csOqbiBDw5lORyBvYmplY3QgY8OieVxuICAgIC8vIHRow6wgYEBmb3JgIGtow7RuZyBk4buxbmcgbOG6oWkgYGdyaWRzdGVyLWl0ZW1gLCBuw6puIGBsYXllckluZGV4YCB24burYSBnw6FuIGtow7RuZyB04bubaSBgJGl0ZW1gIHbDoCBraOG7kWlcbiAgICAvLyB24bqrbiBraMO0bmcgxJHDqCBuaGF1IMSRxrDhu6NjICjEkW8gMjgvMDgvMjAyNjogYGl0ZW0ubGF5ZXJJbmRleGAgPSAxfDJ8M3w0fDcgbcOgIGAkaXRlbS5sYXllckluZGV4YFxuICAgIC8vIHRvw6BuIGB1bmRlZmluZWRgKS5cbiAgICB0aGlzLnJvb3ROb2RlLnNldCh0aGlzLnNoYWxsb3dDbG9uZVRyZWUoY29uZmlnLmRhdGEpKTtcbiAgICB0aGlzLmVkaXRNb2RlLnNldChjb25maWcuaXNFZGl0TW9kZSA/PyBmYWxzZSk7XG4gICAgdGhpcy52ZXJzaW9uLnVwZGF0ZSgodikgPT4gdiArIDEpO1xuICB9XG5cbiAgc2V0RWRpdE1vZGUodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRNb2RlLnNldCh2YWx1ZSk7XG4gICAgLy8g8J+UtCBQSOG6okkgYsahbSBgdmVyc2lvbmA6IGBncmlkc3Rlck9wdGlvbnMoKWAgxJHhu41jIGBlZGl0TW9kZWAgxJHhu4MgYuG6rXQvdOG6r3Qga8Opb+KAk3Ro4bqjLCBtw6AgY29tcHV0ZWRcbiAgICAvLyBgZ3JpZE9wdGlvbnNgIGLDqm4gY2FudmFzIGNo4buJIGNo4bqheSBs4bqhaSBraGkgYFZlcnNpb25gIMSR4buVaS4gVGhp4bq/dSBkw7JuZyBuw6B5IHRow6wgxJHhu5VpIGNo4bq/IMSR4buZIHhvbmdcbiAgICAvLyBncmlkc3RlciB24bqrbiBnaeG7ryBvcHRpb25zIGPFqSDigJQgY2h1eeG7g24gc2FuZyBYRU0gbcOgIGto4buRaSB24bqrbiBrw6lvIMSRxrDhu6NjLlxuICAgIHRoaXMudmVyc2lvbi51cGRhdGUoKHYpID0+IHYgKyAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBC4bqtdC904bqvdCBjaG8ga2jhu5FpIGNo4buTbmcgbMOqbiBuaGF1IOKAlCBLSMOUTkcgZOG7sW5nIGzhuqFpIG3hurd0IHBo4bqzbmcuXG4gICAqXG4gICAqIFRyxrDhu5tjIMSRw6J5IG7GoWkgZMO5bmcgcGjhuqNpIGfhu41pIGBpbml0KClgIGzhuqFpIMSR4buDIMSR4buVaSBj4budIG7DoHksIG3DoCBgaW5pdCgpYCBodeG7tyBz4bqhY2ggcuG7k2kgZOG7sW5nIGzhuqFpIG3hu41pXG4gICAqIGNvbXBvbmVudCBu4buZaSBkdW5nIOKAlCBsw6NuZyBwaMOtLCB2w6AgbmfGsOG7nWkgZMO5bmcgdGjhuqV5IG3DoG4gY2jhu5twIChuZ8aw4budaSBkw7luZyBjaOG7kXQgMjgvMDgvMjAyNikuXG4gICAqL1xuICBzZXRBbGxvd092ZXJsYXAodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jb25maWcgPSB7IC4uLnRoaXMuY29uZmlnLCBhbGxvd092ZXJsYXA6IHZhbHVlIH07XG5cbiAgICBjb25zdCByb290ID0gdGhpcy5yb290Tm9kZSgpO1xuXG4gICAgaWYgKCFyb290KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g8J+UtCBHw6FuIGzhu5twIHbDoG8gQ8OCWSDEkEFORyBW4bq8IChgcm9vdE5vZGVgKSwgS0jDlE5HIHBo4bqjaSBgY29uZmlnLmRhdGFgLlxuICAgIC8vIGBpbml0KClgIMSRw6MgY2xvbmUgYGNvbmZpZy5kYXRhYCBzYW5nIGByb290Tm9kZWAgbsOqbiBoYWkgb2JqZWN0IEtIw4FDIG5oYXU7IGfDoW4gdsOgbyBgY29uZmlnLmRhdGFgXG4gICAgLy8gdGjDrCBgcmVmcmVzaCgpYCBjbG9uZSBs4bqhaSB04burIGByb290Tm9kZWAg4oCUIGzhu5twIHbhu6thIGfDoW4ga2jDtG5nIHThu5tpIGBncmlkc3Rlci1pdGVtYCBuw6BvLCBgei1pbmRleGBcbiAgICAvLyBj4bunYSBt4buNaSBraOG7kWkgxJHhu6luZyDhu58gYDFgIHbDoCBraOG7kWkgbsOgbyB24bq9IHNhdSB0aMOsIG7hurFtIHRyw6puOiBjaOG7k25nIGto4buRaSBcImzDumMgxJHGsOG7o2MgbMO6YyBraMO0bmdcIlxuICAgIC8vICjEkW8gMDQvMDkvMjAyNjogYGl0ZW0ubGF5ZXJJbmRleGAgdW5kZWZpbmVkLCBgZ2V0TGF5ZXJJbmRleCgpYCA9IDAgY2hvIGPhuqMgOCBraOG7kWkpLlxuICAgIHRoaXMuYXNzaWduT3ZlcmxhcExheWVycyhyb290KTtcbiAgICAvLyBUaGF5IHRoYW0gY2hp4bq/dSBjw6J5IMSR4buDIGBsYXllckluZGV4YCB24burYSBnw6FuIHThu5tpIMSRxrDhu6NjIGAkaXRlbWAgY+G7p2EgZ3JpZHN0ZXI7IGNvbXBvbmVudCBu4buZaSBkdW5nXG4gICAgLy8gS0jDlE5HIGLhu4sgZOG7sW5nIGzhuqFpIHbDrCBgYXR0YWNoTm9kZWAgbmjhuq1uIHJhIGlkIGPFqSB2w6AgY2jhu4kgYHNldElucHV0YC5cbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBD4bqldSBow6xuaCBncmlkc3RlciBjaG8gbeG7mXQgY+G6pXAgbMaw4bubaS5cbiAgICpcbiAgICogQHBhcmFtIGRlcHRoIDAgPSBsxrDhu5tpIGPhuqVwIHRyYW5nLCDiiaUgMSA9IGzGsOG7m2kgbOG7k25nIHRyb25nIGNvbnRhaW5lclxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEdyaWRzdGVyT3B0aW9ucyhkZXB0aDogbnVtYmVyLCBpdGVtQ2hhbmdlQ2FsbGJhY2s/OiAoKSA9PiB2b2lkKTogR3JpZHN0ZXJDb25maWcge1xuICAgIGNvbnN0IGJhc2UgPSBkZXB0aCA9PT0gMCA/IGdyaWRMYXlvdXRSb290Q29uZmlnKCkgOiBncmlkTGF5b3V0TmVzdGVkQ29uZmlnKCk7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XG5cbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgcmV0dXJuIGJhc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaXNGcmVlTW9kZSA9IGNvbmZpZy5tb2RlID09PSBFX2dyaWRMYXlvdXRfbW9kZV9zdHJpbmcuZnJlZTtcbiAgICBjb25zdCBjYW5FZGl0ID0gdGhpcy5lZGl0TW9kZSgpO1xuICAgIGNvbnN0IGNhbk92ZXJsYXAgPSBpc0ZyZWVNb2RlIHx8IChjb25maWcuYWxsb3dPdmVybGFwID8/IGZhbHNlKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5iYXNlLFxuICAgICAgLi4uKGNvbmZpZy5jb2xzID8geyBtaW5Db2xzOiBjb25maWcuY29scywgbWF4Q29sczogY29uZmlnLmNvbHMsIG1heEl0ZW1Db2xzOiBjb25maWcuY29scyB9IDoge30pLFxuICAgICAgLi4uKGNvbmZpZy5yb3dIZWlnaHQgJiYgZGVwdGggPT09IDAgPyB7IGZpeGVkUm93SGVpZ2h0OiBjb25maWcucm93SGVpZ2h0IH0gOiB7fSksXG4gICAgICAvLyBLaGUgdsOgIGNoaeG7gXUgY2FvIGjDoG5nIGtow6FjIG5oYXUgdGhlbyBj4bqlcDogbMaw4bubaSB0cmFuZyB0aG/DoW5nLCBsxrDhu5tpIGzhu5NuZyBraMOtdC5cbiAgICAgIC4uLihkZXB0aCA9PT0gMCAmJiBjb25maWcubWFyZ2luICE9PSB1bmRlZmluZWQgPyB7IG1hcmdpbjogY29uZmlnLm1hcmdpbiB9IDoge30pLFxuICAgICAgLi4uKGRlcHRoID4gMCAmJiBjb25maWcubmVzdGVkTWFyZ2luICE9PSB1bmRlZmluZWQgPyB7IG1hcmdpbjogY29uZmlnLm5lc3RlZE1hcmdpbiB9IDoge30pLFxuICAgICAgLi4uKGRlcHRoID4gMCAmJiBjb25maWcubmVzdGVkUm93SGVpZ2h0ICE9PSB1bmRlZmluZWQgPyB7IGZpeGVkUm93SGVpZ2h0OiBjb25maWcubmVzdGVkUm93SGVpZ2h0IH0gOiB7fSksXG4gICAgICAuLi4oZGVwdGggPT09IDAgJiYgY29uZmlnLm91dGVyTWFyZ2luICE9PSB1bmRlZmluZWQgPyB7IG91dGVyTWFyZ2luOiBjb25maWcub3V0ZXJNYXJnaW4gfSA6IHt9KSxcbiAgICAgIC4uLihkZXB0aCA9PT0gMCAmJiBjb25maWcub3V0ZXJNYXJnaW5Cb3R0b20gIT09IHVuZGVmaW5lZCA/IHsgb3V0ZXJNYXJnaW5Cb3R0b206IGNvbmZpZy5vdXRlck1hcmdpbkJvdHRvbSB9IDoge30pLFxuICAgICAgLi4uKGNvbmZpZy5taW5JdGVtUm93cyAhPT0gdW5kZWZpbmVkID8geyBtaW5JdGVtUm93czogY29uZmlnLm1pbkl0ZW1Sb3dzIH0gOiB7fSksXG4gICAgICAuLi4oY29uZmlnLmRlZmF1bHRJdGVtQ29scyAhPT0gdW5kZWZpbmVkID8geyBkZWZhdWx0SXRlbUNvbHM6IGNvbmZpZy5kZWZhdWx0SXRlbUNvbHMgfSA6IHt9KSxcbiAgICAgIC4uLihjb25maWcuZGVmYXVsdEl0ZW1Sb3dzICE9PSB1bmRlZmluZWQgPyB7IGRlZmF1bHRJdGVtUm93czogY29uZmlnLmRlZmF1bHRJdGVtUm93cyB9IDoge30pLFxuXG4gICAgICAvLyDwn5S0IENo4bq/IMSR4buZIFhFTSBwaOG6o2kgVOG6rlQgaOG6s24ga8OpbyB2w6AgxJHhu5VpIGvDrWNoIHRoxrDhu5tjLlxuICAgICAgLy8gYGJhc2VgIGx1w7RuIMSR4buDIGBlbmFibGVkOiB0cnVlYDsga2jDtG5nIGdoaSDEkcOoIHRoZW8gYGVkaXRNb2RlYCB0aMOsIG5nxrDhu51pIHhlbSB24bqrbiBrw6lvIMSRxrDhu6NjIGto4buRaVxuICAgICAgLy8gdsOgIMSR4buVaSBi4buRIGPhu6VjIGPhu6dhIG5nxrDhu51pIGtow6FjIChuZ8aw4budaSBkw7luZyBiw6FvIDI4LzA4LzIwMjY6IFwixJFhbmcgeGVtIG3DoCB24bqrbiBrw6lvIHRo4bqjIHRoYXkgxJHhu5VpXG4gICAgICAvLyB24buLIHRyw60gdsOgIHRow6ptIGto4buRaSDEkcaw4bujY1wiKS5cbiAgICAgIGRyYWdnYWJsZTogeyAuLi5iYXNlLmRyYWdnYWJsZSwgZW5hYmxlZDogY2FuRWRpdCB9LFxuICAgICAgcmVzaXphYmxlOiB7IC4uLmJhc2UucmVzaXphYmxlLCBlbmFibGVkOiBjYW5FZGl0IH0sXG5cbiAgICAgIC8vIENo4bq/IMSR4buZIHThu7EgZG8gTFXDlE4gY2hvIGNo4buTbmc7IGNo4bq/IMSR4buZIGzGsOG7m2kgdGjDrCB0aGVvIGPhu50gY+G7p2EgbsahaSBkw7luZy5cbiAgICAgIGFsbG93TXVsdGlMYXllcjogY2FuT3ZlcmxhcCxcbiAgICAgIC8vIPCflLQgQuG6rXQgYGFsbG93TXVsdGlMYXllcmAgTeG7mFQgTcOMTkgga2jDtG5nIMSR4bunLiBNw6MgbGliIHNvIGBsYXllckluZGV4YCBj4bunYSBoYWkga2jhu5FpOiBLSMOBQyBuaGF1XG4gICAgICAvLyB0aMOsIGNobyDEkcOoLCBHSeG7kE5HIG5oYXUgduG6q24gYsOhbyB2YSBjaOG6oW0uIEto4buRaSBraMO0bmcga2hhaSBgbGF5ZXJJbmRleGAgxJHhu4F1IHLGoWkgduG7gVxuICAgICAgLy8gYGRlZmF1bHRMYXllckluZGV4YCDigJQgdOG7qWMgY8O5bmcgbOG7m3AsIHbDoCB24bqrbiBi4buLIMSR4bqpeSBuaGF1IG5oxrAgbMaw4bubaSB0aMaw4budbmcgKG5nxrDhu51pIGTDuW5nIGLDoW9cbiAgICAgIC8vIDI4LzA4LzIwMjY6IFwiYuG6rXQgY2jhu5NuZyBraOG7kWkgbmjGsG5nIGtoaSBrw6lvIHRow6wgY8OhYyBraOG7kWkgduG6q24gZGkgY2h1eeG7g24gdGhlb1wiKS5cbiAgICAgIC8vIENobyBjaOG7k25nIHRow6wgcGjhuqNpIFThuq5UIMSR4bqpeSBraOG7kWksIG7hur91IGtow7RuZyBraOG7kWkgYuG7iyBk4bqhdCDEkWkgdHLGsOG7m2Mga2hpIGvhu4twIMSRw6ggbMOqbiBuaGF1LlxuICAgICAgLi4uKGNhbk92ZXJsYXAgPyB7IHB1c2hJdGVtczogZmFsc2UsIHB1c2hSZXNpemVJdGVtczogZmFsc2UsIHN3YXA6IGZhbHNlLCBzd2FwV2hpbGVEcmFnZ2luZzogZmFsc2UgfSA6IHt9KSxcblxuICAgICAgaXRlbUNoYW5nZUNhbGxiYWNrOiAoaXRlbTogR3JpZHN0ZXJJdGVtKSA9PiB7XG4gICAgICAgIC8vIPCflLQgS2jhu5FpIHbhu6thIHRoYW8gdMOhYyBwaOG6o2kgbMOqbiBM4buaUCBUUsOKTiBDw5lORy5cbiAgICAgICAgLy8gYGxheWVySW5kZXhgIGfDoW4gbeG7mXQgbOG6p24gdGhlbyB0aOG7qSB04buxIGPDonkgbMO6YyBraOG7n2kgdOG6oW8sIG7Dqm4ga2jhu5FpIGvDqW8gbMOqbiBjaOG7iSBu4buVaSBUUk9ORyBMw5pDXG4gICAgICAgIC8vIGvDqW8gKG5o4budIGB6LWluZGV4OiAzMGAgY+G7p2EgbOG7m3AgYGdyaWRzdGVyLWl0ZW0tbW92aW5nYCk7IHRo4bqjIHRheSByYSBsw6AgduG7gSBs4bubcCBjxakgdsOgIGLhu4sga2jhu5FpXG4gICAgICAgIC8vIMSR4bupbmcgc2F1IHRyb25nIGPDonkgxJHDqCBuZ8aw4bujYyBsw6puIChuZ8aw4budaSBkw7luZyBiw6FvIDI4LzA4LzIwMjYsIMSRbyDEkcaw4bujYzoga8OpbyB6PTMwLCB0aOG6oyB24buBXG4gICAgICAgIC8vIHo9MTAgdHJvbmcga2hpIGhhaSBraOG7kWkga+G6vyBiw6puIMSRYW5nIHo9MTEgdsOgIHo9MTIpLlxuICAgICAgICBpZiAoY2FuT3ZlcmxhcCkge1xuICAgICAgICAgIHRoaXMucmFpc2VUb1RvcExheWVyKGl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52ZXJzaW9uLnVwZGF0ZSgodikgPT4gdiArIDEpO1xuICAgICAgICBpdGVtQ2hhbmdlQ2FsbGJhY2s/LigpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEfhuq9uIGNvbXBvbmVudCBj4bunYSBuxqFpIGTDuW5nIGzDqm4gbeG7mXQga2jhu5FpLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCBjaOG7lyBn4bqvbiBSScOKTkcgY+G7p2Egw7QgxJHDsyDigJQgbeG7l2kga2jhu5FpIG3hu5l0IGBWaWV3Q29udGFpbmVyUmVmYCwgZMO5bmcgY2h1bmcgbeG7mXQgY8OhaSB0aMOsXG4gICAqICAgbeG7jWkgY29tcG9uZW50IGLhu4sgZOG7k24gaOG6v3QgdsOgbyBt4buZdCDDtC5cbiAgICovXG4gIHByaXZhdGUgYXR0YWNoTm9kZShub2RlOiBUX2dyaWRMYXlvdXRfbm9kZSwgZGVwdGg6IG51bWJlciwgaG9zdDogVmlld0NvbnRhaW5lclJlZik6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuY29tcG9uZW50UmVmcy5nZXQobm9kZS5pZCk7XG5cbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIHRoaXMuYXBwbHlJbnB1dHMoZXhpc3RpbmcsIG5vZGUsIGRlcHRoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEto4buRaSB04buxIGtoYWkgdGjDrCBo4buPaSBuw7M7IGtow7RuZyB0aMOsIGjhu49pIGjDoG0gcGjDom4gZ2nhuqNpIGNodW5nLiBD4bqjIGhhaSDEkeG7gXUgbmjhuq1uIGBub2RlYCDEkeG7gyDEkeG7jWNcbiAgICAvLyDEkcaw4bujYyBgZGF0YS50eXBlYCBtw6AgcXV54bq/dCDEkeG7i25oIHRy4bqjIGNvbXBvbmVudCBuw6BvLlxuICAgIGNvbnN0IHN0cmVhbSA9IChub2RlLmdldENvbXBvbmVudE91dGxldCA/PyBjb25maWcuZ2V0Q29tcG9uZW50T3V0bGV0KT8uKG5vZGUpO1xuXG4gICAgaWYgKCFzdHJlYW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDwn5S0IEh14bu3IGzGsOG7o3QgdOG6o2kgQ8WoIGPhu6dhIMSRw7puZyBraOG7kWkgbsOgeSB0csaw4bubYyBraGkgbeG7nyBsxrDhu6N0IG3hu5tpLlxuICAgIC8vIEto4buRaSBi4buLIGfhu6EgcuG7k2kgZ+G6r24gbOG6oWkgKMSR4buVaSBi4buRIGPhu6VjLCBz4bqvcCBn4buNbikgdHJvbmcgbMO6YyBgaW1wb3J0KClgIGNoxrBhIHhvbmcgdGjDrCBsxrDhu6N0IGPFqSB24bqrblxuICAgIC8vIGNo4bqheSB0aeG6v3AgdsOgIGThu7FuZyBjb21wb25lbnQgdsOgbyBt4buZdCBgVmlld0NvbnRhaW5lclJlZmAgxJHDoyBjaOG6v3QuXG4gICAgdGhpcy5wZW5kaW5nTG9hZHMuZ2V0KG5vZGUuaWQpPy51bnN1YnNjcmliZSgpO1xuXG4gICAgY29uc3Qgc3ViID0gc3RyZWFtLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKChjb21wb25lbnRUeXBlKSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmdMb2Fkcy5kZWxldGUobm9kZS5pZCk7XG5cbiAgICAgIC8vIEto4buRaSBjw7MgdGjhu4MgxJHDoyBi4buLIHhvw6EgdHJvbmcgbMO6YyBjaOG7nSB04bqjaSDigJQgZOG7sW5nIHbDoG8gxJHDonkgbMOgIHLDsiBy4buJLlxuICAgICAgaWYgKCF0aGlzLnRyZWVTZXJ2aWNlLmZpbmRCeUlkKHRoaXMucm9vdE5vZGUoKSA/PyBub2RlLCBub2RlLmlkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlZiA9IGhvc3QuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudFR5cGUpO1xuXG4gICAgICB0aGlzLmFwcGx5SW5wdXRzKHJlZiwgbm9kZSwgZGVwdGgpO1xuICAgICAgdGhpcy5jb21wb25lbnRSZWZzLnNldChub2RlLmlkLCByZWYpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5wZW5kaW5nTG9hZHMuc2V0KG5vZGUuaWQsIHN1Yik7XG4gIH1cblxuICAvKipcbiAgICogR+G7oSBjb21wb25lbnQgY+G7p2EgbeG7mXQga2jhu5FpIHbDoCBodeG7tyBuw7MuICovXG4gIHByaXZhdGUgZGV0YWNoTm9kZShub2RlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEto4buRaSBi4buLIGfhu6Ega2hpIGNvbXBvbmVudCBj4bunYSBuw7MgY8OybiDEkWFuZyB04bqjaSDigJQgcGjhuqNpIGh14bu3IGzGsOG7o3QgdOG6o2ksIGtow7RuZyB0aMOsIG7DsyBk4buxbmcgdsOgbyBt4buZdFxuICAgIC8vIGBWaWV3Q29udGFpbmVyUmVmYCDEkcOjIGNo4bq/dC5cbiAgICB0aGlzLnBlbmRpbmdMb2Fkcy5nZXQobm9kZUlkKT8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnBlbmRpbmdMb2Fkcy5kZWxldGUobm9kZUlkKTtcblxuICAgIGNvbnN0IHJlZiA9IHRoaXMuY29tcG9uZW50UmVmcy5nZXQobm9kZUlkKTtcblxuICAgIGlmICghcmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmVmLmRlc3Ryb3koKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZnMuZGVsZXRlKG5vZGVJZCk7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBzdWIgb2YgdGhpcy5wZW5kaW5nTG9hZHMudmFsdWVzKCkpIHtcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVmIG9mIHRoaXMuY29tcG9uZW50UmVmcy52YWx1ZXMoKSkge1xuICAgICAgcmVmLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICB0aGlzLnBlbmRpbmdMb2Fkcy5jbGVhcigpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmcy5jbGVhcigpO1xuICAgIHRoaXMuY29uZmlnID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIE5ow7NtIGjDoG0gY2hvIG7GoWkgZMO5bmcgQ0jhu6YgxJDhu5hORyBn4buNaSDigJQga2jDtG5nIHBo4bqjaSBjaOG7nSBuZ8aw4budaSBkw7luZyBi4bqlbSBuw7p0IHRyw6puIGto4buRaS5cbiAgLy8gU+G7rWEgY8OieSB0aMOsIGTDuW5nIHRo4bqzbmcgYFRyZWVTZXJ2aWNlYCBy4buTaSBn4buNaSBgcmVmcmVzaCgpYCDigJQgeGVtIGRlbW8gdHJvbmcgY29yZS11aS5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIELDoW8gY2hvIHNlcnZpY2UgYmnhur90IGPDonkgduG7q2EgxJHhu5VpIHThu6sgYsOqbiBuZ2/DoGkgKHRow6ptL3hvw6Ega2jhu5FpLCBz4bqvcCBn4buNbiwgbuG6oXAgYuG7kSBj4bulYyBraMOhYykuXG4gICAqXG4gICAqIPCflLQgUEjhuqJJIHRoYXkgVEhBTSBDSEnhur5VIGPhu6dhIG5vZGUgZ+G7kWMsIGtow7RuZyBjaOG7iSBixqFtIGB2ZXJzaW9uYC5cbiAgICogYEBmb3Ig4oCmIHRyYWNrIGl0ZW0uaWRgIGdp4buvIG5ndXnDqm4gb2JqZWN0IGtoaSBpZCBraMO0bmcgxJHhu5VpLCBuw6puIGA8Z3JpZHN0ZXItaXRlbSBbaXRlbV09XCLigKZcIj5gIHbhuqtuXG4gICAqIG5o4bqtbiDEkcO6bmcgb2JqZWN0IGPFqSB2w6AgZ3JpZHN0ZXIga2jDtG5nIGjhu4EgYmnhur90IGB4L3kvY29scy9yb3dzL2xheWVySW5kZXhgIHbhu6thIGLhu4sgc+G7rWEuIELGoW0gbeG7l2lcbiAgICogYHZlcnNpb25gIHRow6wgY29tcHV0ZWQgY2jhuqF5IGzhuqFpIG5oxrBuZyB0cuG6oyB24buBIEPDmU5HIG3huqNuZyBjxakg4oCUIGzGsOG7m2kgxJHhu6luZyBpbSAoxJFvIDI4LzA4LzIwMjY6IGLhuqVtXG4gICAqIFwiU+G6r3AgZ+G7jW5cIiBjw6J5IMSRw6MgZOG7k24ga2jDrXQgbcOgIG3DoG4gaMOsbmgga2jDtG5nIG5ow7pjIG5ow61jaDsgYuG6rXQgY2jhu5NuZyBraOG7kWkgbcOgIGAkaXRlbS5sYXllckluZGV4YFxuICAgKiB24bqrbiB0cuG7kW5nKS5cbiAgICpcbiAgICogTmjDom4gYuG6o24gTsOUTkcgY+G6oyBub2RlIGfhu5FjIHbDoCBkYW5oIHPDoWNoIGNvbiBsw6AgxJHhu6c6IG3huqNuZyBt4bubaSDihpIgYEBmb3JgIGThu7FuZyBs4bqhaSBpdGVtLCBvYmplY3QgY29uXG4gICAqIG3hu5tpIOKGkiBncmlkc3RlciDEkeG7jWMgbOG6oWkgdG/DoG4gYuG7mSB0b+G6oSDEkeG7mS5cbiAgICovXG4gIHJlZnJlc2goZXZlbnQ/OiBUX2dyaWRMYXlvdXRfY2hhbmdlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCByb290ID0gZXZlbnQ/LnJvb3QgPz8gdGhpcy5yb290Tm9kZSgpO1xuXG4gICAgaWYgKCFyb290KSB7XG4gICAgICB0aGlzLnZlcnNpb24udXBkYXRlKCh2KSA9PiB2ICsgMSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuY29uZmlnID0geyAuLi50aGlzLmNvbmZpZywgZGF0YTogcm9vdCB9O1xuICAgIH1cblxuICAgIHRoaXMucm9vdE5vZGUuc2V0KHRoaXMuc2hhbGxvd0Nsb25lVHJlZShyb290KSk7XG4gICAgdGhpcy52ZXJzaW9uLnVwZGF0ZSgodikgPT4gdiArIDEpO1xuICB9XG5cbiAgLyoqIE5ow6JuIGLhuqNuIG7DtG5nIHRoZW8gY+G6oyBjaGnhu4F1IHPDonU6IG3hu5dpIG5vZGUgdsOgIG3huqNuZyBgY2hpbGRyZW5gIHRow6BuaCB0aGFtIGNoaeG6v3UgbeG7m2kuICovXG4gIC8qKlxuICAgKiBOaMOibiBi4bqjbiBTw4JVIGPhuqMgY8OieSDigJQgZMO5bmcgY2hvIGBleHBvcnRMYXlvdXQoKWAuXG4gICAqXG4gICAqIPCflLQgQuG7jiBgZ2V0Q29tcG9uZW50T3V0bGV0YCBraOG7j2kgYuG6o24gc2FvOiBuw7MgbMOgIG3hu5l0IEjDgE0sIGtow7RuZyB0deG6p24gdOG7sSBob8OhIMSRxrDhu6NjIG7Dqm4gZ+G7rWkgeHXhu5FuZ1xuICAgKiBiYWNrZW5kIGzDoCBo4buPbmcgKGBKU09OLnN0cmluZ2lmeWAgbnXhu5F0IG3huqV0LCBgc3RydWN0dXJlZENsb25lYCBuw6ltIGzhu5dpKS4gTuG6oXAgbOG6oWkgdGjDrCBow6BtIHBow6JuXG4gICAqIGdp4bqjaSBjaHVuZyBj4bunYSBj4bqldSBow6xuaCBsbyDigJQgY29tcG9uZW50IHN1eSByYSB04burIGBkYXRhLnR5cGVgLCBraMO0bmcgY+G6p24gbMawdS5cbiAgICovXG4gIHByaXZhdGUgZGVlcENsb25lVHJlZShub2RlOiBUX2dyaWRMYXlvdXRfbm9kZSk6IFRfZ3JpZExheW91dF9ub2RlIHtcbiAgICBjb25zdCBjb3B5OiBUX2dyaWRMYXlvdXRfbm9kZSA9IHsgLi4ubm9kZSB9O1xuXG4gICAgLy8gQ+G6r3QgaMOgbSBwaMOibiBnaeG6o2kg4oCUIHhlbSBjaMO6IHRow61jaCB0csOqbi5cbiAgICBkZWxldGUgY29weS5nZXRDb21wb25lbnRPdXRsZXQ7XG5cbiAgICBjb25zdCB7IGNoaWxkcmVuLCBkYXRhLCAuLi5yZXN0IH0gPSBjb3B5O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlc3QsXG4gICAgICAuLi4oZGF0YSA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGRhdGE6IGNsb25lRGVlcChkYXRhKSB9KSxcbiAgICAgIC4uLihjaGlsZHJlbiA/IHsgY2hpbGRyZW46IGNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHRoaXMuZGVlcENsb25lVHJlZShjaGlsZCkpIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2hhbGxvd0Nsb25lVHJlZShub2RlOiBUX2dyaWRMYXlvdXRfbm9kZSk6IFRfZ3JpZExheW91dF9ub2RlIHtcbiAgICBpZiAoIW5vZGUuY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgLi4ubm9kZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IC4uLm5vZGUsIGNoaWxkcmVuOiBub2RlLmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHRoaXMuc2hhbGxvd0Nsb25lVHJlZShjaGlsZCkpIH07XG4gIH1cblxuICAvKipcbiAgICogR8OhbiBgbGF5ZXJJbmRleGAga2jDoWMgbmhhdSBjaG8gdOG7q25nIGto4buRaSBraGkgYuG6rXQgY2jhu5NuZyBraOG7kWkuXG4gICAqXG4gICAqIPCflLQgYGFsbG93TXVsdGlMYXllcjogdHJ1ZWAgTeG7mFQgTcOMTkgga2jDtG5nIGNobyBraOG7kWkgxJHDqCBuaGF1LiBNw6MgbGliIHNvIGBsYXllckluZGV4YCBj4bunYSBoYWkga2jhu5FpOlxuICAgKiBLSMOBQyBuaGF1IHRow6wgY2hvIMSRw6gsIEdJ4buQTkcgbmhhdSB24bqrbiBiw6FvIHZhIGNo4bqhbS4gS2jhu5FpIGtow7RuZyBraGFpIGBsYXllckluZGV4YCDEkeG7gXUgcsahaSB24buBXG4gICAqIGBkZWZhdWx0TGF5ZXJJbmRleGAg4oCUIHThu6ljIEPDmU5HIGzhu5twLCBuw6puIGvDqW8gdsOgbyBuaGF1IGzDoCBi4buLIGNo4bq3biB5IG5oxrAgbMaw4bubaSB0aMaw4budbmcgKG5nxrDhu51pIGTDuW5nXG4gICAqIGLDoW8gMjgvMDgvMjAyNjogXCJi4bqtdCBjaOG7k25nIGto4buRaSBuaMawbmcga2hpIGvDqW8gdGjDrCBjw6FjIGto4buRaSB24bqrbiBkaSBjaHV54buDbiB0aGVvXCIpLlxuICAgKlxuICAgKiBOxqFpIGTDuW5nIHThu7Ega2hhaSBgbGF5ZXJJbmRleGAgdGjDrCBnaeG7ryBuZ3V5w6puOyBhaSBraMO0bmcga2hhaSB0aMOsIHRoxrAgdmnhu4duIHjhur9wIG3hu5dpIGto4buRaSBt4buZdCBs4bubcFxuICAgKiB0aGVvIHRo4bupIHThu7EsIMSR4bunIMSR4buDIG3hu41pIGPhurdwIMSR4buBdSBraMOhYyBs4bubcC5cbiAgICovXG4gIHByaXZhdGUgYXNzaWduT3ZlcmxhcExheWVycyhyb290OiBUX2dyaWRMYXlvdXRfbm9kZSk6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IGNhbk92ZXJsYXAgPSBjb25maWc/Lm1vZGUgPT09IEVfZ3JpZExheW91dF9tb2RlX3N0cmluZy5mcmVlIHx8IChjb25maWc/LmFsbG93T3ZlcmxhcCA/PyBmYWxzZSk7XG5cbiAgICBpZiAoIWNhbk92ZXJsYXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbGF5ZXIgPSAwO1xuICAgIGNvbnN0IHdhbGsgPSAobm9kZTogVF9ncmlkTGF5b3V0X25vZGUpOiB2b2lkID0+IHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbiA/PyBbXSkge1xuICAgICAgICBpZiAoY2hpbGQubGF5ZXJJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbGF5ZXIgKz0gMTtcbiAgICAgICAgICBjaGlsZC5sYXllckluZGV4ID0gbGF5ZXI7XG4gICAgICAgIH1cblxuICAgICAgICB3YWxrKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2Fsayhyb290KTtcblxuICB9XG5cbiAgLyoqIMSQxrBhIG3hu5l0IGto4buRaSBsw6puIHRyw6puIHThuqV0IGPhuqM6IGzhu5twIGPhu6dhIG7DsyA9IGzhu5twIGzhu5tuIG5o4bqldCDEkWFuZyBjw7MgKyAxLiAqL1xuICBwcml2YXRlIHJhaXNlVG9Ub3BMYXllcihpdGVtOiBHcmlkc3Rlckl0ZW0pOiB2b2lkIHtcbiAgICBjb25zdCByb290ID0gdGhpcy5yb290Tm9kZSgpO1xuXG4gICAgaWYgKCFyb290KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHRvcExheWVyID0gMDtcbiAgICBjb25zdCB3YWxrID0gKG5vZGU6IFRfZ3JpZExheW91dF9ub2RlKTogdm9pZCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4gPz8gW10pIHtcbiAgICAgICAgdG9wTGF5ZXIgPSBNYXRoLm1heCh0b3BMYXllciwgY2hpbGQubGF5ZXJJbmRleCA/PyAwKTtcbiAgICAgICAgd2FsayhjaGlsZCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdhbGsocm9vdCk7XG5cbiAgICAvLyBgaXRlbWAgZ3JpZHN0ZXIgdHLhuqMgduG7gSBDSMONTkggbMOgIG9iamVjdCBub2RlIGPhu6dhIGPDonkgKHRydXnhu4FuIHRo4bqzbmcgcXVhIGBbaXRlbV1gKSwgbsOqbiBnw6FuIHbDoG9cbiAgICAvLyDEkcOieSBsw6AgY8OieSBjxaluZyDEkeG7lWkgdGhlby5cbiAgICBjb25zdCBub2RlID0gaXRlbSBhcyB1bmtub3duIGFzIFRfZ3JpZExheW91dF9ub2RlO1xuXG4gICAgaWYgKG5vZGUubGF5ZXJJbmRleCA9PT0gdG9wTGF5ZXIpIHtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUubGF5ZXJJbmRleCA9IHRvcExheWVyICsgMTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBT4busQSBDw4JZIOKAlCB0aMawIHZp4buHbiDEkcOjIGdp4buvIGPDonkgbsOqbiBi4bqhbiBLSMOUTkcgcGjhuqNpIHRydXnhu4FuIG7DsyB2w6BvLlxuICAvLyBN4buNaSBow6BtIGTGsOG7m2kgxJHDonkgdOG7sSB24bq9IGzhuqFpOyBraMO0bmcgY+G6p24gZ+G7jWkgYHJlZnJlc2goKWAuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBUaMOqbSBt4buZdCBraOG7kWkuXG4gICAqXG4gICAqIEBwYXJhbSBpdGVtIGto4buRaSBt4bubaSDigJQgS0jDlE5HIGPhuqduIGBpZGAgKHRoxrAgdmnhu4duIHNpbmgpIHbDoCBgeGAvYHlgICh04buxIMSR4bq3dCB4deG7kW5nIGjDoG5nIHRy4buRbmcpLlxuICAgKiBAcGFyYW0gcGFyZW50SWQgY29udGFpbmVyIG114buRbiB0aMOqbSB2w6BvOyBi4buPIHRy4buRbmcgdGjDrCB0aMOqbSB2w6BvIG3hurd0IHBo4bqzbmcgZ+G7kWMuXG4gICAqIEByZXR1cm5zIGto4buRaSB24burYSB04bqhbyAoa8OobSBgaWRgIHbhu6thIHNpbmgpLCBob+G6t2MgYHVuZGVmaW5lZGAga2hpIGtow7RuZyB0w6xtIHRo4bqleSBjb250YWluZXIuXG4gICAqL1xuICBhZGRCbG9jayhpdGVtOiBUX2dyaWRMYXlvdXRfbmV3Tm9kZSwgcGFyZW50SWQ/OiBzdHJpbmcpOiBUX2dyaWRMYXlvdXRfbm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdE5vZGUoKTtcbiAgICBjb25zdCBhZGRlZCA9IHJvb3QgPyB0aGlzLnRyZWVTZXJ2aWNlLmFkZENoaWxkKHJvb3QsIHBhcmVudElkID8/IHJvb3QuaWQsIGl0ZW0pIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGFkZGVkKSB7XG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkZWQ7XG4gIH1cblxuICAvKiogWG/DoSBt4buZdCBraOG7kWkuIFhvw6EgY29udGFpbmVyIGzDoCB4b8OhIGPhuqMgcnXhu5l0LiBUcuG6oyBgZmFsc2VgIGtoaSBraMO0bmcgeG/DoSDEkcaw4bujYyAodmQga2jhu5FpIGfhu5FjKS4gKi9cbiAgcmVtb3ZlQmxvY2soaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3ROb2RlKCk7XG4gICAgY29uc3QgZG9uZSA9IHJvb3QgPyB0aGlzLnRyZWVTZXJ2aWNlLnJlbW92ZUJ5SWQocm9vdCwgaWQpIDogZmFsc2U7XG5cbiAgICBpZiAoZG9uZSkge1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvbmU7XG4gIH1cblxuICAvKiogQmnhur9uIGto4buRaSDEkcahbiB0aMOgbmggQ09OVEFJTkVSIOKAlCBu4buZaSBkdW5nIGPFqSB0aMOgbmgga2jhu5FpIGNvbiDEkeG6p3UgdGnDqm4sIGtow7RuZyBt4bqldCBk4buvIGxp4buHdS4gKi9cbiAgdG9Db250YWluZXIoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3ROb2RlKCk7XG4gICAgY29uc3QgZG9uZSA9IHJvb3QgPyB0aGlzLnRyZWVTZXJ2aWNlLnRvQ29udGFpbmVyKHJvb3QsIGlkLCB0aGlzLmNvbmZpZz8uY29scyA/PyAxMikgOiBmYWxzZTtcblxuICAgIGlmIChkb25lKSB7XG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG9uZTtcbiAgfVxuXG4gIC8qKiDEkMawYSBDT05UQUlORVIgduG7gSBraOG7kWkgxJHGoW4g4oCUIGto4buRaSBjb24gxJHGsOG7o2MgbsOibmcgbMOqbiBj4bqlcCB0csOqbiwga2jDtG5nIGLhu4sgeG/DoS4gKi9cbiAgdG9TaW5nbGUoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3ROb2RlKCk7XG4gICAgY29uc3QgZG9uZSA9IHJvb3QgPyB0aGlzLnRyZWVTZXJ2aWNlLnRvU2luZ2xlKHJvb3QsIGlkKSA6IGZhbHNlO1xuXG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cblxuICAgIHJldHVybiBkb25lO1xuICB9XG5cbiAgLyoqIEThu5NuIGto4buRaSBraMOtdCBsw6puIHRyw6puLCBs4bqlcCBo4bq/dCBjaOG7lyB0cuG7kW5nLiDEkOG7hyBxdXkgdsOgbyBjb250YWluZXIuICovXG4gIGNvbXBhY3QoKTogdm9pZCB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdE5vZGUoKTtcblxuICAgIGlmICghcm9vdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudHJlZVNlcnZpY2UuY29tcGFjdChyb290LCB0aGlzLmNvbmZpZz8uY29scyA/PyAxMik7XG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQuG7kSBj4bulYyBISeG7hk4gVOG6oEksIMSRw6MgY+G6r3QgbeG7jWkgdGhhbSBjaGnhur91IOKAlCBn4butaSB0aOG6s25nIHh14buRbmcgYmFja2VuZCDEkcaw4bujYy5cbiAgICpcbiAgICogRMO5bmcga2hpIGLhuqVtIG7DunQgTMawdS4gS2jDoWMgYFJvb3QoKWAg4bufIGNo4buXIMSRw6J5IGzDoCBi4bqjbiBTQU86IG7GoWkgZMO5bmcgY8OzIHPhu61hIGfDrCB0csOqbiBr4bq/dCBxdeG6oyBjxaluZ1xuICAgKiBraMO0bmcgxJHhu6VuZyB04bubaSBjw6J5IG3DoCB0aMawIHZp4buHbiDEkWFuZyB24bq9LlxuICAgKlxuICAgKiBAcmV0dXJucyBgdW5kZWZpbmVkYCBraGkgbeG6t3QgcGjhurNuZyBjaMawYSBgaW5pdCgpYC5cbiAgICovXG4gIGV4cG9ydExheW91dCgpOiBUX2dyaWRMYXlvdXRfbm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdE5vZGUoKTtcblxuICAgIHJldHVybiByb290ID8gdGhpcy5kZWVwQ2xvbmVUcmVlKHJvb3QpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFTDrG0gbeG7mXQga2jhu5FpIHRoZW8gaWQuICovXG4gIGZpbmRCbG9jayhpZDogc3RyaW5nKTogVF9ncmlkTGF5b3V0X25vZGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3ROb2RlKCk7XG5cbiAgICByZXR1cm4gcm9vdCA/IHRoaXMudHJlZVNlcnZpY2UuZmluZEJ5SWQocm9vdCwgaWQpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFTDrG0ga2jhu5FpIGNoYSB0cuG7sWMgdGnhur9wIGPhu6dhIG3hu5l0IGto4buRaS4gKi9cbiAgZmluZFBhcmVudEJsb2NrKGlkOiBzdHJpbmcpOiBUX2dyaWRMYXlvdXRfbm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdE5vZGUoKTtcblxuICAgIHJldHVybiByb290ID8gdGhpcy50cmVlU2VydmljZS5maW5kUGFyZW50KHJvb3QsIGlkKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBD4buVbmcgRFVZIE5I4bqkVCBjaG8gY2FudmFzIGPhu6dhIHRoxrAgdmnhu4duLiBOxqFpIGTDuW5nIEtIw5RORyBn4buNaSB04bubaSDEkcOieS5cbiAgICpcbiAgICogTeG7jWkgdGjhu6kgY2FudmFzIGPhuqduIMSR4buBdSBsw6AgYHByaXZhdGVgIMSR4buDIGtow7RuZyBs4buNdCByYSBBUEkgY8O0bmcga2hhaTsgZ29tIHbDoG8gbeG7mXQgZ2V0dGVyIHRoZW8gxJHDum5nXG4gICAqIGtodcO0biBgRnVuY3Rpb25zQ29udHJvbGAgY+G7p2EgYuG7mSBxdXkgxrDhu5tjLCB0aGF5IHbDrCDEkeG7gyBy4bqjaSByw6FjIGjDoG0gcHVibGljIG3DoCBuZ8aw4budaSBuZ2/DoGkgdMaw4bufbmdcbiAgICogbcOsbmggcGjhuqNpIGfhu41pIChuZ8aw4budaSBkw7luZyBjaOG7kXQgMjgvMDgvMjAyNikuXG4gICAqL1xuICBnZXQgRnVuY3Rpb25zQ29udHJvbCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWF4Q29udGFpbmVyRGVwdGg6ICgpID0+IHRoaXMubWF4Q29udGFpbmVyRGVwdGgoKSxcbiAgICAgIGNvbnRhaW5lclBhZGRpbmc6ICgpID0+IHRoaXMuY29udGFpbmVyUGFkZGluZygpLFxuICAgICAgZ3JpZHN0ZXJPcHRpb25zOiAoZGVwdGg6IG51bWJlciwgY2I/OiAoKSA9PiB2b2lkKSA9PiB0aGlzLmJ1aWxkR3JpZHN0ZXJPcHRpb25zKGRlcHRoLCBjYiksXG4gICAgICBhdHRhY2hOb2RlOiAobm9kZTogVF9ncmlkTGF5b3V0X25vZGUsIGRlcHRoOiBudW1iZXIsIGhvc3Q6IFZpZXdDb250YWluZXJSZWYpID0+IHRoaXMuYXR0YWNoTm9kZShub2RlLCBkZXB0aCwgaG9zdCksXG4gICAgICBkZXRhY2hOb2RlOiAobm9kZUlkOiBzdHJpbmcpID0+IHRoaXMuZGV0YWNoTm9kZShub2RlSWQpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFwcGx5SW5wdXRzKHJlZjogQ29tcG9uZW50UmVmPHVua25vd24+LCBub2RlOiBUX2dyaWRMYXlvdXRfbm9kZSwgZGVwdGg6IG51bWJlcik6IHZvaWQge1xuICAgIHJlZi5zZXRJbnB1dCgnZGF0YScsIG5vZGUuZGF0YSk7XG4gICAgcmVmLnNldElucHV0KCdub2RlJywgbm9kZSk7XG4gICAgcmVmLnNldElucHV0KCdpc0VkaXRNb2RlJywgdGhpcy5lZGl0TW9kZSgpKTtcbiAgICByZWYuc2V0SW5wdXQoJ2RlcHRoJywgZGVwdGgpO1xuICB9XG59XG4iXX0=
|
|
680
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1sYXlvdXQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvc2VydmljZXMvZ3JpZC1sYXlvdXQvc3JjL2dyaWQtbGF5b3V0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixVQUFVLEVBQUUsVUFBVSxFQUFvQixNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQWdCLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNoRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFTN0Q7Ozs7Ozs7Ozs7R0FVRztBQUVILE1BQU0sT0FBTyx1QkFBdUI7SUFDbEMsNkZBQTZGO0lBQzdGLHdGQUF3RjtJQUN4RixtRkFBbUY7SUFDbEUsV0FBVyxHQUFHLElBQUksMkJBQTJCLEVBQUUsQ0FBQztJQUNqRSxvRkFBb0Y7SUFDbkUsWUFBWSxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO0lBQ2hFOzs7OztPQUtHO0lBQ2MscUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFFbkU7UUFDRSwrRkFBK0Y7UUFDL0YseUZBQXlGO1FBQ3pGLCtGQUErRjtRQUMvRixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFTyxNQUFNLENBQXVCO0lBQ3BCLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBaUMsQ0FB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RSxJQUFJLENBQUMsQ0FBQztRQUMzQixHQUFHLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUM1QyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO3dHQXp4QlUsdUJBQXVCOzRHQUF2Qix1QkFBdUI7OzRGQUF2Qix1QkFBdUI7a0JBRG5DLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRSZWYsIERlc3Ryb3lSZWYsIEluamVjdGFibGUsIFZpZXdDb250YWluZXJSZWYsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHcmlkc3RlckNvbXBvbmVudEludGVyZmFjZSwgR3JpZHN0ZXJDb25maWcsIEdyaWRzdGVySXRlbSB9IGZyb20gJ2dyaWRzdGVyMTgnO1xuaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCB0YWtlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBncmlkTGF5b3V0TmVzdGVkQ29uZmlnLCBncmlkTGF5b3V0Um9vdENvbmZpZyB9IGZyb20gJy4vZGVmaW5lcy9ncmlkc3Rlci1jb25maWcuZGVmaW5lJztcbmltcG9ydCB7IGZpbmROb2RlUmVjdXJzaXZlLCBmaW5kUGFyZW50UmVjdXJzaXZlIH0gZnJvbSAnLi9kZWZpbmVzL2NvbGxpc2lvbi5kZWZpbmUnO1xuaW1wb3J0IHsgTGlic1VpR3JpZExheW91dFRyZWVTZXJ2aWNlIH0gZnJvbSAnLi90cmVlLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgRV9ncmlkTGF5b3V0X21vZGVfc3RyaW5nLFxuICBUX2dyaWRMYXlvdXRfY2hhbmdlRXZlbnQsXG4gIFRfZ3JpZExheW91dF9uZXdOb2RlLFxuICBUX2dyaWRMYXlvdXRfY29uZmlnLFxuICBUX2dyaWRMYXlvdXRfbm9kZSxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL2dyaWQtbGF5b3V0LmludGVyZmFjZSc7XG5cbi8qKlxuICogROG7sW5nIG3hu5l0IG3hurd0IHBo4bqzbmcga8OpbyB0aOG6oyB2w6AgdOG7sSBn4bqvbiBjb21wb25lbnQgY+G7p2EgbsahaSBkw7luZyBsw6puIHThu6tuZyBraOG7kWkuXG4gKlxuICogTsahaSBkw7luZyBjaOG7iSBj4bqnbiDEkcawYSB2w6BvOiBsb+G6oWkgY29tcG9uZW50IG114buRbiBk4buxbmdcbiAqIChgbm9kZUNvbXBvbmVudFR5cGVgKSB2w6AgY8OieSBk4buvIGxp4buHdSAoYGRhdGFgKS4gVG/DoG4gYuG7mSB2aeG7h2MgduG6vSBsxrDhu5tpLCBrw6lvIHRo4bqjLCDEkeG7lWkga8OtY2ggdGjGsOG7m2MsXG4gKiBs4buTbmcgY29udGFpbmVyIHbDoCBk4buNbiBk4bq5cCBkbyB0aMawIHZp4buHbiBsby5cbiAqXG4gKiDwn5S0IMSQw6J5IGzDoCBzZXJ2aWNlIHRoZW8gVOG7qk5HIG3hurd0IHBo4bqzbmcsIEtIw5RORyBgcHJvdmlkZWRJbjogJ3Jvb3QnYC4gS2hhaSB0cm9uZyBgcHJvdmlkZXJzYCBj4bunYVxuICogY29tcG9uZW50IGTDuW5nIG7DszsgaGFpIG3hurd0IHBo4bqzbmcgdHLDqm4gY8O5bmcgbeG7mXQgbcOgbiBwaOG6o2kgbMOgIGhhaSB0aOG7sWMgdGjhu4MgcmnDqm5nLCBkw7luZyBjaHVuZyB0aMOsXG4gKiBgY29tcG9uZW50UmVmc2AgY+G7p2EgbeG6t3QgcGjhurNuZyBuw6B5IGLhu4sgbeG6t3QgcGjhurNuZyBraWEgZOG7jW4gbeG6pXQuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMaWJzVWlHcmlkTGF5b3V0U2VydmljZSB7XG4gIC8vIPCflLQgVOG7sCBU4bqgTywga2jDtG5nIGBpbmplY3RgLiBOxqFpIGTDuW5nIGNo4buJIHBo4bqjaSB2aeG6v3QgYHByb3ZpZGVyczogW0xpYnNVaUdyaWRMYXlvdXRTZXJ2aWNlXWAg4oCUXG4gIC8vIGtow7RuZyBwaOG6o2kgYmnhur90IGLDqm4gdHJvbmcgdGjGsCB2aeG7h24gY8OybiBzZXJ2aWNlIG7DoG8ga2jDoWMgKG5nxrDhu51pIGTDuW5nIGNo4buRdCAyOC8wOC8yMDI2KS5cbiAgLy8gYFRyZWVTZXJ2aWNlYCBraMO0bmcgZ2nhu68gdHLhuqFuZyB0aMOhaSBkw7luZyBjaHVuZyBuw6puIG3hu5dpIG3hurd0IHBo4bqzbmcgbeG7mXQgYuG6o24gbMOgIMSRw7puZy5cbiAgcHJpdmF0ZSByZWFkb25seSB0cmVlU2VydmljZSA9IG5ldyBMaWJzVWlHcmlkTGF5b3V0VHJlZVNlcnZpY2UoKTtcbiAgLyoqIEzGsOG7o3QgdOG6o2kgY29tcG9uZW50IMSRYW5nIGNo4budLCB0aGVvIGlkIGto4buRaSDigJQgxJHhu4MgaHXhu7cga2hpIGto4buRaSBi4buLIGfhu6EgZ2nhu69hIGNo4burbmcuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ0xvYWRzID0gbmV3IE1hcDxzdHJpbmcsIFN1YnNjcmlwdGlvbj4oKTtcbiAgLyoqXG4gICAqIELhu5kgdGhlbyBkw7VpIGLhu4EgcuG7mW5nIGPhu6dhIHThu6tuZyBsxrDhu5tpIEzhu5JORywgxJHhu4Mgbmfhuq90IGtoaSBzZXJ2aWNlIGLhu4sgaHXhu7cuXG4gICAqXG4gICAqIPCflLQgR2nhu68gdGhhbSBjaGnhur91IGzDoCBC4bquVCBCVeG7mEM6IGBSZXNpemVPYnNlcnZlcmAga2jDtG5nIHThu7EgdOG6r3QgdGhlbyB2w7JuZyDEkeG7nWkgY29tcG9uZW50LiBLaMO0bmcgZOG7jW5cbiAgICogdGjDrCBt4buXaSBs4bqnbiBu4bqhcCBs4bqhaSBi4buRIGPhu6VjICjEkeG7lWkgdGFiKSBs4bqhaSBjaOG7k25nIHRow6ptIG3hu5l0IGLhu5ksIHbDoCBjaMO6bmcgduG6q24gY2jhuqF5IHRyw6puIERPTSDEkcOjIGfhu6EuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG5lc3RlZFJlc2l6ZU9ic2VydmVycyA9IG5ldyBTZXQ8UmVzaXplT2JzZXJ2ZXI+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8g8J+UtCBTZXJ2aWNlIGtoYWkgdHJvbmcgYHByb3ZpZGVyc2AgY+G7p2EgY29tcG9uZW50IG7Dqm4gQW5ndWxhciBodeG7tyBuw7MgY8O5bmcgY29tcG9uZW50IOKAlCB0aMawIHZp4buHblxuICAgIC8vIHThu7EgZOG7jW4g4bufIMSRw6J5LCBuxqFpIGTDuW5nIEtIw5RORyBwaOG6o2kgZ+G7jWkgYGRlc3Ryb3koKWAgdHJvbmcgYG5nT25EZXN0cm95YCAobmfGsOG7nWkgZMO5bmcgY2jhu5F0XG4gICAgLy8gMjgvMDgvMjAyNikuIELhuq90IG5o4bubIG3hu5l0IGLGsOG7m2MgZOG7jW4gZOG6uXAgbMOgIGtp4buDdSBBUEkgZOG7hSBxdcOqbiwgdsOgIHF1w6puIHRow6wgcsOyIHLhu4kgYuG7mSBuaOG7myBpbSBs4bq3bmcuXG4gICAgaW5qZWN0KERlc3Ryb3lSZWYpLm9uRGVzdHJveSgoKSA9PiB0aGlzLmRlc3Ryb3koKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbmZpZz86IFRfZ3JpZExheW91dF9jb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tcG9uZW50UmVmcyA9IG5ldyBNYXA8c3RyaW5nLCBDb21wb25lbnRSZWY8dW5rbm93bj4+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSByb290Tm9kZSA9IHNpZ25hbDxUX2dyaWRMYXlvdXRfbm9kZSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSByZWFkb25seSBlZGl0TW9kZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIC8qKiB0xINuZyBt4buXaSBs4bqnbiBjw6J5IMSR4buVaSDigJQgY29tcG9uZW50IGNvbiDEkeG7jWMgxJHhu4MgYmnhur90IHBo4bqjaSB0w61uaCBs4bqhaSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZlcnNpb24gPSBzaWduYWw8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSByZWFkb25seSB6b29tTGV2ZWwgPSBzaWduYWw8bnVtYmVyPigxKTtcblxuICAvKipcbiAgICogU2lnbmFsIGNo4buJIMSR4buNYyDEkeG7gyBuxqFpIGTDuW5nIHRoZW8gZMO1aS5cbiAgICpcbiAgICog8J+UtCBMw6AgVEhV4buYQyBUw41OSCwga2jDtG5nIHBo4bqjaSBnZXR0ZXIuIEdldHRlciB0cuG6oyBzaWduYWwgdGjDrCBjaOG7lyDEkeG7jWMgcGjhuqNpIHZp4bq/dCBgVmVyc2lvbigpKClgIOKAlFxuICAgKiBxdcOqbiBj4bq3cCBuZ2/hurdjIHRo4bupIGhhaSBsw6AgY29tcHV0ZWQgS0jDlE5HIHBo4bulIHRodeG7mWMgdsOgbyBuw7MsIGPDonkgxJHhu5VpIG3DoCBsxrDhu5tpIMSR4bupbmcgaW0sIHbDoFxuICAgKiBUeXBlU2NyaXB0IGtow7RuZyBo4buBIGLDoW8gbOG7l2kgKMSRbyAyOC8wOC8yMDI2OiB0aMOqbSBraOG7kWkga2jDtG5nIGhp4buHbiwgc+G6r3AgZ+G7jW4ga2jDtG5nIG5ow7pjIG5ow61jaCkuXG4gICAqL1xuICByZWFkb25seSBSb290ID0gdGhpcy5yb290Tm9kZS5hc1JlYWRvbmx5KCk7XG4gIHJlYWRvbmx5IElzRWRpdE1vZGUgPSB0aGlzLmVkaXRNb2RlLmFzUmVhZG9ubHkoKTtcbiAgLyoqIHTEg25nIG3hu5dpIGzhuqduIGPDonkgaG/hurdjIGPhuqV1IGjDrG5oIMSR4buVaSAqL1xuICByZWFkb25seSBWZXJzaW9uID0gdGhpcy52ZXJzaW9uLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgWm9vbSA9IHRoaXMuem9vbUxldmVsLmFzUmVhZG9ubHkoKTtcblxuICAvKipcbiAgICogdHLhuqduIHPhu5EgY+G6pXAgY29udGFpbmVyIGzhu5NuZyBuaGF1IOKAlCBjYW52YXMgxJHhu41jIMSR4buDIGJp4bq/dCBjw7MgY2hvIGNodXnhu4NuIHRow6BuaCBjb250YWluZXIga2jDtG5nICovXG4gIHByaXZhdGUgbWF4Q29udGFpbmVyRGVwdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc/Lm1heENvbnRhaW5lckRlcHRoID8/IDE7XG4gIH1cblxuICAvKipcbiAgICogbOG7gSB0cm9uZyBj4bunYSBjb250YWluZXIsIHB4IOKAlCBjYW52YXMgxJHhu41jIMSR4buDIMSR4bq3dCBwYWRkaW5nIGzDqm4gduG7jyBjb250YWluZXIgKi9cbiAgcHJpdmF0ZSBjb250YWluZXJQYWRkaW5nKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnPy5jb250YWluZXJQYWRkaW5nID8/IDEyO1xuICB9XG5cbiAgLyoqIEto4bufaSB04bqhbyBt4bq3dCBwaOG6s25nLiBH4buNaSBs4bqhaSBz4bq9IGThu41uIHPhuqFjaCBjb21wb25lbnQgY8WpIHLhu5NpIGThu7FuZyBs4bqhaSB04burIMSR4bqndS4gKi9cbiAgaW5pdChjb25maWc6IFRfZ3JpZExheW91dF9jb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAvLyDwn5S0IELhu5EgY+G7pWMgxJDDgyBMxq9VIGtow7RuZyDEkWkgcXVhIGx14bqtdCBjaOG6t24gbsOgbyBj4bunYSBnaWFvIGRp4buHbjogYuG6o24gbMawdSBjxakgKHNpbmggdHLGsOG7m2Mga2hpIGPDsyB0cuG6p24sXG4gICAgLy8gaG/hurdjIGRvIHRoYW8gdMOhYyBs4buXaSkgduG6q24gbWFuZyBjb250YWluZXIgbOG7k25nIGNvbnRhaW5lci4gVHLhuqduIGBtYXhDb250YWluZXJEZXB0aGAgY2jhu4kg4bqpbiBOw5pUXG4gICAgLy8gdHLDqm4gY2FudmFzIOKAlCBuw7Mga2jDtG5nIHPhu61hIGThu68gbGnhu4d1LCBuw6puIHRoaeG6v3UgZMOybmcgbsOgeSBsw6AgduG6vSByYSDEkcO6bmcgY8OieSBxdcOhIHPDonUgxJHDsy5cbiAgICAvLyBOxqFpIGTDuW5nIEtIw5RORyB04buxIGfhu41pIMSRxrDhu6NjOiBgTGlic1VpR3JpZExheW91dFRyZWVTZXJ2aWNlYCBj4buRIMO9IGtow7RuZyB4deG6pXQuXG4gICAgdGhpcy50cmVlU2VydmljZS5mbGF0dGVuT3ZlckRlcHRoQ29udGFpbmVycyhjb25maWcuZGF0YSwgdGhpcy5tYXhDb250YWluZXJEZXB0aCgpKTtcbiAgICB0aGlzLmFzc2lnbk92ZXJsYXBMYXllcnMoY29uZmlnLmRhdGEpO1xuICAgIC8vIPCflLQgTmjDom4gYuG6o24gbmjGsCBgcmVmcmVzaCgpYDogYGluaXQoKWAgbOG6oWkgKMSR4buVaSBjaOG6vyDEkeG7mSwgYuG6rXQvdOG6r3QgY2jhu5NuZyBraOG7kWkpIHRyw6puIEPDmU5HIG9iamVjdCBjw6J5XG4gICAgLy8gdGjDrCBgQGZvcmAga2jDtG5nIGThu7FuZyBs4bqhaSBgZ3JpZHN0ZXItaXRlbWAsIG7Dqm4gYGxheWVySW5kZXhgIHbhu6thIGfDoW4ga2jDtG5nIHThu5tpIGAkaXRlbWAgdsOgIGto4buRaVxuICAgIC8vIHbhuqtuIGtow7RuZyDEkcOoIG5oYXUgxJHGsOG7o2MgKMSRbyAyOC8wOC8yMDI2OiBgaXRlbS5sYXllckluZGV4YCA9IDF8MnwzfDR8NyBtw6AgYCRpdGVtLmxheWVySW5kZXhgXG4gICAgLy8gdG/DoG4gYHVuZGVmaW5lZGApLlxuICAgIHRoaXMucm9vdE5vZGUuc2V0KHRoaXMuc2hhbGxvd0Nsb25lVHJlZShjb25maWcuZGF0YSkpO1xuICAgIHRoaXMuZWRpdE1vZGUuc2V0KGNvbmZpZy5pc0VkaXRNb2RlID8/IGZhbHNlKTtcblxuICAgIGxldCBpbml0aWFsWm9vbSA9IGNvbmZpZy5pbml0aWFsWm9vbSA/PyAxO1xuICAgIGlmIChjb25maWcuc3RvcmFnZUtleSAmJiB0eXBlb2YgbG9jYWxTdG9yYWdlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2F2ZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShjb25maWcuc3RvcmFnZUtleSk7XG4gICAgICAgIGlmIChzYXZlZCkge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmxvYXQoc2F2ZWQpO1xuICAgICAgICAgIGNvbnN0IG1pbiA9IGNvbmZpZy56b29tTWluID8/IDAuNDtcbiAgICAgICAgICBjb25zdCBtYXggPSBjb25maWcuem9vbU1heCA/PyAxLjU7XG4gICAgICAgICAgaWYgKCFpc05hTihwYXJzZWQpICYmIHBhcnNlZCA+PSBtaW4gJiYgcGFyc2VkIDw9IG1heCkge1xuICAgICAgICAgICAgaW5pdGlhbFpvb20gPSBwYXJzZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gaWdub3JlIGxvY2FsU3RvcmFnZSBhY2Nlc3MgZXJyb3JcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy56b29tTGV2ZWwuc2V0KGluaXRpYWxab29tKTtcblxuICAgIHRoaXMudmVyc2lvbi51cGRhdGUoKHYpID0+IHYgKyAxKTtcbiAgfVxuXG4gIHNldEVkaXRNb2RlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0TW9kZS5zZXQodmFsdWUpO1xuICAgIC8vIPCflLQgUEjhuqJJIGLGoW0gYHZlcnNpb25gOiBgZ3JpZHN0ZXJPcHRpb25zKClgIMSR4buNYyBgZWRpdE1vZGVgIMSR4buDIGLhuq10L3Thuq90IGvDqW/igJN0aOG6oywgbcOgIGNvbXB1dGVkXG4gICAgLy8gYGdyaWRPcHRpb25zYCBiw6puIGNhbnZhcyBjaOG7iSBjaOG6oXkgbOG6oWkga2hpIGBWZXJzaW9uYCDEkeG7lWkuIFRoaeG6v3UgZMOybmcgbsOgeSB0aMOsIMSR4buVaSBjaOG6vyDEkeG7mSB4b25nXG4gICAgLy8gZ3JpZHN0ZXIgduG6q24gZ2nhu68gb3B0aW9ucyBjxakg4oCUIGNodXnhu4NuIHNhbmcgWEVNIG3DoCBraOG7kWkgduG6q24ga8OpbyDEkcaw4bujYy5cbiAgICB0aGlzLnZlcnNpb24udXBkYXRlKCh2KSA9PiB2ICsgMSk7XG4gIH1cblxuICAvKipcbiAgICogQuG6rXQvdOG6r3QgY2hvIGto4buRaSBjaOG7k25nIGzDqm4gbmhhdSDigJQgS0jDlE5HIGThu7FuZyBs4bqhaSBt4bq3dCBwaOG6s25nLlxuICAgKlxuICAgKiBUcsaw4bubYyDEkcOieSBuxqFpIGTDuW5nIHBo4bqjaSBn4buNaSBgaW5pdCgpYCBs4bqhaSDEkeG7gyDEkeG7lWkgY+G7nSBuw6B5LCBtw6AgYGluaXQoKWAgaHXhu7cgc+G6oWNoIHLhu5NpIGThu7FuZyBs4bqhaSBt4buNaVxuICAgKiBjb21wb25lbnQgbuG7mWkgZHVuZyDigJQgbMOjbmcgcGjDrSwgdsOgIG5nxrDhu51pIGTDuW5nIHRo4bqleSBtw6BuIGNo4bubcCAobmfGsOG7nWkgZMO5bmcgY2jhu5F0IDI4LzA4LzIwMjYpLlxuICAgKi9cbiAgc2V0QWxsb3dPdmVybGFwKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29uZmlnID0geyAuLi50aGlzLmNvbmZpZywgYWxsb3dPdmVybGFwOiB2YWx1ZSB9O1xuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdE5vZGUoKTtcblxuICAgIGlmICghcm9vdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIPCflLQgR8OhbiBs4bubcCB2w6BvIEPDglkgxJBBTkcgVuG6vCAoYHJvb3ROb2RlYCksIEtIw5RORyBwaOG6o2kgYGNvbmZpZy5kYXRhYC5cbiAgICAvLyBgaW5pdCgpYCDEkcOjIGNsb25lIGBjb25maWcuZGF0YWAgc2FuZyBgcm9vdE5vZGVgIG7Dqm4gaGFpIG9iamVjdCBLSMOBQyBuaGF1OyBnw6FuIHbDoG8gYGNvbmZpZy5kYXRhYFxuICAgIC8vIHRow6wgYHJlZnJlc2goKWAgY2xvbmUgbOG6oWkgdOG7qyBgcm9vdE5vZGVgIOKAlCBs4bubcCB24burYSBnw6FuIGtow7RuZyB04bubaSBgZ3JpZHN0ZXItaXRlbWAgbsOgbywgYHotaW5kZXhgXG4gICAgLy8gY+G7p2EgbeG7jWkga2jhu5FpIMSR4bupbmcg4bufIGAxYCB2w6Aga2jhu5FpIG7DoG8gduG6vSBzYXUgdGjDrCBu4bqxbSB0csOqbjogY2jhu5NuZyBraOG7kWkgXCJsw7pjIMSRxrDhu6NjIGzDumMga2jDtG5nXCJcbiAgICAvLyAoxJFvIDA0LzA5LzIwMjY6IGBpdGVtLmxheWVySW5kZXhgIHVuZGVmaW5lZCwgYGdldExheWVySW5kZXgoKWAgPSAwIGNobyBj4bqjIDgga2jhu5FpKS5cbiAgICB0aGlzLmFzc2lnbk92ZXJsYXBMYXllcnMocm9vdCk7XG4gICAgLy8gVGhheSB0aGFtIGNoaeG6v3UgY8OieSDEkeG7gyBgbGF5ZXJJbmRleGAgduG7q2EgZ8OhbiB04bubaSDEkcaw4bujYyBgJGl0ZW1gIGPhu6dhIGdyaWRzdGVyOyBjb21wb25lbnQgbuG7mWkgZHVuZ1xuICAgIC8vIEtIw5RORyBi4buLIGThu7FuZyBs4bqhaSB2w6wgYGF0dGFjaE5vZGVgIG5o4bqtbiByYSBpZCBjxakgdsOgIGNo4buJIGBzZXRJbnB1dGAuXG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQ+G6pXUgaMOsbmggZ3JpZHN0ZXIgY2hvIG3hu5l0IGPhuqVwIGzGsOG7m2kuXG4gICAqXG4gICAqIEBwYXJhbSBkZXB0aCAwID0gbMaw4bubaSBj4bqlcCB0cmFuZywg4omlIDEgPSBsxrDhu5tpIGzhu5NuZyB0cm9uZyBjb250YWluZXJcbiAgICovXG4gIHByaXZhdGUgYnVpbGRHcmlkc3Rlck9wdGlvbnMoZGVwdGg6IG51bWJlciwgaXRlbUNoYW5nZUNhbGxiYWNrPzogKCkgPT4gdm9pZCk6IEdyaWRzdGVyQ29uZmlnIHtcbiAgICBjb25zdCBiYXNlID0gZGVwdGggPT09IDAgPyBncmlkTGF5b3V0Um9vdENvbmZpZygpIDogZ3JpZExheW91dE5lc3RlZENvbmZpZygpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHJldHVybiBiYXNlO1xuICAgIH1cblxuICAgIGNvbnN0IGlzRnJlZU1vZGUgPSBjb25maWcubW9kZSA9PT0gRV9ncmlkTGF5b3V0X21vZGVfc3RyaW5nLmZyZWU7XG4gICAgY29uc3QgY2FuRWRpdCA9IHRoaXMuZWRpdE1vZGUoKTtcbiAgICBjb25zdCBjYW5PdmVybGFwID0gaXNGcmVlTW9kZSB8fCAoY29uZmlnLmFsbG93T3ZlcmxhcCA/PyBmYWxzZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uYmFzZSxcbiAgICAgIHNjYWxlOiB0aGlzLnpvb21MZXZlbCgpLFxuICAgICAgLi4uKGNvbmZpZy5jb2xzID8geyBtaW5Db2xzOiBjb25maWcuY29scywgbWF4Q29sczogY29uZmlnLmNvbHMsIG1heEl0ZW1Db2xzOiBjb25maWcuY29scyB9IDoge30pLFxuICAgICAgLi4uKGNvbmZpZy5yb3dIZWlnaHQgJiYgZGVwdGggPT09IDAgPyB7IGZpeGVkUm93SGVpZ2h0OiBjb25maWcucm93SGVpZ2h0IH0gOiB7fSksXG4gICAgICAuLi4oZGVwdGggPT09IDAgJiYgY29uZmlnLm1pblJvd3MgIT09IHVuZGVmaW5lZCA/IHsgbWluUm93czogY29uZmlnLm1pblJvd3MgfSA6IHt9KSxcbiAgICAgIC4uLihkZXB0aCA+IDAgJiYgY29uZmlnLm5lc3RlZE1pblJvd3MgIT09IHVuZGVmaW5lZCA/IHsgbWluUm93czogY29uZmlnLm5lc3RlZE1pblJvd3MgfSA6IHt9KSxcbiAgICAgIC8vIEtoZSB2w6AgY2hp4buBdSBjYW8gaMOgbmcga2jDoWMgbmhhdSB0aGVvIGPhuqVwOiBsxrDhu5tpIHRyYW5nIHRob8OhbmcsIGzGsOG7m2kgbOG7k25nIGtow610LlxuICAgICAgLi4uKGRlcHRoID09PSAwICYmIGNvbmZpZy5tYXJnaW4gIT09IHVuZGVmaW5lZCA/IHsgbWFyZ2luOiBjb25maWcubWFyZ2luIH0gOiB7fSksXG4gICAgICAuLi4oZGVwdGggPiAwICYmIGNvbmZpZy5uZXN0ZWRNYXJnaW4gIT09IHVuZGVmaW5lZCA/IHsgbWFyZ2luOiBjb25maWcubmVzdGVkTWFyZ2luIH0gOiB7fSksXG4gICAgICAuLi4oZGVwdGggPiAwICYmIGNvbmZpZy5uZXN0ZWRSb3dIZWlnaHQgIT09IHVuZGVmaW5lZCA/IHsgZml4ZWRSb3dIZWlnaHQ6IGNvbmZpZy5uZXN0ZWRSb3dIZWlnaHQgfSA6IHt9KSxcbiAgICAgIC4uLihkZXB0aCA9PT0gMCAmJiBjb25maWcub3V0ZXJNYXJnaW4gIT09IHVuZGVmaW5lZCA/IHsgb3V0ZXJNYXJnaW46IGNvbmZpZy5vdXRlck1hcmdpbiB9IDoge30pLFxuICAgICAgLi4uKGRlcHRoID09PSAwICYmIGNvbmZpZy5vdXRlck1hcmdpbkJvdHRvbSAhPT0gdW5kZWZpbmVkID8geyBvdXRlck1hcmdpbkJvdHRvbTogY29uZmlnLm91dGVyTWFyZ2luQm90dG9tIH0gOiB7fSksXG4gICAgICAuLi4oY29uZmlnLm1pbkl0ZW1Sb3dzICE9PSB1bmRlZmluZWQgPyB7IG1pbkl0ZW1Sb3dzOiBjb25maWcubWluSXRlbVJvd3MgfSA6IHt9KSxcbiAgICAgIC4uLihjb25maWcuZGVmYXVsdEl0ZW1Db2xzICE9PSB1bmRlZmluZWQgPyB7IGRlZmF1bHRJdGVtQ29sczogY29uZmlnLmRlZmF1bHRJdGVtQ29scyB9IDoge30pLFxuICAgICAgLi4uKGNvbmZpZy5kZWZhdWx0SXRlbVJvd3MgIT09IHVuZGVmaW5lZCA/IHsgZGVmYXVsdEl0ZW1Sb3dzOiBjb25maWcuZGVmYXVsdEl0ZW1Sb3dzIH0gOiB7fSksXG5cbiAgICAgIC8vIPCflLQgQ2jhur8gxJHhu5kgWEVNIHBo4bqjaSBU4bquVCBo4bqzbiBrw6lvIHbDoCDEkeG7lWkga8OtY2ggdGjGsOG7m2MuXG4gICAgICAvLyBgYmFzZWAgbHXDtG4gxJHhu4MgYGVuYWJsZWQ6IHRydWVgOyBraMO0bmcgZ2hpIMSRw6ggdGhlbyBgZWRpdE1vZGVgIHRow6wgbmfGsOG7nWkgeGVtIHbhuqtuIGvDqW8gxJHGsOG7o2Mga2jhu5FpXG4gICAgICAvLyB2w6AgxJHhu5VpIGLhu5EgY+G7pWMgY+G7p2EgbmfGsOG7nWkga2jDoWMgKG5nxrDhu51pIGTDuW5nIGLDoW8gMjgvMDgvMjAyNjogXCLEkWFuZyB4ZW0gbcOgIHbhuqtuIGvDqW8gdGjhuqMgdGhheSDEkeG7lWlcbiAgICAgIC8vIHbhu4sgdHLDrSB2w6AgdGjDqm0ga2jhu5FpIMSRxrDhu6NjXCIpLlxuICAgICAgZHJhZ2dhYmxlOiB7IC4uLmJhc2UuZHJhZ2dhYmxlLCBlbmFibGVkOiBjYW5FZGl0IH0sXG4gICAgICByZXNpemFibGU6IHsgLi4uYmFzZS5yZXNpemFibGUsIGVuYWJsZWQ6IGNhbkVkaXQgfSxcblxuICAgICAgLy8gQ2jhur8gxJHhu5kgdOG7sSBkbyBMVcOUTiBjaG8gY2jhu5NuZzsgY2jhur8gxJHhu5kgbMaw4bubaSB0aMOsIHRoZW8gY+G7nSBj4bunYSBuxqFpIGTDuW5nLlxuICAgICAgYWxsb3dNdWx0aUxheWVyOiBjYW5PdmVybGFwLFxuICAgICAgLy8g8J+UtCBC4bqtdCBgYWxsb3dNdWx0aUxheWVyYCBN4buYVCBNw4xOSCBraMO0bmcgxJHhu6cuIE3DoyBsaWIgc28gYGxheWVySW5kZXhgIGPhu6dhIGhhaSBraOG7kWk6IEtIw4FDIG5oYXVcbiAgICAgIC8vIHRow6wgY2hvIMSRw6gsIEdJ4buQTkcgbmhhdSB24bqrbiBiw6FvIHZhIGNo4bqhbS4gS2jhu5FpIGtow7RuZyBraGFpIGBsYXllckluZGV4YCDEkeG7gXUgcsahaSB24buBXG4gICAgICAvLyBgZGVmYXVsdExheWVySW5kZXhgIOKAlCB04bupYyBjw7luZyBs4bubcCwgdsOgIHbhuqtuIGLhu4sgxJHhuql5IG5oYXUgbmjGsCBsxrDhu5tpIHRoxrDhu51uZyAobmfGsOG7nWkgZMO5bmcgYsOhb1xuICAgICAgLy8gMjgvMDgvMjAyNjogXCJi4bqtdCBjaOG7k25nIGto4buRaSBuaMawbmcga2hpIGvDqW8gdGjDrCBjw6FjIGto4buRaSB24bqrbiBkaSBjaHV54buDbiB0aGVvXCIpLlxuICAgICAgLy8gQ2hvIGNo4buTbmcgdGjDrCBwaOG6o2kgVOG6rlQgxJHhuql5IGto4buRaSwgbuG6v3Uga2jDtG5nIGto4buRaSBi4buLIGThuqF0IMSRaSB0csaw4bubYyBraGkga+G7i3AgxJHDqCBsw6puIG5oYXUuXG4gICAgICAuLi4oY2FuT3ZlcmxhcCA/IHsgcHVzaEl0ZW1zOiBmYWxzZSwgcHVzaFJlc2l6ZUl0ZW1zOiBmYWxzZSwgc3dhcDogZmFsc2UsIHN3YXBXaGlsZURyYWdnaW5nOiBmYWxzZSB9IDoge30pLFxuXG4gICAgICAuLi50aGlzLmJ1aWxkTmVzdGVkUmVzaXplSG9va3MoYmFzZSwgZGVwdGgpLFxuXG4gICAgICBpdGVtQ2hhbmdlQ2FsbGJhY2s6IChpdGVtOiBHcmlkc3Rlckl0ZW0pID0+IHtcbiAgICAgICAgLy8g8J+UtCBLaOG7kWkgduG7q2EgdGhhbyB0w6FjIHBo4bqjaSBsw6puIEzhu5pQIFRSw4pOIEPDmU5HLlxuICAgICAgICAvLyBgbGF5ZXJJbmRleGAgZ8OhbiBt4buZdCBs4bqnbiB0aGVvIHRo4bupIHThu7EgY8OieSBsw7pjIGto4bufaSB04bqhbywgbsOqbiBraOG7kWkga8OpbyBsw6puIGNo4buJIG7hu5VpIFRST05HIEzDmkNcbiAgICAgICAgLy8ga8OpbyAobmjhu50gYHotaW5kZXg6IDMwYCBj4bunYSBs4bubcCBgZ3JpZHN0ZXItaXRlbS1tb3ZpbmdgKTsgdGjhuqMgdGF5IHJhIGzDoCB24buBIGzhu5twIGPFqSB2w6AgYuG7iyBraOG7kWlcbiAgICAgICAgLy8gxJHhu6luZyBzYXUgdHJvbmcgY8OieSDEkcOoIG5nxrDhu6NjIGzDqm4gKG5nxrDhu51pIGTDuW5nIGLDoW8gMjgvMDgvMjAyNiwgxJFvIMSRxrDhu6NjOiBrw6lvIHo9MzAsIHRo4bqjIHbhu4FcbiAgICAgICAgLy8gej0xMCB0cm9uZyBraGkgaGFpIGto4buRaSBr4bq/IGLDqm4gxJFhbmcgej0xMSB2w6Agej0xMikuXG4gICAgICAgIGlmIChjYW5PdmVybGFwKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZVRvVG9wTGF5ZXIoaXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZlcnNpb24udXBkYXRlKCh2KSA9PiB2ICsgMSk7XG4gICAgICAgIGl0ZW1DaGFuZ2VDYWxsYmFjaz8uKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQuG6r3QgbMaw4bubaSBM4buSTkcgxJFvIGzhuqFpIE5HQVkga2hpIGtodW5nIGNo4bupYSBuw7MgxJHhu5VpIGLhu4EgcuG7mW5nIOKAlCBkw7luZyBsw7pjIG5nxrDhu51pIGTDuW5nIGvDqW8gbcOpcCBraOG7kWkgY2hhLlxuICAgKlxuICAgKiBHcmlkc3RlciBjw7Mgc+G6tW4gxJHGsOG7nW5nIHThu7EgxJFvIChgcmVzaXplJGApLCBuaMawbmcgbHXhu5NuZyDEkcOzIGzDoCBgc3dpdGNoTWFwKCgpID0+IHRpbWVyKDEwMCkpYDogbeG7l2lcbiAgICogbOG6p24gcGjDoXQgbOG6oWkgaHXhu7cgdGltZXIgdHLGsOG7m2MsIG3DoCBrw6lvIGNodeG7mXQgYuG6r24gZMOgeSBoxqFuIDEwMG1zIG7Dqm4gdGltZXIga2jDtG5nIGJhbyBnaeG7nSB04bubaSDEkcOtY2guXG4gICAqIMSQbyDEkcaw4bujYyAoMTEvMDkvMjAyNik6IGvDqW8gbcOpcCBuaMOzbSB0aMOsIGzGsOG7m2kgY29uIGNvIHRoZW8gY2hhIHThu6tuZyBraHVuZyBow6xuaCAoMjM0IOKGkiAzODQgcHgpIGPDsm5cbiAgICogVEjhurogY29uIMSR4bupbmcgaW0g4bufIDEwNiBweCBzdeG7kXQgY8O6IGvDqW8sIGNo4buJIG5o4bqjeSDEkcO6bmcgc2F1IGtoaSB0aOG6oyB0YXkuXG4gICAqXG4gICAqIEdp4buvIEPhuqIgSEFJIMSRxrDhu51uZzogYGl0ZW1SZXNpemVDYWxsYmFja2AgYuG6r24gxJHhu5NuZyBi4buZIG5nYXkga2hpIGdyaWRzdGVyIGdoaSBi4buBIHLhu5luZyBt4bubaSBsw6puIGto4buRaVxuICAgKiAoc+G7m20gaMahbiBgUmVzaXplT2JzZXJ2ZXJgIG3hu5l0IGtodW5nIGjDrG5oKSBsbyDEkeG7mSB04bupYyB0aMOsOyBgUmVzaXplT2JzZXJ2ZXJgIGxvIG5o4buvbmcgbOG6p24ga2h1bmcgxJHhu5VpXG4gICAqIHbDrCBsw70gZG8ga2jDoWMg4oCUIMSR4buVaSB6b29tLCB0aHUgZ+G7jW4gY+G7mXQgYsOqbiB0csOhaS5cbiAgICpcbiAgICogVOG6r3QgYuG6sW5nIGBjb25maWcuYXV0b1Jlc2l6ZU5lc3RlZEdyaWRzOiBmYWxzZWAuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTmVzdGVkUmVzaXplSG9va3MoYmFzZTogR3JpZHN0ZXJDb25maWcsIGRlcHRoOiBudW1iZXIpOiBQYXJ0aWFsPEdyaWRzdGVyQ29uZmlnPiB7XG4gICAgaWYgKHRoaXMuY29uZmlnPy5hdXRvUmVzaXplTmVzdGVkR3JpZHMgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IGdvY0l0ZW1SZXNpemUgPSBiYXNlLml0ZW1SZXNpemVDYWxsYmFjaztcbiAgICBjb25zdCBnb2NJbml0ID0gYmFzZS5pbml0Q2FsbGJhY2s7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXRlbVJlc2l6ZUNhbGxiYWNrOiAoaXRlbSwgaXRlbUNvbXBvbmVudCkgPT4ge1xuICAgICAgICBnb2NJdGVtUmVzaXplPy4oaXRlbSwgaXRlbUNvbXBvbmVudCk7XG4gICAgICAgIGNvbnN0IGVsID0gKGl0ZW1Db21wb25lbnQgYXMgeyBlbD86IEhUTUxFbGVtZW50IH0gfCB1bmRlZmluZWQpPy5lbDtcblxuICAgICAgICBlbD8ucXVlcnlTZWxlY3RvckFsbCgnZ3JpZHN0ZXInKS5mb3JFYWNoKChuZXN0ZWQpID0+IHRoaXMucmVzaXplR3JpZHN0ZXJFbGVtZW50KG5lc3RlZCBhcyBIVE1MRWxlbWVudCkpO1xuICAgICAgfSxcbiAgICAgIC4uLihkZXB0aCA+IDBcbiAgICAgICAgPyB7IGluaXRDYWxsYmFjazogKGdyaWRzdGVyOiBHcmlkc3RlckNvbXBvbmVudEludGVyZmFjZSkgPT4gdGhpcy5yZWdpc3Rlck5lc3RlZEdyaWQoZ3JpZHN0ZXIsIGdvY0luaXQpIH1cbiAgICAgICAgOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBH4buNaSBgcmVzaXplKClgIGPhu6dhIG3hu5l0IHRo4bq7IGA8Z3JpZHN0ZXI+YCBxdWEgY2jDrW5oIGluc3RhbmNlIG3DoCBuw7MgdOG7sSBn4bqvbiBsw6puIHBo4bqnbiB04butLiAqL1xuICBwcml2YXRlIHJlc2l6ZUdyaWRzdGVyRWxlbWVudChuZXN0ZWQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgZ2l1SW5zdGFuY2UgPSBuZXN0ZWQgYXMgdW5rbm93biBhcyB7IF9fZ3JpZHN0ZXJJbnN0YW5jZT86IHsgb3B0aW9ucz86IHsgYXBpPzogeyByZXNpemU/OiAoKSA9PiB2b2lkIH0gfSB9IH07XG5cbiAgICBnaXVJbnN0YW5jZS5fX2dyaWRzdGVySW5zdGFuY2U/Lm9wdGlvbnM/LmFwaT8ucmVzaXplPy4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBH4bqvbiBpbnN0YW5jZSBsw6puIGNow61uaCBwaOG6p24gdOG7rSBgPGdyaWRzdGVyPmAgcuG7k2kgdGhlbyBkw7VpIGLhu4EgcuG7mW5nIGPhu6dhIG7Dsy5cbiAgICpcbiAgICogUGjhuqNpIGfhuq9uIG5nxrDhu6NjIGzDqm4gRE9NIHbDrCBgaXRlbVJlc2l6ZUNhbGxiYWNrYCBj4bunYSBraOG7kWkgQ0hBIGNo4buJIGPhuqdtIMSRxrDhu6NjIGBIVE1MRWxlbWVudGAsIGtow7RuZyBjw7NcbiAgICogxJHGsOG7nW5nIG7DoG8ga2jDoWMgxJFpIHThu6sgxJHDsyB24buBIGluc3RhbmNlIGPhu6dhIGzGsOG7m2kgbOG7k25nIGLDqm4gdHJvbmcuXG4gICAqL1xuICBwcml2YXRlIHJlZ2lzdGVyTmVzdGVkR3JpZChcbiAgICBncmlkc3RlcjogR3JpZHN0ZXJDb21wb25lbnRJbnRlcmZhY2UsXG4gICAgZ29jPzogKGdyaWRzdGVyOiBHcmlkc3RlckNvbXBvbmVudEludGVyZmFjZSkgPT4gdm9pZFxuICApOiB2b2lkIHtcbiAgICBnb2M/Lihncmlkc3Rlcik7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBncmlkc3RlciBhcyB1bmtub3duIGFzIHsgZWw/OiBIVE1MRWxlbWVudDsgb3B0aW9ucz86IHsgYXBpPzogeyByZXNpemU/OiAoKSA9PiB2b2lkIH0gfSB9IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGVsID0gaW5zdGFuY2U/LmVsO1xuXG4gICAgaWYgKCFlbCB8fCB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIChlbCBhcyB1bmtub3duIGFzIHsgX19ncmlkc3Rlckluc3RhbmNlPzogdW5rbm93biB9KS5fX2dyaWRzdGVySW5zdGFuY2UgPSBpbnN0YW5jZTtcblxuICAgIGNvbnN0IHRoZW9Eb2kgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gaW5zdGFuY2U/Lm9wdGlvbnM/LmFwaT8ucmVzaXplPy4oKSk7XG5cbiAgICB0aGVvRG9pLm9ic2VydmUoZWwpO1xuICAgIHRoaXMubmVzdGVkUmVzaXplT2JzZXJ2ZXJzLmFkZCh0aGVvRG9pKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBH4bqvbiBjb21wb25lbnQgY+G7p2EgbsahaSBkw7luZyBsw6puIG3hu5l0IGto4buRaS5cbiAgICpcbiAgICogQHBhcmFtIGhvc3QgY2jhu5cgZ+G6r24gUknDik5HIGPhu6dhIMO0IMSRw7Mg4oCUIG3hu5dpIGto4buRaSBt4buZdCBgVmlld0NvbnRhaW5lclJlZmAsIGTDuW5nIGNodW5nIG3hu5l0IGPDoWkgdGjDrFxuICAgKiAgIG3hu41pIGNvbXBvbmVudCBi4buLIGThu5NuIGjhur90IHbDoG8gbeG7mXQgw7QuXG4gICAqL1xuICBwcml2YXRlIGF0dGFjaE5vZGUobm9kZTogVF9ncmlkTGF5b3V0X25vZGUsIGRlcHRoOiBudW1iZXIsIGhvc3Q6IFZpZXdDb250YWluZXJSZWYpOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZztcblxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmNvbXBvbmVudFJlZnMuZ2V0KG5vZGUuaWQpO1xuXG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICB0aGlzLmFwcGx5SW5wdXRzKGV4aXN0aW5nLCBub2RlLCBkZXB0aCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBLaOG7kWkgdOG7sSBraGFpIHRow6wgaOG7j2kgbsOzOyBraMO0bmcgdGjDrCBo4buPaSBow6BtIHBow6JuIGdp4bqjaSBjaHVuZy4gQ+G6oyBoYWkgxJHhu4F1IG5o4bqtbiBgbm9kZWAgxJHhu4MgxJHhu41jXG4gICAgLy8gxJHGsOG7o2MgYGRhdGEudHlwZWAgbcOgIHF1eeG6v3QgxJHhu4tuaCB0cuG6oyBjb21wb25lbnQgbsOgby5cbiAgICBjb25zdCBzdHJlYW0gPSAobm9kZS5nZXRDb21wb25lbnRPdXRsZXQgPz8gY29uZmlnLmdldENvbXBvbmVudE91dGxldCk/Lihub2RlKTtcblxuICAgIGlmICghc3RyZWFtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g8J+UtCBIdeG7tyBsxrDhu6N0IHThuqNpIEPFqCBj4bunYSDEkcO6bmcga2jhu5FpIG7DoHkgdHLGsOG7m2Mga2hpIG3hu58gbMaw4bujdCBt4bubaS5cbiAgICAvLyBLaOG7kWkgYuG7iyBn4buhIHLhu5NpIGfhuq9uIGzhuqFpICjEkeG7lWkgYuG7kSBj4bulYywgc+G6r3AgZ+G7jW4pIHRyb25nIGzDumMgYGltcG9ydCgpYCBjaMawYSB4b25nIHRow6wgbMaw4bujdCBjxakgduG6q25cbiAgICAvLyBjaOG6oXkgdGnhur9wIHbDoCBk4buxbmcgY29tcG9uZW50IHbDoG8gbeG7mXQgYFZpZXdDb250YWluZXJSZWZgIMSRw6MgY2jhur90LlxuICAgIHRoaXMucGVuZGluZ0xvYWRzLmdldChub2RlLmlkKT8udW5zdWJzY3JpYmUoKTtcblxuICAgIGNvbnN0IHN1YiA9IHN0cmVhbS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoY29tcG9uZW50VHlwZSkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nTG9hZHMuZGVsZXRlKG5vZGUuaWQpO1xuXG4gICAgICAvLyBLaOG7kWkgY8OzIHRo4buDIMSRw6MgYuG7iyB4b8OhIHRyb25nIGzDumMgY2jhu50gdOG6o2kg4oCUIGThu7FuZyB2w6BvIMSRw6J5IGzDoCByw7IgcuG7iS5cbiAgICAgIGlmICghdGhpcy50cmVlU2VydmljZS5maW5kQnlJZCh0aGlzLnJvb3ROb2RlKCkgPz8gbm9kZSwgbm9kZS5pZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWYgPSBob3N0LmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRUeXBlKTtcblxuICAgICAgdGhpcy5hcHBseUlucHV0cyhyZWYsIG5vZGUsIGRlcHRoKTtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmcy5zZXQobm9kZS5pZCwgcmVmKTtcbiAgICB9KTtcblxuICAgIHRoaXMucGVuZGluZ0xvYWRzLnNldChub2RlLmlkLCBzdWIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEfhu6EgY29tcG9uZW50IGPhu6dhIG3hu5l0IGto4buRaSB2w6AgaHXhu7cgbsOzLiAqL1xuICBwcml2YXRlIGRldGFjaE5vZGUobm9kZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBLaOG7kWkgYuG7iyBn4buhIGtoaSBjb21wb25lbnQgY+G7p2EgbsOzIGPDsm4gxJFhbmcgdOG6o2kg4oCUIHBo4bqjaSBodeG7tyBsxrDhu6N0IHThuqNpLCBraMO0bmcgdGjDrCBuw7MgZOG7sW5nIHbDoG8gbeG7mXRcbiAgICAvLyBgVmlld0NvbnRhaW5lclJlZmAgxJHDoyBjaOG6v3QuXG4gICAgdGhpcy5wZW5kaW5nTG9hZHMuZ2V0KG5vZGVJZCk/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5wZW5kaW5nTG9hZHMuZGVsZXRlKG5vZGVJZCk7XG5cbiAgICBjb25zdCByZWYgPSB0aGlzLmNvbXBvbmVudFJlZnMuZ2V0KG5vZGVJZCk7XG5cbiAgICBpZiAoIXJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJlZi5kZXN0cm95KCk7XG4gICAgdGhpcy5jb21wb25lbnRSZWZzLmRlbGV0ZShub2RlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXN0cm95KCk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgc3ViIG9mIHRoaXMucGVuZGluZ0xvYWRzLnZhbHVlcygpKSB7XG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlZiBvZiB0aGlzLmNvbXBvbmVudFJlZnMudmFsdWVzKCkpIHtcbiAgICAgIHJlZi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvYnNlcnZlciBvZiB0aGlzLm5lc3RlZFJlc2l6ZU9ic2VydmVycykge1xuICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ0xvYWRzLmNsZWFyKCk7XG4gICAgdGhpcy5jb21wb25lbnRSZWZzLmNsZWFyKCk7XG4gICAgdGhpcy5uZXN0ZWRSZXNpemVPYnNlcnZlcnMuY2xlYXIoKTtcbiAgICB0aGlzLmNvbmZpZyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBOaMOzbSBow6BtIGNobyBuxqFpIGTDuW5nIENI4bumIMSQ4buYTkcgZ+G7jWkg4oCUIGtow7RuZyBwaOG6o2kgY2jhu50gbmfGsOG7nWkgZMO5bmcgYuG6pW0gbsO6dCB0csOqbiBraOG7kWkuXG4gIC8vIFPhu61hIGPDonkgdGjDrCBkw7luZyB0aOG6s25nIGBUcmVlU2VydmljZWAgcuG7k2kgZ+G7jWkgYHJlZnJlc2goKWAg4oCUIHhlbSBkZW1vIHRyb25nIGNvcmUtdWkuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBCw6FvIGNobyBzZXJ2aWNlIGJp4bq/dCBjw6J5IHbhu6thIMSR4buVaSB04burIGLDqm4gbmdvw6BpICh0aMOqbS94b8OhIGto4buRaSwgc+G6r3AgZ+G7jW4sIG7huqFwIGLhu5EgY+G7pWMga2jDoWMpLlxuICAgKlxuICAgKiDwn5S0IFBI4bqiSSB0aGF5IFRIQU0gQ0hJ4bq+VSBj4bunYSBub2RlIGfhu5FjLCBraMO0bmcgY2jhu4kgYsahbSBgdmVyc2lvbmAuXG4gICAqIGBAZm9yIOKApiB0cmFjayBpdGVtLmlkYCBnaeG7ryBuZ3V5w6puIG9iamVjdCBraGkgaWQga2jDtG5nIMSR4buVaSwgbsOqbiBgPGdyaWRzdGVyLWl0ZW0gW2l0ZW1dPVwi4oCmXCI+YCB24bqrblxuICAgKiBuaOG6rW4gxJHDum5nIG9iamVjdCBjxakgdsOgIGdyaWRzdGVyIGtow7RuZyBo4buBIGJp4bq/dCBgeC95L2NvbHMvcm93cy9sYXllckluZGV4YCB24burYSBi4buLIHPhu61hLiBCxqFtIG3hu5dpXG4gICAqIGB2ZXJzaW9uYCB0aMOsIGNvbXB1dGVkIGNo4bqheSBs4bqhaSBuaMawbmcgdHLhuqMgduG7gSBDw5lORyBt4bqjbmcgY8WpIOKAlCBsxrDhu5tpIMSR4bupbmcgaW0gKMSRbyAyOC8wOC8yMDI2OiBi4bqlbVxuICAgKiBcIlPhuq9wIGfhu41uXCIgY8OieSDEkcOjIGThu5NuIGtow610IG3DoCBtw6BuIGjDrG5oIGtow7RuZyBuaMO6YyBuaMOtY2g7IGLhuq10IGNo4buTbmcga2jhu5FpIG3DoCBgJGl0ZW0ubGF5ZXJJbmRleGBcbiAgICogduG6q24gdHLhu5FuZykuXG4gICAqXG4gICAqIE5ow6JuIGLhuqNuIE7DlE5HIGPhuqMgbm9kZSBn4buRYyB2w6AgZGFuaCBzw6FjaCBjb24gbMOgIMSR4bunOiBt4bqjbmcgbeG7m2kg4oaSIGBAZm9yYCBk4buxbmcgbOG6oWkgaXRlbSwgb2JqZWN0IGNvblxuICAgKiBt4bubaSDihpIgZ3JpZHN0ZXIgxJHhu41jIGzhuqFpIHRvw6BuIGLhu5kgdG/huqEgxJHhu5kuXG4gICAqL1xuICByZWZyZXNoKGV2ZW50PzogVF9ncmlkTGF5b3V0X2NoYW5nZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgcm9vdCA9IGV2ZW50Py5yb290ID8/IHRoaXMucm9vdE5vZGUoKTtcblxuICAgIGlmICghcm9vdCkge1xuICAgICAgdGhpcy52ZXJzaW9uLnVwZGF0ZSgodikgPT4gdiArIDEpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZyA9IHsgLi4udGhpcy5jb25maWcsIGRhdGE6IHJvb3QgfTtcbiAgICB9XG5cbiAgICB0aGlzLnJvb3ROb2RlLnNldCh0aGlzLnNoYWxsb3dDbG9uZVRyZWUocm9vdCkpO1xuICAgIHRoaXMudmVyc2lvbi51cGRhdGUoKHYpID0+IHYgKyAxKTtcbiAgfVxuXG4gIC8qKiBOaMOibiBi4bqjbiBuw7RuZyB0aGVvIGPhuqMgY2hp4buBdSBzw6J1OiBt4buXaSBub2RlIHbDoCBt4bqjbmcgYGNoaWxkcmVuYCB0aMOgbmggdGhhbSBjaGnhur91IG3hu5tpLiAqL1xuICAvKipcbiAgICogTmjDom4gYuG6o24gU8OCVSBj4bqjIGPDonkg4oCUIGTDuW5nIGNobyBgZXhwb3J0TGF5b3V0KClgLlxuICAgKlxuICAgKiDwn5S0IELhu44gYGdldENvbXBvbmVudE91dGxldGAga2jhu49pIGLhuqNuIHNhbzogbsOzIGzDoCBt4buZdCBIw4BNLCBraMO0bmcgdHXhuqduIHThu7EgaG/DoSDEkcaw4bujYyBuw6puIGfhu61pIHh14buRbmdcbiAgICogYmFja2VuZCBsw6AgaOG7j25nIChgSlNPTi5zdHJpbmdpZnlgIG514buRdCBt4bqldCwgYHN0cnVjdHVyZWRDbG9uZWAgbsOpbSBs4buXaSkuIE7huqFwIGzhuqFpIHRow6wgaMOgbSBwaMOiblxuICAgKiBnaeG6o2kgY2h1bmcgY+G7p2EgY+G6pXUgaMOsbmggbG8g4oCUIGNvbXBvbmVudCBzdXkgcmEgdOG7qyBgZGF0YS50eXBlYCwga2jDtG5nIGPhuqduIGzGsHUuXG4gICAqL1xuICBwcml2YXRlIGRlZXBDbG9uZVRyZWUobm9kZTogVF9ncmlkTGF5b3V0X25vZGUpOiBUX2dyaWRMYXlvdXRfbm9kZSB7XG4gICAgY29uc3QgY29weTogVF9ncmlkTGF5b3V0X25vZGUgPSB7IC4uLm5vZGUgfTtcblxuICAgIC8vIEPhuq90IGjDoG0gcGjDom4gZ2nhuqNpIOKAlCB4ZW0gY2jDuiB0aMOtY2ggdHLDqm4uXG4gICAgZGVsZXRlIGNvcHkuZ2V0Q29tcG9uZW50T3V0bGV0O1xuXG4gICAgY29uc3QgeyBjaGlsZHJlbiwgZGF0YSwgLi4ucmVzdCB9ID0gY29weTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5yZXN0LFxuICAgICAgLi4uKGRhdGEgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBkYXRhOiBjbG9uZURlZXAoZGF0YSkgfSksXG4gICAgICAuLi4oY2hpbGRyZW4gPyB7IGNoaWxkcmVuOiBjaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB0aGlzLmRlZXBDbG9uZVRyZWUoY2hpbGQpKSB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNoYWxsb3dDbG9uZVRyZWUobm9kZTogVF9ncmlkTGF5b3V0X25vZGUpOiBUX2dyaWRMYXlvdXRfbm9kZSB7XG4gICAgaWYgKCFub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7IC4uLm5vZGUgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyAuLi5ub2RlLCBjaGlsZHJlbjogbm9kZS5jaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB0aGlzLnNoYWxsb3dDbG9uZVRyZWUoY2hpbGQpKSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEfDoW4gYGxheWVySW5kZXhgIGtow6FjIG5oYXUgY2hvIHThu6tuZyBraOG7kWkga2hpIGLhuq10IGNo4buTbmcga2jhu5FpLlxuICAgKlxuICAgKiDwn5S0IGBhbGxvd011bHRpTGF5ZXI6IHRydWVgIE3hu5hUIE3DjE5IIGtow7RuZyBjaG8ga2jhu5FpIMSRw6ggbmhhdS4gTcOjIGxpYiBzbyBgbGF5ZXJJbmRleGAgY+G7p2EgaGFpIGto4buRaTpcbiAgICogS0jDgUMgbmhhdSB0aMOsIGNobyDEkcOoLCBHSeG7kE5HIG5oYXUgduG6q24gYsOhbyB2YSBjaOG6oW0uIEto4buRaSBraMO0bmcga2hhaSBgbGF5ZXJJbmRleGAgxJHhu4F1IHLGoWkgduG7gVxuICAgKiBgZGVmYXVsdExheWVySW5kZXhgIOKAlCB04bupYyBDw5lORyBs4bubcCwgbsOqbiBrw6lvIHbDoG8gbmhhdSBsw6AgYuG7iyBjaOG6t24geSBuaMawIGzGsOG7m2kgdGjGsOG7nW5nIChuZ8aw4budaSBkw7luZ1xuICAgKiBiw6FvIDI4LzA4LzIwMjY6IFwiYuG6rXQgY2jhu5NuZyBraOG7kWkgbmjGsG5nIGtoaSBrw6lvIHRow6wgY8OhYyBraOG7kWkgduG6q24gZGkgY2h1eeG7g24gdGhlb1wiKS5cbiAgICpcbiAgICogTsahaSBkw7luZyB04buxIGtoYWkgYGxheWVySW5kZXhgIHRow6wgZ2nhu68gbmd1ecOqbjsgYWkga2jDtG5nIGtoYWkgdGjDrCB0aMawIHZp4buHbiB44bq/cCBt4buXaSBraOG7kWkgbeG7mXQgbOG7m3BcbiAgICogdGhlbyB0aOG7qSB04buxLCDEkeG7pyDEkeG7gyBt4buNaSBj4bq3cCDEkeG7gXUga2jDoWMgbOG7m3AuXG4gICAqL1xuICBwcml2YXRlIGFzc2lnbk92ZXJsYXBMYXllcnMocm9vdDogVF9ncmlkTGF5b3V0X25vZGUpOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCBjYW5PdmVybGFwID0gY29uZmlnPy5tb2RlID09PSBFX2dyaWRMYXlvdXRfbW9kZV9zdHJpbmcuZnJlZSB8fCAoY29uZmlnPy5hbGxvd092ZXJsYXAgPz8gZmFsc2UpO1xuXG4gICAgaWYgKCFjYW5PdmVybGFwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGxheWVyID0gMDtcbiAgICBjb25zdCB3YWxrID0gKG5vZGU6IFRfZ3JpZExheW91dF9ub2RlKTogdm9pZCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4gPz8gW10pIHtcbiAgICAgICAgaWYgKGNoaWxkLmxheWVySW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxheWVyICs9IDE7XG4gICAgICAgICAgY2hpbGQubGF5ZXJJbmRleCA9IGxheWVyO1xuICAgICAgICB9XG5cbiAgICAgICAgd2FsayhjaGlsZCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdhbGsocm9vdCk7XG5cbiAgfVxuXG4gIC8qKiDEkMawYSBt4buZdCBraOG7kWkgbMOqbiB0csOqbiB04bqldCBj4bqjOiBs4bubcCBj4bunYSBuw7MgPSBs4bubcCBs4bubbiBuaOG6pXQgxJFhbmcgY8OzICsgMS4gKi9cbiAgcHJpdmF0ZSByYWlzZVRvVG9wTGF5ZXIoaXRlbTogR3JpZHN0ZXJJdGVtKTogdm9pZCB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdE5vZGUoKTtcblxuICAgIGlmICghcm9vdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCB0b3BMYXllciA9IDA7XG4gICAgY29uc3Qgd2FsayA9IChub2RlOiBUX2dyaWRMYXlvdXRfbm9kZSk6IHZvaWQgPT4ge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuID8/IFtdKSB7XG4gICAgICAgIHRvcExheWVyID0gTWF0aC5tYXgodG9wTGF5ZXIsIGNoaWxkLmxheWVySW5kZXggPz8gMCk7XG4gICAgICAgIHdhbGsoY2hpbGQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3YWxrKHJvb3QpO1xuXG4gICAgLy8gYGl0ZW1gIGdyaWRzdGVyIHRy4bqjIHbhu4EgQ0jDjU5IIGzDoCBvYmplY3Qgbm9kZSBj4bunYSBjw6J5ICh0cnV54buBbiB0aOG6s25nIHF1YSBgW2l0ZW1dYCksIG7Dqm4gZ8OhbiB2w6BvXG4gICAgLy8gxJHDonkgbMOgIGPDonkgY8WpbmcgxJHhu5VpIHRoZW8uXG4gICAgY29uc3Qgbm9kZSA9IGl0ZW0gYXMgdW5rbm93biBhcyBUX2dyaWRMYXlvdXRfbm9kZTtcblxuICAgIGlmIChub2RlLmxheWVySW5kZXggPT09IHRvcExheWVyKSB7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLmxheWVySW5kZXggPSB0b3BMYXllciArIDE7XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gU+G7rEEgQ8OCWSDigJQgdGjGsCB2aeG7h24gxJHDoyBnaeG7ryBjw6J5IG7Dqm4gYuG6oW4gS0jDlE5HIHBo4bqjaSB0cnV54buBbiBuw7MgdsOgby5cbiAgLy8gTeG7jWkgaMOgbSBkxrDhu5tpIMSRw6J5IHThu7EgduG6vSBs4bqhaTsga2jDtG5nIGPhuqduIGfhu41pIGByZWZyZXNoKClgLlxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogVGjDqm0gbeG7mXQga2jhu5FpLlxuICAgKlxuICAgKiBAcGFyYW0gaXRlbSBraOG7kWkgbeG7m2kg4oCUIEtIw5RORyBj4bqnbiBgaWRgICh0aMawIHZp4buHbiBzaW5oKSB2w6AgYHhgL2B5YCAodOG7sSDEkeG6t3QgeHXhu5FuZyBow6BuZyB0cuG7kW5nKS5cbiAgICogQHBhcmFtIHBhcmVudElkIGNvbnRhaW5lciBtdeG7kW4gdGjDqm0gdsOgbzsgYuG7jyB0cuG7kW5nIHRow6wgdGjDqm0gdsOgbyBt4bq3dCBwaOG6s25nIGfhu5FjLlxuICAgKiBAcmV0dXJucyBraOG7kWkgduG7q2EgdOG6oW8gKGvDqG0gYGlkYCB24burYSBzaW5oKSwgaG/hurdjIGB1bmRlZmluZWRgIGtoaSBraMO0bmcgdMOsbSB0aOG6pXkgY29udGFpbmVyLlxuICAgKi9cbiAgYWRkQmxvY2soaXRlbTogVF9ncmlkTGF5b3V0X25ld05vZGUsIHBhcmVudElkPzogc3RyaW5nKTogVF9ncmlkTGF5b3V0X25vZGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3ROb2RlKCk7XG4gICAgY29uc3QgYWRkZWQgPSByb290ID8gdGhpcy50cmVlU2VydmljZS5hZGRDaGlsZChyb290LCBwYXJlbnRJZCA/PyByb290LmlkLCBpdGVtKSA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChhZGRlZCkge1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFkZGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRow6ptIG3hu5l0IGto4buRaSB04bqhaSB0b+G6oSDEkeG7mSAoY29sLCByb3cpIGPhu6UgdGjhu4MgdsOgIHThu7EgxJHhu5luZyDEkeG6qXkgY8OhYyBraOG7kWkgdmEgY2jhuqFtIHh14buRbmcgZMaw4bubaS5cbiAgICovXG4gIGluc2VydEJsb2NrV2l0aENvbGxpc2lvbihcbiAgICBpdGVtOiBUX2dyaWRMYXlvdXRfbmV3Tm9kZSxcbiAgICB0YXJnZXRDb2wgPSAwLFxuICAgIHRhcmdldFJvdyA9IDAsXG4gICAgcGFyZW50SWQ/OiBzdHJpbmcsXG4gICk6IFRfZ3JpZExheW91dF9ub2RlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByb290ID0gdGhpcy5yb290Tm9kZSgpO1xuICAgIGNvbnN0IGFkZGVkID0gcm9vdFxuICAgICAgPyB0aGlzLnRyZWVTZXJ2aWNlLmluc2VydFdpdGhDb2xsaXNpb24ocm9vdCwgcGFyZW50SWQgPz8gcm9vdC5pZCwgaXRlbSwgdGFyZ2V0Q29sLCB0YXJnZXRSb3cpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChhZGRlZCkge1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFkZGVkO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmVEcmFnUGF5bG9hZCA9IHNpZ25hbDx1bmtub3duIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIC8qKiDEkOG6t3QgcGF5bG9hZCBraGkgYuG6r3QgxJHhuqd1IGvDqW8gdOG7qyBiw6puIG5nb8OgaSB2w6BvICh2w60gZOG7pTogcGFsZXR0ZSwgZHJhd2VyKSAqL1xuICBzZXREcmFnUGF5bG9hZChwYXlsb2FkOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVEcmFnUGF5bG9hZC5zZXQocGF5bG9hZCk7XG4gIH1cblxuICAvKiogTOG6pXkgcGF5bG9hZCDEkWFuZyBrw6lvICovXG4gIGdldERyYWdQYXlsb2FkKCk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZURyYWdQYXlsb2FkKCk7XG4gIH1cblxuICAvKiogWG/DoSBwYXlsb2FkIGtoaSBr4bq/dCB0aMO6YyBrw6lvICovXG4gIGNsZWFyRHJhZ1BheWxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVEcmFnUGF5bG9hZC5zZXQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKiBYb8OhIG3hu5l0IGto4buRaS4gWG/DoSBjb250YWluZXIgbMOgIHhvw6EgY+G6oyBydeG7mXQuIFRy4bqjIGBmYWxzZWAga2hpIGtow7RuZyB4b8OhIMSRxrDhu6NjICh2ZCBraOG7kWkgZ+G7kWMpLiAqL1xuICByZW1vdmVCbG9jayhpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdE5vZGUoKTtcbiAgICBjb25zdCBkb25lID0gcm9vdCA/IHRoaXMudHJlZVNlcnZpY2UucmVtb3ZlQnlJZChyb290LCBpZCkgOiBmYWxzZTtcblxuICAgIGlmIChkb25lKSB7XG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG9uZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBT4buRIGPhu5l0IHRo4bqtdCBj4bunYSBsxrDhu5tpIGPhuqVwIHRyYW5nLlxuICAgKlxuICAgKiDwn5S0IE3hurdjIMSR4buLbmggcGjhuqNpIFRSw5lORyBgbWluQ29scy9tYXhDb2xzYCBj4bunYSBgZ3JpZExheW91dFJvb3RDb25maWcoKWAuIFRyxrDhu5tjIMSRw6J5IGNo4buXIG7DoHkgdHLhuqMgMjRcbiAgICogdHJvbmcga2hpIGzGsOG7m2kgduG6vSAxMjogbsahaSBkw7luZyBraMO0bmcgdHJ1eeG7gW4gYGNvbHNgIHRow6wgdmEgY2jhuqFtLCBgdG9Db250YWluZXJgIHbDoCBgY29tcGFjdGAgdMOtbmhcbiAgICogdGhlbyAyNCBj4buZdCBjw7JuIG3DoG4gaMOsbmggY2jhu4kgY8OzIDEyIOKAlCBraOG7kWkgcsahaSByYSBuZ2/DoGkgbcOpcCBwaOG6o2kgbcOgIGtow7RuZyBhaSBoaeG7g3UgdsOsIHNhby5cbiAgICovXG4gIGdldCB0b3RhbENvbHVtbnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc/LmNvbHMgPz8gZ3JpZExheW91dFJvb3RDb25maWcoKS5tYXhDb2xzID8/IDEyO1xuICB9XG5cbiAgLyoqXG4gICAqIMSQ4buVaSBz4buRIGPhu5l0IC8gc+G7kSBow6BuZyBj4bunYSBt4buZdCBraOG7kWkgcuG7k2kgduG6vSBs4bqhaS5cbiAgICpcbiAgICogS8OpbyBgY29sc2AgcuG7mW5nIHF1w6EgbcOpcCBwaOG6o2kgdGjDrCBk4buLY2gga2jhu5FpIHNhbmcgdHLDoWkgY2hvIHbhu6thLCB0aGF5IHbDrCDEkeG7gyBuw7MgdHLDoG4gcmEgbmdvw6BpIGzGsOG7m2kuXG4gICAqL1xuICByZXNpemVCbG9jayhpZDogc3RyaW5nLCBzaXplOiB7IGNvbHM/OiBudW1iZXI7IHJvd3M/OiBudW1iZXIgfSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmRCbG9jayhpZCk7XG5cbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc2l6ZS5jb2xzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG5vZGUuY29scyA9IHNpemUuY29scztcbiAgICAgIGlmIChub2RlLnggKyBzaXplLmNvbHMgPiB0aGlzLnRvdGFsQ29sdW1ucykge1xuICAgICAgICBub2RlLnggPSBNYXRoLm1heCgwLCB0aGlzLnRvdGFsQ29sdW1ucyAtIHNpemUuY29scyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpemUucm93cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBub2RlLnJvd3MgPSBzaXplLnJvd3M7XG4gICAgfVxuICAgIHRoaXMucmVmcmVzaCgpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogTmjDom4gYuG6o24gbeG7mXQga2jhu5FpIOKAlCDEkeG6t3Qga+G6vyBiw6puIHBo4bqjaSBu4bq/dSBjw7JuIGNo4buXLCBraMO0bmcgdGjDrCB4deG7kW5nIGTDsm5nIGTGsOG7m2kuXG4gICAqXG4gICAqIGB0cmFuc2Zvcm1EYXRhYCDEkeG7gyBuxqFpIGTDuW5nIMSR4buVaSBwaOG6p24gZOG7ryBsaeG7h3UgcmnDqm5nIGPhu6dhIG3DrG5oICh2ZCBu4buRaSB0aMOqbSBcIihC4bqjbiBzYW8pXCIgdsOgbyB0acOqdVxuICAgKiDEkeG7gSk7IHRoxrAgdmnhu4duIGtow7RuZyB04buxIMSRb8OhbiB0csaw4budbmcgbsOgbyBsw6AgdGnDqnUgxJHhu4EuXG4gICAqL1xuICBkdXBsaWNhdGVCbG9jayhpZDogc3RyaW5nLCB0cmFuc2Zvcm1EYXRhPzogKGRhdGE6IHVua25vd24pID0+IHVua25vd24pOiBUX2dyaWRMYXlvdXRfbm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdE5vZGUoKTtcbiAgICBjb25zdCBub2RlID0gcm9vdCA/IGZpbmROb2RlUmVjdXJzaXZlKHJvb3QsIGlkKSA6IHVuZGVmaW5lZDtcblxuICAgIGlmICghcm9vdCB8fCAhbm9kZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gZmluZFBhcmVudFJlY3Vyc2l2ZShyb290LCBpZCk7XG4gICAgY29uc3QgaXNOZXN0ZWQgPSBCb29sZWFuKHBhcmVudCAmJiBwYXJlbnQuaWQgIT09IHJvb3QuaWQpO1xuICAgIGNvbnN0IGNsb25lZERhdGEgPSBjbG9uZURlZXAobm9kZS5kYXRhKTtcblxuICAgIGxldCB0YXJnZXRYID0gbm9kZS54ICsgbm9kZS5jb2xzO1xuICAgIGxldCB0YXJnZXRZID0gbm9kZS55O1xuXG4gICAgaWYgKHRhcmdldFggKyBub2RlLmNvbHMgPiB0aGlzLnRvdGFsQ29sdW1ucykge1xuICAgICAgdGFyZ2V0WCA9IDA7XG4gICAgICB0YXJnZXRZID0gbm9kZS55ICsgbm9kZS5yb3dzO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFkZEJsb2NrKFxuICAgICAge1xuICAgICAgICB4OiB0YXJnZXRYLFxuICAgICAgICB5OiB0YXJnZXRZLFxuICAgICAgICBjb2xzOiBub2RlLmNvbHMsXG4gICAgICAgIHJvd3M6IG5vZGUucm93cyxcbiAgICAgICAgZGF0YTogdHJhbnNmb3JtRGF0YSA/IHRyYW5zZm9ybURhdGEoY2xvbmVkRGF0YSkgOiBjbG9uZWREYXRhLFxuICAgICAgICBnZXRDb21wb25lbnRPdXRsZXQ6IG5vZGUuZ2V0Q29tcG9uZW50T3V0bGV0LFxuICAgICAgfSxcbiAgICAgIGlzTmVzdGVkID8gcGFyZW50Py5pZCA6IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cblxuICAvKiogQmnhur9uIGto4buRaSDEkcahbiB0aMOgbmggQ09OVEFJTkVSIOKAlCBu4buZaSBkdW5nIGPFqSB0aMOgbmgga2jhu5FpIGNvbiDEkeG6p3UgdGnDqm4sIGtow7RuZyBt4bqldCBk4buvIGxp4buHdS4gKi9cbiAgdG9Db250YWluZXIoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3ROb2RlKCk7XG4gICAgY29uc3QgZG9uZSA9IHJvb3QgPyB0aGlzLnRyZWVTZXJ2aWNlLnRvQ29udGFpbmVyKHJvb3QsIGlkLCB0aGlzLnRvdGFsQ29sdW1ucykgOiBmYWxzZTtcblxuICAgIGlmIChkb25lKSB7XG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG9uZTtcbiAgfVxuXG4gIC8qKiDEkMawYSBDT05UQUlORVIgduG7gSBraOG7kWkgxJHGoW4g4oCUIGto4buRaSBjb24gxJHGsOG7o2MgbsOibmcgbMOqbiBj4bqlcCB0csOqbiwga2jDtG5nIGLhu4sgeG/DoS4gKi9cbiAgdG9TaW5nbGUoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3ROb2RlKCk7XG4gICAgY29uc3QgZG9uZSA9IHJvb3QgPyB0aGlzLnRyZWVTZXJ2aWNlLnRvU2luZ2xlKHJvb3QsIGlkKSA6IGZhbHNlO1xuXG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cblxuICAgIHJldHVybiBkb25lO1xuICB9XG5cbiAgLyoqIEThu5NuIGto4buRaSBraMOtdCBsw6puIHRyw6puLCBs4bqlcCBo4bq/dCBjaOG7lyB0cuG7kW5nLiDEkOG7hyBxdXkgdsOgbyBjb250YWluZXIuICovXG4gIGNvbXBhY3QoKTogdm9pZCB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdE5vZGUoKTtcblxuICAgIGlmICghcm9vdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudHJlZVNlcnZpY2UuY29tcGFjdChyb290LCB0aGlzLnRvdGFsQ29sdW1ucyk7XG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQuG7kSBj4bulYyBISeG7hk4gVOG6oEksIMSRw6MgY+G6r3QgbeG7jWkgdGhhbSBjaGnhur91IOKAlCBn4butaSB0aOG6s25nIHh14buRbmcgYmFja2VuZCDEkcaw4bujYy5cbiAgICpcbiAgICogRMO5bmcga2hpIGLhuqVtIG7DunQgTMawdS4gS2jDoWMgYFJvb3QoKWAg4bufIGNo4buXIMSRw6J5IGzDoCBi4bqjbiBTQU86IG7GoWkgZMO5bmcgY8OzIHPhu61hIGfDrCB0csOqbiBr4bq/dCBxdeG6oyBjxaluZ1xuICAgKiBraMO0bmcgxJHhu6VuZyB04bubaSBjw6J5IG3DoCB0aMawIHZp4buHbiDEkWFuZyB24bq9LlxuICAgKlxuICAgKiBAcmV0dXJucyBgdW5kZWZpbmVkYCBraGkgbeG6t3QgcGjhurNuZyBjaMawYSBgaW5pdCgpYC5cbiAgICovXG4gIGV4cG9ydExheW91dCgpOiBUX2dyaWRMYXlvdXRfbm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdE5vZGUoKTtcblxuICAgIHJldHVybiByb290ID8gdGhpcy5kZWVwQ2xvbmVUcmVlKHJvb3QpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFTDrG0gbeG7mXQga2jhu5FpIHRoZW8gaWQuICovXG4gIGZpbmRCbG9jayhpZDogc3RyaW5nKTogVF9ncmlkTGF5b3V0X25vZGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3ROb2RlKCk7XG5cbiAgICByZXR1cm4gcm9vdCA/IHRoaXMudHJlZVNlcnZpY2UuZmluZEJ5SWQocm9vdCwgaWQpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFTDrG0ga2jhu5FpIGNoYSB0cuG7sWMgdGnhur9wIGPhu6dhIG3hu5l0IGto4buRaS4gKi9cbiAgZmluZFBhcmVudEJsb2NrKGlkOiBzdHJpbmcpOiBUX2dyaWRMYXlvdXRfbm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdE5vZGUoKTtcblxuICAgIHJldHVybiByb290ID8gdGhpcy50cmVlU2VydmljZS5maW5kUGFyZW50KHJvb3QsIGlkKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDEkOG6t3QgdOG7tyBs4buHIHRodSBwaMOzbmcgY+G7p2EgY2FudmFzIChr4bq5cCBnaeG7r2EgbWluIHbDoCBtYXgpLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVOG7tyBs4buHICgwLjQgPSA0MCUsIDEuMCA9IDEwMCUsIDEuNSA9IDE1MCUpXG4gICAqIEBwYXJhbSBwZXJzaXN0S2V5IEtow7NhIGxvY2FsU3RvcmFnZSDEkeG7gyBsxrB1IGzhuqFpIChi4buPIHRy4buRbmcgdGjDrCBs4bqleSB04burIGNvbmZpZylcbiAgICovXG4gIHNldFpvb20odmFsdWU6IG51bWJlciwgcGVyc2lzdEtleT86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG1pbiA9IHRoaXMuY29uZmlnPy56b29tTWluID8/IDAuNDtcbiAgICBjb25zdCBtYXggPSB0aGlzLmNvbmZpZz8uem9vbU1heCA/PyAxLjU7XG4gICAgY29uc3QgY2xhbXBlZCA9IE1hdGgubWluKG1heCwgTWF0aC5tYXgobWluLCBNYXRoLnJvdW5kKHZhbHVlICogMTAwKSAvIDEwMCkpO1xuICAgIHRoaXMuem9vbUxldmVsLnNldChjbGFtcGVkKTtcblxuICAgIGNvbnN0IHN0b3JhZ2VLZXkgPSBwZXJzaXN0S2V5ID8/IHRoaXMuY29uZmlnPy5zdG9yYWdlS2V5O1xuICAgIGlmIChzdG9yYWdlS2V5ICYmIHR5cGVvZiBsb2NhbFN0b3JhZ2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShzdG9yYWdlS2V5LCBTdHJpbmcoY2xhbXBlZCkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGlnbm9yZSBsb2NhbFN0b3JhZ2UgYWNjZXNzIGVycm9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy52ZXJzaW9uLnVwZGF0ZSgodikgPT4gdiArIDEpO1xuICB9XG5cbiAgLyoqIFBow7NuZyB0byB0aMOqbSBt4buZdCBixrDhu5tjICht4bq3YyDEkeG7i25oIDAuMDUgdOG7qWMgNSUpICovXG4gIHpvb21JbihzdGVwPzogbnVtYmVyLCBwZXJzaXN0S2V5Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcyA9IHN0ZXAgPz8gdGhpcy5jb25maWc/Lnpvb21TdGVwID8/IDAuMDU7XG4gICAgdGhpcy5zZXRab29tKHRoaXMuem9vbUxldmVsKCkgKyBzLCBwZXJzaXN0S2V5KTtcbiAgfVxuXG4gIC8qKiBUaHUgbmjhu48gYuG7m3QgbeG7mXQgYsaw4bubYyAobeG6t2MgxJHhu4tuaCAwLjA1IHThu6ljIDUlKSAqL1xuICB6b29tT3V0KHN0ZXA/OiBudW1iZXIsIHBlcnNpc3RLZXk/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzID0gc3RlcCA/PyB0aGlzLmNvbmZpZz8uem9vbVN0ZXAgPz8gMC4wNTtcbiAgICB0aGlzLnNldFpvb20odGhpcy56b29tTGV2ZWwoKSAtIHMsIHBlcnNpc3RLZXkpO1xuICB9XG5cbiAgLyoqIMSQ4bq3dCBs4bqhaSB04bu3IGzhu4cgdGh1IHBow7NuZyBn4buRYyAxMDAlICgxLjApICovXG4gIHJlc2V0Wm9vbShwZXJzaXN0S2V5Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZXRab29tKDEuMCwgcGVyc2lzdEtleSk7XG4gIH1cblxuICAvKipcbiAgICogVOG7sSDEkeG7mW5nIHTDrW5oIHRvw6FuIHbDoCDEkeG6t3QgdOG7tyBs4buHIHRodSBwaMOzbmcgxJHhu4MgY2FudmFzIHbhu6thIHbhurduIHbhu5tpIGNoaeG7gXUgcuG7mW5nIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lcldpZHRoIENoaeG7gXUgcuG7mW5nIGNvbnRhaW5lciDEkW8gxJHGsOG7o2MgKHB4KVxuICAgKiBAcGFyYW0gc3RhZ2VXaWR0aCBDaGnhu4F1IHLhu5luZyBjaHXhuqluIGPhu6dhIGNhbnZhcyAobeG6t2MgxJHhu4tuaCAxNjY4cHgpXG4gICAqIEBwYXJhbSBwYWRkaW5nIEtob+G6o25nIGPDoWNoIGzhu4EgaGFpIGLDqm4gKG3hurdjIMSR4buLbmggNDhweClcbiAgICogQHBhcmFtIHBlcnNpc3RLZXkgS2jDs2EgbG9jYWxTdG9yYWdlXG4gICAqIEByZXR1cm5zIFThu7cgbOG7hyB0aHUgcGjDs25nIHbhu6thIHTDrW5oXG4gICAqL1xuICBmaXRUb1NjcmVlbihjb250YWluZXJXaWR0aDogbnVtYmVyLCBzdGFnZVdpZHRoPzogbnVtYmVyLCBwYWRkaW5nID0gNDgsIHBlcnNpc3RLZXk/OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IHRhcmdldFdpZHRoID0gc3RhZ2VXaWR0aCA/PyB0aGlzLmNvbmZpZz8uc3RhZ2VXaWR0aCA/PyAxNjY4O1xuICAgIGNvbnN0IG1pbiA9IHRoaXMuY29uZmlnPy56b29tTWluID8/IDAuNDtcbiAgICBjb25zdCBtYXggPSAxLjI1O1xuICAgIGNvbnN0IHJhdGlvID0gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIE1hdGgucm91bmQoKChjb250YWluZXJXaWR0aCAtIHBhZGRpbmcpIC8gdGFyZ2V0V2lkdGgpICogMTAwKSAvIDEwMCkpO1xuICAgIHRoaXMuc2V0Wm9vbShyYXRpbywgcGVyc2lzdEtleSk7XG4gICAgcmV0dXJuIHJhdGlvO1xuICB9XG5cbiAgLyoqIEtp4buDbSB0cmEgdMOtbmggbsSDbmcgdGh1IHBow7NuZyBjw7MgxJHGsOG7o2MgY+G6pXUgaMOsbmggYuG6rXQga2jDtG5nICovXG4gIGlzWm9vbUNvbmZpZ3VyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5jb25maWc/LmVuYWJsZVpvb20pO1xuICB9XG5cbiAgLyoqXG4gICAqIEPhu5VuZyBEVVkgTkjhuqRUIGNobyBjYW52YXMgY+G7p2EgdGjGsCB2aeG7h24uIE7GoWkgZMO5bmcgS0jDlE5HIGfhu41pIHThu5tpIMSRw6J5LlxuICAgKlxuICAgKiBN4buNaSB0aOG7qSBjYW52YXMgY+G6p24gxJHhu4F1IGzDoCBgcHJpdmF0ZWAgxJHhu4Mga2jDtG5nIGzhu410IHJhIEFQSSBjw7RuZyBraGFpOyBnb20gdsOgbyBt4buZdCBnZXR0ZXIgdGhlbyDEkcO6bmdcbiAgICoga2h1w7RuIGBGdW5jdGlvbnNDb250cm9sYCBj4bunYSBi4buZIHF1eSDGsOG7m2MsIHRoYXkgdsOsIMSR4buDIHLhuqNpIHLDoWMgaMOgbSBwdWJsaWMgbcOgIG5nxrDhu51pIG5nb8OgaSB0xrDhu59uZ1xuICAgKiBtw6xuaCBwaOG6o2kgZ+G7jWkgKG5nxrDhu51pIGTDuW5nIGNo4buRdCAyOC8wOC8yMDI2KS5cbiAgICovXG4gIGdldCBGdW5jdGlvbnNDb250cm9sKCkge1xuICAgIHJldHVybiB7XG4gICAgICBtYXhDb250YWluZXJEZXB0aDogKCkgPT4gdGhpcy5tYXhDb250YWluZXJEZXB0aCgpLFxuICAgICAgY29udGFpbmVyUGFkZGluZzogKCkgPT4gdGhpcy5jb250YWluZXJQYWRkaW5nKCksXG4gICAgICBpc1pvb21FbmFibGVkOiAoKSA9PiB0aGlzLmlzWm9vbUNvbmZpZ3VyZWQoKSxcbiAgICAgIHpvb206ICgpID0+IHRoaXMuem9vbUxldmVsKCksXG4gICAgICBzZXRab29tOiAodjogbnVtYmVyLCBrZXk/OiBzdHJpbmcpID0+IHRoaXMuc2V0Wm9vbSh2LCBrZXkpLFxuICAgICAgem9vbUluOiAoc3RlcD86IG51bWJlciwga2V5Pzogc3RyaW5nKSA9PiB0aGlzLnpvb21JbihzdGVwLCBrZXkpLFxuICAgICAgem9vbU91dDogKHN0ZXA/OiBudW1iZXIsIGtleT86IHN0cmluZykgPT4gdGhpcy56b29tT3V0KHN0ZXAsIGtleSksXG4gICAgICByZXNldFpvb206IChrZXk/OiBzdHJpbmcpID0+IHRoaXMucmVzZXRab29tKGtleSksXG4gICAgICBmaXRUb1NjcmVlbjogKGNXOiBudW1iZXIsIHNXPzogbnVtYmVyLCBwYWQ/OiBudW1iZXIsIGtleT86IHN0cmluZykgPT4gdGhpcy5maXRUb1NjcmVlbihjVywgc1csIHBhZCwga2V5KSxcbiAgICAgIGdyaWRzdGVyT3B0aW9uczogKGRlcHRoOiBudW1iZXIsIGNiPzogKCkgPT4gdm9pZCkgPT4gdGhpcy5idWlsZEdyaWRzdGVyT3B0aW9ucyhkZXB0aCwgY2IpLFxuICAgICAgYXR0YWNoTm9kZTogKG5vZGU6IFRfZ3JpZExheW91dF9ub2RlLCBkZXB0aDogbnVtYmVyLCBob3N0OiBWaWV3Q29udGFpbmVyUmVmKSA9PiB0aGlzLmF0dGFjaE5vZGUobm9kZSwgZGVwdGgsIGhvc3QpLFxuICAgICAgZGV0YWNoTm9kZTogKG5vZGVJZDogc3RyaW5nKSA9PiB0aGlzLmRldGFjaE5vZGUobm9kZUlkKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUlucHV0cyhyZWY6IENvbXBvbmVudFJlZjx1bmtub3duPiwgbm9kZTogVF9ncmlkTGF5b3V0X25vZGUsIGRlcHRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICByZWYuc2V0SW5wdXQoJ2RhdGEnLCBub2RlLmRhdGEpO1xuICAgIHJlZi5zZXRJbnB1dCgnbm9kZScsIG5vZGUpO1xuICAgIHJlZi5zZXRJbnB1dCgnaXNFZGl0TW9kZScsIHRoaXMuZWRpdE1vZGUoKSk7XG4gICAgcmVmLnNldElucHV0KCdkZXB0aCcsIGRlcHRoKTtcbiAgfVxufVxuIl19
|