@unifylib/ui-lib 1.1.63 → 1.1.67

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/cli/generators/dashboard.js +147 -0
  2. package/cli/generators/form-screen.js +95 -0
  3. package/cli/generators/line-editor.js +110 -0
  4. package/cli/generators/permission-matrix.js +115 -0
  5. package/cli/generators/section-form.js +103 -0
  6. package/cli/generators/table-screen.js +181 -0
  7. package/cli/index.js +185 -0
  8. package/cli/utils.js +228 -0
  9. package/esm2022/lib/base-model/field-info.mjs +2 -2
  10. package/esm2022/lib/components/action-comment/action-comment.component.mjs +6 -5
  11. package/esm2022/lib/components/advanced-filter/filter-builder/filter-builder.component.mjs +8 -3
  12. package/esm2022/lib/components/audit-log-list/audit-log.component.mjs +3 -3
  13. package/esm2022/lib/components/auto-complete/auto-complete.component.mjs +11 -3
  14. package/esm2022/lib/components/base-form-canvas/base-form-canvas.component.mjs +54 -4
  15. package/esm2022/lib/components/base-table/base-table.component.mjs +73 -9
  16. package/esm2022/lib/components/button-actions/button-actions.component.mjs +3 -3
  17. package/esm2022/lib/components/editable-base-table/editable-base-table.component.mjs +3 -3
  18. package/esm2022/lib/components/equation-builder/equation-builder.component.mjs +9 -4
  19. package/esm2022/lib/components/multi-auto-complete/multi-auto-complete.component.mjs +20 -4
  20. package/esm2022/lib/components/paginator/paginator.component.mjs +26 -6
  21. package/esm2022/lib/components/report-details-dialog/report-details-dialog.component.mjs +3 -3
  22. package/esm2022/lib/components/report-form/report-form.component.mjs +3 -3
  23. package/esm2022/lib/components/search-bar/search-bar.component.mjs +5 -4
  24. package/esm2022/lib/components/section-form-canvas/section-form-canvas.component.mjs +3 -3
  25. package/esm2022/lib/components/shared/attachment-uploader/attachment-uploader.component.mjs +5 -3
  26. package/esm2022/lib/components/snackbar-static/snackbar-static.component.mjs +3 -3
  27. package/esm2022/lib/components/title-bar/title-bar.component.mjs +3 -3
  28. package/fesm2022/iq-ui-lib.mjs +238 -73
  29. package/fesm2022/iq-ui-lib.mjs.map +1 -1
  30. package/fesm2022/unifylib-ui-lib.mjs +238 -73
  31. package/fesm2022/unifylib-ui-lib.mjs.map +1 -1
  32. package/lib/components/advanced-filter/filter-builder/filter-builder.component.d.ts +2 -0
  33. package/lib/components/auto-complete/auto-complete.component.d.ts +2 -1
  34. package/lib/components/base-form-canvas/base-form-canvas.component.d.ts +5 -0
  35. package/lib/components/base-table/base-table.component.d.ts +10 -1
  36. package/lib/components/multi-auto-complete/multi-auto-complete.component.d.ts +3 -1
  37. package/lib/components/paginator/paginator.component.d.ts +6 -1
  38. package/lib/components/shared/attachment-uploader/attachment-uploader.component.d.ts +2 -1
  39. package/package.json +1 -1
@@ -414,7 +414,7 @@ export class EditableBaseTableComponent extends BaseUtils {
414
414
  // deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS],
415
415
  // },
416
416
  // { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS },
417
- ], viewQueries: [{ propertyName: "uploaderComponent", first: true, predicate: ["uploader"], descendants: true }, { propertyName: "fileUpload", first: true, predicate: ["fileUpload"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"baseTable flex-column\">\r\n <div class=\"left-align\">\r\n <app-attachment-uploader #uploader\r\n *ngIf=\"isBulkItemsSupported\"\r\n (fileSelected)=\"handleFileUpload($event)\">\r\n </app-attachment-uploader>\r\n </div>\r\n\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-half flex-column align-center-start\">\r\n <app-title-bar [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\r\n [titleMode]=\"''\"\r\n [newAction]=\"false\"\r\n [showExtractButton]=\"!pageInfo.hideExtractButton\">\r\n </app-title-bar>\r\n <span class=\"font-small\">{{ 'totalCountItem' | translate }} : {{ this.totalElements }}</span>\r\n </div>\r\n <div class=\"flex-half flex-column align-start-end\">\r\n <mat-chip-listbox #box aria-label=\"Color selection\" [multiple]=\"false\" [value]=\"isPending ? 'PENDING' : 'COMPLETED'\" (click)=\"$event.stopPropagation()\" (change)=\"onChipSelectionChange($event, box)\" *ngIf=\"pageInfo.draftSupported\">\r\n <mat-chip-option [selected]=\"!isPending\" [color]=\"'accent'\" value=\"COMPLETED\" (click)=\"$event.stopPropagation()\">\r\n {{ 'finished' | translate }}\r\n </mat-chip-option>\r\n <mat-chip-option [selected]=\"isPending\" [color]=\"'accent'\" value=\"PENDING\" (click)=\"$event.stopPropagation()\">\r\n {{ 'todo' | translate }}\r\n </mat-chip-option>\r\n </mat-chip-listbox>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"showSearch()\">\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-80 flex-column align-start-end\">\r\n <app-base-form-canvas class=\"flex-fill\"\r\n [pageInfo]=\"pageInfo\"\r\n [fields]=\"searchFormFields\"\r\n [editable]=\"true\"\r\n (formUpdated)=\"updateSearchForm($event)\">\r\n </app-base-form-canvas>\r\n </div>\r\n <div class=\"flex-15 flex-column align-start-end\">\r\n <div class=\"flex-row align-center-center gap-8 full-width\">\r\n <button mat-button color=\"primary\" type=\"button\" (click)=\"doSearch()\" id=\"editable-search-btn\">\r\n <mat-icon>search</mat-icon>\r\n {{ 'search' | translate }}\r\n </button>\r\n <button mat-button color=\"primary\" type=\"button\" (click)=\"clearSearch()\" id=\"editable-clear-search-btn\">\r\n <mat-icon>clear</mat-icon>\r\n {{ 'clear' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"flex-row full-width baseTable__detailsColumn\">\r\n <div class=\"flex-full\">\r\n <ng-container *ngIf=\"isLoaded\">\r\n <div class=\"flex-row mainTable gap-0 align-start-start\">\r\n <form [formGroup]=\"formParam\" class=\"flex-fill\">\r\n <table [dataSource]=\"dataFormArray.controls\" class=\"flex-fill\" mat-table matSort>\r\n <ng-container *ngFor=\"let column of this.fields; let i = index\">\r\n <ng-container matColumnDef=\"{{column.property}}\">\r\n <ng-container [ngSwitch]=\"column.type\">\r\n <ng-container *ngSwitchCase=\"'equation-builder'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\" mat-cell>\r\n <lib-equation-builder\r\n [form]=\"element\"\r\n [field]=\"column\"\r\n [readOnly]=\"column.readonly\"\r\n [isPending]=\"isPending\"\r\n (valueChanged)=\"handleEquationChange($event, element, column)\">\r\n </lib-equation-builder>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'lookup'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <app-auto-complete\r\n [form]=\"element\"\r\n [field]=\"column\"\r\n [defaultValue]=\"element.get(column.property)?.value\"\r\n (selectedValue)=\"patchLookupValue($event, column.property)\">\r\n </app-auto-complete>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'list'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}</th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-label>{{element}}</mat-label>\r\n <mat-select\r\n formControlName=\"{{column.property}}\"\r\n [attr.aria-label]=\"column.label! | translate\"\r\n [multiple]=\"false\"\r\n [(value)]=\"element[column.property]\">\r\n <ng-container>\r\n <mat-option\r\n *ngFor=\"let item of column.listOptions\"\r\n [value]=\"item\">\r\n {{ getOptionValue(item) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'stateType'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ 'action' | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n <div class=\"flex-column\">\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-third flex-column align-center-center\">\r\n <button mat-button class=\"btn-none-background-primary\"\r\n color=\"primary\"\r\n [disabled]=\"disabledSaveButton(element)\"\r\n (click)=\"fieldButtonEvent(column,element,SAVE)\"\r\n [attr.id]=\"'editable-save-' + (element.value?.id || '')\">\r\n {{ getPositiveWfActionKey(element.value.stateType) | translate }}\r\n </button>\r\n </div>\r\n <div class=\"flex-third flex-column align-center-center\">\r\n <button *ngIf=\"isPending\" mat-button class=\"btn-none-background-primary\"\r\n color=\"accent\"\r\n (click)=\"fieldButtonEvent(column,element,REJECT)\"\r\n [attr.id]=\"'editable-reject-' + (element.value?.id || '')\">\r\n {{ getNegativeWfActionKey(element.value.stateType) | translate }}\r\n </button>\r\n </div>\r\n <div class=\"flex-third flex-column align-center-center\"></div>\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'year'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <mat-label>{{ labelKey(column) | translate }}</mat-label>\r\n <input matInput\r\n [disabled]=\"column.readonly\"\r\n [readonly]=\"column.readonly\"\r\n [matDatepicker]=\"picker\"\r\n [min]=\"minDate\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker startView=\"multi-year\"\r\n (yearSelected)=\"setMonthAndYear($event, picker, element,column)\"\r\n panelClass=\"example-month-picker\"></mat-datepicker>\r\n\r\n </mat-form-field>\r\n <!-- <mat-form-field class=\"flex-auto\" appearance=\"outline\" fxFlexFill>-->\r\n <!-- <input matInput [formControl]=\"getField(element, column)\">-->\r\n <!-- </mat-form-field>-->\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <!-- Visually hidden label just to trigger the floating label and asterisk -->\r\n <mat-label>\r\n </mat-label>\r\n\r\n <input matInput\r\n type=\"number\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-checkbox\r\n style=\"padding-bottom: 14px; padding-top: 14px;\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\"\r\n [style.pointer-events]=\"column.readonly ? 'none' : 'auto'\"\r\n [style.opacity]=\"column.readonly ? 0.7 : 1\"\r\n (click)=\"column.readonly ? $event.preventDefault() : null\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <mat-label>\r\n {{ labelKey(column) | translate }}\r\n </mat-label>\r\n <input matInput\r\n type=\"text\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <input matInput\r\n [matDatepicker]=\"xpicker\"\r\n [min]=\"minDate\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [disabled]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"xpicker\"\r\n [disabled]=\"column.readonly\">\r\n </mat-datepicker-toggle>\r\n <mat-datepicker #xpicker></mat-datepicker>\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <input matInput\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [formControl]=\"getField(element, column)\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <tr *matHeaderRowDef=\"visibleColumns\" mat-header-row></tr>\r\n <tr (click)=\"onSelectItem(row)\" (auxclick)=\"openNewTab(row)\"\r\n *matRowDef=\"let row; columns: visibleColumns | paginate:config\"\r\n [attr.id]=\"'editable-row-' + (row?.value?.id || row?.value?.key || '')\"\r\n mat-row></tr>\r\n </table>\r\n </form>\r\n </div>\r\n\r\n <div *ngIf=\"noDataFound && !pageInfo.lazyLoadData\" class=\"flex-row dataNotFound\">\r\n <div class=\"flex-column flex-full\">\r\n <span class=\"dataNotFound__details\">\r\n <mat-icon class=\"dataNotFound__details__icon\">info</mat-icon>\r\n <span>{{ 'dataNotFound' | translate }}</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-row mainTable\" *ngIf=\"!selectedFileFromUploader\">\r\n <div>\r\n <button *ngIf=\"!isPending && pageInfo.hasAddButton\" mat-button color=\"primary\" type=\"button\"\r\n (click)=\"addNewItem()\" id=\"editable-add-item-btn\">\r\n <mat-icon>add_box</mat-icon>\r\n {{ translationKey | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-row flex-wrap align-center-center main-pagination\" *ngIf=\"totalElements > 0\">\r\n <div class=\"flex-column flex-full\">\r\n <app-paginator [currentPage]=\"pageIndex\" [totalItems]=\"totalElements\" [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"[5, 10, 25, 50]\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></app-paginator>\r\n </div>\r\n <div class=\"flex-column flex-full countItem hide-gt-xs\">\r\n <span class=\"countItem__totalElement\">{{ 'totalCountItem' | translate }} : {{ this.totalElements }}</span>\r\n </div>\r\n <div class=\"flex-column flex-2\"></div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"isBulkItemsSupported\" class=\"flex-row gap-10 align-start-start mainTable\">\r\n <div>\r\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"addBulkItems()\" [disabled]=\"shouldDisableBulkAdd()\" id=\"editable-bulk-add-btn\">\r\n <mat-icon>add_box</mat-icon>\r\n {{ 'addAll' | translate }}\r\n </button>\r\n </div>\r\n <div>\r\n <button mat-flat-button color=\"warn\" type=\"button\" [disabled]=\"!hasDataToClear()\" (click)=\"clearBulkItems()\" id=\"editable-bulk-clear-btn\">\r\n <mat-icon>delete</mat-icon>\r\n {{ 'clearAll' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".baseTable{padding:20px}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}.responsive-top-gap{margin-top:20px}@media (max-width: 959px){.responsive-top-gap{margin-top:1px}.baseTable{padding:20px;margin-inline:8px;width:max-content}}.flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column}.flex-half{flex:0 0 50%}.flex-80{flex:0 0 80%}.flex-15{flex:0 0 15%}.flex-2{flex:0 0 2%}.flex-full{flex:0 0 100%}.align-start-start{justify-content:flex-start;align-items:flex-start}.align-start-end{justify-content:flex-end;align-items:flex-start}.align-center-start{justify-content:flex-start;align-items:center}.align-center-center{justify-content:center;align-items:center}.align-end-start{justify-content:flex-start;align-items:flex-end}.align-end-end{justify-content:flex-end;align-items:flex-end}.gap-8{gap:8px}.gap-10{gap:10px}.gap-0{gap:0px}@media (max-width: 959px){.flex-column.lt-md{flex-direction:column}.flex-row.lt-md{flex-direction:row}.flex-full.lt-md{flex:0 0 100%}.align-center-center.lt-md{justify-content:center;align-items:center}}@media (max-width: 599px){.flex-hide.gt-xs{display:none!important}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i7.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "directive", type: MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: MatCellDef, selector: "[matCellDef]" }, { kind: "ngmodule", type: NgxPaginationModule }, { kind: "pipe", type: i9.PaginatePipe, name: "paginate" }, { kind: "component", type: MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "component", type: MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: AutoCompleteComponent, selector: "app-auto-complete", inputs: ["field", "form", "defaultValue", "readonly", "supportingAttributes"], outputs: ["selectedValue"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "component", type: TitleBarComponent, selector: "app-title-bar", inputs: ["pageTitle", "showExtractButton", "totalElements", "titleMode", "pageInfo", "subTitle", "statusDesc", "newAction", "extraButton", "showDetails", "showImport", "showButton", "extraData", "titleCorporateAdmin", "hideBackButton", "buttons", "buttonsDisplayMode", "draftSupported", "isPending", "onViewModeChange"], outputs: ["newActionClicked", "extraButtonClicked", "extractReport", "buttonClicked", "viewModeChanged"] }, { kind: "component", type: PaginatorComponent, selector: "app-paginator", inputs: ["currentPage", "totalItems", "pageSize", "pageSizeOptions", "mobileLoadMoreIncrement", "displayedItems"], outputs: ["pageChange", "pageSizeChange", "loadMore"] }, { kind: "component", type: AttachmentUploaderComponent, selector: "app-attachment-uploader", inputs: ["acceptedTypes"], outputs: ["fileSelected"] }, { kind: "component", type: EquationBuilderComponent, selector: "lib-equation-builder", inputs: ["form", "field", "isPending", "readOnly"], outputs: ["valueChanged"] }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: BaseFormCanvasComponent, selector: "app-base-form-canvas", inputs: ["pageInfo", "currency", "fields", "errors", "workflowEditableFields", "isWorkflowEditableManaged", "supportingAttributes", "editable", "emitOnValueChanges", "filterResetNonce", "item", "equationSuggestedFields", "currentEquationValue"], outputs: ["attachmentEmitter", "actionEmitter", "formUpdated", "hyperTextEvent", "currentEquationValueChange"] }, { kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }], animations: [] }); }
417
+ ], viewQueries: [{ propertyName: "uploaderComponent", first: true, predicate: ["uploader"], descendants: true }, { propertyName: "fileUpload", first: true, predicate: ["fileUpload"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"baseTable flex-column\">\r\n <div class=\"left-align\">\r\n <app-attachment-uploader #uploader\r\n *ngIf=\"isBulkItemsSupported\"\r\n (fileSelected)=\"handleFileUpload($event)\">\r\n </app-attachment-uploader>\r\n </div>\r\n\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-half flex-column align-center-start\">\r\n <app-title-bar [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\r\n [titleMode]=\"''\"\r\n [newAction]=\"false\"\r\n [showExtractButton]=\"!pageInfo.hideExtractButton\">\r\n </app-title-bar>\r\n <span class=\"font-small\">{{ 'totalCountItem' | translate }} : {{ this.totalElements }}</span>\r\n </div>\r\n <div class=\"flex-half flex-column align-start-end\">\r\n <mat-chip-listbox #box [attr.aria-label]=\"'BASE_TABLE.documentStatus' | translate\" [multiple]=\"false\" [value]=\"isPending ? 'PENDING' : 'COMPLETED'\" (click)=\"$event.stopPropagation()\" (change)=\"onChipSelectionChange($event, box)\" *ngIf=\"pageInfo.draftSupported\">\r\n <mat-chip-option [selected]=\"!isPending\" [color]=\"'accent'\" value=\"COMPLETED\" (click)=\"$event.stopPropagation()\">\r\n {{ 'finished' | translate }}\r\n </mat-chip-option>\r\n <mat-chip-option [selected]=\"isPending\" [color]=\"'accent'\" value=\"PENDING\" (click)=\"$event.stopPropagation()\">\r\n {{ 'todo' | translate }}\r\n </mat-chip-option>\r\n </mat-chip-listbox>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"showSearch()\">\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-80 flex-column align-start-end\">\r\n <app-base-form-canvas class=\"flex-fill\"\r\n [pageInfo]=\"pageInfo\"\r\n [fields]=\"searchFormFields\"\r\n [editable]=\"true\"\r\n (formUpdated)=\"updateSearchForm($event)\">\r\n </app-base-form-canvas>\r\n </div>\r\n <div class=\"flex-15 flex-column align-start-end\">\r\n <div class=\"flex-row align-center-center gap-8 full-width\">\r\n <button mat-button color=\"primary\" type=\"button\" (click)=\"doSearch()\" id=\"editable-search-btn\">\r\n <mat-icon>search</mat-icon>\r\n {{ 'search' | translate }}\r\n </button>\r\n <button mat-button color=\"primary\" type=\"button\" (click)=\"clearSearch()\" id=\"editable-clear-search-btn\">\r\n <mat-icon>clear</mat-icon>\r\n {{ 'clear' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"flex-row full-width baseTable__detailsColumn\">\r\n <div class=\"flex-full\">\r\n <ng-container *ngIf=\"isLoaded\">\r\n <div class=\"flex-row mainTable gap-0 align-start-start\">\r\n <form [formGroup]=\"formParam\" class=\"flex-fill\">\r\n <table [dataSource]=\"dataFormArray.controls\" class=\"flex-fill\" mat-table matSort>\r\n <ng-container *ngFor=\"let column of this.fields; let i = index\">\r\n <ng-container matColumnDef=\"{{column.property}}\">\r\n <ng-container [ngSwitch]=\"column.type\">\r\n <ng-container *ngSwitchCase=\"'equation-builder'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\" mat-cell>\r\n <lib-equation-builder\r\n [form]=\"element\"\r\n [field]=\"column\"\r\n [readOnly]=\"column.readonly\"\r\n [isPending]=\"isPending\"\r\n (valueChanged)=\"handleEquationChange($event, element, column)\">\r\n </lib-equation-builder>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'lookup'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <app-auto-complete\r\n [form]=\"element\"\r\n [field]=\"column\"\r\n [defaultValue]=\"element.get(column.property)?.value\"\r\n (selectedValue)=\"patchLookupValue($event, column.property)\">\r\n </app-auto-complete>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'list'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}</th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-label>{{element}}</mat-label>\r\n <mat-select\r\n formControlName=\"{{column.property}}\"\r\n [attr.aria-label]=\"column.label! | translate\"\r\n [multiple]=\"false\"\r\n [(value)]=\"element[column.property]\">\r\n <ng-container>\r\n <mat-option\r\n *ngFor=\"let item of column.listOptions\"\r\n [value]=\"item\">\r\n {{ getOptionValue(item) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'stateType'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ 'action' | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n <div class=\"flex-column\">\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-third flex-column align-center-center\">\r\n <button mat-button class=\"btn-none-background-primary\"\r\n color=\"primary\"\r\n [disabled]=\"disabledSaveButton(element)\"\r\n (click)=\"fieldButtonEvent(column,element,SAVE)\"\r\n [attr.id]=\"'editable-save-' + (element.value?.id || '')\">\r\n {{ getPositiveWfActionKey(element.value.stateType) | translate }}\r\n </button>\r\n </div>\r\n <div class=\"flex-third flex-column align-center-center\">\r\n <button *ngIf=\"isPending\" mat-button class=\"btn-none-background-primary\"\r\n color=\"accent\"\r\n (click)=\"fieldButtonEvent(column,element,REJECT)\"\r\n [attr.id]=\"'editable-reject-' + (element.value?.id || '')\">\r\n {{ getNegativeWfActionKey(element.value.stateType) | translate }}\r\n </button>\r\n </div>\r\n <div class=\"flex-third flex-column align-center-center\"></div>\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'year'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <mat-label>{{ labelKey(column) | translate }}</mat-label>\r\n <input matInput\r\n [disabled]=\"column.readonly\"\r\n [readonly]=\"column.readonly\"\r\n [matDatepicker]=\"picker\"\r\n [min]=\"minDate\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker startView=\"multi-year\"\r\n (yearSelected)=\"setMonthAndYear($event, picker, element,column)\"\r\n panelClass=\"example-month-picker\"></mat-datepicker>\r\n\r\n </mat-form-field>\r\n <!-- <mat-form-field class=\"flex-auto\" appearance=\"outline\" fxFlexFill>-->\r\n <!-- <input matInput [formControl]=\"getField(element, column)\">-->\r\n <!-- </mat-form-field>-->\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <!-- Visually hidden label just to trigger the floating label and asterisk -->\r\n <mat-label>\r\n </mat-label>\r\n\r\n <input matInput\r\n type=\"number\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-checkbox\r\n style=\"padding-bottom: 14px; padding-top: 14px;\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\"\r\n [style.pointer-events]=\"column.readonly ? 'none' : 'auto'\"\r\n [style.opacity]=\"column.readonly ? 0.7 : 1\"\r\n (click)=\"column.readonly ? $event.preventDefault() : null\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <mat-label>\r\n {{ labelKey(column) | translate }}\r\n </mat-label>\r\n <input matInput\r\n type=\"text\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <input matInput\r\n [matDatepicker]=\"xpicker\"\r\n [min]=\"minDate\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [disabled]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"xpicker\"\r\n [disabled]=\"column.readonly\">\r\n </mat-datepicker-toggle>\r\n <mat-datepicker #xpicker></mat-datepicker>\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <input matInput\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [formControl]=\"getField(element, column)\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <tr *matHeaderRowDef=\"visibleColumns\" mat-header-row></tr>\r\n <tr (click)=\"onSelectItem(row)\" (auxclick)=\"openNewTab(row)\"\r\n *matRowDef=\"let row; columns: visibleColumns | paginate:config\"\r\n [attr.id]=\"'editable-row-' + (row?.value?.id || row?.value?.key || '')\"\r\n mat-row></tr>\r\n </table>\r\n </form>\r\n </div>\r\n\r\n <div *ngIf=\"noDataFound && !pageInfo.lazyLoadData\" class=\"flex-row dataNotFound\">\r\n <div class=\"flex-column flex-full\">\r\n <span class=\"dataNotFound__details\">\r\n <mat-icon class=\"dataNotFound__details__icon\">info</mat-icon>\r\n <span>{{ 'dataNotFound' | translate }}</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-row mainTable\" *ngIf=\"!selectedFileFromUploader\">\r\n <div>\r\n <button *ngIf=\"!isPending && pageInfo.hasAddButton\" mat-button color=\"primary\" type=\"button\"\r\n (click)=\"addNewItem()\" id=\"editable-add-item-btn\">\r\n <mat-icon>add_box</mat-icon>\r\n {{ translationKey | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-row flex-wrap align-center-center main-pagination\" *ngIf=\"totalElements > 0\">\r\n <div class=\"flex-column flex-full\">\r\n <app-paginator [currentPage]=\"pageIndex\" [totalItems]=\"totalElements\" [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"[5, 10, 25, 50]\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></app-paginator>\r\n </div>\r\n <div class=\"flex-column flex-full countItem hide-gt-xs\">\r\n <span class=\"countItem__totalElement\">{{ 'totalCountItem' | translate }} : {{ this.totalElements }}</span>\r\n </div>\r\n <div class=\"flex-column flex-2\"></div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"isBulkItemsSupported\" class=\"flex-row gap-10 align-start-start mainTable\">\r\n <div>\r\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"addBulkItems()\" [disabled]=\"shouldDisableBulkAdd()\" id=\"editable-bulk-add-btn\">\r\n <mat-icon>add_box</mat-icon>\r\n {{ 'addAll' | translate }}\r\n </button>\r\n </div>\r\n <div>\r\n <button mat-flat-button color=\"warn\" type=\"button\" [disabled]=\"!hasDataToClear()\" (click)=\"clearBulkItems()\" id=\"editable-bulk-clear-btn\">\r\n <mat-icon>delete</mat-icon>\r\n {{ 'clearAll' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".baseTable{padding:20px}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}.responsive-top-gap{margin-top:20px}@media (max-width: 959px){.responsive-top-gap{margin-top:1px}.baseTable{padding:20px;margin-inline:8px;width:max-content}}.flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column}.flex-half{flex:0 0 50%}.flex-80{flex:0 0 80%}.flex-15{flex:0 0 15%}.flex-2{flex:0 0 2%}.flex-full{flex:0 0 100%}.align-start-start{justify-content:flex-start;align-items:flex-start}.align-start-end{justify-content:flex-end;align-items:flex-start}.align-center-start{justify-content:flex-start;align-items:center}.align-center-center{justify-content:center;align-items:center}.align-end-start{justify-content:flex-start;align-items:flex-end}.align-end-end{justify-content:flex-end;align-items:flex-end}.gap-8{gap:8px}.gap-10{gap:10px}.gap-0{gap:0px}@media (max-width: 959px){.flex-column.lt-md{flex-direction:column}.flex-row.lt-md{flex-direction:row}.flex-full.lt-md{flex:0 0 100%}.align-center-center.lt-md{justify-content:center;align-items:center}}@media (max-width: 599px){.flex-hide.gt-xs{display:none!important}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i7.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "directive", type: MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: MatCellDef, selector: "[matCellDef]" }, { kind: "ngmodule", type: NgxPaginationModule }, { kind: "pipe", type: i9.PaginatePipe, name: "paginate" }, { kind: "component", type: MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "component", type: MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: AutoCompleteComponent, selector: "app-auto-complete", inputs: ["field", "form", "defaultValue", "readonly", "supportingAttributes"], outputs: ["selectedValue"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "component", type: TitleBarComponent, selector: "app-title-bar", inputs: ["pageTitle", "showExtractButton", "totalElements", "titleMode", "pageInfo", "subTitle", "statusDesc", "newAction", "extraButton", "showDetails", "showImport", "showButton", "extraData", "titleCorporateAdmin", "hideBackButton", "buttons", "buttonsDisplayMode", "draftSupported", "isPending", "onViewModeChange"], outputs: ["newActionClicked", "extraButtonClicked", "extractReport", "buttonClicked", "viewModeChanged"] }, { kind: "component", type: PaginatorComponent, selector: "app-paginator", inputs: ["currentPage", "totalItems", "pageSize", "pageSizeOptions", "mobileLoadMoreIncrement", "displayedItems"], outputs: ["pageChange", "pageSizeChange", "loadMore"] }, { kind: "component", type: AttachmentUploaderComponent, selector: "app-attachment-uploader", inputs: ["acceptedTypes", "ariaDescribedBy"], outputs: ["fileSelected"] }, { kind: "component", type: EquationBuilderComponent, selector: "lib-equation-builder", inputs: ["form", "field", "isPending", "readOnly"], outputs: ["valueChanged"] }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: BaseFormCanvasComponent, selector: "app-base-form-canvas", inputs: ["pageInfo", "currency", "fields", "errors", "workflowEditableFields", "isWorkflowEditableManaged", "supportingAttributes", "editable", "emitOnValueChanges", "filterResetNonce", "item", "equationSuggestedFields", "currentEquationValue"], outputs: ["attachmentEmitter", "actionEmitter", "formUpdated", "hyperTextEvent", "currentEquationValueChange"] }, { kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }], animations: [] }); }
418
418
  }
