ngx-vector-components 5.111.0 → 5.112.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## [5.112.0] (29/07/2025)
4
+
5
+ ### Features
6
+
7
+ - Added 'onFilterChange' and update 'onloadAutocompletePanelService' methods in `multiselect-field.component.ts`
8
+
3
9
  ## [5.111.0] (29/07/2025)
4
10
 
5
11
  ### Features
@@ -1,4 +1,4 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
1
+ import { Component, EventEmitter, Input, Output, signal } from '@angular/core';
2
2
  import { ObjectUtil } from '../../../utils';
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "@angular/common";
@@ -73,6 +73,7 @@ export class MultiselectFieldComponent {
73
73
  this.currentScrollIndex = 0;
74
74
  this.unlistenAutocompleteVirtualScroll = () => { };
75
75
  this._pagedSugestion = [];
76
+ this.signalOptions = signal([]);
76
77
  }
77
78
  ngOnInit() {
78
79
  if (this.initialLoad && this.filterVirtualScrool) {
@@ -128,10 +129,21 @@ export class MultiselectFieldComponent {
128
129
  .getPaged(encodeURIComponent(this.currentSearchQuery), this.currentScrollPage, this.limitScrollPage, this.dependencies)
129
130
  .subscribe({
130
131
  next: (response) => {
131
- this.options =
132
- this.currentScrollPage === 0
133
- ? response
134
- : this.options?.concat(response);
132
+ if (response && response.length) {
133
+ const currentSignalOptions = this.signalOptions() || [];
134
+ const combined = [
135
+ ...currentSignalOptions,
136
+ ...response,
137
+ ...(this.currentScrollPage === 0 ? [] : this.options),
138
+ ];
139
+ const uniqueOptions = combined.filter((item, index, self) => self.findIndex((i) => i.code === item.code) === index);
140
+ this.options = uniqueOptions;
141
+ this.signalOptions.set(uniqueOptions);
142
+ }
143
+ else {
144
+ this.options = this.currentScrollPage === 0 ? [] : this.options;
145
+ this.signalOptions.set(this.options);
146
+ }
135
147
  const controlValue = typeof this.control.value == 'object' ? this.control.value?.code : this.control.value;
136
148
  if (this.control.value && this.options?.find((item) => item.code == controlValue)) {
137
149
  this.setControlValueFromSuggestions();
@@ -189,6 +201,24 @@ export class MultiselectFieldComponent {
189
201
  this.options = [];
190
202
  }
191
203
  }
204
+ onFilterChange($event) {
205
+ if (!$event || !$event.filter)
206
+ return;
207
+ if (this.service && $event?.filter.length >= this.minLengthToService) {
208
+ this.service.getPaged($event.filter, this.currentScrollPage, this.limitScrollPage, this.dependencies).subscribe({
209
+ next: (response) => {
210
+ if (response && response.length) {
211
+ const currentSignalOptions = this.signalOptions() || [];
212
+ const combined = [...response, ...currentSignalOptions, ...this.options];
213
+ const uniqueOptions = combined.filter((item, index, self) => self.findIndex((i) => i.code === item.code) === index);
214
+ this.options = uniqueOptions;
215
+ this.signalOptions.set(uniqueOptions);
216
+ }
217
+ },
218
+ error: (err) => { },
219
+ });
220
+ }
221
+ }
192
222
  pageResults() {
193
223
  const filteredOptions = this.filterListByQuery(this.pagedSugestion, this.currentSearchQuery.toUpperCase());
194
224
  this.options = filteredOptions.slice(0, this.currentScrollIndex + 20);
@@ -232,11 +262,11 @@ export class MultiselectFieldComponent {
232
262
  }
233
263
  }
234
264
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiselectFieldComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
235
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiselectFieldComponent, selector: "vector-multiselect-field", inputs: { pagedSugestion: "pagedSugestion", isRequired: "isRequired", control: "control", label: "label", options: "options", filter: "filter", showSelectAllOption: "showSelectAllOption", display: "display", paged: "paged", disabled: "disabled", minLengthToService: "minLengthToService", initialLoad: "initialLoad", service: "service", filterVirtualScrool: "filterVirtualScrool", showHeader: "showHeader", showFlags: "showFlags", dependencies: "dependencies", limitScrollPage: "limitScrollPage", forceSelection: "forceSelection", showFlagsOptions: "showFlagsOptions" }, outputs: { onChange: "onChange", onClosePanel: "onClosePanel" }, ngImport: i0, template: "<div class=\"multiselect-field-input-container\">\r\n <p-multiSelect\r\n *ngIf=\"!filterVirtualScrool\"\r\n #multiselect\r\n appendTo=\"body\"\r\n optionLabel=\"name\"\r\n optionValue=\"code\"\r\n dropdownIcon=\"fas fa-sort-down\"\r\n selectedItemsLabel=\"Selecionar todos\"\r\n [panelStyleClass]=\"filter ? 'has-filter' : ''\"\r\n [options]=\"options\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"placeholder\"\r\n [filter]=\"filter\"\r\n [maxSelectedLabels]=\"options.length - 1\"\r\n [showToggleAll]=\"showSelectAllOption\"\r\n [dropdownIcon]=\"'pi pi-chevron-down'\"\r\n [display]=\"display\"\r\n (onChange)=\"onChange.emit($event)\"\r\n (onPanelHide)=\"onClosePanel.emit($event)\"\r\n (onPanelShow)=\"customFormattingMultiSelectFieldWithFlags()\"\r\n [disabled]=\"disabled\"\r\n [showHeader]=\"showHeader\"\r\n >\r\n <ng-container *ngIf=\"showFlags\">\r\n <ng-template let-option pTemplate=\"item\">\r\n <div class=\"grid-nogutter w-full flex\">\r\n <div\r\n class=\"md:col-6 sm:col-12 align-content-center\"\r\n [ngClass]=\"option.align === 'center' ? 'md:text-center' : 'md:text-left'\"\r\n >\r\n <img\r\n *ngIf=\"option.type == 'img'\"\r\n [src]=\"option.imgSource\"\r\n [ngClass]=\"option.imgClass\"\r\n [style]=\"{ height: option.imgSize + 'px' }\"\r\n />\r\n <i\r\n *ngIf=\"option.type == 'icon'\"\r\n [className]=\"option.iconSource\"\r\n [ngClass]=\"option.iconClass\"\r\n [style]=\"{ 'font-size': option.iconSize }\"\r\n ></i>\r\n </div>\r\n\r\n <div *ngIf=\"option.showDescriptionOnRight\" class=\"col-6 hidden md:block align-content-center\">\r\n <span class=\"block\">{{ option.name }}</span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </p-multiSelect>\r\n\r\n <p-multiSelect\r\n *ngIf=\"filterVirtualScrool\"\r\n #multiselect\r\n appendTo=\"body\"\r\n optionLabel=\"name\"\r\n optionValue=\"code\"\r\n dropdownIcon=\"fas fa-sort-down\"\r\n selectedItemsLabel=\"Selecionar todos\"\r\n [panelStyleClass]=\"filter ? 'has-filter' : ''\"\r\n [options]=\"options\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"placeholder\"\r\n [filter]=\"filter\"\r\n [maxSelectedLabels]=\"options.length - 1\"\r\n [showHeader]=\"true\"\r\n [showToggleAll]=\"showSelectAllOption\"\r\n [dropdownIcon]=\"'pi pi-chevron-down'\"\r\n [display]=\"display\"\r\n (onChange)=\"onChange.emit($event)\"\r\n (onFilter)=\"search($event)\"\r\n (onPanelShow)=\"onOpenAutocompletePanel()\"\r\n (onPanelHide)=\"onHideAutocompletePanel()\"\r\n [disabled]=\"disabled\"\r\n >\r\n </p-multiSelect>\r\n <p-multiSelect\r\n *ngIf=\"filterVirtualScrool\"\r\n #multiselect\r\n appendTo=\"body\"\r\n optionLabel=\"name\"\r\n optionValue=\"code\"\r\n dropdownIcon=\"fas fa-sort-down\"\r\n selectedItemsLabel=\"Selecionar todos\"\r\n [panelStyleClass]=\"filter ? 'has-filter' : ''\"\r\n [options]=\"options\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"placeholder\"\r\n [filter]=\"filter\"\r\n [maxSelectedLabels]=\"options.length - 1\"\r\n [showHeader]=\"true\"\r\n [showToggleAll]=\"showSelectAllOption\"\r\n [dropdownIcon]=\"'pi pi-chevron-down'\"\r\n [display]=\"display\"\r\n (onChange)=\"onChange.emit($event)\"\r\n (onFilter)=\"search($event)\"\r\n (onPanelShow)=\"onOpenAutocompletePanel()\"\r\n (onPanelHide)=\"onHideAutocompletePanel()\"\r\n [disabled]=\"disabled\"\r\n >\r\n </p-multiSelect>\r\n <span class=\"input-error\">{{ fieldErrorLabel() }}</span>\r\n</div>\r\n", styles: [".multiselect-field-input-container .input-error{font-size:.7em;color:var(--error-color)}.multiselect-field-input-container div.p-multiselect-token{padding:auto 1em!important;background:#eff0f6!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i4.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }] }); }
265
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiselectFieldComponent, selector: "vector-multiselect-field", inputs: { pagedSugestion: "pagedSugestion", isRequired: "isRequired", control: "control", label: "label", options: "options", filter: "filter", showSelectAllOption: "showSelectAllOption", display: "display", paged: "paged", disabled: "disabled", minLengthToService: "minLengthToService", initialLoad: "initialLoad", service: "service", filterVirtualScrool: "filterVirtualScrool", showHeader: "showHeader", showFlags: "showFlags", dependencies: "dependencies", limitScrollPage: "limitScrollPage", forceSelection: "forceSelection", showFlagsOptions: "showFlagsOptions" }, outputs: { onChange: "onChange", onClosePanel: "onClosePanel" }, ngImport: i0, template: "<div class=\"multiselect-field-input-container\">\r\n <p-multiSelect\r\n *ngIf=\"!filterVirtualScrool\"\r\n #multiselect\r\n appendTo=\"body\"\r\n optionLabel=\"name\"\r\n optionValue=\"code\"\r\n dropdownIcon=\"fas fa-sort-down\"\r\n selectedItemsLabel=\"Selecionar todos\"\r\n [panelStyleClass]=\"filter ? 'has-filter' : ''\"\r\n [options]=\"options\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"placeholder\"\r\n [filter]=\"filter\"\r\n [maxSelectedLabels]=\"options.length - 1\"\r\n [showToggleAll]=\"showSelectAllOption\"\r\n [dropdownIcon]=\"'pi pi-chevron-down'\"\r\n [display]=\"display\"\r\n (onChange)=\"onChange.emit($event)\"\r\n (onPanelHide)=\"onClosePanel.emit($event)\"\r\n (onPanelShow)=\"customFormattingMultiSelectFieldWithFlags()\"\r\n (onFilter)=\"onFilterChange($event)\"\r\n [disabled]=\"disabled\"\r\n [showHeader]=\"showHeader\"\r\n >\r\n <ng-container *ngIf=\"showFlags\">\r\n <ng-template let-option pTemplate=\"item\">\r\n <div class=\"grid-nogutter w-full flex\">\r\n <div\r\n class=\"md:col-6 sm:col-12 align-content-center\"\r\n [ngClass]=\"option.align === 'center' ? 'md:text-center' : 'md:text-left'\"\r\n >\r\n <img\r\n *ngIf=\"option.type == 'img'\"\r\n [src]=\"option.imgSource\"\r\n [ngClass]=\"option.imgClass\"\r\n [style]=\"{ height: option.imgSize + 'px' }\"\r\n />\r\n <i\r\n *ngIf=\"option.type == 'icon'\"\r\n [className]=\"option.iconSource\"\r\n [ngClass]=\"option.iconClass\"\r\n [style]=\"{ 'font-size': option.iconSize }\"\r\n ></i>\r\n </div>\r\n\r\n <div *ngIf=\"option.showDescriptionOnRight\" class=\"col-6 hidden md:block align-content-center\">\r\n <span class=\"block\">{{ option.name }}</span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </p-multiSelect>\r\n\r\n <p-multiSelect\r\n *ngIf=\"filterVirtualScrool\"\r\n #multiselect\r\n appendTo=\"body\"\r\n optionLabel=\"name\"\r\n optionValue=\"code\"\r\n dropdownIcon=\"fas fa-sort-down\"\r\n selectedItemsLabel=\"Selecionar todos\"\r\n [panelStyleClass]=\"filter ? 'has-filter' : ''\"\r\n [options]=\"options\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"placeholder\"\r\n [filter]=\"filter\"\r\n [maxSelectedLabels]=\"options.length - 1\"\r\n [showHeader]=\"true\"\r\n [showToggleAll]=\"showSelectAllOption\"\r\n [dropdownIcon]=\"'pi pi-chevron-down'\"\r\n [display]=\"display\"\r\n (onChange)=\"onChange.emit($event)\"\r\n (onFilter)=\"search($event)\"\r\n (onPanelShow)=\"onOpenAutocompletePanel()\"\r\n (onPanelHide)=\"onHideAutocompletePanel()\"\r\n [disabled]=\"disabled\"\r\n >\r\n </p-multiSelect>\r\n <span class=\"input-error\">{{ fieldErrorLabel() }}</span>\r\n</div>\r\n", styles: [".multiselect-field-input-container .input-error{font-size:.7em;color:var(--error-color)}.multiselect-field-input-container div.p-multiselect-token{padding:auto 1em!important;background:#eff0f6!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i4.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }] }); }
236
266
  }
237
267
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiselectFieldComponent, decorators: [{
238
268
  type: Component,
239
- args: [{ selector: 'vector-multiselect-field', template: "<div class=\"multiselect-field-input-container\">\r\n <p-multiSelect\r\n *ngIf=\"!filterVirtualScrool\"\r\n #multiselect\r\n appendTo=\"body\"\r\n optionLabel=\"name\"\r\n optionValue=\"code\"\r\n dropdownIcon=\"fas fa-sort-down\"\r\n selectedItemsLabel=\"Selecionar todos\"\r\n [panelStyleClass]=\"filter ? 'has-filter' : ''\"\r\n [options]=\"options\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"placeholder\"\r\n [filter]=\"filter\"\r\n [maxSelectedLabels]=\"options.length - 1\"\r\n [showToggleAll]=\"showSelectAllOption\"\r\n [dropdownIcon]=\"'pi pi-chevron-down'\"\r\n [display]=\"display\"\r\n (onChange)=\"onChange.emit($event)\"\r\n (onPanelHide)=\"onClosePanel.emit($event)\"\r\n (onPanelShow)=\"customFormattingMultiSelectFieldWithFlags()\"\r\n [disabled]=\"disabled\"\r\n [showHeader]=\"showHeader\"\r\n >\r\n <ng-container *ngIf=\"showFlags\">\r\n <ng-template let-option pTemplate=\"item\">\r\n <div class=\"grid-nogutter w-full flex\">\r\n <div\r\n class=\"md:col-6 sm:col-12 align-content-center\"\r\n [ngClass]=\"option.align === 'center' ? 'md:text-center' : 'md:text-left'\"\r\n >\r\n <img\r\n *ngIf=\"option.type == 'img'\"\r\n [src]=\"option.imgSource\"\r\n [ngClass]=\"option.imgClass\"\r\n [style]=\"{ height: option.imgSize + 'px' }\"\r\n />\r\n <i\r\n *ngIf=\"option.type == 'icon'\"\r\n [className]=\"option.iconSource\"\r\n [ngClass]=\"option.iconClass\"\r\n [style]=\"{ 'font-size': option.iconSize }\"\r\n ></i>\r\n </div>\r\n\r\n <div *ngIf=\"option.showDescriptionOnRight\" class=\"col-6 hidden md:block align-content-center\">\r\n <span class=\"block\">{{ option.name }}</span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </p-multiSelect>\r\n\r\n <p-multiSelect\r\n *ngIf=\"filterVirtualScrool\"\r\n #multiselect\r\n appendTo=\"body\"\r\n optionLabel=\"name\"\r\n optionValue=\"code\"\r\n dropdownIcon=\"fas fa-sort-down\"\r\n selectedItemsLabel=\"Selecionar todos\"\r\n [panelStyleClass]=\"filter ? 'has-filter' : ''\"\r\n [options]=\"options\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"placeholder\"\r\n [filter]=\"filter\"\r\n [maxSelectedLabels]=\"options.length - 1\"\r\n [showHeader]=\"true\"\r\n [showToggleAll]=\"showSelectAllOption\"\r\n [dropdownIcon]=\"'pi pi-chevron-down'\"\r\n [display]=\"display\"\r\n (onChange)=\"onChange.emit($event)\"\r\n (onFilter)=\"search($event)\"\r\n (onPanelShow)=\"onOpenAutocompletePanel()\"\r\n (onPanelHide)=\"onHideAutocompletePanel()\"\r\n [disabled]=\"disabled\"\r\n >\r\n </p-multiSelect>\r\n <p-multiSelect\r\n *ngIf=\"filterVirtualScrool\"\r\n #multiselect\r\n appendTo=\"body\"\r\n optionLabel=\"name\"\r\n optionValue=\"code\"\r\n dropdownIcon=\"fas fa-sort-down\"\r\n selectedItemsLabel=\"Selecionar todos\"\r\n [panelStyleClass]=\"filter ? 'has-filter' : ''\"\r\n [options]=\"options\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"placeholder\"\r\n [filter]=\"filter\"\r\n [maxSelectedLabels]=\"options.length - 1\"\r\n [showHeader]=\"true\"\r\n [showToggleAll]=\"showSelectAllOption\"\r\n [dropdownIcon]=\"'pi pi-chevron-down'\"\r\n [display]=\"display\"\r\n (onChange)=\"onChange.emit($event)\"\r\n (onFilter)=\"search($event)\"\r\n (onPanelShow)=\"onOpenAutocompletePanel()\"\r\n (onPanelHide)=\"onHideAutocompletePanel()\"\r\n [disabled]=\"disabled\"\r\n >\r\n </p-multiSelect>\r\n <span class=\"input-error\">{{ fieldErrorLabel() }}</span>\r\n</div>\r\n", styles: [".multiselect-field-input-container .input-error{font-size:.7em;color:var(--error-color)}.multiselect-field-input-container div.p-multiselect-token{padding:auto 1em!important;background:#eff0f6!important}\n"] }]
269
+ args: [{ selector: 'vector-multiselect-field', template: "<div class=\"multiselect-field-input-container\">\r\n <p-multiSelect\r\n *ngIf=\"!filterVirtualScrool\"\r\n #multiselect\r\n appendTo=\"body\"\r\n optionLabel=\"name\"\r\n optionValue=\"code\"\r\n dropdownIcon=\"fas fa-sort-down\"\r\n selectedItemsLabel=\"Selecionar todos\"\r\n [panelStyleClass]=\"filter ? 'has-filter' : ''\"\r\n [options]=\"options\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"placeholder\"\r\n [filter]=\"filter\"\r\n [maxSelectedLabels]=\"options.length - 1\"\r\n [showToggleAll]=\"showSelectAllOption\"\r\n [dropdownIcon]=\"'pi pi-chevron-down'\"\r\n [display]=\"display\"\r\n (onChange)=\"onChange.emit($event)\"\r\n (onPanelHide)=\"onClosePanel.emit($event)\"\r\n (onPanelShow)=\"customFormattingMultiSelectFieldWithFlags()\"\r\n (onFilter)=\"onFilterChange($event)\"\r\n [disabled]=\"disabled\"\r\n [showHeader]=\"showHeader\"\r\n >\r\n <ng-container *ngIf=\"showFlags\">\r\n <ng-template let-option pTemplate=\"item\">\r\n <div class=\"grid-nogutter w-full flex\">\r\n <div\r\n class=\"md:col-6 sm:col-12 align-content-center\"\r\n [ngClass]=\"option.align === 'center' ? 'md:text-center' : 'md:text-left'\"\r\n >\r\n <img\r\n *ngIf=\"option.type == 'img'\"\r\n [src]=\"option.imgSource\"\r\n [ngClass]=\"option.imgClass\"\r\n [style]=\"{ height: option.imgSize + 'px' }\"\r\n />\r\n <i\r\n *ngIf=\"option.type == 'icon'\"\r\n [className]=\"option.iconSource\"\r\n [ngClass]=\"option.iconClass\"\r\n [style]=\"{ 'font-size': option.iconSize }\"\r\n ></i>\r\n </div>\r\n\r\n <div *ngIf=\"option.showDescriptionOnRight\" class=\"col-6 hidden md:block align-content-center\">\r\n <span class=\"block\">{{ option.name }}</span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </p-multiSelect>\r\n\r\n <p-multiSelect\r\n *ngIf=\"filterVirtualScrool\"\r\n #multiselect\r\n appendTo=\"body\"\r\n optionLabel=\"name\"\r\n optionValue=\"code\"\r\n dropdownIcon=\"fas fa-sort-down\"\r\n selectedItemsLabel=\"Selecionar todos\"\r\n [panelStyleClass]=\"filter ? 'has-filter' : ''\"\r\n [options]=\"options\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"placeholder\"\r\n [filter]=\"filter\"\r\n [maxSelectedLabels]=\"options.length - 1\"\r\n [showHeader]=\"true\"\r\n [showToggleAll]=\"showSelectAllOption\"\r\n [dropdownIcon]=\"'pi pi-chevron-down'\"\r\n [display]=\"display\"\r\n (onChange)=\"onChange.emit($event)\"\r\n (onFilter)=\"search($event)\"\r\n (onPanelShow)=\"onOpenAutocompletePanel()\"\r\n (onPanelHide)=\"onHideAutocompletePanel()\"\r\n [disabled]=\"disabled\"\r\n >\r\n </p-multiSelect>\r\n <span class=\"input-error\">{{ fieldErrorLabel() }}</span>\r\n</div>\r\n", styles: [".multiselect-field-input-container .input-error{font-size:.7em;color:var(--error-color)}.multiselect-field-input-container div.p-multiselect-token{padding:auto 1em!important;background:#eff0f6!important}\n"] }]
240
270
  }], ctorParameters: () => [{ type: i0.Renderer2 }], propDecorators: { pagedSugestion: [{
241
271
  type: Input
242
272
  }], isRequired: [{
@@ -282,4 +312,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
282
312
  }], onClosePanel: [{
283
313
  type: Output
284
314
  }] } });
285
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlzZWxlY3QtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZlY3Rvci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9maWVsZHMvbXVsdGlzZWxlY3QtZmllbGQvbXVsdGlzZWxlY3QtZmllbGQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZlY3Rvci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9maWVsZHMvbXVsdGlzZWxlY3QtZmllbGQvbXVsdGlzZWxlY3QtZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUdsRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7OztBQXdCNUMsTUFBTSxPQUFPLHlCQUF5QjtJQUNwQyxJQUNJLGNBQWMsQ0FBQyxlQUEyQjtRQUM1QyxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztRQUN2QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO0lBQzNDLENBQUM7SUF3Q0QsSUFDSSxnQkFBZ0IsQ0FBQyxLQUFnQztRQUNuRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7U0FDeEY7UUFDRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdkIsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRTtnQkFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7b0JBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMs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QUFLO2dCQUdDLE9BQU87c0JBRGIsS0FBSztnQkFHQyxLQUFLO3NCQURYLEtBQUs7Z0JBR0MsT0FBTztzQkFEYixLQUFLO2dCQUdDLE1BQU07c0JBRFosS0FBSztnQkFHQyxtQkFBbUI7c0JBRHpCLEtBQUs7Z0JBR0MsT0FBTztzQkFEYixLQUFLO2dCQUdDLEtBQUs7c0JBRFgsS0FBSztnQkFHQyxRQUFRO3NCQURkLEtBQUs7Z0JBR0Msa0JBQWtCO3NCQUR4QixLQUFLO2dCQUdDLFdBQVc7c0JBRGpCLEtBQUs7Z0JBR0MsT0FBTztzQkFEYixLQUFLO2dCQUdDLG1CQUFtQjtzQkFEekIsS0FBSztnQkFHQyxVQUFVO3NCQURoQixLQUFLO2dCQUdDLFNBQVM7c0JBRGYsS0FBSztnQkFLQyxZQUFZO3NCQURsQixLQUFLO2dCQUdDLGVBQWU7c0JBRHJCLEtBQUs7Z0JBR0MsY0FBYztzQkFEcEIsS0FBSztnQkFJRixnQkFBZ0I7c0JBRG5CLEtBQUs7Z0JBaUNDLFFBQVE7c0JBRGQsTUFBTTtnQkFHQSxZQUFZO3NCQURsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBMaXN0SXRlbSB9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XHJcbmltcG9ydCB7IEJhc2VEcm9wZG93biB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgT2JqZWN0VXRpbCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcclxuXHJcbmV4cG9ydCB0eXBlIExpc3RJdGVtRXh0ZW5kID0gTGlzdEl0ZW0gJiB7XHJcbiAga2V5PzogbnVtYmVyIHwgc3RyaW5nO1xyXG4gIGlkPzogbnVtYmVyIHwgc3RyaW5nO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgTGlzdEl0ZW1PcHRpb25zRmxhZ1R5cGUgPSBMaXN0SXRlbSAmIHtcclxuICBhbGlnbjogJ2NlbnRlcicgfCAnbGVmdCc7XHJcbiAgc2hvd0Rlc2NyaXB0aW9uT25SaWdodDogYm9vbGVhbjtcclxuICB0eXBlOiAnaW1nJyB8ICdpY29uJztcclxuICBpY29uU291cmNlPzogc3RyaW5nO1xyXG4gIGljb25TaXplPzogJzFlbScgfCAnMS4yNWVtJyB8ICcxLjVlbScgfCAnMS43NWVtJyB8ICcyZW0nO1xyXG4gIGljb25DbGFzcz86IHN0cmluZztcclxuICBpbWdTb3VyY2U/OiBzdHJpbmc7XHJcbiAgaW1nU2l6ZT86ICcxNScgfCAnMjAnIHwgJzI1JztcclxuICBpbWdDbGFzcz86IHN0cmluZztcclxufTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndmVjdG9yLW11bHRpc2VsZWN0LWZpZWxkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbXVsdGlzZWxlY3QtZmllbGQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL211bHRpc2VsZWN0LWZpZWxkLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNdWx0aXNlbGVjdEZpZWxkQ29tcG9uZW50IHtcclxuICBASW5wdXQoKVxyXG4gIHNldCBwYWdlZFN1Z2VzdGlvbihfcGFnZWRTdWdlc3Rpb246IExpc3RJdGVtW10pIHtcclxuICAgIHRoaXMuX3BhZ2VkU3VnZXN0aW9uID0gX3BhZ2VkU3VnZXN0aW9uO1xyXG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5wYWdlZFN1Z2VzdGlvbiB8fCBbXTtcclxuICB9XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgaXNSZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGNvbnRyb2w6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBsYWJlbDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgb3B0aW9uczogTGlzdEl0ZW1bXSB8IExpc3RJdGVtRXh0ZW5kW10gfCBMaXN0SXRlbU9wdGlvbnNGbGFnVHlwZVtdID0gW107XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZmlsdGVyID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2hvd1NlbGVjdEFsbE9wdGlvbjogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGlzcGxheTogc3RyaW5nID0gJ2NvbW1hJztcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBwYWdlZCA9IHRydWU7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBtaW5MZW5ndGhUb1NlcnZpY2U6IG51bWJlciA9IDA7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgaW5pdGlhbExvYWQgPSB0cnVlO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNlcnZpY2U6IEJhc2VEcm9wZG93biB8IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBmaWx0ZXJWaXJ0dWFsU2Nyb29sID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2hvd0hlYWRlcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2hvd0ZsYWdzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfc2hvd0ZsYWdzT3B0aW9ucz86IExpc3RJdGVtT3B0aW9uc0ZsYWdUeXBlW10gfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRlcGVuZGVuY2llczogYW55O1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGxpbWl0U2Nyb2xsUGFnZTogbnVtYmVyID0gMjA7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZm9yY2VTZWxlY3Rpb24gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBzaG93RmxhZ3NPcHRpb25zKHZhbHVlOiBMaXN0SXRlbU9wdGlvbnNGbGFnVHlwZVtdKSB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0ZsYWdzKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hvd0ZsYWdzIGlzIHNldCB0byBmYWxzZS4gU2V0dGluZyBzaG93RmxhZ3NPcHRpb25zIGlzIG5vdCBhbGxvd2VkLicpO1xyXG4gICAgfVxyXG4gICAgdmFsdWUuZm9yRWFjaCgob3B0aW9uKSA9PiB7XHJcbiAgICAgIGlmIChvcHRpb24udHlwZSA9PT0gJ2ltZycpIHtcclxuICAgICAgICBpZiAoIW9wdGlvbi5pbWdTb3VyY2UpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImltZ1NvdXJjZSBpcyByZXF1aXJlZCB3aGVuIHR5cGUgaXMgJ2ltZydcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghb3B0aW9uLmltZ1NpemUpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImltZ1NpemUgaXMgcmVxdWlyZWQgd2hlbiB0eXBlIGlzICdpbWcnXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChvcHRpb24udHlwZSA9PT0gJ2ljb24nKSB7XHJcbiAgICAgICAgaWYgKCFvcHRpb24uaWNvblNvdXJjZSkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWNvblNvdXJjZSBpcyByZXF1aXJlZCB3aGVuIHR5cGUgaXMgJ2ljb24nXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIW9wdGlvbi5pY29uU2l6ZSkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWNvblNpemUgaXMgcmVxdWlyZWQgd2hlbiB0eXBlIGlzICdpY29uJ1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5fc2hvd0ZsYWdzT3B0aW9ucyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNob3dGbGFnc09wdGlvbnMoKTogTGlzdEl0ZW1PcHRpb25zRmxhZ1R5cGVbXSB7XHJcbiAgICBpZiAoIXRoaXMuX3Nob3dGbGFnc09wdGlvbnMpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaG93RmxhZ3NPcHRpb25zIHdhcyBub3Qgc2V0Jyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fc2hvd0ZsYWdzT3B0aW9ucztcclxuICB9XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgb25DbG9zZVBhbmVsID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBwcml2YXRlIGN1cnJlbnRTZWFyY2hRdWVyeSA9ICcnO1xyXG4gIHByaXZhdGUgY3VycmVudFNjcm9sbFBhZ2UgPSAtMTtcclxuICBwcml2YXRlIGN1cnJlbnRTY3JvbGxJbmRleCA9IDA7XHJcblxyXG4gIHB1YmxpYyB1bmxpc3RlbkF1dG9jb21wbGV0ZVZpcnR1YWxTY3JvbGwgPSAoKSA9PiB7fTtcclxuXHJcbiAgZ2V0IHBsYWNlaG9sZGVyKCkge1xyXG4gICAgaWYgKCF0aGlzLmxhYmVsKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICAgIHJldHVybiBgJHt0aGlzLmxhYmVsfSR7dGhpcy5pc1JlcXVpcmVkID8gJyonIDogJyd9YDtcclxuICB9XHJcblxyXG4gIGdldCBwYWdlZFN1Z2VzdGlvbigpIHtcclxuICAgIHJldHVybiB0aGlzLl9wYWdlZFN1Z2VzdGlvbjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3BhZ2VkU3VnZXN0aW9uOiBMaXN0SXRlbVtdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pbml0aWFsTG9hZCAmJiB0aGlzLmZpbHRlclZpcnR1YWxTY3Jvb2wpIHtcclxuICAgICAgdGhpcy5zZWFyY2gobnVsbCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuY29udHJvbC5kaXNhYmxlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2VydmljZSAmJiB0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLnZhbHVlICYmIEFycmF5LmlzQXJyYXkodGhpcy5jb250cm9sLnZhbHVlKSkge1xyXG4gICAgICBjb25zdCBjb250cm9sVmFsdWVBcnJheSA9IHRoaXMuY29udHJvbC52YWx1ZS5tYXAoKHZhbHVlOiBhbnkpID0+IHZhbHVlKTtcclxuICAgICAgaWYgKGNvbnRyb2xWYWx1ZUFycmF5Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMubG9hZEluaXRpYWxTZWxlY3RlZFZhbHVlcyhjb250cm9sVmFsdWVBcnJheSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBmaWVsZEVycm9yTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLmludmFsaWQgJiYgdGhpcy5jb250cm9sLnRvdWNoZWQpIHtcclxuICAgICAgaWYgKHRoaXMuY29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKSkge1xyXG4gICAgICAgIHJldHVybiAnQ2FtcG8gb2JyaWdhdMOzcmlvJztcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLmNvbnRyb2wuZXJyb3JzWydpbnZhbGlkJ10gPT09ICdzdHJpbmcnID8gdGhpcy5jb250cm9sLmVycm9yc1snaW52YWxpZCddIDogJ0NhbXBvIGludsOhbGlkbyc7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGN1c3RvbUZvcm1hdHRpbmdNdWx0aVNlbGVjdEZpZWxkV2l0aEZsYWdzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vbmxvYWRBdXRvY29tcGxldGVQYW5lbFNlcnZpY2UoKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc3QgdmVjdG9yTXVsdGlzZWxlY3RGaWVsZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZlY3Rvci1tdWx0aXNlbGVjdC1maWVsZC5tdWx0aXNlbGVjdC1mbGFncycpO1xyXG5cclxuICAgICAgaWYgKHZlY3Rvck11bHRpc2VsZWN0RmllbGQpIHtcclxuICAgICAgICBjb25zdCBwT3ZlcmxheUVsZW1lbnQgPSB2ZWN0b3JNdWx0aXNlbGVjdEZpZWxkLnF1ZXJ5U2VsZWN0b3IoJ3Atb3ZlcmxheScpO1xyXG5cclxuICAgICAgICBpZiAocE92ZXJsYXlFbGVtZW50KSB7XHJcbiAgICAgICAgICBjb25zdCBjbGFzc0xpc3QgPSBBcnJheS5mcm9tKHBPdmVybGF5RWxlbWVudC5jbGFzc0xpc3QpO1xyXG4gICAgICAgICAgY29uc3QgdGFyZ2V0Q2xhc3MgPSBjbGFzc0xpc3QuZmluZCgoY2xhc3NOYW1lKSA9PiBjbGFzc05hbWUuc3RhcnRzV2l0aCgnbmctdG5zLScpKTtcclxuXHJcbiAgICAgICAgICBpZiAodGFyZ2V0Q2xhc3MpIHtcclxuICAgICAgICAgICAgY29uc3QgY2xhc3NSZWZlcmVuY2VDb2RlID0gdGFyZ2V0Q2xhc3MucmVwbGFjZSgnbmctdG5zLScsICcnKTtcclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0RGl2V2l0aFJlZkNvZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBkaXYubmctdG5zLSR7Y2xhc3NSZWZlcmVuY2VDb2RlfWApO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRhcmdldERpdldpdGhSZWZDb2RlKSB7XHJcbiAgICAgICAgICAgICAgdGFyZ2V0RGl2V2l0aFJlZkNvZGUuY2xhc3NMaXN0LmFkZCgnbXVsdGlzZWxlY3QtZmxhZ3MnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSwgMjAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25sb2FkQXV0b2NvbXBsZXRlUGFuZWxTZXJ2aWNlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc2VydmljZSkge1xyXG4gICAgICB0aGlzLnNlYXJjaCgpO1xyXG4gICAgICB0aGlzLmN1cnJlbnRTY3JvbGxQYWdlKys7XHJcblxyXG4gICAgICB0aGlzLnNlcnZpY2VcclxuICAgICAgICAuZ2V0UGFnZWQoXHJcbiAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQodGhpcy5jdXJyZW50U2VhcmNoUXVlcnkpLFxyXG4gICAgICAgICAgdGhpcy5jdXJyZW50U2Nyb2xsUGFnZSxcclxuICAgICAgICAgIHRoaXMubGltaXRTY3JvbGxQYWdlLFxyXG4gICAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zID1cclxuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTY3JvbGxQYWdlID09PSAwXHJcbiAgICAgICAgICAgICAgICA/IHJlc3BvbnNlXHJcbiAgICAgICAgICAgICAgICA6ICh0aGlzLm9wdGlvbnMgYXMgKExpc3RJdGVtIHwgTGlzdEl0ZW1PcHRpb25zRmxhZ1R5cGUpW10pPy5jb25jYXQoXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgYXMgKExpc3RJdGVtIHwgTGlzdEl0ZW1PcHRpb25zRmxhZ1R5cGUpW11cclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgY29uc3QgY29udHJvbFZhbHVlID0gdHlwZW9mIHRoaXMuY29udHJvbC52YWx1ZSA9PSAnb2JqZWN0JyA/IHRoaXMuY29udHJvbC52YWx1ZT8uY29kZSA6IHRoaXMuY29udHJvbC52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wudmFsdWUgJiYgdGhpcy5vcHRpb25zPy5maW5kKChpdGVtKSA9PiBpdGVtLmNvZGUgPT0gY29udHJvbFZhbHVlKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0Q29udHJvbFZhbHVlRnJvbVN1Z2dlc3Rpb25zKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcmNlU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTZWFyY2hFcnJvcnMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7fSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZEluaXRpYWxTZWxlY3RlZFZhbHVlcyhjb250cm9sVmFsdWVBcnJheTogYW55W10pOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5zZXJ2aWNlKSByZXR1cm47XHJcbiAgICB0aGlzLnNlcnZpY2UuZ2V0UGFnZWQoJycsIDAsIHRoaXMubGltaXRTY3JvbGxQYWdlLCB0aGlzLmRlcGVuZGVuY2llcykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gcmVzcG9uc2U7XHJcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsQ29udHJvbFZhbHVlcyhjb250cm9sVmFsdWVBcnJheSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7fSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRJbml0aWFsQ29udHJvbFZhbHVlcyh2YWx1ZXM6IGFueVtdKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gKHRoaXMub3B0aW9ucyBhcyBMaXN0SXRlbUV4dGVuZFtdKVxyXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiB2YWx1ZXMuaW5jbHVkZXMoaXRlbS5jb2RlIHx8IGl0ZW0ua2V5IHx8IGl0ZW0uaWQpKVxyXG4gICAgICAubWFwKChlbCkgPT4gKGVsLmNvZGUgPSBlbC5rZXkgPyBlbC5rZXkgOiBlbC5pZCA/IGVsLmlkIDogZWwuY29kZSkpO1xyXG4gICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHNlbGVjdGVkSXRlbXMsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbk9wZW5BdXRvY29tcGxldGVQYW5lbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VhcmNoKCk7XHJcbiAgICBjb25zdCBtdWx0aVNlbGVjdFBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnAtbXVsdGlzZWxlY3QtaXRlbXMtd3JhcHBlcicpO1xyXG5cclxuICAgIGlmIChtdWx0aVNlbGVjdFBhbmVsICYmIHRoaXMucGFnZWQgJiYgdGhpcy5jdXJyZW50U2VhcmNoUXVlcnkubGVuZ3RoID49IHRoaXMubWluTGVuZ3RoVG9TZXJ2aWNlKSB7XHJcbiAgICAgIHRoaXMudW5saXN0ZW5BdXRvY29tcGxldGVWaXJ0dWFsU2Nyb2xsID0gdGhpcy5yZW5kZXJlci5saXN0ZW4obXVsdGlTZWxlY3RQYW5lbCwgJ3Njcm9sbCcsIChldmVudCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50SGVpZ2h0ID0gZXZlbnQudGFyZ2V0LnNjcm9sbEhlaWdodCAtIGV2ZW50LnRhcmdldC5jbGllbnRIZWlnaHQgLSAxNTA7XHJcblxyXG4gICAgICAgIGlmIChNYXRoLnJvdW5kKGV2ZW50LnRhcmdldC5zY3JvbGxUb3ApID49IGV2ZW50SGVpZ2h0KSB7XHJcbiAgICAgICAgICB0aGlzLnBhZ2VSZXN1bHRzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkhpZGVBdXRvY29tcGxldGVQYW5lbCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnBhZ2VkKSB7XHJcbiAgICAgIHRoaXMudW5saXN0ZW5BdXRvY29tcGxldGVWaXJ0dWFsU2Nyb2xsKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VhcmNoKCRldmVudD86IGFueSwgZm9yY2VTZWFyY2ggPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50U2VhcmNoUXVlcnkgPSAkZXZlbnQ/LmZpbHRlci50b1VwcGVyQ2FzZSgpIHx8ICcnO1xyXG4gICAgdGhpcy5jdXJyZW50U2Nyb2xsUGFnZSA9IC0xO1xyXG4gICAgdGhpcy5jdXJyZW50U2Nyb2xsSW5kZXggPSAwO1xyXG4gICAgaWYgKGZvcmNlU2VhcmNoIHx8IHRoaXMuY3VycmVudFNlYXJjaFF1ZXJ5Lmxlbmd0aCA+PSB0aGlzLm1pbkxlbmd0aFRvU2VydmljZSkge1xyXG4gICAgICB0aGlzLnBhZ2VSZXN1bHRzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9wdGlvbnMgPSBbXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFnZVJlc3VsdHMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbnMgPSB0aGlzLmZpbHRlckxpc3RCeVF1ZXJ5KHRoaXMucGFnZWRTdWdlc3Rpb24sIHRoaXMuY3VycmVudFNlYXJjaFF1ZXJ5LnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgdGhpcy5vcHRpb25zID0gZmlsdGVyZWRPcHRpb25zLnNsaWNlKDAsIHRoaXMuY3VycmVudFNjcm9sbEluZGV4ICsgMjApO1xyXG5cclxuICAgIGlmICh0aGlzLnBhZ2VkU3VnZXN0aW9uPy5sZW5ndGggJiYgdGhpcy5wYWdlZFN1Z2VzdGlvbi5sZW5ndGggPiAyMCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRTY3JvbGxJbmRleCA9IHRoaXMuY3VycmVudFNjcm9sbEluZGV4ICsgMjA7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXRDb250cm9sVmFsdWVGcm9tU3VnZ2VzdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmlsdGVyTGlzdEJ5UXVlcnkobGlzdDogTGlzdEl0ZW1bXSA9IFtdLCBxdWVyeTogc3RyaW5nKTogTGlzdEl0ZW1bXSB7XHJcbiAgICByZXR1cm4gbGlzdC5maWx0ZXIoXHJcbiAgICAgIChvcHQpID0+IFN0cmluZyhvcHQuY29kZSkudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkgfHwgb3B0Lm5hbWUudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSlcclxuICAgICk7XHJcbiAgfVxyXG4gIHByaXZhdGUgc2V0Q29udHJvbFZhbHVlRnJvbVN1Z2dlc3Rpb25zKCkge1xyXG4gICAgY29uc3QgY29kZSA9XHJcbiAgICAgIChPYmplY3RVdGlsLmlzVmFsaWQodGhpcy5jb250cm9sLnZhbHVlPy5jb2RlKSAmJiBgJHt0aGlzLmNvbnRyb2wudmFsdWU/LmNvZGV9YCkgfHwgYCR7dGhpcy5jb250cm9sLnZhbHVlfWA7XHJcbiAgICBpZiAodGhpcy5jb250cm9sLnZhbHVlICYmIHRoaXMub3B0aW9ucz8ubGVuZ3RoKSB7XHJcbiAgICAgIGxldCBpdGVtc0FycmF5ID0gdGhpcy5vcHRpb25zO1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zPy5sZW5ndGgpIHtcclxuICAgICAgICBpdGVtc0FycmF5ID0gdGhpcy5vcHRpb25zO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGl0ZW1Gcm9tU3VnZ2VzdGlvbnMgPSBpdGVtc0FycmF5LmZpbmQoKG9wdCkgPT4gYCR7b3B0LmNvZGV9YC50b1VwcGVyQ2FzZSgpID09PSBjb2RlLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgICBpZiAoaXRlbUZyb21TdWdnZXN0aW9ucykge1xyXG4gICAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShpdGVtRnJvbVN1Z2dlc3Rpb25zLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlPy5nZXRCeUlkKCtjb2RlKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUocmVzcG9uc2UsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbnRyb2wudmFsdWUgJiYgIXRoaXMub3B0aW9ucz8ubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuc2VydmljZT8uZ2V0QnlJZCgrY29kZSkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShyZXNwb25zZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlU2VhcmNoRXJyb3JzKCkge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ubGVuZ3RoKSB7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLmNvbnRyb2wuZXJyb3JzPy5pdGVtTm90Rm91bmQ7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFNlYXJjaFF1ZXJ5KSB7XHJcbiAgICAgIHRoaXMuY29udHJvbC5zZXRFcnJvcnMoeyBpdGVtTm90Rm91bmQ6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJtdWx0aXNlbGVjdC1maWVsZC1pbnB1dC1jb250YWluZXJcIj5cclxuICA8cC1tdWx0aVNlbGVjdFxyXG4gICAgKm5nSWY9XCIhZmlsdGVyVmlydHVhbFNjcm9vbFwiXHJcbiAgICAjbXVsdGlzZWxlY3RcclxuICAgIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICBvcHRpb25MYWJlbD1cIm5hbWVcIlxyXG4gICAgb3B0aW9uVmFsdWU9XCJjb2RlXCJcclxuICAgIGRyb3Bkb3duSWNvbj1cImZhcyBmYS1zb3J0LWRvd25cIlxyXG4gICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiU2VsZWNpb25hciB0b2Rvc1wiXHJcbiAgICBbcGFuZWxTdHlsZUNsYXNzXT1cImZpbHRlciA/ICdoYXMtZmlsdGVyJyA6ICcnXCJcclxuICAgIFtvcHRpb25zXT1cIm9wdGlvbnNcIlxyXG4gICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxyXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcclxuICAgIFtmaWx0ZXJdPVwiZmlsdGVyXCJcclxuICAgIFttYXhTZWxlY3RlZExhYmVsc109XCJvcHRpb25zLmxlbmd0aCAtIDFcIlxyXG4gICAgW3Nob3dUb2dnbGVBbGxdPVwic2hvd1NlbGVjdEFsbE9wdGlvblwiXHJcbiAgICBbZHJvcGRvd25JY29uXT1cIidwaSBwaS1jaGV2cm9uLWRvd24nXCJcclxuICAgIFtkaXNwbGF5XT1cImRpc3BsYXlcIlxyXG4gICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlLmVtaXQoJGV2ZW50KVwiXHJcbiAgICAob25QYW5lbEhpZGUpPVwib25DbG9zZVBhbmVsLmVtaXQoJGV2ZW50KVwiXHJcbiAgICAob25QYW5lbFNob3cpPVwiY3VzdG9tRm9ybWF0dGluZ011bHRpU2VsZWN0RmllbGRXaXRoRmxhZ3MoKVwiXHJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgW3Nob3dIZWFkZXJdPVwic2hvd0hlYWRlclwiXHJcbiAgPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGbGFnc1wiPlxyXG4gICAgICA8bmctdGVtcGxhdGUgbGV0LW9wdGlvbiBwVGVtcGxhdGU9XCJpdGVtXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtbm9ndXR0ZXIgdy1mdWxsIGZsZXhcIj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJtZDpjb2wtNiBzbTpjb2wtMTIgYWxpZ24tY29udGVudC1jZW50ZXJcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJvcHRpb24uYWxpZ24gPT09ICdjZW50ZXInID8gJ21kOnRleHQtY2VudGVyJyA6ICdtZDp0ZXh0LWxlZnQnXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICpuZ0lmPVwib3B0aW9uLnR5cGUgPT0gJ2ltZydcIlxyXG4gICAgICAgICAgICAgIFtzcmNdPVwib3B0aW9uLmltZ1NvdXJjZVwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwib3B0aW9uLmltZ0NsYXNzXCJcclxuICAgICAgICAgICAgICBbc3R5bGVdPVwieyBoZWlnaHQ6IG9wdGlvbi5pbWdTaXplICsgJ3B4JyB9XCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAqbmdJZj1cIm9wdGlvbi50eXBlID09ICdpY29uJ1wiXHJcbiAgICAgICAgICAgICAgW2NsYXNzTmFtZV09XCJvcHRpb24uaWNvblNvdXJjZVwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwib3B0aW9uLmljb25DbGFzc1wiXHJcbiAgICAgICAgICAgICAgW3N0eWxlXT1cInsgJ2ZvbnQtc2l6ZSc6IG9wdGlvbi5pY29uU2l6ZSB9XCJcclxuICAgICAgICAgICAgPjwvaT5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJvcHRpb24uc2hvd0Rlc2NyaXB0aW9uT25SaWdodFwiIGNsYXNzPVwiY29sLTYgaGlkZGVuIG1kOmJsb2NrIGFsaWduLWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmxvY2tcIj57eyBvcHRpb24ubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9wLW11bHRpU2VsZWN0PlxyXG5cclxuICA8cC1tdWx0aVNlbGVjdFxyXG4gICAgKm5nSWY9XCJmaWx0ZXJWaXJ0dWFsU2Nyb29sXCJcclxuICAgICNtdWx0aXNlbGVjdFxyXG4gICAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgIG9wdGlvbkxhYmVsPVwibmFtZVwiXHJcbiAgICBvcHRpb25WYWx1ZT1cImNvZGVcIlxyXG4gICAgZHJvcGRvd25JY29uPVwiZmFzIGZhLXNvcnQtZG93blwiXHJcbiAgICBzZWxlY3RlZEl0ZW1zTGFiZWw9XCJTZWxlY2lvbmFyIHRvZG9zXCJcclxuICAgIFtwYW5lbFN0eWxlQ2xhc3NdPVwiZmlsdGVyID8gJ2hhcy1maWx0ZXInIDogJydcIlxyXG4gICAgW29wdGlvbnNdPVwib3B0aW9uc1wiXHJcbiAgICBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiXHJcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxyXG4gICAgW2ZpbHRlcl09XCJmaWx0ZXJcIlxyXG4gICAgW21heFNlbGVjdGVkTGFiZWxzXT1cIm9wdGlvbnMubGVuZ3RoIC0gMVwiXHJcbiAgICBbc2hvd0hlYWRlcl09XCJ0cnVlXCJcclxuICAgIFtzaG93VG9nZ2xlQWxsXT1cInNob3dTZWxlY3RBbGxPcHRpb25cIlxyXG4gICAgW2Ryb3Bkb3duSWNvbl09XCIncGkgcGktY2hldnJvbi1kb3duJ1wiXHJcbiAgICBbZGlzcGxheV09XCJkaXNwbGF5XCJcclxuICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZS5lbWl0KCRldmVudClcIlxyXG4gICAgKG9uRmlsdGVyKT1cInNlYXJjaCgkZXZlbnQpXCJcclxuICAgIChvblBhbmVsU2hvdyk9XCJvbk9wZW5BdXRvY29tcGxldGVQYW5lbCgpXCJcclxuICAgIChvblBhbmVsSGlkZSk9XCJvbkhpZGVBdXRvY29tcGxldGVQYW5lbCgpXCJcclxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgPlxyXG4gIDwvcC1tdWx0aVNlbGVjdD5cclxuICA8cC1tdWx0aVNlbGVjdFxyXG4gICAgKm5nSWY9XCJmaWx0ZXJWaXJ0dWFsU2Nyb29sXCJcclxuICAgICNtdWx0aXNlbGVjdFxyXG4gICAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgIG9wdGlvbkxhYmVsPVwibmFtZVwiXHJcbiAgICBvcHRpb25WYWx1ZT1cImNvZGVcIlxyXG4gICAgZHJvcGRvd25JY29uPVwiZmFzIGZhLXNvcnQtZG93blwiXHJcbiAgICBzZWxlY3RlZEl0ZW1zTGFiZWw9XCJTZWxlY2lvbmFyIHRvZG9zXCJcclxuICAgIFtwYW5lbFN0eWxlQ2xhc3NdPVwiZmlsdGVyID8gJ2hhcy1maWx0ZXInIDogJydcIlxyXG4gICAgW29wdGlvbnNdPVwib3B0aW9uc1wiXHJcbiAgICBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiXHJcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxyXG4gICAgW2ZpbHRlcl09XCJmaWx0ZXJcIlxyXG4gICAgW21heFNlbGVjdGVkTGFiZWxzXT1cIm9wdGlvbnMubGVuZ3RoIC0gMVwiXHJcbiAgICBbc2hvd0hlYWRlcl09XCJ0cnVlXCJcclxuICAgIFtzaG93VG9nZ2xlQWxsXT1cInNob3dTZWxlY3RBbGxPcHRpb25cIlxyXG4gICAgW2Ryb3Bkb3duSWNvbl09XCIncGkgcGktY2hldnJvbi1kb3duJ1wiXHJcbiAgICBbZGlzcGxheV09XCJkaXNwbGF5XCJcclxuICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZS5lbWl0KCRldmVudClcIlxyXG4gICAgKG9uRmlsdGVyKT1cInNlYXJjaCgkZXZlbnQpXCJcclxuICAgIChvblBhbmVsU2hvdyk9XCJvbk9wZW5BdXRvY29tcGxldGVQYW5lbCgpXCJcclxuICAgIChvblBhbmVsSGlkZSk9XCJvbkhpZGVBdXRvY29tcGxldGVQYW5lbCgpXCJcclxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgPlxyXG4gIDwvcC1tdWx0aVNlbGVjdD5cclxuICA8c3BhbiBjbGFzcz1cImlucHV0LWVycm9yXCI+e3sgZmllbGRFcnJvckxhYmVsKCkgfX08L3NwYW4+XHJcbjwvZGl2PlxyXG4iXX0=
315
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlzZWxlY3QtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZlY3Rvci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9maWVsZHMvbXVsdGlzZWxlY3QtZmllbGQvbXVsdGlzZWxlY3QtZmllbGQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZlY3Rvci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9maWVsZHMvbXVsdGlzZWxlY3QtZmllbGQvbXVsdGlzZWxlY3QtZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJMUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUF3QjVDLE1BQU0sT0FBTyx5QkFBeUI7SUFDcEMsSUFDSSxjQUFjLENBQUMsZUFBMkI7UUFDNUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7UUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBd0NELElBQ0ksZ0JBQWdCLENBQUMsS0FBZ0M7UUFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO1NBQ3hGO1FBQ0QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3ZCLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxLQUFLLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO29CQUNyQixNQUFNLElBQUks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SztnQkFHQyxtQkFBbUI7c0JBRHpCLEtBQUs7Z0JBR0MsVUFBVTtzQkFEaEIsS0FBSztnQkFHQyxTQUFTO3NCQURmLEtBQUs7Z0JBS0MsWUFBWTtzQkFEbEIsS0FBSztnQkFHQyxlQUFlO3NCQURyQixLQUFLO2dCQUdDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBSUYsZ0JBQWdCO3NCQURuQixLQUFLO2dCQWlDQyxRQUFRO3NCQURkLE1BQU07Z0JBR0EsWUFBWTtzQkFEbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBSZW5kZXJlcjIsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNdWx0aVNlbGVjdEZpbHRlckV2ZW50IH0gZnJvbSAncHJpbWVuZy9tdWx0aXNlbGVjdCc7XHJcbmltcG9ydCB7IExpc3RJdGVtIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgQmFzZURyb3Bkb3duIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xyXG5pbXBvcnQgeyBPYmplY3RVdGlsIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xyXG5cclxuZXhwb3J0IHR5cGUgTGlzdEl0ZW1FeHRlbmQgPSBMaXN0SXRlbSAmIHtcclxuICBrZXk/OiBudW1iZXIgfCBzdHJpbmc7XHJcbiAgaWQ/OiBudW1iZXIgfCBzdHJpbmc7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBMaXN0SXRlbU9wdGlvbnNGbGFnVHlwZSA9IExpc3RJdGVtICYge1xyXG4gIGFsaWduOiAnY2VudGVyJyB8ICdsZWZ0JztcclxuICBzaG93RGVzY3JpcHRpb25PblJpZ2h0OiBib29sZWFuO1xyXG4gIHR5cGU6ICdpbWcnIHwgJ2ljb24nO1xyXG4gIGljb25Tb3VyY2U/OiBzdHJpbmc7XHJcbiAgaWNvblNpemU/OiAnMWVtJyB8ICcxLjI1ZW0nIHwgJzEuNWVtJyB8ICcxLjc1ZW0nIHwgJzJlbSc7XHJcbiAgaWNvbkNsYXNzPzogc3RyaW5nO1xyXG4gIGltZ1NvdXJjZT86IHN0cmluZztcclxuICBpbWdTaXplPzogJzE1JyB8ICcyMCcgfCAnMjUnO1xyXG4gIGltZ0NsYXNzPzogc3RyaW5nO1xyXG59O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd2ZWN0b3ItbXVsdGlzZWxlY3QtZmllbGQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9tdWx0aXNlbGVjdC1maWVsZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbXVsdGlzZWxlY3QtZmllbGQuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE11bHRpc2VsZWN0RmllbGRDb21wb25lbnQge1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHBhZ2VkU3VnZXN0aW9uKF9wYWdlZFN1Z2VzdGlvbjogTGlzdEl0ZW1bXSkge1xyXG4gICAgdGhpcy5fcGFnZWRTdWdlc3Rpb24gPSBfcGFnZWRTdWdlc3Rpb247XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLnBhZ2VkU3VnZXN0aW9uIHx8IFtdO1xyXG4gIH1cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBpc1JlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgY29udHJvbDogYW55O1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGxhYmVsOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBvcHRpb25zOiBMaXN0SXRlbVtdIHwgTGlzdEl0ZW1FeHRlbmRbXSB8IExpc3RJdGVtT3B0aW9uc0ZsYWdUeXBlW10gPSBbXTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBmaWx0ZXIgPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzaG93U2VsZWN0QWxsT3B0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkaXNwbGF5OiBzdHJpbmcgPSAnY29tbWEnO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHBhZ2VkID0gdHJ1ZTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIG1pbkxlbmd0aFRvU2VydmljZTogbnVtYmVyID0gMDtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBpbml0aWFsTG9hZCA9IHRydWU7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2VydmljZTogQmFzZURyb3Bkb3duIHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGZpbHRlclZpcnR1YWxTY3Jvb2wgPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzaG93SGVhZGVyOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzaG93RmxhZ3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9zaG93RmxhZ3NPcHRpb25zPzogTGlzdEl0ZW1PcHRpb25zRmxhZ1R5cGVbXSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGVwZW5kZW5jaWVzOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgbGltaXRTY3JvbGxQYWdlOiBudW1iZXIgPSAyMDtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBmb3JjZVNlbGVjdGlvbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHNob3dGbGFnc09wdGlvbnModmFsdWU6IExpc3RJdGVtT3B0aW9uc0ZsYWdUeXBlW10pIHtcclxuICAgIGlmICghdGhpcy5zaG93RmxhZ3MpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaG93RmxhZ3MgaXMgc2V0IHRvIGZhbHNlLiBTZXR0aW5nIHNob3dGbGFnc09wdGlvbnMgaXMgbm90IGFsbG93ZWQuJyk7XHJcbiAgICB9XHJcbiAgICB2YWx1ZS5mb3JFYWNoKChvcHRpb24pID0+IHtcclxuICAgICAgaWYgKG9wdGlvbi50eXBlID09PSAnaW1nJykge1xyXG4gICAgICAgIGlmICghb3B0aW9uLmltZ1NvdXJjZSkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW1nU291cmNlIGlzIHJlcXVpcmVkIHdoZW4gdHlwZSBpcyAnaW1nJ1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFvcHRpb24uaW1nU2l6ZSkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW1nU2l6ZSBpcyByZXF1aXJlZCB3aGVuIHR5cGUgaXMgJ2ltZydcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbi50eXBlID09PSAnaWNvbicpIHtcclxuICAgICAgICBpZiAoIW9wdGlvbi5pY29uU291cmNlKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpY29uU291cmNlIGlzIHJlcXVpcmVkIHdoZW4gdHlwZSBpcyAnaWNvbidcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghb3B0aW9uLmljb25TaXplKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpY29uU2l6ZSBpcyByZXF1aXJlZCB3aGVuIHR5cGUgaXMgJ2ljb24nXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9zaG93RmxhZ3NPcHRpb25zID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgc2hvd0ZsYWdzT3B0aW9ucygpOiBMaXN0SXRlbU9wdGlvbnNGbGFnVHlwZVtdIHtcclxuICAgIGlmICghdGhpcy5fc2hvd0ZsYWdzT3B0aW9ucykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3dGbGFnc09wdGlvbnMgd2FzIG5vdCBzZXQnKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9zaG93RmxhZ3NPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBvbkNsb3NlUGFuZWwgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIHByaXZhdGUgY3VycmVudFNlYXJjaFF1ZXJ5ID0gJyc7XHJcbiAgcHJpdmF0ZSBjdXJyZW50U2Nyb2xsUGFnZSA9IC0xO1xyXG4gIHByaXZhdGUgY3VycmVudFNjcm9sbEluZGV4ID0gMDtcclxuXHJcbiAgcHVibGljIHVubGlzdGVuQXV0b2NvbXBsZXRlVmlydHVhbFNjcm9sbCA9ICgpID0+IHt9O1xyXG5cclxuICBnZXQgcGxhY2Vob2xkZXIoKSB7XHJcbiAgICBpZiAoIXRoaXMubGFiZWwpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGAke3RoaXMubGFiZWx9JHt0aGlzLmlzUmVxdWlyZWQgPyAnKicgOiAnJ31gO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhZ2VkU3VnZXN0aW9uKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VkU3VnZXN0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcGFnZWRTdWdlc3Rpb246IExpc3RJdGVtW10gPSBbXTtcclxuICBwcml2YXRlIHNpZ25hbE9wdGlvbnMgPSBzaWduYWw8TGlzdEl0ZW1bXT4oW10pO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaW5pdGlhbExvYWQgJiYgdGhpcy5maWx0ZXJWaXJ0dWFsU2Nyb29sKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoKG51bGwsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLmNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jb250cm9sLmVuYWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNlcnZpY2UgJiYgdGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC52YWx1ZSAmJiBBcnJheS5pc0FycmF5KHRoaXMuY29udHJvbC52YWx1ZSkpIHtcclxuICAgICAgY29uc3QgY29udHJvbFZhbHVlQXJyYXkgPSB0aGlzLmNvbnRyb2wudmFsdWUubWFwKCh2YWx1ZTogYW55KSA9PiB2YWx1ZSk7XHJcbiAgICAgIGlmIChjb250cm9sVmFsdWVBcnJheS5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmxvYWRJbml0aWFsU2VsZWN0ZWRWYWx1ZXMoY29udHJvbFZhbHVlQXJyYXkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZmllbGRFcnJvckxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5pbnZhbGlkICYmIHRoaXMuY29udHJvbC50b3VjaGVkKSB7XHJcbiAgICAgIGlmICh0aGlzLmNvbnRyb2wuaGFzRXJyb3IoJ3JlcXVpcmVkJykpIHtcclxuICAgICAgICByZXR1cm4gJ0NhbXBvIG9icmlnYXTDs3Jpbyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5jb250cm9sLmVycm9yc1snaW52YWxpZCddID09PSAnc3RyaW5nJyA/IHRoaXMuY29udHJvbC5lcnJvcnNbJ2ludmFsaWQnXSA6ICdDYW1wbyBpbnbDoWxpZG8nO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjdXN0b21Gb3JtYXR0aW5nTXVsdGlTZWxlY3RGaWVsZFdpdGhGbGFncygpOiB2b2lkIHtcclxuICAgIHRoaXMub25sb2FkQXV0b2NvbXBsZXRlUGFuZWxTZXJ2aWNlKCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHZlY3Rvck11bHRpc2VsZWN0RmllbGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd2ZWN0b3ItbXVsdGlzZWxlY3QtZmllbGQubXVsdGlzZWxlY3QtZmxhZ3MnKTtcclxuXHJcbiAgICAgIGlmICh2ZWN0b3JNdWx0aXNlbGVjdEZpZWxkKSB7XHJcbiAgICAgICAgY29uc3QgcE92ZXJsYXlFbGVtZW50ID0gdmVjdG9yTXVsdGlzZWxlY3RGaWVsZC5xdWVyeVNlbGVjdG9yKCdwLW92ZXJsYXknKTtcclxuXHJcbiAgICAgICAgaWYgKHBPdmVybGF5RWxlbWVudCkge1xyXG4gICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gQXJyYXkuZnJvbShwT3ZlcmxheUVsZW1lbnQuY2xhc3NMaXN0KTtcclxuICAgICAgICAgIGNvbnN0IHRhcmdldENsYXNzID0gY2xhc3NMaXN0LmZpbmQoKGNsYXNzTmFtZSkgPT4gY2xhc3NOYW1lLnN0YXJ0c1dpdGgoJ25nLXRucy0nKSk7XHJcblxyXG4gICAgICAgICAgaWYgKHRhcmdldENsYXNzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzUmVmZXJlbmNlQ29kZSA9IHRhcmdldENsYXNzLnJlcGxhY2UoJ25nLXRucy0nLCAnJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldERpdldpdGhSZWZDb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgZGl2Lm5nLXRucy0ke2NsYXNzUmVmZXJlbmNlQ29kZX1gKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0YXJnZXREaXZXaXRoUmVmQ29kZSkge1xyXG4gICAgICAgICAgICAgIHRhcmdldERpdldpdGhSZWZDb2RlLmNsYXNzTGlzdC5hZGQoJ211bHRpc2VsZWN0LWZsYWdzJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sIDIwMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9ubG9hZEF1dG9jb21wbGV0ZVBhbmVsU2VydmljZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNlcnZpY2UpIHtcclxuICAgICAgdGhpcy5zZWFyY2goKTtcclxuICAgICAgdGhpcy5jdXJyZW50U2Nyb2xsUGFnZSsrO1xyXG5cclxuICAgICAgdGhpcy5zZXJ2aWNlXHJcbiAgICAgICAgLmdldFBhZ2VkKFxyXG4gICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuY3VycmVudFNlYXJjaFF1ZXJ5KSxcclxuICAgICAgICAgIHRoaXMuY3VycmVudFNjcm9sbFBhZ2UsXHJcbiAgICAgICAgICB0aGlzLmxpbWl0U2Nyb2xsUGFnZSxcclxuICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U2lnbmFsT3B0aW9ucyA9IHRoaXMuc2lnbmFsT3B0aW9ucygpIHx8IFtdO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGNvbWJpbmVkID0gW1xyXG4gICAgICAgICAgICAgICAgLi4uY3VycmVudFNpZ25hbE9wdGlvbnMsXHJcbiAgICAgICAgICAgICAgICAuLi5yZXNwb25zZSxcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmN1cnJlbnRTY3JvbGxQYWdlID09PSAwID8gW10gOiAodGhpcy5vcHRpb25zIGFzIChMaXN0SXRlbSB8IExpc3RJdGVtT3B0aW9uc0ZsYWdUeXBlKVtdKSksXHJcbiAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgICBjb25zdCB1bmlxdWVPcHRpb25zID0gY29tYmluZWQuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgKGl0ZW0sIGluZGV4LCBzZWxmKSA9PiBzZWxmLmZpbmRJbmRleCgoaSkgPT4gaS5jb2RlID09PSBpdGVtLmNvZGUpID09PSBpbmRleFxyXG4gICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IHVuaXF1ZU9wdGlvbnM7XHJcbiAgICAgICAgICAgICAgdGhpcy5zaWduYWxPcHRpb25zLnNldCh1bmlxdWVPcHRpb25zKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmN1cnJlbnRTY3JvbGxQYWdlID09PSAwID8gW10gOiB0aGlzLm9wdGlvbnM7XHJcbiAgICAgICAgICAgICAgdGhpcy5zaWduYWxPcHRpb25zLnNldCh0aGlzLm9wdGlvbnMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0eXBlb2YgdGhpcy5jb250cm9sLnZhbHVlID09ICdvYmplY3QnID8gdGhpcy5jb250cm9sLnZhbHVlPy5jb2RlIDogdGhpcy5jb250cm9sLnZhbHVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbC52YWx1ZSAmJiB0aGlzLm9wdGlvbnM/LmZpbmQoKGl0ZW0pID0+IGl0ZW0uY29kZSA9PSBjb250cm9sVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRDb250cm9sVmFsdWVGcm9tU3VnZ2VzdGlvbnMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZm9yY2VTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICB0aGlzLmhhbmRsZVNlYXJjaEVycm9ycygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnIpID0+IHt9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkSW5pdGlhbFNlbGVjdGVkVmFsdWVzKGNvbnRyb2xWYWx1ZUFycmF5OiBhbnlbXSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnNlcnZpY2UpIHJldHVybjtcclxuICAgIHRoaXMuc2VydmljZS5nZXRQYWdlZCgnJywgMCwgdGhpcy5saW1pdFNjcm9sbFBhZ2UsIHRoaXMuZGVwZW5kZW5jaWVzKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSByZXNwb25zZTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxDb250cm9sVmFsdWVzKGNvbnRyb2xWYWx1ZUFycmF5KTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHt9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEluaXRpYWxDb250cm9sVmFsdWVzKHZhbHVlczogYW55W10pOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSAodGhpcy5vcHRpb25zIGFzIExpc3RJdGVtRXh0ZW5kW10pXHJcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHZhbHVlcy5pbmNsdWRlcyhpdGVtLmNvZGUgfHwgaXRlbS5rZXkgfHwgaXRlbS5pZCkpXHJcbiAgICAgIC5tYXAoKGVsKSA9PiAoZWwuY29kZSA9IGVsLmtleSA/IGVsLmtleSA6IGVsLmlkID8gZWwuaWQgOiBlbC5jb2RlKSk7XHJcbiAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoc2VsZWN0ZWRJdGVtcywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uT3BlbkF1dG9jb21wbGV0ZVBhbmVsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWFyY2goKTtcclxuICAgIGNvbnN0IG11bHRpU2VsZWN0UGFuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucC1tdWx0aXNlbGVjdC1pdGVtcy13cmFwcGVyJyk7XHJcblxyXG4gICAgaWYgKG11bHRpU2VsZWN0UGFuZWwgJiYgdGhpcy5wYWdlZCAmJiB0aGlzLmN1cnJlbnRTZWFyY2hRdWVyeS5sZW5ndGggPj0gdGhpcy5taW5MZW5ndGhUb1NlcnZpY2UpIHtcclxuICAgICAgdGhpcy51bmxpc3RlbkF1dG9jb21wbGV0ZVZpcnR1YWxTY3JvbGwgPSB0aGlzLnJlbmRlcmVyLmxpc3RlbihtdWx0aVNlbGVjdFBhbmVsLCAnc2Nyb2xsJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXZlbnRIZWlnaHQgPSBldmVudC50YXJnZXQuc2Nyb2xsSGVpZ2h0IC0gZXZlbnQudGFyZ2V0LmNsaWVudEhlaWdodCAtIDE1MDtcclxuXHJcbiAgICAgICAgaWYgKE1hdGgucm91bmQoZXZlbnQudGFyZ2V0LnNjcm9sbFRvcCkgPj0gZXZlbnRIZWlnaHQpIHtcclxuICAgICAgICAgIHRoaXMucGFnZVJlc3VsdHMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uSGlkZUF1dG9jb21wbGV0ZVBhbmVsKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucGFnZWQpIHtcclxuICAgICAgdGhpcy51bmxpc3RlbkF1dG9jb21wbGV0ZVZpcnR1YWxTY3JvbGwoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWFyY2goJGV2ZW50PzogYW55LCBmb3JjZVNlYXJjaCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICB0aGlzLmN1cnJlbnRTZWFyY2hRdWVyeSA9ICRldmVudD8uZmlsdGVyLnRvVXBwZXJDYXNlKCkgfHwgJyc7XHJcbiAgICB0aGlzLmN1cnJlbnRTY3JvbGxQYWdlID0gLTE7XHJcbiAgICB0aGlzLmN1cnJlbnRTY3JvbGxJbmRleCA9IDA7XHJcbiAgICBpZiAoZm9yY2VTZWFyY2ggfHwgdGhpcy5jdXJyZW50U2VhcmNoUXVlcnkubGVuZ3RoID49IHRoaXMubWluTGVuZ3RoVG9TZXJ2aWNlKSB7XHJcbiAgICAgIHRoaXMucGFnZVJlc3VsdHMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucyA9IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRmlsdGVyQ2hhbmdlKCRldmVudD86IE11bHRpU2VsZWN0RmlsdGVyRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghJGV2ZW50IHx8ICEkZXZlbnQuZmlsdGVyKSByZXR1cm47XHJcblxyXG4gICAgaWYgKHRoaXMuc2VydmljZSAmJiAkZXZlbnQ/LmZpbHRlci5sZW5ndGggPj0gdGhpcy5taW5MZW5ndGhUb1NlcnZpY2UpIHtcclxuICAgICAgdGhpcy5zZXJ2aWNlLmdldFBhZ2VkKCRldmVudC5maWx0ZXIsIHRoaXMuY3VycmVudFNjcm9sbFBhZ2UsIHRoaXMubGltaXRTY3JvbGxQYWdlLCB0aGlzLmRlcGVuZGVuY2llcykuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzcG9uc2U6IExpc3RJdGVtW10pID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudFNpZ25hbE9wdGlvbnMgPSB0aGlzLnNpZ25hbE9wdGlvbnMoKSB8fCBbXTtcclxuICAgICAgICAgICAgY29uc3QgY29tYmluZWQgPSBbLi4ucmVzcG9uc2UsIC4uLmN1cnJlbnRTaWduYWxPcHRpb25zLCAuLi4odGhpcy5vcHRpb25zIGFzIExpc3RJdGVtW10pXTtcclxuICAgICAgICAgICAgY29uc3QgdW5pcXVlT3B0aW9ucyA9IGNvbWJpbmVkLmZpbHRlcihcclxuICAgICAgICAgICAgICAoaXRlbSwgaW5kZXgsIHNlbGYpID0+IHNlbGYuZmluZEluZGV4KChpKSA9PiBpLmNvZGUgPT09IGl0ZW0uY29kZSkgPT09IGluZGV4XHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB1bmlxdWVPcHRpb25zO1xyXG4gICAgICAgICAgICB0aGlzLnNpZ25hbE9wdGlvbnMuc2V0KHVuaXF1ZU9wdGlvbnMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHt9LFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFnZVJlc3VsdHMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbnMgPSB0aGlzLmZpbHRlckxpc3RCeVF1ZXJ5KHRoaXMucGFnZWRTdWdlc3Rpb24sIHRoaXMuY3VycmVudFNlYXJjaFF1ZXJ5LnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgdGhpcy5vcHRpb25zID0gZmlsdGVyZWRPcHRpb25zLnNsaWNlKDAsIHRoaXMuY3VycmVudFNjcm9sbEluZGV4ICsgMjApO1xyXG5cclxuICAgIGlmICh0aGlzLnBhZ2VkU3VnZXN0aW9uPy5sZW5ndGggJiYgdGhpcy5wYWdlZFN1Z2VzdGlvbi5sZW5ndGggPiAyMCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRTY3JvbGxJbmRleCA9IHRoaXMuY3VycmVudFNjcm9sbEluZGV4ICsgMjA7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXRDb250cm9sVmFsdWVGcm9tU3VnZ2VzdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmlsdGVyTGlzdEJ5UXVlcnkobGlzdDogTGlzdEl0ZW1bXSA9IFtdLCBxdWVyeTogc3RyaW5nKTogTGlzdEl0ZW1bXSB7XHJcbiAgICByZXR1cm4gbGlzdC5maWx0ZXIoXHJcbiAgICAgIChvcHQpID0+IFN0cmluZyhvcHQuY29kZSkudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkgfHwgb3B0Lm5hbWUudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldENvbnRyb2xWYWx1ZUZyb21TdWdnZXN0aW9ucygpIHtcclxuICAgIGNvbnN0IGNvZGUgPVxyXG4gICAgICAoT2JqZWN0VXRpbC5pc1ZhbGlkKHRoaXMuY29udHJvbC52YWx1ZT8uY29kZSkgJiYgYCR7dGhpcy5jb250cm9sLnZhbHVlPy5jb2RlfWApIHx8IGAke3RoaXMuY29udHJvbC52YWx1ZX1gO1xyXG4gICAgaWYgKHRoaXMuY29udHJvbC52YWx1ZSAmJiB0aGlzLm9wdGlvbnM/Lmxlbmd0aCkge1xyXG4gICAgICBsZXQgaXRlbXNBcnJheSA9IHRoaXMub3B0aW9ucztcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgaXRlbXNBcnJheSA9IHRoaXMub3B0aW9ucztcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBpdGVtRnJvbVN1Z2dlc3Rpb25zID0gaXRlbXNBcnJheS5maW5kKChvcHQpID0+IGAke29wdC5jb2RlfWAudG9VcHBlckNhc2UoKSA9PT0gY29kZS50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgaWYgKGl0ZW1Gcm9tU3VnZ2VzdGlvbnMpIHtcclxuICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoaXRlbUZyb21TdWdnZXN0aW9ucywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2VydmljZT8uZ2V0QnlJZCgrY29kZSkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHJlc3BvbnNlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy5jb250cm9sLnZhbHVlICYmICF0aGlzLm9wdGlvbnM/Lmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNlcnZpY2U/LmdldEJ5SWQoK2NvZGUpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUocmVzcG9uc2UsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZVNlYXJjaEVycm9ycygpIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnM/Lmxlbmd0aCkge1xyXG4gICAgICBkZWxldGUgdGhpcy5jb250cm9sLmVycm9ycz8uaXRlbU5vdEZvdW5kO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRTZWFyY2hRdWVyeSkge1xyXG4gICAgICB0aGlzLmNvbnRyb2wuc2V0RXJyb3JzKHsgaXRlbU5vdEZvdW5kOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibXVsdGlzZWxlY3QtZmllbGQtaW5wdXQtY29udGFpbmVyXCI+XHJcbiAgPHAtbXVsdGlTZWxlY3RcclxuICAgICpuZ0lmPVwiIWZpbHRlclZpcnR1YWxTY3Jvb2xcIlxyXG4gICAgI211bHRpc2VsZWN0XHJcbiAgICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgb3B0aW9uTGFiZWw9XCJuYW1lXCJcclxuICAgIG9wdGlvblZhbHVlPVwiY29kZVwiXHJcbiAgICBkcm9wZG93bkljb249XCJmYXMgZmEtc29ydC1kb3duXCJcclxuICAgIHNlbGVjdGVkSXRlbXNMYWJlbD1cIlNlbGVjaW9uYXIgdG9kb3NcIlxyXG4gICAgW3BhbmVsU3R5bGVDbGFzc109XCJmaWx0ZXIgPyAnaGFzLWZpbHRlcicgOiAnJ1wiXHJcbiAgICBbb3B0aW9uc109XCJvcHRpb25zXCJcclxuICAgIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCJcclxuICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXHJcbiAgICBbZmlsdGVyXT1cImZpbHRlclwiXHJcbiAgICBbbWF4U2VsZWN0ZWRMYWJlbHNdPVwib3B0aW9ucy5sZW5ndGggLSAxXCJcclxuICAgIFtzaG93VG9nZ2xlQWxsXT1cInNob3dTZWxlY3RBbGxPcHRpb25cIlxyXG4gICAgW2Ryb3Bkb3duSWNvbl09XCIncGkgcGktY2hldnJvbi1kb3duJ1wiXHJcbiAgICBbZGlzcGxheV09XCJkaXNwbGF5XCJcclxuICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZS5lbWl0KCRldmVudClcIlxyXG4gICAgKG9uUGFuZWxIaWRlKT1cIm9uQ2xvc2VQYW5lbC5lbWl0KCRldmVudClcIlxyXG4gICAgKG9uUGFuZWxTaG93KT1cImN1c3RvbUZvcm1hdHRpbmdNdWx0aVNlbGVjdEZpZWxkV2l0aEZsYWdzKClcIlxyXG4gICAgKG9uRmlsdGVyKT1cIm9uRmlsdGVyQ2hhbmdlKCRldmVudClcIlxyXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgIFtzaG93SGVhZGVyXT1cInNob3dIZWFkZXJcIlxyXG4gID5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RmxhZ3NcIj5cclxuICAgICAgPG5nLXRlbXBsYXRlIGxldC1vcHRpb24gcFRlbXBsYXRlPVwiaXRlbVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLW5vZ3V0dGVyIHctZnVsbCBmbGV4XCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwibWQ6Y29sLTYgc206Y29sLTEyIGFsaWduLWNvbnRlbnQtY2VudGVyXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwib3B0aW9uLmFsaWduID09PSAnY2VudGVyJyA/ICdtZDp0ZXh0LWNlbnRlcicgOiAnbWQ6dGV4dC1sZWZ0J1wiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpbWdcclxuICAgICAgICAgICAgICAqbmdJZj1cIm9wdGlvbi50eXBlID09ICdpbWcnXCJcclxuICAgICAgICAgICAgICBbc3JjXT1cIm9wdGlvbi5pbWdTb3VyY2VcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIm9wdGlvbi5pbWdDbGFzc1wiXHJcbiAgICAgICAgICAgICAgW3N0eWxlXT1cInsgaGVpZ2h0OiBvcHRpb24uaW1nU2l6ZSArICdweCcgfVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJvcHRpb24udHlwZSA9PSAnaWNvbidcIlxyXG4gICAgICAgICAgICAgIFtjbGFzc05hbWVdPVwib3B0aW9uLmljb25Tb3VyY2VcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIm9wdGlvbi5pY29uQ2xhc3NcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZV09XCJ7ICdmb250LXNpemUnOiBvcHRpb24uaWNvblNpemUgfVwiXHJcbiAgICAgICAgICAgID48L2k+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwib3B0aW9uLnNob3dEZXNjcmlwdGlvbk9uUmlnaHRcIiBjbGFzcz1cImNvbC02IGhpZGRlbiBtZDpibG9jayBhbGlnbi1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJsb2NrXCI+e3sgb3B0aW9uLm5hbWUgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvcC1tdWx0aVNlbGVjdD5cclxuXHJcbiAgPHAtbXVsdGlTZWxlY3RcclxuICAgICpuZ0lmPVwiZmlsdGVyVmlydHVhbFNjcm9vbFwiXHJcbiAgICAjbXVsdGlzZWxlY3RcclxuICAgIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICBvcHRpb25MYWJlbD1cIm5hbWVcIlxyXG4gICAgb3B0aW9uVmFsdWU9XCJjb2RlXCJcclxuICAgIGRyb3Bkb3duSWNvbj1cImZhcyBmYS1zb3J0LWRvd25cIlxyXG4gICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiU2VsZWNpb25hciB0b2Rvc1wiXHJcbiAgICBbcGFuZWxTdHlsZUNsYXNzXT1cImZpbHRlciA/ICdoYXMtZmlsdGVyJyA6ICcnXCJcclxuICAgIFtvcHRpb25zXT1cIm9wdGlvbnNcIlxyXG4gICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxyXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcclxuICAgIFtmaWx0ZXJdPVwiZmlsdGVyXCJcclxuICAgIFttYXhTZWxlY3RlZExhYmVsc109XCJvcHRpb25zLmxlbmd0aCAtIDFcIlxyXG4gICAgW3Nob3dIZWFkZXJdPVwidHJ1ZVwiXHJcbiAgICBbc2hvd1RvZ2dsZUFsbF09XCJzaG93U2VsZWN0QWxsT3B0aW9uXCJcclxuICAgIFtkcm9wZG93bkljb25dPVwiJ3BpIHBpLWNoZXZyb24tZG93bidcIlxyXG4gICAgW2Rpc3BsYXldPVwiZGlzcGxheVwiXHJcbiAgICAob25DaGFuZ2UpPVwib25DaGFuZ2UuZW1pdCgkZXZlbnQpXCJcclxuICAgIChvbkZpbHRlcik9XCJzZWFyY2goJGV2ZW50KVwiXHJcbiAgICAob25QYW5lbFNob3cpPVwib25PcGVuQXV0b2NvbXBsZXRlUGFuZWwoKVwiXHJcbiAgICAob25QYW5lbEhpZGUpPVwib25IaWRlQXV0b2NvbXBsZXRlUGFuZWwoKVwiXHJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gID5cclxuICA8L3AtbXVsdGlTZWxlY3Q+XHJcbiAgPHNwYW4gY2xhc3M9XCJpbnB1dC1lcnJvclwiPnt7IGZpZWxkRXJyb3JMYWJlbCgpIH19PC9zcGFuPlxyXG48L2Rpdj5cclxuIl19
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Component, Input, Pipe, NgModule, InjectionToken, Inject, EventEmitter, Output, Injectable, ViewChild, ViewEncapsulation, HostListener, inject } from '@angular/core';
2
+ import { Component, Input, Pipe, NgModule, InjectionToken, Inject, EventEmitter, Output, Injectable, ViewChild, signal, ViewEncapsulation, HostListener, inject } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
5
  import * as i2 from 'primeng/tooltip';
@@ -2888,6 +2888,7 @@ class MultiselectFieldComponent {
2888
2888
  this.currentScrollIndex = 0;
2889
2889
  this.unlistenAutocompleteVirtualScroll = () => { };
2890
2890
  this._pagedSugestion = [];
2891
+ this.signalOptions = signal([]);
2891
2892
  }
2892
2893
  ngOnInit() {
2893
2894
  if (this.initialLoad && this.filterVirtualScrool) {
@@ -2943,10 +2944,21 @@ class MultiselectFieldComponent {
2943
2944
  .getPaged(encodeURIComponent(this.currentSearchQuery), this.currentScrollPage, this.limitScrollPage, this.dependencies)
2944
2945
  .subscribe({
2945
2946
  next: (response) => {
2946
- this.options =
2947
- this.currentScrollPage === 0
2948
- ? response
2949
- : this.options?.concat(response);
2947
+ if (response && response.length) {
2948
+ const currentSignalOptions = this.signalOptions() || [];
2949
+ const combined = [
2950
+ ...currentSignalOptions,
2951
+ ...response,
2952
+ ...(this.currentScrollPage === 0 ? [] : this.options),
2953
+ ];
2954
+ const uniqueOptions = combined.filter((item, index, self) => self.findIndex((i) => i.code === item.code) === index);
2955
+ this.options = uniqueOptions;
2956
+ this.signalOptions.set(uniqueOptions);
2957
+ }
2958
+ else {
2959
+ this.options = this.currentScrollPage === 0 ? [] : this.options;
2960
+ this.signalOptions.set(this.options);
2961
+ }
2950
2962
  const controlValue = typeof this.control.value == 'object' ? this.control.value?.code : this.control.value;
2951
2963
  if (this.control.value && this.options?.find((item) => item.code == controlValue)) {
2952
2964
  this.setControlValueFromSuggestions();
@@ -3004,6 +3016,24 @@ class MultiselectFieldComponent {
3004
3016
  this.options = [];
3005
3017
  }
3006
3018
  }
3019
+ onFilterChange($event) {
3020
+ if (!$event || !$event.filter)
3021
+ return;
3022
+ if (this.service && $event?.filter.length >= this.minLengthToService) {
3023
+ this.service.getPaged($event.filter, this.currentScrollPage, this.limitScrollPage, this.dependencies).subscribe({
3024
+ next: (response) => {
3025
+ if (response && response.length) {
3026
+ const currentSignalOptions = this.signalOptions() || [];
3027
+ const combined = [...response, ...currentSignalOptions, ...this.options];
3028
+ const uniqueOptions = combined.filter((item, index, self) => self.findIndex((i) => i.code === item.code) === index);
3029
+ this.options = uniqueOptions;
3030
+ this.signalOptions.set(uniqueOptions);
3031
+ }
3032
+ },
3033
+ error: (err) => { },
3034
+ });
3035
+ }
3036
+ }
3007
3037
  pageResults() {
3008
3038
  const filteredOptions = this.filterListByQuery(this.pagedSugestion, this.currentSearchQuery.toUpperCase());
3009
3039
  this.options = filteredOptions.slice(0, this.currentScrollIndex + 20);
@@ -3047,11 +3077,11 @@ class MultiselectFieldComponent {
3047
3077
  }
3048
3078
  }
3049
3079
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiselectFieldComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
3050
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiselectFieldComponent, selector: "vector-multiselect-field", inputs: { pagedSugestion: "pagedSugestion", isRequired: "isRequired", control: "control", label: "label", options: "options", filter: "filter", showSelectAllOption: "showSelectAllOption", display: "display", paged: "paged", disabled: "disabled", minLengthToService: "minLengthToService", initialLoad: "initialLoad", service: "service", filterVirtualScrool: "filterVirtualScrool", showHeader: "showHeader", showFlags: "showFlags", dependencies: "dependencies", limitScrollPage: "limitScrollPage", forceSelection: "forceSelection", showFlagsOptions: "showFlagsOptions" }, outputs: { onChange: "onChange", onClosePanel: "onClosePanel" }, ngImport: i0, template: "<div class=\"multiselect-field-input-container\">\r\n <p-multiSelect\r\n *ngIf=\"!filterVirtualScrool\"\r\n #multiselect\r\n appendTo=\"body\"\r\n optionLabel=\"name\"\r\n optionValue=\"code\"\r\n dropdownIcon=\"fas fa-sort-down\"\r\n selectedItemsLabel=\"Selecionar todos\"\r\n [panelStyleClass]=\"filter ? 'has-filter' : ''\"\r\n [options]=\"options\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"placeholder\"\r\n [filter]=\"filter\"\r\n [maxSelectedLabels]=\"options.length - 1\"\r\n [showToggleAll]=\"showSelectAllOption\"\r\n [dropdownIcon]=\"'pi pi-chevron-down'\"\r\n [display]=\"display\"\r\n (onChange)=\"onChange.emit($event)\"\r\n (onPanelHide)=\"onClosePanel.emit($event)\"\r\n (onPanelShow)=\"customFormattingMultiSelectFieldWithFlags()\"\r\n [disabled]=\"disabled\"\r\n [showHeader]=\"showHeader\"\r\n >\r\n <ng-container *ngIf=\"showFlags\">\r\n <ng-template let-option pTemplate=\"item\">\r\n <div class=\"grid-nogutter w-full flex\">\r\n <div\r\n class=\"md:col-6 sm:col-12 align-content-center\"\r\n [ngClass]=\"option.align === 'center' ? 'md:text-center' : 'md:text-left'\"\r\n >\r\n <img\r\n *ngIf=\"option.type == 'img'\"\r\n [src]=\"option.imgSource\"\r\n [ngClass]=\"option.imgClass\"\r\n [style]=\"{ height: option.imgSize + 'px' }\"\r\n />\r\n <i\r\n *ngIf=\"option.type == 'icon'\"\r\n [className]=\"option.iconSource\"\r\n [ngClass]=\"option.iconClass\"\r\n [style]=\"{ 'font-size': option.iconSize }\"\r\n ></i>\r\n </div>\r\n\r\n <div *ngIf=\"option.showDescriptionOnRight\" class=\"col-6 hidden md:block align-content-center\">\r\n <span class=\"block\">{{ option.name }}</span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </p-multiSelect>\r\n\r\n <p-multiSelect\r\n *ngIf=\"filterVirtualScrool\"\r\n #multiselect\r\n appendTo=\"body\"\r\n optionLabel=\"name\"\r\n optionValue=\"code\"\r\n dropdownIcon=\"fas fa-sort-down\"\r\n selectedItemsLabel=\"Selecionar todos\"\r\n [panelStyleClass]=\"filter ? 'has-filter' : ''\"\r\n [options]=\"options\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"placeholder\"\r\n [filter]=\"filter\"\r\n [maxSelectedLabels]=\"options.length - 1\"\r\n [showHeader]=\"true\"\r\n [showToggleAll]=\"showSelectAllOption\"\r\n [dropdownIcon]=\"'pi pi-chevron-down'\"\r\n [display]=\"display\"\r\n (onChange)=\"onChange.emit($event)\"\r\n (onFilter)=\"search($event)\"\r\n (onPanelShow)=\"onOpenAutocompletePanel()\"\r\n (onPanelHide)=\"onHideAutocompletePanel()\"\r\n [disabled]=\"disabled\"\r\n >\r\n </p-multiSelect>\r\n <p-multiSelect\r\n *ngIf=\"filterVirtualScrool\"\r\n #multiselect\r\n appendTo=\"body\"\r\n optionLabel=\"name\"\r\n optionValue=\"code\"\r\n dropdownIcon=\"fas fa-sort-down\"\r\n selectedItemsLabel=\"Selecionar todos\"\r\n [panelStyleClass]=\"filter ? 'has-filter' : ''\"\r\n [options]=\"options\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"placeholder\"\r\n [filter]=\"filter\"\r\n [maxSelectedLabels]=\"options.length - 1\"\r\n [showHeader]=\"true\"\r\n [showToggleAll]=\"showSelectAllOption\"\r\n [dropdownIcon]=\"'pi pi-chevron-down'\"\r\n [display]=\"display\"\r\n (onChange)=\"onChange.emit($event)\"\r\n (onFilter)=\"search($event)\"\r\n (onPanelShow)=\"onOpenAutocompletePanel()\"\r\n (onPanelHide)=\"onHideAutocompletePanel()\"\r\n [disabled]=\"disabled\"\r\n >\r\n </p-multiSelect>\r\n <span class=\"input-error\">{{ fieldErrorLabel() }}</span>\r\n</div>\r\n", styles: [".multiselect-field-input-container .input-error{font-size:.7em;color:var(--error-color)}.multiselect-field-input-container div.p-multiselect-token{padding:auto 1em!important;background:#eff0f6!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2$2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i4$2.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }] }); }
3080
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiselectFieldComponent, selector: "vector-multiselect-field", inputs: { pagedSugestion: "pagedSugestion", isRequired: "isRequired", control: "control", label: "label", options: "options", filter: "filter", showSelectAllOption: "showSelectAllOption", display: "display", paged: "paged", disabled: "disabled", minLengthToService: "minLengthToService", initialLoad: "initialLoad", service: "service", filterVirtualScrool: "filterVirtualScrool", showHeader: "showHeader", showFlags: "showFlags", dependencies: "dependencies", limitScrollPage: "limitScrollPage", forceSelection: "forceSelection", showFlagsOptions: "showFlagsOptions" }, outputs: { onChange: "onChange", onClosePanel: "onClosePanel" }, ngImport: i0, template: "<div class=\"multiselect-field-input-container\">\r\n <p-multiSelect\r\n *ngIf=\"!filterVirtualScrool\"\r\n #multiselect\r\n appendTo=\"body\"\r\n optionLabel=\"name\"\r\n optionValue=\"code\"\r\n dropdownIcon=\"fas fa-sort-down\"\r\n selectedItemsLabel=\"Selecionar todos\"\r\n [panelStyleClass]=\"filter ? 'has-filter' : ''\"\r\n [options]=\"options\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"placeholder\"\r\n [filter]=\"filter\"\r\n [maxSelectedLabels]=\"options.length - 1\"\r\n [showToggleAll]=\"showSelectAllOption\"\r\n [dropdownIcon]=\"'pi pi-chevron-down'\"\r\n [display]=\"display\"\r\n (onChange)=\"onChange.emit($event)\"\r\n (onPanelHide)=\"onClosePanel.emit($event)\"\r\n (onPanelShow)=\"customFormattingMultiSelectFieldWithFlags()\"\r\n (onFilter)=\"onFilterChange($event)\"\r\n [disabled]=\"disabled\"\r\n [showHeader]=\"showHeader\"\r\n >\r\n <ng-container *ngIf=\"showFlags\">\r\n <ng-template let-option pTemplate=\"item\">\r\n <div class=\"grid-nogutter w-full flex\">\r\n <div\r\n class=\"md:col-6 sm:col-12 align-content-center\"\r\n [ngClass]=\"option.align === 'center' ? 'md:text-center' : 'md:text-left'\"\r\n >\r\n <img\r\n *ngIf=\"option.type == 'img'\"\r\n [src]=\"option.imgSource\"\r\n [ngClass]=\"option.imgClass\"\r\n [style]=\"{ height: option.imgSize + 'px' }\"\r\n />\r\n <i\r\n *ngIf=\"option.type == 'icon'\"\r\n [className]=\"option.iconSource\"\r\n [ngClass]=\"option.iconClass\"\r\n [style]=\"{ 'font-size': option.iconSize }\"\r\n ></i>\r\n </div>\r\n\r\n <div *ngIf=\"option.showDescriptionOnRight\" class=\"col-6 hidden md:block align-content-center\">\r\n <span class=\"block\">{{ option.name }}</span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </p-multiSelect>\r\n\r\n <p-multiSelect\r\n *ngIf=\"filterVirtualScrool\"\r\n #multiselect\r\n appendTo=\"body\"\r\n optionLabel=\"name\"\r\n optionValue=\"code\"\r\n dropdownIcon=\"fas fa-sort-down\"\r\n selectedItemsLabel=\"Selecionar todos\"\r\n [panelStyleClass]=\"filter ? 'has-filter' : ''\"\r\n [options]=\"options\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"placeholder\"\r\n [filter]=\"filter\"\r\n [maxSelectedLabels]=\"options.length - 1\"\r\n [showHeader]=\"true\"\r\n [showToggleAll]=\"showSelectAllOption\"\r\n [dropdownIcon]=\"'pi pi-chevron-down'\"\r\n [display]=\"display\"\r\n (onChange)=\"onChange.emit($event)\"\r\n (onFilter)=\"search($event)\"\r\n (onPanelShow)=\"onOpenAutocompletePanel()\"\r\n (onPanelHide)=\"onHideAutocompletePanel()\"\r\n [disabled]=\"disabled\"\r\n >\r\n </p-multiSelect>\r\n <span class=\"input-error\">{{ fieldErrorLabel() }}</span>\r\n</div>\r\n", styles: [".multiselect-field-input-container .input-error{font-size:.7em;color:var(--error-color)}.multiselect-field-input-container div.p-multiselect-token{padding:auto 1em!important;background:#eff0f6!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2$2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i4$2.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }] }); }
3051
3081
  }
3052
3082
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiselectFieldComponent, decorators: [{
3053
3083
  type: Component,
3054
- args: [{ selector: 'vector-multiselect-field', template: "<div class=\"multiselect-field-input-container\">\r\n <p-multiSelect\r\n *ngIf=\"!filterVirtualScrool\"\r\n #multiselect\r\n appendTo=\"body\"\r\n optionLabel=\"name\"\r\n optionValue=\"code\"\r\n dropdownIcon=\"fas fa-sort-down\"\r\n selectedItemsLabel=\"Selecionar todos\"\r\n [panelStyleClass]=\"filter ? 'has-filter' : ''\"\r\n [options]=\"options\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"placeholder\"\r\n [filter]=\"filter\"\r\n [maxSelectedLabels]=\"options.length - 1\"\r\n [showToggleAll]=\"showSelectAllOption\"\r\n [dropdownIcon]=\"'pi pi-chevron-down'\"\r\n [display]=\"display\"\r\n (onChange)=\"onChange.emit($event)\"\r\n (onPanelHide)=\"onClosePanel.emit($event)\"\r\n (onPanelShow)=\"customFormattingMultiSelectFieldWithFlags()\"\r\n [disabled]=\"disabled\"\r\n [showHeader]=\"showHeader\"\r\n >\r\n <ng-container *ngIf=\"showFlags\">\r\n <ng-template let-option pTemplate=\"item\">\r\n <div class=\"grid-nogutter w-full flex\">\r\n <div\r\n class=\"md:col-6 sm:col-12 align-content-center\"\r\n [ngClass]=\"option.align === 'center' ? 'md:text-center' : 'md:text-left'\"\r\n >\r\n <img\r\n *ngIf=\"option.type == 'img'\"\r\n [src]=\"option.imgSource\"\r\n [ngClass]=\"option.imgClass\"\r\n [style]=\"{ height: option.imgSize + 'px' }\"\r\n />\r\n <i\r\n *ngIf=\"option.type == 'icon'\"\r\n [className]=\"option.iconSource\"\r\n [ngClass]=\"option.iconClass\"\r\n [style]=\"{ 'font-size': option.iconSize }\"\r\n ></i>\r\n </div>\r\n\r\n <div *ngIf=\"option.showDescriptionOnRight\" class=\"col-6 hidden md:block align-content-center\">\r\n <span class=\"block\">{{ option.name }}</span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </p-multiSelect>\r\n\r\n <p-multiSelect\r\n *ngIf=\"filterVirtualScrool\"\r\n #multiselect\r\n appendTo=\"body\"\r\n optionLabel=\"name\"\r\n optionValue=\"code\"\r\n dropdownIcon=\"fas fa-sort-down\"\r\n selectedItemsLabel=\"Selecionar todos\"\r\n [panelStyleClass]=\"filter ? 'has-filter' : ''\"\r\n [options]=\"options\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"placeholder\"\r\n [filter]=\"filter\"\r\n [maxSelectedLabels]=\"options.length - 1\"\r\n [showHeader]=\"true\"\r\n [showToggleAll]=\"showSelectAllOption\"\r\n [dropdownIcon]=\"'pi pi-chevron-down'\"\r\n [display]=\"display\"\r\n (onChange)=\"onChange.emit($event)\"\r\n (onFilter)=\"search($event)\"\r\n (onPanelShow)=\"onOpenAutocompletePanel()\"\r\n (onPanelHide)=\"onHideAutocompletePanel()\"\r\n [disabled]=\"disabled\"\r\n >\r\n </p-multiSelect>\r\n <p-multiSelect\r\n *ngIf=\"filterVirtualScrool\"\r\n #multiselect\r\n appendTo=\"body\"\r\n optionLabel=\"name\"\r\n optionValue=\"code\"\r\n dropdownIcon=\"fas fa-sort-down\"\r\n selectedItemsLabel=\"Selecionar todos\"\r\n [panelStyleClass]=\"filter ? 'has-filter' : ''\"\r\n [options]=\"options\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"placeholder\"\r\n [filter]=\"filter\"\r\n [maxSelectedLabels]=\"options.length - 1\"\r\n [showHeader]=\"true\"\r\n [showToggleAll]=\"showSelectAllOption\"\r\n [dropdownIcon]=\"'pi pi-chevron-down'\"\r\n [display]=\"display\"\r\n (onChange)=\"onChange.emit($event)\"\r\n (onFilter)=\"search($event)\"\r\n (onPanelShow)=\"onOpenAutocompletePanel()\"\r\n (onPanelHide)=\"onHideAutocompletePanel()\"\r\n [disabled]=\"disabled\"\r\n >\r\n </p-multiSelect>\r\n <span class=\"input-error\">{{ fieldErrorLabel() }}</span>\r\n</div>\r\n", styles: [".multiselect-field-input-container .input-error{font-size:.7em;color:var(--error-color)}.multiselect-field-input-container div.p-multiselect-token{padding:auto 1em!important;background:#eff0f6!important}\n"] }]
3084
+ args: [{ selector: 'vector-multiselect-field', template: "<div class=\"multiselect-field-input-container\">\r\n <p-multiSelect\r\n *ngIf=\"!filterVirtualScrool\"\r\n #multiselect\r\n appendTo=\"body\"\r\n optionLabel=\"name\"\r\n optionValue=\"code\"\r\n dropdownIcon=\"fas fa-sort-down\"\r\n selectedItemsLabel=\"Selecionar todos\"\r\n [panelStyleClass]=\"filter ? 'has-filter' : ''\"\r\n [options]=\"options\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"placeholder\"\r\n [filter]=\"filter\"\r\n [maxSelectedLabels]=\"options.length - 1\"\r\n [showToggleAll]=\"showSelectAllOption\"\r\n [dropdownIcon]=\"'pi pi-chevron-down'\"\r\n [display]=\"display\"\r\n (onChange)=\"onChange.emit($event)\"\r\n (onPanelHide)=\"onClosePanel.emit($event)\"\r\n (onPanelShow)=\"customFormattingMultiSelectFieldWithFlags()\"\r\n (onFilter)=\"onFilterChange($event)\"\r\n [disabled]=\"disabled\"\r\n [showHeader]=\"showHeader\"\r\n >\r\n <ng-container *ngIf=\"showFlags\">\r\n <ng-template let-option pTemplate=\"item\">\r\n <div class=\"grid-nogutter w-full flex\">\r\n <div\r\n class=\"md:col-6 sm:col-12 align-content-center\"\r\n [ngClass]=\"option.align === 'center' ? 'md:text-center' : 'md:text-left'\"\r\n >\r\n <img\r\n *ngIf=\"option.type == 'img'\"\r\n [src]=\"option.imgSource\"\r\n [ngClass]=\"option.imgClass\"\r\n [style]=\"{ height: option.imgSize + 'px' }\"\r\n />\r\n <i\r\n *ngIf=\"option.type == 'icon'\"\r\n [className]=\"option.iconSource\"\r\n [ngClass]=\"option.iconClass\"\r\n [style]=\"{ 'font-size': option.iconSize }\"\r\n ></i>\r\n </div>\r\n\r\n <div *ngIf=\"option.showDescriptionOnRight\" class=\"col-6 hidden md:block align-content-center\">\r\n <span class=\"block\">{{ option.name }}</span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </p-multiSelect>\r\n\r\n <p-multiSelect\r\n *ngIf=\"filterVirtualScrool\"\r\n #multiselect\r\n appendTo=\"body\"\r\n optionLabel=\"name\"\r\n optionValue=\"code\"\r\n dropdownIcon=\"fas fa-sort-down\"\r\n selectedItemsLabel=\"Selecionar todos\"\r\n [panelStyleClass]=\"filter ? 'has-filter' : ''\"\r\n [options]=\"options\"\r\n [formControl]=\"control\"\r\n [placeholder]=\"placeholder\"\r\n [filter]=\"filter\"\r\n [maxSelectedLabels]=\"options.length - 1\"\r\n [showHeader]=\"true\"\r\n [showToggleAll]=\"showSelectAllOption\"\r\n [dropdownIcon]=\"'pi pi-chevron-down'\"\r\n [display]=\"display\"\r\n (onChange)=\"onChange.emit($event)\"\r\n (onFilter)=\"search($event)\"\r\n (onPanelShow)=\"onOpenAutocompletePanel()\"\r\n (onPanelHide)=\"onHideAutocompletePanel()\"\r\n [disabled]=\"disabled\"\r\n >\r\n </p-multiSelect>\r\n <span class=\"input-error\">{{ fieldErrorLabel() }}</span>\r\n</div>\r\n", styles: [".multiselect-field-input-container .input-error{font-size:.7em;color:var(--error-color)}.multiselect-field-input-container div.p-multiselect-token{padding:auto 1em!important;background:#eff0f6!important}\n"] }]
3055
3085
  }], ctorParameters: () => [{ type: i0.Renderer2 }], propDecorators: { pagedSugestion: [{
3056
3086
  type: Input
3057
3087
  }], isRequired: [{