angular2-csv
Version:
> Helper library for create CSV file in Angular 6
300 lines (299 loc) • 26.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Component, Input } from '@angular/core';
export class Angular2CsvComponent {
constructor() {
this.filename = this.filename || 'mycsv.csv';
this.options = this.objectAssign({}, ConfigDefaults, this.options);
this.label_btn = "download";
this.csv = '';
}
/**
* Event Download
* @return {?}
*/
onDownload() {
this.generateCsv();
}
/**
* ngOnInit
* @return {?}
*/
ngOnInit() { }
/**
* [generateCsv description]
* @return {?}
*/
generateCsv() {
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;
}
let /** @type {?} */ blob = new Blob([this.csv], { type: 'text/csv;charset=utf8;' });
if (navigator.msSaveBlob) {
let /** @type {?} */ filename = this.options.filename.replace(/ /g, '_') + '.csv';
navigator.msSaveBlob(blob, filename);
}
else {
let /** @type {?} */ uri = 'data:attachment/csv;charset=utf-8,' + encodeURI(this.csv);
let /** @type {?} */ link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.setAttribute('visibility', 'hidden');
link.download = this.filename.replace(/ /g, '_') + '.csv';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
this.csv = '';
}
/**
* Create Headers for Csv File
* @return {?}
*/
getHeaders() {
if (this.options.headers.length > 0) {
let /** @type {?} */ row = '';
for (let /** @type {?} */ column of this.options.headers) {
row += column + this.options.fieldSeparator;
}
row = row.slice(0, -1);
this.csv += row + CsvConfigConsts.EOL;
}
}
/**
* Create Headers
* @return {?}
*/
getBody() {
for (let /** @type {?} */ dataRow of this.data) {
let /** @type {?} */ row = '';
if (this.isEmptyObject(dataRow) && this.options.removeNewLines) {
continue;
}
if (typeof this.options.keys !== 'undefined' && this.options.keys.length) {
for (let /** @type {?} */ key of this.options.keys) {
row += this.formartData(dataRow[key]) + this.options.fieldSeparator;
}
row = row.slice(0, -1);
this.csv += row + CsvConfigConsts.EOL;
}
else {
for (let /** @type {?} */ key in dataRow) {
if (dataRow[key]) {
row += this.formartData(dataRow[key]) + this.options.fieldSeparator;
}
}
this.csv += row + CsvConfigConsts.EOL;
}
}
}
/**
* Format Data
* @param {?} data
* @return {?}
*/
formartData(data) {
if (this.options.decimalseparator === 'locale' && this.isFloat(data)) {
return data.toLocaleString();
}
if (this.options.decimalseparator !== '.' && this.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 (typeof data === 'boolean') {
return data ? 'TRUE' : 'FALSE';
}
return data;
}
/**
* Validate if object is not empty
* @param {?} obj
* @return {?}
*/
isEmptyObject(obj) {
return (obj && (Object.keys(obj).length === 0));
}
/**
* Get Input is Float
* @param {?} input
* @return {?}
*/
isFloat(input) {
return +input === input && (!isFinite(input) || Boolean(input % 1));
}
/**
* Add object Values
* @param {?} val
* @return {?}
*/
toObject(val) {
if (val === null || val === undefined) {
throw new TypeError('Object.assign cannot be called with null or undefined');
}
return Object(val);
}
/**
* Add Values to Object
* @param {?} target
* @param {...?} source
* @return {?}
*/
objectAssign(target, ...source) {
let /** @type {?} */ from;
let /** @type {?} */ to = this.toObject(target);
let /** @type {?} */ symbols;
let /** @type {?} */ hasOwnProperty = Object.prototype.hasOwnProperty;
let /** @type {?} */ propIsEnumerable = Object.prototype.propertyIsEnumerable;
for (let /** @type {?} */ s = 1; s < arguments.length; s++) {
from = Object(arguments[s]);
for (let /** @type {?} */ key in from) {
if (hasOwnProperty.call(from, key)) {
to[key] = from[key];
}
}
if ((/** @type {?} */ (Object)).getOwnPropertySymbols) {
symbols = (/** @type {?} */ (Object)).getOwnPropertySymbols(from);
for (let /** @type {?} */ symbol of symbols) {
if (propIsEnumerable.call(from, symbol)) {
to[symbol] = from[symbol];
}
}
}
}
return to;
}
}
Angular2CsvComponent.decorators = [
{ type: Component, args: [{
selector: 'angular2csv',
template: `<button (click)="onDownload()">{{ label_btn }}</button>`,
styles: []
},] },
];
/** @nocollapse */
Angular2CsvComponent.ctorParameters = () => [];
Angular2CsvComponent.propDecorators = {
data: [{ type: Input }],
filename: [{ type: Input }],
options: [{ type: Input }]
};
function Angular2CsvComponent_tsickle_Closure_declarations() {
/** @type {?} */
Angular2CsvComponent.prototype.data;
/** @type {?} */
Angular2CsvComponent.prototype.filename;
/** @type {?} */
Angular2CsvComponent.prototype.options;
/** @type {?} */
Angular2CsvComponent.prototype.label_btn;
/** @type {?} */
Angular2CsvComponent.prototype.csv;
}
/**
* Option Interface
* @record
*/
export function Options() { }
function Options_tsickle_Closure_declarations() {
/** @type {?} */
Options.prototype.filename;
/** @type {?} */
Options.prototype.fieldSeparator;
/** @type {?} */
Options.prototype.quoteStrings;
/** @type {?} */
Options.prototype.decimalseparator;
/** @type {?} */
Options.prototype.showLabels;
/** @type {?} */
Options.prototype.showTitle;
/** @type {?} */
Options.prototype.title;
/** @type {?} */
Options.prototype.useBom;
/** @type {?} */
Options.prototype.headers;
/** @type {?} */
Options.prototype.keys;
/** @type {?} */
Options.prototype.removeNewLines;
}
/**
* CsvConfigConsts
*/
export class CsvConfigConsts {
}
CsvConfigConsts.EOL = '\r\n';
CsvConfigConsts.BOM = '\ufeff';
CsvConfigConsts.DEFAULT_FIELD_SEPARATOR = ',';
CsvConfigConsts.DEFAULT_DECIMAL_SEPARATOR = '.';
CsvConfigConsts.DEFAULT_QUOTE = '"';
CsvConfigConsts.DEFAULT_SHOW_TITLE = false;
CsvConfigConsts.DEFAULT_TITLE = 'My Report';
CsvConfigConsts.DEFAULT_FILENAME = 'mycsv.csv';
CsvConfigConsts.DEFAULT_SHOW_LABELS = false;
CsvConfigConsts.DEFAULT_USE_BOM = true;
CsvConfigConsts.DEFAULT_HEADER = [];
CsvConfigConsts.DEFAULT_KEY = [];
CsvConfigConsts.DEFAULT_REMOVE_NEW_LINES = false;
function CsvConfigConsts_tsickle_Closure_declarations() {
/** @type {?} */
CsvConfigConsts.EOL;
/** @type {?} */
CsvConfigConsts.BOM;
/** @type {?} */
CsvConfigConsts.DEFAULT_FIELD_SEPARATOR;
/** @type {?} */
CsvConfigConsts.DEFAULT_DECIMAL_SEPARATOR;
/** @type {?} */
CsvConfigConsts.DEFAULT_QUOTE;
/** @type {?} */
CsvConfigConsts.DEFAULT_SHOW_TITLE;
/** @type {?} */
CsvConfigConsts.DEFAULT_TITLE;
/** @type {?} */
CsvConfigConsts.DEFAULT_FILENAME;
/** @type {?} */
CsvConfigConsts.DEFAULT_SHOW_LABELS;
/** @type {?} */
CsvConfigConsts.DEFAULT_USE_BOM;
/** @type {?} */
CsvConfigConsts.DEFAULT_HEADER;
/** @type {?} */
CsvConfigConsts.DEFAULT_KEY;
/** @type {?} */
CsvConfigConsts.DEFAULT_REMOVE_NEW_LINES;
}
/**
* Default Configurations
*/
export const /** @type {?} */ 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,
keys: CsvConfigConsts.DEFAULT_KEY,
removeNewLines: CsvConfigConsts.DEFAULT_REMOVE_NEW_LINES
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhcjItY3N2LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXIyLWNzdi8iLCJzb3VyY2VzIjpbImxpYi9hbmd1bGFyMi1jc3YuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVF6RCxNQUFNO0lBU0o7d0JBTjZCLElBQUksQ0FBQyxRQUFRLElBQUksV0FBVzt1QkFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUM7eUJBRTNELFVBQVU7bUJBQ2hCLEVBQUU7S0FFQTs7Ozs7SUFJaEIsVUFBVTtRQUNSLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztLQUNwQjs7Ozs7SUFJRCxRQUFRLE1BQUs7Ozs7O0lBSWIsV0FBVztRQUVULEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUM7U0FDakM7UUFFRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUM7U0FDM0M7UUFFRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRWYsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDNUIsTUFBTSxDQUFDO1NBQ1I7UUFFRCxxQkFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxJ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bnQsIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYW5ndWxhcjJjc3YnLFxuICB0ZW1wbGF0ZTogYDxidXR0b24gKGNsaWNrKT1cIm9uRG93bmxvYWQoKVwiPnt7IGxhYmVsX2J0biB9fTwvYnV0dG9uPmAsXG4gIHN0eWxlczogW11cbn0pXG5cbmV4cG9ydCBjbGFzcyBBbmd1bGFyMkNzdkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgZGF0YTogYW55W107XG4gIEBJbnB1dCgpIGZpbGVuYW1lOiBzdHJpbmcgID0gdGhpcy5maWxlbmFtZSB8fCAnbXljc3YuY3N2JztcbiAgQElucHV0KCkgb3B0aW9uczogT3B0aW9ucyA9IHRoaXMub2JqZWN0QXNzaWduKHt9LCBDb25maWdEZWZhdWx0cywgdGhpcy5vcHRpb25zKTtcblxuICBsYWJlbF9idG46IHN0cmluZyA9IFwiZG93bmxvYWRcIjtcbiAgY3N2OiBzdHJpbmcgPSAnJztcblxuICBjb25zdHJ1Y3RvcigpIHt9XG4gIC8qKlxuICAgKiBFdmVudCBEb3dubG9hZFxuICAgKi9cbiAgb25Eb3dubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLmdlbmVyYXRlQ3N2KCk7XG4gIH1cbiAgLyoqXG4gICAqIG5nT25Jbml0XG4gICAqL1xuICBuZ09uSW5pdCgpIHt9XG4gIC8qKlxuICAgKiBbZ2VuZXJhdGVDc3YgZGVzY3JpcHRpb25dXG4gICAqL1xuICBnZW5lcmF0ZUNzdigpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudXNlQm9tKSB7XG4gICAgICB0aGlzLmNzdiArPSBDc3ZDb25maWdDb25zdHMuQk9NO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1RpdGxlKSB7XG4gICAgICB0aGlzLmNzdiArPSB0aGlzLm9wdGlvbnMudGl0bGUgKyAnXFxyXFxuXFxuJztcbiAgICB9XG5cbiAgICB0aGlzLmdldEhlYWRlcnMoKTtcbiAgICB0aGlzLmdldEJvZHkoKTtcblxuICAgIGlmICh0aGlzLmNzdiA9PT0gJycpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdJbnZhbGlkIGRhdGEnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgYmxvYiA9IG5ldyBCbG9iKFt0aGlzLmNzdl0sIHt0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGY4Oyd9KTtcblxuICAgIGlmIChuYXZpZ2F0b3IubXNTYXZlQmxvYikge1xuXG4gICAgICBsZXQgZmlsZW5hbWUgPSB0aGlzLm9wdGlvbnMuZmlsZW5hbWUucmVwbGFjZSgvIC9nLCAnXycpICsgJy5jc3YnO1xuICAgICAgbmF2aWdhdG9yLm1zU2F2ZUJsb2IoYmxvYiwgZmlsZW5hbWUpO1xuXG4gICAgfSBlbHNlIHtcblxuICAgICAgbGV0IHVyaSA9ICdkYXRhOmF0dGFjaG1lbnQvY3N2O2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSSh0aGlzLmNzdik7XG4gICAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblxuICAgICAgbGluay5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcblxuICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XG4gICAgICBsaW5rLmRvd25sb2FkID0gdGhpcy5maWxlbmFtZS5yZXBsYWNlKC8gL2csICdfJykgKyAnLmNzdic7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG5cbiAgICAgIGxpbmsuY2xpY2soKTtcblxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcbiAgICB9XG5cbiAgICB0aGlzLmNzdiA9ICcnO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgSGVhZGVycyBmb3IgQ3N2IEZpbGVcbiAgICovXG4gIGdldEhlYWRlcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5oZWFkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCByb3cgPSAnJztcbiAgICAgIGZvciAobGV0IGNvbHVtbiBvZiB0aGlzLm9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICByb3cgKz0gY29sdW1uICsgdGhpcy5vcHRpb25zLmZpZWxkU2VwYXJhdG9yO1xuICAgICAgfVxuXG4gICAgICByb3cgPSByb3cuc2xpY2UoMCwgLTEpO1xuICAgICAgdGhpcy5jc3YgKz0gcm93ICsgQ3N2Q29uZmlnQ29uc3RzLkVPTDtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBIZWFkZXJzXG4gICAqL1xuICBnZXRCb2R5KCk6IHZvaWQge1xuXG4gICAgZm9yIChsZXQgZGF0YVJvdyBvZiB0aGlzLmRhdGEpIHtcblxuICAgICAgbGV0IHJvdyA9ICcnO1xuXG4gICAgICBpZih0aGlzLmlzRW1wdHlPYmplY3QoZGF0YVJvdykgJiYgdGhpcy5vcHRpb25zLnJlbW92ZU5ld0xpbmVzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5rZXlzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm9wdGlvbnMua2V5cy5sZW5ndGgpIHtcblxuICAgICAgICBmb3IgKGxldCBrZXkgb2YgdGhpcy5vcHRpb25zLmtleXMpIHtcbiAgICAgICAgICByb3cgKz0gdGhpcy5mb3JtYXJ0RGF0YShkYXRhUm93W2tleV0pICsgdGhpcy5vcHRpb25zLmZpZWxkU2VwYXJhdG9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcm93ID0gcm93LnNsaWNlKDAsIC0xKTtcbiAgICAgICAgdGhpcy5jc3YgKz0gcm93ICsgQ3N2Q29uZmlnQ29uc3RzLkVPTDtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gZGF0YVJvdykge1xuICAgICAgICAgIGlmKGRhdGFSb3dba2V5XSkge1xuICAgICAgICAgICAgcm93ICs9IHRoaXMuZm9ybWFydERhdGEoZGF0YVJvd1trZXldKSArIHRoaXMub3B0aW9ucy5maWVsZFNlcGFyYXRvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jc3YgKz0gcm93ICsgQ3N2Q29uZmlnQ29uc3RzLkVPTDtcblxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogRm9ybWF0IERhdGFcbiAgICovXG4gIGZvcm1hcnREYXRhKGRhdGE6IGFueSkge1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5kZWNpbWFsc2VwYXJhdG9yID09PSAnbG9jYWxlJyAmJiB0aGlzLmlzRmxvYXQoZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhLnRvTG9jYWxlU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5kZWNpbWFsc2VwYXJhdG9yICE9PSAnLicgJiYgdGhpcy5pc0Zsb2F0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YS50b1N0cmluZygpLnJlcGxhY2UoJy4nLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHNlcGFyYXRvcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgvXCIvZywgJ1wiXCInKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5xdW90ZVN0cmluZ3MgfHwgZGF0YS5pbmRleE9mKCcsJykgPiAtMSB8fCBkYXRhLmluZGV4T2YoXCJcXG5cIikgPiAtMSB8fCBkYXRhLmluZGV4T2YoXCJcXHJcIikgPiAtMSkge1xuICAgICAgICBkYXRhID0gdGhpcy5vcHRpb25zLnF1b3RlU3RyaW5ncyArIGRhdGEgKyB0aGlzLm9wdGlvbnMucXVvdGVTdHJpbmdzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIGRhdGEgPyAnVFJVRScgOiAnRkFMU0UnO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBpZiBvYmplY3QgaXMgbm90IGVtcHR5XG4gICAqL1xuICBpc0VtcHR5T2JqZWN0KG9iajogYW55KSB7XG4gICAgcmV0dXJuIChvYmogJiYgKE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwKSk7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBJbnB1dCBpcyBGbG9hdFxuICAgKi9cbiAgaXNGbG9hdChpbnB1dDogYW55KSB7XG4gICAgcmV0dXJuICtpbnB1dCA9PT0gaW5wdXQgJiYgKCFpc0Zpbml0ZShpbnB1dCkgfHwgQm9vbGVhbihpbnB1dCAlIDEpKTtcbiAgfVxuICAvKipcbiAgICogQWRkIG9iamVjdCBWYWx1ZXNcbiAgICovXG4gIHRvT2JqZWN0KHZhbDogYW55KSB7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdCh2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgVmFsdWVzIHRvIE9iamVjdFxuICAgKi9cbiAgb2JqZWN0QXNzaWduKHRhcmdldDogYW55LCAuLi5zb3VyY2U6IGFueVtdKSB7XG4gICAgbGV0IGZyb206IGFueTtcbiAgICBsZXQgdG8gPSB0aGlzLnRvT2JqZWN0KHRhcmdldCk7XG4gICAgbGV0IHN5bWJvbHM6IGFueTtcblxuICAgIGxldCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG4gICAgbGV0IHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4gICAgZm9yIChsZXQgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcbiAgICAgIGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTtcblxuICAgICAgZm9yIChsZXQga2V5IGluIGZyb20pIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuICAgICAgICAgIHRvW2tleV0gPSBmcm9tW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCg8YW55PiBPYmplY3QpLmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICBzeW1ib2xzID0gKDxhbnk+IE9iamVjdCkuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGZyb20pO1xuICAgICAgICBmb3IgKGxldCBzeW1ib2wgb2Ygc3ltYm9scykge1xuICAgICAgICAgIGlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9sKSkge1xuICAgICAgICAgICAgdG9bc3ltYm9sXSA9IGZyb21bc3ltYm9sXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdG87XG4gIH1cbn1cbi8qKlxuICogT3B0aW9uIEludGVyZmFjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbnMge1xuICBmaWxlbmFtZTogc3RyaW5nO1xuICBmaWVsZFNlcGFyYXRvcjogc3RyaW5nO1xuICBxdW90ZVN0cmluZ3M6IHN0cmluZztcbiAgZGVjaW1hbHNlcGFyYXRvcjogc3RyaW5nO1xuICBzaG93TGFiZWxzOiBib29sZWFuO1xuICBzaG93VGl0bGU6IGJvb2xlYW47XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHVzZUJvbTogYm9vbGVhbjtcbiAgaGVhZGVyczogc3RyaW5nW107XG4gIGtleXM6IHN0cmluZ1tdO1xuICByZW1vdmVOZXdMaW5lczogYm9vbGVhbjtcbn1cbi8qKlxuICogQ3N2Q29uZmlnQ29uc3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBDc3ZDb25maWdDb25zdHMge1xuXG4gIHB1YmxpYyBzdGF0aWMgRU9MID0gJ1xcclxcbic7XG4gIHB1YmxpYyBzdGF0aWMgQk9NID0gJ1xcdWZlZmYnO1xuXG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9GSUVMRF9TRVBBUkFUT1IgPSAnLCc7XG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9ERUNJTUFMX1NFUEFSQVRPUiA9ICcuJztcbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX1FVT1RFID0gJ1wiJztcbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX1NIT1dfVElUTEUgPSBmYWxzZTtcbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX1RJVExFID0gJ015IFJlcG9ydCc7XG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9GSUxFTkFNRSA9ICdteWNzdi5jc3YnO1xuICBwdWJsaWMgc3RhdGljIERFRkFVTFRfU0hPV19MQUJFTFMgPSBmYWxzZTtcbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX1VTRV9CT00gPSB0cnVlO1xuICBwdWJsaWMgc3RhdGljIERFRkFVTFRfSEVBREVSOiBzdHJpbmdbXSA9IFtdO1xuICBwdWJsaWMgc3RhdGljIERFRkFVTFRfS0VZOiBzdHJpbmdbXSA9IFtdO1xuICBwdWJsaWMgc3RhdGljIERFRkFVTFRfUkVNT1ZFX05FV19MSU5FUyA9IGZhbHNlO1xufVxuLyoqXG4gKiBEZWZhdWx0IENvbmZpZ3VyYXRpb25zXG4gKi9cbmV4cG9ydCBjb25zdCBDb25maWdEZWZhdWx0czogT3B0aW9ucyA9IHtcbiAgZmlsZW5hbWU6IENzdkNvbmZpZ0NvbnN0cy5ERUZBVUxUX0ZJTEVOQU1FLFxuICBmaWVsZFNlcGFyYXRvcjogQ3N2Q29uZmlnQ29uc3RzLkRFRkFVTFRfRklFTERfU0VQQVJBVE9SLFxuICBxdW90ZVN0cmluZ3M6IENzdkNvbmZpZ0NvbnN0cy5ERUZBVUxUX1FVT1RFLFxuICBkZWNpbWFsc2VwYXJhdG9yOiBDc3ZDb25maWdDb25zdHMuREVGQVVMVF9ERUNJTUFMX1NFUEFSQVRPUixcbiAgc2hvd0xhYmVsczogQ3N2Q29uZmlnQ29uc3RzLkRFRkFVTFRfU0hPV19MQUJFTFMsXG4gIHNob3dUaXRsZTogQ3N2Q29uZmlnQ29uc3RzLkRFRkFVTFRfU0hPV19USVRMRSxcbiAgdGl0bGU6IENzdkNvbmZpZ0NvbnN0cy5ERUZBVUxUX1RJVExFLFxuICB1c2VCb206IENzdkNvbmZpZ0NvbnN0cy5ERUZBVUxUX1VTRV9CT00sXG4gIGhlYWRlcnM6IENzdkNvbmZpZ0NvbnN0cy5ERUZBVUxUX0hFQURFUixcbiAga2V5czogQ3N2Q29uZmlnQ29uc3RzLkRFRkFVTFRfS0VZLFxuICByZW1vdmVOZXdMaW5lczogQ3N2Q29uZmlnQ29uc3RzLkRFRkFVTFRfUkVNT1ZFX05FV19MSU5FU1xufTtcbiJdfQ==