419
419
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EditableBaseTableComponent, decorators: [{
420
420
  type: Component,
@@ -470,7 +470,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
470
470
  // deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS],
471
471
  // },
472
472
  // { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS },
473
- ], template: "<div class=\"baseTable flex-column\">\r\n <div class=\"left-align\">\r\n <app-attachment-uploader #uploader\r\n *ngIf=\"isBulkItemsSupported\"\r\n (fileSelected)=\"handleFileUpload($event)\">\r\n </app-attachment-uploader>\r\n </div>\r\n\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-half flex-column align-center-start\">\r\n <app-title-bar [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\r\n [titleMode]=\"''\"\r\n [newAction]=\"false\"\r\n [showExtractButton]=\"!pageInfo.hideExtractButton\">\r\n </app-title-bar>\r\n <span class=\"font-small\">{{ 'totalCountItem' | translate }} : {{ this.totalElements }}</span>\r\n </div>\r\n <div class=\"flex-half flex-column align-start-end\">\r\n <mat-chip-listbox #box aria-label=\"Color selection\" [multiple]=\"false\" [value]=\"isPending ? 'PENDING' : 'COMPLETED'\" (click)=\"$event.stopPropagation()\" (change)=\"onChipSelectionChange($event, box)\" *ngIf=\"pageInfo.draftSupported\">\r\n <mat-chip-option [selected]=\"!isPending\" [color]=\"'accent'\" value=\"COMPLETED\" (click)=\"$event.stopPropagation()\">\r\n {{ 'finished' | translate }}\r\n </mat-chip-option>\r\n <mat-chip-option [selected]=\"isPending\" [color]=\"'accent'\" value=\"PENDING\" (click)=\"$event.stopPropagation()\">\r\n {{ 'todo' | translate }}\r\n </mat-chip-option>\r\n </mat-chip-listbox>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"showSearch()\">\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-80 flex-column align-start-end\">\r\n <app-base-form-canvas class=\"flex-fill\"\r\n [pageInfo]=\"pageInfo\"\r\n [fields]=\"searchFormFields\"\r\n [editable]=\"true\"\r\n (formUpdated)=\"updateSearchForm($event)\">\r\n </app-base-form-canvas>\r\n </div>\r\n <div class=\"flex-15 flex-column align-start-end\">\r\n <div class=\"flex-row align-center-center gap-8 full-width\">\r\n <button mat-button color=\"primary\" type=\"button\" (click)=\"doSearch()\" id=\"editable-search-btn\">\r\n <mat-icon>search</mat-icon>\r\n {{ 'search' | translate }}\r\n </button>\r\n <button mat-button color=\"primary\" type=\"button\" (click)=\"clearSearch()\" id=\"editable-clear-search-btn\">\r\n <mat-icon>clear</mat-icon>\r\n {{ 'clear' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"flex-row full-width baseTable__detailsColumn\">\r\n <div class=\"flex-full\">\r\n <ng-container *ngIf=\"isLoaded\">\r\n <div class=\"flex-row mainTable gap-0 align-start-start\">\r\n <form [formGroup]=\"formParam\" class=\"flex-fill\">\r\n <table [dataSource]=\"dataFormArray.controls\" class=\"flex-fill\" mat-table matSort>\r\n <ng-container *ngFor=\"let column of this.fields; let i = index\">\r\n <ng-container matColumnDef=\"{{column.property}}\">\r\n <ng-container [ngSwitch]=\"column.type\">\r\n <ng-container *ngSwitchCase=\"'equation-builder'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\" mat-cell>\r\n <lib-equation-builder\r\n [form]=\"element\"\r\n [field]=\"column\"\r\n [readOnly]=\"column.readonly\"\r\n [isPending]=\"isPending\"\r\n (valueChanged)=\"handleEquationChange($event, element, column)\">\r\n </lib-equation-builder>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'lookup'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <app-auto-complete\r\n [form]=\"element\"\r\n [field]=\"column\"\r\n [defaultValue]=\"element.get(column.property)?.value\"\r\n (selectedValue)=\"patchLookupValue($event, column.property)\">\r\n </app-auto-complete>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'list'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}</th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-label>{{element}}</mat-label>\r\n <mat-select\r\n formControlName=\"{{column.property}}\"\r\n [attr.aria-label]=\"column.label! | translate\"\r\n [multiple]=\"false\"\r\n [(value)]=\"element[column.property]\">\r\n <ng-container>\r\n <mat-option\r\n *ngFor=\"let item of column.listOptions\"\r\n [value]=\"item\">\r\n {{ getOptionValue(item) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'stateType'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ 'action' | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n <div class=\"flex-column\">\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-third flex-column align-center-center\">\r\n <button mat-button class=\"btn-none-background-primary\"\r\n color=\"primary\"\r\n [disabled]=\"disabledSaveButton(element)\"\r\n (click)=\"fieldButtonEvent(column,element,SAVE)\"\r\n [attr.id]=\"'editable-save-' + (element.value?.id || '')\">\r\n {{ getPositiveWfActionKey(element.value.stateType) | translate }}\r\n </button>\r\n </div>\r\n <div class=\"flex-third flex-column align-center-center\">\r\n <button *ngIf=\"isPending\" mat-button class=\"btn-none-background-primary\"\r\n color=\"accent\"\r\n (click)=\"fieldButtonEvent(column,element,REJECT)\"\r\n [attr.id]=\"'editable-reject-' + (element.value?.id || '')\">\r\n {{ getNegativeWfActionKey(element.value.stateType) | translate }}\r\n </button>\r\n </div>\r\n <div class=\"flex-third flex-column align-center-center\"></div>\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'year'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <mat-label>{{ labelKey(column) | translate }}</mat-label>\r\n <input matInput\r\n [disabled]=\"column.readonly\"\r\n [readonly]=\"column.readonly\"\r\n [matDatepicker]=\"picker\"\r\n [min]=\"minDate\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker startView=\"multi-year\"\r\n (yearSelected)=\"setMonthAndYear($event, picker, element,column)\"\r\n panelClass=\"example-month-picker\"></mat-datepicker>\r\n\r\n </mat-form-field>\r\n <!-- <mat-form-field class=\"flex-auto\" appearance=\"outline\" fxFlexFill>-->\r\n <!-- <input matInput [formControl]=\"getField(element, column)\">-->\r\n <!-- </mat-form-field>-->\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <!-- Visually hidden label just to trigger the floating label and asterisk -->\r\n <mat-label>\r\n </mat-label>\r\n\r\n <input matInput\r\n type=\"number\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-checkbox\r\n style=\"padding-bottom: 14px; padding-top: 14px;\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\"\r\n [style.pointer-events]=\"column.readonly ? 'none' : 'auto'\"\r\n [style.opacity]=\"column.readonly ? 0.7 : 1\"\r\n (click)=\"column.readonly ? $event.preventDefault() : null\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <mat-label>\r\n {{ labelKey(column) | translate }}\r\n </mat-label>\r\n <input matInput\r\n type=\"text\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <input matInput\r\n [matDatepicker]=\"xpicker\"\r\n [min]=\"minDate\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [disabled]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"xpicker\"\r\n [disabled]=\"column.readonly\">\r\n </mat-datepicker-toggle>\r\n <mat-datepicker #xpicker></mat-datepicker>\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <input matInput\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [formControl]=\"getField(element, column)\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <tr *matHeaderRowDef=\"visibleColumns\" mat-header-row></tr>\r\n <tr (click)=\"onSelectItem(row)\" (auxclick)=\"openNewTab(row)\"\r\n *matRowDef=\"let row; columns: visibleColumns | paginate:config\"\r\n [attr.id]=\"'editable-row-' + (row?.value?.id || row?.value?.key || '')\"\r\n mat-row></tr>\r\n </table>\r\n </form>\r\n </div>\r\n\r\n <div *ngIf=\"noDataFound && !pageInfo.lazyLoadData\" class=\"flex-row dataNotFound\">\r\n <div class=\"flex-column flex-full\">\r\n <span class=\"dataNotFound__details\">\r\n <mat-icon class=\"dataNotFound__details__icon\">info</mat-icon>\r\n <span>{{ 'dataNotFound' | translate }}</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-row mainTable\" *ngIf=\"!selectedFileFromUploader\">\r\n <div>\r\n <button *ngIf=\"!isPending && pageInfo.hasAddButton\" mat-button color=\"primary\" type=\"button\"\r\n (click)=\"addNewItem()\" id=\"editable-add-item-btn\">\r\n <mat-icon>add_box</mat-icon>\r\n {{ translationKey | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-row flex-wrap align-center-center main-pagination\" *ngIf=\"totalElements > 0\">\r\n <div class=\"flex-column flex-full\">\r\n <app-paginator [currentPage]=\"pageIndex\" [totalItems]=\"totalElements\" [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"[5, 10, 25, 50]\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></app-paginator>\r\n </div>\r\n <div class=\"flex-column flex-full countItem hide-gt-xs\">\r\n <span class=\"countItem__totalElement\">{{ 'totalCountItem' | translate }} : {{ this.totalElements }}</span>\r\n </div>\r\n <div class=\"flex-column flex-2\"></div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"isBulkItemsSupported\" class=\"flex-row gap-10 align-start-start mainTable\">\r\n <div>\r\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"addBulkItems()\" [disabled]=\"shouldDisableBulkAdd()\" id=\"editable-bulk-add-btn\">\r\n <mat-icon>add_box</mat-icon>\r\n {{ 'addAll' | translate }}\r\n </button>\r\n </div>\r\n <div>\r\n <button mat-flat-button color=\"warn\" type=\"button\" [disabled]=\"!hasDataToClear()\" (click)=\"clearBulkItems()\" id=\"editable-bulk-clear-btn\">\r\n <mat-icon>delete</mat-icon>\r\n {{ 'clearAll' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".baseTable{padding:20px}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}.responsive-top-gap{margin-top:20px}@media (max-width: 959px){.responsive-top-gap{margin-top:1px}.baseTable{padding:20px;margin-inline:8px;width:max-content}}.flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column}.flex-half{flex:0 0 50%}.flex-80{flex:0 0 80%}.flex-15{flex:0 0 15%}.flex-2{flex:0 0 2%}.flex-full{flex:0 0 100%}.align-start-start{justify-content:flex-start;align-items:flex-start}.align-start-end{justify-content:flex-end;align-items:flex-start}.align-center-start{justify-content:flex-start;align-items:center}.align-center-center{justify-content:center;align-items:center}.align-end-start{justify-content:flex-start;align-items:flex-end}.align-end-end{justify-content:flex-end;align-items:flex-end}.gap-8{gap:8px}.gap-10{gap:10px}.gap-0{gap:0px}@media (max-width: 959px){.flex-column.lt-md{flex-direction:column}.flex-row.lt-md{flex-direction:row}.flex-full.lt-md{flex:0 0 100%}.align-center-center.lt-md{justify-content:center;align-items:center}}@media (max-width: 599px){.flex-hide.gt-xs{display:none!important}}\n"] }]
473
+ ], template: "<div class=\"baseTable flex-column\">\r\n <div class=\"left-align\">\r\n <app-attachment-uploader #uploader\r\n *ngIf=\"isBulkItemsSupported\"\r\n (fileSelected)=\"handleFileUpload($event)\">\r\n </app-attachment-uploader>\r\n </div>\r\n\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-half flex-column align-center-start\">\r\n <app-title-bar [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\r\n [titleMode]=\"''\"\r\n [newAction]=\"false\"\r\n [showExtractButton]=\"!pageInfo.hideExtractButton\">\r\n </app-title-bar>\r\n <span class=\"font-small\">{{ 'totalCountItem' | translate }} : {{ this.totalElements }}</span>\r\n </div>\r\n <div class=\"flex-half flex-column align-start-end\">\r\n <mat-chip-listbox #box [attr.aria-label]=\"'BASE_TABLE.documentStatus' | translate\" [multiple]=\"false\" [value]=\"isPending ? 'PENDING' : 'COMPLETED'\" (click)=\"$event.stopPropagation()\" (change)=\"onChipSelectionChange($event, box)\" *ngIf=\"pageInfo.draftSupported\">\r\n <mat-chip-option [selected]=\"!isPending\" [color]=\"'accent'\" value=\"COMPLETED\" (click)=\"$event.stopPropagation()\">\r\n {{ 'finished' | translate }}\r\n </mat-chip-option>\r\n <mat-chip-option [selected]=\"isPending\" [color]=\"'accent'\" value=\"PENDING\" (click)=\"$event.stopPropagation()\">\r\n {{ 'todo' | translate }}\r\n </mat-chip-option>\r\n </mat-chip-listbox>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"showSearch()\">\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-80 flex-column align-start-end\">\r\n <app-base-form-canvas class=\"flex-fill\"\r\n [pageInfo]=\"pageInfo\"\r\n [fields]=\"searchFormFields\"\r\n [editable]=\"true\"\r\n (formUpdated)=\"updateSearchForm($event)\">\r\n </app-base-form-canvas>\r\n </div>\r\n <div class=\"flex-15 flex-column align-start-end\">\r\n <div class=\"flex-row align-center-center gap-8 full-width\">\r\n <button mat-button color=\"primary\" type=\"button\" (click)=\"doSearch()\" id=\"editable-search-btn\">\r\n <mat-icon>search</mat-icon>\r\n {{ 'search' | translate }}\r\n </button>\r\n <button mat-button color=\"primary\" type=\"button\" (click)=\"clearSearch()\" id=\"editable-clear-search-btn\">\r\n <mat-icon>clear</mat-icon>\r\n {{ 'clear' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"flex-row full-width baseTable__detailsColumn\">\r\n <div class=\"flex-full\">\r\n <ng-container *ngIf=\"isLoaded\">\r\n <div class=\"flex-row mainTable gap-0 align-start-start\">\r\n <form [formGroup]=\"formParam\" class=\"flex-fill\">\r\n <table [dataSource]=\"dataFormArray.controls\" class=\"flex-fill\" mat-table matSort>\r\n <ng-container *ngFor=\"let column of this.fields; let i = index\">\r\n <ng-container matColumnDef=\"{{column.property}}\">\r\n <ng-container [ngSwitch]=\"column.type\">\r\n <ng-container *ngSwitchCase=\"'equation-builder'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\" mat-cell>\r\n <lib-equation-builder\r\n [form]=\"element\"\r\n [field]=\"column\"\r\n [readOnly]=\"column.readonly\"\r\n [isPending]=\"isPending\"\r\n (valueChanged)=\"handleEquationChange($event, element, column)\">\r\n </lib-equation-builder>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'lookup'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <app-auto-complete\r\n [form]=\"element\"\r\n [field]=\"column\"\r\n [defaultValue]=\"element.get(column.property)?.value\"\r\n (selectedValue)=\"patchLookupValue($event, column.property)\">\r\n </app-auto-complete>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'list'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}</th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-label>{{element}}</mat-label>\r\n <mat-select\r\n formControlName=\"{{column.property}}\"\r\n [attr.aria-label]=\"column.label! | translate\"\r\n [multiple]=\"false\"\r\n [(value)]=\"element[column.property]\">\r\n <ng-container>\r\n <mat-option\r\n *ngFor=\"let item of column.listOptions\"\r\n [value]=\"item\">\r\n {{ getOptionValue(item) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'stateType'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ 'action' | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n <div class=\"flex-column\">\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-third flex-column align-center-center\">\r\n <button mat-button class=\"btn-none-background-primary\"\r\n color=\"primary\"\r\n [disabled]=\"disabledSaveButton(element)\"\r\n (click)=\"fieldButtonEvent(column,element,SAVE)\"\r\n [attr.id]=\"'editable-save-' + (element.value?.id || '')\">\r\n {{ getPositiveWfActionKey(element.value.stateType) | translate }}\r\n </button>\r\n </div>\r\n <div class=\"flex-third flex-column align-center-center\">\r\n <button *ngIf=\"isPending\" mat-button class=\"btn-none-background-primary\"\r\n color=\"accent\"\r\n (click)=\"fieldButtonEvent(column,element,REJECT)\"\r\n [attr.id]=\"'editable-reject-' + (element.value?.id || '')\">\r\n {{ getNegativeWfActionKey(element.value.stateType) | translate }}\r\n </button>\r\n </div>\r\n <div class=\"flex-third flex-column align-center-center\"></div>\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'year'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <mat-label>{{ labelKey(column) | translate }}</mat-label>\r\n <input matInput\r\n [disabled]=\"column.readonly\"\r\n [readonly]=\"column.readonly\"\r\n [matDatepicker]=\"picker\"\r\n [min]=\"minDate\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker startView=\"multi-year\"\r\n (yearSelected)=\"setMonthAndYear($event, picker, element,column)\"\r\n panelClass=\"example-month-picker\"></mat-datepicker>\r\n\r\n </mat-form-field>\r\n <!-- <mat-form-field class=\"flex-auto\" appearance=\"outline\" fxFlexFill>-->\r\n <!-- <input matInput [formControl]=\"getField(element, column)\">-->\r\n <!-- </mat-form-field>-->\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <!-- Visually hidden label just to trigger the floating label and asterisk -->\r\n <mat-label>\r\n </mat-label>\r\n\r\n <input matInput\r\n type=\"number\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-checkbox\r\n style=\"padding-bottom: 14px; padding-top: 14px;\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\"\r\n [style.pointer-events]=\"column.readonly ? 'none' : 'auto'\"\r\n [style.opacity]=\"column.readonly ? 0.7 : 1\"\r\n (click)=\"column.readonly ? $event.preventDefault() : null\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <mat-label>\r\n {{ labelKey(column) | translate }}\r\n </mat-label>\r\n <input matInput\r\n type=\"text\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <input matInput\r\n [matDatepicker]=\"xpicker\"\r\n [min]=\"minDate\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [disabled]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"xpicker\"\r\n [disabled]=\"column.readonly\">\r\n </mat-datepicker-toggle>\r\n <mat-datepicker #xpicker></mat-datepicker>\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <input matInput\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [formControl]=\"getField(element, column)\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <tr *matHeaderRowDef=\"visibleColumns\" mat-header-row></tr>\r\n <tr (click)=\"onSelectItem(row)\" (auxclick)=\"openNewTab(row)\"\r\n *matRowDef=\"let row; columns: visibleColumns | paginate:config\"\r\n [attr.id]=\"'editable-row-' + (row?.value?.id || row?.value?.key || '')\"\r\n mat-row></tr>\r\n </table>\r\n </form>\r\n </div>\r\n\r\n <div *ngIf=\"noDataFound && !pageInfo.lazyLoadData\" class=\"flex-row dataNotFound\">\r\n <div class=\"flex-column flex-full\">\r\n <span class=\"dataNotFound__details\">\r\n <mat-icon class=\"dataNotFound__details__icon\">info</mat-icon>\r\n <span>{{ 'dataNotFound' | translate }}</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-row mainTable\" *ngIf=\"!selectedFileFromUploader\">\r\n <div>\r\n <button *ngIf=\"!isPending && pageInfo.hasAddButton\" mat-button color=\"primary\" type=\"button\"\r\n (click)=\"addNewItem()\" id=\"editable-add-item-btn\">\r\n <mat-icon>add_box</mat-icon>\r\n {{ translationKey | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-row flex-wrap align-center-center main-pagination\" *ngIf=\"totalElements > 0\">\r\n <div class=\"flex-column flex-full\">\r\n <app-paginator [currentPage]=\"pageIndex\" [totalItems]=\"totalElements\" [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"[5, 10, 25, 50]\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></app-paginator>\r\n </div>\r\n <div class=\"flex-column flex-full countItem hide-gt-xs\">\r\n <span class=\"countItem__totalElement\">{{ 'totalCountItem' | translate }} : {{ this.totalElements }}</span>\r\n </div>\r\n <div class=\"flex-column flex-2\"></div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"isBulkItemsSupported\" class=\"flex-row gap-10 align-start-start mainTable\">\r\n <div>\r\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"addBulkItems()\" [disabled]=\"shouldDisableBulkAdd()\" id=\"editable-bulk-add-btn\">\r\n <mat-icon>add_box</mat-icon>\r\n {{ 'addAll' | translate }}\r\n </button>\r\n </div>\r\n <div>\r\n <button mat-flat-button color=\"warn\" type=\"button\" [disabled]=\"!hasDataToClear()\" (click)=\"clearBulkItems()\" id=\"editable-bulk-clear-btn\">\r\n <mat-icon>delete</mat-icon>\r\n {{ 'clearAll' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".baseTable{padding:20px}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}.responsive-top-gap{margin-top:20px}@media (max-width: 959px){.responsive-top-gap{margin-top:1px}.baseTable{padding:20px;margin-inline:8px;width:max-content}}.flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column}.flex-half{flex:0 0 50%}.flex-80{flex:0 0 80%}.flex-15{flex:0 0 15%}.flex-2{flex:0 0 2%}.flex-full{flex:0 0 100%}.align-start-start{justify-content:flex-start;align-items:flex-start}.align-start-end{justify-content:flex-end;align-items:flex-start}.align-center-start{justify-content:flex-start;align-items:center}.align-center-center{justify-content:center;align-items:center}.align-end-start{justify-content:flex-start;align-items:flex-end}.align-end-end{justify-content:flex-end;align-items:flex-end}.gap-8{gap:8px}.gap-10{gap:10px}.gap-0{gap:0px}@media (max-width: 959px){.flex-column.lt-md{flex-direction:column}.flex-row.lt-md{flex-direction:row}.flex-full.lt-md{flex:0 0 100%}.align-center-center.lt-md{justify-content:center;align-items:center}}@media (max-width: 599px){.flex-hide.gt-xs{display:none!important}}\n"] }]
474
474
  }], ctorParameters: () => [{ type: i1.BackendService }, { type: i2.Router }, { type: i3.FormBuilder }, { type: i4.MatDialog }, { type: i5.Directionality }], propDecorators: { filterRequest: [{
475
475
  type: Input
476
476
  }], superDataElements: [{
@@ -504,4 +504,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
504
504
  type: ViewChild,
505
505
  args: ['fileUpload']
506
506
  }] } });
