@csvbox/angular
Version:
Angular adapter for csvbox.io
440 lines • 44.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/csvbox-button.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewChild, Input, SecurityContext } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { insertCSS } from '../utlis/insertCSS';
/** @type {?} */
var appVersion = '1.1.16';
var CSVBoxButtonComponent = /** @class */ (function () {
function CSVBoxButtonComponent(sanitizer) {
this.sanitizer = sanitizer;
this.isModalShown = false;
this.uuid = null;
this.customDomain = null;
this.dataLocation = null;
this.language = null;
this.isIframeLoaded = false;
this.openModalOnIframeLoad = false;
this.lazy = false;
this.iframe = null;
this.disabled = true;
}
/**
* @return {?}
*/
CSVBoxButtonComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.uuid = this.generateUuid();
/** @type {?} */
var domain = this.customDomain ? this.customDomain : "app.csvbox.io";
if (this.dataLocation) {
domain = this.dataLocation + "-" + domain;
}
/** @type {?} */
var iframeUrl = "https://" + domain + "/embed/" + this.licenseKey;
iframeUrl += "?library-version=" + appVersion;
iframeUrl += "&framework=angular";
if (this.dataLocation) {
iframeUrl += "&preventRedirect";
}
if (this.language) {
iframeUrl += "&language" + this.language;
}
if (this.environment) {
/** @type {?} */
var environment = JSON.stringify(this.environment).replace(/['"]/g, (/**
* @param {?} match
* @return {?}
*/
function (match) {
return '\\' + match;
}));
iframeUrl += "&env=" + environment;
}
this.safeUrl = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(iframeUrl));
};
/**
* @return {?}
*/
CSVBoxButtonComponent.prototype.generateUuid = /**
* @return {?}
*/
function () {
return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
};
/**
* @param {?} changes
* @return {?}
*/
CSVBoxButtonComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes["user"] && changes['user'].currentValue != changes['user'].previousValue) {
this.updateUserVariabe(changes['user'].currentValue);
}
};
/**
* @param {?} data
* @return {?}
*/
CSVBoxButtonComponent.prototype.updateUserVariabe = /**
* @param {?} data
* @return {?}
*/
function (data) {
this.user = data;
if (this.iframe && this.iframe.contentWindow) {
this.iframe.contentWindow.postMessage({
"customer": data
}, "*");
}
};
/**
* @return {?}
*/
CSVBoxButtonComponent.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
var _this = this;
window.addEventListener("message", (/**
* @param {?} event
* @return {?}
*/
function (event) {
if (event && typeof event.data == "object") {
if (event.data && event.data.data && event.data.data.unique_token == _this.uuid) {
if (event.data.type && event.data.type == "data-on-submit") {
/** @type {?} */
var metadata = event.data.data;
metadata["column_mappings"] = event.data.column_mapping;
delete metadata["unique_token"];
if (_this.onSubmit)
_this.onSubmit(metadata);
if (_this.isSubmitted)
_this.isSubmitted(metadata);
if (_this.submitted)
_this.submitted(metadata);
}
else if (event.data.type && event.data.type == "data-push-status") {
if (event.data.data.import_status == "success") {
if (event.data.row_data) {
/** @type {?} */
var primary_row_data = event.data.row_data;
/** @type {?} */
var headers_1 = event.data.headers;
/** @type {?} */
var rows_1 = [];
/** @type {?} */
var dynamic_columns_indexes_1 = event.data.dynamicColumnsIndexes;
/** @type {?} */
var virtual_columns_indexes_1 = event.data.virtualColumnsIndexes || [];
primary_row_data.forEach((/**
* @param {?} row_data
* @return {?}
*/
function (row_data) {
/** @type {?} */
var x = {};
/** @type {?} */
var dynamic_columns = {};
/** @type {?} */
var virtual_data = {};
row_data.data && row_data.data.forEach((/**
* @param {?} col
* @param {?} i
* @return {?}
*/
function (col, i) {
if (col == undefined) {
col = "";
}
;
if (dynamic_columns_indexes_1.includes(i)) {
dynamic_columns[headers_1[i]] = col;
}
else if (virtual_columns_indexes_1.includes(i)) {
virtual_data[headers_1[i]] = col;
}
else {
x[headers_1[i]] = col;
}
}));
if (row_data && row_data.unmapped_data) {
x["_unmapped_data"] = row_data.unmapped_data;
}
if (dynamic_columns && Object.keys(dynamic_columns).length > 0) {
x["_dynamic_data"] = dynamic_columns;
}
if (virtual_data && Object.keys(virtual_data).length > 0) {
x["_virtual_data"] = virtual_data;
}
rows_1.push(x);
}));
/** @type {?} */
var metadata = event.data.data;
metadata["rows"] = rows_1;
metadata["column_mappings"] = event.data.column_mapping;
metadata["raw_columns"] = event.data.raw_columns;
metadata["ignored_columns"] = event.data.ignored_column_row;
delete metadata["unique_token"];
if (_this.onImport)
_this.onImport(true, metadata);
if (_this.isImported)
_this.isImported(true, metadata);
if (_this.imported)
_this.imported(true, metadata);
}
else {
/** @type {?} */
var metadata = event.data.data;
delete metadata["unique_token"];
if (_this.onImport)
_this.onImport(true, metadata);
if (_this.isImported)
_this.isImported(true, metadata);
if (_this.imported)
_this.imported(true, metadata);
}
}
else {
/** @type {?} */
var metadata = event.data.data;
delete metadata["unique_token"];
if (_this.onImport)
_this.onImport(false, metadata);
if (_this.isImported)
_this.isImported(false, metadata);
if (_this.imported)
_this.imported(false, metadata);
}
}
else if (event.data.type && event.data.type == "csvbox-modal-hidden") {
if (_this.holder)
_this.holder.style.display = 'none';
_this.isModalShown = false;
if (_this.onClose)
_this.onClose();
if (_this.isClosed)
_this.isClosed();
if (_this.closed)
_this.closed();
}
else if (event.data.type && event.data.type == "csvbox-upload-successful") {
if (_this.onImport)
_this.onImport(true);
if (_this.isImported)
_this.isImported(true);
if (_this.imported)
_this.imported(true);
}
else if (event.data.type && event.data.type == "csvbox-upload-failed") {
if (_this.onImport)
_this.onImport(false);
if (_this.isImported)
_this.isImported(false);
if (_this.imported)
_this.imported(false);
}
}
}
}), false);
if (this.lazy) {
this.disabled = false;
}
else {
this.disabled = true;
this.initImporter();
}
};
/**
* @return {?}
*/
CSVBoxButtonComponent.prototype.initImporter = /**
* @return {?}
*/
function () {
if (this.loadStarted)
this.loadStarted();
insertCSS();
/** @type {?} */
var iframe = document.createElement("iframe");
this.iframe = iframe;
iframe.setAttribute("src", this.safeUrl);
iframe.frameBorder = "0";
/** @type {?} */
var self = this;
iframe.onload = (/**
* @return {?}
*/
function () {
if (self.onReady)
self.onReady();
if (self.isReady)
self.isReady();
if (self.importerReady)
self.importerReady();
self.disabled = false;
self.isIframeLoaded = true;
if (self.iframe && self.iframe.contentWindow) {
self.iframe.contentWindow.postMessage({
"customer": self.user ? self.user : null,
"columns": self.dynamicColumns ? self.dynamicColumns : null,
"options": self.options ? self.options : null,
"unique_token": self.uuid
}, "*");
}
if (self.openModalOnIframeLoad) {
self.openModal();
}
});
this.holder = document.createElement('div');
this.holder.classList.add('csvbox-holder');
this.holder.setAttribute('id', "csvbox-embed-" + this.uuid);
this.holder.appendChild(iframe);
document.body.insertAdjacentElement('beforeend', this.holder);
};
/**
* @return {?}
*/
CSVBoxButtonComponent.prototype.openModal = /**
* @return {?}
*/
function () {
if (this.lazy) {
if (!this.iframe) {
this.openModalOnIframeLoad = true;
this.initImporter();
return;
}
}
if (!this.isModalShown) {
if (this.isIframeLoaded) {
this.isModalShown = true;
if (this.holder)
this.holder.style.display = 'block';
if (this.iframe && this.iframe.contentWindow) {
this.iframe.contentWindow.postMessage('openModal', '*');
}
}
else {
this.openModalOnIframeLoad = true;
}
}
};
CSVBoxButtonComponent.decorators = [
{ type: Component, args: [{
selector: 'csvbox-button',
template: "\n <div>\n <button [disabled]=\"disabled\" #initiator (click)=\"openModal()\" [attr.data-csvbox-token]=\"uuid\">\n <ng-content></ng-content>\n </button>\n </div>\n "
}] }
];
/** @nocollapse */
CSVBoxButtonComponent.ctorParameters = function () { return [
{ type: DomSanitizer }
]; };
CSVBoxButtonComponent.propDecorators = {
initiator: [{ type: ViewChild, args: ['initiator', { static: false },] }],
onImport: [{ type: Input }],
onReady: [{ type: Input }],
onClose: [{ type: Input }],
onSubmit: [{ type: Input }],
isImported: [{ type: Input }],
isReady: [{ type: Input }],
isClosed: [{ type: Input }],
isSubmitted: [{ type: Input }],
importerReady: [{ type: Input }],
closed: [{ type: Input }],
submitted: [{ type: Input }],
imported: [{ type: Input }],
loadStarted: [{ type: Input }],
user: [{ type: Input }],
dynamicColumns: [{ type: Input }],
licenseKey: [{ type: Input }],
options: [{ type: Input }],
uuid: [{ type: Input }],
customDomain: [{ type: Input }],
dataLocation: [{ type: Input }],
language: [{ type: Input }],
environment: [{ type: Input }],
isIframeLoaded: [{ type: Input }],
openModalOnIframeLoad: [{ type: Input }],
lazy: [{ type: Input }],
disabled: [{ type: Input }]
};
return CSVBoxButtonComponent;
}());
export { CSVBoxButtonComponent };
if (false) {
/** @type {?} */
CSVBoxButtonComponent.prototype.isModalShown;
/** @type {?} */
CSVBoxButtonComponent.prototype.initiator;
/** @type {?} */
CSVBoxButtonComponent.prototype.onImport;
/** @type {?} */
CSVBoxButtonComponent.prototype.onReady;
/** @type {?} */
CSVBoxButtonComponent.prototype.onClose;
/** @type {?} */
CSVBoxButtonComponent.prototype.onSubmit;
/** @type {?} */
CSVBoxButtonComponent.prototype.isImported;
/** @type {?} */
CSVBoxButtonComponent.prototype.isReady;
/** @type {?} */
CSVBoxButtonComponent.prototype.isClosed;
/** @type {?} */
CSVBoxButtonComponent.prototype.isSubmitted;
/** @type {?} */
CSVBoxButtonComponent.prototype.importerReady;
/** @type {?} */
CSVBoxButtonComponent.prototype.closed;
/** @type {?} */
CSVBoxButtonComponent.prototype.submitted;
/** @type {?} */
CSVBoxButtonComponent.prototype.imported;
/** @type {?} */
CSVBoxButtonComponent.prototype.loadStarted;
/** @type {?} */
CSVBoxButtonComponent.prototype.user;
/** @type {?} */
CSVBoxButtonComponent.prototype.dynamicColumns;
/** @type {?} */
CSVBoxButtonComponent.prototype.licenseKey;
/** @type {?} */
CSVBoxButtonComponent.prototype.options;
/** @type {?} */
CSVBoxButtonComponent.prototype.uuid;
/** @type {?} */
CSVBoxButtonComponent.prototype.customDomain;
/** @type {?} */
CSVBoxButtonComponent.prototype.dataLocation;
/** @type {?} */
CSVBoxButtonComponent.prototype.language;
/** @type {?} */
CSVBoxButtonComponent.prototype.environment;
/** @type {?} */
CSVBoxButtonComponent.prototype.isIframeLoaded;
/** @type {?} */
CSVBoxButtonComponent.prototype.openModalOnIframeLoad;
/** @type {?} */
CSVBoxButtonComponent.prototype.lazy;
/** @type {?} */
CSVBoxButtonComponent.prototype.safeUrl;
/** @type {?} */
CSVBoxButtonComponent.prototype.iframe;
/** @type {?} */
CSVBoxButtonComponent.prototype.disabled;
/** @type {?} */
CSVBoxButtonComponent.prototype.holder;
/** @type {?} */
CSVBoxButtonComponent.prototype.sanitizer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY3N2Ym94L2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFDVCxLQUFLLEVBR0wsZUFBZSxFQUVoQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFXLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztJQUV6QyxVQUFVLEdBQUcsUUFBUTtBQUUzQjtJQXFERSwrQkFBbUIsU0FBc0I7UUFBdEIsY0FBUyxHQUFULFNBQVMsQ0FBYTtRQXhDekMsaUJBQVksR0FBRyxLQUFLLENBQUM7UUF1QlosU0FBSSxHQUFXLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFXLElBQUksQ0FBQztRQUM1QixpQkFBWSxHQUFXLElBQUksQ0FBQztRQUM1QixhQUFRLEdBQVcsSUFBSSxDQUFDO1FBR3hCLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUV2QyxTQUFJLEdBQVksS0FBSyxDQUFDO1FBSS9CLFdBQU0sR0FBRyxJQUFJLENBQUM7UUFFTCxhQUFRLEdBQVksSUFBSSxDQUFDO0lBRVUsQ0FBQzs7OztJQUk3Qyx3Q0FBUTs7O0lBQVI7UUFDRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7WUFDNUIsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGVBQWU7UUFDcEUsSUFBRyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQUUsTUFBTSxHQUFNLElBQUksQ0FBQyxZQUFZLFNBQUksTUFBUSxDQUFDO1NBQUU7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OytCQUNMLEtBQUs7MkJBQ0wsS0FBSzs4QkFDTCxLQUFLO2lDQUVMLEtBQUs7d0NBQ0wsS0FBSzt1QkFFTCxLQUFLOzJCQU1MLEtBQUs7O0lBZ05SLDRCQUFDO0NBQUEsQUFuUUQsSUFtUUM7U0F4UFkscUJBQXFCOzs7SUFFaEMsNkNBQXFCOztJQUVyQiwwQ0FBd0Q7O0lBQ3hELHlDQUE0Qjs7SUFDNUIsd0NBQTJCOztJQUMzQix3Q0FBMkI7O0lBQzNCLHlDQUE0Qjs7SUFFNUIsMkNBQThCOztJQUM5Qix3Q0FBMkI7O0lBQzNCLHlDQUE0Qjs7SUFDNUIsNENBQStCOztJQUUvQiw4Q0FBaUM7O0lBQ2pDLHVDQUEwQjs7SUFDMUIsMENBQTZCOztJQUM3Qix5Q0FBNEI7O0lBQzVCLDRDQUErQjs7SUFFL0IscUNBQXNCOztJQUN0QiwrQ0FBZ0M7O0lBQ2hDLDJDQUE0Qjs7SUFDNUIsd0NBQXlCOztJQUN6QixxQ0FBNkI7O0lBQzdCLDZDQUFxQzs7SUFDckMsNkNBQXFDOztJQUNyQyx5Q0FBaUM7O0lBQ2pDLDRDQUE2Qjs7SUFFN0IsK0NBQXlDOztJQUN6QyxzREFBZ0Q7O0lBRWhELHFDQUErQjs7SUFFL0Isd0NBQWE7O0lBRWIsdUNBQWM7O0lBRWQseUNBQWtDOztJQUlsQyx1Q0FBWTs7SUFGQSwwQ0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBPbkluaXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFNlY3VyaXR5Q29udGV4dCxcclxuICBBZnRlckNvbnRlbnRJbml0XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVVcmwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgaW5zZXJ0Q1NTIH0gZnJvbSAnLi4vdXRsaXMvaW5zZXJ0Q1NTJztcclxuXHJcbmNvbnN0IGFwcFZlcnNpb24gPSAnMS4xLjE2JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY3N2Ym94LWJ1dHRvbicsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxkaXY+XHJcbiAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgI2luaXRpYXRvciAoY2xpY2spPVwib3Blbk1vZGFsKClcIiBbYXR0ci5kYXRhLWNzdmJveC10b2tlbl09XCJ1dWlkXCI+XHJcbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIGBcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBDU1ZCb3hCdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCB7XHJcblxyXG4gIGlzTW9kYWxTaG93biA9IGZhbHNlO1xyXG5cclxuICBAVmlld0NoaWxkKCdpbml0aWF0b3InLCB7c3RhdGljOiBmYWxzZX0pIGluaXRpYXRvcjogYW55O1xyXG4gIEBJbnB1dCgpIG9uSW1wb3J0OiBGdW5jdGlvbjtcclxuICBASW5wdXQoKSBvblJlYWR5OiBGdW5jdGlvbjtcclxuICBASW5wdXQoKSBvbkNsb3NlOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKSBvblN1Ym1pdDogRnVuY3Rpb247XHJcblxyXG4gIEBJbnB1dCgpIGlzSW1wb3J0ZWQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpIGlzUmVhZHk6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpIGlzQ2xvc2VkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKSBpc1N1Ym1pdHRlZDogRnVuY3Rpb247XHJcblxyXG4gIEBJbnB1dCgpIGltcG9ydGVyUmVhZHk6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpIGNsb3NlZDogRnVuY3Rpb247XHJcbiAgQElucHV0KCkgc3VibWl0dGVkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKSBpbXBvcnRlZDogRnVuY3Rpb247XHJcbiAgQElucHV0KCkgbG9hZFN0YXJ0ZWQ6IEZ1bmN0aW9uO1xyXG5cclxuICBASW5wdXQoKSB1c2VyOiBPYmplY3Q7XHJcbiAgQElucHV0KCkgZHluYW1pY0NvbHVtbnM6IE9iamVjdDtcclxuICBASW5wdXQoKSBsaWNlbnNlS2V5OiBTdHJpbmc7XHJcbiAgQElucHV0KCkgb3B0aW9uczogT2JqZWN0O1xyXG4gIEBJbnB1dCgpIHV1aWQ6IFN0cmluZyA9IG51bGw7XHJcbiAgQElucHV0KCkgY3VzdG9tRG9tYWluOiBTdHJpbmcgPSBudWxsO1xyXG4gIEBJbnB1dCgpIGRhdGFMb2NhdGlvbjogU3RyaW5nID0gbnVsbDtcclxuICBASW5wdXQoKSBsYW5ndWFnZTogU3RyaW5nID0gbnVsbDtcclxuICBASW5wdXQoKSBlbnZpcm9ubWVudDogT2JqZWN0O1xyXG5cclxuICBASW5wdXQoKSBpc0lmcmFtZUxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIG9wZW5Nb2RhbE9uSWZyYW1lTG9hZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBsYXp5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHNhZmVVcmw6IGFueTtcclxuXHJcbiAgaWZyYW1lID0gbnVsbDtcclxuXHJcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc2FuaXRpemVyOkRvbVNhbml0aXplcikge31cclxuXHJcbiAgaG9sZGVyOiBhbnk7XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy51dWlkID0gdGhpcy5nZW5lcmF0ZVV1aWQoKTtcclxuICAgIGxldCBkb21haW4gPSB0aGlzLmN1c3RvbURvbWFpbiA/IHRoaXMuY3VzdG9tRG9tYWluIDogXCJhcHAuY3N2Ym94LmlvXCI7XHJcbiAgICBpZih0aGlzLmRhdGFMb2NhdGlvbikgeyBkb21haW4gPSBgJHt0aGlzLmRhdGFMb2NhdGlvbn0tJHtkb21haW59YDsgfVxyXG4gICAgbGV0IGlmcmFtZVVybCA9IGBodHRwczovLyR7ZG9tYWlufS9lbWJlZC8ke3RoaXMubGljZW5zZUtleX1gO1xyXG4gICAgaWZyYW1lVXJsICs9IGA/bGlicmFyeS12ZXJzaW9uPSR7IGFwcFZlcnNpb24gfWA7XHJcbiAgICBpZnJhbWVVcmwgKz0gXCImZnJhbWV3b3JrPWFuZ3VsYXJcIjtcclxuICAgIGlmKHRoaXMuZGF0YUxvY2F0aW9uKSB7XHJcbiAgICAgIGlmcmFtZVVybCArPSBcIiZwcmV2ZW50UmVkaXJlY3RcIjtcclxuICAgIH1cclxuICAgIGlmKHRoaXMubGFuZ3VhZ2Upe1xyXG4gICAgICBpZnJhbWVVcmwgKz0gXCImbGFuZ3VhZ2VcIiArIHRoaXMubGFuZ3VhZ2U7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLmVudmlyb25tZW50KSB7XHJcbiAgICAgIGxldCBlbnZpcm9ubWVudCA9IEpTT04uc3RyaW5naWZ5KHRoaXMuZW52aXJvbm1lbnQpLnJlcGxhY2UoL1snXCJdL2csIGZ1bmN0aW9uKG1hdGNoKSB7XHJcbiAgICAgICAgICByZXR1cm4gJ1xcXFwnICsgbWF0Y2g7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZnJhbWVVcmwgKz0gYCZlbnY9JHtlbnZpcm9ubWVudH1gO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zYWZlVXJsID0gdGhpcy5zYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LlJFU09VUkNFX1VSTCwgdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKGlmcmFtZVVybCkpO1xyXG4gIH1cclxuXHJcbiAgZ2VuZXJhdGVVdWlkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDE1KSArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxNSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZihjaGFuZ2VzW1widXNlclwiXSAmJiBjaGFuZ2VzWyd1c2VyJ10uY3VycmVudFZhbHVlICE9IGNoYW5nZXNbJ3VzZXInXS5wcmV2aW91c1ZhbHVlKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlVXNlclZhcmlhYmUoY2hhbmdlc1sndXNlciddLmN1cnJlbnRWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVVc2VyVmFyaWFiZShkYXRhKTogdm9pZCB7XHJcbiAgICB0aGlzLnVzZXIgPSBkYXRhO1xyXG4gICAgaWYgKHRoaXMuaWZyYW1lICYmIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcclxuICAgICAgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgXCJjdXN0b21lclwiIDogZGF0YVxyXG4gICAgICB9LCBcIipcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKGV2ZW50KSA9PiB7XHJcbiAgICAgIGlmKGV2ZW50ICYmIHR5cGVvZiBldmVudC5kYXRhID09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICBpZihldmVudC5kYXRhICYmIGV2ZW50LmRhdGEuZGF0YSAmJiBldmVudC5kYXRhLmRhdGEudW5pcXVlX3Rva2VuID09IHRoaXMudXVpZCkge1xyXG4gICAgICAgICAgaWYoZXZlbnQuZGF0YS50eXBlICYmIGV2ZW50LmRhdGEudHlwZSA9PSBcImRhdGEtb24tc3VibWl0XCIpIHtcclxuICAgICAgICAgICAgbGV0IG1ldGFkYXRhID0gZXZlbnQuZGF0YS5kYXRhO1xyXG4gICAgICAgICAgICBtZXRhZGF0YVtcImNvbHVtbl9tYXBwaW5nc1wiXSA9IGV2ZW50LmRhdGEuY29sdW1uX21hcHBpbmc7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YVtcInVuaXF1ZV90b2tlblwiXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub25TdWJtaXQpIHRoaXMub25TdWJtaXQobWV0YWRhdGEpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1N1Ym1pdHRlZCkgdGhpcy5pc1N1Ym1pdHRlZChtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnN1Ym1pdHRlZCkgdGhpcy5zdWJtaXR0ZWQobWV0YWRhdGEpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmKGV2ZW50LmRhdGEudHlwZSAmJiBldmVudC5kYXRhLnR5cGUgPT0gXCJkYXRhLXB1c2gtc3RhdHVzXCIpIHtcclxuICAgICAgICAgICAgaWYoZXZlbnQuZGF0YS5kYXRhLmltcG9ydF9zdGF0dXMgPT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmKGV2ZW50LmRhdGEucm93X2RhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJpbWFyeV9yb3dfZGF0YSA9IGV2ZW50LmRhdGEucm93X2RhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhlYWRlcnMgPSBldmVudC5kYXRhLmhlYWRlcnM7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvd3MgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZHluYW1pY19jb2x1bW5zX2luZGV4ZXMgPSBldmVudC5kYXRhLmR5bmFtaWNDb2x1bW5zSW5kZXhlcztcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmlydHVhbF9jb2x1bW5zX2luZGV4ZXMgPSBldmVudC5kYXRhLnZpcnR1YWxDb2x1bW5zSW5kZXhlcyB8fCBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcHJpbWFyeV9yb3dfZGF0YS5mb3JFYWNoKChyb3dfZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHggPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBkeW5hbWljX2NvbHVtbnMgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCB2aXJ0dWFsX2RhdGEgPSB7fTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICByb3dfZGF0YS5kYXRhICYmIHJvd19kYXRhLmRhdGEuZm9yRWFjaCgoY29sLCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29sID09IHVuZGVmaW5lZCl7IGNvbCA9IFwiXCJ9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkeW5hbWljX2NvbHVtbnNfaW5kZXhlcy5pbmNsdWRlcyhpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljX2NvbHVtbnNbaGVhZGVyc1tpXV0gPSBjb2w7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYodmlydHVhbF9jb2x1bW5zX2luZGV4ZXMuaW5jbHVkZXMoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWxfZGF0YVtoZWFkZXJzW2ldXSA9IGNvbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4W2hlYWRlcnNbaV1dID0gY29sO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYocm93X2RhdGEgJiYgcm93X2RhdGEudW5tYXBwZWRfZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB4W1wiX3VubWFwcGVkX2RhdGFcIl0gPSByb3dfZGF0YS51bm1hcHBlZF9kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYoZHluYW1pY19jb2x1bW5zICYmIE9iamVjdC5rZXlzKGR5bmFtaWNfY29sdW1ucykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB4W1wiX2R5bmFtaWNfZGF0YVwiXSA9IGR5bmFtaWNfY29sdW1ucztcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIGlmKHZpcnR1YWxfZGF0YSAmJiBPYmplY3Qua2V5cyh2aXJ0dWFsX2RhdGEpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeFtcIl92aXJ0dWFsX2RhdGFcIl0gPSB2aXJ0dWFsX2RhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICByb3dzLnB1c2goeCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1ldGFkYXRhID0gZXZlbnQuZGF0YS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhW1wicm93c1wiXSA9IHJvd3M7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFbXCJjb2x1bW5fbWFwcGluZ3NcIl0gPSBldmVudC5kYXRhLmNvbHVtbl9tYXBwaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhW1wicmF3X2NvbHVtbnNcIl0gPSBldmVudC5kYXRhLnJhd19jb2x1bW5zO1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhW1wiaWdub3JlZF9jb2x1bW5zXCJdID0gZXZlbnQuZGF0YS5pZ25vcmVkX2NvbHVtbl9yb3c7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1ldGFkYXRhW1widW5pcXVlX3Rva2VuXCJdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KHRydWUsIG1ldGFkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQodHJ1ZSwgbWV0YWRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKHRydWUsIG1ldGFkYXRhKTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXRhZGF0YSA9IGV2ZW50LmRhdGEuZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbWV0YWRhdGFbXCJ1bmlxdWVfdG9rZW5cIl07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSwgbWV0YWRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZCh0cnVlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQodHJ1ZSwgbWV0YWRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWV0YWRhdGEgPSBldmVudC5kYXRhLmRhdGE7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgbWV0YWRhdGFbXCJ1bmlxdWVfdG9rZW5cIl07XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydChmYWxzZSwgbWV0YWRhdGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKGZhbHNlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChmYWxzZSwgbWV0YWRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2UgaWYoZXZlbnQuZGF0YS50eXBlICYmIGV2ZW50LmRhdGEudHlwZSA9PSBcImNzdmJveC1tb2RhbC1oaWRkZW5cIikge1xyXG4gICAgICAgICAgICBpZih0aGlzLmhvbGRlcikgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgdGhpcy5pc01vZGFsU2hvd24gPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub25DbG9zZSkgdGhpcy5vbkNsb3NlKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ2xvc2VkKSB0aGlzLmlzQ2xvc2VkKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNsb3NlZCkgdGhpcy5jbG9zZWQoKTtcclxuICAgICAgICAgIH0gZWxzZSBpZihldmVudC5kYXRhLnR5cGUgJiYgZXZlbnQuZGF0YS50eXBlID09IFwiY3N2Ym94LXVwbG9hZC1zdWNjZXNzZnVsXCIpIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydCh0cnVlKTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQodHJ1ZSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYoZXZlbnQuZGF0YS50eXBlICYmIGV2ZW50LmRhdGEudHlwZSA9PSBcImNzdmJveC11cGxvYWQtZmFpbGVkXCIpIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LCBmYWxzZSk7XHJcblxyXG4gICAgaWYodGhpcy5sYXp5KSB7XHJcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdEltcG9ydGVyKCkge1xyXG4gICAgaWYgKHRoaXMubG9hZFN0YXJ0ZWQpIHRoaXMubG9hZFN0YXJ0ZWQoKTtcclxuXHJcbiAgICBpbnNlcnRDU1MoKTtcclxuXHJcbiAgICBsZXQgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcclxuICAgIHRoaXMuaWZyYW1lID0gaWZyYW1lO1xyXG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZShcInNyY1wiLCB0aGlzLnNhZmVVcmwpO1xyXG4gICAgaWZyYW1lLmZyYW1lQm9yZGVyID0gXCIwXCI7XHJcblxyXG4gICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgaWZyYW1lLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgaWYgKHNlbGYub25SZWFkeSkgc2VsZi5vblJlYWR5KCk7XHJcbiAgICAgIGlmIChzZWxmLmlzUmVhZHkpIHNlbGYuaXNSZWFkeSgpO1xyXG4gICAgICBpZiAoc2VsZi5pbXBvcnRlclJlYWR5KSBzZWxmLmltcG9ydGVyUmVhZHkoKTtcclxuXHJcbiAgICAgIHNlbGYuZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgc2VsZi5pc0lmcmFtZUxvYWRlZCA9IHRydWU7XHJcbiAgICAgIGlmIChzZWxmLmlmcmFtZSAmJiBzZWxmLmlmcmFtZS5jb250ZW50V2luZG93KSB7XHJcbiAgICAgICAgc2VsZi5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICBcImN1c3RvbWVyXCIgOiBzZWxmLnVzZXIgPyBzZWxmLnVzZXIgOiBudWxsLFxyXG4gICAgICAgICAgXCJjb2x1bW5zXCIgOiBzZWxmLmR5bmFtaWNDb2x1bW5zID8gc2VsZi5keW5hbWljQ29sdW1ucyA6IG51bGwsXHJcbiAgICAgICAgICBcIm9wdGlvbnNcIiA6IHNlbGYub3B0aW9ucyA/IHNlbGYub3B0aW9ucyA6IG51bGwsXHJcbiAgICAgICAgICBcInVuaXF1ZV90b2tlblwiOiBzZWxmLnV1aWRcclxuICAgICAgICB9LCBcIipcIik7XHJcbiAgICAgIH1cclxuICAgICAgaWYoc2VsZi5vcGVuTW9kYWxPbklmcmFtZUxvYWQpIHtcclxuICAgICAgICBzZWxmLm9wZW5Nb2RhbCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMuaG9sZGVyLmNsYXNzTGlzdC5hZGQoJ2NzdmJveC1ob2xkZXInKTtcclxuICAgIHRoaXMuaG9sZGVyLnNldEF0dHJpYnV0ZSgnaWQnLCBgY3N2Ym94LWVtYmVkLSR7dGhpcy51dWlkfWApO1xyXG4gICAgdGhpcy5ob2xkZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuXHJcbiAgICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudChcclxuICAgICAgJ2JlZm9yZWVuZCcsIHRoaXMuaG9sZGVyXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgb3Blbk1vZGFsKCk6IHZvaWQge1xyXG4gICAgaWYodGhpcy5sYXp5KSB7XHJcbiAgICAgIGlmKCF0aGlzLmlmcmFtZSkge1xyXG4gICAgICAgICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5pbml0SW1wb3J0ZXIoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYoIXRoaXMuaXNNb2RhbFNob3duKSB7XHJcbiAgICAgIGlmKHRoaXMuaXNJZnJhbWVMb2FkZWQpIHtcclxuICAgICAgICAgIHRoaXMuaXNNb2RhbFNob3duID0gdHJ1ZTtcclxuICAgICAgICAgIGlmKHRoaXMuaG9sZGVyKSB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgIGlmKHRoaXMuaWZyYW1lICYmIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcclxuICAgICAgICAgICAgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgnb3Blbk1vZGFsJywgJyonKTtcclxuICAgICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuIl19