@bizdoc/core 2.1.12 → 2.1.13

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.
@@ -426,7 +426,7 @@ export let PositionsComponent = class PositionsComponent {
426
426
  this._destroy.complete();
427
427
  }
428
428
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PositionsComponent, deps: [{ token: i1.SessionService }, { token: UtilityRef }, { token: i2.DatasourceService }, { token: i3.PromptService }, { token: i4.WindowTitleService }, { token: i5.TranslateService }, { token: i6.Popup }, { token: i7.SystemService }, { token: i8.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
429
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PositionsComponent, selector: "ng-component", host: { listeners: { "document:keydown": "handleKeyboardEvent($event)" } }, viewQueries: [{ propertyName: "_fileElement", first: true, predicate: ["file"], descendants: true, static: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "noRoleTpl", first: true, predicate: ["noRoleTpl"], descendants: true, static: true }, { propertyName: "roleTpl", first: true, predicate: ["roleTpl"], descendants: true, static: true }, { propertyName: "patternTpl", first: true, predicate: ["patternTpl"], descendants: true, static: true }, { propertyName: "newGroupTpl", first: true, predicate: ["groupTpl"], descendants: true, static: true }], ngImport: i0, template: "<mat-toolbar>\r\n <button mat-icon-button (click)=\"tools = !tools\" [bizdocTooltip]=\"'Collapse' | translate\"><mat-icon>view_sidebar</mat-icon></button>\r\n <button mat-button (click)=\"save()\" color=\"primary\" [disabled]=\"!dirty\">{{'SaveChanges'|translate}}</button>\r\n <span class=\"divider\"></span>\r\n <bizdoc-search-input (valueChange)=\"search($event)\"></bizdoc-search-input>\r\n <button mat-icon-button [matMenuTriggerFor]=\"newMenu\" [bizdocTooltip]=\"'Add'|translate\"><mat-icon>add</mat-icon></button>\r\n <mat-menu #newMenu>\r\n <button mat-menu-item (click)=\"newRole()\">{{'Role'|translate}}</button>\r\n <button mat-menu-item (click)=\"newPattern()\">{{'Pattern'|translate}}</button>\r\n <button mat-menu-item (click)=\"newGroup()\">{{'Group'|translate}} </button>\r\n </mat-menu>\r\n <button mat-icon-button [bizdocTooltip]=\"'Download' | translate\" (click)=\"download()\" [disabled]=\"dirty\"><mat-icon>save_alt</mat-icon></button>\r\n</mat-toolbar>\r\n<mat-progress-bar [mode]=\"loading\" [style.visibility]=\"loading ? 'visible':'hidden'\"></mat-progress-bar>\r\n<div class=\"row flex\">\r\n <mat-nav-list class=\"timeline\" [style.display]=\"tools?'':'none'\">\r\n <mat-list-item *ngFor=\"let t of datatypes|async\" (click)=\"change(t.name)\" [class.active]=\"t === type\">{{t.title}}</mat-list-item>\r\n </mat-nav-list>\r\n <table mat-table matSort [dataSource]=\"dataSource\" [style.display]=\"dataSource ? '': 'none'\" class=\"flex\">\r\n <ng-container *ngFor=\"let column of (type?.columns ||[])\" [matColumnDef]=\"column.name\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{column.label}}</th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element[column.name]}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"key\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{''}}</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <span [ngSwitch]=\"element.type\">\r\n <ng-container *ngSwitchCase=\"'group'\">({{'Group'|translate}})</ng-container>\r\n <ng-container *ngSwitchCase=\"'pattern'\">({{'Pattern'|translate}})</ng-container>\r\n <ng-container *ngSwitchDefault>\r\n {{element.key}}\r\n </ng-container>\r\n </span>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"value\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{''}}</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n {{element.value}}\r\n </td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let role of roles\" [matColumnDef]=\"role.name\">\r\n <th mat-header-cell *matHeaderCellDef>{{role.title}}</th>\r\n <td mat-cell *matCellDef=\"let element\" [attr.data-role]=\"role.name\" class=\"role-column\">\r\n <ng-container *ngIf=\"positions[role.name][element.key]\">\r\n <ng-container *ngFor=\"let u of positions[role.name][element.key]; let first = first\">\r\n <ng-container *ngIf=\"!first\">, </ng-container>\r\n {{profiles[u]?.name}}\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"options\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <button mat-icon-button [matMenuTriggerFor]=\"options\" *ngIf=\"element.type === 'pattern' || element.type === 'group'\"><mat-icon>more_vert</mat-icon></button>\r\n <mat-menu #options>\r\n <ng-container *ngIf=\"element.type === 'pattern'\">\r\n <button mat-menu-item (click)=\"editPattern(element.key)\">{{'Edit'|translate}}</button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"deletePattern(element.key)\">{{'Remove'|translate}} </button>\r\n </ng-container>\r\n <ng-container *ngIf=\"element.type === 'group'\">\r\n <button mat-menu-item (click)=\"editGroup(element.key)\">{{'Edit'|translate}}</button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"deleteGroup(element.key)\">{{'Remove'|translate}} </button>\r\n </ng-container>\r\n </mat-menu>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n <tr mat-row *matRowDef=\"let element; columns: displayedColumns\" (click)=\"edit(element.key, $event)\"></tr>\r\n </table>\r\n</div>\r\n<!-- role template -->\r\n<ng-template #roleTpl>\r\n <h2 mat-dialog-title>{{'Role' | translate }}</h2>\r\n <mat-dialog-content>\r\n <form [formGroup]=\"role\" class=\"column\">\r\n <mat-form-field>\r\n <input matInput formControlName=\"title\" [placeholder]=\"'Title'| translate\" required autocomplete=\"off\" />\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"role.value\" color=\"primary\" [disabled]=\"!role.valid\">{{'OK' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<!-- pattern template -->\r\n<ng-template #patternTpl>\r\n <h2 mat-dialog-title>{{'Pattern' | translate }}</h2>\r\n <mat-dialog-content>\r\n <form [formGroup]=\"pattern\" class=\"column\">\r\n <mat-form-field>\r\n <input matInput formControlName=\"title\" [placeholder]=\"'Title'| translate\" required autocomplete=\"off\" />\r\n </mat-form-field>\r\n <mat-form-field>\r\n <input matInput formControlName=\"expression\" [placeholder]=\"'Regex'| translate\" required autocomplete=\"off\" />\r\n <mat-hint><span [innerHTML]=\"'RegexHint' | translate : 'https://regex101.com/'| sanitizeHtml\"></span></mat-hint>\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"pattern.value\" color=\"primary\" [disabled]=\"!pattern.valid\">{{'OK' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<!-- group -->\r\n<ng-template #groupTpl>\r\n <h2 mat-dialog-title>{{'Group' | translate }}</h2>\r\n <mat-dialog-content>\r\n <form [formGroup]=\"group\" class=\"column\">\r\n <mat-form-field>\r\n <input matInput formControlName=\"title\" [placeholder]=\"'Title'| translate\" required autocomplete=\"off\" />\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-select [placeholder]=\"'Items'|translate\" multiple formControlName=\"items\" required>\r\n <mat-select-trigger>\r\n {{group.value.items ? group.value.items[0] : ''}}\r\n <span *ngIf=\"group.value.items?.length > 1\" class=\"additional-selection\">\r\n (+{{group.value.items.length - 1}} {{(group.value.items?.length === 2 ? 'Other' : 'Others')|translate}})\r\n </span>\r\n </mat-select-trigger>\r\n <mat-option *ngFor=\"let v of source\" [value]=\"v.key\">\r\n <span *ngIf=\"!type.columns\">{{v.value}}</span>\r\n <span *ngIf=\"type.columns\"><span *ngFor=\"let c of type.columns\">{{v.value[c.name]}}</span></span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"group.value\" color=\"primary\" [disabled]=\"!group.valid\">{{'OK' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<ng-template #noRoleTpl>\r\n <mat-dialog-content>\r\n {{'NoRoles'|translate : type?.title}}\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"true\" color=\"primary\">{{'CreateRole' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<!--<form style=\"display:none\">\r\n <input type=\"file\" name=\"file\" (onchange)=\"upload($event)\" #file/>\r\n</form>-->\r\n", styles: [":host{flex-direction:column}table{width:100%}.form{padding:8px}:host ::ng-deep .mat-mdc-list-item{cursor:pointer}table ::ng-deep .role-column{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i9.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i9.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i10.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i10.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: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i10.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i10.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i10.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i11.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i11.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i11.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i11.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i11.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i11.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i11.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i11.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i11.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i11.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i12.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i12.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "directive", type: i8.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i8.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i8.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i8.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i13.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i14.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "component", type: i14.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "component", type: i15.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i16.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i17.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i18.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i18.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "component", type: i19.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i19.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i20.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i20.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i21.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: i22.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i23.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i23.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i23.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i24.TooltipDirective, selector: "[bizdocTooltip]", inputs: ["bizdocTooltip", "bizdocTooltipTemplate", "bizdocTooltipContext", "bizdocTooltipPosition", "bizdocTooltipDuration", "bizdocTooltipDisabled"] }, { kind: "component", type: i25.SearchInput, selector: "bizdoc-search-input", outputs: ["valueChange"] }, { kind: "pipe", type: i9.AsyncPipe, name: "async" }, { kind: "pipe", type: i26.SanitizeHtmlPipe, name: "sanitizeHtml" }, { kind: "pipe", type: i27.TranslatePipe, name: "translate" }] }); }
429
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PositionsComponent, selector: "ng-component", host: { listeners: { "document:keydown": "handleKeyboardEvent($event)" } }, viewQueries: [{ propertyName: "_fileElement", first: true, predicate: ["file"], descendants: true, static: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "noRoleTpl", first: true, predicate: ["noRoleTpl"], descendants: true, static: true }, { propertyName: "roleTpl", first: true, predicate: ["roleTpl"], descendants: true, static: true }, { propertyName: "patternTpl", first: true, predicate: ["patternTpl"], descendants: true, static: true }, { propertyName: "newGroupTpl", first: true, predicate: ["groupTpl"], descendants: true, static: true }], ngImport: i0, template: "<mat-toolbar>\r\n <button mat-icon-button (click)=\"tools = !tools\" [bizdocTooltip]=\"'Collapse' | translate\"><mat-icon>view_sidebar</mat-icon></button>\r\n <button mat-button (click)=\"save()\" color=\"primary\" [disabled]=\"!dirty\">{{'SaveChanges'|translate}}</button>\r\n <span class=\"divider\"></span>\r\n <bizdoc-search-input (valueChange)=\"search($event)\"></bizdoc-search-input>\r\n <button mat-icon-button [matMenuTriggerFor]=\"newMenu\" [bizdocTooltip]=\"'Add'|translate\"><mat-icon>add</mat-icon></button>\r\n <mat-menu #newMenu>\r\n <button mat-menu-item (click)=\"newRole()\">{{'Role'|translate}}</button>\r\n <button mat-menu-item (click)=\"newPattern()\">{{'Pattern'|translate}}</button>\r\n <button mat-menu-item (click)=\"newGroup()\">{{'Group'|translate}} </button>\r\n </mat-menu>\r\n <button mat-icon-button [bizdocTooltip]=\"'Download' | translate\" (click)=\"download()\" [disabled]=\"dirty\"><mat-icon>save_alt</mat-icon></button>\r\n</mat-toolbar>\r\n<mat-progress-bar [mode]=\"loading\" [style.visibility]=\"loading ? 'visible':'hidden'\"></mat-progress-bar>\r\n<div class=\"row flex\">\r\n <mat-nav-list class=\"timeline\" [style.display]=\"tools?'':'none'\">\r\n <mat-list-item *ngFor=\"let t of datatypes\" (click)=\"change(t.name)\" [class.active]=\"t === type\">{{t.title}}</mat-list-item>\r\n </mat-nav-list>\r\n <table mat-table matSort [dataSource]=\"dataSource\" [style.display]=\"dataSource ? '': 'none'\" class=\"flex\">\r\n <ng-container *ngFor=\"let column of (type?.columns ||[])\" [matColumnDef]=\"column.name\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{column.label}}</th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element[column.name]}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"key\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{''}}</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <span [ngSwitch]=\"element.type\">\r\n <ng-container *ngSwitchCase=\"'group'\">({{'Group'|translate}})</ng-container>\r\n <ng-container *ngSwitchCase=\"'pattern'\">({{'Pattern'|translate}})</ng-container>\r\n <ng-container *ngSwitchDefault>\r\n {{element.key}}\r\n </ng-container>\r\n </span>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"value\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{''}}</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n {{element.value}}\r\n </td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let role of roles\" [matColumnDef]=\"role.name\">\r\n <th mat-header-cell *matHeaderCellDef>{{role.title}}</th>\r\n <td mat-cell *matCellDef=\"let element\" [attr.data-role]=\"role.name\" class=\"role-column\">\r\n <ng-container *ngIf=\"positions[role.name][element.key]\">\r\n <ng-container *ngFor=\"let u of positions[role.name][element.key]; let first = first\">\r\n <ng-container *ngIf=\"!first\">, </ng-container>\r\n {{profiles[u]?.name}}\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"options\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <button mat-icon-button [matMenuTriggerFor]=\"options\" *ngIf=\"element.type === 'pattern' || element.type === 'group'\"><mat-icon>more_vert</mat-icon></button>\r\n <mat-menu #options>\r\n <ng-container *ngIf=\"element.type === 'pattern'\">\r\n <button mat-menu-item (click)=\"editPattern(element.key)\">{{'Edit'|translate}}</button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"deletePattern(element.key)\">{{'Remove'|translate}} </button>\r\n </ng-container>\r\n <ng-container *ngIf=\"element.type === 'group'\">\r\n <button mat-menu-item (click)=\"editGroup(element.key)\">{{'Edit'|translate}}</button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"deleteGroup(element.key)\">{{'Remove'|translate}} </button>\r\n </ng-container>\r\n </mat-menu>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n <tr mat-row *matRowDef=\"let element; columns: displayedColumns\" (click)=\"edit(element.key, $event)\"></tr>\r\n </table>\r\n</div>\r\n<!-- role template -->\r\n<ng-template #roleTpl>\r\n <h2 mat-dialog-title>{{'Role' | translate }}</h2>\r\n <mat-dialog-content>\r\n <form [formGroup]=\"role\" class=\"column\">\r\n <mat-form-field>\r\n <input matInput formControlName=\"title\" [placeholder]=\"'Title'| translate\" required autocomplete=\"off\" />\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"role.value\" color=\"primary\" [disabled]=\"!role.valid\">{{'OK' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<!-- pattern template -->\r\n<ng-template #patternTpl>\r\n <h2 mat-dialog-title>{{'Pattern' | translate }}</h2>\r\n <mat-dialog-content>\r\n <form [formGroup]=\"pattern\" class=\"column\">\r\n <mat-form-field>\r\n <input matInput formControlName=\"title\" [placeholder]=\"'Title'| translate\" required autocomplete=\"off\" />\r\n </mat-form-field>\r\n <mat-form-field>\r\n <input matInput formControlName=\"expression\" [placeholder]=\"'Regex'| translate\" required autocomplete=\"off\" />\r\n <mat-hint><span [innerHTML]=\"'RegexHint' | translate : 'https://regex101.com/'| sanitizeHtml\"></span></mat-hint>\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"pattern.value\" color=\"primary\" [disabled]=\"!pattern.valid\">{{'OK' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<!-- group -->\r\n<ng-template #groupTpl>\r\n <h2 mat-dialog-title>{{'Group' | translate }}</h2>\r\n <mat-dialog-content>\r\n <form [formGroup]=\"group\" class=\"column\">\r\n <mat-form-field>\r\n <input matInput formControlName=\"title\" [placeholder]=\"'Title'| translate\" required autocomplete=\"off\" />\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-select [placeholder]=\"'Items'|translate\" multiple formControlName=\"items\" required>\r\n <mat-select-trigger>\r\n {{group.value.items ? group.value.items[0] : ''}}\r\n <span *ngIf=\"group.value.items?.length > 1\" class=\"additional-selection\">\r\n (+{{group.value.items.length - 1}} {{(group.value.items?.length === 2 ? 'Other' : 'Others')|translate}})\r\n </span>\r\n </mat-select-trigger>\r\n <mat-option *ngFor=\"let v of source\" [value]=\"v.key\">\r\n <span *ngIf=\"!type.columns\">{{v.value}}</span>\r\n <span *ngIf=\"type.columns\"><span *ngFor=\"let c of type.columns\">{{v.value[c.name]}}</span></span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"group.value\" color=\"primary\" [disabled]=\"!group.valid\">{{'OK' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<ng-template #noRoleTpl>\r\n <mat-dialog-content>\r\n {{'NoRoles'|translate : type?.title}}\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"true\" color=\"primary\">{{'CreateRole' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<!--<form style=\"display:none\">\r\n <input type=\"file\" name=\"file\" (onchange)=\"upload($event)\" #file/>\r\n</form>-->\r\n", styles: [":host{flex-direction:column}table{width:100%}.form{padding:8px}:host ::ng-deep .mat-mdc-list-item{cursor:pointer}table ::ng-deep .role-column{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i9.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i9.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i10.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i10.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: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i10.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i10.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i10.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i11.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i11.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i11.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i11.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i11.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i11.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i11.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i11.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i11.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i11.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i12.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i12.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "directive", type: i8.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i8.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i8.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i8.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i13.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i14.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "component", type: i14.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "component", type: i15.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i16.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i17.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i18.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i18.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "component", type: i19.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i19.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i20.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i20.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i21.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: i22.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i23.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i23.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i23.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i24.TooltipDirective, selector: "[bizdocTooltip]", inputs: ["bizdocTooltip", "bizdocTooltipTemplate", "bizdocTooltipContext", "bizdocTooltipPosition", "bizdocTooltipDuration", "bizdocTooltipDisabled"] }, { kind: "component", type: i25.SearchInput, selector: "bizdoc-search-input", outputs: ["valueChange"] }, { kind: "pipe", type: i26.SanitizeHtmlPipe, name: "sanitizeHtml" }, { kind: "pipe", type: i27.TranslatePipe, name: "translate" }] }); }
430
430
  };
