@coreui/angular-pro 4.0.0-alpha.8 → 4.0.0-alpha.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -11
- package/esm2020/lib/accordion/accordion/accordion.component.mjs +3 -3
- package/esm2020/lib/accordion/accordion-button/accordion-button.directive.mjs +3 -3
- package/esm2020/lib/accordion/accordion-item/accordion-item.component.mjs +3 -3
- package/esm2020/lib/accordion/accordion.module.mjs +4 -4
- package/esm2020/lib/accordion/accordion.service.mjs +3 -3
- package/esm2020/lib/alert/alert-heading.directive.mjs +3 -3
- package/esm2020/lib/alert/alert-link.directive.mjs +3 -3
- package/esm2020/lib/alert/alert.component.mjs +3 -3
- package/esm2020/lib/alert/alert.module.mjs +4 -4
- package/esm2020/lib/avatar/avatar.component.mjs +3 -3
- package/esm2020/lib/avatar/avatar.module.mjs +4 -4
- package/esm2020/lib/backdrop/backdrop.service.mjs +3 -3
- package/esm2020/lib/badge/badge.component.mjs +3 -3
- package/esm2020/lib/badge/badge.module.mjs +4 -4
- package/esm2020/lib/breadcrumb/breadcrumb/breadcrumb.component.mjs +3 -3
- package/esm2020/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.mjs +3 -3
- package/esm2020/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.mjs +3 -3
- package/esm2020/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.mjs +4 -4
- package/esm2020/lib/breadcrumb/breadcrumb.module.mjs +4 -4
- package/esm2020/lib/button/button-close.directive.mjs +3 -3
- package/esm2020/lib/button/button.directive.mjs +3 -3
- package/esm2020/lib/button/button.module.mjs +4 -4
- package/esm2020/lib/button-group/button-group/button-group.component.mjs +3 -3
- package/esm2020/lib/button-group/button-group.module.mjs +4 -4
- package/esm2020/lib/button-group/button-toolbar/button-toolbar.component.mjs +3 -3
- package/esm2020/lib/callout/callout.component.mjs +3 -3
- package/esm2020/lib/callout/callout.module.mjs +4 -4
- package/esm2020/lib/card/card-body.component.mjs +3 -3
- package/esm2020/lib/card/card-footer.component.mjs +3 -3
- package/esm2020/lib/card/card-group.component.mjs +3 -3
- package/esm2020/lib/card/card-header-actions.component.mjs +3 -3
- package/esm2020/lib/card/card-header.component.mjs +3 -3
- package/esm2020/lib/card/card-img-overlay/card-img-overlay.component.mjs +3 -3
- package/esm2020/lib/card/card-img.directive.mjs +3 -3
- package/esm2020/lib/card/card-link.directive.mjs +3 -3
- package/esm2020/lib/card/card-subtitle.directive.mjs +3 -3
- package/esm2020/lib/card/card-text.directive.mjs +3 -3
- package/esm2020/lib/card/card-title.directive.mjs +3 -3
- package/esm2020/lib/card/card.component.mjs +3 -3
- package/esm2020/lib/card/card.module.mjs +4 -4
- package/esm2020/lib/carousel/carousel/carousel.component.mjs +3 -3
- package/esm2020/lib/carousel/carousel-caption/carousel-caption.component.mjs +3 -3
- package/esm2020/lib/carousel/carousel-control/carousel-control.component.mjs +3 -3
- package/esm2020/lib/carousel/carousel-indicators/carousel-indicators.component.mjs +3 -3
- package/esm2020/lib/carousel/carousel-inner/carousel-inner.component.mjs +3 -3
- package/esm2020/lib/carousel/carousel-item/carousel-item.component.mjs +3 -3
- package/esm2020/lib/carousel/carousel-state.mjs +3 -3
- package/esm2020/lib/carousel/carousel.config.mjs +3 -3
- package/esm2020/lib/carousel/carousel.module.mjs +4 -4
- package/esm2020/lib/carousel/carousel.service.mjs +3 -3
- package/esm2020/lib/collapse/collapse.animations.mjs +1 -1
- package/esm2020/lib/collapse/collapse.directive.mjs +11 -6
- package/esm2020/lib/collapse/collapse.module.mjs +4 -4
- package/esm2020/lib/dropdown/dropdown/dropdown.component.mjs +6 -6
- package/esm2020/lib/dropdown/dropdown-divider/dropdown-divider.directive.mjs +3 -3
- package/esm2020/lib/dropdown/dropdown-header/dropdown-header.directive.mjs +3 -3
- package/esm2020/lib/dropdown/dropdown-item/dropdown-item-plain.directive.mjs +3 -3
- package/esm2020/lib/dropdown/dropdown-item/dropdown-item.directive.mjs +3 -3
- package/esm2020/lib/dropdown/dropdown-menu/dropdown-menu.directive.mjs +3 -3
- package/esm2020/lib/dropdown/dropdown.module.mjs +4 -4
- package/esm2020/lib/dropdown/dropdown.service.mjs +3 -3
- package/esm2020/lib/element-cover/element-cover.component.mjs +71 -0
- package/esm2020/lib/element-cover/element-cover.module.mjs +30 -0
- package/esm2020/lib/element-cover/index.mjs +2 -0
- package/esm2020/lib/element-cover/public_api.mjs +3 -0
- package/esm2020/lib/footer/footer.component.mjs +3 -3
- package/esm2020/lib/footer/footer.module.mjs +4 -4
- package/esm2020/lib/form/form/form.directive.mjs +3 -3
- package/esm2020/lib/form/form-check/form-check-input.directive.mjs +7 -4
- package/esm2020/lib/form/form-check/form-check-label.directive.mjs +3 -3
- package/esm2020/lib/form/form-check/form-check.component.mjs +3 -3
- package/esm2020/lib/form/form-control/form-control.directive.mjs +3 -3
- package/esm2020/lib/form/form-feedback/form-feedback.component.mjs +3 -3
- package/esm2020/lib/form/form-floating/form-floating.directive.mjs +3 -3
- package/esm2020/lib/form/form-label/form-label.directive.mjs +3 -3
- package/esm2020/lib/form/form-select/form-select.directive.mjs +3 -3
- package/esm2020/lib/form/form-text/form-text.directive.mjs +3 -3
- package/esm2020/lib/form/form.module.mjs +4 -4
- package/esm2020/lib/form/input-group/input-group.component.mjs +3 -3
- package/esm2020/lib/form/input-group-text/input-group-text.directive.mjs +3 -3
- package/esm2020/lib/grid/col.component.mjs +3 -3
- package/esm2020/lib/grid/col.directive.mjs +3 -3
- package/esm2020/lib/grid/container.component.mjs +3 -3
- package/esm2020/lib/grid/grid.module.mjs +4 -4
- package/esm2020/lib/grid/gutter.directive.mjs +3 -3
- package/esm2020/lib/grid/row.component.mjs +3 -3
- package/esm2020/lib/grid/row.directive.mjs +3 -3
- package/esm2020/lib/header/header/header.component.mjs +3 -3
- package/esm2020/lib/header/header-brand/header-brand.component.mjs +3 -3
- package/esm2020/lib/header/header-divider/header-divider.component.mjs +3 -3
- package/esm2020/lib/header/header-nav/header-nav.component.mjs +3 -3
- package/esm2020/lib/header/header-text/header-text.component.mjs +3 -3
- package/esm2020/lib/header/header-toggler/header-toggler.directive.mjs +3 -3
- package/esm2020/lib/header/header.module.mjs +4 -4
- package/esm2020/lib/image/img.directive.mjs +3 -3
- package/esm2020/lib/image/img.module.mjs +4 -4
- package/esm2020/lib/list-group/list-group-item.directive.mjs +3 -3
- package/esm2020/lib/list-group/list-group.directive.mjs +3 -3
- package/esm2020/lib/list-group/list-group.module.mjs +4 -4
- package/esm2020/lib/loading-button/loading-button.component.mjs +3 -3
- package/esm2020/lib/loading-button/loading-button.module.mjs +4 -4
- package/esm2020/lib/modal/modal/modal.component.mjs +3 -3
- package/esm2020/lib/modal/modal-body/modal-body.component.mjs +3 -3
- package/esm2020/lib/modal/modal-content/modal-content.component.mjs +3 -3
- package/esm2020/lib/modal/modal-dialog/modal-dialog.component.mjs +3 -3
- package/esm2020/lib/modal/modal-dismiss/modal-toggle.directive.mjs +3 -3
- package/esm2020/lib/modal/modal-footer/modal-footer.component.mjs +3 -3
- package/esm2020/lib/modal/modal-header/modal-header.component.mjs +3 -3
- package/esm2020/lib/modal/modal-title/modal-title.directive.mjs +3 -3
- package/esm2020/lib/modal/modal.module.mjs +4 -4
- package/esm2020/lib/modal/modal.service.mjs +3 -3
- package/esm2020/lib/multi-select/multi-select/multi-select.component.mjs +3 -3
- package/esm2020/lib/multi-select/multi-select-native-select/multi-select-native-select.component.mjs +3 -3
- package/esm2020/lib/multi-select/multi-select-optgroup/multi-select-optgroup-label.component.mjs +3 -3
- package/esm2020/lib/multi-select/multi-select-optgroup/multi-select-optgroup.component.mjs +3 -3
- package/esm2020/lib/multi-select/multi-select-option/multi-select-option.component.mjs +3 -3
- package/esm2020/lib/multi-select/multi-select-tag/multi-select-tag.component.mjs +3 -3
- package/esm2020/lib/multi-select/multi-select.module.mjs +4 -4
- package/esm2020/lib/multi-select/multi-select.service.mjs +3 -3
- package/esm2020/lib/nav/nav-item.component.mjs +3 -3
- package/esm2020/lib/nav/nav-link.directive.mjs +3 -3
- package/esm2020/lib/nav/nav.component.mjs +5 -5
- package/esm2020/lib/nav/nav.module.mjs +4 -4
- package/esm2020/lib/navbar/navbar-brand/navbar-brand.directive.mjs +3 -3
- package/esm2020/lib/navbar/navbar-nav/navbar-nav.component.mjs +3 -3
- package/esm2020/lib/navbar/navbar-text/navbar-text.component.mjs +3 -3
- package/esm2020/lib/navbar/navbar-toggler/navbar-toggler.directive.mjs +3 -3
- package/esm2020/lib/navbar/navbar.component.mjs +3 -3
- package/esm2020/lib/navbar/navbar.module.mjs +4 -4
- package/esm2020/lib/offcanvas/offcanvas/offcanvas.component.mjs +3 -3
- package/esm2020/lib/offcanvas/offcanvas-body/offcanvas-body.component.mjs +3 -3
- package/esm2020/lib/offcanvas/offcanvas-header/offcanvas-header.component.mjs +3 -3
- package/esm2020/lib/offcanvas/offcanvas-title/offcanvas-title.directive.mjs +3 -3
- package/esm2020/lib/offcanvas/offcanvas-toggle/offcanvas-toggle.directive.mjs +3 -3
- package/esm2020/lib/offcanvas/offcanvas.module.mjs +4 -4
- package/esm2020/lib/offcanvas/offcanvas.service.mjs +3 -3
- package/esm2020/lib/pagination/page-item/page-item.component.mjs +3 -3
- package/esm2020/lib/pagination/page-item/page-item.directive.mjs +3 -3
- package/esm2020/lib/pagination/page-link/page-link.directive.mjs +3 -3
- package/esm2020/lib/pagination/pagination/pagination.component.mjs +3 -3
- package/esm2020/lib/pagination/pagination.module.mjs +5 -5
- package/esm2020/lib/pagination/public_api.mjs +1 -1
- package/esm2020/lib/popover/popover/popover.component.mjs +3 -3
- package/esm2020/lib/popover/popover.directive.mjs +3 -3
- package/esm2020/lib/popover/popover.module.mjs +4 -4
- package/esm2020/lib/progress/progress-bar.component.mjs +3 -3
- package/esm2020/lib/progress/progress.component.mjs +3 -3
- package/esm2020/lib/progress/progress.module.mjs +4 -4
- package/esm2020/lib/services/class-toggle.service.mjs +3 -3
- package/esm2020/lib/services/listeners.service.mjs +3 -3
- package/esm2020/lib/shared/html-attr.directive.mjs +3 -3
- package/esm2020/lib/shared/shared.module.mjs +4 -4
- package/esm2020/lib/shared/template-id.directive.mjs +3 -3
- package/esm2020/lib/sidebar/sidebar/sidebar.component.mjs +3 -3
- package/esm2020/lib/sidebar/sidebar-backdrop/sidebar-backdrop.service.mjs +3 -3
- package/esm2020/lib/sidebar/sidebar-brand/sidebar-brand.component.mjs +3 -3
- package/esm2020/lib/sidebar/sidebar-footer/sidebar-footer.component.mjs +3 -3
- package/esm2020/lib/sidebar/sidebar-header/sidebar-header.component.mjs +3 -3
- package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-badge.pipe.mjs +3 -3
- package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-divider.component.mjs +3 -3
- package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-icon.pipe.mjs +3 -3
- package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-item-class.pipe.mjs +3 -3
- package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-label.component.mjs +3 -3
- package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-link.component.mjs +6 -6
- package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-link.pipe.mjs +3 -3
- package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav-title.component.mjs +3 -3
- package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav.component.mjs +6 -6
- package/esm2020/lib/sidebar/sidebar-nav/sidebar-nav.service.mjs +6 -6
- package/esm2020/lib/sidebar/sidebar-toggle/sidebar-toggle.directive.mjs +3 -3
- package/esm2020/lib/sidebar/sidebar-toggler/sidebar-toggler.component.mjs +3 -3
- package/esm2020/lib/sidebar/sidebar.module.mjs +4 -4
- package/esm2020/lib/sidebar/sidebar.service.mjs +3 -3
- package/esm2020/lib/smart-pagination/index.mjs +2 -0
- package/esm2020/lib/smart-pagination/public_api.mjs +3 -0
- package/esm2020/lib/smart-pagination/smart-pagination.component.mjs +196 -0
- package/esm2020/lib/smart-pagination/smart-pagination.module.mjs +30 -0
- package/esm2020/lib/smart-pagination/smart-pagination.type.mjs +2 -0
- package/esm2020/lib/smart-table/index.mjs +2 -0
- package/esm2020/lib/smart-table/public_api.mjs +3 -0
- package/esm2020/lib/smart-table/smart-table/smart-table.component.mjs +445 -0
- package/esm2020/lib/smart-table/smart-table-filter/smart-table-filter.component.mjs +46 -0
- package/esm2020/lib/smart-table/smart-table-head/smart-table-head.component.mjs +138 -0
- package/esm2020/lib/smart-table/smart-table-items-per-page-selector/smart-table-items-per-page-selector.component.mjs +46 -0
- package/esm2020/lib/smart-table/smart-table.module.mjs +72 -0
- package/esm2020/lib/smart-table/smart-table.type.mjs +2 -0
- package/esm2020/lib/spinner/spinner.component.mjs +3 -3
- package/esm2020/lib/spinner/spinner.module.mjs +4 -4
- package/esm2020/lib/table/table-active.directive.mjs +3 -3
- package/esm2020/lib/table/table-color.directive.mjs +3 -3
- package/esm2020/lib/table/table.directive.mjs +5 -5
- package/esm2020/lib/table/table.module.mjs +4 -4
- package/esm2020/lib/table/table.type.mjs +2 -0
- package/esm2020/lib/tabs/tab-content/tab-content.component.mjs +3 -3
- package/esm2020/lib/tabs/tab-content-ref.directive.mjs +3 -3
- package/esm2020/lib/tabs/tab-pane/tab-pane.component.mjs +3 -3
- package/esm2020/lib/tabs/tab.service.mjs +3 -3
- package/esm2020/lib/tabs/tabs.module.mjs +4 -4
- package/esm2020/lib/toast/toast/toast.component.mjs +3 -3
- package/esm2020/lib/toast/toast-body/toast-body.component.mjs +3 -3
- package/esm2020/lib/toast/toast-close.directive.mjs +3 -3
- package/esm2020/lib/toast/toast-header/toast-header.component.mjs +3 -3
- package/esm2020/lib/toast/toast.module.mjs +4 -4
- package/esm2020/lib/toast/toaster/toaster-host.directive.mjs +3 -3
- package/esm2020/lib/toast/toaster/toaster.component.mjs +3 -3
- package/esm2020/lib/toast/toaster/toaster.service.mjs +3 -3
- package/esm2020/lib/tooltip/tooltip/tooltip.component.mjs +3 -3
- package/esm2020/lib/tooltip/tooltip.directive.mjs +3 -3
- package/esm2020/lib/tooltip/tooltip.module.mjs +4 -4
- package/esm2020/lib/utilities/align.directive.mjs +3 -3
- package/esm2020/lib/utilities/bg-color.directive.mjs +3 -3
- package/esm2020/lib/utilities/border.directive.mjs +3 -3
- package/esm2020/lib/utilities/rounded.directive.mjs +3 -3
- package/esm2020/lib/utilities/text-color.directive.mjs +3 -3
- package/esm2020/lib/utilities/utilities.module.mjs +4 -4
- package/esm2020/lib/widget/widget-stat-a/widget-stat-a.component.mjs +3 -3
- package/esm2020/lib/widget/widget-stat-b/widget-stat-b.component.mjs +3 -3
- package/esm2020/lib/widget/widget-stat-c/widget-stat-c.component.mjs +3 -3
- package/esm2020/lib/widget/widget-stat-d/widget-stat-d.component.mjs +3 -3
- package/esm2020/lib/widget/widget-stat-e/widget-stat-e.component.mjs +3 -3
- package/esm2020/lib/widget/widget-stat-f/widget-stat-f.component.mjs +3 -3
- package/esm2020/lib/widget/widget.module.mjs +4 -4
- package/esm2020/public-api.mjs +5 -2
- package/fesm2015/coreui-angular-pro.mjs +2013 -997
- package/fesm2015/coreui-angular-pro.mjs.map +1 -1
- package/fesm2020/coreui-angular-pro.mjs +2021 -1010
- package/fesm2020/coreui-angular-pro.mjs.map +1 -1
- package/lib/collapse/collapse.directive.d.ts +3 -2
- package/lib/element-cover/element-cover.component.d.ts +27 -0
- package/lib/element-cover/element-cover.module.d.ts +9 -0
- package/lib/element-cover/index.d.ts +1 -0
- package/lib/element-cover/public_api.d.ts +2 -0
- package/lib/smart-pagination/index.d.ts +1 -0
- package/lib/smart-pagination/public_api.d.ts +2 -0
- package/lib/smart-pagination/smart-pagination.component.d.ts +109 -0
- package/lib/smart-pagination/smart-pagination.module.d.ts +9 -0
- package/lib/smart-pagination/smart-pagination.type.d.ts +79 -0
- package/lib/smart-table/index.d.ts +1 -0
- package/lib/smart-table/public_api.d.ts +2 -0
- package/lib/smart-table/smart-table/smart-table.component.d.ts +124 -0
- package/lib/smart-table/smart-table-filter/smart-table-filter.component.d.ts +14 -0
- package/lib/smart-table/smart-table-head/smart-table-head.component.d.ts +36 -0
- package/lib/smart-table/smart-table-items-per-page-selector/smart-table-items-per-page-selector.component.d.ts +14 -0
- package/lib/smart-table/smart-table.module.d.ts +20 -0
- package/lib/smart-table/smart-table.type.d.ts +272 -0
- package/lib/table/table.directive.d.ts +3 -2
- package/lib/table/table.type.d.ts +76 -0
- package/package.json +1 -1
- package/public-api.d.ts +4 -1
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
import { Component, ContentChildren, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';
|
|
3
|
+
import { TemplateIdDirective } from '../../shared';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "../smart-table-filter/smart-table-filter.component";
|
|
6
|
+
import * as i2 from "../smart-table-head/smart-table-head.component";
|
|
7
|
+
import * as i3 from "../../element-cover/element-cover.component";
|
|
8
|
+
import * as i4 from "../../smart-pagination/smart-pagination.component";
|
|
9
|
+
import * as i5 from "../smart-table-items-per-page-selector/smart-table-items-per-page-selector.component";
|
|
10
|
+
import * as i6 from "@angular/common";
|
|
11
|
+
import * as i7 from "../../button/button.directive";
|
|
12
|
+
import * as i8 from "../../table/table.directive";
|
|
13
|
+
import * as i9 from "../../shared/html-attr.directive";
|
|
14
|
+
import * as i10 from "../../table/table-color.directive";
|
|
15
|
+
import * as i11 from "../../utilities/align.directive";
|
|
16
|
+
import * as i12 from "../../table/table-active.directive";
|
|
17
|
+
import * as i13 from "../../form/form-check/form-check-input.directive";
|
|
18
|
+
export class SmartTableComponent {
|
|
19
|
+
constructor(iterable) {
|
|
20
|
+
this.iterable = iterable;
|
|
21
|
+
this._activePage = 1;
|
|
22
|
+
this._cleaner = false;
|
|
23
|
+
this._clickableRows = false;
|
|
24
|
+
this._columnFilterValue = {};
|
|
25
|
+
this._footer = false;
|
|
26
|
+
this._header = false;
|
|
27
|
+
this._items = [];
|
|
28
|
+
this._itemsPerPage = 10;
|
|
29
|
+
this.itemsPerPageLabel = 'Items per page:';
|
|
30
|
+
this.itemsPerPageOptions = [5, 10, 20, 50];
|
|
31
|
+
this.noItemsLabel = 'No items found';
|
|
32
|
+
this._pagination = false;
|
|
33
|
+
this._selectable = false;
|
|
34
|
+
this._sorterValue = {};
|
|
35
|
+
this.tableFilterLabel = 'Filter:';
|
|
36
|
+
this.tableFilterPlaceholder = 'type string...';
|
|
37
|
+
this._tableFilterValue = '';
|
|
38
|
+
this.tableBodyProps = {};
|
|
39
|
+
this.tableFootProps = {};
|
|
40
|
+
this.tableHeadProps = {};
|
|
41
|
+
this.tableProps = {};
|
|
42
|
+
this.selectedItemsChange = new EventEmitter();
|
|
43
|
+
this.sorterValueChange = new EventEmitter();
|
|
44
|
+
this.activePageChange = new EventEmitter();
|
|
45
|
+
this.itemsPerPageChange = new EventEmitter();
|
|
46
|
+
this.rowClick = new EventEmitter();
|
|
47
|
+
this.columnFilterValueChange = new EventEmitter();
|
|
48
|
+
this.filteredItemsChange = new EventEmitter();
|
|
49
|
+
this.tableFilterValueChange = new EventEmitter();
|
|
50
|
+
this.templates = { tableDetails: null, tableData: null };
|
|
51
|
+
this._selectedAll = false;
|
|
52
|
+
this.iterableDiffer = this.iterable.find(this.items).create();
|
|
53
|
+
}
|
|
54
|
+
set activePage(value) {
|
|
55
|
+
this._activePage = coerceNumberProperty(value) || 1;
|
|
56
|
+
this.activePageChange.emit(this._activePage);
|
|
57
|
+
}
|
|
58
|
+
get activePage() {
|
|
59
|
+
return this._activePage;
|
|
60
|
+
}
|
|
61
|
+
set cleaner(value) {
|
|
62
|
+
this._cleaner = coerceBooleanProperty(value);
|
|
63
|
+
}
|
|
64
|
+
get cleaner() {
|
|
65
|
+
return this._cleaner;
|
|
66
|
+
}
|
|
67
|
+
set clickableRows(value) {
|
|
68
|
+
this._clickableRows = coerceBooleanProperty(value);
|
|
69
|
+
}
|
|
70
|
+
get clickableRows() {
|
|
71
|
+
return this._clickableRows;
|
|
72
|
+
}
|
|
73
|
+
set columns(value) {
|
|
74
|
+
this._columns = value;
|
|
75
|
+
}
|
|
76
|
+
get columns() {
|
|
77
|
+
return this._columns || this.rawColumnNames;
|
|
78
|
+
}
|
|
79
|
+
set columnFilterValue(value) {
|
|
80
|
+
this._columnFilterValue = value;
|
|
81
|
+
this.columnFilterValueChange.emit({ ...value });
|
|
82
|
+
}
|
|
83
|
+
get columnFilterValue() {
|
|
84
|
+
return this._columnFilterValue;
|
|
85
|
+
}
|
|
86
|
+
set footer(value) {
|
|
87
|
+
this._footer = coerceBooleanProperty(value);
|
|
88
|
+
}
|
|
89
|
+
get footer() {
|
|
90
|
+
return this._footer;
|
|
91
|
+
}
|
|
92
|
+
set header(value) {
|
|
93
|
+
this._header = coerceBooleanProperty(value);
|
|
94
|
+
}
|
|
95
|
+
get header() {
|
|
96
|
+
return this._header;
|
|
97
|
+
}
|
|
98
|
+
set items(value) {
|
|
99
|
+
this._items = this.setItems(value);
|
|
100
|
+
}
|
|
101
|
+
get items() {
|
|
102
|
+
return this._items;
|
|
103
|
+
}
|
|
104
|
+
set itemsPerPage(value) {
|
|
105
|
+
this._itemsPerPage = coerceNumberProperty(value);
|
|
106
|
+
}
|
|
107
|
+
get itemsPerPage() {
|
|
108
|
+
return this._itemsPerPage;
|
|
109
|
+
}
|
|
110
|
+
set pagination(value) {
|
|
111
|
+
this._pagination = coerceBooleanProperty(value);
|
|
112
|
+
}
|
|
113
|
+
get pagination() {
|
|
114
|
+
return this._pagination;
|
|
115
|
+
}
|
|
116
|
+
set selectable(value) {
|
|
117
|
+
this._selectable = coerceBooleanProperty(value);
|
|
118
|
+
}
|
|
119
|
+
get selectable() {
|
|
120
|
+
return this._selectable;
|
|
121
|
+
}
|
|
122
|
+
set sorterValue(value) {
|
|
123
|
+
this._sorterValue = value;
|
|
124
|
+
this.sorterValueChange.emit({ ...value });
|
|
125
|
+
}
|
|
126
|
+
get sorterValue() {
|
|
127
|
+
return this._sorterValue;
|
|
128
|
+
}
|
|
129
|
+
set tableFilterValue(value) {
|
|
130
|
+
this._tableFilterValue = value;
|
|
131
|
+
this.tableFilterValueChange.emit(value);
|
|
132
|
+
}
|
|
133
|
+
get tableFilterValue() {
|
|
134
|
+
return this._tableFilterValue;
|
|
135
|
+
}
|
|
136
|
+
ngAfterContentInit() {
|
|
137
|
+
this.columnTemplates.forEach((child) => {
|
|
138
|
+
this.templates[child.id] = child.templateRef;
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
get selectedAll() {
|
|
142
|
+
const selected = this.items.filter((item) => item._selected === true);
|
|
143
|
+
return selected.length === 0 ? false : selected.length === this.items.length ? true : 'indeterminate';
|
|
144
|
+
// return this._selectedAll;
|
|
145
|
+
}
|
|
146
|
+
set selectedAll(value) {
|
|
147
|
+
const selected = this.items.filter((item) => item._selected === true);
|
|
148
|
+
this.selectedItemsChange.emit(selected);
|
|
149
|
+
this._selectedAll = selected.length === 0 ? false : selected.length === this.items.length ? true : 'indeterminate';
|
|
150
|
+
}
|
|
151
|
+
get tableFilterState() {
|
|
152
|
+
return this.tableFilterValue ? this.tableFilterValue : '';
|
|
153
|
+
}
|
|
154
|
+
get columnFilterState() {
|
|
155
|
+
return this.columnFilterValue ? this.columnFilterValue : {};
|
|
156
|
+
}
|
|
157
|
+
get numberOfPages() {
|
|
158
|
+
return this._itemsPerPage ? Math.ceil(this.sortedItems.length / this._itemsPerPage) : 1;
|
|
159
|
+
}
|
|
160
|
+
get colspan() {
|
|
161
|
+
return this._selectable ? this.rawColumnNames.length + 1 : this.rawColumnNames.length;
|
|
162
|
+
}
|
|
163
|
+
get firstItemOnActivePageIndex() {
|
|
164
|
+
return this._activePage ? (this._activePage - 1) * this._itemsPerPage : 0;
|
|
165
|
+
}
|
|
166
|
+
get itemsOnActivePage() {
|
|
167
|
+
return this.sortedItems.slice(this.firstItemOnActivePageIndex, this.firstItemOnActivePageIndex + this._itemsPerPage);
|
|
168
|
+
}
|
|
169
|
+
get currentItems() {
|
|
170
|
+
return this._activePage ? this.itemsOnActivePage : this.sortedItems ?? [];
|
|
171
|
+
// return this.items ?? [];
|
|
172
|
+
}
|
|
173
|
+
get genCols() {
|
|
174
|
+
return Object.keys(this._items ? this._items[0] ?? {} : {}).filter((el) => el.charAt(0) !== '_');
|
|
175
|
+
}
|
|
176
|
+
get rawColumnNames() {
|
|
177
|
+
return this._columns
|
|
178
|
+
? this._columns.map((column) => {
|
|
179
|
+
if (typeof column === 'object')
|
|
180
|
+
return column.key;
|
|
181
|
+
else
|
|
182
|
+
return column;
|
|
183
|
+
})
|
|
184
|
+
: this.genCols;
|
|
185
|
+
}
|
|
186
|
+
get itemsDataColumns() {
|
|
187
|
+
return this.rawColumnNames.filter((name) => this.genCols.includes(name));
|
|
188
|
+
}
|
|
189
|
+
get sortedItems() {
|
|
190
|
+
const col = this.sorterValue.column;
|
|
191
|
+
if (!col ||
|
|
192
|
+
!this.itemsDataColumns.includes(col) ||
|
|
193
|
+
(this.columnSorter &&
|
|
194
|
+
typeof this.columnSorter === 'object' &&
|
|
195
|
+
this.columnSorter.external)) {
|
|
196
|
+
return this.tableFiltered;
|
|
197
|
+
}
|
|
198
|
+
//if values in column are to be sorted by numeric value they all have to be type number
|
|
199
|
+
// const flip = sorterState.asc ? 1 : -1
|
|
200
|
+
const flip = this.sorterValue.state === 'asc' ? 1 : this.sorterValue.state === 'desc' ? -1 : 0;
|
|
201
|
+
// @ts-ignore
|
|
202
|
+
const sorted = this.tableFiltered.slice().sort((item, item2) => {
|
|
203
|
+
const value = item[col];
|
|
204
|
+
const value2 = item2[col];
|
|
205
|
+
const a = typeof value === 'number' ? value : String(value).toLowerCase();
|
|
206
|
+
const b = typeof value2 === 'number' ? value2 : String(value2).toLowerCase();
|
|
207
|
+
return a > b ? 1 * flip : b > a ? -1 * flip : 0;
|
|
208
|
+
});
|
|
209
|
+
return sorted;
|
|
210
|
+
}
|
|
211
|
+
get columnFiltered() {
|
|
212
|
+
let _items = this._items;
|
|
213
|
+
if (this.columnFilter &&
|
|
214
|
+
typeof this.columnFilter === 'object' &&
|
|
215
|
+
this.columnFilter.external) {
|
|
216
|
+
// @ts-ignore
|
|
217
|
+
return _items;
|
|
218
|
+
}
|
|
219
|
+
Object.entries(this.columnFilterState).forEach(([key, value]) => {
|
|
220
|
+
const columnFilter = String(value).toLowerCase();
|
|
221
|
+
if (columnFilter && this.itemsDataColumns.includes(key)) {
|
|
222
|
+
// @ts-ignore
|
|
223
|
+
_items = _items.filter((item) => {
|
|
224
|
+
return String(item[key]).toLowerCase().includes(columnFilter);
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
// @ts-ignore
|
|
229
|
+
return _items;
|
|
230
|
+
}
|
|
231
|
+
get tableFiltered() {
|
|
232
|
+
let items = this.columnFiltered;
|
|
233
|
+
if (!this.tableFilterState ||
|
|
234
|
+
(this.tableFilter && typeof this.tableFilter === 'object' && this.tableFilter.external)) {
|
|
235
|
+
return items;
|
|
236
|
+
}
|
|
237
|
+
const filter = this.tableFilterState.toLowerCase();
|
|
238
|
+
const valueContainFilter = (val) => String(val).toLowerCase().includes(filter);
|
|
239
|
+
// @ts-ignore
|
|
240
|
+
items = items.filter((item) => {
|
|
241
|
+
return !!this.itemsDataColumns.find((key) => valueContainFilter(item[key]));
|
|
242
|
+
});
|
|
243
|
+
this.filteredItemsChange.emit(items);
|
|
244
|
+
return items;
|
|
245
|
+
}
|
|
246
|
+
get isFiltered() {
|
|
247
|
+
return this.tableFilterState || this.sorterValue?.column || Object.values(this.columnFilterState).join('');
|
|
248
|
+
}
|
|
249
|
+
setItems(items) {
|
|
250
|
+
if (Array.isArray(items)) {
|
|
251
|
+
return items.map((item, index) => {
|
|
252
|
+
return { ...item, _id: index };
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
return [];
|
|
256
|
+
}
|
|
257
|
+
handleSortChange($event) {
|
|
258
|
+
this.handleSorterChange($event.columnKey, $event.index);
|
|
259
|
+
}
|
|
260
|
+
isSortable(i) {
|
|
261
|
+
const isDataColumn = this.itemsDataColumns.includes(this.rawColumnNames[i]);
|
|
262
|
+
let column;
|
|
263
|
+
if (this.columns)
|
|
264
|
+
column = this.columns[i];
|
|
265
|
+
return (this.columnSorter &&
|
|
266
|
+
(!this.columns ||
|
|
267
|
+
typeof column !== 'object' ||
|
|
268
|
+
(typeof column === 'object' &&
|
|
269
|
+
(typeof column.sorter === 'undefined' || column.sorter))) &&
|
|
270
|
+
isDataColumn);
|
|
271
|
+
}
|
|
272
|
+
handleSorterChange(column, index) {
|
|
273
|
+
if (!this.isSortable(index)) {
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
//if column changed or sort was descending change asc to true
|
|
277
|
+
const state = { ...this.sorterValue };
|
|
278
|
+
if (state.column === column) {
|
|
279
|
+
if (state.state === 0) {
|
|
280
|
+
state.state = 'asc';
|
|
281
|
+
}
|
|
282
|
+
else if (state.state === 'asc') {
|
|
283
|
+
state.state = 'desc';
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
if (typeof this.columnSorter === 'object' && !this.columnSorter.resetable) {
|
|
287
|
+
state.state = 'asc';
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
state.state = 0;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
state.column = column;
|
|
296
|
+
state.state = 'asc';
|
|
297
|
+
}
|
|
298
|
+
this.sorterValue = { ...state };
|
|
299
|
+
}
|
|
300
|
+
setActivePage($event) {
|
|
301
|
+
this.activePage = $event;
|
|
302
|
+
}
|
|
303
|
+
handleColumnFilterChange($event) {
|
|
304
|
+
const { column, value } = $event;
|
|
305
|
+
const isLazy = this.columnFilter && typeof this.columnFilter === 'object' && this.columnFilter.lazy === true;
|
|
306
|
+
// if ((isLazy && type === 'input') || (!isLazy && type === 'change')) {
|
|
307
|
+
if (isLazy) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
this.setActivePage(1);
|
|
311
|
+
this.columnFilterValue = { ...this.columnFilterValue, [`${column}`]: value };
|
|
312
|
+
}
|
|
313
|
+
handleTableFilterChange($event) {
|
|
314
|
+
const isLazy = this.tableFilter && typeof this.tableFilter === 'object' && this.tableFilter.lazy === true;
|
|
315
|
+
// if ((isLazy && type === 'input') || (!isLazy && type === 'change')) {
|
|
316
|
+
if (isLazy) {
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
this.setActivePage(1);
|
|
320
|
+
this.tableFilterValue = $event;
|
|
321
|
+
}
|
|
322
|
+
clean($event) {
|
|
323
|
+
this.tableFilterValue = '';
|
|
324
|
+
this.columnFilterValue = {};
|
|
325
|
+
this.sorterValue = {};
|
|
326
|
+
}
|
|
327
|
+
handleItemsPerPageChange(value) {
|
|
328
|
+
if (value !== this._itemsPerPage) {
|
|
329
|
+
this.setActivePage(1);
|
|
330
|
+
this._itemsPerPage = value;
|
|
331
|
+
this.itemsPerPageChange.emit(value);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
handleRowChecked($event, item) {
|
|
335
|
+
item._selected = $event.target.checked;
|
|
336
|
+
const selected = this.items.filter((item) => item._selected === true);
|
|
337
|
+
this.selectedItemsChange.emit(selected);
|
|
338
|
+
}
|
|
339
|
+
handleSelectAllChange($event) {
|
|
340
|
+
this._items = this.items.map((item) => {
|
|
341
|
+
return { ...item, _selected: $event };
|
|
342
|
+
});
|
|
343
|
+
this.selectedAll = $event;
|
|
344
|
+
}
|
|
345
|
+
// tableDataCellProps(item: IItem, colName: string) {
|
|
346
|
+
// const props = item['_cellProps'] && {
|
|
347
|
+
// ...(item['_cellProps']['all'] && { ...item['_cellProps']['all'] }),
|
|
348
|
+
// ...(item['_cellProps'][colName] && { ...item['_cellProps'][colName] }),
|
|
349
|
+
// }
|
|
350
|
+
// console.log('tableDataCellProps', props)
|
|
351
|
+
// return props
|
|
352
|
+
// }
|
|
353
|
+
getColumnName($event) {
|
|
354
|
+
const target = $event.target;
|
|
355
|
+
const closest = target.closest('tr');
|
|
356
|
+
const children = closest ? Array.from(closest.children) : [];
|
|
357
|
+
const clickedCell = children.filter((child) => child.contains(target))[0];
|
|
358
|
+
return this.rawColumnNames[children.indexOf(clickedCell) - (this._selectable ? 1 : 0)];
|
|
359
|
+
}
|
|
360
|
+
handleRowClick(param) {
|
|
361
|
+
const { $event, item, i } = { ...param };
|
|
362
|
+
const columnName = this.getColumnName(param.$event);
|
|
363
|
+
this.rowClick.emit({ item: item, index: i + this.firstItemOnActivePageIndex, columnName, event: $event });
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
SmartTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: SmartTableComponent, deps: [{ token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component });
|
|
367
|
+
SmartTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.4", type: SmartTableComponent, selector: "c-smart-table", inputs: { activePage: "activePage", cleaner: "cleaner", clickableRows: "clickableRows", columns: "columns", columnFilter: "columnFilter", columnFilterValue: "columnFilterValue", columnSorter: "columnSorter", footer: "footer", header: "header", items: "items", itemsPerPage: "itemsPerPage", itemsPerPageLabel: "itemsPerPageLabel", itemsPerPageOptions: "itemsPerPageOptions", itemsPerPageSelect: "itemsPerPageSelect", loading: "loading", noItemsLabel: "noItemsLabel", pagination: "pagination", selectable: "selectable", sorterValue: "sorterValue", tableFilter: "tableFilter", tableFilterLabel: "tableFilterLabel", tableFilterPlaceholder: "tableFilterPlaceholder", tableFilterValue: "tableFilterValue", tableBodyProps: "tableBodyProps", tableFootProps: "tableFootProps", tableHeadProps: "tableHeadProps", tableProps: "tableProps" }, outputs: { selectedItemsChange: "selectedItemsChange", sorterValueChange: "sorterValueChange", activePageChange: "activePageChange", itemsPerPageChange: "itemsPerPageChange", rowClick: "rowClick", columnFilterValueChange: "columnFilterValueChange", filteredItemsChange: "filteredItemsChange", tableFilterValueChange: "tableFilterValueChange" }, queries: [{ propertyName: "columnTemplates", predicate: TemplateIdDirective }], exportAs: ["cSmartTable"], ngImport: i0, template: "<div *ngIf=\"itemsPerPageSelect || tableFilter || cleaner\" class=\"row my-2 mx-0\">\r\n <ng-template [ngIf]=\"tableFilter || cleaner\">\r\n <div class=\"col-auto p-0\">\r\n <c-smart-table-filter\r\n (valueChange)=\"handleTableFilterChange($event)\"\r\n *ngIf=\"tableFilter\"\r\n [filterLabel]=\"tableFilterLabel\"\r\n [filterPlaceholder]=\"tableFilterPlaceholder\"\r\n [value]=\"tableFilterState ?? ''\"\r\n >\r\n </c-smart-table-filter>\r\n </div>\r\n <div class=\"col-auto p-0\">\r\n <button\r\n (click)=\"clean($event)\"\r\n *ngIf=\"cleaner\"\r\n [disabled]=\"!isFiltered\"\r\n [ngClass]=\"{'ms-1': tableFilter}\"\r\n [tabindex]=\"0\"\r\n cButton\r\n color=\"transparent\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"filterIconTemplate\"></ng-container>\r\n </button>\r\n </div>\r\n </ng-template>\r\n</div>\r\n<div class=\"position-relative\">\r\n <table [align]=\"tableProps?.align\"\r\n [borderColor]=\"tableProps?.borderColor\"\r\n [bordered]=\"tableProps?.bordered\"\r\n [borderless]=\"tableProps?.borderless\"\r\n [caption]=\"tableProps?.caption\"\r\n [color]=\"tableProps?.color\"\r\n [hover]=\"tableProps?.hover\"\r\n [responsive]=\"tableProps?.responsive\"\r\n [small]=\"tableProps?.small\"\r\n [striped]=\"tableProps?.striped\"\r\n [cHtmlAttr]=\"tableProps?.attributes ?? {}\"\r\n [cTableColor]=\"tableProps?.color\"\r\n cTable\r\n >\r\n <c-smart-table-head\r\n (columnFilterStateChange)=\"handleColumnFilterChange($event)\"\r\n (selectAllChange)=\"handleSelectAllChange($event)\"\r\n (sorterStateChange)=\"handleSortChange($event)\"\r\n *ngIf=\"header\"\r\n [columnFilterState]=\"columnFilterState\"\r\n [columnFilter]=\"true\"\r\n [columns]=\"columns\"\r\n [selectAll]=\"selectedAll\"\r\n [selectable]=\"selectable\"\r\n [sorterValue]=\"sorterValue\"\r\n [cHtmlAttr]=\"tableHeadProps?.attributes ?? {}\"\r\n [cTableColor]=\"tableHeadProps?.color\"\r\n [cAlign]=\"tableHeadProps?.align\"\r\n ></c-smart-table-head>\r\n\r\n <ng-container *ngTemplateOutlet=\"tbodyDefaultTemplate\"></ng-container>\r\n\r\n <c-smart-table-head\r\n (selectAllChange)=\"handleSelectAllChange($event)\"\r\n (sorterStateChange)=\"handleSortChange($event)\"\r\n *ngIf=\"footer\"\r\n [columns]=\"columns\"\r\n [selectAll]=\"selectedAll\"\r\n [selectable]=\"selectable\"\r\n [sorterValue]=\"sorterValue\"\r\n [cHtmlAttr]=\"tableFootProps?.attributes ?? {}\"\r\n [cTableColor]=\"tableFootProps?.color\"\r\n [cAlign]=\"tableFootProps?.align\"\r\n component=\"tfoot\"\r\n ></c-smart-table-head>\r\n\r\n </table>\r\n <c-element-cover\r\n *ngIf=\"loading\"\r\n [boundaries]=\"[\r\n { sides: ['top'], query: 'td' },\r\n { sides: ['bottom'], query: 'tbody' }\r\n ]\"\r\n ></c-element-cover>\r\n</div>\r\n<ng-template [ngIf]=\"pagination || itemsPerPageSelect\">\r\n <div class=\"row\">\r\n <div class=\"col\">\r\n <c-smart-pagination\r\n (activePageChange)=\"setActivePage($event)\"\r\n *ngIf=\"pagination && numberOfPages > 1\"\r\n [activePage]=\"activePage\"\r\n [pages]=\"numberOfPages\">\r\n </c-smart-pagination>\r\n </div>\r\n <div class=\"col-auto ms-auto\">\r\n <c-smart-table-items-per-page-selector\r\n (itemsPerPageChange)=\"handleItemsPerPageChange($event)\"\r\n *ngIf=\"itemsPerPageSelect\"\r\n [itemsPerPageLabel]=\"itemsPerPageLabel\"\r\n [itemsPerPageOptions]=\"itemsPerPageOptions\"\r\n [itemsPerPage]=\"itemsPerPage\"\r\n >\r\n </c-smart-table-items-per-page-selector>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #tbodyDefaultTemplate>\r\n <tbody [cHtmlAttr]=\"tableBodyProps?.attributes ?? {}\"\r\n [cTableColor]=\"tableBodyProps?.color\"\r\n [cAlign]=\"tableBodyProps?.align\"\r\n >\r\n <ng-template ngFor let-item [ngForOf]=\"currentItems\" let-cnt=\"count\" let-i=\"index\" let-isEven=\"even\" let-isOdd=\"odd\">\r\n <tr [tabindex]=\"clickableRows ? 0 : -1\"\r\n [ngStyle]=\"{cursor: clickableRows ? 'pointer' : 'auto'}\"\r\n (click)=\"handleRowClick({$event, item, i})\"\r\n [cTableActive]=\"item._props?.active\"\r\n [cTableColor]=\"item._props?.color\"\r\n [cAlign]=\"item._props?.align\"\r\n >\r\n <td *ngIf=\"selectable\"\r\n [cTableActive]=\"item?.['_cellProps']?._all?.active\"\r\n [cTableColor]=\"item?.['_cellProps']?._all?.color\"\r\n [cAlign]=\"item?.['_cellProps']?._all?.align\">\r\n <input (change)=\"handleRowChecked($event, item)\" [checked]=\"item._selected ?? false\" cFormCheckInput>\r\n </td>\r\n <ng-template ngFor let-columnName [ngForOf]=\"rawColumnNames\" let-i=\"index\" >\r\n <ng-container *ngTemplateOutlet=\"templates['tableData'] || columnDefaultTemplate; context: {item, columnName, tdContent: item[columnName] }\"></ng-container>\r\n </ng-template>\r\n </tr>\r\n <ng-template [ngIf]=\"templates['tableDetails']\">\r\n <!-- <ng-container *ngTemplateOutlet=\"rowDetailsDefaultTemplate\"></ng-container>-->\r\n <tr><td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td></tr>\r\n <tr class=\"p-0\">\r\n <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">\r\n <ng-container *ngTemplateOutlet=\"templates['tableDetails']; context: {item, index: i}\"></ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"noItemsDefaultTemplate\"></ng-container>\r\n </tbody>\r\n</ng-template>\r\n\r\n<ng-template #columnDefaultTemplate let-item=\"item\" let-columnName=\"columnName\" let-tdContent=\"tdContent\">\r\n <td\r\n [cTableActive]=\"item?.['_cellProps']?.[columnName]?.active ?? item?.['_cellProps']?._all?.active\"\r\n [cTableColor]=\"item?.['_cellProps']?.[columnName]?.color ?? item?.['_cellProps']?._all?.color\"\r\n [cAlign]=\"item?.['_cellProps']?.[columnName]?.align ?? item?.['_cellProps']?._all?.align\"\r\n >\r\n {{tdContent}}\r\n </td>\r\n</ng-template>\r\n\r\n<!--<ng-template #rowDetailsDefaultTemplate let-item let-index>-->\r\n<!-- <tr><td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td></tr>-->\r\n<!-- <tr class=\"p-0\">-->\r\n<!-- <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">-->\r\n<!-- <ng-container *ngTemplateOutlet=\"templates?.tableDetails\"></ng-container>-->\r\n<!-- </td>-->\r\n<!-- </tr>-->\r\n<!--</ng-template>-->\r\n\r\n<ng-template #noItemsDefaultTemplate>\r\n <tr *ngIf=\"!currentItems.length\">\r\n <td [colSpan]=\"colspan\" class=\"justify-content-center\">{{noItemsLabel}}</td>\r\n </tr>\r\n</ng-template>\r\n\r\n<!--todo: filterIconCustomTemplate-->\r\n<ng-template #filterIconTemplate>\r\n <svg class=\"icon icon-custom-size\" role=\"img\" viewBox=\"0 0 512 512\" width=\"18\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <polygon class=\"ci-primary\"\r\n fill=\"var(--ci-primary-color, currentColor)\"\r\n points=\"40 16 40 53.828 109.024 136 150.815 136 76.896 48 459.51 48 304 242.388 304 401.373 241.373 464 240 464 240 368 208 368 208 496 254.627 496 336 414.627 336 253.612 496 53.612 496 16 40 16\"></polygon>\r\n <polygon class=\"ci-primary\"\r\n fill=\"var(--ci-primary-color, currentColor)\"\r\n points=\"166.403 248.225 226.864 187.763 204.237 165.135 143.775 225.597 83.313 165.135 60.687 187.763 121.148 248.225 60.687 308.687 83.313 331.314 143.775 270.852 204.237 331.314 226.864 308.687 166.403 248.225\"></polygon>\r\n </svg>\r\n</ng-template>\r\n", styles: [":host{display:block}\n"], components: [{ type: i1.SmartTableFilterComponent, selector: "c-smart-table-filter", inputs: ["filterLabel", "filterPlaceholder", "value"], outputs: ["valueChange"] }, { type: i2.SmartTableHeadComponent, selector: "c-smart-table-head", inputs: ["columnFilter", "columnFilterState", "columnSorter", "component", "columns", "selectable", "selectAll", "sorterValue"], outputs: ["columnFilterStateChange", "sorterStateChange", "selectAllChange"] }, { type: i3.ElementCoverComponent, selector: "c-element-cover, [cElementCover]", inputs: ["boundaries", "opacity"] }, { type: i4.SmartPaginationComponent, selector: "c-smart-pagination", inputs: ["activePage", "arrows", "doubleArrows", "dots", "limit", "pages", "firstButton", "lastButton", "nextButton", "previousButton", "align", "size", "role"], outputs: ["activePageChange"], exportAs: ["cSmartPagination"] }, { type: i5.SmartTableItemsPerPageSelectorComponent, selector: "c-smart-table-items-per-page-selector", inputs: ["itemsPerPage", "itemsPerPageLabel", "itemsPerPageOptions"], outputs: ["itemsPerPageChange"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.ButtonDirective, selector: "[cButton]", inputs: ["active", "color", "disabled", "shape", "size", "type", "variant"], exportAs: ["cButton"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i8.TableDirective, selector: "table[cTable]", inputs: ["align", "borderColor", "bordered", "borderless", "caption", "color", "hover", "responsive", "small", "striped"] }, { type: i9.HtmlAttributesDirective, selector: "[cHtmlAttr]", inputs: ["cHtmlAttr"], exportAs: ["cHtmlAttr"] }, { type: i10.TableColorDirective, selector: "[cTableColor]", inputs: ["cTableColor"] }, { type: i11.AlignDirective, selector: "[cAlign]", inputs: ["cAlign"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i12.TableActiveDirective, selector: "[cTableActive]", inputs: ["cTableActive"] }, { type: i13.FormCheckInputDirective, selector: "input[cFormCheckInput]", inputs: ["type", "indeterminate", "valid"] }] });
|
|
368
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: SmartTableComponent, decorators: [{
|
|
369
|
+
type: Component,
|
|
370
|
+
args: [{ selector: 'c-smart-table', exportAs: 'cSmartTable', template: "<div *ngIf=\"itemsPerPageSelect || tableFilter || cleaner\" class=\"row my-2 mx-0\">\r\n <ng-template [ngIf]=\"tableFilter || cleaner\">\r\n <div class=\"col-auto p-0\">\r\n <c-smart-table-filter\r\n (valueChange)=\"handleTableFilterChange($event)\"\r\n *ngIf=\"tableFilter\"\r\n [filterLabel]=\"tableFilterLabel\"\r\n [filterPlaceholder]=\"tableFilterPlaceholder\"\r\n [value]=\"tableFilterState ?? ''\"\r\n >\r\n </c-smart-table-filter>\r\n </div>\r\n <div class=\"col-auto p-0\">\r\n <button\r\n (click)=\"clean($event)\"\r\n *ngIf=\"cleaner\"\r\n [disabled]=\"!isFiltered\"\r\n [ngClass]=\"{'ms-1': tableFilter}\"\r\n [tabindex]=\"0\"\r\n cButton\r\n color=\"transparent\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"filterIconTemplate\"></ng-container>\r\n </button>\r\n </div>\r\n </ng-template>\r\n</div>\r\n<div class=\"position-relative\">\r\n <table [align]=\"tableProps?.align\"\r\n [borderColor]=\"tableProps?.borderColor\"\r\n [bordered]=\"tableProps?.bordered\"\r\n [borderless]=\"tableProps?.borderless\"\r\n [caption]=\"tableProps?.caption\"\r\n [color]=\"tableProps?.color\"\r\n [hover]=\"tableProps?.hover\"\r\n [responsive]=\"tableProps?.responsive\"\r\n [small]=\"tableProps?.small\"\r\n [striped]=\"tableProps?.striped\"\r\n [cHtmlAttr]=\"tableProps?.attributes ?? {}\"\r\n [cTableColor]=\"tableProps?.color\"\r\n cTable\r\n >\r\n <c-smart-table-head\r\n (columnFilterStateChange)=\"handleColumnFilterChange($event)\"\r\n (selectAllChange)=\"handleSelectAllChange($event)\"\r\n (sorterStateChange)=\"handleSortChange($event)\"\r\n *ngIf=\"header\"\r\n [columnFilterState]=\"columnFilterState\"\r\n [columnFilter]=\"true\"\r\n [columns]=\"columns\"\r\n [selectAll]=\"selectedAll\"\r\n [selectable]=\"selectable\"\r\n [sorterValue]=\"sorterValue\"\r\n [cHtmlAttr]=\"tableHeadProps?.attributes ?? {}\"\r\n [cTableColor]=\"tableHeadProps?.color\"\r\n [cAlign]=\"tableHeadProps?.align\"\r\n ></c-smart-table-head>\r\n\r\n <ng-container *ngTemplateOutlet=\"tbodyDefaultTemplate\"></ng-container>\r\n\r\n <c-smart-table-head\r\n (selectAllChange)=\"handleSelectAllChange($event)\"\r\n (sorterStateChange)=\"handleSortChange($event)\"\r\n *ngIf=\"footer\"\r\n [columns]=\"columns\"\r\n [selectAll]=\"selectedAll\"\r\n [selectable]=\"selectable\"\r\n [sorterValue]=\"sorterValue\"\r\n [cHtmlAttr]=\"tableFootProps?.attributes ?? {}\"\r\n [cTableColor]=\"tableFootProps?.color\"\r\n [cAlign]=\"tableFootProps?.align\"\r\n component=\"tfoot\"\r\n ></c-smart-table-head>\r\n\r\n </table>\r\n <c-element-cover\r\n *ngIf=\"loading\"\r\n [boundaries]=\"[\r\n { sides: ['top'], query: 'td' },\r\n { sides: ['bottom'], query: 'tbody' }\r\n ]\"\r\n ></c-element-cover>\r\n</div>\r\n<ng-template [ngIf]=\"pagination || itemsPerPageSelect\">\r\n <div class=\"row\">\r\n <div class=\"col\">\r\n <c-smart-pagination\r\n (activePageChange)=\"setActivePage($event)\"\r\n *ngIf=\"pagination && numberOfPages > 1\"\r\n [activePage]=\"activePage\"\r\n [pages]=\"numberOfPages\">\r\n </c-smart-pagination>\r\n </div>\r\n <div class=\"col-auto ms-auto\">\r\n <c-smart-table-items-per-page-selector\r\n (itemsPerPageChange)=\"handleItemsPerPageChange($event)\"\r\n *ngIf=\"itemsPerPageSelect\"\r\n [itemsPerPageLabel]=\"itemsPerPageLabel\"\r\n [itemsPerPageOptions]=\"itemsPerPageOptions\"\r\n [itemsPerPage]=\"itemsPerPage\"\r\n >\r\n </c-smart-table-items-per-page-selector>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #tbodyDefaultTemplate>\r\n <tbody [cHtmlAttr]=\"tableBodyProps?.attributes ?? {}\"\r\n [cTableColor]=\"tableBodyProps?.color\"\r\n [cAlign]=\"tableBodyProps?.align\"\r\n >\r\n <ng-template ngFor let-item [ngForOf]=\"currentItems\" let-cnt=\"count\" let-i=\"index\" let-isEven=\"even\" let-isOdd=\"odd\">\r\n <tr [tabindex]=\"clickableRows ? 0 : -1\"\r\n [ngStyle]=\"{cursor: clickableRows ? 'pointer' : 'auto'}\"\r\n (click)=\"handleRowClick({$event, item, i})\"\r\n [cTableActive]=\"item._props?.active\"\r\n [cTableColor]=\"item._props?.color\"\r\n [cAlign]=\"item._props?.align\"\r\n >\r\n <td *ngIf=\"selectable\"\r\n [cTableActive]=\"item?.['_cellProps']?._all?.active\"\r\n [cTableColor]=\"item?.['_cellProps']?._all?.color\"\r\n [cAlign]=\"item?.['_cellProps']?._all?.align\">\r\n <input (change)=\"handleRowChecked($event, item)\" [checked]=\"item._selected ?? false\" cFormCheckInput>\r\n </td>\r\n <ng-template ngFor let-columnName [ngForOf]=\"rawColumnNames\" let-i=\"index\" >\r\n <ng-container *ngTemplateOutlet=\"templates['tableData'] || columnDefaultTemplate; context: {item, columnName, tdContent: item[columnName] }\"></ng-container>\r\n </ng-template>\r\n </tr>\r\n <ng-template [ngIf]=\"templates['tableDetails']\">\r\n <!-- <ng-container *ngTemplateOutlet=\"rowDetailsDefaultTemplate\"></ng-container>-->\r\n <tr><td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td></tr>\r\n <tr class=\"p-0\">\r\n <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">\r\n <ng-container *ngTemplateOutlet=\"templates['tableDetails']; context: {item, index: i}\"></ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"noItemsDefaultTemplate\"></ng-container>\r\n </tbody>\r\n</ng-template>\r\n\r\n<ng-template #columnDefaultTemplate let-item=\"item\" let-columnName=\"columnName\" let-tdContent=\"tdContent\">\r\n <td\r\n [cTableActive]=\"item?.['_cellProps']?.[columnName]?.active ?? item?.['_cellProps']?._all?.active\"\r\n [cTableColor]=\"item?.['_cellProps']?.[columnName]?.color ?? item?.['_cellProps']?._all?.color\"\r\n [cAlign]=\"item?.['_cellProps']?.[columnName]?.align ?? item?.['_cellProps']?._all?.align\"\r\n >\r\n {{tdContent}}\r\n </td>\r\n</ng-template>\r\n\r\n<!--<ng-template #rowDetailsDefaultTemplate let-item let-index>-->\r\n<!-- <tr><td [colSpan]=\"colspan\" class=\"p-0\" tabindex=\"-1\" [ngStyle]=\"{borderBottomWidth: 0}\"></td></tr>-->\r\n<!-- <tr class=\"p-0\">-->\r\n<!-- <td [colSpan]=\"colspan\" class=\"p-0\" [ngStyle]=\"{border: 0}\">-->\r\n<!-- <ng-container *ngTemplateOutlet=\"templates?.tableDetails\"></ng-container>-->\r\n<!-- </td>-->\r\n<!-- </tr>-->\r\n<!--</ng-template>-->\r\n\r\n<ng-template #noItemsDefaultTemplate>\r\n <tr *ngIf=\"!currentItems.length\">\r\n <td [colSpan]=\"colspan\" class=\"justify-content-center\">{{noItemsLabel}}</td>\r\n </tr>\r\n</ng-template>\r\n\r\n<!--todo: filterIconCustomTemplate-->\r\n<ng-template #filterIconTemplate>\r\n <svg class=\"icon icon-custom-size\" role=\"img\" viewBox=\"0 0 512 512\" width=\"18\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <polygon class=\"ci-primary\"\r\n fill=\"var(--ci-primary-color, currentColor)\"\r\n points=\"40 16 40 53.828 109.024 136 150.815 136 76.896 48 459.51 48 304 242.388 304 401.373 241.373 464 240 464 240 368 208 368 208 496 254.627 496 336 414.627 336 253.612 496 53.612 496 16 40 16\"></polygon>\r\n <polygon class=\"ci-primary\"\r\n fill=\"var(--ci-primary-color, currentColor)\"\r\n points=\"166.403 248.225 226.864 187.763 204.237 165.135 143.775 225.597 83.313 165.135 60.687 187.763 121.148 248.225 60.687 308.687 83.313 331.314 143.775 270.852 204.237 331.314 226.864 308.687 166.403 248.225\"></polygon>\r\n </svg>\r\n</ng-template>\r\n", styles: [":host{display:block}\n"] }]
|
|
371
|
+
}], ctorParameters: function () { return [{ type: i0.IterableDiffers }]; }, propDecorators: { activePage: [{
|
|
372
|
+
type: Input
|
|
373
|
+
}], cleaner: [{
|
|
374
|
+
type: Input
|
|
375
|
+
}], clickableRows: [{
|
|
376
|
+
type: Input
|
|
377
|
+
}], columns: [{
|
|
378
|
+
type: Input
|
|
379
|
+
}], columnFilter: [{
|
|
380
|
+
type: Input
|
|
381
|
+
}], columnFilterValue: [{
|
|
382
|
+
type: Input
|
|
383
|
+
}], columnSorter: [{
|
|
384
|
+
type: Input
|
|
385
|
+
}], footer: [{
|
|
386
|
+
type: Input
|
|
387
|
+
}], header: [{
|
|
388
|
+
type: Input
|
|
389
|
+
}], items: [{
|
|
390
|
+
type: Input
|
|
391
|
+
}], itemsPerPage: [{
|
|
392
|
+
type: Input
|
|
393
|
+
}], itemsPerPageLabel: [{
|
|
394
|
+
type: Input
|
|
395
|
+
}], itemsPerPageOptions: [{
|
|
396
|
+
type: Input
|
|
397
|
+
}], itemsPerPageSelect: [{
|
|
398
|
+
type: Input
|
|
399
|
+
}], loading: [{
|
|
400
|
+
type: Input
|
|
401
|
+
}], noItemsLabel: [{
|
|
402
|
+
type: Input
|
|
403
|
+
}], pagination: [{
|
|
404
|
+
type: Input
|
|
405
|
+
}], selectable: [{
|
|
406
|
+
type: Input
|
|
407
|
+
}], sorterValue: [{
|
|
408
|
+
type: Input
|
|
409
|
+
}], tableFilter: [{
|
|
410
|
+
type: Input
|
|
411
|
+
}], tableFilterLabel: [{
|
|
412
|
+
type: Input
|
|
413
|
+
}], tableFilterPlaceholder: [{
|
|
414
|
+
type: Input
|
|
415
|
+
}], tableFilterValue: [{
|
|
416
|
+
type: Input
|
|
417
|
+
}], tableBodyProps: [{
|
|
418
|
+
type: Input
|
|
419
|
+
}], tableFootProps: [{
|
|
420
|
+
type: Input
|
|
421
|
+
}], tableHeadProps: [{
|
|
422
|
+
type: Input
|
|
423
|
+
}], tableProps: [{
|
|
424
|
+
type: Input
|
|
425
|
+
}], selectedItemsChange: [{
|
|
426
|
+
type: Output
|
|
427
|
+
}], sorterValueChange: [{
|
|
428
|
+
type: Output
|
|
429
|
+
}], activePageChange: [{
|
|
430
|
+
type: Output
|
|
431
|
+
}], itemsPerPageChange: [{
|
|
432
|
+
type: Output
|
|
433
|
+
}], rowClick: [{
|
|
434
|
+
type: Output
|
|
435
|
+
}], columnFilterValueChange: [{
|
|
436
|
+
type: Output
|
|
437
|
+
}], filteredItemsChange: [{
|
|
438
|
+
type: Output
|
|
439
|
+
}], tableFilterValueChange: [{
|
|
440
|
+
type: Output
|
|
441
|
+
}], columnTemplates: [{
|
|
442
|
+
type: ContentChildren,
|
|
443
|
+
args: [TemplateIdDirective]
|
|
444
|
+
}] } });
|
|
445
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9zbWFydC10YWJsZS9zbWFydC10YWJsZS9zbWFydC10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL3NtYXJ0LXRhYmxlL3NtYXJ0LXRhYmxlL3NtYXJ0LXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUlQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBZ0IscUJBQXFCLEVBQUUsb0JBQW9CLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQWdCL0csT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sY0FBYyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFRbkQsTUFBTSxPQUFPLG1CQUFtQjtJQVc5QixZQUNVLFFBQXlCO1FBQXpCLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBZTNCLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBU2hCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFTMUIsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFxQmhDLHVCQUFrQixHQUF1QixFQUFFLENBQUM7UUFXNUMsWUFBTyxHQUFZLEtBQUssQ0FBQztRQVN6QixZQUFPLEdBQVksS0FBSyxDQUFDO1FBU3pCLFdBQU0sR0FBb0IsRUFBZ0MsQ0FBQztRQVMzRCxrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQUUxQixzQkFBaUIsR0FBVyxpQkFBaUIsQ0FBQztRQUM5Qyx3QkFBbUIsR0FBYSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBR2hELGlCQUFZLEdBQThCLGdC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c0JBQTlCLEtBQUs7Z0JBR0YsZ0JBQWdCO3NCQURuQixLQUFLO2dCQVVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUksbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csdUJBQXVCO3NCQUFoQyxNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBRStCLGVBQWU7c0JBQXBELGVBQWU7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlckNvbnRlbnRJbml0LFxyXG4gIENvbXBvbmVudCxcclxuICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIEl0ZXJhYmxlRGlmZmVyLFxyXG4gIEl0ZXJhYmxlRGlmZmVycyxcclxuICBPdXRwdXQsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFR5cGVcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBjb2VyY2VCb29sZWFuUHJvcGVydHksIGNvZXJjZU51bWJlclByb3BlcnR5LCBOdW1iZXJJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XHJcblxyXG5pbXBvcnQgeyBJVGFibGUgfSBmcm9tICcuLi8uLi90YWJsZS90YWJsZS50eXBlJztcclxuaW1wb3J0IHtcclxuICBJQ29sdW1uLFxyXG4gIElDb2x1bW5GaWx0ZXIsXHJcbiAgSUNvbHVtbkZpbHRlclZhbHVlLFxyXG4gIElJdGVtLFxyXG4gIElJdGVtSW50ZXJuYWwsXHJcbiAgSVNtYXJ0VGFibGUsXHJcbiAgSVNvcnRlcixcclxuICBJU29ydGVyVmFsdWUsXHJcbiAgSVRhYmxlRmlsdGVyLFxyXG4gIElUYWJsZUdyb3VwUHJvcHMsXHJcbiAgSXRlbXNQZXJQYWdlU2VsZWN0XHJcbn0gZnJvbSAnLi4vc21hcnQtdGFibGUudHlwZSc7XHJcbmltcG9ydCB7IFRlbXBsYXRlSWREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjLXNtYXJ0LXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc21hcnQtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3NtYXJ0LXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgZXhwb3J0QXM6ICdjU21hcnRUYWJsZSdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNtYXJ0VGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBJU21hcnRUYWJsZSwgQWZ0ZXJDb250ZW50SW5pdCB7XHJcblxyXG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9hY3RpdmVQYWdlOiBOdW1iZXJJbnB1dDtcclxuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfY2xlYW5lcjogQm9vbGVhbklucHV0O1xyXG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9jbGlja2FibGVSb3dzOiBCb29sZWFuSW5wdXQ7XHJcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2Zvb3RlcjogQm9vbGVhbklucHV0O1xyXG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9oZWFkZXI6IEJvb2xlYW5JbnB1dDtcclxuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfaXRlbXNQZXJQYWdlOiBOdW1iZXJJbnB1dDtcclxuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfcGFnaW5hdGlvbjogQm9vbGVhbklucHV0O1xyXG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9zZWxlY3RhYmxlOiBCb29sZWFuSW5wdXQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBpdGVyYWJsZTogSXRlcmFibGVEaWZmZXJzXHJcbiAgKSB7XHJcbiAgICB0aGlzLml0ZXJhYmxlRGlmZmVyID0gdGhpcy5pdGVyYWJsZS5maW5kKHRoaXMuaXRlbXMpLmNyZWF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpdGVyYWJsZURpZmZlcjogSXRlcmFibGVEaWZmZXI8YW55PiB8IG51bGw7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGFjdGl2ZVBhZ2UodmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5fYWN0aXZlUGFnZSA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKSB8fCAxO1xyXG4gICAgdGhpcy5hY3RpdmVQYWdlQ2hhbmdlLmVtaXQodGhpcy5fYWN0aXZlUGFnZSk7XHJcbiAgfVxyXG4gIGdldCBhY3RpdmVQYWdlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlUGFnZTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfYWN0aXZlUGFnZSA9IDE7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGNsZWFuZXIodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2NsZWFuZXIgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xyXG4gIH1cclxuICBnZXQgY2xlYW5lcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jbGVhbmVyO1xyXG4gIH1cclxuICBwcml2YXRlIF9jbGVhbmVyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGNsaWNrYWJsZVJvd3ModmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2NsaWNrYWJsZVJvd3MgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xyXG4gIH1cclxuICBnZXQgY2xpY2thYmxlUm93cygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jbGlja2FibGVSb3dzO1xyXG4gIH1cclxuICBwcml2YXRlIF9jbGlja2FibGVSb3dzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGNvbHVtbnModmFsdWUpIHtcclxuICAgIHRoaXMuX2NvbHVtbnMgPSB2YWx1ZTtcclxuICB9XHJcbiAgZ2V0IGNvbHVtbnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucyB8fCB0aGlzLnJhd0NvbHVtbk5hbWVzO1xyXG4gIH1cclxuICBwcml2YXRlIF9jb2x1bW5zPzogKHN0cmluZyB8IElDb2x1bW4pW107XHJcblxyXG4gIEBJbnB1dCgpIGNvbHVtbkZpbHRlcj86IGJvb2xlYW4gfCBJQ29sdW1uRmlsdGVyO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBjb2x1bW5GaWx0ZXJWYWx1ZSh2YWx1ZTogSUNvbHVtbkZpbHRlclZhbHVlKSB7XHJcbiAgICB0aGlzLl9jb2x1bW5GaWx0ZXJWYWx1ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5jb2x1bW5GaWx0ZXJWYWx1ZUNoYW5nZS5lbWl0KHsgLi4udmFsdWUgfSk7XHJcbiAgfVxyXG4gIGdldCBjb2x1bW5GaWx0ZXJWYWx1ZSgpOiBJQ29sdW1uRmlsdGVyVmFsdWUge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbkZpbHRlclZhbHVlO1xyXG4gIH1cclxuICBwcml2YXRlIF9jb2x1bW5GaWx0ZXJWYWx1ZTogSUNvbHVtbkZpbHRlclZhbHVlID0ge307XHJcblxyXG4gIEBJbnB1dCgpIGNvbHVtblNvcnRlcj86IGJvb2xlYW4gfCBJU29ydGVyO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBmb290ZXIodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2Zvb3RlciA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XHJcbiAgfVxyXG4gIGdldCBmb290ZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZm9vdGVyO1xyXG4gIH1cclxuICBwcml2YXRlIF9mb290ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgaGVhZGVyKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9oZWFkZXIgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xyXG4gIH1cclxuICBnZXQgaGVhZGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlcjtcclxuICB9XHJcbiAgcHJpdmF0ZSBfaGVhZGVyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGl0ZW1zKHZhbHVlOiBJSXRlbVtdKSB7XHJcbiAgICB0aGlzLl9pdGVtcyA9IHRoaXMuc2V0SXRlbXModmFsdWUpIGFzIEFycmF5PFR5cGU8SUl0ZW1JbnRlcm5hbD4+O1xyXG4gIH1cclxuICBnZXQgaXRlbXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faXRlbXM7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2l0ZW1zOiBJSXRlbUludGVybmFsW10gPSBbXSBhcyBBcnJheTxUeXBlPElJdGVtSW50ZXJuYWw+PjtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgaXRlbXNQZXJQYWdlKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2l0ZW1zUGVyUGFnZSA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKTtcclxuICB9XHJcbiAgZ2V0IGl0ZW1zUGVyUGFnZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zUGVyUGFnZTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfaXRlbXNQZXJQYWdlOiBudW1iZXIgPSAxMDtcclxuXHJcbiAgQElucHV0KCkgaXRlbXNQZXJQYWdlTGFiZWw6IHN0cmluZyA9ICdJdGVtcyBwZXIgcGFnZTonO1xyXG4gIEBJbnB1dCgpIGl0ZW1zUGVyUGFnZU9wdGlvbnM6IG51bWJlcltdID0gWzUsIDEwLCAyMCwgNTBdO1xyXG4gIEBJbnB1dCgpIGl0ZW1zUGVyUGFnZVNlbGVjdD86IGJvb2xlYW4gfCBJdGVtc1BlclBhZ2VTZWxlY3Q7XHJcbiAgQElucHV0KCkgbG9hZGluZz86IGJvb2xlYW47XHJcbiAgQElucHV0KCkgbm9JdGVtc0xhYmVsOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+ID0gJ05vIGl0ZW1zIGZvdW5kJztcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgcGFnaW5hdGlvbih2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fcGFnaW5hdGlvbiA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XHJcbiAgfVxyXG4gIGdldCBwYWdpbmF0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZ2luYXRpb247XHJcbiAgfVxyXG4gIHByaXZhdGUgX3BhZ2luYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgc2VsZWN0YWJsZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fc2VsZWN0YWJsZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XHJcbiAgfVxyXG4gIGdldCBzZWxlY3RhYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGFibGU7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3NlbGVjdGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgc29ydGVyVmFsdWUodmFsdWU6IElTb3J0ZXJWYWx1ZSkge1xyXG4gICAgdGhpcy5fc29ydGVyVmFsdWUgPSB2YWx1ZTtcclxuICAgIHRoaXMuc29ydGVyVmFsdWVDaGFuZ2UuZW1pdCh7IC4uLnZhbHVlIH0pO1xyXG4gIH1cclxuICBnZXQgc29ydGVyVmFsdWUoKTogSVNvcnRlclZhbHVlIHtcclxuICAgIHJldHVybiB0aGlzLl9zb3J0ZXJWYWx1ZTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfc29ydGVyVmFsdWU6IElTb3J0ZXJWYWx1ZSA9IHt9O1xyXG5cclxuICBASW5wdXQoKSB0YWJsZUZpbHRlcj86IGJvb2xlYW4gfCBJVGFibGVGaWx0ZXI7XHJcbiAgQElucHV0KCkgdGFibGVGaWx0ZXJMYWJlbCA9ICdGaWx0ZXI6JztcclxuICBASW5wdXQoKSB0YWJsZUZpbHRlclBsYWNlaG9sZGVyID0gJ3R5cGUgc3RyaW5nLi4uJztcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgdGFibGVGaWx0ZXJWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl90YWJsZUZpbHRlclZhbHVlID0gdmFsdWU7XHJcbiAgICB0aGlzLnRhYmxlRmlsdGVyVmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcbiAgfVxyXG4gIGdldCB0YWJsZUZpbHRlclZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFibGVGaWx0ZXJWYWx1ZTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfdGFibGVGaWx0ZXJWYWx1ZTogc3RyaW5nID0gJyc7XHJcblxyXG4gIEBJbnB1dCgpIHRhYmxlQm9keVByb3BzPzogSVRhYmxlR3JvdXBQcm9wcyA9IHt9O1xyXG4gIEBJbnB1dCgpIHRhYmxlRm9vdFByb3BzPzogSVRhYmxlR3JvdXBQcm9wcyA9IHt9O1xyXG4gIEBJbnB1dCgpIHRhYmxlSGVhZFByb3BzPzogSVRhYmxlR3JvdXBQcm9wcyA9IHt9O1xyXG4gIEBJbnB1dCgpIHRhYmxlUHJvcHM/OiBJVGFibGUgPSB7fTtcclxuXHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkSXRlbXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHNvcnRlclZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBhY3RpdmVQYWdlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBpdGVtc1BlclBhZ2VDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHJvd0NsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBjb2x1bW5GaWx0ZXJWYWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgZmlsdGVyZWRJdGVtc0NoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgdGFibGVGaWx0ZXJWYWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQENvbnRlbnRDaGlsZHJlbihUZW1wbGF0ZUlkRGlyZWN0aXZlKSBjb2x1bW5UZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8VGVtcGxhdGVJZERpcmVjdGl2ZT47XHJcbiAgdGVtcGxhdGVzOiB7IFtrZXk6IHN0cmluZ106IChUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCkgfSA9IHsgdGFibGVEZXRhaWxzOiBudWxsLCB0YWJsZURhdGE6IG51bGwgfTtcclxuXHJcbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb2x1bW5UZW1wbGF0ZXMuZm9yRWFjaCgoY2hpbGQ6IFRlbXBsYXRlSWREaXJlY3RpdmUpID0+IHtcclxuICAgICAgdGhpcy50ZW1wbGF0ZXNbY2hpbGQuaWRdID0gY2hpbGQudGVtcGxhdGVSZWY7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZEFsbCgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5pdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uX3NlbGVjdGVkID09PSB0cnVlKTtcclxuICAgIHJldHVybiBzZWxlY3RlZC5sZW5ndGggPT09IDAgPyBmYWxzZSA6IHNlbGVjdGVkLmxlbmd0aCA9PT0gdGhpcy5pdGVtcy5sZW5ndGggPyB0cnVlIDogJ2luZGV0ZXJtaW5hdGUnO1xyXG4gICAgLy8gcmV0dXJuIHRoaXMuX3NlbGVjdGVkQWxsO1xyXG4gIH1cclxuICBzZXQgc2VsZWN0ZWRBbGwodmFsdWUpIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5pdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uX3NlbGVjdGVkID09PSB0cnVlKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZS5lbWl0KHNlbGVjdGVkKTtcclxuICAgIHRoaXMuX3NlbGVjdGVkQWxsID0gc2VsZWN0ZWQubGVuZ3RoID09PSAwID8gZmFsc2UgOiBzZWxlY3RlZC5sZW5ndGggPT09IHRoaXMuaXRlbXMubGVuZ3RoID8gdHJ1ZSA6ICdpbmRldGVybWluYXRlJztcclxuICB9XHJcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRBbGw6IChib29sZWFuIHwgc3RyaW5nKSA9IGZhbHNlO1xyXG5cclxuICBnZXQgdGFibGVGaWx0ZXJTdGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnRhYmxlRmlsdGVyVmFsdWUgPyB0aGlzLnRhYmxlRmlsdGVyVmFsdWUgOiAnJztcclxuICB9XHJcblxyXG4gIGdldCBjb2x1bW5GaWx0ZXJTdGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbHVtbkZpbHRlclZhbHVlID8gdGhpcy5jb2x1bW5GaWx0ZXJWYWx1ZSA6IHt9O1xyXG4gIH1cclxuXHJcbiAgZ2V0IG51bWJlck9mUGFnZXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9pdGVtc1BlclBhZ2UgPyBNYXRoLmNlaWwodGhpcy5zb3J0ZWRJdGVtcy5sZW5ndGggLyB0aGlzLl9pdGVtc1BlclBhZ2UpIDogMTtcclxuICB9XHJcblxyXG4gIGdldCBjb2xzcGFuKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0YWJsZSA/IHRoaXMucmF3Q29sdW1uTmFtZXMubGVuZ3RoICsgMSA6IHRoaXMucmF3Q29sdW1uTmFtZXMubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpcnN0SXRlbU9uQWN0aXZlUGFnZUluZGV4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlUGFnZSA/ICh0aGlzLl9hY3RpdmVQYWdlIC0gMSkgKiB0aGlzLl9pdGVtc1BlclBhZ2UgOiAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGl0ZW1zT25BY3RpdmVQYWdlKCk6IElJdGVtSW50ZXJuYWxbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5zb3J0ZWRJdGVtcy5zbGljZShcclxuICAgICAgdGhpcy5maXJzdEl0ZW1PbkFjdGl2ZVBhZ2VJbmRleCxcclxuICAgICAgdGhpcy5maXJzdEl0ZW1PbkFjdGl2ZVBhZ2VJbmRleCArIHRoaXMuX2l0ZW1zUGVyUGFnZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldCBjdXJyZW50SXRlbXMoKTogSUl0ZW1JbnRlcm5hbFtdIHtcclxuICAgIHJldHVybiB0aGlzLl9hY3RpdmVQYWdlID8gdGhpcy5pdGVtc09uQWN0aXZlUGFnZSA6IHRoaXMuc29ydGVkSXRlbXMgPz8gW107XHJcbiAgICAvLyByZXR1cm4gdGhpcy5pdGVtcyA/PyBbXTtcclxuICB9XHJcblxyXG4gIGdldCBnZW5Db2xzKCkge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2l0ZW1zID8gdGhpcy5faXRlbXNbMF0gPz8ge30gOiB7fSkuZmlsdGVyKChlbCkgPT4gZWwuY2hhckF0KDApICE9PSAnXycpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJhd0NvbHVtbk5hbWVzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnNcclxuICAgICAgPyB0aGlzLl9jb2x1bW5zLm1hcCgoY29sdW1uOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIGNvbHVtbiA9PT0gJ29iamVjdCcpIHJldHVybiBjb2x1bW4ua2V5O1xyXG4gICAgICAgIGVsc2UgcmV0dXJuIGNvbHVtbjtcclxuICAgICAgfSlcclxuICAgICAgOiB0aGlzLmdlbkNvbHM7XHJcbiAgfVxyXG5cclxuICBnZXQgaXRlbXNEYXRhQ29sdW1ucygpIHtcclxuICAgIHJldHVybiB0aGlzLnJhd0NvbHVtbk5hbWVzLmZpbHRlcigobmFtZSkgPT4gdGhpcy5nZW5Db2xzLmluY2x1ZGVzKG5hbWUpKTtcclxuICB9XHJcblxyXG4gIGdldCBzb3J0ZWRJdGVtcygpOiBJSXRlbUludGVybmFsW10ge1xyXG4gICAgY29uc3QgY29sID0gdGhpcy5zb3J0ZXJWYWx1ZS5jb2x1bW47XHJcbiAgICBpZiAoXHJcbiAgICAgICFjb2wgfHxcclxuICAgICAgIXRoaXMuaXRlbXNEYXRhQ29sdW1ucy5pbmNsdWRlcyhjb2wpIHx8XHJcbiAgICAgICh0aGlzLmNvbHVtblNvcnRlciAmJlxyXG4gICAgICAgIHR5cGVvZiB0aGlzLmNvbHVtblNvcnRlciA9PT0gJ29iamVjdCcgJiZcclxuICAgICAgICB0aGlzLmNvbHVtblNvcnRlci5leHRlcm5hbClcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdGhpcy50YWJsZUZpbHRlcmVkO1xyXG4gICAgfVxyXG4gICAgLy9pZiB2YWx1ZXMgaW4gY29sdW1uIGFyZSB0byBiZSBzb3J0ZWQgYnkgbnVtZXJpYyB2YWx1ZSB0aGV5IGFsbCBoYXZlIHRvIGJlIHR5cGUgbnVtYmVyXHJcbiAgICAvLyBjb25zdCBmbGlwID0gc29ydGVyU3RhdGUuYXNjID8gMSA6IC0xXHJcbiAgICBjb25zdCBmbGlwID0gdGhpcy5zb3J0ZXJWYWx1ZS5zdGF0ZSA9PT0gJ2FzYycgPyAxIDogdGhpcy5zb3J0ZXJWYWx1ZS5zdGF0ZSA9PT0gJ2Rlc2MnID8gLTEgOiAwO1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgY29uc3Qgc29ydGVkID0gdGhpcy50YWJsZUZpbHRlcmVkLnNsaWNlKCkuc29ydCgoaXRlbTogeyBbeDogc3RyaW5nXTogYW55OyB9LCBpdGVtMjogeyBbeDogc3RyaW5nXTogYW55OyB9KSA9PiB7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gaXRlbVtjb2xdO1xyXG4gICAgICBjb25zdCB2YWx1ZTIgPSBpdGVtMltjb2xdO1xyXG4gICAgICBjb25zdCBhID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBjb25zdCBiID0gdHlwZW9mIHZhbHVlMiA9PT0gJ251bWJlcicgPyB2YWx1ZTIgOiBTdHJpbmcodmFsdWUyKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICByZXR1cm4gYSA+IGIgPyAxICogZmxpcCA6IGIgPiBhID8gLTEgKiBmbGlwIDogMDtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHNvcnRlZDtcclxuICB9XHJcblxyXG4gIGdldCBjb2x1bW5GaWx0ZXJlZCgpOiBJSXRlbUludGVybmFsW10ge1xyXG4gICAgbGV0IF9pdGVtcyA9IHRoaXMuX2l0ZW1zO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmNvbHVtbkZpbHRlciAmJlxyXG4gICAgICB0eXBlb2YgdGhpcy5jb2x1bW5GaWx0ZXIgPT09ICdvYmplY3QnICYmXHJcbiAgICAgIHRoaXMuY29sdW1uRmlsdGVyLmV4dGVybmFsXHJcbiAgICApIHtcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICByZXR1cm4gX2l0ZW1zO1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5jb2x1bW5GaWx0ZXJTdGF0ZSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbkZpbHRlciA9IFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgaWYgKGNvbHVtbkZpbHRlciAmJiB0aGlzLml0ZW1zRGF0YUNvbHVtbnMuaW5jbHVkZXMoa2V5KSkge1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBfaXRlbXMgPSBfaXRlbXMuZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKGl0ZW1ba2V5XSkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhjb2x1bW5GaWx0ZXIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIC8vIEB0cy1pZ25vcmVcclxuICAgIHJldHVybiBfaXRlbXM7XHJcbiAgfVxyXG5cclxuICBnZXQgdGFibGVGaWx0ZXJlZCgpOiBJSXRlbUludGVybmFsW10ge1xyXG4gICAgbGV0IGl0ZW1zID0gdGhpcy5jb2x1bW5GaWx0ZXJlZDtcclxuICAgIGlmIChcclxuICAgICAgIXRoaXMudGFibGVGaWx0ZXJTdGF0ZSB8fFxyXG4gICAgICAodGhpcy50YWJsZUZpbHRlciAmJiB0eXBlb2YgdGhpcy50YWJsZUZpbHRlciA9PT0gJ29iamVjdCcgJiYgdGhpcy50YWJsZUZpbHRlci5leHRlcm5hbClcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICB9XHJcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLnRhYmxlRmlsdGVyU3RhdGUudG9Mb3dlckNhc2UoKTtcclxuICAgIGNvbnN0IHZhbHVlQ29udGFpbkZpbHRlciA9ICh2YWw6IGFueSkgPT4gU3RyaW5nKHZhbCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIpO1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoKGl0ZW06IHsgW3g6IHN0cmluZ106IGFueTsgfSkgPT4ge1xyXG4gICAgICByZXR1cm4gISF0aGlzLml0ZW1zRGF0YUNvbHVtbnMuZmluZCgoa2V5KSA9PiB2YWx1ZUNvbnRhaW5GaWx0ZXIoaXRlbVtrZXldKSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZmlsdGVyZWRJdGVtc0NoYW5nZS5lbWl0KGl0ZW1zKTtcclxuICAgIHJldHVybiBpdGVtcztcclxuICB9XHJcblxyXG4gIGdldCBpc0ZpbHRlcmVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGFibGVGaWx0ZXJTdGF0ZSB8fCB0aGlzLnNvcnRlclZhbHVlPy5jb2x1bW4gfHwgT2JqZWN0LnZhbHVlcyh0aGlzLmNvbHVtbkZpbHRlclN0YXRlKS5qb2luKCcnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0SXRlbXMoaXRlbXM6IElJdGVtW10pIHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xyXG4gICAgICByZXR1cm4gaXRlbXMubWFwKChpdGVtOiBJSXRlbSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIHJldHVybiB7IC4uLml0ZW0sIF9pZDogaW5kZXggfTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gPElJdGVtSW50ZXJuYWw+W107XHJcbiAgfVxyXG5cclxuICBoYW5kbGVTb3J0Q2hhbmdlKCRldmVudDogeyBjb2x1bW5LZXk6IHN0cmluZzsgaW5kZXg6IG51bWJlcjsgfSkge1xyXG4gICAgdGhpcy5oYW5kbGVTb3J0ZXJDaGFuZ2UoJGV2ZW50LmNvbHVtbktleSwgJGV2ZW50LmluZGV4KTtcclxuICB9XHJcblxyXG4gIGlzU29ydGFibGUoaTogbnVtYmVyKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XHJcbiAgICBjb25zdCBpc0RhdGFDb2x1bW4gPSB0aGlzLml0ZW1zRGF0YUNvbHVtbnMuaW5jbHVkZXModGhpcy5yYXdDb2x1bW5OYW1lc1tpXSk7XHJcbiAgICBsZXQgY29sdW1uO1xyXG4gICAgaWYgKHRoaXMuY29sdW1ucykgY29sdW1uID0gdGhpcy5jb2x1bW5zW2ldO1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5jb2x1bW5Tb3J0ZXIgJiZcclxuICAgICAgKCF0aGlzLmNvbHVtbnMgfHxcclxuICAgICAgICB0eXBlb2YgY29sdW1uICE9PSAnb2JqZWN0JyB8fFxyXG4gICAgICAgICh0eXBlb2YgY29sdW1uID09PSAnb2JqZWN0JyAmJlxyXG4gICAgICAgICAgKHR5cGVvZiBjb2x1bW4uc29ydGVyID09PSAndW5kZWZpbmVkJyB8fCBjb2x1bW4uc29ydGVyKSkpICYmXHJcbiAgICAgIGlzRGF0YUNvbHVtblxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVNvcnRlckNoYW5nZShjb2x1bW46IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzU29ydGFibGUoaW5kZXgpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vaWYgY29sdW1uIGNoYW5nZWQgb3Igc29ydCB3YXMgZGVzY2VuZGluZyBjaGFuZ2UgYXNjIHRvIHRydWVcclxuICAgIGNvbnN0IHN0YXRlID0geyAuLi50aGlzLnNvcnRlclZhbHVlIH07XHJcblxyXG4gICAgaWYgKHN0YXRlLmNvbHVtbiA9PT0gY29sdW1uKSB7XHJcbiAgICAgIGlmIChzdGF0ZS5zdGF0ZSA9PT0gMCkge1xyXG4gICAgICAgIHN0YXRlLnN0YXRlID0gJ2FzYyc7XHJcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuc3RhdGUgPT09ICdhc2MnKSB7XHJcbiAgICAgICAgc3RhdGUuc3RhdGUgPSAnZGVzYyc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbHVtblNvcnRlciA9PT0gJ29iamVjdCcgJiYgIXRoaXMuY29sdW1uU29ydGVyLnJlc2V0YWJsZSkge1xyXG4gICAgICAgICAgc3RhdGUuc3RhdGUgPSAnYXNjJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc3RhdGUuc3RhdGUgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc3RhdGUuY29sdW1uID0gY29sdW1uO1xyXG4gICAgICBzdGF0ZS5zdGF0ZSA9ICdhc2MnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zb3J0ZXJWYWx1ZSA9IHsgLi4uc3RhdGUgfTtcclxuICB9XHJcblxyXG4gIHNldEFjdGl2ZVBhZ2UoJGV2ZW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMuYWN0aXZlUGFnZSA9ICRldmVudDtcclxuICB9XHJcblxyXG4gIGhhbmRsZUNvbHVtbkZpbHRlckNoYW5nZSgkZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc3QgeyBjb2x1bW4sIHZhbHVlIH0gPSAkZXZlbnQ7XHJcbiAgICBjb25zdCBpc0xhenkgPSB0aGlzLmNvbHVtbkZpbHRlciAmJiB0eXBlb2YgdGhpcy5jb2x1bW5GaWx0ZXIgPT09ICdvYmplY3QnICYmIHRoaXMuY29sdW1uRmlsdGVyLmxhenkgPT09IHRydWU7XHJcbiAgICAvLyBpZiAoKGlzTGF6eSAmJiB0eXBlID09PSAnaW5wdXQnKSB8fCAoIWlzTGF6eSAmJiB0eXBlID09PSAnY2hhbmdlJykpIHtcclxuICAgIGlmIChpc0xhenkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRBY3RpdmVQYWdlKDEpO1xyXG4gICAgdGhpcy5jb2x1bW5GaWx0ZXJWYWx1ZSA9IHsgLi4udGhpcy5jb2x1bW5GaWx0ZXJWYWx1ZSwgW2Ake2NvbHVtbn1gXTogdmFsdWUgfTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVRhYmxlRmlsdGVyQ2hhbmdlKCRldmVudDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBpc0xhenkgPSB0aGlzLnRhYmxlRmlsdGVyICYmIHR5cGVvZiB0aGlzLnRhYmxlRmlsdGVyID09PSAnb2JqZWN0JyAmJiB0aGlzLnRhYmxlRmlsdGVyLmxhenkgPT09IHRydWU7XHJcbiAgICAvLyBpZiAoKGlzTGF6eSAmJiB0eXBlID09PSAnaW5wdXQnKSB8fCAoIWlzTGF6eSAmJiB0eXBlID09PSAnY2hhbmdlJykpIHtcclxuICAgIGlmIChpc0xhenkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRBY3RpdmVQYWdlKDEpO1xyXG4gICAgdGhpcy50YWJsZUZpbHRlclZhbHVlID0gJGV2ZW50O1xyXG4gIH1cclxuXHJcbiAgY2xlYW4oJGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICB0aGlzLnRhYmxlRmlsdGVyVmFsdWUgPSAnJztcclxuICAgIHRoaXMuY29sdW1uRmlsdGVyVmFsdWUgPSB7fTtcclxuICAgIHRoaXMuc29ydGVyVmFsdWUgPSB7fTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUl0ZW1zUGVyUGFnZUNoYW5nZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuX2l0ZW1zUGVyUGFnZSkge1xyXG4gICAgICB0aGlzLnNldEFjdGl2ZVBhZ2UoMSk7XHJcbiAgICAgIHRoaXMuX2l0ZW1zUGVyUGFnZSA9IHZhbHVlO1xyXG4gICAgICB0aGlzLml0ZW1zUGVyUGFnZUNoYW5nZS5lbWl0KHZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZVJvd0NoZWNrZWQoJGV2ZW50OiBFdmVudCwgaXRlbTogSUl0ZW1JbnRlcm5hbCkge1xyXG4gICAgaXRlbS5fc2VsZWN0ZWQgPSAoJGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLml0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5fc2VsZWN0ZWQgPT09IHRydWUpO1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlLmVtaXQoc2VsZWN0ZWQpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlU2VsZWN0QWxsQ2hhbmdlKCRldmVudDogYW55KSB7XHJcbiAgICB0aGlzLl9pdGVtcyA9IHRoaXMuaXRlbXMubWFwKChpdGVtOiBJSXRlbUludGVybmFsKSA9PiB7XHJcbiAgICAgIHJldHVybiB7IC4uLml0ZW0sIF9zZWxlY3RlZDogJGV2ZW50IH07XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc2VsZWN0ZWRBbGwgPSAkZXZlbnQ7XHJcbiAgfVxyXG5cclxuICAvLyB0YWJsZURhdGFDZWxsUHJvcHMoaXRlbTogSUl0ZW0sIGNvbE5hbWU6IHN0cmluZykge1xyXG4gIC8vICAgY29uc3QgcHJvcHMgPSBpdGVtWydfY2VsbFByb3BzJ10gJiYge1xyXG4gIC8vICAgICAuLi4oaXRlbVsnX2NlbGxQcm9wcyddWydhbGwnXSAmJiB7IC4uLml0ZW1bJ19jZWxsUHJvcHMnXVsnYWxsJ10gfSksXHJcbiAgLy8gICAgIC4uLihpdGVtWydfY2VsbFByb3BzJ11bY29sTmFtZV0gJiYgeyAuLi5pdGVtWydfY2VsbFByb3BzJ11bY29sTmFtZV0gfSksXHJcbiAgLy8gICB9XHJcbiAgLy8gICBjb25zb2xlLmxvZygndGFibGVEYXRhQ2VsbFByb3BzJywgcHJvcHMpXHJcbiAgLy8gICByZXR1cm4gcHJvcHNcclxuICAvLyB9XHJcblxyXG4gIGdldENvbHVtbk5hbWUoJGV2ZW50OiBNb3VzZUV2ZW50KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHRhcmdldCA9ICRldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudDtcclxuICAgIGNvbnN0IGNsb3Nlc3QgPSB0YXJnZXQuY2xvc2VzdCgndHInKTtcclxuICAgIGNvbnN0IGNoaWxkcmVuID0gY2xvc2VzdCA/IEFycmF5LmZyb20oY2xvc2VzdC5jaGlsZHJlbikgOiBbXTtcclxuICAgIGNvbnN0IGNsaWNrZWRDZWxsID0gY2hpbGRyZW4uZmlsdGVyKChjaGlsZCkgPT4gY2hpbGQuY29udGFpbnModGFyZ2V0KSlbMF07XHJcbiAgICByZXR1cm4gdGhpcy5yYXdDb2x1bW5OYW1lc1tjaGlsZHJlbi5pbmRleE9mKGNsaWNrZWRDZWxsKSAtICh0aGlzLl9zZWxlY3RhYmxlID8gMSA6IDApXTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVJvd0NsaWNrKHBhcmFtOiB7ICRldmVudDogTW91c2VFdmVudDsgaXRlbTogSUl0ZW1JbnRlcm5hbDsgaTogbnVtYmVyIH0pIHtcclxuICAgIGNvbnN0IHsgJGV2ZW50LCBpdGVtLCBpIH0gPSB7IC4uLnBhcmFtIH07XHJcbiAgICBjb25zdCBjb2x1bW5OYW1lID0gdGhpcy5nZXRDb2x1bW5OYW1lKHBhcmFtLiRldmVudCk7XHJcbiAgICB0aGlzLnJvd0NsaWNrLmVtaXQoeyBpdGVtOiBpdGVtLCBpbmRleDogaSArIHRoaXMuZmlyc3RJdGVtT25BY3RpdmVQYWdlSW5kZXgsIGNvbHVtbk5hbWUsIGV2ZW50OiAkZXZlbnQgfSk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgKm5nSWY9XCJpdGVtc1BlclBhZ2VTZWxlY3QgfHwgdGFibGVGaWx0ZXIgfHwgY2xlYW5lclwiIGNsYXNzPVwicm93IG15LTIgbXgtMFwiPlxyXG4gIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJ0YWJsZUZpbHRlciB8fCBjbGVhbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gcC0wXCI+XHJcbiAgICAgIDxjLXNtYXJ0LXRhYmxlLWZpbHRlclxyXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVUYWJsZUZpbHRlckNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAqbmdJZj1cInRhYmxlRmlsdGVyXCJcclxuICAgICAgICBbZmlsdGVyTGFiZWxdPVwidGFibGVGaWx0ZXJMYWJlbFwiXHJcbiAgICAgICAgW2ZpbHRlclBsYWNlaG9sZGVyXT1cInRhYmxlRmlsdGVyUGxhY2Vob2xkZXJcIlxyXG4gICAgICAgIFt2YWx1ZV09XCJ0YWJsZUZpbHRlclN0YXRlID8/ICcnXCJcclxuICAgICAgPlxyXG4gICAgICA8L2Mtc21hcnQtdGFibGUtZmlsdGVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gcC0wXCI+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICAoY2xpY2spPVwiY2xlYW4oJGV2ZW50KVwiXHJcbiAgICAgICAgKm5nSWY9XCJjbGVhbmVyXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiIWlzRmlsdGVyZWRcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cInsnbXMtMSc6IHRhYmxlRmlsdGVyfVwiXHJcbiAgICAgICAgW3RhYmluZGV4XT1cIjBcIlxyXG4gICAgICAgIGNCdXR0b25cclxuICAgICAgICBjb2xvcj1cInRyYW5zcGFyZW50XCJcclxuICAgICAgPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmaWx0ZXJJY29uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgPHRhYmxlIFthbGlnbl09XCJ0YWJsZVByb3BzPy5hbGlnblwiXHJcbiAgICAgICAgIFtib3JkZXJDb2xvcl09XCJ0YWJsZVByb3BzPy5ib3JkZXJDb2xvclwiXHJcbiAgICAgICAgIFtib3JkZXJlZF09XCJ0YWJsZVByb3BzPy5ib3JkZXJlZFwiXHJcbiAgICAgICAgIFtib3JkZXJsZXNzXT1cInRhYmxlUHJvcHM/LmJvcmRlcmxlc3NcIlxyXG4gICAgICAgICBbY2FwdGlvbl09XCJ0YWJsZVByb3BzPy5jYXB0aW9uXCJcclxuICAgICAgICAgW2NvbG9yXT1cInRhYmxlUHJvcHM/LmNvbG9yXCJcclxuICAgICAgICAgW2hvdmVyXT1cInRhYmxlUHJvcHM/LmhvdmVyXCJcclxuICAgICAgICAgW3Jlc3BvbnNpdmVdPVwidGFibGVQcm9wcz8ucmVzcG9uc2l2ZVwiXHJcbiAgICAgICAgIFtzbWFsbF09XCJ0YWJsZVByb3BzPy5zbWFsbFwiXHJcbiAgICAgICAgIFtzdHJpcGVkXT1cInRhYmxlUHJvcHM/LnN0cmlwZWRcIlxyXG4gICAgICAgICBbY0h0bWxBdHRyXT1cInRhYmxlUHJvcHM/LmF0dHJpYnV0ZXMgPz8ge31cIlxyXG4gICAgICAgICBbY1RhYmxlQ29sb3JdPVwidGFibGVQcm9wcz8uY29sb3JcIlxyXG4gICAgICAgICBjVGFibGVcclxuICA+XHJcbiAgICA8Yy1zbWFydC10YWJsZS1oZWFkXHJcbiAgICAgIChjb2x1bW5GaWx0ZXJTdGF0ZUNoYW5nZSk9XCJoYW5kbGVDb2x1bW5GaWx0ZXJDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgIChzZWxlY3RBbGxDaGFuZ2UpPVwiaGFuZGxlU2VsZWN0QWxsQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAoc29ydGVyU3RhdGVDaGFuZ2UpPVwiaGFuZGxlU29ydENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgKm5nSWY9XCJoZWFkZXJcIlxyXG4gICAgICBbY29sdW1uRmlsdGVyU3RhdGVdPVwiY29sdW1uRmlsdGVyU3RhdGVcIlxyXG4gICAgICBbY29sdW1uRmlsdGVyXT1cInRydWVcIlxyXG4gICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcclxuICAgICAgW3NlbGVjdEFsbF09XCJzZWxlY3RlZEFsbFwiXHJcbiAgICAgIFtzZWxlY3RhYmxlXT1cInNlbGVjdGFibGVcIlxyXG4gICAgICBbc29ydGVyVmFsdWVdPVwic29ydGVyVmFsdWVcIlxyXG4gICAgICBbY0h0bWxBdHRyXT1cInRhYmxlSGVhZFByb3BzPy5hdHRyaWJ1dGVzID8/IHt9XCJcclxuICAgICAgW2NUYWJsZUNvbG9yXT1cInRhYmxlSGVhZFByb3BzPy5jb2xvclwiXHJcbiAgICAgIFtjQWxpZ25dPVwidGFibGVIZWFkUHJvcHM/LmFsaWduXCJcclxuICAgID48L2Mtc21hcnQtdGFibGUtaGVhZD5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGJvZHlEZWZhdWx0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8Yy1zbWFydC10YWJsZS1oZWFkXHJcbiAgICAgIChzZWxlY3RBbGxDaGFuZ2UpPVwiaGFuZGxlU2VsZWN0QWxsQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAoc29ydGVyU3RhdGVDaGFuZ2UpPVwiaGFuZGxlU29ydENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgKm5nSWY9XCJmb290ZXJcIlxyXG4gICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcclxuICAgICAgW3NlbGVjdEFsbF09XCJzZWxlY3RlZEFsbFwiXHJcbiAgICAgIFtzZWxlY3RhYmxlXT1cInNlbGVjdGFibGVcIlxyXG4gICAgICBbc29ydGVyVmFsdWVdPVwic29ydGVyVmFsdWVcIlxyXG4gICAgICBbY0h0bWxBdHRyXT1cInRhYmxlRm9vdFByb3BzPy5hdHRyaWJ1dGVzID8/IHt9XCJcclxuICAgICAgW2NUYWJsZUNvbG9yXT1cInRhYmxlRm9vdFByb3BzPy5jb2xvclwiXHJcbiAgICAgIFtjQWxpZ25dPVwidGFibGVGb290UHJvcHM/LmFsaWduXCJcclxuICAgICAgY29tcG9uZW50PVwidGZvb3RcIlxyXG4gICAgPjwvYy1zbWFydC10YWJsZS1oZWFkPlxyXG5cclxuICA8L3RhYmxlPlxyXG4gIDxjLWVsZW1lbnQtY292ZXJcclxuICAgICpuZ0lmPVwibG9hZGluZ1wiXHJcbiAgICBbYm91bmRhcmllc109XCJbXHJcbiAgICAgIHsgc2lkZXM6IFsndG9wJ10sIHF1ZXJ5OiAndGQnIH0sXHJcbiAgICAgIHsgc2lkZXM6IFsnYm90dG9tJ10sIHF1ZXJ5OiAndGJvZHknIH1cclxuICAgIF1cIlxyXG4gID48L2MtZWxlbWVudC1jb3Zlcj5cclxuPC9kaXY+XHJcbjxuZy10ZW1wbGF0ZSBbbmdJZl09XCJwYWdpbmF0aW9uIHx8IGl0ZW1zUGVyUGFnZVNlbGVjdFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgPGMtc21hcnQtcGFnaW5hdGlvblxyXG4gICAgICAgIChhY3RpdmVQYWdlQ2hhbmdlKT1cInNldEFjdGl2ZVBhZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgKm5nSWY9XCJwYWdpbmF0aW9uICYmIG51bWJlck9mUGFnZXMgPiAxXCJcclxuICAgICAgICBbYWN0aXZlUGFnZV09XCJhY3RpdmVQYWdlXCJcclxuICAgICAgICBbcGFnZXNdPVwibnVtYmVyT2ZQYWdlc1wiPlxyXG4gICAgICA8L2Mtc21hcnQtcGFnaW5hdGlvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIG1zLWF1dG9cIj5cclxuICAgICAgPGMtc21hcnQtdGFibGUtaXRlbXMtcGVyLXBhZ2Utc2VsZWN0b3JcclxuICAgICAgICAoaXRlbXNQZXJQYWdlQ2hhbmdlKT1cImhhbmRsZUl0ZW1zUGVyUGFnZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAqbmdJZj1cIml0ZW1zUGVyUGFnZVNlbGVjdFwiXHJcbiAgICAgICAgW2l0ZW1zUGVyUGFnZUxhYmVsXT1cIml0ZW1zUGVyUGFnZUxhYmVsXCJcclxuICAgICAgICBbaXRlbXNQZXJQYWdlT3B0aW9uc109XCJpdGVtc1BlclBhZ2VPcHRpb25zXCJcclxuICAgICAgICBbaXRlbXNQZXJQYWdlXT1cIml0ZW1zUGVyUGFnZVwiXHJcbiAgICAgID5cclxuICAgICAgPC9jLXNtYXJ0LXRhYmxlLWl0ZW1zLXBlci1wYWdlLXNlbGVjdG9yPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI3Rib2R5RGVmYXVsdFRlbXBsYXRlPlxyXG4gIDx0Ym9keSBbY0h0bWxBdHRyXT1cInRhYmxlQm9keVByb3BzPy5hdHRyaWJ1dGVzID8/IHt9XCJcclxuICAgICAgICAgW2NUYWJsZUNvbG9yXT1cInRhYmxlQm9keVByb3BzPy5jb2xvclwiXHJcbiAgICAgICAgIFtjQWxpZ25dPVwidGFibGVCb2R5UHJvcHM/LmFsaWduXCJcclxuICA+XHJcbiAgPG5nLXRlbXBsYXRlIG5nRm9yIGxldC1pdGVtIFtuZ0Zvck9mXT1cImN1cnJlbnRJdGVtc1wiIGxldC1jbnQ9XCJjb3VudFwiIGxldC1pPVwiaW5kZXhcIiBsZXQtaXNFdmVuPVwiZXZlblwiIGxldC1pc09kZD1cIm9kZFwiPlxyXG4gICAgPHRyIFt0YWJpbmRleF09XCJjbGlja2FibGVSb3dzID8gMCA6IC0xXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7Y3Vyc29yOiBjbGlja2FibGVSb3dzID8gJ3BvaW50ZXInIDogJ2F1dG8nfVwiXHJcbiAgICAgICAgKGNsaWNrKT1cImhhbmRsZVJvd0NsaWNrKHskZXZlbnQsIGl0ZW0sIGl9KVwiXHJcbiAgICAgICAgW2NUYWJsZUFjdGl2ZV09XCJpdGVtLl9wcm9wcz8uYWN0aXZlXCJcclxuICAgICAgICBbY1RhYmxlQ29sb3JdPVwiaXRlbS5fcHJvcHM/LmNvbG9yXCJcclxuICAgICAgICBbY0FsaWduXT1cIml0ZW0uX3Byb3BzPy5hbGlnblwiXHJcbiAgICA+XHJcbiAgICAgIDx0ZCAqbmdJZj1cInNlbGVjdGFibGVcIlxyXG4gICAgICAgICAgW2NUYWJsZUFjdGl2ZV09XCJpdGVtPy5bJ19jZWxsUHJvcHMnXT8uX2FsbD8uYWN0aXZlXCJcclxuICAgICAgICAgIFtjVGFibGVDb2xvcl09XCJpdGVtPy5bJ19jZWxsUHJvcHMnXT8uX2FsbD8uY29sb3JcIlxyXG4gICAgICAgICAgW2NBbGlnbl09XCJpdGVtPy5bJ19jZWxsUHJvcHMnXT8uX2FsbD8uYWxpZ25cIj5cclxuICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cImhhbmRsZVJvd0NoZWNrZWQoJGV2ZW50LCBpdGVtKVwiIFtjaGVja2VkXT1cIml0ZW0uX3NlbGVjdGVkID8/IGZhbHNlXCIgY0Zvcm1DaGVja0lucHV0PlxyXG4gICAgICA8L3RkPlxyXG4gICAgICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LWNvbHVtbk5hbWUgW25nRm9yT2ZdPVwicmF3Q29sdW1uTmFtZXNcIiBsZXQtaT1cImluZGV4XCIgPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZXNbJ3RhYmxlRGF0YSddIHx8IGNvbHVtbkRlZmF1bHRUZW1wbGF0ZTsgY29udGV4dDoge2l0ZW0sIGNvbHVtbk5hbWUsIHRkQ29udGVudDogaXRlbVtjb2x1bW5OYW1lXSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L3RyPlxyXG4gICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInRlbXBsYXRlc1sndGFibGVEZXRhaWxzJ11cIj5cclxuICAgICAgPCEtLSAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyb3dEZXRhaWxzRGVmYXVsdFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+LS0+XHJcbiAgICAgIDx0cj48dGQgW2NvbFNwYW5dPVwiY29sc3BhblwiIGNsYXNzPVwicC0wXCIgdGFiaW5kZXg9XCItMVwiIFtuZ1N0eWxlXT1cIntib3JkZXJCb3R0b21XaWR0aDogMH1cIj48L3RkPjwvdHI+XHJcbiAgICAgIDx0ciBjbGFzcz1cInAtMFwiPlxyXG4gICAgICAgIDx0ZCBbY29sU3Bhbl09XCJjb2xzcGFuXCIgY2xhc3M9XCJwLTBcIiBbbmdTdHlsZV09XCJ7Ym9yZGVyOiAwfVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlc1sndGFibGVEZXRhaWxzJ107IGNvbnRleHQ6IHtpdGVtLCBpbmRleDogaX1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L3RyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L25nLXRlbXBsYXRlPlxyXG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub0l0ZW1zRGVmYXVsdFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgPC90Ym9keT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjY29sdW1uRGVmYXVsdFRlbXBsYXRlIGxldC1pdGVtPVwiaXRlbVwiIGxldC1jb2x1bW5OYW1lPVwiY29sdW1uTmFtZVwiIGxldC10ZENvbnRlbnQ9XCJ0ZENvbnRlbnRcIj5cclxuICA8dGRcclxuICAgIFtjVGFibGVBY3RpdmVdPVwiaXRlbT8uWydfY2VsbFByb3BzJ10/Lltjb2x1bW5OYW1lXT8uYWN0aXZlID8/IGl0ZW0/LlsnX2NlbGxQcm9wcyddPy5fYWxsPy5hY3RpdmVcIlxyXG4gICAgW2NUYWJsZUNvbG9yXT1cIml0ZW0/LlsnX2NlbGxQcm9wcyddPy5bY29sdW1uTmFtZV0/LmNvbG9yID8/IGl0ZW0/LlsnX2NlbGxQcm9wcyddPy5fYWxsPy5jb2xvclwiXHJcbiAgICBbY0FsaWduXT1cIml0ZW0/LlsnX2NlbGxQcm9wcyddPy5bY29sdW1uTmFtZV0/LmFsaWduID8/IGl0ZW0/LlsnX2NlbGxQcm9wcyddPy5fYWxsPy5hbGlnblwiXHJcbiAgPlxyXG4gICAge3t0ZENvbnRlbnR9fVxyXG4gIDwvdGQ+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tPG5nLXRlbXBsYXRlICNyb3dEZXRhaWxzRGVmYXVsdFRlbXBsYXRlIGxldC1pdGVtIGxldC1pbmRleD4tLT5cclxuPCEtLSAgPHRyPjx0ZCBbY29sU3Bhbl09XCJjb2xzcGFuXCIgY2xhc3M9XCJwLTBcIiB0YWJpbmRleD1cIi0xXCIgW25nU3R5bGVdPVwie2JvcmRlckJvdHRvbVdpZHRoOiAwfVwiPjwvdGQ+PC90cj4tLT5cclxuPCEtLSAgPHRyIGNsYXNzPVwicC0wXCI+LS0+XHJcbjwhLS0gICAgPHRkIFtjb2xTcGFuXT1cImNvbHNwYW5cIiBjbGFzcz1cInAtMFwiIFtuZ1N0eWxlXT1cIntib3JkZXI6IDB9XCI+LS0+XHJcbjwhLS0gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVzPy50YWJsZURldGFpbHNcIj48L25nLWNvbnRhaW5lcj4tLT5cclxuPCEtLSAgICA8L3RkPi0tPlxyXG48IS0tICA8L3RyPi0tPlxyXG48IS0tPC9uZy10ZW1wbGF0ZT4tLT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjbm9JdGVtc0RlZmF1bHRUZW1wbGF0ZT5cclxuICA8dHIgKm5nSWY9XCIhY3VycmVudEl0ZW1zLmxlbmd0aFwiPlxyXG4gICAgPHRkIFtjb2xTcGFuXT1cImNvbHNwYW5cIiBjbGFzcz1cImp1c3RpZnktY29udGVudC1jZW50ZXJcIj57e25vSXRlbXNMYWJlbH19PC90ZD5cclxuICA8L3RyPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPCEtLXRvZG86IGZpbHRlckljb25DdXN0b21UZW1wbGF0ZS0tPlxyXG48bmctdGVtcGxhdGUgI2ZpbHRlckljb25UZW1wbGF0ZT5cclxuICA8c3ZnIGNsYXNzPVwiaWNvbiBpY29uLWN1c3RvbS1zaXplXCIgcm9sZT1cImltZ1wiIHZpZXdCb3g9XCIwIDAgNTEyIDUxMlwiIHdpZHRoPVwiMThcIlxyXG4gICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgPHBvbHlnb24gY2xhc3M9XCJjaS1wcmltYXJ5XCJcclxuICAgICAgICAgICAgIGZpbGw9XCJ2YXIoLS1jaS1wcmltYXJ5LWNvbG9yLCBjdXJyZW50Q29sb3IpXCJcclxuICAgICAgICAgICAgIHBvaW50cz1cIjQwIDE2IDQwIDUzLjgyOCAxMDkuMDI0IDEzNiAxNTAuODE1IDEzNiA3Ni44OTYgNDggNDU5LjUxIDQ4IDMwNCAyNDIuMzg4IDMwNCA0MDEuMzczIDI0MS4zNzMgNDY0IDI0MCA0NjQgMjQwIDM2OCAyMDggMzY4IDIwOCA0OTYgMjU0LjYyNyA0OTYgMzM2IDQxNC42MjcgMzM2IDI1My42MTIgNDk2IDUzLjYxMiA0OTYgMTYgNDAgMTZcIj48L3BvbHlnb24+XHJcbiAgICA8cG9seWdvbiBjbGFzcz1cImNpLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgZmlsbD1cInZhcigtLWNpLXByaW1hcnktY29sb3IsIGN1cnJlbnRDb2xvcilcIlxyXG4gICAgICAgICAgICAgcG9pbnRzPVwiMTY2LjQwMyAyNDguMjI1IDIyNi44NjQgMTg3Ljc2MyAyMDQuMjM3IDE2NS4xMzUgMTQzLjc3NSAyMjUuNTk3IDgzLjMxMyAxNjUuMTM1IDYwLjY4NyAxODcuNzYzIDEyMS4xNDggMjQ4LjIyNSA2MC42ODcgMzA4LjY4NyA4My4zMTMgMzMxLjMxNCAxNDMuNzc1IDI3MC44NTIgMjA0LjIzNyAzMzEuMzE0IDIyNi44NjQgMzA4LjY4NyAxNjYuNDAzIDI0OC4yMjVcIj48L3BvbHlnb24+XHJcbiAgPC9zdmc+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==
|