507
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGFibGUtYmFzZS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2VkaXRhYmxlLWJhc2UtdGFibGUvZWRpdGFibGUtYmFzZS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2VkaXRhYmxlLWJhc2UtdGFibGUvZWRpdGFibGUtYmFzZS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsT0FBTyxFQUNQLFVBQVUsRUFDVixZQUFZLEVBQ1osYUFBYSxFQUNiLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osZUFBZSxFQUNmLE1BQU0sRUFDTixTQUFTLEVBQ1QsUUFBUSxFQUNULE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxFQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRCxPQUFPLEVBQTBD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RkFBNEY7b0JBQzVGLDhGQUE4RjtvQkFDOUYsaUNBQWlDO29CQUNqQyxJQUFJO29CQUNKLDBCQUEwQjtvQkFDMUIsaUNBQWlDO29CQUNqQyw4REFBOEQ7b0JBQzlELEtBQUs7b0JBRUwsdURBQXVEO3FCQUN4RDt1TEFxQ0QsYUFBYTtzQkFEWixLQUFLO2dCQUlOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFJRyxRQUFRO3NCQURoQixLQUFLO2dCQUlOLGNBQWM7c0JBRGIsS0FBSztnQkFJTixTQUFTO3NCQURSLEtBQUs7Z0JBSU4sb0JBQW9CO3NCQURuQixLQUFLO2dCQUlDLE1BQU07c0JBRFosS0FBSztnQkFJQyxnQkFBZ0I7c0JBRHRCLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHTixXQUFXO3NCQURWLE1BQU07Z0JBSVAsaUJBQWlCO3NCQURoQixNQUFNO2dCQUdQLHFCQUFxQjtzQkFEcEIsTUFBTTtnQkFHRSxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRWlCLGlCQUFpQjtzQkFBdkMsU0FBUzt1QkFBQyxVQUFVO2dCQTRTSSxVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7XHJcbiAgTWF0Q2VsbCxcclxuICBNYXRDZWxsRGVmLFxyXG4gIE1hdENvbHVtbkRlZixcclxuICBNYXRIZWFkZXJDZWxsLFxyXG4gIE1hdEhlYWRlckNlbGxEZWYsXHJcbiAgTWF0SGVhZGVyUm93LFxyXG4gIE1hdEhlYWRlclJvd0RlZixcclxuICBNYXRSb3csXHJcbiAgTWF0Um93RGVmLFxyXG4gIE1hdFRhYmxlXHJcbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3RhYmxlXCI7XHJcbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xyXG5pbXBvcnQge01hdFNvcnRNb2R1bGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zb3J0XCI7XHJcbmltcG9ydCB7TmdDbGFzcywgTmdGb3JPZiwgTmdJZiwgTmdTd2l0Y2gsIE5nU3dpdGNoQ2FzZSwgTmdTd2l0Y2hEZWZhdWx0fSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7TWF0SWNvbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2ljb25cIjtcclxuaW1wb3J0IHtNYXRCdXR0b24sIE1hdEJ1dHRvbk1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2J1dHRvblwiO1xyXG5pbXBvcnQge05neFBhZ2luYXRpb25Nb2R1bGV9IGZyb20gXCJuZ3gtcGFnaW5hdGlvblwiO1xyXG5pbXBvcnQge1JvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7TWF0RXJyb3IsIE1hdEZvcm1GaWVsZCwgTWF0SW5wdXQsIE1hdExhYmVsLCBNYXRTdWZmaXh9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pbnB1dFwiO1xyXG5pbXBvcnQge0JhY2tlbmRTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vc2VydmljZXNcIjtcclxuaW1wb3J0IHtcclxuICBCYXNlVXRpbHMsXHJcbiAgYnVpbGRGb3JtRmllbGRzLFxyXG4gIGdldE5lZ2F0aXZlV2ZBY3Rpb25LZXksXHJcbiAgZ2V0UG9zaXRpdmVXZkFjdGlvbktleSxcclxuICBnZXRXZkFjdGlvbklkXHJcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL2Jhc2UtdXRpbHNcIjtcclxuaW1wb3J0IHtcclxuICBFTVBUWV9QQUdFX0lORk8sXHJcbiAgRmllbGRJbmZvLFxyXG4gIEZpbHRlcixcclxuICBGaWx0ZXJSZXF1ZXN0LFxyXG4gIExvb2t1cEl0ZW0sXHJcbiAgUGFnZUluZm8sXHJcbiAgU0VMRUNUX1JFQ09SRF9BQ1RJT04sXHJcbiAgU25hY2tNZXNzYWdlLFxyXG4gIFRhYmxlQ29sdW1uXHJcbn0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWxcIjtcclxuaW1wb3J0IHtEb0FjdGlvblJlcXVlc3QsIFJFSkVDVCwgU0FWRX0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvZG8tYWN0aW9uLXJlcXVlc3RcIjtcclxuaW1wb3J0IHtBY3Rpb25Db21tZW50Q29tcG9uZW50fSBmcm9tIFwiLi4vYWN0aW9uLWNvbW1lbnQvYWN0aW9uLWNvbW1lbnQuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XHJcbmltcG9ydCB7TWF0RGF0ZXBpY2tlciwgTWF0RGF0ZXBpY2tlcklucHV0LCBNYXREYXRlcGlja2VyVG9nZ2xlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlclwiO1xyXG5pbXBvcnQgbW9tZW50LCB7TW9tZW50fSBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQge0F1dG9Db21wbGV0ZUNvbXBvbmVudH0gZnJvbSBcIi4uL2F1dG8tY29tcGxldGUvYXV0by1jb21wbGV0ZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtEYXRlQWRhcHRlciwgTUFUX0RBVEVfRk9STUFUUywgTUFUX0RBVEVfTE9DQUxFLCBNYXRPcHRpb259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jb3JlXCI7XHJcbmltcG9ydCB7TWF0Q2hpcExpc3Rib3gsIE1hdENoaXBPcHRpb259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jaGlwc1wiO1xyXG5pbXBvcnQge1RpdGxlQmFyQ29tcG9uZW50fSBmcm9tIFwiLi4vdGl0bGUtYmFyL3RpdGxlLWJhci5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtQYWdpbmF0b3JDb21wb25lbnR9IGZyb20gXCIuLi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0RpcmVjdGlvbmFsaXR5fSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2JpZGlcIjtcclxuaW1wb3J0IHtBdHRhY2htZW50VXBsb2FkZXJDb21wb25lbnR9IGZyb20gXCIuLi9zaGFyZWQvYXR0YWNobWVudC11cGxvYWRlci9hdHRhY2htZW50LXVwbG9hZGVyLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0VxdWF0aW9uQnVpbGRlckNvbXBvbmVudH0gZnJvbSBcIi4uL2VxdWF0aW9uLWJ1aWxkZXIvZXF1YXRpb24tYnVpbGRlci5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtNYXRTZWxlY3R9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3RcIjtcclxuXHJcbmltcG9ydCB7QmFzZUZvcm1DYW52YXNDb21wb25lbnR9IGZyb20gXCIuLi9iYXNlLWZvcm0tY2FudmFzL2Jhc2UtZm9ybS1jYW52YXMuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7TWF0Q2hlY2tib3h9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveFwiO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1lZGl0YWJsZS1iYXNlLXRhYmxlJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9lZGl0YWJsZS1iYXNlLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9lZGl0YWJsZS1iYXNlLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW10sXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTmdDbGFzcyxcclxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcclxuICAgIE1hdEljb24sXHJcbiAgICBNYXRTb3J0TW9kdWxlLFxyXG4gICAgTWF0Q29sdW1uRGVmLFxyXG4gICAgTWF0SGVhZGVyQ2VsbERlZixcclxuICAgIE5nSWYsXHJcbiAgICBNYXRUYWJsZSxcclxuICAgIE1hdEhlYWRlckNlbGwsXHJcbiAgICBOZ1N3aXRjaCxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIE1hdENlbGwsXHJcbiAgICBNYXRDZWxsRGVmLFxyXG4gICAgTmd4UGFnaW5hdGlvbk1vZHVsZSxcclxuICAgIE1hdFJvdyxcclxuICAgIE1hdFJvd0RlZixcclxuICAgIE1hdEhlYWRlclJvdyxcclxuICAgIE5nU3dpdGNoQ2FzZSxcclxuICAgIE5nU3dpdGNoRGVmYXVsdCxcclxuICAgIE1hdEhlYWRlclJvd0RlZixcclxuICAgIE5nRm9yT2YsXHJcbiAgICBNYXRCdXR0b24sXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgTWF0SW5wdXQsXHJcbiAgICBBdXRvQ29tcGxldGVDb21wb25lbnQsXHJcbiAgICBNYXRGb3JtRmllbGQsXHJcbiAgICBNYXREYXRlcGlja2VyLFxyXG4gICAgTWF0RGF0ZXBpY2tlcklucHV0LFxyXG4gICAgTWF0RGF0ZXBpY2tlclRvZ2dsZSxcclxuICAgIE1hdExhYmVsLFxyXG4gICAgTWF0U3VmZml4LFxyXG4gICAgTWF0Q2hpcExpc3Rib3gsXHJcbiAgICBNYXRDaGlwT3B0aW9uLFxyXG4gICAgVGl0bGVCYXJDb21wb25lbnQsXHJcbiAgICBQYWdpbmF0b3JDb21wb25lbnQsXHJcbiAgICBBdHRhY2htZW50VXBsb2FkZXJDb21wb25lbnQsXHJcbiAgICBFcXVhdGlvbkJ1aWxkZXJDb21wb25lbnQsXHJcbiAgICBNYXRTZWxlY3QsXHJcbiAgICBNYXRPcHRpb24sXHJcbiAgICBCYXNlRm9ybUNhbnZhc0NvbXBvbmVudCxcclxuICAgIE1hdENoZWNrYm94LFxyXG4gIF0sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICAvLyBgTW9tZW50RGF0ZUFkYXB0ZXJgIGNhbiBiZSBhdXRvbWF0aWNhbGx5IHByb3ZpZGVkIGJ5IGltcG9ydGluZyBgTW9tZW50RGF0ZU1vZHVsZWAgaW4geW91clxyXG4gICAgLy8gYXBwbGljYXRpb24ncyByb290IG1vZHVsZS4gV2UgcHJvdmlkZSBpdCBhdCB0aGUgY29tcG9uZW50IGxldmVsIGhlcmUsIGR1ZSB0byBsaW1pdGF0aW9ucyBvZlxyXG4gICAgLy8gb3VyIGV4YW1wbGUgZ2VuZXJhdGlvbiBzY3JpcHQuXHJcbiAgICAvLyB7XHJcbiAgICAvLyAgIHByb3ZpZGU6IERhdGVBZGFwdGVyLFxyXG4gICAgLy8gICB1c2VDbGFzczogTW9tZW50RGF0ZUFkYXB0ZXIsXHJcbiAgICAvLyAgIGRlcHM6IFtNQVRfREFURV9MT0NBTEUsIE1BVF9NT01FTlRfREFURV9BREFQVEVSX09QVElPTlNdLFxyXG4gICAgLy8gfSxcclxuXHJcbiAgICAvLyB7IHByb3ZpZGU6IE1BVF9EQVRFX0ZPUk1BVFMsIHVzZVZhbHVlOiBNWV9GT1JNQVRTIH0sXHJcbiAgXSxcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBFZGl0YWJsZUJhc2VUYWJsZUNvbXBvbmVudCBleHRlbmRzIEJhc2VVdGlscyBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuXHJcbiAgcmVhZG9ubHkgbWluRGF0ZSA9IG1vbWVudChbMTgwMCwgMCwgMV0pO1xyXG5cclxuICBjb2xsZWN0aW9uID0ge2NvdW50OiA2MCwgZGF0YTogW119O1xyXG4gIGNvbmZpZyA9IHtcclxuICAgIGl0ZW1zUGVyUGFnZTogMTAsXHJcbiAgICBjdXJyZW50UGFnZTogMSxcclxuICAgIHRvdGFsSXRlbXM6IHRoaXMuY29sbGVjdGlvbi5jb3VudFxyXG4gIH07XHJcbiAgcHVibGljIG1heFNpemU6IG51bWJlciA9IDc7XHJcbiAgcHVibGljIGRpcmVjdGlvbkxpbmtzOiBib29sZWFuID0gdHJ1ZTtcclxuICBwdWJsaWMgYXV0b0hpZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgcmVzcG9uc2l2ZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHVibGljIGxhYmVsczogYW55ID0ge1xyXG4gICAgcHJldmlvdXNMYWJlbDogJzwnLFxyXG4gICAgbmV4dExhYmVsOiAnPicsXHJcbiAgICBzY3JlZW5SZWFkZXJQYWdpbmF0aW9uTGFiZWw6ICdQYWdpbmF0aW9uJyxcclxuICAgIHNjcmVlblJlYWRlclBhZ2VMYWJlbDogJ3BhZ2UnLFxyXG4gICAgc2NyZWVuUmVhZGVyQ3VycmVudExhYmVsOiBgWW91J3JlIG9uIHBhZ2VgXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSB0aW1lcjogYW55O1xyXG4gIGRhdGFFbGVtZW50czogYW55W10gPSBbXTtcclxuICBub0RhdGFGb3VuZCA9IGZhbHNlO1xyXG4gIGlzTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdG90YWxFbGVtZW50cyA9IDA7XHJcbiAgcGFnZXNDb3VudCA9IDA7XHJcbiAgcGFnZUluZGV4ID0gMTtcclxuICBwYWdlU2l6ZSA9IDEwO1xyXG4gIGZvcm1QYXJhbTogRm9ybUdyb3VwO1xyXG4gIHNlYXJjaEZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgQElucHV0KClcclxuICBmaWx0ZXJSZXF1ZXN0OiBGaWx0ZXJSZXF1ZXN0O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHN1cGVyRGF0YUVsZW1lbnRzOiBhbnlbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBvdmVycmlkZSBwYWdlSW5mbzogUGFnZUluZm8gPSBFTVBUWV9QQUdFX0lORk87XHJcblxyXG4gIEBJbnB1dCgpIC8vQHRzLWlnbm9yZVxyXG4gIGVuZm9yY2VSZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaXNQZW5kaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaXNCdWxrSXRlbXNTdXBwb3J0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkvLyBAdHMtaWdub3JlXHJcbiAgcHVibGljIGZpZWxkczogRmllbGRJbmZvW10gPSBbXTtcclxuXHJcbiAgQElucHV0KCkvLyBAdHMtaWdub3JlXHJcbiAgcHVibGljIHNlYXJjaEZvcm1GaWVsZHM6IEZpZWxkSW5mb1tdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIHRyYW5zbGF0aW9uS2V5OiBzdHJpbmcgPSAnYWRkTmV3JztcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgZm9ybVVwZGF0ZWQ6IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+ID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHNhdmVBY3Rpb25FbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKVxyXG4gIHNhdmVBdHRhY2htZW50RW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQElucHV0KCkgYWN0aW9uUmVxdWVzdENhbGxiYWNrITogKGFjdGlvblJlcXVlc3Q6IERvQWN0aW9uUmVxdWVzdCkgPT4gRG9BY3Rpb25SZXF1ZXN0O1xyXG5cclxuICBAVmlld0NoaWxkKCd1cGxvYWRlcicpIHVwbG9hZGVyQ29tcG9uZW50ITogQXR0YWNobWVudFVwbG9hZGVyQ29tcG9uZW50O1xyXG5cclxuICBjdXJyZW50RGlyZWN0aW9uOiAnbHRyJyB8ICdydGwnO1xyXG4gIHNlbGVjdGVkRmlsZUZyb21VcGxvYWRlcjogRmlsZSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgc2VsZWN0ZWRJdGVtOiBhbnk7XHJcblxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYmFja2VuZFNlcnZpY2U6IEJhY2tlbmRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBkaXJlY3Rpb25hbGl0eTogRGlyZWN0aW9uYWxpdHlcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGF0YUZvcm1BcnJheSgpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybVBhcmFtLmdldCgnZGF0YUZvcm1BcnJheScpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGV4dHJhY3RGb3JtYXQoY29sdW1uOiBUYWJsZUNvbHVtbjxhbnk+KSB7XHJcbiAgICByZXR1cm4gY29sdW1uPy5mb3JtYXQgfHwgJ2QvTS95eXl5LCBoOm1tIGEnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGFTb3VyY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhRm9ybUFycmF5LnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5jdXJyZW50RGlyZWN0aW9uID0gdGhpcy5kaXJlY3Rpb25hbGl0eS52YWx1ZTtcclxuICAgIHRoaXMuZGlyZWN0aW9uYWxpdHkuY2hhbmdlLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgdGhpcy5jdXJyZW50RGlyZWN0aW9uID0gdmFsdWU7XHJcbiAgICB9KVxyXG5cclxuICAgIGlmKHRoaXMuc3VwZXJEYXRhRWxlbWVudHM/Lmxlbmd0aD4wKXtcclxuICAgICAgdGhpcy5kYXRhRWxlbWVudHM9dGhpcy5zdXBlckRhdGFFbGVtZW50cztcclxuICAgICAgdGhpcy5idWlsZEZvcm0oKTtcclxuICAgICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZERhdGEoKSB7XHJcbiAgICB0aGlzLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IGZpZWxkLnJlYWRvbmx5ID0gdGhpcy5pc1BlbmRpbmcpO1xyXG5cclxuICAgIHRoaXMuZGF0YUVsZW1lbnRzID0gW107XHJcbiAgICB0aGlzLnRvdGFsRWxlbWVudHMgPSAwO1xyXG4gICAgdGhpcy5wYWdlc0NvdW50ID0gMTtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMubm9EYXRhRm91bmQgPSB0cnVlO1xyXG4gICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJSZXF1ZXN0LnBlbmRpbmdQYWdlID0gdGhpcy5pc1BlbmRpbmc7XHJcblxyXG4gICAgaWYgKCF0aGlzLnBhZ2VJbmZvLmxhenlMb2FkRGF0YSkge1xyXG4gICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmdldEl0ZW1zQnlGaWx0ZXIodGhpcy5maWx0ZXJSZXF1ZXN0LCB0aGlzLnBhZ2VJbmZvLmFwaVVyaSlcclxuICAgICAgICAuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhRWxlbWVudHMgPSByZXNwLmJvZHkgfHwgW107XHJcbiAgICAgICAgICB0aGlzLnRvdGFsRWxlbWVudHMgPSByZXNwLnRvdGFsU2l6ZSB8fCAwO1xyXG4gICAgICAgICAgdGhpcy5wYWdlc0NvdW50ID0gTWF0aC5tYXgoTWF0aC5jZWlsKHRoaXMudG90YWxFbGVtZW50cyAvIHRoaXMucGFnZVNpemUpLCAxKTtcclxuICAgICAgICAgIHRoaXMucGFnZUluZGV4ID0gKHRoaXMuZmlsdGVyUmVxdWVzdC5wYWdlSW5kZXggfHwgMCkgKyAxO1xyXG4gICAgICAgICAgdGhpcy5ub0RhdGFGb3VuZCA9IHRoaXMuZGF0YUVsZW1lbnRzLmxlbmd0aCA9PT0gMDtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYnVpbGRGb3JtKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkRm9ybSgpIHtcclxuICAgIHRoaXMuZm9ybVBhcmFtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGRhdGFGb3JtQXJyYXk6IHRoaXMuZmIuYXJyYXkodGhpcy5kYXRhRWxlbWVudHMubWFwKGl0ZW0gPT4gdGhpcy5mYi5ncm91cChidWlsZEZvcm1GaWVsZHModGhpcy5maWVsZHMsIGl0ZW0pKSkpLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZvcm1VcGRhdGVkLm5leHQodGhpcy5mb3JtUGFyYW0pO1xyXG4gIH1cclxuXHJcbiAgb25QYWdlQ2hhbmdlKGV2ZW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gZXZlbnQ7XHJcbiAgICB0aGlzLmdldE5leHQodGhpcy5wYWdlSW5kZXggLSAxKTtcclxuICB9XHJcbiAgZ2V0TmV4dChwYWdlSW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5maWx0ZXJSZXF1ZXN0LnBhZ2VJbmRleCA9IHBhZ2VJbmRleDtcclxuICAgIHRoaXMuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XHJcbiAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgfVxyXG5cclxuICBvblBhZ2VTaXplQ2hhbmdlKGV2ZW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMucGFnZVNpemUgPSBldmVudDtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XHJcbiAgICB0aGlzLmdldE5leHQoMCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZXh0cmFjdEZpZWxkTmFtZShlbGVtZW50OiBhbnksIHByb3BlcnR5OiBzdHJpbmcpIHtcclxuICAgIGlmIChwcm9wZXJ0eS5pbmNsdWRlcygnLicpKSB7XHJcbiAgICAgIHJldHVybiBwcm9wZXJ0eS5zcGxpdCgnLicpLnJlZHVjZSgoYWNjLCBwYXJ0KSA9PiBhY2MgJiYgYWNjW3BhcnRdLCBlbGVtZW50KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBlbGVtZW50W3Byb3BlcnR5XTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCB2aXNpYmxlQ29sdW1ucygpIHtcclxuICAgIHJldHVybiB0aGlzLmZpZWxkcy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi52aXNpYmxlKS5tYXAoY29sdW1uID0+IGNvbHVtbi5wcm9wZXJ0eSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbXCJlbmZvcmNlUmVmcmVzaFwiXSAmJiAhY2hhbmdlc1tcImVuZm9yY2VSZWZyZXNoXCJdLmlzRmlyc3RDaGFuZ2UoKSAmJiBjaGFuZ2VzW1wiZW5mb3JjZVJlZnJlc2hcIl0uY3VycmVudFZhbHVlID09PSB0cnVlKSB7XHJcbiAgICAgIC8vIHRoaXMubG9hZERhdGEoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uU2VsZWN0SXRlbShyb3c6IGFueSkge1xyXG4gICAgaWYgKHRoaXMucGFnZUluZm8uc2VsZlJvdXRpbmcpIHtcclxuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuaXNQZW5kaW5nID8gJ3BlbmRpbmcnIDogJ3ZpZXcnO1xyXG4gICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnBhZ2VJbmZvLmxpc3RSb3V0ZVBhdGggfHwgdGhpcy5yb3V0ZXIudXJsfS8ke21vZGV9YDtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Ake3VybH1gLCByb3c/LmlkXSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhY3Rpb24gPSBTRUxFQ1RfUkVDT1JEX0FDVElPTjtcclxuICAgIGFjdGlvbi5pZCA9IHJvdz8uaWQ7XHJcbiAgICAvLyB0aGlzLnVzZXJBY3Rpb24uZW1pdChhY3Rpb24pXHJcbiAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IHJvdztcclxuICB9XHJcblxyXG4gIG9wZW5OZXdUYWIocm93KSB7XHJcbiAgICBpZiAoIXRoaXMucGFnZUluZm8uZW1iZWRlZFRhYmxlT25seSkge1xyXG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5pc1BlbmRpbmcgPyAncGVuZGluZycgOiAndmlldyc7XHJcbiAgICAgIHdpbmRvdy5vcGVuKGAke3RoaXMucGFnZUluZm8ubGlzdFJvdXRlUGF0aH0vJHttb2RlfWAgKyAnLycgKyByb3c/LmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBnZXRGaWVsZChlbGVtZW50LCBjb2x1bW46IEZpZWxkSW5mbykge1xyXG4gICAgICByZXR1cm4gIGVsZW1lbnQuY29udHJvbHNbY29sdW1uLnByb3BlcnR5XTtcclxuICB9XHJcblxyXG4gIGZpZWxkQnV0dG9uRXZlbnQoY29sdW1uLCBlbGVtZW50LCBhY3Rpb25JZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmRvU2F2ZUFwcHJvdmVBY3Rpb24oZWxlbWVudCwgYWN0aW9uSWQpO1xyXG4gIH1cclxuXHJcbiAgcGF0Y2hMb29rdXBWYWx1ZSgkZXZlbnQ6IExvb2t1cEl0ZW0sIHByb3BlcnR5OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZm9ybVVwZGF0ZWQuZW1pdCh0aGlzLnNlbGVjdGVkSXRlbSlcclxuICB9XHJcblxyXG4gIGFkZE5ld0l0ZW0oKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VmFsdWVzID0gdGhpcy5mb3JtUGFyYW0/LmdldCgnZGF0YUZvcm1BcnJheScpPy52YWx1ZTtcclxuICAgIGlmIChjdXJyZW50VmFsdWVzKSB7XHJcbiAgICAgIHRoaXMuZGF0YUVsZW1lbnRzID0gWy4uLmN1cnJlbnRWYWx1ZXNdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kYXRhRWxlbWVudHMucHVzaCh7fSk7XHJcbiAgICB0aGlzLmJ1aWxkRm9ybSgpO1xyXG4gIH1cclxuXHJcblxyXG4gIGRvU2F2ZUFwcHJvdmVBY3Rpb24oZWxlbWVudCwgdXNlckFjdGlvbklkKSB7XHJcbiAgICBsZXQgYWN0aW9uSWQgPSAgZ2V0V2ZBY3Rpb25JZChlbGVtZW50LnZhbHVlLnN0YXRlVHlwZSk7XHJcbiAgICBpZiAodXNlckFjdGlvbklkID09PSBSRUpFQ1QgJiYgdGhpcy5pc1BlbmRpbmcpIHtcclxuICAgICAgYWN0aW9uSWQgPTNcclxuICAgIH1cclxuICAgIGxldCByZXF1ZXN0ID0gbmV3IERvQWN0aW9uUmVxdWVzdCgpO1xyXG4gICAgcmVxdWVzdC5hY3Rpb25JZCA9IGFjdGlvbklkO1xyXG4gICAgcmVxdWVzdC5zdWJqZWN0ID0gZWxlbWVudC52YWx1ZTtcclxuXHJcbiAgICBpZiAodGhpcy5hY3Rpb25SZXF1ZXN0Q2FsbGJhY2spIHtcclxuICAgICAgcmVxdWVzdCA9IHRoaXMuYWN0aW9uUmVxdWVzdENhbGxiYWNrKHJlcXVlc3QpO1xyXG4gICAgICBpZiAocmVxdWVzdC5zdWJqZWN0LmlkID09PSBcIlwiKSB7XHJcbiAgICAgICAgcmVxdWVzdC5zdWJqZWN0LmlkID0gbnVsbDtcclxuICAgICAgICByZXF1ZXN0LnN1YmplY3Quc3RhdGVUeXBlID0gXCJORVdcIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXF1ZXN0LnN1YmplY3QuaWQgPT09IFwiXCIpIHtcclxuICAgICAgcmVxdWVzdC5zdWJqZWN0LmlkID0gbnVsbDtcclxuICAgICAgcmVxdWVzdC5zdWJqZWN0LnN0YXRlVHlwZSA9IFwiTkVXXCI7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQWN0aW9uQ29tbWVudENvbXBvbmVudCwge1xyXG4gICAgICBkYXRhOiB7bGFiZWw6IHVzZXJBY3Rpb25JZCA9PT0gMiA/ICdzYXZlJyA6ICdyZWplY3QnLCBpc1Rlcm1pbmF0aW9uOiBmYWxzZX0sXHJcbiAgICAgIHdpZHRoOiAnNjAwcHgnLFxyXG4gICAgICBoZWlnaHQ6ICdhdXRvJyxcclxuICAgICAgZGlyZWN0aW9uOiAgdGhpcy5jdXJyZW50RGlyZWN0aW9uXHJcbiAgICB9KTtcclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgcmVxdWVzdC5jb21tZW50ID0gcmVzdWx0LmNvbW1lbnQ7XHJcbiAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5kb0FjdGlvbldpdGhBdHRhY2htZW50cyhyZXF1ZXN0LCBbXSwgdGhpcy5wYWdlSW5mbyEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwLnZhbGlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZERhdGEoKTtcclxuICAgICAgICAgICAgbGV0ICBtZXNzYWdlID0gJyc7XHJcbiAgICAgICAgICAgIGlmIChhY3Rpb25JZCA9PT0gMSApIHtcclxuICAgICAgICAgICAgICBtZXNzYWdlID0gJ3NhdmVkX3N1Y2Nlc3NmdWxseScgO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbklkID09PTIgKSB7XHJcbiAgICAgICAgICAgICAgbWVzc2FnZSA9ICd1cGRhdGVkX3N1Y2Nlc3NmdWxseSc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uSWQgPT09MyApIHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnc3VjY2Vzc2Z1bF9yZWplY3RfbWVzc2FnZSc7XHJcbiAgICAgICAgICAgIH0gIGVsc2UgaWYgKGFjdGlvbklkID09PTQgKSB7XHJcbiAgICAgICAgICAgICAgbWVzc2FnZSA9ICdhcHByb3ZlX3N1Y2Nlc3NmdWxseSc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS50b3BQYW5lbE1lc3NhZ2UkLm5leHQobmV3IFNuYWNrTWVzc2FnZShtZXNzYWdlLCB0cnVlLCAnc3VjY2VzcycpKTtcclxuICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgeCA9IHJlc3AubWVzc2FnZT8ubGVuZ3RoID4wID8gcmVzcC5tZXNzYWdlWzBdLmVycm9yTWVzc2FnZSA6ICdGQUlMRURfQ09OVEFDVF9BRE1JTic7XHJcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UudG9wUGFuZWxNZXNzYWdlJC5uZXh0KG5ldyBTbmFja01lc3NhZ2UoeCwgdHJ1ZSwgJ2Vycm9yJykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zYXZlQWN0aW9uRW1pdHRlci5lbWl0KHtpdGVtOnJlcXVlc3Quc3ViamVjdCwgcmVzcH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGdldFBvc2l0aXZlV2ZBY3Rpb25LZXkgPSBnZXRQb3NpdGl2ZVdmQWN0aW9uS2V5O1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBnZXROZWdhdGl2ZVdmQWN0aW9uS2V5ID0gZ2V0TmVnYXRpdmVXZkFjdGlvbktleTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgU0FWRSA9IFNBVkU7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IFJFSkVDVCA9IFJFSkVDVDtcclxuXHJcblxyXG4gIHNldE1vbnRoQW5kWWVhcihub3JtYWxpemVkTW9udGhBbmRZZWFyOiBNb21lbnQsIHBpY2tlcjogTWF0RGF0ZXBpY2tlcjxNb21lbnQ+LCBlbGVtZW50LCBjb2x1bW4pIHtcclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRm9ybUNvbnRyb2wobW9tZW50KCkpO1xyXG4gICAgY29uc3QgY3RybFZhbHVlID0gZGF0ZS52YWx1ZTtcclxuICAgIGN0cmxWYWx1ZS55ZWFyKG5vcm1hbGl6ZWRNb250aEFuZFllYXIueWVhcigpKTtcclxuICAgIGN0cmxWYWx1ZS5tb250aCgxKTtcclxuICAgIGN0cmxWYWx1ZS5kYXlPZlllYXIoMSk7XHJcbiAgICBlbGVtZW50LmNvbnRyb2xzW2NvbHVtbi5wcm9wZXJ0eV0uc2V0VmFsdWUoY3RybFZhbHVlKTtcclxuICAgIHBpY2tlci5jbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgc3dpdGNoVmlld01vZGUoYjogYm9vbGVhbikge1xyXG4gICAgdGhpcy5pc1BlbmRpbmcgPSBiO1xyXG4gICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgb25DaGlwU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiBhbnksIGxpc3Rib3g/OiBNYXRDaGlwTGlzdGJveCk6IHZvaWQge1xyXG4gICAgY29uc3QgdmFsdWUgPSBldmVudC52YWx1ZTtcclxuICAgIGlmICh2YWx1ZSAhPT0gJ0NPTVBMRVRFRCcgJiYgdmFsdWUgIT09ICdQRU5ESU5HJykge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGxpc3Rib3ggJiYgKGxpc3Rib3gudmFsdWUgPSB0aGlzLmlzUGVuZGluZyA/ICdQRU5ESU5HJyA6ICdDT01QTEVURUQnKSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGlzUGVuZGluZyA9IHZhbHVlID09PSAnUEVORElORyc7XHJcbiAgICBpZiAodGhpcy5pc1BlbmRpbmcgIT09IGlzUGVuZGluZykgdGhpcy5zd2l0Y2hWaWV3TW9kZShpc1BlbmRpbmcpO1xyXG4gIH1cclxuXHJcbiAgYWRkQnVsa0l0ZW1zKCkge1xyXG4gICAgY29uc3QgbWVyZ2VkOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIHRoaXMuZGF0YUZvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChncm91cDogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICAgIG1lcmdlZC5wdXNoKGdyb3VwLnZhbHVlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCByZXF1ZXN0ID0gbmV3IERvQWN0aW9uUmVxdWVzdCgpO1xyXG4gICAgcmVxdWVzdC5hY3Rpb25JZCA9IDE7XHJcblxyXG4gICAgcmVxdWVzdC5zdWJqZWN0ID0geyBpbnZvaWNlczogbWVyZ2VkIH07XHJcblxyXG4gICAgaWYgKHRoaXMuYWN0aW9uUmVxdWVzdENhbGxiYWNrKSB7XHJcbiAgICAgIHJlcXVlc3QgPSB0aGlzLmFjdGlvblJlcXVlc3RDYWxsYmFjayhyZXF1ZXN0KTtcclxuXHJcbiAgICAgIHJlcXVlc3Quc3ViamVjdC5pbnZvaWNlcyA9IHJlcXVlc3Quc3ViamVjdC5pbnZvaWNlcy5tYXAoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLmlkID09PSBcIlwiKSB7XHJcbiAgICAgICAgICBpdGVtLmlkID0gbnVsbDtcclxuICAgICAgICAgIGl0ZW0uc3RhdGVUeXBlID0gXCJORVdcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlcXVlc3Quc3ViamVjdC5pbnZvaWNlcyA9IHJlcXVlc3Quc3ViamVjdC5pbnZvaWNlcy5tYXAoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5pZCA9PT0gXCJcIikge1xyXG4gICAgICAgIGl0ZW0uaWQgPSBudWxsO1xyXG4gICAgICAgIGl0ZW0uc3RhdGVUeXBlID0gXCJORVdcIjtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gaXRlbTtcclxuICAgIH0pO1xyXG5cclxuXHJcblxyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihBY3Rpb25Db21tZW50Q29tcG9uZW50LCB7XHJcbiAgICAgIGRhdGE6IHtsYWJlbDogICdzYXZlJyAsIGlzVGVybWluYXRpb246IGZhbHNlfSxcclxuICAgICAgd2lkdGg6ICc2MDBweCcsXHJcbiAgICAgIGhlaWdodDogJ2F1dG8nLFxyXG4gICAgICBkaXJlY3Rpb246ICB0aGlzLmN1cnJlbnREaXJlY3Rpb25cclxuICAgIH0pO1xyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICByZXF1ZXN0LmNvbW1lbnQgPSByZXN1bHQuY29tbWVudDtcclxuICAgICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmRvQWN0aW9uV2l0aEF0dGFjaG1lbnQocmVxdWVzdCwgdGhpcy5zZWxlY3RlZEZpbGVGcm9tVXBsb2FkZXIsIHRoaXMucGFnZUluZm8hKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcC52YWxpZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyQnVsa0l0ZW1zKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UudG9wUGFuZWxNZXNzYWdlJC5uZXh0KG5ldyBTbmFja01lc3NhZ2UoJ3NhdmVkX3N1Y2Nlc3NmdWxseScsIHRydWUsICdzdWNjZXNzJykpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UudG9wUGFuZWxNZXNzYWdlJC5uZXh0KG5ldyBTbmFja01lc3NhZ2UodGhpcy5wYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgJy4nICsgcmVzcC5tZXNzYWdlPy5bMF0/LmVycm9yQ29kZSwgdHJ1ZSwgJ2Vycm9yJykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zYXZlQXR0YWNobWVudEVtaXR0ZXIuZW1pdCh7aXRlbTpyZXF1ZXN0LnN1YmplY3QsIHJlc3B9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7ICB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVVcGxvYWQnKSBmaWxlVXBsb2FkOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG5cclxuICBoYW5kbGVGaWxlVXBsb2FkKCRldmVudDogRmlsZSkge1xyXG4gICAgbGV0IGFjdGlvbklkID0gIGdldFdmQWN0aW9uSWQoJ05FVycpO1xyXG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgRG9BY3Rpb25SZXF1ZXN0KCk7XHJcbiAgICByZXF1ZXN0LmFjdGlvbklkID0gYWN0aW9uSWQ7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVGcm9tVXBsb2FkZXIgPSAkZXZlbnQ7XHJcblxyXG4gIH1cclxuXHJcbiAgc2hvdWxkRGlzYWJsZUJ1bGtBZGQoKSB7XHJcbiAgICBjb25zdCBoYXNGaWxlID0gISF0aGlzLnNlbGVjdGVkRmlsZUZyb21VcGxvYWRlcjtcclxuICAgIHJldHVybiAoIXRoaXMuZm9ybVBhcmFtPy52YWxpZCB8fCB0aGlzLmRhdGFGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoID09PSAwKSAmJiAhaGFzRmlsZTtcclxuICB9XHJcbiAgaGFuZGxlRXF1YXRpb25DaGFuZ2UoZXZlbnQ6IHsgdmFsdWU6IGFueVtdLCB2YWxpZDogYm9vbGVhbiB9LCBlbGVtZW50OiBGb3JtR3JvdXAsIGNvbHVtbjogYW55KTogdm9pZCB7XHJcbiAgICBlbGVtZW50LnZhbHVlW2NvbHVtbi5wcm9wZXJ0eV0gPSBldmVudC52YWx1ZTtcclxuICAgIGNvbnN0IHsgdmFsdWUsIHZhbGlkIH0gPSBldmVudDtcclxuICAgIGVsZW1lbnQuZ2V0KGNvbHVtbi5wcm9wZXJ0eSk/LnNldFZhbHVlKHZhbHVlKTtcclxuICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgZWxlbWVudC5nZXQoY29sdW1uLnByb3BlcnR5KT8uc2V0RXJyb3JzKHsgaW52YWxpZEVxdWF0aW9uOiB0cnVlIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZWxlbWVudC5nZXQoY29sdW1uLnByb3BlcnR5KT8uc2V0RXJyb3JzKG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xlYXJCdWxrSXRlbXMoKSB7XHJcbiAgICB0aGlzLmRhdGFFbGVtZW50cyA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVGcm9tVXBsb2FkZXIgPSBudWxsO1xyXG4gICAgdGhpcy51cGxvYWRlckNvbXBvbmVudC5jbGVhckZpbGUoKTtcclxuICAgIHRoaXMuYnVpbGRGb3JtKCk7XHJcbiAgICB0aGlzLmZvcm1VcGRhdGVkLmVtaXQodGhpcy5mb3JtUGFyYW0pO1xyXG4gIH1cclxuXHJcbiAgaGFzRGF0YVRvQ2xlYXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuZGF0YUVsZW1lbnRzICYmIHRoaXMuZGF0YUVsZW1lbnRzLmxlbmd0aCA+IDApIHx8ICEhdGhpcy5zZWxlY3RlZEZpbGVGcm9tVXBsb2FkZXI7XHJcbiAgfVxyXG5nZXRPcHRpb25WYWx1ZShpdGVtOiBhbnkpIHtcclxuICAgIGNvbnN0IHZhbHVlID0gdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnID9cclxuICAgICAgaXRlbS5lbmdsaXNoTmFtZSA6IGl0ZW07XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBkaXNhYmxlZFNhdmVCdXR0b24oZWxlbWVudCkge1xyXG4gICAgcmV0dXJuICFlbGVtZW50LnZhbGlkIHx8ICghdGhpcy5pc1BlbmRpbmcgJiYgZWxlbWVudC52YWx1ZS5zdGF0ZVR5cGUgPT0gJ1BFTkRJTkcnKTtcclxuICB9XHJcblxyXG4gIGRvU2VhcmNoKCkge1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoRm9ybS52YWxpZCkge1xyXG4gICAgICBjb25zdCByYXdWYWx1ZXMgPSB0aGlzLnNlYXJjaEZvcm0uZ2V0UmF3VmFsdWUoKTtcclxuICAgICAgdGhpcy5maWx0ZXJSZXF1ZXN0LnBhZ2VJbmRleD0wO1xyXG4gICAgICB0aGlzLmZpbHRlclJlcXVlc3QuZmlsdGVycyA9IFtdO1xyXG4gICAgICB0aGlzLnNlYXJjaEZvcm1GaWVsZHMuZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmF3VmFsdWVzW3gucHJvcGVydHldO1xyXG4gICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgICAgICAgIGtleTogMCxcclxuICAgICAgICAgICAgICBsYWJlbDogeC5wcm9wZXJ0eSxcclxuICAgICAgICAgICAgICBmaWVsZE5hbWU6IHguc2VhcmNoQXR0cmlidXRlLFxyXG4gICAgICAgICAgICAgIHZhbHVlT2JqZWN0IDogeC5zZWFyY2hBdHRyaWJ1dGUuaW5jbHVkZXMoJy4nKSA/IHZhbHVlW3guc2VhcmNoQXR0cmlidXRlLnNwbGl0KCcuJykucG9wKCldIDogdmFsdWUsXHJcbiAgICAgICAgICAgICAgb3BlcmF0b3I6IHguc2VhcmNoT3BlcmF0b3IsXHJcbiAgICAgICAgICAgICAgZmlsdGVyVHlwZTogJ0ZJTEVEX0ZJTFRFUidcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyUmVxdWVzdC5maWx0ZXJzLnB1c2goZmlsdGVyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UudG9wUGFuZWxNZXNzYWdlJC5uZXh0KG5ldyBTbmFja01lc3NhZ2UoJ0lOVkFMSURfU0VBUkNIX0ZPUk0nLCB0cnVlLCAnZXJyb3InKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93U2VhcmNoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoRm9ybUZpZWxkcz8ubGVuZ3RoID4gMDtcclxuICB9XHJcblxyXG4gIGNsZWFyU2VhcmNoKCkge1xyXG4gICAgdGhpcy5zZWFyY2hGb3JtLmdldCgnc2VjdG9yVHlwZScpLnNldFZhbHVlKHtpZDotMTAwLCBlbmdsaXNoTmFtZTonYWFhJywgY29kZTonYWFhJywgYXJhYmljTmFtZTonYWFhJ30pO1xyXG4gICAgdGhpcy5zZWFyY2hGb3JtLnJlc2V0KCk7XHJcbiAgICB0aGlzLmRvU2VhcmNoKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVTZWFyY2hGb3JtKCRldmVudDogRm9ybUdyb3VwKSB7XHJcbiAgICB0aGlzLnNlYXJjaEZvcm0gPSAkZXZlbnRcclxuICB9XHJcblxyXG4gIHZhbGlkU2VhcmNoRGF0YSgpIHtcclxuICAgIHJldHVybiAhdGhpcy5zZWFyY2hGb3JtLnZhbGlkIHx8IHRydWU7XHJcbiAgfVxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiYmFzZVRhYmxlIGZsZXgtY29sdW1uXCI+XHJcbiAgPGRpdiBjbGFzcz1cImxlZnQtYWxpZ25cIj5cclxuICAgIDxhcHAtYXR0YWNobWVudC11cGxvYWRlciAjdXBsb2FkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzQnVsa0l0ZW1zU3VwcG9ydGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZVNlbGVjdGVkKT1cImhhbmRsZUZpbGVVcGxvYWQoJGV2ZW50KVwiPlxyXG4gICAgPC9hcHAtYXR0YWNobWVudC11cGxvYWRlcj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGZ1bGwtd2lkdGhcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LWhhbGYgZmxleC1jb2x1bW4gYWxpZ24tY2VudGVyLXN0YXJ0XCI+XHJcbiAgICAgIDxhcHAtdGl0bGUtYmFyIFtwYWdlVGl0bGVdPVwicGFnZUluZm8uaGlkZVRpdGxlID8gJycgOiBwYWdlSW5mby5sYWJlbHNTZWN0aW9uKycubGlzdF90aXRsZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbdGl0bGVNb2RlXT1cIicnXCJcclxuICAgICAgICAgICAgICAgICAgICAgW25ld0FjdGlvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtzaG93RXh0cmFjdEJ1dHRvbl09XCIhcGFnZUluZm8uaGlkZUV4dHJhY3RCdXR0b25cIj5cclxuICAgICAgPC9hcHAtdGl0bGUtYmFyPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImZvbnQtc21hbGxcIj57eyAndG90YWxDb3VudEl0ZW0nIHwgdHJhbnNsYXRlIH19IDoge3sgdGhpcy50b3RhbEVsZW1lbnRzIH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleC1oYWxmIGZsZXgtY29sdW1uIGFsaWduLXN0YXJ0LWVuZFwiPlxyXG4gICAgICA8bWF0LWNoaXAtbGlzdGJveCAjYm94IGFyaWEtbGFiZWw9XCJDb2xvciBzZWxlY3Rpb25cIiBbbXVsdGlwbGVdPVwiZmFsc2VcIiBbdmFsdWVdPVwiaXNQZW5kaW5nID8gJ1BFTkRJTkcnIDogJ0NPTVBMRVRFRCdcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKGNoYW5nZSk9XCJvbkNoaXBTZWxlY3Rpb25DaGFuZ2UoJGV2ZW50LCBib3gpXCIgKm5nSWY9XCJwYWdlSW5mby5kcmFmdFN1cHBvcnRlZFwiPlxyXG4gICAgICAgIDxtYXQtY2hpcC1vcHRpb24gW3NlbGVjdGVkXT1cIiFpc1BlbmRpbmdcIiBbY29sb3JdPVwiJ2FjY2VudCdcIiB2YWx1ZT1cIkNPTVBMRVRFRFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgIHt7ICdmaW5pc2hlZCcgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICA8L21hdC1jaGlwLW9wdGlvbj5cclxuICAgICAgICA8bWF0LWNoaXAtb3B0aW9uIFtzZWxlY3RlZF09XCJpc1BlbmRpbmdcIiBbY29sb3JdPVwiJ2FjY2VudCdcIiB2YWx1ZT1cIlBFTkRJTkdcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICB7eyAndG9kbycgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICA8L21hdC1jaGlwLW9wdGlvbj5cclxuICAgICAgPC9tYXQtY2hpcC1saXN0Ym94PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93U2VhcmNoKClcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdyBmdWxsLXdpZHRoXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTgwIGZsZXgtY29sdW1uIGFsaWduLXN0YXJ0LWVuZFwiPlxyXG4gICAgICAgIDxhcHAtYmFzZS1mb3JtLWNhbnZhcyBjbGFzcz1cImZsZXgtZmlsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYWdlSW5mb109XCJwYWdlSW5mb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZHNdPVwic2VhcmNoRm9ybUZpZWxkc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlZGl0YWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1VcGRhdGVkKT1cInVwZGF0ZVNlYXJjaEZvcm0oJGV2ZW50KVwiPlxyXG4gICAgICAgIDwvYXBwLWJhc2UtZm9ybS1jYW52YXM+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xNSBmbGV4LWNvbHVtbiBhbGlnbi1zdGFydC1lbmRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3cgYWxpZ24tY2VudGVyLWNlbnRlciBnYXAtOCBmdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJkb1NlYXJjaCgpXCIgaWQ9XCJlZGl0YWJsZS1zZWFyY2gtYnRuXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5zZWFyY2g8L21hdC1pY29uPlxyXG4gICAgICAgICAgICB7eyAnc2VhcmNoJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjbGVhclNlYXJjaCgpXCIgaWQ9XCJlZGl0YWJsZS1jbGVhci1zZWFyY2gtYnRuXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5jbGVhcjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIHt7ICdjbGVhcicgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiZmxleC1yb3cgZnVsbC13aWR0aCBiYXNlVGFibGVfX2RldGFpbHNDb2x1bW5cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LWZ1bGxcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTG9hZGVkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93IG1haW5UYWJsZSBnYXAtMCBhbGlnbi1zdGFydC1zdGFydFwiPlxyXG4gICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtUGFyYW1cIiBjbGFzcz1cImZsZXgtZmlsbFwiPlxyXG4gICAgICAgICAgICA8dGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YUZvcm1BcnJheS5jb250cm9sc1wiIGNsYXNzPVwiZmxleC1maWxsXCIgbWF0LXRhYmxlIG1hdFNvcnQ+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIHRoaXMuZmllbGRzOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInt7Y29sdW1uLnByb3BlcnR5fX1cIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sdW1uLnR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZXF1YXRpb24tYnVpbGRlcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIm1haW5UYWJsZV9fdGhcIiBtYXQtaGVhZGVyLWNlbGw+e3sgbGFiZWxLZXkoY29sdW1uKSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJbJ21haW5UYWJsZV9fdGRfX3RleHQtc2Vjb25kYXJ5X190ZCddXCIgbWF0LWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItZXF1YXRpb24tYnVpbGRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImVsZW1lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjb2x1bW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJjb2x1bW4ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1BlbmRpbmddPVwiaXNQZW5kaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cImhhbmRsZUVxdWF0aW9uQ2hhbmdlKCRldmVudCwgZWxlbWVudCwgY29sdW1uKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1lcXVhdGlvbi1idWlsZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2xvb2t1cCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIm1haW5UYWJsZV9fdGhcIiBtYXQtaGVhZGVyLWNlbGw+e3sgbGFiZWxLZXkoY29sdW1uKSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJbJ21haW5UYWJsZV9fdGRfX3RleHQtc2Vjb25kYXJ5X190ZCddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1hdXRvLWNvbXBsZXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZWxlbWVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImNvbHVtblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRWYWx1ZV09XCJlbGVtZW50LmdldChjb2x1bW4ucHJvcGVydHkpPy52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkVmFsdWUpPVwicGF0Y2hMb29rdXBWYWx1ZSgkZXZlbnQsIGNvbHVtbi5wcm9wZXJ0eSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtYXV0by1jb21wbGV0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2xpc3QnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGggKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJtYWluVGFibGVfX3RoXCIgbWF0LWhlYWRlci1jZWxsPnt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkICAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7ZWxlbWVudH19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3tjb2x1bW4ucHJvcGVydHl9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjb2x1bW4ubGFiZWwhIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFsodmFsdWUpXT1cImVsZW1lbnRbY29sdW1uLnByb3BlcnR5XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjb2x1bW4ubGlzdE9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRPcHRpb25WYWx1ZShpdGVtKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzdGF0ZVR5cGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGggKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJtYWluVGFibGVfX3RoXCIgbWF0LWhlYWRlci1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnYWN0aW9uJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkIG1haW5UYWJsZV9fdGRfX3RleHQtc2Vjb25kYXJ5X190ZFwiIG1hdC1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3cgZnVsbC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtdGhpcmQgZmxleC1jb2x1bW4gYWxpZ24tY2VudGVyLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJidG4tbm9uZS1iYWNrZ3JvdW5kLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkU2F2ZUJ1dHRvbihlbGVtZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZpZWxkQnV0dG9uRXZlbnQoY29sdW1uLGVsZW1lbnQsU0FWRSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIidlZGl0YWJsZS1zYXZlLScgKyAoZWxlbWVudC52YWx1ZT8uaWQgfHwgJycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0UG9zaXRpdmVXZkFjdGlvbktleShlbGVtZW50LnZhbHVlLnN0YXRlVHlwZSkgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXRoaXJkIGZsZXgtY29sdW1uIGFsaWduLWNlbnRlci1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzUGVuZGluZ1wiIG1hdC1idXR0b24gY2xhc3M9XCJidG4tbm9uZS1iYWNrZ3JvdW5kLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwiYWNjZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZmllbGRCdXR0b25FdmVudChjb2x1bW4sZWxlbWVudCxSRUpFQ1QpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCInZWRpdGFibGUtcmVqZWN0LScgKyAoZWxlbWVudC52YWx1ZT8uaWQgfHwgJycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0TmVnYXRpdmVXZkFjdGlvbktleShlbGVtZW50LnZhbHVlLnN0YXRlVHlwZSkgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXRoaXJkIGZsZXgtY29sdW1uIGFsaWduLWNlbnRlci1jZW50ZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid5ZWFyJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibWFpblRhYmxlX190aFwiIG1hdC1oZWFkZXItY2VsbD57eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBjbGFzcz1cIm1haW5UYWJsZV9fdGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlsnbWFpblRhYmxlX190ZF9fdGV4dC1zZWNvbmRhcnlfX3RkJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmbGV4LWF1dG8gZngtZmxleC1maWxsXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbHVtbi5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJjb2x1bW4ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJwaWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cIm1pbkRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZ2V0RmllbGQoZWxlbWVudCwgY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJjb2x1bW4ucmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cImNvbHVtbi5yZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGNvbHVtbi5wcm9wZXJ0eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiJ2Vycm9yLScgKyBjb2x1bW4ucHJvcGVydHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cInBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjcGlja2VyIHN0YXJ0Vmlldz1cIm11bHRpLXllYXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeWVhclNlbGVjdGVkKT1cInNldE1vbnRoQW5kWWVhcigkZXZlbnQsIHBpY2tlciwgZWxlbWVudCxjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxDbGFzcz1cImV4YW1wbGUtbW9udGgtcGlja2VyXCI+PC9tYXQtZGF0ZXBpY2tlcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZmxleC1hdXRvXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBmeEZsZXhGaWxsPi0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJnZXRGaWVsZChlbGVtZW50LCBjb2x1bW4pXCI+LS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD4tLT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIm1haW5UYWJsZV9fdGhcIiBtYXQtaGVhZGVyLWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXgtYXV0byBmeC1mbGV4LWZpbGxcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVmlzdWFsbHkgaGlkZGVuIGxhYmVsIGp1c3QgdG8gdHJpZ2dlciB0aGUgZmxvYXRpbmcgbGFiZWwgYW5kIGFzdGVyaXNrIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldEZpZWxkKGVsZW1lbnQsIGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImNvbHVtbi5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidsYWJlbC0nICsgY29sdW1uLnByb3BlcnR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCInZXJyb3ItJyArIGNvbHVtbi5wcm9wZXJ0eVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3RhdHVzJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibWFpblRhYmxlX190aFwiIG1hdC1oZWFkZXItY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFiZWxLZXkoY29sdW1uKSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJbJ21haW5UYWJsZV9fdGRfX3RleHQtc2Vjb25kYXJ5X190ZCddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1ib3R0b206IDE0cHg7IHBhZGRpbmctdG9wOiAxNHB4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldEZpZWxkKGVsZW1lbnQsIGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJjb2x1bW4ucmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2xhYmVsLScgKyBjb2x1bW4ucHJvcGVydHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiJ2Vycm9yLScgKyBjb2x1bW4ucHJvcGVydHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5wb2ludGVyLWV2ZW50c109XCJjb2x1bW4ucmVhZG9ubHkgPyAnbm9uZScgOiAnYXV0bydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5vcGFjaXR5XT1cImNvbHVtbi5yZWFkb25seSA/IDAuNyA6IDFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb2x1bW4ucmVhZG9ubHkgPyAkZXZlbnQucHJldmVudERlZmF1bHQoKSA6IG51bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0ZXh0J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibWFpblRhYmxlX190aFwiIG1hdC1oZWFkZXItY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFiZWxLZXkoY29sdW1uKSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJbJ21haW5UYWJsZV9fdGRfX3RleHQtc2Vjb25kYXJ5X190ZCddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZmxleC1hdXRvIGZ4LWZsZXgtZmlsbFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZ2V0RmllbGQoZWxlbWVudCwgY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJjb2x1bW4ucmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiY29sdW1uLnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJjb2x1bW4ucmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2xhYmVsLScgKyBjb2x1bW4ucHJvcGVydHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIidlcnJvci0nICsgY29sdW1uLnByb3BlcnR5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibWFpblRhYmxlX190aFwiIG1hdC1oZWFkZXItY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFiZWxLZXkoY29sdW1uKSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJbJ21haW5UYWJsZV9fdGRfX3RleHQtc2Vjb25kYXJ5X190ZCddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZmxleC1hdXRvIGZ4LWZsZXgtZmlsbFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cInhwaWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cIm1pbkRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZ2V0RmllbGQoZWxlbWVudCwgY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJjb2x1bW4ucmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiY29sdW1uLnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbHVtbi5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidsYWJlbC0nICsgY29sdW1uLnByb3BlcnR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCInZXJyb3ItJyArIGNvbHVtbi5wcm9wZXJ0eVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcl09XCJ4cGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4ucmVhZG9ubHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI3hwaWNrZXI+PC9tYXQtZGF0ZXBpY2tlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIm1haW5UYWJsZV9fdGhcIiBtYXQtaGVhZGVyLWNlbGw+e3sgbGFiZWxLZXkoY29sdW1uKSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJbJ21haW5UYWJsZV9fdGRfX3RleHQtc2Vjb25kYXJ5X190ZCddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZmxleC1hdXRvIGZ4LWZsZXgtZmlsbFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJjb2x1bW4ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cImNvbHVtbi5yZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJnZXRGaWVsZChlbGVtZW50LCBjb2x1bW4pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDx0ciAqbWF0SGVhZGVyUm93RGVmPVwidmlzaWJsZUNvbHVtbnNcIiBtYXQtaGVhZGVyLXJvdz48L3RyPlxyXG4gICAgICAgICAgICAgIDx0ciAoY2xpY2spPVwib25TZWxlY3RJdGVtKHJvdylcIiAoYXV4Y2xpY2spPVwib3Blbk5ld1RhYihyb3cpXCJcclxuICAgICAgICAgICAgICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IHZpc2libGVDb2x1bW5zICB8IHBhZ2luYXRlOmNvbmZpZ1wiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIidlZGl0YWJsZS1yb3ctJyArIChyb3c/LnZhbHVlPy5pZCB8fCByb3c/LnZhbHVlPy5rZXkgfHwgJycpXCJcclxuICAgICAgICAgICAgICAgICAgbWF0LXJvdz48L3RyPlxyXG4gICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwibm9EYXRhRm91bmQgJiYgIXBhZ2VJbmZvLmxhenlMb2FkRGF0YVwiIGNsYXNzPVwiZmxleC1yb3cgZGF0YU5vdEZvdW5kXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2x1bW4gZmxleC1mdWxsXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0YU5vdEZvdW5kX19kZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiZGF0YU5vdEZvdW5kX19kZXRhaWxzX19pY29uXCI+aW5mbzwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3sgJ2RhdGFOb3RGb3VuZCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3cgbWFpblRhYmxlXCIgKm5nSWY9XCIhc2VsZWN0ZWRGaWxlRnJvbVVwbG9hZGVyXCI+XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWlzUGVuZGluZyAmJiBwYWdlSW5mby5oYXNBZGRCdXR0b25cIiBtYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROZXdJdGVtKClcIiBpZD1cImVkaXRhYmxlLWFkZC1pdGVtLWJ0blwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5hZGRfYm94PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICB7eyB0cmFuc2xhdGlvbktleSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3cgZmxleC13cmFwIGFsaWduLWNlbnRlci1jZW50ZXIgbWFpbi1wYWdpbmF0aW9uXCIgKm5nSWY9XCJ0b3RhbEVsZW1lbnRzID4gMFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uIGZsZXgtZnVsbFwiPlxyXG4gICAgICAgICAgICA8YXBwLXBhZ2luYXRvciBbY3VycmVudFBhZ2VdPVwicGFnZUluZGV4XCIgW3RvdGFsSXRlbXNdPVwidG90YWxFbGVtZW50c1wiIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwiWzUsIDEwLCAyNSwgNTBdXCIgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+PC9hcHAtcGFnaW5hdG9yPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2x1bW4gZmxleC1mdWxsIGNvdW50SXRlbSBoaWRlLWd0LXhzXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY291bnRJdGVtX190b3RhbEVsZW1lbnRcIj57eyAndG90YWxDb3VudEl0ZW0nIHwgdHJhbnNsYXRlIH19IDoge3sgdGhpcy50b3RhbEVsZW1lbnRzIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2x1bW4gZmxleC0yXCI+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJpc0J1bGtJdGVtc1N1cHBvcnRlZFwiIGNsYXNzPVwiZmxleC1yb3cgZ2FwLTEwIGFsaWduLXN0YXJ0LXN0YXJ0IG1haW5UYWJsZVwiPlxyXG4gICAgPGRpdj5cclxuICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJhZGRCdWxrSXRlbXMoKVwiIFtkaXNhYmxlZF09XCJzaG91bGREaXNhYmxlQnVsa0FkZCgpXCIgaWQ9XCJlZGl0YWJsZS1idWxrLWFkZC1idG5cIj5cclxuICAgICAgICA8bWF0LWljb24+YWRkX2JveDwvbWF0LWljb24+XHJcbiAgICAgICAge3sgJ2FkZEFsbCcgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwid2FyblwiIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiIWhhc0RhdGFUb0NsZWFyKClcIiAoY2xpY2spPVwiY2xlYXJCdWxrSXRlbXMoKVwiIGlkPVwiZWRpdGFibGUtYnVsay1jbGVhci1idG5cIj5cclxuICAgICAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cclxuICAgICAgICB7eyAnY2xlYXJBbGwnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
507
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGFibGUtYmFzZS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2VkaXRhYmxlLWJhc2UtdGFibGUvZWRpdGFibGUtYmFzZS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2VkaXRhYmxlLWJhc2UtdGFibGUvZWRpdGFibGUtYmFzZS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsT0FBTyxFQUNQLFVBQVUsRUFDVixZQUFZLEVBQ1osYUFBYSxFQUNiLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osZUFBZSxFQUNmLE1BQU0sRUFDTixTQUFTLEVBQ1QsUUFBUSxFQUNULE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxFQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRCxPQUFPLEVBQTBD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RkFBNEY7b0JBQzVGLDhGQUE4RjtvQkFDOUYsaUNBQWlDO29CQUNqQyxJQUFJO29CQUNKLDBCQUEwQjtvQkFDMUIsaUNBQWlDO29CQUNqQyw4REFBOEQ7b0JBQzlELEtBQUs7b0JBRUwsdURBQXVEO3FCQUN4RDt1TEFxQ0QsYUFBYTtzQkFEWixLQUFLO2dCQUlOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFJRyxRQUFRO3NCQURoQixLQUFLO2dCQUlOLGNBQWM7c0JBRGIsS0FBSztnQkFJTixTQUFTO3NCQURSLEtBQUs7Z0JBSU4sb0JBQW9CO3NCQURuQixLQUFLO2dCQUlDLE1BQU07c0JBRFosS0FBSztnQkFJQyxnQkFBZ0I7c0JBRHRCLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHTixXQUFXO3NCQURWLE1BQU07Z0JBSVAsaUJBQWlCO3NCQURoQixNQUFNO2dCQUdQLHFCQUFxQjtzQkFEcEIsTUFBTTtnQkFHRSxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRWlCLGlCQUFpQjtzQkFBdkMsU0FBUzt1QkFBQyxVQUFVO2dCQTRTSSxVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7XHJcbiAgTWF0Q2VsbCxcclxuICBNYXRDZWxsRGVmLFxyXG4gIE1hdENvbHVtbkRlZixcclxuICBNYXRIZWFkZXJDZWxsLFxyXG4gIE1hdEhlYWRlckNlbGxEZWYsXHJcbiAgTWF0SGVhZGVyUm93LFxyXG4gIE1hdEhlYWRlclJvd0RlZixcclxuICBNYXRSb3csXHJcbiAgTWF0Um93RGVmLFxyXG4gIE1hdFRhYmxlXHJcbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3RhYmxlXCI7XHJcbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xyXG5pbXBvcnQge01hdFNvcnRNb2R1bGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zb3J0XCI7XHJcbmltcG9ydCB7TmdDbGFzcywgTmdGb3JPZiwgTmdJZiwgTmdTd2l0Y2gsIE5nU3dpdGNoQ2FzZSwgTmdTd2l0Y2hEZWZhdWx0fSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7TWF0SWNvbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2ljb25cIjtcclxuaW1wb3J0IHtNYXRCdXR0b24sIE1hdEJ1dHRvbk1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2J1dHRvblwiO1xyXG5pbXBvcnQge05neFBhZ2luYXRpb25Nb2R1bGV9IGZyb20gXCJuZ3gtcGFnaW5hdGlvblwiO1xyXG5pbXBvcnQge1JvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7TWF0RXJyb3IsIE1hdEZvcm1GaWVsZCwgTWF0SW5wdXQsIE1hdExhYmVsLCBNYXRTdWZmaXh9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pbnB1dFwiO1xyXG5pbXBvcnQge0JhY2tlbmRTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vc2VydmljZXNcIjtcclxuaW1wb3J0IHtcclxuICBCYXNlVXRpbHMsXHJcbiAgYnVpbGRGb3JtRmllbGRzLFxyXG4gIGdldE5lZ2F0aXZlV2ZBY3Rpb25LZXksXHJcbiAgZ2V0UG9zaXRpdmVXZkFjdGlvbktleSxcclxuICBnZXRXZkFjdGlvbklkXHJcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL2Jhc2UtdXRpbHNcIjtcclxuaW1wb3J0IHtcclxuICBFTVBUWV9QQUdFX0lORk8sXHJcbiAgRmllbGRJbmZvLFxyXG4gIEZpbHRlcixcclxuICBGaWx0ZXJSZXF1ZXN0LFxyXG4gIExvb2t1cEl0ZW0sXHJcbiAgUGFnZUluZm8sXHJcbiAgU0VMRUNUX1JFQ09SRF9BQ1RJT04sXHJcbiAgU25hY2tNZXNzYWdlLFxyXG4gIFRhYmxlQ29sdW1uXHJcbn0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWxcIjtcclxuaW1wb3J0IHtEb0FjdGlvblJlcXVlc3QsIFJFSkVDVCwgU0FWRX0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvZG8tYWN0aW9uLXJlcXVlc3RcIjtcclxuaW1wb3J0IHtBY3Rpb25Db21tZW50Q29tcG9uZW50fSBmcm9tIFwiLi4vYWN0aW9uLWNvbW1lbnQvYWN0aW9uLWNvbW1lbnQuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XHJcbmltcG9ydCB7TWF0RGF0ZXBpY2tlciwgTWF0RGF0ZXBpY2tlcklucHV0LCBNYXREYXRlcGlja2VyVG9nZ2xlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlclwiO1xyXG5pbXBvcnQgbW9tZW50LCB7TW9tZW50fSBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQge0F1dG9Db21wbGV0ZUNvbXBvbmVudH0gZnJvbSBcIi4uL2F1dG8tY29tcGxldGUvYXV0by1jb21wbGV0ZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtEYXRlQWRhcHRlciwgTUFUX0RBVEVfRk9STUFUUywgTUFUX0RBVEVfTE9DQUxFLCBNYXRPcHRpb259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jb3JlXCI7XHJcbmltcG9ydCB7TWF0Q2hpcExpc3Rib3gsIE1hdENoaXBPcHRpb259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jaGlwc1wiO1xyXG5pbXBvcnQge1RpdGxlQmFyQ29tcG9uZW50fSBmcm9tIFwiLi4vdGl0bGUtYmFyL3RpdGxlLWJhci5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtQYWdpbmF0b3JDb21wb25lbnR9IGZyb20gXCIuLi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0RpcmVjdGlvbmFsaXR5fSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2JpZGlcIjtcclxuaW1wb3J0IHtBdHRhY2htZW50VXBsb2FkZXJDb21wb25lbnR9IGZyb20gXCIuLi9zaGFyZWQvYXR0YWNobWVudC11cGxvYWRlci9hdHRhY2htZW50LXVwbG9hZGVyLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0VxdWF0aW9uQnVpbGRlckNvbXBvbmVudH0gZnJvbSBcIi4uL2VxdWF0aW9uLWJ1aWxkZXIvZXF1YXRpb24tYnVpbGRlci5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtNYXRTZWxlY3R9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3RcIjtcclxuXHJcbmltcG9ydCB7QmFzZUZvcm1DYW52YXNDb21wb25lbnR9IGZyb20gXCIuLi9iYXNlLWZvcm0tY2FudmFzL2Jhc2UtZm9ybS1jYW52YXMuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7TWF0Q2hlY2tib3h9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveFwiO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1lZGl0YWJsZS1iYXNlLXRhYmxlJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9lZGl0YWJsZS1iYXNlLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9lZGl0YWJsZS1iYXNlLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW10sXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTmdDbGFzcyxcclxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcclxuICAgIE1hdEljb24sXHJcbiAgICBNYXRTb3J0TW9kdWxlLFxyXG4gICAgTWF0Q29sdW1uRGVmLFxyXG4gICAgTWF0SGVhZGVyQ2VsbERlZixcclxuICAgIE5nSWYsXHJcbiAgICBNYXRUYWJsZSxcclxuICAgIE1hdEhlYWRlckNlbGwsXHJcbiAgICBOZ1N3aXRjaCxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIE1hdENlbGwsXHJcbiAgICBNYXRDZWxsRGVmLFxyXG4gICAgTmd4UGFnaW5hdGlvbk1vZHVsZSxcclxuICAgIE1hdFJvdyxcclxuICAgIE1hdFJvd0RlZixcclxuICAgIE1hdEhlYWRlclJvdyxcclxuICAgIE5nU3dpdGNoQ2FzZSxcclxuICAgIE5nU3dpdGNoRGVmYXVsdCxcclxuICAgIE1hdEhlYWRlclJvd0RlZixcclxuICAgIE5nRm9yT2YsXHJcbiAgICBNYXRCdXR0b24sXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgTWF0SW5wdXQsXHJcbiAgICBBdXRvQ29tcGxldGVDb21wb25lbnQsXHJcbiAgICBNYXRGb3JtRmllbGQsXHJcbiAgICBNYXREYXRlcGlja2VyLFxyXG4gICAgTWF0RGF0ZXBpY2tlcklucHV0LFxyXG4gICAgTWF0RGF0ZXBpY2tlclRvZ2dsZSxcclxuICAgIE1hdExhYmVsLFxyXG4gICAgTWF0U3VmZml4LFxyXG4gICAgTWF0Q2hpcExpc3Rib3gsXHJcbiAgICBNYXRDaGlwT3B0aW9uLFxyXG4gICAgVGl0bGVCYXJDb21wb25lbnQsXHJcbiAgICBQYWdpbmF0b3JDb21wb25lbnQsXHJcbiAgICBBdHRhY2htZW50VXBsb2FkZXJDb21wb25lbnQsXHJcbiAgICBFcXVhdGlvbkJ1aWxkZXJDb21wb25lbnQsXHJcbiAgICBNYXRTZWxlY3QsXHJcbiAgICBNYXRPcHRpb24sXHJcbiAgICBCYXNlRm9ybUNhbnZhc0NvbXBvbmVudCxcclxuICAgIE1hdENoZWNrYm94LFxyXG4gIF0sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICAvLyBgTW9tZW50RGF0ZUFkYXB0ZXJgIGNhbiBiZSBhdXRvbWF0aWNhbGx5IHByb3ZpZGVkIGJ5IGltcG9ydGluZyBgTW9tZW50RGF0ZU1vZHVsZWAgaW4geW91clxyXG4gICAgLy8gYXBwbGljYXRpb24ncyByb290IG1vZHVsZS4gV2UgcHJvdmlkZSBpdCBhdCB0aGUgY29tcG9uZW50IGxldmVsIGhlcmUsIGR1ZSB0byBsaW1pdGF0aW9ucyBvZlxyXG4gICAgLy8gb3VyIGV4YW1wbGUgZ2VuZXJhdGlvbiBzY3JpcHQuXHJcbiAgICAvLyB7XHJcbiAgICAvLyAgIHByb3ZpZGU6IERhdGVBZGFwdGVyLFxyXG4gICAgLy8gICB1c2VDbGFzczogTW9tZW50RGF0ZUFkYXB0ZXIsXHJcbiAgICAvLyAgIGRlcHM6IFtNQVRfREFURV9MT0NBTEUsIE1BVF9NT01FTlRfREFURV9BREFQVEVSX09QVElPTlNdLFxyXG4gICAgLy8gfSxcclxuXHJcbiAgICAvLyB7IHByb3ZpZGU6IE1BVF9EQVRFX0ZPUk1BVFMsIHVzZVZhbHVlOiBNWV9GT1JNQVRTIH0sXHJcbiAgXSxcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBFZGl0YWJsZUJhc2VUYWJsZUNvbXBvbmVudCBleHRlbmRzIEJhc2VVdGlscyBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuXHJcbiAgcmVhZG9ubHkgbWluRGF0ZSA9IG1vbWVudChbMTgwMCwgMCwgMV0pO1xyXG5cclxuICBjb2xsZWN0aW9uID0ge2NvdW50OiA2MCwgZGF0YTogW119O1xyXG4gIGNvbmZpZyA9IHtcclxuICAgIGl0ZW1zUGVyUGFnZTogMTAsXHJcbiAgICBjdXJyZW50UGFnZTogMSxcclxuICAgIHRvdGFsSXRlbXM6IHRoaXMuY29sbGVjdGlvbi5jb3VudFxyXG4gIH07XHJcbiAgcHVibGljIG1heFNpemU6IG51bWJlciA9IDc7XHJcbiAgcHVibGljIGRpcmVjdGlvbkxpbmtzOiBib29sZWFuID0gdHJ1ZTtcclxuICBwdWJsaWMgYXV0b0hpZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgcmVzcG9uc2l2ZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHVibGljIGxhYmVsczogYW55ID0ge1xyXG4gICAgcHJldmlvdXNMYWJlbDogJzwnLFxyXG4gICAgbmV4dExhYmVsOiAnPicsXHJcbiAgICBzY3JlZW5SZWFkZXJQYWdpbmF0aW9uTGFiZWw6ICdQYWdpbmF0aW9uJyxcclxuICAgIHNjcmVlblJlYWRlclBhZ2VMYWJlbDogJ3BhZ2UnLFxyXG4gICAgc2NyZWVuUmVhZGVyQ3VycmVudExhYmVsOiBgWW91J3JlIG9uIHBhZ2VgXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSB0aW1lcjogYW55O1xyXG4gIGRhdGFFbGVtZW50czogYW55W10gPSBbXTtcclxuICBub0RhdGFGb3VuZCA9IGZhbHNlO1xyXG4gIGlzTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdG90YWxFbGVtZW50cyA9IDA7XHJcbiAgcGFnZXNDb3VudCA9IDA7XHJcbiAgcGFnZUluZGV4ID0gMTtcclxuICBwYWdlU2l6ZSA9IDEwO1xyXG4gIGZvcm1QYXJhbTogRm9ybUdyb3VwO1xyXG4gIHNlYXJjaEZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgQElucHV0KClcclxuICBmaWx0ZXJSZXF1ZXN0OiBGaWx0ZXJSZXF1ZXN0O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHN1cGVyRGF0YUVsZW1lbnRzOiBhbnlbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBvdmVycmlkZSBwYWdlSW5mbzogUGFnZUluZm8gPSBFTVBUWV9QQUdFX0lORk87XHJcblxyXG4gIEBJbnB1dCgpIC8vQHRzLWlnbm9yZVxyXG4gIGVuZm9yY2VSZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaXNQZW5kaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaXNCdWxrSXRlbXNTdXBwb3J0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkvLyBAdHMtaWdub3JlXHJcbiAgcHVibGljIGZpZWxkczogRmllbGRJbmZvW10gPSBbXTtcclxuXHJcbiAgQElucHV0KCkvLyBAdHMtaWdub3JlXHJcbiAgcHVibGljIHNlYXJjaEZvcm1GaWVsZHM6IEZpZWxkSW5mb1tdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIHRyYW5zbGF0aW9uS2V5OiBzdHJpbmcgPSAnYWRkTmV3JztcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgZm9ybVVwZGF0ZWQ6IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+ID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHNhdmVBY3Rpb25FbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKVxyXG4gIHNhdmVBdHRhY2htZW50RW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQElucHV0KCkgYWN0aW9uUmVxdWVzdENhbGxiYWNrITogKGFjdGlvblJlcXVlc3Q6IERvQWN0aW9uUmVxdWVzdCkgPT4gRG9BY3Rpb25SZXF1ZXN0O1xyXG5cclxuICBAVmlld0NoaWxkKCd1cGxvYWRlcicpIHVwbG9hZGVyQ29tcG9uZW50ITogQXR0YWNobWVudFVwbG9hZGVyQ29tcG9uZW50O1xyXG5cclxuICBjdXJyZW50RGlyZWN0aW9uOiAnbHRyJyB8ICdydGwnO1xyXG4gIHNlbGVjdGVkRmlsZUZyb21VcGxvYWRlcjogRmlsZSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgc2VsZWN0ZWRJdGVtOiBhbnk7XHJcblxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYmFja2VuZFNlcnZpY2U6IEJhY2tlbmRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBkaXJlY3Rpb25hbGl0eTogRGlyZWN0aW9uYWxpdHlcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGF0YUZvcm1BcnJheSgpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybVBhcmFtLmdldCgnZGF0YUZvcm1BcnJheScpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGV4dHJhY3RGb3JtYXQoY29sdW1uOiBUYWJsZUNvbHVtbjxhbnk+KSB7XHJcbiAgICByZXR1cm4gY29sdW1uPy5mb3JtYXQgfHwgJ2QvTS95eXl5LCBoOm1tIGEnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGFTb3VyY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhRm9ybUFycmF5LnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5jdXJyZW50RGlyZWN0aW9uID0gdGhpcy5kaXJlY3Rpb25hbGl0eS52YWx1ZTtcclxuICAgIHRoaXMuZGlyZWN0aW9uYWxpdHkuY2hhbmdlLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgdGhpcy5jdXJyZW50RGlyZWN0aW9uID0gdmFsdWU7XHJcbiAgICB9KVxyXG5cclxuICAgIGlmKHRoaXMuc3VwZXJEYXRhRWxlbWVudHM/Lmxlbmd0aD4wKXtcclxuICAgICAgdGhpcy5kYXRhRWxlbWVudHM9dGhpcy5zdXBlckRhdGFFbGVtZW50cztcclxuICAgICAgdGhpcy5idWlsZEZvcm0oKTtcclxuICAgICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZERhdGEoKSB7XHJcbiAgICB0aGlzLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IGZpZWxkLnJlYWRvbmx5ID0gdGhpcy5pc1BlbmRpbmcpO1xyXG5cclxuICAgIHRoaXMuZGF0YUVsZW1lbnRzID0gW107XHJcbiAgICB0aGlzLnRvdGFsRWxlbWVudHMgPSAwO1xyXG4gICAgdGhpcy5wYWdlc0NvdW50ID0gMTtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMubm9EYXRhRm91bmQgPSB0cnVlO1xyXG4gICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJSZXF1ZXN0LnBlbmRpbmdQYWdlID0gdGhpcy5pc1BlbmRpbmc7XHJcblxyXG4gICAgaWYgKCF0aGlzLnBhZ2VJbmZvLmxhenlMb2FkRGF0YSkge1xyXG4gICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmdldEl0ZW1zQnlGaWx0ZXIodGhpcy5maWx0ZXJSZXF1ZXN0LCB0aGlzLnBhZ2VJbmZvLmFwaVVyaSlcclxuICAgICAgICAuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhRWxlbWVudHMgPSByZXNwLmJvZHkgfHwgW107XHJcbiAgICAgICAgICB0aGlzLnRvdGFsRWxlbWVudHMgPSByZXNwLnRvdGFsU2l6ZSB8fCAwO1xyXG4gICAgICAgICAgdGhpcy5wYWdlc0NvdW50ID0gTWF0aC5tYXgoTWF0aC5jZWlsKHRoaXMudG90YWxFbGVtZW50cyAvIHRoaXMucGFnZVNpemUpLCAxKTtcclxuICAgICAgICAgIHRoaXMucGFnZUluZGV4ID0gKHRoaXMuZmlsdGVyUmVxdWVzdC5wYWdlSW5kZXggfHwgMCkgKyAxO1xyXG4gICAgICAgICAgdGhpcy5ub0RhdGFGb3VuZCA9IHRoaXMuZGF0YUVsZW1lbnRzLmxlbmd0aCA9PT0gMDtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYnVpbGRGb3JtKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkRm9ybSgpIHtcclxuICAgIHRoaXMuZm9ybVBhcmFtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGRhdGFGb3JtQXJyYXk6IHRoaXMuZmIuYXJyYXkodGhpcy5kYXRhRWxlbWVudHMubWFwKGl0ZW0gPT4gdGhpcy5mYi5ncm91cChidWlsZEZvcm1GaWVsZHModGhpcy5maWVsZHMsIGl0ZW0pKSkpLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZvcm1VcGRhdGVkLm5leHQodGhpcy5mb3JtUGFyYW0pO1xyXG4gIH1cclxuXHJcbiAgb25QYWdlQ2hhbmdlKGV2ZW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gZXZlbnQ7XHJcbiAgICB0aGlzLmdldE5leHQodGhpcy5wYWdlSW5kZXggLSAxKTtcclxuICB9XHJcbiAgZ2V0TmV4dChwYWdlSW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5maWx0ZXJSZXF1ZXN0LnBhZ2VJbmRleCA9IHBhZ2VJbmRleDtcclxuICAgIHRoaXMuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XHJcbiAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgfVxyXG5cclxuICBvblBhZ2VTaXplQ2hhbmdlKGV2ZW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMucGFnZVNpemUgPSBldmVudDtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XHJcbiAgICB0aGlzLmdldE5leHQoMCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZXh0cmFjdEZpZWxkTmFtZShlbGVtZW50OiBhbnksIHByb3BlcnR5OiBzdHJpbmcpIHtcclxuICAgIGlmIChwcm9wZXJ0eS5pbmNsdWRlcygnLicpKSB7XHJcbiAgICAgIHJldHVybiBwcm9wZXJ0eS5zcGxpdCgnLicpLnJlZHVjZSgoYWNjLCBwYXJ0KSA9PiBhY2MgJiYgYWNjW3BhcnRdLCBlbGVtZW50KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBlbGVtZW50W3Byb3BlcnR5XTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCB2aXNpYmxlQ29sdW1ucygpIHtcclxuICAgIHJldHVybiB0aGlzLmZpZWxkcy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi52aXNpYmxlKS5tYXAoY29sdW1uID0+IGNvbHVtbi5wcm9wZXJ0eSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbXCJlbmZvcmNlUmVmcmVzaFwiXSAmJiAhY2hhbmdlc1tcImVuZm9yY2VSZWZyZXNoXCJdLmlzRmlyc3RDaGFuZ2UoKSAmJiBjaGFuZ2VzW1wiZW5mb3JjZVJlZnJlc2hcIl0uY3VycmVudFZhbHVlID09PSB0cnVlKSB7XHJcbiAgICAgIC8vIHRoaXMubG9hZERhdGEoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uU2VsZWN0SXRlbShyb3c6IGFueSkge1xyXG4gICAgaWYgKHRoaXMucGFnZUluZm8uc2VsZlJvdXRpbmcpIHtcclxuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuaXNQZW5kaW5nID8gJ3BlbmRpbmcnIDogJ3ZpZXcnO1xyXG4gICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnBhZ2VJbmZvLmxpc3RSb3V0ZVBhdGggfHwgdGhpcy5yb3V0ZXIudXJsfS8ke21vZGV9YDtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Ake3VybH1gLCByb3c/LmlkXSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhY3Rpb24gPSBTRUxFQ1RfUkVDT1JEX0FDVElPTjtcclxuICAgIGFjdGlvbi5pZCA9IHJvdz8uaWQ7XHJcbiAgICAvLyB0aGlzLnVzZXJBY3Rpb24uZW1pdChhY3Rpb24pXHJcbiAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IHJvdztcclxuICB9XHJcblxyXG4gIG9wZW5OZXdUYWIocm93KSB7XHJcbiAgICBpZiAoIXRoaXMucGFnZUluZm8uZW1iZWRlZFRhYmxlT25seSkge1xyXG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5pc1BlbmRpbmcgPyAncGVuZGluZycgOiAndmlldyc7XHJcbiAgICAgIHdpbmRvdy5vcGVuKGAke3RoaXMucGFnZUluZm8ubGlzdFJvdXRlUGF0aH0vJHttb2RlfWAgKyAnLycgKyByb3c/LmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBnZXRGaWVsZChlbGVtZW50LCBjb2x1bW46IEZpZWxkSW5mbykge1xyXG4gICAgICByZXR1cm4gIGVsZW1lbnQuY29udHJvbHNbY29sdW1uLnByb3BlcnR5XTtcclxuICB9XHJcblxyXG4gIGZpZWxkQnV0dG9uRXZlbnQoY29sdW1uLCBlbGVtZW50LCBhY3Rpb25JZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmRvU2F2ZUFwcHJvdmVBY3Rpb24oZWxlbWVudCwgYWN0aW9uSWQpO1xyXG4gIH1cclxuXHJcbiAgcGF0Y2hMb29rdXBWYWx1ZSgkZXZlbnQ6IExvb2t1cEl0ZW0sIHByb3BlcnR5OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZm9ybVVwZGF0ZWQuZW1pdCh0aGlzLnNlbGVjdGVkSXRlbSlcclxuICB9XHJcblxyXG4gIGFkZE5ld0l0ZW0oKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VmFsdWVzID0gdGhpcy5mb3JtUGFyYW0/LmdldCgnZGF0YUZvcm1BcnJheScpPy52YWx1ZTtcclxuICAgIGlmIChjdXJyZW50VmFsdWVzKSB7XHJcbiAgICAgIHRoaXMuZGF0YUVsZW1lbnRzID0gWy4uLmN1cnJlbnRWYWx1ZXNdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kYXRhRWxlbWVudHMucHVzaCh7fSk7XHJcbiAgICB0aGlzLmJ1aWxkRm9ybSgpO1xyXG4gIH1cclxuXHJcblxyXG4gIGRvU2F2ZUFwcHJvdmVBY3Rpb24oZWxlbWVudCwgdXNlckFjdGlvbklkKSB7XHJcbiAgICBsZXQgYWN0aW9uSWQgPSAgZ2V0V2ZBY3Rpb25JZChlbGVtZW50LnZhbHVlLnN0YXRlVHlwZSk7XHJcbiAgICBpZiAodXNlckFjdGlvbklkID09PSBSRUpFQ1QgJiYgdGhpcy5pc1BlbmRpbmcpIHtcclxuICAgICAgYWN0aW9uSWQgPTNcclxuICAgIH1cclxuICAgIGxldCByZXF1ZXN0ID0gbmV3IERvQWN0aW9uUmVxdWVzdCgpO1xyXG4gICAgcmVxdWVzdC5hY3Rpb25JZCA9IGFjdGlvbklkO1xyXG4gICAgcmVxdWVzdC5zdWJqZWN0ID0gZWxlbWVudC52YWx1ZTtcclxuXHJcbiAgICBpZiAodGhpcy5hY3Rpb25SZXF1ZXN0Q2FsbGJhY2spIHtcclxuICAgICAgcmVxdWVzdCA9IHRoaXMuYWN0aW9uUmVxdWVzdENhbGxiYWNrKHJlcXVlc3QpO1xyXG4gICAgICBpZiAocmVxdWVzdC5zdWJqZWN0LmlkID09PSBcIlwiKSB7XHJcbiAgICAgICAgcmVxdWVzdC5zdWJqZWN0LmlkID0gbnVsbDtcclxuICAgICAgICByZXF1ZXN0LnN1YmplY3Quc3RhdGVUeXBlID0gXCJORVdcIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXF1ZXN0LnN1YmplY3QuaWQgPT09IFwiXCIpIHtcclxuICAgICAgcmVxdWVzdC5zdWJqZWN0LmlkID0gbnVsbDtcclxuICAgICAgcmVxdWVzdC5zdWJqZWN0LnN0YXRlVHlwZSA9IFwiTkVXXCI7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQWN0aW9uQ29tbWVudENvbXBvbmVudCwge1xyXG4gICAgICBkYXRhOiB7bGFiZWw6IHVzZXJBY3Rpb25JZCA9PT0gMiA/ICdzYXZlJyA6ICdyZWplY3QnLCBpc1Rlcm1pbmF0aW9uOiBmYWxzZX0sXHJcbiAgICAgIHdpZHRoOiAnNjAwcHgnLFxyXG4gICAgICBoZWlnaHQ6ICdhdXRvJyxcclxuICAgICAgZGlyZWN0aW9uOiAgdGhpcy5jdXJyZW50RGlyZWN0aW9uXHJcbiAgICB9KTtcclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgcmVxdWVzdC5jb21tZW50ID0gcmVzdWx0LmNvbW1lbnQ7XHJcbiAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5kb0FjdGlvbldpdGhBdHRhY2htZW50cyhyZXF1ZXN0LCBbXSwgdGhpcy5wYWdlSW5mbyEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwLnZhbGlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZERhdGEoKTtcclxuICAgICAgICAgICAgbGV0ICBtZXNzYWdlID0gJyc7XHJcbiAgICAgICAgICAgIGlmIChhY3Rpb25JZCA9PT0gMSApIHtcclxuICAgICAgICAgICAgICBtZXNzYWdlID0gJ3NhdmVkX3N1Y2Nlc3NmdWxseScgO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbklkID09PTIgKSB7XHJcbiAgICAgICAgICAgICAgbWVzc2FnZSA9ICd1cGRhdGVkX3N1Y2Nlc3NmdWxseSc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uSWQgPT09MyApIHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnc3VjY2Vzc2Z1bF9yZWplY3RfbWVzc2FnZSc7XHJcbiAgICAgICAgICAgIH0gIGVsc2UgaWYgKGFjdGlvbklkID09PTQgKSB7XHJcbiAgICAgICAgICAgICAgbWVzc2FnZSA9ICdhcHByb3ZlX3N1Y2Nlc3NmdWxseSc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS50b3BQYW5lbE1lc3NhZ2UkLm5leHQobmV3IFNuYWNrTWVzc2FnZShtZXNzYWdlLCB0cnVlLCAnc3VjY2VzcycpKTtcclxuICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgeCA9IHJlc3AubWVzc2FnZT8ubGVuZ3RoID4wID8gcmVzcC5tZXNzYWdlWzBdLmVycm9yTWVzc2FnZSA6ICdGQUlMRURfQ09OVEFDVF9BRE1JTic7XHJcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UudG9wUGFuZWxNZXNzYWdlJC5uZXh0KG5ldyBTbmFja01lc3NhZ2UoeCwgdHJ1ZSwgJ2Vycm9yJykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zYXZlQWN0aW9uRW1pdHRlci5lbWl0KHtpdGVtOnJlcXVlc3Quc3ViamVjdCwgcmVzcH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGdldFBvc2l0aXZlV2ZBY3Rpb25LZXkgPSBnZXRQb3NpdGl2ZVdmQWN0aW9uS2V5O1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBnZXROZWdhdGl2ZVdmQWN0aW9uS2V5ID0gZ2V0TmVnYXRpdmVXZkFjdGlvbktleTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgU0FWRSA9IFNBVkU7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IFJFSkVDVCA9IFJFSkVDVDtcclxuXHJcblxyXG4gIHNldE1vbnRoQW5kWWVhcihub3JtYWxpemVkTW9udGhBbmRZZWFyOiBNb21lbnQsIHBpY2tlcjogTWF0RGF0ZXBpY2tlcjxNb21lbnQ+LCBlbGVtZW50LCBjb2x1bW4pIHtcclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRm9ybUNvbnRyb2wobW9tZW50KCkpO1xyXG4gICAgY29uc3QgY3RybFZhbHVlID0gZGF0ZS52YWx1ZTtcclxuICAgIGN0cmxWYWx1ZS55ZWFyKG5vcm1hbGl6ZWRNb250aEFuZFllYXIueWVhcigpKTtcclxuICAgIGN0cmxWYWx1ZS5tb250aCgxKTtcclxuICAgIGN0cmxWYWx1ZS5kYXlPZlllYXIoMSk7XHJcbiAgICBlbGVtZW50LmNvbnRyb2xzW2NvbHVtbi5wcm9wZXJ0eV0uc2V0VmFsdWUoY3RybFZhbHVlKTtcclxuICAgIHBpY2tlci5jbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgc3dpdGNoVmlld01vZGUoYjogYm9vbGVhbikge1xyXG4gICAgdGhpcy5pc1BlbmRpbmcgPSBiO1xyXG4gICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgb25DaGlwU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiBhbnksIGxpc3Rib3g/OiBNYXRDaGlwTGlzdGJveCk6IHZvaWQge1xyXG4gICAgY29uc3QgdmFsdWUgPSBldmVudC52YWx1ZTtcclxuICAgIGlmICh2YWx1ZSAhPT0gJ0NPTVBMRVRFRCcgJiYgdmFsdWUgIT09ICdQRU5ESU5HJykge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGxpc3Rib3ggJiYgKGxpc3Rib3gudmFsdWUgPSB0aGlzLmlzUGVuZGluZyA/ICdQRU5ESU5HJyA6ICdDT01QTEVURUQnKSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGlzUGVuZGluZyA9IHZhbHVlID09PSAnUEVORElORyc7XHJcbiAgICBpZiAodGhpcy5pc1BlbmRpbmcgIT09IGlzUGVuZGluZykgdGhpcy5zd2l0Y2hWaWV3TW9kZShpc1BlbmRpbmcpO1xyXG4gIH1cclxuXHJcbiAgYWRkQnVsa0l0ZW1zKCkge1xyXG4gICAgY29uc3QgbWVyZ2VkOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIHRoaXMuZGF0YUZvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChncm91cDogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICAgIG1lcmdlZC5wdXNoKGdyb3VwLnZhbHVlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCByZXF1ZXN0ID0gbmV3IERvQWN0aW9uUmVxdWVzdCgpO1xyXG4gICAgcmVxdWVzdC5hY3Rpb25JZCA9IDE7XHJcblxyXG4gICAgcmVxdWVzdC5zdWJqZWN0ID0geyBpbnZvaWNlczogbWVyZ2VkIH07XHJcblxyXG4gICAgaWYgKHRoaXMuYWN0aW9uUmVxdWVzdENhbGxiYWNrKSB7XHJcbiAgICAgIHJlcXVlc3QgPSB0aGlzLmFjdGlvblJlcXVlc3RDYWxsYmFjayhyZXF1ZXN0KTtcclxuXHJcbiAgICAgIHJlcXVlc3Quc3ViamVjdC5pbnZvaWNlcyA9IHJlcXVlc3Quc3ViamVjdC5pbnZvaWNlcy5tYXAoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLmlkID09PSBcIlwiKSB7XHJcbiAgICAgICAgICBpdGVtLmlkID0gbnVsbDtcclxuICAgICAgICAgIGl0ZW0uc3RhdGVUeXBlID0gXCJORVdcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlcXVlc3Quc3ViamVjdC5pbnZvaWNlcyA9IHJlcXVlc3Quc3ViamVjdC5pbnZvaWNlcy5tYXAoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5pZCA9PT0gXCJcIikge1xyXG4gICAgICAgIGl0ZW0uaWQgPSBudWxsO1xyXG4gICAgICAgIGl0ZW0uc3RhdGVUeXBlID0gXCJORVdcIjtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gaXRlbTtcclxuICAgIH0pO1xyXG5cclxuXHJcblxyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihBY3Rpb25Db21tZW50Q29tcG9uZW50LCB7XHJcbiAgICAgIGRhdGE6IHtsYWJlbDogICdzYXZlJyAsIGlzVGVybWluYXRpb246IGZhbHNlfSxcclxuICAgICAgd2lkdGg6ICc2MDBweCcsXHJcbiAgICAgIGhlaWdodDogJ2F1dG8nLFxyXG4gICAgICBkaXJlY3Rpb246ICB0aGlzLmN1cnJlbnREaXJlY3Rpb25cclxuICAgIH0pO1xyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICByZXF1ZXN0LmNvbW1lbnQgPSByZXN1bHQuY29tbWVudDtcclxuICAgICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmRvQWN0aW9uV2l0aEF0dGFjaG1lbnQocmVxdWVzdCwgdGhpcy5zZWxlY3RlZEZpbGVGcm9tVXBsb2FkZXIsIHRoaXMucGFnZUluZm8hKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcC52YWxpZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyQnVsa0l0ZW1zKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UudG9wUGFuZWxNZXNzYWdlJC5uZXh0KG5ldyBTbmFja01lc3NhZ2UoJ3NhdmVkX3N1Y2Nlc3NmdWxseScsIHRydWUsICdzdWNjZXNzJykpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UudG9wUGFuZWxNZXNzYWdlJC5uZXh0KG5ldyBTbmFja01lc3NhZ2UodGhpcy5wYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgJy4nICsgcmVzcC5tZXNzYWdlPy5bMF0/LmVycm9yQ29kZSwgdHJ1ZSwgJ2Vycm9yJykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zYXZlQXR0YWNobWVudEVtaXR0ZXIuZW1pdCh7aXRlbTpyZXF1ZXN0LnN1YmplY3QsIHJlc3B9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7ICB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVVcGxvYWQnKSBmaWxlVXBsb2FkOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG5cclxuICBoYW5kbGVGaWxlVXBsb2FkKCRldmVudDogRmlsZSkge1xyXG4gICAgbGV0IGFjdGlvbklkID0gIGdldFdmQWN0aW9uSWQoJ05FVycpO1xyXG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgRG9BY3Rpb25SZXF1ZXN0KCk7XHJcbiAgICByZXF1ZXN0LmFjdGlvbklkID0gYWN0aW9uSWQ7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVGcm9tVXBsb2FkZXIgPSAkZXZlbnQ7XHJcblxyXG4gIH1cclxuXHJcbiAgc2hvdWxkRGlzYWJsZUJ1bGtBZGQoKSB7XHJcbiAgICBjb25zdCBoYXNGaWxlID0gISF0aGlzLnNlbGVjdGVkRmlsZUZyb21VcGxvYWRlcjtcclxuICAgIHJldHVybiAoIXRoaXMuZm9ybVBhcmFtPy52YWxpZCB8fCB0aGlzLmRhdGFGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoID09PSAwKSAmJiAhaGFzRmlsZTtcclxuICB9XHJcbiAgaGFuZGxlRXF1YXRpb25DaGFuZ2UoZXZlbnQ6IHsgdmFsdWU6IGFueVtdLCB2YWxpZDogYm9vbGVhbiB9LCBlbGVtZW50OiBGb3JtR3JvdXAsIGNvbHVtbjogYW55KTogdm9pZCB7XHJcbiAgICBlbGVtZW50LnZhbHVlW2NvbHVtbi5wcm9wZXJ0eV0gPSBldmVudC52YWx1ZTtcclxuICAgIGNvbnN0IHsgdmFsdWUsIHZhbGlkIH0gPSBldmVudDtcclxuICAgIGVsZW1lbnQuZ2V0KGNvbHVtbi5wcm9wZXJ0eSk/LnNldFZhbHVlKHZhbHVlKTtcclxuICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgZWxlbWVudC5nZXQoY29sdW1uLnByb3BlcnR5KT8uc2V0RXJyb3JzKHsgaW52YWxpZEVxdWF0aW9uOiB0cnVlIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZWxlbWVudC5nZXQoY29sdW1uLnByb3BlcnR5KT8uc2V0RXJyb3JzKG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xlYXJCdWxrSXRlbXMoKSB7XHJcbiAgICB0aGlzLmRhdGFFbGVtZW50cyA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVGcm9tVXBsb2FkZXIgPSBudWxsO1xyXG4gICAgdGhpcy51cGxvYWRlckNvbXBvbmVudC5jbGVhckZpbGUoKTtcclxuICAgIHRoaXMuYnVpbGRGb3JtKCk7XHJcbiAgICB0aGlzLmZvcm1VcGRhdGVkLmVtaXQodGhpcy5mb3JtUGFyYW0pO1xyXG4gIH1cclxuXHJcbiAgaGFzRGF0YVRvQ2xlYXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuZGF0YUVsZW1lbnRzICYmIHRoaXMuZGF0YUVsZW1lbnRzLmxlbmd0aCA+IDApIHx8ICEhdGhpcy5zZWxlY3RlZEZpbGVGcm9tVXBsb2FkZXI7XHJcbiAgfVxyXG5nZXRPcHRpb25WYWx1ZShpdGVtOiBhbnkpIHtcclxuICAgIGNvbnN0IHZhbHVlID0gdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnID9cclxuICAgICAgaXRlbS5lbmdsaXNoTmFtZSA6IGl0ZW07XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBkaXNhYmxlZFNhdmVCdXR0b24oZWxlbWVudCkge1xyXG4gICAgcmV0dXJuICFlbGVtZW50LnZhbGlkIHx8ICghdGhpcy5pc1BlbmRpbmcgJiYgZWxlbWVudC52YWx1ZS5zdGF0ZVR5cGUgPT0gJ1BFTkRJTkcnKTtcclxuICB9XHJcblxyXG4gIGRvU2VhcmNoKCkge1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoRm9ybS52YWxpZCkge1xyXG4gICAgICBjb25zdCByYXdWYWx1ZXMgPSB0aGlzLnNlYXJjaEZvcm0uZ2V0UmF3VmFsdWUoKTtcclxuICAgICAgdGhpcy5maWx0ZXJSZXF1ZXN0LnBhZ2VJbmRleD0wO1xyXG4gICAgICB0aGlzLmZpbHRlclJlcXVlc3QuZmlsdGVycyA9IFtdO1xyXG4gICAgICB0aGlzLnNlYXJjaEZvcm1GaWVsZHMuZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmF3VmFsdWVzW3gucHJvcGVydHldO1xyXG4gICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgICAgICAgIGtleTogMCxcclxuICAgICAgICAgICAgICBsYWJlbDogeC5wcm9wZXJ0eSxcclxuICAgICAgICAgICAgICBmaWVsZE5hbWU6IHguc2VhcmNoQXR0cmlidXRlLFxyXG4gICAgICAgICAgICAgIHZhbHVlT2JqZWN0IDogeC5zZWFyY2hBdHRyaWJ1dGUuaW5jbHVkZXMoJy4nKSA/IHZhbHVlW3guc2VhcmNoQXR0cmlidXRlLnNwbGl0KCcuJykucG9wKCldIDogdmFsdWUsXHJcbiAgICAgICAgICAgICAgb3BlcmF0b3I6IHguc2VhcmNoT3BlcmF0b3IsXHJcbiAgICAgICAgICAgICAgZmlsdGVyVHlwZTogJ0ZJTEVEX0ZJTFRFUidcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyUmVxdWVzdC5maWx0ZXJzLnB1c2goZmlsdGVyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UudG9wUGFuZWxNZXNzYWdlJC5uZXh0KG5ldyBTbmFja01lc3NhZ2UoJ0lOVkFMSURfU0VBUkNIX0ZPUk0nLCB0cnVlLCAnZXJyb3InKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93U2VhcmNoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoRm9ybUZpZWxkcz8ubGVuZ3RoID4gMDtcclxuICB9XHJcblxyXG4gIGNsZWFyU2VhcmNoKCkge1xyXG4gICAgdGhpcy5zZWFyY2hGb3JtLmdldCgnc2VjdG9yVHlwZScpLnNldFZhbHVlKHtpZDotMTAwLCBlbmdsaXNoTmFtZTonYWFhJywgY29kZTonYWFhJywgYXJhYmljTmFtZTonYWFhJ30pO1xyXG4gICAgdGhpcy5zZWFyY2hGb3JtLnJlc2V0KCk7XHJcbiAgICB0aGlzLmRvU2VhcmNoKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVTZWFyY2hGb3JtKCRldmVudDogRm9ybUdyb3VwKSB7XHJcbiAgICB0aGlzLnNlYXJjaEZvcm0gPSAkZXZlbnRcclxuICB9XHJcblxyXG4gIHZhbGlkU2VhcmNoRGF0YSgpIHtcclxuICAgIHJldHVybiAhdGhpcy5zZWFyY2hGb3JtLnZhbGlkIHx8IHRydWU7XHJcbiAgfVxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiYmFzZVRhYmxlIGZsZXgtY29sdW1uXCI+XHJcbiAgPGRpdiBjbGFzcz1cImxlZnQtYWxpZ25cIj5cclxuICAgIDxhcHAtYXR0YWNobWVudC11cGxvYWRlciAjdXBsb2FkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzQnVsa0l0ZW1zU3VwcG9ydGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZVNlbGVjdGVkKT1cImhhbmRsZUZpbGVVcGxvYWQoJGV2ZW50KVwiPlxyXG4gICAgPC9hcHAtYXR0YWNobWVudC11cGxvYWRlcj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGZ1bGwtd2lkdGhcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LWhhbGYgZmxleC1jb2x1bW4gYWxpZ24tY2VudGVyLXN0YXJ0XCI+XHJcbiAgICAgIDxhcHAtdGl0bGUtYmFyIFtwYWdlVGl0bGVdPVwicGFnZUluZm8uaGlkZVRpdGxlID8gJycgOiBwYWdlSW5mby5sYWJlbHNTZWN0aW9uKycubGlzdF90aXRsZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbdGl0bGVNb2RlXT1cIicnXCJcclxuICAgICAgICAgICAgICAgICAgICAgW25ld0FjdGlvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtzaG93RXh0cmFjdEJ1dHRvbl09XCIhcGFnZUluZm8uaGlkZUV4dHJhY3RCdXR0b25cIj5cclxuICAgICAgPC9hcHAtdGl0bGUtYmFyPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImZvbnQtc21hbGxcIj57eyAndG90YWxDb3VudEl0ZW0nIHwgdHJhbnNsYXRlIH19IDoge3sgdGhpcy50b3RhbEVsZW1lbnRzIH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleC1oYWxmIGZsZXgtY29sdW1uIGFsaWduLXN0YXJ0LWVuZFwiPlxyXG4gICAgICA8bWF0LWNoaXAtbGlzdGJveCAjYm94IFthdHRyLmFyaWEtbGFiZWxdPVwiJ0JBU0VfVEFCTEUuZG9jdW1lbnRTdGF0dXMnIHwgdHJhbnNsYXRlXCIgW211bHRpcGxlXT1cImZhbHNlXCIgW3ZhbHVlXT1cImlzUGVuZGluZyA/ICdQRU5ESU5HJyA6ICdDT01QTEVURUQnXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChjaGFuZ2UpPVwib25DaGlwU2VsZWN0aW9uQ2hhbmdlKCRldmVudCwgYm94KVwiICpuZ0lmPVwicGFnZUluZm8uZHJhZnRTdXBwb3J0ZWRcIj5cclxuICAgICAgICA8bWF0LWNoaXAtb3B0aW9uIFtzZWxlY3RlZF09XCIhaXNQZW5kaW5nXCIgW2NvbG9yXT1cIidhY2NlbnQnXCIgdmFsdWU9XCJDT01QTEVURURcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICB7eyAnZmluaXNoZWQnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgPC9tYXQtY2hpcC1vcHRpb24+XHJcbiAgICAgICAgPG1hdC1jaGlwLW9wdGlvbiBbc2VsZWN0ZWRdPVwiaXNQZW5kaW5nXCIgW2NvbG9yXT1cIidhY2NlbnQnXCIgdmFsdWU9XCJQRU5ESU5HXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAge3sgJ3RvZG8nIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgPC9tYXQtY2hpcC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LWNoaXAtbGlzdGJveD5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd1NlYXJjaCgpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3cgZnVsbC13aWR0aFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleC04MCBmbGV4LWNvbHVtbiBhbGlnbi1zdGFydC1lbmRcIj5cclxuICAgICAgICA8YXBwLWJhc2UtZm9ybS1jYW52YXMgY2xhc3M9XCJmbGV4LWZpbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFnZUluZm9dPVwicGFnZUluZm9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRzXT1cInNlYXJjaEZvcm1GaWVsZHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZWRpdGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtVXBkYXRlZCk9XCJ1cGRhdGVTZWFyY2hGb3JtKCRldmVudClcIj5cclxuICAgICAgICA8L2FwcC1iYXNlLWZvcm0tY2FudmFzPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMTUgZmxleC1jb2x1bW4gYWxpZ24tc3RhcnQtZW5kXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGFsaWduLWNlbnRlci1jZW50ZXIgZ2FwLTggZnVsbC13aWR0aFwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZG9TZWFyY2goKVwiIGlkPVwiZWRpdGFibGUtc2VhcmNoLWJ0blwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+c2VhcmNoPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAge3sgJ3NlYXJjaCcgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2xlYXJTZWFyY2goKVwiIGlkPVwiZWRpdGFibGUtY2xlYXItc2VhcmNoLWJ0blwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxyXG4gICAgICAgICAgICB7eyAnY2xlYXInIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGZ1bGwtd2lkdGggYmFzZVRhYmxlX19kZXRhaWxzQ29sdW1uXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleC1mdWxsXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0xvYWRlZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdyBtYWluVGFibGUgZ2FwLTAgYWxpZ24tc3RhcnQtc3RhcnRcIj5cclxuICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVBhcmFtXCIgY2xhc3M9XCJmbGV4LWZpbGxcIj5cclxuICAgICAgICAgICAgPHRhYmxlIFtkYXRhU291cmNlXT1cImRhdGFGb3JtQXJyYXkuY29udHJvbHNcIiBjbGFzcz1cImZsZXgtZmlsbFwiIG1hdC10YWJsZSBtYXRTb3J0PlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiB0aGlzLmZpZWxkczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ7e2NvbHVtbi5wcm9wZXJ0eX19XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbHVtbi50eXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2VxdWF0aW9uLWJ1aWxkZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGggKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJtYWluVGFibGVfX3RoXCIgbWF0LWhlYWRlci1jZWxsPnt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiIG1hdC1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLWVxdWF0aW9uLWJ1aWxkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJlbGVtZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY29sdW1uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiY29sdW1uLnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNQZW5kaW5nXT1cImlzUGVuZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJoYW5kbGVFcXVhdGlvbkNoYW5nZSgkZXZlbnQsIGVsZW1lbnQsIGNvbHVtbilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItZXF1YXRpb24tYnVpbGRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsb29rdXAnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGggKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJtYWluVGFibGVfX3RoXCIgbWF0LWhlYWRlci1jZWxsPnt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtYXV0by1jb21wbGV0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImVsZW1lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjb2x1bW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VmFsdWVdPVwiZWxlbWVudC5nZXQoY29sdW1uLnByb3BlcnR5KT8udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZFZhbHVlKT1cInBhdGNoTG9va3VwVmFsdWUoJGV2ZW50LCBjb2x1bW4ucHJvcGVydHkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwLWF1dG8tY29tcGxldGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsaXN0J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibWFpblRhYmxlX190aFwiIG1hdC1oZWFkZXItY2VsbD57eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCAgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlsnbWFpblRhYmxlX190ZF9fdGV4dC1zZWNvbmRhcnlfX3RkJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e2VsZW1lbnR9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7Y29sdW1uLnByb3BlcnR5fX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29sdW1uLmxhYmVsISB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJlbGVtZW50W2NvbHVtbi5wcm9wZXJ0eV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29sdW1uLmxpc3RPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0T3B0aW9uVmFsdWUoaXRlbSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3RhdGVUeXBlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibWFpblRhYmxlX190aFwiIG1hdC1oZWFkZXItY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ2FjdGlvbicgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZCBtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGRcIiBtYXQtY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGZ1bGwtd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXRoaXJkIGZsZXgtY29sdW1uIGFsaWduLWNlbnRlci1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwiYnRuLW5vbmUtYmFja2dyb3VuZC1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFNhdmVCdXR0b24oZWxlbWVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmaWVsZEJ1dHRvbkV2ZW50KGNvbHVtbixlbGVtZW50LFNBVkUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCInZWRpdGFibGUtc2F2ZS0nICsgKGVsZW1lbnQudmFsdWU/LmlkIHx8ICcnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldFBvc2l0aXZlV2ZBY3Rpb25LZXkoZWxlbWVudC52YWx1ZS5zdGF0ZVR5cGUpIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC10aGlyZCBmbGV4LWNvbHVtbiBhbGlnbi1jZW50ZXItY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpc1BlbmRpbmdcIiBtYXQtYnV0dG9uIGNsYXNzPVwiYnRuLW5vbmUtYmFja2dyb3VuZC1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cImFjY2VudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZpZWxkQnV0dG9uRXZlbnQoY29sdW1uLGVsZW1lbnQsUkVKRUNUKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiJ2VkaXRhYmxlLXJlamVjdC0nICsgKGVsZW1lbnQudmFsdWU/LmlkIHx8ICcnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldE5lZ2F0aXZlV2ZBY3Rpb25LZXkoZWxlbWVudC52YWx1ZS5zdGF0ZVR5cGUpIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC10aGlyZCBmbGV4LWNvbHVtbiBhbGlnbi1jZW50ZXItY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIneWVhcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIm1haW5UYWJsZV9fdGhcIiBtYXQtaGVhZGVyLWNlbGw+e3sgbGFiZWxLZXkoY29sdW1uKSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJbJ21haW5UYWJsZV9fdGRfX3RleHQtc2Vjb25kYXJ5X190ZCddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZmxleC1hdXRvIGZ4LWZsZXgtZmlsbFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiY29sdW1uLnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwicGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldEZpZWxkKGVsZW1lbnQsIGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJjb2x1bW4ucmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2xhYmVsLScgKyBjb2x1bW4ucHJvcGVydHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIidlcnJvci0nICsgY29sdW1uLnByb3BlcnR5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI3BpY2tlciBzdGFydFZpZXc9XCJtdWx0aS15ZWFyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHllYXJTZWxlY3RlZCk9XCJzZXRNb250aEFuZFllYXIoJGV2ZW50LCBwaWNrZXIsIGVsZW1lbnQsY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M9XCJleGFtcGxlLW1vbnRoLXBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXgtYXV0b1wiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgZnhGbGV4RmlsbD4tLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiZ2V0RmllbGQoZWxlbWVudCwgY29sdW1uKVwiPi0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+LS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGggKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJtYWluVGFibGVfX3RoXCIgbWF0LWhlYWRlci1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBjbGFzcz1cIm1haW5UYWJsZV9fdGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlsnbWFpblRhYmxlX190ZF9fdGV4dC1zZWNvbmRhcnlfX3RkJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmbGV4LWF1dG8gZngtZmxleC1maWxsXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFZpc3VhbGx5IGhpZGRlbiBsYWJlbCBqdXN0IHRvIHRyaWdnZXIgdGhlIGZsb2F0aW5nIGxhYmVsIGFuZCBhc3RlcmlzayAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJnZXRGaWVsZChlbGVtZW50LCBjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImNvbHVtbi5yZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJjb2x1bW4ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cImNvbHVtbi5yZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGNvbHVtbi5wcm9wZXJ0eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiJ2Vycm9yLScgKyBjb2x1bW4ucHJvcGVydHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N0YXR1cydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIm1haW5UYWJsZV9fdGhcIiBtYXQtaGVhZGVyLWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmctYm90dG9tOiAxNHB4OyBwYWRkaW5nLXRvcDogMTRweDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJnZXRGaWVsZChlbGVtZW50LCBjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cImNvbHVtbi5yZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidsYWJlbC0nICsgY29sdW1uLnByb3BlcnR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIidlcnJvci0nICsgY29sdW1uLnByb3BlcnR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUucG9pbnRlci1ldmVudHNdPVwiY29sdW1uLnJlYWRvbmx5ID8gJ25vbmUnIDogJ2F1dG8nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUub3BhY2l0eV09XCJjb2x1bW4ucmVhZG9ubHkgPyAwLjcgOiAxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29sdW1uLnJlYWRvbmx5ID8gJGV2ZW50LnByZXZlbnREZWZhdWx0KCkgOiBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGV4dCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIm1haW5UYWJsZV9fdGhcIiBtYXQtaGVhZGVyLWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXgtYXV0byBmeC1mbGV4LWZpbGxcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldEZpZWxkKGVsZW1lbnQsIGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImNvbHVtbi5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidsYWJlbC0nICsgY29sdW1uLnByb3BlcnR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCInZXJyb3ItJyArIGNvbHVtbi5wcm9wZXJ0eVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIm1haW5UYWJsZV9fdGhcIiBtYXQtaGVhZGVyLWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXgtYXV0byBmeC1mbGV4LWZpbGxcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJ4cGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldEZpZWxkKGVsZW1lbnQsIGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImNvbHVtbi5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cImNvbHVtbi5yZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGNvbHVtbi5wcm9wZXJ0eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiJ2Vycm9yLScgKyBjb2x1bW4ucHJvcGVydHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JdPVwieHBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uLnJlYWRvbmx5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyICN4cGlja2VyPjwvbWF0LWRhdGVwaWNrZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGggKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJtYWluVGFibGVfX3RoXCIgbWF0LWhlYWRlci1jZWxsPnt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXgtYXV0byBmeC1mbGV4LWZpbGxcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiY29sdW1uLnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJjb2x1bW4ucmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZ2V0RmllbGQoZWxlbWVudCwgY29sdW1uKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8dHIgKm1hdEhlYWRlclJvd0RlZj1cInZpc2libGVDb2x1bW5zXCIgbWF0LWhlYWRlci1yb3c+PC90cj5cclxuICAgICAgICAgICAgICA8dHIgKGNsaWNrKT1cIm9uU2VsZWN0SXRlbShyb3cpXCIgKGF1eGNsaWNrKT1cIm9wZW5OZXdUYWIocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiB2aXNpYmxlQ29sdW1ucyAgfCBwYWdpbmF0ZTpjb25maWdcIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCInZWRpdGFibGUtcm93LScgKyAocm93Py52YWx1ZT8uaWQgfHwgcm93Py52YWx1ZT8ua2V5IHx8ICcnKVwiXHJcbiAgICAgICAgICAgICAgICAgIG1hdC1yb3c+PC90cj5cclxuICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIm5vRGF0YUZvdW5kICYmICFwYWdlSW5mby5sYXp5TG9hZERhdGFcIiBjbGFzcz1cImZsZXgtcm93IGRhdGFOb3RGb3VuZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uIGZsZXgtZnVsbFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGFOb3RGb3VuZF9fZGV0YWlsc1wiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImRhdGFOb3RGb3VuZF9fZGV0YWlsc19faWNvblwiPmluZm88L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDxzcGFuPnt7ICdkYXRhTm90Rm91bmQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93IG1haW5UYWJsZVwiICpuZ0lmPVwiIXNlbGVjdGVkRmlsZUZyb21VcGxvYWRlclwiPlxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFpc1BlbmRpbmcgJiYgcGFnZUluZm8uaGFzQWRkQnV0dG9uXCIgbWF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTmV3SXRlbSgpXCIgaWQ9XCJlZGl0YWJsZS1hZGQtaXRlbS1idG5cIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24+YWRkX2JveDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAge3sgdHJhbnNsYXRpb25LZXkgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGZsZXgtd3JhcCBhbGlnbi1jZW50ZXItY2VudGVyIG1haW4tcGFnaW5hdGlvblwiICpuZ0lmPVwidG90YWxFbGVtZW50cyA+IDBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbHVtbiBmbGV4LWZ1bGxcIj5cclxuICAgICAgICAgICAgPGFwcC1wYWdpbmF0b3IgW2N1cnJlbnRQYWdlXT1cInBhZ2VJbmRleFwiIFt0b3RhbEl0ZW1zXT1cInRvdGFsRWxlbWVudHNcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFnZVNpemVPcHRpb25zXT1cIls1LCAxMCwgMjUsIDUwXVwiIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiPjwvYXBwLXBhZ2luYXRvcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uIGZsZXgtZnVsbCBjb3VudEl0ZW0gaGlkZS1ndC14c1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvdW50SXRlbV9fdG90YWxFbGVtZW50XCI+e3sgJ3RvdGFsQ291bnRJdGVtJyB8IHRyYW5zbGF0ZSB9fSA6IHt7IHRoaXMudG90YWxFbGVtZW50cyB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uIGZsZXgtMlwiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2ICpuZ0lmPVwiaXNCdWxrSXRlbXNTdXBwb3J0ZWRcIiBjbGFzcz1cImZsZXgtcm93IGdhcC0xMCBhbGlnbi1zdGFydC1zdGFydCBtYWluVGFibGVcIj5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYWRkQnVsa0l0ZW1zKClcIiBbZGlzYWJsZWRdPVwic2hvdWxkRGlzYWJsZUJ1bGtBZGQoKVwiIGlkPVwiZWRpdGFibGUtYnVsay1hZGQtYnRuXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmFkZF9ib3g8L21hdC1pY29uPlxyXG4gICAgICAgIHt7ICdhZGRBbGwnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2PlxyXG4gICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cIndhcm5cIiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIiFoYXNEYXRhVG9DbGVhcigpXCIgKGNsaWNrKT1cImNsZWFyQnVsa0l0ZW1zKClcIiBpZD1cImVkaXRhYmxlLWJ1bGstY2xlYXItYnRuXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XHJcbiAgICAgICAge3sgJ2NsZWFyQWxsJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19