From 42101d808258444412ffa59d58f84a0836682f96 Mon Sep 17 00:00:00 2001 From: Dr-Irv Date: Thu, 12 Apr 2018 14:36:45 -0400 Subject: [PATCH 1/4] ENH: ExtensionArray support for objects --- .github/PULL_REQUEST_TEMPLATE.md | 24 - .travis.yml | 4 +- README.md | 49 +- asv_bench/benchmarks/frame_ctor.py | 18 +- asv_bench/benchmarks/timeseries.py | 3 +- ci/build_docs.sh | 1 + ci/environment-dev.yaml | 2 +- ci/lint.sh | 8 + ci/requirements-3.6_DOC.run | 2 +- ...SLOW.build => requirements-3.6_SLOW.build} | 4 +- ...2.7_SLOW.pip => requirements-3.6_SLOW.pip} | 0 ...2.7_SLOW.run => requirements-3.6_SLOW.run} | 4 +- ci/requirements-optional-conda.txt | 2 +- ci/requirements-optional-pip.txt | 2 +- ci/requirements_dev.txt | 4 +- doc/source/_static/print_df_new.png | Bin 0 -> 77202 bytes doc/source/_static/print_df_old.png | Bin 0 -> 89239 bytes doc/source/api.rst | 10 +- doc/source/comparison_with_r.rst | 2 +- doc/source/comparison_with_stata.rst | 680 +++ doc/source/computation.rst | 2 +- doc/source/conf.py | 34 +- doc/source/contributing.rst | 14 +- doc/source/contributing_docstring.rst | 79 + doc/source/cookbook.rst | 4 +- doc/source/extending.rst | 25 + doc/source/index.rst.template | 1 + doc/source/install.rst | 31 +- doc/source/io.rst | 241 +- doc/source/merging.rst | 4 +- doc/source/missing_data.rst | 60 +- doc/source/options.rst | 26 +- doc/source/release.rst | 2 +- doc/source/timeseries.rst | 12 +- doc/source/whatsnew/v0.10.0.txt | 2 +- doc/source/whatsnew/v0.16.1.txt | 2 +- doc/source/whatsnew/v0.17.1.txt | 2 +- doc/source/whatsnew/v0.20.0.txt | 4 +- doc/source/whatsnew/v0.23.0.txt | 224 +- doc/source/whatsnew/v0.6.1.txt | 4 +- doc/source/whatsnew/v0.7.3.txt | 6 +- .../ipython_console_highlighting.py | 28 - .../ipython_sphinxext/ipython_directive.py | 1170 ----- doc/sphinxext/numpydoc/__init__.py | 7 +- doc/sphinxext/numpydoc/comment_eater.py | 169 - doc/sphinxext/numpydoc/compiler_unparse.py | 865 ---- doc/sphinxext/numpydoc/docscrape.py | 245 +- doc/sphinxext/numpydoc/docscrape_sphinx.py | 266 +- doc/sphinxext/numpydoc/linkcode.py | 83 - doc/sphinxext/numpydoc/numpydoc.py | 190 +- doc/sphinxext/numpydoc/phantom_import.py | 167 - doc/sphinxext/numpydoc/plot_directive.py | 642 --- .../numpydoc/templates/numpydoc_docstring.rst | 16 + .../numpydoc/tests/test_docscrape.py | 547 +- doc/sphinxext/numpydoc/tests/test_linkcode.py | 5 - .../numpydoc/tests/test_phantom_import.py | 5 - .../numpydoc/tests/test_plot_directive.py | 5 - .../numpydoc/tests/test_traitsdoc.py | 5 - doc/sphinxext/numpydoc/traitsdoc.py | 142 - pandas/_libs/algos_rank_helper.pxi.in | 6 +- pandas/_libs/groupby_helper.pxi.in | 31 +- pandas/_libs/hashtable.pyx | 9 +- pandas/_libs/hashtable_class_helper.pxi.in | 50 +- pandas/_libs/intervaltree.pxi.in | 5 +- pandas/_libs/parsers.pyx | 7 +- pandas/_libs/src/util.pxd | 3 - pandas/_libs/tslibs/timestamps.pyx | 6 + pandas/_libs/tslibs/timezones.pyx | 38 + pandas/_libs/window.pyx | 46 +- pandas/_version.py | 5 +- pandas/compat/__init__.py | 12 +- pandas/conftest.py | 21 + pandas/core/accessor.py | 1 + pandas/core/algorithms.py | 169 +- pandas/core/api.py | 2 +- pandas/core/arrays/base.py | 157 +- pandas/core/arrays/categorical.py | 63 +- pandas/core/base.py | 53 +- pandas/core/config_init.py | 7 +- pandas/core/dtypes/cast.py | 3 +- pandas/core/dtypes/common.py | 2 +- pandas/core/dtypes/inference.py | 4 +- pandas/core/dtypes/missing.py | 150 +- pandas/core/frame.py | 301 +- pandas/core/generic.py | 228 +- pandas/core/groupby/__init__.py | 4 + pandas/core/{ => groupby}/groupby.py | 17 +- pandas/core/indexes/base.py | 3 +- pandas/core/indexes/datetimelike.py | 5 +- pandas/core/indexes/datetimes.py | 161 +- pandas/core/indexes/multi.py | 29 +- pandas/core/indexes/period.py | 4 +- pandas/core/indexing.py | 46 +- pandas/core/internals.py | 97 +- pandas/core/nanops.py | 1 - pandas/core/ops.py | 74 + pandas/core/panel.py | 7 +- pandas/core/resample.py | 8 +- pandas/core/reshape/pivot.py | 2 +- pandas/core/series.py | 197 +- pandas/core/strings.py | 160 +- pandas/core/window.py | 54 +- pandas/io/clipboard/clipboards.py | 4 +- pandas/io/common.py | 2 +- pandas/io/excel.py | 10 +- pandas/io/formats/format.py | 3 +- pandas/io/formats/printing.py | 7 +- pandas/io/formats/terminal.py | 24 +- pandas/io/gbq.py | 73 +- pandas/io/parsers.py | 33 +- pandas/io/pytables.py | 18 +- pandas/io/sas/sas7bdat.py | 20 +- pandas/io/sas/sas_constants.py | 80 +- pandas/plotting/_core.py | 189 +- pandas/tests/dtypes/test_cast.py | 25 +- pandas/tests/dtypes/test_common.py | 4 +- pandas/tests/dtypes/test_missing.py | 41 +- pandas/tests/extension/base/__init__.py | 2 + pandas/tests/extension/base/casting.py | 5 + pandas/tests/extension/base/constructors.py | 9 +- pandas/tests/extension/base/getitem.py | 52 +- pandas/tests/extension/base/groupby.py | 81 + pandas/tests/extension/base/methods.py | 42 +- pandas/tests/extension/base/missing.py | 50 +- pandas/tests/extension/base/reshaping.py | 47 +- pandas/tests/extension/base/setitem.py | 167 + .../extension/category/test_categorical.py | 26 + pandas/tests/extension/conftest.py | 11 + pandas/tests/extension/decimal/array.py | 15 +- .../tests/extension/decimal/test_decimal.py | 70 +- pandas/tests/extension/json/array.py | 24 +- pandas/tests/extension/json/test_json.py | 63 +- .../tests/extension/relobject}/__init__.py | 0 pandas/tests/extension/relobject/array.py | 211 + .../extension/relobject/test_relobject.py | 268 + pandas/tests/frame/test_alter_axes.py | 39 +- pandas/tests/frame/test_analytics.py | 79 +- pandas/tests/frame/test_api.py | 14 +- pandas/tests/frame/test_constructors.py | 50 +- pandas/tests/frame/test_convert_to.py | 21 +- pandas/tests/frame/test_dtypes.py | 15 +- pandas/tests/frame/test_repr_info.py | 4 +- pandas/tests/frame/test_reshape.py | 8 +- pandas/tests/frame/test_timeseries.py | 9 + .../tests/groupby/aggregate/test_aggregate.py | 73 +- pandas/tests/groupby/aggregate/test_cython.py | 2 +- pandas/tests/groupby/aggregate/test_other.py | 2 +- pandas/tests/groupby/common.py | 62 - pandas/tests/groupby/conftest.py | 77 + pandas/tests/groupby/test_apply.py | 517 ++ pandas/tests/groupby/test_bin_groupby.py | 2 +- pandas/tests/groupby/test_categorical.py | 1415 ++--- pandas/tests/groupby/test_filters.py | 1180 ++--- pandas/tests/groupby/test_function.py | 1120 ++++ pandas/tests/groupby/test_functional.py | 372 -- pandas/tests/groupby/test_groupby.py | 4557 ++++++----------- pandas/tests/groupby/test_grouping.py | 115 +- pandas/tests/groupby/test_nth.py | 618 +-- pandas/tests/groupby/test_rank.py | 254 + pandas/tests/groupby/test_timegrouper.py | 25 +- pandas/tests/groupby/test_transform.py | 1454 +++--- .../indexes/datetimes/test_arithmetic.py | 31 +- .../indexes/datetimes/test_construction.py | 39 +- .../indexes/datetimes/test_date_range.py | 38 +- .../tests/indexes/datetimes/test_datetime.py | 4 +- .../tests/indexes/datetimes/test_indexing.py | 8 +- pandas/tests/indexes/datetimes/test_ops.py | 270 +- .../indexes/datetimes/test_partial_slicing.py | 21 + pandas/tests/indexes/datetimes/test_setops.py | 2 +- .../tests/indexes/datetimes/test_timezones.py | 20 +- pandas/tests/indexes/datetimes/test_tools.py | 4 - .../indexes/interval/test_interval_tree.py | 64 +- pandas/tests/indexes/period/test_formats.py | 6 +- pandas/tests/indexes/test_base.py | 43 +- pandas/tests/indexes/test_multi.py | 29 +- pandas/tests/indexing/test_iloc.py | 16 + pandas/tests/indexing/test_loc.py | 16 + pandas/tests/indexing/test_panel.py | 2 +- pandas/tests/io/formats/test_format.py | 74 +- pandas/tests/io/formats/test_printing.py | 16 - pandas/tests/io/json/test_ujson.py | 18 +- pandas/tests/io/parser/common.py | 4 +- pandas/tests/io/parser/test_network.py | 1 + pandas/tests/io/parser/usecols.py | 58 +- pandas/tests/io/test_excel.py | 12 +- pandas/tests/io/test_html.py | 2 +- pandas/tests/io/test_packers.py | 6 - pandas/tests/io/test_parquet.py | 2 + pandas/tests/io/test_pickle.py | 22 +- pandas/tests/io/test_pytables.py | 26 +- pandas/tests/io/test_stata.py | 4 - pandas/tests/plotting/test_misc.py | 9 + pandas/tests/reshape/test_concat.py | 226 +- pandas/tests/reshape/test_pivot.py | 9 +- .../tests/scalar/timedelta/test_timedelta.py | 2 +- .../scalar/timestamp/test_comparisons.py | 9 +- .../tests/scalar/timestamp/test_timestamp.py | 11 +- .../tests/scalar/timestamp/test_timezones.py | 11 +- .../tests/scalar/timestamp/test_unary_ops.py | 21 +- pandas/tests/series/test_analytics.py | 66 +- pandas/tests/series/test_apply.py | 11 + pandas/tests/series/test_constructors.py | 5 + pandas/tests/series/test_dtypes.py | 6 +- pandas/tests/series/test_rank.py | 60 +- pandas/tests/series/test_timeseries.py | 9 + pandas/tests/sparse/frame/test_frame.py | 2 +- pandas/tests/test_algos.py | 30 + pandas/tests/test_errors.py | 2 +- pandas/tests/test_register_accessor.py | 4 +- pandas/tests/test_resample.py | 18 +- pandas/tests/test_window.py | 651 ++- pandas/tests/tseries/offsets/test_offsets.py | 15 +- pandas/tests/util/test_testing.py | 64 + pandas/tests/util/test_util.py | 7 +- pandas/tseries/offsets.py | 3 - pandas/util/_decorators.py | 19 +- pandas/util/_test_decorators.py | 27 + pandas/util/testing.py | 13 +- pyproject.toml | 9 - scripts/validate_docstrings.py | 5 +- setup.py | 1 + versioneer.py | 2 +- 222 files changed, 12958 insertions(+), 11390 deletions(-) rename ci/{requirements-2.7_SLOW.build => requirements-3.6_SLOW.build} (53%) rename ci/{requirements-2.7_SLOW.pip => requirements-3.6_SLOW.pip} (100%) rename ci/{requirements-2.7_SLOW.run => requirements-3.6_SLOW.run} (83%) create mode 100644 doc/source/_static/print_df_new.png create mode 100644 doc/source/_static/print_df_old.png create mode 100644 doc/source/comparison_with_stata.rst delete mode 100644 doc/sphinxext/ipython_sphinxext/ipython_console_highlighting.py delete mode 100644 doc/sphinxext/ipython_sphinxext/ipython_directive.py mode change 100755 => 100644 doc/sphinxext/numpydoc/__init__.py delete mode 100755 doc/sphinxext/numpydoc/comment_eater.py delete mode 100755 doc/sphinxext/numpydoc/compiler_unparse.py mode change 100755 => 100644 doc/sphinxext/numpydoc/docscrape.py mode change 100755 => 100644 doc/sphinxext/numpydoc/docscrape_sphinx.py delete mode 100644 doc/sphinxext/numpydoc/linkcode.py mode change 100755 => 100644 doc/sphinxext/numpydoc/numpydoc.py delete mode 100755 doc/sphinxext/numpydoc/phantom_import.py delete mode 100755 doc/sphinxext/numpydoc/plot_directive.py create mode 100644 doc/sphinxext/numpydoc/templates/numpydoc_docstring.rst mode change 100755 => 100644 doc/sphinxext/numpydoc/tests/test_docscrape.py delete mode 100644 doc/sphinxext/numpydoc/tests/test_linkcode.py delete mode 100644 doc/sphinxext/numpydoc/tests/test_phantom_import.py delete mode 100644 doc/sphinxext/numpydoc/tests/test_plot_directive.py delete mode 100644 doc/sphinxext/numpydoc/tests/test_traitsdoc.py delete mode 100755 doc/sphinxext/numpydoc/traitsdoc.py create mode 100644 pandas/core/groupby/__init__.py rename pandas/core/{ => groupby}/groupby.py (99%) create mode 100644 pandas/tests/extension/base/groupby.py create mode 100644 pandas/tests/extension/base/setitem.py rename {doc/sphinxext/ipython_sphinxext => pandas/tests/extension/relobject}/__init__.py (100%) create mode 100644 pandas/tests/extension/relobject/array.py create mode 100644 pandas/tests/extension/relobject/test_relobject.py delete mode 100644 pandas/tests/groupby/common.py create mode 100644 pandas/tests/groupby/conftest.py create mode 100644 pandas/tests/groupby/test_apply.py create mode 100644 pandas/tests/groupby/test_function.py delete mode 100644 pandas/tests/groupby/test_functional.py create mode 100644 pandas/tests/groupby/test_rank.py delete mode 100644 pyproject.toml diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index c1e02bd8eafc4..4e1e9ce017408 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,27 +1,3 @@ -Checklist for the pandas documentation sprint (ignore this if you are doing -an unrelated PR): - -- [ ] PR title is "DOC: update the docstring" -- [ ] The validation script passes: `scripts/validate_docstrings.py ` -- [ ] The PEP8 style check passes: `git diff upstream/master -u -- "*.py" | flake8 --diff` -- [ ] The html version looks good: `python doc/make.py --single ` -- [ ] It has been proofread on language by another sprint participant - -Please include the output of the validation script below between the "```" ticks: - -``` -# paste output of "scripts/validate_docstrings.py " here -# between the "```" (remove this comment, but keep the "```") - -``` - -If the validation script still gives errors, but you think there is a good reason -to deviate in this case (and there are certainly such cases), please state this -explicitly. - - -Checklist for other PRs (remove this part if you are doing a PR for the pandas documentation sprint): - - [ ] closes #xxxx - [ ] tests added / passed - [ ] passes `git diff upstream/master -u -- "*.py" | flake8 --diff` diff --git a/.travis.yml b/.travis.yml index 22ef6c819c6d4..e4dab4eb53afb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -56,7 +56,7 @@ matrix: # In allow_failures - dist: trusty env: - - JOB="2.7_SLOW" SLOW=true + - JOB="3.6_SLOW" SLOW=true # In allow_failures - dist: trusty env: @@ -72,7 +72,7 @@ matrix: allow_failures: - dist: trusty env: - - JOB="2.7_SLOW" SLOW=true + - JOB="3.6_SLOW" SLOW=true - dist: trusty env: - JOB="3.6_NUMPY_DEV" TEST_ARGS="--skip-slow --skip-network" PANDAS_TESTING_MODE="deprecate" diff --git a/README.md b/README.md index 86cf95508a5d9..78e9b93ae535f 100644 --- a/README.md +++ b/README.md @@ -9,18 +9,33 @@ - + - + - + + - + @@ -48,18 +63,14 @@ - - - - - - + - - + +
Latest Releaselatest release + + latest release + +
latest release + + latest release + +
Package Statusstatus + + status
Licenselicense + + license + +
Build Status
Coveragecoverage
Conda - - conda default downloads +   + + coverage
Conda-forgeDownloads conda-forge downloads @@ -67,16 +78,16 @@
PyPI - - pypi downloads - - Gitter + + +
-[![https://gitter.im/pydata/pandas](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/pydata/pandas?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + ## What is it diff --git a/asv_bench/benchmarks/frame_ctor.py b/asv_bench/benchmarks/frame_ctor.py index 21b20cb123ed6..9def910df0bab 100644 --- a/asv_bench/benchmarks/frame_ctor.py +++ b/asv_bench/benchmarks/frame_ctor.py @@ -16,11 +16,11 @@ class FromDicts(object): def setup(self): N, K = 5000, 50 - index = tm.makeStringIndex(N) - columns = tm.makeStringIndex(K) - frame = DataFrame(np.random.randn(N, K), index=index, columns=columns) + self.index = tm.makeStringIndex(N) + self.columns = tm.makeStringIndex(K) + frame = DataFrame(np.random.randn(N, K), index=self.index, + columns=self.columns) self.data = frame.to_dict() - self.some_dict = list(self.data.values())[0] self.dict_list = frame.to_dict(orient='records') self.data2 = {i: {j: float(j) for j in range(100)} for i in range(2000)} @@ -31,8 +31,14 @@ def time_list_of_dict(self): def time_nested_dict(self): DataFrame(self.data) - def time_dict(self): - Series(self.some_dict) + def time_nested_dict_index(self): + DataFrame(self.data, index=self.index) + + def time_nested_dict_columns(self): + DataFrame(self.data, columns=self.columns) + + def time_nested_dict_index_columns(self): + DataFrame(self.data, index=self.index, columns=self.columns) def time_nested_dict_int64(self): # nested dict, integer indexes, regression described in #621 diff --git a/asv_bench/benchmarks/timeseries.py b/asv_bench/benchmarks/timeseries.py index e1a6bc7a68e9d..eada401d2930b 100644 --- a/asv_bench/benchmarks/timeseries.py +++ b/asv_bench/benchmarks/timeseries.py @@ -75,8 +75,7 @@ def setup(self): freq='S')) def time_infer_dst(self): - with warnings.catch_warnings(record=True): - self.index.tz_localize('US/Eastern', infer_dst=True) + self.index.tz_localize('US/Eastern', ambiguous='infer') class ResetIndex(object): diff --git a/ci/build_docs.sh b/ci/build_docs.sh index 5de9e158bcdb6..90a666dc34ed7 100755 --- a/ci/build_docs.sh +++ b/ci/build_docs.sh @@ -24,6 +24,7 @@ if [ "$DOC" ]; then source activate pandas mv "$TRAVIS_BUILD_DIR"/doc /tmp + mv "$TRAVIS_BUILD_DIR/LICENSE" /tmp # included in the docs. cd /tmp/doc echo ############################### diff --git a/ci/environment-dev.yaml b/ci/environment-dev.yaml index 1337fc54e9aac..f9f9208519d61 100644 --- a/ci/environment-dev.yaml +++ b/ci/environment-dev.yaml @@ -11,5 +11,5 @@ dependencies: - python-dateutil>=2.5.0 - python=3 - pytz - - setuptools>=3.3 + - setuptools>=24.2.0 - sphinx diff --git a/ci/lint.sh b/ci/lint.sh index 545ac9c90c5c1..2cbf6f7ae52a9 100755 --- a/ci/lint.sh +++ b/ci/lint.sh @@ -165,6 +165,14 @@ if [ "$LINT" ]; then RET=1 fi echo "Check for deprecated messages without sphinx directive DONE" + + echo "Check for old-style classes" + grep -R --include="*.py" -E "class\s\S*[^)]:" pandas scripts + + if [ $? = "0" ]; then + RET=1 + fi + echo "Check for old-style classes DONE" else echo "NOT Linting" diff --git a/ci/requirements-3.6_DOC.run b/ci/requirements-3.6_DOC.run index fa9cab32c0ac2..084f38ce17eb2 100644 --- a/ci/requirements-3.6_DOC.run +++ b/ci/requirements-3.6_DOC.run @@ -5,7 +5,7 @@ sphinx nbconvert nbformat notebook -matplotlib=2.1* +matplotlib seaborn scipy lxml diff --git a/ci/requirements-2.7_SLOW.build b/ci/requirements-3.6_SLOW.build similarity index 53% rename from ci/requirements-2.7_SLOW.build rename to ci/requirements-3.6_SLOW.build index a665ab9edd585..bdcfe28105866 100644 --- a/ci/requirements-2.7_SLOW.build +++ b/ci/requirements-3.6_SLOW.build @@ -1,5 +1,5 @@ -python=2.7* +python=3.6* python-dateutil pytz -numpy=1.10* +numpy cython diff --git a/ci/requirements-2.7_SLOW.pip b/ci/requirements-3.6_SLOW.pip similarity index 100% rename from ci/requirements-2.7_SLOW.pip rename to ci/requirements-3.6_SLOW.pip diff --git a/ci/requirements-2.7_SLOW.run b/ci/requirements-3.6_SLOW.run similarity index 83% rename from ci/requirements-2.7_SLOW.run rename to ci/requirements-3.6_SLOW.run index db95a6ccb2314..ab5253ad99e51 100644 --- a/ci/requirements-2.7_SLOW.run +++ b/ci/requirements-3.6_SLOW.run @@ -1,7 +1,7 @@ python-dateutil pytz -numpy=1.10* -matplotlib=1.4.3 +numpy +matplotlib scipy patsy xlwt diff --git a/ci/requirements-optional-conda.txt b/ci/requirements-optional-conda.txt index 65357ce2018d2..e8cfcdf80f2e8 100644 --- a/ci/requirements-optional-conda.txt +++ b/ci/requirements-optional-conda.txt @@ -4,7 +4,7 @@ bottleneck fastparquet feather-format html5lib -ipython +ipython>=5.6.0 ipykernel jinja2 lxml diff --git a/ci/requirements-optional-pip.txt b/ci/requirements-optional-pip.txt index 43c7d47892095..877c52fa0b4fd 100644 --- a/ci/requirements-optional-pip.txt +++ b/ci/requirements-optional-pip.txt @@ -6,7 +6,7 @@ bottleneck fastparquet feather-format html5lib -ipython +ipython>=5.6.0 ipykernel jinja2 lxml diff --git a/ci/requirements_dev.txt b/ci/requirements_dev.txt index fcbe0da5de305..3430e778a4573 100644 --- a/ci/requirements_dev.txt +++ b/ci/requirements_dev.txt @@ -7,5 +7,5 @@ moto pytest>=3.1 python-dateutil>=2.5.0 pytz -setuptools>=3.3 -sphinx \ No newline at end of file +setuptools>=24.2.0 +sphinx diff --git a/doc/source/_static/print_df_new.png b/doc/source/_static/print_df_new.png new file mode 100644 index 0000000000000000000000000000000000000000..767d7d3f0ef06a3e3e9c3840d7bc0425685aceb3 GIT binary patch literal 77202 zcmce+WmsIx(y)yaAV`8kkl^m_f#5I@+zA$32X}XOcM0z965JgIcX!v1?0w#|ch2+w zn`?f|tkqW4)m7DZcaSVV6cHW=9t;c&QC#e+92gj+Fc=tw<2#tQCq-ytHeg`z^~OR% zvf@HQgt9i4Ka9-`z`(?U;^JXdP!}-zPNkfE1oq?vExpmaz$Q)iCch{MLXgCwph5)y z45TSrQXlT3lCQX&MnU{B8sAfLIg*& z#4|Eby~H~LS51?Ygo=OQbp{J|rjH?+_#Vv3nbsMD8#_oSpV+K(_w4SSO!?vPP8G+y zQvpXEXXjp)`p;&uXEN5&uNcf_JCXcg5K(yrCt$;gIqzPdse6|r1QVO3FMFEd^}d!T*FB3vAsN_Y z#Fs&mRbQh;7eSepF@Sg*H`|{)_W2tc?MPV6-ahH|C2=kgD(Pf0(Yq${UTxAf*ZrGP z;?=U0e)Who{1Cl9A0V(sWDTxG0L*6M3seP!eaA-?NNtqFqy{cv6IR6gPMpv5Nh#tE zLI7E!v;o5u`doEYl|^s{H+(~n+s8-d-S=``V~+ID#|i~f35;#c+m;Y& zfe_OS$}bb^2+T!*^Cwh5=Qk^eR0!!zL=7nA4#aVU6K_!g2>%XK2Ke4i5~wd6fe;gf ziedkn2 z&vFV>doZiTG@O%Q;)9&(0wM@QqO-K|IA zNt6{UyGX%|2D$A8FY+rpT2^q{S>ZzwnxbEkXl-_rZ2h;7)9(&YaYFL5_Klcph!-*O zynf^;XU*l*XAez?PK50NuFS8%oY9^Ug*t!gNiiZ}k&)rVgbwtg=}IupBvvO5B{nC1 z9_GLZQS8FeJ+5e*$1;Prr?scP0jmQCg&%h#>GoN1q*9Hd?fN40R$3)B2rlt0Sua5^ z(JrB!5U2ajb*Znno>w~Z@eybT^ZWBhwEKB@Wsu0iJwU+o_x*8)!f)~weOc^9PNE{ahh%SqU5zFYm&_}I;pk|TQu9=+mqXMgLpB`WVdqo1_h0kMu(Pc&Dykgz(GY*kn_(6wd?MKMt>!l0xW0`8we`Y3q8#!BHU-R5?^R+`TG#{?(&?4{js5gsvdsmj-ecV!>$zjz4qyprTJh+lM^SSVWu8lob z;v3P#k}zqusVabgRFYBKUB_L5G*Y@nI+_Hk1jDkXvQKj+bC?#r7L*o!%PS4)4G7C) zO)`!gjwP2yw_lwe95I}390y#49phYhuV>EzH)WUj*Olk0hf^mZ=hwH(`=GJu?^Q{) z!{7M1+wI)bUi4oXUTt0t!O6h8JZA+s#_6q;*ER{C3EgGo8Q%SXIfZxssEbuawUv-J zpZ8gkI-U=?_WcOrF?^0+>3ePrHvAL(Hr}UizTbQ~vWex`nCPn5Y={P#i%29swo*82 zUWH-RVrfYMY3SIP>bUI9lIE&-hx|9pHsCi;XxTN|obPMVO{gc8Qq?J&qiZj0dC2&v zUR0hil^BYHS>rpT<}(-uZ@!-zwC^<7*aQ7h(>_Xm)F$C1jU#E5vX@wi;~BPFkGBzZ z#BZ@#0imtN4#oyeuT3XU7uNi&@wat#c6CP3PR|%T9UdQ6Nt+;NKu3coDgLB%tjbDt zg{c%mIAQY*m=7^|XB!gMvl;|jm0C?z#rH$>M}`({eR6w~OV~g%t*O?Qj&g`{@7=RT3TcE zF?-N4tiyMQGlwP6e$}N>kcK#5V6Ch}Gpu>PImF&$zS?H2cJfzVoJ)|)FBeh+aD$P@ ztDEEb+q_hD_xi5ZY@POp7urX1BrBvPu07|9Ho2UthKtLH7J^fP3(jd316f69EEkT$ zvrFPA(I$7@Ck6FVB~6XzT7PX~P8{c&>e;foo5Y98V>_#~28%n#rSlckbn@iGkppB_ z3RbiXDDq$A+RvX}FI(kb3b+8wfVqqb{_0nnW3z9>(+&C7H9;T}<8b2>({s~(BRezR z$B=t^R`W%3^j)+ubAA~fZ7cT!!BM|T`!A3EzqUer@Tj@*HG|u13xLLkV+OB7%H@vQ zjnmt+cI!n`Gj*m&b82PGW$eoptrPR+Q*JlPDcWN<^EWIjHO&i4rmLXE`rOke+5~k> zOP7^4n*gWX-sQ|@w_Bo<<v!I*YgTk}%jAd^- ztC$(-E({NBQ-&X}3rjz~>vQwoExi!*80DCxwo&U(H{pVQa#8r# z$Va_b+#Ghp7u)A*7ZzvRz0$Me>E_Z?#nm}im8UE{8vUbv$A`PEuM?s(5u*Hze0FZ( z4^O&Gj|eA{3(A}2rK?Zvyy+4d$sa3xOOlkp{N8g=!g)Hdg30QFWnL3KcU3L8JBf^& zMeqx)@t>Q?@Di(onP`9qejVpW_Ut|e+arz-oJZ*)ID!9eYPx?H@KtKG;tYK#Xv;ckeP~+_}qpeR2t28=2 ztPBPQo@T6|Vyhx8#ieIyPN$=9scS&zXm0hE;(~$kIC8!HG&iu-A#^l1vjB2A@)G@3 zg6r+~@5l5+gnt#WHRUBzk(MPCva~TEWTj)FV<6&#CnO}~vC;p*CHGb2Kh@v<@e&!? z+FEhZ(>pjg&^a*ES=t!VGjeir(lap8GcnP=m7oPWS=j10(pmtC|8C^}we!^gsApqr zWov9{LHN5}9bHR1TV5if-yQw;^Y=In9F70!$pZKvvEBrv|NVxZk&c1>ziq!&<@x=T zOV-%Yz)a<W&qZDJhF8HBbLH$3IuU^TXMy8;&N>xqH_At>v)S z!ottc$cV;t=UR!n^ndCl9L5Xg10mk2SI;@a%cf4K=q9Gv!@tJvi4vIBagO5p30cpU z#Jz=XKBBiFLL?)cT-x^!5d;ZEAVi5}IdR;21G^WF9M$#+f-3QY_)^Dw#r*!5m5wM< zD-!Pn;tA2TLOkRz0&ZcIZBMiJxq*;>&Y4y0yJ=+R=D*fO-BW^6FcG-EYMgl}(W{(+%OQ{Iy)-lVX1so%RyQhKSM|k->}fWs_DI zM>(jysr?#SK*x75SyxxhhvPPDUor{!cco1CcO+D6frhqr`_**jGgzqWLia`T?liRh zhg|WCHRaN{c#fK&!?s+SKUI4mm|6Bk#C&lsKa8)hscz0~rpc9t=HQUa-*K@|Z%B5t zw){G%f|W<@dC~u~;=hIWawfE@f$(yC4C~{=S0~T4Ge6y8{;@Ejs+2aj}|q#|I4c zKlA-G&!gaq+4&%=rMZE=h zz6i5`nhu=WCR{lf3#D<%`5A}8ue#dmo`p>@#kJMbys-*ft0pcTkFWnv^-7dLcB{Z& ze9_Y8c037U=ENhlb;m^aw$pe6(5~hW!Lwx1e5rJ)so=tszp@>CKcR?R;uV(e{jsuf z$i14NU?vttCIhDYVlEegazlhqZT)lZZB0)S19X*$#?~ZPw0#L}=!2H@NU$qs-E5EBlYwipp&803}QooBG9% za@#7$v8`MGYVXZS5`OYh@$t5@2V96THPfl3^_kbhk;?;ZtCYE1@FPlF&3l~P=oUB6 z@djqa4HJZmssVW73Ohmz#To%<#i1aMg@ZN)P9<&w`o=$9t}K);B23o;=K%45iZVJ! zLrJ*RX60kmTw_`cO)5XB!yxg!bybA8l6J_op6&a__P3Ll8r@i z{oGJ4lYB{)*o_1xrNaSvbnE}jIFi>Q-4$^ya8fv?GCe|q%hgt4{2M+6FjC)=z%or^ z`mB=)V6PoNeQ(H9H;QjI`JfWox5=DZ8nZ+fqM*!$6gX)E1g1Qldc3AAW;=ysS=2X^ z4ye$H|9jQH1re`gsG=wL*S2Ta8xQ+~!h#ifSy@>zvQM9^zxRkEOI%fH?kXUYhmaVi z@h&{p9&Q#DuYE2P`4*~ojXgRlZjrEmZDjxqpdcqFcNjTft)7~kgt>QfzoUL;DEc_a z0FU$y0sIe}*$nWc9)NbJ!aYG_Z_zrfZ*{(HIvCFqf@XnS;g$3HAS0%&5I_w&ZWtA> zuP2!uv$9$CAF5nj0CCPB}VJ}4J=gJ*BkStQ(khHhB`}0 z{@vN{o^?qhcf`Bby8~8_W?MnW)A_zgZMESs@Dd6Z;>FudVKJlP1fzg~G_KmjOgMi~D{Vdo|1dO@&8?9nWdg<1M0=^NR4eNz{8AW>j*A|Iz%rtdnrboJ?*9L<*~>+b|bZTB#}7wA71TcX?u zDa)xfo*zH&*G#RMjLr!j6&9J%SKLy6e|7jtrD4e?Wip9pWDP%lAVrc_AH0mMdP2P# zA`IKsRpotJQQ3o|JvUs273l&$YT{0&mj7#)zHIc@Us2o27Y?hC!HA>zr(e^BSZ@i(_#WJ+#YTM7I&?x( zzgNWR7=nQ$yzzEJ*h_6u&6vO{o!HH=*IVEdY{I6cj8+g!!UHNnhC{mpGJea6y~fSf zs+Ds={y8g#>E9;$?xWSj>iVcA*QFqk0PiWY4c@40dug_8%0Oc$*Q`Wsq$wt>s&?02 z+up6mIom#%$X;+zg`0;?AjmGwEp^ z${3iO@(-9QCg$~pYTV`lvik>IuN_)5B*9`4Y)$HvA35fOT)8Yma8CT9a!s%cN%)TN zb2{t`SZ^5*HSYz|^vi`?Vyzq7Y@Vga6xm2=C3NrZK)+`|Z$p_?wJ}g~QjP0x8@fBn&J9xZHt3~Bl58+jS~uU_r^2jm1OP$W3Q-4 z0&N^5;&!$3&FRpHWFz~p7QT{wR|(l%d*J#$LM<1+08|o8>H9;mIC7E%1?8N72i#%jeUV1)(ASeTMGmpLJr=4^a>Ig27Un3c@m;D0+47Kr75l|c6WwVIpmg0ueAoy3<7yU$*- zHSLwj%^bl4SR4;z@3%0nU}c`+!n(bT2lb{R96=$ie@72rly_z2Lb19b=9A)lTpvJN{Oc4&dKE}Z>Y_wGn-WE9qD zF+EHP#=uCkVlIsz`&~~O_Iup9tm5@_)bN2<`&L%5J#)CwBChIqAgx)hs&jD1N$vB!TXmJ{(-LYov!+2T#>dU?> zC*`u^`ebks!tv_cDHt}t#i8e z8h{&M-|Lb7h{smTi95hQ-0fYvRK<<&e8avs!v-?z+jNZXtsE&aSl?~G#~a19@@7>6 zF7e#-zhWdxZwLIX+pk0@8rr5JE&T>gG>x+~^Zo`!t&^Zb0NWs&j+3TCa5kbZxq*y* zl9mG%wQBB?cpsB;jSOQLZOWPnXpt+6{6qEf+W1%hTr24iT_ek7@I07o&Lh$xug z%lilmucWuA9c;b(jGUu)IeXSHD7BE00q8o-aEJMI$ls?Y!{?cVw#IWY&D>FD;OLqD zjBPtAkP0G2^>Z1jsQ$V1l%iDU!Oy47(fvOA#nlvM#qC9h$MI20%42g^j20B+;_*oG zpb6x5XD%VHqkVlB!OI5iaJw)H%OZsn}TL zJk1XQuC18j$w_8NDXM&aj(FM<01QZhgE<2#1gsRnJVty4S(Iv#c`)dURIaqi?Ps)U ztU))sOCi7aMn+~(M_(q8Gg`cAkcb(b=Lf_JJm&m0tnv6fpM&i^n`(!=+JDK~J{^A2xO?QbmV4Y`SWF8*2=hp0D=KGsU{4rY z(Iwyte_<6#`_U@3lN^M4zMfXTAy7zwx9^AS@i^B$%ty74oqh5QljFw-3qnH6(o=^E zmSVUN`YmlF7R1hCvPPkXlj4`iB4C+*luezUwn=Acf~sf0{Ls$UKp8MVc#k zsA}%h0zvz6Abe96*OZ{T>Ku`N%WO!H2)4GCGk%@ZWhcGjyC(RhCS7l4LpX)lI3M$z z`%SjLH~Qxv*V<_h&Xk?bH-p_Mmids`pKY}Qi&W7>1$zGhhUeW?x2^Nj=ouU_x{IXXn(nucTmHaGzy9x+NwdZxg=LOY&d?mt)5N@GClVNwp}Z= z+MDbiPq-)9yWTK$nQ8bS1f-&;EGEq{gB8lEq0|GOubL+kHu9}d!lZc=QgpuzEuXOO zi!9YMKID^A{l_!_gcTPobDIwbvxRx^-YNxyCeX#8YJz61fq4LZu|0q(uh>pY`%9FY z0FPtA7Kt*`=yjEeWkNu4HBZo~Xhdx2(hml@7A)?aS6Etm3+C0YhOZa1&&S+Z(Pr~( z4brHi#%jR3MeT4r?iJyX3)VM@kF-~sR`=kv1BP@W-{yTpE?G~Zc!-hyRkMV073E>O z)OP68Da!SgUH8w~gtz4~!oE}?Ob7M0XAb<@AwV^$W~lngHL*IgR3>yD&@5?n8iTxX zEzq5@bb|sop7*u*OeZW~C7!=VdB+}PA0w!LwT?Q6IJn>+u_Z9NDnDJKM`oXRO|n%Z zh7eoYzAH|7RTH(&2&&=Qe;>-ZjmqOZM?d`SivN)%+LGmQC+$9xk62pP_V1kmN*I_& zOud=|a8w+cMTxei3}fA_7*tp_SzI>=m{G(BlwH9M%=qfsVT82CgwX-1sFUQ&hK>x% zihXu72VEy8_l#<7?g#Tq0^>DckqP&k4Xy^~X29GmqmsC`v#K2EO#^;nLo=L{oVqt4 zw0S*_OEf84+ooK~*&8cGIxd4j1`My&~`hJ0xs@X~m;cx3V7OTYP9k zSKK6TF<0DVQ9N{&xum)QV7Xk@~da%8hjO2@C!)y!E*={Bdn+(H(Nx4#7l-w2NP3(}6Ck zGjSdUsI)R0rwx%Lzm4&qHhcxr-f^@VeNGi}n-kUUD^4S_C>U%iT_&gx%dH2^HKq4w zie*%|2{ZxXjydbUF)7*?Rny#T27cdKm-rt}iWu+d_KbJH(6Tz@;k#VM>dtmxw^ zavR$I_}s$zN_ZXwVLH;IoL%d1lNcpFNX*@2Z{C`RGP+f>U`~-!uI#X(1PMQb>adZE zvMF?kX1CjwlwDIGyu2U0tZ{8I zbhL=6mr<#yp%M?1C(+R#EgUd9r&js;zI=dXyCF_ZT>zQeCA~#vJG=zW!nMI7zn9Ql zgvyfgG$JH`u5?o=ywz2m#E-GKFinecYVLtQkeIJP4(ZytV`Ox+E)4glD=S`ZZd_qu z;UC|7z@xb4!y(C$f*lirqus(r?05^odgzqdB*yFva`ZKn4GakABKp`;BXBNMe27@j zaFE1M#QSd6ubMRIi{BKv4-E?Q7x12IZ&^_~G%cvDkEU!ZD%&lQw==*r9X(c<9FkBf;E7Mm=CVUEDuJ;W zQypOp87kIe;klgY;Wr5QOf7?UZZw^TAAM`6|Xz1nou8a+F% z(x+oZj~V-x^92^Ofd;S`SY$8qGmH+k(IUXebc(tsmFt}o;}6CBjgfOzS;Hd0XhdPJ zh?TqL_)}4Not{Y~6V`v7M}S)CoEx!1TAOE7A^Y0p`nr8uq6xjySuY)!v|F?1ULQlmyPow6`t&o3A?J1Wl`R$$g2Mg0gii*==(F8pFANeWQVN;tP$B zvdJbOA;ZJuj1O=B1lj&D+mRun6){^_N~4+PF?skSDvWJJts|x+)v1yX1*K8!uo@bA z;6%#SY}Si~Ix?FMcBTf&NvYu65qPC2HU&|^)llpvzX^t6_KJneyUcKZ1vEV+2d5pG zOSV}{+7e_&)+BPrjJ{w00^$@GP!=8Y^VgD{Yc}$@ONrS+Gn@%z&GI3IBv94J2N^rW;OSgb?lZCDW3IBd*rz(cF(;GE z$#xy?VVY@dG*v@u6Re&%Q#Qi=c}T9~th9U6^3_Wz7W>X|jwu?c$1OqX*IE1^(RVB| zdBcgZW@gGk3Ix5y;XVU&%MC-={Ha1ErTFx|-g=G+QsWn8Ug=pE#mr7F) zp5ZBprrMHk-yF5@hSTH_WUW{m669&C{ivEW(7$EQ-KDFA8@F|-H)3e>kt{7Hj1jNI zo?0n>O=ie#D`G4Sp}mCxmRS8F5970^z95~MXKGQc>MwlIodDB%@d z#{IQv0JX>Yf|S|HIHYFn_8W(jl7>W(WYB=$j>C_-Uw-!Oe0lfM%W4KA<-Wbi`&+{L z|Mg7*dY@66V9GcTJzgJI-`z?@ji{B@I;E9jRGTpNG}ek$;VcXd##PDN@kZoM9e2eY zPV+Uyd>nO2wZRXSaDKCo`k_XP1j@HC?X0Nm-Zc}aQHvnbG03$IT2<&|R< zyEE9(Jv;6)<7L>q8uS#<1H{tOaaD)qs6gnxJ2RQ>DXQIVcGY0VkETaUWZEOqYiS{T z+B-vcMYC||I2a@avd#D@CdTVj+xKUR8+l`r6@GUNeY9He{t}*-F8Ol9df#^(w9sOn zI`Va&tR+dIZ7H#Y&#m0QJM{Btqy5DHDOKf~F3ndMfyrO(n!O|n{tfz~aC!Q&nlX=D zIG?Xt@%xQVRT0ytGlyU1J{iAacKHJ3pC!+q3dRyQzur?(6Ph@qzSyo8HV`8Mc1$fq2YS|3-HM?Y1_7XYJbOl(fYk>PUe=78P00{uP@^%CWAAXoAmZ~QheKKK zFO2Sc7H;Y;gzyy_Fzz-UJSsD#s>n3Maaog!bIjHw+d#%DDrn9pyBbDP1diyO7mG68Z;pGz1}-$G4o2t%}13u zYm8o`2AurHLc~`ePKFFrK<;u@j6CDd;Q(%S9FG17@x117T2KcpwZt%3XA@JAtjZUz zbVx??WnRcl*!+%p1uty(Zr7x)QQo+cu4_XBJ^gAbv||om2gMdKOZEMD#0yoE`&?8b ztfLqhK|bb&m~QmD-CGzK2eDs%r7^?joSMp=s-y-fe5=|oD9|YZ5D7g<_CkE}k)zSw z^m-2t0oKk1>kU8cXk=bw$IWd9dKz9Ru~Z~9*uDvf?ske^>Me)WblVx1v9>$0IQ)~? z2yBvenEF7GJ|?FuQzcOyaykq;2qsvRlZ{28h^zYw8tK*^&BSwX2o-QfOws?Z>hG?Po8x!vu6_*Zj>fx9GE* zK2nwM0KfNga_76$8j0hak!eUE3ZtM-Y{tJ-U* z7sk5M`(eA~>0kJE^(JPK&u%RZH&0UtdY_^&MXv_PJGKM?3ZwL4^OB%IX-6&+hqq(8 z>V1g%m(BZs?+XN^A!-}k!j)xAW(?>rgCh)XH0*{i^qBAp-%v$?z#hsmQ}f&AbM)qo z*i8Ya9Qq+r(swEH)tlji5k~H|WjSe25Rt2RLWwI{kW-no6slBx-)41&fC7PHO-haT`@(q#+EJ=B71L`@WwwWkS2AFKV4y6M8qg zyUahmC&@9S3yZP%u-RE>k>rixPjHWRm3RlSseDOD4FBWaUPN-DO`1s~5FGE%>~ zDlag4JbDK8vsta{`*PFahQ-Jta&mIg zTU0_K40gfEAcx>cdd8_yhn|{u*Mzf+%~{SSo-!@kTJv6!snuL?sIvTe^H51zVmnH$ zI*jYc9$-VdnJS;_e3n#r@Qc6pth8&{63``5&1uz*3mj)VC2e8LZKwPe-l$9WbNMs% zt3dHtQiv9_Rl^lZ3nk|)?p~_1?_x^DLu8I%S@TTD- zfh#|(hk8})LpvNK1w}BH?6~nZaL4BU{NwSkRR@!+0F3hmI*1q&l5HF?>L9ElVDI$A zG7#qEp>FHrYYEuR+l-v9TN?;*=POF@>Bz-73ljQz^5^$mI4T zDwW_XQ;b&_Xo%4iRunsR@A{-5PZXQ~o@Za=y;?mQ0eveHL5$s8$)}4Xi)+dCMgQZm zbwsX`SRd0-EW8rru9 z@!_~oQurv~ud=CO@4BKfqq>{AZ-*wHQSXTt_PE|a%zk6*@U>Nd_i5}Q6WyVm)<+=4 zgg>C>p5eWRHFbuqyS7U!*($Q*UTI22AYVrY!;z529OK1gMqict!g7P%b^;nrYQ%2u z3tun$FsVDnlR_fxWPGBd)4(mNhW1980(+WJ7$cWbPD~YC+SRn!iw> z96!m?L>4~mm#|)8I&;R*$ELW^V{wRQ%XCn3r%G+B7F9mIkIfWN{Na|gk{>BLShCpd zz`WroFEDNeC=dbJ7`dbCVn+$0y>22P&C?=rsT#JX3Y#Hlo%PWwTPw(%m$rPml>LrP ztEw?LQ7wv*KHEUy@pS9E8yOv?{{r##lHB>9Tx0#C<6)^POXI=y>Emg8#LY2?n4TV4 z{EEj;SQxr>yMBI&bi>)iq^ME8hm(Mcf{K!I-990@n%CCKx2L{nyr}=ZK8G?aEcMNs zN;wmV@p6$46c;Gx3~rd_u6v&Sq_e13Dt^Ez`>H=zYVbGc8JLd60S2y{mPM~I>#G#q z$efk7vaBUH4zeCS`PVnWtyv2R^qgk{r|PPh9>nWWVZ0*`pxI%eu7op9fCDvU83Zt` zgr2V;fKZkrDF?<3E-Z;E_Dlg^9oR3EG+}Tb-ol$EndYzn@2rE|gyK9_NelfSXCdT* zF$ZHYg16|soiUAP>AaW&nWxs-g7d14wRiZmy^V0D1ta zMa`xvh)mwOAl2ZZ^SM|PUvt#p?W_29n1;Rk0GM!5NI*jXU;S*xXN$5g&6O2q9zYSl z16O;ls57)q<@lz`V|!OhF(x>agpmO1sPr_!U9rS}V?cX|`}_O;fdR%-`@$Ci)|%Gn z%YY54b7s+z6!!MegPSy>TIyUI3$(Hl+f)#;MfU*RE?0q7V;M6dB!8?Mi>j;#i9>K# zsaei|YB^}nPO)y6=L;zUKnecayK!b&C)%9V6U<+dy3>^6dz0Rq>f)cF0wvR};Jy(3 z=k((Z)U5@gjL*#$nT>H`ePcpTv`UMaq--Rub+3} z0_r4MAg7P7t4`v#5570PC5LpIP5(!SCNcu0wVb=Tb7}hVihD8!1&aYD#B*15QM9I6 zrKgz`>7Vye6%AZ0ZVRp?M(v(uZT^Srd7}Kp1$Rq3u0e9RC_8$CDpX1G&BRoawz3KY zsPcTA%CJK44)}7t!dMLBFVR7j5h-^KPCy;qMTe@DyyC&zAvpVYxB+)i>WxgYSP*n zDCF9G$g-8_wF4B5a+1fXv))tw*LeP3Spw$oe%jT#wT`qMF}0S}PdzHy%>B7$Z==1{*N_m5P#R!1|1&JCJ&33M-U}z)k~|~8$k>6 zfIs>kU#pN09ADKrYbNv^$Q=ENyFF3fk!H@$JgBA69$k+sMVSs3R8`HzwX9s`V59k^ zXpmqvg%3HWJue)tKcM{2?K%{QTJrDO4xqUm`_>hCk~9m4oK^J-%#azUaCK4e$tDhjc8X2<*$?JIA@#s zda#DG`7=()_z$*krSah{;?#d^d_gQLHb?0iSQvhruQW5W6VtnjLsU5j@*c@&P8}=2 z*%iK>TLTk^7#6pE$;@c|rx>k_z%Yh2n?^BM{r}L*WlP#2^!f1rM=!(oyVdy!+81v* zZYU!LFxR}|+j}Vo27bJfBe_D18S;jK;^{<OxBBP`D>abDR#Jam`a|J;@hr6ve-E^4WIZ zk+pX=)U+{By@rS)xq3?=X;3uESB)2{!U98sLglKt!uxP@_&ctTOV@^RMkel@z!2&@ zLL=%en7DVr6r=w*FL_2~;HQw0VmHw&wYf2&KfE?-?bX8_QBJ!K((svcVo3I}iqwtb zUfe^lP8jlGlLiqMS1meYqaO|3#d_p4s3?Ta}FDYwbvRy3 zd5KM7XBg$q8myVdxL#6Vr8yVAqv7zxfp_c9i`ZNkzkDUZZ@9FW^<`~;ZvKmG$qX~8ebcohhv0Kfe^`&!4xi;!%=Ongg{<5L zcva2;mUgNmao}cLadlLTb})DQ&&>PIY0TzmhLd3$DUQxCQf<6mNOi;|4{`a_xzUuV_b&up4!sBQ}D=X@8#d1*4DY9XK#o z^zl^VG2TaGV=XWZY9);Y^zCBkg>l1)z=dU$g`5i|s{zLf8a>v9DXl3fO9i9WyY8y1 zMmVARNTC1alA+%1nXW+zPGE{UtDX`?KP5i;KB<5xC%^bpGp~t7cGnhvzJ;|v6HJTK zsdhkAav@u5wI+M$A#q*CQUu>*)KO5a)`HThZJAO*euYxE#Q)D=-&j6*tyn z=+bhgjQ(Bz-hL8OPij@&+Pf05obD;@J~hT+jAp4J5#m2EumNeTQ}dM197gP@vBVbg zMixYXRMr)!Rlk|6i4!({1iB`Y}xC3;^y6%$x5}GkwGWQIxr;nI)C()t2Xeenm5X;#r zCw;s3FjU3w&FIRBco~W;aV}*2utO;B2zgq$o7Rg;x`tH zLW8Ah-mIHS@0H)>3zer%SihIa=>378?0^pamAR69*YIx2uY9AvHK60nNeIL}``(O_ zy`rF}BM{$$CCh0<$QMU*3=%j!z%{xZn)k6(Z9H0b*;5(A6rD50t8eZA!ml zD8n7c^^xH3KE{=-Se5kZibs}OwljQsV|=%n)wc*z3k^`sMqVqkpOj&)_14IRcGh<2 zTBun^7w>J-LQEIyer+J0>M8E1Vz~?|o*7A*`5=@|sw}1^dYwbc>zGk>NVS9WBaTbk zT*@O~-h2%y{~~y(%l2JAKl#$dR1%tQ@36B@`WFj-H0+K8#C@uj4HZoMgB9lTgo9`P zN_7rw0(rvba;a8H=JL;bcgzcbn9ywpZDbbYl*xefL~D@OtrAb@ZYy-|+WC>dhgODe zF+e56s?ZzQyY=H}?UvP;ZYrGRkel$ET{cejF*3Dc9!c{SaEA>5wWuL(*^RO6GW<;< zZNuM5NL<%q3{?MfFWswGh_I7ecpU?Ged~R)U5#u|vTkk2!A~}rzAnHwlE8=5?1g>j zx2vhOfwQgOIEB-Q!=b!`EOmxNV4~IqsCYvxDlai6+@(t>tq?vnPD57K2H^KB3%?3S zg!VC1&lr3Lk9Vq^6w~Cvccbv4<4xDlH_(T6NYTZEYu>ygW)(k{wIC4&|90Nbvo{eU}V^mi<0Y}|Ma+2Yo z@l%Hin)gXNm^0rq#giU6jsGNNw>K&!1R`)!Vo+QLml{W2GQambYk8Lz5P=Rm;kKY6 zcz)@!@Y*}LvNcCE>o9>Y)R3(`;3~d;-A^*3?;SH!wbshI#BYS>j_7dJgpnQ{aekZE z-lO=MB=acCNYX|I>0js-LB~;@2m_#L{>U<-)eN&`i1N9dOPyREGTpOD|IOc*rn( za&czJ>_Eg+&U{fm9D3EM(*I8N2;zy80Y3DL(^?a&Oq1V9pIpnc5ZsH%7(V#GUXtE3 zj_qE0c=``WlT{W(!=9!>p>$BqK~Q|}=cBA;8hpP6e%=f=xAWKW!XXtYzT3~KgL+&o zaTY@%p9|q4jiH-!xk6}KVAx6#hILHQp(O@5g3^7W|DCpRdyTVJXsRDNXJg<8UC18> z{q*-5%T&Bh?AP<_wy#`N1NTf$KZRX-CToudNwBvt!kS-db(so1#B_HY+k%g^%=>eX zsGSwxe6T5Y`+$^yFX&`~wCvq?3fEt+R9)lv+Hgf$jZ9*o=X$aqUm(GMgLc9`^rR8W zo9ApKwN0z*E?Fc0D>C#Y(4fEl&fi`= zjT6U44+hn1Nf;zU?`AmSG4J{QNZf(DL%#`V2+~1_pZ*cXN4hg^I zn;fXhwbL|6bOa%b5r^%^TVs3Jr|in z-p%4uggfq5Xvh;S3|?qfydC_vW9?_dpUdcQvDjaDDeTUqCU~7#BP4J=)FSrQ^VB2E z#r%(HNY9Mu{++>@;x+8i~5IRj$rR_-Sc~a&J65qGMVRb3zs;@}xGdaFkXxw-4eDDbXy#Zat@GD9h3v#Fl7LPy^$$#N# zF}l$2=V|iHzYgD;mt=kNwp-(}%B?Kmz{}7q|r8w*V6ku_5 zZ1G_1G}v#gSkV1_UA6M)ziper!p|6rNA^i`3QQ6m)}n|J$Eh)o2}Xcl{{=*Juzbtu ztY{=MQglJlWn#ttk4gF8A8(8+G$uC5k-20a)xRI!KhcMF%wIXb^)4cu|9?6Lm518O z!M>M!mWh%8@V_#}H-)0X+}vN=$JGmD|Cg=xFYSE~#;+V|7UJH>|2*jLJ4FNaJ|boc zi>mv-44+>=vcP_!mPV1d`21h3>Tr}64$RxS>KUm1k9_*$UwcWSy!{(yw^G}G^lE=& zY7Uv07VIJu+V<^mf`FCS%l17z}+LWRiEFLyRWV3k{bXwjxp*@px;Vlt=B4(jUO}7-^EjUl{c>q zxg}XO#orJ>vvQA#V+-Yjrt#*6!Bs{8=`v=k8jJ%)sYSXQ;S_5dD~&OlZNEpmGdMtbURiD2B6Y z;Qu!SflmCsdp@FeFsDfmIn*%qMSbiz+^?!Ca#4L^5O2e&8M@y=*4JGudY!Qii%HP; zRH?1?Q+ARb%L|Xzb@8R4hB7fI#cK|mp|5}j`Miw9_o%(>;dDKWz-9II+Su1!#s1~~ zLATr4V}%oeR|4xy^T$%v_-LHH>v>QFL?6}1poSsax@MQX>2VZH3b#|Ia?_xLGS>9~DVB9vs-La9FEr9*ZU!s)J zswmHSYvlSOPoK?$q9T6X&$MR~wHSkXm*O}>f^J}IC@p)F92amo(y{HHVzigcFkfv5 zL&7$}M2Cj=o^$1HL%-T+e~7zIHIRf1&YeK+zOCO`FsADxxy!)Zn{CT*KLhuHs4ie^ zqWXY4-_+F@24@!m$30Vss46Bi1gy_Xq+UN#$@yDsK=p;8GK1@VRWg^Tx|P0Cp?`V} ziGn{nPDRTz+?hUv^)kYIeYFaVdazTTk=+@=XJ%mibGkIscdD+ydqio^fbsLcKk<)H zu!M4o*n||`=SL+vNS*v@xt01V9jeNk&K(Tsh@Au2i?%2xyR4%gKbPf9oNM)~YcbIWk zFw5+y{3~CLhyAsjH_@&F>hax`M3uIXD5PUrw547Z#TjTjUZcu~0=n@lPvt~n61;>e z&q!%Yef_h4m{l+lYh=1!S(KMlwY6P^{sU@Yogv-op^mVG$Ec4@5jVvNC?Z^G% z>2lw_0_?WSs(mgbTW#g-)=V*w?s}$1)CbVmc+3SX+*z5;kP=JthZ%0w^IV}1e|qBi zxJl>V>zbLY|AD5QO?Wu9?`nB5#8D`YOsEE;7< z?bXUy8@>h$Ud9MVR=`d7S?_3<@}+9%>y_8LXFraNE*`xn-2gE$qI1L~GS3J5yW6gy zyDe1#dMcoXjnEa>r;~>_1+q=Q`)%P4l>60?@axNSMekFvzmi2>JbDJ+a1RX8qv25J zR~y|6^=*!gKk>e5v8H}!2op@}kn`PM;KKF$2A^kcGk%rOz1zx;0s`lnny7Rf`kwLZ zl>ApJZ8_4R;>69&n=wPcVT>Ivy$)1nj$Js)VA?f5{b)N}At)$Sz><>D&)4;bCC#kQ z4T0M=IBQfi*OOHKbwCKn1DiEXjV}&2Vh>NcJWZyJj%ygnBQ#XL!fd4W-K^$RbA%B7 zw%<7I=VSy-Du*LHhe-+V!Tq=>{#AiB0-hUIAP1FtYQom3p`NV;-*qfO7? z_Hu%LjhCC87^HWy7!M`D^-Tx{3^If9?-dz*%varUdwKznZDhunCoH^H%e^XguR!fx z!65mzjN737I<;AB5`tvv2%Om*#@4D!Eik>#Hr}0S>hR@I#7E;c z*)1~rIB4ik^6-2~xiqJ~Ou8oB$8r{12NLPlVHTk)U zxfq9kVWBe%w_8$lYMR8X^{hl!rEbNqjKq228w-j+E4!zGv)0GQU-7F^f@kPo2s;d~ zdN--;h0S9aoyUsCb}Od8g!ErZ_~@Gi-4S4++mBx>{-;Bs- zu48)hXLzyxz<~8=ww4MWWvGTRtiz+rEa2W>&UxQvRD@5$r+ry^P9_{#4lMz}*#8&( z*v1P00E3R&mkD#hzE^FIN+1~N2%|m0t!>zaEP5g0nkdWb8slSzK|-vqMaJ*j>jV5# zWd2m@wl#7qZanyuaPg9)-l+mX7p~R>Li?xYq=)$+#>?s)w7eb<@m-jPfsO3eT<@G7 z`KWhRw${;b>Z{NBT(HiG)Xv7gefw9&(1r2yr2C9HnkX)HPB{AWfk;Gss-u!HrpD0{ zVw1%|)`xjfnPNDBHnC2)jFIUYt5CEXxacx+@y4de<93S%h|w?v6novrvu{bL-ANET zu^Pp9?op1%=|Sx6i~;Wh55Q(U^3hJMEfmAUX$GeQR8kC=7EyssqrxeqxY*jgE0yMMluwO6bs&XI)3dXy0 z&ga4a&UyYvwPEj4{__$(0hMpN%_orY(kxL}5nep4;Hyp?j^wn48V!M|`ujY!d`qMAMUb2L#QK5jdzfXY8kFg9k=aF_M*sJTZgjld#Q zmLpk>Klv+UQLaSr-t5(9^&kS#V~1X#Nw2Y>@Vw+MHnq^@RAd-;vd!mw@~&*fvnFX* zQF2a(RF^5&JVJm2{UF2}DLcRF!0TX&FvEN$&~prS*PzxiX1GJ2vNs_t9`oGfG9T)$ z458DGW`gH%h>u>a;-NSUI^4xLHOwwQ`Z_l6A!~iD zF5;uWt~5aJu6SyRO2Vk`I%s|2nn4pqq*2&>_F5&_7FcHbY^EMNO^Y)zN(I;Ua8Q#W zsryeylyDU6G+3P_olC1u-1#xH9;1G=E)uu7*sKMm#YxMp?zx`Z5UD03INITaa0LkfcI&>ex*F$wf#c>85y@Mj+0Wxud-#hJ z9}|RYceli#Du^3>xe&G({owP9qDA;7ACd1V>tq~HEvY_owIjY}aKTt4mokK|SV%zi zF2j{kqnzj0PHLUpqiLUnX0M_)XMgo!OIfV1whx=p*w7+p#Ty%@XBHkz1rQF6cj{Ku zR4WihvTnHoBOlQ9(4i2rIf3bYFsWb=3WIjTH+kHZ>_)F*Tom(-V*qM*(5sGQXJUhv zY7ESC*+l9ba@vKbha=;e2$c0O#NoaCAR3Trb}pm5st29WdP)P3N>lCk9rv`jOEP$v z>D=L$>+||M_*2%1mBgbdV(olj}j?G-0g{3%qMz2LZNXw|AWDZUpkZ)(E2 zbrPi%n3P`?t-#}EkH&8scnPS(4r`-r+ z>pkvQEiHD}uX=#}PCv?C)Ga&l&DN4KwT5aR;Q6RyIG{%hnL#ya;6e8NsRr;95+Ne) zI?``P0Un`SE5ui02*1u&o#Tsdr#}_^kY|N&3cn*g5_Uxo@Jd z&_mhceSsjE{ZlR~qkJA)7%mV8f-Nuj=iI13+Lzfp`li#J8GyF7rNXVK@%o~`bdT;EA!Gv8^Ch#x4vb95x4eiy9SLR%;WYfw>sZZxaSzVGT= zp<~et-54uK$XVOR*~AjVqG4dDsGE>Q8`|bkV#Mx=C5*o}SXyaH=i%a7oJP)^y5SiP z;f>`Db<8$Vj0;hYe%n|l?OX|l!rCABZ3gbx>}Tv==)5lF&;rRe`A=C3k$SqOd#d;k zw}l@qdaheZi~n#1E6$dy7^^XBh|`p<;meZDwx_4@fQ36SE%M)`%RLsQ89TXy26@j` z0;@_pes_58HCLs%GI`zD!#k(q$1=IeGw)@^&jv3-$}QY~^Sqi=sTuTa1!#}tGF>sx zPfwsXDAX&`#d*dQU0!2yOXS~sZS-uR&zDl}5eG}n#QKLB|-t2kN$uu2}_3N^WL)cqfkm+K9qciaaQE-vD; zJq{QB^YjP9?^c={H`B+c3}E}aPlwK*c)a{OHu0*8q6d2SwS9R5b$tY)?X*p@7W6`33v1M!DN2`EQAq%O5B4`#*(zO4N>Y@wYc*<$r>NM#_evA5 zQByrTV9|c6U})%luPQMO0=VpF$aNg`y4PRA#9xA}AiH@VojIwB>;siU+J`S`vkuwY z<-aUkp55KIW^s@$FW8~SqMrr4dTW@SGogK-e&DN^#&r$xCoS8u!cAz~NwW-Nqf8F171C~i$8Z+}1h1>keg6SvP< z8u*!Pa%w6rIoXEM<9b#GKoV`9E*LRqR}KAD*PMySRK}4sD~xJrchZwO2MZ9%?zLLL z=%0zLVutGOwmdux$^N>RMK)hU;jj6jeLTpHW@v=f-}AdZXI-%B$(#&*jHm35OZ(k^ zT9%EU!{8?dZ#(vEJ0m`ct5$W{HPqc=MW%k^NX~r*&-|&!jq@#igHD0Hw?eX6f6j3x zDts7COoLxQkd($41%D)WoY9USHW~JXbm;*qtVeDY^ZYWZ{}@Hy1g6)$73%tOWPM75 zV`CEX@-fZ0?;A;#oL;!pDPFi*Jt4bW^Kc|StsjJFh7iE;!`XGRB+~t(iBZm~bIxxd zrjNrLh*`N^B+}7WLM&C}a_GEZuu`%PES>%*9Dl5xq&gZ9-Ck}&yFYP6dp_YRU9`s$ z`1!PLqF|H4!4wd~wC`5r{FUs|f*mm?JiHX5D7n`Ox)Y#;rw%fJ2I&IUi!RQlZtVo3 zI}h1VM9BX+MbCkHgAA#kq$=(m9X+%sh?!t(AB=|{7%V8ECME=oT}T`3<|B08|BN~H z{5k0@-3mEhEZ!5V!L0u`us8ney`t7RPwJn-9LENtYNc{W=3wj>{T^QjEpR>7Hx88belc?{7K-;J; zA;jSSfHLZ7LElbbr*e&FM(h56WOs^Hu!QD{+s|nFEBAQY%Ph$G;0KHoK2R8if)6&^ ze$bSDcWxeHtZ}o`ubC2x<-r~WeG1F%PnO3O4!Z34)H?58MeBmj@MSMeJ~cX1L9TyB zLxOvv^ickHvxK|evk!83-1k)}SzSq-(LH_~Sou)Q|0IJ?)*kNL=DDRCHdd96*%m!= zyOnWwe(FAKU&{2lA=k#|@vb3mAx2+61fB6XM8Uk$iJwOGY37F3G%IjA1oG>$OgoNs z=e4ufUW18IU5l*>B~CET)fd-uPR{(}chVqsVM<9MOKip`6O806cY^aJbH~Gu z-7m2(tJV-1<{|ZbqaKBk@i4Fk_k94}SI`$}UnMoUOh0VD3lduNvm6$I?HmJu|JnB{y*-Mhy-6(~G+KqQ)H*Jgdjc*{yEcO~!K& ztctMEom%5Iwrbr@zzs(ru{%|hKMx#@!V`=XwljhKh?weiD=xKU-9x=!=!5LQs2HIy zj75HwfvA$C+<*G@g%Q7G3U8rAECOU(zmge0=jp-%@rm?&QN&{}EPDA^2IPL3+Vsqx z-KZ44;}h~j7k4X#UyUxWWIVoi;_wM2Q%y>bh-};W_IlLVO>jl8-21H1{R)Ux3Q)YhsG-f`fbe)F72IU*~G?x*FJ+B(L7Mr(1 z9Nc-qmk_V5JPvG^JHHW}QuO<8y#E&lw7k3Z0tw&3{$CXm94pao$_8oovS_{Etc>ai zOAcvdk4mgbbZObnJXtZbE<{VRgCr_AzMj_2bHZ9^0%xMQyT~7)10t%L-oXnXBp!yd z*%h39dGMLmAf{$^=vo8y4Lr}ZyI<{8=rQT|43P>%78Lu|+4Xl(358Bvv1VSMZds6c zKn2^8|Cg>+5%1qJYm3PWIX+!-(>S8ITBT6 z9TIaiY1#eQ*cU&({8zEoKH;}x&&|_XZSC!oi8T z)l7#7<3szk=piY7-$l;HtHJn9xn7JXc5&UM&?-|(xlTvR-2CUEFg-lci0Y$=(s4Oq zh-v5G+=LJZ%)-KgB!K{qw(lVYS+voEA(dvEHGy86Gw{A48BbjcS@*eu-jImXAjE!- zDplCtde~wTb|l@jo8#d_c@qA+^Gf#Sf~hmbIy1R-!WTp}>EZbw{#b{C9IurjsoT=I zM}-9GCIy?#Z?&_&1Fsg=mul|hGFn;_jwc5+XvbM zJ)Z93n+iBB&77nNIB|#uO`az$n8LK=bprFW0$c?n8zX zMjh2y_YOKJx{nn1o@=xhW0Upd$Oqq4n|X!LOSU^uVxk59z zm<8o_jTiqkYt4vJ&ZKjB$Knd0=_TJ2g~Mk!d`BmKn;-pS>l&8IV|l^1su%d^A3=KJ z6t{Bf^0b+jt8sCll}Hf%IK|UFh1<=4d6m`hyAk^Ubv(6 z0!B7BRy$dUhqS^+O!CYN2_BfhR2EcB(c*R@EkOm85envUsU&MNQ-tB(a?K2^f<_oe z7aiS~jd7Z2?PoUFeG&I3(p|{S>e+e&15-gKt5a{ra%W7n;U{r7+#`=>j)q-KY>oyt zQbSOZ>7$f4@1mMrf0g%Y@Bq3(!EcLC4eU1=$t%tKON}HoG@_rLx0z<+O~}`EBdI9; zL&LeULasXSJ}%J{%FQf`T-m?1^t2}n>%n+DF)7tmwMv}LKh44i)~9f1+JN+dOG?D6 zPR$}dJ=mXdi3pGYZ`ZzAA!OKFZP}EglBr*`iqUKWi0VJn4PayK+X|=hi_C7M?*JBJ z5k8}(yYBUwVZ**W(=31yG&Vx`bLTMp-yhn`V`9&cEp3g~b-LSJU9W@R06=q6%_xcf zERn!0>YcOC$=F{y9zVVU+TEdIws^KlWk;MD}1|Zyl!CO z=R{=gKIV{IykDr)(AWWUKSlyrMMr+5ej4+8^>hK89-Ml<%Ol-qWN#@}064$AKI-oc zXZDK&6t;hSvS(CTGk2R>bImTK0(Y$G^&!|=<&F8AezLNCL;_7wv~Ult8TCm-33Ee> zmH@Bl>dg5pUj^3kJqXh~4^0VqnPpe}?=d*iC5Y}@YK2Q!^1khv?^m|k75jD=U6J|K zY~YD6CR^m&9Tw|)qfgZ2BkZ5{hXxEE0WqtZs^cmOtyZ_HbW1~zS2A*A>?m5U=76u0 zhFTbaLWUF%{!?&aEI6eVis<(C!|A)Ud(jN2UXD_CL9lmyuJY(^iTxPK)d<3=R&s<&R+F&c||*^hllDicN%*?xq1!VHh|JFCD1x!lcozE(-(g>e=xnVzA9fW&-VAvl)Pqu?z=>^JYKAOegfsNX3k#L_L;ywWWGk^u`SEM$QR>J za<+JS1-%ct>;jjDi@p|oCmv&ccHkad6%yzRCb5}~>q{_}@uawr%wH@*A_ z9;e!@awzm`Gd}`%)dMKa7N{c=3CVhKUQEf|e|}*VYvE7H74Rm@WAbrgdj_DtaMVAI zRZKT^E-_)I-|6=v_Sh8}{pRe5%n%e&h(@1$JnL4ZevuQLkehm)TSe{g@WfRSjhz&T zg^XQrznq*+HkM??-@k?l)(5~Sxp@VH;*5kzi}}*W19oAyUh0Gn7U#jVI#QG1W^-_t z=*wANTr<<8b`kCMS>apxV9f7h`ss`PMHQDzX83%5uU90JZ1G^^!;$!D*VbECN2lOqsj;jb{MAp2O$Gk=eo8YcwfUrB>5dK} zmdQ^aY@P}6BwrsK8@62CsM;BRyY{i08UHcB{dV{A5@5vnKG2V9U+^$ZDsrg}4f7&8 z@*QW$(uG>|wPVT8Gb7m5PDGo$(9k=&5cleL_JRl6>+V}_%Om~IBwFP5t6G;wr+kSi z*W^Tgc=}&^M^dguUGkH9zzscbJ(7UPXY_-c&Q~%Z1!buu9 z2g7I-er!q)qg(&v1DwZte=zb(A6r>aD^KsbK-0x*zh6fBv@_Ln@b{)DOIdZLnxE?T z4PP8y@TuE&Mee48Qkz7fs*cFhW;({N2m1w4*ASdS^a1$ea}6EC*JgTitj8hXj$ZUL z0l*bOSt}0N$r|__PbWoFyj*t)>0E!6N7s1_Gd_*Oc?O}S8zWL)m!y|(fhpeUtM;DRSXWto$ zN5@H{U3;6hnI`hl(B-~2-csv2NzzR24=|S6FTa0ro7_bJ6lk^!#GHJTh-E86SD6e< zyttY&Qqz2&pwG#J5#<{G=Dhich?ntFJ&A%YKK4RDhjFoy#K&B>ZI@E$&>6o;m{Mlg zQXpM8A!4vnP+hsUB*B#N8=#Q1KlFoUy0SXLdsqLWQMGcB(iNmA0yUljL(x)30GpL- zNzJ?b5^=RT0E2thPb{$YEK-2>;J|V@BtGu~x7<_pJ)q-A=(Q4PX^fuqaJjjov~S;j z^+^u(+U3b8Iq@liee?wmYheLwQ(;|9#w)E)d+Xm)bR7F!eB{1hetqYI>mv0?-$1@q z7x-Mc11#<6@|(GPALD2vQKg2lmFiEFBEG)42*gW)Uw86z6MGP^AQCvUjHHsd&_WBVcNJe+XH5Npzv;4e>G+qazHHNP+%jQb0 zyLfzual>?q2c$uSP)>p4aC-Pa#mEk5u*A{ZjG@(bC4S(4>wdTr?FBo`P<6t*@Y|U zVTUNJu5PMjwiTfP+Nl4iWuEm8WE4ZbzV+43Bzy9ijT=u4nP>g?BAIQ55DCW@&QV?N zv#xuVOtSv__nGcn+ade6>rdFD-j05_dobK&J@<%F^y{g32!{SAFk7Dia^alIjhlY9 zVcKSlY&45>3~YRi9Y1nn7^V7!S#9HT2W?<%n`Nbw7bb;@CLuCLZf>}HZ5kSq;iQRi z`>OmVlnRlR*;7VdpBPw?xAG#V;Nxla?P|X0J6F-L(P+_p8kHXn54rc$bmO&;Q<*x+ z>}jzzDCaGQARBEjD6yoB{v1}8cG2d?HXC!?#t7Py`MSL)W{-S#1Q}!!68N&#>9_Vd zjU~91bD{~XU@|Rk-r*^aG?eGEy?Kod&`iQnak${ zWhX%3a-CoE(Pw9sVjZ2@-Q0=ye@I$fU`+}6k?YKHW{o2YHTLR31yP{k@cN@jy0B6k zl_@7iIPcU9$f4bLt>9~pP^8KYjg!*E_q=s6#>{NCKV}~6aBQHj?irlFO_zMuk367r}ZXLe43_kpM$bQLrF$zChd)EA0T zI)gnss~C2xnVVx{KW$4i%D&$9tHtxN$@4csZ6V*9wVS!l9`#FL+f$(Qz~@~T(u)R; z^hc`gGBkf1I>A>OTeu5f!7Q9Kv8sx<#dGAZSQ(3=Kj&?mGplHL+wlIpLw!0{2R|ff zXlj0#tJK9RD=P~y&sD_mSv*j$)Y-V{Am?uO9XYYFvv+RISXx^~+q?OzjFRu@iHlv8 zbE_|&yj{Pu_e=NNUSlUdc4yA5fTh=EbPqE5Q#^;)ACK>s_1FD^4n!UN10QjUVhtaN zi_p8&r?@uCR_s}BJ=z+&u}$<(q-~8*0z%gtO^d0ydaj?p`zIC!^Ya@hAxm9** zT(%5<>2u;SZO9oW;>weuD-fft|KW~gL@kmxcZj`HlsbyLK{J&H38mrl6@ibfbN;>T ze$H1CpeAx+4oq; z-d01?4Wv5NDIz!pu7MOjXv5a0i6a*eOXFsJbca}8PenkhU z?aPQ8;M0OZyWR6e({ExWPuif+d)J-*0TH+)eQc2oX1ByDkrmmVjQnifD!+iQ@RJ32qbX5@upzWz zKM$sE?!H~mp0de0XJeaKLID(l9J;DT2F(vrOhCJSJ9S^Lru6kV0MP(NmP)7B_>2wr zB@!LhpK+sc8}bodApp6oAN~_fu!EgjLP-j0Ac^~JryD8*iG+mCnu*+!L82h!#}ucR zDHY(3eiVA#6-4Gz24g+%ak>FS&7W(oSj~Tha=1&}*O;zhair|0cCcq+R{ved^?j}1 zN!8ehHXI+vcRv+9zoeuj!XNVc4dRKf+mpmk4pp1pB^Bp%TQlkuLr(F zD;^PlVB}-LYX0dW)9%&8|2?hTV zZ@U>kYzp+Kp|-9NPXis=PC|`0<3x6jXzXdOHz+Qz&VNu}7(Z&4I(kFd=i@v^p<1S= z4qmK(8ffJnMc`#U%Y}gWVD3+HTw-gF%7jsI$N>6j{Fm8|V@Sv1I#c-XOMRuIocI%C zm+?G`QfjfiXXP=FVw;Y3X+slvUeHcww zJ%Y&hj5K_CMo>ZwiHF60^+htB5svz6w#SG~chA99S4W-=`DENp?6#oZPO&?O=EpK7 zNgcP35yNB;wje>ZntQS6eKO7TXtKwD`)EWSv6>VV|PbFZSCwg z+EvNz3{>D+xN~G;XHtn_5$z!GZ0sfA$%|xBpX%i9v<~N{m6RyxL~LNpps3mp-18vx zn%`hq$t-9DODk+3>J|a}8k02tRp{`MRlwCGDn`(Wj8vzHEAx*Ul+%kkXa2!dTZo^} z@z8WEt2gM6DWhU#1ZSQl8&5QqlsU})6Xx}8)YOFUEy6gDOfedY%B{X{03nB*yx+OY zab4@d8SmI+g8uxDbq~1w()Z{S6&VNR{-ca#S0mjQBxLsK358pC0TS+s`7ytFbCkl_ zrsGDBcZ^8}?Im%7&&^@K>rd!{4Y6Gu-9*&t7$(G5uCP}oyna56)6BQ~ZX9iV(+z>**tqVDwgdfHJZG5E|uk&m>ku70b)-lOrlBYN4Wt7>KY zT8Q>lKg!0tz=nh2gBUHTjsV}K*vqw7z-4mw`x;?i`rAt9E0RB1=zTk@K}$3|1{=zl z5}GM~!YgYJ#u8M7SSKAVfYW*JpV?37`h~4z#^otEX5%Sm3`M5q;nzFUAitI~rW_{m zIMWf;m#K#?Rwq}|ro<^cc3Bh#E;W4>pzxWgK2kK#taSr2dY0fM%0i!CL%?nKx-Z_< z@%#i#`mKLl8y(42aXaIV!DYs#TytrhL3ZEVwXpF0CH$T49o|jrWD(xrgVPj9FiF{q z#k(QlX3aU&10Fi`M$rnTGVf^WiVs{Dd9$$)DfCF8D?tu)9P6GWb?YQeJiCWdPFkiA zI@i1vyz7q{d*~Jzv>l3(oe#b|9EAXS7>6mQkgHKjaWDH3&5_rqW zfoBd*2PDHUS8%#$+QJ@V#3v-@zUtZ9V|rx{R@4_4yBm8t=GjSLSX0s8^mg&by1qL> zQ23Hki~i}%>Qz1b6@{LJ)obzclPHM-jeb8>9;+m~2iqi+ALKB(wYN@rc$knY&s{Y;&+A+WhF?sBR+E4}TrtA(1;vp`8}(gg+> zhg^{W+Gg$rLL%V9m_cX)>0Dsgj)l;WE{>a{f&;ZHFA*8*=4jcdc8gR#a|mE@PfM*I zzIi;C|xrMx?}igwHaIV;)e!gk;#Q0#F0DgW1_E1-x#Hmm}E%)E{lfK-%bfWBTRP3~ynJVa`rU^~_@ z9nD0Nh>WMoQOUCM+UZm_T<%e_S&D4K8`?!mmDJR~a_sWbHQ`TX4&hu(mrwJiy^~d+ zu>>tyD2FAuB$VGcl?i`@@^M`hO}f z^TD!Rv9n?=Mvcl7zx;$sr+KMX^`6;hG%WH8FtGYghqs44lmLE6WCrgzfp6JUEFOUI zm|$5=&Vw>j1cb(b*1OnJ{#CQqS4jA36#5;0qgFu{3Qtu(BUMMWhug~xTl^6Zr(Y+F z`96wxT9Ks?5L$5s*CPP^LQ%8UrgYCC?N^FDhlfA8GU+;ez`Iw&l192Cv;y5TiP-O6 zhT3<3oEnr{ME^{Ee{ai+$W}Ip>Pv(U5FK(r4Fikz0M;h5K7ZpGF8Mg&=tUSBhZ|&T z@y$)Bk&?W*hL?g@aTheDQabF$=-k7AwN<12E9PvWr)jJakJ+CpL4*oEdg0U@qm89T z`GIGAz|<|XW}m-&@Vl`on-L-q^5xsu{K8YY6@DYyAF1>O7p(%NB5#u(nzS+9%pVZE zE_=*_&=y zGak?Soy2TBRSe|RD0-ej`5{kM1}aJlxe!?`dIpA#9@iTJ9{86ho5e^fi)P2Ih~(D3 zy3D8bcnUMG0JyN1!MO7_%d6h~_4g$~$sq0~Vf|z3f(w@`*}a4-;nP}jlx9eQp7v?f z(B@`dkLiadc9lAO&ZZx=L|loCX(6yWMgbhSkY5_+MLXLUvz>|4T(c>T6->=nQL`!a z3vtxcd`Od?QVBtk>iTMU#a|ej->q=Ccunc>ik_fr)iIY{qqISc$cFjIxa`V9iyXb6 zoXcx9>7k)B1fS@69r}uRF3iZ#%mj6fcr)3Vvg5x|RZN?&*x-IWngT7`qmMqGw+@00 zM#Fa8?YAjsx;XLftXV!$%AW+;t3~V7eeAf`Ut8N<_wL-K|aA=T9Mkjc!cbVX(HHO4eh^ef62e5Yb@HB)v9Q3|RYqe#S&7VGH*~HdS0cE4`TZr}>{$N8w2|ZRlNM}{ zyi25I>xO3j27R=)DQCVc9b#R=Rt&!XmW4mxm?{Or;(6xO@B$-cqB}-5tH@rWs+r+N z+c4X)w!xC2m%^NyPy6g24i7)ghS)8QO~>F%L0kS8#K|eDWBlph#~Xe zGTqv&j5lLGz$AArG7huH(H?eoL24b-0{_wMn!-w@aym6JL}v)^Cgm5<(7rT&K{e}k zexMU7OV_d&xDLP-VwBeBJ*P{N5t`c>FrOfxbtm}2KzkiXCZ9l#MtVm_$0sICzx;$7qpYYe<8{=YP3nT zhukP6Z{29pQ`=>gm%O(5G(&3WGU)WxA^ei*srT@nG-EUvALyXj)B&C(5U{Sf8a~p- zTG1n`b?7Vun3Fu4_zTbv`AlubQ3!=c8cXPbGt#P!S~n&vtvzgeZvX)oBn^3J_CAfa zAyfI=d;L+ii~0U7q0xTfd}7sqeg*OI?Zo7`ADfHZ?h@#a3|yyrJMWApy{_`t@##IG z`QI=#nhUX6nsKzjx4lA9zgp@9#qx6!Yj<*AkSuNUZoaJ=bN@YAin`A6c~A!`EA?Y* zrDF?z~hV_VS-<9M9SuDoCTRTqmyWqzDqnpKYqsl|HQ2woCBENmqmz|3Pd2#hoiCIMCf+yIbfaO!;)S1Z9VX3 zLW=E%W`xfwV$&tt+nSOAD z^VLuYxrJ-&&PtxKdpV=*;N69}v%UWP>WdAp;4Y8;2;1Y}?GB%q2hCe@@ZZ4+{TF1f zGq_yx^Nq>)e+6o!@G{L}bzUq%?1!KKCk$ZU66taT7U=&QM1%oND!|pvy@A!#s8G+} zM;_Rgo}L5={6W$Te}FcMT3;AShv~;q+6fR8T)9r#Ps#~$5f^5) z%&@bRQdeBEekXNCXI7c{zP|-1@m`n-k6>Ld^vwb-%K+7q-nZa3Qb4|sr0ouv=BD_% zaB)8+#gT&BZMtt|iC%rg?K=?}oZkE=**$U#7Eqhk{fxM2rZxGezo7huAt_$Z-@26` z$IHnF?&h6of<=`zVL3Uu?{A2GSHzs^!Q}qCDG0Ofw5^lgb-ssZBAP)+eHNd)vazTD z>X#MxR_P`BsdOL9zc_)e@yS(*szcl|nmU=31)wV%33&g~|N2r4A*C}>TU|BkPR~s1 zX4*cfjAbS$`5sAo%xorMVvCV+SM&XB%kbZHK!c$D4-~gko4l4AQm=vP8Yihj!&P1m|Yim=YdI6vbkbj7u!(f4M3Gc17B;h_BJ#I-a@9un9^}P z(L^el)A;*>LTH!G-YuQtGOUHjehSn! zuUO|(0jZ(VzPndm^7VMW&URgR_~E@2 z)2HC3JDDMmf)m{><;vkQr52(;L5_metaNG%7u4gVTJ-`s z!!Vzkuo+`LPSBkYF9&9Fx}WHTem@PFts5B`f9DaWY8Y$^oHy*pF}XSnzKm5?&pQXw zeh0N>l`9_qS-XHx&oT+^crSAXshZ3*Qn1v=-^c_%&HF#NuG)gJf4cfX)YSLJ_~aLQ zXu06=2@F}B2u-yoSj-`-#`41hln6Th)-JR+t*S>NnYsMXW`*33gIP4rm(upT%fa4) zo~qvkxwhJHsH(mWP*ou|;_P`l+I24kLwva#x0b^poSEPd$TPRlPe?bnPz0pW@wCem zZ!~t}iF;IGy^YA6ZB&3;CMkj*$xPt$Ww6_duD~$JbTUxA8D8;>{#S6h* ziWj%y5?qSACMi}NiUx`mr?|VjySuvv3x2{rckg@V>^=9(olHJ3NrudZt5Z!ReDhwLNC{I&M(RN15 z9DJFoXg}mV<_y6#4tBkf)1=KsF0jcuTvPkDEk+Shw zT95nOMbbj8WLXi~?VWT|C#oX7o40jt*ul*>%g5|Y!{ok9$NWXypvx$|GpU*7xf3=) z{5fSXPUVm&WGCzR>f6%P744oJ9mV!`7MLA71VX5|%rlQ$;3#5Bawi)?VEq}y6>$3# zW5&wfkk|Q=E-l#yfDP-z?^tW(DcPtj05F|$Zec}WS1Zgq1aP-kE#T_ckpd0Y{&BzH zc9HDDUuda4Q{1YYh*q%X$X55_Jj?693Y|XqaD$#zWmMsrhyp4zEg1iXNEbvP<3F6P zBG|Qembm;@a^wez$$+ARZQHX!yu-gXgjyI~W&&NR@)~tkBCqL12Tb1vE)la`=ZJM` zOnh8F;LlY3{w?%-h}$7^(8t5>#Tu;er^O3Pjz;aSP6n=9jwHAtE_*Hn7t!uk-p0w| zNI}|I9prGd3ab#KtI(4(QdAC|(>wFI-bdN)c zLkB_ptwl)}TN8F|2%I}f-^o9YdrL}MGLE^WPBW&okLcD0P6FN848pkG#Ji{+C9dG(_f;KIhv6FK@|HumlMNaXaCOYe{Ji&+%|_Vbz$N%zsnY}!`qwoG zf)e+iT>wi46-GV(%+eymU}@z(vka01Y*aC4yx4PzGC>YYZ3z_qBffe?Ta5I$kwnlb z`X&ztR%rv(|Gw+~a#%akZI8|s%&{>bLT9$B{p7P~23N(KKpbVR^91+=J&2E*& zEE2-IOLjb zkSDn+Ik7*XRf!Vc_W<^-go<~-er(5?*m_Uqx3~X+@K>k>pQxHt+UzqnTcNuPdL!dA zSIZ*MvbdO!xd{!w*dSlM{&1;w3}34ngUH`fLq8+tr5TDlVlDEamh#{37D8L%g((S_ z;Z<2%eq9<&+LF{v`Eqe~h?b0ZJM5OIxBBE;@g(qFw3Q0R9R~jbby>o(>6LUwg^M#+P+zdaQjD zP0jo_z@ZLP+xnr%@A2)A$KxBbkl{!Arv#bry=4k?ygauzzR_YL`-vK~n$Yh;(;``% zo|j=0c+&`e|M>G0WJ^OFs$M4Y%(_i!=enY>c{`jT8>4D>c~JVp^5>PqRJiV_n!j)nbk z3Z!&~c7^ru(7hDN3$95fpS$(i+j|nH-#w;0S{I?@2|@0pNeZMTqbNRbH!+F}mSV`f z6TU>aRcuv)@czcFcv=f@`c}WqIKYYbAZ*LF41Wc`XqL_)3S86J?9O11sF1`KO0h?( zrNzBNTAg$B6>1r{M5gHm*_4Dha6QrtQ9jjbZh6%X+0!=tdXpV`KBY0#^XGYmi;*1M z@BBS)yz$gap--$@`hXe6ii_CwEediGi1#7p51ww&7U zS_aUp2Nj~?1wDuMhjHhejj9MENQ0R!GMfR)kP)6s0R+fzl(dT_hBm-py!F?scL+u< z#kY$#UugV$k1RzddrNbDt|H}PwrM4XoIq^(w>1BZ#NEkF@&2GSirBCCPsWqy5){hr ziH?VvmDiizaPm{MtoVm%jAk~#f2oSb*hh|x1$G&VkpB=BL&)3`@3*XM|1>tp^&B_o>@?`X z($Y+|H6_ym!$QzRX16Ff3eico({I#o&&mL*!UNy-L(@W zJY%K_NkYpWDB8|2S@}lTGa63DOhs#njnsn zFaViken#>7p=;uYa=<-OcDF%lN?H#8$)W@~-CkGP!?@+H7P5vnqk|9R2Iny7=ppZ- z0Ryj8LFQW`K+Fw-$SKO5-4-Z3J^QxSCYy6VV_#k4yB5wvMu^)_Ua8*zCPp>%yna98 znu1r_xA5%iS`LycX8mDhhcR&g2-{aIb>uBO7i;JH(2ItkaQwS3yPf7Px;MrYQ$WvI zay)KH3xTJ749DdcJ1P#@(mnV`V(yJ^u{MCd>uG)5XOoouT(8WS`O1{Hiq~4gu%~K( zbTZ)GLob&{`g+PU&HaIXB>6{;>~puJY-cbcIrz;7Bpd@18TM_g>}jxqor>lI7% zmX@~1T1f1JD>~6$e`uvxhBQ|Mj1HV?xp&ynp|QN0dJBen!3dlf)V;yS>A9)yK;?H~Hb1wNN^eL#g8f%jTOX8lEDx z98(h^=G=vhY>lj~MPlZPC3@AjB^^o}*stF}h0LSH@xQ|LFGqcEG3Y5Aw>nJusA+sc z<$cL+kpSJ!%}>XLeA^}Vhl*KCf+ z4$&_|EZ{eZ@j4F2URqS>Y1fV>5YJ4Kw(%A{rBpIF3-AJa7FJmeYh_ioLjaTN_uw1PkgQW7 zPI|AA@e@DFSIKU0N&@cT0RFW8k_$p}B=T{GlWE6U@!XSBJ>Ey0;Ni0r^T#MF6yFiQ z2FbD1+^b#2t0r`Ne|S%xo4Y1Z64b`UGt%+NmNx-ynSt~g-Ec&T-ela!(o*^hb57U# zAUjb<%DWDB4Ll}~DweiZ2%}cb#;eFa`2g2Nmg<~ zK)Jbi5ZA;TE&N(-lugn1&mlqCJ7h`^xp+$XVPkzc5j>XQ$3v0PaYq^XV~!hb)XjE$ z;$hU~8y3X%K)hL+8XFQ*0b5l!L>qV|0@NiI+#w+NB}?G`g;~@bk6D0uVKrJO8ILfb zWlBxCHRHWwyX(R4--}j*d;)yw2NQf_B`$rLxI&<_-4E|HTRSa+Rm`*_Aa>+(aU7|- zISjSu8&sxNYrZ#xBDd|-74qg43ErW{zQJ&Z9Mz7hBSAp4d=E+1TLL`mSYkM$JLLB zpyh#y8C%nGFj%VaNgAl@lZjm!*lxtboN$=Omvg$+_#*6LYo4|QnGiQuuf=NZeLmn1 z0l(00ZF?nA%4!71T`K1IVlDdet5e-6A@N&B_`8h(jhg}5C1w_I>H>22ND_x)Qd?)Y zw$B*2X8#!#+}~2U=+^|_^OdZJjNkNLVJNv6569v<=~h?BxXm=KM(V6LoH75O%pR_w z?D&^F~UytIR!&cx!}gvO?fO`NYI5HE5f>A`4fesY1ZdV z`Upg|RST=+SuyU(^e37GDt&K<%<_jCn_VDX)YR$7EtJ=6*$PV;1_YdIyCJ4rH&w+V zie!`Q4yxSWWpoD0@nVKdz4HoUU}rZRv$LPTJ??NX-mIHxA-h^%hZ9~FgwX@oamX~} z=rG2E(T^AyV8}FAsI}0)aPwW2g4!ZQ0ob~V)*ZDBn40fo4Eh`uEWB|Be+S(RGzQcF zGmI4^H2GI;7L#gKUt<$E+MDMt;#@>LeA!(V*eKwwqj0h-UaW(yB$>PRgs!ZO2&_+o zZ4uPndn*R|^!Q@(k)zn|*2i3ysnB+=OpL9|l|-c%eO*o|XgJ!wlWRNG~Gw%q^7*E!SZT+FpuaG&y8!BI&IMR2^- zWEHUOA2DG`pAwUEBHHF)SB~<&qKS`tCZM@$1=sIc0=v3xoB8Am)$j{)%Thph80~AX z$eO@rcgqmr8yuy_!AroS^OLz0Bs;aO2IWQ(l2ZlV4*#y9p7(*o;;vdpt#Qkyy z#2s+tx%=U6(}g!{iGk8mQLwPidRd7*t;dK#$0FDC1S^&8u@0P(;pv>%i%eN=n=GY% zG(#Bp*sFW8EFSozJ^y?;K0k%Oi{ZQ+U-Yj8?QX!>c88`jzkdNR4>g`4RL!A3Sz=7T z+``Nxv*7op0LU2<0Mw>jkHJltJpO5grv*#nc z6Sz{w|JC&mf{C0gUMS$O6H@+nf^MhrOxJ5oYH@M?hgYB9PfGC2*bOBp*(pA~`)`j{ zv`)mnh1mZ$^MC%Eivx+YT-AgoqR3!;7FO=IFwSZ9N-?L&vuZ#5Iz$61GT=CM6GY4F z8~L|s2WE!?sY2?+W#(i?c?t=6vpO;aj7>0o<@))1`4EaaPJk?{P9_IG72Y#k@o^YZ6lkDb}zXi-U z;%I-&xEKFUE&~;{#;kt7U6R>f$jjv0qCN2C)Wo}!p^(;DHG&F2U^u1m?;!w(_IxHt z7N;?HV(;s6<`xCTQ^x&kfVjaqMfXI#V96L%>PGQui{^?wrTRVtj#1I#2n&tvsDFu1 zcwsB?tVb0;)$IIxRbb1(!8taZ68?Q=SqzYFXF_VlgalMbNf*4-*?OaXc?7!np`@6d zwMrG9de|N!#xF9UkpHZ@>x^yhZ-sKWBVvGej<9I%QD)%!ElD1__hb!arbpp=yVMy> z@iRon=CQC)E7pVUuiPQ0h@L0s`wE7>XGfodL6?Msxo3CkpwU+H#`tF3jp^~$LVu&L z5+4vb{<83McLJwP5p9lYKL8R;;bO8N?&1}xB6B`mYyT&7K-sge4cU>%pX^U1nRb&S zT1TM(;hLR)A3z{b20arwbnn)AFCkO5T4B+Z)ZQ?~&7Bs8pa9#5;6fJIXc>a4u@fHF zfA%hJ*px=Vll-zeiNF+Mm_VFj(Ha7*2K>%0o~?f^Tvijv>;tM}z`i*AIiijdjWTMX z=SUxMGX3hMu~eg@!4??WyIIf=5v7#@WkvJfDH3aBG1ISf+!|pSGv*7;q&axTJ|x~x z>37_l*EzN$c9K(6r1(3e!)tro`NQzY85~dew;d-abig~|!D0H8Lk$S>(^Vz_5(cBEr?%#imAyran=-Hc%iF=lu^6Uzv2S3M(v*$;f59 zP}j)b-WsPt!sy!e@Gg3nT;ry+j4AlaM4PBH~)B2&(DFi7( zj|g`=nGIJx@d5F4Eb;f}N&16};pAjQK&qePcO_3Z5cklY%!4PI`=Gwp)L!wH==KKJ zNcw^mJ4MVfb1Hi;>l^c~yiqCr0Rp&p>XIa#8yOGVHkz9ZIGzY(Y^LfF5vF`&uf;Q~ zBI|}`k$Gm5Ro<7T18d1-=t~ZzYwxMf#c10%2|L9qmOGi*JxKTyabO#DKScYHIR`TGeC1FpU#Gc2AY|KYTg_pwC3lMI$Mo2XO}-7C}~9}i=fLSJ+>1e`}Dt>2bf zCKcL!b1lp>RZ1Azgp;2aZTT!q1hCy5{-q^{6cB0kqG6ud!<@9LDBciK zrg*YX<*}Vp2yjA@vF~@xZ=4WB-rf9?I_m8lrRs6va?-oW4HQ8?^ckCt=qSfsx6>F$ z3w8d*P~Wz~4+@-&yy9c}(%RH83maAGhxl6mN@8(+OiKij?HRn4~)=n+AvaHjcv zv-eDznM+1f`4k_}$NDXkhz7M=HlRS&HnCbCbt|+|I5f}^#@_tXfmJi{Ho8z&%2~)J}Hbs8$ld8<D+(Yi8_-e-Bf*1(fR0Ys(#Db50Q*F98)o3Bz|;sO1!v#?m~rQDQ1pPJH>VoxE@^_pexbsk+0w21uUr(}Oua_59<6 z!I4eo?%Oe0lL2>6Q>zQ9TRrj)`NX*15!?;L@9(EZ62$IvUgC@Y=4N~PWhd|8=aV}mYuJHi(f2{Id` zBziOQ%o`lLU2M3kdrUI^AFB6T{uRaWOP7lp!W$6i!$@C8;BK(+)90o0A-t3a)khI! zaui`CX3!V6RmTD)l@EV%8E>1o!LN9Awbh)exQGW?C|>|EPPt!M2{J?hmB^K0s*O#e z1AN9p;SW=l%!%b;3S`fkJ7^0ioAT~t?s)h0LE@TXv(;H@)UCNpdxVW-b%00jE-T+; zM|nWl7joy7;=|$(1OAK3+uX;l1C^J2d0F4?D%{bcDSiJks4RrENx({6_C_v?+NuBU0-m)U^+meS^LEf`O*5Q-^$ zbq(q(b8Cri)D7XP$a^yH&)9y(b&&wA=zu5TnB`M$Ihiz)MTch3k(MyP=w*jQ+ z{=aC2uJ2Yw3^QvEqzA~$MQv2;= z5y3Pr0@Yv9V@)$CEHvjzYQ9sovTCshVLb^wS(cgsk2~!rXdF$f;Kl+>b4VpEKIDSw zh;!ds&R{ugKrx1V<3|_uaLw7f+0~ScfywK+CFlABGQpbwJ*yZYY$7@9bjnLmV(LC| zZmQIAhaYl(+@2~2&3sXAl1FQ+kAI6Z<;vrdRR3kWO~j?uktDNBwvAo zz3Tt;-VL44pd~l?N{&zbtL={Fk8xzF8T{JV$}3~c^><|-cM~GG~TNQO;49&&+d!<>8%dp6?M0HG(MRdXjKR zOgf+WT&fTt#ZdE!*Py2G0eL|2>|`FXNXJq1>aW{`bDEB1pwW`h(XW*@Ta!Yw{lHfB z7k`;hEhki+wu9wlk5}eVY(H+y~tAh9MzscKslwi{B1@5VTk}!@|l9_zP^BE5=|CVt!a?gwK^Oz>#^pFuSp9ZZ*5Hws?e^5SK{D!67C}Z6N5&F1remU>+Lgi$vBxwxTX>w zffE!sQdH!&dGhXT$ITTnh?q&HDJx8~zav4DLa=v8BEV#&WvIQnfK_&K!6B5@Wk5=1 zckOiC_&N;7Hg1?`BU;dA7=cwy^t8Opv=xSJ$mJY@VVYg=Lpe#_lw%%;|6ne9 z$|$06)ne8`){i=D`Q|+obkNa1xdqc_MRL(J;lDAb}(S3Hd=ETU>a&? z2ja8qo5s^0!mqVYlq^yF#$Vp=Y;VY~vT9W_}nLJJ{ zmjR7Q(Fx3o_@KhRreRp>^s2=YJM3)st zPu|%WQDcSCVTU+32I_&?o;%FFeEqfn&=E5daT7vLPOLj!xj+DN~@ASWDKpp$s zO&czY)#!Anbfx6;;GiD~5!t~nOEA_|7{Ot`qz;@NDY*TuyRf#(_IAZ~9U?8#wIf1f#%Q;aCp={QyCxediQJAfzuW;JMQCg(xdSH9#R&d8WQ`yNae1B572;6U z3bP%;bqiTnh?1(QkUlTKLdvstU)OHSKuZ-x5<>XlTQv1ul}o>Sb4_-BTBMbNPethA zzrskr|B2{abDAy@v^d4Cf$Fb^d` z66P6-87XgJ(OC;%ccgEE2c8MWM}C=tGPAOoH#_4XRC|~(I^g-nl2L%-(fbj1SZFe$ z-8z6Yy+g`cIO?5W=6>kE#Vl;XNWs@#tTTbJ)8H#}p!~J&2;tx{ zrtAvtcq+8j=`NgFZ0%&0&R}eub=V76#7>RB@9#5Y;ybq;Aax5F6~*M;7foG=^jj`V zLtaWU_vWO9S{@I@K^&gh^Hqs5LipZ}J3idGVvjLX@7UOC5q@DR6n-$oUphw;UzS62 z2$D{&AdK!jK!)7%By(EF>=uf&Y-iFG z^%;uy4ax52&;bnT9(k4C12vo9wHNsnrU?8vN}a`L7nY(Rd-3N+ykNYpKa!4ob*HNrU_r}0a>b$!RvxkyFjL^z_-j59;xqIs9U8Z zcQKp}E8;GZKmM)cP8V8kjooRq^%Zn){A^$M#!C}lXL<_q=XPH?&C2v;qxyO8IJAF* zW18nhs>k3$(VzHHc&?FxzWt%b;@l&9r4VuM`A0s@x9^(WW|kls-j>GwTo0NR)*8h# zV>F$XpLBX4RKF@#-iEDl_K)-&{d%aat^Kx8V+VEMD=e~1tq>S&BULm`V@^e?M(E%b zYg6ChjX3sO=Gz=6_J+@PzWLpL%g%^5%<%YVWV_B=qy^WR@^Ub%4=ecm#aC7SWb7g3dLd{NTN@y zx<3VQu2TI`z`$2vAWuab(@S74?rd`|;K23NUu#sGiAnjgqB(0~?~;j~wAimJsFIE^ zbG$U?>~`b*N8wL8#*D>}63WD>H0K)s&eyWL=uL4>=ajQy=L1dFf>xk5sU7W5jDeF= zU?vvKi1YBESbfip*VSImWxodPyJefu8~|1Ek^5DJ_CQ!~u2IAfMfcqr7PRIm*5UcG zrOoS&_sJ0Qv>zY`E@i!*48M>!6X;zn?bP2;Gv~$aWbUYg;PANyL>=`Uy>^{A`D{Q# z`oCaTqqy4oCMkOS!-9hMx3FyX%G_p=VwI{J#nh}D2A%rMo`o`!Z~S`B7S9bXuQd0} zXm=N-FTL(|O(%Z5GJV$3Z#p|1k)vWLP(m)SA?IrOb_S2GDzEwlgbR{js}C>Scj6=l zJr=(QRZ0;P7Q&nsY~;Vs%!@(EwDW!2&)GJjM{6f*uEz@SSKFWYv+uNLpO~tcAg{B` zGGKi5V|PJ>g0?sT;7PpSwIG(s-9lIfpe68)*k+l*)MO%B9*f7FNOxabalCvp>)VE( zUTcN&czM;aVQ?l^qTSA;c9ZLB-!itDN?))+^!|%z=LrhC zi%Is~H7krAZwSWlG1Yr2gzg1Y_I?QqX3lCTPa%|(CEa&3EzkI-Fg_7R-lHu~XUnMFdzn_T_?l zEO&t87HLrCqHC4-uk12gnU7WIxJb_P1fgfzaa^>Zl#7Nb zIAIyxZ9$gUb}1Z^v^hdg?7QRoffrDq&!${mO#Dh zJ3jyHOigRfAed8mF)$Z-Z9PuRe%b!!=H|SUY(cRV;NV>s&7Pz{TBsQ8VXZl!srY5r z;IKntZ^!aq8uzx68SeB@%JtKgcrjrjjVYUib*XhBRjl%c(-Y!-Q5mF!^davOC(b) zgHUdl!MAR2WH9sOB@l6p%vrYwGHdLIu|S0=+%G1lKL|GJqqtl$B;r3c$dAuehwKor z&Hh`AE$nxL9o$BP-Vi>N<;W5-FaMDZ9UeM0`*}na#}uUNiPNB?bE4UphIGB)D?KAyt?%1OyaJOSRpl5)l!1=j0a|4NelaiGGhh0$S^O$1AJ& zpEblJszoUR&})I$rS8|~Jpkf|ox478XYv*Mekc#vfV^69TfxltJ)8Q?5kMFudHXFA zaB5(Nuf0|j)$tmhPot3J{Rp=W?K?eL8-dAoD-x-kSBR~a$Y;GP`5xx$@nvJerB%!VO8%fIclmD8Q?j#h)mz@`O#e;G+a-# zQFv2c-P0i~^VhMVJ=YU8{AuYul#MaW>@V%(j<@gy{W17Wv!OvMjg}uGqo^3?7jL__&^BOHLs}g#{Q8-<6Nf34GRjh`kMCb_PR)$1 z=-*d)PHmHiIVq-K2SP4!NU58}n<9l3^?)}sF!TP5*fEfdq?>S#$whmfSZE()Z;y6Q z<>14^+L32L9Rdg2xrH3txqn};yK6n?NVsuFXJyJU+3K z{(S)b_MTZjmkh=!rQy827zYg452YZ_S)O#Co-zdErdnLaSnh*U$8!c(>=S1SZ)B>$ zM#9{Re}=zzZPmw*1s0Dm@*5$Vs!Wg2JoTgyr8uKj6pwA5g3Vby^WuFaIMt3k)HYiP z^c)pkRE;k+Qask8=}9wJH*6{lIM^`c(OnU~|8y0OBLhSU7M;$i`Pz<)>TMz%?XvBiv34u{j|>?QJee_-TE0|tfnE1yp6^>^XCv&#@j1@ORM|26KO|s-FJ6d zs7YKiV@mIBD9IS^k|${T^^{oyrD$azXX+lP7{i}z=w5T#=31zJ0^K@ck1Yp22^!K7 z=-pEXW^j@T7?gToJiuq6|DJk@$U&Q60nNYM&JAA*H{+mB7)$5yXA#{4b9+1DMK{Gh z*KzeW*M1IozUulNIlt#m*ORB0D!|<2+`*rxiI8ySaKGeX#R)yPqYSJ~Plt7A`A5c4 z!`o#eZ3TaPgeASdn|sHX=1PdoQd+DK)P3K&g)q{;|8E6853yFZHHnH9vhj*4 zcIqt<4Y<_aP67AFYnF=*kq&N&w?Y+33T~;{#@I{Ds{T>RY0=6fgo*J3LIS`XRn%Yq z?f{e-HaW#{$ie2K>xiZkCxowD%7>B~!g%|E%O~=^uKxL$iZ)(z$vCz-bxPo~7EQ(= zY%N#XEFj^=bITT%s}EwG8&V@Aa9^uGWV?%S9Xsx+9W?D10Vlg^9+*>-cr;uea72Pp z2*@9Qn|9WcEdY*scV+c2x!cdv9kyl;?!xt@`s}vYvb&W`cg)FjSj%0?2+(R7KJbrJ zQwv9StpfKjXK+vD*bfTAa$MSZgMZ>tSolg0N+kA8+Mgx zvC840|Knfda6tbCeEr-7R6jfxGk;Rw$2asJtJ}o;Gs^)gc7FuHw3$@-piVjfsNyic zs?yDsxoLjx7UqEpS-ELvrWS^0p8)F4rs3#!4JzG#95^)x{%M|Sbpw_>azl6lkB87^ zbj5?w;kPQA?@D>*_d{j>f`$CJG#Tef^50(lk&c>CjnVkb zTw&g@`&=#4QmSf`k!zuG@NqrCsU|{dm<0b|34Er62MNMaLbJb{gftiY8hNg5iJx!C zSyM`!{Gh`>Z2J+lD%+h-HBHUzKM^{6mIBt2ShF~i*pvyFIa5q7VP%We#1K=A;TIsQ zbJ9s_)1K}`ah})#NsQC8NMv`;gtDK9ZtrJB7t70>A~CtWbgKJ7vg{5?xsZ3VpTa_i z{F2o7^r~MIQoOf-_SMS8uV$Qfjv@(qi@kMeJr&13*J4e0ae}4!i(wG-l4jCn*sqE) zvqM`_4r4RIP<8to@I`l69H;f?n8U6L6@lCo-p@2{TN+S;U5tG|)_v_}=Y8ckVdfjx zy*&)U=wZvzJz}mGAmX0il+(~XoJPO3_~m;Nc3I%!Jwwq51{+?`z;`}P6`BLuU!eI* z4{;M*y|yM)!p0K&G8^`j)%R*6lLi>4${nj2n}qS(RdI4bsr0{yguUElONSQ(zQ5?K zZ;r-wDwI`ar|?ozd%ch*t;)xX{8}AhQhVlZPw2>L!IX(V<%}2$pj#AT> zl}jF+lC-1Taa5Yogdlo`nbO4bXxnL&iOIk zR#{MM00JEU!z+cI`2LO|(osZ?fE3UEd^16WpiV)9xk8!y9w{I%@6|lP% zNjD^ae2gKGm6bJez?qpdXMtvGVUFamss=?Ok^oV(azIQQv3Csu|t6R>REOjg7jnVp~5Ko*~!hWb?=!6lOQ6P{&BV+<`3S(Ow_LlrAjnBm^%xlN)XKzv;AQ-=7)HP+Vdp7rgJrybVdJ9Dr~FM9`; z@1M&i|Jrlt-ON_)Ld~8DD9pFBM4w4C-y};~BgTEjfZTqaT3pfrC$yA`#}Yjjsa@=q z&kxXKo(0dO2=BqsEwLH4zb&u1ndbh@2Hq}(T{Mj2q8pB9DGsB@<#;=0J@6*%CG79C z^*BmUrm$5(&blo1J84-ckhdqm^uktMWB^D&wt?_R%kb9uUBrp8;3aEMCj$gC4=rFE zO7_SxEu`xn75+gtV;-R03t9JT(Lm1t3y=)IT#1Q99`E7XEp+k#A6HuWCcik~XHrXt<{kyv zAdw>j$C&$~P#v18>)_Z_4LhXRq-AQ!?P+4D86~s*&qd31pm`xBAPbK`@@9cY%&LHg z`-u6)Z!(LDaX5LQ^(&PMX;~DS5>8$>heQ7)fWz#k%=Y$DInvaaAtG7aaU*z;9>PVw zRGF&L2fbucH&1-!Hx5ow73|`c7d8epSx^QciHVQqg0xTxLr`G|}+wPADq= z5&J&Htxqh1xIr2HZEs(8$cPxn+3I(!x%k7su?Az5=TEnhSTh<(xs;pJbOyoWrcN-d zDe@&v!im3-IyKvHN@!bx?+~~3F%L)fdSn&W6kxah?)kD$Eh}%YqbO1<6&3h|cze~u zR>Bn+$IxXVDSVfm-djB>xtvSl(>tq1;WDFDUvyW2=)Mof;w>u_^T<5~bS+8fXMG_L z7I)_``&q_?KT7mf@-59gXT7wP047_q0XfZEb9=GDwL@xfM$t@gjU3oL3}aOB0r}$& zM&!$6?FF3fv@bP=e#mU0U@x;h<^16s6KUK`383pTiMj1w7V9V^`_RPMEi z+82TU&)S#&BL%Q(ZJ_*lmDbII9`;CH27VH1W-KOC+frAqCM-`9*F(CLN*x+Ii}F~UY5$ex@cmD;$nLVM zL-y%xSg8lTL!8~n=T7;ZU9yP}=rF(L%`Tc=*HE&Urg-$)ke-87HhCKwrnI4%thAiu zRz^DkOx^rw9J|7V5!JHdwlaJjNoClE{QL7+x2#Teq+nHS55KtrMnhMBx60I_H0w`6 zbGy=EgHqw@Jx_S=exp_RPpc-g6!#GlV=-zx#K@{2B+8je)OsZXbj)+#Tql+A zAbn>#r_Ji3M_0D_H}_Osy)dri{f+c(iLsa)JlOXq&{vTwa3d)z4K2a}IqU4Pj$2-s zn(1H$%-V>eS7+mNH1CpIqzsGbHpMV%sfqI?3QUNRl3gFNZHXPdVD|V4Y`5gMPFg@Q zJbHDWd^t(hI3{rQweuPU(I1oBeP#_5vU{z2lgK;7ubY7I&d=wXZ%=O6)4UVB?kYT( zfukp{m!t&QEz8B$z0vB>VL?|Ff4!c2W;WM{n(7>LyCHU|b19VIp5qsDmagW#jU6Mi z5mbB<-@^ZghM2d$2;l#Qki(5?{nP&d{Xa+=bWpu>3*jo99F)#KMdBrN~OJIJ2B;Ab?axnFL@E8z3=qqO?{gQi1gsE22z^D zeqvOS=+NlM)+RN!8KWeyPpB^G`!HoNC#-B3wXZi;`EshgE2m}OkzvrlxqbQjm`Ql& zV8%ovC2$4l^^Zvr>ID``qr<#Ot1~LDLowfru9FIZ+ksH0!kQxSHgcm0Wi6he?k+Lm z@%#HZQ{=gjz7dQR|2sWDmw$xl3=_o_Id|Wlv{ZxBg;ZcATT1!TV=lxkcz6X=AV=r2 zwSSx&@0o?`KF9|RpNqaXDYVw?d%|TtmUW1h7>CjHJUYCVJx(VvU{KO z$eHyEbNp9=M}wPjVwvaOm}(o_lS~cShd0!bga6qD;AOCVxE1OQQ)eV)4KwHq{@pxUD(X1tI)EtMG%gY^xIq5PpIc61 zHPkkLb&1BaFLM&fqos&A_uu<2q1fedg&()fef0E*`hq;gsCammddr?Db|t!^zoj1J z?28M218l6=9DR3)&_TWocn0iHaz;teaJc@=F0Gsr)0Img=cMnlLSv!XY>RP`+SOUe{iGC_wDU;_FDNG zVu(J+RqrEc`o{21U}xeoa6|oESvsoLxyM`jq0r=q$?Myv4}+k>gIRX?##xuwCdXs$ z$&1dM--BX&+kuL^JN52b+^1>H6`6iMW)d}J7_O$W)4-be5#+@=16(OXza6| z?kF1i@u4d=iD-*a&PG2xR=n(4*Y^oSL|$`9#-AgG`0&Oc3UFslyrDBB@res$ZMb2p zbfEWM`Es88T6hCVlLtG3QRm5lr!IMkk?8fjh{4{wBI9hmI$2~k?$0=j*1+t9Yv>g` z$`RWn(ZXzv0pybYb$4_pt0mn*A1e)x2j_jg6BoILzLco((0_v)LFQ>VN!RUOziQ>O z@ljXoh<+F3Xq4uc`6thEaz0y{Y~1MjN=;~~owUPm$2MG%hAc2J@KHpGDb8~pB^wVt z9bQ&xnzLS0Jy0_RxB@4n`2=uX%~atZiKlmOFotb3Hc|{*WP@`o4KpEIxB7hy)ac%; zBL|*0Tc7*9vEx-Cui_cxbkg5hap1a}2Pa?E42CyZ=MuJ*9bzrVVhWy-moPG z(wz=}MDM+1W2-SgaDZD_=}^)i@^0( z@p&TBb>j!1r?0PKHTQFdZUx?oyB_P-{I>MFaNtd<+QmTa@gQ!1clIHD;XXfiQD3j^ z%gr6KZH)IZpcNa#4mQsdBA>4|-q8KnxWm6gf;KxXeX}_sQ~vSMs9eP%>jjhF&wZ7O zo}OHHcH7NY%l2*ST4Db3#LRO1xc;d2TWQz22vrU9#zwLJ_5Q&#$k$f4D81^`Hqb59 zJ)+0!K~S*$^5V>jH6;){s9=TFx`^e%s4JS@#}=7wc6z#maWnfwtAhkfBS<2I{kcIU z1Xf=VBf6}N=7<QdbZ&unl?3h$*Fx7kERE z${9->SMx4w`kQ5G7d2%jj)@fZ@4>(RrtzL5dVxtOo)>#u>ptP#(!Y1Qt#-e;_R0{* z;vEjqE$am>;VXs6(c`LyZ60PsHH&i;s(Z>r-$4HXceB_zMtr`+RCR1T9jon|pJUaz zNhh7Ai>`>QR2hD+)Z!k~i9eDsSQ8N;ipZBorrH`0=1oVY5>+2U8hXHk)3&FrraHOk zoI>r_{uh#WCayNE$96P6yKf`e^ah8iv%t(&`1d_nnj<<-lV>>IwQK;6V1#o!r#WO; zvFdi!oJX-Jho4+Gnp3!CGHV1IMvs0U$$IeTVY1AV-QD(3GZypx3@vpen~nYYzW#(9 z`SqJ>A8>pyda&sp87?mh_er_R^f1SnbQO19$PKbbSm1)381uc5v>eX;6KdMZ^;+T9 z5scL1RzuP5U`HV7I3L&w;?)t>PgXhJwxJe$o2_0cZkfyK+ZgA>2&3oPdaa?9l~QE= zOC@0vhCa%9iS@)0Ntq}p_x4--*d_D>iu&0J5({Udvfp0Lca+259E@N;j8{AYrAAD% zZjG1?eMy_H_U2yirQHauNvR*QJvGeG+8lv1@n@UyTSv|4RQJ4@)I>ko-3bk(`A2A6 zTf#AR?GjiHeyo*$@++a@9m_o~Zgi>uHj!17HdZy^%EyxpdmlW<9~9=ZiW(YHS}T~1 zSs@MC$H85%DAXBrOFQ(-ZKXyE-KK78G`t*M(yH>uPMS!RnQEY=LQ6Kr(`zjTA3Avv zN4tG(42gE9VfI>MVx6HmHkd5NeP+Vch$NvD#F+6tl8{^6eN`DeTh69%@*+l9GM$!` zw#ZtW6Ek;KUDiK-KJw(Q<1JrdO0#de@+J^v!O1_}OsJ# zm`5G5NJEdNs>U#%wmEoj7muEZXm!$wW2@vhz;ScGBYK|WV;!|ps>piQ&j?O>kNvB9 za}F!A<&-2m!h$=V`W@UaK(Azv&e~e>peZ()KMUdcnaY4!kEpV=; z;$n>|M}=8bJwJG?=_Ah(T^yH(YKiYtq3T8e5x2bx2r(BeCmVzFDH(D{aD!Q)OK~f! zqDJo`nHn?EN)DT0F$sFgw-biC@koXRo~D`D)4)2|>X!!hk>sCIz!8J@e4Qcw+7^Ai z=wzAJOGvq~jbg*$V!@lh)(cp9Wy?iT0E-bGJt`iqzsMsiym()pXLYCP$;Biuw!HsK z1(MZG)?&J^eF7wo6LCV#Zud%nv_(?{>Pmbihq2wk|>7$go7R0AVcMAm^@)_T$2` zCcO1Xtya>fWd1$1-h2HR9C+Lygz`K{b6kHrQJF7_#G(BpzIJ0J9sOqUd#w8mgkU}h z$@a69%_016;-JGjq{-H37OWahmN#b^A_X96dl=ezS9Bw9-Ur&M@a6eb4{Sk{bB0=J zp%l(&|5p>Lav^P_ioUicNIokiCkv~(VO|M1`Gg$Oub6k5j3&p|R;imD?f2ye zA%}#@?X>PWiaXyU|0ZhAm4c1xm{)tIB#0lvJoJRV2CAusQQ_egP@IxtOk2KT#JGeLs*q zgsWX{nuS*bpo3T+L!F6gnPxqro5V_sIOCJE7iAf-2_3A*K0Cqq*NqCcDByEXB`L|+ ziY7)r&J-9b%%Ha^fvD?PyqNZ|))pax&#{_<6wuGKz6dBaTtF~OP>e6FraV+eu?fgX zzITanF)N1UB_&&D8RHZLQF))E`$z+#HUZRDv)dvSAJ@`^w?${ucJ~kB8!??*S@Frm zsD!{kJbA8t4OG>b$o~*te2~`4&ld18g(rs3vc=_LPa5;Fzzdj+0|TnXSrqDM)u|J? zj+s{(`ettz1cvNuWh2KKb*~C>bubMtDFC8H&I!V&g*T8!tk*i-GdFeW#{9!|y`QZ;>gX!Fp_T#jeJ9?oCucxfLl ziY^YBxR2J^r-vY;YuU{Squ;?n59zEi8ir45&MHsMVvPLhKJ z`_|_O7&@nf;D;;qODYvVv7P-IZ`-PSqWg71T#XpHw=6e!BKfG_?~K=}5uwHUM=NEl zn0eN~jNCZTOHHr3F_n(PaarxU*SBeB>Lnx?Ni2c7gVqB4>sFqlq>Fe9Xe~y=l-Zb> zSm6iIb!Q)Kl=BdeqIFo+GvoLDAtjIVD*CaA@s^t^hq~l@QF&ECeR+)9?kbWeLW+85 zqg;wn4sC(VST&^zr?{p35*0}ggYK;^9;trCI<7M795HLBrqsvAg8Wh@GZa`}5-m`0 zJs9lIse7GlqalMbA6S?3JGuwwl;&dF8Z%<`SlY~hy>t}y^iccE zd5jcc?L<}$Z@Y>*L}PYRYbIb}4<9D^A)?FY=L!9(QT%zuo__y?RtefFm5}K=dIgV@ z9i8IMzpli8$qmYpu4I|d@Vtf!$!z)g8Pa-?tw3BviI?Z5*)p0Fy29g>*ULv(NHR@D z;1xfClDnaCQh8>X$iqB{9lZmLuaQ;*h8z)t(o;XV^$kI$E$&HWHts!9$f8Lj-| zjSv4taOlLj!9Q;*K2a zFqcu<&YFD*B1ymI>b{V?dWFW1)ZvJ)+SHMVWA!Olp^db|N10XfEqZ^NVH$6sQ$2U* zPTR^4fs|pAQx)H#F2wp_Yn_N*{lReI{CCBm{j}eU4`Y{?bGIbtApH0y#1>rP^Bw_a zW1Sh(H1)eWx`y-P9LSfZir0F6!8fp(9W~Y8A-wiHbV5X%*p{HNiIav(yxuj^HqX1h zJGUt!(4G5Sv2AAd<%#4IeP=D;kF|4q19pfy^;&x+PbWr${dvC7`BJ>}dwS*35Ba5B z)kEf|r}IT!Y01_K4aB$%`-67r+v6O@9Iowo=vJFD6V=jH9)0O}Cqxf4J_f-P>6cF; zsXotb{N@?QHfIi^eb6bfa+`5cQC!MAsRezG92c(Fl44?88MRVF*vr{u9p9q zsM=6?+~MuU?<>jN|H8!U}`FN?3*o8Y{4iuP#7;qrz_M#9Du z2un;ctAgh6lr>YOx~cH;^@~TL*-9nvQq^J;!RF%& zNJ&bM*YjD~>GiRdC5`MYpD!$G9yvnVZQEb7yAtBBtWKD(qD=-0EiGgRK1OJg#5s?p zuLlEo?_8d>^Yfe8Q}Mxamt-Dm4JqizH{s@?pf}#qm7%f2c@v5~hebS-1pMlf#}b80 zUv%s&&VVV+cJd(hM}Pyri_Ye1`u3@SQZaz7sOo8jBU@%jIyKH8t<4{5|lP8?5CNv771x zRe}2>Aeyfcm6CLUD2t>0+9_k_T+-nfzi{8dmy~kM#~8pKLoxolYh6aJ+}aVT(I7Cl zsFv$a9<2mRhtyt1l#P!KZOUy)J)S~~ZpCVovGV=e22jgOIFVsQ_{4JNK2$vSBO#`F z3}<4bW%K>}>Ly4BJHlpKrC$x7TWv<Rz zm&9|?0fW>L{%Pfjlh;?teiz;A>p!o?Dk?69W^7vTt2QjI6gkVcK2?mH6=EnqWF)YL zb6!{uSXS{GCDMb3C_cXUmW7N)Bg>SdRZKI>=`GObW?OQYg!1Y zW7dPo16B7P+Jxp}=CY>(=Ufe~gopd0-6O&%ydlP6dG?q7!mG=p2ioftj%~6uLaZmE z*-`|5!{ScBW8P9F^O$Zxm<|O&p}C3nsiQJOjDk@AIAqOwSz$u$?po(cBW45h^R%}? z0qCl27R&8c;Q>6{{KpfJYX)w~2Qkr^vn##fit0K6ql}mu%Z4ctnq;kc4Vkeo)l|+M ziY5+15W6s@Evg%>1H*KY-?^__g_PbebY&`bPH$Fk^xzl0vn?Y&?YHR_s@vDo!e2!` z08`zZd6&#(J8wLBT|X@sebPmco0r z%fsvZUVV|tT=C{u6SfQ+m(s(F7$J#mkMVZT-*j6K2SMSg7 zR$QXD!geN5vv)9X`}i7pU$5|I)l*#LtE|#(>n#roaGJ{5jff&!3+vd4XGwYqI9|k8 zwF46(Gn|QIhEb%tb!-3rOJ%IO3h)sAu?}mw?OTxF#yRL86xUf*lK_$d&7d{e;k}~g zYb09dFsMd9>~!U!K$?vIZT95URQkj*<(jciZgnc1eCP78(<1}LnMUdmjJ{@TUI?W1 zwh#EW)K--%8W_5R4c*_AYf{Yj6Lp_y35=d!>My7Ml@{;<%WYaGz59|36pT$dJ6OK` zUqQ+dQM2k&`?S7fL!dpQ8G%x?Y(4bUOo??3e~u|`On|q^2~4_Wo0IbEyjM`pu*#Zf z{Y`Hg`f|u1bvW|qlQTJ>iqx}t@F$_{yvvZL=|@f?Vv*P@F%aiTEpq0R-FS0x&zIB3 z)`b&|Ggwv*;_cDFkPFL0Kh`kW-|XkQ7knYIFP)Y*gU{_!YrMB$(Xwqf{{Hdj{oTjT zxgk&O`s31x1q+v~IrhIF_uOy12o83!QA_#Rc)_9_$Ig8c{jbU2jqiB_?cTZAs-^zg zZi(GdwV!>hIdPwFWwi{{LHN_pJA1^$v$`+8nu48Odv{JE1uF zF6u|}sXEfwa_K;lN%h#i#erQxJvP$ros*C4btC&R6Juc*wlc^pNOc>5nyQ|NJ9Mb5 zRgg7-(LJ@}KdS^VEBpGQI-T`qDb<*3hP}5FR#(F_jTwv-ji*er#rn%LhNc><8(eA* zX9nAuOk$d05So?sq{(D_slSQI{5KQsTXmOc$4q0mx<^C|!x?U>QFUNgS2ey-D(q8) zBV+-7@TlL0e41IYQ;8s<y!J}G!N?MIdkXGmC_V7!{SI4d$Jpq}g%HN8NqxIyCmXljBpVI6FTvhob zF&)}_7ZHxo9DE%vCc2RLv=2L9(yvIV7&05>&lm~Qi;rJ7`5|U}X;MbDy73WPzUYB0 zspSmo^v-|8_88`GZbXEq&IxZ3Xj#Lw9V4w#LAme@Yp$(v^(e9u8ENOE+S@UAkyXtI z^XZ>|-}N?}uPH+mOE4-%@B0x0mz~NB88(Ax+jdnuzjw8&g(6YrB+T`RC#y|B83MO@ z-?xLO+(|TawH#5o8`n2(tV60r(PYVg@~Fzq7ExV6z2#i0h&bvrncIdcnbN|HyW?Xf z-;rcE%uf<{|J148f{Ae;?*)7QQ$6f!3 zntLxLVOk=~#KNb4O@+E*=P8)pqt}>7+i}8U@ z^kQLUZ$c|L3*{7c^(uuE`2lX-JN(pz6hx(b=1$i+a{EsBhYLq>)fU;4(#YAhQo~F? zA$s^_es9}OwcdZ4-&$>bz*|6`NtQHx%!2$dQ_mX4W-6;!iwFk+){I*&ybkx{*6mq_5! z0UuhwgY*JTo13;|Wrsa_fRDe%J8Q!S#Z8GP^T4e5JYlt-^Xzy#tjA`SmLn|bPe@M~ z|9ZzdYScmcI4PqlL~kppt{?6pA0+pX&pK@ls}2*)#=U)f_fQ-fm39R5^lE9|JA%i-+A9f8LqAR5_`U1Nbu<$neW&NqY5x^EhE1n;INvdl&a84hpt*|^_|qbSU9OlaMI06Zq`FKK#3z={15!qDAA8v}2qMXwV%EU29B;#G?v zB5zt>Wi`%PenrZ>7*sKrBEz3jD((BnHp&vrR5qkaWhN|u}g7n z4h~!{myTvld2bk;@s7T&@p!DX-eFkI+Pd*)~$My2MN5 z_lJU>?#lY$mqW3et+K;J_7}F{ZMhKICL|NA~gXXtXweO&dMI3 zJNAk-9+KNs*NPJav(nySEm~7CS$e;O{%Cb_{WE!^Ezeh~r(0;6#|`;J`Kaf(Q~hv7 z?BnRyl~w!*Qm;Ui`q}eY_P?ywEeCN8845S2*Ddj*l;teoT+0hJMzZ)STCjFea^J4#AN3@$iwg`fi? zr))7f34(5E?*=Ve^;fI@1pb0A|8?+y>*(~k^zQbn6m8+i{cO>UvmZZ)75ssiD-3D!O@$syMh+1oWtlq4JHrHI0OfXT5 z=2NL0a{+bwz6V*m*H@WohipMjSs2G6nly|rcIP!TaA#*l;k`oT-P>wN^da>v8B`fJ zJXsGT$k3>c=3bVn<~gYene=M%{!;j} zENW2&LPW1eqh+#Wsc7=Y%ewHWsp$!euTDDMlO>+A?~;egM3p^8_&%28=!`zKcV2K+ zy_M1Pj19iSx9_1mC@ht0V)T5_NoAg#(voU}JTm>o z$d+eo)Sgokts(3%FUCFxNpZGgXjq50g;gxYnuT$J_19IBMJ2Ov1iLn(3X$uJZqlR4 zt)#@%2)cnH-J;qyrjXluU(N+<`A&c;{mT=&hPB8EyR5uPwE|g^w7FOIFzfB)Vnk|n zJ_hyH`hx8~aQWwCn*UvJHmNt8l>CR7>bT+rseaJhi!cHQ6iZ8J zc)}w4(L~_{^%j zl%-6l!rQp(JLnlURxWi|!@Oo+e(Ajpf~;xz4dFWdLo<)#^ThRT&g2g z1)pZVT&YCfSM_w?AdWex_BMa|Lq*EcFUj;W*j>+kqq1A*s9@|(Pc&WZ9n3aOGpVlA zOr|mqP1@ew;#Jjc6rxaykoMzc!E8g(vC=SA9xQ791J?T+W_$gBkKHXD#hu2O!tC^^ zH0A7W1N+`}m=x1{Y0Gn~5IN-Q$*S+~(k)1BLQHG%=d9|3%$5V-~5c-g=Fm zVML$Id@%XE0;Ed)BJ&>7oh&MEeWKcr{?m4-(0cm9@bnQ~hqumpJ@!=m>;IP#K^PDb zgnadDPE*&9XJ?H{h-=H}3xF#DL#!zTB{F&z7DGjGH_Efu!4R z+yEL+9sMU}_`BUkpxt-}qxRQ!3y!a4{G%^_A^uIF3va!82~uo5`VXW73>DDX*8k6R z=6Rsg9`i(Z9yi~JTd&Jbw&?ThKDGE4a_aW{X<%nCRC4ujgCU zf1bq3^+bdSxP^*t-Fq>pGCr7btK$0*6ndcnDf+!*xO=r!*g#D~8FxK$c{ij|2BBvR z!$Iy%#2*bewj?`9lOsx^{f^F@l46vF{fNwN%a$2CFLLTDQ0K4AY+iIiaoDay*|BBS znI4y0%cadjx>9LA`YUR<8c$BeiJ!@D`?^$M$s_Y`*0Guh3^Jc+SIXV+lV<4-9bHD$LbuU#dy=S#2 z6y@D9wKcdZbDpuJ7{%ET-p1G;?J+-(w~`KGu9?Kn>@~cKTO5E}5`xE|r$m$Cs`Fpv z3?vOaxmrGc&pQ6BYx&)_bA=)It>lBljmDMbtS$(ONkXnJ-R6P0#^CaehN`{MdyxUtP zA9GCP4&54NN4&6x)h?X`?m;NG88iMdXy3aupUTd8nWl@2RUK6#%_Al>3-0F6eLhQl zKPWYK^E_FYv;>Td?;O~6`zMEwCH{HsH#>C`xF1jvX1&e(?p@lba^M6Q{8^t@65a39 zvCsX>{unKz>$Qqn47CUK<2|0NK@In^KUNmpCah9}$gOomM`iuC!yqD`tQ>qLt^Qn# zpNdsV2NaTV)d-sGe==g}qE~%2qsjk_dcbE<-RAXgk2a|H4=5E`w{8?(qD3J2dZY*{ z;YBGU6r?k*nR5AmD!pLQ34;T@G}PoS5Ep3`vkvF8deuLc`O=F;NLSNyt(yL2+7UHV zpFEcp{$h?_{098j?RMIyb^r5Me|@+uXTkCFR^Y%>KZSe2%`Jc_@A|f@^yIHgblTw9 zxu>le&wu?I=yQpk*%62RYyX)9&`vLHdvJ1OknJ?dDHE@~;>A*Qfs%LHz41|8HYF z>;#ej4|0@g0pF{l|6K7i5e1Zi=`MAye=+(-QM^esd-O8vXI66AyFVQeG|I8mqWXf| z^-fUap8YyMlX^Evn$NPcV-lp3a9hQgOLFIz@YF)Ny$X_mS8 z+U_0yt-n}t=ji7BD}Mcc-I1uFKR5(vrZsZ*gEe}-3TnD#@~#%-n(b_@M(?LjC)*BH zbAu32lPm;;&)>Lyd6dal%1jPRv$pk@eC0F8o4nkFRvqiu{hZ-1Uruja?{GOj-by~R z$J5b7+C}LrS0iW1uW)a@B57So9qO#%E?BUQ;&Ae~+b@)6-&r)BZYhg7ZSEvK&`@7* zYQ28!zV3SQmVlmR%#p-_t5J`BY3;V*>#@@y{S_86E8nZ-QkJ>iSkHNVRKi&Q!Ry8= z45H3;s{5FrcpuYIzpTl%-_?W9y$RWWU|-kEUtr) zE?}1E6iPaji(Poud)}`&$Hc!Yeuw_{$Jt*upM00jXztWr7UFyDteuo)Cq7hD)Z*+% z!08GzGr_XRY`prG@&UmY5H zmLZ4`l~Oym|GI~%_0{E$>4x=KlVfF4j(G%G>K)P08mBy|{@}rnD+k(HlGI_CZ`kVb zUx?atW})Kbp0nx)W&o1LHjcnZm$Ka9CMfW2*8t~=7kiF6*N*=d$Vr<1Ui0)9@j3RV z`WJ%}5`MJ)9y@6d5oGSuLl)mp#+Fx;Ry?TQ{;8*~`a{^`2R#qQ1)kHttk24v8;U!7 z=9_vM^UV(ryd0%gzk?jDBYxP**UU}qe)fS;L_eGo%RJngeQAx_72cy7Bfc)dnPb)! z>-uX7J$OYnpf+B{z!45tPL{8JTLRRH&>GWNMx?xRIg$tV8aZ3tVt1~SzwoI}1x&p* z!1l8IAWdfizHr9=Cm#NGRqMKf?xHg}UfaCfgh`S?q4P=GU#51??psBNb9AOp)O|1& z87Dbxm!BPVCIdqU_YJ&pszk{pz@>ywF<%t$HcDlzP=A$BRTpIv-SS>|%PV;j^I_|c z(~Z|S;UcSDzXkGlnHUI$X$lTaNAblTH0@~hX#G!1uy9G#!sY0``4NlCBY=3x)2kEp z(APT=*V(qFd)k!}B{|eL>|siJ1(+rZ@nBr4|%NAB?D$iIn^7@u&D`Sm%Yx%q2~&el_52*vCY43=6_h`w(7x9&>xaX zu6$M@?N@baAipivn4NxRVKuI|ZXPHL9?|#Q8$X-pjvWdpuT4&&gQqbtaT`fVd94@F~$DC(M;u zyhjhps&=;;#qE9adF9-02=A$zURkOqMfaH`&FzI*S-PfS!`9zUY*}!(V8Wii3!i#m z+mo`eo|1y%j+!@R4tm@$$oR)HNe8gvlAU({$oaE`g(Nj2&c|4A%J5rfz8St?!eHh8 zD*?r66`T``w3pv9?JAAMQAzNKaF)Bf3G8-H3~urBh_A=n!Zzxw0uY4s|+bgpi6Kf0vX_X#K0EySlMA?5EZnB;M#v zsy7GYxK=#8nw@g2`j5$wiC)-IbPHWQq{g$qd zq38^R|29nIn&CA5AjPj9inW0hWIFMuU6puA<`aowXr*}Qr|lf^+ZL+|^wBmOY&%vA$=KS%9RzavEux6+|GfEx0{_DSGAWn>Q8SIYi~8bT;pvLfC|o;G2~QW&hPUlIOT3C zW8XMEZo1})`CdBpt#f_IKKR_DcwbzxsLP8|LEjC_V(iO;XQjTiiYQ99`Z*EVhGjy* z$F5I3FyCjaGADg}00ooo#y10suR-8!PmYDPFaiA z_C1e&Q@6_ONlyB93hW zXCOWCg3J39G39Xu>hvDG(A4gnTg4_Xf+E5vTq7*N#5j&Yvxh({<@L{!ibs%RlM4&OfO*h8jsCWDuM&Id zp?@h%JeGydIs^71OUeuM+Iw(A0Ufa|LFu)&?FPgRT@7=s?@Rh$oYp#m#YS5vws00d zi6?6qIlhk@!wR(NYiqrY`T3KeqC6sZ8|6O46;^6H})l{5tc!TCmuZ|5L=$ zoO**oGXx*+W&o<00oy0rr$I_gM_&%*KNx8{XeV&RVnZ}B<0XQpzv7yLQ;QG85?bG;t%th_9hlEp}yxA`2S@)AEwtB zapLIHXis8@9yp_>lOA|MPzaApmC)?O0^Q|Nw^u$GTJXNN$U_jM;Sm{A^oCgSZofF{ zmf7_-w5tJ@$tja$x~16P-qpxIF@Cip(i>k;;Q%oQ=MNXXl%+~Ksy`Ho&5PR`B)=H2 z1BgZOIB#OZ2Ny3d;pG63ARnF;ihVk)dy#KOfM;d8iL6>P{QU_f`w7s;XiE6S1~&mv zuLDeFqV?*{sKJr~n7T-E=_3{eD;Im`M?1dP;O1xOr?+GbpM)ORB_{5V<7U3OeC+D& z?ID#YLKq*JnF0d-$gaRZnpDYM?ATvGoOr|61h<4Gmvb`cu7DA0ejDdhx4@pB70b^T zl$!SX743(Yjm_3{Dn0o60)R=m`MrR9Z+xAe2wQGqRXMTw*lU|IBm*Y&ya)aMsaE+kFD5%QG#Gq+Dr#8b0?AO zD-3Vno^gb1qh}#`7R@`oJ^fE6{x6ocPx=Ek~K!+B3BuLrRWvp)1gh?~h zGNWmE*D-^$OPxnL;%zoMh+m?B6)S@9n_NTEoJN*cdir+TH(iu}u6IrRr()=l`!S&d zS)k7}De8#w+6S9^gbMA;yZp$Xo+Zrak$tS;Mm)wOmCH#!0`^*J<&IW)0B-LsVAph|>rL3ZnX+%JkEew2^;g1T_{>5v? ztB=~`**y5rnql_Wx`VDlTA=%+wPhjSc8YMegB;~Sjc)N%Bn1u<)XQ^G( zjdcg^6l|@~t@&*|UDjxt)02Z!LqH%m`@w=l)&EvCpxQmoj8hdy?jgXR>Qyccn; z>j6>G(H<$UAF(B-7Hfzu%I^;D`6+^Lw7w>^hbQbC590gB6{ndtXLdP&H%)YxjhGP> z1m_D}7q2b4w3$^FI(Tu9!C8WhL)MNxPZod0#$xgD3s!844(>}KL_;Z(4!3bL69ebP zx()&5@IyGFBM1=V&4qCQI39t8iVp4Web4+qBX?dnCcGdRr;h`m3btkBt&f|5`0^!x zdTC8@2Pw(bCeM>x5kip^W;GoFU@1Q^-F^9ktNEqcQV60*6ufV+uBP*|WCPy-6_BQE zH^$~Y$xO>X{)p+AGgEo|QHvvX(od8%msbSb|7;5bP?D3m4mPt#wXv%*VTklz@iFq3 zV6T5-k zz*hiiyc5RSvoIXLSsOz00y z-B-ja%WL-#J?W_-hEQPT0Qy-9y2y`N&9x8f@3HTRQRh!w7hHHMX|D`U0bY;3^=h+q zsQZ`Wr;n}4YcKlCr4U~&c(rU-QRU5ZAb;y4Pe^8)+R?6BpsU%%BeOa3Fj#~P|^3u5CE!=$8;c{ zg(kF{1^}lx-Ng6$B!oE2>vs!QYzKr;$GZME8zPrUkFQH?zRVA^%*X@~L#fuVC|7`i z(PE8$sijXl|6&5fBEsp8WXb*EI&*-eSoJ&AgoY6U&xN%UZXO~3G)E5QuBeg`W4}QLn1Wv&#qvtk+=J?t(lnv zD)%u>JqM$I(7~VgcbprBnE&V0a!|(sJwr!d+f?9kH8Bgtj(S$fU&*NmyC8_*&oyZr z+A~gE;1$DOMJ4iU9sFA8y|G2bnZ)jm>c|I+^tqK2JCR>{iO%$kt{nU6GWOsXXpbs` zKuCD}%ZazmOPVG_>de7R0Nl-WqX9JH*;6)>uv9IxByMnDRi2#k<80WDL`bPDqSB-OAM%opjlsDc60&l#`GnD_a=4n8=ycr76 zDA3Y#`jy6Q=fqSqCgZP@*+CbunS+^Ss88cz3AS<1FA%SVL9ndExG_WUvk`&-L!kH` z{agm)?;0S)xcpbVls!Ah=!GuCw$!w~(USWs11DU{~ z`igF^esIP5>C%Sqxw?2DN^jl^FKaydH`ITk!6*1$$nhBYpb?TvU|Ws7Zg}AjI9jM} zL0U1`QrIPnIFeVMzV4qjJ(jbynp@dadKdMei3s^iYg&W&6)xv5fxoAy`ReKnow~t$V!(dhU(-K5|GVh(hE)JCMGZ2zO|#PsJ?nh~d_wJ@6FCVded{NBI9#=WE`Q2zL54(v$W(ivTg*gKc8Mo`Fw&G7Rd$cWy032N@E?3JJKWWOl=>XZM@@NP( zG2-|9&Ada2DIFE>TA7XzbL-vs=dy@&&|&-YKZ}dc*)Jq9CW!xKb?M(t(dGe`dDl|9 zBYRN6Waijb02ISm)n564UD~Ifws^(u1;vJr0pXj2QZ_`=~=8P^K_+a zhEYb7C%eMPq-B4@TyXz^RlF6PUw~St$1$NES?73>pJxyN4D<=8I;3ZY_>8Y-1icjG zt>yUE*&@fD9-YxTGD2?Z_S6HjjPQce3UCe#|3oWhEJz-j;{=1qd#oDift=~A>p8>? zZ%gAI%(?zdF0s0JWh|hY{-Uf&mE>@qylCcU`7)5Y zM~5^0{XbfPCo@>F*q)l}r%7PnO2DPU+?hb)2t^BfGPk!D11^s z_i22I!#KTX{h^81{&kX9QI+wq)VI|_Pi^?me2sX`DDNI6`0QWoL3-uOywAG?k4hMXpjz zf}kIDD*k6`JA2O}N?%RGTq2y<3vin9hBC8(_W@IBWn*FGOpnbjP8#<2_g4gVt{MOq zWUC!2jM75?olq3gWhF2vXlbZV6qJJO;6%uD*%&fzugbzbhy$Z$Qe(INg3{)e&qQhJ z@wJ&7(qR-}Nz7V29Dp2ki-%hfzpmyf0O><5GXT@Bo!PZ&V0X><)>8CkUoS6?Y5L-? zNPI|oDbd9X6qZ&NR-IR4D(Vjx9JW9AQ;4sXsmG8>sf7QMaCu+rW#6u-up%I*6lUcI z$?{4Ow^1)|Y284~%us{-L*Tidw7*jtSxvPekPgorVu&}hftWsANA&a>k13Zkt$xjL zH!W!jm(&r<%3w*u0FLuY8%b*S!~uBH7~A?hGY~+e6%o(wMc)x)^P%!@6Kw(NT5C2-Y^?F{A6*;7T?Yd~+K>VM!9U&KyZmFD4!GGocokVX2Z*uS zMOjprIR}3RlF}yW@K5=B2IfXvBIItZ`Bj&N0j;m7z^EkvW5XbqfK&l6C@IrwOq=r& zRX=y`XB={%cM+v`reV&#KwaKl)&VfYoY+XOK8hJ~5LYvs^ooOt8>>f^$IzQ216 zHy?&H>Z6SKCl4qIKNG1w)6QEi|yBr zUyA#6?AZAg-j&YxPTxtbP0mfcyWljF=(&{@u3uA=OLDGm$&n9zzCa#cu^s5tG*~hF z*QUy@TS;F*ii^Y!S-zdA3GB)3IxGBbZH!;-=ewu>fQ$-##dg)*G5K@m>?L=B6-?Zx zmCxR$@_s=KB){-qFn#vFxNjG7?=AWkQ5zvXEj2bVHlpvV=Bmk6Hjt8^S4#c-M^+jFnY~C;813Nz}Kktdt4uHsh#jL=3VxL*J*mNQMd#NmPvQ_xPRF7 zcJ+$AS+#58uUbXstywSU7CHOd#!O(My>aPJ%$=C;yZZC~cHc_=8v2?=^V;?`_YR5m zZms=wcKMv$_e~A?;L{=t%o|h8ztl;FKGS=3*}Ha4{u;lOu2-RJfkWb#w_N{cwJyji z-2BepH_LN;*5|tZ?S93&e$861>ZQUL-dxFz-+RV29_BEH#wt#pPi^~e$E3b>&E5Db zV(zN%x0gLWyd`JfhWz-aJNHPwPmjNQY|2*gt)f@C6C$Ihe%mzpLhidw8@C`P<#?7K z$YE;AOFn(88#ovC^v#s5p_%=2ALbPwJN6~U{JQz8zwg%H-m&Rh-EEQ0IeQ=;Mwu`R z5qx19vEtJHHU9f^i*!0%}<{or;-yQ25OC)B9d_!+X>L z{Ed$6Y@yFrU&;@tO-f&M>dwZ(&8wup@Yb*Io_Y4)>OR?${U0P&pOZ%(J#09zfaMpj z+NwV3lKnRd!+~9lH)~$`wMhTExo+X~kHEtHM%?f7uTo|l{Jb@OGs`AKP1DKp?Dez# z*Z+RIw14_O!)rJD`p-u0eCM+3=e)O3za;OUm*}>>{jp3B#ba&>+ZtW%AODt2?l0W- z_-#z>bKs7)Uyf_i&5F;Yihk2ll9XD8)qKD)Bm$8!6-X5{%d zZG#mKz?1oYiWD!O5q$l2c~raf&yZ{%)BOAD&5cNAp4sfMYJuw2J0v%mJ- zE1m0q-S+dnUVm6B{i{ln0o){qqDCtgsnUq#FD`R^%-^VA-ss{lHWkS&a}t=g^0usb zd{W9|&YI(?=VcKUCL_x;=LbtTT6FGgVBtSpH0Rr$Nr-l$LxKR4daQuRBA((624{}T z+3_QdLMSLOsn;@ySf6EKGn~4IZ+4P&6w(}-Ch$;H|Lws?d+W^?-n(u1_HK_L!a;jE x1@3%#=9&-BbnuJ}Zyh5VK4h~R7mEM*<DTPmKLoe?J2dc)I$ztaD0e0s!|0WnusT literal 0 HcmV?d00001 diff --git a/doc/source/_static/print_df_old.png b/doc/source/_static/print_df_old.png new file mode 100644 index 0000000000000000000000000000000000000000..5f458722f1269a91cfe38c1e5d16d26697e23b22 GIT binary patch literal 89239 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

|4C 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. +documentation `. |meltdf|_ ~~~~~~~~~~~~~~~~ diff --git a/doc/source/comparison_with_stata.rst b/doc/source/comparison_with_stata.rst new file mode 100644 index 0000000000000..6c518983d5904 --- /dev/null +++ b/doc/source/comparison_with_stata.rst @@ -0,0 +1,680 @@ +.. currentmodule:: pandas +.. _compare_with_stata: + +Comparison with Stata +********************* +For potential users coming from `Stata `__ +this page is meant to demonstrate how different Stata operations would be +performed in pandas. + +If you're new to pandas, you might want to first read through :ref:`10 Minutes to pandas<10min>` +to familiarize yourself with the library. + +As is customary, we import pandas and NumPy as follows. This means that we can refer to the +libraries as ``pd`` and ``np``, respectively, for the rest of the document. + +.. ipython:: python + + import pandas as pd + import numpy as np + + +.. note:: + + Throughout this tutorial, the pandas ``DataFrame`` will be displayed by calling + ``df.head()``, which displays the first N (default 5) rows of the ``DataFrame``. + This is often used in interactive work (e.g. `Jupyter notebook + `_ or terminal) -- the equivalent in Stata would be: + + .. code-block:: stata + + list in 1/5 + +Data Structures +--------------- + +General Terminology Translation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. csv-table:: + :header: "pandas", "Stata" + :widths: 20, 20 + + ``DataFrame``, data set + column, variable + row, observation + groupby, bysort + ``NaN``, ``.`` + + +``DataFrame`` / ``Series`` +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A ``DataFrame`` in pandas is analogous to a Stata data set -- a two-dimensional +data source with labeled columns that can be of different types. As will be +shown in this document, almost any operation that can be applied to a data set +in Stata can also be accomplished in pandas. + +A ``Series`` is the data structure that represents one column of a +``DataFrame``. Stata doesn't have a separate data structure for a single column, +but in general, working with a ``Series`` is analogous to referencing a column +of a data set in Stata. + +``Index`` +~~~~~~~~~ + +Every ``DataFrame`` and ``Series`` has an ``Index`` -- labels on the +*rows* of the data. Stata does not have an exactly analogous concept. In Stata, a data set's +rows are essentially unlabeled, other than an implicit integer index that can be +accessed with ``_n``. + +In pandas, if no index is specified, an integer index is also used by default +(first row = 0, second row = 1, and so on). While using a labeled ``Index`` or +``MultiIndex`` can enable sophisticated analyses and is ultimately an important +part of pandas to understand, for this comparison we will essentially ignore the +``Index`` and just treat the ``DataFrame`` as a collection of columns. Please +see the :ref:`indexing documentation` for much more on how to use an +``Index`` effectively. + + +Data Input / Output +------------------- + +Constructing a DataFrame from Values +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A Stata data set can be built from specified values by +placing the data after an ``input`` statement and +specifying the column names. + +.. code-block:: stata + + input x y + 1 2 + 3 4 + 5 6 + end + +A pandas ``DataFrame`` can be constructed in many different ways, +but for a small number of values, it is often convenient to specify it as +a Python dictionary, where the keys are the column names +and the values are the data. + +.. ipython:: python + + df = pd.DataFrame({ + 'x': [1, 3, 5], + 'y': [2, 4, 6]}) + df + + +Reading External Data +~~~~~~~~~~~~~~~~~~~~~ + +Like Stata, pandas provides utilities for reading in data from +many formats. The ``tips`` data set, found within the pandas +tests (`csv `_) +will be used in many of the following examples. + +Stata provides ``import delimited`` to read csv data into a data set in memory. +If the ``tips.csv`` file is in the current working directory, we can import it as follows. + +.. code-block:: stata + + import delimited tips.csv + +The pandas method is :func:`read_csv`, which works similarly. Additionally, it will automatically download +the data set if presented with a url. + +.. ipython:: python + + url = 'https://raw.github.com/pandas-dev/pandas/master/pandas/tests/data/tips.csv' + tips = pd.read_csv(url) + tips.head() + +Like ``import delimited``, :func:`read_csv` can take a number of parameters to specify +how the data should be parsed. For example, if the data were instead tab delimited, +did not have column names, and existed in the current working directory, +the pandas command would be: + +.. code-block:: python + + tips = pd.read_csv('tips.csv', sep='\t', header=None) + + # alternatively, read_table is an alias to read_csv with tab delimiter + tips = pd.read_table('tips.csv', header=None) + +Pandas can also read Stata data sets in ``.dta`` format with the :func:`read_stata` function. + +.. code-block:: python + + df = pd.read_stata('data.dta') + +In addition to text/csv and Stata files, pandas supports a variety of other data formats +such as Excel, SAS, HDF5, Parquet, and SQL databases. These are all read via a ``pd.read_*`` +function. See the :ref:`IO documentation` for more details. + + +Exporting Data +~~~~~~~~~~~~~~ + +The inverse of ``import delimited`` in Stata is ``export delimited`` + +.. code-block:: stata + + export delimited tips2.csv + +Similarly in pandas, the opposite of ``read_csv`` is :meth:`DataFrame.to_csv`. + +.. code-block:: python + + tips.to_csv('tips2.csv') + +Pandas can also export to Stata file format with the :meth:`DataFrame.to_stata` method. + +.. code-block:: python + + tips.to_stata('tips2.dta') + + +Data Operations +--------------- + +Operations on Columns +~~~~~~~~~~~~~~~~~~~~~ + +In Stata, arbitrary math expressions can be used with the ``generate`` and +``replace`` commands on new or existing columns. The ``drop`` command drops +the column from the data set. + +.. code-block:: stata + + replace total_bill = total_bill - 2 + generate new_bill = total_bill / 2 + drop new_bill + +pandas provides similar vectorized operations by +specifying the individual ``Series`` in the ``DataFrame``. +New columns can be assigned in the same way. The :meth:`DataFrame.drop` method +drops a column from the ``DataFrame``. + +.. ipython:: python + + tips['total_bill'] = tips['total_bill'] - 2 + tips['new_bill'] = tips['total_bill'] / 2 + tips.head() + + tips = tips.drop('new_bill', axis=1) + +Filtering +~~~~~~~~~ + +Filtering in Stata is done with an ``if`` clause on one or more columns. + +.. code-block:: stata + + list if total_bill > 10 + +DataFrames can be filtered in multiple ways; the most intuitive of which is using +:ref:`boolean indexing `. + +.. ipython:: python + + tips[tips['total_bill'] > 10].head() + +If/Then Logic +~~~~~~~~~~~~~ + +In Stata, an ``if`` clause can also be used to create new columns. + +.. code-block:: stata + + generate bucket = "low" if total_bill < 10 + replace bucket = "high" if total_bill >= 10 + +The same operation in pandas can be accomplished using +the ``where`` method from ``numpy``. + +.. ipython:: python + + tips['bucket'] = np.where(tips['total_bill'] < 10, 'low', 'high') + tips.head() + +.. ipython:: python + :suppress: + + tips = tips.drop('bucket', axis=1) + +Date Functionality +~~~~~~~~~~~~~~~~~~ + +Stata provides a variety of functions to do operations on +date/datetime columns. + +.. code-block:: stata + + generate date1 = mdy(1, 15, 2013) + generate date2 = date("Feb152015", "MDY") + + generate date1_year = year(date1) + generate date2_month = month(date2) + + * shift date to beginning of next month + generate date1_next = mdy(month(date1) + 1, 1, year(date1)) if month(date1) != 12 + replace date1_next = mdy(1, 1, year(date1) + 1) if month(date1) == 12 + generate months_between = mofd(date2) - mofd(date1) + + list date1 date2 date1_year date2_month date1_next months_between + +The equivalent pandas operations are shown below. In addition to these +functions, pandas supports other Time Series features +not available in Stata (such as time zone handling and custom offsets) -- +see the :ref:`timeseries documentation` for more details. + +.. ipython:: python + + tips['date1'] = pd.Timestamp('2013-01-15') + tips['date2'] = pd.Timestamp('2015-02-15') + tips['date1_year'] = tips['date1'].dt.year + tips['date2_month'] = tips['date2'].dt.month + tips['date1_next'] = tips['date1'] + pd.offsets.MonthBegin() + tips['months_between'] = (tips['date2'].dt.to_period('M') - + tips['date1'].dt.to_period('M')) + + tips[['date1','date2','date1_year','date2_month', + 'date1_next','months_between']].head() + +.. ipython:: python + :suppress: + + tips = tips.drop(['date1','date2','date1_year', + 'date2_month','date1_next','months_between'], axis=1) + +Selection of Columns +~~~~~~~~~~~~~~~~~~~~ + +Stata provides keywords to select, drop, and rename columns. + +.. code-block:: stata + + keep sex total_bill tip + + drop sex + + rename total_bill total_bill_2 + +The same operations are expressed in pandas below. Note that in contrast to Stata, these +operations do not happen in place. To make these changes persist, assign the operation back +to a variable. + +.. ipython:: python + + # keep + tips[['sex', 'total_bill', 'tip']].head() + + # drop + tips.drop('sex', axis=1).head() + + # rename + tips.rename(columns={'total_bill': 'total_bill_2'}).head() + + +Sorting by Values +~~~~~~~~~~~~~~~~~ + +Sorting in Stata is accomplished via ``sort`` + +.. code-block:: stata + + sort sex total_bill + +pandas objects have a :meth:`DataFrame.sort_values` method, which +takes a list of columns to sort by. + +.. ipython:: python + + tips = tips.sort_values(['sex', 'total_bill']) + tips.head() + + +String Processing +----------------- + +Finding Length of String +~~~~~~~~~~~~~~~~~~~~~~~~ + +Stata determines the length of a character string with the :func:`strlen` and +:func:`ustrlen` functions for ASCII and Unicode strings, respectively. + +.. code-block:: stata + + generate strlen_time = strlen(time) + generate ustrlen_time = ustrlen(time) + +Python determines the length of a character string with the ``len`` function. +In Python 3, all strings are Unicode strings. ``len`` includes trailing blanks. +Use ``len`` and ``rstrip`` to exclude trailing blanks. + +.. ipython:: python + + tips['time'].str.len().head() + tips['time'].str.rstrip().str.len().head() + + +Finding Position of Substring +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Stata determines the position of a character in a string with the :func:`strpos` function. +This takes the string defined by the first argument and searches for the +first position of the substring you supply as the second argument. + +.. code-block:: stata + + generate str_position = strpos(sex, "ale") + +Python determines the position of a character in a string with the +:func:`find` function. ``find`` searches for the first position of the +substring. If the substring is found, the function returns its +position. Keep in mind that Python indexes are zero-based and +the function will return -1 if it fails to find the substring. + +.. ipython:: python + + tips['sex'].str.find("ale").head() + + +Extracting Substring by Position +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Stata extracts a substring from a string based on its position with the :func:`substr` function. + +.. code-block:: stata + + generate short_sex = substr(sex, 1, 1) + +With pandas you can use ``[]`` notation to extract a substring +from a string by position locations. Keep in mind that Python +indexes are zero-based. + +.. ipython:: python + + tips['sex'].str[0:1].head() + + +Extracting nth Word +~~~~~~~~~~~~~~~~~~~ + +The Stata :func:`word` function returns the nth word from a string. +The first argument is the string you want to parse and the +second argument specifies which word you want to extract. + +.. code-block:: stata + + clear + input str20 string + "John Smith" + "Jane Cook" + end + + generate first_name = word(name, 1) + generate last_name = word(name, -1) + +Python extracts a substring from a string based on its text +by using regular expressions. There are much more powerful +approaches, but this just shows a simple approach. + +.. ipython:: python + + firstlast = pd.DataFrame({'string': ['John Smith', 'Jane Cook']}) + firstlast['First_Name'] = firstlast['string'].str.split(" ", expand=True)[0] + firstlast['Last_Name'] = firstlast['string'].str.rsplit(" ", expand=True)[0] + firstlast + + +Changing Case +~~~~~~~~~~~~~ + +The Stata :func:`strupper`, :func:`strlower`, :func:`strproper`, +:func:`ustrupper`, :func:`ustrlower`, and :func:`ustrtitle` functions +change the case of ASCII and Unicode strings, respectively. + +.. code-block:: stata + + clear + input str20 string + "John Smith" + "Jane Cook" + end + + generate upper = strupper(string) + generate lower = strlower(string) + generate title = strproper(string) + list + +The equivalent Python functions are ``upper``, ``lower``, and ``title``. + +.. ipython:: python + + firstlast = pd.DataFrame({'string': ['John Smith', 'Jane Cook']}) + firstlast['upper'] = firstlast['string'].str.upper() + firstlast['lower'] = firstlast['string'].str.lower() + firstlast['title'] = firstlast['string'].str.title() + firstlast + +Merging +------- + +The following tables will be used in the merge examples + +.. ipython:: python + + df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], + 'value': np.random.randn(4)}) + df1 + df2 = pd.DataFrame({'key': ['B', 'D', 'D', 'E'], + 'value': np.random.randn(4)}) + df2 + +In Stata, to perform a merge, one data set must be in memory +and the other must be referenced as a file name on disk. In +contrast, Python must have both ``DataFrames`` already in memory. + +By default, Stata performs an outer join, where all observations +from both data sets are left in memory after the merge. One can +keep only observations from the initial data set, the merged data set, +or the intersection of the two by using the values created in the +``_merge`` variable. + +.. code-block:: stata + + * First create df2 and save to disk + clear + input str1 key + B + D + D + E + end + generate value = rnormal() + save df2.dta + + * Now create df1 in memory + clear + input str1 key + A + B + C + D + end + generate value = rnormal() + + preserve + + * Left join + merge 1:n key using df2.dta + keep if _merge == 1 + + * Right join + restore, preserve + merge 1:n key using df2.dta + keep if _merge == 2 + + * Inner join + restore, preserve + merge 1:n key using df2.dta + keep if _merge == 3 + + * Outer join + restore + merge 1:n key using df2.dta + +pandas DataFrames have a :meth:`DataFrame.merge` method, which provides +similar functionality. Note that different join +types are accomplished via the ``how`` keyword. + +.. ipython:: python + + inner_join = df1.merge(df2, on=['key'], how='inner') + inner_join + + left_join = df1.merge(df2, on=['key'], how='left') + left_join + + right_join = df1.merge(df2, on=['key'], how='right') + right_join + + outer_join = df1.merge(df2, on=['key'], how='outer') + outer_join + + +Missing Data +------------ + +Like Stata, pandas has a representation for missing data -- the +special float value ``NaN`` (not a number). Many of the semantics +are the same; for example missing data propagates through numeric +operations, and is ignored by default for aggregations. + +.. ipython:: python + + outer_join + outer_join['value_x'] + outer_join['value_y'] + outer_join['value_x'].sum() + +One difference is that missing data cannot be compared to its sentinel value. +For example, in Stata you could do this to filter missing values. + +.. code-block:: stata + + * Keep missing values + list if value_x == . + * Keep non-missing values + list if value_x != . + +This doesn't work in pandas. Instead, the :func:`pd.isna` or :func:`pd.notna` functions +should be used for comparisons. + +.. ipython:: python + + outer_join[pd.isna(outer_join['value_x'])] + outer_join[pd.notna(outer_join['value_x'])] + +Pandas also provides a variety of methods to work with missing data -- some of +which would be challenging to express in Stata. For example, there are methods to +drop all rows with any missing values, replacing missing values with a specified +value, like the mean, or forward filling from previous rows. See the +:ref:`missing data documentation` for more. + +.. ipython:: python + + # Drop rows with any missing value + outer_join.dropna() + + # Fill forwards + outer_join.fillna(method='ffill') + + # Impute missing values with the mean + outer_join['value_x'].fillna(outer_join['value_x'].mean()) + + +GroupBy +------- + +Aggregation +~~~~~~~~~~~ + +Stata's ``collapse`` can be used to group by one or +more key variables and compute aggregations on +numeric columns. + +.. code-block:: stata + + collapse (sum) total_bill tip, by(sex smoker) + +pandas provides a flexible ``groupby`` mechanism that +allows similar aggregations. See the :ref:`groupby documentation` +for more details and examples. + +.. ipython:: python + + tips_summed = tips.groupby(['sex', 'smoker'])['total_bill', 'tip'].sum() + tips_summed.head() + + +Transformation +~~~~~~~~~~~~~~ + +In Stata, if the group aggregations need to be used with the +original data set, one would usually use ``bysort`` with :func:`egen`. +For example, to subtract the mean for each observation by smoker group. + +.. code-block:: stata + + bysort sex smoker: egen group_bill = mean(total_bill) + generate adj_total_bill = total_bill - group_bill + + +pandas ``groubpy`` provides a ``transform`` mechanism that allows +these type of operations to be succinctly expressed in one +operation. + +.. ipython:: python + + gb = tips.groupby('smoker')['total_bill'] + tips['adj_total_bill'] = tips['total_bill'] - gb.transform('mean') + tips.head() + + +By Group Processing +~~~~~~~~~~~~~~~~~~~ + +In addition to aggregation, pandas ``groupby`` can be used to +replicate most other ``bysort`` processing from Stata. For example, +the following example lists the first observation in the current +sort order by sex/smoker group. + +.. code-block:: stata + + bysort sex smoker: list if _n == 1 + +In pandas this would be written as: + +.. ipython:: python + + tips.groupby(['sex','smoker']).first() + + +Other Considerations +-------------------- + +Disk vs Memory +~~~~~~~~~~~~~~ + +Pandas and Stata both operate exclusively in memory. This means that the size of +data able to be loaded in pandas is limited by your machine's memory. +If out of core processing is needed, one possibility is the +`dask.dataframe `_ +library, which provides a subset of pandas functionality for an +on-disk ``DataFrame``. + + diff --git a/doc/source/computation.rst b/doc/source/computation.rst index 4285767654e25..ff06c369e1897 100644 --- a/doc/source/computation.rst +++ b/doc/source/computation.rst @@ -323,7 +323,7 @@ compute the mean absolute deviation on a rolling basis: mad = lambda x: np.fabs(x - x.mean()).mean() @savefig rolling_apply_ex.png - s.rolling(window=60).apply(mad).plot(style='k') + s.rolling(window=60).apply(mad, raw=True).plot(style='k') .. _stats.rolling_window: diff --git a/doc/source/conf.py b/doc/source/conf.py index 46249af8a5a56..d516e67b947ba 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -16,6 +16,7 @@ import re import inspect import importlib +from sphinx.ext.autosummary import _import_by_name import warnings @@ -47,6 +48,10 @@ ]) +# numpydoc is available in the sphinxext directory, and can't be imported +# until sphinxext is available in the Python path +from numpydoc.docscrape import NumpyDocString + # -- General configuration ----------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be @@ -59,9 +64,7 @@ 'sphinx.ext.extlinks', 'sphinx.ext.todo', 'numpydoc', - 'ipython_sphinxext.ipython_directive', - 'ipython_sphinxext.ipython_console_highlighting', - # lowercase didn't work + 'IPython.sphinxext.ipython_directive', 'IPython.sphinxext.ipython_console_highlighting', 'matplotlib.sphinxext.plot_directive', 'sphinx.ext.intersphinx', @@ -86,6 +89,12 @@ if any(re.match("\s*api\s*", l) for l in index_rst_lines): autosummary_generate = True +# numpydoc +# for now use old parameter listing (styling + **kwargs problem) +numpydoc_use_blockquotes = True +# use member listing for attributes +numpydoc_attributes_as_param_list = False + # matplotlib plot directive plot_include_source = True plot_formats = [("png", 90)] @@ -344,6 +353,7 @@ intersphinx_mapping = { 'statsmodels': ('http://www.statsmodels.org/devel/', None), 'matplotlib': ('http://matplotlib.org/', None), + 'pandas-gbq': ('https://pandas-gbq.readthedocs.io/en/latest/', None), 'python': ('https://docs.python.org/3/', None), 'numpy': ('https://docs.scipy.org/doc/numpy/', None), 'scipy': ('https://docs.scipy.org/doc/scipy/reference/', None), @@ -499,9 +509,27 @@ def _replace_pandas_items(self, display_name, sig, summary, real_name): summary = 'Series plotting accessor and method' return (display_name, sig, summary, real_name) + @staticmethod + def _is_deprecated(real_name): + try: + obj, parent, modname = _import_by_name(real_name) + except ImportError: + return False + doc = NumpyDocString(obj.__doc__ or '') + summary = ''.join(doc['Summary'] + doc['Extended Summary']) + return '.. deprecated::' in summary + + def _add_deprecation_prefixes(self, items): + for item in items: + display_name, sig, summary, real_name = item + if self._is_deprecated(real_name): + summary = '(DEPRECATED) %s' % summary + yield display_name, sig, summary, real_name + def get_items(self, names): items = Autosummary.get_items(self, names) items = [self._replace_pandas_items(*item) for item in items] + items = list(self._add_deprecation_prefixes(items)) return items diff --git a/doc/source/contributing.rst b/doc/source/contributing.rst index ff0aa8af611db..6d5ac31c39a62 100644 --- a/doc/source/contributing.rst +++ b/doc/source/contributing.rst @@ -298,6 +298,11 @@ Some other important things to know about the docs: Standard**. Follow the :ref:`pandas docstring guide ` for detailed instructions on how to write a correct docstring. + .. toctree:: + :maxdepth: 2 + + contributing_docstring.rst + - The tutorials make heavy use of the `ipython directive `_ sphinx extension. This directive lets you put code in the documentation which will be run @@ -900,7 +905,7 @@ Documenting your code Changes should be reflected in the release notes located in ``doc/source/whatsnew/vx.y.z.txt``. This file contains an ongoing change log for each release. Add an entry to this file to document your fix, enhancement or (unavoidable) breaking change. Make sure to include the -GitHub issue number when adding your entry (using `` :issue:`1234` `` where `1234` is the +GitHub issue number when adding your entry (using ``:issue:`1234``` where ``1234`` is the issue/pull request number). If your code is an enhancement, it is most likely necessary to add usage @@ -1020,7 +1025,7 @@ release. To submit a pull request: #. Click ``Send Pull Request``. This request then goes to the repository maintainers, and they will review -the code. +the code. .. _contributing.update-pr: @@ -1028,7 +1033,7 @@ Updating your pull request -------------------------- Based on the review you get on your pull request, you will probably need to make -some changes to the code. In that case, you can make them in your branch, +some changes to the code. In that case, you can make them in your branch, add a new commit to that branch, push it to GitHub, and the pull request will be automatically updated. Pushing them to GitHub again is done by:: @@ -1039,7 +1044,7 @@ This will automatically update your pull request with the latest code and restar Another reason you might need to update your pull request is to solve conflicts with changes that have been merged into the master branch since you opened your -pull request. +pull request. To do this, you need to "merge upstream master" in your branch:: @@ -1088,5 +1093,4 @@ The branch will still exist on GitHub, so to delete it there do:: git push origin --delete shiny-new-feature - .. _Gitter: https://gitter.im/pydata/pandas diff --git a/doc/source/contributing_docstring.rst b/doc/source/contributing_docstring.rst index c210bb7050fb8..f80bfd9253764 100644 --- a/doc/source/contributing_docstring.rst +++ b/doc/source/contributing_docstring.rst @@ -82,6 +82,9 @@ about reStructuredText can be found in: - `Quick reStructuredText reference `_ - `Full reStructuredText specification `_ +Pandas has some helpers for sharing docstrings between related classes, see +:ref:`docstring.sharing`. + The rest of this document will summarize all the above guides, and will provide additional convention specific to the pandas project. @@ -916,3 +919,79 @@ plot will be generated automatically when building the documentation. >>> s.plot() """ pass + +.. _docstring.sharing: + +Sharing Docstrings +------------------ + +Pandas has a system for sharing docstrings, with slight variations, between +classes. This helps us keep docstrings consistent, while keeping things clear +for the user reading. It comes at the cost of some complexity when writing. + +Each shared docstring will have a base template with variables, like +``%(klass)s``. The variables filled in later on using the ``Substitution`` +decorator. Finally, docstrings can be appended to with the ``Appender`` +decorator. + +In this example, we'll create a parent docstring normally (this is like +``pandas.core.generic.NDFrame``. Then we'll have two children (like +``pandas.core.series.Series`` and ``pandas.core.frame.DataFrame``). We'll +substitute the children's class names in this docstring. + +.. code-block:: python + + class Parent: + def my_function(self): + """Apply my function to %(klass)s.""" + ... + + class ChildA(Parent): + @Substitution(klass="ChildA") + @Appender(Parent.my_function.__doc__) + def my_function(self): + ... + + class ChildB(Parent): + @Substitution(klass="ChildB") + @Appender(Parent.my_function.__doc__) + def my_function(self): + ... + +The resulting docstrings are + +.. code-block:: python + + >>> print(Parent.my_function.__doc__) + Apply my function to %(klass)s. + >>> print(ChildA.my_function.__doc__) + Apply my function to ChildA. + >>> print(ChildB.my_function.__doc__) + Apply my function to ChildB. + +Notice two things: + +1. We "append" the parent docstring to the children docstrings, which are + initially empty. +2. Python decorators are applied inside out. So the order is Append then + Substitution, even though Substitution comes first in the file. + +Our files will often contain a module-level ``_shared_doc_kwargs`` with some +common substitution values (things like ``klass``, ``axes``, etc). + +You can substitute and append in one shot with something like + +.. code-block:: python + + @Appender(template % _shared_doc_kwargs) + def my_function(self): + ... + +where ``template`` may come from a module-level ``_shared_docs`` dictionary +mapping function names to docstrings. Wherever possible, we prefer using +``Appender`` and ``Substitution``, since the docstring-writing processes is +slightly closer to normal. + +See ``pandas.core.generic.NDFrame.fillna`` for an example template, and +``pandas.core.series.Series.fillna`` and ``pandas.core.generic.frame.fillna`` +for the filled versions. diff --git a/doc/source/cookbook.rst b/doc/source/cookbook.rst index b6690eff89836..893642410af02 100644 --- a/doc/source/cookbook.rst +++ b/doc/source/cookbook.rst @@ -411,6 +411,8 @@ Levels `Flatten Hierarchical columns `__ +.. _cookbook.missing_data: + Missing Data ------------ @@ -494,7 +496,7 @@ Unlike agg, apply's callable is passed a sub-DataFrame which gives you access to def Red(x): return functools.reduce(CumRet,x,1.0) - S.expanding().apply(Red) + S.expanding().apply(Red, raw=True) `Replacing some values with mean of the rest of a group diff --git a/doc/source/extending.rst b/doc/source/extending.rst index 25c4ba4a4a2a3..b94a43480ed93 100644 --- a/doc/source/extending.rst +++ b/doc/source/extending.rst @@ -57,6 +57,13 @@ If you write a custom accessor, make a pull request adding it to our Extension Types --------------- +.. versionadded:: 0.23.0 + +.. warning:: + + The ``ExtensionDtype`` and ``ExtensionArray`` APIs are new and + experimental. They may change between versions without warning. + Pandas defines an interface for implementing data types and arrays that *extend* NumPy's type system. Pandas itself uses the extension system for some types that aren't built into NumPy (categorical, period, interval, datetime with @@ -106,6 +113,24 @@ by some other storage type, like Python lists. See the `extension array source`_ for the interface definition. The docstrings and comments contain guidance for properly implementing the interface. +We provide a test suite for ensuring that your extension arrays satisfy the expected +behavior. To use the test suite, you must provide several pytest fixtures and inherit +from the base test class. The required fixtures are found in +https://github.com/pandas-dev/pandas/blob/master/pandas/tests/extension/conftest.py. + +To use a test, subclass it: + +.. code-block:: python + + from pandas.tests.extension import base + + class TestConstructors(base.BaseConstructorsTests): + pass + + +See https://github.com/pandas-dev/pandas/blob/master/pandas/tests/extension/base/__init__.py +for a list of all the tests available. + .. _extension dtype source: https://github.com/pandas-dev/pandas/blob/master/pandas/core/dtypes/base.py .. _extension array source: https://github.com/pandas-dev/pandas/blob/master/pandas/core/arrays/base.py diff --git a/doc/source/index.rst.template b/doc/source/index.rst.template index 1ef88a524732f..82ed5e36b6c82 100644 --- a/doc/source/index.rst.template +++ b/doc/source/index.rst.template @@ -150,6 +150,7 @@ See the package overview for more detail about what's in the library. comparison_with_r comparison_with_sql comparison_with_sas + comparison_with_stata {% endif -%} {% if include_api -%} api diff --git a/doc/source/install.rst b/doc/source/install.rst index c96d4fbeb4ad2..4713bbb78d633 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -15,6 +15,31 @@ Instructions for installing from source, `PyPI `__, `ActivePython `__, various Linux distributions, or a `development version `__ are also provided. +.. _install.dropping-27: + +Plan for dropping Python 2.7 +---------------------------- + +The Python core team plans to stop supporting Python 2.7 on January 1st, 2020. +In line with `NumPy's plans`_, all pandas releases through December 31, 2018 +will support Python 2. + +The final release before **December 31, 2018** will be the last release to +support Python 2. The released package will continue to be available on +PyPI and through conda. + +Starting **January 1, 2019**, all releases will be Python 3 only. + +If there are people interested in continued support for Python 2.7 past December +31, 2018 (either backporting bugfixes or funding) please reach out to the +maintainers on the issue tracker. + +For more information, see the `Python 3 statement`_ and the `Porting to Python 3 guide`_. + +.. _NumPy's plans: https://github.com/numpy/numpy/blob/master/doc/neps/nep-0014-dropping-python2.7-proposal.rst#plan-for-dropping-python-27-support +.. _Python 3 statement: http://python3statement.org/ +.. _Porting to Python 3 guide: https://docs.python.org/3/howto/pyporting.html + Python version support ---------------------- @@ -137,8 +162,8 @@ pandas can be installed via pip from Installing with ActivePython ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Installation instructions for -`ActivePython `__ can be found +Installation instructions for +`ActivePython `__ can be found `here `__. Versions 2.7 and 3.5 include pandas. @@ -198,7 +223,7 @@ installed), make sure you have `pytest Dependencies ------------ -* `setuptools `__: 3.3.0 or higher +* `setuptools `__: 24.2.0 or higher * `NumPy `__: 1.9.0 or higher * `python-dateutil `__: 2.5.0 or higher * `pytz `__ diff --git a/doc/source/io.rst b/doc/source/io.rst index d6bd81861adee..c5b7eff292722 100644 --- a/doc/source/io.rst +++ b/doc/source/io.rst @@ -20,9 +20,9 @@ plt.close('all') import pandas.util.testing as tm - pd.options.display.max_rows=15 - clipdf = pd.DataFrame({'A':[1,2,3],'B':[4,5,6],'C':['p','q','r']}, - index=['x','y','z']) + pd.options.display.max_rows = 15 + clipdf = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': ['p', 'q', 'r']}, + index=['x', 'y', 'z']) =============================== IO Tools (Text, CSV, HDF5, ...) @@ -130,11 +130,11 @@ index_col : int or sequence or ``False``, default ``None`` MultiIndex is used. If you have a malformed file with delimiters at the end of each line, you might consider ``index_col=False`` to force pandas to *not* use the first column as the index (row names). -usecols : array-like or callable, default ``None`` - Return a subset of the columns. If array-like, all elements must either +usecols : list-like or callable, default ``None`` + Return a subset of the columns. If list-like, all elements must either be positional (i.e. integer indices into the document columns) or strings that correspond to column names provided either by the user in `names` or - inferred from the document header row(s). For example, a valid array-like + inferred from the document header row(s). For example, a valid list-like `usecols` parameter would be ``[0, 1, 2]`` or ``['foo', 'bar', 'baz']``. Element order is ignored, so ``usecols=[0, 1]`` is the same as ``[1, 0]``. To @@ -256,7 +256,7 @@ parse_dates : boolean or list of ints or names or list of lists or dict, default column. - If ``[[1, 3]]`` -> combine columns 1 and 3 and parse as a single date column. - - If ``{'foo' : [1, 3]}`` -> parse columns 1, 3 as date and call result 'foo'. + - If ``{'foo': [1, 3]}`` -> parse columns 1, 3 as date and call result 'foo'. A fast-path exists for iso8601-formatted dates. infer_datetime_format : boolean, default ``False`` If ``True`` and parse_dates is enabled for a column, attempt to infer the @@ -391,7 +391,7 @@ of :func:`~pandas.read_csv`: .. ipython:: python data = "col_1\n1\n2\n'A'\n4.22" - df = pd.read_csv(StringIO(data), converters={'col_1':str}) + df = pd.read_csv(StringIO(data), converters={'col_1': str}) df df['col_1'].apply(type).value_counts() @@ -789,7 +789,7 @@ The simplest case is to just pass in ``parse_dates=True``: .. ipython:: python :suppress: - f = open('foo.csv','w') + f = open('foo.csv', 'w') f.write('date,A,B,C\n20090101,a,1,2\n20090102,b,3,4\n20090103,c,4,5') f.close() @@ -863,7 +863,7 @@ data columns: date_spec = {'nominal': [1, 2], 'actual': [1, 3]} df = pd.read_csv('tmp.csv', header=None, parse_dates=date_spec, - index_col=0) #index is the nominal column + index_col=0) # index is the nominal column df .. note:: @@ -1336,7 +1336,7 @@ column specifications to the `read_fwf` function along with the file name: .. ipython:: python - #Column specifications are a list of half-intervals + # Column specifications are a list of half-intervals colspecs = [(0, 6), (8, 20), (21, 33), (34, 43)] df = pd.read_fwf('bar.csv', colspecs=colspecs, header=None, index_col=0) df @@ -1347,7 +1347,7 @@ column widths for contiguous columns: .. ipython:: python - #Widths are a list of integers + # Widths are a list of integers widths = [6, 14, 13, 10] df = pd.read_fwf('bar.csv', widths=widths, header=None) df @@ -1956,7 +1956,7 @@ Specify dtypes for conversion: .. ipython:: python - pd.read_json('test.json', dtype={'A' : 'float32', 'bools' : 'int8'}).dtypes + pd.read_json('test.json', dtype={'A': 'float32', 'bools': 'int8'}).dtypes Preserve string indices: @@ -2111,8 +2111,8 @@ For line-delimited json files, pandas can also return an iterator which reads in .. ipython:: python jsonl = ''' - {"a":1,"b":2} - {"a":3,"b":4} + {"a": 1, "b": 2} + {"a": 3, "b": 4} ''' df = pd.read_json(jsonl, lines=True) df @@ -2263,7 +2263,7 @@ round-trippable manner. new_df.dtypes Please note that the literal string 'index' as the name of an :class:`Index` -is not round-trippable, nor are any names beginning with 'level_' within a +is not round-trippable, nor are any names beginning with ``'level_'`` within a :class:`MultiIndex`. These are used by default in :func:`DataFrame.to_json` to indicate missing values and the subsequent read cannot distinguish the intent. @@ -2784,14 +2784,14 @@ Using None to get all sheets: .. code-block:: python # Returns a dictionary of DataFrames - read_excel('path_to_file.xls',sheet_name=None) + read_excel('path_to_file.xls', sheet_name=None) Using a list to get multiple sheets: .. code-block:: python # Returns the 1st and 4th sheet, as a dictionary of DataFrames. - read_excel('path_to_file.xls',sheet_name=['Sheet1',3]) + read_excel('path_to_file.xls', sheet_name=['Sheet1', 3]) ``read_excel`` can read more than one sheet, by setting ``sheet_name`` to either a list of sheet names, a list of sheet positions, or ``None`` to read all sheets. @@ -2812,10 +2812,10 @@ For example, to read in a ``MultiIndex`` index without names: .. ipython:: python - df = pd.DataFrame({'a':[1,2,3,4], 'b':[5,6,7,8]}, - index=pd.MultiIndex.from_product([['a','b'],['c','d']])) + df = pd.DataFrame({'a':[1, 2, 3, 4], 'b':[5, 6, 7, 8]}, + index=pd.MultiIndex.from_product([['a', 'b'],['c', 'd']])) df.to_excel('path_to_file.xlsx') - df = pd.read_excel('path_to_file.xlsx', index_col=[0,1]) + df = pd.read_excel('path_to_file.xlsx', index_col=[0, 1]) df If the index has level names, they will parsed as well, using the same @@ -2834,10 +2834,9 @@ should be passed to ``index_col`` and ``header``: .. ipython:: python - df.columns = pd.MultiIndex.from_product([['a'],['b', 'd']], names=['c1', 'c2']) + df.columns = pd.MultiIndex.from_product([['a'], ['b', 'd']], names=['c1', 'c2']) df.to_excel('path_to_file.xlsx') - df = pd.read_excel('path_to_file.xlsx', - index_col=[0,1], header=[0,1]) + df = pd.read_excel('path_to_file.xlsx', index_col=[0, 1], header=[0, 1]) df .. ipython:: python @@ -2868,7 +2867,7 @@ indices to be parsed. read_excel('path_to_file.xls', 'Sheet1', usecols=[0, 2, 3]) -Element order is ignored, so ``usecols=[0,1]`` is the same as ``[1,0]``. +Element order is ignored, so ``usecols=[0, 1]`` is the same as ``[1, 0]``. Parsing Dates +++++++++++++ @@ -3095,7 +3094,7 @@ applications (CTRL-V on many operating systems). Here we illustrate writing a .. ipython:: python - df = pd.DataFrame(randn(5,3)) + df = pd.DataFrame(randn(5, 3)) df df.to_clipboard() pd.read_clipboard() @@ -3231,30 +3230,30 @@ both on the writing (serialization), and reading (deserialization). .. ipython:: python - df = pd.DataFrame(np.random.rand(5,2),columns=list('AB')) + df = pd.DataFrame(np.random.rand(5, 2), columns=list('AB')) df.to_msgpack('foo.msg') pd.read_msgpack('foo.msg') - s = pd.Series(np.random.rand(5),index=pd.date_range('20130101',periods=5)) + s = pd.Series(np.random.rand(5), index=pd.date_range('20130101', periods=5)) You can pass a list of objects and you will receive them back on deserialization. .. ipython:: python - pd.to_msgpack('foo.msg', df, 'foo', np.array([1,2,3]), s) + pd.to_msgpack('foo.msg', df, 'foo', np.array([1, 2, 3]), s) pd.read_msgpack('foo.msg') You can pass ``iterator=True`` to iterate over the unpacked results: .. ipython:: python - for o in pd.read_msgpack('foo.msg',iterator=True): + for o in pd.read_msgpack('foo.msg', iterator=True): print(o) You can pass ``append=True`` to the writer to append to an existing pack: .. ipython:: python - df.to_msgpack('foo.msg',append=True) + df.to_msgpack('foo.msg', append=True) pd.read_msgpack('foo.msg') Unlike other io methods, ``to_msgpack`` is available on both a per-object basis, @@ -3264,7 +3263,8 @@ pandas objects. .. ipython:: python - pd.to_msgpack('foo2.msg', { 'dict' : [ { 'df' : df }, { 'string' : 'foo' }, { 'scalar' : 1. }, { 's' : s } ] }) + pd.to_msgpack('foo2.msg', {'dict': [{ 'df': df }, {'string': 'foo'}, + {'scalar': 1.}, {'s': s}]}) pd.read_msgpack('foo2.msg') .. ipython:: python @@ -3392,8 +3392,8 @@ similar to how ``read_csv`` and ``to_csv`` work. .. ipython:: python df_tl = pd.DataFrame(dict(A=list(range(5)), B=list(range(5)))) - df_tl.to_hdf('store_tl.h5','table',append=True) - pd.read_hdf('store_tl.h5', 'table', where = ['index>2']) + df_tl.to_hdf('store_tl.h5','table', append=True) + pd.read_hdf('store_tl.h5', 'table', where=['index>2']) .. ipython:: python :suppress: @@ -3411,17 +3411,17 @@ HDFStore will by default not drop rows that are all missing. This behavior can b .. ipython:: python - df_with_missing = pd.DataFrame({'col1':[0, np.nan, 2], - 'col2':[1, np.nan, np.nan]}) + df_with_missing = pd.DataFrame({'col1': [0, np.nan, 2], + 'col2': [1, np.nan, np.nan]}) df_with_missing df_with_missing.to_hdf('file.h5', 'df_with_missing', - format = 'table', mode='w') + format='table', mode='w') pd.read_hdf('file.h5', 'df_with_missing') df_with_missing.to_hdf('file.h5', 'df_with_missing', - format = 'table', mode='w', dropna=True) + format='table', mode='w', dropna=True) pd.read_hdf('file.h5', 'df_with_missing') @@ -3434,21 +3434,21 @@ This is also true for the major axis of a ``Panel``: .. ipython:: python - matrix = [[[np.nan, np.nan, np.nan],[1,np.nan,np.nan]], - [[np.nan, np.nan, np.nan], [np.nan,5,6]], - [[np.nan, np.nan, np.nan],[np.nan,3,np.nan]]] + matrix = [[[np.nan, np.nan, np.nan], [1, np.nan, np.nan]], + [[np.nan, np.nan, np.nan], [np.nan, 5, 6]], + [[np.nan, np.nan, np.nan], [np.nan, 3, np.nan]]] - panel_with_major_axis_all_missing = pd.Panel(matrix, - items=['Item1', 'Item2','Item3'], - major_axis=[1,2], + panel_with_major_axis_all_missing=pd.Panel(matrix, + items=['Item1', 'Item2', 'Item3'], + major_axis=[1, 2], minor_axis=['A', 'B', 'C']) panel_with_major_axis_all_missing panel_with_major_axis_all_missing.to_hdf('file.h5', 'panel', - dropna = True, - format='table', - mode='w') + dropna=True, + format='table', + mode='w') reloaded = pd.read_hdf('file.h5', 'panel') reloaded @@ -3596,13 +3596,13 @@ defaults to `nan`. .. ipython:: python - df_mixed = pd.DataFrame({ 'A' : randn(8), - 'B' : randn(8), - 'C' : np.array(randn(8),dtype='float32'), - 'string' :'string', - 'int' : 1, - 'bool' : True, - 'datetime64' : pd.Timestamp('20010102')}, + df_mixed = pd.DataFrame({'A': randn(8), + 'B': randn(8), + 'C': np.array(randn(8), dtype='float32'), + 'string':'string', + 'int': 1, + 'bool': True, + 'datetime64': pd.Timestamp('20010102')}, index=list(range(8))) df_mixed.loc[df_mixed.index[3:5], ['A', 'B', 'string', 'datetime64']] = np.nan @@ -3631,7 +3631,7 @@ storing/selecting from homogeneous index ``DataFrames``. columns=['A', 'B', 'C']) df_mi - store.append('df_mi',df_mi) + store.append('df_mi', df_mi) store.select('df_mi') # the levels are automatically included as data columns @@ -3679,15 +3679,15 @@ These rules are similar to how boolean expressions are used in pandas for indexi The following are valid expressions: -- ``'index>=date'`` -- ``"columns=['A', 'D']"`` +- ``'index >= date'`` +- ``"columns = ['A', 'D']"`` - ``"columns in ['A', 'D']"`` -- ``'columns=A'`` -- ``'columns==A'`` -- ``"~(columns=['A','B'])"`` -- ``'index>df.index[3] & string="bar"'`` -- ``'(index>df.index[3] & index<=df.index[6]) | string="bar"'`` -- ``"ts>=Timestamp('2012-02-01')"`` +- ``'columns = A'`` +- ``'columns == A'`` +- ``"~(columns = ['A', 'B'])"`` +- ``'index > df.index[3] & string = "bar"'`` +- ``'(index > df.index[3] & index <= df.index[6]) | string = "bar"'`` +- ``"ts >= Timestamp('2012-02-01')"`` - ``"major_axis>=20130101"`` The ``indexers`` are on the left-hand side of the sub-expression: @@ -3699,7 +3699,7 @@ The right-hand side of the sub-expression (after a comparison operator) can be: - functions that will be evaluated, e.g. ``Timestamp('2012-02-01')`` - strings, e.g. ``"bar"`` - date-like, e.g. ``20130101``, or ``"20130101"`` -- lists, e.g. ``"['A','B']"`` +- lists, e.g. ``"['A', 'B']"`` - variables that are defined in the local names space, e.g. ``date`` .. note:: @@ -3737,26 +3737,27 @@ Here are some examples: .. ipython:: python - dfq = pd.DataFrame(randn(10,4),columns=list('ABCD'),index=pd.date_range('20130101',periods=10)) - store.append('dfq',dfq,format='table',data_columns=True) + dfq = pd.DataFrame(randn(10, 4), columns=list('ABCD'), + index=pd.date_range('20130101', periods=10)) + store.append('dfq', dfq, format='table', data_columns=True) Use boolean expressions, with in-line function evaluation. .. ipython:: python - store.select('dfq',"index>pd.Timestamp('20130104') & columns=['A', 'B']") + store.select('dfq', "index>pd.Timestamp('20130104') & columns=['A', 'B']") Use and inline column reference .. ipython:: python - store.select('dfq',where="A>0 or C>0") + store.select('dfq', where="A>0 or C>0") Works with a Panel as well. .. ipython:: python - store.append('wp',wp) + store.append('wp', wp) store store.select('wp', "major_axis>pd.Timestamp('20000102') & minor_axis=['A', 'B']") @@ -3777,7 +3778,7 @@ space. These are in terms of the total number of rows in a table. wp.to_frame() # limiting the search - store.select('wp',"major_axis>20000102 & minor_axis=['A','B']", + store.select('wp', "major_axis>20000102 & minor_axis=['A', 'B']", start=0, stop=10) .. note:: @@ -3801,11 +3802,11 @@ specified in the format: ``()``, where float may be signed (and fra .. ipython:: python from datetime import timedelta - dftd = pd.DataFrame(dict(A = pd.Timestamp('20130101'), B = [ pd.Timestamp('20130101') + timedelta(days=i,seconds=10) for i in range(10) ])) - dftd['C'] = dftd['A']-dftd['B'] + dftd = pd.DataFrame(dict(A = pd.Timestamp('20130101'), B = [ pd.Timestamp('20130101') + timedelta(days=i, seconds=10) for i in range(10) ])) + dftd['C'] = dftd['A'] - dftd['B'] dftd - store.append('dftd',dftd,data_columns=True) - store.select('dftd',"C<'-3.5D'") + store.append('dftd', dftd, data_columns=True) + store.select('dftd', "C<'-3.5D'") Indexing ++++++++ @@ -3837,10 +3838,10 @@ Oftentimes when appending large amounts of data to a store, it is useful to turn .. ipython:: python - df_1 = pd.DataFrame(randn(10,2),columns=list('AB')) - df_2 = pd.DataFrame(randn(10,2),columns=list('AB')) + df_1 = pd.DataFrame(randn(10, 2), columns=list('AB')) + df_2 = pd.DataFrame(randn(10, 2), columns=list('AB')) - st = pd.HDFStore('appends.h5',mode='w') + st = pd.HDFStore('appends.h5', mode='w') st.append('df', df_1, data_columns=['B'], index=False) st.append('df', df_2, data_columns=['B'], index=False) st.get_storer('df').table @@ -3862,6 +3863,8 @@ Then create the index when finished appending. See `here `__ for how to create a completely-sorted-index (CSI) on an existing store. +.. _io.hdf5-query-data-columns: + Query via Data Columns ++++++++++++++++++++++ @@ -3876,15 +3879,15 @@ be ``data_columns``. df_dc = df.copy() df_dc['string'] = 'foo' - df_dc.loc[df_dc.index[4:6], 'string'] = np.nan - df_dc.loc[df_dc.index[7:9], 'string'] = 'bar' + df_dc.loc[df_dc.index[4: 6], 'string'] = np.nan + df_dc.loc[df_dc.index[7: 9], 'string'] = 'bar' df_dc['string2'] = 'cool' - df_dc.loc[df_dc.index[1:3], ['B','C']] = 1.0 + df_dc.loc[df_dc.index[1: 3], ['B', 'C']] = 1.0 df_dc # on-disk operations store.append('df_dc', df_dc, data_columns = ['B', 'C', 'string', 'string2']) - store.select('df_dc', where='B>0') + store.select('df_dc', where='B > 0') # getting creative store.select('df_dc', 'B > 0 & C > 0 & string == foo') @@ -3939,9 +3942,9 @@ chunks. store.append('dfeq', dfeq, data_columns=['number']) def chunks(l, n): - return [l[i:i+n] for i in range(0, len(l), n)] + return [l[i: i+n] for i in range(0, len(l), n)] - evens = [2,4,6,8,10] + evens = [2, 4, 6, 8, 10] coordinates = store.select_as_coordinates('dfeq', 'number=evens') for c in chunks(coordinates, 2): print(store.select('dfeq', where=c)) @@ -3973,11 +3976,12 @@ Sometimes you want to get the coordinates (a.k.a the index locations) of your qu .. ipython:: python - df_coord = pd.DataFrame(np.random.randn(1000,2),index=pd.date_range('20000101',periods=1000)) - store.append('df_coord',df_coord) - c = store.select_as_coordinates('df_coord','index>20020101') - c.summary() - store.select('df_coord',where=c) + df_coord = pd.DataFrame(np.random.randn(1000, 2), + index=pd.date_range('20000101', periods=1000)) + store.append('df_coord', df_coord) + c = store.select_as_coordinates('df_coord', 'index > 20020101') + c + store.select('df_coord', where=c) .. _io.hdf5-where_mask: @@ -3990,11 +3994,12 @@ a datetimeindex which are 5. .. ipython:: python - df_mask = pd.DataFrame(np.random.randn(1000,2),index=pd.date_range('20000101',periods=1000)) - store.append('df_mask',df_mask) - c = store.select_column('df_mask','index') - where = c[pd.DatetimeIndex(c).month==5].index - store.select('df_mask',where=where) + df_mask = pd.DataFrame(np.random.randn(1000, 2), + index=pd.date_range('20000101', periods=1000)) + store.append('df_mask', df_mask) + c = store.select_column('df_mask', 'index') + where = c[pd.DatetimeIndex(c).month == 5].index + store.select('df_mask', where=where) Storer Object ^^^^^^^^^^^^^ @@ -4093,7 +4098,7 @@ the table using a ``where`` that selects all but the missing data. .. ipython:: python # returns the number of rows deleted - store.remove('wp', 'major_axis>20000102' ) + store.remove('wp', 'major_axis > 20000102' ) store.select('wp') .. warning:: @@ -4169,7 +4174,8 @@ Enable compression for all objects within the file: .. code-block:: python - store_compressed = pd.HDFStore('store_compressed.h5', complevel=9, complib='blosc:blosclz') + store_compressed = pd.HDFStore('store_compressed.h5', complevel=9, + complib='blosc:blosclz') Or on-the-fly compression (this only applies to tables) in stores where compression is not enabled: @@ -4264,13 +4270,13 @@ stored in a more efficient manner. .. ipython:: python - dfcat = pd.DataFrame({ 'A' : pd.Series(list('aabbcdba')).astype('category'), - 'B' : np.random.randn(8) }) + dfcat = pd.DataFrame({'A': pd.Series(list('aabbcdba')).astype('category'), + 'B': np.random.randn(8) }) dfcat dfcat.dtypes cstore = pd.HDFStore('cats.h5', mode='w') cstore.append('dfcat', dfcat, format='table', data_columns=['A']) - result = cstore.select('dfcat', where="A in ['b','c']") + result = cstore.select('dfcat', where="A in ['b', 'c']") result result.dtypes @@ -4307,16 +4313,16 @@ Passing a ``min_itemsize`` dict will cause all passed columns to be created as * .. ipython:: python - dfs = pd.DataFrame(dict(A = 'foo', B = 'bar'),index=list(range(5))) + dfs = pd.DataFrame(dict(A='foo', B='bar'), index=list(range(5))) dfs # A and B have a size of 30 - store.append('dfs', dfs, min_itemsize = 30) + store.append('dfs', dfs, min_itemsize=30) store.get_storer('dfs').table # A is created as a data_column with a size of 30 # B is size is calculated - store.append('dfs2', dfs, min_itemsize = { 'A' : 30 }) + store.append('dfs2', dfs, min_itemsize={'A': 30}) store.get_storer('dfs2').table **nan_rep** @@ -4326,7 +4332,7 @@ You could inadvertently turn an actual ``nan`` value into a missing value. .. ipython:: python - dfss = pd.DataFrame(dict(A = ['foo','bar','nan'])) + dfss = pd.DataFrame(dict(A=['foo', 'bar', 'nan'])) dfss store.append('dfss', dfss) @@ -4356,7 +4362,7 @@ It is possible to write an ``HDFStore`` object that can easily be imported into np.random.seed(1) df_for_r = pd.DataFrame({"first": np.random.rand(100), "second": np.random.rand(100), - "class": np.random.randint(0, 2, (100,))}, + "class": np.random.randint(0, 2, (100, ))}, index=range(100)) df_for_r.head() @@ -4594,7 +4600,8 @@ Read only certain columns of a parquet file. .. ipython:: python - result = pd.read_parquet('example_fp.parquet', engine='fastparquet', columns=['a', 'b']) + result = pd.read_parquet('example_fp.parquet', + engine='fastparquet', columns=['a', 'b']) result.dtypes @@ -4844,7 +4851,8 @@ variant appropriate for your database. from pandas.io import sql sql.execute('SELECT * FROM table_name', engine) - sql.execute('INSERT INTO table_name VALUES(?, ?, ?)', engine, params=[('id', 1, 12.2, True)]) + sql.execute('INSERT INTO table_name VALUES(?, ?, ?)', engine, + params=[('id', 1, 12.2, True)]) Engine connection examples @@ -4886,7 +4894,8 @@ Use :func:`sqlalchemy.text` to specify query parameters in a backend-neutral way .. ipython:: python import sqlalchemy as sa - pd.read_sql(sa.text('SELECT * FROM data where Col_1=:col1'), engine, params={'col1': 'X'}) + pd.read_sql(sa.text('SELECT * FROM data where Col_1=:col1'), + engine, params={'col1': 'X'}) If you have an SQLAlchemy description of your database you can express where conditions using SQLAlchemy expressions @@ -5304,34 +5313,34 @@ And here's the code: sql_db.close() def test_hdf_fixed_write(df): - df.to_hdf('test_fixed.hdf','test',mode='w') + df.to_hdf('test_fixed.hdf', 'test', mode='w') def test_hdf_fixed_read(): - pd.read_hdf('test_fixed.hdf','test') + pd.read_hdf('test_fixed.hdf', 'test') def test_hdf_fixed_write_compress(df): - df.to_hdf('test_fixed_compress.hdf','test',mode='w',complib='blosc') + df.to_hdf('test_fixed_compress.hdf', 'test', mode='w', complib='blosc') def test_hdf_fixed_read_compress(): - pd.read_hdf('test_fixed_compress.hdf','test') + pd.read_hdf('test_fixed_compress.hdf', 'test') def test_hdf_table_write(df): - df.to_hdf('test_table.hdf','test',mode='w',format='table') + df.to_hdf('test_table.hdf', 'test', mode='w', format='table') def test_hdf_table_read(): - pd.read_hdf('test_table.hdf','test') + pd.read_hdf('test_table.hdf', 'test') def test_hdf_table_write_compress(df): - df.to_hdf('test_table_compress.hdf','test',mode='w',complib='blosc',format='table') + df.to_hdf('test_table_compress.hdf', 'test', mode='w', complib='blosc', format='table') def test_hdf_table_read_compress(): - pd.read_hdf('test_table_compress.hdf','test') + pd.read_hdf('test_table_compress.hdf', 'test') def test_csv_write(df): - df.to_csv('test.csv',mode='w') + df.to_csv('test.csv', mode='w') def test_csv_read(): - pd.read_csv('test.csv',index_col=0) + pd.read_csv('test.csv', index_col=0) def test_feather_write(df): df.to_feather('test.feather') diff --git a/doc/source/merging.rst b/doc/source/merging.rst index cfd3f9e88e4ea..74b21c21252ec 100644 --- a/doc/source/merging.rst +++ b/doc/source/merging.rst @@ -583,7 +583,7 @@ and ``right`` is a subclass of DataFrame, the return type will still be ``merge`` is a function in the pandas namespace, and it is also available as a ``DataFrame`` instance method :meth:`~DataFrame.merge`, with the calling -``DataFrame `` being implicitly considered the left object in the join. +``DataFrame`` being implicitly considered the left object in the join. The related :meth:`~DataFrame.join` method, uses ``merge`` internally for the index-on-index (by default) and column(s)-on-index join. If you are joining on @@ -1202,7 +1202,7 @@ Overlapping value columns ~~~~~~~~~~~~~~~~~~~~~~~~~ The merge ``suffixes`` argument takes a tuple of list of strings to append to -overlapping column names in the input ``DataFrame``s to disambiguate the result +overlapping column names in the input ``DataFrame``\ s to disambiguate the result columns: .. ipython:: python diff --git a/doc/source/missing_data.rst b/doc/source/missing_data.rst index ee0e2c7462f66..3950e4c80749b 100644 --- a/doc/source/missing_data.rst +++ b/doc/source/missing_data.rst @@ -75,7 +75,7 @@ arise and we wish to also consider that "missing" or "not available" or "NA". To make detecting missing values easier (and across different array dtypes), pandas provides the :func:`isna` and :func:`notna` functions, which are also methods on -``Series`` and ``DataFrame`` objects: +Series and DataFrame objects: .. ipython:: python @@ -170,9 +170,8 @@ The descriptive statistics and computational methods discussed in the account for missing data. For example: * When summing data, NA (missing) values will be treated as zero. -* If the data are all NA, the result will be NA. -* Methods like **cumsum** and **cumprod** ignore NA values, but preserve them - in the resulting arrays. +* If the data are all NA, the result will be 0. +* Cumulative methods like :meth:`~DataFrame.cumsum` and :meth:`~DataFrame.cumprod` ignore NA values by default, but preserve them in the resulting arrays. To override this behaviour and include NA values, use ``skipna=False``. .. ipython:: python @@ -180,6 +179,7 @@ account for missing data. For example: df['one'].sum() df.mean(1) df.cumsum() + df.cumsum(skipna=False) .. _missing_data.numeric_sum: @@ -189,33 +189,24 @@ Sum/Prod of Empties/Nans .. warning:: - This behavior is now standard as of v0.21.0; previously sum/prod would give different - results if the ``bottleneck`` package was installed. - See the :ref:`v0.21.0 whatsnew `. + This behavior is now standard as of v0.22.0 and is consistent with the default in ``numpy``; previously sum/prod of all-NA or empty Series/DataFrames would return NaN. + See :ref:`v0.22.0 whatsnew ` for more. -With ``sum`` or ``prod`` on an empty or all-``NaN`` ``Series``, or columns of a ``DataFrame``, the result will be all-``NaN``. - -.. ipython:: python - - s = pd.Series([np.nan]) - - s.sum() - -Summing over an empty ``Series`` will return ``NaN``: +The sum of an empty or all-NA Series or column of a DataFrame is 0. .. ipython:: python + pd.Series([np.nan]).sum() + pd.Series([]).sum() -.. warning:: +The product of an empty or all-NA Series or column of a DataFrame is 1. - These behaviors differ from the default in ``numpy`` where an empty sum returns zero. - - .. ipython:: python - - np.nansum(np.array([np.nan])) - np.nansum(np.array([])) +.. ipython:: python + pd.Series([np.nan]).prod() + + pd.Series([]).prod() NA values in GroupBy @@ -242,7 +233,7 @@ with missing data. Filling missing values: fillna ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The **fillna** function can "fill in" NA values with non-NA data in a couple +:meth:`~DataFrame.fillna` can "fill in" NA values with non-NA data in a couple of ways, which we illustrate: **Replace NA with a scalar value** @@ -292,8 +283,8 @@ To remind you, these are the available filling methods: With time series data, using pad/ffill is extremely common so that the "last known value" is available at every time point. -The ``ffill()`` function is equivalent to ``fillna(method='ffill')`` -and ``bfill()`` is equivalent to ``fillna(method='bfill')`` +:meth:`~DataFrame.ffill` is equivalent to ``fillna(method='ffill')`` +and :meth:`~DataFrame.bfill` is equivalent to ``fillna(method='bfill')`` .. _missing_data.PandasObject: @@ -329,7 +320,7 @@ Dropping axis labels with missing data: dropna ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You may wish to simply exclude labels from a data set which refer to missing -data. To do this, use the :meth:`~DataFrame.dropna` method: +data. To do this, use :meth:`~DataFrame.dropna`: .. ipython:: python :suppress: @@ -344,7 +335,7 @@ data. To do this, use the :meth:`~DataFrame.dropna` method: df.dropna(axis=1) df['one'].dropna() -An equivalent :meth:`~Series.dropna` method is available for Series. +An equivalent :meth:`~Series.dropna` is available for Series. DataFrame.dropna has considerably more options than Series.dropna, which can be examined :ref:`in the API `. @@ -357,7 +348,7 @@ Interpolation The ``limit_area`` keyword argument was added. -Both Series and DataFrame objects have an :meth:`~DataFrame.interpolate` method +Both Series and DataFrame objects have :meth:`~DataFrame.interpolate` that, by default, performs linear interpolation at missing datapoints. .. ipython:: python @@ -486,7 +477,7 @@ at the new values. Interpolation Limits ^^^^^^^^^^^^^^^^^^^^ -Like other pandas fill methods, ``interpolate`` accepts a ``limit`` keyword +Like other pandas fill methods, :meth:`~DataFrame.interpolate` accepts a ``limit`` keyword argument. Use this argument to limit the number of consecutive ``NaN`` values filled since the last valid observation: @@ -533,8 +524,9 @@ the ``limit_area`` parameter restricts filling to either inside or outside value Replacing Generic Values ~~~~~~~~~~~~~~~~~~~~~~~~ -Often times we want to replace arbitrary values with other values. The -``replace`` method in Series/DataFrame provides an efficient yet +Often times we want to replace arbitrary values with other values. + +:meth:`~Series.replace` in Series and :meth:`~DataFrame.replace` in DataFrame provides an efficient yet flexible way to perform such replacements. For a Series, you can replace a single value or a list of values by another @@ -674,7 +666,7 @@ want to use a regular expression. Numeric Replacement ~~~~~~~~~~~~~~~~~~~ -The :meth:`~DataFrame.replace` method is similar to :meth:`~DataFrame.fillna`. +:meth:`~DataFrame.replace` is similar to :meth:`~DataFrame.fillna`. .. ipython:: python @@ -763,7 +755,7 @@ contains NAs, an exception will be generated: reindexed = s.reindex(list(range(8))).fillna(0) reindexed[crit] -However, these can be filled in using **fillna** and it will work fine: +However, these can be filled in using :meth:`~DataFrame.fillna` and it will work fine: .. ipython:: python diff --git a/doc/source/options.rst b/doc/source/options.rst index a82be4d84bf3f..48247eb48baaf 100644 --- a/doc/source/options.rst +++ b/doc/source/options.rst @@ -78,8 +78,8 @@ with no argument ``describe_option`` will print out the descriptions for all ava Getting and Setting Options --------------------------- -As described above, :func:`~pandas.get_option` and :func:`~pandas.set_option` -are available from the pandas namespace. To change an option, call +As described above, :func:`~pandas.get_option` and :func:`~pandas.set_option` +are available from the pandas namespace. To change an option, call ``set_option('option regex', new_value)``. .. ipython:: python @@ -230,7 +230,7 @@ can specify the option ``df.info(null_counts=True)`` to override on showing a pa df.info() pd.reset_option('max_info_rows') -``display.precision`` sets the output display precision in terms of decimal places. +``display.precision`` sets the output display precision in terms of decimal places. This is only a suggestion. .. ipython:: python @@ -323,21 +323,21 @@ display.latex.multicolumn_format 'l' Alignment of multicolumn la display.latex.multirow False Combines rows when using a MultiIndex. Centered instead of top-aligned, separated by clines. -display.max_columns 20 max_rows and max_columns are used +display.max_columns 0 or 20 max_rows and max_columns are used in __repr__() methods to decide if to_string() or info() is used to render an object to a string. In - case python/IPython is running in - a terminal this can be set to 0 and + case Python/IPython is running in + a terminal this is set to 0 by default and pandas will correctly auto-detect - the width the terminal and swap to + the width of the terminal and switch to a smaller format in case all columns would not fit vertically. The IPython notebook, IPython qtconsole, or IDLE do not run in a terminal and hence it is not possible to do correct - auto-detection. 'None' value means - unlimited. + auto-detection, in which case the default + is set to 20. 'None' value means unlimited. display.max_colwidth 50 The maximum width in characters of a column in the repr of a pandas data structure. When the column overflows, @@ -402,9 +402,9 @@ display.html.table_schema False Whether to publish a Table display.html.border 1 A ``border=value`` attribute is inserted in the ```` tag for the DataFrame HTML repr. -display.html.use_mathjax True When True, Jupyter notebook will process - table contents using MathJax, rendering - mathematical expressions enclosed by the +display.html.use_mathjax True When True, Jupyter notebook will process + table contents using MathJax, rendering + mathematical expressions enclosed by the dollar symbol. io.excel.xls.writer xlwt The default Excel writer engine for 'xls' files. @@ -422,7 +422,7 @@ io.hdf.dropna_table True drop ALL nan rows when appe io.parquet.engine None The engine to use as a default for parquet reading and writing. If None then try 'pyarrow' and 'fastparquet' -mode.chained_assignment warn Controls ``SettingWithCopyWarning``: +mode.chained_assignment warn Controls ``SettingWithCopyWarning``: 'raise', 'warn', or None. Raise an exception, warn, or no action if trying to use :ref:`chained assignment `. diff --git a/doc/source/release.rst b/doc/source/release.rst index 8e063116cbf07..da3362b47b29b 100644 --- a/doc/source/release.rst +++ b/doc/source/release.rst @@ -71,7 +71,7 @@ Highlights include: - Temporarily restore matplotlib datetime plotting functionality. This should resolve issues for users who relied implicitly on pandas to plot datetimes - with matplotlib. See :ref:`here `. + with matplotlib. See :ref:`here `. - Improvements to the Parquet IO functions introduced in 0.21.0. See :ref:`here `. diff --git a/doc/source/timeseries.rst b/doc/source/timeseries.rst index 466c48b780861..adb4cdf2974a0 100644 --- a/doc/source/timeseries.rst +++ b/doc/source/timeseries.rst @@ -198,8 +198,9 @@ This could also potentially speed up the conversion considerably. pd.to_datetime('12-11-2010 00:00', format='%d-%m-%Y %H:%M') For more information on the choices available when specifying the ``format`` -option, see the Python `datetime documentation -` for NDim. Here is a taste of what to expect. +Here is a taste of what to expect. .. code-block:: ipython diff --git a/doc/source/whatsnew/v0.16.1.txt b/doc/source/whatsnew/v0.16.1.txt index 9e1dc391d7ace..5c716f6ad45c1 100644 --- a/doc/source/whatsnew/v0.16.1.txt +++ b/doc/source/whatsnew/v0.16.1.txt @@ -26,7 +26,7 @@ Highlights include: .. warning:: - In pandas 0.17.0, the sub-package ``pandas.io.data`` will be removed in favor of a separately installable package. See :ref:`here for details ` (:issue:`8961`) + In pandas 0.17.0, the sub-package ``pandas.io.data`` will be removed in favor of a separately installable package (:issue:`8961`). Enhancements ~~~~~~~~~~~~ diff --git a/doc/source/whatsnew/v0.17.1.txt b/doc/source/whatsnew/v0.17.1.txt index 6e5e113e859d7..e1b561c4deacb 100644 --- a/doc/source/whatsnew/v0.17.1.txt +++ b/doc/source/whatsnew/v0.17.1.txt @@ -58,7 +58,7 @@ We can render the HTML to get the following table. :file: whatsnew_0171_html_table.html :class:`~pandas.core.style.Styler` interacts nicely with the Jupyter Notebook. -See the :ref:`documentation ` for more. +See the :doc:`documentation