From 6583c9ee764b15c0286e9060fc916f6bd7b42078 Mon Sep 17 00:00:00 2001 From: Andrew Stein Date: Sun, 23 Jul 2023 11:48:10 -0400 Subject: [PATCH] Add Python support --- .gitignore | 1 + cpp/perspective/src/cpp/scalar.cpp | 38 +- cpp/perspective/src/cpp/view.cpp | 192 +++--- .../src/include/perspective/view.h | 7 +- .../src/js/plugin/plugin.js | 42 +- .../src/js/data_listener/index.js | 4 +- packages/perspective/src/js/perspective.js | 273 ++------ .../perspective/src/js/view_formatters.js | 55 -- .../test/js/expressions/conversions.spec.js | 8 +- .../test/js/expressions/functionality.spec.js | 1 - packages/perspective/test/js/leaks.spec.js | 24 + packages/perspective/test/js/pivots.spec.js | 4 +- packages/perspective/test/js/sort.spec.js | 6 - .../perspective/test/js/to_format.spec.js | 17 +- .../test/js/to_format_viewport.spec.js | 3 - .../bench/runtime/perspective_benchmark.py | 17 +- .../runtime/run_perspective_benchmark.py | 3 +- .../perspective/client/view_api.py | 3 + .../perspective/include/perspective/python.h | 4 + .../perspective/table/_data_formatter.py | 2 +- python/perspective/perspective/table/view.py | 69 +- .../perspective/tests/manager/test_manager.py | 5 +- .../perspective/tests/table/test_to_arrow.py | 12 +- .../perspective/tests/table/test_to_format.py | 252 +++++-- .../perspective/tests/table/test_view.py | 652 +++++++++++++++--- .../tests/table/test_view_expression.py | 6 +- python/perspective/setup.cfg | 3 +- tools/perspective-bench/src/js/worker.js | 4 +- tools/perspective-test/results.tar.gz | Bin 93995 -> 147964 bytes 29 files changed, 1125 insertions(+), 582 deletions(-) delete mode 100644 packages/perspective/src/js/view_formatters.js diff --git a/.gitignore b/.gitignore index 98fdd38f71..ff59d833ad 100644 --- a/.gitignore +++ b/.gitignore @@ -217,3 +217,4 @@ playwright-report/ playwright/.cache/ .pyodide-xbuildenv +benchmark_venv diff --git a/cpp/perspective/src/cpp/scalar.cpp b/cpp/perspective/src/cpp/scalar.cpp index 48f4af7b56..b3f29820f9 100644 --- a/cpp/perspective/src/cpp/scalar.cpp +++ b/cpp/perspective/src/cpp/scalar.cpp @@ -1039,11 +1039,16 @@ t_tscalar::to_string(bool for_expr) const { auto d = get(); ss << "date(" << d.year() << ", " << d.month() << ", " << d.day() << ")"; + + return ss.str(); } else { - ss << get(); + t_date date_val = get(); + tm t = date_val.get_tm(); + time_t epoch_delta = mktime(&t); + std::chrono::milliseconds timestamp(epoch_delta * 1000); + date::sys_time ts(timestamp); + return date::format("%F", ts); } - - return ss.str(); } break; case DTYPE_BOOL: { ss << std::boolalpha << get(); @@ -1063,28 +1068,7 @@ t_tscalar::to_string(bool for_expr) const { // local time and not UTC. std::chrono::milliseconds timestamp(to_int64()); date::sys_time ts(timestamp); - std::time_t temp = std::chrono::system_clock::to_time_t(ts); - std::tm* t = std::localtime(&temp); - - // use a mix of strftime and date::format - std::string buffer; - buffer.resize(64); - - // write y-m-d h:m in local time into buffer, and if successful - // write the rest of the date, otherwise print the date in UTC. - std::size_t len - = strftime(&buffer[0], buffer.size(), "%Y-%m-%d %H:%M:", t); - if (len > 0) { - buffer.resize(len); - ss << buffer; - ss << date::format( - "%S", ts); // represent second and millisecond - } else { - std::cerr << to_int64() << " failed strftime" << std::endl; - ss << date::format("%Y-%m-%d %H:%M:%S UTC", ts); - } - - return ss.str(); + return date::format("%F %T", ts); } break; case DTYPE_STR: { if (for_expr) { @@ -1595,9 +1579,9 @@ t_tscalar::can_store_inplace(const char* s) { bool t_tscalar::is_nan() const { if (m_type == DTYPE_FLOAT64) - return std::isnan(get()); + return std::isnan(get()) || std::isinf(get()); if (m_type == DTYPE_FLOAT32) - return std::isnan(get()); + return std::isnan(get()) || std::isinf(get()); return false; } diff --git a/cpp/perspective/src/cpp/view.cpp b/cpp/perspective/src/cpp/view.cpp index bc86b8f6ae..74b83a524f 100644 --- a/cpp/perspective/src/cpp/view.cpp +++ b/cpp/perspective/src/cpp/view.cpp @@ -173,7 +173,7 @@ View::column_names(bool skip, std::int32_t depth) const { for (t_uindex key = 0, max = m_ctx->unity_get_column_count(); key != max; ++key) { - std::string name = aggregate_names[key % aggregate_names.size()]; + const std::string& name = aggregate_names[key % aggregate_names.size()]; if (name == "psp_okey") { continue; @@ -326,9 +326,9 @@ View::schema() const { template <> std::map View::schema() const { - t_schema schema = m_ctx->get_schema(); - std::vector _types = schema.types(); - std::vector names = schema.columns(); + const t_schema& schema = m_ctx->get_schema(); + const std::vector& _types = schema.types(); + const std::vector& names = schema.columns(); std::map types; for (std::size_t i = 0, max = names.size(); i != max; ++i) { @@ -364,7 +364,7 @@ View::expression_schema() const { } for (const auto& expr : m_expressions) { - std::string expression_alias = expr->get_expression_alias(); + const std::string& expression_alias = expr->get_expression_alias(); new_schema[expression_alias] = dtype_to_str(expr->get_dtype()); if (m_row_pivots.size() > 0 && !is_column_only()) { @@ -385,9 +385,9 @@ View::expression_schema() const { template <> std::map View::expression_schema() const { - t_schema schema = m_ctx->get_schema(); - std::vector _types = schema.types(); - std::vector names = schema.columns(); + const t_schema& schema = m_ctx->get_schema(); + const std::vector& _types = schema.types(); + const std::vector& names = schema.columns(); std::map types; for (std::size_t i = 0, max = names.size(); i != max; ++i) { @@ -397,7 +397,7 @@ View::expression_schema() const { std::map new_schema; for (const auto& expr : m_expressions) { - std::string expression_alias = expr->get_expression_alias(); + const std::string& expression_alias = expr->get_expression_alias(); new_schema[expression_alias] = dtype_to_str(expr->get_dtype()); } @@ -1394,20 +1394,12 @@ View::_map_aggregate_types( template void -View::write_scalar(t_tscalar scalar, +View::write_scalar(t_tscalar scalar, bool is_formatted, rapidjson::Writer& writer) const { - auto str_val = scalar.to_string(); - - if (str_val == "null" || str_val == "nan") { + if (!scalar.is_valid()) { writer.Null(); return; - } else if (str_val == "inf") { - writer.String("Infinity"); - return; - } else if (str_val == "-inf") { - writer.String("-Infinity"); - return; } switch (scalar.get_dtype()) { @@ -1418,38 +1410,55 @@ View::write_scalar(t_tscalar scalar, writer.Bool(scalar.get()); break; case DTYPE_UINT8: - case DTYPE_UINT16: - case DTYPE_UINT32: case DTYPE_INT8: writer.Int(scalar.get()); break; + case DTYPE_UINT16: case DTYPE_INT16: writer.Int(scalar.get()); break; + case DTYPE_UINT32: case DTYPE_INT32: writer.Int(scalar.get()); break; + case DTYPE_UINT64: case DTYPE_INT64: writer.Int64(scalar.get()); break; case DTYPE_FLOAT32: - writer.Double(scalar.get()); + if (scalar.is_nan()) { + writer.Null(); + } else { + writer.Double(scalar.get()); + } break; case DTYPE_FLOAT64: - writer.Double(scalar.get()); + if (scalar.is_nan()) { + writer.Null(); + } else { + writer.Double(scalar.get()); + } break; case DTYPE_STR: writer.String(scalar.get()); break; - case DTYPE_UINT64: case DTYPE_TIME: - writer.Int64(scalar.get()); + if (is_formatted) { + writer.String(scalar.to_string().c_str()); + } else { + writer.Int64(scalar.get()); + } + break; case DTYPE_DATE: { - t_date date_val = scalar.get(); - tm t = date_val.get_tm(); - time_t epoch_delta = mktime(&t); - writer.Double(epoch_delta * 1000); + if (is_formatted) { + writer.String(scalar.to_string().c_str()); + } else { + t_date date_val = scalar.get(); + tm t = date_val.get_tm(); + time_t epoch_delta = mktime(&t); + writer.Double(epoch_delta * 1000); + } break; } @@ -1461,14 +1470,21 @@ View::write_scalar(t_tscalar scalar, template void View::write_row_path(t_uindex start_row, t_uindex end_row, - bool has_row_path, + bool has_row_path, bool leaves_only, bool is_formatted, rapidjson::Writer& writer) const { - writer.Key("__ROW_PATH__"); - writer.StartArray(); - if (has_row_path) { + writer.Key("__ROW_PATH__"); + writer.StartArray(); + t_uindex depth = m_row_pivots.size(); + for (auto r = start_row; r < end_row; ++r) { + if (has_row_path && leaves_only) { + if (m_ctx->unity_get_row_depth(r) < depth) { + continue; + } + } + writer.StartArray(); const auto row_path = get_row_path(r); @@ -1476,21 +1492,21 @@ View::write_row_path(t_uindex start_row, t_uindex end_row, for (auto entry = row_path.size(); entry > 0; entry--) { const t_tscalar& scalar = row_path[entry - 1]; - write_scalar(scalar, writer); + write_scalar(scalar, is_formatted, writer); } writer.EndArray(); } + writer.EndArray(); } - - writer.EndArray(); } template void View::write_column(t_uindex c, t_uindex start_row, t_uindex end_row, + bool has_row_path, bool leaves_only, bool is_formatted, std::shared_ptr> slice, - std::vector> col_names, + const std::vector>& col_names, rapidjson::Writer& writer) const { std::stringstream column_name; @@ -1503,14 +1519,20 @@ View::write_column(t_uindex c, t_uindex start_row, t_uindex end_row, column_name << col_names[c][col_names[c].size() - 1].get(); const std::string& tmp = column_name.str(); - + t_uindex depth = m_row_pivots.size(); writer.Key(tmp.c_str()); writer.StartArray(); for (auto r = start_row; r < end_row; ++r) { + if (has_row_path && leaves_only) { + if (m_ctx->unity_get_row_depth(r) < depth) { + continue; + } + } + auto scalar = slice->get(r, c); - write_scalar(scalar, writer); + write_scalar(scalar, is_formatted, writer); } writer.EndArray(); @@ -1519,20 +1541,27 @@ View::write_column(t_uindex c, t_uindex start_row, t_uindex end_row, template void View::write_index_column(t_uindex start_row, t_uindex end_row, + bool has_row_path, bool leaves_only, bool is_formatted, std::shared_ptr> slice, rapidjson::Writer& writer) const { - + t_uindex depth = m_row_pivots.size(); writer.Key("__INDEX__"); writer.StartArray(); for (auto r = start_row; r < end_row; ++r) { + if (has_row_path && leaves_only) { + if (m_ctx->unity_get_row_depth(r) < depth) { + continue; + } + } + std::vector keys = slice->get_pkeys(r, 0); writer.StartArray(); for (auto i = keys.size(); i > 0; --i) { auto scalar = keys[i - 1]; - write_scalar(scalar, writer); + write_scalar(scalar, is_formatted, writer); } writer.EndArray(); @@ -1548,8 +1577,8 @@ template <> std::string View::to_columns(t_uindex start_row, t_uindex end_row, t_uindex start_col, t_uindex end_col, t_uindex hidden, bool is_formatted, - bool get_pkeys, bool get_ids, bool leaves_only, t_uindex num_sides, - bool has_row_path, std::string nidx, t_uindex columns_length, + bool get_pkeys, bool get_ids, bool _leaves_only, t_uindex num_sides, + bool _has_row_path, std::string nidx, t_uindex columns_length, t_uindex group_by_length) const { auto slice = get_data(start_row, end_row, start_col, end_col); @@ -1561,8 +1590,14 @@ View::to_columns(t_uindex start_row, t_uindex end_row, writer.StartObject(); + if (start_row == end_row || start_col == end_col) { + writer.EndObject(); + return s.GetString(); + } + for (auto c = start_col; c < end_col; ++c) { - write_column(c, start_row, end_row, slice, col_names, writer); + write_column(c, start_row, end_row, false, false, is_formatted, slice, + col_names, writer); } if (get_ids) { @@ -1574,11 +1609,8 @@ View::to_columns(t_uindex start_row, t_uindex end_row, std::vector> vec{pair}; const auto keys = m_ctx->get_pkeys(vec); const t_tscalar& scalar = keys[0]; - writer.StartArray(); - - write_scalar(scalar, writer); - + write_scalar(scalar, is_formatted, writer); writer.EndArray(); } @@ -1593,37 +1625,35 @@ template <> std::string View::to_columns(t_uindex start_row, t_uindex end_row, t_uindex start_col, t_uindex end_col, t_uindex hidden, bool is_formatted, - bool get_pkeys, bool get_ids, bool leaves_only, t_uindex num_sides, - bool has_row_path, std::string nidx, t_uindex columns_length, + bool get_pkeys, bool get_ids, bool _leaves_only, t_uindex num_sides, + bool _has_row_path, std::string nidx, t_uindex columns_length, t_uindex group_by_length) const { - auto slice = get_data(start_row, end_row, start_col, end_col); auto col_names = slice->get_column_names(); auto schema = m_ctx->get_schema(); - rapidjson::StringBuffer s; rapidjson::Writer writer(s); - writer.StartObject(); - for (auto c = start_col; c < end_col; ++c) { - write_column(c, start_row, end_row, slice, col_names, writer); + write_column(c, start_row, end_row, false, false, is_formatted, slice, + col_names, writer); + } + + if (get_pkeys) { + write_index_column( + start_row, end_row, false, false, is_formatted, slice, writer); } if (get_ids) { writer.Key("__ID__"); writer.StartArray(); - for (auto x = start_row; x < end_row; ++x) { std::pair pair{x, 0}; std::vector> vec{pair}; const auto keys = m_ctx->get_pkeys(vec); const t_tscalar& scalar = keys[0]; - writer.StartArray(); - - write_scalar(scalar, writer); - + write_scalar(scalar, is_formatted, writer); writer.EndArray(); } @@ -1641,29 +1671,21 @@ View::to_columns(t_uindex start_row, t_uindex end_row, bool get_pkeys, bool get_ids, bool leaves_only, t_uindex num_sides, bool has_row_path, std::string nidx, t_uindex columns_length, t_uindex group_by_length) const { - auto slice = get_data(start_row, end_row, start_col, end_col); auto col_names = slice->get_column_names(); - rapidjson::StringBuffer s; rapidjson::Writer writer(s); - writer.StartObject(); - - write_row_path(start_row, end_row, true, writer); - + write_row_path(start_row, end_row, true, leaves_only, is_formatted, writer); if (get_ids) { writer.Key("__ID__"); writer.StartArray(); - for (auto r = start_row; r < end_row; ++r) { writer.StartArray(); const auto row_path = m_ctx->get_row_path(r); - for (auto entry = row_path.size(); entry > 0; entry--) { const t_tscalar& scalar = row_path[entry - 1]; - - write_scalar(scalar, writer); + write_scalar(scalar, is_formatted, writer); } writer.EndArray(); @@ -1672,18 +1694,20 @@ View::to_columns(t_uindex start_row, t_uindex end_row, writer.EndArray(); } + // Hidden columns are always at the end of the column names + // list, and we need to skip them from the output. for (auto c = start_col + 1; c < end_col; ++c) { - // Hidden columns are always at the end of the column names - // list, and we need to skip them from the output. if ((c - 1) > columns_length - hidden) { continue; } else { - write_column(c, start_row, end_row, slice, col_names, writer); + write_column(c, start_row, end_row, true, leaves_only, is_formatted, + slice, col_names, writer); } } if (get_pkeys) { - write_index_column(start_row, end_row, slice, writer); + write_index_column( + start_row, end_row, true, leaves_only, is_formatted, slice, writer); } writer.EndObject(); @@ -1697,30 +1721,22 @@ View::to_columns(t_uindex start_row, t_uindex end_row, bool get_pkeys, bool get_ids, bool leaves_only, t_uindex num_sides, bool has_row_path, std::string nidx, t_uindex columns_length, t_uindex group_by_length) const { - auto slice = get_data(start_row, end_row, start_col, end_col); auto col_names = slice->get_column_names(); - rapidjson::StringBuffer s; rapidjson::Writer writer(s); - writer.StartObject(); - - write_row_path(start_row, end_row, has_row_path, writer); - + write_row_path( + start_row, end_row, has_row_path, leaves_only, is_formatted, writer); if (get_ids) { writer.Key("__ID__"); writer.StartArray(); - for (auto r = start_row; r < end_row; ++r) { writer.StartArray(); - const auto row_path = m_ctx->get_row_path(r); - for (auto entry = row_path.size(); entry > 0; entry--) { const t_tscalar& scalar = row_path[entry - 1]; - - write_scalar(scalar, writer); + write_scalar(scalar, is_formatted, writer); } writer.EndArray(); @@ -1735,12 +1751,14 @@ View::to_columns(t_uindex start_row, t_uindex end_row, if (((c - 1) % (columns_length + hidden)) >= columns_length) { continue; } else { - write_column(c, start_row, end_row, slice, col_names, writer); + write_column(c, start_row, end_row, has_row_path, leaves_only, + is_formatted, slice, col_names, writer); } } if (get_pkeys) { - write_index_column(start_row, end_row, slice, writer); + write_index_column(start_row, end_row, has_row_path, leaves_only, + is_formatted, slice, writer); } writer.EndObject(); diff --git a/cpp/perspective/src/include/perspective/view.h b/cpp/perspective/src/include/perspective/view.h index 95644f2a49..3fa28098c0 100644 --- a/cpp/perspective/src/include/perspective/view.h +++ b/cpp/perspective/src/include/perspective/view.h @@ -129,18 +129,21 @@ class PERSPECTIVE_EXPORT View { std::pair get_min_max( const std::string& colname) const; - void write_scalar(t_tscalar scalar, + void write_scalar(t_tscalar scalar, bool is_formatted, rapidjson::Writer& writer) const; void write_row_path(t_uindex start_row, t_uindex end_row, bool has_row_path, + bool leaves_only, bool is_formatted, rapidjson::Writer& writer) const; void write_column(t_uindex c, t_uindex start_row, t_uindex end_row, + bool has_row_path, bool leaves_only, bool is_formatted, std::shared_ptr> slice, - std::vector> col_names, + const std::vector>& col_names, rapidjson::Writer& writer) const; void write_index_column(t_uindex start_row, t_uindex end_row, + bool has_row_path, bool leaves_only, bool is_formatted, std::shared_ptr> slice, rapidjson::Writer& writer) const; diff --git a/packages/perspective-viewer-d3fc/src/js/plugin/plugin.js b/packages/perspective-viewer-d3fc/src/js/plugin/plugin.js index 95d8ed49ae..276ad946d7 100644 --- a/packages/perspective-viewer-d3fc/src/js/plugin/plugin.js +++ b/packages/perspective-viewer-d3fc/src/js/plugin/plugin.js @@ -267,17 +267,23 @@ export function register(...plugins) { let jsonp, metadata; const leaves_only = chart.plugin.name !== "Sunburst"; if (end_col && end_row) { - jsonp = view.to_json({ + jsonp = view.to_columns_string({ end_row, end_col, leaves_only, }); } else if (end_col) { - jsonp = view.to_json({ end_col, leaves_only }); + jsonp = view.to_columns_string({ + end_col, + leaves_only, + }); } else if (end_row) { - jsonp = view.to_json({ end_row, leaves_only }); + jsonp = view.to_columns_string({ + end_row, + leaves_only, + }); } else { - jsonp = view.to_json({ leaves_only }); + jsonp = view.to_columns_string({ leaves_only }); } metadata = await Promise.all([ @@ -295,10 +301,23 @@ export function register(...plugins) { table_schema, expression_schema, view_schema, - json, + json_string, config, ] = metadata; + let json2 = JSON.parse(json_string); + const keys = Object.keys(json2); + let json = { + row(ridx) { + const obj = {}; + for (const name of keys) { + obj[name] = json2[name][ridx]; + } + + return obj; + }, + }; + this.config = real_config; const realValues = this.config.columns; @@ -317,10 +336,12 @@ export function register(...plugins) { }; const { columns, group_by, split_by, filter } = config; + const first_col = json2[Object.keys(json2)[0]] || []; const filtered = group_by.length > 0 - ? json.reduce( - (acc, col) => { + ? first_col.reduce( + (acc, _, idx) => { + const col = json.row(idx); if ( col.__ROW_PATH__ && col.__ROW_PATH__.length == @@ -345,7 +366,12 @@ export function register(...plugins) { }, { rows: [], aggs: [], agg_paths: [] } ) - : { rows: json }; + : { + rows: first_col.map((_, idx) => + json.row(idx) + ), + }; + const dataMap = (col, i) => !group_by.length ? { ...col, __ROW_PATH__: [i] } diff --git a/packages/perspective-viewer-datagrid/src/js/data_listener/index.js b/packages/perspective-viewer-datagrid/src/js/data_listener/index.js index 37911622c0..a2d983ed96 100644 --- a/packages/perspective-viewer-datagrid/src/js/data_listener/index.js +++ b/packages/perspective-viewer-datagrid/src/js/data_listener/index.js @@ -45,7 +45,9 @@ export function createDataListener() { id: true, }; - columns = await this._view.to_columns(new_window); + columns = JSON.parse( + await this._view.to_columns_string(new_window) + ); this._last_window = new_window; this._ids = columns.__ID__; diff --git a/packages/perspective/src/js/perspective.js b/packages/perspective/src/js/perspective.js index 30449e83bd..8e33692aa4 100644 --- a/packages/perspective/src/js/perspective.js +++ b/packages/perspective/src/js/perspective.js @@ -17,8 +17,6 @@ import { extract_vector, extract_map, fill_vector } from "./emscripten.js"; import { bindall, get_column_type } from "./utils.js"; import { Server } from "./api/server.js"; -import formatters from "./view_formatters"; - if (typeof self !== "undefined" && self.performance === undefined) { self.performance = { now: Date.now }; } @@ -519,167 +517,6 @@ export default function (Module) { } }; - /** - * Generic base function from which `to_json`, `to_columns` etc. derives. - * - * @private - */ - const to_format = function (options, formatter) { - _call_process(this.table.get_id()); - options = _parse_format_options.bind(this)(options); - const start_row = options.start_row; - const end_row = options.end_row; - const start_col = options.start_col; - const end_col = options.end_col; - const hidden = this._num_hidden(); - - const is_formatted = options.formatted; - const get_pkeys = !!options.index; - const get_ids = !!options.id; - const leaves_only = !!options.leaves_only; - const num_sides = this.sides(); - const has_row_path = num_sides !== 0 && !this.column_only; - const nidx = SIDES[num_sides]; - - let get_from_data_slice; - - if (this.is_unit_context) { - get_from_data_slice = __MODULE__.get_from_data_slice_unit; - } else { - get_from_data_slice = __MODULE__[`get_from_data_slice_${nidx}`]; - } - - const slice = this.get_data_slice( - start_row, - end_row, - start_col, - end_col - ); - const ns = slice.get_column_names(); - const col_names = extract_vector_scalar(ns).map((x) => - x.join(defaults.COLUMN_SEPARATOR_STRING) - ); - const schema = this.schema(); - - let data = formatter.initDataValue(); - - for (let cidx = start_col; cidx < end_col; cidx++) { - const col_name = col_names[cidx]; - formatter.initColumnValue(data, col_name); - } - - for (let ridx = start_row; ridx < end_row; ridx++) { - let row_path = has_row_path ? slice.get_row_path(ridx) : undefined; - if ( - has_row_path && - leaves_only && - row_path.size() < this.config.group_by.length - ) { - row_path.delete(); - continue; - } - let row = formatter.initRowValue(); - - if (get_ids) { - formatter.initColumnRowPath(data, row, "__ID__"); - } - - for (let cidx = start_col; cidx < end_col; cidx++) { - const col_name = col_names[cidx]; - const col_type = schema[col_name]; - const type_config = get_type_config(col_type); - - if (cidx === start_col && num_sides !== 0) { - if (!this.column_only) { - formatter.initColumnRowPath(data, row, "__ROW_PATH__"); - for (let i = 0; i < row_path.size(); i++) { - const s = row_path.get(i); - const value = __MODULE__.scalar_to_val( - s, - false, - false - ); - s.delete(); - formatter.addColumnValue( - data, - row, - "__ROW_PATH__", - value - ); - if (get_ids) { - formatter.addColumnValue( - data, - row, - "__ID__", - value - ); - } - } - } - } else if ( - (cidx - (num_sides > 0 ? 1 : 0)) % - (this.config.columns.length + hidden) >= - this.config.columns.length - ) { - // Hidden columns are always at the end of the column names - // list, and we need to skip them from the output. - continue; - } else { - let value = get_from_data_slice(slice, ridx, cidx); - if (is_formatted && value !== null && value !== undefined) { - if (col_type === "datetime" || col_type === "date") { - // TODO Annoyingly, CSV occupies the gray area of - // needing formatting _just_ for Date and Datetime - - // e.g., 10000 will format as CSV `"10,000.00" - // Otherwise, this would not need to be conditional. - value = new Date(value); - value = value.toLocaleString( - [], - type_config.format - ); - } - } - formatter.setColumnValue(data, row, col_name, value); - } - } - - if (get_pkeys) { - const keys = slice.get_pkeys(ridx, 0); - formatter.initColumnRowPath(data, row, "__INDEX__"); - for (let i = 0; i < keys.size(); i++) { - // TODO: if __INDEX__ and set index have the same value, - // don't we need to make sure that it only emits one? - const s = keys.get(i); - const value = __MODULE__.scalar_to_val(s, false, false); - s.delete(); - formatter.addColumnValue(data, row, "__INDEX__", value); - } - keys.delete(); - } - - // we could add an api to just clone the index column if - // it's already calculated - if (get_ids && num_sides === 0) { - const keys = slice.get_pkeys(ridx, 0); - for (let i = 0; i < keys.size(); i++) { - const s = keys.get(i); - const value = __MODULE__.scalar_to_val(s, false, false); - s.delete(); - formatter.addColumnValue(data, row, "__ID__", value); - } - keys.delete(); - } - - if (row_path) { - row_path.delete(); - } - formatter.addRow(data, row); - } - - slice.delete(); - return formatter.formatData(data, options.config); - }; - /** * Generic base function for returning serialized data for a single column. * @@ -751,25 +588,7 @@ export default function (Module) { * comma-separated column paths. */ view.prototype.to_columns = function (options) { - const schema = this.schema(); - - let parsed_json = JSON.parse(this.to_columns_string(options)); - - const corrected_json = Object.entries(parsed_json).map(([key, val]) => { - let col_type = schema[key]; - let v = val; - - // Convert date epoch numbers. - // Also handle Infinity and -Infinity in floats, - // which are returned as strings since JSON doesn't support them. - if (col_type === "date" || col_type === "float") { - v = val.map((x) => (x !== null ? Number(x) : null)); - } - - return [key, v]; - }); - - return Object.fromEntries(corrected_json); + return JSON.parse(this.to_columns_string(options)); }; /** @@ -777,53 +596,39 @@ export default function (Module) { * save additional round trip serialize/deserialize cycles. */ view.prototype.to_columns_string = function (options) { + _call_process(this.table.get_id()); + options = _parse_format_options.bind(this)(options); + const start_row = options.start_row; + const end_row = options.end_row; + const start_col = options.start_col; + const end_col = options.end_col; + const hidden = this._num_hidden(); + const is_formatted = options.formatted; + const get_pkeys = !!options.index; + const get_ids = !!options.id; + const leaves_only = !!options.leaves_only; const num_sides = this.sides(); - - switch (num_sides) { - case 0: - case 1: - - case 2: - _call_process(this.table.get_id()); - options = _parse_format_options.bind(this)(options); - const start_row = options.start_row; - const end_row = options.end_row; - const start_col = options.start_col; - const end_col = options.end_col; - const hidden = this._num_hidden(); - - const is_formatted = options.formatted; - const get_pkeys = !!options.index; - const get_ids = !!options.id; - const leaves_only = !!options.leaves_only; - const num_sides = this.sides(); - const has_row_path = num_sides !== 0 && !this.column_only; - const nidx = SIDES[num_sides]; - - const config = this.get_config(); - const columns_length = config.columns.length; - const group_by_length = config.group_by.length; - - return this._View.to_columns( - start_row, - end_row, - start_col, - end_col, - hidden, - is_formatted, - get_pkeys, - get_ids, - leaves_only, - num_sides, - has_row_path, - nidx, - columns_length, - group_by_length - ); - - default: - throw new Error("Unknown context type"); - } + const has_row_path = num_sides !== 0 && !this.column_only; + const nidx = SIDES[num_sides]; + const config = this.get_config(); + const columns_length = config.columns.length; + const group_by_length = config.group_by.length; + return this._View.to_columns( + start_row, + end_row, + start_col, + end_col, + hidden, + is_formatted, + get_pkeys, + get_ids, + leaves_only, + num_sides, + has_row_path, + nidx, + columns_length, + group_by_length + ); }; /** @@ -851,7 +656,17 @@ export default function (Module) { * comma-separated column paths. */ view.prototype.to_json = function (options) { - return to_format.call(this, options, formatters.jsonFormatter); + const cols = this.to_columns(options); + const colnames = Object.keys(cols); + const first_col = cols[colnames[0]] || []; + return first_col.map((_, idx) => { + const obj = {}; + for (const key of colnames) { + obj[key] = cols[key][idx]; + } + + return obj; + }); }; /** diff --git a/packages/perspective/src/js/view_formatters.js b/packages/perspective/src/js/view_formatters.js deleted file mode 100644 index 1a27b54bba..0000000000 --- a/packages/perspective/src/js/view_formatters.js +++ /dev/null @@ -1,55 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -const jsonFormatter = { - initDataValue: () => [], - initRowValue: () => ({}), - initColumnValue: (data, colName) => {}, - initColumnRowPath: (data, row, colName) => (row[colName] = []), - setColumnValue: (data, row, colName, value) => (row[colName] = value), - addColumnValue: (data, row, colName, value) => row[colName].unshift(value), - addRow: (data, row) => data.push(row), - formatData: (data) => data, - slice: (data, start) => data.slice(start), -}; - -const jsonTableFormatter = { - initDataValue: () => new Object(), - initRowValue: () => {}, - initColumnValue: (data, colName) => { - data[colName] = []; - }, - setColumnValue: (data, row, colName, value) => { - data[colName].push(value); - }, - addColumnValue: (data, row, colName, value) => { - data[colName][data[colName].length - 1].unshift(value); - }, - initColumnRowPath: (data, row, colName) => { - data[colName] = data[colName] || []; - data[colName].push([]); - }, - addRow: () => {}, - formatData: (data) => data, - slice: (data, start) => { - let new_data = {}; - for (let x in data) { - new_data[x] = data[x].slice(start); - } - return new_data; - }, -}; - -export default { - jsonFormatter, - jsonTableFormatter, -}; diff --git a/packages/perspective/test/js/expressions/conversions.spec.js b/packages/perspective/test/js/expressions/conversions.spec.js index bf617e2cac..1ff5654253 100644 --- a/packages/perspective/test/js/expressions/conversions.spec.js +++ b/packages/perspective/test/js/expressions/conversions.spec.js @@ -361,10 +361,10 @@ const perspective = require("@finos/perspective"); expect(result["computed12"]).toEqual([null]); expect(result["computed13"]).toEqual([2147483648.1234566]); expect(result["computed14"]).toEqual([-2147483649]); - expect(result["computed15"]).toEqual([Infinity]); - expect(result["computed16"]).toEqual([-Infinity]); - expect(result["computed17"]).toEqual([Infinity]); - expect(result["computed18"]).toEqual([-Infinity]); + expect(result["computed15"]).toEqual([null]); + expect(result["computed16"]).toEqual([null]); + expect(result["computed17"]).toEqual([null]); + expect(result["computed18"]).toEqual([null]); await view.delete(); await table.delete(); diff --git a/packages/perspective/test/js/expressions/functionality.spec.js b/packages/perspective/test/js/expressions/functionality.spec.js index a59802bb64..44d03c7f83 100644 --- a/packages/perspective/test/js/expressions/functionality.spec.js +++ b/packages/perspective/test/js/expressions/functionality.spec.js @@ -2450,7 +2450,6 @@ const perspective = require("@finos/perspective"); "8.5|y": [null, null, null, "d"], "8.5|z": [null, null, null, false], '8.5|"w" + "x"': [null, null, null, 8.5], - __ROW_PATH__: [], }); view.delete(); table.delete(); diff --git a/packages/perspective/test/js/leaks.spec.js b/packages/perspective/test/js/leaks.spec.js index 2e236d7891..d77659dd89 100644 --- a/packages/perspective/test/js/leaks.spec.js +++ b/packages/perspective/test/js/leaks.spec.js @@ -87,6 +87,17 @@ test.describe("leaks", function () { view.delete(); table.delete(); }); + + test("to_columns_string does not leak", async () => { + const table = await perspective.table(arr.slice()); + const view = await table.view({ group_by: ["State"] }); + await leak_test(async function () { + let json = await view.to_columns_string(); + expect(json.length).toEqual(6722); + }); + view.delete(); + table.delete(); + }); }); }); @@ -111,6 +122,19 @@ test.describe("leaks", function () { view.delete(); table.delete(); }); + + test.skip("csv loading does not leak", async () => { + const table = await perspective.table(arr.slice()); + const view = await table.view(); + const csv = await view.to_csv({ end_row: 10 }); + view.delete(); + table.delete(); + await leak_test(async function () { + const table = await perspective.table(csv); + expect(await table.size()).toEqual(10); + await table.delete(); + }); + }); }); test.describe("expression columns", function () { diff --git a/packages/perspective/test/js/pivots.spec.js b/packages/perspective/test/js/pivots.spec.js index efaeeebe90..d6e523c1da 100644 --- a/packages/perspective/test/js/pivots.spec.js +++ b/packages/perspective/test/js/pivots.spec.js @@ -358,7 +358,7 @@ const std = (nums) => { "null, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "null, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - null, + "null", ], }; let result = await view.to_columns(); @@ -2364,7 +2364,6 @@ const std = (nums) => { let result2 = await view.to_columns(); expect(result2).toEqual({ - __ROW_PATH__: [], "2019-04-11 23:40:35.065|x": [null, null, 3, 4], "2019-04-11 23:40:35.065|y": [null, null, "c", "d"], "2019-04-13 03:27:15.065|x": [1, 2, null, null], @@ -2434,7 +2433,6 @@ const std = (nums) => { }); let result2 = await view.to_columns(); expect(result2).toEqual({ - __ROW_PATH__: [], "true|w": [1.5, null, 3.5, null], "true|x": [1, null, 3, null], "true|y": ["a", null, "c", null], diff --git a/packages/perspective/test/js/sort.spec.js b/packages/perspective/test/js/sort.spec.js index 4913efa52a..1d18c5f083 100644 --- a/packages/perspective/test/js/sort.spec.js +++ b/packages/perspective/test/js/sort.spec.js @@ -575,7 +575,6 @@ const data3 = { const paths = await view.column_paths(); expect(paths).toEqual(["d|w", "c|w", "b|w", "a|w"]); const answer = { - __ROW_PATH__: [], "d|w": [null, null, null, 4.5, null, null, null, 8.5], "c|w": [null, null, 3.5, null, null, null, 7.5, null], "b|w": [null, 2.5, null, null, null, 6.5, null, null], @@ -604,7 +603,6 @@ const data3 = { const result = await view.to_columns(); expect(result).toEqual({ - __ROW_PATH__: [], "a|x": [null, 1, 2, 3], "b|x": [4, null, null, null], }); @@ -628,7 +626,6 @@ const data3 = { const result = await view.to_columns(); expect(result).toEqual({ - __ROW_PATH__: [], "b|x": [null, null, null, 4], "a|x": [1, 2, 3, null], }); @@ -659,7 +656,6 @@ const data3 = { const result = await view.to_columns(); expect(result).toEqual({ - __ROW_PATH__: [], "a|x": [null, 1, 2, 3], "b|x": [4, null, null, null], }); @@ -689,7 +685,6 @@ const data3 = { const result = await view.to_columns(); expect(result).toEqual({ - __ROW_PATH__: [], "b|x": [null, null, null, 4], "a|x": [1, 2, 3, null], }); @@ -715,7 +710,6 @@ const data3 = { let result = await view.to_columns(); expect(result).toEqual({ - __ROW_PATH__: [], "b|x": [null, null, null, 4], "a|x": [1, 2, 3, null], }); diff --git a/packages/perspective/test/js/to_format.spec.js b/packages/perspective/test/js/to_format.spec.js index 3bb9e258ff..82916c0500 100644 --- a/packages/perspective/test/js/to_format.spec.js +++ b/packages/perspective/test/js/to_format.spec.js @@ -82,7 +82,7 @@ const pivoted_output = [ let json = await view.to_json({ start_col: 5, }); - expect(json).toEqual([{}, {}, {}, {}]); + expect(json).toEqual([]); view.delete(); table.delete(); }); @@ -126,7 +126,7 @@ const pivoted_output = [ start_col: 2, }); - expect(json).toEqual([{}, {}, {}, {}]); + expect(json).toEqual([]); view.delete(); table.delete(); }); @@ -431,8 +431,8 @@ const pivoted_output = [ let view = await table.view(); let json = await view.to_json({ formatted: true }); expect(json).toEqual([ - { datetime: "6/13/16" }, - { datetime: "6/14/16" }, + { datetime: "2016-06-13" }, + { datetime: "2016-06-14" }, ]); view.delete(); table.delete(); @@ -445,14 +445,9 @@ const pivoted_output = [ ]); let view = await table.view(); let json = await view.to_json({ formatted: true }); - json = json.map((obj) => { - obj.datetime = obj.datetime.replace(/[^:,\/|A-Z0-9 ]/gi, " "); - return obj; - }, {}); - expect(json).toEqual([ - { datetime: "1/1/16, 12:30:00 AM" }, - { datetime: "6/15/16, 7:20:00 PM" }, + { datetime: "2016-01-01 00:30:00.000" }, + { datetime: "2016-06-15 19:20:00.000" }, ]); view.delete(); table.delete(); diff --git a/packages/perspective/test/js/to_format_viewport.spec.js b/packages/perspective/test/js/to_format_viewport.spec.js index d5178b2c60..0fb774bebd 100644 --- a/packages/perspective/test/js/to_format_viewport.spec.js +++ b/packages/perspective/test/js/to_format_viewport.spec.js @@ -188,7 +188,6 @@ test.describe("to_format viewport", function () { }); const cols = await view.to_columns({ start_col: 0, end_col: 1 }); expect(cols).toEqual({ - __ROW_PATH__: [], "false|w": [ null, 2.5, @@ -219,7 +218,6 @@ test.describe("to_format viewport", function () { }); const cols = await view.to_columns({ start_col: 1, end_col: 2 }); expect(cols).toEqual({ - __ROW_PATH__: [], "false|x": [ null, 2, @@ -250,7 +248,6 @@ test.describe("to_format viewport", function () { }); const cols = await view.to_columns({ start_col: 0, end_col: 2 }); expect(cols).toEqual({ - __ROW_PATH__: [], "false|w": [ null, 2.5, diff --git a/python/perspective/bench/runtime/perspective_benchmark.py b/python/perspective/bench/runtime/perspective_benchmark.py index 7c962bf789..994c1d574b 100644 --- a/python/perspective/bench/runtime/perspective_benchmark.py +++ b/python/perspective/bench/runtime/perspective_benchmark.py @@ -184,9 +184,12 @@ def benchmark_to_format_zero(self): for name in ( "arrow", "csv", + "columns", + "records", ): - test_meta = make_meta("to_format", "to_{}".format(name)) - func = Benchmark(lambda: getattr(self._view, "to_{0}".format(name))(), meta=test_meta) + method = "to_{0}".format(name) + test_meta = make_meta("to_format", method) + func = Benchmark(getattr(self._view, method), meta=test_meta) setattr(self, "to_format_{0}".format(name), func) def benchmark_to_format_one(self): @@ -194,13 +197,16 @@ def benchmark_to_format_one(self): for name in ( "arrow", "csv", + "columns", + "records", ): for pivot in PerspectiveBenchmark.group_by_OPTIONS: if len(pivot) == 0: continue test_meta = make_meta("to_format", "to_{0}_r{1}".format(name, len(pivot))) view = self._table.view(group_by=pivot) - func = Benchmark(lambda: getattr(view, "to_{0}".format(name))(), meta=test_meta) + method = "to_{0}".format(name) + func = Benchmark(getattr(view, method), meta=test_meta) setattr(self, "to_format_{0}".format(test_meta["name"]), func) def benchmark_to_format_two(self): @@ -208,6 +214,8 @@ def benchmark_to_format_two(self): for name in ( "arrow", "csv", + "columns", + "records", ): for i in range(len(PerspectiveBenchmark.group_by_OPTIONS)): RP = PerspectiveBenchmark.group_by_OPTIONS[i] @@ -216,7 +224,8 @@ def benchmark_to_format_two(self): continue test_meta = make_meta("to_format", "to_{0}_r{1}_c{2}".format(name, len(RP), len(CP))) view = self._table.view(group_by=RP, split_by=CP) - func = Benchmark(lambda: getattr(view, "to_{0}".format(name))(), meta=test_meta) + method = "to_{0}".format(name) + func = Benchmark(getattr(view, method), meta=test_meta) setattr(self, "to_format_{0}".format(test_meta["name"]), func) diff --git a/python/perspective/bench/runtime/run_perspective_benchmark.py b/python/perspective/bench/runtime/run_perspective_benchmark.py index 4d1d525d62..f924fde7fd 100644 --- a/python/perspective/bench/runtime/run_perspective_benchmark.py +++ b/python/perspective/bench/runtime/run_perspective_benchmark.py @@ -19,6 +19,7 @@ """Benchmark the `perspective-python` runtime locally.""" VERSIONS = [ "master", + "2.3.2", "2.3.1", # "2.3.0", "2.2.1", @@ -28,7 +29,7 @@ # Access the benchmark virtualenv HERE = os.path.abspath(os.path.dirname(__file__)) VIRTUALENV_NAME = "benchmark_venv" - VIRTUALENV_PATH = os.path.join(HERE, VIRTUALENV_NAME) + VIRTUALENV_PATH = os.path.join(HERE, "..", "..", "..", "..", VIRTUALENV_NAME) venv_handler = VirtualEnvHandler(VIRTUALENV_PATH) print("Benchmarking perspective-python==master") diff --git a/python/perspective/perspective/client/view_api.py b/python/perspective/perspective/client/view_api.py index fa4097efec..1f148b782b 100644 --- a/python/perspective/perspective/client/view_api.py +++ b/python/perspective/perspective/client/view_api.py @@ -153,3 +153,6 @@ def to_json(self, **kwargs): def to_columns(self, **kwargs): return self._async_queue("to_columns", "view_method", **kwargs) + + def to_columns_string(self, **kwargs): + return self._async_queue("to_columns_string", "view_method", **kwargs) diff --git a/python/perspective/perspective/include/perspective/python.h b/python/perspective/perspective/include/perspective/python.h index a021acadb2..f8f2b5ba42 100644 --- a/python/perspective/perspective/include/perspective/python.h +++ b/python/perspective/perspective/include/perspective/python.h @@ -112,6 +112,7 @@ PYBIND11_MODULE(libpsppy, m) { .def("get_min_max", &View::get_min_max) .def("get_step_delta", &View::get_step_delta) .def("get_column_dtype", &View::get_column_dtype) + .def("to_columns", &View::to_columns) .def("is_column_only", &View::is_column_only); py::class_, std::shared_ptr>>(m, "View_ctx0") @@ -136,6 +137,7 @@ PYBIND11_MODULE(libpsppy, m) { .def("get_min_max", &View::get_min_max) .def("get_step_delta", &View::get_step_delta) .def("get_column_dtype", &View::get_column_dtype) + .def("to_columns", &View::to_columns) .def("is_column_only", &View::is_column_only); py::class_, std::shared_ptr>>(m, "View_ctx1") @@ -163,6 +165,7 @@ PYBIND11_MODULE(libpsppy, m) { .def("get_min_max", &View::get_min_max) .def("get_step_delta", &View::get_step_delta) .def("get_column_dtype", &View::get_column_dtype) + .def("to_columns", &View::to_columns) .def("is_column_only", &View::is_column_only); py::class_, std::shared_ptr>>(m, "View_ctx2") @@ -191,6 +194,7 @@ PYBIND11_MODULE(libpsppy, m) { .def("get_row_path", &View::get_row_path) .def("get_step_delta", &View::get_step_delta) .def("get_column_dtype", &View::get_column_dtype) + .def("to_columns", &View::to_columns) .def("is_column_only", &View::is_column_only); /****************************************************************************** diff --git a/python/perspective/perspective/table/_data_formatter.py b/python/perspective/perspective/table/_data_formatter.py index e2f7c86909..ae59757152 100644 --- a/python/perspective/perspective/table/_data_formatter.py +++ b/python/perspective/perspective/table/_data_formatter.py @@ -213,8 +213,8 @@ def _parse_format_options(view, options): "end_col": int( ceil( min( - (options.get("end_col", max_cols) + column_only_offset) * (view._num_hidden_cols() + 1), max_cols, + (options.get("end_col") + column_only_offset if "end_col" in options else max_cols) * (view._num_hidden_cols() + 1), ) ) ), diff --git a/python/perspective/perspective/table/view.py b/python/perspective/perspective/table/view.py index 5abdf837c0..3cca41fd33 100644 --- a/python/perspective/perspective/table/view.py +++ b/python/perspective/perspective/table/view.py @@ -11,6 +11,8 @@ # ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ import pandas +import json +import datetime from functools import partial, wraps from random import random @@ -487,9 +489,34 @@ def to_records(self, **kwargs): represents a row of the current state of the :class:`~perspective.View`. """ - return to_format(kwargs, self, "records") + columns = self.to_columns(**kwargs) + colnames = list(columns.keys()) + if len(colnames) > 0: + if colnames[0] in columns: + nrows = len(columns[colnames[0]]) + return [{key: columns[key][i] for key in colnames} for i in range(nrows)] + return [] + + def to_columns_string(self, **kwargs): + options = _parse_format_options(self, kwargs) + return self._view.to_columns( + options["start_row"], + options["end_row"], + options["start_col"], + options["end_col"], + self._num_hidden_cols(), + kwargs.get("formatted", False), + kwargs.get("index", False), + kwargs.get("id", False), + kwargs.get("leaves_only", False), + self._sides, + self._sides != 0 and not self._column_only, + "zero" if self._sides == 0 else "one" if self._sides == 1 else "two", + len(self._config.get_columns()), + len(self._config.get_group_by()), + ) - def to_dict(self, **options): + def to_dict(self, **kwargs): """Serialize the :class:`~perspective.View`'s dataset into a :obj:`dict` of :obj:`str` keys and :obj:`list` values. Each key is a column name, and the associated value is the column's data packed into a :obj:`list`. @@ -514,7 +541,43 @@ def to_dict(self, **options): :obj:`dict`: A dictionary with string keys and list values, where key = column name and value = column values. """ - return to_format(options, self, "dict") + data = json.loads(self.to_columns_string(**kwargs)) + schema = self.schema(True) + table_schema = self._table.schema(True) + out = {} + + for name, col in data.items(): + if schema.get(name.split("|")[-1], "") in ( + "date", + "datetime", + ) or schema.get( + name, "" + ) in ("date", "datetime"): + out[name] = list( + map( + lambda x: datetime.datetime.fromtimestamp(x / 1000) if x is not None else None, + col, + ) + ) + else: + out[name] = col + + for idx, name in enumerate(self._config.get_group_by()): + if table_schema.get(name, "") in ("date", "datetime"): + row_path_col = out["__ROW_PATH__"] + for row in row_path_col: + if idx < len(row): + row[idx] = datetime.datetime.fromtimestamp(row[idx] / 1000) if row[idx] is not None else None + + if kwargs.get("index", False) and table_schema.get(self._table._index, "") in ( + "date", + "datetime", + ): + row_path_col = out["__INDEX__"] + for idx in range(len(row_path_col)): + row_path_col[idx][0] = datetime.datetime.fromtimestamp(row_path_col[idx][0] / 1000) if row_path_col[idx][0] is not None else None + + return out def to_numpy(self, **options): """Serialize the view's dataset into a :obj:`dict` of :obj:`str` keys diff --git a/python/perspective/perspective/tests/manager/test_manager.py b/python/perspective/perspective/tests/manager/test_manager.py index dddccfdd46..bff022bd16 100644 --- a/python/perspective/perspective/tests/manager/test_manager.py +++ b/python/perspective/perspective/tests/manager/test_manager.py @@ -562,10 +562,7 @@ def test_manager_to_dict_with_nan(self, util, sentinel): def handle_to_dict(msg): s.set(True) message = json.loads(msg) - assert message == { - "id": 2, - "error": "JSON serialization error: Cannot serialize `NaN`, `Infinity` or `-Infinity` to JSON.", - } + assert message == {"id": 2, "data": {"a": [1.5, None, 2.5, None]}} message = {"id": 1, "table_name": "table1", "view_name": "view1", "cmd": "view"} manager = PerspectiveManager() diff --git a/python/perspective/perspective/tests/table/test_to_arrow.py b/python/perspective/perspective/tests/table/test_to_arrow.py index d48cab303a..b733b6dd70 100644 --- a/python/perspective/perspective/tests/table/test_to_arrow.py +++ b/python/perspective/perspective/tests/table/test_to_arrow.py @@ -25,7 +25,15 @@ def test_to_arrow_nones_symmetric(self): assert tbl2.view().to_dict() == data def test_to_arrow_big_numbers_symmetric(self): - data = {"a": [1, 2, 3, 4], "b": [1.7976931348623157e308, 1.7976931348623157e308, 1.7976931348623157e308, 1.7976931348623157e308]} + data = { + "a": [1, 2, 3, 4], + "b": [ + 1.7976931348623157e308, + 1.7976931348623157e308, + 1.7976931348623157e308, + 1.7976931348623157e308, + ], + } tbl = Table(data) assert tbl.schema() == {"a": int, "b": float} arr = tbl.view().to_arrow() @@ -185,7 +193,7 @@ def test_to_arrow_start_end_row_equiv(self): assert tbl.schema() == {"a": int, "b": float} arr = tbl.view().to_arrow(start_row=2, end_row=2) tbl2 = Table(arr) - assert tbl2.view().to_dict() == {} + assert tbl2.view().to_dict() == {"a": [], "b": []} def test_to_arrow_start_row_invalid(self): data = {"a": [None, 1, None, 2, 3], "b": [1.5, 2.5, None, 3.5, None]} diff --git a/python/perspective/perspective/tests/table/test_to_format.py b/python/perspective/perspective/tests/table/test_to_format.py index 36d41bd789..be049c40f4 100644 --- a/python/perspective/perspective/tests/table/test_to_format.py +++ b/python/perspective/perspective/tests/table/test_to_format.py @@ -50,7 +50,10 @@ def test_to_records_date(self): data = [{"a": today, "b": "string2"}, {"a": today, "b": "string4"}] tbl = Table(data) view = tbl.view() - assert view.to_records() == [{"a": dt, "b": "string2"}, {"a": dt, "b": "string4"}] + assert view.to_records() == [ + {"a": dt, "b": "string2"}, + {"a": dt, "b": "string4"}, + ] def test_to_records_date_no_dst(self): # make sure that DST does not affect the way we read dates - if tm_dst in `t_date::get_tm()` isn't set to -1, it could reverse 1hr by assuming DST is not in effect. @@ -59,27 +62,45 @@ def test_to_records_date_no_dst(self): data = [{"a": today, "b": "string2"}, {"a": today, "b": "string4"}] tbl = Table(data) view = tbl.view() - assert view.to_records() == [{"a": dt, "b": "string2"}, {"a": dt, "b": "string4"}] + assert view.to_records() == [ + {"a": dt, "b": "string2"}, + {"a": dt, "b": "string4"}, + ] def test_to_records_date_str(self): - data = [{"a": "03/11/2019", "b": "string2"}, {"a": "03/12/2019", "b": "string4"}] + data = [ + {"a": "03/11/2019", "b": "string2"}, + {"a": "03/12/2019", "b": "string4"}, + ] tbl = Table(data) view = tbl.view() - assert view.to_records() == [{"a": datetime(2019, 3, 11), "b": "string2"}, {"a": datetime(2019, 3, 12), "b": "string4"}] + assert view.to_records() == [ + {"a": datetime(2019, 3, 11), "b": "string2"}, + {"a": datetime(2019, 3, 12), "b": "string4"}, + ] def test_to_records_date_str_month_first(self): data = [{"a": "1/2/2019", "b": "string2"}, {"a": "3/4/2019", "b": "string4"}] tbl = Table(data) view = tbl.view() assert view.schema() == {"a": date, "b": str} - assert view.to_records() == [{"a": datetime(2019, 1, 2), "b": "string2"}, {"a": datetime(2019, 3, 4), "b": "string4"}] + assert view.to_records() == [ + {"a": datetime(2019, 1, 2), "b": "string2"}, + {"a": datetime(2019, 3, 4), "b": "string4"}, + ] def test_to_records_date_str_month_ymd(self): - data = [{"a": "2019/01/02", "b": "string2"}, {"a": "2019/03/04", "b": "string4"}] + data = [ + {"a": "2019/01/02", "b": "string2"}, + {"a": "2019/03/04", "b": "string4"}, + ] tbl = Table(data) view = tbl.view() assert view.schema() == {"a": date, "b": str} - assert view.to_records() == [{"a": datetime(2019, 1, 2), "b": "string2"}, {"a": datetime(2019, 3, 4), "b": "string4"}] + assert view.to_records() == [ + {"a": datetime(2019, 1, 2), "b": "string2"}, + {"a": datetime(2019, 3, 4), "b": "string4"}, + ] def test_to_records_datetime(self): dt = datetime(2019, 9, 10, 19, 30, 59, 515000) @@ -89,10 +110,16 @@ def test_to_records_datetime(self): assert view.to_records() == data # should have symmetric input/output def test_to_records_datetime_str(self): - data = [{"a": "03/11/2019 3:15PM", "b": "string2"}, {"a": "3/11/2019 3:20PM", "b": "string4"}] + data = [ + {"a": "03/11/2019 3:15PM", "b": "string2"}, + {"a": "3/11/2019 3:20PM", "b": "string4"}, + ] tbl = Table(data) view = tbl.view() - assert view.to_records() == [{"a": datetime(2019, 3, 11, 15, 15), "b": "string2"}, {"a": datetime(2019, 3, 11, 15, 20), "b": "string4"}] + assert view.to_records() == [ + {"a": datetime(2019, 3, 11, 15, 15), "b": "string2"}, + {"a": datetime(2019, 3, 11, 15, 20), "b": "string4"}, + ] def test_to_records_datetime_str_tz(self): dt = "2019/07/25T15:30:00+00:00" @@ -102,13 +129,19 @@ def test_to_records_datetime_str_tz(self): records = view.to_records() for r in records: r["a"] = r["a"].replace(tzinfo=pytz.utc) - assert records == [{"a": datetime(2019, 7, 25, 15, 30, tzinfo=pytz.utc)}, {"a": datetime(2019, 7, 25, 15, 30, tzinfo=pytz.utc)}] + assert records == [ + {"a": datetime(2019, 7, 25, 15, 30, tzinfo=pytz.utc)}, + {"a": datetime(2019, 7, 25, 15, 30, tzinfo=pytz.utc)}, + ] def test_to_records_datetime_ms_str(self): data = [{"a": "03/11/2019 3:15:15.999PM"}, {"a": "3/11/2019 3:15:16.001PM"}] tbl = Table(data) view = tbl.view() - assert view.to_records() == [{"a": datetime(2019, 3, 11, 15, 15, 15, 999000)}, {"a": datetime(2019, 3, 11, 15, 15, 16, 1000)}] + assert view.to_records() == [ + {"a": datetime(2019, 3, 11, 15, 15, 15, 999000)}, + {"a": datetime(2019, 3, 11, 15, 15, 16, 1000)}, + ] def test_to_records_none(self): data = [{"a": None, "b": 1}, {"a": None, "b": 2}] @@ -120,15 +153,30 @@ def test_to_records_one(self): data = [{"a": 1, "b": "string1"}, {"a": 1, "b": "string2"}] tbl = Table(data) view = tbl.view(group_by=["a"]) - assert view.to_records() == [{"__ROW_PATH__": [], "a": 2, "b": 2}, {"__ROW_PATH__": [1], "a": 2, "b": 2}] + assert view.to_records() == [ + {"__ROW_PATH__": [], "a": 2, "b": 2}, + {"__ROW_PATH__": [1], "a": 2, "b": 2}, + ] def test_to_records_two(self): data = [{"a": 1, "b": "string1"}, {"a": 1, "b": "string2"}] tbl = Table(data) view = tbl.view(group_by=["a"], split_by=["b"]) assert view.to_records() == [ - {"__ROW_PATH__": [], "string1|a": 1, "string1|b": 1, "string2|a": 1, "string2|b": 1}, - {"__ROW_PATH__": [1], "string1|a": 1, "string1|b": 1, "string2|a": 1, "string2|b": 1}, + { + "__ROW_PATH__": [], + "string1|a": 1, + "string1|b": 1, + "string2|a": 1, + "string2|b": 1, + }, + { + "__ROW_PATH__": [1], + "string1|a": 1, + "string1|b": 1, + "string2|a": 1, + "string2|b": 1, + }, ] def test_to_records_column_only(self): @@ -136,8 +184,18 @@ def test_to_records_column_only(self): tbl = Table(data) view = tbl.view(split_by=["b"]) assert view.to_records() == [ - {"string1|a": 1, "string1|b": "string1", "string2|a": None, "string2|b": None}, - {"string1|a": None, "string1|b": None, "string2|a": 1, "string2|b": "string2"}, + { + "string1|a": 1, + "string1|b": "string1", + "string2|a": None, + "string2|b": None, + }, + { + "string1|a": None, + "string1|b": None, + "string2|a": 1, + "string2|b": "string2", + }, ] # to_dict @@ -179,7 +237,10 @@ def test_to_dict_string(self): data = [{"a": "string1", "b": "string2"}, {"a": "string3", "b": "string4"}] tbl = Table(data) view = tbl.view() - assert view.to_dict() == {"a": ["string1", "string3"], "b": ["string2", "string4"]} + assert view.to_dict() == { + "a": ["string1", "string3"], + "b": ["string2", "string4"], + } def test_to_dict_none(self): data = [{"a": None, "b": None}, {"a": None, "b": None}] @@ -197,7 +258,11 @@ def test_to_dict_two(self): data = [{"a": 1, "b": 2}, {"a": 1, "b": 2}] tbl = Table(data) view = tbl.view(group_by=["a"], split_by=["b"]) - assert view.to_dict() == {"__ROW_PATH__": [[], [1]], "2|a": [2, 2], "2|b": [4, 4]} + assert view.to_dict() == { + "__ROW_PATH__": [[], [1]], + "2|a": [2, 2], + "2|b": [4, 4], + } def test_to_dict_column_only(self): data = [{"a": 1, "b": 2}, {"a": 1, "b": 2}] @@ -344,7 +409,11 @@ def test_to_records_one_over_max_row(self): tbl = Table(data) view = tbl.view(group_by=["a"]) records = view.to_records(end_row=1000) - assert records == [{"__ROW_PATH__": [], "a": 5, "b": 7}, {"__ROW_PATH__": [1.5], "a": 1.5, "b": 2.5}, {"__ROW_PATH__": [3.5], "a": 3.5, "b": 4.5}] + assert records == [ + {"__ROW_PATH__": [], "a": 5, "b": 7}, + {"__ROW_PATH__": [1.5], "a": 1.5, "b": 2.5}, + {"__ROW_PATH__": [3.5], "a": 3.5, "b": 4.5}, + ] def test_to_records_two_over_max_row(self): data = [{"a": 1, "b": 2}, {"a": 3, "b": 4}] @@ -427,42 +496,58 @@ def test_to_records_zero_start_gt_end_col(self): tbl = Table(data) view = tbl.view() records = view.to_records(start_col=2, end_col=1) - assert records == [{}, {}] + assert records == [] def test_to_records_zero_start_eq_end_col(self): data = [{"a": 1.5, "b": 2.5}, {"a": 3.5, "b": 4.5}] tbl = Table(data) view = tbl.view() records = view.to_records(start_col=1, end_col=1) - assert records == [{}, {}] + assert records == [] def test_to_records_one_over_max_col(self): data = [{"a": 1.5, "b": 2.5}, {"a": 3.5, "b": 4.5}] tbl = Table(data) view = tbl.view(group_by=["a"]) records = view.to_records(end_col=1000) - assert records == [{"__ROW_PATH__": [], "a": 5, "b": 7}, {"__ROW_PATH__": [1.5], "a": 1.5, "b": 2.5}, {"__ROW_PATH__": [3.5], "a": 3.5, "b": 4.5}] + assert records == [ + {"__ROW_PATH__": [], "a": 5, "b": 7}, + {"__ROW_PATH__": [1.5], "a": 1.5, "b": 2.5}, + {"__ROW_PATH__": [3.5], "a": 3.5, "b": 4.5}, + ] def test_to_records_one_start_gt_end_col(self): data = [{"a": 1.5, "b": 2.5}, {"a": 3.5, "b": 4.5}] tbl = Table(data) view = tbl.view(group_by=["a"]) records = view.to_records(start_col=2, end_col=1) - assert records == [{}, {}, {}] + assert records == [ + {"__ROW_PATH__": []}, + {"__ROW_PATH__": [1.5]}, + {"__ROW_PATH__": [3.5]}, + ] def test_to_records_one_start_gt_end_col_large(self): data = [{"a": 1.5, "b": 2.5}, {"a": 3.5, "b": 4.5}] tbl = Table(data) view = tbl.view(group_by=["a"]) records = view.to_records(start_col=20, end_col=19) - assert records == [{}, {}, {}] + assert records == [ + {"__ROW_PATH__": []}, + {"__ROW_PATH__": [1.5]}, + {"__ROW_PATH__": [3.5]}, + ] def test_to_records_one_start_eq_end_col(self): data = [{"a": 1.5, "b": 2.5}, {"a": 3.5, "b": 4.5}] tbl = Table(data) view = tbl.view(group_by=["a"]) records = view.to_records(start_col=0, end_col=0) - assert records == [{"__ROW_PATH__": []}, {"__ROW_PATH__": [1.5]}, {"__ROW_PATH__": [3.5]}] + assert records == [ + {"__ROW_PATH__": []}, + {"__ROW_PATH__": [1.5]}, + {"__ROW_PATH__": [3.5]}, + ] def test_to_records_two_over_max_col(self): data = [{"a": 1, "b": 2}, {"a": 3, "b": 4}] @@ -505,56 +590,88 @@ def test_to_records_two_start_gt_end_col(self): tbl = Table(data) view = tbl.view(group_by=["a"], split_by=["b"]) records = view.to_records(end_row=12, start_col=5, end_col=4) - assert records == [{}, {}, {}] + assert records == [ + {"__ROW_PATH__": []}, + {"__ROW_PATH__": [1]}, + {"__ROW_PATH__": [3]}, + ] def test_to_records_two_start_gt_end_col_large_overage(self): data = [{"a": 1, "b": 2}, {"a": 3, "b": 4}] tbl = Table(data) view = tbl.view(group_by=["a"], split_by=["b"]) records = view.to_records(end_row=12, start_col=50, end_col=49) - assert records == [{}, {}, {}] + assert records == [ + {"__ROW_PATH__": []}, + {"__ROW_PATH__": [1]}, + {"__ROW_PATH__": [3]}, + ] def test_to_records_two_start_end_col_equiv(self): data = [{"a": 1, "b": 2}, {"a": 3, "b": 4}] tbl = Table(data) view = tbl.view(group_by=["a"], split_by=["b"]) records = view.to_records(end_row=12, start_col=5, end_col=5) - assert records == [{}, {}, {}] + assert records == [ + {"__ROW_PATH__": []}, + {"__ROW_PATH__": [1]}, + {"__ROW_PATH__": [3]}, + ] def test_to_records_two_sorted_start_gt_end_col(self): data = [{"a": 1, "b": 2}, {"a": 3, "b": 4}] tbl = Table(data) view = tbl.view(group_by=["a"], split_by=["b"], sort=[["a", "desc"]]) records = view.to_records(end_row=12, start_col=5, end_col=4) - assert records == [{}, {}, {}] + assert records == [ + {"__ROW_PATH__": []}, + {"__ROW_PATH__": [3]}, + {"__ROW_PATH__": [1]}, + ] def test_to_records_two_sorted_start_gt_end_col_large_overage(self): data = [{"a": 1, "b": 2}, {"a": 3, "b": 4}] tbl = Table(data) view = tbl.view(group_by=["a"], split_by=["b"], sort=[["a", "desc"]]) records = view.to_records(end_row=12, start_col=20, end_col=30) - assert records == [{}, {}, {}] + assert records == [ + {"__ROW_PATH__": []}, + {"__ROW_PATH__": [3]}, + {"__ROW_PATH__": [1]}, + ] def test_to_records_two_sorted_start_gt_end_col_overage(self): data = [{"a": 1, "b": 2}, {"a": 3, "b": 4}] tbl = Table(data) view = tbl.view(columns=[], group_by=["a"], split_by=["b"], sort=[["a", "desc"]]) records = view.to_records(end_row=12, start_col=1, end_col=3) - assert records == [{}, {}, {}] + assert records == [ + {"__ROW_PATH__": []}, + {"__ROW_PATH__": [3]}, + {"__ROW_PATH__": [1]}, + ] def test_to_records_two_sorted_start_end_col(self): data = [{"a": 1, "b": 2}, {"a": 3, "b": 4}] tbl = Table(data) view = tbl.view(group_by=["a"], split_by=["b"], sort=[["a", "desc"]]) records = view.to_records(start_col=1, end_col=2) - assert records == [{"2|b": 2, "__ROW_PATH__": []}, {"2|b": None, "__ROW_PATH__": [3]}, {"2|b": 2, "__ROW_PATH__": [1]}] + assert records == [ + {"2|b": 2, "__ROW_PATH__": []}, + {"2|b": None, "__ROW_PATH__": [3]}, + {"2|b": 2, "__ROW_PATH__": [1]}, + ] def test_to_records_two_sorted_start_end_col_equiv(self): data = [{"a": 1, "b": 2}, {"a": 3, "b": 4}] tbl = Table(data) view = tbl.view(group_by=["a"], split_by=["b"], sort=[["a", "desc"]]) records = view.to_records(end_row=12, start_col=5, end_col=5) - assert records == [{}, {}, {}] + assert records == [ + {"__ROW_PATH__": []}, + {"__ROW_PATH__": [3]}, + {"__ROW_PATH__": [1]}, + ] def test_to_records_start_col_end_col(self): data = [{"a": 1, "b": 2, "c": 3}, {"a": 3, "b": 4, "c": 5}] @@ -569,7 +686,7 @@ def test_to_records_start_col_end_col_equiv(self): tbl = Table(data) view = tbl.view() records = view.to_records(start_col=1, end_col=1) - assert records == [{}, {}] + assert records == [] def test_to_records_floor_start_col(self): data = [{"a": 1, "b": 2}, {"a": 3, "b": 4}] @@ -728,25 +845,39 @@ def test_to_format_implicit_index_records(self): data = [{"a": 1.5, "b": 2.5}, {"a": 3.5, "b": 4.5}] tbl = Table(data) view = tbl.view() - assert view.to_records(index=True) == [{"__INDEX__": [0], "a": 1.5, "b": 2.5}, {"__INDEX__": [1], "a": 3.5, "b": 4.5}] + assert view.to_records(index=True) == [ + {"__INDEX__": [0], "a": 1.5, "b": 2.5}, + {"__INDEX__": [1], "a": 3.5, "b": 4.5}, + ] def test_to_format_implicit_index_dict(self): data = [{"a": 1.5, "b": 2.5}, {"a": 3.5, "b": 4.5}] tbl = Table(data) view = tbl.view() - assert view.to_dict(index=True) == {"__INDEX__": [[0], [1]], "a": [1.5, 3.5], "b": [2.5, 4.5]} + assert view.to_dict(index=True) == { + "__INDEX__": [[0], [1]], + "a": [1.5, 3.5], + "b": [2.5, 4.5], + } def test_to_format_implicit_id_records(self): data = [{"a": 1.5, "b": 2.5}, {"a": 3.5, "b": 4.5}] tbl = Table(data) view = tbl.view() - assert view.to_records(id=True) == [{"__ID__": [0], "a": 1.5, "b": 2.5}, {"__ID__": [1], "a": 3.5, "b": 4.5}] + assert view.to_records(id=True) == [ + {"__ID__": [0], "a": 1.5, "b": 2.5}, + {"__ID__": [1], "a": 3.5, "b": 4.5}, + ] def test_to_format_implicit_id_dict(self): data = [{"a": 1.5, "b": 2.5}, {"a": 3.5, "b": 4.5}] tbl = Table(data) view = tbl.view() - assert view.to_dict(id=True) == {"__ID__": [[0], [1]], "a": [1.5, 3.5], "b": [2.5, 4.5]} + assert view.to_dict(id=True) == { + "__ID__": [[0], [1]], + "a": [1.5, 3.5], + "b": [2.5, 4.5], + } def test_to_format_implicit_index_two_dict(self): data = [{"a": 1.5, "b": 2.5}, {"a": 3.5, "b": 4.5}] @@ -757,7 +888,11 @@ def test_to_format_implicit_index_two_dict(self): "2.5|b": [2.5, 2.5, None], "4.5|a": [3.5, None, 3.5], "4.5|b": [4.5, None, 4.5], - "__INDEX__": [[], [], []], # index needs to be the same length as each column + "__INDEX__": [ + [], + [], + [], + ], # index needs to be the same length as each column "__ROW_PATH__": [[], [1.5], [3.5]], } @@ -770,7 +905,11 @@ def test_to_format_implicit_index_two_dict(self): "2.5|b": [2.5, 2.5, None], "4.5|a": [3.5, None, 3.5], "4.5|b": [4.5, None, 4.5], - "__ID__": [[], [1.5], [3.5]], # index needs to be the same length as each column + "__ID__": [ + [], + [1.5], + [3.5], + ], # index needs to be the same length as each column "__ROW_PATH__": [[], [1.5], [3.5]], } @@ -785,13 +924,20 @@ def test_to_format_explicit_index_records(self): data = [{"a": 1.5, "b": 2.5}, {"a": 3.5, "b": 4.5}] tbl = Table(data, index="a") view = tbl.view() - assert view.to_records(index=True) == [{"__INDEX__": [1.5], "a": 1.5, "b": 2.5}, {"__INDEX__": [3.5], "a": 3.5, "b": 4.5}] + assert view.to_records(index=True) == [ + {"__INDEX__": [1.5], "a": 1.5, "b": 2.5}, + {"__INDEX__": [3.5], "a": 3.5, "b": 4.5}, + ] def test_to_format_explicit_index_dict(self): data = [{"a": 1.5, "b": 2.5}, {"a": 3.5, "b": 4.5}] tbl = Table(data, index="a") view = tbl.view() - assert view.to_dict(index=True) == {"__INDEX__": [[1.5], [3.5]], "a": [1.5, 3.5], "b": [2.5, 4.5]} + assert view.to_dict(index=True) == { + "__INDEX__": [[1.5], [3.5]], + "a": [1.5, 3.5], + "b": [2.5, 4.5], + } def test_to_format_explicit_index_np(self): data = [{"a": 1.5, "b": 2.5}, {"a": 3.5, "b": 4.5}] @@ -804,13 +950,27 @@ def test_to_format_explicit_index_str_records(self): data = [{"a": "a", "b": 2.5}, {"a": "b", "b": 4.5}] tbl = Table(data, index="a") view = tbl.view() - assert view.to_records(index=True) == [{"__INDEX__": ["a"], "a": "a", "b": 2.5}, {"__INDEX__": ["b"], "a": "b", "b": 4.5}] + assert view.to_records(index=True) == [ + {"__INDEX__": ["a"], "a": "a", "b": 2.5}, + {"__INDEX__": ["b"], "a": "b", "b": 4.5}, + ] def test_to_format_explicit_index_datetime_records(self): - data = [{"a": datetime(2019, 7, 11, 9, 0), "b": 2.5}, {"a": datetime(2019, 7, 11, 9, 1), "b": 4.5}] + data = [ + {"a": datetime(2019, 7, 11, 9, 0), "b": 2.5}, + {"a": datetime(2019, 7, 11, 9, 1), "b": 4.5}, + ] tbl = Table(data, index="a") view = tbl.view() assert view.to_records(index=True) == [ - {"__INDEX__": [datetime(2019, 7, 11, 9, 0)], "a": datetime(2019, 7, 11, 9, 0), "b": 2.5}, - {"__INDEX__": [datetime(2019, 7, 11, 9, 1)], "a": datetime(2019, 7, 11, 9, 1), "b": 4.5}, + { + "__INDEX__": [datetime(2019, 7, 11, 9, 0)], + "a": datetime(2019, 7, 11, 9, 0), + "b": 2.5, + }, + { + "__INDEX__": [datetime(2019, 7, 11, 9, 1)], + "a": datetime(2019, 7, 11, 9, 1), + "b": 4.5, + }, ] diff --git a/python/perspective/perspective/tests/table/test_view.py b/python/perspective/perspective/tests/table/test_view.py index bdd2fb2a84..33e661abb3 100644 --- a/python/perspective/perspective/tests/table/test_view.py +++ b/python/perspective/perspective/tests/table/test_view.py @@ -42,7 +42,11 @@ def test_view_one(self): assert view.num_rows() == 3 assert view.num_columns() == 2 assert view.schema() == {"a": int, "b": int} - assert view.to_records() == [{"__ROW_PATH__": [], "a": 4, "b": 6}, {"__ROW_PATH__": [1], "a": 1, "b": 2}, {"__ROW_PATH__": [3], "a": 3, "b": 4}] + assert view.to_records() == [ + {"__ROW_PATH__": [], "a": 4, "b": 6}, + {"__ROW_PATH__": [1], "a": 1, "b": 2}, + {"__ROW_PATH__": [3], "a": 3, "b": 4}, + ] def test_view_two(self): data = [{"a": 1, "b": 2}, {"a": 3, "b": 4}] @@ -64,7 +68,10 @@ def test_view_two_column_only(self): assert view.num_rows() == 2 assert view.num_columns() == 4 assert view.schema() == {"a": int, "b": int} - assert view.to_records() == [{"2|a": 1, "2|b": 2, "4|a": None, "4|b": None}, {"2|a": None, "2|b": None, "4|a": 3, "4|b": 4}] + assert view.to_records() == [ + {"2|a": 1, "2|b": 2, "4|a": None, "4|b": None}, + {"2|a": None, "2|b": None, "4|a": 3, "4|b": 4}, + ] # column path @@ -115,7 +122,15 @@ def test_view_column_path_two(self): tbl = Table(data) view = tbl.view(group_by=["a"], split_by=["b"]) paths = view.column_paths() - assert paths == ["__ROW_PATH__", "1.5|a", "1.5|b", "2.5|a", "2.5|b", "3.5|a", "3.5|b"] + assert paths == [ + "__ROW_PATH__", + "1.5|a", + "1.5|b", + "2.5|a", + "2.5|b", + "3.5|a", + "3.5|b", + ] def test_view_column_path_two_column_only(self): data = {"a": [1, 2, 3], "b": [1.5, 2.5, 3.5]} @@ -178,7 +193,7 @@ def test_view_no_columns(self): tbl = Table(data) view = tbl.view(columns=[]) assert view.num_columns() == 0 - assert view.to_records() == [{}, {}] + assert view.to_records() == [] def test_view_no_columns_pivoted(self): data = [{"a": 1, "b": 2}, {"a": 3, "b": 4}] @@ -201,7 +216,17 @@ def test_view_column_order(self): assert view.to_records() == [{"b": 2, "a": 1}, {"b": 4, "a": 3}] def test_view_dataframe_column_order(self): - table = Table(pd.DataFrame({"0.1": [5, 6, 7, 8], "-0.05": [5, 6, 7, 8], "0.0": [1, 2, 3, 4], "-0.1": [1, 2, 3, 4], "str": ["a", "b", "c", "d"]})) + table = Table( + pd.DataFrame( + { + "0.1": [5, 6, 7, 8], + "-0.05": [5, 6, 7, 8], + "0.0": [1, 2, 3, 4], + "-0.1": [1, 2, 3, 4], + "str": ["a", "b", "c", "d"], + } + ) + ) view = table.view(columns=["-0.1", "-0.05", "0.0", "0.1"], group_by=["str"]) assert view.column_paths() == ["__ROW_PATH__", "-0.1", "-0.05", "0.0", "0.1"] @@ -209,16 +234,26 @@ def test_view_aggregate_order_with_columns(self): """If `columns` is provided, order is always guaranteed.""" data = [{"a": 1, "b": 2, "c": 3, "d": 4}, {"a": 3, "b": 4, "c": 5, "d": 6}] tbl = Table(data) - view = tbl.view(group_by=["a"], columns=["a", "b", "c", "d"], aggregates={"d": "avg", "c": "avg", "b": "last", "a": "last"}) + view = tbl.view( + group_by=["a"], + columns=["a", "b", "c", "d"], + aggregates={"d": "avg", "c": "avg", "b": "last", "a": "last"}, + ) order = ["__ROW_PATH__", "a", "b", "c", "d"] assert view.column_paths() == order def test_view_df_aggregate_order_with_columns(self): """If `columns` is provided, order is always guaranteed.""" - data = pd.DataFrame({"a": [1, 2, 3], "b": [2, 3, 4], "c": [3, 4, 5], "d": [4, 5, 6]}, columns=["d", "a", "c", "b"]) + data = pd.DataFrame( + {"a": [1, 2, 3], "b": [2, 3, 4], "c": [3, 4, 5], "d": [4, 5, 6]}, + columns=["d", "a", "c", "b"], + ) tbl = Table(data) - view = tbl.view(group_by=["a"], aggregates={"d": "avg", "c": "avg", "b": "last", "a": "last"}) + view = tbl.view( + group_by=["a"], + aggregates={"d": "avg", "c": "avg", "b": "last", "a": "last"}, + ) order = ["__ROW_PATH__", "index", "d", "a", "c", "b"] assert view.column_paths() == order @@ -228,7 +263,11 @@ def test_view_aggregates_with_no_columns(self): tbl = Table(data) view = tbl.view(group_by=["a"], aggregates={"c": "avg", "a": "last"}, columns=[]) assert view.column_paths() == ["__ROW_PATH__"] - assert view.to_records() == [{"__ROW_PATH__": []}, {"__ROW_PATH__": [1]}, {"__ROW_PATH__": [3]}] + assert view.to_records() == [ + {"__ROW_PATH__": []}, + {"__ROW_PATH__": [1]}, + {"__ROW_PATH__": [3]}, + ] def test_view_aggregates_default_column_order(self): """Order of columns are entirely determined by the `columns` kwarg. If @@ -300,50 +339,98 @@ def test_view_aggregate_int(self): data = [{"a": 1, "b": 2}, {"a": 3, "b": 4}] tbl = Table(data) view = tbl.view(aggregates={"a": "avg"}, group_by=["a"]) - assert view.to_records() == [{"__ROW_PATH__": [], "a": 2.0, "b": 6}, {"__ROW_PATH__": [1], "a": 1.0, "b": 2}, {"__ROW_PATH__": [3], "a": 3.0, "b": 4}] + assert view.to_records() == [ + {"__ROW_PATH__": [], "a": 2.0, "b": 6}, + {"__ROW_PATH__": [1], "a": 1.0, "b": 2}, + {"__ROW_PATH__": [3], "a": 3.0, "b": 4}, + ] def test_view_aggregate_str(self): data = [{"a": "abc", "b": 2}, {"a": "def", "b": 4}] tbl = Table(data) view = tbl.view(aggregates={"a": "count"}, group_by=["a"]) - assert view.to_records() == [{"__ROW_PATH__": [], "a": 2, "b": 6}, {"__ROW_PATH__": ["abc"], "a": 1, "b": 2}, {"__ROW_PATH__": ["def"], "a": 1, "b": 4}] + assert view.to_records() == [ + {"__ROW_PATH__": [], "a": 2, "b": 6}, + {"__ROW_PATH__": ["abc"], "a": 1, "b": 2}, + {"__ROW_PATH__": ["def"], "a": 1, "b": 4}, + ] def test_view_aggregate_datetime(self): - data = [{"a": datetime(2019, 10, 1, 11, 30)}, {"a": datetime(2019, 10, 1, 11, 30)}] + data = [ + {"a": datetime(2019, 10, 1, 11, 30)}, + {"a": datetime(2019, 10, 1, 11, 30)}, + ] tbl = Table(data) view = tbl.view(aggregates={"a": "distinct count"}, group_by=["a"]) - assert view.to_records() == [{"__ROW_PATH__": [], "a": 1}, {"__ROW_PATH__": [datetime(2019, 10, 1, 11, 30)], "a": 1}] + assert view.to_records() == [ + {"__ROW_PATH__": [], "a": 1}, + {"__ROW_PATH__": [datetime(2019, 10, 1, 11, 30)], "a": 1}, + ] def test_view_aggregate_datetime_leading_zeroes(self): - data = [{"a": datetime(2019, 1, 1, 5, 5, 5)}, {"a": datetime(2019, 1, 1, 5, 5, 5)}] + data = [ + {"a": datetime(2019, 1, 1, 5, 5, 5)}, + {"a": datetime(2019, 1, 1, 5, 5, 5)}, + ] tbl = Table(data) view = tbl.view(aggregates={"a": "distinct count"}, group_by=["a"]) - assert view.to_records() == [{"__ROW_PATH__": [], "a": 1}, {"__ROW_PATH__": [datetime(2019, 1, 1, 5, 5, 5)], "a": 1}] + assert view.to_records() == [ + {"__ROW_PATH__": [], "a": 1}, + {"__ROW_PATH__": [datetime(2019, 1, 1, 5, 5, 5)], "a": 1}, + ] def test_view_aggregate_mean(self): - data = [{"a": "a", "x": 1, "y": 200}, {"a": "a", "x": 2, "y": 100}, {"a": "a", "x": 3, "y": None}] + data = [ + {"a": "a", "x": 1, "y": 200}, + {"a": "a", "x": 2, "y": 100}, + {"a": "a", "x": 3, "y": None}, + ] tbl = Table(data) view = tbl.view(aggregates={"y": "mean"}, group_by=["a"], columns=["y"]) - assert view.to_records() == [{"__ROW_PATH__": [], "y": 300 / 2}, {"__ROW_PATH__": ["a"], "y": 300 / 2}] + assert view.to_records() == [ + {"__ROW_PATH__": [], "y": 300 / 2}, + {"__ROW_PATH__": ["a"], "y": 300 / 2}, + ] def test_view_aggregate_mean_from_schema(self): - data = [{"a": "a", "x": 1, "y": 200}, {"a": "a", "x": 2, "y": 100}, {"a": "a", "x": 3, "y": None}] + data = [ + {"a": "a", "x": 1, "y": 200}, + {"a": "a", "x": 2, "y": 100}, + {"a": "a", "x": 3, "y": None}, + ] tbl = Table({"a": str, "x": int, "y": float}) view = tbl.view(aggregates={"y": "mean"}, group_by=["a"], columns=["y"]) tbl.update(data) - assert view.to_records() == [{"__ROW_PATH__": [], "y": 300 / 2}, {"__ROW_PATH__": ["a"], "y": 300 / 2}] + assert view.to_records() == [ + {"__ROW_PATH__": [], "y": 300 / 2}, + {"__ROW_PATH__": ["a"], "y": 300 / 2}, + ] def test_view_aggregate_weighted_mean(self): - data = [{"a": "a", "x": 1, "y": 200}, {"a": "a", "x": 2, "y": 100}, {"a": "a", "x": 3, "y": None}] + data = [ + {"a": "a", "x": 1, "y": 200}, + {"a": "a", "x": 2, "y": 100}, + {"a": "a", "x": 3, "y": None}, + ] tbl = Table(data) view = tbl.view(aggregates={"y": ["weighted mean", "x"]}, group_by=["a"], columns=["y"]) - assert view.to_records() == [{"__ROW_PATH__": [], "y": (1.0 * 200 + 2 * 100) / (1.0 + 2)}, {"__ROW_PATH__": ["a"], "y": (1.0 * 200 + 2 * 100) / (1.0 + 2)}] + assert view.to_records() == [ + {"__ROW_PATH__": [], "y": (1.0 * 200 + 2 * 100) / (1.0 + 2)}, + {"__ROW_PATH__": ["a"], "y": (1.0 * 200 + 2 * 100) / (1.0 + 2)}, + ] def test_view_aggregate_weighted_mean_with_negative_weights(self): - data = [{"a": "a", "x": 1, "y": 200}, {"a": "a", "x": -2, "y": 100}, {"a": "a", "x": 3, "y": None}] + data = [ + {"a": "a", "x": 1, "y": 200}, + {"a": "a", "x": -2, "y": 100}, + {"a": "a", "x": 3, "y": None}, + ] tbl = Table(data) view = tbl.view(aggregates={"y": ["weighted mean", "x"]}, group_by=["a"], columns=["y"]) - assert view.to_records() == [{"__ROW_PATH__": [], "y": (1 * 200 + (-2) * 100) / (1 - 2)}, {"__ROW_PATH__": ["a"], "y": (1 * 200 + (-2) * 100) / (1 - 2)}] + assert view.to_records() == [ + {"__ROW_PATH__": [], "y": (1 * 200 + (-2) * 100) / (1 - 2)}, + {"__ROW_PATH__": ["a"], "y": (1 * 200 + (-2) * 100) / (1 - 2)}, + ] def test_view_variance(self): data = {"x": list(np.random.rand(10)), "y": ["a" for _ in range(10)]} @@ -357,7 +444,21 @@ def test_view_variance(self): assert result["x"] == approx([expected, expected]) def test_view_variance_multi(self): - data = {"a": [91.96, 258.576, 29.6, 243.16, 36.24, 25.248, 79.99, 206.1, 31.5, 55.6], "b": [1 if i % 2 == 0 else 0 for i in range(10)]} + data = { + "a": [ + 91.96, + 258.576, + 29.6, + 243.16, + 36.24, + 25.248, + 79.99, + 206.1, + 31.5, + 55.6, + ], + "b": [1 if i % 2 == 0 else 0 for i in range(10)], + } table = Table(data) view = table.view(aggregates={"a": "var"}, group_by=["b"]) @@ -390,14 +491,40 @@ def test_view_variance_update_none(self): assert result["a"][2] == approx(np.var([0.5, 0.8])) def test_view_variance_multi_update(self): - data = {"a": [91.96, 258.576, 29.6, 243.16, 36.24, 25.248, 79.99, 206.1, 31.5, 55.6], "b": [1 if i % 2 == 0 else 0 for i in range(10)]} + data = { + "a": [ + 91.96, + 258.576, + 29.6, + 243.16, + 36.24, + 25.248, + 79.99, + 206.1, + 31.5, + 55.6, + ], + "b": [1 if i % 2 == 0 else 0 for i in range(10)], + } table = Table(data) view = table.view(aggregates={"a": "var"}, group_by=["b"]) result = view.to_columns() expected_total = data["a"] - expected_zero = [data["a"][1], data["a"][3], data["a"][5], data["a"][7], data["a"][9]] - expected_one = [data["a"][0], data["a"][2], data["a"][4], data["a"][6], data["a"][8]] + expected_zero = [ + data["a"][1], + data["a"][3], + data["a"][5], + data["a"][7], + data["a"][9], + ] + expected_one = [ + data["a"][0], + data["a"][2], + data["a"][4], + data["a"][6], + data["a"][8], + ] assert result["a"] == approx([np.var(expected_total), np.var(expected_zero), np.var(expected_one)]) @@ -415,14 +542,40 @@ def test_view_variance_multi_update(self): assert result["a"][-1] is None def test_view_variance_multi_update_delta(self): - data = {"a": [91.96, 258.576, 29.6, 243.16, 36.24, 25.248, 79.99, 206.1, 31.5, 55.6], "b": [1 if i % 2 == 0 else 0 for i in range(10)]} + data = { + "a": [ + 91.96, + 258.576, + 29.6, + 243.16, + 36.24, + 25.248, + 79.99, + 206.1, + 31.5, + 55.6, + ], + "b": [1 if i % 2 == 0 else 0 for i in range(10)], + } table = Table(data) view = table.view(aggregates={"a": "var"}, group_by=["b"]) result = view.to_columns() expected_total = data["a"] - expected_zero = [data["a"][1], data["a"][3], data["a"][5], data["a"][7], data["a"][9]] - expected_one = [data["a"][0], data["a"][2], data["a"][4], data["a"][6], data["a"][8]] + expected_zero = [ + data["a"][1], + data["a"][3], + data["a"][5], + data["a"][7], + data["a"][9], + ] + expected_one = [ + data["a"][0], + data["a"][2], + data["a"][4], + data["a"][6], + data["a"][8], + ] assert result["a"] == approx([np.var(expected_total), np.var(expected_zero), np.var(expected_one)]) @@ -458,19 +611,50 @@ def cb1(port_id, delta): table.update(update_data) def test_view_variance_multi_update_indexed(self): - data = {"a": [91.96, 258.576, 29.6, 243.16, 36.24, 25.248, 79.99, 206.1, 31.5, 55.6], "b": [1 if i % 2 == 0 else 0 for i in range(10)], "c": [i for i in range(10)]} + data = { + "a": [ + 91.96, + 258.576, + 29.6, + 243.16, + 36.24, + 25.248, + 79.99, + 206.1, + 31.5, + 55.6, + ], + "b": [1 if i % 2 == 0 else 0 for i in range(10)], + "c": [i for i in range(10)], + } table = Table(data, index="c") view = table.view(aggregates={"a": "var"}, group_by=["b"]) result = view.to_columns() expected_total = data["a"] - expected_zero = [data["a"][1], data["a"][3], data["a"][5], data["a"][7], data["a"][9]] - expected_one = [data["a"][0], data["a"][2], data["a"][4], data["a"][6], data["a"][8]] + expected_zero = [ + data["a"][1], + data["a"][3], + data["a"][5], + data["a"][7], + data["a"][9], + ] + expected_one = [ + data["a"][0], + data["a"][2], + data["a"][4], + data["a"][6], + data["a"][8], + ] assert result["a"] == approx([np.var(expected_total), np.var(expected_zero), np.var(expected_one)]) # "b" = 2 here should result in null var because the group size is 1 - update_data = {"a": [15.12, 9.102, 0.99, 12.8], "b": [1, 0, 1, 2], "c": [1, 5, 2, 7]} + update_data = { + "a": [15.12, 9.102, 0.99, 12.8], + "b": [1, 0, 1, 2], + "c": [1, 5, 2, 7], + } table.update(update_data) @@ -494,19 +678,50 @@ def test_view_variance_multi_update_indexed(self): assert result["a"][-1] is None def test_view_variance_multi_update_indexed_delta(self): - data = {"a": [91.96, 258.576, 29.6, 243.16, 36.24, 25.248, 79.99, 206.1, 31.5, 55.6], "b": [1 if i % 2 == 0 else 0 for i in range(10)], "c": [i for i in range(10)]} + data = { + "a": [ + 91.96, + 258.576, + 29.6, + 243.16, + 36.24, + 25.248, + 79.99, + 206.1, + 31.5, + 55.6, + ], + "b": [1 if i % 2 == 0 else 0 for i in range(10)], + "c": [i for i in range(10)], + } table = Table(data, index="c") view = table.view(aggregates={"a": "var", "b": "last", "c": "last"}, group_by=["b"]) result = view.to_columns() expected_total = data["a"] - expected_zero = [data["a"][1], data["a"][3], data["a"][5], data["a"][7], data["a"][9]] - expected_one = [data["a"][0], data["a"][2], data["a"][4], data["a"][6], data["a"][8]] + expected_zero = [ + data["a"][1], + data["a"][3], + data["a"][5], + data["a"][7], + data["a"][9], + ] + expected_one = [ + data["a"][0], + data["a"][2], + data["a"][4], + data["a"][6], + data["a"][8], + ] assert result["a"] == approx([np.var(expected_total), np.var(expected_zero), np.var(expected_one)]) # 2 here should result in null var because the group size is 1 - update_data = {"a": [15.12, 9.102, 0.99, 12.8], "b": [1, 0, 1, 2], "c": [0, 4, 1, 6]} + update_data = { + "a": [15.12, 9.102, 0.99, 12.8], + "b": [1, 0, 1, 2], + "c": [0, 4, 1, 6], + } def cb1(port_id, delta): table2 = Table(delta) @@ -569,7 +784,21 @@ def test_view_standard_deviation(self): assert result["x"] == approx([expected, expected]) def test_view_standard_deviation_multi(self): - data = {"a": [91.96, 258.576, 29.6, 243.16, 36.24, 25.248, 79.99, 206.1, 31.5, 55.6], "b": [1 if i % 2 == 0 else 0 for i in range(10)]} + data = { + "a": [ + 91.96, + 258.576, + 29.6, + 243.16, + 36.24, + 25.248, + 79.99, + 206.1, + 31.5, + 55.6, + ], + "b": [1 if i % 2 == 0 else 0 for i in range(10)], + } table = Table(data) view = table.view(aggregates={"a": "stddev"}, group_by=["b"]) @@ -602,14 +831,40 @@ def test_view_standard_deviation_update_none(self): assert result["a"][2] == approx(np.std([0.5, 0.8])) def test_view_standard_deviation_multi_update(self): - data = {"a": [91.96, 258.576, 29.6, 243.16, 36.24, 25.248, 79.99, 206.1, 31.5, 55.6], "b": [1 if i % 2 == 0 else 0 for i in range(10)]} + data = { + "a": [ + 91.96, + 258.576, + 29.6, + 243.16, + 36.24, + 25.248, + 79.99, + 206.1, + 31.5, + 55.6, + ], + "b": [1 if i % 2 == 0 else 0 for i in range(10)], + } table = Table(data) view = table.view(aggregates={"a": "stddev"}, group_by=["b"]) result = view.to_columns() expected_total = data["a"] - expected_zero = [data["a"][1], data["a"][3], data["a"][5], data["a"][7], data["a"][9]] - expected_one = [data["a"][0], data["a"][2], data["a"][4], data["a"][6], data["a"][8]] + expected_zero = [ + data["a"][1], + data["a"][3], + data["a"][5], + data["a"][7], + data["a"][9], + ] + expected_one = [ + data["a"][0], + data["a"][2], + data["a"][4], + data["a"][6], + data["a"][8], + ] assert result["a"] == approx([np.std(expected_total), np.std(expected_zero), np.std(expected_one)]) @@ -627,14 +882,40 @@ def test_view_standard_deviation_multi_update(self): assert result["a"][-1] is None def test_view_standard_deviation_multi_update_delta(self): - data = {"a": [91.96, 258.576, 29.6, 243.16, 36.24, 25.248, 79.99, 206.1, 31.5, 55.6], "b": [1 if i % 2 == 0 else 0 for i in range(10)]} + data = { + "a": [ + 91.96, + 258.576, + 29.6, + 243.16, + 36.24, + 25.248, + 79.99, + 206.1, + 31.5, + 55.6, + ], + "b": [1 if i % 2 == 0 else 0 for i in range(10)], + } table = Table(data) view = table.view(aggregates={"a": "stddev"}, group_by=["b"]) result = view.to_columns() expected_total = data["a"] - expected_zero = [data["a"][1], data["a"][3], data["a"][5], data["a"][7], data["a"][9]] - expected_one = [data["a"][0], data["a"][2], data["a"][4], data["a"][6], data["a"][8]] + expected_zero = [ + data["a"][1], + data["a"][3], + data["a"][5], + data["a"][7], + data["a"][9], + ] + expected_one = [ + data["a"][0], + data["a"][2], + data["a"][4], + data["a"][6], + data["a"][8], + ] assert result["a"] == approx([np.std(expected_total), np.std(expected_zero), np.std(expected_one)]) @@ -670,19 +951,50 @@ def cb1(port_id, delta): table.update(update_data) def test_view_standard_deviation_multi_update_indexed(self): - data = {"a": [91.96, 258.576, 29.6, 243.16, 36.24, 25.248, 79.99, 206.1, 31.5, 55.6], "b": [1 if i % 2 == 0 else 0 for i in range(10)], "c": [i for i in range(10)]} + data = { + "a": [ + 91.96, + 258.576, + 29.6, + 243.16, + 36.24, + 25.248, + 79.99, + 206.1, + 31.5, + 55.6, + ], + "b": [1 if i % 2 == 0 else 0 for i in range(10)], + "c": [i for i in range(10)], + } table = Table(data, index="c") view = table.view(aggregates={"a": "stddev"}, group_by=["b"]) result = view.to_columns() expected_total = data["a"] - expected_zero = [data["a"][1], data["a"][3], data["a"][5], data["a"][7], data["a"][9]] - expected_one = [data["a"][0], data["a"][2], data["a"][4], data["a"][6], data["a"][8]] + expected_zero = [ + data["a"][1], + data["a"][3], + data["a"][5], + data["a"][7], + data["a"][9], + ] + expected_one = [ + data["a"][0], + data["a"][2], + data["a"][4], + data["a"][6], + data["a"][8], + ] assert result["a"] == approx([np.std(expected_total), np.std(expected_zero), np.std(expected_one)]) # "b" = 2 here should result in null stddev because the group size is 1 - update_data = {"a": [15.12, 9.102, 0.99, 12.8], "b": [1, 0, 1, 2], "c": [1, 5, 2, 7]} + update_data = { + "a": [15.12, 9.102, 0.99, 12.8], + "b": [1, 0, 1, 2], + "c": [1, 5, 2, 7], + } table.update(update_data) @@ -706,19 +1018,50 @@ def test_view_standard_deviation_multi_update_indexed(self): assert result["a"][-1] is None def test_view_standard_deviation_multi_update_indexed_delta(self): - data = {"a": [91.96, 258.576, 29.6, 243.16, 36.24, 25.248, 79.99, 206.1, 31.5, 55.6], "b": [1 if i % 2 == 0 else 0 for i in range(10)], "c": [i for i in range(10)]} + data = { + "a": [ + 91.96, + 258.576, + 29.6, + 243.16, + 36.24, + 25.248, + 79.99, + 206.1, + 31.5, + 55.6, + ], + "b": [1 if i % 2 == 0 else 0 for i in range(10)], + "c": [i for i in range(10)], + } table = Table(data, index="c") view = table.view(aggregates={"a": "stddev", "b": "last", "c": "last"}, group_by=["b"]) result = view.to_columns() expected_total = data["a"] - expected_zero = [data["a"][1], data["a"][3], data["a"][5], data["a"][7], data["a"][9]] - expected_one = [data["a"][0], data["a"][2], data["a"][4], data["a"][6], data["a"][8]] + expected_zero = [ + data["a"][1], + data["a"][3], + data["a"][5], + data["a"][7], + data["a"][9], + ] + expected_one = [ + data["a"][0], + data["a"][2], + data["a"][4], + data["a"][6], + data["a"][8], + ] assert result["a"] == approx([np.std(expected_total), np.std(expected_zero), np.std(expected_one)]) # 2 here should result in null stddev because the group size is 1 - update_data = {"a": [15.12, 9.102, 0.99, 12.8], "b": [1, 0, 1, 2], "c": [0, 4, 1, 6]} + update_data = { + "a": [15.12, 9.102, 0.99, 12.8], + "b": [1, 0, 1, 2], + "c": [0, 4, 1, 6], + } def cb1(port_id, delta): table2 = Table(delta) @@ -793,13 +1136,22 @@ def test_view_sort_date(self): data = [{"a": date(2019, 7, 11), "b": 2}, {"a": date(2019, 7, 12), "b": 4}] tbl = Table(data) view = tbl.view(sort=[["a", "desc"]]) - assert view.to_records() == [{"a": datetime(2019, 7, 12), "b": 4}, {"a": datetime(2019, 7, 11), "b": 2}] + assert view.to_records() == [ + {"a": datetime(2019, 7, 12), "b": 4}, + {"a": datetime(2019, 7, 11), "b": 2}, + ] def test_view_sort_datetime(self): - data = [{"a": datetime(2019, 7, 11, 8, 15), "b": 2}, {"a": datetime(2019, 7, 11, 8, 16), "b": 4}] + data = [ + {"a": datetime(2019, 7, 11, 8, 15), "b": 2}, + {"a": datetime(2019, 7, 11, 8, 16), "b": 4}, + ] tbl = Table(data) view = tbl.view(sort=[["a", "desc"]]) - assert view.to_records() == [{"a": datetime(2019, 7, 11, 8, 16), "b": 4}, {"a": datetime(2019, 7, 11, 8, 15), "b": 2}] + assert view.to_records() == [ + {"a": datetime(2019, 7, 11, 8, 16), "b": 4}, + {"a": datetime(2019, 7, 11, 8, 15), "b": 2}, + ] def test_view_sort_hidden(self): data = [{"a": 1.1, "b": 2}, {"a": 1.2, "b": 4}] @@ -808,7 +1160,11 @@ def test_view_sort_hidden(self): assert view.to_records() == [{"b": 4}, {"b": 2}] def test_view_sort_avg_nan(self): - data = {"w": [3.5, 4.5, None, None, None, None, 1.5, 2.5], "x": [1, 2, 3, 4, 4, 3, 2, 1], "y": ["a", "b", "c", "d", "e", "f", "g", "h"]} + data = { + "w": [3.5, 4.5, None, None, None, None, 1.5, 2.5], + "x": [1, 2, 3, 4, 4, 3, 2, 1], + "y": ["a", "b", "c", "d", "e", "f", "g", "h"], + } tbl = Table(data) view = tbl.view( columns=["x", "w"], @@ -817,13 +1173,27 @@ def test_view_sort_avg_nan(self): aggregates={"w": "avg", "x": "unique"}, ) assert view.to_dict() == { - "__ROW_PATH__": [[], ["c"], ["d"], ["e"], ["f"], ["g"], ["h"], ["a"], ["b"]], + "__ROW_PATH__": [ + [], + ["c"], + ["d"], + ["e"], + ["f"], + ["g"], + ["h"], + ["a"], + ["b"], + ], "w": [3, None, None, None, None, 1.5, 2.5, 3.5, 4.5], "x": [None, 3, 4, 4, 3, 2, 1, 1, 2], } def test_view_sort_sum_nan(self): - data = {"w": [3.5, 4.5, None, None, None, None, 1.5, 2.5], "x": [1, 2, 3, 4, 4, 3, 2, 1], "y": ["a", "b", "c", "d", "e", "f", "g", "h"]} + data = { + "w": [3.5, 4.5, None, None, None, None, 1.5, 2.5], + "x": [1, 2, 3, 4, 4, 3, 2, 1], + "y": ["a", "b", "c", "d", "e", "f", "g", "h"], + } tbl = Table(data) view = tbl.view( columns=["x", "w"], @@ -831,10 +1201,28 @@ def test_view_sort_sum_nan(self): sort=[["w", "asc"]], aggregates={"w": "sum", "x": "unique"}, ) - assert view.to_dict() == {"__ROW_PATH__": [[], ["c"], ["d"], ["e"], ["f"], ["g"], ["h"], ["a"], ["b"]], "w": [12, 0, 0, 0, 0, 1.5, 2.5, 3.5, 4.5], "x": [None, 3, 4, 4, 3, 2, 1, 1, 2]} + assert view.to_dict() == { + "__ROW_PATH__": [ + [], + ["c"], + ["d"], + ["e"], + ["f"], + ["g"], + ["h"], + ["a"], + ["b"], + ], + "w": [12, 0, 0, 0, 0, 1.5, 2.5, 3.5, 4.5], + "x": [None, 3, 4, 4, 3, 2, 1, 1, 2], + } def test_view_sort_unique_nan(self): - data = {"w": [3.5, 4.5, None, None, None, None, 1.5, 2.5], "x": [1, 2, 3, 4, 4, 3, 2, 1], "y": ["a", "b", "c", "d", "e", "f", "g", "h"]} + data = { + "w": [3.5, 4.5, None, None, None, None, 1.5, 2.5], + "x": [1, 2, 3, 4, 4, 3, 2, 1], + "y": ["a", "b", "c", "d", "e", "f", "g", "h"], + } tbl = Table(data) view = tbl.view( columns=["x", "w"], @@ -843,7 +1231,17 @@ def test_view_sort_unique_nan(self): aggregates={"w": "unique", "x": "unique"}, ) assert view.to_dict() == { - "__ROW_PATH__": [[], ["c"], ["d"], ["e"], ["f"], ["g"], ["h"], ["a"], ["b"]], + "__ROW_PATH__": [ + [], + ["c"], + ["d"], + ["e"], + ["f"], + ["g"], + ["h"], + ["a"], + ["b"], + ], "w": [None, None, None, None, None, 1.5, 2.5, 3.5, 4.5], "x": [None, 3, 4, 4, 3, 2, 1, 1, 2], } @@ -947,37 +1345,55 @@ def test_view_filter_date_str_neq(self): assert view.to_records() == [{"a": datetime(2019, 7, 11), "b": 2}] def test_view_filter_datetime_eq(self): - data = [{"a": datetime(2019, 7, 11, 8, 15), "b": 2}, {"a": datetime(2019, 7, 11, 8, 16), "b": 4}] + data = [ + {"a": datetime(2019, 7, 11, 8, 15), "b": 2}, + {"a": datetime(2019, 7, 11, 8, 16), "b": 4}, + ] tbl = Table(data) view = tbl.view(filter=[["a", "==", datetime(2019, 7, 11, 8, 15)]]) assert view.to_records() == [{"a": datetime(2019, 7, 11, 8, 15), "b": 2}] def test_view_filter_datetime_neq(self): - data = [{"a": datetime(2019, 7, 11, 8, 15), "b": 2}, {"a": datetime(2019, 7, 11, 8, 16), "b": 4}] + data = [ + {"a": datetime(2019, 7, 11, 8, 15), "b": 2}, + {"a": datetime(2019, 7, 11, 8, 16), "b": 4}, + ] tbl = Table(data) view = tbl.view(filter=[["a", "!=", datetime(2019, 7, 11, 8, 15)]]) assert view.to_records() == [{"a": datetime(2019, 7, 11, 8, 16), "b": 4}] def test_view_filter_datetime_np_eq(self): - data = [{"a": datetime(2019, 7, 11, 8, 15), "b": 2}, {"a": datetime(2019, 7, 11, 8, 16), "b": 4}] + data = [ + {"a": datetime(2019, 7, 11, 8, 15), "b": 2}, + {"a": datetime(2019, 7, 11, 8, 16), "b": 4}, + ] tbl = Table(data) view = tbl.view(filter=[["a", "==", np.datetime64(datetime(2019, 7, 11, 8, 15))]]) assert view.to_records() == [{"a": datetime(2019, 7, 11, 8, 15), "b": 2}] def test_view_filter_datetime_np_neq(self): - data = [{"a": datetime(2019, 7, 11, 8, 15), "b": 2}, {"a": datetime(2019, 7, 11, 8, 16), "b": 4}] + data = [ + {"a": datetime(2019, 7, 11, 8, 15), "b": 2}, + {"a": datetime(2019, 7, 11, 8, 16), "b": 4}, + ] tbl = Table(data) view = tbl.view(filter=[["a", "!=", np.datetime64(datetime(2019, 7, 11, 8, 15))]]) assert view.to_records() == [{"a": datetime(2019, 7, 11, 8, 16), "b": 4}] def test_view_filter_datetime_str_eq(self): - data = [{"a": datetime(2019, 7, 11, 8, 15), "b": 2}, {"a": datetime(2019, 7, 11, 8, 16), "b": 4}] + data = [ + {"a": datetime(2019, 7, 11, 8, 15), "b": 2}, + {"a": datetime(2019, 7, 11, 8, 16), "b": 4}, + ] tbl = Table(data) view = tbl.view(filter=[["a", "==", "2019/7/11 8:15"]]) assert view.to_records() == [{"a": datetime(2019, 7, 11, 8, 15), "b": 2}] def test_view_filter_datetime_str_neq(self): - data = [{"a": datetime(2019, 7, 11, 8, 15), "b": 2}, {"a": datetime(2019, 7, 11, 8, 16), "b": 4}] + data = [ + {"a": datetime(2019, 7, 11, 8, 15), "b": 2}, + {"a": datetime(2019, 7, 11, 8, 16), "b": 4}, + ] tbl = Table(data) view = tbl.view(filter=[["a", "!=", "2019/7/11 8:15"]]) assert view.to_records() == [{"a": datetime(2019, 7, 11, 8, 16), "b": 4}] @@ -1223,7 +1639,11 @@ def cb1(port_id, delta): tbl = Table(data) view = tbl.view(group_by=["a"]) - assert view.to_dict() == {"__ROW_PATH__": [[], [1], [3]], "a": [4, 1, 3], "b": [6, 2, 4]} + assert view.to_dict() == { + "__ROW_PATH__": [[], [1], [3]], + "a": [4, 1, 3], + "b": [6, 2, 4], + } view.on_update(cb1, mode="row") tbl.update(update_data) @@ -1315,7 +1735,17 @@ def test_view_row_delta_two(self, util): update_data = {"a": [5], "b": [6]} def cb1(port_id, delta): - compare_delta(delta, {"2|a": [1, None], "2|b": [2, None], "4|a": [3, None], "4|b": [4, None], "6|a": [5, 5], "6|b": [6, 6]}) + compare_delta( + delta, + { + "2|a": [1, None], + "2|b": [2, None], + "4|a": [3, None], + "4|b": [4, None], + "6|a": [5, 5], + "6|b": [6, 6], + }, + ) tbl = Table(data) view = tbl.view(group_by=["a"], split_by=["b"]) @@ -1333,7 +1763,15 @@ def test_view_row_delta_two_from_schema(self, util): data = [{"a": 1, "b": 2}, {"a": 3, "b": 4}] def cb1(port_id, delta): - compare_delta(delta, {"2|a": [1, 1, None], "2|b": [2, 2, None], "4|a": [3, None, 3], "4|b": [4, None, 4]}) + compare_delta( + delta, + { + "2|a": [1, 1, None], + "2|b": [2, 2, None], + "4|a": [3, None, 3], + "4|b": [4, None, 4], + }, + ) tbl = Table({"a": int, "b": int}) view = tbl.view(group_by=["a"], split_by=["b"]) @@ -1344,7 +1782,15 @@ def test_view_row_delta_two_from_schema_indexed(self, util): data = [{"a": 1, "b": 2}, {"a": 3, "b": 4}, {"a": 3, "b": 5}] def cb1(port_id, delta): - compare_delta(delta, {"2|a": [1, 1, None], "2|b": [2, 2, None], "5|a": [3, None, 3], "5|b": [5, None, 5]}) + compare_delta( + delta, + { + "2|a": [1, 1, None], + "2|b": [2, 2, None], + "5|a": [3, None, 3], + "5|b": [5, None, 5], + }, + ) tbl = Table({"a": int, "b": int}, index="a") view = tbl.view(group_by=["a"], split_by=["b"]) @@ -1356,7 +1802,17 @@ def test_view_row_delta_two_column_only(self, util): update_data = {"a": [5], "b": [6]} def cb1(port_id, delta): - compare_delta(delta, {"2|a": [1, None], "2|b": [2, None], "4|a": [3, None], "4|b": [4, None], "6|a": [5, 5], "6|b": [6, 6]}) + compare_delta( + delta, + { + "2|a": [1, None], + "2|b": [2, None], + "4|a": [3, None], + "4|b": [4, None], + "6|a": [5, 5], + "6|b": [6, 6], + }, + ) tbl = Table(data) view = tbl.view(split_by=["b"]) @@ -1374,7 +1830,17 @@ def test_view_row_delta_two_column_only_indexed(self, util): update_data = {"a": [5], "b": [6]} def cb1(port_id, delta): - compare_delta(delta, {"2|a": [1, None], "2|b": [2, None], "5|a": [3, None], "5|b": [5, None], "6|a": [5, 5], "6|b": [6, 6]}) + compare_delta( + delta, + { + "2|a": [1, None], + "2|b": [2, None], + "5|a": [3, None], + "5|b": [5, None], + "6|a": [5, 5], + "6|b": [6, 6], + }, + ) tbl = Table(data, index="a") view = tbl.view(split_by=["b"]) @@ -1391,7 +1857,15 @@ def test_view_row_delta_two_column_only_from_schema(self, util): data = [{"a": 1, "b": 2}, {"a": 3, "b": 4}] def cb1(port_id, delta): - compare_delta(delta, {"2|a": [1, 1, None], "2|b": [2, 2, None], "4|a": [3, None, 3], "4|b": [4, None, 4]}) + compare_delta( + delta, + { + "2|a": [1, 1, None], + "2|b": [2, 2, None], + "4|a": [3, None, 3], + "4|b": [4, None, 4], + }, + ) tbl = Table({"a": int, "b": int}) view = tbl.view(split_by=["b"]) @@ -1402,7 +1876,15 @@ def test_view_row_delta_two_column_only_from_schema_indexed(self, util): data = [{"a": 1, "b": 2}, {"a": 3, "b": 4}, {"a": 3, "b": 5}] def cb1(port_id, delta): - compare_delta(delta, {"2|a": [1, 1, None], "2|b": [2, 2, None], "5|a": [3, None, 3], "5|b": [5, None, 5]}) + compare_delta( + delta, + { + "2|a": [1, 1, None], + "2|b": [2, 2, None], + "5|a": [3, None, 3], + "5|b": [5, None, 5], + }, + ) tbl = Table({"a": int, "b": int}, index="a") view = tbl.view(split_by=["b"]) @@ -1602,7 +2084,13 @@ def test_should_throw_on_first_invalid(self): data = [{"a": 1, "b": 2, "c": "a"}, {"a": 3, "b": 4, "c": "b"}] tbl = Table(data) with raises(PerspectiveCppError) as ex: - tbl.view(group_by=["a"], split_by=["c"], filter=[["a", ">", 1]], aggregates={"a": "avg"}, sort=[["x", "desc"]]) + tbl.view( + group_by=["a"], + split_by=["c"], + filter=[["a", ">", 1]], + aggregates={"a": "avg"}, + sort=[["x", "desc"]], + ) assert str(ex.value) == "Invalid column 'x' found in View sorts.\n" def test_invalid_columns_not_in_expression_should_throw(self): @@ -1622,6 +2110,14 @@ def test_should_not_throw_valid_expression(self): def test_should_not_throw_valid_expression_config(self): data = [{"a": 1, "b": 2, "c": "a"}, {"a": 3, "b": 4, "c": "b"}] tbl = Table(data) - view = tbl.view(aggregates={"abc": "dominant"}, columns=["abc"], sort=[["abc", "desc"]], filter=[["abc", "==", "A"]], group_by=["abc"], split_by=["abc"], expressions=["// abc \n 'hello!'"]) + view = tbl.view( + aggregates={"abc": "dominant"}, + columns=["abc"], + sort=[["abc", "desc"]], + filter=[["abc", "==", "A"]], + group_by=["abc"], + split_by=["abc"], + expressions=["// abc \n 'hello!'"], + ) assert view.schema() == {"abc": str} diff --git a/python/perspective/perspective/tests/table/test_view_expression.py b/python/perspective/perspective/tests/table/test_view_expression.py index bdeb0deb15..ab6a881493 100644 --- a/python/perspective/perspective/tests/table/test_view_expression.py +++ b/python/perspective/perspective/tests/table/test_view_expression.py @@ -637,7 +637,7 @@ def test_view_expression_create_clear(self): } table.clear() assert view.schema() == {"a": int, "b": int, "computed": float} - assert view.to_columns() == {} + assert view.to_columns() == {"a": [], "b": [], "computed": []} def test_view_expression_create_replace(self): table = Table({"a": [1, 2, 3, 4], "b": [5, 6, 7, 8]}) @@ -738,9 +738,9 @@ def test_view_expression_multiple_views_should_all_clear(self): assert view2.schema() == {"a": int, "b": int, "computed2": float} - assert view.to_columns() == {} + assert view.to_columns() == {"a": [], "b": [], "computed": []} - assert view2.to_columns() == {} + assert view2.to_columns() == {"a": [], "b": [], "computed2": []} def test_view_expression_multiple_views_should_all_replace(self): table = Table({"a": [1, 2, 3, 4], "b": [5, 6, 7, 8]}) diff --git a/python/perspective/setup.cfg b/python/perspective/setup.cfg index 22b5bc6184..72d2e2e435 100644 --- a/python/perspective/setup.cfg +++ b/python/perspective/setup.cfg @@ -10,4 +10,5 @@ ignore=E203, W503 max-line-length=200 per-file-ignores = __init__.py: F401, F403 - libpsp.py: F401, F403 + perspective/libpsp.py: F401, F403 + perspective/tests/*: F401, E712, F811, F841 \ No newline at end of file diff --git a/tools/perspective-bench/src/js/worker.js b/tools/perspective-bench/src/js/worker.js index ab7fd96a6e..b7e37562f4 100644 --- a/tools/perspective-bench/src/js/worker.js +++ b/tools/perspective-bench/src/js/worker.js @@ -244,9 +244,9 @@ async function table_suite() { } async function bench_all() { - await to_data_suite(); - await view_suite(); await table_suite(); + await view_suite(); + await to_data_suite(); process.send({ finished: true }); } diff --git a/tools/perspective-test/results.tar.gz b/tools/perspective-test/results.tar.gz index 8c2881bd0ffa4cc5a6af4e02715001afc7ce961e..6fed608a5708086e6924148d88a8aad4bf649c9b 100644 GIT binary patch literal 147964 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 literal 93995 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 z

XdK2-&?9VThLhbS)xb20T&gN>4e&*TwrX)#7;=;A5fA@)Vn5wxy)-PzjT>=O_? z-_;?udEMS$pL9KVd%1z-WHfnH)rno=XwQUUTu9W|qsX}xf8Io|vas%JJq6ZeN^CG8M_S|yz!lw=O)NW&YJmt7g@-sYCAg#;v zieWePFK%OK!^oKwz};X~o#ab(uSV)NrfT$5g4|*CiT)P@gi*5ZLr%rKwtCU<1t9+vr5?GQTZ)(nLgp3P8aslQ)7YHZ7jfbhy(9f z@x|u78emh^n1=?X#bnE|?!f3WouPkmRVr@Dclk% zfFXqy>@kuF_g-cT)8t&YvA#Uq;9C2YaL22Rxmd5!2;?Ud3jy$glFj8FUpCmo@P4f7 z;9-cx$7B$GXv9>A?(QK}`I3VCF`IzKl+9EsnJ2nF^IdWlB~{S7)nkiRi8>U8W~0g6jk~g2hB38PnpWlRRFD|BY?0vZ+9?rU&8|@ zizQ48zfLQQMXQ5$B3abJt@X91jZuWD48ab~u7ktZSDPk)O@pMXYU%2{sOy!Y1VBhA zw?;UTOiK~+qFkg(q&iQk534#4&@u;%-|{bs6<`R;(}Fuj*aCa1B-1S3TqeW!FZun{ zg&5k??u)0gDth7LlirUt&Lq!yJK?Sfg70!JGvpM`T;o(vn+qzBViWgL0W+nP@ak$sLy1N*BgivG!W2o8eII|QeAwq@{_2>2`C*?k$4ee7Z0WeuRSY)61yr>4Y)&7s_w^nA=xfAicdRF^!Rdm$=eLc9I z4seo9*JNV#sUD-(U;g%9K-Q@m#XaB^Mzd3l6Uk+|@qwC|EMcJZ77!o=&5r#qZ;NMP zk$UyEq*rf4_{Xs(lC|{#UzB=rK~tHrIH9S!TUNjWnz*f-ge@9<0bdK7z4QQFa3Xni z5Pu?>cUWU|e=qOV<``h}Uk@ifZUWI|vxEtxw+aC6sfhmKwIRkKrZNfPOfP>FVP(Mh z=eHylNz|uc?`K`U0A8M_CNxDolgtZUsBoD-#}#~;kv-mY&>&$`cR%KzneyR&tkx_G z>>+(W<{0OJ52}L+TLU$=?%if>hJ@2`{(Es6?%*+TtTid`r#Nxk^NK0QG_)bsbd4e} zU`m||fGNi!bDm$@RX-76#90PJ?T3SNLCm*I*Ky29nb$gXaEftorf4fcuKPt3O%Kq628vJ1!7J zQUP%NCsO?ZA{BsX%|N7zx++0^L9^FL1^p7Kg2&N|B9-oI zqvQsUaSjVHMj53PO(ZTa5R3T?as8GHw<{kQfKRTDR57ol9>TEhd^v z@0%>}(p6goOw6CcJNL56rM(DnChz@*zxFR)tY;NZ+a<(DhsXU(x}nw~5#px86on)A zOza?FBY^d+e6I(U94`b>?-8-z(!ilYAth|u0V8BA#@r7p)ojR{pv~Uo<1}lf$)IdP z(`$^jz{W|h@w7Y6t_V0IUl2yvVjM!N1@pP*^c}19&emGCMN|-KF&%H~MWcdAq*jud zYxlxE85(o;sWxss-2#>p%}Dy%vD^A3#TU~1uh7A*`mD0WRiIl*=aVNcmc<(#@VVP8 zGq_+Fd63rO;YzSh48!dcvr+^lxx0EH&Y^x$SeFy?%!5|ZD4W^*?T-+DoQGnKi@7!^ zFXF4I$6&hIqR|_5gX^KaXlGyYfu9)Vjl0jmn=*OkpyOB*DEDqtkU8Tmq~n=d9mpTzRDGH{bvxgZ zvw_sPwv&G54&2mRlYXjoDGj|UkNY-mab^6eggt2KxD_X-kh5!;=RSCB4ty`|lD=#% z@^-LZ)%!gAPC?HNDsfrlX5dVDM%sIutVh^Wd&kGjh8S2zBq z*qv7q5vy%V6yO{`)=gBoKi1@{lkr5X182LsKeu)G6ZTwqPgSU2TzJc{&4Yj3@m+WW z-<8KE<~~@R=sojY5%T<5o=Z*Pb2Pa5c3Gl5%XXu1c{~8B)4t%%FxI99A1-?^&CO&a zOO~f|B6dCsI`pYOERE(Q(K2bJH;t5%-f&DA?e{%z6)=OBy7##pWADAw?w;0Cm3L5# zpZgvo?g%d0>~Fx&8Ryl&vSw%x?t~CCnkn_>b{C&RPo)&FP2Gpf#b=$V3CkVuFgOX! z1nvWefD?lL-bu%vgJ=7|I6s#fy)Lp1pYttt9v{c7jQ|>j!K>!Ai3jhw)Jwc<`}+8p zdPfuUfNvY6iKPr|>+??voZuzvg9HN73%(JCon3F`p^7B%KM$VrKeq{$J0-9`oh=-D zHP+#%pic3G-{Zc$xxBy!Z|^TfJS zjyI2xKH#RBiDEecQyi?M&uu;U&CO7g%4xi#WNev zYeP>FU>NY2!mYO|SflYdfzLthw)nhLXI7}*gWcSLBF1J?0=vZ%q{d?)6@4^j7X_P7A_P3U6PLArJOB z@0!WQ_mTSJyQk#p4Gg1Q7^|KzY{r@24z^Q?)tf3TUbwY7&3#9B$G=sGvHi>*?dDkv zGB1DQMV*|ZYw_B82Tl7CnJ(kr(>@*W6z#4Gr2Ivwu}sCZQjg`+oDpJOYc_p& zs<|9&LNdOX{A=~@itU)P3F*M55*%bL=5kS&XRS1^B?a2))84fC@i(o=xw2|DB0X8C zM?$Hwd``|B3eTan1=h0A2rD68!APof$utuE=u^}0m6X*+>k#W3e-8a{oWxC20*jGK z5oZEss+8;nr^VbRQ%)O)Y~Lh~nOX;}KI}EH5Q_rUTJcp2PM_EOZGao)6T6EGd0l@! zL63FAKK_VPX&!O?&$F>?t5O81m}<%5zwwFc4~rB8Pt_imRBL9caTXyq!LAQ#H8adZ z7FV${UeDgEVtRYf9RmJ?5eliSUQRIP%}0#_g(Kcdcze#I@KelmGFl0^bk5c5Zf11) zNvg)@iLUN!)x+_`oW}8si)RwnERHMIhq+VoyCYXPEe^QKa^H#tE3StBrv0C9eCMNw zFcm{Tcn1(N$y`~ry&fOV9Q({e!V_ppkc*c+yzZ_otm8zNm`O`3FL~Y-cT*-LG(6Z& zJu-S=u!Y9cn8nS#eDS+ey*v489k)|M%UMo+D)RCz&&AIhi>I?3L7}RozU+sZemwN^ z=M~m+k&()c`;W#!YUnaFEDIR;EgPJ2QjQHqaVfc#tPf$@_jWcd4ApQwvsFWN3uzWL zQgnAqzj55h!s-P6;PsM&a?{99;?W*hf~T}Md&9E%S41I2&8q2GvPt(V9~p6}5vGtl z*C_}pz7$7pZqcE!wL|GRWrQ0!fWwdp~V9^K85KisjVq& zMI7FD~(4bJ4?Y%Ke}-Wy7^|`y|{?D+NP!gxo|;Kvxrg=A!25DOR;K2RdSW(AjS$ zq?$(e-n{$!^=sR#dal!5k5o&qTm`uN2Y1`dbVvE8k?W=mhv|LKpuRdQ?OIA2-*UaE zY$IDKn;~_>s~WugT&`U7oG-D)&_Y!g7+H4in#5Vh$7|EjjDuvcHg8YClvEMfy=xnL z4|@94Rc0ESYcoT#ckE9$(=?b8#dPax3F=G8sS4p;j1DpmZ#2tWiwu(T)b3Ml+8ET) z;E(TR;`AKw>>tN&WQ5vSC1Lu&xFl(-gc8`N+44!UpKgJK{99LV-#h}>0)4$sMr1Dj z+T7oeKY3psj>jIwK@er=JmxV8t?RFo&z&J8lo{h6` zFH0JcOL0>1xSy8%cIjC0@NwV+&M9QwMd>oRa}@PC!*zPr@9H`4s}lpZyDxfSvOD~B zKkI>1To9KZ9M_nn-oRJjk^3zy z;O1CtMs|ea#?zQ?&3e<|kN?T0&um-U?M_|G&b=WGvWhG=y%3*#k=ccU<~u<8h= zJAUN{MowjKm|8n)~*JYPHr) zTg655uv9X_B3qL8#4X~m$yr9I{8#KZj3&IR`j7AABo5GMmKkD7E@25I>Q$}Q*DEh` zp{Kf;sdxrhEOtnDN8~SyGM}RcY>dE(NClb|xijK8Rr2grNrf@1O$O_uUi2=PUB(-^ zg#^4`idlz}e~dW}mBeuRI$nCSEkk4h$p$^fwReAB%^o;Cv&A66|ZDj|2-O`mj*MpMXUFr6-W+L;1cY`uczvuvsMysDDZHAv^Xe zfJ7ei`6p+>oz^`wRrT)irIZkDNZEoqFVWxIMD%)|P$*0gI% z{IoVcvgI9c(BT*dsZ9zFS*EjV>whA;30Xefv1^+eEF*8AHQW0pX_EC_k}V5Yoo-tm ziVZ`GprPcmWSj#9azvM%<8(YfR@A7l{Fwt63SKM9f%Mj)Y!RD+Cs*#OF!gb)8%kKk z)6I5hFJ_VEhuny-aUU3pNo9`=&=CZogFlM!nrW8t{*^HOI5J`qu4WJ0k)Bl9N5|_k zihvi)J&ff*UPSrRv%wzeL$&yxC@Qyk-XEW%9*_Oam==B}{W6nqHa>zv=tkt9zUp~C zF|*#jPaK0kGq&0YBvu~=H5c_*Eq`h*DtKM9C$K7PDw}kNFNv3v35mIj+QxAlTwk5mmP zJJyWvHpNh{OqM^@%o^KWo5}XHC6u1J(woY2%%a&L*iVHriT27{i`+ z(6m3iJk1UlK@<0?S4Rm$%1aIAbe37FS5iICZCUagQc2gj6SS+J?Tobit#nw`i)gZjKbE7F9-leLZ??ShB-wk8diE zW^<>kwK$M1eiaAE*3>x*&bT)^){P zE9t|A2dFJBBj*5t*Gd>MEafQ3oz5;BE5WKSojbFZ$wz9WwY8G%xHh6lzm4iVZE-F^ zd8pYOjasgZVLD}QPGvJ;xTbA-t(n{_77MAIuEye_h~`{=HchH)wyYYOr8Ri%;OpG6 zM5uo}HdE+8SgTeB&M3%Y3g&M<;aOLIf(v0?jnvAwvS7$@s-<*mP0nQOb+(pl-k(}) zXi3})=Hj(hNfTN&yDeTV73U&jL^o5pD~+w@K_1ysEmqn!7_8W(w?Dn2li{%w<{I6g zY#5Jd5-avK)l#m<<+Kw&a;|BU>`0kM+n4H~^)Qw(sm#u(t}Z%IgE_EogT@gYJ(!2;67q?v?W95`81E$t~ClVc)A)| z?MOuVyBe!;FC^FIKYCud#R(VolRT-9OoB9oMFoy4tt_uvqDdZf+D@fHu@{YsbG1iE zjcaytR~0XU!)zF?O0xv0&r9Jq6`!Q?+ES&YctXNt$S~T3^(dKPnyZ%%WW>AQ(Jke< z8d)EprY??~9U=*>Y|R2(l0NJ)y%D8|OPSMRotD$G{-tua1`DjYlolWARmHrr)ne8w zwZ{VP=8eqx`r`9FCL+y?VMdI*iF zsp0zE#_WkgZ49{~``l7)%cF=9rqhZLdbu`C%}fasKKpT^_}l_94r)WLfC(v(uW%I* z0x{0#_UnNR)W*$P0&F)%f+%5Y^aog;^Xzfp`R8s+nq5R0}P4tYL^_zn>E)y zHWqACPC$t5ZJO!Qk)t8J<-BlGVlBMICax~5Be?UC%lamC-%=n&a{*| zF*Qf$&O)Zouo1dh;Pm=6jPA8Q&*h`0Obq7iR*W(_uyzU9niKdsJLf$IgyZLjiv2c~ zk9yDGxjFSw^MNRS!gL@BGILqkGSH*(GrN3-0X$70}7JU)pn&eMqC_FXoIYjN{p%U5d;w_@a&u;;2RrDaEJYpjtPuCInK z9XDfd{4=3T{iCsQysypMs`X)cnnh+xV=hV!|_IPgDBdk{KUcaV` zA(2L(VFMxT_M}VZVrZO94|DtBaM?9YyCC`cmdLE_C^+QFngO=$A$F6T}>XGVoiP{VKKXTiFZ26_!G zf_4v++D2`yqdCi%*CpI`ueU?Ck1WG~OM{fhh(2QAhN-r{iC8gu zYQz6|2Tsm4X?SMJNTC_29ssXNJ$uiAdGV=z^LI|WVjrJx2@bO9l8_4I{J|iC<)Tbt zJa5jYp~_RciGJ%XW7G%j0)HbuIPdyB5m#gLgLm0&JH$%p?;pEFW^u~9_F}Nf(x0ps zadHs~D)dLLW!WhA3k0|^)vt~)6jT-w8<})WZWZ(de;i~fG*xyuhJ9&`;9Tn+Nquy8 zps93#bHti{!XOt4fDk`%>zupblRu&8)t(xyu30P?VD#(@Yjo!o5|`FbyqRf9Sga{|A)Qz z42WXc)<7{JA}A;#NE%d<1j(QvjEah65hW@?1SCsV(kLj1Bo)a5Dgu&|5|f+)4M9*5on)ab}-y)^QX~zO9di@15NBjlzaC= zT&xWRp9J#al6%r_Nk>D~0`rG;1cB5TUNvTfNNI93CDUKLg=}6cDN0$4}bk6Bj>YF zV4#BtPPOQr@DTLYUcJ(DKf~^G%HSZ!!E;)f3~|X1(9_r4?WEmXD8F3oY}zP#qM3Xj zqH%TPq-Qb#|Ml~rb+`M}8qzt_Obl3%5QQrs<>E^`QNMB*8X+cH-ZtM$Bj-JUc6@Od z7u=<>B2cNDE`zcT?iWr}8KM5brJ=LfN|GV1aEAB?N8@dmn?ZL|=ZNAtjCUXGV{o5V zbw10ZZk-^iS@ZAC8_T^<1MA$RnS(}d^Nduc@(|xf>Wiw}fEZ)j75UV3(UmJa31{XW zt!W@*k+MM?D^G-F7-hfFL}>n`Y?L?_Y`^KIlI+OlFW(ajY$qwt#6quO`H<4>&i&%w zNYan?3Co<-a3)z0koj>#!Nc{rbPhu&N}gAD**sXIeLz2nN|Zh3+UI)dp?rSja0Z{q z-1w(fO?lwq760z1SEa^k{yhnvnh8#>~l4~?C1!SV}l zFa|r*E%?p*zFog-DP&5r4iYXYV4lsnINsxNZEjxNn{MD937N%IY(ui2rI`bMRroEM zxd}K>j~~fu%|Hl5isXBn6PxhSYrQj3FK_4vcS)^;1Y9UyZM}hlYtKtT zF)@nPjKyyhT#u*shTfwep&R46)yXc2QSS1rR*5lrBjtNd?SgL;AurPRpg8bT#1M?~ z4OZ~52=n7LKy?zJh&4!Tw=Ll$IIt9%B=l|gxt0^Irj;j2f%<)SY^e9f(%O2Xe{7is zz%8{Ry>M&Qy+v-Y5wOy^iI`nrvpv?wk^M=s5pfpfDM3f{$;=?#!7!yB}xl9c3C2 z&|<_Ia+ZfBg|7Zg$oCbbkRe6mGKjlE)T!?wbJ?GGfuG{PqgoA+1NlF z8UzljZ>JtEemNvn3|xFSP$QcNUTFXZrb%!`BB)+R;MvTiUQYO4SPvWu{DCJfPM2N; zu#dn^WWUW4DFx~-*bb0(ytUagp;;v6p2vZ~FZ+m#OVC`eq|hgpmQ#>E?hq?!TYbMQef&t~>#&E8fL86c&qRdi3$av?ktD1^I}LB$)sHYb(e2{Wff=Qv!dPy{aOu9PZ*f z^+#S_aY=hhEQM97kCUiqe@|$e97-L*Guk3Mq}v(BJEUUWsxQB%*}zPKQe`?2)~4aO zC5JDPxg(ANKZy_CTPGU9hIru*H%3o7RDVq6$H308q+%5ZoU22u?iP-^xfM4$^t{6` zO<&c>f~f~IS;e@DTCPrbBzsQ{M%^})knP6JO(Adz0B;X@0CU3jdGO{tMa{FF!nULM zdxN}vGPy7I4syAdT;9CV)kfP85&c?7e9E9O;Yl@3nRPHrcII~}%~n@kAc|6yEn&9v z%51Ss55t}Zxsjv??S+0Ss<~FUr{7$g;?d=#;lS>0N8ia+yLpBY2c9*aiRL>}*T>|wn zZyzSjN6kkv9z4!CP|j_5Bh^BgRa~&p%R@Q4Y3Z_AoPo__ zhtAd2c3nG9mCzV-xPFlhzy$hIj5TTqq&s;|DQttUZRo5Qa z_j~dSWc*!5Y0>+0!r^G}l_ZP?d5_F~<+fKpi2ku*O5wO&8Z96t&Fmw_%MOr!rcLq4 zB69%5{FJUAsosbr-U-oDjaaA&?l zoV1oGqs2(N+j+VRSAKZilKJVQ-RwM~fAU*|R>*>GF6mUkY8Y%T8$=1ISP=c!V9GET z%O1p+FH82mPaF`BpX8FN@pN^7Xt^Wo96fTeq zlal>I6Ejd8AOb&=bL*D~NVBu#y|rQrD7VERC$V0)efRcrH|5y1{it0(J*xRi_r#x) zk@^4&O&UFoG8N4%@qnWC0Yi7UWf+~nIGET= z(Gv>tZ4MHR#sHrh0mi(Q`Y@&$gT7C;l4vN!_Bmy{&fgvN$02=QJO`&pp*Z*$FxS6G zNEoW+++KSQg*LQfk&2du#Mb+RuyftW-b4{nYaY9k34nDv_5pt!T-pA3qRteP{Z5jt zU=sc|%Z0Ri2Nh}T|MfwR&-MlVZD~7W97o`^)VcoZjzO(-Rm5>fS8*AbD;GAswLiY> z@U8v?%-@r3*#VIm<~dYfl`%O`e~}G8!?{knebb2H?C_L-f2WuC!zEe6ao4s*s>(?8 zd?!M$byY9n?@ZOf18D@^34 zXL=J_$eING@N?lmSv>mGm$fjp>9tKXcfXiNrP*50Xy2p&X@NJ6PnB?eHio#sBM0|X zJ(bG>M(abpr^{}v5#?MwZnz9TLKFwwHZzwzE9^^o=8%~4kAklpa3W!^?N#ls?h zlnM0lCYUa2w%qj&9%J`hG^&`YLtMs4m*BUCS$Zms2u+?JZsvSdZ$&uQmj2`wR;7xw z7rwFPb)c+Lpck32+f3+{u&XSBwo5fnpr;&b_(Q%dx9`V;@qHwPqckHm_A3GTw_Toi zEXtQOCLk{h9Lc=)`DFVGa;CWV{*^;Brnd+w6Y^i?>Jj?-=~oE6n1na-ejSSR)mJT* zwPJ7@WVt(;1UwYfTD243x-+)F6)hkx@@O1#Qw8g9iYv?Tp5H zR0ufANPH`EU>x3^csYM^93C8Dx^-w$==;^fH949w9dCF@43ORpit?GiQ&V%4Uh9JD zE>X%qGlRW~s#SV*N1va|Ki4B~-h-Hk^jij?e@Fdw{C>~AH^~x7dSDm% z2@)+fdmr^c;Q`RrHP|1Sg!wsB@_I-GN7!1z>bdVdk6+*3E5B*Rw>M!w7bRmBI9qC2 zFxiXHk6GAKf?HRJ%Q+3nNN6*@ zKpQPh{`-wI@K3BvH=mY@&eo|2$cnm*ACR70<;-~)CSTY7PFUnR`WBbo?M~erzPj47 zMeBL*Ivm>+Ka`fUs+n3U8JaW?av#YVyjeu^)5`MJeamPghbL~D4J-MbUq*b**Hq&a zH;UI@-*gsd*cs#PzVq|XlI60Rax3?d~VcJULp8yeH zgBUF{*lZUWs2sx#-ORsicC|mUNgdw%Tw+#ZU^X2%S~OZakog{*3w#=;9t3r)2p z?%lk<67f(eDgLx=Q%>Ld{OJm@YKCx^j!)+X*E{pl#bx&e$Iw3v?Z?3-XPKF_5>ZR7 z(uVY0oiMj9s#$CZ%*`jj+h!S^9B1fSIXad2%HejH$KvV9apUuX$=+$-J=s2CUpdoz zASwet*t1JxUc>G0Nb;rKee|Ti{UH-?g%qh(Vf(TFY6EEmvhBCq3_m0?vJ$H;x7A5fAzS+S9bNRHDN=5DB8 ztJD0^uQdw`w-aHw3Qq z9;}W>fm)k>A@Zr1$U6O0U$sw1idN|j=VONrjEygo=r>$6(uL!G`g`prXtNt(N`k1%_kDR6f~BvlQ5 z-6ak>NX{td@Z12Vv{Q*vzZ`$L_U>Ve;l>Z^uY^>D4o1?i*g3pm4f`~cmm ztU#D#v~^KS$8X@BmB#_)o@yxSi-}xLK;jS>Fa~P33+iJOI|Acl`(@q4gWhZ;Te>zL zsHb4UBNP`pqFdD(3!j7GK;ZTWG-mC}K!Ie_9{{BR6dfuF;}FmsL|?A@ar%w=ElvK2=a@v{nb-ZaaVJ+blUqx=cY(lmB9m0>DkV3e^X@}gMpu*0mc@P=sGD>CA z=JSGnpPY$F8!?JhdiOzg=5kq@&9(xWR64`b>McE=>NGezA=ipPC&6!@ogY1^l))l@ zV)r8XOUQwv8QKB~7#Q+bGb$cyiql3H&)E?5jTU$e^uARo)Pa`#1h|)VDIpWopAO8m* zr4Ye1_mvKBPs#Wm_>l%9l0!+X*F_(HSnkj_x2h?A}w4MlbA;i@ht(xbM zdal|WWRS#nC%uCv_Z(mQ-@xIom3e+YDyAKgSKXPOXRr<~8vc%-9aKL%h&9lBl$}aR zR*p4RRsr2z$I@r?+r%`4e|Adw(a6Upd&V3)ogiCzRMa;?avXZiEN`GN|S@FmEXeQoSO^*l?3e>y>IPGTtb8 zEK}Aa!a(O>?hVTq0?XjC^y48;pdqe50bT(`%Vn?=I$mde>+>JZzJZ`*gbpU5B9b*o zunojkRV38L1aKjKgcS=bt&}C;uur6wDO9=KC%Rscy? zpf|X~;=20@UGvTIT1?ITOg9bA-_yIV501VKyYPED%lqWdBxVm9Pk$_R(l{^u}`-d1^x<^>d1%d=Z(gutC-*_8;10| zc{glDJYJ*r*?l6doh+EztLPOHzKQr|Lwp6BTLdP0e$6Bp8eE)7JX1kWQAdLPetQ>O ze2%@1+VLhIsPEqOTZ$8W>U3oPZ)y5nOT#nRI?zqI6=t1~2dFj?Ie%FwUNnVbmx*v_ zk$B9%^u3lO=MYk2_#MhgaS(BPZRjI!A?3AE609`U!o#b{(@sCcG?#q%b^Iq4;k}Qc zJUxBY>kAi#_FTA-q0()CN7;^2;X%X22f-Jz_*Js_s~8y-v(h4N-?A-9%d#%Jn_^#p zpZHv4;Prj>?wVzaj!!qQc7nR)T7!dYDSlNl=8p0Pi=4E41(Ok@@|5iWZ1nM5K-bQcVmirG~0tAouK3!zp|J;LO|MPz#?mwaTR%Y~UAEuPVa45d3 zye!|B_TAVTtip_CWe#3w5>2KZ6fAo*AGa`mWv6w%L_bMh&@iUtUw^Wf`H1n^QHQVN zPwS~e8Axy6E(s8kKF2BMHW5OdZDdQDBtbHI=k)AB)UG)Cr|0%Si{C9R_Bj#R>OEkM zH_2y^TO00EOVkyiC~gDR%OyM{1* zmE5VjQrsVbz##>o9Gk$Vp@4-lb((A60vraKIV>0doGIa zZ4SB6h8{Q8rbLf(9wL%~^O@Nv)NdD7s?jrBF`L;AveVc-C>2+y4q5y4k8Xx3Ojj?i z;_@au!_*IlnGS4_PVmNGW4spD&mXt7!fXt@w4%$fnV)#(_nvKk_NA#DUHq51B zo*nM-5QPxo9Vk#w=jlCv1<(+MSCMVt5;>D9;7ek{8>M6dM#WaEg>Lq_$K)Qzy-)iS zFk=>Kj_L(@lGT^NT=6Q>u&1N+gGAD4FLYAq1=-M!PjrwDh~vF!xtg}svMu}We%!r# zcN*MT;{Aca3{ZJ+$OGFDuCMMLn=SO>mfMzd?q8`JyjbzY%hgmPtuplD(ak%#lU@gQ z!-EKyGb(fD${dN9Fs5YRmLjH9yf;Qx4zwTqIZLA;9B?C7m;ik?t*k-13Lno34%eb; zW&`iu!qo+zGLycWNnrB`eWjb?iP?^#^eMvFO7vA>D_6u;l+Ne2kG5=9GnPey_)@vl zQW8X0R2m})+x*4Pj7c~6%w>}?|3=@i{ohaVEqeMa|CRTs;W*-P4SgclKdJe|`pdp* zmylZ+#Ouw+S&-z-#HbTs7zEkLm@~ld|IkY&$LQ(X9$mWJO|ffNH|$rFTqf_8w00OM z5>WcvKjsjP0Ikh#(PZ|PW;KAk4(&$HNV}Eh2LT2~Vk|@-0B0@ff(;xz@#j189!aOw zW>_NSeWoRq835JZz0UFU*4-Jm^0k}wCI6ABSShd)rIM^y4~<@fZ6qZS`izN+`E3Ye zh&p(a>>R8DtD2=GQwO_u%V_*t?FCT@r{Fwu@ENB!nY*}4_CH*2yuSbZ;cEx@ZvzJj zQ%z8oWciB@?Rb-AKXXdA;+@1C95N_V)VEkFX8WBvIp5_!VNQj5<}97)4M+j}*)TQN zDEIEYiFp3%!2bQ8Nc5)|>FKW%Ph91Pj=(Df-Gu5`^Z!o=-XBfzIX{vUgXxbrFc{n- z!!Iv``uHT&L1Mb~&A9{b2V(@%1wd#zmF817_YCD*~b5L{|%D*dwbI&6rGu|loZy)D*Ow>!FT zo&Cji(Mz@a8M8mxOkJwon4fp+R%0p)g_pi(F$fE+%SWks%<>d=-x>NBkAT(8@Ow;s z!_&=XYW_jFI{MxGm zz3LQ9_5u!CsWxzo&!lNXj)3gH909-VuUBjI*r||5v6?YgHT;n*X)5NbiHYWyqDvR8 zPqCz3Gu1WEl?)3!;xYU|`#i6qrL4KE`4xq$&!p@FB5%${chu1a+M?n+1jNs4>hT80 z9KnpMi@aJ_jUWEp+1MgY z@RZ;Qv36XPtMz0H@~kygf~`tZux%Tk6?;o_jhv`i;bVF z_kdfIvOSL>v0A7SY*p5o6^L!k_x=mpDl;>PMq2T^=d9Gvn5Yw4=*mX2nljK6u&;}T z^lNl3?eMfB5#jTFMc|x(>pLfe!=|BUlol%am3z*^vU3}8(jLpQ*_||robH|*E4GTm z!?U6ji{FP1v=Eb041*%$T$h&^2ERWx^-c5yq4Uzuj1YiM(TR2)7y~+p4(wPH^4eRb zb3KL#ha|X#;p8Fa|4vx{H&QM{$N}}md}NGNe~d8?)c166!5tf2_Dw`nm-|PJ+gsQ5 z_eE&9kO>HN$!#%{)9~LHEh``0*i{!&h#4aT|~IA2FD1k<-2_%9I_?m)qw%RLymaPXu$k;TgyC z%mbkWnY%PSrW(Pziy>aZHy969oW3in6pgrS^UQl1L!bXzN71jZx0%S0a_qCHgHYg= zk*3nTiAx{qLQY;1-e1AFI#zy3xaO@c8!PNDEP^2W7K@-&x=y-AW)OCN1s;M6hyOtz zZ1V}NtJmDyoy0w+?EGG_oa~f{b@@AqAW1-OE`c+Ph%2#@IvIAjkzv0^b_l0-8_&=ay`OnK1!Yq2M*CJ1h6y%+( zDO1-ipX*+z_kf~A>`x}B76$g(&bwHS@6!xF0A-IYjx6VH3lZNz?xciBkCheO1IA^)m)Kf zZJs2#I|l?J51O|w4}Lk=jWj$IrCod;Xb7$e!+TnRID5qvvYY!ROK;{`+woGWaudbptW_L#eq`Mz)_KhYM)* z20bGJeIBxBtr?Rcy8{kA_4wa;hwC$MZ{tqP*~MwAWqG-O$&fV&Qwb~W;u2ukg3k(h zX36&&n>Hd|rAiGS5bK^evoG4}UK+F})A$EdK&7fR-q)Uc5@NDT9kFIYK@ zjClT;ZX*7jz}!zD`<~07$FdvpxwlDzUu*%di`mxAE38lBmEaGIUPCYtv$)6p4Mo(o z1q$6LFm+#L8L%lzHvoZez&crOv0=^*tTli{iARAuILlMi|E~E*-|qdVh(mZwZ)ah? zNR}uxE{6=( z3O}GY19K?gU`yos!1(IlI09LrxGlfDL-CIL35uXC^Y>4|`}b1!U)(mx-MVcvK=%*x z=2Q0vWuPc@$VDN=>OwKXvh*TyDx?q;LlZP;*wDQEN`yl|8NES-vkiA`Q3`xsT}e#4 zzx07U`=1*tadIx~;^gc}nk_oRUF373c!IO|D(7~%!HXAv4L8W`EYkOK92m@$H*?9w zf9@2hnq^4WNcoJPI4gU{3(wMgCdo56o;6`4F#AA~6ZG|pSocjM_q$5dxDduUxKA0< zK96L|8nYEt@J4>NBLh(E8r|HtdyIo(_uan^%l(xkID5#oJPSPa<&|7qKy&W-^pL1% zA6<8e6q;GEJ=B+xND(LSRF--ADQDAhXmN~R-QxXjY7wq44}S3j9K3{c=SFq#2ug7Z zD9m7>&~zMP+EpwG$O}^kMn(3>oY?QQ4_f@r#4jG+L?jSD_d;)7@w(5J<;GskHKus* z9(vEpS;6QzaA8}8LJV%Opu~QuTmhzE9pL=tFL!f4WT`h}a<*R-yuX)}vUE9G08P`Fhh<*%2TKr^IhfM5v z2XNO@nR@}bm8-dt^1J8HD<{hDCp)LtliJhc)u}KuaDnU{DO}a2`1($Mdmmvw1`2UxL&oNE@X+1y=vaxKCMk4|*h@TX$&60N;d(6ZQBxcyj7{@C8rz2hGq;LkwHK>NyiK8$T3!b5GC5ee9d^e zEutj+YPP!+J9L>god0{b|9|62{URFlajBf4(i!HSg-Kss6Z1n}ghDfo{4ixZh!-~t zxinok`8~}dh7a|8nXgC*A; zygfGWxOCPojECBNs_U8ffI+);#+L@zx-k8UhcwacY4bXoe!|#i?}&oCs9iTMJUg10 z)Zb_woA%`akEBs3RS4(ipeg#%=u((@mz%72+CEyB*%nUqi7h=^kvb?tAALU_V-AGPowEMhaI%*tAuO4-Xynoj%NGKzCPYL{VDo-^1|l8b3gtL z<_JBT=7|qAhDDzkTLW|kLi$7W+FxqEZ#Ed?4tG!fELwecuqb8qJFUje9;L)dn?a36 zXtol_<-GJm&YZy~RkOZ0iUsS3sKoeiMw5yY<*y^%2*nJlALYU~24sChbdfDVShhx7>c2-oltL*q zv`fn(`D6>%5#j3(?*2kreQPECAaSJrD+xw^1%uiKFY0o10lc4cZ;U~KYN?=OzwY(U zCh;&|v-i;p7yO?+Kbcl}Ll7kzQTMNO25BQH9&5iol1V34L3BLO9xn4v1DFyW0Bq>0PW+19KqV}Y{`5isS z6Pl)qhu z!r85beE$PSP>VyGg+G+1Z9n@UuGr3&Y(U9l4JO_vgkThfd$_uI&J%1beN=0 zw#=Sg4KEJukZ_kF)LxepGi8qBJ0zYN)q7Rq=Bv7#rn}ZWOx)|GS27=}mv^`}tv9~# z3p!vsazr?_OFSv~__4uCxg;I)had9PStKn6z4cvP%&FdKGVERy^-!%mbgregD@yv0 z80lDhh#iO--cPVz9m1^|x|d-FouQy-2tSYUI!viM#>hqqcY`A%yUo3b!s$u*fCg{$ z<|?51-6fyi|BjNErv<|Fzoi{VYI$ig3BM4I*NzA$WQlnWvDPKnN>jhv7?S^n)W?jo zh-g34m=(NHNHUpCU`m?Pc0ZxMk6Y}wb8^0uxk#g~y5p%goz>3}UZRV(JR3RVyo586 zdwC;2^Js^0M;$$VE9{iEmP$r)p{`o5Peh5@*autMNM$Lt+Y&-YnA|+MuifTyz`Qxa zG;bpjyE)g+eTF0zCD&-bNBSmkKWD5zx=euQb|J|T1g$-6VPub z({@wqKe#)#lRG+);^a8$Pe76fyw*=|AjBnKL8I$`4yy@5b9?|Ai$`x&u)y-@y1wxl->Ax}nIA8^aoe z%`dFn6g;nGDUMBo;~_m(LTC^f$qVe?g5H&()rNTuM+!wGjVG~#03UfQWzDE5v;#=r zv52ybzG-={A7)(*O9wx$U~m~>o?A6D{dC-Q{>+{QG7-SE99NjC@j0(wFaz!X12CM0 z23TnpC_Z}=ki%lMV;}(Vl75Y*{@!W+Q8F#@{=_u`90S;zb~%~m9uNko(qs;TksCp$Fg8R4PXFt|D=Wf z&AM|;8$A~Zu}Zbl5fKP_g$?deyhUSj_(?_&s2;D416xI>=l|z><|JQ(Q-<4l+Hvp? zPx{9`3dlY|C>WuV|9@{xsN%4f#KPMIP;hk>%y5vy@qbED=)y@TyK_AM&7DIJGh{8K z638jXVuhR4kJ83py4VeR6S+tz$JGrSB0W5u{KO$_0Z`^2D}F^_GNtBju2lP?Ff2vB z-teW0%V`6lzGqh<;MRPe`I{%j?+n+DC214~FN(qHqUjtT(XH!!lxwO7H2$Qi`h6G> zV?w_z7=zuASpIHHcPzO+{BB!_W7)%S;HB)^aD@gyKkt;n*0%*RaH z{un9K$m+U|ky;0g&+c{)7e4{?weN+s$327}BnZOwf_g?<$+_u3J5snE&&1{6)@#z>byDPnU;WcVhvDv3qN!^1T!iDmYc(jdjse6qM z?!8L6IqoK@v|L?(v&G6A8>W7g$Gcb}|AlH%x3qAy-3~ot$0A8zKh9{oMEK{QV#9*- zf;WcGMzEzX11{_?eaJ{iu?PP_``U-$zk$KDOUs}z`&XfX<%u1Y=U;8epZPc$iM?A2 zS79Nl1uzVgebE-snYn?qOg8J=Vvfl+1jV!V3KZRXHUVsnSjn~`&Y1+$d$8lR?@)LP zdcMbors?oWXCkRA2B#vaq{9Gr0v-yKm_no~@Pa^s@G|ln82Bi^j4VuhNywhJKDAvq zyFBo3RKRb=&La2szXn%GkxilvKsg~%kV;VVSbH;Kh8$z6x>t%)pataFLK6fwb_7LS zA@#OTAZ{^BB`bcaJux8~vd`;@rcJBmJ;_!BnX>bz+H1m+Qke&D^2I&njk{G47{on# zS!J|bVWy^Xcp`~isVCCe@z#8pmDvg<_sUSjR8li}SZ|2crM}LN)8)NS^hGwg}wdRj{EFkBdyNW->i#y&LN!CQmzX<+pbbD=p^HzWBLIu-v zug=g}zvWA7H%__w`=Kg0XB*dQW#Q-pg^RX=Qjg2$v3n$mi{HF@p@8j|>GR_k*hJd&zfvrqskXPD^8b% ze0}=RZ|%5q!Dkj0pL;JtNyf~MN>limiGau{ggx@~^uPwnyz%qFWn=@$dL+fNff~GZ zjf8d82_-Dfr=0?^gvDlSF7nUD;2VNHc{d(tZ7UOxct8v%*zahAelL924XJ!`MITI0 z00U#>;zr_GV9={(ArA(n1jEQxTE_<$N{kxE9xz)u;rcS?M6Bk?1kA~(kW+8@xZ=NY z#anU5QuD-oYIsN!klF?D&=PL^rBV1OhzCGVj z`|VJewi{B2AFd*bdur11(47s>WwK30fr`YM0D0UePjySevtv>eUxI==wi5{3&N66W z!##m`1<5PZj!N2T;I1SRekNaTa0=C$*&%d87C3J9ZBZ$ z((KJ$P*+kU^)8bln|Iwt0^2)I)1YD%adc`X!LDtwWZPcM2vN{%q8@yXC};yAww*vR z43rR$TKSgqhqT|ElA|NhkSom+@ z%s38gO-gGgMZpI}kn0C-BABNkGXUX^-`i%#lD2?L3NLZM;albHRrq_5;w2agB8MrA zi8zEoZ`=P39xy!f`vV>Xjf3i{usqPBzIA2xdNg?8XZg$S?V$a3EZPP{iU<*5+Y(v| zV&0V_Um7?B#=sTnEm$Ds5{yHT+YaJf|5r&y?f(8F*^L@W;U;=mWW3Z*5WvL0Kb(|X7yC1v&_R#;7X8aqUsLI^G* z6zto<<~$fSqp)oQt`Q8E!D8k%C{pO&(D0IW?c_Tq@mQ@6G58T++kqGGc*9GvaQ6p{ zeGZFEg^a}%DKybyZJ=}b8N1B`5G%EUtiS?wI}#{R0<6hZBqOMH=p`l_&IYO{Xr>aT zDrj6^R49%FzXleK>HB_c*w6m?D*2YAgMiYR{CtZbWLfJfio(3}A{!3}Ew`G$#3%)*iWE zE!k)e1~&u4T{9DDzKiWOi}uMAyr@_BPEhfBgaBVU^sfl*q1pJ(f?tTxiX_>7mN@4Y zemj0-_CTZ4)1P`@muXEN<+UoTTYi(L>E}IxW2@Oq-J`T*o_YStSDqb40{%4ayW(Ue zc2V0YJcvCI5>}7sp9XVL(B!l@(1R5J3b5DpaDan{2B3U@j)HW4I)Ku#5+fmT5DoL6 zlC2L9CwVXJ2Sau(fR~x*774OPbz5RUb|M2r=b-RzR~<)?j+IEqc%-8@($Nss@605YcccaMdf z#d3E296CIoD0^zeZXGZLkv3QWe9+-J)L)GDjCd2k5~v3DFMfdDC{4B1x zdVq9V0fATPHne7R=yyFR0|`mztT&K%hU)+wK<+Ci;=m}-fn-D7gS%)Z40gpk24C6b zg$Ub=sC&iBy-)$1*A(9lsWcck-MD#p{RHySj1#UlaCh!L5dTQwv|fVmXPBZTy%M$O z+_Ng%xBI2AcbIvrE~pL(d%p?BV_S>g|HlTu!y>UOcEQi8VIw3)NI^{4RY$f^fWMwP zWKawkRqcQ0zX@dgEXSd@afC_8><#)K+c_%g8la=bLqhV8EkVII{~?v$gc=pdGCc#r z^`rIkH2{11o8LUA6?WWTQ5chV_Ao6)`7r2(zGfsu%C=;|fidU|i`MdcAq5=(vSZA@ z2XtVRs6;t=(wHp%*gsCIMmwEF(G84}Rytp{1!kx8zQYTDot{@uqrUqt{UaK{`m{Gs% zbUO9h=e9ZPu@n!v=(zCcqgvUmEwbVzZCU;jnIW@I1I}&{vhOSzc_yDfJ5#?8wC=eDQ7H?mFSBHQFm*+`S~Gt=B~@@z&Z2h-AZRJy*;hXTcYa} zp&K{xp{HMJlDdf@idRI#IR49d%~LCv`w2!JbUzrO+1TBppt;VoLD#dtp8RiD6MGh9 z-&+CFWs@MnJgXT9>6j7|HV}J~&ycTlQ4;7d@aT#gT3>*FzO!dlOgp=x~&y?D*s?PL*BE1d?b7v12^rTtzLhAW$-Y~>r=-DuePyjqFv|i zVhxzeMoatHrIig)73FB!#!_v^d~sSTcv+e~Wr*w9fw-{5IFlLnW)X=_XZO;ixSGy| z1b7X`3#DSlKKfl4>pD%@@G47^l)=6bm|_{;a@ zcoE>o&j`m!vo}@&EZ;b2ZZ&c}^bogFWZO8g0sFa8-|!H>_$*W*`^5wbg?>o#Gi9Dz zM5ba0(V!Qhs-Y@;*In{ta^!11;*ZlL4&mjyDY>K@C~nMju1SPX>&1c4M2Y7g?Fbh3 z=#r?~yGOubF1L$EAKqB@ZY_WRCPRayBOK0fY|9wE`4WoZ6DIVijEOw2SwQ)h$B-=$ zgC`G?n-ur9uDq4%`SQH?BK!{VFfZ0|+3tvN1yedI`{H|f2Ohp0IPJpu-1_A}m{}r; znE$3cA@Smm202th^=*T(3uqT_rn(KbTN&Qv^EbW1YR+wSyT@mU|rPOU|hp%2TD>Uk2zVXQ>(Oo4)J0U``TLZE3jK*1s- z2AX371`q@&xCd6hd4OBbR3A1ObPY4Pz-Dw$rB1bv@4K~tP6-zEHDGT7I%_{KMocI zV%kQAh{_q5~q1l6&228LK?2dG1+dI zy-nyyXe}289-SDVvqFl>yMCcp}`X^wmW9i$dpAjjkCv2T>*mJ)kquX6Ce=W~- z&g@`sqrTmnf+0Sy9y1~7@7sCn63rgR#EhR;^%{foB4VKp&`uF)kMtUw|Fv2$Bxqft z*W;L;@l#u`F*7g1Aj$sWcE(Jo2&yT(V2Izkxh{2>dgY68o2UKNb z!O&^z60IJ`l#HM1dW~^;5wb}{_w9_CklT0tg@}S7A?p%@9>=1LpLTkU!+8;9NeQ2! zCA7Iwe?-Xo5wrm+{ridva?(s_F`}Scr)Swvuh9cq3IE56wB<$z7s=x!@;~C2I9>?f zacr!?0lp|FrSP4I53*;1Zw(w9+V!v)6qz1JLtxfp?K}yELyUup87cy@*ZT|bnEzX* zas`KwwmT zud(3yMuJoYD72O-2jstc50KtSQBEWlxeV$z0ux&(~L4}yi zpUBf+HPp9YQ7I^0Pg&9w6*IfQei|U!rb0^f&6Y+1Q zhU0$9-`9T@aKdI(&7llJLwyrdMc&NGfhn6C0g=KD8Lb`=9?C(R9&wlUZXt}dR`Te* z{AuRh;L)H7Nax_PB##nSFQUuHv&P;>Oq2GLU&1Pz4D2_=>?=fyn-i=!y^~t2mc!+# zEa4#?oUbd}7Wlm)f|pG5pIry=zH z7ll=b_>K3m={xkna~b=RZmL31eJ>M5Q7g#s%quD+S&%=<;`V3-*|7!=!s&s-Jk=OH ziu?s<5NTPIT*LYGd#RoT;UWrW91fLx zJMa%!L$;}ZF|r-?rc2x{2e8@vQY7`z%yGo91G}3oNcfot{Qo#4oekLIo)9#w;V*$@ zCKWg69H5&(=x=Tnb%_85U-&)*Es2>RiZflR{}EaR`!@wGR!h=G;LaVuWQd2s{Ih`p z^qwBP2Sihf&=?>4BKTO3BA>#1SJUn&%5N>Z|L6L)_izjGMQ-31J&EvugaJc|PbUw3 zS;rYAC!Vv$AS4wmh`^=?pq_GD>D8P@;S>(PHXWyf5ILbtz|Cam$Y7yl_`1m6duJz*4PCIoJ;?}bzGM)`kua-Wms`M#c; zd&1%4+4A4(5U;)8L6(87*@bLz5*KAbCEdZxd)hBZEWMVzz9CMUHFY59C@rxdtqk?EQ6fpMPyvf5vlvs`z-Bv0#9{YZTbu%}eI;97&|mGF=x zmCfrKTFp3*Q&$agbi0tWqb zFlA(=8F4n&JNnZJ_A~W3-9-=@4=lAn_Hij9eEUx^Tyf-}T*2aNW>w%|BZKGSz>15y>h-kX$X`nWm)InRs+=UY}n!!S#&WQ{JkQI@_Ae_8+NZ1b!RGaVQReX?8d?X!iv|Mg>a4oaV*j(^|HKbe6I;a5+yji3Ge=Z z?U3ozO{-NqyIgehq;iqY$-97)asCT^2{oKFb|MR|M zoS8Y-nVCH?bH(?%#=t5?1K&uEYIynU>L$yP@F0^XDuEi0WSXeTxu!2f%FS)vN2k)E zGAYR+wxH*CzcV8@#eUxBrq-v9Pdqrq)m`z3>Z2cv3~f-hqg3o@aV53~Zmccr z@(v3unoD`4Smh@oc+CY0-$Yn7SH&RviPg=~wLMjl%X@5H&R^Xftlcy#x_WhPJ+ln; z*J4nskmkPn*irCUe{mHN20ar)o*AyL69wA`jGpkU;Cl$LXQTM#rqi2akAs}+tmdcB zc>SWMsb~3Rl%dTXHOIDdk?YOk538Nl=`HhT=JHO>(xcBK_+cZ3!LAMF{z5 zRS%m7w{+J82Z5n?NJE?8K$*VL7y#~>6Gu}7=mKr15G3^( zVL-ACFzOExT4gDDXTT)Z8M>+1e`<<(5@=IGI`&hrSH!6n7>?A`?K{=D*c`3sH+_mn zfk4`SNucfLnu=*;>;|8avzCVqR*)cVf%!b638{cuZPiHWYEt>M2!RmPKEX+D0@QbZ ztEpvrd}mT~h?;~#2U}*))Tu$W25ZNI^x3GgQB?C$#n-yGYDI(QYVnQ-drmXG?cJhn zw_^wGf}nkds2ItkS>g{)uRd&u3eQ824UvGEQ4SOG$$zq z`2o}%VxVSB{+>x_1F9TL9RAaa_h(JAqz|Y_23gJ|fO8KBevV(!ddPh3LTx9Yt`!2n zcx7kSs-uq|7mBxcx)`;(_2ox zMrV?tSiC6^+Y2)Eci&qa0A)5Xo>4>{)o49%)&dAfg2CXOKUG0x0Ft*Tf8a>r9qQ7u zVR-eM07xKk-F54s{}o+}?YZU!D!?rZ`u37BQ=!tl+B#DqY*0aUR6$z<^Pz$^am#=r zw`4g*W)xE%{C>T+zj*={kHWshVkN@>lSq0em%=HFh-k@6;%+WQCsz6NQ7*-=oeHa^ zFNu*%W#!ekmHIj4MVnp{ZXzMd|$r5fo;5D%PS+epH22? zHT$fe`Hi%Sx~3;M#sPErT?O`p126AjK!Q!ews%r_*hdLuO7de zOyfocXk+y?&DV|P=iLCjj@g@`w5ZN??YTN`VOBrjDS~vajsRF3=GXx}U@l=h^)R9{ zPZ7}_+)>BuR~nk3k4z%aS3M#UH7IA8{1NN@qhs` zr&U>&%UvVK>~Wi8BgP2QwmuecIQLNjuL`e6cAw(mUQ8<<6gH9{@%vE!Wy21#&d71a z9Pfq$Y&19wrNwbNYH|vle204q{q+ZQ=mPpzXp>qFnPV=RZUIyp4@O#nGATgj{EyZi z3LvhkYAb6Mo`WHW1F%w(G_?dVJxo=`NPe$Th>-lUZIYhQzPj#w!^jv_zR4DL_^isr zhYM{nlAGNdu{t}G8k#4+MK5R6CV!m`G~%<@;sAPG(%Ez|8hS;)8*HTMqw@*0ddMj$ z1x#08*U-%(WI_DK47frKxoj0$Xp`$nE+Z%7$&?S z(Q}N|LNHPsY$ffL%-2Pel50W}>}PjDG3+GZ(e`Kdy%BX#3*cD$Uf6%z{MhgyS;3+nKo`nf7Ke3n|g zvf~N0bgY?q)fe^@ryMF~{NLdatLrocg}__yVC0oE{6p#u$QbCzt_^yjd;GN`Lg?1d zGnDThV`_4SG?7pxT#6YA=?qc#k zrDdNttXDAqDY<%;x-@9J&C@HFa2S?6k%g`vI8}TVW2ab}+K2u{xA?DFHjKFUqP0EZ z)175UJTDAoiNr+RM)*gL<9*?|?}Mm7;Ls7Y?(u%$z3^Pp_xw@&K9d)_Qk# z{1HiUX5nC{ucUvv3(3i1f&Cv!DT)3e?RUxkmwT7I0Q{>V^)Is=q31oC6G#W(*wFSE zFeHR5l0S}FyhsI3V@zZ#BZ#Dow5lazluX-K%3Uzfm^JC?2#&`jpWme|?olXdt2l>j z#qm!LF5A}^%bhe!VU85?{WaB z0O##R>iu#}!sWOxcUHo+9=8o0Me4a6C`@~SU*FibD_Mo%U-&ePHu88uwo~xSmzH?C z;|EHwSezU`YHDT$Y@(S$eoJ;>x=y@$UsKA{$^sCQ*5mJ*Aq3czDl(sHz3<%ILu=06 zC-4xTWTHN-u*o~c{ItjxMhD8fUXKH)j{EUz7}(|H#s=N4lKXJg))6R_-i1i+M+(}) z^Ok>`E&rz@gU3A@oeNhn-ua1*qo65y!2J9+5@aq_HUL8aA|P^fqX7kt?BunB5}X0! zKragFbdqM%k3I`H9-eFfkl^g01%Y}LwDqX_n?;bwIKVzCKRRvtzeQ--aJ{`$3}Q5Z zXa|-}U<rz4}q1q zRb%ElqbLLN4Zvs!MU5GKAo*0${yz70;t69bas}-xL@SG_yyBeG6JO;xM{}BSBJ~gp z>9Jw&cQ#q+uMwMbzCzs|ese{CzR$od@$#X;ZY+O@Msl)CP0x?@;h}=4W&>9tEz-ji zW6Fss{Kyxc5vQrksE*T(EoCn(x3VX~i?Rn-UnVc3SYP2D%b!f8k;jC{!u#T$@tG_w zta5*G`YO^#o|cK?=5dT`9?eQolk?J%JV_hkBhtOSB81`VbXfr0yWT?nb`m2=Qjac5 zA!&=)I=ke#Xsz=1kG;fwO^w#0XJ;*salSTC=M6%0$$k9klP;L?Ic;j)tCdI=+tL^| zluJ&Iey^k}FOVm?^%C+Z+O!)3vqn2&IGr3S!SS8ym_AFCa3G*$fb)JO9ZtfNOA58h z3@4hy^#;mE_|Z?e{RZ9Y<4$1wjIo^5g^!%vCzHm)&(!uK&XSK^5_YO{D)#aQlYd%$ zm;_aH>r|3?p35M;Dpv{yRiQD`0tLpDPEQ4Bs2Td!WXnW$g0fdA4qRc@kN?-t88_~I z!;h-n6_rm^Z5{|PIEaJ>6AyIkw@%?U#Gi`(z9Wqf z0!B0!bo7(J9~omOc^d@&HZWfCy3Gi6#$Znlxldx>_4c-FU-={8vMy;%r_Wurj=o;| zpQicW=fUY-o8x$se}4<{w(qbOYZcdjuDur!2rjlGN325a^GpUI7BxOJE+8{~koq;@ zRQ#Q@tKv87G8||>Uk9|knl4`Rol=1?;s<8`fnpr}jw>6SJuX9|*W^Kgo95OTSw+QL z%XHPMRtREQ3wWq@0%fiE%+!99IKyn;2Kju}0k^hU^=zpkL9hi*=O!T_!cJvZToCI& zw0O6mQddPZ(_2FQ%)rwr+_%oUkBO&We~ZxA3Ti9#|@Tsdy74bked4LP`v9uKtS} z<*%put|eb0U~# zBIa&OJeGfHQobLLzU5Uvi-u^a4KZv$F+x(gpY0Fv;H7duhlpqs?zx13ON{pbl=DIH z0A2M*;im@RL8MR!6S+b5+nB6WoeY2P*gpzU{@$u!A?s~SI`<{{ehyI9VEIF102WNa zf+BYps7p`>3+ckO{@&vtea_pMyi}bsfA2?3&1`yr{0KbLywrA6(Bt z+bRQw9pIjBl3Q3VE0CQ=&%j z?|iqNqodHQISAt$wb)TYmJM_wqmJ#1zHzyzRM=A^7$uUL*r$zoGdHg~rnEf=*k=iT z_?$si^MgQOx0W*qAEeTrP~cR{8sk#1!2sA1b=yEAU;?^!c>$y-tz&4A&d(|wpnx;* zXVomg5m3RZ-J2bpF<#T`s2Lrt$!NT?A{(gj+5g^&iSXR^j~wy;leiyuQu`c84UkghQ3^_ zA`w%q@{Lk__9GtUxGs2kcF%q^i!>cRB=cc%J*P3D1TKoyxuKWitNKxjoiAsU#%=q< z$|+NK*s)ObA*mGen`5c}ScX`f@tCi!iC-(`tt`j(Z2I<1*BU`Oep%b64O(Q|M32Jx zsaiYNxSea_P9zY~O*&`=+i>`Afo?fHzl{YY z$?epBkPE@N@L+!+MTICvV@E5n^q4((cIA&Ae`x~2foS;wR(vmiDh9!#Zp=@mAvmtq zb1mUHW#FH~&gv+>|JP;XU-Eq&$=AmAkJ&rf+OR)#MdkTj8&u!i&G@ZFEPH8X>}= zLf+HX6DY!Sgb+sk=Y*8#>t2oZra?gJqr)|exYe>Y_rNCeo04MS_t0xN(8L)gTsU%YjrAq8V8R5%^5((a%X(CitZK>v^?dVq2L)vd&krJo+rA zUr4R5d?>~hR?SFek(7;MW$e5Wv55VB4g0&=bi2c+a?T`oD!Ae=tbE0)G@Fctt=HnC z#$6U2NAJSNQ+otfNw zP>Cd0qu-jfzi8yd1a>P8Pd@K0Rlq?ApG6cP`tATaikPvnwKhX)4Vt1axexOk=vpU# zP!JwJ+|j+dU|?gl_o!n0)6{Ee^Lq@uA?w$Sml|$13QpIy@VX+UswL<8b(@wVlMn@( zOv{IATqpreR9(!D8$H4zKS==e>H&~Fh(wZ( z(Gq``ZOl5y=%aV}cUROi=p+oW?DokzmM%KoJscfDGExJbtQV++P~}vxH)sg#z_N1O zZ}7)Yya;sdTwwD$QzmwYX0(m$)a5UFAcuGA^sAZy9fZtkrQjpWV$N594`2Z&DV;zK3XB_`Vt)!|y97$T{etGDBnFKu{v!8%x!kdwn>j zNppJY4#oCQbMMKOdo{IA*jVEnPzW4>Np;!)<2c)#Se34g7Drk2`kiajdE(M(%t`CM z`snJgyU?02mGiEH?{j8V^U-hqfMx62ZX?JZ1kWHd?WRi>sGj#1&#f`rwlmQ0F)bvB z&JxE)DuOoNhkx35x1!6G&_>=<>0d@(g9RBqaZa?6cd-4x8F`mq{m({T`zIx{M|^ir zo<`5J^c*tO)gCl)Xgr4X$}B*SJU&zRWOA;CM<4jKEZ$qrOqhKcW~!5dYht`UU$vah zJUpyYVGP`Shzts8f zEGd6-{S2^`Yy&aCAp#s9V`2ym!g(O=KXyw=$+LWt8Ec~2YiaV zd5y08$`Dab_>}o8$y{lxvsY#mgA5rmFOy<~I9=bI=H{%1&&OMx6?~>%nLX5+?97P`6!cmuSc0{*OscVd}PA^jScg7DJW}7PAvf8H zr5nh(iaP2xSpqUPLxGSJNP2If4TeEMgu(v_e+ReG&1iE$B?-28;n7f8Tw+GWm|m8| z{B)_T2e4IVK6GMDDCdT01Ek>8Hfp9Rwz`)fb{F5VUF5bM&xY~XaN!NOgMVqKIc-$L zQu>C*7#&@YCLG_YjFb+Hh%~($b5=RX)83DP>`E8mkyq>oV>PIpO(M7L(}Gp9I02q zsM_Y?coP7p4YX~l*;2$K9en|!=xU zkwCu-98I5X5+p%)0$5Dq-`xpjKA%8^@LY{ab@T0rmJ?n^5$9Vq3SF372Etc&K|#@u zas&wB0%i~heX}P%5NKyenJ*oU)@!9GX3hg6@kE8-Y2hpc&eqtebCG&3A2iz#r zh3RbPA8w^twbbPY^_*Va{*dn8PaJI#fGzCJvuh*-?>*91{Mk;~2pr1{EpB>ml zE4D8&0W*zK{a*Q{hn+4A_LCTN;(p+axGZq)Cl0zCenbNi5-#{>T$tnsN;In44{B_tZKQSq77zkD zSR1YH#+7uTN1BmW%N#ZOeup!CU6499$vM!2F&>W)#dQmJq;_qvqrLOfWs*PAA>W4P zJOZoq${#g<%Q*A1{9`(_QTeAdR#|KUtdV1&5KrX*Q13+o0uMTG;-MZ#F{nctCT_H! z5$KRowL4FlT=qa{NTY>#x#@$?qslT3G!#p&9trl>MIhfO3}!U!^ExEngxRxL-`Tg= zleSgMVs{H0?Zo+M`5wdB;a=^1QSd-Y*^ZliN)~Mlf zLhS3eqatxiVh4}RDg`>J`o3bPK$UU1G%G1<=J^D>xp~w}q?AVsNGt2bXa7JTN9stN zF6bj?B}Vze=U~T&(8P7XFylbrmm<rQN5i> zuP9V;H9?y;z$@2Ut=(!Pc>VC@Bz!f_T)upl;ZhDNqH9s6hWPa05pPEm?5uT5X*osiww6icSG6oX-EYb?uNIl7U=s zA+6mFQ{a7B0dOnBJTD*kR>AgjgGW^|cdwRRY@AN#OE~J`N1lq_OZi*`H32Icw`w?@ zboX0Vg8I*P1E(qX(uPp%-!K;5oz>~akf5<`5v?eEoB)lRB%lK#N!h)vYySv%!+V@@ z2xQVwlzDuCg;3wFY3`hR_70<7>8ws?!n0hJV-eiOI|$bf<5ui^Ym0b3ZqXBJ(WUvtSAQ|lAS90c0WGm8Zq z=oRsr1$~0geMrxv4>b~R11`v&TP}VjcaWpp@aWe=z0o3*Yk*OVcMOv$ zwPplgMgBeb1M&nroj88?1RggWi@T1rb$Y{F3i3|e%qo+8KB)*92rCOzxXf4yIll^f zExZi5FAlmoN8C)GSMxEU%D4SCGONZL&9x)x%&T??{wI-2LqU&%EGBHYRcX|YSd^Cw z&(xjrIl16sK=OY0gG@BD+ixaXiqs_c%Cu34A^_1Dt=mbV0xia>W!?Za3JQ+X2;6^I zM@OgELtpUfA0H+O$>C$wCGe$R?wA97(3Hmjt3)H{&I~~S2E+|NGuwc`y6z@`X0f#$ zWJM{TnB@RkI~J@!iOC!oH5jN{_Hb!M?=;I>V}s!$%bv!aSXLO_Rs0GQ2S=SW3iV~& zR98t%QAugqb2{kghdAp{HQ6M*rMc#y@yA2y)F&_Jewts{>9;g)En`?0tsyCwbWiwR zv@D2v)Q3CYt~-`{xHbck>^S?0?hFej6?G#we1qqO@=iNt_vfDF73Hm>@WBEB0;5xTOeXv5yG2?AAHG+1mXnGi0a2 z>eslJ$@9w-+f4Jg4gU+j1x|xYkO6Cn`9$fz)HVfL>|GW8ep19r_pn zMPG3RphiHi6M2ECNeKFc$L~xNtu4zb;ERP+cOiqB;uzK_rKliJEUFf|f zG4FR7eBCGYNJ1_@CbawBboU}Uv;Cs}cjimF*a!bFiQ1YeQTOh@ocUpwVwzBZQc(jw zYMqjy9UNlvB~e#Kpy&rV`ppJos3h=)`^@TJY#&8 zUev2GYiGCRk=vWPC90cuS)AlGoWIE&nD?d^J%*_4dpq~r*uiIR=U;GUnPYdt=_=qY zSk@p6xgEbeq-@Pz9I$svXp1qia!Z~e`h^j7ITNDI6Q=1^^CTU{lCwi->WiQFHAfw; z@kzgim%ipYuk$rFakCZDBQsR%Jxxa2G`HP>m-{@#&L2=#Er(Qo8eilyXjhPo%SDXK z`YIyJiW-}V>sGuP(N*h}Q)Z+#`#cNgRXTZRwwp=PErq!q&4|(y1>7du6p7*T4}na2 z3Xd`anY`2OzgFXOOJznwA4-S6T0A#?8PR7+e=j&i`^j3eKSCAkD9n8uMS|9^$SIgc zmdP{`5Fg?xW4%Ks(4Yvtn(D6QrwOmzmFXvi1X9ab70fK&gh2SEssJS-ffg@_Lx`Kz zhjq8EImFFZqDx27hVTumQ#x_XLQWSih0 zWlh5?xTBV@1WdnUkL$@t>H^AHSLn~`hAtNalJLzUKvIhGtZocAaPr##1>n&&lkcbk z5w#9fK@D9I5P;OOmP6N*qG?)C?1!M3yk0L^j6Q>|SB@k#0F(uTOOaZaPHL6#%_dRo z8oaiK`araiKz=9s0x+<$PlS1WFsVdN)O06+nRH7)Jv;i!Z#*k^17j8yQf`^cMok04Jhur-&7BbxuU3}ePfRyMn$Um z>q5)zJ0nv?>GM;sUoIKE<%Fc@TgQCD80}i{Ol!YSNpqR>KFdc>Q2dVu!$8*vhJgwKaN14yn?m4EA;Y36 z#O4;HG~kiFfdAfgmQH`pltTP%rL(P}*Oeg4&C=F@a>hN|LYx1v-hnQ|@YKh>z|~%e zbZaL>^O$cxTFOi6?s)%NSpR--rK*Y!su6~} z|GoNGsU`9HuZ8pP2WK_sQ^bs1qjK$?Y(`5SNz7}l{;va|U+%puH1O8z#_foU1(j#Y zCWom<4K$;z%~fYPq>Jn_POb+;xWzj8FuVNeUmUjptV2yDtd9Jg<2Kj%KRIr#_PFox z?&-|Jq^}D-%cf{ijOTdy%35xsIHl|Vu^jt34=e~ z{45SeBXLZ{=~-P{Ng^jsabGXsR(X2ThL}1o zSgbv=RX&bk)tc2^(yv{?td7KS2;awICykl0UZe?Rc>J&xAdJFO0EzKErAb#Lp=Q49pLSPT7 zgnbj(dpZxjzUQ7u-F@l(b&!W9#Z;Ii0S3RCHK_&xt17|g#IMd7|BFrRxPRd<{><71 z!8%)~lMm~Ev3-9(C>hBl0lG;Cw54$~r}CR6Ba4UBop4f;aJ_4rV$op>zT#Fbbha&Y z2bX!|r6cl-ky8)vNqQE*+|1QXAqB_Mg~(6v<>jx)sWlDueFwZr3lu1>F#i%)%uj>2 zyU*%c%G^Tm;XjZwWoD}zfC0dpPNCt%KEsU|Msr60nMTKIOgGTW(?2EC$iw{;(EEe> zRnAGCA;5c9Hx6{8EDoV{hth>WJaPuzgME6NDPRv;oy4F>3Bva#>PJxZV1v9xpa=gD zS^~rmY^443C#tA@R9wXSMesMb{P&~c#NaY8CgzHkfKU-o&mc zCC|XA>YtKU_olwCg{<>G->00fnZ2Mh%TcIWw}s#tbR6hJX&nN^Ks35heV|~Q^Xfob zpR@F&)(7ry*O04NKNPqy3d_uZ0-d)}RmH$)@ypKIF=U;ll8X#hj`RCLIXS+7o6usM zV_;ljOC6pAbW|gXz#TdhNh~aEl&foImY02MdD~0D-CDYd0Zvy_$Z`J{xESWcZ%ooe zn0t~wwe|w2$xg@}Ip>Lh^l|H$5b0fedQxgvKsWSoUM^xWP7Co!=+VtYJ$bnL3fsN( zTB;^5U#cDz#8%^6gE8$?zWWT^2 z!AApv9Q&GWo7h*ax)JwOE`8{lpShelXp7mrqSVG2oP$;6Wkl8KCYpddX|7RGaZ8^0 z^VjbD@&1?Ytp}#c&u2}?tMq)UrKr@OT?`DqpAyQjBC~7%B>GF`Fx-Z|QsL-wdGcWR zHw^Q(PzR}8^4fcXdGiw041(S8m4a2+h|mR|YH_=^NC%Wtxvr$b^5rD`!8MgTGmF*o zYkrTz$g{;qH)9ArRB9HDrNyFUD>U&e!Uy3ogfroZ`SvV+wK>7aVptK~^X*Dl5xvtQ zM&+k8*d16`n}eX=auT%4iO?c`TVt(ui7l^(#HJ~Ntah=$OgYv5=4OSc`75`8XZLWZ zs!|5cVH+`o_Vtz<(#ms+{Mxq|ZSkEF5}#STndC~VmRCvUk7_RI^r;Yg*g&-vKX1c* zLqH$Z=r^^_?-m0KzTeN?6dD_Mo1;41>ElN5y&bF-FffclX8_ES&PiTu9USZshIxa~ zmfw9Y?)A5Xr|`8P9yxNQ=|$h_`>fr?{K1}z)xm<QKZ;XT~2i+Py4Oiksj67R9W6g^Xk)@kvm`xmw{3f5@rLi__^-<0sIllJ|U1F`d z3Kwy{*x*J+R5E+v~9p0QlAmB{QmU*0v~X_C}? z%{f(f+iXc@wvrTwH&sN}I$&73Y_rVBhDEA)b0n(&+jeI*h4sw>Sy(v>bNdL)=Ac41 z`6UcCf51&8VuN¨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 OqM3+R=um0`Q2z_YX5Y5}