angular-google-charts
Version:
A wrapper of the Google Charts library written with Angular 6
224 lines • 17.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
/// <reference types="google.visualization"/>
/// <reference types="google.visualization"/>
import { Component, ElementRef, Input, ChangeDetectionStrategy } from '@angular/core';
import { ScriptLoaderService } from '../script-loader/script-loader.service';
import { RawChartComponent } from '../raw-chart/raw-chart.component';
var GoogleChartComponent = /** @class */ (function (_super) {
tslib_1.__extends(GoogleChartComponent, _super);
function GoogleChartComponent(element, loaderService) {
var _this = _super.call(this, element, loaderService) || this;
_this.roles = new Array();
_this.width = undefined;
_this.height = undefined;
_this.options = {};
return _this;
}
/**
* @return {?}
*/
GoogleChartComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
if (this.type == null) {
throw new Error('Can\'t create a Google Chart without specifying a type!');
}
if (this.data == null) {
throw new Error('Can\'t create a Google Chart without data!');
}
this.chartData = {
chartType: this.type
};
this.loaderService.onReady.subscribe((/**
* @return {?}
*/
function () {
_this.createChart();
}));
};
/**
* @return {?}
*/
GoogleChartComponent.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
if (this.wrapper) {
this.chartData = {
chartType: this.type,
dataTable: this.getDataTable(),
options: this.parseOptions()
};
}
_super.prototype.ngOnChanges.call(this);
};
/**
* @protected
* @return {?}
*/
GoogleChartComponent.prototype.parseOptions = /**
* @protected
* @return {?}
*/
function () {
return tslib_1.__assign({ title: this.title, width: this.width, height: this.height }, this.options);
};
/**
* @protected
* @return {?}
*/
GoogleChartComponent.prototype.createChart = /**
* @protected
* @return {?}
*/
function () {
var _this = this;
this.loadNeededPackages().subscribe((/**
* @return {?}
*/
function () {
_this.chartData = {
chartType: _this.type,
dataTable: _this.getDataTable(),
options: _this.parseOptions()
};
_this.wrapper = new google.visualization.ChartWrapper();
_this.updateChart();
}));
};
/**
* @protected
* @return {?}
*/
GoogleChartComponent.prototype.getDataTable = /**
* @protected
* @return {?}
*/
function () {
if (this.columnNames) {
/** @type {?} */
var columns = this.parseRoles(this.columnNames);
this.firstRowIsData = false;
return tslib_1.__spread([columns], this.data);
}
else {
this.firstRowIsData = true;
return this.data;
}
};
/**
* @private
* @param {?} columnNames
* @return {?}
*/
GoogleChartComponent.prototype.parseRoles = /**
* @private
* @param {?} columnNames
* @return {?}
*/
function (columnNames) {
/** @type {?} */
var columnNamesWithRoles = columnNames.slice();
if (this.roles) {
// Roles must be copied to avoid modifying the index everytime there's a change from ngOnChanges.
/** @type {?} */
var copyRoles_1 = this.roles.map((/**
* @param {?} role
* @return {?}
*/
function (role) { return Object.assign({}, role); }));
copyRoles_1.forEach((/**
* @param {?} role
* @return {?}
*/
function (role) {
var e_1, _a;
/** @type {?} */
var roleData = {
type: role.type,
role: role.role
};
if (role.p) {
roleData.p = role.p;
}
if (role.index != null) {
columnNamesWithRoles.splice(role.index + 1, 0, roleData);
try {
for (var copyRoles_2 = tslib_1.__values(copyRoles_1), copyRoles_2_1 = copyRoles_2.next(); !copyRoles_2_1.done; copyRoles_2_1 = copyRoles_2.next()) {
var otherRole = copyRoles_2_1.value;
if (otherRole === role) {
continue;
}
if (otherRole.index > role.index) {
otherRole.index++;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (copyRoles_2_1 && !copyRoles_2_1.done && (_a = copyRoles_2.return)) _a.call(copyRoles_2);
}
finally { if (e_1) throw e_1.error; }
}
}
else {
columnNamesWithRoles.push(roleData);
}
}));
}
return columnNamesWithRoles;
};
GoogleChartComponent.decorators = [
{ type: Component, args: [{
// tslint:disable-next-line:component-selector
selector: 'google-chart',
template: '',
exportAs: 'google-chart',
changeDetection: ChangeDetectionStrategy.OnPush,
styles: [':host { width: fit-content; display: block; }']
}] }
];
/** @nocollapse */
GoogleChartComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: ScriptLoaderService }
]; };
GoogleChartComponent.propDecorators = {
data: [{ type: Input }],
columnNames: [{ type: Input }],
roles: [{ type: Input }],
title: [{ type: Input }],
width: [{ type: Input }],
height: [{ type: Input }],
options: [{ type: Input }],
type: [{ type: Input }]
};
return GoogleChartComponent;
}(RawChartComponent));
export { GoogleChartComponent };
if (false) {
/** @type {?} */
GoogleChartComponent.prototype.data;
/** @type {?} */
GoogleChartComponent.prototype.columnNames;
/** @type {?} */
GoogleChartComponent.prototype.roles;
/** @type {?} */
GoogleChartComponent.prototype.title;
/** @type {?} */
GoogleChartComponent.prototype.width;
/** @type {?} */
GoogleChartComponent.prototype.height;
/** @type {?} */
GoogleChartComponent.prototype.options;
/** @type {?} */
GoogleChartComponent.prototype.type;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItZ29vZ2xlLWNoYXJ0cy8iLCJzb3VyY2VzIjpbImxpYi9nb29nbGUtY2hhcnQvZ29vZ2xlLWNoYXJ0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUE2Qzs7QUFFN0MsT0FBTyxFQUFFLFNBQVMsRUFBVSxVQUFVLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRXpHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBR3JFO0lBUTBDLGdEQUFpQjtJQXlCekQsOEJBQVksT0FBbUIsRUFBRSxhQUFrQztRQUFuRSxZQUNFLGtCQUFNLE9BQU8sRUFBRSxhQUFhLENBQUMsU0FDOUI7UUFuQkQsV0FBSyxHQUFnQixJQUFJLEtBQUssRUFBRSxDQUFDO1FBTWpDLFdBQUssR0FBVyxTQUFTLENBQUM7UUFHMUIsWUFBTSxHQUFXLFNBQVMsQ0FBQztRQUczQixhQUFPLEdBQVEsRUFBRSxDQUFDOztJQU9sQixDQUFDOzs7O0lBRUQsdUNBQVE7OztJQUFSO1FBQUEsaUJBZUM7UUFkQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQztTQUM1RTtRQUNELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1NBQy9EO1FBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRztZQUNmLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSTtTQUNyQixDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsU0FBUzs7O1FBQUM7WUFDbkMsS0FBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7OztJQUVELDBDQUFXOzs7SUFBWDtRQUNFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHO2dCQUNmLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDcEIsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQzlCLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFO2FBQzdCLENBQUM7U0FDSDtRQUVELGlCQUFNLFdBQVcsV0FBRSxDQUFDO0lBQ3RCLENBQUM7Ozs7O0lBRVMsMkNBQVk7Ozs7SUFBdEI7UUFDRSwwQkFDRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFDakIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQ2pCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUNoQixJQUFJLENBQUMsT0FBTyxFQUNmO0lBQ0osQ0FBQzs7Ozs7SUFFUywwQ0FBVzs7OztJQUFyQjtRQUFBLGlCQVdDO1FBVkMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsU0FBUzs7O1FBQUM7WUFDbEMsS0FBSSxDQUFDLFNBQVMsR0FBRztnQkFDZixTQUFTLEVBQUUsS0FBSSxDQUFDLElBQUk7Z0JBQ3BCLFNBQVMsRUFBRSxLQUFJLENBQUMsWUFBWSxFQUFFO2dCQUM5QixPQUFPLEVBQUUsS0FBSSxDQUFDLFlBQVksRUFBRTthQUM3QixDQUFDO1lBRUYsS0FBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdkQsS0FBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7SUFFUywyQ0FBWTs7OztJQUF0QjtRQUNFLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTs7Z0JBQ2QsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNqRCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztZQUM1Qix5QkFBUSxPQUFPLEdBQUssSUFBSSxDQUFDLElBQUksRUFBRTtTQUNoQzthQUFNO1lBQ0wsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ2xCO0lBQ0gsQ0FBQzs7Ozs7O0lBRU8seUNBQVU7Ozs7O0lBQWxCLFVBQW1CLFdBQWtCOztZQUM3QixvQkFBb0IsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFO1FBQ2hELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTs7O2dCQUVSLFdBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUc7Ozs7WUFBQyxVQUFBLElBQUksSUFBSSxPQUFBLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUF2QixDQUF1QixFQUFDO1lBQ2pFLFdBQVMsQ0FBQyxPQUFPOzs7O1lBQUMsVUFBQSxJQUFJOzs7b0JBQ2QsUUFBUSxHQUFTO29CQUNyQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7b0JBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2lCQUNoQjtnQkFDRCxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUU7b0JBQ1YsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO2lCQUNyQjtnQkFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO29CQUN0QixvQkFBb0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDOzt3QkFFekQsS0FBd0IsSUFBQSxjQUFBLGlCQUFBLFdBQVMsQ0FBQSxvQ0FBQSwyREFBRTs0QkFBOUIsSUFBTSxTQUFTLHNCQUFBOzRCQUNsQixJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUU7Z0NBQ3RCLFNBQVM7NkJBQ1Y7NEJBRUQsSUFBSSxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0NBQ2hDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs2QkFDbkI7eUJBQ0Y7Ozs7Ozs7OztpQkFDRjtxQkFBTTtvQkFDTCxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3JDO1lBQ0gsQ0FBQyxFQUFDLENBQUM7U0FDSjtRQUVELE9BQU8sb0JBQW9CLENBQUM7SUFDOUIsQ0FBQzs7Z0JBbklGLFNBQVMsU0FBQzs7b0JBRVQsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLFFBQVEsRUFBRSxFQUFFO29CQUVaLFFBQVEsRUFBRSxjQUFjO29CQUN4QixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs2QkFGdEMsK0NBQStDO2lCQUd6RDs7OztnQkFiMkIsVUFBVTtnQkFFN0IsbUJBQW1COzs7dUJBYXpCLEtBQUs7OEJBR0wsS0FBSzt3QkFHTCxLQUFLO3dCQUdMLEtBQUs7d0JBR0wsS0FBSzt5QkFHTCxLQUFLOzBCQUdMLEtBQUs7dUJBR0wsS0FBSzs7SUFzR1IsMkJBQUM7Q0FBQSxBQXBJRCxDQVEwQyxpQkFBaUIsR0E0SDFEO1NBNUhZLG9CQUFvQjs7O0lBQy9CLG9DQUNvQzs7SUFFcEMsMkNBQzJCOztJQUUzQixxQ0FDaUM7O0lBRWpDLHFDQUNjOztJQUVkLHFDQUMwQjs7SUFFMUIsc0NBQzJCOztJQUUzQix1Q0FDa0I7O0lBRWxCLG9DQUNhIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCJnb29nbGUudmlzdWFsaXphdGlvblwiLz5cclxuXHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFbGVtZW50UmVmLCBJbnB1dCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgU2NyaXB0TG9hZGVyU2VydmljZSB9IGZyb20gJy4uL3NjcmlwdC1sb2FkZXIvc2NyaXB0LWxvYWRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUmF3Q2hhcnRDb21wb25lbnQgfSBmcm9tICcuLi9yYXctY2hhcnQvcmF3LWNoYXJ0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFJvbGUgfSBmcm9tICcuLi9tb2RlbHMvcm9sZS5tb2RlbCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXHJcbiAgc2VsZWN0b3I6ICdnb29nbGUtY2hhcnQnLFxyXG4gIHRlbXBsYXRlOiAnJyxcclxuICBzdHlsZXM6IFsnOmhvc3QgeyB3aWR0aDogZml0LWNvbnRlbnQ7IGRpc3BsYXk6IGJsb2NrOyB9J10sXHJcbiAgZXhwb3J0QXM6ICdnb29nbGUtY2hhcnQnLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBHb29nbGVDaGFydENvbXBvbmVudCBleHRlbmRzIFJhd0NoYXJ0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpXHJcbiAgZGF0YTogQXJyYXk8QXJyYXk8c3RyaW5nIHwgbnVtYmVyPj47XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgY29sdW1uTmFtZXM6IEFycmF5PHN0cmluZz47XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcm9sZXM6IEFycmF5PFJvbGU+ID0gbmV3IEFycmF5KCk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgdGl0bGU6IHN0cmluZztcclxuXHJcbiAgQElucHV0KClcclxuICB3aWR0aDogbnVtYmVyID0gdW5kZWZpbmVkO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGhlaWdodDogbnVtYmVyID0gdW5kZWZpbmVkO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIG9wdGlvbnM6IGFueSA9IHt9O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHR5cGU6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoZWxlbWVudDogRWxlbWVudFJlZiwgbG9hZGVyU2VydmljZTogU2NyaXB0TG9hZGVyU2VydmljZSkge1xyXG4gICAgc3VwZXIoZWxlbWVudCwgbG9hZGVyU2VydmljZSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICh0aGlzLnR5cGUgPT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgY3JlYXRlIGEgR29vZ2xlIENoYXJ0IHdpdGhvdXQgc3BlY2lmeWluZyBhIHR5cGUhJyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5kYXRhID09IG51bGwpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGNyZWF0ZSBhIEdvb2dsZSBDaGFydCB3aXRob3V0IGRhdGEhJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGFydERhdGEgPSB7XHJcbiAgICAgIGNoYXJ0VHlwZTogdGhpcy50eXBlXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMubG9hZGVyU2VydmljZS5vblJlYWR5LnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoKSB7XHJcbiAgICBpZiAodGhpcy53cmFwcGVyKSB7XHJcbiAgICAgIHRoaXMuY2hhcnREYXRhID0ge1xyXG4gICAgICAgIGNoYXJ0VHlwZTogdGhpcy50eXBlLFxyXG4gICAgICAgIGRhdGFUYWJsZTogdGhpcy5nZXREYXRhVGFibGUoKSxcclxuICAgICAgICBvcHRpb25zOiB0aGlzLnBhcnNlT3B0aW9ucygpXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgc3VwZXIubmdPbkNoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBwYXJzZU9wdGlvbnMoKTogYW55IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxyXG4gICAgICB3aWR0aDogdGhpcy53aWR0aCxcclxuICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCxcclxuICAgICAgLi4udGhpcy5vcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUNoYXJ0KCkge1xyXG4gICAgdGhpcy5sb2FkTmVlZGVkUGFja2FnZXMoKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNoYXJ0RGF0YSA9IHtcclxuICAgICAgICBjaGFydFR5cGU6IHRoaXMudHlwZSxcclxuICAgICAgICBkYXRhVGFibGU6IHRoaXMuZ2V0RGF0YVRhYmxlKCksXHJcbiAgICAgICAgb3B0aW9uczogdGhpcy5wYXJzZU9wdGlvbnMoKVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy53cmFwcGVyID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNoYXJ0V3JhcHBlcigpO1xyXG4gICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXREYXRhVGFibGUoKTogQXJyYXk8YW55PiB7XHJcbiAgICBpZiAodGhpcy5jb2x1bW5OYW1lcykge1xyXG4gICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5wYXJzZVJvbGVzKHRoaXMuY29sdW1uTmFtZXMpO1xyXG4gICAgICB0aGlzLmZpcnN0Um93SXNEYXRhID0gZmFsc2U7XHJcbiAgICAgIHJldHVybiBbY29sdW1ucywgLi4udGhpcy5kYXRhXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZmlyc3RSb3dJc0RhdGEgPSB0cnVlO1xyXG4gICAgICByZXR1cm4gdGhpcy5kYXRhO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXJzZVJvbGVzKGNvbHVtbk5hbWVzOiBhbnlbXSk6IGFueVtdIHtcclxuICAgIGNvbnN0IGNvbHVtbk5hbWVzV2l0aFJvbGVzID0gY29sdW1uTmFtZXMuc2xpY2UoKTtcclxuICAgIGlmICh0aGlzLnJvbGVzKSB7XHJcbiAgICAgIC8vIFJvbGVzIG11c3QgYmUgY29waWVkIHRvIGF2b2lkIG1vZGlmeWluZyB0aGUgaW5kZXggZXZlcnl0aW1lIHRoZXJlJ3MgYSBjaGFuZ2UgZnJvbSBuZ09uQ2hhbmdlcy5cclxuICAgICAgY29uc3QgY29weVJvbGVzID0gdGhpcy5yb2xlcy5tYXAocm9sZSA9PiBPYmplY3QuYXNzaWduKHt9LCByb2xlKSk7XHJcbiAgICAgIGNvcHlSb2xlcy5mb3JFYWNoKHJvbGUgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJvbGVEYXRhOiBSb2xlID0ge1xyXG4gICAgICAgICAgdHlwZTogcm9sZS50eXBlLFxyXG4gICAgICAgICAgcm9sZTogcm9sZS5yb2xlXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAocm9sZS5wKSB7XHJcbiAgICAgICAgICByb2xlRGF0YS5wID0gcm9sZS5wO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocm9sZS5pbmRleCAhPSBudWxsKSB7XHJcbiAgICAgICAgICBjb2x1bW5OYW1lc1dpdGhSb2xlcy5zcGxpY2Uocm9sZS5pbmRleCArIDEsIDAsIHJvbGVEYXRhKTtcclxuXHJcbiAgICAgICAgICBmb3IgKGNvbnN0IG90aGVyUm9sZSBvZiBjb3B5Um9sZXMpIHtcclxuICAgICAgICAgICAgaWYgKG90aGVyUm9sZSA9PT0gcm9sZSkge1xyXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAob3RoZXJSb2xlLmluZGV4ID4gcm9sZS5pbmRleCkge1xyXG4gICAgICAgICAgICAgIG90aGVyUm9sZS5pbmRleCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbHVtbk5hbWVzV2l0aFJvbGVzLnB1c2gocm9sZURhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbk5hbWVzV2l0aFJvbGVzO1xyXG4gIH1cclxufVxyXG4iXX0=