UNPKG

sx-ng-aggrid

Version:
484 lines 76.3 kB
import * as tslib_1 from "tslib"; import { Component, ViewChild, Input } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Router, ActivatedRoute } from '@angular/router'; import { gridSequelizeFormatter } from './grid-sequelize'; import { GridValueFormatter as _GridValueFormatter } from './grid-value-formatter'; import { Papa } from 'ngx-papaparse'; export var GridFilterType; (function (GridFilterType) { GridFilterType["Text"] = "agTextColumnFilter"; GridFilterType["Date"] = "agDateColumnFilter"; GridFilterType["Number"] = "agNumberColumnFilter"; })(GridFilterType || (GridFilterType = {})); export var GridValueFormatter = _GridValueFormatter; var GridComponent = /** @class */ (function () { function GridComponent(http, route, router, papa) { var _this = this; this.http = http; this.route = route; this.router = router; this.papa = papa; this.gridSortModel = []; this.gridFilterModel = null; this.totalPageCount = 1; this.currentPageNumber = 1; this.pageRowCount = 100; this.totalRowCount = 0; this.isRowViewMode = false; this.rowViewDataId = null; this.rowViewData = []; this.gridOptions = { defaultColDef: { width: 120, filterParams: { caseSensitive: true, debounceMs: 1000, newRowsAction: 'keep' } }, enableServerSideFilter: true, enableServerSideSorting: true, enableFilter: true, enableSorting: true, enableColResize: true, rowSelection: 'single', onGridReady: function () { // If there is saved filter/sort // Then read & load to grid var savedFilterSort = _this.loadLocalStorageData(); if (savedFilterSort && _this.params.keepUserFilterSort) { _this.gridFilterModel = savedFilterSort.gridFilterModel || undefined; _this.gridSortModel = savedFilterSort.gridSortModel || []; _this.currentPageNumber = savedFilterSort.currentPageNumber > 0 ? +savedFilterSort.currentPageNumber : 1; _this.gridOptions.api.setSortModel(_this.gridSortModel); _this.gridOptions.api.setFilterModel(_this.gridFilterModel); if (_this.params.doNotUsePagination) _this.refresh(); } else { _this.refresh(); } }, onSortChanged: function () { _this.gridSortModel = _this.gridOptions.api.getSortModel(); if (!_this.params.doNotUsePagination) _this.refresh(); }, onFilterChanged: function () { _this.gridFilterModel = _this.gridOptions.api.getFilterModel(); if (!_this.params.doNotUsePagination) { _this.refresh(); } else { _this.totalRowCount = _this.gridOptions.api.getDisplayedRowCount(); } }, onRowDoubleClicked: function (event) { _this.onButtonEdit(); } }; } GridComponent.prototype.ngOnInit = function () { if (this.params.doNotUsePagination) { this.pageRowCount = Number.MAX_SAFE_INTEGER; this.gridOptions.enableServerSideFilter = false; this.gridOptions.enableServerSideSorting = false; } }; GridComponent.prototype.ngOnDestroy = function () { this.saveLocalStorageData(); }; GridComponent.prototype.saveLocalStorageData = function () { if (!this.params.keepUserFilterSort) { return; } // On Destroy read & save filter/sort/currentPage info // We will load it when we are back localStorage.setItem(this.params.httpEndpoint, JSON.stringify({ gridFilterModel: this.gridFilterModel, gridSortModel: this.gridSortModel, currentPageNumber: this.currentPageNumber })); }; GridComponent.prototype.loadLocalStorageData = function () { var str = localStorage.getItem(this.params.httpEndpoint); if (str) { return JSON.parse(str); } return null; }; GridComponent.prototype.refresh = function (updateOnPosition) { var _this = this; if (!this.params.doNotUsePagination) { var params_1 = gridSequelizeFormatter(this.params.initialSortModel, this.params.staticFilter, this.params.httpIncludeParam, this.currentPageNumber, this.pageRowCount, this.gridSortModel, this.gridFilterModel); this.http .get(this.params.httpEndpoint + '/count', { params: params_1 }) .subscribe(function (count) { _this.totalRowCount = count; _this.totalPageCount = Math.ceil(_this.totalRowCount / _this.pageRowCount); // check currentPageNumber & offset if (_this.currentPageNumber == 0 && _this.totalPageCount > 0) { _this.currentPageNumber = 1; } if (_this.currentPageNumber > _this.totalPageCount) { _this.currentPageNumber = _this.totalPageCount; params_1.offset = _this.currentPageNumber > 0 ? (_this.currentPageNumber - 1) * _this.pageRowCount : 0; } _this.http .get(_this.params.httpEndpoint, { params: params_1 }) .subscribe(function (rowData) { if (updateOnPosition) { var displayedRowData_1 = []; _this.gridOptions.api.getModel().forEachNode(function (row) { displayedRowData_1.push(row); }); if (rowData.length < displayedRowData_1.length) { for (var i = rowData.length; i < displayedRowData_1.length; i++) { _this.gridOptions.api.updateRowData({ remove: [displayedRowData_1[i].data] }); } } else if (rowData.length > displayedRowData_1.length) { for (var i = displayedRowData_1.length; i < rowData.length; i++) { _this.gridOptions.api.updateRowData({ add: [rowData[i]] }); } } rowData.map(function (data, index) { var gridRow = _this.gridOptions.api.getRowNode(index.toString()); if (gridRow) gridRow.setData(data); }); // setData filtreleme, sıralama gibi işlemlerdeki değişiklikleri yansıtacak şekilde güncellemiyor. // setData ile veri girişi yapıldıktan sonra tablodaki verilerin filtrelenmesini, sıralanmasını güncellemek için eklendi _this.gridOptions.api.refreshClientSideRowModel('filter'); _this.gridOptions.api.refreshClientSideRowModel('sort'); } else { _this.gridOptions.api.setRowData(rowData); } _this.gridOptions.api.sizeColumnsToFit(); }, function (err) { if (_this.params.gridFunctions.logToConsole) { console.log(_this.formatErrorMessage(err)); } else { alert(_this.formatErrorMessage(err)); } }); }, function (err) { if (_this.params.gridFunctions.logToConsole) { console.log(_this.formatErrorMessage(err)); } else { alert(_this.formatErrorMessage(err)); } }); } else { var params_2 = gridSequelizeFormatter(this.params.initialSortModel, this.params.staticFilter, this.params.httpIncludeParam); this.http .get(this.params.httpEndpoint, { params: params_2 }) .subscribe(function (rowData) { // Count _this.totalPageCount = 1; _this.currentPageNumber = 1; params_2.offset = 0; if (updateOnPosition) { var displayedRowData_2 = []; _this.gridOptions.api.getModel().forEachNode(function (row) { displayedRowData_2.push(row); }); if (rowData.length < displayedRowData_2.length) { for (var i = rowData.length; i < displayedRowData_2.length; i++) { _this.gridOptions.api.updateRowData({ remove: [displayedRowData_2[i].data] }); } } else if (rowData.length > displayedRowData_2.length) { for (var i = displayedRowData_2.length; i < rowData.length; i++) { _this.gridOptions.api.updateRowData({ add: [rowData[i]] }); } } rowData.map(function (data, index) { var gridRow = _this.gridOptions.api.getRowNode(index.toString()); if (gridRow) gridRow.setData(data); }); // setData filtreleme, sıralama gibi işlemlerdeki değişiklikleri yansıtacak şekilde güncellemiyor. // setData ile veri girişi yapıldıktan sonra tablodaki verilerin filtrelenmesini, sıralanmasını güncellemek için eklendi _this.gridOptions.api.refreshClientSideRowModel('filter'); _this.gridOptions.api.refreshClientSideRowModel('sort'); } else { _this.gridOptions.api.setRowData(rowData); } _this.totalRowCount = _this.gridOptions.api.getDisplayedRowCount(); _this.gridOptions.api.sizeColumnsToFit(); }, function (err) { if (_this.params.gridFunctions.logToConsole) { console.log(_this.formatErrorMessage(err)); } else { alert(_this.formatErrorMessage(err)); } }); } }; GridComponent.prototype.onButtonAdd = function () { if (!this.params.gridFunctions.canAdd || !this.params.gridFunctions.addBaseUrl) { return; } this.saveLocalStorageData(); this.router.navigate([this.params.gridFunctions.addBaseUrl + "/0"], { queryParams: { returnUrl: this.router.url } }); }; GridComponent.prototype.onButtonEdit = function () { if (!this.params.gridFunctions.canEdit || !this.params.gridFunctions.editBaseUrl) { return this.onButtonView(); } var selRow = this.gridOptions.api.getSelectedRows()[0]; if (!selRow) { return; } this.saveLocalStorageData(); this.router.navigate([this.params.gridFunctions.editBaseUrl + "/" + selRow[this.params.idColName || 'id']], { queryParams: { returnUrl: this.router.url } }); }; GridComponent.prototype.onButtonCopy = function () { if (!this.params.gridFunctions.canCopy || !this.params.gridFunctions.addBaseUrl) { return this.onButtonView(); } var selRow = this.gridOptions.api.getSelectedRows()[0]; if (!selRow) { return; } this.router.navigate([this.params.gridFunctions.addBaseUrl + "/0"], { queryParams: selRow }); }; GridComponent.prototype.onButtonDelete = function () { var _this = this; if (!this.params.gridFunctions.canDelete) { return; } var selRow = this.gridOptions.api.getSelectedRows()[0]; if (!selRow) { return; } if (confirm('Delete?')) { this.http .delete(this.params.httpEndpoint + '/' + selRow[this.params.idColName || 'id']) .subscribe(function (result) { _this.refresh(); }, function (err) { alert(_this.formatErrorMessage(err)); }); } }; GridComponent.prototype.onButtonBackward = function () { if (this.currentPageNumber <= 1) { return; } this.currentPageNumber = 1; this.refresh(); }; GridComponent.prototype.onButtonForward = function () { if (this.currentPageNumber >= this.totalPageCount) { return; } this.currentPageNumber = this.totalPageCount; this.refresh(); }; GridComponent.prototype.onButtonNext = function () { if (this.currentPageNumber >= this.totalPageCount) { return; } this.currentPageNumber = this.currentPageNumber + 1; this.refresh(); }; GridComponent.prototype.onButtonPrevious = function () { if (this.currentPageNumber <= 1) { return; } this.currentPageNumber = this.currentPageNumber - 1; this.refresh(); }; GridComponent.prototype.onButtonRefresh = function () { this.refresh(true); }; GridComponent.prototype.formatErrorMessage = function (error) { console.error(error); var errMsg = 'Unknown Error'; if (error && error.error && error.error.error && error.error.error.message) { errMsg = error.error.error.message; } else { if (error && error.error && error.error.message) { errMsg = error.error.message; } else { if (error && error.message) { errMsg = error.message; } } } return errMsg; }; GridComponent.prototype.onButtonView = function () { var _this = this; var selRow = this.gridOptions.api.getSelectedRows()[0]; if (!selRow) { return; } this.rowViewData = []; this.gridOptions.columnDefs.forEach(function (column) { _this.rowViewData.push({ headerName: column.headerName, value: column.valueFormatter ? column.valueFormatter({ value: getObjectValueWithDotNotation(selRow, column.field) }) : getObjectValueWithDotNotation(selRow, column.field) }); }); this.saveLocalStorageData(); this.rowViewDataId = selRow[this.params.idColName || 'id']; this.isRowViewMode = true; }; GridComponent.prototype.onButtonViewCancel = function () { this.isRowViewMode = false; }; GridComponent.prototype.onButtonViewEdit = function () { if (!this.params.gridFunctions.canEdit || !this.params.gridFunctions.editBaseUrl) { return; } this.saveLocalStorageData(); this.router.navigate([this.params.gridFunctions.editBaseUrl + "/" + this.rowViewDataId], { queryParams: { returnUrl: this.router.url } }); }; GridComponent.prototype.onButtonImportCSV = function ($event) { var _this = this; if (!this.params.gridFunctions.canImport) { return; } var files = $event.srcElement.files; var reader = new FileReader(); reader.onload = function () { _this.csvData = reader.result; _this.papa.parse(_this.csvData, { header: true, delimiter: ';', skipEmptyLines: true, complete: function (results) { _this.http .post(_this.params.httpEndpoint + '/createBulk', results.data) .subscribe(function (result) { _this.fileImput.nativeElement.value = ''; _this.refresh(); }, function (err) { _this.fileImput.nativeElement.value = ''; alert(_this.formatErrorMessage(err)); }); } }); }; reader.readAsText(files[0]); }; GridComponent.prototype.onButtonExport = function () { var _this = this; if (this.params.gridFunctions.exportFromServerSide) { this.http .get(this.params.httpEndpoint + '/export', { observe: 'response', responseType: 'arraybuffer' }) .subscribe(function (data) { var fileName = data.headers.get('Content-Filename'); downloadFile(data.body, fileName, 'application/gzip', '.zip'); }, function (err) { alert(_this.formatErrorMessage(err)); }); } else { var params = gridSequelizeFormatter(this.params.initialSortModel, this.params.staticFilter, this.params.httpIncludeParam, 0, 1000 * 1000 * 1000, // Allow max record this.gridSortModel, this.gridFilterModel); this.http .get(this.params.httpEndpoint, { params: params }) .subscribe(function (rowData) { var csvData; _this.gridOptions.columnDefs.forEach(function (column) { if (_this.params.exportFields && _this.params.exportFields.indexOf(column.field) < 0) { return; } if (csvData) { csvData = csvData + ";\"" + column.field + "\""; } else { csvData = "\"" + column.field + "\""; } }); csvData += '\r\n'; // Add rows for (var i = 0; i < rowData.length; i++) { for (var j = 0; j < _this.gridOptions.columnDefs.length; j++) { var column = _this.gridOptions.columnDefs[j]; if (_this.params.exportFields && _this.params.exportFields.indexOf(column.field) < 0) { continue; } var value = column.valueFormatter ? column.valueFormatter({ value: getObjectValueWithDotNotation(rowData[i], column.field) }) : getObjectValueWithDotNotation(rowData[i], column.field); if (typeof value === 'string') { value = value.replace(/\/\r|\n/gi, ''); } if (j === 0) { csvData = csvData + "\"" + (value ? value : '') + "\""; } else { csvData = csvData + ";\"" + (value ? value : '') + "\""; } } csvData += '\r\n'; } downloadFile(csvData, 'Export_Grid', 'text/csv', '.csv'); }, function (err) { alert(_this.formatErrorMessage(err)); }); } }; GridComponent.ctorParameters = function () { return [ { type: HttpClient }, { type: ActivatedRoute }, { type: Router }, { type: Papa } ]; }; tslib_1.__decorate([ Input() ], GridComponent.prototype, "params", void 0); tslib_1.__decorate([ ViewChild('agGrid', { static: false }) ], GridComponent.prototype, "agGrid", void 0); tslib_1.__decorate([ ViewChild('fileImput', { static: false }) ], GridComponent.prototype, "fileImput", void 0); GridComponent = tslib_1.__decorate([ Component({ // tslint:disable-next-line: component-selector selector: 'sx-ng-aggrid', template: "<!-- Grid View -->\n<div *ngIf=\"!isRowViewMode\" style=\"width: 100%; height: 100%;\" class=\"container-fluid sx-ng-aggrid-main\">\n <div style=\"width: 100%;min-height:42px\" class=\" sx-ng-aggrid-toolbar\" *ngIf=\"!params?.hideToolbar\">\n <div class=\"row\">\n <div class=\"col-md-5 mb-1\">\n <div class=\"btn-toolbar\" role=\"toolbar\">\n <div class=\"btn-group mr-2 me-2\" role=\"group\">\n <button *ngIf=\"!params?.gridFunctions?.hideView\" type=\"button\" class=\"btn btn-secondary\"\n (click)=\"onButtonView()\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"View Record\">\n <i class=\"fa fa-search-plus\">&nbsp;</i>\n </button>\n <button *ngIf=\"params?.gridFunctions?.canAdd\" type=\"button\" class=\"btn btn-secondary\"\n (click)=\"onButtonAdd()\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Add...\">\n <i class=\"fa fa-plus\">&nbsp;</i>\n </button>\n <button *ngIf=\"params?.gridFunctions?.canEdit\" type=\"button\" class=\"btn btn-secondary\"\n (click)=\"onButtonEdit()\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Edit...\">\n <i class=\"fa fa-edit\">&nbsp;</i>\n </button>\n <button *ngIf=\"params?.gridFunctions?.canCopy\" type=\"button\" class=\"btn btn-secondary\"\n (click)=\"onButtonCopy()\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Copy...\">\n <i class=\"far fa-copy\">&nbsp;</i>\n </button>\n <button *ngIf=\"params?.gridFunctions?.canDelete\" type=\"button\" class=\"btn btn-secondary\"\n (click)=\"onButtonDelete()\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Delete...\">\n <i class=\"fa fa-times\">&nbsp;</i>\n </button>\n <button *ngIf=\"params?.gridFunctions?.canImport\" type=\"button\" class=\"btn btn-secondary import\"\n data-toggle=\"tooltip\" data-placement=\"top\" title=\"Import\">\n <label for=\"customFile\" class=\"m-0\"><i class=\"fas fa-upload\"></i></label>\n <input #fileImput type=\"file\" class=\"custom-file-input d-none\" id=\"customFile\" accept=\".csv\"\n (change)=\"onButtonImportCSV($event)\">\n </button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonExport()\" data-toggle=\"tooltip\"\n data-placement=\"top\" title=\"Export\">\n <i class=\"fa fa-download\">&nbsp;</i>\n </button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonRefresh()\"\n data-toggle=\"tooltip\" data-placement=\"top\" title=\"Refresh\">\n <i class=\"fa fa-undo\">&nbsp;</i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"col-md-2 mb-1 text-center\">\n <button type=\"button\" class=\"btn btn-light count-btn\" disabled>\n <i class=\"fa fa-database\"></i>: {{totalRowCount}}\n </button>\n </div>\n <div class=\"mb-1\"\n [ngClass]=\"!params?.doNotUsePagination ? 'col-md-1' : 'col-md-5 ms-auto ml-auto text-right'\">\n <ng-content select=\"[extra-buttons]\"></ng-content>\n </div>\n <div class=\"col-md-4 mb-1 pagination\" *ngIf=\"!params?.doNotUsePagination\">\n <div class=\"btn-group ms-auto ml-auto\" role=\"group\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonBackward()\">\n <i class=\"fa fa-backward\"></i>&nbsp;\n </button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonPrevious()\">\n <i class=\"fa fa-caret-left\"></i>&nbsp;&nbsp;&nbsp;&nbsp;\n </button>\n <button type=\"button\" class=\"btn btn-light\" disabled>{{' '+currentPageNumber+' / '+totalPageCount+'\n '}}</button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonNext()\">\n &nbsp;&nbsp;&nbsp;&nbsp;<i class=\"fa fa-caret-right\"></i>\n </button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonForward()\">\n &nbsp;<i class=\"fa fa-forward\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n <div style=\"width: 100%; height: 100%;\" class=\"sx-ng-aggrid-toolbar\">\n <ag-grid-angular #agGrid style=\"width: 100%; height: 100%;\" class=\"ag-theme-fresh\" [rowData]=\"rowData\"\n [columnDefs]=\"params?.columnDefs\" [gridOptions]=\"gridOptions\"></ag-grid-angular>\n </div>\n</div>\n\n<!-- Row View -->\n<div *ngIf=\"isRowViewMode\" class=\"container-fluid\">\n <div class=\"row\">\n <div class=\"col-md-8 mb-1\">\n <h3>Details\n <span class=\"float-right float-end\">\n <button *ngIf=\"params?.gridFunctions?.canEdit\" type=\"button\" class=\"btn btn-primary\"\n (click)=\"onButtonViewEdit()\">\n &nbsp;&nbsp;\n <i class=\"fa fa-edit\"></i>&nbsp;&nbsp;\n </button>&nbsp;\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonViewCancel()\">\n &nbsp;&nbsp;\n <i class=\"fa fa-arrow-circle-left\"></i>&nbsp;&nbsp;\n </button>\n </span>\n </h3>\n <hr style=\"border-top: 1px solid black;\" />\n\n <div class=\"form-group mb-3\" *ngFor=\"let field of rowViewData\">\n <label class=\"mb-2\">{{field.headerName}}</label>\n <input class=\"form-control\" [value]=\"field.value\" disabled>\n </div>\n </div>\n </div>\n</div>", styles: ["@media only screen and (max-width:767px){.btn-toolbar>.btn-group.mr-2{width:100%;margin-right:0!important}.count-btn{width:100%}.pagination{display:-ms-grid;display:grid;padding:0 15px}.pagination>.btn-group{margin:auto 0!important}}.import{min-width:42px;padding:0}.import>label{width:100%;height:100%;position:absolute;top:0;left:0;line-height:36px;cursor:pointer}.fa-file-archive::before{content:'\\f1c6'}"] }) ], GridComponent); return GridComponent; }()); export { GridComponent }; /** * Helper Functions */ function getObjectValueWithDotNotation(object, keys) { return keys.split('.').reduce(function (o, k) { return (o || {})[k]; }, object); } function downloadFile(data, filename, fileType, fileExtention) { var htmlElement = document.createElement('a'); htmlElement.setAttribute('style', 'display:none;'); document.body.appendChild(htmlElement); var blob = new Blob([data], { type: fileType }); var url = window.URL.createObjectURL(blob); htmlElement.href = url; var isIE = /*@cc_on!@*/ false || !!document.documentMode; if (isIE) { var retVal = navigator.msSaveBlob(blob, filename + fileExtention); } else { htmlElement.download = filename + fileExtention; } htmlElement.click(); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zeC1uZy1hZ2dyaWQvIiwic291cmNlcyI6WyJzcmMvYXBwL21vZHVsZXMvZ3JpZC9ncmlkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsS0FBSyxFQUF5QixNQUFNLGVBQWUsQ0FBQztBQUczRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUl6RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsa0JBQWtCLElBQUksbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJDLE1BQU0sQ0FBTixJQUFZLGNBSVg7QUFKRCxXQUFZLGNBQWM7SUFDeEIsNkNBQTJCLENBQUE7SUFDM0IsNkNBQTJCLENBQUE7SUFDM0IsaURBQStCLENBQUE7QUFDakMsQ0FBQyxFQUpXLGNBQWMsS0FBZCxjQUFjLFFBSXpCO0FBRUQsTUFBTSxDQUFDLElBQU0sa0JBQWtCLEdBQUcsbUJBQW1CLENBQUM7QUFpQ3REO0lBc0JFLHVCQUNVLElBQWdCLEVBQ2hCLEtBQXFCLEVBQ3JCLE1BQWMsRUFDZCxJQUFVO1FBSnBCLGlCQW1EQztRQWxEUyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxTQUFJLEdBQUosSUFBSSxDQUFNO1FBcEJwQixrQkFBYSxHQUFpQixFQUFFLENBQUM7UUFDakMsb0JBQWUsR0FBaUIsSUFBSSxDQUFDO1FBQ3JDLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLHNCQUFpQixH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