Repository URL to install this package:
|
Version:
0.3.1 ▾
|
motif-web-admin-core
/
esm5
/
lib
/
sections
/
RESTManager
/
components
/
rest-manager-section-component.js
|
|---|
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ViewChild, Input } from '@angular/core';
import { PluginView } from 'web-console-core';
import { NGXLogger } from 'web-console-core';
import { RESTCatalogComponent, GridCommandType } from './rest-catalog-component/rest-catalog-component';
import { RESTCatalogEditorComponent } from './rest-catalog-editor/rest-catalog-editor-component';
import { RESTContextDialogComponent, DialogMode } from './dialogs/new-context-dialog/rest-context-dialog-component';
import { WCSubscriptionHandler } from '../../../components/Commons/wc-subscription-handler';
import { WCNotificationCenter, NotificationType } from 'web-console-ui-kit';
import { RESTContextCatalogService } from '../../../services/RESTContextCatalogService';
/** @type {?} */
var LOG_TAG = '[RESTManagerSectionComponent]';
var RESTManagerSectionComponent = /** @class */ (function () {
function RESTManagerSectionComponent(logger, restCatalogService, notificationCenter) {
this.logger = logger;
this.restCatalogService = restCatalogService;
this.notificationCenter = notificationCenter;
// combo box selection
this._subHandler = new WCSubscriptionHandler();
this.statsModel = { items: [] };
this.logger.debug(LOG_TAG, 'Opening...');
}
/**
* Angular ngOnInit
*/
/**
* Angular ngOnInit
* @return {?}
*/
RESTManagerSectionComponent.prototype.ngOnInit = /**
* Angular ngOnInit
* @return {?}
*/
function () {
this.logger.debug(LOG_TAG, 'Initializing...');
};
/**
* @return {?}
*/
RESTManagerSectionComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.logger.debug(LOG_TAG, 'ngOnDestroy ');
this.freeMem();
};
/**
* @return {?}
*/
RESTManagerSectionComponent.prototype.freeMem = /**
* @return {?}
*/
function () {
this.selectedDomain = null;
this._selectedApplication = null;
};
/**
* @return {?}
*/
RESTManagerSectionComponent.prototype.onRefreshClicked = /**
* @return {?}
*/
function () {
this.refreshCatalog();
};
/**
* @private
* @return {?}
*/
RESTManagerSectionComponent.prototype.clearStatsInfo = /**
* @private
* @return {?}
*/
function () {
this.statsModel = { items: [] };
};
/**
* @private
* @return {?}
*/
RESTManagerSectionComponent.prototype.refreshCatalog = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var domain = (this.selectedDomain ? this.selectedDomain.name : null);
/** @type {?} */
var application = (this._selectedApplication ? this._selectedApplication.name : null);
this.restCatalogSelector.reloadData(domain, application);
};
/**
* @param {?} event
* @return {?}
*/
RESTManagerSectionComponent.prototype.onDomainSelectionClear = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.selectedDomain = null;
//this.selectedApplication = null;
};
/**
* @param {?} event
* @return {?}
*/
RESTManagerSectionComponent.prototype.onApplicationSelectionClear = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.selectedApplication = null;
};
Object.defineProperty(RESTManagerSectionComponent.prototype, "selectedApplication", {
get: /**
* @return {?}
*/
function () {
return this._selectedApplication;
},
/**
* Set the selcted application
*/
set: /**
* Set the selcted application
* @param {?} application
* @return {?}
*/
function (application) {
this._selectedApplication = application;
this.refreshCatalog();
},
enumerable: true,
configurable: true
});
/**
* @private
* @return {?}
*/
RESTManagerSectionComponent.prototype.rebuildStatsInfo = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var totalContexts = this.restCatalogSelector.tableModel.getContextsCount();
/** @type {?} */
var enabledContexts = this.restCatalogSelector.tableModel.getEnabledContextsCount();
/** @type {?} */
var disabledContexts = this.restCatalogSelector.tableModel.getDisabledContextsCount();
this.statsModel = {
items: [
{ label: "active", value: "" + totalContexts, cssClass: "stats-info-primary" },
{ label: "enabled", value: "" + enabledContexts, cssClass: "stats-info-ok" },
{ label: "disabled", value: "" + disabledContexts, cssClass: "stats-info-ko" }
]
};
};
/**
* @param {?} event
* @return {?}
*/
RESTManagerSectionComponent.prototype.onCatalogDataReload = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.restCatalogEditor.clear();
this.rebuildStatsInfo();
};
/**
* @param {?} event
* @return {?}
*/
RESTManagerSectionComponent.prototype.onCatalogDataReloadError = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.logger.error(LOG_TAG, 'onCatalogDataReloadError error:', event);
this.clearStatsInfo();
this.notificationCenter.post({
name: 'LoadRESTContextError',
title: 'REST Context Load',
message: 'Error loading REST contexts:',
type: NotificationType.Error,
error: event.error,
closable: true
});
};
/**
* @param {?} event
* @return {?}
*/
RESTManagerSectionComponent.prototype.onChangesSaved = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.logger.debug(LOG_TAG, 'onChangesSaved: ', event);
//TODO!!
};
/**
* @param {?} event
* @return {?}
*/
RESTManagerSectionComponent.prototype.onFilterChange = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.logger.debug(LOG_TAG, 'onFilterChange called');
this.restCatalogSelector.setFilter(event.srcElement['value']);
};
/**
* @param {?} nodeEvent
* @return {?}
*/
RESTManagerSectionComponent.prototype.nodeSelect = /**
* @param {?} nodeEvent
* @return {?}
*/
function (nodeEvent) {
this.logger.debug(LOG_TAG, 'nodeSelect ', nodeEvent);
this.restCatalogEditor.startEdit(nodeEvent.node);
/*
this.updateCommands(nodeType);
*/
};
/**
* @return {?}
*/
RESTManagerSectionComponent.prototype.onAddRESTContextPressed = /**
* @return {?}
*/
function () {
if (this.canAddNewContext) {
this.contextEditDialog.showForNew(this.selectedDomain.name, this.selectedApplication.name);
}
};
Object.defineProperty(RESTManagerSectionComponent.prototype, "canAddNewContext", {
get: /**
* @return {?}
*/
function () {
return (this.selectedDomain != null && this.selectedApplication != null);
},
enumerable: true,
configurable: true
});
/**
* @param {?} event
* @return {?}
*/
RESTManagerSectionComponent.prototype.doCreateRESTContext = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
this._subHandler.add(this.restCatalogService.createRESTContext(event.domain, event.application, event.name, event.url).subscribe((/**
* @param {?} results
* @return {?}
*/
function (results) {
_this.logger.info(LOG_TAG, 'REST context created:', results);
_this.notificationCenter.post({
name: 'CreateRESTContext',
title: 'REST Context Create',
message: 'REST Context created successfully.',
type: NotificationType.Success
});
_this.refreshCatalog();
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.error(LOG_TAG, 'Creating REST Context error:', error);
_this.notificationCenter.post({
name: 'CreateRESTContextError',
title: 'REST Context Create',
message: 'Error creating REST context:',
type: NotificationType.Error,
error: error,
closable: true
});
})));
};
/**
* @param {?} event
* @return {?}
*/
RESTManagerSectionComponent.prototype.doUpdateRESTContext = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
this._subHandler.add(this.restCatalogService.updateRESTContext(event.domain, event.application, event.name, event.url).subscribe((/**
* @param {?} results
* @return {?}
*/
function (results) {
_this.logger.info(LOG_TAG, 'REST context updated:', results);
_this.notificationCenter.post({
name: 'UpdateRESTContext',
title: 'REST Context Update',
message: 'REST Context updated successfully.',
type: NotificationType.Success
});
_this.refreshCatalog();
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.error(LOG_TAG, 'Update REST Context error:', error);
_this.notificationCenter.post({
name: 'UpdateRESTContextError',
title: 'REST Context Update',
message: 'Error updating REST context:',
type: NotificationType.Error,
error: error,
closable: true
});
})));
};
/**
* @param {?} domain
* @param {?} application
* @param {?} contextName
* @param {?} url
* @param {?} enabled
* @return {?}
*/
RESTManagerSectionComponent.prototype.doToggleContextStatus = /**
* @param {?} domain
* @param {?} application
* @param {?} contextName
* @param {?} url
* @param {?} enabled
* @return {?}
*/
function (domain, application, contextName, url, enabled) {
var _this = this;
this.logger.debug(LOG_TAG, 'doToggleContextStatus : ', domain, application, contextName, url, enabled);
this._subHandler.add(this.restCatalogService.enableRESTContext(domain, application, contextName, enabled).subscribe((/**
* @param {?} result
* @return {?}
*/
function (result) {
_this.logger.info(LOG_TAG, 'REST context status change:', result);
_this.notificationCenter.post({
name: 'ChangeStatusRESTContext',
title: 'Change REST Context Status',
message: 'REST Context status changed successfully.',
type: NotificationType.Success
});
_this.refreshCatalog();
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.error(LOG_TAG, 'Changin REST Context status error:', error);
_this.notificationCenter.post({
name: 'ChangeStatusRESTContextError',
title: 'Change REST Context Status',
message: 'Error changing REST context status: ',
type: NotificationType.Error,
error: error,
closable: true
});
})));
};
/**
* @param {?} domain
* @param {?} application
* @param {?} contextName
* @return {?}
*/
RESTManagerSectionComponent.prototype.doDeleteContext = /**
* @param {?} domain
* @param {?} application
* @param {?} contextName
* @return {?}
*/
function (domain, application, contextName) {
var _this = this;
this.logger.debug(LOG_TAG, 'deleteContext : ', domain, application, contextName);
this._subHandler.add(this.restCatalogService.deleteRESTContext(domain, application, contextName).subscribe((/**
* @param {?} result
* @return {?}
*/
function (result) {
_this.logger.info(LOG_TAG, 'REST context deleted:', result);
_this.notificationCenter.post({
name: 'DeleteRESTContext',
title: 'Delete REST Context',
message: 'REST Context deleted successfully.',
type: NotificationType.Success
});
_this.refreshCatalog();
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.error(LOG_TAG, 'Deleting REST Context error:', error);
_this.notificationCenter.post({
name: 'DeleteRESTContextError',
title: 'Delete REST Context',
message: 'Error deleting REST context:',
type: NotificationType.Error,
error: error,
closable: true
});
})));
};
/**
* @param {?} event
* @return {?}
*/
RESTManagerSectionComponent.prototype.onDialogConfirmation = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.dialogMode === DialogMode.New) {
this.doCreateRESTContext(event);
}
else if (event.dialogMode === DialogMode.Edit) {
this.doUpdateRESTContext(event);
}
};
/**
* @param {?} command
* @return {?}
*/
RESTManagerSectionComponent.prototype.onNodeCommand = /**
* @param {?} command
* @return {?}
*/
function (command) {
this.logger.error(LOG_TAG, 'onNodeCommand:', command);
if (command.command === GridCommandType.Delete) {
this.doDeleteContext(command.node.domain, command.node.application, command.node.name);
}
else if (command.command === GridCommandType.Edit) {
this.contextEditDialog.showForEdit(command.node.domain, command.node.application, command.node.name, command.node.url, command.node["enabled"]);
}
else if (command.command === GridCommandType.PublishToggle) {
this.doToggleContextStatus(command.node.domain, command.node.application, command.node.name, command.node.url, !command.node["enabled"]);
}
};
RESTManagerSectionComponent.decorators = [
{ type: Component, args: [{
selector: 'wa-rest-manager-section',
template: "<wc-dashboard-header [title]=\"'REST Channel Manager'\"></wc-dashboard-header>\n<wc-stats-info-component [model]=\"statsModel\"></wc-stats-info-component>\n\n<wa-rest-context-dialog #contextEditDialog (confirm)=\"onDialogConfirmation($event)\"></wa-rest-context-dialog>\n\n\n<div class=\"row spread\" #target>\n <div class=\"flex-toolbar\" style=\"display:flex;align-items: center;\">\n\n <div style=\"margin-right:10px;width:60%;max-width: 400px;min-width: 250px;\">\n <label>Domain</label>\n <wc-domain-selector-combobox #domainSelector [(ngModel)]=\"selectedDomain\" (selectionCancelled)=\"onDomainSelectionClear($event)\"></wc-domain-selector-combobox>\n </div>\n\n <div style=\"margin-left: 40px;margin-right:10px;width:60%;max-width: 400px;min-width: 250px;\">\n <label>Application</label>\n <wc-application-selector-combobox #applicationSelector [domain]=\"(selectedDomain ? selectedDomain.name : null)\" [(ngModel)]=\"selectedApplication\" (selectionCancelled)=\"onApplicationSelectionClear($event)\"></wc-application-selector-combobox>\n </div>\n\n <kendo-textbox-container floatingLabel=\"Filter\">\n <input\n #filterInput\n kendoTextBox\n (afterValueChanged)=\"onFilterChange($event)\"\n />\n </kendo-textbox-container>\n\n\n <div>\n <label> </label>\n <kendo-buttongroup look=\"flat\">\n <button\n motif-acl=\"com.vipera.osgi.foundation.restcontent.api.rest.RestContentApi:CREATE:createContext\" \n kendoButton\n [toggleable]=\"false\"\n [icon]=\"'globe-outline'\"\n (click)=\"onAddRESTContextPressed()\"\n [disabled]=\"!canAddNewContext\"\n >\n Create New Context\n </button>\n </kendo-buttongroup>\n </div>\n\n </div>\n\n <div class=\"flex-cmd\">\n <kendo-buttongroup look=\"flat\">\n <button\n kendoButton\n [toggleable]=\"false\"\n [icon]=\"'refresh'\"\n (click)=\"onRefreshClicked()\"\n >\n Refresh\n </button>\n </kendo-buttongroup>\n </div>\n\n</div>\n\n<div class=\"row fill\">\n <kendo-splitter>\n <kendo-splitter-pane style=\"overflow: hidden;\">\n <div style=\"height: 100%;\">\n <wa-rest-catalog-component (nodeCommand)=\"onNodeCommand($event)\"\n (nodeSelection)=\"nodeSelect($event)\"\n (dataReload)=\"onCatalogDataReload($event)\"\n (dataReloadError)=\"onCatalogDataReloadError($event)\"\n #restCatalogSelector\n ></wa-rest-catalog-component>\n </div>\n </kendo-splitter-pane>\n\n <kendo-splitter-pane [collapsible]=\"true\" size=\"30%\">\n <wa-rest-catalog-editor-component\n #restCatalogEditor\n (changesSaved)=\"onChangesSaved($event)\"\n ></wa-rest-catalog-editor-component>\n </kendo-splitter-pane>\n </kendo-splitter>\n</div>\n",
styles: [":host{display:flex;flex:1;flex-direction:column}"]
}] }
];
/** @nocollapse */
RESTManagerSectionComponent.ctorParameters = function () { return [
{ type: NGXLogger },
{ type: RESTContextCatalogService },
{ type: WCNotificationCenter }
]; };
RESTManagerSectionComponent.propDecorators = {
restCatalogSelector: [{ type: ViewChild, args: ['restCatalogSelector',] }],
restCatalogEditor: [{ type: ViewChild, args: ['restCatalogEditor',] }],
contextEditDialog: [{ type: ViewChild, args: ['contextEditDialog',] }],
selectedDomain: [{ type: Input }],
selectedApplication: [{ type: Input }]
};
RESTManagerSectionComponent = tslib_1.__decorate([
PluginView('REST Channel', {
iconName: 'wa-ico-services',
userData: {
acl: {
permissions: ["com.vipera.osgi.core.platform.api.rest.PlatformApi:READ:getDomains",
"com.vipera.osgi.core.platform.api.rest.PlatformApi:READ:getApplications",
"com.vipera.osgi.foundation.restcontent.api.rest.RestContentApi:READ:getContexts",
"com.vipera.osgi.foundation.restcontent.api.rest.RestContentApi:READ:getSupportedAttributes",
"com.vipera.osgi.foundation.restcontent.api.rest.RestContentApi:READ:getContext"]
}
}
}),
tslib_1.__metadata("design:paramtypes", [NGXLogger,
RESTContextCatalogService,
WCNotificationCenter])
], RESTManagerSectionComponent);
return RESTManagerSectionComponent;
}());
export { RESTManagerSectionComponent };
if (false) {
/** @type {?} */
RESTManagerSectionComponent.prototype.restCatalogSelector;
/** @type {?} */
RESTManagerSectionComponent.prototype.restCatalogEditor;
/** @type {?} */
RESTManagerSectionComponent.prototype.contextEditDialog;
/** @type {?} */
RESTManagerSectionComponent.prototype.selectedDomain;
/** @type {?} */
RESTManagerSectionComponent.prototype._selectedApplication;
/**
* @type {?}
* @private
*/
RESTManagerSectionComponent.prototype._subHandler;
/** @type {?} */
RESTManagerSectionComponent.prototype.statsModel;
/**
* @type {?}
* @private
*/
RESTManagerSectionComponent.prototype.logger;
/**
* @type {?}
* @private
*/
RESTManagerSectionComponent.prototype.restCatalogService;
/**
* @type {?}
* @private
*/
RESTManagerSectionComponent.prototype.notificationCenter;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC1tYW5hZ2VyLXNlY3Rpb24tY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbW90aWYtd2ViLWFkbWluLWNvcmUvIiwic291cmNlcyI6WyJsaWIvc2VjdGlvbnMvUkVTVE1hbmFnZXIvY29tcG9uZW50cy9yZXN0LW1hbmFnZXItc2VjdGlvbi1jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBMkMsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxFQUFFLG9CQUFvQixFQUFpQyxlQUFlLEVBQTBELE1BQU0saURBQWlELENBQUM7QUFDL0wsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDakcsT0FBTyxFQUFFLDBCQUEwQixFQUEyQixVQUFVLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUM3SSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU1RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQzs7SUFFbEYsT0FBTyxHQUFHLCtCQUErQjs7SUFnQzNDLHFDQUFvQixNQUFpQixFQUN6QixrQkFBNkMsRUFDN0Msa0JBQXdDO1FBRmhDLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDekIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUEyQjtRQUM3Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXNCOztRQU41QyxnQkFBVyxHQUF5QixJQUFJLHFCQUFxQixFQUFFLENBQUM7UUFFeEUsZUFBVSxHQUFxQixFQUFFLEtBQUssRUFBRSxFQUFF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Q0FBQSxJQUFBO1NBblJZLDJCQUEyQjs7O0lBRXBDLDBEQUE0RTs7SUFDNUUsd0RBQThFOztJQUM5RSx3REFBOEU7O0lBRTlFLHFEQUF1Qzs7SUFDdkMsMkRBQXlDOzs7OztJQUV6QyxrREFBd0U7O0lBRXhFLGlEQUE2Qzs7Ozs7SUFFakMsNkNBQXlCOzs7OztJQUNqQyx5REFBcUQ7Ozs7O0lBQ3JELHlEQUFnRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERvbWFpbiwgQXBwbGljYXRpb24gfSBmcm9tICdAd2EtbW90aWYtb3Blbi1hcGkvcGxhdGZvcm0tc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBDaGFuZ2VEZXRlY3RvclJlZiwgUmVuZGVyZXIyLCBPbkRlc3Ryb3ksIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQbHVnaW5WaWV3IH0gZnJvbSAnd2ViLWNvbnNvbGUtY29yZSc7XG5pbXBvcnQgeyBOR1hMb2dnZXIgfSBmcm9tICd3ZWItY29uc29sZS1jb3JlJztcbmltcG9ydCB7IFJFU1RDYXRhbG9nQ29tcG9uZW50LCBSRVNUQ2F0YWxvZ05vZGVTZWxlY3Rpb25FdmVudCwgR3JpZENvbW1hbmRUeXBlLCBSRVNUQ2F0YWxvZ05vZGVDb21tYW5kRXZlbnQsIFJFU1RDYXRhbG9nRGF0YUVycm9yRXZlbnQgfSBmcm9tICcuL3Jlc3QtY2F0YWxvZy1jb21wb25lbnQvcmVzdC1jYXRhbG9nLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBSRVNUQ2F0YWxvZ0VkaXRvckNvbXBvbmVudCB9IGZyb20gJy4vcmVzdC1jYXRhbG9nLWVkaXRvci9yZXN0LWNhdGFsb2ctZWRpdG9yLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBSRVNUQ29udGV4dERpYWxvZ0NvbXBvbmVudCwgUkVTVENvbnRleHREaWFsb2dSZXN1bHQsIERpYWxvZ01vZGUgfSBmcm9tICcuL2RpYWxvZ3MvbmV3LWNvbnRleHQtZGlhbG9nL3Jlc3QtY29udGV4dC1kaWFsb2ctY29tcG9uZW50JztcbmltcG9ydCB7IFdDU3Vic2NyaXB0aW9uSGFuZGxlciB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvQ29tbW9ucy93Yy1zdWJzY3JpcHRpb24taGFuZGxlcic7XG5pbXBvcnQgeyBXQ05vdGlmaWNhdGlvbkNlbnRlciwgTm90aWZpY2F0aW9uVHlwZSB9IGZyb20gJ3dlYi1jb25zb2xlLXVpLWtpdCc7XG5pbXBvcnQgeyBXQ1N0YXRzSW5mb01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9TdGF0cy9zdGF0cy1pbmZvLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBSRVNUQ29udGV4dENhdGFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvUkVTVENvbnRleHRDYXRhbG9nU2VydmljZSc7XG5cbmNvbnN0IExPR19UQUcgPSAnW1JFU1RNYW5hZ2VyU2VjdGlvbkNvbXBvbmVudF0nO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3dhLXJlc3QtbWFuYWdlci1zZWN0aW9uJyxcbiAgICBzdHlsZVVybHM6IFsnLi9yZXN0LW1hbmFnZXItc2VjdGlvbi1jb21wb25lbnQuc2NzcyddLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9yZXN0LW1hbmFnZXItc2VjdGlvbi1jb21wb25lbnQuaHRtbCdcbn0pXG5AUGx1Z2luVmlldygnUkVTVCBDaGFubmVsJywge1xuICAgIGljb25OYW1lOiAnd2EtaWNvLXNlcnZpY2VzJyxcbiAgICB1c2VyRGF0YToge1xuICAgICAgICBhY2w6IHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiBbXCJjb20udmlwZXJhLm9zZ2kuY29yZS5wbGF0Zm9ybS5hcGkucmVzdC5QbGF0Zm9ybUFwaTpSRUFEOmdldERvbWFpbnNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbS52aXBlcmEub3NnaS5jb3JlLnBsYXRmb3JtLmFwaS5yZXN0LlBsYXRmb3JtQXBpOlJFQUQ6Z2V0QXBwbGljYXRpb25zXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb20udmlwZXJhLm9zZ2kuZm91bmRhdGlvbi5yZXN0Y29udGVudC5hcGkucmVzdC5SZXN0Q29udGVudEFwaTpSRUFEOmdldENvbnRleHRzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb20udmlwZXJhLm9zZ2kuZm91bmRhdGlvbi5yZXN0Y29udGVudC5hcGkucmVzdC5SZXN0Q29udGVudEFwaTpSRUFEOmdldFN1cHBvcnRlZEF0dHJpYnV0ZXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbS52aXBlcmEub3NnaS5mb3VuZGF0aW9uLnJlc3Rjb250ZW50LmFwaS5yZXN0LlJlc3RDb250ZW50QXBpOlJFQUQ6Z2V0Q29udGV4dFwiXVxuICAgICAgICB9XG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBSRVNUTWFuYWdlclNlY3Rpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgICBAVmlld0NoaWxkKCdyZXN0Q2F0YWxvZ1NlbGVjdG9yJykgcmVzdENhdGFsb2dTZWxlY3RvcjogUkVTVENhdGFsb2dDb21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZCgncmVzdENhdGFsb2dFZGl0b3InKSByZXN0Q2F0YWxvZ0VkaXRvcjogUkVTVENhdGFsb2dFZGl0b3JDb21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZCgnY29udGV4dEVkaXREaWFsb2cnKSBjb250ZXh0RWRpdERpYWxvZzogUkVTVENvbnRleHREaWFsb2dDb21wb25lbnQ7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0ZWREb21haW46IERvbWFpbjtcbiAgICBwdWJsaWMgX3NlbGVjdGVkQXBwbGljYXRpb246IEFwcGxpY2F0aW9uOyAvLyBjb21ibyBib3ggc2VsZWN0aW9uXG5cbiAgICBwcml2YXRlIF9zdWJIYW5kbGVyOiBXQ1N1YnNjcmlwdGlvbkhhbmRsZXI9IG5ldyBXQ1N1YnNjcmlwdGlvbkhhbmRsZXIoKTtcblxuICAgIHN0YXRzTW9kZWw6IFdDU3RhdHNJbmZvTW9kZWwgPSB7IGl0ZW1zOiBbXSB9O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBsb2dnZXI6IE5HWExvZ2dlcixcbiAgICAgICAgcHJpdmF0ZSByZXN0Q2F0YWxvZ1NlcnZpY2U6IFJFU1RDb250ZXh0Q2F0YWxvZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbm90aWZpY2F0aW9uQ2VudGVyOiBXQ05vdGlmaWNhdGlvbkNlbnRlclxuICAgICAgICApIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ09wZW5pbmcuLi4nKTtcblxuICAgIH0gXG5cbiAgICAvKipcbiAgICAgKiBBbmd1bGFyIG5nT25Jbml0XG4gICAgICovXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdJbml0aWFsaXppbmcuLi4nKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICduZ09uRGVzdHJveSAnKTtcbiAgICAgICAgdGhpcy5mcmVlTWVtKCk7XG4gICAgfVxuXG4gICAgZnJlZU1lbSgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZERvbWFpbiA9IG51bGw7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkQXBwbGljYXRpb24gPSBudWxsO1xuICAgIH1cblxuICAgIG9uUmVmcmVzaENsaWNrZWQoKXtcbiAgICAgICAgdGhpcy5yZWZyZXNoQ2F0YWxvZygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXJTdGF0c0luZm8oKXtcbiAgICAgICAgdGhpcy5zdGF0c01vZGVsID0geyBpdGVtczogW10gfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZnJlc2hDYXRhbG9nKCl7XG4gICAgICAgIGxldCBkb21haW4gPSAodGhpcy5zZWxlY3RlZERvbWFpbj90aGlzLnNlbGVjdGVkRG9tYWluLm5hbWU6bnVsbCk7XG4gICAgICAgIGxldCBhcHBsaWNhdGlvbiA9ICh0aGlzLl9zZWxlY3RlZEFwcGxpY2F0aW9uP3RoaXMuX3NlbGVjdGVkQXBwbGljYXRpb24ubmFtZTpudWxsKTtcbiAgICAgICAgdGhpcy5yZXN0Q2F0YWxvZ1NlbGVjdG9yLnJlbG9hZERhdGEoZG9tYWluLCBhcHBsaWNhdGlvbik7XG4gICAgfVxuICAgIFxuICAgIG9uRG9tYWluU2VsZWN0aW9uQ2xlYXIoZXZlbnQpe1xuICAgICAgICB0aGlzLnNlbGVjdGVkRG9tYWluID0gbnVsbDtcbiAgICAgICAgLy90aGlzLnNlbGVjdGVkQXBwbGljYXRpb24gPSBudWxsO1xuICAgIH1cblxuICAgIG9uQXBwbGljYXRpb25TZWxlY3Rpb25DbGVhcihldmVudCl7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBcHBsaWNhdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAvKipcbiAgICAqIFNldCB0aGUgc2VsY3RlZCBhcHBsaWNhdGlvblxuICAgICovXG4gICBASW5wdXQoKVxuICAgcHVibGljIHNldCBzZWxlY3RlZEFwcGxpY2F0aW9uKGFwcGxpY2F0aW9uOiBBcHBsaWNhdGlvbikge1xuICAgICAgIHRoaXMuX3NlbGVjdGVkQXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjtcbiAgICAgICB0aGlzLnJlZnJlc2hDYXRhbG9nKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZWxlY3RlZEFwcGxpY2F0aW9uKCk6QXBwbGljYXRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRBcHBsaWNhdGlvbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYnVpbGRTdGF0c0luZm8oKXtcbiAgICAgICAgY29uc3QgdG90YWxDb250ZXh0cyA9IHRoaXMucmVzdENhdGFsb2dTZWxlY3Rvci50YWJsZU1vZGVsLmdldENvbnRleHRzQ291bnQoKTtcbiAgICAgICAgY29uc3QgZW5hYmxlZENvbnRleHRzID0gdGhpcy5yZXN0Q2F0YWxvZ1NlbGVjdG9yLnRhYmxlTW9kZWwuZ2V0RW5hYmxlZENvbnRleHRzQ291bnQoKTtcbiAgICAgICAgY29uc3QgZGlzYWJsZWRDb250ZXh0cyA9IHRoaXMucmVzdENhdGFsb2dTZWxlY3Rvci50YWJsZU1vZGVsLmdldERpc2FibGVkQ29udGV4dHNDb3VudCgpO1xuICAgICAgICB0aGlzLnN0YXRzTW9kZWwgPSB7IFxuICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiBcImFjdGl2ZVwiLCB2YWx1ZTogXCJcIit0b3RhbENvbnRleHRzLCBjc3NDbGFzczpcInN0YXRzLWluZm8tcHJpbWFyeVwiIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogXCJlbmFibGVkXCIsIHZhbHVlOiBcIlwiK2VuYWJsZWRDb250ZXh0cywgY3NzQ2xhc3M6XCJzdGF0cy1pbmZvLW9rXCIgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiBcImRpc2FibGVkXCIsIHZhbHVlOiBcIlwiK2Rpc2FibGVkQ29udGV4dHMsIGNzc0NsYXNzOlwic3RhdHMtaW5mby1rb1wiIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSBcbiAgICB9XG5cbiAgICBvbkNhdGFsb2dEYXRhUmVsb2FkKGV2ZW50KSB7XG4gICAgICAgIHRoaXMucmVzdENhdGFsb2dFZGl0b3IuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5yZWJ1aWxkU3RhdHNJbmZvKCk7XG4gICAgfVxuXG4gICAgb25DYXRhbG9nRGF0YVJlbG9hZEVycm9yKGV2ZW50OiBSRVNUQ2F0YWxvZ0RhdGFFcnJvckV2ZW50KXtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoTE9HX1RBRywgJ29uQ2F0YWxvZ0RhdGFSZWxvYWRFcnJvciBlcnJvcjonLCBldmVudCk7XG4gICAgICAgIHRoaXMuY2xlYXJTdGF0c0luZm8oKTtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICBuYW1lOiAnTG9hZFJFU1RDb250ZXh0RXJyb3InLFxuICAgICAgICAgICAgdGl0bGU6ICdSRVNUIENvbnRleHQgTG9hZCcsXG4gICAgICAgICAgICBtZXNzYWdlOiAnRXJyb3IgbG9hZGluZyBSRVNUIGNvbnRleHRzOicsXG4gICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLkVycm9yLFxuICAgICAgICAgICAgZXJyb3I6IGV2ZW50LmVycm9yLFxuICAgICAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2hhbmdlc1NhdmVkKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ29uQ2hhbmdlc1NhdmVkOiAnLCBldmVudCk7XG4gICAgICAgIC8vVE9ETyEhXG4gICAgfVxuXG4gICAgcHVibGljIG9uRmlsdGVyQ2hhbmdlKGV2ZW50OiBFdmVudCkge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnb25GaWx0ZXJDaGFuZ2UgY2FsbGVkJyk7XG4gICAgICAgIHRoaXMucmVzdENhdGFsb2dTZWxlY3Rvci5zZXRGaWx0ZXIoZXZlbnQuc3JjRWxlbWVudFsndmFsdWUnXSk7XG4gICAgfVxuXG5cbiAgICBub2RlU2VsZWN0KG5vZGVFdmVudDogUkVTVENhdGFsb2dOb2RlU2VsZWN0aW9uRXZlbnQpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ25vZGVTZWxlY3QgJywgbm9kZUV2ZW50KTtcbiAgICAgICAgdGhpcy5yZXN0Q2F0YWxvZ0VkaXRvci5zdGFydEVkaXQobm9kZUV2ZW50Lm5vZGUpO1xuICAgICAgICAvKlxuICAgICAgICB0aGlzLnVwZGF0ZUNvbW1hbmRzKG5vZGVUeXBlKTtcbiAgICAgICAgKi9cbiAgICB9XG5cbiAgICBvbkFkZFJFU1RDb250ZXh0UHJlc3NlZCgpe1xuICAgICAgICBpZiAodGhpcy5jYW5BZGROZXdDb250ZXh0KXtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dEVkaXREaWFsb2cuc2hvd0Zvck5ldyh0aGlzLnNlbGVjdGVkRG9tYWluLm5hbWUsIHRoaXMuc2VsZWN0ZWRBcHBsaWNhdGlvbi5uYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2FuQWRkTmV3Q29udGV4dCgpOmJvb2xlYW57XG4gICAgICAgIHJldHVybiAodGhpcy5zZWxlY3RlZERvbWFpbiE9bnVsbCAmJiB0aGlzLnNlbGVjdGVkQXBwbGljYXRpb24hPW51bGwpO1xuICAgIH1cblxuICAgIGRvQ3JlYXRlUkVTVENvbnRleHQoZXZlbnQ6UkVTVENvbnRleHREaWFsb2dSZXN1bHQpe1xuICAgICAgICB0aGlzLl9zdWJIYW5kbGVyLmFkZChcbiAgICAgICAgICAgIHRoaXMucmVzdENhdGFsb2dTZXJ2aWNlLmNyZWF0ZVJFU1RDb250ZXh0KGV2ZW50LmRvbWFpbiwgZXZlbnQuYXBwbGljYXRpb24sIGV2ZW50Lm5hbWUsIGV2ZW50LnVybCkuc3Vic2NyaWJlKCAocmVzdWx0cyk9PiB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKExPR19UQUcgLCAnUkVTVCBjb250ZXh0IGNyZWF0ZWQ6JywgcmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdDcmVhdGVSRVNUQ29udGV4dCcsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnUkVTVCBDb250ZXh0IENyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdSRVNUIENvbnRleHQgY3JlYXRlZCBzdWNjZXNzZnVsbHkuJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5TdWNjZXNzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ2F0YWxvZygpO1xuXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcblxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKExPR19UQUcsICdDcmVhdGluZyBSRVNUIENvbnRleHQgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQ3JlYXRlUkVTVENvbnRleHRFcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnUkVTVCBDb250ZXh0IENyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdFcnJvciBjcmVhdGluZyBSRVNUIGNvbnRleHQ6JyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5FcnJvcixcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgICAgICAgICBjbG9zYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGRvVXBkYXRlUkVTVENvbnRleHQoZXZlbnQ6UkVTVENvbnRleHREaWFsb2dSZXN1bHQpe1xuICAgICAgICB0aGlzLl9zdWJIYW5kbGVyLmFkZChcbiAgICAgICAgICAgIHRoaXMucmVzdENhdGFsb2dTZXJ2aWNlLnVwZGF0ZVJFU1RDb250ZXh0KGV2ZW50LmRvbWFpbiwgZXZlbnQuYXBwbGljYXRpb24sIGV2ZW50Lm5hbWUsIGV2ZW50LnVybCkuc3Vic2NyaWJlKCAocmVzdWx0cyk9PiB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKExPR19UQUcgLCAnUkVTVCBjb250ZXh0IHVwZGF0ZWQ6JywgcmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdVcGRhdGVSRVNUQ29udGV4dCcsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnUkVTVCBDb250ZXh0IFVwZGF0ZScsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdSRVNUIENvbnRleHQgdXBkYXRlZCBzdWNjZXNzZnVsbHkuJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5TdWNjZXNzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ2F0YWxvZygpO1xuXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcblxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKExPR19UQUcsICdVcGRhdGUgUkVTVCBDb250ZXh0IGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNlbnRlci5wb3N0KHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1VwZGF0ZVJFU1RDb250ZXh0RXJyb3InLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ1JFU1QgQ29udGV4dCBVcGRhdGUnLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnRXJyb3IgdXBkYXRpbmcgUkVTVCBjb250ZXh0OicsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBkb1RvZ2dsZUNvbnRleHRTdGF0dXMoZG9tYWluOnN0cmluZywgYXBwbGljYXRpb246IHN0cmluZywgY29udGV4dE5hbWU6c3RyaW5nLCB1cmw6c3RyaW5nLCBlbmFibGVkOmJvb2xlYW4pe1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnZG9Ub2dnbGVDb250ZXh0U3RhdHVzIDogJywgZG9tYWluLCBhcHBsaWNhdGlvbiwgY29udGV4dE5hbWUsIHVybCwgZW5hYmxlZCk7XG4gICAgICAgIHRoaXMuX3N1YkhhbmRsZXIuYWRkKFxuICAgICAgICAgICAgdGhpcy5yZXN0Q2F0YWxvZ1NlcnZpY2UuZW5hYmxlUkVTVENvbnRleHQoZG9tYWluLCBhcHBsaWNhdGlvbiwgY29udGV4dE5hbWUsIGVuYWJsZWQpLnN1YnNjcmliZSgocmVzdWx0KT0+e1xuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhMT0dfVEFHICwgJ1JFU1QgY29udGV4dCBzdGF0dXMgY2hhbmdlOicsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdDaGFuZ2VTdGF0dXNSRVNUQ29udGV4dCcsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnQ2hhbmdlIFJFU1QgQ29udGV4dCBTdGF0dXMnLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUkVTVCBDb250ZXh0IHN0YXR1cyBjaGFuZ2VkIHN1Y2Nlc3NmdWxseS4nLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLlN1Y2Nlc3NcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hDYXRhbG9nKCk7XG5cblxuICAgICAgICAgICAgfSwgKGVycm9yKT0+e1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKExPR19UQUcsICdDaGFuZ2luIFJFU1QgQ29udGV4dCBzdGF0dXMgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQ2hhbmdlU3RhdHVzUkVTVENvbnRleHRFcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnQ2hhbmdlIFJFU1QgQ29udGV4dCBTdGF0dXMnLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnRXJyb3IgY2hhbmdpbmcgUkVTVCBjb250ZXh0IHN0YXR1czogJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5FcnJvcixcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgICAgICAgICBjbG9zYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTsgICAgXG4gICAgfVxuXG4gICAgZG9EZWxldGVDb250ZXh0KGRvbWFpbjpzdHJpbmcsIGFwcGxpY2F0aW9uOiBzdHJpbmcsIGNvbnRleHROYW1lOnN0cmluZyl7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdkZWxldGVDb250ZXh0IDogJywgZG9tYWluLCBhcHBsaWNhdGlvbiwgY29udGV4dE5hbWUpO1xuICAgICAgICB0aGlzLl9zdWJIYW5kbGVyLmFkZChcbiAgICAgICAgICAgIHRoaXMucmVzdENhdGFsb2dTZXJ2aWNlLmRlbGV0ZVJFU1RDb250ZXh0KGRvbWFpbiwgYXBwbGljYXRpb24sIGNvbnRleHROYW1lKS5zdWJzY3JpYmUoKHJlc3VsdCk9PntcblxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oTE9HX1RBRyAsICdSRVNUIGNvbnRleHQgZGVsZXRlZDonLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnRGVsZXRlUkVTVENvbnRleHQnLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0RlbGV0ZSBSRVNUIENvbnRleHQnLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUkVTVCBDb250ZXh0IGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LicsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuU3VjY2Vzc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaENhdGFsb2coKTtcblxuXG4gICAgICAgICAgICB9LCAoZXJyb3IpPT57XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoTE9HX1RBRywgJ0RlbGV0aW5nIFJFU1QgQ29udGV4dCBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdEZWxldGVSRVNUQ29udGV4dEVycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdEZWxldGUgUkVTVCBDb250ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Vycm9yIGRlbGV0aW5nIFJFU1QgY29udGV4dDonLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLkVycm9yLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG9uRGlhbG9nQ29uZmlybWF0aW9uKGV2ZW50OlJFU1RDb250ZXh0RGlhbG9nUmVzdWx0KXtcbiAgICAgICAgaWYgKGV2ZW50LmRpYWxvZ01vZGU9PT1EaWFsb2dNb2RlLk5ldyl7XG4gICAgICAgICAgICB0aGlzLmRvQ3JlYXRlUkVTVENvbnRleHQoZXZlbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmRpYWxvZ01vZGU9PT1EaWFsb2dNb2RlLkVkaXQpIHtcbiAgICAgICAgICAgIHRoaXMuZG9VcGRhdGVSRVNUQ29udGV4dChldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk5vZGVDb21tYW5kKGNvbW1hbmQ6UkVTVENhdGFsb2dOb2RlQ29tbWFuZEV2ZW50KXtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoTE9HX1RBRywgJ29uTm9kZUNvbW1hbmQ6JywgY29tbWFuZCk7XG4gICAgICAgIGlmIChjb21tYW5kLmNvbW1hbmQ9PT1HcmlkQ29tbWFuZFR5cGUuRGVsZXRlKXtcbiAgICAgICAgICAgIHRoaXMuZG9EZWxldGVDb250ZXh0KGNvbW1hbmQubm9kZS5kb21haW4sIGNvbW1hbmQubm9kZS5hcHBsaWNhdGlvbiwgY29tbWFuZC5ub2RlLm5hbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuY29tbWFuZD09PUdyaWRDb21tYW5kVHlwZS5FZGl0KXtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dEVkaXREaWFsb2cuc2hvd0ZvckVkaXQoY29tbWFuZC5ub2RlLmRvbWFpbiwgXG4gICAgICAgICAgICAgICAgY29tbWFuZC5ub2RlLmFwcGxpY2F0aW9uLCBcbiAgICAgICAgICAgICAgICBjb21tYW5kLm5vZGUubmFtZSwgY29tbWFuZC5ub2RlLnVybCwgY29tbWFuZC5ub2RlW1wiZW5hYmxlZFwiXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5jb21tYW5kPT09R3JpZENvbW1hbmRUeXBlLlB1Ymxpc2hUb2dnbGUpe1xuICAgICAgICAgICAgdGhpcy5kb1RvZ2dsZUNvbnRleHRTdGF0dXMoY29tbWFuZC5ub2RlLmRvbWFpbiwgY29tbWFuZC5ub2RlLmFwcGxpY2F0aW9uLCBjb21tYW5kLm5vZGUubmFtZSwgY29tbWFuZC5ub2RlLnVybCwgIWNvbW1hbmQubm9kZVtcImVuYWJsZWRcIl0pO1xuICAgICAgICB9XG4gICAgfVxuXG59ICAgXG4iXX0=