UNPKG

@asi-ngtools/lib

Version:

This project is a little components library, simple to use, which will help you to simplify your project.

511 lines (510 loc) 48.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { AsiPaginationService } from './../../services/asi-pagination.service'; import { AsiTableSelectionModel } from './asi-table-config'; import { AsiTableRequest } from './asi-table-request'; import { AsiTableData } from './asi-table-data'; import { AsiTableColumn } from './asi-table-column.directive'; import { Component, QueryList, ContentChildren, Input, ViewChild, ElementRef } from '@angular/core'; import * as nh from '../../native-helper'; /** * @template T */ export class AsiTable { /** * @param {?} paginateService */ constructor(paginateService) { this.paginateService = paginateService; /** * Sorte table automatically */ this.autoSort = false; /** * Auto paginate the table */ this.autoPaginate = false; /** * Nb element by page */ this.nbElementParPage = 25; /** * Define a selection model */ this.selectionModel = new AsiTableSelectionModel('id', false); /** * Will call onRequestData when init */ this.fireRefreshOnInit = true; /** * Focus to the top of the table when page chanched */ this.changePageOnTop = false; this.columns = new Array(); this.data = new AsiTableData(); this.searchDone = false; this.loading = false; // Show allcheck checkbox allchecked this.allChecked = false; } /** * @return {?} */ getColumns() { return nh.filter(this.columns, (column) => { return this.filtreColumn(column) && !column.inlineColumn; }); } /** * @return {?} */ getInlineColumns() { return nh.filter(this.columns, (column) => { return this.filtreColumn(column) && column.inlineColumn; }); } /** * @param {?} column * @return {?} */ filtreColumn(column) { return (column.showIf == null || column.showIf) && (column.hideIf == null || !column.hideIf); } /** * @param {?} column * @return {?} */ getHeaderClass(column) { /** @type {?} */ let columnClass = {}; if (column.columnClass) { if (column.columnClass instanceof Object) { // Copy columnClass = Object.assign({}, column.columnClass); } else if (typeof column.columnClass === 'string') { columnClass['' + column.columnClass] = true; } } columnClass.sortable = column.sortable; columnClass.asc = column.asc; columnClass.desc = column.asc === false; return columnClass; } /** * @return {?} */ fireRefresh() { this.data.pageIndex = 1; this.requestData(); } /** * @param {?} data * @return {?} */ updateData(data) { this.data = data; if (this.autoPaginate) { this.noPaginateResults = data.results; this.paginateDatas(); } else { this.initCheckbox(); } if (this.autoSort) { this.sortDatas(); } } /** * @param {?} column * @return {?} */ onSort(column) { if (column.sortable) { if (this.sortedColumn != null && this.sortedColumn !== column) { this.sortedColumn.unsort(); } this.sortedColumn = column; column.toggleSort(); if (this.autoSort) { this.sortDatas(); } else { this.requestData(); } } } /** * @param {?} pagination * @return {?} */ onPaginationChanged(pagination) { this.data.pageIndex = pagination; if (this.autoPaginate) { this.paginateDatas(); } else { this.requestData(); } if (this.changePageOnTop) { this.topElement.nativeElement.scrollIntoView(); } } /** * @return {?} */ paginateDatas() { this.data.results = this.paginateService.getPage(this.noPaginateResults, this.nbElementParPage, this.data.pageIndex); this.data.totalPages = this.paginateService.getNbPages(this.noPaginateResults, this.nbElementParPage); this.data.totalElements = this.noPaginateResults.length; this.initCheckbox(); } /** * @return {?} */ requestData() { /** @type {?} */ let request = this.getAsiTableRequest(); if (this.onRequestData) { if (this.requestDataSubcription != null) { // Ignore previous request this.requestDataSubcription.unsubscribe(); } this.requestDataSubcription = nh.observe(this.onRequestData(request)).subscribe((data) => { this.updateData(data); }); } } /** * @return {?} */ getAsiTableRequest() { /** @type {?} */ let request = new AsiTableRequest(); request.pageIndex = this.data.pageIndex; request.nbElementsParPage = this.nbElementParPage; if (this.sortedColumn != null) { request.tri = this.sortedColumn.getSortName(); request.asc = this.sortedColumn.getAsc(); } return request; } /** * @return {?} */ sortDatas() { if (this.sortedColumn != null) { if (!this.autoPaginate) { this.data.results = this.internalSortData(this.data.results); } else { this.noPaginateResults = this.internalSortData(this.noPaginateResults); this.paginateDatas(); } this.loading = false; } } /** * @param {?} data * @return {?} */ internalSortData(data) { /** @type {?} */ const sortInformation = { sort: this.sortedColumn.getSortName(), asc: this.sortedColumn.getAsc() }; if (this.sortedColumn.customSort) { this.sortedColumn.customSort(data, sortInformation); } else if (this.customSort) { this.customSort(data, sortInformation); } else { nh.orderByWithoutCase(data, this.sortedColumn.getSortName(), this.sortedColumn.getAsc() ? 'asc' : 'desc'); } return data; } /** * Recupere la valeur à afficher pour une cellule * @param {?} row * @param {?} column * @return {?} */ getCellValue(row, column) { return this.getProperty(row, column.name); } /** * @param {?} object * @param {?} path * @return {?} */ getProperty(object, path) { return nh.get(object, path); } /** * @return {?} */ initCheckbox() { this.columns.forEach((column) => { if (column.type === 'checkbox') { if (this.selectionModel.allChecked) { // If we are in allcheck mode we unselect excluded lines nh.forEach(this.data.results, (item) => { /** @type {?} */ let itemId = this.getProperty(item, this.selectionModel.config.selectionId); /** @type {?} */ const excluded = nh.find(this.selectionModel.itemsExcluded, (excludeditem) => { return this.matchRow(itemId, excludeditem); }) != null; item.checked = !excluded; }); } else { // Else we select included lines nh.forEach(this.data.results, (item) => { /** @type {?} */ let itemId = this.getProperty(item, this.selectionModel.config.selectionId); /** @type {?} */ const included = nh.find(this.selectionModel.itemsIncluded, (includedItem) => { return this.matchRow(itemId, includedItem); }) != null; item.checked = included; }); } } }); } /** * @param {?} column * @return {?} */ onAllChecked(column) { this.selectionModel.allChecked = this.allChecked; this.selectionModel.itemsIncluded = []; this.selectionModel.itemsExcluded = []; /** @type {?} */ let nbItemsSelected = 0; nh.forEach(this.data.results, (data) => { if (!column.disabledCheckbox || !column.disabledCheckbox(data)) { data.checked = this.selectionModel.allChecked; nbItemsSelected++; this.selectionModel.itemsIncluded.push(data); } else { this.selectionModel.itemsExcluded.push(data); } }); if (this.selectionModel.allChecked) { if (this.selectionModel.config.multipage) { this.selectionModel.nbItemsSelected = this.data.totalElements; } else { this.selectionModel.nbItemsSelected = nbItemsSelected; } } else { this.selectionModel.nbItemsSelected = 0; } column.onAllChecked.emit(this.selectionModel.allChecked); } /** * @param {?} row * @param {?} column * @return {?} */ onChecked(row, column) { /** @type {?} */ let rowId = this.getProperty(row, this.selectionModel.config.selectionId); if (this.selectionModel.allChecked) { if (row.checked) { nh.remove(this.selectionModel.itemsExcluded, (item) => { return this.matchRow(rowId, item); }); this.selectionModel.nbItemsSelected++; } else { this.selectionModel.itemsExcluded.push(row); this.selectionModel.nbItemsSelected--; } } else { if (row.checked) { this.selectionModel.itemsIncluded.push(row); this.selectionModel.nbItemsSelected++; } else { nh.remove(this.selectionModel.itemsIncluded, (item) => { return this.matchRow(rowId, item); }); this.selectionModel.nbItemsSelected--; } } column.onChecked.emit(row); this.updateAllChecked(); } /** * @param {?} rowId * @param {?} rowToMatch * @return {?} */ matchRow(rowId, rowToMatch) { return rowId === this.getProperty(rowToMatch, this.selectionModel.config.selectionId); } /** * @return {?} */ updateAllChecked() { if (this.selectionModel.config.multipage) { this.allChecked = this.selectionModel.nbItemsSelected > 0 && this.selectionModel.nbItemsSelected === this.data.totalElements; } else { this.allChecked = this.selectionModel.nbItemsSelected > 0 && this.selectionModel.nbItemsSelected === this.data.results.length; } } /** * @param {?} row * @return {?} */ getRowClass(row) { if (row != null && this.rowClass != null) { if (this.isFunction(this.rowClass)) { return this.rowClass(row); } else { /** @type {?} */ let rowClassStr = JSON.stringify(this.rowClass); rowClassStr = nh.replace(rowClassStr, new RegExp('{row}', 'g'), 'row'); // tslint:disable-next-line:quotemark rowClassStr = nh.replace(rowClassStr, new RegExp("'", 'g'), '"'); /** @type {?} */ let jsonRowClass = JSON.parse(rowClassStr); for (let key in jsonRowClass) { if (jsonRowClass.hasOwnProperty(key)) { // tslint:disable-next-line:no-eval jsonRowClass[key] = eval(jsonRowClass[key]); } } return jsonRowClass; } } } /** * @param {?} functionToCheck * @return {?} */ isFunction(functionToCheck) { /** @type {?} */ const getType = {}; return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; } /** * @return {?} */ ngAfterContentInit() { this.queryColumns.forEach(column => { this.columns.push(column); }); if (this.fireRefreshOnInit) { this.requestData(); } } } AsiTable.decorators = [ { type: Component, args: [{ selector: 'asi-table', host: { 'class': 'asi-component asi-table' }, template: "<table #table>\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let column of getColumns()\" [ngClass]=\"getHeaderClass(column)\" (click)=\"onSort(column)\">\r\n <ng-container *ngIf=\"column.type == 'text'\">\r\n <span class=\"header\">\r\n <span *ngIf=\"!column.headerDef\">{{column.libelle | translate}}</span>\r\n <ng-template *ngIf=\"column.headerDef\" [ngTemplateOutlet]=\"column.headerDef.template\" [ngTemplateOutletContext]=\"{$implicit : column}\"></ng-template>\r\n <span class=\"sortIconDesc\" [innerHtml]=\"'&#9660;'\"></span>\r\n <span class=\"sortIconAsc\" [innerHtml]=\"'&#9650;'\"></span>\r\n </span>\r\n </ng-container>\r\n <asi-checkbox *ngIf=\"column.type == 'checkbox'\" [(ngModel)]=\"allChecked\" (onValueChange)=\"onAllChecked(column)\"></asi-checkbox>\r\n </th>\r\n </tr>\r\n </thead>\r\n <ng-container *ngFor=\"let row of data?.results\">\r\n <tbody [ngClass]=\"getRowClass(row)\">\r\n <tr>\r\n <td *ngFor=\"let column of getColumns()\" [ngClass]=\"column.columnClass\">\r\n <ng-container *ngIf=\"column.type == 'text'\">\r\n <span *ngIf=\"!column.cellDef\">{{getCellValue(row, column)}}</span>\r\n <ng-template *ngIf=\"column.cellDef\" [ngTemplateOutlet]=\"column.cellDef.template\" [ngTemplateOutletContext]=\"{$implicit : row}\"></ng-template>\r\n </ng-container>\r\n <asi-checkbox *ngIf=\"column.type == 'checkbox'\" [(ngModel)]=\"row.checked\" (onValueChange)=\"onChecked(row, column)\" [disabled]=\"column.disabledCheckbox && column.disabledCheckbox(row)\"></asi-checkbox>\r\n </td>\r\n </tr>\r\n <tr *ngFor=\"let inlineColumn of getInlineColumns()\" class=\"inlined\" [ngClass]=\"inlineColumn.columnClass\">\r\n <td *ngIf=\"inlineColumn.inliners.length == 0\" [attr.colspan]=\"getColumns().length\" class=\"inlined\">\r\n <span *ngIf=\"!inlineColumn.cellDef\">{{getCellValue(row, inlineColumn)}}</span>\r\n <ng-template *ngIf=\"inlineColumn.cellDef\" [ngTemplateOutlet]=\"inlineColumn.cellDef.template\" [ngTemplateOutletContext]=\"{$implicit : row}\"></ng-template>\r\n </td>\r\n <ng-container *ngIf=\"inlineColumn.inliners.length > 0\">\r\n <td *ngFor=\"let inliner of inlineColumn.inliners\" [attr.colspan]=\"inliner.colSpan\" [ngClass]=\"inliner.columnClass\">\r\n <span *ngIf=\"!inliner.cellDef\">{{getCellValue(row, inlineColumn)}}</span>\r\n <ng-template *ngIf=\"inliner.cellDef\" [ngTemplateOutlet]=\"inliner.cellDef.template\" [ngTemplateOutletContext]=\"{$implicit : row}\"></ng-template>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n </ng-container>\r\n</table>\r\n<asi-pagination *ngIf=\"data.paginate\" [nbElements]=\"data.totalPages\" [nbVisibleElements]=\"6\" [selectedPagination]=\"data.pageIndex\"\r\n (onPaginationChanged)=\"onPaginationChanged($event)\"></asi-pagination>\r\n" }] } ]; /** @nocollapse */ AsiTable.ctorParameters = () => [ { type: AsiPaginationService } ]; AsiTable.propDecorators = { queryColumns: [{ type: ContentChildren, args: [AsiTableColumn,] }], autoSort: [{ type: Input }], autoPaginate: [{ type: Input }], nbElementParPage: [{ type: Input }], selectionModel: [{ type: Input }], rowClass: [{ type: Input }], fireRefreshOnInit: [{ type: Input }], changePageOnTop: [{ type: Input }], onRequestData: [{ type: Input }], customSort: [{ type: Input }], topElement: [{ type: ViewChild, args: ['table',] }] }; if (false) { /** @type {?} */ AsiTable.prototype.queryColumns; /** * Sorte table automatically * @type {?} */ AsiTable.prototype.autoSort; /** * Auto paginate the table * @type {?} */ AsiTable.prototype.autoPaginate; /** * Nb element by page * @type {?} */ AsiTable.prototype.nbElementParPage; /** * Define a selection model * @type {?} */ AsiTable.prototype.selectionModel; /** * Use a ngClass expression to add a class on a row * @type {?} */ AsiTable.prototype.rowClass; /** * Will call onRequestData when init * @type {?} */ AsiTable.prototype.fireRefreshOnInit; /** * Focus to the top of the table when page chanched * @type {?} */ AsiTable.prototype.changePageOnTop; /** * (on init , on sort ( autoSort is false), on page changed (autoPaginate is false) * @type {?} */ AsiTable.prototype.onRequestData; /** * If this function is define it's used to define a custom sort on table * @type {?} */ AsiTable.prototype.customSort; /** @type {?} */ AsiTable.prototype.topElement; /** @type {?} */ AsiTable.prototype.columns; /** @type {?} */ AsiTable.prototype.data; /** @type {?} */ AsiTable.prototype.searchDone; /** @type {?} */ AsiTable.prototype.loading; /** @type {?} */ AsiTable.prototype.sortedColumn; /** @type {?} */ AsiTable.prototype.noPaginateResults; /** @type {?} */ AsiTable.prototype.allChecked; /** @type {?} */ AsiTable.prototype.requestDataSubcription; /** @type {?} */ AsiTable.prototype.paginateService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bhc2ktbmd0b29scy9saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9hc2ktdGFibGUvYXNpLXRhYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFvQixLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0SCxPQUFPLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7O0FBUTFDLE1BQU07Ozs7SUFrREosWUFBb0IsZUFBcUM7UUFBckMsb0JBQWUsR0FBZixlQUFlLENBQXNCOzs7O3dCQTdDckMsS0FBSzs7Ozs0QkFHRCxLQUFLOzs7O2dDQUdELEVBQUU7Ozs7OEJBR0osSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDOzs7O2lDQU1wQyxJQUFJOzs7OytCQUdOLEtBQUs7dUJBV3RCLElBQUksS0FBSyxFQUFrQjtvQkFFOUIsSUFBSSxZQUFZLEVBQUU7MEJBRVosS0FBSzt1QkFDUixLQUFLOzswQkFPRixLQUFLO0tBS2pCOzs7O0lBRUQsVUFBVTtRQUNSLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUN4QyxNQUFNLENBQUMsSUFBSSxDQUFD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QUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3FCQUM3QztpQkFDRjtnQkFDRCxNQUFNLENBQUMsWUFBWSxDQUFDO2FBQ3JCO1NBQ0Y7S0FDRjs7Ozs7SUFFTyxVQUFVLENBQUMsZUFBeUI7O1FBQzFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNuQixNQUFNLENBQUMsZUFBZSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLG1CQUFtQixDQUFDOzs7OztJQUczRixrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7U0FDMUIsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDcEI7S0FDRjs7O1lBcFZGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsV0FBVztnQkFDckIsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFO2dCQUM1QyxvOEZBQXVDO2FBQ3hDOzs7O1lBYlEsb0JBQW9COzs7MkJBZ0IxQixlQUFlLFNBQUMsY0FBYzt1QkFHOUIsS0FBSzsyQkFHTCxLQUFLOytCQUdMLEtBQUs7NkJBR0wsS0FBSzt1QkFHTCxLQUFLO2dDQUdMLEtBQUs7OEJBR0wsS0FBSzs0QkFJTCxLQUFLO3lCQUdMLEtBQUs7eUJBRUwsU0FBUyxTQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc2lQYWdpbmF0aW9uU2VydmljZSB9IGZyb20gJy4vLi4vLi4vc2VydmljZXMvYXNpLXBhZ2luYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEFzaVRhYmxlU2VsZWN0aW9uTW9kZWwgfSBmcm9tICcuL2FzaS10YWJsZS1jb25maWcnO1xyXG5pbXBvcnQgeyBBc2lUYWJsZVJlcXVlc3QgfSBmcm9tICcuL2FzaS10YWJsZS1yZXF1ZXN0JztcclxuaW1wb3J0IHsgQXNpVGFibGVEYXRhIH0gZnJvbSAnLi9hc2ktdGFibGUtZGF0YSc7XHJcbmltcG9ydCB7IEFzaVRhYmxlQ29sdW1uIH0gZnJvbSAnLi9hc2ktdGFibGUtY29sdW1uLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgUXVlcnlMaXN0LCBDb250ZW50Q2hpbGRyZW4sIEFmdGVyQ29udGVudEluaXQsIElucHV0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgbmggZnJvbSAnLi4vLi4vbmF0aXZlLWhlbHBlcic7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhc2ktdGFibGUnLFxyXG4gIGhvc3Q6IHsgJ2NsYXNzJzogJ2FzaS1jb21wb25lbnQgYXNpLXRhYmxlJyB9LFxyXG4gIHRlbXBsYXRlVXJsOiAnYXNpLXRhYmxlLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXNpVGFibGU8VD4gaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcclxuXHJcbiAgQENvbnRlbnRDaGlsZHJlbihBc2lUYWJsZUNvbHVtbikgcXVlcnlDb2x1bW5zOiBRdWVyeUxpc3Q8QXNpVGFibGVDb2x1bW4+O1xyXG5cclxuICAvKiogU29ydGUgdGFibGUgYXV0b21hdGljYWxseSAqL1xyXG4gIEBJbnB1dCgpIGF1dG9Tb3J0ID0gZmFsc2U7XHJcblxyXG4gIC8qKiBBdXRvIHBhZ2luYXRlIHRoZSB0YWJsZSAqL1xyXG4gIEBJbnB1dCgpIGF1dG9QYWdpbmF0ZSA9IGZhbHNlO1xyXG5cclxuICAvKiogTmIgZWxlbWVudCBieSBwYWdlICovXHJcbiAgQElucHV0KCkgbmJFbGVtZW50UGFyUGFnZSA9IDI1O1xyXG5cclxuICAvKiogRGVmaW5lIGEgc2VsZWN0aW9uIG1vZGVsICovXHJcbiAgQElucHV0KCkgc2VsZWN0aW9uTW9kZWwgPSBuZXcgQXNpVGFibGVTZWxlY3Rpb25Nb2RlbCgnaWQnLCBmYWxzZSk7XHJcblxyXG4gIC8qKiBVc2UgYSBuZ0NsYXNzIGV4cHJlc3Npb24gdG8gYWRkIGEgY2xhc3Mgb24gYSByb3cqL1xyXG4gIEBJbnB1dCgpIHJvd0NsYXNzOiBhbnk7XHJcblxyXG4gIC8qKiBXaWxsIGNhbGwgb25SZXF1ZXN0RGF0YSB3aGVuIGluaXQgKi9cclxuICBASW5wdXQoKSBmaXJlUmVmcmVzaE9uSW5pdCA9IHRydWU7XHJcblxyXG4gIC8qKiBGb2N1cyB0byB0aGUgdG9wIG9mIHRoZSB0YWJsZSB3aGVuIHBhZ2UgY2hhbmNoZWQgKi9cclxuICBASW5wdXQoKSBjaGFuZ2VQYWdlT25Ub3AgPSBmYWxzZTtcclxuXHJcbiAgLyoqIE1ldGhvZCBjYWxsZWQgd2hlbiB0YWJsZSB3aWxsIGFzayBmb3IgZGF0YSAqL1xyXG4gIC8qKiAob24gaW5pdCAsIG9uIHNvcnQgKCBhdXRvU29ydCBpcyBmYWxzZSksIG9uIHBhZ2UgY2hhbmdlZCAoYXV0b1BhZ2luYXRlIGlzIGZhbHNlKSAqL1xyXG4gIEBJbnB1dCgpIG9uUmVxdWVzdERhdGE6IEZ1bmN0aW9uO1xyXG5cclxuICAvKiogSWYgdGhpcyBmdW5jdGlvbiBpcyBkZWZpbmUgaXQncyB1c2VkIHRvIGRlZmluZSBhIGN1c3RvbSBzb3J0IG9uIHRhYmxlKi9cclxuICBASW5wdXQoKSBjdXN0b21Tb3J0OiBGdW5jdGlvbjtcclxuXHJcbiAgQFZpZXdDaGlsZCgndGFibGUnKSB0b3BFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICBjb2x1bW5zID0gbmV3IEFycmF5PEFzaVRhYmxlQ29sdW1uPigpO1xyXG5cclxuICBkYXRhID0gbmV3IEFzaVRhYmxlRGF0YSgpO1xyXG5cclxuICBzZWFyY2hEb25lID0gZmFsc2U7XHJcbiAgbG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICBzb3J0ZWRDb2x1bW46IEFzaVRhYmxlQ29sdW1uO1xyXG5cclxuICBub1BhZ2luYXRlUmVzdWx0czogQXJyYXk8VD47XHJcblxyXG4gIC8vIFNob3cgYWxsY2hlY2sgY2hlY2tib3ggYWxsY2hlY2tlZFxyXG4gIGFsbENoZWNrZWQgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSByZXF1ZXN0RGF0YVN1YmNyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcGFnaW5hdGVTZXJ2aWNlOiBBc2lQYWdpbmF0aW9uU2VydmljZSkge1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29sdW1ucygpIHtcclxuICAgIHJldHVybiBuaC5maWx0ZXIodGhpcy5jb2x1bW5zLCAoY29sdW1uKSA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmZpbHRyZUNvbHVtbihjb2x1bW4pICYmICFjb2x1bW4uaW5saW5lQ29sdW1uO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRJbmxpbmVDb2x1bW5zKCkge1xyXG4gICAgcmV0dXJuIG5oLmZpbHRlcih0aGlzLmNvbHVtbnMsIChjb2x1bW4pID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuZmlsdHJlQ29sdW1uKGNvbHVtbikgJiYgY29sdW1uLmlubGluZUNvbHVtbjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWx0cmVDb2x1bW4oY29sdW1uOiBBc2lUYWJsZUNvbHVtbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChjb2x1bW4uc2hvd0lmID09IG51bGwgfHwgY29sdW1uLnNob3dJZikgJiYgKGNvbHVtbi5oaWRlSWYgPT0gbnVsbCB8fCAhY29sdW1uLmhpZGVJZik7XHJcbiAgfVxyXG5cclxuICBnZXRIZWFkZXJDbGFzcyhjb2x1bW46IEFzaVRhYmxlQ29sdW1uKSB7XHJcbiAgICBsZXQgY29sdW1uQ2xhc3M6IGFueSA9IHt9O1xyXG4gICAgaWYgKGNvbHVtbi5jb2x1bW5DbGFzcykge1xyXG4gICAgICBpZiAoY29sdW1uLmNvbHVtbkNsYXNzIGluc3RhbmNlb2YgT2JqZWN0KSB7XHJcbiAgICAgICAgLy8gQ29weVxyXG4gICAgICAgIGNvbHVtbkNsYXNzID0geyAuLi5jb2x1bW4uY29sdW1uQ2xhc3MgfVxyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb2x1bW4uY29sdW1uQ2xhc3MgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29sdW1uQ2xhc3NbJycgKyBjb2x1bW4uY29sdW1uQ2xhc3NdID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29sdW1uQ2xhc3Muc29ydGFibGUgPSBjb2x1bW4uc29ydGFibGU7XHJcbiAgICBjb2x1bW5DbGFzcy5hc2MgPSBjb2x1bW4uYXNjO1xyXG4gICAgY29sdW1uQ2xhc3MuZGVzYyA9IGNvbHVtbi5hc2MgPT09IGZhbHNlO1xyXG4gICAgcmV0dXJuIGNvbHVtbkNsYXNzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZpcmVSZWZyZXNoKCkge1xyXG4gICAgdGhpcy5kYXRhLnBhZ2VJbmRleCA9IDE7XHJcbiAgICB0aGlzLnJlcXVlc3REYXRhKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlRGF0YShkYXRhOiBBc2lUYWJsZURhdGE8VD4pIHtcclxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICBpZiAodGhpcy5hdXRvUGFnaW5hdGUpIHtcclxuICAgICAgdGhpcy5ub1BhZ2luYXRlUmVzdWx0cyA9IGRhdGEucmVzdWx0cztcclxuICAgICAgdGhpcy5wYWdpbmF0ZURhdGFzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmluaXRDaGVja2JveCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYXV0b1NvcnQpIHtcclxuICAgICAgdGhpcy5zb3J0RGF0YXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uU29ydChjb2x1bW46IEFzaVRhYmxlQ29sdW1uKSB7XHJcbiAgICBpZiAoY29sdW1uLnNvcnRhYmxlKSB7XHJcblxyXG4gICAgICBpZiAodGhpcy5zb3J0ZWRDb2x1bW4gIT0gbnVsbCAmJiB0aGlzLnNvcnRlZENvbHVtbiAhPT0gY29sdW1uKSB7XHJcbiAgICAgICAgdGhpcy5zb3J0ZWRDb2x1bW4udW5zb3J0KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc29ydGVkQ29sdW1uID0gY29sdW1uO1xyXG4gICAgICBjb2x1bW4udG9nZ2xlU29ydCgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuYXV0b1NvcnQpIHtcclxuICAgICAgICB0aGlzLnNvcnREYXRhcygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVxdWVzdERhdGEoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25QYWdpbmF0aW9uQ2hhbmdlZChwYWdpbmF0aW9uOiBudW1iZXIpIHtcclxuICAgIHRoaXMuZGF0YS5wYWdlSW5kZXggPSBwYWdpbmF0aW9uO1xyXG4gICAgaWYgKHRoaXMuYXV0b1BhZ2luYXRlKSB7XHJcbiAgICAgIHRoaXMucGFnaW5hdGVEYXRhcygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZXF1ZXN0RGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoYW5nZVBhZ2VPblRvcCkge1xyXG4gICAgICB0aGlzLnRvcEVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYWdpbmF0ZURhdGFzKCkge1xyXG4gICAgdGhpcy5kYXRhLnJlc3VsdHMgPSB0aGlzLnBhZ2luYXRlU2VydmljZS5nZXRQYWdlKHRoaXMubm9QYWdpbmF0ZVJlc3VsdHMsIHRoaXMubmJFbGVtZW50UGFyUGFnZSwgdGhpcy5kYXRhLnBhZ2VJbmRleCk7XHJcbiAgICB0aGlzLmRhdGEudG90YWxQYWdlcyA9IHRoaXMucGFnaW5hdGVTZXJ2aWNlLmdldE5iUGFnZXModGhpcy5ub1BhZ2luYXRlUmVzdWx0cywgdGhpcy5uYkVsZW1lbnRQYXJQYWdlKTtcclxuICAgIHRoaXMuZGF0YS50b3RhbEVsZW1lbnRzID0gdGhpcy5ub1BhZ2luYXRlUmVzdWx0cy5sZW5ndGg7XHJcbiAgICB0aGlzLmluaXRDaGVja2JveCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXF1ZXN0RGF0YSgpIHtcclxuICAgIGxldCByZXF1ZXN0ID0gdGhpcy5nZXRBc2lUYWJsZVJlcXVlc3QoKTtcclxuICAgIGlmICh0aGlzLm9uUmVxdWVzdERhdGEpIHtcclxuICAgICAgaWYgKHRoaXMucmVxdWVzdERhdGFTdWJjcmlwdGlvbiAhPSBudWxsKSB7XHJcbiAgICAgICAgLy8gSWdub3JlIHByZXZpb3VzIHJlcXVlc3RcclxuICAgICAgICB0aGlzLnJlcXVlc3REYXRhU3ViY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJlcXVlc3REYXRhU3ViY3JpcHRpb24gPSBuaC5vYnNlcnZlKHRoaXMub25SZXF1ZXN0RGF0YShyZXF1ZXN0KSkuc3Vic2NyaWJlKChkYXRhOiBBc2lUYWJsZURhdGE8VD4pID0+IHtcclxuICAgICAgICB0aGlzLnVwZGF0ZURhdGEoZGF0YSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRBc2lUYWJsZVJlcXVlc3QoKTogQXNpVGFibGVSZXF1ZXN0IHtcclxuICAgIGxldCByZXF1ZXN0OiBBc2lUYWJsZVJlcXVlc3QgPSBuZXcgQXNpVGFibGVSZXF1ZXN0KCk7XHJcbiAgICByZXF1ZXN0LnBhZ2VJbmRleCA9IHRoaXMuZGF0YS5wYWdlSW5kZXg7XHJcbiAgICByZXF1ZXN0Lm5iRWxlbWVudHNQYXJQYWdlID0gdGhpcy5uYkVsZW1lbnRQYXJQYWdlO1xyXG4gICAgaWYgKHRoaXMuc29ydGVkQ29sdW1uICE9IG51bGwpIHtcclxuICAgICAgcmVxdWVzdC50cmkgPSB0aGlzLnNvcnRlZENvbHVtbi5nZXRTb3J0TmFtZSgpO1xyXG4gICAgICByZXF1ZXN0LmFzYyA9IHRoaXMuc29ydGVkQ29sdW1uLmdldEFzYygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcXVlc3Q7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNvcnREYXRhcygpIHtcclxuICAgIGlmICh0aGlzLnNvcnRlZENvbHVtbiAhPSBudWxsKSB7XHJcbiAgICAgIGlmICghdGhpcy5hdXRvUGFnaW5hdGUpIHtcclxuICAgICAgICB0aGlzLmRhdGEucmVzdWx0cyA9IHRoaXMuaW50ZXJuYWxTb3J0RGF0YSh0aGlzLmRhdGEucmVzdWx0cyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5ub1BhZ2luYXRlUmVzdWx0cyA9IHRoaXMuaW50ZXJuYWxTb3J0RGF0YSh0aGlzLm5vUGFnaW5hdGVSZXN1bHRzKTtcclxuICAgICAgICB0aGlzLnBhZ2luYXRlRGF0YXMoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZXJuYWxTb3J0RGF0YShkYXRhOiBhbnlbXSk6IGFueVtdIHtcclxuICAgIGNvbnN0IHNvcnRJbmZvcm1hdGlvbiA9IHtcclxuICAgICAgc29ydDogdGhpcy5zb3J0ZWRDb2x1bW4uZ2V0U29ydE5hbWUoKSxcclxuICAgICAgYXNjOiB0aGlzLnNvcnRlZENvbHVtbi5nZXRBc2MoKVxyXG4gICAgfTtcclxuICAgIGlmICh0aGlzLnNvcnRlZENvbHVtbi5jdXN0b21Tb3J0KSB7XHJcbiAgICAgIHRoaXMuc29ydGVkQ29sdW1uLmN1c3RvbVNvcnQoZGF0YSwgc29ydEluZm9ybWF0aW9uKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jdXN0b21Tb3J0KSB7XHJcbiAgICAgIHRoaXMuY3VzdG9tU29ydChkYXRhLCBzb3J0SW5mb3JtYXRpb24pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbmgub3JkZXJCeVdpdGhvdXRDYXNlKGRhdGEsIHRoaXMuc29ydGVkQ29sdW1uLmdldFNvcnROYW1lKCksXHJcbiAgICAgICAgdGhpcy5zb3J0ZWRDb2x1bW4uZ2V0QXNjKCkgPyAnYXNjJyA6ICdkZXNjJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YTtcclxuICB9XHJcblxyXG4gIC8qKiBSZWN1cGVyZSBsYSB2YWxldXIgw6AgYWZmaWNoZXIgcG91ciB1bmUgY2VsbHVsZSAqL1xyXG4gIGdldENlbGxWYWx1ZShyb3c6IFQsIGNvbHVtbjogQXNpVGFibGVDb2x1bW4pOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkocm93LCBjb2x1bW4ubmFtZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFByb3BlcnR5KG9iamVjdDogYW55LCBwYXRoOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgcmV0dXJuIG5oLmdldChvYmplY3QsIHBhdGgpO1xyXG4gIH1cclxuXHJcbiAgaW5pdENoZWNrYm94KCkge1xyXG4gICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT09ICdjaGVja2JveCcpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlbC5hbGxDaGVja2VkKSB7XHJcbiAgICAgICAgICAvLyBJZiB3ZSBhcmUgaW4gYWxsY2hlY2sgbW9kZSB3ZSB1bnNlbGVjdCBleGNsdWRlZCBsaW5lc1xyXG4gICAgICAgICAgbmguZm9yRWFjaCh0aGlzLmRhdGEucmVzdWx0cywgKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgaXRlbUlkID0gdGhpcy5nZXRQcm9wZXJ0eShpdGVtLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmNvbmZpZy5zZWxlY3Rpb25JZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGV4Y2x1ZGVkID0gbmguZmluZCh0aGlzLnNlbGVjdGlvbk1vZGVsLml0ZW1zRXhjbHVkZWQsIChleGNsdWRlZGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXRjaFJvdyhpdGVtSWQsIGV4Y2x1ZGVkaXRlbSk7XHJcbiAgICAgICAgICAgIH0pICE9IG51bGw7XHJcbiAgICAgICAgICAgIGl0ZW0uY2hlY2tlZCA9ICFleGNsdWRlZDtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBFbHNlIHdlIHNlbGVjdCBpbmNsdWRlZCBsaW5lc1xyXG4gICAgICAgICAgbmguZm9yRWFjaCh0aGlzLmRhdGEucmVzdWx0cywgKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgaXRlbUlkID0gdGhpcy5nZXRQcm9wZXJ0eShpdGVtLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmNvbmZpZy5zZWxlY3Rpb25JZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGluY2x1ZGVkID0gbmguZmluZCh0aGlzLnNlbGVjdGlvbk1vZGVsLml0ZW1zSW5jbHVkZWQsIChpbmNsdWRlZEl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXRjaFJvdyhpdGVtSWQsIGluY2x1ZGVkSXRlbSk7XHJcbiAgICAgICAgICAgIH0pICE9IG51bGw7XHJcbiAgICAgICAgICAgIGl0ZW0uY2hlY2tlZCA9IGluY2x1ZGVkO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uQWxsQ2hlY2tlZChjb2x1bW46IEFzaVRhYmxlQ29sdW1uKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLmFsbENoZWNrZWQgPSB0aGlzLmFsbENoZWNrZWQ7XHJcblxyXG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5pdGVtc0luY2x1ZGVkID0gW107XHJcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLml0ZW1zRXhjbHVkZWQgPSBbXTtcclxuXHJcbiAgICBsZXQgbmJJdGVtc1NlbGVjdGVkID0gMDtcclxuICAgIG5oLmZvckVhY2godGhpcy5kYXRhLnJlc3VsdHMsIChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCFjb2x1bW4uZGlzYWJsZWRDaGVja2JveCB8fCAhY29sdW1uLmRpc2FibGVkQ2hlY2tib3goZGF0YSkpIHtcclxuICAgICAgICBkYXRhLmNoZWNrZWQgPSB0aGlzLnNlbGVjdGlvbk1vZGVsLmFsbENoZWNrZWQ7XHJcbiAgICAgICAgbmJJdGVtc1NlbGVjdGVkKys7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5pdGVtc0luY2x1ZGVkLnB1c2goZGF0YSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5pdGVtc0V4Y2x1ZGVkLnB1c2goZGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGVsLmFsbENoZWNrZWQpIHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZWwuY29uZmlnLm11bHRpcGFnZSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwubmJJdGVtc1NlbGVjdGVkID0gdGhpcy5kYXRhLnRvdGFsRWxlbWVudHM7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5uYkl0ZW1zU2VsZWN0ZWQgPSBuYkl0ZW1zU2VsZWN0ZWQ7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwubmJJdGVtc1NlbGVjdGVkID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBjb2x1bW4ub25BbGxDaGVja2VkLmVtaXQodGhpcy5zZWxlY3Rpb25Nb2RlbC5hbGxDaGVja2VkKTtcclxuICB9XHJcblxyXG4gIG9uQ2hlY2tlZChyb3c6IGFueSwgY29sdW1uOiBBc2lUYWJsZUNvbHVtbik6IHZvaWQge1xyXG5cclxuICAgIGxldCByb3dJZCA9IHRoaXMuZ2V0UHJvcGVydHkocm93LCB0aGlzLnNlbGVjdGlvbk1vZGVsLmNvbmZpZy5zZWxlY3Rpb25JZCk7XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZWwuYWxsQ2hlY2tlZCkge1xyXG4gICAgICBpZiAocm93LmNoZWNrZWQpIHtcclxuICAgICAgICBuaC5yZW1vdmUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pdGVtc0V4Y2x1ZGVkLCAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hSb3cocm93SWQsIGl0ZW0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwubmJJdGVtc1NlbGVjdGVkKys7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5pdGVtc0V4Y2x1ZGVkLnB1c2gocm93KTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLm5iSXRlbXNTZWxlY3RlZC0tO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAocm93LmNoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLml0ZW1zSW5jbHVkZWQucHVzaChyb3cpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwubmJJdGVtc1NlbGVjdGVkKys7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbmgucmVtb3ZlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXRlbXNJbmNsdWRlZCwgKGl0ZW0pID0+IHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLm1hdGNoUm93KHJvd0lkLCBpdGVtKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLm5iSXRlbXNTZWxlY3RlZC0tO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29sdW1uLm9uQ2hlY2tlZC5lbWl0KHJvdyk7XHJcbiAgICB0aGlzLnVwZGF0ZUFsbENoZWNrZWQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWF0Y2hSb3cocm93SWQ6IGFueSwgcm93VG9NYXRjaDogYW55KSB7XHJcbiAgICByZXR1cm4gcm93SWQgPT09IHRoaXMuZ2V0UHJvcGVydHkocm93VG9NYXRjaCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5jb25maWcuc2VsZWN0aW9uSWQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVBbGxDaGVja2VkKCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZWwuY29uZmlnLm11bHRpcGFnZSkge1xyXG4gICAgICB0aGlzLmFsbENoZWNrZWQgPSB0aGlzLnNlbGVjdGlvbk1vZGVsLm5iSXRlbXNTZWxlY3RlZCA+IDBcclxuICAgICAgICAmJiB0aGlzLnNlbGVjdGlvbk1vZGVsLm5iSXRlbXNTZWxlY3RlZCA9PT0gdGhpcy5kYXRhLnRvdGFsRWxlbWVudHM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFsbENoZWNrZWQgPSB0aGlzLnNlbGVjdGlvbk1vZGVsLm5iSXRlbXNTZWxlY3RlZCA+IDBcclxuICAgICAgICAmJiB0aGlzLnNlbGVjdGlvbk1vZGVsLm5iSXRlbXNTZWxlY3RlZCA9PT0gdGhpcy5kYXRhLnJlc3VsdHMubGVuZ3RoO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0Um93Q2xhc3Mocm93OiBUKSB7XHJcbiAgICBpZiAocm93ICE9IG51bGwgJiYgdGhpcy5yb3dDbGFzcyAhPSBudWxsKSB7XHJcbiAgICAgIGlmICh0aGlzLmlzRnVuY3Rpb24odGhpcy5yb3dDbGFzcykpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yb3dDbGFzcyhyb3cpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCByb3dDbGFzc1N0ciA9IEpTT04uc3RyaW5naWZ5KHRoaXMucm93Q2xhc3MpO1xyXG4gICAgICAgIHJvd0NsYXNzU3RyID0gbmgucmVwbGFjZShyb3dDbGFzc1N0ciwgbmV3IFJlZ0V4cCgne3Jvd30nLCAnZycpLCAncm93Jyk7XHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnF1b3RlbWFya1xyXG4gICAgICAgIHJvd0NsYXNzU3RyID0gbmgucmVwbGFjZShyb3dDbGFzc1N0ciwgbmV3IFJlZ0V4cChcIidcIiwgJ2cnKSwgJ1wiJyk7XHJcbiAgICAgICAgbGV0IGpzb25Sb3dDbGFzczogYW55ID0gSlNPTi5wYXJzZShyb3dDbGFzc1N0cik7XHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGpzb25Sb3dDbGFzcykge1xyXG4gICAgICAgICAgaWYgKGpzb25Sb3dDbGFzcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1ldmFsXHJcbiAgICAgICAgICAgIGpzb25Sb3dDbGFzc1trZXldID0gZXZhbChqc29uUm93Q2xhc3Nba2V5XSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqc29uUm93Q2xhc3M7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNGdW5jdGlvbihmdW5jdGlvblRvQ2hlY2s6IEZ1bmN0aW9uKSB7XHJcbiAgICBjb25zdCBnZXRUeXBlID0ge307XHJcbiAgICByZXR1cm4gZnVuY3Rpb25Ub0NoZWNrICYmIGdldFR5cGUudG9TdHJpbmcuY2FsbChmdW5jdGlvblRvQ2hlY2spID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xyXG4gICAgdGhpcy5xdWVyeUNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICB0aGlzLmNvbHVtbnMucHVzaChjb2x1bW4pXHJcbiAgICB9KTtcclxuICAgIGlmICh0aGlzLmZpcmVSZWZyZXNoT25Jbml0KSB7XHJcbiAgICAgIHRoaXMucmVxdWVzdERhdGEoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19