@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
199 lines (192 loc) • 22.5 kB
JavaScript
export class CsvConfigConsts {
static EOL = '\r\n';
static BOM = '\ufeff';
static DEFAULT_FIELD_SEPARATOR = ',';
static DEFAULT_DECIMAL_SEPARATOR = '.';
static DEFAULT_QUOTE = '"';
static DEFAULT_SHOW_TITLE = false;
static DEFAULT_TITLE = 'My Report';
static DEFAULT_FILENAME = 'mycsv.csv';
static DEFAULT_SHOW_LABELS = false;
static DEFAULT_USE_BOM = true;
static DEFAULT_HEADER = [];
static DEFAULT_NO_DOWNLOAD = false;
static DEFAULT_NULL_TO_EMPTY_STRING = false;
}
export const ConfigDefaults = {
filename: CsvConfigConsts.DEFAULT_FILENAME,
fieldSeparator: CsvConfigConsts.DEFAULT_FIELD_SEPARATOR,
quoteStrings: CsvConfigConsts.DEFAULT_QUOTE,
decimalseparator: CsvConfigConsts.DEFAULT_DECIMAL_SEPARATOR,
showLabels: CsvConfigConsts.DEFAULT_SHOW_LABELS,
showTitle: CsvConfigConsts.DEFAULT_SHOW_TITLE,
title: CsvConfigConsts.DEFAULT_TITLE,
useBom: CsvConfigConsts.DEFAULT_USE_BOM,
headers: CsvConfigConsts.DEFAULT_HEADER,
noDownload: CsvConfigConsts.DEFAULT_NO_DOWNLOAD,
nullToEmptyString: CsvConfigConsts.DEFAULT_NULL_TO_EMPTY_STRING,
};
export class ExportToCsv {
constructor(DataJSON, filename, options) {
const config = options || {};
if (typeof DataJSON === 'string') {
this.data = JSON.parse(JSON.stringify(DataJSON));
}
else {
this.data =
typeof DataJSON !== 'object' ? JSON.parse(DataJSON) : DataJSON;
}
this._options = objectAssign({}, ConfigDefaults, config);
if (this._options.filename) {
this._options.filename = filename;
}
}
// public fileName: string;
// public labels: Array<String>;
data;
_options;
csv = '';
/**
* Check if is Float
* @param {any} input
*/
static isFloat(input) {
return +input === input && (!isFinite(input) || Boolean(input % 1));
}
/**
* Generate CSV To string
*/
csvToString() {
if (this._options.useBom) {
this.csv += CsvConfigConsts.BOM;
}
if (this._options.showTitle) {
this.csv += this._options.title + '\r\n\n';
}
this.getHeaders();
this.getBody();
if (this.csv === '') {
console.log('Invalid data');
return '';
}
return this.csv;
/*
if (this._options.noDownload) {
}
const blob = new Blob([this.csv], {'type': 'text/csv;charset=utf8;'});
if (navigator.msSaveBlob) {
const filename = this._options.filename.replace(/ /g, '_') + '.csv';
navigator.msSaveBlob(blob, filename);
} else {
const uri = 'data:attachment/csv;charset=utf-8,' + encodeURI(this.csv);
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.setAttribute('visibility', 'hidden');
link.download = this._options.filename.replace(/ /g, '_') + '.csv';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
*/
}
/**
* Create Headers
*/
getHeaders() {
if (this._options.headers.length > 0) {
const { headers } = this._options;
let row = headers.reduce((headerRow, header) => {
return headerRow + header + this._options.fieldSeparator;
}, '');
row = row.slice(0, -1);
this.csv += row + CsvConfigConsts.EOL;
}
}
/**
* Create Body
*/
getBody() {
for (let i = 0; i < this.data.length; i++) {
let row = '';
for (const index in this.data[i]) {
row +=
this.formatData(this.data[i][index]) + this._options.fieldSeparator;
}
row = row.slice(0, -1);
this.csv += row + CsvConfigConsts.EOL;
}
}
/**
* Format Data
* @param {any} data
*/
formatData(data) {
if (this._options.decimalseparator === 'locale' &&
ExportToCsv.isFloat(data)) {
return data.toLocaleString();
}
if (this._options.decimalseparator !== '.' && ExportToCsv.isFloat(data)) {
return data.toString().replace('.', this._options.decimalseparator);
}
if (typeof data === 'string') {
data = data.replace(/"/g, '""');
if (this._options.quoteStrings ||
data.indexOf(',') > -1 ||
data.indexOf('\n') > -1 ||
data.indexOf('\r') > -1) {
data = this._options.quoteStrings + data + this._options.quoteStrings;
}
return data;
}
if (this._options.nullToEmptyString) {
if (data === null) {
return (data = '');
}
return data;
}
if (typeof data === 'boolean') {
return data ? 'TRUE' : 'FALSE';
}
return data;
}
}
const hasOwnProperty = Object.prototype.hasOwnProperty;
const propIsEnumerable = Object.prototype.propertyIsEnumerable;
/**
* Convet to Object
* @param {any} val
*/
function toObject(val) {
if (val === null || val === undefined) {
throw new TypeError('Object.assign cannot be called with null or undefined');
}
return Object(val);
}
/**
* Assign data to new Object
* @param {any} target
* @param {any[]} ...source
*/
function objectAssign(target, ...source) {
let from;
const to = toObject(target);
let symbols;
for (let s = 1; s < arguments.length; s++) {
from = Object(arguments[s]);
for (const key in from) {
if (hasOwnProperty.call(from, key)) {
to[key] = from[key];
}
}
if (Object.getOwnPropertySymbols) {
symbols = Object.getOwnPropertySymbols(from);
for (let i = 0; i < symbols.length; i++) {
if (propIsEnumerable.call(from, symbols[i])) {
to[symbols[i]] = from[symbols[i]];
}
}
}
}
return to;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9zcmMvbGliL2Nzdi1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBY0EsTUFBTSxPQUFPLGVBQWU7SUFDbkIsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUM7SUFDcEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUM7SUFFdEIsTUFBTSxDQUFDLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztJQUNyQyxNQUFNLENBQUMseUJBQXlCLEdBQUcsR0FBRyxDQUFDO0lBQ3ZDLE1BQU0sQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDO0lBQzNCLE1BQU0sQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFDbEMsTUFBTSxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUM7SUFDbkMsTUFBTSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztJQUN0QyxNQUFNLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBQ25DLE1BQU0sQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQzlCLE1BQU0sQ0FBQyxjQUFjLEdBQVUsRUFBRSxDQUFDO0lBQ2xDLE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFDbkMsTUFBTSxDQUFDLDRCQUE0QixHQUFHLEtBQUssQ0FBQzs7QUFHckQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFZO0lBQ3JDLFFBQVEsRUFBRSxlQUFlLENBQUMsZ0JBQWdCO0lBQzFDLGNBQWMsRUFBRSxlQUFlLENBQUMsdUJBQXVCO0lBQ3ZELFlBQVksRUFBRSxlQUFlLENBQUMsYUFBYTtJQUMzQyxnQkFBZ0IsRUFBRSxlQUFlLENBQUMseUJBQXlCO0lBQzNELFVBQVUsRUFBRSxlQUFlLENBQUMsbUJBQW1CO0lBQy9DLFNBQVMsRUFBRSxlQUFlLENBQUMsa0JBQWtCO0lBQzdDLEtBQUssRUFBRSxlQUFl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QUFDLENBQUMsRUFBRSxDQUFDO29CQUM1QyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBPcHRpb25zIHtcbiAgZmlsZW5hbWU6IHN0cmluZztcbiAgZmllbGRTZXBhcmF0b3I6IHN0cmluZztcbiAgcXVvdGVTdHJpbmdzOiBzdHJpbmc7XG4gIGRlY2ltYWxzZXBhcmF0b3I6IHN0cmluZztcbiAgc2hvd0xhYmVsczogYm9vbGVhbjtcbiAgc2hvd1RpdGxlOiBib29sZWFuO1xuICB0aXRsZTogc3RyaW5nO1xuICB1c2VCb206IGJvb2xlYW47XG4gIGhlYWRlcnM6IHN0cmluZ1tdO1xuICBub0Rvd25sb2FkOiBib29sZWFuO1xuICBudWxsVG9FbXB0eVN0cmluZzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIENzdkNvbmZpZ0NvbnN0cyB7XG4gIHB1YmxpYyBzdGF0aWMgRU9MID0gJ1xcclxcbic7XG4gIHB1YmxpYyBzdGF0aWMgQk9NID0gJ1xcdWZlZmYnO1xuXG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9GSUVMRF9TRVBBUkFUT1IgPSAnLCc7XG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9ERUNJTUFMX1NFUEFSQVRPUiA9ICcuJztcbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX1FVT1RFID0gJ1wiJztcbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX1NIT1dfVElUTEUgPSBmYWxzZTtcbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX1RJVExFID0gJ015IFJlcG9ydCc7XG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9GSUxFTkFNRSA9ICdteWNzdi5jc3YnO1xuICBwdWJsaWMgc3RhdGljIERFRkFVTFRfU0hPV19MQUJFTFMgPSBmYWxzZTtcbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX1VTRV9CT00gPSB0cnVlO1xuICBwdWJsaWMgc3RhdGljIERFRkFVTFRfSEVBREVSOiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgc3RhdGljIERFRkFVTFRfTk9fRE9XTkxPQUQgPSBmYWxzZTtcbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX05VTExfVE9fRU1QVFlfU1RSSU5HID0gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCBDb25maWdEZWZhdWx0czogT3B0aW9ucyA9IHtcbiAgZmlsZW5hbWU6IENzdkNvbmZpZ0NvbnN0cy5ERUZBVUxUX0ZJTEVOQU1FLFxuICBmaWVsZFNlcGFyYXRvcjogQ3N2Q29uZmlnQ29uc3RzLkRFRkFVTFRfRklFTERfU0VQQVJBVE9SLFxuICBxdW90ZVN0cmluZ3M6IENzdkNvbmZpZ0NvbnN0cy5ERUZBVUxUX1FVT1RFLFxuICBkZWNpbWFsc2VwYXJhdG9yOiBDc3ZDb25maWdDb25zdHMuREVGQVVMVF9ERUNJTUFMX1NFUEFSQVRPUixcbiAgc2hvd0xhYmVsczogQ3N2Q29uZmlnQ29uc3RzLkRFRkFVTFRfU0hPV19MQUJFTFMsXG4gIHNob3dUaXRsZTogQ3N2Q29uZmlnQ29uc3RzLkRFRkFVTFRfU0hPV19USVRMRSxcbiAgdGl0bGU6IENzdkNvbmZpZ0NvbnN0cy5ERUZBVUxUX1RJVExFLFxuICB1c2VCb206IENzdkNvbmZpZ0NvbnN0cy5ERUZBVUxUX1VTRV9CT00sXG4gIGhlYWRlcnM6IENzdkNvbmZpZ0NvbnN0cy5ERUZBVUxUX0hFQURFUixcbiAgbm9Eb3dubG9hZDogQ3N2Q29uZmlnQ29uc3RzLkRFRkFVTFRfTk9fRE9XTkxPQUQsXG4gIG51bGxUb0VtcHR5U3RyaW5nOiBDc3ZDb25maWdDb25zdHMuREVGQVVMVF9OVUxMX1RPX0VNUFRZX1NUUklORyxcbn07XG5cbmV4cG9ydCBjbGFzcyBFeHBvcnRUb0NzdiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIERhdGFKU09OOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10gfCBzdHJpbmcsXG4gICAgZmlsZW5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogUGFydGlhbDxPcHRpb25zPlxuICApIHtcbiAgICBjb25zdCBjb25maWcgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgaWYgKHR5cGVvZiBEYXRhSlNPTiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuZGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoRGF0YUpTT04pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhID1cbiAgICAgICAgdHlwZW9mIERhdGFKU09OICE9PSAnb2JqZWN0JyA/IEpTT04ucGFyc2UoRGF0YUpTT04pIDogRGF0YUpTT047XG4gICAgfVxuXG4gICAgdGhpcy5fb3B0aW9ucyA9IG9iamVjdEFzc2lnbih7fSwgQ29uZmlnRGVmYXVsdHMsIGNvbmZpZyk7XG5cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5maWxlbmFtZSkge1xuICAgICAgdGhpcy5fb3B0aW9ucy5maWxlbmFtZSA9IGZpbGVuYW1lO1xuICAgIH1cbiAgfVxuXG4gIC8vIHB1YmxpYyBmaWxlTmFtZTogc3RyaW5nO1xuICAvLyBwdWJsaWMgbGFiZWxzOiBBcnJheTxTdHJpbmc+O1xuICBwdWJsaWMgZGF0YTogYW55W107XG5cbiAgcHJpdmF0ZSBfb3B0aW9uczogT3B0aW9ucztcbiAgcHJpdmF0ZSBjc3YgPSAnJztcblxuICAvKipcbiAgICogQ2hlY2sgaWYgaXMgRmxvYXRcbiAgICogQHBhcmFtIHthbnl9IGlucHV0XG4gICAqL1xuICBzdGF0aWMgaXNGbG9hdChpbnB1dDogYW55KSB7XG4gICAgcmV0dXJuICtpbnB1dCA9PT0gaW5wdXQgJiYgKCFpc0Zpbml0ZShpbnB1dCkgfHwgQm9vbGVhbihpbnB1dCAlIDEpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBDU1YgVG8gc3RyaW5nXG4gICAqL1xuICBwdWJsaWMgY3N2VG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fb3B0aW9ucy51c2VCb20pIHtcbiAgICAgIHRoaXMuY3N2ICs9IENzdkNvbmZpZ0NvbnN0cy5CT007XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX29wdGlvbnMuc2hvd1RpdGxlKSB7XG4gICAgICB0aGlzLmNzdiArPSB0aGlzLl9vcHRpb25zLnRpdGxlICsgJ1xcclxcblxcbic7XG4gICAgfVxuXG4gICAgdGhpcy5nZXRIZWFkZXJzKCk7XG4gICAgdGhpcy5nZXRCb2R5KCk7XG5cbiAgICBpZiAodGhpcy5jc3YgPT09ICcnKSB7XG4gICAgICBjb25zb2xlLmxvZygnSW52YWxpZCBkYXRhJyk7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY3N2O1xuICAgIC8qXG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLm5vRG93bmxvYWQpIHtcblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFt0aGlzLmNzdl0sIHsndHlwZSc6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zjg7J30pO1xuXG4gICAgICAgIGlmIChuYXZpZ2F0b3IubXNTYXZlQmxvYikge1xuICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLl9vcHRpb25zLmZpbGVuYW1lLnJlcGxhY2UoLyAvZywgJ18nKSArICcuY3N2JztcbiAgICAgICAgICAgIG5hdmlnYXRvci5tc1NhdmVCbG9iKGJsb2IsIGZpbGVuYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHVyaSA9ICdkYXRhOmF0dGFjaG1lbnQvY3N2O2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSSh0aGlzLmNzdik7XG4gICAgICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXG4gICAgICAgICAgICBsaW5rLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXG4gICAgICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgndmlzaWJpbGl0eScsICdoaWRkZW4nKTtcblxuICAgICAgICAgICAgbGluay5kb3dubG9hZCA9IHRoaXMuX29wdGlvbnMuZmlsZW5hbWUucmVwbGFjZSgvIC9nLCAnXycpICsgJy5jc3YnO1xuXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xuICAgICAgICAgICAgbGluay5jbGljaygpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcbiAgICAgICAgfVxuICAgICAgICAgKi9cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgSGVhZGVyc1xuICAgKi9cbiAgZ2V0SGVhZGVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5oZWFkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gdGhpcy5fb3B0aW9ucztcbiAgICAgIGxldCByb3cgPSBoZWFkZXJzLnJlZHVjZSgoaGVhZGVyUm93LCBoZWFkZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGhlYWRlclJvdyArIGhlYWRlciArIHRoaXMuX29wdGlvbnMuZmllbGRTZXBhcmF0b3I7XG4gICAgICB9LCAnJyk7XG4gICAgICByb3cgPSByb3cuc2xpY2UoMCwgLTEpO1xuICAgICAgdGhpcy5jc3YgKz0gcm93ICsgQ3N2Q29uZmlnQ29uc3RzLkVPTDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIEJvZHlcbiAgICovXG4gIGdldEJvZHkoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCByb3cgPSAnJztcbiAgICAgIGZvciAoY29uc3QgaW5kZXggaW4gdGhpcy5kYXRhW2ldKSB7XG4gICAgICAgIHJvdyArPVxuICAgICAgICAgIHRoaXMuZm9ybWF0RGF0YSh0aGlzLmRhdGFbaV1baW5kZXhdKSArIHRoaXMuX29wdGlvbnMuZmllbGRTZXBhcmF0b3I7XG4gICAgICB9XG5cbiAgICAgIHJvdyA9IHJvdy5zbGljZSgwLCAtMSk7XG4gICAgICB0aGlzLmNzdiArPSByb3cgKyBDc3ZDb25maWdDb25zdHMuRU9MO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgRGF0YVxuICAgKiBAcGFyYW0ge2FueX0gZGF0YVxuICAgKi9cbiAgZm9ybWF0RGF0YShkYXRhOiBhbnkpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9vcHRpb25zLmRlY2ltYWxzZXBhcmF0b3IgPT09ICdsb2NhbGUnICYmXG4gICAgICBFeHBvcnRUb0Nzdi5pc0Zsb2F0KGRhdGEpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZGF0YS50b0xvY2FsZVN0cmluZygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9vcHRpb25zLmRlY2ltYWxzZXBhcmF0b3IgIT09ICcuJyAmJiBFeHBvcnRUb0Nzdi5pc0Zsb2F0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YS50b1N0cmluZygpLnJlcGxhY2UoJy4nLCB0aGlzLl9vcHRpb25zLmRlY2ltYWxzZXBhcmF0b3IpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoL1wiL2csICdcIlwiJyk7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX29wdGlvbnMucXVvdGVTdHJpbmdzIHx8XG4gICAgICAgIGRhdGEuaW5kZXhPZignLCcpID4gLTEgfHxcbiAgICAgICAgZGF0YS5pbmRleE9mKCdcXG4nKSA+IC0xIHx8XG4gICAgICAgIGRhdGEuaW5kZXhPZignXFxyJykgPiAtMVxuICAgICAgKSB7XG4gICAgICAgIGRhdGEgPSB0aGlzLl9vcHRpb25zLnF1b3RlU3RyaW5ncyArIGRhdGEgKyB0aGlzLl9vcHRpb25zLnF1b3RlU3RyaW5ncztcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9vcHRpb25zLm51bGxUb0VtcHR5U3RyaW5nKSB7XG4gICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gKGRhdGEgPSAnJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIGRhdGEgPyAnVFJVRScgOiAnRkFMU0UnO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxufVxuXG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5jb25zdCBwcm9wSXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyoqXG4gKiBDb252ZXQgdG8gT2JqZWN0XG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKi9cbmZ1bmN0aW9uIHRvT2JqZWN0KHZhbDogYW55KSB7XG4gIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJ1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIE9iamVjdCh2YWwpO1xufVxuXG4vKipcbiAqIEFzc2lnbiBkYXRhICB0byBuZXcgT2JqZWN0XG4gKiBAcGFyYW0ge2FueX0gICB0YXJnZXRcbiAqIEBwYXJhbSB7YW55W119IC4uLnNvdXJjZVxuICovXG5mdW5jdGlvbiBvYmplY3RBc3NpZ24odGFyZ2V0OiBhbnksIC4uLnNvdXJjZTogYW55W10pIHtcbiAgbGV0IGZyb206IGFueTtcbiAgY29uc3QgdG8gPSB0b09iamVjdCh0YXJnZXQpO1xuICBsZXQgc3ltYm9sczogYW55O1xuXG4gIGZvciAobGV0IHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG4gICAgZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pO1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuICAgICAgICB0b1trZXldID0gZnJvbVtrZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgoPGFueT5PYmplY3QpLmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgc3ltYm9scyA9ICg8YW55Pk9iamVjdCkuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGZyb20pO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9sc1tpXSkpIHtcbiAgICAgICAgICB0b1tzeW1ib2xzW2ldXSA9IGZyb21bc3ltYm9sc1tpXV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvO1xufVxuIl19