UNPKG

@mescius/activereportsjs-angular

Version:

ActiveReportsJS components for Angular

274 lines 33.2 kB
import { Component, Input, ViewEncapsulation, EventEmitter, Output, Inject, Optional, ViewChild, } from '@angular/core'; import { ReportViewer as ViewerNs } from '@mescius/activereportsjs'; import { AR_EXPORTS } from '../export-injectiontoken'; import * as i0 from "@angular/core"; export class ViewerComponent { get supportedExportKeys() { return (this.supportedExports || []).map((e) => e.key); } constructor(supportedExports) { this.supportedExports = supportedExports; this._initProps = []; this.width = '100%'; this.height = '100%'; this.availableExports = []; this.init = new EventEmitter(); this.reportLoaded = new EventEmitter(); this.documentLoaded = new EventEmitter(); this._propSetters = { sidebarVisible: (value) => { this._viewer.toggleSidebar(value); }, toolbarVisible: (value) => { this._viewer.toggleToolbar(value); }, fullscreen: (value) => { this._viewer.toggleFullScreen(value); }, availableExports: (value) => { if (value && value.length > 0) { const supportedValues = value.filter((v) => this.supportedExportKeys.indexOf(v) >= 0); // set ['disabled'] to hide export panel if no exports supported this._viewer.availableExports = supportedValues.length ? supportedValues : ['disabled']; } else { // set explicit list to avoid side effects of global exports initialization this._viewer.availableExports = this.supportedExportKeys.length ? this.supportedExportKeys : ['disabled']; } }, mouseMode: (value) => { this._viewer.mouseMode = value; }, theme: (value) => { this._viewer.theme = value; }, renderMode: (value) => { this._viewer.renderMode = value; }, viewMode: (value) => { this._viewer.viewMode = value; }, zoom: (value) => { this._viewer.zoom = value; }, errorHandler: (value) => { this._viewer.errorHandler = value; }, showParametersOnOpen: (value) => { this._viewer.showParametersOnOpen = value; }, }; this._disposables = []; } ngOnChanges(changes) { for (const prop of Object.keys(changes)) { const setter = this._propSetters[prop]; if (!setter) { continue; } const value = changes[prop].currentValue; if (this._viewer) { setter(value); } else { this._initProps.push(() => setter(value)); } } } ngAfterViewInit() { this.initViewer().then(() => this.init.emit(this)); } ngOnDestroy() { while (this._disposables.length) { this._disposables.shift()(); } this._viewer.dispose(); } get ref() { return this._viewer; } async initViewer() { for (const supportedExport of this.supportedExports || []) { await supportedExport.init(); } this._viewer = new ViewerNs.Viewer(this.rootElement.nativeElement, { language: this.language, themeConfig: this.themeConfig, PanelsLayout: this.panelsLayout, ParameterPanelLocation: this.parameterPanelLocation, memoizeData: this.memoizeData, ToolbarLayout: this.toolbarLayout, ExportsSettings: this.exportsSettings, }); this._disposables.push(this._viewer.reportLoaded.register((args) => this.reportLoaded.emit(args)), this._viewer.documentLoaded.register((args) => this.documentLoaded.emit(args))); this._propSetters.availableExports(this.availableExports); while (this._initProps.length) { this._initProps.shift()(); } } /** * Opens report from file or as definition (json string)). * * @param report The report template. Can be report URI, or report definition, or instance of PageReport class. * @param settings Additional settings for report (name, parameters). */ open(report, settings) { return this._viewer.open(report, settings); } /** * Exports currently displayed report to specified output format. Returns object which contains * result data as blob object | string and download function. So you could either use this blob object or download file immediately. * Please note that you can specify settings in PDF export as plain list * (like **{title: 'Title', author: 'Author Name', ownerPassword: '1'}** etc... * * ```javascript * var options = {filename:"Invoice List"}; * var cancelCallback = function(){ * return false; // continue export. Return true to cancel export process * } * viewer.export('pdf', options, {cancel: cancelCallback }).then(result => doSmthWithBlob(result.data)); * //or you can download file * viewer.export('pdf', options, {cancel: cancelCallback }).then(result => result.download('Invoice List')); * ``` * * @param format Export format identifier. One of 'pdf', 'xlsx', 'html', 'tabular-data'. * @param settings Format specific export settings. * @param params Additional export customization. */ export(format, settings, params) { return this._viewer.export(format, settings, params); } /** * Resets current viewer document */ resetDocument() { return this._viewer.resetDocument(); } /** * Prints currently displayed report. */ print() { return this._viewer.print(); } /** Gets current page number (1-based). Returns 0 if no document loaded. */ get currentPage() { return this._viewer.currentPage; } /** Gets the total number of pages available in report. */ get pageCount() { return this._viewer.pageCount; } /** Provides access to the "history" API. */ get history() { return this._viewer.history; } /** Gets the toolbar API */ get toolbar() { return this._viewer.toolbar; } /** Navigates to the first page. */ goToFirstPage() { return this._viewer.goToFirstPage(); } /** Navigates to the previous page. */ goToPrevPage() { return this._viewer.goToPrevPage(); } /** Navigates to the next page. */ goToNextPage() { return this._viewer.goToNextPage(); } /** Navigates to the last page. */ goToLastPage() { return this._viewer.goToLastPage(); } /** Navigates to the specified page (starting from 1). */ goToPage(pageNumber) { return this._viewer.goToPage(pageNumber); } /** Performs backToParent action which will return user to parent report. */ backToParent() { return this._viewer.backToParent(); } /** Performs refresh operation in report (re-render report). */ refresh() { return this._viewer.refresh(); } /** Gets **true** if backToParent command is applicable to current document. */ get canBackToParent() { return this._viewer.canBackToParent(); } /** * Performs search operation in currently rendered report. Allows you to create your own custom search pane. */ search(options, resultFn, progressFn, cancel) { return this._viewer.search(options, resultFn, progressFn, cancel); } /** * Highlights the search result returned by a search method. */ highlight(result) { return this._viewer.highlight(result); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ViewerComponent, deps: [{ token: AR_EXPORTS, optional: true }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ViewerComponent, selector: "gc-activereports-viewer", inputs: { width: "width", height: "height", language: "language", theme: "theme", themeConfig: "themeConfig", panelsLayout: "panelsLayout", parameterPanelLocation: "parameterPanelLocation", showParametersOnOpen: "showParametersOnOpen", memoizeData: "memoizeData", toolbarLayout: "toolbarLayout", exportsSettings: "exportsSettings", availableExports: "availableExports", mouseMode: "mouseMode", renderMode: "renderMode", viewMode: "viewMode", zoom: "zoom", fullscreen: "fullscreen", toolbarVisible: "toolbarVisible", sidebarVisible: "sidebarVisible", errorHandler: "errorHandler" }, outputs: { init: "init", reportLoaded: "reportLoaded", documentLoaded: "documentLoaded" }, viewQueries: [{ propertyName: "rootElement", first: true, predicate: ["viewerRoot"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #viewerRoot [style.width]=\"width\" [style.height]=\"height\"></div>\n", encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ViewerComponent, decorators: [{ type: Component, args: [{ selector: 'gc-activereports-viewer', encapsulation: ViewEncapsulation.None, template: "<div #viewerRoot [style.width]=\"width\" [style.height]=\"height\"></div>\n" }] }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Inject, args: [AR_EXPORTS] }, { type: Optional }] }], propDecorators: { rootElement: [{ type: ViewChild, args: ['viewerRoot', { static: false }] }], width: [{ type: Input }], height: [{ type: Input }], language: [{ type: Input }], theme: [{ type: Input }], themeConfig: [{ type: Input }], panelsLayout: [{ type: Input }], parameterPanelLocation: [{ type: Input }], showParametersOnOpen: [{ type: Input }], memoizeData: [{ type: Input }], toolbarLayout: [{ type: Input }], exportsSettings: [{ type: Input }], availableExports: [{ type: Input }], mouseMode: [{ type: Input }], renderMode: [{ type: Input }], viewMode: [{ type: Input }], zoom: [{ type: Input }], fullscreen: [{ type: Input }], toolbarVisible: [{ type: Input }], sidebarVisible: [{ type: Input }], errorHandler: [{ type: Input }], init: [{ type: Output }], reportLoaded: [{ type: Output }], documentLoaded: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FjdGl2ZXJlcG9ydHMvc3JjL2xpYi92aWV3ZXIvdmlld2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FjdGl2ZXJlcG9ydHMvc3JjL2xpYi92aWV3ZXIvdmlld2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTixTQUFTLEVBRVQsS0FBSyxFQUNMLGlCQUFpQixFQUdqQixZQUFZLEVBQ1osTUFBTSxFQUVOLE1BQU0sRUFDTixRQUFRLEVBRVIsU0FBUyxHQUNULE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxZQUFZLElBQUksUUFBUSxFQUFRLE1BQU0sMEJBQTBCLENBQUM7QUFFMUUsT0FBTyxFQUFVLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDOztBQVM5RCxNQUFNLE9BQU8sZUFBZTtJQU8zQixJQUFZLG1CQUFtQjtRQUM5QixPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxZQUE2RCxnQkFBMkI7UUFBM0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFXO1FBTmhGLGVBQVUsR0FBc0IsRUFBRSxDQUFDO1FBUWxDLFVBQUssR0FBRyxNQUFNLENBQUM7UUFDZixXQUFNLEdBQUcsTUFBTSxDQUFDO1FBcUJoQixxQkFBZ0IsR0FBYyxFQUFFLENBQUM7UUFVaEMsU0FBSSxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO1FBRTNDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWdDLENBQUM7UUFDaEUsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBa0MsQ0FBQztRQUV0RSxpQkFBWSxH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QUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUksSUFBSTtzQkFBYixNQUFNO2dCQUVHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdENvbXBvbmVudCxcblx0QWZ0ZXJWaWV3SW5pdCxcblx0SW5wdXQsXG5cdFZpZXdFbmNhcHN1bGF0aW9uLFxuXHRTaW1wbGVDaGFuZ2VzLFxuXHRPbkNoYW5nZXMsXG5cdEV2ZW50RW1pdHRlcixcblx0T3V0cHV0LFxuXHRPbkRlc3Ryb3ksXG5cdEluamVjdCxcblx0T3B0aW9uYWwsXG5cdEVsZW1lbnRSZWYsXG5cdFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFJlcG9ydFZpZXdlciBhcyBWaWV3ZXJOcywgQ29yZSB9IGZyb20gJ0BncmFwZWNpdHkvYWN0aXZlcmVwb3J0cyc7XG5cbmltcG9ydCB7IEV4cG9ydCwgQVJfRVhQT1JUUyB9IGZyb20gJy4uL2V4cG9ydC1pbmplY3Rpb250b2tlbic7XG5cbmV4cG9ydCB0eXBlIElSZXBvcnQgPSBDb3JlLlJkbC5SZXBvcnQgfCBzdHJpbmc7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ2djLWFjdGl2ZXJlcG9ydHMtdmlld2VyJyxcblx0dGVtcGxhdGVVcmw6ICcuL3ZpZXdlci5jb21wb25lbnQuaHRtbCcsXG5cdGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFZpZXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblx0QFZpZXdDaGlsZCgndmlld2VyUm9vdCcsIHsgc3RhdGljOiBmYWxzZSB9KSByb290RWxlbWVudDogRWxlbWVudFJlZjtcblxuXHRwcml2YXRlIF92aWV3ZXI6IFZpZXdlck5zLlZpZXdlcjtcblxuXHRwcml2YXRlIF9pbml0UHJvcHM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cblx0cHJpdmF0ZSBnZXQgc3VwcG9ydGVkRXhwb3J0S2V5cygpIHtcblx0XHRyZXR1cm4gKHRoaXMuc3VwcG9ydGVkRXhwb3J0cyB8fCBbXSkubWFwKChlKSA9PiBlLmtleSk7XG5cdH1cblxuXHRjb25zdHJ1Y3RvcihASW5qZWN0KEFSX0VYUE9SVFMpIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgc3VwcG9ydGVkRXhwb3J0cz86IEV4cG9ydFtdKSB7fVxuXG5cdEBJbnB1dCgpIHdpZHRoID0gJzEwMCUnO1xuXHRASW5wdXQoKSBoZWlnaHQgPSAnMTAwJSc7XG5cblx0QElucHV0KCkgbGFuZ3VhZ2U/OiBzdHJpbmc7XG5cblx0LyoqIFVJIHRoZW1lICovXG5cdEBJbnB1dCgpIHRoZW1lPzogVmlld2VyTnMuVUlUaGVtZTtcblxuXHQvKiogSW5pdGlhbCBVSSB0aGVtZXMgc2V0dGluZ3MgKi9cblx0QElucHV0KCkgdGhlbWVDb25maWc/OiBWaWV3ZXJOcy5VSVRoZW1lQ29uZmlnO1xuXG5cdC8qKiBMYXlvdXQgb2YgcGFuZWxzIGJhci4gQ2Fubm90IGJlIGNoYW5nZWQgb24gdGhlIGZseS4gKi9cblx0QElucHV0KCkgcGFuZWxzTGF5b3V0PzogVmlld2VyTnMuUGFuZWxzTG9jYXRpb247XG5cblx0LyoqIFBhcmFtZXRlcnMgcGFuZWwgbG9jYXRpb24uICovXG5cdEBJbnB1dCgpIHBhcmFtZXRlclBhbmVsTG9jYXRpb24/OiBWaWV3ZXJOcy5QYXJhbWV0ZXJQYW5lbExvY2F0aW9uO1xuXHQvKiogUGFyYW1ldGVycyBwYW5lbCBiZWhhdmlvdXIuICovXG5cdEBJbnB1dCgpIHNob3dQYXJhbWV0ZXJzT25PcGVuPzogVmlld2VyTnMuU2hvd1BhcmFtZXRlcnNPbk9wZW47XG5cdEBJbnB1dCgpIG1lbW9pemVEYXRhPzogYm9vbGVhbjtcblx0QElucHV0KCkgdG9vbGJhckxheW91dD86IFZpZXdlck5zLlRvb2xiYXJMYXlvdXQ7XG5cdEBJbnB1dCgpIGV4cG9ydHNTZXR0aW5ncz86IFJlY29yZDxzdHJpbmcsIFZpZXdlck5zLkV4cG9ydFNldHRpbmdzPjtcblxuXHRASW5wdXQoKSBhdmFpbGFibGVFeHBvcnRzPzogc3RyaW5nW10gPSBbXTtcblx0QElucHV0KCkgbW91c2VNb2RlPzogVmlld2VyTnMuVmlld2VyTW91c2VNb2RlO1xuXHRASW5wdXQoKSByZW5kZXJNb2RlPzogVmlld2VyTnMuVmlld2VyUmVuZGVyTW9kZTtcblx0QElucHV0KCkgdmlld01vZGU/OiBWaWV3ZXJOcy5WaWV3ZXJWaWV3TW9kZSB8IFZpZXdlck5zLlZpZXdNb2RlO1xuXHRASW5wdXQoKSB6b29tPzogVmlld2VyTnMuVmlld2VyWm9vbU1vZGU7XG5cdEBJbnB1dCgpIGZ1bGxzY3JlZW4/OiBib29sZWFuO1xuXHRASW5wdXQoKSB0b29sYmFyVmlzaWJsZT86IGJvb2xlYW47XG5cdEBJbnB1dCgpIHNpZGViYXJWaXNpYmxlPzogYm9vbGVhbjtcblx0QElucHV0KCkgZXJyb3JIYW5kbGVyPzogKCkgPT4gdm9pZDtcblxuXHRAT3V0cHV0KCkgaW5pdCA9IG5ldyBFdmVudEVtaXR0ZXI8Vmlld2VyQ29tcG9uZW50PigpO1xuXG5cdEBPdXRwdXQoKSByZXBvcnRMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFZpZXdlck5zLlJlcG9ydExvYWRFdmVudEFyZ3M+KCk7XG5cdEBPdXRwdXQoKSBkb2N1bWVudExvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Vmlld2VyTnMuRG9jdW1lbnRMb2FkRXZlbnRBcmdzPigpO1xuXG5cdHByaXZhdGUgX3Byb3BTZXR0ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gdm9pZD4gPSB7XG5cdFx0c2lkZWJhclZpc2libGU6ICh2YWx1ZSkgPT4ge1xuXHRcdFx0dGhpcy5fdmlld2VyLnRvZ2dsZVNpZGViYXIodmFsdWUpO1xuXHRcdH0sXG5cdFx0dG9vbGJhclZpc2libGU6ICh2YWx1ZSkgPT4ge1xuXHRcdFx0dGhpcy5fdmlld2VyLnRvZ2dsZVRvb2xiYXIodmFsdWUpO1xuXHRcdH0sXG5cdFx0ZnVsbHNjcmVlbjogKHZhbHVlKSA9PiB7XG5cdFx0XHR0aGlzLl92aWV3ZXIudG9nZ2xlRnVsbFNjcmVlbih2YWx1ZSk7XG5cdFx0fSxcblx0XHRhdmFpbGFibGVFeHBvcnRzOiAodmFsdWUpID0+IHtcblx0XHRcdGlmICh2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbnN0IHN1cHBvcnRlZFZhbHVlcyA9IHZhbHVlLmZpbHRlcigodjogc3RyaW5nKSA9PiB0aGlzLnN1cHBvcnRlZEV4cG9ydEtleXMuaW5kZXhPZih2KSA+PSAwKTtcblx0XHRcdFx0Ly8gc2V0IFsnZGlzYWJsZWQnXSB0byBoaWRlIGV4cG9ydCBwYW5lbCBpZiBubyBleHBvcnRzIHN1cHBvcnRlZFxuXHRcdFx0XHR0aGlzLl92aWV3ZXIuYXZhaWxhYmxlRXhwb3J0cyA9IHN1cHBvcnRlZFZhbHVlcy5sZW5ndGggPyBzdXBwb3J0ZWRWYWx1ZXMgOiBbJ2Rpc2FibGVkJ107XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBzZXQgZXhwbGljaXQgbGlzdCB0byBhdm9pZCBzaWRlIGVmZmVjdHMgb2YgZ2xvYmFsIGV4cG9ydHMgaW5pdGlhbGl6YXRpb25cblx0XHRcdFx0dGhpcy5fdmlld2VyLmF2YWlsYWJsZUV4cG9ydHMgPSB0aGlzLnN1cHBvcnRlZEV4cG9ydEtleXMubGVuZ3RoID8gdGhpcy5zdXBwb3J0ZWRFeHBvcnRLZXlzIDogWydkaXNhYmxlZCddO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0bW91c2VNb2RlOiAodmFsdWUpID0+IHtcblx0XHRcdHRoaXMuX3ZpZXdlci5tb3VzZU1vZGUgPSB2YWx1ZTtcblx0XHR9LFxuXHRcdHRoZW1lOiAodmFsdWUpID0+IHtcblx0XHRcdHRoaXMuX3ZpZXdlci50aGVtZSA9IHZhbHVlO1xuXHRcdH0sXG5cdFx0cmVuZGVyTW9kZTogKHZhbHVlKSA9PiB7XG5cdFx0XHR0aGlzLl92aWV3ZXIucmVuZGVyTW9kZSA9IHZhbHVlO1xuXHRcdH0sXG5cdFx0dmlld01vZGU6ICh2YWx1ZSkgPT4ge1xuXHRcdFx0dGhpcy5fdmlld2VyLnZpZXdNb2RlID0gdmFsdWU7XG5cdFx0fSxcblx0XHR6b29tOiAodmFsdWUpID0+IHtcblx0XHRcdHRoaXMuX3ZpZXdlci56b29tID0gdmFsdWU7XG5cdFx0fSxcblx0XHRlcnJvckhhbmRsZXI6ICh2YWx1ZSkgPT4ge1xuXHRcdFx0dGhpcy5fdmlld2VyLmVycm9ySGFuZGxlciA9IHZhbHVlO1xuXHRcdH0sXG5cdFx0c2hvd1BhcmFtZXRlcnNPbk9wZW46ICh2YWx1ZSkgPT4ge1xuXHRcdFx0dGhpcy5fdmlld2VyLnNob3dQYXJhbWV0ZXJzT25PcGVuID0gdmFsdWU7XG5cdFx0fSxcblx0fTtcblxuXHRwcml2YXRlIF9kaXNwb3NhYmxlczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblxuXHRuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG5cdFx0Zm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKGNoYW5nZXMpKSB7XG5cdFx0XHRjb25zdCBzZXR0ZXIgPSB0aGlzLl9wcm9wU2V0dGVyc1twcm9wXTtcblx0XHRcdGlmICghc2V0dGVyKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCB2YWx1ZSA9IGNoYW5nZXNbcHJvcF0uY3VycmVudFZhbHVlO1xuXHRcdFx0aWYgKHRoaXMuX3ZpZXdlcikge1xuXHRcdFx0XHRzZXR0ZXIodmFsdWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5faW5pdFByb3BzLnB1c2goKCkgPT4gc2V0dGVyKHZhbHVlKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0bmdBZnRlclZpZXdJbml0KCkge1xuXHRcdHRoaXMuaW5pdFZpZXdlcigpLnRoZW4oKCkgPT4gdGhpcy5pbml0LmVtaXQodGhpcykpO1xuXHR9XG5cblx0bmdPbkRlc3Ryb3koKSB7XG5cdFx0d2hpbGUgKHRoaXMuX2Rpc3Bvc2FibGVzLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5fZGlzcG9zYWJsZXMuc2hpZnQoKSEoKTtcblx0XHR9XG5cdFx0dGhpcy5fdmlld2VyLmRpc3Bvc2UoKTtcblx0fVxuXG5cdGdldCByZWYoKTogVmlld2VyTnMuVmlld2VyIHtcblx0XHRyZXR1cm4gdGhpcy5fdmlld2VyO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBpbml0Vmlld2VyKCkge1xuXHRcdGZvciAoY29uc3Qgc3VwcG9ydGVkRXhwb3J0IG9mIHRoaXMuc3VwcG9ydGVkRXhwb3J0cyB8fCBbXSkge1xuXHRcdFx0YXdhaXQgc3VwcG9ydGVkRXhwb3J0LmluaXQoKTtcblx0XHR9XG5cblx0XHR0aGlzLl92aWV3ZXIgPSBuZXcgVmlld2VyTnMuVmlld2VyKHRoaXMucm9vdEVsZW1lbnQubmF0aXZlRWxlbWVudCwge1xuXHRcdFx0bGFuZ3VhZ2U6IHRoaXMubGFuZ3VhZ2UsXG5cdFx0XHR0aGVtZUNvbmZpZzogdGhpcy50aGVtZUNvbmZpZyxcblx0XHRcdFBhbmVsc0xheW91dDogdGhpcy5wYW5lbHNMYXlvdXQsXG5cdFx0XHRQYXJhbWV0ZXJQYW5lbExvY2F0aW9uOiB0aGlzLnBhcmFtZXRlclBhbmVsTG9jYXRpb24sXG5cdFx0XHRtZW1vaXplRGF0YTogdGhpcy5tZW1vaXplRGF0YSxcblx0XHRcdFRvb2xiYXJMYXlvdXQ6IHRoaXMudG9vbGJhckxheW91dCxcblx0XHRcdEV4cG9ydHNTZXR0aW5nczogdGhpcy5leHBvcnRzU2V0dGluZ3MsXG5cdFx0fSk7XG5cblx0XHR0aGlzLl9kaXNwb3NhYmxlcy5wdXNoKFxuXHRcdFx0dGhpcy5fdmlld2VyLnJlcG9ydExvYWRlZC5yZWdpc3RlcigoYXJncykgPT4gdGhpcy5yZXBvcnRMb2FkZWQuZW1pdChhcmdzKSksXG5cdFx0XHR0aGlzLl92aWV3ZXIuZG9jdW1lbnRMb2FkZWQucmVnaXN0ZXIoKGFyZ3MpID0+IHRoaXMuZG9jdW1lbnRMb2FkZWQuZW1pdChhcmdzKSksXG5cdFx0KTtcblxuXHRcdHRoaXMuX3Byb3BTZXR0ZXJzLmF2YWlsYWJsZUV4cG9ydHModGhpcy5hdmFpbGFibGVFeHBvcnRzKTtcblxuXHRcdHdoaWxlICh0aGlzLl9pbml0UHJvcHMubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLl9pbml0UHJvcHMuc2hpZnQoKSEoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogT3BlbnMgcmVwb3J0IGZyb20gZmlsZSBvciBhcyBkZWZpbml0aW9uIChqc29uIHN0cmluZykpLlxuXHQgKlxuXHQgKiBAcGFyYW0gcmVwb3J0ICBUaGUgcmVwb3J0IHRlbXBsYXRlLiBDYW4gYmUgcmVwb3J0IFVSSSwgb3IgcmVwb3J0IGRlZmluaXRpb24sIG9yIGluc3RhbmNlIG9mIFBhZ2VSZXBvcnQgY2xhc3MuXG5cdCAqIEBwYXJhbSBzZXR0aW5ncyAgQWRkaXRpb25hbCBzZXR0aW5ncyBmb3IgcmVwb3J0IChuYW1lLCBwYXJhbWV0ZXJzKS5cblx0ICovXG5cdG9wZW4ocmVwb3J0OiBJUmVwb3J0LCBzZXR0aW5ncz86IFBhcnRpYWw8Vmlld2VyTnMuUmVwb3J0U2V0dGluZ3M+KTogUHJvbWlzZTxWaWV3ZXJOcy5Mb2FkUmVzdWx0PiB7XG5cdFx0cmV0dXJuIHRoaXMuX3ZpZXdlci5vcGVuKHJlcG9ydCwgc2V0dGluZ3MpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4cG9ydHMgY3VycmVudGx5IGRpc3BsYXllZCByZXBvcnQgdG8gc3BlY2lmaWVkIG91dHB1dCBmb3JtYXQuIFJldHVybnMgb2JqZWN0IHdoaWNoIGNvbnRhaW5zXG5cdCAqIHJlc3VsdCBkYXRhIGFzIGJsb2Igb2JqZWN0IHwgc3RyaW5nIGFuZCBkb3dubG9hZCBmdW5jdGlvbi4gU28geW91IGNvdWxkIGVpdGhlciB1c2UgdGhpcyBibG9iIG9iamVjdCBvciBkb3dubG9hZCBmaWxlIGltbWVkaWF0ZWx5LlxuXHQgKiBQbGVhc2Ugbm90ZSB0aGF0IHlvdSBjYW4gc3BlY2lmeSBzZXR0aW5ncyBpbiBQREYgZXhwb3J0IGFzIHBsYWluIGxpc3Rcblx0ICogKGxpa2UgKip7dGl0bGU6ICdUaXRsZScsIGF1dGhvcjogJ0F1dGhvciBOYW1lJywgb3duZXJQYXNzd29yZDogJzEnfSoqIGV0Yy4uLlxuXHQgKlxuXHQgKiBgYGBqYXZhc2NyaXB0XG5cdCAqIHZhciBvcHRpb25zID0ge2ZpbGVuYW1lOlwiSW52b2ljZSBMaXN0XCJ9O1xuXHQgKiB2YXIgY2FuY2VsQ2FsbGJhY2sgPSBmdW5jdGlvbigpe1xuXHQgKiAgICAgcmV0dXJuIGZhbHNlOyAvLyBjb250aW51ZSBleHBvcnQuIFJldHVybiB0cnVlIHRvIGNhbmNlbCBleHBvcnQgcHJvY2Vzc1xuXHQgKiB9XG5cdCAqIHZpZXdlci5leHBvcnQoJ3BkZicsIG9wdGlvbnMsIHtjYW5jZWw6IGNhbmNlbENhbGxiYWNrIH0pLnRoZW4ocmVzdWx0ID0+IGRvU210aFdpdGhCbG9iKHJlc3VsdC5kYXRhKSk7XG5cdCAqIC8vb3IgeW91IGNhbiBkb3dubG9hZCBmaWxlXG5cdCAqIHZpZXdlci5leHBvcnQoJ3BkZicsIG9wdGlvbnMsIHtjYW5jZWw6IGNhbmNlbENhbGxiYWNrIH0pLnRoZW4ocmVzdWx0ID0+IHJlc3VsdC5kb3dubG9hZCgnSW52b2ljZSBMaXN0JykpO1xuXHQgKiBgYGBcblx0ICpcblx0ICogQHBhcmFtIGZvcm1hdCAgRXhwb3J0IGZvcm1hdCBpZGVudGlmaWVyLiBPbmUgb2YgJ3BkZicsICd4bHN4JywgJ2h0bWwnLCAndGFidWxhci1kYXRhJy5cblx0ICogQHBhcmFtIHNldHRpbmdzICBGb3JtYXQgc3BlY2lmaWMgZXhwb3J0IHNldHRpbmdzLlxuXHQgKiBAcGFyYW0gcGFyYW1zICBBZGRpdGlvbmFsIGV4cG9ydCBjdXN0b21pemF0aW9uLlxuXHQgKi9cblx0ZXhwb3J0KGZvcm1hdDogc3RyaW5nLCBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlcj4sIHBhcmFtcz86IHsgY2FuY2VsPzogKCkgPT4gYm9vbGVhbiB9KTogUHJvbWlzZTxWaWV3ZXJOcy5FeHBvcnRSZXN1bHQ+IHtcblx0XHRyZXR1cm4gdGhpcy5fdmlld2VyLmV4cG9ydChmb3JtYXQsIHNldHRpbmdzLCBwYXJhbXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc2V0cyBjdXJyZW50IHZpZXdlciBkb2N1bWVudFxuXHQgKi9cblx0cmVzZXREb2N1bWVudCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5fdmlld2VyLnJlc2V0RG9jdW1lbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcmludHMgY3VycmVudGx5IGRpc3BsYXllZCByZXBvcnQuXG5cdCAqL1xuXHRwcmludCgpOiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5fdmlld2VyLnByaW50KCk7XG5cdH1cblxuXHQvKiogR2V0cyBjdXJyZW50IHBhZ2UgbnVtYmVyICgxLWJhc2VkKS4gUmV0dXJucyAwIGlmIG5vIGRvY3VtZW50IGxvYWRlZC4gKi9cblx0Z2V0IGN1cnJlbnRQYWdlKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuX3ZpZXdlci5jdXJyZW50UGFnZTtcblx0fVxuXHQvKiogR2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGF2YWlsYWJsZSBpbiByZXBvcnQuICovXG5cdGdldCBwYWdlQ291bnQoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5fdmlld2VyLnBhZ2VDb3VudDtcblx0fVxuXHQvKiogUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBcImhpc3RvcnlcIiBBUEkuICovXG5cdGdldCBoaXN0b3J5KCk6IFZpZXdlck5zLkhpc3RvcnlBcGkge1xuXHRcdHJldHVybiB0aGlzLl92aWV3ZXIuaGlzdG9yeTtcblx0fVxuXHQvKiogR2V0cyB0aGUgdG9vbGJhciBBUEkgKi9cblx0Z2V0IHRvb2xiYXIoKTogVmlld2VyTnMuVG9vbGJhciB7XG5cdFx0cmV0dXJuIHRoaXMuX3ZpZXdlci50b29sYmFyO1xuXHR9XG5cblx0LyoqIE5hdmlnYXRlcyB0byB0aGUgZmlyc3QgcGFnZS4gKi9cblx0Z29Ub0ZpcnN0UGFnZSgpOiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5fdmlld2VyLmdvVG9GaXJzdFBhZ2UoKTtcblx0fVxuXG5cdC8qKiBOYXZpZ2F0ZXMgdG8gdGhlIHByZXZpb3VzIHBhZ2UuICovXG5cdGdvVG9QcmV2UGFnZSgpOiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5fdmlld2VyLmdvVG9QcmV2UGFnZSgpO1xuXHR9XG5cdC8qKiBOYXZpZ2F0ZXMgdG8gdGhlIG5leHQgcGFnZS4gKi9cblx0Z29Ub05leHRQYWdlKCk6IHZvaWQge1xuXHRcdHJldHVybiB0aGlzLl92aWV3ZXIuZ29Ub05leHRQYWdlKCk7XG5cdH1cblx0LyoqIE5hdmlnYXRlcyB0byB0aGUgbGFzdCBwYWdlLiAqL1xuXHRnb1RvTGFzdFBhZ2UoKTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMuX3ZpZXdlci5nb1RvTGFzdFBhZ2UoKTtcblx0fVxuXHQvKiogTmF2aWdhdGVzIHRvIHRoZSBzcGVjaWZpZWQgcGFnZSAoc3RhcnRpbmcgZnJvbSAxKS4gKi9cblx0Z29Ub1BhZ2UocGFnZU51bWJlcjogbnVtYmVyKTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMuX3ZpZXdlci5nb1RvUGFnZShwYWdlTnVtYmVyKTtcblx0fVxuXHQvKiogUGVyZm9ybXMgYmFja1RvUGFyZW50IGFjdGlvbiB3aGljaCB3aWxsIHJldHVybiB1c2VyIHRvIHBhcmVudCByZXBvcnQuICovXG5cdGJhY2tUb1BhcmVudCgpOiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5fdmlld2VyLmJhY2tUb1BhcmVudCgpO1xuXHR9XG5cdC8qKiBQZXJmb3JtcyByZWZyZXNoIG9wZXJhdGlvbiBpbiByZXBvcnQgKHJlLXJlbmRlciByZXBvcnQpLiAqL1xuXHRyZWZyZXNoKCk6IHZvaWQge1xuXHRcdHJldHVybiB0aGlzLl92aWV3ZXIucmVmcmVzaCgpO1xuXHR9XG5cblx0LyoqIEdldHMgKip0cnVlKiogaWYgYmFja1RvUGFyZW50IGNvbW1hbmQgaXMgYXBwbGljYWJsZSB0byBjdXJyZW50IGRvY3VtZW50LiAqL1xuXHRnZXQgY2FuQmFja1RvUGFyZW50KCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl92aWV3ZXIuY2FuQmFja1RvUGFyZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogUGVyZm9ybXMgc2VhcmNoIG9wZXJhdGlvbiBpbiBjdXJyZW50bHkgcmVuZGVyZWQgcmVwb3J0LiBBbGxvd3MgeW91IHRvIGNyZWF0ZSB5b3VyIG93biBjdXN0b20gc2VhcmNoIHBhbmUuXG5cdCAqL1xuXHRzZWFyY2goXG5cdFx0b3B0aW9uczogVmlld2VyTnMuU2VhcmNoT3B0aW9ucyxcblx0XHRyZXN1bHRGbjogKHJlc3VsdDogVmlld2VyTnMuU2VhcmNoUmVzdWx0KSA9PiB2b2lkLFxuXHRcdHByb2dyZXNzRm4/OiAocHJvZ3Jlc3M6IHsgcGFnZUluZGV4OiBudW1iZXI7IHBhZ2VDb3VudDogbnVtYmVyIHwgbnVsbCB9KSA9PiB2b2lkLFxuXHRcdGNhbmNlbD86IFZpZXdlck5zLkNhbmNlbGxhdGlvblRva2VuLFxuXHQpOiBQcm9taXNlPFZpZXdlck5zLlNlYXJjaFN0YXR1cz4ge1xuXHRcdHJldHVybiB0aGlzLl92aWV3ZXIuc2VhcmNoKG9wdGlvbnMsIHJlc3VsdEZuLCBwcm9ncmVzc0ZuLCBjYW5jZWwpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhpZ2hsaWdodHMgdGhlIHNlYXJjaCByZXN1bHQgcmV0dXJuZWQgYnkgYSBzZWFyY2ggbWV0aG9kLlxuXHQgKi9cblx0aGlnaGxpZ2h0KHJlc3VsdDogVmlld2VyTnMuU2VhcmNoUmVzdWx0IHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHJldHVybiB0aGlzLl92aWV3ZXIuaGlnaGxpZ2h0KHJlc3VsdCk7XG5cdH1cbn1cbiIsIjxkaXYgI3ZpZXdlclJvb3QgW3N0eWxlLndpZHRoXT1cIndpZHRoXCIgW3N0eWxlLmhlaWdodF09XCJoZWlnaHRcIj48L2Rpdj5cbiJdfQ==