From bba2e2d9abf30e7b313eb7e3ef1fd3ee4086585b Mon Sep 17 00:00:00 2001 From: matthiasreisser Date: Tue, 22 Sep 2015 17:10:24 +0200 Subject: [PATCH 001/129] added docstring to apply method of LSTM --- blocks/bricks/recurrent.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/blocks/bricks/recurrent.py b/blocks/bricks/recurrent.py index 498912a2..991f6a83 100644 --- a/blocks/bricks/recurrent.py +++ b/blocks/bricks/recurrent.py @@ -434,7 +434,8 @@ def apply(self, inputs, states, cells, mask=None): features * 4). The `inputs` needs to be four times the dimension of the LSTM brick to insure each four gates receive different transformations of the input. See [Grav13]_ - equations 7 to 10 for more details. + equations 7 to 10 for more details. The `inputs` are then split + in this order: Input gate, forget gate, cell and output gate. mask : :class:`~tensor.TensorVariable` A 1D binary array in the shape (batch,) which is 1 if there is data available, 0 if not. Assumed to be 1-s only if not given. From cba09d22a1692fa8dca4373359099ddb8ab9b628 Mon Sep 17 00:00:00 2001 From: matthiasreisser Date: Tue, 22 Sep 2015 17:34:28 +0200 Subject: [PATCH 002/129] Changed docstring to plural --- blocks/bricks/recurrent.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blocks/bricks/recurrent.py b/blocks/bricks/recurrent.py index 991f6a83..07f37700 100644 --- a/blocks/bricks/recurrent.py +++ b/blocks/bricks/recurrent.py @@ -435,7 +435,7 @@ def apply(self, inputs, states, cells, mask=None): dimension of the LSTM brick to insure each four gates receive different transformations of the input. See [Grav13]_ equations 7 to 10 for more details. The `inputs` are then split - in this order: Input gate, forget gate, cell and output gate. + in this order: Input gates, forget gates, cells and output gates. mask : :class:`~tensor.TensorVariable` A 1D binary array in the shape (batch,) which is 1 if there is data available, 0 if not. Assumed to be 1-s only if not given. From f295d76f033d0efa23cbca63423d78685fea8bc9 Mon Sep 17 00:00:00 2001 From: matthiasreisser Date: Tue, 22 Sep 2015 17:37:35 +0200 Subject: [PATCH 003/129] Added line break --- blocks/bricks/recurrent.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/blocks/bricks/recurrent.py b/blocks/bricks/recurrent.py index 07f37700..c100163b 100644 --- a/blocks/bricks/recurrent.py +++ b/blocks/bricks/recurrent.py @@ -435,7 +435,8 @@ def apply(self, inputs, states, cells, mask=None): dimension of the LSTM brick to insure each four gates receive different transformations of the input. See [Grav13]_ equations 7 to 10 for more details. The `inputs` are then split - in this order: Input gates, forget gates, cells and output gates. + in this order: Input gates, forget gates, cells and output + gates. mask : :class:`~tensor.TensorVariable` A 1D binary array in the shape (batch,) which is 1 if there is data available, 0 if not. Assumed to be 1-s only if not given. From afaa45f2aa56e4102e9e62425ed021ed15e0f28d Mon Sep 17 00:00:00 2001 From: Jose Manuel Date: Mon, 26 Oct 2015 20:31:17 -0400 Subject: [PATCH 004/129] Added the final values of states as auxiliary variables in a sequence generator so they can be reused. --- blocks/bricks/sequence_generators.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/blocks/bricks/sequence_generators.py b/blocks/bricks/sequence_generators.py index b08607e5..531fad79 100644 --- a/blocks/bricks/sequence_generators.py +++ b/blocks/bricks/sequence_generators.py @@ -280,6 +280,13 @@ def cost_matrix(self, application_call, outputs, mask=None, **kwargs): for name, variable in list(glimpses.items()) + list(states.items()): application_call.add_auxiliary_variable( variable.copy(), name=name) + + # This variables can be used to initialize the initial states of the + # next batch using the last states of the current batch. + for name in self._state_names: + application_call.add_auxiliary_variable( + results[name][-1].copy(), name=name+"_final_value") + return costs @recurrent From 98aed8e8cf1eb8f06e0b17ec04634bac83cc1c8d Mon Sep 17 00:00:00 2001 From: dima Date: Wed, 28 Oct 2015 02:52:58 +0400 Subject: [PATCH 005/129] Add instructions to make a new release --- docs/development/index.rst | 46 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/docs/development/index.rst b/docs/development/index.rst index 125a654a..d3f66040 100644 --- a/docs/development/index.rst +++ b/docs/development/index.rst @@ -255,6 +255,52 @@ Sending a pull request See our :doc:`pull request workflow ` for a refresher on the general recipe for sending a pull request to Blocks. +Making a new release +-------------------- +.. note: + This section is targeted for Blocks and Fuel administrators. + +Create an initial pull request and copy the following piece of markdown code. +This pull request should only change the version number. Then, create a pull +request to Fuel which refers the first PR. Follow the instruction carefully +and check the boxes in process. +``` +- **Stage 1**: Make changes in `master`: + - [ ] Freeze other PRs. + + After we agreed to initiate the process of releasing a new version, + other PRs shouldn't be merged. + - [ ] Increase the version number counter of Blocks. + - [ ] Increase the version number counter of Fuel. +- **Stage 2**: After two PRs merged to Blocks and Fuel: + - [ ] Create a pull request to merge `master` into `stable`. + + Refer the initial PR. + - [ ] Create a pull request to Fuel. + + A coresponding PR to Fuel which merges its `master` into `stable`. + Refer the initial PR. + - [ ] Check the Travis CI build, make sure it refers the stable branch. + + Read carefully the Travis CI messages, check that it tests the + rigth version. + - [ ] Check the Theano version. + + The `req*.txt` should refer the last development Theano version + which is known not to have bugs. + - [ ] Check referred Fuel version. + + We should reference the stable version of Fuel. It can be seen + in the Travis CI output. + - [ ] Merge Fuel pull request. + - [ ] Merge this pull request. +- **Stage 3**: After the PR is merged: + - [ ] Wait the build passes. + - [ ] Create release at GitHub. + - [ ] Check documentation build at ReadTheDocs. + - [ ] Double check that the version corresponds `__version__`. +``` + .. toctree:: :hidden: From 46652f7d3b40523d2787c99fa93f035225c4ec71 Mon Sep 17 00:00:00 2001 From: Anton Bakhtin Date: Wed, 28 Oct 2015 11:19:56 +0300 Subject: [PATCH 006/129] Add test for a stack of bidirectional layers --- tests/bricks/test_recurrent.py | 46 +++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/tests/bricks/test_recurrent.py b/tests/bricks/test_recurrent.py index bc7801fd..3ce92c98 100644 --- a/tests/bricks/test_recurrent.py +++ b/tests/bricks/test_recurrent.py @@ -14,7 +14,7 @@ recurrent, BaseRecurrent, GatedRecurrent, SimpleRecurrent, Bidirectional, LSTM, RecurrentStack, RECURRENTSTACK_SEPARATOR) -from blocks.initialization import Constant, IsotropicGaussian, Orthogonal +from blocks.initialization import Constant, IsotropicGaussian, Orthogonal, Identity from blocks.filter import get_application_call, VariableFilter from blocks.graph import ComputationGraph from blocks.roles import INITIAL_STATE @@ -533,6 +533,50 @@ def test(self): assert_allclose(h_simple_rev, h_bidir[::-1, ..., 3:], rtol=1e-04) +class TestBidirectionalStack(unittest.TestCase): + def setUp(self): + prototype = SimpleRecurrent(dim=3, activation=Tanh()) + self.layers = [ + Bidirectional(weights_init=Orthogonal(), prototype=prototype) + for _ in range(3)] + self.stack = RecurrentStack(self.layers) + for fork in self.stack.forks: + fork.weights_init = Identity(1) + fork.biases_init = Constant(0) + self.stack.initialize() + + self.x_val = 0.1 * numpy.asarray( + list(itertools.permutations(range(4))), + dtype=theano.config.floatX) + self.x_val = (numpy.ones((24, 4, 3), dtype=theano.config.floatX) * + self.x_val[..., None]) + self.mask_val = numpy.ones((24, 4), dtype=theano.config.floatX) + self.mask_val[12:24, 3] = 0 + + def test_steps(self): + x = tensor.tensor3('x') + mask = tensor.matrix('mask') + + calc_stack_layers = [ + theano.function([x, mask], self.stack.apply(x, mask=mask)[i]) + for i in range(len(self.layers))] + stack_layers = [ + f(self.x_val, self.mask_val) for f in calc_stack_layers] + + h_val = self.x_val + for stack_layer_value, bidir_net in zip(stack_layers, self.layers): + calc = theano.function([x, mask], bidir_net.apply(x, mask=mask)) + simple_layer_value = calc(h_val, self.mask_val) + assert_allclose(stack_layer_value, simple_layer_value, rtol=1e-04) + h_val = simple_layer_value[..., :3] + + def test_dims(self): + self.assertEqual(self.stack.get_dim("inputs"), 3) + for i in range(len(self.layers)): + state_name = self.stack.suffix("states", i) + self.assertEqual(self.stack.get_dim(state_name), 6) + + def test_saved_inner_graph(): """Make sure that the original inner graph is saved.""" x = tensor.tensor3() From bc4f62c32eaaa7a315faa7ffa0e2667142d17095 Mon Sep 17 00:00:00 2001 From: Anton Bakhtin Date: Wed, 28 Oct 2015 11:32:32 +0300 Subject: [PATCH 007/129] Fix too long line error --- tests/bricks/test_recurrent.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/bricks/test_recurrent.py b/tests/bricks/test_recurrent.py index 3ce92c98..f7fc45cb 100644 --- a/tests/bricks/test_recurrent.py +++ b/tests/bricks/test_recurrent.py @@ -14,7 +14,8 @@ recurrent, BaseRecurrent, GatedRecurrent, SimpleRecurrent, Bidirectional, LSTM, RecurrentStack, RECURRENTSTACK_SEPARATOR) -from blocks.initialization import Constant, IsotropicGaussian, Orthogonal, Identity +from blocks.initialization import ( + Constant, IsotropicGaussian, Orthogonal, Identity) from blocks.filter import get_application_call, VariableFilter from blocks.graph import ComputationGraph from blocks.roles import INITIAL_STATE From 455d65fc59029129fb90e339270f76909d596ef5 Mon Sep 17 00:00:00 2001 From: dima Date: Thu, 29 Oct 2015 01:39:21 +0400 Subject: [PATCH 008/129] Improve docs for making new release --- docs/development/index.rst | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/docs/development/index.rst b/docs/development/index.rst index d3f66040..022771dd 100644 --- a/docs/development/index.rst +++ b/docs/development/index.rst @@ -271,34 +271,46 @@ and check the boxes in process. After we agreed to initiate the process of releasing a new version, other PRs shouldn't be merged. - [ ] Increase the version number counter of Blocks. + + Change the version number in `blocks/__init__.py`. - [ ] Increase the version number counter of Fuel. + + Change the version number in `fuel/version.py`. - **Stage 2**: After two PRs merged to Blocks and Fuel: - [ ] Create a pull request to merge `master` into `stable`. - Refer the initial PR. + Add a link to the initial PR in order not to get lost in the numerous + pull requests. - [ ] Create a pull request to Fuel. - A coresponding PR to Fuel which merges its `master` into `stable`. - Refer the initial PR. - - [ ] Check the Travis CI build, make sure it refers the stable branch. + This will be a corresponding PR to Fuel which merges its `master` into + `stable`. Add a link to the initial PR. + - [ ] Check the Travis CI build log *on both the pull requests merging + `master` into `stable`*. Read carefully the Travis CI messages, check that it tests the - rigth version. + right version. - [ ] Check the Theano version. - The `req*.txt` should refer the last development Theano version + The `req*.txt` should refer the last development Theano version which is known not to have bugs. - - [ ] Check referred Fuel version. + - [ ] Check the Fuel version in `req*.txt` files. We should reference the stable version of Fuel. It can be seen in the Travis CI output. - [ ] Merge Fuel pull request. - [ ] Merge this pull request. -- **Stage 3**: After the PR is merged: - - [ ] Wait the build passes. - - [ ] Create release at GitHub. +- **Stage 3**: After the PRs are merged: + - [ ] Wait the build to pass. - [ ] Check documentation build at ReadTheDocs. - [ ] Double check that the version corresponds `__version__`. + - [ ] Create a release of Fuel by going to the + [releases page](https://github.com/mila-udem/fuel/releases) and + clicking "Draft new release". + - [ ] Create a release of Blocks by going to the + [releases page](https://github.com/mila-udem/blocks/releases) and + clicking "Draft new release". + ``` .. toctree:: From ea34217008a53e81ab48ac9fcc6289e15ac6dfac Mon Sep 17 00:00:00 2001 From: rizar Date: Thu, 29 Oct 2015 11:13:43 -0400 Subject: [PATCH 009/129] Add the original for SequenceGenerator picture --- docs/_static/sequence_generator_scheme.svg | 698 +++++++++++++++++++++ 1 file changed, 698 insertions(+) create mode 100644 docs/_static/sequence_generator_scheme.svg diff --git a/docs/_static/sequence_generator_scheme.svg b/docs/_static/sequence_generator_scheme.svg new file mode 100644 index 00000000..edb4a824 --- /dev/null +++ b/docs/_static/sequence_generator_scheme.svg @@ -0,0 +1,698 @@ + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + gi-1 si-1 + + + readout.readout + + transition.take_look + + + readout.emit + + + readout.feedback + + + + transition.compute_states + + readout.cost + gi si yi-1 fi-1 + readout.feedback + ri yi ci fi + Legend:s - statesg - glimpsesr - readoutsy - outputsf - feedbackc - costs Dashed rectangle for outputs expresses the fact that they can be provided by the user (see BaseSequenceGenerator.cost method) fork.apply fork.apply + contexts + + + + transition.apply + + From 68842e7995d8e8bd0ce27bda5f3017bf9231cc86 Mon Sep 17 00:00:00 2001 From: Pascal Lamblin Date: Fri, 24 Jul 2015 15:45:50 -0400 Subject: [PATCH 010/129] Update developer doc to mention Blocks and Fuel --- docs/development/docs.rst | 28 ++++++++++++----- docs/development/index.rst | 62 ++++++++++++++++++++++---------------- 2 files changed, 56 insertions(+), 34 deletions(-) diff --git a/docs/development/docs.rst b/docs/development/docs.rst index 0d4efd48..83bc74e9 100644 --- a/docs/development/docs.rst +++ b/docs/development/docs.rst @@ -4,15 +4,25 @@ Building documentation If you've made significant changes to the documentation, you can build a local to see how your changes are rendered. You will need to install Sphinx_, the Napoleon_ extension (to enable NumPy docstring support), and the `Read the Docs -theme`_. You can do this by installing the optional ``docs`` requirements: +theme`_. You can do this by installing the optional ``docs`` requirements. + +For Blocks: .. code-block:: bash $ pip install --upgrade git+git://github.com/user/blocks.git#egg=blocks[docs] + +For Fuel: + +.. code-block:: bash + + $ pip install --upgrade git+git://github.com/user/fuel.git#egg=fuel[docs] + + After the requirements have been installed, you can build a copy of the documentation by running the following command from the root ``blocks`` -directory. +(or ``fuel``) directory. .. code-block:: bash @@ -24,9 +34,9 @@ directory. Docstrings ---------- -Blocks follows the `NumPy docstring standards`_. For a quick introduction, have -a look at the NumPy_ or Napoleon_ examples of compliant docstrings. A few common -mistakes to avoid: +Blocks and Fuel follow the `NumPy docstring standards`_. For a quick +introduction, have a look at the NumPy_ or Napoleon_ examples of +compliant docstrings. A few common mistakes to avoid: * There is no line break after the opening quotes (``"""``). * There is an empty line before the closing quotes (``"""``). @@ -36,8 +46,9 @@ The docstrings are formatted using reStructuredText_, and can make use of all the formatting capabilities this provides. They are rendered into HTML documentation using the `Read the Docs`_ service. After code has been merged, please ensure that documentation was built successfully and that your docstrings -rendered as you intended by looking at the `online documentation`_, which is -automatically updated. +rendered as you intended by looking at the online documentation (for +`Blocks `_ or `Fuel `_, +which is automatically updated. Writing doctests_ is encouraged, and they are run as part of the test suite. They should use Python 3 syntax. @@ -48,7 +59,8 @@ They should use Python 3 syntax. .. _reStructuredText: http://docutils.sourceforge.net/rst.html .. _doctests: https://docs.python.org/2/library/doctest.html .. _Read the Docs: https://readthedocs.org/ -.. _online documentation: http://blocks.readthedocs.org/ +.. _Blocks online documentation: http://blocks.readthedocs.org/ +.. _Fuel online documentation: http://fuel.readthedocs.org/ .. _a bug in Napoleon: https://bitbucket.org/birkenfeld/sphinx-contrib/issue/82/napoleon-return-type-containing-colons-is .. _references_and_intersphinx: diff --git a/docs/development/index.rst b/docs/development/index.rst index 125a654a..2aa29e7a 100644 --- a/docs/development/index.rst +++ b/docs/development/index.rst @@ -1,10 +1,10 @@ Development =========== -We want to encourage everyone to contribute to the development of Blocks. To -ensure the codebase is of high quality, we ask all new developers to have a -quick read through these rules to make sure that any code you contribute will be -easy to merge! +We want to encourage everyone to contribute to the development of Blocks +and Fuel. To ensure the codebase is of high quality, we ask all new +developers to have a quick read through these rules to make sure that +any code you contribute will be easy to merge! .. image:: /_static/code_quality.png @@ -13,7 +13,9 @@ easy to merge! Formatting guidelines --------------------- Blocks follows the `PEP8 style guide`_ closely, so please make sure you are -familiar with it. Our `Travis CI buildbot`_ runs flake8_ as part of every build, +familiar with it. Our Travis CI buildbots (for `Blocks `_, +`Fuel `_, and `Blocks-extras `_) +run flake8_ as part of every build, which checks for PEP8 compliance (using the pep8_ tool) and for some common coding errors using pyflakes_. You might want to install and run flake8_ on your code before submitting a PR to make sure that your build doesn't fail because of @@ -27,7 +29,7 @@ compliant! Some guidelines which aren't checked by flake8_: * Variable names should be explanatory and unambiguous. There are also some style guideline decisions that were made specifically for -Blocks: +Blocks and Fuel: * Do not rename imports i.e. do not use ``import theano.tensor as T`` or ``import numpy as np``. @@ -53,7 +55,9 @@ Blocks: self.baz = baz .. _PEP8 style guide: https://www.python.org/dev/peps/pep-0008/ -.. _Travis CI buildbot: https://travis-ci.org/mila-udem/blocks +.. _Blocks buildbot: https://travis-ci.org/mila-udem/blocks +.. _Blocks-extras buildbot: https://travis-ci.org/mila-udem/blocks-extras +.. _Fuel buildbot: https://travis-ci.org/mila-udem/fuel .. _flake8: https://pypi.python.org/pypi/flake8 .. _pep8: https://pypi.python.org/pypi/pep8 .. _pyflakes: https://pypi.python.org/pypi/pyflakes @@ -61,9 +65,10 @@ Blocks: Code guidelines --------------- -Some guidelines to keep in mind when coding for Blocks. Some of these are simply -preferences, others stem from particular requirements we have e.g. in order to -serialize training progress, support Python 2 and 3 simultaneously, etc. +Some guidelines to keep in mind when coding for Blocks or Fuel. Some of +these are simply preferences, others stem from particular requirements +we have, e.g., in order to serialize training progress, support Python 2 +and 3 simultaneously, etc. Validating function arguments ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -119,10 +124,11 @@ building documentation. To prevent this, make sure to always use the Python 2 and 3 ~~~~~~~~~~~~~~ -Blocks aims to be both Python 2 and Python 3 compliant using a single code-base, -without using 2to3_. There are many online resources which discuss the writing -of compatible code. For a quick overview see `the cheatsheet from Python -Charmers`_. For non-trivial cases, we use the six_ compatibility library. +Blocks and Fuel aim to be both Python 2 and Python 3 compliant using a +single code-base, without using 2to3_. There are many online resources +which discuss the writing of compatible code. For a quick overview see +`the cheatsheet from Python Charmers`_. For non-trivial cases, we use +the six_ compatibility library. Documentation should be written to be Python 3 compliant. @@ -143,16 +149,18 @@ Not doing so `clobbers the original traceback`_, making it impossible to use Serialization ~~~~~~~~~~~~~ -To ensure the reproducibility of scientific experiments Blocks tries to make -sure that stopping and resuming training doesn't affect the final results. In -order to do so it takes a radical approach, serializing the entire training -state using pickle_. Some things cannot be pickled, so their use should be -avoided when the object will be pickled as part of the main loop: +To ensure the reproducibility of scientific experiments, Blocks and Fuel +try to make sure that stopping and resuming training doesn't affect +the final results. In order to do so it takes a radical approach, +serializing the entire training state using pickle_. Some things cannot +be pickled, so their use should be avoided when the object will be +pickled as part of the main loop: * Lambda functions * Iterators and generators (use picklable_itertools_) * References to methods as attributes -* Any variable that lies outside of the global namespace e.g. nested functions +* Any variable that lies outside of the global namespace, e.g., + nested functions * Dynamically generated classes (possible_ but complicated) .. _pickle: https://docs.python.org/3/library/pickle.html @@ -210,9 +218,11 @@ the error is being raised for. Unit testing ------------ -Blocks uses unit testing to ensure that individual parts of the library behave -as intended. It's also essential in ensuring that parts of the library are not -broken by proposed changes. +Blocks and Fuel use unit testing to ensure that individual parts of +the library behave as intended. It's also essential in ensuring that +parts of the library are not broken by proposed changes. Since Blocks +depends on Fuel, it is important to make sure changes in Fuel do not +break Blocks. All new code should be accompanied by extensive unit tests. Whenever a pull request is made, the full test suite is run on `Travis CI`_, and pull requests @@ -236,8 +246,8 @@ The test suite can be executed locally using nose2_ [#]_. Writing and building documentation ---------------------------------- The :doc:`documentation guidelines ` outline how to write documentation -for Blocks, and how to build a local copy of the documentation for testing -purposes. +for Blocks and Fuel, and how to build a local copy of the documentation for +testing purposes. Internal API ------------ @@ -253,7 +263,7 @@ See the instructions at the bottom of the :doc:`installation instructions Sending a pull request ---------------------- See our :doc:`pull request workflow ` for a refresher on the -general recipe for sending a pull request to Blocks. +general recipe for sending a pull request to Blocks or Fuel. .. toctree:: :hidden: From 8950f736da9b5e66ec8f5d4d51fb41bd710cdc25 Mon Sep 17 00:00:00 2001 From: Pascal Lamblin Date: Fri, 24 Jul 2015 15:46:41 -0400 Subject: [PATCH 011/129] Backport fixes done to Fuel's install doc --- docs/setup.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/setup.rst b/docs/setup.rst index a062cad1..e0bd7ad9 100644 --- a/docs/setup.rst +++ b/docs/setup.rst @@ -1,9 +1,9 @@ Installation ============ -The easiest way to install Blocks using the Python package manager pip. Blocks -isn't listed yet on the Python Package Index (PyPI), so you will have to grab it -directly from GitHub. +The easiest way to install Blocks is using the Python package manager +``pip``. Blocks isn't listed yet on the Python Package Index (PyPI), so +you will have to grab it directly from GitHub. .. code-block:: bash @@ -60,6 +60,8 @@ Blocks' requirements are Bokeh_ is an optional requirement for if you want to use live plotting of your training progress (part of ``blocks-extras_``). +nose2_ is an optional requirement, used to run the tests. + We develop using the bleeding-edge version of Theano, so be sure to follow the `relevant installation instructions`_ to make sure that your Theano version is up to date if you didn't install it through Blocks. @@ -105,4 +107,3 @@ Documentation If you want to build a local copy of the documentation, follow the instructions at the :doc:`documentation development guidelines `. - From d7eb34150c567eb75f66b1d298362d98c7d185e2 Mon Sep 17 00:00:00 2001 From: Pascal Lamblin Date: Thu, 29 Oct 2015 17:29:06 -0400 Subject: [PATCH 012/129] Update after review. --- docs/development/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/development/index.rst b/docs/development/index.rst index 2aa29e7a..7ffb43da 100644 --- a/docs/development/index.rst +++ b/docs/development/index.rst @@ -221,8 +221,8 @@ Unit testing Blocks and Fuel use unit testing to ensure that individual parts of the library behave as intended. It's also essential in ensuring that parts of the library are not broken by proposed changes. Since Blocks -depends on Fuel, it is important to make sure changes in Fuel do not -break Blocks. +and Fuel were designed to be used together, it is important to make sure +changes in Fuel do not break Blocks. All new code should be accompanied by extensive unit tests. Whenever a pull request is made, the full test suite is run on `Travis CI`_, and pull requests From 23d94b2436eeb4aac511dd85a3e5ae8875c2649b Mon Sep 17 00:00:00 2001 From: Anton Bakhtin Date: Fri, 30 Oct 2015 17:31:24 +0300 Subject: [PATCH 013/129] Fix label in sequence generator scheme Fix #895 --- docs/_static/sequence_generator_scheme.png | Bin 187434 -> 186668 bytes docs/_static/sequence_generator_scheme.svg | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/_static/sequence_generator_scheme.png b/docs/_static/sequence_generator_scheme.png index f0d0caca6085e8ed2724d1505c8a7ceb21ca2ffe..73f90b1b9cd3780f33bb1655c8a38f8e8f498068 100644 GIT binary patch literal 186668 zcmc$`XH=72v@M)M5otzLI%p_@Qk2k?W(gu7q9DCW3DQBNmn0U5(i9L3AgDCyAid{( ziJ}mUg7g+aLWj^hxewqu_na}ld%tpjd=407RYU;)G5B25zIO!p7jnb_2Rvu-x@qPE0?CN(|ANo`#EIc~w3T=rl+hdG%gE>gT{jcyh<3zRj8gadR z8!o!bi}*m&h0#}{+HvxWi9CKF;Jw`!xG4gkbbG85Rj(PRl?-Zws+5<%Rf)O+TqP>a zBR(#s-SMxR5`|mZo%7D|6yPIqqI#Dj*;PQmgM*(_C-*Npe8P7ue(CSaqU<>B!2h_0 ziI`b`c(tfD)Xu>A?=_j=i;}W`uj#L|GDF%n@$`7!^tXrLfcfY`iG5hN8e?xrd@n()IaiY%WJ|3q8gMy)CNHEf{gaW|hDt#QL>_<+EjB>P&{JW0fLins9hfIKpcKqQU+n`$jkFKAD zZ9|$KIES4^BnjKHwSgDFdr!=dH!?dxBAlq7$Li_g1QU$Ydce0!g!6LC)ak7eDA{eQ z%mJm|ttFKL7KU1@hPUmp3qV6u5l+#IVG&TRO8F)!gnq$y4PIrT-cJ#~g_s-J>qQU? z!ny+N-hvDv*f`t*^$bM=vHWJb|1HMHVk<-uLAO`ExNpN`RVf=0?YLh#xL)4sQ_7D^ z#r}ZT820#Jp1du)HXuu#1(ra}TWq9=9XV`aKs=EXoOH4BsVbo(ftxSMM0@4=i-}c2 z`jqq;&T%w%)2R(3WWlcqHSS29C-m$Oi)%u*ycAa0Vl(c|Fgeu1uJ=4##-mq}XQ3Au zI!-)%-&-=(kwk1l-@NOisjWK^K9S&-8^nn1YC0=MSkC-K*0(2D44o5Lt-n*5j#bw zB+xr@+ddp6c!fp>)a?w>==JxajTZ5p2#l~6ae55r#7{}77>mf~S%)fS)g$|gUTmgB zg$em?-ynkR>lcDCJ@Vxm5CL{K&RcDy*OF)@V9gok3sytfXT4v|9 zPq0PRR@TSeowHVCEwpmde3dK=A}=JoEVfgA zO})G^U?j^Pw8#sLFmhzJPx6e-5dAhqGl4N+KT1hMZnf&hiLOe(E5T_49U;smo~YrG z8D;#YveywWi?-aJ8^|2qSx|&RxnL4rL%4aD%&gw+N>?0aD&K?uK8xS{rcel_GM>F{K;{_;pCSyR&uTCyG-BuJ=g5ZQW%7N>fV^eR{YM@hkW^tWA#IhSkFO zuOqBcX-qpcS(|}I&Pib*7ZAb%V+vXdLaDjd;L&bNJ?slWCEK2!2q9xUmOhOx; zikxdvC)qsNoxlegrjK3C&9~-G=uouxRiTZk7uA)#cW)Ca8Yq50SFJwJN%KwSPMb4B z?VUsTyY+eqkgE?ibIieJ9#&;Ht<9Q?%3HZ3iRjz^EE$G-rbZSs%=mv&DXCOgS(Ee%Dfe|nC@B;Rm0;L z?&tcL$F@DZ@_awzpdRXb49)`U`z64+)2Y-6IeTM!!p+5XcS6ASn>pPha#*pZEY|hL zAh_V3O4@K1x>NT_qxI2Sl+^>XTsp{(4Q5&I=T^HEe;Q|Bl58?)TO7j&(v=r{W$kaa zY7ylK<>7`cF^CxPUD5Fc{+8V@Tlv`T1!(KF{IQF}Gy68sdze@ZWbtV|4VKZc_N0}f z=_J{njvWHSplgA>d_$_~o!a($o^nOc3|c-)N@@%ziHaO)uWu{@N_A%>0`#B{(_0SdMyS5q? z5&FEgZ0i@$-x9hcv=_q)6~FBHE0q@>NlnE+krG7k%6IJwFUYd&h&=|pR{pbD;|;)T zmHZXU-7iykiaZ|#KWuuUNeq(j(eylz5Wc^6d8HGB-~Cd0Y}@4e0P4R?{jZPIhgVLp zDTgof_xtg*1ngR?@Ty0Cqx>6Q*=Q4Y>&JgvlS}#U=lWo!vmpBiI<3MNViv83Cw%qN zKZlLs?B6Hg{h>V-^2I{1P_b?iJ3iX1H?#PD)-XWq*Dt@Gkm@Mi}8uKRIF+c53WK7w68`~r{# z3b+&}>J!2`-)%uIm~NDJH5sbA%G)AF@H9{6W>)Vc2e8(R@%0Z2!17}qU*b#!HYmiW zfU!iK^atqsmEaml|iRxIAxBF1@qeHnh6IZRV~iOkpyPGeC`mx~N0(v9q+YQ#gw6$n&9 zqV$|6W130B1LZS_1!tuz71dLU1XfHEgx@$Ptk3BdGzouJlSr0K_Z-?58I>fcAeQsG zXW(}1lp_?qs4#jDDALY7Y=13Y-QVA5dJ4LrZT%mnN>$Dp0&ldn;XTsOdiDSds?*iUD?q_T#0N3i)=GeUF1=UXNpi~3S?7n`(4Zf#mCJ#Zf3ua<-F9kqn)u$uDr zp6JCJM52kl1Qo0y_oEWPmT}=u=XQio16cvvN~$4XVcslRl|hEu1O-g!DO)ywB+&=M zg_($2ToQ(OevI2L9Dg`ZCJ9^@=+Pvu5uOu-*sUHfjlNqQ|0f|1Uv-1%LAaD)BVHcl zQc>X}>;)SC9J8NsBuV>qiFRl!DHd7>X-dKTE&{28ROQ0AM_%FU?zVp2$%xS1W2%=y zaFR%UMiw)V^X!W*+Pu!`V-8@QLtFjGuSw`oXo>Pk#kP@VusKktsKpLetUF@)!}Hkv znBCzpb_*yN%P-WWJlDom`Dj&f;5UP9dw|k4K-#f;D@ZMB_Xtf(XY&o>OZ>}rk|%T| z1}7--Z4sX!cPSQ91*rl#p{R_j!1`TmjoPa<3;l9|d&3SHA{d~Mbz`S&vhWsJFu_38 z37q3dol_fL6Q|Pm>cX4^cb*woqlg*yf~OI5mRT+sGbG}!`V+qy#vR5D4%(^Rw3?SDD(37f^;}KjEn5p)>DJ=o z^Y7|KYig6t_ED5G?7$?MEXHCM+~H4WJlNeQ^nX$Cn>=1uE2QJ{@XK@oKLKC{apH%; zNBS`wj!^>Ys?K-z`=~He^Z7wA((JUrwww1CwUU;@VNt*vqSEIMBC7OLxE-qEj;lt` zJbOs??_VZgxL@zToy&g^7g%$YASOs6Kiuw_wG0k74j;WvkR%vL=Xin|)l1LpFI${> z&5wLw_5O7=q~sGyVT-PmSb`>@3A2sK!oJ2vW8Y%9A?FpM5ZnPqs9_D6I9 zpPYYJohZ?-i0%@g=-~tBiTf3$sJ6=ioOJ%_%S`)3QVs6K?nB;=5C851&W?YlL~S)G zmk6iq>(@9aWdyn-^$C~Yn}azwd?np)+204=IGh6337P`R@2Px^jlcxw&A};E1Wo+r z#+}Fe_m`=8ki-s#i(_&qz0VAM?BLnoaSosS?}6>XHO^NK?0E2L`P2U|aq}l)3G`(q z;~982#P}nJXFI9yI_^G;?bx)}ZIrdrB+udeL2;?jG9C~!WJQjutboe2vNR}>b>8TMr$IaINU&_g31<2vNtDfom7to z4+l$9SP1=u%SOv;gwOcEw#T)e5doDDMTjw22;#xCmx_;#_D+2*kvc^bu>a)-U7S0{165DIQ#OF6>x#sK* zq3ZGYK&NJ90AVu?f1QlP)|wHLu=l9$f_y7^E6$G8vas#XTaf# zPRD8oI={f-{6Sjly}P9(%ZFFLbQa@GA(wM`NGOmeAo^`2R+W{vOm4~eB*oNij&Vi?!aw-UA))yOF|kXbE;;6NutnjhMg}}% zK|G#QX~lw{CszaQic)<2&bdKc!ZFbAWAb+<>sRp;=O_uXrC%A`|`3d#mn_oEq5&(njX9Zx$y9B8bhzx8-~*85tRk2r_x0XZ2&oSBB+~8XBhse6>d^PbN1l5Ci0_%bvtbX|5 zQP;n>ep&2K{>5VXGl$ewIR&5&vctE~iNS@R)p@(p?K^R%_77e?^4D>v^KvQAr?_kj zlSwLmqqMy-)nZ}oCB-HJq5^% zi|{m6;!7OP8CH51IeP+D7vp9WBBGf3E?AmLwXA!kPDr+p{=qgP(I=^Ejq^FqM3cC* zOFVlJU@{kd-kUhPY^Zu2DPb#7&+^+Sz-_Q(ky$etdy~C>bKRyoFOfw!u^q z)K!06>@NDq1ts_%Xy?R+IZ9nQW}rP&3fce7ANyomfX<`ya7!?1FL~lQfo{CLu1U-# zu;2rAnpZ>fQF+3g0`gyUlTzOuGtP~GhLp!%qy}DniRZjQjKnTLQ;ga>vCzC|Ts1E4 z9bKnx>!8jD01Xd-nzC`{t~M~zu2Q9)ASKEr2(J@fn#fy!{>|h%hX5AIAF2Ye0h`AY z&x2%{!(gx+E#hUafNlK?$uH3i8y9IhI@?aAyc~rGLbO+1 z{uy+~R2k}wlH8}3P5?DwD=uK{sao{mDpR@emu7iHr9rS#MaQ4yAxTHmX7C-T55`Egs&NsjV^}Pz`vMM-eAUK?i7qmHzBpOE*and|(Z=lrsr;@|&jr@)w z_y8feTiR-^on&}+tMM?zeF}+|cXXr{67=(;UHo=>FuoGwx_jIK&cb8gAu*}dH|vIF zvAX$ly0B7#tn&7o&Pi`2%DVOWCJHO_=g>`t*BU=9Dlhc>Ii(}L2};bakJ^|)j%03e z=oeS6-yp6f*odiSO)p6j{_?*a5Zg^YXV@!z4%9PWK`qN_VArHs=iea^m`HDY`|WbC1ycMGt(S`f~Tr5mk6L=jia^4Mg$*+vmf0 zUjJUyd(Dd%Yt`B`T(|R;Qax8q-O=N>1@rOa+rIoII-fKy$f1x@!`B5gKF*;}!@DPc zCqMTR%t-&oj_?Uudl-Q`;GZ+=rN?;ht9(rPr{fri9T?< z9+!cS-SjHL^{%~cLafLrOU3r>SX=`p5<7=Y2@c7&>0WE%hbG%f&z6wu7oqR)kIqfb;z!y8Y*>X5`dX?rPPAdp6$g8r8# z_QO~sd8U=`McgSAY!S4a#9tE`r)0S_ar}~T z{@Y--UL^!t`w4DCmA1xFwPT5D%;~1P6S&Q{2AKv~-Ht{jq}ROq)H_Sg8}mVwd7lbF z7BE?IK1wcZ3_=a}JsdiZEjBncUYNo@$Wg#5)%kFKp5&%io8Gdsy5Iy=y0eGs24{DD z-#yg}a0Qx&hUWT?-#4_lXAKPAp$3beE<)j}rew2KhOZ6K`o5eG28L)J1(CTo|ui zxQqIe-v7{rX`Jz@+8MesjhTWAfBzjk@8+CxbyHQz4j4_CCP`rw|Fd7$0+gVDQ>(5a zvH~}0h|MuXX%vGCuHdIaxg78RGCURj)D>B9CAX{NzoOEe)J;d4u2QN)h7 zb>fqF2Fn^6h~Dg>J&e{jwZq5^D5LdVXOy);{gre{ zuxNmxmpwqP@gBhvpk6St2^r`!tCh1a(3!!IEN3i6W^MUv843W#(-|@qvBH^A%zj zyJ(F!1%$kOx?_hOhwGM+ey0pgRa503)3}13^EMg+e!SjL}kH%hrSzk zP}b(IXmAO836qzG7cVWIRG&Z792?UFE;(N!bRm98ZavMVPC!`&Aw20_;E0_7sX+3< zx<+HE%&BSkvX)~#RKo3wYHIgr?GeD9!c)GghYoQSa0vO&NTMs244}5uG-wFJ1`kb; za?)t~JYsp{A7pPjE&xLFrS!Si?(ha&66*`L?pjMC4Zgo$kk;CRBno4k?nUUglUVt; zQb7Xu1RL2lF3~h8wx{{Rcfqu2(vH9HZa=^}l<{rt@heLqVqISp*X}(hjN~^1%NL1L z25p=xv1=BK1qm~%zrx4*^Y}OCjp$D8K>RsqpGhH35vAGC1?X_|q;8CH8CKuKyM69L zw{b$#$nJx^5G_@<9Z!@{-}~4D2k#(UGPF*<1|MxEM3^TFXOV=gxlE65*x0@WM<~kd zSMZ9CU;KyM6U?S{4Nx|8#(*)~jFc7w0zQFvP=tDCl;8WbBXx&0zi*|Y|Nf!doPJ$VWm=ARX+T!c4gv!VP|k^4*{ z;CrS8lCpX*SgF!75T6(;nG?yR3JI3B>ypoZDE$okvYB}trVG(%C7j+dL+A2CYycJFfXvUZ-PAr6NrBV`K5c-Q!D5On&coYVY&v^u5>k zwS|6nZnvX7nLsz%wt=J_DY&H_qQR(K)4l!@r<~cYtOY=nCca+bH)(iRM=DbnqL8Kj zg~%ycRyF$MiprV zJ}>1M=RVy8>EAmJNV^Aj2$0fxU>J;WGU~hO92@g?;DZ^8+#tokt9- za_qR~?f>Wnu(>7#ut^Ld?su?yn5tiEO@j$M%wI_n*eb+e-_KaE=Tr%8>TbpExWu^s zURiEsu#r!r^(X3-+83`tpaSDt_SUgl56;Ve&0}Q(!r)Aqddn}@S6Be=R7sxE5DYLW zoO%QMRHWFoIt&mFy;pq-EkqMZ~y`1>2-9`h~ zpu4(B5&7)4Z*jd9E!&m-kp{Pqv_?KQ46dd|R_qR$e;+a&7?FYZcb6WTCYc1VB8JU= z6}uX~GnVb9je-9>L)@Px``V+1`UdeqtaS=8)08XsOc?8ibVUF*rIYNRZ9jmBz|~v^0sHm=TDR18Vo#zW4$7 zOQt=5nfOq@)`InPM!Fkx^(z_Ge`b+GuV`p*Zuty#j45!fTJ8o^2Pb*2E>OEkAq5d( zN`|eIQKHQg+O1AhMu1|V`RW*?MxuTyaDK51Y<*lU z;{EnGO!mE$v5MUFFmKy+m+c40K{f%-{iXt-8vvM${I>&y8}!gWOQ_iF{#6FKf2LV| z*W?TZPQ^@^-$|S<9XSqEMDOo=50X?>;Fa$ROla3^^=((ple)0Ym?TXikPONb&rFa1 z{LWM~f3dQ5b9&B+3M|Df+op3xLvPkS!>lM?6eHN;C`kZy>2TD{&4W>cc?vHLyUs26 zo}C=d0qZYxObCa@SlJAg^%$rC24KzT60w^C@UlTvZ~PE;#`71u@MCry9@M&YvLmVe6hxOI&0+&h)rL5%w_vYy=XaZ0awXS{iBs@1@VB;0szLf!r~zA5Whg78nizY*vTexIli zhKQ8CHDTs(?6jsN*`*I#J0U9Y%XsBvqjqty)0Lh5_01*3ebGL60r%Brn$DVo* z&ivCKHuIsv39MwijQ|89@AT5?6aV#VF?l;T8y!EIXJA9OeGcD`XgWFxE zb(nXmvgR4f-kbLQV*`T;zre*r{=7kq!YRwc(>go$R&aon^2qXQ_2nj;{~5%Rf%@KC z)N!%h>5g@^ATP}Gy{MQcG|k+-6T>RW()UVE{1WX!Z~|UQi)exMyz7$f$!Wo`s++KY<{L)@ah4c$DPfgNzAe|jmO$$YN8=2! z2+U00oRFY zVtT6BsuXFA6hoNzaaxMGDH)Kjf7%v4End2g6@F3txMm@To7~ zCGFb|Yi*jA_7`+x_u7xgu_b7uhyE-S9-V*vE{lP;3(Tt`FiKFRU;WdLw@xvx1H#0q z%R@E&{edQ^G$39dC+u}~e{-V*;sdo(mOVl948taZo;NmywiVa|0xNtU^3wnX{ug@S zFxCFF2ax*FZ=^najglA0k-Fqg$mr5Q>*7my3P|<5rcHiRp|>950|gut*MAa>0QYxm zjhZ2Y^jk>_B`?)_komyqunpZ5nI6bCiaMc^N@s8k56v;SvTmrpE-km*!LdkcCpAl! zQOF>wAJ6htiWZ?wLN;l7?`TNO(hROeCCZ!Ii(!1>cQ(iF-y{W>JL}$c6cAI8gP$iq zd_?3UcdyC9)sO6W`flJ!AqyAA%znT}|Fb?!^ceuT-iez`a-;^@^8{aNjeMz)e=!l_ z@j;3bq=$;xOgds@wVh+w%3gSc^r2q9_GI;CpuD{wbrLI`|K^6vNYB{xKF%1ZHbcJWfmm(1hqZ!<6=M%r3Mijr>iF-FPBW(MaTL&QK39>DhzBD8-M*f9) zmjMWI>LRRE)azd1)YJQ)KY;{VC$D9fIh%&uJFvDkpEwY1P8^2;4Nod?yDY_tbf#3! zs08J}BOCv|8=Wyh&I-Y7VsUf*sWvk37`x%muCaxvpu@UPJ3d?ipkPJeVT`j(st`*6 zB@f;<+j-<;%XP!%ix_Q-v_n01O)wr8pzih1H$crxfyQZjdAz0)g!(0OiL)0-;ermS z%|CLp|2FA~3j^Y`VW+%por~*3C0aL0)!XY#wC?WQZ?3#Tt0rMkgw#=%zs-HpA^XX@ zjTK{s8Ir8%GJzWBh~_V3l0NQ9dxZeJUMA1B_feWdtIr%mfnH!GFCZtNDEb6W#B#@d z#!I3;*zLUC?Fe4n;R4r|{TGBedad}-IC1|Un+Xpc`G2Lk9Kyt09PSC$J-^x0iK^Kg zrFA$U7a8EI^n}Qa90hB1hJ)5H;EiOvef37%5-GqbWi8mK3W#lf7 zGqg8N*bvA5#&Y5_>q8F!x-gIZuUaF4kaYqEV+Qlzi#Y2*jfRy)!kU%GvLQtQf2r=ez*#8S{t>pr zPl!qVC0@&SN((6k4go8lz$p&hX0~PtdG+baIl@)^<`a&w#&SOYXpSm0Xu}H?mffuE z3A%B7rp19epc178&}Noag4Xf)l$l!q3*S;8^jUvjRxr4fOK^h+-9T~Ylted zF`Dzdj-TQHDxd~jZ%s4XOb);vr!x+kMsp`5@uz@wp`BQ=Ch;MD^OX#F*_|>Dv;bmR zF#{5^#}zY4_vkQ3@c2WT93k zh0(n5Mo?_jERwiIh?Q)Dg96w#M827Kg3{1oH4jfcEbAOk1=3pJMHqZzZ zwL;`9{6mu2*X9*TomnSCyC&2hq}m#;7qoFEgJshPQ-z|cA}T~iHxv4L@*(<+F-*g~ z)ZsErJhs@8npJpK#7>ZM3Bm&**zO(qTF~2>ZN63DKu_Y0Isj6*Uc%PBu zqxEMWzX~grqaAIH{3~WWi$SnwDQV40Q4$@ap)*7iVgDRzHg0`_i*Mz8%yF5CD z{uqRuPf|C~I@nIeT1g^`!PXj>Oc#?9f0o2&ORR@NKjrmzKw9%Mo)SV1`VyZ_pd?V z03rEriT*pO3$=%F1j^X}8l@+^9eylPGIxoy0q#olhQ~$UMwgUuc!Cn2c&IwjOB8ZSnT_;A0S0q2A(F8}{i^ zssS@vuoY4od~YC0WE7&)vG<2m?+|d^Z z=97EzT4EILGs0*7=5?eLQ|i}x-<}0#8K(IxDdLvx+#s0HDw3o$n4uoOmnbwgZ5*DX zj*=A%HeYB68L+;di1*hbb`$Or&PzNGl!zRezvnI-gUiSIJ5rt74}p%To(IqgusVA8 zvTWm}s^*%~=`2xQwM2a=_nLQlH#ZBt`N6e456Ush3dt>G9@qQ!XJ$xzgzNU(t**jf z<2xeulLNmNUR5>(^{hbbuI(e;e38*1LSq7cnGEXA_Z>K)tN;hdF?z*2yF*gf{067h^_@Aj`d~)k_)=wwxDb6YMnn@Xv)^m zfLG(*wX7r?!AIwc5ohu=y_>862!$dnW2z8aHFPIrYBIi|Nb+zIr`Vgbj(G|;MBpue7!y!y;hY5q+3R6@}7TTAnSg=$mxlrTUbE>8N#tm=12 zzFtth=PozrSh7_*-o%kQAwhl^=1$^{aqw9{-0IhMe-~MU_puNVj1CIu(4aZvt&tU9aMI-RAeL(ICvLt$?dD zDx0pw_B^`x`uLV{VeZ)SVP&Ov16Ud9sN2w@qO~N(M)~iHMNW@U>*BCdx4IZW$)gns zeNn~!>|aM@k-Q(I%_kkGmK3!p@%Z)UIH1uTRp$z~TikEN3p)i1 zu83L((PF2)Bq?ujZx)(_MeJNDZnk(KyL$eOhlNx5uu_}mH*H{zoCvcKJf5KCqF4MJ zN3MLns)6C`N^X3KU+zjElOizjE_zy8L>Kn4ImVqg!@55$tp?C&qqLm6NVk(PCru(2 zR{AI+Yz7k1oxC?_FZH*`xsf0coB7NNxpTC)@baJ<0(%uRb2&*R}qR^sUF_1}YL*sC{TQsy zC{&5*6tlIZyRW~I`@*CmYWyStT49=Q;I0RBG7JL3(&s=kWIeZX+|t4`1-$=_Eu08; zZ1R1GKFV4EMu+Zjk86H8N>G#@O7yILbdnnS`^O&xTMe$m12)e00bM5fvdsMzjn1-g z-kZWQ?-Qc27r&(8TeOH%2~XGd2;C$byK#?J(sca(@s%P)`vw{KZ62L?2LrSK z`eW(uNJYg-5rI*1{PZ?_;I%q$^DjGY$Q_{#d9i;OQqsDCj#+WYZxy&9rr_d`bBZX<9;W8h@E+oxBA^+s?xgGNT|!MzRRU5G*b1N8OWCy zUa?m=uvFpNlUre9QBlYZ(_r>sy3O3kvU8+b3N90k8>%CkH?2P#N-M0TCig4MRHoMD z1~qPl>N_vHEqL&3_rbiGmcyJ{z#5EU%sV3RqG%jF@(A7PZ!N_uel7Fah!Q3%e@+2b zdMmc4A=huHiu;b+*eO^Fgd32Oj6FKt-6=OI`moZVh~J5}D|qgO-)oUwTe4jbJr={) zKCXHWJ?N2zr!iO_ne7oTItvEE>3|BcKWM@F*S1!Q&njA9N_)AieK{ZK5r=vymY5`M zdol=w(`60~7J00#=O$|nX(t%D!_oW9pkq9XP<7dg3pM~6Fo`I`a&bFE0mt@UOMV;j z&C9MKBuO9&i?c=Z*CEzMZ%3Fm9Femx@v$-#+8(5y%~WtBq|1+)7NfW;?9r+IR!$`B zBt?$WMo5=@J}oGzJ=31w2qc0oeBhVrjD>kUf;?rH&}}qu7L#pol{WKc^u~4EK&PK&x@J zOcx#(cpG)k=1sz>IPdm1#ux3484w?jFr7GYhb7MEJ1?qnckJH4#M-0U++ga~URqAN z#qVFaon2kO!+fVzItIOz#Uwbz-UJabOUy={Hs44VP8oL*6p?c1k`kCadE{m~Q-}gQ z3>p%*gs&9wlAtB_xtXG@Ap*QGi=O}~7l)5;Ae7!--jJk~lj>{C*IRHKa$p7G)12QDM%j6qhaCCr6#A!U%*@soJ4cbx%H7>JWH|_cwgl zRweK&UrOvpLl9!Oj-(pe&8MiQpAo7=&SLu>Ob2LvRFELk1i~gcq{!k*qZp#tesqYF z`Fl`gcF~@7U~jManZpgAASWT)E||`AN~x3n(}~c-?dw)no(HWR;Ykot2l%T@jB}s8 zvAKc@a1hThDewXE5eKQZe8W{?w|2ky2p0@6KA4;HcSKITyp{u16XwlEW6;sx*u|22 z9N~7%wn?b9AWBMSpA&LW*tA0b70?XYaUy>tJ6Rq5)%|;ZcGcU_u$JGCwG+*ty~nEE z6!{Q(!pzpUE-@>8$TY6K2ybK+fC>PWUTkUTp&9HQ?^q{WaO5zIzt1e$3~AZAT-cr@ zx4h;&zYs})ZWlE1n})scExxN~BmYOyw?-i-(Y$t0-QneyTr1||a>}NH>Cq=k_&{x> zYIK~3Q!{FjkFcEFGK$*}1i(h;ZpYdov}xDOE`CK#Oz)UCYScx}_L~39EX(zICEK3s z3QEk+UYIm<`LG3V{`Byt_s5Aud?e=bGxEcR))))a9$U36&>RwbMeXH`s;xh;ckr;q z%%4?v4owx3`1;-J%rg#DV8|1+Vbsq^Op<)(DyX>W8wr83O%jHlS~F{Uz~?(++SM@i za=^`4Z$v&iw5mWE>dW@Y7+H{vuUa{O0yYCVZxreA1{+H5Uv4AuW7a_n&vDNP9)t`D zD9vN&#K4ga6mm8WpYz?=;xLdUiZhL8)l4iC2CyeFP?1pzss8nIXnmNAxL*QZi-c5D zv(!G}~@AtZ5_;DnKun2H|OR+&3otBzFE7N2v>HiQ;%8VpJF%j}@fC_?$ zsnqN6%%4K@-%|#F+S+VsXxp={l?&Ltxo`=?91`ATZ%6C)CsI0M`FoIKe9~Se%I`k1 z;KIAc`)T~QZWSZCCX}wC_EP0|+}dsj@Ky)=OHCm>wk=XcT1o zN8*N<6VQq!-iT06TD*+o^t&Ao7_8x3B(7aT63tW-=U23zyQYfn!c>x&t?x=-&eQtY zz09gp`zFj<$zfpnA0MYrPP=AZE7NMahs8qsMZlPsBoO)xw_Q=fY&%Y_Cw1wdVvqw> zo1oqGfm0LNlYoGgO4GVse)`KTf0EIpGnLES9E=c>G=$rUwLXh}9r0kojuMCRdxq=v z{h??z$RD7Wz8djkz7NezL#wsEwbWZ@tJNZQVskk9Dz~nE5n(S8G37)=Q?!|QQjFx^mwdWAQG z0>JVWTyI&B$Lf`OEl?70co#l;23Cr)GD8;d!DJcK?@AXfym)!wqsg6c1anecIq5mh z2-}9~%KJ?IO7e`!)iyj1BWJI$6*FfyGFQLp2(E9e4qz>@LG69e59NnAeR60`aK-xO zZFWjRUxsDiHN+9ZBN^YLF+P~rTdJ?S5X;o;9dW(w_bZ>!T(oC-vtkJo6?e4+TR?yc zq1NDc9A=Z5xs*F}>l^b(E24=fKy@6VdH!9a8Or(=H_Tg<7L`V3vrfk^xVBoe7Yvl{ znYS)mvG%@vUNhAchbK=PRvo5*R6G4Z=a^QK1*Z63WD%rMDVuuB3>EfV?#GNx{%2N< zG=78E4^k4`gb6Vm8Bf4!(tniZaePIm$61eepBV_?EfJyl_N#42B;qs9Jc#^{UH~l+ zvw_SxklVjR%#Iypj9|FU_=lgIvr=GlPue2d@5uE`RY~mXmdvve2kM7x z($lmhe2sHi2s>qp@C5TL;q)#qK}l{oRa?Dj8yqY@H*%y}K>1aiCp{*cR8(%rzw7Y^ zj7d?spy-@tKl9;hjj!xBwW6OTKtinW2UCLeQj#H4j2i#OZ#g+i$)Rzh_OsPpJG0sOb9civ%Z)%Cf9piTbM^rPXhTXRYv?>)w@r^@I%jJO9~42fG;hpG|ZkcK`Kti9_KJ(Ef2e`+p1JFo__6oBDer z@^GgA`KK0OPY#hFa9Q-%$KFa;I%aXWlbCj_H0E{6XKn|o&6nTsF=-OT33V8{ z?YFx7>PdK6fzbRd*Zv(3%9TX7Whc4icR#CKl<_0^>5Ag6#33v5Kzm#HOt-l8lGW%@z%Y-yjJ&j8UGOvYh zxJgxD6W}p!(uZ_c9LmgT9;My(5ogNLn~865HaqfF30mhdNE)`i@^@W)-d+uKp6`9L z7QB`1t>|!Ek?8~8+PGipa1r$IQ?8kgrbq_bOO#){OBZmQ!&Ph1LToQIQj1r0eUen~7q{wu zM3u3Z!<4ZavcW}bCe^#j`L2FMbJ}{^W}tpD5;(<|FKZDYKv@x{r^XMC#JXY)G4_b% zWXW=A3^OPgk^*%#l&QC5N`>x-B0SUF8r1sfr~A46x6%-Y4l{NtKFUnn{DnODTU~_I zUJhw6P;meeg)5f)S|^K=zzA7{L=N+h_d}-fb#j-UiA44kqZz zEx%BAuNS7FY=v#3)%7R*T9?DdO1O{1?Sv^8Y+KYn&ocmZLe8VUJ&4X}VcSSjeMw80 zF=Hc(YNgpDUfKeFGwFW6i)s8Oz>*q(Vb%( z$GD(N!0B9*<@1nY#<1hC^Xs{u>NF$D9dV{Vo)B}j<{suS`H${uZrXu+g_xb8gwtqu z4T=e@)H*##h)wnFbMR&`<~&xj>(gt@6KuK?_r0JOqeBTQCocm415#zQd>*7fX)=Nd z1zIxnR8G_VZIz&ZDHvy<$G|+?5g=T{+sEE_<+bIF7iu+GkBfA!RC-i6$GUWhN%c`% zx(5`e+#5AnPF&YMU&dMDhbm$%V46Kz9@J6{0-#G}R#ov2bwz*R&wo^cjax|-lFnFb z&8dqVv?Ds?MQdwa7Qdd?&;@y*pWr2^X6Be+{ijiULvuSv4y{yCb*UY7?0oHP4SuTMHf6UZ^C_{h41xB4uV3nNmO&moc~Ukky=jEz4?!;snj^TL71 z*(+1;8?Tj3{(}#EsD*z<2rQT7t5-pA&fOikpRl4>alfMnv;zU!!ae5<))o_16bh}k z^uLla>JkQ?%6%uW5A~b84n9uXMXjN1fiATy-I{Gsj?wlmTr@Vh^b^U-=|7 zF2j4`rDyBzyF5Y);ZWaf$-gdK!6cTcP<=v5HgAg8m14 z-x<|Z_wEUVqS8b~M4F;B5fCCpItn7agLDK5y-DvxUL}fxLMWm8(mP7;K@kK3C>;VM ziXl=11PBm9=J@yh-??|zx*uk(S!?FQu<{`R&N(@I@3Z&wJioFV3H(Q;Ju5h13SW+s z5vV93CBY_3>hf(=9{M&zL%EE1W|}+h0D3x9s3^y_BGwBS#uq_SL#XM}=6~o#uBfLy zTGu@~1fBWoY#V?5byc3?CEIykC^lkfb8^=&;q)eC8OISIQO8ynu30s^>a$ohJ^Sv) z3GpgWkaQ)H|*~*pd1k`klkLEmMmGX;dLm|;_2!0SS={PvA zw;$D={p8(u;exanHw#_%h`2-heG7ph;&X3IT}X9_n$JJ0io_bQkl9?ESaO{ITf#y3vxt{@J7cuZN5UO7q&PK}}}8NKV@3^2Wy2gS%gZuRv6g|TeV+K$rmBM{Sj z^fZ zR+>OD-jdH4qsy_q4x6bRTCE-1l08qHA(`$_l!uLRq_gcyOe00hc2m|aV z`Z_vHYSX!PnDu!Og**^{M` zyrH<)Vx8U1jQfQ@6T8L1R=-T}O3-_iS{XD{=Hu$}z!)=(C6Exf89!a|L!m;0%l%@p zYm?#G5-+*IyqwJ)e>r8V!>Xl0@4Sn*<% z0o;i)fLwtG=r_?dmCg&*SwJMEzxrs}sVjw^Tm*c+fT))~=2U~^-%(r&1w;0}5d1AE&ck;bz=bPISVmz-f-_+8A-!M~nKWpO6C2*NNbsemolf@aXAI zJDnrVCb-}vpVsIXXHgQYlorEl%!Hhd^P|OhEk^FMh|o%dPFm zRub#1&u5DIU=;0F`ct*LMfGP;M;?M`E)Jc6alpY^;jFV@z^-GSXu+1cf%;ogc_3sYh{)~y+zWczs zr0*3mLeSLt{6X2DL8u@q0Ps$Gc4S$ydmqE{F!9{au2(67%L0JV`}%4Ylkx>1f-Uwy z=gSc12bwCiDQh(BOmdzV?P+*35R|9ibAxX(&1a0AkG-ZFM~=caBU;0HqZm|IN$@1}rrHoacToV3zRD zhyPQF*ME2V4^H!}Z;E2IIJUW+_8|Mu5aC1x^gq1jZ!i>ZD9`m3M?+0JhN@{)&F_+D z{Xdo8%dF$mf2xuI@A|(>_h6t--9U5Ab&&GKuvpDph>y0f% z27FTG`qQwllYW0Sea&?iUN&WS^>6eJ>4^Lsilu?QX2+Q@aNShg-_10(Zp&#ZtKqU+ za!!+~!FCKCGT>z1uO;lpPuIj*+|MJyVB*?v2#<;6b(Xbnh(n@hw-U&aeiPi=1bA_< zrOy158sA6$u5O&;FamYaS3Q*I;#A;kfsIv0h&zF+;9gR8e}U!G|dEv8v(h>ca_x$18qP?Az}u^=k(rm z-fZ6Ub452I*@1w!Q}$LjLY3*^gli~uT?MndLv^qqIAcjjA*2tG19TCz!YKwuzny`A z(R|@|34;UBLjs9NEsX=sv8a;oix)5^TB+iqIBT2E*FffxPb>9Hzx6!F5Xh)F_u})U zJtJ4=vlImlt~V?M4tM;q$B}|Q`{dPUzUZiEV@TWqS($~MsIL3RHgT0XN z4O7_ghs$sLI@0&?qqW0M}VOa+^YrpFoJW~}VQoKDU zmJIvc#>**UQ}(5QwK`u0APURc5-GkX*=_Tlxq!|B22&7F;B7H#^t`$?vHV_Cu!{lk z`;*GIOKl%Q*|)gdQ}U;^{{sSZvBwwCG}G6FLK3Shw| zfwo4_UR$33Y=GfOk3r3!uEWmzo8z;kp1%Cu{ zNI!am7A75OS85Sn!7_qpV`4O;Qe+g?)P^9C5O}29@Ax$2*YpYOz{n{PvVRdb$*l^{Zv=9q*`K~HVS(HW|P9Vl##d45ZS^DdQ| zL>Tz#4)~p1(j}||R2i49Cf{9}GbGxVKIya~+Ir=Lmv647Jyf6S!Cs<{7-Uh497S~kA zfuXo8EqM?gC=z`JsJ|kB5nBUOd*|Doti17clCD#tP>X|6MOoC>>MXWGA78CMwRN7oNo{-L_39DmL{R`k4-&Aj1?3bjW#*sykk zi!Ra(h>7WivpFKBl|Z>3 z-oC~28e1k<+u?$L2=+FEKv=chBK&54urVea;-ECLudl6HMdSV8v>oP@T{@!K=v`h~ zcEnUcQDQ5goXWYYLWJ(cv5K}XNsXY|g>6U8Z{PXFW%`uJ<+dDLIP(XhODXC9PZ8I@ z^0_~^pK|*=FhKwP{=bcK{_lit|A$KQ|6OGG|4$F#75@)3j`gig#s_0TTD@&Z{^50i z0P{lu4F=#^TdeBvI^Y+ztbi_b1-$x{>g>Rg<`7AKw@AhpFdTF^P6BF?^%)rF14~|M z*FEGkdqaTmYn>YrJ_VeCCks<)OUvvLnnbpSEXs8ODu|*0Ab$ZOL7--e;jbjn`qKN- z0kE3h{i(Wdz)a=By9KXXn073Iu(Ew9Q&+rt{-*G=o@bD)WW03tho@=wY9}l>;&e3C`bZK>xTH zvZKaf?F?1H0K1wdgo-41 z6lf+uC?gJBo0>I6$3LmOc!8szR%#Rl?nB@7FkNJuZ%3%6Kaq!}`y>EiYX0dC<^!d# zZH<`euzeK)g*wCuyVD3g4jM_DAU`fb2LSK0@1^`7fGLbvM;TE8!0^D&8^Q$w>J0$K z_yuxU?BYK6ScNMr1We)mO$cD*c+ayn7|`tEk%Ay6x3i7~{hrxMn4zB()2msk7`@rn zbqCPg!%HSeKvBPnQs&jUoGfBFPIg-^ckz00U1z+WYeU+kD;H7A=jL)z6o@CdEs3kr(12ETh1A24?* z`kZ3%claFBS+ z>aSDQY%-n%oW(AqP%+PhbZiEFYyetFljVbyqT&=4Tybmw;xHQ)c6kdt==SjmGMn2U zcSmpvv`;Swl4G2r^<|WN_j6U{DwvBModkQx5q7iK>Kg>!L7E0lo9y_U2!f?DQGj&< zE>4723A6^{0>y$10cca$%*qTShg5}k^m>`?*g3KsD}apwK|9T15fNUT;nPs=W+Jm z<(0vb)vWV0cJ~KdDdRxl{)QU+Ofka#eT8R#iBImx2x_fuJydA$J?44Jr>J|_q~+Ee zP3|x2=_4C$6ZQPKD4LcV;8CyiS{7y2nY^7v1@;5+t!z{W#JH1>Ji`GX_y_d38D8{6 z8pnIOIy1B5B-HWH<5ht=La-SAm3hD@1wg=ZG+l%JXPgP%(g2C*SUM{91 z>?23z33~~&>`WI;M_zlyjf)XRE1$dfr^88t$na_(L1z%Q96lYcqU%7OhAi`aQu&le z1}xniB8<%lg4i3_W;l_sPm7)=JZlFBI!U2mEoyb1;7Guw#-=)wMrhcYqUgPV3#MtQ zI>~tnXv_28(*SaY$>ALzvDRXFuhp)c9s9uJ0z$&FZ;hoE;z7v2xd66pUCBy=wMOk$ zt7(Yvm_}dFp#7yi2K;1%ax-90*w0U%d9f2ccC^@@xWgALv84^vSHeTPLkzVv*J;)b z$nD#ZLDFYHYKKxqFJ$i=g6_r01@V%Ul$d_Kf(?u1XV3sJG3W43b)1NqZ?z+93!OsJ zPG_AvQnkG+gya260>x^LZpLpCw%pTo~7VVET z8^jL;4=?c!65e`6PH&Bp@Qd&sY5BqqHDAxwmU9QekdxqZK66bTo z7Vf)d+!a_`7}X4vitsG9j>#c4TH&z`-g8TxAse?qI@-N9a7+=Jw$f||K~3AaBU7#( zy4TujHQqNVh95w{iI3;Hy8*4tT+ab(rG;(C9X2=DXRpNPwcEj=>23lZ};8*&k?dP_V zCDAoZQ7PvxtOT=2(&j0>*jI+0yS))==LhPt@u}ZAi`Suq+4QRl(DE)!p#9ptpwl$c z*gMMIbIa5$SE|P8Cqb2@8`yw*{Q0cV!lQ=m+t@C+lZ)4Ec=T!|y5VD7G{Cz7%`do7 zxoDY2km2F@H?=rSq<5^-c)A06VIim8i`Biqw8Dq&?+zxlv878@DzEYFf?I~zDOI1Y z=Q3}sMv2Mif{yXwvOl|wYMR2G`rEqM4i&F&oh13J5t8v{boQ9_dP+Vtm$6|_+~Tm5 zWqaPiIF0Jv-m#F2rzQU$1O5AvK{?%Iwi%2Z zJTA8KSiB8>Xxw+0`ShHE>N03CTB|drk_q22y z(*a%GNL)x2C@QB1!=4yNAeH08cTbXP1u|$z0$)qG4=Eb01!T;yDpTW{ozwRVqq736 zCb4VVuakT*z{9CGzC67ft}??* z`fySMAE=!jLKCB`+1X7eSJtEyd~OtX54<;v2S&|i@^au!u_ejZohmM>7q#i`Y=#_c zNiQUHyj&c~yv9}wzy=or#nEn7J`NVX8k$iT56;zTSwJ{& zN^P#HTXtCaPE}A=-ah7UJETXn+ReXt2}H!ftbFnljRsqlQCii}Uc$jtE^BV*ntaLb z4T2|utw^4*bO;_d#bw-Pw6YMmk)w3ynK;ww6vo$Nb+CX`_;kh$~@?G^d%80SV83xtUAH(tZs z%woiqOI#*5^rJTLCL@i$p?tb2MYFdyE9q3D4l)r;HPQOZxQmPIrYF+Y&3Y=qMu&-FRQH>7i+ZQs zs~#LO1*d3a>k@Fq_`=2s5xZuIo@ zF8b@NNKku^T1+Bd5I|8(EhRSmaEEzjF)m-5;B`xhS^@E(b#g8|QB|O@NO2ZcA}>?y zwwr{UR&*fcsW>8L%uaG3?P%zw8l zli1(Q513@E94)#nM-JAG^Wy!iTpi|c!4FSWO}+P7FzecD4dxWu`;ujVXcQ9@t*IPz zm|uG+Q?G)v@|~mnRe{n`$wMFUq4Ugrh|Jh`d~00Bl4mF)I3;Ic)k>w&4Hp}{)83rg z^B0{lqs8Rh#~Q6=#@$Bg2kY;4&-$gc!uT<-^?_j!QC(ZQyJ%Y~Rxd2%V?xRP;Tf^J z?&@rGIEDWyh^4?uyEemzt?d2;&vtfmv_wf1`vUvJF6(Ydp)U~z7MmH!4oRP|V2fql zK|TfX;PB*Q9^A*Za{E<)E7{qm#^OC|0udT?`<0!IKdR&Jf7}-nYb=Rv+Vr*4Tp8$m zq>Zo;&DTmW8AEu>ehv(k7$pBHv}j+{B9Z1U^P#&M=a$!3=M`aNVlEEE%gWDo4tGXf zzy$_`UkXNDGrXys71Mj%4N@Z_La%3@it)!=RN%uNTj1B)c;h)MHbUGT@?Av5#y9O7 zrA5UUF<*I8Epyelzoz#GN)0yx zzntB$P1>aDPiq_&(Mt<_D@@`h}NG!Zzcc;k^|Iv+7|B{k@NS9 z&P=eBd3h<)NvI5VHdT;OsTkAFzvF=KPHAB6~gTP35WQ4`?h$?>P$xZH`xxU6H z?G}jhE9ava*=hzIdM|)3Sw!<#?%B&1tY3y>H7buoBXhOkSexjP&NA&*MbUhC9A0ib z+>mcit*!9HiXqK8&QMuRP zVxw_bf!YMF_Pi`Gc#gK3IU?7E56yBD>_j#|WX}D{0k9kIYx0>B;C6^>*>RhW276D(?n1+m|v2Ype!1ftMW zZvA7n*q`PO_@t$S;;XBt+G34r2776?BUh;8LPKuiGl2U|Sgs*7C+!dsC-}qm%4oLZ z=xJ}_R1y(u=QPgm+Wg4bv!pWuj()a}r#fR#NAGvjo>#i69IDt~P)=mFh^ERGtY>xR z`DwS3Wwyc23H&(A6@}!O;kX7(_$WNB{U+7fVzjE>>HUFe-9Vq#r~Wy0A(@V zSoMq;_GOSE`XLaM8y-_?8T%WPaOgfdU@p=f=9@x_3qLzo~-ZbgwgU9;Yh5&Df z9;Fk9=eM3aj4BN|Wk?lAN0Lv5uOv|?Sa_}2^T^Lp9Sz#ivF~>4vJFTyOs){T&l>dt z2kGyHWi-?c2nQ!s4Y~bjbZg5gZSXtrkRxb4Gy@k$3$Ay;zF+x*3Ved3$$HIBSFOR( z?0RrP8n6-XCe4s!;plB!{`tbB49juHjX+5ZYsbqM9-JjrI%X3QwTpKT``a;2%>qTc zV}G4{5Ou8I;PPPf9X)%&uD(jybT}O0SiF1U8$SDn92O19Q`r-i{Eh?IL}22*g)^?) z7l^n9vo2I=5ym>bL#3Ui@AMmhy+bljbog3iXnlD@T}fidkuln`N3GkXWGSt|EaCVT zSZ&J9Q641q?l_*!-x&PH)vdKsbVbqzlV6(z>j!D}UW6y!knkHpofrAGNZLO{wa1-v z_X!WttWwp?6&OM}vWW(s+L&IZAP(yt7_td-(-w(so%uH1+851Cqjx8lg7en>vQV4x zu2hi?XeyPSR}o9<*K?0$=lyy}b~&?Q14rbRPxpNXDnkLyoWpL!x08Q6bmJV1$nyRD zGQ@<=kaUEV>1L*T_`vl!MIS`?y;?llWRn0-}hfa=*4mU^D@)w{E=c{n=RJbOWi_f;IF2x;~zHV|Dz zgocN&IF{IX)6Ylh3s#y7jJwhhq z!$R1~8vlaL#L2i%^}*-oy~fy9gQuFW`ajaCZIWx@cBRIqUwQ4TDtfVb}mt=e}W)pGMQ zl}w%q7-_Id`Py{kOx}mRwaz7$hDQYu^*+T@+e;3v02z4#){?m|jmb@MF3w0T-R7Pc zjz@%TQiEVVNhQ%HkV@E0LF=jd2Bognvae>4#mgMs#VTKSec^FiW6R!y3Rk?0pFjl` zSZ*ExRi2oV(5d;{iOVh9hR?}4&v#V4_bx1+R;bo)4KOZ{dlwYF?Y(m&*<*Cb6N0%k>8X!@Gv?AmxR*y`Rgx zCyHB@R|%@T3EiwF5Wx7c2Cnp)M)Fs1sB?0(+S48TW17KBQr9>+G`J%R_Q;R#4Kie; zw=JR0bsGUf9N|1|O#U+n5D$9*XmGhD#&QviJf#IEbqC`0@6Aedjs`DC*7o2(ZljkT2;WN zrF8yqrx3*}9H;Q=2pr0>6~EkGN~BmBF&SeHzY(J|5sBA+sADHe?AE~U(pv&%Ex*7# zwR;TrCaeTX0enzomzv{gfT^6TAu4pfI5**t`vkiG8p(6*hxy=vcy|H)`}X2&+AClq z7|hQshDSq(y3c}bgB@HIYKh#9Tj~%3Q^`xVaQMS^GrD0Zcm53d?nWE@_A5vCtmgwU z`5|P<+R@ZW;efpP(m7vqj8`!&$B@}3L?QG0_;N5=;yuTCr9PHGWneo>7&kn_ypn3& zRbvZDu@f7hNk0H1@lz6xO7qkruCi0U*u;CA{-}jYj~mceh>+Q{uB%I11!C)k#7h%lz|`Z&AOgJhjuO27lUb}5hOG5>Q4oU zH$Qc#2^TJ6j5mf+=xaYN>qcaZD5gU`b@2yp{w&^abzOG5CMXsv(J4tM&1ME z^8`5hT{thx`~>|pX5I@$KNzN%VbWLQzOdII=gRvEPXlxh+q;E+YqYwdrcbRM539kek&$RXL#mvfBjDqL2!^yNuI7c z@h-Ewq_WzOriQldU6GMU+$8%T}%KbMf_ zOl0Ij`15udD2=YxDKarvMly{q2d)8IeiqMvTsZSZz^E0u`!A!?L+Ycg1A1^Z+b>q7 znoo6|6sB@Vg5OuXFM>Z^;dy-#ao#>pXtdFH)geB9g!*VvAXPezq^4gpte5yG9|N$~ zWQc(r+bX&-s}#|4iB+eCDfq;#(HAfgmdmk)$ww+-LR*~xmqQ+Bpy}P$t6@aDp9llo zksgCW>$h!;_S;ujgp($vtAr$37>%aj$O@-`)_ zxUri7-f%xst2YCRNBN(r4Jb>-sl}Dsg(-UZzvU)+0D_nyC_61?O|DBXb#*mIHF%Ox z$N)!DOz%7gT#c!N021RF&T`(&B#10RIy*jr}{w+lujo-c$$PF~17TzEH(w23s0 zklip+QaA*rJRz`}ymzOWIlk1MBg}`GydN}gY`~sf@n~L*ujU=!7R55zAv)DWU^;T| zrfg)Mp3<|C0Hh1KSkUPlp1@K;FkX>Ucp{&T`r1`noJ;rJ3lToSGO0AK7*EZX-lk0I zQDQDnGW_LB=2?yAYSdregVC-%O3$}VZ9XO<@z32P)^qd%=_P)`OVqLJSw+R~G077cMy_!n9qN zA4|T`$F+M4FGlVKw0R0Ao2A;UmJY}Nb_UHpSAa?0;c?f}JyQs9s~jUH0_9x4&VR}} zUW_yz$pDGo`RK74CBK#BIerxRMCi8(8A_}F-D5x%u&d?g!FVy29@jiY+Yp(q#(cmm zB-(MaG8q>PrT~u&;P`|yJR^#6OTK(7ujeADqAH(EHyBwry}$?P*7ToKL=4Axr+$j7 z6xjq_TZrFLG9MSNW9vS@K~Lh2_HN~{?ww5eF$VHJPV|hB=A%tRbvz4snb4SJ*Q+8+J8KeEqK_k1 z+xksZR;)Z?w8<+c^{69S0Vrqy^+_hsO_y!ka;}m|CgAJOfig_|nk=*pv1_O+Y6>*$(j_@szSiNo4JMe;Z(JMnrw05}b!0Owh5IN`6UF54w6i&_5$KnF#n7?JKv z&T-#0x{V|sIV%nX9OnT690&mU=(p7Ld5w3kA;JUgf$bfN7TVX2P#sw({GWSmr%H>s zf9_3A{=ESq3sja^9Rspmkzw`5;OJz4>$-P=!935L4_S@kC|u{qY89rDfV(HL?U$>53VX#MCyyOL652=KFy zLIf7guEaUdq59|wnWeX!8iI95MUS#Bej$)9TD<%_=H8QXf7>RHQb_-UqcirP{RK-Y zAF1uLZ<@=M(iMbBlw)@ZE3XGc5m?5l`TMNy)i1rfK~RhC%vJ;=fi<8W>E zmv`r@o#t0NA137rFF-<6{au?p5D^~PKZz{%l-lN{1yEek>++UrY2~`L=$2q#>9rqR zDN}w|(Xv9ayti~fiH-wu20v_ydFC}gtMu!)pwk@sQGHn7muJ#9?(^r0XD4~9 zi?KE}wo^^+16z>L{9<6fu6MLKCO&GDIDh{$6WJ;1zI$wO5cT?dkHTD!KE1`7{f6$z zanjwh^crXBWlt4Hoz?&R;PRCftCl^x9#L%O(2$35*@e9qHd7MTseYwQrWLf6+otczQ4L;9I`< z#`2A~Cu!cDvp16*zp6TJRHwAN&2_(MJa%Xp9Uk#8hrp`TsZDU+x7B_k9zDV) zH_q0(+&UUh9GX@NCJd)E$BdP~2KT@eb+ldAY-Kr?NCx{{KYNshl&vOFr`8v)50e6f zxDQZ8?Vd#g`2>k9`1BN3T=i*1 z(_AA5rhUJA)WVwrrrZUG@Vvt-gkiVp3j-UY*0UwuI;*v3aATD7I$kEeb;7mUXuZ{e zs>Hl5uBTT{J-t$RaW;rXCs9X{CXDw$D6I+W;{*n0_o@Y&mMxEau$QNj8p3YP zaO!>u$Sj)FgLOnU#TX^3`n3-skS-q4m!1A9O3UWE?!l?kUA~y7%4UR;qm(Q*>dhtX zTdRd;U)YsmUnlG7MBX+{f{Mpor|6G4%Z5ekVr8~m*C}TYn0(GGLLi0P$Yus@-6KfnE`pc%K+)W^ zdEO#8l~^WP#6*XGkfmwzW_47+f0~yeb~Sq2^T|!lwM8N5dCy_hx3_uxRgGIhBNA!` z({j8%?154lB7$Q;&-Y%w+2;8eD^=Hn68W00U+N|1MMTuQUaX>7Yfom=j) zW#J2@#;3PIRi~Vkt-zK3I@u47EWuW`<*aB?v^n3ec22-?C1=WwainrQ-EyeT;f$eu zXEe>0Ku0G-3ui0=&wKZ?Vx%v27qSu6caqXnc5VC!`3~r$(DCUQi5M-d_no4unYY~H zcOPWkADb46ZucbLOo=h8%&pdyj{_*Yp_UsMsYwI`V`Xc)y+(cF85uazOLqGjL0y`b zZ4wal$c6MTO+8%OG(m`uc|MtJo-c`OHIl)i zJxr7z`t#r1;{}Vuc}l-q=8pe}N%PagQJn@|gq)O|@bDAMHUdu@I&;=m$75IRSf%sA zR%Q`XT;!IUPw)*%6}FyuhNgId(hjT75_zL!b%YKi&jsTGiN`g#As{jw940I7MTSgn3i1S z74J9vn+wpbwzzoVI3Iz7N(3hL6K4IDv4nUXu}~=oNpbAUCfTi!V7eI0AV#Ric%>y?sJD02`0Sf`RM zqr}Vl+(RzXnu>v<5x2Z>sY$?ifNO+RQi*f*@e2g!==k3)AE^&@+?GHLqa`>OJ17MQ zcjUNEv~0UEWAhQUXaK68UP}K}x#aURphf9r=@w~??x53-H#DK))S{~SC`{o3dk!0a z;-k`4=*F({1`N|~?JqCD^gX`pwdm&Fvy>BhJ67eF(-_w6hq78#@uhKUaPenA!=&nX zMCi^n$kx3pa!Ii>`c86x)X`~k(GQ)l6nrKB?QMz0q!axyR-{%KFU)P5bj*7|{uOD? z*t}R+$tf2Wd0^%Ast6pA;WPT9UW0L|N3Qv^+sg|%#%WBDed{cWNiB8z`r@eQkwD@P z+Jp?F9e$fMTvN+cq?yig|M=ePKJs(s?;teBx>z?Ap_QHMq0(=T%MiI% z_=6@V$Y^os!|zhDdQP1a_!jnB5dqWiQi=GC&-2LHFdj75ydEw*i@!yz5jXwAhcFfv z`}3?5Blcp!clAVs0ldL%F!EGPbn^p6TE9~MzS>TA?U2u80G)0Gb~Qm0Esh-|8I&bg z6x+JEHgDBewuMuGg;L{IuruU+@42B1by$H%Q?GFv$Dn|$bNI9V7B7_5K2q!*(tXfX z_hXEjMc3X1|D3y`7Z^RTb2)#^$UDWCTlwKb@h4sLSGt9^lE)z7yz%YEVkZLMo-6LC zr(@1Y@XDXxyiqXO)@T#2+>Ka>hYX=vcka9&c#pOyrdkgKo}97L<)l&{;*TR;Jq#sH z(gWRA@_kZ5yrTAXRk-_?Bq8ajCY7-(-O9B+tYgD;b~CTZop$VNc&-l}i#NkjY!VZN zMCi)ppTT$2L-O-f{enlNY4W2@?=QYULWOqbIYVW?iPko6X_S&b_=wAX3G}lIu$1an zvn*D-gC`dMQDiFetK4K- za9oCsGIhZsyvizApxOP&h);b(KCs#6gTSElWtynEE`;4uoRpjbA@oB7)%$%;$VYpo zMpMJmsj~Ccyi~Ee09I>BU+H{sww-P0k$}|X7yQXZ;=#S_)vfdcuUhKWp1~k_9lC4+*hmUBy*@xpU+aEFVH)@?*nXF!MQMF|ULOE@`^wKL*N1NS` z9TeL5_Jq?PI+u52sXFRMGJFzu<)#Fck&*>Ru_&c7bH)A^QUzuUjV!CWT?;OSe zw(UVBf$K{oZ=q2B-JcUo&~7!f@}SBra=A|*ApnQ5H5jv}^>%`!>JM%Dpw><1=XOO} zoZoRIFP$8&F`ft4i$K!?^pq>#{^UIVv=QffdY(CRHWJdrxA|!|Pk6wwpED@i3?XMP zJ_-&P`c&^!^^%FF=zcj zstU)Ca(_-QjoN^RNL;2dm08w}&peuM)!X`iM*ATqJR7sf{>*cu3kEuupEuWjuKKHR zczsM5ublky+3uD3N$pPsosfM#yE~4R8@Vv{Up3BAK_Iq-{AxW0V=OYzen9hc z?sm=E7}zc}I9?-1{l=auRA3>s$}o)^t-8=g2H zOc1R6V+oU8CPP1EX{ZmgxY)1A-p0u@HVem;+dm<}f8qo0%s&mh;v2nt?iP@bG-XbA zw8;MSKXzFQ$EM4GuIFAq+_2}%h!mcm{M^#;s^MbviCz}1R6=-w_{Q|M4Bu?-k@-%} zxLJ93Aa)QZVrycz&y~WQ@UeQr1JVR+Jdn?Pa8A`HTDYUi;bZk{?X3RnUkW;>Tjds? z>nBVXYNOWQC7qdy`zapf+QDXs9NOQ946Z7Mzj%o*J=~VtbpS_}M4y{hAq^ZLnUKw> zb&LnuXBhJWJJbX!1@^|qHSqg9eB)BL<=-+SDi@TNAgf0Q6{A<-`~pgiP6^=<_At4hKLXZDjj8Qz>}Inm&|Efj71b^KorZ6wEU@ z80;E8wHo^h)CXUQEs}FSJ-;z*7slP0{xhORX=CK)gO|AXXH*sBl@{|ZxE^}9GfqW3 zEfVt2kYWA-+L6L;*e5fl)KV#qx`i__5)=5HU}+G}=^mbW z2WKz2@G;upch03>@?b9S<=qprd9B}n|M!cM`R9BZYWKzlQ%2wohPjk@AwJriw?3+k zQubQ^^FKAds+6oW(ERI2{f`YuNu*>-AC1v>)rQiZXgVndRC;kN-GPZCGxvWwX6-Li z)!zg3NFW@UaX4<8JOs5LUhiDw6#M<#e_kPHbq{}k_~n*4o12mjY$`m(uuQv5520P8 z?V}B)1;cxcr|t1<9vKvj64yvr$P!J;)nKt~dmA z+Fw5F+O<53v%5L}wAX)JDXz#h?i1k11CYSDrB*z#*TL;YM$ed^ioyPu|LieODiQ#7 zm%eXb>p`X?_0>gj@dercG|+#vMv3!vK1SX=pUX@+EXpj(v@8r48K-DMR=f_MI_X}6 z@BEjqcq>iN!v~u&Tf!XIIlTV5qNtgsR7dfW)d-WuSA)C%426GxQy=xQb4Yq{WZU?M z2IO0FyQz70Z!d_Y)O$oHv)v@uQ-&V6?ll3E|8jw|a6A_>CimjsH&ZUsPL0Y@8s6Ro zI&}YR`i{me&TAf4PPkoC5V*ZNbw^+Ffz5@3m?Nbz)X6uU@TUVzI_)6wlJ3&1+4x+z z$S;o{l?2{nS+xp)gWHE+uJ-k0Qh4jY)9RAMw z6xqic-jr}~dx=X5eUG^&(8x}!5HqLJh8QkY0}1z$4kY{d5$o^9{{YB7Gp77Ncg589 zwm?p84T~3xmFpzx9BilpUkUIXHjI@J;Y@ulvD+ z6hm$xljBnT)pj!I)EE|T)vFAzmqPZRC`nduac5PBqQBf5(@%-H;gK)*CvDhBV=sZoZ_&4Qa75T+X&lk(^s5?5Kv-Asmq=xieU?~xkeedcD`RPvRo#dx`^ z9s$_)6@oQnUsD8k`so$-zlx|dMu=GspD%hyGBPTqsdu4&-UE_6^*~A7U%2kHzwE7R zzAGnOI$m_8pafcxAK(i{Z*EJrj-u&XzMu@tuJ#Qf?NmC`RUglJQ$F$k1cSGf?B2&Z zCtpAFv^?(L57n;f8VC3SFjFeAmF`rBnls^msX+8o0&;$mCp9q>3fcFV+~0s|53g@~ zqk%2Bpr!ty;ektiR<$(j6L$!H(D1lol=tJwt_3L5aMi6jMV&D@B*8d; z+RhX5?9sd)@~qB1)H+3m;p?NtFH>BbnHMx}rEv%({CP||Um+HJAfZ{axw+{=r=E)O z=meS|R1Vc8*1iJGbfW&jlPN3>^}%jTT_;u-t(LNzSrlAft)T8 zA`G@IVwGX&xnKm0<$up+CA?h>EV^rML8fo6oGLNA&ibYSUiA99guM&(MhZVNx)Jlb zU1eaQ^Z1NaCgHiQFNVzy{@F1cp(C;8*k_;m)VAVYAeT%%P4dJnNip?CSpuy9S1f9s z0Zh(DY{Ze@W30y-Ap45`JX;1j%(^yZFL-m8o4lh32Gkd?WD5SCLT@2bpO&GXCy#JN z-5dK`HU$HLG~XWZJ6k7P$6R;z7T=b_)}<{eaAZx9T_SBZs1nOp628UW+idDEO>+&k zo~qc-4(iH1Sq8zF^s*iZ2cMzWm3$s}s`4r~*3%oN=oU9|T(cm#vrv6pXc zKPs0_g4*D$FWXTbERM|GCA*rQ%ZHVAEjH}iU5pc4;#VbqoBL`JE|ba;7=KXMPBB8W9|eB&DW24CcO4 ztKmr73wsgl(0sk=T}$O@*47^f+!=+>+idl5gM}@)YqS&!ZH3%QD(EsY`Q;}Q^J zu4s03VH%1Hu9{mlw;k6VyLa*ZAWQ#&(220MCz!u=Bk!Q<-^2epd4X7(1a>Jfn8P6J z#?4uXW2Nt}-jl;~l@R7G^z1Cf!Llde8~p3yUHLFrMYvce6E1XLxUGQk$7X*%B5G)B z(sJM3uWI}IZS`S8w!{Qf)a9tc=(9^5wc0byIQ)!Ua5Iu7oTBZ+RLX3$#Go~VybHyP zwuvn?G68-r2asO2@uOr#v?lQs@NT4+q2*Vn-d!{#IQQsk4Y^Im9#(O!a~P~TXi(lQ zU-2DV963-4wi$|_`ldX#FW|$vkm>P9`BxR#sEz+Fqc=aj@C13N7qC^kOSd^4P6(kr z5MhV|c=|?m>WBFE0$Cow-5m0~k_ZLk@I5(*Swh%FZ<-g7d^)DWG1q*8!iGGW>Z52e z^ccDGY)9_9l-_6b$J8bY%SV>#6*Y)NhL*Pe(ITRj@Z-C-irvk>m%UfpaPnr^?Q|bwzpfTiwh#9 zytP416HgF#+sX7$laBw#*eb_@5MukSiEo-kF69TRH5-3I_T1`hIPIB{HtXkcAndT`7fDhoZ;*Kck)QP} zcST-Z_Uni9i!M4lFJxooln{E==j}^aUGt@^qMjpZ2DNE{!X%%!_!^H{chB$sVQwen zQ=QuUZ>_}3h}!YscY87UZm@bMDY0&~;8|z5T+|L*_0vZm&XQ$Rt#~iA8og=ku_yMi z%Y78?nQ5M4n2c+34wT4+;=q-CNi>roRP(NpWJ`2V56QFC?5? zG#IE6f?f_PB{^D%cBZ%36ohb}YW2GW_M9=e4s5K5gj7<`JrOKCc(Ffha>CRTD-iWt zsM9LCa`v&P%Ln0%0Z2jTHqQAwKZXeHD&6La@2h}cvqH+GBxciDOAWfjjPrTtk-U@e zo1kAP9-8np;swW_M#GHw=rPpk7sQdpnW^w*>*DTDhjP?I05X?&A*_LDde-Qfe<%_D z`^bUJ3w{}&luSLYPQ+Ihn0B54x((AxTS8<4p*^bQbokJu3gi4sTaHUv+2y2>)WoRb z%+1wHIftb#A6)&ce~`EKB2fk1=>UI#e39oeZdg~bTJe_~vwdx?07;NHLE?P9PajE# z8Kc)X2<=CDRi%zd!ixmSNK*7;1Owb+jJ)wOTbMGk9T905=1HQ%##F&53cf1wPfa@} zDVsUUo9!LpwIQ$^y;WM$VrP_X6kU@^9xcB$2c&WLUC>rw?#kZ>b&_YItb@irZ;zkA zmtHv9UsbvlDPxkRkeW@rH`0gPc{rwR)uT!1d>3`Dw5&RP`au{qrHguqDAL+F8^yKY zE>)%3a#VZA#!PQMZ{SD|CElsB=Xx7NzV*$Y9^i{W@&;zI!HlU`zE7P4lNd6+#>b4kWP-leKbGnD@4V!*oR zoZ+jhZOm1SbK+nr_iEt-f$&G4vx@d4H7I1gRn}i&&ovR7I7i_Fby`BCZQ*-6g^2e~ zBM8A1D2?x6-U-YF-IcCGW%k~*Sv~ia$PX+*ou9%(4E$ZORxU$99+%)TR=O(f z2?;Om8kEJSoI19=Yw{^y4e>RqjY)m}NE6M3W0_t$jd$A9@`IA)!_Ac1Dzi7xY!7PDa+Ax&EX#T9cWtP z`Go&wsJU!Wky(j$P`0>_dI?|Ddd#BvqjK7*cXM1VnD#lgqt+*9uhyvV0k+b%nafnzo5T zlhvDHp{vs(gOW{>999|bi!Ju@^tyBL6{?8S=n4-$Yh|lK@_)25i^|Gh4-eNnl*G30 z)24g>eEl>yikDpcy95GKfU%$&C$OjUfj4UsptCXHp{>hp+ngy>HId2B9U0+HD2}$u zQx0pnqw7jt2~!zA&KlTnMD!gJTSDD?FC%=&friefUR?=~c9dayyJsC3g>bz;Yr%F= zWl-Z7O^T%K>0m;5#x55Ek2@v}HozEOe-_KX%wY8+Eb+ z{4I*?u3bEmL@oRg7;)W8nusm+{?J0ZaB_P;EQdDZ7hL#RN??vs=B$X#f>oNDNK=~3 zfG1B4*rEj-6ZIUd31IV1-qp65*$Wo+{aL0k2I#X`ZPrU@>qsqXZs}31Of8Cf3z|U7km*P2|=A|*?%zS!C$UAw91IoDw8<* zlu`cuY2^be_lpRlwC*O@VbCOSY}~A%iVZ<~{;sU?Y7p3B96v`N+^!Nb92fP64eLc? z`8~x;{(M>nm2W26N%^V)9>wtIyZDfn{iuVKORLmsd|RI^R$h(Q!A*t(*T8kcG`N3~ zR)%-V-{j9toI12(0sRzp!M_Scs5fsi)?%TYQU}joO<#3DW6sQ zl$|%Ub-Z>KQ!K@0QLkA9S7GrBbZpz;_D|$t6As+XY$|KaPo2rBUM3Qp7Gr0si->?R zQZ0G;MAu&+>!UUgD~7XHn{7hhv726u^mJ;blSWczveZ#gixCU*KHcx*pM)Jh%vcvB zDDS5tbilI^0$#V_E&e{?^BUyU7^J<|FQ0PPJ5sN=XeJ(>GISH$E^9P#r~Rc^;qV=a z1~-AocTuoTa=GkxWy{@W8X4BM)+*9klC?dkg0}?{t4w%KCzdhIF zMkPIsdugf|#ZhYdfFKI75q8+2dd`OFzl&no50ng|o~2hb*ng~WOkeLq)ETe*Vs*P7 zBcp848eu`ooiKnIHD2soTTN~~BY5R2Fs1Kf7upI}55{QM?W)S!Wj7>NWqzUT?RKXP z!0df=)bW1y6+oLPM#*`BPMz}S9!+KoxM}Mn+6wBtyrPJf$)m9bqAIliM0pT3SY9KIMk}T3I7WHwHYmf z#Sfw)s|?BvpKPn_K6aig&|tS%|3z1t=?w|IlCE8v$<@FjJRD{dxG4rXK$}!iz3dVC*IA>7zJ&^A!N0mi;ShJ*HkK)5{ze$0x;&AoC|t6(zGghXjFYSg_01Cc zo*5&z#KLXEx|RY^6O5BKx8_yhniH?9Cyi7&aYpjxta;S}K{7Dwe1!}B-l6VG^6qP1 zYgPn01w^LsQ0A^eVPc5hsYFXlG4?g|3&C6$XEF{n9-jYH_tZE^aSC_~QIli}JnU4R{i8D)esEA)qO1wnh)N3_IF|YE>NlQMJ?T zN4})t+chfqtnJXnDoVCC)D!%t-X4#iovZ_Bm%X)WWwZ$BDuKZLCjqkwI3`dg1Q5>!s8$dE=XkqI%DsqkCOC z!*}Y&kvsCR3wc<;&=!Y0w+m?f_&#Tv9!deS2C4r<)=su1upB^k!xjhBb%-N5gRxgl zt&CU2q%e1zC*P;e*3S2Imz_#ws=AOGcVJG-fLnHesIIeo_T?(esPx8>r=Ymww-2>t zi^zh!z$JQVB^Zdmy7`$$M@#8|e^ldwX#OWhXF)zf$yL_@&saAG=>K{F$~}mmRKOa2 zb5s6R!S+phb@rq6CD720{GcM#bjQz7jGLNR!c@P~k*mH`wW&mg!Nv0rN#}u6CwZ-& zC~NwOJmcP=wJYMJ8HUN8d2fnO4X3qye$qeaoG2!}zD9ez9r>&B{?27!NKTZbr@bJ$ zQ(;DoEK=xHVZMig<@dW1nS=xO<~??n5A!_6_?Y%*)a^RI)6q9pKi?Exfw%v_CeU`LLXJi~o>T^U$P?6t$32D7lmVMSO=t7QjyR~z zrm)9-lA}g>_Kz8)$nS~ZFE-7edfn>kQ=eK~pl{#oepBCJzJD3b+X!89C)vuoD{)XH z%;vm&`kKA$xH6~^A7Bn_-jY(a4EiU-m{R%aWX{JG{9b(u{ z*+S3;?fJpfC0A7{7AABO+OAbd%&!$z5qjHt<+099K`;j^LufbgX2wmc`iIYYJwZuE zEtm00cSU#bwHZeSUMJJvD5??S=C8+$dm>DmXn@>{vC96-0WUcm=rY-nljW?}8(xIv zd#9Y`2+P7uh1DPG0^wW^fX8bYSxp)DO0(N#zzU9zFbo^8lD4d(_m7CY9{o-?ApO37 zQGW?MK3T8gfosNxMd=SYDN}6Bt=QJ+6h?`RHHMjxeE4m*C~`0+&L64hB1$v3h1?tBYbK2ogdV*n0eE^?AO(p*us&e$Zh>47^R~GsL@b` zk09c8^@6tQ(*?T*ceT-lJxY8&nXDv7KKv)@-sW%+9EzI`JyQ5Nl2Xs%#Z-HpmBvIK z^s)fzgsPu|JUe>Q2D2!iTkD^sY0FEC=)HJWderHhs8XWIXEhKjk<)T}Rk)JrM%6vX zA0@)aZ<_0l*k_)O3WDk88c<{dh-I-xL*;N#>YaH5<+hhj8oyxe&`Pkq)60qcr}g?` z=)}!zAX4D;hRjr2&6X}vB?p&`a zg31UD+F|^KJ$E4AN&s2gUwOB!tG;VKK$*U%EI{4{hmr$6dB57@v)gZiqrydEaY{R3 z;1C;BCEQ}om5DY0RJ3G5k0EDb%4E<}?99pNcW4Z^R<^L}h+}zu|E(!{i@R-I@OXI&S2f!JPTV9+L zsgVzjr60a1fQn7PsA;DjPGp7BFEjW^BrL*n6LrfpD*Po*Qgdx4(gk)g8IRc%AE1J; z8wFqgVmd!gmEciIJ`%+AcpanX=nNG!z)><=+A3?rzQOxNqek*i%dw*uQ_eazy^)dg z6H`xy+=cfC>6~pj?K$GkIJ|}Wz=-OxQ@)2~Y3N&an(Z@?4oOJymvXtv^p;TrvBIgO zIso(@0Oi{ou)1n)`Lhn&q7(G|dr0*dBShW@T{VWGCpftQm5Svk4j6qR+`k@kZNKQ- z50zt@Khwx!Zra%-M{!Fbj-c+kiUdeKaGN)FPX@oGqb(-|ow({-gF++XRaKd5N_2FBLo`0Da5=wi=i- zM6RchtZ=KwIODjUZFv6e^COZNtLx+=@mgxG(XG&fQ(s2bsKLr)I>F(=QdNBGe0}RM zZ<53+Wrq~DY1$(?oZ_Ic9TNymT{&9WO$&OOdZ2wEW`oT-EF-(^j6wDGKU5&5EMtPEFS zE|xT2nTHO!3ejPXj{2iagMZ50#7A~RFv*q&-^wMb1TKjH%+N2Ns?}fxu}#)&pF8&Y z_2G5IJ1yd~t&-V;SzW=ojnW#|{fx!QhVmt^U6Y^aIF@3iy7@U5kfO^UvhD5YKTp6+ z|1V`qJ*~ z!FHeYRl9NzQ(fSRzP##J;AwxQMmiIZYE&Z$G|?e_)PvMJH27L@C+a{b6tJdF93~DIn#J0!*~^R`^dl^Bc|wiyE!D zqZQ1nN6Xtv<4Na{0qc=Xxs8+eFqr~=E5dUJ||A9_(aVY{B6Auy(Z+cFo6i01kH4>zc_FYcqZ#w}Z9?oVY; z(s(b@3gMS%8J2x$!pU<}`A^@8^?V)FF+8j);d?kB;!Ph{3k{qT{!Nq(=L+6W;31!l z?vrOI=YcPp*4wKZo!;W3)7H>_((Ch?neDY=@^Dm438~$CyHb=@W-J+53$Xq((v+mY2 zN@rO8!iPYiAXN*I&w)*w<{$6*^7`aMpG0%}4i2vRZX(^Dw6F*#K)=3lOeg0Ni2RV9 zka@_MPMToH7E3fMXzdB$K0`Yx@yh^vc?`f(^m#u&^x9SfZ@}N1=hKf=&}L~Y$6VCf znp!9xxI|XC4Ue)`*_y?9*y6_F8RG(v0jDaoO8?rPBH{D*63X10OJaw077rj7IVV>$FfTVrCTo!RaAWY3va z#~HrlGgq`e$`*mbUN9h5x9AI@N9@Y2C?hX1)M?r2IJ{ zBqau>bSBnsyL{%&=nZkM_MR}Fu+34!ZRtVSs&eb7vE77HHrGGpqU#<%kZ^BYi$M-w z(?@A|5wKwWNr;TcO|S-LcA6AO7raeSeP4C-+yQ7bZal5JVz~THzCdV*I=qxuR1s!} zRry{2+yc^O-;r*AXv{p9R#|PSY{3AHhBt@R>$x@nL%l-%I;OBHmr&fquL755qM=yf zN@~R0TTM&8e(uhLhn#O{=uLwr$Si{VLp zhWV6Jl-a{w+x0&{gP5k_VWsVYM46e73`1M_lRcIFVDpM%tF-#3?QejiZQkufPOB%6 zRZNmv>o&wnK%1J$=E_;mxP)vQnbtjeVvJ|D)xX2VL)oob$do}|VIGN@dKkLD5Q0K_ zm4!Itv4mDthcO~{w;lnEIG0Awf8K&n@lP$Y6FyZ3rqGcp0~e32#H#`x zq3WigAYN|t9r=;_zLie&4g?>6Y#cjICQGgW;|*u@P>YaZQ~8ezbUR&VPv|JzDP4T6 zyy=!;OmU*UXQ!a!ZRi!v5hS0-GmgiWRriF+kVq&?tzje5M1obUYyG6(Mzd)w`)NPV=cP(j|{d8OA7@3{LghdmwA6 zuYwaCLLyWQQ9>~;!b6f+59fBiU$ekSNi1R`0YYnV%1{$9^Bm#5v9jksN4yGWMI}JE zXxq}sKFd`1{MNV%ioDFUpA+kIYy`VTY_;cM$%(0W%wsoNav;N*i8G^X-r`1Nx&CsO zeXj4z#tw<9ESVSaQNHqFTz5rhUsXXH%EyY0=XpeG(e*sssAPS=5C zh(j7n1>2S_GRo&ty8 z8JspiJNp4`N`_X}Uauw6Ti~^FuoQ&vbn!PK-qGg*FWG?T)K}iAU2hjw^uz(-Om3_O zGlJ@yxr$tmj9s%w4Ex=VlWC7xki)Ib&;v+rWoU@WEpYj`$OL^L!D((po}j#`3pswF z;4B1=1jYehlFMgYdDvjUB?#_*9uQdyo!SeU3_&~%Zo7=z&FtQ@R*k3BL3&uo&kiCJ z@4(#2nOkkwU&MaeG*DsSrzS}4&>!x?M+l3c#*%CY4-h~8=Ly;W5^6{wZ{Nh?jG{|? zoyrfWOo5?nRs}Z(-i{4be6e_8Dhm^R()Znm)u$1fj{^@?FYV|~eqAa&xvLgzEuYw% z?)*bF+$rNwE!j?G%LQaQp#rDYfATn(q=Opq&6L)q+hLM-Z(0qNIz|u?((ys!NnMqZ z-aj3Fw7sSawCCs?*~AR=W*V(scw;WjO@(z8_2Zpp$;W7+?dVop&X0Dbj>%Qa8gnvR z0_Q3jy%A$32-U-T`pZ=^AY*W0#-XXbjiyx1HNJ3PZM8@1tFHo{jH1N~(lw1{7_Fe6 zs51Z^hE@!H*O3*)!H>fHx4z|H(n|^EniUCC{!AL* z7P%3`{kydIrR`B$c#+wchao(7>l{RtU`;~XZ~OQ--Zv@YML2hUu&TIYd|5yKVJf6( z&3uf?ncglVWDYwpx4)P8HQP%fJj_@m!2Bzr2fn@IcJSBR?!l_K8&w7#cPU&zRzMYM zLc~lx>%u!n$bK+alZVtsUygZ|FNBgoKI{n!zc&r&r9cB9(o{Ppe$|Oh6Jutj>+N0X zaGHZggjwk@Ixcg>me9Z!uygf1wp|RQWQbzb(zv~MXO-5+c2y{x>*C5eDKX`c#{uBL z2L??Y{b<(gLwZ3DZ;8w2E79;7AFTk}JabYE)ot<(KQA(b2JZw3@fsHy-{tu8i0}D{ zt}|!2&-2USjol#%f$<958mTLEWE<3G4-Cv1-2}874M41l27o^CrVV%AbS#Xb+!Dds zo}YwJ^5@xd1hvEXhFsJS#l^Ia8iJkN`G8Jxu+|MB{s+D2eFm&LQPS&(#24x5z6|Km zMSppbS~d~}{hKH> zpO|@(8_e%~vn{gX19~}(o6YPBb!sy0v#FjlBX>;1;g7p7)HJ?r1h#pfT*6uB82_2_ z8-BxW5YFOVNLkg_DIp_$)lKBm>(3X?|HFvXVfYhVe2j{02U9GtBLm0V=7JaVb%&yp zK=~WNUt<`1_k+%Fl@m0J`&amEaCtq{#DPMPW=rZUy~2x*beQeWvr zU!>jc3=b)L>#h#l_+uPat08S!C(R+-VZt}NJW!+8*AZja!;|89rkj6$Jc8nRvc#3~ z3#Iw{o!mXqL2p%iPUYJEqkJYt$rL;n;yc^sFr|81fjX>>lpv9YCVM1O5Nb^O_UcAq z`tkc7A6O<8TX&RW5^RxYZi@RSo(z3a3z3SzCIvo1UCOx&4iTpenw@lq>@vfjb$ZNa zQG^$1N1_25?vTD-`0Gx>g)Mi%mv-2>NlziMDfibNHSR6j2rR^cuLN&?OuIhQ-rqjm zEKUSWcd#0+T(n9ONyey1fcF!-Qc=6cFO2UnKWP$%kJzeSXxyC*G*4(tbbm~`mGevK z5`RV3@B1CQX5Z#%BXf#Q9AqX-y`Qh2g!R92&2W##=H!K04K#H3?sL|7#h$-gq|CHS zIcQlBpS6CLeT_{mdcURAxaE>^!9d{`_C3nqfIZSGCQ{&_4xx#o)G^vdI>iX9NZIjc zbR}YEg0|`<^Br-)CX?WM&ps5D7+DX{b=`QA?H~hwJSXle=FB&@R9E8{+_90|S4!ZM zlCQ+AN)mtBUPe~lwxWn6Tlbho0!TWvB56si? zc!J#0`~M(!lIuD6(){%2HUekLp6^m6ExD33<--z{o`IANZ9fbstlga6VfT^fL)*9v zmIaljowzWeCR8qjOPSQDo3<*Ll?ZC2l#?)b_2568go?zxC$@J((kU>udryR>}hW7^zGnQV27Jg3q9ecmuIJ1YRjE)0G=U?a!2Aqal;wZXVk*Y z&v+*8P`ItX$FhFiC+L1J(c`uY@TcoZf&y%_PNhjv08=fU9twAGz$Q7=nyT@q! ztbbM-xmB+)=4>^$6iT+H*tDS?OI21J#pQb!WPCrae@~lcNVt|WeF1rU8VUaqs4G$_ z>b&ggw5Q_KA20aaD=f5JgF|IEZbQyFU?zd=eKLSgAzSi+(_XpkOsXm9L zl_}?794^wg01-ugOMxo3!`NNRiKwl^#LGCtJN zSszFT-Tb~L9xm$-XsgI5T3RT_7|+=fP1mZ9xt@XCpf-kQ%ktMU$c__+1w`ex3_{Az z$vYXn8SH#0vrHT~+MB*|Z+TB+s7P!?_0nsMKSZ@sG1?dxbWCqP^Jj!y;PWb6_?#DH zSAqxbP z6{wrU3z#{k41ka2Iv$xZ?x!*XAJPM~+eY-O`%lAu} zhoAZm#$r>ru()0K^nC%ll~(&lO?l7D19=;>K6Cj!xxvKSM77CZ?iyy?uAm7(cEoEa z*f)q<$9Kw8=J<2v+%+o?Dz%rOcHWvsCqWh-bsq1gFmqE|wcUDxM>z}bxMp@etq+t9 z=uE`N)UHuRgbAW+($<~loEIlZ#~P4VvOeagt?k+Qc1s+KWNrj581afr7W;umesLQo zNoc(&DoBgkkI-b-a0UkxUj!s8UMdcT)DDP%r{5datSQIX0qKJ=1tLGM@oJ;|;G6Bn zd)oU9(aXrKNitufy;AE(iXZXe9|eb~e1Kj>FoPyDW3aKGxBr6jvjWc&)i{V(5z2dAT^ATHG5r9uDiYadFG2pXEVKWCE1s}u7RyNy zKRx_A6gie&+UU34LZ09ME=@R7D@{N^~hjUUx$K$@N?9^Q=KtDU{+lx~rOKW?s z7zO*QQN|^png(*n6)_UCy9`UN`Wfq!8Nf+IhKen^yzXvN#J(B4cr@V5#24EKPAm>O+LTS0?U{7zBE#?8Rlws&yU(? zXV8geX5S%KwwNs~#CTQh^ri1j1)A58J=Pim{}C8ZZbNqZBGhEGr=km^?!a6}C^Y$pfL>!E%UvGC8lXb# zTg*CAH7ddIDgxvlN?2+9if*kU?*t?uYk^gRja&~mg(Gz_`5VA4PNM2P8UESz*D zSeaPxdrV-C+$yQu|HMv#EWhR}9MNnxq7dhPE{vOf?|+rLYy7{k$p3;vWUlBEked?y6VNzJ5l&^F zD6u4y4FS0Wa{vV88XBBrO?>wJgw4OZR{8&%Jb%Oa4I*;Y2C9CBl>U?MS_Af?9t zfR;nm|C`$Rts`X2;K6dvUnA~}m_Rs1OAH}ZZaWqVU^$$lFwD+RNo#yq)18-EIcP3sqZW+ zOHa6is}{TC;@}s6iH^E}#2HU(om%nzTq0^L9+`I*uMEF3TJ|j?~!9 zitaK`fZmIqh`twd54F~WYYFMhZXXw$CU@P;uXDr!IO0alqxA=12~EmKGO~h*)wDd2 zAeXZ%fn+GbO3n=7WP0)zIP!dYj+Nt*Ju}Zs5X&p`8s?M^?Gc(rYI5;gC77wIgaw(n zTlp8iaUNLgL!^+67~)__SuU2g11tHkqAB5AWU>N)oJn6+wq6^B7n-NCr^^F@ybs@o zca6tGZz5Qt^J82o6b)3lE(}!Wk$hP0%dtBGU=8P=he4mnZx)%C+BdM}$WkIkDBZZ4 z0F0eyxcS2W)&F_{N;;Q^wodf00Mezc_>mg~04`zpBN-Z&fxM%P!;GvrlbwWapg?zh znoTv)W%?8O81>>t8>)Z(`&6rhhCDHta=wXT^o|Y^*9WSI(5zmj0J>9*P?2G@`+ReL zk@Dm!?H}7EZDrHRNY|X&jKvu9ZM zA;;8#lq9+>KKg&a-{d7D@{}kSavfg$GS`Ql{eUta>N!Sv2H2&D!>9WYS%KYq;7tD_ z<9Br8r~Ei7oQf=qMosN)FV_9H9hnMQGs%Zxa}(ObI>E$nieLaCYe2r^ss_Q*+Q~ci zOoeFY^oyH}Pt_;5;5ud`;a3sj`K+RsikVT!f{17xU#plA3N(#gR(60{BPkjxjEh`- z;au&LLS9XNtNa_>VyWv$kG@b<;Ywy6mWpI0q8X|P6zE-OFco!=DND7olg{Hg2tRHl zNls>Y-C0I}s)nZhH57m?OOE0pd?9mOm>QSV^4wiYO{#bJukXp7p)KTk{fFDy z26YMwbcySwe=U}A!#>naZL<4*a7Do`m8ia?m_F(iVj9j}m_M|&%^Xh__GN9Z{X@mX zdyqTSjZ_Q9xzrV7_dckY(wo&kZ3LtB=tC&vbDcq%+0*0+)_>QK<6(lq=`|noMr^2a zf(ZG)$gK$Zvs*PBK9({cILM81sNwc}^X%2bj{;dgQtD}N0wmBaR(-zS2?HHlU`s=)f)iMy0!8U3vYU5+zivevUX!vl{Q*+g8xg3ybQ8x!1pox624E0Xsr$UXQ#=r-hr z?rX}cJ<+c(%U-#0@`36ajr{xDpQ!qV3}t5*ylOceS8OJQn6Ba*X2P_#4|YkE$BHu8fX*A(gVN)3mcIuI zea9jw|3d{I(+6`3$sK}A;=qfW?Ll5LSc|KBf3;5KVAHE+lA;v3DIEvlyoA69Y8GJU zTglLEVCuZ1UQX;F5=kpA*cQAeN6Ti`-u-J3-7>f4)~nR%HRk0?Ud9YDtIu-%vM=Yc zRE({9R#W8}l*P_hbP5m!NUSwxaUE;7jP1|RY{Z9v4jM^RaS{vLb_u|rvD?3%-iHh4 z5r21=T7&-kAZe0@Gy^TPK@`R)`nL`qET0S3XvcT#h|NgOt#&+dzlf2Z@itKTy=NAG z7O7a{8mF-)<#n*v=Ea8zgTB#sDZBtQV*3u{>1rgzzMx+gp39VW?C$fPhPp(mKlC0Q zIf4Rz%pBD^b}JQfZA8@ddrIHu%D(W4hx5}iQ><;0+pR4#?Tz>Gg0G}(DZg(OAkSzM zpTr%54;&ql*Uh_rpmD5jcE53JH}Bo{f_B-r(?X@QfmA3kgx$mc48J~GVB>)|yZWSg zYwT+h4X{79&$egp3YO@*z?{^3-0Mk{tF{Bcp*K4OczHHi9} zc7+fV5XA7Zcs{V{^%$-Kd8u(I}2VbLZvAx$1PF+x7O}&-mdqe@bWjKEA5KmMBDBbTa%AYdW*7 zCH<%uez>Ddn7_l1Q?qbfJ&;pf+~U^-E|0MM(y>-SL43#V>uE{uQe zq>ERQVsX5&Z7MSp^<8JS`)tpiA5~l!!o4&5720nyd!)>8_jCLiOlau3Rb@s7ouEN= zF9=u;8hq?|dav#UUco_#ldd_*OKbCa__E)vng>m1bYMZONyNf~+~*#n_=}_EJtCjy zHSl2slawx(_FP3FTG0dlK=U|VHKt$6tJ6ZTeY(y&b=&Ie8NSmFd;rKvQ>biEXZVw` zc6mfVl=ZCEyHeXwFEGq$>gDLjM?{+R89~&OxnOnutShqTu$gUFcV3dH@&0j}h0jHijAI_JX;#Y-p!bK?f|E{|znbvNvJR_TvO@q${-e z(3si8Mi`V3M`-c{vBNLSc5Y@~z8jY|{{86W+d2LY>h`Zy15FP!i^u4ihNP(>bkgvX znvO~|PTB11OKdnl{#JfnryMQ}=>6%v8+VJlB(MK#Xpnx-g{=mc1LW{A>eph9ssaAQ z1odKPipnlk1II35lEvXm=FFP?DS7c|Emhb zu0mDvpBU6u>7KrB_Us@z16lNXl2l)*$E4l0&#jjsy;1l<6vG5SiN36;@XK^Yr>^z4 z6H<)i94=SbR&?BzQ3fPIj{DMq9|kiHWDHcY(mYB}B)~l@X*{#Gh(ze)Wr{PS(A$EE zo~Ze?-qmu!rDn?}RcpwkNWR14Fb54im0K8)*)>nPGLb$0W~@qN^N=sj9XWH~5hSmTrdyJs!mSL@zE3PA7+RkG&~(o`CRGOpbe z79SQ>=Ytu1SnN~raQfMN4I5D7V6o;@l=@`;I<*|)9TsYi$=UI}9 zFPSbA6?0gy@OK7;FD+yfi3pT7Y#Hgixh)zGDOgwcYgLTa5zaRZ^?WF#z7QqY&Qh7| z5@qGp`3+hrxU>XP&M~sdcc_n35WILj#}A#_@q)s_)~F+IVoC4eb$`}!!ds0}nKQIQ zJtJ#-iJlg=ZsbR4lEa2v*hKO;3Ptd3>7Po=(cwISZo2VxWb`A^zceaCLz_!DObUGC zFD(>bGPHlhFS1=-=rxL-gUTCajFf|tHF9M{dDBAGvF$!qX7@Wf&w2xTR}+Mdx0c9Z zX|5GB3w?^P6vq;}WLnXaqw$5z7-axD;r&yI129Ob$~?jx5zj881N%)*SIqo%qZ_dQfcJ&GI9%skVywx2=u15ZSl^J8R?^zUH4zyxx+da0E#kQ* zDBQ`dzkcKaRTI;;i|Q7|ZgTd&~ARSAHeUajGI1vDDd ziyhTW6_d}2BI8DeNGc88_{THQ52r7iPM$6M8yJdb+_Gok`$d{s)lm76)>An@d9U)A z((FgIq$a8iYS1F7_H(FyBG))=GCJO zdjI$^qBHcplAFe=r_#5R%?tR~!u9BFJCBQ-r{rTzF)&v+eslL$lBD)(EV;t<@q>Z;qGdf z&DfNjSSgyYFy;#lUucvZn>sw0BlmkHyV*&zEw))Addi%4?1i;~|9ds#(~i5CT^dJP zqFOLCoLGx92$6AlR;orJ@0dEmrULGrXVMhN(!LZW-{3dLlJvxapK7i9L`>twr{IP34L_Wv96YNW@ z00G~8-R8Nswy$w0C+3tf1hy$Idf~)3e(!t#Q3CL!^oB5VPCdHu#hF&TlKbzb8v`YD zwWg%fzw3XcX9{iVFG9Nm7?kFw8tLe1Vaa-IQ(o(uh;!bV&XPsNQAzDTS!v!mvcsP1 zQ19lr;*tlcYeK=oH>Y}ury-*xRjHY@54G$ZOQ+ut^UIg!l(tXP(?pGV?D-I9;c>_M zH#|#5&xzG{#4gTm!Y_8+|N5s=9>Xq0un0w!>YVK#;B2@w;<*;MO?Xx!wp`6RR{igX zc6wJ#MLozp9#q`AfVJMtFEM380)Kw3s?q2#l3k^SU+{^wlhi(hz9Av;&d@VG);H{z4IXrVylZ3+F zzhF}gb$uv#T^6>taSs(Yy(=jA?rZn^V8~%Ns~I_)tjN#+K0m`% ztEDE)_ayh~-lMobUKG*;7t)tJ=Ac6`=w+28VWNSzLbk&6>_~K+Fwq9pQt2gM$k*y$ z`?4_b4#-KA_cz5KL$l?xL;a6~><@YzDpfwdpP|lC7X?dUj8D)d!0R%Beg?iFvz7@1 z$5;36mrLAQx^MQC)maQUWY{=i=%A${;BUy@q{rLZahedLCEbTRJgJibH^&jNvx2Fv}H_J{7Byn9`Z^C-hmh$Kh?I(B&RbKK) zzsT1Xe>~cMvv<|&xP(6_l%F%20jOCZkbc1_zAGxMb#n;d;}>__mkgOn9u}M~j-S2z zTr1_sBI5)uaGD{HP1-ha3)5CP!@ObMPWnd5$xaGw{+_cRaU|9JVDN>HbGgL+8Bw^m zY#n$#ujyr!rdYFsd@~S+Ptnt-n!9qf(}UgqLE8hB8vC)KO)r6toLz4T*Lxk)3#N4} z?3p9+??J-f3|EPvtxzjP`wJ5@6bmY*`ibgc5aSX49VxgC-nK%~sLUNCwEaN*NizeO z;uqId-ye^NB+gBt%7>@(0mcvVo&>0YKrSCr_dzaW*P)N$34=7yQ^ZK}HCCtp!_;+$ zHMKN-AQTY+qgN0@4GBfMRH-VV1OybNNEa21^xjFhs08T&qzPDpNC)ZCaur3oM5&=f zs-gE5%6Gu~zVEmH@H}uhXLokyH)UsM7?zSZb`Qre_@}U9LDY|zXGW}vGe47FB|H{a zx`f_oG9cRGINXUPNta)v15-)+jkO~S7+UbE3u3`gUp_2l?}<+Aj6mOhlM(TkA#S#c zl$I<#&JRAK{AG_HZmmL4uj9{Mj1BGIFSw1ygQQIdi)up*jrx7OAe*3b^VNE9QcITK z^ibEwnSonoCDQEOFGmD>e;5U#OWpm;UU`UY4s=-JX2eRI8DliYgv7u&T%rpjWxYO&8r^Xl`sT+!4Qm2Fr-TPmmz~j+@8*WP zW8XKt{Z3VmDhW++&6OT}S)*OknbufcH&RMtU(>)HUC95-F2A9a)2BTCFsX@2`=e?1 zY+1|kHY&j+MJQ@><4^scW4Co$K&D?6PV-(gim>D6Un7(YdQf1DqrYLkQSY1a-abElg5BW6;Zn_#`OvCV#Fu_9 z;_#R0*)>>7v4i-L^mt~fu%V;*Z6h6(s?pGIhq{-%W%F-;7Bm~%4&+`6uBRUHQ0!Y? z;%9675cL&$)2S+fPxkI_T`~!bBsxcTNcO1wz8;94oon?zP(#tL&=cRc=I`#ISP!I? zv4g{RBYZH-MB2ZzqHld(%r0HSkS_DOz0GXhOq}qVJay+cb;sy;>m(J5LjNt#HG8{K zu_{{GP7nn)v7s8{*kC^ES#H8d;=FQn%A)pe;$R=d9=X^`$_?A>RN2o7z0SF2Xl z;o2VYDs;&mF(O1cGnaH`nLXq#(G<^&2ihEj!)`?WP`BZcm$1_vRU6CFu}Lkhzfd2- zFRkgU(x`N%r7|QTKS}rfGCDd*{{e03jitsry?&2VYt&PMpbe`E@(H0nmr%HoLs5}p z*DYI=;?nf8Y%tBZKqz{TYvs!$SxQBfFr|;cq{jp)El}Z;t0@1946N`JjVG(zFrkT@ z?u$gKs6+WsF48D2GCQ8$7Twub3xzrY_jXXp{;m&(5ccy80;tpZFTWT=CzgZ{r21Em z?imjI5H0xdx%=?L_`qE=KF?r!F+p>PAR3P!SBz;Ao3xHip5pg-S+}8gWn#H$D6@wn zSZ`0dtewU!Sf)KfICCbqnd7yu$>A4l+L$)~^j)@4{X0{w-r)|WK&3>p_SwCzKuW3h z@62TOIaz;i#kO)h($b)iPSdTzaA;ZWj2FM_>s1;pImw*7q8M+GN_@BbyW1~$?Ti(0 z8mIQ3$g^vsJGZixuRi=xPpa(znPhcy|K2Nqbia3EO@cA?H~+T-Ns>Z+bB>TYdb#~5 z+K1qKo(8#{q!DQpg>6U!fw?U0-Y7 z>b-54g~CNN8AI}11W@P1dd&^KY2GLp2x3OThUHDJyc}jHOaFN77sQua3tqWJ{2eX% zo2uolKor9T8>pO9Zg{(Pta6GoCtbC-+SBg&FsJq2_p{sXsts@LrtbLccf@7u4Y$ zUNt{{%C7Xs*IgR3oPodbM$_W$vlMN{7s{bNG^7pl-5m}6ad6Yg)wV9@Av0PV`;6;{Vc7>q8 z@yx};nTX=$7aO)jYhJ4#+X5Y4_?81FSQgC!1UxCpY}uqaqI)zhr2DvW=Ig<0QqMO( z>dzLA#bK^*hj;iy(_PO#9SRVp7~(6kUVy^r7dXKYyKYJ))8m*N`lT4GrYSFQz29OA z-!P=i0hTuS7`=yxEmTBp-JKH}&ZEgxgc#Z-8M7?UR68Xai5%RO%B#>oz3G%(pJv7* z4qoHwN7$pgAm_8^{qBAaejgew|LcJ(;?d-j)Q8Z$=h#6v871JYdKuT$uT`my!bKwA znyroSmPjvC+rXX#nHCvQ@M;5|Gk-ia<>Jnx-L=DP4ltGNQtedF&!n|Xy^I7qC9V7z zDg_(h+VP_AlHIzKcFXLgXc%um;i8--7Taj4(3$t0T{kM~!x`h6(&Y~}^_MlYazorR z5E(yy9dfv;a(z3ndHrQ86w$Jb8K0i|{1LA*XN7wl*Mr=X*pr~V`oy^hUbk3*iPbTb zp%FfE@okU32b6g+5Mc>f$<#ad`6EIN{R-8@I{*}r=!xG{CkAioLMJw!YjLyqK^tdz zEPVw4^_?OTq)_37cu`c8A8cOB*X3Ji}jke#HMq z<1!k0P}-&f^ZI*Z%b~BG)v&!ye1QK=reu<(c%@4U(h@UMbpT0Wex_|zU0{{}dGoX9 zc%;@{jaRF?^YOoGn>jC}rqWh(y$LgTIAWkTS8HsFA6XVB<-ocaic*e3!@H5g)4xM# zoCWwKq)G>;6{o$a_8n$gvx0kZar~Y0g%T`^65C49ce*VK;MG`c00cGmX^b!`m71;^)VXet#ctAj~sD%n>&dH^PXbWpzk6 zgIWF;PH>Ojp6VuuF%vX!X3LN1{eJj}GWYu0#M)(?SuFOS8-Axegf@|iN=)7J-w%sz zwt}TML+@!1$6QR6PwZy0lM+c0ptGYYCdUi^>;cS%SBWJA9ehMWRof?sE_Hjm4q_;k7bfFTAvjkdF=Wy`Czi!9gwl{>;NFYwi5q9~s`Z zyC$)h{Z#g4H~#P~kiy@pc;ne<@j7z)lK}6UCO-nTBQ~2%RId9?5=l{ks6@%OMXBc;iPJ}_^Y@$ z9ITJ+Z`Y*g+$(P263OlQN}pOP3(14IvhtW0W$5VR6+af&?*CFeXbhKcbIv1;-XS{J zR9XRcFG{6?Uq(4QNWG6C{5DMTr*^Zqevo-m;n?XB808@F4k|BfhAB*!Tm7!LThcow z&eR%QrMrgK>)S^Ldc(DCrp=6e9jTo3P3cMKuDu-rlzgbtp{?~{h=yKoQIEoJXm6VC z7j%V1m2q@y)U_JubJIY-omnsno2u7Vn9(y+p{|0HztS9* z@x@;y)Zo#AIE54UQGKV+kn+aegnzMKjUxNo!b_XjfUBPS=_Wc=0g4kf3pF7|ejG9* zp2n#dC6jW+ex6?!M-G=6l0cNh&ey@w9lW|Q-4@N?s`^{1xC~)scrhK1ZPA_$VuV!W zS_6|5M?Efg8G1u8esAod&Q1ya_~W0LI_~XeY;95#ysJqJmCr#kez)wriu)>;3@c7$ zFQ`uGKo?sTeQZKje4y{Y87s^WUYqKjruO*Phq}M0bUWm6Us!)QH~nM=@@c>kouwZN z-DC)V3u&KfyiTkpbbl$Bq`t$hjY?VHUe|)RE`myoP%k z`#fb&&#!%UP$f=MTMIztAF;|p(5c*}I|nb*SYMp@ZaCZ)>H`mqg10syL+uks!Z=VS zct@eGj$UlAzKWX2C7OiFG`u=;nt=nqjtI+P;7jm%hA##xE82>ot{ZLG=&SzL@OF0#1L(ktT=Ftjm zIp87eo|O7c_eqjR5+CFIUTlbvrS@J7Uv#TCDV1*ESYb!jr!wa@*p&!SqOUYLZjQ$1 zXE~gRDemr0 z$kgvji9>e~YV->LpPcfjC(;&}pKA=%1S+=9;NnE!{Y?Y;M}j_=DOWAJD7fw(=6-WF z=ya=tDN+^rG40O%Ep;vM)iC~ogR5CrgW{auwmpvTEx>gP8pdp$88s}}VZ&U7!1lQmrD5dD>FmXe`RztbQ z*>k*_-Yu~*0&lL5p5AWmOYS~X7eA8}x2%0Y?w!}$_BTMTPixF{wEb|-A1Fm@xDPy1 zB|86p!_#s4v2v{#N{H+*ciwpn4DMFS%nw27`V%uRQ4Ft{ae zH16|lwbL#%G#A4u>o_-Ps98}zUh_9KEej3+AW2cp@$()8p4vQIYO(1_zK(Pj7nxnB zQd0GnRja5$LZO;J45+t`B}r8lL?Ij(k0LTQe07p8W(&oB%el^7XJ+fqRHm0X==b=8VS=!fYrh?hu@c3J zq!`~TL1bSv8?Zaw`9t{Y6{L_(rYn_347KBxG;iegV>ZfgSo6C6%8Pk67<~HiQFFdw zPL3OK*2l!8+}i)5*e^Tkk(TS8HB3_@_Mp3Sn|ipvqiB2dML4v}YDvzfNvcG&`fjsf zz5h(;JJ~oCJ~TAw^B#NUZzn;M{1`{-_d6!(xOBskqsNg{S&@~uid6f`-!;`EEDg<{ zT^Er0Yl?1E`W0!D>y@h?RV_FA`VMbZ9$EArwkR&nh-B%HF03}DCVzL`Qs(J@)6Auv z8D+C{TU>_fJi$fof3{hHS)@=iLVPpBdgfO4mq-sX*%br39TRZxW0%ExXsv4M4tSqe zJNX8jF?0DHT+g=X?;KF%-0>MW@U$w_)+8l8#-+O2xp|`PXvRoya)dHk)}SlKM5pdb zVbAK|rIN*!k;TETrat^Q>vN5g`8Nk{+SC`NZ{Hke zu@Bnl4y8aoNNV8ot)%G9ZJ*u2(Yr1c4w-(MkGx1dxG@9nf$>o{O;KCjSn9-jVDlwA zka>cJf%6gn@ayqiWa%$~#sR~N-!!JbbUd=rW6C{DwF8a6?dWll1_c%Qx5ckZnYK=R z0fNouDX<&bb0jXRa7X_dWx<7de( zHc59twPyD>wM`~=7s0C!3cI0i%&ZRmSLR_at`qE|m6Rp7EeQ!L7XHj@$B*I6tUG9{vb|d4F0f7@b zf&I!#YS}$cycXw0*H!m^;8r%_U$a@L2C|^IUWw9rr;DC=VEdv8j^Pu5KbKnE zQhatDe_0WNW4oHd0bQJ*e)8nDUQ~!crK5s%sw` z5vlhl(`mL7yOT2(7s^M*(MX{-w4weTb7ANftjl;+uRKVD7~Ce_rME2PzEsA47VMPN z-6=MHG%L7hUe&whl+ay0*MlEj&I{9NM}lPw`AHeEmb+&vrIWfvGvnn&C!%GaB#n_= zss&gj9_<^sI67+G0B5Z^IVu82TM$?0dr7#iZCdtL8ryxGq5vFYtECcq04C!7oV0

?n58*MBF0)bGC0v1-U5g~jS-xRQjMQjm7A0a^|b_!++Tj!**s zo9H%sxFMaQU{+A`4O`&%9nNo`xzijDkGIO^a2yGn6mO^K<$`U$$!h57?;Muf;F@1I zPh;2<^p_=W1R1$8gk1o~&nON|k)9;qd2}O2VXID_;%S|k922Ux9T?O*>x}Gy;CqR@ zIfd3A9Dg)O=nh9_w{KGgO&nIAW7CElsLX*@m~^n`!wNrEQju0;$zE*l7y5Vl3bi$G z_+3sB-k1QakJ;y3u%|(uhL>j5!K2$Ip8~){?A-7H&?72DKvN=R&ddF}ia-^;n3yo2 zP;L6L zk&CiwlbkFQA|qV`LdRiWAT^PhCdLzXV>tufQlsUd{HfjoJb&4dP?jb7))dZ4-*?uT zX|p6&%80={qr(0Q(c3C|dC9EDDa_U7#wGR&s963!j6&}Hl4ZMI7jK@(7DuOc4(wlv zQjKalA2Z4Uj<0$=UbYC)o6ay3T(s&**eVPTXHkW#d-FqiuMXoj0xM)t^Ts1IS1@^o@&*wPrPKVO8d*LI~IP=_c z;tJaDr^aVnEO!3mZ-3Ana={tu5EQw!p176QrAPfVg5R}rgDPdKOD=XTH$_IPb_;;7_Z=1c>q27FkH^qApNnFGNAezeRj<=nn?n@I{7B~A92!++!Erfv*fjRg z>^LSd84j4GCqpO(zlmH=rs27ga9PjsEmBI{j{(IO?T%=1%hr0G*WZD5e=mPpuENv7 zVOIFhzx3aqPZEZNfp@~bl&7&4s^#_Y>v=x~qDSNTif=qop+wm1(R-D%auurtWT4#f zr~nH?!|3AK?PvY>J2k0Ljt%4RiKB~z|$}A zQ3M>pt}yOPr%Qu}$rw;eAR1d=5cf|fFp6}Dk>NRXKlGS)A%(GzMy$BgXh!T#i1Ou0 z0Z8U#!ob|G5oa+!Fp(I;mkIpf7hUMAWF@(IFc5q^eo1Gi%OFzalrmcyT>~8Y?hX$Q z-Z9wAwtc}^^RGZ$WiEPq9_o@{C}@f=4D@C zvu1PwVjgBZ@tX=xhpLT#o&o&Bf9G>gkRoGp{cxL5ZS*Z(uL{3!0JxEkigCyE_%pPm zjOT*RdPtUOAp&4q-{j2?=Vx0xi*#QC6F(Uhg2(Qt1vv)~Uh6UE!Bx#90!*MjgKsz{ zA~0CFknSKO5Fh;*7uXnBQhBN zH?NzYto(Ah_xV5HlB?JP4zV)6`$EM8(ZRq|{_m!nS^hjV@xKo~$HT)7!oOg)wOjfw zL_Qex1~#jx^?x&_O{x^|kS#m65{0dOHIYz+KK|3Z?7)AQM4Kodbw?|Vmn;tUd<=Z% z=n6oO{`>!(?cHW%2F**xh6_7kh>*7v2`=`3-tfPD6o>=)(S$LCyq>UdA@ecOS$sGN zGXn`n|L$~=9W0b}=M2hgzy=Dv#MZ_r3bm!@qcZVYkB%A50;9{|QylwV@xNUVHx5*=gu->h|U9H21PPMYd? ztgbj)+q3TGb-UCuS-E-I|4mC0c^+d&*8$3j!jgb#J?kIcEj1WSOW(x&N46dN+rkN| z;Xr4-SyQI_S|u-%xAg+$D)^2?;?JAUG|8A3*wcV(AV>=}>- zro31nhCKV0vXtsowgRVdS7{kgt zg{HfL^oZ7k%e&)T;MJ?PnqUj5(i|@EQP(^}kp)Qu`i>*C_>|~TupOeaeLj_G=G**o zJT`TG?;)mcZ7&kg8Me)T$@tqIc_11R2Bc{_GY2%e!9CNP(X=d6o5qNiAAtu@ytF&b z52%BsZS&bOJ=-H6gj(W&G>rr|c-wFF`yaWJN!suvpC|B#Yl*Y97I?~*@t0ljxD7yX zdhFd2G53Bg92>0$iyHgBDzy6Bd@87wEkltC`JUotE9egMsk)sm)037O}vC z)bO6E%~nK@d*d^{`UsvE1IuS#{spcA(VdWc@^5?}M#-F4H)1**glslt6Yk^S zXI_fK7OE&!yiQ=ksk7~?Llp~84$s3mh-s!ZHiLAF1Agg2rE_0+j0i4_$ps`~2HEfPI55Y+*PELq8U2dc7H&Cn zf~kLz7T6jTkAedc`--J@bUTlG5AJ;#>Qkk2Z<}|I#U`!q1!CSlca1B_3YSEQ6GhRO z{HlK(c0az=qbd`6o`*k%(C~N9=fq)4FOU|PBr=cGHK9@+^X9Y~b}cKp6B3)lp^X|) zBLG~P0f3%=ja7a>dzntAR{ zbC41S2J{Kt68$|A)#+npT^kc04@U-kF;9=hrbsOQKX^F*S`Fw)mWWGcN~pY!7%}(d z$+a{Y6PgCv0X!h{k%4~nZ$q7(h53J5szJMt0SuC^W-?Y332ThKbKVmXI;3zc4i&3i z&9{n#q3>p{bXLy|4rZ*WodU4rSUW@xS;AxRYN=N)9tfwDzDd(zMRw>})&cf_%aqqHcg5JpbG6OK zSa~umqp-nN)(T8A=F<1May4`^@BstQCuJ(YCmiz}yKKh$`PAj}JKBBMPW1mV$v1HT z>X}7h(`Z9J0Nr#JxvMk73xLmp%bbABoh)AQv7V(N zQPH#&P{+dn|Mpwe(8inoVFbV+qiNt8ECgPsf+QKNO+Ijxta}GcMY|>3v{mNsPWtZu z5~)IPi`#y)AVQ`h5jaqiD@2r(Zig34{sG~N5_J|eYu~fLjj$|Wq3SS-0^u#-6dzlT zCu0-HmSKHqAjWsv*^yRG1yv`ohxPOc*BCY)=nM1<1f#H$-4m2|8T^-G_pfK=zgDP z%sE|Jx$ubN+>Jkvi9-FNu?B^4_n)LO+{phAW6uw(VoJ?8BJl3=CeTXy14{g2q^_ zPYYq}Pw8|R3|kU=BNkgb3jm235(R^M=<=q~3=91z2$BWFFKU*heC9RlPnh-XKPH4u z=@*R6vkzLxqlAr_*9#Q}ETBvdPaaW9{e>1;VMI%*&_w<2S}|c6vyHT@XbzpGbzM&N z5%K_+RpO(xAm!)PN1vEAJ_o^ns@XN z*2>sLcZL!m-;E9Ev6hr7*~?8@gAQE zTeNnOYsUY8jS5kik>&=&A777~!Vi$d&p0Vz_;-kVurabmKL|nmf-@5@A!!k7AjA9u zsH2cwbHd*QcDRi=B~5XAmG{cmR@kTjiaPO;6>cMnGC-n}RGHY)Y%yfRW1k%gc-*N_6`>SgY4XOzh9`yR7z`^b-Mu&n z-L8=a43$!RH0EJAZ}@z81zgO%LZIwgQwX1jpoezcWCS5;_hT-mD)Y-jU))ye#*b%x zkx6SFc8eb}Ly>JeLeL4ya62}DZZIWzN~z-3u?py&buq#5+OK;}X-8bXhn~|*C-?mU ze5UMJ>?m|%8NA9*7AJfGdpY0_Hd_bSTqiAeCc-15N9TN?ZV&D&*=;rBo zx^cj&%)Ij$VGRa5(VElE)8#~Ct@M~Dc9FR^xhDg-15O7>waO|$fg5xDMOE0^XFm47 zg>bf`+SJUo5wFs3aMv*%mD&$GD+u6%KlwyEshAV}A}B&41IA)zU5dX7@lW3yuW%FM znY=SU!&^~*l+8~m)DGI$ei1k)sKVb`6$j~M+$KihvW5DV4q3!j?~325xa{GLxFNpR zP~>-w$b$zjqu&=tV`nji;cgu%KF+@OZ=X@u-VKMgWq*U;etgKV4=A?j!FQnTnWnu- zGjeBmq{b32?G5^^<>hB})?FZcg}M==TjIvk*Q`CAL0>8qGGmQIa7Nc&(kwtJg}Vl( zUEPF+-L;2-m8~wYP;QGe${NsY?ru!x$kqtq^BtL}#1jP-8~B6!5S@4@F4yz#&S9=E zIZV|cvuG@p7B+hQlJjlgHqFgj#S*Mw+1o?|JhO>GG>!CBha9GkyTtBH0RBf7Y6ZGt zW#Ul1aosae=d1 zyhF?kXMx+C2M@44Tya#~2MivUzn)`*^>kYWL!*L$cDr61`^>H%_n`Sk_a-@8t6`E7 z6j$6<5^w_Nyml&9X(NySL_0v#kcE0dsd!_(VI;93tA^XZL^$P5I?kZ!=ZmAM`BcV| zOXt?aZ|A&aAq(5*TE^}!WUkC;LT6}k((d_RNcshvhV15#mRo3`Yw?b7sV6TTTWq&d)V z-q7{;i)LxuuPeOh^pP$Yua!i!h*tA=Pzm({upnWv-gLh1dIqa|0^@xFc1BM;A zdYpx>1JSvhngan3HV=U^g$i`yg6J_)e#)}SIA&Kav2;~2>GSYK?E<^8w1mi@wv^Sm z8u_2efJ2UC5;tNn16nVR7)sHe2OrUl>2N=)6hOt5fWkF7MjKM^96GX+d+@NMdtY4l z)026c&j;|XNZMBn!}9BA(WfHvfq zB35M87&<+3gf%4Zmuy|ykjOjrxa8l@HZqs66N+x#p+}APGPh|o9mrC2d_s$@^S~j0 z$D)SerBD^-S`WO)6uejj)uCt@Coq~L?K=b{beXPAdxt-S@gh}Ly!S95g^G63H{)<1 zG4)Bp#s%`X{pDVQAVCWsv{r#hVM_4e*W>ZWH4VD)fm7MH7yrnwBW{bP`Z;!Sue|FY z{4zBGSDA^!Eu*2akDGu5MbfFAdx#N*WLfiT$8HX|+_|sZ0*W#xM}W)w1on2gJsury zbAngP*%oK%m-1|loGP%j4zFs)SwG48poC_j&h7FOx&;grM(`djk1BUBK}S zUXW#^GwACdFI*b#s`|tx`$p)8Y#WU6tsL?u&WJe>$%*`UoA^QNV$#V>Sxakh?G8&^ zU@JsRBG}Uwv9AK%;$mSAg#0j~v+Yjx?}U2}55)ytKLm0X1;^QSY1R{Gf}F*nhjcGl zttC)=*|@7ZQ{8qPasqyH?qnGiW6z@*CG(X7O~p=!9Kk_ zIBKbYt2|exeYnj)p4IXoeFm(+b6`8lcVRuyJO>Ouau)eU|3A3^s+(M3&w4xq#yMP! zaDY?nSm)vag?O*@X5N)Pwp^|1>6-c5+1B%eYm|yK@)gq){xHfFCGD2afFp3<0HMb2 z!Z@O*(h+Q6vbOJsJbJNVgM=WtHxQq|o?K%2XI3ncnU#XXr&6{2ZWI?;bv(oYMy(ash8FByfIY7Ack3&0(*@%|PdvkjMul(lbZkWV2fhD1~ z$(0ZOHFjgK-!5c(H2~vfk^ns5$rd5}Es8ho`qV>Dlf`xQaAsTyqY-VGCKiMcq0yb~ zs0W$9FrQ(z)g1dCb|VU#j*Fu=g2M;n=Nu|#F`Bw9=x{q^5QI`!mwYExScq#fkt9=9Bu;OdXsC zodo;71XQK3hL194l)>InV44~45=wlu7=<&6#)fxtZpo4LOo(VEWUy|_5R#Wkf5*cf$!>9*B?_DQj^1eoHX{ z$S3*vdTHR;*3*%solj(pa#1Ix5UthYzqz~w`uCF066aSvO_1r0;Yx^>=Y-dUD-nj@ zIK%E(hdul>p!Ux^X}!58Nhc}(VIJK!$POp(47+^#o^s)TX9QNPu^io5sCqUUufbk4YH7yUpV$<&S@S_@Dapf$5Cbn*kKabBJinvl))ms%NRVda$~or0yYMwKE@uW^)5Tm6jCA^Y3Bi4* z+HoCl7-V3Ez!g06Xl##m%Y|6x-FrSEo`L?z^Ay#8oa>1SLMDh2Zm^BWbVU*-GF;l< z+wmsiB?R1aX;;_-QYJ*P|5{DBfaCb>zTnsoIgS+EM5x_VeXf4W2{cPX1r^TtO4IUV zv8jwh{^l^ik>Rg;8pOJn^n6p3^1aJP?bZoUKg7+@J|0gIp`#}15AA0sKeAMWy1f@| zxP>H2!$!qW#Rd1v6D5ze@&$UWDnGqXG{4f zYJ)E2Fl_MJU$GwubJ^3j=eHlgS^%f+bPZeqG=uN@A6?8=l7rBn;OBg}q|n43-`LD2 z!hG~Y6WeC}a<>#eUWC`O2jhvI{kFZFpcH+S1M5SM2}8S=`e>469kq#9)7&24$@HE4 zOmKhp;q%LwL)4-Fxlj>t_1Do-X7*1OXK}XTsL!-6L24@(%g`G4UqOOts5&jufNq)4 zCcgA$F$l`S+tJ=uQ;Hn=_Upvx-+PDur{C9_Jpe@cIl2pV_-yT6Iu4zv0s{ujaL;1* zH&T_=m`Xz0G0(d!B+1_eD&daV6=_^h&XPCziwJwxv8ARgS9m==q!d1oBiJYsqqEGQ z@nbv|I&p>kh}?(YI~+{|1>mg(QC#-7?VZSu_O|xH{3G&^E5{CUaUVvT>Blw1$T{#4 z7OM)K*cE(UIJ<_52ZFef$1G$zafW=A%u;m$?CC3251@^Y?LpLOhj}h!hk@lAAktRA z0ltmVR4CF2J=NYEr_-9)z8j)o>^IuRjsd}oFQMQ_)x_@iXjatPf-iKUQC*{ctW)Lq z1ft+F?VocTNU2d5dK{YHyzeZYgO9UoD&X^Y&do1(ODaWn&G9{O>QD=AZwW4klO}*WyPI5i)a2| z9*GFu@)PCu|@y2IK_%9gF;g>^!jABvp>?ryDR7i;?!yvE4 z*}?GS2i)bbF2hSz71o&#nKRg9GT8$z?pQ?L`bQHE9~FSFcLhm7`55?k-z|0U^lgGY zf5?n>mqlamtJFN6r{d+J*b;nn5QxaFA9~)+yeuL0iYRxD^GJqo&*Jb`!tHQ#V$0gmi6!9GWPC+g8h+t4(T)26q@=DGu2E1t$4F7lJM^EG=Gkspx%Q^p8e{ZX3HLLQRko zNjM}>G2SXJUK%o2pnS9m8)jrZdo3chhZm>u`_{UnP-MqI8W5$c%l#8Yb@`2GIb)Bs zmr@ys(1ah^oF07Fwka~(oT+d5@DX$&4*w9AB|s4~38kuH43H1~0cT-ioY5k)+gqnf z|631@Vm#J0QuuMjFA)?kQk7k+88|x@ekzZmJjx>biiXDDp_?Tbu>$$mP{C#<4=xXW z%8j=Q;bp0v948@qXbjuH+Af$6O%DfPLW~EJdAcwI5q5pW> z=hFZ-KnA)c&=;ziI8*gnn+jf89039Tt<>@$(dEHiri(;;15nOsnWHc+7RwpArWj;M z)P?iPr)hZQzd9eTq!(nKT2p^EUw-g4xcoNa<$19G6ta?&Mv?o*4M#^{>*>wb)t=N-=SCvxRq0uBSKihtSa=Sc6YJ0Nj#3r z0B{fe667t2VK|PIpB6Xwg2*JV<~IAF{KS#(E4~WI+ve&=S5^krR(f!b`P@G$aeMti ztZzSUvA~rzS#JT=!=L5p{POwSv1ktkRU0tz-sa}Tnc+5ck&(1LXS?EQn_!2U#6Clo z&SA#cD~SQ6k7TWy(qi8W+Ffb87FfE(aAS<|zP?yh_?h;+44G*9~tC_m2A5(@JMdXRMd;&I?T%2Mr`gW>zI6qM5_lvHPEvxf2L(CJm&n)b?_$lEjyMNR<#kn$s1x- zwv5xa=PX*!X*!ymOt&EQ+1lj_1Iu@HyzoUjHChR_5W118$+rVa7e0ut)Z%vw*<1r+ z#W2DhQiF#WFl|$!Fth&cPX-;Ir!j?5oxP?}84Kze5VV!}&;goBiiYpiR?Mz{c&^Jp z@jX|4*MGJatNq<0Z#SPRa;28|Df_Fd(U1JpnN-(0U?mfH5Nwy)4SC^ra zT%-rgA|8uZLqhF%zj!x_Q%vlwkjm#>ix#OQAXn|ZGTP`QV6L!C|n$M>2V0YM4BJgs1c%D!+lMyjKxPr#T+*7j$=Y@r?0W* zy2jD;fAiuIJ18ZFY}_SD#~NL2f?Rna8f@y z1WefNOTV(ckVgh)J$vQrokY*8V}eF%VR7o5bOxr2Ymi?2)&RFq?gzhikHPKUT_vgCz;IA za3vdy^%=0gk$Q9@PLFkQdwME5L}#1?MI4z*yZypu&mf~>u1w>?w$*9E=v~idbf32_ zjpo^Z7SZ~{W&ns)(`7UDGf7E2WMyaA8(J!BVMVILizO+JZvq!r2@)6T<@X&A8I(c4 zor9f7cC-=K?QFx%6V`4MP)L^oF&F8-Ed3Y-u9plfkBPD`UAN(7vOQ&I$y&}{kGyZb! z&o`aP#`!>X=$@_mO+H-_;Jx={j>SZ*3WN;BI7eaj>k0bR)WK}7w0Lm(8cn9b+%4bd zk?o78ahCeO_wwhqnqBM+ixPPBe>xm-1#k?uZ(-sd|9uJ7K&;#pw7=L}>1+LF>A)gJ z)KqK8Pf;dmQPZ4pDw-FYl0%b2*W7~%nPYQlcBb|Q#lK}yzHo7{U!>}Q&O@%O8o%qT zJjG!jj5ILF&?B1QN}yvPC%VhQ8o4TMuR`?mrCiu+LTwsb6OVCJo{_|q_UzQ((&qXt zH1<@uz2U3ZOM!OweFc-tqBTFj=^I_?A4U`{tG{g7RHxDi(|)aKEL${q+z&KIB#Nq9%>Io~0J?29E7f-s-z#?!;?=sOQW!bLT`nPnmud0mOLHAPwAP>o#v)M^ZtJ4AKI#D=M)~)P zkv{6nTkY(*a~W?=*fyW}^t#@#K2ZZ_<|c@_Y*^>|A;h7LUNcY4T8o%`q37VbJTrY7 zN3AjOuas5;%a~I}T0b+IUT=v%4#vGp@}c+a8aTJPk|S_=GEe-7HpI>?n8uvWn>1EX z-WILn!r<~K*q_u~O<}at@F$cbdz^tL@JH~F$?j!8id-vh(lV|LBuKyq6VbD{`q286Rf*-t65FH&6I^Y_&B zRt<;k#B(na%V6bP-TcMgDPLN$Au?58cR8GJ zQYGigB@dA}O%_m1a&%&@`Jh2Pg5UlVA5Vo0A`3yGB%bGnQwW=JfYz12PK4@?R~lYqJ2#!mv7$;k^dqc17tUh zo4biHR=fPF5-zB<8(pdTwK-Oy-m>Lb?Ozq@smm}0-%PB`!smtSM!6j1MFq9TgGk_O zd$xo;g3$C~NXz&=F_N>-Gfap+s?&+O#kSWN3|qCWagU{H>K9$o7wfxwtTwL#q1AHL zpcA#E&q=2`tTDW`(k=pv6#_2M_&`~B?4^+@&8tiH2^Lwx}VHM_mbh3Vv^4Xd_6o%5ao)zZ@%mt zoVK`L5SL>?>_yz1zGM%7qsB_8B(z^>Wf!^JM*9v_lJv8FE<`>2eE1l__Tl=I=>}gx z0FhW>2cR8JAhgCOb83**g0?nIbO=b;YZ-SCeiOH!L^xfYT619EYIjZlz7!G!v$?tK z>Erj%w+A7)JR}@P_tmi_I3USI6Gbh>%_Pe|q_Ruq{!Bix=5s|>LEeO7UZT)!9JzBwpqQ7Hh2s^>*4n%lOamoUuke=s3C|FRYgO=s~?~ z`6YW((t+!^(waCvd6b(>*)r3Jb72k7^bd}M{@K5CvGp$kDg2zF=Q0A=GUlNXgBR}SsT z*foz+9z}}-;@Rl5Z|CfQJgDmC_saXm1TI4N^yZ5qm4j%)*Ie5J=C_{d#lru`)O*G? zwKZ>`DOBm8BE2^Ypwgs>N)!^BfE1-g1Tl0)K&i>`C_x1@^sX3Cn)CqD;!#0CL?TKF zkca|OLMN0^?uzgK-rxNopUmEStu^JDnP+Ap-~WDp#*6ZdyRR-hj_x-e9Ljf`7kYd% zMDHnDuPPw!puu})g^a-}h=8n;6vqXkU@YB+7YuRbKpq{v&EZFxzelqF^!AxiW=I8r zzm|&o89v3)D4CDU3DTY;I2qA)QBP^MvZr<&B1BqdxA{@G5FwlTXjkCVeg$~?MX4z& zZHu8%^oZL(9$0u%4r3UMkd8zLLgnM1qbhN8a(D{Y3H8f$aM=^=NyCnfFJw>^hxHrdi6P#FwHnl z4;U9JyRIlN(9@SS^`Mh5`Q*09qG9zF%qxZj{?kZV*;X1jqBH*k_~Ag`z?bWEJkgQ0 z>y6N-hoX~eV%!vKrRZm<;*N6uED0nFk^!4d3)nP25-xEuNUko%TFfl7X?*vGj=kPn zrZw4`5ShNnUSOoK82J(5ASot=NE^ls zYJ~Zp`j%$TO{gmd*ZYFf*QWi`jm7t5DPbyNwl?wIN4j@ce4LAV++%BR| z74GhyM^x<|L5HF}sB!EKE~%~A!I)Q`QH;FVvTx4*w0O1(2C}GQS5sWT&|kK zSU#~WT|e_zwy$9H=%ibFoQlGG>Wkb|(@P8^$ELh1_CkuRD5*kaYctHf47@#e26eam z=|HoLfoLXAqa7s((L+0rpW80NU#}1sgU($g72No3%y?}jS}r)ZuiQn?)Z9wP&4*=# z>_$p*eZHK(m&ikw<0^-53uLBd{x*O#5^I<@Q6;aPl%49z?H6#jL1G?KTodES-M*Rz zY60^Eo7$Zi2O}^zFGEt+a?6x{PVvy*v9GR_Q>2qwnnmGH*dX$UJJ}T&q`!7tGK}Q; zbd{&?+1i=$i0?^>9KRK6=nAmK1z`azXq$rHN1t&vCDfIgS$m= zEv2H=VU%g1_=R|`iNL+X(*|B)lr!Ty_2&r(RaFrS@?8}@$d(M+k?G^qfrf8S9A-%D ztp~QHiBwRwZeW<;i90!Kf@jNmm=IwLW#~e=h`iSDRwF)@I!0b66$E>=KS#hF@WYFH z@_wbZfl-~su;rq&0Y#(Odz-X3%avjRTL)`*F3f6OT}5WQQzXbNGKS1S79l?->DTXM z5W*SS#;3&#TRS#T5|3BqYD2TrN1Ok?{imY(1BpO7d-p$z=qauUxrO)GzIUq%g=w z5L|m@l2H9lH8ED@(4K*|oZXcvb@YYt;C02N;N@V&KPTfEd?ybT*iZSeM5&kG z6#E39D3r5^KU`L9Bj5Eh(D~QZ7~BKZN^>YH?UuI*mX!I?M#GUE3&~heP7sO%@Am%B zn4|}o^79`NY6u+E#7HBhEWrithzbK*1i60VsweWBZY^t9fF+V>nWKz3Rrt6&7cn|H zGqBUcEVJ&<4|WFe^Dys*c%OWT3ILW8)JH>YpP9XcboI9z&k@?YMs(pqo26ic{GK+Q z5ABb(p_&Ek4fhRzS2Nx+>q)k+e+g^KtNye8w7>bmPQ2)ZU)9e3z6O9x4CoJ;lHRD% z%Rkt$27|NZ==3FO0nFmcKN~o%#eW$>T})0~RyR{zGF{m+n>+JGfZX*cm!Z=}+QCD+ z4;bQIObNUy8nQr*tqEA*J8DOY^J4YY#N0w>)$CYOg;E*6;Bo5IxT>9onwS9e_nIAX zYC{I&8q{Cct&x!L_PE73W z>Mv|wQT+iox=Ko4KkESJjahLvTorbJD>n5(-p3y!drDMa3bH|W-r6fb^w?mt4wFoIjjznxI#loY&~dlo#vd{Ygsst# zjKs5kj;As#$dl#yo8n~yB{X!5rAKddPz*KqK zQSqvmLpD#BxRDsGc1wizRPV{EvE9~n-onoivMoY*;v%)Z{8m{^jYAv*!4-4jF@~a(En>YAzfbNVk{NB{*@!2D6?;Cacu{aVx|y z+X$KgL85g!+NS#&T|t^K8I?W6jF-_HPJJUW6m+*T)xP0UP2O0;j!kPP0UX{1b#mzc z%LORXF;ot;mzROP;yAu2SQgmtMeoDSLZA3po&wP-U zvUV{W76hBy_u1BM;22qgv}aepAc+VaxZGVFoN(p6xJcGwv+&yu=Wb@%i9>SA44!f? zR`QyxrLQW+6s<{h{SkFk!(v!;PWl6?2-ZmCpJm2H25e z0&gl|U%C$1Xw)Z`YZTb~r4rBMBa5ThKWE#Q3KdK>VS1E~R9uX4eWywGepRci&|Heb{MtmFl49?iEc`sTVhAkfvEqf8J zblOx)&B-wDYpj`dNz~u8iXEwdD<7(t(f@Mn7n1#%rD?=aoEp|aiZm2^Ff;p=6z$@L zklClnK{8Z1XheFvE6QG=a~sXNO7%@guXU5+ljmJ7+y}K6cfJ;6>Zy&#E@!p#7_F$l ztIBJHIsrSsCCNg}>^fpGCfuv=rvM#W(_4(tK5hA(sB?W&+)h(B3`%N;+Nh~ooBPR* zWl|0?73m&@Bf|(%uQF;bNCi_IE)jqlwPHiQ9tkUNqd?$KK_U(WfalC?b2%;Hj`a4d znRa1`I0#(Xn!;5XVb_$$>(Z9BW5|iTW;uM0;y}JfjzqLSbHtz7LQ`oOF`X%OQcu@n z6^>T}a^^*}=7s);w1ST{v_qK#%(S)a8x|V%a#XXx0%w4ep##EYiH7&SB`kY!r(XDV zEGz3yB`xz$TFo?+f3m6UpeKbue*E4q zA(e8Y>q4bQ(RHL@;wzZ}8dGUa)|QPU-sppFMk=gf=yXxm&KE8&(YKqJfW4P9o95Ue z?8`u{;g1@UMpOKV&@U@ecjuK0#d|Z(cv4LV?jRX96j8*^)>^`uZYkgw#_fln-J-Q2 zl!kHSJ3cE~WC=vYW?)xn3^oI+gquAfOfxL%oBi@QQy!J*3f(9i>pAg_hoA~mt=fqN zI_;;1*+&ob^7-~(kisE#fM^Y<1F5(4-r+wDbq5OhEr57M#{1&wqW+`EP*FLu^YB>R z|Ha-p@jP65S(W#{sB0>$Z)`6av*S7T#rw(H82bd20H=A#z(;~%}No7`*PWf`j z3c0z;{CUldY{koOzb1?Ntk4qZTa52#ZzF4AQE*piYxkrlZUq;LJBI(B@(ZeULh(?6 zsk%9iXeyjyS>m%!J^ga*p2b;8I)EQC} z-$(6-kRr+ru8Vs)3X)q%l}D&AVS<&1C^%BPdT*drzX|u9AIv5nR^z4BL(rtkKN;0r zRTqYKiy3=*C(>^3Q&LsSdGn((aKZKFXB^^105&I3e^t7qdHEEHyNbkcy)qb~;&uM} z2@>sSoNIvR_j$N=NzR|k3s7RJp+2?J;*GeAEoGi$TDG3ac6j|20t){uhgx2tFs~&t zyjdE^UO1od(5N$@<_p;QHrU>cbb}BrxZ&7Fj7Gfe%x`pwQfk*s%|fV!f) zA+&h2Y45<^?8-xy>7|jqrtwU_z1MfV_iK(DD%B*l!EApZP3^P*jX*S%@9yb281_ls9|NQ{nLi~W^#M$C`#{z!mQPjJv zKq~N&as_+@G8fEhj7(NzTiHD4PmN;-H%7wCvPY2MZjD15l6MA~wuy7!_%T~@Ss97=v_9%DS())e)@A;cND}S}6*4H0(f$AV!bUzkK3ScP|_nUZ! zfRs%k<>n3ytvcT6`Zq9fknEDQvgEi6&}EQfX0&48nRzL?C*oPOapCPQQ2nVitox~} z3i;tbvt9IM@!iDF^zWZINuJjcmvhn*>^XaZixTBpo%6ol%H{f5OH=W>?}R0t2~OT1+%SNmHhB)BHU22K=}~Q zh{w`~D_zg)9Qw=5gI8JTn9R^YP&g`1ePNn|#;PvDbxc7YTYgH)j^IW>fw*4TdhGpcmI!p6hD{5gIo(VW zvaHw;>nh&F8?L2E)=Xp^3!BTazkJR&=RyZdrb_kckg2J52}3u~bJWF}75StNOMH~@ zDG8o%bp0%Ol_XTPbM^b~FXZq&b?)1zwKeP_pK)t*hlqz9vpX59MpsdU-x8tfM|^f< zqlS2jCrBmUMOqGoeC$C;qebzuM+llqsDbhesi`^D(XuhrRg66ce|Q z1p2QWNY&yJTaYp$O$@SamQF|0zc-|Zr3Q%!F+bEB^ao>05@G}alw40f+T$eUCa@i^ z{&soldIu$0JsxgtC2A0TgZ06lR5_1o-EdSHHH(g;ir(ShPM2FO_H#sk}ne9GfnY6J+79L zFMGIi*ee0lfCfCE_q=JbG7D$r^yE%C)1NGd>_dNeIMv3bd040+I6$R<7?uE8_3&{B zMt@7Md=`tkc+E&LYDZ8pGgkL&W&fl0rZ+^JlH={%OAW>eH-e&+7Y+Ni!@LSfyN?mI z!&5kL!$z6g^Cv(CqN;ZGReSjzKt8IkS_m0m36E4vY82Cc#Bd0V(<-t3@b4myVY~`* zeO)JT8i`HHGSE3o?=l&G7Ne#Wq~hlssLiD1+-8U`#C5Q(+?xAu9Y7OlZ>l)h3VGTZ z3vT-h@fh+sPPKKM1NGgfA8(od$9&$C8|9{Wq*6bmlwoo>KWE<^_#ZP4_>YF2OG9nk zRYuyMnJ~icIqy-=8?3yUff9YB1I$S5ZITAIGJ$f^H@zb|QRbv(^*=W~(T5eqc5kB( zqPfQxSo@AcDLJp!L5OWMyygWqGc1xYsicYtu5S(JV=*B=pu1EHH_Cg2M*S%Mz~xT3 znW5!$L#kmj`*65Ybi@{2ubKWb0gwwj3?TU9#i=92>B=Z_xrAoNSp_v7Gy|iL$S^v zf+;C`dRxivVBl41@Ao^Of4`slAwM2Et1@0Y$wiHC7;tfr{N}xxo!WsW(Sj7^+lB3% z+e$k8d-7KN6}w}3k&hnlsPYM@Qf;Z$FpgHN=I0(Y%a zOHLiwNc;Gj_IN`o*V=6_7%>TQ`G-jvpRvHG7G01&UtU^TGH0cc#uN;JES=K9G0x-C zaAC@UBOY*Tj1@bAeItT=WD%LP(HC)g5lbvnu4lHQLz-kjCyy1|yk;n1kmz^IA>vf( zaO@y6iln6mTTM=#Qsd&fls8^55e`#SAI*J$_~*iGFSU&)^WPiB4Wim3vNnW z7qiSVRjC=g4nL^uNB&-Z)IW-2@Kyg)@SIfp_1c&w8LnK19q-HT4T5$yTo*tY*Tn9Z z4E>4yK3`=*G320@kSE4Zn-o_UQ^1G{h#T&YU6aS$LdFXZ-4_=TaJJ>VUJpujojC@t zPaKLf6uC{iug*HD@YJUrIWz{pv)`qJV`J~fmy9%fP-+U-epG8N~Q^TeGP}kVip8gms0b_rbIURw1MqI*|msXqq zj2?g%K#h?0RDqLhhXz2vXM*OFRl!AtYQ=dPA^%9Ch15xq5r3XAC8eWt^?+l_CaID; z=!j4T`~hm%k+Pr?XxopVl^eG=FxLHBiz5kj{}8DOR{t>)kCJSwcdW%a6OUnp zL3njH9o@?fjj@!_Y40Q8?Y28O}q8?$s`sR{Apdn9>?BqVh|RMy;kxH8j}gZ+@#=9Izr z$+NgKX0_k!oOec;1fZ(^h@qAUY?k|y62e}n&}QqIs$iVZ z;3!j|qOnd;twg^{q{_%nHpC!AEaV|0-qj#HpwMo17gXxZ-?w+)ec%28i3n*|D4D^4 zqDMqMa8n?$lcYQKc8CY?F<&Kds`_7pK) zPv=^bOB5@F`;SmutE6OI-E!_pkt{cTs>jP7uD@O^Tn%&3Yl5nXfNY`)vsez~%J)Jm ze7GiD1nyM8-ldz{y9nMiPaHBJZs4=Odk?<2Dy}LfScwI^{*Y^R?uta=)#*)AyIjSi zKy!jBJX~J&z!r=K6^FkZ3aUFE_@Vlmn03&)S{F2iUz$7Dmjy1!ftlgAmV~p`qo{2! zOkS(7^-cwI-plbv6Dh*)!%Y~tkhEdv9?>U((A4e7HS2)dJHoEFD-raR{aSX$0KulX zdgtohASbj4b)bGZw?X9ct&?GZp2}8X7&0CfFLHUnbuhO2Y0RW*BxO}mb;BtIpuwz_U@Y}t42tDu_M9}hZ}N4*T!vc zXv%AqG!XOf3tsmCx-;pjehC#ry(uLLNZ>61X&SHJ94lv6C#nRq&Z7 zfZOe|j^0js%+s;X#Z;b| zE!bxzKYd$~8Ves^xUHc5oUuY(8)sv$|CkKKW+Owz+VPzN4Zco|Z76@!p2hRW7GY() z_ao?@b;+Z@%XvavOOX4{2Ym#Ox4c5s@si+nA^iv)lC|kCDv&(%Rq&lPTV_C4x9T*k zaDUe*nU_34jwig%&^fzyd?K{v=f;q-JGU{k+*T)AhJRJbuL~aF9=4q~Q7_-s=;nwT zlgHR2xgijg_`}=6|Jf(1x$8kA`&+nA?K_l_X&m&)o!mh2UGKFzz=6#YJu43_c$%g7)kms4e-JfopfSW8Oizs9=lD$ z-3{C;U<3we?JGa8AtTmDg!Vvv9hUTCDjF6Hk9h=2I-178pv*8 zxjHe?+MyWya1ra$KzhYew56y3?F-4|)v?ZOHav|ea$?yaRM(Wr{Rb}3>5HoTmR0e~ z-5dG1lp~U|2SgG}QUSLJxT7)UH9)w}=d?1nB363lOXYn0H-6(S)#Z!_+5C)I z)y~IK_k$V@3wi*H9`r@jk}hLu`nn!e+rij3wcNigSAMLinAqq9yUR3kZsakF0%%|D zpSjtCS+c^qQ(E#h`_@%}u5d&m4Rb#}HpQ#Yu84pz)$7LF&q*K^(?68jTXYTB;pQJz zdp#=hw47Hb<20ADB4mzB?BIzS*+%B5(Z7t>u`e)y%UT)wD%J|1QPJ7Lu(>}YFfkM_ zG-6GSeZ`j6bp`S^M)>!TsdawyE^nR%0G-Hh}}3&Vdu2DHbk7cC!K zd_$By(A;(<$XBcWOIhbKH(D3Xvv_x?C2TF${XAyO5Z^fOkK@GKpA4n$UPHRwn3hg^ zyTJ!iNU;dUs2DciC+sa1agAz=Gr}X&5)#TceFEEm{20gp!cqV9NW!j8bG_nHkSAIL zuvet0ryp+!uIOK|*=JGW+P$o+p#o73JjXHJ&Ycg71T(oThhy71LLYNSTX+v2`%2km zFGlk6=1ti^MdkE<1-xJE6ct-$k5@g zM#PlgdVMS)&KXrRXSI!&m2!E!an(dq`#m!!@Xiq9b^jPZvTz-Z<8QxyZCR_GOsX(2 zxAj8q;@&^RY2i=k`=+%I{fkJ*Ho?yv;zN#-UOkw1_;gMY4lQG_iD z53L5nYek3F-r@2B3jlZJk||*l#^lgbQWf{$23>y|)_(q{%zJNbp9M~*fIs*0KTBf5 zv^b`+--mXjPIHdfpv*>zbWV{UTW=+bqbYzsLO_5s^M^idf-x1C7h z%;)+6ove$oIR@RdFTQSxKC~2k;`mb)(^|&0?$a!>ltboFPm!|ydP+4D>m0J&fUJW0 zYreu%iky3R$*E+fuJkS4s&knAu6Of2rGR3uYzEQOI=Uu{`rX-Sd5$HIMa;wlia`)W zTinh(h!cHeJU%cbKnOk$|8cDQ{a+M-BFS+ao=wyr#*Z?CAHP!BQxXaBpfU5TIk75< zD$_@i-<)!%qNuJAKCy!J9B3`oV}#in7=n~3EWA5=ksb^FTAzudT2goYkKu0Kx5lHl zKOmSa9HM9A8ullFsnVt-V^*#?nE%Swl)D;sQ?*cze1hbO`DMv=+lF2D5tmzAEpwlp zauyToS93H~z!ce!O)k9mYvT-v>-zyvKp8s~$XnPnv^8ON3xzxaUl$$nHigX&dh{~| zURO+hM=RC_=P;#i0SVRVkg~rSw{)Fp^n4`A%-dHVNijf#e#=W(HrRW|tR-nx$DB`; zVCMZpJWU8!P(AUQb5hA^p~ojm2Jnc--O8Z75NF}6CGO*Z=#fKg1=@ZSFd>u3bMJqD zyy*4)tr+c=LCms{$b3eNoP(QK7Yvq~Mw>0$mD@>B_n zxa~;#fFonWc*`4O5DX6~it=+NYV}X(; zMEXp*G%G=UC7i_Yq(;R*y<5fIWU`Ef~phMcvQgdespeL^1 zpO$*#^!nkxmNg2YZy-Cghfmtt%5NK%DQFJC7JruL|*nc`2f*h z_52%OG?^Z$Mg;1Pcg|0dlSsj@*4*A(ZN-qBgI+4I$*9+Kkh2hhg4QF0ZIxLuYAQ2r zf;YS}A`<8;ACCDnhB*;ph33v%UBchMMk$8)`=9)#(gTsUDVGD3Z_1`CY zAi|mZ$!R40il3P@5#0C(EDie-tA^_g+#5-H7bsq|`sEEmyG_onaH^7wB*{tLU$M41 z`clq9S$2dM0D~b4IVei;kf}g5g>InuVxjY4XgQA?r8{k$xwux8Luy#4krB}CO_JP?B(HcHo+Oe`N_w-cwLxu^} zrwXVw<~D2gTw^JxlbvC@qiwN3fw3zE5VQiLd@aVYx}?G$DSJS zApc9gMvf&dXuaJC#O>fPI9u#5TX!Cn2ni!qw$R!PAu?v2CnWsO93Eug5w*jxv_sReqw z{h<}^9^r!88dX=R{Kvp1&v*p1bMPM%YIr^6GMqweQgOHNrpui1{t+nj`3B2^>RGoO zeGNJMuZ6II*hazzt4C-=6T?l{MQhu2T$e*%r>Z%tsajllq7JQ74LMcioj%Fl7VA7% zw2<^Arzg6fn4t)XkyQJ%qn;`Dk_kjdtZTyK<04_042WQDjQ5dVU6H3xnKg{qK$9Qr zO)+{>XA&a2ctpF55ix5_)N{ygn77u+5MPuJ5$$UUON}kJxFTS1&;_zlIAZ$fm3h00 zh!%C}WMV^K6@OzW}Ut}YY~WpGz^({Vs{cDk(~Ck0+Wp7fT5;cSG70vEvx#5+ zRx7}_l;9e$839^O3rocQ18n zJs<=3S3VsMON2E;j6}*7Pb{vJPBAty#tyIvQw`ikqfinZqSCHet0 zA3Yeff$4Lp5^n2<$W>|E{d4^wHNO6dj24m`76CQE)d$L@LfL&E7;h4dTN9d2s5|$; zf%@GSp%Hd0i%qpjCt73QVRuQUGKnjX1zLonIX@pSO{4-?R@A?Vypr@v90ap#v4sy< zj2A01XDAzF*@+P`;h11%?T#(77H$rmg>z|g3)b)02u$T2YUFnjyCdk*@MG*08!tzw zV6M|0=~qEqO=#GwF$v6zPq%-W0fN+`^k{gCr_7TKodlwpio0DmGGLFxjpH*{c|Y^r z-{iLmazFLK6EiYy$@Y(tv0#z%)fFo&uiU%d+1#0XiofJ!?MvhJusnZNR*UaKn((d3 z^476>!joh?{*WoP7v9bZra>I`!LxD+*DLgE@UOMfmPL-+5UxY#U-DZt^JEs(SVu>o z4~0BtJW^eBTY>k&0EVr~8=n>84^9qULy%sU8a=?{{|uGRtmUcSqffoy58e^*xiia` za(DhT*@^r!wcxA=SF8;(-&RQ4V%pJEw@7mDC21iWzfx&CZAKFxq%tq3hy^1Mh~SG1 zd{iHEh0w-td{*M|>62C3MVup^e*DJ^yDjZcD|T2?&ZVC9&2fyEeH9yXplE8w>HB&V zWNI)rN_y%I)Fp*NT`LO52OdT%SM4tm5Xql zW4^FOtpHxmAAr!vlwuPQh+B$}|7;P!Sf(X{au=4g2QwdPEBV=US%doFCB%c9R1>pj z@TFce#3ZDSagVA%N+)j1Qx~k~HzOaG>d!YLyTGHPQgr^Me2ejaCO0vK6~kGA5`y5A zC#S)|4ar53kbNQ1Ydc@SH4dlLn-^la-1MpgZz{`pv@#{o$Edy5K_em}BCQF;x8!%J z5?XQ>gHn^9E6-Hc?2Jmjd-P|S{b{_47(r^K-gcz+1bkC7)q6V!wEJ~Fo-&S6mn(e9 z$z?kqzpgw%O(#Yp5Ow;2}tnJ@#Xjnh6BbCD!k_Q;@;qGF^H@)10a^SWQ;j44TcW*e{gCYe7n z5zk8@JaN9Ma?j#UAY7bZpfvHy+8PIMj zAj(Lo=__bqJdolSOBq)pTZF1xxvTiWY=wwap>1v`-_Yr6qN2;+>>rS03u^oqa*!Xv zo?01FlkHCr=r>eIxiA`&@mf#7>a5DYsekwLAKLX>yBe(%a;R#KBmb8^SuIs|6>MVP z2MbAgOmLU=2F>9CDeoK-9~bOaF{3&zdD7BQ;?Bbph+QZ2DbQSg{poG)kZWO#Um7bn zlB#$5l->NDP%5Vz@-QP~V5^%Wm5p^eYwSw2{Oyz+#SmzMyM-=Vo;=^3Lt z&{JDM?Nuq|HN+{c4#A2)1b&oq4kV$HiatL*#hEE;@Pu+J$djr?dZ)`}VYvT};2`%M zynTJ!!Nn4yKh_B6sLs23KR`~qTC{DBao58gBK`J60KnS zEBIQkbB^x@2DoGSqh+*<+&?3GjK+t5Uh#*hIZXC~UPyj7$Y=HG{apfEvE%}EqvhRE z!2vgs#v;Q7E>dvzNGO1mrgl831pAZ>)G{$RCRhO@zxbNLKahaO zJC)*I(zuz${Qh#hZaleOtdj7y9~mG>Tf>T^jxDwm_j5CxO}HTI7YR!Z4d24rQB7~Z zin}z-L`Z=>d0{aO9jx(#4yagU!#22!)<)gJI^puuXF!Rm(SZ;nbIG97GXqXG&oQ!$NCDX*36^3wE{NyP0B+!P7y6@NQ z(C&1vF7l6GSa*$`-*Gn6?(GSTwBh3l?UF@4iCEnfww3>5OfrSHac(=?@4fkz@TZh* z5E7i$(nq0##LcGC6M-oD6|?~Q7=6GqBwr-8t3}~E_a7h@H+%`{8LO`JyXZLjd2|%$ z*)Si9ZI-Fjy-#e#`l_3`?Qurmx6j%Oq+?K0ImuWVoJxS_Xwrb^J$nUH$&DmN9BH5l zEWqo(O9g8K+{Kkf>G;=&*@B=<3J%&9)|xgV?Cu-6FjUIqDiRH{Mw=kb+US>#eP@=W zgU`O9#^$KIP-xgF+=AU!OKdkN?rQl}LSG9ExbfY|w7tP`>!s^N`F@ZEM<|Arl%I}IeYjeNoxq*Moe!)W7=yc&`D-4YR;8lZvcW)?lxpv14u)2#Fqxr=@ zvmIbjuz1)#F!r1Ule@U}Az1KGBhN+?L)=g?>2SKP2JdDA_@@^!c^+77#BCLfCtxlW z9S35078wDtg-t>9kz0?5C7q#3y`^iRaH-qgE#M$V-M?$aiXr1(^4pKX8nXoF#AzXn zHLSVDr}cGgkNVC`9K_h;!!4PrR0acF7}72pqEZyMBl*{!BM=c!!J6v$kl&yY5C`}> zY?1oC(PCmvM*=(c$#N`3hu#?^*-ZJ1*uPTK_vN6%9ENhL3+&NPRul0Sga^ zgUoRTsFf@GMky z3m2xP+F>E4MT)zJP;%=PSf4;zzg@M?2VFiD1yk;-Jcg^`uQ%WnL_`=G_dJveTSqJ< z<{mIa2sYfYyyXZ9J^itt6{O&lRpqLC#Cw5p{m(^!gxo&<{Yy=v`a4(W=loW!P=ilQ zM&AB+7eG<$pHwNB5o`zBjlGW@P-jejsW&M-=~X(OE!fDraiZ!a!_sJW`2XGqFlC>| zF8?aH^>1zV8?GMLjFYo|fAFeLC?_oIu3;I6sZtjxhG-6hT>P_luU$a$Qq;HIE*TS!|#84`umkCa! zozqo~jEb_cWwDuabfpuEx&V|wkt--e97Su_8`a%#4|mt_jc2qOe=X7wT&_AfOTL^s z8a(U3)vO7V7CMS%WoC!h3cBWmv*~)sBjcMadVML}TKKs+cSE z>-4fz?~RNAIW%iDDQTK-d_;UOspcNKz|e~=7XK#~%{4njFeR=BZpnN zUkgXMf0Q*fIn2o|@M)cJh{mF3)pLeOSclmE?_JAbbZ*ifvZRIjh1r=JTYtosJR1+& z(TJHba!)%W;bL;hoFANSD>B=bf+WY`Qq&jxx#9Q9VwY?qypD!i7#2{xf(~@C=JY_M z5nMVL%X9Q9tK-YVS1}-&Y3xUET@UjgniY`v7e|mpnuMCAPTL z4Z`_R<*lrY$#k}Su+3tvEsnQJy(&VtR`st%>9hcHW7ri&Zh(|B z7KGr*5IM+H(!vLl>(*DTGZKaaS3w7_F%s#-4=tYlI14nQ*J14u&5GilD&v)7?*PnL zCW+Y6E_1fz2kkK>XJ`0un?LqLz#br0e#v zFxiybt&AL;l19SjH8n+zo2rXqUE~45A(R%#5$kl3V$`Wy!G-*-{(YDOiR_)e6zCMr z70dCNFPbA4noG$7-p6ZeU(r^KPgm4nTk7*!Gu&nMgiSeWTSd}FN70+7A;ODbPEGbZ z0GNPi2(wLDeAP}iF%c`HGU~@VOFxU`v)JNNITez}Sns@dA5HY15ssUgVV< z#xEsMn+<*qg8M>o4;K98z@0}T?m0w9T7K+8{7On{S+J(<(~dhR|6g+N)DU_NwuMDZn?~HUPe<0nP{Sb~wCGoZ~f@ zpj>ZvFwEoGrIB^H-eKhNxOeLq2O#|gN|=2}SBp1N8){X&6|4`Q0a2H%tB(ndm^CHr zKz*Lg)usaH1Yk@TP+x7;W#jQ!Mp0a`>;*IPXPRWeaRnPFb?pnbo~KVZQk z)LCjh|~2Kca2vd!2*3;s_CThM$P54yNfgdxZsa0{%&BmcVa^jB&MJ+?YiLeXbNwtXWj4U}n+2tg+^cb5DMlhEb?^Mz z8jMa)U;j3L4kYmpM(7WpuK0T}g-Bg|3TBaKi0Hfd02<9t}h zu!rs1HHvgWf^g`2buyUHJIayEZ_E+E$>Jj>9bW&Ijg(9r{D%f^GuyYP;QQ;P zLLo054vW#sJpg(&QRl_WU>mR)jbpxBP|x{(8r!Tz5e{-PIY=)r#kRtvIdUB%qOva# z4ic3s28u@>pB8b+JHfNoPJT_Qe5Li@r*H#pqpC!P{)`~o2A`qWr4~F=EWGzubvl^! z5W<#2>A2uCNtop{)ksUba9XzkX~@69Tl8>@-2eUCquVGtP_+t2*Gm0o%D+GtODwjA zZ`PjrV&-AR*wnY|R;P z7W1ekI&7md^{z_X+{3*|rv=_9c)Z;fmBt?pnY(~-4COC!>@g4fFqp3_P{jJYkCF!r1&jyE2qz=ac~OG8_x#dey|UUC{N(K$#A`9U zE-4AQdRiD8Bn$NhK@m&s>U>JpkP*IyKvXJ$G*qX3>A2Rj&r+x0E+fnt(%#qeV#{Ur zTf+rsB)nq}R*6UcY zFXFpoYX0w8hh6uWeFmVtDLg|4;k4ESngR2d^FtJ>bgGUlidLmC%4Qx_U9*rpH|@ys zrGf;BEzlw?(G==g89UVevm{=n39}h+jNz-~wft8vzL0P|rH9{cs`D;1Ul|^<$d+@t zDlIoG#G&_G`S%oK1OJw}N#0CZq=@4R;CoykMO*`5=W>pDMl#EuwdgselR1=;tp^Seji&+qxCSIsof^W67!U+epNUkFfItl7W&=a}vXX)5`x?fOvL z`_{LirK-hq1^3~6)kcT!$G?6~?v-<9xIe8*nR_bt~cHu75p7o>0ytjJ_g-gmeX5-R+a;I2@{3p^akPA+aue8s}Hp_Z1C_MIY zaQ<9l*9DG5yl_5ar%o`a69;(E}o;SpAKkH#ZHf%TCSu*{%-9uW`l@Si1 zY-?U$S_2Kk=?A~xMif*dS#3RQWZ5~QS>uc8S1@uqB77(s9xhaS#PP5rTWvy5;l$7| zY&N>-EQzoKNlQK2AD_~_GZQ4+>u+d{Z%<~l)=r?`uKhXeoe8lWk*)Bqz0)<^@H z8*T8llkuE*qA<}aj;`Rb%}&wEQS0a?Hm()H2P}U1t>;#qx)mco_5x~Xu*!0}pBOB@ zD8Cr{Q2eFN(>ckI8lXVa5w5VE$9IChTcZSxFYg%wAl3s$3;5tX9>DtmJ4@I>0$CR! zE;HqgOk^es!_tg5uyH7(^3y?4K@qWXad-LS0 zNBFucjWWas@zzJ1{#q0XRPze-tHD^E@=*a}1>OK+c3YyoS}AO-8f%yIJ%m-uTGtO4 z(&J3+RANtV?-X$iI>tBZ#B}kb2lt#muM?8V=!hnf+O(d|2}Oc^fQv)T>F+(X)U!-S zwt%bVFA93PGXFPB{W5Z4SXzA*voW)1DH6c<;zuiW|K!rG4S=AatJ%q z49~SP8bezD>J~r%*V(m0l&Sz&$J<1xCkPWYyV2aY&CVf{Xj^%Ojf{W`x+4@V&MxcASXmR}?`;Y;s7#-ZOkIyKX2DOxRsN1j1?L+Nv`3J4LTV?p?`mcB0t1 z$v$x-AeU8&$h){bDvffr4`|)6CroEdZNbI~QsqG-bh7B)I&UwH{5Ib_cq)V3ST*Vy zGdbPuAxJMa=R7TyEe^VGmlpBKG&?WY>|e5HC53pebFKBPddLWF4kMQRQ;_M_37ypEjVJmKkthp}RV-xyca;s(Z% z8SIXPJC%8~8Zb}+T)$!31Q>!7CVq~!rWtmV42S4 zo_6X0E&{Ji^`~Y@yI%Ck0qdB0vF9J6!A=?#g3?qXS|8m-xcVT*NvmXwXKYzzS7te zQ@2pqmjMc3rGjk;Y%rQNTg};P;(P3YX9M5PJr4P={~Ds$z~_?+OE_WKZP|>jjGBy= zeU9+6ES%}7J4ly!Xfwrjo?cIt6y>$mN0qj{1koDj$*CEzp=NTQdTRi>IVj3RtE@0% zn*$^VZQ45G?QmVVEO=`bmqgl&Tp4o6Ldw4tJ^PlDA>+WN^NUj+e zli^-Q>`bz>RJPV5RRz$n!@YNTo16-#{slKfe?=hl6r{%Hk`-`xF}iLGuC2^IsnKv2me0_g&mhP2N$P|b^? z&h~xR!Y9hp1rQKjPkg{G3O8GC2 zgG~jOzd_GCYCotJXZL;2$G@TmL^(%gcoWp~cCNMa0M08;M=?MQSUi^x1To)(x7Se)uQnh!kj z02VfDr!8${L2^@R%VMM|fYK;h?U{oR#=xMN<^O&n@eu;#TL0PTz+ECzj>qOAbV{q9 zzj8W?tb|U&W}v0;e4D-5yd1<7ZE9&e%;;d3nJyO=uO^$YkpvKNT_Axe1RogOdkr*|E&$TO@gEBHZ$ihQ_N@LekpCtJ z>UftnHrgKu8rWH*KRXM+G!;O5tP7KB-=z@Zo4zu{z`=fQl<{==CPR%bNB2hw0Srd{ zoQfZpqH*p{D`l+s|E$FS7BloXl4?vn1vZ7XDBlf|3_DBNwbkhku^>>uh`~Jevv5H; zg?%1IsoX^;eZQhCRzUdk9tXM^6!@i(HjpAK{v|PJki7*rJPy{xzUM<*GZ@rCigIK^ z(VXviTsYC(9Gb$Kos8cAr@>Zf&35D#Q($>;iCxg zS*nCas0#}hn?F1c+Q_R7*kiZxTiJ=~rkv4EVSlX9DDuxz{5;_kiE=e|&IpnH-~`%2 zVpsu3TzAI5Gkl0Ocrqjg7R}`XLvwIJ%waqgyGSfwi;ysUwLpuxC!nZ<_#;|C23QAi zK)Bex@G9kIZQ4=$0IQnfzaaITO%1?%;n?vSa{71NS=7sR2f&jo{Sj;_4=JWn0>y^M zs?V&sn>fo(e-RR9-FX58BxjDR8hsTE%`%5zCdR(%PA-e{?q`_qd?^b0_HT%axV9dS#M_E9(Hj}bS%vSUY;=ZmflzfYUOT~Nr4eTEOpaN@x14v5mkBIN z18GX8JQxtVZu++}8EbZM%ng{QE1Nx4RS^u2Je14&z>h~RyVod#f8&%iXA_^2^V-)H zDiR3nb4u%1f$IxWKIhw%2JXx0Yz46K&}^^iLW&ScZ9AR?%mm zXKdJHbQPu$bSc`&8SXRLo<(OGW(~iR-NN0FHTm{m^CILMQ%VUW_Z~p=aBF4&{wGgF0s>8ta5rDBsMJ5z_ zb)*wI+4|WT@KCl;0+^?oJx7~)sGO}p5X`ZCUkZK0#`XHe7Ov;%J891Sa2-CwlSnu) zA?vsSoH&kK79Qdbqm*I8Fi^uNKV(}M_lWyVW&{Eh%oV0!G?=P=T^6N_BF|V8R>oNS zpR7Uxr2^CEx_r4*BFhUEcWQwC3V;ULT432m;5+F+SY%=?>IIQSR)yaup(U)zIf$P^ z>?Q0JKqiLeGh`RG$3Cy`mt~5qRNdo)mr$nd!zhnbCChlr1Ohn&-;izal^EVq#eaW; z*1xMWjf;uu+Pj*8tkRsZ59W9;=um|fkuaWYuAp7v!J~jgh4tB?K}pRMcP~bfTNr8w z53dY8$gLTC?P46JtiM9o@sQu?9pin6n6gDCCaErlve;LOgjG8fFPPdBLbpRs zS~}6V#9Do_g;G^zJh%TXy|nf3x+YV-u(epm88-3m2s{(qkPCDv{27%Lg?E+ixW3)@ zzeM>o(+Iuri0kRmJgrhSkbvG7*vKcRy;!M-K7g?!>jX978zzK+hNom*;-wd798#X( z?u(_76{C5jd?119UK$;-g{3rjlyzK8$<6JBwJXAE8$w>m)PIPVe*9T_9;S#|EL|Rj zt_D-a$Xqxb3C9Q4I!%0KoQqXt72M%MLCx;FzyTwK2O$3~r4ELwLb`06o{bp4y}n|c z&n_aK?W@1a-lp`e2>$^$2Kj6gSLg4%>&(~ixuI`>DKX$WbrDEsck$4kuu(#^OodL| zIWWNhdD!ywWEi=sT+_HGmug8{9}xDg58c6Od_UZemq9=3Gc;SCx-Qvt}J5+>0G#{O(LvxsXEMBa-~hvFy;?#;O^@t&RN)~&#~QIBcr`}E2%3DI#ioxMyO=veMDy+u!BQuZ1~ z&)y-rJ9mUTI;o;^;&I0Rxw<_EUP!3dHWVcU;0j!^BlyBdiEx{qCjh!KR%EZ){T`%k zZJRVsjXi+asLMwQfjPNSHs0xL3D5h?E^9&_IsA0?6t(+V(3MfS84V-^m>4?|3>`4?AI?omoM0tY|HdBbO$#D?h)QRm9bNZGA!w^mU!-Kggek zA$+t@JhWCb`j$8@2j{GHu0#UGNk0H}85txp*E8D&=|t#BjWjX-AxsZx<0Ztx{Hu4J z%)W<25P(BrfP5GGc1roR&t@w%$2MVodgcRVY@rI5uhr z0pyHmwl~OvY5ye-=}Y@E#w5~XwR;YL&k_P=5w2`DZ@b_!+?GXi32&E{jx3tSm4!-h zg60z}UYB|cMeLBNW>d!_uplFo1=qaaqZOk?=RzSCb!Zy>Lf3;s2cz%K31n zPCbl-xv{W0Jg~38S|pvgV!+OX>q^zJ0F<>KWDMHK-R`Edro3oDcWbea8X%xc2qjpI zuHS`kDa-IxA~8b2#+p!`LUCLF#i=Wb2d#1@t+4$ac4{N3nZ^FkDdXS=KX zp~i<(4fo533VcQ{6D58nO>U=jOqk7pWX3C>Q5AJDwPI(M+P7167K3j_tNg9#rDl^+ z|9bc3h3L!n(UWE*YOaCr@l!vT4Pcx7LrxY*H_Bx6>-bkXip|XDBj%hXQfSc)KBIqA ztIcL!R1a17jH2l62R9$6@(-ooG@Ef_eQq$t8l$QNOB-dMe||Kkl1F7}4 zslF)wEJAJYhqI@}KrAtss-(GR-*Rd?>t0ws9Wsq=VN%=jghro+$Qa;yz6IJ7ZfDm z=8$m7aFN=>g1dhukJPShZlqvmmod#XcD;42uR^RPgdxQO-}~ykZEW`1xgQoZc7AQC zlatdD6CGId@f4?`&6;BJlhiy5gD9D$C<^3`xwvBz_zg>K`j0{_>^4d|8uOD^24uyvT%5{sL_0^rEUsWs`k9Jc)zjo z;*6NQ(iSIuhWKmi12r#j!t~4JyE~p7vKT)~Hag#5_1QTNO1CHVhgs_c`<^;WW#?3F1DlSn7JpP;@R+m`IvgmV5KjFl|hwYj52U{;pVm^r3eiL7}~MQ*s(S zdj8>DH4$%oTqRMb>7Ml+O|3d&YDnW-}8kogV1FBaP{O>Zk7rk!_D_ltguUr{{%W z>;(0ED-C+<{*(Juz4Ru^Q|{T?`~J@_cDMvFb#JwAaB24wk4Z2j+OdMt-}UO68(U@r z$IX?7l_I&K)!E`24u2kV-2GPA>Y+l7IP*ak_3Oy^l8fZvO)e$4^d|CC$h`i{vF|g~ z^OpRz0Z_#c@}(b2c2Uzcs9_CMoCb=zQZ}SU(Yv(~G-WX*wl6aNBM0|bJwSbTbL|yk zL@f2coO+Xb;%^sztjP8{MKLVkj>}1vaBv97UTTfc3N4+x2r-?+^@osW7| zUEu4vHyH`aT;V;8<)6;XU=*~PkBcltzleoFa3-*c*|f*MX_?1fpH6&A4mr1N zLvqgO@8FmnsG4^rWvLd6nfgS1sr7dh(;-i?zwkS>#7f#E^($}`3uqH>F#ZOT|Ej9` z7CL1yvqKP^2)3ASRr4XFAX2~C6{NRDiCFiDVV+E?stxC?^4_9-RXdp+r3L7xIS5h_j#|X(j#dT zJ$WICmb%Rr&N^(Cr}s2`oN5k@WAnOo)XxA@@wlh4=sylR4=IGy&&?K^(`WX{j1pI* z!D3&A9b?(!17Y53B*8m(WaP!)J@x^iG)%SMY%u7?OdRq*D+sc5%ua-=qSKu3_@zaZ z)TGmO3X^`lKTbCSf;CpN8Pi*LUJkA+Hqh|J@LYZIuZ=|Y6}4j0gRb?5F++P}#O<_@ zN@#3e$hoLz9Xvq8=W`jMU4V92AoZ{1uUh!KtUvCk2X!$R@~};4oxFKL{Mch_IV`M9 zaeVB{8m6W%MK>~j8XF1Zc;V{c2r!Sj#_lC)A-y(i+zY)`{%Xd~m24mOx#3S)V?3iK zeMe7I$E&_s1($Xx0y7nVN9AqbJb4021N*G=ge)dozXA!Z#xiRA!`P5;IhC|Dcp7DN zXGlxxlr?ac8(f~q@3DDVqCR^*>?kGmcW}9MSIuKdS2Dobx%t+$E0NxUe?`tf<2_}M zes}l%S?ADuA$_;7BL#c|5{hwJcN4={Zdnufl4f*Ye8Fsj81XT=10N)(p}t;&{f9gy zr!z3XHV*+a3FbsUJoJCPb>2fssqDM*v0zOvc3LLofy0w^8I5AV#y4y>xh*)J7oJ1I zG=lScqAe+RKvY6;Fl$=`WE`{gjhxswB+44*Zu5jatwJou%N*yF@iEzOe>|XvDZMcC z-kc427f-_dC%Z7dZT4~Dq*RLn$X=W^_3$Me=k4H@YiJYDM} zhg^*Se}ld24xS3bc%z*(1acp2KA^Jq{d}U%hBr4uCdYC_8w}mi81dhQ){9!6kE-^* z!DeGTRJi$0~j&)&uM?2SBH0-htFuV$woGbW|KqO2cl z9X^S_i+_OofG=u&@-aD{szD<)^ptXOg@^_-&ZaMWu5Av;Qs4i)P z;yGJZ!`BzGkQF}$u(SYHOzrrLQyeN2P(OD5yhd{Qa%0 z!Erk)Ymcf;6x&fqd5SLaaT>T2^s;*aL-BR0x!?tv7b6;c6eC`G8&(rG3tazQ^PEclWD9ci+x^kkOk?I5|Zky3Xw4F&OvmA!UGr z2TpUTtu*L{$}5kko_Z@MM|;Jtq<-mJ*Te&G$Y3vSISzorarAIr$nLAPFY3ni!~$CF z{4S9kZu0jImNb{qzs9PbA5yW4-44<>0Djn0Le*cn{4spSM+aU|uBvedkN(T(P>U1M z$t3@j3v%eMz<%E74|6$Y%HIBd@YimUdTfAG<>B%Dq(<%sT@^#cy)XcX1YSNXmBIZW zv8Rq=+1PN(U6&bEIXrpWIMFaImJpn7+Z$5Y6-OLdxm|-duUB`0f;`%g}%;fM95O>e3rGHLMX5<=$;JhLlwqThE)lZ9j9VO=md5 z^-}~A_JTZ1gDu+8YSg!G{!S)0;PvtOfJ9U8%Re)QTpD2GosHUAOg|4MtgiT`ezU9C z{iiO*25QqE&?dJ8%}sMIMxwu!&V)&O^+!6Sr)l7I>I-hxMThLfR(50dv~ZH=f$o?B z1oFqOZi-O~=8B3Q)VV{(;PctqE)63sN}j@xgOBCPw_l(r`h{u3rEhD1uEyq$^VBKz z^(u`*0P_|?rrNZzoV8bLV109IJ6U2Y1wzRtHl~-(FX~g@Q{Phb2*I*t79q0(l%`(# z;*2K=vLRijlDoH?0ml4HsGW?fM2zQj72epiRSyUbLf=G1wwO}_T=Y_nekhU#65 zA}UM9da13{88vt3!FP580Sd;;J8Gc4wQq~tn%QP#SN&>6nfPlmhsg3u!M5p#?0_nKKAg?iBh>hum!ENjEbct!1=`&foIKDl%Hj{zbyjOI zO&{9(sM(ng8GKd&o!tp}AjuX3l5`{P)eVQ*J+`qKFNa+iXp{~p*urV)&xE@Tzz#S( z?-22AESb6gs>%xx+?cj|G>wcQYAU(pCN zF}znJLi`^VfcMSi0-d_@IS1(^GJ5sGp^cMe>2q5;=298vJ&&mpME0G;VR4HbBY7VA zn?W~R>v5lEWJthTPZCsl7adS7g;QfxYl^#YR|Kpd8p9&*7Pet!EWTC3nFK(xwbw7D zBz(6ap3^pg-n91p8T;k;j6w4tfw*AF@1BRgr3Uw!*y5sEsh19{Me%Q#j!p#)X{$w^pPv!Pf1NSUmbNf= z`U!@z77H>;7rq9F zo?hbcOfwHjADfU2*-eI@%0#Kit_d$dR6BeuvXyB&KNl*oxARlT{z{0DsF7o zepvHQXBizg}xUKZ$!Gw zAdQ?d&jrQUb~u8T#&W1~$))rWWoX$Im9`%S&9%~UV^VgQPpmjaxW=HibJ)%)x?dkn zNKPy&x^-e9WLGfnt4FLzxHKsp6dk#Mp7Ynn;773 zV7IXkI5s*T?u7LCdy8M4{{dtlcGh$k)E7IYd;*NmKRbJM_*-R`C+2XbQ$xdh#y{|f zm?-0+4;r%Tgc_b3@8W-FA;w9j9@kJNZ7t%JwjHGYF5+X*D6G8r$V@*?3M{?B_mBvumj5c>%J)=~eo)52H7dbz91V zP9O%HOZb3qz{OgtyVM`8?U)#+un7YB(T^i<%B~?NK{grUq1gok>sCI;)M5!8C>Flb1$Ao4ZHOt~1Ji!6?gw>63u z+^FhE3Yk-Z2@GnFrBQ*3Kl64EiwZ;aXXs19YoJ$QLSYUnjTz%HYGp2ctGZrsTin=( z*G=f{({t}Bu_F(HWb#K$N}w*tp%huKUa4X9-=XYEM5MgJ5@Y$RToM&OFfJ_f*DINtHdXWfhDIx)s>2nT3GpZdEZTxf}6i;oVW@E4D3FMFsY z?5zJ2f9uuhS6GEW7EhU9uYP@PJhTI?b?eEW>8jb4C_B3o&_qqZCrT>}wpzLsM(AJz zEC_%k`6j@e9YNXhFZ12iCoJzGln)2O%LKjRhT9$vy$0ZXsq8UC(j&l3b%w4?KSL=k zJ>RJ1^`Z18&I>(8dtr2PtCLYlO~Jp#NmifFd_Uhs^&;L(3c^iF+xrF>@$r4QOXkEM z#+4-5>5*q=g4A+ZOpA}=q7VwUdggZfSZ;bjq0ec$F*0cNL}r7p+xm24>FL<;GoWJj za&E4^P14X{J2$!mVua=%@mO)JKgb?;T4H{0MWLkI+TWO=o7{qSP$)ex*V2x*?_=_k z4{j-aVIJ1VA&=h1t3ObEjf_4tcx({nI3VHIa>Kwt6;H;Dv`n7)9zyNMkC;2SPI?{Wo@Q7L1Zp=kwMv-qM zmt$3Z^ILK*eg^m0uD6(a=%;X$=Sx4Efo|ea!g`X-{2H!OPHjQs)1Cs~U7NOnhj*Jp zsj1X*Vq`KnbbNr!&aTb-dJt4=_*?a<6MB4sg3>2qb;>;WmzBQ`HF9enbL7~#M*1Mq zCI}IPC$qmut#$O6Q*S-Or;MUw#+HGG)rvyDd!LL$s}8>4}_L6Au6ciVP^W zF>4wz1rjflS-(NlE3o<<<)37E9g1uu+SMhyJ~%f&vcl4X4@(!ktC-WPK2JVTFboOR zq0dkYsp;x8irVY=_!D`tIoHU(7d|lhlaebR%)Ef1k=H`rCeJ-3VMpVIpCQJh zjw_d&O*=8MDK@rZt}i&EQOP<$g$=amzbS)82N@qkX$Su2BD> zN>jZlV?OI(8ACI>I)@y;hQQ(f&a8fn;`nN0^zVf2xuXya0l1 zUcY3E%W~H$`2jJ;LXGs7ctMc93Di?kD+|QP<=;A%AcyD1OV3&$vZSQqbO0yJ_JFDm zoBWOK4!0Mv+-1gVq33C_K7sK@TcAxCbb4gX>5F2M;%}8)*RpZ*@S}U9bmeVBPM*VMg#1q_qGg?;Oja8O`iGimrCEec{`~lMZlZ$>1GEP`uV-+<}a%9smuID zuzYA2EOBT@b)1<*%uX-tkPm=P;Cu>fnjq2bDWye z=2S$_#~4&~mYKGJhIc)9TGeJ${Xt_==P4g6Nb$}-rn-V~di{^3w z0MJg>{+qMQ(C!=RlQuCH#fC#%p(jvv6t<&$-4_WHkE;sFmG5yi=>rdBHz(;*&sFZI<;@ zPAt)t=S{%&-F`z6yy@}hijnzm75MxQlN`K44H$= zf*tM`j}+ce%SF>=)R9kC<>;lvo>tdRR-UR|OS2|9IWgabYibQJ`CHq1-0@f#{T9lB zehI}*v)~CHiN95P{W0%U_+kp}98R~O9U`sCCC7a3S-ulMUPr>?W zV3Q#+5Eu8gh?;6ELoRcIE_{U3^bjB?%fj%;K@vpp`;e13XS@w=1+z!%2R=ZgWl*Ww z*?l(3>~}YedD}vLx?cvj%VBL!Qf*BwIIt7z2Pk+N`pzB!o_sPiZ-l)iC#+*Qm3#t+3*NUJC5FEjGA z0LTIf`jd50v&($B_vkXyRVGdx8;7L>l+F%7X|x#M4~PoiTr=_!U6K! ztYgUnt_6>>^sa|Tn<8VfhC0H}Kph|g4rX0&cDRZq|Ly?I|6@yu-B9KkoHS0LaByW^ zG5c;X+S<)SzfC5=0_r!UJvi}5_XKkDy)+X-BrJ;*u$IVdG#e5|E6_?qdjs+d$MkUH zn5LedizhS4#(}0|_g<~PB64Wvb9(Z!$Cj!qphXh0ASUpAc9$C~2~Hh+d>x1>2O@c! z1Xvj*XI_mN6Gf(M?93Km?$uZe4Q$Oz^u6N3sdK0X!@cCb z+_z!E6%vjrKt?6a_Aqh@0{hz_<{H#Lmn)HT{R zuM*=wIcdMVJoJUA`HL-y@$ZX0KM!!R%DJo5lA{4;YxMy+9bbfF#pmF3MmxCE$klQt zIqocJ)w|&)@T6N%q>Qz9n}uI}pGsv;Cu(c|#F7Xpe|q>7%n%L|V zcPn(WxQhG;kIv=woMjI#4$U;_@fZy$oL{Fv_iTHk-;vk00u`7%yai_a5?<0?z#sZ> z@hW0mT37mZWpmFQKnw#@#*Rz`5Uwm})In0WB8KC-i67n)=ei?eWOva0~ zyM)@n&t9WJju$RO>m7Q-`OYrv)?M9)OQM0EX1)LZ{JpK48@!CQ>%9j$IUC$djfN8{ zWV#ap5o*A~+*>~7D(+44yJjL$`lkszvFZRXAk2m+Hi|%zV1RqXM`zWUXf3wtiBhAj z*T{d2kH6G8afNge1H5R~owQ}p6y2>zS%9f~w4=jtV6?;7gX?=PE0K9iE(=Xm(Z!}+ zE*VzFRL2#>9B(E>n@b+E{a&|Om`{J?k$IbmsnO6qPi6XX($8ULsLgDP7K1nd9uebi zmv8z_if{+`NnAC0Y^YB5q*RVg-jZW z4t+l1T@tbDtyr>ttW0$AP@r7dr`oL|O&-m^YE#eYH`epJ^L4+E3$~UR6mpc%?DoD` z@4`fRK1=~E=qs{o#!t(!e!ROA@Dk5<(=8Hnok4_bZ>V^sU}Y!1IZK-I*pdWV*e<9Oi{Me|aHYrREx&QSo*%~8iOhL+A+sw!}%%MOpb-M&IoT%QmHVqsXN zg@bOXDIFbWQ(&5W9|XpzU~>~z7HwBkRUe}Q8?aOtrhQ>l7bl*R%B~!InD$J}k#ms8 zk@wkf9kf(=T&L}G= zMPVfqh9ER;+VqB0wi-ggV5lm@%~<5U7QPbQbRoGnG?$n&R2HdsXrq#hMei4Q&vN1d zAXgpCB;oZ#d#^8*Td=$E$a4Z1CVKm);X`pg{a&!s%$ut^2M8=bNtLZEin+cWRvfP= z<)K*~!5v;q($`}NeN=l$lePBi#N9MDArP2M^->k_Yco7pam}h>rL|kM61@RND}e&@ zW=Si^0C>Hp!IHV!9UK5n^SN&+1?LI~gY>_nYv;z#fA={QKfupnVm*4N_8zUCXL?U42U@EdNKFZE#eFp_ z<^K#zF_9mbcVzBzr5)$yiY({m(U#Ol?n0U@8|-BfX(z85RHb!1QJ(<`!EMm!&C5*g zf;*d7>ITjje;i|teo(cn~(D#YfU8M|HsDubFpNvXnO!=wYZMD~rT+;%%T=&auO+b6SwxDv?k z?%{gzLpX7agzq1}{uQFw0{OAYK<=7K$-Ny@5PUQP-n^_^$Vb5Gm;4MP0n=__vg7jO zFeX_}Y8p)2D>vz%y|w*l%gmvu!)BmF3#(#$p5#BYC*xH)5LT4;7Jmj|HWWWtRI8r7 z^CCjh@e{)?NmNVfLhB==Hh8^_FZ_i^koW&NySCE5x^lueH<7qRS+$2?Qf6Aefe0Vp z?)4x}C3dftIcMUXqgu=$@^@z#{z~Bh`w-}wWk&{C8h?;?RU35<3J*i-{q_l@X+WK! zuH$S%(6dCQI(VVfzETg%=_x&i1T^`Q+70KZceL0DGr8lLr8 zG5^1uhz)q_o2HldzAvqgJw5kfI_073XH{TcI7lS4#KOcEZt72dy~odT`fgw03R1MO zm%2QJ3y~*yvzO$dUu^LK^yf)*EEl@N#@-4=6K(uRLIe;{*PX_1s+b1IvddoB3b!1jqi zC$rucgwPqxJG)OL71_%9eS^18qYG*#uQo3-JLf>&&Y95fWqLVg(+%-UC|f(cf#Z$m zcJahju+haHD6%kDhkFRh^QuNApfBN%0KNMXaxobunojV`yIl3(; zEB3ZiCD|kCNnk^&?si;NcNj!-y|IdQ@i?EbVA4JqwULHoqJb%YkMYVbwO3(_5Jc|B)_Oo4maJ9f1;{Ev)^xnh+0R z^8pU71f7Hapojhtr1+)cO8ohk_eCxCA5;GWv~~>1AKhXbBsT_L*89h6j&xO;FQ;$w5GRwh6c@+sFfET5$Z)Y z-V^hzF0Nx19@%N^Lfz?Zr4bF6!^9CCtg{Xc4csqlI5)q&R)5%#UeP@}z;xU2!okQ0 zR7jg54Lf|$f*G8gA+n4`ehh#dV*#zjEumr3T;NTFnFo}E#Op_so`AVM+IZ6ZH|CIH zw#`oE#M*6wccG5s6XM&yp0REGwGnbs@vM&*oeg!T?c3#>YIkN`&F8Tt*HH?PyV=;zx$4A44~fJVO1E>CPap#@(z9ywcno#gq? zt@B9H*wUpf)0%X z_}OvJ@!~$SolBmpk;V$u#-Dq?+Dq*o4c2+0ERAL}?GdE<5EI0~t(p#QrT*Ldk6|~q zb6!1-l0p&ZVv{G2Ad<+4rJFg#H*bsHT7mqPOyy=#2Zj13*v4AlLpcHIEa7O7iX47i zA=8zZB;3W2ChBmwPfaY|Ldl@E4WEb+R~6a{KTYDjm^)=CdPHSh`bMf~F*7Tq1ZrI9 zIt@6$T9Kk6rWZiGw~N_tytZ`3pn1__#SlwsZU((o90@A;v0=oLkp2sDhser_uQorY zX+o6J$5oKBvt{yLf_qr%0!Cx@0-^D0dcwYD8DUOFR4vqih3iH7@>QhEab>%DI1}^y z%A)5NaX4!QrZu$Zsn|th8-&&V%eZ951)**1+xxCSC*iK@+j z`kx1PH0v>--lzT`4$U{sjYq6Nz+hL+n4Ab8?gmHH7oajw8KgX@UG879C$yrZ06Zfc zbs4Eh(|s$H-(iJ~EwmcH;dH6z6;+qoKrN)WGtF-IE4B}&n^^o~Dim{|rs6b_FmtFq zJZ6+O1oBh+$53~S#W&-=>N0ti6iD@$(5g*;;AN{xhqg~I-%>*gK*XQ|_GU81PW3|h zo!77n>s+D8UgVZlNbG>^Y0yFOD}deJ2&4=%3W|{t2}80f&^_-Uq}D-BJ~@!3?5J1X z&RMMH!o{}sEl=R8Jp>sNDK>f(aciW@I8&!Rf)B z?Rg(JoDX0{1+<+TZ~STu-t5+s5IjaUp*sLlV?XXMmC?z#h2o}<+4bI_dJ%L7Tw}rT z$zJ<_ZEYL39uB(bOTQgSqv7JxpR3=UZo+9+>aK3R3{pp}y@5e7<7j zPEnHg9k9ICwA6zR&0T39Wjc(`4FbU~#`lo`_zYYK;LVXIfMiy+jR3v?W#aJ4O{Dzr z#Ix)VgN^XPXUdg>LM&$qs<+K*hRM-Q8j;o5(`Dz&-pvVZYneAp>)$KF+W`_|3_AAf z>m|@Ebds5!i5CVF8xFf%dYg5P#%S6KoS($!fb7~B+8j9Se8rwCQO4FWespuxVH6%D zBE>&3o=|IiGwfN+Q_0g<2kURtUidpO3vNs_w(DDgv5*^YG&kVBG^dOn+{4eHNKsaq z!;ba(|F8hcfnYpohgESSledoxOYqKX56lo0_S$CXW@;%1@+k2SwlRu2m`-zcHTqjF z@rS1Vk3_1#8n%$Zjv>T9bW5$$R7#!u3_AD*WtC4Wh2gd0`-i@G~Zn?BVR; z^;^3A4n>3?fL9g_{$S^+!d^U6BF5MKJWXaCB(D{r0@dG{42a6jb|%TCEE6zFvA5sa zf7by4(<@2i$f#>i<->G2y`zB7zI>1Qz8FEY1 zYwbS{6hGae?^JSV)^5qx_;6%8g@Ng@BK57)EM@WoA-6)iK^cTWUdI$` zp`8wf;nBNxAqyc=(mp(kHuU^zQugqkV~;(Ri+Tr#O91@)O_0?7=%iz<+mAuqbA@|P zr14_<2|WR?`{Pqd$MmGKo19!5y_M-Y^m~Ht8cesT(G#BpFoJ8w+tapf@F8`Iq~8sY zBjwXi=wPQV;Kxi}@6|SM5pS*+p>_R3qLpvGF_+Wh3cNR$6+G~X5k=_FL42Pq&Cp

?Q`3)+mN7Z)8JCE6~kV(P}^A!!a%k~+dkFv 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 literal 187434 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 diff --git a/docs/_static/sequence_generator_scheme.svg b/docs/_static/sequence_generator_scheme.svg index edb4a824..91e2be87 100644 --- a/docs/_static/sequence_generator_scheme.svg +++ b/docs/_static/sequence_generator_scheme.svg @@ -253,7 +253,7 @@ xml:space="preserve" id="flowRoot4017-5" style="font-size:10px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" - transform="matrix(0.89878529,-0.43838912,0.43838912,0.89878529,106.28345,270.94408)">transition.take_looktransition.take_glimpses Date: Sun, 1 Nov 2015 16:41:26 -0500 Subject: [PATCH 014/129] Improve apply_dropout documentation. --- blocks/graph.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/blocks/graph.py b/blocks/graph.py index 1989ad5e..7a2b8e38 100644 --- a/blocks/graph.py +++ b/blocks/graph.py @@ -533,8 +533,8 @@ def collect_parameters(computation_graph, parameters): def apply_dropout(computation_graph, variables, drop_prob, rng=None, - seed=None): """Returns a graph to variables in a computational graph. + """Apply dropout to specified variables in a graph. Parameters ---------- @@ -551,6 +551,12 @@ def apply_dropout(computation_graph, variables, drop_prob, rng=None, seed : int Random seed to be used if `rng` was not specified. + Returns + ------- + dropped_computation_graph : instance of :class:`ComputationGraph` + A new computation graph with dropout applied to the specified + variables. + Notes ----- For more information, see [DROPOUT]_. From d7d8b6200cd32d4922d27d76aeff3958f465e222 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Sun, 1 Nov 2015 16:44:00 -0500 Subject: [PATCH 015/129] apply_dropout: support a custom divisor. --- blocks/graph.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/blocks/graph.py b/blocks/graph.py index 7a2b8e38..861fd342 100644 --- a/blocks/graph.py +++ b/blocks/graph.py @@ -533,7 +533,7 @@ def collect_parameters(computation_graph, parameters): def apply_dropout(computation_graph, variables, drop_prob, rng=None, - """Returns a graph to variables in a computational graph. + seed=None, custom_divisor=None): """Apply dropout to specified variables in a graph. Parameters @@ -550,6 +550,11 @@ def apply_dropout(computation_graph, variables, drop_prob, rng=None, Random number generator. seed : int Random seed to be used if `rng` was not specified. + custom_divisor : float or None, optional + Divide dropped variables by a given scalar value. If `None`, + (default) dropped variables will be divided by `(1 - drop_prob)` + which is equivalent to scaling by `(1 - drop_prob)` at test + time as recommended in [DROPOUT]_. Returns ------- @@ -628,11 +633,14 @@ def apply_dropout(computation_graph, variables, drop_prob, rng=None, seed = config.default_seed if not rng: rng = MRG_RandomStreams(seed) - + if custom_divisor is None: + divisor = (1 - drop_prob) + else: + divisor = custom_divisor replacements = [(var, var * rng.binomial(var.shape, p=1 - drop_prob, dtype=theano.config.floatX) / - (1 - drop_prob)) + divisor) for var in variables] for variable, replacement in replacements: add_role(replacement, DROPOUT) From 07c98e28e05f24637ec15276929d0d5a556aaef3 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Sun, 1 Nov 2015 18:02:27 -0500 Subject: [PATCH 016/129] Add dropout tests, including custom_divisor. --- tests/test_graph.py | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/tests/test_graph.py b/tests/test_graph.py index 027640d5..0c8eb70c 100644 --- a/tests/test_graph.py +++ b/tests/test_graph.py @@ -8,7 +8,8 @@ from blocks.bricks import MLP, Identity, Logistic from blocks.bricks.cost import SquaredError from blocks.filter import VariableFilter -from blocks.graph import apply_noise, collect_parameters, ComputationGraph +from blocks.graph import (apply_dropout, apply_noise, collect_parameters, + ComputationGraph) from blocks.initialization import Constant from blocks.roles import add_role, COLLECTED, PARAMETER, AUXILIARY from tests.bricks.test_bricks import TestBrick @@ -140,6 +141,36 @@ def test_apply_noise(): 2 + MRG_RandomStreams(1).normal(tuple()).eval()) +def test_apply_dropout(): + x = tensor.vector() + y = tensor.vector() + z = x * y + cg = ComputationGraph([z]) + dropped_cg = apply_dropout(cg, [x], 0.4, seed=1) + + x_ = numpy.array([5., 6., 7.], dtype=theano.config.floatX) + y_ = numpy.array([1., 2., 3.], dtype=theano.config.floatX) + + assert_allclose( + dropped_cg.outputs[0].eval({x: x_, y: y_}), + x_ * y_ * MRG_RandomStreams(1).binomial((3,), p=0.6).eval() / 0.6) + + +def test_apply_dropout_custom_divisor(): + x = tensor.vector() + y = tensor.vector() + z = x - y + cg = ComputationGraph([z]) + scaled_dropped_cg = apply_dropout(cg, [y], 0.8, seed=2, custom_divisor=2.5) + + x_ = numpy.array([9., 8., 9.], dtype=theano.config.floatX) + y_ = numpy.array([4., 5., 6.], dtype=theano.config.floatX) + + assert_allclose( + scaled_dropped_cg.outputs[0].eval({x: x_, y: y_}), + x_ - (y_ * MRG_RandomStreams(2).binomial((3,), p=0.2).eval() / 2.5)) + + def test_snapshot(): x = tensor.matrix('x') linear = MLP([Identity(), Identity()], [10, 10, 10], From c4426c3b1bd71329e7284415bd1802f5fc1957fd Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Mon, 2 Nov 2015 14:39:28 -0500 Subject: [PATCH 017/129] Notes on dropout usage. --- blocks/graph.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/blocks/graph.py b/blocks/graph.py index 861fd342..f0337c38 100644 --- a/blocks/graph.py +++ b/blocks/graph.py @@ -560,7 +560,9 @@ def apply_dropout(computation_graph, variables, drop_prob, rng=None, ------- dropped_computation_graph : instance of :class:`ComputationGraph` A new computation graph with dropout applied to the specified - variables. + variables. In order to train with, or monitor, the outputs + of the original computation graph with dropout applies, use + the variables contained in `dropped_computation_graph.outputs`. Notes ----- From e185f3d26c7432f9ab5cb59c3b7f037092a5b9d1 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Wed, 4 Nov 2015 13:56:33 -0500 Subject: [PATCH 018/129] Hardcode a prefix for Travis Miniconda install. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c29e0354..8b2e0ad7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,7 +25,7 @@ before_install: - # Setup Python environment with BLAS libraries - wget -q http://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh - chmod +x miniconda.sh - - ./miniconda.sh -b + - ./miniconda.sh -b -p $HOME/miniconda - export PATH=$HOME/miniconda/bin:$PATH - conda update -q --yes conda - export FUEL_DATA_PATH=$TRAVIS_BUILD_DIR/data From dbb407cc6a8916fc04b9c76e02b030ad2c4f0481 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Mon, 2 Nov 2015 16:27:39 -0500 Subject: [PATCH 019/129] Refactor MaxPooling. Pull out most of the logic from MaxPooling and put it in Pooling so that I can reuse it for AveragePooling and SumPooling. The new base Pooling class contains some properties that can modify input_dim, in order to mimic the interface of Convolutional and Convolutional{Activation,Layer} bricks. It also provides a more complete access to the various arguments of max_pool_2d. --- blocks/bricks/conv.py | 98 +++++++++++++++++++++++++++++++++---------- 1 file changed, 75 insertions(+), 23 deletions(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index 33a9728d..7e800ee5 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -163,30 +163,39 @@ def get_dim(self, name): return super(Convolutional, self).get_dim(name) -class MaxPooling(Initializable, Feedforward): - """Max pooling layer. +class Pooling(Initializable, Feedforward): + """Base Brick for pooling operations. - Parameters - ---------- - pooling_size : tuple - The height and width of the pooling region i.e. this is the factor - by which your input's last two dimensions will be downscaled. - step : tuple, optional - The vertical and horizontal shift (stride) between pooling regions. - By default this is equal to `pooling_size`. Setting this to a lower - number results in overlapping pooling regions. - input_dim : tuple, optional - A tuple of integers representing the shape of the input. The last - two dimensions will be used to calculate the output dimension. + This should generally not be instantiated directly; see + :class:`MaxPooling`. """ - @lazy(allocation=['pooling_size']) - def __init__(self, pooling_size, step=None, input_dim=None, **kwargs): - super(MaxPooling, self).__init__(**kwargs) - - self.input_dim = input_dim + @lazy(allocation=['mode', 'pooling_size']) + def __init__(self, mode, pooling_size, step=None, input_dim=None, + ignore_border=False, padding=(0, 0), **kwargs): + super(Pooling, self).__init__(**kwargs) self.pooling_size = pooling_size + self.mode = mode self.step = step + self.input_dim = input_dim if input_dim is not None else (None,) * 3 + self.ignore_border = ignore_border + self.padding = padding + + @property + def image_size(self): + return self.input_dim[-2:] + + @image_size.setter + def image_size(self, value): + self.input_dim = self.input_dim[:-2] + value + + @property + def num_channels(self): + return self.input_dim[0] + + @num_channels.setter + def num_channels(self, value): + self.input_dim = (value,) + self.input_dim[1:] @application(inputs=['input_'], outputs=['output']) def apply(self, input_): @@ -207,16 +216,59 @@ def apply(self, input_): with the last two dimensions downsampled. """ - output = max_pool_2d(input_, self.pooling_size, st=self.step) + output = max_pool_2d(input_, self.pooling_size, st=self.step, + mode=self.mode, padding=self.padding, + ignore_border=self.ignore_border) return output def get_dim(self, name): if name == 'input_': return self.input_dim if name == 'output': - return tuple(DownsampleFactorMax.out_shape(self.input_dim, - self.pooling_size, - st=self.step)) + return tuple(DownsampleFactorMax.out_shape( + self.input_dim, self.pooling_size, st=self.step, + ignore_border=self.ignore_border, padding=self.padding)) + + +class MaxPooling(Pooling): + """Max pooling layer. + + Parameters + ---------- + pooling_size : tuple + The height and width of the pooling region i.e. this is the factor + by which your input's last two dimensions will be downscaled. + step : tuple, optional + The vertical and horizontal shift (stride) between pooling regions. + By default this is equal to `pooling_size`. Setting this to a lower + number results in overlapping pooling regions. + input_dim : tuple, optional + A tuple of integers representing the shape of the input. The last + two dimensions will be used to calculate the output dimension. + padding : tuple, optional + A tuple of integers representing the vertical and horizontal + zero-padding to be applied to each of the top and bottom + (vertical) and left and right (horizontal) edges. For example, + an argument of (4, 3) will apply 4 pixels of padding to the + top edge, 4 pixels of padding to the bottom edge, and 3 pixels + each for the left and right edge. By default, no padding is + performed. + ignore_border : bool, optional + Whether or not to do partial downsampling based on borders where + the extent of the pooling region reaches beyond the edge of the + image. If `True`, a (5, 5) image with (2, 2) pooling regions + and (2, 2) step will be downsampled to shape (2, 2), otherwise + it will be downsampled to (3, 3). `False` by default. + + """ + @lazy(allocation=['pooling_size']) + def __init__(self, pooling_size, step=None, input_dim=None, + ignore_border=False, padding=(0, 0), + **kwargs): + super(MaxPooling, self).__init__('max', pooling_size, + step=step, input_dim=input_dim, + ignore_border=ignore_border, + padding=padding, **kwargs) class _AllocationMixin(object): From ac9f09583b1382f46186bf4b53f38454ac32ca28 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Mon, 2 Nov 2015 16:28:50 -0500 Subject: [PATCH 020/129] ConvolutionalSequence: use num_output_channels. Define a property num_output_channels, which is really the more appropriate thing to be querying within ConvolutionalSequence to define the geometry of the input image. This change, along with the previous commit, make MaxPooling a first-class citizen within a ConvolutionalSequence. (The num_channels and image_size properties are kind of ugly for now but they get the job done, pending any revisiting of the constructor arguments.) --- blocks/bricks/conv.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index 7e800ee5..1d1c0c60 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -162,6 +162,11 @@ def get_dim(self, name): self.step, self.border_mode)) return super(Convolutional, self).get_dim(name) + @property + def num_output_channels(self): + return self.num_filters + + class Pooling(Initializable, Feedforward): """Base Brick for pooling operations. @@ -229,6 +234,10 @@ def get_dim(self, name): self.input_dim, self.pooling_size, st=self.step, ignore_border=self.ignore_border, padding=self.padding)) + @property + def num_output_channels(self): + return self.input_dim[0] + class MaxPooling(Pooling): """Max pooling layer. @@ -278,6 +287,14 @@ def _push_allocation_config(self): 'tied_biases', 'use_bias']: setattr(self.convolution, attr, getattr(self, attr)) + @property + def num_output_channels(self): + # Assumes an elementwise activation function. Would need to + # change to support e.g. maxout, but that would also require + # a way of querying the activation function for this kind of + # information. + return self.num_filters + class ConvolutionalActivation(_AllocationMixin, Sequence, Initializable): """A convolution followed by an activation function. @@ -478,7 +495,7 @@ def _push_allocation_config(self): if layer.image_size is not None: output_shape = layer.get_dim('output') image_size = output_shape[1:] - num_channels = layer.num_filters + num_channels = layer.num_output_channels class Flattener(Brick): From f1e5908687ada867f08e96abca29249d40ff9cbc Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Mon, 2 Nov 2015 16:54:14 -0500 Subject: [PATCH 021/129] AveragePooling Brick. --- blocks/bricks/conv.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index 1d1c0c60..19b3361b 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -167,7 +167,6 @@ def num_output_channels(self): return self.num_filters - class Pooling(Initializable, Feedforward): """Base Brick for pooling operations. @@ -280,6 +279,34 @@ def __init__(self, pooling_size, step=None, input_dim=None, padding=padding, **kwargs) +class AveragePooling(Pooling): + """Average pooling layer. + + Parameters + ---------- + include_padding : bool, optional + When calculating an average, include zeros that are the + result of zero padding added by the `padding` argument. + A value of `True` is only accepted if `ignore_border` + is also `True`. `False` by default. + + Notes + ----- + For documentation on the remainder of the arguments to this + class, see :class:`MaxPooling`. + + """ + @lazy(allocation=['pooling_size']) + def __init__(self, pooling_size, step=None, input_dim=None, + ignore_border=False, padding=(0, 0), + include_padding=False, **kwargs): + mode = 'average_inc_pad' if include_padding else 'average_exc_pad' + super(AveragePooling, self).__init__(mode, pooling_size, + step=step, input_dim=input_dim, + ignore_border=ignore_border, + padding=padding, **kwargs) + + class _AllocationMixin(object): def _push_allocation_config(self): for attr in ['filter_size', 'num_filters', 'border_mode', From 27d71a568d5318ec15f791af101193034948e8c2 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Mon, 2 Nov 2015 18:07:59 -0500 Subject: [PATCH 022/129] Tests for AveragePooling, new MaxPooling flags. --- tests/bricks/test_conv.py | 60 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/tests/bricks/test_conv.py b/tests/bricks/test_conv.py index 554bed01..2363446e 100644 --- a/tests/bricks/test_conv.py +++ b/tests/bricks/test_conv.py @@ -8,7 +8,8 @@ from blocks.bricks import Rectifier from blocks.bricks.conv import (Convolutional, ConvolutionalLayer, MaxPooling, - ConvolutionalActivation, ConvolutionalSequence) + AveragePooling, ConvolutionalActivation, + ConvolutionalSequence) from blocks.initialization import Constant from blocks.graph import ComputationGraph @@ -124,6 +125,63 @@ def test_max_pooling(): y_size / pool_size + 1) +def test_max_pooling_ignore_border_true(): + x = tensor.tensor4('x') + brick = MaxPooling((3, 4), ignore_border=True) + y = brick.apply(x) + out = y.eval({x: numpy.zeros((8, 3, 10, 13), dtype=theano.config.floatX)}) + assert out.shape == (8, 3, 3, 3) + + +def test_max_pooling_ignore_border_false(): + x = tensor.tensor4('x') + brick = MaxPooling((5, 7), ignore_border=False) + y = brick.apply(x) + out = y.eval({x: numpy.zeros((4, 6, 12, 15), dtype=theano.config.floatX)}) + assert out.shape == (4, 6, 3, 3) + + +def test_max_pooling_padding(): + x = tensor.tensor4('x') + brick = MaxPooling((6, 2), padding=(3, 1), ignore_border=True) + y = brick.apply(x) + out = y.eval({x: numpy.zeros((2, 3, 6, 10), dtype=theano.config.floatX)}) + assert out.shape == (2, 3, 2, 6) + + +def test_average_pooling(): + x = tensor.tensor4('x') + brick = AveragePooling((2, 2)) + y = brick.apply(x) + tmp = numpy.arange(16, dtype=theano.config.floatX).reshape(1, 1, 4, 4) + x_ = numpy.tile(tmp, [2, 3, 1, 1]) + out = y.eval({x: x_}) + assert_allclose( + out - numpy.array([[10 / 4., 18 / 4.], [42 / 4., 50 / 4.]]), + numpy.zeros_like(out)) + + +def test_average_pooling_inc_padding(): + x = tensor.tensor4('x') + brick = AveragePooling((2, 2), ignore_border=True, padding=(1, 1), + include_padding=True) + y = brick.apply(x) + output = y.eval({x: 3 * numpy.ones((1, 1, 2, 2), + dtype=theano.config.floatX)}) + expected_out = numpy.array([0.75, 0.75, 0.75, 0.75]).reshape(1, 1, 2, 2) + assert_allclose(expected_out, output) + + +def test_average_pooling_exc_padding(): + x = tensor.tensor4('x') + brick = AveragePooling((2, 2), ignore_border=True, padding=(1, 1), + include_padding=False) + y = brick.apply(x) + x_ = 3 * numpy.ones((1, 1, 2, 2), dtype=theano.config.floatX) + output = y.eval({x: x_}) + assert_allclose(x_, output) + + def test_convolutional_layer(): x = tensor.tensor4('x') num_channels = 4 From c37455778e728efcfeae90238f781ecf7c7cde40 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Mon, 2 Nov 2015 18:55:40 -0500 Subject: [PATCH 023/129] Test Pooling Bricks work in ConvolutionalSequence. --- tests/bricks/test_conv.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/bricks/test_conv.py b/tests/bricks/test_conv.py index 2363446e..3a62da92 100644 --- a/tests/bricks/test_conv.py +++ b/tests/bricks/test_conv.py @@ -182,6 +182,18 @@ def test_average_pooling_exc_padding(): assert_allclose(x_, output) +def test_pooling_works_in_convolutional_sequence(): + x = tensor.tensor4('x') + brick = ConvolutionalSequence([AveragePooling((2, 2), step=(2, 2)), + MaxPooling((4, 4), step=(2, 2), + ignore_border=True)], + image_size=(16, 32), num_channels=3) + brick.allocate() + y = brick.apply(x) + out = y.eval({x: numpy.empty((2, 3, 16, 32), dtype=theano.config.floatX)}) + assert out.shape == (2, 3, 3, 7) + + def test_convolutional_layer(): x = tensor.tensor4('x') num_channels = 4 From b87ad2eab6d9f106dbde61e0735af1c333cbc5dd Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Wed, 4 Nov 2015 12:23:08 -0500 Subject: [PATCH 024/129] Make ignore_border=True the default. Also document how bad an idea ignore_border=False can be for GPU throughput, and change relevant tests. --- blocks/bricks/conv.py | 24 +++++++++++++++++++----- tests/bricks/test_conv.py | 8 ++++---- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index 19b3361b..fc987b98 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -175,8 +175,8 @@ class Pooling(Initializable, Feedforward): """ @lazy(allocation=['mode', 'pooling_size']) - def __init__(self, mode, pooling_size, step=None, input_dim=None, - ignore_border=False, padding=(0, 0), **kwargs): + def __init__(self, mode, pooling_size, step, input_dim, ignore_border, + padding, **kwargs): super(Pooling, self).__init__(**kwargs) self.pooling_size = pooling_size self.mode = mode @@ -266,12 +266,26 @@ class MaxPooling(Pooling): the extent of the pooling region reaches beyond the edge of the image. If `True`, a (5, 5) image with (2, 2) pooling regions and (2, 2) step will be downsampled to shape (2, 2), otherwise - it will be downsampled to (3, 3). `False` by default. + it will be downsampled to (3, 3). `True` by default. + + Notes + ----- + .. warning:: + As of this writing, setting `ignore_border` to `False` with a step + not equal to the pooling size will force Theano to perform pooling + computations on CPU rather than GPU, even if you have specified + a GPU as your computation device. Additionally, Theano will only + use [cuDNN]_ (if available) for pooling computations with + `ignure_border` set to `True`. You can ensure that the entire + input is captured by at least one pool by using the `padding` + argument to add zero padding prior to pooling being performed. + + .. [cuDNN]: `NVIDIA cuDNN `_. """ @lazy(allocation=['pooling_size']) def __init__(self, pooling_size, step=None, input_dim=None, - ignore_border=False, padding=(0, 0), + ignore_border=True, padding=(0, 0), **kwargs): super(MaxPooling, self).__init__('max', pooling_size, step=step, input_dim=input_dim, @@ -298,7 +312,7 @@ class AveragePooling(Pooling): """ @lazy(allocation=['pooling_size']) def __init__(self, pooling_size, step=None, input_dim=None, - ignore_border=False, padding=(0, 0), + ignore_border=True, padding=(0, 0), include_padding=False, **kwargs): mode = 'average_inc_pad' if include_padding else 'average_exc_pad' super(AveragePooling, self).__init__(mode, pooling_size, diff --git a/tests/bricks/test_conv.py b/tests/bricks/test_conv.py index 3a62da92..907ddbb8 100644 --- a/tests/bricks/test_conv.py +++ b/tests/bricks/test_conv.py @@ -118,8 +118,8 @@ def test_max_pooling(): dtype=theano.config.floatX) assert_allclose(func(x_val), numpy.ones((batch_size, num_channels, - x_size / pool_size + 1, - y_size / pool_size + 1))) + x_size / pool_size, + y_size / pool_size))) pool.input_dim = (x_size, y_size) pool.get_dim('output') == (num_channels, x_size / pool_size + 1, y_size / pool_size + 1) @@ -217,7 +217,7 @@ def test_convolutional_layer(): x_val = numpy.ones((batch_size, num_channels, 17, 13), dtype=theano.config.floatX) assert_allclose(func(x_val), numpy.prod(filter_size) * num_channels * - numpy.ones((batch_size, num_filters, 5, 4)) + 5) + numpy.ones((batch_size, num_filters, 5, 3)) + 5) assert_equal(conv.convolution.batch_size, batch_size) assert_equal(conv.pooling.batch_size, batch_size) @@ -248,7 +248,7 @@ def test_convolutional_sequence(): func = function([x], y) x_val = numpy.ones((batch_size, 4, 17, 13), dtype=theano.config.floatX) - y_val = (numpy.ones((batch_size, 4, 4, 3)) * + y_val = (numpy.ones((batch_size, 4, 4, 2)) * (9 * 4 + 5) * 4 * 5) assert_allclose(func(x_val), y_val) From 7576bcc173e0dd2090bc7bd1880f290d7da85bcb Mon Sep 17 00:00:00 2001 From: dima Date: Thu, 5 Nov 2015 22:57:22 +0400 Subject: [PATCH 025/129] Add API sections for two log backends --- docs/api/log.rst | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/api/log.rst b/docs/api/log.rst index ba1d4e62..916f46bd 100644 --- a/docs/api/log.rst +++ b/docs/api/log.rst @@ -3,7 +3,26 @@ Logging ======= +Log has two different backends configurable in ``.blocksrc``, +see :doc:`../configuration`. + .. automodule:: blocks.log :members: :undoc-members: :show-inheritance: + +Dictionary backend +------------------ + +.. automodule:: blocks.log.log + :members: + :undoc-members: + :show-inheritance: + +Sqlite backend +-------------- + +.. automodule:: blocks.log.sqlite + :members: + :undoc-members: + :show-inheritance: From 7734be3045c8aea22387bad800799b410824198e Mon Sep 17 00:00:00 2001 From: Anton Bakhtin Date: Fri, 6 Nov 2015 18:10:45 +0300 Subject: [PATCH 026/129] Increase font size in the generator scheme --- docs/_static/sequence_generator_scheme.png | Bin 186668 -> 189314 bytes docs/_static/sequence_generator_scheme.svg | 22 ++++++++++----------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/_static/sequence_generator_scheme.png b/docs/_static/sequence_generator_scheme.png index 73f90b1b9cd3780f33bb1655c8a38f8e8f498068..956717d8504fa27f2fe57ba01ccaa44c4787ef2c 100644 GIT binary patch literal 189314 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

o@q^os+E|2=B#0=(S||a+Zkc&x3BeV z8o2RHfK8hPY+B44b`$b1KD>VbpaNbZC4kWVo@|XzNGZE4UT|M55WHbans20q3tyxd zIYN?2(e-}}=^I<5M;Do{Z>m`24v;_GPigi^SsOyBzlNQKIZ3aO6D^wc5{Zt{-maZV zix}JAWs}#{B6VwW2L*sN0#!V)D8_xRzza)WJH@J^~9&=jN8W}qBs(DB0B;n#WSJ4hsvavgVKc_%Mw^4u70-6xU0c=2fm`n3|O zg^Xu3YokiuU^t=X#q6e?qCk390g#gy-AK+vxj+GhURH7qeFD8c=%M=z^=7PQle(}F zyXd4R0_;LoiJ7Dm0`WxDm~98x`}JAuseM({CgBdya^4#CFG>RF?{!jz6Qg!3q5+q5 zl@s=N=sOlWUP*DkK2Zu`!dypJh=#6aCQDQVfy>W;x%4pkk}f$4hnMpf~$7|tq-%Oe}HsOoG zTL8Ef`)KsH%Ifs6=UvMldgQlzFh$Vx!{2gDp&6=^JcAYjaGldre1M`azimMMS*M?m zDU9Ksm8L6e#bu}qD1)J!InOQPjA44k39R&cfaJm}IU@ts{nnCd8P=mtv>tjw7C~D= zk(Sj?llDM+x9hqTN7A-hr@HU^pP+#6>cbQvzq!scD42Q|Qrv-x$?544wX|mW4XCT^ z!aCOEfQDj}8Jm7_+hC$-xyGWMA2Y5_w>yYw$UcvU=YX-R>+XMKLU{1MXNMy%9hGdW``{Gqprrrt_0N%RBZwke^vt+7W+!F1dOwq26V>vBLsz6T}Z; zh~-;z5jWsmrof-!iDY>&i~~w36U<@OW!L3=YdG@y4r#(fn^P<6QRy5Ob_%PZ1&DA! zRR_yEy;8a8;?)f#*7-NSQLnUiG6x|Dj?BkIin8BjU@vA566QM3cs?M)4QWJi$psZR zsa^mE6i0~O55E#E2SoCeTyF*|Ah*Oj{wlv}Sk#$)*?P6W%Nv{|_bNDzk+6x?&`j*U zK6R=4f~3*#1pxPOU$n*m#XuEP$y-5QkU$XtzUuh0*O+4TIgjEVr5^e(C=;Bqw(57l zF28)l!gt)25XNx^ssBXQ*p@Z_N1b?k4)|enrH!EeF%oGB-{Gax9?l+ABg7EM9ci(qOkvo=VVkm8*L zmt5kX-^m1Tf_kDski+wm3xrI7Ux>BFY>mhuLwca|4CcnwIT`il!G(bFhVR(OYeXKI zI2plr_~%J_DOrbQG}l$*>yn6=rNghnMBttz#CukCbz`Iy!~vNzfxSVDB|~L2|() z%Mfgh2bF~Q-1-Vof8s@TLUS7pz6s(*g~kApIr{CCE7yWKB26ZJJsBd}NSn}%C?d}r zPycgiKUl`&mS4b=JR)gt<#Oa)576OVzwqXA_dYQ8i>g^0(bC)409KYZE-jum0;Nsx zV+3#+Aki$5FCV2+%CYUTRA@4|b8;|abG(UDg|!X;*93GVlmIPPZx?bRpZsdyS{oOV zns%<3fF%54rh6mKcWe~=9VI6+%V8J%Yr=aayw5H;;bQdCtj}Lr(ZfUXTPJtH;LUdRrVds8K zScgPM#Wq)YGp~X6NCp4v2F*TT$xqu9&PlFJQ0KnLMW4j)0+NS%<%f?rkN&xCE{X zYaOJIb;JkDr|U-4B8U6-%1`bYIl`^|Qq$LOpi0~ht}TFJD$1~;b&9XC;krvd>X(E< z|CG4>L#Bo3=#DQnZT^v82-5lRmgJPr=wX^L;Y4lZ69@Ihn|1U16LrSGdh~W-+y{SG z5rdxR5L&;`XCv|+%}TNM!5KNiwWa0dvUQObfsCzTI3n8+y2H#-FtlqzW{%zT9}p4j zK#*p(J0;7UXUx%yca;i^x?F=lYBUw+Y~~j7Y`7h3U>EtYuD6P|?{iCkv*Z%v2ow>h zA`Ab@^Pj|WVkUTx&m96B(I%_ngFgMsQ~i=DzF1xCW z3%UHVws`nZm_UQb5bGd)%p5m+{uf}Zi^Avmj!W+}16rl5pL_Ivkm;&2!8EV@yvCKAlQFOXFb8)%e48W%_e9T4B`DQ&iDDz+e|2{X_fmCmPxkWM9 zu2Y_cJp=Sv8W=n4(^O^T$Pq0EiYE3c!eFl(%C}sc8&&dH?XbxB2Ln$(pFm1hDqSB|Z4nU-V*K;#SU&0Sbl9{d{ZPl4?S zAq8-_!9Xb^6nJUa#j56&)eeYMsefx$+l(Y%($Wu7NGOMhK(DZg*m2Nwsg+%lgYVU^ z_z@|m0s5=ObO1;Yh@Ww0xNU{|*B#kNM7z!kuU#FW_{{|f;n9wM2@|mMW3t(DbD^MD zu}*q?NIHOZZyhPJ+4-f%dmJ5vlInyE72!NF%(^D`Z*&Hk5wyMjPyzYOo0+v656=21 zsJ3q|p&lgPq&Wih8rzR<2HmvPRt!)Aw0g1!;Zix1h2}TzuH zk%nIiSVt~5)KUdhtHZkZYpfYELYZyv8s#G?;Enu0qQfl&8wud%@yhbTNF4M6yJUW% z-3KY&7hbz>ck;3{@#&o1Fw)D~H*XINJvsM+ewgO_=JirgI>%C(4l6!7dWX|1gR#{J zPq^j7iki)ytP7Z4-d`hG`f2SS57b^MZ}dovkJpq(%XKOhH7g{1`9z?V-1+c-T!6$9 zA9!q~ZrR6`=>%D5E_({+QAqi#FPDas@s(p8^u-M$5#3uVrdiG4T`@iMoZyZ_y}~U2 zplrGg*nh6=&Qx3lQf#>QN1>~UbHn$(8~u#0A16tDt0$#L@Wc~@SB1MUDHz*@gU6sR ze0Cp*wJjX&M~wtw&2dE_iIQroq#Xs<8mIr(C=|G<41k>6 z5h^I!>m2atyiH7)Q62s^gL?KS)BMTUcJ zfJ5PzJB9!Ny-GQ2%3P1enHRTh!YA03DjBA(Rl%A_U+4^M!FoJU?_d;<2>cl2#jvo_ zh4wS77qHY!3All`5F{!5y^|~A$Si7%%r!+YmCO;BtxyKn;EX7Utyrv4xX+kg4;RAm z-;2BmUiErsze#z@V^*5rYBmG)q3%Z}zY1=;ZL%mpAgRF-1|5U>wT?}KT3_j^tS@AN z{@^zo!jh5Cpfd(C03=?_z}!u-N?y4Wt1+OSK~h{}P1VS-eH5=IRmm+U+Ugd(rPR4O znYiQeSrNIMXV*~yzrd3OV-b!+su>GnZHW;qN%;Rh0ZDQv)T*omn;Pw{ff3`%n;#6V z3=K;jue+H_@7t1Lgb+m^o8lkKrK%)w)Cw!+v_LXh3d@VDKgaN~r>MN8TM@8a^cgT6c9fGVAi@w4N$|$nDYy<2e6~HXUhsdC1E5$4MD^C@;??@r+ ze>)E6T=xuXHl+LA7u*xV z-+M<0^IO8cJjx>-3be&wPS%p70g!g-m^(mx7yl>u8ggje&aVU6xDQZxEV~k0jMr|g zdYq#;G5~799+D?(R{@e}Zg4t@Q3K?fu6oeP5RYkELV+dC-;C^O^o*b7W_>4sS!M7J zuk6~FE#`#yS0DvOpN$x0y5_3LCTNk>Nb+^dxf4ulFb2YsYWYprwf2oQ`6B8Ptv{3H z@WjXK{SiiBw&l?(rs{i3Ah!H2j0N>(eiPRmF=dx2)!;gDvEBDqDzxjgg!92;Zbdpr z3mA(>7BsrQV7anD)WrYOy57G)ltg+}TQn>v!jlA7%BwBf_Kf`{G;svE3zLU&Tkp)K zvW2iOaqRcdo7Lll7nc*}W9(^FVw0?u#Oq1_XA_Q|K$1BDW~5^?;&qkX|E25?{` z62v8mIE7sUFk%sw8{4dK-yaNiK}Xv7L5@1gY4YTM2xIU7C?8C+Xg#I%?Z=foV1GJW>jo59ho0BNO3i`) za^TaUdPZo=nvmcvBu$G3qizl!aXAe*e1T$9(jPyAEJZGW+<^~L#b9lV)H=_KcENw{ zgh$SQ_O#bbwu}GQMWjLi2hU5Mls!bjMyEN+)&1`>bBZycwde>!G1{$w=T0eWj&#`{=egjz!HNI30tlTjBe<@1+v}!_U_Y0 z4_|q_L;iY_yKn<%gRs^i5$<1JyYGMp5%crLMe=PzMH_1|@o!n^C-`YTR)aW64Yf3u zIq9w+DB#>NB1x6VH_~O%?topdRp8eZLG~xRE3{o_x_E~5wq9@=t6;g&;HQ%MpV(%Y z;W^+^MA`59&@=YB>+ZChG(l>8|6w;OzE;cY)`C1ZXMJn@Z(E!)Tz)vm!Ts-E{@^`* zH~xm&?*Bk6#((>(!YRuO8qks8Bcyu%PYn|>ju(() zhI7KP&`O!Jhqd^$I_X5<9?%?UGWfWW9H&3oMuFaz|2}N?FOX1Kv?XzBz&UJ3ibi>^ zgH6`I=Kgo|Ln6SJuTK~wqgwd(q*k;l9|GJ{#Le)bi-PdXIQLKAb1dPTX2Db7cLaIb zYJ`H}#~k2+oP@>_Wq(xEGHjv+=!$r@V+W&z4+U~m9;v(_hh$!(R`d(sFqE&i+Z2EN z-vNEO|L3st+|z1L%5k;ot}M;3XqmcXe#ZLxrM^MD(=($~gSPh5PA7`O^^ z^1YIs39XK{1eW;TC%P7L6Slz0yZ--jm)Db~1{sQg)Q6&3==@DtFD**bL z9ficOMTvzaP#ULEC^?#->4UwY5m-`2T`QE+)VZIY|G#A1BKqPO6g;x$No^)^LC(*9 z!#`zKQ%8xcOA5-F-|3|7xEDt=sWsyPtNXY5hG}}25_-Zj>BkoAADrjXAbztjkrFtcR zqjUkpFojO0Gy&hZ#ck{))IBdMU`KLAVFgJI1t-vcY+Kc9y1fI@^e3K>o_1oLWOT+N zw=ClcMe;`tU~O07E!bl`cAq-KlQOOVzd_Fg`A_VDFyD>GI2VK;TB)Al1hymq?*LT- zy0Hvv;e7!qJ-BypNZ#OHe)dq#@wo`pX(adbg61DtF&-HNfW{qG^C5Lp{>A&aL4|}W zdAaP9=zi84;Pz&j=5o<4lrqp6Vv0P26(EO$;pgW_nw1QO?9YW0Xl2u;%uQ$q+y^df z+afG+b2kln%Q&l%Lxcx&?SBc%9F`c&%41S%qE8jz!>-W$O{LcWMH4wvIRKGqeEB0A z&-ZlQ1$8)3rr=0tCgJDMdvYddDb)-b$zk-}-M=xih(>Y@F|B8-%XR8!@#m~IuYsl_ zMg1Zk?e7}XtHph?K)Ap<2|58l?gEUYMKn18J7ITUxRnRPjd8S>WMU~xp0|^480()z z%l1)wF??sP>8gn~us5_cj^$MJ4M@)!khcln%UU5ZSCQQnm(X&x^^1-RiDx~=hhr=# z*@UAS@U`ea#(mn3bt;UEMHj3@aZArbNTl`71%0Kto3!h|Z%b0yX(?9Tc^+!v_z8S8|8oE{X=;J)hazHPJ-VmpL!$@s^qdb64HF-`v`v$9kW`urgjz(2y< z{48JV*kpd8` z@6i6ev8vkY+rnFH)GObBmOo@=KAU2;c7i!X}9rJR(tb7s|+K9nnpChP2#x7MOYjmmI`1y472j%igZL9JGma43TZ7n z|0n5oONQlbx>s4*t4n?OYb;orstMIZItvbQ4y96lOq(Dbt&3*@0!eNgE_e>uGGw5r zR_U6QQ(45&y(MnuVC^e(0RAZPdM#D5L2BqJCE}Jl4TsstHec9Iw_OLnyv#Y?u^yrZ zNrlYVocbP6$?&M)6xF><86j8T>~V=$A#5((*ERyPjE=Me-od&gmHFhJ>dGA?_lTrz z=v9`L2c1NLc99%5p5&Ia%&CMHJIFYKVVBPATW2bT0|n*Ku_~Y?R?}@B)kdT}JJUkj z@qNWe<;^pJ;st)66v<^I_qj!_{2Am(7DdyI3?(EgYubcNALEPC*YVDi(v}($8RFVP zcUAq7%&dQ34gyMukNv_+OPk`E!4kd+QzVViNpA;1`LH~aY)aN9Hxgv`8n0ITrMYs} zezm!=wFe|4Q#B$IiQfqt_PHE6kPzaYzCL?cGNpW)Klp>Nby0D4-x_(5q;C}jVDR3a zn_m}xeR?@~%jk~_6Yj9+v~_+Z2)SHn*SlmoS0DL^_!(=46<7UMqi!O0@Le(L7nc)VFZ=%5z^(cAg)V}0gz1<$zXv{i z3W8+@o!wa~-CKrX3Jp0@ZUDB$I00I<3sE-NQC~5mP1iQgO5l$c1g%C(pv<+Ik}C(n z&}jGmMJ3w4-TO^NLD{e^?sm^Hh;Mkx8N`9k5) zyP*$_a+w3>b>Vf1t*z`$PS3_JGN{{RB?31{VF4s0KK`01%U;ah!4D8+&xCL|RPgEZ zUO%`;p)Ur17+FTe2|*P)QG*;KL{I~>y(>T&bt>KwU*mTI=}huW7AnZOuW=h!p_v`< zqDwPtK=Hs{!(3Fw@UQ+_{~Mhj-h2%9#E|@*>lM77U7l?0)mX+j*K18p)ZH0V$dUv9 z9ID1Y9{p)rv2XC!+0s4FFbuQ%v$5p^BTgIV;i&iY!wCi0nau9Zzq)M9E3$%JD_jI` zm6yhhdw(bl4uDGLt$o1GG;L`+!5WItW84}GAyrEusJp>gZ0|hQUKIwf*$Q^2iThWK z9HZ3wiv&9LHQouCkzD9!eoj>@iyWJlGGE|;eO3eet(tSxu5Q2a*=lo0IJKht2Lh;* zEB@Yrvjg<=HE;J1nEvkT(iL;sjg$(s2iN3jBtY5?*R`npkSowDNau%hTssCh136vJ zJ%KHFVDqBzZEn&BWM(Sp;4*8r$@Q)7Js%)t6+Z=S2b~XmUt#qCSe%w-2>@9nri$jLZ-1fuy zkf8pW7S2i3A-OrVuS+i~OHMUR7$H0P-uS~YF@v@K2Py;l8b4`FfU|Xx_=d<7O^51~Ok}}g&)kbMlAddC3xfefqgfW&H9cDx+=lG|e~wL$76uzA z2*-*In$P}_Zax+21hjA6Kkz_n<#Nc2J4qKkX(Ph0zLK**%AC%b-olmCJ4wS zm2uS9N+F=uG22BAYDvuw5jatG=IcA(*=vz;iO|nhA!6#X+eNzU@CoDX@z%V>g#OJ> z%W9>O+0{X>ws-q4c51Fw5teQuNz~3iU^PHMoJcr;45q>=-(u7M;u%S;3|s z&2#o@Hq5s0ea5GibgDvso(yi=6gR(dwI?+4;8js>7gx>;*T*FPg6GEBwqBn3x#g>& zk9ibu7Qp^qOT>A4W0xPWBUU5EYUNo&N(oaLL4Y=SYQOc;o1AeW!0V2isUdVO_+j*I zTpkOoz1(RbiDaj3R=))%Yme+^zTj4Wo`fDdM}9yE_$E_K<$h@fvi?0IdbS>3vwN!i zVgGm+6t0!AU2u!mPOe^n(42fQ)zz4qstN{E|U zUyaER5sZhLaocg-8EZLe>~S$UHdR}P&K|tL6ZYuT^Xp@w{SICSR=5l0tBb5o4P>S5 z-B&0R6B|tCbiIgvQhm1a0FTRIzF7Tt7mm4!a^%n4@0FpY+_-8 zM=rl-5n)-m4HRDtc7O1%GCdy4G7jYmXhj*j&{5ypnz~OZtsnuZKbb;3-S2lwPDZbW zN`8J!s#E+^=u!WM;B}K&)xz53@JvxKu>Dxgn0@X-yrc{oZaT5{grK+P&gK9sFRY#4 zRtYq@!cAnMq~Q9oRq}QnX`b;u?j?D}b2TQji`RU?0n##7>3xX?3a3^VAff8bUz%Nc z4oPwyv)H~ia3`|!q``;`palTBD;H{e{_74YAbVR?Ixm|AgD{*8{)&1%_BJ)7juGkW zeKmziM2}rGU446J?06Rcy()icx!=?qnPYQnDTCRjqF)DZ6pw{#g+5)+F@3|fY=Td% zyVjf-+)50(8wGrV#;x6sTt7&E4vAV6QIfx1a|Su}U&<|6^}dr}r>u5tSr6K8^rBC~QabWoxv z>rF^)vyc-W|I1xa#4l9xo??|splx4YK-KU|^q4c5|G8T@Q@Vh+r{B=99rI+}wexEv zNZ?61`CJg_4PtrA>DF?o52>oP7cO}OnJy1#3Qo|Igy!VB^JEEPLO-SaB{NU{K6O^A zPw1zrSxRXCmB@?2Gg+o@GIRc2|C_$5VVgDJYF#EeQMpt(9Wy4Fo5%AYGG7{a7Os2Y zoEojh_fDdrrhmm)ceeHto{tuG|5BmO6-h?_MP$e2T8B(tIPeR#8-vU(lI?S252b&~wW8(KgYE%QuVx*HReu<6@ zf<(D5et>PMLQjJI%-AV*z5d0)VXZ`3_1gi?OwJL5O_e;!EQR_`uprY(w>Aq zu2lG6!@ohv%#7_fbpk zJv}DnQiiUr>?$!|@F&{kw;GEc1k{?Z-X498(TJyClFRJ(zZuEx1m;nGF>$8S$7;gId*DTOxo+N(55o@x`F6FEiiI7tUZHthglF07e{}l_o`mgd~74~`x-6% z_TsY7ouzt659GeWT5Ni??oL-upRKGP+jZn8&0l`I|7iaJMFc=&W;yJS>_ibdSGKWN zFokMm=S7_UT5T)MFZdjz;h8zW;B>-u8|Xc&4X;9v1(9vcU!Cz=10LaLh3I}A!O05f zm0;_t7HB~%T^t+%KxkO(F6bV|P)7Aw7(X>%Hkv?b@zz>7PgVUg6CWQgKX(u%j#8xZ z_e)snyxAGj=NUCd2LwfrPz?=FKe@-Z@;uI9cUZ3}F<2PVq$$yojDOL(WZoUiTN%7D z2PO4nbUdEPAWC4l5yBiHU}!)9$nib{R*sRL!wokS>*XGE!Ep_)BYw>aK-7ddEeoAahN_fhb zb40?q4OQ<>E3J=TY>yF6T=q^NAOyXx9+p04a4t>doUMsnJR$tw3;YukQkyl|!2`o< zF?6@ctrqtR#)$7&4`Z~aPG=;t4E!1V^kiuAbWM0EdR!m3Egm<{ev}m6fF4&yAlEfT zo*maGWv`xfC(8Cxr<mKGUO4%7qa<7(u?E9IUK5@BXxp`@(7i~iCoKJOjWt_ zvFNrv1gIWFm%Qp3+IMW$fB&~E*B0`~i~;!;l{vRp8b6yX`vtmb^?zJ|seG?uiL!}%fH8m`_qvN$uRC0t!gss^^-Xeg_9Wu?a5 zRqE221IZ~4abzU)3QXBL#CObQ@u&6!8^?WblpnPsxcaK$H{vPbU^#GTx-JquR`we% znJwAo%Aa9<&{z`&NP)8>bJ_g8M&nwZfx0JV{{8JV+s^S{2Iv&-fS_ zx`T|K$yMGcyv+pWT}=uo zQJlS_@`dZVy(@EuoI~onu9KH5htN+#p0NnOGm;UgUl6_--@ZZaG%u>S5oF)@&fPi& z*=q7uZb6RrcgXFk9`+~}*kBy3Zw+8EwRz&J1s;N?qZv#d(xk1t1L8?afI`A#FvfiV zh`3C`6e!Q4qi2R*6Y3M<_fMjan0~58mb?$cJu! z>?E=UM+687z%Np~2|9=Ed9yh&18H3Xcn8iF{xgI3X1!1YOS0Qd;n`0WLhUX1FkZWR z+5^e)OGvP&Cqrx^yiqCDZPCUkv#g-Z>1yyyQcNw`lM~w zg}g`c->*_6$-TS=`t{9`$^+X6y=L|t#p5(9qphV3FuN;YZh<0gffO*mkSWlsitOZn zTzq~$kKpRd4H+C7{iZe(M$;j$5wg{KpzsP+P7=cdz zucBZmKyH7rmW;<`{7H_b{Lxp9*hP8gW0ZL5s$(F3!?mKDCFCq_ZOG$;PvM~75*g{B zTQ^_#mFo270kCesNXHNz76ZG$l|;(ciI;W;3Jg77r5LDn)~s#ih6blvSC(kl#Pk#{ z2@vC?Ia*W18XY>)%RZju)UfE9kAMH>)R92=N+flmUOVTBiH8`?Agey}<1_XpKS_{1 zNiH_t8zy`AKgKEg<&GuRd9&p}PeR?;_0UZnM-IuFv+eN!WI8^Cmuk6jFFXEqhoP%w zLeArihV1W-3I(2gMc=~QAsMuE`>dI?$E?J#x4lrg4yc&Vg)L~v{=8y)`(H~#^vU$U zquP&q?HZd#f8UTT8<`I?md+XktW!(g>%12f@4RdOt1LlDnnM){=DONZZXwOgG7IzH z+VgIg;TEVCoEFd4>vG%%>1Jf9lA=D98)e%{$joC}xu8A{>ZHfD9Y4@%u`Om2#Ww_T z;tr#FKRx;ou&f2z3~dbtB`~?Yff!qmK;XdkgL%txmy8YTk(okUoCO&2Kf&t1635dr z1h-CB%B(!Ny>&OM&IR12JV))f$qZaJ&Qjyp4x~X;i$YhIc%h>hC{*x5g}gw1q#NBe z@bwuR%8}Z!NgEZ#ngM1^(`J3wL{9v`XNzsU#~Bts&e4`ZaZtqX9>06TLCwTq-#(Sk0fiZhKEnDOfKcYU`_NL&F)>nK=y*x@8u-RU-K{GMYKSTysiD|m{VDfSs&$V z!t0H0fZDJ2vwcPej@Gw3m!W&lZK|g~qzpWYe{V*aC)<;qs9C}4`p%X={84vk>>vwt zIIF{1+#c|wk-JtQ&kVx-NRE9c6Q;1sP+zqdbhXMCiyhQ!0cg|YZA8hdCI#f4W>fs6 z0;*zuZUSe732i)4JMVJ$gqJ4sC@FSgcrRWg46Nyr$0?c%L9^9y_}9>n$KaqmGK$3- z-41@?KF0pbXE%R-NP%Y8xwNehTd0*=kny;Mzo$~E1lpMBleAvU{?-14Od`_>6Ma(9 zwV|K>1@SjbD5~UA!r1TAb2A>adA8>;A7#2|Cj9PEDDu zs)3g`*4e=r%M3v$S+e%QU@|V^+jXa=XBIU(# z<@L}Y2z6+@=)?(q(Lku&iCDy0ZJ-A?zBdta1Uk$z8~WcH&R}xtL7QxTCyA{)f~x{; zpp%ze*O@t6!r$+3W!k2hO3OJ z&hD3LLhc&i(eF>|Oz9j~5n4GrmG(gj=2PU40+-Y}CoV zHdj<1ol}uZP5QR{-0{xc0-zuZErhhrqJco%09|_ z!7nn!KPQ&sY+(e*Tz{a?e|8LN<-Fh@iP45y2sOfwM%I)#eE@0mRP9lCg<=R0n;qB1B^hTof z>>J^Vw zDE}F0ZLeK58oBU00@oi=`Niv^i%nE{@%q))$7)gq<9jw>k}se;>v_zI^diF(h@|SzrY;y7GDWMv`-5@%&^22(NbINS?*qmFg%fCdPCSou!79Ta4v&x1AM$p{ z!(;eMA$#rg_hkuc(j1wKn>a=6Cay-#y#L4JJmwcLK;;+Pp6d_Ogo;|N!gvuMpO39= zQ%tNuWMIr>T+fJalbLgx%__ze6+@Jl z(my=y-BY_1qV-08DWdO}cRy9rIqSQzj;2};h-MKN732<0Kpd*0jj|W6w3CtfATMMrYW{bCO`8wPi$#86e|KZ8wea_w z#huV$<0L!0;hXfc$}1;VUN8D+KWB28dc@#v&&r^Lsq(>hyY0#I{e3cig9Gx0l=p

Gp|7rgsF0(zbl67=KX+7_tHSzO3W;odq@sd)D2P~OO^BLXr6;&U7))|&he zDcApwi3(ZvBvdkgbS%2GYeSI_;bD@t&P#)2yi9F_lYf&%?M17m*QWDE=d`Z0tsuw( zB&mQ5O_>!>RMYKQeK1Yk{mltF66+3nZiK>ohhwTL7K{yjljDg|{TF7OfGa5MEMX~* zl!vX=X{U(v#QFscZq$O!DMyartJgrgabD_Xt?G;xO1QJ^U-6NB6e>R{{=Essne0Wb zBj0`->3#D_#&i7NE)Q)&=mF$j4WHU`=RIn|`LUda-p=G2*eBdZ56HdgsL7=6jr!kYW5*dU-`{Lp?>35!bd%94^pwk8XKOIHf*)18WAVD%vjLooq= z7J8MUjFrIYVwk1m^Q;vslQlrNYIWM-f3OWgD2@G}7A4a=sN^?BCkxh6ubWrO^SR($h zlwJLvJ#za~8k^*?)n%YT!LK`ek8%Ct-Fs@Y7W7v{0iF-S2lX$Xey95qXWaf$9&HNh zv@VeGi;J|RCzm{Kqaw28vpyEp&jp1i#eX-UJVO-tK$hSwp1T8alWWi>sE(@Ad8TB+ zDDCNDX}v(fHxzZW1DlU~j(Y}X@##C;{>p`wL-qLgzS2|Yoxt)^Z)6dkW#mxyeyF3& zv-Bo3?CNE4oX_@HJsH5mr?g-M-YAy6o^Kc!$;eUol-FOPPuBpmc?&K_X1V zX_OUqAUFgPvJjyUn8!qX({#$EPvN^cHDGR#qt%S-oNF4881AcXyv+yC47kbIBb#hG zW$MrO(K9k9_b6Nsj4~6cV^z+c6s2G|iSx8X-^+y@w(&F={$%6fx zy4t4y!iV-H3cPo-K%hkqC~1<)nvv|-YE7&!?i3ifOu>^C$!7>+o8X~5wr#-Npn_Vv zT3sYqG;f{&ydLyAXDM6%}$eyGK!jajyz+T{;;pQeHlc zjvl$_BH3#5{Hw}5h@zaItZ^Fd4{#s<#X%R(k${It1hW3ikdqU&|4XN6b)$zC! zbI-{1{yuq}H5o(L++Gd|O6I0b#&w2L-Ky`0r$L^1e%JV1O&*N=IrgsHZdGB2pfY07EwGr=>kgc&#rJ9$9q9)=x%F#-PZ_ z`gTmW@tf^%AZGxtfbCyF{;RJNXl>jc=&^gu)S#yykuVUy6n1Fqkk;X?)OMs`F6Pcv zfx4P#pZVoYD^?<(Kluf?T(Uq`trSi>Vm0~NG z)zx$>BOQfb&rjq+_6{|OgWevok%v4DdG3H^@L%WIlL~y@#Z|_~DvOWPL}pnFE(SnP z54Vu+hr7ediN7qa_tWpgg}n@U97+0Y8il{U>^&uZ0OpJbYLCw1_DhEzt#zhBp{-fF(aq*Nir+gc98@mhjw9n4a8-n-sSn}6Gg;x7VrELAfC4D1na0zFnVa3^bp^!COF|!$^?AO`tgV<%*mEpar58vAl zoItypu6;u{W$gH(c2h!f%`zn#cr!pUV5#WagVu_os*u1jIqYdfmv_gIUVTcijK{3F z&6KZfdeNw+3{Wx*CCH#O8GRh~f48`Q25LaGA;prag@Vbr7{E`%@;b_c6;Z$^=SH^?mq&kpvM=bb9vi|2Dx~ zhikh-=Xn#)6z?E68BfX;%}|h${^%%ISq=u<7_DB4513uuAct*LTTi z=-8NIe{r%bnuiEpjXm&$+zF;YkgL!xuRUy7xZd zPnOArU8JOtooL~v|LB8vWst2*JDISps;;5`nFCvXp;Zux z_Iv@(2?BVLLROee+1IM#!nPO5#wZ0}tJld><%HyxOU4e;KXeI!ncbt^4bx?tn#c66 zQwAgy{da9pMRBj5zMi{(70GF{>X-`oJQDM|!q>QcMeSziAkP)VvvUnUCuF2OZZ6!o z93$Pyw;hayW27{|+uN;V(FUmZ(04!E3HwKD;4@IB2-%lkloUHOFA^u7po`0eNkL|8 zGyfT|$<;CDK(0Y!IZr~BYML!{g3=2K^E+%_9lLx4eiQyEk3VIx!)_FUSij`91 zVT{t3nv+~WvuPzz<$a5)O!qDWw9Tv1&sU+ z1(C43gM^D<1FxR{#l4fjL2lB1JN||+UFAowininT%wf}l4;^ce+-h9ZjHos?Ou8Uc zuZ;x~5$`Z>bUB6xM68^XtqGu5trG^1YDVDdIkqwl-uDvzc3+2Q>BC|P07zCU_~v3* zKeYeyHonmZi1RRTLAbUzvAh`f-oPc0Sk0I1fEL2aAA^1?4|N)TrVvKfeeHWv3G20s zHBCYlL1|4owNV=|MbN;$4&O(0`R)$Hp?!WC_*e6(? z(YzhZ>bRw{w=R7`pT8hwZcha-R6{9ZE zO!>*B!jfN3SOHUV5Q&0G95r+`fJ)1y=LAj*$Vv8)>bdp4 zPpqTPxn=UNz5%FpC`sHFg3ds=VY}3p1}2Ej;ze>WZuQ$-UYlTuN+>EUy)@am%OyIt zgU-}`UVn3g;YW3ZaS!Pcb%ZM!?$nAUC?(3lv8fc?%XyKQ@v8FzTeXZkpPr;5uMYlI>9G<~u%lN% zl%r-HM+=|^=jS9KB&o8~5ael4w1l;|#IL7aym*5ZtqNUM(5jl_DCACDuU`{>sCWg2d_$)hP zXeuPq=5}}P@!xNbb{uY&MXH|(I`GwjeA`Ad9RUHjLtwi!Tufdw_j=;X;5NAfUn0_a{XD6ar10Mpnc!i+=*YLjU z3qgTi#rr40ZFHx^lXdjpjVQv{&$v{qx}W}Na!?^u3GNL6LH0$aF(~F1Sgd+G>WxMn zG40zBxh%VAiI7>dlUNwm;~hE>mY?0G40Qn*XNoV>WJhl$h?Yx`SWO+Q3o&eeY0~Lf z|BB)0@%ewq-+fkGfirW4{eul%)1Cj@y75nd%m0>~ zqpP*tK^OywMRyqsgfNKjYSW+&Ul`O*kk9qnDgS+*1T2cX zA>HQ6_}GPjVAK1RE(*M#fJyKO8~WRZvQ#0Mg-p5~e9_>^qA<3fHp#CGqHRTVH=o7! z;mK8VT_txJ^eI~0Z3(Q5tY2?maASB!D*NXDaRJH@2xf9AeDCPc5IvG{rz}3+SkbZ* zJ{0wB9@OPZd(7f%g#sZfJ}AbL#^E$I)j*DwQw5l=hYS!f16x(QfX#)hS#^G6n0pkY z8><-($0Sj%*Ow7L7hy|e%_q9o--=6ah84YA)WqpxNxYz-yW)1spfRNu6ogkmTZx$Y ze|_J_iyXQy{injb*9EkHPAM97XpRFHZs5)w7&^>HdU#c)8f?XEX4jg=t_^5Ast+CRqw!98C;h&}m8q$vPP`%{g=y4-K zN7lGry71M%^x=!1YyG^~NwJ)IxhZ#02rE?)?2xTKUZTCF3Fn6H4(YuHW>GrA;|Hz< zRc99CLNlj*z_t8&RWyDYS`I6GNhp0=&pBfOePK5IqB5NS^B7o1`%1M|<$=J0b_viP ztK9F-)%z*Lrx479Q#A7paTqsNg3vLG7@>bpGV5$rLaVKWv<XazX_GQl9Xj1q zwXc(8Hq^@g%YXOLP7LgEEu`T0@)@!QDb{voM?gTg|Iw9POGSFLMD+MmO_|Q&S$%o!(E}7Lxj?h^La$E z?v#>4h8*UwNRD$hhdKP7-oMZH5C7Wp^*mgM$8}wghxcID{O|2~mhplGyiW1{(ZeFg zyQ+|O7gt&hAT2PtD@J)O<)%zCLhU~kp&5bb@RsgK+f4`Sx{IkR9_>MGf5`G@M74S6 z;vVnjkxlz|vgD*B`C~psF9HiEBFt*{aP7ZKhh%)xv6{#fh!Bej%k@D6QrvX6+0gN2 zfy(|%qi6rOpqS36=#N=#vIVRsE8qLk-nxq;Q!E3&C9xO~`(7N}ne;eAT|(OC;@2Gr zz99vIIOdsrw!+u&vBDYJ_MiTN%Ovl2+pad5=vALbn2(Ku`=H%T<2A4lTG9D%ImvGT zVK!>5^f_Cp;}c6?+W2FHWa&EMas(I?e?%)_BIEzu8-$ZY+Hr_IxPWdS_q?KT8MdrX zZL8G+#0XaOE$S)jMi)zv6&=iMp3wz7)U@ikSrN~TWf^Iyeb z^G75iWGn4e(*{LtSht?gNAQ5NjbGna#YfZGk31@nZrnkg$k=&Kd|w=AVm)3#8g&~& zP`g=5psKeGFR)mfWR^wcE!b^HeM%*>lZ!!s*NW-=ze(&M+E;!vvyn`H~`ARz}{_iNbm z)#kX#x5)_jNv!8BeOD$D<+Ps~`&*+}0-XP5wJt4ID-p**VaXkYb<3{0RDVfkd>hz)YZiHO^NnSG3r}xTf^hszlXN(=0L9Q zR5#1wOxwm=Ubv~0+pnBJGXOijdrBONej3e-tDr`{NuO8ZSvWSrvzym^=)|Pi%&Z*u zwP`L1KV(lz95l$`{iS{6d}84NRe!#dYx^e+Jpmo|HYtYWSQVjODg11J(?^*W|Mv^F zg`<>156x}LW+(0T$?G6lAMPfAx)K?II(P#hEhn3qbPyLEKy&l^w*I|*iPDNECHq$q z({c4@a${Q*XBCjsCbmsGF#~~J)%e7RTf@!Hh)dwwDdOec!vDA)l7{?~?KEoVdfexj z^X349geX=$WW0{Y-Cu(OwrL)~|DD_F4IjoYxk7ZUlG33rvk#S#j(O|zxaxbWw8V;e z*XRm}wHDWs?5qd9BZA+CJGfjVlgFm9SF$u6KnmV~^3aG&Xs^yPvUiRdvR50q9!->u z4vQXVnP=(M63dCl^9>zsINo4F3Gc7^f{PGs)|7mg0br~_-IuFui^kOZ%*w7sa(Z#V z{%w;7hxbU?X)UAkBw;|y8oETapx$qp48T}U<}Hv~NZIclg8d3FqylmQYQj=-+pqBLE>!RSYp3V& z@h>h@@<37dGeO)uLP5(PpyApvyfsJ4#R5u;Itjb@G z8dGmK0@)45)dMr=-u3CpaY>Ak>(Crr8%j>0$z;Gq9og+S7k|GkSaJMfKc1yov+j@hvORfR1#t#YV ztg-LmQ*lzjN_%T@k8_9(_P@6}g`-Co?nr?OzwjF{JphOYMi?s*c3xWTS%7_cddce0 zY6n@X>lyIX>dnA2X2&SEr~LsQ=jf3IGMj#zta0Pa@+{B*yoeb1k^&(102W3z|{|HUF00z{J+lXO8$l720v+=y#a%;PTcl9@qZY zsBey!6sr7q4tMpag$LSU;<&>1k;|AT1=HqGEr!qYDl&89G3cq4u?pDyHAIk`04(TL zNhT6JH#isix4vFDJje_xPjF+X9`|zo+{$HA5cb9clMdLf=m%w`NQciNqA($p`=b7) z8q!a#e1Dgn>^;xXGU`!BPxdzX=A8;2{j=kBvQx4JEMFm<{dF$u!+6u~1Dn+RSxxEz zY_UR>c(}un5G77AK+o3;2G9) zsZpuqT6Pt_AiA*j;4{HFnjLPh>ZXbuPg(as@nBZmyH512?Ua4Ybw;CBTa={`a-bF< z>^66!J*m7|UST{m_hINhR&^kxpaKWJ=o@@ikU-5IXVI)5EyO>>YZiXM>3s<_P(MTr z_}{w!3{^RIV)?w!QRlZTWC5TIFXv^@{WmbnIhyVpkP-8$G#CRKV$CyGOzaVJ6VgL1iyMB*ph4G`QVJ=b;kU;N@^CH@HlWW`A5gltJ zEmlp|eT!q_N>sg#agfYuEhUZVTV2_g29$Zdkz~Q9H@bMW=)XN0K&c$RMi!NSBcI_!sQ3XF!wpa95}S> zpd$~MG5hf?Qc^8)vQjMppaD@0-=9XP58)54D&NQp!nUZ+nznm-dKS>99`*L~p(_9? z*-)LT25ww8a)$*lB$<_GyW4o1VZ1?9LToPo-vhi=C;LYnYX_1o^$YJtZwf-9y~K6=A4qFU`*S%FoM6uM|I#1u}RPqVOnHr zoxT~ZiwgteqK>>4_=A*zU=Xvv>o!-2@?+FTxH<}@te-;lR*7OAsRJ9Jqu@M}6Q&5Q zf%U?=SXSr_=o?bIo}2qU-K7Iv5=ek)V+<|55)lHR)Jksw$+!V(}m7))Ak8 zy5HsXiEQQR4L6){i#dISWJC-wM$&ROucITKX~?W;4;w{y4D&XsDE(R-GL!gmyA$4d zWTE%-k1n$!nQ)cmGKm~f5Y$q=qs`G{KKfR@nQ>O*yzkt=YXJS{Hk5XJVzT;eO1G`J zrT49b4Nzkm!FKDCFA(rAo(H~GpHGaJ`o@?fpw%j@4RiD0e+!qU@Kp5JWCh2r)dW1D zNJsY#@D3dyn$x&D@Sg^b4Bx%`_BDufYn7pYEvQ<=DGi|C1{L9!M~` zR(aWqrcO=&Rr~imK`Uw+h+rjZ$Vls0j&6h;T^94vuT+(N^YJP1;$0EDrCmOo61N5A zcKfb1YR-R*1%iOkQ?$T}XJ>5?i>B~v(Dv;@T4McmeI6wmr2bmmaz`s38PJ)7q2>o zX>lJ2+4M0kgQhr9f8Q3mK4|AuwT`=eD&wI{9%8ULXH~bO|L65f6(*KLBll~hEAggH z$Uvl^rREke2Q7yl&Zuo?cqZT&jRQ}R^v6cQ-9+09hc2j#*}{Tv0G25j;F-EXFmD#} z$_V0};+->RlbZnM_n*YVKE=^i#t(bbMIK}cR1s1*99jFn?UV+@gQJs03R8BZ`iKyZ zw{tZx;e&{=CbIkU?^}$)X3#2yL!56l0EUrcNJ7!=c00S*-C-{k>;9)2+m36XrDJ(4 zf^eQR51CFrTwnSQflz;uQ@fu}-pEv?U6XuT_7%|!_xuKf+<5`n zS}YtqLQ!b?kU>j<1}m7e4)gO7_W*_Kd)~mn8(^jy4KUc$v(SNEk^P6%sHLuLl6RW_ z$x18wr>m{eHG6)@w&B2mnlLjbTiWRie~|_*?FF5N`!^2XpMA;O9uF=jEB*JX&~*Pb z!Z`G)6}M9X;Ki`bt^%y4KjCg7GXJ;s}y#v5*`W5XI3eODV#HTpMp&^S+X-=z1kRmgpqAN^n zSq6{WoXW_ibZlItAyFK87r^k^@4i!+X`$H;?=suU2fq{QJ;(d9>VO@VO$6nYz+%M^ z6}RI)N0-_13&0*$7-t?E#K)GMbtzrJc0#{=${q&)##SQH2a5&J1;I9xRLoeE1Wv(Y7*> zWz(2%*+^^>O~2JhOyjwHglNUJg)>$dl{(EWZEP%~eA+YG*rf0ebF*#RE->Tc#|vxO zVM`$f63h%{ws-dXrm&@s?VP2HK&n;oB|-8E76H-w8E1d8_-bBGskhCmH=#9GbvWZB)wce!mL88?79aii4iCE974 z0meS;*Cwt%f8kp)8uhVfNit0!3#CN)hCwrv)uk$fM|(G|_)UP|CgZf5FknDdP$QQ} zS-s6q--VK!$Q2^K9R$ix%d?sXm*9USk1$w%9bvFKKnmEr(rRyadbP1cDLbk{O3k>g zzDjuk3eyQV$)EdW_60?EBT2b!v)*cED7T}@weo80GZvTzdc|UK{r2iS^?Z5j)t3nH zs}=Ls`5#)((XccX%=6f5gyAoNt!0hk266@?>uri;z0uNx(yRa=2Rht#nf!r#FM!^4 zZ9s=y9}Pl(+8afeGdX~r;z?Gz}DAd13vHc5zu?v-}Y zwQF+TKt8oDgBXH?;o1^%R-gNyUPjOw*d)Qx`oBWK`=UI;2)VMPaf13k52w!q8d>Ma zCv@}ZaRMUytf%K9>_~_CdXYECRoPqZPMWswm-23(;sJ79U}tdv>>-+@1V zKR7a#g%x8}8GgBpOS3D(ok)bA~jy=VLyXK4ILZ@bZ6e-VjDRrio2c)VP#*^UY@Hy`Z&yb;twpq!R z9(ixpg|xajV`8eKPSW!Uu^;wtx2u}hihY-uquF)~vKX)@dM*1}qF}Fx++ZdvHM;6YZ#RI#3pBXN zb{dXR{haoc2LP~D(V%`{eZ~3e7gZC0Dy$5Zr{0iy20gX5k4mo9__0C9hL$v6k_V3r zY0KR}*gDl%OrK`@iDfCumRGxdv&$oZs{c+Fp@l7&@^|tYTT14&)}O`wKUSyl4iE>K zv3K2<2KvwOLYW%+|Ct%v;wr3Vq0jEr>{A2g4M-7Ty)YAnd?{kBy6!&@`+a<3l0FKr zG|m3AAK74{z-@qUzIy9}>Ybb&mMzX@_%g>i@nxq@70do`eLv*ar7P>_Br5cxw0b7~ zqNyAGf9$`gX{sUSA7HNKU5R|Ex%6^h+R?l{NNb?z@IthZ%ctf`BTe0sU(_o3oLH9X zF>G#u5ur0mQmRz~%l0&RP5q5`K=}Id8%F>n^oocZyBAeO-}#ZdXmSyQ~6WvtoK%nD638;g`>HPS~WqV3k&d=u(@Df+~pTc_B{+lvH~LV8$Xb z!tqo^(m1=>?0g6sMK=d{NkHqD9u3cfGGyV7M5TUZerpoW65ITc@*b>2dA+_cTtqwa z^7{Ug=Yb=vp1+>xiN1Hm0LTh|fqQb5a@sv?+P^Y0BM~N%Cp~9NHCJC9RLFxI+o$Foc*AEu zxjg$Y)u0s`p!f(Fz?{@^(Kf*r8OGwhwf!yr9tV27oS1IDIwbW|NlEG#6D(pVZq)mT z3w!gC=JDQLPNW~-iEXApP#lZhr4NpgiN>qI!{tWAzY({Cg|`mey|m9aSj5{lSg$Hi z08_rgn(|KY7|Drgj}#L0 zJgxIA+26q%?>@y-^gBY2-r73K%6FpfCBfVclAjbN zoVR3(a3EjFR=L%%9Lhwa>)L$=A`*1pb$R}$z>qx#t40~*UpAxE;`bqXP`jgIY<6tB z)|4cjp()j=l|pN^@i*C|TM+MV4A?%O=~Ap!(iYT=d~R$GNio+t;b9r@FN}Lq@ifZNa7K?fHE^8rA5_M&#%# zCmsw8nKiul5V0mIE!A@29AY`1m=5?Hy!lUz@^Q>N!VqN_y+5Z8kj_?Ktn>-l`RI~e z5ksGbi(mQhl_!Oz-b5$&VegvovZe(`lXfMy+B9rJ<%vnWZYCOK_?V~=|1`A*CWEav z?Yiz1?sWUxI(bnbY{=2R75EouQ3Z1Q>W@jo=REMkkLgdT74Bh~aHrO5{60<<_?T#p z{SO2=C(b5pjYiu?-;aL)3eHQ>`q&nGQdZ8xQ#I;f*4CRQ1e&cQn|-kX;Ku6c=9ebw|N%|WIY77oQq1m|9D7d8GlgaRI=W` zVO8^;IkoYz|Jz#Nq;{Uw&n}H_j={#=*)FNpFEPW!T_Nu0pnLE(-1NrCRdqyVA-zVC zXVwF2fX`spK0e6VaChQXmc1g6az0_F?C`7FCqMt+S9$&(FcK(jI@TZg0xo@TQ_jcY zZBj0}IE}6<>&e@}zJRJl1b<_s1yDc2-2(Ei{)Z+*@m&kX1Zw0_o029!+C z55LPs9MT+XZh&}8Gn+9iXZk{d1yA1V}5pHq{UvhDGQ z)6(I#WB%_=RC$aeYTU z_*x1z)3&&m?`H)mCIW-m*w>r&hY%}972@ABb%aF9%>IKum4-&e;K76c6nOy243K(c zJrQyJEWoHrRR-Mwf> z5hq(3t?mk9w5URioiBYaY9A9tarM#j3Ar(fJrP%$wT4xs#(_Y%^zd3=d((AG5qSHv z+}`-yc_F^FNH)E!l4#lZr}1IXZsSs0&s!jcsso8k9|tuF`jo%l=q}49GP7p*9S9BF zBCph*9~@^CJ~wC}u0+#ug}A#S5xWGmW%kut-S^KP&YoAOROq=M&O+;;?9VAW-<&se zuA<_~NCzfd!cQy^S=dWlPnwTv6EZ^7XO!^m;!fzGiIEVTuXK)X)R7gib7mrf&*ot5)Chmo4Ya0Ni)Vrew%FLg6@aRn#=$} z0gjD?_@)OZ7Z%K3J=*{AV`8Fn=VG7aR9Gm71+m9ca+^K6-^Aj&Yg?o6U|--5xn__L zZ|UmwGwk)Tx*8TzEn%a@Lb&awP5XryhP5BGRRvcSG!ltb9_gM@Jg+QHw#c|;dNH!CC=K{Dwn%d@`2jP7c&TP} zf>C3=(K}a~x2!^5iP*HLfneh**}|X2JqsqS8FfNoW=Pe zM&W-H)m1Duq6&$HKVA`YQNy+r5xk~ykg=VK-QyzjZ$KK8+tC_TlmzFNkG%c?5*~I& z?$6WD@tlG|C?y+TC6I-b*V8@zDkKe=oa4Sja+GFE&bE<|Oslo4vj7I_fRM%yw4-3` z8Y{QL2yHIh$);|`FKXWsug~rt(A`?IBT7IuF(pDC?+;V!3%O5AZzcD2VpW~PRH=$k z_JPG;rrKK2?$nB)#Rn0d)Rf<3M_KW+ZjXtR(QVNeaX|@raqURk>l7-v%II#kIZjew zJg%!*XtO7WV>{H3pB}{n>tfwE+P%Atz=%uZ9OnfwqExNA^WO;QNu;eNofQQeFn@rm4ZsO=dC+|FZ2eT7ZZ72FyoVz53WdgQ;7`6- z7xPh8>tL8nNVgdoo!GX?UI54tgFcPJl&&2_-7X+d9?p88_h(&L@svwWOeYLSUews1w&j!0_saY_Mk9pQY)2sN_Lb}&!~0*+8~(mi_w+O8|gYe z-2(9-`CgI0Tmvj4LPj6FdqOxRVCH;5>SgX>cc`27O6|bT5&}!KASr@DMx(u-RSaW0 z?`tYT<{x-(6VO(n8Z%Z-k1!6j#a&##_QjdHkL%L_(>H33>v#f`uTmIX7C z`O>}gTgF(Hk%t#vfxBVNyg1Gu6Mv`jE;+-W%gox)OfiPiJ^RqgRQgK~!PPJSwa(8OkBu2h z3a-*y8Pg=kn!N^k8@5HSPheGnJ8&xTn__&fBckhZ_!6?ibT={ln$z7P>ie@GL$wX1 zHp}JrJx9AW9$R^{D1dBB)iMMQ){AudEHFC zk2Iei?p^r#eP3%%%jX1lZwDi0rnH>QD0_sOEJM!FBxHN}A?^Ym)}7U2KbKHVubP zJ;q9I%F>;W8YIwvG>Gr>53jNcGk~O=MT)?*GiDTbsd724O48d04fMFIfE+^XS!xB$ zI_(R6o)d~~G2&8s(#8It!BPL+@exwi+6Qhs+mrP#)E$JVFO5GOynOiFs%78e_1o*) zD)!kGcThjd>*L4fCV?+xbve}HI0$&Z_Kg@W_Xl7dpL$xuDodhA6%(B=Rd4H`(^3m^ zQ*$~Kic-+9J6z&vY6VLPOB>_|3$KZ75#==+o#P+x{A5u$(n;YUL!%ZlZ(N`7s z;AM)l&J$NY!KY^Bqh+xbuFO;k#sOQUwvW(@WbeP-oxsE?;~7%J#bc~kFXq#K4Mi%k z2DKL<8A);{tBHhIl0?d?03vm(skOH3=$U+6`TE>Qx^S>2=sqOwo#j!?S8q+FzT}m% z)p|Afr`OZ4_Q_1KxDl#I2wrw}){KVR2_Sj1<|seSu6y>LKe#+=qeW(TF`%w_QZGm_ z0W19R?B-Ko+ex~no~)qTY17z#mdt-<3Lkr!aIoIAMW=0C32V7%*pqv{g&APRF zej~I2c4hdXHL#_=^dF{k}l-D@tMmqyqq(llQ zDnSl9a1CI-9Hep2Ur4wqPbud}pXCX6)a*RmRN74g>0y$2GK0^CC&Pr&p1nY^h-fY* z4tZD)?&Dv;?!}p87J2Ql8#ze;MG`@OLEE;Fzsc%Wk`8G4wgJ$wcd3j(Mvysq|)=UgL2ZHKSBEZdCAp-iKTxNOjcBOR`BQ zJaQ5`R$3*PuN1noD0n7tQ(ZbE+suI#P z%-1VT+#y+o@#7bDA(N14lN*kQu`=#mA!>UlS}mbCg@8s}6uSg3DPUbptM&SF4?xI? zh6%@t9ktfr_`lMNJUbuhNnyhV`9}b)2p5^tNIFEE8aF(~mcbcJ#AjDfW>m8Y?G-*zYVXS-?zftbxNMsKk+0TjWRtXx-cgbKv!YY zSspjzs;bVH7E?3+N= zfM7^Tk!DjP-D`{V^pTF)t?JUqe&? zN_3_LB_`7|%C|wF@C{^Lu29HltJ%}5M3bz0|YfGf-?c(QW^VPqJU4u^~dVPAYc_s-8E!eig>SM%evQixUXJ%X|O0`D`<-TG1qHZf?&eP;W=S8gce zr=|EGQG2@}qT_u%Z8*B~2e}$3kHNv<2BJv)9RYoJP7}0-dzFAl_DuC&K0P8@JVDAk z>P7AC!^_SFMLrdjJla*g_lVQ%z0|URkGHvK0ipSkYsf1Wo6Z`GvxP#K*&<30aj z&SO$`Qb|!x%ymk6fihCWlJd#OoB26L^3_8(E!w@xK%)tIuB$K zs_8MH`wD#~24l|l7pmg&=gArYy@N_eZc~_ZG700PbHLNWsjgt+Hy1j9+PVBi3M{Kx z|HouPr@;$AIXx7u_=xO;ig?7n?7SUHFbd7C@@O8bYOWpw(y%hlzVE+29uUEQP4?$o z=IKF1U7>~06!ISahG8tJCDh1*>Pz6TSn!%`iSm(hQugaHp7PU$shKCgRzt3k%~o++Slk4Gmjx13gO4{11u7aG!P-dF1el^C zFicO{-|B`e;%wtkxaKvvWmjpHzXMcJn-NCh^QYAzsPp@mq)#1ifInQ~%2ritW$}FgtrQj#^^8(cs3O+(*VXyaqB!yB zEV!w~q1A#ubj@3O)LZiBDK~E5)X={&`IikTTJSQNSyz1IS+~@k9Qs?(wl8E zu>grTqLh+Pw2t-xuAny)$>>Qy5zMjtuJzc7Haxo6*c-pvU3WT>fVPOOD`VYdv*B+r zr|2DKt|DjJ#WkDwT3QZ%{V0<&hv#tAQJY2(RzCAWi%CTmM+{fk%2}j|FTC%KAJFH zSu5j^&F}lf5F%|J31oMXV~kdGt`Xs<>fZ zutb(F_Oa7Duf|o}e)JskCq_g+Z6EM}9VD;o^_c8kn=oW5kSdg`ARY2`6-+m1tU!0XoR;UjMPCTl?{QShS|l7?3kh|}%kT6c ztB`_}yIUM;<{#RJ18QF;GE`^_aZPU08qU_3bCoNma*N;0S0jHGuK>lRr4KeIBWz5-)Vh+gtRmsE?u0>#!V#zp8X7%G6VDJ1JTcM zoALY8*VRvZiAA#AfR$bvd2(LTfFY+3Efr>UgzkdefL^~yYszvHWG9szr z-MN1nmS2>e0&!dpF&pR-%mXu=9tdRmL7j{S8N*qfM7*%VE0v(yzW zmUrXASkO{e`vRv}tPBY!1A~T}|6`1MP;VkdB()oq3@}afe_i2p>ecg+zM!+Q0vKWi z@+(red)vSZfHwo$T&MCuKXQ;~l&!CEk+c9OAANrRY}Ji^u*6K66p&!?k;bKq56om@ zn?~i`y4>G_3O^@u9HPnYr5q!3_nu*%?bhFu*{bK2MPH@a9k0 z1>D|kaUQt@_2|AGha=y{*;8l?bzkctF|xgYyvYr;FYq>O^XkBz zG`IEvE}r~8eQNH|*r`F$j8x-}ira^;icu-3##tb1wTdr*q#Y?&-K(^87ZNXXaACh) z=6L7qXq4T_q{_XP%z#NqZ~B+-CRg{0@hYqirwvYbA00UYCKMkq`KWafW1t#PB&!T} z<400WcEp#1L-f6&chj3@&dSfmX?)*8#y{9SCVT3@5n0b?h;4%fvZmGUU2=wkI0X=M zT{^%uyng?ZE`OFs!K&l0WmYZ=r$E`WKxp7QO#tA$4X{!Ga;e3wzsk74N9dB0*ndgw z^E#@!4FFT3!0qJR)mm;uSt0H2E`3ZkMBk_M(8Ki7Ws-;M1GiL`x?B{>EP>-}W(WcR}`6p}k zLV#rF(aL6G(GQ(P8@L-xDHwF8r z4o>gq?tNlBeXhMflU&QYqQB7aeE$?io*G2h5M^l-2s#dE4R0fqv_SKOwHbWzADz16 z4*BaEnrteiAXZeOnPhz!%m!J3RsJq^Y9+Vq7(Bl(h?ILI4dTVlfb5@9246cN0(zFpq@F`~fjyPJ?4Azo*m>ZXk?-#=fC+K=~gk+S>t?W86GuO4DO{X#vB z_%_~QO$H?!nQNSRi;{zvU@xDW-|v*0Ww(b2*2h?Hx zBeT{1Y81PsyOVCMdhm0Y5|`d-Uqb7a6+1}tvdRs#!`bw#yix$d_x?O2@H$2^Px5yJ z{&uN$DFN-_-w}1O;>q;FL;DoucHen?0im{zXem3YI{OG27w8vf(?%Zf77!}aV*ktH zK+I}FVWYUhTa?VWM^3vXnoZo{4Q3fk3SJ7gaoou_u|-qvkbjUl$l+ugyxa_3EfYz( zj2~l-G?o9pRoyw#IvQHYr@uK+{qgGcrq`e*`xdXx>%*}uQ3*!R6nPZ5FKNcHJmp_= zWxym}2;V;RZOzHqA)Cd<0NAhRYDJw8Rf>|t|B^25`zo{3K&sBZiYj`7vRYho_D#FZ zeUsoXSSfbyC7^Yic;z;OS2tKToPbRmWn)*BmPaX+vcML#gagS7d~4Q!rB&=4S)Nty z-Q%6sKQUOO6lu&A9&s!~!Umf0zBG&j6v#b41}h6f?+Vb5om4V!;e5sW%7y8zFaGvr zdp99hP)Jrsg-4Hb!H&5De{MRW8Fj8ldd7%G%V{n&d`WzYGxaQ)vqA4i5a*0DSsIeI z#8*A3^|!>(plR{z=`rgYUTbT`lSqXP2kRJz!~PXI;ulx6{ztCp(R!=zjQ~L|yTN6t zm-mEYdnF<8V!i7XgN;;T0&WSq2`GGosNLLl9R7CaTCyIRtO=ZBS2Mq7Msq>>4e!6c z??`nd;3^PozsfEy6p($8LVPhB67vfqq@Xl^b{~Nrnb_`_-T&7M5V5yf_&JOGg6ti- z({e~J;)>zK{I|NkXQXlPg@l-6i1s{?{l2dVbha9%X4~SS<(vJUP3k>KQ3f<`FtWeo zeXjvH{L`tqb=G_rb_2gZ4tIZierAJMJZY@3VGrOak;hnsf*X?dh{jHSg$JA(kzd|` zgwG>uHQ0-@`@M9}=ks?5hz2j&&4J(t`pda=#DJ%t=JL^V%04%@ zE$6vte3*_$U0Mlg<|!;q&?e*#=L@le2sit+6I3Bo<0+f88LE!pvNcVG_F^#N@bREM{zpbs^P-bW2p(!1TRC7~m5_6ck_YfP#xY-lga~ zsL)IrXYvg~8oC)5l=U|1e@s4C)^im(BBn2>s`^wk^)BesN770rT@fqk9wtg{ z8;YzHGTe5NRXL_~&FB0#TD7f?5YX|{WQ;R56eTHfi$0|;N7XSWI4>)VknY;|43>H5J~l4tJyFt@x4Cer9p=y{-yfkXxw z+q(EWJlsY+I#=01zv`LmKy@fQhA&9<*H~t=_<~^b#d*q66$kgPk1{MxcJzIJ-@k&n zj&Y`TleE_X;#dhUgNa?W8yTtH53)sdV*EHOk1wmQ?9X`%yxkZBZrUc>s-0J!O{c7P z!UljSPRs#vs8R0VUAQNx4}id7t;gvL>~fdq`%&>IqhbiXD2t=v0Y9E-e2$f0r##kZf4#gY_|=&WOl22$+*_* zy%^9ARb!UjN|uMQ9{*jW~Dtuq@&#hvt_3W&n8vWpHC*BL2!`RaP>fz zCWgF@YCm}!m{7cnbnFL*`%L=DoY2nIj4}^&E>gsr(nGFqx13}-IE`QJrH=h#d>mb9 zF&o-vl3f8bg(byZctjqm?K_c1koqQmVh13XZ}taC2qlhbSx@f=%(PF*;c4s2$RJph zyzOuVhaJlex3Gvq9guD@yqB!)QuvYZHpW+yqo?x%um?Xu&fAcdF;s=4PlG6m`?6*( z6@U&8EkoX10%-Iie)a7Kq`3k&mXr%gJH7L1|7gP%%8|oNa4v2MnzvEraa)S*@>t)* zTES&9;~@T&ydd9qhv+!0mTlYtNi?Ubv7(g#9p36cEz+TNe?)X?WOrc$spJhRO>V z?jkLfg3WFndba9NQd^#r|BnwE<)1^yZPatg4@bq^?1T)~;5Kkg^X!wL*>~($>zB3L z^)K$Q1-CP@lnuN^^hhiP>}D!I##7auRT;Yf&YX%O(Uq|W^zQi_ zs-*!_SQRT zh)V5V2xqsh%sH7C3noR5ScIL*+^gF;B5YXdr~$q}N}z*J*-GbvU+2Jmh^~Kir)oTE z??jmB(xuaGT*xfcj+T$O+U9RTns%OPrk z)LyJ)_fho0eECi6%Z`bEuX`O9gzC8C3$QYUx9};?NX%O2*?&L?l16vr?_ZsS)uV>< zK%9!wr#9-58Us43r_@pc+-ip+Pj30$8L_}O4(;C0^AsSf+hf=ERtMFL0+~Cw3X){? zUK{0pBsm4Z0xD$1R`T@A_@#b+Bj;V-#uEQ@bukc*a5e}5GBb1RG+zTSc=E_K0lym# zY{2te1>jJhY?f~Pe{pYdvbb?8Q45rz2~WrkxA>Yp_K9EZ);LaC@w>U-j1}tGk@s0d zVM)W0rC$mi%MY)BJHhhDq*yC$!YuXdQcL=mj~;OZ#f8hasN<}=84dGmI+#4UR=fA; z(S4b`C;i`B_1^K~a`{qM*oXFCXYCc@*L7)0ui@3hdXk&# z=UPj5EzN_Pq1-d%S*(gVst9?0B@O)_V=_N?p&v+I<>57}_S_F$XS3H;nkaeY#H+A7 zwEvH$?~bRs{r`8)F$yIkqm1GhCo5z{G^|4i+2lk>j!{JRQFqzvIQGge%64qdUCQ0D za%3Lkl&o~@4m!r~^7%e~fBJ{Z^?qHi`FuT}mgJ)f%GBFa2ItO?bJ|2ce7bpgNN+hk zTzJ#a`PI-}f=T?l+_gR*prkw>*#>t!5zmHZl+nE#y>_2&h8zyazzM$rV~gKLckxM1 z`Qb@#;t|n^bXKG!QT&RZ%>m%eGT-L}wo2N2}Q+iHd z@jqU^Ho3dok_l&Ckw_gxuR*|G-aku9UGB#%%xD!MLSW>v9Mg|sd8T+IzDmFx-VgV< ziL`)lK;j@tTw(f2V%TmMh8_dE>Vk6hge5+0_VKRD1Vhsq<(Qcb)iWJmhdn}946oA1=yYWb$ndzm5YQb{NaCqx&+x-}|_)fqgQlVrX#Y0>fwk_N5UNxRp6r<*^j zDvk8;c$^lRa_e4Hvf}maa}=j;)c5J=U%#(mbkS=*be8VxHH$=V{q!uBFlV~D-eJy+ zK8Ym$3L#EKET2TOrF(TXgcVW0;}@GcvZ%wshPOGcV0qL1l~blBVw*3}L~Bl6enB1X zb!5IKJwT!gQqv01J%QqVJPj$}q3NW>4e>#SVHyAz0i4bw zwVd-{0ZduG~FuX?Satnc#;P@t#Na zvJ8}B=)pN>Zol~OcK&fV%CM-vPYUg1+<=cXpzLH(-DA>a3ZUF++5ln5eGtU)d+;&K z^C#9Htgyl`Zx*XdmHF^V%l`Xx>}1@<;EWTB*&JV6?cSt6l$%i<^$GTs;I{)FkP%&b|vH}_YOX-719w`Az+2xyS1wA zv}0*hbRM-n=KhCS$SYVX`Cc#0wZmgX@hgs|8O7!0F(7$QLnm#262Dj#TjzceLa4Z2=E^sKX&-^sd3YUvK?2*IQR{e(4x zs}>}+Ml$*EAA{cknQb{AopkQH-eSK;{k<>Ad2+5;T=wgP3cjE*tdV*i%|W~*gJd(f z%Dv0ss}?$v@y8pbOpcp8bP-8XF9nL}Y%y)8Mw>d`Qv=Tngn+L61rIBVCPfxCN21A= zUetF!4Pt8?yzCfO#++R(KJS&-lr=bz56r`C;!w3l@Ui`VQ%ryg+y9RK;T5QIoi3^E z)Dbey=4m|rK#S5*WI(YYxt}(5lr%<`#}vM2&WEnT|28Kvp*f}`Jbtx0dfJb^o4lnd z)I{|e(fxA(Q+8VW=Ggusp+o`xUUGSmP~5%KHYfU@F<}#*Q6FZco!9|+T|MxupW^UktcejuvQl}$DC7GJ&KVJCY3@Kh1g zkOO|Pu>*Sfl-c}g1y#!L$uKYNTifa^<5f}5t_FWKWkk<>`3vUjAWe{)6S@sIhI`0U zY$=cQXmL^eMV%#7W%N#qGOpwc-0?d6)n^8k`i{3$)sS&z(C=B=ldU=9`>Z8Zt@L8= z!qc2nk+RV@lcdEJfgq#2D`;JRlgFD%RxCKN45awimE1oYl}19{wOu&}NW1ExNezFe z-iF`{8afiFAtB@2Iw&sZdtcAtk1YM-RU>5uvf@Q%zFb~Qd_ZppczKC@{YX0Thm< z-6~W@#zTxOZzX7F_~Oee!uj}jHr}O73@OOHbSxZzl}7Vd6Qw#Rs*J+*2hSvXY};h= z?{dvKxsb8pfSU0(L{NG;3Ew4?<6yE+r!%LZ*QzS$S5Qcl0x}M;6|6eEXl25dq(ydM zp2mF0;OMPTz|2Ab{QT!b!3a@`4T|w`+in1UP#`Z8tnU3W@tD{n4V~wo;&B4NjnSJ zTzYlE$}ctiY??pZ_sV6BnhWb=b*mQ0MFu+bJaV#^X74EY%b7CP{W4cQ=3mMSyB4WB zrW)0ah!LHf{4dd+8}2au@k9E)f!j;ZC=pT%qcJXKG@vDlmlZ0Je{0EwTX(O@Nb$8{pW$>Rh!+jy+ zlcBd8{Bl?`F%Ri}CDcXzEzLQYK49<^N$at=lr0Ymy;~+N4B^6$YeQAZ8~|!y_%@ke zj|Y8Q{xNG!K|c#He{=F1W1^{}aJ^xtE?UIuDLX!_0L|MYU!bX z3EZOXUAlK2QzT!#=)3Q{P%D^>2O!P(ZF8UQhjfRrKvvRzuIUr3bfC||Q7n|cy56@s zy||6YHO{8dz-O($HMD9p#iCjhKhXTJhq`bftJe}6-t;xBHn@2<1$kFXUvKzu`?Ze^n%k=WwpcETq#7^)$kJRMQ>c08y^hpB?q|I2d_IP$+=i1EC08HqKk|;EmSZ%C zKja!&Y7Y=%A%tq%ii6fIy&%Ej)Tcr)r^OVYk7oLFd5JLt+IJo!>4o|l0v`6Ge zH}_I<@H^+G|7kCIEG}fc-!X7~s&X0}y0?zs7zq0zfVs_fvxYu%2 z-l`OVEf{K4)jOOiLirzR658ivXu+HHHYbwavE#a4uX*|6NMlu2&O>V~a*tU$P#Dbt zM!2}ir&tMi@Rz`;`wb`71yXQF=~SSO`F1r~s3)`fuJzcj@c=8-obb(@H=0_rUs@}p zJGaY~bnH5ipdlPi=mHXMpQ7VLk01*d4~IcugYvCmLW|Qz;F(DC zU6KG+;tl8vGsiX(U1+Hy|Dcank0#pI)``C=;^tm^!Wt?>sY9{ zjxNIdE+Zqt8ODfs{`!RB*?*sJ7hUMsp*=5x8lGQv?TFYn$vvZ}l$8bVvL9Ux+RVk} zgjg#^PW`SQoWYCyTD%o!5&L_X7CgI%Uh}5sD@;u@#jid&x>=Bv*SGX4?xVQz4Q;sW zEp<+quakDrECVmTqqkd5*6S&jH_cyjKK7qtDK`5E{XOAo!z_V_3zw^@FlLwb)Don) z5bM-+^{g<4npi4}1g#SgL_N=C=sOwe%HCBi=BzoP>9&>MajXCLUUbz~S5bR^i;76y zEIrCbr~99}13pv`@%HaQSd+3+keKuDQIqf|8CX<@*nbHdpR}X3qXqe6# zl@e!1K&!M`E^{|5S~0et@CxwGgyWp|3tuQ(8G_A2V_ZaeNaR^BkmWSYqOC)J`)fy+&PnO+X?V3cze*$x#{B2RP_10OvlDe>ieUPV zl(IgTU{?QtPCQ(#%+l}Fnl}%X+M4Gm@{f!V%6wUOCcu^)QO0HfR#{STd+UuxOv5G`M*8r`;4wd`IuFas1&X;d;|4sF6b%Djr*e%tz1)NVjh%CXn_+q3nB z2NN<6{QDVGue6k$%62@rV;CHx755&k&5=9Y-qKO>g&w+pl7e06&&ziHcYIqW)bTDU zJ8X4Dmh4pG{~Rbs=r28@&k||y+iz+VU-u+_Nj}fKr2v>Mp8r1e4k9=^X#OXfU$mc}YKifIM$`&4 z=m9$_%V$=Lv5YiR2^>k_;hernlEBIRnpnQ-;s5C>HS$fk9hamHQu+&0}s-$Hnvc>SbGAfW< zeu_4yH|`xJ(>JJ+1`gcPv%Z~N6tfFE7EL!&AjCg><_pyMw>?t-K< zS3v`qywe)c;OrysO%P{Bb0xc;`TbrRSpHYS!_aVN4~cue-+?QAUwLOCwR&pDFZ=Xz zTaIei*TLyS;oXp}zf~?Fp=2MZw&%3D@s?c*KAD4ZJb^rMLe^4-C_z zg3l3eHUYT}7diqZWLWs%21O4U;(8M8U;8K9r9WtsO|?f~+U=o!Ijqv`YAr`uytw)| znv<8dD}B}_b7)p6z)cxxw0(Hp;(}Ibkl!sNTY}iFLBYRYFoP!J8AF|LS(#-iVobcB zlw`|5>3;qmzw5+q0>K)P2fJ~)TxLq^ zKblwLN1g76T=r)9y$8C^Lz6+G%)=)bVvraFLP!U2$`WZ{yv?Y^t_j&^*i9{IS&@i) z!9*KiLY7m|mB(_?&kenmejw ze~)wmEMZ+OTYQB-O4>a7Itb}W*x@6+0&7Ie!`P~l{lI#Tby3$>M-Di-Jugg@)a-0d zN%jdSB(SLyHTb|;%} zIj{Nm>z6O>-N?tQmsx0uR@8>Exo-U(loCqVF_2N19NVq3= zBLt|oNJZFAQvuyAX=2QDePkm>H)o8anCDj@Llxs_L&xMD`SsKW9$z+B_>ee3(e@la z=a3z||9T72i>GG#j-$d^PVRvP<(x37!N`KwJWFG5axOXhZu87b7WTEYmpi9NpFkgt z(H0S6n)et@u>LJ2d(!%G{HK8=qNK4t1Z(1 z3(!0U*65Lx0SCk6aR|xQCCy_gY`4z)YHpe_Ea`PcRpK*8! zX!L`_p?#-9OIt`XqINhi4q=IWPYsTc)@7F%@#>C?=2t=vLuO$Ch4BI7B5IvaSRQvL zr})d%Xw+mkqqE1~WTVWzB|tmt8x%GEIX7XP&m3zn!SOFNr( z7P0G2s~vamlHTJgUwStj6ozl!HqLsf#aC*vWJ++HUO&=7##ylbE?{yiir-QfQJbJO z_ItUN=e{0)x!KXhtM-+q{1NxqjhJ@tycw7hNYuv^N0m6i>?Z~Wa(R;@l9IOtC^D2# za?aQQAi0~C1hMI15O%as=4x&RX=68ty!;~}QEb^8kU(p$@GGcjEptsb2lH%;xGc zkkE0BKR1tedLOhChI2jMBX;m>vjtLn(^4APs&byWYW~mfJk0}OeUMz{-`@23+6XKE zRGvtCpc>SgQ__NIi?qg+28R~_er~K9uNrwlzOh~>K1oI&@bkOVpP-NwM#K9HCdiN- z8IAZQMywkoouR5q(DnPmxTRz#ydSY_XE+onOB_$J#u$55->2K-1DQrk;zz-9O5IM_ zcsQ#~mZIH4B~E=oghdNT?%uw&{LfL~7NYG>%!ahy+Rn1icTel&h6jEl|7l|iV7(Sq zHoMVOakPjRT^+fWy6s4LjFLBubiGEdJZ*jB9?1Y11pzdw7OiuEw{K{P7AYgS<^y}T z38#;prfST~NTEni_-X86(;T8`zV!83POri&zh6&I6S6IwGfBj7k)G<~{{JFl+Z)#}QGT1ZQ5cZPl;#B}7aL62!hZ)oiui4Z4 z%`JOStRC&})RB4Xdx(`6D~n@cR!3Jy$qM4rpXtahi_d@h?$hh>M^jS)Wo2g$)oSE@ zwQCBgX;FSzkLp)`UIl&k1VSA?;+jJe;F0Biz(Jhl?wROp2*`}iR8!%w$iBAV%H(NGBb1e`;*ODghy&3G`W#)w( zf_ChoR#&Ql-77^{_<6&zAJRaL*>*#9yM@Y5$j3b=`r|$|fdK@y=G8((eY9zb!+|fO zuWvZZr}6E0BZ%<3*^mH@|BnU86UQh%dNdhdy)1`KXY?+VK|0OQJk!Kr?KcuI1ccxf~mv$&b~#X zi=-VX=~b;caK7mz(t<(Syh^8;9ME;@1OOii7ds$#OQ=CTPYPyXoqD!QR~Iu^>jxL3 zpD1ofp;(DiTeo_)dObq=V@6CZVmG9f*E-`AO^-70PQU%=%TjX~8q|$pwb1{j=}Q;YR~DN+E zAtDE%J@Mi_@q}N53`~;pnpV<~i|^HYem9*@q3lscC_CcTfCa*FL-o&=`tY64i>*uFfQk|MTXF$w73ZDp%9x@6FT;AHXK(^i@!LY)GG65aQ z=E)+u0x9*4)TW-JN>6!g`lIw(E#%(bq2~Oerz-K?Zr)$spE+x@TDYu@DA-XU&sIi5 zSU~CXeLUe5SeaSHt0He`UA;Xx`%*|-MY`2g>5`WZ@u(-MLQqolRaUnESKG({=a6;m zCg%_*diExwlgfA-x^GTW#->-~$T(lOdoOi#XM~6Q21zn92XUnREd9yZel%!aUK4YT zTw%j`FN*zbiJOI)Dp&hxCq}IxDDpG$!%zZE8s}OXXP(|u@x}j4&1>q%zd4q(2zbA^ zhZ8c;>@(@NQPxm|TFpPyd9Q-;omdH^h2dnX;>{%~;)w)m;-Y$~nJ+g3|22in;WAqS%A$p@nRW`7`-gN~ zUdYkYX;9%SH)p-C4Y6YKPTekclX$FCX~+F+ipHJhw=E;|9{(^P)FAsFX#mT+{Acwe z0*tDmymevksO2GA59v@;!9xEa(ynkPOl5kdT*b%xTf9Gi>g*lXBZfBG-guyti#PaA+R!e@_kaCjJMsUEXZ&bpz$cJTA`ro~&FXB`a+xDGX6lLPcQC+X2 z_R+IUU|3gG7%$YyYE!kgIT3vtTNLVF;V5POO*n7bf^)iO!ItuZkVW`R$m8<-W_;Ex zo}otli<@zd`y&?M3vBQOO$Xvc!Q~vxH7PMKd}WTzj}CahF5=bLDwZX)UR}#p`4fY| zWExn9QglUICRs$@@`@`~px~TnLPUE=^OKVyZX$?xQ_s>)ByWiYtQlFO-S7J7WYq65)nNKtKvHo1_!)iA zPEpY==jlx>^?y7gvCNMg9y8{HG~6>gbo!{^V@W!V1)P~81TX94ZBH#b6u zeIq=PvydgSqby+Z6eg#sHs21nM5yQ)QYepE$3jXE+IYmi*-9$Dg=LLEeV2TALTX)2K(K)IvDlQoZw7I$GZKZ|EndmZ3MA5OTQun zz0HdDpqC#c=q^7MA;b90Oo)z<&~LO${kfY_QhAdM2L};gSU;ORMjwca;3Hd)t*#2Q zV%;(tGD^spkVv09CeEQ8HlJxEd>7fl_A;KHRU#k~puMhyI!AOkVmi)%8Ve5$KO2*{ zaIWn+3|&ww?{GcQR^8amAqBXxUJKWXD=`gJVlIB^-CwvYMox20yE0?uY3lA zQv)jA4t8Y??F(|ye;T~Fsk^z6@f{;)*m)+P+N!1>N)Rs`nm8X71za=Pv z9o``-Uxy<*lzkJZy`KXXv08mgFW);gbtF&P zHmU;9>)+gxUa7owZ3f;Fp5d_~|4(Zg$*w_IJ%hjOrLT|JP8cu6P<5j3gVY#Ym|H|yA?sMz_+{{t(K<9 ztt?su&|Bi`5Q+xaR@=jRqvf6^@XNiw((1-bbRNEsAd9p^Gvm_gE#KH8Z+8 zUo2)|7yZO_Y??5XHm9Q#S09u{%B@$eVel=!LaTfr#%wg0TKyK05umH%e~K(WamZWB zwyg&I;92Y;+@qy+xyT6AZq-!+MMJ|UwPbXIkQU~jvlwI;Lt_-r&GQgt*3Q!X%?rM* z{6Vm+pSi}CCvyJdoT;%u93VG3kPQusRjdcKJms zKzeB5T7Fh^^x^pULKN=6&lEannaJZP3QC)$V0;0-L!;F1@HWK-kfwyodVB}}!$&}m z>qB>Hd~vx?H;7_LEE*MV0tD zGp{uzCo2ki!a@X-hOOYTmzK{UlkRjDI58fc61;BP+?q}0_DUKP5yNUt^yPP96qy$; zgMWciD;x3t2I&_rm7@|m%Q9Mf;D6l3DU}lOG9_8z=6{#_Z*GDf);X0XsL^Duy@rv0 z6wkbv=sCPdeTQs~jO&*76nwEvJtHn*1F(79qy)Nb6SJA-!A(Y0kqu1vIG z!SJx`5qLYj;|@cDe9VcdSAbY@5IoPgMd!~AL-#{1!X$2QSxBG6ianj`FS5?yitGD^ z>-}q8(~(L2h~{`8b7z)*uX+OF%LxcK9KpdE$b%d|G8ClXRO7vgOjdyG(poNwX8>7% ziloO?Vsnc-LUIbom*(`J51W-#NYIHe*5c%L{ipi`MUk>Fd0$l2?nXU(01Wk%B0*sT z8aIi_S8joS;f9?@z9ze$*$jX$`EUr1w|hPTb-c@Cxvv&W(?Nne5emLRTMJc$Eo?qC z|8=}a5HkQOd*YKC!%C@%Hoj6GTu4vDt5&2`+~TuY2Dh@lFGp&wGK2YepFBd3jXvoQ zjyu!H+~i@OPe=q9spVEbSU1SlBemcLcB7=kumjbC(nV3;Kb=!$Z5)mA)1hAGe}edl_yNTgGl) zvwp#DU9P#_^|E^GiqEQIBDs^e^s?HXodTa2CA{okvAAQR*^ab*(E6OJAqn@B#$G8c zNf6I7u^kN-uhDS5LFGV53b;3Qq*9F}{biC$k_=nZNnbZ^Q20?0GGG??jS7{0VGLvz zxw&&-?l5V8U1r5ACs5uj5_XCTRk5tzkOd*Oe3ck{F~Rfd*(tb#wpZ$Neq| z$1gy>NG4%Q_*sl%{&xk?LdouQ!#^~|GQMM)nz`xt$&bP3F451~&q0Tz-}9K9Vo zB_~i{0l-1WNmr-ta*Q%Y0KJBy`*5c;i5q0!AmOnC<$W)^lAkpGJBv`-%4qDsP&;x` zY#n!@6IP{^=O-VO)^OlKK6(#s{_L^gznxI<6P<@| zdmsCuD35blT{kAIHxzx#x|5`PVo#?Oh3bHv(C{AGV5BZ$y1W{u4>dKsYDf}v>39(x zX#Yx)?;!T^v@d@@WWS!|;&eR=!Zx>>-o>%Ib={l1;wRj2U{4;K40rwDGAikD8rgrqdOsu`0T47Y5?AeCk&u`&XOUKB1_KW+%j>CY0kl@julVcb>tEN?2ZXb?B&e`ow(%`Zr zhpa7YLq3rE%srGV?i($brv1W4s9o%}>sil~Hv9|oz2zU%8RYXO7ocLH;M zjK12g4*gG`TIe>kg9wEe^9TTerx=$7sD*ERUYKy(-#Jc<-1#pmRCWh*)sLL!<{Xkk zcX`oe$i2`N3s&m_methl^T^6?#{9D0UX)XMfuYtT@xwvdX|bCLsfbUnzeEZFyV$}k zW{&7hS*nX(bFsa$Koj zI`XLzc7J1#o%N*dhaW+laOuUx$|t81k8%KqqN71GKv5MQ-VY|4vaN@l>*QYBxcc*spde+ z*JEn|f?c2cmVgssFD9@fB?r5@_@nZ4sZaduBe+ zM>?S@t5Ci34q%WT7c6HQNZxiu&Sq>gxE>w~gOmn-IfII);xewhEJ=XpF>8XwhtQW# zioVlvpJUX~Ym>SA=eN1f93#c0)=#+d3_Qg>mM_2`d_`%`+(~IT?F+jsQtI*~knA&N ze0Ip{*kHGWh~uR`;DnrxYnmul3Rlb;^5@zifAVo?Va}pPW#9b14?uw}2*-{j!^vBu z21}Tp*R`#m_8wn6jdZDiikB~{@nwU|Ob z&`dAs$3E20LWlrfJVTuLqC2^>I3PcI$-6&(&o#0O>Qo$mC!W7Nr9=v7*uv3A+~ZE9 z?*u+6$4+f%r`R%@!b4X5*2i!84%U96!Tfu@I51WrMDOh}CJCmhG9CwcpPm7CAc ziFn@QeWbOm;#yAd!LWI04;@`&N0!M(evD*7%&rJU7I2K5#1x8pFs{RhNA@Dc@s%xI zz`^3vfP=oQ>_zKUW6 zC9-?WsA63Jke2p-Ko>@FAnA}CGhUhSS0p4@>$8X)_R@A#aAWU$n(ZPj8}yQAz9+6E zOR5bL%(}6qA`;BjoKkjz187#fzjP6T^fQm;C0hVICR6Az?P!E}r567FcGgF2>Gh{% zeJkLf5y0HjB|W%_Blol$4t78dCCa?ykJ63lM|)QYN!ay7Kc0mH`tw-om{);oh%t)O zP<6#0Yy-{0^W;4`+yb67bTvjsG*G5iz)5bB9$>XDEnh~eTIe0--D;Vfw4{n*h)cMtHNO`z=>LR(b+U_gAlc(8L zPJ1u^QzaIiizQ#K;zaiW#aIqUhn_8bQVF{-U`5`$fFzVhegu-0Y_2;+x!s;CW;{SJ zAzV*@`c%5~!ch{KBVQ$X_CJoTK#2Yw%JtXc-&I|I(dr>8`njNAh)bHm-Mnf)9tE#q zaZTTNhg+?Vj(*6AFDT*p!BNP=-t;>DiyEVv4ha@7_jUH3yazjBvcGmDz5OPF*yR;+ zmwMr&F6k!W5`hSyv5L4<3Fg(;n)f@|ck8KRpZ&EPk#;$Xv`0adAe0ED*=j)Z4t9oP z|JCN2Kcps)Y7Kn-l1;U0&zH)w=%raXu-`W`z3m__dNr=!kMOtAPiN)K?p;Hcg}#0c z1K{m11EtJL3*K&TXx~uil7iv)U!j!GRx1nC0Dy(P*VJJ{l?g+(GJ}41Ut>Kx6M$Mv zo5!|Ylds=y{gR54=9hz2)l6?1vtrZBc;?26d4|K;0d2=##lOrkfYQMTsQlKy=*l`O z*JaOhdob2Ph{SWe&yy^QDtQa`VpStwYJ4y812T48sjg3uf#*)%Cbb_1^aJs7h0FNa zG8yl7L((b^I_HL)*mCl`cPO{4ih~|JrD}aBnnv1T6s>;lPTGD(F<*V?Z@hJ|>WFd5 z9t!cFVel^Z|1iri_0`btdrzr=$5W{qudOO23@p3y(beYwF=iwsX%bKq7Cf!P=~!59 zp*81OG!lCDnRbm4Xvq$Fz!~@Lez>Bna~#f2>gp-}P5RdKh&cviNMrtq_h#FF%X$PE zMusb)b{6IZkbLH>+tw;dD=yFe#8-KI3fjEG+ku}aHI%W1GtD^uQ_whOd~-v1_O%0}Q_frW6%DTi*rO0J#$LjexrkR^3@F|dQ(W)AVA!58(V14qzHuI#{=h#n zJY!-0rQ6*vBRFq*n}#vfyI{L#i`yvV z&KC|qRJ<6|f^eE0LpS~KejXzV+DL*#KhhsBCr4E?9qTVeV-I!dX8Fax)61~YOFAmm zFnhz_Y=Wn!L~9fJMZnPW{_AhfqM}y|N?u0xN1no@VURf-2S5kXO)!xfvI76@07%sH znT6{P3MYg9iY*&cO!2Dk@=8@f3C^2Y1r6ojJ#*QWh15P~7kEqJWCQlalBvQIB&d9zYtN_h>QZVS1Q0Gr(14NPyG%bBPpR z;S2k+@Ov`Ic_~3~#~9qw^h9`OoyLGY^~$8Bq{sb@$TsFQHj z?0ebxVp|_8HONvS$A`TFt9ekJk%n;<2!k#g8)odP$FDw*D7yLWqNE2eNK{P-8n_Rj zqoU!q8sP(&P{Ivt0TzxL1+s%BJpm`~_in1FOT@JPmZWK zzN!awS)@-YFe_+wC3_%~FpFFj=-@k#mt2^2{NHJw;PoL95AOwEO&>$~ryME~M!{M1 z1Oole`)c^=mj|q!W=4u(Od&gX-<`Dw{g3a&ZT5?Ni(8-hL5C8e@2Q5pG*9jjY%X6c zCCAodN0}0td5ayYy22#o)x8eMYLRs-KlCWv_=3uuOGPUkCZNG~4*xp7l3dQMkJr_S z=ZIN@l#?HPLq~Bw3qncc^gfCLZ*Ek~!;MlLFGrG}S(G@^7m$9!Qq1;4OqBM%u}8J$0OLP3PA+(kO49NyJh5CX?Ji=-UoDT!d}18VEc+|PKImtoFqc%`<14k zM6H*>6bRYpl;`eWyD*1bzH(Y!cdbgThB ziP}}!;4Hf14q_YkiCarb@YVmMat1D}j}R19ltw{a$C+1*(2^sxvHj_V`t7tVlL;0C zZkK04BwFQ1o{+Bwb}>)he&6w08-@nC6&^jOf535Ha@iCieo2)?90_v_^H6dsrJOPF z_a_9|LQg!)uA^*UAy*wADLY58VgW|DkLP$J2!eJp=pB_&T|thw`c2b%@BF$oS>!!< z4Mn8}eXQt*TlJH+&c5;JdsnM&0hHFSN301+D)L9?XGJ|E3=6{%C@sA}XL;t(k}f)S zo81*|*!41mEPr|^LqXwHsK2q2x!bFI^20E{jhPR0O#<#<>XSV|sedI9#y6aM;{Nu@ zl)k_D2G|)>0lwyI^C5>Y${Di!NT0Gpw)AB=z^1V3L0=-Kh!#au!$7~8)6vTv^@JoY z!nq-=GI*VJGf#&i0<9;9mVse5s5h`>&i*N#T^Z^a&V$fjakzoGjO?+VKbuwLQvs5l zC7c8o9OvV$`1jm)z{@=U8y_!M#j*Xzqla_8Ya3Cwqki~8k^4}Na-AHNcw~Lvg(P$3 z;L^G*v1>#m@)}zEuJZV0Yy)(DB_A?AL=!lkG4mU=LNY(n+Cf#m<8khku+L2HY=GWx zJsoyTH{C10Do^b5tU*r4qbQ(c#87j<>Kn1ODU6jU^(WJ;Ya*Ps>MmRsDg{I!*qNUl zFX?92M1*^Kqr+!Z{Zf~al*uxK*{xb+P+%bax?kt?&tM41tqit;*D@BRGQzZxEzeQ8 zY^3ZD3fI%UPKzSXGiVpZvjm^mZJ=s@GgfZTeta#%jK+(0rUxD$b-Y7w**x*hcMBY6 z)T{wOGB~5)rx^k=c1!w=8@IZ5m)mM&fl0bfgr|~p|Lit*2CMbgHnfI;N*f76ThFJK#_O8L9A=40c- zFfLw!BRkflC%6>lRLJ?s&N|?I`I}^d6S4!!_t_5{0+OSnRh~#*R`zY|9#!ERJ0yXj!%HBIgJ;*y4Sv4F;hB(rx(cQ%2nGWNfhJTw45IezjPbMu=g zxskt?aR7&)iOkM3zdjxhULs(gz|X!t_l^q*s1EO>PkKAkvB2V;_uEbOELB>l4%g0p zyh(}&5-g|iJ|JNfEfSj8cl_~@Al+EsO-NugfzB|dzsVIpj_F}MHYaxPDIIkRfxbRj z+~;Zkmkh^9F$5hJ4hx;2)g&4|636nE^ZYDlQCY#4;yHzWG%lzy33%{+bk|2+I(}FR zX6SoWc^5x})(zJMaz7CDm6#dm-@sKMKAW0a??hK1CUq=A50!kOmtz%+T!-c4|BGN~ z=E~$8C(%9~+u1)so$3P)%DVnJgU~_fA{Y`Kr;+&N%&LIIrP&jPO`%|}2XH7iNPVDC zYQ&3F8pH-U-0I0VxjGpxP#kh{uVyW% zd5-W5DZ~3YWKKCu=~?rG$uv_82gDtgVbph5!?fMnw0z&b5j1dg8d|PlzC?0+vIv+W zh)FL>lAwW*S?DT@Rqer9a&ZN7wYu*O7T{4VtfI9-!mu)qN--gvADQx$Z9nFh0} z3A31f@CT&jn_*d}#s>o04yN?GLqMbSqn8WCl2UgZh_0set48{mR~fciIj0j-iZW7E z$YZCE=e7$phB8>^gSKhC52Y5JB3Lb$pfSS4k@dG5y|(qO-HVbvDW*Mj%;3bK<;ZnT z1sjmD+!ynZKq*sp@J|1;5Q_;xxedknqn5#u0q$bgw?JvMTPOJn42av^e=QW3x{O=X zC52)SPvnlYd!8qYnBM42zQO_SnGZl=oR07L1;CQ=o1DLsAM(K8Sf~3;z4~W2HVqA3 zd*uIpy~RqxHlfgKT%2PW$8sGsSOh6Q!S;me2t~SDLC;5u1ukvO2ntE!%m@)W$ zzikNwx+hCaRgJ>>>Gihb8xVbT3``bvh9a}`6jhdh zdQPtM2Jh}@fU-{K{9o3~u=P9@DmF@P6?EhpOGKcmP$PyYs1dod^-&G47|>+fAw0)* zoYV%hbJ14=O28Z3^6^5QQ*4zGEnxPsk^T;Uuq6 zE2K5%#lxN}R=Al`m{GQ5mdWrA@48V@54f)|kd}_7av%GP!nC4L_NauMIbBN&;NK8A zd|>(W3q~5Q<)ChEeGYOP+HU*5^X8~SGdXty&If+EmGP8l6x>zfWO22toF#zCswpgD z`ho1q17dXKFj@rYGwQInbiwKkvg-npmu_PLm6RsnWj=Ost!e#fxWzq&j53$--Gqnt zj+5GG{tHMENB~T(>7aKqNWy%~pJ+6BvRP!DRV}LSzdsMiRXOjJkyjbVA~B_`|)s3!2&MMyzeOs%>W29^d(qt?AZ4X zLDAm$JzPKVY5qAWgii$O|GnRs7Z_d4H81UZ8hsa*mP~?>00&vr2i@n|t)ud-ls)po zsxX)^2(xJ2r*|DYpLL{})~m_S0A%L`Yz@eOdXyY=Dg966o)@ciA~az$>St}*9D91= zZ(s_i*2Peg6m^sld2!Tu%MlT!iwKyn>J zAY)AmmF4*N-gl!5Ad7+Nzxqt--xvjr6H(`Qcp0RM@m`uu|H4|M($fmgxlSaoT?RUX z2;=FdFdypW7jN7HD0eL_*rCW&!>c^ar!!&WLN@YDdyiAEu(=kl^a1LU>SG`FD+tFk z@A41?fVJZsQ}pwH3thleH3_a?Vr>;zcDA_afz5%_!3h+d1wrZakDWo!W34bQV4z(I7;ve2n#ZlUIGio zsDyTCUu&6wvpN54L_)|6ypS-1Y_{eTm)F(FK30iW-k`h0mR%>CrR0~52s^;;KVp0W zC%cC4q+B_6ISj*N1DtD{ z&Ix4#IRyrNC(!zPS^UaV0#~OED13l3L;uoo>G2SOEi3asGsp}$67j^8S41gP>*U4H z89-=j7?Wi2SvFL~#riXOgCH4Mk2yH5Rz}zF_&MZ)8%w^@7Q|cJhe(Vbeacw#ka}iA zjst30^`KGx_K!@r5@Ytd6atx0@_%;81*$)#NY_Xhy1-tYbmyFI4*2eq>}oNJumc{H zDLJT4O&Ct)_-%+t{+(>5%{jDW`=N!)_eTGPAv0bk36|9gA-L%0Wd({+<1I!8?e{_# znDz=&k24>gqeMm(=7E|p8|vj-Xr9ZS)HAS)9#<(nK=9igli=laSJjf9(je#hZE%`U zhMzso;q7`l2)%?@a5R0}3V@Fb)mb_33Rbo+LbDZ$Wp$mIbNC)DE-{K>n*Qf-e?-8k zCw{{mSbpDCAMkw`2cA`>#ns*Oi7`*$I9~1g1Q4|5MYMP(Ot&N=}tGW zps|oRRR2>s@A%srIzuP{F+O7hq?39K)@HHCq07;fq#wzRP$IUKzIeuS*_e99MbtwP zIa{jf9wbr|M@>L$Td3QSQ?4-iYF!qqc~9**c8#O{Vy?szEl9Cf)dP8z_4a(MPVB z^B5{x+fLQeUISutTJ1lY$Z_eM{?x_KfwQ^GEqRIG2*xoUUVof;W?oj2N50edSUpVX z_ET~HHZW49_wDo<5P?~NBD%xr+aTzym6=qT_1C)UjlUTOh`ReHDfR??^W*|wYyb?; z63!xMr)sRz(43P!X9)bde)5%TmpQT|fkUIA^O;7$n59#)arNxjd+!HS25>=*$jL0y zjeSADs+%LNf6lujZqsy(9eTk-j^dB z6^sF&p;~x;N+y=xvZ(>7$h9cFKAr8vC!z((9DTj8@hxuS~Fo$Nxp(h3VKPkYWHsoHUpaylncbn z>_v>}_@T>t&Agi=1BxKZ1eL>kuonkDFcXOSk148Y^*SLr?dte%GuhyeW$QtsEaW6} z8lR+tKcdM7(XJ3GO6WT&sK}mFfBwC?Y2zdCo8xh=RV%P22xtg)owL3A)eL}9Yw?3% z5+FKB)Fsps^gsaNE-#llvK!$6p6vnL4XX0rkFm(}C)-cmHb0K3>@mgviI5H^_{JHV zrGL9=L^N z?8FK3+P487FVEP8-QfTI8Jr0NKKa?mLOU?f8>VJjY)(MMb$AYcWT&B1nX=79aijeA z-R2p>BlhuZMa3n6tsz4s&9Y$u^&sA(xOwkCKA%!^}F%&{rx2>uRYK1`}DcabzU3EJgeOL_wPTziY2>4 z^l$!-x|sB=KU<&IZ7{s4TXw(-hNJo)BylQW-o3ZDA#oj)=gZGh=g{L?IroQBYSm4? z0DtByoBf{O_^m$0kx^I1me+Na`OD3?Gi^W@&VtZ-T0aNg%V0qt(jX_|arpI3*qF#B zU6)l%i|hL;DH!ipw-krJ0$uHGn(u+Fx?0fy9lD;8wXv)D^2@nwRafb9VAf!;qM$}O z1}AWL8vInbj1XlqfRX7LQoi{$8uv=zOI4LCr!ffEs_SNBE8`*yI`+6baIMCe@b_mf0CYkdLxQC#;paQnKSxJy zVxv7>bE~G%J-=Ja_Lql!wnPbgv36n-5>*QdbT5-7H8@k?@t7_8jjAs?HrePsy-cC+ z)ET&jh)FUZ@?eeU=8%kGR2*8Plh(QpTOHEBK9nRu4|WOE7eT}%ss>^Kr=BNBRZ3z% zJKcQSA=;BGE9UWHB{o#p489RuHGih+-~dm zc@#Ol+kRZk&=!>wgF-QbA9{MsM4vIClqqg&hu{|iN7O@rD9ur?@Z zhj|3mPsxsa<+o99Skejt2asHBBrpk9zT;X@izo-wF>Fc#`nz+C`o0snC$F5-!~|6A zZFEycCjE14gc>T*m>o?oz|{S;Kw8+6KmRL{u@LZZbR4jG zNZA@|(|#_uSpJ%Xgha7Up5P2mFC+&7)-uw%UWCdp7`Pf~5NS{lly+y4p+prhu$_du zj@Y?KL5B7yG&+zx<2iQ2(b3U^#n6uo{5f#tsilCZlLF8sJ3ciksOttg>DP_HXHGxIvZ=gxOk z11sVs0yANNfF!h!DdP(gxPx~&FGKYovcJrXSC~;e?IzqMi1n-6sdiA>%!~8IW@ZlW z5b%V)Vg}s*eU3x^_p9@~;GNV+W`J7Q1?qJV(c^p{&7F(eM)g6`)!O6?+wB~=jS)GF zz+PDqoxxvK|D(J^h&80Kb#&~HBk7PrNUE3eO679}Ut&yDY-wU%6f=AU(k8flp~Ak3 zRqO5^3u&2vhpv}i`6@Mqyab@IylXFFKZ{93<~*<$Aw`2vQhml3EG1E;o(I|ldPycV z3pQqMm)9NvuH%I>i3AUF&H|p6SuS&tf=~waQZI%`?2t=S>Age;7lEe^*pm8ZCEmBrgltjF28!J5FH5Sv4OW3c zhU8%^Jsi29tO0Ex?ER z|HtYPew(Ka3i|(3gc%Nj#Tha<`-LNhz$=0J2n%yV8}2cg4(J8z1T^5A_}WwQPDeJB zOpbiJyg2^rh$%vcT!cn?*S;Lwu;?=Z!}fbG?h_VgHiiU&5(8OQG#lvFI*?vtB5~MY z(e+J@73v~jtvU_n_^7Y!?EQujZ5|!c(zi9`s}}-GN-Zz+(7BrWae?D9WK}czatsOl zIAsEEqQtC5YyT~(oNN%oypd>pm5APbu(3I!0tK8>c8&utAgDvsD$)$-L5Z8C#lWZ$ z%Ztp+8sV5PJPhUX2}akLKefV!cqtf>G7=K3!$9A4JCUTi1T>QQt3*C>1Tw@XD-3fl zm*-%=&RzuYiojYZQ$1b22u82TxI>qtwW3gi0d(jRf5_P!yF&Dp(T ztIv6w?XQ#D3=&WK1@B!lQzo+_!y5ss;ixFc$H+)yM6LHhmd(X_4(l`Mdf$r;d`vE$ zp_wv=U#vubVLiLCX zgc}55f+$exo|1AU+A)R@V`3N(OE+E^2gM0hh$hkYOi3Kw=6y-(HjFXrhBOi;>d2Sa zAuHSdqR6wm97x`BCpp`Ak?f#em*j>Qi5PWbma&cl=VKN)3%0ry7_;@@^!HBA=E zUzDhlgF+K2R{2f`bNHM#!G}sip+7r2QO1-EB|tVMs&6pP(b2B@3-D5Xqt4S0otw6f($k2x7EpclC5d7tOuaM*l<tvTO>e%A(XiZ?yqMgqs@q*dg=3mL|frGM~vdQ`~R#vD;q}X!Vxv#2o#5LEZRQc zo4I+fXgYvG1dYC3oY3Cm%B9wp3O3*hk!+E9WwLM=2-J(gQ@A1zS5pN3yJut|k`PFO z$B2Quzo$-)sL-ZVF8b#;SOYQs)L}FVs=U*jE6$_nzz87Q@dTTQk9v#rYl&!SOw5vdX7581w=B#XQ)NYe#3WdSpk9m>VxCNEhRDa-SzsAa$z7A zrJNK2kW;>oTK%6cQ1Z?6_Vh#vAUP?&(O6N`#-a~{g9bIc4DhMWEz_1f9*&=_5DE}i zmD+pbOndKfFK*Iz75T$&UEfOvd@N^%9th{ph~o&lj??R^x&Qp#=OkPyiY~&q_AJHyWn}86k!yu3>G(?`kmia7NsyrwI{pLGMw2q z36}>@3+7K8Pz6grA;_c4sJ3^PMvZ`D%gpSRLuNz5$={Kg?{W_ZTbtfi5#LL=!KdV# z+MF5B4;8x!W8evnEx#}(=+qkfxpLu%GJ_0A()K@1WOW6ma5X7(>?|BQhXq;*vte0_ zK-a(JZ2G`6W6WAXaFxbP&@PeXT!o$%pP4j4L|cq~%~2KM1Lg$gv<^PJR`UN({LSiQj z+iREK2BUUv4+or~UQ!jJ6$)#Qk()+r7;raYG0QwrOUN-mkyrmeKX8JrzTioFi(^j{ zF(ymX6#V?im4rLuO0I?v>+hf6#mGoRqBGc_!4OWGSt^la-+ZPjZf(R7wd|E4%Do!6 z;lGc)5hL6Qow6>KPdh2n?@CO&X6XP_-*F%Sa|O<{(M@rv-ZnXB9}X3x%Rpl{BAu*l zI7riH!K4cx)Jw!vDx7%@WLwBZBi7WKp&wuw@^~j@3yA*sphv9rg=&)na=A|G0{aOc48@*PU$Skh;xPN_T>IPAq& z;!zmWW z_n6&)0qzoV4obcBYPA|D_$Ey;AZX4bSY5hl$gXc4zYxR(9^mqz9m2^|T*}Bo3JtCt z{NzJ+3nJUHa0f`eWoC5Ots#Z8{mCeV@PG^M9Sn7PX2e^=;Ue|P|xSEd5^yK za>oaVc|Y}|N$%kj6bgIhL|hAF&~w~VRfMnh+S#WXwblE9XRjQK?v7B5_yWeOm+zgu zvZIeHP_|JX|5TIe1=Lya;8O5@p}Yfmw=M>KmF5rNR1jagP?o}Z3-gsCk8(wTmKxkc zG`c=HAx+v2MU24}XTrhe1HZ3K*rKH`6`OJIy=@MnZzLb2z1k~#>9YZi@#cLdo zxo1f-iLCO!)t)oSW);!W&W=Q-Mo6H9QHyZEjM$?xGZ^?&bRIb6p2lrD8%q)^bp8Dm_Mf3MG-w<>03lUz+j^flU3wYl z`V+(wT?xa{m7y#3YQ%laK#8C2l0uS;&qn6A{b zguzXZnBFnKca>t&_4gYWWKdm2rcVv>TwkH&d5Nk=A~0U{HYTTS-8Vcih)XCkrOq)s*jcbBjtu%Tf(7 zT%)%ToPUDce8`rTnQ1r|2)N`i;zY%sC98q6 zu)`1zD@#Q0LRQJbs9X`XFS5D7=+U2>^xtQJA%!$E$>u0P!(QMd;KBxOKsZ9Ok>%59@d@~~I_9n7DHc--zome4V7Wn>VaH7y!?)y{L&_Q9(kEld&utJ%3PW~I?pR>F$@2J=tjPj;`f#u{Y_xUtR!vm zAhnHI3b(ZoJ!tf5^5!`SH7rN-Gp2N6wL5QJ;397BuCTl}$qbhzsNSZWJ@&Z@W z!AQr10;Q4nnWGUw5r)MK_J#bVE=m{1n4qVnz~X?=3A*lyV7m$}2K?H5%fVlq|4AgwYFZUmla}3w|0AvG84`55#CF8l;AqQxsDF3nM%s~u&rucN92!6^Xp`~ zf7J*$t4#V5bo~t&14SB4qrviA^HoqxQYU)Amth}D@ki#5q3c?R5Ka>gS(MPV{VQvQ zI1g>J{IhqDYC(zlDJ#=7^T8P6(Af*Etf@al5)p0vP%krttIEl77=6Y7vCyqh?&8p` z{Fd{ONu4f@3TsO1VsTKDVl|L<+1qbK?*)0RvO&w$+f1Qey=3iDzt|W{sMxMU-DJ2! zyn;=e%0pJ&3UZKbKPj{H@70;`BUAwV3F?-fX7uZz%Sy}{&qUd(+ zsbAJV^lAirKoc`^G~w`Q$Qmm7*3tch`(lmOapnxXR-u>f~Dx zkwwpVqUXe&b{4@6SjT@pACOdipC|c(?jq)xN%=Zd-8nr5wC*LtJszpkce>>d1Ff9BU7P=y}0H!mP<|AAkhG^FRQpaDDN{AjVCeS&1{{J(7YkB% zLadXvjFHjWBln0F{c1{;|Ln#s)3JI9&l`XSie;?=7Ysi(AxdM$QVAt0h#pEM)!Hp* z$*Z7GCq**YXjz4U;nD>|m5;cF1^k19=kHWbM5*>{3+{hc5KzX)f-`dcD}Xg|*JEf2 ztBLNFAxj{4PxXC|+x4&W`cRfh z_~#VFy6RTOHq@5T|1$n9dQOL9$t0@cHtH2mya1oQtG{__&0%MD<}fM-J%|cVdtu<$ zLTk!)-(1OL)QTuU=p_g{G&EFmRI3=BzkXtN1zvhLOnM?pA?P&1``C`4+;Q?1)UdS; z+gt`1U{h)&EC#O@mN#~NDCOIiwr$EK23NlM@8~@T7g)`sDVOQa72~HPp11n>W;nSX zhlS(wLG{%2TpSun@Q9ey%8J%`+M2FofR8S5eX>PsLs6RfWX6(EBP{#P)BpC`qYeA7 zz0B>zvRZ16IP~Gau1QomI)mb5G;z&wE2Nu;N zCo0THd^#q?U}kyrU;n~v9i}cl=F~#cY>0}r#nkZQGOlv zAua0!Cye_|=3Pg{SW;|}9oap^L-t5u;cp?$$1Z;zMpIw+P{R z1>%+%iCPPjs}Qqc)*V?5RU@_#exXh37ED->W;rDZr^>HC>JC~$Kk8u*OH{sXl6g8I z6mHeuXDHbSxd<&bWRIh7{-NjrVtwhyTE*D7h&Ud0@{qcf*`N-svO|`YP5EI_&)3a& zcC1S2|AcYD@-M8q8-4MpYD&&o^5X_dFbwL8t78WL3gS?)S8Ox>w>_zwGYiYh3nx*o z?G&}S~rtcQ#n1hrWM`(P}_(i<5FldOFkbEgerwWVQM((-lgrD{5fJ!~or7>d%`7bAqn1#kG5g zW=YxBPivrm1_>9@F70}1Xrm~v%*jdVUj#N8zW=L9Y|X4lMDv+3w@O`w{)C4<*XdcM zWHU$;z=-fMZKc=8Dj~D-juK4DhXcB#{_g1o$#MK}er2g!%Xxg+kavdrT+Af-)o1@q zq9QVy%y`=`Ef{%|EL++l^bkem7`c2JGWRXs%pW}_{dSm$2`KU(1I$b-6{a!##^ zw*sohwVp;`Uccuyovc?_{^887m3Tnwu^Y4%!c*;EuX0o)kt%iE3iI=Zh&FR$Pe@Nl=aAu)VKf#a<49TLCRrYto_qbg zdLpbM?0_eT7^qL;D^;jCy9Vj^(l@(1F)Oe`Cw+KpQVY2dxsck)Tl1#QR9 z-ZvX+zm0NIJf@LWXA#bQ!Nxq1Zol}t^sW^L5IZ7`rPom`hBA{{VVS1CgG@*;XhE@fAPbv7AR~%k80gl=#a~?#9zvoFXcyDB&&VtnlJzo?fGQ z>AP-7qZi9*Z#TgOm8e+>bRW|XCQ@7x>JG8@Sn;Co9*XL|nbN&UjC&pi#Y}J&3t5+& zzmqI!YFzQNF`EpVsa>b;#qQa4KI_}>Os3yV-9FMyRDv@VJk~s+EvoO=51aD6J_g2J;ra>N#(>x9Pw7ySb`tNfUV|B-+duGON zcf#I}T`)-i6&uaZmhUJ|A!SrytWcS1m|oQ<;;2M2&~jb1wn#!GLDYE=$)dJ%z^ZQ~ z(sCIJF(sFzmd(!|wWf}`YjE;eGVi-9zic#{S%_zUL^UA1?s}9N)y>`ea3grwVY(3W!6B3AxxZ&bV>F^XZj!b-P$r6P6hSIY)~u%F#u1|E z&zf1Tgj7cDzBGq>3@S!mzB4l_@+&A%^^;`VltLHnIHrRQxSL0_Kvp!-*NJRMs zU)TP=E~})`jw?TXiAJ^zN8nbsH%ubSF8e7O`LRiRYld7k5qcJC?xpbWi*&@GJExP> zi@(tm^rqYJ+%4rtT@H#5dB2NGRNa+>YKD3@4L24oHa3;UIySAwm;*tH`mO9#f)9JZQGuX*M@~sOE% zY!_c)HZB!ISSiBeUmHLE0ffmFQMBzj2Aq;Hto59t$(bYlj6`N67QF3k4}o|F3BAIO z8eS=)8a}a;H+^K@nyY6th98-(b<$mtd8KpZn{%YYt*L7zlsk8LYnocV(Hbn4HaO&HcL23JOL>O|S ze&Nmts7k!`5fAzZx&ypU?$jbqR^dTP2a`nD-zT8PY^tnM`~0sUbi$Gt%vHPWYl-+J zi0$n`aWHLEb>J7%lVbMFLn_-{?;OV*EmhoPhR;|FEUrg}+JHt6Ya`6I5*OU5wGS3J;S z(|LTwzeUMUpit3=(ClH&i=QsXXrqARe0goGVSxp^QJz-w&*>~_%2S#Y{a)B#6yfA{ zG8^wJ*JzWWQLenPNKJZx0T`lBS-twrv`y4+u$c$o=Eda{#R1+7?TCW5ix8 zCUAPulVQ!InBoj&b7N82q2;<>*I9MhQqaw|QL93x>}tUw{BV&_Wluc1@l>xwpMqDd zZ93wl1+>)Ekgkd3m!S`e65fky6_@@j1`U0{wPB$2>~@6W&DbwJJxjXK^~=Y3W2MER zcss7$$78xX4P(sclH|lQm6E@8Zhu7_`nc2E zNmn8dcmcs|En4<9Ky7?K?A%FWLVeQf>f>K*pxy_tI10^|kO4Gl_LF?nnP@ml^OaF5 zQ8q{CymZEyG6as%N>#l9)C|6PuHiRt;p3WG&nxJCD_##YyX)toVSnbbwkFw5JAf(-+VHM@9f>KNNBqR)nR=J z+3W2B8a~^W>d+#`Eg{e@5b|y3X@DJSlzXbveP{EEjc}!6vZ=mf+O}u+kFDGHMVv0*GUhzb zdEh4mCIdn2EmRpl)C&fO`8$aCCG2$YSFM?PQF47uUg9Yf+PBSf1#~~ILRNW3ZIA74 zG29x>PHk(CxC+~wvta`g*Atc6)FH~1ZOE=!jLeE#x*F=%|1l#TQ83aXHjg(j75%)l ziP7OP*FBCdV_M0*(CZLV~zY6gO>uv{lHMqa=%zKf@ zNjP-_|idPt8t^J~K9uNSieEF4?XPNql&7?3c z+S$6&vJYxG=I*$>dKZlHmsJZ2FyHx;9yI@?18`lh#|-KOhz3 zIG~R~@R~MiHH#9b-9@pAW92+p*%}Af+H>SzzJz~MQDFJ#wP|>T-$sQrHR6wvhB4J=r}Y{o`*OTu>Iy)#rDrX9sF6;SnI~4s)U~rTXMOOO zpo!ZvyDNGEh`lSGT$cJ4$Fg#lXlXuPQ!>$ z`#Tlpa_TEhO1HXONHg#8k7a$#`%567t3jnRm~`cXkbxLqIXst$sBN>`^u$ zg;i$l$Zx<`F%Ef6zbAGaRm~`Okz;gALLbB12#FysJ1SFBjU3;cz&Q^5)v7FVVv-j; zr}3EL{(jw8^4Zry!DjgvA^N4u#-k5-zkXCa&U$yyAG{|bpk6!gd5uzkaj4fW5l;g)no22rACY) z3^o=9DrG3pN(jIJK1`03ZSP$(%Y)QVYwK$a3}k@RlAnA*-lp!#xVn^m>@ zp+*P%gqM(J?|pRI(fTISA?U;JYd<@U(5<}IoQ#<8$Hhs)1xi$|8oB5_tMOw!Dm`wd znP9R(HH1F5tUfR2VGN-iHkEb&B$**c^~$RyX6QEGHGkNtOfRKB8cnOa6CUF97Ic_K zMLSMIH?hJDG!LtAN7{Q35dURvTZLK&fpDfo0J%wCjP2a5`K#F`I$AM*LHv!6)T^80 zoLo2WTLvk39vJK^PN$w<5IDXrcEjm@Wmm(j8)o3$+pHi-xetq*4u>x~;0}nk$nmA! zQv3Y%SJTK3d>y#$R@l^n`^ql2xL3%1M2WOk3;ev!m0Hzd1WKBFw{&vCM6~ z&0J2)pxD;A>d!EYt(&0fI=F)jR&P7aTJoV6Z#b#MSz|j#s21EgRh8VcwMH%kMjeG3 zb7KnJKr1?g3 z-15TdfC%4cGn=N~ts}Bw!AFkcM5oL7IDN?D6i!h{0uR&l&yMq_e>%GkCp8-tVJoXQ z%G{AG+PwdfpIn4C$qcLiYEgnsK}jwc20rWtXy>(YFx2Q?ylF;*~aXeadHA41Bed{B|MWZ-DdU%CHTHWR(lt;OGi=1 zY3j^xN9Iy#{#kwj>yeP=NF8TAch~Xzmwskrm_Kxr>0|rL>wIO9&Y6K;=9OAIyP(|+ z@2G`gze#koZG*;yi_D>EQiA&J6w9i?T+WO0nW%4?>sQMz{{D)yl~0o>i3|N zls{bt<@mm%NA`zt@Bi+F|F|}((SiR(C*82mk5nc<5rs`W@jeup{&RrX&pzaNb&5~B zQ5;p5QjJ6?j0r{MYL2|n(fp>t`=OlLo!pAYJhnNzq$juhcbLZw&Od4$Z5vMZ6!Kl6 z_&a!i_mt|V*G=!0?~LT6m)r@zz9%WiM`=HGK)E5O_@-^Mwz7AXd&&<Cg!Tk zAER};`ZP}T8{Xx$A6S@LUxoJCmdRmtx-cB= zx%&5KcvjG;z6_P%v4k}16PvjU#XFEetUutrs=R*|iYEr)qkS)nMt$XnZ|^C{Us^q- z;@znktfB|&!7-h+S*qHYdVKo!{Tf^%R40as?|gN2=SEjckS)(QsC5*!`N zMALzpz@%%_1aAr>Pu@>sl&JLR>kyIK&vN)YZz8p&5^VpzJqTMe7dx~YdS%5ovzUry zyqU!3)BbZkcS~zOi1{EdrQEPlnafF7KGFX}tA%pR;==SIgk-U?ttjgG0Y`({1dLXv zFJJe4a+HpCJVZ$j73>3@l@_u@?mQU3R-Zp|&+IF>V==8~_KKCFTTLD32UGtZh1&9F zS{yOG!mjSh=yW|^exxB^$30xwDZR}kA);y2*2*;>?F*;OqvHM9P}7lRpTFfGE~W$x zOemR{h}EeMttw%?8T!VD>Qv1B%kG!ywwH-Xe31$8(a$+t^B8ns;Umt+Slazghtb7( z%@R>0@8E9!CN2E0=90=>>}(`CT$hLGOKU8eDXVRwK5rQBlfJNM*OgcY;VkqJz$V)^&-dGq_)J(=MyycaCu#y(2`)pO$K&9!y;|t;37l`5*a$TMn>% z#aM3XgT))(_Fc||IvzJw-Z!VjxK4YQ)Jz$9?yN{uw)y zS@pv4fV|4Bujgy%pki-w2nz8>LiMn!40d1#mZ46~C~xOy{O z?S)r0k!bHRwSvE#O)po#{I$_OadBk&<@Pe2V=@SE=QW#88SCrfiXOY@M<>N>X?ORv zW8CgK8%|1e`b$XFwEgL_|FWix>gyj#NHLO zbQ$k0R-C;bcHBQ7ozl&k%%|(TkQd$ERDb$;nildSblcyJQZ*pPqN8i0?AK(iAm}{R z*azPfoG}(!oZ&f6o@Jh>>8|RS3-fEtL)Dr?p_rW;`t>5Z?flrhRKfMQ2%oGY_Q6xD zl#Iqh&h=1vUTkQ*YwFg8wY&R4EOG`m_cuH$itYS%uO+^sA#xeD3}wjoySFSM~hSSNC z_w>=p1)izR^j-y2y(9KhEoslKvEL?{IJnIF#vZ1bb5HeOiFSs7;SDY^(9}s z?|oULBAR*UeK)4R9AMOCdTQ=9g*=vF zUfX605z#+6-igJ1nZI`I=@2j~y}r}f9S~4+AE5x7H?#?puQPb|tvo{G2@Liw^)Qj9 zv3RJg#@h6Cr`vXWP-EwEja|#VS(r%@*mXMEo|9Afp~Y&}$=keT1TbtqvD%;P$!{4e z0~rt&*WYpF&S-Mp?pF*SEuJhyh3L@{>sc&J9<8aj-w)-3D>V3_;1nWOcSXrr<_ux>KD zZ)aZ63x}2-QSbQ&xbZ)o_ZAmu)naTv2*r-NtZ-pBZvL_c5Dm>NN+F#cvhWu=gzb0n z2KuQRHK!gv7*r{bQE*oGa=2f+S#r*`2Cq|Hrhzp_{cV|!xqxJjg#IUA8oNVv@B9jD zHHLxozcw@@C*5`?YH=|ydL_4R#O+6%TbAP0?e=+r0VD{|*FP>TBg!E^@Uv=_{G?s` zjmD;hm5~|pc`vKnZl(yPZgl!CIVZ0Pkav#0;G9|-37)Q5}NPM_Cah&jCy7SvErZl|A^+{7wNa7)voXR2U32`#Pp`+8b zEaC4#N$pt;Kk{bhqh?m|!)f!+KPa{o?>`z4FK{l$Q}s65r~346+S^tek%vD(_?ikh ze>U>K0#}32HVTlzR9{}B6<^0w$f?XIOz(cD>UNAbZ2vBIe`M$;e&UZq3m86R;hj9X zBDX%jU|;+SSuoSv8qo??EpWeDNL1tl=Xu=2gM>oY94D7%y4>_7TOLOrOolRN0mt{p z?cL7NP7Rlb>u05d{4`3ApAR^_;Uq88_o+m&ezQ>g(C3c1o%6#>@2KDosxq@up zW{zma95&Und#~hYIhN0vu@>_1#IMdi|K8e}GdO}#x(vPQ>(g^m?}FNW?AYJ*%$2rQ zDl#*L?{qltJlh=^RnSA|>0$Y`o60GG-0w7`d1S=xozLOp;_e;eCIW|77meuIE5x2g&J(ZUu)>{UQZq*uuIW%e(YMDJxzy<&L`+TGm z>(F%m^~0dSut7(!UnlRrYMK>h?>nz>-IS6^+N!nEsh0l>oBAT2xuR$PC8XtGPa3YF zF1hJyT0XLb(92w$9%?MkQjDsZbGR&5{>j0TZSlSRm&K<90ZeWJ+9lh~M9+Pd392z* zS*N@|;r$4q<2Gb99jvGO=P)jlUInUysb?QDxCBy`<%Wl)py|!sOn-KH z5~meu?lNvj^#SS3Dm@M5|I`&O1A)2EK z_-~g(>zJG^KSOyvE6HHR$vaBYWbcvkro_iQq3T4An)t4<3wc7LA}V-B3;y|=n4Kiw zBpegmQVpNh`rR{!9_51q-dz=}=&n76!v>iXhHb3Tgf_30Op;{n@bfe^w~ejWZw>YToXpw(H=KJ!H^jbI zkNX3&y(_vJz?x}auInG3dbt8i2-Xtvfmj1pwBfu^>euLua~GkENO_9A>ucml zV~90;?li+Np^i+>y5lh_G1W-KXCu?~dgV;FD&|Bp;X+_e&-E78K;?b>t<-O&E@*T* z&+#)hsm=SOx0u|UqY2aiMbQab-S}x_&S#Xq)>9PQ`u0F&)1MBkllgbCWS`@Y07wTP zu60(kIc?15`>|3 zJJ{(q+#+bzuIOE}(A*iZ&e1W-{T?{yz46*;JU9#?x$|&!dGm+ET{FPTHrJ&T#tcoD zarKt1P`st=S&JLbj;~Cv7QCehu>*j(fNCRSD$MY>CU#0t7Ec5ys*9c&&@H&_y@(X z?sPlp&1;@u)@o?FRuubIWJma;uvNh57yt=q6GiN&j(zNvilpz_QFvM)a(L$LH;x@( zfNCp-c=~u1|L10L5mmzJ0GaA4yULx|7w>%UgZlr6SpM^SmoGj{c^rNPk;l%O&wpNl zJQXI(MN}zz{cxV^*}3xu(J%+pBgcV5yS$E9w`Ce+I(7BjHx9#;_SsgH=9XG8J-0d= z7faY5-@CNbeSe}^&q_$it$D|aveP1dK*&CQLL0VimJ*w4ejk&RcqUgsNwfW z6V*n3Kc%aus~4AG4W8FF&=x)sBh8;nc-K676N!<$HV3iJf5@Qw9M_z>u@Eard+KbZ z^Pk7JI5qK~0?0k>qQsj=FRU$p?Vf&|8MPR6x>WzMzIcW@&+x^9KfP+NVYy{-3g;c` zfC74jsxgN0$KRgL*13fv#YQvn9WTv&f;b5s5gI`6WUGj*ih^n83UWm$?u0< z<>!|yk9YIxx|* zWHbht>QKYMpAnq)vwYn79;!c1l=1+ZpZ^GUWA~$Ikm4xza{o_G8uhkyLID3{c7cEg zT4g_YH-L1R)HaKsi%iWNG}fnUPS|+f9-A_KAgOifK%O+1Dc6#Bn1>6oWO#}0G%UgL zPo}rCmIYrJQidt120`q+NO-(VaFNT-D%V6)1m}gR%|q_UF}e>29AgHdn#827O*H4> zOMfm5+{vOo7DF12!sKw4>vXvc!EAZ73Re76;79rWALazY(?w>!z(c~9g>koK54yBxq~+jz4-;4A=6emQ4bhMYhT->jiJxjkGM5|CfdaRvWTP-bAT^SWJlacXzo%;SB5C3$%Ua$A-^?W^F z&pk|@_k3xV_<21EZX8E=j^`KGSh6$O^mjrpeWEtxfV}T22N&OK&yT3O?5%?E+Ed<# zPF&i0%#*C4@AB4cHN@UA+>>$?}8n$8kZ7u5H402B^4qD-^z?S)zT zdUO@7o%|T=y7tk+XCK=Z>N7=9wXN zZ7u!dGaBC^E@Xzi9T2M?eLtsZ6j1 zPKv$K1Cc5hYjC~847%MdPM0ZW{NY*pZ?<`lcrk_$`1$hJut&X_4jP7Y3I0myX=i_! z@A7V$baLi}8cq6|TvU7=qLKG))wH2jR*uvht_9)nTJ~QwpkWRF`+fQ9JF1sOV~L$X z;T^k_gyE*fFE2(UexA?o`;eXEl37TR8Zg7SnXhW-7+jsWWNuv3Zy;A+@7V)=f2})u z;;!E+HmCK#0?)dpQQ(cQMSeqrPsX^}6GYeQh%5QOEK*3xq6YRKHV1C;gC_@jNEisL z;0t3l%ofAXNi>ps5WDIZUmNkACT|AlG(3FKG8IJ-rk=izjNPBkUY};~}#TbI4cpAaj`MuH0tnABmTAbTH5qYKg+qczU-dcTs@?#j} zjE>})PltT27{1smjhfxFsL(necpGsUVnA*^s$()BbKdsjEVJ6k*s7`O~ zY(*$`?c?lrE9Db>G}wd5P4uOuYE8Wp-%`!2wyWatgcZ^bWI^C{sPm<@l4Mb+qjYMC z1b>Fz=*(y6nx#ZD_tF*G9ma7PU9f?~)rcLD8{J`w&*ps5(_*y*tAt*=!27ecR=%^g zv;vaOw(jq!shs9wwPx5qSXpSb6qG6?#pOA_0*5LnRJIWhewX#8{>@D3-) z2YiG7F)NyGw>J&@I6HjXUMrD5MBX~F z^p=n!hGClD9J$N$)Ll}!WZ_JIC{k9sT(DfsQKU0ag5P+TLpjqFsZ|`CA!?8yYGeaW zw+Gv1u5~+P|5(&uvMZ3(Ep5lT{dC5v-UC^jAZ&?3i6<@vUpzU<3+JjOB@nU_$R_=~ zPr>Zmz{7?OQ9f`{Oh!W5AVIHpla!@YU8?p-3L`NA&kk_YNoQ0) z4QBKD=pE-X`*ntiHB{kdy!|2@8 za;pR6O&@N6WB~rze!zr)lvKakay}vV)(=x!Ag#ogsrQ6M=a4vR@Bu-DUUdb^3VPO9 zbWq3SR$p9&ljxvRWOTLjK`&8mGN8aJ1=J8UN{Vs(2$I!trq8!s9vhmtqP-yetmOfr zE+RwXv}<*7R9SxIGZhs~!O)>pu!1Q2)#k(%^0p#T+G(Z#CL?__d6NTz+HWq|KG&J1NbKSm%mP6v_o zV57(BD!75xTYA3pYdne;o&E+ok{}rWspzB@bd+(PMCNy%QCZUyqvOX;*OUs4u^zbD zc^I4E?n-U7U`@VjaP{+xz&=3|&L>!*P)#hO>>-S`+yTK(o{z}RY#}vtFvlL9KxiJ3 zt&Nih*cslSDy2E~2>gDMOh(?~DL2t6P9U%M3-%pcGw;;0bUUOWj^cr9vV^c%A%Nx2 z&ah{r_%Dj`Rbq|#J41JzmN0=_DNsq-{wH9W)R_D9y>puCNCF4RrIVAKpw`ShV{sa} zAm#7DA6K4w9xiZd`hI+bCb-ideC8pc$1GvljzI|a8!}j`=&f*+ezh*I zk3I`!r>x`k^+gT>!0kHDR1#{LLG2@+4yxE(oC|X?$x8&q1JQ(SbAoOS@&3;peB_!KaR+EMf^5e4lt)?E+_mIwt<#HU-iU?gtwD zWR%VW7^hMjIBSK5rBE|PYMIAnBqolbW=a%qH69-3P)iDv|4c!dev^EGmgeoT zYK<+q0DFpBk5UrYvJ-G@Wa0C)&3ZT}&+HB##eQmA^Pnxo#O}!kztOR*gxxgc} zX`bc)d#)qwVsUw27y)MV(_&_aqffifz%zTO#cGf0b=n>xm-%VxI2D>1WsAJo9wb61 zQMp%bI2%B6dWOwtsc9ITb_^H$MGu^_pVmX!p%?@3AXYJFt%r2lMv==dG-*mHrGsQ- z!wCwx(r2^GuToOU*u|-@fLgQ{O>(s!0B0#YYwj4vv-FT))wmGA=yDc!b?j_RHDMT5 z3*C^KW>55x^Qi&C!1z0`glM5HdGv9|gj!?MHPhYY+1iZ{+TdKSg_hRCk|6hJ;h5e9 z9Z7CvGeU~NRxj}3?F{O6Xyao##7wn1&hhr)11=I6UHE$ShVPJmx`y$T$&D zgl`?@40Cgw8N$5G(U+q?aRVRMWYV74k}t*R6D|%!uWuY zf{>&tmyqH?-@C(<&y<=7u>6lTJv9Bh_ST3ANM;(02da2EA>42Bu-IzViE`gpQLYqYc8H8_7B(*aHcA0iq@}bqwB> zu>ih+#t0WHouuD*YKp2sryX+$Pk_Tcy12zXatLROyI&7Kdd37i*0vi+S%wXXrDNrR zPD1JAD?T^rSSBx}D`Sc1;<(d2`V-wTWk~BR)jeUrXLMh;?Wr%*)3|X2Z@Qj=(Bgq~ zD<8?7E4iw1n{@?fRDhMpEew?v~vZQ1hPfXKwpk>Un3qaKmxMz{WOI5&ZaQ^e2jMWSl z@P(Vc`1n2`_f$+>#_=r0)x&?ZXUBXwxk=dITJq^MJDNt`=Lfl${LOrAUNy6R2FXS# zVv%=6h8x|kgO#ctkvXBs@DcsC5a0H`*C`-{yv>Gw&4)W}&!jodOt^7epl=wRofh#2 z&#?9C3DI!#C}>Gm<1Zl&XcQg`<;hlGP#To%JTfw+fZ{dYuNt z{UKOYE(AO)Gu@S;?NAmYN-(Pxmu&6!55`QULKdzoC$1oi54Su;x_@{>m%l!%WWIR% z!)kcRx1UZ2EF*UCt9XB>8K0c0YWm(>tfXMOgR?pgP9v{G0#11=dP|gBqd9#Q)WK1C zP&cmAj?*4eL(IA>wvhpjPExXlbAk|{D;)?hbJE1{%^A|at!Gj2(@hG(!88uB5pLlT z;RQdMJ|>$$3*gpzZ3ljq3SU1ZV`vTtx!RI8V3xnpQ*;D#+5Rprk=4OU4nYiaTOHbH zW}XrHNN0Wzxy7|!HoTfqPI5k!u!3B+pjpvuacR_$JGn!2VOlgcGw$;c)la)zQN|yw z6oaL|OzDTfm=C9Dkgs&@Dk3WmEirq$J1r;|_|w{%GDwTg zD~Te*FZq4IQdQm|zN3x#YnFv^{xNM+$cmGoZvkYfn%dweItYjx*l7_rURa*f?}P-W z0OR(_$SggXx(hx4YHM{dz4nczx!ZgL%kMo+1dv^(R|h3o=O2@K{es!)+cZ7BfUs~A znzt|wv!ij*v?-3rhRO@8VD4i_?sRVa0O|&j@0`_3)!mXbqF!4z>A>bd#16*CQ0W_8 zf)*W^HO4(9>{aS8)RRa(Q^x@Z9iiw^yy|7kz~XngizbB>iW|{OI!?wv2k#+ewY(Y2 zg}g6134JW7+kgM|=j>Sf2l$y@nM;_UF_=w(B}H7bXE!ieBOZ~JU^TE;x@|T&4cmNo zDtwJ}sO;%%?i}0VnC9{S&3~IE!7$$=&*67kVnU4AhpDR=p>O|E(RA`t^`}ZFiyrdGodRw|!h%OZsToxu@i<C65FCs(FrBUJeWckVI z=SoOp7}|_$#e_{sX8&>)k0$1ZpogIRkZ+LSOJQXC?j92HM`LVR(@I6B@xm}r)6;1t zu{C{vcl~gb)v3rGlvS>md*#XLj;UL?VA?U7TTWFem}n>GbJAP0+(SoF_P~WwsCp7P zp4~T+Fw8#8tIWCKSp%cXq@uBbYEb>98!bcMPfSDQI-}qt=3!v;0Q}aznyVRtS_@ zVUkcAt+qekp8k4l$2^R|2>-b1O`n=;EAtyXK&sK^o2`0g#S%3ku-tFQ84PKBB~7R8 zl)iW2+Ve?Y?S{P(N)$y&ZZ&)19(|_ zcO92UO_znOX2IPVBuQjxwy#ae5G4y~yA1NWubSfi&3F|xnl_oBYhe7B6g}1IX1oEm zdnxl+aSZ$2o3RtF4SdA1StqX5Bgr!VSD#7fzeyDZ5Dh#@)R3#IUa$faOg2u)L?drr z=SH4_b;)cDD%ioQAspRQOugX#<0`C)E!+oZ{pW)g38Fu=icbDwjSxiLD3mhM`fg+^ z@->#ii`Rl@{k*Nd56N3Nsu*D4yvqEw;*ry{aey1esbIAkZx$_9;`s3Yq$D$_!*)F-RODtSVqRp~ zkFWipM7;Sbr#Pw_bT~17Pqp)x-Dg3ji+}WeZH|I(gU2fY?l+dwt#E(;)AmL7mgBYY z1V{Yg?@#D&pJ^Krz_p>HG`J6(*i(DOagB*2rgu{uxEyS0i5d^U8$X8`1xg8J0YnkA znt9p??hUt8*+DFrI6A3+UX}mlMj?R*12S!~op6VQZhIuvPM>a6!>aIDaSa!;`goWN zO7nfsCIqMe`(}_~6=0_Twl52Be`W%eg>+^FR2DM1S{gv5sR4=@hHOih*a{iVyU2ec zRxv(*uD|z%mj^hNj?UDx;!op;oMr}Eub9zqM_%@qOMmaJ1AJ_gV#_i-{=31}dI?r-01 z*ohse0LD+$AmcbwdK#IRUBmG2HdlLQYkO-=I^ojLBzPECOCeIy)*rZkT-pTTlCTE* zN9$E{V&UGt+w&JA>ChK7!jkFv)Wz}(L7g>RE$1jb5gOu)=NnEDpU=hu+7L@3SaEIe zdIvgrY7qV`Fy=eYbXlhd!$BRBXlh7!^0|FQ$mk$)l#Qx^q*K=)*x!iXP##!j8C~j@ zkCX#We+S%ipm`I6Q8y0b4sVqu>~Sm!O^=GODn{a5`RC(QvFAyC!i0zMJ5x{PGIvX67`jh-29TA)(cY=l~pMYe;^ zC&<4SIBU?kDEC1ZSt0I79AX7=|A`q9RS_cCzvvd#B`Pm@c2jj*+WRb`YluG%P}*!e zXb()--Divg7;gG`zG>=zil2G3FVg~TgMbbJ_Gu>k5d6NW(3NJ{$kT4@0HVIS=AU-? zab1J}(CBCZMnxEV3B(Xi(OP1FoiHG@O1YS)G`Fv=}?EhCe%P!KlFokQG-m?P(XfO>8W4b$D@E>>@-ITo;=Elp8ocz zB;qjiXo!ZeJmMPnA-j@WSrFnI&FrhF>?uj~<9BHkRmK z;QlKw)YmP)DKmyy5FmCE97q3koUUO%tKczU_KPd;fyg zikKA<3o$hK&r$^mt@C8+O`&L9A#-+I0A2kMV8Z59mVe?+VGtPcmqXdY-PzI~kxd4W z`wynDMrTQrCfB)}>+z~M1=v%W(eQ8ZZ#v~RW59@$3v7_hcsqC+Oby2C;55mJ6)ug_ z68uS5NJI@9Ped9Zw;!3#uQ8VgqMN<^vkW%Br196{SD3fEk@J^*0K;^_h4MGOXWwq{ zl0or6{g_IrRQ_4!eT!4SnjD!y@_@|&_mqyRj8SLPuoO9RQpY$&Edmn8+j3UnJ`i5F z9+NHMJ#dzn<}&jvk_7&S{mWHdKZ~2g3N8F%B(7Xb=qRM9QpgmQeV(?3M5e)4O~U?ee+5HzS zt5bdico}Tb?d;A{z$kte@m#MwgiaOYKbnV5PO#W82ylWP1N^@-{+WJUd0PA^C8X+t z5qAHky8D8U84tCH(v&Ej$a!MN58rmt!eG=_Us4ipLQty{1xC@Jm<L&PyAWxETlcVIJ1fca(YAd(3# z%&_nrP&dIVM^o5F8K~LYBin2ni!T6jTFyXi8H-bad0QY_bghy(%y{$K?K14b&$sCo zo$-;__XM0EXq9q5Vj5oqj8C~z_3D@!V1qM&M-$c}_{9&~|LGS5ucY_<1A=+PD>n}9 zgtyW0kRIpWs#!ncN{%RzNo1I3L)qJfjwJHX&?l<94TIwQNMUb^m~*)8GiinH@eLMK z3KG;MJD|1RP1V-}BasX00U;1nN^f?U$=a8k=+cBvc>v-*TuEK4NAn*m^!!IA@Dd9=h@TY^Q=JlLhlP-`&*v8icW_9xmcefpmcRE zl_U(83sffljEILyGsML$1p`58f7lpT%j<4?vOq>hvp$9+xHJAZd0RX(8efMYoBQv} zhG1C#94g=hs2e1IFGpLBn*T%jdLP=q*&Y-8>( z6N>FzkH9vaGw3vdg>knmBPFl;&<(iszss+fvuF9W(y+!oQ?=L^akX3arcL?|x4Fs{ zy?M%y_wS|r_iuXx5|KbIfLQ95Umjb&ll?pY_pA+?6QZV5eg_R~X#gkommD}AIRs&X zk3f3hT8y^O6rOPaAJAR7z}!Gdpp?+1lKpY6$adO8W%%<~L3tN=I=JItO(Ed<@)-#a9|8KGWK9rSwq=_Civ+MoT z7p!ODsnRdy1>4GxI>wOh&=AIr1CC~QYaDO;bw33kkCi|!GaloMD($8g%sq6Ld`Mu3 zh)s)jD(3o+cJOfg34Cyb*<4JaHE?xulc@-fIGO-$j^en_8s&Me_5RvY zps*{n$tIP+Y)0i3$wHsx>GY&gI<+jgJ`m(Tew}k268UaJErt-?R1a!{`qr{ zr!q?FxD4$Ou|R&wER~bcI;&Hz;e7$Uw=b9MkD4_>C+jZtV)F+CyUu&(46z)Ge1qqX zND~<@SfGzlh^!I55%v<{ANC3cBmOOEq>OAhTzhyJzM%mc&fo9nANc;F zU>lLp(Ts0IZLlxhucu4S+Pp|;F}pjXB&($E=BI@)nkLPTQbpd}kQq!txI^4Om%sI) zhyZHFK;Hat@LMKR%Jb_t^_-yE=2sGTn3e%h2>WN;}}Zyis)OdR?#|z zDe!+`+!|B{Q)EhlC*_A^nt^~)R?KSLS*n8cL3V92`R@4CNz@E%#)U8JIL6uHn;4Y% zd^yk>D{H5qAMRBBC+zaN7o?cA_<-cqlFcL2J^hzy*J(x65O-P+U2W2sM;U%u`a-s` z_K~at4rC}m3}D#@-suNG+3A74f_GKcZU0B8J*a$Cxug#fsv`*tfexo7TwXBIYcr?p zIn4xSP{(Ng6l;Fl@WUIot9Da?$3u{ec|7{jY!cXDIpo_f0u#soOaGm)#R-?N>8GRsE5-AUOXVPEq~(d_&Q@t z66HTQcGV%x(KxU2f_v5OIf^r=|97e~J_VEug@bOJSf}yv77cJFzPqSlj@oS3GWIj* z9<#8alyY}F5eRDI48mEz{KmdqKM30KP$qyqTJt#PiKmUHz2%qQa10F#0U!7kM&ozd zg|zWQ%1S8Xc!I9lm7MM^;D&&``Vf9j2xmZJqWm!LtpgUfQ{KEMK5F95HLcvHA!rE% ztDPBcMKfhh}%X{jiiA#e8mDZzy_s#*a zq?h>t&J?j2Lkprw(jtI!*$vzIyhoMfT4gOVEPbQ8Js0>zV^KH83CbKB9OY-UlDi?h z8dP7Pg6QpaY!pQ77WMigK*DVX+SadA`Khtg!Xnd%;3<)8JNJhTIixkEC>y}?b-<^F5TpoID zNRrW`)C?x@yx7zqkzW?Mt_?&C;A|I+EvV#XG zBgoaC+-cs^biZ zNLq9q*DON->#fq65YXz`jjt(jFwt;m`RkC&VOmQ5s~jo7h4c zrEh)y+H_bVKBsi#&g=#9W|iWtjP7}j=|Acq;y}5wIcyGDA$;Qa*aqY4z>Mu?WmM|7 z5F@AY4+~8^tHta#-Sb`n+kzW6oiZ_$&{Y@^fb4&>+cZBSPq@CEiBG{i-QA^b>uSx} zoDCFt(j$+{p*ECstCnSpF7g{K+_4{XjXNyP&!H3+XGf)a-3izWAr(kx3cLUbBb|edWM2YH_AIf_-l|!*5r(5`( z*J#gNaV<1Irx~ds!Z_+}1hloGCTixR`=$@Zy66>%YyX65mQfvfsQatS-Fx5s=?vli=DV#@74?Je} zgN8BKaLbO^e*jEtYJTL`)(myqJb7ps_@A0S9*3K|D|J!1@oH&NOjwy38R93ILr9CG#hgj+_#WK&7r~n=AZ3)3D zX=TwfCr1xgXq09v=Dl)oMy2A%T9Eml4C5UU%%ad#>bgRst>2?{&VeMOGU=mV)rXWC z!>)-bInEeR9vij((P^_KCCNrB#Aq?iCy`A!W#2w^U9fJxqEqQ=3FuC)(BqE(DEx9) zw1^Vq%F$rMpY&)@IdW!4GM*jJFA-nqb;;{80H0gQZbqXwV(?S#k2OK^=F-8LP5ZvN zI(#hSt#F@#V6jxAJ5xW|wN)>~PS_AtdI7idRk!-YE60=3}xF z$BEkO_3QyfU)Drvl?3IJsKKJ+bWzAxJkkiYaSh=!&qC@Do+Y?6kY6o8`mN>aBqEI> zJTRM~`%->fWATr*J}SBGXH;UUEvEv0WVUIhj!BM`yPacH#(U(oz}>Y@9(%8cgf;v# z+ZxqsKDV`(8(b93&&YSwZ$;gg%NVvUOl75$wcM13&cCC&AeR}6s#Oy^NZlS<2a)SA zUI;HV{2euXa9Pb{s(QZO(}_ zTa#|8isB7nysr?rh4_nCCv;keaVLigIIed;-UzDfYgm?|g!|vxeS;5HtCPWa#S=K; zC0m~+-lPX}#Z~Q z!3t$HJNdLamUfq%evK~3uf6z|Y8&6rIM)pn-?uj1>%azC_qJ$ecKayxlS#O;>i8qz z`h^$+iRso>7jk(75S1Yme>Qd7Q78R?JL^1~yGbDGiPm$dv!3IBLpA@41!x1kVlX}+ z&0YfRXG-I{H~SI7M^ zx#Z*zeRC&Gb}Td>1l>^F#M6#?nG5o|-WqvNscFd)14@6?smQ7b6VTRT_0nhk-O9ly zXql0rXKuh#5|_Pwd&8RcmF_bxOx76v74(U4w0>UQ6!SA&i2mr#&H(8^^kc6i>2BMz8R% z_iwEuK(B=hj1|-v9{amns_f=YLaa8!@(qJGivgn3wN?W}R_rmpc1+zV;=0qyxB44> z^We$JhaTDx@OEnxXs!hz4vb_KZsq4L8yd)p%gM?0F)GCJKO9bxC-Vh?YIVf;qR6wr zz7LL3GWx6Q)7{AB)Z=e4R`(%u3b8*ymw9PjxZY+}knTrXmVrjm60<@~=Tj%H@EI{d_t+&l(vdAB!touHq(QIF@>u>5 zYwz@UJbCk=qjZYiVmzVcvRHVU%BjL|#bSz{u@C1?%jHMwn=C%)QqcAtS%QuyT*Gq$ zE=?wjDR4ND;_-kHg=h|~l7;x>F#LV!-Hwq!Z>{WoA58sE;pqm%%3J9Pyx2;l2aM7P6hVfDPkXGC` zpsA&vd7pP^p*XR_T24ibSga<_PR(u5yHof#C z;TO5_A7MjoT6Pe=^-2n}$1E@|zimhZLEwQ}K0Un135WL&H@=ZE23kqmO+VJ$M84({ zhKsj?d_RAkzCaO9ds_|P6+kX}Dw*hD9}<*w+MZIhBnH+m{POwf02-BKv$ytK+@|NbHm!%Eq3z}m7X99P1?}t-HZFmrc~sI5n$c4wXtI8r0`eA!6Ad{nYq?eyOD|h2qgR=#q|Nb-F+k(i4 zT)J}NS47#)CM5VAdX(-HwX>@{(5K+<=|7Q4UYK3l8JtxxFEGydtnng!A=Lk;kE}QA z*iW2O&M$wvqgHvUi*08~hTHXxa;w$jo}E%ycIjvl5z3y_7Od5KGY*EAa;gwJuH_&2Af#FfSiMY)VUPj zE^|AxKQWf58#}W{-KuPC^R{NYt?A)(!~JjN9s!M?F#NbzKRl|?W^S2aCAfjfGi>q{ zqHzxl9f~G&OEljb5G0cI{f*c|)Xy^v(8dfJKwEH$O zYe!GUrn5hgT9H44cTne$8nH_J8m~vf2!4MQONG)A!@Hu(zP2 z&*wh5)jZ>`Ad<$?V`rl%Iv_HPI3eBMZOnzXT@+uty6BC|=`CQeq7kx-j5$CUMVrYP zuJAEaEDe3U;=khh@{&RCyBnsqd|N1HLnt*FG++b$$sB+GDY0VL{td78^^(Z5pEgIILXct|+_$AW`ga`#`z8w~XWD%jY6ig`b}N zosf%)3`A|9y_JArHoWz?3!$Q*Au0o#32zc;5svsNSJ(6-<=;r=B#0-}379f=d6kPh zQsjT7kcP?=J5EzHOD2&q-BaC+=jdAirWo<04h^ILOFC1!XPn{B;U+zik1WV-iO9_~ z4xPV4L`)D}dP~p!JQ6XR=gjcNsU6VUzA3}1yOMy$z+d6h`6 zy~$kRdn~7NDsmNH247eFpH(@kkvn1&---#W{DG4X0q`UwcDPa2)95iS^zXK6BVIz) zAZl=arxol_71ow9Z200$zO(LjIhVvD>rl0dktPa)(SM) zCT|K>yjh6?j-49_Uf|7X1+EMF*upEXAa+mOY4w-GWTRv13{rnW-%ZKWDhHRDov2e)|3f}5br_X-n@3ra=*AzXKT9wObmxEfT;U0&RUuOc*7{;*t~fE9pnL~^_@Yt z*YL;VY|!x>e(HR8Uh1|P8Zm(=C{cq%hE$F-vpR_Ai&uL?4q1s1hw4imR}kg?W)%kT zj@$->RuU+X)&k9G0_I^{>pnaYpnHU4g;m{Pip-kxAjdUr<} z;c`p|1Rk=2RBt0-eBK=pYvel)nx)|e^Y^_9xr&+Zs5Pk^pwN`Zcs;u}2XIqbpm%GE zF13R1QBYR!jiY&~TfF3uyf6Q}5FnPj567t`;#o3t9cs zo&9)NQ3LpiNPn}SH;c^MYD5J-4g)^Zc?oIu1gx>AU^Gq@cY!8v*Y_8ktyd5)FJ0{| zzQR6sKtTAc!wtvs%jD7@klah2)-+LC5_5Iju~d$~@5{x|VFh-O@{w|tEScN^n0B7Q zrzSnui-?zSJBB7UD&r_(p4^ca%lH?w`tLG3B_sB}{N04M3F5i#QZR_LS*P$`{RXmbww&@B2_>6eEfob}3Ya|7{#jt5X@v+=cji|@XsSO@QwMm0-}fF>@wcEUAWr`?yb#n#SCXoQwOOl z-N=yKf6SowJhG)gq?W5T*7U(Hk4)HsBvt-^I@K^Q#3|#PgV%d!H-_@R)b~CCT{qa_ zWE*0K9`J(~Qr@utb2jS5CE}+eTJcqwE2_lsHUGy&8Qm^bPX!Aug+MTaaV3CV%;=T% zG9PS_q+mU{KsXsVc@S4i0PZo>AbJPndO4YxY-TUESOEGeus|5iJfSe_uIC#)i z(Wz6s5KhbXRXBfT+e_Tx_Tv;qiVKqZp{0K9w}M5dn-w@vESocmIutPe?t~5|4j{=avife3V(I?rr9~bwI|>EjpFCnkg>oLC3~j z%;s%rH%(Z~bK~~v>bA#GKv?Nz=5DdVtzo6SR6!IR0F`_>DuAi{L^UAa6{O*o0xB1lpZ(jiFZ?C8pZ4KGGa>>X!`=+hF;tYKz3d`tT?^87lKIBUFs_G zPov|T0pDAcm11OTgg##DlA_VI>QB$mx9Buw78&92bM@EasR;xL^2@*K`@} z&v~289<<1jhA!U3OrJ1(u|pGDnBY@xQfZLh)Mh>OdSZ9{|nj@lydAs(Q+DIgf3n<9kfs3P|jE|T$f_e=^Fk* z<{s(kA4+-9yBZefdNUSVIy+5%3Fn2MGS^;*xWT+$w>{jp##|{Co_Huf1vqzZ{SJN( zwc&<%t{@n*|ACx-6-rsey5oy;Xf6Kl;9^0 zwmm+ph8%QsX>m3{3hi~j&+}(6h*0e@*FH5UWeo)Ap4^7q4u{*;=n*r;$ANWWC7+jV z=;M>DLcq{{uZ?~_P=j#Mz`D@p#@oBkjfJ!i9H61 zvW(B*hg)ZnHq4_spCtXX41ISIfGaBgnEst({a$U%=J$HlWXE97ln`xY_D&EkjbrEp zu@B$qrd{S6R3?8Jh-v-OWKfnorFR|lK?zU!MGW8nlwKMT6G699cnp*SCdD^(q&g?$ z$Op5mEq}PP-mlt%%;TvmlNfV`Ha4dHDZyGgUJa3L~VpSr#tgD zV?gzsB5sfQx9c@&Vgdf8tM=R-E`78=B)&iD^NCfHC$Bm~*O-%jIQ;CCtePy?x|Jm_ z3JxRxMlKLT?7G@6GOQliC9rbs}oed<0GSW`s>af4xPYq+=cR5Joj?!j6b7{rXG(3_@Eh|CcjA0J#pcj7XK67ud znGElrv9A?eZ5mfxUk)1;V>du|iL&3zi!hHM;?+ckF*jDiAMI-~d>p6^DQ`}1mU4a> z;QLVEKdjUr=b!WIb~x+s3F4otV$Lhdc_rN*10Q~oGFMC9XTRbLwN*9A?6Fh}tGKVS zb}zg=bQ*uyt(|jiQq$%9Ln?HSX51@&s3n9F4u1vrfu=d!HvUJH`@@koXC%(3@hGeM z+_>>d7Ac7s?a9@xX?K3%A-wMKI`_1zMbA{$X`e9m`70T_{8nh9QqUD2DcXaRNi}#C z@Y1Q4=IhRuJzAw(Po7vJ-Osy(Vwk42@82R5FHc`+jZ0ifVAMg!JH8NhG#k#q`=rtH z6#+BI)RnPESnHL$rge?LqRm6UGRYsGaN!@u3OTIAIxK#tHNC`#4@CKSVM=U2Y6@+5 z3U`G?FQ`u@{^VL2csW6x5+QHDC<6rTl>QRGAy;^u>&9j76+RXq7V}*sH>7u5D%tsk zvQm%4hy;xy>5k)sT&Vfl13R(E33xoL0AlBrk=!v!ZqPU*D~W6gL)vh)5Gnjfb%B=0 zNMfaj%eR!IRb%c!tujF`uCx8pPPY|^=#BMQ+=S5A2|n~E`QP7u&KQAc7>)1m?RH~L ze~GaJGwcZkN5M{xC0;#mBSh9h`;6>9EiqyR5#NlO7hL*Q6lh&{mubvNaWrwml|K-i z2hI~1p2BcqG&|({$1XXLk1+6lV&KbUPnlp3ljMk#vD@ptKS&V1TZ$|eZuusn%&RPv zQkd#<16^?Eh_+o^cI9go;bD1VtXyCqU&(2O&dikrKJFG2g;zpro5~m>LA3kFD_uk% z;;ON>H;?kO&aZ07%0)0YQAxxVkuW=l9jQPyk|Su-K~(WcRmvS*vJ zWp|W)8#J2WgAgUNXNdLGLc&Ur*LH z7$^|4C<<$w|EKBb42m|J=k619W`b>}84TLYe5G9`79E#`2@d%RtfsNfEZrRmI@(ee zOU-Weo?mi7k;-~#VPC8eHem)k69=24!#rdPNVJP8#b8gYWhsf4z5tLl=d&Z-8l}@s ztJ@7gp!K|i5Lr)gyLmtUwbAzbK z;m)%Emj4y|_BAeW3AU!SP&0h^eXGSxflzaAYkJVf@UeOSEk|jA(k3(^5WQo9O7Y*u zVi?K2vRHRcBV5co95EG(%Z{@D^YJ;j`k-5IJ1FlLhiR;*=fym+D zd#YuJZ0D9T1JNF7?cI2~`AKT8Wk4`nY3YDknuFN^At^4Q?ICSp5e#K2DU(nK3X;6njlbj z&0DU_XDQPLeRir|E;3L`&daPQDvUs}ZEUMTdK>!gBFg?odHK<`Fs_Ugd{+Ue71QvS z(RI0V0e`|T9F!@ygFYod4-H5D+Ni|Zx?d=hW`r>R2%Cu0r0)p%Y!kBGwXM7&HrZqf z++%Qudo_0S+Zf}%O}HvN7AC?R#@c1m9f%0A(Uv&>wokEPv0D{z%2GTMv_&P#iV+Cd3<>E4etFY;_0^0lb37leK)ZIjN5T z_KDrr^?4#d1>%Ps3*mK~={>sf&h}IZ)PzITfDkzv9q7%kxx$Ha(N7GHm@FI=-)1kn z>hbFvcJn^k3#H$DpjMdet5o;U)xLOe@>nX*#q$K`yic!s?>mBz`|ht6u81Cx?G#|` zuqiqV8{^aRYa+X#?iiN>rErwYg;SkANy&;+`6h%ZeT-8xn;@IDq02@&TNzr>#&={-qvsUoe3Ticj{*AL zUNb#krd+1s$dkb|b^!S!(S222D6#&VJVSn#q`l+}(Qu~wz<;M-+VO_qg174y9R~C3#2&x8DEp}g6Son;>Qf!JotjAytJ<#DE)WrF9 zHT|P4^FL1>d>DH3Ma~ORf;n3496=d>aDM>1koFaI`rpnGYbFeuyFM+ zkpev`iJ!$6kmge^ELnni{Fiq&TEeAt+=Yk~t^ccETlElbkSylIM9O2iq0j4;E%)mW z>2T>t&^Gh^rV%>+fW@)3AHfS4wSp(#56CC0P8qU&={V!wN^pV`&jGx$csn#MfB*T$4wlpH!k@uO z{*Pi7&w5)!tZ=_wxAlmN6YZh8F3uJ3GL^F7{z}UjoDqv zopk`+pE-Z@&ScVOt788XW%eR{C8T=`0S`u4lVQt6hEs1Uy+Yl;yh*xHJn}{tn6+r8 zQlLq~p(1$=`~kZE!&AM_YsAVF6qzrwTD&i1EGpZ6Qm?v`cHZl5eZkN`zLv^>~l%$a*X0N)-*D!DwC8F5x*CaFf?RshxCW zQ=ReZjHH2;*_Ru)bxhKDGPu&=f&_~A|8Xjh06mYdLaP-!hFk-L4gK7IlUd63qfcPz z1PV%MQdQ{ZBfJ-M<(K0;np{HM&+X=aV07nGmkGzxD+)4H(?5uMS3f)iuZ*s1h_17j zVzSeKRXEcBvmLZ~+*{}rNDZU%gX=PF7v(aw?@h$fb=%LA=R7yhaR`C4T_7T6kz5{o zpqXS2>46?Tr`QQ_{K4+be8skK8>rvK_wL zwe^VElSvq^0^u#O31%Ng5eQ>NzOXV=-`#p_)3=tjaHd7mj6-cg&z9l}1lK&j?g40^ z_`=_kao&JP$qDPAso-?KEWDhB2^a@`V@RNTuRlD!dRG670S zVN$aOhGBP-cMY*-Y;B3Kvzl(YrfEOgl8tMxM1Mk zzNnQIHxG<>7J$uw0uIbk7PZ@vTfL5GzglKF;QuGvM?GT|i>xa2ljVX=d1MeMB51W7 z9l!%>{{=?!i`1FU7xT8HzV<+dh4H9}`7%5PDze;4&$ zV?$}>J`VPiV}Z-JwmJt1@C6|I-{MIT#Sv(HyO>4g$RD1z;0aEdszc6AI{XE?=H*+y zQ>l}QOUQlLHp?m#ZYZp+!qPM}OnLQ_ZC;6$hIYlH+ysZ-m4zD~GyP-#g~;B!=NRgB zh~QDJnozuVFZTenn=q&aM;}_h`{+3r2cQqcz|RogqAmGOaV^64#R+=?|8tf2FwWG# zD#!|kB(@xUu6wCo@&0QS;%$mx-&9;G8vQ*8c)8X)#f@Wj+4VwQ)uvWNKY-D62CW(t z-*X?5N5AD2pLg^T@_yi}jxKX#SpFUX8ph`pEH< zEl{NF(3KGIMH8=;u$sLKn*#k6%lRRtKox?&bNNk_s$VVb92u4r(z~hERrgmwnR;gI zG6x7J?ufK&-eTTvh+Fk5Z$?AcT5=kv7N*RWwl_GZOU(Owm_uH7rw3Jq?c?h8l|;KQ?}SC)C~(M{y}zzg0C|9oml$ z6u4Netq=)r4O8K|#Z3c@2=m~=&nBUuC)tP0K6+_+PIOjpe~QMa9vZ7~dWnyUg zpaxMByVLZV)>*ya)`GRA(CWh4&R`%{oHn&?BwnD3r3#-SP)Ksqz>WuD*i9R`7RkWm z7jmwYN#*|7|BgKz_gTsyvlAPXAw3y#1iqlUCZ61b&Rw|_Vd&v;!3nGSbXMSIN`Vf` z5p=4p?Xs3>I|AfwtnmDqWpsoAsc*%>=kGMNvA%;Aaxt;`^ves1pd85&6(gvQO3>Pk z&Rsub)#PoNL%Lf@t}?P>oEWl8sKs2o_E;^~Hrpz3Fc7qtTr!`R4lbV;wHt|}@X%{u z?9TKm&fTFQ(&AWESzXdHhiyK~=8}D*{Mul=$l~3v1xejrb}Y-!aD$vf$vI(wY)*`- zoqyS#00&|3N}$a{Yn0aoenx9FNB3k)BH4yq0sN78@M~$?6K5j-0owGEPTHH%?UEz| z92k&c<6(cA3@~76@Xdvr#)J9`SPgUcHIL5a zQfIDE*Ri(zw2OK0WENh;3|zj87NN2x&vHmopFk5Xk9H9w%3Ivbd&4rY@=Ir;h=AAz zKvG$$uCTiSo(}7XB(dvQ@Gi2zkB5 zJ&eBn+ed4akE#HCEAHbM(Snt)r36QG-j8j zaPMXpZNDk=Eankt7D~i%54gQcgIbw{e`Rmr>`J3NF!;=9d&HR_Wtps5x?l|km=hvt z6cK^=1)(I@ZLYy65x6|iiJYK6^iT@6L6ufnPM=7vr7S>+A^FkH6HKy}8J+|Rn@}4c zxl!@A!Bm1HeTZ{8tz-j^!0@|*IMpji!ES!ARli)%UR$mn$`r7Y z)FzF&4BS95y%I`+5(GO(x+qQ?cUJ#i7&p@WM2kA|nb7(f5bbhw&8o6pHXz>6)zi2p ztV$Q{RZCpa6Wk=LwqOej>DZ=iK4|W^Cr=mA4yq)?N~nl+tWa3$|OSUY}cu~T|3H`Xvz z9pYlY_jSU%!Y^An4RarimU`Ec9ClKa0xP;hkKp^|>IZzQFZ?|27Q)g;@U!T%p1Y&+ z@f!GCQeQDz?R|8hxzT2IWcl2ZF}eOuo=v(MWu_wW!Vf^WFrI71tdd<>YY9IEmwiqV z|6i-tAeWVw`4CZbbxvvZnD-@A{RMst0|fgm6*rsg6c=C^WI zATNdPHd}A2-L}^Ql_;+ zMA*%GY>Hlmp9XFOJ$|MKi5Iv*q?h1GWu4R;QLHAxW`(Ie;AGYPk?K65Y9&=)$bzVV zVZ`Kx7nJAMUtIwvtqM3Os5LubI(d}^J1VPbLBT}UL$2+W`E?H59Cq2w5{)l~1;ZcI zXwpwoZ&A^bmD4G`gZiID&p9 z8G>Z$VWUXsqU962E@M8FB0${DpmY&sGb!PY<*-%HFKKWH+U$H~q1W~Y`{w4$;68DX z)g?FzS)JVb`sgIGxzvFqs5+LT{%ku|WC+(b%$wg^$@@PeuQcu!eZ}`ZyJ<<2EA39@ zp$c0?%+@v;O}Z}9Yi%ZNWkR_<+T`;@0%}q`H3P61pv|^}^(6Mrf)WBW;3Zs)s!%kU z9&@{T*jeb!YwP>$QH*Sp#%dNv)kB69cmEWDt~t|pu!q|HJah=rnrqx7Bfj{s;dMgr zp=BCct8B?6>i7MnfI*d>VBu|b}r10#^)*p=ISh5PyE232Kadk=eK*HI?!ck^}G19!4nrh zhEIW&19BRtr?@p%&RAUaZWT5YI+;P?CWdGcWTLKL3Nz3*-9utuJr95DIDd~kC1#O3 zp-$9THU?E{YHtN^H#g3NaUwWf%pGk{rUTDWdp4>JasN$s15sL_#II3u z)lRFbzF-0^vxt?NZsdZPY4dOqQ^;Qd zASnQ}%w&;v`}c!sqkt;l4dQYk7Uu$7T3d;NeLfzd)NZV>heWOLl``g4aa@M${ROOH zQAzjJf@k57VJSlJuEoOi!js9 zlEfkna!*`=+?RKED1rcb322`s7`Q&zgomY2cp8f;q#SvMh47B9DJtExMU}N7xO|ae z7W0hP(0ty{%%9S7!oXMnF#nglwyq~K#|wN1dyOPw6qG287>BwucTK4S5(?R+-SM7* zTX@mXDcB4m?B>pn`=f{;3t*zKdV|`+Iyul2Y#vXIMm~$fseRy~v!(w%7kEV4)gp#8 z+kknsCsZCJ7IMfDl7-=+e_P8d;*lEIf;`aOiiT)WXin4*^ADYe&aevg-I#SZm)p>wUPg{HTQga+r6*GQ9-SnCbM9?+kX|J!`MpUG5aKqSv`p4X z7Hie(O9(Eg87aPo>9CZLCRPivXjVS}^|t<{LnmAfPy%>oyq0Kd<|s0%U+2y>Km0_# zJ21?P?0P|Yu%WC(VLe1F8gnc`_H!S#i*OVj*ZiC_0H*PDod94@3_`YmL0+gEWSaCH zl-5?A4I}8lus;}dbrm$!fO6+Q95(nro9-|J6seksmQnNy6(3;@;|!@& z*NRSj9WG#zU26NgO4$iwh^T(YF~uo}om)G+r@Vs1S^FM5Ao38_H>#2gmYD)FdgEt^ z+L=f4fSYRYYn+$FJZcB|6C?B#XA67=i5vPQg+J!l05jx6eLC+}cCLv5ztUL^bJm|` zLH18x1nJ^}VBdIB95%l+D!GT2%$oQ1#J$DqBkr3|yOvedkwsVh_fq6poD7T1Ru<~e zu(QT@P?uaR*QUrL#X1VtR{1{gY^6As`+=?wQ;}`Pawf$~Bj##iKbYeHwNWmR?{MZy zET$Ai*)coS9Q%WAP49jzOp*ZCIi&acgd(XU*_$eN5&5^YW%0eeKX2hQa4n;iHBtia zv_av24dtO$;el%R-|h-}e7Hl-R|>3-u492t6>-SjDjhBD9^={e^$iL{x%qL&N)!Zo zuAjs7ntY)>##Z+@NaKWY#?;tiP%R`sp+>M8KBbaCkU#(1)DwiQyP}bj;@c-3EB+%% z3sf0`>%vf6$E*Gg$(;-j)uRf4An3)i$;9hbp}X*(+$`7DG||d5993q1lWphAN4Z%o zkL@7M)oZ>D4-qSidYWKXh7qBA&&1%AzkIgogxeQ>7q-LvF_#mwI9OCk@?Ismu~Y6VDBK<_D+7UIT1^mk%+>k(y(;#~ znj;EH0}Hb^Ydkf9X6{S1}Fgi8QWMPYgs`C8V=<-nC}4Um#QcR!H} z$p#P2`?JzP6k~ik*K3G0hz?@XilY%4qDp|L#THs3Wntqih*jP)BUFN)_f!!1@xUCK zT#L0`p*DSzl5?4yYE8Nk(c|o6mDO@1F-nMPM|ud)Zw^VM^%Z}w?NUd21?MuGzEb!L*ZZAV z!-dsAd!PdM1!gjP5pH<2(vDtpBtVWA9UnZk;szRFw?~b^~UoLexxBnC$`|YtoijyY_;H% zZNQ-sK&DH)g0Pnoh>^Q7vg&S$6I66QNZFd_+iivb?sl^VR^vqf_?iU_aXrEDQjg&t zyZ$nz!l?F5JA*Y0`5=7q7DsUsg+pk(=D2sT@2c;O?XF2nR$ zBW}R$SSF1_8wusv<56;JpMfRImYLnw_I!;5<|?9@d9%pS4spo2e~}=Q7VAnYIL5im z%u9+wk%AI%VYoGHn4LhHKma0ueOspNGRo_?{x=W^yBQmv-+Mrzyu!)HymQ--{6elT zp(lO&Sm02DKdb`ARi~RF;gS=B`{zqDLACl>`0;JUT)FOlv9@kvP5+&V?146u46|7L zAj|MUgf?dp*E6X0bIQr8J(ZjWj_vW+%(58%K?Wg^^VuYgB*!kxDSPW6(6sSb@vAK+ zsu5NB3%IEs*j1#eDQ8~&R$)$#07sC`#ydHL!Z*(Xib)Iah1DV z5Ef0pyLPwgf$|x`5UFtM!7oqyzMto*Ce-^@EPz;JVmJf$mhtF9(3MS}MOua;N+Hv( zt-&=TPyEF7Bah_ue;j6GZBGxslf=BmAlPr8`)=MtW0xC(fuYH}Zf>f|GGOY51AjH* zY{U(vx<-buSDe8jfYSPkBKw5tMva4yUgw6r)X5Fs`pW9o7-}e4kbF6*?I0G;TPfjk z%v5lXxwy0(<&GhjH;alSmoN6y`PtERU zB@Hu;+l(k5cTWjWqp85zE?V57rxHh)&Pd+2#%oGWLgnFpDZi_)99dq}LZi_ddUaA> zjH@Q2lWL*0PpvCgKs$=-#)j~=^lx=XRl+)Hy#cro0Cf=wb|+fB4X$v%~rFi#87`np~UXLxdMe=2;;8* zc=>$n*uHQ8dw}teHFRhR_^+xJYyZ5eUpyv;rQ=|E2-@gafAvSR=+^17_vLPawbu8- zJ3LsLvQMmZ`jIPEyB9;up3cd1{(a9b;P5uJMc+wswV_v8+s4|18OATn zesF7&@$#B4xtqm%KG?ArNsmqGZw#tQpT91B$8=r)_`l;>5f~inDcNb|7_XVxV_l1v zl-pqiB)rDE9t$1W-}gIgu6mv}^Jw4AZ0otS%uhX_ub$fR8Vlz3|94y+rxzIJ6e5}t zPz-LX9dY^jrh)Mnmcp%*uf5R3S9|kbVIqcRb}{y2XNvx_=xHHHUIAa(a&jtb-57;^ ziW3%1`Be43FTjPdm{)GxQ(v^=bccSBnNDp(i`F2wWzP0k9JzGZK=(BoHuSjDE-!Oa zF*w92`LP4;o~Usyd~8SYeN^+>)im(jZXUj$j4yl~pJc&djg?Q`fJ|`LUqV5>Af$6| z1%A1wZm45IQ8MHo7uU2UGsXD^3a=jK^T+$MDIR;KFL)%J;#&PWw~ZSY(`Gb0#j$_P z!uGU1cQ{)e2bo0c@iQL@lm1P3UVnVv?cVd)X&ujtlR5?ApLJdgpZ4jDC>B-ywV?!_ z?wLj%lE7(f5Z`x7`29Q1?PC>VG7@TC*fV@H#_(NtTNWfra`3S=dq9kJ zgU+35J&D79?@6o9U=jG|j!%aQqm7;wemPh4HcFDpy^!9@v>$<|jk!yst+`f>I)q-< zD$v5N%LnzG7_}nLa;HRrL!g-c0~#apcsz(|GoSSq&XG0cNcOtqdHqN0(UI|auygCn z{&%9BoK2;3N^#WzQ^piV_(Q<-zuLQc18* zQU&i-!IXdEcM7btqu5uQy+;9B{UUbH#!*A=w|7S|Wb$tHV?DmWs4&^`lE|RDspEe3 zrX9r+Tf?QhckUT<6f<)^9={tiz|lU&f_>4`nvmB-_EsHD{gF6VBSM(ketOcsr)@}L>+ zhE|gHwf*4JFVCO(=Vpf-(=t~bGKTMR34B=4XPWzMzE2qACHy>}Xlehss`zWL<9{P; z@3#6&G<7&NCqDlZ72!4-&?!pq+MGYWjIt+Z&`$S*x6SAG;UV+99REQdMeTL2p^s{^ zWK>(+?>3mm3rNyaPNRt?@j_J{3tT1-3__c&$UlFMJ2hQ=a@D)TA13%F%=zzqI*gui ztOvcv)YdP!5_}>+g7)gzh&WB<2AX)D{xLg0XWhHGI&S>b>V1JaX?n_^#jeKhbG<*c WB6{uX=L`t=hq-EarQ{MW^8W$Is0f7RYU;)G5B25zIO!p7jnb_2Rvu-x@qPE0?CN(|ANo`#EIc~w3T=rl+hdG%gE>gT{jcyh<3zRj8gadR z8!o!bi}*m&h0#}{+HvxWi9CKF;Jw`!xG4gkbbG85Rj(PRl?-Zws+5<%Rf)O+TqP>a zBR(#s-SMxR5`|mZo%7D|6yPIqqI#Dj*;PQmgM*(_C-*Npe8P7ue(CSaqU<>B!2h_0 ziI`b`c(tfD)Xu>A?=_j=i;}W`uj#L|GDF%n@$`7!^tXrLfcfY`iG5hN8e?xrd@n()IaiY%WJ|3q8gMy)CNHEf{gaW|hDt#QL>_<+EjB>P&{JW0fLins9hfIKpcKqQU+n`$jkFKAD zZ9|$KIES4^BnjKHwSgDFdr!=dH!?dxBAlq7$Li_g1QU$Ydce0!g!6LC)ak7eDA{eQ z%mJm|ttFKL7KU1@hPUmp3qV6u5l+#IVG&TRO8F)!gnq$y4PIrT-cJ#~g_s-J>qQU? z!ny+N-hvDv*f`t*^$bM=vHWJb|1HMHVk<-uLAO`ExNpN`RVf=0?YLh#xL)4sQ_7D^ z#r}ZT820#Jp1du)HXuu#1(ra}TWq9=9XV`aKs=EXoOH4BsVbo(ftxSMM0@4=i-}c2 z`jqq;&T%w%)2R(3WWlcqHSS29C-m$Oi)%u*ycAa0Vl(c|Fgeu1uJ=4##-mq}XQ3Au zI!-)%-&-=(kwk1l-@NOisjWK^K9S&-8^nn1YC0=MSkC-K*0(2D44o5Lt-n*5j#bw zB+xr@+ddp6c!fp>)a?w>==JxajTZ5p2#l~6ae55r#7{}77>mf~S%)fS)g$|gUTmgB zg$em?-ynkR>lcDCJ@Vxm5CL{K&RcDy*OF)@V9gok3sytfXT4v|9 zPq0PRR@TSeowHVCEwpmde3dK=A}=JoEVfgA zO})G^U?j^Pw8#sLFmhzJPx6e-5dAhqGl4N+KT1hMZnf&hiLOe(E5T_49U;smo~YrG z8D;#YveywWi?-aJ8^|2qSx|&RxnL4rL%4aD%&gw+N>?0aD&K?uK8xS{rcel_GM>F{K;{_;pCSyR&uTCyG-BuJ=g5ZQW%7N>fV^eR{YM@hkW^tWA#IhSkFO zuOqBcX-qpcS(|}I&Pib*7ZAb%V+vXdLaDjd;L&bNJ?slWCEK2!2q9xUmOhOx; zikxdvC)qsNoxlegrjK3C&9~-G=uouxRiTZk7uA)#cW)Ca8Yq50SFJwJN%KwSPMb4B z?VUsTyY+eqkgE?ibIieJ9#&;Ht<9Q?%3HZ3iRjz^EE$G-rbZSs%=mv&DXCOgS(Ee%Dfe|nC@B;Rm0;L z?&tcL$F@DZ@_awzpdRXb49)`U`z64+)2Y-6IeTM!!p+5XcS6ASn>pPha#*pZEY|hL zAh_V3O4@K1x>NT_qxI2Sl+^>XTsp{(4Q5&I=T^HEe;Q|Bl58?)TO7j&(v=r{W$kaa zY7ylK<>7`cF^CxPUD5Fc{+8V@Tlv`T1!(KF{IQF}Gy68sdze@ZWbtV|4VKZc_N0}f z=_J{njvWHSplgA>d_$_~o!a($o^nOc3|c-)N@@%ziHaO)uWu{@N_A%>0`#B{(_0SdMyS5q? z5&FEgZ0i@$-x9hcv=_q)6~FBHE0q@>NlnE+krG7k%6IJwFUYd&h&=|pR{pbD;|;)T zmHZXU-7iykiaZ|#KWuuUNeq(j(eylz5Wc^6d8HGB-~Cd0Y}@4e0P4R?{jZPIhgVLp zDTgof_xtg*1ngR?@Ty0Cqx>6Q*=Q4Y>&JgvlS}#U=lWo!vmpBiI<3MNViv83Cw%qN zKZlLs?B6Hg{h>V-^2I{1P_b?iJ3iX1H?#PD)-XWq*Dt@Gkm@Mi}8uKRIF+c53WK7w68`~r{# z3b+&}>J!2`-)%uIm~NDJH5sbA%G)AF@H9{6W>)Vc2e8(R@%0Z2!17}qU*b#!HYmiW zfU!iK^atqsmEaml|iRxIAxBF1@qeHnh6IZRV~iOkpyPGeC`mx~N0(v9q+YQ#gw6$n&9 zqV$|6W130B1LZS_1!tuz71dLU1XfHEgx@$Ptk3BdGzouJlSr0K_Z-?58I>fcAeQsG zXW(}1lp_?qs4#jDDALY7Y=13Y-QVA5dJ4LrZT%mnN>$Dp0&ldn;XTsOdiDSds?*iUD?q_T#0N3i)=GeUF1=UXNpi~3S?7n`(4Zf#mCJ#Zf3ua<-F9kqn)u$uDr zp6JCJM52kl1Qo0y_oEWPmT}=u=XQio16cvvN~$4XVcslRl|hEu1O-g!DO)ywB+&=M zg_($2ToQ(OevI2L9Dg`ZCJ9^@=+Pvu5uOu-*sUHfjlNqQ|0f|1Uv-1%LAaD)BVHcl zQc>X}>;)SC9J8NsBuV>qiFRl!DHd7>X-dKTE&{28ROQ0AM_%FU?zVp2$%xS1W2%=y zaFR%UMiw)V^X!W*+Pu!`V-8@QLtFjGuSw`oXo>Pk#kP@VusKktsKpLetUF@)!}Hkv znBCzpb_*yN%P-WWJlDom`Dj&f;5UP9dw|k4K-#f;D@ZMB_Xtf(XY&o>OZ>}rk|%T| z1}7--Z4sX!cPSQ91*rl#p{R_j!1`TmjoPa<3;l9|d&3SHA{d~Mbz`S&vhWsJFu_38 z37q3dol_fL6Q|Pm>cX4^cb*woqlg*yf~OI5mRT+sGbG}!`V+qy#vR5D4%(^Rw3?SDD(37f^;}KjEn5p)>DJ=o z^Y7|KYig6t_ED5G?7$?MEXHCM+~H4WJlNeQ^nX$Cn>=1uE2QJ{@XK@oKLKC{apH%; zNBS`wj!^>Ys?K-z`=~He^Z7wA((JUrwww1CwUU;@VNt*vqSEIMBC7OLxE-qEj;lt` zJbOs??_VZgxL@zToy&g^7g%$YASOs6Kiuw_wG0k74j;WvkR%vL=Xin|)l1LpFI${> z&5wLw_5O7=q~sGyVT-PmSb`>@3A2sK!oJ2vW8Y%9A?FpM5ZnPqs9_D6I9 zpPYYJohZ?-i0%@g=-~tBiTf3$sJ6=ioOJ%_%S`)3QVs6K?nB;=5C851&W?YlL~S)G zmk6iq>(@9aWdyn-^$C~Yn}azwd?np)+204=IGh6337P`R@2Px^jlcxw&A};E1Wo+r z#+}Fe_m`=8ki-s#i(_&qz0VAM?BLnoaSosS?}6>XHO^NK?0E2L`P2U|aq}l)3G`(q z;~982#P}nJXFI9yI_^G;?bx)}ZIrdrB+udeL2;?jG9C~!WJQjutboe2vNR}>b>8TMr$IaINU&_g31<2vNtDfom7to z4+l$9SP1=u%SOv;gwOcEw#T)e5doDDMTjw22;#xCmx_;#_D+2*kvc^bu>a)-U7S0{165DIQ#OF6>x#sK* zq3ZGYK&NJ90AVu?f1QlP)|wHLu=l9$f_y7^E6$G8vas#XTaf# zPRD8oI={f-{6Sjly}P9(%ZFFLbQa@GA(wM`NGOmeAo^`2R+W{vOm4~eB*oNij&Vi?!aw-UA))yOF|kXbE;;6NutnjhMg}}% zK|G#QX~lw{CszaQic)<2&bdKc!ZFbAWAb+<>sRp;=O_uXrC%A`|`3d#mn_oEq5&(njX9Zx$y9B8bhzx8-~*85tRk2r_x0XZ2&oSBB+~8XBhse6>d^PbN1l5Ci0_%bvtbX|5 zQP;n>ep&2K{>5VXGl$ewIR&5&vctE~iNS@R)p@(p?K^R%_77e?^4D>v^KvQAr?_kj zlSwLmqqMy-)nZ}oCB-HJq5^% zi|{m6;!7OP8CH51IeP+D7vp9WBBGf3E?AmLwXA!kPDr+p{=qgP(I=^Ejq^FqM3cC* zOFVlJU@{kd-kUhPY^Zu2DPb#7&+^+Sz-_Q(ky$etdy~C>bKRyoFOfw!u^q z)K!06>@NDq1ts_%Xy?R+IZ9nQW}rP&3fce7ANyomfX<`ya7!?1FL~lQfo{CLu1U-# zu;2rAnpZ>fQF+3g0`gyUlTzOuGtP~GhLp!%qy}DniRZjQjKnTLQ;ga>vCzC|Ts1E4 z9bKnx>!8jD01Xd-nzC`{t~M~zu2Q9)ASKEr2(J@fn#fy!{>|h%hX5AIAF2Ye0h`AY z&x2%{!(gx+E#hUafNlK?$uH3i8y9IhI@?aAyc~rGLbO+1 z{uy+~R2k}wlH8}3P5?DwD=uK{sao{mDpR@emu7iHr9rS#MaQ4yAxTHmX7C-T55`Egs&NsjV^}Pz`vMM-eAUK?i7qmHzBpOE*and|(Z=lrsr;@|&jr@)w z_y8feTiR-^on&}+tMM?zeF}+|cXXr{67=(;UHo=>FuoGwx_jIK&cb8gAu*}dH|vIF zvAX$ly0B7#tn&7o&Pi`2%DVOWCJHO_=g>`t*BU=9Dlhc>Ii(}L2};bakJ^|)j%03e z=oeS6-yp6f*odiSO)p6j{_?*a5Zg^YXV@!z4%9PWK`qN_VArHs=iea^m`HDY`|WbC1ycMGt(S`f~Tr5mk6L=jia^4Mg$*+vmf0 zUjJUyd(Dd%Yt`B`T(|R;Qax8q-O=N>1@rOa+rIoII-fKy$f1x@!`B5gKF*;}!@DPc zCqMTR%t-&oj_?Uudl-Q`;GZ+=rN?;ht9(rPr{fri9T?< z9+!cS-SjHL^{%~cLafLrOU3r>SX=`p5<7=Y2@c7&>0WE%hbG%f&z6wu7oqR)kIqfb;z!y8Y*>X5`dX?rPPAdp6$g8r8# z_QO~sd8U=`McgSAY!S4a#9tE`r)0S_ar}~T z{@Y--UL^!t`w4DCmA1xFwPT5D%;~1P6S&Q{2AKv~-Ht{jq}ROq)H_Sg8}mVwd7lbF z7BE?IK1wcZ3_=a}JsdiZEjBncUYNo@$Wg#5)%kFKp5&%io8Gdsy5Iy=y0eGs24{DD z-#yg}a0Qx&hUWT?-#4_lXAKPAp$3beE<)j}rew2KhOZ6K`o5eG28L)J1(CTo|ui zxQqIe-v7{rX`Jz@+8MesjhTWAfBzjk@8+CxbyHQz4j4_CCP`rw|Fd7$0+gVDQ>(5a zvH~}0h|MuXX%vGCuHdIaxg78RGCURj)D>B9CAX{NzoOEe)J;d4u2QN)h7 zb>fqF2Fn^6h~Dg>J&e{jwZq5^D5LdVXOy);{gre{ zuxNmxmpwqP@gBhvpk6St2^r`!tCh1a(3!!IEN3i6W^MUv843W#(-|@qvBH^A%zj zyJ(F!1%$kOx?_hOhwGM+ey0pgRa503)3}13^EMg+e!SjL}kH%hrSzk zP}b(IXmAO836qzG7cVWIRG&Z792?UFE;(N!bRm98ZavMVPC!`&Aw20_;E0_7sX+3< zx<+HE%&BSkvX)~#RKo3wYHIgr?GeD9!c)GghYoQSa0vO&NTMs244}5uG-wFJ1`kb; za?)t~JYsp{A7pPjE&xLFrS!Si?(ha&66*`L?pjMC4Zgo$kk;CRBno4k?nUUglUVt; zQb7Xu1RL2lF3~h8wx{{Rcfqu2(vH9HZa=^}l<{rt@heLqVqISp*X}(hjN~^1%NL1L z25p=xv1=BK1qm~%zrx4*^Y}OCjp$D8K>RsqpGhH35vAGC1?X_|q;8CH8CKuKyM69L zw{b$#$nJx^5G_@<9Z!@{-}~4D2k#(UGPF*<1|MxEM3^TFXOV=gxlE65*x0@WM<~kd zSMZ9CU;KyM6U?S{4Nx|8#(*)~jFc7w0zQFvP=tDCl;8WbBXx&0zi*|Y|Nf!doPJ$VWm=ARX+T!c4gv!VP|k^4*{ z;CrS8lCpX*SgF!75T6(;nG?yR3JI3B>ypoZDE$okvYB}trVG(%C7j+dL+A2CYycJFfXvUZ-PAr6NrBV`K5c-Q!D5On&coYVY&v^u5>k zwS|6nZnvX7nLsz%wt=J_DY&H_qQR(K)4l!@r<~cYtOY=nCca+bH)(iRM=DbnqL8Kj zg~%ycRyF$MiprV zJ}>1M=RVy8>EAmJNV^Aj2$0fxU>J;WGU~hO92@g?;DZ^8+#tokt9- za_qR~?f>Wnu(>7#ut^Ld?su?yn5tiEO@j$M%wI_n*eb+e-_KaE=Tr%8>TbpExWu^s zURiEsu#r!r^(X3-+83`tpaSDt_SUgl56;Ve&0}Q(!r)Aqddn}@S6Be=R7sxE5DYLW zoO%QMRHWFoIt&mFy;pq-EkqMZ~y`1>2-9`h~ zpu4(B5&7)4Z*jd9E!&m-kp{Pqv_?KQ46dd|R_qR$e;+a&7?FYZcb6WTCYc1VB8JU= z6}uX~GnVb9je-9>L)@Px``V+1`UdeqtaS=8)08XsOc?8ibVUF*rIYNRZ9jmBz|~v^0sHm=TDR18Vo#zW4$7 zOQt=5nfOq@)`InPM!Fkx^(z_Ge`b+GuV`p*Zuty#j45!fTJ8o^2Pb*2E>OEkAq5d( zN`|eIQKHQg+O1AhMu1|V`RW*?MxuTyaDK51Y<*lU z;{EnGO!mE$v5MUFFmKy+m+c40K{f%-{iXt-8vvM${I>&y8}!gWOQ_iF{#6FKf2LV| z*W?TZPQ^@^-$|S<9XSqEMDOo=50X?>;Fa$ROla3^^=((ple)0Ym?TXikPONb&rFa1 z{LWM~f3dQ5b9&B+3M|Df+op3xLvPkS!>lM?6eHN;C`kZy>2TD{&4W>cc?vHLyUs26 zo}C=d0qZYxObCa@SlJAg^%$rC24KzT60w^C@UlTvZ~PE;#`71u@MCry9@M&YvLmVe6hxOI&0+&h)rL5%w_vYy=XaZ0awXS{iBs@1@VB;0szLf!r~zA5Whg78nizY*vTexIli zhKQ8CHDTs(?6jsN*`*I#J0U9Y%XsBvqjqty)0Lh5_01*3ebGL60r%Brn$DVo* z&ivCKHuIsv39MwijQ|89@AT5?6aV#VF?l;T8y!EIXJA9OeGcD`XgWFxE zb(nXmvgR4f-kbLQV*`T;zre*r{=7kq!YRwc(>go$R&aon^2qXQ_2nj;{~5%Rf%@KC z)N!%h>5g@^ATP}Gy{MQcG|k+-6T>RW()UVE{1WX!Z~|UQi)exMyz7$f$!Wo`s++KY<{L)@ah4c$DPfgNzAe|jmO$$YN8=2! z2+U00oRFY zVtT6BsuXFA6hoNzaaxMGDH)Kjf7%v4End2g6@F3txMm@To7~ zCGFb|Yi*jA_7`+x_u7xgu_b7uhyE-S9-V*vE{lP;3(Tt`FiKFRU;WdLw@xvx1H#0q z%R@E&{edQ^G$39dC+u}~e{-V*;sdo(mOVl948taZo;NmywiVa|0xNtU^3wnX{ug@S zFxCFF2ax*FZ=^najglA0k-Fqg$mr5Q>*7my3P|<5rcHiRp|>950|gut*MAa>0QYxm zjhZ2Y^jk>_B`?)_komyqunpZ5nI6bCiaMc^N@s8k56v;SvTmrpE-km*!LdkcCpAl! zQOF>wAJ6htiWZ?wLN;l7?`TNO(hROeCCZ!Ii(!1>cQ(iF-y{W>JL}$c6cAI8gP$iq zd_?3UcdyC9)sO6W`flJ!AqyAA%znT}|Fb?!^ceuT-iez`a-;^@^8{aNjeMz)e=!l_ z@j;3bq=$;xOgds@wVh+w%3gSc^r2q9_GI;CpuD{wbrLI`|K^6vNYB{xKF%1ZHbcJWfmm(1hqZ!<6=M%r3Mijr>iF-FPBW(MaTL&QK39>DhzBD8-M*f9) zmjMWI>LRRE)azd1)YJQ)KY;{VC$D9fIh%&uJFvDkpEwY1P8^2;4Nod?yDY_tbf#3! zs08J}BOCv|8=Wyh&I-Y7VsUf*sWvk37`x%muCaxvpu@UPJ3d?ipkPJeVT`j(st`*6 zB@f;<+j-<;%XP!%ix_Q-v_n01O)wr8pzih1H$crxfyQZjdAz0)g!(0OiL)0-;ermS z%|CLp|2FA~3j^Y`VW+%por~*3C0aL0)!XY#wC?WQZ?3#Tt0rMkgw#=%zs-HpA^XX@ zjTK{s8Ir8%GJzWBh~_V3l0NQ9dxZeJUMA1B_feWdtIr%mfnH!GFCZtNDEb6W#B#@d z#!I3;*zLUC?Fe4n;R4r|{TGBedad}-IC1|Un+Xpc`G2Lk9Kyt09PSC$J-^x0iK^Kg zrFA$U7a8EI^n}Qa90hB1hJ)5H;EiOvef37%5-GqbWi8mK3W#lf7 zGqg8N*bvA5#&Y5_>q8F!x-gIZuUaF4kaYqEV+Qlzi#Y2*jfRy)!kU%GvLQtQf2r=ez*#8S{t>pr zPl!qVC0@&SN((6k4go8lz$p&hX0~PtdG+baIl@)^<`a&w#&SOYXpSm0Xu}H?mffuE z3A%B7rp19epc178&}Noag4Xf)l$l!q3*S;8^jUvjRxr4fOK^h+-9T~Ylted zF`Dzdj-TQHDxd~jZ%s4XOb);vr!x+kMsp`5@uz@wp`BQ=Ch;MD^OX#F*_|>Dv;bmR zF#{5^#}zY4_vkQ3@c2WT93k zh0(n5Mo?_jERwiIh?Q)Dg96w#M827Kg3{1oH4jfcEbAOk1=3pJMHqZzZ zwL;`9{6mu2*X9*TomnSCyC&2hq}m#;7qoFEgJshPQ-z|cA}T~iHxv4L@*(<+F-*g~ z)ZsErJhs@8npJpK#7>ZM3Bm&**zO(qTF~2>ZN63DKu_Y0Isj6*Uc%PBu zqxEMWzX~grqaAIH{3~WWi$SnwDQV40Q4$@ap)*7iVgDRzHg0`_i*Mz8%yF5CD z{uqRuPf|C~I@nIeT1g^`!PXj>Oc#?9f0o2&ORR@NKjrmzKw9%Mo)SV1`VyZ_pd?V z03rEriT*pO3$=%F1j^X}8l@+^9eylPGIxoy0q#olhQ~$UMwgUuc!Cn2c&IwjOB8ZSnT_;A0S0q2A(F8}{i^ zssS@vuoY4od~YC0WE7&)vG<2m?+|d^Z z=97EzT4EILGs0*7=5?eLQ|i}x-<}0#8K(IxDdLvx+#s0HDw3o$n4uoOmnbwgZ5*DX zj*=A%HeYB68L+;di1*hbb`$Or&PzNGl!zRezvnI-gUiSIJ5rt74}p%To(IqgusVA8 zvTWm}s^*%~=`2xQwM2a=_nLQlH#ZBt`N6e456Ush3dt>G9@qQ!XJ$xzgzNU(t**jf z<2xeulLNmNUR5>(^{hbbuI(e;e38*1LSq7cnGEXA_Z>K)tN;hdF?z*2yF*gf{067h^_@Aj`d~)k_)=wwxDb6YMnn@Xv)^m zfLG(*wX7r?!AIwc5ohu=y_>862!$dnW2z8aHFPIrYBIi|Nb+zIr`Vgbj(G|;MBpue7!y!y;hY5q+3R6@}7TTAnSg=$mxlrTUbE>8N#tm=12 zzFtth=PozrSh7_*-o%kQAwhl^=1$^{aqw9{-0IhMe-~MU_puNVj1CIu(4aZvt&tU9aMI-RAeL(ICvLt$?dD zDx0pw_B^`x`uLV{VeZ)SVP&Ov16Ud9sN2w@qO~N(M)~iHMNW@U>*BCdx4IZW$)gns zeNn~!>|aM@k-Q(I%_kkGmK3!p@%Z)UIH1uTRp$z~TikEN3p)i1 zu83L((PF2)Bq?ujZx)(_MeJNDZnk(KyL$eOhlNx5uu_}mH*H{zoCvcKJf5KCqF4MJ zN3MLns)6C`N^X3KU+zjElOizjE_zy8L>Kn4ImVqg!@55$tp?C&qqLm6NVk(PCru(2 zR{AI+Yz7k1oxC?_FZH*`xsf0coB7NNxpTC)@baJ<0(%uRb2&*R}qR^sUF_1}YL*sC{TQsy zC{&5*6tlIZyRW~I`@*CmYWyStT49=Q;I0RBG7JL3(&s=kWIeZX+|t4`1-$=_Eu08; zZ1R1GKFV4EMu+Zjk86H8N>G#@O7yILbdnnS`^O&xTMe$m12)e00bM5fvdsMzjn1-g z-kZWQ?-Qc27r&(8TeOH%2~XGd2;C$byK#?J(sca(@s%P)`vw{KZ62L?2LrSK z`eW(uNJYg-5rI*1{PZ?_;I%q$^DjGY$Q_{#d9i;OQqsDCj#+WYZxy&9rr_d`bBZX<9;W8h@E+oxBA^+s?xgGNT|!MzRRU5G*b1N8OWCy zUa?m=uvFpNlUre9QBlYZ(_r>sy3O3kvU8+b3N90k8>%CkH?2P#N-M0TCig4MRHoMD z1~qPl>N_vHEqL&3_rbiGmcyJ{z#5EU%sV3RqG%jF@(A7PZ!N_uel7Fah!Q3%e@+2b zdMmc4A=huHiu;b+*eO^Fgd32Oj6FKt-6=OI`moZVh~J5}D|qgO-)oUwTe4jbJr={) zKCXHWJ?N2zr!iO_ne7oTItvEE>3|BcKWM@F*S1!Q&njA9N_)AieK{ZK5r=vymY5`M zdol=w(`60~7J00#=O$|nX(t%D!_oW9pkq9XP<7dg3pM~6Fo`I`a&bFE0mt@UOMV;j z&C9MKBuO9&i?c=Z*CEzMZ%3Fm9Femx@v$-#+8(5y%~WtBq|1+)7NfW;?9r+IR!$`B zBt?$WMo5=@J}oGzJ=31w2qc0oeBhVrjD>kUf;?rH&}}qu7L#pol{WKc^u~4EK&PK&x@J zOcx#(cpG)k=1sz>IPdm1#ux3484w?jFr7GYhb7MEJ1?qnckJH4#M-0U++ga~URqAN z#qVFaon2kO!+fVzItIOz#Uwbz-UJabOUy={Hs44VP8oL*6p?c1k`kCadE{m~Q-}gQ z3>p%*gs&9wlAtB_xtXG@Ap*QGi=O}~7l)5;Ae7!--jJk~lj>{C*IRHKa$p7G)12QDM%j6qhaCCr6#A!U%*@soJ4cbx%H7>JWH|_cwgl zRweK&UrOvpLl9!Oj-(pe&8MiQpAo7=&SLu>Ob2LvRFELk1i~gcq{!k*qZp#tesqYF z`Fl`gcF~@7U~jManZpgAASWT)E||`AN~x3n(}~c-?dw)no(HWR;Ykot2l%T@jB}s8 zvAKc@a1hThDewXE5eKQZe8W{?w|2ky2p0@6KA4;HcSKITyp{u16XwlEW6;sx*u|22 z9N~7%wn?b9AWBMSpA&LW*tA0b70?XYaUy>tJ6Rq5)%|;ZcGcU_u$JGCwG+*ty~nEE z6!{Q(!pzpUE-@>8$TY6K2ybK+fC>PWUTkUTp&9HQ?^q{WaO5zIzt1e$3~AZAT-cr@ zx4h;&zYs})ZWlE1n})scExxN~BmYOyw?-i-(Y$t0-QneyTr1||a>}NH>Cq=k_&{x> zYIK~3Q!{FjkFcEFGK$*}1i(h;ZpYdov}xDOE`CK#Oz)UCYScx}_L~39EX(zICEK3s z3QEk+UYIm<`LG3V{`Byt_s5Aud?e=bGxEcR))))a9$U36&>RwbMeXH`s;xh;ckr;q z%%4?v4owx3`1;-J%rg#DV8|1+Vbsq^Op<)(DyX>W8wr83O%jHlS~F{Uz~?(++SM@i za=^`4Z$v&iw5mWE>dW@Y7+H{vuUa{O0yYCVZxreA1{+H5Uv4AuW7a_n&vDNP9)t`D zD9vN&#K4ga6mm8WpYz?=;xLdUiZhL8)l4iC2CyeFP?1pzss8nIXnmNAxL*QZi-c5D zv(!G}~@AtZ5_;DnKun2H|OR+&3otBzFE7N2v>HiQ;%8VpJF%j}@fC_?$ zsnqN6%%4K@-%|#F+S+VsXxp={l?&Ltxo`=?91`ATZ%6C)CsI0M`FoIKe9~Se%I`k1 z;KIAc`)T~QZWSZCCX}wC_EP0|+}dsj@Ky)=OHCm>wk=XcT1o zN8*N<6VQq!-iT06TD*+o^t&Ao7_8x3B(7aT63tW-=U23zyQYfn!c>x&t?x=-&eQtY zz09gp`zFj<$zfpnA0MYrPP=AZE7NMahs8qsMZlPsBoO)xw_Q=fY&%Y_Cw1wdVvqw> zo1oqGfm0LNlYoGgO4GVse)`KTf0EIpGnLES9E=c>G=$rUwLXh}9r0kojuMCRdxq=v z{h??z$RD7Wz8djkz7NezL#wsEwbWZ@tJNZQVskk9Dz~nE5n(S8G37)=Q?!|QQjFx^mwdWAQG z0>JVWTyI&B$Lf`OEl?70co#l;23Cr)GD8;d!DJcK?@AXfym)!wqsg6c1anecIq5mh z2-}9~%KJ?IO7e`!)iyj1BWJI$6*FfyGFQLp2(E9e4qz>@LG69e59NnAeR60`aK-xO zZFWjRUxsDiHN+9ZBN^YLF+P~rTdJ?S5X;o;9dW(w_bZ>!T(oC-vtkJo6?e4+TR?yc zq1NDc9A=Z5xs*F}>l^b(E24=fKy@6VdH!9a8Or(=H_Tg<7L`V3vrfk^xVBoe7Yvl{ znYS)mvG%@vUNhAchbK=PRvo5*R6G4Z=a^QK1*Z63WD%rMDVuuB3>EfV?#GNx{%2N< zG=78E4^k4`gb6Vm8Bf4!(tniZaePIm$61eepBV_?EfJyl_N#42B;qs9Jc#^{UH~l+ zvw_SxklVjR%#Iypj9|FU_=lgIvr=GlPue2d@5uE`RY~mXmdvve2kM7x z($lmhe2sHi2s>qp@C5TL;q)#qK}l{oRa?Dj8yqY@H*%y}K>1aiCp{*cR8(%rzw7Y^ zj7d?spy-@tKl9;hjj!xBwW6OTKtinW2UCLeQj#H4j2i#OZ#g+i$)Rzh_OsPpJG0sOb9civ%Z)%Cf9piTbM^rPXhTXRYv?>)w@r^@I%jJO9~42fG;hpG|ZkcK`Kti9_KJ(Ef2e`+p1JFo__6oBDer z@^GgA`KK0OPY#hFa9Q-%$KFa;I%aXWlbCj_H0E{6XKn|o&6nTsF=-OT33V8{ z?YFx7>PdK6fzbRd*Zv(3%9TX7Whc4icR#CKl<_0^>5Ag6#33v5Kzm#HOt-l8lGW%@z%Y-yjJ&j8UGOvYh zxJgxD6W}p!(uZ_c9LmgT9;My(5ogNLn~865HaqfF30mhdNE)`i@^@W)-d+uKp6`9L z7QB`1t>|!Ek?8~8+PGipa1r$IQ?8kgrbq_bOO#){OBZmQ!&Ph1LToQIQj1r0eUen~7q{wu zM3u3Z!<4ZavcW}bCe^#j`L2FMbJ}{^W}tpD5;(<|FKZDYKv@x{r^XMC#JXY)G4_b% zWXW=A3^OPgk^*%#l&QC5N`>x-B0SUF8r1sfr~A46x6%-Y4l{NtKFUnn{DnODTU~_I zUJhw6P;meeg)5f)S|^K=zzA7{L=N+h_d}-fb#j-UiA44kqZz zEx%BAuNS7FY=v#3)%7R*T9?DdO1O{1?Sv^8Y+KYn&ocmZLe8VUJ&4X}VcSSjeMw80 zF=Hc(YNgpDUfKeFGwFW6i)s8Oz>*q(Vb%( z$GD(N!0B9*<@1nY#<1hC^Xs{u>NF$D9dV{Vo)B}j<{suS`H${uZrXu+g_xb8gwtqu z4T=e@)H*##h)wnFbMR&`<~&xj>(gt@6KuK?_r0JOqeBTQCocm415#zQd>*7fX)=Nd z1zIxnR8G_VZIz&ZDHvy<$G|+?5g=T{+sEE_<+bIF7iu+GkBfA!RC-i6$GUWhN%c`% zx(5`e+#5AnPF&YMU&dMDhbm$%V46Kz9@J6{0-#G}R#ov2bwz*R&wo^cjax|-lFnFb z&8dqVv?Ds?MQdwa7Qdd?&;@y*pWr2^X6Be+{ijiULvuSv4y{yCb*UY7?0oHP4SuTMHf6UZ^C_{h41xB4uV3nNmO&moc~Ukky=jEz4?!;snj^TL71 z*(+1;8?Tj3{(}#EsD*z<2rQT7t5-pA&fOikpRl4>alfMnv;zU!!ae5<))o_16bh}k z^uLla>JkQ?%6%uW5A~b84n9uXMXjN1fiATy-I{Gsj?wlmTr@Vh^b^U-=|7 zF2j4`rDyBzyF5Y);ZWaf$-gdK!6cTcP<=v5HgAg8m14 z-x<|Z_wEUVqS8b~M4F;B5fCCpItn7agLDK5y-DvxUL}fxLMWm8(mP7;K@kK3C>;VM ziXl=11PBm9=J@yh-??|zx*uk(S!?FQu<{`R&N(@I@3Z&wJioFV3H(Q;Ju5h13SW+s z5vV93CBY_3>hf(=9{M&zL%EE1W|}+h0D3x9s3^y_BGwBS#uq_SL#XM}=6~o#uBfLy zTGu@~1fBWoY#V?5byc3?CEIykC^lkfb8^=&;q)eC8OISIQO8ynu30s^>a$ohJ^Sv) z3GpgWkaQ)H|*~*pd1k`klkLEmMmGX;dLm|;_2!0SS={PvA zw;$D={p8(u;exanHw#_%h`2-heG7ph;&X3IT}X9_n$JJ0io_bQkl9?ESaO{ITf#y3vxt{@J7cuZN5UO7q&PK}}}8NKV@3^2Wy2gS%gZuRv6g|TeV+K$rmBM{Sj z^fZ zR+>OD-jdH4qsy_q4x6bRTCE-1l08qHA(`$_l!uLRq_gcyOe00hc2m|aV z`Z_vHYSX!PnDu!Og**^{M` zyrH<)Vx8U1jQfQ@6T8L1R=-T}O3-_iS{XD{=Hu$}z!)=(C6Exf89!a|L!m;0%l%@p zYm?#G5-+*IyqwJ)e>r8V!>Xl0@4Sn*<% z0o;i)fLwtG=r_?dmCg&*SwJMEzxrs}sVjw^Tm*c+fT))~=2U~^-%(r&1w;0}5d1AE&ck;bz=bPISVmz-f-_+8A-!M~nKWpO6C2*NNbsemolf@aXAI zJDnrVCb-}vpVsIXXHgQYlorEl%!Hhd^P|OhEk^FMh|o%dPFm zRub#1&u5DIU=;0F`ct*LMfGP;M;?M`E)Jc6alpY^;jFV@z^-GSXu+1cf%;ogc_3sYh{)~y+zWczs zr0*3mLeSLt{6X2DL8u@q0Ps$Gc4S$ydmqE{F!9{au2(67%L0JV`}%4Ylkx>1f-Uwy z=gSc12bwCiDQh(BOmdzV?P+*35R|9ibAxX(&1a0AkG-ZFM~=caBU;0HqZm|IN$@1}rrHoacToV3zRD zhyPQF*ME2V4^H!}Z;E2IIJUW+_8|Mu5aC1x^gq1jZ!i>ZD9`m3M?+0JhN@{)&F_+D z{Xdo8%dF$mf2xuI@A|(>_h6t--9U5Ab&&GKuvpDph>y0f% z27FTG`qQwllYW0Sea&?iUN&WS^>6eJ>4^Lsilu?QX2+Q@aNShg-_10(Zp&#ZtKqU+ za!!+~!FCKCGT>z1uO;lpPuIj*+|MJyVB*?v2#<;6b(Xbnh(n@hw-U&aeiPi=1bA_< zrOy158sA6$u5O&;FamYaS3Q*I;#A;kfsIv0h&zF+;9gR8e}U!G|dEv8v(h>ca_x$18qP?Az}u^=k(rm z-fZ6Ub452I*@1w!Q}$LjLY3*^gli~uT?MndLv^qqIAcjjA*2tG19TCz!YKwuzny`A z(R|@|34;UBLjs9NEsX=sv8a;oix)5^TB+iqIBT2E*FffxPb>9Hzx6!F5Xh)F_u})U zJtJ4=vlImlt~V?M4tM;q$B}|Q`{dPUzUZiEV@TWqS($~MsIL3RHgT0XN z4O7_ghs$sLI@0&?qqW0M}VOa+^YrpFoJW~}VQoKDU zmJIvc#>**UQ}(5QwK`u0APURc5-GkX*=_Tlxq!|B22&7F;B7H#^t`$?vHV_Cu!{lk z`;*GIOKl%Q*|)gdQ}U;^{{sSZvBwwCG}G6FLK3Shw| zfwo4_UR$33Y=GfOk3r3!uEWmzo8z;kp1%Cu{ zNI!am7A75OS85Sn!7_qpV`4O;Qe+g?)P^9C5O}29@Ax$2*YpYOz{n{PvVRdb$*l^{Zv=9q*`K~HVS(HW|P9Vl##d45ZS^DdQ| zL>Tz#4)~p1(j}||R2i49Cf{9}GbGxVKIya~+Ir=Lmv647Jyf6S!Cs<{7-Uh497S~kA zfuXo8EqM?gC=z`JsJ|kB5nBUOd*|Doti17clCD#tP>X|6MOoC>>MXWGA78CMwRN7oNo{-L_39DmL{R`k4-&Aj1?3bjW#*sykk zi!Ra(h>7WivpFKBl|Z>3 z-oC~28e1k<+u?$L2=+FEKv=chBK&54urVea;-ECLudl6HMdSV8v>oP@T{@!K=v`h~ zcEnUcQDQ5goXWYYLWJ(cv5K}XNsXY|g>6U8Z{PXFW%`uJ<+dDLIP(XhODXC9PZ8I@ z^0_~^pK|*=FhKwP{=bcK{_lit|A$KQ|6OGG|4$F#75@)3j`gig#s_0TTD@&Z{^50i z0P{lu4F=#^TdeBvI^Y+ztbi_b1-$x{>g>Rg<`7AKw@AhpFdTF^P6BF?^%)rF14~|M z*FEGkdqaTmYn>YrJ_VeCCks<)OUvvLnnbpSEXs8ODu|*0Ab$ZOL7--e;jbjn`qKN- z0kE3h{i(Wdz)a=By9KXXn073Iu(Ew9Q&+rt{-*G=o@bD)WW03tho@=wY9}l>;&e3C`bZK>xTH zvZKaf?F?1H0K1wdgo-41 z6lf+uC?gJBo0>I6$3LmOc!8szR%#Rl?nB@7FkNJuZ%3%6Kaq!}`y>EiYX0dC<^!d# zZH<`euzeK)g*wCuyVD3g4jM_DAU`fb2LSK0@1^`7fGLbvM;TE8!0^D&8^Q$w>J0$K z_yuxU?BYK6ScNMr1We)mO$cD*c+ayn7|`tEk%Ay6x3i7~{hrxMn4zB()2msk7`@rn zbqCPg!%HSeKvBPnQs&jUoGfBFPIg-^ckz00U1z+WYeU+kD;H7A=jL)z6o@CdEs3kr(12ETh1A24?* z`kZ3%claFBS+ z>aSDQY%-n%oW(AqP%+PhbZiEFYyetFljVbyqT&=4Tybmw;xHQ)c6kdt==SjmGMn2U zcSmpvv`;Swl4G2r^<|WN_j6U{DwvBModkQx5q7iK>Kg>!L7E0lo9y_U2!f?DQGj&< zE>4723A6^{0>y$10cca$%*qTShg5}k^m>`?*g3KsD}apwK|9T15fNUT;nPs=W+Jm z<(0vb)vWV0cJ~KdDdRxl{)QU+Ofka#eT8R#iBImx2x_fuJydA$J?44Jr>J|_q~+Ee zP3|x2=_4C$6ZQPKD4LcV;8CyiS{7y2nY^7v1@;5+t!z{W#JH1>Ji`GX_y_d38D8{6 z8pnIOIy1B5B-HWH<5ht=La-SAm3hD@1wg=ZG+l%JXPgP%(g2C*SUM{91 z>?23z33~~&>`WI;M_zlyjf)XRE1$dfr^88t$na_(L1z%Q96lYcqU%7OhAi`aQu&le z1}xniB8<%lg4i3_W;l_sPm7)=JZlFBI!U2mEoyb1;7Guw#-=)wMrhcYqUgPV3#MtQ zI>~tnXv_28(*SaY$>ALzvDRXFuhp)c9s9uJ0z$&FZ;hoE;z7v2xd66pUCBy=wMOk$ zt7(Yvm_}dFp#7yi2K;1%ax-90*w0U%d9f2ccC^@@xWgALv84^vSHeTPLkzVv*J;)b z$nD#ZLDFYHYKKxqFJ$i=g6_r01@V%Ul$d_Kf(?u1XV3sJG3W43b)1NqZ?z+93!OsJ zPG_AvQnkG+gya260>x^LZpLpCw%pTo~7VVET z8^jL;4=?c!65e`6PH&Bp@Qd&sY5BqqHDAxwmU9QekdxqZK66bTo z7Vf)d+!a_`7}X4vitsG9j>#c4TH&z`-g8TxAse?qI@-N9a7+=Jw$f||K~3AaBU7#( zy4TujHQqNVh95w{iI3;Hy8*4tT+ab(rG;(C9X2=DXRpNPwcEj=>23lZ};8*&k?dP_V zCDAoZQ7PvxtOT=2(&j0>*jI+0yS))==LhPt@u}ZAi`Suq+4QRl(DE)!p#9ptpwl$c z*gMMIbIa5$SE|P8Cqb2@8`yw*{Q0cV!lQ=m+t@C+lZ)4Ec=T!|y5VD7G{Cz7%`do7 zxoDY2km2F@H?=rSq<5^-c)A06VIim8i`Biqw8Dq&?+zxlv878@DzEYFf?I~zDOI1Y z=Q3}sMv2Mif{yXwvOl|wYMR2G`rEqM4i&F&oh13J5t8v{boQ9_dP+Vtm$6|_+~Tm5 zWqaPiIF0Jv-m#F2rzQU$1O5AvK{?%Iwi%2Z zJTA8KSiB8>Xxw+0`ShHE>N03CTB|drk_q22y z(*a%GNL)x2C@QB1!=4yNAeH08cTbXP1u|$z0$)qG4=Eb01!T;yDpTW{ozwRVqq736 zCb4VVuakT*z{9CGzC67ft}??* z`fySMAE=!jLKCB`+1X7eSJtEyd~OtX54<;v2S&|i@^au!u_ejZohmM>7q#i`Y=#_c zNiQUHyj&c~yv9}wzy=or#nEn7J`NVX8k$iT56;zTSwJ{& zN^P#HTXtCaPE}A=-ah7UJETXn+ReXt2}H!ftbFnljRsqlQCii}Uc$jtE^BV*ntaLb z4T2|utw^4*bO;_d#bw-Pw6YMmk)w3ynK;ww6vo$Nb+CX`_;kh$~@?G^d%80SV83xtUAH(tZs z%woiqOI#*5^rJTLCL@i$p?tb2MYFdyE9q3D4l)r;HPQOZxQmPIrYF+Y&3Y=qMu&-FRQH>7i+ZQs zs~#LO1*d3a>k@Fq_`=2s5xZuIo@ zF8b@NNKku^T1+Bd5I|8(EhRSmaEEzjF)m-5;B`xhS^@E(b#g8|QB|O@NO2ZcA}>?y zwwr{UR&*fcsW>8L%uaG3?P%zw8l zli1(Q513@E94)#nM-JAG^Wy!iTpi|c!4FSWO}+P7FzecD4dxWu`;ujVXcQ9@t*IPz zm|uG+Q?G)v@|~mnRe{n`$wMFUq4Ugrh|Jh`d~00Bl4mF)I3;Ic)k>w&4Hp}{)83rg z^B0{lqs8Rh#~Q6=#@$Bg2kY;4&-$gc!uT<-^?_j!QC(ZQyJ%Y~Rxd2%V?xRP;Tf^J z?&@rGIEDWyh^4?uyEemzt?d2;&vtfmv_wf1`vUvJF6(Ydp)U~z7MmH!4oRP|V2fql zK|TfX;PB*Q9^A*Za{E<)E7{qm#^OC|0udT?`<0!IKdR&Jf7}-nYb=Rv+Vr*4Tp8$m zq>Zo;&DTmW8AEu>ehv(k7$pBHv}j+{B9Z1U^P#&M=a$!3=M`aNVlEEE%gWDo4tGXf zzy$_`UkXNDGrXys71Mj%4N@Z_La%3@it)!=RN%uNTj1B)c;h)MHbUGT@?Av5#y9O7 zrA5UUF<*I8Epyelzoz#GN)0yx zzntB$P1>aDPiq_&(Mt<_D@@`h}NG!Zzcc;k^|Iv+7|B{k@NS9 z&P=eBd3h<)NvI5VHdT;OsTkAFzvF=KPHAB6~gTP35WQ4`?h$?>P$xZH`xxU6H z?G}jhE9ava*=hzIdM|)3Sw!<#?%B&1tY3y>H7buoBXhOkSexjP&NA&*MbUhC9A0ib z+>mcit*!9HiXqK8&QMuRP zVxw_bf!YMF_Pi`Gc#gK3IU?7E56yBD>_j#|WX}D{0k9kIYx0>B;C6^>*>RhW276D(?n1+m|v2Ype!1ftMW zZvA7n*q`PO_@t$S;;XBt+G34r2776?BUh;8LPKuiGl2U|Sgs*7C+!dsC-}qm%4oLZ z=xJ}_R1y(u=QPgm+Wg4bv!pWuj()a}r#fR#NAGvjo>#i69IDt~P)=mFh^ERGtY>xR z`DwS3Wwyc23H&(A6@}!O;kX7(_$WNB{U+7fVzjE>>HUFe-9Vq#r~Wy0A(@V zSoMq;_GOSE`XLaM8y-_?8T%WPaOgfdU@p=f=9@x_3qLzo~-ZbgwgU9;Yh5&Df z9;Fk9=eM3aj4BN|Wk?lAN0Lv5uOv|?Sa_}2^T^Lp9Sz#ivF~>4vJFTyOs){T&l>dt z2kGyHWi-?c2nQ!s4Y~bjbZg5gZSXtrkRxb4Gy@k$3$Ay;zF+x*3Ved3$$HIBSFOR( z?0RrP8n6-XCe4s!;plB!{`tbB49juHjX+5ZYsbqM9-JjrI%X3QwTpKT``a;2%>qTc zV}G4{5Ou8I;PPPf9X)%&uD(jybT}O0SiF1U8$SDn92O19Q`r-i{Eh?IL}22*g)^?) z7l^n9vo2I=5ym>bL#3Ui@AMmhy+bljbog3iXnlD@T}fidkuln`N3GkXWGSt|EaCVT zSZ&J9Q641q?l_*!-x&PH)vdKsbVbqzlV6(z>j!D}UW6y!knkHpofrAGNZLO{wa1-v z_X!WttWwp?6&OM}vWW(s+L&IZAP(yt7_td-(-w(so%uH1+851Cqjx8lg7en>vQV4x zu2hi?XeyPSR}o9<*K?0$=lyy}b~&?Q14rbRPxpNXDnkLyoWpL!x08Q6bmJV1$nyRD zGQ@<=kaUEV>1L*T_`vl!MIS`?y;?llWRn0-}hfa=*4mU^D@)w{E=c{n=RJbOWi_f;IF2x;~zHV|Dz zgocN&IF{IX)6Ylh3s#y7jJwhhq z!$R1~8vlaL#L2i%^}*-oy~fy9gQuFW`ajaCZIWx@cBRIqUwQ4TDtfVb}mt=e}W)pGMQ zl}w%q7-_Id`Py{kOx}mRwaz7$hDQYu^*+T@+e;3v02z4#){?m|jmb@MF3w0T-R7Pc zjz@%TQiEVVNhQ%HkV@E0LF=jd2Bognvae>4#mgMs#VTKSec^FiW6R!y3Rk?0pFjl` zSZ*ExRi2oV(5d;{iOVh9hR?}4&v#V4_bx1+R;bo)4KOZ{dlwYF?Y(m&*<*Cb6N0%k>8X!@Gv?AmxR*y`Rgx zCyHB@R|%@T3EiwF5Wx7c2Cnp)M)Fs1sB?0(+S48TW17KBQr9>+G`J%R_Q;R#4Kie; zw=JR0bsGUf9N|1|O#U+n5D$9*XmGhD#&QviJf#IEbqC`0@6Aedjs`DC*7o2(ZljkT2;WN zrF8yqrx3*}9H;Q=2pr0>6~EkGN~BmBF&SeHzY(J|5sBA+sADHe?AE~U(pv&%Ex*7# zwR;TrCaeTX0enzomzv{gfT^6TAu4pfI5**t`vkiG8p(6*hxy=vcy|H)`}X2&+AClq z7|hQshDSq(y3c}bgB@HIYKh#9Tj~%3Q^`xVaQMS^GrD0Zcm53d?nWE@_A5vCtmgwU z`5|P<+R@ZW;efpP(m7vqj8`!&$B@}3L?QG0_;N5=;yuTCr9PHGWneo>7&kn_ypn3& zRbvZDu@f7hNk0H1@lz6xO7qkruCi0U*u;CA{-}jYj~mceh>+Q{uB%I11!C)k#7h%lz|`Z&AOgJhjuO27lUb}5hOG5>Q4oU zH$Qc#2^TJ6j5mf+=xaYN>qcaZD5gU`b@2yp{w&^abzOG5CMXsv(J4tM&1ME z^8`5hT{thx`~>|pX5I@$KNzN%VbWLQzOdII=gRvEPXlxh+q;E+YqYwdrcbRM539kek&$RXL#mvfBjDqL2!^yNuI7c z@h-Ewq_WzOriQldU6GMU+$8%T}%KbMf_ zOl0Ij`15udD2=YxDKarvMly{q2d)8IeiqMvTsZSZz^E0u`!A!?L+Ycg1A1^Z+b>q7 znoo6|6sB@Vg5OuXFM>Z^;dy-#ao#>pXtdFH)geB9g!*VvAXPezq^4gpte5yG9|N$~ zWQc(r+bX&-s}#|4iB+eCDfq;#(HAfgmdmk)$ww+-LR*~xmqQ+Bpy}P$t6@aDp9llo zksgCW>$h!;_S;ujgp($vtAr$37>%aj$O@-`)_ zxUri7-f%xst2YCRNBN(r4Jb>-sl}Dsg(-UZzvU)+0D_nyC_61?O|DBXb#*mIHF%Ox z$N)!DOz%7gT#c!N021RF&T`(&B#10RIy*jr}{w+lujo-c$$PF~17TzEH(w23s0 zklip+QaA*rJRz`}ymzOWIlk1MBg}`GydN}gY`~sf@n~L*ujU=!7R55zAv)DWU^;T| zrfg)Mp3<|C0Hh1KSkUPlp1@K;FkX>Ucp{&T`r1`noJ;rJ3lToSGO0AK7*EZX-lk0I zQDQDnGW_LB=2?yAYSdregVC-%O3$}VZ9XO<@z32P)^qd%=_P)`OVqLJSw+R~G077cMy_!n9qN zA4|T`$F+M4FGlVKw0R0Ao2A;UmJY}Nb_UHpSAa?0;c?f}JyQs9s~jUH0_9x4&VR}} zUW_yz$pDGo`RK74CBK#BIerxRMCi8(8A_}F-D5x%u&d?g!FVy29@jiY+Yp(q#(cmm zB-(MaG8q>PrT~u&;P`|yJR^#6OTK(7ujeADqAH(EHyBwry}$?P*7ToKL=4Axr+$j7 z6xjq_TZrFLG9MSNW9vS@K~Lh2_HN~{?ww5eF$VHJPV|hB=A%tRbvz4snb4SJ*Q+8+J8KeEqK_k1 z+xksZR;)Z?w8<+c^{69S0Vrqy^+_hsO_y!ka;}m|CgAJOfig_|nk=*pv1_O+Y6>*$(j_@szSiNo4JMe;Z(JMnrw05}b!0Owh5IN`6UF54w6i&_5$KnF#n7?JKv z&T-#0x{V|sIV%nX9OnT690&mU=(p7Ld5w3kA;JUgf$bfN7TVX2P#sw({GWSmr%H>s zf9_3A{=ESq3sja^9Rspmkzw`5;OJz4>$-P=!935L4_S@kC|u{qY89rDfV(HL?U$>53VX#MCyyOL652=KFy zLIf7guEaUdq59|wnWeX!8iI95MUS#Bej$)9TD<%_=H8QXf7>RHQb_-UqcirP{RK-Y zAF1uLZ<@=M(iMbBlw)@ZE3XGc5m?5l`TMNy)i1rfK~RhC%vJ;=fi<8W>E zmv`r@o#t0NA137rFF-<6{au?p5D^~PKZz{%l-lN{1yEek>++UrY2~`L=$2q#>9rqR zDN}w|(Xv9ayti~fiH-wu20v_ydFC}gtMu!)pwk@sQGHn7muJ#9?(^r0XD4~9 zi?KE}wo^^+16z>L{9<6fu6MLKCO&GDIDh{$6WJ;1zI$wO5cT?dkHTD!KE1`7{f6$z zanjwh^crXBWlt4Hoz?&R;PRCftCl^x9#L%O(2$35*@e9qHd7MTseYwQrWLf6+otczQ4L;9I`< z#`2A~Cu!cDvp16*zp6TJRHwAN&2_(MJa%Xp9Uk#8hrp`TsZDU+x7B_k9zDV) zH_q0(+&UUh9GX@NCJd)E$BdP~2KT@eb+ldAY-Kr?NCx{{KYNshl&vOFr`8v)50e6f zxDQZ8?Vd#g`2>k9`1BN3T=i*1 z(_AA5rhUJA)WVwrrrZUG@Vvt-gkiVp3j-UY*0UwuI;*v3aATD7I$kEeb;7mUXuZ{e zs>Hl5uBTT{J-t$RaW;rXCs9X{CXDw$D6I+W;{*n0_o@Y&mMxEau$QNj8p3YP zaO!>u$Sj)FgLOnU#TX^3`n3-skS-q4m!1A9O3UWE?!l?kUA~y7%4UR;qm(Q*>dhtX zTdRd;U)YsmUnlG7MBX+{f{Mpor|6G4%Z5ekVr8~m*C}TYn0(GGLLi0P$Yus@-6KfnE`pc%K+)W^ zdEO#8l~^WP#6*XGkfmwzW_47+f0~yeb~Sq2^T|!lwM8N5dCy_hx3_uxRgGIhBNA!` z({j8%?154lB7$Q;&-Y%w+2;8eD^=Hn68W00U+N|1MMTuQUaX>7Yfom=j) zW#J2@#;3PIRi~Vkt-zK3I@u47EWuW`<*aB?v^n3ec22-?C1=WwainrQ-EyeT;f$eu zXEe>0Ku0G-3ui0=&wKZ?Vx%v27qSu6caqXnc5VC!`3~r$(DCUQi5M-d_no4unYY~H zcOPWkADb46ZucbLOo=h8%&pdyj{_*Yp_UsMsYwI`V`Xc)y+(cF85uazOLqGjL0y`b zZ4wal$c6MTO+8%OG(m`uc|MtJo-c`OHIl)i zJxr7z`t#r1;{}Vuc}l-q=8pe}N%PagQJn@|gq)O|@bDAMHUdu@I&;=m$75IRSf%sA zR%Q`XT;!IUPw)*%6}FyuhNgId(hjT75_zL!b%YKi&jsTGiN`g#As{jw940I7MTSgn3i1S z74J9vn+wpbwzzoVI3Iz7N(3hL6K4IDv4nUXu}~=oNpbAUCfTi!V7eI0AV#Ric%>y?sJD02`0Sf`RM zqr}Vl+(RzXnu>v<5x2Z>sY$?ifNO+RQi*f*@e2g!==k3)AE^&@+?GHLqa`>OJ17MQ zcjUNEv~0UEWAhQUXaK68UP}K}x#aURphf9r=@w~??x53-H#DK))S{~SC`{o3dk!0a z;-k`4=*F({1`N|~?JqCD^gX`pwdm&Fvy>BhJ67eF(-_w6hq78#@uhKUaPenA!=&nX zMCi^n$kx3pa!Ii>`c86x)X`~k(GQ)l6nrKB?QMz0q!axyR-{%KFU)P5bj*7|{uOD? z*t}R+$tf2Wd0^%Ast6pA;WPT9UW0L|N3Qv^+sg|%#%WBDed{cWNiB8z`r@eQkwD@P z+Jp?F9e$fMTvN+cq?yig|M=ePKJs(s?;teBx>z?Ap_QHMq0(=T%MiI% z_=6@V$Y^os!|zhDdQP1a_!jnB5dqWiQi=GC&-2LHFdj75ydEw*i@!yz5jXwAhcFfv z`}3?5Blcp!clAVs0ldL%F!EGPbn^p6TE9~MzS>TA?U2u80G)0Gb~Qm0Esh-|8I&bg z6x+JEHgDBewuMuGg;L{IuruU+@42B1by$H%Q?GFv$Dn|$bNI9V7B7_5K2q!*(tXfX z_hXEjMc3X1|D3y`7Z^RTb2)#^$UDWCTlwKb@h4sLSGt9^lE)z7yz%YEVkZLMo-6LC zr(@1Y@XDXxyiqXO)@T#2+>Ka>hYX=vcka9&c#pOyrdkgKo}97L<)l&{;*TR;Jq#sH z(gWRA@_kZ5yrTAXRk-_?Bq8ajCY7-(-O9B+tYgD;b~CTZop$VNc&-l}i#NkjY!VZN zMCi)ppTT$2L-O-f{enlNY4W2@?=QYULWOqbIYVW?iPko6X_S&b_=wAX3G}lIu$1an zvn*D-gC`dMQDiFetK4K- za9oCsGIhZsyvizApxOP&h);b(KCs#6gTSElWtynEE`;4uoRpjbA@oB7)%$%;$VYpo zMpMJmsj~Ccyi~Ee09I>BU+H{sww-P0k$}|X7yQXZ;=#S_)vfdcuUhKWp1~k_9lC4+*hmUBy*@xpU+aEFVH)@?*nXF!MQMF|ULOE@`^wKL*N1NS` z9TeL5_Jq?PI+u52sXFRMGJFzu<)#Fck&*>Ru_&c7bH)A^QUzuUjV!CWT?;OSe zw(UVBf$K{oZ=q2B-JcUo&~7!f@}SBra=A|*ApnQ5H5jv}^>%`!>JM%Dpw><1=XOO} zoZoRIFP$8&F`ft4i$K!?^pq>#{^UIVv=QffdY(CRHWJdrxA|!|Pk6wwpED@i3?XMP zJ_-&P`c&^!^^%FF=zcj zstU)Ca(_-QjoN^RNL;2dm08w}&peuM)!X`iM*ATqJR7sf{>*cu3kEuupEuWjuKKHR zczsM5ublky+3uD3N$pPsosfM#yE~4R8@Vv{Up3BAK_Iq-{AxW0V=OYzen9hc z?sm=E7}zc}I9?-1{l=auRA3>s$}o)^t-8=g2H zOc1R6V+oU8CPP1EX{ZmgxY)1A-p0u@HVem;+dm<}f8qo0%s&mh;v2nt?iP@bG-XbA zw8;MSKXzFQ$EM4GuIFAq+_2}%h!mcm{M^#;s^MbviCz}1R6=-w_{Q|M4Bu?-k@-%} zxLJ93Aa)QZVrycz&y~WQ@UeQr1JVR+Jdn?Pa8A`HTDYUi;bZk{?X3RnUkW;>Tjds? z>nBVXYNOWQC7qdy`zapf+QDXs9NOQ946Z7Mzj%o*J=~VtbpS_}M4y{hAq^ZLnUKw> zb&LnuXBhJWJJbX!1@^|qHSqg9eB)BL<=-+SDi@TNAgf0Q6{A<-`~pgiP6^=<_At4hKLXZDjj8Qz>}Inm&|Efj71b^KorZ6wEU@ z80;E8wHo^h)CXUQEs}FSJ-;z*7slP0{xhORX=CK)gO|AXXH*sBl@{|ZxE^}9GfqW3 zEfVt2kYWA-+L6L;*e5fl)KV#qx`i__5)=5HU}+G}=^mbW z2WKz2@G;upch03>@?b9S<=qprd9B}n|M!cM`R9BZYWKzlQ%2wohPjk@AwJriw?3+k zQubQ^^FKAds+6oW(ERI2{f`YuNu*>-AC1v>)rQiZXgVndRC;kN-GPZCGxvWwX6-Li z)!zg3NFW@UaX4<8JOs5LUhiDw6#M<#e_kPHbq{}k_~n*4o12mjY$`m(uuQv5520P8 z?V}B)1;cxcr|t1<9vKvj64yvr$P!J;)nKt~dmA z+Fw5F+O<53v%5L}wAX)JDXz#h?i1k11CYSDrB*z#*TL;YM$ed^ioyPu|LieODiQ#7 zm%eXb>p`X?_0>gj@dercG|+#vMv3!vK1SX=pUX@+EXpj(v@8r48K-DMR=f_MI_X}6 z@BEjqcq>iN!v~u&Tf!XIIlTV5qNtgsR7dfW)d-WuSA)C%426GxQy=xQb4Yq{WZU?M z2IO0FyQz70Z!d_Y)O$oHv)v@uQ-&V6?ll3E|8jw|a6A_>CimjsH&ZUsPL0Y@8s6Ro zI&}YR`i{me&TAf4PPkoC5V*ZNbw^+Ffz5@3m?Nbz)X6uU@TUVzI_)6wlJ3&1+4x+z z$S;o{l?2{nS+xp)gWHE+uJ-k0Qh4jY)9RAMw z6xqic-jr}~dx=X5eUG^&(8x}!5HqLJh8QkY0}1z$4kY{d5$o^9{{YB7Gp77Ncg589 zwm?p84T~3xmFpzx9BilpUkUIXHjI@J;Y@ulvD+ z6hm$xljBnT)pj!I)EE|T)vFAzmqPZRC`nduac5PBqQBf5(@%-H;gK)*CvDhBV=sZoZ_&4Qa75T+X&lk(^s5?5Kv-Asmq=xieU?~xkeedcD`RPvRo#dx`^ z9s$_)6@oQnUsD8k`so$-zlx|dMu=GspD%hyGBPTqsdu4&-UE_6^*~A7U%2kHzwE7R zzAGnOI$m_8pafcxAK(i{Z*EJrj-u&XzMu@tuJ#Qf?NmC`RUglJQ$F$k1cSGf?B2&Z zCtpAFv^?(L57n;f8VC3SFjFeAmF`rBnls^msX+8o0&;$mCp9q>3fcFV+~0s|53g@~ zqk%2Bpr!ty;ektiR<$(j6L$!H(D1lol=tJwt_3L5aMi6jMV&D@B*8d; z+RhX5?9sd)@~qB1)H+3m;p?NtFH>BbnHMx}rEv%({CP||Um+HJAfZ{axw+{=r=E)O z=meS|R1Vc8*1iJGbfW&jlPN3>^}%jTT_;u-t(LNzSrlAft)T8 zA`G@IVwGX&xnKm0<$up+CA?h>EV^rML8fo6oGLNA&ibYSUiA99guM&(MhZVNx)Jlb zU1eaQ^Z1NaCgHiQFNVzy{@F1cp(C;8*k_;m)VAVYAeT%%P4dJnNip?CSpuy9S1f9s z0Zh(DY{Ze@W30y-Ap45`JX;1j%(^yZFL-m8o4lh32Gkd?WD5SCLT@2bpO&GXCy#JN z-5dK`HU$HLG~XWZJ6k7P$6R;z7T=b_)}<{eaAZx9T_SBZs1nOp628UW+idDEO>+&k zo~qc-4(iH1Sq8zF^s*iZ2cMzWm3$s}s`4r~*3%oN=oU9|T(cm#vrv6pXc zKPs0_g4*D$FWXTbERM|GCA*rQ%ZHVAEjH}iU5pc4;#VbqoBL`JE|ba;7=KXMPBB8W9|eB&DW24CcO4 ztKmr73wsgl(0sk=T}$O@*47^f+!=+>+idl5gM}@)YqS&!ZH3%QD(EsY`Q;}Q^J zu4s03VH%1Hu9{mlw;k6VyLa*ZAWQ#&(220MCz!u=Bk!Q<-^2epd4X7(1a>Jfn8P6J z#?4uXW2Nt}-jl;~l@R7G^z1Cf!Llde8~p3yUHLFrMYvce6E1XLxUGQk$7X*%B5G)B z(sJM3uWI}IZS`S8w!{Qf)a9tc=(9^5wc0byIQ)!Ua5Iu7oTBZ+RLX3$#Go~VybHyP zwuvn?G68-r2asO2@uOr#v?lQs@NT4+q2*Vn-d!{#IQQsk4Y^Im9#(O!a~P~TXi(lQ zU-2DV963-4wi$|_`ldX#FW|$vkm>P9`BxR#sEz+Fqc=aj@C13N7qC^kOSd^4P6(kr z5MhV|c=|?m>WBFE0$Cow-5m0~k_ZLk@I5(*Swh%FZ<-g7d^)DWG1q*8!iGGW>Z52e z^ccDGY)9_9l-_6b$J8bY%SV>#6*Y)NhL*Pe(ITRj@Z-C-irvk>m%UfpaPnr^?Q|bwzpfTiwh#9 zytP416HgF#+sX7$laBw#*eb_@5MukSiEo-kF69TRH5-3I_T1`hIPIB{HtXkcAndT`7fDhoZ;*Kck)QP} zcST-Z_Uni9i!M4lFJxooln{E==j}^aUGt@^qMjpZ2DNE{!X%%!_!^H{chB$sVQwen zQ=QuUZ>_}3h}!YscY87UZm@bMDY0&~;8|z5T+|L*_0vZm&XQ$Rt#~iA8og=ku_yMi z%Y78?nQ5M4n2c+34wT4+;=q-CNi>roRP(NpWJ`2V56QFC?5? zG#IE6f?f_PB{^D%cBZ%36ohb}YW2GW_M9=e4s5K5gj7<`JrOKCc(Ffha>CRTD-iWt zsM9LCa`v&P%Ln0%0Z2jTHqQAwKZXeHD&6La@2h}cvqH+GBxciDOAWfjjPrTtk-U@e zo1kAP9-8np;swW_M#GHw=rPpk7sQdpnW^w*>*DTDhjP?I05X?&A*_LDde-Qfe<%_D z`^bUJ3w{}&luSLYPQ+Ihn0B54x((AxTS8<4p*^bQbokJu3gi4sTaHUv+2y2>)WoRb z%+1wHIftb#A6)&ce~`EKB2fk1=>UI#e39oeZdg~bTJe_~vwdx?07;NHLE?P9PajE# z8Kc)X2<=CDRi%zd!ixmSNK*7;1Owb+jJ)wOTbMGk9T905=1HQ%##F&53cf1wPfa@} zDVsUUo9!LpwIQ$^y;WM$VrP_X6kU@^9xcB$2c&WLUC>rw?#kZ>b&_YItb@irZ;zkA zmtHv9UsbvlDPxkRkeW@rH`0gPc{rwR)uT!1d>3`Dw5&RP`au{qrHguqDAL+F8^yKY zE>)%3a#VZA#!PQMZ{SD|CElsB=Xx7NzV*$Y9^i{W@&;zI!HlU`zE7P4lNd6+#>b4kWP-leKbGnD@4V!*oR zoZ+jhZOm1SbK+nr_iEt-f$&G4vx@d4H7I1gRn}i&&ovR7I7i_Fby`BCZQ*-6g^2e~ zBM8A1D2?x6-U-YF-IcCGW%k~*Sv~ia$PX+*ou9%(4E$ZORxU$99+%)TR=O(f z2?;Om8kEJSoI19=Yw{^y4e>RqjY)m}NE6M3W0_t$jd$A9@`IA)!_Ac1Dzi7xY!7PDa+Ax&EX#T9cWtP z`Go&wsJU!Wky(j$P`0>_dI?|Ddd#BvqjK7*cXM1VnD#lgqt+*9uhyvV0k+b%nafnzo5T zlhvDHp{vs(gOW{>999|bi!Ju@^tyBL6{?8S=n4-$Yh|lK@_)25i^|Gh4-eNnl*G30 z)24g>eEl>yikDpcy95GKfU%$&C$OjUfj4UsptCXHp{>hp+ngy>HId2B9U0+HD2}$u zQx0pnqw7jt2~!zA&KlTnMD!gJTSDD?FC%=&friefUR?=~c9dayyJsC3g>bz;Yr%F= zWl-Z7O^T%K>0m;5#x55Ek2@v}HozEOe-_KX%wY8+Eb+ z{4I*?u3bEmL@oRg7;)W8nusm+{?J0ZaB_P;EQdDZ7hL#RN??vs=B$X#f>oNDNK=~3 zfG1B4*rEj-6ZIUd31IV1-qp65*$Wo+{aL0k2I#X`ZPrU@>qsqXZs}31Of8Cf3z|U7km*P2|=A|*?%zS!C$UAw91IoDw8<* zlu`cuY2^be_lpRlwC*O@VbCOSY}~A%iVZ<~{;sU?Y7p3B96v`N+^!Nb92fP64eLc? z`8~x;{(M>nm2W26N%^V)9>wtIyZDfn{iuVKORLmsd|RI^R$h(Q!A*t(*T8kcG`N3~ zR)%-V-{j9toI12(0sRzp!M_Scs5fsi)?%TYQU}joO<#3DW6sQ zl$|%Ub-Z>KQ!K@0QLkA9S7GrBbZpz;_D|$t6As+XY$|KaPo2rBUM3Qp7Gr0si->?R zQZ0G;MAu&+>!UUgD~7XHn{7hhv726u^mJ;blSWczveZ#gixCU*KHcx*pM)Jh%vcvB zDDS5tbilI^0$#V_E&e{?^BUyU7^J<|FQ0PPJ5sN=XeJ(>GISH$E^9P#r~Rc^;qV=a z1~-AocTuoTa=GkxWy{@W8X4BM)+*9klC?dkg0}?{t4w%KCzdhIF zMkPIsdugf|#ZhYdfFKI75q8+2dd`OFzl&no50ng|o~2hb*ng~WOkeLq)ETe*Vs*P7 zBcp848eu`ooiKnIHD2soTTN~~BY5R2Fs1Kf7upI}55{QM?W)S!Wj7>NWqzUT?RKXP z!0df=)bW1y6+oLPM#*`BPMz}S9!+KoxM}Mn+6wBtyrPJf$)m9bqAIliM0pT3SY9KIMk}T3I7WHwHYmf z#Sfw)s|?BvpKPn_K6aig&|tS%|3z1t=?w|IlCE8v$<@FjJRD{dxG4rXK$}!iz3dVC*IA>7zJ&^A!N0mi;ShJ*HkK)5{ze$0x;&AoC|t6(zGghXjFYSg_01Cc zo*5&z#KLXEx|RY^6O5BKx8_yhniH?9Cyi7&aYpjxta;S}K{7Dwe1!}B-l6VG^6qP1 zYgPn01w^LsQ0A^eVPc5hsYFXlG4?g|3&C6$XEF{n9-jYH_tZE^aSC_~QIli}JnU4R{i8D)esEA)qO1wnh)N3_IF|YE>NlQMJ?T zN4})t+chfqtnJXnDoVCC)D!%t-X4#iovZ_Bm%X)WWwZ$BDuKZLCjqkwI3`dg1Q5>!s8$dE=XkqI%DsqkCOC z!*}Y&kvsCR3wc<;&=!Y0w+m?f_&#Tv9!deS2C4r<)=su1upB^k!xjhBb%-N5gRxgl zt&CU2q%e1zC*P;e*3S2Imz_#ws=AOGcVJG-fLnHesIIeo_T?(esPx8>r=Ymww-2>t zi^zh!z$JQVB^Zdmy7`$$M@#8|e^ldwX#OWhXF)zf$yL_@&saAG=>K{F$~}mmRKOa2 zb5s6R!S+phb@rq6CD720{GcM#bjQz7jGLNR!c@P~k*mH`wW&mg!Nv0rN#}u6CwZ-& zC~NwOJmcP=wJYMJ8HUN8d2fnO4X3qye$qeaoG2!}zD9ez9r>&B{?27!NKTZbr@bJ$ zQ(;DoEK=xHVZMig<@dW1nS=xO<~??n5A!_6_?Y%*)a^RI)6q9pKi?Exfw%v_CeU`LLXJi~o>T^U$P?6t$32D7lmVMSO=t7QjyR~z zrm)9-lA}g>_Kz8)$nS~ZFE-7edfn>kQ=eK~pl{#oepBCJzJD3b+X!89C)vuoD{)XH z%;vm&`kKA$xH6~^A7Bn_-jY(a4EiU-m{R%aWX{JG{9b(u{ z*+S3;?fJpfC0A7{7AABO+OAbd%&!$z5qjHt<+099K`;j^LufbgX2wmc`iIYYJwZuE zEtm00cSU#bwHZeSUMJJvD5??S=C8+$dm>DmXn@>{vC96-0WUcm=rY-nljW?}8(xIv zd#9Y`2+P7uh1DPG0^wW^fX8bYSxp)DO0(N#zzU9zFbo^8lD4d(_m7CY9{o-?ApO37 zQGW?MK3T8gfosNxMd=SYDN}6Bt=QJ+6h?`RHHMjxeE4m*C~`0+&L64hB1$v3h1?tBYbK2ogdV*n0eE^?AO(p*us&e$Zh>47^R~GsL@b` zk09c8^@6tQ(*?T*ceT-lJxY8&nXDv7KKv)@-sW%+9EzI`JyQ5Nl2Xs%#Z-HpmBvIK z^s)fzgsPu|JUe>Q2D2!iTkD^sY0FEC=)HJWderHhs8XWIXEhKjk<)T}Rk)JrM%6vX zA0@)aZ<_0l*k_)O3WDk88c<{dh-I-xL*;N#>YaH5<+hhj8oyxe&`Pkq)60qcr}g?` z=)}!zAX4D;hRjr2&6X}vB?p&`a zg31UD+F|^KJ$E4AN&s2gUwOB!tG;VKK$*U%EI{4{hmr$6dB57@v)gZiqrydEaY{R3 z;1C;BCEQ}om5DY0RJ3G5k0EDb%4E<}?99pNcW4Z^R<^L}h+}zu|E(!{i@R-I@OXI&S2f!JPTV9+L zsgVzjr60a1fQn7PsA;DjPGp7BFEjW^BrL*n6LrfpD*Po*Qgdx4(gk)g8IRc%AE1J; z8wFqgVmd!gmEciIJ`%+AcpanX=nNG!z)><=+A3?rzQOxNqek*i%dw*uQ_eazy^)dg z6H`xy+=cfC>6~pj?K$GkIJ|}Wz=-OxQ@)2~Y3N&an(Z@?4oOJymvXtv^p;TrvBIgO zIso(@0Oi{ou)1n)`Lhn&q7(G|dr0*dBShW@T{VWGCpftQm5Svk4j6qR+`k@kZNKQ- z50zt@Khwx!Zra%-M{!Fbj-c+kiUdeKaGN)FPX@oGqb(-|ow({-gF++XRaKd5N_2FBLo`0Da5=wi=i- zM6RchtZ=KwIODjUZFv6e^COZNtLx+=@mgxG(XG&fQ(s2bsKLr)I>F(=QdNBGe0}RM zZ<53+Wrq~DY1$(?oZ_Ic9TNymT{&9WO$&OOdZ2wEW`oT-EF-(^j6wDGKU5&5EMtPEFS zE|xT2nTHO!3ejPXj{2iagMZ50#7A~RFv*q&-^wMb1TKjH%+N2Ns?}fxu}#)&pF8&Y z_2G5IJ1yd~t&-V;SzW=ojnW#|{fx!QhVmt^U6Y^aIF@3iy7@U5kfO^UvhD5YKTp6+ z|1V`qJ*~ z!FHeYRl9NzQ(fSRzP##J;AwxQMmiIZYE&Z$G|?e_)PvMJH27L@C+a{b6tJdF93~DIn#J0!*~^R`^dl^Bc|wiyE!D zqZQ1nN6Xtv<4Na{0qc=Xxs8+eFqr~=E5dUJ||A9_(aVY{B6Auy(Z+cFo6i01kH4>zc_FYcqZ#w}Z9?oVY; z(s(b@3gMS%8J2x$!pU<}`A^@8^?V)FF+8j);d?kB;!Ph{3k{qT{!Nq(=L+6W;31!l z?vrOI=YcPp*4wKZo!;W3)7H>_((Ch?neDY=@^Dm438~$CyHb=@W-J+53$Xq((v+mY2 zN@rO8!iPYiAXN*I&w)*w<{$6*^7`aMpG0%}4i2vRZX(^Dw6F*#K)=3lOeg0Ni2RV9 zka@_MPMToH7E3fMXzdB$K0`Yx@yh^vc?`f(^m#u&^x9SfZ@}N1=hKf=&}L~Y$6VCf znp!9xxI|XC4Ue)`*_y?9*y6_F8RG(v0jDaoO8?rPBH{D*63X10OJaw077rj7IVV>$FfTVrCTo!RaAWY3va z#~HrlGgq`e$`*mbUN9h5x9AI@N9@Y2C?hX1)M?r2IJ{ zBqau>bSBnsyL{%&=nZkM_MR}Fu+34!ZRtVSs&eb7vE77HHrGGpqU#<%kZ^BYi$M-w z(?@A|5wKwWNr;TcO|S-LcA6AO7raeSeP4C-+yQ7bZal5JVz~THzCdV*I=qxuR1s!} zRry{2+yc^O-;r*AXv{p9R#|PSY{3AHhBt@R>$x@nL%l-%I;OBHmr&fquL755qM=yf zN@~R0TTM&8e(uhLhn#O{=uLwr$Si{VLp zhWV6Jl-a{w+x0&{gP5k_VWsVYM46e73`1M_lRcIFVDpM%tF-#3?QejiZQkufPOB%6 zRZNmv>o&wnK%1J$=E_;mxP)vQnbtjeVvJ|D)xX2VL)oob$do}|VIGN@dKkLD5Q0K_ zm4!Itv4mDthcO~{w;lnEIG0Awf8K&n@lP$Y6FyZ3rqGcp0~e32#H#`x zq3WigAYN|t9r=;_zLie&4g?>6Y#cjICQGgW;|*u@P>YaZQ~8ezbUR&VPv|JzDP4T6 zyy=!;OmU*UXQ!a!ZRi!v5hS0-GmgiWRriF+kVq&?tzje5M1obUYyG6(Mzd)w`)NPV=cP(j|{d8OA7@3{LghdmwA6 zuYwaCLLyWQQ9>~;!b6f+59fBiU$ekSNi1R`0YYnV%1{$9^Bm#5v9jksN4yGWMI}JE zXxq}sKFd`1{MNV%ioDFUpA+kIYy`VTY_;cM$%(0W%wsoNav;N*i8G^X-r`1Nx&CsO zeXj4z#tw<9ESVSaQNHqFTz5rhUsXXH%EyY0=XpeG(e*sssAPS=5C zh(j7n1>2S_GRo&ty8 z8JspiJNp4`N`_X}Uauw6Ti~^FuoQ&vbn!PK-qGg*FWG?T)K}iAU2hjw^uz(-Om3_O zGlJ@yxr$tmj9s%w4Ex=VlWC7xki)Ib&;v+rWoU@WEpYj`$OL^L!D((po}j#`3pswF z;4B1=1jYehlFMgYdDvjUB?#_*9uQdyo!SeU3_&~%Zo7=z&FtQ@R*k3BL3&uo&kiCJ z@4(#2nOkkwU&MaeG*DsSrzS}4&>!x?M+l3c#*%CY4-h~8=Ly;W5^6{wZ{Nh?jG{|? zoyrfWOo5?nRs}Z(-i{4be6e_8Dhm^R()Znm)u$1fj{^@?FYV|~eqAa&xvLgzEuYw% z?)*bF+$rNwE!j?G%LQaQp#rDYfATn(q=Opq&6L)q+hLM-Z(0qNIz|u?((ys!NnMqZ z-aj3Fw7sSawCCs?*~AR=W*V(scw;WjO@(z8_2Zpp$;W7+?dVop&X0Dbj>%Qa8gnvR z0_Q3jy%A$32-U-T`pZ=^AY*W0#-XXbjiyx1HNJ3PZM8@1tFHo{jH1N~(lw1{7_Fe6 zs51Z^hE@!H*O3*)!H>fHx4z|H(n|^EniUCC{!AL* z7P%3`{kydIrR`B$c#+wchao(7>l{RtU`;~XZ~OQ--Zv@YML2hUu&TIYd|5yKVJf6( z&3uf?ncglVWDYwpx4)P8HQP%fJj_@m!2Bzr2fn@IcJSBR?!l_K8&w7#cPU&zRzMYM zLc~lx>%u!n$bK+alZVtsUygZ|FNBgoKI{n!zc&r&r9cB9(o{Ppe$|Oh6Jutj>+N0X zaGHZggjwk@Ixcg>me9Z!uygf1wp|RQWQbzb(zv~MXO-5+c2y{x>*C5eDKX`c#{uBL z2L??Y{b<(gLwZ3DZ;8w2E79;7AFTk}JabYE)ot<(KQA(b2JZw3@fsHy-{tu8i0}D{ zt}|!2&-2USjol#%f$<958mTLEWE<3G4-Cv1-2}874M41l27o^CrVV%AbS#Xb+!Dds zo}YwJ^5@xd1hvEXhFsJS#l^Ia8iJkN`G8Jxu+|MB{s+D2eFm&LQPS&(#24x5z6|Km zMSppbS~d~}{hKH> zpO|@(8_e%~vn{gX19~}(o6YPBb!sy0v#FjlBX>;1;g7p7)HJ?r1h#pfT*6uB82_2_ z8-BxW5YFOVNLkg_DIp_$)lKBm>(3X?|HFvXVfYhVe2j{02U9GtBLm0V=7JaVb%&yp zK=~WNUt<`1_k+%Fl@m0J`&amEaCtq{#DPMPW=rZUy~2x*beQeWvr zU!>jc3=b)L>#h#l_+uPat08S!C(R+-VZt}NJW!+8*AZja!;|89rkj6$Jc8nRvc#3~ z3#Iw{o!mXqL2p%iPUYJEqkJYt$rL;n;yc^sFr|81fjX>>lpv9YCVM1O5Nb^O_UcAq z`tkc7A6O<8TX&RW5^RxYZi@RSo(z3a3z3SzCIvo1UCOx&4iTpenw@lq>@vfjb$ZNa zQG^$1N1_25?vTD-`0Gx>g)Mi%mv-2>NlziMDfibNHSR6j2rR^cuLN&?OuIhQ-rqjm zEKUSWcd#0+T(n9ONyey1fcF!-Qc=6cFO2UnKWP$%kJzeSXxyC*G*4(tbbm~`mGevK z5`RV3@B1CQX5Z#%BXf#Q9AqX-y`Qh2g!R92&2W##=H!K04K#H3?sL|7#h$-gq|CHS zIcQlBpS6CLeT_{mdcURAxaE>^!9d{`_C3nqfIZSGCQ{&_4xx#o)G^vdI>iX9NZIjc zbR}YEg0|`<^Br-)CX?WM&ps5D7+DX{b=`QA?H~hwJSXle=FB&@R9E8{+_90|S4!ZM zlCQ+AN)mtBUPe~lwxWn6Tlbho0!TWvB56si? zc!J#0`~M(!lIuD6(){%2HUekLp6^m6ExD33<--z{o`IANZ9fbstlga6VfT^fL)*9v zmIaljowzWeCR8qjOPSQDo3<*Ll?ZC2l#?)b_2568go?zxC$@J((kU>udryR>}hW7^zGnQV27Jg3q9ecmuIJ1YRjE)0G=U?a!2Aqal;wZXVk*Y z&v+*8P`ItX$FhFiC+L1J(c`uY@TcoZf&y%_PNhjv08=fU9twAGz$Q7=nyT@q! ztbbM-xmB+)=4>^$6iT+H*tDS?OI21J#pQb!WPCrae@~lcNVt|WeF1rU8VUaqs4G$_ z>b&ggw5Q_KA20aaD=f5JgF|IEZbQyFU?zd=eKLSgAzSi+(_XpkOsXm9L zl_}?794^wg01-ugOMxo3!`NNRiKwl^#LGCtJN zSszFT-Tb~L9xm$-XsgI5T3RT_7|+=fP1mZ9xt@XCpf-kQ%ktMU$c__+1w`ex3_{Az z$vYXn8SH#0vrHT~+MB*|Z+TB+s7P!?_0nsMKSZ@sG1?dxbWCqP^Jj!y;PWb6_?#DH zSAqxbP z6{wrU3z#{k41ka2Iv$xZ?x!*XAJPM~+eY-O`%lAu} zhoAZm#$r>ru()0K^nC%ll~(&lO?l7D19=;>K6Cj!xxvKSM77CZ?iyy?uAm7(cEoEa z*f)q<$9Kw8=J<2v+%+o?Dz%rOcHWvsCqWh-bsq1gFmqE|wcUDxM>z}bxMp@etq+t9 z=uE`N)UHuRgbAW+($<~loEIlZ#~P4VvOeagt?k+Qc1s+KWNrj581afr7W;umesLQo zNoc(&DoBgkkI-b-a0UkxUj!s8UMdcT)DDP%r{5datSQIX0qKJ=1tLGM@oJ;|;G6Bn zd)oU9(aXrKNitufy;AE(iXZXe9|eb~e1Kj>FoPyDW3aKGxBr6jvjWc&)i{V(5z2dAT^ATHG5r9uDiYadFG2pXEVKWCE1s}u7RyNy zKRx_A6gie&+UU34LZ09ME=@R7D@{N^~hjUUx$K$@N?9^Q=KtDU{+lx~rOKW?s z7zO*QQN|^png(*n6)_UCy9`UN`Wfq!8Nf+IhKen^yzXvN#J(B4cr@V5#24EKPAm>O+LTS0?U{7zBE#?8Rlws&yU(? zXV8geX5S%KwwNs~#CTQh^ri1j1)A58J=Pim{}C8ZZbNqZBGhEGr=km^?!a6}C^Y$pfL>!E%UvGC8lXb# zTg*CAH7ddIDgxvlN?2+9if*kU?*t?uYk^gRja&~mg(Gz_`5VA4PNM2P8UESz*D zSeaPxdrV-C+$yQu|HMv#EWhR}9MNnxq7dhPE{vOf?|+rLYy7{k$p3;vWUlBEked?y6VNzJ5l&^F zD6u4y4FS0Wa{vV88XBBrO?>wJgw4OZR{8&%Jb%Oa4I*;Y2C9CBl>U?MS_Af?9t zfR;nm|C`$Rts`X2;K6dvUnA~}m_Rs1OAH}ZZaWqVU^$$lFwD+RNo#yq)18-EIcP3sqZW+ zOHa6is}{TC;@}s6iH^E}#2HU(om%nzTq0^L9+`I*uMEF3TJ|j?~!9 zitaK`fZmIqh`twd54F~WYYFMhZXXw$CU@P;uXDr!IO0alqxA=12~EmKGO~h*)wDd2 zAeXZ%fn+GbO3n=7WP0)zIP!dYj+Nt*Ju}Zs5X&p`8s?M^?Gc(rYI5;gC77wIgaw(n zTlp8iaUNLgL!^+67~)__SuU2g11tHkqAB5AWU>N)oJn6+wq6^B7n-NCr^^F@ybs@o zca6tGZz5Qt^J82o6b)3lE(}!Wk$hP0%dtBGU=8P=he4mnZx)%C+BdM}$WkIkDBZZ4 z0F0eyxcS2W)&F_{N;;Q^wodf00Mezc_>mg~04`zpBN-Z&fxM%P!;GvrlbwWapg?zh znoTv)W%?8O81>>t8>)Z(`&6rhhCDHta=wXT^o|Y^*9WSI(5zmj0J>9*P?2G@`+ReL zk@Dm!?H}7EZDrHRNY|X&jKvu9ZM zA;;8#lq9+>KKg&a-{d7D@{}kSavfg$GS`Ql{eUta>N!Sv2H2&D!>9WYS%KYq;7tD_ z<9Br8r~Ei7oQf=qMosN)FV_9H9hnMQGs%Zxa}(ObI>E$nieLaCYe2r^ss_Q*+Q~ci zOoeFY^oyH}Pt_;5;5ud`;a3sj`K+RsikVT!f{17xU#plA3N(#gR(60{BPkjxjEh`- z;au&LLS9XNtNa_>VyWv$kG@b<;Ywy6mWpI0q8X|P6zE-OFco!=DND7olg{Hg2tRHl zNls>Y-C0I}s)nZhH57m?OOE0pd?9mOm>QSV^4wiYO{#bJukXp7p)KTk{fFDy z26YMwbcySwe=U}A!#>naZL<4*a7Do`m8ia?m_F(iVj9j}m_M|&%^Xh__GN9Z{X@mX zdyqTSjZ_Q9xzrV7_dckY(wo&kZ3LtB=tC&vbDcq%+0*0+)_>QK<6(lq=`|noMr^2a zf(ZG)$gK$Zvs*PBK9({cILM81sNwc}^X%2bj{;dgQtD}N0wmBaR(-zS2?HHlU`s=)f)iMy0!8U3vYU5+zivevUX!vl{Q*+g8xg3ybQ8x!1pox624E0Xsr$UXQ#=r-hr z?rX}cJ<+c(%U-#0@`36ajr{xDpQ!qV3}t5*ylOceS8OJQn6Ba*X2P_#4|YkE$BHu8fX*A(gVN)3mcIuI zea9jw|3d{I(+6`3$sK}A;=qfW?Ll5LSc|KBf3;5KVAHE+lA;v3DIEvlyoA69Y8GJU zTglLEVCuZ1UQX;F5=kpA*cQAeN6Ti`-u-J3-7>f4)~nR%HRk0?Ud9YDtIu-%vM=Yc zRE({9R#W8}l*P_hbP5m!NUSwxaUE;7jP1|RY{Z9v4jM^RaS{vLb_u|rvD?3%-iHh4 z5r21=T7&-kAZe0@Gy^TPK@`R)`nL`qET0S3XvcT#h|NgOt#&+dzlf2Z@itKTy=NAG z7O7a{8mF-)<#n*v=Ea8zgTB#sDZBtQV*3u{>1rgzzMx+gp39VW?C$fPhPp(mKlC0Q zIf4Rz%pBD^b}JQfZA8@ddrIHu%D(W4hx5}iQ><;0+pR4#?Tz>Gg0G}(DZg(OAkSzM zpTr%54;&ql*Uh_rpmD5jcE53JH}Bo{f_B-r(?X@QfmA3kgx$mc48J~GVB>)|yZWSg zYwT+h4X{79&$egp3YO@*z?{^3-0Mk{tF{Bcp*K4OczHHi9} zc7+fV5XA7Zcs{V{^%$-Kd8u(I}2VbLZvAx$1PF+x7O}&-mdqe@bWjKEA5KmMBDBbTa%AYdW*7 zCH<%uez>Ddn7_l1Q?qbfJ&;pf+~U^-E|0MM(y>-SL43#V>uE{uQe zq>ERQVsX5&Z7MSp^<8JS`)tpiA5~l!!o4&5720nyd!)>8_jCLiOlau3Rb@s7ouEN= zF9=u;8hq?|dav#UUco_#ldd_*OKbCa__E)vng>m1bYMZONyNf~+~*#n_=}_EJtCjy zHSl2slawx(_FP3FTG0dlK=U|VHKt$6tJ6ZTeY(y&b=&Ie8NSmFd;rKvQ>biEXZVw` zc6mfVl=ZCEyHeXwFEGq$>gDLjM?{+R89~&OxnOnutShqTu$gUFcV3dH@&0j}h0jHijAI_JX;#Y-p!bK?f|E{|znbvNvJR_TvO@q${-e z(3si8Mi`V3M`-c{vBNLSc5Y@~z8jY|{{86W+d2LY>h`Zy15FP!i^u4ihNP(>bkgvX znvO~|PTB11OKdnl{#JfnryMQ}=>6%v8+VJlB(MK#Xpnx-g{=mc1LW{A>eph9ssaAQ z1odKPipnlk1II35lEvXm=FFP?DS7c|Emhb zu0mDvpBU6u>7KrB_Us@z16lNXl2l)*$E4l0&#jjsy;1l<6vG5SiN36;@XK^Yr>^z4 z6H<)i94=SbR&?BzQ3fPIj{DMq9|kiHWDHcY(mYB}B)~l@X*{#Gh(ze)Wr{PS(A$EE zo~Ze?-qmu!rDn?}RcpwkNWR14Fb54im0K8)*)>nPGLb$0W~@qN^N=sj9XWH~5hSmTrdyJs!mSL@zE3PA7+RkG&~(o`CRGOpbe z79SQ>=Ytu1SnN~raQfMN4I5D7V6o;@l=@`;I<*|)9TsYi$=UI}9 zFPSbA6?0gy@OK7;FD+yfi3pT7Y#Hgixh)zGDOgwcYgLTa5zaRZ^?WF#z7QqY&Qh7| z5@qGp`3+hrxU>XP&M~sdcc_n35WILj#}A#_@q)s_)~F+IVoC4eb$`}!!ds0}nKQIQ zJtJ#-iJlg=ZsbR4lEa2v*hKO;3Ptd3>7Po=(cwISZo2VxWb`A^zceaCLz_!DObUGC zFD(>bGPHlhFS1=-=rxL-gUTCajFf|tHF9M{dDBAGvF$!qX7@Wf&w2xTR}+Mdx0c9Z zX|5GB3w?^P6vq;}WLnXaqw$5z7-axD;r&yI129Ob$~?jx5zj881N%)*SIqo%qZ_dQfcJ&GI9%skVywx2=u15ZSl^J8R?^zUH4zyxx+da0E#kQ* zDBQ`dzkcKaRTI;;i|Q7|ZgTd&~ARSAHeUajGI1vDDd ziyhTW6_d}2BI8DeNGc88_{THQ52r7iPM$6M8yJdb+_Gok`$d{s)lm76)>An@d9U)A z((FgIq$a8iYS1F7_H(FyBG))=GCJO zdjI$^qBHcplAFe=r_#5R%?tR~!u9BFJCBQ-r{rTzF)&v+eslL$lBD)(EV;t<@q>Z;qGdf z&DfNjSSgyYFy;#lUucvZn>sw0BlmkHyV*&zEw))Addi%4?1i;~|9ds#(~i5CT^dJP zqFOLCoLGx92$6AlR;orJ@0dEmrULGrXVMhN(!LZW-{3dLlJvxapK7i9L`>twr{IP34L_Wv96YNW@ z00G~8-R8Nswy$w0C+3tf1hy$Idf~)3e(!t#Q3CL!^oB5VPCdHu#hF&TlKbzb8v`YD zwWg%fzw3XcX9{iVFG9Nm7?kFw8tLe1Vaa-IQ(o(uh;!bV&XPsNQAzDTS!v!mvcsP1 zQ19lr;*tlcYeK=oH>Y}ury-*xRjHY@54G$ZOQ+ut^UIg!l(tXP(?pGV?D-I9;c>_M zH#|#5&xzG{#4gTm!Y_8+|N5s=9>Xq0un0w!>YVK#;B2@w;<*;MO?Xx!wp`6RR{igX zc6wJ#MLozp9#q`AfVJMtFEM380)Kw3s?q2#l3k^SU+{^wlhi(hz9Av;&d@VG);H{z4IXrVylZ3+F zzhF}gb$uv#T^6>taSs(Yy(=jA?rZn^V8~%Ns~I_)tjN#+K0m`% ztEDE)_ayh~-lMobUKG*;7t)tJ=Ac6`=w+28VWNSzLbk&6>_~K+Fwq9pQt2gM$k*y$ z`?4_b4#-KA_cz5KL$l?xL;a6~><@YzDpfwdpP|lC7X?dUj8D)d!0R%Beg?iFvz7@1 z$5;36mrLAQx^MQC)maQUWY{=i=%A${;BUy@q{rLZahedLCEbTRJgJibH^&jNvx2Fv}H_J{7Byn9`Z^C-hmh$Kh?I(B&RbKK) zzsT1Xe>~cMvv<|&xP(6_l%F%20jOCZkbc1_zAGxMb#n;d;}>__mkgOn9u}M~j-S2z zTr1_sBI5)uaGD{HP1-ha3)5CP!@ObMPWnd5$xaGw{+_cRaU|9JVDN>HbGgL+8Bw^m zY#n$#ujyr!rdYFsd@~S+Ptnt-n!9qf(}UgqLE8hB8vC)KO)r6toLz4T*Lxk)3#N4} z?3p9+??J-f3|EPvtxzjP`wJ5@6bmY*`ibgc5aSX49VxgC-nK%~sLUNCwEaN*NizeO z;uqId-ye^NB+gBt%7>@(0mcvVo&>0YKrSCr_dzaW*P)N$34=7yQ^ZK}HCCtp!_;+$ zHMKN-AQTY+qgN0@4GBfMRH-VV1OybNNEa21^xjFhs08T&qzPDpNC)ZCaur3oM5&=f zs-gE5%6Gu~zVEmH@H}uhXLokyH)UsM7?zSZb`Qre_@}U9LDY|zXGW}vGe47FB|H{a zx`f_oG9cRGINXUPNta)v15-)+jkO~S7+UbE3u3`gUp_2l?}<+Aj6mOhlM(TkA#S#c zl$I<#&JRAK{AG_HZmmL4uj9{Mj1BGIFSw1ygQQIdi)up*jrx7OAe*3b^VNE9QcITK z^ibEwnSonoCDQEOFGmD>e;5U#OWpm;UU`UY4s=-JX2eRI8DliYgv7u&T%rpjWxYO&8r^Xl`sT+!4Qm2Fr-TPmmz~j+@8*WP zW8XKt{Z3VmDhW++&6OT}S)*OknbufcH&RMtU(>)HUC95-F2A9a)2BTCFsX@2`=e?1 zY+1|kHY&j+MJQ@><4^scW4Co$K&D?6PV-(gim>D6Un7(YdQf1DqrYLkQSY1a-abElg5BW6;Zn_#`OvCV#Fu_9 z;_#R0*)>>7v4i-L^mt~fu%V;*Z6h6(s?pGIhq{-%W%F-;7Bm~%4&+`6uBRUHQ0!Y? z;%9675cL&$)2S+fPxkI_T`~!bBsxcTNcO1wz8;94oon?zP(#tL&=cRc=I`#ISP!I? zv4g{RBYZH-MB2ZzqHld(%r0HSkS_DOz0GXhOq}qVJay+cb;sy;>m(J5LjNt#HG8{K zu_{{GP7nn)v7s8{*kC^ES#H8d;=FQn%A)pe;$R=d9=X^`$_?A>RN2o7z0SF2Xl z;o2VYDs;&mF(O1cGnaH`nLXq#(G<^&2ihEj!)`?WP`BZcm$1_vRU6CFu}Lkhzfd2- zFRkgU(x`N%r7|QTKS}rfGCDd*{{e03jitsry?&2VYt&PMpbe`E@(H0nmr%HoLs5}p z*DYI=;?nf8Y%tBZKqz{TYvs!$SxQBfFr|;cq{jp)El}Z;t0@1946N`JjVG(zFrkT@ z?u$gKs6+WsF48D2GCQ8$7Twub3xzrY_jXXp{;m&(5ccy80;tpZFTWT=CzgZ{r21Em z?imjI5H0xdx%=?L_`qE=KF?r!F+p>PAR3P!SBz;Ao3xHip5pg-S+}8gWn#H$D6@wn zSZ`0dtewU!Sf)KfICCbqnd7yu$>A4l+L$)~^j)@4{X0{w-r)|WK&3>p_SwCzKuW3h z@62TOIaz;i#kO)h($b)iPSdTzaA;ZWj2FM_>s1;pImw*7q8M+GN_@BbyW1~$?Ti(0 z8mIQ3$g^vsJGZixuRi=xPpa(znPhcy|K2Nqbia3EO@cA?H~+T-Ns>Z+bB>TYdb#~5 z+K1qKo(8#{q!DQpg>6U!fw?U0-Y7 z>b-54g~CNN8AI}11W@P1dd&^KY2GLp2x3OThUHDJyc}jHOaFN77sQua3tqWJ{2eX% zo2uolKor9T8>pO9Zg{(Pta6GoCtbC-+SBg&FsJq2_p{sXsts@LrtbLccf@7u4Y$ zUNt{{%C7Xs*IgR3oPodbM$_W$vlMN{7s{bNG^7pl-5m}6ad6Yg)wV9@Av0PV`;6;{Vc7>q8 z@yx};nTX=$7aO)jYhJ4#+X5Y4_?81FSQgC!1UxCpY}uqaqI)zhr2DvW=Ig<0QqMO( z>dzLA#bK^*hj;iy(_PO#9SRVp7~(6kUVy^r7dXKYyKYJ))8m*N`lT4GrYSFQz29OA z-!P=i0hTuS7`=yxEmTBp-JKH}&ZEgxgc#Z-8M7?UR68Xai5%RO%B#>oz3G%(pJv7* z4qoHwN7$pgAm_8^{qBAaejgew|LcJ(;?d-j)Q8Z$=h#6v871JYdKuT$uT`my!bKwA znyroSmPjvC+rXX#nHCvQ@M;5|Gk-ia<>Jnx-L=DP4ltGNQtedF&!n|Xy^I7qC9V7z zDg_(h+VP_AlHIzKcFXLgXc%um;i8--7Taj4(3$t0T{kM~!x`h6(&Y~}^_MlYazorR z5E(yy9dfv;a(z3ndHrQ86w$Jb8K0i|{1LA*XN7wl*Mr=X*pr~V`oy^hUbk3*iPbTb zp%FfE@okU32b6g+5Mc>f$<#ad`6EIN{R-8@I{*}r=!xG{CkAioLMJw!YjLyqK^tdz zEPVw4^_?OTq)_37cu`c8A8cOB*X3Ji}jke#HMq z<1!k0P}-&f^ZI*Z%b~BG)v&!ye1QK=reu<(c%@4U(h@UMbpT0Wex_|zU0{{}dGoX9 zc%;@{jaRF?^YOoGn>jC}rqWh(y$LgTIAWkTS8HsFA6XVB<-ocaic*e3!@H5g)4xM# zoCWwKq)G>;6{o$a_8n$gvx0kZar~Y0g%T`^65C49ce*VK;MG`c00cGmX^b!`m71;^)VXet#ctAj~sD%n>&dH^PXbWpzk6 zgIWF;PH>Ojp6VuuF%vX!X3LN1{eJj}GWYu0#M)(?SuFOS8-Axegf@|iN=)7J-w%sz zwt}TML+@!1$6QR6PwZy0lM+c0ptGYYCdUi^>;cS%SBWJA9ehMWRof?sE_Hjm4q_;k7bfFTAvjkdF=Wy`Czi!9gwl{>;NFYwi5q9~s`Z zyC$)h{Z#g4H~#P~kiy@pc;ne<@j7z)lK}6UCO-nTBQ~2%RId9?5=l{ks6@%OMXBc;iPJ}_^Y@$ z9ITJ+Z`Y*g+$(P263OlQN}pOP3(14IvhtW0W$5VR6+af&?*CFeXbhKcbIv1;-XS{J zR9XRcFG{6?Uq(4QNWG6C{5DMTr*^Zqevo-m;n?XB808@F4k|BfhAB*!Tm7!LThcow z&eR%QrMrgK>)S^Ldc(DCrp=6e9jTo3P3cMKuDu-rlzgbtp{?~{h=yKoQIEoJXm6VC z7j%V1m2q@y)U_JubJIY-omnsno2u7Vn9(y+p{|0HztS9* z@x@;y)Zo#AIE54UQGKV+kn+aegnzMKjUxNo!b_XjfUBPS=_Wc=0g4kf3pF7|ejG9* zp2n#dC6jW+ex6?!M-G=6l0cNh&ey@w9lW|Q-4@N?s`^{1xC~)scrhK1ZPA_$VuV!W zS_6|5M?Efg8G1u8esAod&Q1ya_~W0LI_~XeY;95#ysJqJmCr#kez)wriu)>;3@c7$ zFQ`uGKo?sTeQZKje4y{Y87s^WUYqKjruO*Phq}M0bUWm6Us!)QH~nM=@@c>kouwZN z-DC)V3u&KfyiTkpbbl$Bq`t$hjY?VHUe|)RE`myoP%k z`#fb&&#!%UP$f=MTMIztAF;|p(5c*}I|nb*SYMp@ZaCZ)>H`mqg10syL+uks!Z=VS zct@eGj$UlAzKWX2C7OiFG`u=;nt=nqjtI+P;7jm%hA##xE82>ot{ZLG=&SzL@OF0#1L(ktT=Ftjm zIp87eo|O7c_eqjR5+CFIUTlbvrS@J7Uv#TCDV1*ESYb!jr!wa@*p&!SqOUYLZjQ$1 zXE~gRDemr0 z$kgvji9>e~YV->LpPcfjC(;&}pKA=%1S+=9;NnE!{Y?Y;M}j_=DOWAJD7fw(=6-WF z=ya=tDN+^rG40O%Ep;vM)iC~ogR5CrgW{auwmpvTEx>gP8pdp$88s}}VZ&U7!1lQmrD5dD>FmXe`RztbQ z*>k*_-Yu~*0&lL5p5AWmOYS~X7eA8}x2%0Y?w!}$_BTMTPixF{wEb|-A1Fm@xDPy1 zB|86p!_#s4v2v{#N{H+*ciwpn4DMFS%nw27`V%uRQ4Ft{ae zH16|lwbL#%G#A4u>o_-Ps98}zUh_9KEej3+AW2cp@$()8p4vQIYO(1_zK(Pj7nxnB zQd0GnRja5$LZO;J45+t`B}r8lL?Ij(k0LTQe07p8W(&oB%el^7XJ+fqRHm0X==b=8VS=!fYrh?hu@c3J zq!`~TL1bSv8?Zaw`9t{Y6{L_(rYn_347KBxG;iegV>ZfgSo6C6%8Pk67<~HiQFFdw zPL3OK*2l!8+}i)5*e^Tkk(TS8HB3_@_Mp3Sn|ipvqiB2dML4v}YDvzfNvcG&`fjsf zz5h(;JJ~oCJ~TAw^B#NUZzn;M{1`{-_d6!(xOBskqsNg{S&@~uid6f`-!;`EEDg<{ zT^Er0Yl?1E`W0!D>y@h?RV_FA`VMbZ9$EArwkR&nh-B%HF03}DCVzL`Qs(J@)6Auv z8D+C{TU>_fJi$fof3{hHS)@=iLVPpBdgfO4mq-sX*%br39TRZxW0%ExXsv4M4tSqe zJNX8jF?0DHT+g=X?;KF%-0>MW@U$w_)+8l8#-+O2xp|`PXvRoya)dHk)}SlKM5pdb zVbAK|rIN*!k;TETrat^Q>vN5g`8Nk{+SC`NZ{Hke zu@Bnl4y8aoNNV8ot)%G9ZJ*u2(Yr1c4w-(MkGx1dxG@9nf$>o{O;KCjSn9-jVDlwA zka>cJf%6gn@ayqiWa%$~#sR~N-!!JbbUd=rW6C{DwF8a6?dWll1_c%Qx5ckZnYK=R z0fNouDX<&bb0jXRa7X_dWx<7de( zHc59twPyD>wM`~=7s0C!3cI0i%&ZRmSLR_at`qE|m6Rp7EeQ!L7XHj@$B*I6tUG9{vb|d4F0f7@b zf&I!#YS}$cycXw0*H!m^;8r%_U$a@L2C|^IUWw9rr;DC=VEdv8j^Pu5KbKnE zQhatDe_0WNW4oHd0bQJ*e)8nDUQ~!crK5s%sw` z5vlhl(`mL7yOT2(7s^M*(MX{-w4weTb7ANftjl;+uRKVD7~Ce_rME2PzEsA47VMPN z-6=MHG%L7hUe&whl+ay0*MlEj&I{9NM}lPw`AHeEmb+&vrIWfvGvnn&C!%GaB#n_= zss&gj9_<^sI67+G0B5Z^IVu82TM$?0dr7#iZCdtL8ryxGq5vFYtECcq04C!7oV0

?n58*MBF0)bGC0v1-U5g~jS-xRQjMQjm7A0a^|b_!++Tj!**s zo9H%sxFMaQU{+A`4O`&%9nNo`xzijDkGIO^a2yGn6mO^K<$`U$$!h57?;Muf;F@1I zPh;2<^p_=W1R1$8gk1o~&nON|k)9;qd2}O2VXID_;%S|k922Ux9T?O*>x}Gy;CqR@ zIfd3A9Dg)O=nh9_w{KGgO&nIAW7CElsLX*@m~^n`!wNrEQju0;$zE*l7y5Vl3bi$G z_+3sB-k1QakJ;y3u%|(uhL>j5!K2$Ip8~){?A-7H&?72DKvN=R&ddF}ia-^;n3yo2 zP;L6L zk&CiwlbkFQA|qV`LdRiWAT^PhCdLzXV>tufQlsUd{HfjoJb&4dP?jb7))dZ4-*?uT zX|p6&%80={qr(0Q(c3C|dC9EDDa_U7#wGR&s963!j6&}Hl4ZMI7jK@(7DuOc4(wlv zQjKalA2Z4Uj<0$=UbYC)o6ay3T(s&**eVPTXHkW#d-FqiuMXoj0xM)t^Ts1IS1@^o@&*wPrPKVO8d*LI~IP=_c z;tJaDr^aVnEO!3mZ-3Ana={tu5EQw!p176QrAPfVg5R}rgDPdKOD=XTH$_IPb_;;7_Z=1c>q27FkH^qApNnFGNAezeRj<=nn?n@I{7B~A92!++!Erfv*fjRg z>^LSd84j4GCqpO(zlmH=rs27ga9PjsEmBI{j{(IO?T%=1%hr0G*WZD5e=mPpuENv7 zVOIFhzx3aqPZEZNfp@~bl&7&4s^#_Y>v=x~qDSNTif=qop+wm1(R-D%auurtWT4#f zr~nH?!|3AK?PvY>J2k0Ljt%4RiKB~z|$}A zQ3M>pt}yOPr%Qu}$rw;eAR1d=5cf|fFp6}Dk>NRXKlGS)A%(GzMy$BgXh!T#i1Ou0 z0Z8U#!ob|G5oa+!Fp(I;mkIpf7hUMAWF@(IFc5q^eo1Gi%OFzalrmcyT>~8Y?hX$Q z-Z9wAwtc}^^RGZ$WiEPq9_o@{C}@f=4D@C zvu1PwVjgBZ@tX=xhpLT#o&o&Bf9G>gkRoGp{cxL5ZS*Z(uL{3!0JxEkigCyE_%pPm zjOT*RdPtUOAp&4q-{j2?=Vx0xi*#QC6F(Uhg2(Qt1vv)~Uh6UE!Bx#90!*MjgKsz{ zA~0CFknSKO5Fh;*7uXnBQhBN zH?NzYto(Ah_xV5HlB?JP4zV)6`$EM8(ZRq|{_m!nS^hjV@xKo~$HT)7!oOg)wOjfw zL_Qex1~#jx^?x&_O{x^|kS#m65{0dOHIYz+KK|3Z?7)AQM4Kodbw?|Vmn;tUd<=Z% z=n6oO{`>!(?cHW%2F**xh6_7kh>*7v2`=`3-tfPD6o>=)(S$LCyq>UdA@ecOS$sGN zGXn`n|L$~=9W0b}=M2hgzy=Dv#MZ_r3bm!@qcZVYkB%A50;9{|QylwV@xNUVHx5*=gu->h|U9H21PPMYd? ztgbj)+q3TGb-UCuS-E-I|4mC0c^+d&*8$3j!jgb#J?kIcEj1WSOW(x&N46dN+rkN| z;Xr4-SyQI_S|u-%xAg+$D)^2?;?JAUG|8A3*wcV(AV>=}>- zro31nhCKV0vXtsowgRVdS7{kgt zg{HfL^oZ7k%e&)T;MJ?PnqUj5(i|@EQP(^}kp)Qu`i>*C_>|~TupOeaeLj_G=G**o zJT`TG?;)mcZ7&kg8Me)T$@tqIc_11R2Bc{_GY2%e!9CNP(X=d6o5qNiAAtu@ytF&b z52%BsZS&bOJ=-H6gj(W&G>rr|c-wFF`yaWJN!suvpC|B#Yl*Y97I?~*@t0ljxD7yX zdhFd2G53Bg92>0$iyHgBDzy6Bd@87wEkltC`JUotE9egMsk)sm)037O}vC z)bO6E%~nK@d*d^{`UsvE1IuS#{spcA(VdWc@^5?}M#-F4H)1**glslt6Yk^S zXI_fK7OE&!yiQ=ksk7~?Llp~84$s3mh-s!ZHiLAF1Agg2rE_0+j0i4_$ps`~2HEfPI55Y+*PELq8U2dc7H&Cn zf~kLz7T6jTkAedc`--J@bUTlG5AJ;#>Qkk2Z<}|I#U`!q1!CSlca1B_3YSEQ6GhRO z{HlK(c0az=qbd`6o`*k%(C~N9=fq)4FOU|PBr=cGHK9@+^X9Y~b}cKp6B3)lp^X|) zBLG~P0f3%=ja7a>dzntAR{ zbC41S2J{Kt68$|A)#+npT^kc04@U-kF;9=hrbsOQKX^F*S`Fw)mWWGcN~pY!7%}(d z$+a{Y6PgCv0X!h{k%4~nZ$q7(h53J5szJMt0SuC^W-?Y332ThKbKVmXI;3zc4i&3i z&9{n#q3>p{bXLy|4rZ*WodU4rSUW@xS;AxRYN=N)9tfwDzDd(zMRw>})&cf_%aqqHcg5JpbG6OK zSa~umqp-nN)(T8A=F<1May4`^@BstQCuJ(YCmiz}yKKh$`PAj}JKBBMPW1mV$v1HT z>X}7h(`Z9J0Nr#JxvMk73xLmp%bbABoh)AQv7V(N zQPH#&P{+dn|Mpwe(8inoVFbV+qiNt8ECgPsf+QKNO+Ijxta}GcMY|>3v{mNsPWtZu z5~)IPi`#y)AVQ`h5jaqiD@2r(Zig34{sG~N5_J|eYu~fLjj$|Wq3SS-0^u#-6dzlT zCu0-HmSKHqAjWsv*^yRG1yv`ohxPOc*BCY)=nM1<1f#H$-4m2|8T^-G_pfK=zgDP z%sE|Jx$ubN+>Jkvi9-FNu?B^4_n)LO+{phAW6uw(VoJ?8BJl3=CeTXy14{g2q^_ zPYYq}Pw8|R3|kU=BNkgb3jm235(R^M=<=q~3=91z2$BWFFKU*heC9RlPnh-XKPH4u z=@*R6vkzLxqlAr_*9#Q}ETBvdPaaW9{e>1;VMI%*&_w<2S}|c6vyHT@XbzpGbzM&N z5%K_+RpO(xAm!)PN1vEAJ_o^ns@XN z*2>sLcZL!m-;E9Ev6hr7*~?8@gAQE zTeNnOYsUY8jS5kik>&=&A777~!Vi$d&p0Vz_;-kVurabmKL|nmf-@5@A!!k7AjA9u zsH2cwbHd*QcDRi=B~5XAmG{cmR@kTjiaPO;6>cMnGC-n}RGHY)Y%yfRW1k%gc-*N_6`>SgY4XOzh9`yR7z`^b-Mu&n z-L8=a43$!RH0EJAZ}@z81zgO%LZIwgQwX1jpoezcWCS5;_hT-mD)Y-jU))ye#*b%x zkx6SFc8eb}Ly>JeLeL4ya62}DZZIWzN~z-3u?py&buq#5+OK;}X-8bXhn~|*C-?mU ze5UMJ>?m|%8NA9*7AJfGdpY0_Hd_bSTqiAeCc-15N9TN?ZV&D&*=;rBo zx^cj&%)Ij$VGRa5(VElE)8#~Ct@M~Dc9FR^xhDg-15O7>waO|$fg5xDMOE0^XFm47 zg>bf`+SJUo5wFs3aMv*%mD&$GD+u6%KlwyEshAV}A}B&41IA)zU5dX7@lW3yuW%FM znY=SU!&^~*l+8~m)DGI$ei1k)sKVb`6$j~M+$KihvW5DV4q3!j?~325xa{GLxFNpR zP~>-w$b$zjqu&=tV`nji;cgu%KF+@OZ=X@u-VKMgWq*U;etgKV4=A?j!FQnTnWnu- zGjeBmq{b32?G5^^<>hB})?FZcg}M==TjIvk*Q`CAL0>8qGGmQIa7Nc&(kwtJg}Vl( zUEPF+-L;2-m8~wYP;QGe${NsY?ru!x$kqtq^BtL}#1jP-8~B6!5S@4@F4yz#&S9=E zIZV|cvuG@p7B+hQlJjlgHqFgj#S*Mw+1o?|JhO>GG>!CBha9GkyTtBH0RBf7Y6ZGt zW#Ul1aosae=d1 zyhF?kXMx+C2M@44Tya#~2MivUzn)`*^>kYWL!*L$cDr61`^>H%_n`Sk_a-@8t6`E7 z6j$6<5^w_Nyml&9X(NySL_0v#kcE0dsd!_(VI;93tA^XZL^$P5I?kZ!=ZmAM`BcV| zOXt?aZ|A&aAq(5*TE^}!WUkC;LT6}k((d_RNcshvhV15#mRo3`Yw?b7sV6TTTWq&d)V z-q7{;i)LxuuPeOh^pP$Yua!i!h*tA=Pzm({upnWv-gLh1dIqa|0^@xFc1BM;A zdYpx>1JSvhngan3HV=U^g$i`yg6J_)e#)}SIA&Kav2;~2>GSYK?E<^8w1mi@wv^Sm z8u_2efJ2UC5;tNn16nVR7)sHe2OrUl>2N=)6hOt5fWkF7MjKM^96GX+d+@NMdtY4l z)026c&j;|XNZMBn!}9BA(WfHvfq zB35M87&<+3gf%4Zmuy|ykjOjrxa8l@HZqs66N+x#p+}APGPh|o9mrC2d_s$@^S~j0 z$D)SerBD^-S`WO)6uejj)uCt@Coq~L?K=b{beXPAdxt-S@gh}Ly!S95g^G63H{)<1 zG4)Bp#s%`X{pDVQAVCWsv{r#hVM_4e*W>ZWH4VD)fm7MH7yrnwBW{bP`Z;!Sue|FY z{4zBGSDA^!Eu*2akDGu5MbfFAdx#N*WLfiT$8HX|+_|sZ0*W#xM}W)w1on2gJsury zbAngP*%oK%m-1|loGP%j4zFs)SwG48poC_j&h7FOx&;grM(`djk1BUBK}S zUXW#^GwACdFI*b#s`|tx`$p)8Y#WU6tsL?u&WJe>$%*`UoA^QNV$#V>Sxakh?G8&^ zU@JsRBG}Uwv9AK%;$mSAg#0j~v+Yjx?}U2}55)ytKLm0X1;^QSY1R{Gf}F*nhjcGl zttC)=*|@7ZQ{8qPasqyH?qnGiW6z@*CG(X7O~p=!9Kk_ zIBKbYt2|exeYnj)p4IXoeFm(+b6`8lcVRuyJO>Ouau)eU|3A3^s+(M3&w4xq#yMP! zaDY?nSm)vag?O*@X5N)Pwp^|1>6-c5+1B%eYm|yK@)gq){xHfFCGD2afFp3<0HMb2 z!Z@O*(h+Q6vbOJsJbJNVgM=WtHxQq|o?K%2XI3ncnU#XXr&6{2ZWI?;bv(oYMy(ash8FByfIY7Ack3&0(*@%|PdvkjMul(lbZkWV2fhD1~ z$(0ZOHFjgK-!5c(H2~vfk^ns5$rd5}Es8ho`qV>Dlf`xQaAsTyqY-VGCKiMcq0yb~ zs0W$9FrQ(z)g1dCb|VU#j*Fu=g2M;n=Nu|#F`Bw9=x{q^5QI`!mwYExScq#fkt9=9Bu;OdXsC zodo;71XQK3hL194l)>InV44~45=wlu7=<&6#)fxtZpo4LOo(VEWUy|_5R#Wkf5*cf$!>9*B?_DQj^1eoHX{ z$S3*vdTHR;*3*%solj(pa#1Ix5UthYzqz~w`uCF066aSvO_1r0;Yx^>=Y-dUD-nj@ zIK%E(hdul>p!Ux^X}!58Nhc}(VIJK!$POp(47+^#o^s)TX9QNPu^io5sCqUUufbk4YH7yUpV$<&S@S_@Dapf$5Cbn*kKabBJinvl))ms%NRVda$~or0yYMwKE@uW^)5Tm6jCA^Y3Bi4* z+HoCl7-V3Ez!g06Xl##m%Y|6x-FrSEo`L?z^Ay#8oa>1SLMDh2Zm^BWbVU*-GF;l< z+wmsiB?R1aX;;_-QYJ*P|5{DBfaCb>zTnsoIgS+EM5x_VeXf4W2{cPX1r^TtO4IUV zv8jwh{^l^ik>Rg;8pOJn^n6p3^1aJP?bZoUKg7+@J|0gIp`#}15AA0sKeAMWy1f@| zxP>H2!$!qW#Rd1v6D5ze@&$UWDnGqXG{4f zYJ)E2Fl_MJU$GwubJ^3j=eHlgS^%f+bPZeqG=uN@A6?8=l7rBn;OBg}q|n43-`LD2 z!hG~Y6WeC}a<>#eUWC`O2jhvI{kFZFpcH+S1M5SM2}8S=`e>469kq#9)7&24$@HE4 zOmKhp;q%LwL)4-Fxlj>t_1Do-X7*1OXK}XTsL!-6L24@(%g`G4UqOOts5&jufNq)4 zCcgA$F$l`S+tJ=uQ;Hn=_Upvx-+PDur{C9_Jpe@cIl2pV_-yT6Iu4zv0s{ujaL;1* zH&T_=m`Xz0G0(d!B+1_eD&daV6=_^h&XPCziwJwxv8ARgS9m==q!d1oBiJYsqqEGQ z@nbv|I&p>kh}?(YI~+{|1>mg(QC#-7?VZSu_O|xH{3G&^E5{CUaUVvT>Blw1$T{#4 z7OM)K*cE(UIJ<_52ZFef$1G$zafW=A%u;m$?CC3251@^Y?LpLOhj}h!hk@lAAktRA z0ltmVR4CF2J=NYEr_-9)z8j)o>^IuRjsd}oFQMQ_)x_@iXjatPf-iKUQC*{ctW)Lq z1ft+F?VocTNU2d5dK{YHyzeZYgO9UoD&X^Y&do1(ODaWn&G9{O>QD=AZwW4klO}*WyPI5i)a2| z9*GFu@)PCu|@y2IK_%9gF;g>^!jABvp>?ryDR7i;?!yvE4 z*}?GS2i)bbF2hSz71o&#nKRg9GT8$z?pQ?L`bQHE9~FSFcLhm7`55?k-z|0U^lgGY zf5?n>mqlamtJFN6r{d+J*b;nn5QxaFA9~)+yeuL0iYRxD^GJqo&*Jb`!tHQ#V$0gmi6!9GWPC+g8h+t4(T)26q@=DGu2E1t$4F7lJM^EG=Gkspx%Q^p8e{ZX3HLLQRko zNjM}>G2SXJUK%o2pnS9m8)jrZdo3chhZm>u`_{UnP-MqI8W5$c%l#8Yb@`2GIb)Bs zmr@ys(1ah^oF07Fwka~(oT+d5@DX$&4*w9AB|s4~38kuH43H1~0cT-ioY5k)+gqnf z|631@Vm#J0QuuMjFA)?kQk7k+88|x@ekzZmJjx>biiXDDp_?Tbu>$$mP{C#<4=xXW z%8j=Q;bp0v948@qXbjuH+Af$6O%DfPLW~EJdAcwI5q5pW> z=hFZ-KnA)c&=;ziI8*gnn+jf89039Tt<>@$(dEHiri(;;15nOsnWHc+7RwpArWj;M z)P?iPr)hZQzd9eTq!(nKT2p^EUw-g4xcoNa<$19G6ta?&Mv?o*4M#^{>*>wb)t=N-=SCvxRq0uBSKihtSa=Sc6YJ0Nj#3r z0B{fe667t2VK|PIpB6Xwg2*JV<~IAF{KS#(E4~WI+ve&=S5^krR(f!b`P@G$aeMti ztZzSUvA~rzS#JT=!=L5p{POwSv1ktkRU0tz-sa}Tnc+5ck&(1LXS?EQn_!2U#6Clo z&SA#cD~SQ6k7TWy(qi8W+Ffb87FfE(aAS<|zP?yh_?h;+44G*9~tC_m2A5(@JMdXRMd;&I?T%2Mr`gW>zI6qM5_lvHPEvxf2L(CJm&n)b?_$lEjyMNR<#kn$s1x- zwv5xa=PX*!X*!ymOt&EQ+1lj_1Iu@HyzoUjHChR_5W118$+rVa7e0ut)Z%vw*<1r+ z#W2DhQiF#WFl|$!Fth&cPX-;Ir!j?5oxP?}84Kze5VV!}&;goBiiYpiR?Mz{c&^Jp z@jX|4*MGJatNq<0Z#SPRa;28|Df_Fd(U1JpnN-(0U?mfH5Nwy)4SC^ra zT%-rgA|8uZLqhF%zj!x_Q%vlwkjm#>ix#OQAXn|ZGTP`QV6L!C|n$M>2V0YM4BJgs1c%D!+lMyjKxPr#T+*7j$=Y@r?0W* zy2jD;fAiuIJ18ZFY}_SD#~NL2f?Rna8f@y z1WefNOTV(ckVgh)J$vQrokY*8V}eF%VR7o5bOxr2Ymi?2)&RFq?gzhikHPKUT_vgCz;IA za3vdy^%=0gk$Q9@PLFkQdwME5L}#1?MI4z*yZypu&mf~>u1w>?w$*9E=v~idbf32_ zjpo^Z7SZ~{W&ns)(`7UDGf7E2WMyaA8(J!BVMVILizO+JZvq!r2@)6T<@X&A8I(c4 zor9f7cC-=K?QFx%6V`4MP)L^oF&F8-Ed3Y-u9plfkBPD`UAN(7vOQ&I$y&}{kGyZb! z&o`aP#`!>X=$@_mO+H-_;Jx={j>SZ*3WN;BI7eaj>k0bR)WK}7w0Lm(8cn9b+%4bd zk?o78ahCeO_wwhqnqBM+ixPPBe>xm-1#k?uZ(-sd|9uJ7K&;#pw7=L}>1+LF>A)gJ z)KqK8Pf;dmQPZ4pDw-FYl0%b2*W7~%nPYQlcBb|Q#lK}yzHo7{U!>}Q&O@%O8o%qT zJjG!jj5ILF&?B1QN}yvPC%VhQ8o4TMuR`?mrCiu+LTwsb6OVCJo{_|q_UzQ((&qXt zH1<@uz2U3ZOM!OweFc-tqBTFj=^I_?A4U`{tG{g7RHxDi(|)aKEL${q+z&KIB#Nq9%>Io~0J?29E7f-s-z#?!;?=sOQW!bLT`nPnmud0mOLHAPwAP>o#v)M^ZtJ4AKI#D=M)~)P zkv{6nTkY(*a~W?=*fyW}^t#@#K2ZZ_<|c@_Y*^>|A;h7LUNcY4T8o%`q37VbJTrY7 zN3AjOuas5;%a~I}T0b+IUT=v%4#vGp@}c+a8aTJPk|S_=GEe-7HpI>?n8uvWn>1EX z-WILn!r<~K*q_u~O<}at@F$cbdz^tL@JH~F$?j!8id-vh(lV|LBuKyq6VbD{`q286Rf*-t65FH&6I^Y_&B zRt<;k#B(na%V6bP-TcMgDPLN$Au?58cR8GJ zQYGigB@dA}O%_m1a&%&@`Jh2Pg5UlVA5Vo0A`3yGB%bGnQwW=JfYz12PK4@?R~lYqJ2#!mv7$;k^dqc17tUh zo4biHR=fPF5-zB<8(pdTwK-Oy-m>Lb?Ozq@smm}0-%PB`!smtSM!6j1MFq9TgGk_O zd$xo;g3$C~NXz&=F_N>-Gfap+s?&+O#kSWN3|qCWagU{H>K9$o7wfxwtTwL#q1AHL zpcA#E&q=2`tTDW`(k=pv6#_2M_&`~B?4^+@&8tiH2^Lwx}VHM_mbh3Vv^4Xd_6o%5ao)zZ@%mt zoVK`L5SL>?>_yz1zGM%7qsB_8B(z^>Wf!^JM*9v_lJv8FE<`>2eE1l__Tl=I=>}gx z0FhW>2cR8JAhgCOb83**g0?nIbO=b;YZ-SCeiOH!L^xfYT619EYIjZlz7!G!v$?tK z>Erj%w+A7)JR}@P_tmi_I3USI6Gbh>%_Pe|q_Ruq{!Bix=5s|>LEeO7UZT)!9JzBwpqQ7Hh2s^>*4n%lOamoUuke=s3C|FRYgO=s~?~ z`6YW((t+!^(waCvd6b(>*)r3Jb72k7^bd}M{@K5CvGp$kDg2zF=Q0A=GUlNXgBR}SsT z*foz+9z}}-;@Rl5Z|CfQJgDmC_saXm1TI4N^yZ5qm4j%)*Ie5J=C_{d#lru`)O*G? zwKZ>`DOBm8BE2^Ypwgs>N)!^BfE1-g1Tl0)K&i>`C_x1@^sX3Cn)CqD;!#0CL?TKF zkca|OLMN0^?uzgK-rxNopUmEStu^JDnP+Ap-~WDp#*6ZdyRR-hj_x-e9Ljf`7kYd% zMDHnDuPPw!puu})g^a-}h=8n;6vqXkU@YB+7YuRbKpq{v&EZFxzelqF^!AxiW=I8r zzm|&o89v3)D4CDU3DTY;I2qA)QBP^MvZr<&B1BqdxA{@G5FwlTXjkCVeg$~?MX4z& zZHu8%^oZL(9$0u%4r3UMkd8zLLgnM1qbhN8a(D{Y3H8f$aM=^=NyCnfFJw>^hxHrdi6P#FwHnl z4;U9JyRIlN(9@SS^`Mh5`Q*09qG9zF%qxZj{?kZV*;X1jqBH*k_~Ag`z?bWEJkgQ0 z>y6N-hoX~eV%!vKrRZm<;*N6uED0nFk^!4d3)nP25-xEuNUko%TFfl7X?*vGj=kPn zrZw4`5ShNnUSOoK82J(5ASot=NE^ls zYJ~Zp`j%$TO{gmd*ZYFf*QWi`jm7t5DPbyNwl?wIN4j@ce4LAV++%BR| z74GhyM^x<|L5HF}sB!EKE~%~A!I)Q`QH;FVvTx4*w0O1(2C}GQS5sWT&|kK zSU#~WT|e_zwy$9H=%ibFoQlGG>Wkb|(@P8^$ELh1_CkuRD5*kaYctHf47@#e26eam z=|HoLfoLXAqa7s((L+0rpW80NU#}1sgU($g72No3%y?}jS}r)ZuiQn?)Z9wP&4*=# z>_$p*eZHK(m&ikw<0^-53uLBd{x*O#5^I<@Q6;aPl%49z?H6#jL1G?KTodES-M*Rz zY60^Eo7$Zi2O}^zFGEt+a?6x{PVvy*v9GR_Q>2qwnnmGH*dX$UJJ}T&q`!7tGK}Q; zbd{&?+1i=$i0?^>9KRK6=nAmK1z`azXq$rHN1t&vCDfIgS$m= zEv2H=VU%g1_=R|`iNL+X(*|B)lr!Ty_2&r(RaFrS@?8}@$d(M+k?G^qfrf8S9A-%D ztp~QHiBwRwZeW<;i90!Kf@jNmm=IwLW#~e=h`iSDRwF)@I!0b66$E>=KS#hF@WYFH z@_wbZfl-~su;rq&0Y#(Odz-X3%avjRTL)`*F3f6OT}5WQQzXbNGKS1S79l?->DTXM z5W*SS#;3&#TRS#T5|3BqYD2TrN1Ok?{imY(1BpO7d-p$z=qauUxrO)GzIUq%g=w z5L|m@l2H9lH8ED@(4K*|oZXcvb@YYt;C02N;N@V&KPTfEd?ybT*iZSeM5&kG z6#E39D3r5^KU`L9Bj5Eh(D~QZ7~BKZN^>YH?UuI*mX!I?M#GUE3&~heP7sO%@Am%B zn4|}o^79`NY6u+E#7HBhEWrithzbK*1i60VsweWBZY^t9fF+V>nWKz3Rrt6&7cn|H zGqBUcEVJ&<4|WFe^Dys*c%OWT3ILW8)JH>YpP9XcboI9z&k@?YMs(pqo26ic{GK+Q z5ABb(p_&Ek4fhRzS2Nx+>q)k+e+g^KtNye8w7>bmPQ2)ZU)9e3z6O9x4CoJ;lHRD% z%Rkt$27|NZ==3FO0nFmcKN~o%#eW$>T})0~RyR{zGF{m+n>+JGfZX*cm!Z=}+QCD+ z4;bQIObNUy8nQr*tqEA*J8DOY^J4YY#N0w>)$CYOg;E*6;Bo5IxT>9onwS9e_nIAX zYC{I&8q{Cct&x!L_PE73W z>Mv|wQT+iox=Ko4KkESJjahLvTorbJD>n5(-p3y!drDMa3bH|W-r6fb^w?mt4wFoIjjznxI#loY&~dlo#vd{Ygsst# zjKs5kj;As#$dl#yo8n~yB{X!5rAKddPz*KqK zQSqvmLpD#BxRDsGc1wizRPV{EvE9~n-onoivMoY*;v%)Z{8m{^jYAv*!4-4jF@~a(En>YAzfbNVk{NB{*@!2D6?;Cacu{aVx|y z+X$KgL85g!+NS#&T|t^K8I?W6jF-_HPJJUW6m+*T)xP0UP2O0;j!kPP0UX{1b#mzc z%LORXF;ot;mzROP;yAu2SQgmtMeoDSLZA3po&wP-U zvUV{W76hBy_u1BM;22qgv}aepAc+VaxZGVFoN(p6xJcGwv+&yu=Wb@%i9>SA44!f? zR`QyxrLQW+6s<{h{SkFk!(v!;PWl6?2-ZmCpJm2H25e z0&gl|U%C$1Xw)Z`YZTb~r4rBMBa5ThKWE#Q3KdK>VS1E~R9uX4eWywGepRci&|Heb{MtmFl49?iEc`sTVhAkfvEqf8J zblOx)&B-wDYpj`dNz~u8iXEwdD<7(t(f@Mn7n1#%rD?=aoEp|aiZm2^Ff;p=6z$@L zklClnK{8Z1XheFvE6QG=a~sXNO7%@guXU5+ljmJ7+y}K6cfJ;6>Zy&#E@!p#7_F$l ztIBJHIsrSsCCNg}>^fpGCfuv=rvM#W(_4(tK5hA(sB?W&+)h(B3`%N;+Nh~ooBPR* zWl|0?73m&@Bf|(%uQF;bNCi_IE)jqlwPHiQ9tkUNqd?$KK_U(WfalC?b2%;Hj`a4d znRa1`I0#(Xn!;5XVb_$$>(Z9BW5|iTW;uM0;y}JfjzqLSbHtz7LQ`oOF`X%OQcu@n z6^>T}a^^*}=7s);w1ST{v_qK#%(S)a8x|V%a#XXx0%w4ep##EYiH7&SB`kY!r(XDV zEGz3yB`xz$TFo?+f3m6UpeKbue*E4q zA(e8Y>q4bQ(RHL@;wzZ}8dGUa)|QPU-sppFMk=gf=yXxm&KE8&(YKqJfW4P9o95Ue z?8`u{;g1@UMpOKV&@U@ecjuK0#d|Z(cv4LV?jRX96j8*^)>^`uZYkgw#_fln-J-Q2 zl!kHSJ3cE~WC=vYW?)xn3^oI+gquAfOfxL%oBi@QQy!J*3f(9i>pAg_hoA~mt=fqN zI_;;1*+&ob^7-~(kisE#fM^Y<1F5(4-r+wDbq5OhEr57M#{1&wqW+`EP*FLu^YB>R z|Ha-p@jP65S(W#{sB0>$Z)`6av*S7T#rw(H82bd20H=A#z(;~%}No7`*PWf`j z3c0z;{CUldY{koOzb1?Ntk4qZTa52#ZzF4AQE*piYxkrlZUq;LJBI(B@(ZeULh(?6 zsk%9iXeyjyS>m%!J^ga*p2b;8I)EQC} z-$(6-kRr+ru8Vs)3X)q%l}D&AVS<&1C^%BPdT*drzX|u9AIv5nR^z4BL(rtkKN;0r zRTqYKiy3=*C(>^3Q&LsSdGn((aKZKFXB^^105&I3e^t7qdHEEHyNbkcy)qb~;&uM} z2@>sSoNIvR_j$N=NzR|k3s7RJp+2?J;*GeAEoGi$TDG3ac6j|20t){uhgx2tFs~&t zyjdE^UO1od(5N$@<_p;QHrU>cbb}BrxZ&7Fj7Gfe%x`pwQfk*s%|fV!f) zA+&h2Y45<^?8-xy>7|jqrtwU_z1MfV_iK(DD%B*l!EApZP3^P*jX*S%@9yb281_ls9|NQ{nLi~W^#M$C`#{z!mQPjJv zKq~N&as_+@G8fEhj7(NzTiHD4PmN;-H%7wCvPY2MZjD15l6MA~wuy7!_%T~@Ss97=v_9%DS())e)@A;cND}S}6*4H0(f$AV!bUzkK3ScP|_nUZ! zfRs%k<>n3ytvcT6`Zq9fknEDQvgEi6&}EQfX0&48nRzL?C*oPOapCPQQ2nVitox~} z3i;tbvt9IM@!iDF^zWZINuJjcmvhn*>^XaZixTBpo%6ol%H{f5OH=W>?}R0t2~OT1+%SNmHhB)BHU22K=}~Q zh{w`~D_zg)9Qw=5gI8JTn9R^YP&g`1ePNn|#;PvDbxc7YTYgH)j^IW>fw*4TdhGpcmI!p6hD{5gIo(VW zvaHw;>nh&F8?L2E)=Xp^3!BTazkJR&=RyZdrb_kckg2J52}3u~bJWF}75StNOMH~@ zDG8o%bp0%Ol_XTPbM^b~FXZq&b?)1zwKeP_pK)t*hlqz9vpX59MpsdU-x8tfM|^f< zqlS2jCrBmUMOqGoeC$C;qebzuM+llqsDbhesi`^D(XuhrRg66ce|Q z1p2QWNY&yJTaYp$O$@SamQF|0zc-|Zr3Q%!F+bEB^ao>05@G}alw40f+T$eUCa@i^ z{&soldIu$0JsxgtC2A0TgZ06lR5_1o-EdSHHH(g;ir(ShPM2FO_H#sk}ne9GfnY6J+79L zFMGIi*ee0lfCfCE_q=JbG7D$r^yE%C)1NGd>_dNeIMv3bd040+I6$R<7?uE8_3&{B zMt@7Md=`tkc+E&LYDZ8pGgkL&W&fl0rZ+^JlH={%OAW>eH-e&+7Y+Ni!@LSfyN?mI z!&5kL!$z6g^Cv(CqN;ZGReSjzKt8IkS_m0m36E4vY82Cc#Bd0V(<-t3@b4myVY~`* zeO)JT8i`HHGSE3o?=l&G7Ne#Wq~hlssLiD1+-8U`#C5Q(+?xAu9Y7OlZ>l)h3VGTZ z3vT-h@fh+sPPKKM1NGgfA8(od$9&$C8|9{Wq*6bmlwoo>KWE<^_#ZP4_>YF2OG9nk zRYuyMnJ~icIqy-=8?3yUff9YB1I$S5ZITAIGJ$f^H@zb|QRbv(^*=W~(T5eqc5kB( zqPfQxSo@AcDLJp!L5OWMyygWqGc1xYsicYtu5S(JV=*B=pu1EHH_Cg2M*S%Mz~xT3 znW5!$L#kmj`*65Ybi@{2ubKWb0gwwj3?TU9#i=92>B=Z_xrAoNSp_v7Gy|iL$S^v zf+;C`dRxivVBl41@Ao^Of4`slAwM2Et1@0Y$wiHC7;tfr{N}xxo!WsW(Sj7^+lB3% z+e$k8d-7KN6}w}3k&hnlsPYM@Qf;Z$FpgHN=I0(Y%a zOHLiwNc;Gj_IN`o*V=6_7%>TQ`G-jvpRvHG7G01&UtU^TGH0cc#uN;JES=K9G0x-C zaAC@UBOY*Tj1@bAeItT=WD%LP(HC)g5lbvnu4lHQLz-kjCyy1|yk;n1kmz^IA>vf( zaO@y6iln6mTTM=#Qsd&fls8^55e`#SAI*J$_~*iGFSU&)^WPiB4Wim3vNnW z7qiSVRjC=g4nL^uNB&-Z)IW-2@Kyg)@SIfp_1c&w8LnK19q-HT4T5$yTo*tY*Tn9Z z4E>4yK3`=*G320@kSE4Zn-o_UQ^1G{h#T&YU6aS$LdFXZ-4_=TaJJ>VUJpujojC@t zPaKLf6uC{iug*HD@YJUrIWz{pv)`qJV`J~fmy9%fP-+U-epG8N~Q^TeGP}kVip8gms0b_rbIURw1MqI*|msXqq zj2?g%K#h?0RDqLhhXz2vXM*OFRl!AtYQ=dPA^%9Ch15xq5r3XAC8eWt^?+l_CaID; z=!j4T`~hm%k+Pr?XxopVl^eG=FxLHBiz5kj{}8DOR{t>)kCJSwcdW%a6OUnp zL3njH9o@?fjj@!_Y40Q8?Y28O}q8?$s`sR{Apdn9>?BqVh|RMy;kxH8j}gZ+@#=9Izr z$+NgKX0_k!oOec;1fZ(^h@qAUY?k|y62e}n&}QqIs$iVZ z;3!j|qOnd;twg^{q{_%nHpC!AEaV|0-qj#HpwMo17gXxZ-?w+)ec%28i3n*|D4D^4 zqDMqMa8n?$lcYQKc8CY?F<&Kds`_7pK) zPv=^bOB5@F`;SmutE6OI-E!_pkt{cTs>jP7uD@O^Tn%&3Yl5nXfNY`)vsez~%J)Jm ze7GiD1nyM8-ldz{y9nMiPaHBJZs4=Odk?<2Dy}LfScwI^{*Y^R?uta=)#*)AyIjSi zKy!jBJX~J&z!r=K6^FkZ3aUFE_@Vlmn03&)S{F2iUz$7Dmjy1!ftlgAmV~p`qo{2! zOkS(7^-cwI-plbv6Dh*)!%Y~tkhEdv9?>U((A4e7HS2)dJHoEFD-raR{aSX$0KulX zdgtohASbj4b)bGZw?X9ct&?GZp2}8X7&0CfFLHUnbuhO2Y0RW*BxO}mb;BtIpuwz_U@Y}t42tDu_M9}hZ}N4*T!vc zXv%AqG!XOf3tsmCx-;pjehC#ry(uLLNZ>61X&SHJ94lv6C#nRq&Z7 zfZOe|j^0js%+s;X#Z;b| zE!bxzKYd$~8Ves^xUHc5oUuY(8)sv$|CkKKW+Owz+VPzN4Zco|Z76@!p2hRW7GY() z_ao?@b;+Z@%XvavOOX4{2Ym#Ox4c5s@si+nA^iv)lC|kCDv&(%Rq&lPTV_C4x9T*k zaDUe*nU_34jwig%&^fzyd?K{v=f;q-JGU{k+*T)AhJRJbuL~aF9=4q~Q7_-s=;nwT zlgHR2xgijg_`}=6|Jf(1x$8kA`&+nA?K_l_X&m&)o!mh2UGKFzz=6#YJu43_c$%g7)kms4e-JfopfSW8Oizs9=lD$ z-3{C;U<3we?JGa8AtTmDg!Vvv9hUTCDjF6Hk9h=2I-178pv*8 zxjHe?+MyWya1ra$KzhYew56y3?F-4|)v?ZOHav|ea$?yaRM(Wr{Rb}3>5HoTmR0e~ z-5dG1lp~U|2SgG}QUSLJxT7)UH9)w}=d?1nB363lOXYn0H-6(S)#Z!_+5C)I z)y~IK_k$V@3wi*H9`r@jk}hLu`nn!e+rij3wcNigSAMLinAqq9yUR3kZsakF0%%|D zpSjtCS+c^qQ(E#h`_@%}u5d&m4Rb#}HpQ#Yu84pz)$7LF&q*K^(?68jTXYTB;pQJz zdp#=hw47Hb<20ADB4mzB?BIzS*+%B5(Z7t>u`e)y%UT)wD%J|1QPJ7Lu(>}YFfkM_ zG-6GSeZ`j6bp`S^M)>!TsdawyE^nR%0G-Hh}}3&Vdu2DHbk7cC!K zd_$By(A;(<$XBcWOIhbKH(D3Xvv_x?C2TF${XAyO5Z^fOkK@GKpA4n$UPHRwn3hg^ zyTJ!iNU;dUs2DciC+sa1agAz=Gr}X&5)#TceFEEm{20gp!cqV9NW!j8bG_nHkSAIL zuvet0ryp+!uIOK|*=JGW+P$o+p#o73JjXHJ&Ycg71T(oThhy71LLYNSTX+v2`%2km zFGlk6=1ti^MdkE<1-xJE6ct-$k5@g zM#PlgdVMS)&KXrRXSI!&m2!E!an(dq`#m!!@Xiq9b^jPZvTz-Z<8QxyZCR_GOsX(2 zxAj8q;@&^RY2i=k`=+%I{fkJ*Ho?yv;zN#-UOkw1_;gMY4lQG_iD z53L5nYek3F-r@2B3jlZJk||*l#^lgbQWf{$23>y|)_(q{%zJNbp9M~*fIs*0KTBf5 zv^b`+--mXjPIHdfpv*>zbWV{UTW=+bqbYzsLO_5s^M^idf-x1C7h z%;)+6ove$oIR@RdFTQSxKC~2k;`mb)(^|&0?$a!>ltboFPm!|ydP+4D>m0J&fUJW0 zYreu%iky3R$*E+fuJkS4s&knAu6Of2rGR3uYzEQOI=Uu{`rX-Sd5$HIMa;wlia`)W zTinh(h!cHeJU%cbKnOk$|8cDQ{a+M-BFS+ao=wyr#*Z?CAHP!BQxXaBpfU5TIk75< zD$_@i-<)!%qNuJAKCy!J9B3`oV}#in7=n~3EWA5=ksb^FTAzudT2goYkKu0Kx5lHl zKOmSa9HM9A8ullFsnVt-V^*#?nE%Swl)D;sQ?*cze1hbO`DMv=+lF2D5tmzAEpwlp zauyToS93H~z!ce!O)k9mYvT-v>-zyvKp8s~$XnPnv^8ON3xzxaUl$$nHigX&dh{~| zURO+hM=RC_=P;#i0SVRVkg~rSw{)Fp^n4`A%-dHVNijf#e#=W(HrRW|tR-nx$DB`; zVCMZpJWU8!P(AUQb5hA^p~ojm2Jnc--O8Z75NF}6CGO*Z=#fKg1=@ZSFd>u3bMJqD zyy*4)tr+c=LCms{$b3eNoP(QK7Yvq~Mw>0$mD@>B_n zxa~;#fFonWc*`4O5DX6~it=+NYV}X(; zMEXp*G%G=UC7i_Yq(;R*y<5fIWU`Ef~phMcvQgdespeL^1 zpO$*#^!nkxmNg2YZy-Cghfmtt%5NK%DQFJC7JruL|*nc`2f*h z_52%OG?^Z$Mg;1Pcg|0dlSsj@*4*A(ZN-qBgI+4I$*9+Kkh2hhg4QF0ZIxLuYAQ2r zf;YS}A`<8;ACCDnhB*;ph33v%UBchMMk$8)`=9)#(gTsUDVGD3Z_1`CY zAi|mZ$!R40il3P@5#0C(EDie-tA^_g+#5-H7bsq|`sEEmyG_onaH^7wB*{tLU$M41 z`clq9S$2dM0D~b4IVei;kf}g5g>InuVxjY4XgQA?r8{k$xwux8Luy#4krB}CO_JP?B(HcHo+Oe`N_w-cwLxu^} zrwXVw<~D2gTw^JxlbvC@qiwN3fw3zE5VQiLd@aVYx}?G$DSJS zApc9gMvf&dXuaJC#O>fPI9u#5TX!Cn2ni!qw$R!PAu?v2CnWsO93Eug5w*jxv_sReqw z{h<}^9^r!88dX=R{Kvp1&v*p1bMPM%YIr^6GMqweQgOHNrpui1{t+nj`3B2^>RGoO zeGNJMuZ6II*hazzt4C-=6T?l{MQhu2T$e*%r>Z%tsajllq7JQ74LMcioj%Fl7VA7% zw2<^Arzg6fn4t)XkyQJ%qn;`Dk_kjdtZTyK<04_042WQDjQ5dVU6H3xnKg{qK$9Qr zO)+{>XA&a2ctpF55ix5_)N{ygn77u+5MPuJ5$$UUON}kJxFTS1&;_zlIAZ$fm3h00 zh!%C}WMV^K6@OzW}Ut}YY~WpGz^({Vs{cDk(~Ck0+Wp7fT5;cSG70vEvx#5+ zRx7}_l;9e$839^O3rocQ18n zJs<=3S3VsMON2E;j6}*7Pb{vJPBAty#tyIvQw`ikqfinZqSCHet0 zA3Yeff$4Lp5^n2<$W>|E{d4^wHNO6dj24m`76CQE)d$L@LfL&E7;h4dTN9d2s5|$; zf%@GSp%Hd0i%qpjCt73QVRuQUGKnjX1zLonIX@pSO{4-?R@A?Vypr@v90ap#v4sy< zj2A01XDAzF*@+P`;h11%?T#(77H$rmg>z|g3)b)02u$T2YUFnjyCdk*@MG*08!tzw zV6M|0=~qEqO=#GwF$v6zPq%-W0fN+`^k{gCr_7TKodlwpio0DmGGLFxjpH*{c|Y^r z-{iLmazFLK6EiYy$@Y(tv0#z%)fFo&uiU%d+1#0XiofJ!?MvhJusnZNR*UaKn((d3 z^476>!joh?{*WoP7v9bZra>I`!LxD+*DLgE@UOMfmPL-+5UxY#U-DZt^JEs(SVu>o z4~0BtJW^eBTY>k&0EVr~8=n>84^9qULy%sU8a=?{{|uGRtmUcSqffoy58e^*xiia` za(DhT*@^r!wcxA=SF8;(-&RQ4V%pJEw@7mDC21iWzfx&CZAKFxq%tq3hy^1Mh~SG1 zd{iHEh0w-td{*M|>62C3MVup^e*DJ^yDjZcD|T2?&ZVC9&2fyEeH9yXplE8w>HB&V zWNI)rN_y%I)Fp*NT`LO52OdT%SM4tm5Xql zW4^FOtpHxmAAr!vlwuPQh+B$}|7;P!Sf(X{au=4g2QwdPEBV=US%doFCB%c9R1>pj z@TFce#3ZDSagVA%N+)j1Qx~k~HzOaG>d!YLyTGHPQgr^Me2ejaCO0vK6~kGA5`y5A zC#S)|4ar53kbNQ1Ydc@SH4dlLn-^la-1MpgZz{`pv@#{o$Edy5K_em}BCQF;x8!%J z5?XQ>gHn^9E6-Hc?2Jmjd-P|S{b{_47(r^K-gcz+1bkC7)q6V!wEJ~Fo-&S6mn(e9 z$z?kqzpgw%O(#Yp5Ow;2}tnJ@#Xjnh6BbCD!k_Q;@;qGF^H@)10a^SWQ;j44TcW*e{gCYe7n z5zk8@JaN9Ma?j#UAY7bZpfvHy+8PIMj zAj(Lo=__bqJdolSOBq)pTZF1xxvTiWY=wwap>1v`-_Yr6qN2;+>>rS03u^oqa*!Xv zo?01FlkHCr=r>eIxiA`&@mf#7>a5DYsekwLAKLX>yBe(%a;R#KBmb8^SuIs|6>MVP z2MbAgOmLU=2F>9CDeoK-9~bOaF{3&zdD7BQ;?Bbph+QZ2DbQSg{poG)kZWO#Um7bn zlB#$5l->NDP%5Vz@-QP~V5^%Wm5p^eYwSw2{Oyz+#SmzMyM-=Vo;=^3Lt z&{JDM?Nuq|HN+{c4#A2)1b&oq4kV$HiatL*#hEE;@Pu+J$djr?dZ)`}VYvT};2`%M zynTJ!!Nn4yKh_B6sLs23KR`~qTC{DBao58gBK`J60KnS zEBIQkbB^x@2DoGSqh+*<+&?3GjK+t5Uh#*hIZXC~UPyj7$Y=HG{apfEvE%}EqvhRE z!2vgs#v;Q7E>dvzNGO1mrgl831pAZ>)G{$RCRhO@zxbNLKahaO zJC)*I(zuz${Qh#hZaleOtdj7y9~mG>Tf>T^jxDwm_j5CxO}HTI7YR!Z4d24rQB7~Z zin}z-L`Z=>d0{aO9jx(#4yagU!#22!)<)gJI^puuXF!Rm(SZ;nbIG97GXqXG&oQ!$NCDX*36^3wE{NyP0B+!P7y6@NQ z(C&1vF7l6GSa*$`-*Gn6?(GSTwBh3l?UF@4iCEnfww3>5OfrSHac(=?@4fkz@TZh* z5E7i$(nq0##LcGC6M-oD6|?~Q7=6GqBwr-8t3}~E_a7h@H+%`{8LO`JyXZLjd2|%$ z*)Si9ZI-Fjy-#e#`l_3`?Qurmx6j%Oq+?K0ImuWVoJxS_Xwrb^J$nUH$&DmN9BH5l zEWqo(O9g8K+{Kkf>G;=&*@B=<3J%&9)|xgV?Cu-6FjUIqDiRH{Mw=kb+US>#eP@=W zgU`O9#^$KIP-xgF+=AU!OKdkN?rQl}LSG9ExbfY|w7tP`>!s^N`F@ZEM<|Arl%I}IeYjeNoxq*Moe!)W7=yc&`D-4YR;8lZvcW)?lxpv14u)2#Fqxr=@ zvmIbjuz1)#F!r1Ule@U}Az1KGBhN+?L)=g?>2SKP2JdDA_@@^!c^+77#BCLfCtxlW z9S35078wDtg-t>9kz0?5C7q#3y`^iRaH-qgE#M$V-M?$aiXr1(^4pKX8nXoF#AzXn zHLSVDr}cGgkNVC`9K_h;!!4PrR0acF7}72pqEZyMBl*{!BM=c!!J6v$kl&yY5C`}> zY?1oC(PCmvM*=(c$#N`3hu#?^*-ZJ1*uPTK_vN6%9ENhL3+&NPRul0Sga^ zgUoRTsFf@GMky z3m2xP+F>E4MT)zJP;%=PSf4;zzg@M?2VFiD1yk;-Jcg^`uQ%WnL_`=G_dJveTSqJ< z<{mIa2sYfYyyXZ9J^itt6{O&lRpqLC#Cw5p{m(^!gxo&<{Yy=v`a4(W=loW!P=ilQ zM&AB+7eG<$pHwNB5o`zBjlGW@P-jejsW&M-=~X(OE!fDraiZ!a!_sJW`2XGqFlC>| zF8?aH^>1zV8?GMLjFYo|fAFeLC?_oIu3;I6sZtjxhG-6hT>P_luU$a$Qq;HIE*TS!|#84`umkCa! zozqo~jEb_cWwDuabfpuEx&V|wkt--e97Su_8`a%#4|mt_jc2qOe=X7wT&_AfOTL^s z8a(U3)vO7V7CMS%WoC!h3cBWmv*~)sBjcMadVML}TKKs+cSE z>-4fz?~RNAIW%iDDQTK-d_;UOspcNKz|e~=7XK#~%{4njFeR=BZpnN zUkgXMf0Q*fIn2o|@M)cJh{mF3)pLeOSclmE?_JAbbZ*ifvZRIjh1r=JTYtosJR1+& z(TJHba!)%W;bL;hoFANSD>B=bf+WY`Qq&jxx#9Q9VwY?qypD!i7#2{xf(~@C=JY_M z5nMVL%X9Q9tK-YVS1}-&Y3xUET@UjgniY`v7e|mpnuMCAPTL z4Z`_R<*lrY$#k}Su+3tvEsnQJy(&VtR`st%>9hcHW7ri&Zh(|B z7KGr*5IM+H(!vLl>(*DTGZKaaS3w7_F%s#-4=tYlI14nQ*J14u&5GilD&v)7?*PnL zCW+Y6E_1fz2kkK>XJ`0un?LqLz#br0e#v zFxiybt&AL;l19SjH8n+zo2rXqUE~45A(R%#5$kl3V$`Wy!G-*-{(YDOiR_)e6zCMr z70dCNFPbA4noG$7-p6ZeU(r^KPgm4nTk7*!Gu&nMgiSeWTSd}FN70+7A;ODbPEGbZ z0GNPi2(wLDeAP}iF%c`HGU~@VOFxU`v)JNNITez}Sns@dA5HY15ssUgVV< z#xEsMn+<*qg8M>o4;K98z@0}T?m0w9T7K+8{7On{S+J(<(~dhR|6g+N)DU_NwuMDZn?~HUPe<0nP{Sb~wCGoZ~f@ zpj>ZvFwEoGrIB^H-eKhNxOeLq2O#|gN|=2}SBp1N8){X&6|4`Q0a2H%tB(ndm^CHr zKz*Lg)usaH1Yk@TP+x7;W#jQ!Mp0a`>;*IPXPRWeaRnPFb?pnbo~KVZQk z)LCjh|~2Kca2vd!2*3;s_CThM$P54yNfgdxZsa0{%&BmcVa^jB&MJ+?YiLeXbNwtXWj4U}n+2tg+^cb5DMlhEb?^Mz z8jMa)U;j3L4kYmpM(7WpuK0T}g-Bg|3TBaKi0Hfd02<9t}h zu!rs1HHvgWf^g`2buyUHJIayEZ_E+E$>Jj>9bW&Ijg(9r{D%f^GuyYP;QQ;P zLLo054vW#sJpg(&QRl_WU>mR)jbpxBP|x{(8r!Tz5e{-PIY=)r#kRtvIdUB%qOva# z4ic3s28u@>pB8b+JHfNoPJT_Qe5Li@r*H#pqpC!P{)`~o2A`qWr4~F=EWGzubvl^! z5W<#2>A2uCNtop{)ksUba9XzkX~@69Tl8>@-2eUCquVGtP_+t2*Gm0o%D+GtODwjA zZ`PjrV&-AR*wnY|R;P z7W1ekI&7md^{z_X+{3*|rv=_9c)Z;fmBt?pnY(~-4COC!>@g4fFqp3_P{jJYkCF!r1&jyE2qz=ac~OG8_x#dey|UUC{N(K$#A`9U zE-4AQdRiD8Bn$NhK@m&s>U>JpkP*IyKvXJ$G*qX3>A2Rj&r+x0E+fnt(%#qeV#{Ur zTf+rsB)nq}R*6UcY zFXFpoYX0w8hh6uWeFmVtDLg|4;k4ESngR2d^FtJ>bgGUlidLmC%4Qx_U9*rpH|@ys zrGf;BEzlw?(G==g89UVevm{=n39}h+jNz-~wft8vzL0P|rH9{cs`D;1Ul|^<$d+@t zDlIoG#G&_G`S%oK1OJw}N#0CZq=@4R;CoykMO*`5=W>pDMl#EuwdgselR1=;tp^Seji&+qxCSIsof^W67!U+epNUkFfItl7W&=a}vXX)5`x?fOvL z`_{LirK-hq1^3~6)kcT!$G?6~?v-<9xIe8*nR_bt~cHu75p7o>0ytjJ_g-gmeX5-R+a;I2@{3p^akPA+aue8s}Hp_Z1C_MIY zaQ<9l*9DG5yl_5ar%o`a69;(E}o;SpAKkH#ZHf%TCSu*{%-9uW`l@Si1 zY-?U$S_2Kk=?A~xMif*dS#3RQWZ5~QS>uc8S1@uqB77(s9xhaS#PP5rTWvy5;l$7| zY&N>-EQzoKNlQK2AD_~_GZQ4+>u+d{Z%<~l)=r?`uKhXeoe8lWk*)Bqz0)<^@H z8*T8llkuE*qA<}aj;`Rb%}&wEQS0a?Hm()H2P}U1t>;#qx)mco_5x~Xu*!0}pBOB@ zD8Cr{Q2eFN(>ckI8lXVa5w5VE$9IChTcZSxFYg%wAl3s$3;5tX9>DtmJ4@I>0$CR! zE;HqgOk^es!_tg5uyH7(^3y?4K@qWXad-LS0 zNBFucjWWas@zzJ1{#q0XRPze-tHD^E@=*a}1>OK+c3YyoS}AO-8f%yIJ%m-uTGtO4 z(&J3+RANtV?-X$iI>tBZ#B}kb2lt#muM?8V=!hnf+O(d|2}Oc^fQv)T>F+(X)U!-S zwt%bVFA93PGXFPB{W5Z4SXzA*voW)1DH6c<;zuiW|K!rG4S=AatJ%q z49~SP8bezD>J~r%*V(m0l&Sz&$J<1xCkPWYyV2aY&CVf{Xj^%Ojf{W`x+4@V&MxcASXmR}?`;Y;s7#-ZOkIyKX2DOxRsN1j1?L+Nv`3J4LTV?p?`mcB0t1 z$v$x-AeU8&$h){bDvffr4`|)6CroEdZNbI~QsqG-bh7B)I&UwH{5Ib_cq)V3ST*Vy zGdbPuAxJMa=R7TyEe^VGmlpBKG&?WY>|e5HC53pebFKBPddLWF4kMQRQ;_M_37ypEjVJmKkthp}RV-xyca;s(Z% z8SIXPJC%8~8Zb}+T)$!31Q>!7CVq~!rWtmV42S4 zo_6X0E&{Ji^`~Y@yI%Ck0qdB0vF9J6!A=?#g3?qXS|8m-xcVT*NvmXwXKYzzS7te zQ@2pqmjMc3rGjk;Y%rQNTg};P;(P3YX9M5PJr4P={~Ds$z~_?+OE_WKZP|>jjGBy= zeU9+6ES%}7J4ly!Xfwrjo?cIt6y>$mN0qj{1koDj$*CEzp=NTQdTRi>IVj3RtE@0% zn*$^VZQ45G?QmVVEO=`bmqgl&Tp4o6Ldw4tJ^PlDA>+WN^NUj+e zli^-Q>`bz>RJPV5RRz$n!@YNTo16-#{slKfe?=hl6r{%Hk`-`xF}iLGuC2^IsnKv2me0_g&mhP2N$P|b^? z&h~xR!Y9hp1rQKjPkg{G3O8GC2 zgG~jOzd_GCYCotJXZL;2$G@TmL^(%gcoWp~cCNMa0M08;M=?MQSUi^x1To)(x7Se)uQnh!kj z02VfDr!8${L2^@R%VMM|fYK;h?U{oR#=xMN<^O&n@eu;#TL0PTz+ECzj>qOAbV{q9 zzj8W?tb|U&W}v0;e4D-5yd1<7ZE9&e%;;d3nJyO=uO^$YkpvKNT_Axe1RogOdkr*|E&$TO@gEBHZ$ihQ_N@LekpCtJ z>UftnHrgKu8rWH*KRXM+G!;O5tP7KB-=z@Zo4zu{z`=fQl<{==CPR%bNB2hw0Srd{ zoQfZpqH*p{D`l+s|E$FS7BloXl4?vn1vZ7XDBlf|3_DBNwbkhku^>>uh`~Jevv5H; zg?%1IsoX^;eZQhCRzUdk9tXM^6!@i(HjpAK{v|PJki7*rJPy{xzUM<*GZ@rCigIK^ z(VXviTsYC(9Gb$Kos8cAr@>Zf&35D#Q($>;iCxg zS*nCas0#}hn?F1c+Q_R7*kiZxTiJ=~rkv4EVSlX9DDuxz{5;_kiE=e|&IpnH-~`%2 zVpsu3TzAI5Gkl0Ocrqjg7R}`XLvwIJ%waqgyGSfwi;ysUwLpuxC!nZ<_#;|C23QAi zK)Bex@G9kIZQ4=$0IQnfzaaITO%1?%;n?vSa{71NS=7sR2f&jo{Sj;_4=JWn0>y^M zs?V&sn>fo(e-RR9-FX58BxjDR8hsTE%`%5zCdR(%PA-e{?q`_qd?^b0_HT%axV9dS#M_E9(Hj}bS%vSUY;=ZmflzfYUOT~Nr4eTEOpaN@x14v5mkBIN z18GX8JQxtVZu++}8EbZM%ng{QE1Nx4RS^u2Je14&z>h~RyVod#f8&%iXA_^2^V-)H zDiR3nb4u%1f$IxWKIhw%2JXx0Yz46K&}^^iLW&ScZ9AR?%mm zXKdJHbQPu$bSc`&8SXRLo<(OGW(~iR-NN0FHTm{m^CILMQ%VUW_Z~p=aBF4&{wGgF0s>8ta5rDBsMJ5z_ zb)*wI+4|WT@KCl;0+^?oJx7~)sGO}p5X`ZCUkZK0#`XHe7Ov;%J891Sa2-CwlSnu) zA?vsSoH&kK79Qdbqm*I8Fi^uNKV(}M_lWyVW&{Eh%oV0!G?=P=T^6N_BF|V8R>oNS zpR7Uxr2^CEx_r4*BFhUEcWQwC3V;ULT432m;5+F+SY%=?>IIQSR)yaup(U)zIf$P^ z>?Q0JKqiLeGh`RG$3Cy`mt~5qRNdo)mr$nd!zhnbCChlr1Ohn&-;izal^EVq#eaW; z*1xMWjf;uu+Pj*8tkRsZ59W9;=um|fkuaWYuAp7v!J~jgh4tB?K}pRMcP~bfTNr8w z53dY8$gLTC?P46JtiM9o@sQu?9pin6n6gDCCaErlve;LOgjG8fFPPdBLbpRs zS~}6V#9Do_g;G^zJh%TXy|nf3x+YV-u(epm88-3m2s{(qkPCDv{27%Lg?E+ixW3)@ zzeM>o(+Iuri0kRmJgrhSkbvG7*vKcRy;!M-K7g?!>jX978zzK+hNom*;-wd798#X( z?u(_76{C5jd?119UK$;-g{3rjlyzK8$<6JBwJXAE8$w>m)PIPVe*9T_9;S#|EL|Rj zt_D-a$Xqxb3C9Q4I!%0KoQqXt72M%MLCx;FzyTwK2O$3~r4ELwLb`06o{bp4y}n|c z&n_aK?W@1a-lp`e2>$^$2Kj6gSLg4%>&(~ixuI`>DKX$WbrDEsck$4kuu(#^OodL| zIWWNhdD!ywWEi=sT+_HGmug8{9}xDg58c6Od_UZemq9=3Gc;SCx-Qvt}J5+>0G#{O(LvxsXEMBa-~hvFy;?#;O^@t&RN)~&#~QIBcr`}E2%3DI#ioxMyO=veMDy+u!BQuZ1~ z&)y-rJ9mUTI;o;^;&I0Rxw<_EUP!3dHWVcU;0j!^BlyBdiEx{qCjh!KR%EZ){T`%k zZJRVsjXi+asLMwQfjPNSHs0xL3D5h?E^9&_IsA0?6t(+V(3MfS84V-^m>4?|3>`4?AI?omoM0tY|HdBbO$#D?h)QRm9bNZGA!w^mU!-Kggek zA$+t@JhWCb`j$8@2j{GHu0#UGNk0H}85txp*E8D&=|t#BjWjX-AxsZx<0Ztx{Hu4J z%)W<25P(BrfP5GGc1roR&t@w%$2MVodgcRVY@rI5uhr z0pyHmwl~OvY5ye-=}Y@E#w5~XwR;YL&k_P=5w2`DZ@b_!+?GXi32&E{jx3tSm4!-h zg60z}UYB|cMeLBNW>d!_uplFo1=qaaqZOk?=RzSCb!Zy>Lf3;s2cz%K31n zPCbl-xv{W0Jg~38S|pvgV!+OX>q^zJ0F<>KWDMHK-R`Edro3oDcWbea8X%xc2qjpI zuHS`kDa-IxA~8b2#+p!`LUCLF#i=Wb2d#1@t+4$ac4{N3nZ^FkDdXS=KX zp~i<(4fo533VcQ{6D58nO>U=jOqk7pWX3C>Q5AJDwPI(M+P7167K3j_tNg9#rDl^+ z|9bc3h3L!n(UWE*YOaCr@l!vT4Pcx7LrxY*H_Bx6>-bkXip|XDBj%hXQfSc)KBIqA ztIcL!R1a17jH2l62R9$6@(-ooG@Ef_eQq$t8l$QNOB-dMe||Kkl1F7}4 zslF)wEJAJYhqI@}KrAtss-(GR-*Rd?>t0ws9Wsq=VN%=jghro+$Qa;yz6IJ7ZfDm z=8$m7aFN=>g1dhukJPShZlqvmmod#XcD;42uR^RPgdxQO-}~ykZEW`1xgQoZc7AQC zlatdD6CGId@f4?`&6;BJlhiy5gD9D$C<^3`xwvBz_zg>K`j0{_>^4d|8uOD^24uyvT%5{sL_0^rEUsWs`k9Jc)zjo z;*6NQ(iSIuhWKmi12r#j!t~4JyE~p7vKT)~Hag#5_1QTNO1CHVhgs_c`<^;WW#?3F1DlSn7JpP;@R+m`IvgmV5KjFl|hwYj52U{;pVm^r3eiL7}~MQ*s(S zdj8>DH4$%oTqRMb>7Ml+O|3d&YDnW-}8kogV1FBaP{O>Zk7rk!_D_ltguUr{{%W z>;(0ED-C+<{*(Juz4Ru^Q|{T?`~J@_cDMvFb#JwAaB24wk4Z2j+OdMt-}UO68(U@r z$IX?7l_I&K)!E`24u2kV-2GPA>Y+l7IP*ak_3Oy^l8fZvO)e$4^d|CC$h`i{vF|g~ z^OpRz0Z_#c@}(b2c2Uzcs9_CMoCb=zQZ}SU(Yv(~G-WX*wl6aNBM0|bJwSbTbL|yk zL@f2coO+Xb;%^sztjP8{MKLVkj>}1vaBv97UTTfc3N4+x2r-?+^@osW7| zUEu4vHyH`aT;V;8<)6;XU=*~PkBcltzleoFa3-*c*|f*MX_?1fpH6&A4mr1N zLvqgO@8FmnsG4^rWvLd6nfgS1sr7dh(;-i?zwkS>#7f#E^($}`3uqH>F#ZOT|Ej9` z7CL1yvqKP^2)3ASRr4XFAX2~C6{NRDiCFiDVV+E?stxC?^4_9-RXdp+r3L7xIS5h_j#|X(j#dT zJ$WICmb%Rr&N^(Cr}s2`oN5k@WAnOo)XxA@@wlh4=sylR4=IGy&&?K^(`WX{j1pI* z!D3&A9b?(!17Y53B*8m(WaP!)J@x^iG)%SMY%u7?OdRq*D+sc5%ua-=qSKu3_@zaZ z)TGmO3X^`lKTbCSf;CpN8Pi*LUJkA+Hqh|J@LYZIuZ=|Y6}4j0gRb?5F++P}#O<_@ zN@#3e$hoLz9Xvq8=W`jMU4V92AoZ{1uUh!KtUvCk2X!$R@~};4oxFKL{Mch_IV`M9 zaeVB{8m6W%MK>~j8XF1Zc;V{c2r!Sj#_lC)A-y(i+zY)`{%Xd~m24mOx#3S)V?3iK zeMe7I$E&_s1($Xx0y7nVN9AqbJb4021N*G=ge)dozXA!Z#xiRA!`P5;IhC|Dcp7DN zXGlxxlr?ac8(f~q@3DDVqCR^*>?kGmcW}9MSIuKdS2Dobx%t+$E0NxUe?`tf<2_}M zes}l%S?ADuA$_;7BL#c|5{hwJcN4={Zdnufl4f*Ye8Fsj81XT=10N)(p}t;&{f9gy zr!z3XHV*+a3FbsUJoJCPb>2fssqDM*v0zOvc3LLofy0w^8I5AV#y4y>xh*)J7oJ1I zG=lScqAe+RKvY6;Fl$=`WE`{gjhxswB+44*Zu5jatwJou%N*yF@iEzOe>|XvDZMcC z-kc427f-_dC%Z7dZT4~Dq*RLn$X=W^_3$Me=k4H@YiJYDM} zhg^*Se}ld24xS3bc%z*(1acp2KA^Jq{d}U%hBr4uCdYC_8w}mi81dhQ){9!6kE-^* z!DeGTRJi$0~j&)&uM?2SBH0-htFuV$woGbW|KqO2cl z9X^S_i+_OofG=u&@-aD{szD<)^ptXOg@^_-&ZaMWu5Av;Qs4i)P z;yGJZ!`BzGkQF}$u(SYHOzrrLQyeN2P(OD5yhd{Qa%0 z!Erk)Ymcf;6x&fqd5SLaaT>T2^s;*aL-BR0x!?tv7b6;c6eC`G8&(rG3tazQ^PEclWD9ci+x^kkOk?I5|Zky3Xw4F&OvmA!UGr z2TpUTtu*L{$}5kko_Z@MM|;Jtq<-mJ*Te&G$Y3vSISzorarAIr$nLAPFY3ni!~$CF z{4S9kZu0jImNb{qzs9PbA5yW4-44<>0Djn0Le*cn{4spSM+aU|uBvedkN(T(P>U1M z$t3@j3v%eMz<%E74|6$Y%HIBd@YimUdTfAG<>B%Dq(<%sT@^#cy)XcX1YSNXmBIZW zv8Rq=+1PN(U6&bEIXrpWIMFaImJpn7+Z$5Y6-OLdxm|-duUB`0f;`%g}%;fM95O>e3rGHLMX5<=$;JhLlwqThE)lZ9j9VO=md5 z^-}~A_JTZ1gDu+8YSg!G{!S)0;PvtOfJ9U8%Re)QTpD2GosHUAOg|4MtgiT`ezU9C z{iiO*25QqE&?dJ8%}sMIMxwu!&V)&O^+!6Sr)l7I>I-hxMThLfR(50dv~ZH=f$o?B z1oFqOZi-O~=8B3Q)VV{(;PctqE)63sN}j@xgOBCPw_l(r`h{u3rEhD1uEyq$^VBKz z^(u`*0P_|?rrNZzoV8bLV109IJ6U2Y1wzRtHl~-(FX~g@Q{Phb2*I*t79q0(l%`(# z;*2K=vLRijlDoH?0ml4HsGW?fM2zQj72epiRSyUbLf=G1wwO}_T=Y_nekhU#65 zA}UM9da13{88vt3!FP580Sd;;J8Gc4wQq~tn%QP#SN&>6nfPlmhsg3u!M5p#?0_nKKAg?iBh>hum!ENjEbct!1=`&foIKDl%Hj{zbyjOI zO&{9(sM(ng8GKd&o!tp}AjuX3l5`{P)eVQ*J+`qKFNa+iXp{~p*urV)&xE@Tzz#S( z?-22AESb6gs>%xx+?cj|G>wcQYAU(pCN zF}znJLi`^VfcMSi0-d_@IS1(^GJ5sGp^cMe>2q5;=298vJ&&mpME0G;VR4HbBY7VA zn?W~R>v5lEWJthTPZCsl7adS7g;QfxYl^#YR|Kpd8p9&*7Pet!EWTC3nFK(xwbw7D zBz(6ap3^pg-n91p8T;k;j6w4tfw*AF@1BRgr3Uw!*y5sEsh19{Me%Q#j!p#)X{$w^pPv!Pf1NSUmbNf= z`U!@z77H>;7rq9F zo?hbcOfwHjADfU2*-eI@%0#Kit_d$dR6BeuvXyB&KNl*oxARlT{z{0DsF7o zepvHQXBizg}xUKZ$!Gw zAdQ?d&jrQUb~u8T#&W1~$))rWWoX$Im9`%S&9%~UV^VgQPpmjaxW=HibJ)%)x?dkn zNKPy&x^-e9WLGfnt4FLzxHKsp6dk#Mp7Ynn;773 zV7IXkI5s*T?u7LCdy8M4{{dtlcGh$k)E7IYd;*NmKRbJM_*-R`C+2XbQ$xdh#y{|f zm?-0+4;r%Tgc_b3@8W-FA;w9j9@kJNZ7t%JwjHGYF5+X*D6G8r$V@*?3M{?B_mBvumj5c>%J)=~eo)52H7dbz91V zP9O%HOZb3qz{OgtyVM`8?U)#+un7YB(T^i<%B~?NK{grUq1gok>sCI;)M5!8C>Flb1$Ao4ZHOt~1Ji!6?gw>63u z+^FhE3Yk-Z2@GnFrBQ*3Kl64EiwZ;aXXs19YoJ$QLSYUnjTz%HYGp2ctGZrsTin=( z*G=f{({t}Bu_F(HWb#K$N}w*tp%huKUa4X9-=XYEM5MgJ5@Y$RToM&OFfJ_f*DINtHdXWfhDIx)s>2nT3GpZdEZTxf}6i;oVW@E4D3FMFsY z?5zJ2f9uuhS6GEW7EhU9uYP@PJhTI?b?eEW>8jb4C_B3o&_qqZCrT>}wpzLsM(AJz zEC_%k`6j@e9YNXhFZ12iCoJzGln)2O%LKjRhT9$vy$0ZXsq8UC(j&l3b%w4?KSL=k zJ>RJ1^`Z18&I>(8dtr2PtCLYlO~Jp#NmifFd_Uhs^&;L(3c^iF+xrF>@$r4QOXkEM z#+4-5>5*q=g4A+ZOpA}=q7VwUdggZfSZ;bjq0ec$F*0cNL}r7p+xm24>FL<;GoWJj za&E4^P14X{J2$!mVua=%@mO)JKgb?;T4H{0MWLkI+TWO=o7{qSP$)ex*V2x*?_=_k z4{j-aVIJ1VA&=h1t3ObEjf_4tcx({nI3VHIa>Kwt6;H;Dv`n7)9zyNMkC;2SPI?{Wo@Q7L1Zp=kwMv-qM zmt$3Z^ILK*eg^m0uD6(a=%;X$=Sx4Efo|ea!g`X-{2H!OPHjQs)1Cs~U7NOnhj*Jp zsj1X*Vq`KnbbNr!&aTb-dJt4=_*?a<6MB4sg3>2qb;>;WmzBQ`HF9enbL7~#M*1Mq zCI}IPC$qmut#$O6Q*S-Or;MUw#+HGG)rvyDd!LL$s}8>4}_L6Au6ciVP^W zF>4wz1rjflS-(NlE3o<<<)37E9g1uu+SMhyJ~%f&vcl4X4@(!ktC-WPK2JVTFboOR zq0dkYsp;x8irVY=_!D`tIoHU(7d|lhlaebR%)Ef1k=H`rCeJ-3VMpVIpCQJh zjw_d&O*=8MDK@rZt}i&EQOP<$g$=amzbS)82N@qkX$Su2BD> zN>jZlV?OI(8ACI>I)@y;hQQ(f&a8fn;`nN0^zVf2xuXya0l1 zUcY3E%W~H$`2jJ;LXGs7ctMc93Di?kD+|QP<=;A%AcyD1OV3&$vZSQqbO0yJ_JFDm zoBWOK4!0Mv+-1gVq33C_K7sK@TcAxCbb4gX>5F2M;%}8)*RpZ*@S}U9bmeVBPM*VMg#1q_qGg?;Oja8O`iGimrCEec{`~lMZlZ$>1GEP`uV-+<}a%9smuID zuzYA2EOBT@b)1<*%uX-tkPm=P;Cu>fnjq2bDWye z=2S$_#~4&~mYKGJhIc)9TGeJ${Xt_==P4g6Nb$}-rn-V~di{^3w z0MJg>{+qMQ(C!=RlQuCH#fC#%p(jvv6t<&$-4_WHkE;sFmG5yi=>rdBHz(;*&sFZI<;@ zPAt)t=S{%&-F`z6yy@}hijnzm75MxQlN`K44H$= zf*tM`j}+ce%SF>=)R9kC<>;lvo>tdRR-UR|OS2|9IWgabYibQJ`CHq1-0@f#{T9lB zehI}*v)~CHiN95P{W0%U_+kp}98R~O9U`sCCC7a3S-ulMUPr>?W zV3Q#+5Eu8gh?;6ELoRcIE_{U3^bjB?%fj%;K@vpp`;e13XS@w=1+z!%2R=ZgWl*Ww z*?l(3>~}YedD}vLx?cvj%VBL!Qf*BwIIt7z2Pk+N`pzB!o_sPiZ-l)iC#+*Qm3#t+3*NUJC5FEjGA z0LTIf`jd50v&($B_vkXyRVGdx8;7L>l+F%7X|x#M4~PoiTr=_!U6K! ztYgUnt_6>>^sa|Tn<8VfhC0H}Kph|g4rX0&cDRZq|Ly?I|6@yu-B9KkoHS0LaByW^ zG5c;X+S<)SzfC5=0_r!UJvi}5_XKkDy)+X-BrJ;*u$IVdG#e5|E6_?qdjs+d$MkUH zn5LedizhS4#(}0|_g<~PB64Wvb9(Z!$Cj!qphXh0ASUpAc9$C~2~Hh+d>x1>2O@c! z1Xvj*XI_mN6Gf(M?93Km?$uZe4Q$Oz^u6N3sdK0X!@cCb z+_z!E6%vjrKt?6a_Aqh@0{hz_<{H#Lmn)HT{R zuM*=wIcdMVJoJUA`HL-y@$ZX0KM!!R%DJo5lA{4;YxMy+9bbfF#pmF3MmxCE$klQt zIqocJ)w|&)@T6N%q>Qz9n}uI}pGsv;Cu(c|#F7Xpe|q>7%n%L|V zcPn(WxQhG;kIv=woMjI#4$U;_@fZy$oL{Fv_iTHk-;vk00u`7%yai_a5?<0?z#sZ> z@hW0mT37mZWpmFQKnw#@#*Rz`5Uwm})In0WB8KC-i67n)=ei?eWOva0~ zyM)@n&t9WJju$RO>m7Q-`OYrv)?M9)OQM0EX1)LZ{JpK48@!CQ>%9j$IUC$djfN8{ zWV#ap5o*A~+*>~7D(+44yJjL$`lkszvFZRXAk2m+Hi|%zV1RqXM`zWUXf3wtiBhAj z*T{d2kH6G8afNge1H5R~owQ}p6y2>zS%9f~w4=jtV6?;7gX?=PE0K9iE(=Xm(Z!}+ zE*VzFRL2#>9B(E>n@b+E{a&|Om`{J?k$IbmsnO6qPi6XX($8ULsLgDP7K1nd9uebi zmv8z_if{+`NnAC0Y^YB5q*RVg-jZW z4t+l1T@tbDtyr>ttW0$AP@r7dr`oL|O&-m^YE#eYH`epJ^L4+E3$~UR6mpc%?DoD` z@4`fRK1=~E=qs{o#!t(!e!ROA@Dk5<(=8Hnok4_bZ>V^sU}Y!1IZK-I*pdWV*e<9Oi{Me|aHYrREx&QSo*%~8iOhL+A+sw!}%%MOpb-M&IoT%QmHVqsXN zg@bOXDIFbWQ(&5W9|XpzU~>~z7HwBkRUe}Q8?aOtrhQ>l7bl*R%B~!InD$J}k#ms8 zk@wkf9kf(=T&L}G= zMPVfqh9ER;+VqB0wi-ggV5lm@%~<5U7QPbQbRoGnG?$n&R2HdsXrq#hMei4Q&vN1d zAXgpCB;oZ#d#^8*Td=$E$a4Z1CVKm);X`pg{a&!s%$ut^2M8=bNtLZEin+cWRvfP= z<)K*~!5v;q($`}NeN=l$lePBi#N9MDArP2M^->k_Yco7pam}h>rL|kM61@RND}e&@ zW=Si^0C>Hp!IHV!9UK5n^SN&+1?LI~gY>_nYv;z#fA={QKfupnVm*4N_8zUCXL?U42U@EdNKFZE#eFp_ z<^K#zF_9mbcVzBzr5)$yiY({m(U#Ol?n0U@8|-BfX(z85RHb!1QJ(<`!EMm!&C5*g zf;*d7>ITjje;i|teo(cn~(D#YfU8M|HsDubFpNvXnO!=wYZMD~rT+;%%T=&auO+b6SwxDv?k z?%{gzLpX7agzq1}{uQFw0{OAYK<=7K$-Ny@5PUQP-n^_^$Vb5Gm;4MP0n=__vg7jO zFeX_}Y8p)2D>vz%y|w*l%gmvu!)BmF3#(#$p5#BYC*xH)5LT4;7Jmj|HWWWtRI8r7 z^CCjh@e{)?NmNVfLhB==Hh8^_FZ_i^koW&NySCE5x^lueH<7qRS+$2?Qf6Aefe0Vp z?)4x}C3dftIcMUXqgu=$@^@z#{z~Bh`w-}wWk&{C8h?;?RU35<3J*i-{q_l@X+WK! zuH$S%(6dCQI(VVfzETg%=_x&i1T^`Q+70KZceL0DGr8lLr8 zG5^1uhz)q_o2HldzAvqgJw5kfI_073XH{TcI7lS4#KOcEZt72dy~odT`fgw03R1MO zm%2QJ3y~*yvzO$dUu^LK^yf)*EEl@N#@-4=6K(uRLIe;{*PX_1s+b1IvddoB3b!1jqi zC$rucgwPqxJG)OL71_%9eS^18qYG*#uQo3-JLf>&&Y95fWqLVg(+%-UC|f(cf#Z$m zcJahju+haHD6%kDhkFRh^QuNApfBN%0KNMXaxobunojV`yIl3(; zEB3ZiCD|kCNnk^&?si;NcNj!-y|IdQ@i?EbVA4JqwULHoqJb%YkMYVbwO3(_5Jc|B)_Oo4maJ9f1;{Ev)^xnh+0R z^8pU71f7Hapojhtr1+)cO8ohk_eCxCA5;GWv~~>1AKhXbBsT_L*89h6j&xO;FQ;$w5GRwh6c@+sFfET5$Z)Y z-V^hzF0Nx19@%N^Lfz?Zr4bF6!^9CCtg{Xc4csqlI5)q&R)5%#UeP@}z;xU2!okQ0 zR7jg54Lf|$f*G8gA+n4`ehh#dV*#zjEumr3T;NTFnFo}E#Op_so`AVM+IZ6ZH|CIH zw#`oE#M*6wccG5s6XM&yp0REGwGnbs@vM&*oeg!T?c3#>YIkN`&F8Tt*HH?PyV=;zx$4A44~fJVO1E>CPap#@(z9ywcno#gq? zt@B9H*wUpf)0%X z_}OvJ@!~$SolBmpk;V$u#-Dq?+Dq*o4c2+0ERAL}?GdE<5EI0~t(p#QrT*Ldk6|~q zb6!1-l0p&ZVv{G2Ad<+4rJFg#H*bsHT7mqPOyy=#2Zj13*v4AlLpcHIEa7O7iX47i zA=8zZB;3W2ChBmwPfaY|Ldl@E4WEb+R~6a{KTYDjm^)=CdPHSh`bMf~F*7Tq1ZrI9 zIt@6$T9Kk6rWZiGw~N_tytZ`3pn1__#SlwsZU((o90@A;v0=oLkp2sDhser_uQorY zX+o6J$5oKBvt{yLf_qr%0!Cx@0-^D0dcwYD8DUOFR4vqih3iH7@>QhEab>%DI1}^y z%A)5NaX4!QrZu$Zsn|th8-&&V%eZ951)**1+xxCSC*iK@+j z`kx1PH0v>--lzT`4$U{sjYq6Nz+hL+n4Ab8?gmHH7oajw8KgX@UG879C$yrZ06Zfc zbs4Eh(|s$H-(iJ~EwmcH;dH6z6;+qoKrN)WGtF-IE4B}&n^^o~Dim{|rs6b_FmtFq zJZ6+O1oBh+$53~S#W&-=>N0ti6iD@$(5g*;;AN{xhqg~I-%>*gK*XQ|_GU81PW3|h zo!77n>s+D8UgVZlNbG>^Y0yFOD}deJ2&4=%3W|{t2}80f&^_-Uq}D-BJ~@!3?5J1X z&RMMH!o{}sEl=R8Jp>sNDK>f(aciW@I8&!Rf)B z?Rg(JoDX0{1+<+TZ~STu-t5+s5IjaUp*sLlV?XXMmC?z#h2o}<+4bI_dJ%L7Tw}rT z$zJ<_ZEYL39uB(bOTQgSqv7JxpR3=UZo+9+>aK3R3{pp}y@5e7<7j zPEnHg9k9ICwA6zR&0T39Wjc(`4FbU~#`lo`_zYYK;LVXIfMiy+jR3v?W#aJ4O{Dzr z#Ix)VgN^XPXUdg>LM&$qs<+K*hRM-Q8j;o5(`Dz&-pvVZYneAp>)$KF+W`_|3_AAf z>m|@Ebds5!i5CVF8xFf%dYg5P#%S6KoS($!fb7~B+8j9Se8rwCQO4FWespuxVH6%D zBE>&3o=|IiGwfN+Q_0g<2kURtUidpO3vNs_w(DDgv5*^YG&kVBG^dOn+{4eHNKsaq z!;ba(|F8hcfnYpohgESSledoxOYqKX56lo0_S$CXW@;%1@+k2SwlRu2m`-zcHTqjF z@rS1Vk3_1#8n%$Zjv>T9bW5$$R7#!u3_AD*WtC4Wh2gd0`-i@G~Zn?BVR; z^;^3A4n>3?fL9g_{$S^+!d^U6BF5MKJWXaCB(D{r0@dG{42a6jb|%TCEE6zFvA5sa zf7by4(<@2i$f#>i<->G2y`zB7zI>1Qz8FEY1 zYwbS{6hGae?^JSV)^5qx_;6%8g@Ng@BK57)EM@WoA-6)iK^cTWUdI$` zp`8wf;nBNxAqyc=(mp(kHuU^zQugqkV~;(Ri+Tr#O91@)O_0?7=%iz<+mAuqbA@|P zr14_<2|WR?`{Pqd$MmGKo19!5y_M-Y^m~Ht8cesT(G#BpFoJ8w+tapf@F8`Iq~8sY zBjwXi=wPQV;Kxi}@6|SM5pS*+p>_R3qLpvGF_+Wh3cNR$6+G~X5k=_FL42Pq&Cp

?Q`3)+mN7Z)8JCE6~kV(P}^A!!a%k~+dkFv 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 diff --git a/docs/_static/sequence_generator_scheme.svg b/docs/_static/sequence_generator_scheme.svg index 91e2be87..3d7e6f66 100644 --- a/docs/_static/sequence_generator_scheme.svg +++ b/docs/_static/sequence_generator_scheme.svg @@ -114,8 +114,8 @@ id="rect3008-35" width="30" height="50" - x="378.332" - y="302.71573" /> + x="399.332" + y="307.71573" /> @@ -239,13 +239,13 @@ id="flowPara4025" style="font-size:8px" /> @@ -253,7 +253,7 @@ xml:space="preserve" id="flowRoot4017-5" style="font-size:10px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" - transform="matrix(0.89878529,-0.43838912,0.43838912,0.89878529,110.28345,272.44408)">transition.take_glimpsestransition.take_glimpses @@ -399,7 +399,7 @@ style="font-size:4px" id="tspan4154-1" /> @@ -664,7 +664,7 @@ sodipodi:nodetypes="cc" /> From 6177388bcdec4b858d8ca051ef0bb40d23f91c83 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Fri, 6 Nov 2015 14:34:08 -0500 Subject: [PATCH 027/129] Making unpickling robust to MaxPooling change. --- blocks/bricks/conv.py | 7 +++++++ tests/bricks/test_conv.py | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index fc987b98..bfed1c2d 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -292,6 +292,13 @@ def __init__(self, pooling_size, step=None, input_dim=None, ignore_border=ignore_border, padding=padding, **kwargs) + def __setstate__(self, state): + self.__dict__.update(state) + # Fix objects created before pull request #899. + self.mode = getattr(self, 'mode', 'max') + self.padding = getattr(self, 'padding', (0, 0)) + self.ignore_border = getattr(self, 'ignore_border', False) + class AveragePooling(Pooling): """Average pooling layer. diff --git a/tests/bricks/test_conv.py b/tests/bricks/test_conv.py index 907ddbb8..2a9e219e 100644 --- a/tests/bricks/test_conv.py +++ b/tests/bricks/test_conv.py @@ -1,3 +1,4 @@ +import pickle import numpy from nose.tools import assert_raises_regexp @@ -149,6 +150,29 @@ def test_max_pooling_padding(): assert out.shape == (2, 3, 2, 6) +def test_max_pooling_old_pickle(): + brick = MaxPooling((3, 4)) + brick.allocate() + # Simulate old pickle, before #899. + del brick.ignore_border + del brick.mode + del brick.padding + # Pickle in this broken state and re-load. + broken_pickled = pickle.dumps(brick) + loaded = pickle.loads(broken_pickled) + # Same shape, same step. + assert brick.pooling_size == loaded.pooling_size + assert brick.step == loaded.step + # Check that the new attributes were indeed added. + assert hasattr(loaded, 'padding') and loaded.padding == (0, 0) + assert hasattr(loaded, 'mode') and loaded.mode == 'max' + assert hasattr(loaded, 'ignore_border') and not loaded.ignore_border + try: + loaded.apply(tensor.tensor4()) + except Exception: + raise AssertionError("failed to apply on unpickled MaxPooling") + + def test_average_pooling(): x = tensor.tensor4('x') brick = AveragePooling((2, 2)) From 769eb701d247a83afafe69cfb4ad727779fc9cd9 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Fri, 6 Nov 2015 15:00:35 -0500 Subject: [PATCH 028/129] Test for overzealous support code. --- tests/bricks/test_conv.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/bricks/test_conv.py b/tests/bricks/test_conv.py index 2a9e219e..a6e9e269 100644 --- a/tests/bricks/test_conv.py +++ b/tests/bricks/test_conv.py @@ -171,6 +171,11 @@ def test_max_pooling_old_pickle(): loaded.apply(tensor.tensor4()) except Exception: raise AssertionError("failed to apply on unpickled MaxPooling") + # Make sure we're not overriding these attributes wrongly. + new_brick = MaxPooling((4, 3), padding=(2, 1)) + new_brick_unpickled = pickle.loads(pickle.dumps(new_brick)) + assert new_brick_unpickled.padding == (2, 1) + assert new_brick_unpickled.ignore_border def test_average_pooling(): From eedab382853cd516521f22940e5ee045f5b754f2 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Tue, 24 Nov 2015 21:16:22 -0500 Subject: [PATCH 029/129] Fix debugprint output for Theano/Theano#1953. --- docs/create_your_own_brick.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/create_your_own_brick.rst b/docs/create_your_own_brick.rst index d67b0ce5..e29911ed 100644 --- a/docs/create_your_own_brick.rst +++ b/docs/create_your_own_brick.rst @@ -119,12 +119,12 @@ to the tag attributes of the variables, as shown below: >>> i2 = tensor.matrix('i2') >>> y = foo.apply(i1, i2) >>> theano.printing.debugprint(y) - Elemwise{identity} [@A] 'foo_apply_output' - |Elemwise{add,no_inplace} [@B] '' - |Elemwise{identity} [@C] 'foo_apply_input1' - | |i1 [@D] - |Elemwise{identity} [@E] 'foo_apply_input2' - |i2 [@F] + Elemwise{identity} [id A] 'foo_apply_output' + |Elemwise{add,no_inplace} [id B] '' + |Elemwise{identity} [id C] 'foo_apply_input1' + | |i1 [id D] + |Elemwise{identity} [id E] 'foo_apply_input2' + |i2 [id F] >>> print(y.name) foo_apply_output >>> print(y.tag.name) From 3cd7bfdfe71f62e63ffb792c4079f5719c637a1a Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Mon, 23 Nov 2015 19:30:15 -0500 Subject: [PATCH 030/129] Get rid of ConvolutionalLayer. Fixes #912. Requires a sister pull request for blocks-examples. --- blocks/bricks/conv.py | 69 --------------------------------------- tests/bricks/test_conv.py | 56 +++++-------------------------- 2 files changed, 9 insertions(+), 116 deletions(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index bfed1c2d..95de56c6 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -386,75 +386,6 @@ def _push_allocation_config(self): self.convolution.step = self.step -class ConvolutionalLayer(_AllocationMixin, Sequence, Initializable): - """A complete convolutional layer: Convolution, nonlinearity, pooling. - - .. todo:: - - Mean pooling. - - Parameters - ---------- - activation : :class:`.BoundApplication` - The application method to apply in the detector stage (i.e. the - nonlinearity before pooling. Needed for ``__init__``. - - See Also - -------- - :class:`Convolutional` : Documentation of convolution arguments. - :class:`MaxPooling` : Documentation of pooling arguments. - - Notes - ----- - Uses max pooling. - - """ - @lazy(allocation=['filter_size', 'num_filters', 'pooling_size', - 'num_channels']) - def __init__(self, activation, filter_size, num_filters, pooling_size, - num_channels, conv_step=(1, 1), pooling_step=None, - batch_size=None, image_size=None, border_mode='valid', - tied_biases=False, **kwargs): - self.convolution = ConvolutionalActivation(activation) - self.pooling = MaxPooling() - super(ConvolutionalLayer, self).__init__( - application_methods=[self.convolution.apply, - self.pooling.apply], **kwargs) - self.convolution.name = self.name + '_convolution' - self.pooling.name = self.name + '_pooling' - - self.filter_size = filter_size - self.num_filters = num_filters - self.num_channels = num_channels - self.pooling_size = pooling_size - self.conv_step = conv_step - self.pooling_step = pooling_step - self.batch_size = batch_size - self.border_mode = border_mode - self.image_size = image_size - self.tied_biases = tied_biases - - def _push_allocation_config(self): - super(ConvolutionalLayer, self)._push_allocation_config() - self.convolution.step = self.conv_step - self.convolution._push_allocation_config() - if self.image_size is not None: - pooling_input_dim = self.convolution.get_dim('output') - else: - pooling_input_dim = None - self.pooling.input_dim = pooling_input_dim - self.pooling.pooling_size = self.pooling_size - self.pooling.step = self.pooling_step - self.pooling.batch_size = self.batch_size - - def get_dim(self, name): - if name == 'input_': - return self.convolution.get_dim('input_') - if name == 'output': - return self.pooling.get_dim('output') - return super(ConvolutionalLayer, self).get_dim(name) - - class ConvolutionalSequence(Sequence, Initializable, Feedforward): """A sequence of convolutional operations. diff --git a/tests/bricks/test_conv.py b/tests/bricks/test_conv.py index a6e9e269..bb0c760c 100644 --- a/tests/bricks/test_conv.py +++ b/tests/bricks/test_conv.py @@ -3,14 +3,13 @@ from nose.tools import assert_raises_regexp import theano -from numpy.testing import assert_allclose, assert_equal +from numpy.testing import assert_allclose from theano import tensor from theano import function from blocks.bricks import Rectifier -from blocks.bricks.conv import (Convolutional, ConvolutionalLayer, MaxPooling, - AveragePooling, ConvolutionalActivation, - ConvolutionalSequence) +from blocks.bricks.conv import (Convolutional, MaxPooling, AveragePooling, + ConvolutionalActivation, ConvolutionalSequence) from blocks.initialization import Constant from blocks.graph import ComputationGraph @@ -42,7 +41,7 @@ def test_border_mode_not_pushed(): layers = [Convolutional(border_mode='full'), ConvolutionalActivation(Rectifier().apply), ConvolutionalActivation(Rectifier().apply, border_mode='valid'), - ConvolutionalLayer(Rectifier().apply, border_mode='full')] + ConvolutionalActivation(Rectifier().apply, border_mode='full')] stack = ConvolutionalSequence(layers) stack.push_allocation_config() assert stack.children[0].border_mode == 'full' @@ -223,35 +222,6 @@ def test_pooling_works_in_convolutional_sequence(): assert out.shape == (2, 3, 3, 7) -def test_convolutional_layer(): - x = tensor.tensor4('x') - num_channels = 4 - batch_size = 5 - pooling_size = 3 - num_filters = 3 - filter_size = (3, 3) - activation = Rectifier().apply - - conv = ConvolutionalLayer(activation, filter_size, num_filters, - (pooling_size, pooling_size), - num_channels, image_size=(17, 13), - batch_size=batch_size, - weights_init=Constant(1.), - biases_init=Constant(5.)) - conv.initialize() - - y = conv.apply(x) - func = function([x], y) - - x_val = numpy.ones((batch_size, num_channels, 17, 13), - dtype=theano.config.floatX) - assert_allclose(func(x_val), numpy.prod(filter_size) * num_channels * - numpy.ones((batch_size, num_filters, 5, 3)) + 5) - - assert_equal(conv.convolution.batch_size, batch_size) - assert_equal(conv.pooling.batch_size, batch_size) - - def test_convolutional_sequence(): x = tensor.tensor4('x') num_channels = 4 @@ -259,14 +229,14 @@ def test_convolutional_sequence(): batch_size = 5 activation = Rectifier().apply - conv = ConvolutionalLayer(activation, (3, 3), 5, - (pooling_size, pooling_size), - weights_init=Constant(1.), - biases_init=Constant(5.)) + conv = ConvolutionalActivation(activation, (3, 3), 5, + weights_init=Constant(1.), + biases_init=Constant(5.)) + pooling = MaxPooling(pooling_size=(pooling_size, pooling_size)) conv2 = ConvolutionalActivation(activation, (2, 2), 4, weights_init=Constant(1.)) - seq = ConvolutionalSequence([conv, conv2], num_channels, + seq = ConvolutionalSequence([conv, pooling, conv2], num_channels, image_size=(17, 13)) seq.push_allocation_config() assert conv.num_channels == 4 @@ -290,14 +260,6 @@ def test_convolutional_activation_use_bias(): assert len(ComputationGraph([act.apply(tensor.tensor4())]).parameters) == 1 -def test_convolutional_layer_use_bias(): - act = ConvolutionalLayer(Rectifier().apply, (3, 3), 5, (2, 2), 6, - image_size=(9, 9), use_bias=False) - act.allocate() - assert not act.convolution.use_bias - assert len(ComputationGraph([act.apply(tensor.tensor4())]).parameters) == 1 - - def test_convolutional_sequence_use_bias(): cnn = ConvolutionalSequence( [ConvolutionalActivation(activation=Rectifier().apply, From 589543e35962eafb85c17d92a77f195f0df53917 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Mon, 23 Nov 2015 19:56:57 -0500 Subject: [PATCH 031/129] Remove mention of `ConvolutionalLayer` from a docstring. --- blocks/bricks/conv.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index 95de56c6..fd383123 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -392,8 +392,8 @@ class ConvolutionalSequence(Sequence, Initializable, Feedforward): Parameters ---------- layers : list - List of convolutional bricks (i.e. :class:`ConvolutionalActivation` - or :class:`ConvolutionalLayer`) + List of convolutional bricks (i.e. :class:`Convolutional` or + :class:`ConvolutionalActivation`). num_channels : int Number of input channels in the image. For the first layer this is normally 1 for grayscale images and 3 for color (RGB) images. For From 65e995202260e2a93c617772d454a460101cc08a Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Tue, 24 Nov 2015 20:59:15 -0500 Subject: [PATCH 032/129] Replace deprecated getOutputShape interface. --- blocks/bricks/conv.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index bfed1c2d..468434d3 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -1,4 +1,4 @@ -from theano.tensor.nnet.conv import conv2d, ConvOp +from theano.tensor.nnet.conv import conv2d, get_conv_output_shape from theano.tensor.signal.downsample import max_pool_2d, DownsampleFactorMax from blocks.bricks import Initializable, Feedforward, Sequence @@ -55,9 +55,12 @@ class Convolutional(Initializable): conv2d_impl = staticmethod(conv2d) # Used to override the output shape computation for a given value of - # conv2d_impl. Should accept 4 positional arguments: the image size, - # the filter size, the step (strides), and the border mode. - get_output_shape = staticmethod(ConvOp.getOutputShape) + # conv2d_impl. Should accept 4 positional arguments: the shape of an + # image minibatch (with 4 elements: batch size, number of channels, + # height, and width), the shape of the filter bank (number of filters, + # number of output channels, filter height, filter width), the border + # mode, and the step (vertical and horizontal strides). + get_output_shape = staticmethod(get_conv_output_shape) @lazy(allocation=['filter_size', 'num_filters', 'num_channels']) def __init__(self, filter_size, num_filters, num_channels, batch_size=None, @@ -157,9 +160,11 @@ def get_dim(self, name): if name == 'input_': return (self.num_channels,) + self.image_size if name == 'output': - return ((self.num_filters,) + - self.get_output_shape(self.image_size, self.filter_size, - self.step, self.border_mode)) + image_shape = (None, self.num_channels) + self.image_size + kernel_shape = ((self.num_filters, self.num_channels) + + self.filter_size) + return self.get_output_shape(image_shape, kernel_shape, + self.border_mode, self.step)[-3:] return super(Convolutional, self).get_dim(name) @property From 5928f3445d44b93c26626226ea4c43cee23753b1 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Mon, 30 Nov 2015 19:44:49 -0500 Subject: [PATCH 033/129] Pass shared_floatx kwargs to theano.shared. --- blocks/utils/__init__.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/blocks/utils/__init__.py b/blocks/utils/__init__.py index dae6da36..d455ed86 100644 --- a/blocks/utils/__init__.py +++ b/blocks/utils/__init__.py @@ -108,8 +108,8 @@ def shared_floatx_nans(shape, **kwargs): return shared_floatx(numpy.nan * numpy.zeros(shape), **kwargs) -def shared_floatx(value, name=None, borrow=False, dtype=None): - """Transform a value into a shared variable of type floatX. +def shared_floatx(value, name=None, borrow=False, dtype=None, **kwargs): + r"""Transform a value into a shared variable of type floatX. Parameters ---------- @@ -123,6 +123,8 @@ def shared_floatx(value, name=None, borrow=False, dtype=None): dtype : :obj:`str`, optional The `dtype` of the shared variable. Default value is :attr:`config.floatX`. + \*\*kwargs + Keyword arguments to pass to the :func:`~theano.shared` function. Returns ------- @@ -133,8 +135,7 @@ def shared_floatx(value, name=None, borrow=False, dtype=None): if dtype is None: dtype = theano.config.floatX return theano.shared(theano._asarray(value, dtype=dtype), - name=name, - borrow=borrow) + name=name, borrow=borrow, **kwargs) def shared_like(variable, name=None): From c6cd4134c49da42d711fdfa3041817cab2b8ffe6 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Tue, 1 Dec 2015 01:12:55 -0500 Subject: [PATCH 034/129] Update ConvolutionalSequence docs. --- blocks/bricks/conv.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index fd383123..e52eae8a 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -387,13 +387,13 @@ def _push_allocation_config(self): class ConvolutionalSequence(Sequence, Initializable, Feedforward): - """A sequence of convolutional operations. + """A sequence of convolutional (or pooling) operations. Parameters ---------- layers : list - List of convolutional bricks (i.e. :class:`Convolutional` or - :class:`ConvolutionalActivation`). + List of convolutional bricks (i.e. :class:`Convolutional`, + :class:`ConvolutionalActivation`, or :class:`Pooling` bricks). num_channels : int Number of input channels in the image. For the first layer this is normally 1 for grayscale images and 3 for color (RGB) images. For From 928dcbb5ec6a6807067c5393c8c98df24e9be95d Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Tue, 1 Dec 2015 01:57:42 -0500 Subject: [PATCH 035/129] Better document get_output_shape. --- blocks/bricks/conv.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index 468434d3..c93998a1 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -59,7 +59,10 @@ class Convolutional(Initializable): # image minibatch (with 4 elements: batch size, number of channels, # height, and width), the shape of the filter bank (number of filters, # number of output channels, filter height, filter width), the border - # mode, and the step (vertical and horizontal strides). + # mode, and the step (vertical and horizontal strides). It is expected + # to return a 4-tuple of (batch size, number of channels, output + # height, output width). The first element of this tuple is not used + # for anything by this brick. get_output_shape = staticmethod(get_conv_output_shape) @lazy(allocation=['filter_size', 'num_filters', 'num_channels']) From ff70906a83be6bf1db3393a583c0641613638a1a Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Tue, 1 Dec 2015 01:57:58 -0500 Subject: [PATCH 036/129] More robust get_output_shape call. --- blocks/bricks/conv.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index c93998a1..c17cb38f 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -166,8 +166,10 @@ def get_dim(self, name): image_shape = (None, self.num_channels) + self.image_size kernel_shape = ((self.num_filters, self.num_channels) + self.filter_size) - return self.get_output_shape(image_shape, kernel_shape, - self.border_mode, self.step)[-3:] + out_shape = self.get_output_shape(image_shape, kernel_shape, + self.border_mode, self.step) + assert len(out_shape) == 4 + return out_shape[1:] return super(Convolutional, self).get_dim(name) @property From b7f5df3fd15a647e59ba830ca54cbfb46496f7a8 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Tue, 1 Dec 2015 10:14:26 -0500 Subject: [PATCH 037/129] Pass along kwargs in shared_like. --- blocks/utils/__init__.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/blocks/utils/__init__.py b/blocks/utils/__init__.py index d455ed86..df9fc03b 100644 --- a/blocks/utils/__init__.py +++ b/blocks/utils/__init__.py @@ -138,8 +138,8 @@ def shared_floatx(value, name=None, borrow=False, dtype=None, **kwargs): name=name, borrow=borrow, **kwargs) -def shared_like(variable, name=None): - """Construct a shared variable to hold the value of a tensor variable. +def shared_like(variable, name=None, **kwargs): + r"""Construct a shared variable to hold the value of a tensor variable. Parameters ---------- @@ -149,6 +149,8 @@ def shared_like(variable, name=None): name : :obj:`str` or :obj:`None` The name of the shared variable. If None, the name is determined based on variable's name. + \*\*kwargs + Keyword arguments to pass to the :func:`~theano.shared` function. """ variable = tensor.as_tensor_variable(variable) @@ -156,7 +158,7 @@ def shared_like(variable, name=None): name = "shared_{}".format(variable.name) return theano.shared(numpy.zeros((0,) * variable.ndim, dtype=variable.dtype), - name=name) + name=name, **kwargs) def reraise_as(new_exc): From 353d52588b44f93ed0577bd9c485336bacf0e98d Mon Sep 17 00:00:00 2001 From: Mu Bo Date: Tue, 8 Dec 2015 12:37:48 +0800 Subject: [PATCH 038/129] Update bricks_overview.rst mlp.children[1].parameters[0].get_value() doesn't work --- docs/bricks_overview.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/bricks_overview.rst b/docs/bricks_overview.rst index d1949923..1f3801d9 100644 --- a/docs/bricks_overview.rst +++ b/docs/bricks_overview.rst @@ -174,7 +174,7 @@ automatically pushed the weight matrix and biases initialization configuration to its children. >>> mlp.initialize() - >>> mlp.children[1].parameters[0].get_value() # doctest: +SKIP + >>> mlp.children[0].parameters[0].get_value() # doctest: +SKIP array([[-0.38312393, -1.7718271 , 0.78074479, -0.74750996], ... [ 1.32390416, -0.56375355, -0.24268186, -2.06008577]]) From c0640b046f5a627564d90613e73870e183b4967c Mon Sep 17 00:00:00 2001 From: rizar Date: Mon, 11 Jan 2016 16:02:04 -0500 Subject: [PATCH 039/129] Disable namespace packages suppport --- blocks/__init__.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/blocks/__init__.py b/blocks/__init__.py index 90230562..d648e01d 100644 --- a/blocks/__init__.py +++ b/blocks/__init__.py @@ -1,5 +1,2 @@ """The blocks library for parametrized Theano ops.""" -# Scary warning: Adding code to this file can break namespace packages -# See https://pythonhosted.org/setuptools/setuptools.html#namespace-packages -__import__("pkg_resources").declare_namespace(__name__) __version__ = '0.1.1' From 07d43ae7c49702b160a7f1b1d62cf7e68c0e11cb Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Mon, 18 Jan 2016 15:53:05 -0500 Subject: [PATCH 040/129] Correct error message in filter.py. It checks for BoundApplications and then complains about Applications. --- blocks/filter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blocks/filter.py b/blocks/filter.py index b5c41a69..1bd23075 100644 --- a/blocks/filter.py +++ b/blocks/filter.py @@ -109,7 +109,7 @@ def __init__(self, roles=None, bricks=None, each_role=False, name=None, isinstance(application, BoundApplication) for application in applications): raise ValueError('`applications` should be a list of ' - 'Applications') + 'BoundApplications') self.roles = roles self.bricks = bricks self.each_role = each_role From 0f6623fab4d71fadcc8a77004c2527eff1bac8f9 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Tue, 1 Dec 2015 03:48:03 -0500 Subject: [PATCH 041/129] Initial batch-normalization implementation. This initially appears under bricks/bn.py. Although logically certain parts are more at home in graph/, (and it would be nice to import these hopefully-to-be-commonly-used-bricks in the blocks.bricks namespace), these changes will require some reorganization to avoid circular imports. This commit does two other things: - factors out the logic for holding onto a NumPy RNG for the purpose of initialization into RNGMixin (we want BatchNormalization bricks to have one of these to support initializers, but we do NOT want BatchNormalization bricks to receive initialization config pushes, since most of the time you just awnt the default mean 0 / std 1 initialization) - Adapts the role hierarchy to have something between "VARIABLE" and "PARAMETER" so that we can subclass it to use for BN population parameters, which are not quite "parameters" (e.g. if you VariableFilter for parameters you probably don't want them returned). I've called this new role "PERSISTENT". --- blocks/bricks/__init__.py | 63 +++---- blocks/bricks/bn.py | 336 ++++++++++++++++++++++++++++++++++++++ blocks/roles.py | 61 ++++++- 3 files changed, 430 insertions(+), 30 deletions(-) create mode 100644 blocks/bricks/bn.py diff --git a/blocks/bricks/__init__.py b/blocks/bricks/__init__.py index f626f725..a79504d6 100644 --- a/blocks/bricks/__init__.py +++ b/blocks/bricks/__init__.py @@ -64,7 +64,40 @@ def theano_rng(self, theano_rng): self._theano_rng = theano_rng -class Initializable(Brick): +class RNGMixin(object): + """Mixin for initialization random number generators.""" + + seed_rng = numpy.random.RandomState(config.default_seed) + + @property + def seed(self): + if getattr(self, '_seed', None) is not None: + return self._seed + else: + self._seed = self.seed_rng.randint( + numpy.iinfo(numpy.int32).max) + return self._seed + + @seed.setter + def seed(self, value): + if hasattr(self, '_seed'): + raise AttributeError("seed already set") + self._seed = value + + @property + def rng(self): + if getattr(self, '_rng', None) is not None: + return self._rng + else: + self._rng = numpy.random.RandomState(self.seed) + return self._rng + + @rng.setter + def rng(self, rng): + self._rng = rng + + +class Initializable(RNGMixin, Brick): """Base class for bricks which push parameter initialization. Many bricks will initialize children which perform a linear @@ -99,7 +132,6 @@ class Initializable(Brick): """ has_biases = True - seed_rng = numpy.random.RandomState(config.default_seed) @lazy() def __init__(self, weights_init=None, biases_init=None, use_bias=True, @@ -113,33 +145,6 @@ def __init__(self, weights_init=None, biases_init=None, use_bias=True, self.use_bias = use_bias self.seed = seed - @property - def seed(self): - if getattr(self, '_seed', None) is not None: - return self._seed - else: - self._seed = self.seed_rng.randint( - numpy.iinfo(numpy.int32).max) - return self._seed - - @seed.setter - def seed(self, value): - if hasattr(self, '_seed'): - raise AttributeError("seed already set") - self._seed = value - - @property - def rng(self): - if getattr(self, '_rng', None) is not None: - return self._rng - else: - self._rng = numpy.random.RandomState(self.seed) - return self._rng - - @rng.setter - def rng(self, rng): - self._rng = rng - def _push_initialization_config(self): for child in self.children: if isinstance(child, Initializable): diff --git a/blocks/bricks/bn.py b/blocks/bricks/bn.py new file mode 100644 index 00000000..1cb968a0 --- /dev/null +++ b/blocks/bricks/bn.py @@ -0,0 +1,336 @@ +import collections +import numpy +from theano import tensor +from theano.tensor.nnet import bn +from blocks.bricks import (RNGMixin, lazy, application, Sequence, + Feedforward, MLP) +from blocks.graph import add_annotation +from blocks.initialization import Constant +from blocks.filter import VariableFilter, get_application_call +from blocks.roles import (INPUT, WEIGHT, BIAS, BATCH_NORM_POPULATION_MEAN, + BATCH_NORM_POPULATION_STDEV, BATCH_NORM_OFFSET, + BATCH_NORM_DIVISOR, BATCH_NORM_MINIBATCH_ESTIMATE, + add_role) +from blocks.utils import (shared_floatx_zeros, shared_floatx, + shared_floatx_nans) +from picklable_itertools.extras import equizip + + +class BatchNormalization(RNGMixin, Feedforward): + """Normalizes activations, parameterizes a scale and shift. + + Parameters + ---------- + input_dim : int or tuple + Shape of a single input example. It is assumed that a batch axis + will be prepended to this. + broadcastable : tuple, optional + Tuple the same length as `input_dim` which specifies which of the + per-example axes should be averaged over to compute means and + standard deviations. For example, in order to normalize over all + spatial locations in a `(batch_index, channels, height, width)` + image, pass `(False, True, True)`. + save_memory : bool, optional + Use an implementation that stores less intermediate state and + therefore uses less memory, at the expense of 5-10% speed. Default + is `True`. + weights_init : object, optional + Initialization object to use for the learned scaling parameter + ($\\gamma$ in [BN]_). By default, uses constant initialization + of 1. + biases_init : object, optional + Initialization object to use for the learned shift parameter + ($\\beta$ in [BN]_). By default, uses constant initialization of 0. + + Notes + ----- + In order for trained models to behave sensibly immediately upon + upon deserialization, by default, this brick runs in *inference* mode, + using a population mean and population standard deviation (initialized + to zeros and ones respectively) to normalize activations. It is + expected that the user will adapt these during training in some + fashion, independently of the training objective, e.g. by taking a + moving average of minibatch-wise statistics. + + In order to *train* with batch normalization, one must obtain a + training graph by transforming the original inference graph. See + :func:`batch_normalize`. + + This Brick accepts `weights_init` and `biases_init` arguments but is + *not* an instance of :class:`~blocks.bricks.Initializable`, and will + therefore not receive pushed initialization config from any parent + brick. In almost all cases, you will probably want to stick with the + defaults (unit scale and zero shift), but you can explicitly pass one + or both initializers to override this. + + This has the necessary properties to be inserted into a + :class:`blocks.bricks.conv.ConvolutionalSequence` as-is, in which case + the `input_dim` should be omitted at construction, to be inferred from + the layer below. + + """ + @lazy(allocation=['input_dim']) + def __init__(self, input_dim, broadcastable=None, + save_memory=True, weights_init=None, + biases_init=None, **kwargs): + self.input_dim = input_dim + self.broadcastable = broadcastable + self.save_memory = save_memory + self.weights_init = (Constant(1) if weights_init is None + else weights_init) + self.biases_init = (Constant(0) if biases_init is None + else biases_init) + super(BatchNormalization, self).__init__(**kwargs) + + @application(inputs=['input_'], outputs=['output']) + def apply(self, input_, application_call): + mean = self.population_mean.copy(name='population_offset') + stdev = self.population_stdev.copy(name='population_divisor') + + def annotate(var, role): + add_role(var, role) + add_annotation(var, self) + add_annotation(var, application_call) + + annotate(mean, BATCH_NORM_OFFSET) + annotate(stdev, BATCH_NORM_DIVISOR) + + # Heavy lifting is done by the Theano utility function. + normalized = bn.batch_normalization(input_, self.W, + self.b, mean, stdev, + mode=('low_mem' if self.save_memory + else 'high_mem')) + return normalized + + def _allocate(self): + input_dim = ((self.input_dim,) + if not isinstance(self.input_dim, collections.Sequence) + else self.input_dim) + broadcastable = (tuple(False for _ in range(len(input_dim))) + if self.broadcastable is None else self.broadcastable) + if len(input_dim) != len(broadcastable): + raise ValueError("input_dim and broadcastable must be same length") + var_dim = ((1,) + # batch axis + tuple(1 if broadcast else dim for dim, broadcast in + equizip(input_dim, broadcastable))) + broadcastable = (True,) + broadcastable + + # "gamma", from the Ioffe & Szegedy manuscript. + self._W = shared_floatx_nans(var_dim, name='batch_norm_scale', + broadcastable=broadcastable) + + # "beta", from the Ioffe & Szegedy manuscript. + self._b = shared_floatx_nans(var_dim, name='batch_norm_shift', + broadcastable=broadcastable) + add_role(self.W, WEIGHT) + add_role(self.b, BIAS) + self.parameters.append(self.W) + self.parameters.append(self.b) + + # These aren't technically parameters, in that they should not be + # learned using the same cost function as other model parameters. + self.population_mean = shared_floatx_zeros(var_dim, + name='population_mean', + broadcastable=broadcastable) + self.population_stdev = shared_floatx(numpy.ones(var_dim), + name='population_stdev', + broadcastable=broadcastable) + add_role(self.population_mean, BATCH_NORM_POPULATION_MEAN) + add_role(self.population_stdev, BATCH_NORM_POPULATION_STDEV) + + @property + def W(self): + return self._W + + @property + def b(self): + return self._b + + def _initialize(self): + self.biases_init.initialize(self.b, self.rng) + self.weights_init.initialize(self.W, self.rng) + + # Needed for the Feedforward interface. + @property + def output_dim(self): + return self.input_dim + + # The following properties allow for BatchNormalization bricks + # to be used directly inside of a ConvolutionalSequence. + @property + def image_size(self): + return self.input_dim[-2:] + + @image_size.setter + def image_size(self, value): + if not isinstance(self.input_dim, collections.Sequence): + self.input_dim = (None,) + tuple(value) + else: + self.input_dim = (self.input_dim[0],) + tuple(value) + + @property + def num_channels(self): + return self.input_dim[0] + + @num_channels.setter + def num_channels(self, value): + if not isinstance(self.input_dim, collections.Sequence): + self.input_dim = (value,) + (None, None) + else: + self.input_dim = (value,) + self.input_dim[-2:] + + def get_dim(self, name): + if name in ('input', 'output'): + return self.input_dim + else: + raise KeyError + + @property + def num_output_channels(self): + return self.num_channels + + +class SpatialBatchNormalization(BatchNormalization): + """Convenient subclass for batch normalization across spatial inputs. + + Parameters + ---------- + input_dim : int or tuple + The input size of a single example. Must be length at least 2. + It's assumed that the first axis of this tuple is a "channels" + axis, which should not be summed over, and all remaining + dimensions are spatial dimensions. + + Notes + ----- + See :class:`BatchNormalization` for more details (and additional + keyword arguments). + + """ + @lazy(allocation=['input_dim']) + def __init__(self, input_dim, **kwargs): + if not isinstance(input_dim, + collections.Sequence) or len(input_dim) < 2: + raise ValueError('expected input_dim to be length >= 2 ' + '(channels, height, width)') + broadcastable = (False,) + ((True,) * (len(input_dim) - 1)) + kwargs.setdefault('broadcastable', broadcastable) + super(SpatialBatchNormalization, self).__init__(input_dim, **kwargs) + + +class BatchNormalizedMLP(MLP): + """Convenient subclass for building an MLP with batch normalization. + + Notes + ----- + All parameters are the same as :class:`~blocks.bricks.MLP`. Each + activation brick is wrapped in a :class:`~blocks.bricks.Sequence` + containing an appropriate :class:`BatchNormalization` brick and + the activation that follows it. + + By default, the contained :class:`~blocks.bricks.Linear` bricks will + not contain any biases, as they could be canceled out by the biases + in the :class:`BatchNormalization` bricks being added. Pass + `use_bias` with a value of `True` if you really want this for some + reason. + + """ + @lazy(allocation=['dims']) + def __init__(self, activations, dims, *args, **kwargs): + activations = [Sequence([BatchNormalization().apply, act.apply], + name='batch_norm_activation_{}'.format(i)) + for i, act in enumerate(activations)] + # Batch normalization bricks incorporate a bias, so there's no + # need for our Linear bricks to have them. + kwargs.setdefault('use_bias', False) + super(BatchNormalizedMLP, self).__init__(activations, dims, *args, + **kwargs) + + def _push_allocation_config(self): + super(BatchNormalizedMLP, self)._push_allocation_config() + # Do the extra allocation pushing for the BatchNormalization + # bricks. They need as their input dimension the output dimension + # of each linear transformation. Exclude the first dimension, + # which is the input dimension. + for act, dim in equizip(self.activations, self.dims[1:]): + act.children[0].input_dim = dim + + +def batch_normalize(computation_graph, epsilon=1e-4): + """Activate batch normalization in a graph. + + Parameters + ---------- + computation_graph : instance of :class:`ComputationGraph` + The computation graph containing :class:`BatchNormalization` + brick applications. + epsilon : float, optional + The stabilizing constant for the minibatch standard deviation + computation. Added to the variance inside the square root, as + in the batch normalization paper. + + Returns + ------- + batch_normed_computation_graph : instance of :class:`ComputationGraph` + The computation graph, with :class:`BatchNormalization` + applications transformed to use minibatch statistics instead + of accumulated population statistics. + + Notes + ----- + Assumes the minibatch axis is 0. Other axes are unsupported at + this time. + + """ + + # Create filters for variables involved in a batch normalization brick + # application. + def make_variable_filter(role): + return VariableFilter(bricks=[BatchNormalization], roles=[role]) + + mean_filter, stdev_filter, input_filter = map(make_variable_filter, + [BATCH_NORM_OFFSET, + BATCH_NORM_DIVISOR, INPUT]) + + # Group means, standard deviations, and inputs into dicts indexed by + # application call. + def get_application_call_dict(variable_filter): + return collections.OrderedDict((get_application_call(v), v) for v in + variable_filter(computation_graph)) + + means, stdevs, inputs = map(get_application_call_dict, + [mean_filter, stdev_filter, input_filter]) + + assert (set(means.keys()) == set(stdevs.keys()) and + set(means.keys()) == set(inputs.keys())) + assert set(means.values()).isdisjoint(stdevs.values()) + + replacements = [] + # Perform replacement for each application call. + for application_call in means: + axes = tuple(i for i, b in enumerate(means[application_call] + .broadcastable) if b) + minibatch_mean = inputs[application_call].mean(axis=axes, + keepdims=True) + minibatch_mean.name = 'minibatch_offset' + # Stabilize in the same way as the batch normalization manuscript. + minibatch_std = tensor.sqrt(tensor.var(inputs[application_call], + axis=axes, keepdims=True) + + epsilon) + minibatch_std.name = 'minibatch_divisor' + + def prepare_replacement(old, new, role, application_call): + """Add roles and tags to replaced variables.""" + add_role(new, BATCH_NORM_MINIBATCH_ESTIMATE) + add_role(new, role) + add_annotation(new, application_call) + add_annotation(new, application_call.application.brick) + new.tag.replacement_of = old + replacements.append((old, new)) + + prepare_replacement(means[application_call], minibatch_mean, + BATCH_NORM_OFFSET, application_call) + prepare_replacement(stdevs[application_call], minibatch_std, + BATCH_NORM_DIVISOR, application_call) + + return computation_graph.replace(replacements) diff --git a/blocks/roles.py b/blocks/roles.py index 4b6c4c84..2256eb6c 100644 --- a/blocks/roles.py +++ b/blocks/roles.py @@ -93,7 +93,14 @@ class CostRole(VariableRole): COST = CostRole() -class ParameterRole(VariableRole): +class PersistentRole(VariableRole): + pass + +# Any persistent quantity that should be saved as part of the model +PERSISTENT = PersistentRole() + + +class ParameterRole(PersistentRole): pass #: A parameter of the model @@ -175,3 +182,55 @@ class AlgorithmBufferRole(AlgorithmStateRole): #: buffers accociated with algorithms ALGORITHM_BUFFER = AlgorithmBufferRole() + + +class BatchNormPopulationStatisticsRole(PersistentRole): + pass + +#: base role for batch normalization population statistics +BATCH_NORM_POPULATION_STATISTICS = BatchNormPopulationStatisticsRole() + + +class BatchNormPopulationMeanRole(BatchNormPopulationStatisticsRole): + pass + +#: mean activations accumulated over the dataset +BATCH_NORM_POPULATION_MEAN = BatchNormPopulationMeanRole() + + +class BatchNormPopulationStdevRole(BatchNormPopulationStatisticsRole): + pass + +#: standard deviations of activations accumulated over the dataset +BATCH_NORM_POPULATION_STDEV = BatchNormPopulationStdevRole() + + +class BatchNormGraphVariableRole(VariableRole): + pass + +#: base for roles used for within-graph batch normalization replacement +BATCH_NORM_GRAPH_VARIABLE = BatchNormGraphVariableRole() + + +class BatchNormOffsetRole(BatchNormGraphVariableRole): + pass + +#: offset applied in a BatchNormalization application (or its +# batch-normalized replacement) +BATCH_NORM_OFFSET = BatchNormOffsetRole() + + +class BatchNormDivisorRole(BatchNormGraphVariableRole): + pass + +#: divisor applied in a BatchNormalization application (or its +# batch-normalized replacement) +BATCH_NORM_DIVISOR = BatchNormDivisorRole() + + +class BatchNormMinibatchEstimateRole(BatchNormGraphVariableRole): + pass + +#: role added to variables that are the result of a batch normalization +# replacement, rather than the original population statistics variables. +BATCH_NORM_MINIBATCH_ESTIMATE = BatchNormMinibatchEstimateRole() From 9b941161798b8d248383805faf7f351be2ccdda2 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Fri, 15 Jan 2016 19:26:17 -0500 Subject: [PATCH 042/129] Reorganize bricks subpackage. Splits up bricks/__init__.py into a few separate modules, with __init__.py taking on the typical role of importing specific symbols from each of them and exporting the blocks.bricks API. This makes the code easier to navigate, and also easier to write individual modules within blocks/bricks/ which depend on other blocks.bricks functionality, without incurring import loops. This also makes #885 trivial to implement for blocks.bricks: simply import symbols from the rest of the .py files under blocks/bricks/ and add them to __all__ (which is necessary for flake8 not to complain, and defines the list of things imported by 'import *', and is generally a nice-to-have). --- blocks/bricks/__init__.py | 766 +----------------------------------- blocks/bricks/interfaces.py | 214 ++++++++++ blocks/bricks/sequences.py | 153 +++++++ blocks/bricks/simple.py | 395 +++++++++++++++++++ blocks/filter.py | 3 +- blocks/model.py | 2 +- blocks/serialization.py | 2 +- docs/tutorial.rst | 2 +- 8 files changed, 783 insertions(+), 754 deletions(-) create mode 100644 blocks/bricks/interfaces.py create mode 100644 blocks/bricks/sequences.py create mode 100644 blocks/bricks/simple.py diff --git a/blocks/bricks/__init__.py b/blocks/bricks/__init__.py index a79504d6..2c197d02 100644 --- a/blocks/bricks/__init__.py +++ b/blocks/bricks/__init__.py @@ -1,750 +1,16 @@ -"""The interface of bricks and some simple implementations.""" -import logging - -import numpy -from six import add_metaclass -from theano import tensor -from theano.sandbox.rng_mrg import MRG_RandomStreams -from toolz import interleave -from picklable_itertools.extras import equizip - -from blocks.config import config -from blocks.bricks.base import application, _Brick, Brick, lazy -from blocks.bricks.wrappers import WithExtraDims -from blocks.roles import add_role, WEIGHT, BIAS -from blocks.utils import pack, shared_floatx_nans - -logger = logging.getLogger(__name__) - - -class Random(Brick): - """A mixin class for Bricks which need Theano RNGs. - - Parameters - ---------- - theano_seed : int or list, optional - Seed to use for a - :class:`~theano.sandbox.rng_mrg.MRG_RandomStreams` object. - - """ - seed_rng = numpy.random.RandomState(config.default_seed) - - def __init__(self, theano_seed=None, **kwargs): - super(Random, self).__init__(**kwargs) - self.theano_seed = theano_seed - - @property - def theano_seed(self): - if getattr(self, '_theano_seed', None) is not None: - return self._theano_seed - else: - self._theano_seed = self.seed_rng.randint( - numpy.iinfo(numpy.int32).max) - return self._theano_seed - - @theano_seed.setter - def theano_seed(self, value): - if hasattr(self, '_theano_seed'): - raise AttributeError("seed already set") - self._theano_seed = value - - @property - def theano_rng(self): - """Returns Brick's Theano RNG, or a default one. - - The default seed can be set through ``blocks.config``. - - """ - if not hasattr(self, '_theano_rng'): - self._theano_rng = MRG_RandomStreams(self.theano_seed) - return self._theano_rng - - @theano_rng.setter - def theano_rng(self, theano_rng): - self._theano_rng = theano_rng - - -class RNGMixin(object): - """Mixin for initialization random number generators.""" - - seed_rng = numpy.random.RandomState(config.default_seed) - - @property - def seed(self): - if getattr(self, '_seed', None) is not None: - return self._seed - else: - self._seed = self.seed_rng.randint( - numpy.iinfo(numpy.int32).max) - return self._seed - - @seed.setter - def seed(self, value): - if hasattr(self, '_seed'): - raise AttributeError("seed already set") - self._seed = value - - @property - def rng(self): - if getattr(self, '_rng', None) is not None: - return self._rng - else: - self._rng = numpy.random.RandomState(self.seed) - return self._rng - - @rng.setter - def rng(self, rng): - self._rng = rng - - -class Initializable(RNGMixin, Brick): - """Base class for bricks which push parameter initialization. - - Many bricks will initialize children which perform a linear - transformation, often with biases. This brick allows the weights - and biases initialization to be configured in the parent brick and - pushed down the hierarchy. - - Parameters - ---------- - weights_init : object - A `NdarrayInitialization` instance which will be used by to - initialize the weight matrix. Required by - :meth:`~.Brick.initialize`. - biases_init : :obj:`object`, optional - A `NdarrayInitialization` instance that will be used to initialize - the biases. Required by :meth:`~.Brick.initialize` when `use_bias` - is `True`. Only supported by bricks for which :attr:`has_biases` is - ``True``. - use_bias : :obj:`bool`, optional - Whether to use a bias. Defaults to `True`. Required by - :meth:`~.Brick.initialize`. Only supported by bricks for which - :attr:`has_biases` is ``True``. - rng : :class:`numpy.random.RandomState` - - Attributes - ---------- - has_biases : bool - ``False`` if the brick does not support biases, and only has - :attr:`weights_init`. For an example of this, see - :class:`.Bidirectional`. If this is ``False``, the brick does not - support the arguments ``biases_init`` or ``use_bias``. - - """ - has_biases = True - - @lazy() - def __init__(self, weights_init=None, biases_init=None, use_bias=True, - seed=None, **kwargs): - super(Initializable, self).__init__(**kwargs) - self.weights_init = weights_init - if self.has_biases: - self.biases_init = biases_init - elif biases_init is not None or not use_bias: - raise ValueError("This brick does not support biases config") - self.use_bias = use_bias - self.seed = seed - - def _push_initialization_config(self): - for child in self.children: - if isinstance(child, Initializable): - child.rng = self.rng - if self.weights_init: - child.weights_init = self.weights_init - if hasattr(self, 'biases_init') and self.biases_init: - for child in self.children: - if (isinstance(child, Initializable) and - hasattr(child, 'biases_init')): - child.biases_init = self.biases_init - - -class Feedforward(Brick): - """Declares an interface for bricks with one input and one output. - - Many bricks have just one input and just one output (activations, - :class:`Linear`, :class:`MLP`). To make such bricks interchangable - in most contexts they should share an interface for configuring - their input and output dimensions. This brick declares such an - interface. - - Attributes - ---------- - input_dim : int - The input dimension of the brick. - output_dim : int - The output dimension of the brick. - - """ - def __getattr__(self, name): - message = ("'{}' object does not have an attribute '{}'" - .format(self.__class__.__name__, name)) - if name in ('input_dim', 'output_dim'): - message += (" (which is a part of 'Feedforward' interface it" - " claims to support)") - raise AttributeError(message) - - -class Linear(Initializable, Feedforward): - r"""A linear transformation with optional bias. - - Brick which applies a linear (affine) transformation by multiplying - the input with a weight matrix. By default, a bias term is added - (see :class:`Initializable` for information on disabling this). - - Parameters - ---------- - input_dim : int - The dimension of the input. Required by :meth:`~.Brick.allocate`. - output_dim : int - The dimension of the output. Required by :meth:`~.Brick.allocate`. - - Notes - ----- - See :class:`Initializable` for initialization parameters. - - A linear transformation with bias is a matrix multiplication followed - by a vector summation. - - .. math:: f(\mathbf{x}) = \mathbf{W}\mathbf{x} + \mathbf{b} - - """ - @lazy(allocation=['input_dim', 'output_dim']) - def __init__(self, input_dim, output_dim, **kwargs): - super(Linear, self).__init__(**kwargs) - self.input_dim = input_dim - self.output_dim = output_dim - - @property - def W(self): - return self.parameters[0] - - @property - def b(self): - return self.parameters[1] - - def _allocate(self): - W = shared_floatx_nans((self.input_dim, self.output_dim), name='W') - add_role(W, WEIGHT) - self.parameters.append(W) - self.add_auxiliary_variable(W.norm(2), name='W_norm') - if self.use_bias: - b = shared_floatx_nans((self.output_dim,), name='b') - add_role(b, BIAS) - self.parameters.append(b) - self.add_auxiliary_variable(b.norm(2), name='b_norm') - - def _initialize(self): - if self.use_bias: - W, b = self.parameters - self.biases_init.initialize(b, self.rng) - else: - W, = self.parameters - self.weights_init.initialize(W, self.rng) - - @application(inputs=['input_'], outputs=['output']) - def apply(self, input_): - """Apply the linear transformation. - - Parameters - ---------- - input_ : :class:`~tensor.TensorVariable` - The input on which to apply the transformation - - Returns - ------- - output : :class:`~tensor.TensorVariable` - The transformed input plus optional bias - - """ - if self.use_bias: - W, b = self.parameters - else: - W, = self.parameters - output = tensor.dot(input_, W) - if self.use_bias: - output += b - return output - - def get_dim(self, name): - if name == 'input_': - return self.input_dim - if name == 'output': - return self.output_dim - super(Linear, self).get_dim(name) - - -class Bias(Feedforward, Initializable): - """Add a bias (i.e. sum with a vector).""" - @lazy(allocation=['dim']) - def __init__(self, dim, **kwargs): - super(Bias, self).__init__(**kwargs) - self.dim = dim - - def _allocate(self): - b = shared_floatx_nans((self.output_dim,), name='b') - add_role(b, BIAS) - self.parameters.append(b) - - def _initialize(self): - b, = self.parameters - self.biases_init.initialize(b, self.rng) - - @application(inputs=['input_'], outputs=['output']) - def apply(self, input_): - """Apply the linear transformation. - - Parameters - ---------- - input_ : :class:`~tensor.TensorVariable` - The input on which to apply the transformation - - Returns - ------- - output : :class:`~tensor.TensorVariable` - The transformed input plus optional bias - - """ - b, = self.parameters - return input_ + b - - def get_dim(self, name): - if name in ['input_', 'output']: - return self.dim - super(Bias, self).get_dim(name) - - def _get_dim(self): - return self.dim - - def _set_dim(self, value): - self.dim = value - - input_dim = output_dim = property(_get_dim, _set_dim) - - -class Maxout(Brick): - """Maxout pooling transformation. - - A brick that does max pooling over groups of input units. If you use - this code in a research project, please cite [GWFM13]_. - - .. [GWFM13] Ian J. Goodfellow, David Warde-Farley, Mehdi Mirza, Aaron - Courville, and Yoshua Bengio, *Maxout networks*, ICML (2013), pp. - 1319-1327. - - Parameters - ---------- - num_pieces : int - The size of the groups the maximum is taken over. - - Notes - ----- - Maxout applies a set of linear transformations to a vector and selects - for each output dimension the result with the highest value. - - """ - @lazy(allocation=['num_pieces']) - def __init__(self, num_pieces, **kwargs): - super(Maxout, self).__init__(**kwargs) - self.num_pieces = num_pieces - - @application(inputs=['input_'], outputs=['output']) - def apply(self, input_): - """Apply the maxout transformation. - - Parameters - ---------- - input_ : :class:`~tensor.TensorVariable` - The input on which to apply the transformation - - Returns - ------- - output : :class:`~tensor.TensorVariable` - The transformed input - - """ - last_dim = input_.shape[-1] - output_dim = last_dim // self.num_pieces - new_shape = ([input_.shape[i] for i in range(input_.ndim - 1)] + - [output_dim, self.num_pieces]) - output = tensor.max(input_.reshape(new_shape, ndim=input_.ndim + 1), - axis=input_.ndim) - return output - - -class LinearMaxout(Initializable, Feedforward): - """Maxout pooling following a linear transformation. - - This code combines the :class:`Linear` brick with a :class:`Maxout` - brick. - - Parameters - ---------- - input_dim : int - The dimension of the input. Required by :meth:`~.Brick.allocate`. - output_dim : int - The dimension of the output. Required by :meth:`~.Brick.allocate`. - num_pieces : int - The number of linear functions. Required by - :meth:`~.Brick.allocate`. - - Notes - ----- - See :class:`Initializable` for initialization parameters. - - """ - @lazy(allocation=['input_dim', 'output_dim', 'num_pieces']) - def __init__(self, input_dim, output_dim, num_pieces, **kwargs): - super(LinearMaxout, self).__init__(**kwargs) - self.linear = Linear() - self.maxout = Maxout() - self.children = [self.linear, - self.maxout] - - self.input_dim = input_dim - self.output_dim = output_dim - self.num_pieces = num_pieces - - @property - def input_dim(self): - return self.linear.input_dim - - @input_dim.setter - def input_dim(self, value): - self.linear.input_dim = value - - def _push_allocation_config(self): - self.linear.output_dim = self.output_dim * self.num_pieces - self.maxout.num_pieces = self.num_pieces - - @application(inputs=['input_'], outputs=['output']) - def apply(self, input_): - """Apply the linear transformation followed by maxout. - - Parameters - ---------- - input_ : :class:`~tensor.TensorVariable` - The input on which to apply the transformations - - Returns - ------- - output : :class:`~tensor.TensorVariable` - The transformed input - - """ - pre_activation = self.linear.apply(input_) - output = self.maxout.apply(pre_activation) - return output - - -class ActivationDocumentation(_Brick): - """Dynamically adds documentation to activations. - - Notes - ----- - See http://bugs.python.org/issue12773. - - """ - def __new__(cls, name, bases, classdict): - classdict['__doc__'] = \ - """Elementwise application of {0} function.""".format(name.lower()) - if 'apply' in classdict: - classdict['apply'].__doc__ = \ - """Apply the {0} function element-wise. - - Parameters - ---------- - input_ : :class:`~tensor.TensorVariable` - Theano variable to apply {0} to, element-wise. - - Returns - ------- - output : :class:`~tensor.TensorVariable` - The input with the activation function applied. - - """.format(name.lower()) - return super(ActivationDocumentation, cls).__new__(cls, name, bases, - classdict) - - -@add_metaclass(ActivationDocumentation) -class Activation(Brick): - """A base class for simple, element-wise activation functions. - - This base class ensures that activation functions are automatically - documented using the :class:`ActivationDocumentation` metaclass. - - """ - pass - - -class Identity(Activation): - @application(inputs=['input_'], outputs=['output']) - def apply(self, input_): - return input_ - - -class Tanh(Activation): - @application(inputs=['input_'], outputs=['output']) - def apply(self, input_): - return tensor.tanh(input_) - - -class Logistic(Activation): - @application(inputs=['input_'], outputs=['output']) - def apply(self, input_): - return tensor.nnet.sigmoid(input_) - - -class Softplus(Activation): - r""" Softplus brick. - - The softplus is defined as :math:`\zeta(x) = \log(1+e^x)`. - - .. Dugas, C., Bengio, Y., Belisle, F., Nadeau, C., and Garcia, - R. (2001). Incorporating second-order functional knowledge - for better option pricing. In NIPS 13 . MIT Press. - - """ - @application(inputs=['input_'], outputs=['output']) - def apply(self, input_): - return tensor.nnet.softplus(input_) - - -class Rectifier(Activation): - @application(inputs=['input_'], outputs=['output']) - def apply(self, input_): - return tensor.switch(input_ > 0, input_, 0) - - -class Softmax(Brick): - """A softmax brick. - - Works with 2-dimensional inputs only. If you need more, - see :class:`NDimensionalSoftmax`. - - """ - @application(inputs=['input_'], outputs=['output']) - def apply(self, input_): - """Standard softmax. - - Parameters - ---------- - input_ : :class:`~theano.Variable` - A matrix, each row contains unnormalized log-probabilities of a - distribution. - - Returns - ------- - output_ : :class:`~theano.Variable` - A matrix with probabilities in each row for each distribution - from `input_`. - - """ - return tensor.nnet.softmax(input_) - - @application(inputs=['input_'], outputs=['output']) - def log_probabilities(self, input_): - """Normalize log-probabilities. - - Converts unnormalized log-probabilities (exponents of which do not - sum to one) into actual log-probabilities (exponents of which sum - to one). - - Parameters - ---------- - input_ : :class:`~theano.Variable` - A matrix, each row contains unnormalized log-probabilities of a - distribution. - - Returns - ------- - output : :class:`~theano.Variable` - A matrix with normalized log-probabilities in each row for each - distribution from `input_`. - - """ - shifted = input_ - input_.max(axis=1, keepdims=True) - return shifted - tensor.log( - tensor.exp(shifted).sum(axis=1, keepdims=True)) - - @application(inputs=['y', 'x'], outputs=['output']) - def categorical_cross_entropy(self, application_call, y, x): - """Computationally stable cross-entropy for pre-softmax values. - - Parameters - ---------- - y : :class:`~tensor.TensorVariable` - In the case of a matrix argument, each row represents a - probabilility distribution. In the vector case, each element - represents a distribution by specifying the position of 1 in a - 1-hot vector. - x : :class:`~tensor.TensorVariable` - A matrix, each row contains unnormalized probabilities of a - distribution. - - Returns - ------- - cost : :class:`~tensor.TensorVariable` - A vector of cross-entropies between respective distributions - from y and x. - - """ - x = self.log_probabilities(x) - application_call.add_auxiliary_variable( - x.copy(name='log_probabilities')) - if y.ndim == x.ndim - 1: - indices = tensor.arange(y.shape[0]) * x.shape[1] + y - cost = -x.flatten()[indices] - elif y.ndim == x.ndim: - cost = -(x * y).sum(axis=1) - else: - raise TypeError('rank mismatch between x and y') - return cost - - -class NDimensionalSoftmax(Softmax): - decorators = [WithExtraDims()] - - -class Sequence(Brick): - """A sequence of bricks. - - This brick applies a sequence of bricks, assuming that their in- and - outputs are compatible. - - Parameters - ---------- - application_methods : list - List of :class:`.BoundApplication` to apply - - """ - def __init__(self, application_methods, **kwargs): - super(Sequence, self).__init__(**kwargs) - self.application_methods = application_methods - - seen = set() - self.children = [app.brick for app in application_methods - if not (app.brick in seen or seen.add(app.brick))] - - @application - def apply(self, *args): - child_input = args - for application_method in self.application_methods: - output = application_method(*pack(child_input)) - child_input = output - return output - - @apply.property('inputs') - def apply_inputs(self): - return self.application_methods[0].inputs - - @apply.property('outputs') - def apply_outputs(self): - return self.application_methods[-1].outputs - - -class FeedforwardSequence(Sequence, Feedforward): - """A sequence where the first and last bricks are feedforward. - - Parameters - ---------- - application_methods : list - List of :class:`.BoundApplication` to apply. The first and last - application method should belong to a :class:`Feedforward` brick. - - """ - @property - def input_dim(self): - return self.children[0].input_dim - - @input_dim.setter - def input_dim(self, value): - self.children[0].input_dim = value - - @property - def output_dim(self): - return self.children[-1].output_dim - - @output_dim.setter - def output_dim(self, value): - self.children[-1].output_dim = value - - -class MLP(Sequence, Initializable, Feedforward): - """A simple multi-layer perceptron. - - Parameters - ---------- - activations : list of :class:`.Brick`, :class:`.BoundApplication`, - or ``None`` - A list of activations to apply after each linear transformation. - Give ``None`` to not apply any activation. It is assumed that the - application method to use is ``apply``. Required for - :meth:`__init__`. - dims : list of ints - A list of input dimensions, as well as the output dimension of the - last layer. Required for :meth:`~.Brick.allocate`. - - Notes - ----- - See :class:`Initializable` for initialization parameters. - - Note that the ``weights_init``, ``biases_init`` and ``use_bias`` - configurations will overwrite those of the layers each time the - :class:`MLP` is re-initialized. For more fine-grained control, push the - configuration to the child layers manually before initialization. - - >>> from blocks.initialization import IsotropicGaussian, Constant - >>> mlp = MLP(activations=[Tanh(), None], dims=[30, 20, 10], - ... weights_init=IsotropicGaussian(), - ... biases_init=Constant(1)) - >>> mlp.push_initialization_config() # Configure children - >>> mlp.children[0].weights_init = IsotropicGaussian(0.1) - >>> mlp.initialize() - - """ - @lazy(allocation=['dims']) - def __init__(self, activations, dims, **kwargs): - self.activations = activations - - self.linear_transformations = [Linear(name='linear_{}'.format(i)) - for i in range(len(activations))] - # Interleave the transformations and activations - application_methods = [] - for entity in interleave([self.linear_transformations, activations]): - if entity is None: - continue - if isinstance(entity, Brick): - application_methods.append(entity.apply) - else: - application_methods.append(entity) - if not dims: - dims = [None] * (len(activations) + 1) - self.dims = dims - super(MLP, self).__init__(application_methods, **kwargs) - - @property - def input_dim(self): - return self.dims[0] - - @input_dim.setter - def input_dim(self, value): - self.dims[0] = value - - @property - def output_dim(self): - return self.dims[-1] - - @output_dim.setter - def output_dim(self, value): - self.dims[-1] = value - - def _push_allocation_config(self): - if not len(self.dims) - 1 == len(self.linear_transformations): - raise ValueError - for input_dim, output_dim, layer in \ - equizip(self.dims[:-1], self.dims[1:], - self.linear_transformations): - layer.input_dim = input_dim - layer.output_dim = output_dim - layer.use_bias = self.use_bias +"""Bricks are parameterized Theano operations.""" +from .base import application, Brick, lazy +from .interfaces import Activation, Feedforward, Initializable, Random +from .simple import (Linear, Bias, Maxout, LinearMaxout, Identity, Tanh, + Logistic, Softplus, Rectifier, Softmax, + NDimensionalSoftmax) +from .sequences import Sequence, FeedforwardSequence, MLP +from .wrappers import WithExtraDims + +__all__ = ('application', 'Brick', 'lazy', 'BatchNormalization', + 'SpatialBatchNormalization', 'BatchNormalizedMLP', + 'Activation', 'Feedforward', 'Initializable', 'Random', + 'Linear', 'Bias', 'Maxout', 'LinearMaxout', 'Identity', + 'Tanh', 'Logistic', 'Softplus', 'Rectifier', 'Softmax', + 'NDimensionalSoftmax', 'Sequence', 'FeedforwardSequence', + 'MLP', 'WithExtraDims') diff --git a/blocks/bricks/interfaces.py b/blocks/bricks/interfaces.py new file mode 100644 index 00000000..aef73a43 --- /dev/null +++ b/blocks/bricks/interfaces.py @@ -0,0 +1,214 @@ +"""Bricks that are interfaces and/or mixins.""" +import numpy +from six import add_metaclass +from theano.sandbox.rng_mrg import MRG_RandomStreams + +from ..config import config +from .base import _Brick, Brick, lazy + + +class ActivationDocumentation(_Brick): + """Dynamically adds documentation to activations. + + Notes + ----- + See http://bugs.python.org/issue12773. + + """ + def __new__(cls, name, bases, classdict): + classdict['__doc__'] = \ + """Elementwise application of {0} function.""".format(name.lower()) + if 'apply' in classdict: + classdict['apply'].__doc__ = \ + """Apply the {0} function element-wise. + + Parameters + ---------- + input_ : :class:`~tensor.TensorVariable` + Theano variable to apply {0} to, element-wise. + + Returns + ------- + output : :class:`~tensor.TensorVariable` + The input with the activation function applied. + + """.format(name.lower()) + return super(ActivationDocumentation, cls).__new__(cls, name, bases, + classdict) + + +@add_metaclass(ActivationDocumentation) +class Activation(Brick): + """A base class for simple, element-wise activation functions. + + This base class ensures that activation functions are automatically + documented using the :class:`ActivationDocumentation` metaclass. + + """ + pass + + +class Feedforward(Brick): + """Declares an interface for bricks with one input and one output. + + Many bricks have just one input and just one output (activations, + :class:`Linear`, :class:`MLP`). To make such bricks interchangable + in most contexts they should share an interface for configuring + their input and output dimensions. This brick declares such an + interface. + + Attributes + ---------- + input_dim : int + The input dimension of the brick. + output_dim : int + The output dimension of the brick. + + """ + def __getattr__(self, name): + message = ("'{}' object does not have an attribute '{}'" + .format(self.__class__.__name__, name)) + if name in ('input_dim', 'output_dim'): + message += (" (which is a part of 'Feedforward' interface it" + " claims to support)") + raise AttributeError(message) + + +class RNGMixin(object): + """Mixin for initialization random number generators.""" + seed_rng = numpy.random.RandomState(config.default_seed) + + @property + def seed(self): + if getattr(self, '_seed', None) is not None: + return self._seed + else: + self._seed = self.seed_rng.randint( + numpy.iinfo(numpy.int32).max) + return self._seed + + @seed.setter + def seed(self, value): + if hasattr(self, '_seed'): + raise AttributeError("seed already set") + self._seed = value + + @property + def rng(self): + if getattr(self, '_rng', None) is not None: + return self._rng + else: + self._rng = numpy.random.RandomState(self.seed) + return self._rng + + @rng.setter + def rng(self, rng): + self._rng = rng + + +class Initializable(RNGMixin, Brick): + """Base class for bricks which push parameter initialization. + + Many bricks will initialize children which perform a linear + transformation, often with biases. This brick allows the weights + and biases initialization to be configured in the parent brick and + pushed down the hierarchy. + + Parameters + ---------- + weights_init : object + A `NdarrayInitialization` instance which will be used by to + initialize the weight matrix. Required by + :meth:`~.Brick.initialize`. + biases_init : :obj:`object`, optional + A `NdarrayInitialization` instance that will be used to initialize + the biases. Required by :meth:`~.Brick.initialize` when `use_bias` + is `True`. Only supported by bricks for which :attr:`has_biases` is + ``True``. + use_bias : :obj:`bool`, optional + Whether to use a bias. Defaults to `True`. Required by + :meth:`~.Brick.initialize`. Only supported by bricks for which + :attr:`has_biases` is ``True``. + rng : :class:`numpy.random.RandomState` + + Attributes + ---------- + has_biases : bool + ``False`` if the brick does not support biases, and only has + :attr:`weights_init`. For an example of this, see + :class:`.Bidirectional`. If this is ``False``, the brick does not + support the arguments ``biases_init`` or ``use_bias``. + + """ + has_biases = True + + @lazy() + def __init__(self, weights_init=None, biases_init=None, use_bias=True, + seed=None, **kwargs): + super(Initializable, self).__init__(**kwargs) + self.weights_init = weights_init + if self.has_biases: + self.biases_init = biases_init + elif biases_init is not None or not use_bias: + raise ValueError("This brick does not support biases config") + self.use_bias = use_bias + self.seed = seed + + def _push_initialization_config(self): + for child in self.children: + if isinstance(child, Initializable): + child.rng = self.rng + if self.weights_init: + child.weights_init = self.weights_init + if hasattr(self, 'biases_init') and self.biases_init: + for child in self.children: + if (isinstance(child, Initializable) and + hasattr(child, 'biases_init')): + child.biases_init = self.biases_init + + +class Random(Brick): + """A mixin class for Bricks which need Theano RNGs. + + Parameters + ---------- + theano_seed : int or list, optional + Seed to use for a + :class:`~theano.sandbox.rng_mrg.MRG_RandomStreams` object. + + """ + seed_rng = numpy.random.RandomState(config.default_seed) + + def __init__(self, theano_seed=None, **kwargs): + super(Random, self).__init__(**kwargs) + self.theano_seed = theano_seed + + @property + def theano_seed(self): + if getattr(self, '_theano_seed', None) is not None: + return self._theano_seed + else: + self._theano_seed = self.seed_rng.randint( + numpy.iinfo(numpy.int32).max) + return self._theano_seed + + @theano_seed.setter + def theano_seed(self, value): + if hasattr(self, '_theano_seed'): + raise AttributeError("seed already set") + self._theano_seed = value + + @property + def theano_rng(self): + """Returns Brick's Theano RNG, or a default one. + + The default seed can be set through ``blocks.config``. + + """ + if not hasattr(self, '_theano_rng'): + self._theano_rng = MRG_RandomStreams(self.theano_seed) + return self._theano_rng + + @theano_rng.setter + def theano_rng(self, theano_rng): + self._theano_rng = theano_rng diff --git a/blocks/bricks/sequences.py b/blocks/bricks/sequences.py new file mode 100644 index 00000000..9218c54b --- /dev/null +++ b/blocks/bricks/sequences.py @@ -0,0 +1,153 @@ +"""Bricks that compose together other bricks in linear sequences.""" +from toolz import interleave +from picklable_itertools.extras import equizip + +from ..utils import pack +from .base import Brick, application, lazy +from .interfaces import Feedforward, Initializable +from .simple import Linear + + +class Sequence(Brick): + """A sequence of bricks. + + This brick applies a sequence of bricks, assuming that their in- and + outputs are compatible. + + Parameters + ---------- + application_methods : list + List of :class:`.BoundApplication` to apply + + """ + def __init__(self, application_methods, **kwargs): + super(Sequence, self).__init__(**kwargs) + self.application_methods = application_methods + + seen = set() + self.children = [app.brick for app in application_methods + if not (app.brick in seen or seen.add(app.brick))] + + @application + def apply(self, *args): + child_input = args + for application_method in self.application_methods: + output = application_method(*pack(child_input)) + child_input = output + return output + + @apply.property('inputs') + def apply_inputs(self): + return self.application_methods[0].inputs + + @apply.property('outputs') + def apply_outputs(self): + return self.application_methods[-1].outputs + + +class FeedforwardSequence(Sequence, Feedforward): + """A sequence where the first and last bricks are feedforward. + + Parameters + ---------- + application_methods : list + List of :class:`.BoundApplication` to apply. The first and last + application method should belong to a :class:`Feedforward` brick. + + """ + @property + def input_dim(self): + return self.children[0].input_dim + + @input_dim.setter + def input_dim(self, value): + self.children[0].input_dim = value + + @property + def output_dim(self): + return self.children[-1].output_dim + + @output_dim.setter + def output_dim(self, value): + self.children[-1].output_dim = value + + +class MLP(Sequence, Initializable, Feedforward): + """A simple multi-layer perceptron. + + Parameters + ---------- + activations : list of :class:`.Brick`, :class:`.BoundApplication`, + or ``None`` + A list of activations to apply after each linear transformation. + Give ``None`` to not apply any activation. It is assumed that the + application method to use is ``apply``. Required for + :meth:`__init__`. + dims : list of ints + A list of input dimensions, as well as the output dimension of the + last layer. Required for :meth:`~.Brick.allocate`. + + Notes + ----- + See :class:`Initializable` for initialization parameters. + + Note that the ``weights_init``, ``biases_init`` and ``use_bias`` + configurations will overwrite those of the layers each time the + :class:`MLP` is re-initialized. For more fine-grained control, push the + configuration to the child layers manually before initialization. + + >>> from blocks.bricks import Tanh + >>> from blocks.initialization import IsotropicGaussian, Constant + >>> mlp = MLP(activations=[Tanh(), None], dims=[30, 20, 10], + ... weights_init=IsotropicGaussian(), + ... biases_init=Constant(1)) + >>> mlp.push_initialization_config() # Configure children + >>> mlp.children[0].weights_init = IsotropicGaussian(0.1) + >>> mlp.initialize() + + """ + @lazy(allocation=['dims']) + def __init__(self, activations, dims, **kwargs): + self.activations = activations + + self.linear_transformations = [Linear(name='linear_{}'.format(i)) + for i in range(len(activations))] + # Interleave the transformations and activations + application_methods = [] + for entity in interleave([self.linear_transformations, activations]): + if entity is None: + continue + if isinstance(entity, Brick): + application_methods.append(entity.apply) + else: + application_methods.append(entity) + if not dims: + dims = [None] * (len(activations) + 1) + self.dims = dims + super(MLP, self).__init__(application_methods, **kwargs) + + @property + def input_dim(self): + return self.dims[0] + + @input_dim.setter + def input_dim(self, value): + self.dims[0] = value + + @property + def output_dim(self): + return self.dims[-1] + + @output_dim.setter + def output_dim(self, value): + self.dims[-1] = value + + def _push_allocation_config(self): + if not len(self.dims) - 1 == len(self.linear_transformations): + raise ValueError + for input_dim, output_dim, layer in \ + equizip(self.dims[:-1], self.dims[1:], + self.linear_transformations): + layer.input_dim = input_dim + layer.output_dim = output_dim + layer.use_bias = self.use_bias diff --git a/blocks/bricks/simple.py b/blocks/bricks/simple.py new file mode 100644 index 00000000..ed9215da --- /dev/null +++ b/blocks/bricks/simple.py @@ -0,0 +1,395 @@ +"""Some of the simplest individual bricks.""" +import logging + +from theano import tensor + +from blocks.bricks.base import application, Brick, lazy +from blocks.bricks.interfaces import Activation, Feedforward, Initializable +from blocks.bricks.interfaces import Random # noqa + +from blocks.bricks.wrappers import WithExtraDims +from blocks.roles import add_role, WEIGHT, BIAS +from blocks.utils import shared_floatx_nans + +logger = logging.getLogger(__name__) + + +class Linear(Initializable, Feedforward): + r"""A linear transformation with optional bias. + + Brick which applies a linear (affine) transformation by multiplying + the input with a weight matrix. By default, a bias term is added + (see :class:`Initializable` for information on disabling this). + + Parameters + ---------- + input_dim : int + The dimension of the input. Required by :meth:`~.Brick.allocate`. + output_dim : int + The dimension of the output. Required by :meth:`~.Brick.allocate`. + + Notes + ----- + See :class:`Initializable` for initialization parameters. + + A linear transformation with bias is a matrix multiplication followed + by a vector summation. + + .. math:: f(\mathbf{x}) = \mathbf{W}\mathbf{x} + \mathbf{b} + + """ + @lazy(allocation=['input_dim', 'output_dim']) + def __init__(self, input_dim, output_dim, **kwargs): + super(Linear, self).__init__(**kwargs) + self.input_dim = input_dim + self.output_dim = output_dim + + @property + def W(self): + return self.parameters[0] + + @property + def b(self): + return self.parameters[1] + + def _allocate(self): + W = shared_floatx_nans((self.input_dim, self.output_dim), name='W') + add_role(W, WEIGHT) + self.parameters.append(W) + self.add_auxiliary_variable(W.norm(2), name='W_norm') + if self.use_bias: + b = shared_floatx_nans((self.output_dim,), name='b') + add_role(b, BIAS) + self.parameters.append(b) + self.add_auxiliary_variable(b.norm(2), name='b_norm') + + def _initialize(self): + if self.use_bias: + W, b = self.parameters + self.biases_init.initialize(b, self.rng) + else: + W, = self.parameters + self.weights_init.initialize(W, self.rng) + + @application(inputs=['input_'], outputs=['output']) + def apply(self, input_): + """Apply the linear transformation. + + Parameters + ---------- + input_ : :class:`~tensor.TensorVariable` + The input on which to apply the transformation + + Returns + ------- + output : :class:`~tensor.TensorVariable` + The transformed input plus optional bias + + """ + if self.use_bias: + W, b = self.parameters + else: + W, = self.parameters + output = tensor.dot(input_, W) + if self.use_bias: + output += b + return output + + def get_dim(self, name): + if name == 'input_': + return self.input_dim + if name == 'output': + return self.output_dim + super(Linear, self).get_dim(name) + + +class Bias(Feedforward, Initializable): + """Add a bias (i.e. sum with a vector).""" + @lazy(allocation=['dim']) + def __init__(self, dim, **kwargs): + super(Bias, self).__init__(**kwargs) + self.dim = dim + + def _allocate(self): + b = shared_floatx_nans((self.output_dim,), name='b') + add_role(b, BIAS) + self.parameters.append(b) + + def _initialize(self): + b, = self.parameters + self.biases_init.initialize(b, self.rng) + + @application(inputs=['input_'], outputs=['output']) + def apply(self, input_): + """Apply the linear transformation. + + Parameters + ---------- + input_ : :class:`~tensor.TensorVariable` + The input on which to apply the transformation + + Returns + ------- + output : :class:`~tensor.TensorVariable` + The transformed input plus optional bias + + """ + b, = self.parameters + return input_ + b + + def get_dim(self, name): + if name in ['input_', 'output']: + return self.dim + super(Bias, self).get_dim(name) + + def _get_dim(self): + return self.dim + + def _set_dim(self, value): + self.dim = value + + input_dim = output_dim = property(_get_dim, _set_dim) + + +class Maxout(Brick): + """Maxout pooling transformation. + + A brick that does max pooling over groups of input units. If you use + this code in a research project, please cite [GWFM13]_. + + .. [GWFM13] Ian J. Goodfellow, David Warde-Farley, Mehdi Mirza, Aaron + Courville, and Yoshua Bengio, *Maxout networks*, ICML (2013), pp. + 1319-1327. + + Parameters + ---------- + num_pieces : int + The size of the groups the maximum is taken over. + + Notes + ----- + Maxout applies a set of linear transformations to a vector and selects + for each output dimension the result with the highest value. + + """ + @lazy(allocation=['num_pieces']) + def __init__(self, num_pieces, **kwargs): + super(Maxout, self).__init__(**kwargs) + self.num_pieces = num_pieces + + @application(inputs=['input_'], outputs=['output']) + def apply(self, input_): + """Apply the maxout transformation. + + Parameters + ---------- + input_ : :class:`~tensor.TensorVariable` + The input on which to apply the transformation + + Returns + ------- + output : :class:`~tensor.TensorVariable` + The transformed input + + """ + last_dim = input_.shape[-1] + output_dim = last_dim // self.num_pieces + new_shape = ([input_.shape[i] for i in range(input_.ndim - 1)] + + [output_dim, self.num_pieces]) + output = tensor.max(input_.reshape(new_shape, ndim=input_.ndim + 1), + axis=input_.ndim) + return output + + +class LinearMaxout(Initializable, Feedforward): + """Maxout pooling following a linear transformation. + + This code combines the :class:`Linear` brick with a :class:`Maxout` + brick. + + Parameters + ---------- + input_dim : int + The dimension of the input. Required by :meth:`~.Brick.allocate`. + output_dim : int + The dimension of the output. Required by :meth:`~.Brick.allocate`. + num_pieces : int + The number of linear functions. Required by + :meth:`~.Brick.allocate`. + + Notes + ----- + See :class:`Initializable` for initialization parameters. + + """ + @lazy(allocation=['input_dim', 'output_dim', 'num_pieces']) + def __init__(self, input_dim, output_dim, num_pieces, **kwargs): + super(LinearMaxout, self).__init__(**kwargs) + self.linear = Linear() + self.maxout = Maxout() + self.children = [self.linear, + self.maxout] + + self.input_dim = input_dim + self.output_dim = output_dim + self.num_pieces = num_pieces + + @property + def input_dim(self): + return self.linear.input_dim + + @input_dim.setter + def input_dim(self, value): + self.linear.input_dim = value + + def _push_allocation_config(self): + self.linear.output_dim = self.output_dim * self.num_pieces + self.maxout.num_pieces = self.num_pieces + + @application(inputs=['input_'], outputs=['output']) + def apply(self, input_): + """Apply the linear transformation followed by maxout. + + Parameters + ---------- + input_ : :class:`~tensor.TensorVariable` + The input on which to apply the transformations + + Returns + ------- + output : :class:`~tensor.TensorVariable` + The transformed input + + """ + pre_activation = self.linear.apply(input_) + output = self.maxout.apply(pre_activation) + return output + + +class Identity(Activation): + @application(inputs=['input_'], outputs=['output']) + def apply(self, input_): + return input_ + + +class Tanh(Activation): + @application(inputs=['input_'], outputs=['output']) + def apply(self, input_): + return tensor.tanh(input_) + + +class Logistic(Activation): + @application(inputs=['input_'], outputs=['output']) + def apply(self, input_): + return tensor.nnet.sigmoid(input_) + + +class Softplus(Activation): + r""" Softplus brick. + + The softplus is defined as :math:`\zeta(x) = \log(1+e^x)`. + + .. Dugas, C., Bengio, Y., Belisle, F., Nadeau, C., and Garcia, + R. (2001). Incorporating second-order functional knowledge + for better option pricing. In NIPS 13 . MIT Press. + + """ + @application(inputs=['input_'], outputs=['output']) + def apply(self, input_): + return tensor.nnet.softplus(input_) + + +class Rectifier(Activation): + @application(inputs=['input_'], outputs=['output']) + def apply(self, input_): + return tensor.switch(input_ > 0, input_, 0) + + +class Softmax(Brick): + """A softmax brick. + + Works with 2-dimensional inputs only. If you need more, + see :class:`NDimensionalSoftmax`. + + """ + @application(inputs=['input_'], outputs=['output']) + def apply(self, input_): + """Standard softmax. + + Parameters + ---------- + input_ : :class:`~theano.Variable` + A matrix, each row contains unnormalized log-probabilities of a + distribution. + + Returns + ------- + output_ : :class:`~theano.Variable` + A matrix with probabilities in each row for each distribution + from `input_`. + + """ + return tensor.nnet.softmax(input_) + + @application(inputs=['input_'], outputs=['output']) + def log_probabilities(self, input_): + """Normalize log-probabilities. + + Converts unnormalized log-probabilities (exponents of which do not + sum to one) into actual log-probabilities (exponents of which sum + to one). + + Parameters + ---------- + input_ : :class:`~theano.Variable` + A matrix, each row contains unnormalized log-probabilities of a + distribution. + + Returns + ------- + output : :class:`~theano.Variable` + A matrix with normalized log-probabilities in each row for each + distribution from `input_`. + + """ + shifted = input_ - input_.max(axis=1, keepdims=True) + return shifted - tensor.log( + tensor.exp(shifted).sum(axis=1, keepdims=True)) + + @application(inputs=['y', 'x'], outputs=['output']) + def categorical_cross_entropy(self, application_call, y, x): + """Computationally stable cross-entropy for pre-softmax values. + + Parameters + ---------- + y : :class:`~tensor.TensorVariable` + In the case of a matrix argument, each row represents a + probabilility distribution. In the vector case, each element + represents a distribution by specifying the position of 1 in a + 1-hot vector. + x : :class:`~tensor.TensorVariable` + A matrix, each row contains unnormalized probabilities of a + distribution. + + Returns + ------- + cost : :class:`~tensor.TensorVariable` + A vector of cross-entropies between respective distributions + from y and x. + + """ + x = self.log_probabilities(x) + application_call.add_auxiliary_variable( + x.copy(name='log_probabilities')) + if y.ndim == x.ndim - 1: + indices = tensor.arange(y.shape[0]) * x.shape[1] + y + cost = -x.flatten()[indices] + elif y.ndim == x.ndim: + cost = -(x * y).sum(axis=1) + else: + raise TypeError('rank mismatch between x and y') + return cost + + +class NDimensionalSoftmax(Softmax): + decorators = [WithExtraDims()] diff --git a/blocks/filter.py b/blocks/filter.py index 1bd23075..8248ff34 100644 --- a/blocks/filter.py +++ b/blocks/filter.py @@ -84,7 +84,8 @@ class VariableFilter(object): Examples -------- - >>> from blocks.bricks import MLP, Linear, Logistic, Identity, BIAS + >>> from blocks.bricks import MLP, Linear, Logistic, Identity + >>> from blocks.roles import BIAS >>> mlp = MLP(activations=[Identity(), Logistic()], dims=[20, 10, 20]) >>> from theano import tensor >>> x = tensor.matrix() diff --git a/blocks/model.py b/blocks/model.py index af0aec36..2febc371 100644 --- a/blocks/model.py +++ b/blocks/model.py @@ -48,7 +48,7 @@ class Model(ComputationGraph): it: >>> model.get_top_bricks() #doctest: +ELLIPSIS - [>> with open('model.zip', 'rb') as f: ... mlp2 = load(f) >>> mlp2 # doctest: +ELLIPSIS - + """ with closing(zipfile.ZipFile(file_handler, 'w', zipfile.ZIP_DEFLATED, diff --git a/docs/tutorial.rst b/docs/tutorial.rst index ff0b6b74..7237bb44 100644 --- a/docs/tutorial.rst +++ b/docs/tutorial.rst @@ -104,7 +104,7 @@ the parameters by adding a :math:`L2`-regularization term (also known as To get the weights from our model, we will use Blocks' annotation features (read more about them in the :doc:`cg` tutorial). ->>> from blocks.bricks import WEIGHT +>>> from blocks.roles import WEIGHT >>> from blocks.graph import ComputationGraph >>> from blocks.filter import VariableFilter >>> cg = ComputationGraph(cost) From 6b52b35853ef5062d5d41896b8fbabac7f903c90 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Fri, 15 Jan 2016 18:03:53 -0500 Subject: [PATCH 043/129] Refactor batchnorm + graph module. This commit - Removes graph.py and splits it across an __init__.py and several other .py files under graph/ (beginning the process accomplished for bricks/ in the previous commit). - Splits the batch normalization implementation across bricks/ and graph/ in the expected fashion (graph transformation function under graph/, bricks under bricks/). - Makes numerous small improvements to the batch normalization implementation. --- blocks/bricks/__init__.py | 2 + blocks/bricks/bn.py | 108 +++------------------ blocks/{graph.py => graph/__init__.py} | 127 ++----------------------- blocks/graph/annotations.py | 116 ++++++++++++++++++++++ blocks/graph/bn.py | 95 ++++++++++++++++++ 5 files changed, 235 insertions(+), 213 deletions(-) rename blocks/{graph.py => graph/__init__.py} (80%) create mode 100644 blocks/graph/annotations.py create mode 100644 blocks/graph/bn.py diff --git a/blocks/bricks/__init__.py b/blocks/bricks/__init__.py index 2c197d02..4482f03d 100644 --- a/blocks/bricks/__init__.py +++ b/blocks/bricks/__init__.py @@ -1,5 +1,7 @@ """Bricks are parameterized Theano operations.""" from .base import application, Brick, lazy +from .bn import (BatchNormalization, SpatialBatchNormalization, + BatchNormalizedMLP) from .interfaces import Activation, Feedforward, Initializable, Random from .simple import (Linear, Bias, Maxout, LinearMaxout, Identity, Tanh, Logistic, Softplus, Rectifier, Softmax, diff --git a/blocks/bricks/bn.py b/blocks/bricks/bn.py index 1cb968a0..ccbabb47 100644 --- a/blocks/bricks/bn.py +++ b/blocks/bricks/bn.py @@ -1,23 +1,23 @@ import collections + import numpy -from theano import tensor -from theano.tensor.nnet import bn -from blocks.bricks import (RNGMixin, lazy, application, Sequence, - Feedforward, MLP) -from blocks.graph import add_annotation -from blocks.initialization import Constant -from blocks.filter import VariableFilter, get_application_call -from blocks.roles import (INPUT, WEIGHT, BIAS, BATCH_NORM_POPULATION_MEAN, - BATCH_NORM_POPULATION_STDEV, BATCH_NORM_OFFSET, - BATCH_NORM_DIVISOR, BATCH_NORM_MINIBATCH_ESTIMATE, - add_role) -from blocks.utils import (shared_floatx_zeros, shared_floatx, - shared_floatx_nans) from picklable_itertools.extras import equizip +from theano.tensor.nnet import bn + +from ..graph import add_annotation +from ..initialization import Constant +from ..roles import (WEIGHT, BIAS, BATCH_NORM_POPULATION_MEAN, + BATCH_NORM_POPULATION_STDEV, BATCH_NORM_OFFSET, + BATCH_NORM_DIVISOR, add_role) +from ..utils import (shared_floatx_zeros, shared_floatx, + shared_floatx_nans) +from .base import lazy, application +from .sequences import Sequence, Feedforward, MLP +from .interfaces import RNGMixin class BatchNormalization(RNGMixin, Feedforward): - """Normalizes activations, parameterizes a scale and shift. + r"""Normalizes activations, parameterizes a scale and shift. Parameters ---------- @@ -254,83 +254,3 @@ def _push_allocation_config(self): # which is the input dimension. for act, dim in equizip(self.activations, self.dims[1:]): act.children[0].input_dim = dim - - -def batch_normalize(computation_graph, epsilon=1e-4): - """Activate batch normalization in a graph. - - Parameters - ---------- - computation_graph : instance of :class:`ComputationGraph` - The computation graph containing :class:`BatchNormalization` - brick applications. - epsilon : float, optional - The stabilizing constant for the minibatch standard deviation - computation. Added to the variance inside the square root, as - in the batch normalization paper. - - Returns - ------- - batch_normed_computation_graph : instance of :class:`ComputationGraph` - The computation graph, with :class:`BatchNormalization` - applications transformed to use minibatch statistics instead - of accumulated population statistics. - - Notes - ----- - Assumes the minibatch axis is 0. Other axes are unsupported at - this time. - - """ - - # Create filters for variables involved in a batch normalization brick - # application. - def make_variable_filter(role): - return VariableFilter(bricks=[BatchNormalization], roles=[role]) - - mean_filter, stdev_filter, input_filter = map(make_variable_filter, - [BATCH_NORM_OFFSET, - BATCH_NORM_DIVISOR, INPUT]) - - # Group means, standard deviations, and inputs into dicts indexed by - # application call. - def get_application_call_dict(variable_filter): - return collections.OrderedDict((get_application_call(v), v) for v in - variable_filter(computation_graph)) - - means, stdevs, inputs = map(get_application_call_dict, - [mean_filter, stdev_filter, input_filter]) - - assert (set(means.keys()) == set(stdevs.keys()) and - set(means.keys()) == set(inputs.keys())) - assert set(means.values()).isdisjoint(stdevs.values()) - - replacements = [] - # Perform replacement for each application call. - for application_call in means: - axes = tuple(i for i, b in enumerate(means[application_call] - .broadcastable) if b) - minibatch_mean = inputs[application_call].mean(axis=axes, - keepdims=True) - minibatch_mean.name = 'minibatch_offset' - # Stabilize in the same way as the batch normalization manuscript. - minibatch_std = tensor.sqrt(tensor.var(inputs[application_call], - axis=axes, keepdims=True) - + epsilon) - minibatch_std.name = 'minibatch_divisor' - - def prepare_replacement(old, new, role, application_call): - """Add roles and tags to replaced variables.""" - add_role(new, BATCH_NORM_MINIBATCH_ESTIMATE) - add_role(new, role) - add_annotation(new, application_call) - add_annotation(new, application_call.application.brick) - new.tag.replacement_of = old - replacements.append((old, new)) - - prepare_replacement(means[application_call], minibatch_mean, - BATCH_NORM_OFFSET, application_call) - prepare_replacement(stdevs[application_call], minibatch_std, - BATCH_NORM_DIVISOR, application_call) - - return computation_graph.replace(replacements) diff --git a/blocks/graph.py b/blocks/graph/__init__.py similarity index 80% rename from blocks/graph.py rename to blocks/graph/__init__.py index f0337c38..02929cc6 100644 --- a/blocks/graph.py +++ b/blocks/graph/__init__.py @@ -2,6 +2,7 @@ import logging from collections import OrderedDict from itertools import chain +import warnings import numpy import theano @@ -12,12 +13,13 @@ from theano.scan_module.scan_op import Scan from toolz import unique -from blocks.config import config -from blocks.roles import (add_role, has_roles, AUXILIARY, PARAMETER, DROPOUT, - COLLECTED, COLLECTOR) -from blocks.utils import (is_graph_input, is_shared_variable, dict_union, - shared_floatx_zeros, shared_like) -import warnings +from ..config import config +from ..roles import (add_role, has_roles, AUXILIARY, PARAMETER, DROPOUT, + COLLECTED, COLLECTOR) +from ..utils import (is_graph_input, is_shared_variable, dict_union, + shared_floatx_zeros, shared_like) +from .annotations import add_annotation, Annotation # noqa +from .bn import batch_normalize # noqa logger = logging.getLogger(__name__) @@ -306,119 +308,6 @@ def has_inputs(self, variable): return self._has_inputs[variable] -def add_annotation(var, annotation): - annotations = getattr(var.tag, 'annotations', []) - if any(old_annotation.__class__ == annotation.__class__ - for old_annotation in annotations): - raise ValueError - else: - var.tag.annotations = annotations + [annotation] - - -class Annotation(object): - """Annotations on Theano variables in a graph. - - In Blocks annotations are automatically attached to variables created - using bricks. One form of annotation is that many variables are - assigned a role (see :class:`.VariableRole`). A second form of - annotation comes in the form of attaching a :class:`Annotation` - instance to the variable's ``tag`` attribute, with auxiliary variables - and/or updates. - - For example, we might be interested in the mean activation of certain - application of a :class:`.Linear` brick. The variable representing the - mean activation is attached as an auxiliary variable to the annotations - of the input and output variables of this brick. Using the - :class:`ComputationGraph` class (the - :attr:`~ComputationGraph.variables`, - :attr:`~ComputationGraph.auxiliary_variables`, etc. attributes in - particular) we can retrieve these Theano variables to pass on to the - monitor, use as a regularizer, etc. - - In most cases, annotations are added on a brick level (e.g. each brick - will assign the weight norm of its weights as an auxiliary value) or on - an application level (e.g. each time a brick is applied, its mean - activation will become an auxiliary variable). However, you can also - add annotations manually, by setting the ``annotation`` value of a - variable's ``tag`` field. - - Examples - -------- - >>> from theano import tensor - >>> x = tensor.vector() - >>> annotation = Annotation() - >>> annotation.add_auxiliary_variable(x + 1, name='x_plus_1') - >>> add_annotation(x, annotation) - >>> y = x ** 2 - >>> from blocks.graph import ComputationGraph - >>> cg = ComputationGraph([y]) - >>> cg.auxiliary_variables - [x_plus_1] - - """ - def __init__(self): - self.auxiliary_variables = [] - self.updates = OrderedDict() - - def add_auxiliary_variable(self, variable, roles=None, name=None): - """Attach an auxiliary variable to the graph. - - Auxiliary variables are Theano variables that are not part of a - brick's output, but can be useful nonetheless e.g. as a regularizer - or to monitor during training progress. - - Parameters - ---------- - variable : :class:`~tensor.TensorVariable` - The variable you want to add. - roles : list of :class:`.VariableRole` instances, optional - The roles of this variable. The :const:`.AUXILIARY` - role will automatically be added. Other options are - :const:`.COST`, :const:`.WEIGHT`, etc. - name : str, optional - Name to give to the variable. If the variable already has a - name it will be overwritten. - - Examples - -------- - >>> from blocks.bricks.base import application, Brick - >>> from blocks.roles import COST - >>> from blocks.utils import shared_floatx_nans - >>> class Foo(Brick): - ... def _allocate(self): - ... W = shared_floatx_nans((10, 10)) - ... self.add_auxiliary_variable(W.mean(), name='mean_W') - ... @application - ... def apply(self, x, application_call): - ... application_call.add_auxiliary_variable( - ... x - 1, name='x_minus_1') - ... application_call.add_auxiliary_variable( - ... x.mean(), roles=[COST], name='mean_x') - ... return x + 1 - >>> from theano import tensor - >>> x = tensor.vector() - >>> y = Foo().apply(x) - >>> from blocks.filter import VariableFilter - >>> cg = ComputationGraph([y]) - >>> var_filter = VariableFilter(roles=[AUXILIARY]) - >>> var_filter(cg.variables) # doctest: +SKIP - {x_minus_1, mean_W, mean_x} - >>> var_filter = VariableFilter(roles=[COST]) - >>> var_filter(cg.variables) # doctest: +SKIP - {mean_x} - - """ - add_annotation(variable, self) - if name is not None: - variable.name = name - variable.tag.name = name - add_role(variable, AUXILIARY) - if roles is not None: - for role in roles: - add_role(variable, role) - self.auxiliary_variables.append(variable) - - def apply_noise(computation_graph, variables, level, seed=None): """Add Gaussian noise to certain variable of a computation graph. diff --git a/blocks/graph/annotations.py b/blocks/graph/annotations.py new file mode 100644 index 00000000..b684c018 --- /dev/null +++ b/blocks/graph/annotations.py @@ -0,0 +1,116 @@ +from collections import OrderedDict +from ..roles import add_role, AUXILIARY + + +def add_annotation(var, annotation): + annotations = getattr(var.tag, 'annotations', []) + if any(old_annotation.__class__ == annotation.__class__ + for old_annotation in annotations): + raise ValueError + else: + var.tag.annotations = annotations + [annotation] + + +class Annotation(object): + """Annotations on Theano variables in a graph. + + In Blocks annotations are automatically attached to variables created + using bricks. One form of annotation is that many variables are + assigned a role (see :class:`.VariableRole`). A second form of + annotation comes in the form of attaching a :class:`Annotation` + instance to the variable's ``tag`` attribute, with auxiliary variables + and/or updates. + + For example, we might be interested in the mean activation of certain + application of a :class:`.Linear` brick. The variable representing the + mean activation is attached as an auxiliary variable to the annotations + of the input and output variables of this brick. Using the + :class:`ComputationGraph` class (the + :attr:`~ComputationGraph.variables`, + :attr:`~ComputationGraph.auxiliary_variables`, etc. attributes in + particular) we can retrieve these Theano variables to pass on to the + monitor, use as a regularizer, etc. + + In most cases, annotations are added on a brick level (e.g. each brick + will assign the weight norm of its weights as an auxiliary value) or on + an application level (e.g. each time a brick is applied, its mean + activation will become an auxiliary variable). However, you can also + add annotations manually, by setting the ``annotation`` value of a + variable's ``tag`` field. + + Examples + -------- + >>> from theano import tensor + >>> x = tensor.vector() + >>> annotation = Annotation() + >>> annotation.add_auxiliary_variable(x + 1, name='x_plus_1') + >>> add_annotation(x, annotation) + >>> y = x ** 2 + >>> from blocks.graph import ComputationGraph + >>> cg = ComputationGraph([y]) + >>> cg.auxiliary_variables + [x_plus_1] + + """ + def __init__(self): + self.auxiliary_variables = [] + self.updates = OrderedDict() + + def add_auxiliary_variable(self, variable, roles=None, name=None): + """Attach an auxiliary variable to the graph. + + Auxiliary variables are Theano variables that are not part of a + brick's output, but can be useful nonetheless e.g. as a regularizer + or to monitor during training progress. + + Parameters + ---------- + variable : :class:`~tensor.TensorVariable` + The variable you want to add. + roles : list of :class:`.VariableRole` instances, optional + The roles of this variable. The :const:`.AUXILIARY` + role will automatically be added. Other options are + :const:`.COST`, :const:`.WEIGHT`, etc. + name : str, optional + Name to give to the variable. If the variable already has a + name it will be overwritten. + + Examples + -------- + >>> from blocks.bricks.base import application, Brick + >>> from blocks.roles import COST + >>> from blocks.utils import shared_floatx_nans + >>> class Foo(Brick): + ... def _allocate(self): + ... W = shared_floatx_nans((10, 10)) + ... self.add_auxiliary_variable(W.mean(), name='mean_W') + ... @application + ... def apply(self, x, application_call): + ... application_call.add_auxiliary_variable( + ... x - 1, name='x_minus_1') + ... application_call.add_auxiliary_variable( + ... x.mean(), roles=[COST], name='mean_x') + ... return x + 1 + >>> from theano import tensor + >>> x = tensor.vector() + >>> y = Foo().apply(x) + >>> from blocks.graph import ComputationGraph + >>> cg = ComputationGraph([y]) + >>> from blocks.filter import VariableFilter + >>> var_filter = VariableFilter(roles=[AUXILIARY]) + >>> var_filter(cg.variables) # doctest: +SKIP + {x_minus_1, mean_W, mean_x} + >>> var_filter = VariableFilter(roles=[COST]) + >>> var_filter(cg.variables) # doctest: +SKIP + {mean_x} + + """ + add_annotation(variable, self) + if name is not None: + variable.name = name + variable.tag.name = name + add_role(variable, AUXILIARY) + if roles is not None: + for role in roles: + add_role(variable, role) + self.auxiliary_variables.append(variable) diff --git a/blocks/graph/bn.py b/blocks/graph/bn.py new file mode 100644 index 00000000..39dc093a --- /dev/null +++ b/blocks/graph/bn.py @@ -0,0 +1,95 @@ +"""Implements the batch normalization training graph transform. + +Specifically, this module contains the implementation for the +transformation of a batch-normalized inference graph into training graph, +which uses minibatch statistics in place of population statistics. + +""" +import collections +from theano import tensor + +from . import add_annotation +from ..roles import (BATCH_NORM_OFFSET, BATCH_NORM_DIVISOR, + BATCH_NORM_MINIBATCH_ESTIMATE, INPUT, add_role) + + +def batch_normalize(computation_graph, epsilon=1e-4): + """Activate batch normalization in a graph. + + Parameters + ---------- + computation_graph : instance of :class:`ComputationGraph` + The computation graph containing :class:`BatchNormalization` + brick applications. + epsilon : float, optional + The stabilizing constant for the minibatch standard deviation + computation. Added to the variance inside the square root, as + in the batch normalization paper. + + Returns + ------- + batch_normed_computation_graph : instance of :class:`ComputationGraph` + The computation graph, with :class:`BatchNormalization` + applications transformed to use minibatch statistics instead + of accumulated population statistics. + + Notes + ----- + Assumes the minibatch axis is 0. Other axes are unsupported at + this time. + + """ + # Avoid a circular import. + from ..filter import VariableFilter, get_application_call + + # Create filters for variables involved in a batch normalization brick + # application. + def make_variable_filter(role): + return VariableFilter(roles=[role]) + + mean_filter, stdev_filter, input_filter = map(make_variable_filter, + [BATCH_NORM_OFFSET, + BATCH_NORM_DIVISOR, INPUT]) + + # Group means, standard deviations, and inputs into dicts indexed by + # application call. + def get_application_call_dict(variable_filter): + return collections.OrderedDict((get_application_call(v), v) for v in + variable_filter(computation_graph)) + + means, stdevs, inputs = map(get_application_call_dict, + [mean_filter, stdev_filter, input_filter]) + + assert (set(means.keys()) == set(stdevs.keys()) and + set(means.keys()) == set(inputs.keys())) + assert set(means.values()).isdisjoint(stdevs.values()) + + replacements = [] + # Perform replacement for each application call. + for application_call in means: + axes = tuple(i for i, b in enumerate(means[application_call] + .broadcastable) if b) + minibatch_mean = inputs[application_call].mean(axis=axes, + keepdims=True) + minibatch_mean.name = 'minibatch_offset' + # Stabilize in the same way as the batch normalization manuscript. + minibatch_std = tensor.sqrt(tensor.var(inputs[application_call], + axis=axes, keepdims=True) + + epsilon) + minibatch_std.name = 'minibatch_divisor' + + def prepare_replacement(old, new, role, application_call): + """Add roles and tags to replaced variables.""" + add_role(new, BATCH_NORM_MINIBATCH_ESTIMATE) + add_role(new, role) + add_annotation(new, application_call) + add_annotation(new, application_call.application.brick) + new.tag.replacement_of = old + replacements.append((old, new)) + + prepare_replacement(means[application_call], minibatch_mean, + BATCH_NORM_OFFSET, application_call) + prepare_replacement(stdevs[application_call], minibatch_std, + BATCH_NORM_DIVISOR, application_call) + + return computation_graph.replace(replacements) From 9ff63b0d09da2b2b595412b2149e88acdc758588 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Fri, 15 Jan 2016 20:02:11 -0500 Subject: [PATCH 044/129] Add tests. --- tests/bricks/test_bn.py | 277 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 tests/bricks/test_bn.py diff --git a/tests/bricks/test_bn.py b/tests/bricks/test_bn.py new file mode 100644 index 00000000..6ead9b44 --- /dev/null +++ b/tests/bricks/test_bn.py @@ -0,0 +1,277 @@ +import collections +import theano +from theano import tensor +import numpy +from numpy.testing import assert_raises, assert_allclose, assert_equal +from blocks.bricks import Tanh, Sequence +from blocks.bricks import (BatchNormalization, SpatialBatchNormalization, + BatchNormalizedMLP) +from blocks.bricks.conv import (Convolutional, ConvolutionalSequence, + MaxPooling, AveragePooling) +from blocks.initialization import Constant +from blocks.graph import ComputationGraph, batch_normalize + + +def random_unif(rng, dim, low=1, high=10): + return (rng.uniform(low, high, size=dim) + .astype(theano.config.floatX)) + + +def test_batch_normalization_allocation_initialization(): + """Sanity check allocation & initialization of BN bricks.""" + def check(input_dim, expected_shape, broadcastable=None, save_memory=True): + bn = BatchNormalization(input_dim=input_dim, + broadcastable=broadcastable, + save_memory=save_memory) + if broadcastable is None: + if not isinstance(input_dim, collections.Sequence): + b_input_dim = (input_dim,) + else: + b_input_dim = input_dim + input_broadcastable = tuple(False for _ in range(len(b_input_dim))) + else: + input_broadcastable = broadcastable + bn.allocate() + assert save_memory == bn.save_memory + assert input_dim == bn.input_dim + assert bn.broadcastable == broadcastable + real_broadcastable = (True,) + input_broadcastable + assert bn.W.broadcastable == real_broadcastable + assert bn.b.broadcastable == real_broadcastable + assert bn.population_mean.broadcastable == real_broadcastable + assert bn.population_stdev.broadcastable == real_broadcastable + assert_allclose(bn.population_mean.get_value(borrow=True), 0.) + assert_allclose(bn.population_stdev.get_value(borrow=True), 1.) + assert_equal(bn.W.get_value(borrow=True).shape, expected_shape) + assert_equal(bn.b.get_value(borrow=True).shape, expected_shape) + assert_equal(bn.population_mean.get_value(borrow=True).shape, + expected_shape) + assert_equal(bn.population_stdev.get_value(borrow=True).shape, + expected_shape) + assert numpy.isnan(bn.b.get_value(borrow=True)).all() + assert numpy.isnan(bn.W.get_value(borrow=True)).all() + bn.initialize() + assert_allclose(bn.b.get_value(borrow=True), 0.) + assert_allclose(bn.W.get_value(borrow=True), 1.) + + yield check, 5, (1, 5) + yield check, (6, 7, 9), (1, 6, 7, 9), (False, False, False) + yield check, (7, 4, 3), (1, 1, 4, 3), (True, False, False) + yield check, (9, 3, 6), (1, 9, 1, 1), (False, True, True) + yield check, (7, 4, 5), (1, 7, 1, 5), (False, True, False), False + + +def apply_setup(input_dim, broadcastable, save_memory): + bn = BatchNormalization(input_dim, broadcastable, save_memory) + bn.initialize() + b_len = (len(input_dim) if isinstance(input_dim, collections.Sequence) + else 1) + x = tensor.TensorType(theano.config.floatX, + [False] * (b_len + 1))() + y = bn.apply(x) + return bn, x, y + + +def test_batch_normalization_inference_apply(): + def check(input_dim, variable_dim, broadcastable=None, save_memory=True): + bn, x, y = apply_setup(input_dim, broadcastable, save_memory) + rng = numpy.random.RandomState((2015, 12, 16)) + input_ = random_unif(rng, + (9,) + + (input_dim + if isinstance(input_dim, collections.Sequence) + else (input_dim,))) + + # Upon initialization, should be just the identity function. + assert_allclose(y.eval({x: input_}), input_, rtol=1e-4) + + # Test population mean gets subtracted. + pop_mean = random_unif(rng, variable_dim) + bn.population_mean.set_value(pop_mean) + assert_allclose(y.eval({x: input_}), input_ - pop_mean, rtol=1e-4) + + # Test population stdev is divided out. + pop_stdev = random_unif(rng, variable_dim) + bn.population_stdev.set_value(pop_stdev) + assert_allclose(y.eval({x: input_}), (input_ - pop_mean) / pop_stdev, + rtol=1e-4) + + # Test learned scale is applied. + gamma = random_unif(rng, variable_dim) + bn.W.set_value(gamma) + assert_allclose(y.eval({x: input_}), + (input_ - pop_mean) * (gamma / pop_stdev), + rtol=1e-4) + + # Test learned offset is applied. + beta = random_unif(rng, variable_dim) + bn.b.set_value(beta) + assert_allclose(y.eval({x: input_}), + (input_ - pop_mean) * (gamma / pop_stdev) + beta, + rtol=1e-4) + + yield check, 9, (1, 9) + yield check, (5, 4), (1, 5, 4), None, False + yield check, (2, 9, 7), (1, 2, 1, 1), (False, True, True) + + +def test_batch_normalization_train_apply(): + def check(input_dim, variable_dim, broadcastable=None, save_memory=True): + epsilon = numpy.cast[theano.config.floatX](1e-4) + bn, x, y = apply_setup(input_dim, broadcastable, save_memory) + cg = ComputationGraph([y]) + new_cg = batch_normalize(cg, epsilon=epsilon) + y_hat = new_cg.outputs[0] + + rng = numpy.random.RandomState((2015, 12, 16)) + input_ = random_unif(rng, (9,) + + (input_dim + if isinstance(input_dim, collections.Sequence) + else (input_dim,))) + axes = tuple(i for i, b in + enumerate(bn.population_mean.broadcastable) if b) + + # NumPy implementation of the batch-normalization transform. + def normalize(x): + return ((x - x.mean(axis=axes, keepdims=True, + dtype=theano.config.floatX)) / + numpy.sqrt(numpy.var(x, axis=axes, keepdims=True, + dtype=theano.config.floatX) + + epsilon)) + + # Check that batch norm is doing what it should be. + assert_allclose(y_hat.eval({x: input_}), normalize(input_), + atol=(1e-3 if theano.config.floatX == 'float32' + else 1e-7)) + + # Check that the scale parameters are still getting applied. + gamma = random_unif(rng, variable_dim) + bn.W.set_value(gamma) + assert_allclose(y_hat.eval({x: input_}), normalize(input_) * gamma, + atol=(1e-3 if theano.config.floatX == 'float32' + else 1e-7)) + + beta = random_unif(rng, variable_dim) + bn.b.set_value(beta) + # Check that the shift parameters are still getting applied. + assert_allclose(y_hat.eval({x: input_}), + normalize(input_) * gamma + beta, + atol=(1e-3 if theano.config.floatX == 'float32' + else 1e-7)) + + # Double check that setting the population parameters doesn't + # affect anything. + bn.population_mean.set_value(numpy.nan * + bn.population_mean.get_value()) + bn.population_stdev.set_value(numpy.nan * + bn.population_mean.get_value()) + assert_allclose(y_hat.eval({x: input_}), + normalize(input_) * gamma + beta, + atol=(1e-3 if theano.config.floatX == 'float32' + else 1e-7)) + + yield check, 9, (1, 9) + yield check, (5, 4), (1, 5, 4), None, False + yield check, (2, 9, 7), (1, 2, 1, 1), (False, True, True) + + +def test_batch_normalization_image_size_setter(): + bn = BatchNormalization() + bn.image_size = (5, 4) + assert bn.input_dim == (None, 5, 4) + bn.image_size = (4, 5) + assert bn.input_dim == (None, 4, 5) + + +def test_spatial_batch_normalization(): + def check(*input_dim): + sbn = SpatialBatchNormalization(input_dim) + sbn.initialize() + x = theano.tensor.TensorType(theano.config.floatX, + [False] * (len(input_dim) + 1))() + y = sbn.apply(x) + rng = numpy.random.RandomState((2015, 12, 17)) + input_ = random_unif(rng, (11,) + input_dim) + assert_equal(y.eval({x: input_}), input_) + + # Work around a stupid bug in nose2 by passing as *args. + yield check, 2, 3, 5 + yield check, 5, 3, 2, 3 + yield check, 1, 11 + + +def test_raise_exception_spatial(): + # Work around a stupid bug in nose2 that unpacks the tuple into + # separate arguments. + yield assert_raises, (ValueError, SpatialBatchNormalization, (5,)) + yield assert_raises, (ValueError, SpatialBatchNormalization, 3) + + def do_not_fail(*input_dim): + try: + SpatialBatchNormalization(input_dim) + except ValueError: + assert False + + # Work around a stupid bug in nose2 by passing as *args. + yield do_not_fail, 5, 4, 3 + yield do_not_fail, 7, 6 + yield do_not_fail, 3, 9, 2, 3 + + +def test_batch_normalization_inside_convolutional_sequence(): + conv_seq = ConvolutionalSequence( + [Convolutional(filter_size=(3, 3), num_filters=4), + BatchNormalization(broadcastable=(False, True, True)), + AveragePooling(pooling_size=(2, 2)), + BatchNormalization(broadcastable=(False, False, False)), + MaxPooling(pooling_size=(2, 2), step=(1, 1))], + weights_init=Constant(1.), + biases_init=Constant(2.), + image_size=(10, 8), num_channels=9) + + conv_seq_no_bn = ConvolutionalSequence( + [Convolutional(filter_size=(3, 3), num_filters=4), + AveragePooling(pooling_size=(2, 2)), + MaxPooling(pooling_size=(2, 2), step=(1, 1))], + weights_init=Constant(1.), + biases_init=Constant(2.), + image_size=(10, 8), num_channels=9) + + conv_seq.initialize() + conv_seq_no_bn.initialize() + rng = numpy.random.RandomState((2015, 12, 17)) + input_ = random_unif(rng, (2, 9, 10, 8)) + + x = theano.tensor.tensor4() + ybn = conv_seq.apply(x) + y = conv_seq_no_bn.apply(x) + yield (assert_equal, ybn.eval({x: input_}), y.eval({x: input_})) + + std = conv_seq.children[-2].population_stdev + std.set_value(3 * std.get_value(borrow=True)) + yield (assert_equal, ybn.eval({x: input_}), y.eval({x: input_}) / 3.) + + +def test_batch_normalized_mlp_construction(): + mlp = BatchNormalizedMLP([Tanh(), Tanh()], [5, 7, 9]) + assert all(isinstance(a, Sequence) for a in mlp.activations) + assert all(isinstance(a.children[0], BatchNormalization) + for a in mlp.activations) + assert all(isinstance(a.children[1], Tanh) + for a in mlp.activations) + + +def test_batch_normalized_mlp_allocation(): + mlp = BatchNormalizedMLP([Tanh(), Tanh()], [5, 7, 9]) + mlp.allocate() + assert mlp.activations[0].children[0].input_dim == 7 + assert mlp.activations[1].children[0].input_dim == 9 + assert not any(l.use_bias for l in mlp.linear_transformations) + + +def test_batch_normalized_mlp_initialization(): + mlp = BatchNormalizedMLP([Tanh(), Tanh()], [5, 7, 9]) + mlp.allocate() + assert mlp.activations[0].children[0].input_dim == 7 + assert mlp.activations[1].children[0].input_dim == 9 + assert not any(l.use_bias for l in mlp.linear_transformations) From 7ede89b53c4279db6e1447a6147ffb067793636f Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Sat, 16 Jan 2016 21:01:16 -0500 Subject: [PATCH 045/129] Make batch_normalize return the pop->minibatch map. It's either this or have a dedicated function for inspecting the graph, and I don't think that makes a lot of sense, since any time you use batch_normalize, you'll want to use this too. --- blocks/graph/bn.py | 18 ++++++++++++++++-- tests/bricks/test_bn.py | 2 +- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/blocks/graph/bn.py b/blocks/graph/bn.py index 39dc093a..42112cc2 100644 --- a/blocks/graph/bn.py +++ b/blocks/graph/bn.py @@ -10,7 +10,9 @@ from . import add_annotation from ..roles import (BATCH_NORM_OFFSET, BATCH_NORM_DIVISOR, - BATCH_NORM_MINIBATCH_ESTIMATE, INPUT, add_role) + BATCH_NORM_POPULATION_STATISTICS, + BATCH_NORM_MINIBATCH_ESTIMATE, INPUT, add_role, + has_roles) def batch_normalize(computation_graph, epsilon=1e-4): @@ -32,6 +34,11 @@ def batch_normalize(computation_graph, epsilon=1e-4): The computation graph, with :class:`BatchNormalization` applications transformed to use minibatch statistics instead of accumulated population statistics. + population_to_minibatch : OrderedDict + A mapping of variables used in the original graph for population + means and standard deviations to the minibatch-derived quantities + that replace them. Useful to define updates in order to track + the approximate population statistics during learning. Notes ----- @@ -92,4 +99,11 @@ def prepare_replacement(old, new, role, application_call): prepare_replacement(stdevs[application_call], minibatch_std, BATCH_NORM_DIVISOR, application_call) - return computation_graph.replace(replacements) + new_graph = computation_graph.replace(replacements) + + population_to_minibatch = collections.OrderedDict() + for original_graph_node, replacement in replacements: + pop_stats = original_graph_node.owner.inputs[0] + assert has_roles(pop_stats, [BATCH_NORM_POPULATION_STATISTICS]) + population_to_minibatch[pop_stats] = replacement + return new_graph, population_to_minibatch diff --git a/tests/bricks/test_bn.py b/tests/bricks/test_bn.py index 6ead9b44..8e6e8052 100644 --- a/tests/bricks/test_bn.py +++ b/tests/bricks/test_bn.py @@ -120,7 +120,7 @@ def check(input_dim, variable_dim, broadcastable=None, save_memory=True): epsilon = numpy.cast[theano.config.floatX](1e-4) bn, x, y = apply_setup(input_dim, broadcastable, save_memory) cg = ComputationGraph([y]) - new_cg = batch_normalize(cg, epsilon=epsilon) + new_cg, _ = batch_normalize(cg, epsilon=epsilon) y_hat = new_cg.outputs[0] rng = numpy.random.RandomState((2015, 12, 16)) From f26c1e565660c566b7b9aef7680443467cdc86f4 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Mon, 18 Jan 2016 00:12:11 -0500 Subject: [PATCH 046/129] Expose save_memory in BatchNormalizedMLP. --- blocks/bricks/bn.py | 27 +++++++++++++++++++++++---- tests/bricks/test_bn.py | 9 +++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/blocks/bricks/bn.py b/blocks/bricks/bn.py index ccbabb47..23cc5759 100644 --- a/blocks/bricks/bn.py +++ b/blocks/bricks/bn.py @@ -221,9 +221,14 @@ def __init__(self, input_dim, **kwargs): class BatchNormalizedMLP(MLP): """Convenient subclass for building an MLP with batch normalization. + Parameters + ---------- + save_memory : bool, optional + See :class:`BatchNormalization`. + Notes ----- - All parameters are the same as :class:`~blocks.bricks.MLP`. Each + All other parameters are the same as :class:`~blocks.bricks.MLP`. Each activation brick is wrapped in a :class:`~blocks.bricks.Sequence` containing an appropriate :class:`BatchNormalization` brick and the activation that follows it. @@ -237,15 +242,29 @@ class BatchNormalizedMLP(MLP): """ @lazy(allocation=['dims']) def __init__(self, activations, dims, *args, **kwargs): - activations = [Sequence([BatchNormalization().apply, act.apply], - name='batch_norm_activation_{}'.format(i)) - for i, act in enumerate(activations)] + save_memory = kwargs.pop('save_memory', True) + activations = [ + Sequence([BatchNormalization(save_memory=save_memory).apply, + act.apply], name='batch_norm_activation_{}'.format(i)) + for i, act in enumerate(activations) + ] # Batch normalization bricks incorporate a bias, so there's no # need for our Linear bricks to have them. kwargs.setdefault('use_bias', False) super(BatchNormalizedMLP, self).__init__(activations, dims, *args, **kwargs) + @property + def save_memory(self): + return self._save_memory + + @save_memory.setter + def save_memory(self, value): + self._save_memory = value + for act in self.activations: + assert isinstance(act.children[0], BatchNormalization) + act.children[0].save_memory = value + def _push_allocation_config(self): super(BatchNormalizedMLP, self)._push_allocation_config() # Do the extra allocation pushing for the BatchNormalization diff --git a/tests/bricks/test_bn.py b/tests/bricks/test_bn.py index 8e6e8052..fa3cb950 100644 --- a/tests/bricks/test_bn.py +++ b/tests/bricks/test_bn.py @@ -275,3 +275,12 @@ def test_batch_normalized_mlp_initialization(): assert mlp.activations[0].children[0].input_dim == 7 assert mlp.activations[1].children[0].input_dim == 9 assert not any(l.use_bias for l in mlp.linear_transformations) + + +def test_batch_normalized_mlp_save_memory_propagated(): + mlp = BatchNormalizedMLP([Tanh(), Tanh()], [5, 7, 9], + save_memory=False) + assert not any(act.children[0].save_memory for act in mlp.activations) + mlp.save_memory = True + assert mlp.save_memory + assert all(act.children[0].save_memory for act in mlp.activations) From 02982e9cdaf922c862629496041637a6ed18f7a3 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Mon, 18 Jan 2016 00:16:27 -0500 Subject: [PATCH 047/129] Correctly crawl the graph backward. There might be a HostFromGpu as well as the copy. --- blocks/graph/bn.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/blocks/graph/bn.py b/blocks/graph/bn.py index 42112cc2..35959b77 100644 --- a/blocks/graph/bn.py +++ b/blocks/graph/bn.py @@ -103,7 +103,8 @@ def prepare_replacement(old, new, role, application_call): population_to_minibatch = collections.OrderedDict() for original_graph_node, replacement in replacements: - pop_stats = original_graph_node.owner.inputs[0] - assert has_roles(pop_stats, [BATCH_NORM_POPULATION_STATISTICS]) + pop_stats = original_graph_node + while not has_roles(pop_stats, [BATCH_NORM_POPULATION_STATISTICS]): + pop_stats = pop_stats.owner.inputs[0] population_to_minibatch[pop_stats] = replacement return new_graph, population_to_minibatch From b3588490d5990c487630a68d076c5265a72a89cf Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Mon, 18 Jan 2016 00:18:10 -0500 Subject: [PATCH 048/129] Remove leading batch axis from BN shared variables. It turns out that many StepRules don't behave too well with a broadcastable leading axis (Scale works but not Adam nor Momentum). To sidestep this for now, I just explicitly dimshuffle variables to add the leading axis. --- blocks/bricks/bn.py | 22 +++++++++++++--------- blocks/graph/bn.py | 8 ++++++++ tests/bricks/test_bn.py | 37 +++++++++++++++++++------------------ 3 files changed, 40 insertions(+), 27 deletions(-) diff --git a/blocks/bricks/bn.py b/blocks/bricks/bn.py index 23cc5759..01f3f66e3 100644 --- a/blocks/bricks/bn.py +++ b/blocks/bricks/bn.py @@ -84,20 +84,25 @@ def __init__(self, input_dim, broadcastable=None, @application(inputs=['input_'], outputs=['output']) def apply(self, input_, application_call): - mean = self.population_mean.copy(name='population_offset') - stdev = self.population_stdev.copy(name='population_divisor') + def add_batch_axis(var, name=None): + new_var = var.dimshuffle('x', *list(range(var.ndim))) + new_var.name = name + return new_var def annotate(var, role): add_role(var, role) add_annotation(var, self) add_annotation(var, application_call) + mean = add_batch_axis(self.population_mean, 'population_offset') annotate(mean, BATCH_NORM_OFFSET) - annotate(stdev, BATCH_NORM_DIVISOR) + stdev = add_batch_axis(self.population_stdev, 'population_divisor') + annotate(stdev, BATCH_NORM_DIVISOR) + W = add_batch_axis(self.W) + b = add_batch_axis(self.b) # Heavy lifting is done by the Theano utility function. - normalized = bn.batch_normalization(input_, self.W, - self.b, mean, stdev, + normalized = bn.batch_normalization(input_, W, b, mean, stdev, mode=('low_mem' if self.save_memory else 'high_mem')) return normalized @@ -110,10 +115,9 @@ def _allocate(self): if self.broadcastable is None else self.broadcastable) if len(input_dim) != len(broadcastable): raise ValueError("input_dim and broadcastable must be same length") - var_dim = ((1,) + # batch axis - tuple(1 if broadcast else dim for dim, broadcast in - equizip(input_dim, broadcastable))) - broadcastable = (True,) + broadcastable + var_dim = tuple(1 if broadcast else dim for dim, broadcast in + equizip(input_dim, broadcastable)) + broadcastable = broadcastable # "gamma", from the Ioffe & Szegedy manuscript. self._W = shared_floatx_nans(var_dim, name='batch_norm_scale', diff --git a/blocks/graph/bn.py b/blocks/graph/bn.py index 35959b77..628b8096 100644 --- a/blocks/graph/bn.py +++ b/blocks/graph/bn.py @@ -106,5 +106,13 @@ def prepare_replacement(old, new, role, application_call): pop_stats = original_graph_node while not has_roles(pop_stats, [BATCH_NORM_POPULATION_STATISTICS]): pop_stats = pop_stats.owner.inputs[0] + # Above, we are replacing a node that has a batch axis added to it + # with a replacement formed via a reduction with keepdims=True. In + # order for the actual shared variable and the replacement to have + # compatible dimensions, we need to drop the leading axis of the + # replacement. + replacement = replacement[0] + assert pop_stats.dtype == replacement.dtype + assert pop_stats.broadcastable == replacement.broadcastable population_to_minibatch[pop_stats] = replacement return new_graph, population_to_minibatch diff --git a/tests/bricks/test_bn.py b/tests/bricks/test_bn.py index fa3cb950..ce9c4429 100644 --- a/tests/bricks/test_bn.py +++ b/tests/bricks/test_bn.py @@ -35,11 +35,10 @@ def check(input_dim, expected_shape, broadcastable=None, save_memory=True): assert save_memory == bn.save_memory assert input_dim == bn.input_dim assert bn.broadcastable == broadcastable - real_broadcastable = (True,) + input_broadcastable - assert bn.W.broadcastable == real_broadcastable - assert bn.b.broadcastable == real_broadcastable - assert bn.population_mean.broadcastable == real_broadcastable - assert bn.population_stdev.broadcastable == real_broadcastable + assert bn.W.broadcastable == input_broadcastable + assert bn.b.broadcastable == input_broadcastable + assert bn.population_mean.broadcastable == input_broadcastable + assert bn.population_stdev.broadcastable == input_broadcastable assert_allclose(bn.population_mean.get_value(borrow=True), 0.) assert_allclose(bn.population_stdev.get_value(borrow=True), 1.) assert_equal(bn.W.get_value(borrow=True).shape, expected_shape) @@ -54,11 +53,11 @@ def check(input_dim, expected_shape, broadcastable=None, save_memory=True): assert_allclose(bn.b.get_value(borrow=True), 0.) assert_allclose(bn.W.get_value(borrow=True), 1.) - yield check, 5, (1, 5) - yield check, (6, 7, 9), (1, 6, 7, 9), (False, False, False) - yield check, (7, 4, 3), (1, 1, 4, 3), (True, False, False) - yield check, (9, 3, 6), (1, 9, 1, 1), (False, True, True) - yield check, (7, 4, 5), (1, 7, 1, 5), (False, True, False), False + yield check, 5, (5,) + yield check, (6, 7, 9), (6, 7, 9), (False, False, False) + yield check, (7, 4, 3), (1, 4, 3), (True, False, False) + yield check, (9, 3, 6), (9, 1, 1), (False, True, True) + yield check, (7, 4, 5), (7, 1, 5), (False, True, False), False def apply_setup(input_dim, broadcastable, save_memory): @@ -110,9 +109,9 @@ def check(input_dim, variable_dim, broadcastable=None, save_memory=True): (input_ - pop_mean) * (gamma / pop_stdev) + beta, rtol=1e-4) - yield check, 9, (1, 9) - yield check, (5, 4), (1, 5, 4), None, False - yield check, (2, 9, 7), (1, 2, 1, 1), (False, True, True) + yield check, 9, (9,) + yield check, (5, 4), (5, 4), None, False + yield check, (2, 9, 7), (2, 1, 1), (False, True, True) def test_batch_normalization_train_apply(): @@ -128,8 +127,10 @@ def check(input_dim, variable_dim, broadcastable=None, save_memory=True): (input_dim if isinstance(input_dim, collections.Sequence) else (input_dim,))) - axes = tuple(i for i, b in - enumerate(bn.population_mean.broadcastable) if b) + # i + 1 because the axes are all shifted one over when the batch + # axis is added. + axes = (0,) + tuple((i + 1) for i, b in + enumerate(bn.population_mean.broadcastable) if b) # NumPy implementation of the batch-normalization transform. def normalize(x): @@ -170,9 +171,9 @@ def normalize(x): atol=(1e-3 if theano.config.floatX == 'float32' else 1e-7)) - yield check, 9, (1, 9) - yield check, (5, 4), (1, 5, 4), None, False - yield check, (2, 9, 7), (1, 2, 1, 1), (False, True, True) + yield check, 9, (9,) + yield check, (5, 4), (5, 4), None, False + yield check, (2, 9, 7), (2, 1, 1), (False, True, True) def test_batch_normalization_image_size_setter(): From 59fd7cd39d42e42903d98b679d61b3ad9f4e8ad3 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Sun, 17 Jan 2016 20:48:58 -0500 Subject: [PATCH 049/129] Add brick filter and smoke test for bug fixed. --- blocks/graph/bn.py | 3 ++- tests/bricks/test_bn.py | 11 ++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/blocks/graph/bn.py b/blocks/graph/bn.py index 628b8096..6cc19087 100644 --- a/blocks/graph/bn.py +++ b/blocks/graph/bn.py @@ -52,7 +52,8 @@ def batch_normalize(computation_graph, epsilon=1e-4): # Create filters for variables involved in a batch normalization brick # application. def make_variable_filter(role): - return VariableFilter(roles=[role]) + from blocks.bricks import BatchNormalization + return VariableFilter(bricks=[BatchNormalization], roles=[role]) mean_filter, stdev_filter, input_filter = map(make_variable_filter, [BATCH_NORM_OFFSET, diff --git a/tests/bricks/test_bn.py b/tests/bricks/test_bn.py index ce9c4429..6df68119 100644 --- a/tests/bricks/test_bn.py +++ b/tests/bricks/test_bn.py @@ -270,12 +270,13 @@ def test_batch_normalized_mlp_allocation(): assert not any(l.use_bias for l in mlp.linear_transformations) -def test_batch_normalized_mlp_initialization(): +def test_batch_normalized_mlp_transformed(): + """Smoke test that a graph involving a BatchNormalizedMLP transforms.""" + x = tensor.matrix('x') mlp = BatchNormalizedMLP([Tanh(), Tanh()], [5, 7, 9]) - mlp.allocate() - assert mlp.activations[0].children[0].input_dim == 7 - assert mlp.activations[1].children[0].input_dim == 9 - assert not any(l.use_bias for l in mlp.linear_transformations) + cg = ComputationGraph([mlp.apply(x)]) + new_cg, replaced = batch_normalize(cg) + assert len(replaced) == 4 # 2 means, 2 standard deviations def test_batch_normalized_mlp_save_memory_propagated(): From 93e55f621964e169be1bdc977d5a43e05f6266d9 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Mon, 18 Jan 2016 19:30:07 -0500 Subject: [PATCH 050/129] Big refactor to enable context manager operation. This allows an alternative method of creating training graphs, by using a context manager (either a function of one or more top bricks or by using the BatchNormalization brick itself as a context manager). It also makes apply_batch_normalization create more efficient graphs by only doing one replacement per node, not two, by replacing the output node. It also moves the logic for graph creation of either type into the brick definition, rather than having minibatch logic in the graphs module. --- blocks/bricks/base.py | 1 + blocks/bricks/bn.py | 110 ++++++++++++++++---- blocks/graph/__init__.py | 2 +- blocks/graph/bn.py | 205 +++++++++++++++++++++++--------------- blocks/utils/__init__.py | 33 +++++- tests/bricks/test_bn.py | 10 +- tests/utils/test_utils.py | 60 ++++++++++- 7 files changed, 312 insertions(+), 109 deletions(-) diff --git a/blocks/bricks/base.py b/blocks/bricks/base.py index 46e54430..cfabb4ee 100644 --- a/blocks/bricks/base.py +++ b/blocks/bricks/base.py @@ -873,6 +873,7 @@ class ApplicationCall(Annotation): """ def __init__(self, application): self.application = application + self.metadata = {} super(ApplicationCall, self).__init__() def add_auxiliary_variable(self, variable, roles=None, name=None): diff --git a/blocks/bricks/bn.py b/blocks/bricks/bn.py index 01f3f66e3..6e84c9e0 100644 --- a/blocks/bricks/bn.py +++ b/blocks/bricks/bn.py @@ -2,13 +2,16 @@ import numpy from picklable_itertools.extras import equizip +import theano +from theano import tensor from theano.tensor.nnet import bn from ..graph import add_annotation from ..initialization import Constant from ..roles import (WEIGHT, BIAS, BATCH_NORM_POPULATION_MEAN, BATCH_NORM_POPULATION_STDEV, BATCH_NORM_OFFSET, - BATCH_NORM_DIVISOR, add_role) + BATCH_NORM_DIVISOR, BATCH_NORM_MINIBATCH_ESTIMATE, + add_role) from ..utils import (shared_floatx_zeros, shared_floatx, shared_floatx_nans) from .base import lazy, application @@ -16,6 +19,20 @@ from .interfaces import RNGMixin +def _add_batch_axis(var, name=None): + """Prepend a singleton axis to a TensorVariable.""" + new_var = var.dimshuffle('x', *list(range(var.ndim))) + new_var.name = name + return new_var + + +def _add_role_and_annotate(var, role, annotations=()): + """Add a role and zero or more annotations to a variable.""" + add_role(var, role) + for annotation in annotations: + add_annotation(var, annotation) + + class BatchNormalization(RNGMixin, Feedforward): r"""Normalizes activations, parameterizes a scale and shift. @@ -34,6 +51,11 @@ class BatchNormalization(RNGMixin, Feedforward): Use an implementation that stores less intermediate state and therefore uses less memory, at the expense of 5-10% speed. Default is `True`. + epsilon : float, optional + The stabilizing constant for the minibatch standard deviation + computation (when the brick is run in training mode). + Added to the variance inside the square root, as in the + batch normalization paper. weights_init : object, optional Initialization object to use for the learned scaling parameter ($\\gamma$ in [BN]_). By default, uses constant initialization @@ -53,14 +75,29 @@ class BatchNormalization(RNGMixin, Feedforward): moving average of minibatch-wise statistics. In order to *train* with batch normalization, one must obtain a - training graph by transforming the original inference graph. See - :func:`batch_normalize`. + training graph by transforming the original inference graph. See + :func:`~blocks.graph.apply_batch_normalization` for a routine to + transform graphs, and :func:`~blocks.graph.batch_normalization` + for a context manager that may enable shorter compile times + (every instance of :class:`BatchNormalization` is itself a context + manager, entry into which causes applications to be in minibatch + "training" mode, however it is usually more convenient to use + :func:`~blocks.graph.batch_normalization` to enable this behaviour + for all of your graph's :class:`BatchNormalization` bricks at once). + + Note that training in inference mode should be avoided, as this + brick introduces scales and shift parameters (tagged with the + `PARAMETER` role) that, in the absence of batch normalization, + usually makes things unstable. If you must do this, filter for and + remove `BATCH_NORM_SHIFT` and `BATCH_NORM_SCALE` from the list of + parameters you are training, and this brick should behave as a + (somewhat expensive) no-op. This Brick accepts `weights_init` and `biases_init` arguments but is *not* an instance of :class:`~blocks.bricks.Initializable`, and will therefore not receive pushed initialization config from any parent brick. In almost all cases, you will probably want to stick with the - defaults (unit scale and zero shift), but you can explicitly pass one + defaults (unit scale and zero offset), but you can explicitly pass one or both initializers to override this. This has the necessary properties to be inserted into a @@ -71,42 +108,71 @@ class BatchNormalization(RNGMixin, Feedforward): """ @lazy(allocation=['input_dim']) def __init__(self, input_dim, broadcastable=None, - save_memory=True, weights_init=None, + save_memory=True, epsilon=1e-4, weights_init=None, biases_init=None, **kwargs): self.input_dim = input_dim self.broadcastable = broadcastable self.save_memory = save_memory + self.epsilon = 1e-4 self.weights_init = (Constant(1) if weights_init is None else weights_init) self.biases_init = (Constant(0) if biases_init is None else biases_init) + self._training_mode = False super(BatchNormalization, self).__init__(**kwargs) @application(inputs=['input_'], outputs=['output']) def apply(self, input_, application_call): - def add_batch_axis(var, name=None): - new_var = var.dimshuffle('x', *list(range(var.ndim))) - new_var.name = name - return new_var - - def annotate(var, role): - add_role(var, role) - add_annotation(var, self) - add_annotation(var, application_call) - - mean = add_batch_axis(self.population_mean, 'population_offset') - annotate(mean, BATCH_NORM_OFFSET) - - stdev = add_batch_axis(self.population_stdev, 'population_divisor') - annotate(stdev, BATCH_NORM_DIVISOR) - W = add_batch_axis(self.W) - b = add_batch_axis(self.b) + if self._training_mode: + mean, stdev = self._compute_training_statistics(input_) + else: + mean, stdev = self._prepare_population_statistics() + # Useful for filtration of calls that were already made in + # training mode when doing graph transformations. + application_call.metadata['training_mode'] = self._training_mode + # Useful for retrieving a list of updates for population + # statistics. Ditch the broadcastable first axis, though, to + # make it the same dimensions as the population mean and stdev + # shared variables. + application_call.metadata['offset'] = mean[0] + application_call.metadata['divisor'] = stdev[0] + # Give these quantities roles in the graph. + _add_role_and_annotate(mean, BATCH_NORM_OFFSET, + [self, application_call]) + _add_role_and_annotate(stdev, BATCH_NORM_DIVISOR, + [self, application_call]) + W = _add_batch_axis(self.W, "W.dimshuffle('x'...)") + b = _add_batch_axis(self.b, "b.dimshuffle('x', ...)") # Heavy lifting is done by the Theano utility function. normalized = bn.batch_normalization(input_, W, b, mean, stdev, mode=('low_mem' if self.save_memory else 'high_mem')) return normalized + def __enter__(self): + self._training_mode = True + + def __exit__(self, *exc_info): + self._training_mode = False + + def _compute_training_statistics(self, input_): + axes = (0,) + tuple((i + 1) for i, b in + enumerate(self.population_mean.broadcastable) + if b) + mean = input_.mean(axis=axes, keepdims=True) + assert mean.broadcastable[1:] == self.population_mean.broadcastable + stdev = tensor.sqrt(tensor.var(input_, axis=axes, keepdims=True) + + numpy.cast[theano.config.floatX](self.epsilon)) + assert stdev.broadcastable[1:] == self.population_stdev.broadcastable + add_role(mean, BATCH_NORM_MINIBATCH_ESTIMATE) + add_role(stdev, BATCH_NORM_MINIBATCH_ESTIMATE) + return mean, stdev + + def _prepare_population_statistics(self): + mean = _add_batch_axis(self.population_mean, 'population_offset') + stdev = _add_batch_axis(self.population_stdev, 'population_divisor') + return mean, stdev + def _allocate(self): input_dim = ((self.input_dim,) if not isinstance(self.input_dim, collections.Sequence) diff --git a/blocks/graph/__init__.py b/blocks/graph/__init__.py index 02929cc6..70424447 100644 --- a/blocks/graph/__init__.py +++ b/blocks/graph/__init__.py @@ -19,7 +19,7 @@ from ..utils import (is_graph_input, is_shared_variable, dict_union, shared_floatx_zeros, shared_like) from .annotations import add_annotation, Annotation # noqa -from .bn import batch_normalize # noqa +from .bn import batch_normalization, apply_batch_normalization # noqa logger = logging.getLogger(__name__) diff --git a/blocks/graph/bn.py b/blocks/graph/bn.py index 6cc19087..bd62c9d6 100644 --- a/blocks/graph/bn.py +++ b/blocks/graph/bn.py @@ -6,27 +6,94 @@ """ import collections -from theano import tensor +import contextlib -from . import add_annotation -from ..roles import (BATCH_NORM_OFFSET, BATCH_NORM_DIVISOR, - BATCH_NORM_POPULATION_STATISTICS, - BATCH_NORM_MINIBATCH_ESTIMATE, INPUT, add_role, - has_roles) +from ..roles import BATCH_NORM_OFFSET, BATCH_NORM_DIVISOR, INPUT, OUTPUT +from ..utils import find_bricks -def batch_normalize(computation_graph, epsilon=1e-4): - """Activate batch normalization in a graph. +@contextlib.contextmanager +def batch_normalization(*bricks): + r"""Context manager to run batch normalization in "training mode". + + Parameters + ---------- + \*bricks + One or more bricks which will be inspected for descendant + instances of :class:`~blocks.bricks.BatchNormalization`. + + Notes + ----- + Graph replacement using :func:`apply_batch_normalization`, while + elegant, can lead to Theano graphs that are quite large and result + in very slow compiles. This provides an alternative mechanism for + building the batch normalized training graph. It can be somewhat + less convenient as it requires building the graph twice if one + wishes to monitor the output of the inference graph during training. + + Examples + -------- + First, we'll create a :class:`~blocks.bricks.BatchNormalizedMLP`. + This behaves almost exactly like a regular :class:`~blocks.bricks.MLP` + except that it contains :class:`~blocks.bricks.BatchNormalization` + bricks placed before each activation function. + + >>> import theano + >>> from blocks.bricks import BatchNormalizedMLP, Tanh + >>> from blocks.initialization import Constant, IsotropicGaussian + >>> mlp = BatchNormalizedMLP([Tanh(), Tanh()], [4, 5, 6], + ... weights_init=IsotropicGaussian(0.1), + ... biases_init=Constant(0)) + >>> mlp.initialize() + >>> data = numpy.arange(12, dtype=theano.config.floatX).reshape(3, 4) + >>> x = theano.tensor.matrix('x') + + First, we'll construct an output variable as we would normally. This + is getting normalized by the *population* statistics, which by + default are initialized to 0 (mean) and 1 (standard deviation), + respectively. + + >>> y = mlp.apply(x) + + And now, to construct an output with batch normalization enabled, + i.e. normalizing pre-activations using per-minibatch statistics, we + simply make a similar call inside of a `with` statement: + + >>> with batch_normalization(mlp): + ... y_bn = mlp.apply(x) + + Let's verify that these two graphs behave differently on the + same data: + + >>> import numpy + >>> data = numpy.arange(12, dtype=theano.config.floatX).reshape(3, 4) + >>> inf_y = y.eval({x: data}) + >>> trn_y = y_bn.eval({x: data}) + >>> numpy.allclose(inf_y, trn_y) + False + + """ + # Avoid circular imports. + from blocks.bricks import BatchNormalization + + bn = find_bricks(bricks, lambda b: isinstance(b, BatchNormalization)) + # Can't use either nested() (deprecated) nor ExitStack (not available + # on Python 2.7). Well, that sucks. + for brick in bn: + brick.__enter__() + yield + for brick in bn: + brick.__exit__() + + +def apply_batch_normalization(computation_graph): + """Transform a graph into a batch-normalized training graph. Parameters ---------- computation_graph : instance of :class:`ComputationGraph` The computation graph containing :class:`BatchNormalization` brick applications. - epsilon : float, optional - The stabilizing constant for the minibatch standard deviation - computation. Added to the variance inside the square root, as - in the batch normalization paper. Returns ------- @@ -34,86 +101,64 @@ def batch_normalize(computation_graph, epsilon=1e-4): The computation graph, with :class:`BatchNormalization` applications transformed to use minibatch statistics instead of accumulated population statistics. - population_to_minibatch : OrderedDict - A mapping of variables used in the original graph for population - means and standard deviations to the minibatch-derived quantities - that replace them. Useful to define updates in order to track - the approximate population statistics during learning. - - Notes - ----- - Assumes the minibatch axis is 0. Other axes are unsupported at - this time. + update_pairs : list of tuples + A list of 2-tuples where the first element of each tuple is the + shared variable containing a "population" mean or standard + deviation, and the second is a Theano variable for the + corresponding statistics on a minibatch. Note that multiple + applications of a single :class:`blocks.bricks.BatchNormalization` + may appear in the graph, and therefore a single population variable + may map to several different minibatch variables. + + See Also + -------- + :func:`batch_normalization`, for an alternative method to produce + batch normalized graphs. """ - # Avoid a circular import. + # Avoid circular imports. + from blocks.bricks import BatchNormalization from ..filter import VariableFilter, get_application_call # Create filters for variables involved in a batch normalization brick # application. def make_variable_filter(role): - from blocks.bricks import BatchNormalization return VariableFilter(bricks=[BatchNormalization], roles=[role]) - mean_filter, stdev_filter, input_filter = map(make_variable_filter, - [BATCH_NORM_OFFSET, - BATCH_NORM_DIVISOR, INPUT]) - - # Group means, standard deviations, and inputs into dicts indexed by - # application call. - def get_application_call_dict(variable_filter): + # Group inputs and outputs into dicts indexed by application call. + def get_app_call_dict(variable_filter): return collections.OrderedDict((get_application_call(v), v) for v in variable_filter(computation_graph)) - means, stdevs, inputs = map(get_application_call_dict, - [mean_filter, stdev_filter, input_filter]) + # Compose these two so that we get 4 dicts, grouped by application + # call, of different variable roles involved in BatchNormalization. + inputs, outputs, means, stdevs = map(get_app_call_dict, + map(make_variable_filter, + [INPUT, OUTPUT, BATCH_NORM_OFFSET, + BATCH_NORM_DIVISOR])) + + assert len(set([len(inputs), len(outputs), len(means), len(stdevs)])) == 1 - assert (set(means.keys()) == set(stdevs.keys()) and - set(means.keys()) == set(inputs.keys())) - assert set(means.values()).isdisjoint(stdevs.values()) + # Remove any ApplicationCalls that were not generated by apply(), or + # were generated by an apply() while already in training mode. + remove = filter(lambda a: (a.metadata.get('training_mode', False) or + a.application.application != + BatchNormalization.apply), inputs.keys()) + for app_call in remove: + for mapping in (inputs, outputs, means, stdevs): + del mapping[app_call] replacements = [] - # Perform replacement for each application call. - for application_call in means: - axes = tuple(i for i, b in enumerate(means[application_call] - .broadcastable) if b) - minibatch_mean = inputs[application_call].mean(axis=axes, - keepdims=True) - minibatch_mean.name = 'minibatch_offset' - # Stabilize in the same way as the batch normalization manuscript. - minibatch_std = tensor.sqrt(tensor.var(inputs[application_call], - axis=axes, keepdims=True) + - epsilon) - minibatch_std.name = 'minibatch_divisor' - - def prepare_replacement(old, new, role, application_call): - """Add roles and tags to replaced variables.""" - add_role(new, BATCH_NORM_MINIBATCH_ESTIMATE) - add_role(new, role) - add_annotation(new, application_call) - add_annotation(new, application_call.application.brick) - new.tag.replacement_of = old - replacements.append((old, new)) - - prepare_replacement(means[application_call], minibatch_mean, - BATCH_NORM_OFFSET, application_call) - prepare_replacement(stdevs[application_call], minibatch_std, - BATCH_NORM_DIVISOR, application_call) - - new_graph = computation_graph.replace(replacements) - - population_to_minibatch = collections.OrderedDict() - for original_graph_node, replacement in replacements: - pop_stats = original_graph_node - while not has_roles(pop_stats, [BATCH_NORM_POPULATION_STATISTICS]): - pop_stats = pop_stats.owner.inputs[0] - # Above, we are replacing a node that has a batch axis added to it - # with a replacement formed via a reduction with keepdims=True. In - # order for the actual shared variable and the replacement to have - # compatible dimensions, we need to drop the leading axis of the - # replacement. - replacement = replacement[0] - assert pop_stats.dtype == replacement.dtype - assert pop_stats.broadcastable == replacement.broadcastable - population_to_minibatch[pop_stats] = replacement - return new_graph, population_to_minibatch + update_pairs = [] + for app_call in inputs: + old_output = outputs[app_call] + unpacked = inputs[app_call].owner.inputs[0] + with app_call.application.brick: + new_output = app_call.application.brick.apply(unpacked) + replacements.append((old_output, new_output)) + new_app_call = get_application_call(new_output) + update_pairs.append((app_call.application.brick.population_mean, + new_app_call.metadata['offset'])) + update_pairs.append((app_call.application.brick.population_stdev, + new_app_call.metadata['divisor'])) + return computation_graph.replace(replacements), update_pairs diff --git a/blocks/utils/__init__.py b/blocks/utils/__init__.py index df9fc03b..5144955a 100644 --- a/blocks/utils/__init__.py +++ b/blocks/utils/__init__.py @@ -1,7 +1,7 @@ from __future__ import print_function import sys import contextlib -from collections import OrderedDict +from collections import OrderedDict, deque import numpy import six @@ -516,3 +516,34 @@ def extract_args(expected, *args, **kwargs): [name for name in expected if name not in routed_args])) return OrderedDict((key, routed_args[key]) for key in expected) + + +def find_bricks(top_bricks, predicate): + """Walk the brick hierarchy, return bricks that satisfy a predicate. + + Parameters + ---------- + top_bricks : list + A list of root bricks to search downward from. + predicate : callable + A callable that returns `True` for bricks that meet the + desired criteria or `False` for those that don't. + + Returns + ------- + found : list + A list of all bricks that are descendants of any element of + `top_bricks` that satisfy `predicate`. + + """ + found = [] + visited = set() + to_visit = deque(top_bricks) + while len(to_visit) > 0: + current = to_visit.popleft() + if current not in visited: + visited.add(current) + if predicate(current): + found.append(current) + to_visit.extend(current.children) + return found diff --git a/tests/bricks/test_bn.py b/tests/bricks/test_bn.py index 6df68119..f865a59e 100644 --- a/tests/bricks/test_bn.py +++ b/tests/bricks/test_bn.py @@ -9,7 +9,7 @@ from blocks.bricks.conv import (Convolutional, ConvolutionalSequence, MaxPooling, AveragePooling) from blocks.initialization import Constant -from blocks.graph import ComputationGraph, batch_normalize +from blocks.graph import ComputationGraph, apply_batch_normalization def random_unif(rng, dim, low=1, high=10): @@ -61,7 +61,8 @@ def check(input_dim, expected_shape, broadcastable=None, save_memory=True): def apply_setup(input_dim, broadcastable, save_memory): - bn = BatchNormalization(input_dim, broadcastable, save_memory) + bn = BatchNormalization(input_dim, broadcastable, save_memory, + epsilon=1e-4) bn.initialize() b_len = (len(input_dim) if isinstance(input_dim, collections.Sequence) else 1) @@ -116,10 +117,11 @@ def check(input_dim, variable_dim, broadcastable=None, save_memory=True): def test_batch_normalization_train_apply(): def check(input_dim, variable_dim, broadcastable=None, save_memory=True): + # Default epsilon value. epsilon = numpy.cast[theano.config.floatX](1e-4) bn, x, y = apply_setup(input_dim, broadcastable, save_memory) cg = ComputationGraph([y]) - new_cg, _ = batch_normalize(cg, epsilon=epsilon) + new_cg, _ = apply_batch_normalization(cg) y_hat = new_cg.outputs[0] rng = numpy.random.RandomState((2015, 12, 16)) @@ -275,7 +277,7 @@ def test_batch_normalized_mlp_transformed(): x = tensor.matrix('x') mlp = BatchNormalizedMLP([Tanh(), Tanh()], [5, 7, 9]) cg = ComputationGraph([mlp.apply(x)]) - new_cg, replaced = batch_normalize(cg) + new_cg, replaced = apply_batch_normalization(cg) assert len(replaced) == 4 # 2 means, 2 standard deviations diff --git a/tests/utils/test_utils.py b/tests/utils/test_utils.py index 418fce67..f96341b2 100644 --- a/tests/utils/test_utils.py +++ b/tests/utils/test_utils.py @@ -1,7 +1,8 @@ from numpy.testing import assert_raises from theano import tensor -from blocks.utils import check_theano_variable, unpack +from blocks.utils import check_theano_variable, unpack, find_bricks +from blocks.bricks import MLP, Sequence, Tanh, Identity, Logistic def test_unpack(): @@ -20,3 +21,60 @@ def test_check_theano_variable(): tensor.vector(), 2, 'float') assert_raises(ValueError, check_theano_variable, tensor.vector(), 1, 'int') + + +class TestFindBricks(object): + def setUp(self): + self.mlp = MLP([Sequence([Identity(name='id1').apply, + Tanh(name='tanh1').apply], + name='sequence1'), + Sequence([Logistic(name='logistic1').apply, + Identity(name='id2').apply, + Tanh(name='tanh2').apply], + name='sequence2'), + Logistic(name='logistic2'), + Sequence([Sequence([Logistic(name='logistic3').apply], + name='sequence4').apply], + name='sequence3')], + [10, 5, 9, 5, 9]) + + def test_find_zeroth_level(self): + found = find_bricks([self.mlp], lambda x: isinstance(x, MLP)) + assert len(found) == 1 + assert found[0] == self.mlp + + def test_find_zeroth_level_repeated(self): + found = find_bricks([self.mlp, self.mlp], lambda x: isinstance(x, MLP)) + assert len(found) == 1 + assert found[0] == self.mlp + + def test_find_all_unique(self): + found = find_bricks([self.mlp, self.mlp] + list(self.mlp.children), + lambda _: True) + assert len(found) == 16 # 12 activations plus 4 linear transformations + + def test_find_none(self): + found = find_bricks([self.mlp], lambda _: False) + assert len(found) == 0 + + def test_find_first_level(self): + found = set(find_bricks([self.mlp], lambda x: isinstance(x, Sequence))) + assert len(found) == 5 + assert self.mlp in found + found.remove(self.mlp) + sequences = set(self.mlp.activations[0:2] + + [self.mlp.activations[3], + self.mlp.activations[3].children[0]]) + assert sequences == found + + def test_find_second_and_third_level(self): + found = set(find_bricks([self.mlp], lambda x: isinstance(x, Identity))) + assert len(found) == 2 + assert self.mlp.activations[0].children[0] in found + assert self.mlp.activations[1].children[1] in found + + def test_find_first_and_second_and_third_level(self): + found = set(find_bricks([self.mlp], lambda x: isinstance(x, Logistic))) + assert self.mlp.activations[2] in found + assert self.mlp.activations[1].children[0] in found + assert self.mlp.activations[3].children[0].children[0] From 73a6902264b910c46f9bcdea9910547a415ce646 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Mon, 18 Jan 2016 19:32:43 -0500 Subject: [PATCH 051/129] Comments explaining tests. --- tests/bricks/test_bn.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/bricks/test_bn.py b/tests/bricks/test_bn.py index f865a59e..9b1351c7 100644 --- a/tests/bricks/test_bn.py +++ b/tests/bricks/test_bn.py @@ -13,6 +13,7 @@ def random_unif(rng, dim, low=1, high=10): + """Generate some floatX uniform random numbers.""" return (rng.uniform(low, high, size=dim) .astype(theano.config.floatX)) @@ -61,6 +62,7 @@ def check(input_dim, expected_shape, broadcastable=None, save_memory=True): def apply_setup(input_dim, broadcastable, save_memory): + """Common setup code.""" bn = BatchNormalization(input_dim, broadcastable, save_memory, epsilon=1e-4) bn.initialize() @@ -73,6 +75,7 @@ def apply_setup(input_dim, broadcastable, save_memory): def test_batch_normalization_inference_apply(): + """Test that BatchNormalization.apply works in inference mode.""" def check(input_dim, variable_dim, broadcastable=None, save_memory=True): bn, x, y = apply_setup(input_dim, broadcastable, save_memory) rng = numpy.random.RandomState((2015, 12, 16)) @@ -179,6 +182,7 @@ def normalize(x): def test_batch_normalization_image_size_setter(): + """Test that setting image_size on a BatchNormalization works.""" bn = BatchNormalization() bn.image_size = (5, 4) assert bn.input_dim == (None, 5, 4) @@ -187,6 +191,7 @@ def test_batch_normalization_image_size_setter(): def test_spatial_batch_normalization(): + """Smoke test for SpatialBatchNormalization.""" def check(*input_dim): sbn = SpatialBatchNormalization(input_dim) sbn.initialize() @@ -204,6 +209,7 @@ def check(*input_dim): def test_raise_exception_spatial(): + """Test that SpatialBatchNormalization raises an expected exception.""" # Work around a stupid bug in nose2 that unpacks the tuple into # separate arguments. yield assert_raises, (ValueError, SpatialBatchNormalization, (5,)) @@ -222,6 +228,7 @@ def do_not_fail(*input_dim): def test_batch_normalization_inside_convolutional_sequence(): + """Test that BN bricks work in ConvolutionalSequences.""" conv_seq = ConvolutionalSequence( [Convolutional(filter_size=(3, 3), num_filters=4), BatchNormalization(broadcastable=(False, True, True)), @@ -256,6 +263,7 @@ def test_batch_normalization_inside_convolutional_sequence(): def test_batch_normalized_mlp_construction(): + """Test that BatchNormalizedMLP performs construction correctly.""" mlp = BatchNormalizedMLP([Tanh(), Tanh()], [5, 7, 9]) assert all(isinstance(a, Sequence) for a in mlp.activations) assert all(isinstance(a.children[0], BatchNormalization) @@ -265,6 +273,7 @@ def test_batch_normalized_mlp_construction(): def test_batch_normalized_mlp_allocation(): + """Test that BatchNormalizedMLP performs allocation correctly.""" mlp = BatchNormalizedMLP([Tanh(), Tanh()], [5, 7, 9]) mlp.allocate() assert mlp.activations[0].children[0].input_dim == 7 @@ -282,6 +291,7 @@ def test_batch_normalized_mlp_transformed(): def test_batch_normalized_mlp_save_memory_propagated(): + """Test that setting save_memory on a BatchNormalizedMLP works.""" mlp = BatchNormalizedMLP([Tanh(), Tanh()], [5, 7, 9], save_memory=False) assert not any(act.children[0].save_memory for act in mlp.activations) From ad3a84db2e1030486ba77f8d7cf6bd0a2f586637 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Tue, 19 Jan 2016 19:14:22 -0500 Subject: [PATCH 052/129] Fix doctest. --- blocks/graph/bn.py | 1 - 1 file changed, 1 deletion(-) diff --git a/blocks/graph/bn.py b/blocks/graph/bn.py index bd62c9d6..421141a8 100644 --- a/blocks/graph/bn.py +++ b/blocks/graph/bn.py @@ -45,7 +45,6 @@ def batch_normalization(*bricks): ... weights_init=IsotropicGaussian(0.1), ... biases_init=Constant(0)) >>> mlp.initialize() - >>> data = numpy.arange(12, dtype=theano.config.floatX).reshape(3, 4) >>> x = theano.tensor.matrix('x') First, we'll construct an output variable as we would normally. This From 3dc913597278f56cc3629022c094b09232c658df Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Wed, 20 Jan 2016 02:46:00 -0500 Subject: [PATCH 053/129] More tests, move graph tests to tests/graph. --- tests/bricks/test_bn.py | 10 ++++--- tests/graph/test_bn.py | 66 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 tests/graph/test_bn.py diff --git a/tests/bricks/test_bn.py b/tests/bricks/test_bn.py index 9b1351c7..c99022f9 100644 --- a/tests/bricks/test_bn.py +++ b/tests/bricks/test_bn.py @@ -70,14 +70,14 @@ def apply_setup(input_dim, broadcastable, save_memory): else 1) x = tensor.TensorType(theano.config.floatX, [False] * (b_len + 1))() - y = bn.apply(x) - return bn, x, y + return bn, x def test_batch_normalization_inference_apply(): """Test that BatchNormalization.apply works in inference mode.""" def check(input_dim, variable_dim, broadcastable=None, save_memory=True): - bn, x, y = apply_setup(input_dim, broadcastable, save_memory) + bn, x = apply_setup(input_dim, broadcastable, save_memory) + y = bn.apply(x) rng = numpy.random.RandomState((2015, 12, 16)) input_ = random_unif(rng, (9,) + @@ -122,7 +122,9 @@ def test_batch_normalization_train_apply(): def check(input_dim, variable_dim, broadcastable=None, save_memory=True): # Default epsilon value. epsilon = numpy.cast[theano.config.floatX](1e-4) - bn, x, y = apply_setup(input_dim, broadcastable, save_memory) + bn, x = apply_setup(input_dim, broadcastable, save_memory) + with bn: + y = bn.apply(x) cg = ComputationGraph([y]) new_cg, _ = apply_batch_normalization(cg) y_hat = new_cg.outputs[0] diff --git a/tests/graph/test_bn.py b/tests/graph/test_bn.py new file mode 100644 index 00000000..19c56166 --- /dev/null +++ b/tests/graph/test_bn.py @@ -0,0 +1,66 @@ +from blocks.bricks import BatchNormalization, Sequence, Tanh, MLP +from blocks.graph import (ComputationGraph, batch_normalization, + apply_batch_normalization) +from blocks.initialization import Constant + +import numpy +from numpy.testing import assert_allclose +import theano +from theano import tensor + + +def test_batch_normalization_simple(): + x = tensor.matrix() + eps = 1e-4 + bn = BatchNormalization(input_dim=4, epsilon=eps) + bn.initialize() + with batch_normalization(bn): + y = bn.apply(x) + rng = numpy.random.RandomState((2016, 1, 18)) + x_ = rng.uniform(size=(5, 4)).astype(theano.config.floatX) + y_ = y.eval({x: x_}) + y_expected = (x_ - x_.mean(axis=0)) / numpy.sqrt(x_.var(axis=0) + eps) + assert_allclose(y_, y_expected, rtol=1e-4) + + +def test_batch_normalization_nested(): + x = tensor.tensor4() + eps = 1e-4 + r_dims = (0, 2, 3) + batch_dims = (5, 4, 3, 2) + bn = BatchNormalization(input_dim=batch_dims[1:], + broadcastable=(False, True, True), + epsilon=eps) + seq = Sequence([bn.apply, Tanh().apply]) + seq.initialize() + with batch_normalization(seq): + y = seq.apply(x) + rng = numpy.random.RandomState((2016, 1, 18)) + x_ = rng.uniform(size=batch_dims).astype(theano.config.floatX) + y_ = y.eval({x: x_}) + y_expected = numpy.tanh((x_ - x_.mean(axis=r_dims, keepdims=True)) / + numpy.sqrt(x_.var(axis=r_dims, keepdims=True) + + eps)) + assert_allclose(y_, y_expected, rtol=1e-4) + + +def test_apply_batch_normalization_nested(): + x = tensor.matrix() + eps = 1e-8 + batch_dims = (3, 9) + bn = BatchNormalization(input_dim=5, epsilon=eps) + mlp = MLP([Sequence([bn.apply, Tanh().apply])], [9, 5], + weights_init=Constant(0.4), biases_init=Constant(1)) + mlp.initialize() + y = mlp.apply(x) + cg, _ = apply_batch_normalization(ComputationGraph([y])) + y_bn = cg.outputs[0] + rng = numpy.random.RandomState((2016, 1, 18)) + x_ = rng.uniform(size=batch_dims).astype(theano.config.floatX) + y_ = y_bn.eval({x: x_}) + W_, b_ = map(lambda s: (getattr(mlp.linear_transformations[0], s) + .get_value(borrow=True)), ['W', 'b']) + z_ = numpy.dot(x_, W_) + b_ + y_expected = numpy.tanh((z_ - z_.mean(axis=0)) / + numpy.sqrt(z_.var(axis=0) + eps)) + assert_allclose(y_, y_expected, rtol=1e-3) From 2e7cd0ea37ae9de8678d7633c30ce89f1289000c Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Wed, 20 Jan 2016 18:13:45 -0500 Subject: [PATCH 054/129] Rename save_memory -> conserve_memory. --- blocks/bricks/bn.py | 27 ++++++++++++++------------- tests/bricks/test_bn.py | 35 +++++++++++++++++++---------------- 2 files changed, 33 insertions(+), 29 deletions(-) diff --git a/blocks/bricks/bn.py b/blocks/bricks/bn.py index 6e84c9e0..04f4b8fe 100644 --- a/blocks/bricks/bn.py +++ b/blocks/bricks/bn.py @@ -47,7 +47,7 @@ class BatchNormalization(RNGMixin, Feedforward): standard deviations. For example, in order to normalize over all spatial locations in a `(batch_index, channels, height, width)` image, pass `(False, True, True)`. - save_memory : bool, optional + conserve_memory : bool, optional Use an implementation that stores less intermediate state and therefore uses less memory, at the expense of 5-10% speed. Default is `True`. @@ -108,11 +108,11 @@ class BatchNormalization(RNGMixin, Feedforward): """ @lazy(allocation=['input_dim']) def __init__(self, input_dim, broadcastable=None, - save_memory=True, epsilon=1e-4, weights_init=None, + conserve_memory=True, epsilon=1e-4, weights_init=None, biases_init=None, **kwargs): self.input_dim = input_dim self.broadcastable = broadcastable - self.save_memory = save_memory + self.conserve_memory = conserve_memory self.epsilon = 1e-4 self.weights_init = (Constant(1) if weights_init is None else weights_init) @@ -145,7 +145,8 @@ def apply(self, input_, application_call): b = _add_batch_axis(self.b, "b.dimshuffle('x', ...)") # Heavy lifting is done by the Theano utility function. normalized = bn.batch_normalization(input_, W, b, mean, stdev, - mode=('low_mem' if self.save_memory + mode=('low_mem' + if self.conserve_memory else 'high_mem')) return normalized @@ -293,7 +294,7 @@ class BatchNormalizedMLP(MLP): Parameters ---------- - save_memory : bool, optional + conserve_memory : bool, optional See :class:`BatchNormalization`. Notes @@ -312,9 +313,9 @@ class BatchNormalizedMLP(MLP): """ @lazy(allocation=['dims']) def __init__(self, activations, dims, *args, **kwargs): - save_memory = kwargs.pop('save_memory', True) + conserve_memory = kwargs.pop('conserve_memory', True) activations = [ - Sequence([BatchNormalization(save_memory=save_memory).apply, + Sequence([BatchNormalization(conserve_memory=conserve_memory).apply, act.apply], name='batch_norm_activation_{}'.format(i)) for i, act in enumerate(activations) ] @@ -325,15 +326,15 @@ def __init__(self, activations, dims, *args, **kwargs): **kwargs) @property - def save_memory(self): - return self._save_memory + def conserve_memory(self): + return self._conserve_memory - @save_memory.setter - def save_memory(self, value): - self._save_memory = value + @conserve_memory.setter + def conserve_memory(self, value): + self._conserve_memory = value for act in self.activations: assert isinstance(act.children[0], BatchNormalization) - act.children[0].save_memory = value + act.children[0].conserve_memory = value def _push_allocation_config(self): super(BatchNormalizedMLP, self)._push_allocation_config() diff --git a/tests/bricks/test_bn.py b/tests/bricks/test_bn.py index c99022f9..cc2e1f11 100644 --- a/tests/bricks/test_bn.py +++ b/tests/bricks/test_bn.py @@ -20,10 +20,11 @@ def random_unif(rng, dim, low=1, high=10): def test_batch_normalization_allocation_initialization(): """Sanity check allocation & initialization of BN bricks.""" - def check(input_dim, expected_shape, broadcastable=None, save_memory=True): + def check(input_dim, expected_shape, broadcastable=None, + conserve_memory=True): bn = BatchNormalization(input_dim=input_dim, broadcastable=broadcastable, - save_memory=save_memory) + conserve_memory=conserve_memory) if broadcastable is None: if not isinstance(input_dim, collections.Sequence): b_input_dim = (input_dim,) @@ -33,7 +34,7 @@ def check(input_dim, expected_shape, broadcastable=None, save_memory=True): else: input_broadcastable = broadcastable bn.allocate() - assert save_memory == bn.save_memory + assert conserve_memory == bn.conserve_memory assert input_dim == bn.input_dim assert bn.broadcastable == broadcastable assert bn.W.broadcastable == input_broadcastable @@ -61,9 +62,9 @@ def check(input_dim, expected_shape, broadcastable=None, save_memory=True): yield check, (7, 4, 5), (7, 1, 5), (False, True, False), False -def apply_setup(input_dim, broadcastable, save_memory): +def apply_setup(input_dim, broadcastable, conserve_memory): """Common setup code.""" - bn = BatchNormalization(input_dim, broadcastable, save_memory, + bn = BatchNormalization(input_dim, broadcastable, conserve_memory, epsilon=1e-4) bn.initialize() b_len = (len(input_dim) if isinstance(input_dim, collections.Sequence) @@ -75,8 +76,9 @@ def apply_setup(input_dim, broadcastable, save_memory): def test_batch_normalization_inference_apply(): """Test that BatchNormalization.apply works in inference mode.""" - def check(input_dim, variable_dim, broadcastable=None, save_memory=True): - bn, x = apply_setup(input_dim, broadcastable, save_memory) + def check(input_dim, variable_dim, broadcastable=None, + conserve_memory=True): + bn, x = apply_setup(input_dim, broadcastable, conserve_memory) y = bn.apply(x) rng = numpy.random.RandomState((2015, 12, 16)) input_ = random_unif(rng, @@ -119,10 +121,11 @@ def check(input_dim, variable_dim, broadcastable=None, save_memory=True): def test_batch_normalization_train_apply(): - def check(input_dim, variable_dim, broadcastable=None, save_memory=True): + def check(input_dim, variable_dim, broadcastable=None, + conserve_memory=True): # Default epsilon value. epsilon = numpy.cast[theano.config.floatX](1e-4) - bn, x = apply_setup(input_dim, broadcastable, save_memory) + bn, x = apply_setup(input_dim, broadcastable, conserve_memory) with bn: y = bn.apply(x) cg = ComputationGraph([y]) @@ -292,11 +295,11 @@ def test_batch_normalized_mlp_transformed(): assert len(replaced) == 4 # 2 means, 2 standard deviations -def test_batch_normalized_mlp_save_memory_propagated(): - """Test that setting save_memory on a BatchNormalizedMLP works.""" +def test_batch_normalized_mlp_conserve_memory_propagated(): + """Test that setting conserve_memory on a BatchNormalizedMLP works.""" mlp = BatchNormalizedMLP([Tanh(), Tanh()], [5, 7, 9], - save_memory=False) - assert not any(act.children[0].save_memory for act in mlp.activations) - mlp.save_memory = True - assert mlp.save_memory - assert all(act.children[0].save_memory for act in mlp.activations) + conserve_memory=False) + assert not any(act.children[0].conserve_memory for act in mlp.activations) + mlp.conserve_memory = True + assert mlp.conserve_memory + assert all(act.children[0].conserve_memory for act in mlp.activations) From d35c22b011de98a41038af55701ef9bcda3ac058 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Wed, 20 Jan 2016 18:15:02 -0500 Subject: [PATCH 055/129] Amend error message following review. --- blocks/bricks/bn.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blocks/bricks/bn.py b/blocks/bricks/bn.py index 04f4b8fe..29e181f3 100644 --- a/blocks/bricks/bn.py +++ b/blocks/bricks/bn.py @@ -283,7 +283,7 @@ def __init__(self, input_dim, **kwargs): if not isinstance(input_dim, collections.Sequence) or len(input_dim) < 2: raise ValueError('expected input_dim to be length >= 2 ' - '(channels, height, width)') + 'e.g. (channels, height, width)') broadcastable = (False,) + ((True,) * (len(input_dim) - 1)) kwargs.setdefault('broadcastable', broadcastable) super(SpatialBatchNormalization, self).__init__(input_dim, **kwargs) From a26e2c642582a43657be0ffb20ca86e214c05113 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Wed, 20 Jan 2016 18:16:55 -0500 Subject: [PATCH 056/129] Simplify generator expression after review. --- blocks/bricks/bn.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blocks/bricks/bn.py b/blocks/bricks/bn.py index 29e181f3..98824167 100644 --- a/blocks/bricks/bn.py +++ b/blocks/bricks/bn.py @@ -178,7 +178,7 @@ def _allocate(self): input_dim = ((self.input_dim,) if not isinstance(self.input_dim, collections.Sequence) else self.input_dim) - broadcastable = (tuple(False for _ in range(len(input_dim))) + broadcastable = (tuple(False for _ in input_dim) if self.broadcastable is None else self.broadcastable) if len(input_dim) != len(broadcastable): raise ValueError("input_dim and broadcastable must be same length") From e22b151641ae02c628acb89116ace2826649ffd5 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Wed, 20 Jan 2016 18:17:49 -0500 Subject: [PATCH 057/129] Add an assertion following review. --- blocks/bricks/bn.py | 1 + 1 file changed, 1 insertion(+) diff --git a/blocks/bricks/bn.py b/blocks/bricks/bn.py index 98824167..f180e5c4 100644 --- a/blocks/bricks/bn.py +++ b/blocks/bricks/bn.py @@ -343,4 +343,5 @@ def _push_allocation_config(self): # of each linear transformation. Exclude the first dimension, # which is the input dimension. for act, dim in equizip(self.activations, self.dims[1:]): + assert isinstance(act.children[0], BatchNormalization) act.children[0].input_dim = dim From 2ea41a887ce20b9834c29a99116e0e0cb0251e10 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Wed, 20 Jan 2016 18:19:25 -0500 Subject: [PATCH 058/129] Improve robustness of context manager logic. --- blocks/graph/bn.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/blocks/graph/bn.py b/blocks/graph/bn.py index 421141a8..ab061ce8 100644 --- a/blocks/graph/bn.py +++ b/blocks/graph/bn.py @@ -78,11 +78,13 @@ def batch_normalization(*bricks): bn = find_bricks(bricks, lambda b: isinstance(b, BatchNormalization)) # Can't use either nested() (deprecated) nor ExitStack (not available # on Python 2.7). Well, that sucks. - for brick in bn: - brick.__enter__() - yield - for brick in bn: - brick.__exit__() + try: + for brick in bn: + brick.__enter__() + yield + finally: + for brick in bn[::-1]: + brick.__exit__() def apply_batch_normalization(computation_graph): From c70a26bed1fa2907353120e5a34f5a4a931c0616 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Wed, 20 Jan 2016 18:22:07 -0500 Subject: [PATCH 059/129] Fix Scrutinizer error from 6ba3364. --- blocks/bricks/bn.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/blocks/bricks/bn.py b/blocks/bricks/bn.py index f180e5c4..cc87797f 100644 --- a/blocks/bricks/bn.py +++ b/blocks/bricks/bn.py @@ -315,8 +315,10 @@ class BatchNormalizedMLP(MLP): def __init__(self, activations, dims, *args, **kwargs): conserve_memory = kwargs.pop('conserve_memory', True) activations = [ - Sequence([BatchNormalization(conserve_memory=conserve_memory).apply, - act.apply], name='batch_norm_activation_{}'.format(i)) + Sequence([ + BatchNormalization(conserve_memory=conserve_memory).apply, + act.apply + ], name='batch_norm_activation_{}'.format(i)) for i, act in enumerate(activations) ] # Batch normalization bricks incorporate a bias, so there's no From 5ba9b381965ef5920a79776d28d93901c9ea2789 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Wed, 20 Jan 2016 18:39:06 -0500 Subject: [PATCH 060/129] Add comment and assertion following review. --- blocks/graph/bn.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/blocks/graph/bn.py b/blocks/graph/bn.py index ab061ce8..21f7884f 100644 --- a/blocks/graph/bn.py +++ b/blocks/graph/bn.py @@ -8,6 +8,8 @@ import collections import contextlib +import theano + from ..roles import BATCH_NORM_OFFSET, BATCH_NORM_DIVISOR, INPUT, OUTPUT from ..utils import find_bricks @@ -153,6 +155,9 @@ def get_app_call_dict(variable_filter): update_pairs = [] for app_call in inputs: old_output = outputs[app_call] + # Get rid of the copy made on the way into the original apply. + assert (inputs[app_call].owner.op == theano.tensor.Elemwise and + inputs[app_call].owner.op.scalar_op == theano.scalar.Identity) unpacked = inputs[app_call].owner.inputs[0] with app_call.application.brick: new_output = app_call.application.brick.apply(unpacked) From 7efa95666286299d56bbc30dee707a666127fd45 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Wed, 20 Jan 2016 20:54:44 -0500 Subject: [PATCH 061/129] Correct the assertion. --- blocks/graph/bn.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/blocks/graph/bn.py b/blocks/graph/bn.py index 21f7884f..1ee5aa58 100644 --- a/blocks/graph/bn.py +++ b/blocks/graph/bn.py @@ -156,8 +156,9 @@ def get_app_call_dict(variable_filter): for app_call in inputs: old_output = outputs[app_call] # Get rid of the copy made on the way into the original apply. - assert (inputs[app_call].owner.op == theano.tensor.Elemwise and - inputs[app_call].owner.op.scalar_op == theano.scalar.Identity) + op = inputs[app_call].owner.op + assert (isinstance(op, theano.tensor.Elemwise) and + isinstance(op.scalar_op, theano.scalar.basic.Identity)) unpacked = inputs[app_call].owner.inputs[0] with app_call.application.brick: new_output = app_call.application.brick.apply(unpacked) From 9805b7348d449987962424f388d1906d8e5de665 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Wed, 20 Jan 2016 21:59:14 -0500 Subject: [PATCH 062/129] Improve docs. Add example for apply_... --- blocks/graph/bn.py | 48 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/blocks/graph/bn.py b/blocks/graph/bn.py index 1ee5aa58..3992b900 100644 --- a/blocks/graph/bn.py +++ b/blocks/graph/bn.py @@ -36,9 +36,6 @@ def batch_normalization(*bricks): Examples -------- First, we'll create a :class:`~blocks.bricks.BatchNormalizedMLP`. - This behaves almost exactly like a regular :class:`~blocks.bricks.MLP` - except that it contains :class:`~blocks.bricks.BatchNormalization` - bricks placed before each activation function. >>> import theano >>> from blocks.bricks import BatchNormalizedMLP, Tanh @@ -47,13 +44,13 @@ def batch_normalization(*bricks): ... weights_init=IsotropicGaussian(0.1), ... biases_init=Constant(0)) >>> mlp.initialize() - >>> x = theano.tensor.matrix('x') - First, we'll construct an output variable as we would normally. This + Now, we'll construct an output variable as we would normally. This is getting normalized by the *population* statistics, which by default are initialized to 0 (mean) and 1 (standard deviation), respectively. + >>> x = theano.tensor.matrix() >>> y = mlp.apply(x) And now, to construct an output with batch normalization enabled, @@ -94,13 +91,13 @@ def apply_batch_normalization(computation_graph): Parameters ---------- - computation_graph : instance of :class:`ComputationGraph` + computation_graph : :class:`~blocks.graph.ComputationGraph` The computation graph containing :class:`BatchNormalization` brick applications. Returns ------- - batch_normed_computation_graph : instance of :class:`ComputationGraph` + batch_normed_graph : :class:`~blocks.graph.ComputationGraph` The computation graph, with :class:`BatchNormalization` applications transformed to use minibatch statistics instead of accumulated population statistics. @@ -118,6 +115,43 @@ def apply_batch_normalization(computation_graph): :func:`batch_normalization`, for an alternative method to produce batch normalized graphs. + Examples + -------- + First, we'll create a :class:`~blocks.bricks.BatchNormalizedMLP`. + + >>> import theano + >>> from blocks.bricks import BatchNormalizedMLP, Tanh + >>> from blocks.initialization import Constant, IsotropicGaussian + >>> mlp = BatchNormalizedMLP([Tanh(), Tanh()], [4, 5, 6], + ... weights_init=IsotropicGaussian(0.1), + ... biases_init=Constant(0)) + >>> mlp.initialize() + + Now, we'll construct an output variable as we would normally. This + is getting normalized by the *population* statistics, which by + default are initialized to 0 (mean) and 1 (standard deviation), + respectively. + + >>> x = theano.tensor.matrix() + >>> y = mlp.apply(x) + + Finally, we'll create a :class:`~blocks.graph.ComputationGraph` + and transform it to switch to minibatch standardization: + + >>> from blocks.graph import ComputationGraph + >>> cg, _ = apply_batch_normalization(ComputationGraph([y])) + >>> y_bn = cg.outputs[0] + + Let's verify that these two graphs behave differently on the + same data: + + >>> import numpy + >>> data = numpy.arange(12, dtype=theano.config.floatX).reshape(3, 4) + >>> inf_y = y.eval({x: data}) + >>> trn_y = y_bn.eval({x: data}) + >>> numpy.allclose(inf_y, trn_y) + False + """ # Avoid circular imports. from blocks.bricks import BatchNormalization From cf4f4dba75e66bda4e94ea0dcc95626d901967af Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Wed, 20 Jan 2016 23:27:25 -0500 Subject: [PATCH 063/129] Ensure correct nesting of context managers. --- blocks/bricks/bn.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/blocks/bricks/bn.py b/blocks/bricks/bn.py index cc87797f..8ded7963 100644 --- a/blocks/bricks/bn.py +++ b/blocks/bricks/bn.py @@ -118,7 +118,7 @@ def __init__(self, input_dim, broadcastable=None, else weights_init) self.biases_init = (Constant(0) if biases_init is None else biases_init) - self._training_mode = False + self._training_mode = [] super(BatchNormalization, self).__init__(**kwargs) @application(inputs=['input_'], outputs=['output']) @@ -151,10 +151,10 @@ def apply(self, input_, application_call): return normalized def __enter__(self): - self._training_mode = True + self._training_mode.append(True) def __exit__(self, *exc_info): - self._training_mode = False + self._training_mode.pop() def _compute_training_statistics(self, input_): axes = (0,) + tuple((i + 1) for i, b in From f41c28662752a4705c16c553cc83eb4707069524 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Thu, 21 Jan 2016 15:18:45 -0500 Subject: [PATCH 064/129] Improve _add_batch_axis. --- blocks/bricks/bn.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/blocks/bricks/bn.py b/blocks/bricks/bn.py index 8ded7963..5bdb3e2f 100644 --- a/blocks/bricks/bn.py +++ b/blocks/bricks/bn.py @@ -19,10 +19,10 @@ from .interfaces import RNGMixin -def _add_batch_axis(var, name=None): - """Prepend a singleton axis to a TensorVariable.""" - new_var = var.dimshuffle('x', *list(range(var.ndim))) - new_var.name = name +def _add_batch_axis(var): + """Prepend a singleton axis to a TensorVariable and name it.""" + new_var = new_var = tensor.shape_padleft(var) + new_var.name = 'shape_padleft({})'.format(var.name) return new_var @@ -141,8 +141,8 @@ def apply(self, input_, application_call): [self, application_call]) _add_role_and_annotate(stdev, BATCH_NORM_DIVISOR, [self, application_call]) - W = _add_batch_axis(self.W, "W.dimshuffle('x'...)") - b = _add_batch_axis(self.b, "b.dimshuffle('x', ...)") + W = _add_batch_axis(self.W) + b = _add_batch_axis(self.b) # Heavy lifting is done by the Theano utility function. normalized = bn.batch_normalization(input_, W, b, mean, stdev, mode=('low_mem' @@ -170,8 +170,8 @@ def _compute_training_statistics(self, input_): return mean, stdev def _prepare_population_statistics(self): - mean = _add_batch_axis(self.population_mean, 'population_offset') - stdev = _add_batch_axis(self.population_stdev, 'population_divisor') + mean = _add_batch_axis(self.population_mean) + stdev = _add_batch_axis(self.population_stdev) return mean, stdev def _allocate(self): From 6895b87169d9c67fb47be6e12367676bcc18e7f2 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Thu, 21 Jan 2016 15:18:56 -0500 Subject: [PATCH 065/129] Remove needless properties. --- blocks/bricks/bn.py | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/blocks/bricks/bn.py b/blocks/bricks/bn.py index 5bdb3e2f..d6c5d8c1 100644 --- a/blocks/bricks/bn.py +++ b/blocks/bricks/bn.py @@ -187,12 +187,12 @@ def _allocate(self): broadcastable = broadcastable # "gamma", from the Ioffe & Szegedy manuscript. - self._W = shared_floatx_nans(var_dim, name='batch_norm_scale', - broadcastable=broadcastable) + self.W = shared_floatx_nans(var_dim, name='batch_norm_scale', + broadcastable=broadcastable) # "beta", from the Ioffe & Szegedy manuscript. - self._b = shared_floatx_nans(var_dim, name='batch_norm_shift', - broadcastable=broadcastable) + self.b = shared_floatx_nans(var_dim, name='batch_norm_shift', + broadcastable=broadcastable) add_role(self.W, WEIGHT) add_role(self.b, BIAS) self.parameters.append(self.W) @@ -209,14 +209,6 @@ def _allocate(self): add_role(self.population_mean, BATCH_NORM_POPULATION_MEAN) add_role(self.population_stdev, BATCH_NORM_POPULATION_STDEV) - @property - def W(self): - return self._W - - @property - def b(self): - return self._b - def _initialize(self): self.biases_init.initialize(self.b, self.rng) self.weights_init.initialize(self.W, self.rng) From b03fffc1ac19ddeb19a191d71e5bb0fda9f83f0e Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Thu, 21 Jan 2016 15:23:37 -0500 Subject: [PATCH 066/129] Fix typo in epsilon assignment. --- blocks/bricks/bn.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blocks/bricks/bn.py b/blocks/bricks/bn.py index d6c5d8c1..e588a71c 100644 --- a/blocks/bricks/bn.py +++ b/blocks/bricks/bn.py @@ -113,7 +113,7 @@ def __init__(self, input_dim, broadcastable=None, self.input_dim = input_dim self.broadcastable = broadcastable self.conserve_memory = conserve_memory - self.epsilon = 1e-4 + self.epsilon = epsilon self.weights_init = (Constant(1) if weights_init is None else weights_init) self.biases_init = (Constant(0) if biases_init is None From 474d3f109fa14a9032275eb6bfaa74372d54cd8e Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Thu, 21 Jan 2016 18:10:29 -0500 Subject: [PATCH 067/129] Fix subtle bug with mutable metadata. --- blocks/bricks/bn.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/blocks/bricks/bn.py b/blocks/bricks/bn.py index e588a71c..81fa977d 100644 --- a/blocks/bricks/bn.py +++ b/blocks/bricks/bn.py @@ -129,7 +129,10 @@ def apply(self, input_, application_call): mean, stdev = self._prepare_population_statistics() # Useful for filtration of calls that were already made in # training mode when doing graph transformations. - application_call.metadata['training_mode'] = self._training_mode + # Very important to cast to bool, as self._training_mode is + # normally a list (to support nested context managers), which would + # otherwise get passed by reference and be remotely mutated. + application_call.metadata['training_mode'] = bool(self._training_mode) # Useful for retrieving a list of updates for population # statistics. Ditch the broadcastable first axis, though, to # make it the same dimensions as the population mean and stdev From d81c03c29fffdaa4de1892f4516db9d9b4394895 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Thu, 21 Jan 2016 18:10:51 -0500 Subject: [PATCH 068/129] Annotate population parameters with brick. --- blocks/bricks/bn.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/blocks/bricks/bn.py b/blocks/bricks/bn.py index 81fa977d..9e95206a 100644 --- a/blocks/bricks/bn.py +++ b/blocks/bricks/bn.py @@ -212,6 +212,11 @@ def _allocate(self): add_role(self.population_mean, BATCH_NORM_POPULATION_MEAN) add_role(self.population_stdev, BATCH_NORM_POPULATION_STDEV) + # Normally these would get annotated by an AnnotatingList, but they + # aren't in self.parameters. + add_annotation(self.population_mean, self) + add_annotation(self.population_stdev, self) + def _initialize(self): self.biases_init.initialize(self.b, self.rng) self.weights_init.initialize(self.W, self.rng) From 09da496324851f4d1a9d4a7bea14e370da65c73a Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Thu, 21 Jan 2016 18:11:50 -0500 Subject: [PATCH 069/129] Add batch_normalization_updates. --- blocks/graph/__init__.py | 1 + blocks/graph/bn.py | 105 +++++++++++++++++++++++++++++++-------- tests/bricks/test_bn.py | 12 ++--- tests/graph/test_bn.py | 81 ++++++++++++++++++++++++++++-- 4 files changed, 164 insertions(+), 35 deletions(-) diff --git a/blocks/graph/__init__.py b/blocks/graph/__init__.py index 70424447..94dbaedd 100644 --- a/blocks/graph/__init__.py +++ b/blocks/graph/__init__.py @@ -20,6 +20,7 @@ shared_floatx_zeros, shared_like) from .annotations import add_annotation, Annotation # noqa from .bn import batch_normalization, apply_batch_normalization # noqa +from .bn import batch_normalization_updates # noqa logger = logging.getLogger(__name__) diff --git a/blocks/graph/bn.py b/blocks/graph/bn.py index 3992b900..88810d78 100644 --- a/blocks/graph/bn.py +++ b/blocks/graph/bn.py @@ -7,13 +7,27 @@ """ import collections import contextlib +from functools import partial import theano +from toolz import isdistinct from ..roles import BATCH_NORM_OFFSET, BATCH_NORM_DIVISOR, INPUT, OUTPUT from ..utils import find_bricks +def _training_mode_application_calls(application_calls): + """Filter for application calls made in 'training mode'.""" + from ..bricks import BatchNormalization + out = [] + for app_call in application_calls: + assert isinstance(app_call.application.brick, BatchNormalization) + assert app_call.application.application == BatchNormalization.apply + if app_call.metadata.get('training_mode', False): + out.append(app_call) + return out + + @contextlib.contextmanager def batch_normalization(*bricks): r"""Context manager to run batch normalization in "training mode". @@ -101,14 +115,6 @@ def apply_batch_normalization(computation_graph): The computation graph, with :class:`BatchNormalization` applications transformed to use minibatch statistics instead of accumulated population statistics. - update_pairs : list of tuples - A list of 2-tuples where the first element of each tuple is the - shared variable containing a "population" mean or standard - deviation, and the second is a Theano variable for the - corresponding statistics on a minibatch. Note that multiple - applications of a single :class:`blocks.bricks.BatchNormalization` - may appear in the graph, and therefore a single population variable - may map to several different minibatch variables. See Also -------- @@ -139,7 +145,7 @@ def apply_batch_normalization(computation_graph): and transform it to switch to minibatch standardization: >>> from blocks.graph import ComputationGraph - >>> cg, _ = apply_batch_normalization(ComputationGraph([y])) + >>> cg = apply_batch_normalization(ComputationGraph([y])) >>> y_bn = cg.outputs[0] Let's verify that these two graphs behave differently on the @@ -178,15 +184,14 @@ def get_app_call_dict(variable_filter): # Remove any ApplicationCalls that were not generated by apply(), or # were generated by an apply() while already in training mode. - remove = filter(lambda a: (a.metadata.get('training_mode', False) or - a.application.application != - BatchNormalization.apply), inputs.keys()) - for app_call in remove: - for mapping in (inputs, outputs, means, stdevs): - del mapping[app_call] + app_calls = inputs.keys() + remove = _training_mode_application_calls(app_calls) + for app_call in app_calls: + if app_call in remove: + for mapping in (inputs, outputs, means, stdevs): + del mapping[app_call] replacements = [] - update_pairs = [] for app_call in inputs: old_output = outputs[app_call] # Get rid of the copy made on the way into the original apply. @@ -196,10 +201,66 @@ def get_app_call_dict(variable_filter): unpacked = inputs[app_call].owner.inputs[0] with app_call.application.brick: new_output = app_call.application.brick.apply(unpacked) + new_app_call = get_application_call(new_output) + assert new_app_call.metadata['training_mode'] replacements.append((old_output, new_output)) - new_app_call = get_application_call(new_output) - update_pairs.append((app_call.application.brick.population_mean, - new_app_call.metadata['offset'])) - update_pairs.append((app_call.application.brick.population_stdev, - new_app_call.metadata['divisor'])) - return computation_graph.replace(replacements), update_pairs + return computation_graph.replace(replacements) + + +def batch_normalization_updates(training_graph, allow_duplicates=False): + """Extract correspondences for learning BN population statistics. + + Parameters + ---------- + training_graph : :class:`~blocks.graph.ComputationGraph` + A graph of expressions wherein "training mode" batch normalization + is taking place. + allow_duplicates : bool, optional + If `True`, allow multiple training-mode application calls from the + same :class:`~blocks.bricks.BatchNormalization` instance, and + return pairs corresponding to all of them. It's then the user's + responsibility to do something sensible to resolve the duplicates. + + Returns + ------- + update_pairs : list of tuples + A list of 2-tuples where the first element of each tuple is the + shared variable containing a "population" mean or standard + deviation, and the second is a Theano variable for the + corresponding statistics on a minibatch. Note that multiple + applications of a single :class:`blocks.bricks.BatchNormalization` + may appear in the graph, and therefore a single population variable + may map to several different minibatch variables. + + Notes + ----- + Used in their raw form, these updates will simply overwrite the + population statistics with the minibatch statistics at every gradient + step. You will probably want to transform these pairs into something + more sensible, such as keeping a moving average of minibatch values, + or accumulating an average over the entire training set once every few + epochs. + + """ + from ..bricks import BatchNormalization + from ..filter import VariableFilter, get_application_call + var_filter = VariableFilter(bricks=[BatchNormalization], roles=[OUTPUT]) + all_app_calls = map(get_application_call, var_filter(training_graph)) + train_app_calls = _training_mode_application_calls(all_app_calls) + if len(train_app_calls) == 0: + raise ValueError("no training mode BatchNormalization " + "applications found in graph") + bricks = [c.application.brick for c in train_app_calls] + + if not allow_duplicates and not isdistinct(bricks): + raise ValueError('multiple applications of the same ' + 'BatchNormalization brick; pass allow_duplicates ' + '= True to override this check') + + def extract_pair(brick_attribute, metadata_key, app_call): + return (getattr(app_call.application.brick, brick_attribute), + app_call.metadata[metadata_key]) + + mean_pair = partial(extract_pair, 'population_mean', 'offset') + stdev_pair = partial(extract_pair, 'population_stdev', 'divisor') + return sum([[mean_pair(a), stdev_pair(a)] for a in train_app_calls], []) diff --git a/tests/bricks/test_bn.py b/tests/bricks/test_bn.py index cc2e1f11..10ada9ec 100644 --- a/tests/bricks/test_bn.py +++ b/tests/bricks/test_bn.py @@ -9,7 +9,7 @@ from blocks.bricks.conv import (Convolutional, ConvolutionalSequence, MaxPooling, AveragePooling) from blocks.initialization import Constant -from blocks.graph import ComputationGraph, apply_batch_normalization +from blocks.graph import batch_normalization def random_unif(rng, dim, low=1, high=10): @@ -127,10 +127,7 @@ def check(input_dim, variable_dim, broadcastable=None, epsilon = numpy.cast[theano.config.floatX](1e-4) bn, x = apply_setup(input_dim, broadcastable, conserve_memory) with bn: - y = bn.apply(x) - cg = ComputationGraph([y]) - new_cg, _ = apply_batch_normalization(cg) - y_hat = new_cg.outputs[0] + y_hat = bn.apply(x) rng = numpy.random.RandomState((2015, 12, 16)) input_ = random_unif(rng, (9,) + @@ -290,9 +287,8 @@ def test_batch_normalized_mlp_transformed(): """Smoke test that a graph involving a BatchNormalizedMLP transforms.""" x = tensor.matrix('x') mlp = BatchNormalizedMLP([Tanh(), Tanh()], [5, 7, 9]) - cg = ComputationGraph([mlp.apply(x)]) - new_cg, replaced = apply_batch_normalization(cg) - assert len(replaced) == 4 # 2 means, 2 standard deviations + with batch_normalization(mlp): + mlp.apply(x) def test_batch_normalized_mlp_conserve_memory_propagated(): diff --git a/tests/graph/test_bn.py b/tests/graph/test_bn.py index 19c56166..aaaefea9 100644 --- a/tests/graph/test_bn.py +++ b/tests/graph/test_bn.py @@ -1,13 +1,21 @@ -from blocks.bricks import BatchNormalization, Sequence, Tanh, MLP -from blocks.graph import (ComputationGraph, batch_normalization, - apply_batch_normalization) -from blocks.initialization import Constant +from functools import partial import numpy from numpy.testing import assert_allclose import theano from theano import tensor +from blocks.bricks import (BatchNormalization, Sequence, Tanh, MLP, + BatchNormalizedMLP) +from blocks.filter import get_brick +from blocks.graph import (ComputationGraph, batch_normalization, + apply_batch_normalization, + batch_normalization_updates) +from blocks.initialization import Constant +from blocks.roles import (has_roles, BATCH_NORM_POPULATION_MEAN, + BATCH_NORM_POPULATION_STDEV) +from blocks.utils import is_shared_variable + def test_batch_normalization_simple(): x = tensor.matrix() @@ -53,7 +61,7 @@ def test_apply_batch_normalization_nested(): weights_init=Constant(0.4), biases_init=Constant(1)) mlp.initialize() y = mlp.apply(x) - cg, _ = apply_batch_normalization(ComputationGraph([y])) + cg = apply_batch_normalization(ComputationGraph([y])) y_bn = cg.outputs[0] rng = numpy.random.RandomState((2016, 1, 18)) x_ = rng.uniform(size=batch_dims).astype(theano.config.floatX) @@ -64,3 +72,66 @@ def test_apply_batch_normalization_nested(): y_expected = numpy.tanh((z_ - z_.mean(axis=0)) / numpy.sqrt(z_.var(axis=0) + eps)) assert_allclose(y_, y_expected, rtol=1e-3) + + +class TestSimpleBatchNormalizationUpdates(object): + def setUp(self): + self.mlp = BatchNormalizedMLP([Tanh(), Tanh()], [5, 7, 9]) + self.x = tensor.matrix() + + def simple_assertions(self, updates, num_bricks=2, num_updates=4): + """Shared assertions for simple tests.""" + assert len(updates) == num_updates + assert all(is_shared_variable(u[0]) for u in updates) + # This order is somewhat arbitrary and implementation_dependent + means = set(filter(partial(has_roles, + roles=[BATCH_NORM_POPULATION_MEAN]), + [u[0] for u in updates])) + stdevs = set(filter(partial(has_roles, + roles=[BATCH_NORM_POPULATION_STDEV]), + [u[0] for u in updates])) + assert means.isdisjoint(stdevs) + assert len(set(get_brick(v) for v in means)) == num_bricks + assert len(set(get_brick(v) for v in stdevs)) == num_bricks + + def test_batch_normalization_updates(self): + """Test that batch_normalization_updates works as expected.""" + with batch_normalization(self.mlp): + y_bn = self.mlp.apply(self.x) + graph = ComputationGraph([y_bn]) + updates = batch_normalization_updates(graph) + self.simple_assertions(updates) + + def test_batch_normalization_updates_non_training_applications(self): + """Test updates extracton in graph with non-training apply.""" + y = self.mlp.apply(self.x) + with batch_normalization(self.mlp): + y_bn = self.mlp.apply(self.x) + graph = ComputationGraph([y_bn, y]) + updates = batch_normalization_updates(graph) + self.simple_assertions(updates) + + def test_batch_normalization_updates_no_training(self): + """Test for exception if there are no training-mode nodes.""" + y = self.mlp.apply(self.x) + graph = ComputationGraph([y]) + numpy.testing.assert_raises(ValueError, batch_normalization_updates, + graph) + + def test_batch_normalization_updates_duplicates_error(self): + """Test that we get an error by default on multiple apply.""" + with batch_normalization(self.mlp): + y = self.mlp.apply(self.x) + y2 = self.mlp.apply(self.x) + graph = ComputationGraph([y, y2]) + numpy.testing.assert_raises(ValueError, batch_normalization_updates, + graph) + + def test_batch_normalization_updates_allow_duplicates(self): + """Test batch_normalization_updates(.., allow_duplicates=True).""" + with batch_normalization(self.mlp): + y = self.mlp.apply(self.x) + y2 = self.mlp.apply(self.x) + graph = ComputationGraph([y, y2]) + updates = batch_normalization_updates(graph, allow_duplicates=True) + self.simple_assertions(updates, num_bricks=2, num_updates=8) From 333b49cd32fd59d0f73c0a51e4fd07b83d42288d Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Thu, 21 Jan 2016 18:50:19 -0500 Subject: [PATCH 070/129] Rename W, b -> scale, shift. Cesar makes a good point that using the VariableFilter to select all weights in a model, you might not want to select batch norm scalings, etc. I've given them functional names of "scale" and "shift" instead of obscure Greek letters that you have to have read the paper (and remember which is which). BATCH_NORM_SHIFT_PARAMETER inherits from BIAS, since there is no real difference between it and a normal bias, and you might want to select all the biases in a BatchNormalizedMLP, and those are the only ones really. BATCH_NORM_SCALE_PARAMETER simply inherits from PARAMETER, because it's a bit different in usage and semantics than a normal linear transformation and plays a different role in neural net models. --- blocks/bricks/bn.py | 53 +++++++++++++++++++++-------------------- blocks/roles.py | 19 +++++++++++++++ tests/bricks/test_bn.py | 30 ++++++++++++----------- 3 files changed, 62 insertions(+), 40 deletions(-) diff --git a/blocks/bricks/bn.py b/blocks/bricks/bn.py index 9e95206a..1ec1fd1b 100644 --- a/blocks/bricks/bn.py +++ b/blocks/bricks/bn.py @@ -8,9 +8,10 @@ from ..graph import add_annotation from ..initialization import Constant -from ..roles import (WEIGHT, BIAS, BATCH_NORM_POPULATION_MEAN, +from ..roles import (BATCH_NORM_POPULATION_MEAN, BATCH_NORM_POPULATION_STDEV, BATCH_NORM_OFFSET, BATCH_NORM_DIVISOR, BATCH_NORM_MINIBATCH_ESTIMATE, + BATCH_NORM_SHIFT_PARAMETER, BATCH_NORM_SCALE_PARAMETER, add_role) from ..utils import (shared_floatx_zeros, shared_floatx, shared_floatx_nans) @@ -56,11 +57,11 @@ class BatchNormalization(RNGMixin, Feedforward): computation (when the brick is run in training mode). Added to the variance inside the square root, as in the batch normalization paper. - weights_init : object, optional + scale_init : object, optional Initialization object to use for the learned scaling parameter ($\\gamma$ in [BN]_). By default, uses constant initialization of 1. - biases_init : object, optional + shift_init : object, optional Initialization object to use for the learned shift parameter ($\\beta$ in [BN]_). By default, uses constant initialization of 0. @@ -89,11 +90,11 @@ class BatchNormalization(RNGMixin, Feedforward): brick introduces scales and shift parameters (tagged with the `PARAMETER` role) that, in the absence of batch normalization, usually makes things unstable. If you must do this, filter for and - remove `BATCH_NORM_SHIFT` and `BATCH_NORM_SCALE` from the list of - parameters you are training, and this brick should behave as a - (somewhat expensive) no-op. + remove `BATCH_NORM_SHIFT_PARAMETER` and `BATCH_NORM_SCALE_PARAMETER` + from the list of parameters you are training, and this brick should + behave as a (somewhat expensive) no-op. - This Brick accepts `weights_init` and `biases_init` arguments but is + This Brick accepts `scale_init` and `shift_init` arguments but is *not* an instance of :class:`~blocks.bricks.Initializable`, and will therefore not receive pushed initialization config from any parent brick. In almost all cases, you will probably want to stick with the @@ -108,16 +109,16 @@ class BatchNormalization(RNGMixin, Feedforward): """ @lazy(allocation=['input_dim']) def __init__(self, input_dim, broadcastable=None, - conserve_memory=True, epsilon=1e-4, weights_init=None, - biases_init=None, **kwargs): + conserve_memory=True, epsilon=1e-4, scale_init=None, + shift_init=None, **kwargs): self.input_dim = input_dim self.broadcastable = broadcastable self.conserve_memory = conserve_memory self.epsilon = epsilon - self.weights_init = (Constant(1) if weights_init is None - else weights_init) - self.biases_init = (Constant(0) if biases_init is None - else biases_init) + self.scale_init = (Constant(1) if scale_init is None + else scale_init) + self.shift_init = (Constant(0) if shift_init is None + else shift_init) self._training_mode = [] super(BatchNormalization, self).__init__(**kwargs) @@ -144,10 +145,10 @@ def apply(self, input_, application_call): [self, application_call]) _add_role_and_annotate(stdev, BATCH_NORM_DIVISOR, [self, application_call]) - W = _add_batch_axis(self.W) - b = _add_batch_axis(self.b) + scale = _add_batch_axis(self.scale) + shift = _add_batch_axis(self.shift) # Heavy lifting is done by the Theano utility function. - normalized = bn.batch_normalization(input_, W, b, mean, stdev, + normalized = bn.batch_normalization(input_, scale, shift, mean, stdev, mode=('low_mem' if self.conserve_memory else 'high_mem')) @@ -190,16 +191,16 @@ def _allocate(self): broadcastable = broadcastable # "gamma", from the Ioffe & Szegedy manuscript. - self.W = shared_floatx_nans(var_dim, name='batch_norm_scale', - broadcastable=broadcastable) + self.scale = shared_floatx_nans(var_dim, name='batch_norm_scale', + broadcastable=broadcastable) # "beta", from the Ioffe & Szegedy manuscript. - self.b = shared_floatx_nans(var_dim, name='batch_norm_shift', - broadcastable=broadcastable) - add_role(self.W, WEIGHT) - add_role(self.b, BIAS) - self.parameters.append(self.W) - self.parameters.append(self.b) + self.shift = shared_floatx_nans(var_dim, name='batch_norm_shift', + broadcastable=broadcastable) + add_role(self.scale, BATCH_NORM_SCALE_PARAMETER) + add_role(self.shift, BATCH_NORM_SHIFT_PARAMETER) + self.parameters.append(self.scale) + self.parameters.append(self.shift) # These aren't technically parameters, in that they should not be # learned using the same cost function as other model parameters. @@ -218,8 +219,8 @@ def _allocate(self): add_annotation(self.population_stdev, self) def _initialize(self): - self.biases_init.initialize(self.b, self.rng) - self.weights_init.initialize(self.W, self.rng) + self.shift_init.initialize(self.shift, self.rng) + self.scale_init.initialize(self.scale, self.rng) # Needed for the Feedforward interface. @property diff --git a/blocks/roles.py b/blocks/roles.py index 2256eb6c..d672189c 100644 --- a/blocks/roles.py +++ b/blocks/roles.py @@ -234,3 +234,22 @@ class BatchNormMinibatchEstimateRole(BatchNormGraphVariableRole): #: role added to variables that are the result of a batch normalization # replacement, rather than the original population statistics variables. BATCH_NORM_MINIBATCH_ESTIMATE = BatchNormMinibatchEstimateRole() + + +class BatchNormScaleParameterRole(ParameterRole): + pass + +#: role given to the scale parameter, referred to as "scale" in the +# batch normalization manuscript, applied after normalizing. +BATCH_NORM_SCALE_PARAMETER = BatchNormScaleParameterRole() + + +class BatchNormShiftParameterRole(BiasRole): + pass + +#: role given to the shift parameter, referred to as "beta" in the +# batch normalization manuscript, applied after normalizing and scaling. +# Inherits from BIAS, because there really is no functional difference +# with a normal bias, and indeed these are the only biases present +# inside a BatchNormalizedMLP. +BATCH_NORM_SHIFT_PARAMETER = BatchNormShiftParameterRole() diff --git a/tests/bricks/test_bn.py b/tests/bricks/test_bn.py index 10ada9ec..7aef6e58 100644 --- a/tests/bricks/test_bn.py +++ b/tests/bricks/test_bn.py @@ -9,7 +9,8 @@ from blocks.bricks.conv import (Convolutional, ConvolutionalSequence, MaxPooling, AveragePooling) from blocks.initialization import Constant -from blocks.graph import batch_normalization +from blocks.graph import (ComputationGraph, batch_normalization, + batch_normalization_updates) def random_unif(rng, dim, low=1, high=10): @@ -37,23 +38,23 @@ def check(input_dim, expected_shape, broadcastable=None, assert conserve_memory == bn.conserve_memory assert input_dim == bn.input_dim assert bn.broadcastable == broadcastable - assert bn.W.broadcastable == input_broadcastable - assert bn.b.broadcastable == input_broadcastable + assert bn.scale.broadcastable == input_broadcastable + assert bn.shift.broadcastable == input_broadcastable assert bn.population_mean.broadcastable == input_broadcastable assert bn.population_stdev.broadcastable == input_broadcastable assert_allclose(bn.population_mean.get_value(borrow=True), 0.) assert_allclose(bn.population_stdev.get_value(borrow=True), 1.) - assert_equal(bn.W.get_value(borrow=True).shape, expected_shape) - assert_equal(bn.b.get_value(borrow=True).shape, expected_shape) + assert_equal(bn.scale.get_value(borrow=True).shape, expected_shape) + assert_equal(bn.shift.get_value(borrow=True).shape, expected_shape) assert_equal(bn.population_mean.get_value(borrow=True).shape, expected_shape) assert_equal(bn.population_stdev.get_value(borrow=True).shape, expected_shape) - assert numpy.isnan(bn.b.get_value(borrow=True)).all() - assert numpy.isnan(bn.W.get_value(borrow=True)).all() + assert numpy.isnan(bn.shift.get_value(borrow=True)).all() + assert numpy.isnan(bn.scale.get_value(borrow=True)).all() bn.initialize() - assert_allclose(bn.b.get_value(borrow=True), 0.) - assert_allclose(bn.W.get_value(borrow=True), 1.) + assert_allclose(bn.shift.get_value(borrow=True), 0.) + assert_allclose(bn.scale.get_value(borrow=True), 1.) yield check, 5, (5,) yield check, (6, 7, 9), (6, 7, 9), (False, False, False) @@ -103,14 +104,14 @@ def check(input_dim, variable_dim, broadcastable=None, # Test learned scale is applied. gamma = random_unif(rng, variable_dim) - bn.W.set_value(gamma) + bn.scale.set_value(gamma) assert_allclose(y.eval({x: input_}), (input_ - pop_mean) * (gamma / pop_stdev), rtol=1e-4) # Test learned offset is applied. beta = random_unif(rng, variable_dim) - bn.b.set_value(beta) + bn.shift.set_value(beta) assert_allclose(y.eval({x: input_}), (input_ - pop_mean) * (gamma / pop_stdev) + beta, rtol=1e-4) @@ -154,13 +155,13 @@ def normalize(x): # Check that the scale parameters are still getting applied. gamma = random_unif(rng, variable_dim) - bn.W.set_value(gamma) + bn.scale.set_value(gamma) assert_allclose(y_hat.eval({x: input_}), normalize(input_) * gamma, atol=(1e-3 if theano.config.floatX == 'float32' else 1e-7)) beta = random_unif(rng, variable_dim) - bn.b.set_value(beta) + bn.shift.set_value(beta) # Check that the shift parameters are still getting applied. assert_allclose(y_hat.eval({x: input_}), normalize(input_) * gamma + beta, @@ -288,7 +289,8 @@ def test_batch_normalized_mlp_transformed(): x = tensor.matrix('x') mlp = BatchNormalizedMLP([Tanh(), Tanh()], [5, 7, 9]) with batch_normalization(mlp): - mlp.apply(x) + y = mlp.apply(x) + assert len(batch_normalization_updates(ComputationGraph([y]))) == 4 def test_batch_normalized_mlp_conserve_memory_propagated(): From e7149034fd3da2d2752807f931ca45963bf72fe7 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Thu, 21 Jan 2016 19:03:26 -0500 Subject: [PATCH 071/129] Make duplicate updates docs more explicit. --- blocks/graph/bn.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/blocks/graph/bn.py b/blocks/graph/bn.py index 88810d78..8b8aebf9 100644 --- a/blocks/graph/bn.py +++ b/blocks/graph/bn.py @@ -229,8 +229,11 @@ def batch_normalization_updates(training_graph, allow_duplicates=False): deviation, and the second is a Theano variable for the corresponding statistics on a minibatch. Note that multiple applications of a single :class:`blocks.bricks.BatchNormalization` - may appear in the graph, and therefore a single population variable - may map to several different minibatch variables. + may appear in the graph, and therefore (if `allow_duplicates` is + True) a single population variable may map to several different + minibatch variables, and appear multiple times in this mapping. + This can happen in recurrent models, siamese networks or other + models that reuse pathways. Notes ----- From 4b39c93febece71c201d5acdb2008854508c573b Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Thu, 21 Jan 2016 19:05:38 -0500 Subject: [PATCH 072/129] Remove from 'with' for clarity. --- blocks/graph/bn.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blocks/graph/bn.py b/blocks/graph/bn.py index 8b8aebf9..a3ec7961 100644 --- a/blocks/graph/bn.py +++ b/blocks/graph/bn.py @@ -201,8 +201,8 @@ def get_app_call_dict(variable_filter): unpacked = inputs[app_call].owner.inputs[0] with app_call.application.brick: new_output = app_call.application.brick.apply(unpacked) - new_app_call = get_application_call(new_output) - assert new_app_call.metadata['training_mode'] + new_app_call = get_application_call(new_output) + assert new_app_call.metadata['training_mode'] replacements.append((old_output, new_output)) return computation_graph.replace(replacements) From 725ec01937c8c711bf317a68eaa00345478b30df Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Thu, 21 Jan 2016 19:27:46 -0500 Subject: [PATCH 073/129] Idiomatize test. --- tests/graph/test_bn.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/tests/graph/test_bn.py b/tests/graph/test_bn.py index aaaefea9..09190196 100644 --- a/tests/graph/test_bn.py +++ b/tests/graph/test_bn.py @@ -1,5 +1,3 @@ -from functools import partial - import numpy from numpy.testing import assert_allclose import theano @@ -84,12 +82,10 @@ def simple_assertions(self, updates, num_bricks=2, num_updates=4): assert len(updates) == num_updates assert all(is_shared_variable(u[0]) for u in updates) # This order is somewhat arbitrary and implementation_dependent - means = set(filter(partial(has_roles, - roles=[BATCH_NORM_POPULATION_MEAN]), - [u[0] for u in updates])) - stdevs = set(filter(partial(has_roles, - roles=[BATCH_NORM_POPULATION_STDEV]), - [u[0] for u in updates])) + means = set(u[0] for u in updates + if has_roles(u[0], [BATCH_NORM_POPULATION_MEAN])) + stdevs = set(u[0] for u in updates + if has_roles(u[0], [BATCH_NORM_POPULATION_STDEV])) assert means.isdisjoint(stdevs) assert len(set(get_brick(v) for v in means)) == num_bricks assert len(set(get_brick(v) for v in stdevs)) == num_bricks From a88b19389ee019456723d6aa3239fce0eb2b6102 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Thu, 21 Jan 2016 19:31:52 -0500 Subject: [PATCH 074/129] batch_normalization_updates -> get_batch_normalization_updates --- blocks/graph/__init__.py | 2 +- blocks/graph/bn.py | 2 +- tests/bricks/test_bn.py | 4 ++-- tests/graph/test_bn.py | 32 ++++++++++++++++---------------- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/blocks/graph/__init__.py b/blocks/graph/__init__.py index 94dbaedd..5d7d1be5 100644 --- a/blocks/graph/__init__.py +++ b/blocks/graph/__init__.py @@ -20,7 +20,7 @@ shared_floatx_zeros, shared_like) from .annotations import add_annotation, Annotation # noqa from .bn import batch_normalization, apply_batch_normalization # noqa -from .bn import batch_normalization_updates # noqa +from .bn import get_batch_normalization_updates # noqa logger = logging.getLogger(__name__) diff --git a/blocks/graph/bn.py b/blocks/graph/bn.py index a3ec7961..212f143d 100644 --- a/blocks/graph/bn.py +++ b/blocks/graph/bn.py @@ -207,7 +207,7 @@ def get_app_call_dict(variable_filter): return computation_graph.replace(replacements) -def batch_normalization_updates(training_graph, allow_duplicates=False): +def get_batch_normalization_updates(training_graph, allow_duplicates=False): """Extract correspondences for learning BN population statistics. Parameters diff --git a/tests/bricks/test_bn.py b/tests/bricks/test_bn.py index 7aef6e58..43724e11 100644 --- a/tests/bricks/test_bn.py +++ b/tests/bricks/test_bn.py @@ -10,7 +10,7 @@ MaxPooling, AveragePooling) from blocks.initialization import Constant from blocks.graph import (ComputationGraph, batch_normalization, - batch_normalization_updates) + get_batch_normalization_updates) def random_unif(rng, dim, low=1, high=10): @@ -290,7 +290,7 @@ def test_batch_normalized_mlp_transformed(): mlp = BatchNormalizedMLP([Tanh(), Tanh()], [5, 7, 9]) with batch_normalization(mlp): y = mlp.apply(x) - assert len(batch_normalization_updates(ComputationGraph([y]))) == 4 + assert len(get_batch_normalization_updates(ComputationGraph([y]))) == 4 def test_batch_normalized_mlp_conserve_memory_propagated(): diff --git a/tests/graph/test_bn.py b/tests/graph/test_bn.py index 09190196..f6b1c8b3 100644 --- a/tests/graph/test_bn.py +++ b/tests/graph/test_bn.py @@ -8,7 +8,7 @@ from blocks.filter import get_brick from blocks.graph import (ComputationGraph, batch_normalization, apply_batch_normalization, - batch_normalization_updates) + get_batch_normalization_updates) from blocks.initialization import Constant from blocks.roles import (has_roles, BATCH_NORM_POPULATION_MEAN, BATCH_NORM_POPULATION_STDEV) @@ -72,7 +72,7 @@ def test_apply_batch_normalization_nested(): assert_allclose(y_, y_expected, rtol=1e-3) -class TestSimpleBatchNormalizationUpdates(object): +class TestSimpleGetBatchNormalizationUpdates(object): def setUp(self): self.mlp = BatchNormalizedMLP([Tanh(), Tanh()], [5, 7, 9]) self.x = tensor.matrix() @@ -90,44 +90,44 @@ def simple_assertions(self, updates, num_bricks=2, num_updates=4): assert len(set(get_brick(v) for v in means)) == num_bricks assert len(set(get_brick(v) for v in stdevs)) == num_bricks - def test_batch_normalization_updates(self): - """Test that batch_normalization_updates works as expected.""" + def test_get_batch_normalization_updates(self): + """Test that get_batch_normalization_updates works as expected.""" with batch_normalization(self.mlp): y_bn = self.mlp.apply(self.x) graph = ComputationGraph([y_bn]) - updates = batch_normalization_updates(graph) + updates = get_batch_normalization_updates(graph) self.simple_assertions(updates) - def test_batch_normalization_updates_non_training_applications(self): + def test_get_batch_normalization_updates_non_training_applications(self): """Test updates extracton in graph with non-training apply.""" y = self.mlp.apply(self.x) with batch_normalization(self.mlp): y_bn = self.mlp.apply(self.x) graph = ComputationGraph([y_bn, y]) - updates = batch_normalization_updates(graph) + updates = get_batch_normalization_updates(graph) self.simple_assertions(updates) - def test_batch_normalization_updates_no_training(self): + def test_get_batch_normalization_updates_no_training(self): """Test for exception if there are no training-mode nodes.""" y = self.mlp.apply(self.x) graph = ComputationGraph([y]) - numpy.testing.assert_raises(ValueError, batch_normalization_updates, - graph) + numpy.testing.assert_raises(ValueError, + get_batch_normalization_updates, graph) - def test_batch_normalization_updates_duplicates_error(self): + def test_get_batch_normalization_updates_duplicates_error(self): """Test that we get an error by default on multiple apply.""" with batch_normalization(self.mlp): y = self.mlp.apply(self.x) y2 = self.mlp.apply(self.x) graph = ComputationGraph([y, y2]) - numpy.testing.assert_raises(ValueError, batch_normalization_updates, - graph) + numpy.testing.assert_raises(ValueError, + get_batch_normalization_updates, graph) - def test_batch_normalization_updates_allow_duplicates(self): - """Test batch_normalization_updates(.., allow_duplicates=True).""" + def test_get_batch_normalization_updates_allow_duplicates(self): + """Test get_batch_normalization_updates(allow_duplicates=True).""" with batch_normalization(self.mlp): y = self.mlp.apply(self.x) y2 = self.mlp.apply(self.x) graph = ComputationGraph([y, y2]) - updates = batch_normalization_updates(graph, allow_duplicates=True) + updates = get_batch_normalization_updates(graph, allow_duplicates=True) self.simple_assertions(updates, num_bricks=2, num_updates=8) From d9171ff29f8e6cc7d3ad3b3cbb0994319d717618 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Fri, 22 Jan 2016 12:07:05 -0500 Subject: [PATCH 075/129] Move __init__ logic to _allocate in SBN. --- blocks/bricks/bn.py | 12 +++++------- tests/bricks/test_bn.py | 9 ++++++--- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/blocks/bricks/bn.py b/blocks/bricks/bn.py index 1ec1fd1b..4aefff33 100644 --- a/blocks/bricks/bn.py +++ b/blocks/bricks/bn.py @@ -279,15 +279,13 @@ class SpatialBatchNormalization(BatchNormalization): keyword arguments). """ - @lazy(allocation=['input_dim']) - def __init__(self, input_dim, **kwargs): - if not isinstance(input_dim, - collections.Sequence) or len(input_dim) < 2: + def _allocate(self): + if not isinstance(self.input_dim, + collections.Sequence) or len(self.input_dim) < 2: raise ValueError('expected input_dim to be length >= 2 ' 'e.g. (channels, height, width)') - broadcastable = (False,) + ((True,) * (len(input_dim) - 1)) - kwargs.setdefault('broadcastable', broadcastable) - super(SpatialBatchNormalization, self).__init__(input_dim, **kwargs) + self.broadcastable = (False,) + ((True,) * (len(self.input_dim) - 1)) + super(SpatialBatchNormalization, self)._allocate() class BatchNormalizedMLP(MLP): diff --git a/tests/bricks/test_bn.py b/tests/bricks/test_bn.py index 43724e11..dc853b84 100644 --- a/tests/bricks/test_bn.py +++ b/tests/bricks/test_bn.py @@ -215,12 +215,15 @@ def test_raise_exception_spatial(): """Test that SpatialBatchNormalization raises an expected exception.""" # Work around a stupid bug in nose2 that unpacks the tuple into # separate arguments. - yield assert_raises, (ValueError, SpatialBatchNormalization, (5,)) - yield assert_raises, (ValueError, SpatialBatchNormalization, 3) + sbn1 = SpatialBatchNormalization((5,)) + yield assert_raises, (ValueError, sbn1.allocate) + sbn2 = SpatialBatchNormalization(3) + yield assert_raises, (ValueError, sbn2.allocate) def do_not_fail(*input_dim): try: - SpatialBatchNormalization(input_dim) + sbn = SpatialBatchNormalization(input_dim) + sbn.allocate() except ValueError: assert False From 90cc8bb1a690104079047f99c5975571eacc1d2f Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Fri, 22 Jan 2016 13:46:52 -0500 Subject: [PATCH 076/129] Fix StepRules to honour broadcastable. --- blocks/algorithms/__init__.py | 24 ++++++------ blocks/utils/__init__.py | 29 ++++++++++++++ tests/algorithms/test_algorithms.py | 59 ++++++++++++++++++++++++++++- 3 files changed, 99 insertions(+), 13 deletions(-) diff --git a/blocks/algorithms/__init__.py b/blocks/algorithms/__init__.py index 45e9cae7..96a36fd6 100644 --- a/blocks/algorithms/__init__.py +++ b/blocks/algorithms/__init__.py @@ -14,7 +14,8 @@ from blocks.graph import ComputationGraph from blocks.roles import add_role, ALGORITHM_HYPERPARAMETER, ALGORITHM_BUFFER from blocks.theano_expressions import l2_norm -from blocks.utils import dict_subset, pack, shared_floatx +from blocks.utils import (dict_subset, pack, shared_floatx, + shared_floatx_zeros_matching) logger = logging.getLogger(__name__) @@ -420,7 +421,7 @@ def __init__(self, momentum=0.): add_role(self.momentum, ALGORITHM_HYPERPARAMETER) def compute_step(self, parameter, previous_step): - velocity = shared_floatx(parameter.get_value() * 0., "velocity") + velocity = shared_floatx_zeros_matching(parameter, "velocity") add_role(velocity, ALGORITHM_BUFFER) step = self.momentum * velocity + previous_step updates = [(velocity, step)] @@ -487,11 +488,11 @@ def __init__(self, decay_rate=0.95, epsilon=1e-6): add_role(self.epsilon, ALGORITHM_HYPERPARAMETER) def compute_step(self, parameter, previous_step): - mean_square_step_tm1 = shared_floatx(parameter.get_value() * 0., - "mean_square_step_tm1") + mean_square_step_tm1 = shared_floatx_zeros_matching( + parameter, "mean_square_step_tm1") add_role(mean_square_step_tm1, ALGORITHM_BUFFER) - mean_square_delta_x_tm1 = shared_floatx(parameter.get_value() * 0., - "mean_square_delta_x_tm1") + mean_square_delta_x_tm1 = shared_floatx_zeros_matching( + parameter, "mean_square_delta_x_tm1") add_role(mean_square_delta_x_tm1, ALGORITHM_BUFFER) mean_square_step_t = ( @@ -550,8 +551,8 @@ def __init__(self, decay_rate=0.9, max_scaling=1e5): self.epsilon = 1. / max_scaling def compute_step(self, parameter, previous_step): - mean_square_step_tm1 = shared_floatx(parameter.get_value() * 0., - "mean_square_step_tm1") + mean_square_step_tm1 = shared_floatx_zeros_matching( + parameter, "mean_square_step_tm1") add_role(mean_square_step_tm1, ALGORITHM_BUFFER) mean_square_step_t = ( self.decay_rate * mean_square_step_tm1 + @@ -749,8 +750,7 @@ def compute_step(self, parameter, previous_step): name = 'adagrad_sqs' if parameter.name: name += '_' + parameter.name - ssq = shared_floatx(parameter.get_value() * 0., - name=name) + ssq = shared_floatx_zeros_matching(parameter, name=name) add_role(ssq, ALGORITHM_BUFFER) ssq_t = (tensor.sqr(previous_step) + ssq) @@ -796,9 +796,9 @@ def __init__(self, learning_rate=0.002, self.decay_factor = decay_factor def compute_step(self, parameter, previous_step): - mean = shared_floatx(parameter.get_value() * 0., 'mean') + mean = shared_floatx_zeros_matching(parameter, 'mean') add_role(mean, ALGORITHM_BUFFER) - variance = shared_floatx(parameter.get_value() * 0., 'variance') + variance = shared_floatx_zeros_matching(parameter, 'variance') add_role(variance, ALGORITHM_BUFFER) time = shared_floatx(0., 'time') add_role(time, ALGORITHM_BUFFER) diff --git a/blocks/utils/__init__.py b/blocks/utils/__init__.py index 5144955a..480fd5c6 100644 --- a/blocks/utils/__init__.py +++ b/blocks/utils/__init__.py @@ -70,6 +70,35 @@ def unpack(arg, singleton=False): return arg +def shared_floatx_zeros_matching(shared_variable, name=None, **kwargs): + r"""Create another shared variable with matching shape and broadcast. + + Parameters + ---------- + shared_variable : :class:'tensor.TensorSharedVariable' + A Theano shared variable with the desired shape and broadcastable + flags. + name : :obj:`str`, optional + The name for the shared variable. Defaults to `None`. + \*\*kwargs + Keyword arguments to pass to the :func:`shared_floatx_zeros` function. + + Returns + ------- + :class:'tensor.TensorSharedVariable' + A new shared variable, initialized to all zeros, with the same + shape and broadcastable flags as `shared_variable`. + + + """ + if not is_shared_variable(shared_variable): + raise ValueError('argument must be a shared variable') + return shared_floatx_zeros(shared_variable.get_value().shape, + name=name, + broadcastable=shared_variable.broadcastable, + **kwargs) + + def shared_floatx_zeros(shape, **kwargs): r"""Creates a shared variable array filled with zeros. diff --git a/tests/algorithms/test_algorithms.py b/tests/algorithms/test_algorithms.py index 07339955..4d26d56d 100644 --- a/tests/algorithms/test_algorithms.py +++ b/tests/algorithms/test_algorithms.py @@ -10,7 +10,27 @@ CompositeRule, Scale, StepRule, BasicMomentum, Momentum, AdaDelta, BasicRMSProp, RMSProp, Adam, AdaGrad, RemoveNotFinite, Restrict) -from blocks.utils import shared_floatx +from blocks.utils import shared_floatx, shared_floatx_zeros + + +def verify_broadcastable_handling(step_rule): + def check(param): + grad = tensor.grad(param.sum(), wrt=param) + step, _ = step_rule.compute_steps(OrderedDict([(param, grad)])) + assert step[param].broadcastable == grad.broadcastable + + check(shared_floatx_zeros((5, 6, 1, 5), + broadcastable=(False, False, True, False))) + check(shared_floatx_zeros((2, 1, 3), + broadcastable=(False, True, False))) + check(shared_floatx_zeros((3, 4, 1), + broadcastable=(False, False, True))) + check(shared_floatx_zeros((1, 9, 6), + broadcastable=(True, False, False))) + check(shared_floatx_zeros((1, 1, 1), + broadcastable=(True, True, True))) + check(shared_floatx_zeros((1, 5, 1), + broadcastable=(True, False, True))) def test_gradient_descent(): @@ -69,6 +89,10 @@ def test_basic_momentum(): assert_allclose(f()[0], [10.5, 14.]) +def test_basic_momentum_broadcastable(): + verify_broadcastable_handling(BasicMomentum(0.5)) + + def test_momentum(): a = shared_floatx([3, 4]) cost = (a ** 2).sum() @@ -80,6 +104,10 @@ def test_momentum(): assert_allclose(f()[0], [1.05, 1.4]) +def test_momentum_broadcastable(): + verify_broadcastable_handling(Momentum(0.5)) + + def test_adadelta(): a = shared_floatx([3, 4]) cost = (a ** 2).sum() @@ -110,6 +138,10 @@ def test_basicrmsprop(): assert_allclose(f()[0], [0.6172134, 0.64699664]) +def test_basicrmsprop_broadcastable(): + verify_broadcastable_handling(BasicRMSProp(0.5, 1e5)) + + def test_basicrmsprop_max_scaling(): a = shared_floatx([1e-6, 1e-6]) cost = (a ** 2).sum() @@ -143,6 +175,10 @@ def test_rmsprop(): assert_allclose(f()[0], [0.06172134, 0.064699664]) +def test_rmsprop_broadcastable(): + verify_broadcastable_handling(RMSProp(0.1, 0.5, 1e5)) + + def test_step_clipping(): rule1 = StepClipping(4) rule2 = StepClipping(5) @@ -156,6 +192,10 @@ def test_step_clipping(): assert_allclose(clipped2[1].eval(), 4.0) +def test_step_clipping_broadcastable(): + verify_broadcastable_handling(StepClipping(0.4)) + + def test_variable_clipping(): # Test simple variable clipping with no axis. rule1 = VariableClipping(5) @@ -208,6 +248,10 @@ def test_variable_clipping(): assert_raises(ValueError, VariableClipping, 50, axis=(0, 0)) +def test_variable_clipping_broadcastable(): + verify_broadcastable_handling(VariableClipping(1)) + + def test_composite_rule(): rule = CompositeRule([StepClipping(4), Scale(0.1)]) gradients = {0: shared_floatx(3.0), 1: shared_floatx(4.0)} @@ -242,6 +286,10 @@ def test_adam(): assert_allclose(f()[0], [0.00178724, 0.0018223], rtol=rtol) +def test_adam_broadcastable(): + verify_broadcastable_handling(Adam()) + + def test_adagrad(): a = shared_floatx([3, 4]) cost = (a ** 2).sum() @@ -257,6 +305,10 @@ def test_adagrad(): assert_allclose(f()[0], [0.00053452, 0.0005747], rtol=rtol) +def test_adagrad_broadcastable(): + verify_broadcastable_handling(AdaGrad()) + + def test_remove_not_finite(): rule1 = RemoveNotFinite(0.1) rule2 = RemoveNotFinite() @@ -272,6 +324,11 @@ def test_remove_not_finite(): assert_allclose(rval2[2].eval(), 0.0) +def test_remove_not_finite_broadcastable(): + verify_broadcastable_handling(RemoveNotFinite()) + verify_broadcastable_handling(RemoveNotFinite(0.1)) + + class DummyUpdatesStepRule(StepRule): def compute_step(self, parameter, previous_step): return previous_step + 2, [(parameter * 10, parameter * 100)] From c81a9f7640f8bb26dcf250ae42edc7a3151d9de4 Mon Sep 17 00:00:00 2001 From: Pooya Date: Fri, 22 Jan 2016 18:32:32 -0500 Subject: [PATCH 077/129] fixing figures in rnn --- docs/rnn.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/rnn.rst b/docs/rnn.rst index 508a43fe..e377fee4 100644 --- a/docs/rnn.rst +++ b/docs/rnn.rst @@ -63,8 +63,8 @@ receives (figure below). x_1; x_2; x_3; node [shape=plaintext]; - h_0 [label="(0, 0, 0)"]; h_1 [label="(1, 1, 1)"]; - h_2 [label="(2, 2, 2)"]; h_3 [label="(3, 3, 3)"]; + h_0 [label="(0, 0, 0)"]; h_1 [label="(2, 2, 2)"]; + h_2 [label="(4, 4, 4)"]; h_3 [label="(6, 6, 6)"]; node [shape=diamond,regular=1,label="+"]; plus_1; plus_2; plus_3; @@ -186,9 +186,9 @@ figure below). node [shape=plaintext]; h1_0 [label="(0, 0, 0)"]; h1_1 [label="(1, 1, 1)"]; - h1_2 [label="(4, 4, 4)"]; h1_3 [label="(12, 12, 12)"]; + h1_2 [label="(3, 3, 3)"]; h1_3 [label="(8, 8, 8)"]; h2_0 [label="(0, 0, 0)"]; h2_1 [label="(1, 1, 1)"]; - h2_2 [label="(3, 3, 3)"]; h2_3 [label="(8, 8, 8)"]; + h2_2 [label="(4, 4, 4)"]; h2_3 [label="(12, 12, 12)"]; node [shape=diamond,regular=1,label="+"]; plus_1_1; plus_1_2; plus_1_3; plus_2_1; plus_2_2; plus_2_3; @@ -196,10 +196,10 @@ figure below). x_1 -> plus_1_1; x_2 -> plus_1_2; x_3 -> plus_1_3; h1_0 -> plus_1_1 -> h1_1 -> plus_1_2 -> h1_2 -> plus_1_3 -> h1_3; h2_0 -> plus_2_1 -> h2_1 -> plus_2_2 -> h2_2 -> plus_2_3 -> h2_3; - h2_0 -> plus_1_1; h2_1 -> plus_1_2; h2_2 -> plus_1_3; + h1_1 -> plus_2_1; h1_2 -> plus_2_2; h1_3 -> plus_2_3; edge [style=invis]; - h2_0 -> h1_0; h2_1 -> h1_1; h2_2 -> h1_2; h2_3 -> h1_3; + h2_0 -> h1_1; h2_1 -> h1_2; h2_2 -> h1_3; plus_2_1 -> plus_1_1; plus_2_2 -> plus_1_2; plus_2_3 -> plus_1_3; { rank=source; h2_0, h2_1, h2_2, h2_3, plus_2_1, plus_2_2, plus_2_3 } From 348de31ea3d93214c171ad45996a4cd0b39b0ba8 Mon Sep 17 00:00:00 2001 From: Vincent Dumoulin Date: Wed, 20 Jan 2016 09:55:25 -0500 Subject: [PATCH 078/129] Adapt Pooling to Theano's downsample -> pool renaming --- blocks/bricks/conv.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index 4c4790a9..a496525f 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -1,5 +1,5 @@ from theano.tensor.nnet.conv import conv2d, get_conv_output_shape -from theano.tensor.signal.downsample import max_pool_2d, DownsampleFactorMax +from theano.tensor.signal.pool import pool_2d, Pool from blocks.bricks import Initializable, Feedforward, Sequence from blocks.bricks.base import application, Brick, lazy @@ -230,16 +230,16 @@ def apply(self, input_): with the last two dimensions downsampled. """ - output = max_pool_2d(input_, self.pooling_size, st=self.step, - mode=self.mode, padding=self.padding, - ignore_border=self.ignore_border) + output = pool_2d(input_, self.pooling_size, st=self.step, + mode=self.mode, padding=self.padding, + ignore_border=self.ignore_border) return output def get_dim(self, name): if name == 'input_': return self.input_dim if name == 'output': - return tuple(DownsampleFactorMax.out_shape( + return tuple(Pool.out_shape( self.input_dim, self.pooling_size, st=self.step, ignore_border=self.ignore_border, padding=self.padding)) From 925564745f8b17c0ce048ea015405b985db26587 Mon Sep 17 00:00:00 2001 From: Vincent Dumoulin Date: Wed, 20 Jan 2016 10:01:59 -0500 Subject: [PATCH 079/129] Use Theano's new abstract_conv interface --- blocks/bricks/conv.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index a496525f..cdf7e53c 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -1,4 +1,5 @@ -from theano.tensor.nnet.conv import conv2d, get_conv_output_shape +from theano.tensor.nnet import conv2d +from theano.tensor.nnet.abstract_conv import get_conv_output_shape from theano.tensor.signal.pool import pool_2d, Pool from blocks.bricks import Initializable, Feedforward, Sequence From 071ad2b000bc74758353bbdbee3c30355316737f Mon Sep 17 00:00:00 2001 From: Vincent Dumoulin Date: Wed, 20 Jan 2016 10:14:47 -0500 Subject: [PATCH 080/129] Add ConvolutionTranspose and ConvolutionTransposeActivation --- blocks/bricks/conv.py | 187 ++++++++++++++++++++++++++++++++++++++ tests/bricks/test_conv.py | 30 +++++- 2 files changed, 216 insertions(+), 1 deletion(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index cdf7e53c..6b9afad5 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -1,3 +1,4 @@ +from theano import tensor from theano.tensor.nnet import conv2d from theano.tensor.nnet.abstract_conv import get_conv_output_shape from theano.tensor.signal.pool import pool_2d, Pool @@ -178,6 +179,144 @@ def num_output_channels(self): return self.num_filters +class ConvolutionalTranspose(Initializable): + """Performs the transpose of a 2D convolution. + + Parameters + ---------- + filter_size : tuple + The height and width of the filter (also called *kernels*). + num_filters : int + Number of filters per channel. + num_channels : int + Number of input channels in the image. For the first layer this is + normally 1 for grayscale images and 3 for color (RGB) images. For + subsequent layers this is equal to the number of filters output by + the previous convolutional layer. The filters are pooled over the + channels. + original_image_size : tuple + The height and width of the output (image or feature map). + batch_size : int, optional + Number of examples per batch. If given, this will be passed to + Theano convolution operator, possibly resulting in faster + execution. + image_size : tuple, optional + The height and width of the input (image or feature map). If given, + this will be passed to the Theano convolution operator, resulting + in possibly faster execution times. + step : tuple, optional + The step (or stride) with which to slide the filters over the + image. Defaults to (1, 1). + border_mode : {'valid', 'full'}, optional + The border mode to use, see :func:`scipy.signal.convolve2d` for + details. Defaults to 'valid'. + tied_biases : bool + If ``True``, it indicates that the biases of every filter in this + layer should be shared amongst all applications of that filter. + Setting this to ``False`` will untie the biases, yielding a + separate bias for every location at which the filter is applied. + Defaults to ``False``. + + """ + @lazy(allocation=['filter_size', 'num_filters', 'num_channels', + 'original_image_size']) + def __init__(self, filter_size, num_filters, num_channels, + original_image_size, batch_size=None, image_size=(None, None), + step=(1, 1), border_mode='valid', tied_biases=False, + **kwargs): + super(ConvolutionalTranspose, self).__init__(**kwargs) + + self.filter_size = filter_size + self.num_filters = num_filters + self.batch_size = batch_size + self.num_channels = num_channels + self.image_size = image_size + self.original_image_size = original_image_size + self.step = step + self.border_mode = border_mode + self.tied_biases = tied_biases + + def _allocate(self): + # The GpuDnnConvGradI op takes a kernel that was used for the + # **convolution**. We therefore have to invert num_channels + # and num_filters for W. + W = shared_floatx_nans((self.num_channels, self.num_filters) + + self.filter_size, name='W') + add_role(W, FILTER) + self.parameters.append(W) + self.add_auxiliary_variable(W.norm(2), name='W_norm') + if self.use_bias: + if self.tied_biases: + b = shared_floatx_nans((self.num_filters,), name='b') + else: + # this error is raised here instead of during initializiation + # because ConvolutionalSequence may specify the image size + if self.image_size == (None, None) and not self.tied_biases: + raise ValueError('Cannot infer bias size without ' + 'image_size specified. If you use ' + 'variable image_size, you should use ' + 'tied_biases=True.') + + b = shared_floatx_nans(self.get_dim('output'), name='b') + add_role(b, BIAS) + + self.parameters.append(b) + self.add_auxiliary_variable(b.norm(2), name='b_norm') + + def _initialize(self): + if self.use_bias: + W, b = self.parameters + self.biases_init.initialize(b, self.rng) + else: + W, = self.parameters + self.weights_init.initialize(W, self.rng) + + @application(inputs=['input_'], outputs=['output']) + def apply(self, input_): + """Perform the transposed convolution. + + Parameters + ---------- + input_ : :class:`~tensor.TensorVariable` + A 4D tensor with the axes representing batch size, number of + channels, image height, and image width. + + Returns + ------- + output : :class:`~tensor.TensorVariable` + A 4D tensor of filtered images (feature maps) with dimensions + representing batch size, number of filters, feature map height, + and feature map width. + + """ + if self.use_bias: + W, b = self.parameters + else: + W, = self.parameters + out_shape = tensor.stack( + *((input_.shape[0],) + self.get_dim('output'))) + output = AbstractConv2d_gradInputs( + imshp=out_shape, kshp=W.shape, border_mode=self.border_mode, + subsample=self.step)(W, input_, out_shape[-2:]) + if self.use_bias: + if self.tied_biases: + output += b.dimshuffle('x', 0, 'x', 'x') + else: + output += b.dimshuffle('x', 0, 1, 2) + return output + + def get_dim(self, name): + if name == 'input_': + return (self.num_channels,) + self.image_size + if name == 'output': + return (self.num_filters,) + self.original_image_size + return super(Convolutional, self).get_dim(name) + + @property + def num_output_channels(self): + return self.num_filters + + class Pooling(Initializable, Feedforward): """Base Brick for pooling operations. @@ -397,6 +536,54 @@ def _push_allocation_config(self): self.convolution.step = self.step +class ConvolutionalTransposeActivation(_AllocationMixin, Sequence, + Initializable): + """A transposed convolution followed by an activation function. + + Parameters + ---------- + activation : :class:`.BoundApplication` + The application method to apply after convolution (i.e. + the nonlinear activation function) + + See Also + -------- + :class:`ConvolutionalTranspose` : For the documentation of other + parameters. + + """ + @lazy(allocation=['filter_size', 'num_filters', 'num_channels', + 'original_image_size']) + def __init__(self, activation, filter_size, num_filters, num_channels, + original_image_size, batch_size=None, image_size=None, + step=(1, 1), border_mode='valid', tied_biases=False, + **kwargs): + self.convolution = ConvolutionalTranspose() + + self.filter_size = filter_size + self.num_filters = num_filters + self.num_channels = num_channels + self.batch_size = batch_size + self.image_size = image_size + self.original_image_size = original_image_size + self.step = step + self.border_mode = border_mode + self.tied_biases = tied_biases + + super(ConvolutionalTransposeActivation, self).__init__( + application_methods=[self.convolution.apply, activation], + **kwargs) + + def get_dim(self, name): + # TODO The name of the activation output doesn't need to be `output` + return self.convolution.get_dim(name) + + def _push_allocation_config(self): + super(ConvolutionalActivation, self)._push_allocation_config() + self.convolution.step = self.step + self.convolution.original_image_size = self.original_image_size + + class ConvolutionalSequence(Sequence, Initializable, Feedforward): """A sequence of convolutional (or pooling) operations. diff --git a/tests/bricks/test_conv.py b/tests/bricks/test_conv.py index bb0c760c..197ce924 100644 --- a/tests/bricks/test_conv.py +++ b/tests/bricks/test_conv.py @@ -8,7 +8,8 @@ from theano import function from blocks.bricks import Rectifier -from blocks.bricks.conv import (Convolutional, MaxPooling, AveragePooling, +from blocks.bricks.conv import (Convolutional, ConvolutionalTranspose, + MaxPooling, AveragePooling, ConvolutionalActivation, ConvolutionalSequence) from blocks.initialization import Constant from blocks.graph import ComputationGraph @@ -37,6 +38,33 @@ def test_convolutional(): assert conv.get_dim('output') == (num_filters, 15, 11) +def test_convolutional_transpose(): + x = tensor.tensor4('x') + num_channels = 4 + num_filters = 3 + image_size = (8, 6) + original_image_size = (17, 13) + batch_size = 5 + filter_size = (3, 3) + step = (2, 2) + conv = ConvolutionalTranspose( + filter_size, num_filters, num_channels, step=step, + original_image_size=original_image_size, image_size=image_size, + weights_init=Constant(1.), biases_init=Constant(5.)) + conv.initialize() + y = conv.apply(x) + func = function([x], y) + + x_val = numpy.ones((batch_size, num_channels) + image_size, + dtype=theano.config.floatX) + expected_value = num_channels * numpy.ones( + (batch_size, num_filters) + original_image_size) + expected_value[:, :, 2:-2:2, :] += num_channels + expected_value[:, :, :, 2:-2:2] += num_channels + expected_value[:, :, 2:-2:2, 2:-2:2] += num_channels + assert_allclose(func(x_val), expected_value + 5) + + def test_border_mode_not_pushed(): layers = [Convolutional(border_mode='full'), ConvolutionalActivation(Rectifier().apply), From ee5efc62848abcd21e8a8d65ca2356deb8dcad70 Mon Sep 17 00:00:00 2001 From: Vincent Dumoulin Date: Wed, 20 Jan 2016 10:38:57 -0500 Subject: [PATCH 081/129] Fix oversights --- blocks/bricks/conv.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index 6b9afad5..233bd61a 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -237,9 +237,9 @@ def __init__(self, filter_size, num_filters, num_channels, self.tied_biases = tied_biases def _allocate(self): - # The GpuDnnConvGradI op takes a kernel that was used for the - # **convolution**. We therefore have to invert num_channels - # and num_filters for W. + # The AbstractConv2d_gradInputs op takes a kernel that was used for the + # **convolution**. We therefore have to invert num_channels and + # num_filters for W. W = shared_floatx_nans((self.num_channels, self.num_filters) + self.filter_size, name='W') add_role(W, FILTER) @@ -310,7 +310,7 @@ def get_dim(self, name): return (self.num_channels,) + self.image_size if name == 'output': return (self.num_filters,) + self.original_image_size - return super(Convolutional, self).get_dim(name) + return super(ConvolutionalTranspose, self).get_dim(name) @property def num_output_channels(self): From c985b308ea6ee44f1a6f8b2d5a0ec7ca3b15a0e4 Mon Sep 17 00:00:00 2001 From: Vincent Dumoulin Date: Wed, 20 Jan 2016 13:47:05 -0500 Subject: [PATCH 082/129] Fix import error --- blocks/bricks/conv.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index 233bd61a..c3a27b95 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -1,6 +1,7 @@ from theano import tensor from theano.tensor.nnet import conv2d -from theano.tensor.nnet.abstract_conv import get_conv_output_shape +from theano.tensor.nnet.abstract_conv import (AbstractConv2d_gradInputs, + get_conv_output_shape) from theano.tensor.signal.pool import pool_2d, Pool from blocks.bricks import Initializable, Feedforward, Sequence From fa4f3144efba32ba620e3291edb6537bd1936459 Mon Sep 17 00:00:00 2001 From: Vincent Dumoulin Date: Wed, 20 Jan 2016 13:53:01 -0500 Subject: [PATCH 083/129] Fix conv tests failing to compile Theano functions --- tests/bricks/test_conv.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/bricks/test_conv.py b/tests/bricks/test_conv.py index 197ce924..32365cc8 100644 --- a/tests/bricks/test_conv.py +++ b/tests/bricks/test_conv.py @@ -26,7 +26,7 @@ def test_convolutional(): biases_init=Constant(5.)) conv.initialize() y = conv.apply(x) - func = function([x], y) + func = function([x], y, mode='FAST_RUN') x_val = numpy.ones((batch_size, num_channels, 17, 13), dtype=theano.config.floatX) @@ -53,7 +53,7 @@ def test_convolutional_transpose(): weights_init=Constant(1.), biases_init=Constant(5.)) conv.initialize() y = conv.apply(x) - func = function([x], y) + func = function([x], y, mode='FAST_RUN') x_val = numpy.ones((batch_size, num_channels) + image_size, dtype=theano.config.floatX) @@ -115,7 +115,7 @@ def test_tied_biases(): tied_biases=True) conv.initialize() y = conv.apply(x) - func = function([x], y) + func = function([x], y, mode='FAST_RUN') # Tied biases allows to pass images of different sizes x_val_1 = numpy.ones((batch_size, num_channels, 10, @@ -140,7 +140,7 @@ def test_max_pooling(): pool_size = 3 pool = MaxPooling((pool_size, pool_size)) y = pool.apply(x) - func = function([x], y) + func = function([x], y, mode='FAST_RUN') x_val = numpy.ones((batch_size, num_channels, x_size, y_size), dtype=theano.config.floatX) @@ -272,7 +272,7 @@ def test_convolutional_sequence(): conv2.convolution.use_bias = False y = seq.apply(x) seq.initialize() - func = function([x], y) + func = function([x], y, mode='FAST_RUN') x_val = numpy.ones((batch_size, 4, 17, 13), dtype=theano.config.floatX) y_val = (numpy.ones((batch_size, 4, 4, 2)) * From c237b514fa9ca068051a0791f49d086cd8494cfc Mon Sep 17 00:00:00 2001 From: Vincent Dumoulin Date: Wed, 20 Jan 2016 14:06:20 -0500 Subject: [PATCH 084/129] Comment on the use of FAST_RUN mode in blocks.bricks.conv tests --- tests/bricks/test_conv.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/bricks/test_conv.py b/tests/bricks/test_conv.py index 32365cc8..9d54648d 100644 --- a/tests/bricks/test_conv.py +++ b/tests/bricks/test_conv.py @@ -14,6 +14,12 @@ from blocks.initialization import Constant from blocks.graph import ComputationGraph +# NOTE : Our CI tests are run in FAST_COMPILE mode to save time, but that +# forces the Python implementation to be used. Because CuDNN is not installed +# on Travis, CorrMM is used, which has no Python implemenation. This means +# we need to force the use of FAST_RUN mode in `theano.function` calls, +# otherwise graph compilation will fail. + def test_convolutional(): x = tensor.tensor4('x') From 836267dbdac050fd4384a7b3d861e54e78be9e67 Mon Sep 17 00:00:00 2001 From: Vincent Dumoulin Date: Thu, 21 Jan 2016 10:37:45 -0500 Subject: [PATCH 085/129] Revert to not forcing compilation mode --- tests/bricks/test_conv.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/tests/bricks/test_conv.py b/tests/bricks/test_conv.py index 9d54648d..197ce924 100644 --- a/tests/bricks/test_conv.py +++ b/tests/bricks/test_conv.py @@ -14,12 +14,6 @@ from blocks.initialization import Constant from blocks.graph import ComputationGraph -# NOTE : Our CI tests are run in FAST_COMPILE mode to save time, but that -# forces the Python implementation to be used. Because CuDNN is not installed -# on Travis, CorrMM is used, which has no Python implemenation. This means -# we need to force the use of FAST_RUN mode in `theano.function` calls, -# otherwise graph compilation will fail. - def test_convolutional(): x = tensor.tensor4('x') @@ -32,7 +26,7 @@ def test_convolutional(): biases_init=Constant(5.)) conv.initialize() y = conv.apply(x) - func = function([x], y, mode='FAST_RUN') + func = function([x], y) x_val = numpy.ones((batch_size, num_channels, 17, 13), dtype=theano.config.floatX) @@ -59,7 +53,7 @@ def test_convolutional_transpose(): weights_init=Constant(1.), biases_init=Constant(5.)) conv.initialize() y = conv.apply(x) - func = function([x], y, mode='FAST_RUN') + func = function([x], y) x_val = numpy.ones((batch_size, num_channels) + image_size, dtype=theano.config.floatX) @@ -121,7 +115,7 @@ def test_tied_biases(): tied_biases=True) conv.initialize() y = conv.apply(x) - func = function([x], y, mode='FAST_RUN') + func = function([x], y) # Tied biases allows to pass images of different sizes x_val_1 = numpy.ones((batch_size, num_channels, 10, @@ -146,7 +140,7 @@ def test_max_pooling(): pool_size = 3 pool = MaxPooling((pool_size, pool_size)) y = pool.apply(x) - func = function([x], y, mode='FAST_RUN') + func = function([x], y) x_val = numpy.ones((batch_size, num_channels, x_size, y_size), dtype=theano.config.floatX) @@ -278,7 +272,7 @@ def test_convolutional_sequence(): conv2.convolution.use_bias = False y = seq.apply(x) seq.initialize() - func = function([x], y, mode='FAST_RUN') + func = function([x], y) x_val = numpy.ones((batch_size, 4, 17, 13), dtype=theano.config.floatX) y_val = (numpy.ones((batch_size, 4, 4, 2)) * From 2a68d89b59242e971bb5568516a00c8e4484cf7f Mon Sep 17 00:00:00 2001 From: Vincent Dumoulin Date: Thu, 21 Jan 2016 14:58:34 -0500 Subject: [PATCH 086/129] Fix superclass call --- blocks/bricks/conv.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index c3a27b95..186ed387 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -580,7 +580,7 @@ def get_dim(self, name): return self.convolution.get_dim(name) def _push_allocation_config(self): - super(ConvolutionalActivation, self)._push_allocation_config() + super(ConvolutionalTransposeActivation, self)._push_allocation_config() self.convolution.step = self.step self.convolution.original_image_size = self.original_image_size From 7c895aa0b609c4a67909575487c6ad13f198ed00 Mon Sep 17 00:00:00 2001 From: Vincent Dumoulin Date: Fri, 22 Jan 2016 09:47:46 -0500 Subject: [PATCH 087/129] Construct grad op using constant values rather than depend on a shared variable --- blocks/bricks/conv.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index 186ed387..e254c1cb 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -294,11 +294,11 @@ def apply(self, input_): W, b = self.parameters else: W, = self.parameters - out_shape = tensor.stack( - *((input_.shape[0],) + self.get_dim('output'))) + imshp = tensor.stack(*((input_.shape[0],) + self.get_dim('output'))) + kshp = (self.num_channels, self.num_filters) + self.filter_size output = AbstractConv2d_gradInputs( - imshp=out_shape, kshp=W.shape, border_mode=self.border_mode, - subsample=self.step)(W, input_, out_shape[-2:]) + imshp=imshp, kshp=kshp, border_mode=self.border_mode, + subsample=self.step)(W, input_, imshp[-2:]) if self.use_bias: if self.tied_biases: output += b.dimshuffle('x', 0, 'x', 'x') From abf41f822af731676e0915f37e3a3f065ced6030 Mon Sep 17 00:00:00 2001 From: Vincent Dumoulin Date: Fri, 22 Jan 2016 09:57:20 -0500 Subject: [PATCH 088/129] Make imshp not depend on input_ --- blocks/bricks/conv.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index e254c1cb..030822fb 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -294,7 +294,7 @@ def apply(self, input_): W, b = self.parameters else: W, = self.parameters - imshp = tensor.stack(*((input_.shape[0],) + self.get_dim('output'))) + imshp = (None,) + self.get_dim('output') kshp = (self.num_channels, self.num_filters) + self.filter_size output = AbstractConv2d_gradInputs( imshp=imshp, kshp=kshp, border_mode=self.border_mode, From ff08eb8ad897f6f9dd56e23ad5154d19f5c31c89 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Fri, 22 Jan 2016 18:03:59 -0500 Subject: [PATCH 089/129] Reduce repeated code in constructors. --- blocks/bricks/conv.py | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index 030822fb..85a6f998 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -513,7 +513,7 @@ class ConvolutionalActivation(_AllocationMixin, Sequence, Initializable): def __init__(self, activation, filter_size, num_filters, num_channels, batch_size=None, image_size=None, step=(1, 1), border_mode='valid', tied_biases=False, **kwargs): - self.convolution = Convolutional() + self._build_convolution() self.filter_size = filter_size self.num_filters = num_filters @@ -528,6 +528,9 @@ def __init__(self, activation, filter_size, num_filters, num_channels, application_methods=[self.convolution.apply, activation], **kwargs) + def _build_convolution(self): + self.convolution = Convolutional() + def get_dim(self, name): # TODO The name of the activation output doesn't need to be `output` return self.convolution.get_dim(name) @@ -559,21 +562,15 @@ def __init__(self, activation, filter_size, num_filters, num_channels, original_image_size, batch_size=None, image_size=None, step=(1, 1), border_mode='valid', tied_biases=False, **kwargs): - self.convolution = ConvolutionalTranspose() + super(ConvolutionalTransposeActivation, self).__init__( + activation, filter_size, num_filters, num_channels, + batch_size, image_size, step, border_mode, tied_biases, + **kwargs) - self.filter_size = filter_size - self.num_filters = num_filters - self.num_channels = num_channels - self.batch_size = batch_size - self.image_size = image_size self.original_image_size = original_image_size - self.step = step - self.border_mode = border_mode - self.tied_biases = tied_biases - super(ConvolutionalTransposeActivation, self).__init__( - application_methods=[self.convolution.apply, activation], - **kwargs) + def _build_convolution(self): + self.convolution = ConvolutionalTranspose() def get_dim(self, name): # TODO The name of the activation output doesn't need to be `output` From 6712e44a79c114b9cb75f0d13f2e841d60e4e594 Mon Sep 17 00:00:00 2001 From: Vincent Dumoulin Date: Fri, 22 Jan 2016 18:07:29 -0500 Subject: [PATCH 090/129] Make ConvolutionalTranspose inherit from Convolutional --- blocks/bricks/conv.py | 131 ++++++------------------------------------ 1 file changed, 17 insertions(+), 114 deletions(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index 85a6f998..29c7584c 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -180,143 +180,46 @@ def num_output_channels(self): return self.num_filters -class ConvolutionalTranspose(Initializable): +class ConvolutionalTranspose(Convolutional): """Performs the transpose of a 2D convolution. Parameters ---------- - filter_size : tuple - The height and width of the filter (also called *kernels*). - num_filters : int - Number of filters per channel. - num_channels : int - Number of input channels in the image. For the first layer this is - normally 1 for grayscale images and 3 for color (RGB) images. For - subsequent layers this is equal to the number of filters output by - the previous convolutional layer. The filters are pooled over the - channels. + image_size : tuple, optional + Required for tied biases. Defaults to ``None``. original_image_size : tuple The height and width of the output (image or feature map). - batch_size : int, optional - Number of examples per batch. If given, this will be passed to - Theano convolution operator, possibly resulting in faster - execution. - image_size : tuple, optional - The height and width of the input (image or feature map). If given, - this will be passed to the Theano convolution operator, resulting - in possibly faster execution times. - step : tuple, optional - The step (or stride) with which to slide the filters over the - image. Defaults to (1, 1). - border_mode : {'valid', 'full'}, optional - The border mode to use, see :func:`scipy.signal.convolve2d` for - details. Defaults to 'valid'. - tied_biases : bool - If ``True``, it indicates that the biases of every filter in this - layer should be shared amongst all applications of that filter. - Setting this to ``False`` will untie the biases, yielding a - separate bias for every location at which the filter is applied. - Defaults to ``False``. + + See Also + -------- + :class:`Convolutional` : For the documentation of other parameters. """ @lazy(allocation=['filter_size', 'num_filters', 'num_channels', 'original_image_size']) def __init__(self, filter_size, num_filters, num_channels, - original_image_size, batch_size=None, image_size=(None, None), - step=(1, 1), border_mode='valid', tied_biases=False, - **kwargs): - super(ConvolutionalTranspose, self).__init__(**kwargs) - - self.filter_size = filter_size - self.num_filters = num_filters - self.batch_size = batch_size - self.num_channels = num_channels - self.image_size = image_size + original_image_size, **kwargs): + super(ConvolutionalTranspose, self).__init__( + filter_size, num_filters, num_channels, **kwargs) self.original_image_size = original_image_size - self.step = step - self.border_mode = border_mode - self.tied_biases = tied_biases - def _allocate(self): + def conv2d_impl(self, input_, W, image_shape, subsample, border_mode, + filter_shape): # The AbstractConv2d_gradInputs op takes a kernel that was used for the # **convolution**. We therefore have to invert num_channels and # num_filters for W. - W = shared_floatx_nans((self.num_channels, self.num_filters) + - self.filter_size, name='W') - add_role(W, FILTER) - self.parameters.append(W) - self.add_auxiliary_variable(W.norm(2), name='W_norm') - if self.use_bias: - if self.tied_biases: - b = shared_floatx_nans((self.num_filters,), name='b') - else: - # this error is raised here instead of during initializiation - # because ConvolutionalSequence may specify the image size - if self.image_size == (None, None) and not self.tied_biases: - raise ValueError('Cannot infer bias size without ' - 'image_size specified. If you use ' - 'variable image_size, you should use ' - 'tied_biases=True.') - - b = shared_floatx_nans(self.get_dim('output'), name='b') - add_role(b, BIAS) - - self.parameters.append(b) - self.add_auxiliary_variable(b.norm(2), name='b_norm') - - def _initialize(self): - if self.use_bias: - W, b = self.parameters - self.biases_init.initialize(b, self.rng) - else: - W, = self.parameters - self.weights_init.initialize(W, self.rng) - - @application(inputs=['input_'], outputs=['output']) - def apply(self, input_): - """Perform the transposed convolution. - - Parameters - ---------- - input_ : :class:`~tensor.TensorVariable` - A 4D tensor with the axes representing batch size, number of - channels, image height, and image width. - - Returns - ------- - output : :class:`~tensor.TensorVariable` - A 4D tensor of filtered images (feature maps) with dimensions - representing batch size, number of filters, feature map height, - and feature map width. - - """ - if self.use_bias: - W, b = self.parameters - else: - W, = self.parameters + W = W.transpose(1, 0, 2, 3) imshp = (None,) + self.get_dim('output') - kshp = (self.num_channels, self.num_filters) + self.filter_size - output = AbstractConv2d_gradInputs( - imshp=imshp, kshp=kshp, border_mode=self.border_mode, - subsample=self.step)(W, input_, imshp[-2:]) - if self.use_bias: - if self.tied_biases: - output += b.dimshuffle('x', 0, 'x', 'x') - else: - output += b.dimshuffle('x', 0, 1, 2) - return output + kshp = (filter_shape[1], filter_shape[0]) + filter_shape[2:] + return AbstractConv2d_gradInputs( + imshp=imshp, kshp=kshp, border_mode=border_mode, + subsample=subsample)(W, input_, self.get_dim('output')[1:]) def get_dim(self, name): - if name == 'input_': - return (self.num_channels,) + self.image_size if name == 'output': return (self.num_filters,) + self.original_image_size return super(ConvolutionalTranspose, self).get_dim(name) - @property - def num_output_channels(self): - return self.num_filters - class Pooling(Initializable, Feedforward): """Base Brick for pooling operations. From 65e94351d26dfc0096b110810511f6181bcd44d3 Mon Sep 17 00:00:00 2001 From: Vincent Dumoulin Date: Fri, 22 Jan 2016 18:16:22 -0500 Subject: [PATCH 091/129] Clarify parameter description --- blocks/bricks/conv.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index 29c7584c..5378a2b0 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -187,8 +187,20 @@ class ConvolutionalTranspose(Convolutional): ---------- image_size : tuple, optional Required for tied biases. Defaults to ``None``. + num_filters : int + Number of filters at the *output* of the transposed convolution, + i.e. the number of channels in the corresponding convolution. + num_channels : int + Number of channels at the *input* of the transposed convolution, + i.e. the number of output filters in the corresponding + convolution. original_image_size : tuple - The height and width of the output (image or feature map). + The height and width of the image that forms the output of + the transpose operation, which is the input of the original + (non-transposed) convolution. + step : tuple, optional + The step (or stride) of the corresponding *convolution*. + Defaults to (1, 1). See Also -------- From 843d3ff805d6866f7e3540e439e7e47ce75eefc5 Mon Sep 17 00:00:00 2001 From: Vincent Dumoulin Date: Sat, 23 Jan 2016 09:28:05 -0500 Subject: [PATCH 092/129] Replace deprecated `image_shape` kwarg with `input_shape` --- blocks/bricks/conv.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index 5378a2b0..91403a9a 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -52,7 +52,7 @@ class Convolutional(Initializable): # to leverage features not yet available in Theano's standard conv2d. # The function you override with here should accept at least the # input and the kernels as positionals, and the keyword arguments - # image_shape, subsample, border_mode, and filter_shape. If some of + # input_shape, subsample, border_mode, and filter_shape. If some of # these are unsupported they should still be accepted and ignored, # e.g. with a wrapper function that swallows **kwargs. conv2d_impl = staticmethod(conv2d) @@ -143,14 +143,14 @@ def apply(self, input_): W, = self.parameters if self.image_size == (None, None): - image_shape = None + input_shape = None else: - image_shape = (self.batch_size, self.num_channels) - image_shape += self.image_size + input_shape = (self.batch_size, self.num_channels) + input_shape += self.image_size output = self.conv2d_impl( input_, W, - image_shape=image_shape, + input_shape=input_shape, subsample=self.step, border_mode=self.border_mode, filter_shape=((self.num_filters, self.num_channels) + @@ -166,10 +166,10 @@ def get_dim(self, name): if name == 'input_': return (self.num_channels,) + self.image_size if name == 'output': - image_shape = (None, self.num_channels) + self.image_size + input_shape = (None, self.num_channels) + self.image_size kernel_shape = ((self.num_filters, self.num_channels) + self.filter_size) - out_shape = self.get_output_shape(image_shape, kernel_shape, + out_shape = self.get_output_shape(input_shape, kernel_shape, self.border_mode, self.step) assert len(out_shape) == 4 return out_shape[1:] From 87d143f8f1a9ec9fc7ab48e64833be7de827e8ae Mon Sep 17 00:00:00 2001 From: Vincent Dumoulin Date: Sat, 23 Jan 2016 09:30:44 -0500 Subject: [PATCH 093/129] Reorder constructor args to help remove duplicate code --- blocks/bricks/conv.py | 47 +++++++++++++++++-------------------------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index 91403a9a..842d7490 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -185,8 +185,10 @@ class ConvolutionalTranspose(Convolutional): Parameters ---------- - image_size : tuple, optional - Required for tied biases. Defaults to ``None``. + original_image_size : tuple + The height and width of the image that forms the output of + the transpose operation, which is the input of the original + (non-transposed) convolution. num_filters : int Number of filters at the *output* of the transposed convolution, i.e. the number of channels in the corresponding convolution. @@ -194,28 +196,28 @@ class ConvolutionalTranspose(Convolutional): Number of channels at the *input* of the transposed convolution, i.e. the number of output filters in the corresponding convolution. - original_image_size : tuple - The height and width of the image that forms the output of - the transpose operation, which is the input of the original - (non-transposed) convolution. step : tuple, optional The step (or stride) of the corresponding *convolution*. Defaults to (1, 1). + image_size : tuple, optional + Image size of the input to the *transposed* convolution, i.e. + the output of the corresponding convolution. Required for tied + biases. Defaults to ``None``. See Also -------- :class:`Convolutional` : For the documentation of other parameters. """ - @lazy(allocation=['filter_size', 'num_filters', 'num_channels', - 'original_image_size']) - def __init__(self, filter_size, num_filters, num_channels, - original_image_size, **kwargs): + @lazy(allocation=['original_image_size', 'filter_size', 'num_filters', + 'num_channels']) + def __init__(self, original_image_size, filter_size, num_filters, + num_channels, **kwargs): super(ConvolutionalTranspose, self).__init__( filter_size, num_filters, num_channels, **kwargs) self.original_image_size = original_image_size - def conv2d_impl(self, input_, W, image_shape, subsample, border_mode, + def conv2d_impl(self, input_, W, input_shape, subsample, border_mode, filter_shape): # The AbstractConv2d_gradInputs op takes a kernel that was used for the # **convolution**. We therefore have to invert num_channels and @@ -455,8 +457,7 @@ def _push_allocation_config(self): self.convolution.step = self.step -class ConvolutionalTransposeActivation(_AllocationMixin, Sequence, - Initializable): +class ConvolutionalTransposeActivation(ConvolutionalActivation): """A transposed convolution followed by an activation function. Parameters @@ -471,29 +472,19 @@ class ConvolutionalTransposeActivation(_AllocationMixin, Sequence, parameters. """ - @lazy(allocation=['filter_size', 'num_filters', 'num_channels', - 'original_image_size']) - def __init__(self, activation, filter_size, num_filters, num_channels, - original_image_size, batch_size=None, image_size=None, - step=(1, 1), border_mode='valid', tied_biases=False, - **kwargs): + @lazy(allocation=['original_image_size', 'filter_size', 'num_filters', + 'num_channels']) + def __init__(self, activation, original_image_size, filter_size, + num_filters, num_channels, **kwargs): super(ConvolutionalTransposeActivation, self).__init__( - activation, filter_size, num_filters, num_channels, - batch_size, image_size, step, border_mode, tied_biases, - **kwargs) - + activation, filter_size, num_filters, num_channels, **kwargs) self.original_image_size = original_image_size def _build_convolution(self): self.convolution = ConvolutionalTranspose() - def get_dim(self, name): - # TODO The name of the activation output doesn't need to be `output` - return self.convolution.get_dim(name) - def _push_allocation_config(self): super(ConvolutionalTransposeActivation, self)._push_allocation_config() - self.convolution.step = self.step self.convolution.original_image_size = self.original_image_size From 648646d2dd8c8d3d727eb1c8affd2482fe5a4c52 Mon Sep 17 00:00:00 2001 From: Vincent Dumoulin Date: Sat, 23 Jan 2016 09:32:21 -0500 Subject: [PATCH 094/129] Add test for ConvolutionalTransposeActivation --- tests/bricks/test_conv.py | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/tests/bricks/test_conv.py b/tests/bricks/test_conv.py index 197ce924..312db893 100644 --- a/tests/bricks/test_conv.py +++ b/tests/bricks/test_conv.py @@ -7,10 +7,12 @@ from theano import tensor from theano import function -from blocks.bricks import Rectifier +from blocks.bricks import Rectifier, Tanh from blocks.bricks.conv import (Convolutional, ConvolutionalTranspose, MaxPooling, AveragePooling, - ConvolutionalActivation, ConvolutionalSequence) + ConvolutionalActivation, + ConvolutionalTransposeActivation, + ConvolutionalSequence) from blocks.initialization import Constant from blocks.graph import ComputationGraph @@ -48,9 +50,9 @@ def test_convolutional_transpose(): filter_size = (3, 3) step = (2, 2) conv = ConvolutionalTranspose( - filter_size, num_filters, num_channels, step=step, - original_image_size=original_image_size, image_size=image_size, - weights_init=Constant(1.), biases_init=Constant(5.)) + original_image_size, filter_size, num_filters, num_channels, step=step, + image_size=image_size, weights_init=Constant(1.), + biases_init=Constant(5.)) conv.initialize() y = conv.apply(x) func = function([x], y) @@ -288,6 +290,33 @@ def test_convolutional_activation_use_bias(): assert len(ComputationGraph([act.apply(tensor.tensor4())]).parameters) == 1 +def test_convolutional_transpose_activation(): + x = tensor.tensor4('x') + num_channels = 4 + num_filters = 3 + image_size = (8, 6) + original_image_size = (17, 13) + batch_size = 5 + filter_size = (3, 3) + step = (2, 2) + conv = ConvolutionalTransposeActivation( + Tanh().apply, original_image_size, filter_size, num_filters, + num_channels, step=step, image_size=image_size, + weights_init=Constant(1.), biases_init=Constant(5.)) + conv.initialize() + y = conv.apply(x) + func = function([x], y) + + x_val = numpy.ones((batch_size, num_channels) + image_size, + dtype=theano.config.floatX) + expected_value = num_channels * numpy.ones( + (batch_size, num_filters) + original_image_size) + expected_value[:, :, 2:-2:2, :] += num_channels + expected_value[:, :, :, 2:-2:2] += num_channels + expected_value[:, :, 2:-2:2, 2:-2:2] += num_channels + assert_allclose(func(x_val), numpy.tanh(expected_value + 5)) + + def test_convolutional_sequence_use_bias(): cnn = ConvolutionalSequence( [ConvolutionalActivation(activation=Rectifier().apply, From 417dbdf8d916c0620c19fb40dd4ccb7fc18e632d Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Sat, 23 Jan 2016 22:07:41 -0500 Subject: [PATCH 095/129] Skip test_save_the_best with sqlite. --- blocks/utils/testing.py | 21 +++++++++++++++++++++ tests/extensions/test_training.py | 4 +++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/blocks/utils/testing.py b/blocks/utils/testing.py index b100bc44..a097eddd 100644 --- a/blocks/utils/testing.py +++ b/blocks/utils/testing.py @@ -76,6 +76,27 @@ def skip_if_not_available(modules=None, datasets=None, configurations=None): raise SkipTest +def skip_if_configuration_set(configuration, value, message=None): + """Raise SkipTest if a configuration option has a certain value. + + Parameters + ---------- + configuration : str + Configuration option to check. + value : str + Value of `blocks.config.` which should cause + a `SkipTest` to be raised. + message : str, optional + Reason for skipping the test. + + """ + if getattr(config, configuration) == value: + if message is not None: + raise SkipTest(message) + else: + raise SkipTest + + class MockAlgorithm(TrainingAlgorithm): """An algorithm that only saves data. diff --git a/tests/extensions/test_training.py b/tests/extensions/test_training.py index d874e40b..607aac8f 100644 --- a/tests/extensions/test_training.py +++ b/tests/extensions/test_training.py @@ -18,7 +18,7 @@ from blocks.extensions.predicates import OnLogRecord from blocks.main_loop import MainLoop from blocks.utils import shared_floatx -from blocks.utils.testing import MockMainLoop +from blocks.utils.testing import MockMainLoop, skip_if_configuration_set def test_shared_variable_modifier(): @@ -129,6 +129,8 @@ def after_batch(self, batch): def test_save_the_best(): + skip_if_configuration_set('log_backend', 'sqlite', + "Known to be flaky with SQLite log backend.") with NamedTemporaryFile(dir=config.temp_dir) as dst,\ NamedTemporaryFile(dir=config.temp_dir) as dst_best: track_cost = TrackTheBest("cost", after_epoch=False, after_batch=True) From 56c8a7f3247d37191ada014843fd944c61f68e2a Mon Sep 17 00:00:00 2001 From: Pooya Date: Tue, 26 Jan 2016 10:18:53 -0500 Subject: [PATCH 096/129] add edges to figure --- docs/rnn.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/rnn.rst b/docs/rnn.rst index e377fee4..a92bdbda 100644 --- a/docs/rnn.rst +++ b/docs/rnn.rst @@ -197,9 +197,10 @@ figure below). h1_0 -> plus_1_1 -> h1_1 -> plus_1_2 -> h1_2 -> plus_1_3 -> h1_3; h2_0 -> plus_2_1 -> h2_1 -> plus_2_2 -> h2_2 -> plus_2_3 -> h2_3; h1_1 -> plus_2_1; h1_2 -> plus_2_2; h1_3 -> plus_2_3; + h2_0 -> plus_1_1; h2_1 -> plus_1_2; h2_2 -> plus_1_3; edge [style=invis]; - h2_0 -> h1_1; h2_1 -> h1_2; h2_2 -> h1_3; + h2_0 -> h1_1; h2_1 -> h1_2; h2_2 -> h1_3; plus_2_1 -> plus_1_1; plus_2_2 -> plus_1_2; plus_2_3 -> plus_1_3; { rank=source; h2_0, h2_1, h2_2, h2_3, plus_2_1, plus_2_2, plus_2_3 } From 1094719d8f6dc9e1076519fa1283ed95ab4a1179 Mon Sep 17 00:00:00 2001 From: Pooya Date: Wed, 27 Jan 2016 11:10:43 -0500 Subject: [PATCH 097/129] applying the changes on the feedback rnn figure --- docs/rnn.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/rnn.rst b/docs/rnn.rst index a92bdbda..5bebc6a8 100644 --- a/docs/rnn.rst +++ b/docs/rnn.rst @@ -195,13 +195,14 @@ figure below). x_1 -> plus_1_1; x_2 -> plus_1_2; x_3 -> plus_1_3; h1_0 -> plus_1_1 -> h1_1 -> plus_1_2 -> h1_2 -> plus_1_3 -> h1_3; + plus_1_1 -> plus_2_1; plus_1_2 -> plus_2_2; plus_1_3 -> plus_2_3; h2_0 -> plus_2_1 -> h2_1 -> plus_2_2 -> h2_2 -> plus_2_3 -> h2_3; - h1_1 -> plus_2_1; h1_2 -> plus_2_2; h1_3 -> plus_2_3; h2_0 -> plus_1_1; h2_1 -> plus_1_2; h2_2 -> plus_1_3; + + edge [style=invis]; - h2_0 -> h1_1; h2_1 -> h1_2; h2_2 -> h1_3; - plus_2_1 -> plus_1_1; plus_2_2 -> plus_1_2; plus_2_3 -> plus_1_3; + h2_0 -> h1_0; h2_1 -> h1_1; h2_2 -> h1_2; { rank=source; h2_0, h2_1, h2_2, h2_3, plus_2_1, plus_2_2, plus_2_3 } { rank=same; h1_0, h1_1, h1_2, h1_3, plus_1_1, plus_1_2, plus_1_3 } From 0966c01f54aac4d6ead8488e128a16bb1d1aa705 Mon Sep 17 00:00:00 2001 From: rizar Date: Wed, 27 Jan 2016 18:50:20 -0500 Subject: [PATCH 098/129] Optionally use bias in ShallowEnergyComputer --- blocks/bricks/attention.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/blocks/bricks/attention.py b/blocks/bricks/attention.py index c1aeb82e..8946ea0a 100644 --- a/blocks/bricks/attention.py +++ b/blocks/bricks/attention.py @@ -415,11 +415,20 @@ def get_dim(self, name): class ShallowEnergyComputer(Sequence, Initializable, Feedforward): - """A simple energy computer: first tanh, then weighted sum.""" + """A simple energy computer: first tanh, then weighted sum. + + Parameters + ---------- + use_bias : bool, optional + Whether a bias should be added to the energies. Does not change + anything if softmax normalization is used to produce the attention + weights, but might be useful when e.g. spherical softmax is used. + + """ @lazy() - def __init__(self, **kwargs): + def __init__(self, use_bias=False, **kwargs): super(ShallowEnergyComputer, self).__init__( - [Tanh().apply, Linear(use_bias=False).apply], **kwargs) + [Tanh().apply, Linear(use_bias=use_bias).apply], **kwargs) @property def input_dim(self): From a2f9cf93bb087d005967e19acc5f2e27f2d574c5 Mon Sep 17 00:00:00 2001 From: serdyuk Date: Fri, 26 Jun 2015 11:48:28 -0400 Subject: [PATCH 099/129] Added get dim for lookup table --- blocks/bricks/lookup.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/blocks/bricks/lookup.py b/blocks/bricks/lookup.py index 175fc0d8..1a902e63 100644 --- a/blocks/bricks/lookup.py +++ b/blocks/bricks/lookup.py @@ -61,3 +61,9 @@ def apply(self, indices): output_shape = [indices.shape[i] for i in range(indices.ndim)] + [self.dim] return self.W[indices.flatten()].reshape(output_shape) + + def get_dim(self, name): + if name == 'output': + return self.dim + if name == 'input_': + return 0 From 9c3e0f37db2bf16b28f1aa9544ec735ec1886b9a Mon Sep 17 00:00:00 2001 From: rizar Date: Thu, 2 Jul 2015 15:26:20 +0000 Subject: [PATCH 100/129] [To backport] give a role the LookupTable's parameter Conflicts: blocks/bricks/lookup.py --- blocks/bricks/lookup.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/blocks/bricks/lookup.py b/blocks/bricks/lookup.py index 1a902e63..410a466a 100644 --- a/blocks/bricks/lookup.py +++ b/blocks/bricks/lookup.py @@ -1,6 +1,7 @@ """Introduces Lookup brick.""" from blocks.bricks import Initializable from blocks.bricks.base import application, lazy +from blocks.roles import WEIGHT, add_role from blocks.utils import check_theano_variable, shared_floatx_nans @@ -35,6 +36,7 @@ def W(self): def _allocate(self): self.parameters.append(shared_floatx_nans((self.length, self.dim), name='W')) + add_role(self.parameters[-1], WEIGHT) def _initialize(self): self.weights_init.initialize(self.W, self.rng) From abecbff47812932c26a792eac133fac20bc68276 Mon Sep 17 00:00:00 2001 From: rizar Date: Thu, 28 Jan 2016 10:47:59 -0500 Subject: [PATCH 101/129] Test get_dim and make it actuall work --- blocks/bricks/lookup.py | 4 ++-- tests/bricks/test_lookup.py | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/blocks/bricks/lookup.py b/blocks/bricks/lookup.py index 410a466a..5744b5de 100644 --- a/blocks/bricks/lookup.py +++ b/blocks/bricks/lookup.py @@ -41,7 +41,7 @@ def _allocate(self): def _initialize(self): self.weights_init.initialize(self.W, self.rng) - @application + @application(inputs=['indices'], outputs=['output']) def apply(self, indices): """Perform lookup. @@ -67,5 +67,5 @@ def apply(self, indices): def get_dim(self, name): if name == 'output': return self.dim - if name == 'input_': + if name == 'indices': return 0 diff --git a/tests/bricks/test_lookup.py b/tests/bricks/test_lookup.py index 6ed0a6df..aeb77371 100644 --- a/tests/bricks/test_lookup.py +++ b/tests/bricks/test_lookup.py @@ -21,3 +21,7 @@ def test_lookup_table(): desired = numpy.array([[[3, 4, 5], [6, 7, 8]], [[0, 1, 2], [9, 10, 11]]], dtype=theano.config.floatX) assert_equal(f(x_val)[0], desired) + + # Test get_dim + assert_equal(lt.get_dim(lt.apply.inputs[0]), 0) + assert_equal(lt.get_dim(lt.apply.outputs[0]), lt.dim) From 2c590757ce408b0f600fffebf72463bc82b9c663 Mon Sep 17 00:00:00 2001 From: rizar Date: Thu, 28 Jan 2016 13:28:32 -0500 Subject: [PATCH 102/129] Better error message and test for duplicate names --- blocks/monitoring/evaluators.py | 7 ++++++- tests/monitoring/test_aggregation.py | 10 ++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/blocks/monitoring/evaluators.py b/blocks/monitoring/evaluators.py index dd298974..b7476d08 100644 --- a/blocks/monitoring/evaluators.py +++ b/blocks/monitoring/evaluators.py @@ -114,7 +114,12 @@ def __init__(self, variables, use_take_last=False): self.variable_names = [v.name for v in self.variables] if len(set(self.variable_names)) < len(self.variables): - raise ValueError("variables should have different names") + duplicates = [] + for vname in set(self.variable_names): + if self.variable_names.count(vname) > 1: + duplicates.append(vname) + raise ValueError("variables should have different names!" + " Duplicates: {}".format(', '.join(duplicates))) self._computation_graph = ComputationGraph(self.variables) self.inputs = self._computation_graph.inputs diff --git a/tests/monitoring/test_aggregation.py b/tests/monitoring/test_aggregation.py index ba16e936..a4298ae3 100644 --- a/tests/monitoring/test_aggregation.py +++ b/tests/monitoring/test_aggregation.py @@ -1,6 +1,6 @@ import numpy import theano -from numpy.testing import assert_allclose +from numpy.testing import assert_allclose, assert_raises from theano import tensor from blocks import bricks @@ -14,7 +14,7 @@ from fuel.streams import DataStream from fuel.schemes import SequentialScheme -from blocks.monitoring.evaluators import DatasetEvaluator +from blocks.monitoring.evaluators import DatasetEvaluator, AggregationBuffer class TestBrick(bricks.Brick): @@ -89,3 +89,9 @@ def test_mean_aggregator(): numpy.array([8.25, 26.75], dtype=theano.config.floatX)) assert_allclose(DatasetEvaluator([z]).evaluate(data_stream)['z'], numpy.array([35], dtype=theano.config.floatX)) + + +def test_aggregation_buffer(): + x1 = tensor.matrix('x') + x2 = tensor.matrix('x') + assert_raises(ValueError, AggregationBuffer, [x1, x2]) From 249cae234d8e992f11a6d3ff452de98f6450b521 Mon Sep 17 00:00:00 2001 From: rizar Date: Thu, 28 Jan 2016 13:54:00 -0500 Subject: [PATCH 103/129] Use compression for saving separately --- blocks/extensions/saveload.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/blocks/extensions/saveload.py b/blocks/extensions/saveload.py index becccf95..1619aff0 100644 --- a/blocks/extensions/saveload.py +++ b/blocks/extensions/saveload.py @@ -97,7 +97,8 @@ def do(self, callback_name, *args): filenames = self.save_separately_filenames(path) for attribute in self.save_separately: secure_dump(getattr(self.main_loop, attribute), - filenames[attribute], cPickle.dump) + filenames[attribute], cPickle.dump, + protocol=cPickle.HIGHEST_PROTOCOL) except Exception: path = None raise From 96aaf0a5a677520a16cd211c0b12dc331c2938ab Mon Sep 17 00:00:00 2001 From: rizar Date: Thu, 28 Jan 2016 15:26:01 -0500 Subject: [PATCH 104/129] Use default protocol for consistency with dump --- blocks/extensions/saveload.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/blocks/extensions/saveload.py b/blocks/extensions/saveload.py index 1619aff0..a2a5cfc6 100644 --- a/blocks/extensions/saveload.py +++ b/blocks/extensions/saveload.py @@ -6,7 +6,8 @@ from blocks.extensions import SimpleExtension, TrainingExtension from blocks.utils import reraise_as -from blocks.serialization import secure_dump, load, load_parameter_values +from blocks.serialization import ( + secure_dump, load, load_parameter_values, DEFAULT_PROTOCOL) logger = logging.getLogger(__name__) @@ -98,7 +99,7 @@ def do(self, callback_name, *args): for attribute in self.save_separately: secure_dump(getattr(self.main_loop, attribute), filenames[attribute], cPickle.dump, - protocol=cPickle.HIGHEST_PROTOCOL) + protocol=DEFAULT_PROTOCOL) except Exception: path = None raise From be7090f5fb4dcf8101590e31bd71f4591550f68d Mon Sep 17 00:00:00 2001 From: rizar Date: Fri, 29 Jan 2016 11:13:54 -0500 Subject: [PATCH 105/129] Safety check in LookupTable.get_dim --- blocks/bricks/lookup.py | 1 + tests/bricks/test_lookup.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/blocks/bricks/lookup.py b/blocks/bricks/lookup.py index 5744b5de..a9c43206 100644 --- a/blocks/bricks/lookup.py +++ b/blocks/bricks/lookup.py @@ -69,3 +69,4 @@ def get_dim(self, name): return self.dim if name == 'indices': return 0 + return super(LookupTable, self).get_dim(name) diff --git a/tests/bricks/test_lookup.py b/tests/bricks/test_lookup.py index aeb77371..e9c9d4ab 100644 --- a/tests/bricks/test_lookup.py +++ b/tests/bricks/test_lookup.py @@ -1,5 +1,5 @@ import numpy -from numpy.testing import assert_equal +from numpy.testing import assert_equal, assert_raises import theano from theano import tensor @@ -25,3 +25,4 @@ def test_lookup_table(): # Test get_dim assert_equal(lt.get_dim(lt.apply.inputs[0]), 0) assert_equal(lt.get_dim(lt.apply.outputs[0]), lt.dim) + assert_raises(ValueError, lt.get_dim, 'random_name') From 6835428caf6841480d142856d560aa77096dd6a4 Mon Sep 17 00:00:00 2001 From: Vincent Dumoulin Date: Fri, 29 Jan 2016 12:00:20 -0500 Subject: [PATCH 106/129] Update progressbar2 required version, fix maxval bug and make sure tests catch it --- blocks/extensions/__init__.py | 2 +- req-rtd.txt | 2 +- req-travis-pip.txt | 2 +- requirements.txt | 2 +- tests/extensions/test_progressbar.py | 6 +++++- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/blocks/extensions/__init__.py b/blocks/extensions/__init__.py index fcaadcae..445499e3 100644 --- a/blocks/extensions/__init__.py +++ b/blocks/extensions/__init__.py @@ -484,7 +484,7 @@ def create_bar(self): progressbar.Timer(), ' ', progressbar.ETA()] return progressbar.ProgressBar(widgets=widgets, - maxval=iter_per_epoch) + max_value=iter_per_epoch) def before_epoch(self): self.iter_count = 0 diff --git a/req-rtd.txt b/req-rtd.txt index 3d8af082..eeec19ea 100644 --- a/req-rtd.txt +++ b/req-rtd.txt @@ -1,5 +1,5 @@ picklable-itertools==0.1.1 -progressbar2==2.7.3 +progressbar2==3.6.0 pyyaml==3.11 six==1.9.0 toolz==0.7.2 diff --git a/req-travis-pip.txt b/req-travis-pip.txt index 0cce6731..f0ed3514 100644 --- a/req-travis-pip.txt +++ b/req-travis-pip.txt @@ -1,7 +1,7 @@ coveralls==1.0 nose2[coverage-plugin]==0.5.0 picklable-itertools==0.1.1 -progressbar2==2.7.3 +progressbar2==3.6.0 --allow-external theano --allow-unverified theano diff --git a/requirements.txt b/requirements.txt index 808fab84..06313dac 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ numpy==1.9.3 picklable-itertools==0.1.1 -progressbar2==2.7.3 +progressbar2==3.6.0 pyyaml==3.11 six==1.9.0 toolz==0.7.2 diff --git a/tests/extensions/test_progressbar.py b/tests/extensions/test_progressbar.py index 4402d9db..e31f5e66 100644 --- a/tests/extensions/test_progressbar.py +++ b/tests/extensions/test_progressbar.py @@ -16,8 +16,12 @@ def setup_mainloop(extension): DataStream and a minimal model/cost to optimize. """ + # Since progressbar2 3.6.0, the `maxval` kwarg has been replaced by + # `max_value`, which has a default value of 100. If we're still using + # `maxval` by accident, this test should fail complaining that + # the progress bar has received a value out of range. features = [numpy.array(f, dtype=theano.config.floatX) - for f in [[1, 2], [3, 4], [5, 6]]] + for f in [[1, 2]] * 101] dataset = IterableDataset(dict(features=features)) W = shared_floatx([0, 0], name='W') From 6e3cb184a5ab21e03eb30bce65d92b7729eaf221 Mon Sep 17 00:00:00 2001 From: Prayag Verma Date: Sun, 31 Jan 2016 00:03:03 +0530 Subject: [PATCH 107/129] Fix typos in docs initialiation > initialization initialiazation > initialization --- docs/create_your_own_brick.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/create_your_own_brick.rst b/docs/create_your_own_brick.rst index e29911ed..275d6232 100644 --- a/docs/create_your_own_brick.rst +++ b/docs/create_your_own_brick.rst @@ -40,7 +40,7 @@ advocated whenever it makes sense. Here are examples of possible bricks to inherit from: * :class:`.Sequence`: a sequence of bricks. -* :class:`.Initializable`: a brick that defines a same initialiation scheme +* :class:`.Initializable`: a brick that defines a same initialization scheme (weights and biases) for all its children. * :class:`.Feedforward`: declares an interface for bricks with one input and one output. @@ -58,7 +58,7 @@ of :class:`.Brick` for a precise description of the life-cycle of a brick): * :meth:`.Brick.__init__`: you should pass by argument the attributes of your brick. It is also in this method that you should create the potential "children bricks" that belongs to your brick (in that case, you have to put - the children bricks into ``self.children``). The initialiazation of the + the children bricks into ``self.children``). The initialization of the attributes can be lazy as described later in the tutorial. * :meth:`apply`: you need to implement a method that actually implements the operation of the brick, taking as arguments the inputs From 13630b6ae1e25d1ccd6629bb71b49f831ab91788 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Wed, 25 Nov 2015 17:28:58 -0500 Subject: [PATCH 108/129] Allow elementwise Activations inside ConvolutionalSequence. --- blocks/bricks/conv.py | 6 +++++- tests/bricks/test_conv.py | 26 ++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index 842d7490..04ae0652 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -4,7 +4,7 @@ get_conv_output_shape) from theano.tensor.signal.pool import pool_2d, Pool -from blocks.bricks import Initializable, Feedforward, Sequence +from blocks.bricks import Initializable, Feedforward, Sequence, Activation from blocks.bricks.base import application, Brick, lazy from blocks.roles import add_role, FILTER, BIAS from blocks.utils import shared_floatx_nans @@ -560,6 +560,10 @@ def _push_allocation_config(self): num_channels = self.num_channels image_size = self.image_size for layer in self.layers: + if isinstance(layer, Activation): + # Activations operate elementwise; nothing to set. + layer._push_allocation_config() + continue if self.border_mode is not None: layer.border_mode = self.border_mode layer.tied_biases = self.tied_biases diff --git a/tests/bricks/test_conv.py b/tests/bricks/test_conv.py index 312db893..7448b2c1 100644 --- a/tests/bricks/test_conv.py +++ b/tests/bricks/test_conv.py @@ -282,6 +282,32 @@ def test_convolutional_sequence(): assert_allclose(func(x_val), y_val) +def test_convolutional_sequence_with_raw_activation(): + seq = ConvolutionalSequence([Rectifier()], num_channels=4, + image_size=(20, 14)) + input_ = (((numpy.arange(2 * 4 * 20 * 14) + .reshape((2, 4, 20, 14)) % 2) * 2 - 1) + .astype(theano.config.floatX)) + expected_ = input_ * (input_ > 0) + x = theano.tensor.tensor4() + assert_allclose(seq.apply(x).eval({x: input_}), expected_) + + +def test_convolutional_sequence_with_convolutions_raw_activation(): + seq = ConvolutionalSequence( + [Convolutional(filter_size=(3, 3), num_filters=4), + Rectifier(), + Convolutional(filter_size=(5, 5), num_filters=3, step=(2, 2)), + Tanh()], + num_channels=2, + image_size=(21, 39)) + seq.allocate() + x = theano.tensor.tensor4() + out = seq.apply(x).eval({x: numpy.ones((10, 2, 21, 39), + dtype=theano.config.floatX)}) + assert out.shape == (10, 3, 8, 17) + + def test_convolutional_activation_use_bias(): act = ConvolutionalActivation(Rectifier().apply, (3, 3), 5, 4, image_size=(9, 9), use_bias=False) From b2990d256c9d396e8376bb4be3ec6183c4eb96a7 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Sat, 30 Jan 2016 23:31:07 -0500 Subject: [PATCH 109/129] Fix get_dim corner case, add test. --- blocks/bricks/conv.py | 10 +++++++++- tests/bricks/test_conv.py | 13 +++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index 04ae0652..a5a19ef2 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -553,7 +553,15 @@ def get_dim(self, name): if name == 'input_': return ((self.num_channels,) + self.image_size) if name == 'output': - return self.layers[-1].get_dim(name) + last = len(self.layers) - 1 + while last >= 0: + try: + return self.layers[last].get_dim(name) + except ValueError: + last -= 1 + # The output shape of an empty ConvolutionalSequence or one + # consisting only of Activations is the input shape. + return self.get_dim('input_') return super(ConvolutionalSequence, self).get_dim(name) def _push_allocation_config(self): diff --git a/tests/bricks/test_conv.py b/tests/bricks/test_conv.py index 7448b2c1..0a90708d 100644 --- a/tests/bricks/test_conv.py +++ b/tests/bricks/test_conv.py @@ -308,6 +308,19 @@ def test_convolutional_sequence_with_convolutions_raw_activation(): assert out.shape == (10, 3, 8, 17) +def test_convolutional_sequence_activation_get_dim(): + seq = ConvolutionalSequence([Tanh()], num_channels=9, image_size=(4, 6)) + seq.allocate() + assert seq.get_dim('output') == (9, 4, 6) + + seq = ConvolutionalSequence([Convolutional(filter_size=(7, 7), + num_filters=5, + border_mode=(1, 1)), + Tanh()], num_channels=8, image_size=(8, 11)) + seq.allocate() + assert seq.get_dim('output') == (5, 4, 7) + + def test_convolutional_activation_use_bias(): act = ConvolutionalActivation(Rectifier().apply, (3, 3), 5, 4, image_size=(9, 9), use_bias=False) From 00612e5367b46feba2f5bbc37574d344ee9cfb77 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Sat, 30 Jan 2016 23:31:26 -0500 Subject: [PATCH 110/129] Remove unused import that Scrutinizer missed (?). --- blocks/bricks/conv.py | 1 - 1 file changed, 1 deletion(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index a5a19ef2..58d2fc88 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -1,4 +1,3 @@ -from theano import tensor from theano.tensor.nnet import conv2d from theano.tensor.nnet.abstract_conv import (AbstractConv2d_gradInputs, get_conv_output_shape) From 465d096024ac896dd6173a26cad5eece1697593f Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Sat, 30 Jan 2016 23:47:50 -0500 Subject: [PATCH 111/129] Fix Scrutinizer issue with docstring length. --- blocks/utils/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/blocks/utils/__init__.py b/blocks/utils/__init__.py index 480fd5c6..526e0e0f 100644 --- a/blocks/utils/__init__.py +++ b/blocks/utils/__init__.py @@ -81,7 +81,8 @@ def shared_floatx_zeros_matching(shared_variable, name=None, **kwargs): name : :obj:`str`, optional The name for the shared variable. Defaults to `None`. \*\*kwargs - Keyword arguments to pass to the :func:`shared_floatx_zeros` function. + Keyword arguments to pass to the :func:`shared_floatx_zeros` + function. Returns ------- From 3569882b6600c07e3a4a84c2968ec9d774d3f407 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Sun, 31 Jan 2016 00:20:43 -0500 Subject: [PATCH 112/129] Call push_allocation_config instead of _push. --- blocks/bricks/conv.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index 58d2fc88..a6060fd4 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -569,7 +569,7 @@ def _push_allocation_config(self): for layer in self.layers: if isinstance(layer, Activation): # Activations operate elementwise; nothing to set. - layer._push_allocation_config() + layer.push_allocation_config() continue if self.border_mode is not None: layer.border_mode = self.border_mode @@ -580,7 +580,7 @@ def _push_allocation_config(self): layer.use_bias = self.use_bias # Push input dimensions to children - layer._push_allocation_config() + layer.push_allocation_config() # Retrieve output dimensions # and set it for next layer From 21832677bb58fe4fa449693e936ca0e1a859a3d4 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Sun, 31 Jan 2016 00:28:07 -0500 Subject: [PATCH 113/129] Update docstring with new functionality. --- blocks/bricks/conv.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index a6060fd4..25e25c08 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -495,6 +495,8 @@ class ConvolutionalSequence(Sequence, Initializable, Feedforward): layers : list List of convolutional bricks (i.e. :class:`Convolutional`, :class:`ConvolutionalActivation`, or :class:`Pooling` bricks). + :class:`Activation` bricks that operate elementwise can also + be included. num_channels : int Number of input channels in the image. For the first layer this is normally 1 for grayscale images and 3 for color (RGB) images. For From d2c8a88e1d801cc8449d6c542837f5b56525d516 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Mon, 1 Feb 2016 17:20:53 -0500 Subject: [PATCH 114/129] Remove ConvolutionalActivation. --- blocks/bricks/conv.py | 92 --------------------------------------- tests/bricks/test_conv.py | 71 ++++++++---------------------- 2 files changed, 17 insertions(+), 146 deletions(-) diff --git a/blocks/bricks/conv.py b/blocks/bricks/conv.py index 25e25c08..f9340c75 100644 --- a/blocks/bricks/conv.py +++ b/blocks/bricks/conv.py @@ -395,98 +395,6 @@ def __init__(self, pooling_size, step=None, input_dim=None, padding=padding, **kwargs) -class _AllocationMixin(object): - def _push_allocation_config(self): - for attr in ['filter_size', 'num_filters', 'border_mode', - 'batch_size', 'num_channels', 'image_size', - 'tied_biases', 'use_bias']: - setattr(self.convolution, attr, getattr(self, attr)) - - @property - def num_output_channels(self): - # Assumes an elementwise activation function. Would need to - # change to support e.g. maxout, but that would also require - # a way of querying the activation function for this kind of - # information. - return self.num_filters - - -class ConvolutionalActivation(_AllocationMixin, Sequence, Initializable): - """A convolution followed by an activation function. - - Parameters - ---------- - activation : :class:`.BoundApplication` - The application method to apply after convolution (i.e. - the nonlinear activation function) - - See Also - -------- - :class:`Convolutional` : For the documentation of other parameters. - - """ - @lazy(allocation=['filter_size', 'num_filters', 'num_channels']) - def __init__(self, activation, filter_size, num_filters, num_channels, - batch_size=None, image_size=None, step=(1, 1), - border_mode='valid', tied_biases=False, **kwargs): - self._build_convolution() - - self.filter_size = filter_size - self.num_filters = num_filters - self.num_channels = num_channels - self.batch_size = batch_size - self.image_size = image_size - self.step = step - self.border_mode = border_mode - self.tied_biases = tied_biases - - super(ConvolutionalActivation, self).__init__( - application_methods=[self.convolution.apply, activation], - **kwargs) - - def _build_convolution(self): - self.convolution = Convolutional() - - def get_dim(self, name): - # TODO The name of the activation output doesn't need to be `output` - return self.convolution.get_dim(name) - - def _push_allocation_config(self): - super(ConvolutionalActivation, self)._push_allocation_config() - self.convolution.step = self.step - - -class ConvolutionalTransposeActivation(ConvolutionalActivation): - """A transposed convolution followed by an activation function. - - Parameters - ---------- - activation : :class:`.BoundApplication` - The application method to apply after convolution (i.e. - the nonlinear activation function) - - See Also - -------- - :class:`ConvolutionalTranspose` : For the documentation of other - parameters. - - """ - @lazy(allocation=['original_image_size', 'filter_size', 'num_filters', - 'num_channels']) - def __init__(self, activation, original_image_size, filter_size, - num_filters, num_channels, **kwargs): - super(ConvolutionalTransposeActivation, self).__init__( - activation, filter_size, num_filters, num_channels, **kwargs) - self.original_image_size = original_image_size - - def _build_convolution(self): - self.convolution = ConvolutionalTranspose() - - def _push_allocation_config(self): - super(ConvolutionalTransposeActivation, self)._push_allocation_config() - self.convolution.original_image_size = self.original_image_size - - class ConvolutionalSequence(Sequence, Initializable, Feedforward): """A sequence of convolutional (or pooling) operations. diff --git a/tests/bricks/test_conv.py b/tests/bricks/test_conv.py index 0a90708d..8565ad5e 100644 --- a/tests/bricks/test_conv.py +++ b/tests/bricks/test_conv.py @@ -10,8 +10,6 @@ from blocks.bricks import Rectifier, Tanh from blocks.bricks.conv import (Convolutional, ConvolutionalTranspose, MaxPooling, AveragePooling, - ConvolutionalActivation, - ConvolutionalTransposeActivation, ConvolutionalSequence) from blocks.initialization import Constant from blocks.graph import ComputationGraph @@ -69,21 +67,24 @@ def test_convolutional_transpose(): def test_border_mode_not_pushed(): layers = [Convolutional(border_mode='full'), - ConvolutionalActivation(Rectifier().apply), - ConvolutionalActivation(Rectifier().apply, border_mode='valid'), - ConvolutionalActivation(Rectifier().apply, border_mode='full')] + Convolutional(), + Rectifier(), + Convolutional(border_mode='valid'), + Rectifier(), + Convolutional(border_mode='full'), + Rectifier()] stack = ConvolutionalSequence(layers) stack.push_allocation_config() assert stack.children[0].border_mode == 'full' assert stack.children[1].border_mode == 'valid' - assert stack.children[2].border_mode == 'valid' - assert stack.children[3].border_mode == 'full' + assert stack.children[3].border_mode == 'valid' + assert stack.children[5].border_mode == 'full' stack2 = ConvolutionalSequence(layers, border_mode='full') stack2.push_allocation_config() assert stack2.children[0].border_mode == 'full' assert stack2.children[1].border_mode == 'full' - assert stack2.children[2].border_mode == 'full' assert stack2.children[3].border_mode == 'full' + assert stack2.children[5].border_mode == 'full' def test_no_input_size(): @@ -257,21 +258,19 @@ def test_convolutional_sequence(): num_channels = 4 pooling_size = 3 batch_size = 5 - activation = Rectifier().apply + act = Rectifier() - conv = ConvolutionalActivation(activation, (3, 3), 5, - weights_init=Constant(1.), - biases_init=Constant(5.)) + conv = Convolutional((3, 3), 5, weights_init=Constant(1.), + biases_init=Constant(5.)) pooling = MaxPooling(pooling_size=(pooling_size, pooling_size)) - conv2 = ConvolutionalActivation(activation, (2, 2), 4, - weights_init=Constant(1.)) + conv2 = Convolutional((2, 2), 4, weights_init=Constant(1.)) - seq = ConvolutionalSequence([conv, pooling, conv2], num_channels, + seq = ConvolutionalSequence([conv, act, pooling, conv2, act], num_channels, image_size=(17, 13)) seq.push_allocation_config() assert conv.num_channels == 4 assert conv2.num_channels == 5 - conv2.convolution.use_bias = False + conv2.use_bias = False y = seq.apply(x) seq.initialize() func = function([x], y) @@ -321,46 +320,10 @@ def test_convolutional_sequence_activation_get_dim(): assert seq.get_dim('output') == (5, 4, 7) -def test_convolutional_activation_use_bias(): - act = ConvolutionalActivation(Rectifier().apply, (3, 3), 5, 4, - image_size=(9, 9), use_bias=False) - act.allocate() - assert not act.convolution.use_bias - assert len(ComputationGraph([act.apply(tensor.tensor4())]).parameters) == 1 - - -def test_convolutional_transpose_activation(): - x = tensor.tensor4('x') - num_channels = 4 - num_filters = 3 - image_size = (8, 6) - original_image_size = (17, 13) - batch_size = 5 - filter_size = (3, 3) - step = (2, 2) - conv = ConvolutionalTransposeActivation( - Tanh().apply, original_image_size, filter_size, num_filters, - num_channels, step=step, image_size=image_size, - weights_init=Constant(1.), biases_init=Constant(5.)) - conv.initialize() - y = conv.apply(x) - func = function([x], y) - - x_val = numpy.ones((batch_size, num_channels) + image_size, - dtype=theano.config.floatX) - expected_value = num_channels * numpy.ones( - (batch_size, num_filters) + original_image_size) - expected_value[:, :, 2:-2:2, :] += num_channels - expected_value[:, :, :, 2:-2:2] += num_channels - expected_value[:, :, 2:-2:2, 2:-2:2] += num_channels - assert_allclose(func(x_val), numpy.tanh(expected_value + 5)) - - def test_convolutional_sequence_use_bias(): cnn = ConvolutionalSequence( - [ConvolutionalActivation(activation=Rectifier().apply, - filter_size=(1, 1), num_filters=1) - for _ in range(3)], + sum([[Convolutional(filter_size=(1, 1), num_filters=1), Rectifier()] + for _ in range(3)], []), num_channels=1, image_size=(1, 1), use_bias=False) cnn.allocate() From bdd6334f8dffd789a5b7fbe733f98c4de2f5667f Mon Sep 17 00:00:00 2001 From: John Arevalo Date: Tue, 2 Feb 2016 15:52:40 -0500 Subject: [PATCH 115/129] define hyperparameters as theano variables --- blocks/algorithms/__init__.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/blocks/algorithms/__init__.py b/blocks/algorithms/__init__.py index 96a36fd6..d3032b63 100644 --- a/blocks/algorithms/__init__.py +++ b/blocks/algorithms/__init__.py @@ -743,8 +743,10 @@ class AdaGrad(StepRule): """ def __init__(self, learning_rate=0.002, epsilon=1e-6): - self.learning_rate = learning_rate - self.epsilon = epsilon + self.learning_rate = shared_floatx(learning_rate, "learning_rate") + self.epsilon = shared_floatx(epsilon, "epsilon") + add_role(self.learning_rate, ALGORITHM_HYPERPARAMETER) + add_role(self.epsilon, ALGORITHM_HYPERPARAMETER) def compute_step(self, parameter, previous_step): name = 'adagrad_sqs' @@ -789,11 +791,14 @@ class Adam(StepRule): def __init__(self, learning_rate=0.002, beta1=0.1, beta2=0.001, epsilon=1e-8, decay_factor=(1 - 1e-8)): - self.learning_rate = learning_rate - self.beta1 = beta1 - self.beta2 = beta2 - self.epsilon = epsilon - self.decay_factor = decay_factor + self.learning_rate = shared_floatx(learning_rate, "learning_rate") + self.beta1 = shared_floatx(beta1, "beta1") + self.beta2 = shared_floatx(beta2, "beta2") + self.epsilon = shared_floatx(epsilon, "epsilon") + self.decay_factor = shared_floatx(decay_factor, "decay_factor") + for param in [self.learning_rate, self.beta1, self.beta2, self.epsilon, + self.decay_factor]: + add_role(param, ALGORITHM_HYPERPARAMETER) def compute_step(self, parameter, previous_step): mean = shared_floatx_zeros_matching(parameter, 'mean') From 0b36a5498cc616486bb7b1714d936ffacbfe843b Mon Sep 17 00:00:00 2001 From: rizar Date: Sat, 6 Feb 2016 18:19:14 -0500 Subject: [PATCH 116/129] Fix Application pickling --- blocks/bricks/base.py | 7 +++++++ tests/bricks/test_bricks.py | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/blocks/bricks/base.py b/blocks/bricks/base.py index cfabb4ee..6bd0d29d 100644 --- a/blocks/bricks/base.py +++ b/blocks/bricks/base.py @@ -326,6 +326,13 @@ def copy_and_tag(variable, role, name): return OrderedDict(zip(bound_application.outputs, outputs)) return unpack(outputs) + # Application instances are used instead of usual methods in bricks. + # The usual methods are not pickled per-se, similarly to classes + # and modules. Instead, a reference to the method is put into the pickle. + # Here, we ensure the same behaviour for Application instances. + def __reduce__(self): + return (getattr, (self.brick, self.application_name)) + class BoundApplication(object): """An application method bound to a :class:`Brick` instance.""" diff --git a/tests/bricks/test_bricks.py b/tests/bricks/test_bricks.py index 6287f1d7..86d93acb 100644 --- a/tests/bricks/test_bricks.py +++ b/tests/bricks/test_bricks.py @@ -3,6 +3,7 @@ import theano from numpy.testing import assert_allclose, assert_raises from theano import tensor +from six.moves import cPickle from blocks.bricks import (Identity, Linear, Maxout, LinearMaxout, MLP, Tanh, Sequence, Random, Logistic, Softplus, Softmax) @@ -249,6 +250,10 @@ def test_application(): assert TestBrick.delegated_apply.inputs == ['w'] +def test_application_serialization(): + assert id(cPickle.loads(cPickle.dumps(Linear.apply))) == id(Linear.apply) + + def test_apply(): brick = TestBrick(0) assert TestBrick.apply(brick, [0]) == [0, 1] From baf64aba183b0501997786b11156cb786e45b426 Mon Sep 17 00:00:00 2001 From: David Warde-Farley Date: Sun, 7 Feb 2016 21:52:25 -0500 Subject: [PATCH 117/129] Add "before filing issue" section to CONTRIBUTING. --- CONTRIBUTING.rst | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index d010396d..075e6ecd 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -1,3 +1,26 @@ +Filing an issue +=============== +If you are having a problem, then *before* filing an issue, please verify +the following: + +* That you are using a **compatible version of Python** -- this means version + 3.4 or newer for mainline Python. Legacy Python support is limited to 2.7 and + will eventually be dropped, and not all features may be available; users are + encouraged to move to Python 3.x as soon as possible. +* That you are using **the latest version of Theano** from the GitHub ``master`` + branch. Blocks is developed concurrently with Theano's bleeding edge development + and many problems with using Blocks can be traced to using the latest stable + version of Theano (or an insufficiently recent GitHub checkout). Please see the + `Blocks installation instructions`_ for more details. +* You are using the latest Blocks (and Fuel_) from the GitHub ``master`` + branch. If you are using ``stable``, then if possible, please check if your + problem persists if you switch to using ``master``. It may still be worth + filing the issue if your problem is fixed in ``master``, if it is a serious + enough problem to warrant backporting a fix to ``stable``. +* That your issue is about the software itself -- either a bug report, feature + request, question on how to accomplish a certain defined operation within + Blocks, etc. -- and not a general machine learning or neural networks question. + Making a pull request ===================== @@ -49,6 +72,8 @@ mailing list and the GitHub issues to make sure the answer isn't out there already. .. _Blocks users mailing list: https://groups.google.com/forum/#!forum/blocks-users +.. _Blocks installation instructions: https://blocks.readthedocs.org/en/latest/setup.html +.. _Fuel: http://fuel.readthedocs.org/ .. _quick reference: https://blocks.readthedocs.org/en/latest/development/pull_request.html .. _the documentation: https://blocks.readthedocs.org/en/latest/development/index.html#formatting-guidelines .. _coding guidelines: https://blocks.readthedocs.org/en/latest/development/index.html#code-guidelines From 18a12d007b2068e1dabf87ef5eb3e47671964a27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20B=C4=9Blohl=C3=A1vek?= Date: Wed, 10 Feb 2016 13:42:56 +0100 Subject: [PATCH 118/129] typo --- docs/serialization.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/serialization.rst b/docs/serialization.rst index 8e6adbf5..6582b977 100644 --- a/docs/serialization.rst +++ b/docs/serialization.rst @@ -54,7 +54,7 @@ Parameter saving This is why Blocks intercepts the pickling of all Theano shared variables (which includes the parameters), and stores them as separate NPY_ files. The resulting -file is a ZIP arcive that contains the pickled main loop as well as a collection +file is a ZIP archive that contains the pickled main loop as well as a collection of NumPy arrays. The NumPy arrays (and hence parameters) in the ZIP file can be read, across platforms, using the :func:`numpy.load` function, making it possible to inspect and load parameter values, even if the unpickling of the From bbe44f90aa52bcc3eb94c0b7b59060bb5b99529c Mon Sep 17 00:00:00 2001 From: Jakub Sygnowski Date: Fri, 12 Feb 2016 20:19:44 +0100 Subject: [PATCH 119/129] Corrected typo in model doc "hierarhical" -> "hierarchical" --- blocks/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blocks/model.py b/blocks/model.py index 2febc371..93c5f11c 100644 --- a/blocks/model.py +++ b/blocks/model.py @@ -7,7 +7,7 @@ created by Blocks typically has, such as bricks and application calls. The :class:`Model` adds this functionality. Using :class:`Model` you can do things like query all the bricks used to build the computation graph, -request "hierarhical names" of the parameters (a hierarchical name is a +request "hierarchical names" of the parameters (a hierarchical name is a path-like string which in addition to the parameter's name contains names of the bricks on the path from a root brick to the brick that owns the parameters, e.g. ``/mlp/linear/W``). From 2c8d427aa822db725c37324ca356df61021b6a98 Mon Sep 17 00:00:00 2001 From: Jose Manuel Date: Sun, 14 Feb 2016 21:33:17 -0500 Subject: [PATCH 120/129] Added the glimpses to the list of final statets saved in the auxiliary variables. --- blocks/bricks/sequence_generators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blocks/bricks/sequence_generators.py b/blocks/bricks/sequence_generators.py index 3e88b579..0ab1f6c7 100644 --- a/blocks/bricks/sequence_generators.py +++ b/blocks/bricks/sequence_generators.py @@ -283,7 +283,7 @@ def cost_matrix(self, application_call, outputs, mask=None, **kwargs): # This variables can be used to initialize the initial states of the # next batch using the last states of the current batch. - for name in self._state_names: + for name in self._state_names + self._glimpse_names: application_call.add_auxiliary_variable( results[name][-1].copy(), name=name+"_final_value") From 8cf8ec5e767f3c37abb3e85eff51ab302c78a72d Mon Sep 17 00:00:00 2001 From: rizar Date: Wed, 17 Feb 2016 11:17:53 -0500 Subject: [PATCH 121/129] Make Lookup an instance of Feedforward --- blocks/bricks/lookup.py | 19 +++++++++++++++++-- tests/bricks/test_lookup.py | 9 +++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/blocks/bricks/lookup.py b/blocks/bricks/lookup.py index a9c43206..a2c1c25d 100644 --- a/blocks/bricks/lookup.py +++ b/blocks/bricks/lookup.py @@ -1,13 +1,16 @@ """Introduces Lookup brick.""" -from blocks.bricks import Initializable +from blocks.bricks import Initializable, Feedforward from blocks.bricks.base import application, lazy from blocks.roles import WEIGHT, add_role from blocks.utils import check_theano_variable, shared_floatx_nans -class LookupTable(Initializable): +class LookupTable(Initializable, Feedforward): """Encapsulates representations of a range of integers. + This brick can be used to embed integers, e.g. word indices, + in a vector space. + Parameters ---------- length : int @@ -70,3 +73,15 @@ def get_dim(self, name): if name == 'indices': return 0 return super(LookupTable, self).get_dim(name) + + @property + def input_dim(self): + return 0 + + @property + def output_dim(self): + return self.dim + + @output_dim.setter + def output_dim(self, dim): + self.dim = dim diff --git a/tests/bricks/test_lookup.py b/tests/bricks/test_lookup.py index e9c9d4ab..b7e17c89 100644 --- a/tests/bricks/test_lookup.py +++ b/tests/bricks/test_lookup.py @@ -26,3 +26,12 @@ def test_lookup_table(): assert_equal(lt.get_dim(lt.apply.inputs[0]), 0) assert_equal(lt.get_dim(lt.apply.outputs[0]), lt.dim) assert_raises(ValueError, lt.get_dim, 'random_name') + + # Test feedforward interface + assert lt.input_dim == 0 + assert lt.output_dim == 3 + lt.output_dim = 4 + assert lt.output_dim == 4 + def assign_input_dim(): + lt.input_dim = 11 + assert_raises(AttributeError, assign_input_dim) From 45f34c614acd67c29afbd78c74c2e7ac585c950c Mon Sep 17 00:00:00 2001 From: rizar Date: Wed, 17 Feb 2016 13:01:18 -0500 Subject: [PATCH 122/129] Fix typo --- blocks/bricks/lookup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blocks/bricks/lookup.py b/blocks/bricks/lookup.py index a2c1c25d..5fa7dfb6 100644 --- a/blocks/bricks/lookup.py +++ b/blocks/bricks/lookup.py @@ -9,7 +9,7 @@ class LookupTable(Initializable, Feedforward): """Encapsulates representations of a range of integers. This brick can be used to embed integers, e.g. word indices, - in a vector space. + into a vector space. Parameters ---------- From faceae27698018209378f7483ccb3aed80980149 Mon Sep 17 00:00:00 2001 From: rizar Date: Wed, 17 Feb 2016 13:02:45 -0500 Subject: [PATCH 123/129] PEP8 --- tests/bricks/test_lookup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/bricks/test_lookup.py b/tests/bricks/test_lookup.py index b7e17c89..e110423c 100644 --- a/tests/bricks/test_lookup.py +++ b/tests/bricks/test_lookup.py @@ -32,6 +32,7 @@ def test_lookup_table(): assert lt.output_dim == 3 lt.output_dim = 4 assert lt.output_dim == 4 + def assign_input_dim(): lt.input_dim = 11 assert_raises(AttributeError, assign_input_dim) From f0921cd9b8b2ef728504e8b647f3282c7899bf29 Mon Sep 17 00:00:00 2001 From: rizar Date: Sun, 21 Feb 2016 18:35:51 -0500 Subject: [PATCH 124/129] Better version handling for Blocks --- blocks/__init__.py | 3 ++- blocks/version.py | 1 + docs/conf.py | 5 +++-- setup.py | 7 ++++++- 4 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 blocks/version.py diff --git a/blocks/__init__.py b/blocks/__init__.py index d648e01d..002a8b97 100644 --- a/blocks/__init__.py +++ b/blocks/__init__.py @@ -1,2 +1,3 @@ """The blocks library for parametrized Theano ops.""" -__version__ = '0.1.1' +import blocks.version +__version__ = blocks.version.version diff --git a/blocks/version.py b/blocks/version.py new file mode 100644 index 00000000..d4f4d812 --- /dev/null +++ b/blocks/version.py @@ -0,0 +1 @@ +version = '0.1.1' diff --git a/docs/conf.py b/docs/conf.py index a726e04c..edae1956 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -94,9 +94,10 @@ def __getattr__(cls, name): # built documents. # # The short X.Y version. -version = '0.1' +import blocks +version = '.'.join(blocks.__version__.split('.')[:2]) # The full version, including alpha/beta/rc tags. -release = '0.1.1' +release = blocks.__version__ # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/setup.py b/setup.py index a8e3638a..065e4666 100644 --- a/setup.py +++ b/setup.py @@ -10,9 +10,14 @@ pass long_description = 'Blocks\n' + f.read().strip() +exec_results = {} +with open(path.join(path.dirname(__file__), 'blocks/version.py')) as file_: + exec(file_.read(), exec_results) +version = exec_results['version'] + setup( name='blocks', - version=blocks.__version__, # PEP 440 compliant + version=version, description='A Theano framework for building and training neural networks', long_description=long_description, url='https://github.com/mila-udem/blocks', From 419a4ea0ab5d970cd217ff866f58bd6a6f49c395 Mon Sep 17 00:00:00 2001 From: rizar Date: Mon, 22 Feb 2016 09:03:15 -0500 Subject: [PATCH 125/129] Adds input_dim to LookupTable --- blocks/bricks/lookup.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/blocks/bricks/lookup.py b/blocks/bricks/lookup.py index 5fa7dfb6..2fd20ba4 100644 --- a/blocks/bricks/lookup.py +++ b/blocks/bricks/lookup.py @@ -78,6 +78,11 @@ def get_dim(self, name): def input_dim(self): return 0 + @input_dim.setter + def input_dim(self, dim): + if dim != 0: + raise ValueError("LookupTable input must be integer") + @property def output_dim(self): return self.dim From c67e11e3802275277795de1d8d3d2f0c2d3394ef Mon Sep 17 00:00:00 2001 From: rizar Date: Mon, 22 Feb 2016 09:05:44 -0500 Subject: [PATCH 126/129] Fix test --- tests/bricks/test_lookup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/bricks/test_lookup.py b/tests/bricks/test_lookup.py index e110423c..d4418ea3 100644 --- a/tests/bricks/test_lookup.py +++ b/tests/bricks/test_lookup.py @@ -35,4 +35,5 @@ def test_lookup_table(): def assign_input_dim(): lt.input_dim = 11 - assert_raises(AttributeError, assign_input_dim) + assert_raises(ValueError, assign_input_dim) + lt.input_dim = 0 From 7a3465595042c2bb4973b990ddf6af8560d13f01 Mon Sep 17 00:00:00 2001 From: rizar Date: Tue, 23 Feb 2016 11:06:30 -0500 Subject: [PATCH 127/129] Bump version number to 0.2 --- blocks/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blocks/version.py b/blocks/version.py index d4f4d812..60fb6a57 100644 --- a/blocks/version.py +++ b/blocks/version.py @@ -1 +1 @@ -version = '0.1.1' +version = '0.2.0' From eb1e242ee1f9a52ba4fefcc667ab7bca6929f213 Mon Sep 17 00:00:00 2001 From: Francesco Visin Date: Wed, 24 Feb 2016 10:32:59 -0500 Subject: [PATCH 128/129] Fix Blocks ignores python's recursionlimit setting Don't override the user defined sys.setrecursionlimit if greater than the config's default --- blocks/utils/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/blocks/utils/__init__.py b/blocks/utils/__init__.py index 526e0e0f..4ddbdc41 100644 --- a/blocks/utils/__init__.py +++ b/blocks/utils/__init__.py @@ -483,7 +483,8 @@ def print_shape(x, header=None): def change_recursion_limit(limit): """Temporarily changes the recursion limit.""" old_limit = sys.getrecursionlimit() - sys.setrecursionlimit(limit) + if old_limit < limit: + sys.setrecursionlimit(limit) yield sys.setrecursionlimit(old_limit) From 83c326716ea8f228ef9fd25b45403da6304b6e06 Mon Sep 17 00:00:00 2001 From: rizar Date: Wed, 24 Feb 2016 11:36:58 -0500 Subject: [PATCH 129/129] Fix Theano and Blocks-examples revisions --- .travis.yml | 1 + requirements.txt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8b2e0ad7..9a921766 100644 --- a/.travis.yml +++ b/.travis.yml @@ -54,6 +54,7 @@ script: cd $TRAVIS_BUILD_DIR git clone https://github.com/mila-udem/blocks-examples.git cd blocks-examples + git checkout e0d7a0e5b60e802634161a63602673717c3e3c78 nose2 tests fi after_script: diff --git a/requirements.txt b/requirements.txt index ef77c7bd..609caa77 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ toolz==0.7.2 --allow-external theano --allow-unverified theano -git+https://github.com/Theano/Theano.git@8d3a67b73fda49350d9944c9a24fc9660131861c#egg=theano +git+https://github.com/Theano/Theano.git@0aa5ff77273f45a1566013872732ea78675b388d#egg=theano --allow-external fuel --allow-unverified fuel