@sd-angular/core 0.0.917 → 0.0.921

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.
Files changed (42) hide show
  1. package/bundles/sd-angular-core-grid-material.umd.js +384 -51
  2. package/bundles/sd-angular-core-grid-material.umd.js.map +1 -1
  3. package/bundles/sd-angular-core-grid-material.umd.min.js +2 -2
  4. package/bundles/sd-angular-core-grid-material.umd.min.js.map +1 -1
  5. package/bundles/sd-angular-core-select.umd.js +1 -1
  6. package/bundles/sd-angular-core-select.umd.js.map +1 -1
  7. package/bundles/sd-angular-core-select.umd.min.js +1 -1
  8. package/bundles/sd-angular-core-select.umd.min.js.map +1 -1
  9. package/esm2015/grid-material/sd-angular-core-grid-material.js +30 -25
  10. package/esm2015/grid-material/src/lib/components/desktop-cell/desktop-cell.component.js +20 -0
  11. package/esm2015/grid-material/src/lib/components/desktop-cell-editor/desktop-cell-editor.component.js +26 -0
  12. package/esm2015/grid-material/src/lib/components/desktop-cell-view/desktop-cell-view.component.js +4 -3
  13. package/esm2015/grid-material/src/lib/grid-material.component.js +115 -4
  14. package/esm2015/grid-material/src/lib/grid-material.module.js +12 -2
  15. package/esm2015/grid-material/src/lib/models/grid-column.model.js +1 -1
  16. package/esm2015/grid-material/src/lib/models/grid-editor.model.js +2 -0
  17. package/esm2015/grid-material/src/lib/models/grid-option.model.js +1 -1
  18. package/esm2015/grid-material/src/lib/models/grid.model.js +1 -1
  19. package/esm2015/grid-material/src/lib/pipes/editor-handler-column.pipe.js +39 -0
  20. package/esm2015/grid-material/src/lib/pipes/editor-handler-row.pipe.js +40 -0
  21. package/esm2015/grid-material/src/lib/pipes/editor-validate.pipe.js +41 -0
  22. package/esm2015/grid-material/src/lib/services/grid-configuration.service.js +13 -7
  23. package/esm2015/select/src/lib/select.component.js +2 -2
  24. package/fesm2015/sd-angular-core-grid-material.js +296 -13
  25. package/fesm2015/sd-angular-core-grid-material.js.map +1 -1
  26. package/fesm2015/sd-angular-core-select.js +1 -1
  27. package/fesm2015/sd-angular-core-select.js.map +1 -1
  28. package/grid-material/sd-angular-core-grid-material.d.ts +29 -24
  29. package/grid-material/sd-angular-core-grid-material.metadata.json +1 -1
  30. package/grid-material/src/lib/components/desktop-cell/desktop-cell.component.d.ts +9 -0
  31. package/grid-material/src/lib/components/desktop-cell-editor/desktop-cell-editor.component.d.ts +7 -0
  32. package/grid-material/src/lib/grid-material.component.d.ts +5 -0
  33. package/grid-material/src/lib/models/grid-column.model.d.ts +47 -0
  34. package/grid-material/src/lib/models/grid-editor.model.d.ts +22 -0
  35. package/grid-material/src/lib/models/grid-option.model.d.ts +2 -10
  36. package/grid-material/src/lib/models/grid.model.d.ts +46 -1
  37. package/grid-material/src/lib/pipes/editor-handler-column.pipe.d.ts +7 -0
  38. package/grid-material/src/lib/pipes/editor-handler-row.pipe.d.ts +6 -0
  39. package/grid-material/src/lib/pipes/editor-validate.pipe.d.ts +7 -0
  40. package/package.json +1 -1
  41. package/{sd-angular-core-0.0.917.tgz → sd-angular-core-0.0.921.tgz} +0 -0
  42. package/select/sd-angular-core-select.metadata.json +1 -1
@@ -1,4 +1,4 @@
1
- var _paginator, _sort, _subscription, _optionChanges, _initCellDef, _initFilterDef, _initFooterDef, _filterExportInfo, _initConfiguration, _filterLocal, _getFilter, _load, _render, _exportedItems, _allColumns, _allExportedColumns, _onExport, _updateSelectedItems;
1
+ var _paginator, _sort, _subscription, _optionChanges, _initCellDef, _initFilterDef, _initFooterDef, _filterExportInfo, _initConfiguration, _filterLocal, _getFilter, _load, _render, _exportedItems, _allColumns, _allExportedColumns, _onExport, _updateSelectedItems, _generateEditorHanlder;
2
2
  import { __awaiter, __classPrivateFieldGet, __classPrivateFieldSet, __rest } from "tslib";
3
3
  import { Component, Input, ViewChild, Optional, Inject, ChangeDetectorRef, ContentChildren, QueryList, EventEmitter, ContentChild } from '@angular/core';
4
4
  import { MatPaginator } from '@angular/material/paginator';
@@ -576,6 +576,117 @@ export class SdGridMaterial {
576
576
  var _a;
577
577
  (_a = this.gridFilter) === null || _a === void 0 ? void 0 : _a.setFilter(args);
578
578
  };
579
+ _generateEditorHanlder.set(this, (item) => {
580
+ // item.editorHandler = item.editorHandler || {};
581
+ // this.editorVisiblePipe.transform(null, item, this.gridOption);
582
+ });
583
+ this.onCreate = () => {
584
+ var _a;
585
+ const { type, editor, columns } = this.gridOption;
586
+ if (!(editor === null || editor === void 0 ? void 0 : editor.addable)) {
587
+ return;
588
+ }
589
+ const item = {};
590
+ // Gán giá trị mặc định
591
+ columns.forEach(column => {
592
+ if (column.type === 'values') {
593
+ item[column.field] = '';
594
+ }
595
+ else if (column.type === 'bool') {
596
+ item[column.field] = true;
597
+ }
598
+ else if (column.type === 'number') {
599
+ item[column.field] = null;
600
+ }
601
+ });
602
+ (_a = editor.onAdd) === null || _a === void 0 ? void 0 : _a.call(editor, item);
603
+ // Đưa item lên dòng đầu tiên nếu type khác popup
604
+ if (editor.type !== 'popup') {
605
+ if (type === 'local') {
606
+ this.items.splice(0, 0, item);
607
+ }
608
+ // this.viewItems.splice(0, 0, item);
609
+ }
610
+ this.onUpdate(item, false);
611
+ };
612
+ this.onUpdate = (item, isModified) => {
613
+ const { editor, columns } = this.gridOption;
614
+ item.editorHandlerRow.status = isModified ? 'update' : 'create';
615
+ item.editorHandlerRow.temporary = Object.assign({}, item);
616
+ // this.generateEditorHanlder(item);
617
+ if (editor.type === 'popup') {
618
+ // Xử lý case popup
619
+ // this.sdGridPopupEditor.open(item, columns, isModified);
620
+ }
621
+ this.ref.detectChanges();
622
+ };
623
+ this.onSave = (item) => __awaiter(this, void 0, void 0, function* () {
624
+ const { editor } = this.gridOption;
625
+ try {
626
+ item.editorHandlerRow.saving = true;
627
+ if (editor.validate) {
628
+ const result = editor.validate(item);
629
+ if (result instanceof Promise) {
630
+ const message = yield result;
631
+ if (message) {
632
+ throw message;
633
+ }
634
+ }
635
+ else {
636
+ if (result) {
637
+ throw result;
638
+ }
639
+ }
640
+ }
641
+ if (editor.onSave) {
642
+ const result = editor.onSave(item);
643
+ if (result instanceof Promise) {
644
+ yield result;
645
+ }
646
+ }
647
+ if (item.editorHandlerRow.status === 'create' && editor.type === 'popup') {
648
+ if (this.gridOption.type === 'local') {
649
+ this.items.splice(0, 0, item);
650
+ }
651
+ // this.viewItems.splice(0, 0, item);
652
+ }
653
+ item.editorHandlerRow.status = undefined;
654
+ // this.generateEditorHanlder(item);
655
+ }
656
+ catch (err) {
657
+ this.notifyService.notify.warning(err);
658
+ }
659
+ finally {
660
+ item.editorHandlerRow.saving = false;
661
+ this.ref.detectChanges();
662
+ }
663
+ });
664
+ this.onCancel = (item) => {
665
+ const { editor } = this.gridOption;
666
+ if (editor.type === 'inline') {
667
+ if (this.gridOption.type === 'local') {
668
+ const idx1 = this.items.indexOf(item);
669
+ this.items.splice(idx1, 1);
670
+ }
671
+ // const idx2 = this.viewItems.indexOf(item);
672
+ // this.viewItems.splice(idx2, 1);
673
+ return;
674
+ }
675
+ if (item.editorHandlerRow.status === 'create') {
676
+ if (editor.type !== 'popup') {
677
+ if (this.gridOption.type === 'local') {
678
+ this.items.splice(0, 1);
679
+ }
680
+ // this.viewItems.splice(0, 1);
681
+ }
682
+ }
683
+ else {
684
+ Object.assign(item, item.editorHandlerRow.temporary);
685
+ item.editorHandlerRow.status = undefined;
686
+ // this.generateEditorHanlder(item);
687
+ this.ref.detectChanges();
688
+ }
689
+ };
579
690
  }
