ngx-dynamic-dashboard
Version:
an dashboard lib for angular 10
174 lines • 23.1 kB
JavaScript
/**
* Created by jayhamilton on 2/7/17.
*/
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { EMPTY, Observable } from 'rxjs';
import { defaultBoard } from './configuration-sample-default-board';
import { sampleBoardCollection } from './configuration-sample-boards.model';
import { environment } from '../../environments/environment';
export class ConfigurationService {
constructor(_http) {
this._http = _http;
this.demo = true;
/**
* todo - fix this hard coded store
* @type {string}
*/
this.remoteConfigurationRepository = '';
this.defaultBoard = Object.assign({}, defaultBoard);
this.sampleBoardCollection = Object.assign({}, sampleBoardCollection);
this.env = environment;
this.seedLocalStorageWithSampleBoardCollection();
}
getBoards() {
if (this.demo) {
return new Observable(observer => {
let data = JSON.parse(localStorage.getItem('board'));
if (!data) {
data = { board: [] };
}
observer.next(data.board);
return () => {
};
});
}
else {
/**
* todo - this call is based on an internal representation (admin console) of something called a store.
* That concept requires refactoring.
*/
return this._http.get(this.remoteConfigurationRepository);
}
}
saveBoard(board) {
this.model = board;
if (Object.keys(board).length === 0 && board.constructor === Object) {
return EMPTY;
}
if (this.demo) {
return new Observable(observer => {
let board_collection;
// find and remove board from storage
this.deleteBoardFromLocalStore(board.title);
// get a collection object and add board to it
if ((board_collection = JSON.parse(localStorage.getItem('board'))) == null) {
board_collection = {
board: []
};
}
board_collection['board'].push(board);
// save
localStorage.setItem('board', JSON.stringify(board_collection));
observer.next({});
return () => {
};
});
}
else {
/**
* todo - a delete must happen here
*
*/
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json'
})
};
return this._http.post(this.remoteConfigurationRepository + '?id=' + board.title, JSON.stringify(board), httpOptions);
}
}
deleteBoard(boardTitle) {
if (this.demo) {
return new Observable(observer => {
this.deleteBoardFromLocalStore(boardTitle);
observer.next({});
return () => {
};
});
}
else {
return this._http.delete(this.remoteConfigurationRepository + '/' + boardTitle);
}
}
getDefaultBoard() {
return new Observable(observer => {
observer.next(this.defaultBoard);
return () => {
};
});
}
/*
when a gadget instance's property page is updated and saved, the change gets communicated to all
gadgets. The gadget instance id that caused the change will update their current instance. todo - this might be able to be
improved. For now the utility of this approach allows the configuration service to capture the property page change in a way
that allows us to update the persisted board model.
*/
notifyGadgetOnPropertyChange(gadgetConfig, instanceId) {
this.savePropertyPageConfigurationToStore(gadgetConfig, instanceId);
}
setCurrentModel(_currentModel) {
this.currentModel = _currentModel;
}
savePropertyPageConfigurationToStore(gadgetConfig, instanceId) {
this.currentModel.rows.forEach(row => {
row.columns.forEach(column => {
if (column.gadgets) {
column.gadgets.forEach(gadget => {
this.updateProperties(gadgetConfig, gadget, instanceId);
});
}
});
});
this.saveBoard(this.currentModel).subscribe(result => {
/**
* todo - create popup/toast to show configuration saved message
*/
console.debug('The following configuration model was saved!');
}, error => console.error('Error' + error), () => console.debug('Saving configuration to store!'));
}
updateProperties(updatedProperties, gadget, instanceId) {
const updatedPropsObject = JSON.parse(updatedProperties);
if (gadget.instanceId === instanceId) {
gadget.config.propertyPages.forEach(function (propertyPage) {
for (let x = 0; x < propertyPage.properties.length; x++) {
for (const prop in updatedPropsObject) {
if (updatedPropsObject.hasOwnProperty(prop)) {
if (prop === propertyPage.properties[x].key) {
propertyPage.properties[x].value = updatedPropsObject[prop];
}
}
}
}
});
}
}
seedLocalStorageWithSampleBoardCollection() {
if (localStorage.getItem('board') === null) {
if (!this.env.production) {
localStorage.setItem('board', JSON.stringify(this.sampleBoardCollection));
}
}
}
delete(board_collection) {
localStorage.removeItem('board');
localStorage.setItem('board', JSON.stringify(board_collection));
}
deleteBoardFromLocalStore(boardTitle) {
const board_collection = JSON.parse(localStorage.getItem('board'));
let index;
if (board_collection && (index = board_collection['board'].findIndex(item => {
return item.title === boardTitle;
})) >= 0) {
board_collection['board'].splice(index, 1);
this.delete(board_collection);
}
}
}
ConfigurationService.decorators = [
{ type: Injectable }
];
ConfigurationService.ctorParameters = () => [
{ type: HttpClient }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9iZW5saS93b3Jrc3BhY2VzL25neC1keW5hbWljLWRhc2hib2FyZC1mcmFtZXdvcmsvcHJvamVjdHMvbmd4LWR5bmFtaWMtZGFzaGJvYXJkL3NyYy8iLCJzb3VyY2VzIjpbImRhc2hib2FyZC9zZXJ2aWNlcy9jb25maWd1cmF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxVQUFVLEVBQUUsV0FBVyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDN0QsT0FBTyxFQUFDLEtBQUssRUFBRSxVQUFVLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUszRCxNQUFNLE9BQU8sb0JBQW9CO0lBZTdCLFlBQW9CLEtBQWlCO1FBQWpCLFVBQUssR0FBTCxLQUFLLENBQVk7UUFackMsU0FBSSxHQUFHLElBQUksQ0FBQztRQU1aOzs7V0FHRztRQUNILGtDQUE2QixHQUFHLEVBQUUsQ0FBQztRQUkvQixJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyx5Q0FBeUMsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFFTSxTQUFTO1FBRVosSUFBSSxJ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LENBQUM7YUFDN0U7U0FDSjtJQUNMLENBQUM7SUFFTyxNQUFNLENBQUMsZ0JBQXFCO1FBRWhDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFFcEUsQ0FBQztJQUVPLHlCQUF5QixDQUFDLFVBQWtCO1FBQ2hELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFbkUsSUFBSSxLQUFLLENBQUM7UUFDVixJQUFJLGdCQUFnQixJQUFJLENBQUMsS0FBSyxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN4RSxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBRU4sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUUzQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FFakM7SUFDTCxDQUFDOzs7WUE5TkosVUFBVTs7O1lBUkgsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ3JlYXRlZCBieSBqYXloYW1pbHRvbiBvbiAyLzcvMTcuXG4gKi9cbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBIZWFkZXJzfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge0VNUFRZLCBPYnNlcnZhYmxlLCBTdWJzY3JpYmFibGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWZhdWx0Qm9hcmR9IGZyb20gJy4vY29uZmlndXJhdGlvbi1zYW1wbGUtZGVmYXVsdC1ib2FyZCc7XG5pbXBvcnQge3NhbXBsZUJvYXJkQ29sbGVjdGlvbn0gZnJvbSAnLi9jb25maWd1cmF0aW9uLXNhbXBsZS1ib2FyZHMubW9kZWwnO1xuaW1wb3J0IHtlbnZpcm9ubWVudH0gZnJvbSAnLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50JztcbmltcG9ydCB7Qm9hcmR9IGZyb20gJy4uL2dyaWQvQm9hcmQnO1xuXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uU2VydmljZSB7XG4gICAgbW9kZWw6IEJvYXJkOyAvLyB0b2RvIHJldmlldyB0aGlzIG9iamVjdCBjbG9zZWx5XG4gICAgY3VycmVudE1vZGVsOiBhbnk7IC8vIHRoaXMgb2JqZWN0IGhlbHBzIHdpdGggdXBkYXRlcyB0byBwcm9wZXJ0eSBwYWdlIHZhbHVlc1xuICAgIGRlbW8gPSB0cnVlO1xuICAgIGVudjogYW55O1xuXG4gICAgZGVmYXVsdEJvYXJkOiBhbnk7XG4gICAgc2FtcGxlQm9hcmRDb2xsZWN0aW9uOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiB0b2RvIC0gZml4IHRoaXMgaGFyZCBjb2RlZCBzdG9yZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgcmVtb3RlQ29uZmlndXJhdGlvblJlcG9zaXRvcnkgPSAnJztcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2h0dHA6IEh0dHBDbGllbnQpIHtcblxuICAgICAgICB0aGlzLmRlZmF1bHRCb2FyZCA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRCb2FyZCk7XG4gICAgICAgIHRoaXMuc2FtcGxlQm9hcmRDb2xsZWN0aW9uID0gT2JqZWN0LmFzc2lnbih7fSwgc2FtcGxlQm9hcmRDb2xsZWN0aW9uKTtcbiAgICAgICAgdGhpcy5lbnYgPSBlbnZpcm9ubWVudDtcbiAgICAgICAgdGhpcy5zZWVkTG9jYWxTdG9yYWdlV2l0aFNhbXBsZUJvYXJkQ29sbGVjdGlvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRCb2FyZHMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAodGhpcy5kZW1vKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYm9hcmQnKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSB7Ym9hcmQ6IFtdfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChkYXRhLmJvYXJkKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiB0b2RvIC0gdGhpcyBjYWxsIGlzIGJhc2VkIG9uIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uIChhZG1pbiBjb25zb2xlKSBvZiBzb21ldGhpbmcgY2FsbGVkIGEgc3RvcmUuXG4gICAgICAgICAgICAgKiBUaGF0IGNvbmNlcHQgcmVxdWlyZXMgcmVmYWN0b3JpbmcuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9odHRwLmdldCh0aGlzLnJlbW90ZUNvbmZpZ3VyYXRpb25SZXBvc2l0b3J5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzYXZlQm9hcmQoYm9hcmQ6IEJvYXJkKSB7XG5cbiAgICAgICAgdGhpcy5tb2RlbCA9IGJvYXJkO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhib2FyZCkubGVuZ3RoID09PSAwICYmIGJvYXJkLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRlbW8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlciA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGJvYXJkX2NvbGxlY3Rpb247XG5cbiAgICAgICAgICAgICAgICAvLyBmaW5kIGFuZCByZW1vdmUgYm9hcmQgZnJvbSBzdG9yYWdlXG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVCb2FyZEZyb21Mb2NhbFN0b3JlKGJvYXJkLnRpdGxlKTtcblxuICAgICAgICAgICAgICAgIC8vIGdldCBhIGNvbGxlY3Rpb24gb2JqZWN0IGFuZCBhZGQgYm9hcmQgdG8gaXRcbiAgICAgICAgICAgICAgICBpZiAoKGJvYXJkX2NvbGxlY3Rpb24gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdib2FyZCcpKSkgPT0gbnVsbCkge1xuXG4gICAgICAgICAgICAgICAgICAgIGJvYXJkX2NvbGxlY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2FyZDogW11cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYm9hcmRfY29sbGVjdGlvblsnYm9hcmQnXS5wdXNoKGJvYXJkKTtcblxuICAgICAgICAgICAgICAgIC8vIHNhdmVcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYm9hcmQnLCBKU09OLnN0cmluZ2lmeShib2FyZF9jb2xsZWN0aW9uKSk7XG5cbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHt9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiB0b2RvIC0gYSBkZWxldGUgbXVzdCBoYXBwZW4gaGVyZVxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5wb3N0KHRoaXMucmVtb3RlQ29uZmlndXJhdGlvblJlcG9zaXRvcnkgKyAnP2lkPScgKyBib2FyZC50aXRsZSwgSlNPTi5zdHJpbmdpZnkoYm9hcmQpLCBodHRwT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlQm9hcmQoYm9hcmRUaXRsZTogc3RyaW5nKSB7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVtbykge1xuXG4gICAgICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVCb2FyZEZyb21Mb2NhbFN0b3JlKGJvYXJkVGl0bGUpO1xuXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7fSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5kZWxldGUodGhpcy5yZW1vdGVDb25maWd1cmF0aW9uUmVwb3NpdG9yeSArICcvJyArIGJvYXJkVGl0bGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldERlZmF1bHRCb2FyZCgpIHtcblxuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh0aGlzLmRlZmF1bHRCb2FyZCk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgd2hlbiBhIGdhZGdldCBpbnN0YW5jZSdzIHByb3BlcnR5IHBhZ2UgaXMgdXBkYXRlZCBhbmQgc2F2ZWQsIHRoZSBjaGFuZ2UgZ2V0cyBjb21tdW5pY2F0ZWQgdG8gYWxsXG4gICAgIGdhZGdldHMuIFRoZSBnYWRnZXQgaW5zdGFuY2UgaWQgdGhhdCBjYXVzZWQgdGhlIGNoYW5nZSB3aWxsIHVwZGF0ZSB0aGVpciBjdXJyZW50IGluc3RhbmNlLiB0b2RvIC0gdGhpcyBtaWdodCBiZSBhYmxlIHRvIGJlXG4gICAgIGltcHJvdmVkLiBGb3Igbm93IHRoZSB1dGlsaXR5IG9mIHRoaXMgYXBwcm9hY2ggYWxsb3dzIHRoZSBjb25maWd1cmF0aW9uIHNlcnZpY2UgdG8gY2FwdHVyZSB0aGUgcHJvcGVydHkgcGFnZSBjaGFuZ2UgaW4gYSB3YXlcbiAgICAgdGhhdCBhbGxvd3MgdXMgdG8gdXBkYXRlIHRoZSBwZXJzaXN0ZWQgYm9hcmQgbW9kZWwuXG4gICAgICovXG4gICAgbm90aWZ5R2FkZ2V0T25Qcm9wZXJ0eUNoYW5nZShnYWRnZXRDb25maWc6IHN0cmluZywgaW5zdGFuY2VJZDogbnVtYmVyKSB7XG5cbiAgICAgICAgdGhpcy5zYXZlUHJvcGVydHlQYWdlQ29uZmlndXJhdGlvblRvU3RvcmUoZ2FkZ2V0Q29uZmlnLCBpbnN0YW5jZUlkKTtcbiAgICB9XG5cbiAgICBzZXRDdXJyZW50TW9kZWwoX2N1cnJlbnRNb2RlbDogYW55KSB7XG4gICAgICAgIHRoaXMuY3VycmVudE1vZGVsID0gX2N1cnJlbnRNb2RlbDtcbiAgICB9XG5cbiAgICBzYXZlUHJvcGVydHlQYWdlQ29uZmlndXJhdGlvblRvU3RvcmUoZ2FkZ2V0Q29uZmlnOiBzdHJpbmcsIGluc3RhbmNlSWQ6IG51bWJlcikge1xuXG4gICAgICAgIHRoaXMuY3VycmVudE1vZGVsLnJvd3MuZm9yRWFjaChyb3cgPT4ge1xuXG4gICAgICAgICAgICByb3cuY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmdhZGdldHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmdhZGdldHMuZm9yRWFjaChnYWRnZXQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQcm9wZXJ0aWVzKGdhZGdldENvbmZpZywgZ2FkZ2V0LCBpbnN0YW5jZUlkKTtcblxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zYXZlQm9hcmQodGhpcy5jdXJyZW50TW9kZWwpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogdG9kbyAtIGNyZWF0ZSBwb3B1cC90b2FzdCB0byBzaG93IGNvbmZpZ3VyYXRpb24gc2F2ZWQgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1RoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBtb2RlbCB3YXMgc2F2ZWQhJyk7XG5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvciA9PiBjb25zb2xlLmVycm9yKCdFcnJvcicgKyBlcnJvciksXG4gICAgICAgICAgICAoKSA9PiBjb25zb2xlLmRlYnVnKCdTYXZpbmcgY29uZmlndXJhdGlvbiB0byBzdG9yZSEnKSk7XG5cblxuICAgIH1cblxuICAgIHVwZGF0ZVByb3BlcnRpZXModXBkYXRlZFByb3BlcnRpZXM6IGFueSwgZ2FkZ2V0OiBhbnksIGluc3RhbmNlSWQ6IG51bWJlcikge1xuXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRQcm9wc09iamVjdCA9IEpTT04ucGFyc2UodXBkYXRlZFByb3BlcnRpZXMpO1xuXG4gICAgICAgIGlmIChnYWRnZXQuaW5zdGFuY2VJZCA9PT0gaW5zdGFuY2VJZCkge1xuXG4gICAgICAgICAgICBnYWRnZXQuY29uZmlnLnByb3BlcnR5UGFnZXMuZm9yRWFjaChmdW5jdGlvbiAocHJvcGVydHlQYWdlKSB7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHByb3BlcnR5UGFnZS5wcm9wZXJ0aWVzLmxlbmd0aDsgeCsrKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHVwZGF0ZWRQcm9wc09iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWRQcm9wc09iamVjdC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wID09PSBwcm9wZXJ0eVBhZ2UucHJvcGVydGllc1t4XS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYWdlLnByb3BlcnRpZXNbeF0udmFsdWUgPSB1cGRhdGVkUHJvcHNPYmplY3RbcHJvcF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNlZWRMb2NhbFN0b3JhZ2VXaXRoU2FtcGxlQm9hcmRDb2xsZWN0aW9uKCkge1xuXG4gICAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYm9hcmQnKSA9PT0gbnVsbCkge1xuXG5cbiAgICAgICAgICAgIGlmICghdGhpcy5lbnYucHJvZHVjdGlvbikge1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdib2FyZCcsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2FtcGxlQm9hcmRDb2xsZWN0aW9uKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGRlbGV0ZShib2FyZF9jb2xsZWN0aW9uOiBhbnkpIHtcblxuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnYm9hcmQnKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2JvYXJkJywgSlNPTi5zdHJpbmdpZnkoYm9hcmRfY29sbGVjdGlvbikpO1xuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWxldGVCb2FyZEZyb21Mb2NhbFN0b3JlKGJvYXJkVGl0bGU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBib2FyZF9jb2xsZWN0aW9uID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYm9hcmQnKSk7XG5cbiAgICAgICAgbGV0IGluZGV4O1xuICAgICAgICBpZiAoYm9hcmRfY29sbGVjdGlvbiAmJiAoaW5kZXggPSBib2FyZF9jb2xsZWN0aW9uWydib2FyZCddLmZpbmRJbmRleChpdGVtID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtLnRpdGxlID09PSBib2FyZFRpdGxlO1xuICAgICAgICB9KSkgPj0gMCkge1xuXG4gICAgICAgICAgICBib2FyZF9jb2xsZWN0aW9uWydib2FyZCddLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgICAgIHRoaXMuZGVsZXRlKGJvYXJkX2NvbGxlY3Rpb24pO1xuXG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=