UNPKG

right-angled

Version:

Lightweight and easy to use angular data grids. Integrates with your markup and styles rather than generating its own.

165 lines 19.6 kB
import { __decorate } from "tslib"; import { Injectable } from '@angular/core'; import { filter } from '../../filters/filter.annotation'; import { BehaviorSubject } from 'rxjs'; import * as i0 from "@angular/core"; /** * Implements {@link Pager} contract and represents buffered list behavior. * @note This type is configured to use with {@link FiltersService}. */ export class RTBufferedPager { constructor() { /** * @inheritdoc */ this.appendedOnLoad = true; /** * @inheritdoc */ this.totalCount = 0; /** * @inheritdoc */ this.loadedCount = 0; /** * This is both initial value and value which will be applied to {@link takeRowCount} property on {@link reset} method execution. */ this.defaultRowCount = RTBufferedPager.settings.defaultRowCount; /** * The smallest value that can be applied to {@link takeRowCount} property. */ this.minRowCount = RTBufferedPager.settings.minRowCount; /** * The biggest value that can be applied to {@link takeRowCount} property. */ this.maxRowCount = RTBufferedPager.settings.maxRowCount; /** * This property is applied to the server request and it specifies how many rows are already loaded and must be skipped on next request. * * @note This property is ready to use with {@link FiltersService} since it has {@link filter} annotation. * @see {@link BufferedListRequest.skip} */ this.skip = 0; this.takeRowCount$ = new BehaviorSubject(RTBufferedPager.settings.defaultRowCount); this.handlesFlatResponse = false; this.lastChunkRecieved = null; } /** * Global settings for properties such as default values and constraints for pager properties. * * These settings are static and their values are copied to the properties of the same name for each instance of {@link RTBufferedPager} type. * * So, changing of this settings will affect all instances of {@link RTBufferedPager} type that will be created after such changes. * If you want to change settings of concrete object you can use it the same name properties. */ // tslint:disable-next-line: typedef static { this.settings = { /** * @see {@link RTBufferedPager.defaultRowCount} */ defaultRowCount: 20, /** * @see {@link RTBufferedPager.maxRowCount} */ maxRowCount: 200, /** * @see {@link RTBufferedPager.minRowCount} */ minRowCount: 1 }; } /** * This property is applied to the server request and it specifies how many rows must be loaded on next request. * @note This property is ready to use with {@link FiltersService} since it has {@link filter} annotation. * @see {@link BufferedListRequest.take} */ get takeRowCount() { return this.takeRowCount$.getValue(); } /** * Executes several checks. For example, it doesn't accept values bigger than {@link maxRowCount}. */ set takeRowCount(value) { const valueStr = (value + '').replace(/[^0-9]/g, ''); let rowCount = parseInt(valueStr, 10) ? parseInt(valueStr, 10) : this.defaultRowCount; if (rowCount < this.minRowCount) { rowCount = this.defaultRowCount; } if (rowCount > this.maxRowCount) { rowCount = this.maxRowCount; } if (this.totalCount !== 0) { if (this.skip + rowCount > this.totalCount) { rowCount = this.totalCount - this.skip; } } this.takeRowCount$.next(rowCount); } /** * Returns `true` if it's possible to load more records (e.g. currently not all records loaded to the list). */ get canLoadMore() { return this.totalCount !== 0 && this.handlesFlatResponse ? !this.lastChunkRecieved : this.skip < this.totalCount; } /** * @inheritdoc */ processResponse(response) { let alignedResponse; if (Array.isArray(response)) { this.handlesFlatResponse = true; alignedResponse = { items: response, loadedCount: response.length, totalCount: response.length }; } else { this.handlesFlatResponse = false; alignedResponse = response; } this.totalCount = alignedResponse.totalCount || 0; const lastLoadedCount = alignedResponse.loadedCount || (alignedResponse.items && alignedResponse.items.length ? alignedResponse.items.length : 0); this.lastChunkRecieved = lastLoadedCount !== this.takeRowCount$.getValue(); this.skip = this.skip + lastLoadedCount; this.loadedCount = this.skip; } /** * @inheritdoc */ reset() { this.totalCount = 0; this.loadedCount = 0; this.takeRowCount = this.defaultRowCount; this.skip = 0; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RTBufferedPager, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RTBufferedPager }); } } __decorate([ filter({ defaultValue: 0, parameterName: 'skip', parseFormatter() { return 0; } }) ], RTBufferedPager.prototype, "skip", void 0); __decorate([ filter({ defaultValue() { return this.defaultRowCount; }, parameterName: 'take', parseFormatter(rawValue, allValues) { let result; if (allValues && !isNaN(allValues.skip) && !isNaN(allValues.take)) { result = (allValues.skip || 0) + (allValues.take || 0); } return result || this.defaultRowCount; } }) ], RTBufferedPager.prototype, "takeRowCount$", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RTBufferedPager, decorators: [{ type: Injectable }], propDecorators: { skip: [], takeRowCount$: [] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVmZmVyZWQtcGFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaWdodC1hbmdsZWQvc3JjL2xpYi9saXN0cy9wcm92aWRlcnMvYnVmZmVyZWQtcGFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR3pELE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7O0FBRW5EOzs7R0FHRztBQUVILE1BQU0sT0FBTyxlQUFlO0lBRDVCO1FBeUJJOztXQUVHO1FBQ0ksbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFDN0I7O1dBRUc7UUFDSSxlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCOztXQUVHO1FBQ0ksZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFDdkI7O1dBRUc7UUFDSSxvQkFBZSxHQUFXLGVBQWUsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQzFFOztXQUVHO1FBQ0ksZ0JBQVcsR0FBVyxlQUFlLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUNsRTs7V0FFRztRQUNJLGdCQUFXLEdBQVcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDbEU7Ozs7O1dBS0c7UUFRSSxTQUFJLEdBQUcsQ0FBQyxDQUFDO1FBY1Qsa0JBQWEsR0FBdUIsSUFBSSxlQUFlLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqRyx3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDNUIsc0JBQWlCLEdBQVksSUFBSSxDQUFDO0tBbUU3QztJQS9JRzs7Ozs7OztPQU9HO0lBQ0gsb0NBQW9DO2FBQ3RCLGFBQVEsR0FBRztRQUNyQjs7V0FFRztRQUNILGVBQWUsRUFBRSxFQUFFO1FBQ25COztXQUVHO1FBQ0gsV0FBVyxFQUFF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QztRQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDekMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDbEIsQ0FBQzsrR0EvSVEsZUFBZTttSEFBZixlQUFlOztBQTZEakI7SUFQTixNQUFNLENBQUM7UUFDSixZQUFZLEVBQUUsQ0FBQztRQUNmLGFBQWEsRUFBRSxNQUFNO1FBQ3JCLGNBQWM7WUFDVixPQUFPLENBQUMsQ0FBQztRQUNiLENBQUM7S0FDWSxDQUFDOzZDQUNGO0FBY1Q7SUFiTixNQUFNLENBQUM7UUFDSixZQUFZO1lBQ1IsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ2hDLENBQUM7UUFDRCxhQUFhLEVBQUUsTUFBTTtRQUNyQixjQUFjLENBQXdCLFFBQWEsRUFBRSxTQUFjO1lBQy9ELElBQUksTUFBTSxDQUFDO1lBQ1gsSUFBSSxTQUFTLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDL0QsTUFBTSxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDMUQ7WUFDRCxPQUFPLE1BQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzFDLENBQUM7S0FDWSxDQUFDO3NEQUN1Rjs0RkEzRWhHLGVBQWU7a0JBRDNCLFVBQVU7OEJBOERBLElBQUksTUFjSixhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQYWdlciB9IGZyb20gJy4uLy4uL2NvcmUvcGFnZXInO1xyXG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICcuLi8uLi9maWx0ZXJzL2ZpbHRlci5hbm5vdGF0aW9uJztcclxuaW1wb3J0IHsgRmlsdGVyQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29yZS9maWx0ZXItY29uZmlnJztcclxuaW1wb3J0IHsgTGlzdFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vY29yZS9saXN0LXJlc3BvbnNlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG4vKipcclxuICogSW1wbGVtZW50cyB7QGxpbmsgUGFnZXJ9IGNvbnRyYWN0IGFuZCByZXByZXNlbnRzIGJ1ZmZlcmVkIGxpc3QgYmVoYXZpb3IuXHJcbiAqIEBub3RlIFRoaXMgdHlwZSBpcyBjb25maWd1cmVkIHRvIHVzZSB3aXRoIHtAbGluayBGaWx0ZXJzU2VydmljZX0uXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBSVEJ1ZmZlcmVkUGFnZXIgaW1wbGVtZW50cyBQYWdlciB7XHJcbiAgICAvKipcclxuICAgICAqIEdsb2JhbCBzZXR0aW5ncyBmb3IgcHJvcGVydGllcyBzdWNoIGFzIGRlZmF1bHQgdmFsdWVzIGFuZCBjb25zdHJhaW50cyBmb3IgcGFnZXIgcHJvcGVydGllcy5cclxuICAgICAqXHJcbiAgICAgKiBUaGVzZSBzZXR0aW5ncyBhcmUgc3RhdGljIGFuZCB0aGVpciB2YWx1ZXMgYXJlIGNvcGllZCB0byB0aGUgcHJvcGVydGllcyBvZiB0aGUgc2FtZSBuYW1lIGZvciBlYWNoIGluc3RhbmNlIG9mIHtAbGluayBSVEJ1ZmZlcmVkUGFnZXJ9IHR5cGUuXHJcbiAgICAgKlxyXG4gICAgICogU28sIGNoYW5naW5nIG9mIHRoaXMgc2V0dGluZ3Mgd2lsbCBhZmZlY3QgYWxsIGluc3RhbmNlcyBvZiB7QGxpbmsgUlRCdWZmZXJlZFBhZ2VyfSB0eXBlIHRoYXQgd2lsbCBiZSBjcmVhdGVkIGFmdGVyIHN1Y2ggY2hhbmdlcy5cclxuICAgICAqIElmIHlvdSB3YW50IHRvIGNoYW5nZSBzZXR0aW5ncyBvZiBjb25jcmV0ZSBvYmplY3QgeW91IGNhbiB1c2UgaXQgdGhlIHNhbWUgbmFtZSBwcm9wZXJ0aWVzLlxyXG4gICAgICovXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHR5cGVkZWZcclxuICAgIHB1YmxpYyBzdGF0aWMgc2V0dGluZ3MgPSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHNlZSB7QGxpbmsgUlRCdWZmZXJlZFBhZ2VyLmRlZmF1bHRSb3dDb3VudH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBkZWZhdWx0Um93Q291bnQ6IDIwLFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBzZWUge0BsaW5rIFJUQnVmZmVyZWRQYWdlci5tYXhSb3dDb3VudH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBtYXhSb3dDb3VudDogMjAwLFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBzZWUge0BsaW5rIFJUQnVmZmVyZWRQYWdlci5taW5Sb3dDb3VudH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBtaW5Sb3dDb3VudDogMVxyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogQGluaGVyaXRkb2NcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFwcGVuZGVkT25Mb2FkID0gdHJ1ZTtcclxuICAgIC8qKlxyXG4gICAgICogQGluaGVyaXRkb2NcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvdGFsQ291bnQgPSAwO1xyXG4gICAgLyoqXHJcbiAgICAgKiBAaW5oZXJpdGRvY1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbG9hZGVkQ291bnQgPSAwO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIGJvdGggaW5pdGlhbCB2YWx1ZSBhbmQgdmFsdWUgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIHtAbGluayB0YWtlUm93Q291bnR9IHByb3BlcnR5IG9uIHtAbGluayByZXNldH0gbWV0aG9kIGV4ZWN1dGlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlZmF1bHRSb3dDb3VudDogbnVtYmVyID0gUlRCdWZmZXJlZFBhZ2VyLnNldHRpbmdzLmRlZmF1bHRSb3dDb3VudDtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNtYWxsZXN0IHZhbHVlIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8ge0BsaW5rIHRha2VSb3dDb3VudH0gcHJvcGVydHkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtaW5Sb3dDb3VudDogbnVtYmVyID0gUlRCdWZmZXJlZFBhZ2VyLnNldHRpbmdzLm1pblJvd0NvdW50O1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYmlnZ2VzdCB2YWx1ZSB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIHtAbGluayB0YWtlUm93Q291bnR9IHByb3BlcnR5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWF4Um93Q291bnQ6IG51bWJlciA9IFJUQnVmZmVyZWRQYWdlci5zZXR0aW5ncy5tYXhSb3dDb3VudDtcclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBwcm9wZXJ0eSBpcyBhcHBsaWVkIHRvIHRoZSBzZXJ2ZXIgcmVxdWVzdCBhbmQgaXQgc3BlY2lmaWVzIGhvdyBtYW55IHJvd3MgYXJlIGFscmVhZHkgbG9hZGVkIGFuZCBtdXN0IGJlIHNraXBwZWQgb24gbmV4dCByZXF1ZXN0LlxyXG4gICAgICpcclxuICAgICAqIEBub3RlIFRoaXMgcHJvcGVydHkgaXMgcmVhZHkgdG8gdXNlIHdpdGgge0BsaW5rIEZpbHRlcnNTZXJ2aWNlfSBzaW5jZSBpdCBoYXMge0BsaW5rIGZpbHRlcn0gYW5ub3RhdGlvbi5cclxuICAgICAqIEBzZWUge0BsaW5rIEJ1ZmZlcmVkTGlzdFJlcXVlc3Quc2tpcH1cclxuICAgICAqL1xyXG4gICAgQGZpbHRlcih7XHJcbiAgICAgICAgZGVmYXVsdFZhbHVlOiAwLFxyXG4gICAgICAgIHBhcmFtZXRlck5hbWU6ICdza2lwJyxcclxuICAgICAgICBwYXJzZUZvcm1hdHRlcigpOiBudW1iZXIge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9IGFzIEZpbHRlckNvbmZpZylcclxuICAgIHB1YmxpYyBza2lwID0gMDtcclxuICAgIEBmaWx0ZXIoe1xyXG4gICAgICAgIGRlZmF1bHRWYWx1ZSh0aGlzOiBSVEJ1ZmZlcmVkUGFnZXIpOiBudW1iZXIge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0Um93Q291bnQ7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBwYXJhbWV0ZXJOYW1lOiAndGFrZScsXHJcbiAgICAgICAgcGFyc2VGb3JtYXR0ZXIodGhpczogUlRCdWZmZXJlZFBhZ2VyLCByYXdWYWx1ZTogYW55LCBhbGxWYWx1ZXM6IGFueSk6IG51bWJlciB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQ7XHJcbiAgICAgICAgICAgIGlmIChhbGxWYWx1ZXMgJiYgIWlzTmFOKGFsbFZhbHVlcy5za2lwKSAmJiAhaXNOYU4oYWxsVmFsdWVzLnRha2UpKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAoYWxsVmFsdWVzLnNraXAgfHwgMCkgKyAoYWxsVmFsdWVzLnRha2UgfHwgMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCB8fCB0aGlzLmRlZmF1bHRSb3dDb3VudDtcclxuICAgICAgICB9XHJcbiAgICB9IGFzIEZpbHRlckNvbmZpZylcclxuICAgIHB1YmxpYyB0YWtlUm93Q291bnQkOiBPYnNlcnZhYmxlPG51bWJlcj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFJUQnVmZmVyZWRQYWdlci5zZXR0aW5ncy5kZWZhdWx0Um93Q291bnQpO1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVzRmxhdFJlc3BvbnNlID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGxhc3RDaHVua1JlY2lldmVkOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBwcm9wZXJ0eSBpcyBhcHBsaWVkIHRvIHRoZSBzZXJ2ZXIgcmVxdWVzdCBhbmQgaXQgc3BlY2lmaWVzIGhvdyBtYW55IHJvd3MgbXVzdCBiZSBsb2FkZWQgb24gbmV4dCByZXF1ZXN0LlxyXG4gICAgICogQG5vdGUgVGhpcyBwcm9wZXJ0eSBpcyByZWFkeSB0byB1c2Ugd2l0aCB7QGxpbmsgRmlsdGVyc1NlcnZpY2V9IHNpbmNlIGl0IGhhcyB7QGxpbmsgZmlsdGVyfSBhbm5vdGF0aW9uLlxyXG4gICAgICogQHNlZSB7QGxpbmsgQnVmZmVyZWRMaXN0UmVxdWVzdC50YWtlfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHRha2VSb3dDb3VudCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiAodGhpcy50YWtlUm93Q291bnQkIGFzIEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KS5nZXRWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBFeGVjdXRlcyBzZXZlcmFsIGNoZWNrcy4gRm9yIGV4YW1wbGUsIGl0IGRvZXNuJ3QgYWNjZXB0IHZhbHVlcyBiaWdnZXIgdGhhbiB7QGxpbmsgbWF4Um93Q291bnR9LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IHRha2VSb3dDb3VudCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWVTdHIgPSAodmFsdWUgKyAnJykucmVwbGFjZSgvW14wLTldL2csICcnKTtcclxuICAgICAgICBsZXQgcm93Q291bnQgPSBwYXJzZUludCh2YWx1ZVN0ciwgMTApID8gcGFyc2VJbnQodmFsdWVTdHIsIDEwKSA6IHRoaXMuZGVmYXVsdFJvd0NvdW50O1xyXG4gICAgICAgIGlmIChyb3dDb3VudCA8IHRoaXMubWluUm93Q291bnQpIHtcclxuICAgICAgICAgICAgcm93Q291bnQgPSB0aGlzLmRlZmF1bHRSb3dDb3VudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJvd0NvdW50ID4gdGhpcy5tYXhSb3dDb3VudCkge1xyXG4gICAgICAgICAgICByb3dDb3VudCA9IHRoaXMubWF4Um93Q291bnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnRvdGFsQ291bnQgIT09IDApIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2tpcCArIHJvd0NvdW50ID4gdGhpcy50b3RhbENvdW50KSB7XHJcbiAgICAgICAgICAgICAgICByb3dDb3VudCA9IHRoaXMudG90YWxDb3VudCAtIHRoaXMuc2tpcDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAodGhpcy50YWtlUm93Q291bnQkIGFzIEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KS5uZXh0KHJvd0NvdW50KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgaXQncyBwb3NzaWJsZSB0byBsb2FkIG1vcmUgcmVjb3JkcyAoZS5nLiBjdXJyZW50bHkgbm90IGFsbCByZWNvcmRzIGxvYWRlZCB0byB0aGUgbGlzdCkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY2FuTG9hZE1vcmUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudG90YWxDb3VudCAhPT0gMCAmJiB0aGlzLmhhbmRsZXNGbGF0UmVzcG9uc2UgPyAhdGhpcy5sYXN0Q2h1bmtSZWNpZXZlZCA6IHRoaXMuc2tpcCA8IHRoaXMudG90YWxDb3VudDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQGluaGVyaXRkb2NcclxuICAgICAqL1xyXG4gICAgcHVibGljIHByb2Nlc3NSZXNwb25zZShyZXNwb25zZTogTGlzdFJlc3BvbnNlPGFueT4gfCBhbnlbXSk6IHZvaWQge1xyXG4gICAgICAgIGxldCBhbGlnbmVkUmVzcG9uc2U6IExpc3RSZXNwb25zZTxhbnk+O1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3BvbnNlKSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZXNGbGF0UmVzcG9uc2UgPSB0cnVlO1xyXG4gICAgICAgICAgICBhbGlnbmVkUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtczogcmVzcG9uc2UsXHJcbiAgICAgICAgICAgICAgICBsb2FkZWRDb3VudDogcmVzcG9uc2UubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgdG90YWxDb3VudDogcmVzcG9uc2UubGVuZ3RoXHJcbiAgICAgICAgICAgIH0gYXMgTGlzdFJlc3BvbnNlPGFueT47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVzRmxhdFJlc3BvbnNlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGFsaWduZWRSZXNwb25zZSA9IHJlc3BvbnNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRvdGFsQ291bnQgPSBhbGlnbmVkUmVzcG9uc2UudG90YWxDb3VudCB8fCAwO1xyXG4gICAgICAgIGNvbnN0IGxhc3RMb2FkZWRDb3VudCA9IGFsaWduZWRSZXNwb25zZS5sb2FkZWRDb3VudCB8fCAoYWxpZ25lZFJlc3BvbnNlLml0ZW1zICYmIGFsaWduZWRSZXNwb25zZS5pdGVtcy5sZW5ndGggPyBhbGlnbmVkUmVzcG9uc2UuaXRlbXMubGVuZ3RoIDogMCk7XHJcblxyXG4gICAgICAgIHRoaXMubGFzdENodW5rUmVjaWV2ZWQgPSBsYXN0TG9hZGVkQ291bnQgIT09ICh0aGlzLnRha2VSb3dDb3VudCQgYXMgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4pLmdldFZhbHVlKCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2tpcCA9IHRoaXMuc2tpcCArIGxhc3RMb2FkZWRDb3VudDtcclxuICAgICAgICB0aGlzLmxvYWRlZENvdW50ID0gdGhpcy5za2lwO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAaW5oZXJpdGRvY1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy50b3RhbENvdW50ID0gMDtcclxuICAgICAgICB0aGlzLmxvYWRlZENvdW50ID0gMDtcclxuICAgICAgICB0aGlzLnRha2VSb3dDb3VudCA9IHRoaXMuZGVmYXVsdFJvd0NvdW50O1xyXG4gICAgICAgIHRoaXMuc2tpcCA9IDA7XHJcbiAgICB9XHJcbn1cclxuIl19