580
691
  set _gridFilter(gridFilter) {
581
692
  if (gridFilter && this.gridFilter !== gridFilter) {
@@ -632,11 +743,11 @@ export class SdGridMaterial {
632
743
  moveItemInArray(columns, event.previousIndex, event.currentIndex);
633
744
  }
634
745
  }
635
- _paginator = new WeakMap(), _sort = new WeakMap(), _subscription = new WeakMap(), _optionChanges = new WeakMap(), _initCellDef = new WeakMap(), _initFilterDef = new WeakMap(), _initFooterDef = new WeakMap(), _filterExportInfo = new WeakMap(), _initConfiguration = new WeakMap(), _filterLocal = new WeakMap(), _getFilter = new WeakMap(), _load = new WeakMap(), _render = new WeakMap(), _exportedItems = new WeakMap(), _allColumns = new WeakMap(), _allExportedColumns = new WeakMap(), _onExport = new WeakMap(), _updateSelectedItems = new WeakMap();
746
+ _paginator = new WeakMap(), _sort = new WeakMap(), _subscription = new WeakMap(), _optionChanges = new WeakMap(), _initCellDef = new WeakMap(), _initFilterDef = new WeakMap(), _initFooterDef = new WeakMap(), _filterExportInfo = new WeakMap(), _initConfiguration = new WeakMap(), _filterLocal = new WeakMap(), _getFilter = new WeakMap(), _load = new WeakMap(), _render = new WeakMap(), _exportedItems = new WeakMap(), _allColumns = new WeakMap(), _allExportedColumns = new WeakMap(), _onExport = new WeakMap(), _updateSelectedItems = new WeakMap(), _generateEditorHanlder = new WeakMap();
636
747
  SdGridMaterial.decorators = [
637
748
  { type: Component, args: [{
638
749
  selector: 'sd-grid-material',
639
- template: "<ng-container *ngIf=\"gridConfigurationObserver | async as gridConfiguration\">\r\n <ng-container\r\n *ngIf=\"\r\n gridConfiguration\r\n | sdGridConfigurationResult\r\n : gridOption\r\n : sdSubInformation as configuration\r\n \"\r\n >\r\n <ng-container *ngIf=\"!gridOption.filter?.disabled\">\r\n <sd-grid-filter\r\n [filter]=\"gridOption?.filter\"\r\n [columns]=\"configuration.firstColumns\"\r\n [filterDefs]=\"filterDefs\"\r\n >\r\n </sd-grid-filter>\r\n </ng-container>\r\n <div\r\n class=\"c-container {{ gridOption?.style?.grid }}\"\r\n [ngClass]=\"{ 'mat-elevation-z2': gridOption?.shadow }\"\r\n >\r\n <div class=\"c-loading\" *ngIf=\"isLoading\">\r\n <mat-spinner *ngIf=\"isLoading\"></mat-spinner>\r\n </div>\r\n <ng-container>\r\n <div\r\n class=\"c-table\"\r\n [ngStyle]=\"{\r\n 'max-height': gridOption?.maxHeight,\r\n 'min-height': 'gridOption?.minHeight'\r\n }\"\r\n >\r\n <table\r\n *ngIf=\"items?.length; else elseEmpty\"\r\n mat-table\r\n [dataSource]=\"items\"\r\n matSort\r\n [matSortDisabled]=\"!gridOption.sortable\"\r\n cdkDropList\r\n cdkDropListOrientation=\"horizontal\"\r\n [cdkDropListDisabled]=\"!gridOption.dropDragColumnEnable\"\r\n (cdkDropListDropped)=\"drop($event, configuration.displayedColumns)\"\r\n multiTemplateDataRows\r\n >\r\n <ng-container matColumnDef=\"sdSubInformation\" sticky>\r\n <td\r\n class=\"p-0\"\r\n mat-cell\r\n *matCellDef=\"let item\"\r\n [attr.colspan]=\"configuration.displayedColumns.length\"\r\n >\r\n <div\r\n *ngIf=\"sdSubInformation?.templateRef\"\r\n [@detailExpand]=\"item.isExpanded ? 'expanded' : 'collapsed'\"\r\n >\r\n <ng-container *ngIf=\"item.isExpanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n sdSubInformation.templateRef;\r\n context: { item: item }\r\n \"\r\n >\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdSubInformationAction\" stickyEnd>\r\n <th\r\n class=\"p-0\"\r\n mat-header-cell\r\n *matHeaderCellDef\r\n style=\"width: 1px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"\r\n ></th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <button\r\n *ngIf=\"!element.isExpanding\"\r\n mat-icon-button\r\n aria-label=\"Expand & Collapse\"\r\n (click)=\"onExpand(element)\"\r\n >\r\n <mat-icon *ngIf=\"!element.isExpanded\">expand_more</mat-icon>\r\n <mat-icon *ngIf=\"element.isExpanded\">expand_less</mat-icon>\r\n </button>\r\n <div *ngIf=\"element.isExpanding\" class=\"lds-ring\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"selection\" sticky>\r\n <th\r\n class=\"text-center px-15\"\r\n mat-header-cell\r\n *matHeaderCellDef\r\n style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"\r\n >\r\n <mat-checkbox\r\n *ngIf=\"!gridOption.selection?.single\"\r\n class=\"c-selection\"\r\n color=\"primary\"\r\n [(ngModel)]=\"isSelectAll\"\r\n (change)=\"onSelectAll()\"\r\n [disabled]=\"\r\n items | selectionDisableSelectAll: gridOption?.selection\r\n \"\r\n >\r\n </mat-checkbox>\r\n </th>\r\n <td\r\n class=\"text-center px-15\"\r\n mat-cell\r\n *matCellDef=\"let item\"\r\n style=\"min-width: 50px; max-width: 50px\"\r\n >\r\n <mat-checkbox\r\n class=\"c-selection\"\r\n color=\"primary\"\r\n [(ngModel)]=\"item.isSelected\"\r\n (change)=\"onSelect(item)\"\r\n [disabled]=\"\r\n selectedItems | selectionDisable: item:gridOption?.selection\r\n \"\r\n >\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"command\">\r\n <th\r\n class=\"px-8 py-8\"\r\n mat-header-cell\r\n *matHeaderCellDef\r\n style=\"width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"\r\n ></th>\r\n <td class=\"px-8\" mat-cell *matCellDef=\"let item\">\r\n <sd-desktop-command\r\n [commands]=\"gridOption.commands\"\r\n [item]=\"item\"\r\n ></sd-desktop-command>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container\r\n *ngFor=\"let column of configuration.firstColumns; let i = index\"\r\n [matColumnDef]=\"column.field\"\r\n [sticky]=\"configuration.fixedColumn[column.field]\"\r\n >\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n cdkDrag\r\n class=\"px-8 py-8 c-th\"\r\n [ngStyle]=\"{ 'min-width': column.width }\"\r\n [attr.rowspan]=\"\r\n configuration.multipleHeader && column.type !== 'children-col'\r\n ? 2\r\n : 1\r\n \"\r\n [attr.colspan]=\"\r\n column.type === 'children-col' ? column.children?.length : 1\r\n \"\r\n >\r\n <div>\r\n <div\r\n aria-hidden=\"false\"\r\n role=\"presentation\"\r\n mat-sort-header\r\n [disabled]=\"\r\n !column.sortable || column.type === 'children-col'\r\n \"\r\n [innerHTML]=\"column.titleHtml || column.title\"\r\n ></div>\r\n <div\r\n class=\"c-inline-column\"\r\n *ngIf=\"gridOption.filter?.inlineColumn\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n inlineColumn;\r\n context: { column: column }\r\n \"\r\n ></ng-container>\r\n </div>\r\n </div>\r\n </th>\r\n <td class=\"c-td px-8\" mat-cell *matCellDef=\"let item\">\r\n <ng-container *ngIf=\"cellDef[column.field]\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n cellDef[column.field].templateRef;\r\n context: { item: item, column: column, idx: i }\r\n \"\r\n >\r\n </ng-container>\r\n </ng-container>\r\n <sd-desktop-cell-view\r\n *ngIf=\"!cellDef[column.field]\"\r\n [key]=\"key\"\r\n [column]=\"column\"\r\n [item]=\"item\"\r\n >\r\n </sd-desktop-cell-view>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef>\r\n <ng-container *ngIf=\"footerDef[column.field]\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n footerDef[column.field].templateRef;\r\n context: { items: items, column: column }\r\n \"\r\n >\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n <ng-container\r\n *ngFor=\"let column of configuration.secondColumns; let i = index\"\r\n [matColumnDef]=\"column.field\"\r\n >\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n mat-sort-header\r\n class=\"c-th px-8\"\r\n [ngStyle]=\"{ 'min-width': column.width }\"\r\n >\r\n <div>\r\n <div [innerHTML]=\"column.titleHtml || column.title\"></div>\r\n <div\r\n class=\"c-inline-column\"\r\n *ngIf=\"gridOption.filter?.inlineColumn\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n inlineColumn;\r\n context: { column: column }\r\n \"\r\n ></ng-container>\r\n </div>\r\n </div>\r\n </th>\r\n <td class=\"c-td px-8\" mat-cell *matCellDef=\"let item\">\r\n <ng-container *ngIf=\"cellDef[column.field]\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n cellDef[column.field].templateRef;\r\n context: { item: item, column: column, idx: i }\r\n \"\r\n >\r\n </ng-container>\r\n </ng-container>\r\n <sd-desktop-cell-view\r\n *ngIf=\"!cellDef[column.field]\"\r\n [key]=\"key\"\r\n [column]=\"column\"\r\n [item]=\"item\"\r\n >\r\n </sd-desktop-cell-view>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef>\r\n <ng-container *ngIf=\"footerDef[column.field]\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n footerDef[column.field].templateRef;\r\n context: { items: items, column: column }\r\n \"\r\n >\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n <tr\r\n class=\"c-first-header\"\r\n mat-header-row\r\n *matHeaderRowDef=\"configuration.firstHeaders; sticky: true\"\r\n ></tr>\r\n <ng-container *ngIf=\"configuration.secondHeaders?.length\">\r\n <tr\r\n class=\"c-second-header\"\r\n mat-header-row\r\n *matHeaderRowDef=\"configuration.secondHeaders; sticky: true\"\r\n ></tr>\r\n </ng-container>\r\n <tr\r\n mat-row\r\n *matRowDef=\"let row; columns: configuration.displayedColumns\"\r\n matRipple\r\n class=\"c-row\"\r\n ></tr>\r\n <tr\r\n mat-row\r\n *matRowDef=\"let row; columns: ['sdSubInformation']\"\r\n class=\"c-detail-row\"\r\n ></tr>\r\n <ng-container\r\n *ngIf=\"hasFooter && configuration.displayedFooters?.length\"\r\n >\r\n <tr\r\n mat-footer-row\r\n *matFooterRowDef=\"configuration.displayedFooters; sticky: true\"\r\n ></tr>\r\n </ng-container>\r\n </table>\r\n <ng-template #elseEmpty>\r\n <table mat-table [dataSource]=\"[{}]\">\r\n <ng-container matColumnDef=\"selection\" sticky>\r\n <th\r\n class=\"px-15\"\r\n mat-header-cell\r\n *matHeaderCellDef\r\n style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"\r\n ></th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"command\">\r\n <th\r\n class=\"px-8\"\r\n mat-header-cell\r\n *matHeaderCellDef\r\n style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"\r\n ></th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdSubInformationAction\">\r\n <th\r\n class=\"p-0\"\r\n mat-header-cell\r\n *matHeaderCellDef\r\n style=\"width: 1px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"\r\n ></th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdEmpty\">\r\n <td\r\n class=\"c-empty\"\r\n mat-cell\r\n *matCellDef=\"let item\"\r\n [attr.colspan]=\"configuration.displayedColumns.length\"\r\n >\r\n <ng-container\r\n *ngIf=\"sdEmptyData?.templateRef; else sdEmptyDataNoRef\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n sdEmptyData.templateRef;\r\n context: { item: item }\r\n \"\r\n >\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #sdEmptyDataNoRef>\r\n <mat-icon fontSet=\"material-icons-outlined\"\r\n >leaderboard</mat-icon\r\n >\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n <ng-container\r\n *ngFor=\"let column of configuration.columns\"\r\n [matColumnDef]=\"column.field\"\r\n [sticky]=\"configuration.fixedColumn[column.field]\"\r\n >\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n class=\"c-th px-8 py-8\"\r\n [ngStyle]=\"{ 'min-width': column.width }\"\r\n >\r\n <div [innerHTML]=\"column.titleHtml || column.title\"></div>\r\n </th>\r\n </ng-container>\r\n <ng-container\r\n *ngFor=\"let column of configuration.firstColumns\"\r\n [matColumnDef]=\"column.field\"\r\n [sticky]=\"configuration.fixedColumn[column.field]\"\r\n >\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n class=\"c-th px-8 py-8\"\r\n [ngStyle]=\"{ 'min-width': column.width }\"\r\n [attr.rowspan]=\"\r\n configuration.multipleHeader &&\r\n column.type !== 'children-col'\r\n ? 2\r\n : 1\r\n \"\r\n [attr.colspan]=\"\r\n column.type === 'children-col' ? column.children?.length : 1\r\n \"\r\n >\r\n <div>\r\n <div [innerHTML]=\"column.titleHtml || column.title\"></div>\r\n <div\r\n class=\"c-inline-column\"\r\n *ngIf=\"gridOption.filter?.inlineColumn\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n inlineColumn;\r\n context: { column: column }\r\n \"\r\n ></ng-container>\r\n </div>\r\n </div>\r\n </th>\r\n </ng-container>\r\n <ng-container\r\n *ngFor=\"let column of configuration.secondColumns\"\r\n [matColumnDef]=\"column.field\"\r\n >\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n class=\"c-th px-8 py-8\"\r\n [ngStyle]=\"{ 'min-width': column.width }\"\r\n >\r\n <div>\r\n <div [innerHTML]=\"column.titleHtml || column.title\"></div>\r\n <div\r\n class=\"c-inline-column\"\r\n *ngIf=\"gridOption.filter?.inlineColumn\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n inlineColumn;\r\n context: { column: column }\r\n \"\r\n ></ng-container>\r\n </div>\r\n </div>\r\n </th>\r\n </ng-container>\r\n <tr\r\n class=\"c-first-header\"\r\n mat-header-row\r\n *matHeaderRowDef=\"configuration.firstHeaders; sticky: true\"\r\n ></tr>\r\n <tr\r\n class=\"c-second-header\"\r\n mat-header-row\r\n *matHeaderRowDef=\"configuration.secondHeaders; sticky: true\"\r\n ></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: ['sdEmpty']\"></tr>\r\n </table>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n <div class=\"c-paginator\">\r\n <div class=\"c-action\">\r\n <sd-button\r\n *ngIf=\"\r\n !gridOption.filter?.disabled && !gridOption.filter?.inlineColumn\r\n \"\r\n class=\"mr-10\"\r\n [title]=\"'Filter' | sdTranslate\"\r\n icon=\"filter_alt\"\r\n size=\"sm\"\r\n (action)=\"gridFilter.open()\"\r\n type=\"link\"\r\n >\r\n </sd-button>\r\n <sd-button\r\n *ngIf=\"gridOption.reload?.visible\"\r\n class=\"mr-10\"\r\n [title]=\"'Reload' | sdTranslate\"\r\n icon=\"refresh\"\r\n size=\"sm\"\r\n (action)=\"reload()\"\r\n [disabled]=\"!items?.length\"\r\n type=\"link\"\r\n >\r\n </sd-button>\r\n <ng-container *ngIf=\"gridOption.export?.visible && items?.length\">\r\n <ng-container *ngIf=\"isExporting; else unExporting\">\r\n <sd-button\r\n class=\"mr-10\"\r\n [loading]=\"isExporting\"\r\n [title]=\"exportTitle | sdTranslate\"\r\n icon=\"get_app\"\r\n size=\"sm\"\r\n type=\"link\"\r\n >\r\n </sd-button>\r\n </ng-container>\r\n <ng-template #unExporting>\r\n <sd-button\r\n class=\"mr-10\"\r\n [title]=\"exportTitle | sdTranslate\"\r\n icon=\"get_app\"\r\n size=\"sm\"\r\n [matMenuTriggerFor]=\"menu\"\r\n type=\"link\"\r\n >\r\n </sd-button>\r\n </ng-template>\r\n\r\n <mat-menu #menu=\"matMenu\">\r\n <button\r\n *ngIf=\"gridOption.export?.visibleExcel !== false\"\r\n mat-menu-item\r\n (click)=\"sdPopupExport.exportDefault()\"\r\n type=\"button\"\r\n >\r\n <mat-icon fontSet=\"material-icons-outlined\"\r\n >file_download</mat-icon\r\n >\r\n <span> {{ \"Export excel\" | sdTranslate }}</span>\r\n </button>\r\n <button\r\n *ngIf=\"gridOption.export?.visibleCSV !== false\"\r\n mat-menu-item\r\n (click)=\"sdPopupExport.exportDefault(true)\"\r\n type=\"button\"\r\n >\r\n <mat-icon fontSet=\"material-icons-outlined\"\r\n >file_download</mat-icon\r\n >\r\n <span> {{ \"Export CSV\" | sdTranslate }}</span>\r\n </button>\r\n <button\r\n *ngIf=\"gridOption.export?.key\"\r\n mat-menu-item\r\n (click)=\"sdPopupExport.open()\"\r\n type=\"button\"\r\n >\r\n <mat-icon fontSet=\"material-icons-outlined\">settings</mat-icon>\r\n <span> {{ \"Configure\" | sdTranslate }}</span>\r\n </button>\r\n </mat-menu>\r\n </ng-container>\r\n <sd-button\r\n *ngIf=\"gridOption.config?.visible\"\r\n class=\"mr-10\"\r\n [title]=\"'Configure' | sdTranslate\"\r\n icon=\"settings\"\r\n size=\"sm\"\r\n (action)=\"popupGridConfiguration.open()\"\r\n type=\"link\"\r\n >\r\n </sd-button>\r\n </div>\r\n <mat-paginator\r\n [class.d-none]=\"gridOption.paginate?.hidden\"\r\n [length]=\"total\"\r\n [pageSize]=\"gridOption.paginate?.pageSize\"\r\n [pageSizeOptions]=\"gridOption.paginate?.pages\"\r\n [showFirstLastButtons]=\"gridOption.paginate?.showFirstLastButtons\"\r\n ></mat-paginator>\r\n </div>\r\n </div>\r\n <sd-popup-export\r\n *ngIf=\"gridOption.export?.visible\"\r\n [gridOption]=\"gridOption\"\r\n (export)=\"onExport($event)\"\r\n #sdPopupExport\r\n >\r\n </sd-popup-export>\r\n <sd-popup-grid-configuration\r\n [gridOption]=\"gridOption\"\r\n [key]=\"key\"\r\n #popupGridConfiguration\r\n >\r\n </sd-popup-grid-configuration>\r\n </ng-container>\r\n</ng-container>\r\n<ng-template #inlineColumn let-column=\"column\">\r\n <ng-container\r\n *ngIf=\"\r\n column.type === 'string' ||\r\n column.type === 'number' ||\r\n column.type === 'bool' ||\r\n column.type === 'values' ||\r\n column.type === 'date' ||\r\n column.type === 'datetime' ||\r\n column.type === 'time';\r\n else noFilter\r\n \"\r\n >\r\n <sd-input\r\n *ngIf=\"column.type === 'string'\"\r\n size=\"sm\"\r\n type=\"text\"\r\n [(model)]=\"columnFilter[column.field]\"\r\n (keyupEnter)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\"\r\n >\r\n </sd-input>\r\n <sd-input\r\n *ngIf=\"column.type === 'number'\"\r\n size=\"sm\"\r\n type=\"number\"\r\n [(model)]=\"columnFilter[column.field]\"\r\n (keyupEnter)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\"\r\n >\r\n </sd-input>\r\n <sd-select\r\n *ngIf=\"column.type === 'bool'\"\r\n size=\"sm\"\r\n [items]=\"[\r\n { value: '1', display: column.option?.displayOnTrue || 'True' },\r\n { value: '0', display: column.option?.displayOnFalse || 'False' }\r\n ]\"\r\n valueField=\"value\"\r\n displayField=\"display\"\r\n [(model)]=\"columnFilter[column.field]\"\r\n (sdChange)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\"\r\n >\r\n </sd-select>\r\n <sd-select\r\n *ngIf=\"\r\n column.type === 'values' && column?.option?.selection !== 'AUTOCOMPLETE'\r\n \"\r\n size=\"sm\"\r\n [items]=\"column.option.items\"\r\n [valueField]=\"column.option.valueField\"\r\n [displayField]=\"column.option.displayField\"\r\n [(model)]=\"columnFilter[column.field]\"\r\n (sdChange)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\"\r\n [multiple]=\"\r\n column?.option?.selection === 'MULTIPLE' ||\r\n column?.option?.selection === 'MULTIPLEAUTOCOMPLETE'\r\n \"\r\n [filtered]=\"column?.option?.selection === 'MULTIPLEAUTOCOMPLETE'\"\r\n >\r\n </sd-select>\r\n <sd-autocomplete\r\n *ngIf=\"\r\n column.type === 'values' && column?.option?.selection === 'AUTOCOMPLETE'\r\n \"\r\n size=\"sm\"\r\n [items]=\"column.option.items\"\r\n [valueField]=\"column.option.valueField\"\r\n [displayField]=\"column.option.displayField\"\r\n [(model)]=\"columnFilter[column.field]\"\r\n (sdChange)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\"\r\n >\r\n </sd-autocomplete>\r\n <sd-date-time\r\n *ngIf=\"\r\n column.type === 'date' ||\r\n column.type === 'datetime' ||\r\n column.type === 'time'\r\n \"\r\n size=\"sm\"\r\n [(model)]=\"columnFilter[column.field]\"\r\n [type]=\"column.type\"\r\n (sdChange)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\"\r\n >\r\n </sd-date-time>\r\n </ng-container>\r\n <ng-template #noFilter>\r\n <sd-input type=\"text\" disabled> </sd-input>\r\n </ng-template>\r\n</ng-template>\r\n\r\n<sd-quick-action\r\n *ngIf=\"\r\n selectedItems\r\n | selectionActionFilter: gridOption?.selection?.actions as actions\r\n \"\r\n [isOpened]=\"actions?.length\"\r\n>\r\n <div sdMessage>\r\n <strong class=\"text-info\">{{ selectedItems.length }}</strong>\r\n {{ gridOption?.selection?.message || (\"selected rows\" | sdTranslate) }}\r\n </div>\r\n <div class=\"d-flex align-items-center\" sdAction>\r\n <ng-container *ngFor=\"let action of actions\">\r\n <sd-button\r\n *ngIf=\"action.click\"\r\n class=\"ml-5\"\r\n [tooltip]=\"action.tooltip\"\r\n [icon]=\"action.icon\"\r\n [color]=\"action.color || 'secondary'\"\r\n [type]=\"action.type || 'light'\"\r\n [fontSet]=\"action.fontSet\"\r\n [title]=\"action.title\"\r\n size=\"sm\"\r\n (action)=\"action.click(selectedItems)\"\r\n ></sd-button>\r\n <ng-container *ngIf=\"action.children?.length\">\r\n <sd-button\r\n class=\"ml-5\"\r\n [tooltip]=\"action.tooltip\"\r\n [icon]=\"action.icon || 'more_vert'\"\r\n [color]=\"action.color || 'secondary'\"\r\n [type]=\"action.type || 'light'\"\r\n [fontSet]=\"action.fontSet\"\r\n [title]=\"action.title\"\r\n size=\"sm\"\r\n [matMenuTriggerFor]=\"menu\"\r\n >\r\n </sd-button>\r\n <mat-menu #menu=\"matMenu\">\r\n <span>\r\n <button\r\n *ngFor=\"let childAction of action.children\"\r\n mat-menu-item\r\n (click)=\"childAction.click(selectedItems)\"\r\n [disabled]=\"childAction.disabled\"\r\n >\r\n <mat-icon [fontSet]=\"childAction.fontSet\" class=\"c-icon\"\r\n >{{ childAction.icon }}\r\n </mat-icon>\r\n <span> {{ childAction.title }}</span>\r\n </button>\r\n </span>\r\n </mat-menu>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</sd-quick-action>\r\n",
750
+ template: "<ng-container *ngIf=\"gridConfigurationObserver | async as gridConfiguration\">\r\n <ng-container *ngIf=\"\r\n gridConfiguration\r\n | sdGridConfigurationResult\r\n : gridOption\r\n : sdSubInformation as configuration\r\n \">\r\n <ng-container *ngIf=\"!gridOption.filter?.disabled\">\r\n <sd-grid-filter [filter]=\"gridOption?.filter\" [columns]=\"configuration.firstColumns\" [filterDefs]=\"filterDefs\">\r\n </sd-grid-filter>\r\n </ng-container>\r\n <div class=\"c-container {{ gridOption?.style?.grid }}\" [ngClass]=\"{ 'mat-elevation-z2': gridOption?.shadow }\">\r\n <div class=\"c-loading\" *ngIf=\"isLoading\">\r\n <mat-spinner *ngIf=\"isLoading\"></mat-spinner>\r\n </div>\r\n <ng-container>\r\n <div class=\"c-table\" [ngStyle]=\"{\r\n 'max-height': gridOption?.maxHeight,\r\n 'min-height': 'gridOption?.minHeight'\r\n }\">\r\n <table *ngIf=\"items?.length; else elseEmpty\" mat-table [dataSource]=\"items\" matSort\r\n [matSortDisabled]=\"!gridOption.sortable\" cdkDropList cdkDropListOrientation=\"horizontal\"\r\n [cdkDropListDisabled]=\"!gridOption.dropDragColumnEnable\"\r\n (cdkDropListDropped)=\"drop($event, configuration.displayedColumns)\" multiTemplateDataRows>\r\n <ng-container matColumnDef=\"sdSubInformation\" sticky>\r\n <td class=\"p-0\" mat-cell *matCellDef=\"let item\" [attr.colspan]=\"configuration.displayedColumns.length\">\r\n <div *ngIf=\"sdSubInformation?.templateRef\" [@detailExpand]=\"item.isExpanded ? 'expanded' : 'collapsed'\">\r\n <ng-container *ngIf=\"item.isExpanded\">\r\n <ng-container *ngTemplateOutlet=\"\r\n sdSubInformation.templateRef;\r\n context: { item: item }\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdSubInformationAction\" stickyEnd>\r\n <th class=\"p-0\" mat-header-cell *matHeaderCellDef style=\"width: 1px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <button *ngIf=\"!element.isExpanding\" mat-icon-button aria-label=\"Expand & Collapse\"\r\n (click)=\"onExpand(element)\">\r\n <mat-icon *ngIf=\"!element.isExpanded\">expand_more</mat-icon>\r\n <mat-icon *ngIf=\"element.isExpanded\">expand_less</mat-icon>\r\n </button>\r\n <div *ngIf=\"element.isExpanding\" class=\"lds-ring\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdSelection\" sticky>\r\n <th class=\"text-center px-15\" mat-header-cell *matHeaderCellDef style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\">\r\n <mat-checkbox *ngIf=\"!gridOption.selection?.single\" class=\"c-selection\" color=\"primary\"\r\n [(ngModel)]=\"isSelectAll\" (change)=\"onSelectAll()\" [disabled]=\"\r\n items | selectionDisableSelectAll: gridOption?.selection\r\n \">\r\n </mat-checkbox>\r\n </th>\r\n <td class=\"text-center px-15\" mat-cell *matCellDef=\"let item\" style=\"min-width: 50px; max-width: 50px\">\r\n <mat-checkbox class=\"c-selection\" color=\"primary\" [(ngModel)]=\"item.isSelected\"\r\n (change)=\"onSelect(item)\" [disabled]=\"\r\n selectedItems | selectionDisable: item:gridOption?.selection\r\n \">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdEditor\">\r\n <th class=\"px-8 py-8\" mat-header-cell *matHeaderCellDef style=\"width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\">\r\n <button\r\n *ngIf=\"gridOption.editor?.addable && (!gridOption.editor.limit || gridOption.editor.limit > items.length)\"\r\n (click)=\"onCreate()\" aria-hidden=\"true\" mat-icon-button>\r\n <mat-icon class=\"c-icon\">add</mat-icon>\r\n </button>\r\n </th>\r\n <td class=\"px-8\" mat-cell *matCellDef=\"let item\">\r\n <ng-container *sdLet=\"item | sdEditorHandlerRow:gridOption as editorHandler\">\r\n <ng-container *ngIf=\"editorHandler.visible\">\r\n <ng-container *ngIf=\"editorHandler.isInline;else notInline\">\r\n <button *ngIf=\"editorHandler.removable\" class=\"mx-2\" (click)=\"onCancel(item)\" aria-hidden=\"true\"\r\n mat-icon-button>\r\n <mat-icon class=\"c-icon\">delete</mat-icon>\r\n </button>\r\n </ng-container>\r\n <ng-template #notInline>\r\n <ng-container *ngIf=\"!editorHandler.status\">\r\n <button *ngIf=\"editorHandler.editable\" class=\"mx-2\" (click)=\"onUpdate(item)\" aria-hidden=\"true\"\r\n mat-icon-button>\r\n <mat-icon class=\"c-icon\">edit</mat-icon>\r\n </button>\r\n </ng-container>\r\n <ng-container *ngIf=\"editorHandler.status\">\r\n <button class=\"mx-2\" (click)=\"onSave(item)\" aria-hidden=\"true\" mat-icon-button>\r\n <mat-icon class=\"c-icon\">save</mat-icon>\r\n </button>\r\n <button class=\"mx-2\" (click)=\"onCancel(item)\" aria-hidden=\"true\" mat-icon-button>\r\n <mat-icon class=\"c-icon\">close</mat-icon>\r\n </button>\r\n </ng-container>\r\n\r\n </ng-template>\r\n </ng-container>\r\n\r\n </ng-container>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdCommand\">\r\n <th class=\"px-8 py-8\" mat-header-cell *matHeaderCellDef style=\"width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n <td class=\"px-8\" mat-cell *matCellDef=\"let item\">\r\n <sd-desktop-command [commands]=\"gridOption.commands\" [item]=\"item\"></sd-desktop-command>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let column of configuration.firstColumns; let i = index\" [matColumnDef]=\"column.field\"\r\n [sticky]=\"configuration.fixedColumn[column.field]\">\r\n <th mat-header-cell *matHeaderCellDef cdkDrag class=\"px-8 py-8 c-th\"\r\n [ngStyle]=\"{ 'min-width': column.width }\" [attr.rowspan]=\"\r\n configuration.multipleHeader && column.type !== 'children-col'\r\n ? 2\r\n : 1\r\n \" [attr.colspan]=\"\r\n column.type === 'children-col' ? column.children?.length : 1\r\n \">\r\n <div>\r\n <div aria-hidden=\"false\" role=\"presentation\" mat-sort-header [disabled]=\"\r\n !column.sortable || column.type === 'children-col'\r\n \" [innerHTML]=\"column.titleHtml || column.title\"></div>\r\n <div class=\"c-inline-column\" *ngIf=\"gridOption.filter?.inlineColumn\">\r\n <ng-container *ngTemplateOutlet=\"\r\n inlineColumn;\r\n context: { column: column }\r\n \"></ng-container>\r\n </div>\r\n </div>\r\n </th>\r\n <td class=\"c-td px-8\" mat-cell *matCellDef=\"let item\">\r\n <ng-container *ngIf=\"cellDef[column.field]\">\r\n <ng-container *ngTemplateOutlet=\"\r\n cellDef[column.field].templateRef;\r\n context: { item: item, column: column, idx: i }\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n <sd-desktop-cell *ngIf=\"!cellDef[column.field]\" [key]=\"key\" [column]=\"column\" [item]=\"item\"\r\n [gridOption]=\"gridOption\">\r\n </sd-desktop-cell>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef>\r\n <ng-container *ngIf=\"footerDef[column.field]\">\r\n <ng-container *ngTemplateOutlet=\"\r\n footerDef[column.field].templateRef;\r\n context: { items: items, column: column }\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let column of configuration.secondColumns; let i = index\"\r\n [matColumnDef]=\"column.field\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"c-th px-8\"\r\n [ngStyle]=\"{ 'min-width': column.width }\">\r\n <div>\r\n <div [innerHTML]=\"column.titleHtml || column.title\"></div>\r\n <div class=\"c-inline-column\" *ngIf=\"gridOption.filter?.inlineColumn\">\r\n <ng-container *ngTemplateOutlet=\"\r\n inlineColumn;\r\n context: { column: column }\r\n \"></ng-container>\r\n </div>\r\n </div>\r\n </th>\r\n <td class=\"c-td px-8\" mat-cell *matCellDef=\"let item\">\r\n <ng-container *ngIf=\"cellDef[column.field]\">\r\n <ng-container *ngTemplateOutlet=\"\r\n cellDef[column.field].templateRef;\r\n context: { item: item, column: column, idx: i }\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n <sd-desktop-cell *ngIf=\"!cellDef[column.field]\" [key]=\"key\" [column]=\"column\" [item]=\"item\"\r\n [gridOption]=\"gridOption\">\r\n </sd-desktop-cell>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef>\r\n <ng-container *ngIf=\"footerDef[column.field]\">\r\n <ng-container *ngTemplateOutlet=\"\r\n footerDef[column.field].templateRef;\r\n context: { items: items, column: column }\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n <tr class=\"c-first-header\" mat-header-row *matHeaderRowDef=\"configuration.firstHeaders; sticky: true\"></tr>\r\n <ng-container *ngIf=\"configuration.secondHeaders?.length\">\r\n <tr class=\"c-second-header\" mat-header-row *matHeaderRowDef=\"configuration.secondHeaders; sticky: true\">\r\n </tr>\r\n </ng-container>\r\n <tr mat-row *matRowDef=\"let row; columns: configuration.displayedColumns\" matRipple class=\"c-row\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: ['sdSubInformation']\" class=\"c-detail-row\"></tr>\r\n <ng-container *ngIf=\"hasFooter && configuration.displayedFooters?.length\">\r\n <tr mat-footer-row *matFooterRowDef=\"configuration.displayedFooters; sticky: true\"></tr>\r\n </ng-container>\r\n </table>\r\n <ng-template #elseEmpty>\r\n <table mat-table [dataSource]=\"[{}]\">\r\n <ng-container matColumnDef=\"sdSelection\" sticky>\r\n <th class=\"px-15\" mat-header-cell *matHeaderCellDef style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdEditor\">\r\n <th class=\"px-8\" mat-header-cell *matHeaderCellDef style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\">\r\n <button\r\n *ngIf=\"gridOption.editor?.addable && (!gridOption.editor.limit || gridOption.editor.limit > items.length)\"\r\n (click)=\"onCreate()\" aria-hidden=\"true\" mat-icon-button>\r\n <mat-icon class=\"c-icon\">add</mat-icon>\r\n </button>\r\n </th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdCommand\">\r\n <th class=\"px-8\" mat-header-cell *matHeaderCellDef style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdSubInformationAction\">\r\n <th class=\"p-0\" mat-header-cell *matHeaderCellDef style=\"width: 1px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdEmpty\">\r\n <td class=\"c-empty\" mat-cell *matCellDef=\"let item\"\r\n [attr.colspan]=\"configuration.displayedColumns.length\">\r\n <ng-container *ngIf=\"sdEmptyData?.templateRef; else sdEmptyDataNoRef\">\r\n <ng-container *ngTemplateOutlet=\"\r\n sdEmptyData.templateRef;\r\n context: { item: item }\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #sdEmptyDataNoRef>\r\n <mat-icon fontSet=\"material-icons-outlined\">leaderboard</mat-icon>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let column of configuration.columns\" [matColumnDef]=\"column.field\"\r\n [sticky]=\"configuration.fixedColumn[column.field]\">\r\n <th mat-header-cell *matHeaderCellDef class=\"c-th px-8 py-8\" [ngStyle]=\"{ 'min-width': column.width }\">\r\n <div [innerHTML]=\"column.titleHtml || column.title\"></div>\r\n </th>\r\n </ng-container>\r\n <ng-container *ngFor=\"let column of configuration.firstColumns\" [matColumnDef]=\"column.field\"\r\n [sticky]=\"configuration.fixedColumn[column.field]\">\r\n <th mat-header-cell *matHeaderCellDef class=\"c-th px-8 py-8\" [ngStyle]=\"{ 'min-width': column.width }\"\r\n [attr.rowspan]=\"\r\n configuration.multipleHeader &&\r\n column.type !== 'children-col'\r\n ? 2\r\n : 1\r\n \" [attr.colspan]=\"\r\n column.type === 'children-col' ? column.children?.length : 1\r\n \">\r\n <div>\r\n <div [innerHTML]=\"column.titleHtml || column.title\"></div>\r\n <div class=\"c-inline-column\" *ngIf=\"gridOption.filter?.inlineColumn\">\r\n <ng-container *ngTemplateOutlet=\"\r\n inlineColumn;\r\n context: { column: column }\r\n \"></ng-container>\r\n </div>\r\n </div>\r\n </th>\r\n </ng-container>\r\n <ng-container *ngFor=\"let column of configuration.secondColumns\" [matColumnDef]=\"column.field\">\r\n <th mat-header-cell *matHeaderCellDef class=\"c-th px-8 py-8\" [ngStyle]=\"{ 'min-width': column.width }\">\r\n <div>\r\n <div [innerHTML]=\"column.titleHtml || column.title\"></div>\r\n <div class=\"c-inline-column\" *ngIf=\"gridOption.filter?.inlineColumn\">\r\n <ng-container *ngTemplateOutlet=\"\r\n inlineColumn;\r\n context: { column: column }\r\n \"></ng-container>\r\n </div>\r\n </div>\r\n </th>\r\n </ng-container>\r\n <tr class=\"c-first-header\" mat-header-row *matHeaderRowDef=\"configuration.firstHeaders; sticky: true\">\r\n </tr>\r\n <tr class=\"c-second-header\" mat-header-row *matHeaderRowDef=\"configuration.secondHeaders; sticky: true\">\r\n </tr>\r\n <tr mat-row *matRowDef=\"let row; columns: ['sdEmpty']\"></tr>\r\n </table>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n <div class=\"c-paginator\">\r\n <div class=\"c-action\">\r\n <sd-button *ngIf=\"\r\n !gridOption.filter?.disabled && !gridOption.filter?.inlineColumn\r\n \" class=\"mr-10\" [title]=\"'Filter' | sdTranslate\" icon=\"filter_alt\" size=\"sm\" (action)=\"gridFilter.open()\"\r\n type=\"link\">\r\n </sd-button>\r\n <sd-button *ngIf=\"gridOption.reload?.visible\" class=\"mr-10\" [title]=\"'Reload' | sdTranslate\" icon=\"refresh\"\r\n size=\"sm\" (action)=\"reload()\" [disabled]=\"!items?.length\" type=\"link\">\r\n </sd-button>\r\n <ng-container *ngIf=\"gridOption.export?.visible && items?.length\">\r\n <ng-container *ngIf=\"isExporting; else unExporting\">\r\n <sd-button class=\"mr-10\" [loading]=\"isExporting\" [title]=\"exportTitle | sdTranslate\" icon=\"get_app\"\r\n size=\"sm\" type=\"link\">\r\n </sd-button>\r\n </ng-container>\r\n <ng-template #unExporting>\r\n <sd-button class=\"mr-10\" [title]=\"exportTitle | sdTranslate\" icon=\"get_app\" size=\"sm\"\r\n [matMenuTriggerFor]=\"menu\" type=\"link\">\r\n </sd-button>\r\n </ng-template>\r\n\r\n <mat-menu #menu=\"matMenu\">\r\n <button *ngIf=\"gridOption.export?.visibleExcel !== false\" mat-menu-item\r\n (click)=\"sdPopupExport.exportDefault()\" type=\"button\">\r\n <mat-icon fontSet=\"material-icons-outlined\">file_download</mat-icon>\r\n <span> {{ \"Export excel\" | sdTranslate }}</span>\r\n </button>\r\n <button *ngIf=\"gridOption.export?.visibleCSV !== false\" mat-menu-item\r\n (click)=\"sdPopupExport.exportDefault(true)\" type=\"button\">\r\n <mat-icon fontSet=\"material-icons-outlined\">file_download</mat-icon>\r\n <span> {{ \"Export CSV\" | sdTranslate }}</span>\r\n </button>\r\n <button *ngIf=\"gridOption.export?.key\" mat-menu-item (click)=\"sdPopupExport.open()\" type=\"button\">\r\n <mat-icon fontSet=\"material-icons-outlined\">settings</mat-icon>\r\n <span> {{ \"Configure\" | sdTranslate }}</span>\r\n </button>\r\n </mat-menu>\r\n </ng-container>\r\n <sd-button *ngIf=\"gridOption.config?.visible\" class=\"mr-10\" [title]=\"'Configure' | sdTranslate\"\r\n icon=\"settings\" size=\"sm\" (action)=\"popupGridConfiguration.open()\" type=\"link\">\r\n </sd-button>\r\n </div>\r\n <mat-paginator [class.d-none]=\"gridOption.paginate?.hidden\" [length]=\"total\"\r\n [pageSize]=\"gridOption.paginate?.pageSize\" [pageSizeOptions]=\"gridOption.paginate?.pages\"\r\n [showFirstLastButtons]=\"gridOption.paginate?.showFirstLastButtons\"></mat-paginator>\r\n </div>\r\n </div>\r\n <sd-popup-export *ngIf=\"gridOption.export?.visible\" [gridOption]=\"gridOption\" (export)=\"onExport($event)\"\r\n #sdPopupExport>\r\n </sd-popup-export>\r\n <sd-popup-grid-configuration [gridOption]=\"gridOption\" [key]=\"key\" #popupGridConfiguration>\r\n </sd-popup-grid-configuration>\r\n </ng-container>\r\n</ng-container>\r\n<ng-template #inlineColumn let-column=\"column\">\r\n <ng-container *ngIf=\"\r\n column.type === 'string' ||\r\n column.type === 'number' ||\r\n column.type === 'bool' ||\r\n column.type === 'values' ||\r\n column.type === 'date' ||\r\n column.type === 'datetime' ||\r\n column.type === 'time';\r\n else noFilter\r\n \">\r\n <sd-input *ngIf=\"column.type === 'string'\" size=\"sm\" type=\"text\" [(model)]=\"columnFilter[column.field]\"\r\n (keyupEnter)=\"onFilterChange()\" [disabled]=\"column.filter?.disabled\">\r\n </sd-input>\r\n <sd-input *ngIf=\"column.type === 'number'\" size=\"sm\" type=\"number\" [(model)]=\"columnFilter[column.field]\"\r\n (keyupEnter)=\"onFilterChange()\" [disabled]=\"column.filter?.disabled\">\r\n </sd-input>\r\n <sd-select *ngIf=\"column.type === 'bool'\" size=\"sm\" [items]=\"[\r\n { value: '1', display: column.option?.displayOnTrue || 'True' },\r\n { value: '0', display: column.option?.displayOnFalse || 'False' }\r\n ]\" valueField=\"value\" displayField=\"display\" [(model)]=\"columnFilter[column.field]\" (sdChange)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\">\r\n </sd-select>\r\n <sd-select *ngIf=\"\r\n column.type === 'values' && column?.option?.selection !== 'AUTOCOMPLETE'\r\n \" size=\"sm\" [items]=\"column.option.items\" [valueField]=\"column.option.valueField\"\r\n [displayField]=\"column.option.displayField\" [(model)]=\"columnFilter[column.field]\" (sdChange)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\" [multiple]=\"\r\n column?.option?.selection === 'MULTIPLE' ||\r\n column?.option?.selection === 'MULTIPLEAUTOCOMPLETE'\r\n \" [filtered]=\"column?.option?.selection === 'MULTIPLEAUTOCOMPLETE'\">\r\n </sd-select>\r\n <sd-autocomplete *ngIf=\"\r\n column.type === 'values' && column?.option?.selection === 'AUTOCOMPLETE'\r\n \" size=\"sm\" [items]=\"column.option.items\" [valueField]=\"column.option.valueField\"\r\n [displayField]=\"column.option.displayField\" [(model)]=\"columnFilter[column.field]\" (sdChange)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\">\r\n </sd-autocomplete>\r\n <sd-date-time *ngIf=\"\r\n column.type === 'date' ||\r\n column.type === 'datetime' ||\r\n column.type === 'time'\r\n \" size=\"sm\" [(model)]=\"columnFilter[column.field]\" [type]=\"column.type\" (sdChange)=\"onFilterChange()\"\r\n [disabled]=\"column.filter?.disabled\">\r\n </sd-date-time>\r\n </ng-container>\r\n <ng-template #noFilter>\r\n <sd-input type=\"text\" disabled> </sd-input>\r\n </ng-template>\r\n</ng-template>\r\n\r\n<sd-quick-action *ngIf=\"\r\n selectedItems\r\n | selectionActionFilter: gridOption?.selection?.actions as actions\r\n \" [isOpened]=\"actions?.length\">\r\n <div sdMessage>\r\n <strong class=\"text-info\">{{ selectedItems.length }}</strong>\r\n {{ gridOption?.selection?.message || (\"selected rows\" | sdTranslate) }}\r\n </div>\r\n <div class=\"d-flex align-items-center\" sdAction>\r\n <ng-container *ngFor=\"let action of actions\">\r\n <sd-button *ngIf=\"action.click\" class=\"ml-5\" [tooltip]=\"action.tooltip\" [icon]=\"action.icon\"\r\n [color]=\"action.color || 'secondary'\" [type]=\"action.type || 'light'\" [fontSet]=\"action.fontSet\"\r\n [title]=\"action.title\" size=\"sm\" (action)=\"action.click(selectedItems)\"></sd-button>\r\n <ng-container *ngIf=\"action.children?.length\">\r\n <sd-button class=\"ml-5\" [tooltip]=\"action.tooltip\" [icon]=\"action.icon || 'more_vert'\"\r\n [color]=\"action.color || 'secondary'\" [type]=\"action.type || 'light'\" [fontSet]=\"action.fontSet\"\r\n [title]=\"action.title\" size=\"sm\" [matMenuTriggerFor]=\"menu\">\r\n </sd-button>\r\n <mat-menu #menu=\"matMenu\">\r\n <span>\r\n <button *ngFor=\"let childAction of action.children\" mat-menu-item (click)=\"childAction.click(selectedItems)\"\r\n [disabled]=\"childAction.disabled\">\r\n <mat-icon [fontSet]=\"childAction.fontSet\" class=\"c-icon\">{{ childAction.icon }}\r\n </mat-icon>\r\n <span> {{ childAction.title }}</span>\r\n </button>\r\n </span>\r\n </mat-menu>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</sd-quick-action>",
640
751
  animations: [
641
752
  trigger('detailExpand', [
642
753
  state('collapsed', style({ height: '0', minHeight: '0', visibility: 'hidden' })),
@@ -669,4 +780,4 @@ SdGridMaterial.propDecorators = {
669
780
  sdFooterDefs: [{ type: ContentChildren, args: [SdMaterialFooterDefDirective,] }],
670
781
  sdFilterDefs: [{ type: ContentChildren, args: [SdMaterialFilterDefDirective,] }]
671
782
  };
672
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1tYXRlcmlhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiQzovVXNlcnMvbmdoaWF0dDE1L0Rlc2t0b3AvV29ya2luZy8xTUcvbGliLWNvcmUtdWkvcHJvamVjdHMvc2QtY29yZS9ncmlkLW1hdGVyaWFsLyIsInNvdXJjZXMiOlsic3JjL2xpYi9ncmlkLW1hdGVyaWFsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFNBQVMsRUFFVCxRQUFRLEVBQ1IsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsU0FBUyxFQUdULFlBQVksRUFDWixZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBTzdCLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsNEJBQTRCLEVBRTdCLE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFELE9BQU8sRUFBZSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN6RixPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFlBQVksRUFBRSxN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LHdCQUF3QixFQUFFLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO3FCQUN0RixDQUFDO2lCQUNIOzthQUNGOzs7WUF0REMsaUJBQWlCOzRDQXFLZCxNQUFNLFNBQUMsb0JBQW9CLGNBQUcsUUFBUTtZQWhJbEMsMEJBQTBCO1lBRkksZUFBZTtZQVg3QyxlQUFlO1lBZWYsa0JBQWtCO1lBQ2xCLGFBQWE7OzswQkFtQm5CLFNBQVMsU0FBQyxhQUFhOzBCQUN2QixTQUFTLFNBQUMsWUFBWTtxQkFjdEIsS0FBSzt3QkE0QkwsU0FBUyxTQUFDLFlBQVk7bUJBYXRCLFNBQVMsU0FBQyxPQUFPOzRCQVlqQixTQUFTLFNBQUMsYUFBYTsrQkFHdkIsWUFBWSxTQUFDLG9DQUFvQzswQkFHakQsWUFBWSxTQUFDLCtCQUErQjt5QkFHNUMsZUFBZSxTQUFDLDBCQUEwQjsyQkFNMUMsZUFBZSxTQUFDLDRCQUE0QjsyQkFPNUMsZUFBZSxTQUFDLDRCQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIEluamVjdCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgUXVlcnlMaXN0LFxyXG4gIE9uSW5pdCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIENvbnRlbnRDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBNYXRTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XHJcbmltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgKiBhcyB1dWlkIGZyb20gJ3V1aWQnO1xyXG5pbXBvcnQge1xyXG4gIFNkR3JpZE1hdGVyaWFsRmlsdGVyUmVxdWVzdFxyXG59IGZyb20gJy4vbW9kZWxzL2dyaWQtZmlsdGVyLm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBTZEdyaWRNYXRlcmlhbE9wdGlvbiwgU2RHcmlkTWF0ZXJpYWxSb3dEYXRhXHJcbn0gZnJvbSAnLi9tb2RlbHMvZ3JpZC1vcHRpb24ubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIEdSSURfTUFURVJJQUxfQ09ORklHLFxyXG4gIERFRkFVTFRfR1JJRF9NQVRFUklBTF9DT05GSUcsXHJcbiAgSVNkR3JpZE1hdGVyaWFsQ29uZmlndXJhdGlvblxyXG59IGZyb20gJy4vbW9kZWxzL2dyaWQtY29uZmlndXJhdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgaXNPYnNlcnZhYmxlLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFNkTm90aWZ5U2VydmljZSB9IGZyb20gJ0BzZC1hbmd1bGFyL2NvcmUvbm90aWZ5JztcclxuaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AsIG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBTZEdyaWRNYXRlcmlhbENvbHVtbiB9IGZyb20gJy4vbW9kZWxzL2dyaWQtY29sdW1uLm1vZGVsJztcclxuaW1wb3J0IHsgU2RNYXRlcmlhbENlbGxEZWZEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvc2QtbWF0ZXJpYWwtY2VsbC1kZWYuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBtYXAsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBTZEdyaWRGaWx0ZXIgfSBmcm9tICcuL2NvbXBvbmVudHMvZ3JpZC1maWx0ZXIvZ3JpZC1maWx0ZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2RNYXRlcmlhbEZpbHRlckRlZkRpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9zZC1tYXRlcmlhbC1maWx0ZXItZGVmLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNkTWF0ZXJpYWxTdWJJbmZvcm1hdGlvbkRlZkRpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9zZC1tYXRlcmlhbC1zdWItaW5mb3JtYXRpb24tZGVmLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNkTWF0ZXJpYWxGb290ZXJEZWZEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvc2QtbWF0ZXJpYWwtZm9vdGVyLWRlZi5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTZE1hdGVyaWFsRW1wdHlEYXRhRGVmRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL3NkLW1hdGVyaWFsLWVtcHR5LWRhdGEtZGVmLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNkUG9wdXBFeHBvcnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcG9wdXAtZXhwb3J0L3BvcHVwLWV4cG9ydC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTZEV4cG9ydENvbHVtbiwgU2RFeHBvcnRGaWxlLCBTZEV4cG9ydFNlcnZpY2UgfSBmcm9tICdAc2QtYW5ndWxhci9jb3JlL2V4cG9ydCc7XHJcbmltcG9ydCB7IFNkR3JpZENvbmZpZ3VyYXRpb24gfSBmcm9tICcuL21vZGVscy9ncmlkLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IFNkR3JpZENvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9ncmlkLWNvbmZpZ3VyYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFNkR3JpZE1hdGVyaWFsRXhwb3J0Q29sdW1uIH0gZnJvbSAnLi9tb2RlbHMvZ3JpZC1leHBvcnQubW9kZWwnO1xyXG5pbXBvcnQgeyBTZFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAc2QtYW5ndWxhci9jb3JlL3RyYW5zbGF0ZSc7XHJcbmltcG9ydCB7IFNkR3JpZFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2dyaWQuc2VydmljZSc7XHJcbmltcG9ydCB7IFNkUXVpY2tBY3Rpb24gfSBmcm9tICdAc2QtYW5ndWxhci9jb3JlL3F1aWNrLWFjdGlvbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NkLWdyaWQtbWF0ZXJpYWwnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ncmlkLW1hdGVyaWFsLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9ncmlkLW1hdGVyaWFsLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignZGV0YWlsRXhwYW5kJywgW1xyXG4gICAgICBzdGF0ZSgnY29sbGFwc2VkJywgc3R5bGUoeyBoZWlnaHQ6ICcwJywgbWluSGVpZ2h0OiAnMCcsIHZpc2liaWxpdHk6ICdoaWRkZW4nIH0pKSxcclxuICAgICAgc3RhdGUoJ2V4cGFuZGVkJywgc3R5bGUoeyBoZWlnaHQ6ICcqJywgdmlzaWJpbGl0eTogJ3Zpc2libGUnIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignZXhwYW5kZWQgPD0+IGNvbGxhcHNlZCcsIGFuaW1hdGUoJzIyNW1zIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKScpKSxcclxuICAgIF0pLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZEdyaWRNYXRlcmlhbDxUID0gYW55PiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBrZXkgPSB1dWlkLnY0KCk7XHJcbiAgZ3JpZENvbmZpZ3VyYXRpb25PYnNlcnZlcjogT2JzZXJ2YWJsZTxTZEdyaWRDb25maWd1cmF0aW9uPjtcclxuICBncmlkRmlsdGVyOiBTZEdyaWRGaWx0ZXI7XHJcbiAgQFZpZXdDaGlsZChTZFF1aWNrQWN0aW9uKSBxdWlja0FjdGlvbjogU2RRdWlja0FjdGlvbjtcclxuICBAVmlld0NoaWxkKFNkR3JpZEZpbHRlcikgc2V0IF9ncmlkRmlsdGVyKGdyaWRGaWx0ZXI6IFNkR3JpZEZpbHRlcikge1xyXG4gICAgaWYgKGdyaWRGaWx0ZXIgJiYgdGhpcy5ncmlkRmlsdGVyICE9PSBncmlkRmlsdGVyKSB7XHJcbiAgICAgIHRoaXMuZ3JpZEZpbHRlciA9IGdyaWRGaWx0ZXI7XHJcbiAgICAgIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQoZ3JpZEZpbHRlci5maWx0ZXJDaGFuZ2UucGlwZShcclxuICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcclxuICAgICAgICBtYXAoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy4jcGFnaW5hdG9yLnBhZ2VJbmRleCA9IDA7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy4jZ2V0RmlsdGVyKCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKHRoaXMuI2xvYWQpXHJcbiAgICAgICkuc3Vic2NyaWJlKHRoaXMuI3JlbmRlcikpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IG9wdGlvbihvcHRpb246IFNkR3JpZE1hdGVyaWFsT3B0aW9uKSB7XHJcbiAgICBpZiAob3B0aW9uKSB7XHJcbiAgICAgIG9wdGlvbiA9IHRoaXMuI2luaXRDb25maWd1cmF0aW9uKG9wdGlvbik7XHJcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbiA9IG9wdGlvbjtcclxuICAgICAgdGhpcy4jb3B0aW9uQ2hhbmdlcy5lbWl0KCk7XHJcbiAgICAgIG9wdGlvbj8uY29sdW1ucz8uZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgIGlmKGNvbC5maWx0ZXI/LmRlZmF1bHQpIHtcclxuICAgICAgICAgIHRoaXMuY29sdW1uRmlsdGVyW2NvbC5maWVsZF0gPSBjb2wuZmlsdGVyLmRlZmF1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuZ3JpZENvbmZpZ3VyYXRpb25TZXJ2aWNlLmluaXQodGhpcy5rZXksIHRoaXMuZ3JpZE9wdGlvbik7XHJcbiAgICAgIHRoaXMuZ3JpZENvbmZpZ3VyYXRpb25PYnNlcnZlciA9IGNvbmZpZ3VyYXRpb24ub2JzZXJ2ZXI7XHJcbiAgICAgIGNvbmZpZ3VyYXRpb24ubG9hZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ3JpZE9wdGlvbjogU2RHcmlkTWF0ZXJpYWxPcHRpb247XHJcbiAgbG9jYWxJdGVtczogYW55W10gPSBbXTtcclxuICBpdGVtczogU2RHcmlkTWF0ZXJpYWxSb3dEYXRhW10gPSBbXTtcclxuICBzZWxlY3RlZEl0ZW1zOiBUW10gPSBbXTtcclxuICB0b3RhbDogbnVtYmVyO1xyXG5cclxuICAvLyBMb2FkaW5nXHJcbiAgaXNMb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gIC8vIFBhZ2luYXRlXHJcbiAgaXNIaWRkZW5QYWdpbmF0b3IgPSBmYWxzZTtcclxuICAjcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XHJcbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHNldCBwYWdpbmF0b3IocGFnaW5hdG9yOiBNYXRQYWdpbmF0b3IpIHtcclxuICAgIGlmIChwYWdpbmF0b3IgJiYgdGhpcy4jcGFnaW5hdG9yICE9PSBwYWdpbmF0b3IpIHtcclxuICAgICAgdGhpcy4jcGFnaW5hdG9yID0gcGFnaW5hdG9yO1xyXG4gICAgICB0aGlzLiNzdWJzY3JpcHRpb24uYWRkKHBhZ2luYXRvci5wYWdlLnBpcGUoXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDIwMCksXHJcbiAgICAgICAgbWFwKHRoaXMuI2dldEZpbHRlciksXHJcbiAgICAgICAgc3dpdGNoTWFwKHRoaXMuI2xvYWQpXHJcbiAgICAgICkuc3Vic2NyaWJlKHRoaXMuI3JlbmRlcikpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gU29ydGluZ1xyXG4gICNzb3J0OiBNYXRTb3J0O1xyXG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc2V0IHNvcnQoc29ydDogTWF0U29ydCkge1xyXG4gICAgaWYgKHNvcnQgJiYgdGhpcy4jc29ydCAhPT0gc29ydCkge1xyXG4gICAgICB0aGlzLiNzb3J0ID0gc29ydDtcclxuICAgICAgdGhpcy4jc3Vic2NyaXB0aW9uLmFkZChzb3J0LnNvcnRDaGFuZ2UucGlwZShcclxuICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcclxuICAgICAgICBtYXAodGhpcy4jZ2V0RmlsdGVyKSxcclxuICAgICAgICBzd2l0Y2hNYXAodGhpcy4jbG9hZClcclxuICAgICAgKS5zdWJzY3JpYmUodGhpcy4jcmVuZGVyKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBFeHBvcnRcclxuICBAVmlld0NoaWxkKFNkUG9wdXBFeHBvcnQpIHNkUG9wdXBFeHBvcnQ6IFNkUG9wdXBFeHBvcnQ7XHJcblxyXG4gIC8vIFN1YiBJbmZvcm1hdGlvblxyXG4gIEBDb250ZW50Q2hpbGQoU2RNYXRlcmlhbFN1YkluZm9ybWF0aW9uRGVmRGlyZWN0aXZlKSBzZFN1YkluZm9ybWF0aW9uOiBTZE1hdGVyaWFsU3ViSW5mb3JtYXRpb25EZWZEaXJlY3RpdmU7XHJcblxyXG4gIC8vIEVtcHR5IERhdGFcclxuICBAQ29udGVudENoaWxkKFNkTWF0ZXJpYWxFbXB0eURhdGFEZWZEaXJlY3RpdmUpIHNkRW1wdHlEYXRhOiBTZE1hdGVyaWFsRW1wdHlEYXRhRGVmRGlyZWN0aXZlO1xyXG5cclxuICAvLyBDZWxsIERlZlxyXG4gIEBDb250ZW50Q2hpbGRyZW4oU2RNYXRlcmlhbENlbGxEZWZEaXJlY3RpdmUpIHNkQ2VsbERlZnMgPSBuZXcgUXVlcnlMaXN0PFNkTWF0ZXJpYWxDZWxsRGVmRGlyZWN0aXZlPigpO1xyXG4gIGNlbGxEZWY6IHtcclxuICAgIFtjb2x1bW46IHN0cmluZ106IFNkTWF0ZXJpYWxDZWxsRGVmRGlyZWN0aXZlXHJcbiAgfSA9IHt9O1xyXG5cclxuICAvLyBGb290ZXIgRGVmXHJcbiAgQENvbnRlbnRDaGlsZHJlbihTZE1hdGVyaWFsRm9vdGVyRGVmRGlyZWN0aXZlKSBzZEZvb3RlckRlZnMgPSBuZXcgUXVlcnlMaXN0PFNkTWF0ZXJpYWxGb290ZXJEZWZEaXJlY3RpdmU+KCk7XHJcbiAgZm9vdGVyRGVmOiB7XHJcbiAgICBbY29sdW1uOiBzdHJpbmddOiBTZE1hdGVyaWFsRm9vdGVyRGVmRGlyZWN0aXZlXHJcbiAgfSA9IHt9O1xyXG4gIGhhc0Zvb3RlciA9IGZhbHNlO1xyXG5cclxuICAvLyBGaWx0ZXIgRGVmXHJcbiAgQENvbnRlbnRDaGlsZHJlbihTZE1hdGVyaWFsRmlsdGVyRGVmRGlyZWN0aXZlKSBzZEZpbHRlckRlZnMgPSBuZXcgUXVlcnlMaXN0PFNkTWF0ZXJpYWxGaWx0ZXJEZWZEaXJlY3RpdmU+KCk7XHJcbiAgZmlsdGVyRGVmczogU2RNYXRlcmlhbEZpbHRlckRlZkRpcmVjdGl2ZVtdID0gW107XHJcblxyXG4gIC8vIEZpbHRlclxyXG4gIGNvbHVtbkZpbHRlcjoge1xyXG4gICAgW2tleTogc3RyaW5nXTogYW55XHJcbiAgfSA9IHt9O1xyXG4gIC8vIFN1YmNyaXB0aW9uXHJcbiAgI3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAjb3B0aW9uQ2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBpc0V4cG9ydGluZyA9IGZhbHNlO1xyXG4gIGlzU2VsZWN0QWxsID0gZmFsc2U7XHJcbiAgZXhwb3J0VGl0bGUgPSAnRXhwb3J0JztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBASW5qZWN0KEdSSURfTUFURVJJQUxfQ09ORklHKSBAT3B0aW9uYWwoKSBwdWJsaWMgY29uZmlndXJhdGlvbjogSVNkR3JpZE1hdGVyaWFsQ29uZmlndXJhdGlvbixcclxuICAgIHByaXZhdGUgZ3JpZENvbmZpZ3VyYXRpb25TZXJ2aWNlOiBTZEdyaWRDb25maWd1cmF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZXhwb3J0U2VydmljZTogU2RFeHBvcnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBub3RpZnlTZXJ2aWNlOiBTZE5vdGlmeVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFNkVHJhbnNsYXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgZ3JpZFNlcnZpY2U6IFNkR3JpZFNlcnZpY2UpIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy4jaW5pdENlbGxEZWYoKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQodGhpcy5zZENlbGxEZWZzLmNoYW5nZXMucGlwZShzdGFydFdpdGgoW10pKS5zdWJzY3JpYmUodGhpcy4jaW5pdENlbGxEZWYpKTtcclxuICAgIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQodGhpcy5zZEZvb3RlckRlZnMuY2hhbmdlcy5waXBlKHN0YXJ0V2l0aChbXSkpLnN1YnNjcmliZSh0aGlzLiNpbml0Rm9vdGVyRGVmKSk7XHJcbiAgICB0aGlzLiNzdWJzY3JpcHRpb24uYWRkKHRoaXMuc2RGaWx0ZXJEZWZzLmNoYW5nZXMucGlwZShzdGFydFdpdGgoW10pKS5zdWJzY3JpYmUodGhpcy4jaW5pdEZpbHRlckRlZikpO1xyXG4gICAgdGhpcy4jc3Vic2NyaXB0aW9uLmFkZCh0aGlzLiNvcHRpb25DaGFuZ2VzLnBpcGUoXHJcbiAgICAgIHN0YXJ0V2l0aCh7fSksXHJcbiAgICAgIGRlYm91bmNlVGltZSgyMDApLFxyXG4gICAgICBtYXAodGhpcy4jZ2V0RmlsdGVyKSxcclxuICAgICAgc3dpdGNoTWFwKHRoaXMuI2xvYWQpXHJcbiAgICApLnN1YnNjcmliZSh0aGlzLiNyZW5kZXIpKTtcclxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy4jc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAjaW5pdENlbGxEZWYgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNlbGxEZWYgPSB7fTtcclxuICAgIGZvciAoY29uc3QgY2VsbERlZiBvZiB0aGlzLnNkQ2VsbERlZnMpIHtcclxuICAgICAgaWYgKGNlbGxEZWYuc2RNYXRlcmlhbENlbGxEZWYpIHtcclxuICAgICAgICB0aGlzLmNlbGxEZWZbY2VsbERlZi5zZE1hdGVyaWFsQ2VsbERlZl0gPSBjZWxsRGVmO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAjaW5pdEZpbHRlckRlZiA9ICgpID0+IHtcclxuICAgIHRoaXMuZmlsdGVyRGVmcyA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBmaWx0ZXJEZWYgb2YgdGhpcy5zZEZpbHRlckRlZnMpIHtcclxuICAgICAgdGhpcy5maWx0ZXJEZWZzLnB1c2goZmlsdGVyRGVmKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICNpbml0Rm9vdGVyRGVmID0gKCkgPT4ge1xyXG4gICAgdGhpcy5mb290ZXJEZWYgPSB7fTtcclxuICAgIHRoaXMuaGFzRm9vdGVyID0gZmFsc2U7XHJcbiAgICBmb3IgKGNvbnN0IGZvb3RlckRlZiBvZiB0aGlzLnNkRm9vdGVyRGVmcykge1xyXG4gICAgICBpZiAoZm9vdGVyRGVmLnNkTWF0ZXJpYWxGb290ZXJEZWYpIHtcclxuICAgICAgICB0aGlzLmhhc0Zvb3RlciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5mb290ZXJEZWZbZm9vdGVyRGVmLnNkTWF0ZXJpYWxGb290ZXJEZWZdID0gZm9vdGVyRGVmO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAjZmlsdGVyRXhwb3J0SW5mbyA9IChwYWdlTnVtYmVyOiBudW1iZXIsIHBhZ2VTaXplOiBudW1iZXIpOiBTZEdyaWRNYXRlcmlhbEZpbHRlclJlcXVlc3QgPT4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmF3Q29sdW1uRmlsdGVyOiAodGhpcy5ncmlkT3B0aW9uPy5maWx0ZXI/LmlubGluZUNvbHVtbiA/IHRoaXMuY29sdW1uRmlsdGVyIDogdGhpcy5ncmlkRmlsdGVyPy5jb2x1bW5GaWx0ZXIpIHx8IHt9LFxyXG4gICAgICByYXdFeHRlcm5hbEZpbHRlcjogdGhpcy5ncmlkRmlsdGVyPy5leHRlcm5hbEZpbHRlciB8fCB7fSxcclxuICAgICAgcmF3RmlsdGVyRGVmOiB0aGlzLmdyaWRGaWx0ZXI/LmZpbHRlckRlZiB8fCB7fSxcclxuICAgICAgb3JkZXJCeTogdGhpcy4jc29ydD8uYWN0aXZlIHx8ICcnLFxyXG4gICAgICBvcmRlckRpcmVjdGlvbjogdGhpcy4jc29ydD8uZGlyZWN0aW9uIHx8ICcnLFxyXG4gICAgICBwYWdlTnVtYmVyLFxyXG4gICAgICBwYWdlU2l6ZSxcclxuICAgICAgaXNFeHBvcnRlZDogdHJ1ZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gICNpbml0Q29uZmlndXJhdGlvbiA9IChvcHRpb246IFNkR3JpZE1hdGVyaWFsT3B0aW9uKSA9PiB7XHJcbiAgICBvcHRpb24ucGFnaW5hdGUgPSB7XHJcbiAgICAgIGhpZGRlbjogb3B0aW9uPy5wYWdpbmF0ZT8uaGlkZGVuLFxyXG4gICAgICBwYWdlU2l6ZTogb3B0aW9uPy5wYWdpbmF0ZT8ucGFnZVNpemUgPz8gdGhpcy5jb25maWd1cmF0aW9uPy5wYWdpbmF0ZT8ucGFnZVNpemUgPz8gREVGQVVMVF9HUklEX01BVEVSSUFMX0NPTkZJRy5wYWdpbmF0ZT8ucGFnZVNpemUsXHJcbiAgICAgIHBhZ2VzOiBvcHRpb24/LnBhZ2luYXRlPy5wYWdlcyA/PyB0aGlzLmNvbmZpZ3VyYXRpb24/LnBhZ2luYXRlPy5wYWdlcyA/PyBERUZBVUxUX0dSSURfTUFURVJJQUxfQ09ORklHLnBhZ2luYXRlPy5wYWdlcyxcclxuICAgICAgc2hvd0ZpcnN0TGFzdEJ1dHRvbnM6IG9wdGlvbj8ucGFnaW5hdGU/LnNob3dGaXJzdExhc3RCdXR0b25zID8/IGZhbHNlXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG9wdGlvbjtcclxuICB9XHJcblxyXG4gICNmaWx0ZXJMb2NhbCA9IChsb2NhbEl0ZW1zOiBhbnlbXSwgZmlsdGVySW5mbzogU2RHcmlkTWF0ZXJpYWxGaWx0ZXJSZXF1ZXN0KSA9PiB7XHJcbiAgICBjb25zdCB7IGNvbHVtbnMgfSA9IHRoaXMuZ3JpZE9wdGlvbjtcclxuICAgIGNvbnN0IGl0ZW1zID0gbG9jYWxJdGVtcy5maWx0ZXIoaXRlbSA9PiB7XHJcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcclxuICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZTogc3RyaW5nID0gKGZpbHRlckluZm8ucmF3Q29sdW1uRmlsdGVyW2NvbHVtbi5maWVsZF0gfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgY29uc3QgY29sdW1uVmFsdWU6IHN0cmluZyA9IChpdGVtW2NvbHVtbi5maWVsZF0gfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKGZpbHRlclZhbHVlKSB7XHJcbiAgICAgICAgICBpZiAoIWNvbHVtblZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgaWYgKGNvbHVtblZhbHVlLmluZGV4T2YoZmlsdGVyVmFsdWUpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgICAgY29uc3QgZlZhbHVlID0gK2ZpbHRlclZhbHVlLnJlcGxhY2UoJz49JywgJycpLnJlcGxhY2UoJzw9JywgJycpLnJlcGxhY2UoJz4nLCAnJykucmVwbGFjZSgnPCcsICcnKTtcclxuICAgICAgICAgICAgY29uc3QgY1ZhbHVlID0gK2NvbHVtblZhbHVlO1xyXG4gICAgICAgICAgICBpZiAoZlZhbHVlIHx8IGZWYWx1ZSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIGlmICghY1ZhbHVlICYmIGNWYWx1ZSAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUuaW5kZXhPZignPj0nKSA+IC0xICYmIGNWYWx1ZSA8IGZWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyVmFsdWUuaW5kZXhPZignPD0nKSA+IC0xICYmIGNWYWx1ZSA+IGZWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyVmFsdWUuaW5kZXhPZignPCcpID4gLTEgJiYgY1ZhbHVlID49IGZWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyVmFsdWUuaW5kZXhPZignPicpID4gLTEgJiYgY1ZhbHVlIDw9IGZWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY1ZhbHVlICE9PSBmVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICdib29sJykge1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUgPT09ICcxJyAmJiBjb2x1bW5WYWx1ZSAhPT0gJzEnICYmIGNvbHVtblZhbHVlICE9PSAndHJ1ZScpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyVmFsdWUgPT09ICcwJyAmJiBjb2x1bW5WYWx1ZSAhPT0gJzAnICYmIGNvbHVtblZhbHVlICE9PSAnZmFsc2UnKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAnZGF0ZScgfHwgY29sdW1uLnR5cGUgPT09ICdkYXRldGltZScpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IERhdGUudG9Gb3JtYXQoZmlsdGVyVmFsdWUsICdNTS95eXl5L2RkJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZyb21EYXRlID0gbmV3IERhdGUoZGF0ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvRGF0ZSA9IG5ldyBEYXRlKGRhdGUpO1xyXG4gICAgICAgICAgICB0b0RhdGUuc2V0RGF0ZSh0b0RhdGUuZ2V0RGF0ZSgpICsgMSk7XHJcbiAgICAgICAgICAgIGlmIChuZXcgRGF0ZShjb2x1bW5WYWx1ZSkuZ2V0VGltZSgpIDwgZnJvbURhdGUuZ2V0VGltZSgpIHx8IG5ldyBEYXRlKGNvbHVtblZhbHVlKS5nZXRUaW1lKCkgPj0gdG9EYXRlLmdldFRpbWUoKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0pO1xyXG4gICAgLy8gU29ydFxyXG4gICAgaWYgKGZpbHRlckluZm8ub3JkZXJCeSAmJiBmaWx0ZXJJbmZvLm9yZGVyRGlyZWN0aW9uKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbHVtbnMuZmluZChlID0+IGUuZmllbGQgPT09IGZpbHRlckluZm8ub3JkZXJCeSk7XHJcbiAgICAgIGlmIChjb2x1bW4pIHtcclxuICAgICAgICBjb25zdCB7IHR5cGUsIGZpZWxkIH0gPSBjb2x1bW47XHJcbiAgICAgICAgaXRlbXMuc29ydCgoY3VycmVudCwgbmV4dCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoY3VycmVudFtmaWVsZF0gfHwgMCkgLSAobmV4dFtmaWVsZF0gfHwgMCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodHlwZSA9PT0gJ2RhdGUnIHx8IHR5cGUgPT09ICdkYXRldGltZScgfHwgdHlwZSA9PT0gJ3RpbWUnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGQxID0gbmV3IERhdGUoY3VycmVudFtmaWVsZF0gfHwgJycpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgY29uc3QgZDIgPSBuZXcgRGF0ZShjdXJyZW50W2ZpZWxkXSB8fCAnJykuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZDEgLSBkMjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnN0IHMxID0gKGN1cnJlbnRbZmllbGRdIHx8ICcnKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgY29uc3QgczIgPSAobmV4dFtmaWVsZF0gfHwgJycpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICBpZiAoczEgPiBzMikge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChzMSA8IHMyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChmaWx0ZXJJbmZvLm9yZGVyRGlyZWN0aW9uID09PSAnZGVzYycpIHtcclxuICAgICAgICAgIGl0ZW1zLnJldmVyc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGl0ZW1zOiBpdGVtcy5maWx0ZXIoKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcGFnZUluZGV4ID0gdGhpcy4jcGFnaW5hdG9yPy5wYWdlSW5kZXggfHwgMDtcclxuICAgICAgICBjb25zdCBwYWdlU2l6ZSA9IHRoaXMuI3BhZ2luYXRvcj8ucGFnZVNpemUgfHwgdGhpcy5ncmlkT3B0aW9uPy5wYWdpbmF0ZT8ucGFnZVNpemUgfHwgNTA7XHJcbiAgICAgICAgcmV0dXJuIGluZGV4ID49IHBhZ2VJbmRleCAqIHBhZ2VTaXplXHJcbiAgICAgICAgICAmJiBpbmRleCA8IChwYWdlSW5kZXggKyAxKSAqIHBhZ2VTaXplO1xyXG4gICAgICB9KSxcclxuICAgICAgdG90YWw6IGl0ZW1zLmxlbmd0aFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gICNnZXRGaWx0ZXIgPSAoKTogU2RHcmlkTWF0ZXJpYWxGaWx0ZXJSZXF1ZXN0ID0+ICh7XHJcbiAgICByYXdDb2x1bW5GaWx0ZXI6ICh0aGlzLmdyaWRPcHRpb24/LmZpbHRlcj8uaW5saW5lQ29sdW1uID8gdGhpcy5jb2x1bW5GaWx0ZXIgOiB0aGlzLmdyaWRGaWx0ZXI/LmNvbHVtbkZpbHRlcikgfHwge30sXHJcbiAgICByYXdFeHRlcm5hbEZpbHRlcjogdGhpcy5ncmlkRmlsdGVyPy5leHRlcm5hbEZpbHRlciB8fCB7fSxcclxuICAgIHJhd0ZpbHRlckRlZjogdGhpcy5ncmlkRmlsdGVyPy5maWx0ZXJEZWYgfHwge30sXHJcbiAgICBvcmRlckJ5OiB0aGlzLiNzb3J0Py5hY3RpdmUgfHwgJycsXHJcbiAgICBvcmRlckRpcmVjdGlvbjogdGhpcy4jc29ydD8uZGlyZWN0aW9uIHx8ICcnLFxyXG4gICAgcGFnZU51bWJlcjogdGhpcy4jcGFnaW5hdG9yPy5wYWdlSW5kZXggfHwgMCxcclxuICAgIHBhZ2VTaXplOiB0aGlzLiNwYWdpbmF0b3I/LnBhZ2VTaXplIHx8IHRoaXMuZ3JpZE9wdGlvbj8ucGFnaW5hdGU/LnBhZ2VTaXplIHx8IDUwXHJcbiAgfSlcclxuXHJcbiAgI2xvYWQgPSBhc3luYyAoZmlsdGVyUmVxOiBTZEdyaWRNYXRlcmlhbEZpbHRlclJlcXVlc3QpOiBQcm9taXNlPHsgaXRlbXM6IGFueVtdLCB0b3RhbDogbnVtYmVyIH0+ID0+IHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLmdyaWRPcHRpb24udHlwZSA9PT0gJ3NlcnZlcicpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5ncmlkT3B0aW9uLml0ZW1zKGZpbHRlclJlcSk7XHJcbiAgICAgICAgaWYgKGlzT2JzZXJ2YWJsZShyZXN1bHQpKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhd2FpdCByZXN1bHQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZ3JpZE9wdGlvbi5pdGVtcygpO1xyXG4gICAgICAgIGlmIChyZXN1bHRzIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgdGhpcy5sb2NhbEl0ZW1zID0gYXdhaXQgcmVzdWx0cztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5sb2NhbEl0ZW1zID0gcmVzdWx0cztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZpbHRlckxvY2FsKHRoaXMubG9jYWxJdGVtcywgZmlsdGVyUmVxKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5ub3RpZnlTZXJ2aWNlLmhhbmRsZS5lcnJvcihlcnJvcik7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAjcmVuZGVyID0gYXN5bmMgKGFyZ3M6IHsgaXRlbXM6IGFueVtdLCB0b3RhbDogbnVtYmVyIH0pID0+IHtcclxuICAgIHRoaXMuaXRlbXMgPSBhcmdzPy5pdGVtcyB8fCBbXTtcclxuICAgIHRoaXMudG90YWwgPSBhcmdzPy50b3RhbCB8fCAwO1xyXG4gICAgLy8gdGhpcy5pc0hpZGRlblBhZ2luYXRvciA9IHRoaXMuZmlsdGVySW5mby5wYWdlTnVtYmVyID09PSAwICYmIHRoaXMudG90YWwgPD0gdGhpcy5maWx0ZXJJbmZvLnBhZ2VTaXplO1xyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5vcmlnaW5JdGVtID0geyAuLi5pdGVtIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5ncmlkT3B0aW9uPy5yZWxvYWQ/Lm9uUmVsb2FkPy4odGhpcy5pdGVtcyk7XHJcbiAgICB0aGlzLmlzU2VsZWN0QWxsID0gdGhpcy5pdGVtcy5ldmVyeShlID0+IGUuaXNTZWxlY3RlZCk7XHJcbiAgICB0aGlzLiN1cGRhdGVTZWxlY3RlZEl0ZW1zKCk7XHJcbiAgfVxyXG5cclxuICByZWxvYWQgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy4jbG9hZCh0aGlzLiNnZXRGaWx0ZXIoKSk7XHJcbiAgICB0aGlzLiNyZW5kZXIoZGF0YSk7XHJcbiAgfVxyXG5cclxuICAjZXhwb3J0ZWRJdGVtcyA9IGFzeW5jIChwYWdlTnVtYmVyOiBudW1iZXIgPSAwLCBwYWdlU2l6ZTogbnVtYmVyID0gMTAwMDApID0+IHtcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb24uZXhwb3J0Py5pdGVtcykge1xyXG4gICAgICAvLyBjb25zdCBleHBvcnRlZEl0ZW1zID0gdGhpcy5ncmlkT3B0aW9uLmV4cG9ydD8uaXRlbXModGhpcy4jZmlsdGVyRXhwb3J0SW5mbyhwYWdlTnVtYmVyLCBwYWdlU2l6ZSkpO1xyXG4gICAgICBsZXQgcmVzdWx0ID0gdGhpcy5ncmlkT3B0aW9uLmV4cG9ydD8uaXRlbXModGhpcy4jZmlsdGVyRXhwb3J0SW5mbyhwYWdlTnVtYmVyLCBwYWdlU2l6ZSkpO1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaXNPYnNlcnZhYmxlPGFueVtdPihyZXN1bHQpKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnRvUHJvbWlzZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpc09ic2VydmFibGU8eyBpdGVtczogYW55W10sIHRvdGFsOiBudW1iZXIgfT4ocmVzdWx0KSkge1xyXG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC50b1Byb21pc2UoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdWx0O1xyXG4gICAgICAvLyBpZiAoZXhwb3J0ZWRJdGVtcyBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgLy8gICByZXR1cm4gYXdhaXQgZXhwb3J0ZWRJdGVtcztcclxuICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgLy8gICByZXR1cm4gZXhwb3J0ZWRJdGVtcztcclxuICAgICAgLy8gfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgZmlsdGVySW5mbyA9IHRoaXMuI2ZpbHRlckV4cG9ydEluZm8ocGFnZU51bWJlciwgcGFnZVNpemUpO1xyXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLnR5cGUgPT09ICdzZXJ2ZXInKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuZ3JpZE9wdGlvbi5pdGVtcyhmaWx0ZXJJbmZvKTtcclxuICAgICAgICBpZiAoaXNPYnNlcnZhYmxlKHJlc3VsdCkpIHtcclxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC50b1Byb21pc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3VsdDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgZXhwb3J0ZWRJdGVtczogYW55W10gPSBbXTtcclxuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmdyaWRPcHRpb24uaXRlbXMpID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICBjb25zdCByZXN1bHRzID0gdGhpcy5ncmlkT3B0aW9uLml0ZW1zKCk7XHJcbiAgICAgICAgICBpZiAocmVzdWx0cyBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgZXhwb3J0ZWRJdGVtcyA9IGF3YWl0IHJlc3VsdHM7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBleHBvcnRlZEl0ZW1zID0gcmVzdWx0cztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZXhwb3J0ZWRJdGVtcyA9IHRoaXMuZ3JpZE9wdGlvbi5pdGVtcztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZpbHRlckxvY2FsKGV4cG9ydGVkSXRlbXMsIGZpbHRlckluZm8pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxzdHJpbmdbXT4sIGNvbHVtbnM6IHN0cmluZ1tdKSB7XHJcbiAgICBtb3ZlSXRlbUluQXJyYXkoY29sdW1ucywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcclxuICB9XHJcblxyXG4gICNhbGxDb2x1bW5zID0gKCk6IFNkR3JpZE1hdGVyaWFsQ29sdW1uW10gPT4ge1xyXG4gICAgY29uc3QgY29sdW1uczogU2RHcmlkTWF0ZXJpYWxDb2x1bW5bXSA9IFtdO1xyXG4gICAgdGhpcy5ncmlkT3B0aW9uLmNvbHVtbnMuZmlsdGVyKGUgPT4gIWUuZXhwb3J0Py5kaXNhYmxlZCkuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT09ICdpbWFnZScpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbHVtbi50eXBlID09PSAnY2hpbGRyZW4nKSB7XHJcbiAgICAgICAgY29sdW1uLmNoaWxkcmVuPy5maWx0ZXIoZSA9PiAhZS5leHBvcnQ/LmRpc2FibGVkKS5mb3JFYWNoKGNoaWxkQ29sdW1uID0+IHtcclxuICAgICAgICAgIGlmIChjaGlsZENvbHVtbi50eXBlID09PSAnaW1hZ2UnKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbHVtbnMucHVzaChjaGlsZENvbHVtbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gJ2NoaWxkcmVuLWNvbCcpIHtcclxuICAgICAgICBjb2x1bW4uY2hpbGRyZW4/LmZpbHRlcihlID0+ICFlLmV4cG9ydD8uZGlzYWJsZWQpLmZvckVhY2goY2hpbGRDb2x1bW4gPT4ge1xyXG4gICAgICAgICAgaWYgKGNoaWxkQ29sdW1uLnR5cGUgPT09ICdpbWFnZScpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29sdW1ucy5wdXNoKGNoaWxkQ29sdW1uKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29sdW1ucy5wdXNoKGNvbHVtbik7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgI2FsbEV4cG9ydGVkQ29sdW1ucyA9ICgpOiBTZEdyaWRNYXRlcmlhbEV4cG9ydENvbHVtbltdID0+IHtcclxuICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb24uZXhwb3J0Py5jb2x1bW5zPy5maWx0ZXIoZSA9PiAhZS5leHBvcnQ/LmRpc2FibGVkKSB8fCBbXTtcclxuICB9XHJcblxyXG4gICNvbkV4cG9ydCA9IGFzeW5jIChhcmdzOiB7IGZpbGU6IFNkRXhwb3J0RmlsZSwgY29sdW1uczogU2RFeHBvcnRDb2x1bW5bXSwgaXNDU1Y6IGJvb2xlYW4gfSkgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgeyBmaWxlLCBjb2x1bW5zLCBpc0NTViB9ID0gYXJncztcclxuICAgICAgY29uc3QgcGFnZVNpemUgPSB0aGlzLmdyaWRPcHRpb24/LmV4cG9ydD8ubWF4SXRlbXNQZXJSZXF1ZXN0IHx8IDEwMDA7XHJcbiAgICAgIGxldCB0b3RhbCA9IHRoaXMudG90YWw7XHJcbiAgICAgIGxldCBwYWdlTnVtYmVyID0gMDtcclxuICAgICAgbGV0IGV4cG9ydEl0ZW1zID0gW107XHJcbiAgICAgIHRoaXMuaXNFeHBvcnRpbmcgPSB0cnVlO1xyXG4gICAgICBjb25zdCBpdGVtczogYW55W10gPSBbXTtcclxuICAgICAgd2hpbGUgKHBhZ2VOdW1iZXIgKiBwYWdlU2l6ZSA8IHRvdGFsKSB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy4jZXhwb3J0ZWRJdGVtcyhwYWdlTnVtYmVyLCBwYWdlU2l6ZSk7XHJcbiAgICAgICAgaWYgKCdpdGVtcycgaW4gcmVzKSB7XHJcbiAgICAgICAgICBleHBvcnRJdGVtcyA9IHJlcy5pdGVtcztcclxuICAgICAgICAgIHRvdGFsID0gcmVzLnRvdGFsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBleHBvcnRJdGVtcyA9IHJlcztcclxuICAgICAgICAgIC8vIHRvdGFsID0gZXhwb3J0SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLmV4cG9ydD8ubWFwcGluZykge1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZ3JpZE9wdGlvbi5leHBvcnQubWFwcGluZyhleHBvcnRJdGVtcyk7XHJcbiAgICAgICAgICBpZiAocmVzdWx0cyBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgZXhwb3J0SXRlbXMgPSBhd2FpdCByZXN1bHRzO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZXhwb3J0SXRlbXMgPSByZXN1bHRzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdG90YWxQYWdlID0gdG90YWwgLyBwYWdlU2l6ZTtcclxuICAgICAgICBjb25zdCBwZXJjZW50ID0gTWF0aC5yb3VuZChwYWdlTnVtYmVyICogMTAwLjAgLyB0b3RhbFBhZ2UpO1xyXG4gICAgICAgIHRoaXMuZXhwb3J0VGl0bGUgPSBgRXhwb3J0aW5nLi4uJHtwZXJjZW50fSVgO1xyXG4gICAgICAgIGNvbnN0IGFsbENvbHVtbnMgPSB0aGlzLiNhbGxDb2x1bW5zKCk7XHJcbiAgICAgICAgY29uc3QgYWxsRXhwb3J0ZWRDb2x1bW5zID0gdGhpcy4jYWxsRXhwb3J0ZWRDb2x1bW5zKCk7XHJcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGV4cG9ydEl0ZW1zKSB7XHJcbiAgICAgICAgICBjb25zdCBvYmo6IGFueSA9IHt9O1xyXG4gICAgICAgICAgY29uc3QgaGFuZGxlID0gKGV4cG9ydENvbHVtbjogU2RFeHBvcnRDb2x1bW4pID0+IHtcclxuICAgICAgICAgICAgb2JqW2V4cG9ydENvbHVtbi5maWVsZF0gPSBpdGVtW2V4cG9ydENvbHVtbi5maWVsZF07XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IGFsbENvbHVtbnMuZmluZChlID0+IGUuZmllbGQgPT09IGV4cG9ydENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGV4cG9ydGVkQ29sdW1uID0gYWxsRXhwb3J0ZWRDb2x1bW5zLmZpbmQoZSA9PiBlLmZpZWxkID09PSBleHBvcnRDb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICBpZiAoZXhwb3J0ZWRDb2x1bW4/LnRyYW5zZm9ybSkge1xyXG4gICAgICAgICAgICAgIG9ialtleHBvcnRlZENvbHVtbi5maWVsZF0gPSBleHBvcnRlZENvbHVtbi50cmFuc2Zvcm0oaXRlbVtleHBvcnRlZENvbHVtbi5maWVsZF0sIGl0ZW0pO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWNvbHVtbikge1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09ICdjaGlsZHJlbicgfHwgY29sdW1uLnR5cGUgPT09ICdjaGlsZHJlbi1jb2wnKSB7XHJcbiAgICAgICAgICAgICAgY29sdW1uPy5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkQ29sdW1uID0+IGhhbmRsZShjaGlsZENvbHVtbikpO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWNvbHVtbnMuc29tZShlID0+IGUuZmllbGQgPT09IGNvbHVtbi5maWVsZCkpIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNvbHVtbi50cmFuc2Zvcm0pIHtcclxuICAgICAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IGNvbHVtbi50cmFuc2Zvcm0oaXRlbVtjb2x1bW4uZmllbGRdLCBpdGVtKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtW2NvbHVtbi5maWVsZF0gPT09IHVuZGVmaW5lZCB8fCBpdGVtW2NvbHVtbi5maWVsZF0gPT09IG51bGwgfHwgaXRlbVtjb2x1bW4uZmllbGRdID09PSAnJykge1xyXG4gICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gJyc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICdzdHJpbmcnIHx8IGNvbHVtbi50eXBlID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICAgIC8vIE7hur91IGNlbGwgbMOgIHN0cmluZyBob+G6t2MgbnVtYmVyIHRow6wgZ8OhbiBi4bqxbmcgY2jDrW5oIG7Ds1xyXG4gICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gaXRlbVtjb2x1bW4uZmllbGRdO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAnYm9vbCcpIHtcclxuICAgICAgICAgICAgICAvLyBO4bq/dSBsw6AgYm9vbCB0aMOsIGfDoW4gYuG6sW5nIGdpw6EgdHLhu4sgdHJ1ZVZhbHVlIHbDoCBmYWxzZVZhbHVlIChu4bq/dSBjw7MpLCBt4bq3YyDEkeG7i25oIGzDoCBUUlVFL0ZBTFNFXHJcbiAgICAgICAgICAgICAgaWYgKGl0ZW1bY29sdW1uLmZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBjb2x1bW4ub3B0aW9uPy5kaXNwbGF5T25UcnVlIHx8ICdUcnVlJztcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBjb2x1bW4ub3B0aW9uPy5kaXNwbGF5T25GYWxzZSB8fCAnRmFsc2UnO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ2RhdGUnKSB7XHJcbiAgICAgICAgICAgICAgLy8gTuG6v3UgbMOgIGRhdGUgdGjDrCBjb252ZXJ0IHRoZW8gxJHDum5nIGZvcm1hdFxyXG4gICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShpdGVtW2NvbHVtbi5maWVsZF0pO1xyXG4gICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gRGF0ZS50b0Zvcm1hdChkYXRlLCAnZGQvTU0veXl5eScpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICAgICAgLy8gTuG6v3UgbMOgIGRhdGV0aW1lIHRow6wgY29udmVydCB0aGVvIMSRw7puZyBmb3JtYXRcclxuICAgICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoaXRlbVtjb2x1bW4uZmllbGRdKTtcclxuICAgICAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IERhdGUudG9Gb3JtYXQoZGF0ZSwgJ2RkL01NL3l5eXkgSEg6bW06c3MnKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ3RpbWUnKSB7XHJcbiAgICAgICAgICAgICAgLy8gTuG6v3UgbMOgIHRpbWUgdGjDrCBjb252ZXJ0IHRoZW8gxJHDum5nIGZvcm1hdFxyXG4gICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShpdGVtW2NvbHVtbi5maWVsZF0pO1xyXG4gICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gRGF0ZS50b0Zvcm1hdChkYXRlLCAnSEg6bW06c3MnKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ3ZhbHVlcycpIHtcclxuICAgICAgICAgICAgICAvLyBO4bq/dSBsw6AgdmFsdWVzIHRow6wgbOG6pXkgZ2nDoSB0cuG7iyBj4bunYSB2YWx1ZSDEkcaw4bujYyBjaOG7jW5cclxuICAgICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5ncmlkU2VydmljZS5nZXRWYWx1ZXMoY29sdW1uLCB0aGlzLmtleSk7XHJcbiAgICAgICAgICAgICAgaWYgKGRhdGEub2JqW2NvbHVtbi5vcHRpb24uZGlzcGxheUZpZWxkXSAhPT0gbnVsbCAmJiBkYXRhLm9ialtjb2x1bW4ub3B0aW9uLmRpc3BsYXlGaWVsZF0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBkYXRhLm9ialtjb2x1bW4ub3B0aW9uLmRpc3BsYXlGaWVsZF07XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gaXRlbVtjb2x1bW4uZmllbGRdO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IGl0ZW1bY29sdW1uLmZpZWxkXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIC8vIHRoaXMuZ3JpZE9wdGlvbi5jb2x1bW5zLmZvckVhY2goaGFuZGxlKTtcclxuICAgICAgICAgIGNvbHVtbnMuZm9yRWFjaChoYW5kbGUpO1xyXG4gICAgICAgICAgaXRlbXMucHVzaChvYmopO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwYWdlTnVtYmVyKys7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFmaWxlPy5maWxlUGF0aCkge1xyXG4gICAgICAgIGlmIChpc0NTVikge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5leHBvcnRTZXJ2aWNlLmV4cG9ydENTVih7XHJcbiAgICAgICAgICAgIGNvbHVtbnMsXHJcbiAgICAgICAgICAgIGl0ZW1zLFxyXG4gICAgICAgICAgICBmaWxlTmFtZTogdGhpcy5ncmlkT3B0aW9uPy5leHBvcnQ/LmZpbGVOYW1lXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2hlZXRzOiB7XHJcbiAgICAgICAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgICBpdGVtczogYW55W10sXHJcbiAgICAgICAgICBmaWVsZHM6IHN0cmluZ1tdXHJcbiAgICAgICAgfVtdID0gW107XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5ncmlkT3B0aW9uPy5leHBvcnQ/LnNoZWV0cykpIHtcclxuICAgICAgICAgIGZvciAoY29uc3Qgc2hlZXQgb2YgdGhpcy5ncmlkT3B0aW9uLmV4cG9ydC5zaGVldHMpIHtcclxuICAgICAgICAgICAgaWYgKHNoZWV0Lm5hbWUgJiYgc2hlZXQuaXRlbXMgJiYgc2hlZXQuZmllbGRzKSB7XHJcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2hlZXQuaXRlbXMpKSB7XHJcbiAgICAgICAgICAgICAgICBzaGVldHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHNoZWV0Lm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1zOiBzaGVldC5pdGVtcyxcclxuICAgICAgICAgICAgICAgICAgZmllbGRzOiBzaGVldC5maWVsZHNcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzaGVldHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHNoZWV0Lm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1zOiBhd2FpdCBzaGVldC5pdGVtcygpLFxyXG4gICAgICAgICAgICAgICAgICBmaWVsZHM6IHNoZWV0LmZpZWxkc1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuZXhwb3J0U2VydmljZS5leHBvcnQoe1xyXG4gICAgICAgICAgY29sdW1ucyxcclxuICAgICAgICAgIGl0ZW1zLFxyXG4gICAgICAgICAgZmlsZU5hbWU6IHRoaXMuZ3JpZE9wdGlvbj8uZXhwb3J0Py5maWxlTmFtZSxcclxuICAgICAgICAgIHNoZWV0c1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBhd2FpdCB0aGlzLmV4cG9ydFNlcnZpY2UuZXhwb3J0QnlUZW1wbGF0ZSh7XHJcbiAgICAgICAgZmlsZVBhdGg6IGZpbGUuZmlsZVBhdGgsXHJcbiAgICAgICAgZmlsZU5hbWU6IGZpbGUuZmlsZU5hbWUsXHJcbiAgICAgICAgY29sdW1ucyxcclxuICAgICAgICBpdGVtc1xyXG4gICAgICB9KTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuaXNFeHBvcnRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5leHBvcnRUaXRsZSA9IGBFeHBvcnRgO1xyXG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkV4cG9ydCA9IGFzeW5jIChhcmdzOiB7IGZpbGU6IFNkRXhwb3J0RmlsZSwgY29sdW1uczogU2RFeHBvcnRDb2x1bW5bXSwgaXNDU1Y6IGJvb2xlYW4gfSkgPT4ge1xyXG4gICAgY29uc3QgeyB0cmFuc2xhdGUgfSA9IHRoaXMudHJhbnNsYXRlU2VydmljZTtcclxuICAgIGlmICghYXJncy5pc0NTViAmJiB0aGlzLmdyaWRPcHRpb24uZXhwb3J0Lm1heCAmJiB0aGlzLnRvdGFsID4gdGhpcy5ncmlkT3B0aW9uLmV4cG9ydC5tYXgpIHtcclxuICAgICAgdGhpcy5ub3RpZnlTZXJ2aWNlLmNvbmZpcm0odHJhbnNsYXRlKGBUb3RhbCByb3dzIHJlYWNoIGxpbWl0LCBkbyB5b3Ugd2FudCB0byBleHBvcnQgQ1NWYCkpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIGFyZ3MuaXNDU1YgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuI29uRXhwb3J0KGFyZ3MpO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy4jb25FeHBvcnQoYXJncyk7XHJcbiAgfVxyXG5cclxuICBvbkZpbHRlckNoYW5nZSA9ICgpID0+IHtcclxuICAgIHRoaXMuI3BhZ2luYXRvci5wYWdlSW5kZXggPSAwO1xyXG4gICAgdGhpcy5yZWxvYWQoKTtcclxuICB9XHJcblxyXG4gIG9uRXhwYW5kID0gYXN5bmMgKHJvd0RhdGE6IFNkR3JpZE1hdGVyaWFsUm93RGF0YSkgPT4ge1xyXG4gICAgaWYgKHJvd0RhdGEuaXNFeHBhbmRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHJvd0RhdGEuaXNFeHBhbmRlZCkge1xyXG4gICAgICByb3dEYXRhLmlzRXhwYW5kZWQgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZ3JpZE9wdGlvbj8uc3ViSW5mb3JtYXRpb24/Lm9uRXhwYW5kKHJvd0RhdGEpO1xyXG4gICAgaWYgKCF0aGlzLmdyaWRPcHRpb24uc3ViSW5mb3JtYXRpb24/Lm11bHRpcGxlKSB7XHJcbiAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IGl0ZW0uaXNFeHBhbmRpbmcgPSBpdGVtLmlzRXhwYW5kZWQgPSBmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgcm93RGF0YS5pc0V4cGFuZGluZyA9IHRydWU7XHJcbiAgICAgIGRhdGEudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIHJvd0RhdGEuZXhwYW5kRGV0YWlsID0gcmVzO1xyXG4gICAgICAgIHJvd0RhdGEuaXNFeHBhbmRlZCA9IHRydWU7XHJcbiAgICAgIH0pLmZpbmFsbHkoKCkgPT4gcm93RGF0YS5pc0V4cGFuZGluZyA9IGZhbHNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJvd0RhdGEuZXhwYW5kRGV0YWlsID0gZGF0YTtcclxuICAgICAgcm93RGF0YS5pc0V4cGFuZGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uU2VsZWN0ID0gKHJvd0RhdGE6IFNkR3JpZE1hdGVyaWFsUm93RGF0YSkgPT4ge1xyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbi5zZWxlY3Rpb24/LnNpbmdsZSkge1xyXG4gICAgICB0aGlzLml0ZW1zLmZpbHRlcihlID0+IGUgIT09IHJvd0RhdGEpLmZvckVhY2goZSA9PiBlLmlzU2VsZWN0ZWQgPSBmYWxzZSk7XHJcbiAgICAgIHRoaXMuI3VwZGF0ZVNlbGVjdGVkSXRlbXMoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncmlkT3B0aW9uLnNlbGVjdGlvbj8ub25TZWxlY3Q/Lihyb3dEYXRhLCB0aGlzLml0ZW1zLmZpbHRlcihlID0+IGUuaXNTZWxlY3RlZCkpO1xyXG4gICAgdGhpcy5pc1NlbGVjdEFsbCA9IHRoaXMuaXRlbXMuZXZlcnkoZSA9PiBlLmlzU2VsZWN0ZWQpO1xyXG4gICAgdGhpcy4jdXBkYXRlU2VsZWN0ZWRJdGVtcygpO1xyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RBbGwgPSAoKSA9PiB7XHJcbiAgICB0aGlzLml0ZW1zPy5mb3JFYWNoKGUgPT4gZS5pc1NlbGVjdGVkID0gdGhpcy5pc1NlbGVjdEFsbCk7XHJcbiAgICB0aGlzLmdyaWRPcHRpb24uc2VsZWN0aW9uPy5vblNlbGVjdEFsbD8uKHRoaXMuaXRlbXMuZmlsdGVyKGUgPT4gZS5pc1NlbGVjdGVkKSk7XHJcbiAgICB0aGlzLiN1cGRhdGVTZWxlY3RlZEl0ZW1zKCk7XHJcbiAgfVxyXG5cclxuICAjdXBkYXRlU2VsZWN0ZWRJdGVtcyA9ICgpID0+IHtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IHRoaXMuaXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pc1NlbGVjdGVkKVxyXG4gICAgICAubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgIGNvbnN0IHtcclxuICAgICAgICAgIGlzU2VsZWN0ZWQsXHJcbiAgICAgICAgICBpc0V4cGFuZGVkLFxyXG4gICAgICAgICAgaXNFeHBhbmRpbmcsXHJcbiAgICAgICAgICBleHBhbmREZXRhaWwsXHJcbiAgICAgICAgICAuLi5yZXN1bHRcclxuICAgICAgICB9ID0gaXRlbTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9KSBhcyBUW107XHJcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBjbGVhckZpbHRlciA9ICgpID0+IHtcclxuICAgIHRoaXMuZ3JpZEZpbHRlcj8ub25DbGVhckZpbHRlcigpO1xyXG4gIH1cclxuXHJcbiAgc2V0RmlsdGVyID0gKGFyZ3M6IHtcclxuICAgIGNvbHVtbkZpbHRlcjogYW55LFxyXG4gICAgZXh0ZXJuYWxGaWx0ZXI6IGFueSxcclxuICAgIGZpbHRlckRlZjogYW55XHJcbiAgfSkgPT4ge1xyXG4gICAgdGhpcy5ncmlkRmlsdGVyPy5zZXRGaWx0ZXIoYXJncyk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
783
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1tYXRlcmlhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiQzovVXNlcnMvbmdoaWF0dDE1L0Rlc2t0b3AvV29ya2luZy8xTUcvbGliLWNvcmUtdWkvcHJvamVjdHMvc2QtY29yZS9ncmlkLW1hdGVyaWFsLyIsInNvdXJjZXMiOlsic3JjL2xpYi9ncmlkLW1hdGVyaWFsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFNBQVMsRUFFVCxRQUFRLEVBQ1IsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsU0FBUyxFQUdULFlBQVksRUFDWixZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBTzdCLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsNEJBQTRCLEVBRTdCLE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFELE9BQU8sRUFBZSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN6RixPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFlBQVksRUFBRSxN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QUFDLDBCQUEwQjsyQkFNMUMsZUFBZSxTQUFDLDRCQUE0QjsyQkFPNUMsZUFBZSxTQUFDLDRCQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIEluamVjdCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgUXVlcnlMaXN0LFxyXG4gIE9uSW5pdCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIENvbnRlbnRDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBNYXRTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XHJcbmltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgKiBhcyB1dWlkIGZyb20gJ3V1aWQnO1xyXG5pbXBvcnQge1xyXG4gIFNkR3JpZE1hdGVyaWFsRmlsdGVyUmVxdWVzdFxyXG59IGZyb20gJy4vbW9kZWxzL2dyaWQtZmlsdGVyLm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBTZEdyaWRNYXRlcmlhbE9wdGlvbiwgU2RHcmlkTWF0ZXJpYWxSb3dEYXRhXHJcbn0gZnJvbSAnLi9tb2RlbHMvZ3JpZC1vcHRpb24ubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIEdSSURfTUFURVJJQUxfQ09ORklHLFxyXG4gIERFRkFVTFRfR1JJRF9NQVRFUklBTF9DT05GSUcsXHJcbiAgSVNkR3JpZE1hdGVyaWFsQ29uZmlndXJhdGlvblxyXG59IGZyb20gJy4vbW9kZWxzL2dyaWQtY29uZmlndXJhdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgaXNPYnNlcnZhYmxlLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFNkTm90aWZ5U2VydmljZSB9IGZyb20gJ0BzZC1hbmd1bGFyL2NvcmUvbm90aWZ5JztcclxuaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AsIG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBTZEdyaWRNYXRlcmlhbENvbHVtbiB9IGZyb20gJy4vbW9kZWxzL2dyaWQtY29sdW1uLm1vZGVsJztcclxuaW1wb3J0IHsgU2RNYXRlcmlhbENlbGxEZWZEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvc2QtbWF0ZXJpYWwtY2VsbC1kZWYuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBtYXAsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBTZEdyaWRGaWx0ZXIgfSBmcm9tICcuL2NvbXBvbmVudHMvZ3JpZC1maWx0ZXIvZ3JpZC1maWx0ZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2RNYXRlcmlhbEZpbHRlckRlZkRpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9zZC1tYXRlcmlhbC1maWx0ZXItZGVmLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNkTWF0ZXJpYWxTdWJJbmZvcm1hdGlvbkRlZkRpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9zZC1tYXRlcmlhbC1zdWItaW5mb3JtYXRpb24tZGVmLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNkTWF0ZXJpYWxGb290ZXJEZWZEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvc2QtbWF0ZXJpYWwtZm9vdGVyLWRlZi5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTZE1hdGVyaWFsRW1wdHlEYXRhRGVmRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL3NkLW1hdGVyaWFsLWVtcHR5LWRhdGEtZGVmLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNkUG9wdXBFeHBvcnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcG9wdXAtZXhwb3J0L3BvcHVwLWV4cG9ydC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTZEV4cG9ydENvbHVtbiwgU2RFeHBvcnRGaWxlLCBTZEV4cG9ydFNlcnZpY2UgfSBmcm9tICdAc2QtYW5ndWxhci9jb3JlL2V4cG9ydCc7XHJcbmltcG9ydCB7IFNkR3JpZENvbmZpZ3VyYXRpb24gfSBmcm9tICcuL21vZGVscy9ncmlkLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IFNkR3JpZENvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9ncmlkLWNvbmZpZ3VyYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFNkR3JpZE1hdGVyaWFsRXhwb3J0Q29sdW1uIH0gZnJvbSAnLi9tb2RlbHMvZ3JpZC1leHBvcnQubW9kZWwnO1xyXG5pbXBvcnQgeyBTZFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAc2QtYW5ndWxhci9jb3JlL3RyYW5zbGF0ZSc7XHJcbmltcG9ydCB7IFNkR3JpZFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2dyaWQuc2VydmljZSc7XHJcbmltcG9ydCB7IFNkUXVpY2tBY3Rpb24gfSBmcm9tICdAc2QtYW5ndWxhci9jb3JlL3F1aWNrLWFjdGlvbic7XHJcbmltcG9ydCB7IFNkR3JpZE1hdGVyaWFsSXRlbSwgU2RJdGVtIH0gZnJvbSAnLi9tb2RlbHMvZ3JpZC5tb2RlbCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NkLWdyaWQtbWF0ZXJpYWwnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ncmlkLW1hdGVyaWFsLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9ncmlkLW1hdGVyaWFsLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignZGV0YWlsRXhwYW5kJywgW1xyXG4gICAgICBzdGF0ZSgnY29sbGFwc2VkJywgc3R5bGUoeyBoZWlnaHQ6ICcwJywgbWluSGVpZ2h0OiAnMCcsIHZpc2liaWxpdHk6ICdoaWRkZW4nIH0pKSxcclxuICAgICAgc3RhdGUoJ2V4cGFuZGVkJywgc3R5bGUoeyBoZWlnaHQ6ICcqJywgdmlzaWJpbGl0eTogJ3Zpc2libGUnIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignZXhwYW5kZWQgPD0+IGNvbGxhcHNlZCcsIGFuaW1hdGUoJzIyNW1zIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKScpKSxcclxuICAgIF0pLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZEdyaWRNYXRlcmlhbDxUID0gYW55PiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBrZXkgPSB1dWlkLnY0KCk7XHJcbiAgZ3JpZENvbmZpZ3VyYXRpb25PYnNlcnZlcjogT2JzZXJ2YWJsZTxTZEdyaWRDb25maWd1cmF0aW9uPjtcclxuICBncmlkRmlsdGVyOiBTZEdyaWRGaWx0ZXI7XHJcbiAgQFZpZXdDaGlsZChTZFF1aWNrQWN0aW9uKSBxdWlja0FjdGlvbjogU2RRdWlja0FjdGlvbjtcclxuICBAVmlld0NoaWxkKFNkR3JpZEZpbHRlcikgc2V0IF9ncmlkRmlsdGVyKGdyaWRGaWx0ZXI6IFNkR3JpZEZpbHRlcikge1xyXG4gICAgaWYgKGdyaWRGaWx0ZXIgJiYgdGhpcy5ncmlkRmlsdGVyICE9PSBncmlkRmlsdGVyKSB7XHJcbiAgICAgIHRoaXMuZ3JpZEZpbHRlciA9IGdyaWRGaWx0ZXI7XHJcbiAgICAgIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQoZ3JpZEZpbHRlci5maWx0ZXJDaGFuZ2UucGlwZShcclxuICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcclxuICAgICAgICBtYXAoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy4jcGFnaW5hdG9yLnBhZ2VJbmRleCA9IDA7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy4jZ2V0RmlsdGVyKCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKHRoaXMuI2xvYWQpXHJcbiAgICAgICkuc3Vic2NyaWJlKHRoaXMuI3JlbmRlcikpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IG9wdGlvbihvcHRpb246IFNkR3JpZE1hdGVyaWFsT3B0aW9uKSB7XHJcbiAgICBpZiAob3B0aW9uKSB7XHJcbiAgICAgIG9wdGlvbiA9IHRoaXMuI2luaXRDb25maWd1cmF0aW9uKG9wdGlvbik7XHJcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbiA9IG9wdGlvbjtcclxuICAgICAgdGhpcy4jb3B0aW9uQ2hhbmdlcy5lbWl0KCk7XHJcbiAgICAgIG9wdGlvbj8uY29sdW1ucz8uZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgIGlmKGNvbC5maWx0ZXI/LmRlZmF1bHQpIHtcclxuICAgICAgICAgIHRoaXMuY29sdW1uRmlsdGVyW2NvbC5maWVsZF0gPSBjb2wuZmlsdGVyLmRlZmF1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuZ3JpZENvbmZpZ3VyYXRpb25TZXJ2aWNlLmluaXQodGhpcy5rZXksIHRoaXMuZ3JpZE9wdGlvbik7XHJcbiAgICAgIHRoaXMuZ3JpZENvbmZpZ3VyYXRpb25PYnNlcnZlciA9IGNvbmZpZ3VyYXRpb24ub2JzZXJ2ZXI7XHJcbiAgICAgIGNvbmZpZ3VyYXRpb24ubG9hZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ3JpZE9wdGlvbjogU2RHcmlkTWF0ZXJpYWxPcHRpb247XHJcbiAgbG9jYWxJdGVtczogYW55W10gPSBbXTtcclxuICBpdGVtczogU2RHcmlkTWF0ZXJpYWxSb3dEYXRhW10gPSBbXTtcclxuICBzZWxlY3RlZEl0ZW1zOiBUW10gPSBbXTtcclxuICB0b3RhbDogbnVtYmVyO1xyXG5cclxuICAvLyBMb2FkaW5nXHJcbiAgaXNMb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gIC8vIFBhZ2luYXRlXHJcbiAgaXNIaWRkZW5QYWdpbmF0b3IgPSBmYWxzZTtcclxuICAjcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XHJcbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHNldCBwYWdpbmF0b3IocGFnaW5hdG9yOiBNYXRQYWdpbmF0b3IpIHtcclxuICAgIGlmIChwYWdpbmF0b3IgJiYgdGhpcy4jcGFnaW5hdG9yICE9PSBwYWdpbmF0b3IpIHtcclxuICAgICAgdGhpcy4jcGFnaW5hdG9yID0gcGFnaW5hdG9yO1xyXG4gICAgICB0aGlzLiNzdWJzY3JpcHRpb24uYWRkKHBhZ2luYXRvci5wYWdlLnBpcGUoXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDIwMCksXHJcbiAgICAgICAgbWFwKHRoaXMuI2dldEZpbHRlciksXHJcbiAgICAgICAgc3dpdGNoTWFwKHRoaXMuI2xvYWQpXHJcbiAgICAgICkuc3Vic2NyaWJlKHRoaXMuI3JlbmRlcikpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gU29ydGluZ1xyXG4gICNzb3J0OiBNYXRTb3J0O1xyXG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc2V0IHNvcnQoc29ydDogTWF0U29ydCkge1xyXG4gICAgaWYgKHNvcnQgJiYgdGhpcy4jc29ydCAhPT0gc29ydCkge1xyXG4gICAgICB0aGlzLiNzb3J0ID0gc29ydDtcclxuICAgICAgdGhpcy4jc3Vic2NyaXB0aW9uLmFkZChzb3J0LnNvcnRDaGFuZ2UucGlwZShcclxuICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcclxuICAgICAgICBtYXAodGhpcy4jZ2V0RmlsdGVyKSxcclxuICAgICAgICBzd2l0Y2hNYXAodGhpcy4jbG9hZClcclxuICAgICAgKS5zdWJzY3JpYmUodGhpcy4jcmVuZGVyKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBFeHBvcnRcclxuICBAVmlld0NoaWxkKFNkUG9wdXBFeHBvcnQpIHNkUG9wdXBFeHBvcnQ6IFNkUG9wdXBFeHBvcnQ7XHJcblxyXG4gIC8vIFN1YiBJbmZvcm1hdGlvblxyXG4gIEBDb250ZW50Q2hpbGQoU2RNYXRlcmlhbFN1YkluZm9ybWF0aW9uRGVmRGlyZWN0aXZlKSBzZFN1YkluZm9ybWF0aW9uOiBTZE1hdGVyaWFsU3ViSW5mb3JtYXRpb25EZWZEaXJlY3RpdmU7XHJcblxyXG4gIC8vIEVtcHR5IERhdGFcclxuICBAQ29udGVudENoaWxkKFNkTWF0ZXJpYWxFbXB0eURhdGFEZWZEaXJlY3RpdmUpIHNkRW1wdHlEYXRhOiBTZE1hdGVyaWFsRW1wdHlEYXRhRGVmRGlyZWN0aXZlO1xyXG5cclxuICAvLyBDZWxsIERlZlxyXG4gIEBDb250ZW50Q2hpbGRyZW4oU2RNYXRlcmlhbENlbGxEZWZEaXJlY3RpdmUpIHNkQ2VsbERlZnMgPSBuZXcgUXVlcnlMaXN0PFNkTWF0ZXJpYWxDZWxsRGVmRGlyZWN0aXZlPigpO1xyXG4gIGNlbGxEZWY6IHtcclxuICAgIFtjb2x1bW46IHN0cmluZ106IFNkTWF0ZXJpYWxDZWxsRGVmRGlyZWN0aXZlXHJcbiAgfSA9IHt9O1xyXG5cclxuICAvLyBGb290ZXIgRGVmXHJcbiAgQENvbnRlbnRDaGlsZHJlbihTZE1hdGVyaWFsRm9vdGVyRGVmRGlyZWN0aXZlKSBzZEZvb3RlckRlZnMgPSBuZXcgUXVlcnlMaXN0PFNkTWF0ZXJpYWxGb290ZXJEZWZEaXJlY3RpdmU+KCk7XHJcbiAgZm9vdGVyRGVmOiB7XHJcbiAgICBbY29sdW1uOiBzdHJpbmddOiBTZE1hdGVyaWFsRm9vdGVyRGVmRGlyZWN0aXZlXHJcbiAgfSA9IHt9O1xyXG4gIGhhc0Zvb3RlciA9IGZhbHNlO1xyXG5cclxuICAvLyBGaWx0ZXIgRGVmXHJcbiAgQENvbnRlbnRDaGlsZHJlbihTZE1hdGVyaWFsRmlsdGVyRGVmRGlyZWN0aXZlKSBzZEZpbHRlckRlZnMgPSBuZXcgUXVlcnlMaXN0PFNkTWF0ZXJpYWxGaWx0ZXJEZWZEaXJlY3RpdmU+KCk7XHJcbiAgZmlsdGVyRGVmczogU2RNYXRlcmlhbEZpbHRlckRlZkRpcmVjdGl2ZVtdID0gW107XHJcblxyXG4gIC8vIEZpbHRlclxyXG4gIGNvbHVtbkZpbHRlcjoge1xyXG4gICAgW2tleTogc3RyaW5nXTogYW55XHJcbiAgfSA9IHt9O1xyXG4gIC8vIFN1YmNyaXB0aW9uXHJcbiAgI3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAjb3B0aW9uQ2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBpc0V4cG9ydGluZyA9IGZhbHNlO1xyXG4gIGlzU2VsZWN0QWxsID0gZmFsc2U7XHJcbiAgZXhwb3J0VGl0bGUgPSAnRXhwb3J0JztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBASW5qZWN0KEdSSURfTUFURVJJQUxfQ09ORklHKSBAT3B0aW9uYWwoKSBwdWJsaWMgY29uZmlndXJhdGlvbjogSVNkR3JpZE1hdGVyaWFsQ29uZmlndXJhdGlvbixcclxuICAgIHByaXZhdGUgZ3JpZENvbmZpZ3VyYXRpb25TZXJ2aWNlOiBTZEdyaWRDb25maWd1cmF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZXhwb3J0U2VydmljZTogU2RFeHBvcnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBub3RpZnlTZXJ2aWNlOiBTZE5vdGlmeVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFNkVHJhbnNsYXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgZ3JpZFNlcnZpY2U6IFNkR3JpZFNlcnZpY2UpIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy4jaW5pdENlbGxEZWYoKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQodGhpcy5zZENlbGxEZWZzLmNoYW5nZXMucGlwZShzdGFydFdpdGgoW10pKS5zdWJzY3JpYmUodGhpcy4jaW5pdENlbGxEZWYpKTtcclxuICAgIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQodGhpcy5zZEZvb3RlckRlZnMuY2hhbmdlcy5waXBlKHN0YXJ0V2l0aChbXSkpLnN1YnNjcmliZSh0aGlzLiNpbml0Rm9vdGVyRGVmKSk7XHJcbiAgICB0aGlzLiNzdWJzY3JpcHRpb24uYWRkKHRoaXMuc2RGaWx0ZXJEZWZzLmNoYW5nZXMucGlwZShzdGFydFdpdGgoW10pKS5zdWJzY3JpYmUodGhpcy4jaW5pdEZpbHRlckRlZikpO1xyXG4gICAgdGhpcy4jc3Vic2NyaXB0aW9uLmFkZCh0aGlzLiNvcHRpb25DaGFuZ2VzLnBpcGUoXHJcbiAgICAgIHN0YXJ0V2l0aCh7fSksXHJcbiAgICAgIGRlYm91bmNlVGltZSgyMDApLFxyXG4gICAgICBtYXAodGhpcy4jZ2V0RmlsdGVyKSxcclxuICAgICAgc3dpdGNoTWFwKHRoaXMuI2xvYWQpXHJcbiAgICApLnN1YnNjcmliZSh0aGlzLiNyZW5kZXIpKTtcclxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy4jc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAjaW5pdENlbGxEZWYgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNlbGxEZWYgPSB7fTtcclxuICAgIGZvciAoY29uc3QgY2VsbERlZiBvZiB0aGlzLnNkQ2VsbERlZnMpIHtcclxuICAgICAgaWYgKGNlbGxEZWYuc2RNYXRlcmlhbENlbGxEZWYpIHtcclxuICAgICAgICB0aGlzLmNlbGxEZWZbY2VsbERlZi5zZE1hdGVyaWFsQ2VsbERlZl0gPSBjZWxsRGVmO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAjaW5pdEZpbHRlckRlZiA9ICgpID0+IHtcclxuICAgIHRoaXMuZmlsdGVyRGVmcyA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBmaWx0ZXJEZWYgb2YgdGhpcy5zZEZpbHRlckRlZnMpIHtcclxuICAgICAgdGhpcy5maWx0ZXJEZWZzLnB1c2goZmlsdGVyRGVmKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICNpbml0Rm9vdGVyRGVmID0gKCkgPT4ge1xyXG4gICAgdGhpcy5mb290ZXJEZWYgPSB7fTtcclxuICAgIHRoaXMuaGFzRm9vdGVyID0gZmFsc2U7XHJcbiAgICBmb3IgKGNvbnN0IGZvb3RlckRlZiBvZiB0aGlzLnNkRm9vdGVyRGVmcykge1xyXG4gICAgICBpZiAoZm9vdGVyRGVmLnNkTWF0ZXJpYWxGb290ZXJEZWYpIHtcclxuICAgICAgICB0aGlzLmhhc0Zvb3RlciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5mb290ZXJEZWZbZm9vdGVyRGVmLnNkTWF0ZXJpYWxGb290ZXJEZWZdID0gZm9vdGVyRGVmO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAjZmlsdGVyRXhwb3J0SW5mbyA9IChwYWdlTnVtYmVyOiBudW1iZXIsIHBhZ2VTaXplOiBudW1iZXIpOiBTZEdyaWRNYXRlcmlhbEZpbHRlclJlcXVlc3QgPT4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmF3Q29sdW1uRmlsdGVyOiAodGhpcy5ncmlkT3B0aW9uPy5maWx0ZXI/LmlubGluZUNvbHVtbiA/IHRoaXMuY29sdW1uRmlsdGVyIDogdGhpcy5ncmlkRmlsdGVyPy5jb2x1bW5GaWx0ZXIpIHx8IHt9LFxyXG4gICAgICByYXdFeHRlcm5hbEZpbHRlcjogdGhpcy5ncmlkRmlsdGVyPy5leHRlcm5hbEZpbHRlciB8fCB7fSxcclxuICAgICAgcmF3RmlsdGVyRGVmOiB0aGlzLmdyaWRGaWx0ZXI/LmZpbHRlckRlZiB8fCB7fSxcclxuICAgICAgb3JkZXJCeTogdGhpcy4jc29ydD8uYWN0aXZlIHx8ICcnLFxyXG4gICAgICBvcmRlckRpcmVjdGlvbjogdGhpcy4jc29ydD8uZGlyZWN0aW9uIHx8ICcnLFxyXG4gICAgICBwYWdlTnVtYmVyLFxyXG4gICAgICBwYWdlU2l6ZSxcclxuICAgICAgaXNFeHBvcnRlZDogdHJ1ZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gICNpbml0Q29uZmlndXJhdGlvbiA9IChvcHRpb246IFNkR3JpZE1hdGVyaWFsT3B0aW9uKSA9PiB7XHJcbiAgICBvcHRpb24ucGFnaW5hdGUgPSB7XHJcbiAgICAgIGhpZGRlbjogb3B0aW9uPy5wYWdpbmF0ZT8uaGlkZGVuLFxyXG4gICAgICBwYWdlU2l6ZTogb3B0aW9uPy5wYWdpbmF0ZT8ucGFnZVNpemUgPz8gdGhpcy5jb25maWd1cmF0aW9uPy5wYWdpbmF0ZT8ucGFnZVNpemUgPz8gREVGQVVMVF9HUklEX01BVEVSSUFMX0NPTkZJRy5wYWdpbmF0ZT8ucGFnZVNpemUsXHJcbiAgICAgIHBhZ2VzOiBvcHRpb24/LnBhZ2luYXRlPy5wYWdlcyA/PyB0aGlzLmNvbmZpZ3VyYXRpb24/LnBhZ2luYXRlPy5wYWdlcyA/PyBERUZBVUxUX0dSSURfTUFURVJJQUxfQ09ORklHLnBhZ2luYXRlPy5wYWdlcyxcclxuICAgICAgc2hvd0ZpcnN0TGFzdEJ1dHRvbnM6IG9wdGlvbj8ucGFnaW5hdGU/LnNob3dGaXJzdExhc3RCdXR0b25zID8/IGZhbHNlXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG9wdGlvbjtcclxuICB9XHJcblxyXG4gICNmaWx0ZXJMb2NhbCA9IChsb2NhbEl0ZW1zOiBhbnlbXSwgZmlsdGVySW5mbzogU2RHcmlkTWF0ZXJpYWxGaWx0ZXJSZXF1ZXN0KSA9PiB7XHJcbiAgICBjb25zdCB7IGNvbHVtbnMgfSA9IHRoaXMuZ3JpZE9wdGlvbjtcclxuICAgIGNvbnN0IGl0ZW1zID0gbG9jYWxJdGVtcy5maWx0ZXIoaXRlbSA9PiB7XHJcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcclxuICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZTogc3RyaW5nID0gKGZpbHRlckluZm8ucmF3Q29sdW1uRmlsdGVyW2NvbHVtbi5maWVsZF0gfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgY29uc3QgY29sdW1uVmFsdWU6IHN0cmluZyA9IChpdGVtW2NvbHVtbi5maWVsZF0gfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKGZpbHRlclZhbHVlKSB7XHJcbiAgICAgICAgICBpZiAoIWNvbHVtblZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgaWYgKGNvbHVtblZhbHVlLmluZGV4T2YoZmlsdGVyVmFsdWUpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgICAgY29uc3QgZlZhbHVlID0gK2ZpbHRlclZhbHVlLnJlcGxhY2UoJz49JywgJycpLnJlcGxhY2UoJzw9JywgJycpLnJlcGxhY2UoJz4nLCAnJykucmVwbGFjZSgnPCcsICcnKTtcclxuICAgICAgICAgICAgY29uc3QgY1ZhbHVlID0gK2NvbHVtblZhbHVlO1xyXG4gICAgICAgICAgICBpZiAoZlZhbHVlIHx8IGZWYWx1ZSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIGlmICghY1ZhbHVlICYmIGNWYWx1ZSAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUuaW5kZXhPZignPj0nKSA+IC0xICYmIGNWYWx1ZSA8IGZWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyVmFsdWUuaW5kZXhPZignPD0nKSA+IC0xICYmIGNWYWx1ZSA+IGZWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyVmFsdWUuaW5kZXhPZignPCcpID4gLTEgJiYgY1ZhbHVlID49IGZWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyVmFsdWUuaW5kZXhPZignPicpID4gLTEgJiYgY1ZhbHVlIDw9IGZWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY1ZhbHVlICE9PSBmVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICdib29sJykge1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUgPT09ICcxJyAmJiBjb2x1bW5WYWx1ZSAhPT0gJzEnICYmIGNvbHVtblZhbHVlICE9PSAndHJ1ZScpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyVmFsdWUgPT09ICcwJyAmJiBjb2x1bW5WYWx1ZSAhPT0gJzAnICYmIGNvbHVtblZhbHVlICE9PSAnZmFsc2UnKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAnZGF0ZScgfHwgY29sdW1uLnR5cGUgPT09ICdkYXRldGltZScpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IERhdGUudG9Gb3JtYXQoZmlsdGVyVmFsdWUsICdNTS95eXl5L2RkJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZyb21EYXRlID0gbmV3IERhdGUoZGF0ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvRGF0ZSA9IG5ldyBEYXRlKGRhdGUpO1xyXG4gICAgICAgICAgICB0b0RhdGUuc2V0RGF0ZSh0b0RhdGUuZ2V0RGF0ZSgpICsgMSk7XHJcbiAgICAgICAgICAgIGlmIChuZXcgRGF0ZShjb2x1bW5WYWx1ZSkuZ2V0VGltZSgpIDwgZnJvbURhdGUuZ2V0VGltZSgpIHx8IG5ldyBEYXRlKGNvbHVtblZhbHVlKS5nZXRUaW1lKCkgPj0gdG9EYXRlLmdldFRpbWUoKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0pO1xyXG4gICAgLy8gU29ydFxyXG4gICAgaWYgKGZpbHRlckluZm8ub3JkZXJCeSAmJiBmaWx0ZXJJbmZvLm9yZGVyRGlyZWN0aW9uKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbHVtbnMuZmluZChlID0+IGUuZmllbGQgPT09IGZpbHRlckluZm8ub3JkZXJCeSk7XHJcbiAgICAgIGlmIChjb2x1bW4pIHtcclxuICAgICAgICBjb25zdCB7IHR5cGUsIGZpZWxkIH0gPSBjb2x1bW47XHJcbiAgICAgICAgaXRlbXMuc29ydCgoY3VycmVudCwgbmV4dCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoY3VycmVudFtmaWVsZF0gfHwgMCkgLSAobmV4dFtmaWVsZF0gfHwgMCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodHlwZSA9PT0gJ2RhdGUnIHx8IHR5cGUgPT09ICdkYXRldGltZScgfHwgdHlwZSA9PT0gJ3RpbWUnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGQxID0gbmV3IERhdGUoY3VycmVudFtmaWVsZF0gfHwgJycpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgY29uc3QgZDIgPSBuZXcgRGF0ZShjdXJyZW50W2ZpZWxkXSB8fCAnJykuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZDEgLSBkMjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnN0IHMxID0gKGN1cnJlbnRbZmllbGRdIHx8ICcnKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgY29uc3QgczIgPSAobmV4dFtmaWVsZF0gfHwgJycpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICBpZiAoczEgPiBzMikge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChzMSA8IHMyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChmaWx0ZXJJbmZvLm9yZGVyRGlyZWN0aW9uID09PSAnZGVzYycpIHtcclxuICAgICAgICAgIGl0ZW1zLnJldmVyc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGl0ZW1zOiBpdGVtcy5maWx0ZXIoKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcGFnZUluZGV4ID0gdGhpcy4jcGFnaW5hdG9yPy5wYWdlSW5kZXggfHwgMDtcclxuICAgICAgICBjb25zdCBwYWdlU2l6ZSA9IHRoaXMuI3BhZ2luYXRvcj8ucGFnZVNpemUgfHwgdGhpcy5ncmlkT3B0aW9uPy5wYWdpbmF0ZT8ucGFnZVNpemUgfHwgNTA7XHJcbiAgICAgICAgcmV0dXJuIGluZGV4ID49IHBhZ2VJbmRleCAqIHBhZ2VTaXplXHJcbiAgICAgICAgICAmJiBpbmRleCA8IChwYWdlSW5kZXggKyAxKSAqIHBhZ2VTaXplO1xyXG4gICAgICB9KSxcclxuICAgICAgdG90YWw6IGl0ZW1zLmxlbmd0aFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gICNnZXRGaWx0ZXIgPSAoKTogU2RHcmlkTWF0ZXJpYWxGaWx0ZXJSZXF1ZXN0ID0+ICh7XHJcbiAgICByYXdDb2x1bW5GaWx0ZXI6ICh0aGlzLmdyaWRPcHRpb24/LmZpbHRlcj8uaW5saW5lQ29sdW1uID8gdGhpcy5jb2x1bW5GaWx0ZXIgOiB0aGlzLmdyaWRGaWx0ZXI/LmNvbHVtbkZpbHRlcikgfHwge30sXHJcbiAgICByYXdFeHRlcm5hbEZpbHRlcjogdGhpcy5ncmlkRmlsdGVyPy5leHRlcm5hbEZpbHRlciB8fCB7fSxcclxuICAgIHJhd0ZpbHRlckRlZjogdGhpcy5ncmlkRmlsdGVyPy5maWx0ZXJEZWYgfHwge30sXHJcbiAgICBvcmRlckJ5OiB0aGlzLiNzb3J0Py5hY3RpdmUgfHwgJycsXHJcbiAgICBvcmRlckRpcmVjdGlvbjogdGhpcy4jc29ydD8uZGlyZWN0aW9uIHx8ICcnLFxyXG4gICAgcGFnZU51bWJlcjogdGhpcy4jcGFnaW5hdG9yPy5wYWdlSW5kZXggfHwgMCxcclxuICAgIHBhZ2VTaXplOiB0aGlzLiNwYWdpbmF0b3I/LnBhZ2VTaXplIHx8IHRoaXMuZ3JpZE9wdGlvbj8ucGFnaW5hdGU/LnBhZ2VTaXplIHx8IDUwXHJcbiAgfSlcclxuXHJcbiAgI2xvYWQgPSBhc3luYyAoZmlsdGVyUmVxOiBTZEdyaWRNYXRlcmlhbEZpbHRlclJlcXVlc3QpOiBQcm9taXNlPHsgaXRlbXM6IGFueVtdLCB0b3RhbDogbnVtYmVyIH0+ID0+IHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLmdyaWRPcHRpb24udHlwZSA9PT0gJ3NlcnZlcicpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5ncmlkT3B0aW9uLml0ZW1zKGZpbHRlclJlcSk7XHJcbiAgICAgICAgaWYgKGlzT2JzZXJ2YWJsZShyZXN1bHQpKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhd2FpdCByZXN1bHQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZ3JpZE9wdGlvbi5pdGVtcygpO1xyXG4gICAgICAgIGlmIChyZXN1bHRzIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgdGhpcy5sb2NhbEl0ZW1zID0gYXdhaXQgcmVzdWx0cztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5sb2NhbEl0ZW1zID0gcmVzdWx0cztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZpbHRlckxvY2FsKHRoaXMubG9jYWxJdGVtcywgZmlsdGVyUmVxKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5ub3RpZnlTZXJ2aWNlLmhhbmRsZS5lcnJvcihlcnJvcik7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAjcmVuZGVyID0gYXN5bmMgKGFyZ3M6IHsgaXRlbXM6IGFueVtdLCB0b3RhbDogbnVtYmVyIH0pID0+IHtcclxuICAgIHRoaXMuaXRlbXMgPSBhcmdzPy5pdGVtcyB8fCBbXTtcclxuICAgIHRoaXMudG90YWwgPSBhcmdzPy50b3RhbCB8fCAwO1xyXG4gICAgLy8gdGhpcy5pc0hpZGRlblBhZ2luYXRvciA9IHRoaXMuZmlsdGVySW5mby5wYWdlTnVtYmVyID09PSAwICYmIHRoaXMudG90YWwgPD0gdGhpcy5maWx0ZXJJbmZvLnBhZ2VTaXplO1xyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5vcmlnaW5JdGVtID0geyAuLi5pdGVtIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5ncmlkT3B0aW9uPy5yZWxvYWQ/Lm9uUmVsb2FkPy4odGhpcy5pdGVtcyk7XHJcbiAgICB0aGlzLmlzU2VsZWN0QWxsID0gdGhpcy5pdGVtcy5ldmVyeShlID0+IGUuaXNTZWxlY3RlZCk7XHJcbiAgICB0aGlzLiN1cGRhdGVTZWxlY3RlZEl0ZW1zKCk7XHJcbiAgfVxyXG5cclxuICByZWxvYWQgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy4jbG9hZCh0aGlzLiNnZXRGaWx0ZXIoKSk7XHJcbiAgICB0aGlzLiNyZW5kZXIoZGF0YSk7XHJcbiAgfVxyXG5cclxuICAjZXhwb3J0ZWRJdGVtcyA9IGFzeW5jIChwYWdlTnVtYmVyOiBudW1iZXIgPSAwLCBwYWdlU2l6ZTogbnVtYmVyID0gMTAwMDApID0+IHtcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb24uZXhwb3J0Py5pdGVtcykge1xyXG4gICAgICAvLyBjb25zdCBleHBvcnRlZEl0ZW1zID0gdGhpcy5ncmlkT3B0aW9uLmV4cG9ydD8uaXRlbXModGhpcy4jZmlsdGVyRXhwb3J0SW5mbyhwYWdlTnVtYmVyLCBwYWdlU2l6ZSkpO1xyXG4gICAgICBsZXQgcmVzdWx0ID0gdGhpcy5ncmlkT3B0aW9uLmV4cG9ydD8uaXRlbXModGhpcy4jZmlsdGVyRXhwb3J0SW5mbyhwYWdlTnVtYmVyLCBwYWdlU2l6ZSkpO1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaXNPYnNlcnZhYmxlPGFueVtdPihyZXN1bHQpKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnRvUHJvbWlzZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpc09ic2VydmFibGU8eyBpdGVtczogYW55W10sIHRvdGFsOiBudW1iZXIgfT4ocmVzdWx0KSkge1xyXG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC50b1Byb21pc2UoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdWx0O1xyXG4gICAgICAvLyBpZiAoZXhwb3J0ZWRJdGVtcyBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgLy8gICByZXR1cm4gYXdhaXQgZXhwb3J0ZWRJdGVtcztcclxuICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgLy8gICByZXR1cm4gZXhwb3J0ZWRJdGVtcztcclxuICAgICAgLy8gfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgZmlsdGVySW5mbyA9IHRoaXMuI2ZpbHRlckV4cG9ydEluZm8ocGFnZU51bWJlciwgcGFnZVNpemUpO1xyXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLnR5cGUgPT09ICdzZXJ2ZXInKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuZ3JpZE9wdGlvbi5pdGVtcyhmaWx0ZXJJbmZvKTtcclxuICAgICAgICBpZiAoaXNPYnNlcnZhYmxlKHJlc3VsdCkpIHtcclxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC50b1Byb21pc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3VsdDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgZXhwb3J0ZWRJdGVtczogYW55W10gPSBbXTtcclxuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmdyaWRPcHRpb24uaXRlbXMpID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICBjb25zdCByZXN1bHRzID0gdGhpcy5ncmlkT3B0aW9uLml0ZW1zKCk7XHJcbiAgICAgICAgICBpZiAocmVzdWx0cyBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgZXhwb3J0ZWRJdGVtcyA9IGF3YWl0IHJlc3VsdHM7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBleHBvcnRlZEl0ZW1zID0gcmVzdWx0cztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZXhwb3J0ZWRJdGVtcyA9IHRoaXMuZ3JpZE9wdGlvbi5pdGVtcztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZpbHRlckxvY2FsKGV4cG9ydGVkSXRlbXMsIGZpbHRlckluZm8pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxzdHJpbmdbXT4sIGNvbHVtbnM6IHN0cmluZ1tdKSB7XHJcbiAgICBtb3ZlSXRlbUluQXJyYXkoY29sdW1ucywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcclxuICB9XHJcblxyXG4gICNhbGxDb2x1bW5zID0gKCk6IFNkR3JpZE1hdGVyaWFsQ29sdW1uW10gPT4ge1xyXG4gICAgY29uc3QgY29sdW1uczogU2RHcmlkTWF0ZXJpYWxDb2x1bW5bXSA9IFtdO1xyXG4gICAgdGhpcy5ncmlkT3B0aW9uLmNvbHVtbnMuZmlsdGVyKGUgPT4gIWUuZXhwb3J0Py5kaXNhYmxlZCkuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT09ICdpbWFnZScpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbHVtbi50eXBlID09PSAnY2hpbGRyZW4nKSB7XHJcbiAgICAgICAgY29sdW1uLmNoaWxkcmVuPy5maWx0ZXIoZSA9PiAhZS5leHBvcnQ/LmRpc2FibGVkKS5mb3JFYWNoKGNoaWxkQ29sdW1uID0+IHtcclxuICAgICAgICAgIGlmIChjaGlsZENvbHVtbi50eXBlID09PSAnaW1hZ2UnKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbHVtbnMucHVzaChjaGlsZENvbHVtbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gJ2NoaWxkcmVuLWNvbCcpIHtcclxuICAgICAgICBjb2x1bW4uY2hpbGRyZW4/LmZpbHRlcihlID0+ICFlLmV4cG9ydD8uZGlzYWJsZWQpLmZvckVhY2goY2hpbGRDb2x1bW4gPT4ge1xyXG4gICAgICAgICAgaWYgKGNoaWxkQ29sdW1uLnR5cGUgPT09ICdpbWFnZScpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29sdW1ucy5wdXNoKGNoaWxkQ29sdW1uKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29sdW1ucy5wdXNoKGNvbHVtbik7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgI2FsbEV4cG9ydGVkQ29sdW1ucyA9ICgpOiBTZEdyaWRNYXRlcmlhbEV4cG9ydENvbHVtbltdID0+IHtcclxuICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb24uZXhwb3J0Py5jb2x1bW5zPy5maWx0ZXIoZSA9PiAhZS5leHBvcnQ/LmRpc2FibGVkKSB8fCBbXTtcclxuICB9XHJcblxyXG4gICNvbkV4cG9ydCA9IGFzeW5jIChhcmdzOiB7IGZpbGU6IFNkRXhwb3J0RmlsZSwgY29sdW1uczogU2RFeHBvcnRDb2x1bW5bXSwgaXNDU1Y6IGJvb2xlYW4gfSkgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgeyBmaWxlLCBjb2x1bW5zLCBpc0NTViB9ID0gYXJncztcclxuICAgICAgY29uc3QgcGFnZVNpemUgPSB0aGlzLmdyaWRPcHRpb24/LmV4cG9ydD8ubWF4SXRlbXNQZXJSZXF1ZXN0IHx8IDEwMDA7XHJcbiAgICAgIGxldCB0b3RhbCA9IHRoaXMudG90YWw7XHJcbiAgICAgIGxldCBwYWdlTnVtYmVyID0gMDtcclxuICAgICAgbGV0IGV4cG9ydEl0ZW1zID0gW107XHJcbiAgICAgIHRoaXMuaXNFeHBvcnRpbmcgPSB0cnVlO1xyXG4gICAgICBjb25zdCBpdGVtczogYW55W10gPSBbXTtcclxuICAgICAgd2hpbGUgKHBhZ2VOdW1iZXIgKiBwYWdlU2l6ZSA8IHRvdGFsKSB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy4jZXhwb3J0ZWRJdGVtcyhwYWdlTnVtYmVyLCBwYWdlU2l6ZSk7XHJcbiAgICAgICAgaWYgKCdpdGVtcycgaW4gcmVzKSB7XHJcbiAgICAgICAgICBleHBvcnRJdGVtcyA9IHJlcy5pdGVtcztcclxuICAgICAgICAgIHRvdGFsID0gcmVzLnRvdGFsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBleHBvcnRJdGVtcyA9IHJlcztcclxuICAgICAgICAgIC8vIHRvdGFsID0gZXhwb3J0SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLmV4cG9ydD8ubWFwcGluZykge1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZ3JpZE9wdGlvbi5leHBvcnQubWFwcGluZyhleHBvcnRJdGVtcyk7XHJcbiAgICAgICAgICBpZiAocmVzdWx0cyBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgZXhwb3J0SXRlbXMgPSBhd2FpdCByZXN1bHRzO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZXhwb3J0SXRlbXMgPSByZXN1bHRzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdG90YWxQYWdlID0gdG90YWwgLyBwYWdlU2l6ZTtcclxuICAgICAgICBjb25zdCBwZXJjZW50ID0gTWF0aC5yb3VuZChwYWdlTnVtYmVyICogMTAwLjAgLyB0b3RhbFBhZ2UpO1xyXG4gICAgICAgIHRoaXMuZXhwb3J0VGl0bGUgPSBgRXhwb3J0aW5nLi4uJHtwZXJjZW50fSVgO1xyXG4gICAgICAgIGNvbnN0IGFsbENvbHVtbnMgPSB0aGlzLiNhbGxDb2x1bW5zKCk7XHJcbiAgICAgICAgY29uc3QgYWxsRXhwb3J0ZWRDb2x1bW5zID0gdGhpcy4jYWxsRXhwb3J0ZWRDb2x1bW5zKCk7XHJcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGV4cG9ydEl0ZW1zKSB7XHJcbiAgICAgICAgICBjb25zdCBvYmo6IGFueSA9IHt9O1xyXG4gICAgICAgICAgY29uc3QgaGFuZGxlID0gKGV4cG9ydENvbHVtbjogU2RFeHBvcnRDb2x1bW4pID0+IHtcclxuICAgICAgICAgICAgb2JqW2V4cG9ydENvbHVtbi5maWVsZF0gPSBpdGVtW2V4cG9ydENvbHVtbi5maWVsZF07XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IGFsbENvbHVtbnMuZmluZChlID0+IGUuZmllbGQgPT09IGV4cG9ydENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGV4cG9ydGVkQ29sdW1uID0gYWxsRXhwb3J0ZWRDb2x1bW5zLmZpbmQoZSA9PiBlLmZpZWxkID09PSBleHBvcnRDb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICBpZiAoZXhwb3J0ZWRDb2x1bW4/LnRyYW5zZm9ybSkge1xyXG4gICAgICAgICAgICAgIG9ialtleHBvcnRlZENvbHVtbi5maWVsZF0gPSBleHBvcnRlZENvbHVtbi50cmFuc2Zvcm0oaXRlbVtleHBvcnRlZENvbHVtbi5maWVsZF0sIGl0ZW0pO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWNvbHVtbikge1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09ICdjaGlsZHJlbicgfHwgY29sdW1uLnR5cGUgPT09ICdjaGlsZHJlbi1jb2wnKSB7XHJcbiAgICAgICAgICAgICAgY29sdW1uPy5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkQ29sdW1uID0+IGhhbmRsZShjaGlsZENvbHVtbikpO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWNvbHVtbnMuc29tZShlID0+IGUuZmllbGQgPT09IGNvbHVtbi5maWVsZCkpIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNvbHVtbi50cmFuc2Zvcm0pIHtcclxuICAgICAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IGNvbHVtbi50cmFuc2Zvcm0oaXRlbVtjb2x1bW4uZmllbGRdLCBpdGVtKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtW2NvbHVtbi5maWVsZF0gPT09IHVuZGVmaW5lZCB8fCBpdGVtW2NvbHVtbi5maWVsZF0gPT09IG51bGwgfHwgaXRlbVtjb2x1bW4uZmllbGRdID09PSAnJykge1xyXG4gICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gJyc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICdzdHJpbmcnIHx8IGNvbHVtbi50eXBlID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICAgIC8vIE7hur91IGNlbGwgbMOgIHN0cmluZyBob+G6t2MgbnVtYmVyIHRow6wgZ8OhbiBi4bqxbmcgY2jDrW5oIG7Ds1xyXG4gICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gaXRlbVtjb2x1bW4uZmllbGRdO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAnYm9vbCcpIHtcclxuICAgICAgICAgICAgICAvLyBO4bq/dSBsw6AgYm9vbCB0aMOsIGfDoW4gYuG6sW5nIGdpw6EgdHLhu4sgdHJ1ZVZhbHVlIHbDoCBmYWxzZVZhbHVlIChu4bq/dSBjw7MpLCBt4bq3YyDEkeG7i25oIGzDoCBUUlVFL0ZBTFNFXHJcbiAgICAgICAgICAgICAgaWYgKGl0ZW1bY29sdW1uLmZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBjb2x1bW4ub3B0aW9uPy5kaXNwbGF5T25UcnVlIHx8ICdUcnVlJztcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBjb2x1bW4ub3B0aW9uPy5kaXNwbGF5T25GYWxzZSB8fCAnRmFsc2UnO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ2RhdGUnKSB7XHJcbiAgICAgICAgICAgICAgLy8gTuG6v3UgbMOgIGRhdGUgdGjDrCBjb252ZXJ0IHRoZW8gxJHDum5nIGZvcm1hdFxyXG4gICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShpdGVtW2NvbHVtbi5maWVsZF0pO1xyXG4gICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gRGF0ZS50b0Zvcm1hdChkYXRlLCAnZGQvTU0veXl5eScpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICAgICAgLy8gTuG6v3UgbMOgIGRhdGV0aW1lIHRow6wgY29udmVydCB0aGVvIMSRw7puZyBmb3JtYXRcclxuICAgICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoaXRlbVtjb2x1bW4uZmllbGRdKTtcclxuICAgICAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IERhdGUudG9Gb3JtYXQoZGF0ZSwgJ2RkL01NL3l5eXkgSEg6bW06c3MnKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ3RpbWUnKSB7XHJcbiAgICAgICAgICAgICAgLy8gTuG6v3UgbMOgIHRpbWUgdGjDrCBjb252ZXJ0IHRoZW8gxJHDum5nIGZvcm1hdFxyXG4gICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShpdGVtW2NvbHVtbi5maWVsZF0pO1xyXG4gICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gRGF0ZS50b0Zvcm1hdChkYXRlLCAnSEg6bW06c3MnKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ3ZhbHVlcycpIHtcclxuICAgICAgICAgICAgICAvLyBO4bq/dSBsw6AgdmFsdWVzIHRow6wgbOG6pXkgZ2nDoSB0cuG7iyBj4bunYSB2YWx1ZSDEkcaw4bujYyBjaOG7jW5cclxuICAgICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5ncmlkU2VydmljZS5nZXRWYWx1ZXMoY29sdW1uLCB0aGlzLmtleSk7XHJcbiAgICAgICAgICAgICAgaWYgKGRhdGEub2JqW2NvbHVtbi5vcHRpb24uZGlzcGxheUZpZWxkXSAhPT0gbnVsbCAmJiBkYXRhLm9ialtjb2x1bW4ub3B0aW9uLmRpc3BsYXlGaWVsZF0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBkYXRhLm9ialtjb2x1bW4ub3B0aW9uLmRpc3BsYXlGaWVsZF07XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gaXRlbVtjb2x1bW4uZmllbGRdO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IGl0ZW1bY29sdW1uLmZpZWxkXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIC8vIHRoaXMuZ3JpZE9wdGlvbi5jb2x1bW5zLmZvckVhY2goaGFuZGxlKTtcclxuICAgICAgICAgIGNvbHVtbnMuZm9yRWFjaChoYW5kbGUpO1xyXG4gICAgICAgICAgaXRlbXMucHVzaChvYmopO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwYWdlTnVtYmVyKys7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFmaWxlPy5maWxlUGF0aCkge1xyXG4gICAgICAgIGlmIChpc0NTVikge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5leHBvcnRTZXJ2aWNlLmV4cG9ydENTVih7XHJcbiAgICAgICAgICAgIGNvbHVtbnMsXHJcbiAgICAgICAgICAgIGl0ZW1zLFxyXG4gICAgICAgICAgICBmaWxlTmFtZTogdGhpcy5ncmlkT3B0aW9uPy5leHBvcnQ/LmZpbGVOYW1lXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2hlZXRzOiB7XHJcbiAgICAgICAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgICBpdGVtczogYW55W10sXHJcbiAgICAgICAgICBmaWVsZHM6IHN0cmluZ1tdXHJcbiAgICAgICAgfVtdID0gW107XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5ncmlkT3B0aW9uPy5leHBvcnQ/LnNoZWV0cykpIHtcclxuICAgICAgICAgIGZvciAoY29uc3Qgc2hlZXQgb2YgdGhpcy5ncmlkT3B0aW9uLmV4cG9ydC5zaGVldHMpIHtcclxuICAgICAgICAgICAgaWYgKHNoZWV0Lm5hbWUgJiYgc2hlZXQuaXRlbXMgJiYgc2hlZXQuZmllbGRzKSB7XHJcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2hlZXQuaXRlbXMpKSB7XHJcbiAgICAgICAgICAgICAgICBzaGVldHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHNoZWV0Lm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1zOiBzaGVldC5pdGVtcyxcclxuICAgICAgICAgICAgICAgICAgZmllbGRzOiBzaGVldC5maWVsZHNcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzaGVldHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHNoZWV0Lm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1zOiBhd2FpdCBzaGVldC5pdGVtcygpLFxyXG4gICAgICAgICAgICAgICAgICBmaWVsZHM6IHNoZWV0LmZpZWxkc1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuZXhwb3J0U2VydmljZS5leHBvcnQoe1xyXG4gICAgICAgICAgY29sdW1ucyxcclxuICAgICAgICAgIGl0ZW1zLFxyXG4gICAgICAgICAgZmlsZU5hbWU6IHRoaXMuZ3JpZE9wdGlvbj8uZXhwb3J0Py5maWxlTmFtZSxcclxuICAgICAgICAgIHNoZWV0c1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBhd2FpdCB0aGlzLmV4cG9ydFNlcnZpY2UuZXhwb3J0QnlUZW1wbGF0ZSh7XHJcbiAgICAgICAgZmlsZVBhdGg6IGZpbGUuZmlsZVBhdGgsXHJcbiAgICAgICAgZmlsZU5hbWU6IGZpbGUuZmlsZU5hbWUsXHJcbiAgICAgICAgY29sdW1ucyxcclxuICAgICAgICBpdGVtc1xyXG4gICAgICB9KTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuaXNFeHBvcnRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5leHBvcnRUaXRsZSA9IGBFeHBvcnRgO1xyXG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkV4cG9ydCA9IGFzeW5jIChhcmdzOiB7IGZpbGU6IFNkRXhwb3J0RmlsZSwgY29sdW1uczogU2RFeHBvcnRDb2x1bW5bXSwgaXNDU1Y6IGJvb2xlYW4gfSkgPT4ge1xyXG4gICAgY29uc3QgeyB0cmFuc2xhdGUgfSA9IHRoaXMudHJhbnNsYXRlU2VydmljZTtcclxuICAgIGlmICghYXJncy5pc0NTViAmJiB0aGlzLmdyaWRPcHRpb24uZXhwb3J0Lm1heCAmJiB0aGlzLnRvdGFsID4gdGhpcy5ncmlkT3B0aW9uLmV4cG9ydC5tYXgpIHtcclxuICAgICAgdGhpcy5ub3RpZnlTZXJ2aWNlLmNvbmZpcm0odHJhbnNsYXRlKGBUb3RhbCByb3dzIHJlYWNoIGxpbWl0LCBkbyB5b3Ugd2FudCB0byBleHBvcnQgQ1NWYCkpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIGFyZ3MuaXNDU1YgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuI29uRXhwb3J0KGFyZ3MpO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy4jb25FeHBvcnQoYXJncyk7XHJcbiAgfVxyXG5cclxuICBvbkZpbHRlckNoYW5nZSA9ICgpID0+IHtcclxuICAgIHRoaXMuI3BhZ2luYXRvci5wYWdlSW5kZXggPSAwO1xyXG4gICAgdGhpcy5yZWxvYWQoKTtcclxuICB9XHJcblxyXG4gIG9uRXhwYW5kID0gYXN5bmMgKHJvd0RhdGE6IFNkR3JpZE1hdGVyaWFsUm93RGF0YSkgPT4ge1xyXG4gICAgaWYgKHJvd0RhdGEuaXNFeHBhbmRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHJvd0RhdGEuaXNFeHBhbmRlZCkge1xyXG4gICAgICByb3dEYXRhLmlzRXhwYW5kZWQgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZ3JpZE9wdGlvbj8uc3ViSW5mb3JtYXRpb24/Lm9uRXhwYW5kKHJvd0RhdGEpO1xyXG4gICAgaWYgKCF0aGlzLmdyaWRPcHRpb24uc3ViSW5mb3JtYXRpb24/Lm11bHRpcGxlKSB7XHJcbiAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IGl0ZW0uaXNFeHBhbmRpbmcgPSBpdGVtLmlzRXhwYW5kZWQgPSBmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgcm93RGF0YS5pc0V4cGFuZGluZyA9IHRydWU7XHJcbiAgICAgIGRhdGEudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIHJvd0RhdGEuZXhwYW5kRGV0YWlsID0gcmVzO1xyXG4gICAgICAgIHJvd0RhdGEuaXNFeHBhbmRlZCA9IHRydWU7XHJcbiAgICAgIH0pLmZpbmFsbHkoKCkgPT4gcm93RGF0YS5pc0V4cGFuZGluZyA9IGZhbHNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJvd0RhdGEuZXhwYW5kRGV0YWlsID0gZGF0YTtcclxuICAgICAgcm93RGF0YS5pc0V4cGFuZGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uU2VsZWN0ID0gKHJvd0RhdGE6IFNkR3JpZE1hdGVyaWFsUm93RGF0YSkgPT4ge1xyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbi5zZWxlY3Rpb24/LnNpbmdsZSkge1xyXG4gICAgICB0aGlzLml0ZW1zLmZpbHRlcihlID0+IGUgIT09IHJvd0RhdGEpLmZvckVhY2goZSA9PiBlLmlzU2VsZWN0ZWQgPSBmYWxzZSk7XHJcbiAgICAgIHRoaXMuI3VwZGF0ZVNlbGVjdGVkSXRlbXMoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncmlkT3B0aW9uLnNlbGVjdGlvbj8ub25TZWxlY3Q/Lihyb3dEYXRhLCB0aGlzLml0ZW1zLmZpbHRlcihlID0+IGUuaXNTZWxlY3RlZCkpO1xyXG4gICAgdGhpcy5pc1NlbGVjdEFsbCA9IHRoaXMuaXRlbXMuZXZlcnkoZSA9PiBlLmlzU2VsZWN0ZWQpO1xyXG4gICAgdGhpcy4jdXBkYXRlU2VsZWN0ZWRJdGVtcygpO1xyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RBbGwgPSAoKSA9PiB7XHJcbiAgICB0aGlzLml0ZW1zPy5mb3JFYWNoKGUgPT4gZS5pc1NlbGVjdGVkID0gdGhpcy5pc1NlbGVjdEFsbCk7XHJcbiAgICB0aGlzLmdyaWRPcHRpb24uc2VsZWN0aW9uPy5vblNlbGVjdEFsbD8uKHRoaXMuaXRlbXMuZmlsdGVyKGUgPT4gZS5pc1NlbGVjdGVkKSk7XHJcbiAgICB0aGlzLiN1cGRhdGVTZWxlY3RlZEl0ZW1zKCk7XHJcbiAgfVxyXG5cclxuICAjdXBkYXRlU2VsZWN0ZWRJdGVtcyA9ICgpID0+IHtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IHRoaXMuaXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pc1NlbGVjdGVkKVxyXG4gICAgICAubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgIGNvbnN0IHtcclxuICAgICAgICAgIGlzU2VsZWN0ZWQsXHJcbiAgICAgICAgICBpc0V4cGFuZGVkLFxyXG4gICAgICAgICAgaXNFeHBhbmRpbmcsXHJcbiAgICAgICAgICBleHBhbmREZXRhaWwsXHJcbiAgICAgICAgICAuLi5yZXN1bHRcclxuICAgICAgICB9ID0gaXRlbTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9KSBhcyBUW107XHJcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBjbGVhckZpbHRlciA9ICgpID0+IHtcclxuICAgIHRoaXMuZ3JpZEZpbHRlcj8ub25DbGVhckZpbHRlcigpO1xyXG4gIH1cclxuXHJcbiAgc2V0RmlsdGVyID0gKGFyZ3M6IHtcclxuICAgIGNvbHVtbkZpbHRlcjogYW55LFxyXG4gICAgZXh0ZXJuYWxGaWx0ZXI6IGFueSxcclxuICAgIGZpbHRlckRlZjogYW55XHJcbiAgfSkgPT4ge1xyXG4gICAgdGhpcy5ncmlkRmlsdGVyPy5zZXRGaWx0ZXIoYXJncyk7XHJcbiAgfVxyXG5cclxuICAjZ2VuZXJhdGVFZGl0b3JIYW5sZGVyID0gKGl0ZW06IFNkR3JpZE1hdGVyaWFsSXRlbSkgPT4ge1xyXG4gICAgLy8gaXRlbS5lZGl0b3JIYW5kbGVyID0gaXRlbS5lZGl0b3JIYW5kbGVyIHx8IHt9O1xyXG4gICAgLy8gdGhpcy5lZGl0b3JWaXNpYmxlUGlwZS50cmFuc2Zvcm0obnVsbCwgaXRlbSwgdGhpcy5ncmlkT3B0aW9uKTtcclxuICB9XHJcblxyXG4gIG9uQ3JlYXRlID0gKCkgPT4ge1xyXG4gICAgY29uc3QgeyB0eXBlLCBlZGl0b3IsIGNvbHVtbnMgfSA9IHRoaXMuZ3JpZE9wdGlvbjtcclxuICAgIGlmICghZWRpdG9yPy5hZGRhYmxlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGl0ZW06IFNkR3JpZE1hdGVyaWFsSXRlbSA9IHt9O1xyXG4gICAgLy8gR8OhbiBnacOhIHRy4buLIG3hurdjIMSR4buLbmhcclxuICAgIGNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT09ICd2YWx1ZXMnKSB7XHJcbiAgICAgICAgaXRlbVtjb2x1bW4uZmllbGRdID0gJyc7XHJcbiAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICdib29sJykge1xyXG4gICAgICAgIGl0ZW1bY29sdW1uLmZpZWxkXSA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgaXRlbVtjb2x1bW4uZmllbGRdID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBlZGl0b3Iub25BZGQ/LihpdGVtKTtcclxuICAgIC8vIMSQxrBhIGl0ZW0gbMOqbiBkw7JuZyDEkeG6p3UgdGnDqm4gbuG6v3UgdHlwZSBraMOhYyBwb3B1cFxyXG4gICAgaWYgKGVkaXRvci50eXBlICE9PSAncG9wdXAnKSB7XHJcbiAgICAgIGlmICh0eXBlID09PSAnbG9jYWwnKSB7XHJcbiAgICAgICAgdGhpcy5pdGVtcy5zcGxpY2UoMCwgMCwgaXRlbSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy52aWV3SXRlbXMuc3BsaWNlKDAsIDAsIGl0ZW0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vblVwZGF0ZShpdGVtLCBmYWxzZSk7XHJcbiAgfVxyXG4gIG9uVXBkYXRlID0gKGl0ZW06IFNkSXRlbSwgaXNNb2RpZmllZD86IGJvb2xlYW4pID0+IHtcclxuICAgIGNvbnN0IHsgZWRpdG9yLCBjb2x1bW5zIH0gPSB0aGlzLmdyaWRPcHRpb247XHJcbiAgICBpdGVtLmVkaXRvckhhbmRsZXJSb3cuc3RhdHVzID0gaXNNb2RpZmllZCA/ICd1cGRhdGUnIDogJ2NyZWF0ZSc7XHJcbiAgICBpdGVtLmVkaXRvckhhbmRsZXJSb3cudGVtcG9yYXJ5ID0geyAuLi5pdGVtIH07XHJcbiAgICAvLyB0aGlzLmdlbmVyYXRlRWRpdG9ySGFubGRlcihpdGVtKTtcclxuICAgIGlmIChlZGl0b3IudHlwZSA9PT0gJ3BvcHVwJykge1xyXG4gICAgICAvLyBY4butIGzDvSBjYXNlIHBvcHVwXHJcbiAgICAgIC8vIHRoaXMuc2RHcmlkUG9wdXBFZGl0b3Iub3BlbihpdGVtLCBjb2x1bW5zLCBpc01vZGlmaWVkKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcbiAgb25TYXZlID0gYXN5bmMgKGl0ZW06IFNkSXRlbSkgPT4ge1xyXG4gICAgY29uc3QgeyBlZGl0b3IgfSA9IHRoaXMuZ3JpZE9wdGlvbjtcclxuICAgIHRyeSB7XHJcbiAgICAgIGl0ZW0uZWRpdG9ySGFuZGxlclJvdy5zYXZpbmcgPSB0cnVlO1xyXG4gICAgICBpZiAoZWRpdG9yLnZhbGlkYXRlKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZWRpdG9yLnZhbGlkYXRlKGl0ZW0pO1xyXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gYXdhaXQgcmVzdWx0O1xyXG4gICAgICAgICAgaWYgKG1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbWVzc2FnZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICB0aHJvdyByZXN1bHQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChlZGl0b3Iub25TYXZlKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZWRpdG9yLm9uU2F2ZShpdGVtKTtcclxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgYXdhaXQgcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGl0ZW0uZWRpdG9ySGFuZGxlclJvdy5zdGF0dXMgPT09ICdjcmVhdGUnICYmIGVkaXRvci50eXBlID09PSAncG9wdXAnKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbi50eXBlID09PSAnbG9jYWwnKSB7XHJcbiAgICAgICAgICB0aGlzLml0ZW1zLnNwbGljZSgwLCAwLCBpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcy52aWV3SXRlbXMuc3BsaWNlKDAsIDAsIGl0ZW0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpdGVtLmVkaXRvckhhbmRsZXJSb3cuc3RhdHVzID0gdW5kZWZpbmVkO1xyXG4gICAgICAvLyB0aGlzLmdlbmVyYXRlRWRpdG9ySGFubGRlcihpdGVtKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICB0aGlzLm5vdGlmeVNlcnZpY2Uubm90aWZ5Lndhcm5pbmcoZXJyKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGl0ZW0uZWRpdG9ySGFuZGxlclJvdy5zYXZpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DYW5jZWwgPSAoaXRlbTogU2RJdGVtKSA9PiB7XHJcbiAgICBjb25zdCB7IGVkaXRvciB9ID0gdGhpcy5ncmlkT3B0aW9uO1xyXG4gICAgaWYgKGVkaXRvci50eXBlID09PSAnaW5saW5lJykge1xyXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLnR5cGUgPT09ICdsb2NhbCcpIHtcclxuICAgICAgICBjb25zdCBpZHgxID0gdGhpcy5pdGVtcy5pbmRleE9mKGl0ZW0pO1xyXG4gICAgICAgIHRoaXMuaXRlbXMuc3BsaWNlKGlkeDEsIDEpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGNvbnN0IGlkeDIgPSB0aGlzLnZpZXdJdGVtcy5pbmRleE9mKGl0ZW0pO1xyXG4gICAgICAvLyB0aGlzLnZpZXdJdGVtcy5zcGxpY2UoaWR4MiwgMSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChpdGVtLmVkaXRvckhhbmRsZXJSb3cuc3RhdHVzID09PSAnY3JlYXRlJykge1xyXG4gICAgICBpZiAoZWRpdG9yLnR5cGUgIT09ICdwb3B1cCcpIHtcclxuICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLnR5cGUgPT09ICdsb2NhbCcpIHtcclxuICAgICAgICAgIHRoaXMuaXRlbXMuc3BsaWNlKDAsIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGlzLnZpZXdJdGVtcy5zcGxpY2UoMCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIE9iamVjdC5hc3NpZ24oaXRlbSwgaXRlbS5lZGl0b3JIYW5kbGVyUm93LnRlbXBvcmFyeSk7XHJcbiAgICAgIGl0ZW0uZWRpdG9ySGFuZGxlclJvdy5zdGF0dXMgPSB1bmRlZmluZWQ7XHJcbiAgICAgIC8vIHRoaXMuZ2VuZXJhdGVFZGl0b3JIYW5sZGVyKGl0ZW0pO1xyXG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==