@progress/telerik-angular-native-report-viewer
Version:
Progress® Telerik® Native Report Viewer for Angular
184 lines • 28.6 kB
JavaScript
import { EventEmitter, Injectable } from '@angular/core';
import { DocumentInfo, ReportControllerOptions, ServiceType, ServiceClientOptions, ServiceClientLoginInfo, reportSourcesAreEqual } from '@progress/telerik-common-report-viewer';
import { messages } from './localization/messages';
import * as i0 from "@angular/core";
const zoomStep = 0.25;
const minScale = 0.25;
const maxScale = 4;
export class ReportingAngularViewerService {
constructor() {
this.options = {
contentTabIndex: 1000,
authenticationToken: '',
reportSource: {
parameters: {},
report: null,
},
scale: 1,
scaleMode: 2,
serviceType: 0,
serviceUrl: null,
viewMode: 0,
keepClientAlive: true,
messages: messages,
pageMode: 0,
printMode: 0,
reportServer: null,
};
this.documentInfo = {
documentReady: false,
documentMapAvailable: false,
containsFrozenContent: false,
pageCount: 1,
documentMapNodes: [],
bookmarkNodes: [],
renderingExtensions: [],
};
this.onZoomChange = new EventEmitter();
this.parameters = [];
this.isSearchWindowOpen = false;
this.currentHistoryIndex = -1;
this.history = [];
this.currentPageIndex = 0;
this.renderingInProgress = false;
this.isBackwardsNavigationInProgress = false;
this.isParametersSectionAvailable = false;
this.windowWidth = 310;
this.windowHeight = 390;
this.totalPages = 1;
this.skip = 0;
}
getServiceClientOptions() {
if (this.options.serviceType === ServiceType.ReportServer && this.options.reportServer !== null) {
let serverOptions = this.options.reportServer;
let serviceUrl = serverOptions.url + '/api/reports';
let tokenUrl = serverOptions.url + '/Token';
let loginInfo = new ServiceClientLoginInfo(tokenUrl, serverOptions.username, serverOptions.password);
return new ServiceClientOptions(serviceUrl, loginInfo);
}
return new ServiceClientOptions(this.options.serviceUrl);
}
getControllerOptions() {
return new ReportControllerOptions(this.options.keepClientAlive, this.options.authenticationToken, this.options.reportSource, this.options.printMode, this.options.pageMode, this.options.viewMode, this.options.scaleMode, this.options.scale, this.options.messages);
}
setOptions(options) {
this.options = options;
this.controller.setOptions(this.getControllerOptions());
this.controller.refreshReport(true, '');
}
applyHistory(reportSource, page, reportDocumentId, scale, scaleMode, viewMode) {
this.controller.setReportSource(reportSource);
this.controller.setReportDocumentId(reportDocumentId);
if (this.controller.getScale() !== scale) {
this.setScale(scale);
}
if (this.controller.getScaleMode() !== scaleMode) {
this.setScaleMode(scaleMode);
}
if (this.controller.getViewMode() !== viewMode) {
this.setViewMode(viewMode);
}
this.controller.refreshReport(false /* ignoreCache */, reportDocumentId, true /* alwaysRespectAutoRun */);
this.controller.navigateToPage(page, undefined);
}
applyParameter(id, value) {
this.isSearchWindowOpen = false;
this.controller.setParameter(id, value);
this.controller.previewReport();
}
setScale(scale) {
this.options.scale = scale;
this.controller.setScale(scale);
this.onZoomChange.emit(scale);
}
setScaleMode(scaleMode) {
this.options.scaleMode = scaleMode;
this.controller.setScaleMode(scaleMode);
}
setViewMode(mode) {
if (mode) {
this.options.viewMode = mode;
}
else {
this.options.viewMode ? this.options.viewMode = 0 : this.options.viewMode = 1;
}
this.controller.setViewMode(this.options.viewMode);
this.controller.refreshReportCore(false, this.controller.getReportDocumentId());
}
zoomIn() {
if (this.options.scale < maxScale) {
this.options.scale += zoomStep;
this.setScale(this.options.scale);
}
}
zoomOut() {
if (this.options.scale > minScale) {
this.options.scale -= zoomStep;
this.setScale(this.options.scale);
}
}
navigateBackwards() {
this.renderingInProgress = true;
this.isSearchWindowOpen = false;
this.isBackwardsNavigationInProgress = true;
this.currentHistoryIndex--;
if (this.history.length >= 0) {
const currentHistoryItem = this.history[this.currentHistoryIndex];
this.applyHistory(currentHistoryItem.reportSource, currentHistoryItem.page, currentHistoryItem.documentId, currentHistoryItem.scale, currentHistoryItem.scaleMode, currentHistoryItem.viewMode);
}
}
navigateForward() {
this.renderingInProgress = true;
this.isSearchWindowOpen = false;
this.currentHistoryIndex++;
if (this.currentHistoryIndex < this.history.length) {
const currentHistoryItem = this.history[this.currentHistoryIndex];
this.applyHistory(currentHistoryItem.reportSource, currentHistoryItem.page, currentHistoryItem.documentId, currentHistoryItem.scale, currentHistoryItem.scaleMode, currentHistoryItem.viewMode);
}
}
addHistoryItem(temp = false) {
this.removeTempHistoryItems();
const historyItem = {
reportSource: { report: this.controller.getReportSource()?.report, parameters: this.options.reportSource.parameters },
documentId: this.controller.getReportDocumentId(),
page: this.getPageNumber(),
scale: this.controller.getScale(),
scaleMode: this.controller.getScaleMode(),
viewMode: this.controller.getViewMode(),
temp: temp
};
const controllerReportSource = this.controller.getReportSource();
if (!this.history.some(item => reportSourcesAreEqual({ firstReportSource: item.reportSource, secondReportSource: controllerReportSource }))) {
this.currentHistoryIndex++;
let deleteCount = this.isBackwardsNavigationInProgress ? 0 : this.history.length - this.currentHistoryIndex;
this.history.splice(this.currentHistoryIndex, deleteCount, historyItem);
}
this.isBackwardsNavigationInProgress = false;
return historyItem;
}
removeTempHistoryItems() {
var lastIndex = this.history.length - 1;
while (lastIndex >= 0 && this.history[lastIndex].temp) {
this.history.splice(lastIndex, 1);
if (this.currentHistoryIndex >= lastIndex) {
this.currentHistoryIndex--;
}
lastIndex--;
}
}
clearReport() {
this.isSearchWindowOpen = this.renderingInProgress = false;
this.currentPageIndex = 0;
this.totalPages = 0;
this.documentInfo = new DocumentInfo();
}
getPageNumber() {
return this.currentPageIndex + 1;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ReportingAngularViewerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ReportingAngularViewerService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ReportingAngularViewerService, decorators: [{
type: Injectable
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLWFuZ3VsYXItdmlld2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlcG9ydGluZy1hbmd1bGFyLXZpZXdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFFSCxZQUFZLEVBRVosdUJBQXVCLEVBR3ZCLFdBQVcsRUFJWCxvQkFBb0IsRUFDcEIsc0JBQXNCLEVBRXRCLHFCQUFxQixFQUN4QixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFJbkQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ3RCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQztBQUN0QixNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFHbkIsTUFBTSxPQUFPLDZCQUE2QjtJQUQxQztRQUVXLFlBQU8sR0FBUTtZQUNsQixlQUFlLEVBQUUsSUFBSTtZQUNyQixtQkFBbUIsRUFBRSxFQUFFO1lBQ3ZCLFlBQVksRUFBRTtnQkFDVixVQUFVLEVBQUUsRUFBRTtnQkFDZCxNQUFNLEVBQUUsSUFBSTthQUNmO1lBQ0QsS0FBSyxFQUFFLENBQUM7WUFDUixTQUFTLEVBQUUsQ0FBQztZQUNaLFdBQVcsRUFBRSxDQUFDO1lBQ2QsVUFBVSxFQUFFLElBQUk7WUFDaEIsUUFBUSxFQUFFLENBQUM7WUFDWCxlQUFlLEVBQUUsSUFBSTtZQUNyQixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsQ0FBQztZQUNYLFNBQVMsRUFBRSxDQUFDO1lBQ1osWUFBWSxFQUFFLElBQUk7U0FDckIsQ0FBQztRQUVLLGlCQUFZLEdBQWlCO1lBQ2hDLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLG9CQUFvQixFQUFFLEtBQUs7WUFDM0IscUJBQXFCLEVBQUUs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QUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRTtZQUNuRCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFbEMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLElBQUksU0FBUyxFQUFFO2dCQUN2QyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzthQUM5QjtZQUNELFNBQVMsRUFBRSxDQUFDO1NBQ2Y7SUFDTCxDQUFDO0lBRU0sV0FBVztRQUNkLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQzNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFTSxhQUFhO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztJQUNyQyxDQUFDOytHQWpPUSw2QkFBNkI7bUhBQTdCLDZCQUE2Qjs7NEZBQTdCLDZCQUE2QjtrQkFEekMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBDb250ZW50QXJlYSxcbiAgICBEb2N1bWVudEluZm8sXG4gICAgUmVwb3J0Q29udHJvbGxlcixcbiAgICBSZXBvcnRDb250cm9sbGVyT3B0aW9ucyxcbiAgICBSZXBvcnRTb3VyY2VPcHRpb25zLFxuICAgIFNjYWxlTW9kZSxcbiAgICBTZXJ2aWNlVHlwZSxcbiAgICBWaWV3TW9kZSxcbiAgICBTZXJ2aWNlQ2xpZW50LFxuICAgIFNlYXJjaE1hbmFnZXIsXG4gICAgU2VydmljZUNsaWVudE9wdGlvbnMsXG4gICAgU2VydmljZUNsaWVudExvZ2luSW5mbyxcbiAgICBQYXJhbWV0ZXJJbmZvLFxuICAgIHJlcG9ydFNvdXJjZXNBcmVFcXVhbFxufSBmcm9tICdAcHJvZ3Jlc3MvdGVsZXJpay1jb21tb24tcmVwb3J0LXZpZXdlcic7XG5pbXBvcnQgeyBtZXNzYWdlcyB9IGZyb20gJy4vbG9jYWxpemF0aW9uL21lc3NhZ2VzJztcbmltcG9ydCB7IEhpc3RvcnlJdGVtIH0gZnJvbSAnLi9tb2RlbHMvaGlzdG9yeS1pdGVtLmludGVyZmFjZSc7XG5cblxuY29uc3Qgem9vbVN0ZXAgPSAwLjI1O1xuY29uc3QgbWluU2NhbGUgPSAwLjI1O1xuY29uc3QgbWF4U2NhbGUgPSA0O1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3J0aW5nQW5ndWxhclZpZXdlclNlcnZpY2Uge1xuICAgIHB1YmxpYyBvcHRpb25zOiBhbnkgPSB7XG4gICAgICAgIGNvbnRlbnRUYWJJbmRleDogMTAwMCxcbiAgICAgICAgYXV0aGVudGljYXRpb25Ub2tlbjogJycsXG4gICAgICAgIHJlcG9ydFNvdXJjZToge1xuICAgICAgICAgICAgcGFyYW1ldGVyczoge30sXG4gICAgICAgICAgICByZXBvcnQ6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHNjYWxlOiAxLFxuICAgICAgICBzY2FsZU1vZGU6IDIsXG4gICAgICAgIHNlcnZpY2VUeXBlOiAwLFxuICAgICAgICBzZXJ2aWNlVXJsOiBudWxsLFxuICAgICAgICB2aWV3TW9kZTogMCxcbiAgICAgICAga2VlcENsaWVudEFsaXZlOiB0cnVlLFxuICAgICAgICBtZXNzYWdlczogbWVzc2FnZXMsXG4gICAgICAgIHBhZ2VNb2RlOiAwLFxuICAgICAgICBwcmludE1vZGU6IDAsXG4gICAgICAgIHJlcG9ydFNlcnZlcjogbnVsbCxcbiAgICB9O1xuXG4gICAgcHVibGljIGRvY3VtZW50SW5mbzogRG9jdW1lbnRJbmZvID0ge1xuICAgICAgICBkb2N1bWVudFJlYWR5OiBmYWxzZSxcbiAgICAgICAgZG9jdW1lbnRNYXBBdmFpbGFibGU6IGZhbHNlLFxuICAgICAgICBjb250YWluc0Zyb3plbkNvbnRlbnQ6IGZhbHNlLFxuICAgICAgICBwYWdlQ291bnQ6IDEsXG4gICAgICAgIGRvY3VtZW50TWFwTm9kZXM6IFtdLFxuICAgICAgICBib29rbWFya05vZGVzOiBbXSxcbiAgICAgICAgcmVuZGVyaW5nRXh0ZW5zaW9uczogW10sXG4gICAgfTtcblxuICAgIHB1YmxpYyBvblpvb21DaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICBwdWJsaWMgcGFyYW1ldGVyczogUGFyYW1ldGVySW5mb1tdID0gW107XG4gICAgcHVibGljIGlzU2VhcmNoV2luZG93T3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjdXJyZW50SGlzdG9yeUluZGV4ID0gLTE7XG4gICAgcHVibGljIGhpc3Rvcnk6IGFueVtdID0gW107XG4gICAgcHVibGljIGN1cnJlbnRQYWdlSW5kZXg6IG51bWJlciA9IDA7XG4gICAgcHVibGljIHJlbmRlcmluZ0luUHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgaXNCYWNrd2FyZHNOYXZpZ2F0aW9uSW5Qcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBpc1BhcmFtZXRlcnNTZWN0aW9uQXZhaWxhYmxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgcmVwb3J0V2lkdGg6IG51bWJlcjtcbiAgICBwdWJsaWMgd2luZG93V2lkdGg6IG51bWJlciA9IDMxMDtcbiAgICBwdWJsaWMgd2luZG93SGVpZ2h0OiBudW1iZXIgPSAzOTA7XG4gICAgcHVibGljIHRvdGFsUGFnZXM6IG51bWJlciA9IDE7XG4gICAgcHVibGljIHNraXA6IG51bWJlciA9IDA7XG5cbiAgICBwdWJsaWMgY29udHJvbGxlciE6IFJlcG9ydENvbnRyb2xsZXI7XG4gICAgcHVibGljIHNlcnZpY2VDbGllbnQhOiBTZXJ2aWNlQ2xpZW50O1xuICAgIHB1YmxpYyBzZWFyY2hNYW5hZ2VyITogU2VhcmNoTWFuYWdlcjtcbiAgICBwdWJsaWMgY29udGVudEFyZWEhOiBDb250ZW50QXJlYTtcblxuICAgIHB1YmxpYyBnZXRTZXJ2aWNlQ2xpZW50T3B0aW9ucygpOiBTZXJ2aWNlQ2xpZW50T3B0aW9ucyB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VydmljZVR5cGUgPT09IFNlcnZpY2VUeXBlLlJlcG9ydFNlcnZlciAmJiB0aGlzLm9wdGlvbnMucmVwb3J0U2VydmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgc2VydmVyT3B0aW9ucyA9IHRoaXMub3B0aW9ucy5yZXBvcnRTZXJ2ZXI7XG4gICAgICAgICAgICBsZXQgc2VydmljZVVybCA9IHNlcnZlck9wdGlvbnMudXJsICsgJy9hcGkvcmVwb3J0cyc7XG4gICAgICAgICAgICBsZXQgdG9rZW5VcmwgPSBzZXJ2ZXJPcHRpb25zLnVybCArICcvVG9rZW4nO1xuICAgICAgICAgICAgbGV0IGxvZ2luSW5mbyA9IG5ldyBTZXJ2aWNlQ2xpZW50TG9naW5JbmZvKHRva2VuVXJsLCBzZXJ2ZXJPcHRpb25zLnVzZXJuYW1lLCBzZXJ2ZXJPcHRpb25zLnBhc3N3b3JkKTtcblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlQ2xpZW50T3B0aW9ucyhzZXJ2aWNlVXJsLCBsb2dpbkluZm8pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlQ2xpZW50T3B0aW9ucyh0aGlzLm9wdGlvbnMuc2VydmljZVVybCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbnRyb2xsZXJPcHRpb25zKCk6IFJlcG9ydENvbnRyb2xsZXJPcHRpb25zIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXBvcnRDb250cm9sbGVyT3B0aW9ucyhcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5rZWVwQ2xpZW50QWxpdmUsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXV0aGVudGljYXRpb25Ub2tlbixcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5yZXBvcnRTb3VyY2UsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucHJpbnRNb2RlLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhZ2VNb2RlLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZpZXdNb2RlLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNjYWxlTW9kZSxcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zY2FsZSxcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5tZXNzYWdlc1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRPcHRpb25zKG9wdGlvbnM6IGFueSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuc2V0T3B0aW9ucyh0aGlzLmdldENvbnRyb2xsZXJPcHRpb25zKCkpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucmVmcmVzaFJlcG9ydCh0cnVlLCAnJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFwcGx5SGlzdG9yeShyZXBvcnRTb3VyY2U6IFJlcG9ydFNvdXJjZU9wdGlvbnMsIFxuICAgICAgICBwYWdlOiBudW1iZXIsIFxuICAgICAgICByZXBvcnREb2N1bWVudElkOiBzdHJpbmcsIFxuICAgICAgICBzY2FsZTogbnVtYmVyLCBcbiAgICAgICAgc2NhbGVNb2RlOiBudW1iZXIsIFxuICAgICAgICB2aWV3TW9kZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5zZXRSZXBvcnRTb3VyY2UocmVwb3J0U291cmNlKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnNldFJlcG9ydERvY3VtZW50SWQocmVwb3J0RG9jdW1lbnRJZCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29udHJvbGxlci5nZXRTY2FsZSgpICE9PSBzY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTY2FsZShzY2FsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb250cm9sbGVyLmdldFNjYWxlTW9kZSgpICE9PSBzY2FsZU1vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U2NhbGVNb2RlKHNjYWxlTW9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb250cm9sbGVyLmdldFZpZXdNb2RlKCkgIT09IHZpZXdNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZpZXdNb2RlKHZpZXdNb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29udHJvbGxlci5yZWZyZXNoUmVwb3J0KGZhbHNlIC8qIGlnbm9yZUNhY2hlICovLCByZXBvcnREb2N1bWVudElkLCB0cnVlIC8qIGFsd2F5c1Jlc3BlY3RBdXRvUnVuICovKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLm5hdmlnYXRlVG9QYWdlKHBhZ2UsIHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFwcGx5UGFyYW1ldGVyKGlkOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5pc1NlYXJjaFdpbmRvd09wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnNldFBhcmFtZXRlcihpZCwgdmFsdWUpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHJldmlld1JlcG9ydCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRTY2FsZShzY2FsZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5zY2FsZSA9IHNjYWxlO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuc2V0U2NhbGUoc2NhbGUpO1xuICAgICAgICB0aGlzLm9uWm9vbUNoYW5nZS5lbWl0KHNjYWxlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0U2NhbGVNb2RlKHNjYWxlTW9kZTogU2NhbGVNb2RlKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5zY2FsZU1vZGUgPSBzY2FsZU1vZGU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5zZXRTY2FsZU1vZGUoc2NhbGVNb2RlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Vmlld01vZGUobW9kZT86IFZpZXdNb2RlKTogdm9pZCB7XG4gICAgICAgIGlmIChtb2RlKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudmlld01vZGUgPSBtb2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZpZXdNb2RlID8gdGhpcy5vcHRpb25zLnZpZXdNb2RlID0gMCA6IHRoaXMub3B0aW9ucy52aWV3TW9kZSA9IDE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuc2V0Vmlld01vZGUodGhpcy5vcHRpb25zLnZpZXdNb2RlKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnJlZnJlc2hSZXBvcnRDb3JlKGZhbHNlLCB0aGlzLmNvbnRyb2xsZXIuZ2V0UmVwb3J0RG9jdW1lbnRJZCgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgem9vbUluKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNjYWxlIDwgbWF4U2NhbGUpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zY2FsZSArPSB6b29tU3RlcDtcbiAgICAgICAgICAgIHRoaXMuc2V0U2NhbGUodGhpcy5vcHRpb25zLnNjYWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB6b29tT3V0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNjYWxlID4gbWluU2NhbGUpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zY2FsZSAtPSB6b29tU3RlcDtcbiAgICAgICAgICAgIHRoaXMuc2V0U2NhbGUodGhpcy5vcHRpb25zLnNjYWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuYXZpZ2F0ZUJhY2t3YXJkcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW5kZXJpbmdJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pc1NlYXJjaFdpbmRvd09wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0JhY2t3YXJkc05hdmlnYXRpb25JblByb2dyZXNzID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5SW5kZXgtLTtcblxuICAgICAgICBpZiAodGhpcy5oaXN0b3J5Lmxlbmd0aCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SGlzdG9yeUl0ZW0gPSB0aGlzLmhpc3RvcnlbdGhpcy5jdXJyZW50SGlzdG9yeUluZGV4XTtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlIaXN0b3J5KGN1cnJlbnRIaXN0b3J5SXRlbS5yZXBvcnRTb3VyY2UsIGN1cnJlbnRIaXN0b3J5SXRlbS5wYWdlLCBjdXJyZW50SGlzdG9yeUl0ZW0uZG9jdW1lbnRJZCwgY3VycmVudEhpc3RvcnlJdGVtLnNjYWxlLCBjdXJyZW50SGlzdG9yeUl0ZW0uc2NhbGVNb2RlLCBjdXJyZW50SGlzdG9yeUl0ZW0udmlld01vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5hdmlnYXRlRm9yd2FyZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW5kZXJpbmdJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pc1NlYXJjaFdpbmRvd09wZW4gPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5SW5kZXgrKztcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50SGlzdG9yeUluZGV4IDwgdGhpcy5oaXN0b3J5Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEhpc3RvcnlJdGVtID0gdGhpcy5oaXN0b3J5W3RoaXMuY3VycmVudEhpc3RvcnlJbmRleF07XG4gICAgICAgICAgICB0aGlzLmFwcGx5SGlzdG9yeShjdXJyZW50SGlzdG9yeUl0ZW0ucmVwb3J0U291cmNlLCBjdXJyZW50SGlzdG9yeUl0ZW0ucGFnZSwgY3VycmVudEhpc3RvcnlJdGVtLmRvY3VtZW50SWQsIGN1cnJlbnRIaXN0b3J5SXRlbS5zY2FsZSwgY3VycmVudEhpc3RvcnlJdGVtLnNjYWxlTW9kZSwgY3VycmVudEhpc3RvcnlJdGVtLnZpZXdNb2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGRIaXN0b3J5SXRlbSh0ZW1wOiBib29sZWFuID0gZmFsc2UpOiBIaXN0b3J5SXRlbSB7XG4gICAgICAgIHRoaXMucmVtb3ZlVGVtcEhpc3RvcnlJdGVtcygpO1xuXG4gICAgICAgIGNvbnN0IGhpc3RvcnlJdGVtOiBIaXN0b3J5SXRlbSA9IHtcbiAgICAgICAgICAgIHJlcG9ydFNvdXJjZTogeyByZXBvcnQ6IHRoaXMuY29udHJvbGxlci5nZXRSZXBvcnRTb3VyY2UoKT8ucmVwb3J0LCBwYXJhbWV0ZXJzOiB0aGlzLm9wdGlvbnMucmVwb3J0U291cmNlLnBhcmFtZXRlcnMgfSxcbiAgICAgICAgICAgIGRvY3VtZW50SWQ6IHRoaXMuY29udHJvbGxlci5nZXRSZXBvcnREb2N1bWVudElkKCksXG4gICAgICAgICAgICBwYWdlOiB0aGlzLmdldFBhZ2VOdW1iZXIoKSxcbiAgICAgICAgICAgIHNjYWxlOiB0aGlzLmNvbnRyb2xsZXIuZ2V0U2NhbGUoKSxcbiAgICAgICAgICAgIHNjYWxlTW9kZTogdGhpcy5jb250cm9sbGVyLmdldFNjYWxlTW9kZSgpLFxuICAgICAgICAgICAgdmlld01vZGU6IHRoaXMuY29udHJvbGxlci5nZXRWaWV3TW9kZSgpLFxuICAgICAgICAgICAgdGVtcDogdGVtcFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXJSZXBvcnRTb3VyY2UgPSB0aGlzLmNvbnRyb2xsZXIuZ2V0UmVwb3J0U291cmNlKCk7XG4gICAgICAgIGlmICghdGhpcy5oaXN0b3J5LnNvbWUoaXRlbSA9PiByZXBvcnRTb3VyY2VzQXJlRXF1YWwoeyBmaXJzdFJlcG9ydFNvdXJjZTogaXRlbS5yZXBvcnRTb3VyY2UsIHNlY29uZFJlcG9ydFNvdXJjZTogY29udHJvbGxlclJlcG9ydFNvdXJjZSB9KSkpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhpc3RvcnlJbmRleCsrO1xuXG4gICAgICAgICAgICBsZXQgZGVsZXRlQ291bnQ6IG51bWJlciA9IHRoaXMuaXNCYWNrd2FyZHNOYXZpZ2F0aW9uSW5Qcm9ncmVzcyA/IDAgOiB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gdGhpcy5jdXJyZW50SGlzdG9yeUluZGV4O1xuICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnNwbGljZSh0aGlzLmN1cnJlbnRIaXN0b3J5SW5kZXgsIGRlbGV0ZUNvdW50LCBoaXN0b3J5SXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzQmFja3dhcmRzTmF2aWdhdGlvbkluUHJvZ3Jlc3MgPSBmYWxzZVxuXG4gICAgICAgIHJldHVybiBoaXN0b3J5SXRlbTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlVGVtcEhpc3RvcnlJdGVtcygpOiB2b2lkIHtcbiAgICAgICAgdmFyIGxhc3RJbmRleCA9IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxO1xuXG4gICAgICAgIHdoaWxlIChsYXN0SW5kZXggPj0gMCAmJiB0aGlzLmhpc3RvcnlbbGFzdEluZGV4XS50ZW1wKSB7XG4gICAgICAgICAgICB0aGlzLmhpc3Rvcnkuc3BsaWNlKGxhc3RJbmRleCwgMSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRIaXN0b3J5SW5kZXggPj0gbGFzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SGlzdG9yeUluZGV4LS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0SW5kZXgtLTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhclJlcG9ydCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1NlYXJjaFdpbmRvd09wZW4gPSB0aGlzLnJlbmRlcmluZ0luUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZUluZGV4ID0gMDtcbiAgICAgICAgdGhpcy50b3RhbFBhZ2VzID0gMDtcbiAgICAgICAgdGhpcy5kb2N1bWVudEluZm8gPSBuZXcgRG9jdW1lbnRJbmZvKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhZ2VOdW1iZXIoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2VJbmRleCArIDE7XG4gICAgfVxufVxuIl19