@eternalheart/ngx-file-preview
Version:
A powerful Angular file preview component library supporting multiple file formats including images, videos, PDFs, Office documents, text files and more.
64 lines • 19.7 kB
JavaScript
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { NgIf } from "@angular/common";
import { BasePreviewComponent } from "../base-preview/base-preview.component";
import { MarkdownPipe } from "./markdown.pipe";
import { PreviewIconComponent } from '../../components';
import { I18nPipe } from "../../i18n";
import * as i0 from "@angular/core";
export class MarkdownPreviewComponent extends BasePreviewComponent {
constructor() {
super(...arguments);
this.content = "";
this.scale = 1;
this.SCALE_STEP = 0.1;
this.MAX_SCALE = 3;
this.MIN_SCALE = 0.1;
this.DEFAULT_SCALE = 1;
}
ngOnChanges(simpleChanges) {
if (simpleChanges['file'] && this.file) {
this.loadFile("text").then(() => {
});
}
}
async handleFileContent(content) {
const { text = "" } = content;
this.content = text;
}
zoomIn() {
if (this.scale < this.MAX_SCALE) {
this.scale = Math.min(this.MAX_SCALE, this.scale + this.SCALE_STEP);
this.cdr.markForCheck();
}
}
zoomOut() {
if (this.scale > this.MIN_SCALE) {
this.scale = Math.max(this.MIN_SCALE, this.scale - this.SCALE_STEP);
this.cdr.markForCheck();
}
}
resetZoom() {
this.scale = this.DEFAULT_SCALE;
this.cdr.markForCheck();
}
toggleFullscreen() {
if (!document.fullscreenElement) {
document.documentElement.requestFullscreen();
}
else {
document.exitFullscreen();
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MarkdownPreviewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MarkdownPreviewComponent, isStandalone: true, selector: "ngx-markdown-preview", usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"markdown-container\">\n <div class=\"toolbar\">\n <div class=\"left-controls\">\n <button class=\"tool-btn\" (click)=\"zoomOut()\">\n <preview-icon [themeMode]=\"themeMode\" name=\"zoom-out\" [title]=\"'preview.toolbar.zoomOut'|i18n\"></preview-icon>\n </button>\n <span class=\"zoom-text\" (click)=\"resetZoom()\" [title]=\"'preview.toolbar.resetZoom'|i18n\">\n {{ (scale * 100).toFixed(0) }}%\n </span>\n <button class=\"tool-btn\" (click)=\"zoomIn()\">\n <preview-icon [themeMode]=\"themeMode\" name=\"zoom-in\" [title]=\"'preview.toolbar.zoomIn'|i18n\"></preview-icon>\n </button>\n </div>\n <div class=\"right-controls\">\n <button class=\"tool-btn\" (click)=\"toggleFullscreen()\">\n <preview-icon [themeMode]=\"themeMode\" name=\"fullscreen\" [title]=\"'preview.toolbar.fullscreen'|i18n\"></preview-icon>\n </button>\n </div>\n </div>\n\n <div class=\"content-container\">\n <div class=\"viewer\" [innerHTML]=\"content|markdown\"></div>\n </div>\n</div>\n", styles: [":root{--nfp-primary-color: #177ddc;--nfp-primary-hover: #1890ff;--nfp-primary-active: #0050b3;--nfp-error-color: #d32029;--nfp-warning-color: #d89614;--nfp-success-color: #49aa19;--nfp-text-primary: rgba(0, 0, 0, .85);--nfp-text-secondary: rgba(0, 0, 0, .65);--nfp-text-disabled: rgba(0, 0, 0, .25);--nfp-bg-container: #ffffff;--nfp-bg-elevated: #fafafa;--nfp-bg-layout: #f0f2f5;--nfp-hover-bg: rgba(0, 0, 0, .04);--nfp-border-color: #d9d9d9;--nfp-split-color: rgba(0, 0, 0, .06);--nfp-scrollbar-bg: #ffffff;--nfp-scrollbar-thumb: #d9d9d9;--nfp-toolbar-bg: #fafafa;--nfp-toolbar-border: #d9d9d9;--nfp-toolbar-hover: rgba(0, 0, 0, .04);--nfp-toolbar-active: #e6f4ff;--nfp-preview-mask: rgba(0, 0, 0, .3);--nfp-preview-loading-bg: rgba(255, 255, 255, .8);--nfp-preview-toolbar-bg: rgba(0, 0, 0, .1);--nfp-theme-transition-duration: .3s}[data-nfp-theme=dark]{--nfp-primary-color: #177ddc;--nfp-primary-hover: #1890ff;--nfp-primary-active: #0050b3;--nfp-error-color: #a61d24;--nfp-warning-color: #d89614;--nfp-success-color: #49aa19;--nfp-text-primary: rgba(255, 255, 255, .85);--nfp-text-secondary: rgba(255, 255, 255, .65);--nfp-text-disabled: rgba(255, 255, 255, .25);--nfp-bg-container: #1a1a1a;--nfp-bg-elevated: #262626;--nfp-bg-layout: #141414;--nfp-hover-bg: rgba(255, 255, 255, .08);--nfp-border-color: #303030;--nfp-split-color: rgba(255, 255, 255, .12);--nfp-scrollbar-bg: #1a1a1a;--nfp-scrollbar-thumb: #404040;--nfp-toolbar-bg: #262626;--nfp-toolbar-border: #303030;--nfp-toolbar-hover: rgba(255, 255, 255, .08);--nfp-toolbar-active: #111b26;--nfp-preview-mask: rgba(0, 0, 0, .65);--nfp-preview-loading-bg: rgba(0, 0, 0, .8);--nfp-preview-toolbar-bg: rgba(0, 0, 0, .4);--nfp-theme-transition-duration: .3s}*{transition:background-color var(--nfp-theme-transition-duration) var(--theme-transition-timing),border-color var(--nfp-theme-transition-duration) var(--theme-transition-timing),color var(--nfp-theme-transition-duration) var(--theme-transition-timing)}.no-transition,.no-transition *{transition:none!important}\n", ":host{display:block;width:100%;height:100%}.markdown-container{width:100%;height:100%;display:flex;flex-direction:column;background:var(--nfp-bg-container);border-radius:8px;overflow:hidden}.toolbar{height:48px;min-height:48px;background:var(--nfp-toolbar-bg);display:flex;justify-content:space-between;align-items:center;padding:0 16px;border-bottom:1px solid var(--nfp-toolbar-border);gap:16px}.left-controls{display:flex;align-items:center;gap:8px}.content-container{flex:1;overflow:auto;position:relative;background:var(--nfp-bg-container);padding:16px;scrollbar-width:thin;scrollbar-color:var(--nfp-scrollbar-thumb) var(--nfp-scrollbar-bg)}.content-container .viewer h1{font-size:2em}.content-container .viewer pre{background:#f5f5f5}.content-container::-webkit-scrollbar{width:8px;height:8px}.content-container::-webkit-scrollbar-track{background:var(--nfp-scrollbar-bg);border-radius:4px}.content-container::-webkit-scrollbar-thumb{background:var(--nfp-scrollbar-thumb);border-radius:4px}.content-container::-webkit-scrollbar-thumb:hover{background:var(--nfp-primary-color)}.content-wrapper{min-width:min-content;width:calc(100% * var(--scale, 1));height:calc(100% * var(--scale, 1));font-size:calc(16px * var(--scale, 1))}.tool-btn{background:transparent;border:none;color:var(--nfp-text-primary);width:32px;height:32px;padding:0;cursor:pointer;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .2s}.tool-btn:hover{background:var(--nfp-toolbar-hover);color:var(--nfp-primary-color)}.tool-btn:disabled{color:var(--nfp-text-disabled);cursor:not-allowed}.zoom-text{color:var(--nfp-text-primary);font-size:13px;min-width:48px;text-align:center;cursor:pointer;padding:4px;border-radius:4px}.zoom-text:hover{background:var(--nfp-toolbar-hover);color:var(--nfp-primary-color)}\n"], dependencies: [{ kind: "component", type: PreviewIconComponent, selector: "preview-icon", inputs: ["name", "svg", "size", "color", "themeMode", "title", "cursor"] }, { kind: "pipe", type: MarkdownPipe, name: "markdown" }, { kind: "pipe", type: I18nPipe, name: "i18n" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MarkdownPreviewComponent, decorators: [{
type: Component,
args: [{ selector: 'ngx-markdown-preview', standalone: true, imports: [
NgIf,
PreviewIconComponent,
MarkdownPipe,
I18nPipe
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"markdown-container\">\n <div class=\"toolbar\">\n <div class=\"left-controls\">\n <button class=\"tool-btn\" (click)=\"zoomOut()\">\n <preview-icon [themeMode]=\"themeMode\" name=\"zoom-out\" [title]=\"'preview.toolbar.zoomOut'|i18n\"></preview-icon>\n </button>\n <span class=\"zoom-text\" (click)=\"resetZoom()\" [title]=\"'preview.toolbar.resetZoom'|i18n\">\n {{ (scale * 100).toFixed(0) }}%\n </span>\n <button class=\"tool-btn\" (click)=\"zoomIn()\">\n <preview-icon [themeMode]=\"themeMode\" name=\"zoom-in\" [title]=\"'preview.toolbar.zoomIn'|i18n\"></preview-icon>\n </button>\n </div>\n <div class=\"right-controls\">\n <button class=\"tool-btn\" (click)=\"toggleFullscreen()\">\n <preview-icon [themeMode]=\"themeMode\" name=\"fullscreen\" [title]=\"'preview.toolbar.fullscreen'|i18n\"></preview-icon>\n </button>\n </div>\n </div>\n\n <div class=\"content-container\">\n <div class=\"viewer\" [innerHTML]=\"content|markdown\"></div>\n </div>\n</div>\n", styles: [":root{--nfp-primary-color: #177ddc;--nfp-primary-hover: #1890ff;--nfp-primary-active: #0050b3;--nfp-error-color: #d32029;--nfp-warning-color: #d89614;--nfp-success-color: #49aa19;--nfp-text-primary: rgba(0, 0, 0, .85);--nfp-text-secondary: rgba(0, 0, 0, .65);--nfp-text-disabled: rgba(0, 0, 0, .25);--nfp-bg-container: #ffffff;--nfp-bg-elevated: #fafafa;--nfp-bg-layout: #f0f2f5;--nfp-hover-bg: rgba(0, 0, 0, .04);--nfp-border-color: #d9d9d9;--nfp-split-color: rgba(0, 0, 0, .06);--nfp-scrollbar-bg: #ffffff;--nfp-scrollbar-thumb: #d9d9d9;--nfp-toolbar-bg: #fafafa;--nfp-toolbar-border: #d9d9d9;--nfp-toolbar-hover: rgba(0, 0, 0, .04);--nfp-toolbar-active: #e6f4ff;--nfp-preview-mask: rgba(0, 0, 0, .3);--nfp-preview-loading-bg: rgba(255, 255, 255, .8);--nfp-preview-toolbar-bg: rgba(0, 0, 0, .1);--nfp-theme-transition-duration: .3s}[data-nfp-theme=dark]{--nfp-primary-color: #177ddc;--nfp-primary-hover: #1890ff;--nfp-primary-active: #0050b3;--nfp-error-color: #a61d24;--nfp-warning-color: #d89614;--nfp-success-color: #49aa19;--nfp-text-primary: rgba(255, 255, 255, .85);--nfp-text-secondary: rgba(255, 255, 255, .65);--nfp-text-disabled: rgba(255, 255, 255, .25);--nfp-bg-container: #1a1a1a;--nfp-bg-elevated: #262626;--nfp-bg-layout: #141414;--nfp-hover-bg: rgba(255, 255, 255, .08);--nfp-border-color: #303030;--nfp-split-color: rgba(255, 255, 255, .12);--nfp-scrollbar-bg: #1a1a1a;--nfp-scrollbar-thumb: #404040;--nfp-toolbar-bg: #262626;--nfp-toolbar-border: #303030;--nfp-toolbar-hover: rgba(255, 255, 255, .08);--nfp-toolbar-active: #111b26;--nfp-preview-mask: rgba(0, 0, 0, .65);--nfp-preview-loading-bg: rgba(0, 0, 0, .8);--nfp-preview-toolbar-bg: rgba(0, 0, 0, .4);--nfp-theme-transition-duration: .3s}*{transition:background-color var(--nfp-theme-transition-duration) var(--theme-transition-timing),border-color var(--nfp-theme-transition-duration) var(--theme-transition-timing),color var(--nfp-theme-transition-duration) var(--theme-transition-timing)}.no-transition,.no-transition *{transition:none!important}\n", ":host{display:block;width:100%;height:100%}.markdown-container{width:100%;height:100%;display:flex;flex-direction:column;background:var(--nfp-bg-container);border-radius:8px;overflow:hidden}.toolbar{height:48px;min-height:48px;background:var(--nfp-toolbar-bg);display:flex;justify-content:space-between;align-items:center;padding:0 16px;border-bottom:1px solid var(--nfp-toolbar-border);gap:16px}.left-controls{display:flex;align-items:center;gap:8px}.content-container{flex:1;overflow:auto;position:relative;background:var(--nfp-bg-container);padding:16px;scrollbar-width:thin;scrollbar-color:var(--nfp-scrollbar-thumb) var(--nfp-scrollbar-bg)}.content-container .viewer h1{font-size:2em}.content-container .viewer pre{background:#f5f5f5}.content-container::-webkit-scrollbar{width:8px;height:8px}.content-container::-webkit-scrollbar-track{background:var(--nfp-scrollbar-bg);border-radius:4px}.content-container::-webkit-scrollbar-thumb{background:var(--nfp-scrollbar-thumb);border-radius:4px}.content-container::-webkit-scrollbar-thumb:hover{background:var(--nfp-primary-color)}.content-wrapper{min-width:min-content;width:calc(100% * var(--scale, 1));height:calc(100% * var(--scale, 1));font-size:calc(16px * var(--scale, 1))}.tool-btn{background:transparent;border:none;color:var(--nfp-text-primary);width:32px;height:32px;padding:0;cursor:pointer;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .2s}.tool-btn:hover{background:var(--nfp-toolbar-hover);color:var(--nfp-primary-color)}.tool-btn:disabled{color:var(--nfp-text-disabled);cursor:not-allowed}.zoom-text{color:var(--nfp-text-primary);font-size:13px;min-width:48px;text-align:center;cursor:pointer;padding:4px;border-radius:4px}.zoom-text:hover{background:var(--nfp-toolbar-hover);color:var(--nfp-primary-color)}\n"] }]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24tcHJldmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25neC1maWxlLXByZXZpZXcvc3JjL2xpYi9wcmV2aWV3LXR5cGVzL21hcmtkb3duLXByZXZpZXcvbWFya2Rvd24tcHJldmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25neC1maWxlLXByZXZpZXcvc3JjL2xpYi9wcmV2aWV3LXR5cGVzL21hcmtkb3duLXByZXZpZXcvbWFya2Rvd24tcHJldmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDckMsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sd0NBQXdDLENBQUM7QUFDNUUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBRXRELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7O0FBZXBDLE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxvQkFBb0I7SUFibEU7O1FBY0UsWUFBTyxHQUFXLEVBQUUsQ0FBQztRQUNyQixVQUFLLEdBQUcsQ0FBQyxDQUFDO1FBRU8sZUFBVSxHQUFHLEdBQUcsQ0FBQztRQUNqQixjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsY0FBUyxHQUFHLEdBQUcsQ0FBQztRQUNoQixrQkFBYSxHQUFHLENBQUMsQ0FBQztLQXlDcEM7SUF2Q0MsV0FBVyxDQUFDLGFBQTRCO1FBQ3RDLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDaEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVrQixLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBMkI7UUFDcEUsTUFBTSxFQUFDLElBQUksR0FBRyxFQUFFLEVBQUMsR0FBRyxPQUFPLENBQUM7UUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDdEIsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRTFCLENBQUM7SUFDSCxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNoQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDaEMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQy9DLENBQUM7YUFBTSxDQUFDO1lBQ04sUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDOytHQS9DVSx3QkFBd0I7bUdBQXhCLHdCQUF3Qiw0SENyQnJDLGdqQ0F3QkEsbTBIRFhJLG9CQUFvQiw4SEFDcEIsWUFBWSw0Q0FDWixRQUFROzs0RkFNQyx3QkFBd0I7a0JBYnBDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUDt3QkFDUCxJQUFJO3dCQUNKLG9CQUFvQjt3QkFDcEIsWUFBWTt3QkFDWixRQUFRO3FCQUNULG1CQUdnQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBTaW1wbGVDaGFuZ2VzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TmdJZn0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHtCYXNlUHJldmlld0NvbXBvbmVudH0gZnJvbSBcIi4uL2Jhc2UtcHJldmlldy9iYXNlLXByZXZpZXcuY29tcG9uZW50XCI7XG5pbXBvcnQge01hcmtkb3duUGlwZX0gZnJvbSBcIi4vbWFya2Rvd24ucGlwZVwiO1xuaW1wb3J0IHtQcmV2aWV3SWNvbkNvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cyc7XG5pbXBvcnQge0ZpbGVSZWFkZXJSZXNwb25zZX0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzXCI7XG5pbXBvcnQge0kxOG5QaXBlfSBmcm9tIFwiLi4vLi4vaTE4blwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtbWFya2Rvd24tcHJldmlldycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBOZ0lmLFxuICAgIFByZXZpZXdJY29uQ29tcG9uZW50LFxuICAgIE1hcmtkb3duUGlwZSxcbiAgICBJMThuUGlwZVxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vbWFya2Rvd24tcHJldmlldy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuLi8uLi9zdHlsZXMvX3RoZW1lLnNjc3MnLCAnLi9tYXJrZG93bi1wcmV2aWV3LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE1hcmtkb3duUHJldmlld0NvbXBvbmVudCBleHRlbmRzIEJhc2VQcmV2aWV3Q29tcG9uZW50IHtcbiAgY29udGVudDogc3RyaW5nID0gXCJcIjtcbiAgc2NhbGUgPSAxO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgU0NBTEVfU1RFUCA9IDAuMTtcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfU0NBTEUgPSAzO1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9TQ0FMRSA9IDAuMTtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX1NDQUxFID0gMTtcblxuICBuZ09uQ2hhbmdlcyhzaW1wbGVDaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKHNpbXBsZUNoYW5nZXNbJ2ZpbGUnXSAmJiB0aGlzLmZpbGUpIHtcbiAgICAgIHRoaXMubG9hZEZpbGUoXCJ0ZXh0XCIpLnRoZW4oKCkgPT4ge1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGhhbmRsZUZpbGVDb250ZW50KGNvbnRlbnQ6IEZpbGVSZWFkZXJSZXNwb25zZSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qge3RleHQgPSBcIlwifSA9IGNvbnRlbnQ7XG4gICAgdGhpcy5jb250ZW50ID0gdGV4dDtcbiAgfVxuXG4gIHpvb21JbigpIHtcbiAgICBpZiAodGhpcy5zY2FsZSA8IHRoaXMuTUFYX1NDQUxFKSB7XG4gICAgICB0aGlzLnNjYWxlID0gTWF0aC5taW4odGhpcy5NQVhfU0NBTEUsIHRoaXMuc2NhbGUgKyB0aGlzLlNDQUxFX1NURVApO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgem9vbU91dCgpIHtcbiAgICBpZiAodGhpcy5zY2FsZSA+IHRoaXMuTUlOX1NDQUxFKSB7XG4gICAgICB0aGlzLnNjYWxlID0gTWF0aC5tYXgodGhpcy5NSU5fU0NBTEUsIHRoaXMuc2NhbGUgLSB0aGlzLlNDQUxFX1NURVApO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICB9XG4gIH1cblxuICByZXNldFpvb20oKSB7XG4gICAgdGhpcy5zY2FsZSA9IHRoaXMuREVGQVVMVF9TQ0FMRTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHRvZ2dsZUZ1bGxzY3JlZW4oKSB7XG4gICAgaWYgKCFkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCkge1xuICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnJlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKCk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibWFya2Rvd24tY29udGFpbmVyXCI+XG4gIDxkaXYgY2xhc3M9XCJ0b29sYmFyXCI+XG4gICAgPGRpdiBjbGFzcz1cImxlZnQtY29udHJvbHNcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJ0b29sLWJ0blwiIChjbGljayk9XCJ6b29tT3V0KClcIj5cbiAgICAgICAgPHByZXZpZXctaWNvbiBbdGhlbWVNb2RlXT1cInRoZW1lTW9kZVwiIG5hbWU9XCJ6b29tLW91dFwiIFt0aXRsZV09XCIncHJldmlldy50b29sYmFyLnpvb21PdXQnfGkxOG5cIj48L3ByZXZpZXctaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHNwYW4gY2xhc3M9XCJ6b29tLXRleHRcIiAoY2xpY2spPVwicmVzZXRab29tKClcIiBbdGl0bGVdPVwiJ3ByZXZpZXcudG9vbGJhci5yZXNldFpvb20nfGkxOG5cIj5cbiAgICAgICAgICAgIHt7IChzY2FsZSAqIDEwMCkudG9GaXhlZCgwKSB9fSVcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwidG9vbC1idG5cIiAoY2xpY2spPVwiem9vbUluKClcIj5cbiAgICAgICAgPHByZXZpZXctaWNvbiBbdGhlbWVNb2RlXT1cInRoZW1lTW9kZVwiIG5hbWU9XCJ6b29tLWluXCIgW3RpdGxlXT1cIidwcmV2aWV3LnRvb2xiYXIuem9vbUluJ3xpMThuXCI+PC9wcmV2aWV3LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicmlnaHQtY29udHJvbHNcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJ0b29sLWJ0blwiIChjbGljayk9XCJ0b2dnbGVGdWxsc2NyZWVuKClcIj5cbiAgICAgICAgPHByZXZpZXctaWNvbiBbdGhlbWVNb2RlXT1cInRoZW1lTW9kZVwiIG5hbWU9XCJmdWxsc2NyZWVuXCIgW3RpdGxlXT1cIidwcmV2aWV3LnRvb2xiYXIuZnVsbHNjcmVlbid8aTE4blwiPjwvcHJldmlldy1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJjb250ZW50LWNvbnRhaW5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJ2aWV3ZXJcIiBbaW5uZXJIVE1MXT1cImNvbnRlbnR8bWFya2Rvd25cIj48L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==