431
431
  PositionsComponent = __decorate([
432
432
  BizDoc({ selector: 'bizdoc-positions' })
@@ -434,7 +434,7 @@ PositionsComponent = __decorate([
434
434
  ], PositionsComponent);
435
435
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PositionsComponent, decorators: [{
436
436
  type: Component,
437
- args: [{ template: "<mat-toolbar>\r\n <button mat-icon-button (click)=\"tools = !tools\" [bizdocTooltip]=\"'Collapse' | translate\"><mat-icon>view_sidebar</mat-icon></button>\r\n <button mat-button (click)=\"save()\" color=\"primary\" [disabled]=\"!dirty\">{{'SaveChanges'|translate}}</button>\r\n <span class=\"divider\"></span>\r\n <bizdoc-search-input (valueChange)=\"search($event)\"></bizdoc-search-input>\r\n <button mat-icon-button [matMenuTriggerFor]=\"newMenu\" [bizdocTooltip]=\"'Add'|translate\"><mat-icon>add</mat-icon></button>\r\n <mat-menu #newMenu>\r\n <button mat-menu-item (click)=\"newRole()\">{{'Role'|translate}}</button>\r\n <button mat-menu-item (click)=\"newPattern()\">{{'Pattern'|translate}}</button>\r\n <button mat-menu-item (click)=\"newGroup()\">{{'Group'|translate}} </button>\r\n </mat-menu>\r\n <button mat-icon-button [bizdocTooltip]=\"'Download' | translate\" (click)=\"download()\" [disabled]=\"dirty\"><mat-icon>save_alt</mat-icon></button>\r\n</mat-toolbar>\r\n<mat-progress-bar [mode]=\"loading\" [style.visibility]=\"loading ? 'visible':'hidden'\"></mat-progress-bar>\r\n<div class=\"row flex\">\r\n <mat-nav-list class=\"timeline\" [style.display]=\"tools?'':'none'\">\r\n <mat-list-item *ngFor=\"let t of datatypes|async\" (click)=\"change(t.name)\" [class.active]=\"t === type\">{{t.title}}</mat-list-item>\r\n </mat-nav-list>\r\n <table mat-table matSort [dataSource]=\"dataSource\" [style.display]=\"dataSource ? '': 'none'\" class=\"flex\">\r\n <ng-container *ngFor=\"let column of (type?.columns ||[])\" [matColumnDef]=\"column.name\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{column.label}}</th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element[column.name]}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"key\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{''}}</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <span [ngSwitch]=\"element.type\">\r\n <ng-container *ngSwitchCase=\"'group'\">({{'Group'|translate}})</ng-container>\r\n <ng-container *ngSwitchCase=\"'pattern'\">({{'Pattern'|translate}})</ng-container>\r\n <ng-container *ngSwitchDefault>\r\n {{element.key}}\r\n </ng-container>\r\n </span>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"value\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{''}}</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n {{element.value}}\r\n </td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let role of roles\" [matColumnDef]=\"role.name\">\r\n <th mat-header-cell *matHeaderCellDef>{{role.title}}</th>\r\n <td mat-cell *matCellDef=\"let element\" [attr.data-role]=\"role.name\" class=\"role-column\">\r\n <ng-container *ngIf=\"positions[role.name][element.key]\">\r\n <ng-container *ngFor=\"let u of positions[role.name][element.key]; let first = first\">\r\n <ng-container *ngIf=\"!first\">, </ng-container>\r\n {{profiles[u]?.name}}\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"options\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <button mat-icon-button [matMenuTriggerFor]=\"options\" *ngIf=\"element.type === 'pattern' || element.type === 'group'\"><mat-icon>more_vert</mat-icon></button>\r\n <mat-menu #options>\r\n <ng-container *ngIf=\"element.type === 'pattern'\">\r\n <button mat-menu-item (click)=\"editPattern(element.key)\">{{'Edit'|translate}}</button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"deletePattern(element.key)\">{{'Remove'|translate}} </button>\r\n </ng-container>\r\n <ng-container *ngIf=\"element.type === 'group'\">\r\n <button mat-menu-item (click)=\"editGroup(element.key)\">{{'Edit'|translate}}</button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"deleteGroup(element.key)\">{{'Remove'|translate}} </button>\r\n </ng-container>\r\n </mat-menu>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n <tr mat-row *matRowDef=\"let element; columns: displayedColumns\" (click)=\"edit(element.key, $event)\"></tr>\r\n </table>\r\n</div>\r\n<!-- role template -->\r\n<ng-template #roleTpl>\r\n <h2 mat-dialog-title>{{'Role' | translate }}</h2>\r\n <mat-dialog-content>\r\n <form [formGroup]=\"role\" class=\"column\">\r\n <mat-form-field>\r\n <input matInput formControlName=\"title\" [placeholder]=\"'Title'| translate\" required autocomplete=\"off\" />\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"role.value\" color=\"primary\" [disabled]=\"!role.valid\">{{'OK' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<!-- pattern template -->\r\n<ng-template #patternTpl>\r\n <h2 mat-dialog-title>{{'Pattern' | translate }}</h2>\r\n <mat-dialog-content>\r\n <form [formGroup]=\"pattern\" class=\"column\">\r\n <mat-form-field>\r\n <input matInput formControlName=\"title\" [placeholder]=\"'Title'| translate\" required autocomplete=\"off\" />\r\n </mat-form-field>\r\n <mat-form-field>\r\n <input matInput formControlName=\"expression\" [placeholder]=\"'Regex'| translate\" required autocomplete=\"off\" />\r\n <mat-hint><span [innerHTML]=\"'RegexHint' | translate : 'https://regex101.com/'| sanitizeHtml\"></span></mat-hint>\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"pattern.value\" color=\"primary\" [disabled]=\"!pattern.valid\">{{'OK' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<!-- group -->\r\n<ng-template #groupTpl>\r\n <h2 mat-dialog-title>{{'Group' | translate }}</h2>\r\n <mat-dialog-content>\r\n <form [formGroup]=\"group\" class=\"column\">\r\n <mat-form-field>\r\n <input matInput formControlName=\"title\" [placeholder]=\"'Title'| translate\" required autocomplete=\"off\" />\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-select [placeholder]=\"'Items'|translate\" multiple formControlName=\"items\" required>\r\n <mat-select-trigger>\r\n {{group.value.items ? group.value.items[0] : ''}}\r\n <span *ngIf=\"group.value.items?.length > 1\" class=\"additional-selection\">\r\n (+{{group.value.items.length - 1}} {{(group.value.items?.length === 2 ? 'Other' : 'Others')|translate}})\r\n </span>\r\n </mat-select-trigger>\r\n <mat-option *ngFor=\"let v of source\" [value]=\"v.key\">\r\n <span *ngIf=\"!type.columns\">{{v.value}}</span>\r\n <span *ngIf=\"type.columns\"><span *ngFor=\"let c of type.columns\">{{v.value[c.name]}}</span></span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"group.value\" color=\"primary\" [disabled]=\"!group.valid\">{{'OK' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<ng-template #noRoleTpl>\r\n <mat-dialog-content>\r\n {{'NoRoles'|translate : type?.title}}\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"true\" color=\"primary\">{{'CreateRole' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<!--<form style=\"display:none\">\r\n <input type=\"file\" name=\"file\" (onchange)=\"upload($event)\" #file/>\r\n</form>-->\r\n", styles: [":host{flex-direction:column}table{width:100%}.form{padding:8px}:host ::ng-deep .mat-mdc-list-item{cursor:pointer}table ::ng-deep .role-column{cursor:pointer}\n"] }]
437
+ args: [{ template: "<mat-toolbar>\r\n <button mat-icon-button (click)=\"tools = !tools\" [bizdocTooltip]=\"'Collapse' | translate\"><mat-icon>view_sidebar</mat-icon></button>\r\n <button mat-button (click)=\"save()\" color=\"primary\" [disabled]=\"!dirty\">{{'SaveChanges'|translate}}</button>\r\n <span class=\"divider\"></span>\r\n <bizdoc-search-input (valueChange)=\"search($event)\"></bizdoc-search-input>\r\n <button mat-icon-button [matMenuTriggerFor]=\"newMenu\" [bizdocTooltip]=\"'Add'|translate\"><mat-icon>add</mat-icon></button>\r\n <mat-menu #newMenu>\r\n <button mat-menu-item (click)=\"newRole()\">{{'Role'|translate}}</button>\r\n <button mat-menu-item (click)=\"newPattern()\">{{'Pattern'|translate}}</button>\r\n <button mat-menu-item (click)=\"newGroup()\">{{'Group'|translate}} </button>\r\n </mat-menu>\r\n <button mat-icon-button [bizdocTooltip]=\"'Download' | translate\" (click)=\"download()\" [disabled]=\"dirty\"><mat-icon>save_alt</mat-icon></button>\r\n</mat-toolbar>\r\n<mat-progress-bar [mode]=\"loading\" [style.visibility]=\"loading ? 'visible':'hidden'\"></mat-progress-bar>\r\n<div class=\"row flex\">\r\n <mat-nav-list class=\"timeline\" [style.display]=\"tools?'':'none'\">\r\n <mat-list-item *ngFor=\"let t of datatypes\" (click)=\"change(t.name)\" [class.active]=\"t === type\">{{t.title}}</mat-list-item>\r\n </mat-nav-list>\r\n <table mat-table matSort [dataSource]=\"dataSource\" [style.display]=\"dataSource ? '': 'none'\" class=\"flex\">\r\n <ng-container *ngFor=\"let column of (type?.columns ||[])\" [matColumnDef]=\"column.name\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{column.label}}</th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element[column.name]}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"key\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{''}}</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <span [ngSwitch]=\"element.type\">\r\n <ng-container *ngSwitchCase=\"'group'\">({{'Group'|translate}})</ng-container>\r\n <ng-container *ngSwitchCase=\"'pattern'\">({{'Pattern'|translate}})</ng-container>\r\n <ng-container *ngSwitchDefault>\r\n {{element.key}}\r\n </ng-container>\r\n </span>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"value\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{''}}</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n {{element.value}}\r\n </td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let role of roles\" [matColumnDef]=\"role.name\">\r\n <th mat-header-cell *matHeaderCellDef>{{role.title}}</th>\r\n <td mat-cell *matCellDef=\"let element\" [attr.data-role]=\"role.name\" class=\"role-column\">\r\n <ng-container *ngIf=\"positions[role.name][element.key]\">\r\n <ng-container *ngFor=\"let u of positions[role.name][element.key]; let first = first\">\r\n <ng-container *ngIf=\"!first\">, </ng-container>\r\n {{profiles[u]?.name}}\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"options\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <button mat-icon-button [matMenuTriggerFor]=\"options\" *ngIf=\"element.type === 'pattern' || element.type === 'group'\"><mat-icon>more_vert</mat-icon></button>\r\n <mat-menu #options>\r\n <ng-container *ngIf=\"element.type === 'pattern'\">\r\n <button mat-menu-item (click)=\"editPattern(element.key)\">{{'Edit'|translate}}</button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"deletePattern(element.key)\">{{'Remove'|translate}} </button>\r\n </ng-container>\r\n <ng-container *ngIf=\"element.type === 'group'\">\r\n <button mat-menu-item (click)=\"editGroup(element.key)\">{{'Edit'|translate}}</button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"deleteGroup(element.key)\">{{'Remove'|translate}} </button>\r\n </ng-container>\r\n </mat-menu>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n <tr mat-row *matRowDef=\"let element; columns: displayedColumns\" (click)=\"edit(element.key, $event)\"></tr>\r\n </table>\r\n</div>\r\n<!-- role template -->\r\n<ng-template #roleTpl>\r\n <h2 mat-dialog-title>{{'Role' | translate }}</h2>\r\n <mat-dialog-content>\r\n <form [formGroup]=\"role\" class=\"column\">\r\n <mat-form-field>\r\n <input matInput formControlName=\"title\" [placeholder]=\"'Title'| translate\" required autocomplete=\"off\" />\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"role.value\" color=\"primary\" [disabled]=\"!role.valid\">{{'OK' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<!-- pattern template -->\r\n<ng-template #patternTpl>\r\n <h2 mat-dialog-title>{{'Pattern' | translate }}</h2>\r\n <mat-dialog-content>\r\n <form [formGroup]=\"pattern\" class=\"column\">\r\n <mat-form-field>\r\n <input matInput formControlName=\"title\" [placeholder]=\"'Title'| translate\" required autocomplete=\"off\" />\r\n </mat-form-field>\r\n <mat-form-field>\r\n <input matInput formControlName=\"expression\" [placeholder]=\"'Regex'| translate\" required autocomplete=\"off\" />\r\n <mat-hint><span [innerHTML]=\"'RegexHint' | translate : 'https://regex101.com/'| sanitizeHtml\"></span></mat-hint>\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"pattern.value\" color=\"primary\" [disabled]=\"!pattern.valid\">{{'OK' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<!-- group -->\r\n<ng-template #groupTpl>\r\n <h2 mat-dialog-title>{{'Group' | translate }}</h2>\r\n <mat-dialog-content>\r\n <form [formGroup]=\"group\" class=\"column\">\r\n <mat-form-field>\r\n <input matInput formControlName=\"title\" [placeholder]=\"'Title'| translate\" required autocomplete=\"off\" />\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-select [placeholder]=\"'Items'|translate\" multiple formControlName=\"items\" required>\r\n <mat-select-trigger>\r\n {{group.value.items ? group.value.items[0] : ''}}\r\n <span *ngIf=\"group.value.items?.length > 1\" class=\"additional-selection\">\r\n (+{{group.value.items.length - 1}} {{(group.value.items?.length === 2 ? 'Other' : 'Others')|translate}})\r\n </span>\r\n </mat-select-trigger>\r\n <mat-option *ngFor=\"let v of source\" [value]=\"v.key\">\r\n <span *ngIf=\"!type.columns\">{{v.value}}</span>\r\n <span *ngIf=\"type.columns\"><span *ngFor=\"let c of type.columns\">{{v.value[c.name]}}</span></span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"group.value\" color=\"primary\" [disabled]=\"!group.valid\">{{'OK' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<ng-template #noRoleTpl>\r\n <mat-dialog-content>\r\n {{'NoRoles'|translate : type?.title}}\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"true\" color=\"primary\">{{'CreateRole' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<!--<form style=\"display:none\">\r\n <input type=\"file\" name=\"file\" (onchange)=\"upload($event)\" #file/>\r\n</form>-->\r\n", styles: [":host{flex-direction:column}table{width:100%}.form{padding:8px}:host ::ng-deep .mat-mdc-list-item{cursor:pointer}table ::ng-deep .role-column{cursor:pointer}\n"] }]
438
438
  }], ctorParameters: function () { return [{ type: i1.SessionService }, { type: i28.UtilityRef, decorators: [{
439
439
  type: Inject,
440
440
  args: [UtilityRef]
@@ -460,4 +460,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
460
460
  type: HostListener,
461
461
  args: ['document:keydown', ['$event']]
462
462
  }] } });
