@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.dispose();
}
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWN0aXZlcmVwb3J0cy9zcmMvbGliL2Rlc2lnbmVyL2Rlc2lnbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FjdGl2ZXJlcG9ydHMvc3JjL2xpYi9kZXNpZ25lci9kZXNpZ25lci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFpQixTQUFTLEVBQWMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFFeEgsT0FBTyxFQUFFLGNBQWMsSUFBSSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFHeEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBR3RFLFNBQVMsV0FBVyxDQUFDLE1BQTBCO0lBQzlDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFLLE1BQXNDLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsSUFBdUIsRUFBRSxJQUF1QjtJQUN6RSxNQUFNLGlCQUFpQixHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUcsT0FBTyxpQkFBaUIsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDbEksQ0FBQztBQU9ELE1BQU0sT0FBTyxpQkFBaUI7SUFLN0I7UUFFQSwyQkFBMkI7UUFDbEIsVUFBSyxHQUFHLE1BQU0sQ0FBQztRQUN4Qiw0QkFBNEI7UUFDbkIsV0FBTSxHQUFHLE1BQU0sQ0FBQztRQWlDakIsb0JBQWUsR0FBOEIsRUFBRSxDQUFDO1FBMEVoRCxpQkFBWSxHQUFzQixFQUFFLENBQUM7UUFnQjdDLDZCQUE2QjtRQUNuQixvQkFBZSxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO0lBakkxRCxDQUFDO0lBY2hCOzs7T0FHRztJQUNILElBQWEsV0FBVyxDQUFDLEtBQUs7UUFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxJQUFJLENBQUMsU0FBUztZQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBQ0QsK0JBQStCO0lBQy9CLElBQUksV0FBVztRQUNkLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMxQixDQUFDO0lBZUQ7OztPQUdHO0lBQ0gsSUFBYSxRQUFRLENBQUMsS0FBNEM7UUFDakUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RDLElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQ0QsSUFBSSxRQUFRO1FBQ1gsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBYSxNQUFNLENBQUMsS0FBMEM7UUFDN0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQ0QsSUFBSSxNQUFNO1FBQ1QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFhLFFBQVEsQ0FBQyxLQUE0QztRQUNqRSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEMsSUFBSSxJQUFJLENBQUMsU0FBUztZQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFDRCxJQUFJLFFBQVE7UUFDWCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFhLE1BQU0sQ0FBQyxLQUEwQztRQUM3RCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsU0FBUztZQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFDRCxJQUFJLE1BQU07UUFDVCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFhLFFBQVEsQ0FBQyxLQUE0QztRQUNqRSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEMsSUFBSSxJQUFJLENBQUMsU0FBUztZQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFDRCxJQUFJLFFBQVE7UUFDWCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQWEsY0FBYyxDQUFDLEtBQWtEO1FBQzdFLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QyxJQUFJLElBQUksQ0FBQyxTQUFTO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUNELElBQUksY0FBYztRQUNqQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDO0lBQzVDLENBQUM7SUFNRDs7T0FFRztJQUNILElBQWEsTUFBTSxDQUFDLEtBQXdCO1FBQzNDLElBQUksZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksS0FBSztnQkFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztpQkFDeEMsQ0FBQztnQkFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7b0JBQUUsT0FBTztnQkFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDaEUsQ0FBQztRQUNGLENBQUM7SUFDRixDQUFDO0lBS0QsZUFBZTtRQUNkLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUM7WUFDbEMsYUFBYSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFO1lBQy9DLGNBQWMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRTtZQUNqRCxtQkFBbUIsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFO1lBQzVELGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRTtZQUMvQyxpQkFBaUIsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksRUFBRTtTQUN4RCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN2RCxJQUFJLElBQUksQ0FBQyxXQUFXO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFM0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBUyxDQUFDLE1BQXlCLEVBQUUsU0FBZ0MsRUFBRSxjQUF3QjtRQUM5RixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU5QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELDJCQUEyQjtJQUMzQixTQUFTO1FBQ1IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFTLENBQUM7UUFFckQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFBWSxDQUFDLFVBQW9DLEVBQUUsU0FBZ0M7UUFDbEYsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDOUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWMsQ0FBQyxHQUErQjtRQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU5QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDSixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVk7UUFDWCxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUMvRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWTtRQUNYLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBQy9FLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUI7UUFDbEIsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDL0UsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVELFdBQVc7UUFDVixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUcsRUFBRSxDQUFDO1FBQzlCLENBQUM7UUFDRCw0QkFBNEI7SUFDN0IsQ0FBQzsrR0FyT1csaUJBQWlCO21HQUFqQixpQkFBaUIsdW1CQ3RCOUIsK0VBQ0E7OzRGRHFCYSxpQkFBaUI7a0JBTDdCLFNBQVM7K0JBQ0MsMkJBQTJCO3dEQUtTLFdBQVc7c0JBQXhELFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFPbkMsS0FBSztzQkFBYixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFNRyxNQUFNO3NCQUFkLEtBQUs7Z0JBT08sV0FBVztzQkFBdkIsS0FBSztnQkFVRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFRTyxRQUFRO3NCQUFwQixLQUFLO2dCQVlPLE1BQU07c0JBQWxCLEtBQUs7Z0JBV08sUUFBUTtzQkFBcEIsS0FBSztnQkFZTyxNQUFNO3NCQUFsQixLQUFLO2dCQVlPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBV08sY0FBYztzQkFBMUIsS0FBSztnQkFlTyxNQUFNO3NCQUFsQixLQUFLO2dCQVlJLGVBQWU7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEFmdGVyVmlld0luaXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUmVwb3J0RGVzaWduZXIgYXMgRGVzaWduZXJOUyB9IGZyb20gJ0BncmFwZWNpdHkvYWN0aXZlcmVwb3J0cyc7XG5pbXBvcnQgeyBEb2N1bWVudENoYW5nZWRFdmVudEFyZ3MgfSBmcm9tICdAZ3JhcGVjaXR5L2FjdGl2ZXJlcG9ydHMvcmVwb3J0ZGVzaWduZXInO1xuXG5leHBvcnQgeyBDb2xvclRoZW1lcyB9IGZyb20gJ0BncmFwZWNpdHkvYWN0aXZlcmVwb3J0cy9yZXBvcnRkZXNpZ25lcic7XG5leHBvcnQgdHlwZSB7IENvbG9yVGhlbWUgfSBmcm9tICdAZ3JhcGVjaXR5L2FjdGl2ZXJlcG9ydHMvcmVwb3J0ZGVzaWduZXInO1xuXG5mdW5jdGlvbiBpc1JlcG9ydERlZihyZXBvcnQ/OiBEZXNpZ25lck5TLlJlcG9ydCk6IHJlcG9ydCBpcyBEZXNpZ25lck5TLlJlcG9ydERlZmluaXRpb24ge1xuXHRyZXR1cm4gISEocmVwb3J0ICYmIChyZXBvcnQgYXMgRGVzaWduZXJOUy5SZXBvcnREZWZpbml0aW9uKS5kZWZpbml0aW9uKTtcbn1cblxuZnVuY3Rpb24gaGFzUmVwb3J0Q2hhbmdlZChjdXJyOiBEZXNpZ25lck5TLlJlcG9ydCwgcHJldjogRGVzaWduZXJOUy5SZXBvcnQpIHtcblx0Y29uc3QgZGVmaW5pdGlvbkNoYW5nZWQgPSAoaXNSZXBvcnREZWYoY3VycikgJiYgY3Vyci5kZWZpbml0aW9uKSAhPT0gKGlzUmVwb3J0RGVmKGN1cnIpICYmIGN1cnIuZGVmaW5pdGlvbik7XG5cdHJldHVybiBkZWZpbml0aW9uQ2hhbmdlZCB8fCAoY3VyciAmJiBjdXJyLmlkKSAhPT0gKHByZXYgJiYgcHJldi5pZCkgfHwgKGN1cnIgJiYgY3Vyci5kaXNwbGF5TmFtZSkgIT09IChwcmV2ICYmIHByZXYuZGlzcGxheU5hbWUpO1xufVxuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICdnYy1hY3RpdmVyZXBvcnRzLWRlc2lnbmVyJyxcblx0dGVtcGxhdGVVcmw6ICcuL2Rlc2lnbmVyLmNvbXBvbmVudC5odG1sJyxcblx0c3R5bGVVcmxzOiBbJy4vZGVzaWduZXIuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBEZXNpZ25lckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG5cdEBWaWV3Q2hpbGQoJ2Rlc2lnbmVyUm9vdCcsIHsgc3RhdGljOiBmYWxzZSB9KSByb290RWxlbWVudDogRWxlbWVudFJlZjtcblxuXHRwcml2YXRlIF9kZXNpZ25lcj86IERlc2lnbmVyTlMuRGVzaWduZXI7XG5cblx0Y29uc3RydWN0b3IoKSB7fVxuXG5cdC8qKiBTZXRzIGNvbXBvbmV0cyB3aWR0aCAqL1xuXHRASW5wdXQoKSB3aWR0aCA9ICcxMDAlJztcblx0LyoqIFNldHMgY29tcG9uZXRzIGhlaWdodCAqL1xuXHRASW5wdXQoKSBoZWlnaHQgPSAnMTAwJSc7XG5cblx0LyoqXG5cdCAqIENhbGxlZCBiZWZvcmUgZGVzaWduZXIgaW5pdGlhbGl6YXRpb24uXG5cdCAqIEByZXR1cm5zIERlc2lnbmVyQ29uZmlnIHRvIGluaXRpYWxpemUgZGVzaWduZXIgaW5zdGFuY2UuXG5cdCAqL1xuXHRASW5wdXQoKSBvbkluaXQ/OiAoKSA9PiBEZXNpZ25lck5TLkRlc2lnbmVyQ29uZmlnO1xuXG5cdHByaXZhdGUgX2RhdGFTb3VyY2VzPzogRGVzaWduZXJOUy5EYXRhU291cmNlVGVtcGxhdGVbXTtcblx0LyoqXG5cdCAqIFNldHMgRGF0YVNvdXJjZSB0ZW1wbGF0ZXNcblx0ICogQHBhcmFtIHZhbHVlIExpc3Qgb2YgRGF0YVNvdXJjZSB0ZW1wbGF0ZXNcblx0ICovXG5cdEBJbnB1dCgpIHNldCBkYXRhU291cmNlcyh2YWx1ZSkge1xuXHRcdHRoaXMuX2RhdGFTb3VyY2VzID0gdmFsdWU7XG5cdFx0aWYgKHRoaXMuX2Rlc2lnbmVyKSB0aGlzLl9kZXNpZ25lci5zZXREYXRhU291cmNlVGVtcGxhdGVzKHRoaXMuX2RhdGFTb3VyY2VzIHx8IFtdKTtcblx0fVxuXHQvKiBHZXRzIERhdGFTb3VyY2UgdGVtcGxhdGVzICovXG5cdGdldCBkYXRhU291cmNlcygpIHtcblx0XHRyZXR1cm4gdGhpcy5fZGF0YVNvdXJjZXM7XG5cdH1cblxuXHQvKiogU2V0cyBleHRlcm5hbCByZXBvcnQgbGlzdC4gKi9cblx0QElucHV0KCkgcmVwb3J0TGlzdD86IERlc2lnbmVyTlMuUmVwb3J0UmVzb3VyY2VJbmZvW107XG5cdC8qKiBTZXRzIGV4dGVybmFsIG1hc3RlciByZXBvcnQgbGlzdC4gKi9cblx0QElucHV0KCkgbWFzdGVyUmVwb3J0TGlzdD86IERlc2lnbmVyTlMuUmVwb3J0UmVzb3VyY2VJbmZvW107XG5cdC8qKiBTZXRzIGV4dGVybmFsIGltYWdlIGxpc3QuICovXG5cdEBJbnB1dCgpIGltYWdlTGlzdD86IERlc2lnbmVyTlMuSW1hZ2VSZXNvdXJjZUluZm9bXTtcblx0LyoqIFNldHMgdGhlbWUgbGlzdC4gKi9cblx0QElucHV0KCkgdGhlbWVMaXN0PzogRGVzaWduZXJOUy5UaGVtZVJlc291cmNlSW5mb1tdO1xuXHQvKiogU2V0cyB0aGUgbGlzdCBvZiBhdmFpbGFibGUgZXh0ZXJuYWwgc3R5bGVzaGVldHMuICovXG5cdEBJbnB1dCgpIHN0eWxlc2hlZXRMaXN0PzogRGVzaWduZXJOUy5TdHlsZXNoZWV0UmVzb3VyY2VJbmZvW107XG5cblx0cHJpdmF0ZSBfYWN0aW9uSGFuZGxlcnM6IERlc2lnbmVyTlMuQWN0aW9uSGFuZGxlcnMgPSB7fTtcblxuXHQvKipcblx0ICogU2V0cyBoYW5kbGVyIHRvIGJlIGNhbGxlZCBvbiBvcGVuIHJlcG9ydC5cblx0ICogSGFuZGxlciByZXR1cm4gUHJvbWlzZSB3aXRoIHJlcG9ydCBpbmZvIG9yICd1bmRlZmluZWQnIGlmIG9wZXJhdGlvbiB3YXMgY2FuY2VsbGVkLlxuXHQgKi9cblx0QElucHV0KCkgc2V0IG9uQ3JlYXRlKHZhbHVlOiBEZXNpZ25lck5TLkFjdGlvbkhhbmRsZXJzWydvbkNyZWF0ZSddKSB7XG5cdFx0dGhpcy5fYWN0aW9uSGFuZGxlcnMub25DcmVhdGUgPSB2YWx1ZTtcblx0XHRpZiAodGhpcy5fZGVzaWduZXIpIHRoaXMuX2Rlc2lnbmVyLnNldEFjdGlvbkhhbmRsZXJzKHRoaXMuX2FjdGlvbkhhbmRsZXJzKTtcblx0fVxuXHRnZXQgb25DcmVhdGUoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2FjdGlvbkhhbmRsZXJzLm9uQ3JlYXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgaGFuZGxlciB0byBiZSBjYWxsZWQgb24gb3BlbmluZyByZXBvcnQuXG5cdCAqIEhhbmRsZXIgcmV0dXJucyBQcm9taXNlIHdpdGggcmVwb3J0IGluZm8gb3IgJ3VuZGVmaW5lZCcgaWYgb3BlcmF0aW9uIHdhcyBjYW5jZWxsZWQuXG5cdCAqL1xuXHRASW5wdXQoKSBzZXQgb25PcGVuKHZhbHVlOiBEZXNpZ25lck5TLkFjdGlvbkhhbmRsZXJzWydvbk9wZW4nXSkge1xuXHRcdHRoaXMuX2FjdGlvbkhhbmRsZXJzLm9uT3BlbiA9IHZhbHVlO1xuXHRcdGlmICh0aGlzLl9kZXNpZ25lcikgdGhpcy5fZGVzaWduZXIuc2V0QWN0aW9uSGFuZGxlcnModGhpcy5fYWN0aW9uSGFuZGxlcnMpO1xuXHR9XG5cdGdldCBvbk9wZW4oKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2FjdGlvbkhhbmRsZXJzLm9uT3Blbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIGhhbmRsZXIgdG8gYmUgY2FsbGVkIG9uIHJlcXVlc3QgdG8gcmVuZGVyIGN1cnJlbnQgcmVwb3J0LlxuXHQgKi9cblx0QElucHV0KCkgc2V0IG9uUmVuZGVyKHZhbHVlOiBEZXNpZ25lck5TLkFjdGlvbkhhbmRsZXJzWydvblJlbmRlciddKSB7XG5cdFx0dGhpcy5fYWN0aW9uSGFuZGxlcnMub25SZW5kZXIgPSB2YWx1ZTtcblx0XHRpZiAodGhpcy5fZGVzaWduZXIpIHRoaXMuX2Rlc2lnbmVyLnNldEFjdGlvbkhhbmRsZXJzKHRoaXMuX2FjdGlvbkhhbmRsZXJzKTtcblx0fVxuXHRnZXQgb25SZW5kZXIoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2FjdGlvbkhhbmRsZXJzLm9uUmVuZGVyO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgaGFuZGxlciB0byBiZSBjYWxsZWQgb24gc2F2aW5nIHJlcG9ydC5cblx0ICogSGFuZGxlciByZXR1cm5zIFByb21pc2Ugd2l0aCBuZXcgcmVwb3J0IGluZm8gaWYgcmVwb3J0IHdhcyBzYXZlZCBvciAndW5kZWZpbmVkJyBpZiBvcGVyYXRpb24gd2FzIGNhbmNlbGxlZC5cblx0ICovXG5cdEBJbnB1dCgpIHNldCBvblNhdmUodmFsdWU6IERlc2lnbmVyTlMuQWN0aW9uSGFuZGxlcnNbJ29uU2F2ZSddKSB7XG5cdFx0dGhpcy5fYWN0aW9uSGFuZGxlcnMub25TYXZlID0gdmFsdWU7XG5cdFx0aWYgKHRoaXMuX2Rlc2lnbmVyKSB0aGlzLl9kZXNpZ25lci5zZXRBY3Rpb25IYW5kbGVycyh0aGlzLl9hY3Rpb25IYW5kbGVycyk7XG5cdH1cblx0Z2V0IG9uU2F2ZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5fYWN0aW9uSGFuZGxlcnMub25TYXZlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgaGFuZGxlciB0byBiZSBjYWxsZWQgb24gc2F2aW5nIHJlcG9ydCBhcyBuZXcuXG5cdCAqIEhhbmRsZXIgcmV0dXJucyBQcm9taXNlIHdpdGggbmV3IHJlcG9ydCBpbmZvIGlmIHJlcG9ydCB3YXMgc2F2ZWQgb3IgJ3VuZGVmaW5lZCcgaWYgb3BlcmF0aW9uIHdhcyBjYW5jZWxsZWQuXG5cdCAqL1xuXHRASW5wdXQoKSBzZXQgb25TYXZlQXModmFsdWU6IERlc2lnbmVyTlMuQWN0aW9uSGFuZGxlcnNbJ29uU2F2ZUFzJ10pIHtcblx0XHR0aGlzLl9hY3Rpb25IYW5kbGVycy5vblNhdmVBcyA9IHZhbHVlO1xuXHRcdGlmICh0aGlzLl9kZXNpZ25lcikgdGhpcy5fZGVzaWduZXIuc2V0QWN0aW9uSGFuZGxlcnModGhpcy5fYWN0aW9uSGFuZGxlcnMpO1xuXHR9XG5cdGdldCBvblNhdmVBcygpIHtcblx0XHRyZXR1cm4gdGhpcy5fYWN0aW9uSGFuZGxlcnMub25TYXZlQXM7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBoYW5kbGVyIHRvIGJlIGNhbGxlZCBvbiBvcGVuIGN1c3RvbSBmaWxlIG1lbnUuXG5cdCAqL1xuXHRASW5wdXQoKSBzZXQgb25PcGVuRmlsZU1lbnUodmFsdWU6IERlc2lnbmVyTlMuQWN0aW9uSGFuZGxlcnNbJ29uT3BlbkZpbGVNZW51J10pIHtcblx0XHR0aGlzLl9hY3Rpb25IYW5kbGVycy5vbk9wZW5GaWxlTWVudSA9IHZhbHVlO1xuXHRcdGlmICh0aGlzLl9kZXNpZ25lcikgdGhpcy5fZGVzaWduZXIuc2V0QWN0aW9uSGFuZGxlcnModGhpcy5fYWN0aW9uSGFuZGxlcnMpO1xuXHR9XG5cdGdldCBvbk9wZW5GaWxlTWVudSgpIHtcblx0XHRyZXR1cm4gdGhpcy5fYWN0aW9uSGFuZGxlcnMub25PcGVuRmlsZU1lbnU7XG5cdH1cblxuXHRwcml2YXRlIF9yZXBvcnQ6IERlc2lnbmVyTlMuUmVwb3J0O1xuXG5cdHByaXZhdGUgX2Rpc3Bvc2FibGVzOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuXG5cdC8qKlxuXHQgKiBXYXRjaCByZXBvcnQgcHJvcGVydHlcblx0ICovXG5cdEBJbnB1dCgpIHNldCByZXBvcnQodmFsdWU6IERlc2lnbmVyTlMuUmVwb3J0KSB7XG5cdFx0aWYgKGhhc1JlcG9ydENoYW5nZWQodmFsdWUsIHRoaXMuX3JlcG9ydCkpIHtcblx0XHRcdHRoaXMuX3JlcG9ydCA9IHZhbHVlO1xuXHRcdFx0aWYgKHZhbHVlKSB0aGlzLnNldFJlcG9ydCh2YWx1ZSwgJ292ZXJyaWRlJyk7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0aWYgKCF0aGlzLl9kZXNpZ25lcikgcmV0dXJuO1xuXHRcdFx0XHR0aGlzLl9kZXNpZ25lci5jcmVhdGVSZXBvcnQoeyByZXBvcnRUeXBlOiAnQ1BMJyB9LCAnb3ZlcnJpZGUnKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKiogZG9jdW1lbnRDaGFuZ2VkIGV2ZW50LiAqL1xuXHRAT3V0cHV0KCkgZG9jdW1lbnRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxEb2N1bWVudENoYW5nZWRFdmVudEFyZ3M+KCk7XG5cblx0bmdBZnRlclZpZXdJbml0KCkge1xuXHRcdGNvbnN0IGNvbmZpZyA9IHRoaXMub25Jbml0Py4oKTtcblx0XHR0aGlzLl9kZXNpZ25lciA9IG5ldyBEZXNpZ25lck5TLkRlc2lnbmVyKHRoaXMucm9vdEVsZW1lbnQubmF0aXZlRWxlbWVudCwgY29uZmlnKTtcblx0XHR0aGlzLl9kZXNpZ25lci5zZXRSZXNvdXJjZVByb3ZpZGVyKHtcblx0XHRcdGdldEltYWdlc0xpc3Q6IGFzeW5jICgpID0+IHRoaXMuaW1hZ2VMaXN0IHx8IFtdLFxuXHRcdFx0Z2V0UmVwb3J0c0xpc3Q6IGFzeW5jICgpID0+IHRoaXMucmVwb3J0TGlzdCB8fCBbXSxcblx0XHRcdGdldE1hc3RlclJlcG9ydExpc3Q6IGFzeW5jICgpID0+IHRoaXMubWFzdGVyUmVwb3J0TGlzdCB8fCBbXSxcblx0XHRcdGdldFRoZW1lc0xpc3Q6IGFzeW5jICgpID0+IHRoaXMudGhlbWVMaXN0IHx8IFtdLFxuXHRcdFx0Z2V0U3R5bGVzaGVldExpc3Q6IGFzeW5jICgpID0+IHRoaXMuc3R5bGVzaGVldExpc3QgfHwgW10sXG5cdFx0fSk7XG5cdFx0dGhpcy5fZGVzaWduZXIuc2V0QWN0aW9uSGFuZGxlcnModGhpcy5fYWN0aW9uSGFuZGxlcnMpO1xuXHRcdGlmICh0aGlzLmRhdGFTb3VyY2VzKSB0aGlzLl9kZXNpZ25lci5zZXREYXRhU291cmNlVGVtcGxhdGVzKHRoaXMuX2RhdGFTb3VyY2VzIHx8IFtdKTtcblx0XHRpZiAodGhpcy5fcmVwb3J0KSB0aGlzLnNldFJlcG9ydCh0aGlzLl9yZXBvcnQsICdvdmVycmlkZScpO1xuXG5cdFx0dGhpcy5fZGlzcG9zYWJsZXMucHVzaCh0aGlzLl9kZXNpZ25lci5kb2N1bWVudENoYW5nZWQucmVnaXN0ZXIoKGFyZ3MpID0+IHRoaXMuZG9jdW1lbnRDaGFuZ2VkLmVtaXQoYXJncykpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHJlcG9ydC5cblx0ICogQHBhcmFtIHJlcG9ydCBSZXBvcnQgaW5mbyB0byBsb2FkLlxuXHQgKiBAcGFyYW0gd2hlbkRpcnR5IEFjdGlvbiB0byBwZXJmb3JtIGluIGNhc2Ugb2YgJ2RpcnR5JyByZXBvcnQuXG5cdCAqIEBwYXJhbSBpc0RpcnR5SW5pdGlhbCBJbml0aWFsIHZhbHVlIGZvciAnZGlydHknIHN0YXRlIGFmdGVyIGxvYWQuXG5cdCAqL1xuXHRzZXRSZXBvcnQocmVwb3J0OiBEZXNpZ25lck5TLlJlcG9ydCwgd2hlbkRpcnR5PzogRGVzaWduZXJOUy5XaGVuRGlydHksIGlzRGlydHlJbml0aWFsPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5fZGVzaWduZXIpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRcdHJldHVybiB0aGlzLl9kZXNpZ25lci5zZXRSZXBvcnQocmVwb3J0LCB3aGVuRGlydHksIGlzRGlydHlJbml0aWFsKTtcblx0fVxuXG5cdC8qKiBHZXRzIGN1cnJlbnQgcmVwb3J0LiAqL1xuXHRnZXRSZXBvcnQoKTogUHJvbWlzZTxEZXNpZ25lck5TLlJlcG9ydEluZm8+IHtcblx0XHRpZiAoIXRoaXMuX2Rlc2lnbmVyKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkgYXMgYW55O1xuXG5cdFx0cmV0dXJuIHRoaXMuX2Rlc2lnbmVyLmdldFJlcG9ydCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgcmVwb3J0LlxuXHQgKiBAcGFyYW0gcmVwb3J0SW5mbyBSZXBvcnQgaW5mbyB0byBsb2FkLlxuXHQgKiBAcGFyYW0gd2hlbkRpcnR5IEFjdGlvbiB0byBwZXJmb3JtIGluIGNhc2Ugb2YgJ2RpcnR5JyByZXBvcnQuXG5cdCAqL1xuXHRjcmVhdGVSZXBvcnQocmVwb3J0SW5mbzogRGVzaWduZXJOUy5OZXdSZXBvcnRJbmZvLCB3aGVuRGlydHk/OiBEZXNpZ25lck5TLldoZW5EaXJ0eSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5fZGVzaWduZXIpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRyZXR1cm4gdGhpcy5fZGVzaWduZXIuY3JlYXRlUmVwb3J0KHJlcG9ydEluZm8sIHdoZW5EaXJ0eSk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBjb21tYW5kLlxuXHQgKiBAcGFyYW0gY21kIENvbW1hbmQgbmFtZS5cblx0ICovXG5cdHByb2Nlc3NDb21tYW5kKGNtZDogRGVzaWduZXJOUy5EZXNpZ25lckNvbW1hbmQpIHtcblx0XHRpZiAoIXRoaXMuX2Rlc2lnbmVyKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fZGVzaWduZXIucHJvY2Vzc0NvbW1hbmQoY21kKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGZvY3VzIHRvIERlc2lnbmVyLlxuXHQgKi9cblx0Zm9jdXMoKSB7XG5cdFx0aWYgKHRoaXMuX2Rlc2lnbmVyID09IG51bGwpIHRocm93IG5ldyBFcnJvcignRGVzaWduZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCcpO1xuXHRcdHRoaXMuX2Rlc2lnbmVyLmZvY3VzKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBBUEkgdG8gbWFuaXB1bGF0ZSBkZXNpZ25lci5cblx0ICovXG5cdGdldEVkaXRvckFQSSgpOiBQcm9taXNlPERlc2lnbmVyTlMuRWRpdG9yQVBJPiB7XG5cdFx0aWYgKHRoaXMuX2Rlc2lnbmVyID09IG51bGwpIHRocm93IG5ldyBFcnJvcignRGVzaWduZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCcpO1xuXHRcdHJldHVybiB0aGlzLl9kZXNpZ25lci5nZXRFZGl0b3JBUEkoKTtcblx0fVxuXG5cdC8qXG5cdCAqIEFjY2VzcyB0byB0aGUgbWVudSBhbmQgc2lkZWJhciBwYW5lbHNcblx0ICovXG5cdGdldFBhbmVsc0FQSSgpOiBQcm9taXNlPERlc2lnbmVyTlMuUGFuZWxzQVBJPiB7XG5cdFx0aWYgKHRoaXMuX2Rlc2lnbmVyID09IG51bGwpIHRocm93IG5ldyBFcnJvcignRGVzaWduZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCcpO1xuXHRcdHJldHVybiB0aGlzLl9kZXNpZ25lci5nZXRQYW5lbHNBUEkoKTtcblx0fVxuXG5cdC8qXG5cdCAqIE1hbmlwdWxhdGUgbm90aWZpY2F0aW9ucyBwYW5lbC5cblx0ICovXG5cdGdldE5vdGlmaWNhdGlvbnNBUEkoKTogUHJvbWlzZTxEZXNpZ25lck5TLk5vdGlmaWNhdGlvbnNBUEk+IHtcblx0XHRpZiAodGhpcy5fZGVzaWduZXIgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdEZXNpZ25lciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Jyk7XG5cdFx0cmV0dXJuIHRoaXMuX2Rlc2lnbmVyLmdldE5vdGlmaWNhdGlvbnNBUEkoKTtcblx0fVxuXG5cdG5nT25EZXN0cm95KCkge1xuXHRcdHdoaWxlICh0aGlzLl9kaXNwb3NhYmxlcy5sZW5ndGgpIHtcblx0XHRcdHRoaXMuX2Rpc3Bvc2FibGVzLnNoaWZ0KCkhKCk7XG5cdFx0fVxuXHRcdC8vIHRoaXMuX2Rlc2lnbmVyLmRpc3Bvc2UoKTtcblx0fVxufVxuIiwiPGRpdiAjZGVzaWduZXJSb290IFtzdHlsZS53aWR0aF09XCJ3aWR0aFwiIFtzdHlsZS5oZWlnaHRdPVwiaGVpZ2h0XCI+PC9kaXY+XG4iXX0=