@mescius/activereportsjs-angular
Version:
ActiveReportsJS components for Angular
256 lines • 29.9 kB
JavaScript
import { Component, ViewChild, Input, Output, EventEmitter } from '@angular/core';
import { ReportDesigner as DesignerNS } from '@mescius/activereportsjs';
import * as i0 from "@angular/core";
export { ColorThemes } from '@mescius/activereportsjs/reportdesigner';
function isReportDef(report) {
return !!(report && report.definition);
}
function hasReportChanged(curr, prev) {
const definitionChanged = (isReportDef(curr) && curr.definition) !== (isReportDef(curr) && curr.definition);
return definitionChanged || (curr && curr.id) !== (prev && prev.id) || (curr && curr.displayName) !== (prev && prev.displayName);
}
export class DesignerComponent {
constructor() {
/** Sets componets width */
this.width = '100%';
/** Sets componets height */
this.height = '100%';
this._actionHandlers = {};
this._disposables = [];
/** documentChanged event. */
this.documentChanged = new EventEmitter();
}
/**
* Sets DataSource templates
* @param value List of DataSource templates
*/
set dataSources(value) {
this._dataSources = value;
if (this._designer)
this._designer.setDataSourceTemplates(this._dataSources || []);
}
/* Gets DataSource templates */
get dataSources() {
return this._dataSources;
}
/**
* Sets handler to be called on open report.
* Handler return Promise with report info or 'undefined' if operation was cancelled.
*/
set onCreate(value) {
this._actionHandlers.onCreate = value;
if (this._designer)
this._designer.setActionHandlers(this._actionHandlers);
}
get onCreate() {
return this._actionHandlers.onCreate;
}
/**
* Sets handler to be called on opening report.
* Handler returns Promise with report info or 'undefined' if operation was cancelled.
*/
set onOpen(value) {
this._actionHandlers.onOpen = value;
if (this._designer)
this._designer.setActionHandlers(this._actionHandlers);
}
get onOpen() {
return this._actionHandlers.onOpen;
}
/**
* Sets handler to be called on request to render current report.
*/
set onRender(value) {
this._actionHandlers.onRender = value;
if (this._designer)
this._designer.setActionHandlers(this._actionHandlers);
}
get onRender() {
return this._actionHandlers.onRender;
}
/**
* Sets handler to be called on saving report.
* Handler returns Promise with new report info if report was saved or 'undefined' if operation was cancelled.
*/
set onSave(value) {
this._actionHandlers.onSave = value;
if (this._designer)
this._designer.setActionHandlers(this._actionHandlers);
}
get onSave() {
return this._actionHandlers.onSave;
}
/**
* Sets handler to be called on saving report as new.
* Handler returns Promise with new report info if report was saved or 'undefined' if operation was cancelled.
*/
set onSaveAs(value) {
this._actionHandlers.onSaveAs = value;
if (this._designer)
this._designer.setActionHandlers(this._actionHandlers);
}
get onSaveAs() {
return this._actionHandlers.onSaveAs;
}
/**
* Sets handler to be called on open custom file menu.
*/
set onOpenFileMenu(value) {
this._actionHandlers.onOpenFileMenu = value;
if (this._designer)
this._designer.setActionHandlers(this._actionHandlers);
}
get onOpenFileMenu() {
return this._actionHandlers.onOpenFileMenu;
}
/**
* Watch report property
*/
set report(value) {
if (hasReportChanged(value, this._report)) {
this._report = value;
if (value)
this.setReport(value, 'override');
else {
if (!this._designer)
return;
this._designer.createReport({ reportType: 'CPL' }, 'override');
}
}
}
ngAfterViewInit() {
const config = this.onInit?.();
this._designer = new DesignerNS.Designer(this.rootElement.nativeElement, config);
this._designer.setResourceProvider({
getImagesList: async () => this.imageList || [],
getReportsList: async () => this.reportList || [],
getMasterReportList: async () => this.masterReportList || [],
getThemesList: async () => this.themeList || [],
getStylesheetList: async () => this.stylesheetList || [],
});
this._designer.setActionHandlers(this._actionHandlers);
if (this.dataSources)
this._designer.setDataSourceTemplates(this._dataSources || []);
if (this._report)
this.setReport(this._report, 'override');
this._disposables.push(this._designer.documentChanged.register((args) => this.documentChanged.emit(args)));
}
/**
* Sets report.
* @param report Report info to load.
* @param whenDirty Action to perform in case of 'dirty' report.
* @param isDirtyInitial Initial value for 'dirty' state after load.
*/
setReport(report, whenDirty, isDirtyInitial) {
if (!this._designer)
return Promise.resolve();
return this._designer.setReport(report, whenDirty, isDirtyInitial);
}
/** Gets current report. */
getReport() {
if (!this._designer)
return Promise.resolve();
return this._designer.getReport();
}
/**
* Creates report.
* @param reportInfo Report info to load.
* @param whenDirty Action to perform in case of 'dirty' report.
*/
createReport(reportInfo, whenDirty) {
if (!this._designer)
return Promise.resolve();
return this._designer.createReport(reportInfo, whenDirty);
}
/**
* Process command.
* @param cmd Command name.
*/
processCommand(cmd) {
if (!this._designer)
return Promise.resolve();
return this._designer.processCommand(cmd);
}
/**
* Returns focus to Designer.
*/
focus() {
if (this._designer == null)
throw new Error('Designer is not initialized yet');
this._designer.focus();
}
/**
* Gets API to manipulate designer.
*/
getEditorAPI() {
if (this._designer == null)
throw new Error('Designer is not initialized yet');
return this._designer.getEditorAPI();
}
/*
* Access to the menu and sidebar panels
*/
getPanelsAPI() {
if (this._designer == null)
throw new Error('Designer is not initialized yet');
return this._designer.getPanelsAPI();
}
/*
* Manipulate notifications panel.
*/
getNotificationsAPI() {
if (this._designer == null)
throw new Error('Designer is not initialized yet');
return this._designer.getNotificationsAPI();
}
ngOnDestroy() {
while (this._disposables.length) {
this._disposables.shift()();
}
this._designer?.destroy();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DesignerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DesignerComponent, selector: "gc-activereports-designer", inputs: { width: "width", height: "height", onInit: "onInit", dataSources: "dataSources", reportList: "reportList", masterReportList: "masterReportList", imageList: "imageList", themeList: "themeList", stylesheetList: "stylesheetList", onCreate: "onCreate", onOpen: "onOpen", onRender: "onRender", onSave: "onSave", onSaveAs: "onSaveAs", onOpenFileMenu: "onOpenFileMenu", report: "report" }, outputs: { documentChanged: "documentChanged" }, viewQueries: [{ propertyName: "rootElement", first: true, predicate: ["designerRoot"], descendants: true }], ngImport: i0, template: "<div #designerRoot [style.width]=\"width\" [style.height]=\"height\"></div>\n", styles: [""] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DesignerComponent, decorators: [{
type: Component,
args: [{ selector: 'gc-activereports-designer', template: "<div #designerRoot [style.width]=\"width\" [style.height]=\"height\"></div>\n" }]
}], ctorParameters: () => [], propDecorators: { rootElement: [{
type: ViewChild,
args: ['designerRoot', { static: false }]
}], width: [{
type: Input
}], height: [{
type: Input
}], onInit: [{
type: Input
}], dataSources: [{
type: Input
}], reportList: [{
type: Input
}], masterReportList: [{
type: Input
}], imageList: [{
type: Input
}], themeList: [{
type: Input
}], stylesheetList: [{
type: Input
}], onCreate: [{
type: Input
}], onOpen: [{
type: Input
}], onRender: [{
type: Input
}], onSave: [{
type: Input
}], onSaveAs: [{
type: Input
}], onOpenFileMenu: [{
type: Input
}], report: [{
type: Input
}], documentChanged: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWN0aXZlcmVwb3J0cy9zcmMvbGliL2Rlc2lnbmVyL2Rlc2lnbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FjdGl2ZXJlcG9ydHMvc3JjL2xpYi9kZXNpZ25lci9kZXNpZ25lci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFpQixTQUFTLEVBQWMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFFeEgsT0FBTyxFQUFFLGNBQWMsSUFBSSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFHeEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBR3RFLFNBQVMsV0FBVyxDQUFDLE1BQTBCO0lBQzlDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFLLE1BQXNDLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsSUFBdUIsRUFBRSxJQUF1QjtJQUN6RSxNQUFNLGlCQUFpQixHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUcsT0FBTyxpQkFBaUIsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDbEksQ0FBQztB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QUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDL0UsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVELFdBQVc7UUFDVixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUcsRUFBRSxDQUFDO1FBQzlCLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7K0dBck9XLGlCQUFpQjttR0FBakIsaUJBQWlCLHVtQkN0QjlCLCtFQUNBOzs0RkRxQmEsaUJBQWlCO2tCQUw3QixTQUFTOytCQUNDLDJCQUEyQjt3REFLUyxXQUFXO3NCQUF4RCxTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBT25DLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBTUcsTUFBTTtzQkFBZCxLQUFLO2dCQU9PLFdBQVc7c0JBQXZCLEtBQUs7Z0JBVUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBUU8sUUFBUTtzQkFBcEIsS0FBSztnQkFZTyxNQUFNO3NCQUFsQixLQUFLO2dCQVdPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBWU8sTUFBTTtzQkFBbEIsS0FBSztnQkFZTyxRQUFRO3NCQUFwQixLQUFLO2dCQVdPLGNBQWM7c0JBQTFCLEtBQUs7Z0JBZU8sTUFBTTtzQkFBbEIsS0FBSztnQkFZSSxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBBZnRlclZpZXdJbml0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFJlcG9ydERlc2lnbmVyIGFzIERlc2lnbmVyTlMgfSBmcm9tICdAZ3JhcGVjaXR5L2FjdGl2ZXJlcG9ydHMnO1xuaW1wb3J0IHsgRG9jdW1lbnRDaGFuZ2VkRXZlbnRBcmdzIH0gZnJvbSAnQGdyYXBlY2l0eS9hY3RpdmVyZXBvcnRzL3JlcG9ydGRlc2lnbmVyJztcblxuZXhwb3J0IHsgQ29sb3JUaGVtZXMgfSBmcm9tICdAZ3JhcGVjaXR5L2FjdGl2ZXJlcG9ydHMvcmVwb3J0ZGVzaWduZXInO1xuZXhwb3J0IHR5cGUgeyBDb2xvclRoZW1lIH0gZnJvbSAnQGdyYXBlY2l0eS9hY3RpdmVyZXBvcnRzL3JlcG9ydGRlc2lnbmVyJztcblxuZnVuY3Rpb24gaXNSZXBvcnREZWYocmVwb3J0PzogRGVzaWduZXJOUy5SZXBvcnQpOiByZXBvcnQgaXMgRGVzaWduZXJOUy5SZXBvcnREZWZpbml0aW9uIHtcblx0cmV0dXJuICEhKHJlcG9ydCAmJiAocmVwb3J0IGFzIERlc2lnbmVyTlMuUmVwb3J0RGVmaW5pdGlvbikuZGVmaW5pdGlvbik7XG59XG5cbmZ1bmN0aW9uIGhhc1JlcG9ydENoYW5nZWQoY3VycjogRGVzaWduZXJOUy5SZXBvcnQsIHByZXY6IERlc2lnbmVyTlMuUmVwb3J0KSB7XG5cdGNvbnN0IGRlZmluaXRpb25DaGFuZ2VkID0gKGlzUmVwb3J0RGVmKGN1cnIpICYmIGN1cnIuZGVmaW5pdGlvbikgIT09IChpc1JlcG9ydERlZihjdXJyKSAmJiBjdXJyLmRlZmluaXRpb24pO1xuXHRyZXR1cm4gZGVmaW5pdGlvbkNoYW5nZWQgfHwgKGN1cnIgJiYgY3Vyci5pZCkgIT09IChwcmV2ICYmIHByZXYuaWQpIHx8IChjdXJyICYmIGN1cnIuZGlzcGxheU5hbWUpICE9PSAocHJldiAmJiBwcmV2LmRpc3BsYXlOYW1lKTtcbn1cblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnZ2MtYWN0aXZlcmVwb3J0cy1kZXNpZ25lcicsXG5cdHRlbXBsYXRlVXJsOiAnLi9kZXNpZ25lci5jb21wb25lbnQuaHRtbCcsXG5cdHN0eWxlVXJsczogWycuL2Rlc2lnbmVyLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRGVzaWduZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXHRAVmlld0NoaWxkKCdkZXNpZ25lclJvb3QnLCB7IHN0YXRpYzogZmFsc2UgfSkgcm9vdEVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cblx0cHJpdmF0ZSBfZGVzaWduZXI/OiBEZXNpZ25lck5TLkRlc2lnbmVyO1xuXG5cdGNvbnN0cnVjdG9yKCkge31cblxuXHQvKiogU2V0cyBjb21wb25ldHMgd2lkdGggKi9cblx0QElucHV0KCkgd2lkdGggPSAnMTAwJSc7XG5cdC8qKiBTZXRzIGNvbXBvbmV0cyBoZWlnaHQgKi9cblx0QElucHV0KCkgaGVpZ2h0ID0gJzEwMCUnO1xuXG5cdC8qKlxuXHQgKiBDYWxsZWQgYmVmb3JlIGRlc2lnbmVyIGluaXRpYWxpemF0aW9uLlxuXHQgKiBAcmV0dXJucyBEZXNpZ25lckNvbmZpZyB0byBpbml0aWFsaXplIGRlc2lnbmVyIGluc3RhbmNlLlxuXHQgKi9cblx0QElucHV0KCkgb25Jbml0PzogKCkgPT4gRGVzaWduZXJOUy5EZXNpZ25lckNvbmZpZztcblxuXHRwcml2YXRlIF9kYXRhU291cmNlcz86IERlc2lnbmVyTlMuRGF0YVNvdXJjZVRlbXBsYXRlW107XG5cdC8qKlxuXHQgKiBTZXRzIERhdGFTb3VyY2UgdGVtcGxhdGVzXG5cdCAqIEBwYXJhbSB2YWx1ZSBMaXN0IG9mIERhdGFTb3VyY2UgdGVtcGxhdGVzXG5cdCAqL1xuXHRASW5wdXQoKSBzZXQgZGF0YVNvdXJjZXModmFsdWUpIHtcblx0XHR0aGlzLl9kYXRhU291cmNlcyA9IHZhbHVlO1xuXHRcdGlmICh0aGlzLl9kZXNpZ25lcikgdGhpcy5fZGVzaWduZXIuc2V0RGF0YVNvdXJjZVRlbXBsYXRlcyh0aGlzLl9kYXRhU291cmNlcyB8fCBbXSk7XG5cdH1cblx0LyogR2V0cyBEYXRhU291cmNlIHRlbXBsYXRlcyAqL1xuXHRnZXQgZGF0YVNvdXJjZXMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VzO1xuXHR9XG5cblx0LyoqIFNldHMgZXh0ZXJuYWwgcmVwb3J0IGxpc3QuICovXG5cdEBJbnB1dCgpIHJlcG9ydExpc3Q/OiBEZXNpZ25lck5TLlJlcG9ydFJlc291cmNlSW5mb1tdO1xuXHQvKiogU2V0cyBleHRlcm5hbCBtYXN0ZXIgcmVwb3J0IGxpc3QuICovXG5cdEBJbnB1dCgpIG1hc3RlclJlcG9ydExpc3Q/OiBEZXNpZ25lck5TLlJlcG9ydFJlc291cmNlSW5mb1tdO1xuXHQvKiogU2V0cyBleHRlcm5hbCBpbWFnZSBsaXN0LiAqL1xuXHRASW5wdXQoKSBpbWFnZUxpc3Q/OiBEZXNpZ25lck5TLkltYWdlUmVzb3VyY2VJbmZvW107XG5cdC8qKiBTZXRzIHRoZW1lIGxpc3QuICovXG5cdEBJbnB1dCgpIHRoZW1lTGlzdD86IERlc2lnbmVyTlMuVGhlbWVSZXNvdXJjZUluZm9bXTtcblx0LyoqIFNldHMgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGV4dGVybmFsIHN0eWxlc2hlZXRzLiAqL1xuXHRASW5wdXQoKSBzdHlsZXNoZWV0TGlzdD86IERlc2lnbmVyTlMuU3R5bGVzaGVldFJlc291cmNlSW5mb1tdO1xuXG5cdHByaXZhdGUgX2FjdGlvbkhhbmRsZXJzOiBEZXNpZ25lck5TLkFjdGlvbkhhbmRsZXJzID0ge307XG5cblx0LyoqXG5cdCAqIFNldHMgaGFuZGxlciB0byBiZSBjYWxsZWQgb24gb3BlbiByZXBvcnQuXG5cdCAqIEhhbmRsZXIgcmV0dXJuIFByb21pc2Ugd2l0aCByZXBvcnQgaW5mbyBvciAndW5kZWZpbmVkJyBpZiBvcGVyYXRpb24gd2FzIGNhbmNlbGxlZC5cblx0ICovXG5cdEBJbnB1dCgpIHNldCBvbkNyZWF0ZSh2YWx1ZTogRGVzaWduZXJOUy5BY3Rpb25IYW5kbGVyc1snb25DcmVhdGUnXSkge1xuXHRcdHRoaXMuX2FjdGlvbkhhbmRsZXJzLm9uQ3JlYXRlID0gdmFsdWU7XG5cdFx0aWYgKHRoaXMuX2Rlc2lnbmVyKSB0aGlzLl9kZXNpZ25lci5zZXRBY3Rpb25IYW5kbGVycyh0aGlzLl9hY3Rpb25IYW5kbGVycyk7XG5cdH1cblx0Z2V0IG9uQ3JlYXRlKCkge1xuXHRcdHJldHVybiB0aGlzLl9hY3Rpb25IYW5kbGVycy5vbkNyZWF0ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIGhhbmRsZXIgdG8gYmUgY2FsbGVkIG9uIG9wZW5pbmcgcmVwb3J0LlxuXHQgKiBIYW5kbGVyIHJldHVybnMgUHJvbWlzZSB3aXRoIHJlcG9ydCBpbmZvIG9yICd1bmRlZmluZWQnIGlmIG9wZXJhdGlvbiB3YXMgY2FuY2VsbGVkLlxuXHQgKi9cblx0QElucHV0KCkgc2V0IG9uT3Blbih2YWx1ZTogRGVzaWduZXJOUy5BY3Rpb25IYW5kbGVyc1snb25PcGVuJ10pIHtcblx0XHR0aGlzLl9hY3Rpb25IYW5kbGVycy5vbk9wZW4gPSB2YWx1ZTtcblx0XHRpZiAodGhpcy5fZGVzaWduZXIpIHRoaXMuX2Rlc2lnbmVyLnNldEFjdGlvbkhhbmRsZXJzKHRoaXMuX2FjdGlvbkhhbmRsZXJzKTtcblx0fVxuXHRnZXQgb25PcGVuKCkge1xuXHRcdHJldHVybiB0aGlzLl9hY3Rpb25IYW5kbGVycy5vbk9wZW47XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBoYW5kbGVyIHRvIGJlIGNhbGxlZCBvbiByZXF1ZXN0IHRvIHJlbmRlciBjdXJyZW50IHJlcG9ydC5cblx0ICovXG5cdEBJbnB1dCgpIHNldCBvblJlbmRlcih2YWx1ZTogRGVzaWduZXJOUy5BY3Rpb25IYW5kbGVyc1snb25SZW5kZXInXSkge1xuXHRcdHRoaXMuX2FjdGlvbkhhbmRsZXJzLm9uUmVuZGVyID0gdmFsdWU7XG5cdFx0aWYgKHRoaXMuX2Rlc2lnbmVyKSB0aGlzLl9kZXNpZ25lci5zZXRBY3Rpb25IYW5kbGVycyh0aGlzLl9hY3Rpb25IYW5kbGVycyk7XG5cdH1cblx0Z2V0IG9uUmVuZGVyKCkge1xuXHRcdHJldHVybiB0aGlzLl9hY3Rpb25IYW5kbGVycy5vblJlbmRlcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIGhhbmRsZXIgdG8gYmUgY2FsbGVkIG9uIHNhdmluZyByZXBvcnQuXG5cdCAqIEhhbmRsZXIgcmV0dXJucyBQcm9taXNlIHdpdGggbmV3IHJlcG9ydCBpbmZvIGlmIHJlcG9ydCB3YXMgc2F2ZWQgb3IgJ3VuZGVmaW5lZCcgaWYgb3BlcmF0aW9uIHdhcyBjYW5jZWxsZWQuXG5cdCAqL1xuXHRASW5wdXQoKSBzZXQgb25TYXZlKHZhbHVlOiBEZXNpZ25lck5TLkFjdGlvbkhhbmRsZXJzWydvblNhdmUnXSkge1xuXHRcdHRoaXMuX2FjdGlvbkhhbmRsZXJzLm9uU2F2ZSA9IHZhbHVlO1xuXHRcdGlmICh0aGlzLl9kZXNpZ25lcikgdGhpcy5fZGVzaWduZXIuc2V0QWN0aW9uSGFuZGxlcnModGhpcy5fYWN0aW9uSGFuZGxlcnMpO1xuXHR9XG5cdGdldCBvblNhdmUoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2FjdGlvbkhhbmRsZXJzLm9uU2F2ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIGhhbmRsZXIgdG8gYmUgY2FsbGVkIG9uIHNhdmluZyByZXBvcnQgYXMgbmV3LlxuXHQgKiBIYW5kbGVyIHJldHVybnMgUHJvbWlzZSB3aXRoIG5ldyByZXBvcnQgaW5mbyBpZiByZXBvcnQgd2FzIHNhdmVkIG9yICd1bmRlZmluZWQnIGlmIG9wZXJhdGlvbiB3YXMgY2FuY2VsbGVkLlxuXHQgKi9cblx0QElucHV0KCkgc2V0IG9uU2F2ZUFzKHZhbHVlOiBEZXNpZ25lck5TLkFjdGlvbkhhbmRsZXJzWydvblNhdmVBcyddKSB7XG5cdFx0dGhpcy5fYWN0aW9uSGFuZGxlcnMub25TYXZlQXMgPSB2YWx1ZTtcblx0XHRpZiAodGhpcy5fZGVzaWduZXIpIHRoaXMuX2Rlc2lnbmVyLnNldEFjdGlvbkhhbmRsZXJzKHRoaXMuX2FjdGlvbkhhbmRsZXJzKTtcblx0fVxuXHRnZXQgb25TYXZlQXMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2FjdGlvbkhhbmRsZXJzLm9uU2F2ZUFzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgaGFuZGxlciB0byBiZSBjYWxsZWQgb24gb3BlbiBjdXN0b20gZmlsZSBtZW51LlxuXHQgKi9cblx0QElucHV0KCkgc2V0IG9uT3BlbkZpbGVNZW51KHZhbHVlOiBEZXNpZ25lck5TLkFjdGlvbkhhbmRsZXJzWydvbk9wZW5GaWxlTWVudSddKSB7XG5cdFx0dGhpcy5fYWN0aW9uSGFuZGxlcnMub25PcGVuRmlsZU1lbnUgPSB2YWx1ZTtcblx0XHRpZiAodGhpcy5fZGVzaWduZXIpIHRoaXMuX2Rlc2lnbmVyLnNldEFjdGlvbkhhbmRsZXJzKHRoaXMuX2FjdGlvbkhhbmRsZXJzKTtcblx0fVxuXHRnZXQgb25PcGVuRmlsZU1lbnUoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2FjdGlvbkhhbmRsZXJzLm9uT3BlbkZpbGVNZW51O1xuXHR9XG5cblx0cHJpdmF0ZSBfcmVwb3J0OiBEZXNpZ25lck5TLlJlcG9ydDtcblxuXHRwcml2YXRlIF9kaXNwb3NhYmxlczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblxuXHQvKipcblx0ICogV2F0Y2ggcmVwb3J0IHByb3BlcnR5XG5cdCAqL1xuXHRASW5wdXQoKSBzZXQgcmVwb3J0KHZhbHVlOiBEZXNpZ25lck5TLlJlcG9ydCkge1xuXHRcdGlmIChoYXNSZXBvcnRDaGFuZ2VkKHZhbHVlLCB0aGlzLl9yZXBvcnQpKSB7XG5cdFx0XHR0aGlzLl9yZXBvcnQgPSB2YWx1ZTtcblx0XHRcdGlmICh2YWx1ZSkgdGhpcy5zZXRSZXBvcnQodmFsdWUsICdvdmVycmlkZScpO1xuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGlmICghdGhpcy5fZGVzaWduZXIpIHJldHVybjtcblx0XHRcdFx0dGhpcy5fZGVzaWduZXIuY3JlYXRlUmVwb3J0KHsgcmVwb3J0VHlwZTogJ0NQTCcgfSwgJ292ZXJyaWRlJyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqIGRvY3VtZW50Q2hhbmdlZCBldmVudC4gKi9cblx0QE91dHB1dCgpIGRvY3VtZW50Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RG9jdW1lbnRDaGFuZ2VkRXZlbnRBcmdzPigpO1xuXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpIHtcblx0XHRjb25zdCBjb25maWcgPSB0aGlzLm9uSW5pdD8uKCk7XG5cdFx0dGhpcy5fZGVzaWduZXIgPSBuZXcgRGVzaWduZXJOUy5EZXNpZ25lcih0aGlzLnJvb3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIGNvbmZpZyk7XG5cdFx0dGhpcy5fZGVzaWduZXIuc2V0UmVzb3VyY2VQcm92aWRlcih7XG5cdFx0XHRnZXRJbWFnZXNMaXN0OiBhc3luYyAoKSA9PiB0aGlzLmltYWdlTGlzdCB8fCBbXSxcblx0XHRcdGdldFJlcG9ydHNMaXN0OiBhc3luYyAoKSA9PiB0aGlzLnJlcG9ydExpc3QgfHwgW10sXG5cdFx0XHRnZXRNYXN0ZXJSZXBvcnRMaXN0OiBhc3luYyAoKSA9PiB0aGlzLm1hc3RlclJlcG9ydExpc3QgfHwgW10sXG5cdFx0XHRnZXRUaGVtZXNMaXN0OiBhc3luYyAoKSA9PiB0aGlzLnRoZW1lTGlzdCB8fCBbXSxcblx0XHRcdGdldFN0eWxlc2hlZXRMaXN0OiBhc3luYyAoKSA9PiB0aGlzLnN0eWxlc2hlZXRMaXN0IHx8IFtdLFxuXHRcdH0pO1xuXHRcdHRoaXMuX2Rlc2lnbmVyLnNldEFjdGlvbkhhbmRsZXJzKHRoaXMuX2FjdGlvbkhhbmRsZXJzKTtcblx0XHRpZiAodGhpcy5kYXRhU291cmNlcykgdGhpcy5fZGVzaWduZXIuc2V0RGF0YVNvdXJjZVRlbXBsYXRlcyh0aGlzLl9kYXRhU291cmNlcyB8fCBbXSk7XG5cdFx0aWYgKHRoaXMuX3JlcG9ydCkgdGhpcy5zZXRSZXBvcnQodGhpcy5fcmVwb3J0LCAnb3ZlcnJpZGUnKTtcblxuXHRcdHRoaXMuX2Rpc3Bvc2FibGVzLnB1c2godGhpcy5fZGVzaWduZXIuZG9jdW1lbnRDaGFuZ2VkLnJlZ2lzdGVyKChhcmdzKSA9PiB0aGlzLmRvY3VtZW50Q2hhbmdlZC5lbWl0KGFyZ3MpKSk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyByZXBvcnQuXG5cdCAqIEBwYXJhbSByZXBvcnQgUmVwb3J0IGluZm8gdG8gbG9hZC5cblx0ICogQHBhcmFtIHdoZW5EaXJ0eSBBY3Rpb24gdG8gcGVyZm9ybSBpbiBjYXNlIG9mICdkaXJ0eScgcmVwb3J0LlxuXHQgKiBAcGFyYW0gaXNEaXJ0eUluaXRpYWwgSW5pdGlhbCB2YWx1ZSBmb3IgJ2RpcnR5JyBzdGF0ZSBhZnRlciBsb2FkLlxuXHQgKi9cblx0c2V0UmVwb3J0KHJlcG9ydDogRGVzaWduZXJOUy5SZXBvcnQsIHdoZW5EaXJ0eT86IERlc2lnbmVyTlMuV2hlbkRpcnR5LCBpc0RpcnR5SW5pdGlhbD86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuX2Rlc2lnbmVyKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fZGVzaWduZXIuc2V0UmVwb3J0KHJlcG9ydCwgd2hlbkRpcnR5LCBpc0RpcnR5SW5pdGlhbCk7XG5cdH1cblxuXHQvKiogR2V0cyBjdXJyZW50IHJlcG9ydC4gKi9cblx0Z2V0UmVwb3J0KCk6IFByb21pc2U8RGVzaWduZXJOUy5SZXBvcnRJbmZvPiB7XG5cdFx0aWYgKCF0aGlzLl9kZXNpZ25lcikgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpIGFzIGFueTtcblxuXHRcdHJldHVybiB0aGlzLl9kZXNpZ25lci5nZXRSZXBvcnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHJlcG9ydC5cblx0ICogQHBhcmFtIHJlcG9ydEluZm8gUmVwb3J0IGluZm8gdG8gbG9hZC5cblx0ICogQHBhcmFtIHdoZW5EaXJ0eSBBY3Rpb24gdG8gcGVyZm9ybSBpbiBjYXNlIG9mICdkaXJ0eScgcmVwb3J0LlxuXHQgKi9cblx0Y3JlYXRlUmVwb3J0KHJlcG9ydEluZm86IERlc2lnbmVyTlMuTmV3UmVwb3J0SW5mbywgd2hlbkRpcnR5PzogRGVzaWduZXJOUy5XaGVuRGlydHkpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuX2Rlc2lnbmVyKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0cmV0dXJuIHRoaXMuX2Rlc2lnbmVyLmNyZWF0ZVJlcG9ydChyZXBvcnRJbmZvLCB3aGVuRGlydHkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgY29tbWFuZC5cblx0ICogQHBhcmFtIGNtZCBDb21tYW5kIG5hbWUuXG5cdCAqL1xuXHRwcm9jZXNzQ29tbWFuZChjbWQ6IERlc2lnbmVyTlMuRGVzaWduZXJDb21tYW5kKSB7XG5cdFx0aWYgKCF0aGlzLl9kZXNpZ25lcikgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2Rlc2lnbmVyLnByb2Nlc3NDb21tYW5kKGNtZCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBmb2N1cyB0byBEZXNpZ25lci5cblx0ICovXG5cdGZvY3VzKCkge1xuXHRcdGlmICh0aGlzLl9kZXNpZ25lciA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ0Rlc2lnbmVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQnKTtcblx0XHR0aGlzLl9kZXNpZ25lci5mb2N1cygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgQVBJIHRvIG1hbmlwdWxhdGUgZGVzaWduZXIuXG5cdCAqL1xuXHRnZXRFZGl0b3JBUEkoKTogUHJvbWlzZTxEZXNpZ25lck5TLkVkaXRvckFQST4ge1xuXHRcdGlmICh0aGlzLl9kZXNpZ25lciA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ0Rlc2lnbmVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQnKTtcblx0XHRyZXR1cm4gdGhpcy5fZGVzaWduZXIuZ2V0RWRpdG9yQVBJKCk7XG5cdH1cblxuXHQvKlxuXHQgKiBBY2Nlc3MgdG8gdGhlIG1lbnUgYW5kIHNpZGViYXIgcGFuZWxzXG5cdCAqL1xuXHRnZXRQYW5lbHNBUEkoKTogUHJvbWlzZTxEZXNpZ25lck5TLlBhbmVsc0FQST4ge1xuXHRcdGlmICh0aGlzLl9kZXNpZ25lciA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ0Rlc2lnbmVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQnKTtcblx0XHRyZXR1cm4gdGhpcy5fZGVzaWduZXIuZ2V0UGFuZWxzQVBJKCk7XG5cdH1cblxuXHQvKlxuXHQgKiBNYW5pcHVsYXRlIG5vdGlmaWNhdGlvbnMgcGFuZWwuXG5cdCAqL1xuXHRnZXROb3RpZmljYXRpb25zQVBJKCk6IFByb21pc2U8RGVzaWduZXJOUy5Ob3RpZmljYXRpb25zQVBJPiB7XG5cdFx0aWYgKHRoaXMuX2Rlc2lnbmVyID09IG51bGwpIHRocm93IG5ldyBFcnJvcignRGVzaWduZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCcpO1xuXHRcdHJldHVybiB0aGlzLl9kZXNpZ25lci5nZXROb3RpZmljYXRpb25zQVBJKCk7XG5cdH1cblxuXHRuZ09uRGVzdHJveSgpIHtcblx0XHR3aGlsZSAodGhpcy5fZGlzcG9zYWJsZXMubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLl9kaXNwb3NhYmxlcy5zaGlmdCgpISgpO1xuXHRcdH1cblx0XHR0aGlzLl9kZXNpZ25lcj8uZGVzdHJveSgpO1xuXHR9XG59XG4iLCI8ZGl2ICNkZXNpZ25lclJvb3QgW3N0eWxlLndpZHRoXT1cIndpZHRoXCIgW3N0eWxlLmhlaWdodF09XCJoZWlnaHRcIj48L2Rpdj5cbiJdfQ==