@cqa-lib/cqa-ui 1.0.121 → 1.0.123

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.
@@ -474,6 +474,53 @@ export class DynamicSelectFieldComponent {
474
474
  }
475
475
  catch { }
476
476
  }
477
+ /**
478
+ * Highlights text based on the configured highlightPattern.
479
+ * Returns HTML string with highlighted portions wrapped in <span class="highlight">.
480
+ */
481
+ highlightText(text) {
482
+ if (!text || !this.config?.highlightPattern) {
483
+ return this.escapeHtml(text);
484
+ }
485
+ const pattern = this.config.highlightPattern;
486
+ // If it's a function, use it directly
487
+ if (typeof pattern === 'function') {
488
+ return pattern(text);
489
+ }
490
+ // Convert string pattern to RegExp if needed
491
+ let regex;
492
+ if (typeof pattern === 'string') {
493
+ try {
494
+ regex = new RegExp(pattern, 'gi');
495
+ }
496
+ catch (e) {
497
+ console.warn('Invalid highlight pattern:', pattern);
498
+ return this.escapeHtml(text);
499
+ }
500
+ }
501
+ else {
502
+ regex = pattern;
503
+ }
504
+ // Escape HTML first, then apply highlighting
505
+ const escaped = this.escapeHtml(text);
506
+ return escaped.replace(regex, (match) => `<span class="cqa-text-primary">${match}</span>`);
507
+ }
508
+ /**
509
+ * Escapes HTML special characters to prevent XSS.
510
+ */
511
+ escapeHtml(text) {
512
+ if (!text)
513
+ return '';
514
+ const div = document.createElement('div');
515
+ div.textContent = text;
516
+ return div.innerHTML;
517
+ }
518
+ /**
519
+ * Checks if highlighting is enabled for this component.
520
+ */
521
+ get hasHighlighting() {
522
+ return !!this.config?.highlightPattern;
523
+ }
477
524
  setupLoadMoreObserver() {
478
525
  // Only if consumer indicates more data is available
479
526
  if (!this.config?.hasMore)
@@ -516,10 +563,10 @@ export class DynamicSelectFieldComponent {
516
563
  }
517
564
  }
518
565
  DynamicSelectFieldComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicSelectFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