463
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zaXRpb25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcmllcy9jb3JlL3NyYy9saWIvYWRtaW4vcG9zaXRpb25zL3Bvc2l0aW9ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJpZXMvY29yZS9zcmMvbGliL2FkbWluL3Bvc2l0aW9ucy9wb3NpdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUEwQixNQUFNLEVBQWMsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZILE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFN0QsT0FBTyxFQUFFLFFBQVEsRUFBMEIsTUFBTSw4QkFBOEIsQ0FBQztBQVdoRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQWlCLE1BQU0sNkJBQTZCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFyRSxXQUFNLGtCQUFrQixHQUF4QixNQUFNLGtCQUFrQjtJQWtDN0IscUJBQXFCO0lBQ3JCLFlBQW9CLFFBQXdCLEVBQ2QsV0FBeUMsRUFDN0QsWUFBK0IsRUFDL0IsR0FBa0IsRUFDMUIsS0FBeUIsRUFDakIsVUFBNEIsRUFDNUIsTUFBYSxFQUNiLFFBQXVCLEVBQ3ZCLE9BQWtCO1FBUlIsYUFBUSxHQUFSLFFBQVEsQ0FBZ0I7UUFDZCxnQkFBVyxHQUFYLFdBQVcsQ0FBOEI7UUFDN0QsaUJBQVksR0FBWixZQUFZLENBQW1CO1FBQy9CLFFBQUcsR0FBSCxHQUFHLENBQWU7UUFFbEIsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFDNUIsV0FBTSxHQUFOLE1BQU0sQ0FBTztRQUNiLGFBQVEsR0FBUixRQUFRLENBQWU7UUFDdkIsWUFBTyxHQUFQLE9BQU8sQ0FBVztRQXJDNUIsVUFBSyxHQUFZLElBQUksQ0FBQztRQUl0QixVQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2QsV0FBTSxHQUFHLEtBQUssQ0FBQztRQU1OLFNBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUM3QixDQUFDLENBQUM7UUFDTSxTQUFJLEdBQUcsSUFBSSxTQUFTLENBQUM7WUFDNUIsS0FBSyxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1NBQ2xELENBQUMsQ0FBQztRQUNNLFlBQU8sR0FBRyxJQUFJLFNBQVMsQ0FBQztZQUMvQixLQUFLLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDakQsVUFBVSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1NBQ3ZELENBQUMsQ0FBQztRQUNNLFVBQUssR0FBRyxJQUFJLFNBQVMsQ0FBQztZQUM3QixLQUFLLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDakQsS0FBSyxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1NBQ2xELENBQUMsQ0FBQztRQUdjLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBWTlDLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxRQUFRO1FBQ04sSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDeEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7WUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFDTyxRQUFRO1FBQ2QsT0FBTyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRTtnQkFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUNYLElBQUksQ0FBQyxTQUFTO2dCQUNkLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUNsQixDQUFDO1NBQ0gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE1BQU0sQ0FBQyxLQUFhO1FBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNqQyxDQUFDO0lBQ0QsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFZO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ25FLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDeEYsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN6QyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ1IsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQ2hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO2dCQUNoQyxJQUFJLENBQUMsU0FBUztvQkFDWixTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtvQkFBRSxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRO29CQUFFLEtBQUssQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO2dCQUN6QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7d0JBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2pELENBQUMsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO2dCQUMzQixNQUFNLElBQUksR0FBWSxFQUFFLENBQUM7Z0JBQ3pCLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQzNDLE1BQU0sR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBVyxDQUFDO29CQUN0RCxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQzdELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pCLENBQUMsQ0FBQyxDQUFDO2dCQUNILEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ3ZDLE1BQU0sR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBVyxDQUFDO29CQUNwRCxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQzdELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pCLENBQUMsQ0FBQyxDQUFDO2dCQUNILENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ1osTUFBTSxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFXLENBQUM7b0JBQzNDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7d0JBQ3ZDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2hDLENBQUMsQ0FBQyxDQUFDO29CQUNILElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pCLENBQUMsQ0FBQyxDQUFDO2dCQUVILElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDakMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNoQixDQUFDLEtBQUssQ0FBQyxNQUFNO29CQUNYLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FDN0QsRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUN0QixDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtnQkFDYixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNPLFFBQVE7UUFDZCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FDeEcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRDs7OztPQUlHO0lBQ0gsSUFBSSxDQUFDLEdBQVEsRUFBRSxHQUFlO1FBQzVCLElBQUssR0FBRyxDQUFDLE1BQXNCLENBQUMsT0FBTyxLQUFLLFVBQVU7WUFBRSxPQUFPO1FBRS9ELElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFxQixDQUFDO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJO1lBQzFCLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBRTVCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFNUMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBRWxCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztRQUVwRCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTFDLElBQUksQ0FBQyxTQUFTO1lBQUUsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRTNELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsTUFBcUIsRUFBRTtZQUMxRCxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQW1CO1NBQ3pELENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5RyxDQUFDO0lBQ08sV0FBVyxDQUFDLElBQXNCLEVBQUUsSUFBZSxFQUFFLE1BQVc7UUFDdEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssT0FBTyxDQUFDLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQ2hHLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDN0QsT0FBTyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDeEQsU0FBUyxDQUFDLENBQUMsQ0FBTyxFQUFFLEVBQUU7WUFDcEIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBQ0QsUUFBUTtRQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFxQyxFQUFFLEVBQUU7WUFDN0gsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0QsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQVcsQ0FBQztZQUNsRCxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUN2RSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsVUFBVTtRQUNSLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFVLEVBQUUsRUFBRTtZQUMxRyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBVyxDQUFDO1lBQ3BELEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFB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c0JBQXZCLFNBQVM7dUJBQUMsT0FBTztnQkFTd0IsU0FBUztzQkFBbEQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNBLE9BQU87c0JBQTlDLFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDSyxVQUFVO3NCQUFwRCxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ0EsV0FBVztzQkFBbkQsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQStOdkMsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgT25EZXN0cm95LCBUZW1wbGF0ZVJlZiwgSW5qZWN0LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgU3ViamVjdCwgb2YsIEVNUFRZLCB0YXAsIGZvcmtKb2luLCBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwsIGZpbHRlciwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XHJcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcclxuaW1wb3J0IHsgUHJvZ3Jlc3NCYXJNb2RlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3MtYmFyJztcclxuaW1wb3J0IHsgV29ya2Jvb2ssIFdvcmtzaGVldCwgUm93LCBDb2x1bW4gfSBmcm9tICdAc3luY2Z1c2lvbi9lajItZXhjZWwtZXhwb3J0JztcclxuaW1wb3J0IHsgUm9sZSwgVHlwZSwgVXNlckluZm8gfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscyc7XHJcbmltcG9ydCB7IEFkbWluQ29tcG9uZW50IH0gZnJvbSAnLi4vYWRtaW4tZGlzbWlzcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2Vzc2lvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3Nlc3Npb24uc2VydmljZSc7XHJcbmltcG9ydCB7IERhdGFzb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9kYXRhc291cmNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQcm9tcHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9wcm9tcHQuc2VydmljZSc7XHJcbmltcG9ydCB7IFdpbmRvd1RpdGxlU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvd2luZG93LXRpdGxlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS90cmFuc2xhdGUuc2VydmljZSc7XHJcbmltcG9ydCB7IERhdGFUeXBlSW5mbywgU3lzdGVtU2VydmljZSB9IGZyb20gJy4uL3N5c3RlbS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUG9wdXAgfSBmcm9tICcuLi8uLi9jb3JlL3BvcHVwL3BvcHVwLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVdGlsaXR5Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29yZS9iYXNlJztcclxuaW1wb3J0IHsgVXRpbGl0eVJlZiB9IGZyb20gJy4uL3V0aWxpdHktcmVmJztcclxuaW1wb3J0IHsgQml6RG9jIH0gZnJvbSAnLi4vLi4vY29yZS9kZWNvcmF0b3JzJztcclxuaW1wb3J0IHsgUG9zaXRpb25zUG9wdXAsIFBvc2l0aW9uc0RhdGEgfSBmcm9tICcuL3Bvc2l0aW9ucy1wb3B1cC5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgdGVtcGxhdGVVcmw6ICcuL3Bvc2l0aW9ucy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcG9zaXRpb25zLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuQEJpekRvYyh7IHNlbGVjdG9yOiAnYml6ZG9jLXBvc2l0aW9ucycgfSlcclxuLyoqIHBvc2l0aW9ucyBjb21wb25lbnQqL1xyXG5leHBvcnQgY2xhc3MgUG9zaXRpb25zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIFV0aWxpdHlDb21wb25lbnQ8Ym9vbGVhbiwgVHlwZU1hcD4sIEFkbWluQ29tcG9uZW50IHtcclxuICBAVmlld0NoaWxkKCdmaWxlJywgeyBzdGF0aWM6IHRydWUgfSkgX2ZpbGVFbGVtZW50OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG4gIGRhdGFTb3VyY2U6IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc29ydDogTWF0U29ydDtcclxuICBkYXRhdHlwZXM6IERhdGFUeXBlSW5mb1tdO1xyXG4gIHJvbGVzOiBSb2xlW107XHJcbiAgdG9vbHM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdO1xyXG4gIHByb2ZpbGVzOiB7IFtpZDogc3RyaW5nXTogVXNlckluZm8gfTtcclxuICB0eXBlPzogVHlwZTtcclxuICBkaXJ0eSA9IGZhbHNlO1xyXG4gIHNhdmluZyA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoJ25vUm9sZVRwbCcsIHsgc3RhdGljOiB0cnVlIH0pIG5vUm9sZVRwbDogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdyb2xlVHBsJywgeyBzdGF0aWM6IHRydWUgfSkgcm9sZVRwbDogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdwYXR0ZXJuVHBsJywgeyBzdGF0aWM6IHRydWUgfSkgcGF0dGVyblRwbDogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdncm91cFRwbCcsIHsgc3RhdGljOiB0cnVlIH0pIG5ld0dyb3VwVHBsOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIHNvdXJjZTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IGFueTsgfVtdO1xyXG4gIHJlYWRvbmx5IGZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcclxuICB9KTtcclxuICByZWFkb25seSByb2xlID0gbmV3IEZvcm1Hcm91cCh7XHJcbiAgICB0aXRsZTogbmV3IEZvcm1Db250cm9sKG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWQpXHJcbiAgfSk7XHJcbiAgcmVhZG9ubHkgcGF0dGVybiA9IG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgdGl0bGU6IG5ldyBGb3JtQ29udHJvbChudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgIGV4cHJlc3Npb246IG5ldyBGb3JtQ29udHJvbChudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxyXG4gIH0pO1xyXG4gIHJlYWRvbmx5IGdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XHJcbiAgICB0aXRsZTogbmV3IEZvcm1Db250cm9sKG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxyXG4gICAgaXRlbXM6IG5ldyBGb3JtQ29udHJvbChudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxyXG4gIH0pO1xyXG4gIHByaXZhdGUgX2V2ZXJ5dGhpbmc6IFR5cGVNYXA7XHJcbiAgcG9zaXRpb25zOiB7IFtyb2xlOiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gfTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBsb2FkaW5nOiBQcm9ncmVzc0Jhck1vZGU7XHJcbiAgLyoqIHBvc2l0aW9ucyBjdG9yICovXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfc2Vzc2lvbjogU2Vzc2lvblNlcnZpY2UsXHJcbiAgICBASW5qZWN0KFV0aWxpdHlSZWYpIHByaXZhdGUgX3V0aWxpdHlSZWY6IFV0aWxpdHlSZWY8Ym9vbGVhbiwgVHlwZU1hcD4sXHJcbiAgICBwcml2YXRlIF9kYXRhc291cmNlczogRGF0YXNvdXJjZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9wczogUHJvbXB0U2VydmljZSxcclxuICAgIHRpdGxlOiBXaW5kb3dUaXRsZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9wb3B1cDogUG9wdXAsXHJcbiAgICBwcml2YXRlIF9zZXJ2aWNlOiBTeXN0ZW1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZGlhbG9nOiBNYXREaWFsb2cpIHtcclxuICAgIHRpdGxlLnNldChfdHJhbnNsYXRlLmdldCgnUm9sZXMnKSk7XHJcbiAgfVxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkaW5nID0gJ3F1ZXJ5JztcclxuICAgIHRoaXMuX3ByZXBhcmUoKS5zdWJzY3JpYmUoKCkgPT5cclxuICAgICAgdGhpcy5fdXRpbGl0eVJlZi5wb3B1bGF0ZSgpLnN1YnNjcmliZShyID0+IHtcclxuICAgICAgICB0aGlzLl9ldmVyeXRoaW5nID0gcjtcclxuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5kYXRhdHlwZXMuZmluZCh0ID0+IHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5yb2xlcy5maW5kSW5kZXgociA9PiByLmRhdGFUeXBlID09PSB0Lm5hbWUpID4gLTEpO1xyXG4gICAgICAgIHR5cGUgJiYgdGhpcy5jaGFuZ2UodHlwZS5uYW1lKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBudWxsO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfcHJlcGFyZSgpIHtcclxuICAgIHJldHVybiBmb3JrSm9pbihbdGhpcy5fc2VydmljZS5kYXRhdHlwZXMoKS5cclxuICAgICAgcGlwZSh0YXAodCA9PlxyXG4gICAgICAgIHRoaXMuZGF0YXR5cGVzID1cclxuICAgICAgICB0LmZpbHRlcih0ID0+IHQuYXNzaWduYWJsZSkpKSxcclxuICAgICAgdGhpcy5fZGF0YXNvdXJjZXMubWFwKCd1c2VycycpLnBpcGUodGFwKHUgPT5cclxuICAgICAgICB0aGlzLnByb2ZpbGVzID0gdVxyXG4gICAgICApKVxyXG4gICAgXSk7XHJcbiAgfVxyXG4gIHNlYXJjaCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyID0gdmFsdWU7XHJcbiAgfVxyXG4gIGFzeW5jIGNoYW5nZShuYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGUgPSB0aGlzLmRhdGF0eXBlcy5maW5kKHQgPT4gdC5uYW1lID09PSBuYW1lKTtcclxuICAgIGNvbnN0IHJvbGVzID0gdGhpcy5yb2xlcyA9IHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5yb2xlcy5maWx0ZXIociA9PiByLmRhdGFUeXBlID09PSBuYW1lKTtcclxuICAgIHRoaXMubG9hZGluZyA9ICdxdWVyeSc7XHJcbiAgICB0aGlzLl9kYXRhc291cmNlcy5hbGwodHlwZS5uYW1lKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiB0ID0+IHtcclxuICAgICAgICB0aGlzLnNvdXJjZSA9IHQ7XHJcbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9ldmVyeXRoaW5nW3R5cGUubmFtZV07XHJcbiAgICAgICAgbGV0IHBvc2l0aW9ucyA9IG1vZGVsLnBvc2l0aW9ucztcclxuICAgICAgICBpZiAoIXBvc2l0aW9ucylcclxuICAgICAgICAgIHBvc2l0aW9ucyA9IG1vZGVsLnBvc2l0aW9ucyA9IHt9O1xyXG4gICAgICAgIGlmICghbW9kZWwuZ3JvdXBzKSBtb2RlbC5ncm91cHMgPSBbXTtcclxuICAgICAgICBpZiAoIW1vZGVsLnBhdHRlcm5zKSBtb2RlbC5wYXR0ZXJucyA9IFtdO1xyXG4gICAgICAgIHJvbGVzLmZvckVhY2gociA9PiB7XHJcbiAgICAgICAgICBpZiAoIXBvc2l0aW9uc1tyLm5hbWVdKSBwb3NpdGlvbnNbci5uYW1lXSA9IHt9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gcG9zaXRpb25zO1xyXG4gICAgICAgIGNvbnN0IHJvd3M6IE1vZGVsW10gPSBbXTtcclxuICAgICAgICBtb2RlbC5wYXR0ZXJucyAmJiBtb2RlbC5wYXR0ZXJucy5mb3JFYWNoKHAgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgcm93ID0geyB0eXBlOiAncGF0dGVybicsIGtleTogcC5uYW1lIH0gYXMgTW9kZWw7XHJcbiAgICAgICAgICByb3dbdHlwZS5jb2x1bW5zID8gdHlwZS5jb2x1bW5zWzBdLm5hbWUgOiAndmFsdWUnXSA9IHAudGl0bGU7XHJcbiAgICAgICAgICByb3dzLnB1c2gocm93KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBtb2RlbC5ncm91cHMgJiYgbW9kZWwuZ3JvdXBzLmZvckVhY2goZyA9PiB7XHJcbiAgICAgICAgICBjb25zdCByb3cgPSB7IHR5cGU6ICdncm91cCcsIGtleTogZy5uYW1lIH0gYXMgTW9kZWw7XHJcbiAgICAgICAgICByb3dbdHlwZS5jb2x1bW5zID8gdHlwZS5jb2x1bW5zWzBdLm5hbWUgOiAndmFsdWUnXSA9IGcudGl0bGU7XHJcbiAgICAgICAgICByb3dzLnB1c2gocm93KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0LmZvckVhY2godCA9PiB7XHJcbiAgICAgICAgICBjb25zdCByb3cgPSB7IHR5cGU6ICdrZXknLCAuLi50IH0gYXMgTW9kZWw7XHJcbiAgICAgICAgICB0eXBlLmNvbHVtbnMgJiYgdHlwZS5jb2x1bW5zLmZvckVhY2goYyA9PiB7XHJcbiAgICAgICAgICAgIHJvd1tjLm5hbWVdID0gdC52YWx1ZVtjLm5hbWVdO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICByb3dzLnB1c2gocm93KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShyb3dzKTtcclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcclxuICAgICAgICB0aGlzLl9jb2x1bW5zKCk7XHJcbiAgICAgICAgIXJvbGVzLmxlbmd0aCAmJlxyXG4gICAgICAgICAgdGhpcy5fZGlhbG9nLm9wZW4odGhpcy5ub1JvbGVUcGwpLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKG9rID0+XHJcbiAgICAgICAgICAgIG9rICYmIHRoaXMubmV3Um9sZSgpKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBudWxsO1xyXG4gICAgICB9LCBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fcHMuZXJyb3IoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2NvbHVtbnMoKSB7XHJcbiAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSAodGhpcy50eXBlLmNvbHVtbnMgPyB0aGlzLnR5cGUuY29sdW1ucy5tYXAoYyA9PiBjLm5hbWUpIDogWydrZXknLCAndmFsdWUnXSkuY29uY2F0KFxyXG4gICAgICB0aGlzLnJvbGVzLm1hcChyID0+IHIubmFtZSkpLmNvbmNhdChbJ29wdGlvbnMnXSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBrZXlcclxuICAgKiBAcGFyYW0gZXZ0XHJcbiAgICovXHJcbiAgZWRpdChrZXk6IGFueSwgZXZ0OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAoKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnRhZ05hbWUgPT09ICdNQVQtSUNPTicpIHJldHVybjtcclxuXHJcbiAgICBsZXQgY2VsbCA9IGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB3aGlsZSAoY2VsbC50YWdOYW1lICE9PSAnVEQnKVxyXG4gICAgICBjZWxsID0gY2VsbC5wYXJlbnRFbGVtZW50O1xyXG5cclxuICAgIGNvbnN0IHJvbGUgPSBjZWxsLmdldEF0dHJpYnV0ZSgnZGF0YS1yb2xlJyk7XHJcblxyXG4gICAgaWYgKCFyb2xlKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgY3JvbGUgPSB0aGlzLnJvbGVzLmZpbmQociA9PiByLm5hbWUgPT09IHJvbGUpO1xyXG5cclxuICAgIGxldCBwb3NpdGlvbnMgPSB0aGlzLnBvc2l0aW9uc1tyb2xlXVtrZXldO1xyXG5cclxuICAgIGlmICghcG9zaXRpb25zKSBwb3NpdGlvbnMgPSB0aGlzLnBvc2l0aW9uc1tyb2xlXVtrZXldID0gW107XHJcblxyXG4gICAgdGhpcy5fcG9wdXAub3BlbihQb3NpdGlvbnNQb3B1cCwgZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCwge1xyXG4gICAgICBkYXRhOiB7IHRpdGxlOiBjcm9sZS50aXRsZSwgcG9zaXRpb25zIH0gYXMgUG9zaXRpb25zRGF0YVxyXG4gICAgfSkub3BlbmVkKCkuc3Vic2NyaWJlKGUgPT4gZS52YWx1ZUNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuZGlydHkgPSB0cnVlKSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX29wZW5EaWFsb2codG1wbDogVGVtcGxhdGVSZWY8YW55PiwgZm9ybTogRm9ybUdyb3VwLCB2YWx1ZXM6IGFueSkge1xyXG4gICAgZm9ybS5yZXNldCh2YWx1ZXMpO1xyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5fZGlhbG9nLm9wZW4odG1wbCk7XHJcbiAgICBkaWFsb2dSZWYua2V5ZG93bkV2ZW50cygpLnBpcGUoZmlsdGVyKGsgPT4gay5rZXkgPT09ICdFbnRlcicpLCB0YWtlVW50aWwoZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkpKS5cclxuICAgICAgc3Vic2NyaWJlKCgpID0+IGZvcm0udmFsaWQgJiYgZGlhbG9nUmVmLmNsb3NlKGZvcm0udmFsdWUpKTtcclxuICAgIHJldHVybiBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5waXBlKHN3aXRjaE1hcCh2ID0+IHYgPyBvZih2KSA6IEVNUFRZKSk7XHJcbiAgfVxyXG4gIG5ld1JvbGUoKSB7XHJcbiAgICB0aGlzLl9vcGVuRGlhbG9nKHRoaXMucm9sZVRwbCwgdGhpcy5yb2xlLCB7IHRpdGxlOiBudWxsIH0pLlxyXG4gICAgICBzdWJzY3JpYmUoKHI6IFJvbGUpID0+IHtcclxuICAgICAgICBjb25zdCBuYW1lID0gci50aXRsZS5ub3JtYWxpemUoKSwgcm9sZSA9IHsgbmFtZSwgLi4uciB9O1xyXG4gICAgICAgIHRoaXMucG9zaXRpb25zW25hbWVdID0ge307XHJcbiAgICAgICAgdGhpcy5fZXZlcnl0aGluZ1t0aGlzLnR5cGUubmFtZV0ucm9sZXMucHVzaChyb2xlKTtcclxuICAgICAgICB0aGlzLnJvbGVzLnB1c2gocm9sZSk7XHJcbiAgICAgICAgdGhpcy5fY29sdW1ucygpO1xyXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICB9XHJcbiAgbmV3R3JvdXAoKSB7XHJcbiAgICB0aGlzLl9vcGVuRGlhbG9nKHRoaXMubmV3R3JvdXBUcGwsIHRoaXMuZ3JvdXAsIHsgaXRlbXM6IFtdLCB0aXRsZTogbnVsbCB9KS5zdWJzY3JpYmUoKGc6IHsgdGl0bGU6IHN0cmluZzsgaXRlbXM6IHN0cmluZ1tdIH0pID0+IHtcclxuICAgICAgY29uc3QgbmFtZSA9IGcudGl0bGUubm9ybWFsaXplKCk7XHJcbiAgICAgIHRoaXMuX2V2ZXJ5dGhpbmdbdGhpcy50eXBlLm5hbWVdLmdyb3Vwcy5wdXNoKHsgbmFtZSwgLi4uZyB9KTtcclxuICAgICAgY29uc3Qgcm93ID0geyBrZXk6IG5hbWUsIHR5cGU6ICdncm91cCcgfSBhcyBNb2RlbDtcclxuICAgICAgcm93W3RoaXMudHlwZS5jb2x1bW5zID8gdGhpcy50eXBlLmNvbHVtbnNbMF0ubmFtZSA6ICd2YWx1ZSddID0gZy50aXRsZTtcclxuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEuc3BsaWNlKDAsIDAsIHJvdyk7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIgPSAnJztcclxuICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgbmV3UGF0dGVybigpIHtcclxuICAgIHRoaXMuX29wZW5EaWFsb2codGhpcy5wYXR0ZXJuVHBsLCB0aGlzLnBhdHRlcm4sIHsgdGl0bGU6IG51bGwsIGV4cHJlc3Npb246IG51bGwgfSkuc3Vic2NyaWJlKChwOiBQYXR0ZXJuKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5hbWUgPSBwLnRpdGxlLm5vcm1hbGl6ZSgpO1xyXG4gICAgICB0aGlzLl9ldmVyeXRoaW5nW3RoaXMudHlwZS5uYW1lXS5wYXR0ZXJucy5wdXNoKHsgbmFtZSwgLi4ucCB9KTtcclxuICAgICAgY29uc3Qgcm93ID0geyBrZXk6IG5hbWUsIHR5cGU6ICdwYXR0ZXJuJyB9IGFzIE1vZGVsO1xyXG4gICAgICByb3dbdGhpcy50eXBlLmNvbHVtbnMgPyB0aGlzLnR5cGUuY29sdW1uc1swXS5uYW1lIDogJ3ZhbHVlJ10gPSBwLnRpdGxlO1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YS5zcGxpY2UoMCwgMCwgcm93KTtcclxuICAgICAgdGhpcy5kYXRhU291cmNlLmZpbHRlciA9ICcnO1xyXG4gICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBkZWxldGVHcm91cChuYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuX2V2ZXJ5dGhpbmdbdGhpcy50eXBlLm5hbWVdLmdyb3VwcywgZ3JvdXAgPSBncm91cHMuZmluZChnID0+IGcubmFtZSA9PT0gbmFtZSk7XHJcbiAgICB0aGlzLl9wcy5hc2soJ1JlbW92ZUFzaycsIG51bGwsIHsgb2s6ICdZZXMnLCBjYW5jZWw6ICdObycgfSkuc3Vic2NyaWJlKG9rID0+IHtcclxuICAgICAgaWYgKG9rKSB7XHJcbiAgICAgICAgZ3JvdXBzLnJlbW92ZShncm91cCk7XHJcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5wb3NpdGlvbnMpLmZvckVhY2gociA9PiB7XHJcbiAgICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSB0aGlzLnBvc2l0aW9uc1tyXVtncm91cC5uYW1lXTtcclxuICAgICAgICAgIGlmIChwb3NpdGlvbnMpXHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnBvc2l0aW9uc1tyXVtncm91cC5uYW1lXTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YS5yZW1vdmUodGhpcy5kYXRhU291cmNlLmRhdGEuZmluZChnID0+IGcua2V5ID09PSBncm91cC5uYW1lICYmIGcudHlwZSA9PT0gJ2dyb3VwJykpO1xyXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIgPSAnJztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGRlbGV0ZVBhdHRlcm4obmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBwYXR0ZXJucyA9IHRoaXMuX2V2ZXJ5dGhpbmdbdGhpcy50eXBlLm5hbWVdLnBhdHRlcm5zLCBwYXR0ZXJuID0gcGF0dGVybnMuZmluZChwID0+IHAubmFtZSA9PT0gbmFtZSk7XHJcbiAgICB0aGlzLl9wcy5hc2soJ1JlbW92ZUFzaycsIG51bGwsIHsgb2s6ICdZZXMnLCBjYW5jZWw6ICdObycgfSkuc3Vic2NyaWJlKG9rID0+IHtcclxuICAgICAgaWYgKG9rKSB7XHJcbiAgICAgICAgcGF0dGVybnMucmVtb3ZlKHBhdHRlcm4pO1xyXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhLnJlbW92ZSh0aGlzLmRhdGFTb3VyY2UuZGF0YS5maW5kKHAgPT4gcC5rZXkgPT09IHBhdHRlcm4ubmFtZSAmJiBwLnR5cGUgPT09ICdwYXR0ZXJuJykpO1xyXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIgPSAnJztcclxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnBvc2l0aW9ucykuZm9yRWFjaChyID0+IHtcclxuICAgICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHRoaXMucG9zaXRpb25zW3JdW3BhdHRlcm4ubmFtZV07XHJcbiAgICAgICAgICBpZiAocG9zaXRpb25zKVxyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5wb3NpdGlvbnNbcl1bcGF0dGVybi5uYW1lXTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGVkaXRHcm91cChuYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuX2V2ZXJ5dGhpbmdbdGhpcy50eXBlLm5hbWVdLmdyb3VwcywgZ3JvdXAgPSBncm91cHMuZmluZChnID0+IGcubmFtZSA9PT0gbmFtZSk7XHJcbiAgICB0aGlzLl9vcGVuRGlhbG9nKHRoaXMubmV3R3JvdXBUcGwsIHRoaXMuZ3JvdXAsIGdyb3VwKS5zdWJzY3JpYmUoKGc6IEdyb3VwKSA9PiB7XHJcbiAgICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAsIGcpO1xyXG4gICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBlZGl0UGF0dGVybihuYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHBhdHRlcm5zID0gdGhpcy5fZXZlcnl0aGluZ1t0aGlzLnR5cGUubmFtZV0ucGF0dGVybnMsIHBhdHRlcm4gPSBwYXR0ZXJucy5maW5kKHAgPT4gcC5uYW1lID09PSBuYW1lKTtcclxuICAgIHRoaXMuX29wZW5EaWFsb2codGhpcy5wYXR0ZXJuVHBsLCB0aGlzLnBhdHRlcm4sIHBhdHRlcm4pLnN1YnNjcmliZSgocDogUGF0dGVybikgPT4ge1xyXG4gICAgICBPYmplY3QuYXNzaWduKHBhdHRlcm4sIHApO1xyXG4gICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDdHJsLXMgc2F2ZVxyXG4gICAqIEBwYXJhbSBldmVudFxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZUtleWJvYXJkRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmRpcnR5ICYmIGV2ZW50LmN0cmxLZXkgJiYgKGV2ZW50LmtleSA9PT0gJ3MnIHx8IGV2ZW50LmtleSA9PT0gJ1MnKSkge1xyXG4gICAgICB0aGlzLnNhdmUoKTtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9XHJcbiAgc2F2ZSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy5zYXZpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5sb2FkaW5nID0gJ2luZGV0ZXJtaW5hdGUnO1xyXG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuX3V0aWxpdHlSZWYuZXhlY3V0ZSh0aGlzLl9ldmVyeXRoaW5nKSkudGhlbigoKSA9PiB7XHJcbiAgICAgIHRoaXMuX3BzLnRvYXN0KCdDaGFuZ2VzU2F2ZWQnKTtcclxuICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmxvYWRpbmcgPSBudWxsO1xyXG4gICAgICB0aGlzLl9zZXNzaW9uLnJlZnJlc2goKS5zdWJzY3JpYmUoKTtcclxuICAgIH0sICgpID0+XHJcbiAgICAgIHRoaXMuX3BzLmVycm9yKCkpLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gbnVsbDtcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIGFzeW5jIGRvd25sb2FkKCkge1xyXG4gICAgY29uc3QgeyBwcm9maWxlcyB9ID0gdGhpcywgd29ya3NoZWV0cyA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRhdGF0eXBlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgdHlwZSA9IHRoaXMuZGF0YXR5cGVzW2ldO1xyXG4gICAgICBjb25zdCBtb2RlbCA9IHRoaXMuX2V2ZXJ5dGhpbmdbdHlwZS5uYW1lXTtcclxuICAgICAgbGV0IHBvc2l0aW9ucyA9IG1vZGVsLnBvc2l0aW9ucztcclxuICAgICAgaWYgKCFwb3NpdGlvbnMgfHwgIU9iamVjdC5rZXlzKHBvc2l0aW9ucykubGVuZ3RoKSBjb250aW51ZTtcclxuICAgICAgY29uc3Qgcm9sZXMgPSB0aGlzLl9zZXNzaW9uLnByb2ZpbGUucm9sZXMuZmlsdGVyKHIgPT4gci5kYXRhVHlwZSA9PT0gdHlwZS5uYW1lICYmIHBvc2l0aW9uc1tyLm5hbWVdKTtcclxuICAgICAgY29uc3QgY2VsbHMgPSBbe1xyXG4gICAgICAgIGluZGV4OiAxLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLl90cmFuc2xhdGUuZ2V0KCdUeXBlJyksXHJcbiAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgIGJvbGQ6IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH0sIHtcclxuICAgICAgICBpbmRleDogMixcclxuICAgICAgICB2YWx1ZTogdGhpcy5fdHJhbnNsYXRlLmdldCgnVmFsdWUnKSxcclxuICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgYm9sZDogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgfSwge1xyXG4gICAgICAgIGluZGV4OiAzLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9XSBhcyBDZWxsW107XHJcbiAgICAgIGlmICh0eXBlLmNvbHVtbnMpIHR5cGUuY29sdW1ucy5zbGljZSgyKS5mb3JFYWNoKChjLCBpKSA9PiBjZWxscy5wdXNoKHtcclxuICAgICAgICBpbmRleDogaSArIDQsXHJcbiAgICAgICAgdmFsdWU6ICcnXHJcbiAgICAgIH0gYXMgQ2VsbCkpO1xyXG4gICAgICByb2xlcy5mb3JFYWNoKHIgPT4gY2VsbHMucHVzaCh7XHJcbiAgICAgICAgaW5kZXg6IGNlbGxzLmxlbmd0aCArIDEsXHJcbiAgICAgICAgdmFsdWU6IHIudGl0bGUsXHJcbiAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgIGJvbGQ6IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH0gYXMgQ2VsbCkpO1xyXG4gICAgICBjb25zdCByb3dzID0gW10gYXMgUm93W107XHJcbiAgICAgIHJvd3MucHVzaCh7XHJcbiAgICAgICAgaW5kZXg6IDEsXHJcbiAgICAgICAgY2VsbHNcclxuICAgICAgfSBhcyBSb3cpO1xyXG4gICAgICBtb2RlbC5wYXR0ZXJucyAmJiBtb2RlbC5wYXR0ZXJucy5mb3JFYWNoKHAgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IHtcclxuICAgICAgICAgIGluZGV4OiByb3dzLmxlbmd0aCArIDEsXHJcbiAgICAgICAgICBjZWxsczogW3tcclxuICAgICAgICAgICAgaW5kZXg6IDEsXHJcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLl90cmFuc2xhdGUuZ2V0KCdQYXR0ZXJuJylcclxuICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgaW5kZXg6IDIsXHJcbiAgICAgICAgICAgIHZhbHVlOiBwLmV4cHJlc3Npb25cclxuICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgaW5kZXg6IDMsXHJcbiAgICAgICAgICAgIHZhbHVlOiBwLnRpdGxlXHJcbiAgICAgICAgICB9XVxyXG4gICAgICAgIH0gYXMgUm93O1xyXG4gICAgICAgIGFkZGNvbHVtbnMocC5uYW1lLCByb3cpO1xyXG4gICAgICAgIHJvd3MucHVzaChyb3cpO1xyXG4gICAgICB9KTtcclxuICAgICAgbW9kZWwuZ3JvdXBzICYmIG1vZGVsLmdyb3Vwcy5mb3JFYWNoKGcgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IHtcclxuICAgICAgICAgIGluZGV4OiByb3dzLmxlbmd0aCArIDEsXHJcbiAgICAgICAgICBjZWxsczogW3tcclxuICAgICAgICAgICAgaW5kZXg6IDEsXHJcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLl90cmFuc2xhdGUuZ2V0KCdHcm91cCcpXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIGluZGV4OiAyLFxyXG4gICAgICAgICAgICB2YWx1ZTogZy5pdGVtcy5qb2luKCcsICcpXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIGluZGV4OiAzLFxyXG4gICAgICAgICAgICB2YWx1ZTogZy50aXRsZVxyXG4gICAgICAgICAgfV1cclxuICAgICAgICB9IGFzIFJvdztcclxuICAgICAgICBhZGRjb2x1bW5zKGcubmFtZSwgcm93KTtcclxuICAgICAgICByb3dzLnB1c2gocm93KTtcclxuICAgICAgfSk7XHJcbiAgICAgIGxldCBkYXRhc291cmNlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5fZGF0YXNvdXJjZXMuYWxsKHR5cGUubmFtZSkpO1xyXG4gICAgICBkYXRhc291cmNlLmZvckVhY2goZCA9PiB7XHJcbiAgICAgICAgY29uc3Qgcm93ID0ge1xyXG4gICAgICAgICAgaW5kZXg6IHJvd3MubGVuZ3RoICsgMSxcclxuICAgICAgICAgIGNlbGxzOiBbe1xyXG4gICAgICAgICAgICBpbmRleDogMSxcclxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuX3RyYW5zbGF0ZS5nZXQoJ0tleScpXHJcbiAgICAgICAgICB9XVxyXG4gICAgICAgIH0gYXMgUm93O1xyXG4gICAgICAgIGlmICh0eXBlLmNvbHVtbnMpIHR5cGUuY29sdW1ucy5mb3JFYWNoKChjLCBpKSA9PiByb3cuY2VsbHMucHVzaCh7XHJcbiAgICAgICAgICBpbmRleDogaSArIDIsXHJcbiAgICAgICAgICB2YWx1ZTogZC52YWx1ZVtjLm5hbWVdXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIGVsc2Ugcm93LmNlbGxzLnB1c2goeyBpbmRleDogMiwgdmFsdWU6IGQudmFsdWUgfSk7XHJcbiAgICAgICAgYWRkY29sdW1ucyhkLmtleSwgcm93KTtcclxuICAgICAgICByb3dzLnB1c2gocm93KTtcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBbXTtcclxuICAgICAgdHlwZS5jb2x1bW5zICYmIHR5cGUuY29sdW1ucy5mb3JFYWNoKChfLCBpKSA9PiBjb2x1bW5zLnB1c2goeyBpbmRleDogaSArIDEsIHdpZHRoOiAyNTAgfSBhcyBDb2x1bW4pKTtcclxuICAgICAgcm9sZXMuZm9yRWFjaCgoXywgaSkgPT4gY29sdW1ucy5wdXNoKHsgaW5kZXg6IGNvbHVtbnMubGVuZ3RoICsgaSArIDIgfSBhcyBDb2x1bW4pKTtcclxuICAgICAgd29ya3NoZWV0cy5wdXNoKHtcclxuICAgICAgICBuYW1lOiB0eXBlLnRpdGxlLFxyXG4gICAgICAgIGNvbHVtbnMsXHJcbiAgICAgICAgcm93c1xyXG4gICAgICB9IGFzIFdvcmtzaGVldFxyXG4gICAgICApO1xyXG4gICAgICBmdW5jdGlvbiBhZGRjb2x1bW5zKGtleSwgcm93OiBSb3cpIHtcclxuICAgICAgICByb2xlcy5mb3JFYWNoKHIgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdXNlcnMgPSBwb3NpdGlvbnNbci5uYW1lXVtrZXldO1xyXG4gICAgICAgICAgcm93LmNlbGxzLnB1c2goe1xyXG4gICAgICAgICAgICBpbmRleDogcm93LmNlbGxzLmxlbmd0aCArIDEsXHJcbiAgICAgICAgICAgIHZhbHVlOiB1c2VycyA/IHVzZXJzLm1hcCh1ID0+IHByb2ZpbGVzW3VdID8gcHJvZmlsZXNbdV0ubmFtZSA6IHUpLmpvaW4oJywgJykgOiAnJ1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGJvb2sgPSBuZXcgV29ya2Jvb2soXHJcbiAgICAgIHtcclxuICAgICAgICB3b3Jrc2hlZXRzLFxyXG4gICAgICB9LFxyXG4gICAgICAneGxzeCdcclxuICAgICk7XHJcbiAgICBib29rLnNhdmUoYCR7dGhpcy5fdHJhbnNsYXRlLmdldCgnUG9zaXRpb25zJyl9Lnhsc3hgKTtcclxuICB9XHJcbiAgLy8gYXN5bmMgdXBsb2FkKGV2dDogSW5wdXRFdmVudCkge1xyXG4gIC8vICAgY29uc3QgeyBmaWxlcyB9ID0gZXZ0LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gIC8vICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCkge1xyXG4gIC8vICAgICBjb25zdCBmaWxlID0gZmlsZXMuaXRlbSgwKTtcclxuICAvLyAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgLy8gICAgIHJlYWRlci5vbmxvYWQgPSBlID0+IHsgfTtcclxuICAvLyAgICAgY29uc3QgdGV4dCA9IGF3YWl0IGZpbGUudGV4dCgpO1xyXG4gIC8vICAgICAvL3JlYWRlci5yZWFkQXModGV4dCk7XHJcbiAgLy8gICAgIGNvbnN0IHdiID0gWExTWC5yZWFkRmlsZShmaWxlLm5hbWUsIHt9KTtcclxuICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3Yi5TaGVldE5hbWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgbGV0IHRpdGxlID0gd2IuU2hlZXROYW1lc1tpXSwgd3MgPSB3Yi5TaGVldHNbdGl0bGVdO1xyXG4gIC8vICAgICAgIGxldCB0eXBlID0gdGhpcy50eXBlcy5maW5kKHQgPT4gdC50aXRsZSA9PT0gdGl0bGUpO1xyXG4gIC8vICAgICAgIGlmICghdHlwZSkgdGhyb3cgJyc7XHJcbiAgLy8gICAgICAgbGV0IHJvbGVzID0gdGhpcy5fc2Vzc2lvbi5wcm9maWxlLnJvbGVzLmZpbHRlcihyID0+IHIuZGF0YVR5cGUgPT09IHR5cGUubmFtZSk7XHJcbiAgLy8gICAgICAgbGV0IHJvdyA9IHdzWychcm93cyddWzBdO1xyXG4gIC8vICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgd3NbJyFjb2xzJ10ubGVuZ3RoOyBjKyspIHtcclxuICAvLyAgICAgICAgIGxldCBjb2wgPSB3c1snIWNvbHMnXVtjXTtcclxuICAvLyAgICAgICAgIC8vbGV0IHJvbGUgPSByb2xlcy5maW5kKHIgPT4gci50aXRsZSA9PT0gd3MuKTtcclxuICAvLyAgICAgICAvLyAgaWYgKCFyb2xlKSB7XHJcbiAgLy8gICAgICAgLy8gICAgdGhpcy5fZXZlcnl0aGluZ1t0eXBlLm5hbWVdLnJvbGVzLnB1c2goe25hbWU6ICcnLCB0aXRsZTogJyd9KTtcclxuICAvLyAgICAgICAvLyAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBmb3IgKGxldCByID0gMDsgciA8IHdzWychcm93cyddLmxlbmd0aDsgcisrKSB7XHJcbiAgLy8gICAgICAgICBsZXQgcm93ID0gd3NbJyFyb3dzJ11bcl07XHJcbiAgLy8gICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IHdzWychY29scyddLmxlbmd0aDsgYysrKSB7XHJcbiAgLy8gICAgICAgICAgIGxldCBjb2wgPSB3c1snIWNvbHMnXVtjXSwgY29udGVudCA9ICcnO1xyXG4gIC8vICAgICAgICAgICBpZiAoY29udGVudCkge1xyXG4gIC8vICAgICAgICAgICAgIC8vbGV0IHVzZXJzID0gY29udGVudC5zcGxpdCgnLCAnKS5tYXAobmFtZT0+IHRoaXMucHJvZmlsZXMuZmluZCh1PT4gdS5uYW1lID09PSBuYW1lKSk7XHJcblxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIGVsc2UgeyB9XHJcblxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZGVzdHJveS5uZXh0KCk7XHJcbiAgICB0aGlzLl9kZXN0cm95LmNvbXBsZXRlKCk7XHJcbiAgfVxyXG59XHJcbmludGVyZmFjZSBNb2RlbCB7XHJcbiAga2V5OiBhbnk7XHJcbiAgdHlwZTogJ2dyb3VwJyB8ICdwYXR0ZXJuJyB8ICdrZXknO1xyXG59XHJcblxyXG50eXBlIFR5cGVNYXAgPSB7IFtuYW1lOiBzdHJpbmddOiBEYXRhVHlwZU1vZGVsIH1cclxuXHJcbmludGVyZmFjZSBEYXRhVHlwZU1vZGVsIHtcclxuICBwYXR0ZXJuczogUGF0dGVybltdO1xyXG4gIHBvc2l0aW9uczogeyBbcm9sZTogc3RyaW5nXTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9IH07XHJcbiAgZ3JvdXBzOiBHcm91cFtdO1xyXG4gIHJvbGVzOiBbeyBuYW1lOiBzdHJpbmc7IHRpdGxlOiBzdHJpbmcgfV07XHJcbn1cclxuaW50ZXJmYWNlIEdyb3VwIHtcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBpdGVtczogc3RyaW5nW107XHJcbn1cclxuaW50ZXJmYWNlIFBhdHRlcm4ge1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGV4cHJlc3Npb246IHN0cmluZztcclxufVxyXG5pbnRlcmZhY2UgQ2VsbCB7IH1cclxuIiwiPG1hdC10b29sYmFyPlxyXG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJ0b29scyA9ICF0b29sc1wiIFtiaXpkb2NUb29sdGlwXT1cIidDb2xsYXBzZScgfCB0cmFuc2xhdGVcIj48bWF0LWljb24+dmlld19zaWRlYmFyPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cInNhdmUoKVwiIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCIhZGlydHlcIj57eydTYXZlQ2hhbmdlcyd8dHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICA8c3BhbiBjbGFzcz1cImRpdmlkZXJcIj48L3NwYW4+XHJcbiAgPGJpemRvYy1zZWFyY2gtaW5wdXQgKHZhbHVlQ2hhbmdlKT1cInNlYXJjaCgkZXZlbnQpXCI+PC9iaXpkb2Mtc2VhcmNoLWlucHV0PlxyXG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJuZXdNZW51XCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0FkZCd8dHJhbnNsYXRlXCI+PG1hdC1pY29uPmFkZDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgPG1hdC1tZW51ICNuZXdNZW51PlxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJuZXdSb2xlKClcIj57eydSb2xlJ3x0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJuZXdQYXR0ZXJuKClcIj57eydQYXR0ZXJuJ3x0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJuZXdHcm91cCgpXCI+e3snR3JvdXAnfHRyYW5zbGF0ZX19IDwvYnV0dG9uPlxyXG4gIDwvbWF0LW1lbnU+XHJcbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW2JpemRvY1Rvb2x0aXBdPVwiJ0Rvd25sb2FkJyB8IHRyYW5zbGF0ZVwiIChjbGljayk9XCJkb3dubG9hZCgpXCIgW2Rpc2FibGVkXT1cImRpcnR5XCI+PG1hdC1pY29uPnNhdmVfYWx0PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuPC9tYXQtdG9vbGJhcj5cclxuPG1hdC1wcm9ncmVzcy1iYXIgW21vZGVdPVwibG9hZGluZ1wiIFtzdHlsZS52aXNpYmlsaXR5XT1cImxvYWRpbmcgPyAndmlzaWJsZSc6J2hpZGRlbidcIj48L21hdC1wcm9ncmVzcy1iYXI+XHJcbjxkaXYgY2xhc3M9XCJyb3cgZmxleFwiPlxyXG4gIDxtYXQtbmF2LWxpc3QgY2xhc3M9XCJ0aW1lbGluZVwiIFtzdHlsZS5kaXNwbGF5XT1cInRvb2xzPycnOidub25lJ1wiPlxyXG4gICAgPG1hdC1saXN0LWl0ZW0gKm5nRm9yPVwibGV0IHQgb2YgZGF0YXR5cGVzfGFzeW5jXCIgKGNsaWNrKT1cImNoYW5nZSh0Lm5hbWUpXCIgW2NsYXNzLmFjdGl2ZV09XCJ0ID09PSB0eXBlXCI+e3t0LnRpdGxlfX08L21hdC1saXN0LWl0ZW0+XHJcbiAgPC9tYXQtbmF2LWxpc3Q+XHJcbiAgPHRhYmxlIG1hdC10YWJsZSBtYXRTb3J0IFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBbc3R5bGUuZGlzcGxheV09XCJkYXRhU291cmNlID8gJyc6ICdub25lJ1wiIGNsYXNzPVwiZmxleFwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mICh0eXBlPy5jb2x1bW5zIHx8W10pXCIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4ubmFtZVwiPlxyXG4gICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj57e2NvbHVtbi5sYWJlbH19PC90aD5cclxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50W2NvbHVtbi5uYW1lXX19IDwvdGQ+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwia2V5XCI+XHJcbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPnt7Jyd9fTwvdGg+XHJcbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XHJcbiAgICAgICAgPHNwYW4gW25nU3dpdGNoXT1cImVsZW1lbnQudHlwZVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2dyb3VwJ1wiPih7eydHcm91cCd8dHJhbnNsYXRlfX0pPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncGF0dGVybidcIj4oe3snUGF0dGVybid8dHJhbnNsYXRlfX0pPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgIHt7ZWxlbWVudC5rZXl9fVxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L3RkPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInZhbHVlXCI+XHJcbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPnt7Jyd9fTwvdGg+XHJcbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XHJcbiAgICAgICAge3tlbGVtZW50LnZhbHVlfX1cclxuICAgICAgPC90ZD5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm9sZSBvZiByb2xlc1wiIFttYXRDb2x1bW5EZWZdPVwicm9sZS5uYW1lXCI+XHJcbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+e3tyb2xlLnRpdGxlfX08L3RoPlxyXG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIFthdHRyLmRhdGEtcm9sZV09XCJyb2xlLm5hbWVcIiBjbGFzcz1cInJvbGUtY29sdW1uXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBvc2l0aW9uc1tyb2xlLm5hbWVdW2VsZW1lbnQua2V5XVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdSBvZiBwb3NpdGlvbnNbcm9sZS5uYW1lXVtlbGVtZW50LmtleV07IGxldCBmaXJzdCA9IGZpcnN0XCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmlyc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICB7e3Byb2ZpbGVzW3VdPy5uYW1lfX1cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L3RkPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIm9wdGlvbnNcIj5cclxuICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj48L3RoPlxyXG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJvcHRpb25zXCIgKm5nSWY9XCJlbGVtZW50LnR5cGUgPT09ICdwYXR0ZXJuJyB8fCBlbGVtZW50LnR5cGUgPT09ICdncm91cCdcIj48bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICA8bWF0LW1lbnUgI29wdGlvbnM+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWxlbWVudC50eXBlID09PSAncGF0dGVybidcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJlZGl0UGF0dGVybihlbGVtZW50LmtleSlcIj57eydFZGl0J3x0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJkZWxldGVQYXR0ZXJuKGVsZW1lbnQua2V5KVwiPnt7J1JlbW92ZSd8dHJhbnNsYXRlfX0gPC9idXR0b24+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbGVtZW50LnR5cGUgPT09ICdncm91cCdcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJlZGl0R3JvdXAoZWxlbWVudC5rZXkpXCI+e3snRWRpdCd8dHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZGVsZXRlR3JvdXAoZWxlbWVudC5rZXkpXCI+e3snUmVtb3ZlJ3x0cmFuc2xhdGV9fSA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgIDwvdGQ+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnM7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XHJcbiAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IGVsZW1lbnQ7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnNcIiAoY2xpY2spPVwiZWRpdChlbGVtZW50LmtleSwgJGV2ZW50KVwiPjwvdHI+XHJcbiAgPC90YWJsZT5cclxuPC9kaXY+XHJcbjwhLS0gcm9sZSB0ZW1wbGF0ZSAtLT5cclxuPG5nLXRlbXBsYXRlICNyb2xlVHBsPlxyXG4gIDxoMiBtYXQtZGlhbG9nLXRpdGxlPnt7J1JvbGUnIHwgdHJhbnNsYXRlIH19PC9oMj5cclxuICA8bWF0LWRpYWxvZy1jb250ZW50PlxyXG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJyb2xlXCIgY2xhc3M9XCJjb2x1bW5cIj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIFtwbGFjZWhvbGRlcl09XCInVGl0bGUnfCB0cmFuc2xhdGVcIiByZXF1aXJlZCBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPC9mb3JtPlxyXG4gIDwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG4gIDxtYXQtZGlhbG9nLWFjdGlvbnM+XHJcbiAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdC1kaWFsb2ctY2xvc2VdPVwicm9sZS52YWx1ZVwiIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCIhcm9sZS52YWxpZFwiPnt7J09LJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICA8YnV0dG9uIG1hdC1idXR0b24gbWF0LWRpYWxvZy1jbG9zZT57eydDYW5jZWwnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPCEtLSBwYXR0ZXJuIHRlbXBsYXRlIC0tPlxyXG48bmctdGVtcGxhdGUgI3BhdHRlcm5UcGw+XHJcbiAgPGgyIG1hdC1kaWFsb2ctdGl0bGU+e3snUGF0dGVybicgfCB0cmFuc2xhdGUgfX08L2gyPlxyXG4gIDxtYXQtZGlhbG9nLWNvbnRlbnQ+XHJcbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cInBhdHRlcm5cIiBjbGFzcz1cImNvbHVtblwiPlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgW3BsYWNlaG9sZGVyXT1cIidUaXRsZSd8IHRyYW5zbGF0ZVwiIHJlcXVpcmVkIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZXhwcmVzc2lvblwiIFtwbGFjZWhvbGRlcl09XCInUmVnZXgnfCB0cmFuc2xhdGVcIiByZXF1aXJlZCBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxyXG4gICAgICAgIDxtYXQtaGludD48c3BhbiBbaW5uZXJIVE1MXT1cIidSZWdleEhpbnQnIHwgdHJhbnNsYXRlIDogJ2h0dHBzOi8vcmVnZXgxMDEuY29tLyd8IHNhbml0aXplSHRtbFwiPjwvc3Bhbj48L21hdC1oaW50PlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPC9mb3JtPlxyXG4gIDwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG4gIDxtYXQtZGlhbG9nLWFjdGlvbnM+XHJcbiAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdC1kaWFsb2ctY2xvc2VdPVwicGF0dGVybi52YWx1ZVwiIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCIhcGF0dGVybi52YWxpZFwiPnt7J09LJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICA8YnV0dG9uIG1hdC1idXR0b24gbWF0LWRpYWxvZy1jbG9zZT57eydDYW5jZWwnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPCEtLSBncm91cCAtLT5cclxuPG5nLXRlbXBsYXRlICNncm91cFRwbD5cclxuICA8aDIgbWF0LWRpYWxvZy10aXRsZT57eydHcm91cCcgfCB0cmFuc2xhdGUgfX08L2gyPlxyXG4gIDxtYXQtZGlhbG9nLWNvbnRlbnQ+XHJcbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImdyb3VwXCIgY2xhc3M9XCJjb2x1bW5cIj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIFtwbGFjZWhvbGRlcl09XCInVGl0bGUnfCB0cmFuc2xhdGVcIiByZXF1aXJlZCBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPG1hdC1zZWxlY3QgW3BsYWNlaG9sZGVyXT1cIidJdGVtcyd8dHJhbnNsYXRlXCIgbXVsdGlwbGUgZm9ybUNvbnRyb2xOYW1lPVwiaXRlbXNcIiByZXF1aXJlZD5cclxuICAgICAgICAgIDxtYXQtc2VsZWN0LXRyaWdnZXI+XHJcbiAgICAgICAgICAgIHt7Z3JvdXAudmFsdWUuaXRlbXMgPyBncm91cC52YWx1ZS5pdGVtc1swXSA6ICcnfX1cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJncm91cC52YWx1ZS5pdGVtcz8ubGVuZ3RoID4gMVwiIGNsYXNzPVwiYWRkaXRpb25hbC1zZWxlY3Rpb25cIj5cclxuICAgICAgICAgICAgICAoK3t7Z3JvdXAudmFsdWUuaXRlbXMubGVuZ3RoIC0gMX19IHt7KGdyb3VwLnZhbHVlLml0ZW1zPy5sZW5ndGggPT09IDIgPyAnT3RoZXInIDogJ090aGVycycpfHRyYW5zbGF0ZX19KVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB2IG9mIHNvdXJjZVwiIFt2YWx1ZV09XCJ2LmtleVwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiF0eXBlLmNvbHVtbnNcIj57e3YudmFsdWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0eXBlLmNvbHVtbnNcIj48c3BhbiAqbmdGb3I9XCJsZXQgYyBvZiB0eXBlLmNvbHVtbnNcIj57e3YudmFsdWVbYy5uYW1lXX19PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8L2Zvcm0+XHJcbiAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XHJcbiAgPG1hdC1kaWFsb2ctYWN0aW9ucz5cclxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0LWRpYWxvZy1jbG9zZV09XCJncm91cC52YWx1ZVwiIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCIhZ3JvdXAudmFsaWRcIj57eydPSycgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2U+e3snQ2FuY2VsJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjbm9Sb2xlVHBsPlxyXG4gIDxtYXQtZGlhbG9nLWNvbnRlbnQ+XHJcbiAgICB7eydOb1JvbGVzJ3x0cmFuc2xhdGUgOiB0eXBlPy50aXRsZX19XHJcbiAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XHJcbiAgPG1hdC1kaWFsb2ctYWN0aW9ucz5cclxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0LWRpYWxvZy1jbG9zZV09XCJ0cnVlXCIgY29sb3I9XCJwcmltYXJ5XCI+e3snQ3JlYXRlUm9sZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2U+e3snQ2FuY2VsJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjwhLS08Zm9ybSBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPlxyXG4gIDxpbnB1dCB0eXBlPVwiZmlsZVwiIG5hbWU9XCJmaWxlXCIgKG9uY2hhbmdlKT1cInVwbG9hZCgkZXZlbnQpXCIgI2ZpbGUvPlxyXG48L2Zvcm0+LS0+XHJcbiJdfQ==
463
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zaXRpb25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcmllcy9jb3JlL3NyYy9saWIvYWRtaW4vcG9zaXRpb25zL3Bvc2l0aW9ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJpZXMvY29yZS9zcmMvbGliL2FkbWluL3Bvc2l0aW9ucy9wb3NpdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUEwQixNQUFNLEVBQWMsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZILE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFN0QsT0FBTyxFQUFFLFFBQVEsRUFBMEIsTUFBTSw4QkFBOEIsQ0FBQztBQVdoRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQWlCLE1BQU0sNkJBQTZCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFyRSxXQUFNLGtCQUFrQixHQUF4QixNQUFNLGtCQUFrQjtJQWtDN0IscUJBQXFCO0lBQ3JCLFlB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QyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0QsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQVcsQ0FBQztZQUNsRCxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUN2RSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsVUFBVTtRQUNSLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFVLEVBQUUsRUFBRTtZQUMxRyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBVyxDQUFDO1lBQ3BELEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFB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c0JBQXZCLFNBQVM7dUJBQUMsT0FBTztnQkFTd0IsU0FBUztzQkFBbEQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNBLE9BQU87c0JBQTlDLFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDSyxVQUFVO3NCQUFwRCxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ0EsV0FBVztzQkFBbkQsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQStOdkMsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgT25EZXN0cm95LCBUZW1wbGF0ZVJlZiwgSW5qZWN0LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgU3ViamVjdCwgb2YsIEVNUFRZLCB0YXAsIGZvcmtKb2luLCBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwsIGZpbHRlciwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XHJcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcclxuaW1wb3J0IHsgUHJvZ3Jlc3NCYXJNb2RlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3MtYmFyJztcclxuaW1wb3J0IHsgV29ya2Jvb2ssIFdvcmtzaGVldCwgUm93LCBDb2x1bW4gfSBmcm9tICdAc3luY2Z1c2lvbi9lajItZXhjZWwtZXhwb3J0JztcclxuaW1wb3J0IHsgUm9sZSwgVHlwZSwgVXNlckluZm8gfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscyc7XHJcbmltcG9ydCB7IEFkbWluQ29tcG9uZW50IH0gZnJvbSAnLi4vYWRtaW4tZGlzbWlzcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2Vzc2lvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3Nlc3Npb24uc2VydmljZSc7XHJcbmltcG9ydCB7IERhdGFzb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9kYXRhc291cmNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQcm9tcHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9wcm9tcHQuc2VydmljZSc7XHJcbmltcG9ydCB7IFdpbmRvd1RpdGxlU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvd2luZG93LXRpdGxlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS90cmFuc2xhdGUuc2VydmljZSc7XHJcbmltcG9ydCB7IERhdGFUeXBlSW5mbywgU3lzdGVtU2VydmljZSB9IGZyb20gJy4uL3N5c3RlbS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUG9wdXAgfSBmcm9tICcuLi8uLi9jb3JlL3BvcHVwL3BvcHVwLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVdGlsaXR5Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29yZS9iYXNlJztcclxuaW1wb3J0IHsgVXRpbGl0eVJlZiB9IGZyb20gJy4uL3V0aWxpdHktcmVmJztcclxuaW1wb3J0IHsgQml6RG9jIH0gZnJvbSAnLi4vLi4vY29yZS9kZWNvcmF0b3JzJztcclxuaW1wb3J0IHsgUG9zaXRpb25zUG9wdXAsIFBvc2l0aW9uc0RhdGEgfSBmcm9tICcuL3Bvc2l0aW9ucy1wb3B1cC5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgdGVtcGxhdGVVcmw6ICcuL3Bvc2l0aW9ucy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcG9zaXRpb25zLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuQEJpekRvYyh7IHNlbGVjdG9yOiAnYml6ZG9jLXBvc2l0aW9ucycgfSlcclxuLyoqIHBvc2l0aW9ucyBjb21wb25lbnQqL1xyXG5leHBvcnQgY2xhc3MgUG9zaXRpb25zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIFV0aWxpdHlDb21wb25lbnQ8Ym9vbGVhbiwgVHlwZU1hcD4sIEFkbWluQ29tcG9uZW50IHtcclxuICBAVmlld0NoaWxkKCdmaWxlJywgeyBzdGF0aWM6IHRydWUgfSkgX2ZpbGVFbGVtZW50OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG4gIGRhdGFTb3VyY2U6IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc29ydDogTWF0U29ydDtcclxuICBkYXRhdHlwZXM6IERhdGFUeXBlSW5mb1tdO1xyXG4gIHJvbGVzOiBSb2xlW107XHJcbiAgdG9vbHM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdO1xyXG4gIHByb2ZpbGVzOiB7IFtpZDogc3RyaW5nXTogVXNlckluZm8gfTtcclxuICB0eXBlPzogVHlwZTtcclxuICBkaXJ0eSA9IGZhbHNlO1xyXG4gIHNhdmluZyA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoJ25vUm9sZVRwbCcsIHsgc3RhdGljOiB0cnVlIH0pIG5vUm9sZVRwbDogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdyb2xlVHBsJywgeyBzdGF0aWM6IHRydWUgfSkgcm9sZVRwbDogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdwYXR0ZXJuVHBsJywgeyBzdGF0aWM6IHRydWUgfSkgcGF0dGVyblRwbDogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdncm91cFRwbCcsIHsgc3RhdGljOiB0cnVlIH0pIG5ld0dyb3VwVHBsOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIHNvdXJjZTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IGFueTsgfVtdO1xyXG4gIHJlYWRvbmx5IGZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcclxuICB9KTtcclxuICByZWFkb25seSByb2xlID0gbmV3IEZvcm1Hcm91cCh7XHJcbiAgICB0aXRsZTogbmV3IEZvcm1Db250cm9sKG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWQpXHJcbiAgfSk7XHJcbiAgcmVhZG9ubHkgcGF0dGVybiA9IG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgdGl0bGU6IG5ldyBGb3JtQ29udHJvbChudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgIGV4cHJlc3Npb246IG5ldyBGb3JtQ29udHJvbChudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxyXG4gIH0pO1xyXG4gIHJlYWRvbmx5IGdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XHJcbiAgICB0aXRsZTogbmV3IEZvcm1Db250cm9sKG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxyXG4gICAgaXRlbXM6IG5ldyBGb3JtQ29udHJvbChudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxyXG4gIH0pO1xyXG4gIHByaXZhdGUgX2V2ZXJ5dGhpbmc6IFR5cGVNYXA7XHJcbiAgcG9zaXRpb25zOiB7IFtyb2xlOiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gfTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBsb2FkaW5nOiBQcm9ncmVzc0Jhck1vZGU7XHJcbiAgLyoqIHBvc2l0aW9ucyBjdG9yICovXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfc2Vzc2lvbjogU2Vzc2lvblNlcnZpY2UsXHJcbiAgICBASW5qZWN0KFV0aWxpdHlSZWYpIHByaXZhdGUgX3V0aWxpdHlSZWY6IFV0aWxpdHlSZWY8Ym9vbGVhbiwgVHlwZU1hcD4sXHJcbiAgICBwcml2YXRlIF9kYXRhc291cmNlczogRGF0YXNvdXJjZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9wczogUHJvbXB0U2VydmljZSxcclxuICAgIHRpdGxlOiBXaW5kb3dUaXRsZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9wb3B1cDogUG9wdXAsXHJcbiAgICBwcml2YXRlIF9zZXJ2aWNlOiBTeXN0ZW1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZGlhbG9nOiBNYXREaWFsb2cpIHtcclxuICAgIHRpdGxlLnNldChfdHJhbnNsYXRlLmdldCgnUm9sZXMnKSk7XHJcbiAgfVxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkaW5nID0gJ3F1ZXJ5JztcclxuICAgIHRoaXMuX3ByZXBhcmUoKS5zdWJzY3JpYmUoKCkgPT5cclxuICAgICAgdGhpcy5fdXRpbGl0eVJlZi5wb3B1bGF0ZSgpLnN1YnNjcmliZShyID0+IHtcclxuICAgICAgICB0aGlzLl9ldmVyeXRoaW5nID0gcjtcclxuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5kYXRhdHlwZXMuZmluZCh0ID0+IHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5yb2xlcy5maW5kSW5kZXgociA9PiByLmRhdGFUeXBlID09PSB0Lm5hbWUpID4gLTEpO1xyXG4gICAgICAgIHR5cGUgJiYgdGhpcy5jaGFuZ2UodHlwZS5uYW1lKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBudWxsO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfcHJlcGFyZSgpIHtcclxuICAgIHJldHVybiBmb3JrSm9pbihbdGhpcy5fc2VydmljZS5kYXRhdHlwZXMoKS5cclxuICAgICAgcGlwZSh0YXAodCA9PlxyXG4gICAgICAgIHRoaXMuZGF0YXR5cGVzID1cclxuICAgICAgICB0LmZpbHRlcih0ID0+IHQuYXNzaWduYWJsZSkpKSxcclxuICAgICAgdGhpcy5fZGF0YXNvdXJjZXMubWFwKCd1c2VycycpLnBpcGUodGFwKHUgPT5cclxuICAgICAgICB0aGlzLnByb2ZpbGVzID0gdVxyXG4gICAgICApKVxyXG4gICAgXSk7XHJcbiAgfVxyXG4gIHNlYXJjaCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyID0gdmFsdWU7XHJcbiAgfVxyXG4gIGFzeW5jIGNoYW5nZShuYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGUgPSB0aGlzLmRhdGF0eXBlcy5maW5kKHQgPT4gdC5uYW1lID09PSBuYW1lKTtcclxuICAgIGNvbnN0IHJvbGVzID0gdGhpcy5yb2xlcyA9IHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5yb2xlcy5maWx0ZXIociA9PiByLmRhdGFUeXBlID09PSBuYW1lKTtcclxuICAgIHRoaXMubG9hZGluZyA9ICdxdWVyeSc7XHJcbiAgICB0aGlzLl9kYXRhc291cmNlcy5hbGwodHlwZS5uYW1lKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiB0ID0+IHtcclxuICAgICAgICB0aGlzLnNvdXJjZSA9IHQ7XHJcbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9ldmVyeXRoaW5nW3R5cGUubmFtZV07XHJcbiAgICAgICAgbGV0IHBvc2l0aW9ucyA9IG1vZGVsLnBvc2l0aW9ucztcclxuICAgICAgICBpZiAoIXBvc2l0aW9ucylcclxuICAgICAgICAgIHBvc2l0aW9ucyA9IG1vZGVsLnBvc2l0aW9ucyA9IHt9O1xyXG4gICAgICAgIGlmICghbW9kZWwuZ3JvdXBzKSBtb2RlbC5ncm91cHMgPSBbXTtcclxuICAgICAgICBpZiAoIW1vZGVsLnBhdHRlcm5zKSBtb2RlbC5wYXR0ZXJucyA9IFtdO1xyXG4gICAgICAgIHJvbGVzLmZvckVhY2gociA9PiB7XHJcbiAgICAgICAgICBpZiAoIXBvc2l0aW9uc1tyLm5hbWVdKSBwb3NpdGlvbnNbci5uYW1lXSA9IHt9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gcG9zaXRpb25zO1xyXG4gICAgICAgIGNvbnN0IHJvd3M6IE1vZGVsW10gPSBbXTtcclxuICAgICAgICBtb2RlbC5wYXR0ZXJucyAmJiBtb2RlbC5wYXR0ZXJucy5mb3JFYWNoKHAgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgcm93ID0geyB0eXBlOiAncGF0dGVybicsIGtleTogcC5uYW1lIH0gYXMgTW9kZWw7XHJcbiAgICAgICAgICByb3dbdHlwZS5jb2x1bW5zID8gdHlwZS5jb2x1bW5zWzBdLm5hbWUgOiAndmFsdWUnXSA9IHAudGl0bGU7XHJcbiAgICAgICAgICByb3dzLnB1c2gocm93KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBtb2RlbC5ncm91cHMgJiYgbW9kZWwuZ3JvdXBzLmZvckVhY2goZyA9PiB7XHJcbiAgICAgICAgICBjb25zdCByb3cgPSB7IHR5cGU6ICdncm91cCcsIGtleTogZy5uYW1lIH0gYXMgTW9kZWw7XHJcbiAgICAgICAgICByb3dbdHlwZS5jb2x1bW5zID8gdHlwZS5jb2x1bW5zWzBdLm5hbWUgOiAndmFsdWUnXSA9IGcudGl0bGU7XHJcbiAgICAgICAgICByb3dzLnB1c2gocm93KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0LmZvckVhY2godCA9PiB7XHJcbiAgICAgICAgICBjb25zdCByb3cgPSB7IHR5cGU6ICdrZXknLCAuLi50IH0gYXMgTW9kZWw7XHJcbiAgICAgICAgICB0eXBlLmNvbHVtbnMgJiYgdHlwZS5jb2x1bW5zLmZvckVhY2goYyA9PiB7XHJcbiAgICAgICAgICAgIHJvd1tjLm5hbWVdID0gdC52YWx1ZVtjLm5hbWVdO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICByb3dzLnB1c2gocm93KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShyb3dzKTtcclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcclxuICAgICAgICB0aGlzLl9jb2x1bW5zKCk7XHJcbiAgICAgICAgIXJvbGVzLmxlbmd0aCAmJlxyXG4gICAgICAgICAgdGhpcy5fZGlhbG9nLm9wZW4odGhpcy5ub1JvbGVUcGwpLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKG9rID0+XHJcbiAgICAgICAgICAgIG9rICYmIHRoaXMubmV3Um9sZSgpKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBudWxsO1xyXG4gICAgICB9LCBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fcHMuZXJyb3IoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2NvbHVtbnMoKSB7XHJcbiAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSAodGhpcy50eXBlLmNvbHVtbnMgPyB0aGlzLnR5cGUuY29sdW1ucy5tYXAoYyA9PiBjLm5hbWUpIDogWydrZXknLCAndmFsdWUnXSkuY29uY2F0KFxyXG4gICAgICB0aGlzLnJvbGVzLm1hcChyID0+IHIubmFtZSkpLmNvbmNhdChbJ29wdGlvbnMnXSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBrZXlcclxuICAgKiBAcGFyYW0gZXZ0XHJcbiAgICovXHJcbiAgZWRpdChrZXk6IGFueSwgZXZ0OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAoKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnRhZ05hbWUgPT09ICdNQVQtSUNPTicpIHJldHVybjtcclxuXHJcbiAgICBsZXQgY2VsbCA9IGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB3aGlsZSAoY2VsbC50YWdOYW1lICE9PSAnVEQnKVxyXG4gICAgICBjZWxsID0gY2VsbC5wYXJlbnRFbGVtZW50O1xyXG5cclxuICAgIGNvbnN0IHJvbGUgPSBjZWxsLmdldEF0dHJpYnV0ZSgnZGF0YS1yb2xlJyk7XHJcblxyXG4gICAgaWYgKCFyb2xlKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgY3JvbGUgPSB0aGlzLnJvbGVzLmZpbmQociA9PiByLm5hbWUgPT09IHJvbGUpO1xyXG5cclxuICAgIGxldCBwb3NpdGlvbnMgPSB0aGlzLnBvc2l0aW9uc1tyb2xlXVtrZXldO1xyXG5cclxuICAgIGlmICghcG9zaXRpb25zKSBwb3NpdGlvbnMgPSB0aGlzLnBvc2l0aW9uc1tyb2xlXVtrZXldID0gW107XHJcblxyXG4gICAgdGhpcy5fcG9wdXAub3BlbihQb3NpdGlvbnNQb3B1cCwgZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCwge1xyXG4gICAgICBkYXRhOiB7IHRpdGxlOiBjcm9sZS50aXRsZSwgcG9zaXRpb25zIH0gYXMgUG9zaXRpb25zRGF0YVxyXG4gICAgfSkub3BlbmVkKCkuc3Vic2NyaWJlKGUgPT4gZS52YWx1ZUNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuZGlydHkgPSB0cnVlKSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX29wZW5EaWFsb2codG1wbDogVGVtcGxhdGVSZWY8YW55PiwgZm9ybTogRm9ybUdyb3VwLCB2YWx1ZXM6IGFueSkge1xyXG4gICAgZm9ybS5yZXNldCh2YWx1ZXMpO1xyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5fZGlhbG9nLm9wZW4odG1wbCk7XHJcbiAgICBkaWFsb2dSZWYua2V5ZG93bkV2ZW50cygpLnBpcGUoZmlsdGVyKGsgPT4gay5rZXkgPT09ICdFbnRlcicpLCB0YWtlVW50aWwoZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkpKS5cclxuICAgICAgc3Vic2NyaWJlKCgpID0+IGZvcm0udmFsaWQgJiYgZGlhbG9nUmVmLmNsb3NlKGZvcm0udmFsdWUpKTtcclxuICAgIHJldHVybiBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5waXBlKHN3aXRjaE1hcCh2ID0+IHYgPyBvZih2KSA6IEVNUFRZKSk7XHJcbiAgfVxyXG4gIG5ld1JvbGUoKSB7XHJcbiAgICB0aGlzLl9vcGVuRGlhbG9nKHRoaXMucm9sZVRwbCwgdGhpcy5yb2xlLCB7IHRpdGxlOiBudWxsIH0pLlxyXG4gICAgICBzdWJzY3JpYmUoKHI6IFJvbGUpID0+IHtcclxuICAgICAgICBjb25zdCBuYW1lID0gci50aXRsZS5ub3JtYWxpemUoKSwgcm9sZSA9IHsgbmFtZSwgLi4uciB9O1xyXG4gICAgICAgIHRoaXMucG9zaXRpb25zW25hbWVdID0ge307XHJcbiAgICAgICAgdGhpcy5fZXZlcnl0aGluZ1t0aGlzLnR5cGUubmFtZV0ucm9sZXMucHVzaChyb2xlKTtcclxuICAgICAgICB0aGlzLnJvbGVzLnB1c2gocm9sZSk7XHJcbiAgICAgICAgdGhpcy5fY29sdW1ucygpO1xyXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICB9XHJcbiAgbmV3R3JvdXAoKSB7XHJcbiAgICB0aGlzLl9vcGVuRGlhbG9nKHRoaXMubmV3R3JvdXBUcGwsIHRoaXMuZ3JvdXAsIHsgaXRlbXM6IFtdLCB0aXRsZTogbnVsbCB9KS5zdWJzY3JpYmUoKGc6IHsgdGl0bGU6IHN0cmluZzsgaXRlbXM6IHN0cmluZ1tdIH0pID0+IHtcclxuICAgICAgY29uc3QgbmFtZSA9IGcudGl0bGUubm9ybWFsaXplKCk7XHJcbiAgICAgIHRoaXMuX2V2ZXJ5dGhpbmdbdGhpcy50eXBlLm5hbWVdLmdyb3Vwcy5wdXNoKHsgbmFtZSwgLi4uZyB9KTtcclxuICAgICAgY29uc3Qgcm93ID0geyBrZXk6IG5hbWUsIHR5cGU6ICdncm91cCcgfSBhcyBNb2RlbDtcclxuICAgICAgcm93W3RoaXMudHlwZS5jb2x1bW5zID8gdGhpcy50eXBlLmNvbHVtbnNbMF0ubmFtZSA6ICd2YWx1ZSddID0gZy50aXRsZTtcclxuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEuc3BsaWNlKDAsIDAsIHJvdyk7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIgPSAnJztcclxuICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgbmV3UGF0dGVybigpIHtcclxuICAgIHRoaXMuX29wZW5EaWFsb2codGhpcy5wYXR0ZXJuVHBsLCB0aGlzLnBhdHRlcm4sIHsgdGl0bGU6IG51bGwsIGV4cHJlc3Npb246IG51bGwgfSkuc3Vic2NyaWJlKChwOiBQYXR0ZXJuKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5hbWUgPSBwLnRpdGxlLm5vcm1hbGl6ZSgpO1xyXG4gICAgICB0aGlzLl9ldmVyeXRoaW5nW3RoaXMudHlwZS5uYW1lXS5wYXR0ZXJucy5wdXNoKHsgbmFtZSwgLi4ucCB9KTtcclxuICAgICAgY29uc3Qgcm93ID0geyBrZXk6IG5hbWUsIHR5cGU6ICdwYXR0ZXJuJyB9IGFzIE1vZGVsO1xyXG4gICAgICByb3dbdGhpcy50eXBlLmNvbHVtbnMgPyB0aGlzLnR5cGUuY29sdW1uc1swXS5uYW1lIDogJ3ZhbHVlJ10gPSBwLnRpdGxlO1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YS5zcGxpY2UoMCwgMCwgcm93KTtcclxuICAgICAgdGhpcy5kYXRhU291cmNlLmZpbHRlciA9ICcnO1xyXG4gICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBkZWxldGVHcm91cChuYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuX2V2ZXJ5dGhpbmdbdGhpcy50eXBlLm5hbWVdLmdyb3VwcywgZ3JvdXAgPSBncm91cHMuZmluZChnID0+IGcubmFtZSA9PT0gbmFtZSk7XHJcbiAgICB0aGlzLl9wcy5hc2soJ1JlbW92ZUFzaycsIG51bGwsIHsgb2s6ICdZZXMnLCBjYW5jZWw6ICdObycgfSkuc3Vic2NyaWJlKG9rID0+IHtcclxuICAgICAgaWYgKG9rKSB7XHJcbiAgICAgICAgZ3JvdXBzLnJlbW92ZShncm91cCk7XHJcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5wb3NpdGlvbnMpLmZvckVhY2gociA9PiB7XHJcbiAgICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSB0aGlzLnBvc2l0aW9uc1tyXVtncm91cC5uYW1lXTtcclxuICAgICAgICAgIGlmIChwb3NpdGlvbnMpXHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnBvc2l0aW9uc1tyXVtncm91cC5uYW1lXTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YS5yZW1vdmUodGhpcy5kYXRhU291cmNlLmRhdGEuZmluZChnID0+IGcua2V5ID09PSBncm91cC5uYW1lICYmIGcudHlwZSA9PT0gJ2dyb3VwJykpO1xyXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIgPSAnJztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGRlbGV0ZVBhdHRlcm4obmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBwYXR0ZXJucyA9IHRoaXMuX2V2ZXJ5dGhpbmdbdGhpcy50eXBlLm5hbWVdLnBhdHRlcm5zLCBwYXR0ZXJuID0gcGF0dGVybnMuZmluZChwID0+IHAubmFtZSA9PT0gbmFtZSk7XHJcbiAgICB0aGlzLl9wcy5hc2soJ1JlbW92ZUFzaycsIG51bGwsIHsgb2s6ICdZZXMnLCBjYW5jZWw6ICdObycgfSkuc3Vic2NyaWJlKG9rID0+IHtcclxuICAgICAgaWYgKG9rKSB7XHJcbiAgICAgICAgcGF0dGVybnMucmVtb3ZlKHBhdHRlcm4pO1xyXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhLnJlbW92ZSh0aGlzLmRhdGFTb3VyY2UuZGF0YS5maW5kKHAgPT4gcC5rZXkgPT09IHBhdHRlcm4ubmFtZSAmJiBwLnR5cGUgPT09ICdwYXR0ZXJuJykpO1xyXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIgPSAnJztcclxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnBvc2l0aW9ucykuZm9yRWFjaChyID0+IHtcclxuICAgICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHRoaXMucG9zaXRpb25zW3JdW3BhdHRlcm4ubmFtZV07XHJcbiAgICAgICAgICBpZiAocG9zaXRpb25zKVxyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5wb3NpdGlvbnNbcl1bcGF0dGVybi5uYW1lXTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGVkaXRHcm91cChuYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuX2V2ZXJ5dGhpbmdbdGhpcy50eXBlLm5hbWVdLmdyb3VwcywgZ3JvdXAgPSBncm91cHMuZmluZChnID0+IGcubmFtZSA9PT0gbmFtZSk7XHJcbiAgICB0aGlzLl9vcGVuRGlhbG9nKHRoaXMubmV3R3JvdXBUcGwsIHRoaXMuZ3JvdXAsIGdyb3VwKS5zdWJzY3JpYmUoKGc6IEdyb3VwKSA9PiB7XHJcbiAgICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAsIGcpO1xyXG4gICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBlZGl0UGF0dGVybihuYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHBhdHRlcm5zID0gdGhpcy5fZXZlcnl0aGluZ1t0aGlzLnR5cGUubmFtZV0ucGF0dGVybnMsIHBhdHRlcm4gPSBwYXR0ZXJucy5maW5kKHAgPT4gcC5uYW1lID09PSBuYW1lKTtcclxuICAgIHRoaXMuX29wZW5EaWFsb2codGhpcy5wYXR0ZXJuVHBsLCB0aGlzLnBhdHRlcm4sIHBhdHRlcm4pLnN1YnNjcmliZSgocDogUGF0dGVybikgPT4ge1xyXG4gICAgICBPYmplY3QuYXNzaWduKHBhdHRlcm4sIHApO1xyXG4gICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDdHJsLXMgc2F2ZVxyXG4gICAqIEBwYXJhbSBldmVudFxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZUtleWJvYXJkRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmRpcnR5ICYmIGV2ZW50LmN0cmxLZXkgJiYgKGV2ZW50LmtleSA9PT0gJ3MnIHx8IGV2ZW50LmtleSA9PT0gJ1MnKSkge1xyXG4gICAgICB0aGlzLnNhdmUoKTtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9XHJcbiAgc2F2ZSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy5zYXZpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5sb2FkaW5nID0gJ2luZGV0ZXJtaW5hdGUnO1xyXG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuX3V0aWxpdHlSZWYuZXhlY3V0ZSh0aGlzLl9ldmVyeXRoaW5nKSkudGhlbigoKSA9PiB7XHJcbiAgICAgIHRoaXMuX3BzLnRvYXN0KCdDaGFuZ2VzU2F2ZWQnKTtcclxuICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmxvYWRpbmcgPSBudWxsO1xyXG4gICAgICB0aGlzLl9zZXNzaW9uLnJlZnJlc2goKS5zdWJzY3JpYmUoKTtcclxuICAgIH0sICgpID0+XHJcbiAgICAgIHRoaXMuX3BzLmVycm9yKCkpLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gbnVsbDtcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIGFzeW5jIGRvd25sb2FkKCkge1xyXG4gICAgY29uc3QgeyBwcm9maWxlcyB9ID0gdGhpcywgd29ya3NoZWV0cyA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRhdGF0eXBlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgdHlwZSA9IHRoaXMuZGF0YXR5cGVzW2ldO1xyXG4gICAgICBjb25zdCBtb2RlbCA9IHRoaXMuX2V2ZXJ5dGhpbmdbdHlwZS5uYW1lXTtcclxuICAgICAgbGV0IHBvc2l0aW9ucyA9IG1vZGVsLnBvc2l0aW9ucztcclxuICAgICAgaWYgKCFwb3NpdGlvbnMgfHwgIU9iamVjdC5rZXlzKHBvc2l0aW9ucykubGVuZ3RoKSBjb250aW51ZTtcclxuICAgICAgY29uc3Qgcm9sZXMgPSB0aGlzLl9zZXNzaW9uLnByb2ZpbGUucm9sZXMuZmlsdGVyKHIgPT4gci5kYXRhVHlwZSA9PT0gdHlwZS5uYW1lICYmIHBvc2l0aW9uc1tyLm5hbWVdKTtcclxuICAgICAgY29uc3QgY2VsbHMgPSBbe1xyXG4gICAgICAgIGluZGV4OiAxLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLl90cmFuc2xhdGUuZ2V0KCdUeXBlJyksXHJcbiAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgIGJvbGQ6IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH0sIHtcclxuICAgICAgICBpbmRleDogMixcclxuICAgICAgICB2YWx1ZTogdGhpcy5fdHJhbnNsYXRlLmdldCgnVmFsdWUnKSxcclxuICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgYm9sZDogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgfSwge1xyXG4gICAgICAgIGluZGV4OiAzLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9XSBhcyBDZWxsW107XHJcbiAgICAgIGlmICh0eXBlLmNvbHVtbnMpIHR5cGUuY29sdW1ucy5zbGljZSgyKS5mb3JFYWNoKChjLCBpKSA9PiBjZWxscy5wdXNoKHtcclxuICAgICAgICBpbmRleDogaSArIDQsXHJcbiAgICAgICAgdmFsdWU6ICcnXHJcbiAgICAgIH0gYXMgQ2VsbCkpO1xyXG4gICAgICByb2xlcy5mb3JFYWNoKHIgPT4gY2VsbHMucHVzaCh7XHJcbiAgICAgICAgaW5kZXg6IGNlbGxzLmxlbmd0aCArIDEsXHJcbiAgICAgICAgdmFsdWU6IHIudGl0bGUsXHJcbiAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgIGJvbGQ6IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH0gYXMgQ2VsbCkpO1xyXG4gICAgICBjb25zdCByb3dzID0gW10gYXMgUm93W107XHJcbiAgICAgIHJvd3MucHVzaCh7XHJcbiAgICAgICAgaW5kZXg6IDEsXHJcbiAgICAgICAgY2VsbHNcclxuICAgICAgfSBhcyBSb3cpO1xyXG4gICAgICBtb2RlbC5wYXR0ZXJucyAmJiBtb2RlbC5wYXR0ZXJucy5mb3JFYWNoKHAgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IHtcclxuICAgICAgICAgIGluZGV4OiByb3dzLmxlbmd0aCArIDEsXHJcbiAgICAgICAgICBjZWxsczogW3tcclxuICAgICAgICAgICAgaW5kZXg6IDEsXHJcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLl90cmFuc2xhdGUuZ2V0KCdQYXR0ZXJuJylcclxuICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgaW5kZXg6IDIsXHJcbiAgICAgICAgICAgIHZhbHVlOiBwLmV4cHJlc3Npb25cclxuICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgaW5kZXg6IDMsXHJcbiAgICAgICAgICAgIHZhbHVlOiBwLnRpdGxlXHJcbiAgICAgICAgICB9XVxyXG4gICAgICAgIH0gYXMgUm93O1xyXG4gICAgICAgIGFkZGNvbHVtbnMocC5uYW1lLCByb3cpO1xyXG4gICAgICAgIHJvd3MucHVzaChyb3cpO1xyXG4gICAgICB9KTtcclxuICAgICAgbW9kZWwuZ3JvdXBzICYmIG1vZGVsLmdyb3Vwcy5mb3JFYWNoKGcgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IHtcclxuICAgICAgICAgIGluZGV4OiByb3dzLmxlbmd0aCArIDEsXHJcbiAgICAgICAgICBjZWxsczogW3tcclxuICAgICAgICAgICAgaW5kZXg6IDEsXHJcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLl90cmFuc2xhdGUuZ2V0KCdHcm91cCcpXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIGluZGV4OiAyLFxyXG4gICAgICAgICAgICB2YWx1ZTogZy5pdGVtcy5qb2luKCcsICcpXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIGluZGV4OiAzLFxyXG4gICAgICAgICAgICB2YWx1ZTogZy50aXRsZVxyXG4gICAgICAgICAgfV1cclxuICAgICAgICB9IGFzIFJvdztcclxuICAgICAgICBhZGRjb2x1bW5zKGcubmFtZSwgcm93KTtcclxuICAgICAgICByb3dzLnB1c2gocm93KTtcclxuICAgICAgfSk7XHJcbiAgICAgIGxldCBkYXRhc291cmNlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5fZGF0YXNvdXJjZXMuYWxsKHR5cGUubmFtZSkpO1xyXG4gICAgICBkYXRhc291cmNlLmZvckVhY2goZCA9PiB7XHJcbiAgICAgICAgY29uc3Qgcm93ID0ge1xyXG4gICAgICAgICAgaW5kZXg6IHJvd3MubGVuZ3RoICsgMSxcclxuICAgICAgICAgIGNlbGxzOiBbe1xyXG4gICAgICAgICAgICBpbmRleDogMSxcclxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuX3RyYW5zbGF0ZS5nZXQoJ0tleScpXHJcbiAgICAgICAgICB9XVxyXG4gICAgICAgIH0gYXMgUm93O1xyXG4gICAgICAgIGlmICh0eXBlLmNvbHVtbnMpIHR5cGUuY29sdW1ucy5mb3JFYWNoKChjLCBpKSA9PiByb3cuY2VsbHMucHVzaCh7XHJcbiAgICAgICAgICBpbmRleDogaSArIDIsXHJcbiAgICAgICAgICB2YWx1ZTogZC52YWx1ZVtjLm5hbWVdXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIGVsc2Ugcm93LmNlbGxzLnB1c2goeyBpbmRleDogMiwgdmFsdWU6IGQudmFsdWUgfSk7XHJcbiAgICAgICAgYWRkY29sdW1ucyhkLmtleSwgcm93KTtcclxuICAgICAgICByb3dzLnB1c2gocm93KTtcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBbXTtcclxuICAgICAgdHlwZS5jb2x1bW5zICYmIHR5cGUuY29sdW1ucy5mb3JFYWNoKChfLCBpKSA9PiBjb2x1bW5zLnB1c2goeyBpbmRleDogaSArIDEsIHdpZHRoOiAyNTAgfSBhcyBDb2x1bW4pKTtcclxuICAgICAgcm9sZXMuZm9yRWFjaCgoXywgaSkgPT4gY29sdW1ucy5wdXNoKHsgaW5kZXg6IGNvbHVtbnMubGVuZ3RoICsgaSArIDIgfSBhcyBDb2x1bW4pKTtcclxuICAgICAgd29ya3NoZWV0cy5wdXNoKHtcclxuICAgICAgICBuYW1lOiB0eXBlLnRpdGxlLFxyXG4gICAgICAgIGNvbHVtbnMsXHJcbiAgICAgICAgcm93c1xyXG4gICAgICB9IGFzIFdvcmtzaGVldFxyXG4gICAgICApO1xyXG4gICAgICBmdW5jdGlvbiBhZGRjb2x1bW5zKGtleSwgcm93OiBSb3cpIHtcclxuICAgICAgICByb2xlcy5mb3JFYWNoKHIgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdXNlcnMgPSBwb3NpdGlvbnNbci5uYW1lXVtrZXldO1xyXG4gICAgICAgICAgcm93LmNlbGxzLnB1c2goe1xyXG4gICAgICAgICAgICBpbmRleDogcm93LmNlbGxzLmxlbmd0aCArIDEsXHJcbiAgICAgICAgICAgIHZhbHVlOiB1c2VycyA/IHVzZXJzLm1hcCh1ID0+IHByb2ZpbGVzW3VdID8gcHJvZmlsZXNbdV0ubmFtZSA6IHUpLmpvaW4oJywgJykgOiAnJ1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGJvb2sgPSBuZXcgV29ya2Jvb2soXHJcbiAgICAgIHtcclxuICAgICAgICB3b3Jrc2hlZXRzLFxyXG4gICAgICB9LFxyXG4gICAgICAneGxzeCdcclxuICAgICk7XHJcbiAgICBib29rLnNhdmUoYCR7dGhpcy5fdHJhbnNsYXRlLmdldCgnUG9zaXRpb25zJyl9Lnhsc3hgKTtcclxuICB9XHJcbiAgLy8gYXN5bmMgdXBsb2FkKGV2dDogSW5wdXRFdmVudCkge1xyXG4gIC8vICAgY29uc3QgeyBmaWxlcyB9ID0gZXZ0LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gIC8vICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCkge1xyXG4gIC8vICAgICBjb25zdCBmaWxlID0gZmlsZXMuaXRlbSgwKTtcclxuICAvLyAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgLy8gICAgIHJlYWRlci5vbmxvYWQgPSBlID0+IHsgfTtcclxuICAvLyAgICAgY29uc3QgdGV4dCA9IGF3YWl0IGZpbGUudGV4dCgpO1xyXG4gIC8vICAgICAvL3JlYWRlci5yZWFkQXModGV4dCk7XHJcbiAgLy8gICAgIGNvbnN0IHdiID0gWExTWC5yZWFkRmlsZShmaWxlLm5hbWUsIHt9KTtcclxuICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3Yi5TaGVldE5hbWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgbGV0IHRpdGxlID0gd2IuU2hlZXROYW1lc1tpXSwgd3MgPSB3Yi5TaGVldHNbdGl0bGVdO1xyXG4gIC8vICAgICAgIGxldCB0eXBlID0gdGhpcy50eXBlcy5maW5kKHQgPT4gdC50aXRsZSA9PT0gdGl0bGUpO1xyXG4gIC8vICAgICAgIGlmICghdHlwZSkgdGhyb3cgJyc7XHJcbiAgLy8gICAgICAgbGV0IHJvbGVzID0gdGhpcy5fc2Vzc2lvbi5wcm9maWxlLnJvbGVzLmZpbHRlcihyID0+IHIuZGF0YVR5cGUgPT09IHR5cGUubmFtZSk7XHJcbiAgLy8gICAgICAgbGV0IHJvdyA9IHdzWychcm93cyddWzBdO1xyXG4gIC8vICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgd3NbJyFjb2xzJ10ubGVuZ3RoOyBjKyspIHtcclxuICAvLyAgICAgICAgIGxldCBjb2wgPSB3c1snIWNvbHMnXVtjXTtcclxuICAvLyAgICAgICAgIC8vbGV0IHJvbGUgPSByb2xlcy5maW5kKHIgPT4gci50aXRsZSA9PT0gd3MuKTtcclxuICAvLyAgICAgICAvLyAgaWYgKCFyb2xlKSB7XHJcbiAgLy8gICAgICAgLy8gICAgdGhpcy5fZXZlcnl0aGluZ1t0eXBlLm5hbWVdLnJvbGVzLnB1c2goe25hbWU6ICcnLCB0aXRsZTogJyd9KTtcclxuICAvLyAgICAgICAvLyAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBmb3IgKGxldCByID0gMDsgciA8IHdzWychcm93cyddLmxlbmd0aDsgcisrKSB7XHJcbiAgLy8gICAgICAgICBsZXQgcm93ID0gd3NbJyFyb3dzJ11bcl07XHJcbiAgLy8gICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IHdzWychY29scyddLmxlbmd0aDsgYysrKSB7XHJcbiAgLy8gICAgICAgICAgIGxldCBjb2wgPSB3c1snIWNvbHMnXVtjXSwgY29udGVudCA9ICcnO1xyXG4gIC8vICAgICAgICAgICBpZiAoY29udGVudCkge1xyXG4gIC8vICAgICAgICAgICAgIC8vbGV0IHVzZXJzID0gY29udGVudC5zcGxpdCgnLCAnKS5tYXAobmFtZT0+IHRoaXMucHJvZmlsZXMuZmluZCh1PT4gdS5uYW1lID09PSBuYW1lKSk7XHJcblxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIGVsc2UgeyB9XHJcblxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZGVzdHJveS5uZXh0KCk7XHJcbiAgICB0aGlzLl9kZXN0cm95LmNvbXBsZXRlKCk7XHJcbiAgfVxyXG59XHJcbmludGVyZmFjZSBNb2RlbCB7XHJcbiAga2V5OiBhbnk7XHJcbiAgdHlwZTogJ2dyb3VwJyB8ICdwYXR0ZXJuJyB8ICdrZXknO1xyXG59XHJcblxyXG50eXBlIFR5cGVNYXAgPSB7IFtuYW1lOiBzdHJpbmddOiBEYXRhVHlwZU1vZGVsIH1cclxuXHJcbmludGVyZmFjZSBEYXRhVHlwZU1vZGVsIHtcclxuICBwYXR0ZXJuczogUGF0dGVybltdO1xyXG4gIHBvc2l0aW9uczogeyBbcm9sZTogc3RyaW5nXTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9IH07XHJcbiAgZ3JvdXBzOiBHcm91cFtdO1xyXG4gIHJvbGVzOiBbeyBuYW1lOiBzdHJpbmc7IHRpdGxlOiBzdHJpbmcgfV07XHJcbn1cclxuaW50ZXJmYWNlIEdyb3VwIHtcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBpdGVtczogc3RyaW5nW107XHJcbn1cclxuaW50ZXJmYWNlIFBhdHRlcm4ge1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGV4cHJlc3Npb246IHN0cmluZztcclxufVxyXG5pbnRlcmZhY2UgQ2VsbCB7IH1cclxuIiwiPG1hdC10b29sYmFyPlxyXG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJ0b29scyA9ICF0b29sc1wiIFtiaXpkb2NUb29sdGlwXT1cIidDb2xsYXBzZScgfCB0cmFuc2xhdGVcIj48bWF0LWljb24+dmlld19zaWRlYmFyPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cInNhdmUoKVwiIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCIhZGlydHlcIj57eydTYXZlQ2hhbmdlcyd8dHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICA8c3BhbiBjbGFzcz1cImRpdmlkZXJcIj48L3NwYW4+XHJcbiAgPGJpemRvYy1zZWFyY2gtaW5wdXQgKHZhbHVlQ2hhbmdlKT1cInNlYXJjaCgkZXZlbnQpXCI+PC9iaXpkb2Mtc2VhcmNoLWlucHV0PlxyXG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJuZXdNZW51XCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0FkZCd8dHJhbnNsYXRlXCI+PG1hdC1pY29uPmFkZDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgPG1hdC1tZW51ICNuZXdNZW51PlxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJuZXdSb2xlKClcIj57eydSb2xlJ3x0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJuZXdQYXR0ZXJuKClcIj57eydQYXR0ZXJuJ3x0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJuZXdHcm91cCgpXCI+e3snR3JvdXAnfHRyYW5zbGF0ZX19IDwvYnV0dG9uPlxyXG4gIDwvbWF0LW1lbnU+XHJcbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW2JpemRvY1Rvb2x0aXBdPVwiJ0Rvd25sb2FkJyB8IHRyYW5zbGF0ZVwiIChjbGljayk9XCJkb3dubG9hZCgpXCIgW2Rpc2FibGVkXT1cImRpcnR5XCI+PG1hdC1pY29uPnNhdmVfYWx0PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuPC9tYXQtdG9vbGJhcj5cclxuPG1hdC1wcm9ncmVzcy1iYXIgW21vZGVdPVwibG9hZGluZ1wiIFtzdHlsZS52aXNpYmlsaXR5XT1cImxvYWRpbmcgPyAndmlzaWJsZSc6J2hpZGRlbidcIj48L21hdC1wcm9ncmVzcy1iYXI+XHJcbjxkaXYgY2xhc3M9XCJyb3cgZmxleFwiPlxyXG4gIDxtYXQtbmF2LWxpc3QgY2xhc3M9XCJ0aW1lbGluZVwiIFtzdHlsZS5kaXNwbGF5XT1cInRvb2xzPycnOidub25lJ1wiPlxyXG4gICAgPG1hdC1saXN0LWl0ZW0gKm5nRm9yPVwibGV0IHQgb2YgZGF0YXR5cGVzXCIgKGNsaWNrKT1cImNoYW5nZSh0Lm5hbWUpXCIgW2NsYXNzLmFjdGl2ZV09XCJ0ID09PSB0eXBlXCI+e3t0LnRpdGxlfX08L21hdC1saXN0LWl0ZW0+XHJcbiAgPC9tYXQtbmF2LWxpc3Q+XHJcbiAgPHRhYmxlIG1hdC10YWJsZSBtYXRTb3J0IFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBbc3R5bGUuZGlzcGxheV09XCJkYXRhU291cmNlID8gJyc6ICdub25lJ1wiIGNsYXNzPVwiZmxleFwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mICh0eXBlPy5jb2x1bW5zIHx8W10pXCIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4ubmFtZVwiPlxyXG4gICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj57e2NvbHVtbi5sYWJlbH19PC90aD5cclxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50W2NvbHVtbi5uYW1lXX19IDwvdGQ+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwia2V5XCI+XHJcbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPnt7Jyd9fTwvdGg+XHJcbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XHJcbiAgICAgICAgPHNwYW4gW25nU3dpdGNoXT1cImVsZW1lbnQudHlwZVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2dyb3VwJ1wiPih7eydHcm91cCd8dHJhbnNsYXRlfX0pPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncGF0dGVybidcIj4oe3snUGF0dGVybid8dHJhbnNsYXRlfX0pPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgIHt7ZWxlbWVudC5rZXl9fVxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L3RkPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInZhbHVlXCI+XHJcbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPnt7Jyd9fTwvdGg+XHJcbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XHJcbiAgICAgICAge3tlbGVtZW50LnZhbHVlfX1cclxuICAgICAgPC90ZD5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm9sZSBvZiByb2xlc1wiIFttYXRDb2x1bW5EZWZdPVwicm9sZS5uYW1lXCI+XHJcbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+e3tyb2xlLnRpdGxlfX08L3RoPlxyXG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIFthdHRyLmRhdGEtcm9sZV09XCJyb2xlLm5hbWVcIiBjbGFzcz1cInJvbGUtY29sdW1uXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBvc2l0aW9uc1tyb2xlLm5hbWVdW2VsZW1lbnQua2V5XVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdSBvZiBwb3NpdGlvbnNbcm9sZS5uYW1lXVtlbGVtZW50LmtleV07IGxldCBmaXJzdCA9IGZpcnN0XCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmlyc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICB7e3Byb2ZpbGVzW3VdPy5uYW1lfX1cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L3RkPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIm9wdGlvbnNcIj5cclxuICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj48L3RoPlxyXG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJvcHRpb25zXCIgKm5nSWY9XCJlbGVtZW50LnR5cGUgPT09ICdwYXR0ZXJuJyB8fCBlbGVtZW50LnR5cGUgPT09ICdncm91cCdcIj48bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICA8bWF0LW1lbnUgI29wdGlvbnM+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWxlbWVudC50eXBlID09PSAncGF0dGVybidcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJlZGl0UGF0dGVybihlbGVtZW50LmtleSlcIj57eydFZGl0J3x0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJkZWxldGVQYXR0ZXJuKGVsZW1lbnQua2V5KVwiPnt7J1JlbW92ZSd8dHJhbnNsYXRlfX0gPC9idXR0b24+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbGVtZW50LnR5cGUgPT09ICdncm91cCdcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJlZGl0R3JvdXAoZWxlbWVudC5rZXkpXCI+e3snRWRpdCd8dHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZGVsZXRlR3JvdXAoZWxlbWVudC5rZXkpXCI+e3snUmVtb3ZlJ3x0cmFuc2xhdGV9fSA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgIDwvdGQ+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnM7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XHJcbiAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IGVsZW1lbnQ7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnNcIiAoY2xpY2spPVwiZWRpdChlbGVtZW50LmtleSwgJGV2ZW50KVwiPjwvdHI+XHJcbiAgPC90YWJsZT5cclxuPC9kaXY+XHJcbjwhLS0gcm9sZSB0ZW1wbGF0ZSAtLT5cclxuPG5nLXRlbXBsYXRlICNyb2xlVHBsPlxyXG4gIDxoMiBtYXQtZGlhbG9nLXRpdGxlPnt7J1JvbGUnIHwgdHJhbnNsYXRlIH19PC9oMj5cclxuICA8bWF0LWRpYWxvZy1jb250ZW50PlxyXG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJyb2xlXCIgY2xhc3M9XCJjb2x1bW5cIj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIFtwbGFjZWhvbGRlcl09XCInVGl0bGUnfCB0cmFuc2xhdGVcIiByZXF1aXJlZCBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPC9mb3JtPlxyXG4gIDwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG4gIDxtYXQtZGlhbG9nLWFjdGlvbnM+XHJcbiAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdC1kaWFsb2ctY2xvc2VdPVwicm9sZS52YWx1ZVwiIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCIhcm9sZS52YWxpZFwiPnt7J09LJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICA8YnV0dG9uIG1hdC1idXR0b24gbWF0LWRpYWxvZy1jbG9zZT57eydDYW5jZWwnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPCEtLSBwYXR0ZXJuIHRlbXBsYXRlIC0tPlxyXG48bmctdGVtcGxhdGUgI3BhdHRlcm5UcGw+XHJcbiAgPGgyIG1hdC1kaWFsb2ctdGl0bGU+e3snUGF0dGVybicgfCB0cmFuc2xhdGUgfX08L2gyPlxyXG4gIDxtYXQtZGlhbG9nLWNvbnRlbnQ+XHJcbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cInBhdHRlcm5cIiBjbGFzcz1cImNvbHVtblwiPlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgW3BsYWNlaG9sZGVyXT1cIidUaXRsZSd8IHRyYW5zbGF0ZVwiIHJlcXVpcmVkIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZXhwcmVzc2lvblwiIFtwbGFjZWhvbGRlcl09XCInUmVnZXgnfCB0cmFuc2xhdGVcIiByZXF1aXJlZCBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxyXG4gICAgICAgIDxtYXQtaGludD48c3BhbiBbaW5uZXJIVE1MXT1cIidSZWdleEhpbnQnIHwgdHJhbnNsYXRlIDogJ2h0dHBzOi8vcmVnZXgxMDEuY29tLyd8IHNhbml0aXplSHRtbFwiPjwvc3Bhbj48L21hdC1oaW50PlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPC9mb3JtPlxyXG4gIDwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG4gIDxtYXQtZGlhbG9nLWFjdGlvbnM+XHJcbiAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdC1kaWFsb2ctY2xvc2VdPVwicGF0dGVybi52YWx1ZVwiIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCIhcGF0dGVybi52YWxpZFwiPnt7J09LJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICA8YnV0dG9uIG1hdC1idXR0b24gbWF0LWRpYWxvZy1jbG9zZT57eydDYW5jZWwnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPCEtLSBncm91cCAtLT5cclxuPG5nLXRlbXBsYXRlICNncm91cFRwbD5cclxuICA8aDIgbWF0LWRpYWxvZy10aXRsZT57eydHcm91cCcgfCB0cmFuc2xhdGUgfX08L2gyPlxyXG4gIDxtYXQtZGlhbG9nLWNvbnRlbnQ+XHJcbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImdyb3VwXCIgY2xhc3M9XCJjb2x1bW5cIj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIFtwbGFjZWhvbGRlcl09XCInVGl0bGUnfCB0cmFuc2xhdGVcIiByZXF1aXJlZCBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPG1hdC1zZWxlY3QgW3BsYWNlaG9sZGVyXT1cIidJdGVtcyd8dHJhbnNsYXRlXCIgbXVsdGlwbGUgZm9ybUNvbnRyb2xOYW1lPVwiaXRlbXNcIiByZXF1aXJlZD5cclxuICAgICAgICAgIDxtYXQtc2VsZWN0LXRyaWdnZXI+XHJcbiAgICAgICAgICAgIHt7Z3JvdXAudmFsdWUuaXRlbXMgPyBncm91cC52YWx1ZS5pdGVtc1swXSA6ICcnfX1cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJncm91cC52YWx1ZS5pdGVtcz8ubGVuZ3RoID4gMVwiIGNsYXNzPVwiYWRkaXRpb25hbC1zZWxlY3Rpb25cIj5cclxuICAgICAgICAgICAgICAoK3t7Z3JvdXAudmFsdWUuaXRlbXMubGVuZ3RoIC0gMX19IHt7KGdyb3VwLnZhbHVlLml0ZW1zPy5sZW5ndGggPT09IDIgPyAnT3RoZXInIDogJ090aGVycycpfHRyYW5zbGF0ZX19KVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB2IG9mIHNvdXJjZVwiIFt2YWx1ZV09XCJ2LmtleVwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiF0eXBlLmNvbHVtbnNcIj57e3YudmFsdWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0eXBlLmNvbHVtbnNcIj48c3BhbiAqbmdGb3I9XCJsZXQgYyBvZiB0eXBlLmNvbHVtbnNcIj57e3YudmFsdWVbYy5uYW1lXX19PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8L2Zvcm0+XHJcbiAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XHJcbiAgPG1hdC1kaWFsb2ctYWN0aW9ucz5cclxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0LWRpYWxvZy1jbG9zZV09XCJncm91cC52YWx1ZVwiIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCIhZ3JvdXAudmFsaWRcIj57eydPSycgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2U+e3snQ2FuY2VsJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjbm9Sb2xlVHBsPlxyXG4gIDxtYXQtZGlhbG9nLWNvbnRlbnQ+XHJcbiAgICB7eydOb1JvbGVzJ3x0cmFuc2xhdGUgOiB0eXBlPy50aXRsZX19XHJcbiAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XHJcbiAgPG1hdC1kaWFsb2ctYWN0aW9ucz5cclxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0LWRpYWxvZy1jbG9zZV09XCJ0cnVlXCIgY29sb3I9XCJwcmltYXJ5XCI+e3snQ3JlYXRlUm9sZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2U+e3snQ2FuY2VsJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjwhLS08Zm9ybSBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPlxyXG4gIDxpbnB1dCB0eXBlPVwiZmlsZVwiIG5hbWU9XCJmaWxlXCIgKG9uY2hhbmdlKT1cInVwbG9hZCgkZXZlbnQpXCIgI2ZpbGUvPlxyXG48L2Zvcm0+LS0+XHJcbiJdfQ==