slick-components 4.4.9 → 4.4.13

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.
@@ -25,6 +25,7 @@ export class SlickGridComponent {
25
25
  this.bordered = true;
26
26
  this.striped = true;
27
27
  this.hover = true;
28
+ this.showingAllRecords = false;
28
29
  this.onRowSelected = new EventEmitter();
29
30
  this.onRowDoubleClick = new EventEmitter();
30
31
  this.onRowContextMenu = new EventEmitter();
@@ -53,6 +54,7 @@ export class SlickGridComponent {
53
54
  if (this.slickGridHeight !== this.slickGridRef.nativeElement.offsetHeight) {
54
55
  clearTimeout(this.resizeTimeout);
55
56
  this.resizeTimeout = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
57
+ this.currentPage = 1;
56
58
  this.requestModel.page = 1;
57
59
  yield this.resizeGrid();
58
60
  this.requestModel.recordsPerPage = this.recordsPerPage;
@@ -63,79 +65,7 @@ export class SlickGridComponent {
63
65
  }
64
66
  ngOnInit() {
65
67
  return __awaiter(this, void 0, void 0, function* () {
66
- if (this.gridOptions.gridKey) {
67
- if (this.gridOptions.favorites) {
68
- const favoriteNames = this.gridOptions.favorites.map(f => f.favoriteName);
69
- localStorage.setItem(`GRID_${this.gridOptions.gridKey}_FAVORITES`, JSON.stringify(favoriteNames));
70
- this.gridOptions.favorites.forEach(favorite => {
71
- // Make sure we haven't added a new column that needs to be saved
72
- this.gridOptions.columns.forEach(c => {
73
- const columnExists = favorite.columns.findIndex(x => x.dataFieldName === c.dataFieldName);
74
- if (columnExists < 0)
75
- favorite.columns.push(c);
76
- });
77
- let gridColumnsJSON = JSON.stringify(favorite.columns);
78
- if (this.gridOptions.gridKey) {
79
- const suffix = favorite.favoriteName === 'Default' ? '' : ('_' + favorite.favoriteName);
80
- localStorage.setItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`, gridColumnsJSON);
81
- }
82
- });
83
- if (favoriteNames.indexOf(this.selectedFavorite) < 0)
84
- this.selectedFavorite = "Default";
85
- }
86
- this.selectedFavorite = localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_SELECTED_FAVORITE") || 'Default';
87
- // Check to make sure we don't have any duplicate column names
88
- this.gridOptions.columns.forEach(c1 => {
89
- const dataFieldCount = (this.gridOptions.columns.filter(x => x.dataFieldName === c1.dataFieldName) || []).length;
90
- if (dataFieldCount > 1)
91
- console.error(`Grid ${this.gridOptions.gridKey} column ${c1.dataFieldName} is defined ${dataFieldCount} times`);
92
- });
93
- const suffix = this.selectedFavorite === 'Default' ? '' : ('_' + this.selectedFavorite);
94
- let gridColumnsJson = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`);
95
- if (gridColumnsJson) {
96
- let columns = JSON.parse(gridColumnsJson);
97
- let displayOrder = 0;
98
- columns.forEach(c => {
99
- let column = this.gridOptions.columns.find(gridColumn => gridColumn.dataFieldName === c.dataFieldName);
100
- if (column) {
101
- column.visible = c.visible;
102
- column.displayOrder = displayOrder;
103
- column.width = c.width;
104
- column.flexible = c.flexible;
105
- column.sortDirection = c.sortDirection;
106
- column.isLocked = c.isLocked;
107
- //column.filterType = c.filterType;
108
- if (column.isLocked && column.filterType !== SlickGridColumnFilterTypes.none) {
109
- column.isFiltering = true;
110
- if (column.filterType === SlickGridColumnFilterTypes.text)
111
- column.filterText = c.filterText;
112
- else if (column.filterType === SlickGridColumnFilterTypes.dropdown)
113
- column.filterDropdownValue = c.filterDropdownValue;
114
- if (!column.filterText && !column.filterDropdownValue) {
115
- column.isFiltering = false;
116
- column.isLocked = false;
117
- column.filterText = null;
118
- column.filterDropdownValue = null;
119
- }
120
- }
121
- }
122
- displayOrder++;
123
- });
124
- }
125
- this.recordsPerPageValue = localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_RECORDS_PER_PAGE") || "Auto";
126
- const favoritesJson = localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_FAVORITES") || `["Default"]`;
127
- this.favorites = JSON.parse(favoritesJson).map(favorite => {
128
- return new DropDownModel(favorite);
129
- });
130
- }
131
- this.visibleColumns = this.gridOptions.columns.filter(c => c.visible === true);
132
- this.visibleColumns = this.visibleColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
133
- this.showSearchRow = this.visibleColumns.filter(c => c.filterType !== SlickGridColumnFilterTypes.none).length > 0;
134
- let sortColumn = this.visibleColumns.find(c => c.sortable === true && c.sortDirection > 0);
135
- if (this.visibleColumns.length > 0 && sortColumn) {
136
- this.requestModel.sortColumn = sortColumn.dataFieldName;
137
- this.requestModel.sortDirection = sortColumn.sortDirection;
138
- }
68
+ this.setGridOptions(this.gridOptions);
139
69
  });
140
70
  }
141
71
  ngAfterViewInit() {
@@ -211,6 +141,7 @@ export class SlickGridComponent {
211
141
  this.striped = this.gridOptions.striped;
212
142
  if (this.gridOptions.hover !== null)
213
143
  this.hover = this.gridOptions.hover;
144
+ this.setGridOptions(this.gridOptions);
214
145
  }
215
146
  if (changes.data) {
216
147
  // If we don't do this lock, the first change will have null data and crash. The second request will have the actual data
@@ -318,6 +249,7 @@ export class SlickGridComponent {
318
249
  }
319
250
  onPageChange(pageNumber, selectRow = true) {
320
251
  return __awaiter(this, void 0, void 0, function* () {
252
+ this.currentPage = pageNumber;
321
253
  this.requestModel.page = pageNumber;
322
254
  yield this.reload(this.requestModel);
323
255
  this.selectedIndex = (this.gridOptions.autoSelectFirstRow === true) ? 0 : null;
@@ -354,6 +286,8 @@ export class SlickGridComponent {
354
286
  yield this.resizeGrid();
355
287
  yield this.functionLockService.lock("GRID_" + this.uuid + "_RELOADGRIDWITHREQUESTMODEL");
356
288
  this.requestModel = requestModel;
289
+ this.currentPage = 1;
290
+ this.requestModel.page = 1;
357
291
  let responseModel = yield this.reload(this.requestModel);
358
292
  this.functionLockService.release("GRID_" + this.uuid + "_RELOADGRIDWITHREQUESTMODEL");
359
293
  return Promise.resolve(responseModel);
@@ -368,35 +302,7 @@ export class SlickGridComponent {
368
302
  return __awaiter(this, void 0, void 0, function* () {
369
303
  try {
370
304
  yield this.functionLockService.lock("GRID_" + this.uuid + "_RELOAD");
371
- requestModel.columnSearchValues = [];
372
- this.gridOptions.columns.forEach(c => {
373
- if (c.visible) {
374
- if (c.filterType === SlickGridColumnFilterTypes.text && c.filterText) {
375
- c.filterText = c.filterText;
376
- requestModel.columnSearchValues.push({
377
- columnName: c.dataFieldName,
378
- searchValueId: null,
379
- searchValueText: c.filterText
380
- });
381
- }
382
- else if (c.filterType === SlickGridColumnFilterTypes.dropdown && c.filterDropdownValue) {
383
- c.filterDropdownValue = c.filterDropdownValue;
384
- requestModel.columnSearchValues.push({
385
- columnName: c.dataFieldName,
386
- searchValueId: c.filterDropdownValue,
387
- searchValueText: null
388
- });
389
- }
390
- }
391
- });
392
- requestModel.sortColumn = null;
393
- const sortColumn = this.gridOptions.columns.find(x => x.sortDirection === SlickGridColumnSortDirection.asc || x.sortDirection === SlickGridColumnSortDirection.desc);
394
- if (sortColumn) {
395
- requestModel.sortColumn = (sortColumn.sortDirection === 0) ? null : sortColumn.dataFieldName;
396
- requestModel.sortDirection = sortColumn.sortDirection;
397
- }
398
- if (requestModel.recordsPerPage <= 0)
399
- requestModel.recordsPerPage = 20;
305
+ requestModel = this.getRequestModel(this.requestModel);
400
306
  let responseModel = null;
401
307
  if (requestModel.url)
402
308
  responseModel = yield this.gridService.getDataFromServer(requestModel);
@@ -446,6 +352,7 @@ export class SlickGridComponent {
446
352
  }
447
353
  }
448
354
  this.saveColumnsToLocalStorage();
355
+ this.currentPage = 1;
449
356
  this.requestModel.page = 1;
450
357
  yield this.reload(this.requestModel);
451
358
  if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
@@ -471,6 +378,7 @@ export class SlickGridComponent {
471
378
  else {
472
379
  column.isLocked = false;
473
380
  }
381
+ this.currentPage = 1;
474
382
  this.requestModel.page = 1;
475
383
  yield this.reload(this.requestModel);
476
384
  if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
@@ -500,6 +408,7 @@ export class SlickGridComponent {
500
408
  searchValueText: column.filterText
501
409
  });
502
410
  }
411
+ this.currentPage = 1;
503
412
  this.requestModel.page = 1;
504
413
  yield this.reload(this.requestModel);
505
414
  if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
@@ -520,6 +429,7 @@ export class SlickGridComponent {
520
429
  column.filterDropdownValue = null;
521
430
  this.requestModel.columnSearchValues = this.requestModel.columnSearchValues.filter(x => x.columnName !== column.dataFieldName);
522
431
  this.saveColumnsToLocalStorage();
432
+ this.currentPage = 1;
523
433
  this.requestModel.page = 1;
524
434
  yield this.reload(this.requestModel);
525
435
  if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
@@ -649,6 +559,8 @@ export class SlickGridComponent {
649
559
  let column = this.gridOptions.columns.find(gridColumn => gridColumn.dataFieldName === c.dataFieldName);
650
560
  if (column) {
651
561
  c.displayOrder = displayOrder;
562
+ c.titleOrientation = column.titleOrientation;
563
+ c.titleHeight = column.titleHeight;
652
564
  c.width = column.width;
653
565
  c.filterDropdownValue = column.filterDropdownValue;
654
566
  c.filterText = column.filterText;
@@ -717,11 +629,133 @@ export class SlickGridComponent {
717
629
  }));
718
630
  });
719
631
  }
632
+ addColumn(column, idx = null) {
633
+ if (idx === null)
634
+ this.gridOptions.columns.push(column);
635
+ else
636
+ this.gridOptions.columns.splice(idx, 0, column);
637
+ this.setGridOptions(this.gridOptions);
638
+ }
639
+ getRequestModel(requestModel = null) {
640
+ if (!requestModel)
641
+ requestModel = this.requestModel;
642
+ requestModel.columnSearchValues = [];
643
+ this.gridOptions.columns.forEach(c => {
644
+ if (c.visible) {
645
+ if (c.filterType === SlickGridColumnFilterTypes.text && c.filterText) {
646
+ c.filterText = c.filterText;
647
+ requestModel.columnSearchValues.push({
648
+ columnName: c.dataFieldName,
649
+ searchValueId: null,
650
+ searchValueText: c.filterText
651
+ });
652
+ }
653
+ else if (c.filterType === SlickGridColumnFilterTypes.dropdown && c.filterDropdownValue) {
654
+ c.filterDropdownValue = c.filterDropdownValue;
655
+ requestModel.columnSearchValues.push({
656
+ columnName: c.dataFieldName,
657
+ searchValueId: c.filterDropdownValue,
658
+ searchValueText: null
659
+ });
660
+ }
661
+ }
662
+ });
663
+ requestModel.sortColumn = null;
664
+ const sortColumn = this.gridOptions.columns.find(x => x.sortDirection === SlickGridColumnSortDirection.asc || x.sortDirection === SlickGridColumnSortDirection.desc);
665
+ if (sortColumn) {
666
+ requestModel.sortColumn = (sortColumn.sortDirection === 0) ? null : sortColumn.dataFieldName;
667
+ requestModel.sortDirection = sortColumn.sortDirection;
668
+ }
669
+ if (requestModel.recordsPerPage <= 0)
670
+ requestModel.recordsPerPage = 20;
671
+ return this.requestModel;
672
+ }
673
+ setGridOptions(gridOptions) {
674
+ this.gridOptions = gridOptions;
675
+ if (this.gridOptions.gridKey) {
676
+ if (this.gridOptions.favorites) {
677
+ const favoriteNames = this.gridOptions.favorites.map(f => f.favoriteName);
678
+ localStorage.setItem(`GRID_${this.gridOptions.gridKey}_FAVORITES`, JSON.stringify(favoriteNames));
679
+ this.gridOptions.favorites.forEach(favorite => {
680
+ // Make sure we haven't added a new column that needs to be saved
681
+ this.gridOptions.columns.forEach(c => {
682
+ const columnExists = favorite.columns.findIndex(x => x.dataFieldName === c.dataFieldName);
683
+ if (columnExists < 0)
684
+ favorite.columns.push(c);
685
+ });
686
+ let gridColumnsJSON = JSON.stringify(favorite.columns);
687
+ if (this.gridOptions.gridKey) {
688
+ const suffix = favorite.favoriteName === 'Default' ? '' : ('_' + favorite.favoriteName);
689
+ localStorage.setItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`, gridColumnsJSON);
690
+ }
691
+ });
692
+ if (favoriteNames.indexOf(this.selectedFavorite) < 0)
693
+ this.selectedFavorite = "Default";
694
+ }
695
+ this.selectedFavorite = localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_SELECTED_FAVORITE") || 'Default';
696
+ // Check to make sure we don't have any duplicate column names
697
+ this.gridOptions.columns.forEach(c1 => {
698
+ const dataFieldCount = (this.gridOptions.columns.filter(x => x.dataFieldName === c1.dataFieldName) || []).length;
699
+ if (dataFieldCount > 1)
700
+ console.error(`Grid ${this.gridOptions.gridKey} column ${c1.dataFieldName} is defined ${dataFieldCount} times`);
701
+ });
702
+ const suffix = this.selectedFavorite === 'Default' ? '' : ('_' + this.selectedFavorite);
703
+ let gridColumnsJson = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`);
704
+ if (gridColumnsJson) {
705
+ let columns = JSON.parse(gridColumnsJson);
706
+ let displayOrder = 0;
707
+ columns.forEach(c => {
708
+ let column = this.gridOptions.columns.find(gridColumn => gridColumn.dataFieldName === c.dataFieldName);
709
+ if (column) {
710
+ column.visible = c.visible;
711
+ column.displayOrder = displayOrder;
712
+ column.titleOrientation = c.titleOrientation;
713
+ column.titleHeight = c.titleHeight;
714
+ column.width = c.width;
715
+ column.flexible = c.flexible;
716
+ column.sortDirection = c.sortDirection;
717
+ column.isLocked = c.isLocked;
718
+ //column.filterType = c.filterType;
719
+ if (column.isLocked && column.filterType !== SlickGridColumnFilterTypes.none) {
720
+ column.isFiltering = true;
721
+ if (column.filterType === SlickGridColumnFilterTypes.text)
722
+ column.filterText = c.filterText;
723
+ else if (column.filterType === SlickGridColumnFilterTypes.dropdown)
724
+ column.filterDropdownValue = c.filterDropdownValue;
725
+ if (!column.filterText && !column.filterDropdownValue) {
726
+ column.isFiltering = false;
727
+ column.isLocked = false;
728
+ column.filterText = null;
729
+ column.filterDropdownValue = null;
730
+ }
731
+ }
732
+ }
733
+ displayOrder++;
734
+ });
735
+ }
736
+ if (this.gridOptions.defaultRecordsPerPage && !localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_RECORDS_PER_PAGE"))
737
+ this.recordsPerPageValue = this.gridOptions.defaultRecordsPerPage.toString();
738
+ else
739
+ this.recordsPerPageValue = localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_RECORDS_PER_PAGE") || "Auto";
740
+ const favoritesJson = localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_FAVORITES") || `["Default"]`;
741
+ this.favorites = JSON.parse(favoritesJson).map(favorite => {
742
+ return new DropDownModel(favorite);
743
+ });
744
+ }
745
+ this.visibleColumns = this.gridOptions.columns.filter(c => c.visible === true);
746
+ this.visibleColumns = this.visibleColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
747
+ this.showSearchRow = this.visibleColumns.filter(c => c.filterType !== SlickGridColumnFilterTypes.none).length > 0;
748
+ let sortColumn = this.visibleColumns.find(c => c.sortable === true && c.sortDirection > 0);
749
+ if (this.visibleColumns.length > 0 && sortColumn) {
750
+ this.requestModel.sortColumn = sortColumn.dataFieldName;
751
+ this.requestModel.sortDirection = sortColumn.sortDirection;
752
+ }
753
+ }
720
754
  }
721
755
  SlickGridComponent.decorators = [
722
756
  { type: Component, args: [{
723
757
  selector: 'slick-grid',
724
- template: "<div id=\"slick-grid_{{uuid}}\" class=\"slick-grid d-flex flex-column flex-fill\" style=\"position: absolute; left: 0; top: 0; right: 0; bottom: 0;\" #slickGrid>\r\n\t<div #tableContainer class=\"d-flex flex-fill\" style=\"overflow: auto\">\r\n\r\n\t\t<div>\r\n\t\t\t<table #tableRef class=\"table table-sm\" [class.table-bordered]=\"bordered\" [class.table-borderless]=\"!bordered\" [class.table-striped]=\"striped\" [class.table-hover]=\"hover\" [style.opacity]=\"gridOpacity\" style=\"margin: 0; padding: 0;\" (keydown)=\"tableKeydown($event)\" tabindex=\"0\">\r\n\t\t\t\t<thead>\r\n\t\t\t\t\t<tr #tableHeaderRow (mousemove)=\"onColResizeMousemove($event)\" [ngClass]=\"{ 'resizing': isResizing === true }\">\r\n\t\t\t\t\t\t<td *ngFor=\"let column of visibleColumns; let idx = index\" [style.width]=\"column.width\" [style.maxWidth]=\"column.width\">\r\n\t\t\t\t\t\t\t<div *ngIf=\"idx > 0 && idx < visibleColumns.length\" class=\"resize_column_left\" [class.table-bordered]=\"bordered\" (mousedown)=\"onColResizeMousedown($event, idx - 1)\" (dblclick)=\"onColResizeDoubleclick($event, idx - 1)\"></div>\r\n\t\t\t\t\t\t\t<span class=\"sortIcon\" *ngIf=\"column.sortable === true && column.sortDirection > 0\"><i class=\"far\" [ngClass]=\"{'fa-caret-up': column.sortDirection === 1, 'fa-caret-down': column.sortDirection === 2}\"></i>&nbsp;</span>\r\n\t\t\t\t\t\t\t<a href=\"javascript:void(0)\" *ngIf=\"column.sortable === true\" (click)=\"sortBy(column)\" draggable=\"false\">{{column.title}}</a>\r\n\t\t\t\t\t\t\t<div *ngIf=\"column.sortable === false\">{{column.title}}</div>\r\n\t\t\t\t\t\t\t<div class=\"resize_column_right\" (mousedown)=\"onColResizeMousedown($event, idx)\" (dblclick)=\"onColResizeDoubleclick($event, idx)\"></div>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t\t<tr #tableHeaderSearchRow *ngIf=\"showSearchRow === true\">\r\n\t\t\t\t\t\t<td *ngFor=\"let column of visibleColumns\">\r\n\t\t\t\t\t\t\t<div class=\"slick-grid_search-column\">\r\n\t\t\t\t\t\t\t\t<i *ngIf=\"column.isFiltering\" class=\"fas fa-times-circle bg-white text-danger mr-1\" (click)=\"resetFilter(column)\"></i>\r\n\t\t\t\t\t\t\t\t<i *ngIf=\"column.isFiltering && column.isLocked\" class=\"far fa-lock mr-1\" (click)=\"toggleLock(column)\"></i>\r\n\t\t\t\t\t\t\t\t<i *ngIf=\"column.isFiltering && !column.isLocked\" class=\"far fa-lock-open mr-1\" (click)=\"toggleLock(column)\"></i>\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"column.filterType === 1\" class=\"slick-grid_text-search\">\r\n\t\t\t\t\t\t\t\t\t<input autocomplete=\"nope\" type=\"text\" class=\"form-control\" [(ngModel)]=\"column.filterText\" name=\"searchText\" placeholder=\"Search...\" (keydown)=\"onSearch(column)\" />\r\n\t\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"column.filterType === 2\" class=\"input-group slick-grid_drop-down-search\">\r\n\t\t\t\t\t\t\t\t\t<slick-drop-down [items]=\"column.filterDropdownValues\" [(ngModel)]=\"column.filterDropdownValue\" listWidth=\"auto\" placeholder=\"Search...\" (onSelect)=\"onSearchSelect($event, column)\"></slick-drop-down>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t</thead>\r\n\r\n\t\t\t\t<tbody>\r\n\t\t\t\t\t<tr *ngIf=\"loaded && visibleData.length === 0\"><td [colSpan]=\"visibleColumns.length\">No Data</td></tr>\r\n\t\t\t\t\t<tr *ngFor=\"let rowData of visibleData; let idx = index\" #tableBodyRows (click)=\"onRowClicked(rowData, idx)\" (dblclick)=\"onRowDoubleClicked(rowData, idx)\" (contextmenu)=\"onRowContextMenuClicked($event, rowData, idx)\" [class.table-success]=\"selectedIndex === idx\">\r\n\t\t\t\t\t\t<td *ngFor=\"let column of visibleColumns\">\r\n\t\t\t\t\t\t\t<div *ngIf=\"!column.columnKey\" class=\"slick-grid_column-content\" [style.width]=\"column.width\" [style.maxWidth]=\"column.width\" [innerHTML]=\"getColumnHTML(rowData, column.dataFieldName) | slickGridSanitizeHtml\"></div>\r\n\t\t\t\t\t\t\t<div *ngIf=\"column.columnKey\" class=\"slick-grid_column-content\" [style.width]=\"column.width\" [style.maxWidth]=\"column.width\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"templateRefs[column.columnKey], context: { $implicit: rowData }\">\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t</tbody>\r\n\t\t\t</table>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\r\n\t<div class=\"slick-grid-footer mt-2 d-flex\">\r\n\t\t<div>\r\n\t\t\t<button type=\"button\" (click)=\"openColumnSelectDialog()\" class=\"btn btn-outline-primary\"><i class=\"far fa-columns\"></i></button>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"favorites?.length > 1\">\r\n\t\t\t<button #favoriteSelectRef type=\"button\" class=\"btn btn-outline-primary ml-1\"><i class=\"far fa-star\"></i> {{this.selectedFavorite}}</button>\r\n\t\t\t<slick-popover [element]=\"favoriteSelectRef\" position=\"top\" showArrow=\"false\" [topOffsetPx]=\"0\" [leftOffsetPx]=\"0\" [showByClick]=\"true\">\r\n\t\t\t\t<table class=\"table-borderless table-sm table-hover\" style=\"min-width: 250px; cursor: default\">\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t<tr *ngFor=\"let favorite of favorites\" (click)=\"setFavorite(favorite.text)\">\r\n\t\t\t\t\t\t\t<td><i *ngIf=\"favorite.text === selectedFavorite\" class=\"far fa-star mr-1\"></i>{{favorite.text}}</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t</table>\r\n\t\t\t</slick-popover>\r\n\t\t</div>\r\n\t\t<div>\r\n\t\t\t<slick-paging [(pageNumber)]=\"currentPage\" [totalRecords]=\"totalRecords\" [recordsPerPage]=\"recordsPerPage\" (onPageChange)=\"onPageChange($event)\"></slick-paging>\r\n\t\t</div>\r\n\t\t<div class=\"ml-1\">\r\n\t\t\t<button #recordsPerPageRef type=\"button\" class=\"btn btn-outline-primary\">{{recordsPerPageValue}}&nbsp;&nbsp;<i style=\"font-size: 12px\" class=\"far fa-chevron-down\"></i></button>\r\n\r\n\t\t\t<slick-popover [element]=\"recordsPerPageRef\" position=\"top\" showArrow=\"false\" [topOffsetPx]=\"0\" [leftOffsetPx]=\"0\" [showByClick]=\"true\">\r\n\t\t\t\t<table class=\"table-borderless table-sm table-hover\" style=\"min-width: 150px;\">\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('Auto')\"><td>Auto</td></tr>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('25')\"><td>25</td></tr>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('50')\"><td>50</td></tr>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('100')\"><td>100</td></tr>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t</table>\r\n\t\t\t</slick-popover>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<slick-dialog #columnSelectDialogRef header=\"Select Columns\">\r\n\t<div style=\"text-align: center; width: 475px;\" class=\"mx-5\">\r\n\t\t<div class=\"d-flex\">\r\n\t\t\t<div class=\"flex-fill\">\r\n\t\t\t\t<slick-drop-down [items]=\"favorites\"\r\n\t\t\t\t\t\t\t\t [ngModel]=\"selectedFavorite\"\r\n\t\t\t\t\t\t\t\t (onSelect)=\"loadFavorite($event)\"></slick-drop-down>\r\n\t\t\t</div>\r\n\t\t\t<div><button class=\"btn btn-outline-primary ml-1\" (click)=\"addNewFavorite()\"><i class=\"far fa-plus\"></i></button></div>\r\n\t\t</div>\r\n\t\t<div class=\"d-flex flex-column mt-1\" slick-drop-list (onSlickDropListReorder)=\"onColumnReorder($event)\">\r\n\t\t\t<div *ngFor=\"let column of columnSelectDialogColumns\" class=\"d-flex\" slick-drop-list-item>\r\n\t\t\t\t<div style=\"width: 20px\"><input type=\"checkbox\" style=\"position: relative; top: 2px;\" [(ngModel)]=\"column.visible\" /></div>\r\n\t\t\t\t<div class=\"py-0 flex-fill\" style=\"text-align: left; cursor: ns-resize\" slick-drop-list-grab>{{column.title}}</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\t<slick-dialog-footer>\r\n\t\t<div style=\"margin-top: 10px;\" class=\"col-12 text-center mb-2 mt-1\">\r\n\t\t\t<button type=\"button\" (click)=\"onSaveColumns()\" class=\"btn btn-outline-primary mr-1\"><i class=\"far fa-save\"></i>&nbsp;Save</button>&nbsp;\r\n\t\t\t<button type=\"button\" class=\"btn btn-outline-danger\" (click)=\"onCancelColumns()\">Cancel</button>\r\n\t\t</div>\r\n\t</slick-dialog-footer>\r\n</slick-dialog>\r\n\r\n\r\n<slick-confirm-dialog #addNewFavoriteDialogRef width=\"300\">\r\n\t<label>Enter new favorite name</label>\r\n\t<input type=\"text\" class=\"form-control mx-3\" style=\"width: 250px\" [(ngModel)]=\"newFavoriteText\" />\r\n</slick-confirm-dialog>",
758
+ template: "<div id=\"slick-grid_{{uuid}}\" class=\"slick-grid d-flex flex-column flex-fill\" style=\"position: absolute; left: 0; top: 0; right: 0; bottom: 0;\" #slickGrid>\r\n\t<div #tableContainer class=\"d-flex flex-fill\" style=\"overflow: auto\">\r\n\r\n\t\t<div>\r\n\t\t\t<table #tableRef class=\"table table-sm\" [class.table-bordered]=\"bordered\" [class.table-borderless]=\"!bordered\" [class.table-striped]=\"striped\" [class.table-hover]=\"hover\" [style.opacity]=\"gridOpacity\" style=\"margin: 0; padding: 0;\" (keydown)=\"tableKeydown($event)\" tabindex=\"0\">\r\n\t\t\t\t<thead>\r\n\t\t\t\t\t<tr #tableHeaderRow (mousemove)=\"onColResizeMousemove($event)\" [ngClass]=\"{ 'resizing': isResizing === true }\">\r\n\t\t\t\t\t\t<td *ngFor=\"let column of visibleColumns; let idx = index\" [style.width]=\"column.width\" [style.maxWidth]=\"column.width\" [style.height]=\"column.titleHeight\">\r\n\t\t\t\t\t\t\t<div [ngClass]=\"{ 'slick-grid_title-vertical' : column.titleOrientation === 1 }\">\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"idx > 0 && idx < visibleColumns.length\" class=\"resize_column_left\" [class.table-bordered]=\"bordered\" (mousedown)=\"onColResizeMousedown($event, idx - 1)\" (dblclick)=\"onColResizeDoubleclick($event, idx - 1)\"></div>\r\n\t\t\t\t\t\t\t\t<span class=\"sortIcon\" *ngIf=\"column.sortable === true && column.sortDirection > 0\"><i class=\"far\" [ngClass]=\"{'fa-caret-up': column.sortDirection === 1, 'fa-caret-down': column.sortDirection === 2}\"></i>&nbsp;</span>\r\n\t\t\t\t\t\t\t\t<a href=\"javascript:void(0)\" *ngIf=\"column.sortable === true\" (click)=\"sortBy(column)\" draggable=\"false\" title=\"{{column.title}}\">{{column.title}}</a>\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"column.sortable === false\" title=\"{{column.title}}\">{{column.title}}</div>\r\n\t\t\t\t\t\t\t\t<div class=\"resize_column_right\" (mousedown)=\"onColResizeMousedown($event, idx)\" (dblclick)=\"onColResizeDoubleclick($event, idx)\"></div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t\t<tr #tableHeaderSearchRow *ngIf=\"showSearchRow === true\">\r\n\t\t\t\t\t\t<td *ngFor=\"let column of visibleColumns\">\r\n\t\t\t\t\t\t\t<div class=\"slick-grid_search-column\">\r\n\t\t\t\t\t\t\t\t<i *ngIf=\"column.isFiltering\" class=\"fas fa-times-circle bg-white text-danger mr-1\" (click)=\"resetFilter(column)\"></i>\r\n\t\t\t\t\t\t\t\t<i *ngIf=\"column.isFiltering && column.isLocked\" class=\"far fa-lock mr-1\" (click)=\"toggleLock(column)\"></i>\r\n\t\t\t\t\t\t\t\t<i *ngIf=\"column.isFiltering && !column.isLocked\" class=\"far fa-lock-open mr-1\" (click)=\"toggleLock(column)\"></i>\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"column.filterType === 1\" class=\"slick-grid_text-search\">\r\n\t\t\t\t\t\t\t\t\t<input autocomplete=\"nope\" type=\"text\" class=\"form-control\" [(ngModel)]=\"column.filterText\" name=\"searchText\" placeholder=\"Search...\" (keydown)=\"onSearch(column)\" />\r\n\t\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"column.filterType === 2\" class=\"input-group slick-grid_drop-down-search\">\r\n\t\t\t\t\t\t\t\t\t<slick-drop-down [items]=\"column.filterDropdownValues\" [(ngModel)]=\"column.filterDropdownValue\" listWidth=\"auto\" placeholder=\"Search...\" (onSelect)=\"onSearchSelect($event, column)\"></slick-drop-down>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t</thead>\r\n\r\n\t\t\t\t<tbody>\r\n\t\t\t\t\t<tr *ngIf=\"loaded && visibleData.length === 0\"><td [colSpan]=\"visibleColumns.length\">No Data</td></tr>\r\n\t\t\t\t\t<tr *ngFor=\"let rowData of visibleData; let idx = index\" #tableBodyRows (click)=\"onRowClicked(rowData, idx)\" (dblclick)=\"onRowDoubleClicked(rowData, idx)\" (contextmenu)=\"onRowContextMenuClicked($event, rowData, idx)\" [class.table-success]=\"selectedIndex === idx\">\r\n\t\t\t\t\t\t<td *ngFor=\"let column of visibleColumns\">\r\n\t\t\t\t\t\t\t<div *ngIf=\"!column.columnKey\" class=\"slick-grid_column-content\" [style.width]=\"column.width\" [style.maxWidth]=\"column.width\" [innerHTML]=\"getColumnHTML(rowData, column.dataFieldName) | slickGridSanitizeHtml\"></div>\r\n\t\t\t\t\t\t\t<div *ngIf=\"column.columnKey\" class=\"slick-grid_column-content\" [style.width]=\"column.width\" [style.maxWidth]=\"column.width\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"templateRefs[column.columnKey], context: { $implicit: rowData }\">\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t</tbody>\r\n\t\t\t</table>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\r\n\t<div class=\"slick-grid-footer mt-2 d-flex\">\r\n\t\t<div>\r\n\t\t\t<button type=\"button\" (click)=\"openColumnSelectDialog()\" class=\"btn btn-outline-primary\"><i class=\"far fa-columns\"></i></button>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"favorites?.length > 1\">\r\n\t\t\t<button #favoriteSelectRef type=\"button\" class=\"btn btn-outline-primary ml-1\"><i class=\"far fa-star\"></i> {{this.selectedFavorite}}</button>\r\n\t\t\t<slick-popover [element]=\"favoriteSelectRef\" position=\"top\" showArrow=\"false\" [topOffsetPx]=\"0\" [leftOffsetPx]=\"0\" [showByClick]=\"true\">\r\n\t\t\t\t<table class=\"table-borderless table-sm table-hover\" style=\"min-width: 250px; cursor: default\">\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t<tr *ngFor=\"let favorite of favorites\" (click)=\"setFavorite(favorite.text)\">\r\n\t\t\t\t\t\t\t<td><i *ngIf=\"favorite.text === selectedFavorite\" class=\"far fa-star mr-1\"></i>{{favorite.text}}</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t</table>\r\n\t\t\t</slick-popover>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"showingAllRecords == false\">\r\n\t\t\t<slick-paging [(pageNumber)]=\"currentPage\" [totalRecords]=\"totalRecords\" [recordsPerPage]=\"recordsPerPage\" (onPageChange)=\"onPageChange($event)\"></slick-paging>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"showingAllRecords == false\" class=\"ml-1\">\r\n\t\t\t<button #recordsPerPageRef type=\"button\" class=\"btn btn-outline-primary\">{{recordsPerPageValue}}&nbsp;&nbsp;<i style=\"font-size: 12px\" class=\"far fa-chevron-down\"></i></button>\r\n\r\n\t\t\t<slick-popover [element]=\"recordsPerPageRef\" position=\"top\" showArrow=\"false\" [topOffsetPx]=\"0\" [leftOffsetPx]=\"0\" [showByClick]=\"true\">\r\n\t\t\t\t<table class=\"table-borderless table-sm table-hover\" style=\"min-width: 150px;\">\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('Auto')\"><td>Auto</td></tr>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('25')\"><td>25</td></tr>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('50')\"><td>50</td></tr>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('100')\"><td>100</td></tr>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t</table>\r\n\t\t\t</slick-popover>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<slick-dialog #columnSelectDialogRef header=\"Select Columns\">\r\n\t<div style=\"text-align: center; width: 475px;\" class=\"mx-5\">\r\n\t\t<div class=\"d-flex\">\r\n\t\t\t<div class=\"flex-fill\">\r\n\t\t\t\t<slick-drop-down [items]=\"favorites\"\r\n\t\t\t\t\t\t\t\t [ngModel]=\"selectedFavorite\"\r\n\t\t\t\t\t\t\t\t (onSelect)=\"loadFavorite($event)\"></slick-drop-down>\r\n\t\t\t</div>\r\n\t\t\t<div><button class=\"btn btn-outline-primary ml-1\" (click)=\"addNewFavorite()\"><i class=\"far fa-plus\"></i></button></div>\r\n\t\t</div>\r\n\t\t<div class=\"d-flex flex-column mt-1\" slick-drop-list (onSlickDropListReorder)=\"onColumnReorder($event)\">\r\n\t\t\t<div *ngFor=\"let column of columnSelectDialogColumns\" class=\"d-flex\" slick-drop-list-item>\r\n\t\t\t\t<div style=\"width: 20px\"><input type=\"checkbox\" style=\"position: relative; top: 2px;\" [(ngModel)]=\"column.visible\" /></div>\r\n\t\t\t\t<div class=\"py-0 flex-fill\" style=\"text-align: left; cursor: ns-resize\" slick-drop-list-grab>{{column.title}}</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\t<slick-dialog-footer>\r\n\t\t<div style=\"margin-top: 10px;\" class=\"col-12 text-center mb-2 mt-1\">\r\n\t\t\t<button type=\"button\" (click)=\"onSaveColumns()\" class=\"btn btn-outline-primary mr-1\"><i class=\"far fa-save\"></i>&nbsp;Save</button>&nbsp;\r\n\t\t\t<button type=\"button\" class=\"btn btn-outline-danger\" (click)=\"onCancelColumns()\">Cancel</button>\r\n\t\t</div>\r\n\t</slick-dialog-footer>\r\n</slick-dialog>\r\n\r\n\r\n<slick-confirm-dialog #addNewFavoriteDialogRef width=\"300\">\r\n\t<label>Enter new favorite name</label>\r\n\t<input type=\"text\" class=\"form-control mx-3\" style=\"width: 250px\" [(ngModel)]=\"newFavoriteText\" />\r\n</slick-confirm-dialog>",
725
759
  providers: [SlickGridService]
726
760
  },] }
727
761
  ];
@@ -737,6 +771,7 @@ SlickGridComponent.propDecorators = {
737
771
  bordered: [{ type: Input }],
738
772
  striped: [{ type: Input }],
739
773
  hover: [{ type: Input }],
774
+ showingAllRecords: [{ type: Input }],
740
775
  data: [{ type: Input }],
741
776
  onRowSelected: [{ type: Output }],
742
777
  onRowDoubleClick: [{ type: Output }],
@@ -754,4 +789,4 @@ SlickGridComponent.propDecorators = {
754
789
  slickGridColumnTemplates: [{ type: ContentChildren, args: [SlickGridColumnTemplateDirective,] }],
755
790
  onResize: [{ type: HostListener, args: ['window:resize', ['$event', '$event.target'],] }]
756
791
  };
757
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2stZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9zbGljay1ncmlkL3NsaWNrLWdyaWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUE4RCxlQUFlLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwTyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQXlCLDBCQUEwQixFQUFFLDRCQUE0QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFNUgsT0FBTyxFQUFFLHFCQUFxQixFQUFnQyxNQUFNLDRCQUE0QixDQUFDO0FBRWpHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzFGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQzdILE9BQU8sRUFBMkIsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU5RixNQUFNLGFBQWE7SUFDbEIsWUFBWSxJQUFZO1FBQ3ZCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbEIs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RUFBRSxDQUFDLGdCQUFnQixDQUFDO2FBQzdCOzs7O1lBM0JRLGdCQUFnQjtZQVFoQix3QkFBd0I7WUFUMEosaUJBQWlCOzs7eUJBOEIxTSxXQUFXLFNBQUMsT0FBTzswQkFHbkIsS0FBSzt1QkFDTCxLQUFLO3NCQUNMLEtBQUs7b0JBQ0wsS0FBSzttQkFDTCxLQUFLOzRCQUNMLE1BQU07K0JBQ04sTUFBTTsrQkFDTixNQUFNO2tDQUNOLE1BQU07MkJBQ04sU0FBUyxTQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0NBQ3ZDLFNBQVMsU0FBQyxnQkFBZ0I7dUJBQzFCLFNBQVMsU0FBQyxVQUFVO2dDQUNwQixTQUFTLFNBQUMsZ0JBQWdCO3NDQUMxQixTQUFTLFNBQUMsc0JBQXNCO3lCQUVoQyxTQUFTLFNBQUMsU0FBUzsrQkFDbkIsU0FBUyxTQUFDLGVBQWU7b0NBQ3pCLFNBQVMsU0FBQyx1QkFBdUI7c0NBQ2pDLFNBQVMsU0FBQyx5QkFBeUI7dUNBRW5DLGVBQWUsU0FBQyxnQ0FBZ0M7dUJBa0NoRCxZQUFZLFNBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIE9uRGVzdHJveSwgQ29udGVudENoaWxkcmVuLCBRdWVyeUxpc3QsIEhvc3RCaW5kaW5nLCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFNsaWNrR3JpZFNlcnZpY2UgfSBmcm9tIFwiLi9zbGljay1ncmlkLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgSVNsaWNrR3JpZENvbHVtbk1vZGVsLCBTbGlja0dyaWRDb2x1bW5GaWx0ZXJUeXBlcywgU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbiB9IGZyb20gXCIuL3NsaWNrLWdyaWQtY29sdW1uLm1vZGVsXCI7XHJcbmltcG9ydCB7IElTbGlja0dyaWRPcHRpb25zIH0gZnJvbSBcIi4vc2xpY2stZ3JpZC5vcHRpb25zXCI7XHJcbmltcG9ydCB7IFNsaWNrR3JpZFJlcXVlc3RNb2RlbCwgSVNsaWNrR3JpZFJlcXVlc3RTZWFyY2hNb2RlbCB9IGZyb20gXCIuL3NsaWNrLWdyaWQtcmVxdWVzdC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBTbGlja0dyaWRSZXNwb25zZU1vZGVsIH0gZnJvbSBcIi4vc2xpY2stZ3JpZC1yZXNwb25zZS5tb2RlbFwiO1xyXG5pbXBvcnQgeyBTbGlja0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gXCIuLi9zbGljay1kaWFsb2cvc2xpY2stZGlhbG9nLm1vZHVsZVwiO1xyXG5pbXBvcnQgeyBTbGlja1NsZWVwU2VydmljZSB9IGZyb20gXCIuLi91dGlscy9zbGljay1zbGVlcC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNsaWNrVXRpbHNTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzL3NsaWNrLXV0aWxzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2xpY2tGdW5jdGlvbkxvY2tTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzL3NsaWNrLWZ1bmN0aW9uLWxvY2suc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTbGlja0dyaWRDb2x1bW5UZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gXCIuL3NsaWNrLWdyaWQtY29sdW1uLXRlbXBsYXRlLmRpcmVjdGl2ZVwiO1xyXG5pbXBvcnQgeyBTbGlja0NvbmZpcm1EaWFsb2dDb21wb25lbnQsIFNsaWNrQ29uZmlybURpYWxvZ1Jlc3VsdHMgfSBmcm9tICcuLi9zbGljay1jb25maXJtLWRpYWxvZy9zbGljay1jb25maXJtLWRpYWxvZy5tb2R1bGUnO1xyXG5pbXBvcnQgeyBJU2xpY2tHcmlkRmF2b3JpdGVNb2RlbCwgU2xpY2tHcmlkRmF2b3JpdGVNb2RlbCB9IGZyb20gJy4vc2xpY2stZ3JpZC1mYXZvcml0ZS5tb2RlbCc7XHJcblxyXG5jbGFzcyBEcm9wRG93bk1vZGVsIHtcclxuXHRjb25zdHJ1Y3Rvcih0ZXh0OiBzdHJpbmcpIHtcclxuXHRcdHRoaXMuaWQgPSB0ZXh0O1xyXG5cdFx0dGhpcy50ZXh0ID0gdGV4dDtcclxuXHR9XHJcblxyXG5cdGlkOiBzdHJpbmc7XHJcblx0dGV4dDogc3RyaW5nO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ3NsaWNrLWdyaWQnLFxyXG5cdHRlbXBsYXRlVXJsOiAnc2xpY2stZ3JpZC5jb21wb25lbnQuaHRtbCcsXHJcblx0cHJvdmlkZXJzOiBbU2xpY2tHcmlkU2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIFNsaWNrR3JpZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG5cdEBIb3N0QmluZGluZygnY2xhc3MnKSBmbGV4Q29sdW1uID0gJ3NsaWNrLWZsZXgtY29sdW1uJztcclxuXHQvL0BIb3N0QmluZGluZygnY2xhc3MnKSBjbGFzcyA9ICdkLWZsZXggZmxleC1jb2x1bW4gZmxleC1maWxsJztcclxuXHJcblx0QElucHV0KCkgZ3JpZE9wdGlvbnM6IElTbGlja0dyaWRPcHRpb25zO1xyXG5cdEBJbnB1dCgpIGJvcmRlcmVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHRASW5wdXQoKSBzdHJpcGVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHRASW5wdXQoKSBob3ZlcjogYm9vbGVhbiA9IHRydWU7XHJcblx0QElucHV0KCkgZGF0YTogYW55W107XHJcblx0QE91dHB1dCgpIG9uUm93U2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblx0QE91dHB1dCgpIG9uUm93RG91YmxlQ2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblx0QE91dHB1dCgpIG9uUm93Q29udGV4dE1lbnU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblx0QE91dHB1dCgpIG9uRmF2b3JpdGVzTW9kaWZpZWQ6IEV2ZW50RW1pdHRlcjxhbnlbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xyXG5cdEBWaWV3Q2hpbGQoXCJzbGlja0dyaWRcIiwgeyBzdGF0aWM6IHRydWUgfSkgc2xpY2tHcmlkUmVmOiBFbGVtZW50UmVmO1xyXG5cdEBWaWV3Q2hpbGQoXCJ0YWJsZUNvbnRhaW5lclwiKSB0YWJsZUNvbnRhaW5lclJlZjogRWxlbWVudFJlZjtcclxuXHRAVmlld0NoaWxkKFwidGFibGVSZWZcIikgdGFibGVSZWY6IEVsZW1lbnRSZWY7XHJcblx0QFZpZXdDaGlsZChcInRhYmxlSGVhZGVyUm93XCIpIHRhYmxlSGVhZGVyUm93UmVmOiBFbGVtZW50UmVmO1xyXG5cdEBWaWV3Q2hpbGQoXCJ0YWJsZUhlYWRlclNlYXJjaFJvd1wiKSB0YWJsZUhlYWRlclNlYXJjaFJvd1JlZjogRWxlbWVudFJlZjtcclxuXHQvLyBUaGlzIGlzIHRvIHRlc3QgaG93IGhpZ2ggYSBzdGFuZGFyZCByb3cgaXNcclxuXHRAVmlld0NoaWxkKFwidGVzdFJvd1wiKSB0ZXN0Um93UmVmOiBFbGVtZW50UmVmO1xyXG5cdEBWaWV3Q2hpbGQoXCJ0YWJsZUJvZHlSb3dzXCIpIHRhYmxlQm9keVJvd3NSZWY6IEVsZW1lbnRSZWY7XHJcblx0QFZpZXdDaGlsZChcImNvbHVtblNlbGVjdERpYWxvZ1JlZlwiKSBjb2x1bW5TZWxlY3REaWFsb2dSZWY6IFNsaWNrRGlhbG9nQ29tcG9uZW50O1xyXG5cdEBWaWV3Q2hpbGQoXCJhZGROZXdGYXZvcml0ZURpYWxvZ1JlZlwiKSBhZGROZXdGYXZvcml0ZURpYWxvZ1JlZjogU2xpY2tDb25maXJtRGlhbG9nQ29tcG9uZW50O1xyXG5cclxuXHRAQ29udGVudENoaWxkcmVuKFNsaWNrR3JpZENvbHVtblRlbXBsYXRlRGlyZWN0aXZlKSBzbGlja0dyaWRDb2x1bW5UZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxTbGlja0dyaWRDb2x1bW5UZW1wbGF0ZURpcmVjdGl2ZT47XHJcblx0dGVtcGxhdGVSZWZzOiBhbnk7XHJcblxyXG5cdHByaXZhdGUgZm5Pbk1vdXNlVXAgPSAoZSkgPT4gdGhpcy5vbk1vdXNlVXAoZSk7XHJcblxyXG5cdHV1aWQ6IHN0cmluZztcclxuXHRzZWxlY3RlZEluZGV4OiBudW1iZXIgPSBudWxsO1xyXG5cdGdyaWRPcGFjaXR5ID0gMDtcclxuXHR2aXNpYmxlQ29sdW1uczogSVNsaWNrR3JpZENvbHVtbk1vZGVsW107XHJcblx0ZmF2b3JpdGVzOiBEcm9wRG93bk1vZGVsW107XHJcblx0c2VsZWN0ZWRGYXZvcml0ZTogc3RyaW5nO1xyXG5cdG5ld0Zhdm9yaXRlVGV4dDogc3RyaW5nO1xyXG5cdGNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnM6IElTbGlja0dyaWRDb2x1bW5Nb2RlbFtdO1xyXG5cdGxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdGlzRG91YmxlQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRkb3VibGVDbGlja1dhaXRUaW1lb3V0OiBOb2RlSlMuVGltZXI7XHJcblx0Y3VycmVudFBhZ2U6IG51bWJlciA9IDE7XHJcblx0c2VhcmNoVGltZW91dDogTm9kZUpTLlRpbWVyO1xyXG5cdGtleXByZXNzVGltZW91dDogTm9kZUpTLlRpbWVyO1xyXG5cdHNob3dUZXN0Um93ID0gZmFsc2U7XHJcblx0c2hvd1NlYXJjaFJvdyA9IGZhbHNlO1xyXG5cdGlzUmVzaXppbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHR2aXNpYmxlRGF0YTogYW55W10gPSBbXTtcclxuXHRyZWNvcmRzUGVyUGFnZTogbnVtYmVyO1xyXG5cdHRvdGFsUmVjb3JkczogbnVtYmVyO1xyXG5cdHJlY29yZHNQZXJQYWdlVmFsdWU6IHN0cmluZyA9IFwiQXV0b1wiO1xyXG5cclxuXHRwcml2YXRlIHNsaWNrR3JpZEhlaWdodDogbnVtYmVyO1xyXG5cdHByaXZhdGUgcmVzaXplVGltZW91dDogTm9kZUpTLlRpbWVyID0gbnVsbDtcclxuXHRwcml2YXRlIHJlcXVlc3RNb2RlbDogU2xpY2tHcmlkUmVxdWVzdE1vZGVsO1xyXG5cdHByaXZhdGUgcmVzaXplSW5pdGlhbFBvczogbnVtYmVyO1xyXG5cdHByaXZhdGUgcmVzaXplSW5pdGlhbFdpZHRoOiBudW1iZXI7XHJcblx0cHJpdmF0ZSByZXNpemVDb2xJZHg6IG51bWJlcjtcclxuXHJcblx0QEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50JywgJyRldmVudC50YXJnZXQnXSlcclxuXHRhc3luYyBvblJlc2l6ZShldmVudDogVUlFdmVudCwgdGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuXHRcdC8vIFRoaXMgaXMgaGVyZSBiZWNhdXNlIGZpcmVmb3ggc2hvd3MvaGlkZXMgdGhlIG1lbnUgaWYgeW91IHByZXNzIGFsdC4gRG9uJ3QgcmVkcmF3IHRoZSBncmlkIGlmIHdlJ3JlXHJcblx0XHQvLyBqdXN0IHNob3dpbmcgdGhlIG1lbnVcclxuXHRcdGlmIChNYXRoLmFicyh0aGlzLnNsaWNrR3JpZEhlaWdodCAtIHRoaXMuc2xpY2tHcmlkUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0KSA8IDUwKVxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0aWYgKHRoaXMuc2xpY2tHcmlkSGVpZ2h0ICE9PSB0aGlzLnNsaWNrR3JpZFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCkge1xyXG5cdFx0XHRjbGVhclRpbWVvdXQodGhpcy5yZXNpemVUaW1lb3V0KTtcclxuXHRcdFx0dGhpcy5yZXNpemVUaW1lb3V0ID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwucGFnZSA9IDE7XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5yZXNpemVHcmlkKCk7XHJcblx0XHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwucmVjb3Jkc1BlclBhZ2UgPSB0aGlzLnJlY29yZHNQZXJQYWdlO1xyXG5cdFx0XHRcdHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdFx0fSwgNTAwKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgZ3JpZFNlcnZpY2U6IFNsaWNrR3JpZFNlcnZpY2UsXHJcblx0XHRwcml2YXRlIGZ1bmN0aW9uTG9ja1NlcnZpY2U6IFNsaWNrRnVuY3Rpb25Mb2NrU2VydmljZSxcclxuXHRcdHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcblx0XHR0aGlzLnV1aWQgPSBTbGlja1V0aWxzU2VydmljZS5uZXdHdWlkKCk7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbCA9IG5ldyBTbGlja0dyaWRSZXF1ZXN0TW9kZWwoKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG5nT25Jbml0KCkge1xyXG5cdFx0aWYgKHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSkge1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuZ3JpZE9wdGlvbnMuZmF2b3JpdGVzKSB7XHJcblx0XHRcdFx0Y29uc3QgZmF2b3JpdGVOYW1lcyA9IHRoaXMuZ3JpZE9wdGlvbnMuZmF2b3JpdGVzLm1hcChmID0+IGYuZmF2b3JpdGVOYW1lKTtcclxuXHRcdFx0XHRsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgR1JJRF8ke3RoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleX1fRkFWT1JJVEVTYCwgSlNPTi5zdHJpbmdpZnkoZmF2b3JpdGVOYW1lcykpO1xyXG5cclxuXHRcdFx0XHR0aGlzLmdyaWRPcHRpb25zLmZhdm9yaXRlcy5mb3JFYWNoKGZhdm9yaXRlID0+IHtcclxuXHRcdFx0XHRcdC8vIE1ha2Ugc3VyZSB3ZSBoYXZlbid0IGFkZGVkIGEgbmV3IGNvbHVtbiB0aGF0IG5lZWRzIHRvIGJlIHNhdmVkXHJcblx0XHRcdFx0XHR0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuZm9yRWFjaChjID0+IHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgY29sdW1uRXhpc3RzID0gZmF2b3JpdGUuY29sdW1ucy5maW5kSW5kZXgoeCA9PiB4LmRhdGFGaWVsZE5hbWUgPT09IGMuZGF0YUZpZWxkTmFtZSk7XHJcblx0XHRcdFx0XHRcdGlmIChjb2x1bW5FeGlzdHMgPCAwKSBcclxuXHRcdFx0XHRcdFx0XHRmYXZvcml0ZS5jb2x1bW5zLnB1c2goYyk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdGxldCBncmlkQ29sdW1uc0pTT04gPSBKU09OLnN0cmluZ2lmeShmYXZvcml0ZS5jb2x1bW5zKTtcclxuXHRcdFx0XHRcdGlmICh0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXkpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3Qgc3VmZml4ID0gZmF2b3JpdGUuZmF2b3JpdGVOYW1lID09PSAnRGVmYXVsdCcgPyAnJyA6ICgnXycgKyBmYXZvcml0ZS5mYXZvcml0ZU5hbWUpO1xyXG5cdFx0XHRcdFx0XHRsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgR1JJRF8ke3RoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleX1fQ09MVU1OUyR7c3VmZml4fWAsIGdyaWRDb2x1bW5zSlNPTik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdGlmIChmYXZvcml0ZU5hbWVzLmluZGV4T2YodGhpcy5zZWxlY3RlZEZhdm9yaXRlKSA8IDApXHJcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPSBcIkRlZmF1bHRcIjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5zZWxlY3RlZEZhdm9yaXRlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJHUklEX1wiICsgdGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5ICsgXCJfU0VMRUNURURfRkFWT1JJVEVcIikgfHwgJ0RlZmF1bHQnO1xyXG5cclxuXHRcdFx0Ly8gQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgYW55IGR1cGxpY2F0ZSBjb2x1bW4gbmFtZXNcclxuXHRcdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZvckVhY2goYzEgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGRhdGFGaWVsZENvdW50ID0gKHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5maWx0ZXIoeCA9PiB4LmRhdGFGaWVsZE5hbWUgPT09IGMxLmRhdGFGaWVsZE5hbWUpIHx8IFtdKS5sZW5ndGg7XHJcblx0XHRcdFx0aWYgKGRhdGFGaWVsZENvdW50ID4gMSlcclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoYEdyaWQgJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9IGNvbHVtbiAke2MxLmRhdGFGaWVsZE5hbWV9IGlzIGRlZmluZWQgJHtkYXRhRmllbGRDb3VudH0gdGltZXNgKTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRjb25zdCBzdWZmaXggPSB0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPT09ICdEZWZhdWx0JyA/ICcnIDogKCdfJyArIHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSk7XHJcblx0XHRcdGxldCBncmlkQ29sdW1uc0pzb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgR1JJRF8ke3RoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleX1fQ09MVU1OUyR7c3VmZml4fWApO1xyXG5cdFx0XHRpZiAoZ3JpZENvbHVtbnNKc29uKSB7XHJcblx0XHRcdFx0bGV0IGNvbHVtbnMgPSA8SVNsaWNrR3JpZENvbHVtbk1vZGVsW10+SlNPTi5wYXJzZShncmlkQ29sdW1uc0pzb24pO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGxldCBkaXNwbGF5T3JkZXIgPSAwO1xyXG5cdFx0XHRcdGNvbHVtbnMuZm9yRWFjaChjID0+IHtcclxuXHRcdFx0XHRcdGxldCBjb2x1bW4gPSB0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuZmluZChncmlkQ29sdW1uID0+IGdyaWRDb2x1bW4uZGF0YUZpZWxkTmFtZSA9PT0gYy5kYXRhRmllbGROYW1lKTtcclxuXHRcdFx0XHRcdGlmIChjb2x1bW4pIHtcclxuXHRcdFx0XHRcdFx0Y29sdW1uLnZpc2libGUgPSBjLnZpc2libGU7XHJcblx0XHRcdFx0XHRcdGNvbHVtbi5kaXNwbGF5T3JkZXIgPSBkaXNwbGF5T3JkZXI7XHJcblx0XHRcdFx0XHRcdGNvbHVtbi53aWR0aCA9IGMud2lkdGg7XHJcblx0XHRcdFx0XHRcdGNvbHVtbi5mbGV4aWJsZSA9IGMuZmxleGlibGU7XHJcblx0XHRcdFx0XHRcdGNvbHVtbi5zb3J0RGlyZWN0aW9uID0gYy5zb3J0RGlyZWN0aW9uO1xyXG5cdFx0XHRcdFx0XHRjb2x1bW4uaXNMb2NrZWQgPSBjLmlzTG9ja2VkO1xyXG5cdFx0XHRcdFx0XHQvL2NvbHVtbi5maWx0ZXJUeXBlID0gYy5maWx0ZXJUeXBlO1xyXG5cdFx0XHRcdFx0XHRpZiAoY29sdW1uLmlzTG9ja2VkICYmIGNvbHVtbi5maWx0ZXJUeXBlICE9PSBTbGlja0dyaWRDb2x1bW5GaWx0ZXJUeXBlcy5ub25lKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29sdW1uLmlzRmlsdGVyaW5nID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0XHRpZiAoY29sdW1uLmZpbHRlclR5cGUgPT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLnRleHQpIFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uLmZpbHRlclRleHQgPSBjLmZpbHRlclRleHQ7XHJcblx0XHRcdFx0XHRcdFx0ZWxzZSBpZiAoY29sdW1uLmZpbHRlclR5cGUgPT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLmRyb3Bkb3duKSBcclxuXHRcdFx0XHRcdFx0XHRcdGNvbHVtbi5maWx0ZXJEcm9wZG93blZhbHVlID0gYy5maWx0ZXJEcm9wZG93blZhbHVlO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIWNvbHVtbi5maWx0ZXJUZXh0ICYmICFjb2x1bW4uZmlsdGVyRHJvcGRvd25WYWx1ZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uLmlzRmlsdGVyaW5nID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0XHRjb2x1bW4uaXNMb2NrZWQgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbHVtbi5maWx0ZXJUZXh0ID0gbnVsbDtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbHVtbi5maWx0ZXJEcm9wZG93blZhbHVlID0gbnVsbDtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRkaXNwbGF5T3JkZXIrKztcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5yZWNvcmRzUGVyUGFnZVZhbHVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJHUklEX1wiICsgdGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5ICsgXCJfUkVDT1JEU19QRVJfUEFHRVwiKSB8fCBcIkF1dG9cIjtcclxuXHJcblx0XHRcdGNvbnN0IGZhdm9yaXRlc0pzb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIkdSSURfXCIgKyB0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXkgKyBcIl9GQVZPUklURVNcIikgfHwgYFtcIkRlZmF1bHRcIl1gO1xyXG5cdFx0XHR0aGlzLmZhdm9yaXRlcyA9ICg8c3RyaW5nW10+SlNPTi5wYXJzZShmYXZvcml0ZXNKc29uKSkubWFwKGZhdm9yaXRlID0+IHtcclxuXHRcdFx0XHRyZXR1cm4gbmV3IERyb3BEb3duTW9kZWwoZmF2b3JpdGUpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZpbHRlcihjID0+IGMudmlzaWJsZSA9PT0gdHJ1ZSk7XHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5kaXNwbGF5T3JkZXIgPiBiLmRpc3BsYXlPcmRlcikgPyAxIDogKGEuZGlzcGxheU9yZGVyIDwgYi5kaXNwbGF5T3JkZXIpID8gLTEgOiAwKTtcclxuXHRcdFxyXG5cdFx0dGhpcy5zaG93U2VhcmNoUm93ID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoYyA9PiBjLmZpbHRlclR5cGUgIT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLm5vbmUpLmxlbmd0aCA+IDA7XHJcblx0XHRsZXQgc29ydENvbHVtbiA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmluZChjID0+IGMuc29ydGFibGUgPT09IHRydWUgJiYgYy5zb3J0RGlyZWN0aW9uID4gMCk7XHJcblx0XHRpZiAodGhpcy52aXNpYmxlQ29sdW1ucy5sZW5ndGggPiAwICYmIHNvcnRDb2x1bW4pIHtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuc29ydENvbHVtbiA9IHNvcnRDb2x1bW4uZGF0YUZpZWxkTmFtZTtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuc29ydERpcmVjdGlvbiA9IHNvcnRDb2x1bW4uc29ydERpcmVjdGlvbjtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuXHRcdC8vIENvcHkgdGhlIHRlbXBsYXRlcyB0byBhIHZhcmlhYmxlIHRoYXQgdGhlIGh0bWwgY2FuIGFjY2Vzcy4gIEl0IGNhbid0IGFjY2VzcyBhIFF1ZXJ5TGlzdFxyXG5cdFx0dGhpcy50ZW1wbGF0ZVJlZnMgPSB7fTtcclxuXHRcdHRoaXMuc2xpY2tHcmlkQ29sdW1uVGVtcGxhdGVzLmZvckVhY2godCA9PiB7XHJcblx0XHRcdHRoaXMudGVtcGxhdGVSZWZzW3QuY29sdW1uS2V5XSA9IHQudGVtcGxhdGU7XHJcblx0XHR9KTtcclxuXHRcdGlmICh0aGlzLnRhYmxlUmVmKVxyXG5cdFx0XHQoPEhUTUxUYWJsZUVsZW1lbnQ+dGhpcy50YWJsZVJlZi5uYXRpdmVFbGVtZW50KS5mb2N1cygpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgdGFibGVLZXlkb3duKGU6IEtleWJvYXJkRXZlbnQpIHtcclxuXHRcdC8vIEtleSB1cFxyXG5cdFx0aWYgKGUud2hpY2ggPT09IDM4ICYmICEodGhpcy5zZWxlY3RlZEluZGV4ID09PSAwICYmIHRoaXMuY3VycmVudFBhZ2UgPT09IDEpKSB7XHJcblx0XHRcdGNsZWFyVGltZW91dCh0aGlzLmtleXByZXNzVGltZW91dCk7XHJcblxyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXgtLTtcclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA8IDApIHtcclxuXHRcdFx0XHRpZiAodGhpcy5jdXJyZW50UGFnZSA+IDEpIHtcclxuXHRcdFx0XHRcdHRoaXMuY3VycmVudFBhZ2UtLTtcclxuXHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLm9uUGFnZUNoYW5nZSh0aGlzLmN1cnJlbnRQYWdlLCBmYWxzZSk7XHJcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSB0aGlzLnJlY29yZHNQZXJQYWdlIC0gMTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMua2V5cHJlc3NUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0Y29uc3Qgcm93RGF0YSA9IHRoaXMudmlzaWJsZURhdGFbdGhpcy5zZWxlY3RlZEluZGV4XTtcclxuXHRcdFx0XHR0aGlzLm9uUm93Q2xpY2tlZChyb3dEYXRhLCB0aGlzLnNlbGVjdGVkSW5kZXgpO1xyXG5cdFx0XHR9LCA1MDApO1xyXG5cdFx0fVxyXG5cdFx0Ly8gS2V5IGRvd25cclxuXHRcdGlmIChlLndoaWNoID09PSA0MCkge1xyXG5cdFx0XHRpZiAoKCh0aGlzLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLnJlY29yZHNQZXJQYWdlKSArIHRoaXMuc2VsZWN0ZWRJbmRleCA+PSB0aGlzLnRvdGFsUmVjb3JkcylcclxuXHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRjbGVhclRpbWVvdXQodGhpcy5rZXlwcmVzc1RpbWVvdXQpO1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXgrKztcclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA+PSB0aGlzLnJlY29yZHNQZXJQYWdlKSB7XHJcblx0XHRcdFx0aWYgKCgodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5yZWNvcmRzUGVyUGFnZSkgKyB0aGlzLnNlbGVjdGVkSW5kZXggPCB0aGlzLnRvdGFsUmVjb3Jkcykge1xyXG5cdFx0XHRcdFx0dGhpcy5jdXJyZW50UGFnZSsrO1xyXG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMub25QYWdlQ2hhbmdlKHRoaXMuY3VycmVudFBhZ2UsIGZhbHNlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMua2V5cHJlc3NUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0Y29uc3Qgcm93RGF0YSA9IHRoaXMudmlzaWJsZURhdGFbdGhpcy5zZWxlY3RlZEluZGV4XTtcclxuXHRcdFx0XHR0aGlzLm9uUm93Q2xpY2tlZChyb3dEYXRhLCB0aGlzLnNlbGVjdGVkSW5kZXgpO1xyXG5cdFx0XHR9LCA1MDApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG5cdFx0aWYgKGNoYW5nZXMuYm9yZGVyZWQpIHtcclxuXHRcdFx0aWYgKHRoaXMuZ3JpZE9wdGlvbnMuYm9yZGVyZWQgPT09IG51bGwpXHJcblx0XHRcdFx0dGhpcy5ib3JkZXJlZCA9ICh0aGlzLmJvcmRlcmVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSAhPT0gJ2ZhbHNlJykgPyB0cnVlIDogZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGNoYW5nZXMuc3RyaXBlZCkge1xyXG5cdFx0XHQvLyBUaGUgZ3JpZCBvcHRpb25zIG92ZXJyaWRlIHRoZSB0YWcgb3B0aW9uc1xyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5zdHJpcGVkID09PSBudWxsKVxyXG5cdFx0XHRcdHRoaXMuc3RyaXBlZCA9ICh0aGlzLnN0cmlwZWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpICE9PSAnZmFsc2UnKSA/IHRydWUgOiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoY2hhbmdlcy5ob3Zlcikge1xyXG5cdFx0XHQvLyBUaGUgZ3JpZCBvcHRpb25zIG92ZXJyaWRlIHRoZSB0YWcgb3B0aW9uc1xyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ob3ZlciA9PT0gbnVsbClcclxuXHRcdFx0XHR0aGlzLmhvdmVyID0gKHRoaXMuaG92ZXIudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpICE9PSAnZmFsc2UnKSA/IHRydWUgOiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoY2hhbmdlcy5ncmlkT3B0aW9ucykge1xyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ib3JkZXJlZCAhPT0gbnVsbClcclxuXHRcdFx0XHR0aGlzLmJvcmRlcmVkID0gdGhpcy5ncmlkT3B0aW9ucy5ib3JkZXJlZDtcclxuXHJcblx0XHRcdGlmICh0aGlzLmdyaWRPcHRpb25zLnN0cmlwZWQgIT09IG51bGwpXHJcblx0XHRcdFx0dGhpcy5zdHJpcGVkID0gdGhpcy5ncmlkT3B0aW9ucy5zdHJpcGVkO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuZ3JpZE9wdGlvbnMuaG92ZXIgIT09IG51bGwpXHJcblx0XHRcdFx0dGhpcy5ob3ZlciA9IHRoaXMuZ3JpZE9wdGlvbnMuaG92ZXI7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGNoYW5nZXMuZGF0YSkge1xyXG5cdFx0XHQvLyBJZiB3ZSBkb24ndCBkbyB0aGlzIGxvY2ssIHRoZSBmaXJzdCBjaGFuZ2Ugd2lsbCBoYXZlIG51bGwgZGF0YSBhbmQgY3Jhc2guICBUaGUgc2Vjb25kIHJlcXVlc3Qgd2lsbCBoYXZlIHRoZSBhY3R1YWwgZGF0YVxyXG5cdFx0XHRhd2FpdCB0aGlzLmZ1bmN0aW9uTG9ja1NlcnZpY2UubG9jayhcIkdSSURfXCIgKyB0aGlzLnV1aWQgKyBcIl9EQVRBX0NIQU5HRVNcIik7XHJcblx0XHRcdC8vIE9ubHkgcmVzaXplIHRoZSBncmlkIG9uIHRoZSBmaXJzdCBjaGFuZ2UsIG90aGVyd2lzZSB3ZSBnZXQgYSBmbGlja2VyXHJcblx0XHRcdGlmIChjaGFuZ2VzLmRhdGEuZmlyc3RDaGFuZ2UgPT09IHRydWUpXHJcblx0XHRcdFx0YXdhaXQgdGhpcy5yZXNpemVHcmlkKCk7XHJcblx0XHRcdC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIHJlc2l6ZSBpbiB0aGUgT25Jbml0IHRvIGZpbmlzaCBiZWZvcmUgd2UgY29udGludWVcclxuXHRcdFx0dGhpcy5sb2FkZWQgPSB0cnVlO1xyXG5cdFx0XHR0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwucGFnZSA9IDE7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLnJlY29yZHNQZXJQYWdlID0gdGhpcy5yZWNvcmRzUGVyUGFnZTtcclxuXHRcdFx0YXdhaXQgdGhpcy5yZWxvYWQodGhpcy5yZXF1ZXN0TW9kZWwpO1xyXG5cdFx0XHRpZiAodGhpcy52aXNpYmxlRGF0YSAmJiB0aGlzLnZpc2libGVEYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5ncmlkT3B0aW9ucy5hdXRvU2VsZWN0Rmlyc3RSb3cgPT09IHRydWUpXHJcblx0XHRcdFx0dGhpcy5zZWxlY3RSb3coMCk7XHJcblx0XHRcdHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5yZWxlYXNlKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX0RBVEFfQ0hBTkdFU1wiKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdG5nT25EZXN0cm95KCkge1xyXG5cdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZm5Pbk1vdXNlVXApO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgb25SZWNvcmRzUGVyUGFnZVNlbGVjdGVkKHJlY29yZHNQZXJQYWdlOiBzdHJpbmcpIHtcclxuXHRcdGlmICghcmVjb3Jkc1BlclBhZ2UpXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR0aGlzLnJlY29yZHNQZXJQYWdlVmFsdWUgPSByZWNvcmRzUGVyUGFnZTtcclxuXHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX1JFQ09SRFNfUEVSX1BBR0VcIiwgcmVjb3Jkc1BlclBhZ2UpO1xyXG5cclxuXHRcdHRoaXMudmlzaWJsZURhdGEgPSBbXTtcclxuXHRcdHRoaXMuZ3JpZE9wYWNpdHkgPSAwO1xyXG5cdFx0YXdhaXQgU2xpY2tTbGVlcFNlcnZpY2Uuc2xlZXAoKTtcclxuXHRcdGF3YWl0IHRoaXMucmVzaXplR3JpZCh0cnVlKTtcclxuXHRcdHRoaXMucmVxdWVzdE1vZGVsLnJlY29yZHNQZXJQYWdlID0gdGhpcy5yZWNvcmRzUGVyUGFnZTtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuXHRcdGF3YWl0IHRoaXMub25QYWdlQ2hhbmdlKHRoaXMuY3VycmVudFBhZ2UsIHRydWUpO1xyXG5cdH1cclxuXHJcblx0b25Db2xSZXNpemVNb3VzZWRvd24oZTogTW91c2VFdmVudCwgY29sdW1uSWR4OiBudW1iZXIpIHtcclxuXHRcdHRoaXMuaXNSZXNpemluZyA9IHRydWU7XHJcblx0XHR0aGlzLnJlc2l6ZUluaXRpYWxQb3MgPSBlLnBhZ2VYO1xyXG5cdFx0dGhpcy5yZXNpemVDb2xJZHggPSBjb2x1bW5JZHg7XHJcblx0XHRsZXQgY29sID0gKDxIVE1MVGFibGVSb3dFbGVtZW50PnRoaXMudGFibGVIZWFkZXJSb3dSZWYubmF0aXZlRWxlbWVudCkucXVlcnlTZWxlY3RvckFsbChcInRkXCIpLml0ZW0oY29sdW1uSWR4KTtcclxuXHRcdHRoaXMucmVzaXplSW5pdGlhbFdpZHRoID0gY29sLm9mZnNldFdpZHRoIC0gOTtcclxuXHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zW2NvbHVtbklkeF0uZmxleGlibGUgPSBmYWxzZTtcclxuXHJcblx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5mbk9uTW91c2VVcCk7XHJcblx0fVxyXG5cclxuXHRvbkNvbFJlc2l6ZURvdWJsZWNsaWNrKGU6IE1vdXNlRXZlbnQsIGNvbHVtbklkeDogbnVtYmVyKSB7XHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zW2NvbHVtbklkeF0uZmxleGlibGUgPSB0cnVlO1xyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1uc1tjb2x1bW5JZHhdLndpZHRoID0gbnVsbDtcclxuXHRcdHRoaXMuc2F2ZUNvbHVtbnNUb0xvY2FsU3RvcmFnZSgpO1xyXG5cdH1cclxuXHJcblx0b25Db2xSZXNpemVNb3VzZW1vdmUoZTogTW91c2VFdmVudCkge1xyXG5cdFx0aWYgKCF0aGlzLmlzUmVzaXppbmcpXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHRsZXQgbmV3Q3Vyc29yUG9zID0gZS5wYWdlWDtcclxuXHRcdGxldCBkaWZmID0gbmV3Q3Vyc29yUG9zIC0gdGhpcy5yZXNpemVJbml0aWFsUG9zO1xyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1uc1t0aGlzLnJlc2l6ZUNvbElkeF0ud2lkdGggPSAodGhpcy5yZXNpemVJbml0aWFsV2lkdGggKyBkaWZmKSArIFwicHhcIjtcclxuXHRcdGlmICgodGhpcy5yZXNpemVJbml0aWFsV2lkdGggKyBkaWZmKSA8IDEwKVxyXG5cdFx0XHR0aGlzLnZpc2libGVDb2x1bW5zW3RoaXMucmVzaXplQ29sSWR4XS53aWR0aCA9IFwiMTBweFwiO1xyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1uc1t0aGlzLnJlc2l6ZUNvbElkeF0uZmxleGlibGUgPSBmYWxzZTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgb25Nb3VzZVVwKGUpIHtcclxuXHRcdHRoaXMuaXNSZXNpemluZyA9IGZhbHNlO1xyXG5cdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZm5Pbk1vdXNlVXApO1xyXG5cdFx0dGhpcy5zYXZlQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblx0fVxyXG5cclxuXHRnZXRWaXNpYmxlUmVjb3JkcygpIHtcclxuXHRcdHJldHVybiB0aGlzLnZpc2libGVEYXRhO1xyXG5cdH1cclxuXHJcblx0YWRkTmV3UmVjb3JkKG5ld1JlY29yZDogYW55LCBzZWxlY3ROZXdSZWNvcmQ6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG5cdFx0dGhpcy52aXNpYmxlRGF0YS51bnNoaWZ0KG5ld1JlY29yZCk7XHJcblxyXG5cdFx0aWYgKHNlbGVjdE5ld1JlY29yZCA9PT0gdHJ1ZSkge1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSAwO1xyXG5cdFx0XHR0aGlzLnNlbGVjdFJvdygwKTtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHRpZiAodGhpcy5zZWxlY3RlZEluZGV4KVxyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCsrO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dXBkYXRlUmVjb3JkKHJvd051bTogbnVtYmVyLCByZWNvcmQ6IGFueSkge1xyXG5cdFx0dGhpcy52aXNpYmxlRGF0YVtyb3dOdW1dID0gcmVjb3JkO1xyXG5cdH1cclxuXHJcblx0b25Sb3dDbGlja2VkKHJvd0RhdGE6IGFueSwgaWR4OiBudW1iZXIpIHtcclxuXHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IGlkeDtcclxuXHRcdGNsZWFyVGltZW91dCh0aGlzLmRvdWJsZUNsaWNrV2FpdFRpbWVvdXQpO1xyXG5cdFx0dGhpcy5kb3VibGVDbGlja1dhaXRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdHRoaXMub25Sb3dTZWxlY3RlZC5lbWl0KHJvd0RhdGEpO1xyXG5cdFx0fSwgMjUwKTtcclxuXHR9XHJcblxyXG5cdG9uUm93RG91YmxlQ2xpY2tlZChyb3dEYXRhOiBhbnksIGlkeCkge1xyXG5cdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gaWR4O1xyXG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMuZG91YmxlQ2xpY2tXYWl0VGltZW91dCk7XHJcblx0XHR0aGlzLm9uUm93RG91YmxlQ2xpY2suZW1pdChyb3dEYXRhKTtcclxuXHR9XHJcblxyXG5cdG9uUm93Q29udGV4dE1lbnVDbGlja2VkKGU6IE1vdXNlRXZlbnQsIHJvd0RhdGEsIGlkeCkge1xyXG5cdFx0aWYgKHRoaXMub25Sb3dDb250ZXh0TWVudSkge1xyXG5cdFx0XHRsZXQgcm93Q29udGV4dE1lbnVNb2RlbCA9IHtcclxuXHRcdFx0XHRtb3VzZUV2ZW50OiBlLFxyXG5cdFx0XHRcdGRhdGE6IHJvd0RhdGEsXHJcblx0XHRcdFx0cm93SWR4OiBpZHhcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5vblJvd0NvbnRleHRNZW51LmVtaXQocm93Q29udGV4dE1lbnVNb2RlbCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRhc3luYyBvblBhZ2VDaGFuZ2UocGFnZU51bWJlciwgc2VsZWN0Um93OiBib29sZWFuID0gdHJ1ZSkge1xyXG5cdFx0dGhpcy5yZXF1ZXN0TW9kZWwucGFnZSA9IHBhZ2VOdW1iZXI7XHJcblx0XHRhd2FpdCB0aGlzLnJlbG9hZCh0aGlzLnJlcXVlc3RNb2RlbCk7XHJcblx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSAodGhpcy5ncmlkT3B0aW9ucy5hdXRvU2VsZWN0Rmlyc3RSb3cgPT09IHRydWUpID8gMCA6IG51bGw7XHJcblxyXG5cdFx0aWYgKHNlbGVjdFJvdyA9PT0gdHJ1ZSAmJiB0aGlzLmdyaWRPcHRpb25zLmF1dG9TZWxlY3RGaXJzdFJvdyA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRjb25zdCByb3dEYXRhID0gdGhpcy52aXNpYmxlRGF0YVt0aGlzLnNlbGVjdGVkSW5kZXhdO1xyXG5cdFx0XHR0aGlzLm9uUm93Q2xpY2tlZChyb3dEYXRhLCB0aGlzLnNlbGVjdGVkSW5kZXgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdCg8SFRNTFRhYmxlRWxlbWVudD50aGlzLnRhYmxlUmVmLm5hdGl2ZUVsZW1lbnQpLmZvY3VzKCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyByZWxvYWRHcmlkKGFkZGl0aW9uYWxQYXJhbXM6IGFueSk6IFByb21pc2U8U2xpY2tHcmlkUmVzcG9uc2VNb2RlbD4ge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0YXdhaXQgdGhpcy5yZXNpemVHcmlkKCk7XHJcblx0XHRcdGF3YWl0IHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5sb2NrKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX1JFTE9BREdSSURcIik7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLnVybCA9IHRoaXMuZ3JpZE9wdGlvbnMuZ2V0VXJsO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5odHRwSGVhZGVycyA9IHRoaXMuZ3JpZE9wdGlvbnMuaHR0cEhlYWRlcnM7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLmFkZGl0aW9uYWxQYXJhbXMgPSBhZGRpdGlvbmFsUGFyYW1zO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwucmVjb3Jkc1BlclBhZ2UgPSB0aGlzLnJlY29yZHNQZXJQYWdlO1xyXG5cclxuXHRcdFx0bGV0IHJlc3BvbnNlTW9kZWw6IFNsaWNrR3JpZFJlc3BvbnNlTW9kZWwgPSBhd2FpdCB0aGlzLnJlbG9hZCh0aGlzLnJlcXVlc3RNb2RlbCk7XHJcblx0XHRcdHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5yZWxlYXNlKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX1JFTE9BREdSSURcIik7XHJcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2VNb2RlbCk7XHJcblx0XHR9XHJcblx0XHRjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihlcnJvcik7XHJcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0YXN5bmMgcmVsb2FkR3JpZFdpdGhSZXF1ZXN0TW9kZWwocmVxdWVzdE1vZGVsOiBTbGlja0dyaWRSZXF1ZXN0TW9kZWwpOiBQcm9taXNlPFNsaWNrR3JpZFJlc3BvbnNlTW9kZWw+IHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGF3YWl0IHRoaXMucmVzaXplR3JpZCgpO1xyXG5cdFx0XHRhd2FpdCB0aGlzLmZ1bmN0aW9uTG9ja1NlcnZpY2UubG9jayhcIkdSSURfXCIgKyB0aGlzLnV1aWQgKyBcIl9SRUxPQURHUklEV0lUSFJFUVVFU1RNT0RFTFwiKTtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwgPSByZXF1ZXN0TW9kZWw7XHJcblx0XHRcdGxldCByZXNwb25zZU1vZGVsOiBTbGlja0dyaWRSZXNwb25zZU1vZGVsID0gYXdhaXQgdGhpcy5yZWxvYWQodGhpcy5yZXF1ZXN0TW9kZWwpO1xyXG5cdFx0XHR0aGlzLmZ1bmN0aW9uTG9ja1NlcnZpY2UucmVsZWFzZShcIkdSSURfXCIgKyB0aGlzLnV1aWQgKyBcIl9SRUxPQURHUklEV0lUSFJFUVVFU1RNT0RFTFwiKTtcclxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZU1vZGVsKTtcclxuXHRcdH1cclxuXHRcdGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGVycm9yKTtcclxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgYXN5bmMgcmVsb2FkKHJlcXVlc3RNb2RlbDogU2xpY2tHcmlkUmVxdWVzdE1vZGVsKTogUHJvbWlzZTxTbGlja0dyaWRSZXNwb25zZU1vZGVsPiB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRhd2FpdCB0aGlzLmZ1bmN0aW9uTG9ja1NlcnZpY2UubG9jayhcIkdSSURfXCIgKyB0aGlzLnV1aWQgKyBcIl9SRUxPQURcIik7XHJcblxyXG5cdFx0XHRyZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzID0gW107XHJcblxyXG5cdFx0XHR0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuZm9yRWFjaChjID0+IHtcclxuXHRcdFx0XHRpZiAoYy52aXNpYmxlKSB7XHJcblx0XHRcdFx0XHRpZiAoYy5maWx0ZXJUeXBlID09PSBTbGlja0dyaWRDb2x1bW5GaWx0ZXJUeXBlcy50ZXh0ICYmIGMuZmlsdGVyVGV4dCkge1xyXG5cdFx0XHRcdFx0XHRjLmZpbHRlclRleHQgPSBjLmZpbHRlclRleHQ7XHJcblx0XHRcdFx0XHRcdHJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMucHVzaCg8SVNsaWNrR3JpZFJlcXVlc3RTZWFyY2hNb2RlbD57XHJcblx0XHRcdFx0XHRcdFx0Y29sdW1uTmFtZTogYy5kYXRhRmllbGROYW1lLFxyXG5cdFx0XHRcdFx0XHRcdHNlYXJjaFZhbHVlSWQ6IG51bGwsXHJcblx0XHRcdFx0XHRcdFx0c2VhcmNoVmFsdWVUZXh0OiBjLmZpbHRlclRleHRcclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRlbHNlIGlmIChjLmZpbHRlclR5cGUgPT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLmRyb3Bkb3duICYmIGMuZmlsdGVyRHJvcGRvd25WYWx1ZSkge1xyXG5cdFx0XHRcdFx0XHRjLmZpbHRlckRyb3Bkb3duVmFsdWUgPSBjLmZpbHRlckRyb3Bkb3duVmFsdWU7XHJcblx0XHRcdFx0XHRcdHJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMucHVzaCg8SVNsaWNrR3JpZFJlcXVlc3RTZWFyY2hNb2RlbD57XHJcblx0XHRcdFx0XHRcdFx0Y29sdW1uTmFtZTogYy5kYXRhRmllbGROYW1lLFxyXG5cdFx0XHRcdFx0XHRcdHNlYXJjaFZhbHVlSWQ6IGMuZmlsdGVyRHJvcGRvd25WYWx1ZSxcclxuXHRcdFx0XHRcdFx0XHRzZWFyY2hWYWx1ZVRleHQ6IG51bGxcclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdHJlcXVlc3RNb2RlbC5zb3J0Q29sdW1uID0gbnVsbDtcclxuXHRcdFx0Y29uc3Qgc29ydENvbHVtbiA9IHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5maW5kKHggPT4geC5zb3J0RGlyZWN0aW9uID09PSBTbGlja0dyaWRDb2x1bW5Tb3J0RGlyZWN0aW9uLmFzYyB8fCB4LnNvcnREaXJlY3Rpb24gPT09IFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24uZGVzYyk7XHJcblx0XHRcdGlmIChzb3J0Q29sdW1uKSB7XHJcblx0XHRcdFx0cmVxdWVzdE1vZGVsLnNvcnRDb2x1bW4gPSAoc29ydENvbHVtbi5zb3J0RGlyZWN0aW9uID09PSAwKSA/IG51bGwgOiBzb3J0Q29sdW1uLmRhdGFGaWVsZE5hbWU7XHJcblx0XHRcdFx0cmVxdWVzdE1vZGVsLnNvcnREaXJlY3Rpb24gPSBzb3J0Q29sdW1uLnNvcnREaXJlY3Rpb247XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmIChyZXF1ZXN0TW9kZWwucmVjb3Jkc1BlclBhZ2UgPD0gMClcclxuXHRcdFx0XHRyZXF1ZXN0TW9kZWwucmVjb3Jkc1BlclBhZ2UgPSAyMDtcclxuXHJcblx0XHRcdGxldCByZXNwb25zZU1vZGVsOiBTbGlja0dyaWRSZXNwb25zZU1vZGVsID0gbnVsbDtcclxuXHRcdFx0aWYgKHJlcXVlc3RNb2RlbC51cmwpXHJcblx0XHRcdFx0cmVzcG9uc2VNb2RlbCA9IGF3YWl0IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0RGF0YUZyb21TZXJ2ZXIocmVxdWVzdE1vZGVsKTtcclxuXHRcdFx0ZWxzZVxyXG5cdFx0XHRcdHJlc3BvbnNlTW9kZWwgPSBhd2FpdCB0aGlzLmdyaWRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YU9iaihyZXF1ZXN0TW9kZWwsIHRoaXMuZGF0YSk7XHJcblxyXG5cdFx0XHR0aGlzLmxvYWRlZCA9IHRydWU7XHJcblx0XHRcdHRoaXMudG90YWxSZWNvcmRzID0gcmVzcG9uc2VNb2RlbC50b3RhbFJlY29yZHM7XHJcblx0XHRcdHRoaXMudmlzaWJsZURhdGEgPSByZXNwb25zZU1vZGVsLmRhdGE7XHJcblxyXG5cdFx0XHR0aGlzLmZ1bmN0aW9uTG9ja1NlcnZpY2UucmVsZWFzZShcIkdSSURfXCIgKyB0aGlzLnV1aWQgKyBcIl9SRUxPQURcIik7XHJcblx0XHRcdFByb21pc2UucmVzb2x2ZShyZXNwb25zZU1vZGVsKTtcclxuXHRcdH1cclxuXHRcdGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGVycm9yKTtcclxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHVuc2VsZWN0Um93KCkge1xyXG5cdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gbnVsbDtcclxuXHR9XHJcblxyXG5cdHNlbGVjdFJvdyhyb3dOdW1iZXI6IG51bWJlcikge1xyXG5cdFx0bGV0IHJvd0RhdGEgPSB0aGlzLnZpc2libGVEYXRhW3Jvd051bWJlcl07XHJcblx0XHR0aGlzLm9uUm93Q2xpY2tlZChyb3dEYXRhLCByb3dOdW1iZXIpO1xyXG5cdH1cclxuXHJcblx0Z2V0Q29sdW1uSFRNTChyb3dEYXRhLCBkYXRhRmllbGROYW1lKSB7XHJcblx0XHRjb25zdCBjb2x1bW5IVE1MID0gU2xpY2tVdGlsc1NlcnZpY2UuZ2V0RGVlcE9iamVjdChyb3dEYXRhLCBkYXRhRmllbGROYW1lKTtcclxuXHJcblx0XHRpZiAoY29sdW1uSFRNTCA9PT0gbnVsbCB8fCBjb2x1bW5IVE1MID09PSB1bmRlZmluZWQpXHJcblx0XHRcdHJldHVybiAnJztcclxuXHJcblx0XHRyZXR1cm4gY29sdW1uSFRNTC50b1N0cmluZygpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgc29ydEJ5KHNvcnRDb2x1bW46IElTbGlja0dyaWRDb2x1bW5Nb2RlbCkge1xyXG5cdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZvckVhY2goYyA9PiB7XHJcblx0XHRcdGlmIChzb3J0Q29sdW1uICYmIGMuY29sdW1uS2V5ICE9PSBzb3J0Q29sdW1uLmNvbHVtbktleSkge1xyXG5cclxuXHRcdFx0XHRjLnNvcnREaXJlY3Rpb24gPSBTbGlja0dyaWRDb2x1bW5Tb3J0RGlyZWN0aW9uLm5vbmU7XHJcblx0XHRcdH1cclxuXHRcdH0pXHJcblxyXG5cdFx0aWYgKHNvcnRDb2x1bW4pIHtcclxuXHRcdFx0aWYgKHNvcnRDb2x1bW4uc29ydERpcmVjdGlvbiA9PT0gU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbi5ub25lKSB7XHJcblx0XHRcdFx0dGhpcy52aXNpYmxlQ29sdW1ucy5mb3JFYWNoKGMgPT4gYy5zb3J0RGlyZWN0aW9uID0gU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbi5ub25lKTtcclxuXHRcdFx0XHRzb3J0Q29sdW1uLnNvcnREaXJlY3Rpb24gPSBTbGlja0dyaWRDb2x1bW5Tb3J0RGlyZWN0aW9uLmFzYztcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIGlmIChzb3J0Q29sdW1uLnNvcnREaXJlY3Rpb24gPT09IFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24uYXNjKVxyXG5cdFx0XHRcdHNvcnRDb2x1bW4uc29ydERpcmVjdGlvbiA9IFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24uZGVzYztcclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0c29ydENvbHVtbi5zb3J0RGlyZWN0aW9uID0gU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbi5ub25lO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5zYXZlQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblxyXG5cdFx0dGhpcy5yZXF1ZXN0TW9kZWwucGFnZSA9IDE7XHJcblx0XHRhd2FpdCB0aGlzLnJlbG9hZCh0aGlzLnJlcXVlc3RNb2RlbCk7XHJcblx0XHRpZiAodGhpcy52aXNpYmxlRGF0YSAmJiB0aGlzLnZpc2libGVEYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5ncmlkT3B0aW9ucy5hdXRvU2VsZWN0Rmlyc3RSb3cgPT09IHRydWUpXHJcblx0XHRcdHRoaXMuc2VsZWN0Um93KDApO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgb25TZWFyY2hTZWxlY3QoZGRWYWx1ZSwgY29sdW1uOiBJU2xpY2tHcmlkQ29sdW1uTW9kZWwpIHtcclxuXHRcdGlmICghdGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzKVxyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMgPSBbXTtcclxuXHJcblx0XHRsZXQgY29sdW1uU2VhcmNoVmFsdWVJZHggPSB0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMuZmluZEluZGV4KHggPT4geC5jb2x1bW5OYW1lID09PSBjb2x1bW4uZGF0YUZpZWxkTmFtZSk7XHJcblx0XHRpZiAoY29sdW1uU2VhcmNoVmFsdWVJZHggPj0gMClcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzLnNwbGljZShjb2x1bW5TZWFyY2hWYWx1ZUlkeCwgMSk7XHJcblxyXG5cdFx0Y29sdW1uLmlzRmlsdGVyaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0aWYgKGRkVmFsdWUpIHtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzLnB1c2goPElTbGlja0dyaWRSZXF1ZXN0U2VhcmNoTW9kZWw+e1xyXG5cdFx0XHRcdGNvbHVtbk5hbWU6IGNvbHVtbi5kYXRhRmllbGROYW1lLFxyXG5cdFx0XHRcdHNlYXJjaFZhbHVlSWQ6IGRkVmFsdWUuaWQsXHJcblx0XHRcdFx0c2VhcmNoVmFsdWVUZXh0OiBkZFZhbHVlLnRleHRcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRjb2x1bW4uaXNGaWx0ZXJpbmcgPSB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdGNvbHVtbi5pc0xvY2tlZCA9IGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMucmVxdWVzdE1vZGVsLnBhZ2UgPSAxO1xyXG5cdFx0YXdhaXQgdGhpcy5yZWxvYWQodGhpcy5yZXF1ZXN0TW9kZWwpO1xyXG5cdFx0aWYgKHRoaXMudmlzaWJsZURhdGEgJiYgdGhpcy52aXNpYmxlRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b1NlbGVjdEZpcnN0Um93ID09PSB0cnVlKVxyXG5cdFx0XHR0aGlzLnNlbGVjdFJvdygwKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG9uU2VhcmNoKGNvbHVtbjogSVNsaWNrR3JpZENvbHVtbk1vZGVsKSB7XHJcblx0XHRhd2FpdCBTbGlja1NsZWVwU2VydmljZS5zbGVlcCgpO1xyXG5cclxuXHRcdGlmICghdGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzKVxyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMgPSBbXTtcclxuXHJcblx0XHRpZiAoY29sdW1uLmZpbHRlclRleHQgPT09IGNvbHVtbi5sYXN0U2VhcmNoVGV4dClcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdGNvbHVtbi5sYXN0U2VhcmNoVGV4dCA9IGNvbHVtbi5maWx0ZXJUZXh0O1xyXG5cdFx0Y29sdW1uLmlzRmlsdGVyaW5nID0gISFjb2x1bW4uZmlsdGVyVGV4dDtcclxuXHRcdGlmICghY29sdW1uLmlzRmlsdGVyaW5nKVxyXG5cdFx0XHRjb2x1bW4uaXNMb2NrZWQgPSBmYWxzZTtcclxuXHJcblx0XHRjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hUaW1lb3V0KTtcclxuXHRcdHRoaXMuc2VhcmNoVGltZW91dCA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnNhdmVDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKTtcclxuXHJcblx0XHRcdGxldCBjb2x1bW5TZWFyY2hWYWx1ZUlkeCA9IHRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcy5maW5kSW5kZXgoeCA9PiB4LmNvbHVtbk5hbWUgPT09IGNvbHVtbi5kYXRhRmllbGROYW1lKTtcclxuXHRcdFx0aWYgKGNvbHVtblNlYXJjaFZhbHVlSWR4ID49IDApXHJcblx0XHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzLnNwbGljZShjb2x1bW5TZWFyY2hWYWx1ZUlkeCwgMSk7XHJcblxyXG5cdFx0XHRpZiAoY29sdW1uLmZpbHRlclRleHQpIHtcclxuXHRcdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMucHVzaCg8SVNsaWNrR3JpZFJlcXVlc3RTZWFyY2hNb2RlbD57XHJcblx0XHRcdFx0XHRjb2x1bW5OYW1lOiBjb2x1bW4uZGF0YUZpZWxkTmFtZSxcclxuXHRcdFx0XHRcdHNlYXJjaFZhbHVlVGV4dDogY29sdW1uLmZpbHRlclRleHRcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwucGFnZSA9IDE7XHJcblx0XHRcdGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdFx0aWYgKHRoaXMudmlzaWJsZURhdGEgJiYgdGhpcy52aXNpYmxlRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b1NlbGVjdEZpcnN0Um93ID09PSB0cnVlKVxyXG5cdFx0XHRcdHRoaXMuc2VsZWN0Um93KDApO1xyXG5cdFx0fSwgMjUwKTtcclxuXHR9XHJcblxyXG5cdHRvZ2dsZUxvY2soY29sdW1uOiBJU2xpY2tHcmlkQ29sdW1uTW9kZWwpIHtcclxuXHRcdGNvbHVtbi5pc0xvY2tlZCA9ICFjb2x1bW4uaXNMb2NrZWQ7XHJcblxyXG5cdFx0dGhpcy5zYXZlQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyByZXNldEZpbHRlcihjb2x1bW46IElTbGlja0dyaWRDb2x1bW5Nb2RlbCkge1xyXG5cdFx0Y29sdW1uLmlzRmlsdGVyaW5nID0gZmFsc2U7XHJcblx0XHRjb2x1bW4uaXNMb2NrZWQgPSBmYWxzZTtcclxuXHJcblx0XHRjb2x1bW4uZmlsdGVyVGV4dCA9IG51bGw7XHJcblx0XHRjb2x1bW4ubGFzdFNlYXJjaFRleHQgPSBudWxsO1xyXG5cdFx0Y29sdW1uLmZpbHRlckRyb3Bkb3duVmFsdWUgPSBudWxsO1xyXG5cdFx0dGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzID0gdGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzLmZpbHRlcih4ID0+IHguY29sdW1uTmFtZSAhPT0gY29sdW1uLmRhdGFGaWVsZE5hbWUpO1xyXG5cclxuXHRcdHRoaXMuc2F2ZUNvbHVtbnNUb0xvY2FsU3RvcmFnZSgpO1xyXG5cclxuXHRcdHRoaXMucmVxdWVzdE1vZGVsLnBhZ2UgPSAxO1xyXG5cdFx0YXdhaXQgdGhpcy5yZWxvYWQodGhpcy5yZXF1ZXN0TW9kZWwpO1xyXG5cdFx0aWYgKHRoaXMudmlzaWJsZURhdGEgJiYgdGhpcy52aXNpYmxlRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b1NlbGVjdEZpcnN0Um93ID09PSB0cnVlKVxyXG5cdFx0XHR0aGlzLnNlbGVjdFJvdygwKTtcclxuXHR9XHJcblxyXG5cdG9wZW5Db2x1bW5TZWxlY3REaWFsb2coKSB7XHJcblx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMgPSBbLi4udGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zXTtcclxuXHRcdHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5kaXNwbGF5T3JkZXIgPiBiLmRpc3BsYXlPcmRlcikgPyAxIDogKGEuZGlzcGxheU9yZGVyIDwgYi5kaXNwbGF5T3JkZXIpID8gLTEgOiAwKTtcclxuXHJcblx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ1JlZi5zaG93RGlhbG9nKCk7XHJcblx0fVxyXG5cclxuXHRvbkNvbHVtbkRyb3AoZTogYW55KSB7XHJcblx0XHRjb25zb2xlLmxvZyhlKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG9uQ29sdW1uUmVvcmRlcihlOiBudW1iZXJbXSkge1xyXG5cdFx0Y29uc3Qgb2xkT3JkZXIgPSBlWzBdO1xyXG5cdFx0Y29uc3QgbmV3T3JkZXIgPSBlWzFdO1xyXG5cclxuXHRcdGlmIChvbGRPcmRlciA9PT0gbmV3T3JkZXIpXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHRjb25zdCBzZWxlY3RlZENvbCA9IHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1ucy5zcGxpY2Uob2xkT3JkZXIsIDEpWzBdO1xyXG5cdFx0c2VsZWN0ZWRDb2wuZGlzcGxheU9yZGVyID0gbmV3T3JkZXI7XHJcblxyXG5cdFx0bGV0IGN1cnJlbnRPcmRlciA9IDA7XHJcblx0XHQvLyBFdmVyeXRoaW5nIHVwIHRvIHRoZSBuZXcgb3JkZXIgcmVvcmRlcmVkIGZyb20gMFxyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0Ly8gSWYgd2UncmUgYXQgbmV3T3JkZXIsIGxlYXZlIGEgc3BvdFxyXG5cdFx0XHRpZiAoaSA9PT0gbmV3T3JkZXIpXHJcblx0XHRcdFx0Y3VycmVudE9yZGVyKys7XHJcblx0XHRcdHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1uc1tpXS5kaXNwbGF5T3JkZXIgPSBjdXJyZW50T3JkZXIrKztcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMgPSBbLi4udGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zLCBzZWxlY3RlZENvbF07XHJcblx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMgPSB0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMuc29ydCgoYSwgYikgPT4gKGEuZGlzcGxheU9yZGVyID4gYi5kaXNwbGF5T3JkZXIpID8gMSA6IChhLmRpc3BsYXlPcmRlciA8IGIuZGlzcGxheU9yZGVyKSA/IC0xIDogMCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBhZGROZXdGYXZvcml0ZSgpIHtcclxuXHRcdHRoaXMubmV3RmF2b3JpdGVUZXh0ID0gJyc7XHJcblxyXG5cdFx0Y29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IHRoaXMuYWRkTmV3RmF2b3JpdGVEaWFsb2dSZWYuY29uZmlybSgpO1xyXG5cclxuXHRcdGlmIChjb25maXJtUmVzdWx0ID09PSBTbGlja0NvbmZpcm1EaWFsb2dSZXN1bHRzLk9rICYmIHRoaXMubmV3RmF2b3JpdGVUZXh0KSB7XHJcblx0XHRcdC8vIFNhdmUgdGhlIHByZXZpb3VzIHNlbGVjdGlvbiB0byBsb2NhbHN0b3JhZ2VcclxuXHRcdFx0dGhpcy5zYXZlRGlhbG9nQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblxyXG5cdFx0XHR0aGlzLmZhdm9yaXRlcy5wdXNoKG5ldyBEcm9wRG93bk1vZGVsKHRoaXMubmV3RmF2b3JpdGVUZXh0KSk7XHJcblxyXG5cdFx0XHR0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPSB0aGlzLm5ld0Zhdm9yaXRlVGV4dDtcclxuXHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJHUklEX1wiICsgdGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5ICsgXCJfU0VMRUNURURfRkFWT1JJVEVcIiwgdGhpcy5zZWxlY3RlZEZhdm9yaXRlKTtcclxuXHJcblx0XHRcdGNvbnN0IGZhdm9yaXRlc0pzb24gPSBKU09OLnN0cmluZ2lmeSh0aGlzLmZhdm9yaXRlcy5tYXAoeCA9PiB4LnRleHQpKTtcclxuXHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJHUklEX1wiICsgdGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5ICsgXCJfRkFWT1JJVEVTXCIsIGZhdm9yaXRlc0pzb24pO1xyXG5cclxuXHRcdFx0Ly8gU2F2ZSB0aGUgbmV3IG9uZSB0byBsb2NhbHN0b3JhZ2VcclxuXHRcdFx0dGhpcy5zYXZlRGlhbG9nQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRsb2FkRmF2b3JpdGUoZmF2b3JpdGU6IERyb3BEb3duTW9kZWwpIHtcclxuXHRcdHRoaXMuc2F2ZURpYWxvZ0NvbHVtbnNUb0xvY2FsU3RvcmFnZSgpO1xyXG5cclxuXHRcdHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9IGZhdm9yaXRlLnRleHQ7XHJcblx0XHRsZXQgZ3JpZENvbHVtbnNKc29uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3RoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9PT0gJ0RlZmF1bHQnID8gJycgOiAnXycgKyB0aGlzLnNlbGVjdGVkRmF2b3JpdGV9YCk7XHJcblx0XHRpZiAoZ3JpZENvbHVtbnNKc29uKSB7XHJcblx0XHRcdHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1ucyA9IDxJU2xpY2tHcmlkQ29sdW1uTW9kZWxbXT5KU09OLnBhcnNlKGdyaWRDb2x1bW5zSnNvbik7XHJcblx0XHRcdHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5kaXNwbGF5T3JkZXIgPiBiLmRpc3BsYXlPcmRlcikgPyAxIDogKGEuZGlzcGxheU9yZGVyIDwgYi5kaXNwbGF5T3JkZXIpID8gLTEgOiAwKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFzeW5jIHNldEZhdm9yaXRlKGZhdm9yaXRlOiBzdHJpbmcpIHtcclxuXHRcdHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9IGZhdm9yaXRlO1xyXG5cdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJHUklEX1wiICsgdGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5ICsgXCJfU0VMRUNURURfRkFWT1JJVEVcIiwgdGhpcy5zZWxlY3RlZEZhdm9yaXRlKTtcclxuXHJcblx0XHRsZXQgZ3JpZENvbHVtbnNKc29uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3RoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9PT0gJ0RlZmF1bHQnID8gJycgOiAnXycgKyB0aGlzLnNlbGVjdGVkRmF2b3JpdGV9YCk7XHJcblx0XHR0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMgPSA8SVNsaWNrR3JpZENvbHVtbk1vZGVsW10+SlNPTi5wYXJzZShncmlkQ29sdW1uc0pzb24pO1xyXG5cdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLnNvcnQoKGEsIGIpID0+IChhLmRpc3BsYXlPcmRlciA+IGIuZGlzcGxheU9yZGVyKSA/IDEgOiAoYS5kaXNwbGF5T3JkZXIgPCBiLmRpc3BsYXlPcmRlcikgPyAtMSA6IDApO1xyXG5cclxuXHRcdHRoaXMudmlzaWJsZUNvbHVtbnMgPSB0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy52aXNpYmxlID09PSB0cnVlKTtcclxuXHRcdHRoaXMudmlzaWJsZUNvbHVtbnMgPSB0aGlzLnZpc2libGVDb2x1bW5zLnNvcnQoKGEsIGIpID0+IChhLmRpc3BsYXlPcmRlciA+IGIuZGlzcGxheU9yZGVyKSA/IDEgOiAoYS5kaXNwbGF5T3JkZXIgPCBiLmRpc3BsYXlPcmRlcikgPyAtMSA6IDApO1xyXG5cdFx0dGhpcy5zaG93U2VhcmNoUm93ID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoYyA9PiBjLmZpbHRlclR5cGUgIT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLm5vbmUpLmxlbmd0aCA+IDA7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gMTtcclxuXHRcdHRoaXMucmVxdWVzdE1vZGVsLnJlY29yZHNQZXJQYWdlID0gdGhpcy5yZWNvcmRzUGVyUGFnZTtcclxuXHRcdGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHR9XHJcblxyXG5cdG9uU2F2ZUNvbHVtbnMoKSB7XHJcblx0XHR0aGlzLnNhdmVEaWFsb2dDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKTtcclxuXHJcblx0XHR0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMgPSBbLi4udGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zXTtcclxuXHJcblx0XHQvLyBNYWtlIHN1cmUgaWYgdGhleSd2ZSBoaWRkZW4gYSBjb2x1bW4gdGhhdCB3ZSBhcmVuJ3QgdHJ5aW5nIHRvIHNvcnQgb3IgZmlsdGVyIGJ5IHRoaXMgY29sdW1uXHJcblx0XHR0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuZm9yRWFjaCh4ID0+IHtcclxuXHRcdFx0aWYgKHgudmlzaWJsZSA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHR4LmZpbHRlckRyb3Bkb3duVmFsdWUgPSBudWxsO1xyXG5cdFx0XHRcdHguZmlsdGVyVGV4dCA9IG51bGw7XHJcblx0XHRcdFx0eC5pc0ZpbHRlcmluZyA9IGZhbHNlO1xyXG5cdFx0XHRcdHguaXNMb2NrZWQgPSBmYWxzZTtcclxuXHRcdFx0XHR4Lmxhc3RTZWFyY2hUZXh0ID0gbnVsbDtcclxuXHRcdFx0XHR4LnNvcnREaXJlY3Rpb24gPSBudWxsO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZpbHRlcihjID0+IGMudmlzaWJsZSA9PT0gdHJ1ZSk7XHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5kaXNwbGF5T3JkZXIgPiBiLmRpc3BsYXlPcmRlcikgPyAxIDogKGEuZGlzcGxheU9yZGVyIDwgYi5kaXNwbGF5T3JkZXIpID8gLTEgOiAwKTtcclxuXHRcdHRoaXMuc2hvd1NlYXJjaFJvdyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGMgPT4gYy5maWx0ZXJUeXBlICE9PSBTbGlja0dyaWRDb2x1bW5GaWx0ZXJUeXBlcy5ub25lKS5sZW5ndGggPiAwO1xyXG5cclxuXHRcdHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nUmVmLmhpZGVEaWFsb2coKTtcclxuXHRcdHRoaXMucmVzaXplR3JpZCgpO1xyXG5cclxuXHRcdGlmICh0aGlzLm9uRmF2b3JpdGVzTW9kaWZpZWQpIHtcclxuXHRcdFx0Y29uc3QgZ3JpZEZhdm9yaXRlczogSVNsaWNrR3JpZEZhdm9yaXRlTW9kZWxbXSA9IHRoaXMuZmF2b3JpdGVzLm1hcChmYXZvcml0ZSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgZ3JpZEZhdm9yaXRlID0gbmV3IFNsaWNrR3JpZEZhdm9yaXRlTW9kZWwoKTtcclxuXHRcdFx0XHRncmlkRmF2b3JpdGUuZmF2b3JpdGVOYW1lID0gZmF2b3JpdGUudGV4dDtcclxuXHRcdFx0XHRjb25zdCBzdWZmaXggPSBncmlkRmF2b3JpdGUuZmF2b3JpdGVOYW1lID09PSAnRGVmYXVsdCcgPyAnJyA6ICgnXycgKyBncmlkRmF2b3JpdGUuZmF2b3JpdGVOYW1lKTtcclxuXHRcdFx0XHRjb25zdCBkaWFsb2dDb2x1bW5zSlNPTiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBHUklEXyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fV9DT0xVTU5TJHtzdWZmaXh9YCk7XHJcblx0XHRcdFx0Z3JpZEZhdm9yaXRlLmNvbHVtbnMgPSBKU09OLnBhcnNlKGRpYWxvZ0NvbHVtbnNKU09OKTtcclxuXHRcdFx0XHRyZXR1cm4gZ3JpZEZhdm9yaXRlO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdHRoaXMub25GYXZvcml0ZXNNb2RpZmllZC5lbWl0KGdyaWRGYXZvcml0ZXMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0b25DYW5jZWxDb2x1bW5zKCkge1xyXG5cdFx0dGhpcy5jb2x1bW5TZWxlY3REaWFsb2dSZWYuaGlkZURpYWxvZygpO1xyXG5cdH1cclxuXHJcblx0c2F2ZURpYWxvZ0NvbHVtbnNUb0xvY2FsU3RvcmFnZSgpIHtcclxuXHRcdGxldCBkaWFsb2dDb2x1bW5zSlNPTiA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1ucyk7XHJcblx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5KSB7XHJcblx0XHRcdGNvbnN0IHN1ZmZpeCA9IHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9PT0gJ0RlZmF1bHQnID8gJycgOiAoJ18nICsgdGhpcy5zZWxlY3RlZEZhdm9yaXRlKTtcclxuXHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3N1ZmZpeH1gLCBkaWFsb2dDb2x1bW5zSlNPTik7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRzYXZlQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCkge1xyXG5cdFx0bGV0IGdyaWRDb2x1bW5zSlNPTiA9IEpTT04uc3RyaW5naWZ5KHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucyk7XHJcblx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5KSB7XHJcblx0XHRcdGNvbnN0IHN1ZmZpeCA9IHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9PT0gJ0RlZmF1bHQnID8gJycgOiAoJ18nICsgdGhpcy5zZWxlY3RlZEZhdm9yaXRlKTtcclxuXHJcblx0XHRcdGxldCBncmlkQ29sdW1uc0pzb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgR1JJRF8ke3RoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleX1fQ09MVU1OUyR7c3VmZml4fWApO1xyXG5cdFx0XHRcclxuXHRcdFx0aWYgKGdyaWRDb2x1bW5zSnNvbikge1xyXG5cdFx0XHRcdGxldCBjb2x1bW5zID0gPElTbGlja0dyaWRDb2x1bW5Nb2RlbFtdPkpTT04ucGFyc2UoZ3JpZENvbHVtbnNKc29uKTtcclxuXHJcblx0XHRcdFx0bGV0IGRpc3BsYXlPcmRlciA9IDA7XHJcblx0XHRcdFx0Y29sdW1ucy5mb3JFYWNoKGMgPT4ge1xyXG5cdFx0XHRcdFx0bGV0IGNvbHVtbiA9IHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5maW5kKGdyaWRDb2x1bW4gPT4gZ3JpZENvbHVtbi5kYXRhRmllbGROYW1lID09PSBjLmRhdGFGaWVsZE5hbWUpO1xyXG5cdFx0XHRcdFx0aWYgKGNvbHVtbikge1xyXG5cdFx0XHRcdFx0XHRjLmRpc3BsYXlPcmRlciA9IGRpc3BsYXlPcmRlcjtcclxuXHRcdFx0XHRcdFx0Yy53aWR0aCA9IGNvbHVtbi53aWR0aDtcclxuXHRcdFx0XHRcdFx0Yy5maWx0ZXJEcm9wZG93blZhbHVlID0gY29sdW1uLmZpbHRlckRyb3Bkb3duVmFsdWU7XHJcblx0XHRcdFx0XHRcdGMuZmlsdGVyVGV4dCA9IGNvbHVtbi5maWx0ZXJUZXh0O1xyXG5cdFx0XHRcdFx0XHRjLmlzTG9ja2VkID0gY29sdW1uLmlzTG9ja2VkO1xyXG5cdFx0XHRcdFx0XHRjLmlzRmlsdGVyaW5nID0gY29sdW1uLmlzRmlsdGVyaW5nO1xyXG5cdFx0XHRcdFx0XHRjLnNvcnREaXJlY3Rpb24gPSBjb2x1bW4uc29ydERpcmVjdGlvbjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRkaXNwbGF5T3JkZXIrKztcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRjb2x1bW5zID0gY29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5kaXNwbGF5T3JkZXIgPiBiLmRpc3BsYXlPcmRlcikgPyAxIDogKGEuZGlzcGxheU9yZGVyIDwgYi5kaXNwbGF5T3JkZXIpID8gLTEgOiAwKTtcclxuXHRcdFx0XHRncmlkQ29sdW1uc0pTT04gPSBKU09OLnN0cmluZ2lmeShjb2x1bW5zKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3N1ZmZpeH1gLCBncmlkQ29sdW1uc0pTT04pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLm9uRmF2b3JpdGVzTW9kaWZpZWQpIHtcclxuXHRcdFx0Y29uc3QgZ3JpZEZhdm9yaXRlczogSVNsaWNrR3JpZEZhdm9yaXRlTW9kZWxbXSA9IHRoaXMuZmF2b3JpdGVzLm1hcChmYXZvcml0ZSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgZ3JpZEZhdm9yaXRlID0gbmV3IFNsaWNrR3JpZEZhdm9yaXRlTW9kZWwoKTtcclxuXHRcdFx0XHRncmlkRmF2b3JpdGUuZmF2b3JpdGVOYW1lID0gZmF2b3JpdGUudGV4dDtcclxuXHRcdFx0XHRjb25zdCBzdWZmaXggPSBncmlkRmF2b3JpdGUuZmF2b3JpdGVOYW1lID09PSAnRGVmYXVsdCcgPyAnJyA6ICgnXycgKyBncmlkRmF2b3JpdGUuZmF2b3JpdGVOYW1lKTtcclxuXHRcdFx0XHRjb25zdCBkaWFsb2dDb2x1bW5zSlNPTiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBHUklEXyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fV9DT0xVTU5TJHtzdWZmaXh9YCk7XHJcblx0XHRcdFx0Z3JpZEZhdm9yaXRlLmNvbHVtbnMgPSBKU09OLnBhcnNlKGRpYWxvZ0NvbHVtbnNKU09OKTtcclxuXHRcdFx0XHRyZXR1cm4gZ3JpZEZhdm9yaXRlO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdHRoaXMub25GYXZvcml0ZXNNb2RpZmllZC5lbWl0KGdyaWRGYXZvcml0ZXMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cdHByaXZhdGUgYXN5bmMgcmVzaXplR3JpZChmb3JjZVJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGFzeW5jIChyZXNvbHZlKSA9PiB7XHJcblx0XHRcdGlmICghZm9yY2VSZWZyZXNoICYmIHRoaXMuc2xpY2tHcmlkUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID09PSB0aGlzLnNsaWNrR3JpZEhlaWdodCkge1xyXG5cdFx0XHRcdHJlc29sdmUoKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICh0aGlzLnJlY29yZHNQZXJQYWdlVmFsdWUgPT09ICdBdXRvJykge1xyXG5cdFx0XHRcdGF3YWl0IHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5sb2NrKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX1JFU0laRUdSSURcIik7XHJcblxyXG5cdFx0XHRcdHRoaXMuc2xpY2tHcmlkSGVpZ2h0ID0gdGhpcy50YWJsZUNvbnRhaW5lclJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuXHJcblx0XHRcdFx0Y29uc3QgdGVzdFJvdyA9ICg8SFRNTFRhYmxlRWxlbWVudD50aGlzLnRhYmxlUmVmLm5hdGl2ZUVsZW1lbnQpLmluc2VydFJvdygwKTtcclxuXHRcdFx0XHRjb25zdCB0ZXN0Q2VsbCA9IHRlc3RSb3cuaW5zZXJ0Q2VsbCgwKTtcclxuXHRcdFx0XHR0ZXN0Q2VsbC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcclxuXHRcdFx0XHR0ZXN0Q2VsbC5pbm5lckhUTUwgPSBcIiZOQlNQXCI7XHJcblx0XHRcdFx0Y29uc3Qgcm93SGVpZ2h0ID0gdGVzdENlbGwub2Zmc2V0SGVpZ2h0O1xyXG5cdFx0XHRcdCg8SFRNTFRhYmxlRWxlbWVudD50aGlzLnRhYmxlUmVmLm5hdGl2ZUVsZW1lbnQpLmRlbGV0ZVJvdygwKTtcclxuXHJcblx0XHRcdFx0bGV0IGhlYWRlckhlaWdodCA9IHRoaXMudGFibGVIZWFkZXJSb3dSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgKyAyO1xyXG5cdFx0XHRcdGlmICh0aGlzLnRhYmxlSGVhZGVyU2VhcmNoUm93UmVmKVxyXG5cdFx0XHRcdFx0aGVhZGVySGVpZ2h0ICs9IHRoaXMudGFibGVIZWFkZXJTZWFyY2hSb3dSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgKyAyO1xyXG5cdFx0XHRcdGNvbnN0IGNsaWVudEhlaWdodCA9IHRoaXMudGFibGVDb250YWluZXJSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgLSBoZWFkZXJIZWlnaHQ7XHJcblx0XHRcdFx0dGhpcy5yZWNvcmRzUGVyUGFnZSA9IHBhcnNlSW50KCgoY2xpZW50SGVpZ2h0IC8gcm93SGVpZ2h0KSAtIDEpLnRvRml4ZWQoMCkpO1xyXG5cdFx0XHRcdGxldCBhY3R1YWxSb3dIZWlnaHQgPSBwYXJzZUludCgoY2xpZW50SGVpZ2h0IC8gdGhpcy5yZWNvcmRzUGVyUGFnZSkudG9GaXhlZCgwKSkgLSAxO1xyXG5cdFx0XHRcdGlmIChhY3R1YWxSb3dIZWlnaHQgPCByb3dIZWlnaHQpXHJcblx0XHRcdFx0XHRhY3R1YWxSb3dIZWlnaHQgPSByb3dIZWlnaHQ7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGFsbFJvd3MgPSA8SFRNTEVsZW1lbnRbXT50aGlzLnNsaWNrR3JpZFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIudGFibGUgdGJvZHkgdHJcIik7XHJcblx0XHRcdFx0YWxsUm93cy5mb3JFYWNoKHJvdyA9PiB7XHJcblx0XHRcdFx0XHRyb3cuc3R5bGUuaGVpZ2h0ID0gKGFjdHVhbFJvd0hlaWdodCkgKyBcInB4XCI7XHJcblx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5yZWxlYXNlKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX1JFU0laRUdSSURcIik7XHJcblxyXG5cdFx0XHRcdHRoaXMuZ3JpZE9wYWNpdHkgPSAxO1xyXG5cdFx0XHRcdHRoaXMuc2hvd1Rlc3RSb3cgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0cmVzb2x2ZSgpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdGF3YWl0IFNsaWNrU2xlZXBTZXJ2aWNlLnNsZWVwKCk7XHJcblxyXG5cdFx0XHRcdHRoaXMucmVjb3Jkc1BlclBhZ2UgPSBwYXJzZUludCh0aGlzLnJlY29yZHNQZXJQYWdlVmFsdWUpO1xyXG5cdFx0XHRcdHRoaXMuZ3JpZE9wYWNpdHkgPSAxO1xyXG5cdFx0XHRcdHJlc29sdmUoKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG59Il19
792
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2stZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9zbGljay1ncmlkL3NsaWNrLWdyaWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUE4RCxlQUFlLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwTyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQXlCLDBCQUEwQixFQUFFLDRCQUE0QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFNUgsT0FBTyxFQUFFLHFCQUFxQixFQUFnQyxNQUFNLDRCQUE0QixDQUFDO0FBRWpHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzFGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQzdILE9BQU8sRUFBMkIsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU5RixNQUFNLGFBQWE7SUFDbEIsWUFBWSxJQUFZO1FBQ3ZCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbEIsQ0FBQztDQUlEO0FBT0QsTUFBTSxPQUFPLGtCQUFrQjtJQThFOUIsWUFBb0IsV0FBNkIsRUFDeEMsbUJBQTZDLEVBQzdDLGNBQWlDO1FBRnRCLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUN4Qyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQTBCO1FBQzdDLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQS9FcEIsZUFBVSxHQUFHLG1CQUFtQixDQUFDO1FBSTlDLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFDekIsWUFBTyxHQUFZLElBQUksQ0FBQztRQUN4QixVQUFLLEdBQVksSUFBSSxDQUFDO1FBQ3RCLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUV6QixrQkFBYSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzNELHFCQUFnQixHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzlELHFCQUFnQixHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzlELHdCQUFtQixHQUF3QixJQUFJLFlBQVksRUFBUyxDQUFDO1FBZXZFLGdCQUFXLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFHL0Msa0JBQWEsR0FBVyxJQUFJLENBQUM7UUFDN0IsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFNaEIsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUUvQixnQkFBVyxHQUFXLENBQUMsQ0FBQztRQUd4QixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzVCLGdCQUFXLEdBQVUsRUFBRSxDQUFDO1FBR3hCLHdCQUFtQixHQUFXLE1BQU0sQ0FBQztRQUc3QixrQkFBYSxHQUFpQixJQUFJLENBQUM7UUE0QjFDLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLHFCQUFxQixFQUFFLENBQUM7SUFDakQsQ0FBQztJQXZCSyxRQUFRLENBQUMsS0FBYyxFQUFFLGFBQTBCOztZQUN4RCxxR0FBcUc7WUFDckcsd0JBQXdCO1lBQ3hCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3JGLE9BQU87WUFFUixJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFO2dCQUMxRSxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxHQUFTLEVBQUU7b0JBQzFDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO29CQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7b0JBQzNCLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO29CQUN2RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDaEMsQ0FBQyxDQUFBLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDUjtRQUNGLENBQUM7S0FBQTtJQVNLLFFBQVE7O1lBQ2IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdkMsQ0FBQztLQUFBO0lBRUssZUFBZTs7WUFDcEIsMEZBQTBGO1lBQzFGLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDN0MsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLElBQUksQ0FBQyxRQUFRO2dCQUNHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFELENBQUM7S0FBQTtJQUVLLFlBQVksQ0FBQyxDQUFnQjs7WUFDbEMsU0FBUztZQUNULElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQzVFLFlBQVksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBRW5DLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsRUFBRTtvQkFDM0IsSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRTt3QkFDekIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO3dCQUNuQixJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQzt3QkFDdkIsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7d0JBQ2pELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7cUJBQzdDO2lCQUNEO2dCQUVELElBQUksQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ3JELElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDaEQsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2FBQ1I7WUFDRCxXQUFXO1lBQ1gsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUUsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsWUFBWTtvQkFDM0YsT0FBTztnQkFFUixZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3JCLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO29CQUM5QyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUU7d0JBQzVGLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDbkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7d0JBQ3ZCLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO3FCQUNqRDtpQkFDRDtnQkFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUNyRCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2hELENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzthQUNSO1FBQ0YsQ0FBQztLQUFBO0lBRUssV0FBVyxDQUFDLE9BQXNCOztZQUN2QyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUU7Z0JBQ3JCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEtBQUssSUFBSTtvQkFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2FBQ3JGO1lBRUQsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFO2dCQUNwQiw0Q0FBNEM7Z0JBQzVDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEtBQUssSUFBSTtvQkFDcEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2FBQ25GO1lBRUQsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFO2dCQUNsQiw0Q0FBNEM7Z0JBQzVDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEtBQUssSUFBSTtvQkFDbEMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2FBQy9FO1lBRUQsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFO2dCQUN4QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxLQUFLLElBQUk7b0JBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUM7Z0JBRTNDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEtBQUssSUFBSTtvQkFDcEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztnQkFFekMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssS0FBSyxJQUFJO29CQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO2dCQUVyQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUN0QztZQUVELElBQUksT0FBTyxDQUFDLElBQUksRUFBRTtnQkFDakIsMEhBQTBIO2dCQUMxSCxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDLENBQUM7Z0JBQzNFLHVFQUF1RTtnQkFDdkUsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJO29CQUNwQyxNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDekIsNEVBQTRFO2dCQUM1RSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztnQkFDdkQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDckMsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixLQUFLLElBQUk7b0JBQ2xHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDLENBQUM7YUFDeEU7UUFDRixDQUFDO0tBQUE7SUFFRCxXQUFXO1FBQ1YsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVLLHdCQUF3QixDQUFDLGNBQXNCOztZQUNwRCxJQUFJLENBQUMsY0FBYztnQkFDbEIsT0FBTztZQUVSLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxjQUFjLENBQUM7WUFDMUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEdBQUcsbUJBQW1CLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFFL0YsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7WUFDckIsTUFBTSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUV2RCxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztZQUNyQixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxDQUFDO0tBQUE7SUFFRCxvQkFBb0IsQ0FBQyxDQUFhLEVBQUUsU0FBaUI7UUFDcEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7UUFDOUIsSUFBSSxHQUFHLEdBQXlCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdHLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUU5QyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFFaEQsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELHNCQUFzQixDQUFDLENBQWEsRUFBRSxTQUFpQjtRQUN0RCxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDL0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQzVDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxDQUFhO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtZQUNuQixPQUFPO1FBRVIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUMzQixJQUFJLElBQUksR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ2hELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDdkYsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7UUFDdkQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUN6RCxDQUFDO0lBRU8sU0FBUyxDQUFDLENBQUM7UUFDbEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELGlCQUFpQjtRQUNoQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDekIsQ0FBQztJQUVELFlBQVksQ0FBQyxTQUFjLEVBQUUsa0JBQTJCLEtBQUs7UUFDNUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFcEMsSUFBSSxlQUFlLEtBQUssSUFBSSxFQUFFO1lBQzdCLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbEI7YUFDSTtZQUNKLElBQUksSUFBSSxDQUFDLGFBQWE7Z0JBQ3JCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUN0QjtJQUNGLENBQUM7SUFFRCxZQUFZLENBQUMsTUFBYyxFQUFFLE1BQVc7UUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkMsQ0FBQztJQUVELFlBQVksQ0FBQyxPQUFZLEVBQUUsR0FBVztRQUNyQyxJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQztRQUN6QixZQUFZLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1QsQ0FBQztJQUVELGtCQUFrQixDQUFDLE9BQVksRUFBRSxHQUFHO1FBQ25DLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDO1FBQ3pCLFlBQVksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxDQUFhLEVBQUUsT0FBTyxFQUFFLEdBQUc7UUFDbEQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDMUIsSUFBSSxtQkFBbUIsR0FBRztnQkFDekIsVUFBVSxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsTUFBTSxFQUFFLEdBQUc7YUFDWCxDQUFBO1lBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1NBQ2hEO0lBQ0YsQ0FBQztJQUVLLFlBQVksQ0FBQyxVQUFVLEVBQUUsWUFBcUIsSUFBSTs7WUFDdkQsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7WUFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBRS9FLElBQUksU0FBUyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixLQUFLLElBQUksRUFBRTtnQkFDdkUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3JELElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUMvQztZQUVrQixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6RCxDQUFDO0tBQUE7SUFFSyxVQUFVLENBQUMsZ0JBQXFCOztZQUNyQyxJQUFJO2dCQUNILE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN4QixNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDLENBQUM7Z0JBQ3pFLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO2dCQUNoRCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztnQkFFdkQsSUFBSSxhQUFhLEdBQTJCLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ2pGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDLENBQUM7Z0JBQ3RFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUN0QztZQUNELE9BQU8sS0FBSyxFQUFFO2dCQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM3QjtRQUVGLENBQUM7S0FBQTtJQUVLLDBCQUEwQixDQUFDLFlBQW1DOztZQUNuRSxJQUFJO2dCQUNILE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN4QixNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsNkJBQTZCLENBQUMsQ0FBQztnQkFDekYsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQzNCLElBQUksYUFBYSxHQUEyQixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUNqRixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLDZCQUE2QixDQUFDLENBQUM7Z0JBQ3RGLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUN0QztZQUNELE9BQU8sS0FBSyxFQUFFO2dCQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM3QjtRQUNGLENBQUM7S0FBQTtJQUVhLE1BQU0sQ0FBQyxZQUFtQzs7WUFDdkQsSUFBSTtnQkFDSCxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLENBQUM7Z0JBRXJFLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFFdkQsSUFBSSxhQUFhLEdBQTJCLElBQUksQ0FBQztnQkFDakQsSUFBSSxZQUFZLENBQUMsR0FBRztvQkFDbkIsYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQzs7b0JBRXZFLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFcEYsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQztnQkFDL0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDO2dCQUV0QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDO2dCQUNsRSxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQy9CO1lBQ0QsT0FBTyxLQUFLLEVBQUU7Z0JBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckIsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzdCO1FBQ0YsQ0FBQztLQUFBO0lBRUQsV0FBVztRQUNWLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRCxTQUFTLENBQUMsU0FBaUI7UUFDMUIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsYUFBYSxDQUFDLE9BQU8sRUFBRSxhQUFhO1FBQ25DLE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFM0UsSUFBSSxVQUFVLEtBQUssSUFBSSxJQUFJLFVBQVUsS0FBSyxTQUFTO1lBQ2xELE9BQU8sRUFBRSxDQUFDO1FBRVgsT0FBTyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVLLE1BQU0sQ0FBQyxVQUFpQzs7WUFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNwQyxJQUFJLFVBQVUsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLFVBQVUsQ0FBQyxTQUFTLEVBQUU7b0JBRXZELENBQUMsQ0FBQyxhQUFhLEdBQUcsNEJBQTRCLENBQUMsSUFBSSxDQUFDO2lCQUNwRDtZQUNGLENBQUMsQ0FBQyxDQUFBO1lBRUYsSUFBSSxVQUFVLEVBQUU7Z0JBQ2YsSUFBSSxVQUFVLENBQUMsYUFBYSxLQUFLLDRCQUE0QixDQUFDLElBQUksRUFBRTtvQkFDbkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxHQUFHLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN0RixVQUFVLENBQUMsYUFBYSxHQUFHLDRCQUE0QixDQUFDLEdBQUcsQ0FBQztpQkFDNUQ7cUJBQ0ksSUFBSSxVQUFVLENBQUMsYUFBYSxLQUFLLDRCQUE0QixDQUFDLEdBQUc7b0JBQ3JFLFVBQVUsQ0FBQyxhQUFhLEdBQUcsNEJBQTRCLENBQUMsSUFBSSxDQUFDO3FCQUN6RDtvQkFDSixVQUFVLENBQUMsYUFBYSxHQUFHLDRCQUE0QixDQUFDLElBQUksQ0FBQztpQkFDN0Q7YUFDRDtZQUVELElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBRWpDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUMzQixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3JDLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsS0FBSyxJQUFJO2dCQUNsRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLENBQUM7S0FBQTtJQUVLLGNBQWMsQ0FBQyxPQUFPLEVBQUUsTUFBNkI7O1lBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQjtnQkFDeEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7WUFFM0MsSUFBSSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3RILElBQUksb0JBQW9CLElBQUksQ0FBQztnQkFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFdEUsTUFBTSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFFM0IsSUFBSSxPQUFPLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQStCO29CQUN2RSxVQUFVLEVBQUUsTUFBTSxDQUFDLGFBQWE7b0JBQ2hDLGFBQWEsRUFBRSxPQUFPLENBQUMsRUFBRTtvQkFDekIsZUFBZSxFQUFFLE9BQU8sQ0FBQyxJQUFJO2lCQUM3QixDQUFDLENBQUM7Z0JBRUgsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7YUFDMUI7aUJBQ0k7Z0JBQ0osTUFBTSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7YUFDeEI7WUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7WUFDM0IsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNyQyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEtBQUssSUFBSTtnQkFDbEcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixDQUFDO0tBQUE7SUFFSyxRQUFRLENBQUMsTUFBNkI7O1lBQzNDLE1BQU0saUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCO2dCQUN4QyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztZQUUzQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLGNBQWM7Z0JBQzlDLE9BQU87WUFFUixNQUFNLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7WUFDMUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztZQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVc7Z0JBQ3RCLE1BQU0sQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBRXpCLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsR0FBUyxFQUFFO2dCQUMxQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztnQkFFakMsSUFBSSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUN0SCxJQUFJLG9CQUFvQixJQUFJLENBQUM7b0JBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUV0RSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUU7b0JBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUErQjt3QkFDdkUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxhQUFhO3dCQUNoQyxlQUFlLEVBQUUsTUFBTSxDQUFDLFVBQVU7cUJBQ2xDLENBQUMsQ0FBQztpQkFDSDtnQkFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztnQkFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO2dCQUMzQixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEtBQUssSUFBSTtvQkFDbEcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixDQUFDLENBQUEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNULENBQUM7S0FBQTtJQUVELFVBQVUsQ0FBQyxNQUE2QjtRQUN2QyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUVuQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUssV0FBVyxDQUFDLE1BQTZCOztZQUM5QyxNQUFNLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUMzQixNQUFNLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUV4QixNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUN6QixNQUFNLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUM3QixNQUFNLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUUvSCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUVqQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7WUFDM0IsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNyQyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEtBQUssSUFBSTtnQkFDbEcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixDQUFDO0tBQUE7SUFFRCxzQkFBc0I7UUFDckIsSUFBSSxDQUFDLHlCQUF5QixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVsSSxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELFlBQVksQ0FBQyxDQUFNO1FBQ2xCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVLLGVBQWUsQ0FBQyxDQUFXOztZQUNoQyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXRCLElBQUksUUFBUSxLQUFLLFFBQVE7Z0JBQ3hCLE9BQU87WUFFUixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRSxXQUFXLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQztZQUVwQyxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7WUFDckIsa0RBQWtEO1lBQ2xELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMvRCxxQ0FBcUM7Z0JBQ3JDLElBQUksQ0FBQyxLQUFLLFFBQVE7b0JBQ2pCLFlBQVksRUFBRSxDQUFDO2dCQUNoQixJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLFlBQVksRUFBRSxDQUFDO2FBQ2hFO1lBRUQsSUFBSSxDQUFDLHlCQUF5QixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMseUJBQXlCLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDbEYsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwSyxDQUFDO0tBQUE7SUFFSyxjQUFjOztZQUNuQixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztZQUUxQixNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUVuRSxJQUFJLGFBQWEsS0FBSyx5QkFBeUIsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDM0UsOENBQThDO2dCQUM5QyxJQUFJLENBQUMsK0JBQStCLEVBQUUsQ0FBQztnQkFFdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7Z0JBRTdELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO2dCQUM3QyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sR0FBRyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFFdkcsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN0RSxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sR0FBRyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUM7Z0JBRXZGLG1DQUFtQztnQkFDbkMsSUFBSSxDQUFDLCtCQUErQixFQUFFLENBQUM7YUFDdkM7UUFDRixDQUFDO0tBQUE7SUFFRCxZQUFZLENBQUMsUUFBdUI7UUFDbkMsSUFBSSxDQUFDLCtCQUErQixFQUFFLENBQUM7UUFFdkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDdEMsSUFBSSxlQUFlLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxXQUFXLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDaEssSUFBSSxlQUFlLEVBQUU7WUFDcEIsSUFBSSxDQUFDLHlCQUF5QixHQUE0QixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3RGLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNsSTtJQUNGLENBQUM7SUFFSyxXQUFXLENBQUMsUUFBZ0I7O1lBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7WUFDakMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEdBQUcsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFFdkcsSUFBSSxlQUFlLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxXQUFXLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7WUFDaEssSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEdBQTRCLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDaEYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFNUgsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQy9FLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3SSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBRWxILElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ3ZELE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdEMsQ0FBQztLQUFBO0lBRUQsYUFBYTtRQUNaLElBQUksQ0FBQywrQkFBK0IsRUFBRSxDQUFDO1FBRXZDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUUvRCw4RkFBOEY7UUFDOUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxLQUFLLEVBQUU7Z0JBQ3hCLENBQUMsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7Z0JBQzdCLENBQUMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixDQUFDLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztnQkFDdEIsQ0FBQyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQ25CLENBQUMsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixDQUFDLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQzthQUN2QjtRQUNGLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3SSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRWxILElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDN0IsTUFBTSxhQUFhLEdBQThCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUM5RSxNQUFNLFlBQVksR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUM7Z0JBQ2xELFlBQVksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDMUMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFlBQVksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUNoRyxNQUFNLGlCQUFpQixHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sV0FBVyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUNwRyxZQUFZLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDckQsT0FBTyxZQUFZLENBQUM7WUFDckIsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQzdDO0lBQ0YsQ0FBQztJQUVELGVBQWU7UUFDZCxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELCtCQUErQjtRQUM5QixJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDdkUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRTtZQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3hGLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sV0FBVyxNQUFNLEVBQUUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1NBQzdGO0lBQ0YsQ0FBQztJQUVELHlCQUF5QjtRQUN4QixJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0QsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRTtZQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBRXhGLElBQUksZUFBZSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sV0FBVyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBRWhHLElBQUksZUFBZSxFQUFFO2dCQUNwQixJQUFJLE9BQU8sR0FBNEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFFbkUsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNuQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxLQUFLLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDdkcsSUFBSSxNQUFNLEVBQUU7d0JBQ1gsQ0FBQyxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7d0JBQzlCLENBQUMsQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7d0JBQzdDLENBQUMsQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQzt3QkFDbkMsQ0FBQyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO3dCQUN2QixDQUFDLENBQUMsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDO3dCQUNuRCxDQUFDLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7d0JBQ2pDLENBQUMsQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzt3QkFDN0IsQ0FBQyxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO3dCQUNuQyxDQUFDLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7cUJBQ3ZDO29CQUVELFlBQVksRUFBRSxDQUFDO2dCQUNoQixDQUFDLENBQUMsQ0FBQztnQkFFSCxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNySCxlQUFlLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMxQztZQUVELFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sV0FBVyxNQUFNLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQztTQUMzRjtRQUVELElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzdCLE1BQU0sYUFBYSxHQUE4QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDOUUsTUFBTSxZQUFZLEdBQUcsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO2dCQUNsRCxZQUFZLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQzFDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDaEcsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLFdBQVcsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDcEcsWUFBWSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ3JELE9BQU8sWUFBWSxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUM3QztJQUNGLENBQUM7SUFHYSxVQUFVLENBQUMsZUFBd0IsS0FBSzs7WUFDckQsT0FBTyxJQUFJLE9BQU8sQ0FBTyxDQUFPLE9BQU8sRUFBRSxFQUFFO2dCQUMxQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsZUFBZSxFQUFFO29CQUMzRixPQUFPLEVBQUUsQ0FBQztvQkFDVixPQUFPO2lCQUNQO2dCQUVELElBQUksSUFBSSxDQUFDLG1CQUFtQixLQUFLLE1BQU0sRUFBRTtvQkFDeEMsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxDQUFDO29CQUV6RSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDO29CQUV6RSxNQUFNLE9BQU8sR0FBc0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM3RSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN2QyxRQUFRLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7b0JBQ3JDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO29CQUM3QixNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDO29CQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBRTdELElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztvQkFDekUsSUFBSSxJQUFJLENBQUMsdUJBQXVCO3dCQUMvQixZQUFZLElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDLGFBQWEsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO29CQUM3RSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7b0JBQ3RGLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzVFLElBQUksZUFBZSxHQUFHLFFBQVEsQ0FBQyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNwRixJQUFJLGVBQWUsR0FBRyxTQUFTO3dCQUM5QixlQUFlLEdBQUcsU0FBUyxDQUFDO29CQUU3QixNQUFNLE9BQU8sR0FBa0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFDbkcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDckIsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUM7b0JBQzdDLENBQUMsQ0FBQyxDQUFDO29CQUVILElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDLENBQUM7b0JBRXRFLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO29CQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztvQkFFekIsT0FBTyxFQUFFLENBQUM7aUJBQ1Y7cUJBQ0k7b0JBQ0osTUFBTSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFFaEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7b0JBQ3pELElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO29CQUNyQixPQUFPLEVBQUUsQ0FBQztpQkFDVjtZQUNGLENBQUMsQ0FBQSxDQUFDLENBQUM7UUFDSixDQUFDO0tBQUE7SUFFRCxTQUFTLENBQUMsTUFBNkIsRUFBRSxNQUFjLElBQUk7UUFFMUQsSUFBSSxHQUFHLEtBQUssSUFBSTtZQUNmLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzs7WUFFdEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELGVBQWUsQ0FBQyxlQUFzQyxJQUFJO1FBQ3pELElBQUksQ0FBQyxZQUFZO1lBQ2hCLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRWxDLFlBQVksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7UUFFckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRTtnQkFDZCxJQUFJLENBQUMsQ0FBQyxVQUFVLEtBQUssMEJBQTBCLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUU7b0JBQ3JFLENBQUMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQztvQkFDNUIsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBK0I7d0JBQ2xFLFVBQVUsRUFBRSxDQUFDLENBQUMsYUFBYTt3QkFDM0IsYUFBYSxFQUFFLElBQUk7d0JBQ25CLGVBQWUsRUFBRSxDQUFDLENBQUMsVUFBVTtxQkFDN0IsQ0FBQyxDQUFDO2lCQUNIO3FCQUNJLElBQUksQ0FBQyxDQUFDLFVBQVUsS0FBSywwQkFBMEIsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLG1CQUFtQixFQUFFO29CQUN2RixDQUFDLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLG1CQUFtQixDQUFDO29CQUM5QyxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUErQjt3QkFDbEUsVUFBVSxFQUFFLENBQUMsQ0FBQyxhQUFhO3dCQUMzQixhQUFhLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQjt3QkFDcEMsZUFBZSxFQUFFLElBQUk7cUJBQ3JCLENBQUMsQ0FBQztpQkFDSDthQUNEO1FBQ0YsQ0FBQyxDQUFDLENBQUM7UUFFSCxZQUFZLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUMvQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxLQUFLLDRCQUE0QixDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsYUFBYSxLQUFLLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JLLElBQUksVUFBVSxFQUFFO1lBQ2YsWUFBWSxDQUFDLFVBQVUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxhQUFhLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztZQUM3RixZQUFZLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUM7U0FDdEQ7UUFFRCxJQUFJLFlBQVksQ0FBQyxjQUFjLElBQUksQ0FBQztZQUNuQyxZQUFZLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUVsQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDMUIsQ0FBQztJQUVELGNBQWMsQ0FBQyxXQUE4QjtRQUM1QyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUUvQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFO1lBRTdCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUU7Z0JBQy9CLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDMUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUVsRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7b0JBQzdDLGlFQUFpRTtvQkFDakUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO3dCQUNwQyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLEtBQUssQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUMxRixJQUFJLFlBQVksR0FBRyxDQUFDOzRCQUNuQixRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDM0IsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3ZELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUU7d0JBQzdCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQzt3QkFDeEYsWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxXQUFXLE1BQU0sRUFBRSxFQUFFLGVBQWUsQ0FBQyxDQUFDO3FCQUMzRjtnQkFDRixDQUFDLENBQUMsQ0FBQztnQkFFSCxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQztvQkFDbkQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQzthQUNuQztZQUVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLFNBQVMsQ0FBQztZQUVySCw4REFBOEQ7WUFDOUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUNyQyxNQUFNLGNBQWMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDakgsSUFBSSxjQUFjLEdBQUcsQ0FBQztvQkFDckIsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxXQUFXLEVBQUUsQ0FBQyxhQUFhLGVBQWUsY0FBYyxRQUFRLENBQUMsQ0FBQztZQUNsSCxDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDeEYsSUFBSSxlQUFlLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxXQUFXLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDaEcsSUFBSSxlQUFlLEVBQUU7Z0JBQ3BCLElBQUksT0FBTyxHQUE0QixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUVuRSxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7Z0JBQ3JCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ25CLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEtBQUssQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUN2RyxJQUFJLE1BQU0sRUFBRTt3QkFDWCxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7d0JBQzNCLE1BQU0sQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO3dCQUNuQyxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO3dCQUM3QyxNQUFNLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUM7d0JBQ25DLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQzt3QkFDdkIsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO3dCQUM3QixNQUFNLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUM7d0JBQ3ZDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQzt3QkFDN0IsbUNBQW1DO3dCQUNuQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSywwQkFBMEIsQ0FBQyxJQUFJLEVBQUU7NEJBQzdFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDOzRCQUUxQixJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssMEJBQTBCLENBQUMsSUFBSTtnQ0FDeEQsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDO2lDQUM3QixJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssMEJBQTBCLENBQUMsUUFBUTtnQ0FDakUsTUFBTSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQzs0QkFFcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUU7Z0NBQ3RELE1BQU0sQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO2dDQUMzQixNQUFNLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztnQ0FDeEIsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0NBQ3pCLE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7NkJBQ2xDO3lCQUNEO3FCQUNEO29CQUVELFlBQVksRUFBRSxDQUFDO2dCQUNoQixDQUFDLENBQUMsQ0FBQzthQUNIO1lBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEdBQUcsbUJBQW1CLENBQUM7Z0JBQzVILElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxDQUFDOztnQkFFN0UsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxHQUFHLG1CQUFtQixDQUFDLElBQUksTUFBTSxDQUFDO1lBRXJILE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxHQUFHLFlBQVksQ0FBQyxJQUFJLGFBQWEsQ0FBQztZQUMvRyxJQUFJLENBQUMsU0FBUyxHQUFjLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUNyRSxPQUFPLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3BDLENBQUMsQ0FBQyxDQUFDO1NBQ0g7UUFFRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTdJLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxLQUFLLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDbEgsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNGLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFVBQVUsRUFBRTtZQUNqRCxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO1lBQ3hELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUM7U0FDM0Q7SUFDRixDQUFDOzs7WUE5M0JELFNBQVMsU0FBQztnQkFDVixRQUFRLEVBQUUsWUFBWTtnQkFDdEIsODRRQUF3QztnQkFDeEMsU0FBUyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7YUFDN0I7Ozs7WUEzQlEsZ0JBQWdCO1lBUWhCLHdCQUF3QjtZQVQwSixpQkFBaUI7Ozt5QkE4QjFNLFdBQVcsU0FBQyxPQUFPOzBCQUduQixLQUFLO3VCQUNMLEtBQUs7c0JBQ0wsS0FBSztvQkFDTCxLQUFLO2dDQUNMLEtBQUs7bUJBQ0wsS0FBSzs0QkFDTCxNQUFNOytCQUNOLE1BQU07K0JBQ04sTUFBTTtrQ0FDTixNQUFNOzJCQUNOLFNBQVMsU0FBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dDQUN2QyxTQUFTLFNBQUMsZ0JBQWdCO3VCQUMxQixTQUFTLFNBQUMsVUFBVTtnQ0FDcEIsU0FBUyxTQUFDLGdCQUFnQjtzQ0FDMUIsU0FBUyxTQUFDLHNCQUFzQjt5QkFFaEMsU0FBUyxTQUFDLFNBQVM7K0JBQ25CLFNBQVMsU0FBQyxlQUFlO29DQUN6QixTQUFTLFNBQUMsdUJBQXVCO3NDQUNqQyxTQUFTLFNBQUMseUJBQXlCO3VDQUVuQyxlQUFlLFNBQUMsZ0NBQWdDO3VCQWtDaEQsWUFBWSxTQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBIb3N0TGlzdGVuZXIsIEVsZW1lbnRSZWYsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBPbkRlc3Ryb3ksIENvbnRlbnRDaGlsZHJlbiwgUXVlcnlMaXN0LCBIb3N0QmluZGluZywgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBTbGlja0dyaWRTZXJ2aWNlIH0gZnJvbSBcIi4vc2xpY2stZ3JpZC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IElTbGlja0dyaWRDb2x1bW5Nb2RlbCwgU2xpY2tHcmlkQ29sdW1uRmlsdGVyVHlwZXMsIFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24gfSBmcm9tIFwiLi9zbGljay1ncmlkLWNvbHVtbi5tb2RlbFwiO1xyXG5pbXBvcnQgeyBJU2xpY2tHcmlkT3B0aW9ucyB9IGZyb20gXCIuL3NsaWNrLWdyaWQub3B0aW9uc1wiO1xyXG5pbXBvcnQgeyBTbGlja0dyaWRSZXF1ZXN0TW9kZWwsIElTbGlja0dyaWRSZXF1ZXN0U2VhcmNoTW9kZWwgfSBmcm9tIFwiLi9zbGljay1ncmlkLXJlcXVlc3QubW9kZWxcIjtcclxuaW1wb3J0IHsgU2xpY2tHcmlkUmVzcG9uc2VNb2RlbCB9IGZyb20gXCIuL3NsaWNrLWdyaWQtcmVzcG9uc2UubW9kZWxcIjtcclxuaW1wb3J0IHsgU2xpY2tEaWFsb2dDb21wb25lbnQgfSBmcm9tIFwiLi4vc2xpY2stZGlhbG9nL3NsaWNrLWRpYWxvZy5tb2R1bGVcIjtcclxuaW1wb3J0IHsgU2xpY2tTbGVlcFNlcnZpY2UgfSBmcm9tIFwiLi4vdXRpbHMvc2xpY2stc2xlZXAuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTbGlja1V0aWxzU2VydmljZSB9IGZyb20gXCIuLi91dGlscy9zbGljay11dGlscy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNsaWNrRnVuY3Rpb25Mb2NrU2VydmljZSB9IGZyb20gXCIuLi91dGlscy9zbGljay1mdW5jdGlvbi1sb2NrLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2xpY2tHcmlkQ29sdW1uVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tIFwiLi9zbGljay1ncmlkLWNvbHVtbi10ZW1wbGF0ZS5kaXJlY3RpdmVcIjtcclxuaW1wb3J0IHsgU2xpY2tDb25maXJtRGlhbG9nQ29tcG9uZW50LCBTbGlja0NvbmZpcm1EaWFsb2dSZXN1bHRzIH0gZnJvbSAnLi4vc2xpY2stY29uZmlybS1kaWFsb2cvc2xpY2stY29uZmlybS1kaWFsb2cubW9kdWxlJztcclxuaW1wb3J0IHsgSVNsaWNrR3JpZEZhdm9yaXRlTW9kZWwsIFNsaWNrR3JpZEZhdm9yaXRlTW9kZWwgfSBmcm9tICcuL3NsaWNrLWdyaWQtZmF2b3JpdGUubW9kZWwnO1xyXG5cclxuY2xhc3MgRHJvcERvd25Nb2RlbCB7XHJcblx0Y29uc3RydWN0b3IodGV4dDogc3RyaW5nKSB7XHJcblx0XHR0aGlzLmlkID0gdGV4dDtcclxuXHRcdHRoaXMudGV4dCA9IHRleHQ7XHJcblx0fVxyXG5cclxuXHRpZDogc3RyaW5nO1xyXG5cdHRleHQ6IHN0cmluZztcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdzbGljay1ncmlkJyxcclxuXHR0ZW1wbGF0ZVVybDogJ3NsaWNrLWdyaWQuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHByb3ZpZGVyczogW1NsaWNrR3JpZFNlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTbGlja0dyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuXHRASG9zdEJpbmRpbmcoJ2NsYXNzJykgZmxleENvbHVtbiA9ICdzbGljay1mbGV4LWNvbHVtbic7XHJcblx0Ly9ASG9zdEJpbmRpbmcoJ2NsYXNzJykgY2xhc3MgPSAnZC1mbGV4IGZsZXgtY29sdW1uIGZsZXgtZmlsbCc7XHJcblxyXG5cdEBJbnB1dCgpIGdyaWRPcHRpb25zOiBJU2xpY2tHcmlkT3B0aW9ucztcclxuXHRASW5wdXQoKSBib3JkZXJlZDogYm9vbGVhbiA9IHRydWU7XHJcblx0QElucHV0KCkgc3RyaXBlZDogYm9vbGVhbiA9IHRydWU7XHJcblx0QElucHV0KCkgaG92ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cdEBJbnB1dCgpIHNob3dpbmdBbGxSZWNvcmRzID0gZmFsc2U7XHJcblx0QElucHV0KCkgZGF0YTogYW55W107XHJcblx0QE91dHB1dCgpIG9uUm93U2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblx0QE91dHB1dCgpIG9uUm93RG91YmxlQ2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblx0QE91dHB1dCgpIG9uUm93Q29udGV4dE1lbnU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblx0QE91dHB1dCgpIG9uRmF2b3JpdGVzTW9kaWZpZWQ6IEV2ZW50RW1pdHRlcjxhbnlbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xyXG5cdEBWaWV3Q2hpbGQoXCJzbGlja0dyaWRcIiwgeyBzdGF0aWM6IHRydWUgfSkgc2xpY2tHcmlkUmVmOiBFbGVtZW50UmVmO1xyXG5cdEBWaWV3Q2hpbGQoXCJ0YWJsZUNvbnRhaW5lclwiKSB0YWJsZUNvbnRhaW5lclJlZjogRWxlbWVudFJlZjtcclxuXHRAVmlld0NoaWxkKFwidGFibGVSZWZcIikgdGFibGVSZWY6IEVsZW1lbnRSZWY7XHJcblx0QFZpZXdDaGlsZChcInRhYmxlSGVhZGVyUm93XCIpIHRhYmxlSGVhZGVyUm93UmVmOiBFbGVtZW50UmVmO1xyXG5cdEBWaWV3Q2hpbGQoXCJ0YWJsZUhlYWRlclNlYXJjaFJvd1wiKSB0YWJsZUhlYWRlclNlYXJjaFJvd1JlZjogRWxlbWVudFJlZjtcclxuXHQvLyBUaGlzIGlzIHRvIHRlc3QgaG93IGhpZ2ggYSBzdGFuZGFyZCByb3cgaXNcclxuXHRAVmlld0NoaWxkKFwidGVzdFJvd1wiKSB0ZXN0Um93UmVmOiBFbGVtZW50UmVmO1xyXG5cdEBWaWV3Q2hpbGQoXCJ0YWJsZUJvZHlSb3dzXCIpIHRhYmxlQm9keVJvd3NSZWY6IEVsZW1lbnRSZWY7XHJcblx0QFZpZXdDaGlsZChcImNvbHVtblNlbGVjdERpYWxvZ1JlZlwiKSBjb2x1bW5TZWxlY3REaWFsb2dSZWY6IFNsaWNrRGlhbG9nQ29tcG9uZW50O1xyXG5cdEBWaWV3Q2hpbGQoXCJhZGROZXdGYXZvcml0ZURpYWxvZ1JlZlwiKSBhZGROZXdGYXZvcml0ZURpYWxvZ1JlZjogU2xpY2tDb25maXJtRGlhbG9nQ29tcG9uZW50O1xyXG5cclxuXHRAQ29udGVudENoaWxkcmVuKFNsaWNrR3JpZENvbHVtblRlbXBsYXRlRGlyZWN0aXZlKSBzbGlja0dyaWRDb2x1bW5UZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxTbGlja0dyaWRDb2x1bW5UZW1wbGF0ZURpcmVjdGl2ZT47XHJcblx0dGVtcGxhdGVSZWZzOiBhbnk7XHJcblxyXG5cdHByaXZhdGUgZm5Pbk1vdXNlVXAgPSAoZSkgPT4gdGhpcy5vbk1vdXNlVXAoZSk7XHJcblxyXG5cdHV1aWQ6IHN0cmluZztcclxuXHRzZWxlY3RlZEluZGV4OiBudW1iZXIgPSBudWxsO1xyXG5cdGdyaWRPcGFjaXR5ID0gMDtcclxuXHR2aXNpYmxlQ29sdW1uczogSVNsaWNrR3JpZENvbHVtbk1vZGVsW107XHJcblx0ZmF2b3JpdGVzOiBEcm9wRG93bk1vZGVsW107XHJcblx0c2VsZWN0ZWRGYXZvcml0ZTogc3RyaW5nO1xyXG5cdG5ld0Zhdm9yaXRlVGV4dDogc3RyaW5nO1xyXG5cdGNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnM6IElTbGlja0dyaWRDb2x1bW5Nb2RlbFtdO1xyXG5cdGxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdGlzRG91YmxlQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRkb3VibGVDbGlja1dhaXRUaW1lb3V0OiBOb2RlSlMuVGltZXI7XHJcblx0Y3VycmVudFBhZ2U6IG51bWJlciA9IDE7XHJcblx0c2VhcmNoVGltZW91dDogTm9kZUpTLlRpbWVyO1xyXG5cdGtleXByZXNzVGltZW91dDogTm9kZUpTLlRpbWVyO1xyXG5cdHNob3dUZXN0Um93ID0gZmFsc2U7XHJcblx0c2hvd1NlYXJjaFJvdyA9IGZhbHNlO1xyXG5cdGlzUmVzaXppbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHR2aXNpYmxlRGF0YTogYW55W10gPSBbXTtcclxuXHRyZWNvcmRzUGVyUGFnZTogbnVtYmVyO1xyXG5cdHRvdGFsUmVjb3JkczogbnVtYmVyO1xyXG5cdHJlY29yZHNQZXJQYWdlVmFsdWU6IHN0cmluZyA9IFwiQXV0b1wiO1xyXG5cclxuXHRwcml2YXRlIHNsaWNrR3JpZEhlaWdodDogbnVtYmVyO1xyXG5cdHByaXZhdGUgcmVzaXplVGltZW91dDogTm9kZUpTLlRpbWVyID0gbnVsbDtcclxuXHRwcml2YXRlIHJlcXVlc3RNb2RlbDogU2xpY2tHcmlkUmVxdWVzdE1vZGVsO1xyXG5cdHByaXZhdGUgcmVzaXplSW5pdGlhbFBvczogbnVtYmVyO1xyXG5cdHByaXZhdGUgcmVzaXplSW5pdGlhbFdpZHRoOiBudW1iZXI7XHJcblx0cHJpdmF0ZSByZXNpemVDb2xJZHg6IG51bWJlcjtcclxuXHJcblx0QEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50JywgJyRldmVudC50YXJnZXQnXSlcclxuXHRhc3luYyBvblJlc2l6ZShldmVudDogVUlFdmVudCwgdGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuXHRcdC8vIFRoaXMgaXMgaGVyZSBiZWNhdXNlIGZpcmVmb3ggc2hvd3MvaGlkZXMgdGhlIG1lbnUgaWYgeW91IHByZXNzIGFsdC4gRG9uJ3QgcmVkcmF3IHRoZSBncmlkIGlmIHdlJ3JlXHJcblx0XHQvLyBqdXN0IHNob3dpbmcgdGhlIG1lbnVcclxuXHRcdGlmIChNYXRoLmFicyh0aGlzLnNsaWNrR3JpZEhlaWdodCAtIHRoaXMuc2xpY2tHcmlkUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0KSA8IDUwKVxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0aWYgKHRoaXMuc2xpY2tHcmlkSGVpZ2h0ICE9PSB0aGlzLnNsaWNrR3JpZFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCkge1xyXG5cdFx0XHRjbGVhclRpbWVvdXQodGhpcy5yZXNpemVUaW1lb3V0KTtcclxuXHRcdFx0dGhpcy5yZXNpemVUaW1lb3V0ID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwucGFnZSA9IDE7XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5yZXNpemVHcmlkKCk7XHJcblx0XHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwucmVjb3Jkc1BlclBhZ2UgPSB0aGlzLnJlY29yZHNQZXJQYWdlO1xyXG5cdFx0XHRcdHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdFx0fSwgNTAwKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgZ3JpZFNlcnZpY2U6IFNsaWNrR3JpZFNlcnZpY2UsXHJcblx0XHRwcml2YXRlIGZ1bmN0aW9uTG9ja1NlcnZpY2U6IFNsaWNrRnVuY3Rpb25Mb2NrU2VydmljZSxcclxuXHRcdHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcblx0XHR0aGlzLnV1aWQgPSBTbGlja1V0aWxzU2VydmljZS5uZXdHdWlkKCk7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbCA9IG5ldyBTbGlja0dyaWRSZXF1ZXN0TW9kZWwoKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG5nT25Jbml0KCkge1xyXG5cdFx0dGhpcy5zZXRHcmlkT3B0aW9ucyh0aGlzLmdyaWRPcHRpb25zKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuXHRcdC8vIENvcHkgdGhlIHRlbXBsYXRlcyB0byBhIHZhcmlhYmxlIHRoYXQgdGhlIGh0bWwgY2FuIGFjY2Vzcy4gIEl0IGNhbid0IGFjY2VzcyBhIFF1ZXJ5TGlzdFxyXG5cdFx0dGhpcy50ZW1wbGF0ZVJlZnMgPSB7fTtcclxuXHRcdHRoaXMuc2xpY2tHcmlkQ29sdW1uVGVtcGxhdGVzLmZvckVhY2godCA9PiB7XHJcblx0XHRcdHRoaXMudGVtcGxhdGVSZWZzW3QuY29sdW1uS2V5XSA9IHQudGVtcGxhdGU7XHJcblx0XHR9KTtcclxuXHRcdGlmICh0aGlzLnRhYmxlUmVmKVxyXG5cdFx0XHQoPEhUTUxUYWJsZUVsZW1lbnQ+dGhpcy50YWJsZVJlZi5uYXRpdmVFbGVtZW50KS5mb2N1cygpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgdGFibGVLZXlkb3duKGU6IEtleWJvYXJkRXZlbnQpIHtcclxuXHRcdC8vIEtleSB1cFxyXG5cdFx0aWYgKGUud2hpY2ggPT09IDM4ICYmICEodGhpcy5zZWxlY3RlZEluZGV4ID09PSAwICYmIHRoaXMuY3VycmVudFBhZ2UgPT09IDEpKSB7XHJcblx0XHRcdGNsZWFyVGltZW91dCh0aGlzLmtleXByZXNzVGltZW91dCk7XHJcblxyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXgtLTtcclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA8IDApIHtcclxuXHRcdFx0XHRpZiAodGhpcy5jdXJyZW50UGFnZSA+IDEpIHtcclxuXHRcdFx0XHRcdHRoaXMuY3VycmVudFBhZ2UtLTtcclxuXHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLm9uUGFnZUNoYW5nZSh0aGlzLmN1cnJlbnRQYWdlLCBmYWxzZSk7XHJcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSB0aGlzLnJlY29yZHNQZXJQYWdlIC0gMTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMua2V5cHJlc3NUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0Y29uc3Qgcm93RGF0YSA9IHRoaXMudmlzaWJsZURhdGFbdGhpcy5zZWxlY3RlZEluZGV4XTtcclxuXHRcdFx0XHR0aGlzLm9uUm93Q2xpY2tlZChyb3dEYXRhLCB0aGlzLnNlbGVjdGVkSW5kZXgpO1xyXG5cdFx0XHR9LCA1MDApO1xyXG5cdFx0fVxyXG5cdFx0Ly8gS2V5IGRvd25cclxuXHRcdGlmIChlLndoaWNoID09PSA0MCkge1xyXG5cdFx0XHRpZiAoKCh0aGlzLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLnJlY29yZHNQZXJQYWdlKSArIHRoaXMuc2VsZWN0ZWRJbmRleCA+PSB0aGlzLnRvdGFsUmVjb3JkcylcclxuXHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRjbGVhclRpbWVvdXQodGhpcy5rZXlwcmVzc1RpbWVvdXQpO1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXgrKztcclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA+PSB0aGlzLnJlY29yZHNQZXJQYWdlKSB7XHJcblx0XHRcdFx0aWYgKCgodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5yZWNvcmRzUGVyUGFnZSkgKyB0aGlzLnNlbGVjdGVkSW5kZXggPCB0aGlzLnRvdGFsUmVjb3Jkcykge1xyXG5cdFx0XHRcdFx0dGhpcy5jdXJyZW50UGFnZSsrO1xyXG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMub25QYWdlQ2hhbmdlKHRoaXMuY3VycmVudFBhZ2UsIGZhbHNlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMua2V5cHJlc3NUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0Y29uc3Qgcm93RGF0YSA9IHRoaXMudmlzaWJsZURhdGFbdGhpcy5zZWxlY3RlZEluZGV4XTtcclxuXHRcdFx0XHR0aGlzLm9uUm93Q2xpY2tlZChyb3dEYXRhLCB0aGlzLnNlbGVjdGVkSW5kZXgpO1xyXG5cdFx0XHR9LCA1MDApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG5cdFx0aWYgKGNoYW5nZXMuYm9yZGVyZWQpIHtcclxuXHRcdFx0aWYgKHRoaXMuZ3JpZE9wdGlvbnMuYm9yZGVyZWQgPT09IG51bGwpXHJcblx0XHRcdFx0dGhpcy5ib3JkZXJlZCA9ICh0aGlzLmJvcmRlcmVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSAhPT0gJ2ZhbHNlJykgPyB0cnVlIDogZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGNoYW5nZXMuc3RyaXBlZCkge1xyXG5cdFx0XHQvLyBUaGUgZ3JpZCBvcHRpb25zIG92ZXJyaWRlIHRoZSB0YWcgb3B0aW9uc1xyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5zdHJpcGVkID09PSBudWxsKVxyXG5cdFx0XHRcdHRoaXMuc3RyaXBlZCA9ICh0aGlzLnN0cmlwZWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpICE9PSAnZmFsc2UnKSA/IHRydWUgOiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoY2hhbmdlcy5ob3Zlcikge1xyXG5cdFx0XHQvLyBUaGUgZ3JpZCBvcHRpb25zIG92ZXJyaWRlIHRoZSB0YWcgb3B0aW9uc1xyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ob3ZlciA9PT0gbnVsbClcclxuXHRcdFx0XHR0aGlzLmhvdmVyID0gKHRoaXMuaG92ZXIudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpICE9PSAnZmFsc2UnKSA/IHRydWUgOiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoY2hhbmdlcy5ncmlkT3B0aW9ucykge1xyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ib3JkZXJlZCAhPT0gbnVsbClcclxuXHRcdFx0XHR0aGlzLmJvcmRlcmVkID0gdGhpcy5ncmlkT3B0aW9ucy5ib3JkZXJlZDtcclxuXHJcblx0XHRcdGlmICh0aGlzLmdyaWRPcHRpb25zLnN0cmlwZWQgIT09IG51bGwpXHJcblx0XHRcdFx0dGhpcy5zdHJpcGVkID0gdGhpcy5ncmlkT3B0aW9ucy5zdHJpcGVkO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuZ3JpZE9wdGlvbnMuaG92ZXIgIT09IG51bGwpXHJcblx0XHRcdFx0dGhpcy5ob3ZlciA9IHRoaXMuZ3JpZE9wdGlvbnMuaG92ZXI7XHJcblxyXG5cdFx0XHR0aGlzLnNldEdyaWRPcHRpb25zKHRoaXMuZ3JpZE9wdGlvbnMpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChjaGFuZ2VzLmRhdGEpIHtcclxuXHRcdFx0Ly8gSWYgd2UgZG9uJ3QgZG8gdGhpcyBsb2NrLCB0aGUgZmlyc3QgY2hhbmdlIHdpbGwgaGF2ZSBudWxsIGRhdGEgYW5kIGNyYXNoLiAgVGhlIHNlY29uZCByZXF1ZXN0IHdpbGwgaGF2ZSB0aGUgYWN0dWFsIGRhdGFcclxuXHRcdFx0YXdhaXQgdGhpcy5mdW5jdGlvbkxvY2tTZXJ2aWNlLmxvY2soXCJHUklEX1wiICsgdGhpcy51dWlkICsgXCJfREFUQV9DSEFOR0VTXCIpO1xyXG5cdFx0XHQvLyBPbmx5IHJlc2l6ZSB0aGUgZ3JpZCBvbiB0aGUgZmlyc3QgY2hhbmdlLCBvdGhlcndpc2Ugd2UgZ2V0IGEgZmxpY2tlclxyXG5cdFx0XHRpZiAoY2hhbmdlcy5kYXRhLmZpcnN0Q2hhbmdlID09PSB0cnVlKVxyXG5cdFx0XHRcdGF3YWl0IHRoaXMucmVzaXplR3JpZCgpO1xyXG5cdFx0XHQvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSByZXNpemUgaW4gdGhlIE9uSW5pdCB0byBmaW5pc2ggYmVmb3JlIHdlIGNvbnRpbnVlXHJcblx0XHRcdHRoaXMubG9hZGVkID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLnBhZ2UgPSAxO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5yZWNvcmRzUGVyUGFnZSA9IHRoaXMucmVjb3Jkc1BlclBhZ2U7XHJcblx0XHRcdGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdFx0aWYgKHRoaXMudmlzaWJsZURhdGEgJiYgdGhpcy52aXNpYmxlRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b1NlbGVjdEZpcnN0Um93ID09PSB0cnVlKVxyXG5cdFx0XHRcdHRoaXMuc2VsZWN0Um93KDApO1xyXG5cdFx0XHR0aGlzLmZ1bmN0aW9uTG9ja1NlcnZpY2UucmVsZWFzZShcIkdSSURfXCIgKyB0aGlzLnV1aWQgKyBcIl9EQVRBX0NIQU5HRVNcIik7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRuZ09uRGVzdHJveSgpIHtcclxuXHRcdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmZuT25Nb3VzZVVwKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG9uUmVjb3Jkc1BlclBhZ2VTZWxlY3RlZChyZWNvcmRzUGVyUGFnZTogc3RyaW5nKSB7XHJcblx0XHRpZiAoIXJlY29yZHNQZXJQYWdlKVxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0dGhpcy5yZWNvcmRzUGVyUGFnZVZhbHVlID0gcmVjb3Jkc1BlclBhZ2U7XHJcblx0XHRsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIkdSSURfXCIgKyB0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXkgKyBcIl9SRUNPUkRTX1BFUl9QQUdFXCIsIHJlY29yZHNQZXJQYWdlKTtcclxuXHJcblx0XHR0aGlzLnZpc2libGVEYXRhID0gW107XHJcblx0XHR0aGlzLmdyaWRPcGFjaXR5ID0gMDtcclxuXHRcdGF3YWl0IFNsaWNrU2xlZXBTZXJ2aWNlLnNsZWVwKCk7XHJcblx0XHRhd2FpdCB0aGlzLnJlc2l6ZUdyaWQodHJ1ZSk7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5yZWNvcmRzUGVyUGFnZSA9IHRoaXMucmVjb3Jkc1BlclBhZ2U7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHRhd2FpdCB0aGlzLm9uUGFnZUNoYW5nZSh0aGlzLmN1cnJlbnRQYWdlLCB0cnVlKTtcclxuXHR9XHJcblxyXG5cdG9uQ29sUmVzaXplTW91c2Vkb3duKGU6IE1vdXNlRXZlbnQsIGNvbHVtbklkeDogbnVtYmVyKSB7XHJcblx0XHR0aGlzLmlzUmVzaXppbmcgPSB0cnVlO1xyXG5cdFx0dGhpcy5yZXNpemVJbml0aWFsUG9zID0gZS5wYWdlWDtcclxuXHRcdHRoaXMucmVzaXplQ29sSWR4ID0gY29sdW1uSWR4O1xyXG5cdFx0bGV0IGNvbCA9ICg8SFRNTFRhYmxlUm93RWxlbWVudD50aGlzLnRhYmxlSGVhZGVyUm93UmVmLm5hdGl2ZUVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0ZFwiKS5pdGVtKGNvbHVtbklkeCk7XHJcblx0XHR0aGlzLnJlc2l6ZUluaXRpYWxXaWR0aCA9IGNvbC5vZmZzZXRXaWR0aCAtIDk7XHJcblxyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1uc1tjb2x1bW5JZHhdLmZsZXhpYmxlID0gZmFsc2U7XHJcblxyXG5cdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZm5Pbk1vdXNlVXApO1xyXG5cdH1cclxuXHJcblx0b25Db2xSZXNpemVEb3VibGVjbGljayhlOiBNb3VzZUV2ZW50LCBjb2x1bW5JZHg6IG51bWJlcikge1xyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1uc1tjb2x1bW5JZHhdLmZsZXhpYmxlID0gdHJ1ZTtcclxuXHRcdHRoaXMudmlzaWJsZUNvbHVtbnNbY29sdW1uSWR4XS53aWR0aCA9IG51bGw7XHJcblx0XHR0aGlzLnNhdmVDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKTtcclxuXHR9XHJcblxyXG5cdG9uQ29sUmVzaXplTW91c2Vtb3ZlKGU6IE1vdXNlRXZlbnQpIHtcclxuXHRcdGlmICghdGhpcy5pc1Jlc2l6aW5nKVxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0bGV0IG5ld0N1cnNvclBvcyA9IGUucGFnZVg7XHJcblx0XHRsZXQgZGlmZiA9IG5ld0N1cnNvclBvcyAtIHRoaXMucmVzaXplSW5pdGlhbFBvcztcclxuXHRcdHRoaXMudmlzaWJsZUNvbHVtbnNbdGhpcy5yZXNpemVDb2xJZHhdLndpZHRoID0gKHRoaXMucmVzaXplSW5pdGlhbFdpZHRoICsgZGlmZikgKyBcInB4XCI7XHJcblx0XHRpZiAoKHRoaXMucmVzaXplSW5pdGlhbFdpZHRoICsgZGlmZikgPCAxMClcclxuXHRcdFx0dGhpcy52aXNpYmxlQ29sdW1uc1t0aGlzLnJlc2l6ZUNvbElkeF0ud2lkdGggPSBcIjEwcHhcIjtcclxuXHRcdHRoaXMudmlzaWJsZUNvbHVtbnNbdGhpcy5yZXNpemVDb2xJZHhdLmZsZXhpYmxlID0gZmFsc2U7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIG9uTW91c2VVcChlKSB7XHJcblx0XHR0aGlzLmlzUmVzaXppbmcgPSBmYWxzZTtcclxuXHRcdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmZuT25Nb3VzZVVwKTtcclxuXHRcdHRoaXMuc2F2ZUNvbHVtbnNUb0xvY2FsU3RvcmFnZSgpO1xyXG5cdH1cclxuXHJcblx0Z2V0VmlzaWJsZVJlY29yZHMoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy52aXNpYmxlRGF0YTtcclxuXHR9XHJcblxyXG5cdGFkZE5ld1JlY29yZChuZXdSZWNvcmQ6IGFueSwgc2VsZWN0TmV3UmVjb3JkOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHRcdHRoaXMudmlzaWJsZURhdGEudW5zaGlmdChuZXdSZWNvcmQpO1xyXG5cclxuXHRcdGlmIChzZWxlY3ROZXdSZWNvcmQgPT09IHRydWUpIHtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcclxuXHRcdFx0dGhpcy5zZWxlY3RSb3coMCk7XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleClcclxuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXgrKztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHVwZGF0ZVJlY29yZChyb3dOdW06IG51bWJlciwgcmVjb3JkOiBhbnkpIHtcclxuXHRcdHRoaXMudmlzaWJsZURhdGFbcm93TnVtXSA9IHJlY29yZDtcclxuXHR9XHJcblxyXG5cdG9uUm93Q2xpY2tlZChyb3dEYXRhOiBhbnksIGlkeDogbnVtYmVyKSB7XHJcblx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSBpZHg7XHJcblx0XHRjbGVhclRpbWVvdXQodGhpcy5kb3VibGVDbGlja1dhaXRUaW1lb3V0KTtcclxuXHRcdHRoaXMuZG91YmxlQ2xpY2tXYWl0VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHR0aGlzLm9uUm93U2VsZWN0ZWQuZW1pdChyb3dEYXRhKTtcclxuXHRcdH0sIDI1MCk7XHJcblx0fVxyXG5cclxuXHRvblJvd0RvdWJsZUNsaWNrZWQocm93RGF0YTogYW55LCBpZHgpIHtcclxuXHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IGlkeDtcclxuXHRcdGNsZWFyVGltZW91dCh0aGlzLmRvdWJsZUNsaWNrV2FpdFRpbWVvdXQpO1xyXG5cdFx0dGhpcy5vblJvd0RvdWJsZUNsaWNrLmVtaXQocm93RGF0YSk7XHJcblx0fVxyXG5cclxuXHRvblJvd0NvbnRleHRNZW51Q2xpY2tlZChlOiBNb3VzZUV2ZW50LCByb3dEYXRhLCBpZHgpIHtcclxuXHRcdGlmICh0aGlzLm9uUm93Q29udGV4dE1lbnUpIHtcclxuXHRcdFx0bGV0IHJvd0NvbnRleHRNZW51TW9kZWwgPSB7XHJcblx0XHRcdFx0bW91c2VFdmVudDogZSxcclxuXHRcdFx0XHRkYXRhOiByb3dEYXRhLFxyXG5cdFx0XHRcdHJvd0lkeDogaWR4XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMub25Sb3dDb250ZXh0TWVudS5lbWl0KHJvd0NvbnRleHRNZW51TW9kZWwpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgb25QYWdlQ2hhbmdlKHBhZ2VOdW1iZXIsIHNlbGVjdFJvdzogYm9vbGVhbiA9IHRydWUpIHtcclxuXHRcdHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlTnVtYmVyO1xyXG5cdFx0dGhpcy5yZXF1ZXN0TW9kZWwucGFnZSA9IHBhZ2VOdW1iZXI7XHJcblx0XHRhd2FpdCB0aGlzLnJlbG9hZCh0aGlzLnJlcXVlc3RNb2RlbCk7XHJcblx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSAodGhpcy5ncmlkT3B0aW9ucy5hdXRvU2VsZWN0Rmlyc3RSb3cgPT09IHRydWUpID8gMCA6IG51bGw7XHJcblxyXG5cdFx0aWYgKHNlbGVjdFJvdyA9PT0gdHJ1ZSAmJiB0aGlzLmdyaWRPcHRpb25zLmF1dG9TZWxlY3RGaXJzdFJvdyA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRjb25zdCByb3dEYXRhID0gdGhpcy52aXNpYmxlRGF0YVt0aGlzLnNlbGVjdGVkSW5kZXhdO1xyXG5cdFx0XHR0aGlzLm9uUm93Q2xpY2tlZChyb3dEYXRhLCB0aGlzLnNlbGVjdGVkSW5kZXgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdCg8SFRNTFRhYmxlRWxlbWVudD50aGlzLnRhYmxlUmVmLm5hdGl2ZUVsZW1lbnQpLmZvY3VzKCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyByZWxvYWRHcmlkKGFkZGl0aW9uYWxQYXJhbXM6IGFueSk6IFByb21pc2U8U2xpY2tHcmlkUmVzcG9uc2VNb2RlbD4ge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0YXdhaXQgdGhpcy5yZXNpemVHcmlkKCk7XHJcblx0XHRcdGF3YWl0IHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5sb2NrKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX1JFTE9BREdSSURcIik7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLnVybCA9IHRoaXMuZ3JpZE9wdGlvbnMuZ2V0VXJsO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5odHRwSGVhZGVycyA9IHRoaXMuZ3JpZE9wdGlvbnMuaHR0cEhlYWRlcnM7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLmFkZGl0aW9uYWxQYXJhbXMgPSBhZGRpdGlvbmFsUGFyYW1zO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwucmVjb3Jkc1BlclBhZ2UgPSB0aGlzLnJlY29yZHNQZXJQYWdlO1xyXG5cclxuXHRcdFx0bGV0IHJlc3BvbnNlTW9kZWw6IFNsaWNrR3JpZFJlc3BvbnNlTW9kZWwgPSBhd2FpdCB0aGlzLnJlbG9hZCh0aGlzLnJlcXVlc3RNb2RlbCk7XHJcblx0XHRcdHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5yZWxlYXNlKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX1JFTE9BREdSSURcIik7XHJcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2VNb2RlbCk7XHJcblx0XHR9XHJcblx0XHRjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihlcnJvcik7XHJcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0YXN5bmMgcmVsb2FkR3JpZFdpdGhSZXF1ZXN0TW9kZWwocmVxdWVzdE1vZGVsOiBTbGlja0dyaWRSZXF1ZXN0TW9kZWwpOiBQcm9taXNlPFNsaWNrR3JpZFJlc3BvbnNlTW9kZWw+IHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGF3YWl0IHRoaXMucmVzaXplR3JpZCgpO1xyXG5cdFx0XHRhd2FpdCB0aGlzLmZ1bmN0aW9uTG9ja1NlcnZpY2UubG9jayhcIkdSSURfXCIgKyB0aGlzLnV1aWQgKyBcIl9SRUxPQURHUklEV0lUSFJFUVVFU1RNT0RFTFwiKTtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwgPSByZXF1ZXN0TW9kZWw7XHJcblx0XHRcdHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gMTtcclxuXHRcdFx0bGV0IHJlc3BvbnNlTW9kZWw6IFNsaWNrR3JpZFJlc3BvbnNlTW9kZWwgPSBhd2FpdCB0aGlzLnJlbG9hZCh0aGlzLnJlcXVlc3RNb2RlbCk7XHJcblx0XHRcdHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5yZWxlYXNlKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX1JFTE9BREdSSURXSVRIUkVRVUVTVE1PREVMXCIpO1xyXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTW9kZWwpO1xyXG5cdFx0fVxyXG5cdFx0Y2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBhc3luYyByZWxvYWQocmVxdWVzdE1vZGVsOiBTbGlja0dyaWRSZXF1ZXN0TW9kZWwpOiBQcm9taXNlPFNsaWNrR3JpZFJlc3BvbnNlTW9kZWw+IHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGF3YWl0IHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5sb2NrKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX1JFTE9BRFwiKTtcclxuXHJcblx0XHRcdHJlcXVlc3RNb2RlbCA9IHRoaXMuZ2V0UmVxdWVzdE1vZGVsKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHJcblx0XHRcdGxldCByZXNwb25zZU1vZGVsOiBTbGlja0dyaWRSZXNwb25zZU1vZGVsID0gbnVsbDtcclxuXHRcdFx0aWYgKHJlcXVlc3RNb2RlbC51cmwpXHJcblx0XHRcdFx0cmVzcG9uc2VNb2RlbCA9IGF3YWl0IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0RGF0YUZyb21TZXJ2ZXIocmVxdWVzdE1vZGVsKTtcclxuXHRcdFx0ZWxzZVxyXG5cdFx0XHRcdHJlc3BvbnNlTW9kZWwgPSBhd2FpdCB0aGlzLmdyaWRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YU9iaihyZXF1ZXN0TW9kZWwsIHRoaXMuZGF0YSk7XHJcblxyXG5cdFx0XHR0aGlzLmxvYWRlZCA9IHRydWU7XHJcblx0XHRcdHRoaXMudG90YWxSZWNvcmRzID0gcmVzcG9uc2VNb2RlbC50b3RhbFJlY29yZHM7XHJcblx0XHRcdHRoaXMudmlzaWJsZURhdGEgPSByZXNwb25zZU1vZGVsLmRhdGE7XHJcblxyXG5cdFx0XHR0aGlzLmZ1bmN0aW9uTG9ja1NlcnZpY2UucmVsZWFzZShcIkdSSURfXCIgKyB0aGlzLnV1aWQgKyBcIl9SRUxPQURcIik7XHJcblx0XHRcdFByb21pc2UucmVzb2x2ZShyZXNwb25zZU1vZGVsKTtcclxuXHRcdH1cclxuXHRcdGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGVycm9yKTtcclxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHVuc2VsZWN0Um93KCkge1xyXG5cdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gbnVsbDtcclxuXHR9XHJcblxyXG5cdHNlbGVjdFJvdyhyb3dOdW1iZXI6IG51bWJlcikge1xyXG5cdFx0bGV0IHJvd0RhdGEgPSB0aGlzLnZpc2libGVEYXRhW3Jvd051bWJlcl07XHJcblx0XHR0aGlzLm9uUm93Q2xpY2tlZChyb3dEYXRhLCByb3dOdW1iZXIpO1xyXG5cdH1cclxuXHJcblx0Z2V0Q29sdW1uSFRNTChyb3dEYXRhLCBkYXRhRmllbGROYW1lKSB7XHJcblx0XHRjb25zdCBjb2x1bW5IVE1MID0gU2xpY2tVdGlsc1NlcnZpY2UuZ2V0RGVlcE9iamVjdChyb3dEYXRhLCBkYXRhRmllbGROYW1lKTtcclxuXHJcblx0XHRpZiAoY29sdW1uSFRNTCA9PT0gbnVsbCB8fCBjb2x1bW5IVE1MID09PSB1bmRlZmluZWQpXHJcblx0XHRcdHJldHVybiAnJztcclxuXHJcblx0XHRyZXR1cm4gY29sdW1uSFRNTC50b1N0cmluZygpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgc29ydEJ5KHNvcnRDb2x1bW46IElTbGlja0dyaWRDb2x1bW5Nb2RlbCkge1xyXG5cdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZvckVhY2goYyA9PiB7XHJcblx0XHRcdGlmIChzb3J0Q29sdW1uICYmIGMuY29sdW1uS2V5ICE9PSBzb3J0Q29sdW1uLmNvbHVtbktleSkge1xyXG5cclxuXHRcdFx0XHRjLnNvcnREaXJlY3Rpb24gPSBTbGlja0dyaWRDb2x1bW5Tb3J0RGlyZWN0aW9uLm5vbmU7XHJcblx0XHRcdH1cclxuXHRcdH0pXHJcblxyXG5cdFx0aWYgKHNvcnRDb2x1bW4pIHtcclxuXHRcdFx0aWYgKHNvcnRDb2x1bW4uc29ydERpcmVjdGlvbiA9PT0gU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbi5ub25lKSB7XHJcblx0XHRcdFx0dGhpcy52aXNpYmxlQ29sdW1ucy5mb3JFYWNoKGMgPT4gYy5zb3J0RGlyZWN0aW9uID0gU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbi5ub25lKTtcclxuXHRcdFx0XHRzb3J0Q29sdW1uLnNvcnREaXJlY3Rpb24gPSBTbGlja0dyaWRDb2x1bW5Tb3J0RGlyZWN0aW9uLmFzYztcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIGlmIChzb3J0Q29sdW1uLnNvcnREaXJlY3Rpb24gPT09IFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24uYXNjKVxyXG5cdFx0XHRcdHNvcnRDb2x1bW4uc29ydERpcmVjdGlvbiA9IFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24uZGVzYztcclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0c29ydENvbHVtbi5zb3J0RGlyZWN0aW9uID0gU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbi5ub25lO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5zYXZlQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gMTtcclxuXHRcdGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdGlmICh0aGlzLnZpc2libGVEYXRhICYmIHRoaXMudmlzaWJsZURhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmdyaWRPcHRpb25zLmF1dG9TZWxlY3RGaXJzdFJvdyA9PT0gdHJ1ZSlcclxuXHRcdFx0dGhpcy5zZWxlY3RSb3coMCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBvblNlYXJjaFNlbGVjdChkZFZhbHVlLCBjb2x1bW46IElTbGlja0dyaWRDb2x1bW5Nb2RlbCkge1xyXG5cdFx0aWYgKCF0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMpXHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcyA9IFtdO1xyXG5cclxuXHRcdGxldCBjb2x1bW5TZWFyY2hWYWx1ZUlkeCA9IHRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcy5maW5kSW5kZXgoeCA9PiB4LmNvbHVtbk5hbWUgPT09IGNvbHVtbi5kYXRhRmllbGROYW1lKTtcclxuXHRcdGlmIChjb2x1bW5TZWFyY2hWYWx1ZUlkeCA+PSAwKVxyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMuc3BsaWNlKGNvbHVtblNlYXJjaFZhbHVlSWR4LCAxKTtcclxuXHJcblx0XHRjb2x1bW4uaXNGaWx0ZXJpbmcgPSBmYWxzZTtcclxuXHJcblx0XHRpZiAoZGRWYWx1ZSkge1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMucHVzaCg8SVNsaWNrR3JpZFJlcXVlc3RTZWFyY2hNb2RlbD57XHJcblx0XHRcdFx0Y29sdW1uTmFtZTogY29sdW1uLmRhdGFGaWVsZE5hbWUsXHJcblx0XHRcdFx0c2VhcmNoVmFsdWVJZDogZGRWYWx1ZS5pZCxcclxuXHRcdFx0XHRzZWFyY2hWYWx1ZVRleHQ6IGRkVmFsdWUudGV4dFxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdGNvbHVtbi5pc0ZpbHRlcmluZyA9IHRydWU7XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0Y29sdW1uLmlzTG9ja2VkID0gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gMTtcclxuXHRcdGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdGlmICh0aGlzLnZpc2libGVEYXRhICYmIHRoaXMudmlzaWJsZURhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmdyaWRPcHRpb25zLmF1dG9TZWxlY3RGaXJzdFJvdyA9PT0gdHJ1ZSlcclxuXHRcdFx0dGhpcy5zZWxlY3RSb3coMCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBvblNlYXJjaChjb2x1bW46IElTbGlja0dyaWRDb2x1bW5Nb2RlbCkge1xyXG5cdFx0YXdhaXQgU2xpY2tTbGVlcFNlcnZpY2Uuc2xlZXAoKTtcclxuXHJcblx0XHRpZiAoIXRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcylcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzID0gW107XHJcblxyXG5cdFx0aWYgKGNvbHVtbi5maWx0ZXJUZXh0ID09PSBjb2x1bW4ubGFzdFNlYXJjaFRleHQpXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHRjb2x1bW4ubGFzdFNlYXJjaFRleHQgPSBjb2x1bW4uZmlsdGVyVGV4dDtcclxuXHRcdGNvbHVtbi5pc0ZpbHRlcmluZyA9ICEhY29sdW1uLmZpbHRlclRleHQ7XHJcblx0XHRpZiAoIWNvbHVtbi5pc0ZpbHRlcmluZylcclxuXHRcdFx0Y29sdW1uLmlzTG9ja2VkID0gZmFsc2U7XHJcblxyXG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMuc2VhcmNoVGltZW91dCk7XHJcblx0XHR0aGlzLnNlYXJjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuXHRcdFx0dGhpcy5zYXZlQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblxyXG5cdFx0XHRsZXQgY29sdW1uU2VhcmNoVmFsdWVJZHggPSB0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMuZmluZEluZGV4KHggPT4geC5jb2x1bW5OYW1lID09PSBjb2x1bW4uZGF0YUZpZWxkTmFtZSk7XHJcblx0XHRcdGlmIChjb2x1bW5TZWFyY2hWYWx1ZUlkeCA+PSAwKVxyXG5cdFx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcy5zcGxpY2UoY29sdW1uU2VhcmNoVmFsdWVJZHgsIDEpO1xyXG5cclxuXHRcdFx0aWYgKGNvbHVtbi5maWx0ZXJUZXh0KSB7XHJcblx0XHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzLnB1c2goPElTbGlja0dyaWRSZXF1ZXN0U2VhcmNoTW9kZWw+e1xyXG5cdFx0XHRcdFx0Y29sdW1uTmFtZTogY29sdW1uLmRhdGFGaWVsZE5hbWUsXHJcblx0XHRcdFx0XHRzZWFyY2hWYWx1ZVRleHQ6IGNvbHVtbi5maWx0ZXJUZXh0XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gMTtcclxuXHRcdFx0YXdhaXQgdGhpcy5yZWxvYWQodGhpcy5yZXF1ZXN0TW9kZWwpO1xyXG5cdFx0XHRpZiAodGhpcy52aXNpYmxlRGF0YSAmJiB0aGlzLnZpc2libGVEYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5ncmlkT3B0aW9ucy5hdXRvU2VsZWN0Rmlyc3RSb3cgPT09IHRydWUpXHJcblx0XHRcdFx0dGhpcy5zZWxlY3RSb3coMCk7XHJcblx0XHR9LCAyNTApO1xyXG5cdH1cclxuXHJcblx0dG9nZ2xlTG9jayhjb2x1bW46IElTbGlja0dyaWRDb2x1bW5Nb2RlbCkge1xyXG5cdFx0Y29sdW1uLmlzTG9ja2VkID0gIWNvbHVtbi5pc0xvY2tlZDtcclxuXHJcblx0XHR0aGlzLnNhdmVDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHJlc2V0RmlsdGVyKGNvbHVtbjogSVNsaWNrR3JpZENvbHVtbk1vZGVsKSB7XHJcblx0XHRjb2x1bW4uaXNGaWx0ZXJpbmcgPSBmYWxzZTtcclxuXHRcdGNvbHVtbi5pc0xvY2tlZCA9IGZhbHNlO1xyXG5cclxuXHRcdGNvbHVtbi5maWx0ZXJUZXh0ID0gbnVsbDtcclxuXHRcdGNvbHVtbi5sYXN0U2VhcmNoVGV4dCA9IG51bGw7XHJcblx0XHRjb2x1bW4uZmlsdGVyRHJvcGRvd25WYWx1ZSA9IG51bGw7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMgPSB0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMuZmlsdGVyKHggPT4geC5jb2x1bW5OYW1lICE9PSBjb2x1bW4uZGF0YUZpZWxkTmFtZSk7XHJcblxyXG5cdFx0dGhpcy5zYXZlQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gMTtcclxuXHRcdGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdGlmICh0aGlzLnZpc2libGVEYXRhICYmIHRoaXMudmlzaWJsZURhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmdyaWRPcHRpb25zLmF1dG9TZWxlY3RGaXJzdFJvdyA9PT0gdHJ1ZSlcclxuXHRcdFx0dGhpcy5zZWxlY3RSb3coMCk7XHJcblx0fVxyXG5cclxuXHRvcGVuQ29sdW1uU2VsZWN0RGlhbG9nKCkge1xyXG5cdFx0dGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zID0gWy4uLnRoaXMuZ3JpZE9wdGlvbnMuY29sdW1uc107XHJcblx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMuc29ydCgoYSwgYikgPT4gKGEuZGlzcGxheU9yZGVyID4gYi5kaXNwbGF5T3JkZXIpID8gMSA6IChhLmRpc3BsYXlPcmRlciA8IGIuZGlzcGxheU9yZGVyKSA/IC0xIDogMCk7XHJcblxyXG5cdFx0dGhpcy5jb2x1bW5TZWxlY3REaWFsb2dSZWYuc2hvd0RpYWxvZygpO1xyXG5cdH1cclxuXHJcblx0b25Db2x1bW5Ecm9wKGU6IGFueSkge1xyXG5cdFx0Y29uc29sZS5sb2coZSk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBvbkNvbHVtblJlb3JkZXIoZTogbnVtYmVyW10pIHtcclxuXHRcdGNvbnN0IG9sZE9yZGVyID0gZVswXTtcclxuXHRcdGNvbnN0IG5ld09yZGVyID0gZVsxXTtcclxuXHJcblx0XHRpZiAob2xkT3JkZXIgPT09IG5ld09yZGVyKVxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0Y29uc3Qgc2VsZWN0ZWRDb2wgPSB0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMuc3BsaWNlKG9sZE9yZGVyLCAxKVswXTtcclxuXHRcdHNlbGVjdGVkQ29sLmRpc3BsYXlPcmRlciA9IG5ld09yZGVyO1xyXG5cclxuXHRcdGxldCBjdXJyZW50T3JkZXIgPSAwO1xyXG5cdFx0Ly8gRXZlcnl0aGluZyB1cCB0byB0aGUgbmV3IG9yZGVyIHJlb3JkZXJlZCBmcm9tIDBcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdC8vIElmIHdlJ3JlIGF0IG5ld09yZGVyLCBsZWF2ZSBhIHNwb3RcclxuXHRcdFx0aWYgKGkgPT09IG5ld09yZGVyKVxyXG5cdFx0XHRcdGN1cnJlbnRPcmRlcisrO1xyXG5cdFx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnNbaV0uZGlzcGxheU9yZGVyID0gY3VycmVudE9yZGVyKys7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zID0gWy4uLnRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1ucywgc2VsZWN0ZWRDb2xdO1xyXG5cdFx0dGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zID0gdGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zLnNvcnQoKGEsIGIpID0+IChhLmRpc3BsYXlPcmRlciA+IGIuZGlzcGxheU9yZGVyKSA/IDEgOiAoYS5kaXNwbGF5T3JkZXIgPCBiLmRpc3BsYXlPcmRlcikgPyAtMSA6IDApO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgYWRkTmV3RmF2b3JpdGUoKSB7XHJcblx0XHR0aGlzLm5ld0Zhdm9yaXRlVGV4dCA9ICcnO1xyXG5cclxuXHRcdGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCB0aGlzLmFkZE5ld0Zhdm9yaXRlRGlhbG9nUmVmLmNvbmZpcm0oKTtcclxuXHJcblx0XHRpZiAoY29uZmlybVJlc3VsdCA9PT0gU2xpY2tDb25maXJtRGlhbG9nUmVzdWx0cy5PayAmJiB0aGlzLm5ld0Zhdm9yaXRlVGV4dCkge1xyXG5cdFx0XHQvLyBTYXZlIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24gdG8gbG9jYWxzdG9yYWdlXHJcblx0XHRcdHRoaXMuc2F2ZURpYWxvZ0NvbHVtbnNUb0xvY2FsU3RvcmFnZSgpO1xyXG5cclxuXHRcdFx0dGhpcy5mYXZvcml0ZXMucHVzaChuZXcgRHJvcERvd25Nb2RlbCh0aGlzLm5ld0Zhdm9yaXRlVGV4dCkpO1xyXG5cclxuXHRcdFx0dGhpcy5zZWxlY3RlZEZhdm9yaXRlID0gdGhpcy5uZXdGYXZvcml0ZVRleHQ7XHJcblx0XHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX1NFTEVDVEVEX0ZBVk9SSVRFXCIsIHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSk7XHJcblxyXG5cdFx0XHRjb25zdCBmYXZvcml0ZXNKc29uID0gSlNPTi5zdHJpbmdpZnkodGhpcy5mYXZvcml0ZXMubWFwKHggPT4geC50ZXh0KSk7XHJcblx0XHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX0ZBVk9SSVRFU1wiLCBmYXZvcml0ZXNKc29uKTtcclxuXHJcblx0XHRcdC8vIFNhdmUgdGhlIG5ldyBvbmUgdG8gbG9jYWxzdG9yYWdlXHJcblx0XHRcdHRoaXMuc2F2ZURpYWxvZ0NvbHVtbnNUb0xvY2FsU3RvcmFnZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0bG9hZEZhdm9yaXRlKGZhdm9yaXRlOiBEcm9wRG93bk1vZGVsKSB7XHJcblx0XHR0aGlzLnNhdmVEaWFsb2dDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKTtcclxuXHJcblx0XHR0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPSBmYXZvcml0ZS50ZXh0O1xyXG5cdFx0bGV0IGdyaWRDb2x1bW5zSnNvbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBHUklEXyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fV9DT0xVTU5TJHt0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPT09ICdEZWZhdWx0JyA/ICcnIDogJ18nICsgdGhpcy5zZWxlY3RlZEZhdm9yaXRlfWApO1xyXG5cdFx0aWYgKGdyaWRDb2x1bW5zSnNvbikge1xyXG5cdFx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMgPSA8SVNsaWNrR3JpZENvbHVtbk1vZGVsW10+SlNPTi5wYXJzZShncmlkQ29sdW1uc0pzb24pO1xyXG5cdFx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMuc29ydCgoYSwgYikgPT4gKGEuZGlzcGxheU9yZGVyID4gYi5kaXNwbGF5T3JkZXIpID8gMSA6IChhLmRpc3BsYXlPcmRlciA8IGIuZGlzcGxheU9yZGVyKSA/IC0xIDogMCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRhc3luYyBzZXRGYXZvcml0ZShmYXZvcml0ZTogc3RyaW5nKSB7XHJcblx0XHR0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPSBmYXZvcml0ZTtcclxuXHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX1NFTEVDVEVEX0ZBVk9SSVRFXCIsIHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSk7XHJcblxyXG5cdFx0bGV0IGdyaWRDb2x1bW5zSnNvbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBHUklEXyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fV9DT0xVTU5TJHt0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPT09ICdEZWZhdWx0JyA/ICcnIDogJ18nICsgdGhpcy5zZWxlY3RlZEZhdm9yaXRlfWApO1xyXG5cdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zID0gPElTbGlja0dyaWRDb2x1bW5Nb2RlbFtdPkpTT04ucGFyc2UoZ3JpZENvbHVtbnNKc29uKTtcclxuXHRcdHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5kaXNwbGF5T3JkZXIgPiBiLmRpc3BsYXlPcmRlcikgPyAxIDogKGEuZGlzcGxheU9yZGVyIDwgYi5kaXNwbGF5T3JkZXIpID8gLTEgOiAwKTtcclxuXHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZpbHRlcihjID0+IGMudmlzaWJsZSA9PT0gdHJ1ZSk7XHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5kaXNwbGF5T3JkZXIgPiBiLmRpc3BsYXlPcmRlcikgPyAxIDogKGEuZGlzcGxheU9yZGVyIDwgYi5kaXNwbGF5T3JkZXIpID8gLTEgOiAwKTtcclxuXHRcdHRoaXMuc2hvd1NlYXJjaFJvdyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGMgPT4gYy5maWx0ZXJUeXBlICE9PSBTbGlja0dyaWRDb2x1bW5GaWx0ZXJUeXBlcy5ub25lKS5sZW5ndGggPiAwO1xyXG5cclxuXHRcdHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG5cdFx0dGhpcy5yZXF1ZXN0TW9kZWwucGFnZSA9IDE7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5yZWNvcmRzUGVyUGFnZSA9IHRoaXMucmVjb3Jkc1BlclBhZ2U7XHJcblx0XHRhd2FpdCB0aGlzLnJlbG9hZCh0aGlzLnJlcXVlc3RNb2RlbCk7XHJcblx0fVxyXG5cclxuXHRvblNhdmVDb2x1bW5zKCkge1xyXG5cdFx0dGhpcy5zYXZlRGlhbG9nQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblxyXG5cdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zID0gWy4uLnRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1uc107XHJcblxyXG5cdFx0Ly8gTWFrZSBzdXJlIGlmIHRoZXkndmUgaGlkZGVuIGEgY29sdW1uIHRoYXQgd2UgYXJlbid0IHRyeWluZyB0byBzb3J0IG9yIGZpbHRlciBieSB0aGlzIGNvbHVtblxyXG5cdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZvckVhY2goeCA9PiB7XHJcblx0XHRcdGlmICh4LnZpc2libGUgPT09IGZhbHNlKSB7XHJcblx0XHRcdFx0eC5maWx0ZXJEcm9wZG93blZhbHVlID0gbnVsbDtcclxuXHRcdFx0XHR4LmZpbHRlclRleHQgPSBudWxsO1xyXG5cdFx0XHRcdHguaXNGaWx0ZXJpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHR4LmlzTG9ja2VkID0gZmFsc2U7XHJcblx0XHRcdFx0eC5sYXN0U2VhcmNoVGV4dCA9IG51bGw7XHJcblx0XHRcdFx0eC5zb3J0RGlyZWN0aW9uID0gbnVsbDtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLnZpc2libGUgPT09IHRydWUpO1xyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuc29ydCgoYSwgYikgPT4gKGEuZGlzcGxheU9yZGVyID4gYi5kaXNwbGF5T3JkZXIpID8gMSA6IChhLmRpc3BsYXlPcmRlciA8IGIuZGlzcGxheU9yZGVyKSA/IC0xIDogMCk7XHJcblx0XHR0aGlzLnNob3dTZWFyY2hSb3cgPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihjID0+IGMuZmlsdGVyVHlwZSAhPT0gU2xpY2tHcmlkQ29sdW1uRmlsdGVyVHlwZXMubm9uZSkubGVuZ3RoID4gMDtcclxuXHJcblx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ1JlZi5oaWRlRGlhbG9nKCk7XHJcblx0XHR0aGlzLnJlc2l6ZUdyaWQoKTtcclxuXHJcblx0XHRpZiAodGhpcy5vbkZhdm9yaXRlc01vZGlmaWVkKSB7XHJcblx0XHRcdGNvbnN0IGdyaWRGYXZvcml0ZXM6IElTbGlja0dyaWRGYXZvcml0ZU1vZGVsW10gPSB0aGlzLmZhdm9yaXRlcy5tYXAoZmF2b3JpdGUgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGdyaWRGYXZvcml0ZSA9IG5ldyBTbGlja0dyaWRGYXZvcml0ZU1vZGVsKCk7XHJcblx0XHRcdFx0Z3JpZEZhdm9yaXRlLmZhdm9yaXRlTmFtZSA9IGZhdm9yaXRlLnRleHQ7XHJcblx0XHRcdFx0Y29uc3Qgc3VmZml4ID0gZ3JpZEZhdm9yaXRlLmZhdm9yaXRlTmFtZSA9PT0gJ0RlZmF1bHQnID8gJycgOiAoJ18nICsgZ3JpZEZhdm9yaXRlLmZhdm9yaXRlTmFtZSk7XHJcblx0XHRcdFx0Y29uc3QgZGlhbG9nQ29sdW1uc0pTT04gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgR1JJRF8ke3RoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleX1fQ09MVU1OUyR7c3VmZml4fWApO1xyXG5cdFx0XHRcdGdyaWRGYXZvcml0ZS5jb2x1bW5zID0gSlNPTi5wYXJzZShkaWFsb2dDb2x1bW5zSlNPTik7XHJcblx0XHRcdFx0cmV0dXJuIGdyaWRGYXZvcml0ZTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHR0aGlzLm9uRmF2b3JpdGVzTW9kaWZpZWQuZW1pdChncmlkRmF2b3JpdGVzKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdG9uQ2FuY2VsQ29sdW1ucygpIHtcclxuXHRcdHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nUmVmLmhpZGVEaWFsb2coKTtcclxuXHR9XHJcblxyXG5cdHNhdmVEaWFsb2dDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKSB7XHJcblx0XHRsZXQgZGlhbG9nQ29sdW1uc0pTT04gPSBKU09OLnN0cmluZ2lmeSh0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMpO1xyXG5cdFx0aWYgKHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSkge1xyXG5cdFx0XHRjb25zdCBzdWZmaXggPSB0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPT09ICdEZWZhdWx0JyA/ICcnIDogKCdfJyArIHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSk7XHJcblx0XHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBHUklEXyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fV9DT0xVTU5TJHtzdWZmaXh9YCwgZGlhbG9nQ29sdW1uc0pTT04pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0c2F2ZUNvbHVtbnNUb0xvY2FsU3RvcmFnZSgpIHtcclxuXHRcdGxldCBncmlkQ29sdW1uc0pTT04gPSBKU09OLnN0cmluZ2lmeSh0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMpO1xyXG5cdFx0aWYgKHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSkge1xyXG5cdFx0XHRjb25zdCBzdWZmaXggPSB0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPT09ICdEZWZhdWx0JyA/ICcnIDogKCdfJyArIHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSk7XHJcblxyXG5cdFx0XHRsZXQgZ3JpZENvbHVtbnNKc29uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3N1ZmZpeH1gKTtcclxuXHRcdFx0XHJcblx0XHRcdGlmIChncmlkQ29sdW1uc0pzb24pIHtcclxuXHRcdFx0XHRsZXQgY29sdW1ucyA9IDxJU2xpY2tHcmlkQ29sdW1uTW9kZWxbXT5KU09OLnBhcnNlKGdyaWRDb2x1bW5zSnNvbik7XHJcblxyXG5cdFx0XHRcdGxldCBkaXNwbGF5T3JkZXIgPSAwO1xyXG5cdFx0XHRcdGNvbHVtbnMuZm9yRWFjaChjID0+IHtcclxuXHRcdFx0XHRcdGxldCBjb2x1bW4gPSB0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuZmluZChncmlkQ29sdW1uID0+IGdyaWRDb2x1bW4uZGF0YUZpZWxkTmFtZSA9PT0gYy5kYXRhRmllbGROYW1lKTtcclxuXHRcdFx0XHRcdGlmIChjb2x1bW4pIHtcclxuXHRcdFx0XHRcdFx0Yy5kaXNwbGF5T3JkZXIgPSBkaXNwbGF5T3JkZXI7XHJcblx0XHRcdFx0XHRcdGMudGl0bGVPcmllbnRhdGlvbiA9IGNvbHVtbi50aXRsZU9yaWVudGF0aW9uO1xyXG5cdFx0XHRcdFx0XHRjLnRpdGxlSGVpZ2h0ID0gY29sdW1uLnRpdGxlSGVpZ2h0O1xyXG5cdFx0XHRcdFx0XHRjLndpZHRoID0gY29sdW1uLndpZHRoO1xyXG5cdFx0XHRcdFx0XHRjLmZpbHRlckRyb3Bkb3duVmFsdWUgPSBjb2x1bW4uZmlsdGVyRHJvcGRvd25WYWx1ZTtcclxuXHRcdFx0XHRcdFx0Yy5maWx0ZXJUZXh0ID0gY29sdW1uLmZpbHRlclRleHQ7XHJcblx0XHRcdFx0XHRcdGMuaXNMb2NrZWQgPSBjb2x1bW4uaXNMb2NrZWQ7XHJcblx0XHRcdFx0XHRcdGMuaXNGaWx0ZXJpbmcgPSBjb2x1bW4uaXNGaWx0ZXJpbmc7XHJcblx0XHRcdFx0XHRcdGMuc29ydERpcmVjdGlvbiA9IGNvbHVtbi5zb3J0RGlyZWN0aW9uO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGRpc3BsYXlPcmRlcisrO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGNvbHVtbnMgPSBjb2x1bW5zLnNvcnQoKGEsIGIpID0+IChhLmRpc3BsYXlPcmRlciA+IGIuZGlzcGxheU9yZGVyKSA/IDEgOiAoYS5kaXNwbGF5T3JkZXIgPCBiLmRpc3BsYXlPcmRlcikgPyAtMSA6IDApO1xyXG5cdFx0XHRcdGdyaWRDb2x1bW5zSlNPTiA9IEpTT04uc3RyaW5naWZ5KGNvbHVtbnMpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgR1JJRF8ke3RoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleX1fQ09MVU1OUyR7c3VmZml4fWAsIGdyaWRDb2x1bW5zSlNPTik7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMub25GYXZvcml0ZXNNb2RpZmllZCkge1xyXG5cdFx0XHRjb25zdCBncmlkRmF2b3JpdGVzOiBJU2xpY2tHcmlkRmF2b3JpdGVNb2RlbFtdID0gdGhpcy5mYXZvcml0ZXMubWFwKGZhdm9yaXRlID0+IHtcclxuXHRcdFx0XHRjb25zdCBncmlkRmF2b3JpdGUgPSBuZXcgU2xpY2tHcmlkRmF2b3JpdGVNb2RlbCgpO1xyXG5cdFx0XHRcdGdyaWRGYXZvcml0ZS5mYXZvcml0ZU5hbWUgPSBmYXZvcml0ZS50ZXh0O1xyXG5cdFx0XHRcdGNvbnN0IHN1ZmZpeCA9IGdyaWRGYXZvcml0ZS5mYXZvcml0ZU5hbWUgPT09ICdEZWZhdWx0JyA/ICcnIDogKCdfJyArIGdyaWRGYXZvcml0ZS5mYXZvcml0ZU5hbWUpO1xyXG5cdFx0XHRcdGNvbnN0IGRpYWxvZ0NvbHVtbnNKU09OID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3N1ZmZpeH1gKTtcclxuXHRcdFx0XHRncmlkRmF2b3JpdGUuY29sdW1ucyA9IEpTT04ucGFyc2UoZGlhbG9nQ29sdW1uc0pTT04pO1xyXG5cdFx0XHRcdHJldHVybiBncmlkRmF2b3JpdGU7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0dGhpcy5vbkZhdm9yaXRlc01vZGlmaWVkLmVtaXQoZ3JpZEZhdm9yaXRlcyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0cHJpdmF0ZSBhc3luYyByZXNpemVHcmlkKGZvcmNlUmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oYXN5bmMgKHJlc29sdmUpID0+IHtcclxuXHRcdFx0aWYgKCFmb3JjZVJlZnJlc2ggJiYgdGhpcy5zbGlja0dyaWRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgPT09IHRoaXMuc2xpY2tHcmlkSGVpZ2h0KSB7XHJcblx0XHRcdFx0cmVzb2x2ZSgpO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKHRoaXMucmVjb3Jkc1BlclBhZ2VWYWx1ZSA9PT0gJ0F1dG8nKSB7XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5mdW5jdGlvbkxvY2tTZXJ2aWNlLmxvY2soXCJHUklEX1wiICsgdGhpcy51dWlkICsgXCJfUkVTSVpFR1JJRFwiKTtcclxuXHJcblx0XHRcdFx0dGhpcy5zbGlja0dyaWRIZWlnaHQgPSB0aGlzLnRhYmxlQ29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG5cclxuXHRcdFx0XHRjb25zdCB0ZXN0Um93ID0gKDxIVE1MVGFibGVFbGVtZW50PnRoaXMudGFibGVSZWYubmF0aXZlRWxlbWVudCkuaW5zZXJ0Um93KDApO1xyXG5cdFx0XHRcdGNvbnN0IHRlc3RDZWxsID0gdGVzdFJvdy5pbnNlcnRDZWxsKDApO1xyXG5cdFx0XHRcdHRlc3RDZWxsLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xyXG5cdFx0XHRcdHRlc3RDZWxsLmlubmVySFRNTCA9IFwiJk5CU1BcIjtcclxuXHRcdFx0XHRjb25zdCByb3dIZWlnaHQgPSB0ZXN0Q2VsbC5vZmZzZXRIZWlnaHQ7XHJcblx0XHRcdFx0KDxIVE1MVGFibGVFbGVtZW50PnRoaXMudGFibGVSZWYubmF0aXZlRWxlbWVudCkuZGVsZXRlUm93KDApO1xyXG5cclxuXHRcdFx0XHRsZXQgaGVhZGVySGVpZ2h0ID0gdGhpcy50YWJsZUhlYWRlclJvd1JlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCArIDI7XHJcblx0XHRcdFx0aWYgKHRoaXMudGFibGVIZWFkZXJTZWFyY2hSb3dSZWYpXHJcblx0XHRcdFx0XHRoZWFkZXJIZWlnaHQgKz0gdGhpcy50YWJsZUhlYWRlclNlYXJjaFJvd1JlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCArIDI7XHJcblx0XHRcdFx0Y29uc3QgY2xpZW50SGVpZ2h0ID0gdGhpcy50YWJsZUNvbnRhaW5lclJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCAtIGhlYWRlckhlaWdodDtcclxuXHRcdFx0XHR0aGlzLnJlY29yZHNQZXJQYWdlID0gcGFyc2VJbnQoKChjbGllbnRIZWlnaHQgLyByb3dIZWlnaHQpIC0gMSkudG9GaXhlZCgwKSk7XHJcblx0XHRcdFx0bGV0IGFjdHVhbFJvd0hlaWdodCA9IHBhcnNlSW50KChjbGllbnRIZWlnaHQgLyB0aGlzLnJlY29yZHNQZXJQYWdlKS50b0ZpeGVkKDApKSAtIDE7XHJcblx0XHRcdFx0aWYgKGFjdHVhbFJvd0hlaWdodCA8IHJvd0hlaWdodClcclxuXHRcdFx0XHRcdGFjdHVhbFJvd0hlaWdodCA9IHJvd0hlaWdodDtcclxuXHJcblx0XHRcdFx0Y29uc3QgYWxsUm93cyA9IDxIVE1MRWxlbWVudFtdPnRoaXMuc2xpY2tHcmlkUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi50YWJsZSB0Ym9keSB0clwiKTtcclxuXHRcdFx0XHRhbGxSb3dzLmZvckVhY2gocm93ID0+IHtcclxuXHRcdFx0XHRcdHJvdy5zdHlsZS5oZWlnaHQgPSAoYWN0dWFsUm93SGVpZ2h0KSArIFwicHhcIjtcclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0dGhpcy5mdW5jdGlvbkxvY2tTZXJ2aWNlLnJlbGVhc2UoXCJHUklEX1wiICsgdGhpcy51dWlkICsgXCJfUkVTSVpFR1JJRFwiKTtcclxuXHJcblx0XHRcdFx0dGhpcy5ncmlkT3BhY2l0eSA9IDE7XHJcblx0XHRcdFx0dGhpcy5zaG93VGVzdFJvdyA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRyZXNvbHZlKCk7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0YXdhaXQgU2xpY2tTbGVlcFNlcnZpY2Uuc2xlZXAoKTtcclxuXHJcblx0XHRcdFx0dGhpcy5yZWNvcmRzUGVyUGFnZSA9IHBhcnNlSW50KHRoaXMucmVjb3Jkc1BlclBhZ2VWYWx1ZSk7XHJcblx0XHRcdFx0dGhpcy5ncmlkT3BhY2l0eSA9IDE7XHJcblx0XHRcdFx0cmVzb2x2ZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGFkZENvbHVtbihjb2x1bW46IElTbGlja0dyaWRDb2x1bW5Nb2RlbCwgaWR4OiBudW1iZXIgPSBudWxsKSB7XHJcblxyXG5cdFx0aWYgKGlkeCA9PT0gbnVsbClcclxuXHRcdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLnB1c2goY29sdW1uKTtcclxuXHRcdGVsc2VcclxuXHRcdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLnNwbGljZShpZHgsIDAsIGNvbHVtbik7XHJcblxyXG5cdFx0dGhpcy5zZXRHcmlkT3B0aW9ucyh0aGlzLmdyaWRPcHRpb25zKTtcclxuXHR9XHJcblxyXG5cdGdldFJlcXVlc3RNb2RlbChyZXF1ZXN0TW9kZWw6IFNsaWNrR3JpZFJlcXVlc3RNb2RlbCA9IG51bGwpOiBTbGlja0dyaWRSZXF1ZXN0TW9kZWwge1xyXG5cdFx0aWYgKCFyZXF1ZXN0TW9kZWwpXHJcblx0XHRcdHJlcXVlc3RNb2RlbCA9IHRoaXMucmVxdWVzdE1vZGVsO1xyXG5cclxuXHRcdHJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMgPSBbXTtcclxuXHJcblx0XHR0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuZm9yRWFjaChjID0+IHtcclxuXHRcdFx0aWYgKGMudmlzaWJsZSkge1xyXG5cdFx0XHRcdGlmIChjLmZpbHRlclR5cGUgPT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLnRleHQgJiYgYy5maWx0ZXJUZXh0KSB7XHJcblx0XHRcdFx0XHRjLmZpbHRlclRleHQgPSBjLmZpbHRlclRleHQ7XHJcblx0XHRcdFx0XHRyZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzLnB1c2goPElTbGlja0dyaWRSZXF1ZXN0U2VhcmNoTW9kZWw+e1xyXG5cdFx0XHRcdFx0XHRjb2x1bW5OYW1lOiBjLmRhdGFGaWVsZE5hbWUsXHJcblx0XHRcdFx0XHRcdHNlYXJjaFZhbHVlSWQ6IG51bGwsXHJcblx0XHRcdFx0XHRcdHNlYXJjaFZhbHVlVGV4dDogYy5maWx0ZXJUZXh0XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0ZWxzZSBpZiAoYy5maWx0ZXJUeXBlID09PSBTbGlja0dyaWRDb2x1bW5GaWx0ZXJUeXBlcy5kcm9wZG93biAmJiBjLmZpbHRlckRyb3Bkb3duVmFsdWUpIHtcclxuXHRcdFx0XHRcdGMuZmlsdGVyRHJvcGRvd25WYWx1ZSA9IGMuZmlsdGVyRHJvcGRvd25WYWx1ZTtcclxuXHRcdFx0XHRcdHJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMucHVzaCg8SVNsaWNrR3JpZFJlcXVlc3RTZWFyY2hNb2RlbD57XHJcblx0XHRcdFx0XHRcdGNvbHVtbk5hbWU6IGMuZGF0YUZpZWxkTmFtZSxcclxuXHRcdFx0XHRcdFx0c2VhcmNoVmFsdWVJZDogYy5maWx0ZXJEcm9wZG93blZhbHVlLFxyXG5cdFx0XHRcdFx0XHRzZWFyY2hWYWx1ZVRleHQ6IG51bGxcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0cmVxdWVzdE1vZGVsLnNvcnRDb2x1bW4gPSBudWxsO1xyXG5cdFx0Y29uc3Qgc29ydENvbHVtbiA9IHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5maW5kKHggPT4geC5zb3J0RGlyZWN0aW9uID09PSBTbGlja0dyaWRDb2x1bW5Tb3J0RGlyZWN0aW9uLmFzYyB8fCB4LnNvcnREaXJlY3Rpb24gPT09IFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24uZGVzYyk7XHJcblx0XHRpZiAoc29ydENvbHVtbikge1xyXG5cdFx0XHRyZXF1ZXN0TW9kZWwuc29ydENvbHVtbiA9IChzb3J0Q29sdW1uLnNvcnREaXJlY3Rpb24gPT09IDApID8gbnVsbCA6IHNvcnRDb2x1bW4uZGF0YUZpZWxkTmFtZTtcclxuXHRcdFx0cmVxdWVzdE1vZGVsLnNvcnREaXJlY3Rpb24gPSBzb3J0Q29sdW1uLnNvcnREaXJlY3Rpb247XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHJlcXVlc3RNb2RlbC5yZWNvcmRzUGVyUGFnZSA8PSAwKVxyXG5cdFx0XHRyZXF1ZXN0TW9kZWwucmVjb3Jkc1BlclBhZ2UgPSAyMDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0TW9kZWw7XHJcblx0fVxyXG5cclxuXHRzZXRHcmlkT3B0aW9ucyhncmlkT3B0aW9uczogSVNsaWNrR3JpZE9wdGlvbnMpIHtcclxuXHRcdHRoaXMuZ3JpZE9wdGlvbnMgPSBncmlkT3B0aW9ucztcclxuXHJcblx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5KSB7XHJcblxyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5mYXZvcml0ZXMpIHtcclxuXHRcdFx0XHRjb25zdCBmYXZvcml0ZU5hbWVzID0gdGhpcy5ncmlkT3B0aW9ucy5mYXZvcml0ZXMubWFwKGYgPT4gZi5mYXZvcml0ZU5hbWUpO1xyXG5cdFx0XHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBHUklEXyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fV9GQVZPUklURVNgLCBKU09OLnN0cmluZ2lmeShmYXZvcml0ZU5hbWVzKSk7XHJcblxyXG5cdFx0XHRcdHRoaXMuZ3JpZE9wdGlvbnMuZmF2b3JpdGVzLmZvckVhY2goZmF2b3JpdGUgPT4ge1xyXG5cdFx0XHRcdFx0Ly8gTWFrZSBzdXJlIHdlIGhhdmVuJ3QgYWRkZWQgYSBuZXcgY29sdW1uIHRoYXQgbmVlZHMgdG8gYmUgc2F2ZWRcclxuXHRcdFx0XHRcdHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKGMgPT4ge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBjb2x1bW5FeGlzdHMgPSBmYXZvcml0ZS5jb2x1bW5zLmZpbmRJbmRleCh4ID0+IHguZGF0YUZpZWxkTmFtZSA9PT0gYy5kYXRhRmllbGROYW1lKTtcclxuXHRcdFx0XHRcdFx0aWYgKGNvbHVtbkV4aXN0cyA8IDApXHJcblx0XHRcdFx0XHRcdFx0ZmF2b3JpdGUuY29sdW1ucy5wdXNoKGMpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRsZXQgZ3JpZENvbHVtbnNKU09OID0gSlNPTi5zdHJpbmdpZnkoZmF2b3JpdGUuY29sdW1ucyk7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5KSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHN1ZmZpeCA9IGZhdm9yaXRlLmZhdm9yaXRlTmFtZSA9PT0gJ0RlZmF1bHQnID8gJycgOiAoJ18nICsgZmF2b3JpdGUuZmF2b3JpdGVOYW1lKTtcclxuXHRcdFx0XHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3N1ZmZpeH1gLCBncmlkQ29sdW1uc0pTT04pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRpZiAoZmF2b3JpdGVOYW1lcy5pbmRleE9mKHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSkgPCAwKVxyXG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RlZEZhdm9yaXRlID0gXCJEZWZhdWx0XCI7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX1NFTEVDVEVEX0ZBVk9SSVRFXCIpIHx8ICdEZWZhdWx0JztcclxuXHJcblx0XHRcdC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIGFueSBkdXBsaWNhdGUgY29sdW1uIG5hbWVzXHJcblx0XHRcdHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKGMxID0+IHtcclxuXHRcdFx0XHRjb25zdCBkYXRhRmllbGRDb3VudCA9ICh0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuZmlsdGVyKHggPT4geC5kYXRhRmllbGROYW1lID09PSBjMS5kYXRhRmllbGROYW1lKSB8fCBbXSkubGVuZ3RoO1xyXG5cdFx0XHRcdGlmIChkYXRhRmllbGRDb3VudCA+IDEpXHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKGBHcmlkICR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fSBjb2x1bW4gJHtjMS5kYXRhRmllbGROYW1lfSBpcyBkZWZpbmVkICR7ZGF0YUZpZWxkQ291bnR9IHRpbWVzYCk7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0Y29uc3Qgc3VmZml4ID0gdGhpcy5zZWxlY3RlZEZhdm9yaXRlID09PSAnRGVmYXVsdCcgPyAnJyA6ICgnXycgKyB0aGlzLnNlbGVjdGVkRmF2b3JpdGUpO1xyXG5cdFx0XHRsZXQgZ3JpZENvbHVtbnNKc29uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3N1ZmZpeH1gKTtcclxuXHRcdFx0aWYgKGdyaWRDb2x1bW5zSnNvbikge1xyXG5cdFx0XHRcdGxldCBjb2x1bW5zID0gPElTbGlja0dyaWRDb2x1bW5Nb2RlbFtdPkpTT04ucGFyc2UoZ3JpZENvbHVtbnNKc29uKTtcclxuXHJcblx0XHRcdFx0bGV0IGRpc3BsYXlPcmRlciA9IDA7XHJcblx0XHRcdFx0Y29sdW1ucy5mb3JFYWNoKGMgPT4ge1xyXG5cdFx0XHRcdFx0bGV0IGNvbHVtbiA9IHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5maW5kKGdyaWRDb2x1bW4gPT4gZ3JpZENvbHVtbi5kYXRhRmllbGROYW1lID09PSBjLmRhdGFGaWVsZE5hbWUpO1xyXG5cdFx0XHRcdFx0aWYgKGNvbHVtbikge1xyXG5cdFx0XHRcdFx0XHRjb2x1bW4udmlzaWJsZSA9IGMudmlzaWJsZTtcclxuXHRcdFx0XHRcdFx0Y29sdW1uLmRpc3BsYXlPcmRlciA9IGRpc3BsYXlPcmRlcjtcclxuXHRcdFx0XHRcdFx0Y29sdW1uLnRpdGxlT3JpZW50YXRpb24gPSBjLnRpdGxlT3JpZW50YXRpb247XHJcblx0XHRcdFx0XHRcdGNvbHVtbi50aXRsZUhlaWdodCA9IGMudGl0bGVIZWlnaHQ7XHJcblx0XHRcdFx0XHRcdGNvbHVtbi53aWR0aCA9IGMud2lkdGg7XHJcblx0XHRcdFx0XHRcdGNvbHVtbi5mbGV4aWJsZSA9IGMuZmxleGlibGU7XHJcblx0XHRcdFx0XHRcdGNvbHVtbi5zb3J0RGlyZWN0aW9uID0gYy5zb3J0RGlyZWN0aW9uO1xyXG5cdFx0XHRcdFx0XHRjb2x1bW4uaXNMb2NrZWQgPSBjLmlzTG9ja2VkO1xyXG5cdFx0XHRcdFx0XHQvL2NvbHVtbi5maWx0ZXJUeXBlID0gYy5maWx0ZXJUeXBlO1xyXG5cdFx0XHRcdFx0XHRpZiAoY29sdW1uLmlzTG9ja2VkICYmIGNvbHVtbi5maWx0ZXJUeXBlICE9PSBTbGlja0dyaWRDb2x1bW5GaWx0ZXJUeXBlcy5ub25lKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29sdW1uLmlzRmlsdGVyaW5nID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKGNvbHVtbi5maWx0ZXJUeXBlID09PSBTbGlja0dyaWRDb2x1bW5GaWx0ZXJUeXBlcy50ZXh0KVxyXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uLmZpbHRlclRleHQgPSBjLmZpbHRlclRleHQ7XHJcblx0XHRcdFx0XHRcdFx0ZWxzZSBpZiAoY29sdW1uLmZpbHRlclR5cGUgPT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLmRyb3Bkb3duKVxyXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uLmZpbHRlckRyb3Bkb3duVmFsdWUgPSBjLmZpbHRlckRyb3Bkb3duVmFsdWU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICghY29sdW1uLmZpbHRlclRleHQgJiYgIWNvbHVtbi5maWx0ZXJEcm9wZG93blZhbHVlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb2x1bW4uaXNGaWx0ZXJpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbHVtbi5pc0xvY2tlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uLmZpbHRlclRleHQgPSBudWxsO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uLmZpbHRlckRyb3Bkb3duVmFsdWUgPSBudWxsO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGRpc3BsYXlPcmRlcisrO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0UmVjb3Jkc1BlclBhZ2UgJiYgIWxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX1JFQ09SRFNfUEVSX1BBR0VcIikpXHJcblx0XHRcdFx0dGhpcy5yZWNvcmRzUGVyUGFnZVZhbHVlID0gdGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0UmVjb3Jkc1BlclBhZ2UudG9TdHJpbmcoKTtcclxuXHRcdFx0ZWxzZVxyXG5cdFx0XHRcdHRoaXMucmVjb3Jkc1BlclBhZ2VWYWx1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX1JFQ09SRFNfUEVSX1BBR0VcIikgfHwgXCJBdXRvXCI7XHJcblxyXG5cdFx0XHRjb25zdCBmYXZvcml0ZXNKc29uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJHUklEX1wiICsgdGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5ICsgXCJfRkFWT1JJVEVTXCIpIHx8IGBbXCJEZWZhdWx0XCJdYDtcclxuXHRcdFx0dGhpcy5mYXZvcml0ZXMgPSAoPHN0cmluZ1tdPkpTT04ucGFyc2UoZmF2b3JpdGVzSnNvbikpLm1hcChmYXZvcml0ZSA9PiB7XHJcblx0XHRcdFx0cmV0dXJuIG5ldyBEcm9wRG93bk1vZGVsKGZhdm9yaXRlKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLnZpc2libGUgPT09IHRydWUpO1xyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuc29ydCgoYSwgYikgPT4gKGEuZGlzcGxheU9yZGVyID4gYi5kaXNwbGF5T3JkZXIpID8gMSA6IChhLmRpc3BsYXlPcmRlciA8IGIuZGlzcGxheU9yZGVyKSA/IC0xIDogMCk7XHJcblxyXG5cdFx0dGhpcy5zaG93U2VhcmNoUm93ID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoYyA9PiBjLmZpbHRlclR5cGUgIT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLm5vbmUpLmxlbmd0aCA+IDA7XHJcblx0XHRsZXQgc29ydENvbHVtbiA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmluZChjID0+IGMuc29ydGFibGUgPT09IHRydWUgJiYgYy5zb3J0RGlyZWN0aW9uID4gMCk7XHJcblx0XHRpZiAodGhpcy52aXNpYmxlQ29sdW1ucy5sZW5ndGggPiAwICYmIHNvcnRDb2x1bW4pIHtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuc29ydENvbHVtbiA9IHNvcnRDb2x1bW4uZGF0YUZpZWxkTmFtZTtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuc29ydERpcmVjdGlvbiA9IHNvcnRDb2x1bW4uc29ydERpcmVjdGlvbjtcclxuXHRcdH1cclxuXHR9XHJcbn0iXX0=