519
- DynamicSelectFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: { form: "form", config: "config" }, outputs: { selectionChange: "selectionChange", selectClick: "selectClick", searchChange: "searchChange", loadMore: "loadMore" }, host: { listeners: { "document:click": "handleDocumentClick($event)" } }, viewQueries: [{ propertyName: "selectRef", first: true, predicate: ["selectRef"], descendants: true }, { propertyName: "hostEl", first: true, predicate: ["host"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\">\n <ng-container [formGroup]=\"form\">\n <label *ngIf=\"config.label\"\n class=\"form-label cqa-text-[#374151] cqa-text-[14px] cqa-font-medium cqa-block cqa-leading-[1.4] cqa-mb-2\">{{\n config.label }}</label>\n <mat-form-field #host class=\"mat-select-custom cqa-w-full\" appearance=\"fill\">\n <mat-select #selectRef=\"matSelect\" [placeholder]=\"displayPlaceholder\" [disabled]=\"isDisabled\" [multiple]=\"isMultiple\"\n disableOptionCentering [panelClass]=\"panelClass\" [formControlName]=\"config.key\"\n (openedChange)=\"onSelectOpenedChange($event, selectRef)\" (selectionChange)=\"onSelectionChange($event, selectRef)\">\n\n <mat-option *ngIf=\"config.searchable\" class=\"ts-select-search\" disabled>\n <input class=\"ts-select-search-input cqa-text-black-100\" type=\"text\" [value]=\"searchTextByKey[config.key] || ''\"\n (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\" (input)=\"onSearch(config.key, $any($event.target).value)\"\n placeholder=\"Search...\" />\n </mat-option>\n \n <mat-option [ngClass]=\"{'checkmark': config.optionStyle === 'checkmark','checkbox': config.optionStyle !== 'checkmark','mat-selected': allSelected}\" [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngIf=\"isMultiple && config.showSelectAll\" [value]=\"SELECT_ALL_VALUE\">\n <ng-container *ngIf=\"useCheckboxStyle; else selectAllDefaultTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"allSelected ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"allSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\">{{ config.selectAllLabel || 'All' }}</span>\n </span>\n </ng-container>\n <ng-template #selectAllDefaultTpl>\n {{ config.selectAllLabel || 'All' }}\n </ng-template>\n </mat-option>\n\n <mat-option [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngFor=\"let opt of filteredOptions(config)\" [value]=\"opt.id ?? opt.value\">\n <ng-container *ngIf=\"useCheckboxStyle; else defaultOptionTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\">{{ opt.name ?? opt.label ?? opt.value }}</span>\n </span>\n </ng-container>\n <ng-template #defaultOptionTpl>\n {{ opt.name ?? opt.label ?? opt.value }}\n </ng-template>\n </mat-option>\n \n <!-- No results state (only when not loading and no options) -->\n <mat-option disabled *ngIf=\"!(config?.options?.length || 0) && !(config?.isLoading || loadingMore)\">\n No results\n </mat-option>\n <!-- Infinite scroll sentinel (serverSearch or explicit hasMore) -->\n <mat-option disabled class=\"load-more-sentinel\" *ngIf=\"config?.hasMore\">\n <span *ngIf=\"loadingMore || config?.isLoading\">Loading...</span>\n <span *ngIf=\"!loadingMore && !config?.isLoading\">Scroll to load more\u2026</span>\n </mat-option>\n </mat-select>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Inline spinner shown when loading more (infinite scroll) or when config.isLoading is true -->\n <svg *ngIf=\"loadingMore || config?.isLoading\" width=\"16\" height=\"16\" viewBox=\"0 0 50 50\" aria-label=\"loading\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"25\" cy=\"25\" r=\"20\" stroke=\"#E5E7EB\" stroke-width=\"6\" fill=\"none\"/>\n <path d=\"M45 25a20 20 0 0 0-20-20\" stroke=\"#4F46E5\" stroke-width=\"6\" fill=\"none\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 25 25\" to=\"360 25 25\"\n dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </mat-form-field>\n </ng-container>\n</div>", components: [{ type: i1.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i2.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
566
+ DynamicSelectFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: { form: "form", config: "config" }, outputs: { selectionChange: "selectionChange", selectClick: "selectClick", searchChange: "searchChange", loadMore: "loadMore" }, host: { listeners: { "document:click": "handleDocumentClick($event)" } }, viewQueries: [{ propertyName: "selectRef", first: true, predicate: ["selectRef"], descendants: true }, { propertyName: "hostEl", first: true, predicate: ["host"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\">\n <ng-container [formGroup]=\"form\">\n <label *ngIf=\"config.label\"\n class=\"form-label cqa-text-[#374151] cqa-text-[14px] cqa-font-medium cqa-block cqa-leading-[1.4] cqa-mb-2\">{{\n config.label }}</label>\n <mat-form-field #host class=\"mat-select-custom cqa-w-full\" appearance=\"fill\">\n <mat-select #selectRef=\"matSelect\" [placeholder]=\"displayPlaceholder\" [disabled]=\"isDisabled\" [multiple]=\"isMultiple\"\n disableOptionCentering [panelClass]=\"panelClass\" [formControlName]=\"config.key\"\n (openedChange)=\"onSelectOpenedChange($event, selectRef)\" (selectionChange)=\"onSelectionChange($event, selectRef)\">\n\n <mat-option *ngIf=\"config.searchable\" class=\"ts-select-search\" disabled>\n <input class=\"ts-select-search-input cqa-text-black-100\" type=\"text\" [value]=\"searchTextByKey[config.key] || ''\"\n (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\" (input)=\"onSearch(config.key, $any($event.target).value)\"\n placeholder=\"Search...\" />\n </mat-option>\n \n <mat-option [ngClass]=\"{'checkmark': config.optionStyle === 'checkmark','checkbox': config.optionStyle !== 'checkmark','mat-selected': allSelected}\" [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngIf=\"isMultiple && config.showSelectAll\" [value]=\"SELECT_ALL_VALUE\">\n <ng-container *ngIf=\"useCheckboxStyle; else selectAllDefaultTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"allSelected ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"allSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\">{{ config.selectAllLabel || 'All' }}</span>\n </span>\n </ng-container>\n <ng-template #selectAllDefaultTpl>\n {{ config.selectAllLabel || 'All' }}\n </ng-template>\n </mat-option>\n\n <mat-option [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngFor=\"let opt of filteredOptions(config)\" [value]=\"opt.id ?? opt.value\">\n <ng-container *ngIf=\"useCheckboxStyle; else defaultOptionTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\" *ngIf=\"hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span class=\"cqa-min-w-0\" *ngIf=\"!hasHighlighting\">{{ opt.name ?? opt.label ?? opt.value }}</span>\n </span>\n </ng-container>\n <ng-template #defaultOptionTpl>\n <span *ngIf=\"hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span *ngIf=\"!hasHighlighting\">{{ opt.name ?? opt.label ?? opt.value }}</span>\n </ng-template>\n </mat-option>\n \n <!-- No results state (only when not loading and no options) -->\n <mat-option disabled *ngIf=\"!(config?.options?.length || 0) && !(config?.isLoading || loadingMore)\">\n No results\n </mat-option>\n <!-- Infinite scroll sentinel (serverSearch or explicit hasMore) -->\n <mat-option disabled class=\"load-more-sentinel\" *ngIf=\"config?.hasMore\">\n <span *ngIf=\"loadingMore || config?.isLoading\">Loading...</span>\n <span *ngIf=\"!loadingMore && !config?.isLoading\">Scroll to load more\u2026</span>\n </mat-option>\n </mat-select>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Inline spinner shown when loading more (infinite scroll) or when config.isLoading is true -->\n <svg *ngIf=\"loadingMore || config?.isLoading\" width=\"16\" height=\"16\" viewBox=\"0 0 50 50\" aria-label=\"loading\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"25\" cy=\"25\" r=\"20\" stroke=\"#E5E7EB\" stroke-width=\"6\" fill=\"none\"/>\n <path d=\"M45 25a20 20 0 0 0-20-20\" stroke=\"#4F46E5\" stroke-width=\"6\" fill=\"none\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 25 25\" to=\"360 25 25\"\n dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </mat-form-field>\n </ng-container>\n</div>", components: [{ type: i1.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i2.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
520
567
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicSelectFieldComponent, decorators: [{
521
568
  type: Component,
522
- args: [{ selector: 'cqa-dynamic-select', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-ui-root\">\n <ng-container [formGroup]=\"form\">\n <label *ngIf=\"config.label\"\n class=\"form-label cqa-text-[#374151] cqa-text-[14px] cqa-font-medium cqa-block cqa-leading-[1.4] cqa-mb-2\">{{\n config.label }}</label>\n <mat-form-field #host class=\"mat-select-custom cqa-w-full\" appearance=\"fill\">\n <mat-select #selectRef=\"matSelect\" [placeholder]=\"displayPlaceholder\" [disabled]=\"isDisabled\" [multiple]=\"isMultiple\"\n disableOptionCentering [panelClass]=\"panelClass\" [formControlName]=\"config.key\"\n (openedChange)=\"onSelectOpenedChange($event, selectRef)\" (selectionChange)=\"onSelectionChange($event, selectRef)\">\n\n <mat-option *ngIf=\"config.searchable\" class=\"ts-select-search\" disabled>\n <input class=\"ts-select-search-input cqa-text-black-100\" type=\"text\" [value]=\"searchTextByKey[config.key] || ''\"\n (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\" (input)=\"onSearch(config.key, $any($event.target).value)\"\n placeholder=\"Search...\" />\n </mat-option>\n \n <mat-option [ngClass]=\"{'checkmark': config.optionStyle === 'checkmark','checkbox': config.optionStyle !== 'checkmark','mat-selected': allSelected}\" [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngIf=\"isMultiple && config.showSelectAll\" [value]=\"SELECT_ALL_VALUE\">\n <ng-container *ngIf=\"useCheckboxStyle; else selectAllDefaultTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"allSelected ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"allSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\">{{ config.selectAllLabel || 'All' }}</span>\n </span>\n </ng-container>\n <ng-template #selectAllDefaultTpl>\n {{ config.selectAllLabel || 'All' }}\n </ng-template>\n </mat-option>\n\n <mat-option [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngFor=\"let opt of filteredOptions(config)\" [value]=\"opt.id ?? opt.value\">\n <ng-container *ngIf=\"useCheckboxStyle; else defaultOptionTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\">{{ opt.name ?? opt.label ?? opt.value }}</span>\n </span>\n </ng-container>\n <ng-template #defaultOptionTpl>\n {{ opt.name ?? opt.label ?? opt.value }}\n </ng-template>\n </mat-option>\n \n <!-- No results state (only when not loading and no options) -->\n <mat-option disabled *ngIf=\"!(config?.options?.length || 0) && !(config?.isLoading || loadingMore)\">\n No results\n </mat-option>\n <!-- Infinite scroll sentinel (serverSearch or explicit hasMore) -->\n <mat-option disabled class=\"load-more-sentinel\" *ngIf=\"config?.hasMore\">\n <span *ngIf=\"loadingMore || config?.isLoading\">Loading...</span>\n <span *ngIf=\"!loadingMore && !config?.isLoading\">Scroll to load more\u2026</span>\n </mat-option>\n </mat-select>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Inline spinner shown when loading more (infinite scroll) or when config.isLoading is true -->\n <svg *ngIf=\"loadingMore || config?.isLoading\" width=\"16\" height=\"16\" viewBox=\"0 0 50 50\" aria-label=\"loading\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"25\" cy=\"25\" r=\"20\" stroke=\"#E5E7EB\" stroke-width=\"6\" fill=\"none\"/>\n <path d=\"M45 25a20 20 0 0 0-20-20\" stroke=\"#4F46E5\" stroke-width=\"6\" fill=\"none\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 25 25\" to=\"360 25 25\"\n dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </mat-form-field>\n </ng-container>\n</div>", styles: [] }]
569
+ args: [{ selector: 'cqa-dynamic-select', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-ui-root\">\n <ng-container [formGroup]=\"form\">\n <label *ngIf=\"config.label\"\n class=\"form-label cqa-text-[#374151] cqa-text-[14px] cqa-font-medium cqa-block cqa-leading-[1.4] cqa-mb-2\">{{\n config.label }}</label>\n <mat-form-field #host class=\"mat-select-custom cqa-w-full\" appearance=\"fill\">\n <mat-select #selectRef=\"matSelect\" [placeholder]=\"displayPlaceholder\" [disabled]=\"isDisabled\" [multiple]=\"isMultiple\"\n disableOptionCentering [panelClass]=\"panelClass\" [formControlName]=\"config.key\"\n (openedChange)=\"onSelectOpenedChange($event, selectRef)\" (selectionChange)=\"onSelectionChange($event, selectRef)\">\n\n <mat-option *ngIf=\"config.searchable\" class=\"ts-select-search\" disabled>\n <input class=\"ts-select-search-input cqa-text-black-100\" type=\"text\" [value]=\"searchTextByKey[config.key] || ''\"\n (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\" (input)=\"onSearch(config.key, $any($event.target).value)\"\n placeholder=\"Search...\" />\n </mat-option>\n \n <mat-option [ngClass]=\"{'checkmark': config.optionStyle === 'checkmark','checkbox': config.optionStyle !== 'checkmark','mat-selected': allSelected}\" [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngIf=\"isMultiple && config.showSelectAll\" [value]=\"SELECT_ALL_VALUE\">\n <ng-container *ngIf=\"useCheckboxStyle; else selectAllDefaultTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"allSelected ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"allSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\">{{ config.selectAllLabel || 'All' }}</span>\n </span>\n </ng-container>\n <ng-template #selectAllDefaultTpl>\n {{ config.selectAllLabel || 'All' }}\n </ng-template>\n </mat-option>\n\n <mat-option [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngFor=\"let opt of filteredOptions(config)\" [value]=\"opt.id ?? opt.value\">\n <ng-container *ngIf=\"useCheckboxStyle; else defaultOptionTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\" *ngIf=\"hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span class=\"cqa-min-w-0\" *ngIf=\"!hasHighlighting\">{{ opt.name ?? opt.label ?? opt.value }}</span>\n </span>\n </ng-container>\n <ng-template #defaultOptionTpl>\n <span *ngIf=\"hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span *ngIf=\"!hasHighlighting\">{{ opt.name ?? opt.label ?? opt.value }}</span>\n </ng-template>\n </mat-option>\n \n <!-- No results state (only when not loading and no options) -->\n <mat-option disabled *ngIf=\"!(config?.options?.length || 0) && !(config?.isLoading || loadingMore)\">\n No results\n </mat-option>\n <!-- Infinite scroll sentinel (serverSearch or explicit hasMore) -->\n <mat-option disabled class=\"load-more-sentinel\" *ngIf=\"config?.hasMore\">\n <span *ngIf=\"loadingMore || config?.isLoading\">Loading...</span>\n <span *ngIf=\"!loadingMore && !config?.isLoading\">Scroll to load more\u2026</span>\n </mat-option>\n </mat-select>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Inline spinner shown when loading more (infinite scroll) or when config.isLoading is true -->\n <svg *ngIf=\"loadingMore || config?.isLoading\" width=\"16\" height=\"16\" viewBox=\"0 0 50 50\" aria-label=\"loading\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"25\" cy=\"25\" r=\"20\" stroke=\"#E5E7EB\" stroke-width=\"6\" fill=\"none\"/>\n <path d=\"M45 25a20 20 0 0 0-20-20\" stroke=\"#4F46E5\" stroke-width=\"6\" fill=\"none\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 25 25\" to=\"360 25 25\"\n dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </mat-form-field>\n </ng-container>\n</div>" }]
523
570
  }], propDecorators: { form: [{
524
571
  type: Input
525
572
  }], config: [{
@@ -542,4 +589,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
542
589
  type: HostListener,
543
590
  args: ['document:click', ['$event']]
544
591
  }] } });
545
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFvQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBdUR2SyxNQUFNLE9BQU8sMkJBQTJCO0lBTnhDO1FBT1cscUJBQWdCLEdBQVcsZ0JBQWdCLENBQUM7UUFHM0Msb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBdUQsQ0FBQztRQUMxRixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDakQscUVBQXFFO1FBQzNELGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWtDLENBQUM7UUFDNUUsd0VBQXdFO1FBQzlELGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBa0MsQ0FBQztRQUt4RSxnRkFBZ0Y7UUFDaEYsb0JBQWUsR0FBMkIsRUFBRSxDQUFDO1FBR3JDLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQUM5QixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUVwQjs7O1dBR0c7UUFDSyx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDN0Isa0JBQWEsR0FBRyxHQUFHLEVBQUU7WUFDM0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztZQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVc7Z0JBQUUsT0FBTztZQUN0RCxNQUFNLEVBQUUs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QUFDLENBQUM7eUJBQUU7d0JBQUMsTUFBTSxHQUFFO3FCQUM5QztpQkFDRjthQUNGO1FBQ0gsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN4QyxJQUFJO1lBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUFFO1FBQUMsTUFBTSxHQUFFO0lBQzNELENBQUM7O3dIQTlkVSwyQkFBMkI7NEdBQTNCLDJCQUEyQixxZEFZSSxVQUFVLGtEQ25FdEQsODVLQThFTTsyRkR2Qk8sMkJBQTJCO2tCQU52QyxTQUFTOytCQUNFLG9CQUFvQixtQkFHYix1QkFBdUIsQ0FBQyxNQUFNOzhCQUl0QyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFFRyxZQUFZO3NCQUFyQixNQUFNO2dCQUVHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRW9DLFNBQVM7c0JBQW5ELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDZSxNQUFNO3NCQUE3RCxTQUFTO3VCQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFnYXRELG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRTZWxlY3QsIE1hdFNlbGVjdENoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5cbi8vIExvY2FsIG9wdGlvbiBtb2RlbCAocHJldmlvdXNseSBpbXBvcnRlZCBmcm9tIHJlbW92ZWQgY3FhLXNlbGVjdCBjb21wb25lbnQpXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdE9wdGlvbiB7XG4gIGlkPzogYW55O1xuICB2YWx1ZT86IGFueTtcbiAgbmFtZT86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAga2V5OiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBtdWx0aXBsZT86IGJvb2xlYW47XG4gIHNlYXJjaGFibGU/OiBib29sZWFuO1xuICAvKiogQ29udHJvbHMgaG93IHNlbGVjdGlvbiBpbmRpY2F0b3IgaXMgc2hvd24gZm9yIG11bHRpLXNlbGVjdCBvcHRpb25zLiAqL1xuICBvcHRpb25TdHlsZT86ICdjaGVja21hcmsnIHwgJ2NoZWNrYm94JztcbiAgLyoqIFNob3cgYSAnU2VsZWN0IEFsbCcgb3B0aW9uIGF0IHRoZSB0b3AgKG11bHRpLXNlbGVjdCBvbmx5KS4gKi9cbiAgc2hvd1NlbGVjdEFsbD86IGJvb2xlYW47XG4gIC8qKiBDdXN0b20gbGFiZWwgZm9yIHRoZSAnU2VsZWN0IEFsbCcgb3B0aW9uLiBEZWZhdWx0cyB0byAnQWxsJy4gKi9cbiAgc2VsZWN0QWxsTGFiZWw/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBjbG9zZSB0aGUgcGFuZWwgd2hlbiBhbiBvcHRpb24gaXMgc2VsZWN0ZWQgKHVzZWZ1bCBmb3IgbXVsdGktc2VsZWN0IGluIGhlYWRlcnMpLiAqL1xuICBjbG9zZU9uU2VsZWN0PzogYm9vbGVhbjtcbiAgLyoqIFByb3ZpZGUgYSBkZWZhdWx0IHNlbGVjdGVkIHZhbHVlIChvciBhcnJheSBmb3IgbXVsdGktc2VsZWN0KSBpZiB0aGUgY29udHJvbCBoYXMgbm8gdmFsdWUgeWV0LiAqL1xuICBzZWxlY3RlZFZhbHVlPzogYW55IHwgYW55W107XG4gIC8qKiBPcHRpb25hbCBjYWxsYmFjayBpbnZva2VkIHdoZW5ldmVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlcy4gKi9cbiAgb25DaGFuZ2U/OiAodmFsdWU6IGFueSwgZXZlbnQ/OiBNYXRTZWxlY3RDaGFuZ2UpID0+IHZvaWQ7XG4gIC8qKiBFbmFibGUgc2VydmVyLXNpZGUgc2VhcmNoIG1vZGU7IGNvbXBvbmVudCB3aWxsIGVtaXQgc2VhcmNoIGluc3RlYWQgb2YgbG9jYWwgZmlsdGVyaW5nLiAqL1xuICBzZXJ2ZXJTZWFyY2g/OiBib29sZWFuO1xuICAvKipcbiAgICogV2hlbiB0cnVlLCB0cmlnZ2VycyBhbiBpbml0aWFsIHNlYXJjaCBlbWl0IG9uIHBhbmVsIG9wZW4gKHNlcnZlclNlYXJjaCBtb2RlIG9ubHkpLlxuICAgKiBEZWZhdWx0cyB0byBmYWxzZSBzbyBvcGVuaW5nIHRoZSBkcm9wZG93biBkb2VzIE5PVCBjYWxsIHRoZSBBUEkuXG4gICAqL1xuICBpbml0aWFsRmV0Y2hPbk9wZW4/OiBib29sZWFuO1xuICAvKiogSW5kaWNhdGVzIG1vcmUgcmVzdWx0cyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwuICovXG4gIGhhc01vcmU/OiBib29sZWFuO1xuICAvKiogT3B0aW9uYWwgbG9hZGluZyBmbGFnIGNvbnRyb2xsZWQgYnkgY29uc3VtZXIgdG8gc2hvdyBsb2FkaW5nIHN0YXRlLiAqL1xuICBpc0xvYWRpbmc/OiBib29sZWFuO1xuICAvKiogT3B0aW9uYWwgY2FsbGJhY2sgZm9yIHNlcnZlci1zaWRlIHNlYXJjaCB3aGVuIHF1ZXJ5IGNoYW5nZXMuICovXG4gIG9uU2VhcmNoPzogKHF1ZXJ5OiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBPcHRpb25hbCBjYWxsYmFjayB3aGVuIG1vcmUgZGF0YSBpcyByZXF1ZXN0ZWQgKGluZmluaXRlIHNjcm9sbCkuICovXG4gIG9uTG9hZE1vcmU/OiAocXVlcnk/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtZHluYW1pYy1zZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljU2VsZWN0RmllbGRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIHJlYWRvbmx5IFNFTEVDVF9BTExfVkFMVUU6IHN0cmluZyA9ICdfX3NlbGVjdF9hbGxfXyc7XG4gIEBJbnB1dCgpIGZvcm0hOiBGb3JtR3JvdXA7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgdmFsdWU6IGFueTsgZXZlbnQ6IE1hdFNlbGVjdENoYW5nZSB9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0cyB3aGVuIHVzZXIgdHlwZXMgaW4gc2VhcmNoIGJveCAodXNlZnVsIGZvciBzZXJ2ZXIgc2VhcmNoKSAqL1xuICBAT3V0cHV0KCkgc2VhcmNoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0+KCk7XG4gIC8qKiBFbWl0cyB3aGVuIHRoZSBjb21wb25lbnQgcmVxdWVzdHMgbW9yZSBkYXRhIGZvciB0aGUgY3VycmVudCBxdWVyeSAqL1xuICBAT3V0cHV0KCkgbG9hZE1vcmUgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfT4oKTtcblxuICBAVmlld0NoaWxkKCdzZWxlY3RSZWYnLCB7IHN0YXRpYzogZmFsc2UgfSkgc2VsZWN0UmVmPzogTWF0U2VsZWN0O1xuICBAVmlld0NoaWxkKCdob3N0JywgeyBzdGF0aWM6IGZhbHNlLCByZWFkOiBFbGVtZW50UmVmIH0pIGhvc3RFbD86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIC8vIE11c3QgYmUgcHVibGljIGZvciB0ZW1wbGF0ZSBhY2Nlc3MgaW4gQW5ndWxhcidzIHN0cmljdCB0ZW1wbGF0ZSBjaGVja2luZyBtb2RlXG4gIHNlYXJjaFRleHRCeUtleTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIG91dHNpZGVDbGVhbnVwPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBsb2FkTW9yZU9ic2VydmVyPzogSW50ZXJzZWN0aW9uT2JzZXJ2ZXI7XG4gIHByaXZhdGUgbGFzdE9wdGlvbnNMZW5ndGggPSAwO1xuICBsb2FkaW5nTW9yZSA9IGZhbHNlO1xuICBwcml2YXRlIHBhbmVsU2Nyb2xsRWw/OiBIVE1MRWxlbWVudDtcbiAgLyoqXG4gICAqIEd1YXJkIHRvIGVuc3VyZSBsb2FkLW1vcmUgaXMgb25seSB0cmlnZ2VyZWQgYWZ0ZXIgdGhlIHVzZXIgaGFzIHNjcm9sbGVkXG4gICAqIGF0IGxlYXN0IG9uY2Ugc2luY2Ugb3BlbmluZyB0aGUgcGFuZWwuIFByZXZlbnRzIGF1dG8tbG9hZCBvbiBvcGVuLlxuICAgKi9cbiAgcHJpdmF0ZSBoYXNTY3JvbGxlZFNpbmNlT3BlbiA9IGZhbHNlO1xuICBwcml2YXRlIG9uUGFuZWxTY3JvbGwgPSAoKSA9PiB7XG4gICAgdGhpcy5oYXNTY3JvbGxlZFNpbmNlT3BlbiA9IHRydWU7XG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uaGFzTW9yZSB8fCB0aGlzLmxvYWRpbmdNb3JlKSByZXR1cm47XG4gICAgY29uc3QgZWwgPSB0aGlzLnBhbmVsU2Nyb2xsRWw7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IG5lYXJCb3R0b20gPSBlbC5zY3JvbGxUb3AgKyBlbC5jbGllbnRIZWlnaHQgPj0gZWwuc2Nyb2xsSGVpZ2h0IC0gNDg7IC8vIH4zIG9wdGlvbiByb3dzXG4gICAgaWYgKG5lYXJCb3R0b20pIHtcbiAgICAgIHRoaXMubG9hZGluZ01vcmUgPSB0cnVlO1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWc/LmtleSB8fCAnJztcbiAgICAgIGNvbnN0IHEgPSB0aGlzLnNlYXJjaFRleHRCeUtleVtrZXldIHx8ICcnO1xuICAgICAgdGhpcy5sb2FkTW9yZS5lbWl0KHsga2V5LCBxdWVyeTogcSB9KTtcbiAgICAgIHRyeSB7IHRoaXMuY29uZmlnLm9uTG9hZE1vcmU/LihxKTsgfSBjYXRjaCB7fVxuICAgIH1cbiAgfTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnIHx8ICF0aGlzLmNvbmZpZy5rZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3FhLWR5bmFtaWMtc2VsZWN0OiBpbnB1dCBcImNvbmZpZy5rZXlcIiBpcyByZXF1aXJlZC4nKTtcbiAgICB9XG4gICAgdGhpcy5hcHBseVNlbGVjdGVkVmFsdWVJZk5lZWRlZCgpO1xuICAgIHRoaXMubGFzdE9wdGlvbnNMZW5ndGggPSAodGhpcy5jb25maWc/Lm9wdGlvbnMgfHwgW10pLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBkaXNwbGF5UGxhY2Vob2xkZXIoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0pIHJldHVybiB0aGlzLmNvbmZpZz8ucGxhY2Vob2xkZXI7XG4gICAgY29uc3QgY29udHJvbFZhbHVlID0gdGhpcy5mb3JtLmdldChrZXkpPy52YWx1ZTtcbiAgICByZXR1cm4gdGhpcy5oYXNFeGlzdGluZ1ZhbHVlKGNvbnRyb2xWYWx1ZSkgPyB1bmRlZmluZWQgOiB0aGlzLmNvbmZpZz8ucGxhY2Vob2xkZXI7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCdjb25maWcnIGluIGNoYW5nZXMpIHtcbiAgICAgIC8vIFdoZW4gY29uZmlnIGNoYW5nZXMgKGluY2x1ZGluZyB0b2dnbGluZyBtdWx0aXBsZSksIGVuc3VyZSBjb250cm9sIHZhbHVlIHNoYXBlIG1hdGNoZXNcbiAgICAgIHRoaXMuc3luY0NvbnRyb2xWYWx1ZUZvck11bHRpcGxlTW9kZSgpO1xuICAgICAgdGhpcy5hcHBseVNlbGVjdGVkVmFsdWVJZk5lZWRlZCgpO1xuICAgICAgLy8gU3luYyBsb2FkaW5nTW9yZSB3aXRoIGNvbmZpZy5pc0xvYWRpbmcgd2hlbiBwcm92aWRlZCBieSBwYXJlbnRcbiAgICAgIC8vIFRoaXMgYWxsb3dzIHBhcmVudCB0byBjb250cm9sIGxvYWRpbmcgc3RhdGUgKGUuZy4sIGR1cmluZyBsb2FkIG1vcmUgb3BlcmF0aW9ucylcbiAgICAgIGlmICh0aGlzLmNvbmZpZz8uaXNMb2FkaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9yZSA9IHRoaXMuY29uZmlnLmlzTG9hZGluZztcbiAgICAgIH1cbiAgICAgIC8vIFJlc2V0IGxvYWRpbmdNb3JlIHdoZW4gbmV3IG9wdGlvbnMgYXJyaXZlIChvcHRpb25zIGxlbmd0aCBpbmNyZWFzZWQpXG4gICAgICBjb25zdCBsZW4gPSAodGhpcy5jb25maWc/Lm9wdGlvbnMgfHwgW10pLmxlbmd0aDtcbiAgICAgIGlmIChsZW4gPiB0aGlzLmxhc3RPcHRpb25zTGVuZ3RoKSB7XG4gICAgICAgIC8vIFJlc2V0IGxvYWRpbmcgc3RhdGUgd2hlbiBuZXcgZGF0YSBhcnJpdmVzLCB1bmxlc3MgcGFyZW50IGV4cGxpY2l0bHkgc2F5cyBzdGlsbCBsb2FkaW5nXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZz8uaXNMb2FkaW5nID09PSBmYWxzZSkge1xuICAgICAgICAgIHRoaXMubG9hZGluZ01vcmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8uaXNMb2FkaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBPbmx5IGF1dG8tcmVzZXQgaWYgcGFyZW50IGRvZXNuJ3QgY29udHJvbCBsb2FkaW5nIHN0YXRlXG4gICAgICAgICAgdGhpcy5sb2FkaW5nTW9yZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmxhc3RPcHRpb25zTGVuZ3RoID0gbGVuO1xuICAgICAgLy8gSWYgY29uc3VtZXIgaW5kaWNhdGVzIG5vIG1vcmUgcmVzdWx0cywgY2xlYXIgbG9hZGluZyBzdGF0ZSBhbmQgYW55IG9ic2VydmVyc1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZz8uaGFzTW9yZSkge1xuICAgICAgICAvLyBDbGVhciBsb2FkaW5nIHN0YXRlIHdoZW4gbm8gbW9yZSByZXN1bHRzLCB1bmxlc3MgcGFyZW50IGV4cGxpY2l0bHkgc2F5cyBzdGlsbCBsb2FkaW5nXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZz8uaXNMb2FkaW5nID09PSBmYWxzZSkge1xuICAgICAgICAgIHRoaXMubG9hZGluZ01vcmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8uaXNMb2FkaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdNb3JlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubG9hZE1vcmVPYnNlcnZlcikge1xuICAgICAgICAgIHRyeSB7IHRoaXMubG9hZE1vcmVPYnNlcnZlci5kaXNjb25uZWN0KCk7IH0gY2F0Y2gge31cbiAgICAgICAgICB0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIElmIHBhbmVsIGlzIG9wZW4gYW5kIGhhc01vcmUgaXMgdHJ1ZSwgZW5zdXJlIHRoZSBzZW50aW5lbCBpcyBiZWluZyBvYnNlcnZlZC5cbiAgICAgIGlmICh0aGlzLnNlbGVjdFJlZj8ucGFuZWxPcGVuICYmIHRoaXMuY29uZmlnPy5oYXNNb3JlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZXR1cExvYWRNb3JlT2JzZXJ2ZXIoKSwgMCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgnZm9ybScgaW4gY2hhbmdlcyAmJiAhY2hhbmdlc1snZm9ybSddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLmFwcGx5U2VsZWN0ZWRWYWx1ZUlmTmVlZGVkKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHBhbmVsQ2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGN0Yy1zZWxlY3QtcGFuZWwgJHt0aGlzLmlzTXVsdGlwbGUgPyAnbXVsdGlwbGUnIDogJyd9YC50cmltKCk7XG4gIH1cblxuICBnZXQgaXNNdWx0aXBsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50b0Jvb2xlYW4odGhpcy5jb25maWc/Lm11bHRpcGxlKTtcbiAgfVxuXG4gIGdldCBpc0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRvQm9vbGVhbih0aGlzLmNvbmZpZz8uZGlzYWJsZWQpO1xuICB9XG4gIFxuICBnZXQgdXNlQ2hlY2tib3hTdHlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc011bHRpcGxlICYmICh0aGlzLmNvbmZpZz8ub3B0aW9uU3R5bGUgPT09ICdjaGVja2JveCcpO1xuICB9XG4gIFxuICBnZXQgYWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzTXVsdGlwbGUpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0pIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xuICAgIGlmICghY29udHJvbCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gY29udHJvbC52YWx1ZSBhcyBhbnlbXTtcbiAgICBjb25zdCBhbGxJZHMgPSB0aGlzLmdldEFsbE9wdGlvbklkcygpO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzZWxlY3RlZCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWFsbElkcy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gYWxsSWRzLmV2ZXJ5KGlkID0+IHNlbGVjdGVkLmluY2x1ZGVzKGlkKSk7XG4gIH1cblxuICBwcml2YXRlIHRvQm9vbGVhbih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCB2ID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAodiA9PT0gJ3RydWUnIHx8IHYgPT09ICcxJykgcmV0dXJuIHRydWU7XG4gICAgICBpZiAodiA9PT0gJ2ZhbHNlJyB8fCB2ID09PSAnMCcgfHwgdiA9PT0gJycpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlOyAvLyBhbnkgb3RoZXIgbm9uLWVtcHR5IHN0cmluZyB0cmVhdGVkIGFzIHRydXRoeVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHZhbHVlICE9PSAwO1xuICAgIH1cbiAgICByZXR1cm4gISF2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3luY0NvbnRyb2xWYWx1ZUZvck11bHRpcGxlTW9kZSgpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0pIHJldHVybjtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xuICAgIGlmICghY29udHJvbCkgcmV0dXJuO1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgaWYgKHRoaXMuaXNNdWx0aXBsZSkge1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA9PSBudWxsKSByZXR1cm47XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50VmFsdWUpKSByZXR1cm47XG4gICAgICBjb250cm9sLnNldFZhbHVlKFtjdXJyZW50VmFsdWVdLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjdXJyZW50VmFsdWUpKSByZXR1cm47XG4gICAgICBjb250cm9sLnNldFZhbHVlKGN1cnJlbnRWYWx1ZS5sZW5ndGggPyBjdXJyZW50VmFsdWVbMF0gOiBudWxsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVNlbGVjdGVkVmFsdWVJZk5lZWRlZCgpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0pIHJldHVybjtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xuICAgIGlmICghY29udHJvbCkgcmV0dXJuO1xuICAgIGNvbnN0IHNlbGVjdGVkVmFsdWUgPSB0aGlzLmNvbmZpZz8uc2VsZWN0ZWRWYWx1ZTtcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGlmICh0aGlzLmhhc0V4aXN0aW5nVmFsdWUoY3VycmVudFZhbHVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2VsZWN0ZWRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHNlbGVjdGVkVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc011bHRpcGxlKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gKEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRWYWx1ZSkgPyBzZWxlY3RlZFZhbHVlIDogW3NlbGVjdGVkVmFsdWVdKS5maWx0ZXIoXG4gICAgICAgICh2YWwpID0+IHZhbCAhPT0gdW5kZWZpbmVkLFxuICAgICAgKTtcbiAgICAgIGlmICghbm9ybWFsaXplZC5sZW5ndGgpIHJldHVybjtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUobm9ybWFsaXplZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gQXJyYXkuaXNBcnJheShzZWxlY3RlZFZhbHVlKVxuICAgICAgICA/IChzZWxlY3RlZFZhbHVlLmxlbmd0aCA/IHNlbGVjdGVkVmFsdWVbMF0gOiB1bmRlZmluZWQpXG4gICAgICAgIDogc2VsZWN0ZWRWYWx1ZTtcbiAgICAgIGlmIChub3JtYWxpemVkID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUobm9ybWFsaXplZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzRXhpc3RpbmdWYWx1ZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUuc29tZSgodmFsKSA9PiB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSAnJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsdWUudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaXNPcHRpb25TZWxlY3RlZChvcHQ6IFNlbGVjdE9wdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXk7XG4gICAgaWYgKCFrZXkgfHwgIXRoaXMuZm9ybSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XG4gICAgaWYgKCFjb250cm9sKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgY29udHJvbFZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBjb25zdCBvcHRpb25JZCA9IG9wdC5pZCA/PyBvcHQudmFsdWU7XG4gICAgaWYgKHRoaXMuaXNNdWx0aXBsZSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRyb2xWYWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBjb250cm9sVmFsdWUuaW5jbHVkZXMob3B0aW9uSWQpO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbFZhbHVlID09PSBvcHRpb25JZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWxsT3B0aW9uSWRzKCk6IGFueVtdIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5jb25maWc/Lm9wdGlvbnMgfHwgW107XG4gICAgcmV0dXJuIG9wdGlvbnMubWFwKG8gPT4gKG8uaWQgPz8gby52YWx1ZSkpLmZpbHRlcih2ID0+IHYgIT09IHVuZGVmaW5lZCk7XG4gIH1cblxuICBvblRvZ2dsZVNlbGVjdEFsbChzZWxlY3Q6IE1hdFNlbGVjdCk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXk7XG4gICAgaWYgKCFrZXkgfHwgIXRoaXMuZm9ybSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XG4gICAgaWYgKCFjb250cm9sKSByZXR1cm47XG4gICAgY29uc3QgYWxsSWRzID0gdGhpcy5nZXRBbGxPcHRpb25JZHMoKTtcbiAgICBpZiAoIWFsbElkcy5sZW5ndGgpIHJldHVybjtcbiAgICBpZiAodGhpcy5hbGxTZWxlY3RlZCkge1xuICAgICAgY29udHJvbC5zZXRWYWx1ZShbXSwgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUoYWxsSWRzLCB7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICB9XG4gICAgLy8gS2VlcCBwYW5lbCBvcGVuIGZvciBjb250aW51ZWQgc2VsZWN0aW9ucyBpbiBtdWx0aS1zZWxlY3RcbiAgICB0cnkgeyBzZWxlY3Qub3BlbigpOyB9IGNhdGNoIHt9XG4gIH1cblxuICBvblNlbGVjdE9wZW5lZENoYW5nZShvcGVuZWQ6IGJvb2xlYW4sIF9zZWxlY3Q6IE1hdFNlbGVjdCk6IHZvaWQge1xuICAgIGlmIChvcGVuZWQpIHtcbiAgICAgIC8vIEVtaXQgY2xpY2sgZXZlbnQgd2hlbiBzZWxlY3QgaXMgb3BlbmVkIChjbGlja2VkKVxuICAgICAgdGhpcy5zZWxlY3RDbGljay5lbWl0KCk7XG4gICAgICAvLyBSZXNldCBsb2FkaW5nTW9yZSB3aGVuIG9wZW5pbmcgaWYgb3B0aW9ucyBhbHJlYWR5IGV4aXN0IChkb24ndCBzaG93IGxvYWRlciBvbiBpbml0aWFsIG9wZW4pXG4gICAgICBpZiAoKHRoaXMuY29uZmlnPy5vcHRpb25zIHx8IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMubG9hZGluZ01vcmUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIEVuc3VyZSB3ZSBvbmx5IHRyaWdnZXIgbG9hZC1tb3JlIGFmdGVyIGEgcmVhbCB1c2VyIHNjcm9sbFxuICAgICAgdGhpcy5oYXNTY3JvbGxlZFNpbmNlT3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICBpZiAoIW9wZW5lZCkge1xuICAgICAgLy8gUmVzZXQgc2VhcmNoIHRleHQgb24gY2xvc2Ugc28gdGhlIG5leHQgb3BlbiBzaG93cyBmdWxsIGxpc3RcbiAgICAgIGlmICh0aGlzLmNvbmZpZz8ua2V5KSB7XG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dEJ5S2V5W3RoaXMuY29uZmlnLmtleV0gPSAnJztcbiAgICAgIH1cbiAgICAgIC8vIEVuc3VyZSBhbnkgcHJldmlvdXMgY3VzdG9tIGxpc3RlbmVycyBhcmUgY2xlYXJlZCAobGVnYWN5IGNvbXBhdGliaWxpdHkpXG4gICAgICBpZiAodGhpcy5vdXRzaWRlQ2xlYW51cCkge1xuICAgICAgICB0aGlzLm91dHNpZGVDbGVhbnVwKCk7XG4gICAgICAgIHRoaXMub3V0c2lkZUNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICAvLyBEaXNjb25uZWN0IGxvYWQtbW9yZSBvYnNlcnZlciBpZiBhbnlcbiAgICAgIGlmICh0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIpIHtcbiAgICAgICAgdHJ5IHsgdGhpcy5sb2FkTW9yZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTsgfSBjYXRjaCB7fVxuICAgICAgICB0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICAvLyBSZW1vdmUgc2Nyb2xsIGxpc3RlbmVyIGlmIGF0dGFjaGVkXG4gICAgICBpZiAodGhpcy5wYW5lbFNjcm9sbEVsKSB7XG4gICAgICAgIHRyeSB7IHRoaXMucGFuZWxTY3JvbGxFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLm9uUGFuZWxTY3JvbGwpOyB9IGNhdGNoIHt9XG4gICAgICAgIHRoaXMucGFuZWxTY3JvbGxFbCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIC8vIFJlc2V0IGxvYWRpbmdNb3JlIHdoZW4gY2xvc2luZ1xuICAgICAgdGhpcy5sb2FkaW5nTW9yZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZvY3VzIHRoZSBzZWFyY2ggYm94IGlmIGVuYWJsZWRcbiAgICBpZiAodGhpcy5jb25maWc/LnNlYXJjaGFibGUpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oJy50cy1zZWxlY3Qtc2VhcmNoLWlucHV0Jyk7XG4gICAgICAgIGlucHV0Py5mb2N1cygpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgLy8gT3B0aW9uYWw6IG9ubHkgdHJpZ2dlciBpbml0aWFsIGZldGNoIG9uIG9wZW4gd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbiAgICBpZiAodGhpcy5jb25maWc/LnNlcnZlclNlYXJjaCAmJiB0aGlzLnRvQm9vbGVhbih0aGlzLmNvbmZpZz8uaW5pdGlhbEZldGNoT25PcGVuKSkge1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWcua2V5O1xuICAgICAgY29uc3QgcSA9IHRoaXMuc2VhcmNoVGV4dEJ5S2V5W2tleV0gfHwgJyc7XG4gICAgICB0cnkgeyB0aGlzLmNvbmZpZy5vblNlYXJjaD8uKHEpOyB9IGNhdGNoIHt9XG4gICAgICB0aGlzLnNlYXJjaENoYW5nZS5lbWl0KHsga2V5LCBxdWVyeTogcSB9KTtcbiAgICB9XG5cbiAgICAvLyBTZXR1cCBpbmZpbml0ZSBzY3JvbGwgb2JzZXJ2ZXIgb24gc2VudGluZWxcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2V0dXBMb2FkTW9yZU9ic2VydmVyKCksIDApO1xuICAgIC8vIEFsc28gYXR0YWNoIGEgc2Nyb2xsIGxpc3RlbmVyIGZhbGxiYWNrIGZvciByZWxpYWJsZSBsb2FkLW1vcmUgdHJpZ2dlcnNcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhbmVscyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1hdC1zZWxlY3QtcGFuZWwnKSkgYXMgSFRNTEVsZW1lbnRbXTtcbiAgICAgICAgdGhpcy5wYW5lbFNjcm9sbEVsID0gcGFuZWxzLmxlbmd0aCA/IHBhbmVsc1twYW5lbHMubGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aGlzLnBhbmVsU2Nyb2xsRWwpIHtcbiAgICAgICAgICB0aGlzLnBhbmVsU2Nyb2xsRWwuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5vblBhbmVsU2Nyb2xsLCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge31cbiAgICB9LCAwKTtcbiAgfVxuXG4gIG9uU2VhcmNoKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXh0QnlLZXlba2V5XSA9IHZhbHVlID8/ICcnO1xuICAgIGlmICh0aGlzLmNvbmZpZz8uc2VydmVyU2VhcmNoKSB7XG4gICAgICAvLyBGb3Igc2VydmVyLXNpZGUgc2VhcmNoLCBlbWl0IGluc3RlYWQgb2YgbG9jYWwgZmlsdGVyaW5nXG4gICAgICB0cnkgeyB0aGlzLmNvbmZpZy5vblNlYXJjaD8uKHZhbHVlID8/ICcnKTsgfSBjYXRjaCB7fVxuICAgICAgdGhpcy5zZWFyY2hDaGFuZ2UuZW1pdCh7IGtleSwgcXVlcnk6IHZhbHVlID8/ICcnIH0pO1xuICAgICAgLy8gUmVzZXQgaW50ZXJuYWwgcGFnaW5nIHN0YXRlXG4gICAgICB0aGlzLmxvYWRpbmdNb3JlID0gZmFsc2U7XG4gICAgICB0aGlzLmxhc3RPcHRpb25zTGVuZ3RoID0gKHRoaXMuY29uZmlnPy5vcHRpb25zIHx8IFtdKS5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24gaWRzIGZvciB0aGUgY29uZmlndXJlZCBjb250cm9sLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZElkc0ZvcktleShrZXk6IHN0cmluZyk6IGFueVtdIHtcbiAgICBpZiAoIWtleSB8fCAhdGhpcy5mb3JtKSByZXR1cm4gW107XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcbiAgICBpZiAoIWNvbnRyb2wpIHJldHVybiBbXTtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgaWYgKHRoaXMuaXNNdWx0aXBsZSkge1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgPyBbdmFsdWVdIDogW107XG4gIH1cblxuICAvKiogUHJvZ3JhbW1hdGljYWxseSBjbG9zZSB0aGUgc2VsZWN0IHBhbmVsIGlmIG9wZW4gKi9cbiAgcHVibGljIGNsb3NlUGFuZWwoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc2VsZWN0UmVmPy5jbG9zZSgpO1xuICAgIH0gY2F0Y2gge31cbiAgfVxuXG4gIGZpbHRlcmVkT3B0aW9ucyhjOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcpOiBTZWxlY3RPcHRpb25bXSB7XG4gICAgY29uc3QgdCA9ICh0aGlzLnNlYXJjaFRleHRCeUtleVtjLmtleV0gfHwgJycpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIC8vIEluIHNlcnZlci1zaWRlIG1vZGUsIHJldHVybiBvcHRpb25zIGFzLWlzIChwYXJlbnQgcHJvdmlkZXMgbGlzdClcbiAgICBpZiAoYy5zZXJ2ZXJTZWFyY2gpIHJldHVybiBjLm9wdGlvbnMgfHwgW107XG4gICAgLy8gV2hlbiBub3Qgc2VhcmNoaW5nLCByZXR1cm4gZnVsbCBsaXN0IHRvIHByZXNlcnZlIG9yaWdpbmFsIG9yZGVyaW5nXG4gICAgaWYgKCF0KSByZXR1cm4gYy5vcHRpb25zIHx8IFtdO1xuXG4gICAgY29uc3QgYWxsT3B0aW9ucyA9IGMub3B0aW9ucyB8fCBbXTtcbiAgICBjb25zdCBiYXNlRmlsdGVyZWQgPSBhbGxPcHRpb25zLmZpbHRlcigob3B0KSA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gU3RyaW5nKG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gdGV4dC5pbmNsdWRlcyh0KTtcbiAgICB9KTtcblxuICAgIC8vIEVuc3VyZSBjdXJyZW50bHkgc2VsZWN0ZWQgb3B0aW9uKHMpIGFyZSBhbHdheXMgdmlzaWJsZSB3aGlsZSBzZWFyY2hpbmdcbiAgICBjb25zdCBzZWxlY3RlZElkcyA9IHRoaXMuZ2V0U2VsZWN0ZWRJZHNGb3JLZXkoYy5rZXkpO1xuICAgIGlmICghc2VsZWN0ZWRJZHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gYmFzZUZpbHRlcmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGlkT2YgPSAobzogU2VsZWN0T3B0aW9uKSA9PiAoby5pZCA/PyBvLnZhbHVlKTtcbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvbnMgPSBhbGxPcHRpb25zLmZpbHRlcihvID0+IHNlbGVjdGVkSWRzLmluY2x1ZGVzKGlkT2YobykpKTtcblxuICAgIC8vIE1lcmdlIHNlbGVjdGVkIG9wdGlvbnMgKGtlZXBpbmcgdGhlaXIgb3JpZ2luYWwgb3JkZXIpIHdpdGggZmlsdGVyZWQgb25lcywgZGUtZHVwbGljYXRlZFxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PGFueT4oKTtcbiAgICBjb25zdCBtZXJnZWQ6IFNlbGVjdE9wdGlvbltdID0gW107XG4gICAgZm9yIChjb25zdCBvIG9mIHNlbGVjdGVkT3B0aW9ucykge1xuICAgICAgY29uc3QgaWQgPSBpZE9mKG8pO1xuICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFzZWVuLmhhcyhpZCkpIHtcbiAgICAgICAgc2Vlbi5hZGQoaWQpO1xuICAgICAgICBtZXJnZWQucHVzaChvKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBvIG9mIGJhc2VGaWx0ZXJlZCkge1xuICAgICAgY29uc3QgaWQgPSBpZE9mKG8pO1xuICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFzZWVuLmhhcyhpZCkpIHtcbiAgICAgICAgc2Vlbi5hZGQoaWQpO1xuICAgICAgICBtZXJnZWQucHVzaChvKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIC8vIENsb3NlIHdoZW4gYW4gb3B0aW9uIGlzIHNlbGVjdGVkIGlmIHJlcXVlc3RlZC4gQWx3YXlzIGNsb3NlIGZvciBzaW5nbGUtc2VsZWN0LlxuICBvblNlbGVjdGlvbkNoYW5nZShldmVudDogTWF0U2VsZWN0Q2hhbmdlLCBzZWxlY3Q6IE1hdFNlbGVjdCk6IHZvaWQge1xuICAgIC8vIEhhbmRsZSBzZWxlY3QtYWxsIHNlbnRpbmVsIGluIG11bHRpLXNlbGVjdFxuICAgIGlmICh0aGlzLmlzTXVsdGlwbGUgJiYgQXJyYXkuaXNBcnJheShldmVudC52YWx1ZSkgJiYgZXZlbnQudmFsdWUuaW5jbHVkZXModGhpcy5TRUxFQ1RfQUxMX1ZBTFVFKSkge1xuICAgICAgLy8gUmVtb3ZlIHNlbnRpbmVsIGFuZCB0b2dnbGUgYWxsXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgICAgaWYgKGtleSAmJiB0aGlzLmZvcm0pIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcbiAgICAgICAgLy8gVG9nZ2xlIGJhc2VkIG9uIGN1cnJlbnQgc3RhdGVcbiAgICAgICAgdGhpcy5vblRvZ2dsZVNlbGVjdEFsbChzZWxlY3QpO1xuICAgICAgICAvLyBFbnN1cmUgc2VudGluZWwgaXMgbm90IHByZXNlbnRcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IChjb250cm9sLnZhbHVlIGFzIGFueVtdKS5maWx0ZXIodiA9PiB2ICE9PSB0aGlzLlNFTEVDVF9BTExfVkFMVUUpO1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUoZmlsdGVyZWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRG8gbm90IHByb2NlZWQgd2l0aCBub3JtYWwgY2xvc2UgbG9naWMgZm9yIHNlbGVjdC1hbGxcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTGV0IEFuZ3VsYXIgTWF0ZXJpYWwgYXV0by1jbG9zZSBmb3Igc2luZ2xlLXNlbGVjdC5cbiAgICAvLyBGb3IgbXVsdGktc2VsZWN0LCBjbG9zZSBvbmx5IGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuICAgIGNvbnN0IHNob3VsZENsb3NlID0gdGhpcy5pc011bHRpcGxlID8gISF0aGlzLmNvbmZpZz8uY2xvc2VPblNlbGVjdCA6IGZhbHNlO1xuICAgIGlmIChzaG91bGRDbG9zZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2VsZWN0LmNsb3NlKCk7XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfVxuICAgIC8vIElmIHNlYXJjaGFibGUsIGNsZWFyIHRoZSBzZWFyY2ggYWZ0ZXIgc2VsZWN0aW9uIHNvIHJlb3BlbmluZyB3b3JrcyBwcmVkaWN0YWJseVxuICAgIGlmICh0aGlzLmNvbmZpZz8uc2VhcmNoYWJsZSAmJiB0aGlzLmNvbmZpZz8ua2V5KSB7XG4gICAgICB0aGlzLnNlYXJjaFRleHRCeUtleVt0aGlzLmNvbmZpZy5rZXldID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZz8ub25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuY29uZmlnLm9uQ2hhbmdlKGV2ZW50LnZhbHVlLCBldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdjcWEtZHluYW1pYy1zZWxlY3Qgb25DaGFuZ2UgaGFuZGxlciBlcnJvcjonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh7XG4gICAgICBrZXk6IHRoaXMuY29uZmlnPy5rZXksXG4gICAgICB2YWx1ZTogZXZlbnQudmFsdWUsXG4gICAgICBldmVudCxcbiAgICB9KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIC8vIENsb3NlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgdHJpZ2dlciBhbmQgb3V0c2lkZSBvZiB0aGUgb3BlbiBwYW5lbFxuICAgIGlmICghdGhpcy5zZWxlY3RSZWY/LnBhbmVsT3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG4gICAgLy8gSWYgY2xpY2sgaXMgaW5zaWRlIHRoZSBjb21wb25lbnQgaG9zdCwgaWdub3JlXG4gICAgaWYgKHRoaXMuaG9zdEVsPy5uYXRpdmVFbGVtZW50ICYmIHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBJZiBjbGljayBpcyBpbnNpZGUgYW55IG9wZW4gbWF0LXNlbGVjdCBwYW5lbCwgaWdub3JlXG4gICAgY29uc3QgcGFuZWxFbHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tYXQtc2VsZWN0LXBhbmVsJykpIGFzIEhUTUxFbGVtZW50W107XG4gICAgY29uc3QgY2xpY2tJbnNpZGVQYW5lbCA9IHBhbmVsRWxzLnNvbWUoKGVsKSA9PiBlbC5jb250YWlucyh0YXJnZXQpKTtcbiAgICBpZiAoY2xpY2tJbnNpZGVQYW5lbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5zZWxlY3RSZWYuY2xvc2UoKTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICBwcml2YXRlIHNldHVwTG9hZE1vcmVPYnNlcnZlcigpOiB2b2lkIHtcbiAgICAvLyBPbmx5IGlmIGNvbnN1bWVyIGluZGljYXRlcyBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlXG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uaGFzTW9yZSkgcmV0dXJuO1xuICAgIC8vIEZpbmQgc2VudGluZWwgb3B0aW9uIHJlbmRlcmVkIGluIHRoZSBvcGVuIHBhbmVsXG4gICAgY29uc3Qgc2VudGluZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWF0LXNlbGVjdC1wYW5lbCAubWF0LW9wdGlvbi5sb2FkLW1vcmUtc2VudGluZWwnKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCFzZW50aW5lbCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIpIHtcbiAgICAgIHRyeSB7IHRoaXMubG9hZE1vcmVPYnNlcnZlci5kaXNjb25uZWN0KCk7IH0gY2F0Y2gge31cbiAgICAgIHRoaXMubG9hZE1vcmVPYnNlcnZlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gVXNlIHRoZSBzZW50aW5lbCdzIGNsb3Nlc3QgcGFuZWwgYXMgdGhlIHJvb3QgdG8gYXZvaWQgcGlja2luZyBhIHdyb25nIHBhbmVsXG4gICAgY29uc3QgcGFuZWxSb290ID0gc2VudGluZWwuY2xvc2VzdCgnLm1hdC1zZWxlY3QtcGFuZWwnKSBhcyBFbGVtZW50IHwgbnVsbDtcbiAgICB0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICAvLyBSZXF1ZXN0IG1vcmUgb25seSBpZiBub3QgY3VycmVudGx5IGxvYWRpbmcgYW5kIGhhc01vcmUgc3RpbGwgdHJ1ZVxuICAgICAgICAgIGlmICh0aGlzLmhhc1Njcm9sbGVkU2luY2VPcGVuICYmICF0aGlzLmxvYWRpbmdNb3JlICYmIHRoaXMuY29uZmlnPy5oYXNNb3JlKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXkgfHwgJyc7XG4gICAgICAgICAgICBjb25zdCBxID0gdGhpcy5zZWFyY2hUZXh0QnlLZXlba2V5XSB8fCAnJztcbiAgICAgICAgICAgIC8vIEVtaXQgb3V0cHV0cyBhbmQgaW52b2tlIG9wdGlvbmFsIGNhbGxiYWNrc1xuICAgICAgICAgICAgdGhpcy5sb2FkTW9yZS5lbWl0KHsga2V5LCBxdWVyeTogcSB9KTtcbiAgICAgICAgICAgIHRyeSB7IHRoaXMuY29uZmlnLm9uTG9hZE1vcmU/LihxKTsgfSBjYXRjaCB7fVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHsgcm9vdDogcGFuZWxSb290LCB0aHJlc2hvbGQ6IDAuMSB9KTtcbiAgICB0cnkgeyB0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIub2JzZXJ2ZShzZW50aW5lbCk7IH0gY2F0Y2gge31cbiAgfVxufVxuXG5cbiIsIjxkaXYgY2xhc3M9XCJjcWEtdWktcm9vdFwiPlxuICA8bmctY29udGFpbmVyIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgIDxsYWJlbCAqbmdJZj1cImNvbmZpZy5sYWJlbFwiXG4gICAgICBjbGFzcz1cImZvcm0tbGFiZWwgY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LVsxNHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWJsb2NrIGNxYS1sZWFkaW5nLVsxLjRdIGNxYS1tYi0yXCI+e3tcbiAgICAgIGNvbmZpZy5sYWJlbCB9fTwvbGFiZWw+XG4gICAgPG1hdC1mb3JtLWZpZWxkICNob3N0IGNsYXNzPVwibWF0LXNlbGVjdC1jdXN0b20gY3FhLXctZnVsbFwiIGFwcGVhcmFuY2U9XCJmaWxsXCI+XG4gICAgICA8bWF0LXNlbGVjdCAjc2VsZWN0UmVmPVwibWF0U2VsZWN0XCIgW3BsYWNlaG9sZGVyXT1cImRpc3BsYXlQbGFjZWhvbGRlclwiIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCIgW211bHRpcGxlXT1cImlzTXVsdGlwbGVcIlxuICAgICAgICBkaXNhYmxlT3B0aW9uQ2VudGVyaW5nIFtwYW5lbENsYXNzXT1cInBhbmVsQ2xhc3NcIiBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbmZpZy5rZXlcIlxuICAgICAgICAob3BlbmVkQ2hhbmdlKT1cIm9uU2VsZWN0T3BlbmVkQ2hhbmdlKCRldmVudCwgc2VsZWN0UmVmKVwiIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50LCBzZWxlY3RSZWYpXCI+XG5cbiAgICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCJjb25maWcuc2VhcmNoYWJsZVwiIGNsYXNzPVwidHMtc2VsZWN0LXNlYXJjaFwiIGRpc2FibGVkPlxuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cInRzLXNlbGVjdC1zZWFyY2gtaW5wdXQgY3FhLXRleHQtYmxhY2stMTAwXCIgdHlwZT1cInRleHRcIiBbdmFsdWVdPVwic2VhcmNoVGV4dEJ5S2V5W2NvbmZpZy5rZXldIHx8ICcnXCJcbiAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoaW5wdXQpPVwib25TZWFyY2goY29uZmlnLmtleSwgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIiAvPlxuICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgIFxuICAgICAgICA8bWF0LW9wdGlvbiBbbmdDbGFzc109XCJ7J2NoZWNrbWFyayc6IGNvbmZpZy5vcHRpb25TdHlsZSA9PT0gJ2NoZWNrbWFyaycsJ2NoZWNrYm94JzogY29uZmlnLm9wdGlvblN0eWxlICE9PSAnY2hlY2ttYXJrJywnbWF0LXNlbGVjdGVkJzogYWxsU2VsZWN0ZWR9XCIgW2NsYXNzXT1cImNvbmZpZy5vcHRpb25TdHlsZSA9PSAnY2hlY2ttYXJrJyA/ICdjaGVja21hcmsnIDogJ2NoZWNrYm94J1wiICpuZ0lmPVwiaXNNdWx0aXBsZSAmJiBjb25maWcuc2hvd1NlbGVjdEFsbFwiIFt2YWx1ZV09XCJTRUxFQ1RfQUxMX1ZBTFVFXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVzZUNoZWNrYm94U3R5bGU7IGVsc2Ugc2VsZWN0QWxsRGVmYXVsdFRwbFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXctNCBjcWEtaC00IGNxYS1mbGV4LXNocmluay0wIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0QxRDVEQl0gY3FhLW1yLTIgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWJvcmRlci1zb2xpZFwiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiYWxsU2VsZWN0ZWQgPyB7J2JhY2tncm91bmQtY29sb3InOicjNEY0NkU1JywnYm9yZGVyLWNvbG9yJzonIzRGNDZFNSd9IDoge31cIj5cbiAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiYWxsU2VsZWN0ZWRcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwIDNMNC41IDguNUwyIDZcIiBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1taW4tdy0wXCI+e3sgY29uZmlnLnNlbGVjdEFsbExhYmVsIHx8ICdBbGwnIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2VsZWN0QWxsRGVmYXVsdFRwbD5cbiAgICAgICAgICAgIHt7IGNvbmZpZy5zZWxlY3RBbGxMYWJlbCB8fCAnQWxsJyB9fVxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cblxuICAgICAgICA8bWF0LW9wdGlvbiBbY2xhc3NdPVwiY29uZmlnLm9wdGlvblN0eWxlID09ICdjaGVja21hcmsnID8gJ2NoZWNrbWFyaycgOiAnY2hlY2tib3gnXCIgKm5nRm9yPVwibGV0IG9wdCBvZiBmaWx0ZXJlZE9wdGlvbnMoY29uZmlnKVwiIFt2YWx1ZV09XCJvcHQuaWQgPz8gb3B0LnZhbHVlXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVzZUNoZWNrYm94U3R5bGU7IGVsc2UgZGVmYXVsdE9wdGlvblRwbFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXctNCBjcWEtaC00IGNxYS1mbGV4LXNocmluay0wIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0QxRDVEQl0gY3FhLW1yLTIgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWJvcmRlci1zb2xpZFwiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiaXNPcHRpb25TZWxlY3RlZChvcHQpID8geydiYWNrZ3JvdW5kLWNvbG9yJzonIzRGNDZFNScsJ2JvcmRlci1jb2xvcic6JyM0RjQ2RTUnfSA6IHt9XCI+XG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImlzT3B0aW9uU2VsZWN0ZWQob3B0KVwiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgM0w0LjUgOC41TDIgNlwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW1pbi13LTBcIj57eyBvcHQubmFtZSA/PyBvcHQubGFiZWwgPz8gb3B0LnZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE9wdGlvblRwbD5cbiAgICAgICAgICAgIHt7IG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUgfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgIFxuICAgICAgICA8IS0tIE5vIHJlc3VsdHMgc3RhdGUgKG9ubHkgd2hlbiBub3QgbG9hZGluZyBhbmQgbm8gb3B0aW9ucykgLS0+XG4gICAgICAgIDxtYXQtb3B0aW9uIGRpc2FibGVkICpuZ0lmPVwiIShjb25maWc/Lm9wdGlvbnM/Lmxlbmd0aCB8fCAwKSAmJiAhKGNvbmZpZz8uaXNMb2FkaW5nIHx8IGxvYWRpbmdNb3JlKVwiPlxuICAgICAgICAgIE5vIHJlc3VsdHNcbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICA8IS0tIEluZmluaXRlIHNjcm9sbCBzZW50aW5lbCAoc2VydmVyU2VhcmNoIG9yIGV4cGxpY2l0IGhhc01vcmUpIC0tPlxuICAgICAgICA8bWF0LW9wdGlvbiBkaXNhYmxlZCBjbGFzcz1cImxvYWQtbW9yZS1zZW50aW5lbFwiICpuZ0lmPVwiY29uZmlnPy5oYXNNb3JlXCI+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJsb2FkaW5nTW9yZSB8fCBjb25maWc/LmlzTG9hZGluZ1wiPkxvYWRpbmcuLi48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCIhbG9hZGluZ01vcmUgJiYgIWNvbmZpZz8uaXNMb2FkaW5nXCI+U2Nyb2xsIHRvIGxvYWQgbW9yZeKApjwvc3Bhbj5cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgIDwhLS0gSW5saW5lIHNwaW5uZXIgc2hvd24gd2hlbiBsb2FkaW5nIG1vcmUgKGluZmluaXRlIHNjcm9sbCkgb3Igd2hlbiBjb25maWcuaXNMb2FkaW5nIGlzIHRydWUgLS0+XG4gICAgICAgIDxzdmcgKm5nSWY9XCJsb2FkaW5nTW9yZSB8fCBjb25maWc/LmlzTG9hZGluZ1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgNTAgNTBcIiBhcmlhLWxhYmVsPVwibG9hZGluZ1wiXG4gICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxjaXJjbGUgY3g9XCIyNVwiIGN5PVwiMjVcIiByPVwiMjBcIiBzdHJva2U9XCIjRTVFN0VCXCIgc3Ryb2tlLXdpZHRoPVwiNlwiIGZpbGw9XCJub25lXCIvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNDUgMjVhMjAgMjAgMCAwIDAtMjAtMjBcIiBzdHJva2U9XCIjNEY0NkU1XCIgc3Ryb2tlLXdpZHRoPVwiNlwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPlxuICAgICAgICAgICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT1cInRyYW5zZm9ybVwiIHR5cGU9XCJyb3RhdGVcIiBmcm9tPVwiMCAyNSAyNVwiIHRvPVwiMzYwIDI1IDI1XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cj1cIjAuOHNcIiByZXBlYXRDb3VudD1cImluZGVmaW5pdGVcIi8+XG4gICAgICAgICAgPC9wYXRoPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzBBMEEwQVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2Rpdj5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PiJdfQ==
592
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFvQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBd0R2SyxNQUFNLE9BQU8sMkJBQTJCO0lBTHhDO1FBTVcscUJBQWdCLEdBQVcsZ0JBQWdCLENBQUM7UUFHM0Msb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBdUQsQ0FBQztRQUMxRixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDakQscUVBQXFFO1FBQzNELGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWtDLENBQUM7UUFDNUUsd0VBQXdFO1FBQzlELGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBa0MsQ0FBQztRQUt4RSxnRkFBZ0Y7UUFDaEYsb0JBQWUsR0FBMkIsRUFBRSxDQUFDO1FBR3JDLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQUM5QixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUVwQjs7O1dBR0c7UUFDSyx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDN0Isa0JBQWEsR0FBRyxHQUFHLEVBQUU7WUFDM0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztZQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVc7Z0JBQUUsT0FBTztZQUN0RCxNQUFNLEVBQUUs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b21wb25lbnQsIElucHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRTZWxlY3QsIE1hdFNlbGVjdENoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5cbi8vIExvY2FsIG9wdGlvbiBtb2RlbCAocHJldmlvdXNseSBpbXBvcnRlZCBmcm9tIHJlbW92ZWQgY3FhLXNlbGVjdCBjb21wb25lbnQpXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdE9wdGlvbiB7XG4gIGlkPzogYW55O1xuICB2YWx1ZT86IGFueTtcbiAgbmFtZT86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAga2V5OiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBtdWx0aXBsZT86IGJvb2xlYW47XG4gIHNlYXJjaGFibGU/OiBib29sZWFuO1xuICAvKiogQ29udHJvbHMgaG93IHNlbGVjdGlvbiBpbmRpY2F0b3IgaXMgc2hvd24gZm9yIG11bHRpLXNlbGVjdCBvcHRpb25zLiAqL1xuICBvcHRpb25TdHlsZT86ICdjaGVja21hcmsnIHwgJ2NoZWNrYm94JztcbiAgLyoqIFNob3cgYSAnU2VsZWN0IEFsbCcgb3B0aW9uIGF0IHRoZSB0b3AgKG11bHRpLXNlbGVjdCBvbmx5KS4gKi9cbiAgc2hvd1NlbGVjdEFsbD86IGJvb2xlYW47XG4gIC8qKiBDdXN0b20gbGFiZWwgZm9yIHRoZSAnU2VsZWN0IEFsbCcgb3B0aW9uLiBEZWZhdWx0cyB0byAnQWxsJy4gKi9cbiAgc2VsZWN0QWxsTGFiZWw/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBjbG9zZSB0aGUgcGFuZWwgd2hlbiBhbiBvcHRpb24gaXMgc2VsZWN0ZWQgKHVzZWZ1bCBmb3IgbXVsdGktc2VsZWN0IGluIGhlYWRlcnMpLiAqL1xuICBjbG9zZU9uU2VsZWN0PzogYm9vbGVhbjtcbiAgLyoqIFByb3ZpZGUgYSBkZWZhdWx0IHNlbGVjdGVkIHZhbHVlIChvciBhcnJheSBmb3IgbXVsdGktc2VsZWN0KSBpZiB0aGUgY29udHJvbCBoYXMgbm8gdmFsdWUgeWV0LiAqL1xuICBzZWxlY3RlZFZhbHVlPzogYW55IHwgYW55W107XG4gIC8qKiBPcHRpb25hbCBjYWxsYmFjayBpbnZva2VkIHdoZW5ldmVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlcy4gKi9cbiAgb25DaGFuZ2U/OiAodmFsdWU6IGFueSwgZXZlbnQ/OiBNYXRTZWxlY3RDaGFuZ2UpID0+IHZvaWQ7XG4gIC8qKiBFbmFibGUgc2VydmVyLXNpZGUgc2VhcmNoIG1vZGU7IGNvbXBvbmVudCB3aWxsIGVtaXQgc2VhcmNoIGluc3RlYWQgb2YgbG9jYWwgZmlsdGVyaW5nLiAqL1xuICBzZXJ2ZXJTZWFyY2g/OiBib29sZWFuO1xuICAvKipcbiAgICogV2hlbiB0cnVlLCB0cmlnZ2VycyBhbiBpbml0aWFsIHNlYXJjaCBlbWl0IG9uIHBhbmVsIG9wZW4gKHNlcnZlclNlYXJjaCBtb2RlIG9ubHkpLlxuICAgKiBEZWZhdWx0cyB0byBmYWxzZSBzbyBvcGVuaW5nIHRoZSBkcm9wZG93biBkb2VzIE5PVCBjYWxsIHRoZSBBUEkuXG4gICAqL1xuICBpbml0aWFsRmV0Y2hPbk9wZW4/OiBib29sZWFuO1xuICAvKiogSW5kaWNhdGVzIG1vcmUgcmVzdWx0cyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwuICovXG4gIGhhc01vcmU/OiBib29sZWFuO1xuICAvKiogT3B0aW9uYWwgbG9hZGluZyBmbGFnIGNvbnRyb2xsZWQgYnkgY29uc3VtZXIgdG8gc2hvdyBsb2FkaW5nIHN0YXRlLiAqL1xuICBpc0xvYWRpbmc/OiBib29sZWFuO1xuICAvKiogT3B0aW9uYWwgY2FsbGJhY2sgZm9yIHNlcnZlci1zaWRlIHNlYXJjaCB3aGVuIHF1ZXJ5IGNoYW5nZXMuICovXG4gIG9uU2VhcmNoPzogKHF1ZXJ5OiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBPcHRpb25hbCBjYWxsYmFjayB3aGVuIG1vcmUgZGF0YSBpcyByZXF1ZXN0ZWQgKGluZmluaXRlIHNjcm9sbCkuICovXG4gIG9uTG9hZE1vcmU/OiAocXVlcnk/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBPcHRpb25hbCByZWdleCBwYXR0ZXJuIG9yIGZ1bmN0aW9uIHRvIGhpZ2hsaWdodCBwYXJ0cyBvZiBvcHRpb24gdGV4dC4gKi9cbiAgaGlnaGxpZ2h0UGF0dGVybj86IFJlZ0V4cCB8IHN0cmluZyB8ICgodGV4dDogc3RyaW5nKSA9PiBzdHJpbmcpO1xuICBvcHRpb25zOiBTZWxlY3RPcHRpb25bXTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLWR5bmFtaWMtc2VsZWN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY1NlbGVjdEZpZWxkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICByZWFkb25seSBTRUxFQ1RfQUxMX1ZBTFVFOiBzdHJpbmcgPSAnX19zZWxlY3RfYWxsX18nO1xuICBASW5wdXQoKSBmb3JtITogRm9ybUdyb3VwO1xuICBASW5wdXQoKSBjb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHZhbHVlOiBhbnk7IGV2ZW50OiBNYXRTZWxlY3RDaGFuZ2UgfT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRW1pdHMgd2hlbiB1c2VyIHR5cGVzIGluIHNlYXJjaCBib3ggKHVzZWZ1bCBmb3Igc2VydmVyIHNlYXJjaCkgKi9cbiAgQE91dHB1dCgpIHNlYXJjaENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuICAvKiogRW1pdHMgd2hlbiB0aGUgY29tcG9uZW50IHJlcXVlc3RzIG1vcmUgZGF0YSBmb3IgdGhlIGN1cnJlbnQgcXVlcnkgKi9cbiAgQE91dHB1dCgpIGxvYWRNb3JlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0+KCk7XG5cbiAgQFZpZXdDaGlsZCgnc2VsZWN0UmVmJywgeyBzdGF0aWM6IGZhbHNlIH0pIHNlbGVjdFJlZj86IE1hdFNlbGVjdDtcbiAgQFZpZXdDaGlsZCgnaG9zdCcsIHsgc3RhdGljOiBmYWxzZSwgcmVhZDogRWxlbWVudFJlZiB9KSBob3N0RWw/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAvLyBNdXN0IGJlIHB1YmxpYyBmb3IgdGVtcGxhdGUgYWNjZXNzIGluIEFuZ3VsYXIncyBzdHJpY3QgdGVtcGxhdGUgY2hlY2tpbmcgbW9kZVxuICBzZWFyY2hUZXh0QnlLZXk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgcHJpdmF0ZSBvdXRzaWRlQ2xlYW51cD86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgbG9hZE1vcmVPYnNlcnZlcj86IEludGVyc2VjdGlvbk9ic2VydmVyO1xuICBwcml2YXRlIGxhc3RPcHRpb25zTGVuZ3RoID0gMDtcbiAgbG9hZGluZ01vcmUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBwYW5lbFNjcm9sbEVsPzogSFRNTEVsZW1lbnQ7XG4gIC8qKlxuICAgKiBHdWFyZCB0byBlbnN1cmUgbG9hZC1tb3JlIGlzIG9ubHkgdHJpZ2dlcmVkIGFmdGVyIHRoZSB1c2VyIGhhcyBzY3JvbGxlZFxuICAgKiBhdCBsZWFzdCBvbmNlIHNpbmNlIG9wZW5pbmcgdGhlIHBhbmVsLiBQcmV2ZW50cyBhdXRvLWxvYWQgb24gb3Blbi5cbiAgICovXG4gIHByaXZhdGUgaGFzU2Nyb2xsZWRTaW5jZU9wZW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBvblBhbmVsU2Nyb2xsID0gKCkgPT4ge1xuICAgIHRoaXMuaGFzU2Nyb2xsZWRTaW5jZU9wZW4gPSB0cnVlO1xuICAgIGlmICghdGhpcy5jb25maWc/Lmhhc01vcmUgfHwgdGhpcy5sb2FkaW5nTW9yZSkgcmV0dXJuO1xuICAgIGNvbnN0IGVsID0gdGhpcy5wYW5lbFNjcm9sbEVsO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCBuZWFyQm90dG9tID0gZWwuc2Nyb2xsVG9wICsgZWwuY2xpZW50SGVpZ2h0ID49IGVsLnNjcm9sbEhlaWdodCAtIDQ4OyAvLyB+MyBvcHRpb24gcm93c1xuICAgIGlmIChuZWFyQm90dG9tKSB7XG4gICAgICB0aGlzLmxvYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXkgfHwgJyc7XG4gICAgICBjb25zdCBxID0gdGhpcy5zZWFyY2hUZXh0QnlLZXlba2V5XSB8fCAnJztcbiAgICAgIHRoaXMubG9hZE1vcmUuZW1pdCh7IGtleSwgcXVlcnk6IHEgfSk7XG4gICAgICB0cnkgeyB0aGlzLmNvbmZpZy5vbkxvYWRNb3JlPy4ocSk7IH0gY2F0Y2gge31cbiAgICB9XG4gIH07XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZyB8fCAhdGhpcy5jb25maWcua2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NxYS1keW5hbWljLXNlbGVjdDogaW5wdXQgXCJjb25maWcua2V5XCIgaXMgcmVxdWlyZWQuJyk7XG4gICAgfVxuICAgIHRoaXMuYXBwbHlTZWxlY3RlZFZhbHVlSWZOZWVkZWQoKTtcbiAgICB0aGlzLmxhc3RPcHRpb25zTGVuZ3RoID0gKHRoaXMuY29uZmlnPy5vcHRpb25zIHx8IFtdKS5sZW5ndGg7XG4gIH1cblxuICBnZXQgZGlzcGxheVBsYWNlaG9sZGVyKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWc/LmtleTtcbiAgICBpZiAoIWtleSB8fCAhdGhpcy5mb3JtKSByZXR1cm4gdGhpcy5jb25maWc/LnBsYWNlaG9sZGVyO1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuZm9ybS5nZXQoa2V5KT8udmFsdWU7XG4gICAgcmV0dXJuIHRoaXMuaGFzRXhpc3RpbmdWYWx1ZShjb250cm9sVmFsdWUpID8gdW5kZWZpbmVkIDogdGhpcy5jb25maWc/LnBsYWNlaG9sZGVyO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICgnY29uZmlnJyBpbiBjaGFuZ2VzKSB7XG4gICAgICAvLyBXaGVuIGNvbmZpZyBjaGFuZ2VzIChpbmNsdWRpbmcgdG9nZ2xpbmcgbXVsdGlwbGUpLCBlbnN1cmUgY29udHJvbCB2YWx1ZSBzaGFwZSBtYXRjaGVzXG4gICAgICB0aGlzLnN5bmNDb250cm9sVmFsdWVGb3JNdWx0aXBsZU1vZGUoKTtcbiAgICAgIHRoaXMuYXBwbHlTZWxlY3RlZFZhbHVlSWZOZWVkZWQoKTtcbiAgICAgIC8vIFN5bmMgbG9hZGluZ01vcmUgd2l0aCBjb25maWcuaXNMb2FkaW5nIHdoZW4gcHJvdmlkZWQgYnkgcGFyZW50XG4gICAgICAvLyBUaGlzIGFsbG93cyBwYXJlbnQgdG8gY29udHJvbCBsb2FkaW5nIHN0YXRlIChlLmcuLCBkdXJpbmcgbG9hZCBtb3JlIG9wZXJhdGlvbnMpXG4gICAgICBpZiAodGhpcy5jb25maWc/LmlzTG9hZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9hZGluZ01vcmUgPSB0aGlzLmNvbmZpZy5pc0xvYWRpbmc7XG4gICAgICB9XG4gICAgICAvLyBSZXNldCBsb2FkaW5nTW9yZSB3aGVuIG5ldyBvcHRpb25zIGFycml2ZSAob3B0aW9ucyBsZW5ndGggaW5jcmVhc2VkKVxuICAgICAgY29uc3QgbGVuID0gKHRoaXMuY29uZmlnPy5vcHRpb25zIHx8IFtdKS5sZW5ndGg7XG4gICAgICBpZiAobGVuID4gdGhpcy5sYXN0T3B0aW9uc0xlbmd0aCkge1xuICAgICAgICAvLyBSZXNldCBsb2FkaW5nIHN0YXRlIHdoZW4gbmV3IGRhdGEgYXJyaXZlcywgdW5sZXNzIHBhcmVudCBleHBsaWNpdGx5IHNheXMgc3RpbGwgbG9hZGluZ1xuICAgICAgICBpZiAodGhpcy5jb25maWc/LmlzTG9hZGluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdNb3JlID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWc/LmlzTG9hZGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gT25seSBhdXRvLXJlc2V0IGlmIHBhcmVudCBkb2Vzbid0IGNvbnRyb2wgbG9hZGluZyBzdGF0ZVxuICAgICAgICAgIHRoaXMubG9hZGluZ01vcmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5sYXN0T3B0aW9uc0xlbmd0aCA9IGxlbjtcbiAgICAgIC8vIElmIGNvbnN1bWVyIGluZGljYXRlcyBubyBtb3JlIHJlc3VsdHMsIGNsZWFyIGxvYWRpbmcgc3RhdGUgYW5kIGFueSBvYnNlcnZlcnNcbiAgICAgIGlmICghdGhpcy5jb25maWc/Lmhhc01vcmUpIHtcbiAgICAgICAgLy8gQ2xlYXIgbG9hZGluZyBzdGF0ZSB3aGVuIG5vIG1vcmUgcmVzdWx0cywgdW5sZXNzIHBhcmVudCBleHBsaWNpdGx5IHNheXMgc3RpbGwgbG9hZGluZ1xuICAgICAgICBpZiAodGhpcy5jb25maWc/LmlzTG9hZGluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdNb3JlID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWc/LmlzTG9hZGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nTW9yZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIpIHtcbiAgICAgICAgICB0cnkgeyB0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIuZGlzY29ubmVjdCgpOyB9IGNhdGNoIHt9XG4gICAgICAgICAgdGhpcy5sb2FkTW9yZU9ic2VydmVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBJZiBwYW5lbCBpcyBvcGVuIGFuZCBoYXNNb3JlIGlzIHRydWUsIGVuc3VyZSB0aGUgc2VudGluZWwgaXMgYmVpbmcgb2JzZXJ2ZWQuXG4gICAgICBpZiAodGhpcy5zZWxlY3RSZWY/LnBhbmVsT3BlbiAmJiB0aGlzLmNvbmZpZz8uaGFzTW9yZSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2V0dXBMb2FkTW9yZU9ic2VydmVyKCksIDApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoJ2Zvcm0nIGluIGNoYW5nZXMgJiYgIWNoYW5nZXNbJ2Zvcm0nXS5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy5hcHBseVNlbGVjdGVkVmFsdWVJZk5lZWRlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwYW5lbENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBjdGMtc2VsZWN0LXBhbmVsICR7dGhpcy5pc011bHRpcGxlID8gJ211bHRpcGxlJyA6ICcnfWAudHJpbSgpO1xuICB9XG5cbiAgZ2V0IGlzTXVsdGlwbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudG9Cb29sZWFuKHRoaXMuY29uZmlnPy5tdWx0aXBsZSk7XG4gIH1cblxuICBnZXQgaXNEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50b0Jvb2xlYW4odGhpcy5jb25maWc/LmRpc2FibGVkKTtcbiAgfVxuICBcbiAgZ2V0IHVzZUNoZWNrYm94U3R5bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNNdWx0aXBsZSAmJiAodGhpcy5jb25maWc/Lm9wdGlvblN0eWxlID09PSAnY2hlY2tib3gnKTtcbiAgfVxuICBcbiAgZ2V0IGFsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5pc011bHRpcGxlKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWc/LmtleTtcbiAgICBpZiAoIWtleSB8fCAhdGhpcy5mb3JtKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcbiAgICBpZiAoIWNvbnRyb2wpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IGNvbnRyb2wudmFsdWUgYXMgYW55W107XG4gICAgY29uc3QgYWxsSWRzID0gdGhpcy5nZXRBbGxPcHRpb25JZHMoKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2VsZWN0ZWQpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFhbGxJZHMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGFsbElkcy5ldmVyeShpZCA9PiBzZWxlY3RlZC5pbmNsdWRlcyhpZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0Jvb2xlYW4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgdiA9IHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHYgPT09ICd0cnVlJyB8fCB2ID09PSAnMScpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHYgPT09ICdmYWxzZScgfHwgdiA9PT0gJzAnIHx8IHYgPT09ICcnKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gYW55IG90aGVyIG5vbi1lbXB0eSBzdHJpbmcgdHJlYXRlZCBhcyB0cnV0aHlcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAhPT0gMDtcbiAgICB9XG4gICAgcmV0dXJuICEhdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHN5bmNDb250cm9sVmFsdWVGb3JNdWx0aXBsZU1vZGUoKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWc/LmtleTtcbiAgICBpZiAoIWtleSB8fCAhdGhpcy5mb3JtKSByZXR1cm47XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcbiAgICBpZiAoIWNvbnRyb2wpIHJldHVybjtcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGlmICh0aGlzLmlzTXVsdGlwbGUpIHtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudFZhbHVlKSkgcmV0dXJuO1xuICAgICAgY29udHJvbC5zZXRWYWx1ZShbY3VycmVudFZhbHVlXSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY3VycmVudFZhbHVlKSkgcmV0dXJuO1xuICAgICAgY29udHJvbC5zZXRWYWx1ZShjdXJyZW50VmFsdWUubGVuZ3RoID8gY3VycmVudFZhbHVlWzBdIDogbnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlTZWxlY3RlZFZhbHVlSWZOZWVkZWQoKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWc/LmtleTtcbiAgICBpZiAoIWtleSB8fCAhdGhpcy5mb3JtKSByZXR1cm47XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcbiAgICBpZiAoIWNvbnRyb2wpIHJldHVybjtcbiAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gdGhpcy5jb25maWc/LnNlbGVjdGVkVmFsdWU7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBpZiAodGhpcy5oYXNFeGlzdGluZ1ZhbHVlKGN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNlbGVjdGVkVmFsdWUgPT09IHVuZGVmaW5lZCB8fCBzZWxlY3RlZFZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNNdWx0aXBsZSkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IChBcnJheS5pc0FycmF5KHNlbGVjdGVkVmFsdWUpID8gc2VsZWN0ZWRWYWx1ZSA6IFtzZWxlY3RlZFZhbHVlXSkuZmlsdGVyKFxuICAgICAgICAodmFsKSA9PiB2YWwgIT09IHVuZGVmaW5lZCxcbiAgICAgICk7XG4gICAgICBpZiAoIW5vcm1hbGl6ZWQubGVuZ3RoKSByZXR1cm47XG4gICAgICBjb250cm9sLnNldFZhbHVlKG5vcm1hbGl6ZWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRWYWx1ZSlcbiAgICAgICAgPyAoc2VsZWN0ZWRWYWx1ZS5sZW5ndGggPyBzZWxlY3RlZFZhbHVlWzBdIDogdW5kZWZpbmVkKVxuICAgICAgICA6IHNlbGVjdGVkVmFsdWU7XG4gICAgICBpZiAobm9ybWFsaXplZCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICBjb250cm9sLnNldFZhbHVlKG5vcm1hbGl6ZWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc0V4aXN0aW5nVmFsdWUodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnNvbWUoKHZhbCkgPT4gdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gJycpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlzT3B0aW9uU2VsZWN0ZWQob3B0OiBTZWxlY3RPcHRpb24pOiBib29sZWFuIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0pIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xuICAgIGlmICghY29udHJvbCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgY29uc3Qgb3B0aW9uSWQgPSBvcHQuaWQgPz8gb3B0LnZhbHVlO1xuICAgIGlmICh0aGlzLmlzTXVsdGlwbGUpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb250cm9sVmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gY29udHJvbFZhbHVlLmluY2x1ZGVzKG9wdGlvbklkKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2xWYWx1ZSA9PT0gb3B0aW9uSWQ7XG4gIH1cblxuICBwcml2YXRlIGdldEFsbE9wdGlvbklkcygpOiBhbnlbXSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY29uZmlnPy5vcHRpb25zIHx8IFtdO1xuICAgIHJldHVybiBvcHRpb25zLm1hcChvID0+IChvLmlkID8/IG8udmFsdWUpKS5maWx0ZXIodiA9PiB2ICE9PSB1bmRlZmluZWQpO1xuICB9XG5cbiAgb25Ub2dnbGVTZWxlY3RBbGwoc2VsZWN0OiBNYXRTZWxlY3QpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0pIHJldHVybjtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xuICAgIGlmICghY29udHJvbCkgcmV0dXJuO1xuICAgIGNvbnN0IGFsbElkcyA9IHRoaXMuZ2V0QWxsT3B0aW9uSWRzKCk7XG4gICAgaWYgKCFhbGxJZHMubGVuZ3RoKSByZXR1cm47XG4gICAgaWYgKHRoaXMuYWxsU2VsZWN0ZWQpIHtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUoW10sIHsgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250cm9sLnNldFZhbHVlKGFsbElkcywgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgfVxuICAgIC8vIEtlZXAgcGFuZWwgb3BlbiBmb3IgY29udGludWVkIHNlbGVjdGlvbnMgaW4gbXVsdGktc2VsZWN0XG4gICAgdHJ5IHsgc2VsZWN0Lm9wZW4oKTsgfSBjYXRjaCB7fVxuICB9XG5cbiAgb25TZWxlY3RPcGVuZWRDaGFuZ2Uob3BlbmVkOiBib29sZWFuLCBfc2VsZWN0OiBNYXRTZWxlY3QpOiB2b2lkIHtcbiAgICBpZiAob3BlbmVkKSB7XG4gICAgICAvLyBFbWl0IGNsaWNrIGV2ZW50IHdoZW4gc2VsZWN0IGlzIG9wZW5lZCAoY2xpY2tlZClcbiAgICAgIHRoaXMuc2VsZWN0Q2xpY2suZW1pdCgpO1xuICAgICAgLy8gUmVzZXQgbG9hZGluZ01vcmUgd2hlbiBvcGVuaW5nIGlmIG9wdGlvbnMgYWxyZWFkeSBleGlzdCAoZG9uJ3Qgc2hvdyBsb2FkZXIgb24gaW5pdGlhbCBvcGVuKVxuICAgICAgaWYgKCh0aGlzLmNvbmZpZz8ub3B0aW9ucyB8fCBbXSkubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmxvYWRpbmdNb3JlID0gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBFbnN1cmUgd2Ugb25seSB0cmlnZ2VyIGxvYWQtbW9yZSBhZnRlciBhIHJlYWwgdXNlciBzY3JvbGxcbiAgICAgIHRoaXMuaGFzU2Nyb2xsZWRTaW5jZU9wZW4gPSBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCFvcGVuZWQpIHtcbiAgICAgIC8vIFJlc2V0IHNlYXJjaCB0ZXh0IG9uIGNsb3NlIHNvIHRoZSBuZXh0IG9wZW4gc2hvd3MgZnVsbCBsaXN0XG4gICAgICBpZiAodGhpcy5jb25maWc/LmtleSkge1xuICAgICAgICB0aGlzLnNlYXJjaFRleHRCeUtleVt0aGlzLmNvbmZpZy5rZXldID0gJyc7XG4gICAgICB9XG4gICAgICAvLyBFbnN1cmUgYW55IHByZXZpb3VzIGN1c3RvbSBsaXN0ZW5lcnMgYXJlIGNsZWFyZWQgKGxlZ2FjeSBjb21wYXRpYmlsaXR5KVxuICAgICAgaWYgKHRoaXMub3V0c2lkZUNsZWFudXApIHtcbiAgICAgICAgdGhpcy5vdXRzaWRlQ2xlYW51cCgpO1xuICAgICAgICB0aGlzLm91dHNpZGVDbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgLy8gRGlzY29ubmVjdCBsb2FkLW1vcmUgb2JzZXJ2ZXIgaWYgYW55XG4gICAgICBpZiAodGhpcy5sb2FkTW9yZU9ic2VydmVyKSB7XG4gICAgICAgIHRyeSB7IHRoaXMubG9hZE1vcmVPYnNlcnZlci5kaXNjb25uZWN0KCk7IH0gY2F0Y2gge31cbiAgICAgICAgdGhpcy5sb2FkTW9yZU9ic2VydmVyID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgLy8gUmVtb3ZlIHNjcm9sbCBsaXN0ZW5lciBpZiBhdHRhY2hlZFxuICAgICAgaWYgKHRoaXMucGFuZWxTY3JvbGxFbCkge1xuICAgICAgICB0cnkgeyB0aGlzLnBhbmVsU2Nyb2xsRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5vblBhbmVsU2Nyb2xsKTsgfSBjYXRjaCB7fVxuICAgICAgICB0aGlzLnBhbmVsU2Nyb2xsRWwgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICAvLyBSZXNldCBsb2FkaW5nTW9yZSB3aGVuIGNsb3NpbmdcbiAgICAgIHRoaXMubG9hZGluZ01vcmUgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGb2N1cyB0aGUgc2VhcmNoIGJveCBpZiBlbmFibGVkXG4gICAgaWYgKHRoaXMuY29uZmlnPy5zZWFyY2hhYmxlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KCcudHMtc2VsZWN0LXNlYXJjaC1pbnB1dCcpO1xuICAgICAgICBpbnB1dD8uZm9jdXMoKTtcbiAgICAgIH0sIDApO1xuICAgIH1cblxuICAgIC8vIE9wdGlvbmFsOiBvbmx5IHRyaWdnZXIgaW5pdGlhbCBmZXRjaCBvbiBvcGVuIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQuXG4gICAgaWYgKHRoaXMuY29uZmlnPy5zZXJ2ZXJTZWFyY2ggJiYgdGhpcy50b0Jvb2xlYW4odGhpcy5jb25maWc/LmluaXRpYWxGZXRjaE9uT3BlbikpIHtcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnLmtleTtcbiAgICAgIGNvbnN0IHEgPSB0aGlzLnNlYXJjaFRleHRCeUtleVtrZXldIHx8ICcnO1xuICAgICAgdHJ5IHsgdGhpcy5jb25maWcub25TZWFyY2g/LihxKTsgfSBjYXRjaCB7fVxuICAgICAgdGhpcy5zZWFyY2hDaGFuZ2UuZW1pdCh7IGtleSwgcXVlcnk6IHEgfSk7XG4gICAgfVxuXG4gICAgLy8gU2V0dXAgaW5maW5pdGUgc2Nyb2xsIG9ic2VydmVyIG9uIHNlbnRpbmVsXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNldHVwTG9hZE1vcmVPYnNlcnZlcigpLCAwKTtcbiAgICAvLyBBbHNvIGF0dGFjaCBhIHNjcm9sbCBsaXN0ZW5lciBmYWxsYmFjayBmb3IgcmVsaWFibGUgbG9hZC1tb3JlIHRyaWdnZXJzXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYW5lbHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tYXQtc2VsZWN0LXBhbmVsJykpIGFzIEhUTUxFbGVtZW50W107XG4gICAgICAgIHRoaXMucGFuZWxTY3JvbGxFbCA9IHBhbmVscy5sZW5ndGggPyBwYW5lbHNbcGFuZWxzLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5wYW5lbFNjcm9sbEVsKSB7XG4gICAgICAgICAgdGhpcy5wYW5lbFNjcm9sbEVsLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMub25QYW5lbFNjcm9sbCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfSwgMCk7XG4gIH1cblxuICBvblNlYXJjaChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVGV4dEJ5S2V5W2tleV0gPSB2YWx1ZSA/PyAnJztcbiAgICBpZiAodGhpcy5jb25maWc/LnNlcnZlclNlYXJjaCkge1xuICAgICAgLy8gRm9yIHNlcnZlci1zaWRlIHNlYXJjaCwgZW1pdCBpbnN0ZWFkIG9mIGxvY2FsIGZpbHRlcmluZ1xuICAgICAgdHJ5IHsgdGhpcy5jb25maWcub25TZWFyY2g/Lih2YWx1ZSA/PyAnJyk7IH0gY2F0Y2gge31cbiAgICAgIHRoaXMuc2VhcmNoQ2hhbmdlLmVtaXQoeyBrZXksIHF1ZXJ5OiB2YWx1ZSA/PyAnJyB9KTtcbiAgICAgIC8vIFJlc2V0IGludGVybmFsIHBhZ2luZyBzdGF0ZVxuICAgICAgdGhpcy5sb2FkaW5nTW9yZSA9IGZhbHNlO1xuICAgICAgdGhpcy5sYXN0T3B0aW9uc0xlbmd0aCA9ICh0aGlzLmNvbmZpZz8ub3B0aW9ucyB8fCBbXSkubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgb3B0aW9uIGlkcyBmb3IgdGhlIGNvbmZpZ3VyZWQgY29udHJvbC5cbiAgICovXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRJZHNGb3JLZXkoa2V5OiBzdHJpbmcpOiBhbnlbXSB7XG4gICAgaWYgKCFrZXkgfHwgIXRoaXMuZm9ybSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XG4gICAgaWYgKCFjb250cm9sKSByZXR1cm4gW107XG4gICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGlmICh0aGlzLmlzTXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW107XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsID8gW3ZhbHVlXSA6IFtdO1xuICB9XG5cbiAgLyoqIFByb2dyYW1tYXRpY2FsbHkgY2xvc2UgdGhlIHNlbGVjdCBwYW5lbCBpZiBvcGVuICovXG4gIHB1YmxpYyBjbG9zZVBhbmVsKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnNlbGVjdFJlZj8uY2xvc2UoKTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICBmaWx0ZXJlZE9wdGlvbnMoYzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnKTogU2VsZWN0T3B0aW9uW10ge1xuICAgIGNvbnN0IHQgPSAodGhpcy5zZWFyY2hUZXh0QnlLZXlbYy5rZXldIHx8ICcnKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAvLyBJbiBzZXJ2ZXItc2lkZSBtb2RlLCByZXR1cm4gb3B0aW9ucyBhcy1pcyAocGFyZW50IHByb3ZpZGVzIGxpc3QpXG4gICAgaWYgKGMuc2VydmVyU2VhcmNoKSByZXR1cm4gYy5vcHRpb25zIHx8IFtdO1xuICAgIC8vIFdoZW4gbm90IHNlYXJjaGluZywgcmV0dXJuIGZ1bGwgbGlzdCB0byBwcmVzZXJ2ZSBvcmlnaW5hbCBvcmRlcmluZ1xuICAgIGlmICghdCkgcmV0dXJuIGMub3B0aW9ucyB8fCBbXTtcblxuICAgIGNvbnN0IGFsbE9wdGlvbnMgPSBjLm9wdGlvbnMgfHwgW107XG4gICAgY29uc3QgYmFzZUZpbHRlcmVkID0gYWxsT3B0aW9ucy5maWx0ZXIoKG9wdCkgPT4ge1xuICAgICAgY29uc3QgdGV4dCA9IFN0cmluZyhvcHQubmFtZSA/PyBvcHQubGFiZWwgPz8gb3B0LnZhbHVlID8/ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIHRleHQuaW5jbHVkZXModCk7XG4gICAgfSk7XG5cbiAgICAvLyBFbnN1cmUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvbihzKSBhcmUgYWx3YXlzIHZpc2libGUgd2hpbGUgc2VhcmNoaW5nXG4gICAgY29uc3Qgc2VsZWN0ZWRJZHMgPSB0aGlzLmdldFNlbGVjdGVkSWRzRm9yS2V5KGMua2V5KTtcbiAgICBpZiAoIXNlbGVjdGVkSWRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGJhc2VGaWx0ZXJlZDtcbiAgICB9XG5cbiAgICBjb25zdCBpZE9mID0gKG86IFNlbGVjdE9wdGlvbikgPT4gKG8uaWQgPz8gby52YWx1ZSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25zID0gYWxsT3B0aW9ucy5maWx0ZXIobyA9PiBzZWxlY3RlZElkcy5pbmNsdWRlcyhpZE9mKG8pKSk7XG5cbiAgICAvLyBNZXJnZSBzZWxlY3RlZCBvcHRpb25zIChrZWVwaW5nIHRoZWlyIG9yaWdpbmFsIG9yZGVyKSB3aXRoIGZpbHRlcmVkIG9uZXMsIGRlLWR1cGxpY2F0ZWRcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxhbnk+KCk7XG4gICAgY29uc3QgbWVyZ2VkOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbyBvZiBzZWxlY3RlZE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGlkID0gaWRPZihvKTtcbiAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmICghc2Vlbi5oYXMoaWQpKSB7XG4gICAgICAgIHNlZW4uYWRkKGlkKTtcbiAgICAgICAgbWVyZ2VkLnB1c2gobyk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgbyBvZiBiYXNlRmlsdGVyZWQpIHtcbiAgICAgIGNvbnN0IGlkID0gaWRPZihvKTtcbiAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmICghc2Vlbi5oYXMoaWQpKSB7XG4gICAgICAgIHNlZW4uYWRkKGlkKTtcbiAgICAgICAgbWVyZ2VkLnB1c2gobyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZXJnZWQ7XG4gIH1cblxuICAvLyBDbG9zZSB3aGVuIGFuIG9wdGlvbiBpcyBzZWxlY3RlZCBpZiByZXF1ZXN0ZWQuIEFsd2F5cyBjbG9zZSBmb3Igc2luZ2xlLXNlbGVjdC5cbiAgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IE1hdFNlbGVjdENoYW5nZSwgc2VsZWN0OiBNYXRTZWxlY3QpOiB2b2lkIHtcbiAgICAvLyBIYW5kbGUgc2VsZWN0LWFsbCBzZW50aW5lbCBpbiBtdWx0aS1zZWxlY3RcbiAgICBpZiAodGhpcy5pc011bHRpcGxlICYmIEFycmF5LmlzQXJyYXkoZXZlbnQudmFsdWUpICYmIGV2ZW50LnZhbHVlLmluY2x1ZGVzKHRoaXMuU0VMRUNUX0FMTF9WQUxVRSkpIHtcbiAgICAgIC8vIFJlbW92ZSBzZW50aW5lbCBhbmQgdG9nZ2xlIGFsbFxuICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWc/LmtleTtcbiAgICAgIGlmIChrZXkgJiYgdGhpcy5mb3JtKSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XG4gICAgICAgIC8vIFRvZ2dsZSBiYXNlZCBvbiBjdXJyZW50IHN0YXRlXG4gICAgICAgIHRoaXMub25Ub2dnbGVTZWxlY3RBbGwoc2VsZWN0KTtcbiAgICAgICAgLy8gRW5zdXJlIHNlbnRpbmVsIGlzIG5vdCBwcmVzZW50XG4gICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyZWQgPSAoY29udHJvbC52YWx1ZSBhcyBhbnlbXSkuZmlsdGVyKHYgPT4gdiAhPT0gdGhpcy5TRUxFQ1RfQUxMX1ZBTFVFKTtcbiAgICAgICAgICBjb250cm9sLnNldFZhbHVlKGZpbHRlcmVkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIERvIG5vdCBwcm9jZWVkIHdpdGggbm9ybWFsIGNsb3NlIGxvZ2ljIGZvciBzZWxlY3QtYWxsXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIExldCBBbmd1bGFyIE1hdGVyaWFsIGF1dG8tY2xvc2UgZm9yIHNpbmdsZS1zZWxlY3QuXG4gICAgLy8gRm9yIG11bHRpLXNlbGVjdCwgY2xvc2Ugb25seSBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbiAgICBjb25zdCBzaG91bGRDbG9zZSA9IHRoaXMuaXNNdWx0aXBsZSA/ICEhdGhpcy5jb25maWc/LmNsb3NlT25TZWxlY3QgOiBmYWxzZTtcbiAgICBpZiAoc2hvdWxkQ2xvc2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlbGVjdC5jbG9zZSgpO1xuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgICAvLyBJZiBzZWFyY2hhYmxlLCBjbGVhciB0aGUgc2VhcmNoIGFmdGVyIHNlbGVjdGlvbiBzbyByZW9wZW5pbmcgd29ya3MgcHJlZGljdGFibHlcbiAgICBpZiAodGhpcy5jb25maWc/LnNlYXJjaGFibGUgJiYgdGhpcy5jb25maWc/LmtleSkge1xuICAgICAgdGhpcy5zZWFyY2hUZXh0QnlLZXlbdGhpcy5jb25maWcua2V5XSA9ICcnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWc/Lm9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbmZpZy5vbkNoYW5nZShldmVudC52YWx1ZSwgZXZlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignY3FhLWR5bmFtaWMtc2VsZWN0IG9uQ2hhbmdlIGhhbmRsZXIgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoe1xuICAgICAga2V5OiB0aGlzLmNvbmZpZz8ua2V5LFxuICAgICAgdmFsdWU6IGV2ZW50LnZhbHVlLFxuICAgICAgZXZlbnQsXG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIGhhbmRsZURvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBDbG9zZSB3aGVuIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIHRyaWdnZXIgYW5kIG91dHNpZGUgb2YgdGhlIG9wZW4gcGFuZWxcbiAgICBpZiAoIXRoaXMuc2VsZWN0UmVmPy5wYW5lbE9wZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuICAgIC8vIElmIGNsaWNrIGlzIGluc2lkZSB0aGUgY29tcG9uZW50IGhvc3QsIGlnbm9yZVxuICAgIGlmICh0aGlzLmhvc3RFbD8ubmF0aXZlRWxlbWVudCAmJiB0aGlzLmhvc3RFbC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gSWYgY2xpY2sgaXMgaW5zaWRlIGFueSBvcGVuIG1hdC1zZWxlY3QgcGFuZWwsIGlnbm9yZVxuICAgIGNvbnN0IHBhbmVsRWxzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubWF0LXNlbGVjdC1wYW5lbCcpKSBhcyBIVE1MRWxlbWVudFtdO1xuICAgIGNvbnN0IGNsaWNrSW5zaWRlUGFuZWwgPSBwYW5lbEVscy5zb21lKChlbCkgPT4gZWwuY29udGFpbnModGFyZ2V0KSk7XG4gICAgaWYgKGNsaWNrSW5zaWRlUGFuZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc2VsZWN0UmVmLmNsb3NlKCk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG5cbiAgLyoqXG4gICAqIEhpZ2hsaWdodHMgdGV4dCBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCBoaWdobGlnaHRQYXR0ZXJuLlxuICAgKiBSZXR1cm5zIEhUTUwgc3RyaW5nIHdpdGggaGlnaGxpZ2h0ZWQgcG9ydGlvbnMgd3JhcHBlZCBpbiA8c3BhbiBjbGFzcz1cImhpZ2hsaWdodFwiPi5cbiAgICovXG4gIGhpZ2hsaWdodFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRleHQgfHwgIXRoaXMuY29uZmlnPy5oaWdobGlnaHRQYXR0ZXJuKSB7XG4gICAgICByZXR1cm4gdGhpcy5lc2NhcGVIdG1sKHRleHQpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLmNvbmZpZy5oaWdobGlnaHRQYXR0ZXJuO1xuXG4gICAgLy8gSWYgaXQncyBhIGZ1bmN0aW9uLCB1c2UgaXQgZGlyZWN0bHlcbiAgICBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBwYXR0ZXJuKHRleHQpO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgc3RyaW5nIHBhdHRlcm4gdG8gUmVnRXhwIGlmIG5lZWRlZFxuICAgIGxldCByZWdleDogUmVnRXhwO1xuICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlZ2V4ID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCAnZ2knKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIGhpZ2hsaWdodCBwYXR0ZXJuOicsIHBhdHRlcm4pO1xuICAgICAgICByZXR1cm4gdGhpcy5lc2NhcGVIdG1sKHRleHQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZWdleCA9IHBhdHRlcm47XG4gICAgfVxuXG4gICAgLy8gRXNjYXBlIEhUTUwgZmlyc3QsIHRoZW4gYXBwbHkgaGlnaGxpZ2h0aW5nXG4gICAgY29uc3QgZXNjYXBlZCA9IHRoaXMuZXNjYXBlSHRtbCh0ZXh0KTtcbiAgICByZXR1cm4gZXNjYXBlZC5yZXBsYWNlKHJlZ2V4LCAobWF0Y2gpID0+IGA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXByaW1hcnlcIj4ke21hdGNofTwvc3Bhbj5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFc2NhcGVzIEhUTUwgc3BlY2lhbCBjaGFyYWN0ZXJzIHRvIHByZXZlbnQgWFNTLlxuICAgKi9cbiAgcHJpdmF0ZSBlc2NhcGVIdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gJyc7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnRleHRDb250ZW50ID0gdGV4dDtcbiAgICByZXR1cm4gZGl2LmlubmVySFRNTDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgaGlnaGxpZ2h0aW5nIGlzIGVuYWJsZWQgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKi9cbiAgZ2V0IGhhc0hpZ2hsaWdodGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmNvbmZpZz8uaGlnaGxpZ2h0UGF0dGVybjtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBMb2FkTW9yZU9ic2VydmVyKCk6IHZvaWQge1xuICAgIC8vIE9ubHkgaWYgY29uc3VtZXIgaW5kaWNhdGVzIG1vcmUgZGF0YSBpcyBhdmFpbGFibGVcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5oYXNNb3JlKSByZXR1cm47XG4gICAgLy8gRmluZCBzZW50aW5lbCBvcHRpb24gcmVuZGVyZWQgaW4gdGhlIG9wZW4gcGFuZWxcbiAgICBjb25zdCBzZW50aW5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tYXQtc2VsZWN0LXBhbmVsIC5tYXQtb3B0aW9uLmxvYWQtbW9yZS1zZW50aW5lbCcpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIXNlbnRpbmVsKSByZXR1cm47XG4gICAgaWYgKHRoaXMubG9hZE1vcmVPYnNlcnZlcikge1xuICAgICAgdHJ5IHsgdGhpcy5sb2FkTW9yZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTsgfSBjYXRjaCB7fVxuICAgICAgdGhpcy5sb2FkTW9yZU9ic2VydmVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBVc2UgdGhlIHNlbnRpbmVsJ3MgY2xvc2VzdCBwYW5lbCBhcyB0aGUgcm9vdCB0byBhdm9pZCBwaWNraW5nIGEgd3JvbmcgcGFuZWxcbiAgICBjb25zdCBwYW5lbFJvb3QgPSBzZW50aW5lbC5jbG9zZXN0KCcubWF0LXNlbGVjdC1wYW5lbCcpIGFzIEVsZW1lbnQgfCBudWxsO1xuICAgIHRoaXMubG9hZE1vcmVPYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICAgIC8vIFJlcXVlc3QgbW9yZSBvbmx5IGlmIG5vdCBjdXJyZW50bHkgbG9hZGluZyBhbmQgaGFzTW9yZSBzdGlsbCB0cnVlXG4gICAgICAgICAgaWYgKHRoaXMuaGFzU2Nyb2xsZWRTaW5jZU9wZW4gJiYgIXRoaXMubG9hZGluZ01vcmUgJiYgdGhpcy5jb25maWc/Lmhhc01vcmUpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ01vcmUgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWc/LmtleSB8fCAnJztcbiAgICAgICAgICAgIGNvbnN0IHEgPSB0aGlzLnNlYXJjaFRleHRCeUtleVtrZXldIHx8ICcnO1xuICAgICAgICAgICAgLy8gRW1pdCBvdXRwdXRzIGFuZCBpbnZva2Ugb3B0aW9uYWwgY2FsbGJhY2tzXG4gICAgICAgICAgICB0aGlzLmxvYWRNb3JlLmVtaXQoeyBrZXksIHF1ZXJ5OiBxIH0pO1xuICAgICAgICAgICAgdHJ5IHsgdGhpcy5jb25maWcub25Mb2FkTW9yZT8uKHEpOyB9IGNhdGNoIHt9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgeyByb290OiBwYW5lbFJvb3QsIHRocmVzaG9sZDogMC4xIH0pO1xuICAgIHRyeSB7IHRoaXMubG9hZE1vcmVPYnNlcnZlci5vYnNlcnZlKHNlbnRpbmVsKTsgfSBjYXRjaCB7fVxuICB9XG59XG5cblxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCI+XG4gIDxuZy1jb250YWluZXIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gICAgPGxhYmVsICpuZ0lmPVwiY29uZmlnLmxhYmVsXCJcbiAgICAgIGNsYXNzPVwiZm9ybS1sYWJlbCBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQtWzE0cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtYmxvY2sgY3FhLWxlYWRpbmctWzEuNF0gY3FhLW1iLTJcIj57e1xuICAgICAgY29uZmlnLmxhYmVsIH19PC9sYWJlbD5cbiAgICA8bWF0LWZvcm0tZmllbGQgI2hvc3QgY2xhc3M9XCJtYXQtc2VsZWN0LWN1c3RvbSBjcWEtdy1mdWxsXCIgYXBwZWFyYW5jZT1cImZpbGxcIj5cbiAgICAgIDxtYXQtc2VsZWN0ICNzZWxlY3RSZWY9XCJtYXRTZWxlY3RcIiBbcGxhY2Vob2xkZXJdPVwiZGlzcGxheVBsYWNlaG9sZGVyXCIgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIiBbbXVsdGlwbGVdPVwiaXNNdWx0aXBsZVwiXG4gICAgICAgIGRpc2FibGVPcHRpb25DZW50ZXJpbmcgW3BhbmVsQ2xhc3NdPVwicGFuZWxDbGFzc1wiIFtmb3JtQ29udHJvbE5hbWVdPVwiY29uZmlnLmtleVwiXG4gICAgICAgIChvcGVuZWRDaGFuZ2UpPVwib25TZWxlY3RPcGVuZWRDaGFuZ2UoJGV2ZW50LCBzZWxlY3RSZWYpXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQsIHNlbGVjdFJlZilcIj5cblxuICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cImNvbmZpZy5zZWFyY2hhYmxlXCIgY2xhc3M9XCJ0cy1zZWxlY3Qtc2VhcmNoXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwidHMtc2VsZWN0LXNlYXJjaC1pbnB1dCBjcWEtdGV4dC1ibGFjay0xMDBcIiB0eXBlPVwidGV4dFwiIFt2YWx1ZV09XCJzZWFyY2hUZXh0QnlLZXlbY29uZmlnLmtleV0gfHwgJydcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChpbnB1dCk9XCJvblNlYXJjaChjb25maWcua2V5LCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIC8+XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgXG4gICAgICAgIDxtYXQtb3B0aW9uIFtuZ0NsYXNzXT1cInsnY2hlY2ttYXJrJzogY29uZmlnLm9wdGlvblN0eWxlID09PSAnY2hlY2ttYXJrJywnY2hlY2tib3gnOiBjb25maWcub3B0aW9uU3R5bGUgIT09ICdjaGVja21hcmsnLCdtYXQtc2VsZWN0ZWQnOiBhbGxTZWxlY3RlZH1cIiBbY2xhc3NdPVwiY29uZmlnLm9wdGlvblN0eWxlID09ICdjaGVja21hcmsnID8gJ2NoZWNrbWFyaycgOiAnY2hlY2tib3gnXCIgKm5nSWY9XCJpc011bHRpcGxlICYmIGNvbmZpZy5zaG93U2VsZWN0QWxsXCIgW3ZhbHVlXT1cIlNFTEVDVF9BTExfVkFMVUVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlQ2hlY2tib3hTdHlsZTsgZWxzZSBzZWxlY3RBbGxEZWZhdWx0VHBsXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdy00IGNxYS1oLTQgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXJvdW5kZWQtWzRweF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRDFENURCXSBjcWEtbXItMiBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtYm9yZGVyLXNvbGlkXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJhbGxTZWxlY3RlZCA/IHsnYmFja2dyb3VuZC1jb2xvcic6JyM0RjQ2RTUnLCdib3JkZXItY29sb3InOicjNEY0NkU1J30gOiB7fVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJhbGxTZWxlY3RlZFwiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgM0w0LjUgOC41TDIgNlwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW1pbi13LTBcIj57eyBjb25maWcuc2VsZWN0QWxsTGFiZWwgfHwgJ0FsbCcgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzZWxlY3RBbGxEZWZhdWx0VHBsPlxuICAgICAgICAgICAge3sgY29uZmlnLnNlbGVjdEFsbExhYmVsIHx8ICdBbGwnIH19XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuXG4gICAgICAgIDxtYXQtb3B0aW9uIFtjbGFzc109XCJjb25maWcub3B0aW9uU3R5bGUgPT0gJ2NoZWNrbWFyaycgPyAnY2hlY2ttYXJrJyA6ICdjaGVja2JveCdcIiAqbmdGb3I9XCJsZXQgb3B0IG9mIGZpbHRlcmVkT3B0aW9ucyhjb25maWcpXCIgW3ZhbHVlXT1cIm9wdC5pZCA/PyBvcHQudmFsdWVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlQ2hlY2tib3hTdHlsZTsgZWxzZSBkZWZhdWx0T3B0aW9uVHBsXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdy00IGNxYS1oLTQgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXJvdW5kZWQtWzRweF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRDFENURCXSBjcWEtbXItMiBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtYm9yZGVyLXNvbGlkXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJpc09wdGlvblNlbGVjdGVkKG9wdCkgPyB7J2JhY2tncm91bmQtY29sb3InOicjNEY0NkU1JywnYm9yZGVyLWNvbG9yJzonIzRGNDZFNSd9IDoge31cIj5cbiAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNPcHRpb25TZWxlY3RlZChvcHQpXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMCAzTDQuNSA4LjVMMiA2XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbWluLXctMFwiICpuZ0lmPVwiaGFzSGlnaGxpZ2h0aW5nXCIgW2lubmVySFRNTF09XCJoaWdobGlnaHRUZXh0KG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1taW4tdy0wXCIgKm5nSWY9XCIhaGFzSGlnaGxpZ2h0aW5nXCI+e3sgb3B0Lm5hbWUgPz8gb3B0LmxhYmVsID8/IG9wdC52YWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRPcHRpb25UcGw+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImhhc0hpZ2hsaWdodGluZ1wiIFtpbm5lckhUTUxdPVwiaGlnaGxpZ2h0VGV4dChvcHQubmFtZSA/PyBvcHQubGFiZWwgPz8gb3B0LnZhbHVlKVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWhhc0hpZ2hsaWdodGluZ1wiPnt7IG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUgfX08L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICBcbiAgICAgICAgPCEtLSBObyByZXN1bHRzIHN0YXRlIChvbmx5IHdoZW4gbm90IGxvYWRpbmcgYW5kIG5vIG9wdGlvbnMpIC0tPlxuICAgICAgICA8bWF0LW9wdGlvbiBkaXNhYmxlZCAqbmdJZj1cIiEoY29uZmlnPy5vcHRpb25zPy5sZW5ndGggfHwgMCkgJiYgIShjb25maWc/LmlzTG9hZGluZyB8fCBsb2FkaW5nTW9yZSlcIj5cbiAgICAgICAgICBObyByZXN1bHRzXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPCEtLSBJbmZpbml0ZSBzY3JvbGwgc2VudGluZWwgKHNlcnZlclNlYXJjaCBvciBleHBsaWNpdCBoYXNNb3JlKSAtLT5cbiAgICAgICAgPG1hdC1vcHRpb24gZGlzYWJsZWQgY2xhc3M9XCJsb2FkLW1vcmUtc2VudGluZWxcIiAqbmdJZj1cImNvbmZpZz8uaGFzTW9yZVwiPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwibG9hZGluZ01vcmUgfHwgY29uZmlnPy5pc0xvYWRpbmdcIj5Mb2FkaW5nLi4uPC9zcGFuPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWxvYWRpbmdNb3JlICYmICFjb25maWc/LmlzTG9hZGluZ1wiPlNjcm9sbCB0byBsb2FkIG1vcmXigKY8L3NwYW4+XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICA8IS0tIElubGluZSBzcGlubmVyIHNob3duIHdoZW4gbG9hZGluZyBtb3JlIChpbmZpbml0ZSBzY3JvbGwpIG9yIHdoZW4gY29uZmlnLmlzTG9hZGluZyBpcyB0cnVlIC0tPlxuICAgICAgICA8c3ZnICpuZ0lmPVwibG9hZGluZ01vcmUgfHwgY29uZmlnPy5pc0xvYWRpbmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDUwIDUwXCIgYXJpYS1sYWJlbD1cImxvYWRpbmdcIlxuICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8Y2lyY2xlIGN4PVwiMjVcIiBjeT1cIjI1XCIgcj1cIjIwXCIgc3Ryb2tlPVwiI0U1RTdFQlwiIHN0cm9rZS13aWR0aD1cIjZcIiBmaWxsPVwibm9uZVwiLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTQ1IDI1YTIwIDIwIDAgMCAwLTIwLTIwXCIgc3Ryb2tlPVwiIzRGNDZFNVwiIHN0cm9rZS13aWR0aD1cIjZcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj5cbiAgICAgICAgICAgIDxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9XCJ0cmFuc2Zvcm1cIiB0eXBlPVwicm90YXRlXCIgZnJvbT1cIjAgMjUgMjVcIiB0bz1cIjM2MCAyNSAyNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXI9XCIwLjhzXCIgcmVwZWF0Q291bnQ9XCJpbmRlZmluaXRlXCIvPlxuICAgICAgICAgIDwvcGF0aD5cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiMwQTBBMEFcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj4iXX0=
@@ -2009,6 +2009,55 @@ class DynamicSelectFieldComponent {
2009
2009
  }
2010
2010
  catch (_c) { }
2011
2011
  }
2012
+ /**
2013
+ * Highlights text based on the configured highlightPattern.
2014
+ * Returns HTML string with highlighted portions wrapped in <span class="highlight">.
2015
+ */
2016
+ highlightText(text) {
2017
+ var _a;
2018
+ if (!text || !((_a = this.config) === null || _a === void 0 ? void 0 : _a.highlightPattern)) {
2019
+ return this.escapeHtml(text);
2020
+ }
2021
+ const pattern = this.config.highlightPattern;
2022
+ // If it's a function, use it directly
2023
+ if (typeof pattern === 'function') {
2024
+ return pattern(text);
2025
+ }
2026
+ // Convert string pattern to RegExp if needed
2027
+ let regex;
2028
+ if (typeof pattern === 'string') {
2029
+ try {
2030
+ regex = new RegExp(pattern, 'gi');
2031
+ }
2032
+ catch (e) {
2033
+ console.warn('Invalid highlight pattern:', pattern);
2034
+ return this.escapeHtml(text);
2035
+ }
2036
+ }
2037
+ else {
2038
+ regex = pattern;
2039
+ }
2040
+ // Escape HTML first, then apply highlighting
2041
+ const escaped = this.escapeHtml(text);
2042
+ return escaped.replace(regex, (match) => `<span class="cqa-text-primary">${match}</span>`);
2043
+ }
2044
+ /**
2045
+ * Escapes HTML special characters to prevent XSS.
2046
+ */
2047
+ escapeHtml(text) {
2048
+ if (!text)
2049
+ return '';
2050
+ const div = document.createElement('div');
2051
+ div.textContent = text;
2052
+ return div.innerHTML;
2053
+ }
2054
+ /**
2055
+ * Checks if highlighting is enabled for this component.
2056
+ */
2057
+ get hasHighlighting() {
2058
+ var _a;
2059
+ return !!((_a = this.config) === null || _a === void 0 ? void 0 : _a.highlightPattern);
2060
+ }
2012
2061
  setupLoadMoreObserver() {
2013
2062
  var _a;
2014
2063
  // Only if consumer indicates more data is available
@@ -2053,10 +2102,10 @@ class DynamicSelectFieldComponent {
2053
2102
  }
2054
2103
  }
2055
2104
  DynamicSelectFieldComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicSelectFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2056
- DynamicSelectFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: { form: "form", config: "config" }, outputs: { selectionChange: "selectionChange", selectClick: "selectClick", searchChange: "searchChange", loadMore: "loadMore" }, host: { listeners: { "document:click": "handleDocumentClick($event)" } }, viewQueries: [{ propertyName: "selectRef", first: true, predicate: ["selectRef"], descendants: true }, { propertyName: "hostEl", first: true, predicate: ["host"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\">\n <ng-container [formGroup]=\"form\">\n <label *ngIf=\"config.label\"\n class=\"form-label cqa-text-[#374151] cqa-text-[14px] cqa-font-medium cqa-block cqa-leading-[1.4] cqa-mb-2\">{{\n config.label }}</label>\n <mat-form-field #host class=\"mat-select-custom cqa-w-full\" appearance=\"fill\">\n <mat-select #selectRef=\"matSelect\" [placeholder]=\"displayPlaceholder\" [disabled]=\"isDisabled\" [multiple]=\"isMultiple\"\n disableOptionCentering [panelClass]=\"panelClass\" [formControlName]=\"config.key\"\n (openedChange)=\"onSelectOpenedChange($event, selectRef)\" (selectionChange)=\"onSelectionChange($event, selectRef)\">\n\n <mat-option *ngIf=\"config.searchable\" class=\"ts-select-search\" disabled>\n <input class=\"ts-select-search-input cqa-text-black-100\" type=\"text\" [value]=\"searchTextByKey[config.key] || ''\"\n (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\" (input)=\"onSearch(config.key, $any($event.target).value)\"\n placeholder=\"Search...\" />\n </mat-option>\n \n <mat-option [ngClass]=\"{'checkmark': config.optionStyle === 'checkmark','checkbox': config.optionStyle !== 'checkmark','mat-selected': allSelected}\" [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngIf=\"isMultiple && config.showSelectAll\" [value]=\"SELECT_ALL_VALUE\">\n <ng-container *ngIf=\"useCheckboxStyle; else selectAllDefaultTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"allSelected ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"allSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\">{{ config.selectAllLabel || 'All' }}</span>\n </span>\n </ng-container>\n <ng-template #selectAllDefaultTpl>\n {{ config.selectAllLabel || 'All' }}\n </ng-template>\n </mat-option>\n\n <mat-option [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngFor=\"let opt of filteredOptions(config)\" [value]=\"opt.id ?? opt.value\">\n <ng-container *ngIf=\"useCheckboxStyle; else defaultOptionTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\">{{ opt.name ?? opt.label ?? opt.value }}</span>\n </span>\n </ng-container>\n <ng-template #defaultOptionTpl>\n {{ opt.name ?? opt.label ?? opt.value }}\n </ng-template>\n </mat-option>\n \n <!-- No results state (only when not loading and no options) -->\n <mat-option disabled *ngIf=\"!(config?.options?.length || 0) && !(config?.isLoading || loadingMore)\">\n No results\n </mat-option>\n <!-- Infinite scroll sentinel (serverSearch or explicit hasMore) -->\n <mat-option disabled class=\"load-more-sentinel\" *ngIf=\"config?.hasMore\">\n <span *ngIf=\"loadingMore || config?.isLoading\">Loading...</span>\n <span *ngIf=\"!loadingMore && !config?.isLoading\">Scroll to load more\u2026</span>\n </mat-option>\n </mat-select>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Inline spinner shown when loading more (infinite scroll) or when config.isLoading is true -->\n <svg *ngIf=\"loadingMore || config?.isLoading\" width=\"16\" height=\"16\" viewBox=\"0 0 50 50\" aria-label=\"loading\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"25\" cy=\"25\" r=\"20\" stroke=\"#E5E7EB\" stroke-width=\"6\" fill=\"none\"/>\n <path d=\"M45 25a20 20 0 0 0-20-20\" stroke=\"#4F46E5\" stroke-width=\"6\" fill=\"none\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 25 25\" to=\"360 25 25\"\n dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </mat-form-field>\n </ng-container>\n</div>", components: [{ type: i1$4.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i2$2.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3$2.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i2$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2105
+ DynamicSelectFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: { form: "form", config: "config" }, outputs: { selectionChange: "selectionChange", selectClick: "selectClick", searchChange: "searchChange", loadMore: "loadMore" }, host: { listeners: { "document:click": "handleDocumentClick($event)" } }, viewQueries: [{ propertyName: "selectRef", first: true, predicate: ["selectRef"], descendants: true }, { propertyName: "hostEl", first: true, predicate: ["host"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\">\n <ng-container [formGroup]=\"form\">\n <label *ngIf=\"config.label\"\n class=\"form-label cqa-text-[#374151] cqa-text-[14px] cqa-font-medium cqa-block cqa-leading-[1.4] cqa-mb-2\">{{\n config.label }}</label>\n <mat-form-field #host class=\"mat-select-custom cqa-w-full\" appearance=\"fill\">\n <mat-select #selectRef=\"matSelect\" [placeholder]=\"displayPlaceholder\" [disabled]=\"isDisabled\" [multiple]=\"isMultiple\"\n disableOptionCentering [panelClass]=\"panelClass\" [formControlName]=\"config.key\"\n (openedChange)=\"onSelectOpenedChange($event, selectRef)\" (selectionChange)=\"onSelectionChange($event, selectRef)\">\n\n <mat-option *ngIf=\"config.searchable\" class=\"ts-select-search\" disabled>\n <input class=\"ts-select-search-input cqa-text-black-100\" type=\"text\" [value]=\"searchTextByKey[config.key] || ''\"\n (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\" (input)=\"onSearch(config.key, $any($event.target).value)\"\n placeholder=\"Search...\" />\n </mat-option>\n \n <mat-option [ngClass]=\"{'checkmark': config.optionStyle === 'checkmark','checkbox': config.optionStyle !== 'checkmark','mat-selected': allSelected}\" [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngIf=\"isMultiple && config.showSelectAll\" [value]=\"SELECT_ALL_VALUE\">\n <ng-container *ngIf=\"useCheckboxStyle; else selectAllDefaultTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"allSelected ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"allSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\">{{ config.selectAllLabel || 'All' }}</span>\n </span>\n </ng-container>\n <ng-template #selectAllDefaultTpl>\n {{ config.selectAllLabel || 'All' }}\n </ng-template>\n </mat-option>\n\n <mat-option [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngFor=\"let opt of filteredOptions(config)\" [value]=\"opt.id ?? opt.value\">\n <ng-container *ngIf=\"useCheckboxStyle; else defaultOptionTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\" *ngIf=\"hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span class=\"cqa-min-w-0\" *ngIf=\"!hasHighlighting\">{{ opt.name ?? opt.label ?? opt.value }}</span>\n </span>\n </ng-container>\n <ng-template #defaultOptionTpl>\n <span *ngIf=\"hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span *ngIf=\"!hasHighlighting\">{{ opt.name ?? opt.label ?? opt.value }}</span>\n </ng-template>\n </mat-option>\n \n <!-- No results state (only when not loading and no options) -->\n <mat-option disabled *ngIf=\"!(config?.options?.length || 0) && !(config?.isLoading || loadingMore)\">\n No results\n </mat-option>\n <!-- Infinite scroll sentinel (serverSearch or explicit hasMore) -->\n <mat-option disabled class=\"load-more-sentinel\" *ngIf=\"config?.hasMore\">\n <span *ngIf=\"loadingMore || config?.isLoading\">Loading...</span>\n <span *ngIf=\"!loadingMore && !config?.isLoading\">Scroll to load more\u2026</span>\n </mat-option>\n </mat-select>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Inline spinner shown when loading more (infinite scroll) or when config.isLoading is true -->\n <svg *ngIf=\"loadingMore || config?.isLoading\" width=\"16\" height=\"16\" viewBox=\"0 0 50 50\" aria-label=\"loading\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"25\" cy=\"25\" r=\"20\" stroke=\"#E5E7EB\" stroke-width=\"6\" fill=\"none\"/>\n <path d=\"M45 25a20 20 0 0 0-20-20\" stroke=\"#4F46E5\" stroke-width=\"6\" fill=\"none\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 25 25\" to=\"360 25 25\"\n dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </mat-form-field>\n </ng-container>\n</div>", components: [{ type: i1$4.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i2$2.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3$2.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i2$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2057
2106
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicSelectFieldComponent, decorators: [{
2058
2107
  type: Component,
2059
- args: [{ selector: 'cqa-dynamic-select', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-ui-root\">\n <ng-container [formGroup]=\"form\">\n <label *ngIf=\"config.label\"\n class=\"form-label cqa-text-[#374151] cqa-text-[14px] cqa-font-medium cqa-block cqa-leading-[1.4] cqa-mb-2\">{{\n config.label }}</label>\n <mat-form-field #host class=\"mat-select-custom cqa-w-full\" appearance=\"fill\">\n <mat-select #selectRef=\"matSelect\" [placeholder]=\"displayPlaceholder\" [disabled]=\"isDisabled\" [multiple]=\"isMultiple\"\n disableOptionCentering [panelClass]=\"panelClass\" [formControlName]=\"config.key\"\n (openedChange)=\"onSelectOpenedChange($event, selectRef)\" (selectionChange)=\"onSelectionChange($event, selectRef)\">\n\n <mat-option *ngIf=\"config.searchable\" class=\"ts-select-search\" disabled>\n <input class=\"ts-select-search-input cqa-text-black-100\" type=\"text\" [value]=\"searchTextByKey[config.key] || ''\"\n (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\" (input)=\"onSearch(config.key, $any($event.target).value)\"\n placeholder=\"Search...\" />\n </mat-option>\n \n <mat-option [ngClass]=\"{'checkmark': config.optionStyle === 'checkmark','checkbox': config.optionStyle !== 'checkmark','mat-selected': allSelected}\" [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngIf=\"isMultiple && config.showSelectAll\" [value]=\"SELECT_ALL_VALUE\">\n <ng-container *ngIf=\"useCheckboxStyle; else selectAllDefaultTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"allSelected ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"allSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\">{{ config.selectAllLabel || 'All' }}</span>\n </span>\n </ng-container>\n <ng-template #selectAllDefaultTpl>\n {{ config.selectAllLabel || 'All' }}\n </ng-template>\n </mat-option>\n\n <mat-option [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngFor=\"let opt of filteredOptions(config)\" [value]=\"opt.id ?? opt.value\">\n <ng-container *ngIf=\"useCheckboxStyle; else defaultOptionTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\">{{ opt.name ?? opt.label ?? opt.value }}</span>\n </span>\n </ng-container>\n <ng-template #defaultOptionTpl>\n {{ opt.name ?? opt.label ?? opt.value }}\n </ng-template>\n </mat-option>\n \n <!-- No results state (only when not loading and no options) -->\n <mat-option disabled *ngIf=\"!(config?.options?.length || 0) && !(config?.isLoading || loadingMore)\">\n No results\n </mat-option>\n <!-- Infinite scroll sentinel (serverSearch or explicit hasMore) -->\n <mat-option disabled class=\"load-more-sentinel\" *ngIf=\"config?.hasMore\">\n <span *ngIf=\"loadingMore || config?.isLoading\">Loading...</span>\n <span *ngIf=\"!loadingMore && !config?.isLoading\">Scroll to load more\u2026</span>\n </mat-option>\n </mat-select>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Inline spinner shown when loading more (infinite scroll) or when config.isLoading is true -->\n <svg *ngIf=\"loadingMore || config?.isLoading\" width=\"16\" height=\"16\" viewBox=\"0 0 50 50\" aria-label=\"loading\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"25\" cy=\"25\" r=\"20\" stroke=\"#E5E7EB\" stroke-width=\"6\" fill=\"none\"/>\n <path d=\"M45 25a20 20 0 0 0-20-20\" stroke=\"#4F46E5\" stroke-width=\"6\" fill=\"none\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 25 25\" to=\"360 25 25\"\n dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </mat-form-field>\n </ng-container>\n</div>", styles: [] }]
2108
+ args: [{ selector: 'cqa-dynamic-select', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-ui-root\">\n <ng-container [formGroup]=\"form\">\n <label *ngIf=\"config.label\"\n class=\"form-label cqa-text-[#374151] cqa-text-[14px] cqa-font-medium cqa-block cqa-leading-[1.4] cqa-mb-2\">{{\n config.label }}</label>\n <mat-form-field #host class=\"mat-select-custom cqa-w-full\" appearance=\"fill\">\n <mat-select #selectRef=\"matSelect\" [placeholder]=\"displayPlaceholder\" [disabled]=\"isDisabled\" [multiple]=\"isMultiple\"\n disableOptionCentering [panelClass]=\"panelClass\" [formControlName]=\"config.key\"\n (openedChange)=\"onSelectOpenedChange($event, selectRef)\" (selectionChange)=\"onSelectionChange($event, selectRef)\">\n\n <mat-option *ngIf=\"config.searchable\" class=\"ts-select-search\" disabled>\n <input class=\"ts-select-search-input cqa-text-black-100\" type=\"text\" [value]=\"searchTextByKey[config.key] || ''\"\n (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\" (input)=\"onSearch(config.key, $any($event.target).value)\"\n placeholder=\"Search...\" />\n </mat-option>\n \n <mat-option [ngClass]=\"{'checkmark': config.optionStyle === 'checkmark','checkbox': config.optionStyle !== 'checkmark','mat-selected': allSelected}\" [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngIf=\"isMultiple && config.showSelectAll\" [value]=\"SELECT_ALL_VALUE\">\n <ng-container *ngIf=\"useCheckboxStyle; else selectAllDefaultTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"allSelected ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"allSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\">{{ config.selectAllLabel || 'All' }}</span>\n </span>\n </ng-container>\n <ng-template #selectAllDefaultTpl>\n {{ config.selectAllLabel || 'All' }}\n </ng-template>\n </mat-option>\n\n <mat-option [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngFor=\"let opt of filteredOptions(config)\" [value]=\"opt.id ?? opt.value\">\n <ng-container *ngIf=\"useCheckboxStyle; else defaultOptionTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\" *ngIf=\"hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span class=\"cqa-min-w-0\" *ngIf=\"!hasHighlighting\">{{ opt.name ?? opt.label ?? opt.value }}</span>\n </span>\n </ng-container>\n <ng-template #defaultOptionTpl>\n <span *ngIf=\"hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span *ngIf=\"!hasHighlighting\">{{ opt.name ?? opt.label ?? opt.value }}</span>\n </ng-template>\n </mat-option>\n \n <!-- No results state (only when not loading and no options) -->\n <mat-option disabled *ngIf=\"!(config?.options?.length || 0) && !(config?.isLoading || loadingMore)\">\n No results\n </mat-option>\n <!-- Infinite scroll sentinel (serverSearch or explicit hasMore) -->\n <mat-option disabled class=\"load-more-sentinel\" *ngIf=\"config?.hasMore\">\n <span *ngIf=\"loadingMore || config?.isLoading\">Loading...</span>\n <span *ngIf=\"!loadingMore && !config?.isLoading\">Scroll to load more\u2026</span>\n </mat-option>\n </mat-select>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Inline spinner shown when loading more (infinite scroll) or when config.isLoading is true -->\n <svg *ngIf=\"loadingMore || config?.isLoading\" width=\"16\" height=\"16\" viewBox=\"0 0 50 50\" aria-label=\"loading\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"25\" cy=\"25\" r=\"20\" stroke=\"#E5E7EB\" stroke-width=\"6\" fill=\"none\"/>\n <path d=\"M45 25a20 20 0 0 0-20-20\" stroke=\"#4F46E5\" stroke-width=\"6\" fill=\"none\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 25 25\" to=\"360 25 25\"\n dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </mat-form-field>\n </ng-container>\n</div>" }]
2060
2109
  }], propDecorators: { form: [{
2061
2110
  type: Input
2062
2111
  }], config: [{