@alfresco/adf-content-services
Version:
Alfresco ADF content services
93 lines • 30.6 kB
JavaScript
/*!
* @license
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { FileModel, FileUploadStatus } from '../../common/models/file.model';
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MatIconModule } from '@angular/material/icon';
import { MatListModule } from '@angular/material/list';
import { FileSizePipe, IconComponent } from '@alfresco/adf-core';
import { MatChipsModule } from '@angular/material/chips';
import { TranslateModule } from '@ngx-translate/core';
import { ToggleIconDirective } from '../directives/toggle-icon.directive';
import { MatButtonModule } from '@angular/material/button';
import { FileUploadErrorPipe } from '../pipes/file-upload-error.pipe';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/material/icon";
import * as i3 from "@angular/material/list";
import * as i4 from "@angular/material/chips";
import * as i5 from "@ngx-translate/core";
import * as i6 from "@angular/material/button";
export class FileUploadingListRowComponent {
constructor() {
this.cancel = new EventEmitter();
}
onCancel(file) {
this.cancel.emit(file);
}
showCancelledStatus() {
return (this.file.status === FileUploadStatus.Cancelled ||
this.file.status === FileUploadStatus.Aborted ||
this.file.status === FileUploadStatus.Deleted);
}
get versionNumber() {
return this.file.data.entry.properties['cm:versionLabel'];
}
get mimeType() {
return this.file?.file?.type || 'default';
}
isUploadVersion() {
return !!this.file.data && this.file.options?.newVersion && this.file.data.entry.properties?.['cm:versionLabel'];
}
canCancelUpload() {
return this.file?.status === FileUploadStatus.Pending;
}
isUploadError() {
return this.file?.status === FileUploadStatus.Error;
}
isUploading() {
return this.file && (this.file.status === FileUploadStatus.Progress || this.file.status === FileUploadStatus.Starting);
}
isUploadComplete() {
return this.file?.status === FileUploadStatus.Complete && !this.isUploadVersion();
}
isUploadVersionComplete() {
return this.file?.status === FileUploadStatus.Complete && this.isUploadVersion();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: FileUploadingListRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: FileUploadingListRowComponent, isStandalone: true, selector: "adf-file-uploading-list-row", inputs: { file: "file" }, outputs: { cancel: "cancel" }, ngImport: i0, template: "<div class=\"adf-file-uploading-row\">\n <mat-icon *ngIf=\"mimeType === 'default'\" matListItemIcon class=\"adf-file-uploading-row__type\">\n insert_drive_file\n </mat-icon>\n\n <adf-icon *ngIf=\"mimeType !== 'default'\" value=\"adf:{{ mimeType }}\" />\n\n <span\n class=\"adf-file-uploading-row__name\"\n title=\"{{ file.name }}\">\n {{ file.name }}\n </span>\n\n <span *ngIf=\"isUploadVersion()\" class=\"adf-file-uploading-row__version\" tabindex=\"0\" >\n <mat-chip color=\"primary\"\n [attr.aria-label]=\"'ADF_FILE_UPLOAD.ARIA-LABEL.VERSION' | translate: { version: versionNumber }\"\n [title]=\"'version' + versionNumber\"\n >{{ versionNumber }}</mat-chip>\n </span>\n\n <div\n tabindex=\"0\"\n role=\"button\"\n #toggleIcon=\"toggleIcon\"\n adf-toggle-icon\n (keyup.enter)=\"onCancel(file)\"\n (click)=\"onCancel(file)\"\n data-automation-id=\"cancel-upload-progress\"\n *ngIf=\"isUploading()\"\n [attr.aria-label]=\"'ADF_FILE_UPLOAD.ARIA-LABEL.STOP_FILE_UPLOAD' | translate: { file: file.name }\"\n class=\"adf-file-uploading-row__group adf-file-uploading-row__group--toggle\"\n title=\"{{ 'ADF_FILE_UPLOAD.BUTTON.STOP_FILE' | translate }}\">\n\n <span class=\"adf-file-uploading-row__status\" *ngIf=\"!toggleIcon.isToggled\">\n {{ file.progress.loaded | adfFileSize }} / {{ file.progress.total | adfFileSize }}\n </span>\n\n <mat-icon *ngIf=\"toggleIcon.isToggled\"\n class=\"adf-file-uploading-row__action adf-file-uploading-row__action--cancel\">\n clear\n </mat-icon>\n </div>\n\n <button mat-icon-button\n adf-toggle-icon\n #toggleIcon=\"toggleIcon\"\n *ngIf=\"isUploadComplete()\"\n class=\"adf-file-uploading-row__group\"\n [attr.aria-label]=\"'ADF_FILE_UPLOAD.ARIA-LABEL.UPLOAD_SUCCESSFUL' | translate: { file: file.name }\"\n title=\"{{ 'ADF_FILE_UPLOAD.BUTTON.UPLOAD_SUCCESSFUL' | translate }}\">\n\n <mat-icon\n class=\"adf-file-uploading-row__status adf-file-uploading-row__status--done\">\n check_circle\n </mat-icon>\n </button>\n\n <div\n *ngIf=\"isUploadVersionComplete()\"\n class=\"adf-file-uploading-row__file-version\"\n [attr.aria-label]=\"'ADF_FILE_UPLOAD.STATUS.FILE_DONE_STATUS' | translate\"\n >\n <mat-icon\n matListItemIcon\n class=\"adf-file-uploading-row__status--done\">\n check_circle\n </mat-icon>\n </div>\n\n <button\n adf-toggle-icon\n #toggleIconCancel=\"toggleIcon\"\n mat-icon-button\n *ngIf=\"canCancelUpload()\"\n (click)=\"onCancel(file)\"\n data-automation-id=\"cancel-upload-queue\"\n class=\"adf-file-uploading-row__group\"\n title=\"{{ 'ADF_FILE_UPLOAD.BUTTON.STOP_FILE' | translate }}\"\n [attr.aria-label]=\"'ADF_FILE_UPLOAD.ARIA-LABEL.STOP_FILE' | translate: { file: file.name }\">\n <mat-icon\n *ngIf=\"!toggleIconCancel.isToggled\"\n class=\"adf-file-uploading-row__status adf-file-uploading-row__status--pending\">\n schedule\n </mat-icon>\n\n <mat-icon\n *ngIf=\"toggleIconCancel.isToggled\"\n class=\"adf-file-uploading-row__action adf-file-uploading-row__action--remove\">\n remove_circle\n </mat-icon>\n </button>\n\n <div\n role=\"status\"\n *ngIf=\"isUploadError()\"\n class=\"adf-file-uploading-row__block adf-file-uploading-row__status--error\">\n <mat-icon matListItemIcon\n [attr.aria-label]=\"'ADF_FILE_UPLOAD.ARIA-LABEL.UPLOAD_FILE_ERROR' | translate: { error: file.errorCode | adfFileUploadError }\"\n [title]=\"file.errorCode | adfFileUploadError\">\n report_problem\n </mat-icon>\n </div>\n\n <div\n [attr.aria-label]=\"'ADF_FILE_UPLOAD.STATUS.FILE_CANCELED_STATUS' | translate\"\n role=\"status\"\n *ngIf=\"showCancelledStatus()\"\n class=\"adf-file-uploading-row__block adf-file-uploading-row__status--cancelled\">\n {{ 'ADF_FILE_UPLOAD.STATUS.FILE_CANCELED_STATUS' | translate }}\n </div>\n</div>\n", styles: ["adf-file-uploading-list-row:not(:first-child){display:block;border-top:1px solid var(--adf-theme-foreground-text-color-014)}.adf-file-uploading-row{display:flex;align-items:center;padding:.3em 1em;cursor:default}.adf-file-uploading-row:hover{background:#eee}.adf-file-uploading-row__name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto;padding:0 1em 0 .5em}.adf-file-uploading-row .adf-file-uploading-row__group,.adf-file-uploading-row .adf-file-uploading-row__block,.adf-file-uploading-row .adf-file-uploading-row__file-version{min-width:100px;display:flex;justify-content:flex-end;line-height:40px;height:40px;align-items:center;padding:0 12px}.adf-file-uploading-row__group--toggle{cursor:pointer;display:flex;align-items:center;height:40px;line-height:40px}.adf-file-uploading-row__status--done{color:var(--theme-accent-color)}.adf-file-uploading-row__status--error{color:var(--theme-warn-color);padding:0 12px}.adf-file-uploading-row__action--cancel,.adf-file-uploading-row__action--remove{color:var(--theme-warn-color)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatListModule }, { kind: "directive", type: i3.MatListItemIcon, selector: "[matListItemIcon]" }, { kind: "component", type: IconComponent, selector: "adf-icon", inputs: ["color", "fontSet", "value"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i4.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled", "tabIndex"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "directive", type: ToggleIconDirective, selector: "[adf-toggle-icon]", exportAs: ["toggleIcon"] }, { kind: "pipe", type: FileSizePipe, name: "adfFileSize" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "pipe", type: FileUploadErrorPipe, name: "adfFileUploadError" }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: FileUploadingListRowComponent, decorators: [{
type: Component,
args: [{ selector: 'adf-file-uploading-list-row', standalone: true, imports: [
CommonModule,
MatIconModule,
MatListModule,
IconComponent,
MatChipsModule,
TranslateModule,
ToggleIconDirective,
FileSizePipe,
MatButtonModule,
FileUploadErrorPipe
], encapsulation: ViewEncapsulation.None, template: "<div class=\"adf-file-uploading-row\">\n <mat-icon *ngIf=\"mimeType === 'default'\" matListItemIcon class=\"adf-file-uploading-row__type\">\n insert_drive_file\n </mat-icon>\n\n <adf-icon *ngIf=\"mimeType !== 'default'\" value=\"adf:{{ mimeType }}\" />\n\n <span\n class=\"adf-file-uploading-row__name\"\n title=\"{{ file.name }}\">\n {{ file.name }}\n </span>\n\n <span *ngIf=\"isUploadVersion()\" class=\"adf-file-uploading-row__version\" tabindex=\"0\" >\n <mat-chip color=\"primary\"\n [attr.aria-label]=\"'ADF_FILE_UPLOAD.ARIA-LABEL.VERSION' | translate: { version: versionNumber }\"\n [title]=\"'version' + versionNumber\"\n >{{ versionNumber }}</mat-chip>\n </span>\n\n <div\n tabindex=\"0\"\n role=\"button\"\n #toggleIcon=\"toggleIcon\"\n adf-toggle-icon\n (keyup.enter)=\"onCancel(file)\"\n (click)=\"onCancel(file)\"\n data-automation-id=\"cancel-upload-progress\"\n *ngIf=\"isUploading()\"\n [attr.aria-label]=\"'ADF_FILE_UPLOAD.ARIA-LABEL.STOP_FILE_UPLOAD' | translate: { file: file.name }\"\n class=\"adf-file-uploading-row__group adf-file-uploading-row__group--toggle\"\n title=\"{{ 'ADF_FILE_UPLOAD.BUTTON.STOP_FILE' | translate }}\">\n\n <span class=\"adf-file-uploading-row__status\" *ngIf=\"!toggleIcon.isToggled\">\n {{ file.progress.loaded | adfFileSize }} / {{ file.progress.total | adfFileSize }}\n </span>\n\n <mat-icon *ngIf=\"toggleIcon.isToggled\"\n class=\"adf-file-uploading-row__action adf-file-uploading-row__action--cancel\">\n clear\n </mat-icon>\n </div>\n\n <button mat-icon-button\n adf-toggle-icon\n #toggleIcon=\"toggleIcon\"\n *ngIf=\"isUploadComplete()\"\n class=\"adf-file-uploading-row__group\"\n [attr.aria-label]=\"'ADF_FILE_UPLOAD.ARIA-LABEL.UPLOAD_SUCCESSFUL' | translate: { file: file.name }\"\n title=\"{{ 'ADF_FILE_UPLOAD.BUTTON.UPLOAD_SUCCESSFUL' | translate }}\">\n\n <mat-icon\n class=\"adf-file-uploading-row__status adf-file-uploading-row__status--done\">\n check_circle\n </mat-icon>\n </button>\n\n <div\n *ngIf=\"isUploadVersionComplete()\"\n class=\"adf-file-uploading-row__file-version\"\n [attr.aria-label]=\"'ADF_FILE_UPLOAD.STATUS.FILE_DONE_STATUS' | translate\"\n >\n <mat-icon\n matListItemIcon\n class=\"adf-file-uploading-row__status--done\">\n check_circle\n </mat-icon>\n </div>\n\n <button\n adf-toggle-icon\n #toggleIconCancel=\"toggleIcon\"\n mat-icon-button\n *ngIf=\"canCancelUpload()\"\n (click)=\"onCancel(file)\"\n data-automation-id=\"cancel-upload-queue\"\n class=\"adf-file-uploading-row__group\"\n title=\"{{ 'ADF_FILE_UPLOAD.BUTTON.STOP_FILE' | translate }}\"\n [attr.aria-label]=\"'ADF_FILE_UPLOAD.ARIA-LABEL.STOP_FILE' | translate: { file: file.name }\">\n <mat-icon\n *ngIf=\"!toggleIconCancel.isToggled\"\n class=\"adf-file-uploading-row__status adf-file-uploading-row__status--pending\">\n schedule\n </mat-icon>\n\n <mat-icon\n *ngIf=\"toggleIconCancel.isToggled\"\n class=\"adf-file-uploading-row__action adf-file-uploading-row__action--remove\">\n remove_circle\n </mat-icon>\n </button>\n\n <div\n role=\"status\"\n *ngIf=\"isUploadError()\"\n class=\"adf-file-uploading-row__block adf-file-uploading-row__status--error\">\n <mat-icon matListItemIcon\n [attr.aria-label]=\"'ADF_FILE_UPLOAD.ARIA-LABEL.UPLOAD_FILE_ERROR' | translate: { error: file.errorCode | adfFileUploadError }\"\n [title]=\"file.errorCode | adfFileUploadError\">\n report_problem\n </mat-icon>\n </div>\n\n <div\n [attr.aria-label]=\"'ADF_FILE_UPLOAD.STATUS.FILE_CANCELED_STATUS' | translate\"\n role=\"status\"\n *ngIf=\"showCancelledStatus()\"\n class=\"adf-file-uploading-row__block adf-file-uploading-row__status--cancelled\">\n {{ 'ADF_FILE_UPLOAD.STATUS.FILE_CANCELED_STATUS' | translate }}\n </div>\n</div>\n", styles: ["adf-file-uploading-list-row:not(:first-child){display:block;border-top:1px solid var(--adf-theme-foreground-text-color-014)}.adf-file-uploading-row{display:flex;align-items:center;padding:.3em 1em;cursor:default}.adf-file-uploading-row:hover{background:#eee}.adf-file-uploading-row__name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto;padding:0 1em 0 .5em}.adf-file-uploading-row .adf-file-uploading-row__group,.adf-file-uploading-row .adf-file-uploading-row__block,.adf-file-uploading-row .adf-file-uploading-row__file-version{min-width:100px;display:flex;justify-content:flex-end;line-height:40px;height:40px;align-items:center;padding:0 12px}.adf-file-uploading-row__group--toggle{cursor:pointer;display:flex;align-items:center;height:40px;line-height:40px}.adf-file-uploading-row__status--done{color:var(--theme-accent-color)}.adf-file-uploading-row__status--error{color:var(--theme-warn-color);padding:0 12px}.adf-file-uploading-row__action--cancel,.adf-file-uploading-row__action--remove{color:var(--theme-warn-color)}\n"] }]
}], propDecorators: { file: [{
type: Input
}], cancel: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWRpbmctbGlzdC1yb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL2NvbnRlbnQtc2VydmljZXMvc3JjL2xpYi91cGxvYWQvY29tcG9uZW50cy9maWxlLXVwbG9hZGluZy1saXN0LXJvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvY29udGVudC1zZXJ2aWNlcy9zcmMvbGliL3VwbG9hZC9jb21wb25lbnRzL2ZpbGUtdXBsb2FkaW5nLWxpc3Qtcm93LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUNBQWlDLENBQUM7Ozs7Ozs7O0FBcUJ0RSxNQUFNLE9BQU8sNkJBQTZCO0lBbkIxQztRQXdCSSxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztLQTZDMUM7SUEzQ0csUUFBUSxDQUFDLElBQWU7UUFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELG1CQUFtQjtRQUNmLE9BQU8sQ0FDSCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxnQkFBZ0IsQ0FBQyxTQUFTO1lBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLGdCQUFnQixDQUFDLE9BQU87WUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssZ0JBQWdCLENBQUMsT0FBTyxDQUNoRCxDQUFDO0lBQ04sQ0FBQztJQUVELElBQUksYUFBYTtRQUNiLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksSUFBSSxTQUFTLENBQUM7SUFDOUMsQ0FBQztJQUVELGVBQWU7UUFDWCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDckgsQ0FBQztJQUVELGVBQWU7UUFDWCxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztJQUMxRCxDQUFDO0lBRUQsYUFBYTtRQUNULE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEtBQUssZ0JBQWdCLENBQUMsS0FBSyxDQUFDO0lBQ3hELENBQUM7SUFFRCxXQUFXO1FBQ1AsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssZ0JBQWdCLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNILENBQUM7SUFFRCxnQkFBZ0I7UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxLQUFLLGdCQUFnQixDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN0RixDQUFDO0lBRUQsdUJBQXVCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEtBQUssZ0JBQWdCLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNyRixDQUFDOzhHQWpEUSw2QkFBNkI7a0dBQTdCLDZCQUE2QixnSkNoRDFDLDh2SUErR0Esb2xDRDlFUSxZQUFZLGtJQUNaLGFBQWEsbUxBQ2IsYUFBYSwrR0FDYixhQUFhLDJGQUNiLGNBQWMsc1ZBQ2QsZUFBZSw0RkFDZixtQkFBbUIsbUZBQ25CLFlBQVksbURBQ1osZUFBZSx1SUFDZixtQkFBbUI7OzJGQU1kLDZCQUE2QjtrQkFuQnpDLFNBQVM7K0JBQ0ksNkJBQTZCLGNBQzNCLElBQUksV0FDUDt3QkFDTCxZQUFZO3dCQUNaLGFBQWE7d0JBQ2IsYUFBYTt3QkFDYixhQUFhO3dCQUNiLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZixtQkFBbUI7d0JBQ25CLFlBQVk7d0JBQ1osZUFBZTt3QkFDZixtQkFBbUI7cUJBQ3RCLGlCQUdjLGlCQUFpQixDQUFDLElBQUk7OEJBSXJDLElBQUk7c0JBREgsS0FBSztnQkFJTixNQUFNO3NCQURMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI1IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEZpbGVNb2RlbCwgRmlsZVVwbG9hZFN0YXR1cyB9IGZyb20gJy4uLy4uL2NvbW1vbi9tb2RlbHMvZmlsZS5tb2RlbCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRMaXN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGlzdCc7XG5pbXBvcnQgeyBGaWxlU2l6ZVBpcGUsIEljb25Db21wb25lbnQgfSBmcm9tICdAYWxmcmVzY28vYWRmLWNvcmUnO1xuaW1wb3J0IHsgTWF0Q2hpcHNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFRvZ2dsZUljb25EaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3RvZ2dsZS1pY29uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgRmlsZVVwbG9hZEVycm9yUGlwZSB9IGZyb20gJy4uL3BpcGVzL2ZpbGUtdXBsb2FkLWVycm9yLnBpcGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FkZi1maWxlLXVwbG9hZGluZy1saXN0LXJvdycsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgTWF0SWNvbk1vZHVsZSxcbiAgICAgICAgTWF0TGlzdE1vZHVsZSxcbiAgICAgICAgSWNvbkNvbXBvbmVudCxcbiAgICAgICAgTWF0Q2hpcHNNb2R1bGUsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgVG9nZ2xlSWNvbkRpcmVjdGl2ZSxcbiAgICAgICAgRmlsZVNpemVQaXBlLFxuICAgICAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgICAgIEZpbGVVcGxvYWRFcnJvclBpcGVcbiAgICBdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9maWxlLXVwbG9hZGluZy1saXN0LXJvdy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZmlsZS11cGxvYWRpbmctbGlzdC1yb3cuY29tcG9uZW50LnNjc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVVcGxvYWRpbmdMaXN0Um93Q29tcG9uZW50IHtcbiAgICBASW5wdXQoKVxuICAgIGZpbGU6IEZpbGVNb2RlbDtcblxuICAgIEBPdXRwdXQoKVxuICAgIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZU1vZGVsPigpO1xuXG4gICAgb25DYW5jZWwoZmlsZTogRmlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FuY2VsLmVtaXQoZmlsZSk7XG4gICAgfVxuXG4gICAgc2hvd0NhbmNlbGxlZFN0YXR1cygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuZmlsZS5zdGF0dXMgPT09IEZpbGVVcGxvYWRTdGF0dXMuQ2FuY2VsbGVkIHx8XG4gICAgICAgICAgICB0aGlzLmZpbGUuc3RhdHVzID09PSBGaWxlVXBsb2FkU3RhdHVzLkFib3J0ZWQgfHxcbiAgICAgICAgICAgIHRoaXMuZmlsZS5zdGF0dXMgPT09IEZpbGVVcGxvYWRTdGF0dXMuRGVsZXRlZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldCB2ZXJzaW9uTnVtYmVyKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbGUuZGF0YS5lbnRyeS5wcm9wZXJ0aWVzWydjbTp2ZXJzaW9uTGFiZWwnXTtcbiAgICB9XG5cbiAgICBnZXQgbWltZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZT8uZmlsZT8udHlwZSB8fCAnZGVmYXVsdCc7XG4gICAgfVxuXG4gICAgaXNVcGxvYWRWZXJzaW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmZpbGUuZGF0YSAmJiB0aGlzLmZpbGUub3B0aW9ucz8ubmV3VmVyc2lvbiAmJiB0aGlzLmZpbGUuZGF0YS5lbnRyeS5wcm9wZXJ0aWVzPy5bJ2NtOnZlcnNpb25MYWJlbCddO1xuICAgIH1cblxuICAgIGNhbkNhbmNlbFVwbG9hZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZT8uc3RhdHVzID09PSBGaWxlVXBsb2FkU3RhdHVzLlBlbmRpbmc7XG4gICAgfVxuXG4gICAgaXNVcGxvYWRFcnJvcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZT8uc3RhdHVzID09PSBGaWxlVXBsb2FkU3RhdHVzLkVycm9yO1xuICAgIH1cblxuICAgIGlzVXBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5maWxlICYmICh0aGlzLmZpbGUuc3RhdHVzID09PSBGaWxlVXBsb2FkU3RhdHVzLlByb2dyZXNzIHx8IHRoaXMuZmlsZS5zdGF0dXMgPT09IEZpbGVVcGxvYWRTdGF0dXMuU3RhcnRpbmcpO1xuICAgIH1cblxuICAgIGlzVXBsb2FkQ29tcGxldGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbGU/LnN0YXR1cyA9PT0gRmlsZVVwbG9hZFN0YXR1cy5Db21wbGV0ZSAmJiAhdGhpcy5pc1VwbG9hZFZlcnNpb24oKTtcbiAgICB9XG5cbiAgICBpc1VwbG9hZFZlcnNpb25Db21wbGV0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZT8uc3RhdHVzID09PSBGaWxlVXBsb2FkU3RhdHVzLkNvbXBsZXRlICYmIHRoaXMuaXNVcGxvYWRWZXJzaW9uKCk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImFkZi1maWxlLXVwbG9hZGluZy1yb3dcIj5cbiAgICA8bWF0LWljb24gKm5nSWY9XCJtaW1lVHlwZSA9PT0gJ2RlZmF1bHQnXCIgbWF0TGlzdEl0ZW1JY29uIGNsYXNzPVwiYWRmLWZpbGUtdXBsb2FkaW5nLXJvd19fdHlwZVwiPlxuICAgICAgICBpbnNlcnRfZHJpdmVfZmlsZVxuICAgIDwvbWF0LWljb24+XG5cbiAgICA8YWRmLWljb24gKm5nSWY9XCJtaW1lVHlwZSAhPT0gJ2RlZmF1bHQnXCIgdmFsdWU9XCJhZGY6e3sgbWltZVR5cGUgfX1cIiAvPlxuXG4gICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJhZGYtZmlsZS11cGxvYWRpbmctcm93X19uYW1lXCJcbiAgICAgICAgdGl0bGU9XCJ7eyBmaWxlLm5hbWUgfX1cIj5cbiAgICAgICAge3sgZmlsZS5uYW1lIH19XG4gICAgPC9zcGFuPlxuXG4gICAgPHNwYW4gKm5nSWY9XCJpc1VwbG9hZFZlcnNpb24oKVwiIGNsYXNzPVwiYWRmLWZpbGUtdXBsb2FkaW5nLXJvd19fdmVyc2lvblwiIHRhYmluZGV4PVwiMFwiID5cbiAgICAgICAgPG1hdC1jaGlwIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidBREZfRklMRV9VUExPQUQuQVJJQS1MQUJFTC5WRVJTSU9OJyB8IHRyYW5zbGF0ZTogeyB2ZXJzaW9uOiAgdmVyc2lvbk51bWJlciB9XCJcbiAgICAgICAgICAgIFt0aXRsZV09XCIndmVyc2lvbicgKyB2ZXJzaW9uTnVtYmVyXCJcbiAgICAgICAgPnt7IHZlcnNpb25OdW1iZXIgfX08L21hdC1jaGlwPlxuICAgIDwvc3Bhbj5cblxuICAgIDxkaXZcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICN0b2dnbGVJY29uPVwidG9nZ2xlSWNvblwiXG4gICAgICAgIGFkZi10b2dnbGUtaWNvblxuICAgICAgICAoa2V5dXAuZW50ZXIpPVwib25DYW5jZWwoZmlsZSlcIlxuICAgICAgICAoY2xpY2spPVwib25DYW5jZWwoZmlsZSlcIlxuICAgICAgICBkYXRhLWF1dG9tYXRpb24taWQ9XCJjYW5jZWwtdXBsb2FkLXByb2dyZXNzXCJcbiAgICAgICAgKm5nSWY9XCJpc1VwbG9hZGluZygpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQURGX0ZJTEVfVVBMT0FELkFSSUEtTEFCRUwuU1RPUF9GSUxFX1VQTE9BRCcgfCB0cmFuc2xhdGU6IHsgZmlsZTogZmlsZS5uYW1lIH1cIlxuICAgICAgICBjbGFzcz1cImFkZi1maWxlLXVwbG9hZGluZy1yb3dfX2dyb3VwIGFkZi1maWxlLXVwbG9hZGluZy1yb3dfX2dyb3VwLS10b2dnbGVcIlxuICAgICAgICB0aXRsZT1cInt7ICdBREZfRklMRV9VUExPQUQuQlVUVE9OLlNUT1BfRklMRScgfCB0cmFuc2xhdGUgfX1cIj5cblxuICAgICAgICA8c3BhbiBjbGFzcz1cImFkZi1maWxlLXVwbG9hZGluZy1yb3dfX3N0YXR1c1wiICpuZ0lmPVwiIXRvZ2dsZUljb24uaXNUb2dnbGVkXCI+XG4gICAgICAgICAgICB7eyBmaWxlLnByb2dyZXNzLmxvYWRlZCB8IGFkZkZpbGVTaXplIH19IC8ge3sgZmlsZS5wcm9ncmVzcy50b3RhbCB8IGFkZkZpbGVTaXplIH19XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJ0b2dnbGVJY29uLmlzVG9nZ2xlZFwiXG4gICAgICAgICAgICBjbGFzcz1cImFkZi1maWxlLXVwbG9hZGluZy1yb3dfX2FjdGlvbiBhZGYtZmlsZS11cGxvYWRpbmctcm93X19hY3Rpb24tLWNhbmNlbFwiPlxuICAgICAgICAgICAgY2xlYXJcbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uXG4gICAgICAgIGFkZi10b2dnbGUtaWNvblxuICAgICAgICAjdG9nZ2xlSWNvbj1cInRvZ2dsZUljb25cIlxuICAgICAgICAqbmdJZj1cImlzVXBsb2FkQ29tcGxldGUoKVwiXG4gICAgICAgIGNsYXNzPVwiYWRmLWZpbGUtdXBsb2FkaW5nLXJvd19fZ3JvdXBcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidBREZfRklMRV9VUExPQUQuQVJJQS1MQUJFTC5VUExPQURfU1VDQ0VTU0ZVTCcgfCB0cmFuc2xhdGU6IHsgZmlsZTogZmlsZS5uYW1lIH1cIlxuICAgICAgICB0aXRsZT1cInt7ICdBREZfRklMRV9VUExPQUQuQlVUVE9OLlVQTE9BRF9TVUNDRVNTRlVMJyB8IHRyYW5zbGF0ZSB9fVwiPlxuXG4gICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICAgY2xhc3M9XCJhZGYtZmlsZS11cGxvYWRpbmctcm93X19zdGF0dXMgYWRmLWZpbGUtdXBsb2FkaW5nLXJvd19fc3RhdHVzLS1kb25lXCI+XG4gICAgICAgICAgICBjaGVja19jaXJjbGVcbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJpc1VwbG9hZFZlcnNpb25Db21wbGV0ZSgpXCJcbiAgICAgICAgY2xhc3M9XCJhZGYtZmlsZS11cGxvYWRpbmctcm93X19maWxlLXZlcnNpb25cIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidBREZfRklMRV9VUExPQUQuU1RBVFVTLkZJTEVfRE9ORV9TVEFUVVMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgPlxuICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgIG1hdExpc3RJdGVtSWNvblxuICAgICAgICAgICAgY2xhc3M9XCJhZGYtZmlsZS11cGxvYWRpbmctcm93X19zdGF0dXMtLWRvbmVcIj5cbiAgICAgICAgICAgIGNoZWNrX2NpcmNsZVxuICAgICAgICA8L21hdC1pY29uPlxuICAgIDwvZGl2PlxuXG4gICAgPGJ1dHRvblxuICAgICAgICBhZGYtdG9nZ2xlLWljb25cbiAgICAgICAgI3RvZ2dsZUljb25DYW5jZWw9XCJ0b2dnbGVJY29uXCJcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICpuZ0lmPVwiY2FuQ2FuY2VsVXBsb2FkKClcIlxuICAgICAgICAoY2xpY2spPVwib25DYW5jZWwoZmlsZSlcIlxuICAgICAgICBkYXRhLWF1dG9tYXRpb24taWQ9XCJjYW5jZWwtdXBsb2FkLXF1ZXVlXCJcbiAgICAgICAgY2xhc3M9XCJhZGYtZmlsZS11cGxvYWRpbmctcm93X19ncm91cFwiXG4gICAgICAgIHRpdGxlPVwie3sgJ0FERl9GSUxFX1VQTE9BRC5CVVRUT04uU1RPUF9GSUxFJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0FERl9GSUxFX1VQTE9BRC5BUklBLUxBQkVMLlNUT1BfRklMRScgfCB0cmFuc2xhdGU6IHsgZmlsZTogZmlsZS5uYW1lIH1cIj5cbiAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAqbmdJZj1cIiF0b2dnbGVJY29uQ2FuY2VsLmlzVG9nZ2xlZFwiXG4gICAgICAgICAgICBjbGFzcz1cImFkZi1maWxlLXVwbG9hZGluZy1yb3dfX3N0YXR1cyBhZGYtZmlsZS11cGxvYWRpbmctcm93X19zdGF0dXMtLXBlbmRpbmdcIj5cbiAgICAgICAgICAgIHNjaGVkdWxlXG4gICAgICAgIDwvbWF0LWljb24+XG5cbiAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAqbmdJZj1cInRvZ2dsZUljb25DYW5jZWwuaXNUb2dnbGVkXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYWRmLWZpbGUtdXBsb2FkaW5nLXJvd19fYWN0aW9uIGFkZi1maWxlLXVwbG9hZGluZy1yb3dfX2FjdGlvbi0tcmVtb3ZlXCI+XG4gICAgICAgICAgICByZW1vdmVfY2lyY2xlXG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG5cbiAgICA8ZGl2XG4gICAgICAgIHJvbGU9XCJzdGF0dXNcIlxuICAgICAgICAqbmdJZj1cImlzVXBsb2FkRXJyb3IoKVwiXG4gICAgICAgIGNsYXNzPVwiYWRmLWZpbGUtdXBsb2FkaW5nLXJvd19fYmxvY2sgYWRmLWZpbGUtdXBsb2FkaW5nLXJvd19fc3RhdHVzLS1lcnJvclwiPlxuICAgICAgICA8bWF0LWljb24gbWF0TGlzdEl0ZW1JY29uXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidBREZfRklMRV9VUExPQUQuQVJJQS1MQUJFTC5VUExPQURfRklMRV9FUlJPUicgfCB0cmFuc2xhdGU6IHsgZXJyb3I6IGZpbGUuZXJyb3JDb2RlIHwgYWRmRmlsZVVwbG9hZEVycm9yIH1cIlxuICAgICAgICAgICAgW3RpdGxlXT1cImZpbGUuZXJyb3JDb2RlIHwgYWRmRmlsZVVwbG9hZEVycm9yXCI+XG4gICAgICAgICAgICByZXBvcnRfcHJvYmxlbVxuICAgICAgICA8L21hdC1pY29uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidBREZfRklMRV9VUExPQUQuU1RBVFVTLkZJTEVfQ0FOQ0VMRURfU1RBVFVTJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIHJvbGU9XCJzdGF0dXNcIlxuICAgICAgICAqbmdJZj1cInNob3dDYW5jZWxsZWRTdGF0dXMoKVwiXG4gICAgICAgIGNsYXNzPVwiYWRmLWZpbGUtdXBsb2FkaW5nLXJvd19fYmxvY2sgYWRmLWZpbGUtdXBsb2FkaW5nLXJvd19fc3RhdHVzLS1jYW5jZWxsZWRcIj5cbiAgICAgICAge3sgJ0FERl9GSUxFX1VQTE9BRC5TVEFUVVMuRklMRV9DQU5DRUxFRF9TVEFUVVMnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==