UNPKG

@petkit/ngx-table-descartes

Version:
165 lines (158 loc) 14.7 kB
import { __read, __spread } from 'tslib'; import { Component, Input, NgModule } from '@angular/core'; import { groupBy, keys, values, orderBy, isArray } from 'lodash-es'; import { of, combineLatest } from 'rxjs'; import { CommonModule } from '@angular/common'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var TableDescartesComponent = /** @class */ (function () { function TableDescartesComponent() { this.data = of([]); this.order = of(null); this.table = []; } /** * @return {?} */ TableDescartesComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; combineLatest([ this.data, this.order, ]).subscribe(function (_a) { var _b = __read(_a, 2), data = _b[0], order = _b[1]; if (!isArray(data)) { return; } /** @type {?} */ var _order = order || (data[0] && keys(data[0]) || null); _this._order = _order; if (!isArray(_order)) { return; } /** @type {?} */ var orderData = orderBy(data, _order); _this.orderData = orderData; /** @type {?} */ var aoaData = _this.getAoA(orderData, _order); _this.aoaData = aoaData; _this.table = _this.format(aoaData); }); }; /** * @param {?} AoO * @param {?} order * @return {?} */ TableDescartesComponent.prototype.getAoA = /** * @param {?} AoO * @param {?} order * @return {?} */ function (AoO, order) { return AoO.map(function (row) { return order.map(function (key) { return row[key]; }).filter(function (key) { return key !== undefined; }); }); }; /** * @param {?} data * @return {?} */ TableDescartesComponent.prototype.format = /** * @param {?} data * @return {?} */ function (data) { var _this = this; if (!isArray(data) || data.length === 0) { return []; } if (!isArray(data[0]) || data[0].length === 0) { return []; } /** @type {?} */ var groupDatas = groupBy(data, function (row) { return row[0]; }); /** @type {?} */ var result = values(groupDatas).map(function (groupData) { /** @type {?} */ var _data = []; /** @type {?} */ var firstCols = []; /** @type {?} */ var nextResult; groupData.forEach(function (_a) { var _b = __read(_a), col = _b[0], row = _b.slice(1); firstCols.push(col); _data.push(row); }); /** @type {?} */ var firstCol = { content: firstCols[0], rowspan: firstCols.length, key: _this._order ? _this._order[_this._order.length - _data[0].length - 1] : null, }; /** @type {?} */ var next = _this.format(_data); if (next.length) { next[0].unshift(firstCol); nextResult = next; } else { var _a = __read(firstCols), leaves = _a.slice(1); nextResult = __spread([[firstCol]], leaves.map(function () { return []; })); } return nextResult; }).reduce(function (a, b) { return a.concat(b); }, []); return result; }; TableDescartesComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-table-descartes', template: "<table class=\"ngx-table-descartes__table\">\n <ng-content></ng-content>\n <tbody>\n <tr *ngFor=\"let row of table; index as i;\">\n <td class=\"ngx-table-descartes__td\" *ngFor=\"let cell of row\" [attr.rowspan]=\"cell.rowspan\">\n <ng-container *ngIf=\"tpl\">\n <ng-container *ngTemplateOutlet=\"tpl; context: {cell: cell, row: aoaData[i], obj: orderData[i]};\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!tpl\">{{cell.content}}</ng-container>\n </td>\n </tr>\n </tbody>\n</table>\n\n\n", styles: [".ngx-table-descartes__table{border-collapse:collapse;width:100%;text-align:center;vertical-align:middle}.ngx-table-descartes__td{border:1px solid #bfbfbf}"] },] }, ]; /** @nocollapse */ TableDescartesComponent.ctorParameters = function () { return []; }; TableDescartesComponent.propDecorators = { data: [{ type: Input }], order: [{ type: Input }], tpl: [{ type: Input }] }; return TableDescartesComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var TableDescartesModule = /** @class */ (function () { function TableDescartesModule() { } TableDescartesModule.decorators = [ { type: NgModule, args: [{ imports: [ CommonModule ], declarations: [TableDescartesComponent], exports: [TableDescartesComponent] },] }, ]; return TableDescartesModule; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ export { TableDescartesModule, TableDescartesComponent as ɵa }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGV0a2l0LW5neC10YWJsZS1kZXNjYXJ0ZXMuanMubWFwIiwic291cmNlcyI6WyJuZzovL0BwZXRraXQvbmd4LXRhYmxlLWRlc2NhcnRlcy90YWJsZS1kZXNjYXJ0ZXMvdGFibGUtZGVzY2FydGVzLmNvbXBvbmVudC50cyIsIm5nOi8vQHBldGtpdC9uZ3gtdGFibGUtZGVzY2FydGVzL3RhYmxlLWRlc2NhcnRlcy90YWJsZS1kZXNjYXJ0ZXMubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBJbnB1dCxcbiAgVGVtcGxhdGVSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgZ3JvdXBCeSxcbiAga2V5cyxcbiAgdmFsdWVzLFxuICBvcmRlckJ5LFxuICBpc0FycmF5LFxufSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHtcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIGNvbWJpbmVMYXRlc3QsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgSVRhYmxlRGVzY2FydGVzVGFibGUsXG59IGZyb20gJy4vdGFibGUtZGVzY2FydGVzLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC10YWJsZS1kZXNjYXJ0ZXMnLFxuICB0ZW1wbGF0ZTogYDx0YWJsZSBjbGFzcz1cIm5neC10YWJsZS1kZXNjYXJ0ZXNfX3RhYmxlXCI+XG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPHRib2R5PlxuICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHRhYmxlOyBpbmRleCBhcyBpO1wiPlxuICAgICAgPHRkIGNsYXNzPVwibmd4LXRhYmxlLWRlc2NhcnRlc19fdGRcIiAqbmdGb3I9XCJsZXQgY2VsbCBvZiByb3dcIiBbYXR0ci5yb3dzcGFuXT1cImNlbGwucm93c3BhblwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidHBsXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRwbDsgY29udGV4dDoge2NlbGw6IGNlbGwsIHJvdzogYW9hRGF0YVtpXSwgb2JqOiBvcmRlckRhdGFbaV19O1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0cGxcIj57e2NlbGwuY29udGVudH19PC9uZy1jb250YWluZXI+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gIDwvdGJvZHk+XG48L3RhYmxlPlxuXG5cbmAsXG4gIHN0eWxlczogW2Aubmd4LXRhYmxlLWRlc2NhcnRlc19fdGFibGV7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO3dpZHRoOjEwMCU7dGV4dC1hbGlnbjpjZW50ZXI7dmVydGljYWwtYWxpZ246bWlkZGxlfS5uZ3gtdGFibGUtZGVzY2FydGVzX190ZHtib3JkZXI6MXB4IHNvbGlkICNiZmJmYmZ9YF1cbn0pXG5leHBvcnQgY2xhc3MgVGFibGVEZXNjYXJ0ZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKVxuICBkYXRhOiBPYnNlcnZhYmxlPHtba2V5OiBzdHJpbmddOiBzdHJpbmd9W10+ID0gb2YoW10pO1xuICBASW5wdXQoKVxuICBvcmRlcjogT2JzZXJ2YWJsZTxzdHJpbmdbXSB8IG51bGw+ID0gb2YobnVsbCk7XG4gIHByaXZhdGUgX29yZGVyOiBzdHJpbmdbXSB8IG51bGw7XG4gIEBJbnB1dCgpXG4gIHRwbDogVGVtcGxhdGVSZWY8YW55PjtcblxuXG4gIG9yZGVyRGF0YToge1trZXk6IHN0cmluZ106IHN0cmluZ31bXVtdO1xuICBhb2FEYXRhOiBzdHJpbmdbXVtdO1xuICB0YWJsZTogSVRhYmxlRGVzY2FydGVzVGFibGVbXVtdID0gW107XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuZGF0YSxcbiAgICAgIHRoaXMub3JkZXIsXG4gICAgXSkuc3Vic2NyaWJlKChbZGF0YSwgb3JkZXJdKSA9PiB7XG4gICAgICBpZiAoIWlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBfb3JkZXIgPSBvcmRlciB8fCAoZGF0YVswXSAmJiBrZXlzKGRhdGFbMF0pIHx8IG51bGwpO1xuICAgICAgdGhpcy5fb3JkZXIgPSBfb3JkZXI7XG4gICAgICBpZiAoIWlzQXJyYXkoX29yZGVyKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9yZGVyRGF0YSA9IG9yZGVyQnkoZGF0YSwgX29yZGVyKTtcbiAgICAgIHRoaXMub3JkZXJEYXRhID0gb3JkZXJEYXRhO1xuXG4gICAgICBjb25zdCBhb2FEYXRhID0gdGhpcy5nZXRBb0Eob3JkZXJEYXRhLCBfb3JkZXIpO1xuICAgICAgdGhpcy5hb2FEYXRhID0gYW9hRGF0YTtcblxuICAgICAgdGhpcy50YWJsZSA9IHRoaXMuZm9ybWF0KGFvYURhdGEpO1xuICAgIH0pO1xuXG4gIH1cblxuICBnZXRBb0EoQW9POiBvYmplY3RbXSwgb3JkZXI6IGFueVtdKTogc3RyaW5nW11bXSB7XG4gICAgcmV0dXJuIEFvTy5tYXAocm93ID0+IG9yZGVyLm1hcChrZXkgPT4gcm93W2tleV0pLmZpbHRlcihrZXkgPT4ga2V5ICE9PSB1bmRlZmluZWQpKTtcbiAgfVxuXG4gIGZvcm1hdChkYXRhOiBhbnlbXVtdKTogYW55W11bXSB7XG4gICAgaWYgKCFpc0FycmF5KGRhdGEpIHx8IGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgaWYgKCFpc0FycmF5KGRhdGFbMF0pIHx8IGRhdGFbMF0ubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZ3JvdXBEYXRhcyA9IGdyb3VwQnkoZGF0YSwgcm93ID0+IHJvd1swXSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSB2YWx1ZXMoZ3JvdXBEYXRhcykubWFwKGdyb3VwRGF0YSA9PiB7XG4gICAgICBjb25zdCBfZGF0YTogYW55W10gPSBbXTtcbiAgICAgIGNvbnN0IGZpcnN0Q29sczogYW55W10gPSBbXTtcbiAgICAgIGxldCBuZXh0UmVzdWx0O1xuXG4gICAgICBncm91cERhdGEuZm9yRWFjaCgoW2NvbCwgLi4ucm93XSkgPT4ge1xuICAgICAgICBmaXJzdENvbHMucHVzaChjb2wpO1xuICAgICAgICBfZGF0YS5wdXNoKHJvdyk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZmlyc3RDb2wgPSB7XG4gICAgICAgIGNvbnRlbnQ6IGZpcnN0Q29sc1swXSxcbiAgICAgICAgcm93c3BhbjogZmlyc3RDb2xzLmxlbmd0aCxcbiAgICAgICAga2V5OiB0aGlzLl9vcmRlciA/IHRoaXMuX29yZGVyW3RoaXMuX29yZGVyLmxlbmd0aCAtIF9kYXRhWzBdLmxlbmd0aCAtIDFdIDogbnVsbCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmZvcm1hdChfZGF0YSk7XG5cbiAgICAgIGlmIChuZXh0Lmxlbmd0aCkge1xuICAgICAgICBuZXh0WzBdLnVuc2hpZnQoZmlyc3RDb2wpO1xuICAgICAgICBuZXh0UmVzdWx0ID0gbmV4dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IFssIC4uLmxlYXZlc10gPSBmaXJzdENvbHM7XG4gICAgICAgIG5leHRSZXN1bHQgPSBbW2ZpcnN0Q29sXSwgLi4ubGVhdmVzLm1hcCgoKSA9PiBbXSldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV4dFJlc3VsdDtcbiAgICB9KS5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpLCBbXSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFRhYmxlRGVzY2FydGVzQ29tcG9uZW50IH0gZnJvbSAnLi90YWJsZS1kZXNjYXJ0ZXMuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZVxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtUYWJsZURlc2NhcnRlc0NvbXBvbmVudF0sXG4gIGV4cG9ydHM6IFtUYWJsZURlc2NhcnRlc0NvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgVGFibGVEZXNjYXJ0ZXNNb2R1bGUgeyB9XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7SUF3REU7b0JBWjhDLEVBQUUsQ0FBQyxFQUFFLENBQUM7cUJBRWYsRUFBRSxDQUFDLElBQUksQ0FBQztxQkFRWCxFQUFFO0tBR25DOzs7O0lBRUQsMENBQVE7OztJQUFSO1FBQUEsaUJBd0JDO1FBdkJDLGFBQWEsQ0FBQztZQUNaLElBQUksQ0FBQyxJQUFJO1lBQ1QsSUFBSSxDQUFDLEtBQUs7U0FDWCxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUMsRUFBYTtnQkFBYixrQkFBYSxFQUFaLFlBQUksRUFBRSxhQUFLO1lBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2xCLE9BQU87YUFDUjs7WUFFRCxJQUFNLE1BQU0sR0FBRyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUMzRCxLQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNwQixPQUFPO2FBQ1I7O1lBRUQsSUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN4QyxLQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQzs7WUFFM0IsSUFBTSxPQUFPLEdBQUcsS0FBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDL0MsS0FBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFFdkIsS0FBSSxDQUFDLEtBQUssR0FBRyxLQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ25DLENBQUMsQ0FBQztLQUVKOzs7Ozs7SUFFRCx3Q0FBTTs7Ozs7SUFBTixVQUFPLEdBQWEsRUFBRSxLQUFZO1FBQ2hDLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsS0FBSyxTQUFTLEdBQUEsQ0FBQyxHQUFBLENBQUMsQ0FBQztLQUNwRjs7Ozs7SUFFRCx3Q0FBTTs7OztJQUFOLFVBQU8sSUFBYTtRQUFwQixpQkF5Q0M7UUF4Q0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN2QyxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM3QyxPQUFPLEVBQUUsQ0FBQztTQUNYOztRQUVELElBQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUEsQ0FBQyxDQUFDOztRQUVoRCxJQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsU0FBUzs7WUFDN0MsSUFBTSxLQUFLLEdBQVUsRUFBRSxDQUFDOztZQUN4QixJQUFNLFNBQVMsR0FBVSxFQUFFLENBQUM7O1lBQzVCLElBQUksVUFBVSxDQUFDO1lBRWYsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFDLEVBQWE7b0JBQWIsZUFBYSxFQUFaLFdBQUcsRUFBRSxpQkFBTTtnQkFDN0IsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNqQixDQUFDLENBQUM7O1lBRUgsSUFBTSxRQUFRLEdBQUc7Z0JBQ2YsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JCLE9BQU8sRUFBRSxTQUFTLENBQUMsTUFBTTtnQkFDekIsR0FBRyxFQUFFLEtBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSSxDQUFDLE1BQU0sQ0FBQyxLQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUk7YUFDaEYsQ0FBQzs7WUFFRixJQUFNLElBQUksR0FBRyxLQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRWhDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDZixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMxQixVQUFVLEdBQUcsSUFBSSxDQUFDO2FBQ25CO2lCQUFNO2dCQUNMLDRCQUFTLG9CQUFTLENBQWM7Z0JBQ2hDLFVBQVUsYUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBTSxPQUFBLEVBQUUsR0FBQSxDQUFDLENBQUMsQ0FBQzthQUNwRDtZQUVELE9BQU8sVUFBVSxDQUFDO1NBQ25CLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBQSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXJDLE9BQU8sTUFBTSxDQUFDO0tBQ2Y7O2dCQTVHRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLHFCQUFxQjtvQkFDL0IsUUFBUSxFQUFFLDBpQkFlWDtvQkFDQyxNQUFNLEVBQUUsQ0FBQyw0SkFBNEosQ0FBQztpQkFDdks7Ozs7O3VCQUVFLEtBQUs7d0JBRUwsS0FBSztzQkFHTCxLQUFLOztrQ0FoRFI7Ozs7Ozs7QUNBQTs7OztnQkFJQyxRQUFRLFNBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLFlBQVk7cUJBQ2I7b0JBQ0QsWUFBWSxFQUFFLENBQUMsdUJBQXVCLENBQUM7b0JBQ3ZDLE9BQU8sRUFBRSxDQUFDLHVCQUF1QixDQUFDO2lCQUNuQzs7K0JBVkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyJ9