@sumaris-net/ngx-components 18.2.27 → 18.2.28-alpha1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/doc/changelog.md +9 -4
- package/esm2022/src/app/core/form/properties/properties.table.mjs +1 -1
- package/esm2022/src/app/core/services/network.service.mjs +2 -2
- package/esm2022/src/app/core/services/storage/entity-store.class.mjs +5 -2
- package/esm2022/src/app/core/table/testing/table.testing.mjs +1 -1
- package/esm2022/src/app/core/table/testing/table2.testing.mjs +1 -1
- package/esm2022/src/app/shared/form/field.component.mjs +1 -1
- package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +37 -44
- package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +3 -3
- package/esm2022/src/app/shared/material/testing/common.test.mjs +1 -1
- package/fesm2022/sumaris-net.ngx-components.mjs +48 -52
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/src/app/shared/material/boolean/material.boolean.d.ts +6 -7
- package/src/assets/manifest.json +1 -1
package/doc/changelog.md
CHANGED
|
@@ -1002,15 +1002,20 @@ enh: Environment: add useHash property to configure Angular router to use hash U
|
|
|
1002
1002
|
|
|
1003
1003
|
# 18.2.21
|
|
1004
1004
|
- enh(functions) Rename `selectInputContent` into `selectInputContentFromEvent`, and make `selectInputContent` that only use an <input> as argument
|
|
1005
|
-
- enh(autocomplete-field)
|
|
1006
|
-
- fix(swipe-field)
|
|
1005
|
+
- enh(autocomplete-field) Add `@Input() clearInvalidValueOnBlur: boolean` to reset the field when typing invalid search text (no match or no many matches)
|
|
1006
|
+
- fix(swipe-field) Fix swiper previous/next arrows
|
|
1007
1007
|
|
|
1008
1008
|
# 18.2.23
|
|
1009
|
-
- enh(validators)
|
|
1009
|
+
- enh(validators) add option skipIfNoTime to dateRange
|
|
1010
1010
|
|
|
1011
1011
|
# 18.2.24
|
|
1012
|
-
- enh(pipe)
|
|
1012
|
+
- enh(pipe) add new pipe `isValidDate` with option `requiredTime` (to test date with noTime flag)
|
|
1013
1013
|
|
|
1014
1014
|
# 18.2.26
|
|
1015
1015
|
- enh(select-peer-modal) Allow to search on peers modal
|
|
1016
1016
|
- enh(select-peer-modal) Allow to select peer by features (aka programs) - should set `enableSelectPeerByFeature: true` in the environment token (disabled by default)
|
|
1017
|
+
|
|
1018
|
+
# 18.2.28
|
|
1019
|
+
- fix(mat-boolean-field) Small refactoring + simplify blur detection, using standard Angular outputs
|
|
1020
|
+
- enh(mat-latlong-field) Refactor the component, to use separate inputs (instead of using Maskito)
|
|
1021
|
+
- fix(entity-store) setEntities() should mark all entities as dirty, when id mode is enabled (because an optimization in `persist()` that skip pristine entities)
|
|
@@ -249,7 +249,7 @@ export class AppPropertiesTable extends AppInMemoryTable {
|
|
|
249
249
|
return isNotNil(value) ? value : definition.defaultValue;
|
|
250
250
|
}
|
|
251
251
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: AppPropertiesTable, deps: [{ token: i0.Injector }, { token: i1.UntypedFormBuilder }, { token: PropertyEntityValidator }, { token: ENVIRONMENT }], target: i0.ɵɵFactoryTarget.Component });
|
|
252
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.11", type: AppPropertiesTable, selector: "app-properties-table", inputs: { definitions: "definitions", showToolbar: "showToolbar" }, providers: [{ provide: PropertyEntityValidator, useClass: PropertyEntityValidator }], viewQueries: [{ propertyName: "filterExpansionPanel", first: true, predicate: MatExpansionPanel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<mat-toolbar *ngIf=\"showToolbar\" [class.expanded]=\"filterExpansionPanel.expanded\">\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\" [title]=\"'COMMON.BTN_REFRESH' | translate\" (click)=\"emitRefresh()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\" *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold\">close</mat-icon>\n </button>\n\n <!-- Show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon\n [matBadge]=\"filterCriteriaCount\"\n [matBadgeHidden]=\"filterIsEmpty\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n aria-hidden=\"false\"\n >\n filter_list_alt\n </mat-icon>\n </button>\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n <!-- search -->\n <mat-expansion-panel\n #filterExpansionPanel\n class=\"filter-panel\"\n [class.ion-no-padding]=\"mobile\"\n [class.filter-panel-floating]=\"filterPanelFloating\"\n >\n <form class=\"form-container\" [formGroup]=\"filterForm\" (ngSubmit)=\"emitRefresh()\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search -->\n <mat-form-field>\n <mat-label>{{ 'SETTINGS.FILTER.SEARCH' | translate }}</mat-label>\n <input matInput formControlName=\"searchText\" />\n\n <button\n mat-icon-button\n matSuffix\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n\n <ion-col>\n <mat-boolean-field\n [style]=\"'checkbox'\"\n formControlName=\"notDefaultOnly\"\n [placeholder]=\"'SETTINGS.FILTER.ONLY_NOT_DEFAULT' | translate\"\n floatLabel=\"always\"\n ></mat-boolean-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label\n [hidden]=\"(loadingSubject | async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\"\n >\n {{\n (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT')\n | translate\n : {\n count: (totalRowCount | numberFormat)\n }\n }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <button\n mat-icon-button\n color=\"accent\"\n *ngIf=\"filterPanelFloating\"\n (click)=\"toggleFilterPanelFloating()\"\n class=\"hidden-xs hidden-sm hidden-md\"\n [title]=\"(filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate\"\n >\n <mat-icon>\n <span style=\"transform: rotate(90deg)\">{{ filterPanelFloating ? '»' : '«' }}</span>\n </mat-icon>\n </button>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\" (click)=\"closeFilterPanel()\" [disabled]=\"loadingSubject | async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button\n mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\"\n [disabled]=\"loadingSubject | async\"\n >\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n </mat-action-row>\n </mat-expansion-panel>\n\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- table -->\n <div class=\"table-container\">\n <table\n #table\n mat-table\n matSort\n matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\"\n [style.--mat-row-height]=\"'52px'\"\n >\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"true\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"true\"></td>\n </ng-container>\n\n <!-- id column (hidden) -->\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!debug\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!debug\">\n {{ row.currentData.id }}\n </td>\n </ng-container>\n\n <!-- definition column -->\n <ng-container matColumnDef=\"definition\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"ion-padding-start\">\n <ion-label>{{ i18nColumnPrefix + 'DEFINITION' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"ion-padding-start\">\n {{ row.currentData | propertyGet: 'definition.translatedName' }}\n </td>\n </ng-container>\n\n <!-- value column -->\n <app-row-field\n name=\"value\"\n floatLabel=\"never\"\n [definitionFn]=\"definitionByRow\"\n [headerI18n]=\"i18nColumnPrefix + 'VALUE'\"\n [required]=\"true\"\n ></app-row-field>\n\n <!-- Actions buttons column -->\n <app-actions-column\n [stickyEnd]=\"true\"\n [canCancel]=\"false\"\n [canDelete]=\"false\"\n [dirtyIcon]=\"false\"\n [cellTemplate]=\"cellInjection\"\n >\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <button\n type=\"button\"\n mat-icon-button\n *ngIf=\"\n !mobile &&\n !disabled &&\n (row.validator | formGetValue: 'value') !== (row.validator | formGetValue: 'definition').defaultValue\n \"\n [class.visible-hover-row]=\"!mobile\"\n [tabindex]=\"-1\"\n [title]=\"'SETTINGS.BTN_RESET_PROPERTY' | translate\"\n (click)=\"resetProperty($event, row)\"\n >\n <mat-icon>undo</mat-icon>\n </button>\n </ng-template>\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: displayedColumns\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"\n ></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject | async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i3.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i3.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i3.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "mode", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: i3.IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "component", type: i3.IonRow, selector: "ion-row" }, { kind: "component", type: i3.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i3.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i4.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i5.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i5.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i5.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i5.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i5.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i5.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i5.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i5.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i5.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i6.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i6.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i8.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: i9.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "directive", type: i9.MatExpansionPanelActionRow, selector: "mat-action-row" }, { kind: "component", type: i10.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i12.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i13.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "directive", type: i14.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i15.MatBooleanField, selector: "mat-boolean-field", inputs: ["disabled", "formControl", "formControlName", "placeholder", "floatLabel", "appearance", "subscriptSizing", "readonly", "required", "compact", "style", "buttonsColCount", "class", "yesLabel", "noLabel", "showButtonIcons", "yesIcon", "noIcon", "clearable", "labelPosition", "tabindex", "showRadio", "value"], outputs: ["keyup.enter", "blur"] }, { kind: "component", type: i16.ActionsColumnComponent, selector: "app-actions-column", inputs: ["matColumnDef", "style", "stickyEnd", "canCancel", "canConfirm", "canDelete", "canBackward", "canForward", "canConfirmAndAdd", "dirtyIcon", "optionsTitle", "class", "cellTemplate"], outputs: ["optionsClick", "cancelOrDeleteClick", "confirmEditCreateClick", "confirmAndAddClick", "backward", "forward"] }, { kind: "component", type: i17.AppRowField, selector: "app-row-field", inputs: ["name", "definition", "definitionFn", "headerI18n", "sortable", "resizable", "required", "readonly", "sticky", "draggable", "disabled", "placeholder", "compact", "floatLabel", "appearance", "tabindex", "autofocus", "clearable", "chipColor", "class", "debug"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "pipe", type: i18.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i19.NumberFormatPipe, name: "numberFormat" }, { kind: "pipe", type: i20.FormGetValuePipe, name: "formGetValue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
252
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.11", type: AppPropertiesTable, selector: "app-properties-table", inputs: { definitions: "definitions", showToolbar: "showToolbar" }, providers: [{ provide: PropertyEntityValidator, useClass: PropertyEntityValidator }], viewQueries: [{ propertyName: "filterExpansionPanel", first: true, predicate: MatExpansionPanel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<mat-toolbar *ngIf=\"showToolbar\" [class.expanded]=\"filterExpansionPanel.expanded\">\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\" [title]=\"'COMMON.BTN_REFRESH' | translate\" (click)=\"emitRefresh()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\" *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold\">close</mat-icon>\n </button>\n\n <!-- Show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon\n [matBadge]=\"filterCriteriaCount\"\n [matBadgeHidden]=\"filterIsEmpty\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n aria-hidden=\"false\"\n >\n filter_list_alt\n </mat-icon>\n </button>\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n <!-- search -->\n <mat-expansion-panel\n #filterExpansionPanel\n class=\"filter-panel\"\n [class.ion-no-padding]=\"mobile\"\n [class.filter-panel-floating]=\"filterPanelFloating\"\n >\n <form class=\"form-container\" [formGroup]=\"filterForm\" (ngSubmit)=\"emitRefresh()\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search -->\n <mat-form-field>\n <mat-label>{{ 'SETTINGS.FILTER.SEARCH' | translate }}</mat-label>\n <input matInput formControlName=\"searchText\" />\n\n <button\n mat-icon-button\n matSuffix\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n\n <ion-col>\n <mat-boolean-field\n [style]=\"'checkbox'\"\n formControlName=\"notDefaultOnly\"\n [placeholder]=\"'SETTINGS.FILTER.ONLY_NOT_DEFAULT' | translate\"\n floatLabel=\"always\"\n ></mat-boolean-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label\n [hidden]=\"(loadingSubject | async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\"\n >\n {{\n (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT')\n | translate\n : {\n count: (totalRowCount | numberFormat)\n }\n }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <button\n mat-icon-button\n color=\"accent\"\n *ngIf=\"filterPanelFloating\"\n (click)=\"toggleFilterPanelFloating()\"\n class=\"hidden-xs hidden-sm hidden-md\"\n [title]=\"(filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate\"\n >\n <mat-icon>\n <span style=\"transform: rotate(90deg)\">{{ filterPanelFloating ? '»' : '«' }}</span>\n </mat-icon>\n </button>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\" (click)=\"closeFilterPanel()\" [disabled]=\"loadingSubject | async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button\n mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\"\n [disabled]=\"loadingSubject | async\"\n >\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n </mat-action-row>\n </mat-expansion-panel>\n\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- table -->\n <div class=\"table-container\">\n <table\n #table\n mat-table\n matSort\n matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\"\n [style.--mat-row-height]=\"'52px'\"\n >\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"true\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"true\"></td>\n </ng-container>\n\n <!-- id column (hidden) -->\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!debug\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!debug\">\n {{ row.currentData.id }}\n </td>\n </ng-container>\n\n <!-- definition column -->\n <ng-container matColumnDef=\"definition\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"ion-padding-start\">\n <ion-label>{{ i18nColumnPrefix + 'DEFINITION' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"ion-padding-start\">\n {{ row.currentData | propertyGet: 'definition.translatedName' }}\n </td>\n </ng-container>\n\n <!-- value column -->\n <app-row-field\n name=\"value\"\n floatLabel=\"never\"\n [definitionFn]=\"definitionByRow\"\n [headerI18n]=\"i18nColumnPrefix + 'VALUE'\"\n [required]=\"true\"\n ></app-row-field>\n\n <!-- Actions buttons column -->\n <app-actions-column\n [stickyEnd]=\"true\"\n [canCancel]=\"false\"\n [canDelete]=\"false\"\n [dirtyIcon]=\"false\"\n [cellTemplate]=\"cellInjection\"\n >\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <button\n type=\"button\"\n mat-icon-button\n *ngIf=\"\n !mobile &&\n !disabled &&\n (row.validator | formGetValue: 'value') !== (row.validator | formGetValue: 'definition').defaultValue\n \"\n [class.visible-hover-row]=\"!mobile\"\n [tabindex]=\"-1\"\n [title]=\"'SETTINGS.BTN_RESET_PROPERTY' | translate\"\n (click)=\"resetProperty($event, row)\"\n >\n <mat-icon>undo</mat-icon>\n </button>\n </ng-template>\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: displayedColumns\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"\n ></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject | async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i3.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i3.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i3.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "mode", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: i3.IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "component", type: i3.IonRow, selector: "ion-row" }, { kind: "component", type: i3.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i3.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i4.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i5.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i5.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i5.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i5.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i5.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i5.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i5.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i5.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i5.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i6.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i6.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i8.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: i9.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "directive", type: i9.MatExpansionPanelActionRow, selector: "mat-action-row" }, { kind: "component", type: i10.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i12.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i13.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "directive", type: i14.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i15.MatBooleanField, selector: "mat-boolean-field", inputs: ["disabled", "formControl", "formControlName", "placeholder", "floatLabel", "appearance", "subscriptSizing", "readonly", "required", "compact", "style", "buttonsColCount", "class", "yesLabel", "noLabel", "showButtonIcons", "yesIcon", "noIcon", "clearable", "labelPosition", "tabindex", "showRadio", "value"], outputs: ["keyup.enter", "focus", "blur"] }, { kind: "component", type: i16.ActionsColumnComponent, selector: "app-actions-column", inputs: ["matColumnDef", "style", "stickyEnd", "canCancel", "canConfirm", "canDelete", "canBackward", "canForward", "canConfirmAndAdd", "dirtyIcon", "optionsTitle", "class", "cellTemplate"], outputs: ["optionsClick", "cancelOrDeleteClick", "confirmEditCreateClick", "confirmAndAddClick", "backward", "forward"] }, { kind: "component", type: i17.AppRowField, selector: "app-row-field", inputs: ["name", "definition", "definitionFn", "headerI18n", "sortable", "resizable", "required", "readonly", "sticky", "draggable", "disabled", "placeholder", "compact", "floatLabel", "appearance", "tabindex", "autofocus", "clearable", "chipColor", "class", "debug"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "pipe", type: i18.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i19.NumberFormatPipe, name: "numberFormat" }, { kind: "pipe", type: i20.FormGetValuePipe, name: "formGetValue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
253
253
|
}
|
|
254
254
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: AppPropertiesTable, decorators: [{
|
|
255
255
|
type: Component,
|
|
@@ -402,7 +402,7 @@ export class NetworkService extends StartableObservableService {
|
|
|
402
402
|
// No peer in settings: ask user to choose
|
|
403
403
|
while (!peer) {
|
|
404
404
|
console.debug('[network] No peer defined. Asking user to choose a peer.');
|
|
405
|
-
peer = await this.showSelectPeerModal({ allowSelectDownPeer: false, title: 'NETWORK.PEER.SELECT_MODAL.
|
|
405
|
+
peer = await this.showSelectPeerModal({ allowSelectDownPeer: false, title: 'NETWORK.PEER.SELECT_MODAL.STARTUP_TITLE', canCancel: false });
|
|
406
406
|
}
|
|
407
407
|
}
|
|
408
408
|
else if (this.online) {
|
|
@@ -624,4 +624,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImpo
|
|
|
624
624
|
}] }, { type: i1.ToastController, decorators: [{
|
|
625
625
|
type: Optional
|
|
626
626
|
}] }] });
|
|
627
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL3NlcnZpY2VzL25ldHdvcmsuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUcxQyxPQUFPLEVBQTJCLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUUsT0FBTyxFQUF3QixvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV4RCxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXBHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzQyxPQUFPLEVBQW9CLE1BQU0sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3BHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSwwQkFBMEIsRUFB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QUFDLE1BQU0sZUFBZSxDQUFDLENBQUM7WUFFL0YsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUNoQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ3JCLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLE9BQU87b0JBQUUsT0FBTztnQkFDckIsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLDZCQUE2QixHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzFGLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQzt3R0E5ckJVLGNBQWMsa0JBc0RmLFFBQVEscUxBT1IsV0FBVyxhQUNDLG1CQUFtQjs0R0E5RDlCLGNBQWMsY0FERCxNQUFNOzs0RkFDbkIsY0FBYztrQkFEMUIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQXVEN0IsTUFBTTsyQkFBQyxRQUFROzswQkFPZixNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQ3RDLFFBQVE7OzBCQUNSLFFBQVE7OzBCQUNSLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFN0b3JhZ2UgfSBmcm9tICdAaW9uaWMvc3RvcmFnZS1hbmd1bGFyJztcbmltcG9ydCB7IFBlZXIgfSBmcm9tICcuL21vZGVsL3BlZXIubW9kZWwnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5ncyB9IGZyb20gJy4vbW9kZWwvc2V0dGluZ3MubW9kZWwnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyLCBQbGF0Zm9ybSwgVG9hc3RDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgSVNlbGVjdFBlZXJNb2RhbE9wdGlvbnMsIFNlbGVjdFBlZXJNb2RhbCB9IGZyb20gJy4uL3BlZXIvc2VsZWN0LXBlZXIubW9kYWwnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmaXJzdFZhbHVlRnJvbSwgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5nc1NlcnZpY2UsIFNFVFRJTkdTX1NUT1JBR0VfS0VZIH0gZnJvbSAnLi9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IFNwbGFzaFNjcmVlbiB9IGZyb20gJ0BjYXBhY2l0b3Ivc3BsYXNoLXNjcmVlbic7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IGVxdWFscywgaXNOb3RFbXB0eUFycmF5LCBpc05vdE5pbE9yQmxhbmssIHNsZWVwLCB0b0Jvb2xlYW4gfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IE5ldHdvcmsgfSBmcm9tICdAYXdlc29tZS1jb3Jkb3ZhLXBsdWdpbnMvbmV0d29yay9uZ3gnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2FjaGVTZXJ2aWNlIH0gZnJvbSAnaW9uaWMtY2FjaGUnO1xuaW1wb3J0IHsgU2hvd1RvYXN0T3B0aW9ucywgVG9hc3RzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3RvYXN0L3RvYXN0cyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBmaXJzdCwgbWFwLCBtZXJnZU1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBPdmVybGF5RXZlbnREZXRhaWwgfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQgeyBBcHBNYW5pZmVzdCwgTm9kZUluZm8gfSBmcm9tICcuL25ldHdvcmsudXRpbHMnO1xuaW1wb3J0IHsgSHR0cFV0aWxzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2h0dHAvaHR0cC51dGlscyc7XG5pbXBvcnQgeyBWZXJzaW9uVXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvdmVyc2lvbi92ZXJzaW9ucyc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgRU5WSVJPTk1FTlQgfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHsgU3RhcnRhYmxlT2JzZXJ2YWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvc3RhcnRhYmxlLW9ic2VydmFibGUtc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBDb25uZWN0aW9uVHlwZSwgZ2V0Q29ubmVjdGlvblR5cGUsIE5ldHdvcmtFdmVudFR5cGUgfSBmcm9tICcuL25ldHdvcmsudHlwZXMnO1xuaW1wb3J0IHsgQVBQX0xPR0dJTkdfU0VSVklDRSB9IGZyb20gJy4uLy4uL3NoYXJlZC9sb2dnaW5nL2xvZ2dpbmctc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBJTG9nZ2VyLCBJTG9nZ2luZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvbG9nZ2luZy9sb2dnZXIubW9kZWwnO1xuXG5jb25zdCBOZXR3b3JrUmVmcmVzaFRpbWVyUGVyaW9kID0ge1xuICBNT0JJTEU6IDEwMDAgKiA2MCAqIDEwIC8qIGV2ZXJ5IDEwIG1pbiAqLyxcbiAgREVTS1RPUDogMTAwMCAqIDYwICogNSAvKiBldmVyeSA1IG1pbiAqLyxcbn07XG5cbmV4cG9ydCBjb25zdCBQRUVSX1VSTF9SRUdFWFAgPSAvXihodHRwfGh0dHBzKTpcXC9cXC9bXiBcIj8jQF0rJC87XG5cbmV4cG9ydCBjb25zdCBORVRXT1JLX0RFRkFVTFRfQ09OTkVDVElPTl9USU1FT1VUID0gMTAwMDA7IC8vIDEwcyAtIC8hXFwgc2hvdWxkIGJlIGhpZ2ggKGUuZy4gZm9yIHBvb3IgY29ubmVjdGlvbilcblxuLyogLS0gREVWIG9ubHkgKHRvIGRlYnVnIHJlZnJlc2ggdGltZXIpXG5OZXR3b3JrUmVmcmVzaFRpbWVyUGVyaW9kLk1PQklMRSA9ICAxMDAwO1xuTmV0d29ya1JlZnJlc2hUaW1lclBlcmlvZC5ERVNLVE9QID0gIDEwMDA7ICovXG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgTmV0d29ya1NlcnZpY2UgZXh0ZW5kcyBTdGFydGFibGVPYnNlcnZhYmxlU2VydmljZTxQZWVyLCBQZWVyPiB7XG4gIG9uUGVlckNoYW5nZXMgPSB0aGlzLnN0YXJ0U3ViamVjdC5waXBlKFxuICAgIG1hcCgocGVlcikgPT4gcGVlcj8udXJsKSxcbiAgICBmaWx0ZXIoaXNOb3ROaWxPckJsYW5rKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZDxzdHJpbmc+KClcbiAgKTtcbiAgb25OZXR3b3JrU3RhdHVzQ2hhbmdlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q29ubmVjdGlvblR5cGU+KG51bGwpO1xuICBvblJlc2V0TmV0d29ya0NhY2hlID0gbmV3IEV2ZW50RW1pdHRlcih0cnVlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9tb2JpbGU6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogSUxvZ2dlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBfbmV0d29yazogTmV0d29yaztcbiAgcHJpdmF0ZSBfdGltZXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBfdGltZXJSZWZyZXNoUGVyaW9kOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3RpbWVyUmVmcmVzaENvbmRpdGlvbjogKCkgPT4gYm9vbGVhbjtcbiAgcHJpdmF0ZSBfZGV2aWNlQ29ubmVjdGlvblR5cGU6IENvbm5lY3Rpb25UeXBlO1xuICBwcml2YXRlIF9mb3JjZU9mZmxpbmU6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Nvbm5lY3Rpb25UaW1lb3V0OiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBfbGlzdGVuZXJzOiB7XG4gICAgW2tleTogc3RyaW5nXTogKChkYXRhPzogYW55KSA9PiBQcm9taXNlPHZvaWQ+KVtdO1xuICB9ID0ge307XG5cbiAgZ2V0IG9ubGluZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uVHlwZSAhPT0gJ25vbmUnO1xuICB9XG5cbiAgZ2V0IG9mZmxpbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblR5cGUgPT09ICdub25lJztcbiAgfVxuXG4gIGdldCBjb25uZWN0aW9uVHlwZSgpOiBDb25uZWN0aW9uVHlwZSB7XG4gICAgLy8gSWYgZm9yY2Ugb2ZmbGluZTogcmV0dXJuICdub25lJ1xuICAgIHJldHVybiB0aGlzLl9mb3JjZU9mZmxpbmVcbiAgICAgID8gJ25vbmUnXG4gICAgICA6IC8vIEVsc2UsIHJldHVybiBkZXZpY2UgY29ubmVjdGlvbiB0eXBlIChvciB1bmtub3duKVxuICAgICAgICAodGhpcy5zdGFydGVkICYmIHRoaXMuX2RldmljZUNvbm5lY3Rpb25UeXBlKSB8fCAndW5rbm93bic7XG4gIH1cblxuICBnZXQgcGVlcigpOiBQZWVyIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU3ViamVjdC52YWx1ZT8uY2xvbmUoKTtcbiAgfVxuXG4gIHNldCBwZWVyKHBlZXI6IFBlZXIpIHtcbiAgICBpZiAoIVBlZXIuZXF1YWxzKHRoaXMucGVlciwgcGVlcikpIHtcbiAgICAgIHRoaXMucmVzdGFydChwZWVyKTtcbiAgICB9XG4gIH1cblxuICBnZXQgY29ubmVjdGlvblRpbWVvdXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvblRpbWVvdXQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudDogYW55LFxuICAgIHBsYXRmb3JtOiBQbGF0Zm9ybSxcbiAgICBwcml2YXRlIG1vZGFsQ3RybDogTW9kYWxDb250cm9sbGVyLFxuICAgIHByaXZhdGUgc3RvcmFnZTogU3RvcmFnZSxcbiAgICBwcml2YXRlIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBwcml2YXRlIGNhY2hlOiBDYWNoZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfTE9HR0lOR19TRVJWSUNFKSBwcml2YXRlIGxvZ2dpbmdTZXJ2aWNlOiBJTG9nZ2luZ1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgbmV0d29yazogTmV0d29yayxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHRvYXN0Q29udHJvbGxlcjogVG9hc3RDb250cm9sbGVyXG4gICkge1xuICAgIHN1cGVyKHBsYXRmb3JtKTtcbiAgICB0aGlzLl9tb2JpbGUgPSB0aGlzLnNldHRpbmdzLm1vYmlsZTtcbiAgICB0aGlzLl9jb25uZWN0aW9uVGltZW91dCA9IGVudmlyb25tZW50LmNvbm5lY3Rpb25UaW1lb3V0IHx8IE5FVFdPUktfREVGQVVMVF9DT05ORUNUSU9OX1RJTUVPVVQ7XG4gICAgdGhpcy5fbG9nZ2VyID0gdGhpcy5sb2dnaW5nU2VydmljZT8uZ2V0TG9nZ2VyKCduZXR3b3JrJyk7XG5cbiAgICBpZiAodGhpcy5fbW9iaWxlKSB7XG4gICAgICB0aGlzLl90aW1lclJlZnJlc2hQZXJpb2QgPSBOZXR3b3JrUmVmcmVzaFRpbWVyUGVyaW9kLk1PQklMRTtcbiAgICAgIHRoaXMuX3RpbWVyUmVmcmVzaENvbmRpdGlvbiA9ICgpID0+IHRoaXMub25saW5lOyAvLyBDaGVjayBvbmx5IHdoZW4gb25saW5lLCBhbmQgc3RvcCB3aGVuIG9mZmxpbmVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdGltZXJSZWZyZXNoUGVyaW9kID0gTmV0d29ya1JlZnJlc2hUaW1lclBlcmlvZC5ERVNLVE9QO1xuICAgICAgdGhpcy5fdGltZXJSZWZyZXNoQ29uZGl0aW9uID0gKCkgPT4gdHJ1ZTsgLy8gQWx3YXlzIGNoZWNrXG4gICAgfVxuXG4gICAgLy8gU2F2ZSBuZXR3b3JrIGluc3RhbmNlIG9ubHkgd2hlbiBjb3Jkb3ZhIGlzIHJ1bm5pbmdcbiAgICBpZiAocGxhdGZvcm0uaXMoJ2NvcmRvdmEnKSkge1xuICAgICAgdGhpcy5fbmV0d29yayA9IG5ldHdvcms7XG4gICAgfVxuXG4gICAgdGhpcy5zdGFydFN1YmplY3Quc3Vic2NyaWJlKChwZWVyKSA9PiB0aGlzLm5nT25BZnRlclN0YXJ0KHBlZXIpKTtcblxuICAgIC8vIEZvciBERVYgb25seVxuICAgIHRoaXMuX2RlYnVnID0gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgdG8gbmV0d29yayBldmVudFxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRUeXBlXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKi9cbiAgb248VCA9IGFueT4oZXZlbnRUeXBlOiBOZXR3b3JrRXZlbnRUeXBlLCBjYWxsYmFjazogKGRhdGE/OiBUKSA9PiBQcm9taXNlPGFueT4pOiBTdWJzY3JpcHRpb24ge1xuICAgIHN3aXRjaCAoZXZlbnRUeXBlKSB7XG4gICAgICBjYXNlICdzdGFydCc6XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0U3ViamVjdC5zdWJzY3JpYmUoKCkgPT4gY2FsbGJhY2soKSk7XG5cbiAgICAgIGNhc2UgJ3BlZXJDaGFuZ2VkJzpcbiAgICAgICAgcmV0dXJuIHRoaXMub25QZWVyQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gY2FsbGJhY2soKSk7XG5cbiAgICAgIGNhc2UgJ3N0YXR1c0NoYW5nZWQnOlxuICAgICAgICByZXR1cm4gdGhpcy5vbk5ldHdvcmtTdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgodHlwZSkgPT4gY2FsbGJhY2sodHlwZSBhcyB1bmtub3duIGFzIFQpKTtcblxuICAgICAgY2FzZSAncmVzZXRDYWNoZSc6XG4gICAgICAgIHJldHVybiB0aGlzLm9uUmVzZXROZXR3b3JrQ2FjaGUuc3Vic2NyaWJlKCgpID0+IGNhbGxiYWNrKCkpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5hZGRMaXN0ZW5lcihldmVudFR5cGUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB0cnlPbmxpbmUob3B0cz86IHtcbiAgICBzaG93T2ZmbGluZVRvYXN0PzogYm9vbGVhbjtcbiAgICBzaG93T25saW5lVG9hc3Q/OiBib29sZWFuO1xuICAgIHNob3dMb2FkaW5nVG9hc3Q/OiBib29sZWFuO1xuICAgIGFmdGVyUmV0cnlEZWxheT86IG51bWJlcjtcbiAgICBhZnRlclJldHJ5UHJvbWlzZT86ICgpID0+IFByb21pc2U8YW55PjtcbiAgfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIElmIG9mZmxpbmUgbW9kZSBub3QgZm9yY2VkLCBhbmQgZGV2aWNlIHNheXMgdGhlcmUgaXMgbm8gY29ubmVjdGlvbjogc2tpcFxuICAgIGlmICghdGhpcy5fZm9yY2VPZmZsaW5lIHx8IHRoaXMuX2RldmljZUNvbm5lY3Rpb25UeXBlID09PSAnbm9uZScpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFNIb3cgbG9hZGluZyB0b2FzdFxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgc2hvd0xvYWRpbmdUb2FzdCA9ICFvcHRzIHx8IG9wdHMuc2hvd0xvYWRpbmdUb2FzdCAhPT0gZmFsc2U7XG4gICAgbGV0IGxvYWRpbmdUb2FzdDogSFRNTElvblRvYXN0RWxlbWVudDtcbiAgICBpZiAoc2hvd0xvYWRpbmdUb2FzdCkge1xuICAgICAgYXdhaXQgdGhpcy5zaG93VG9hc3QoeyBtZXNzYWdlOiAnTkVUV09SSy5JTkZPLlJFVFJZX1RPX0NPTk5FQ1QnLCBkdXJhdGlvbjogMTAwMDAsIG9uV2lsbFByZXNlbnQ6ICh0KSA9PiAobG9hZGluZ1RvYXN0ID0gdCkgfSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW25ldHdvcmtdIENoZWNraW5nIGNvbm5lY3Rpb24gdG8gcG9kLi4uJyk7XG4gICAgICBjb25zdCBzZXR0aW5nczogTG9jYWxTZXR0aW5ncyA9IGF3YWl0IHRoaXMuc2V0dGluZ3MucmVhZHkoKTtcblxuICAgICAgaWYgKCFzZXR0aW5ncy5wZWVyVXJsKSByZXR1cm4gZmFsc2U7IC8vIE5vIHBlZXIgZGVmaW5lLiBTa2lwXG5cbiAgICAgIGNvbnN0IHBlZXIgPSBQZWVyLnBhcnNlVXJsKHNldHRpbmdzLnBlZXJVcmwpO1xuICAgICAgY29uc3QgcGVlckluZm8gPSBhd2FpdCB0aGlzLmNoZWNrUGVlckFsaXZlKHBlZXIpO1xuICAgICAgY29uc3QgcGVlckFsaXZlQW5kQ29tcGF0aWJsZSA9IHBlZXJJbmZvICYmIChhd2FpdCB0aGlzLmNoZWNrUGVlckNvbXBhdGlibGUocGVlckluZm8pKTtcbiAgICAgIGlmIChwZWVyQWxpdmVBbmRDb21wYXRpYmxlKSB7XG4gICAgICAgIC8vIERpc2FibGUgdGhlIG9mZmxpbmUgbW9kZVxuICAgICAgICB0aGlzLnNldEZvcmNlT2ZmbGluZShmYWxzZSk7XG5cbiAgICAgICAgLy8gUmVzdGFydFxuICAgICAgICBhd2FpdCB0aGlzLnJlc3RhcnQocGVlcik7XG5cbiAgICAgICAgLy8gV2FpdCBhIHByb21pc2UsIGJlZm9yZSByZWNoZWNrXG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnYmVmb3JlVHJ5T25saW5lRmluaXNoJywgdGhpcy5vbmxpbmUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcigoZXJyICYmIGVyci5tZXNzYWdlKSB8fCBlcnIpO1xuICAgICAgLy8gQ29udGludWVcbiAgICB9XG5cbiAgICAvLyBDbG9zZSBsb2FkaW5nIHRvYXN0ICh3aXRoIGEgbWluaW1hbCBkaXNwbGF5IGR1cmF0aW9uIG9mIDJzKVxuICAgIGlmIChzaG93TG9hZGluZ1RvYXN0KSB7XG4gICAgICBhd2FpdCBzbGVlcCgyMDAwIC0gKERhdGUubm93KCkgLSBub3cpKTtcbiAgICAgIGlmIChsb2FkaW5nVG9hc3QpIGF3YWl0IGxvYWRpbmdUb2FzdC5kaXNtaXNzKCk7XG4gICAgfVxuXG4gICAgLy8gUmVjaGVjayBuZXR3b3JrIHN0YXR1c1xuICAgIGNvbnN0IG9ubGluZSA9IHRoaXMub25saW5lO1xuXG4gICAgLy8gRGlzcGxheSBhIHRvYXN0IHRvIHVzZXJcbiAgICBpZiAob25saW5lKSB7XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5zaG93T25saW5lVG9hc3QgIT09IGZhbHNlKSB7XG4gICAgICAgIC8vIERpc3BsYXkgdG9hc3QgKHdpdGhvdXQgYXdhaXQsIGJlY2F1c2Ugbm90IG5lZWQgdG8gd2FpdCB0b2FzdCBjbG9zZSBldmVudClcbiAgICAgICAgdGhpcy5zaG93VG9hc3QoeyBtZXNzYWdlOiAnTkVUV09SSy5JTkZPLk9OTElORScsIHR5cGU6ICdpbmZvJyB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdHMgJiYgb3B0cy5zaG93T2ZmbGluZVRvYXN0ID09PSB0cnVlKSB7XG4gICAgICAvLyBEaXNwbGF5IHRvYXN0ICh3aXRob3V0IGF3YWl0LCBiZWNhdXNlIG5vdCBuZWVkIHRvIHdhaXQgdG9hc3QgY2xvc2UgZXZlbnQpXG4gICAgICByZXR1cm4gdGhpcy5zaG93T2ZmbGluZVRvYXN0KHsgc2hvd1JldHJ5QnV0dG9uOiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdGFydGVkICYmIG9ubGluZTtcbiAgfVxuXG4gIGFzeW5jIHNob3dPZmZsaW5lVG9hc3Qob3B0cz86IHtcbiAgICBtZXNzYWdlPzogc3RyaW5nO1xuICAgIHNob3dDbG9zZUJ1dHRvbj86IGJvb2xlYW47XG4gICAgc2hvd1JldHJ5QnV0dG9uPzogYm9vbGVhbjtcbiAgICBzaG93UmV0cnlTdWNjZXNzVG9hc3Q/OiBib29sZWFuO1xuICAgIHNob3dSZXRyeUxvYWRpbmdUb2FzdD86IGJvb2xlYW47XG4gICAgb25SZXRyeVN1Y2Nlc3M/OiAoKSA9PiB2b2lkO1xuICB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMub25saW5lKSByZXR1cm47IC8vIFNraXAgaWYgb25saW5lXG5cbiAgICAvLyBUb2FzdCB3aXRoIGEgcmV0cnkgYnV0dG9uXG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuc2hvd1JldHJ5QnV0dG9uICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgdG9hc3RSZXN1bHQgPSBhd2FpdCB0aGlzLnNob3dUb2FzdCh7XG4gICAgICAgIG1lc3NhZ2U6IChvcHRzICYmIG9wdHMubWVzc2FnZSkgfHwgJ0VSUk9SLk5FVFdPUktfUkVRVUlSRUQnLFxuICAgICAgICB0eXBlOiAnd2FybmluZycsXG4gICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgZHVyYXRpb246IDEwMDAwMCxcbiAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgIC8vIHJlY29ubmVjdCBidXR0b25cbiAgICAgICAgICB7XG4gICAgICAgICAgICByb2xlOiAncmVmcmVzaCcsXG4gICAgICAgICAgICB0ZXh0OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdORVRXT1JLLkJUTl9DSEVDS19BTElWRScpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgLy8gVXNlciBkb24ndCBjbGljayByZWNvbm5lY3Q6IHJldHVyblxuICAgICAgaWYgKCF0b2FzdFJlc3VsdCB8fCB0b2FzdFJlc3VsdC5yb2xlICE9PSAncmVmcmVzaCcpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gaWYgbmV0d29yayBzdGF0ZSBjaGFuZ2VkIHRvIG9ubGluZTogZXhpdCBoZXJlXG4gICAgICBpZiAodGhpcy5vbmxpbmUpIHJldHVybiB0cnVlO1xuXG4gICAgICAvLyBUcnkgdG8gcmVjb25uZWN0XG4gICAgICBjb25zdCBvbmxpbmUgPSBhd2FpdCB0aGlzLnRyeU9ubGluZSh7XG4gICAgICAgIHNob3dPZmZsaW5lVG9hc3Q6IGZhbHNlLFxuICAgICAgICBzaG93T25saW5lVG9hc3Q6IHRvQm9vbGVhbihvcHRzICYmIG9wdHMuc2hvd1JldHJ5U3VjY2Vzc1RvYXN0LCB0cnVlKSxcbiAgICAgICAgc2hvd0xvYWRpbmdUb2FzdDogdG9Cb29sZWFuKG9wdHMgJiYgb3B0cy5zaG93UmV0cnlMb2FkaW5nVG9hc3QsIHRydWUpLFxuICAgICAgfSk7XG4gICAgICBpZiAob25saW5lKSB7XG4gICAgICAgIC8vIENhbGwgc3VjY2VzcyBjYWxsYmFjayAoYXN5bmMpXG4gICAgICAgIGlmIChvcHRzICYmIG9wdHMub25SZXRyeVN1Y2Nlc3MpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KG9wdHMub25SZXRyeVN1Y2Nlc3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBvcHRzID0ge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBzaG93UmV0cnlCdXR0b246IGZhbHNlLFxuICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFNpbXBsZSB0b2FzdCwgd2l0aG91dCAnYXdhaXQnLCBiZWNhdXNlIG5vdCBuZWVkIHRvIHdhaXQgdG9hc3QncyBkaXNtaXNzXG4gICAgdGhpcy5zaG93VG9hc3Qoe1xuICAgICAgbWVzc2FnZTogJ0VSUk9SLk5FVFdPUktfUkVRVUlSRUQnLFxuICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgIC4uLm9wdHMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHBlZXIgaXMgYWxpdmVcbiAgICpcbiAgICogQHBhcmFtIHBlZXJcbiAgICogQHBhcmFtIG9wdHNcbiAgICovXG4gIGFzeW5jIGNoZWNrUGVlckFsaXZlKHBlZXI/OiBzdHJpbmcgfCBQZWVyKTogUHJvbWlzZTxOb2RlSW5mbz4ge1xuICAgIHBlZXIgPSBwZWVyIHx8IHRoaXMucGVlcjtcbiAgICBpZiAoIXBlZXIpIHtcbiAgICAgIGNvbnN0IHNldHRpbmdzOiBMb2NhbFNldHRpbmdzID0gYXdhaXQgdGhpcy5zZXR0aW5ncy5yZWFkeSgpO1xuICAgICAgaWYgKCFzZXR0aW5ncy5wZWVyVXJsKSByZXR1cm4gdW5kZWZpbmVkOyAvLyBObyBwZWVyIGRlZmluZS4gU2tpcFxuICAgICAgcGVlciA9IFBlZXIucGFyc2VVcmwoc2V0dGluZ3MucGVlclVybCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZUluZm8ocGVlciwgeyBub2NhY2hlOiB0cnVlLCB0aW1lb3V0OiB0aGlzLl9jb25uZWN0aW9uVGltZW91dCB9KTtcbiAgfVxuXG4gIGFzeW5jIGNoZWNrUGVlckNvbXBhdGlibGUocGVlckluZm86IE5vZGVJbmZvLCBvcHRzPzogeyBzaG93VG9hc3Q/OiBib29sZWFuIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXBlZXJJbmZvKSByZXR1cm4gZmFsc2U7IC8vIFBlZXIgY2Fubm90IGJlIHJlYWNoZWRcbiAgICBpZiAoIXRoaXMuZW52aXJvbm1lbnQucGVlck1pblZlcnNpb24pIHJldHVybiB0cnVlOyAvLyBTa2lwIGNvbXBhdGliaWxpdHkgY2hlY2tcblxuICAgIC8vIENoZWNrIHRoZSBtaW4gcG9kIHZlcnNpb24sIGRlZmluZWQgYnkgdGhlIGFwcFxuICAgIGNvbnN0IGlzQ29tcGF0aWJsZSA9IHBlZXJJbmZvLnNvZnR3YXJlVmVyc2lvbiAmJiBWZXJzaW9uVXRpbHMuaXNDb21wYXRpYmxlKHRoaXMuZW52aXJvbm1lbnQucGVlck1pblZlcnNpb24sIHBlZXJJbmZvLnNvZnR3YXJlVmVyc2lvbik7XG5cbiAgICAvLyBEaXNwbGF5IHRvYXN0LCBpZiBub3QgY29tcGF0aWJsZVxuICAgIGlmICghaXNDb21wYXRpYmxlICYmICghb3B0cyB8fCBvcHRzLnNob3dUb2FzdCAhPT0gZmFsc2UpKSB7XG4gICAgICBhd2FpdCB0aGlzLnNob3dUb2FzdCh7XG4gICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgIG1lc3NhZ2U6ICdORVRXT1JLLkVSUk9SLk5PVF9DT01QQVRJQkxFX1BFRVInLFxuICAgICAgICBtZXNzYWdlUGFyYW1zOiB7XG4gICAgICAgICAgdmVyc2lvbjogdGhpcy5lbnZpcm9ubWVudC5wZWVyTWluVmVyc2lvbixcbiAgICAgICAgfSxcbiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBpc0NvbXBhdGlibGU7XG4gIH1cblxuICBhc3luYyBnZXROb2RlSW5mbyhwZWVyPzogc3RyaW5nIHwgUGVlciwgb3B0cz86IHsgbm9jYWNoZT86IGJvb2xlYW47IHRpbWVvdXQ/OiBudW1iZXIgfSk6IFByb21pc2U8Tm9kZUluZm8+IHtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5jb21wdXRlUGVlclBhdGgocGVlciwgJy9hcGkvbm9kZS9pbmZvJyk7XG4gICAgdGhpcy5fbG9nZ2VyPy5kZWJ1ZygnZ2V0Tm9kZUluZm8nLCBgR2V0dGluZyAnJHtwYXRofScgLi4uYCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YTogTm9kZUluZm8gPSBhd2FpdCB0aGlzLmdldChwYXRoLCBvcHRzKTtcbiAgICAgIHRoaXMuX2xvZ2dlcj8uZGVidWcoJ2dldE5vZGVJbmZvJywgYFJlc3BvbnNlIG9mICcke3BhdGh9JzpcXG4ke0pTT04uc3RyaW5naWZ5KGRhdGEpfWApO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKGBbbmV0d29ya10gRXJyb3Igd2hpbGUgZ2V0dGluZyAnJHtwYXRofSc6ICR7KGVyciAmJiBlcnIubWVzc2FnZSkgfHwgZXJyfWAsIGVycik7XG4gICAgICB0aGlzLl9sb2dnZXI/LmVycm9yKCdnZXROb2RlSW5mbycsIGBFcnJvciB3aGlsZSBnZXR0aW5nICcke3BhdGh9JzogJHtlcnI/Lm1lc3NhZ2UgfHwgJyd9YCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldEFwcE1hbmlmZXN0KHBlZXI/OiBzdHJpbmcgfCBQZWVyLCBvcHRzPzogeyBub2NhY2hlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxBcHBNYW5pZmVzdCB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgcGF0aCA9IHRoaXMuY29tcHV0ZVBlZXJQYXRoKHBlZXIsICdtYW5pZmVzdC5qc29uJyk7XG4gICAgICBpZiAob3B0cz8ubm9jYWNoZSkge1xuICAgICAgICBwYXRoICs9ICc/dD0nICsgRGF0ZS5ub3coKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldChwYXRoLCBvcHRzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICh0aGlzLmVudmlyb25tZW50LnByb2R1Y3Rpb24pXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbbmV0d29ya10gQ2Fubm90IGxvYWQgZmlsZSAnbWFuaWZlc3QuanNvbicuIFBsZWFzZSBtYWtlIHN1cmUgd2Vic2VydmVyIGNvbmZpZyBhbGxvdyBDT1JTIGFjY2Vzc1wiLCBlcnIpO1xuICAgICAgZWxzZSBjb25zb2xlLmVycm9yKFwiW25ldHdvcmtdIENhbm5vdCBsb2FkIGZpbGUgJ21hbmlmZXN0Lmpzb24nLlwiLCBlcnIpO1xuICAgICAgLy8gQ29udGludWVcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRBcHBWZXJzaW9uKHBlZXI/OiBzdHJpbmcgfCBQZWVyLCBvcHRzID0geyBub2NhY2hlOiB0cnVlIH0pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgcGF0aCA9IHRoaXMuY29tcHV0ZVBlZXJQYXRoKHBlZXIsICd2ZXJzaW9uLmFwcHVwJyk7XG4gICAgICBpZiAob3B0cy5ub2NhY2hlKSB7XG4gICAgICAgIHBhdGggKz0gJz90PScgKyBEYXRlLm5vdygpO1xuICAgICAgfVxuICAgICAgY29uc3QgYXBwVmVyc2lvbjogc3RyaW5nID0gYXdhaXQgdGhpcy5nZXRUZXh0KHBhdGgsIG9wdHMpO1xuICAgICAgaWYgKGlzTm90TmlsT3JCbGFuayhhcHBWZXJzaW9uKSkgcmV0dXJuIGFwcFZlcnNpb247XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAodGhpcy5lbnZpcm9ubWVudC5wcm9kdWN0aW9uKVxuICAgICAgICBjb25zb2xlLmVycm9yKFwiW25ldHdvcmtdIENhbm5vdCBsb2FkIGZpbGUgJ3ZlcnNpb24uYXBwdXAnLiBQbGVhc2UgbWFrZSBzdXJlIHdlYnNlcnZlciBjb25maWcgYWxsb3cgQ09SUyBhY2Nlc3NcIik7XG4gICAgICBlbHNlIGNvbnNvbGUuZXJyb3IoXCJbbmV0d29ya10gQ2Fubm90IGxvYWQgZmlsZSAndmVyc2lvbi5hcHB1cCcuXCIsIGVycik7XG4gICAgICAvLyBDb250aW51ZVxuICAgIH1cblxuICAgIC8vIFRyeSBsb2FkaW5nIG1hbmlmZXN0Lmpzb25cbiAgICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IHRoaXMuZ2V0QXBwTWFuaWZlc3QocGVlciwgb3B0cyk7XG4gICAgcmV0dXJuIG1hbmlmZXN0Py52ZXJzaW9uO1xuICB9XG5cbiAgY29tcHV0ZVBlZXJQYXRoKHBlZXI6IHN0cmluZyB8IFBlZXIgfCB1bmRlZmluZWQsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcGVlciA9IHBlZXIgfHwgdGhpcy5wZWVyO1xuICAgIGlmICghcGVlcikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGxldCBwZWVyVXJsID0gcGVlciBpbnN0YW5jZW9mIFBlZXIgPyBwZWVyLnVybCA6IChwZWVyIGFzIHN0cmluZyk7XG5cbiAgICAvLyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hcbiAgICBpZiAocGVlclVybC5lbmRzV2l0aCgnLycpKSB7XG4gICAgICBwZWVyVXJsID0gcGVlclVybC5zdWJzdHIoMCwgcGVlclVybC5sZW5ndGggLSAxKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZmlyc3QgcGF0aFxuICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgIHBhdGggPSAnLycgKyBwYXRoO1xuICAgIH1cblxuICAgIC8vIENvbmNhdCBwZWVyIFVSTCBhbmQgcGF0aFxuICAgIHJldHVybiBwZWVyVXJsICsgcGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyB0byBmb3JjZSBvZmZsaW5lIG1vZGVcbiAgICovXG4gIHNldEZvcmNlT2ZmbGluZShcbiAgICB2YWx1ZT86IGJvb2xlYW4sXG4gICAgb3B0cz86IHtcbiAgICAgIHNob3dUb2FzdD86IGJvb2xlYW47IC8vIERpc3BsYXkgYSB0b2FzdCwgd2hlbiBvZmZsaW5lID9cbiAgICB9XG4gICkge1xuICAgIHZhbHVlID0gdG9Cb29sZWFuKHZhbHVlLCB0cnVlKTtcbiAgICBpZiAodGhpcy5fZm9yY2VPZmZsaW5lICE9PSB2YWx1ZSkge1xuICAgICAgY29uc3QgcHJldmlvdXNDb25uZWN0aW9uVHlwZSA9IHRoaXMuY29ubmVjdGlvblR5cGU7XG4gICAgICB0aGlzLl9mb3JjZU9mZmxpbmUgPSB2YWx1ZTtcbiAgICAgIGNvbnN0IGN1cnJlbnRDb25uZWN0aW9uVHlwZSA9IHRoaXMuY29ubmVjdGlvblR5cGU7XG5cbiAgICAgIGlmIChwcmV2aW91c0Nvbm5lY3Rpb25UeXBlICE9PSBjdXJyZW50Q29ubmVjdGlvblR5cGUpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBbbmV0d29ya10gQ29ubmVjdGlvbiBjaGFuZ2VkIHRvIHske2N1cnJlbnRDb25uZWN0aW9uVHlwZX19YCk7XG4gICAgICAgIHRoaXMub25OZXR3b3JrU3RhdHVzQ2hhbmdlcy5uZXh0KGN1cnJlbnRDb25uZWN0aW9uVHlwZSk7XG5cbiAgICAgICAgLy8gT2ZmbGluZSBtb2RlOiBhbGVydCB0aGUgdXNlclxuICAgICAgICBpZiAoY3VycmVudENvbm5lY3Rpb25UeXBlID09PSAnbm9uZScgJiYgKCFvcHRzIHx8IG9wdHMuc2hvd1RvYXN0ICE9PSBmYWxzZSkpIHtcbiAgICAgICAgICB0aGlzLnNob3dUb2FzdCh7IG1lc3NhZ2U6ICdORVRXT1JLLklORk8uT0ZGTElORV9IRUxQJywgdHlwZTogJ3dhcm5pbmcnIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2hvd1NlbGVjdFBlZXJNb2RhbChvcHRzPzogUGFydGlhbDxJU2VsZWN0UGVlck1vZGFsT3B0aW9ucz4pOiBQcm9taXNlPFBlZXIgfCB1bmRlZmluZWQ+IHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICAgIGNvbnN0IHBlZXJzID0gYXdhaXQgdGhpcy5nZXREZWZhdWx0UGVlcnMoKTtcbiAgICBjb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMubW9kYWxDdHJsLmNyZWF0ZSh7XG4gICAgICBjb21wb25lbnQ6IFNlbGVjdFBlZXJNb2RhbCxcbiAgICAgIGNvbXBvbmVudFByb3BzOiA8SVNlbGVjdFBlZXJNb2RhbE9wdGlvbnM+e1xuICAgICAgICBkZWZhdWx0UGVlcnM6IHBlZXJzLFxuICAgICAgICAuLi5vcHRzLFxuICAgICAgfSxcbiAgICAgIGtleWJvYXJkQ2xvc2U6IHRydWUsXG4gICAgICBzaG93QmFja2Ryb3A6IHRydWUsXG4gICAgfSk7XG4gICAgYXdhaXQgbW9kYWwucHJlc2VudCgpO1xuXG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBtb2RhbC5vbldpbGxEaXNtaXNzKCk7XG5cbiAgICByZXR1cm4gKGRhdGEgJiYgKGRhdGEgYXMgUGVlcikpIHx8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGFzeW5jIGNsZWFyQ2FjaGUob3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm93ID0gdGhpcy5fZGVidWcgJiYgRGF0ZS5ub3coKTtcblxuICAgIGNvbnNvbGUuaW5mbygnW25ldHdvcmtdIENsZWFyaW5nIGFsbCBjYWNoZXMuLi4nKTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZVxuICAgICAgLmNsZWFyQWxsKClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gRW1pdCBldmVudFxuICAgICAgICBpZiAoKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkgJiYgdGhpcy5vblJlc2V0TmV0d29ya0NhY2hlLm9ic2VydmVkKSB7XG4gICAgICAgICAgdGhpcy5vblJlc2V0TmV0d29ya0NhY2hlLmVtaXQoKTtcblxuICAgICAgICAgIC8vIFdhaXQgb2JzZXJ2ZXJzIGNsZWFuIHRoZWlyIGNhY2hlcywgaWYgbmVlZFxuICAgICAgICAgIHJldHVybiBzbGVlcCg1MDApO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFtuZXR3b3JrXSBBbGwgY2FjaGUgY2xlYXJlZCwgaW4gJHtEYXRlLm5vdygpIC0gbm93fW1zYCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBmdW5jdGlvbnMgLS0gKi9cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmdPblN0YXJ0KHBlZXI/OiBQZWVyKTogUHJvbWlzZTxQZWVyPiB7XG4gICAgY29uc29sZS5pbmZvKCdbbmV0d29ya10gU3RhcnRpbmcgbmV0d29yay4uLicpO1xuXG4gICAgLy8gUmVzdG9yaW5nIGxvY2FsIHNldHRpbmdzXG4gICAgcGVlciA9IHBlZXIgfHwgKGF3YWl0IHRoaXMucmVzdG9yZUxvY2FsbHkoKSk7XG5cbiAgICBpZiAoIXBlZXIpIHtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0byBoaWRlIHRoZSBzcGxhc2hzY3JlZW4sIGJlZm9yZSBvcGVuIHRoZSBtb2RhbFxuICAgICAgYXdhaXQgU3BsYXNoU2NyZWVuLmhpZGUoKTtcblxuICAgICAgLy8gTm8gcGVlciBpbiBzZXR0aW5nczogYXNrIHVzZXIgdG8gY2hvb3NlXG4gICAgICB3aGlsZSAoIXBlZXIpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW25ldHdvcmtdIE5vIHBlZXIgZGVmaW5lZC4gQXNraW5nIHVzZXIgdG8gY2hvb3NlIGEgcGVlci4nKTtcbiAgICAgICAgcGVlciA9IGF3YWl0IHRoaXMuc2hvd1NlbGVjdFBlZXJNb2RhbCh7IGFsbG93U2VsZWN0RG93blBlZXI6IGZhbHNlLCB0aXRsZTogJ05FVFdPUksuUEVFUi5TRUxFQ1RfTU9EQUwuVElUTEVfU1RBUlQnLCBjYW5DYW5jZWw6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5vbmxpbmUpIHtcbiAgICAgIC8vIENoZWNrIGlmIGFsaXZlLiBJZiBub3QsIGZvcmNlIG9mZmxpbmUgbW9kZVxuICAgICAgY29uc3QgYWxpdmUgPSBhd2FpdCB0aGlzLmNoZWNrUGVlckFsaXZlKHBlZXIpO1xuICAgICAgaWYgKCFhbGl2ZSkge1xuICAgICAgICAvLyBQZWVyIG5vdCBhbGl2ZSwgYnV0IHNob3VsZCBiZSBhdCB0aGUgc2FtZSBVUkwsIHJldHJ5aW5nIGVhY2ggMXNcbiAgICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuc2FtZVVybFBlZXIpIHtcbiAgICAgICAgICBjb25zdCByZXRyeU1zID0gdGhpcy5fY29ubmVjdGlvblRpbWVvdXQgPiAwID8gdGhpcy5fY29ubmVjdGlvblRpbWVvdXQgOiAxMDAwO1xuICAgICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICAgICAgdGltZXIocmV0cnlNcywgcmV0cnlNcykucGlwZShcbiAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuc3RvcFN1YmplY3QpLFxuICAgICAgICAgICAgICB0YXAoKCkgPT4gY29uc29sZS53YXJuKGBbbmV0d29yay1zZXJ2aWNlXSBXYWl0aW5nIHBlZXIgYmUgYmUgYWxpdmUsIGF0IHske3BlZXIudXJsfX0gLi4uYCkpLFxuICAgICAgICAgICAgICBtZXJnZU1hcCgoKSA9PiB0aGlzLmNoZWNrUGVlckFsaXZlKHBlZXIpKSxcbiAgICAgICAgICAgICAgZmlsdGVyKChhbGl2ZSkgPT4gISFhbGl2ZSksXG4gICAgICAgICAgICAgIGZpcnN0KClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENvbnRpbnVlLCBpbiBvZmZsaW5lIG1vZGVcbiAgICAgICAgICB0aGlzLnNldEZvcmNlT2ZmbGluZSh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgW25ldHdvcmtdIFN0YXJ0aW5nIHNlcnZpY2UgW09LXSB7cGVlcjogJyR7cGVlci51cmx9Jywgb25saW5lOiAke3RoaXMub25saW5lfX1gKTtcblxuICAgIHJldHVybiBwZWVyO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG5nT25BZnRlclN0YXJ0KHBlZXI6IFBlZXIpIHtcbiAgICAvLyBXYWl0IHNldHRpbmdzIHN0YXJ0cywgdGhlbiBzYXZlIHBlZXIgaW4gc2V0dGluZ3NcbiAgICBhd2FpdCB0aGlzLnNldHRpbmdzLmFwcGx5KHsgcGVlclVybDogcGVlci51cmwgfSk7XG5cbiAgICB0aGlzLm9uRGV2aWNlQ29ubmVjdGlvbkNoYW5nZWQodGhpcy5fbmV0d29yaz8udHlwZSB8fCAndW5rbm93bicpO1xuXG4gICAgLy8gU3RhcnQgdGhlIHJlZnJlc2ggdGltZXJcbiAgICB0aGlzLnN0YXJ0UmVmcmVzaFRpbWVyKCk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGRldmljZSBuZXR3b3JrIGNoYW5nZXNcbiAgICBpZiAodGhpcy5fbmV0d29yaykge1xuICAgICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbih0aGlzLl9uZXR3b3JrLm9uRGlzY29ubmVjdCgpLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uRGV2aWNlQ29ubmVjdGlvbkNoYW5nZWQoJ25vbmUnKSkpO1xuICAgICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbih0aGlzLl9uZXR3b3JrLm9uQ29ubmVjdCgpLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uRGV2aWNlQ29ubmVjdGlvbkNoYW5nZWQodGhpcy5fbmV0d29yay50eXBlKSkpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBuZ09uU3RvcCgpIHtcbiAgICAvLyBTdG9wIHRpbWVyLCBpZiBjYW5ub3QgcmVmcmVzaCBhbnltb3JlXG4gICAgaWYgKHRoaXMuX3RpbWVyUmVmcmVzaENvbmRpdGlvbigpID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5zdG9wUmVmcmVzaFRpbWVyKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byByZXN0b3JlIHBlZXIgZnJvbSB0aGUgbG9jYWwgc3RvcmFnZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlc3RvcmVMb2NhbGx5KCk6IFByb21pc2U8UGVlciB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIEZvcmNlIHVzZSBwcmVkZWZpbmVkIHBlZXIgaWYgcHJvdmlkZWRcbiAgICBpZiAodGhpcy5lbnZpcm9ubWVudC5wZWVyKSB7XG4gICAgICByZXR1cm4gUGVlci5mcm9tT2JqZWN0KHRoaXMuZW52aXJvbm1lbnQucGVlcik7XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBmcm9tIHN0b3JhZ2VcbiAgICBsZXQgc2V0dGluZ3MgPSBhd2FpdCB0aGlzLnN0b3JhZ2UuZ2V0KFNFVFRJTkdTX1NUT1JBR0VfS0VZKTtcbiAgICBzZXR0aW5ncyA9IHR5cGVvZiBzZXR0aW5ncyA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHNldHRpbmdzKSA6IHNldHRpbmdzO1xuICAgIGlmIChzZXR0aW5ncyAmJiBzZXR0aW5ncy5wZWVyVXJsKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKGBbbmV0d29ya10gVXNlIHBlZXIgeyR7c2V0dGluZ3MucGVlclVybH19IChmb3VuZCBpbiB0aGUgbG9jYWwgc3RvcmFnZSlgKTtcbiAgICAgIHJldHVybiBQZWVyLnBhcnNlVXJsKHNldHRpbmdzLnBlZXJVcmwpO1xuICAgIH1cblxuICAgIC8vIEVsc2UsIHVzZSBkZWZhdWx0IHBlZXIgaW4gZW52LCBpZiBleGlzdHNcbiAgICBpZiAodGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0UGVlcikge1xuICAgICAgcmV0dXJuIFBlZXIuZnJvbU9iamVjdCh0aGlzLmVudmlyb25tZW50LmRlZmF1bHRQZWVyKTtcbiAgICB9XG5cbiAgICAvLyBFbHNlLCBpZiBBcHAgaXMgaG9zdGVkLCB0cnkgdGhlIHdlYnNpdGUgYXMgYSBwZWVyXG4gICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLl9kb2N1bWVudD8ubG9jYXRpb247XG4gICAgaWYgKGxvY2F0aW9uPy5wcm90b2NvbD8uc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgICBjb25zdCBob3N0bmFtZSA9IHRoaXMuX2RvY3VtZW50LmxvY2F0aW9uLmhvc3Q7XG4gICAgICBjb25zdCBkZXRlY3RlZFBlZXIgPSBQZWVyLnBhcnNlVXJsKGAke3RoaXMuX2RvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sfSR7aG9zdG5hbWV9JHt0aGlzLmVudmlyb25tZW50LmJhc2VVcmx9YCk7XG5cbiAgICAgIGlmICh0aGlzLmVudmlyb25tZW50LnNhbWVVcmxQZWVyIHx8IChhd2FpdCB0aGlzLmNoZWNrUGVlckFsaXZlKGRldGVjdGVkUGVlcikpKSB7XG4gICAgICAgIHJldHVybiBkZXRlY3RlZFBlZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHRvIG5ldHdvcmsgc3RhdGVcbiAgICpcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHN0b3BSZWZyZXNoVGltZXIoKSB7XG4gICAgaWYgKHRoaXMuX3RpbWVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl90aW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5fdGltZXJTdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggdGhlIG5ldHdvcmsgc3RhdGVcbiAgICpcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXJ0UmVmcmVzaFRpbWVyKCkge1xuICAgIGlmICh0aGlzLl90aW1lclN1YnNjcmlwdGlvbikgcmV0dXJuOyAvLyBBbHJlYWR5IHJ1bm5pbmc6IHNraXBcblxuICAgIGNvbnNvbGUuaW5mbyhgW25ldHdvcmtdIFN0YXJ0aW5nIHJlZnJlc2ggdGltZXIsIGV2ZXJ5ICR7dGhpcy5fdGltZXJSZWZyZXNoUGVyaW9kfW1zLi4uYCk7XG5cbiAgICBsZXQgbGFzdEluZm86IE5vZGVJbmZvO1xuICAgIHRoaXMuX3RpbWVyU3Vic2NyaXB0aW9uID0gdGltZXIodGhpcy5fdGltZXJSZWZyZXNoUGVyaW9kLCB0aGlzLl90aW1lclJlZnJlc2hQZXJpb2QpXG4gICAgICAucGlwZShcbiAgICAgICAgLy8gU2tpcCBzb21lIHRpbWVyIGV2ZW50IChzZWUgY29uc3RydWN0b3IpXG4gICAgICAgIGZpbHRlcih0aGlzLl90aW1lclJlZnJlc2hDb25kaXRpb24pLFxuXG4gICAgICAgIC8vIENoZWNraW4gaWYgcGVlciBhbGl2ZVxuICAgICAgICB0YXAoKCkgPT4gY29uc29sZS5kZWJ1ZygnW25ldHdvcmtdIENoZWNraW5nIGNvbm5lY3Rpb24gdG8gcG9kLi4uJykpLFxuICAgICAgICBtZXJnZU1hcCgoKSA9PiB0aGlzLmNoZWNrUGVlckFsaXZlKHRoaXMucGVlcikpLFxuXG4gICAgICAgIC8vIEZpbHRlciB0byBrZWVwIG9ubHkgY2hhbmdlc1xuICAgICAgICBmaWx0ZXIoKGluZm8pID0+ICFlcXVhbHMoaW5mbywgbGFzdEluZm8pKSxcbiAgICAgICAgdGFwKChpbmZvKSA9PiAobGFzdEluZm8gPSBpbmZvKSksXG5cbiAgICAgICAgLy8gQ2hlY2sgY29tcGF0aWJpbGl0eVxuICAgICAgICBtZXJnZU1hcCgoaW5mbykgPT4gdGhpcy5jaGVja1BlZXJDb21wYXRpYmxlKGluZm8sIHsgc2hvd1RvYXN0OiB0cnVlIH0pKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoYWxpdmUpID0+IHtcbiAgICAgICAgaWYgKGFsaXZlICYmIHRoaXMub2ZmbGluZSkge1xuICAgICAgICAgIHRoaXMuc2V0Rm9yY2VPZmZsaW5lKGZhbHNlKTtcblxuICAgICAgICAgIC8vIFJlc3RhcnQgdGhlIHNlcnZpY2UgKHRvIGZvcmNlIHJlIGF1dGgpXG4gICAgICAgICAgdGhpcy5yZXN0YXJ0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWFsaXZlICYmIHRoaXMub25saW5lKSB7XG4gICAgICAgICAgdGhpcy5zZXRGb3JjZU9mZmxpbmUodHJ1ZSk7XG5cbiAgICAgICAgICAvLyBTdG9wIHRoZSBzZXJ2aWNlXG4gICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy5fdGltZXJTdWJzY3JpcHRpb24uYWRkKCgpID0+IGNvbnNvbGUuZGVidWcoJ1tuZXR3b3JrXSBSZWZyZXNoIHRpbWVyIHN0b3BwZWQnKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0VGV4dChcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgb3B0cz86IHtcbiAgICAgIGhlYWRlcnM/OlxuICAgICAgICB8IEh0dHBIZWFkZXJzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgICAgICAgfTtcbiAgICAgIHJlc3BvbnNlVHlwZT86ICd0ZXh0JztcbiAgICAgIG5vY2FjaGU/OiBib29sZWFuO1xuICAgIH1cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gSHR0cFV0aWxzLmdldFRleHQodGhpcy5odHRwLCB0aGlzLmdldFVyaShwYXRoKSwgb3B0cyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0PFQ+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBvcHRzPzoge1xuICAgICAgaGVhZGVycz86XG4gICAgICAgIHwgSHR0cEhlYWRlcnNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICAgICAgICB9O1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgICAgbm9jYWNoZT86IGJvb2xlYW47XG4gICAgICB0aW1lb3V0PzogbnVtYmVyO1xuICAgIH1cbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIEh0dHBVdGlscy5nZXRKc29uPFQ+KHRoaXMuaHR0cCwgdGhpcy5nZXRVcmkocGF0aCksIG9wdHMpO1xuICB9XG5cbiAgLyogLS0gUHJvdGVjdGVkIG1ldGhvZHMgLS0gKi9cblxuICBwcm90ZWN0ZWQgZ2V0VXJpKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHVyaSA9IHBhdGg7XG5cbiAgICAvLyBJZiBwYXRoIGlzIG5vdCBhbiBVUkk6IHByZXBlbmQgd2l0aCBwZWVyIFVSTFxuICAgIGlmICghdXJpLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSAmJiAhdXJpLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICAgIGxldCBwZWVyVXJsID0gdGhpcy5wZWVyICYmIHRoaXMucGVlci51cmw7XG5cbiAgICAgIC8vIFJlbW92ZSB0cmFpbGluZyBzbGFzaFxuICAgICAgaWYgKHBlZXJVcmwuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICBwZWVyVXJsID0gcGVlclVybC5zdWJzdHIoMCwgcGVlclVybC5sZW5ndGggLSAxKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGZpcnN0IHBhdGhcbiAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgcGF0aCA9ICcvJyArIHBhdGg7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgVVJJOiBjb25jYXQgcGVlciBVUkwgYW5kIHBhdGhcbiAgICAgIHVyaSA9IHBlZXJVcmwgKyBwYXRoO1xuICAgIH1cbiAgICByZXR1cm4gdXJpO1xuICB9XG4gIHByb3RlY3RlZCBvbkRldmljZUNvbm5lY3Rpb25DaGFuZ2VkKGNvbm5lY3Rpb25UeXBlPzogc3RyaW5nKSB7XG4gICAgY29ubmVjdGlvblR5cGUgPSBnZXRDb25uZWN0aW9uVHlwZShjb25uZWN0aW9uVHlwZSk7XG4gICAgaWYgKGNvbm5lY3Rpb25UeXBlICE9PSB0aGlzLl9kZXZpY2VDb25uZWN0aW9uVHlwZSkge1xuICAgICAgdGhpcy5fZGV2aWNlQ29ubmVjdGlvblR5cGUgPSBjb25uZWN0aW9uVHlwZSBhcyBDb25uZWN0aW9uVHlwZTtcblxuICAgICAgLy8gSWYgTk9UICBhbHJlYWR5IGZvcmNlZCBhcyBvZmZsaW5lLCBlbWl0IGV2ZW50XG4gICAgICBpZiAoIXRoaXMuX2ZvcmNlT2ZmbGluZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFtuZXR3b3JrXSBDb25uZWN0aW9uIGNoYW5nZWQgdG8geyR7dGhpcy5fZGV2aWNlQ29ubmVjdGlvblR5cGV9fWApO1xuICAgICAgICB0aGlzLm9uTmV0d29ya1N0YXR1c0NoYW5nZXMubmV4dCh0aGlzLl9kZXZpY2VDb25uZWN0aW9uVHlwZSk7XG5cbiAgICAgICAgLy8gQ2hhbmdlIHRvIG9mZmxpbmVcbiAgICAgICAgaWYgKHRoaXMuX2RldmljZUNvbm5lY3Rpb25UeXBlID09PSAnbm9uZScpIHtcbiAgICAgICAgICBpZiAodGhpcy5fbW9iaWxlKSB7XG4gICAgICAgICAgICAvLyBGb3JjZSBvZmZsaW5lIG1vZGVcbiAgICAgICAgICAgIHRoaXMuX2ZvcmNlT2ZmbGluZSA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIEFsZXJ0IHRoZSB1c2VyXG4gICAgICAgICAgICB0aGlzLnNob3dUb2FzdCh7IG1lc3NhZ2U6ICdORVRXT1JLLklORk8uT0ZGTElORV9IRUxQJywgdHlwZTogJ3dhcm5pbmcnIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBbGVydCB0aGUgdXNlclxuICAgICAgICAgICAgdGhpcy5zaG93VG9hc3QoeyBtZXNzYWdlOiAnTkVUV09SSy5JTkZPLk9GRkxJTkUnLCB0eXBlOiAnd2FybmluZycgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU3RvcCB0aGUgbmV0d29yayBzZXJ2aWNlXG4gICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRlZmF1bHQgcGVlcnMsIGZyb20gZW52aXJvbm1lbnRcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBnZXREZWZhdWx0UGVlcnMoKTogUHJvbWlzZTxQZWVyW10+IHtcbiAgICBjb25zdCBwZWVycyA9ICh0aGlzLmVudmlyb25tZW50LmRlZmF1bHRQZWVycyB8fCBbXSkubWFwKFBlZXIuZnJvbU9iamVjdCk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwZWVycyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd1RvYXN0PFQgPSBhbnk+KG9wdHM6IFNob3dUb2FzdE9wdGlvbnMpOiBQcm9taXNlPE92ZXJsYXlFdmVudERldGFpbDxUPj4ge1xuICAgIHJldHVybiBUb2FzdHMuc2hvdyh0aGlzLnRvYXN0Q29udHJvbGxlciwgdGhpcy50cmFuc2xhdGUsIG9wdHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZExpc3RlbmVyPFQgPSBhbnk+KG5hbWU6IE5ldHdvcmtFdmVudFR5cGUsIGNhbGxiYWNrOiAoZGF0YT86IFQpID0+IFByb21pc2U8dm9pZD4pOiBTdWJzY3JpcHRpb24ge1xuICAgIHRoaXMuX2xpc3RlbmVyc1tuYW1lXSA9IHRoaXMuX2xpc3RlbmVyc1tuYW1lXSB8fCBbXTtcbiAgICB0aGlzLl9saXN0ZW5lcnNbbmFtZV0ucHVzaChjYWxsYmFjayk7XG5cbiAgICAvLyBXaGVuIHVuc3Vic2NyaWJlLCByZW1vdmUgZnJvbSB0aGUgbGlzdGVuZXJcbiAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbigoKSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2xpc3RlbmVyc1tuYW1lXS5pbmRleE9mKGNhbGxiYWNrKTtcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzW25hbWVdLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZW1pdDxUID0gYW55PihuYW1lOiBOZXR3b3JrRXZlbnRUeXBlLCBkYXRhPzogVCkge1xuICAgIGNvbnN0IGhvb2tzID0gdGhpcy5fbGlzdGVuZXJzW25hbWVdO1xuICAgIGlmIChpc05vdEVtcHR5QXJyYXkoaG9va3MpKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFtuZXR3b3JrLXNlcnZpY2VdIFRyaWdnZXIgJHtuYW1lfSBob29rOiBFeGVjdXRpbmcgJHtob29rcy5sZW5ndGh9IGNhbGxiYWNrcy4uLmApO1xuXG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICAgIGhvb2tzLm1hcCgoY2FsbGJhY2spID0+IHtcbiAgICAgICAgICBjb25zdCBwcm9taXNlID0gY2FsbGJhY2soZGF0YSk7XG4gICAgICAgICAgaWYgKCFwcm9taXNlKSByZXR1cm47XG4gICAgICAgICAgcmV0dXJuIHByb21pc2UuY2F0Y2goKGVycikgPT4gY29uc29sZS5lcnJvcignRXJyb3Igd2hpbGUgZXhlY3V0aW5nIGhvb2sgJyArIG5hbWUsIGVycikpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
627
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL3NlcnZpY2VzL25ldHdvcmsuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUcxQyxPQUFPLEVBQTJCLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUUsT0FBTyxFQUF3QixvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV4RCxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXBHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzQyxPQUFPLEVBQW9CLE1BQU0sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3BHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSwwQkFBMEIsRUFB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QUFDLE1BQU0sZUFBZSxDQUFDLENBQUM7WUFFL0YsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUNoQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ3JCLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLE9BQU87b0JBQUUsT0FBTztnQkFDckIsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLDZCQUE2QixHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzFGLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQzt3R0E5ckJVLGNBQWMsa0JBc0RmLFFBQVEscUxBT1IsV0FBVyxhQUNDLG1CQUFtQjs0R0E5RDlCLGNBQWMsY0FERCxNQUFNOzs0RkFDbkIsY0FBYztrQkFEMUIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQXVEN0IsTUFBTTsyQkFBQyxRQUFROzswQkFPZixNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQ3RDLFFBQVE7OzBCQUNSLFFBQVE7OzBCQUNSLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFN0b3JhZ2UgfSBmcm9tICdAaW9uaWMvc3RvcmFnZS1hbmd1bGFyJztcbmltcG9ydCB7IFBlZXIgfSBmcm9tICcuL21vZGVsL3BlZXIubW9kZWwnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5ncyB9IGZyb20gJy4vbW9kZWwvc2V0dGluZ3MubW9kZWwnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyLCBQbGF0Zm9ybSwgVG9hc3RDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgSVNlbGVjdFBlZXJNb2RhbE9wdGlvbnMsIFNlbGVjdFBlZXJNb2RhbCB9IGZyb20gJy4uL3BlZXIvc2VsZWN0LXBlZXIubW9kYWwnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmaXJzdFZhbHVlRnJvbSwgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5nc1NlcnZpY2UsIFNFVFRJTkdTX1NUT1JBR0VfS0VZIH0gZnJvbSAnLi9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IFNwbGFzaFNjcmVlbiB9IGZyb20gJ0BjYXBhY2l0b3Ivc3BsYXNoLXNjcmVlbic7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IGVxdWFscywgaXNOb3RFbXB0eUFycmF5LCBpc05vdE5pbE9yQmxhbmssIHNsZWVwLCB0b0Jvb2xlYW4gfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IE5ldHdvcmsgfSBmcm9tICdAYXdlc29tZS1jb3Jkb3ZhLXBsdWdpbnMvbmV0d29yay9uZ3gnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2FjaGVTZXJ2aWNlIH0gZnJvbSAnaW9uaWMtY2FjaGUnO1xuaW1wb3J0IHsgU2hvd1RvYXN0T3B0aW9ucywgVG9hc3RzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3RvYXN0L3RvYXN0cyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBmaXJzdCwgbWFwLCBtZXJnZU1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBPdmVybGF5RXZlbnREZXRhaWwgfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQgeyBBcHBNYW5pZmVzdCwgTm9kZUluZm8gfSBmcm9tICcuL25ldHdvcmsudXRpbHMnO1xuaW1wb3J0IHsgSHR0cFV0aWxzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2h0dHAvaHR0cC51dGlscyc7XG5pbXBvcnQgeyBWZXJzaW9uVXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvdmVyc2lvbi92ZXJzaW9ucyc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgRU5WSVJPTk1FTlQgfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHsgU3RhcnRhYmxlT2JzZXJ2YWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvc3RhcnRhYmxlLW9ic2VydmFibGUtc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBDb25uZWN0aW9uVHlwZSwgZ2V0Q29ubmVjdGlvblR5cGUsIE5ldHdvcmtFdmVudFR5cGUgfSBmcm9tICcuL25ldHdvcmsudHlwZXMnO1xuaW1wb3J0IHsgQVBQX0xPR0dJTkdfU0VSVklDRSB9IGZyb20gJy4uLy4uL3NoYXJlZC9sb2dnaW5nL2xvZ2dpbmctc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBJTG9nZ2VyLCBJTG9nZ2luZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvbG9nZ2luZy9sb2dnZXIubW9kZWwnO1xuXG5jb25zdCBOZXR3b3JrUmVmcmVzaFRpbWVyUGVyaW9kID0ge1xuICBNT0JJTEU6IDEwMDAgKiA2MCAqIDEwIC8qIGV2ZXJ5IDEwIG1pbiAqLyxcbiAgREVTS1RPUDogMTAwMCAqIDYwICogNSAvKiBldmVyeSA1IG1pbiAqLyxcbn07XG5cbmV4cG9ydCBjb25zdCBQRUVSX1VSTF9SRUdFWFAgPSAvXihodHRwfGh0dHBzKTpcXC9cXC9bXiBcIj8jQF0rJC87XG5cbmV4cG9ydCBjb25zdCBORVRXT1JLX0RFRkFVTFRfQ09OTkVDVElPTl9USU1FT1VUID0gMTAwMDA7IC8vIDEwcyAtIC8hXFwgc2hvdWxkIGJlIGhpZ2ggKGUuZy4gZm9yIHBvb3IgY29ubmVjdGlvbilcblxuLyogLS0gREVWIG9ubHkgKHRvIGRlYnVnIHJlZnJlc2ggdGltZXIpXG5OZXR3b3JrUmVmcmVzaFRpbWVyUGVyaW9kLk1PQklMRSA9ICAxMDAwO1xuTmV0d29ya1JlZnJlc2hUaW1lclBlcmlvZC5ERVNLVE9QID0gIDEwMDA7ICovXG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgTmV0d29ya1NlcnZpY2UgZXh0ZW5kcyBTdGFydGFibGVPYnNlcnZhYmxlU2VydmljZTxQZWVyLCBQZWVyPiB7XG4gIG9uUGVlckNoYW5nZXMgPSB0aGlzLnN0YXJ0U3ViamVjdC5waXBlKFxuICAgIG1hcCgocGVlcikgPT4gcGVlcj8udXJsKSxcbiAgICBmaWx0ZXIoaXNOb3ROaWxPckJsYW5rKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZDxzdHJpbmc+KClcbiAgKTtcbiAgb25OZXR3b3JrU3RhdHVzQ2hhbmdlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q29ubmVjdGlvblR5cGU+KG51bGwpO1xuICBvblJlc2V0TmV0d29ya0NhY2hlID0gbmV3IEV2ZW50RW1pdHRlcih0cnVlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9tb2JpbGU6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogSUxvZ2dlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBfbmV0d29yazogTmV0d29yaztcbiAgcHJpdmF0ZSBfdGltZXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBfdGltZXJSZWZyZXNoUGVyaW9kOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3RpbWVyUmVmcmVzaENvbmRpdGlvbjogKCkgPT4gYm9vbGVhbjtcbiAgcHJpdmF0ZSBfZGV2aWNlQ29ubmVjdGlvblR5cGU6IENvbm5lY3Rpb25UeXBlO1xuICBwcml2YXRlIF9mb3JjZU9mZmxpbmU6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Nvbm5lY3Rpb25UaW1lb3V0OiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBfbGlzdGVuZXJzOiB7XG4gICAgW2tleTogc3RyaW5nXTogKChkYXRhPzogYW55KSA9PiBQcm9taXNlPHZvaWQ+KVtdO1xuICB9ID0ge307XG5cbiAgZ2V0IG9ubGluZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uVHlwZSAhPT0gJ25vbmUnO1xuICB9XG5cbiAgZ2V0IG9mZmxpbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblR5cGUgPT09ICdub25lJztcbiAgfVxuXG4gIGdldCBjb25uZWN0aW9uVHlwZSgpOiBDb25uZWN0aW9uVHlwZSB7XG4gICAgLy8gSWYgZm9yY2Ugb2ZmbGluZTogcmV0dXJuICdub25lJ1xuICAgIHJldHVybiB0aGlzLl9mb3JjZU9mZmxpbmVcbiAgICAgID8gJ25vbmUnXG4gICAgICA6IC8vIEVsc2UsIHJldHVybiBkZXZpY2UgY29ubmVjdGlvbiB0eXBlIChvciB1bmtub3duKVxuICAgICAgICAodGhpcy5zdGFydGVkICYmIHRoaXMuX2RldmljZUNvbm5lY3Rpb25UeXBlKSB8fCAndW5rbm93bic7XG4gIH1cblxuICBnZXQgcGVlcigpOiBQZWVyIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU3ViamVjdC52YWx1ZT8uY2xvbmUoKTtcbiAgfVxuXG4gIHNldCBwZWVyKHBlZXI6IFBlZXIpIHtcbiAgICBpZiAoIVBlZXIuZXF1YWxzKHRoaXMucGVlciwgcGVlcikpIHtcbiAgICAgIHRoaXMucmVzdGFydChwZWVyKTtcbiAgICB9XG4gIH1cblxuICBnZXQgY29ubmVjdGlvblRpbWVvdXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvblRpbWVvdXQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudDogYW55LFxuICAgIHBsYXRmb3JtOiBQbGF0Zm9ybSxcbiAgICBwcml2YXRlIG1vZGFsQ3RybDogTW9kYWxDb250cm9sbGVyLFxuICAgIHByaXZhdGUgc3RvcmFnZTogU3RvcmFnZSxcbiAgICBwcml2YXRlIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBwcml2YXRlIGNhY2hlOiBDYWNoZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfTE9HR0lOR19TRVJWSUNFKSBwcml2YXRlIGxvZ2dpbmdTZXJ2aWNlOiBJTG9nZ2luZ1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgbmV0d29yazogTmV0d29yayxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHRvYXN0Q29udHJvbGxlcjogVG9hc3RDb250cm9sbGVyXG4gICkge1xuICAgIHN1cGVyKHBsYXRmb3JtKTtcbiAgICB0aGlzLl9tb2JpbGUgPSB0aGlzLnNldHRpbmdzLm1vYmlsZTtcbiAgICB0aGlzLl9jb25uZWN0aW9uVGltZW91dCA9IGVudmlyb25tZW50LmNvbm5lY3Rpb25UaW1lb3V0IHx8IE5FVFdPUktfREVGQVVMVF9DT05ORUNUSU9OX1RJTUVPVVQ7XG4gICAgdGhpcy5fbG9nZ2VyID0gdGhpcy5sb2dnaW5nU2VydmljZT8uZ2V0TG9nZ2VyKCduZXR3b3JrJyk7XG5cbiAgICBpZiAodGhpcy5fbW9iaWxlKSB7XG4gICAgICB0aGlzLl90aW1lclJlZnJlc2hQZXJpb2QgPSBOZXR3b3JrUmVmcmVzaFRpbWVyUGVyaW9kLk1PQklMRTtcbiAgICAgIHRoaXMuX3RpbWVyUmVmcmVzaENvbmRpdGlvbiA9ICgpID0+IHRoaXMub25saW5lOyAvLyBDaGVjayBvbmx5IHdoZW4gb25saW5lLCBhbmQgc3RvcCB3aGVuIG9mZmxpbmVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdGltZXJSZWZyZXNoUGVyaW9kID0gTmV0d29ya1JlZnJlc2hUaW1lclBlcmlvZC5ERVNLVE9QO1xuICAgICAgdGhpcy5fdGltZXJSZWZyZXNoQ29uZGl0aW9uID0gKCkgPT4gdHJ1ZTsgLy8gQWx3YXlzIGNoZWNrXG4gICAgfVxuXG4gICAgLy8gU2F2ZSBuZXR3b3JrIGluc3RhbmNlIG9ubHkgd2hlbiBjb3Jkb3ZhIGlzIHJ1bm5pbmdcbiAgICBpZiAocGxhdGZvcm0uaXMoJ2NvcmRvdmEnKSkge1xuICAgICAgdGhpcy5fbmV0d29yayA9IG5ldHdvcms7XG4gICAgfVxuXG4gICAgdGhpcy5zdGFydFN1YmplY3Quc3Vic2NyaWJlKChwZWVyKSA9PiB0aGlzLm5nT25BZnRlclN0YXJ0KHBlZXIpKTtcblxuICAgIC8vIEZvciBERVYgb25seVxuICAgIHRoaXMuX2RlYnVnID0gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgdG8gbmV0d29yayBldmVudFxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRUeXBlXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKi9cbiAgb248VCA9IGFueT4oZXZlbnRUeXBlOiBOZXR3b3JrRXZlbnRUeXBlLCBjYWxsYmFjazogKGRhdGE/OiBUKSA9PiBQcm9taXNlPGFueT4pOiBTdWJzY3JpcHRpb24ge1xuICAgIHN3aXRjaCAoZXZlbnRUeXBlKSB7XG4gICAgICBjYXNlICdzdGFydCc6XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0U3ViamVjdC5zdWJzY3JpYmUoKCkgPT4gY2FsbGJhY2soKSk7XG5cbiAgICAgIGNhc2UgJ3BlZXJDaGFuZ2VkJzpcbiAgICAgICAgcmV0dXJuIHRoaXMub25QZWVyQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gY2FsbGJhY2soKSk7XG5cbiAgICAgIGNhc2UgJ3N0YXR1c0NoYW5nZWQnOlxuICAgICAgICByZXR1cm4gdGhpcy5vbk5ldHdvcmtTdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgodHlwZSkgPT4gY2FsbGJhY2sodHlwZSBhcyB1bmtub3duIGFzIFQpKTtcblxuICAgICAgY2FzZSAncmVzZXRDYWNoZSc6XG4gICAgICAgIHJldHVybiB0aGlzLm9uUmVzZXROZXR3b3JrQ2FjaGUuc3Vic2NyaWJlKCgpID0+IGNhbGxiYWNrKCkpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5hZGRMaXN0ZW5lcihldmVudFR5cGUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB0cnlPbmxpbmUob3B0cz86IHtcbiAgICBzaG93T2ZmbGluZVRvYXN0PzogYm9vbGVhbjtcbiAgICBzaG93T25saW5lVG9hc3Q/OiBib29sZWFuO1xuICAgIHNob3dMb2FkaW5nVG9hc3Q/OiBib29sZWFuO1xuICAgIGFmdGVyUmV0cnlEZWxheT86IG51bWJlcjtcbiAgICBhZnRlclJldHJ5UHJvbWlzZT86ICgpID0+IFByb21pc2U8YW55PjtcbiAgfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIElmIG9mZmxpbmUgbW9kZSBub3QgZm9yY2VkLCBhbmQgZGV2aWNlIHNheXMgdGhlcmUgaXMgbm8gY29ubmVjdGlvbjogc2tpcFxuICAgIGlmICghdGhpcy5fZm9yY2VPZmZsaW5lIHx8IHRoaXMuX2RldmljZUNvbm5lY3Rpb25UeXBlID09PSAnbm9uZScpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFNIb3cgbG9hZGluZyB0b2FzdFxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgc2hvd0xvYWRpbmdUb2FzdCA9ICFvcHRzIHx8IG9wdHMuc2hvd0xvYWRpbmdUb2FzdCAhPT0gZmFsc2U7XG4gICAgbGV0IGxvYWRpbmdUb2FzdDogSFRNTElvblRvYXN0RWxlbWVudDtcbiAgICBpZiAoc2hvd0xvYWRpbmdUb2FzdCkge1xuICAgICAgYXdhaXQgdGhpcy5zaG93VG9hc3QoeyBtZXNzYWdlOiAnTkVUV09SSy5JTkZPLlJFVFJZX1RPX0NPTk5FQ1QnLCBkdXJhdGlvbjogMTAwMDAsIG9uV2lsbFByZXNlbnQ6ICh0KSA9PiAobG9hZGluZ1RvYXN0ID0gdCkgfSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW25ldHdvcmtdIENoZWNraW5nIGNvbm5lY3Rpb24gdG8gcG9kLi4uJyk7XG4gICAgICBjb25zdCBzZXR0aW5nczogTG9jYWxTZXR0aW5ncyA9IGF3YWl0IHRoaXMuc2V0dGluZ3MucmVhZHkoKTtcblxuICAgICAgaWYgKCFzZXR0aW5ncy5wZWVyVXJsKSByZXR1cm4gZmFsc2U7IC8vIE5vIHBlZXIgZGVmaW5lLiBTa2lwXG5cbiAgICAgIGNvbnN0IHBlZXIgPSBQZWVyLnBhcnNlVXJsKHNldHRpbmdzLnBlZXJVcmwpO1xuICAgICAgY29uc3QgcGVlckluZm8gPSBhd2FpdCB0aGlzLmNoZWNrUGVlckFsaXZlKHBlZXIpO1xuICAgICAgY29uc3QgcGVlckFsaXZlQW5kQ29tcGF0aWJsZSA9IHBlZXJJbmZvICYmIChhd2FpdCB0aGlzLmNoZWNrUGVlckNvbXBhdGlibGUocGVlckluZm8pKTtcbiAgICAgIGlmIChwZWVyQWxpdmVBbmRDb21wYXRpYmxlKSB7XG4gICAgICAgIC8vIERpc2FibGUgdGhlIG9mZmxpbmUgbW9kZVxuICAgICAgICB0aGlzLnNldEZvcmNlT2ZmbGluZShmYWxzZSk7XG5cbiAgICAgICAgLy8gUmVzdGFydFxuICAgICAgICBhd2FpdCB0aGlzLnJlc3RhcnQocGVlcik7XG5cbiAgICAgICAgLy8gV2FpdCBhIHByb21pc2UsIGJlZm9yZSByZWNoZWNrXG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnYmVmb3JlVHJ5T25saW5lRmluaXNoJywgdGhpcy5vbmxpbmUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcigoZXJyICYmIGVyci5tZXNzYWdlKSB8fCBlcnIpO1xuICAgICAgLy8gQ29udGludWVcbiAgICB9XG5cbiAgICAvLyBDbG9zZSBsb2FkaW5nIHRvYXN0ICh3aXRoIGEgbWluaW1hbCBkaXNwbGF5IGR1cmF0aW9uIG9mIDJzKVxuICAgIGlmIChzaG93TG9hZGluZ1RvYXN0KSB7XG4gICAgICBhd2FpdCBzbGVlcCgyMDAwIC0gKERhdGUubm93KCkgLSBub3cpKTtcbiAgICAgIGlmIChsb2FkaW5nVG9hc3QpIGF3YWl0IGxvYWRpbmdUb2FzdC5kaXNtaXNzKCk7XG4gICAgfVxuXG4gICAgLy8gUmVjaGVjayBuZXR3b3JrIHN0YXR1c1xuICAgIGNvbnN0IG9ubGluZSA9IHRoaXMub25saW5lO1xuXG4gICAgLy8gRGlzcGxheSBhIHRvYXN0IHRvIHVzZXJcbiAgICBpZiAob25saW5lKSB7XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5zaG93T25saW5lVG9hc3QgIT09IGZhbHNlKSB7XG4gICAgICAgIC8vIERpc3BsYXkgdG9hc3QgKHdpdGhvdXQgYXdhaXQsIGJlY2F1c2Ugbm90IG5lZWQgdG8gd2FpdCB0b2FzdCBjbG9zZSBldmVudClcbiAgICAgICAgdGhpcy5zaG93VG9hc3QoeyBtZXNzYWdlOiAnTkVUV09SSy5JTkZPLk9OTElORScsIHR5cGU6ICdpbmZvJyB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdHMgJiYgb3B0cy5zaG93T2ZmbGluZVRvYXN0ID09PSB0cnVlKSB7XG4gICAgICAvLyBEaXNwbGF5IHRvYXN0ICh3aXRob3V0IGF3YWl0LCBiZWNhdXNlIG5vdCBuZWVkIHRvIHdhaXQgdG9hc3QgY2xvc2UgZXZlbnQpXG4gICAgICByZXR1cm4gdGhpcy5zaG93T2ZmbGluZVRvYXN0KHsgc2hvd1JldHJ5QnV0dG9uOiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdGFydGVkICYmIG9ubGluZTtcbiAgfVxuXG4gIGFzeW5jIHNob3dPZmZsaW5lVG9hc3Qob3B0cz86IHtcbiAgICBtZXNzYWdlPzogc3RyaW5nO1xuICAgIHNob3dDbG9zZUJ1dHRvbj86IGJvb2xlYW47XG4gICAgc2hvd1JldHJ5QnV0dG9uPzogYm9vbGVhbjtcbiAgICBzaG93UmV0cnlTdWNjZXNzVG9hc3Q/OiBib29sZWFuO1xuICAgIHNob3dSZXRyeUxvYWRpbmdUb2FzdD86IGJvb2xlYW47XG4gICAgb25SZXRyeVN1Y2Nlc3M/OiAoKSA9PiB2b2lkO1xuICB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMub25saW5lKSByZXR1cm47IC8vIFNraXAgaWYgb25saW5lXG5cbiAgICAvLyBUb2FzdCB3aXRoIGEgcmV0cnkgYnV0dG9uXG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuc2hvd1JldHJ5QnV0dG9uICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgdG9hc3RSZXN1bHQgPSBhd2FpdCB0aGlzLnNob3dUb2FzdCh7XG4gICAgICAgIG1lc3NhZ2U6IChvcHRzICYmIG9wdHMubWVzc2FnZSkgfHwgJ0VSUk9SLk5FVFdPUktfUkVRVUlSRUQnLFxuICAgICAgICB0eXBlOiAnd2FybmluZycsXG4gICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgZHVyYXRpb246IDEwMDAwMCxcbiAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgIC8vIHJlY29ubmVjdCBidXR0b25cbiAgICAgICAgICB7XG4gICAgICAgICAgICByb2xlOiAncmVmcmVzaCcsXG4gICAgICAgICAgICB0ZXh0OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdORVRXT1JLLkJUTl9DSEVDS19BTElWRScpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgLy8gVXNlciBkb24ndCBjbGljayByZWNvbm5lY3Q6IHJldHVyblxuICAgICAgaWYgKCF0b2FzdFJlc3VsdCB8fCB0b2FzdFJlc3VsdC5yb2xlICE9PSAncmVmcmVzaCcpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gaWYgbmV0d29yayBzdGF0ZSBjaGFuZ2VkIHRvIG9ubGluZTogZXhpdCBoZXJlXG4gICAgICBpZiAodGhpcy5vbmxpbmUpIHJldHVybiB0cnVlO1xuXG4gICAgICAvLyBUcnkgdG8gcmVjb25uZWN0XG4gICAgICBjb25zdCBvbmxpbmUgPSBhd2FpdCB0aGlzLnRyeU9ubGluZSh7XG4gICAgICAgIHNob3dPZmZsaW5lVG9hc3Q6IGZhbHNlLFxuICAgICAgICBzaG93T25saW5lVG9hc3Q6IHRvQm9vbGVhbihvcHRzICYmIG9wdHMuc2hvd1JldHJ5U3VjY2Vzc1RvYXN0LCB0cnVlKSxcbiAgICAgICAgc2hvd0xvYWRpbmdUb2FzdDogdG9Cb29sZWFuKG9wdHMgJiYgb3B0cy5zaG93UmV0cnlMb2FkaW5nVG9hc3QsIHRydWUpLFxuICAgICAgfSk7XG4gICAgICBpZiAob25saW5lKSB7XG4gICAgICAgIC8vIENhbGwgc3VjY2VzcyBjYWxsYmFjayAoYXN5bmMpXG4gICAgICAgIGlmIChvcHRzICYmIG9wdHMub25SZXRyeVN1Y2Nlc3MpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KG9wdHMub25SZXRyeVN1Y2Nlc3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBvcHRzID0ge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBzaG93UmV0cnlCdXR0b246IGZhbHNlLFxuICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFNpbXBsZSB0b2FzdCwgd2l0aG91dCAnYXdhaXQnLCBiZWNhdXNlIG5vdCBuZWVkIHRvIHdhaXQgdG9hc3QncyBkaXNtaXNzXG4gICAgdGhpcy5zaG93VG9hc3Qoe1xuICAgICAgbWVzc2FnZTogJ0VSUk9SLk5FVFdPUktfUkVRVUlSRUQnLFxuICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgIC4uLm9wdHMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHBlZXIgaXMgYWxpdmVcbiAgICpcbiAgICogQHBhcmFtIHBlZXJcbiAgICogQHBhcmFtIG9wdHNcbiAgICovXG4gIGFzeW5jIGNoZWNrUGVlckFsaXZlKHBlZXI/OiBzdHJpbmcgfCBQZWVyKTogUHJvbWlzZTxOb2RlSW5mbz4ge1xuICAgIHBlZXIgPSBwZWVyIHx8IHRoaXMucGVlcjtcbiAgICBpZiAoIXBlZXIpIHtcbiAgICAgIGNvbnN0IHNldHRpbmdzOiBMb2NhbFNldHRpbmdzID0gYXdhaXQgdGhpcy5zZXR0aW5ncy5yZWFkeSgpO1xuICAgICAgaWYgKCFzZXR0aW5ncy5wZWVyVXJsKSByZXR1cm4gdW5kZWZpbmVkOyAvLyBObyBwZWVyIGRlZmluZS4gU2tpcFxuICAgICAgcGVlciA9IFBlZXIucGFyc2VVcmwoc2V0dGluZ3MucGVlclVybCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZUluZm8ocGVlciwgeyBub2NhY2hlOiB0cnVlLCB0aW1lb3V0OiB0aGlzLl9jb25uZWN0aW9uVGltZW91dCB9KTtcbiAgfVxuXG4gIGFzeW5jIGNoZWNrUGVlckNvbXBhdGlibGUocGVlckluZm86IE5vZGVJbmZvLCBvcHRzPzogeyBzaG93VG9hc3Q/OiBib29sZWFuIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXBlZXJJbmZvKSByZXR1cm4gZmFsc2U7IC8vIFBlZXIgY2Fubm90IGJlIHJlYWNoZWRcbiAgICBpZiAoIXRoaXMuZW52aXJvbm1lbnQucGVlck1pblZlcnNpb24pIHJldHVybiB0cnVlOyAvLyBTa2lwIGNvbXBhdGliaWxpdHkgY2hlY2tcblxuICAgIC8vIENoZWNrIHRoZSBtaW4gcG9kIHZlcnNpb24sIGRlZmluZWQgYnkgdGhlIGFwcFxuICAgIGNvbnN0IGlzQ29tcGF0aWJsZSA9IHBlZXJJbmZvLnNvZnR3YXJlVmVyc2lvbiAmJiBWZXJzaW9uVXRpbHMuaXNDb21wYXRpYmxlKHRoaXMuZW52aXJvbm1lbnQucGVlck1pblZlcnNpb24sIHBlZXJJbmZvLnNvZnR3YXJlVmVyc2lvbik7XG5cbiAgICAvLyBEaXNwbGF5IHRvYXN0LCBpZiBub3QgY29tcGF0aWJsZVxuICAgIGlmICghaXNDb21wYXRpYmxlICYmICghb3B0cyB8fCBvcHRzLnNob3dUb2FzdCAhPT0gZmFsc2UpKSB7XG4gICAgICBhd2FpdCB0aGlzLnNob3dUb2FzdCh7XG4gICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgIG1lc3NhZ2U6ICdORVRXT1JLLkVSUk9SLk5PVF9DT01QQVRJQkxFX1BFRVInLFxuICAgICAgICBtZXNzYWdlUGFyYW1zOiB7XG4gICAgICAgICAgdmVyc2lvbjogdGhpcy5lbnZpcm9ubWVudC5wZWVyTWluVmVyc2lvbixcbiAgICAgICAgfSxcbiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBpc0NvbXBhdGlibGU7XG4gIH1cblxuICBhc3luYyBnZXROb2RlSW5mbyhwZWVyPzogc3RyaW5nIHwgUGVlciwgb3B0cz86IHsgbm9jYWNoZT86IGJvb2xlYW47IHRpbWVvdXQ/OiBudW1iZXIgfSk6IFByb21pc2U8Tm9kZUluZm8+IHtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5jb21wdXRlUGVlclBhdGgocGVlciwgJy9hcGkvbm9kZS9pbmZvJyk7XG4gICAgdGhpcy5fbG9nZ2VyPy5kZWJ1ZygnZ2V0Tm9kZUluZm8nLCBgR2V0dGluZyAnJHtwYXRofScgLi4uYCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YTogTm9kZUluZm8gPSBhd2FpdCB0aGlzLmdldChwYXRoLCBvcHRzKTtcbiAgICAgIHRoaXMuX2xvZ2dlcj8uZGVidWcoJ2dldE5vZGVJbmZvJywgYFJlc3BvbnNlIG9mICcke3BhdGh9JzpcXG4ke0pTT04uc3RyaW5naWZ5KGRhdGEpfWApO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKGBbbmV0d29ya10gRXJyb3Igd2hpbGUgZ2V0dGluZyAnJHtwYXRofSc6ICR7KGVyciAmJiBlcnIubWVzc2FnZSkgfHwgZXJyfWAsIGVycik7XG4gICAgICB0aGlzLl9sb2dnZXI/LmVycm9yKCdnZXROb2RlSW5mbycsIGBFcnJvciB3aGlsZSBnZXR0aW5nICcke3BhdGh9JzogJHtlcnI/Lm1lc3NhZ2UgfHwgJyd9YCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldEFwcE1hbmlmZXN0KHBlZXI/OiBzdHJpbmcgfCBQZWVyLCBvcHRzPzogeyBub2NhY2hlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxBcHBNYW5pZmVzdCB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgcGF0aCA9IHRoaXMuY29tcHV0ZVBlZXJQYXRoKHBlZXIsICdtYW5pZmVzdC5qc29uJyk7XG4gICAgICBpZiAob3B0cz8ubm9jYWNoZSkge1xuICAgICAgICBwYXRoICs9ICc/dD0nICsgRGF0ZS5ub3coKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldChwYXRoLCBvcHRzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICh0aGlzLmVudmlyb25tZW50LnByb2R1Y3Rpb24pXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbbmV0d29ya10gQ2Fubm90IGxvYWQgZmlsZSAnbWFuaWZlc3QuanNvbicuIFBsZWFzZSBtYWtlIHN1cmUgd2Vic2VydmVyIGNvbmZpZyBhbGxvdyBDT1JTIGFjY2Vzc1wiLCBlcnIpO1xuICAgICAgZWxzZSBjb25zb2xlLmVycm9yKFwiW25ldHdvcmtdIENhbm5vdCBsb2FkIGZpbGUgJ21hbmlmZXN0Lmpzb24nLlwiLCBlcnIpO1xuICAgICAgLy8gQ29udGludWVcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRBcHBWZXJzaW9uKHBlZXI/OiBzdHJpbmcgfCBQZWVyLCBvcHRzID0geyBub2NhY2hlOiB0cnVlIH0pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgcGF0aCA9IHRoaXMuY29tcHV0ZVBlZXJQYXRoKHBlZXIsICd2ZXJzaW9uLmFwcHVwJyk7XG4gICAgICBpZiAob3B0cy5ub2NhY2hlKSB7XG4gICAgICAgIHBhdGggKz0gJz90PScgKyBEYXRlLm5vdygpO1xuICAgICAgfVxuICAgICAgY29uc3QgYXBwVmVyc2lvbjogc3RyaW5nID0gYXdhaXQgdGhpcy5nZXRUZXh0KHBhdGgsIG9wdHMpO1xuICAgICAgaWYgKGlzTm90TmlsT3JCbGFuayhhcHBWZXJzaW9uKSkgcmV0dXJuIGFwcFZlcnNpb247XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAodGhpcy5lbnZpcm9ubWVudC5wcm9kdWN0aW9uKVxuICAgICAgICBjb25zb2xlLmVycm9yKFwiW25ldHdvcmtdIENhbm5vdCBsb2FkIGZpbGUgJ3ZlcnNpb24uYXBwdXAnLiBQbGVhc2UgbWFrZSBzdXJlIHdlYnNlcnZlciBjb25maWcgYWxsb3cgQ09SUyBhY2Nlc3NcIik7XG4gICAgICBlbHNlIGNvbnNvbGUuZXJyb3IoXCJbbmV0d29ya10gQ2Fubm90IGxvYWQgZmlsZSAndmVyc2lvbi5hcHB1cCcuXCIsIGVycik7XG4gICAgICAvLyBDb250aW51ZVxuICAgIH1cblxuICAgIC8vIFRyeSBsb2FkaW5nIG1hbmlmZXN0Lmpzb25cbiAgICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IHRoaXMuZ2V0QXBwTWFuaWZlc3QocGVlciwgb3B0cyk7XG4gICAgcmV0dXJuIG1hbmlmZXN0Py52ZXJzaW9uO1xuICB9XG5cbiAgY29tcHV0ZVBlZXJQYXRoKHBlZXI6IHN0cmluZyB8IFBlZXIgfCB1bmRlZmluZWQsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcGVlciA9IHBlZXIgfHwgdGhpcy5wZWVyO1xuICAgIGlmICghcGVlcikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGxldCBwZWVyVXJsID0gcGVlciBpbnN0YW5jZW9mIFBlZXIgPyBwZWVyLnVybCA6IChwZWVyIGFzIHN0cmluZyk7XG5cbiAgICAvLyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hcbiAgICBpZiAocGVlclVybC5lbmRzV2l0aCgnLycpKSB7XG4gICAgICBwZWVyVXJsID0gcGVlclVybC5zdWJzdHIoMCwgcGVlclVybC5sZW5ndGggLSAxKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZmlyc3QgcGF0aFxuICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgIHBhdGggPSAnLycgKyBwYXRoO1xuICAgIH1cblxuICAgIC8vIENvbmNhdCBwZWVyIFVSTCBhbmQgcGF0aFxuICAgIHJldHVybiBwZWVyVXJsICsgcGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyB0byBmb3JjZSBvZmZsaW5lIG1vZGVcbiAgICovXG4gIHNldEZvcmNlT2ZmbGluZShcbiAgICB2YWx1ZT86IGJvb2xlYW4sXG4gICAgb3B0cz86IHtcbiAgICAgIHNob3dUb2FzdD86IGJvb2xlYW47IC8vIERpc3BsYXkgYSB0b2FzdCwgd2hlbiBvZmZsaW5lID9cbiAgICB9XG4gICkge1xuICAgIHZhbHVlID0gdG9Cb29sZWFuKHZhbHVlLCB0cnVlKTtcbiAgICBpZiAodGhpcy5fZm9yY2VPZmZsaW5lICE9PSB2YWx1ZSkge1xuICAgICAgY29uc3QgcHJldmlvdXNDb25uZWN0aW9uVHlwZSA9IHRoaXMuY29ubmVjdGlvblR5cGU7XG4gICAgICB0aGlzLl9mb3JjZU9mZmxpbmUgPSB2YWx1ZTtcbiAgICAgIGNvbnN0IGN1cnJlbnRDb25uZWN0aW9uVHlwZSA9IHRoaXMuY29ubmVjdGlvblR5cGU7XG5cbiAgICAgIGlmIChwcmV2aW91c0Nvbm5lY3Rpb25UeXBlICE9PSBjdXJyZW50Q29ubmVjdGlvblR5cGUpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBbbmV0d29ya10gQ29ubmVjdGlvbiBjaGFuZ2VkIHRvIHske2N1cnJlbnRDb25uZWN0aW9uVHlwZX19YCk7XG4gICAgICAgIHRoaXMub25OZXR3b3JrU3RhdHVzQ2hhbmdlcy5uZXh0KGN1cnJlbnRDb25uZWN0aW9uVHlwZSk7XG5cbiAgICAgICAgLy8gT2ZmbGluZSBtb2RlOiBhbGVydCB0aGUgdXNlclxuICAgICAgICBpZiAoY3VycmVudENvbm5lY3Rpb25UeXBlID09PSAnbm9uZScgJiYgKCFvcHRzIHx8IG9wdHMuc2hvd1RvYXN0ICE9PSBmYWxzZSkpIHtcbiAgICAgICAgICB0aGlzLnNob3dUb2FzdCh7IG1lc3NhZ2U6ICdORVRXT1JLLklORk8uT0ZGTElORV9IRUxQJywgdHlwZTogJ3dhcm5pbmcnIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2hvd1NlbGVjdFBlZXJNb2RhbChvcHRzPzogUGFydGlhbDxJU2VsZWN0UGVlck1vZGFsT3B0aW9ucz4pOiBQcm9taXNlPFBlZXIgfCB1bmRlZmluZWQ+IHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICAgIGNvbnN0IHBlZXJzID0gYXdhaXQgdGhpcy5nZXREZWZhdWx0UGVlcnMoKTtcbiAgICBjb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMubW9kYWxDdHJsLmNyZWF0ZSh7XG4gICAgICBjb21wb25lbnQ6IFNlbGVjdFBlZXJNb2RhbCxcbiAgICAgIGNvbXBvbmVudFByb3BzOiA8SVNlbGVjdFBlZXJNb2RhbE9wdGlvbnM+e1xuICAgICAgICBkZWZhdWx0UGVlcnM6IHBlZXJzLFxuICAgICAgICAuLi5vcHRzLFxuICAgICAgfSxcbiAgICAgIGtleWJvYXJkQ2xvc2U6IHRydWUsXG4gICAgICBzaG93QmFja2Ryb3A6IHRydWUsXG4gICAgfSk7XG4gICAgYXdhaXQgbW9kYWwucHJlc2VudCgpO1xuXG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBtb2RhbC5vbldpbGxEaXNtaXNzKCk7XG5cbiAgICByZXR1cm4gKGRhdGEgJiYgKGRhdGEgYXMgUGVlcikpIHx8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGFzeW5jIGNsZWFyQ2FjaGUob3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm93ID0gdGhpcy5fZGVidWcgJiYgRGF0ZS5ub3coKTtcblxuICAgIGNvbnNvbGUuaW5mbygnW25ldHdvcmtdIENsZWFyaW5nIGFsbCBjYWNoZXMuLi4nKTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZVxuICAgICAgLmNsZWFyQWxsKClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gRW1pdCBldmVudFxuICAgICAgICBpZiAoKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkgJiYgdGhpcy5vblJlc2V0TmV0d29ya0NhY2hlLm9ic2VydmVkKSB7XG4gICAgICAgICAgdGhpcy5vblJlc2V0TmV0d29ya0NhY2hlLmVtaXQoKTtcblxuICAgICAgICAgIC8vIFdhaXQgb2JzZXJ2ZXJzIGNsZWFuIHRoZWlyIGNhY2hlcywgaWYgbmVlZFxuICAgICAgICAgIHJldHVybiBzbGVlcCg1MDApO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFtuZXR3b3JrXSBBbGwgY2FjaGUgY2xlYXJlZCwgaW4gJHtEYXRlLm5vdygpIC0gbm93fW1zYCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBmdW5jdGlvbnMgLS0gKi9cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmdPblN0YXJ0KHBlZXI/OiBQZWVyKTogUHJvbWlzZTxQZWVyPiB7XG4gICAgY29uc29sZS5pbmZvKCdbbmV0d29ya10gU3RhcnRpbmcgbmV0d29yay4uLicpO1xuXG4gICAgLy8gUmVzdG9yaW5nIGxvY2FsIHNldHRpbmdzXG4gICAgcGVlciA9IHBlZXIgfHwgKGF3YWl0IHRoaXMucmVzdG9yZUxvY2FsbHkoKSk7XG5cbiAgICBpZiAoIXBlZXIpIHtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0byBoaWRlIHRoZSBzcGxhc2hzY3JlZW4sIGJlZm9yZSBvcGVuIHRoZSBtb2RhbFxuICAgICAgYXdhaXQgU3BsYXNoU2NyZWVuLmhpZGUoKTtcblxuICAgICAgLy8gTm8gcGVlciBpbiBzZXR0aW5nczogYXNrIHVzZXIgdG8gY2hvb3NlXG4gICAgICB3aGlsZSAoIXBlZXIpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW25ldHdvcmtdIE5vIHBlZXIgZGVmaW5lZC4gQXNraW5nIHVzZXIgdG8gY2hvb3NlIGEgcGVlci4nKTtcbiAgICAgICAgcGVlciA9IGF3YWl0IHRoaXMuc2hvd1NlbGVjdFBlZXJNb2RhbCh7IGFsbG93U2VsZWN0RG93blBlZXI6IGZhbHNlLCB0aXRsZTogJ05FVFdPUksuUEVFUi5TRUxFQ1RfTU9EQUwuU1RBUlRVUF9USVRMRScsIGNhbkNhbmNlbDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLm9ubGluZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgYWxpdmUuIElmIG5vdCwgZm9yY2Ugb2ZmbGluZSBtb2RlXG4gICAgICBjb25zdCBhbGl2ZSA9IGF3YWl0IHRoaXMuY2hlY2tQZWVyQWxpdmUocGVlcik7XG4gICAgICBpZiAoIWFsaXZlKSB7XG4gICAgICAgIC8vIFBlZXIgbm90IGFsaXZlLCBidXQgc2hvdWxkIGJlIGF0IHRoZSBzYW1lIFVSTCwgcmV0cnlpbmcgZWFjaCAxc1xuICAgICAgICBpZiAodGhpcy5lbnZpcm9ubWVudC5zYW1lVXJsUGVlcikge1xuICAgICAgICAgIGNvbnN0IHJldHJ5TXMgPSB0aGlzLl9jb25uZWN0aW9uVGltZW91dCA+IDAgPyB0aGlzLl9jb25uZWN0aW9uVGltZW91dCA6IDEwMDA7XG4gICAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgICB0aW1lcihyZXRyeU1zLCByZXRyeU1zKS5waXBlKFxuICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5zdG9wU3ViamVjdCksXG4gICAgICAgICAgICAgIHRhcCgoKSA9PiBjb25zb2xlLndhcm4oYFtuZXR3b3JrLXNlcnZpY2VdIFdhaXRpbmcgcGVlciBiZSBiZSBhbGl2ZSwgYXQgeyR7cGVlci51cmx9fSAuLi5gKSksXG4gICAgICAgICAgICAgIG1lcmdlTWFwKCgpID0+IHRoaXMuY2hlY2tQZWVyQWxpdmUocGVlcikpLFxuICAgICAgICAgICAgICBmaWx0ZXIoKGFsaXZlKSA9PiAhIWFsaXZlKSxcbiAgICAgICAgICAgICAgZmlyc3QoKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ29udGludWUsIGluIG9mZmxpbmUgbW9kZVxuICAgICAgICAgIHRoaXMuc2V0Rm9yY2VPZmZsaW5lKHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBbbmV0d29ya10gU3RhcnRpbmcgc2VydmljZSBbT0tdIHtwZWVyOiAnJHtwZWVyLnVybH0nLCBvbmxpbmU6ICR7dGhpcy5vbmxpbmV9fWApO1xuXG4gICAgcmV0dXJuIHBlZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmdPbkFmdGVyU3RhcnQocGVlcjogUGVlcikge1xuICAgIC8vIFdhaXQgc2V0dGluZ3Mgc3RhcnRzLCB0aGVuIHNhdmUgcGVlciBpbiBzZXR0aW5nc1xuICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MuYXBwbHkoeyBwZWVyVXJsOiBwZWVyLnVybCB9KTtcblxuICAgIHRoaXMub25EZXZpY2VDb25uZWN0aW9uQ2hhbmdlZCh0aGlzLl9uZXR3b3JrPy50eXBlIHx8ICd1bmtub3duJyk7XG5cbiAgICAvLyBTdGFydCB0aGUgcmVmcmVzaCB0aW1lclxuICAgIHRoaXMuc3RhcnRSZWZyZXNoVGltZXIoKTtcblxuICAgIC8vIExpc3RlbiBmb3IgZGV2aWNlIG5ldHdvcmsgY2hhbmdlc1xuICAgIGlmICh0aGlzLl9uZXR3b3JrKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHRoaXMuX25ldHdvcmsub25EaXNjb25uZWN0KCkuc3Vic2NyaWJlKCgpID0+IHRoaXMub25EZXZpY2VDb25uZWN0aW9uQ2hhbmdlZCgnbm9uZScpKSk7XG4gICAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHRoaXMuX25ldHdvcmsub25Db25uZWN0KCkuc3Vic2NyaWJlKCgpID0+IHRoaXMub25EZXZpY2VDb25uZWN0aW9uQ2hhbmdlZCh0aGlzLl9uZXR3b3JrLnR5cGUpKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG5nT25TdG9wKCkge1xuICAgIC8vIFN0b3AgdGltZXIsIGlmIGNhbm5vdCByZWZyZXNoIGFueW1vcmVcbiAgICBpZiAodGhpcy5fdGltZXJSZWZyZXNoQ29uZGl0aW9uKCkgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnN0b3BSZWZyZXNoVGltZXIoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIHJlc3RvcmUgcGVlciBmcm9tIHRoZSBsb2NhbCBzdG9yYWdlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcmVzdG9yZUxvY2FsbHkoKTogUHJvbWlzZTxQZWVyIHwgdW5kZWZpbmVkPiB7XG4gICAgLy8gRm9yY2UgdXNlIHByZWRlZmluZWQgcGVlciBpZiBwcm92aWRlZFxuICAgIGlmICh0aGlzLmVudmlyb25tZW50LnBlZXIpIHtcbiAgICAgIHJldHVybiBQZWVyLmZyb21PYmplY3QodGhpcy5lbnZpcm9ubWVudC5wZWVyKTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIGZyb20gc3RvcmFnZVxuICAgIGxldCBzZXR0aW5ncyA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoU0VUVElOR1NfU1RPUkFHRV9LRVkpO1xuICAgIHNldHRpbmdzID0gdHlwZW9mIHNldHRpbmdzID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2Uoc2V0dGluZ3MpIDogc2V0dGluZ3M7XG4gICAgaWYgKHNldHRpbmdzICYmIHNldHRpbmdzLnBlZXJVcmwpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYFtuZXR3b3JrXSBVc2UgcGVlciB7JHtzZXR0aW5ncy5wZWVyVXJsfX0gKGZvdW5kIGluIHRoZSBsb2NhbCBzdG9yYWdlKWApO1xuICAgICAgcmV0dXJuIFBlZXIucGFyc2VVcmwoc2V0dGluZ3MucGVlclVybCk7XG4gICAgfVxuXG4gICAgLy8gRWxzZSwgdXNlIGRlZmF1bHQgcGVlciBpbiBlbnYsIGlmIGV4aXN0c1xuICAgIGlmICh0aGlzLmVudmlyb25tZW50LmRlZmF1bHRQZWVyKSB7XG4gICAgICByZXR1cm4gUGVlci5mcm9tT2JqZWN0KHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdFBlZXIpO1xuICAgIH1cblxuICAgIC8vIEVsc2UsIGlmIEFwcCBpcyBob3N0ZWQsIHRyeSB0aGUgd2Vic2l0ZSBhcyBhIHBlZXJcbiAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuX2RvY3VtZW50Py5sb2NhdGlvbjtcbiAgICBpZiAobG9jYXRpb24/LnByb3RvY29sPy5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgIGNvbnN0IGhvc3RuYW1lID0gdGhpcy5fZG9jdW1lbnQubG9jYXRpb24uaG9zdDtcbiAgICAgIGNvbnN0IGRldGVjdGVkUGVlciA9IFBlZXIucGFyc2VVcmwoYCR7dGhpcy5fZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2x9JHtob3N0bmFtZX0ke3RoaXMuZW52aXJvbm1lbnQuYmFzZVVybH1gKTtcblxuICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuc2FtZVVybFBlZXIgfHwgKGF3YWl0IHRoaXMuY2hlY2tQZWVyQWxpdmUoZGV0ZWN0ZWRQZWVyKSkpIHtcbiAgICAgICAgcmV0dXJuIGRldGVjdGVkUGVlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgdG8gbmV0d29yayBzdGF0ZVxuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RvcFJlZnJlc2hUaW1lcigpIHtcbiAgICBpZiAodGhpcy5fdGltZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX3RpbWVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLl90aW1lclN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaCB0aGUgbmV0d29yayBzdGF0ZVxuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhcnRSZWZyZXNoVGltZXIoKSB7XG4gICAgaWYgKHRoaXMuX3RpbWVyU3Vic2NyaXB0aW9uKSByZXR1cm47IC8vIEFscmVhZHkgcnVubmluZzogc2tpcFxuXG4gICAgY29uc29sZS5pbmZvKGBbbmV0d29ya10gU3RhcnRpbmcgcmVmcmVzaCB0aW1lciwgZXZlcnkgJHt0aGlzLl90aW1lclJlZnJlc2hQZXJpb2R9bXMuLi5gKTtcblxuICAgIGxldCBsYXN0SW5mbzogTm9kZUluZm87XG4gICAgdGhpcy5fdGltZXJTdWJzY3JpcHRpb24gPSB0aW1lcih0aGlzLl90aW1lclJlZnJlc2hQZXJpb2QsIHRoaXMuX3RpbWVyUmVmcmVzaFBlcmlvZClcbiAgICAgIC5waXBlKFxuICAgICAgICAvLyBTa2lwIHNvbWUgdGltZXIgZXZlbnQgKHNlZSBjb25zdHJ1Y3RvcilcbiAgICAgICAgZmlsdGVyKHRoaXMuX3RpbWVyUmVmcmVzaENvbmRpdGlvbiksXG5cbiAgICAgICAgLy8gQ2hlY2tpbiBpZiBwZWVyIGFsaXZlXG4gICAgICAgIHRhcCgoKSA9PiBjb25zb2xlLmRlYnVnKCdbbmV0d29ya10gQ2hlY2tpbmcgY29ubmVjdGlvbiB0byBwb2QuLi4nKSksXG4gICAgICAgIG1lcmdlTWFwKCgpID0+IHRoaXMuY2hlY2tQZWVyQWxpdmUodGhpcy5wZWVyKSksXG5cbiAgICAgICAgLy8gRmlsdGVyIHRvIGtlZXAgb25seSBjaGFuZ2VzXG4gICAgICAgIGZpbHRlcigoaW5mbykgPT4gIWVxdWFscyhpbmZvLCBsYXN0SW5mbykpLFxuICAgICAgICB0YXAoKGluZm8pID0+IChsYXN0SW5mbyA9IGluZm8pKSxcblxuICAgICAgICAvLyBDaGVjayBjb21wYXRpYmlsaXR5XG4gICAgICAgIG1lcmdlTWFwKChpbmZvKSA9PiB0aGlzLmNoZWNrUGVlckNvbXBhdGlibGUoaW5mbywgeyBzaG93VG9hc3Q6IHRydWUgfSkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChhbGl2ZSkgPT4ge1xuICAgICAgICBpZiAoYWxpdmUgJiYgdGhpcy5vZmZsaW5lKSB7XG4gICAgICAgICAgdGhpcy5zZXRGb3JjZU9mZmxpbmUoZmFsc2UpO1xuXG4gICAgICAgICAgLy8gUmVzdGFydCB0aGUgc2VydmljZSAodG8gZm9yY2UgcmUgYXV0aClcbiAgICAgICAgICB0aGlzLnJlc3RhcnQoKTtcbiAgICAgICAgfSBlbHNlIGlmICghYWxpdmUgJiYgdGhpcy5vbmxpbmUpIHtcbiAgICAgICAgICB0aGlzLnNldEZvcmNlT2ZmbGluZSh0cnVlKTtcblxuICAgICAgICAgIC8vIFN0b3AgdGhlIHNlcnZpY2VcbiAgICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB0aGlzLl90aW1lclN1YnNjcmlwdGlvbi5hZGQoKCkgPT4gY29uc29sZS5kZWJ1ZygnW25ldHdvcmtdIFJlZnJlc2ggdGltZXIgc3RvcHBlZCcpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZXRUZXh0KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBvcHRzPzoge1xuICAgICAgaGVhZGVycz86XG4gICAgICAgIHwgSHR0cEhlYWRlcnNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICAgICAgICB9O1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ3RleHQnO1xuICAgICAgbm9jYWNoZT86IGJvb2xlYW47XG4gICAgfVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBIdHRwVXRpbHMuZ2V0VGV4dCh0aGlzLmh0dHAsIHRoaXMuZ2V0VXJpKHBhdGgpLCBvcHRzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQ8VD4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG9wdHM/OiB7XG4gICAgICBoZWFkZXJzPzpcbiAgICAgICAgfCBIdHRwSGVhZGVyc1xuICAgICAgICB8IHtcbiAgICAgICAgICAgIFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgICAgICAgIH07XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgICBub2NhY2hlPzogYm9vbGVhbjtcbiAgICAgIHRpbWVvdXQ/OiBudW1iZXI7XG4gICAgfVxuICApOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gSHR0cFV0aWxzLmdldEpzb248VD4odGhpcy5odHRwLCB0aGlzLmdldFVyaShwYXRoKSwgb3B0cyk7XG4gIH1cblxuICAvKiAtLSBQcm90ZWN0ZWQgbWV0aG9kcyAtLSAqL1xuXG4gIHByb3RlY3RlZCBnZXRVcmkocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgdXJpID0gcGF0aDtcblxuICAgIC8vIElmIHBhdGggaXMgbm90IGFuIFVSSTogcHJlcGVuZCB3aXRoIHBlZXIgVVJMXG4gICAgaWYgKCF1cmkuc3RhcnRzV2l0aCgnaHR0cDovLycpICYmICF1cmkuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuICAgICAgbGV0IHBlZXJVcmwgPSB0aGlzLnBlZXIgJiYgdGhpcy5wZWVyLnVybDtcblxuICAgICAgLy8gUmVtb3ZlIHRyYWlsaW5nIHNsYXNoXG4gICAgICBpZiAocGVlclVybC5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgIHBlZXJVcmwgPSBwZWVyVXJsLnN1YnN0cigwLCBwZWVyVXJsLmxlbmd0aCAtIDEpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgZmlyc3QgcGF0aFxuICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICBwYXRoID0gJy8nICsgcGF0aDtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHRoZSBVUkk6IGNvbmNhdCBwZWVyIFVSTCBhbmQgcGF0aFxuICAgICAgdXJpID0gcGVlclVybCArIHBhdGg7XG4gICAgfVxuICAgIHJldHVybiB1cmk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uRGV2aWNlQ29ubmVjdGlvbkNoYW5nZWQoY29ubmVjdGlvblR5cGU/OiBzdHJpbmcpIHtcbiAgICBjb25uZWN0aW9uVHlwZSA9IGdldENvbm5lY3Rpb25UeXBlKGNvbm5lY3Rpb25UeXBlKTtcbiAgICBpZiAoY29ubmVjdGlvblR5cGUgIT09IHRoaXMuX2RldmljZUNvbm5lY3Rpb25UeXBlKSB7XG4gICAgICB0aGlzLl9kZXZpY2VDb25uZWN0aW9uVHlwZSA9IGNvbm5lY3Rpb25UeXBlIGFzIENvbm5lY3Rpb25UeXBlO1xuXG4gICAgICAvLyBJZiBOT1QgIGFscmVhZHkgZm9yY2VkIGFzIG9mZmxpbmUsIGVtaXQgZXZlbnRcbiAgICAgIGlmICghdGhpcy5fZm9yY2VPZmZsaW5lKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgW25ldHdvcmtdIENvbm5lY3Rpb24gY2hhbmdlZCB0byB7JHt0aGlzLl9kZXZpY2VDb25uZWN0aW9uVHlwZX19YCk7XG4gICAgICAgIHRoaXMub25OZXR3b3JrU3RhdHVzQ2hhbmdlcy5uZXh0KHRoaXMuX2RldmljZUNvbm5lY3Rpb25UeXBlKTtcblxuICAgICAgICAvLyBDaGFuZ2UgdG8gb2ZmbGluZVxuICAgICAgICBpZiAodGhpcy5fZGV2aWNlQ29ubmVjdGlvblR5cGUgPT09ICdub25lJykge1xuICAgICAgICAgIGlmICh0aGlzLl9tb2JpbGUpIHtcbiAgICAgICAgICAgIC8vIEZvcmNlIG9mZmxpbmUgbW9kZVxuICAgICAgICAgICAgdGhpcy5fZm9yY2VPZmZsaW5lID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gQWxlcnQgdGhlIHVzZXJcbiAgICAgICAgICAgIHRoaXMuc2hvd1RvYXN0KHsgbWVzc2FnZTogJ05FVFdPUksuSU5GTy5PRkZMSU5FX0hFTFAnLCB0eXBlOiAnd2FybmluZycgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEFsZXJ0IHRoZSB1c2VyXG4gICAgICAgICAgICB0aGlzLnNob3dUb2FzdCh7IG1lc3NhZ2U6ICdORVRXT1JLLklORk8uT0ZGTElORScsIHR5cGU6ICd3YXJuaW5nJyB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTdG9wIHRoZSBuZXR3b3JrIHNlcnZpY2VcbiAgICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZGVmYXVsdCBwZWVycywgZnJvbSBlbnZpcm9ubWVudFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGdldERlZmF1bHRQZWVycygpOiBQcm9taXNlPFBlZXJbXT4ge1xuICAgIGNvbnN0IHBlZXJzID0gKHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdFBlZXJzIHx8IFtdKS5tYXAoUGVlci5mcm9tT2JqZWN0KTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBlZXJzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93VG9hc3Q8VCA9IGFueT4ob3B0czogU2hvd1RvYXN0T3B0aW9ucyk6IFByb21pc2U8T3ZlcmxheUV2ZW50RGV0YWlsPFQ+PiB7XG4gICAgcmV0dXJuIFRvYXN0cy5zaG93KHRoaXMudG9hc3RDb250cm9sbGVyLCB0aGlzLnRyYW5zbGF0ZSwgb3B0cyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkTGlzdGVuZXI8VCA9IGFueT4obmFtZTogTmV0d29ya0V2ZW50VHlwZSwgY2FsbGJhY2s6IChkYXRhPzogVCkgPT4gUHJvbWlzZTx2b2lkPik6IFN1YnNjcmlwdGlvbiB7XG4gICAgdGhpcy5fbGlzdGVuZXJzW25hbWVdID0gdGhpcy5fbGlzdGVuZXJzW25hbWVdIHx8IFtdO1xuICAgIHRoaXMuX2xpc3RlbmVyc1tuYW1lXS5wdXNoKGNhbGxiYWNrKTtcblxuICAgIC8vIFdoZW4gdW5zdWJzY3JpYmUsIHJlbW92ZSBmcm9tIHRoZSBsaXN0ZW5lclxuICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKCgpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fbGlzdGVuZXJzW25hbWVdLmluZGV4T2YoY2FsbGJhY2spO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnNbbmFtZV0uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBlbWl0PFQgPSBhbnk+KG5hbWU6IE5ldHdvcmtFdmVudFR5cGUsIGRhdGE/OiBUKSB7XG4gICAgY29uc3QgaG9va3MgPSB0aGlzLl9saXN0ZW5lcnNbbmFtZV07XG4gICAgaWYgKGlzTm90RW1wdHlBcnJheShob29rcykpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgW25ldHdvcmstc2VydmljZV0gVHJpZ2dlciAke25hbWV9IGhvb2s6IEV4ZWN1dGluZyAke2hvb2tzLmxlbmd0aH0gY2FsbGJhY2tzLi4uYCk7XG5cbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgaG9va3MubWFwKChjYWxsYmFjaykgPT4ge1xuICAgICAgICAgIGNvbnN0IHByb21pc2UgPSBjYWxsYmFjayhkYXRhKTtcbiAgICAgICAgICBpZiAoIXByb21pc2UpIHJldHVybjtcbiAgICAgICAgICByZXR1cm4gcHJvbWlzZS5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmVycm9yKCdFcnJvciB3aGlsZSBleGVjdXRpbmcgaG9vayAnICsgbmFtZSwgZXJyKSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19
|