@lucasferreiralsf/angular-frontend-library
Version:
This is a set of custom angular components to easy the development of any Subway frontend project.
355 lines • 31.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, ViewChild, Renderer2 } from '@angular/core';
import { SelectionModel } from '@angular/cdk/collections';
import { MatPaginator } from '@angular/material';
import { DataTableService } from './data-table.service';
import { map } from 'rxjs/operators';
import { PopoverService } from './popover/popover.service';
import { trigger, transition, useAnimation } from '@angular/animations';
import { flipInX, flipOutX } from 'ng-animate';
/**
* @record
*/
export function DataTableColumnNamesInterface() { }
if (false) {
/** @type {?} */
DataTableColumnNamesInterface.prototype.columnNameApi;
/** @type {?} */
DataTableColumnNamesInterface.prototype.displayName;
}
/**
* @record
*/
export function DataTableInputDataInterface() { }
if (false) {
/** @type {?} */
DataTableInputDataInterface.prototype.id;
/** @type {?} */
DataTableInputDataInterface.prototype.actions;
}
/**
* @record
*/
export function DataTableActionsInterface() { }
if (false) {
/** @type {?} */
DataTableActionsInterface.prototype.actionName;
/** @type {?} */
DataTableActionsInterface.prototype.actionDescription;
/** @type {?} */
DataTableActionsInterface.prototype.actionIcon;
/** @type {?} */
DataTableActionsInterface.prototype.actionFunction;
/** @type {?|undefined} */
DataTableActionsInterface.prototype.isDelete;
/** @type {?|undefined} */
DataTableActionsInterface.prototype.isDeleteTitle;
/** @type {?|undefined} */
DataTableActionsInterface.prototype.isDeleteDescription;
}
/**
* @record
*/
export function DataTableTopActionButtonInterface() { }
if (false) {
/** @type {?} */
DataTableTopActionButtonInterface.prototype.actionName;
/** @type {?} */
DataTableTopActionButtonInterface.prototype.eventSlug;
/** @type {?} */
DataTableTopActionButtonInterface.prototype.buttonType;
/** @type {?|undefined} */
DataTableTopActionButtonInterface.prototype.buttonColor;
}
export class DataTableComponent {
/**
* @param {?} dataTableService
* @param {?} popoverService
* @param {?} renderer
*/
constructor(dataTableService, popoverService, renderer) {
this.dataTableService = dataTableService;
this.popoverService = popoverService;
this.renderer = renderer;
this.selectColumn = false;
this.columnNames = [];
this.actions = [];
this.inputData = [];
this.topActionButtons = [];
this.displayedColumns = [];
this.columnsToDisplay = [];
this.selection = new SelectionModel(true, []);
this.columnsNameApi = [];
this.topButtonStyle = {
height: '32px',
'line-height': '32px'
};
}
/**
* @return {?}
*/
ngOnInit() {
this.data = this.dataTableService.setDataSource(this.inputData);
this.columnsNameApi = this.columnNames.map((/**
* @param {?} e
* @return {?}
*/
e => e.columnNameApi));
this.displayColumns();
this.dataTableService.inputDataEvent.subscribe((/**
* @param {?} inputData
* @return {?}
*/
inputData => {
this.load(inputData);
}));
}
/**
* @param {?} inputData
* @return {?}
*/
load(inputData) {
this.inputData = inputData;
this.columnsNameApi = this.columnNames.map((/**
* @param {?} e
* @return {?}
*/
e => e.columnNameApi));
this.data = this.dataTableService.setDataSource(this.inputData);
this.noData = this.data.connect().pipe(map((/**
* @param {?} data
* @return {?}
*/
data => data.length === 0)));
this.data.paginator = this.paginator;
this.addActionsToData();
this.displayColumns();
this.popoverService.buttonClickEvent.subscribe((/**
* @param {?} event
* @return {?}
*/
event => {
this.buttonRowClick(event.event, event.elementId);
}));
}
/**
* @return {?}
*/
filterLimparButtonClick() {
this.dataTableService.filterLimparButtonClick();
}
/**
* @return {?}
*/
filterPesquisarButtonClick() {
this.dataTableService.filterPesquisarButtonClick();
}
/**
* @param {?} eventSlug
* @return {?}
*/
topButtonClick(eventSlug) {
this.dataTableService.topButtonClick(eventSlug);
}
/**
* @param {?} event
* @param {?} index
* @return {?}
*/
buttonRowClick(event, index) {
// console.log(`buttonRowClick: ${event.toLowerCase()}, ${index.toLowerCase()}`);
this.dataTableService.buttonRowClick(event.toLowerCase(), index);
}
/**
* @return {?}
*/
addActionsToData() {
this.data.data.map((/**
* @param {?} e
* @return {?}
*/
e => {
// tslint:disable-next-line: no-string-literal
e['actions'] = Object.assign({}, this.actions);
}));
}
/**
* @return {?}
*/
isAllSelected() {
/** @type {?} */
const numSelected = this.selection.selected.length;
/** @type {?} */
const numRows = this.data.data.length;
return numSelected === numRows;
}
/**
* @return {?}
*/
masterToggle() {
this.isAllSelected()
? this.selection.clear()
: this.data.data.forEach((/**
* @param {?} row
* @return {?}
*/
row => this.selection.select(row)));
}
/**
* @return {?}
*/
displayColumns() {
if (this.selectColumn) {
this.addSelectToDisplayedColumns();
}
if (this.actions.length >= 0) {
this.addActionsToDisplayedColumns();
}
}
/**
* @return {?}
*/
addSelectToDisplayedColumns() {
/** @type {?} */
const select = ['select'];
if (this.columnsNameApi && this.columnsNameApi.length !== 0) {
this.columnsNameApi = select.concat(this.columnsNameApi);
this.displayedColumns = this.columnsNameApi;
this.columnsToDisplay = this.displayedColumns.slice();
}
else {
this.displayedColumns = select.concat(Object.keys(this.data[0]));
this.columnsToDisplay = this.displayedColumns.slice();
}
}
/**
* @return {?}
*/
addActionsToDisplayedColumns() {
/** @type {?} */
const actions = ['actions'];
if (this.columnsNameApi && this.columnsNameApi.length !== 0) {
this.columnsNameApi.push(actions[0]);
this.displayedColumns = this.columnsNameApi;
this.columnsToDisplay = this.displayedColumns.slice();
}
else {
this.displayedColumns = actions.concat(Object.keys(this.data[0]));
this.columnsToDisplay = this.displayedColumns.slice();
}
}
/**
* @param {?} columnNameApi
* @return {?}
*/
verifyNameColumn(columnNameApi) {
/** @type {?} */
const columnNameApiArray = this.columnNames.map((/**
* @param {?} e
* @return {?}
*/
e => e.columnNameApi));
/** @type {?} */
const indexcolumnNameApi = columnNameApiArray.indexOf(columnNameApi);
if (indexcolumnNameApi >= 0) {
return this.columnNames[indexcolumnNameApi].displayName;
}
else {
return columnNameApi;
}
}
/**
* @return {?}
*/
addColumn() {
/** @type {?} */
const randomColumn = Math.floor(Math.random() * this.displayedColumns.length);
this.columnsToDisplay.push(this.displayedColumns[randomColumn]);
}
/**
* @return {?}
*/
removeColumn() {
if (this.columnsToDisplay.length) {
this.columnsToDisplay.pop();
}
}
}
DataTableComponent.decorators = [
{ type: Component, args: [{
selector: 'sb-data-table',
template: "<div>\r\n <div fxLayout fxLayoutAlign=\"space-between center\" class=\"mr-16 ml-16 mb-5\">\r\n <div #topButtonAction fxLayout=\"row wrap\" fxLayoutAlign=\"flex-start center\" fxLayoutGap=\"10px grid\">\r\n <sb-button\r\n *ngFor=\"let buttonElement of topActionButtons\"\r\n [materialTypeButton]=\"buttonElement.buttonType\"\r\n [color]=\"buttonElement.buttonColor\"\r\n [actionName]=\"buttonElement.actionName\"\r\n [customStyles]=\"topButtonStyle\"\r\n (buttonClick)=\"topButtonClick(buttonElement.eventSlug)\"\r\n ></sb-button>\r\n </div>\r\n <sb-filter-table (limpar)=\"filterLimparButtonClick()\" (pesquisa)=\"filterPesquisarButtonClick()\">\r\n <ng-content select=\".sb-data-table-content\"></ng-content>\r\n </sb-filter-table>\r\n </div>\r\n <table mat-table [dataSource]=\"data\" style=\"width: 100%;\" class=\"table-striped table-hover\">\r\n <!-- Checkbox Column -->\r\n\r\n <ng-container [matColumnDef]=\"column\" *ngFor=\"let column of displayedColumns\">\r\n <div *ngIf=\"column == 'select'\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox\r\n (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\r\n >\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"\r\n >\r\n </mat-checkbox>\r\n </td>\r\n </div>\r\n <div *ngIf=\"column !== 'select' && column !== 'actions'\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n {{ verifyNameColumn(column) }}\r\n </th>\r\n <td mat-cell *matCellDef=\"let element\">{{ element[column] }}</td>\r\n </div>\r\n <div *ngIf=\"column == 'actions'\">\r\n <th mat-header-cell *matHeaderCellDef>A\u00E7\u00F5es</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div fxLayout>\r\n <div *ngFor=\"let buttonElement of (element.actions | keyvalue)\">\r\n <button\r\n mat-icon-button\r\n *ngIf=\"!buttonElement.value.isDelete\"\r\n (click)=\"buttonRowClick(buttonElement.value.actionName, element.id)\"\r\n matTooltip=\"{{ buttonElement.value.actionDescription }}\"\r\n >\r\n <mat-icon>{{ buttonElement.value.actionIcon }}</mat-icon>\r\n </button>\r\n <sb-popover\r\n *ngIf=\"buttonElement.value.isDelete\"\r\n matTooltip=\"{{ buttonElement.value.actionDescription }}\"\r\n elementId=\"{{ element.id }}\"\r\n popoverTitle=\"{{ buttonElement.value.isDeleteTitle }}\"\r\n popoverDescription=\"{{ buttonElement.value.isDeleteDescription }}\"\r\n ></sb-popover>\r\n </div>\r\n </div>\r\n </td>\r\n </div>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"columnsToDisplay\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: columnsToDisplay\" (click)=\"selection.toggle(row)\"></tr>\r\n </table>\r\n\r\n <div @flipInOut *ngIf=\"data.data.length == 0\" fxLayout=\"column\" fxLayoutAlign=\"center center\" fxLayoutGap=\"5px\" class=\"m-30\">\r\n <img src=\"../../../assets/img/nodata.svg\" />\r\n <p class=\" mat-caption\">\r\n Sem Registros\r\n </p>\r\n </div>\r\n\r\n <mat-paginator [pageSizeOptions]=\"[5, 10, 25, 100]\" class=\"mt-10\"></mat-paginator>\r\n</div>\r\n",
animations: [
trigger('flipInOut', [
transition('void => *', useAnimation(flipInX, {
params: { timing: 0.3, delay: 0, a: '10px', b: '0' }
})),
transition('* => void', useAnimation(flipOutX, {
params: { timing: 0.3, delay: 0 }
}))
])
],
styles: ["td.mat-cell:last-of-type,td.mat-footer-cell:last-of-type,th.mat-header-cell:last-of-type{width:180px;text-align:center}"]
}] }
];
/** @nocollapse */
DataTableComponent.ctorParameters = () => [
{ type: DataTableService },
{ type: PopoverService },
{ type: Renderer2 }
];
DataTableComponent.propDecorators = {
selectColumn: [{ type: Input }],
columnNames: [{ type: Input }],
actions: [{ type: Input }],
inputData: [{ type: Input }],
topActionButtons: [{ type: Input }],
paginator: [{ type: ViewChild, args: [MatPaginator,] }]
};
if (false) {
/** @type {?} */
DataTableComponent.prototype.selectColumn;
/** @type {?} */
DataTableComponent.prototype.columnNames;
/** @type {?} */
DataTableComponent.prototype.actions;
/** @type {?} */
DataTableComponent.prototype.inputData;
/** @type {?} */
DataTableComponent.prototype.topActionButtons;
/** @type {?} */
DataTableComponent.prototype.paginator;
/** @type {?} */
DataTableComponent.prototype.data;
/** @type {?} */
DataTableComponent.prototype.displayedColumns;
/** @type {?} */
DataTableComponent.prototype.columnsToDisplay;
/** @type {?} */
DataTableComponent.prototype.selection;
/** @type {?} */
DataTableComponent.prototype.columnsNameApi;
/** @type {?} */
DataTableComponent.prototype.noData;
/** @type {?} */
DataTableComponent.prototype.topButtonStyle;
/**
* @type {?}
* @private
*/
DataTableComponent.prototype.dataTableService;
/**
* @type {?}
* @private
*/
DataTableComponent.prototype.popoverService;
/**
* @type {?}
* @private
*/
DataTableComponent.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbHVjYXNmZXJyZWlyYWxzZi9hbmd1bGFyLWZyb250ZW5kLWxpYnJhcnkvIiwic291cmNlcyI6WyJsaWIvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFHVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFzQixZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDOzs7O0FBRS9DLG1EQUdDOzs7SUFGQyxzREFBc0I7O0lBQ3RCLG9EQUFvQjs7Ozs7QUFHdEIsaURBR0M7OztJQUZDLHlDQUFXOztJQUNYLDhDQUFtQzs7Ozs7QUFHckMsK0NBUUM7OztJQVBDLCtDQUFtQjs7SUFDbkIsc0RBQTBCOztJQUMxQiwrQ0FBbUI7O0lBQ25CLG1EQUFvQjs7SUFDcEIsNkNBQW1COztJQUNuQixrREFBdUI7O0lBQ3ZCLHdEQUE2Qjs7Ozs7QUFHL0IsdURBS0M7OztJQUpDLHVEQUFtQjs7SUFDbkIsc0RBQWtCOztJQUNsQix1REFBbUI7O0lBQ25CLHdEQUFxQjs7QUF3QnZCLE1BQU0sT0FBTyxrQkFBa0I7Ozs7OztJQXFCN0Is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QyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO3lCQUNyRCxDQUFDLENBQ0g7d0JBQ0QsVUFBVSxDQUNSLFdBQVcsRUFDWCxZQUFZLENBQUMsUUFBUSxFQUFFOzRCQUNyQixNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7eUJBQ2xDLENBQUMsQ0FDSDtxQkFDRixDQUFDO2lCQUNIOzthQUNGOzs7O1lBckRRLGdCQUFnQjtZQUVoQixjQUFjO1lBUnJCLFNBQVM7OzsyQkE2RFIsS0FBSzswQkFDTCxLQUFLO3NCQUNMLEtBQUs7d0JBQ0wsS0FBSzsrQkFDTCxLQUFLO3dCQUVMLFNBQVMsU0FBQyxZQUFZOzs7O0lBTnZCLDBDQUE4Qjs7SUFDOUIseUNBQTJEOztJQUMzRCxxQ0FBbUQ7O0lBQ25ELHVDQUF1RDs7SUFDdkQsOENBQW9FOztJQUVwRSx1Q0FBaUQ7O0lBRWpELGtDQUE4Qjs7SUFDOUIsOENBQWdDOztJQUNoQyw4Q0FBZ0M7O0lBQ2hDLHVDQUF5Qzs7SUFDekMsNENBQThCOztJQUM5QixvQ0FBTzs7SUFFUCw0Q0FHRTs7Ozs7SUFHQSw4Q0FBMEM7Ozs7O0lBQzFDLDRDQUFzQzs7Ozs7SUFDdEMsc0NBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIElucHV0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBSZW5kZXJlcjIsXHJcbiAgQWZ0ZXJDb250ZW50SW5pdCxcclxuICBBZnRlclZpZXdJbml0XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcclxuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlLCBNYXRQYWdpbmF0b3IgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XHJcbmltcG9ydCB7IERhdGFUYWJsZVNlcnZpY2UgfSBmcm9tICcuL2RhdGEtdGFibGUuc2VydmljZSc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgUG9wb3ZlclNlcnZpY2UgfSBmcm9tICcuL3BvcG92ZXIvcG9wb3Zlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgdHJpZ2dlciwgdHJhbnNpdGlvbiwgdXNlQW5pbWF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IGZsaXBJblgsIGZsaXBPdXRYIH0gZnJvbSAnbmctYW5pbWF0ZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERhdGFUYWJsZUNvbHVtbk5hbWVzSW50ZXJmYWNlIHtcclxuICBjb2x1bW5OYW1lQXBpOiBzdHJpbmc7XHJcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEYXRhVGFibGVJbnB1dERhdGFJbnRlcmZhY2Uge1xyXG4gIGlkOiBudW1iZXI7XHJcbiAgYWN0aW9uczogRGF0YVRhYmxlQWN0aW9uc0ludGVyZmFjZTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEYXRhVGFibGVBY3Rpb25zSW50ZXJmYWNlIHtcclxuICBhY3Rpb25OYW1lOiBzdHJpbmc7XHJcbiAgYWN0aW9uRGVzY3JpcHRpb246IHN0cmluZztcclxuICBhY3Rpb25JY29uOiBzdHJpbmc7XHJcbiAgYWN0aW9uRnVuY3Rpb246IGFueTtcclxuICBpc0RlbGV0ZT86IGJvb2xlYW47XHJcbiAgaXNEZWxldGVUaXRsZT86IHN0cmluZztcclxuICBpc0RlbGV0ZURlc2NyaXB0aW9uPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERhdGFUYWJsZVRvcEFjdGlvbkJ1dHRvbkludGVyZmFjZSB7XHJcbiAgYWN0aW9uTmFtZTogc3RyaW5nO1xyXG4gIGV2ZW50U2x1Zzogc3RyaW5nO1xyXG4gIGJ1dHRvblR5cGU6IHN0cmluZztcclxuICBidXR0b25Db2xvcj86IHN0cmluZztcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzYi1kYXRhLXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZGF0YS10YWJsZS5jb21wb25lbnQuc2NzcyddLFxyXG4gIGFuaW1hdGlvbnM6IFtcclxuICAgIHRyaWdnZXIoJ2ZsaXBJbk91dCcsIFtcclxuICAgICAgdHJhbnNpdGlvbihcclxuICAgICAgICAndm9pZCA9PiAqJyxcclxuICAgICAgICB1c2VBbmltYXRpb24oZmxpcEluWCwge1xyXG4gICAgICAgICAgcGFyYW1zOiB7IHRpbWluZzogMC4zLCBkZWxheTogMCwgYTogJzEwcHgnLCBiOiAnMCcgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICksXHJcbiAgICAgIHRyYW5zaXRpb24oXHJcbiAgICAgICAgJyogPT4gdm9pZCcsXHJcbiAgICAgICAgdXNlQW5pbWF0aW9uKGZsaXBPdXRYLCB7XHJcbiAgICAgICAgICBwYXJhbXM6IHsgdGltaW5nOiAwLjMsIGRlbGF5OiAwIH1cclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICBdKVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgc2VsZWN0Q29sdW1uID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY29sdW1uTmFtZXM6IERhdGFUYWJsZUNvbHVtbk5hbWVzSW50ZXJmYWNlW10gPSBbXTtcclxuICBASW5wdXQoKSBhY3Rpb25zOiBEYXRhVGFibGVBY3Rpb25zSW50ZXJmYWNlW10gPSBbXTtcclxuICBASW5wdXQoKSBpbnB1dERhdGE6IERhdGFUYWJsZUlucHV0RGF0YUludGVyZmFjZVtdID0gW107XHJcbiAgQElucHV0KCkgdG9wQWN0aW9uQnV0dG9uczogRGF0YVRhYmxlVG9wQWN0aW9uQnV0dG9uSW50ZXJmYWNlW10gPSBbXTtcclxuXHJcbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xyXG5cclxuICBkYXRhOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcclxuICBkaXNwbGF5ZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGNvbHVtbnNUb0Rpc3BsYXk6IHN0cmluZ1tdID0gW107XHJcbiAgc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsKHRydWUsIFtdKTtcclxuICBjb2x1bW5zTmFtZUFwaTogc3RyaW5nW10gPSBbXTtcclxuICBub0RhdGE7XHJcblxyXG4gIHRvcEJ1dHRvblN0eWxlOiB7fSA9IHtcclxuICAgIGhlaWdodDogJzMycHgnLFxyXG4gICAgJ2xpbmUtaGVpZ2h0JzogJzMycHgnXHJcbiAgfTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGRhdGFUYWJsZVNlcnZpY2U6IERhdGFUYWJsZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBvcG92ZXJTZXJ2aWNlOiBQb3BvdmVyU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMlxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGFUYWJsZVNlcnZpY2Uuc2V0RGF0YVNvdXJjZSh0aGlzLmlucHV0RGF0YSk7XHJcbiAgICB0aGlzLmNvbHVtbnNOYW1lQXBpID0gdGhpcy5jb2x1bW5OYW1lcy5tYXAoZSA9PiBlLmNvbHVtbk5hbWVBcGkpO1xyXG4gICAgdGhpcy5kaXNwbGF5Q29sdW1ucygpO1xyXG4gICAgdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmlucHV0RGF0YUV2ZW50LnN1YnNjcmliZShpbnB1dERhdGEgPT4ge1xyXG4gICAgICB0aGlzLmxvYWQoaW5wdXREYXRhKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbG9hZChpbnB1dERhdGEpIHtcclxuICAgIHRoaXMuaW5wdXREYXRhID0gaW5wdXREYXRhO1xyXG4gICAgdGhpcy5jb2x1bW5zTmFtZUFwaSA9IHRoaXMuY29sdW1uTmFtZXMubWFwKGUgPT4gZS5jb2x1bW5OYW1lQXBpKTtcclxuICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YVRhYmxlU2VydmljZS5zZXREYXRhU291cmNlKHRoaXMuaW5wdXREYXRhKTtcclxuICAgIHRoaXMubm9EYXRhID0gdGhpcy5kYXRhLmNvbm5lY3QoKS5waXBlKG1hcChkYXRhID0+IGRhdGEubGVuZ3RoID09PSAwKSk7XHJcbiAgICB0aGlzLmRhdGEucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XHJcbiAgICB0aGlzLmFkZEFjdGlvbnNUb0RhdGEoKTtcclxuICAgIHRoaXMuZGlzcGxheUNvbHVtbnMoKTtcclxuICAgIHRoaXMucG9wb3ZlclNlcnZpY2UuYnV0dG9uQ2xpY2tFdmVudC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICB0aGlzLmJ1dHRvblJvd0NsaWNrKGV2ZW50LmV2ZW50LCBldmVudC5lbGVtZW50SWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJMaW1wYXJCdXR0b25DbGljaygpIHtcclxuICAgIHRoaXMuZGF0YVRhYmxlU2VydmljZS5maWx0ZXJMaW1wYXJCdXR0b25DbGljaygpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyUGVzcXVpc2FyQnV0dG9uQ2xpY2soKSB7XHJcbiAgICB0aGlzLmRhdGFUYWJsZVNlcnZpY2UuZmlsdGVyUGVzcXVpc2FyQnV0dG9uQ2xpY2soKTtcclxuICB9XHJcblxyXG4gIHRvcEJ1dHRvbkNsaWNrKGV2ZW50U2x1Zzogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmRhdGFUYWJsZVNlcnZpY2UudG9wQnV0dG9uQ2xpY2soZXZlbnRTbHVnKTtcclxuICB9XHJcblxyXG4gIGJ1dHRvblJvd0NsaWNrKGV2ZW50OiBzdHJpbmcsIGluZGV4KSB7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhgYnV0dG9uUm93Q2xpY2s6ICR7ZXZlbnQudG9Mb3dlckNhc2UoKX0sICR7aW5kZXgudG9Mb3dlckNhc2UoKX1gKTtcclxuICAgIHRoaXMuZGF0YVRhYmxlU2VydmljZS5idXR0b25Sb3dDbGljayhldmVudC50b0xvd2VyQ2FzZSgpLCBpbmRleCk7XHJcbiAgfVxyXG5cclxuICBhZGRBY3Rpb25zVG9EYXRhKCkge1xyXG4gICAgdGhpcy5kYXRhLmRhdGEubWFwKGUgPT4ge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXN0cmluZy1saXRlcmFsXHJcbiAgICAgIGVbJ2FjdGlvbnMnXSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuYWN0aW9ucyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGlzQWxsU2VsZWN0ZWQoKSB7XHJcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aDtcclxuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmRhdGEuZGF0YS5sZW5ndGg7XHJcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPT09IG51bVJvd3M7XHJcbiAgfVxyXG5cclxuICBtYXN0ZXJUb2dnbGUoKSB7XHJcbiAgICB0aGlzLmlzQWxsU2VsZWN0ZWQoKVxyXG4gICAgICA/IHRoaXMuc2VsZWN0aW9uLmNsZWFyKClcclxuICAgICAgOiB0aGlzLmRhdGEuZGF0YS5mb3JFYWNoKHJvdyA9PiB0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KSk7XHJcbiAgfVxyXG5cclxuICBkaXNwbGF5Q29sdW1ucygpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdENvbHVtbikge1xyXG4gICAgICB0aGlzLmFkZFNlbGVjdFRvRGlzcGxheWVkQ29sdW1ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmFjdGlvbnMubGVuZ3RoID49IDApIHtcclxuICAgICAgdGhpcy5hZGRBY3Rpb25zVG9EaXNwbGF5ZWRDb2x1bW5zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRTZWxlY3RUb0Rpc3BsYXllZENvbHVtbnMoKSB7XHJcbiAgICBjb25zdCBzZWxlY3QgPSBbJ3NlbGVjdCddO1xyXG5cclxuICAgIGlmICh0aGlzLmNvbHVtbnNOYW1lQXBpICYmIHRoaXMuY29sdW1uc05hbWVBcGkubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgIHRoaXMuY29sdW1uc05hbWVBcGkgPSBzZWxlY3QuY29uY2F0KHRoaXMuY29sdW1uc05hbWVBcGkpO1xyXG4gICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSB0aGlzLmNvbHVtbnNOYW1lQXBpO1xyXG4gICAgICB0aGlzLmNvbHVtbnNUb0Rpc3BsYXkgPSB0aGlzLmRpc3BsYXllZENvbHVtbnMuc2xpY2UoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHNlbGVjdC5jb25jYXQoT2JqZWN0LmtleXModGhpcy5kYXRhWzBdKSk7XHJcbiAgICAgIHRoaXMuY29sdW1uc1RvRGlzcGxheSA9IHRoaXMuZGlzcGxheWVkQ29sdW1ucy5zbGljZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkQWN0aW9uc1RvRGlzcGxheWVkQ29sdW1ucygpIHtcclxuICAgIGNvbnN0IGFjdGlvbnMgPSBbJ2FjdGlvbnMnXTtcclxuXHJcbiAgICBpZiAodGhpcy5jb2x1bW5zTmFtZUFwaSAmJiB0aGlzLmNvbHVtbnNOYW1lQXBpLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICB0aGlzLmNvbHVtbnNOYW1lQXBpLnB1c2goYWN0aW9uc1swXSk7XHJcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuY29sdW1uc05hbWVBcGk7XHJcbiAgICAgIHRoaXMuY29sdW1uc1RvRGlzcGxheSA9IHRoaXMuZGlzcGxheWVkQ29sdW1ucy5zbGljZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gYWN0aW9ucy5jb25jYXQoT2JqZWN0LmtleXModGhpcy5kYXRhWzBdKSk7XHJcbiAgICAgIHRoaXMuY29sdW1uc1RvRGlzcGxheSA9IHRoaXMuZGlzcGxheWVkQ29sdW1ucy5zbGljZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmVyaWZ5TmFtZUNvbHVtbihjb2x1bW5OYW1lQXBpKSB7XHJcbiAgICBjb25zdCBjb2x1bW5OYW1lQXBpQXJyYXk6IHN0cmluZ1tdID0gdGhpcy5jb2x1bW5OYW1lcy5tYXAoXHJcbiAgICAgIGUgPT4gZS5jb2x1bW5OYW1lQXBpXHJcbiAgICApO1xyXG4gICAgY29uc3QgaW5kZXhjb2x1bW5OYW1lQXBpOiBudW1iZXIgPSBjb2x1bW5OYW1lQXBpQXJyYXkuaW5kZXhPZihcclxuICAgICAgY29sdW1uTmFtZUFwaVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoaW5kZXhjb2x1bW5OYW1lQXBpID49IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTmFtZXNbaW5kZXhjb2x1bW5OYW1lQXBpXS5kaXNwbGF5TmFtZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBjb2x1bW5OYW1lQXBpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkQ29sdW1uKCkge1xyXG4gICAgY29uc3QgcmFuZG9tQ29sdW1uID0gTWF0aC5mbG9vcihcclxuICAgICAgTWF0aC5yYW5kb20oKSAqIHRoaXMuZGlzcGxheWVkQ29sdW1ucy5sZW5ndGhcclxuICAgICk7XHJcbiAgICB0aGlzLmNvbHVtbnNUb0Rpc3BsYXkucHVzaCh0aGlzLmRpc3BsYXllZENvbHVtbnNbcmFuZG9tQ29sdW1uXSk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVDb2x1bW4oKSB7XHJcbiAgICBpZiAodGhpcy5jb2x1bW5zVG9EaXNwbGF5Lmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmNvbHVtbnNUb0Rpc3BsYXkucG9wKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==